Skip to content

Commit 0f268c7

Browse files
committed
add toasts for importing, fix buttons alignment
1 parent 198c277 commit 0f268c7

File tree

7 files changed

+91
-58
lines changed

7 files changed

+91
-58
lines changed

src/components/ExportOptions.svelte

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22
import Modal from '~/components/common/Modal.svelte';
33
import { colorsStore, initialColors } from '~/data/colors.store';
44
import { optionsStore } from '~/data/options.store';
5-
import { ChevronForwardOutline, ClipboardOutline } from 'svelte-ionicons';
5+
import { ClipboardOutline } from 'svelte-ionicons';
66
import { exportToEnvVariable } from '~/data/export/exportToEnvVariable';
77
import { exportToUrlHash } from '~/data/export/exportToUrlHash';
88
import Checkbox from '~/components/common/Checkbox.svelte';
9+
import { SvelteToast, toast } from '@zerodevx/svelte-toast';
10+
11+
export let isModalOpen = false;
912
1013
let exportEnvString = '';
1114
let exportPermalink = '';
1215
1316
let permalinkInputEl: HTMLInputElement;
14-
let isModalOpen = false;
1517
1618
let exportColorsOnly = false;
1719
@@ -25,6 +27,9 @@
2527
2628
permalinkInputEl.select();
2729
navigator.clipboard.writeText(permalinkInputEl.value);
30+
31+
toast.pop();
32+
toast.push('Copied!', { target: 'modalToast', duration: 2000 });
2833
}
2934
3035
function onToggleColorsOnly(e: Event) {
@@ -42,10 +47,6 @@
4247
}
4348
</script>
4449

45-
<button class="export btn btn-primary" on:click={() => (isModalOpen = true)}>
46-
Export <ChevronForwardOutline size="16" />
47-
</button>
48-
4950
<!-- svelte-ignore a11y-no-static-element-interactions -->
5051
<div class="wrapper" on:mousemove|stopPropagation>
5152
<Modal bind:showModal={isModalOpen}>
@@ -76,14 +77,27 @@
7677
value={exportPermalink}
7778
/>
7879
</div>
79-
<button type="button" class="copy-url btn btn-primary" on:click={onCopyUrl}>
80+
<button type="button" class="copy-url btn btn-secondary" on:click={onCopyUrl}>
8081
<ClipboardOutline size="16" />
8182
</button>
8283
</div>
8384

8485
<h3>Variable Export</h3>
8586
<textarea readonly>{exportEnvString}</textarea>
8687
</div>
88+
89+
<SvelteToast
90+
target="modalToast"
91+
options={{
92+
intro: { y: -64 },
93+
theme: {
94+
'--toastColor': 'mintcream',
95+
'--toastBackground': 'rgba(72,187,120,0.9)',
96+
'--toastBarBackground': '#2F855A',
97+
'--toastBarHeight': 0,
98+
},
99+
}}
100+
/>
87101
</Modal>
88102
</div>
89103

src/components/Home.svelte

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
import { importFromUrlHash } from '~/data/import/importFromUrlHash';
1111
import { colorsStore } from '~/data/colors.store';
1212
import { optionsStore } from '~/data/options.store';
13-
import ExportOptions from '~/components/ExportOptions.svelte';
14-
import ImportOptions from '~/components/ImportOptions.svelte';
13+
1514
import { SvelteToast } from '@zerodevx/svelte-toast';
1615
1716
let terminalContentEl: HTMLDivElement;
@@ -23,8 +22,8 @@
2322
2423
const imported = importFromUrlHash(hash.substring(1));
2524
26-
colorsStore.updateAllColors(imported.colors as any);
2725
optionsStore.updateAll(imported.themeOptions);
26+
colorsStore.updateAllColors(imported.colors as any);
2827
}
2928
3029
// allow Preview Panel to be scrolled by dragging. Useful when very big
@@ -70,14 +69,7 @@
7069
</div>
7170

7271
<div class="panel-terminal">
73-
<Box title="Preview" bind:contentEl={terminalContentEl}>
74-
<svelte:fragment slot="buttons">
75-
<ImportOptions />
76-
<ExportOptions />
77-
</svelte:fragment>
78-
79-
<TerminalWindow />
80-
</Box>
72+
<TerminalWindow bind:wrapperEl={terminalContentEl} />
8173
</div>
8274
</main>
8375

src/components/ImportOptions.svelte

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
import Modal from '~/components/common/Modal.svelte';
33
import { toast } from '@zerodevx/svelte-toast';
44
5-
import { ArrowForwardOutline, CodeDownloadOutline } from 'svelte-ionicons';
5+
import { ArrowForwardOutline } from 'svelte-ionicons';
66
import { importFromEnvArgs } from '~/data/import/importFromEnvArgs';
77
8+
export let isModalOpen = false;
9+
810
let textareaEl: HTMLTextAreaElement;
9-
let isModalOpen = false;
1011
1112
let errorMessage = '';
1213
@@ -35,14 +36,6 @@
3536
}
3637
</script>
3738

38-
<button
39-
class="export btn btn-primary"
40-
on:click={() => (isModalOpen = true)}
41-
on:change={() => (errorMessage = '')}
42-
>
43-
Import Options <CodeDownloadOutline size="16" />
44-
</button>
45-
4639
<!-- svelte-ignore a11y-no-static-element-interactions -->
4740
<div class="wrapper" on:mousemove|stopPropagation>
4841
<Modal bind:showModal={isModalOpen}>
@@ -55,14 +48,19 @@
5548

5649
<textarea
5750
bind:this={textareaEl}
51+
on:input={() => validateInput(textareaEl.value)}
5852
placeholder="Paste only the variable contents (inside the quotes)..."
5953
></textarea>
6054

6155
<div class="footer">
6256
<div class="error" style="word-wrap: break-word; overflow-wrap: break-word;">
6357
{errorMessage}
6458
</div>
65-
<button class="export btn btn-primary" on:click={onClickImport}>
59+
<button
60+
class="export btn btn-secondary"
61+
on:click={onClickImport}
62+
disabled={!textareaEl?.value.trim() || !!errorMessage}
63+
>
6664
Import <ArrowForwardOutline size="16" />
6765
</button>
6866
</div>
@@ -87,6 +85,7 @@
8785
.footer {
8886
display: flex;
8987
justify-content: space-between;
88+
align-items: flex-start;
9089
gap: 20px;
9190
}
9291
</style>

src/components/TerminalWindow.svelte

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,21 @@
66
import { renderLines } from '~/utils/tui/renderLines';
77
import { addDelegateEventListener } from '~/utils/addDelegateEventListener';
88
import { toFzfColorName } from '~/utils/colors/toFzfColorName';
9+
import Box from '~/components/common/Box.svelte';
10+
import { ArrowDownOutline, ChevronForwardOutline } from 'svelte-ionicons';
11+
import ImportOptions from '~/components/ImportOptions.svelte';
12+
import ExportOptions from '~/components/ExportOptions.svelte';
913
1014
// take all known color tokens and set them as css variables
1115
$: allTokenVariables = orderedColorTokens
1216
.map((token) => `--fzf-${token}: ${getColorOrFallback(token, $colorsStore.colors).value}`)
1317
.join(';');
1418
19+
let isImportModalOpen = false;
20+
let isExportModalOpen = false;
21+
1522
let terminalWindowEl: HTMLDivElement;
16-
let wrapperEl: HTMLDivElement;
23+
export let wrapperEl: HTMLDivElement;
1724
let charWidthEl: HTMLSpanElement;
1825
1926
let currentBg: string | undefined = 'bg';
@@ -113,27 +120,42 @@
113120
});
114121
</script>
115122

116-
<div bind:this={wrapperEl} class="wrapper" style={allTokenVariables}>
117-
<div class="window-title" style:max-width={maxTerminalWidth}>
118-
<div class="dot red"></div>
119-
<div class="dot amber"></div>
120-
<div class="dot green"></div>
121-
</div>
122-
123-
<div bind:this={terminalWindowEl} class="terminal-window"></div>
124-
125-
<div class="hint" style:max-width={maxTerminalWidth}>
126-
<span class="hint-label">background:</span>
127-
<strong>{toFzfColorName(currentBg || '').toUpperCase() || '---'}</strong>
128-
{#if currentFg}&nbsp;&nbsp;&nbsp;<span class="hint-label">foreground:</span><strong
129-
>&nbsp;{toFzfColorName(currentFg || '').toUpperCase() || '---'}</strong
130-
>{/if}
123+
<Box title="Preview">
124+
<svelte:fragment slot="buttons">
125+
<button class="export btn btn-primary" on:click={() => (isImportModalOpen = true)}>
126+
Import Options <ArrowDownOutline size="16" />
127+
</button>
128+
129+
<button class="export btn btn-primary" on:click={() => (isExportModalOpen = true)}>
130+
Export <ChevronForwardOutline size="16" />
131+
</button>
132+
</svelte:fragment>
133+
134+
<div bind:this={wrapperEl} class="wrapper" style={allTokenVariables}>
135+
<div class="window-title" style:max-width={maxTerminalWidth}>
136+
<div class="dot red"></div>
137+
<div class="dot amber"></div>
138+
<div class="dot green"></div>
139+
</div>
140+
141+
<div bind:this={terminalWindowEl} class="terminal-window"></div>
142+
143+
<div class="hint" style:max-width={maxTerminalWidth}>
144+
<span class="hint-label">background:</span>
145+
<strong>{toFzfColorName(currentBg || '').toUpperCase() || '---'}</strong>
146+
{#if currentFg}&nbsp;&nbsp;&nbsp;<span class="hint-label">foreground:</span><strong
147+
>&nbsp;{toFzfColorName(currentFg || '').toUpperCase() || '---'}</strong
148+
>{/if}
149+
</div>
150+
151+
<!-- This element is used to calculate the current width of chars according
152+
to users browser window, resolution, zoom amount, etc. -->
153+
<span bind:this={charWidthEl} class="sample-char-width">▀</span>
131154
</div>
132155

133-
<!-- This element is used to calculate the current width of chars according
134-
to users browser window, resolution, zoom amount, etc. -->
135-
<span bind:this={charWidthEl} class="sample-char-width">▀</span>
136-
</div>
156+
<ImportOptions bind:isModalOpen={isImportModalOpen} />
157+
<ExportOptions bind:isModalOpen={isExportModalOpen} />
158+
</Box>
137159

138160
<style lang="scss">
139161
:root {

src/components/common/Box.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
4646
.buttons {
4747
display: flex;
48-
gap: 15px;
48+
gap: 20px;
4949
}
5050
}
5151

src/styles/forms.css

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ textarea {
5050
color: var(--text-color);
5151
border: 0;
5252

53-
&:hover,
54-
&:focus {
53+
&:hover:not(:disabled),
54+
&:focus:not(:disabled) {
5555
background-color: var(--color-primary-stronger);
5656
}
5757
}
@@ -61,9 +61,9 @@ textarea {
6161
color: var(--text-color);
6262
border: 0;
6363

64-
&:hover,
65-
&:focus {
66-
background-color: #6d223c;
64+
&:hover:not(:disabled),
65+
&:focus:not(:disabled) {
66+
background-color: var(--color-secondary-stronger);
6767
}
6868
}
6969

@@ -72,13 +72,18 @@ textarea {
7272
background-color: transparent;
7373
border: 2px solid var(--border-color);
7474

75-
&:hover,
76-
&:focus {
75+
&:hover:not(:disabled),
76+
&:focus:not(:disabled) {
7777
border-color: var(--border-darker-color);
7878
}
7979
}
8080

81-
&:active {
81+
&:active:not(:disabled) {
8282
transform: translateY(1px);
8383
}
84+
85+
&:disabled {
86+
opacity: 0.5;
87+
cursor: not-allowed;
88+
}
8489
}

src/styles/main.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
--color-primary: #de3c4b;
1414
--color-primary-stronger: #c02130;
1515
--color-secondary: #0892a5;
16+
--color-secondary-stronger: #067584;
1617
--bg-color: #3f3f3f;
1718
--text-color: #e9e9e9;
1819
--box-gap: 15px;

0 commit comments

Comments
 (0)