@dreamtree-org/twreact-ui 1.2.1 → 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 (215) hide show
  1. package/DESIGN.md +118 -0
  2. package/README.md +231 -44
  3. package/ai-skills/dreamtree-ui.md +98 -12
  4. package/dist/ai-schema.json +452 -17
  5. package/dist/components/blocks/AppShell.d.ts +4 -0
  6. package/dist/components/blocks/AppShell.d.ts.map +1 -0
  7. package/dist/components/blocks/ConfirmDialog.d.ts +4 -0
  8. package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -0
  9. package/dist/components/blocks/EmptyState.d.ts +4 -0
  10. package/dist/components/blocks/EmptyState.d.ts.map +1 -0
  11. package/dist/components/blocks/ErrorState.d.ts +4 -0
  12. package/dist/components/blocks/ErrorState.d.ts.map +1 -0
  13. package/dist/components/blocks/LoadingState.d.ts +9 -0
  14. package/dist/components/blocks/LoadingState.d.ts.map +1 -0
  15. package/dist/components/blocks/PageHeader.d.ts +4 -0
  16. package/dist/components/blocks/PageHeader.d.ts.map +1 -0
  17. package/dist/components/blocks/StatCard.d.ts +4 -0
  18. package/dist/components/blocks/StatCard.d.ts.map +1 -0
  19. package/dist/components/blocks/StatusPill.d.ts +5 -0
  20. package/dist/components/blocks/StatusPill.d.ts.map +1 -0
  21. package/dist/components/core/Accordion.d.ts.map +1 -1
  22. package/dist/components/core/Button.d.ts.map +1 -1
  23. package/dist/components/core/Checkbox.d.ts.map +1 -1
  24. package/dist/components/core/ColorPicker.d.ts.map +1 -1
  25. package/dist/components/core/DatePicker.d.ts.map +1 -1
  26. package/dist/components/core/DateRangePicker.d.ts.map +1 -1
  27. package/dist/components/core/Form.d.ts.map +1 -1
  28. package/dist/components/core/Input.d.ts.map +1 -1
  29. package/dist/components/core/LocationPicker.d.ts.map +1 -1
  30. package/dist/components/core/Popover.d.ts +4 -0
  31. package/dist/components/core/Popover.d.ts.map +1 -0
  32. package/dist/components/core/PriceRangePicker.d.ts.map +1 -1
  33. package/dist/components/core/ProgressBar.d.ts.map +1 -1
  34. package/dist/components/core/Radio.d.ts.map +1 -1
  35. package/dist/components/core/Rate.d.ts.map +1 -1
  36. package/dist/components/core/Select.d.ts.map +1 -1
  37. package/dist/components/core/Skeleton.d.ts.map +1 -1
  38. package/dist/components/core/Slider.d.ts +4 -0
  39. package/dist/components/core/Slider.d.ts.map +1 -0
  40. package/dist/components/core/SpeechToText.d.ts.map +1 -1
  41. package/dist/components/core/Switch.d.ts.map +1 -1
  42. package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
  43. package/dist/components/core/Table/ColumnMenu.d.ts +2 -1
  44. package/dist/components/core/Table/ColumnMenu.d.ts.map +1 -1
  45. package/dist/components/core/Table/MobileCard.d.ts +2 -2
  46. package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
  47. package/dist/components/core/Table/Table.d.ts.map +1 -1
  48. package/dist/components/core/Table/TableRow.d.ts +4 -2
  49. package/dist/components/core/Table/TableRow.d.ts.map +1 -1
  50. package/dist/components/core/Tabs.d.ts.map +1 -1
  51. package/dist/components/core/Textarea.d.ts +4 -0
  52. package/dist/components/core/Textarea.d.ts.map +1 -0
  53. package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
  54. package/dist/components/core/Tooltip.d.ts.map +1 -1
  55. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  56. package/dist/components/feedback/Drawer.d.ts +4 -0
  57. package/dist/components/feedback/Drawer.d.ts.map +1 -0
  58. package/dist/components/feedback/Toast.d.ts +14 -5
  59. package/dist/components/feedback/Toast.d.ts.map +1 -1
  60. package/dist/components/feedback/Tour.d.ts +4 -0
  61. package/dist/components/feedback/Tour.d.ts.map +1 -0
  62. package/dist/components/feedback/TourSpotlight.d.ts +9 -0
  63. package/dist/components/feedback/TourSpotlight.d.ts.map +1 -0
  64. package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
  65. package/dist/components/navigation/FootNav.d.ts.map +1 -1
  66. package/dist/components/navigation/Navbar.d.ts.map +1 -1
  67. package/dist/components/navigation/Sidebar.d.ts +8 -2
  68. package/dist/components/navigation/Sidebar.d.ts.map +1 -1
  69. package/dist/components/utility/Badge.d.ts.map +1 -1
  70. package/dist/components/utility/FileUpload.d.ts.map +1 -1
  71. package/dist/components/utility/Sortable.d.ts +4 -0
  72. package/dist/components/utility/Sortable.d.ts.map +1 -0
  73. package/dist/esm/_vendor/object-assign/index.js +99 -0
  74. package/dist/esm/_vendor/prop-types/_vendor/react-is/cjs/react-is.development.js +190 -0
  75. package/dist/esm/_vendor/prop-types/_vendor/react-is/cjs/react-is.production.min.js +26 -0
  76. package/dist/esm/_vendor/prop-types/_vendor/react-is/index.js +19 -0
  77. package/dist/esm/_vendor/prop-types/checkPropTypes.js +115 -0
  78. package/dist/esm/_vendor/prop-types/factoryWithThrowingShims.js +74 -0
  79. package/dist/esm/_vendor/prop-types/factoryWithTypeCheckers.js +625 -0
  80. package/dist/esm/_vendor/prop-types/index.js +30 -0
  81. package/dist/esm/_vendor/prop-types/lib/ReactPropTypesSecret.js +21 -0
  82. package/dist/esm/_vendor/prop-types/lib/has.js +11 -0
  83. package/dist/esm/_virtual/_commonjsHelpers.js +5 -0
  84. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +329 -0
  85. package/dist/esm/_virtual/index.js +3 -0
  86. package/dist/esm/_virtual/index2.js +3 -0
  87. package/dist/esm/_virtual/react-is.development.js +3 -0
  88. package/dist/esm/_virtual/react-is.production.min.js +3 -0
  89. package/dist/esm/components/blocks/AppShell.js +205 -0
  90. package/dist/esm/components/blocks/ConfirmDialog.js +57 -0
  91. package/dist/esm/components/blocks/EmptyState.js +44 -0
  92. package/dist/esm/components/blocks/ErrorState.js +53 -0
  93. package/dist/esm/components/blocks/LoadingState.js +134 -0
  94. package/dist/esm/components/blocks/PageHeader.js +51 -0
  95. package/dist/esm/components/blocks/StatCard.js +79 -0
  96. package/dist/esm/components/blocks/StatusPill.js +55 -0
  97. package/dist/esm/components/core/Accordion.js +260 -0
  98. package/dist/esm/components/core/Button.js +59 -0
  99. package/dist/esm/components/core/Checkbox.js +188 -0
  100. package/dist/esm/components/core/ColorPicker.js +348 -0
  101. package/dist/esm/components/core/DatePicker.js +436 -0
  102. package/dist/esm/components/core/DateRangePicker.js +494 -0
  103. package/dist/esm/components/core/Form.js +522 -0
  104. package/dist/esm/components/core/Input.js +179 -0
  105. package/dist/esm/components/core/Loader.js +141 -0
  106. package/dist/esm/components/core/LocationPicker.js +161 -0
  107. package/dist/esm/components/core/Popover.js +171 -0
  108. package/dist/esm/components/core/PriceRangePicker.js +376 -0
  109. package/dist/esm/components/core/ProgressBar.js +152 -0
  110. package/dist/esm/components/core/Radio.js +156 -0
  111. package/dist/esm/components/core/Rate.js +197 -0
  112. package/dist/esm/components/core/RoundedTag.js +118 -0
  113. package/dist/esm/components/core/Select.js +857 -0
  114. package/dist/esm/components/core/Skeleton.js +100 -0
  115. package/dist/esm/components/core/Slider.js +134 -0
  116. package/dist/esm/components/core/SpeechToText.js +226 -0
  117. package/dist/esm/components/core/Switch.js +207 -0
  118. package/dist/esm/components/core/Table/ActionMenu.js +251 -0
  119. package/dist/esm/components/core/Table/ColumnMenu.js +55 -0
  120. package/dist/esm/components/core/Table/FieldInput.js +157 -0
  121. package/dist/esm/components/core/Table/MobileCard.js +187 -0
  122. package/dist/esm/components/core/Table/MobileFilters.js +72 -0
  123. package/dist/esm/components/core/Table/Pagination.js +157 -0
  124. package/dist/esm/components/core/Table/Table.js +1533 -0
  125. package/dist/esm/components/core/Table/TableRow.js +254 -0
  126. package/dist/esm/components/core/Table/constants.js +35 -0
  127. package/dist/esm/components/core/Table/helpers.js +124 -0
  128. package/dist/esm/components/core/Table/useClickOutside.js +26 -0
  129. package/dist/esm/components/core/Tabs.js +289 -0
  130. package/dist/esm/components/core/TextToSpeech.js +52 -0
  131. package/dist/esm/components/core/Textarea.js +125 -0
  132. package/dist/esm/components/core/ThreeDotPopover.js +160 -0
  133. package/dist/esm/components/core/Tooltip.js +372 -0
  134. package/dist/esm/components/feedback/Alert.js +96 -0
  135. package/dist/esm/components/feedback/Dialog.js +200 -0
  136. package/dist/esm/components/feedback/Drawer.js +171 -0
  137. package/dist/esm/components/feedback/Toast.js +362 -0
  138. package/dist/esm/components/feedback/Tour.js +214 -0
  139. package/dist/esm/components/feedback/TourSpotlight.js +71 -0
  140. package/dist/esm/components/navigation/Breadcrumbs.js +75 -0
  141. package/dist/esm/components/navigation/Dropdown.js +53 -0
  142. package/dist/esm/components/navigation/FootNav.js +51 -0
  143. package/dist/esm/components/navigation/Navbar.js +437 -0
  144. package/dist/esm/components/navigation/Sidebar.js +567 -0
  145. package/dist/esm/components/utility/Avatar.js +89 -0
  146. package/dist/esm/components/utility/Badge.js +47 -0
  147. package/dist/esm/components/utility/Card.js +85 -0
  148. package/dist/esm/components/utility/Carousel.js +97 -0
  149. package/dist/esm/components/utility/Condition.js +9 -0
  150. package/dist/esm/components/utility/FileUpload.js +177 -0
  151. package/dist/esm/components/utility/Pagination.js +111 -0
  152. package/dist/esm/components/utility/Sortable.js +190 -0
  153. package/dist/esm/components/utility/Stepper.js +101 -0
  154. package/dist/esm/hooks/useApi.js +169 -0
  155. package/dist/esm/hooks/useControllableState.js +32 -0
  156. package/dist/esm/hooks/useFocusTrap.js +85 -0
  157. package/dist/esm/hooks/useLatestRef.js +20 -0
  158. package/dist/esm/hooks/useMixins.js +100 -0
  159. package/dist/esm/hooks/useScrollLock.js +26 -0
  160. package/dist/esm/hooks/useSliderValues.js +135 -0
  161. package/dist/esm/hooks/useSortable.js +188 -0
  162. package/dist/esm/hooks/useTheme.js +53 -0
  163. package/dist/esm/hooks/useTourTarget.js +92 -0
  164. package/dist/esm/index.js +65 -0
  165. package/dist/esm/store/index.js +26 -0
  166. package/dist/esm/store/store.js +107 -0
  167. package/dist/esm/store/storeSlice.js +45 -0
  168. package/dist/esm/utils/cn.js +11 -0
  169. package/dist/esm/utils/emitter.js +169 -0
  170. package/dist/esm/utils/helpers.js +161 -0
  171. package/dist/esm/utils/position.js +134 -0
  172. package/dist/hooks/useApi.d.ts +2 -1
  173. package/dist/hooks/useApi.d.ts.map +1 -1
  174. package/dist/hooks/useControllableState.d.ts +11 -0
  175. package/dist/hooks/useControllableState.d.ts.map +1 -0
  176. package/dist/hooks/useFocusTrap.d.ts +15 -0
  177. package/dist/hooks/useFocusTrap.d.ts.map +1 -0
  178. package/dist/hooks/useLatestRef.d.ts +8 -0
  179. package/dist/hooks/useLatestRef.d.ts.map +1 -0
  180. package/dist/hooks/useMixins.d.ts.map +1 -1
  181. package/dist/hooks/useScrollLock.d.ts +2 -0
  182. package/dist/hooks/useScrollLock.d.ts.map +1 -0
  183. package/dist/hooks/useSliderValues.d.ts +43 -0
  184. package/dist/hooks/useSliderValues.d.ts.map +1 -0
  185. package/dist/hooks/useSortable.d.ts +32 -0
  186. package/dist/hooks/useSortable.d.ts.map +1 -0
  187. package/dist/hooks/useTheme.d.ts.map +1 -1
  188. package/dist/hooks/useTourTarget.d.ts +15 -0
  189. package/dist/hooks/useTourTarget.d.ts.map +1 -0
  190. package/dist/index.css +1 -1
  191. package/dist/index.d.ts +55 -39
  192. package/dist/index.esm.css +1 -1
  193. package/dist/index.esm.js +7937 -4659
  194. package/dist/index.js +7950 -4657
  195. package/dist/tokens/brands/default.css +1 -0
  196. package/dist/tokens/brands/default.json +5 -0
  197. package/dist/tokens/brands/practicepro.css +17 -0
  198. package/dist/tokens/brands/practicepro.json +27 -0
  199. package/dist/tokens/tailwind3-preset.cjs +214 -0
  200. package/dist/tokens/theme.css +193 -0
  201. package/dist/tokens/tokens.json +373 -0
  202. package/dist/tokens/vars.css +98 -0
  203. package/dist/types/blocks.d.ts +109 -0
  204. package/dist/types/blocks.d.ts.map +1 -0
  205. package/dist/types/index.d.ts +194 -5
  206. package/dist/types/index.d.ts.map +1 -1
  207. package/dist/utils/position.d.ts +30 -0
  208. package/dist/utils/position.d.ts.map +1 -0
  209. package/doc/README.md +26 -1
  210. package/mcp/catalog.snapshot.json +1643 -549
  211. package/package.json +24 -6
  212. package/tokens/brands/default.json +5 -0
  213. package/tokens/brands/practicepro.json +27 -0
  214. package/tokens/lib.cjs +128 -0
  215. package/tokens/tokens.json +133 -0
@@ -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 };
@@ -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 };