@papu1337/builder 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +65 -0
  2. package/dist/elements/auth/authElement.svelte +115 -0
  3. package/dist/elements/auth/authElement.svelte.d.ts +7 -0
  4. package/dist/elements/auth/settings.d.ts +25 -0
  5. package/dist/elements/auth/settings.js +63 -0
  6. package/dist/elements/badge/badgeElement.svelte +48 -0
  7. package/dist/elements/badge/badgeElement.svelte.d.ts +7 -0
  8. package/dist/elements/badge/settings.d.ts +13 -0
  9. package/dist/elements/badge/settings.js +57 -0
  10. package/dist/elements/banner/bannerElement.svelte +46 -0
  11. package/dist/elements/banner/bannerElement.svelte.d.ts +7 -0
  12. package/dist/elements/banner/settings.d.ts +6 -0
  13. package/dist/elements/banner/settings.js +15 -0
  14. package/dist/elements/button/buttonElement.svelte +42 -0
  15. package/dist/elements/button/buttonElement.svelte.d.ts +7 -0
  16. package/dist/elements/button/settings.d.ts +16 -0
  17. package/dist/elements/button/settings.js +43 -0
  18. package/dist/elements/cards/cardsElement.svelte +136 -0
  19. package/dist/elements/cards/cardsElement.svelte.d.ts +7 -0
  20. package/dist/elements/cards/settings.d.ts +14 -0
  21. package/dist/elements/cards/settings.js +52 -0
  22. package/dist/elements/divider/dividerElement.svelte +34 -0
  23. package/dist/elements/divider/dividerElement.svelte.d.ts +7 -0
  24. package/dist/elements/divider/settings.d.ts +7 -0
  25. package/dist/elements/divider/settings.js +15 -0
  26. package/dist/elements/globalSettings.d.ts +8 -0
  27. package/dist/elements/globalSettings.js +39 -0
  28. package/dist/elements/products/productsElement.svelte +283 -0
  29. package/dist/elements/products/productsElement.svelte.d.ts +7 -0
  30. package/dist/elements/products/settings.d.ts +16 -0
  31. package/dist/elements/products/settings.js +56 -0
  32. package/dist/elements/terms/settings.d.ts +11 -0
  33. package/dist/elements/terms/settings.js +39 -0
  34. package/dist/elements/terms/termsElement.svelte +124 -0
  35. package/dist/elements/terms/termsElement.svelte.d.ts +7 -0
  36. package/dist/elements/text/settings.d.ts +11 -0
  37. package/dist/elements/text/settings.js +12 -0
  38. package/dist/elements/text/textElement.svelte +33 -0
  39. package/dist/elements/text/textElement.svelte.d.ts +7 -0
  40. package/dist/index.d.ts +3 -0
  41. package/dist/index.js +3 -0
  42. package/dist/renderer/BuilderRenderer.svelte +38 -0
  43. package/dist/renderer/BuilderRenderer.svelte.d.ts +4 -0
  44. package/dist/renderer/index.d.ts +4 -0
  45. package/dist/renderer/index.js +3 -0
  46. package/dist/renderer/registry.d.ts +4 -0
  47. package/dist/renderer/registry.js +20 -0
  48. package/dist/renderer/renderer.vanilla.es.js +2835 -0
  49. package/dist/renderer/renderer.vanilla.umd.js +31 -0
  50. package/dist/renderer/resolve.d.ts +1 -0
  51. package/dist/renderer/resolve.js +30 -0
  52. package/dist/renderer/types.d.ts +19 -0
  53. package/dist/renderer/types.js +1 -0
  54. package/dist/renderer/vanilla.svelte.d.ts +2 -0
  55. package/dist/renderer/vanilla.svelte.js +28 -0
  56. package/dist/settings/base.svelte.d.ts +30 -0
  57. package/dist/settings/base.svelte.js +91 -0
  58. package/dist/settings/components/ColorSettings.svelte +141 -0
  59. package/dist/settings/components/ColorSettings.svelte.d.ts +4 -0
  60. package/dist/settings/components/ListSettings.svelte +167 -0
  61. package/dist/settings/components/ListSettings.svelte.d.ts +14 -0
  62. package/dist/settings/components/NumberSettings.svelte +67 -0
  63. package/dist/settings/components/NumberSettings.svelte.d.ts +5 -0
  64. package/dist/settings/components/SelectSettings.svelte +64 -0
  65. package/dist/settings/components/SelectSettings.svelte.d.ts +5 -0
  66. package/dist/settings/components/SettingsGroup.svelte +94 -0
  67. package/dist/settings/components/SettingsGroup.svelte.d.ts +9 -0
  68. package/dist/settings/components/TextSettings.svelte +8 -0
  69. package/dist/settings/components/TextSettings.svelte.d.ts +4 -0
  70. package/dist/settings/components/TranslatableSettings.svelte +208 -0
  71. package/dist/settings/components/TranslatableSettings.svelte.d.ts +8 -0
  72. package/dist/settings/components/UploadSettings.svelte +185 -0
  73. package/dist/settings/components/UploadSettings.svelte.d.ts +4 -0
  74. package/dist/settings/groups.d.ts +14 -0
  75. package/dist/settings/groups.js +35 -0
  76. package/dist/settings/implementation.svelte.js +41 -0
  77. package/dist/settings/index.d.ts +4 -0
  78. package/dist/settings/index.js +4 -0
  79. package/dist/settings/types.d.ts +51 -0
  80. package/dist/settings/types.js +1 -0
  81. package/package.json +86 -0
@@ -0,0 +1,167 @@
1
+ <script lang="ts">
2
+ import type { BaseSettingProps } from '../types';
3
+
4
+ interface ListItem {
5
+ title: string;
6
+ content: string;
7
+ }
8
+
9
+ interface ListExtra {
10
+ addButtonText?: string;
11
+ titlePlaceholder?: string;
12
+ contentPlaceholder?: string;
13
+ }
14
+
15
+ let {
16
+ title,
17
+ value,
18
+ onchange,
19
+ addButtonText = '+ Add Section',
20
+ titlePlaceholder = 'Section title',
21
+ contentPlaceholder = 'Section content'
22
+ }: BaseSettingProps<ListItem[]> & ListExtra = $props();
23
+
24
+ function addItem() {
25
+ onchange([...value, { title: '', content: '' }]);
26
+ }
27
+
28
+ function removeItem(index: number) {
29
+ const updated = value.filter((_, i) => i !== index);
30
+ onchange(updated);
31
+ }
32
+
33
+ function updateItem(index: number, field: keyof ListItem, val: string) {
34
+ const updated = value.map((item, i) => (i === index ? { ...item, [field]: val } : item));
35
+ onchange(updated);
36
+ }
37
+ </script>
38
+
39
+ <div class="setting-item">
40
+ <label for={title}>{title}</label>
41
+ <div class="list-items">
42
+ {#each value as item, i}
43
+ <div class="list-entry">
44
+ <div class="entry-header">
45
+ <span class="entry-index">{i + 1}</span>
46
+ <button class="remove-btn" onclick={() => removeItem(i)} title="Remove">
47
+ &#10005;
48
+ </button>
49
+ </div>
50
+ <input
51
+ type="text"
52
+ placeholder={titlePlaceholder}
53
+ value={item.title}
54
+ onchange={(e) => updateItem(i, 'title', e.currentTarget.value)}
55
+ />
56
+ <textarea
57
+ placeholder={contentPlaceholder}
58
+ rows="3"
59
+ onchange={(e) => updateItem(i, 'content', e.currentTarget.value)}>{item.content}</textarea
60
+ >
61
+ </div>
62
+ {/each}
63
+ </div>
64
+ <button class="add-btn" onclick={addItem}>
65
+ {addButtonText}
66
+ </button>
67
+ </div>
68
+
69
+ <style>
70
+ .setting-item {
71
+ display: flex;
72
+ flex-direction: column;
73
+ gap: 8px;
74
+ padding: 10px 0;
75
+ }
76
+
77
+ label {
78
+ font-size: 0.75rem;
79
+ font-weight: 500;
80
+ color: var(--text-secondary);
81
+ text-transform: capitalize;
82
+ }
83
+
84
+ .list-items {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 8px;
88
+ }
89
+
90
+ .list-entry {
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: 6px;
94
+ padding: 10px;
95
+ background: var(--bg-elevated);
96
+ border: 1px solid var(--border-light);
97
+ border-radius: var(--radius-sm);
98
+ }
99
+
100
+ .entry-header {
101
+ display: flex;
102
+ justify-content: space-between;
103
+ align-items: center;
104
+ }
105
+
106
+ .entry-index {
107
+ font-size: 0.7rem;
108
+ font-weight: 600;
109
+ color: var(--text-muted);
110
+ }
111
+
112
+ .remove-btn {
113
+ background: none;
114
+ border: none;
115
+ color: var(--text-muted);
116
+ cursor: pointer;
117
+ font-size: 0.75rem;
118
+ padding: 2px 6px;
119
+ border-radius: 4px;
120
+ transition: all 0.15s;
121
+ }
122
+
123
+ .remove-btn:hover {
124
+ background: rgba(255, 80, 80, 0.15);
125
+ color: #ff5050;
126
+ }
127
+
128
+ input,
129
+ textarea {
130
+ width: 100%;
131
+ padding: 7px 10px;
132
+ background: var(--bg-base, #1a1a2e);
133
+ border: 1px solid var(--border-light);
134
+ border-radius: var(--radius-sm);
135
+ color: var(--text-primary);
136
+ font-size: 0.82rem;
137
+ font-family: var(--font);
138
+ outline: none;
139
+ resize: vertical;
140
+ transition:
141
+ border-color var(--transition),
142
+ box-shadow var(--transition);
143
+ }
144
+
145
+ input:focus,
146
+ textarea:focus {
147
+ border-color: var(--accent);
148
+ box-shadow: 0 0 0 3px var(--accent-glow);
149
+ }
150
+
151
+ .add-btn {
152
+ padding: 8px 12px;
153
+ background: var(--bg-elevated);
154
+ border: 1px dashed var(--border-light);
155
+ border-radius: var(--radius-sm);
156
+ color: var(--text-secondary);
157
+ font-size: 0.8rem;
158
+ cursor: pointer;
159
+ transition: all 0.15s;
160
+ }
161
+
162
+ .add-btn:hover {
163
+ border-color: var(--accent);
164
+ color: var(--accent);
165
+ background: rgba(var(--accent-rgb, 99, 102, 241), 0.08);
166
+ }
167
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { BaseSettingProps } from '../types';
2
+ interface ListItem {
3
+ title: string;
4
+ content: string;
5
+ }
6
+ interface ListExtra {
7
+ addButtonText?: string;
8
+ titlePlaceholder?: string;
9
+ contentPlaceholder?: string;
10
+ }
11
+ type $$ComponentProps = BaseSettingProps<ListItem[]> & ListExtra;
12
+ declare const ListSettings: import("svelte").Component<$$ComponentProps, {}, "">;
13
+ type ListSettings = ReturnType<typeof ListSettings>;
14
+ export default ListSettings;
@@ -0,0 +1,67 @@
1
+ <script lang="ts">
2
+ import type { BaseSettingProps, NumberExtra } from '../types';
3
+
4
+ let { title, value, onchange, min, max, step }: BaseSettingProps<number> & NumberExtra = $props();
5
+ </script>
6
+
7
+ <div class="setting-item">
8
+ <div class="label-row">
9
+ <label for={title}>{title}</label>
10
+ </div>
11
+ <input
12
+ type="number"
13
+ {value}
14
+ {min}
15
+ {max}
16
+ {step}
17
+ onchange={(e) => onchange(Number(e.currentTarget.value))}
18
+ />
19
+ </div>
20
+
21
+ <style>
22
+ .setting-item {
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: 6px;
26
+ padding: 10px 0;
27
+ }
28
+
29
+ .label-row {
30
+ display: flex;
31
+ justify-content: space-between;
32
+ align-items: center;
33
+ }
34
+
35
+ label {
36
+ font-size: 0.75rem;
37
+ font-weight: 500;
38
+ color: var(--text-secondary);
39
+ text-transform: capitalize;
40
+ }
41
+
42
+ input[type='number'] {
43
+ width: 100%;
44
+ padding: 7px 10px;
45
+ background: var(--bg-elevated);
46
+ border: 1px solid var(--border-light);
47
+ border-radius: var(--radius-sm);
48
+ color: var(--text-primary);
49
+ font-size: 0.82rem;
50
+ font-family: var(--font);
51
+ outline: none;
52
+ transition:
53
+ border-color var(--transition),
54
+ box-shadow var(--transition);
55
+ }
56
+
57
+ input[type='number']::-webkit-inner-spin-button,
58
+ input[type='number']::-webkit-outer-spin-button {
59
+ opacity: 0.4;
60
+ filter: invert(1);
61
+ }
62
+
63
+ input[type='number']:focus {
64
+ border-color: var(--accent);
65
+ box-shadow: 0 0 0 3px var(--accent-glow);
66
+ }
67
+ </style>
@@ -0,0 +1,5 @@
1
+ import type { BaseSettingProps, NumberExtra } from '../types';
2
+ type $$ComponentProps = BaseSettingProps<number> & NumberExtra;
3
+ declare const NumberSettings: import("svelte").Component<$$ComponentProps, {}, "">;
4
+ type NumberSettings = ReturnType<typeof NumberSettings>;
5
+ export default NumberSettings;
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ import type { BaseSettingProps, SelectExtra } from '../types';
3
+
4
+ let { title, value, onchange, options }: BaseSettingProps<string> & SelectExtra = $props();
5
+ </script>
6
+
7
+ <div class="setting-item">
8
+ <div class="label-row">
9
+ <label for={title}>{title}</label>
10
+ </div>
11
+ <select {value} onchange={(e) => onchange(e.currentTarget.value)}>
12
+ {#each options as opt}
13
+ <option value={opt.value} selected={opt.value === value}>{opt.label}</option>
14
+ {/each}
15
+ </select>
16
+ </div>
17
+
18
+ <style>
19
+ .setting-item {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: 6px;
23
+ padding: 10px 0;
24
+ }
25
+
26
+ .label-row {
27
+ display: flex;
28
+ justify-content: space-between;
29
+ align-items: center;
30
+ }
31
+
32
+ label {
33
+ font-size: 0.75rem;
34
+ font-weight: 500;
35
+ color: var(--text-secondary);
36
+ text-transform: capitalize;
37
+ }
38
+
39
+ select {
40
+ width: 100%;
41
+ padding: 7px 10px;
42
+ background: var(--bg-elevated);
43
+ border: 1px solid var(--border-light);
44
+ border-radius: var(--radius-sm);
45
+ color: var(--text-primary);
46
+ font-size: 0.82rem;
47
+ font-family: var(--font);
48
+ outline: none;
49
+ cursor: pointer;
50
+ appearance: none;
51
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
52
+ background-repeat: no-repeat;
53
+ background-position: right 10px center;
54
+ padding-right: 30px;
55
+ transition:
56
+ border-color var(--transition),
57
+ box-shadow var(--transition);
58
+ }
59
+
60
+ select:focus {
61
+ border-color: var(--accent);
62
+ box-shadow: 0 0 0 3px var(--accent-glow);
63
+ }
64
+ </style>
@@ -0,0 +1,5 @@
1
+ import type { BaseSettingProps, SelectExtra } from '../types';
2
+ type $$ComponentProps = BaseSettingProps<string> & SelectExtra;
3
+ declare const SelectSettings: import("svelte").Component<$$ComponentProps, {}, "">;
4
+ type SelectSettings = ReturnType<typeof SelectSettings>;
5
+ export default SelectSettings;
@@ -0,0 +1,94 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface SettingsGroupProps {
5
+ title: string;
6
+ defaultOpen?: boolean;
7
+ children: Snippet;
8
+ }
9
+
10
+ let { title, defaultOpen = false, children }: SettingsGroupProps = $props();
11
+ // svelte-ignore state_referenced_locally
12
+ let isOpen = $state(defaultOpen);
13
+ </script>
14
+
15
+ <div class="settings-group" class:open={isOpen}>
16
+ <button class="group-header" onclick={() => (isOpen = !isOpen)}>
17
+ <span class="group-title">{title}</span>
18
+ <svg
19
+ class="chevron"
20
+ class:rotated={isOpen}
21
+ width="14"
22
+ height="14"
23
+ viewBox="0 0 24 24"
24
+ fill="none"
25
+ stroke="currentColor"
26
+ stroke-width="2"
27
+ stroke-linecap="round"
28
+ stroke-linejoin="round"
29
+ >
30
+ <polyline points="6 9 12 15 18 9" />
31
+ </svg>
32
+ </button>
33
+
34
+ {#if isOpen}
35
+ <div class="group-body">
36
+ {@render children()}
37
+ </div>
38
+ {/if}
39
+ </div>
40
+
41
+ <style>
42
+ .settings-group {
43
+ border: 1px solid var(--border-light);
44
+ border-radius: var(--radius-sm);
45
+ overflow: hidden;
46
+ margin-bottom: 8px;
47
+ background: var(--bg-surface);
48
+ }
49
+
50
+ .settings-group.open {
51
+ border-color: var(--border);
52
+ }
53
+
54
+ .group-header {
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: space-between;
58
+ width: 100%;
59
+ padding: 10px 12px;
60
+ background: var(--bg-elevated);
61
+ border: none;
62
+ cursor: pointer;
63
+ font-family: inherit;
64
+ transition: background var(--transition);
65
+ user-select: none;
66
+ }
67
+
68
+ .group-header:hover {
69
+ background: var(--bg-hover, rgba(255, 255, 255, 0.06));
70
+ }
71
+
72
+ .group-title {
73
+ font-size: 0.72rem;
74
+ font-weight: 600;
75
+ letter-spacing: 0.06em;
76
+ text-transform: uppercase;
77
+ color: var(--text-secondary);
78
+ }
79
+
80
+ .chevron {
81
+ color: var(--text-muted);
82
+ transition: transform 0.2s ease;
83
+ flex-shrink: 0;
84
+ }
85
+
86
+ .chevron.rotated {
87
+ transform: rotate(180deg);
88
+ }
89
+
90
+ .group-body {
91
+ padding: 4px 12px 8px;
92
+ border-top: 1px solid var(--border-light);
93
+ }
94
+ </style>
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface SettingsGroupProps {
3
+ title: string;
4
+ defaultOpen?: boolean;
5
+ children: Snippet;
6
+ }
7
+ declare const SettingsGroup: import("svelte").Component<SettingsGroupProps, {}, "">;
8
+ type SettingsGroup = ReturnType<typeof SettingsGroup>;
9
+ export default SettingsGroup;
@@ -0,0 +1,8 @@
1
+ <script lang="ts">
2
+ import type { BaseSettingProps } from '../types.js';
3
+
4
+ let { value, title, onchange }: BaseSettingProps<string> = $props();
5
+ </script>
6
+
7
+ <label for={title}>{title}</label>
8
+ <input type="text" bind:value onchange={() => onchange(value)} />
@@ -0,0 +1,4 @@
1
+ import type { BaseSettingProps } from '../types.js';
2
+ declare const TextSettings: import("svelte").Component<BaseSettingProps<string>, {}, "">;
3
+ type TextSettings = ReturnType<typeof TextSettings>;
4
+ export default TextSettings;
@@ -0,0 +1,208 @@
1
+ <script lang="ts">
2
+ import { languages, locale } from '../../../hooks/useTranslation.svelte.js';
3
+
4
+ interface Props {
5
+ value: Record<string, string>;
6
+ title: string;
7
+ onchange: (value: Record<string, string>) => void;
8
+ }
9
+
10
+ let { value, title, onchange }: Props = $props();
11
+ let isExpanded = $state(false);
12
+
13
+ const sortedLanguages = $derived(() => {
14
+ const current = languages.find((l) => l.code === locale.current);
15
+ const rest = languages.filter((l) => l.code !== locale.current);
16
+ return current ? [current, ...rest] : languages;
17
+ });
18
+
19
+ function handleInput(code: string, text: string): void {
20
+ onchange({ ...value, [code]: text });
21
+ }
22
+ </script>
23
+
24
+ <div class="translatable-setting">
25
+ <button class="translatable-header" onclick={() => (isExpanded = !isExpanded)}>
26
+ <label>{title}</label>
27
+ <div class="header-right">
28
+ <span class="current-lang-badge">{locale.current.toUpperCase()}</span>
29
+ <svg
30
+ class="chevron"
31
+ class:rotated={isExpanded}
32
+ width="12"
33
+ height="12"
34
+ viewBox="0 0 24 24"
35
+ fill="none"
36
+ stroke="currentColor"
37
+ stroke-width="2"
38
+ stroke-linecap="round"
39
+ stroke-linejoin="round"
40
+ >
41
+ <polyline points="6 9 12 15 18 9" />
42
+ </svg>
43
+ </div>
44
+ </button>
45
+
46
+ {#if !isExpanded}
47
+ <div class="single-input">
48
+ <input
49
+ type="text"
50
+ value={value[locale.current] ?? ''}
51
+ onchange={(e) => handleInput(locale.current, (e.currentTarget as HTMLInputElement).value)}
52
+ placeholder="Enter {title.toLowerCase()}..."
53
+ />
54
+ </div>
55
+ {:else}
56
+ <div class="lang-inputs">
57
+ {#each sortedLanguages() as lang}
58
+ {@const isActive = lang.code === locale.current}
59
+ <div class="lang-row" class:active={isActive}>
60
+ <span class="lang-badge" class:active={isActive}>{lang.code.toUpperCase()}</span>
61
+ <input
62
+ type="text"
63
+ value={value[lang.code] ?? ''}
64
+ onchange={(e) => handleInput(lang.code, (e.currentTarget as HTMLInputElement).value)}
65
+ placeholder={isActive ? `Enter ${title.toLowerCase()}...` : `${lang.label}...`}
66
+ />
67
+ </div>
68
+ {/each}
69
+ </div>
70
+ {/if}
71
+ </div>
72
+
73
+ <style>
74
+ .translatable-setting {
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: 6px;
78
+ padding: 10px 0;
79
+ }
80
+
81
+ .translatable-header {
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: space-between;
85
+ background: none;
86
+ border: none;
87
+ padding: 0;
88
+ cursor: pointer;
89
+ font-family: inherit;
90
+ width: 100%;
91
+ }
92
+
93
+ .translatable-header label {
94
+ font-size: 0.75rem;
95
+ font-weight: 500;
96
+ color: var(--text-secondary);
97
+ text-transform: capitalize;
98
+ pointer-events: none;
99
+ }
100
+
101
+ .header-right {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 6px;
105
+ }
106
+
107
+ .current-lang-badge {
108
+ font-size: 0.65rem;
109
+ font-weight: 600;
110
+ color: var(--accent);
111
+ background: var(--accent-subtle);
112
+ padding: 1px 6px;
113
+ border-radius: 3px;
114
+ letter-spacing: 0.05em;
115
+ }
116
+
117
+ .chevron {
118
+ color: var(--text-muted);
119
+ transition: transform 0.2s ease;
120
+ }
121
+
122
+ .chevron.rotated {
123
+ transform: rotate(180deg);
124
+ }
125
+
126
+ .single-input input {
127
+ width: 100%;
128
+ box-sizing: border-box;
129
+ padding: 8px 10px;
130
+ background: var(--bg-elevated);
131
+ border: 1px solid var(--border-light);
132
+ border-radius: var(--radius-sm);
133
+ font-size: 0.78rem;
134
+ color: var(--text-primary);
135
+ font-family: inherit;
136
+ outline: none;
137
+ transition: border-color var(--transition);
138
+ }
139
+
140
+ .single-input input:focus {
141
+ border-color: var(--accent);
142
+ box-shadow: 0 0 0 3px var(--accent-glow);
143
+ }
144
+
145
+ .lang-inputs {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 4px;
149
+ border: 1px solid var(--border-light);
150
+ border-radius: var(--radius-sm);
151
+ padding: 6px;
152
+ background: var(--bg-elevated);
153
+ }
154
+
155
+ .lang-row {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 8px;
159
+ }
160
+
161
+ .lang-row.active {
162
+ order: -1;
163
+ }
164
+
165
+ .lang-badge {
166
+ font-size: 0.6rem;
167
+ font-weight: 600;
168
+ letter-spacing: 0.05em;
169
+ color: var(--text-muted);
170
+ background: var(--bg-surface);
171
+ border: 1px solid var(--border-light);
172
+ padding: 2px 6px;
173
+ border-radius: 3px;
174
+ flex-shrink: 0;
175
+ min-width: 24px;
176
+ text-align: center;
177
+ }
178
+
179
+ .lang-badge.active {
180
+ color: var(--accent);
181
+ background: var(--accent-subtle);
182
+ border-color: var(--accent);
183
+ }
184
+
185
+ .lang-row input {
186
+ flex: 1;
187
+ min-width: 0;
188
+ padding: 6px 8px;
189
+ background: var(--bg-surface);
190
+ border: 1px solid var(--border-light);
191
+ border-radius: var(--radius-sm);
192
+ font-size: 0.75rem;
193
+ color: var(--text-primary);
194
+ font-family: inherit;
195
+ outline: none;
196
+ transition: border-color var(--transition);
197
+ }
198
+
199
+ .lang-row input:focus {
200
+ border-color: var(--accent);
201
+ box-shadow: 0 0 0 2px var(--accent-glow);
202
+ }
203
+
204
+ .lang-row input::placeholder {
205
+ color: var(--text-muted);
206
+ font-style: italic;
207
+ }
208
+ </style>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ value: Record<string, string>;
3
+ title: string;
4
+ onchange: (value: Record<string, string>) => void;
5
+ }
6
+ declare const TranslatableSettings: import("svelte").Component<Props, {}, "">;
7
+ type TranslatableSettings = ReturnType<typeof TranslatableSettings>;
8
+ export default TranslatableSettings;