twintrinsic 0.0.1

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 (212) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +150 -0
  3. package/dist/App/App.svelte +54 -0
  4. package/dist/App/App.svelte.d.ts +65 -0
  5. package/dist/Section.svelte +25 -0
  6. package/dist/Section.svelte.d.ts +34 -0
  7. package/dist/actions/clickOutside.d.ts +9 -0
  8. package/dist/actions/clickOutside.js +19 -0
  9. package/dist/actions/index.d.ts +1 -0
  10. package/dist/actions/index.js +1 -0
  11. package/dist/components/Accordion/Accordion.svelte +75 -0
  12. package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
  13. package/dist/components/Accordion/AccordionItem.svelte +150 -0
  14. package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
  15. package/dist/components/App/App.story.md +8 -0
  16. package/dist/components/App/App.story.svelte +170 -0
  17. package/dist/components/App/App.story.svelte.d.ts +22 -0
  18. package/dist/components/App/App.svelte +77 -0
  19. package/dist/components/App/App.svelte.d.ts +66 -0
  20. package/dist/components/App/Split.svelte +346 -0
  21. package/dist/components/App/Split.svelte.d.ts +54 -0
  22. package/dist/components/App/index.d.ts +2 -0
  23. package/dist/components/App/index.js +3 -0
  24. package/dist/components/AppHeader/AppHeader.svelte +439 -0
  25. package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
  26. package/dist/components/Avatar/Avatar.svelte +300 -0
  27. package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
  28. package/dist/components/Avatar/AvatarGroup.svelte +185 -0
  29. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
  30. package/dist/components/Badge/Badge.svelte +186 -0
  31. package/dist/components/Badge/Badge.svelte.d.ts +51 -0
  32. package/dist/components/BottomBar/BottomBar.svelte +146 -0
  33. package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
  34. package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
  35. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
  36. package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
  37. package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
  38. package/dist/components/Button/Button.svelte +252 -0
  39. package/dist/components/Button/Button.svelte.d.ts +80 -0
  40. package/dist/components/Button/ButtonGroup.svelte +127 -0
  41. package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
  42. package/dist/components/Card/Card.svelte +152 -0
  43. package/dist/components/Card/Card.svelte.d.ts +55 -0
  44. package/dist/components/Carousel/Carousel.svelte +461 -0
  45. package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
  46. package/dist/components/Carousel/CarouselItem.svelte +149 -0
  47. package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
  48. package/dist/components/Chip/Chip.svelte +288 -0
  49. package/dist/components/Chip/Chip.svelte.d.ts +71 -0
  50. package/dist/components/Chip/ChipGroup.svelte +190 -0
  51. package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
  52. package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
  53. package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
  54. package/dist/components/CodeBlock/index.d.ts +1 -0
  55. package/dist/components/CodeBlock/index.js +1 -0
  56. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
  57. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
  58. package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
  59. package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
  60. package/dist/components/Combobox/Combobox.svelte +279 -0
  61. package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
  62. package/dist/components/Container/Container.svelte +45 -0
  63. package/dist/components/Container/Container.svelte.d.ts +36 -0
  64. package/dist/components/DataTable/DataTable.svelte +879 -0
  65. package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
  66. package/dist/components/Form/AutoComplete.svelte +357 -0
  67. package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
  68. package/dist/components/Form/Calendar.svelte +429 -0
  69. package/dist/components/Form/Calendar.svelte.d.ts +53 -0
  70. package/dist/components/Form/Checkbox.svelte +196 -0
  71. package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
  72. package/dist/components/Form/ColorPicker.svelte +396 -0
  73. package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
  74. package/dist/components/Form/Combobox.svelte +645 -0
  75. package/dist/components/Form/Combobox.svelte.d.ts +93 -0
  76. package/dist/components/Form/Dropdown.svelte +773 -0
  77. package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
  78. package/dist/components/Form/FileUpload.svelte +796 -0
  79. package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
  80. package/dist/components/Form/FloatLabel.svelte +245 -0
  81. package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
  82. package/dist/components/Form/Form.svelte +281 -0
  83. package/dist/components/Form/Form.svelte.d.ts +54 -0
  84. package/dist/components/Form/FormField.svelte +218 -0
  85. package/dist/components/Form/FormField.svelte.d.ts +47 -0
  86. package/dist/components/Form/Input.svelte +340 -0
  87. package/dist/components/Form/Input.svelte.d.ts +79 -0
  88. package/dist/components/Form/InputSwitch.svelte +189 -0
  89. package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
  90. package/dist/components/Form/InvalidState.svelte +97 -0
  91. package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
  92. package/dist/components/Form/Knob.svelte +537 -0
  93. package/dist/components/Form/Knob.svelte.d.ts +78 -0
  94. package/dist/components/Form/ListInput.svelte +469 -0
  95. package/dist/components/Form/ListInput.svelte.d.ts +70 -0
  96. package/dist/components/Form/Listbox.svelte +513 -0
  97. package/dist/components/Form/Listbox.svelte.d.ts +74 -0
  98. package/dist/components/Form/NumberInput.svelte +452 -0
  99. package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
  100. package/dist/components/Form/Radio.svelte +192 -0
  101. package/dist/components/Form/Radio.svelte.d.ts +53 -0
  102. package/dist/components/Form/RadioGroup.svelte +155 -0
  103. package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
  104. package/dist/components/Form/Rating.svelte +380 -0
  105. package/dist/components/Form/Rating.svelte.d.ts +64 -0
  106. package/dist/components/Form/Select.svelte +436 -0
  107. package/dist/components/Form/Select.svelte.d.ts +49 -0
  108. package/dist/components/Form/SelectGroup.svelte +34 -0
  109. package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
  110. package/dist/components/Form/Slider.svelte +622 -0
  111. package/dist/components/Form/Slider.svelte.d.ts +73 -0
  112. package/dist/components/Form/Switch.svelte +192 -0
  113. package/dist/components/Form/Switch.svelte.d.ts +46 -0
  114. package/dist/components/Form/TextInput.svelte +274 -0
  115. package/dist/components/Form/TextInput.svelte.d.ts +74 -0
  116. package/dist/components/Form/Textarea.svelte +207 -0
  117. package/dist/components/Form/Textarea.svelte.d.ts +62 -0
  118. package/dist/components/Icon/Icon.svelte +140 -0
  119. package/dist/components/Icon/Icon.svelte.d.ts +25 -0
  120. package/dist/components/Icon/index.d.ts +1 -0
  121. package/dist/components/Icon/index.js +1 -0
  122. package/dist/components/Lazy/Lazy.svelte +158 -0
  123. package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
  124. package/dist/components/Masonry/Masonry.svelte +299 -0
  125. package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
  126. package/dist/components/Menu/Menu/Menu.svelte +65 -0
  127. package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
  128. package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
  129. package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
  130. package/dist/components/Modal/Modal.svelte +334 -0
  131. package/dist/components/Modal/Modal.svelte.d.ts +55 -0
  132. package/dist/components/Panel/Card.svelte +141 -0
  133. package/dist/components/Panel/Card.svelte.d.ts +52 -0
  134. package/dist/components/Panel/Hero/Hero.story.md +9 -0
  135. package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
  136. package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
  137. package/dist/components/Panel/Hero/Hero.svelte +24 -0
  138. package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
  139. package/dist/components/Panel/LazyPanel.svelte +110 -0
  140. package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
  141. package/dist/components/Panel/Panel.svelte +205 -0
  142. package/dist/components/Panel/Panel.svelte.d.ts +23 -0
  143. package/dist/components/Progress/Progress.svelte +220 -0
  144. package/dist/components/Progress/Progress.svelte.d.ts +61 -0
  145. package/dist/components/Separator/Separator.svelte +109 -0
  146. package/dist/components/Separator/Separator.svelte.d.ts +35 -0
  147. package/dist/components/Sidebar/Sidebar.svelte +213 -0
  148. package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
  149. package/dist/components/Skeleton/Skeleton.svelte +170 -0
  150. package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
  151. package/dist/components/Stepper/Stepper.svelte +111 -0
  152. package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
  153. package/dist/components/Stepper/StepperStep.svelte +369 -0
  154. package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
  155. package/dist/components/Table/Table.svelte +167 -0
  156. package/dist/components/Table/Table.svelte.d.ts +56 -0
  157. package/dist/components/Table/TableBody.svelte +41 -0
  158. package/dist/components/Table/TableBody.svelte.d.ts +33 -0
  159. package/dist/components/Table/TableCell.svelte +76 -0
  160. package/dist/components/Table/TableCell.svelte.d.ts +36 -0
  161. package/dist/components/Table/TableHead.svelte +41 -0
  162. package/dist/components/Table/TableHead.svelte.d.ts +32 -0
  163. package/dist/components/Table/TableHeader.svelte +148 -0
  164. package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
  165. package/dist/components/Table/TableRow.svelte +99 -0
  166. package/dist/components/Table/TableRow.svelte.d.ts +40 -0
  167. package/dist/components/Tabs/Tab.svelte +145 -0
  168. package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
  169. package/dist/components/Tabs/TabList.svelte +60 -0
  170. package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
  171. package/dist/components/Tabs/TabPanel.svelte +118 -0
  172. package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
  173. package/dist/components/Tabs/Tabs.svelte +287 -0
  174. package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
  175. package/dist/components/Tag/Tag.svelte +260 -0
  176. package/dist/components/Tag/Tag.svelte.d.ts +54 -0
  177. package/dist/components/Tag/TagGroup.svelte +147 -0
  178. package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
  179. package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
  180. package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
  181. package/dist/components/Timeline/Timeline.svelte +144 -0
  182. package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
  183. package/dist/components/Timeline/TimelineItem.svelte +391 -0
  184. package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
  185. package/dist/components/Toast/Toast.svelte +313 -0
  186. package/dist/components/Toast/Toast.svelte.d.ts +44 -0
  187. package/dist/components/Toast/toastStore.d.ts +40 -0
  188. package/dist/components/Toast/toastStore.js +293 -0
  189. package/dist/components/Tooltip/Tooltip.svelte +282 -0
  190. package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
  191. package/dist/components/Tree/Tree.svelte +129 -0
  192. package/dist/components/Tree/Tree.svelte.d.ts +61 -0
  193. package/dist/components/Tree/TreeNode.svelte +332 -0
  194. package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
  195. package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
  196. package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
  197. package/dist/components/icons/twintrinsic-source.svg +73 -0
  198. package/dist/components/icons/twintrinsic.svg +38 -0
  199. package/dist/docs/EventsTable.svelte +86 -0
  200. package/dist/docs/EventsTable.svelte.d.ts +27 -0
  201. package/dist/docs/PropsTable.svelte +103 -0
  202. package/dist/docs/PropsTable.svelte.d.ts +28 -0
  203. package/dist/docs/index.d.ts +2 -0
  204. package/dist/docs/index.js +2 -0
  205. package/dist/helpers/detectLanguage.d.ts +6 -0
  206. package/dist/helpers/detectLanguage.js +60 -0
  207. package/dist/helpers/index.d.ts +1 -0
  208. package/dist/helpers/index.js +1 -0
  209. package/dist/index.d.ts +86 -0
  210. package/dist/index.js +94 -0
  211. package/dist/twintrinsic.css +347 -0
  212. package/package.json +98 -0
@@ -0,0 +1,50 @@
1
+ export default Checkbox;
2
+ type Checkbox = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * Checkbox - A form component for boolean or indeterminate input with customizable
8
+ * labels, descriptions, and validation states.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Checkbox
13
+ * label="Accept terms"
14
+ * onchange={handleChange}
15
+ * />
16
+ *
17
+ * <Checkbox
18
+ * label="Select all"
19
+ * indeterminate={someSelected}
20
+ * checked={allSelected}
21
+ * description="Select all items in the list"
22
+ * />
23
+ * ```
24
+ */
25
+ declare const Checkbox: import("svelte").Component<{
26
+ label: any;
27
+ description?: string;
28
+ checked?: boolean;
29
+ indeterminate?: boolean;
30
+ disabled?: boolean;
31
+ required?: boolean;
32
+ error?: string;
33
+ name?: string;
34
+ value?: string;
35
+ class?: string;
36
+ onchange: any;
37
+ }, {}, "">;
38
+ type $$ComponentProps = {
39
+ label: any;
40
+ description?: string;
41
+ checked?: boolean;
42
+ indeterminate?: boolean;
43
+ disabled?: boolean;
44
+ required?: boolean;
45
+ error?: string;
46
+ name?: string;
47
+ value?: string;
48
+ class?: string;
49
+ onchange: any;
50
+ };
@@ -0,0 +1,396 @@
1
+ <!--
2
+ @component
3
+ ColorPicker - A form component for color selection with RGB, HSL, and hex input support.
4
+ Includes a color wheel, alpha slider, and format switching.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <ColorPicker
9
+ value="#FF0000"
10
+ onchange={handleChange}
11
+ />
12
+
13
+ <ColorPicker
14
+ value="rgba(255, 0, 0, 0.5)"
15
+ format="rgba"
16
+ showAlpha={true}
17
+ />
18
+ ```
19
+ -->
20
+ <script>
21
+ import { slide } from "svelte/transition"
22
+ import { clickOutside } from "../../actions"
23
+ import Input from "./Input.svelte"
24
+
25
+ const {
26
+ /** @type {string} - Color value in current format */
27
+ value = "#000000",
28
+ /** @type {'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla'} - Color format */
29
+ format = "hex",
30
+ /** @type {boolean} - Whether to show alpha channel */
31
+ showAlpha = false,
32
+ /** @type {string} - Input label */
33
+ label = "Color",
34
+ /** @type {boolean} - Whether the picker is disabled */
35
+ disabled = false,
36
+ /** @type {string} - Error message */
37
+ error = "",
38
+ /** @type {string} - Additional CSS classes */
39
+ class: className = "",
40
+ /** @type {(event: CustomEvent) => void} - Change event handler */
41
+ onchange,
42
+ } = $props()
43
+
44
+ let showPicker = $state(false)
45
+ let hue = $state(0)
46
+ let saturation = $state(100)
47
+ let lightness = $state(50)
48
+ let alpha = $state(100)
49
+ let inputValue = $state("")
50
+ let pickerRef = $state()
51
+
52
+ // Initialize color from value
53
+ $effect(() => {
54
+ if (value) {
55
+ const color = parseColor(value)
56
+ if (color) {
57
+ ;({ hue, saturation, lightness, alpha } = color)
58
+ updateInputValue()
59
+ }
60
+ }
61
+ })
62
+
63
+ // Parse color string to HSL(A) values
64
+ function parseColor(colorStr) {
65
+ try {
66
+ const div = document.createElement("div")
67
+ div.style.color = colorStr
68
+ document.body.appendChild(div)
69
+ const computed = getComputedStyle(div).color
70
+ document.body.removeChild(div)
71
+
72
+ const match = computed.match(/\d+(\.\d+)?/g)
73
+ if (!match) return null
74
+
75
+ const [r, g, b, a = 1] = match.map(Number)
76
+ const [h, s, l] = rgbToHsl(r, g, b)
77
+
78
+ return {
79
+ hue: h,
80
+ saturation: s,
81
+ lightness: l,
82
+ alpha: a * 100,
83
+ }
84
+ } catch {
85
+ return null
86
+ }
87
+ }
88
+
89
+ // Convert RGB to HSL
90
+ function rgbToHsl(r, g, b) {
91
+ r /= 255
92
+ g /= 255
93
+ b /= 255
94
+
95
+ const max = Math.max(r, g, b)
96
+ const min = Math.min(r, g, b)
97
+ let h,
98
+ s,
99
+ l = (max + min) / 2
100
+
101
+ if (max === min) {
102
+ h = s = 0
103
+ } else {
104
+ const d = max - min
105
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
106
+
107
+ switch (max) {
108
+ case r:
109
+ h = (g - b) / d + (g < b ? 6 : 0)
110
+ break
111
+ case g:
112
+ h = (b - r) / d + 2
113
+ break
114
+ case b:
115
+ h = (r - g) / d + 4
116
+ break
117
+ }
118
+
119
+ h /= 6
120
+ }
121
+
122
+ return [h * 360, s * 100, l * 100]
123
+ }
124
+
125
+ // Convert HSL to RGB
126
+ function hslToRgb(h, s, l) {
127
+ h /= 360
128
+ s /= 100
129
+ l /= 100
130
+
131
+ let r, g, b
132
+
133
+ if (s === 0) {
134
+ r = g = b = l
135
+ } else {
136
+ const hue2rgb = (p, q, t) => {
137
+ if (t < 0) t += 1
138
+ if (t > 1) t -= 1
139
+ if (t < 1 / 6) return p + (q - p) * 6 * t
140
+ if (t < 1 / 2) return q
141
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6
142
+ return p
143
+ }
144
+
145
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s
146
+ const p = 2 * l - q
147
+
148
+ r = hue2rgb(p, q, h + 1 / 3)
149
+ g = hue2rgb(p, q, h)
150
+ b = hue2rgb(p, q, h - 1 / 3)
151
+ }
152
+
153
+ return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]
154
+ }
155
+
156
+ // Convert RGB to hex
157
+ function rgbToHex(r, g, b) {
158
+ const toHex = (x) => {
159
+ const hex = x.toString(16)
160
+ return hex.length === 1 ? "0" + hex : hex
161
+ }
162
+
163
+ return "#" + toHex(r) + toHex(g) + toHex(b)
164
+ }
165
+
166
+ // Update color from HSL values
167
+ function updateColor(h, s, l, a) {
168
+ hue = h
169
+ saturation = s
170
+ lightness = l
171
+ alpha = a
172
+
173
+ updateInputValue()
174
+ onchange?.(new CustomEvent("change", { detail: { value: inputValue } }))
175
+ }
176
+
177
+ // Update input value based on current color
178
+ function updateInputValue() {
179
+ const [r, g, b] = hslToRgb(hue, saturation, lightness)
180
+ const a = alpha / 100
181
+
182
+ switch (format) {
183
+ case "hex":
184
+ inputValue = rgbToHex(r, g, b)
185
+ break
186
+ case "rgb":
187
+ inputValue = `rgb(${r}, ${g}, ${b})`
188
+ break
189
+ case "rgba":
190
+ inputValue = `rgba(${r}, ${g}, ${b}, ${a})`
191
+ break
192
+ case "hsl":
193
+ inputValue = `hsl(${Math.round(hue)}, ${Math.round(saturation)}%, ${Math.round(lightness)}%)`
194
+ break
195
+ case "hsla":
196
+ inputValue = `hsla(${Math.round(hue)}, ${Math.round(saturation)}%, ${Math.round(lightness)}%, ${a})`
197
+ break
198
+ }
199
+ }
200
+
201
+ // Handle color wheel interaction
202
+ function handleColorWheel(event) {
203
+ if (disabled) return
204
+
205
+ const rect = pickerRef.getBoundingClientRect()
206
+ const x = event.clientX - rect.left
207
+ const y = event.clientY - rect.top
208
+
209
+ const centerX = rect.width / 2
210
+ const centerY = rect.height / 2
211
+ const radius = Math.min(centerX, centerY)
212
+
213
+ const dx = x - centerX
214
+ const dy = y - centerY
215
+ const distance = Math.sqrt(dx * dx + dy * dy)
216
+
217
+ if (distance <= radius) {
218
+ const angle = Math.atan2(dy, dx)
219
+ const newHue = ((angle * 180) / Math.PI + 360) % 360
220
+ const newSaturation = (distance / radius) * 100
221
+
222
+ updateColor(newHue, newSaturation, lightness, alpha)
223
+ }
224
+ }
225
+
226
+ // Handle lightness slider
227
+ function handleLightness(event) {
228
+ if (disabled) return
229
+ const newLightness = Number(event.target.value)
230
+ updateColor(hue, saturation, newLightness, alpha)
231
+ }
232
+
233
+ // Handle alpha slider
234
+ function handleAlpha(event) {
235
+ if (disabled) return
236
+ const newAlpha = Number(event.target.value)
237
+ updateColor(hue, saturation, lightness, newAlpha)
238
+ }
239
+
240
+ // Handle input change
241
+ function handleInput(event) {
242
+ const newValue = event.detail.value
243
+ const color = parseColor(newValue)
244
+
245
+ if (color) {
246
+ updateColor(color.hue, color.saturation, color.lightness, color.alpha)
247
+ }
248
+ }
249
+ </script>
250
+
251
+ <div
252
+ class="color-picker {className}"
253
+ use:clickOutside
254
+ onclickOutside={() => showPicker = false}
255
+ >
256
+ <Input
257
+ {label}
258
+ {disabled}
259
+ {error}
260
+ value={inputValue}
261
+ oninput={handleInput}
262
+ onclick={() => showPicker = !showPicker}
263
+ rightIcon="palette"
264
+ onrightIconClick={() => showPicker = !showPicker}
265
+ />
266
+
267
+ {#if showPicker}
268
+ <div
269
+ class="color-picker-popup"
270
+ role="dialog"
271
+ aria-label="Color picker"
272
+ transition:slide={{ duration: 150 }}
273
+ >
274
+ <div
275
+ class="color-wheel"
276
+ bind:this={pickerRef}
277
+ onmousedown={handleColorWheel}
278
+ onmousemove={event => {
279
+ if (event.buttons === 1) handleColorWheel(event);
280
+ }}
281
+ style="
282
+ --hue: {hue}deg;
283
+ --saturation: {saturation}%;
284
+ --lightness: {lightness}%;
285
+ "
286
+ >
287
+ <div class="color-wheel-pointer" />
288
+ </div>
289
+
290
+ <div class="color-sliders">
291
+ <label class="color-slider">
292
+ <span>Lightness</span>
293
+ <input
294
+ type="range"
295
+ min="0"
296
+ max="100"
297
+ value={lightness}
298
+ disabled={disabled}
299
+ oninput={handleLightness}
300
+ />
301
+ </label>
302
+
303
+ {#if showAlpha}
304
+ <label class="color-slider">
305
+ <span>Alpha</span>
306
+ <input
307
+ type="range"
308
+ min="0"
309
+ max="100"
310
+ value={alpha}
311
+ disabled={disabled}
312
+ oninput={handleAlpha}
313
+ />
314
+ </label>
315
+ {/if}
316
+ </div>
317
+
318
+ <div class="color-preview">
319
+ <div
320
+ class="color-swatch"
321
+ style="
322
+ background-color: hsla({hue}, {saturation}%, {lightness}%, {alpha / 100});
323
+ "
324
+ />
325
+ <div class="color-value">{inputValue}</div>
326
+ </div>
327
+ </div>
328
+ {/if}
329
+ </div>
330
+
331
+ <style>
332
+ @reference "../../twintrinsic.css";
333
+
334
+ .color-picker {
335
+ @apply relative inline-block w-full;
336
+ }
337
+
338
+ .color-picker-popup {
339
+ @apply absolute z-50 mt-1 p-4;
340
+ @apply bg-surface border border-border rounded-md shadow-lg;
341
+ @apply min-w-[240px];
342
+ }
343
+
344
+ .color-wheel {
345
+ @apply relative w-48 h-48 mb-4 rounded-full;
346
+ @apply bg-[conic-gradient(from_var(--hue),red,yellow,lime,aqua,blue,magenta,red)];
347
+ @apply cursor-crosshair;
348
+
349
+ mask: radial-gradient(white, transparent);
350
+ -webkit-mask: radial-gradient(white, transparent);
351
+ }
352
+
353
+ .color-wheel-pointer {
354
+ @apply absolute w-4 h-4 -mt-2 -ml-2;
355
+ @apply border-2 border-white rounded-full shadow-md;
356
+ @apply pointer-events-none;
357
+
358
+ left: calc(50% + (var(--saturation) * 0.24px) * cos(var(--hue)));
359
+ top: calc(50% + (var(--saturation) * 0.24px) * sin(var(--hue)));
360
+ }
361
+
362
+ .color-sliders {
363
+ @apply flex flex-col gap-4 mb-4;
364
+ }
365
+
366
+ .color-slider {
367
+ @apply flex flex-col gap-1;
368
+ }
369
+
370
+ .color-slider span {
371
+ @apply text-xs text-muted;
372
+ }
373
+
374
+ .color-slider input {
375
+ @apply w-full;
376
+ }
377
+
378
+ .color-preview {
379
+ @apply flex items-center gap-2;
380
+ }
381
+
382
+ .color-swatch {
383
+ @apply w-8 h-8 rounded;
384
+ @apply border border-border;
385
+ background-image: linear-gradient(45deg, #808080 25%, transparent 25%),
386
+ linear-gradient(-45deg, #808080 25%, transparent 25%),
387
+ linear-gradient(45deg, transparent 75%, #808080 75%),
388
+ linear-gradient(-45deg, transparent 75%, #808080 75%);
389
+ background-size: 8px 8px;
390
+ background-position: 0 0, 0 4px, 4px -4px, -4px 0px;
391
+ }
392
+
393
+ .color-value {
394
+ @apply text-sm font-mono;
395
+ }
396
+ </style>
@@ -0,0 +1,43 @@
1
+ export default ColorPicker;
2
+ type ColorPicker = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * ColorPicker - A form component for color selection with RGB, HSL, and hex input support.
8
+ * Includes a color wheel, alpha slider, and format switching.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <ColorPicker
13
+ * value="#FF0000"
14
+ * onchange={handleChange}
15
+ * />
16
+ *
17
+ * <ColorPicker
18
+ * value="rgba(255, 0, 0, 0.5)"
19
+ * format="rgba"
20
+ * showAlpha={true}
21
+ * />
22
+ * ```
23
+ */
24
+ declare const ColorPicker: import("svelte").Component<{
25
+ value?: string;
26
+ format?: string;
27
+ showAlpha?: boolean;
28
+ label?: string;
29
+ disabled?: boolean;
30
+ error?: string;
31
+ class?: string;
32
+ onchange: any;
33
+ }, {}, "">;
34
+ type $$ComponentProps = {
35
+ value?: string;
36
+ format?: string;
37
+ showAlpha?: boolean;
38
+ label?: string;
39
+ disabled?: boolean;
40
+ error?: string;
41
+ class?: string;
42
+ onchange: any;
43
+ };