@x33025/sveltely 0.1.1 → 0.1.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 (156) hide show
  1. package/dist/components/Library/AnimatedNumber/AnimatedNumber.demo.svelte +1 -1
  2. package/dist/components/Library/AsyncButton/AsyncButton.svelte +42 -16
  3. package/dist/components/Library/Button/Button.demo.svelte +5 -3
  4. package/dist/components/Library/Button/Button.demo.svelte.d.ts +1 -0
  5. package/dist/components/Library/Button/Button.svelte +21 -13
  6. package/dist/components/Library/Calendar/Calendar.demo.svelte +2 -14
  7. package/dist/components/Library/Calendar/Calendar.svelte +69 -65
  8. package/dist/components/Library/Checkbox/Checkbox.svelte +13 -14
  9. package/dist/components/Library/ChipInput/ChipInput.demo.svelte +1 -1
  10. package/dist/components/Library/ChipInput/ChipInput.svelte +7 -4
  11. package/dist/components/Library/Divider/Divider.svelte +10 -0
  12. package/dist/components/Library/Divider/Divider.svelte.d.ts +26 -0
  13. package/dist/components/Library/Divider/index.d.ts +1 -0
  14. package/dist/components/Library/Divider/index.js +1 -0
  15. package/dist/components/Library/Dropdown/Action.svelte +60 -0
  16. package/dist/components/Library/Dropdown/Action.svelte.d.ts +11 -0
  17. package/dist/components/Library/Dropdown/Divider.svelte +5 -0
  18. package/dist/components/Library/Dropdown/Divider.svelte.d.ts +19 -0
  19. package/dist/components/Library/Dropdown/Dropdown.demo.svelte +182 -65
  20. package/dist/components/Library/Dropdown/Dropdown.demo.svelte.d.ts +2 -1
  21. package/dist/components/Library/Dropdown/Dropdown.svelte +95 -250
  22. package/dist/components/Library/Dropdown/Dropdown.svelte.d.ts +17 -16
  23. package/dist/components/Library/Dropdown/Item.svelte +68 -0
  24. package/dist/components/Library/Dropdown/Item.svelte.d.ts +31 -0
  25. package/dist/components/Library/Dropdown/Section.svelte +34 -0
  26. package/dist/components/Library/Dropdown/Section.svelte.d.ts +8 -0
  27. package/dist/components/Library/Dropdown/context.d.ts +34 -0
  28. package/dist/components/Library/Dropdown/context.js +6 -0
  29. package/dist/components/Library/Dropdown/index.d.ts +13 -2
  30. package/dist/components/Library/Dropdown/index.js +11 -1
  31. package/dist/components/Library/Floating/Floating.svelte +44 -7
  32. package/dist/components/Library/ForEach/ForEach.svelte +14 -0
  33. package/dist/components/Library/ForEach/ForEach.svelte.d.ts +28 -0
  34. package/dist/components/Library/ForEach/index.d.ts +1 -0
  35. package/dist/components/Library/ForEach/index.js +1 -0
  36. package/dist/components/Library/Grid/Grid.svelte +74 -0
  37. package/dist/components/Library/Grid/Grid.svelte.d.ts +13 -0
  38. package/dist/components/Library/Grid/index.d.ts +1 -0
  39. package/dist/components/Library/Grid/index.js +1 -0
  40. package/dist/components/Library/GridItem/GridItem.svelte +65 -0
  41. package/dist/components/Library/GridItem/GridItem.svelte.d.ts +14 -0
  42. package/dist/components/Library/GridItem/index.d.ts +1 -0
  43. package/dist/components/Library/GridItem/index.js +1 -0
  44. package/dist/components/Library/HStack/HStack.svelte +45 -0
  45. package/dist/components/Library/HStack/HStack.svelte.d.ts +9 -0
  46. package/dist/components/Library/HStack/index.d.ts +1 -0
  47. package/dist/components/Library/HStack/index.js +1 -0
  48. package/dist/components/Library/Image/Image.demo.svelte +18 -0
  49. package/dist/components/Library/Image/Image.demo.svelte.d.ts +23 -0
  50. package/dist/components/Library/Image/Image.svelte +57 -0
  51. package/dist/components/Library/Image/Image.svelte.d.ts +17 -0
  52. package/dist/components/Library/Image/ImagePlaceholder.svelte +202 -0
  53. package/dist/components/Library/Image/ImagePlaceholder.svelte.d.ts +7 -0
  54. package/dist/components/Library/Image/index.d.ts +1 -0
  55. package/dist/components/Library/Image/index.js +1 -0
  56. package/dist/components/Library/ImageMask/BrushPreview.svelte +119 -0
  57. package/dist/components/Library/ImageMask/BrushPreview.svelte.d.ts +11 -0
  58. package/dist/components/Library/ImageMask/ImageMask.demo.svelte +117 -0
  59. package/dist/components/Library/ImageMask/ImageMask.demo.svelte.d.ts +10 -0
  60. package/dist/components/Library/ImageMask/ImageMask.svelte +46 -0
  61. package/dist/components/Library/ImageMask/ImageMask.svelte.d.ts +20 -0
  62. package/dist/components/Library/ImageMask/MaskLayer.svelte +341 -0
  63. package/dist/components/Library/ImageMask/MaskLayer.svelte.d.ts +12 -0
  64. package/dist/components/Library/ImageMask/contour.d.ts +11 -0
  65. package/dist/components/Library/ImageMask/contour.js +152 -0
  66. package/dist/components/Library/ImageMask/index.d.ts +2 -0
  67. package/dist/components/Library/ImageMask/index.js +1 -0
  68. package/dist/components/Library/ImageMask/marchingAnts.d.ts +8 -0
  69. package/dist/components/Library/ImageMask/marchingAnts.js +29 -0
  70. package/dist/components/Library/ImageMask/maskSurface.d.ts +5 -0
  71. package/dist/components/Library/ImageMask/maskSurface.js +94 -0
  72. package/dist/components/Library/ImageMask/types.d.ts +23 -0
  73. package/dist/components/Library/Label/Label.demo.svelte +28 -0
  74. package/dist/components/Library/Label/Label.demo.svelte.d.ts +9 -0
  75. package/dist/components/Library/Label/Label.svelte +175 -0
  76. package/dist/components/Library/Label/Label.svelte.d.ts +18 -0
  77. package/dist/components/Library/Label/index.d.ts +1 -0
  78. package/dist/components/Library/Label/index.js +1 -0
  79. package/dist/components/Library/NavigationStack/NavigationStack.svelte +17 -7
  80. package/dist/components/Library/NavigationStack/Toolbar.svelte +7 -2
  81. package/dist/components/Library/NumberField/NumberField.demo.svelte +21 -0
  82. package/dist/components/Library/NumberField/NumberField.demo.svelte.d.ts +8 -0
  83. package/dist/components/Library/NumberField/NumberField.svelte +199 -0
  84. package/dist/components/Library/NumberField/NumberField.svelte.d.ts +21 -0
  85. package/dist/components/Library/NumberField/index.d.ts +1 -0
  86. package/dist/components/Library/NumberField/index.js +1 -0
  87. package/dist/components/Library/Pagination/Pagination.svelte +16 -20
  88. package/dist/components/Library/Popover/Popover.demo.svelte +2 -2
  89. package/dist/components/Library/Popover/Popover.svelte +7 -4
  90. package/dist/components/Library/ScrollView/ScrollView.svelte +165 -12
  91. package/dist/components/Library/ScrollView/ScrollView.svelte.d.ts +32 -4
  92. package/dist/components/Library/ScrollView/index.d.ts +1 -0
  93. package/dist/components/Library/{SearchInput/SearchInput.demo.svelte → SearchField/SearchField.demo.svelte} +4 -4
  94. package/dist/components/Library/SearchField/SearchField.demo.svelte.d.ts +8 -0
  95. package/dist/components/Library/{SearchInput/SearchInput.svelte → SearchField/SearchField.svelte} +26 -30
  96. package/dist/components/Library/{SearchInput/SearchInput.svelte.d.ts → SearchField/SearchField.svelte.d.ts} +3 -3
  97. package/dist/components/Library/SearchField/index.d.ts +1 -0
  98. package/dist/components/Library/SearchField/index.js +1 -0
  99. package/dist/components/Library/SegmentedPicker/SegmentedPicker.demo.svelte +1 -1
  100. package/dist/components/Library/SegmentedPicker/SegmentedPicker.svelte +9 -9
  101. package/dist/components/Library/Sheet/Sheet.demo.svelte +1 -1
  102. package/dist/components/Library/Sheet/Sheet.svelte +8 -5
  103. package/dist/components/Library/Slider/Slider.demo.svelte +1 -1
  104. package/dist/components/Library/Slider/Slider.svelte +11 -10
  105. package/dist/components/Library/Spacer/Spacer.svelte +7 -0
  106. package/dist/components/Library/Spacer/Spacer.svelte.d.ts +26 -0
  107. package/dist/components/Library/Spacer/index.d.ts +1 -0
  108. package/dist/components/Library/Spacer/index.js +1 -0
  109. package/dist/components/Library/Spinner/Spinner.demo.svelte +1 -1
  110. package/dist/components/Library/Switch/Switch.svelte +6 -11
  111. package/dist/components/Library/TextField/TextField.demo.svelte +14 -0
  112. package/dist/components/Library/TextField/TextField.demo.svelte.d.ts +8 -0
  113. package/dist/components/Library/TextField/TextField.svelte +154 -0
  114. package/dist/components/Library/TextField/TextField.svelte.d.ts +19 -0
  115. package/dist/components/Library/TextField/index.d.ts +1 -0
  116. package/dist/components/Library/TextField/index.js +1 -0
  117. package/dist/components/Library/{TokenSearchInput/TokenSearchInput.demo.svelte → TokenSearchField/TokenSearchField.demo.svelte} +4 -4
  118. package/dist/components/Library/TokenSearchField/TokenSearchField.demo.svelte.d.ts +9 -0
  119. package/dist/components/Library/{TokenSearchInput/TokenSearchInput.svelte → TokenSearchField/TokenSearchField.svelte} +70 -66
  120. package/dist/components/Library/{TokenSearchInput/TokenSearchInput.svelte.d.ts → TokenSearchField/TokenSearchField.svelte.d.ts} +3 -3
  121. package/dist/components/Library/TokenSearchField/index.d.ts +1 -0
  122. package/dist/components/Library/TokenSearchField/index.js +1 -0
  123. package/dist/components/Library/VStack/VStack.svelte +45 -0
  124. package/dist/components/Library/VStack/VStack.svelte.d.ts +9 -0
  125. package/dist/components/Library/VStack/index.d.ts +1 -0
  126. package/dist/components/Library/VStack/index.js +1 -0
  127. package/dist/components/Library/WheelPicker/WheelColumn.svelte +4 -10
  128. package/dist/components/Library/WheelPicker/WheelPicker.svelte +5 -9
  129. package/dist/components/Local/ComponentGrid.svelte +15 -31
  130. package/dist/components/Local/HeroCard.svelte +30 -38
  131. package/dist/components/Local/HeroCard.svelte.d.ts +0 -2
  132. package/dist/components/Local/StyleControls.svelte +58 -27
  133. package/dist/components/Local/StyleControls.svelte.d.ts +3 -1
  134. package/dist/index.d.ts +26 -2
  135. package/dist/index.js +19 -2
  136. package/dist/style/index.css +35 -20
  137. package/dist/style/label.d.ts +6 -0
  138. package/dist/style/label.js +4 -0
  139. package/dist/style/layout.d.ts +57 -0
  140. package/dist/style/layout.js +128 -0
  141. package/dist/style/media.d.ts +12 -0
  142. package/dist/style/media.js +8 -0
  143. package/dist/style/scroll.d.ts +7 -0
  144. package/dist/style/scroll.js +5 -0
  145. package/dist/style/text-editor.d.ts +34 -0
  146. package/dist/style/text-editor.js +29 -0
  147. package/dist/style.css +112 -58
  148. package/package.json +1 -1
  149. package/dist/components/Library/Dropdown/types.d.ts +0 -27
  150. package/dist/components/Library/SearchInput/SearchInput.demo.svelte.d.ts +0 -8
  151. package/dist/components/Library/SearchInput/index.d.ts +0 -1
  152. package/dist/components/Library/SearchInput/index.js +0 -1
  153. package/dist/components/Library/TokenSearchInput/TokenSearchInput.demo.svelte.d.ts +0 -9
  154. package/dist/components/Library/TokenSearchInput/index.d.ts +0 -1
  155. package/dist/components/Library/TokenSearchInput/index.js +0 -1
  156. /package/dist/components/Library/{Dropdown → ImageMask}/types.js +0 -0
@@ -0,0 +1 @@
1
+ export { default } from './Spacer.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './Spacer.svelte';
@@ -9,6 +9,6 @@
9
9
  import Spinner from './Spinner.svelte';
10
10
  </script>
11
11
 
12
- <div class="text-zinc-700">
12
+ <div class="text-[var(--sveltely-primary-color)]">
13
13
  <Spinner />
14
14
  </div>
@@ -74,7 +74,7 @@
74
74
  gap: var(--switch-gap, var(--sveltely-gap));
75
75
  font-size: var(--switch-font-size);
76
76
  line-height: 1.25;
77
- color: var(--switch-color, var(--color-zinc-800));
77
+ color: var(--switch-color, var(--sveltely-primary-color));
78
78
  cursor: pointer;
79
79
  user-select: none;
80
80
  }
@@ -106,7 +106,8 @@
106
106
  display: block;
107
107
  width: 100%;
108
108
  height: 100%;
109
- border: var(--switch-border-width) solid var(--switch-border-color, var(--sveltely-border-color));
109
+ border: var(--switch-border-width) solid
110
+ var(--switch-border-color, var(--sveltely-border-color));
110
111
  border-radius: var(--switch-resolved-border-radius);
111
112
  background: var(--switch-background, var(--sveltely-inactive-color));
112
113
  box-sizing: border-box;
@@ -142,14 +143,8 @@
142
143
  }
143
144
 
144
145
  .switch:hover .switch-control input:checked + .switch-track {
145
- border-color: var(
146
- --switch-checked-hover-border-color,
147
- var(--sveltely-active-hover-color)
148
- );
149
- background: var(
150
- --switch-checked-hover-background,
151
- var(--sveltely-active-hover-color)
152
- );
146
+ border-color: var(--switch-checked-hover-border-color, var(--sveltely-active-hover-color));
147
+ background: var(--switch-checked-hover-background, var(--sveltely-active-hover-color));
153
148
  }
154
149
 
155
150
  .switch-control input:checked + .switch-track .switch-thumb {
@@ -158,7 +153,7 @@
158
153
  }
159
154
 
160
155
  .switch-control input:focus-visible + .switch-track {
161
- outline: 2px solid color-mix(in oklab, var(--sveltely-primary-color) 24%, white);
156
+ outline: 2px solid color-mix(in oklab, var(--sveltely-active-color) 24%, white);
162
157
  outline-offset: 2px;
163
158
  }
164
159
 
@@ -0,0 +1,14 @@
1
+ <script module lang="ts">
2
+ export const demo = {
3
+ name: 'TextField',
4
+ description: 'Token-aware text input with help and error states.'
5
+ };
6
+ </script>
7
+
8
+ <script lang="ts">
9
+ import TextField from './TextField.svelte';
10
+
11
+ let value = $state('Sveltely');
12
+ </script>
13
+
14
+ <TextField bind:value placeholder="Enter name" help="Value: {value}" />
@@ -0,0 +1,8 @@
1
+ export declare const demo: {
2
+ name: string;
3
+ description: string;
4
+ };
5
+ import TextField from './TextField.svelte';
6
+ declare const TextField: import("svelte").Component<Record<string, never>, {}, "">;
7
+ type TextField = ReturnType<typeof TextField>;
8
+ export default TextField;
@@ -0,0 +1,154 @@
1
+ <script lang="ts">
2
+ import type { HTMLInputAttributes } from 'svelte/elements';
3
+ import { tooltip } from '../../../actions/tooltip';
4
+ import { surfaceStyle, type StyleProps } from '../../../style/surface';
5
+ import {
6
+ textEditorStyle,
7
+ type TextEditorProps,
8
+ type TextFieldType,
9
+ type TextInputMode
10
+ } from '../../../style/text-editor';
11
+
12
+ type Props = {
13
+ value?: string;
14
+ help?: string;
15
+ error?: string | null;
16
+ type?: TextFieldType;
17
+ disabled?: boolean;
18
+ placeholder?: string;
19
+ name?: string;
20
+ autocomplete?: HTMLInputAttributes['autocomplete'];
21
+ required?: boolean;
22
+ readonly?: boolean;
23
+ inputmode?: TextInputMode;
24
+ } & StyleProps &
25
+ TextEditorProps;
26
+
27
+ let {
28
+ value = $bindable(''),
29
+ help,
30
+ error = null,
31
+ type = 'text',
32
+ disabled = false,
33
+ placeholder = '',
34
+ name,
35
+ autocomplete,
36
+ required = false,
37
+ readonly = false,
38
+ inputmode,
39
+ textAlign,
40
+ fontSize,
41
+ paddingX,
42
+ paddingY,
43
+ gap,
44
+ borderRadius,
45
+ inset,
46
+ background,
47
+ borderColor,
48
+ color
49
+ }: Props = $props();
50
+
51
+ const styleProps = $derived({
52
+ fontSize,
53
+ paddingX,
54
+ paddingY,
55
+ gap,
56
+ borderRadius,
57
+ inset,
58
+ background,
59
+ borderColor,
60
+ color
61
+ });
62
+ const textEditorProps = $derived({ textAlign });
63
+ const rootStyle = $derived.by(() =>
64
+ [surfaceStyle(styleProps, 'text-field'), textEditorStyle(textEditorProps)]
65
+ .filter(Boolean)
66
+ .join(' ')
67
+ );
68
+ const describedBy = $derived(help ? 'text-field-message' : undefined);
69
+ </script>
70
+
71
+ <div
72
+ use:tooltip={{ label: error ?? '', disabled: !error }}
73
+ class="text-field"
74
+ style={rootStyle}
75
+ data-disabled={disabled ? 'true' : 'false'}
76
+ data-error={error ? 'true' : 'false'}
77
+ >
78
+ <input
79
+ bind:value
80
+ {type}
81
+ {disabled}
82
+ {name}
83
+ {autocomplete}
84
+ {required}
85
+ {readonly}
86
+ {inputmode}
87
+ {placeholder}
88
+ aria-invalid={error ? 'true' : undefined}
89
+ aria-describedby={describedBy}
90
+ class="text-field-input"
91
+ />
92
+
93
+ {#if help}
94
+ <span id="text-field-message" class="text-field-message">{help}</span>
95
+ {/if}
96
+ </div>
97
+
98
+ <style>
99
+ .text-field {
100
+ display: inline-flex;
101
+ width: 100%;
102
+ min-width: 0;
103
+ flex-direction: column;
104
+ gap: var(--text-field-gap, calc(var(--sveltely-gap) * 0.75));
105
+ color: var(--text-field-color, var(--sveltely-primary-color));
106
+ font-size: var(--text-field-font-size, calc(var(--sveltely-font-size) * 0.875));
107
+ }
108
+
109
+ .text-field-input {
110
+ width: 100%;
111
+ min-width: 0;
112
+ border: 1px solid var(--text-field-border-color, var(--sveltely-border-color));
113
+ border-radius: var(--text-field-border-radius, var(--sveltely-border-radius));
114
+ background: var(--text-field-background, var(--sveltely-background-color));
115
+ color: inherit;
116
+ line-height: 1.25rem;
117
+ outline: none;
118
+ padding: var(--text-field-padding-y, calc(var(--sveltely-padding-y) * 0.67))
119
+ var(--text-field-padding-x, var(--sveltely-padding-x));
120
+ text-align: var(--text-field-text-align, start);
121
+ transition:
122
+ color 150ms,
123
+ border-color 150ms,
124
+ background-color 150ms,
125
+ box-shadow 150ms;
126
+ }
127
+
128
+ .text-field-input:focus {
129
+ border-color: color-mix(in oklab, var(--sveltely-active-color) 50%, white);
130
+ }
131
+
132
+ .text-field-input::placeholder {
133
+ color: var(--sveltely-secondary-color);
134
+ }
135
+
136
+ .text-field-message {
137
+ color: var(--sveltely-secondary-color);
138
+ font-size: calc(var(--text-field-font-size, 0.875rem) * 0.857);
139
+ line-height: 1.25;
140
+ }
141
+
142
+ .text-field[data-error='true'] .text-field-input {
143
+ border-color: var(--color-red-500);
144
+ }
145
+
146
+ .text-field[data-error='true'] .text-field-message {
147
+ color: var(--color-red-600);
148
+ }
149
+
150
+ .text-field[data-disabled='true'] {
151
+ cursor: not-allowed;
152
+ opacity: 0.6;
153
+ }
154
+ </style>
@@ -0,0 +1,19 @@
1
+ import type { HTMLInputAttributes } from 'svelte/elements';
2
+ import { type StyleProps } from '../../../style/surface';
3
+ import { type TextEditorProps, type TextFieldType, type TextInputMode } from '../../../style/text-editor';
4
+ type Props = {
5
+ value?: string;
6
+ help?: string;
7
+ error?: string | null;
8
+ type?: TextFieldType;
9
+ disabled?: boolean;
10
+ placeholder?: string;
11
+ name?: string;
12
+ autocomplete?: HTMLInputAttributes['autocomplete'];
13
+ required?: boolean;
14
+ readonly?: boolean;
15
+ inputmode?: TextInputMode;
16
+ } & StyleProps & TextEditorProps;
17
+ declare const TextField: import("svelte").Component<Props, {}, "value">;
18
+ type TextField = ReturnType<typeof TextField>;
19
+ export default TextField;
@@ -0,0 +1 @@
1
+ export { default } from './TextField.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './TextField.svelte';
@@ -1,19 +1,19 @@
1
1
  <script module lang="ts">
2
2
  export const demo = {
3
- name: 'TokenSearchInput',
3
+ name: 'TokenSearchField',
4
4
  description: 'Search field that turns comma-separated entries into removable tokens.',
5
5
  columnSpan: 2
6
6
  };
7
7
  </script>
8
8
 
9
9
  <script lang="ts">
10
- import TokenSearchInput from './TokenSearchInput.svelte';
10
+ import TokenSearchField from './TokenSearchField.svelte';
11
11
 
12
12
  let tokens = $state(['svelte', 'ui']);
13
13
  let value = $state('');
14
14
  </script>
15
15
 
16
16
  <div class="vstack w-full max-w-md gap-2">
17
- <TokenSearchInput bind:tokens bind:value placeholder="Search keywords" />
18
- <p class="text-xs text-zinc-500">Tokens: {tokens.join(', ') || 'empty'}</p>
17
+ <TokenSearchField bind:tokens bind:value placeholder="Search keywords" />
18
+ <p class="text-xs text-[var(--sveltely-secondary-color)]">Tokens: {tokens.join(', ') || 'empty'}</p>
19
19
  </div>
@@ -0,0 +1,9 @@
1
+ export declare const demo: {
2
+ name: string;
3
+ description: string;
4
+ columnSpan: number;
5
+ };
6
+ import TokenSearchField from './TokenSearchField.svelte';
7
+ declare const TokenSearchField: import("svelte").Component<Record<string, never>, {}, "">;
8
+ type TokenSearchField = ReturnType<typeof TokenSearchField>;
9
+ export default TokenSearchField;
@@ -11,7 +11,8 @@
11
11
  tokenPlaceholder?: string;
12
12
  normalizeToken?: (value: string) => string;
13
13
  showIcon?: boolean;
14
- } & StyleProps & Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder' | 'class' | 'style'>;
14
+ } & StyleProps &
15
+ Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder' | 'class' | 'style'>;
15
16
 
16
17
  const defaultNormalizeToken = (value: string) => value.trim().replace(/\s+/g, ' ');
17
18
 
@@ -30,7 +31,7 @@
30
31
  const extractedStyleProps = $derived.by(() => extractStyleProps(restProps));
31
32
  const styleProps = $derived(extractedStyleProps.styleProps);
32
33
  const props = $derived(extractedStyleProps.restProps);
33
- const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'token-search-input'));
34
+ const rootStyle = $derived.by(() => surfaceStyle(styleProps, 'token-search-field'));
34
35
 
35
36
  const addToken = (rawValue: string) => {
36
37
  const token = normalizeToken(rawValue);
@@ -68,12 +69,10 @@
68
69
  event.preventDefault();
69
70
 
70
71
  const nextTokens = [...tokens];
71
- const seen = new Set(nextTokens);
72
72
  for (const part of pasted.split(',')) {
73
73
  const token = normalizeToken(part);
74
- if (!token || seen.has(token)) continue;
74
+ if (!token || nextTokens.includes(token)) continue;
75
75
  nextTokens.push(token);
76
- seen.add(token);
77
76
  }
78
77
 
79
78
  tokens = nextTokens;
@@ -81,28 +80,28 @@
81
80
  };
82
81
  </script>
83
82
 
84
- <div
85
- class="token-search-input hstack w-full flex-nowrap items-center overflow-x-auto overflow-y-hidden whitespace-nowrap"
86
- class:token-search-input-has-tokens={tokens.length > 0}
87
- style={rootStyle}
88
- data-disabled={disabled ? 'true' : 'false'}
89
- >
83
+ <div
84
+ class="token-search-field hstack w-full flex-nowrap items-center overflow-x-auto overflow-y-hidden whitespace-nowrap"
85
+ class:token-search-field-has-tokens={tokens.length > 0}
86
+ style={rootStyle}
87
+ data-disabled={disabled ? 'true' : 'false'}
88
+ >
90
89
  {#if showIcon}
91
- <span class="token-search-input-icon" aria-hidden="true">
92
- <SearchIcon class="token-search-input-search-icon" />
90
+ <span class="token-search-field-icon" aria-hidden="true">
91
+ <SearchIcon class="token-search-field-search-icon" />
93
92
  </span>
94
93
  {/if}
95
94
 
96
95
  {#each tokens as token, index (`${token}-${index}`)}
97
96
  <button
98
97
  type="button"
99
- class="token-search-input-token"
98
+ class="token-search-field-token"
100
99
  onclick={() => removeToken(index)}
101
100
  aria-label={`Remove search token ${token}`}
102
101
  {disabled}
103
102
  >
104
103
  <span>{token}</span>
105
- <X class="token-search-input-remove-icon" aria-hidden="true" />
104
+ <X class="token-search-field-remove-icon" aria-hidden="true" />
106
105
  </button>
107
106
  {/each}
108
107
 
@@ -111,7 +110,7 @@
111
110
  bind:value
112
111
  {disabled}
113
112
  placeholder={tokens.length === 0 ? placeholder : tokenPlaceholder}
114
- class="token-search-input-field"
113
+ class="token-search-field-input"
115
114
  onkeydown={onKeydown}
116
115
  onpaste={onPaste}
117
116
  onblur={commitValue}
@@ -119,60 +118,63 @@
119
118
  />
120
119
 
121
120
  {#if confirmText}
122
- <span class="token-search-input-confirm">
121
+ <span class="token-search-field-confirm">
123
122
  {confirmText}
124
123
  </span>
125
124
  {/if}
126
125
  </div>
127
126
 
128
127
  <style>
129
- .token-search-input {
130
- --token-search-input-inset: var(--sveltely-inset);
131
- --token-search-input-font-size: calc(var(--sveltely-font-size) * 0.875);
132
- --token-search-input-scale: calc(var(--token-search-input-font-size) / 0.875rem);
133
- --token-search-input-line-height: calc(var(--token-search-input-font-size) * 1.429);
134
- --token-search-input-search-icon-size: calc(var(--token-search-input-font-size) * 1.143);
135
- --token-search-input-remove-icon-size: calc(var(--token-search-input-font-size) * 0.857);
136
- --token-search-input-confirm-font-size: calc(var(--token-search-input-font-size) * 0.857);
137
- --sveltely-nested-inset: var(--token-search-input-inset);
128
+ .token-search-field {
129
+ --token-search-field-inset: var(--sveltely-inset);
130
+ --token-search-field-font-size: calc(var(--sveltely-font-size) * 0.875);
131
+ --token-search-field-scale: calc(var(--token-search-field-font-size) / 0.875rem);
132
+ --token-search-field-line-height: calc(var(--token-search-field-font-size) * 1.429);
133
+ --token-search-field-search-icon-size: calc(var(--token-search-field-font-size) * 1.143);
134
+ --token-search-field-remove-icon-size: calc(var(--token-search-field-font-size) * 0.857);
135
+ --token-search-field-confirm-font-size: calc(var(--token-search-field-font-size) * 0.857);
136
+ --sveltely-nested-inset: var(--token-search-field-inset);
138
137
  min-width: 0;
139
138
  border: 1px solid var(--sveltely-border-color);
140
139
  border-radius: var(--sveltely-border-radius);
141
- color: var(--color-zinc-900);
142
- gap: var(--token-search-input-inset);
143
- padding:
144
- calc(var(--sveltely-padding-y) * 0.58 * var(--token-search-input-scale))
145
- calc(var(--sveltely-padding-x) * var(--token-search-input-scale));
146
- font-size: var(--token-search-input-font-size);
147
- line-height: var(--token-search-input-line-height);
140
+ color: var(--sveltely-primary-color);
141
+ gap: var(--token-search-field-inset);
142
+ padding: calc(var(--sveltely-padding-y) * 0.58 * var(--token-search-field-scale))
143
+ calc(var(--sveltely-padding-x) * var(--token-search-field-scale));
144
+ font-size: var(--token-search-field-font-size);
145
+ line-height: var(--token-search-field-line-height);
148
146
  outline: none;
149
- transition: color 150ms, border-color 150ms, background-color 150ms, box-shadow 150ms;
147
+ transition:
148
+ color 150ms,
149
+ border-color 150ms,
150
+ background-color 150ms,
151
+ box-shadow 150ms;
150
152
  }
151
153
 
152
- .token-search-input:focus-within {
153
- border-color: color-mix(in oklab, var(--sveltely-primary-color) 50%, white);
154
+ .token-search-field:focus-within {
155
+ border-color: color-mix(in oklab, var(--sveltely-active-color) 50%, white);
154
156
  }
155
157
 
156
- .token-search-input-has-tokens {
157
- padding: var(--token-search-input-inset);
158
+ .token-search-field-has-tokens {
159
+ padding: var(--token-search-field-inset);
158
160
  }
159
161
 
160
- .token-search-input[data-disabled='true'] {
162
+ .token-search-field[data-disabled='true'] {
161
163
  cursor: not-allowed;
162
164
  opacity: 0.6;
163
165
  }
164
166
 
165
- .token-search-input-icon {
167
+ .token-search-field-icon {
166
168
  flex-shrink: 0;
167
- color: var(--color-zinc-500);
169
+ color: var(--sveltely-secondary-color);
168
170
  }
169
171
 
170
- :global(.token-search-input-search-icon) {
171
- width: var(--token-search-input-search-icon-size);
172
- height: var(--token-search-input-search-icon-size);
172
+ :global(.token-search-field-search-icon) {
173
+ width: var(--token-search-field-search-icon-size);
174
+ height: var(--token-search-field-search-icon-size);
173
175
  }
174
176
 
175
- .token-search-input-field {
177
+ .token-search-field-input {
176
178
  field-sizing: content;
177
179
  min-width: 0;
178
180
  flex: 1 1 auto;
@@ -180,50 +182,52 @@
180
182
  outline: none;
181
183
  }
182
184
 
183
- .token-search-input-field::-webkit-search-cancel-button {
185
+ .token-search-field-input::-webkit-search-cancel-button {
184
186
  appearance: none;
185
187
  }
186
188
 
187
- .token-search-input-token {
189
+ .token-search-field-token {
188
190
  display: inline-flex;
189
191
  flex-shrink: 0;
190
192
  align-items: center;
191
193
  border: 1px solid var(--sveltely-border-color);
192
194
  border-radius: var(--sveltely-border-radius-nested);
193
- background: var(--color-zinc-100);
194
- color: var(--color-zinc-700);
195
+ background: var(--sveltely-inactive-color);
196
+ color: var(--sveltely-primary-color);
195
197
  font-size: inherit;
196
198
  line-height: inherit;
197
- gap: calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-input-scale));
198
- padding:
199
- calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-input-scale))
200
- calc(var(--sveltely-padding-y) * 0.33 * var(--token-search-input-scale))
201
- calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-input-scale))
202
- calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-input-scale));
203
- transition: color 150ms, border-color 150ms, background-color 150ms;
199
+ gap: calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-field-scale));
200
+ padding: calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-field-scale))
201
+ calc(var(--sveltely-padding-y) * 0.33 * var(--token-search-field-scale))
202
+ calc(var(--sveltely-padding-y) * 0.17 * var(--token-search-field-scale))
203
+ calc(var(--sveltely-padding-x) * 0.66 * var(--token-search-field-scale));
204
+ transition:
205
+ color 150ms,
206
+ border-color 150ms,
207
+ background-color 150ms;
204
208
  }
205
209
 
206
- :global(.token-search-input-remove-icon) {
207
- width: var(--token-search-input-remove-icon-size);
208
- height: var(--token-search-input-remove-icon-size);
210
+ :global(.token-search-field-remove-icon) {
211
+ width: var(--token-search-field-remove-icon-size);
212
+ height: var(--token-search-field-remove-icon-size);
209
213
  }
210
214
 
211
- .token-search-input-token:hover:not(:disabled) {
212
- border-color: var(--color-zinc-300);
215
+ .token-search-field-token:hover:not(:disabled) {
216
+ border-color: var(--sveltely-border-color);
213
217
  background: var(--sveltely-hover-color);
214
218
  }
215
219
 
216
- .token-search-input-token:disabled {
220
+ .token-search-field-token:disabled {
217
221
  cursor: not-allowed;
218
222
  opacity: 0.6;
219
223
  }
220
224
 
221
- .token-search-input-confirm {
225
+ .token-search-field-confirm {
222
226
  flex-shrink: 0;
223
- color: var(--color-zinc-500);
224
- font-size: var(--token-search-input-confirm-font-size);
227
+ color: var(--sveltely-secondary-color);
228
+ font-size: var(--token-search-field-confirm-font-size);
225
229
  font-weight: 500;
226
- line-height: calc(var(--token-search-input-confirm-font-size) * 1.333);
230
+ line-height: calc(var(--token-search-field-confirm-font-size) * 1.333);
227
231
  letter-spacing: 0.18em;
228
232
  text-transform: uppercase;
229
233
  }
@@ -9,6 +9,6 @@ type Props = {
9
9
  normalizeToken?: (value: string) => string;
10
10
  showIcon?: boolean;
11
11
  } & StyleProps & Omit<HTMLInputAttributes, 'children' | 'type' | 'value' | 'placeholder' | 'class' | 'style'>;
12
- declare const TokenSearchInput: import("svelte").Component<Props, {}, "value" | "tokens">;
13
- type TokenSearchInput = ReturnType<typeof TokenSearchInput>;
14
- export default TokenSearchInput;
12
+ declare const TokenSearchField: import("svelte").Component<Props, {}, "value" | "tokens">;
13
+ type TokenSearchField = ReturnType<typeof TokenSearchField>;
14
+ export default TokenSearchField;
@@ -0,0 +1 @@
1
+ export { default } from './TokenSearchField.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './TokenSearchField.svelte';
@@ -0,0 +1,45 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { extractLayoutProps, layoutStyle, type LayoutProps } from '../../../style/layout';
4
+ import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
5
+
6
+ type Props = {
7
+ children?: Snippet;
8
+ } & LayoutProps &
9
+ StyleProps;
10
+
11
+ let { children, ...restProps }: Props = $props();
12
+
13
+ const extractedLayoutProps = $derived.by(() => extractLayoutProps(restProps));
14
+ const layoutProps = $derived(extractedLayoutProps.layoutProps);
15
+ const afterLayoutProps = $derived(extractedLayoutProps.restProps);
16
+ const extractedStyleProps = $derived.by(() => extractStyleProps(afterLayoutProps));
17
+ const styleProps = $derived(extractedStyleProps.styleProps);
18
+ const rootStyle = $derived.by(() =>
19
+ [layoutStyle(layoutProps), surfaceStyle(styleProps, 'stack')].filter(Boolean).join(' ')
20
+ );
21
+ </script>
22
+
23
+ <div class="vstack" style={rootStyle}>
24
+ {#if children}
25
+ {@render children()}
26
+ {/if}
27
+ </div>
28
+
29
+ <style>
30
+ .vstack {
31
+ display: flex;
32
+ min-width: min-content;
33
+ min-height: min-content;
34
+ flex-direction: column;
35
+ gap: var(--stack-gap, 0px);
36
+ border-radius: var(--stack-border-radius, 0px);
37
+ padding:
38
+ var(--stack-padding-y, 0px)
39
+ var(--stack-padding-x, 0px);
40
+ font-size: var(--stack-font-size, inherit);
41
+ --divider-width: 100%;
42
+ --divider-height: 1px;
43
+ --divider-align-self: auto;
44
+ }
45
+ </style>
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type LayoutProps } from '../../../style/layout';
3
+ import { type StyleProps } from '../../../style/surface';
4
+ type Props = {
5
+ children?: Snippet;
6
+ } & LayoutProps & StyleProps;
7
+ declare const VStack: import("svelte").Component<Props, {}, "">;
8
+ type VStack = ReturnType<typeof VStack>;
9
+ export default VStack;
@@ -0,0 +1 @@
1
+ export { default } from './VStack.svelte';
@@ -0,0 +1 @@
1
+ export { default } from './VStack.svelte';
@@ -20,11 +20,7 @@
20
20
 
21
21
  const easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 3);
22
22
 
23
- const animateScrollTo = (
24
- nextViewport: HTMLDivElement,
25
- targetTop: number,
26
- duration = 220
27
- ) => {
23
+ const animateScrollTo = (nextViewport: HTMLDivElement, targetTop: number, duration = 220) => {
28
24
  if (scrollAnimationFrame) cancelAnimationFrame(scrollAnimationFrame);
29
25
 
30
26
  const startTop = nextViewport.scrollTop;
@@ -264,12 +260,10 @@
264
260
  display: flex;
265
261
  align-items: center;
266
262
  justify-content: center;
267
- padding:
268
- 0
269
- calc(var(--sveltely-padding-x) * 0.67 * var(--wheel-picker-scale));
263
+ padding: 0 calc(var(--sveltely-padding-x) * 0.67 * var(--wheel-picker-scale));
270
264
  font-size: calc(var(--wheel-picker-font-size) * 0.875);
271
265
  line-height: 1;
272
- color: var(--color-zinc-700);
266
+ color: var(--sveltely-primary-color);
273
267
  text-align: center;
274
268
  appearance: none;
275
269
  position: relative;
@@ -289,7 +283,7 @@
289
283
  }
290
284
 
291
285
  .wheel-column-option:focus-visible {
292
- outline: 2px solid color-mix(in oklab, var(--sveltely-primary-color) 24%, white);
286
+ outline: 2px solid color-mix(in oklab, var(--sveltely-active-color) 24%, white);
293
287
  outline-offset: 2px;
294
288
  }
295
289