@dreamtree-org/twreact-ui 1.3.0 → 1.3.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 (184) hide show
  1. package/README.md +179 -10
  2. package/ai-skills/dreamtree-ui.md +71 -12
  3. package/dist/ai-schema.json +452 -17
  4. package/dist/components/core/Accordion.d.ts.map +1 -1
  5. package/dist/components/core/Button.d.ts.map +1 -1
  6. package/dist/components/core/Checkbox.d.ts.map +1 -1
  7. package/dist/components/core/ColorPicker.d.ts.map +1 -1
  8. package/dist/components/core/DatePicker.d.ts.map +1 -1
  9. package/dist/components/core/DateRangePicker.d.ts.map +1 -1
  10. package/dist/components/core/Form.d.ts.map +1 -1
  11. package/dist/components/core/Input.d.ts.map +1 -1
  12. package/dist/components/core/LocationPicker.d.ts.map +1 -1
  13. package/dist/components/core/Popover.d.ts +4 -0
  14. package/dist/components/core/Popover.d.ts.map +1 -0
  15. package/dist/components/core/PriceRangePicker.d.ts.map +1 -1
  16. package/dist/components/core/ProgressBar.d.ts.map +1 -1
  17. package/dist/components/core/Radio.d.ts.map +1 -1
  18. package/dist/components/core/Rate.d.ts.map +1 -1
  19. package/dist/components/core/Select.d.ts.map +1 -1
  20. package/dist/components/core/Skeleton.d.ts.map +1 -1
  21. package/dist/components/core/Slider.d.ts +4 -0
  22. package/dist/components/core/Slider.d.ts.map +1 -0
  23. package/dist/components/core/SpeechToText.d.ts.map +1 -1
  24. package/dist/components/core/Switch.d.ts.map +1 -1
  25. package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
  26. package/dist/components/core/Table/ColumnMenu.d.ts +2 -1
  27. package/dist/components/core/Table/ColumnMenu.d.ts.map +1 -1
  28. package/dist/components/core/Table/MobileCard.d.ts +2 -2
  29. package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
  30. package/dist/components/core/Table/Table.d.ts.map +1 -1
  31. package/dist/components/core/Table/TableRow.d.ts +4 -2
  32. package/dist/components/core/Table/TableRow.d.ts.map +1 -1
  33. package/dist/components/core/Tabs.d.ts.map +1 -1
  34. package/dist/components/core/Textarea.d.ts +4 -0
  35. package/dist/components/core/Textarea.d.ts.map +1 -0
  36. package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
  37. package/dist/components/core/Tooltip.d.ts.map +1 -1
  38. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  39. package/dist/components/feedback/Drawer.d.ts +4 -0
  40. package/dist/components/feedback/Drawer.d.ts.map +1 -0
  41. package/dist/components/feedback/Toast.d.ts +14 -5
  42. package/dist/components/feedback/Toast.d.ts.map +1 -1
  43. package/dist/components/feedback/Tour.d.ts +4 -0
  44. package/dist/components/feedback/Tour.d.ts.map +1 -0
  45. package/dist/components/feedback/TourSpotlight.d.ts +9 -0
  46. package/dist/components/feedback/TourSpotlight.d.ts.map +1 -0
  47. package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
  48. package/dist/components/navigation/FootNav.d.ts.map +1 -1
  49. package/dist/components/navigation/Navbar.d.ts.map +1 -1
  50. package/dist/components/navigation/Sidebar.d.ts +8 -2
  51. package/dist/components/navigation/Sidebar.d.ts.map +1 -1
  52. package/dist/components/utility/Badge.d.ts.map +1 -1
  53. package/dist/components/utility/FileUpload.d.ts.map +1 -1
  54. package/dist/components/utility/Sortable.d.ts +4 -0
  55. package/dist/components/utility/Sortable.d.ts.map +1 -0
  56. package/dist/esm/_vendor/object-assign/index.js +99 -0
  57. package/dist/esm/_vendor/prop-types/_vendor/react-is/cjs/react-is.development.js +190 -0
  58. package/dist/esm/_vendor/prop-types/_vendor/react-is/cjs/react-is.production.min.js +26 -0
  59. package/dist/esm/_vendor/prop-types/_vendor/react-is/index.js +19 -0
  60. package/dist/esm/_vendor/prop-types/checkPropTypes.js +115 -0
  61. package/dist/esm/_vendor/prop-types/factoryWithThrowingShims.js +74 -0
  62. package/dist/esm/_vendor/prop-types/factoryWithTypeCheckers.js +625 -0
  63. package/dist/esm/_vendor/prop-types/index.js +30 -0
  64. package/dist/esm/_vendor/prop-types/lib/ReactPropTypesSecret.js +21 -0
  65. package/dist/esm/_vendor/prop-types/lib/has.js +11 -0
  66. package/dist/esm/_virtual/_commonjsHelpers.js +5 -0
  67. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
  68. package/dist/esm/_virtual/index.js +3 -0
  69. package/dist/esm/_virtual/index2.js +3 -0
  70. package/dist/esm/_virtual/react-is.development.js +3 -0
  71. package/dist/esm/_virtual/react-is.production.min.js +3 -0
  72. package/dist/esm/components/blocks/AppShell.js +205 -0
  73. package/dist/esm/components/blocks/ConfirmDialog.js +57 -0
  74. package/dist/esm/components/blocks/EmptyState.js +44 -0
  75. package/dist/esm/components/blocks/ErrorState.js +53 -0
  76. package/dist/esm/components/blocks/LoadingState.js +134 -0
  77. package/dist/esm/components/blocks/PageHeader.js +51 -0
  78. package/dist/esm/components/blocks/StatCard.js +79 -0
  79. package/dist/esm/components/blocks/StatusPill.js +55 -0
  80. package/dist/esm/components/core/Accordion.js +260 -0
  81. package/dist/esm/components/core/Button.js +59 -0
  82. package/dist/esm/components/core/Checkbox.js +188 -0
  83. package/dist/esm/components/core/ColorPicker.js +348 -0
  84. package/dist/esm/components/core/DatePicker.js +436 -0
  85. package/dist/esm/components/core/DateRangePicker.js +494 -0
  86. package/dist/esm/components/core/Form.js +522 -0
  87. package/dist/esm/components/core/Input.js +179 -0
  88. package/dist/esm/components/core/Loader.js +141 -0
  89. package/dist/esm/components/core/LocationPicker.js +161 -0
  90. package/dist/esm/components/core/Popover.js +171 -0
  91. package/dist/esm/components/core/PriceRangePicker.js +376 -0
  92. package/dist/esm/components/core/ProgressBar.js +152 -0
  93. package/dist/esm/components/core/Radio.js +156 -0
  94. package/dist/esm/components/core/Rate.js +197 -0
  95. package/dist/esm/components/core/RoundedTag.js +118 -0
  96. package/dist/esm/components/core/Select.js +857 -0
  97. package/dist/esm/components/core/Skeleton.js +100 -0
  98. package/dist/esm/components/core/Slider.js +134 -0
  99. package/dist/esm/components/core/SpeechToText.js +226 -0
  100. package/dist/esm/components/core/Switch.js +207 -0
  101. package/dist/esm/components/core/Table/ActionMenu.js +251 -0
  102. package/dist/esm/components/core/Table/ColumnMenu.js +55 -0
  103. package/dist/esm/components/core/Table/FieldInput.js +157 -0
  104. package/dist/esm/components/core/Table/MobileCard.js +187 -0
  105. package/dist/esm/components/core/Table/MobileFilters.js +72 -0
  106. package/dist/esm/components/core/Table/Pagination.js +157 -0
  107. package/dist/esm/components/core/Table/Table.js +1533 -0
  108. package/dist/esm/components/core/Table/TableRow.js +254 -0
  109. package/dist/esm/components/core/Table/constants.js +35 -0
  110. package/dist/esm/components/core/Table/helpers.js +124 -0
  111. package/dist/esm/components/core/Table/useClickOutside.js +26 -0
  112. package/dist/esm/components/core/Tabs.js +289 -0
  113. package/dist/esm/components/core/TextToSpeech.js +52 -0
  114. package/dist/esm/components/core/Textarea.js +125 -0
  115. package/dist/esm/components/core/ThreeDotPopover.js +160 -0
  116. package/dist/esm/components/core/Tooltip.js +372 -0
  117. package/dist/esm/components/feedback/Alert.js +96 -0
  118. package/dist/esm/components/feedback/Dialog.js +200 -0
  119. package/dist/esm/components/feedback/Drawer.js +171 -0
  120. package/dist/esm/components/feedback/Toast.js +362 -0
  121. package/dist/esm/components/feedback/Tour.js +214 -0
  122. package/dist/esm/components/feedback/TourSpotlight.js +71 -0
  123. package/dist/esm/components/navigation/Breadcrumbs.js +75 -0
  124. package/dist/esm/components/navigation/Dropdown.js +53 -0
  125. package/dist/esm/components/navigation/FootNav.js +51 -0
  126. package/dist/esm/components/navigation/Navbar.js +437 -0
  127. package/dist/esm/components/navigation/Sidebar.js +567 -0
  128. package/dist/esm/components/utility/Avatar.js +89 -0
  129. package/dist/esm/components/utility/Badge.js +47 -0
  130. package/dist/esm/components/utility/Card.js +85 -0
  131. package/dist/esm/components/utility/Carousel.js +97 -0
  132. package/dist/esm/components/utility/Condition.js +9 -0
  133. package/dist/esm/components/utility/FileUpload.js +177 -0
  134. package/dist/esm/components/utility/Pagination.js +111 -0
  135. package/dist/esm/components/utility/Sortable.js +190 -0
  136. package/dist/esm/components/utility/Stepper.js +101 -0
  137. package/dist/esm/hooks/useApi.js +169 -0
  138. package/dist/esm/hooks/useControllableState.js +32 -0
  139. package/dist/esm/hooks/useFocusTrap.js +85 -0
  140. package/dist/esm/hooks/useLatestRef.js +20 -0
  141. package/dist/esm/hooks/useMixins.js +100 -0
  142. package/dist/esm/hooks/useScrollLock.js +26 -0
  143. package/dist/esm/hooks/useSliderValues.js +135 -0
  144. package/dist/esm/hooks/useSortable.js +188 -0
  145. package/dist/esm/hooks/useTheme.js +53 -0
  146. package/dist/esm/hooks/useTourTarget.js +92 -0
  147. package/dist/esm/index.js +65 -0
  148. package/dist/esm/store/index.js +26 -0
  149. package/dist/esm/store/store.js +107 -0
  150. package/dist/esm/store/storeSlice.js +45 -0
  151. package/dist/esm/utils/cn.js +11 -0
  152. package/dist/esm/utils/emitter.js +169 -0
  153. package/dist/esm/utils/helpers.js +161 -0
  154. package/dist/esm/utils/position.js +134 -0
  155. package/dist/hooks/useApi.d.ts +2 -1
  156. package/dist/hooks/useApi.d.ts.map +1 -1
  157. package/dist/hooks/useControllableState.d.ts +11 -0
  158. package/dist/hooks/useControllableState.d.ts.map +1 -0
  159. package/dist/hooks/useFocusTrap.d.ts +15 -0
  160. package/dist/hooks/useFocusTrap.d.ts.map +1 -0
  161. package/dist/hooks/useLatestRef.d.ts +8 -0
  162. package/dist/hooks/useLatestRef.d.ts.map +1 -0
  163. package/dist/hooks/useMixins.d.ts.map +1 -1
  164. package/dist/hooks/useScrollLock.d.ts +2 -0
  165. package/dist/hooks/useScrollLock.d.ts.map +1 -0
  166. package/dist/hooks/useSliderValues.d.ts +43 -0
  167. package/dist/hooks/useSliderValues.d.ts.map +1 -0
  168. package/dist/hooks/useSortable.d.ts +32 -0
  169. package/dist/hooks/useSortable.d.ts.map +1 -0
  170. package/dist/hooks/useTheme.d.ts.map +1 -1
  171. package/dist/hooks/useTourTarget.d.ts +15 -0
  172. package/dist/hooks/useTourTarget.d.ts.map +1 -0
  173. package/dist/index.css +1 -1
  174. package/dist/index.d.ts +8 -2
  175. package/dist/index.esm.css +1 -1
  176. package/dist/index.esm.js +4800 -2212
  177. package/dist/index.js +4805 -2210
  178. package/dist/types/index.d.ts +193 -5
  179. package/dist/types/index.d.ts.map +1 -1
  180. package/dist/utils/position.d.ts +30 -0
  181. package/dist/utils/position.d.ts.map +1 -0
  182. package/doc/README.md +7 -1
  183. package/mcp/catalog.snapshot.json +911 -212
  184. package/package.json +14 -2
@@ -0,0 +1,190 @@
1
+ 'use client';
2
+ import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2, slicedToArray as _slicedToArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
4
+ import { forwardRef, useId, useMemo, useState, useRef, useCallback, useLayoutEffect, useEffect } from 'react';
5
+ import { cn } from '../../utils/cn.js';
6
+ import { DEFAULT_SORTABLE_MESSAGES, useSortableKeyboard, useSortablePointer } from '../../hooks/useSortable.js';
7
+
8
+ var _excluded = ["items", "onReorder", "renderItem", "getKey", "getItemLabel", "disabled", "handle", "orientation", "as", "itemClassName", "messages", "className"];
9
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
10
+ var defaultGetKey = function defaultGetKey(item, index) {
11
+ var _ref, _item$id;
12
+ return (_ref = (_item$id = item === null || item === void 0 ? void 0 : item.id) !== null && _item$id !== void 0 ? _item$id : item === null || item === void 0 ? void 0 : item.key) !== null && _ref !== void 0 ? _ref : index;
13
+ };
14
+ var defaultGetItemLabel = function defaultGetItemLabel(item, index) {
15
+ var _ref2, _ref3, _item$label;
16
+ return typeof item === "string" || typeof item === "number" ? String(item) : (_ref2 = (_ref3 = (_item$label = item === null || item === void 0 ? void 0 : item.label) !== null && _item$label !== void 0 ? _item$label : item === null || item === void 0 ? void 0 : item.title) !== null && _ref3 !== void 0 ? _ref3 : item === null || item === void 0 ? void 0 : item.name) !== null && _ref2 !== void 0 ? _ref2 : "Item ".concat(index + 1);
17
+ };
18
+ function arrayMove(list, from, to) {
19
+ var next = list.slice();
20
+ var _next$splice = next.splice(from, 1),
21
+ _next$splice2 = _slicedToArray(_next$splice, 1),
22
+ moved = _next$splice2[0];
23
+ next.splice(to, 0, moved);
24
+ return next;
25
+ }
26
+ var Sortable = /*#__PURE__*/forwardRef(function (_ref4, ref) {
27
+ var _ref4$items = _ref4.items,
28
+ items = _ref4$items === void 0 ? [] : _ref4$items,
29
+ onReorder = _ref4.onReorder,
30
+ renderItem = _ref4.renderItem,
31
+ _ref4$getKey = _ref4.getKey,
32
+ getKey = _ref4$getKey === void 0 ? defaultGetKey : _ref4$getKey,
33
+ _ref4$getItemLabel = _ref4.getItemLabel,
34
+ getItemLabel = _ref4$getItemLabel === void 0 ? defaultGetItemLabel : _ref4$getItemLabel,
35
+ _ref4$disabled = _ref4.disabled,
36
+ disabled = _ref4$disabled === void 0 ? false : _ref4$disabled,
37
+ _ref4$handle = _ref4.handle,
38
+ handle = _ref4$handle === void 0 ? false : _ref4$handle,
39
+ _ref4$orientation = _ref4.orientation,
40
+ orientation = _ref4$orientation === void 0 ? "vertical" : _ref4$orientation,
41
+ _ref4$as = _ref4.as,
42
+ List = _ref4$as === void 0 ? "ul" : _ref4$as,
43
+ itemClassName = _ref4.itemClassName,
44
+ messages = _ref4.messages,
45
+ className = _ref4.className,
46
+ rest = _objectWithoutProperties(_ref4, _excluded);
47
+ var instructionsId = "sortable-instructions-".concat(useId());
48
+ var text = useMemo(function () {
49
+ return _objectSpread2(_objectSpread2({}, DEFAULT_SORTABLE_MESSAGES), messages);
50
+ }, [messages]);
51
+ var axis = orientation === "horizontal" ? "horizontal" : "vertical";
52
+ var _useState = useState(null),
53
+ _useState2 = _slicedToArray(_useState, 2),
54
+ draft = _useState2[0],
55
+ setDraft = _useState2[1];
56
+ var _useState3 = useState(""),
57
+ _useState4 = _slicedToArray(_useState3, 2),
58
+ announcement = _useState4[0],
59
+ setAnnouncement = _useState4[1];
60
+ var nodes = useRef(new Map());
61
+ var itemKeys = items.map(function (item, i) {
62
+ return getKey(item, i);
63
+ });
64
+ var byKey = new Map(itemKeys.map(function (k, i) {
65
+ return [k, {
66
+ item: items[i],
67
+ index: i
68
+ }];
69
+ }));
70
+ var keys = draft && draft.length === itemKeys.length && draft.every(function (k) {
71
+ return byKey.has(k);
72
+ }) ? draft : itemKeys;
73
+ var labelFor = function labelFor(key) {
74
+ var entry = byKey.get(key);
75
+ return entry ? getItemLabel(entry.item, entry.index) : "";
76
+ };
77
+ var announce = function announce(kind) {
78
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
79
+ args[_key - 1] = arguments[_key];
80
+ }
81
+ return setAnnouncement(text[kind].apply(text, args));
82
+ };
83
+ var commit = function commit(from, to) {
84
+ setDraft(null);
85
+ if (from < 0 || from === to) return;
86
+ onReorder === null || onReorder === void 0 || onReorder(arrayMove(items, from, to), {
87
+ from: from,
88
+ to: to
89
+ });
90
+ };
91
+ var nodeFor = useCallback(function (key) {
92
+ return nodes.current.get(key);
93
+ }, []);
94
+ var keyboard = useSortableKeyboard({
95
+ keys: keys,
96
+ setDraft: setDraft,
97
+ commit: commit,
98
+ announce: announce,
99
+ labelFor: labelFor,
100
+ orientation: axis
101
+ });
102
+ var pointer = useSortablePointer({
103
+ keys: keys,
104
+ setDraft: setDraft,
105
+ commit: commit,
106
+ nodeFor: nodeFor,
107
+ orientation: axis,
108
+ disabled: disabled
109
+ });
110
+ // Moving DOM nodes can drop focus; keep it on the item being carried.
111
+ useIsomorphicLayoutEffect(function () {
112
+ var node = keyboard.grabbed !== null ? nodes.current.get(keyboard.grabbed) : null;
113
+ if (node && document.activeElement !== node) node.focus();
114
+ }, [keyboard.grabbed, draft]);
115
+ var moveBy = function moveBy(index, delta) {
116
+ var to = index + delta;
117
+ if (to < 0 || to >= items.length) return;
118
+ onReorder === null || onReorder === void 0 || onReorder(arrayMove(items, index, to), {
119
+ from: index,
120
+ to: to
121
+ });
122
+ setAnnouncement(text.moved(labelFor(itemKeys[index]), to + 1, items.length));
123
+ };
124
+ var isNativeList = List === "ul" || List === "ol";
125
+ var ItemTag = isNativeList ? "li" : "div";
126
+ return jsxs(Fragment, {
127
+ children: [jsx(List, _objectSpread2(_objectSpread2({
128
+ ref: ref,
129
+ className: cn("flex", axis === "horizontal" ? "flex-row gap-2" : "flex-col gap-2", className),
130
+ "data-orientation": axis,
131
+ role: isNativeList ? undefined : "list"
132
+ }, rest), {}, {
133
+ children: keys.map(function (key, index) {
134
+ var _byKey$get = byKey.get(key),
135
+ item = _byKey$get.item,
136
+ originalIndex = _byKey$get.index;
137
+ var isGrabbed = keyboard.grabbed === key;
138
+ var isDragging = pointer.dragging === key;
139
+ var startDrag = disabled ? undefined : pointer.startFor(key);
140
+ return jsx(ItemTag, {
141
+ ref: function ref(node) {
142
+ if (node) nodes.current.set(key, node);else nodes.current["delete"](key);
143
+ },
144
+ tabIndex: disabled ? undefined : 0,
145
+ "aria-roledescription": "sortable item",
146
+ "aria-describedby": disabled ? undefined : instructionsId,
147
+ role: isNativeList ? undefined : "listitem",
148
+ "data-dragging": isDragging || undefined,
149
+ "data-grabbed": isGrabbed || undefined,
150
+ onKeyDown: disabled ? undefined : keyboard.keyDownFor(key),
151
+ onBlur: function onBlur(e) {
152
+ if (isGrabbed && e.relatedTarget && !e.currentTarget.contains(e.relatedTarget)) keyboard.cancel();
153
+ },
154
+ onPointerDown: handle ? undefined : startDrag,
155
+ className: cn("rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:focus:ring-offset-gray-900", !disabled && !handle && "cursor-grab touch-none select-none", (isGrabbed || isDragging) && "relative z-10 shadow-lg ring-2 ring-primary-500 opacity-90", itemClassName),
156
+ children: renderItem ? renderItem(item, {
157
+ index: index,
158
+ originalIndex: originalIndex,
159
+ isDragging: isDragging,
160
+ isGrabbed: isGrabbed,
161
+ handleProps: {
162
+ onPointerDown: startDrag,
163
+ "data-sortable-handle": "",
164
+ className: "cursor-grab touch-none select-none"
165
+ },
166
+ moveUp: function moveUp() {
167
+ return moveBy(originalIndex, -1);
168
+ },
169
+ moveDown: function moveDown() {
170
+ return moveBy(originalIndex, 1);
171
+ }
172
+ }) : labelFor(key)
173
+ }, key);
174
+ })
175
+ })), jsx("span", {
176
+ id: instructionsId,
177
+ className: "sr-only",
178
+ children: text.instructions
179
+ }), jsx("span", {
180
+ role: "status",
181
+ "aria-live": "assertive",
182
+ "aria-atomic": "true",
183
+ className: "sr-only",
184
+ children: announcement
185
+ })]
186
+ });
187
+ });
188
+ Sortable.displayName = "Sortable";
189
+
190
+ export { Sortable as default };
@@ -0,0 +1,101 @@
1
+ 'use client';
2
+ import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+ import React from 'react';
5
+ import { cn } from '../../utils/cn.js';
6
+ import { Check } from 'lucide-react';
7
+
8
+ var _excluded = ["steps", "currentStep", "orientation", "variant", "onStepClick", "className"];
9
+ var Stepper = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
10
+ var _ref$steps = _ref.steps,
11
+ steps = _ref$steps === void 0 ? [] : _ref$steps,
12
+ _ref$currentStep = _ref.currentStep,
13
+ currentStep = _ref$currentStep === void 0 ? 0 : _ref$currentStep,
14
+ _ref$orientation = _ref.orientation,
15
+ orientation = _ref$orientation === void 0 ? 'horizontal' : _ref$orientation;
16
+ _ref.variant;
17
+ var onStepClick = _ref.onStepClick,
18
+ className = _ref.className,
19
+ props = _objectWithoutProperties(_ref, _excluded);
20
+ var getStepStatus = function getStepStatus(stepIndex) {
21
+ if (stepIndex < currentStep) return 'completed';
22
+ if (stepIndex === currentStep) return 'current';
23
+ return 'upcoming';
24
+ };
25
+ var statusColors = {
26
+ completed: {
27
+ circle: 'bg-primary-600 text-white',
28
+ line: 'bg-primary-600',
29
+ text: 'text-primary-600'
30
+ },
31
+ current: {
32
+ circle: 'bg-primary-600 text-white',
33
+ line: 'bg-gray-300',
34
+ text: 'text-primary-600'
35
+ },
36
+ upcoming: {
37
+ circle: 'bg-gray-300 text-primary-500',
38
+ line: 'bg-gray-300',
39
+ text: 'text-primary-500'
40
+ }
41
+ };
42
+ return jsx("nav", _objectSpread2(_objectSpread2({
43
+ ref: ref,
44
+ className: cn('flex', {
45
+ 'flex-col': orientation === 'vertical',
46
+ 'flex-row': orientation === 'horizontal'
47
+ }, className),
48
+ "aria-label": "Progress"
49
+ }, props), {}, {
50
+ children: steps.map(function (step, stepIndex) {
51
+ var status = getStepStatus(stepIndex);
52
+ var isLast = stepIndex === steps.length - 1;
53
+ var colors = statusColors[status];
54
+ return jsxs("div", {
55
+ className: cn('flex items-center', {
56
+ 'flex-col': orientation === 'horizontal',
57
+ 'flex-row': orientation === 'vertical',
58
+ 'mb-8': orientation === 'vertical' && !isLast,
59
+ 'mr-8': orientation === 'horizontal' && !isLast
60
+ }),
61
+ children: [jsxs("div", {
62
+ className: "flex items-center",
63
+ children: [jsx("button", {
64
+ className: cn('flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2', colors.circle, {
65
+ 'cursor-pointer': onStepClick && stepIndex <= currentStep,
66
+ 'cursor-default': !onStepClick || stepIndex > currentStep
67
+ }),
68
+ onClick: function onClick() {
69
+ return onStepClick === null || onStepClick === void 0 ? void 0 : onStepClick(step, stepIndex);
70
+ },
71
+ disabled: !onStepClick || stepIndex > currentStep,
72
+ "aria-current": status === 'current' ? 'step' : undefined,
73
+ children: status === 'completed' ? jsx(Check, {
74
+ className: "h-4 w-4"
75
+ }) : stepIndex + 1
76
+ }), !isLast && jsx("div", {
77
+ className: cn('bg-gray-300', {
78
+ 'h-0.5 w-8': orientation === 'horizontal',
79
+ 'h-8 w-0.5': orientation === 'vertical'
80
+ })
81
+ })]
82
+ }), jsxs("div", {
83
+ className: cn('flex flex-col', {
84
+ 'ml-4': orientation === 'vertical',
85
+ 'mt-2': orientation === 'horizontal'
86
+ }),
87
+ children: [jsx("span", {
88
+ className: cn('text-sm font-medium', colors.text),
89
+ children: step.title
90
+ }), step.description && jsx("span", {
91
+ className: "text-xs text-primary-500",
92
+ children: step.description
93
+ })]
94
+ })]
95
+ }, step.id || stepIndex);
96
+ })
97
+ }));
98
+ });
99
+ Stepper.displayName = 'Stepper';
100
+
101
+ export { Stepper as default };
@@ -0,0 +1,169 @@
1
+ 'use client';
2
+ import { slicedToArray as _slicedToArray, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, toConsumableArray as _toConsumableArray } from '../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { useState } from 'react';
4
+ import axios from 'axios';
5
+
6
+ var useApi = function useApi() {
7
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8
+ var _props$BASE_URL = props.BASE_URL,
9
+ BASE_URL = _props$BASE_URL === void 0 ? null : _props$BASE_URL,
10
+ _props$DEFAULT_HEADER = props.DEFAULT_HEADERS,
11
+ DEFAULT_HEADERS = _props$DEFAULT_HEADER === void 0 ? {} : _props$DEFAULT_HEADER,
12
+ _props$apiMap = props.apiMap,
13
+ apiMap = _props$apiMap === void 0 ? {} : _props$apiMap,
14
+ _props$createRequestI = props.createRequestInstance,
15
+ createRequestInstance = _props$createRequestI === void 0 ? function () {
16
+ var baseURL = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
17
+ var defaultHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18
+ return axios.create({
19
+ baseURL: baseURL || undefined,
20
+ headers: defaultHeaders
21
+ });
22
+ } : _props$createRequestI,
23
+ _props$sendRequest = props.sendRequest,
24
+ sendRequest = _props$sendRequest === void 0 ? function (requestInstance, method, url, data, headers) {
25
+ var methodName = method.toUpperCase();
26
+ if (["GET", "HEAD", "DELETE"].includes(methodName)) {
27
+ return requestInstance.request({
28
+ method: methodName,
29
+ url: url,
30
+ headers: headers
31
+ });
32
+ } else {
33
+ return requestInstance.request({
34
+ method: methodName,
35
+ url: url,
36
+ data: data,
37
+ headers: headers
38
+ });
39
+ }
40
+ } : _props$sendRequest;
41
+ var _useState = useState(null),
42
+ _useState2 = _slicedToArray(_useState, 2),
43
+ data = _useState2[0],
44
+ setData = _useState2[1];
45
+ var _useState3 = useState(null),
46
+ _useState4 = _slicedToArray(_useState3, 2),
47
+ error = _useState4[0],
48
+ setError = _useState4[1];
49
+ var _useState5 = useState(false),
50
+ _useState6 = _slicedToArray(_useState5, 2),
51
+ loading = _useState6[0],
52
+ setLoading = _useState6[1];
53
+ var _useState7 = useState(null),
54
+ _useState8 = _slicedToArray(_useState7, 2),
55
+ lastRequest = _useState8[0],
56
+ setLastRequest = _useState8[1];
57
+ var fetchData = /*#__PURE__*/function () {
58
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(url, method, data, headers) {
59
+ var options,
60
+ _options$needLoading,
61
+ needLoading,
62
+ requestInstance,
63
+ response,
64
+ _error,
65
+ _args = arguments,
66
+ _t;
67
+ return _regenerator().w(function (_context) {
68
+ while (1) switch (_context.p = _context.n) {
69
+ case 0:
70
+ options = _args.length > 4 && _args[4] !== undefined ? _args[4] : {};
71
+ _options$needLoading = options.needLoading, needLoading = _options$needLoading === void 0 ? true : _options$needLoading;
72
+ requestInstance = createRequestInstance(BASE_URL, DEFAULT_HEADERS);
73
+ if (needLoading) setLoading(true);
74
+ _context.p = 1;
75
+ _context.n = 2;
76
+ return sendRequest(requestInstance, method, url, data, headers);
77
+ case 2:
78
+ response = _context.v;
79
+ setData(response.data);
80
+ return _context.a(2, response.data);
81
+ case 3:
82
+ _context.p = 3;
83
+ _t = _context.v;
84
+ _error = _t;
85
+ setError(_error);
86
+ throw _error;
87
+ case 4:
88
+ _context.p = 4;
89
+ if (needLoading) setLoading(false);
90
+ return _context.f(4);
91
+ case 5:
92
+ return _context.a(2);
93
+ }
94
+ }, _callee, null, [[1, 3, 4, 5]]);
95
+ }));
96
+ return function fetchData(_x, _x2, _x3, _x4) {
97
+ return _ref.apply(this, arguments);
98
+ };
99
+ }();
100
+ var callApi = /*#__PURE__*/function () {
101
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(apiKey, args, needLoading) {
102
+ var apiResolve, _apiResolve, url, method, headers, payload;
103
+ return _regenerator().w(function (_context2) {
104
+ while (1) switch (_context2.p = _context2.n) {
105
+ case 0:
106
+ apiResolve = apiMap[apiKey];
107
+ if (apiResolve) {
108
+ _context2.n = 1;
109
+ break;
110
+ }
111
+ throw new Error("API ".concat(apiKey, " not found"));
112
+ case 1:
113
+ _apiResolve = apiResolve.apply(void 0, _toConsumableArray(args)), url = _apiResolve.url, method = _apiResolve.method, headers = _apiResolve.headers, payload = _apiResolve.data;
114
+ _context2.p = 2;
115
+ _context2.n = 3;
116
+ return fetchData(url, method, payload, headers, {
117
+ needLoading: needLoading
118
+ });
119
+ case 3:
120
+ return _context2.a(2, _context2.v);
121
+ case 4:
122
+ _context2.p = 4;
123
+ setLastRequest(apiKey);
124
+ return _context2.f(4);
125
+ case 5:
126
+ return _context2.a(2);
127
+ }
128
+ }, _callee2, null, [[2,, 4, 5]]);
129
+ }));
130
+ return function callApi(_x5, _x6, _x7) {
131
+ return _ref2.apply(this, arguments);
132
+ };
133
+ }();
134
+ /**
135
+ * Resolve `apiMap[apiKey]` with ONE argument (`data`) and send it.
136
+ * For map entries that take several positional arguments
137
+ * (e.g. `(id, data) => ({...})`) use `fetchApiWith` instead.
138
+ */
139
+ var fetchApi = function fetchApi(apiKey, data) {
140
+ var needLoading = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
141
+ return callApi(apiKey, [data], needLoading);
142
+ };
143
+ /**
144
+ * Resolve `apiMap[apiKey]` with every element of `args` spread as
145
+ * positional arguments: `fetchApiWith('updateUser', [id, body])` calls
146
+ * `apiMap.updateUser(id, body)`.
147
+ */
148
+ var fetchApiWith = function fetchApiWith(apiKey) {
149
+ var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
150
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
151
+ if (!Array.isArray(args)) {
152
+ return Promise.reject(new TypeError("useApi: fetchApiWith('".concat(apiKey, "', args) expects args to be an array")));
153
+ }
154
+ var _options$needLoading2 = options.needLoading,
155
+ needLoading = _options$needLoading2 === void 0 ? true : _options$needLoading2;
156
+ return callApi(apiKey, args, needLoading);
157
+ };
158
+ return {
159
+ data: data,
160
+ error: error,
161
+ loading: loading,
162
+ fetchData: fetchData,
163
+ fetchApi: fetchApi,
164
+ fetchApiWith: fetchApiWith,
165
+ lastRequest: lastRequest
166
+ };
167
+ };
168
+
169
+ export { useApi };
@@ -0,0 +1,32 @@
1
+ 'use client';
2
+ import { slicedToArray as _slicedToArray } from '../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { useState, useCallback } from 'react';
4
+ import { useLatestRef } from './useLatestRef.js';
5
+
6
+ /**
7
+ * Internal (not exported). Controlled/uncontrolled state in one place: when
8
+ * `value` is defined the component is controlled and `setValue` only notifies
9
+ * `onChange`; otherwise it also updates internal state.
10
+ */
11
+ function useControllableState(_ref) {
12
+ var value = _ref.value,
13
+ defaultValue = _ref.defaultValue,
14
+ onChange = _ref.onChange;
15
+ var _useState = useState(defaultValue),
16
+ _useState2 = _slicedToArray(_useState, 2),
17
+ internal = _useState2[0],
18
+ setInternal = _useState2[1];
19
+ var isControlled = value !== undefined;
20
+ var onChangeRef = useLatestRef(onChange);
21
+ var setValue = useCallback(function (next) {
22
+ var _onChangeRef$current;
23
+ if (!isControlled) setInternal(next);
24
+ for (var _len = arguments.length, extra = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
25
+ extra[_key - 1] = arguments[_key];
26
+ }
27
+ (_onChangeRef$current = onChangeRef.current) === null || _onChangeRef$current === void 0 || _onChangeRef$current.call.apply(_onChangeRef$current, [onChangeRef, next].concat(extra));
28
+ }, [isControlled, onChangeRef]);
29
+ return [isControlled ? value : internal, setValue];
30
+ }
31
+
32
+ export { useControllableState };
@@ -0,0 +1,85 @@
1
+ 'use client';
2
+ import { useEffect } from 'react';
3
+ import { useLatestRef } from './useLatestRef.js';
4
+
5
+ // Internal (not exported from the package). Shared focus management for the
6
+ // overlay primitives (Drawer, Popover, Tour). Dialog keeps its own copy so its
7
+ // behavior is untouched.
8
+ var FOCUSABLE_SELECTOR = ["a[href]", "button:not([disabled])", "textarea:not([disabled])", "input:not([disabled])", "select:not([disabled])", '[tabindex]:not([tabindex="-1"])'].join(",");
9
+ var getFocusable = function getFocusable(root) {
10
+ return root ? Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR)).filter(function (el) {
11
+ return el.getAttribute("aria-hidden") !== "true";
12
+ }) : [];
13
+ };
14
+ // Only the most recently opened overlay reacts to Escape / Tab, so a Popover
15
+ // opened inside a Drawer closes on its own without also closing the Drawer.
16
+ var layerStack = [];
17
+ var isTopLayer = function isTopLayer(token) {
18
+ return layerStack[layerStack.length - 1] === token;
19
+ };
20
+ function cycleFocus(e, panel) {
21
+ var focusables = getFocusable(panel);
22
+ if (focusables.length === 0) {
23
+ e.preventDefault();
24
+ panel.focus();
25
+ return;
26
+ }
27
+ var first = focusables[0];
28
+ var last = focusables[focusables.length - 1];
29
+ var active = document.activeElement;
30
+ var outside = !panel.contains(active) || active === panel;
31
+ if (e.shiftKey && (active === first || outside)) {
32
+ e.preventDefault();
33
+ last.focus();
34
+ } else if (!e.shiftKey && (active === last || outside)) {
35
+ e.preventDefault();
36
+ first.focus();
37
+ }
38
+ }
39
+ /**
40
+ * Moves focus into `containerRef` while `active`, restores it to the previously
41
+ * focused element afterwards (unless the user moved focus elsewhere), routes
42
+ * Escape to `onEscape`, and — when `trap` — keeps Tab cycling inside.
43
+ */
44
+ function useFocusTrap(containerRef, _ref) {
45
+ var active = _ref.active,
46
+ onEscape = _ref.onEscape,
47
+ _ref$trap = _ref.trap,
48
+ trap = _ref$trap === void 0 ? true : _ref$trap,
49
+ initialFocusRef = _ref.initialFocusRef,
50
+ focusKey = _ref.focusKey;
51
+ var onEscapeRef = useLatestRef(onEscape);
52
+ var initialFocus = useLatestRef(initialFocusRef);
53
+ useEffect(function () {
54
+ if (!active) return undefined;
55
+ var token = {};
56
+ layerStack.push(token);
57
+ var opener = document.activeElement;
58
+ var container = containerRef.current;
59
+ var handleKeyDown = function handleKeyDown(e) {
60
+ var _onEscapeRef$current;
61
+ if (!isTopLayer(token)) return;
62
+ if (e.key === "Escape") (_onEscapeRef$current = onEscapeRef.current) === null || _onEscapeRef$current === void 0 || _onEscapeRef$current.call(onEscapeRef, e);else if (e.key === "Tab" && trap && containerRef.current) cycleFocus(e, containerRef.current);
63
+ };
64
+ document.addEventListener("keydown", handleKeyDown);
65
+ return function () {
66
+ var _opener$focus;
67
+ document.removeEventListener("keydown", handleKeyDown);
68
+ layerStack.splice(layerStack.indexOf(token), 1);
69
+ var now = document.activeElement;
70
+ var focusIsLost = !now || now === document.body || !now.isConnected;
71
+ var focusInside = container === null || container === void 0 ? void 0 : container.contains(now);
72
+ if ((focusIsLost || focusInside) && opener !== null && opener !== void 0 && opener.isConnected) (_opener$focus = opener.focus) === null || _opener$focus === void 0 || _opener$focus.call(opener);
73
+ };
74
+ }, [active, trap, containerRef, onEscapeRef]);
75
+ useEffect(function () {
76
+ var _ref2, _initialFocus$current, _initialFocus$current2, _target$focus;
77
+ if (!active) return;
78
+ var panel = containerRef.current;
79
+ if (!panel) return;
80
+ var target = (_ref2 = (_initialFocus$current = (_initialFocus$current2 = initialFocus.current) === null || _initialFocus$current2 === void 0 ? void 0 : _initialFocus$current2.current) !== null && _initialFocus$current !== void 0 ? _initialFocus$current : getFocusable(panel)[0]) !== null && _ref2 !== void 0 ? _ref2 : panel;
81
+ (_target$focus = target.focus) === null || _target$focus === void 0 || _target$focus.call(target);
82
+ }, [active, focusKey, containerRef, initialFocus]);
83
+ }
84
+
85
+ export { FOCUSABLE_SELECTOR, getFocusable, useFocusTrap };
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ import { useRef, useLayoutEffect, useEffect } from 'react';
3
+
4
+ // useLayoutEffect warns during SSR; fall back to useEffect on the server.
5
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
6
+ /**
7
+ * Internal (not exported from the package): a ref that always holds the latest
8
+ * `value`. Lets an effect call the newest consumer callback (e.g. `onChange`)
9
+ * without listing it as a dependency, so a parent passing an inline function
10
+ * does not re-run the effect on every render.
11
+ */
12
+ function useLatestRef(value) {
13
+ var ref = useRef(value);
14
+ useIsomorphicLayoutEffect(function () {
15
+ ref.current = value;
16
+ });
17
+ return ref;
18
+ }
19
+
20
+ export { useLatestRef };