@sovereignfs/ui 0.33.1 → 0.40.0

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 (54) hide show
  1. package/README.md +1 -1
  2. package/dist/CheckableListRow.module.css +95 -0
  3. package/dist/FileDropzone.module.css +63 -0
  4. package/dist/IconPicker.module.css +63 -0
  5. package/dist/QuantityStepper.module.css +67 -0
  6. package/dist/SuggestionInput.module.css +103 -0
  7. package/dist/index.d.ts +196 -3
  8. package/dist/index.js +1175 -185
  9. package/package.json +1 -1
  10. package/src/components/CheckableListRow/CheckableListRow.module.css +95 -0
  11. package/src/components/CheckableListRow/CheckableListRow.stories.tsx +99 -0
  12. package/src/components/CheckableListRow/CheckableListRow.tsx +89 -0
  13. package/src/components/FileDropzone/FileDropzone.module.css +63 -0
  14. package/src/components/FileDropzone/FileDropzone.tsx +109 -0
  15. package/src/components/FileDropzone/__tests__/FileDropzone.test.tsx +67 -0
  16. package/src/components/Icon/icons/apple.tsx +21 -0
  17. package/src/components/Icon/icons/banana.tsx +21 -0
  18. package/src/components/Icon/icons/beef.tsx +22 -0
  19. package/src/components/Icon/icons/beer.tsx +24 -0
  20. package/src/components/Icon/icons/candy.tsx +24 -0
  21. package/src/components/Icon/icons/carrot.tsx +22 -0
  22. package/src/components/Icon/icons/coffee.tsx +23 -0
  23. package/src/components/Icon/icons/cookie.tsx +25 -0
  24. package/src/components/Icon/icons/croissant.tsx +24 -0
  25. package/src/components/Icon/icons/cup-soda.tsx +23 -0
  26. package/src/components/Icon/icons/drumstick.tsx +21 -0
  27. package/src/components/Icon/icons/egg.tsx +20 -0
  28. package/src/components/Icon/icons/external-link.tsx +22 -0
  29. package/src/components/Icon/icons/file.tsx +21 -0
  30. package/src/components/Icon/icons/fish.tsx +25 -0
  31. package/src/components/Icon/icons/index.ts +93 -1
  32. package/src/components/Icon/icons/milk.tsx +22 -0
  33. package/src/components/Icon/icons/pizza.tsx +24 -0
  34. package/src/components/Icon/icons/salad.tsx +24 -0
  35. package/src/components/Icon/icons/shopping-basket.tsx +26 -0
  36. package/src/components/Icon/icons/snowflake.tsx +31 -0
  37. package/src/components/Icon/icons/spray-can.tsx +29 -0
  38. package/src/components/Icon/icons/upload.tsx +22 -0
  39. package/src/components/Icon/icons/wine.tsx +23 -0
  40. package/src/components/IconPicker/IconPicker.module.css +63 -0
  41. package/src/components/IconPicker/IconPicker.stories.tsx +84 -0
  42. package/src/components/IconPicker/IconPicker.tsx +90 -0
  43. package/src/components/QuantityStepper/QuantityStepper.module.css +67 -0
  44. package/src/components/QuantityStepper/QuantityStepper.stories.tsx +79 -0
  45. package/src/components/QuantityStepper/QuantityStepper.tsx +107 -0
  46. package/src/components/SuggestionInput/SuggestionInput.module.css +103 -0
  47. package/src/components/SuggestionInput/SuggestionInput.stories.tsx +144 -0
  48. package/src/components/SuggestionInput/SuggestionInput.tsx +207 -0
  49. package/src/hooks/index.ts +2 -0
  50. package/src/hooks/useCommitOnEnterOrBlur.ts +39 -0
  51. package/src/index.ts +21 -2
  52. package/src/stories/DesignSystemOverview.stories.tsx +134 -1
  53. package/src/stories/FileDropzone.stories.tsx +69 -0
  54. package/src/stories/InteractionHooks.stories.tsx +55 -1
@@ -0,0 +1,23 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function CoffeeIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M10 2v2" />
18
+ <path d="M14 2v2" />
19
+ <path d="M16 8a1 1 0 0 1 1 1v8a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1h14a4 4 0 1 1 0 8h-1" />
20
+ <path d="M6 2v2" />
21
+ </svg>
22
+ );
23
+ }
@@ -0,0 +1,25 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function CookieIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M12 2a10 10 0 1 0 10 10 4 4 0 0 1-5-5 4 4 0 0 1-5-5" />
18
+ <path d="M8.5 8.5v.01" />
19
+ <path d="M16 15.5v.01" />
20
+ <path d="M12 12v.01" />
21
+ <path d="M11 17v.01" />
22
+ <path d="M7 14v.01" />
23
+ </svg>
24
+ );
25
+ }
@@ -0,0 +1,24 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function CroissantIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M10.2 18H4.774a1.5 1.5 0 0 1-1.352-.97 11 11 0 0 1 .132-6.487" />
18
+ <path d="M18 10.2V4.774a1.5 1.5 0 0 0-.97-1.352 11 11 0 0 0-6.486.132" />
19
+ <path d="M18 5a4 3 0 0 1 4 3 2 2 0 0 1-2 2 10 10 0 0 0-5.139 1.42" />
20
+ <path d="M5 18a3 4 0 0 0 3 4 2 2 0 0 0 2-2 10 10 0 0 1 1.42-5.14" />
21
+ <path d="M8.709 2.554a10 10 0 0 0-6.155 6.155 1.5 1.5 0 0 0 .676 1.626l9.807 5.42a2 2 0 0 0 2.718-2.718l-5.42-9.807a1.5 1.5 0 0 0-1.626-.676" />
22
+ </svg>
23
+ );
24
+ }
@@ -0,0 +1,23 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function CupSodaIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m6 8 1.75 12.28a2 2 0 0 0 2 1.72h4.54a2 2 0 0 0 2-1.72L18 8" />
18
+ <path d="M5 8h14" />
19
+ <path d="M7 15a6.47 6.47 0 0 1 5 0 6.47 6.47 0 0 0 5 0" />
20
+ <path d="m12 8 1-6h2" />
21
+ </svg>
22
+ );
23
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function DrumstickIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M15.4 15.63a7.875 6 135 1 1 6.23-6.23 4.5 3.43 135 0 0-6.23 6.23" />
18
+ <path d="m8.29 12.71-2.6 2.6a2.5 2.5 0 1 0-1.65 4.65A2.5 2.5 0 1 0 8.7 18.3l2.59-2.59" />
19
+ </svg>
20
+ );
21
+ }
@@ -0,0 +1,20 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function EggIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M12 2C8 2 4 8 4 14a8 8 0 0 0 16 0c0-6-4-12-8-12" />
18
+ </svg>
19
+ );
20
+ }
@@ -0,0 +1,22 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function ExternalLinkIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M15 3h6v6" />
18
+ <path d="M10 14 21 3" />
19
+ <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
20
+ </svg>
21
+ );
22
+ }
@@ -0,0 +1,21 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function FileIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
18
+ <path d="M14 2v5a1 1 0 0 0 1 1h5" />
19
+ </svg>
20
+ );
21
+ }
@@ -0,0 +1,25 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function FishIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M6.5 12c.94-3.46 4.94-6 8.5-6 3.56 0 6.06 2.54 7 6-.94 3.47-3.44 6-7 6s-7.56-2.53-8.5-6Z" />
18
+ <path d="M18 12v.5" />
19
+ <path d="M16 17.93a9.77 9.77 0 0 1 0-11.86" />
20
+ <path d="M7 10.67C7 8 5.58 5.97 2.73 5.5c-1 1.5-1 5 .23 6.5-1.24 1.5-1.24 5-.23 6.5C5.58 18.03 7 16 7 13.33" />
21
+ <path d="M10.46 7.26C10.2 5.88 9.17 4.24 8 3h5.8a2 2 0 0 1 1.98 1.67l.23 1.4" />
22
+ <path d="m16.01 17.93-.23 1.4A2 2 0 0 1 13.8 21H9.5a5.96 5.96 0 0 0 1.49-3.98" />
23
+ </svg>
24
+ );
25
+ }
@@ -29,6 +29,29 @@ import { AlertTriangleIcon } from './alert-triangle';
29
29
  import { CalendarIcon } from './calendar';
30
30
  import { SlidersHorizontalIcon } from './sliders-horizontal';
31
31
  import { EllipsisVerticalIcon } from './ellipsis-vertical';
32
+ import { FileIcon } from './file';
33
+ import { UploadIcon } from './upload';
34
+ import { ExternalLinkIcon } from './external-link';
35
+ import { BananaIcon } from './banana';
36
+ import { AppleIcon } from './apple';
37
+ import { CarrotIcon } from './carrot';
38
+ import { EggIcon } from './egg';
39
+ import { BeefIcon } from './beef';
40
+ import { FishIcon } from './fish';
41
+ import { CoffeeIcon } from './coffee';
42
+ import { WineIcon } from './wine';
43
+ import { BeerIcon } from './beer';
44
+ import { CookieIcon } from './cookie';
45
+ import { PizzaIcon } from './pizza';
46
+ import { CandyIcon } from './candy';
47
+ import { SaladIcon } from './salad';
48
+ import { MilkIcon } from './milk';
49
+ import { DrumstickIcon } from './drumstick';
50
+ import { CroissantIcon } from './croissant';
51
+ import { CupSodaIcon } from './cup-soda';
52
+ import { SprayCanIcon } from './spray-can';
53
+ import { SnowflakeIcon } from './snowflake';
54
+ import { ShoppingBasketIcon } from './shopping-basket';
32
55
 
33
56
  export type IconName =
34
57
  | 'house'
@@ -59,7 +82,30 @@ export type IconName =
59
82
  | 'alert-triangle'
60
83
  | 'calendar'
61
84
  | 'sliders-horizontal'
62
- | 'ellipsis-vertical';
85
+ | 'ellipsis-vertical'
86
+ | 'file'
87
+ | 'upload'
88
+ | 'external-link'
89
+ | 'banana'
90
+ | 'apple'
91
+ | 'carrot'
92
+ | 'egg'
93
+ | 'beef'
94
+ | 'fish'
95
+ | 'coffee'
96
+ | 'wine'
97
+ | 'beer'
98
+ | 'cookie'
99
+ | 'pizza'
100
+ | 'candy'
101
+ | 'salad'
102
+ | 'milk'
103
+ | 'drumstick'
104
+ | 'croissant'
105
+ | 'cup-soda'
106
+ | 'spray-can'
107
+ | 'snowflake'
108
+ | 'shopping-basket';
63
109
 
64
110
  export type IconComponent = (props: SVGProps<SVGSVGElement>) => ReactElement;
65
111
 
@@ -93,6 +139,29 @@ export const ICONS: Record<IconName, IconComponent> = {
93
139
  calendar: CalendarIcon,
94
140
  'sliders-horizontal': SlidersHorizontalIcon,
95
141
  'ellipsis-vertical': EllipsisVerticalIcon,
142
+ file: FileIcon,
143
+ upload: UploadIcon,
144
+ 'external-link': ExternalLinkIcon,
145
+ banana: BananaIcon,
146
+ apple: AppleIcon,
147
+ carrot: CarrotIcon,
148
+ egg: EggIcon,
149
+ beef: BeefIcon,
150
+ fish: FishIcon,
151
+ coffee: CoffeeIcon,
152
+ wine: WineIcon,
153
+ beer: BeerIcon,
154
+ cookie: CookieIcon,
155
+ pizza: PizzaIcon,
156
+ candy: CandyIcon,
157
+ salad: SaladIcon,
158
+ milk: MilkIcon,
159
+ drumstick: DrumstickIcon,
160
+ croissant: CroissantIcon,
161
+ 'cup-soda': CupSodaIcon,
162
+ 'spray-can': SprayCanIcon,
163
+ snowflake: SnowflakeIcon,
164
+ 'shopping-basket': ShoppingBasketIcon,
96
165
  };
97
166
 
98
167
  export { HouseIcon } from './house';
@@ -124,3 +193,26 @@ export { AlertTriangleIcon } from './alert-triangle';
124
193
  export { CalendarIcon } from './calendar';
125
194
  export { SlidersHorizontalIcon } from './sliders-horizontal';
126
195
  export { EllipsisVerticalIcon } from './ellipsis-vertical';
196
+ export { FileIcon } from './file';
197
+ export { UploadIcon } from './upload';
198
+ export { ExternalLinkIcon } from './external-link';
199
+ export { BananaIcon } from './banana';
200
+ export { AppleIcon } from './apple';
201
+ export { CarrotIcon } from './carrot';
202
+ export { EggIcon } from './egg';
203
+ export { BeefIcon } from './beef';
204
+ export { FishIcon } from './fish';
205
+ export { CoffeeIcon } from './coffee';
206
+ export { WineIcon } from './wine';
207
+ export { BeerIcon } from './beer';
208
+ export { CookieIcon } from './cookie';
209
+ export { PizzaIcon } from './pizza';
210
+ export { CandyIcon } from './candy';
211
+ export { SaladIcon } from './salad';
212
+ export { MilkIcon } from './milk';
213
+ export { DrumstickIcon } from './drumstick';
214
+ export { CroissantIcon } from './croissant';
215
+ export { CupSodaIcon } from './cup-soda';
216
+ export { SprayCanIcon } from './spray-can';
217
+ export { SnowflakeIcon } from './snowflake';
218
+ export { ShoppingBasketIcon } from './shopping-basket';
@@ -0,0 +1,22 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function MilkIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M8 2h8" />
18
+ <path d="M9 2v2.789a4 4 0 0 1-.672 2.219l-.656.984A4 4 0 0 0 7 10.212V20a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-9.789a4 4 0 0 0-.672-2.219l-.656-.984A4 4 0 0 1 15 4.788V2" />
19
+ <path d="M7 15a6.472 6.472 0 0 1 5 0 6.47 6.47 0 0 0 5 0" />
20
+ </svg>
21
+ );
22
+ }
@@ -0,0 +1,24 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function PizzaIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m12 14-1 1" />
18
+ <path d="m13.75 18.25-1.25 1.42" />
19
+ <path d="M17.775 5.654a15.68 15.68 0 0 0-12.121 12.12" />
20
+ <path d="M18.8 9.3a1 1 0 0 0 2.1 7.7" />
21
+ <path d="M21.964 20.732a1 1 0 0 1-1.232 1.232l-18-5a1 1 0 0 1-.695-1.232A19.68 19.68 0 0 1 15.732 2.037a1 1 0 0 1 1.232.695z" />
22
+ </svg>
23
+ );
24
+ }
@@ -0,0 +1,24 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function SaladIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M7 21h10" />
18
+ <path d="M12 21a9 9 0 0 0 9-9H3a9 9 0 0 0 9 9Z" />
19
+ <path d="M11.38 12a2.4 2.4 0 0 1-.4-4.77 2.4 2.4 0 0 1 3.2-2.77 2.4 2.4 0 0 1 3.47-.63 2.4 2.4 0 0 1 3.37 3.37 2.4 2.4 0 0 1-1.1 3.7 2.51 2.51 0 0 1 .03 1.1" />
20
+ <path d="m13 12 4-4" />
21
+ <path d="M10.9 7.25A3.99 3.99 0 0 0 4 10c0 .73.2 1.41.54 2" />
22
+ </svg>
23
+ );
24
+ }
@@ -0,0 +1,26 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function ShoppingBasketIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m15 11-1 9" />
18
+ <path d="m19 11-4-7" />
19
+ <path d="M2 11h20" />
20
+ <path d="m3.5 11 1.6 7.4a2 2 0 0 0 2 1.6h9.8a2 2 0 0 0 2-1.6l1.7-7.4" />
21
+ <path d="M4.5 15.5h15" />
22
+ <path d="m5 11 4-7" />
23
+ <path d="m9 11 1 9" />
24
+ </svg>
25
+ );
26
+ }
@@ -0,0 +1,31 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function SnowflakeIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="m10 20-1.25-2.5L6 18" />
18
+ <path d="M10 4 8.75 6.5 6 6" />
19
+ <path d="m14 20 1.25-2.5L18 18" />
20
+ <path d="m14 4 1.25 2.5L18 6" />
21
+ <path d="m17 21-3-6h-4" />
22
+ <path d="m17 3-3 6 1.5 3" />
23
+ <path d="M2 12h6.5L10 9" />
24
+ <path d="m20 10-1.5 2 1.5 2" />
25
+ <path d="M22 12h-6.5L14 15" />
26
+ <path d="m4 10 1.5 2L4 14" />
27
+ <path d="m7 21 3-6-1.5-3" />
28
+ <path d="m7 3 3 6h4" />
29
+ </svg>
30
+ );
31
+ }
@@ -0,0 +1,29 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function SprayCanIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M3 3h.01" />
18
+ <path d="M7 5h.01" />
19
+ <path d="M11 7h.01" />
20
+ <path d="M3 7h.01" />
21
+ <path d="M7 9h.01" />
22
+ <path d="M3 11h.01" />
23
+ <rect width="4" height="4" x="15" y="5" />
24
+ <path d="m19 9 2 2v10c0 .6-.4 1-1 1h-6c-.6 0-1-.4-1-1V11l2-2" />
25
+ <path d="m13 14 8-2" />
26
+ <path d="m13 19 8-2" />
27
+ </svg>
28
+ );
29
+ }
@@ -0,0 +1,22 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function UploadIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M12 3v12" />
18
+ <path d="m17 8-5-5-5 5" />
19
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
20
+ </svg>
21
+ );
22
+ }
@@ -0,0 +1,23 @@
1
+ // Generated by scripts/generate-icons.ts — do not edit.
2
+ // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
+ import type { SVGProps } from 'react';
4
+
5
+ export function WineIcon(props: SVGProps<SVGSVGElement>) {
6
+ return (
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ stroke="currentColor"
12
+ strokeWidth="2"
13
+ strokeLinecap="round"
14
+ strokeLinejoin="round"
15
+ {...props}
16
+ >
17
+ <path d="M8 22h8" />
18
+ <path d="M7 10h10" />
19
+ <path d="M12 15v7" />
20
+ <path d="M12 15a5 5 0 0 0 5-5c0-2-.5-4-2-8H9c-1.5 4-2 6-2 8a5 5 0 0 0 5 5Z" />
21
+ </svg>
22
+ );
23
+ }
@@ -0,0 +1,63 @@
1
+ .trigger {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: var(--sv-space-2);
5
+ padding: var(--sv-space-2);
6
+ border: 1px solid var(--sv-color-border-strong);
7
+ border-radius: var(--sv-radius-md);
8
+ background: var(--sv-color-surface);
9
+ color: var(--sv-color-text-primary);
10
+ cursor: pointer;
11
+ }
12
+
13
+ .trigger:hover {
14
+ background: var(--sv-color-surface-sunken);
15
+ }
16
+
17
+ .trigger:disabled {
18
+ opacity: 0.5;
19
+ cursor: not-allowed;
20
+ }
21
+
22
+ .placeholder {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ width: var(--sv-icon-size-md);
27
+ height: var(--sv-icon-size-md);
28
+ color: var(--sv-color-text-subtle);
29
+ font-size: var(--sv-font-size-sm);
30
+ }
31
+
32
+ .triggerLabel {
33
+ font-size: var(--sv-font-size-sm);
34
+ color: var(--sv-color-text-primary);
35
+ }
36
+
37
+ .grid {
38
+ display: grid;
39
+ grid-template-columns: repeat(5, 1fr);
40
+ gap: var(--sv-space-1);
41
+ padding: var(--sv-space-2);
42
+ }
43
+
44
+ .option {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ width: var(--sv-touch-target-min);
49
+ height: var(--sv-touch-target-min);
50
+ border: none;
51
+ border-radius: var(--sv-radius-sm);
52
+ background: transparent;
53
+ color: var(--sv-color-text-primary);
54
+ cursor: pointer;
55
+ }
56
+
57
+ .option:hover {
58
+ background: var(--sv-color-surface-sunken);
59
+ }
60
+
61
+ .optionSelected {
62
+ background: var(--sv-color-accent-subtle);
63
+ }