@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,260 @@
1
+ 'use client';
2
+ import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2, toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+ import { forwardRef, useState, useRef, useEffect, useLayoutEffect } from 'react';
5
+ import { cn } from '../../utils/cn.js';
6
+ import { useLatestRef } from '../../hooks/useLatestRef.js';
7
+
8
+ var _excluded = ["items", "allowMultiple", "defaultOpenIndexes", "onChange", "className", "headerClassName", "contentClassName", "chevronPosition", "chevronIcon", "bordered", "rounded", "size", "transitionDuration"];
9
+ /**
10
+ * item.leftIcon may be:
11
+ * - ReactNode (e.g. <svg/>)
12
+ * - (index: number, item: any) => ReactNode
13
+ */
14
+ var Accordion = /*#__PURE__*/forwardRef(function Accordion(_ref, ref) {
15
+ var _ref$items = _ref.items,
16
+ items = _ref$items === void 0 ? [] : _ref$items,
17
+ _ref$allowMultiple = _ref.allowMultiple,
18
+ allowMultiple = _ref$allowMultiple === void 0 ? false : _ref$allowMultiple,
19
+ _ref$defaultOpenIndex = _ref.defaultOpenIndexes,
20
+ defaultOpenIndexes = _ref$defaultOpenIndex === void 0 ? [] : _ref$defaultOpenIndex,
21
+ onChange = _ref.onChange,
22
+ _ref$className = _ref.className,
23
+ className = _ref$className === void 0 ? "" : _ref$className,
24
+ _ref$headerClassName = _ref.headerClassName,
25
+ headerClassName = _ref$headerClassName === void 0 ? "" : _ref$headerClassName,
26
+ _ref$contentClassName = _ref.contentClassName,
27
+ contentClassName = _ref$contentClassName === void 0 ? "" : _ref$contentClassName,
28
+ _ref$chevronPosition = _ref.chevronPosition,
29
+ chevronPosition = _ref$chevronPosition === void 0 ? "right" : _ref$chevronPosition,
30
+ _ref$chevronIcon = _ref.chevronIcon,
31
+ chevronIcon = _ref$chevronIcon === void 0 ? null : _ref$chevronIcon,
32
+ _ref$bordered = _ref.bordered,
33
+ bordered = _ref$bordered === void 0 ? true : _ref$bordered,
34
+ _ref$rounded = _ref.rounded,
35
+ rounded = _ref$rounded === void 0 ? "md" : _ref$rounded,
36
+ _ref$size = _ref.size,
37
+ size = _ref$size === void 0 ? "md" : _ref$size,
38
+ _ref$transitionDurati = _ref.transitionDuration,
39
+ transitionDuration = _ref$transitionDurati === void 0 ? 220 : _ref$transitionDurati,
40
+ rest = _objectWithoutProperties(_ref, _excluded);
41
+ var saneDefault = Array.isArray(defaultOpenIndexes) ? defaultOpenIndexes.filter(function (i) {
42
+ return Number.isFinite(i) && i >= 0 && i < items.length;
43
+ }) : [];
44
+ var _useState = useState(saneDefault),
45
+ _useState2 = _slicedToArray(_useState, 2),
46
+ openIndexes = _useState2[0],
47
+ setOpenIndexes = _useState2[1];
48
+ var headerRefs = useRef([]);
49
+ var panelRefs = useRef([]);
50
+ // Drop out-of-range indexes when the item count changes
51
+ // (adjust-during-render pattern).
52
+ var _useState3 = useState(items.length),
53
+ _useState4 = _slicedToArray(_useState3, 2),
54
+ prevItemCount = _useState4[0],
55
+ setPrevItemCount = _useState4[1];
56
+ if (items.length !== prevItemCount) {
57
+ setPrevItemCount(items.length);
58
+ setOpenIndexes(function (prev) {
59
+ return prev.filter(function (i) {
60
+ return i >= 0 && i < items.length;
61
+ });
62
+ });
63
+ }
64
+ var onChangeRef = useLatestRef(onChange);
65
+ useEffect(function () {
66
+ if (typeof onChangeRef.current === "function") onChangeRef.current(openIndexes);
67
+ }, [openIndexes, onChangeRef]);
68
+ // Size panels from their measured content before paint. Done imperatively
69
+ // (not via the style prop) so render never reads refs / the DOM.
70
+ useLayoutEffect(function () {
71
+ panelRefs.current.forEach(function (panelEl, idx) {
72
+ if (!panelEl) return;
73
+ var open = openIndexes.includes(idx);
74
+ panelEl.style.maxHeight = open ? panelEl.scrollHeight + "px" : "0px";
75
+ });
76
+ }, [openIndexes, items]);
77
+ var isOpen = function isOpen(index) {
78
+ return openIndexes.includes(index);
79
+ };
80
+ var toggleIndex = function toggleIndex(index) {
81
+ var _items$index;
82
+ if ((_items$index = items[index]) !== null && _items$index !== void 0 && _items$index.disabled) return;
83
+ setOpenIndexes(function (prev) {
84
+ if (allowMultiple) {
85
+ return prev.includes(index) ? prev.filter(function (i) {
86
+ return i !== index;
87
+ }) : [].concat(_toConsumableArray(prev), [index]);
88
+ } else {
89
+ return prev.includes(index) ? [] : [index];
90
+ }
91
+ });
92
+ };
93
+ var handleHeaderKeyDown = function handleHeaderKeyDown(e, index) {
94
+ var max = items.length - 1;
95
+ if (e.key === "ArrowDown") {
96
+ var _headerRefs$current$n;
97
+ e.preventDefault();
98
+ var next = index === max ? 0 : index + 1;
99
+ (_headerRefs$current$n = headerRefs.current[next]) === null || _headerRefs$current$n === void 0 || _headerRefs$current$n.focus();
100
+ } else if (e.key === "ArrowUp") {
101
+ var _headerRefs$current$p;
102
+ e.preventDefault();
103
+ var prev = index === 0 ? max : index - 1;
104
+ (_headerRefs$current$p = headerRefs.current[prev]) === null || _headerRefs$current$p === void 0 || _headerRefs$current$p.focus();
105
+ } else if (e.key === "Home") {
106
+ var _headerRefs$current$;
107
+ e.preventDefault();
108
+ (_headerRefs$current$ = headerRefs.current[0]) === null || _headerRefs$current$ === void 0 || _headerRefs$current$.focus();
109
+ } else if (e.key === "End") {
110
+ var _headerRefs$current$m;
111
+ e.preventDefault();
112
+ (_headerRefs$current$m = headerRefs.current[max]) === null || _headerRefs$current$m === void 0 || _headerRefs$current$m.focus();
113
+ } else if (e.key === "Enter" || e.key === " ") {
114
+ e.preventDefault();
115
+ toggleIndex(index);
116
+ }
117
+ };
118
+ // header sizes keep vertical padding; content only px (py moved inside inner wrapper)
119
+ var sizeMap = {
120
+ sm: {
121
+ header: "py-2 px-3 text-sm",
122
+ content: "px-3 text-sm"
123
+ },
124
+ md: {
125
+ header: "py-3 px-4 text-base",
126
+ content: "px-4 text-sm"
127
+ },
128
+ lg: {
129
+ header: "py-4 px-5 text-lg",
130
+ content: "px-5 text-base"
131
+ }
132
+ };
133
+ var innerPaddingMap = {
134
+ sm: "py-2",
135
+ md: "py-3",
136
+ lg: "py-4"
137
+ };
138
+ var roundedMap = {
139
+ none: "",
140
+ sm: "rounded-sm",
141
+ md: "rounded-md",
142
+ lg: "rounded-lg",
143
+ xl: "rounded-xl"
144
+ };
145
+ var wrapperClasses = cn(bordered ? "bg-white" : "bg-transparent", bordered ? "divide-y divide-gray-200" : "", roundedMap[rounded] || roundedMap.md, "shadow-sm", className);
146
+ var renderLeftIcon = function renderLeftIcon(item, index) {
147
+ var left = item === null || item === void 0 ? void 0 : item.leftIcon;
148
+ if (!left) return null;
149
+ if (typeof left === "function") {
150
+ try {
151
+ return left(index, item);
152
+ } catch (err) {
153
+ // don't crash the component if the function throws
154
+ // you could also console.error here in dev
155
+ return null;
156
+ }
157
+ }
158
+ return left; // assume ReactNode
159
+ };
160
+ return jsx("div", _objectSpread2(_objectSpread2({
161
+ ref: ref,
162
+ className: wrapperClasses,
163
+ role: "presentation"
164
+ }, rest), {}, {
165
+ children: items.map(function (item, index) {
166
+ var _item$id;
167
+ var id = (_item$id = item.id) !== null && _item$id !== void 0 ? _item$id : index;
168
+ var open = isOpen(index);
169
+ var headerId = "accordion-header-".concat(id);
170
+ var panelId = "accordion-panel-".concat(id);
171
+ var leftIconEl = renderLeftIcon(item, index);
172
+ return jsxs("div", {
173
+ className: "bg-white",
174
+ children: [jsx("h3", {
175
+ children: jsx("button", {
176
+ ref: function ref(el) {
177
+ return headerRefs.current[index] = el;
178
+ },
179
+ id: headerId,
180
+ "aria-controls": panelId,
181
+ "aria-expanded": open,
182
+ disabled: item.disabled,
183
+ onClick: function onClick() {
184
+ return toggleIndex(index);
185
+ },
186
+ onKeyDown: function onKeyDown(e) {
187
+ return handleHeaderKeyDown(e, index);
188
+ },
189
+ type: "button",
190
+ className: "w-full flex items-center ".concat(sizeMap[size].header, " justify-between focus:outline-none focus:ring-2 focus:ring-indigo-500 ").concat(headerClassName, " ").concat(item.disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"),
191
+ children: jsxs("div", {
192
+ className: "flex items-center gap-3 w-full",
193
+ children: [chevronPosition === "left" ? jsx("span", {
194
+ className: "flex-shrink-0 transform transition-transform duration-150 ".concat(open ? "rotate-180" : "rotate-0"),
195
+ children: chevronIcon !== null && chevronIcon !== void 0 ? chevronIcon : jsx("svg", {
196
+ xmlns: "http://www.w3.org/2000/svg",
197
+ className: "h-5 w-5",
198
+ viewBox: "0 0 20 20",
199
+ fill: "currentColor",
200
+ children: jsx("path", {
201
+ fillRule: "evenodd",
202
+ d: "M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.24 4.24a.75.75 0 01-1.06 0L5.21 8.29a.75.75 0 01.02-1.08z",
203
+ clipRule: "evenodd"
204
+ })
205
+ })
206
+ }) : leftIconEl ? jsx("span", {
207
+ className: "flex-shrink-0",
208
+ children: leftIconEl
209
+ }) : null, jsx("div", {
210
+ className: "flex-1 text-left",
211
+ children: jsxs("div", {
212
+ className: "flex items-center gap-2",
213
+ children: [jsx("span", {
214
+ className: "font-medium",
215
+ children: item.title
216
+ }), item.subtitle ? jsx("span", {
217
+ className: "text-primary-500 text-sm",
218
+ children: item.subtitle
219
+ }) : null]
220
+ })
221
+ }), chevronPosition === "right" ? jsx("span", {
222
+ className: "flex-shrink-0 transform transition-transform duration-150 ".concat(open ? "rotate-180" : "rotate-0"),
223
+ children: chevronIcon !== null && chevronIcon !== void 0 ? chevronIcon : jsx("svg", {
224
+ xmlns: "http://www.w3.org/2000/svg",
225
+ className: "h-5 w-5",
226
+ viewBox: "0 0 20 20",
227
+ fill: "currentColor",
228
+ children: jsx("path", {
229
+ fillRule: "evenodd",
230
+ d: "M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.24 4.24a.75.75 0 01-1.06 0L5.21 8.29a.75.75 0 01.02-1.08z",
231
+ clipRule: "evenodd"
232
+ })
233
+ })
234
+ }) : null]
235
+ })
236
+ })
237
+ }), jsx("div", {
238
+ id: panelId,
239
+ role: "region",
240
+ "aria-labelledby": headerId,
241
+ ref: function ref(el) {
242
+ return panelRefs.current[index] = el;
243
+ },
244
+ style: {
245
+ transition: "max-height ".concat(transitionDuration, "ms ease"),
246
+ overflow: "hidden"
247
+ },
248
+ className: "".concat(contentClassName, " ").concat(sizeMap[size].content),
249
+ children: jsx("div", {
250
+ className: "".concat(innerPaddingMap[size]),
251
+ children: item.content
252
+ })
253
+ })]
254
+ }, id);
255
+ })
256
+ }));
257
+ });
258
+ Accordion.displayName = "Accordion";
259
+
260
+ export { Accordion as default };
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+ import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+ import { forwardRef } from 'react';
5
+ import { cn } from '../../utils/cn.js';
6
+ import { Loader2 } from 'lucide-react';
7
+
8
+ var _excluded = ["className", "variant", "size", "disabled", "loading", "children", "leftIcon", "rightIcon", "fullWidth"];
9
+ var Button = /*#__PURE__*/forwardRef(function (_ref, ref) {
10
+ var className = _ref.className,
11
+ _ref$variant = _ref.variant,
12
+ variant = _ref$variant === void 0 ? 'primary' : _ref$variant,
13
+ _ref$size = _ref.size,
14
+ size = _ref$size === void 0 ? 'md' : _ref$size,
15
+ disabled = _ref.disabled,
16
+ loading = _ref.loading,
17
+ children = _ref.children,
18
+ leftIcon = _ref.leftIcon,
19
+ rightIcon = _ref.rightIcon,
20
+ fullWidth = _ref.fullWidth,
21
+ props = _objectWithoutProperties(_ref, _excluded);
22
+ var baseClasses = cn('inline-flex items-center justify-center rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none', {
23
+ // Variants
24
+ 'bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500': variant === 'primary',
25
+ 'bg-secondary-100 text-secondary-900 hover:bg-secondary-200 focus:ring-secondary-500': variant === 'secondary',
26
+ 'bg-transparent border border-gray-300 hover:bg-gray-50 focus:ring-primary-500': variant === 'outline',
27
+ 'bg-transparent text-primary-600 hover:bg-primary-50 focus:ring-primary-500': variant === 'ghost',
28
+ 'bg-error-600 text-white hover:bg-error-700 focus:ring-error-500': variant === 'destructive',
29
+ 'bg-success-600 text-white hover:bg-success-700 focus:ring-success-500': variant === 'success',
30
+ 'bg-warning-600 text-white hover:bg-warning-700 focus:ring-warning-500': variant === 'warning',
31
+ // Sizes — every value of the shared `Size` type gets a real height.
32
+ 'h-7 px-2 text-xs': size === 'xs',
33
+ 'h-8 px-3 text-xs': size === 'sm',
34
+ 'h-10 px-4 text-sm': size === 'md',
35
+ 'h-12 px-6 text-base': size === 'lg',
36
+ 'h-14 px-8 text-lg': size === 'xl',
37
+ 'h-16 px-10 text-xl': size === '2xl',
38
+ // Full width
39
+ 'w-full': fullWidth
40
+ }, className);
41
+ return jsxs("button", _objectSpread2(_objectSpread2({
42
+ ref: ref,
43
+ className: baseClasses,
44
+ disabled: disabled || loading
45
+ }, props), {}, {
46
+ children: [loading && jsx(Loader2, {
47
+ className: "mr-2 h-4 w-4 animate-spin"
48
+ }), !loading && leftIcon && jsx("span", {
49
+ className: "mr-2",
50
+ children: leftIcon
51
+ }), children, !loading && rightIcon && jsx("span", {
52
+ className: "ml-2",
53
+ children: rightIcon
54
+ })]
55
+ }));
56
+ });
57
+ Button.displayName = 'Button';
58
+
59
+ export { Button as default };
@@ -0,0 +1,188 @@
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, useId, useRef, useState, useEffect, useCallback } from 'react';
5
+ import { Check } from 'lucide-react';
6
+
7
+ var _excluded = ["id", "name", "label", "checked", "defaultChecked", "onChange", "disabled", "required", "className", "size", "labelPosition", "value", "ariaLabel", "variant", "indeterminate", "borderColor", "color", "iconClass", "checkedClass", "wrapperProps"];
8
+ var SIZE_CLASSES = {
9
+ sm: {
10
+ box: "h-4 w-4",
11
+ label: "text-sm",
12
+ icon: "w-3 h-3"
13
+ },
14
+ md: {
15
+ box: "h-5 w-5",
16
+ label: "text-sm",
17
+ icon: "w-3.5 h-3.5"
18
+ },
19
+ lg: {
20
+ box: "h-6 w-6",
21
+ label: "text-base",
22
+ icon: "w-4 h-4"
23
+ }
24
+ };
25
+ var COLOR_PRESETS = {
26
+ primary: {
27
+ checked: "peer-checked:bg-primary-600 peer-checked:border-primary-600 peer-checked:text-white",
28
+ ring: "peer-focus:ring-primary-300"
29
+ },
30
+ secondary: {
31
+ checked: "peer-checked:bg-secondary-600 peer-checked:border-secondary-600 peer-checked:text-white",
32
+ ring: "peer-focus:ring-secondary-300"
33
+ },
34
+ success: {
35
+ checked: "peer-checked:bg-success-600 peer-checked:border-success-600 peer-checked:text-white",
36
+ ring: "peer-focus:ring-success-300"
37
+ },
38
+ green: {
39
+ checked: "peer-checked:bg-success-600 peer-checked:border-success-600 peer-checked:text-white",
40
+ ring: "peer-focus:ring-success-300"
41
+ },
42
+ error: {
43
+ checked: "peer-checked:bg-error-600 peer-checked:border-error-600 peer-checked:text-white",
44
+ ring: "peer-focus:ring-error-300"
45
+ },
46
+ danger: {
47
+ checked: "peer-checked:bg-error-600 peer-checked:border-error-600 peer-checked:text-white",
48
+ ring: "peer-focus:ring-error-300"
49
+ },
50
+ red: {
51
+ checked: "peer-checked:bg-error-600 peer-checked:border-error-600 peer-checked:text-white",
52
+ ring: "peer-focus:ring-error-300"
53
+ },
54
+ warning: {
55
+ checked: "peer-checked:bg-warning-600 peer-checked:border-warning-600 peer-checked:text-white",
56
+ ring: "peer-focus:ring-warning-300"
57
+ },
58
+ blue: {
59
+ checked: "peer-checked:bg-blue-600 peer-checked:border-blue-600 peer-checked:text-white",
60
+ ring: "peer-focus:ring-blue-300"
61
+ },
62
+ indigo: {
63
+ checked: "peer-checked:bg-indigo-600 peer-checked:border-indigo-600 peer-checked:text-white",
64
+ ring: "peer-focus:ring-indigo-300"
65
+ },
66
+ purple: {
67
+ checked: "peer-checked:bg-purple-600 peer-checked:border-purple-600 peer-checked:text-white",
68
+ ring: "peer-focus:ring-purple-300"
69
+ }
70
+ };
71
+ var Checkbox = /*#__PURE__*/forwardRef(function (_ref, ref) {
72
+ var id = _ref.id,
73
+ name = _ref.name,
74
+ label = _ref.label,
75
+ checked = _ref.checked,
76
+ defaultChecked = _ref.defaultChecked,
77
+ onChange = _ref.onChange,
78
+ _ref$disabled = _ref.disabled,
79
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
80
+ _ref$required = _ref.required,
81
+ required = _ref$required === void 0 ? false : _ref$required,
82
+ _ref$className = _ref.className,
83
+ className = _ref$className === void 0 ? "" : _ref$className,
84
+ _ref$size = _ref.size,
85
+ size = _ref$size === void 0 ? "md" : _ref$size,
86
+ _ref$labelPosition = _ref.labelPosition,
87
+ labelPosition = _ref$labelPosition === void 0 ? "right" : _ref$labelPosition,
88
+ value = _ref.value,
89
+ ariaLabel = _ref.ariaLabel;
90
+ _ref.variant;
91
+ var _ref$indeterminate = _ref.indeterminate,
92
+ indeterminate = _ref$indeterminate === void 0 ? false : _ref$indeterminate,
93
+ borderColor = _ref.borderColor,
94
+ _ref$color = _ref.color,
95
+ color = _ref$color === void 0 ? "primary" : _ref$color,
96
+ iconClass = _ref.iconClass,
97
+ checkedClass = _ref.checkedClass,
98
+ wrapperProps = _ref.wrapperProps,
99
+ props = _objectWithoutProperties(_ref, _excluded);
100
+ var autoId = useId();
101
+ var inputId = id || "".concat(autoId, "-checkbox");
102
+ var inputRef = useRef(null);
103
+ var isControlled = checked !== undefined;
104
+ var _useState = useState(defaultChecked !== null && defaultChecked !== void 0 ? defaultChecked : false),
105
+ _useState2 = _slicedToArray(_useState, 2),
106
+ internalChecked = _useState2[0],
107
+ setInternalChecked = _useState2[1];
108
+ var currentChecked = isControlled ? checked : internalChecked;
109
+ // expose ref
110
+ useEffect(function () {
111
+ if (!ref) return;
112
+ if (typeof ref === "function") ref(inputRef.current);else ref.current = inputRef.current;
113
+ }, [ref]);
114
+ // indeterminate
115
+ useEffect(function () {
116
+ if (!inputRef.current) return;
117
+ inputRef.current.indeterminate = Boolean(indeterminate);
118
+ }, [indeterminate]);
119
+ var handleChange = useCallback(function (e) {
120
+ if (!isControlled) setInternalChecked(e.target.checked);
121
+ if (typeof onChange === "function") onChange(e);
122
+ }, [isControlled, onChange]);
123
+ var sizeClass = SIZE_CLASSES[size] || SIZE_CLASSES.md;
124
+ var wrapperCls = "inline-flex items-center ".concat(className);
125
+ var boxOuterCls = "relative inline-flex items-center justify-center rounded-sm border transition-shadow ".concat(sizeClass.box, " ").concat(disabled ? "opacity-60 cursor-not-allowed" : "cursor-pointer hover:shadow-sm", " ");
126
+ // Icon classes driven by React state (reliable)
127
+ var iconBase = "pointer-events-none transform transition-all duration-150 ease-out";
128
+ var iconShown = "opacity-100 scale-100";
129
+ var iconHidden = "opacity-0 scale-75";
130
+ var isPreset = COLOR_PRESETS[color];
131
+ var colorClasses = isPreset ? "".concat(isPreset.checked, " peer-focus:ring-2 peer-focus:ring-offset-1 ").concat(isPreset.ring) : "peer-focus:ring-2 peer-focus:ring-offset-1 peer-focus:ring-primary-300";
132
+ var customColorStyle = currentChecked && !isPreset && !checkedClass ? {
133
+ backgroundColor: color,
134
+ borderColor: color,
135
+ color: "#ffffff"
136
+ } : {};
137
+ // The outer box shows its own border unless a checked preset or custom colour paints it.
138
+ var showBoxBorder = !(currentChecked && (isPreset || customColorStyle.borderColor));
139
+ return jsxs("div", _objectSpread2(_objectSpread2({
140
+ className: wrapperCls
141
+ }, wrapperProps !== null && wrapperProps !== void 0 ? wrapperProps : {}), {}, {
142
+ children: [label && labelPosition === "left" && jsx("label", {
143
+ htmlFor: inputId,
144
+ className: "".concat(sizeClass.label, " select-none mr-2"),
145
+ children: label
146
+ }), jsxs("div", {
147
+ className: "".concat(boxOuterCls).concat(!disabled && showBoxBorder && !borderColor ? " border-gray-300" : ""),
148
+ style: disabled || !showBoxBorder || !borderColor ? {} : {
149
+ borderColor: borderColor
150
+ },
151
+ "aria-disabled": disabled,
152
+ children: [jsx("input", _objectSpread2({
153
+ id: inputId,
154
+ ref: inputRef,
155
+ name: name,
156
+ type: "checkbox",
157
+ className: "peer absolute inset-0 m-0 p-0 opacity-0 z-10",
158
+ // ensure we set checked only from the boolean (avoid undefined)
159
+ checked: Boolean(currentChecked),
160
+ onChange: handleChange,
161
+ disabled: disabled,
162
+ required: required,
163
+ value: value,
164
+ "aria-label": ariaLabel,
165
+ "aria-checked": Boolean(currentChecked)
166
+ }, props)), jsx("div", {
167
+ className: "pointer-events-none z-0 flex items-center justify-center rounded-sm w-full h-full transition-colors duration-150 ease-in-out " + "".concat(colorClasses, " ") + "".concat(disabled ? "bg-gray-100 border-gray-400 text-primary-400" : "bg-white border-gray-500", " ").concat(checkedClass ? checkedClass : ""),
168
+ style: currentChecked && checkedClass ? {
169
+ backgroundColor: "",
170
+ borderColor: ""
171
+ } : customColorStyle,
172
+ "aria-hidden": "true",
173
+ children: jsx(Check, {
174
+ className: "".concat(sizeClass.icon, " ").concat(iconBase, " ").concat(currentChecked ? iconShown : iconHidden, " ").concat(iconClass || ""),
175
+ strokeWidth: 2.2,
176
+ "aria-hidden": "true"
177
+ })
178
+ })]
179
+ }), label && labelPosition === "right" && jsx("label", {
180
+ htmlFor: inputId,
181
+ className: "".concat(sizeClass.label, " select-none ml-2"),
182
+ children: label
183
+ })]
184
+ }));
185
+ });
186
+ Checkbox.displayName = "Checkbox";
187
+
188
+ export { Checkbox as default };