@dreamtree-org/twreact-ui 1.3.0 → 1.3.2

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 (234) hide show
  1. package/DESIGN.md +2 -2
  2. package/README.md +258 -10
  3. package/ai-skills/dreamtree-ui.md +111 -15
  4. package/charts/package.json +5 -0
  5. package/dist/_shared/cn-DPPQUJu1.js +138 -0
  6. package/dist/ai-schema.json +1252 -179
  7. package/dist/charts/index.d.ts +9 -0
  8. package/dist/charts/index.d.ts.map +1 -0
  9. package/dist/charts/index.js +769 -0
  10. package/dist/components/charts/AreaChart.d.ts +4 -0
  11. package/dist/components/charts/AreaChart.d.ts.map +1 -0
  12. package/dist/components/charts/BarChart.d.ts +4 -0
  13. package/dist/components/charts/BarChart.d.ts.map +1 -0
  14. package/dist/components/charts/CartesianChart.d.ts +5 -0
  15. package/dist/components/charts/CartesianChart.d.ts.map +1 -0
  16. package/dist/components/charts/ChartFrame.d.ts +18 -0
  17. package/dist/components/charts/ChartFrame.d.ts.map +1 -0
  18. package/dist/components/charts/DonutChart.d.ts +4 -0
  19. package/dist/components/charts/DonutChart.d.ts.map +1 -0
  20. package/dist/components/charts/LineChart.d.ts +4 -0
  21. package/dist/components/charts/LineChart.d.ts.map +1 -0
  22. package/dist/components/charts/Sparkline.d.ts +5 -0
  23. package/dist/components/charts/Sparkline.d.ts.map +1 -0
  24. package/dist/components/charts/chartTheme.d.ts +26 -0
  25. package/dist/components/charts/chartTheme.d.ts.map +1 -0
  26. package/dist/components/core/Accordion.d.ts.map +1 -1
  27. package/dist/components/core/Button.d.ts.map +1 -1
  28. package/dist/components/core/Checkbox.d.ts.map +1 -1
  29. package/dist/components/core/ColorPicker.d.ts.map +1 -1
  30. package/dist/components/core/DatePicker.d.ts.map +1 -1
  31. package/dist/components/core/DateRangePicker.d.ts.map +1 -1
  32. package/dist/components/core/Form.d.ts.map +1 -1
  33. package/dist/components/core/Input.d.ts.map +1 -1
  34. package/dist/components/core/LocationPicker.d.ts.map +1 -1
  35. package/dist/components/core/Popover.d.ts +4 -0
  36. package/dist/components/core/Popover.d.ts.map +1 -0
  37. package/dist/components/core/PriceRangePicker.d.ts.map +1 -1
  38. package/dist/components/core/ProgressBar.d.ts.map +1 -1
  39. package/dist/components/core/Radio.d.ts.map +1 -1
  40. package/dist/components/core/Rate.d.ts.map +1 -1
  41. package/dist/components/core/Select.d.ts.map +1 -1
  42. package/dist/components/core/Skeleton.d.ts.map +1 -1
  43. package/dist/components/core/Slider.d.ts +4 -0
  44. package/dist/components/core/Slider.d.ts.map +1 -0
  45. package/dist/components/core/SpeechToText.d.ts.map +1 -1
  46. package/dist/components/core/Switch.d.ts.map +1 -1
  47. package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
  48. package/dist/components/core/Table/ColumnMenu.d.ts +2 -1
  49. package/dist/components/core/Table/ColumnMenu.d.ts.map +1 -1
  50. package/dist/components/core/Table/MobileCard.d.ts +2 -2
  51. package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
  52. package/dist/components/core/Table/Table.d.ts.map +1 -1
  53. package/dist/components/core/Table/TableRow.d.ts +4 -2
  54. package/dist/components/core/Table/TableRow.d.ts.map +1 -1
  55. package/dist/components/core/Tabs.d.ts.map +1 -1
  56. package/dist/components/core/Textarea.d.ts +4 -0
  57. package/dist/components/core/Textarea.d.ts.map +1 -0
  58. package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
  59. package/dist/components/core/Tooltip.d.ts.map +1 -1
  60. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  61. package/dist/components/feedback/Drawer.d.ts +4 -0
  62. package/dist/components/feedback/Drawer.d.ts.map +1 -0
  63. package/dist/components/feedback/Toast.d.ts +14 -5
  64. package/dist/components/feedback/Toast.d.ts.map +1 -1
  65. package/dist/components/feedback/Tour.d.ts +4 -0
  66. package/dist/components/feedback/Tour.d.ts.map +1 -0
  67. package/dist/components/feedback/TourSpotlight.d.ts +9 -0
  68. package/dist/components/feedback/TourSpotlight.d.ts.map +1 -0
  69. package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
  70. package/dist/components/navigation/FootNav.d.ts.map +1 -1
  71. package/dist/components/navigation/Navbar.d.ts.map +1 -1
  72. package/dist/components/navigation/Sidebar.d.ts +8 -2
  73. package/dist/components/navigation/Sidebar.d.ts.map +1 -1
  74. package/dist/components/rich-text/RichTextEditor.d.ts +4 -0
  75. package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -0
  76. package/dist/components/rich-text/RichTextToolbar.d.ts +219 -0
  77. package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -0
  78. package/dist/components/utility/Badge.d.ts.map +1 -1
  79. package/dist/components/utility/FileUpload.d.ts.map +1 -1
  80. package/dist/components/utility/Sortable.d.ts +4 -0
  81. package/dist/components/utility/Sortable.d.ts.map +1 -0
  82. package/dist/esm/_vendor/object-assign/index.js +99 -0
  83. package/dist/esm/_vendor/prop-types/_vendor/react-is/cjs/react-is.development.js +190 -0
  84. package/dist/esm/_vendor/prop-types/_vendor/react-is/cjs/react-is.production.min.js +26 -0
  85. package/dist/esm/_vendor/prop-types/_vendor/react-is/index.js +19 -0
  86. package/dist/esm/_vendor/prop-types/checkPropTypes.js +115 -0
  87. package/dist/esm/_vendor/prop-types/factoryWithThrowingShims.js +74 -0
  88. package/dist/esm/_vendor/prop-types/factoryWithTypeCheckers.js +625 -0
  89. package/dist/esm/_vendor/prop-types/index.js +30 -0
  90. package/dist/esm/_vendor/prop-types/lib/ReactPropTypesSecret.js +21 -0
  91. package/dist/esm/_vendor/prop-types/lib/has.js +11 -0
  92. package/dist/esm/_virtual/_commonjsHelpers.js +5 -0
  93. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
  94. package/dist/esm/_virtual/index.js +3 -0
  95. package/dist/esm/_virtual/index2.js +3 -0
  96. package/dist/esm/_virtual/react-is.development.js +3 -0
  97. package/dist/esm/_virtual/react-is.production.min.js +3 -0
  98. package/dist/esm/charts/index.js +5 -0
  99. package/dist/esm/components/blocks/AppShell.js +205 -0
  100. package/dist/esm/components/blocks/ConfirmDialog.js +57 -0
  101. package/dist/esm/components/blocks/EmptyState.js +44 -0
  102. package/dist/esm/components/blocks/ErrorState.js +53 -0
  103. package/dist/esm/components/blocks/LoadingState.js +134 -0
  104. package/dist/esm/components/blocks/PageHeader.js +51 -0
  105. package/dist/esm/components/blocks/StatCard.js +79 -0
  106. package/dist/esm/components/blocks/StatusPill.js +55 -0
  107. package/dist/esm/components/charts/AreaChart.js +16 -0
  108. package/dist/esm/components/charts/BarChart.js +16 -0
  109. package/dist/esm/components/charts/CartesianChart.js +250 -0
  110. package/dist/esm/components/charts/ChartFrame.js +170 -0
  111. package/dist/esm/components/charts/DonutChart.js +119 -0
  112. package/dist/esm/components/charts/LineChart.js +16 -0
  113. package/dist/esm/components/charts/Sparkline.js +110 -0
  114. package/dist/esm/components/charts/chartTheme.js +109 -0
  115. package/dist/esm/components/core/Accordion.js +260 -0
  116. package/dist/esm/components/core/Button.js +59 -0
  117. package/dist/esm/components/core/Checkbox.js +188 -0
  118. package/dist/esm/components/core/ColorPicker.js +348 -0
  119. package/dist/esm/components/core/DatePicker.js +436 -0
  120. package/dist/esm/components/core/DateRangePicker.js +494 -0
  121. package/dist/esm/components/core/Form.js +522 -0
  122. package/dist/esm/components/core/Input.js +179 -0
  123. package/dist/esm/components/core/Loader.js +141 -0
  124. package/dist/esm/components/core/LocationPicker.js +161 -0
  125. package/dist/esm/components/core/Popover.js +171 -0
  126. package/dist/esm/components/core/PriceRangePicker.js +376 -0
  127. package/dist/esm/components/core/ProgressBar.js +152 -0
  128. package/dist/esm/components/core/Radio.js +156 -0
  129. package/dist/esm/components/core/Rate.js +197 -0
  130. package/dist/esm/components/core/RoundedTag.js +118 -0
  131. package/dist/esm/components/core/Select.js +857 -0
  132. package/dist/esm/components/core/Skeleton.js +100 -0
  133. package/dist/esm/components/core/Slider.js +134 -0
  134. package/dist/esm/components/core/SpeechToText.js +226 -0
  135. package/dist/esm/components/core/Switch.js +207 -0
  136. package/dist/esm/components/core/Table/ActionMenu.js +251 -0
  137. package/dist/esm/components/core/Table/ColumnMenu.js +55 -0
  138. package/dist/esm/components/core/Table/FieldInput.js +157 -0
  139. package/dist/esm/components/core/Table/MobileCard.js +187 -0
  140. package/dist/esm/components/core/Table/MobileFilters.js +72 -0
  141. package/dist/esm/components/core/Table/Pagination.js +157 -0
  142. package/dist/esm/components/core/Table/Table.js +1533 -0
  143. package/dist/esm/components/core/Table/TableRow.js +254 -0
  144. package/dist/esm/components/core/Table/constants.js +35 -0
  145. package/dist/esm/components/core/Table/helpers.js +124 -0
  146. package/dist/esm/components/core/Table/useClickOutside.js +26 -0
  147. package/dist/esm/components/core/Tabs.js +289 -0
  148. package/dist/esm/components/core/TextToSpeech.js +52 -0
  149. package/dist/esm/components/core/Textarea.js +125 -0
  150. package/dist/esm/components/core/ThreeDotPopover.js +160 -0
  151. package/dist/esm/components/core/Tooltip.js +372 -0
  152. package/dist/esm/components/feedback/Alert.js +96 -0
  153. package/dist/esm/components/feedback/Dialog.js +200 -0
  154. package/dist/esm/components/feedback/Drawer.js +171 -0
  155. package/dist/esm/components/feedback/Toast.js +362 -0
  156. package/dist/esm/components/feedback/Tour.js +214 -0
  157. package/dist/esm/components/feedback/TourSpotlight.js +71 -0
  158. package/dist/esm/components/navigation/Breadcrumbs.js +75 -0
  159. package/dist/esm/components/navigation/Dropdown.js +53 -0
  160. package/dist/esm/components/navigation/FootNav.js +51 -0
  161. package/dist/esm/components/navigation/Navbar.js +437 -0
  162. package/dist/esm/components/navigation/Sidebar.js +567 -0
  163. package/dist/esm/components/rich-text/RichTextEditor.js +244 -0
  164. package/dist/esm/components/rich-text/RichTextToolbar.js +397 -0
  165. package/dist/esm/components/utility/Avatar.js +89 -0
  166. package/dist/esm/components/utility/Badge.js +47 -0
  167. package/dist/esm/components/utility/Card.js +85 -0
  168. package/dist/esm/components/utility/Carousel.js +97 -0
  169. package/dist/esm/components/utility/Condition.js +9 -0
  170. package/dist/esm/components/utility/FileUpload.js +177 -0
  171. package/dist/esm/components/utility/Pagination.js +111 -0
  172. package/dist/esm/components/utility/Sortable.js +190 -0
  173. package/dist/esm/components/utility/Stepper.js +101 -0
  174. package/dist/esm/hooks/useApi.js +169 -0
  175. package/dist/esm/hooks/useControllableState.js +32 -0
  176. package/dist/esm/hooks/useFocusTrap.js +85 -0
  177. package/dist/esm/hooks/useLatestRef.js +20 -0
  178. package/dist/esm/hooks/useMixins.js +100 -0
  179. package/dist/esm/hooks/useScrollLock.js +26 -0
  180. package/dist/esm/hooks/useSliderValues.js +135 -0
  181. package/dist/esm/hooks/useSortable.js +188 -0
  182. package/dist/esm/hooks/useTheme.js +53 -0
  183. package/dist/esm/hooks/useTourTarget.js +92 -0
  184. package/dist/esm/index.js +65 -0
  185. package/dist/esm/rich-text/index.js +1 -0
  186. package/dist/esm/store/index.js +26 -0
  187. package/dist/esm/store/store.js +107 -0
  188. package/dist/esm/store/storeSlice.js +45 -0
  189. package/dist/esm/utils/cn.js +11 -0
  190. package/dist/esm/utils/emitter.js +169 -0
  191. package/dist/esm/utils/helpers.js +161 -0
  192. package/dist/esm/utils/position.js +134 -0
  193. package/dist/hooks/useApi.d.ts +2 -1
  194. package/dist/hooks/useApi.d.ts.map +1 -1
  195. package/dist/hooks/useControllableState.d.ts +11 -0
  196. package/dist/hooks/useControllableState.d.ts.map +1 -0
  197. package/dist/hooks/useFocusTrap.d.ts +15 -0
  198. package/dist/hooks/useFocusTrap.d.ts.map +1 -0
  199. package/dist/hooks/useLatestRef.d.ts +8 -0
  200. package/dist/hooks/useLatestRef.d.ts.map +1 -0
  201. package/dist/hooks/useMixins.d.ts.map +1 -1
  202. package/dist/hooks/useScrollLock.d.ts +2 -0
  203. package/dist/hooks/useScrollLock.d.ts.map +1 -0
  204. package/dist/hooks/useSliderValues.d.ts +43 -0
  205. package/dist/hooks/useSliderValues.d.ts.map +1 -0
  206. package/dist/hooks/useSortable.d.ts +32 -0
  207. package/dist/hooks/useSortable.d.ts.map +1 -0
  208. package/dist/hooks/useTheme.d.ts.map +1 -1
  209. package/dist/hooks/useTourTarget.d.ts +15 -0
  210. package/dist/hooks/useTourTarget.d.ts.map +1 -0
  211. package/dist/index.css +1 -1
  212. package/dist/index.d.ts +8 -2
  213. package/dist/index.esm.css +1 -1
  214. package/dist/index.esm.js +4817 -2216
  215. package/dist/index.js +4822 -2214
  216. package/dist/rich-text/index.d.ts +5 -0
  217. package/dist/rich-text/index.d.ts.map +1 -0
  218. package/dist/rich-text/index.js +654 -0
  219. package/dist/tokens/brands/studio.css +14 -0
  220. package/dist/tokens/brands/studio.json +20 -0
  221. package/dist/types/charts.d.ts +97 -0
  222. package/dist/types/charts.d.ts.map +1 -0
  223. package/dist/types/index.d.ts +193 -5
  224. package/dist/types/index.d.ts.map +1 -1
  225. package/dist/types/rich-text.d.ts +50 -0
  226. package/dist/types/rich-text.d.ts.map +1 -0
  227. package/dist/utils/position.d.ts +30 -0
  228. package/dist/utils/position.d.ts.map +1 -0
  229. package/doc/README.md +20 -1
  230. package/mcp/catalog.snapshot.json +2505 -800
  231. package/mcp/server-core.mjs +30 -1
  232. package/package.json +51 -3
  233. package/rich-text/package.json +5 -0
  234. package/tokens/brands/studio.json +20 -0
@@ -0,0 +1,348 @@
1
+ 'use client';
2
+ import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+ import { forwardRef, useMemo, useState } from 'react';
5
+ import { cn } from '../../utils/cn.js';
6
+
7
+ var _excluded = ["value", "defaultValue", "onChange", "swatches", "showAlpha", "size", "disabled", "className", "label", "id"];
8
+ /**
9
+ * ColorPicker.jsx
10
+ * A reusable, accessible, and Tailwind-friendly color picker component (plain JavaScript)
11
+ * - Controlled or uncontrolled
12
+ * - Presets (swatches), hex input, HSL sliders, alpha
13
+ * - No external deps
14
+ *
15
+ * Props:
16
+ * - value // controlled hex / rgba string
17
+ * - defaultValue // uncontrolled initial value
18
+ * - onChange // receives normalized rgba string: `rgba(r,g,b,a)`
19
+ * - swatches // array of hex/rgba strings
20
+ * - showAlpha // boolean
21
+ * - size // "sm" | "md" | "lg"
22
+ * - disabled // boolean
23
+ * - className // string
24
+ * - label // string
25
+ * - id // string
26
+ */
27
+ // ---------- Utilities ----------
28
+ function clamp(n) {
29
+ var a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
30
+ var b = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
31
+ return Math.min(b, Math.max(a, n));
32
+ }
33
+ function hexToRgba(hex) {
34
+ var h = hex.replace(/^#/, "").trim();
35
+ if (!/^[0-9a-fA-F]+$/.test(h)) return null;
36
+ if (h.length === 3) {
37
+ var r = parseInt(h[0] + h[0], 16);
38
+ var g = parseInt(h[1] + h[1], 16);
39
+ var b = parseInt(h[2] + h[2], 16);
40
+ return {
41
+ r: r,
42
+ g: g,
43
+ b: b,
44
+ a: 1
45
+ };
46
+ }
47
+ if (h.length === 4) {
48
+ var _r = parseInt(h[0] + h[0], 16);
49
+ var _g = parseInt(h[1] + h[1], 16);
50
+ var _b = parseInt(h[2] + h[2], 16);
51
+ var a = parseInt(h[3] + h[3], 16) / 255;
52
+ return {
53
+ r: _r,
54
+ g: _g,
55
+ b: _b,
56
+ a: a
57
+ };
58
+ }
59
+ if (h.length === 6) {
60
+ var _r2 = parseInt(h.slice(0, 2), 16);
61
+ var _g2 = parseInt(h.slice(2, 4), 16);
62
+ var _b2 = parseInt(h.slice(4, 6), 16);
63
+ return {
64
+ r: _r2,
65
+ g: _g2,
66
+ b: _b2,
67
+ a: 1
68
+ };
69
+ }
70
+ if (h.length === 8) {
71
+ var _r3 = parseInt(h.slice(0, 2), 16);
72
+ var _g3 = parseInt(h.slice(2, 4), 16);
73
+ var _b3 = parseInt(h.slice(4, 6), 16);
74
+ var _a = parseInt(h.slice(6, 8), 16) / 255;
75
+ return {
76
+ r: _r3,
77
+ g: _g3,
78
+ b: _b3,
79
+ a: _a
80
+ };
81
+ }
82
+ return null;
83
+ }
84
+ function rgbaToHex(_ref) {
85
+ var r = _ref.r,
86
+ g = _ref.g,
87
+ b = _ref.b,
88
+ a = _ref.a;
89
+ var showAlpha = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
90
+ var toHex = function toHex(v) {
91
+ return v.toString(16).padStart(2, "0");
92
+ };
93
+ var includeAlpha = showAlpha && typeof a === "number" && a !== 1;
94
+ var aa = includeAlpha ? Math.round(clamp(a, 0, 1) * 255) : undefined;
95
+ return "#".concat(toHex(r)).concat(toHex(g)).concat(toHex(b)).concat(aa !== undefined ? toHex(aa) : "");
96
+ }
97
+ function parseColor(input) {
98
+ if (!input) return null;
99
+ var s = input.trim();
100
+ if (s.startsWith("#")) return hexToRgba(s);
101
+ var rgbaMatch = s.match(/rgba?\(([^)]+)\)/i);
102
+ if (rgbaMatch) {
103
+ var parts = rgbaMatch[1].split(",").map(function (p) {
104
+ return p.trim();
105
+ });
106
+ var _parts$slice$map = parts.slice(0, 3).map(function (x) {
107
+ return parseInt(x, 10);
108
+ }),
109
+ _parts$slice$map2 = _slicedToArray(_parts$slice$map, 3),
110
+ r = _parts$slice$map2[0],
111
+ g = _parts$slice$map2[1],
112
+ b = _parts$slice$map2[2];
113
+ var a = 1;
114
+ if (parts[3] !== undefined) a = parseFloat(parts[3]);
115
+ return {
116
+ r: r,
117
+ g: g,
118
+ b: b,
119
+ a: a
120
+ };
121
+ }
122
+ return null;
123
+ }
124
+ function rgbaToString(_ref2) {
125
+ var r = _ref2.r,
126
+ g = _ref2.g,
127
+ b = _ref2.b,
128
+ _ref2$a = _ref2.a,
129
+ a = _ref2$a === void 0 ? 1 : _ref2$a;
130
+ if (a === undefined || a === 1) return "rgb(".concat(r, ", ").concat(g, ", ").concat(b, ")");
131
+ return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(+a.toFixed(3), ")");
132
+ }
133
+ // ---------- Component ----------
134
+ var ColorPicker = /*#__PURE__*/forwardRef(function ColorPicker(props, ref) {
135
+ var _internal$a, _internal$a2;
136
+ var value = props.value,
137
+ defaultValue = props.defaultValue,
138
+ onChange = props.onChange,
139
+ _props$swatches = props.swatches,
140
+ swatches = _props$swatches === void 0 ? [] : _props$swatches,
141
+ _props$showAlpha = props.showAlpha,
142
+ showAlpha = _props$showAlpha === void 0 ? false : _props$showAlpha,
143
+ _props$size = props.size,
144
+ size = _props$size === void 0 ? "md" : _props$size,
145
+ _props$disabled = props.disabled,
146
+ disabled = _props$disabled === void 0 ? false : _props$disabled,
147
+ _props$className = props.className,
148
+ className = _props$className === void 0 ? "" : _props$className,
149
+ _props$label = props.label,
150
+ label = _props$label === void 0 ? "Pick a color" : _props$label,
151
+ id = props.id,
152
+ rest = _objectWithoutProperties(props, _excluded);
153
+ var parsedControlled = useMemo(function () {
154
+ return parseColor(value !== null && value !== void 0 ? value : null);
155
+ }, [value]);
156
+ var parsedDefault = useMemo(function () {
157
+ return parseColor(defaultValue !== null && defaultValue !== void 0 ? defaultValue : "#000000");
158
+ }, [defaultValue]);
159
+ var _useState = useState(function () {
160
+ var _ref3;
161
+ return (_ref3 = parsedControlled !== null && parsedControlled !== void 0 ? parsedControlled : parsedDefault) !== null && _ref3 !== void 0 ? _ref3 : {
162
+ r: 0,
163
+ g: 0,
164
+ b: 0,
165
+ a: 1
166
+ };
167
+ }),
168
+ _useState2 = _slicedToArray(_useState, 2),
169
+ internal = _useState2[0],
170
+ setInternal = _useState2[1];
171
+ // Sync from a controlled `value` (adjust-during-render pattern).
172
+ var _useState3 = useState(parsedControlled),
173
+ _useState4 = _slicedToArray(_useState3, 2),
174
+ prevControlled = _useState4[0],
175
+ setPrevControlled = _useState4[1];
176
+ if (parsedControlled !== prevControlled) {
177
+ setPrevControlled(parsedControlled);
178
+ if (parsedControlled) setInternal(parsedControlled);
179
+ }
180
+ function pushChange(next) {
181
+ var n = {
182
+ r: Math.round(clamp(next.r, 0, 255)),
183
+ g: Math.round(clamp(next.g, 0, 255)),
184
+ b: Math.round(clamp(next.b, 0, 255)),
185
+ a: next.a === undefined ? 1 : clamp(next.a, 0, 1)
186
+ };
187
+ if (!value) setInternal(n);
188
+ onChange && onChange(rgbaToString(n));
189
+ }
190
+ var sizeMaps = {
191
+ sm: {
192
+ swatch: "w-6 h-6",
193
+ font: "text-sm",
194
+ gap: "gap-2"
195
+ },
196
+ md: {
197
+ swatch: "w-8 h-8",
198
+ font: "text-sm",
199
+ gap: "gap-3"
200
+ },
201
+ lg: {
202
+ swatch: "w-10 h-10",
203
+ font: "text-base",
204
+ gap: "gap-4"
205
+ }
206
+ };
207
+ // Sizes outside sm/md/lg (the shared `Size` type also lists xs/xl/2xl) fall
208
+ // back to md instead of crashing on an undefined map entry.
209
+ var sizeMap = sizeMaps[size] || sizeMaps.md;
210
+ return jsxs("div", _objectSpread2(_objectSpread2({
211
+ ref: ref,
212
+ className: cn("inline-block", className)
213
+ }, rest), {}, {
214
+ children: [jsx("label", {
215
+ className: "block mb-2 ".concat(sizeMap.font),
216
+ htmlFor: id,
217
+ children: label
218
+ }), jsxs("div", {
219
+ className: "flex ".concat(sizeMap.gap, " items-start flex-col"),
220
+ children: [jsx("div", {
221
+ className: "flex flex-wrap ".concat(sizeMap.gap),
222
+ children: swatches.map(function (s, i) {
223
+ var _parseColor;
224
+ var c = (_parseColor = parseColor(s)) !== null && _parseColor !== void 0 ? _parseColor : {
225
+ r: 0,
226
+ g: 0,
227
+ b: 0,
228
+ a: 1
229
+ };
230
+ return jsx("button", {
231
+ type: "button",
232
+ "aria-label": "Select ".concat(s),
233
+ disabled: disabled,
234
+ onClick: function onClick() {
235
+ return pushChange(c);
236
+ },
237
+ className: "rounded-md border border-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-1 focus:ring-indigo-500 ".concat(sizeMap.swatch, " overflow-hidden"),
238
+ style: {
239
+ background: "rgba(".concat(c.r, ",").concat(c.g, ",").concat(c.b, ",").concat(c.a, ")")
240
+ },
241
+ title: s
242
+ }, i);
243
+ })
244
+ }), jsxs("div", {
245
+ className: "flex-1 min-w-[220px]",
246
+ children: [jsxs("div", {
247
+ className: "flex items-center gap-3",
248
+ children: [jsxs("div", {
249
+ className: "flex items-center gap-2",
250
+ children: [jsx("div", {
251
+ className: "rounded-md border border-gray-200 overflow-hidden w-12 h-12 flex items-center justify-center",
252
+ style: {
253
+ background: "rgba(".concat(internal.r, ", ").concat(internal.g, ", ").concat(internal.b, ", ").concat(internal.a, ")")
254
+ }
255
+ }), jsxs("div", {
256
+ className: "flex flex-col",
257
+ children: [jsx("div", {
258
+ className: "text-xs text-primary-500",
259
+ children: "Current"
260
+ }), jsx("div", {
261
+ className: "font-mono text-sm",
262
+ children: rgbaToHex(internal, showAlpha)
263
+ })]
264
+ })]
265
+ }), jsx("input", {
266
+ type: "color",
267
+ disabled: disabled,
268
+ value: rgbaToHex(internal, false).slice(0, 7),
269
+ onChange: function onChange(e) {
270
+ var parsed = hexToRgba(e.target.value);
271
+ if (parsed) pushChange(_objectSpread2(_objectSpread2({}, parsed), {}, {
272
+ a: internal.a
273
+ }));
274
+ },
275
+ className: "w-10 h-10 p-0 border-none bg-transparent",
276
+ "aria-label": "Native color input"
277
+ }), jsx("div", {
278
+ className: "flex-1",
279
+ children: jsx("input", {
280
+ type: "text",
281
+ disabled: disabled,
282
+ value: showAlpha ? rgbaToString(internal) : rgbaToHex(internal, showAlpha),
283
+ onChange: function onChange(e) {
284
+ var v = e.target.value;
285
+ var p = parseColor(v);
286
+ if (p) pushChange(p);else {
287
+ var maybe = v.startsWith("#") ? v : "#".concat(v);
288
+ var ph = hexToRgba(maybe);
289
+ if (ph) pushChange(_objectSpread2(_objectSpread2({}, ph), {}, {
290
+ a: internal.a
291
+ }));
292
+ }
293
+ },
294
+ className: "w-full rounded-md border border-gray-200 px-2 py-1 font-mono",
295
+ "aria-label": "Color value"
296
+ })
297
+ })]
298
+ }), jsx("div", {
299
+ className: "mt-3 space-y-2",
300
+ children: showAlpha && jsx(Slider, {
301
+ label: "Alpha (".concat(Math.round(((_internal$a = internal.a) !== null && _internal$a !== void 0 ? _internal$a : 1) * 100), "%)"),
302
+ min: 0,
303
+ max: 100,
304
+ value: Math.round(((_internal$a2 = internal.a) !== null && _internal$a2 !== void 0 ? _internal$a2 : 1) * 100),
305
+ onChange: function onChange(v) {
306
+ pushChange(_objectSpread2(_objectSpread2({}, internal), {}, {
307
+ a: clamp(v / 100, 0, 1)
308
+ }));
309
+ },
310
+ disabled: disabled
311
+ })
312
+ })]
313
+ })]
314
+ })]
315
+ }));
316
+ });
317
+ ColorPicker.displayName = "ColorPicker";
318
+ function Slider(_ref4) {
319
+ var label = _ref4.label,
320
+ min = _ref4.min,
321
+ max = _ref4.max,
322
+ value = _ref4.value,
323
+ _onChange = _ref4.onChange,
324
+ disabled = _ref4.disabled;
325
+ return jsxs("div", {
326
+ className: "flex items-center gap-3",
327
+ children: [jsx("div", {
328
+ className: "w-36 text-sm text-primary-600",
329
+ children: label
330
+ }), jsx("input", {
331
+ type: "range",
332
+ min: min,
333
+ max: max,
334
+ value: value,
335
+ disabled: disabled,
336
+ onChange: function onChange(e) {
337
+ return _onChange(Number(e.target.value));
338
+ },
339
+ className: "w-full h-2 rounded-lg appearance-none bg-gray-200",
340
+ "aria-label": label
341
+ }), jsx("div", {
342
+ className: "w-14 text-right font-mono text-sm",
343
+ children: value
344
+ })]
345
+ });
346
+ }
347
+
348
+ export { ColorPicker as default };