@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,53 @@
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 React from 'react';
5
+ import { AlertCircle, RotateCw } from 'lucide-react';
6
+ import { cn } from '../../utils/cn.js';
7
+ import Button from '../core/Button.js';
8
+
9
+ var _excluded = ["title", "description", "onRetry", "retryLabel", "className"];
10
+ // Extracted from CampaignPro/components/app/page-error.tsx (7 products hand-roll one).
11
+ // Neutral copy and a retry; never shows a raw error.message.
12
+ var ErrorState = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
13
+ var _ref$title = _ref.title,
14
+ title = _ref$title === void 0 ? "We couldn't load this" : _ref$title,
15
+ _ref$description = _ref.description,
16
+ description = _ref$description === void 0 ? 'Your data is safe. Try again, and if it keeps happening, contact support.' : _ref$description,
17
+ onRetry = _ref.onRetry,
18
+ _ref$retryLabel = _ref.retryLabel,
19
+ retryLabel = _ref$retryLabel === void 0 ? 'Try again' : _ref$retryLabel,
20
+ className = _ref.className,
21
+ props = _objectWithoutProperties(_ref, _excluded);
22
+ return jsxs("div", _objectSpread2(_objectSpread2({
23
+ ref: ref,
24
+ role: "alert",
25
+ className: cn('flex flex-col items-center justify-center gap-2 px-6 py-12 text-center', className)
26
+ }, props), {}, {
27
+ children: [jsx("span", {
28
+ className: "mb-1 grid h-12 w-12 place-items-center rounded-full bg-error-50 text-error-600",
29
+ "aria-hidden": "true",
30
+ children: jsx(AlertCircle, {
31
+ className: "h-6 w-6"
32
+ })
33
+ }), jsx("h3", {
34
+ className: "text-base font-semibold text-foreground",
35
+ children: title
36
+ }), description && jsx("p", {
37
+ className: "max-w-sm text-sm text-muted",
38
+ children: description
39
+ }), onRetry && jsx(Button, {
40
+ variant: "outline",
41
+ className: "mt-3",
42
+ onClick: onRetry,
43
+ leftIcon: jsx(RotateCw, {
44
+ className: "h-4 w-4",
45
+ "aria-hidden": "true"
46
+ }),
47
+ children: retryLabel
48
+ })]
49
+ }));
50
+ });
51
+ ErrorState.displayName = 'ErrorState';
52
+
53
+ export { ErrorState as default };
@@ -0,0 +1,134 @@
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 React from 'react';
5
+ import { cn } from '../../utils/cn.js';
6
+
7
+ var _excluded = ["variant", "rows", "label", "className"];
8
+ // Extracted from venturepro/client/src/components/States.jsx (6 products hand-roll loaders).
9
+ // A skeleton shaped like the content that replaces it; no page-level spinners.
10
+ // Plain bars rather than twreact Skeleton: Skeleton gives every bar its own role="status" and an
11
+ // inline colour, which would nest live regions inside this one.
12
+ var Bone = function Bone(_ref) {
13
+ var _ref$width = _ref.width,
14
+ width = _ref$width === void 0 ? '100%' : _ref$width,
15
+ _ref$height = _ref.height,
16
+ height = _ref$height === void 0 ? 14 : _ref$height,
17
+ className = _ref.className;
18
+ return jsx("span", {
19
+ "aria-hidden": "true",
20
+ className: cn('block animate-pulse rounded-control bg-gray-200 motion-reduce:animate-none', className),
21
+ style: {
22
+ width: width,
23
+ height: height
24
+ }
25
+ });
26
+ };
27
+ var Line = Bone;
28
+ var shapes = {
29
+ table: function table(rows) {
30
+ return jsx("div", {
31
+ className: "divide-y divide-gray-200",
32
+ children: Array.from({
33
+ length: rows
34
+ }, function (_, i) {
35
+ return jsxs("div", {
36
+ className: "flex items-center gap-4 px-4 py-3",
37
+ children: [jsx(Line, {
38
+ width: "30%"
39
+ }), jsx(Line, {
40
+ width: "20%"
41
+ }), jsx(Line, {
42
+ width: "15%"
43
+ }), jsx(Line, {
44
+ width: "10%"
45
+ })]
46
+ }, i);
47
+ })
48
+ });
49
+ },
50
+ cards: function cards(rows) {
51
+ return jsx("div", {
52
+ className: "grid gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3",
53
+ children: Array.from({
54
+ length: rows
55
+ }, function (_, i) {
56
+ return jsxs("div", {
57
+ className: "flex flex-col gap-3 rounded-card border border-gray-200 p-4",
58
+ children: [jsx(Line, {
59
+ width: "60%",
60
+ height: 16
61
+ }), jsx(Line, {}), jsx(Line, {
62
+ width: "80%"
63
+ })]
64
+ }, i);
65
+ })
66
+ });
67
+ },
68
+ stats: function stats(rows) {
69
+ return jsx("div", {
70
+ className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
71
+ children: Array.from({
72
+ length: rows
73
+ }, function (_, i) {
74
+ return jsxs("div", {
75
+ className: "flex items-center gap-4 rounded-card border border-gray-200 bg-surface p-5",
76
+ children: [jsx(Bone, {
77
+ width: 48,
78
+ height: 48
79
+ }), jsxs("div", {
80
+ className: "flex flex-1 flex-col gap-2",
81
+ children: [jsx(Line, {
82
+ width: "60%"
83
+ }), jsx(Line, {
84
+ width: "40%",
85
+ height: 24
86
+ })]
87
+ })]
88
+ }, i);
89
+ })
90
+ });
91
+ },
92
+ detail: function detail(rows) {
93
+ return jsx("div", {
94
+ className: "grid grid-cols-[minmax(8rem,auto)_1fr] gap-x-6 gap-y-3 p-4",
95
+ children: Array.from({
96
+ length: rows
97
+ }, function (_, i) {
98
+ return jsxs(React.Fragment, {
99
+ children: [jsx(Line, {
100
+ width: "70%"
101
+ }), jsx(Line, {
102
+ width: "".concat(50 + i * 17 % 40, "%")
103
+ })]
104
+ }, i);
105
+ })
106
+ });
107
+ }
108
+ };
109
+ var LoadingState = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
110
+ var _ref2$variant = _ref2.variant,
111
+ variant = _ref2$variant === void 0 ? 'table' : _ref2$variant,
112
+ rows = _ref2.rows,
113
+ _ref2$label = _ref2.label,
114
+ label = _ref2$label === void 0 ? 'Loading…' : _ref2$label,
115
+ className = _ref2.className,
116
+ props = _objectWithoutProperties(_ref2, _excluded);
117
+ var count = rows !== null && rows !== void 0 ? rows : variant === 'stats' ? 4 : variant === 'cards' ? 3 : 5;
118
+ var render = shapes[variant] || shapes.table;
119
+ return jsxs("div", _objectSpread2(_objectSpread2({
120
+ ref: ref,
121
+ role: "status",
122
+ "aria-busy": "true",
123
+ "aria-live": "polite",
124
+ className: cn(className)
125
+ }, props), {}, {
126
+ children: [jsx("span", {
127
+ className: "sr-only",
128
+ children: label
129
+ }), render(count)]
130
+ }));
131
+ });
132
+ LoadingState.displayName = 'LoadingState';
133
+
134
+ export { Bone, LoadingState as default };
@@ -0,0 +1,51 @@
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 React from 'react';
5
+ import { ArrowLeft } from 'lucide-react';
6
+ import { cn } from '../../utils/cn.js';
7
+
8
+ var _excluded = ["title", "subtitle", "actions", "back", "linkAs", "className"];
9
+ // Extracted from taskpro/client/src/features/shared/PageHeader.jsx (31 imports) and the
10
+ // CampaignPro UX guide's page anatomy: one h1, a muted subtitle, actions top right.
11
+ var PageHeader = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
12
+ var title = _ref.title,
13
+ subtitle = _ref.subtitle,
14
+ actions = _ref.actions,
15
+ back = _ref.back,
16
+ _ref$linkAs = _ref.linkAs,
17
+ Link = _ref$linkAs === void 0 ? 'a' : _ref$linkAs,
18
+ className = _ref.className,
19
+ props = _objectWithoutProperties(_ref, _excluded);
20
+ return jsxs("div", _objectSpread2(_objectSpread2({
21
+ ref: ref,
22
+ className: cn('flex flex-col gap-3', className)
23
+ }, props), {}, {
24
+ children: [back && jsxs(Link, {
25
+ href: back.href,
26
+ className: "inline-flex w-fit items-center gap-1.5 rounded-control text-sm text-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2",
27
+ children: [jsx(ArrowLeft, {
28
+ className: "h-4 w-4",
29
+ "aria-hidden": "true"
30
+ }), back.label]
31
+ }), jsxs("div", {
32
+ className: "flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between",
33
+ children: [jsxs("div", {
34
+ className: "min-w-0",
35
+ children: [jsx("h1", {
36
+ className: "text-xl font-semibold tracking-tight text-foreground sm:text-2xl",
37
+ children: title
38
+ }), subtitle && jsx("p", {
39
+ className: "mt-1 max-w-2xl text-sm text-muted",
40
+ children: subtitle
41
+ })]
42
+ }), actions && jsx("div", {
43
+ className: "flex flex-wrap items-center gap-3",
44
+ children: actions
45
+ })]
46
+ })]
47
+ }));
48
+ });
49
+ PageHeader.displayName = 'PageHeader';
50
+
51
+ export { PageHeader as default };
@@ -0,0 +1,79 @@
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 { ArrowUp, ArrowDown } from 'lucide-react';
6
+ import { cn } from '../../utils/cn.js';
7
+ import Card from '../utility/Card.js';
8
+ import { Bone } from './LoadingState.js';
9
+
10
+ var _excluded = ["label", "value", "icon", "tone", "change", "loading", "className"];
11
+ // Extracted from PracticePro/components/ui/StatCard.tsx (28 imports), with tones mapped to the
12
+ // semantic scales instead of product colours. Class names are written out in full so Tailwind keeps them.
13
+ var TONES = {
14
+ primary: 'bg-primary-50 text-primary-600',
15
+ secondary: 'bg-secondary-100 text-secondary-600',
16
+ success: 'bg-success-50 text-success-600',
17
+ warning: 'bg-warning-50 text-warning-600',
18
+ error: 'bg-error-50 text-error-600',
19
+ info: 'bg-info-50 text-info-600'
20
+ };
21
+ var StatCard = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
22
+ var _change$goodWhenUp, _change$unit;
23
+ var label = _ref.label,
24
+ value = _ref.value,
25
+ icon = _ref.icon,
26
+ _ref$tone = _ref.tone,
27
+ tone = _ref$tone === void 0 ? 'primary' : _ref$tone,
28
+ change = _ref.change,
29
+ _ref$loading = _ref.loading,
30
+ loading = _ref$loading === void 0 ? false : _ref$loading,
31
+ className = _ref.className,
32
+ props = _objectWithoutProperties(_ref, _excluded);
33
+ var up = change ? change.value >= 0 : false;
34
+ var good = change ? ((_change$goodWhenUp = change.goodWhenUp) !== null && _change$goodWhenUp !== void 0 ? _change$goodWhenUp : true) === up : false;
35
+ return jsx(Card, _objectSpread2(_objectSpread2({
36
+ ref: ref,
37
+ className: cn('h-full', className)
38
+ }, props), {}, {
39
+ children: jsxs("div", {
40
+ className: "flex items-start gap-4 p-5",
41
+ children: [icon && jsx("span", {
42
+ className: cn('grid h-12 w-12 shrink-0 place-items-center rounded-card', TONES[tone] || TONES.primary),
43
+ "aria-hidden": "true",
44
+ children: icon
45
+ }), jsxs("div", {
46
+ className: "min-w-0",
47
+ children: [jsx("p", {
48
+ className: "text-sm text-muted",
49
+ children: label
50
+ }), loading ? jsx(Bone, {
51
+ height: 32,
52
+ width: 72,
53
+ className: "mt-1"
54
+ }) : jsx("p", {
55
+ className: "mt-0.5 text-2xl font-semibold tracking-tight text-foreground tabular-nums sm:text-3xl",
56
+ children: value
57
+ }), change && !loading && jsxs("p", {
58
+ className: "mt-1 flex items-center gap-1 text-xs text-muted",
59
+ children: [jsxs("span", {
60
+ className: cn('inline-flex items-center gap-0.5 font-semibold', good ? 'text-success-600' : 'text-error-600'),
61
+ children: [up ? jsx(ArrowUp, {
62
+ className: "h-3.5 w-3.5",
63
+ "aria-hidden": "true"
64
+ }) : jsx(ArrowDown, {
65
+ className: "h-3.5 w-3.5",
66
+ "aria-hidden": "true"
67
+ }), jsxs("span", {
68
+ className: "sr-only",
69
+ children: [up ? 'Up' : 'Down', " "]
70
+ }), Math.abs(change.value), (_change$unit = change.unit) !== null && _change$unit !== void 0 ? _change$unit : '%']
71
+ }), change.period]
72
+ })]
73
+ })]
74
+ })
75
+ }));
76
+ });
77
+ StatCard.displayName = 'StatCard';
78
+
79
+ export { StatCard as default };
@@ -0,0 +1,55 @@
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 React from 'react';
5
+ import { cn } from '../../utils/cn.js';
6
+ import Badge from '../utility/Badge.js';
7
+
8
+ var _excluded = ["status", "map", "tone", "icon", "children", "className"];
9
+ // Extracted from billpro/client/src/components/StatusPill.jsx (10 products hand-roll one).
10
+ // One map from domain state to tone + human label; unknown states are humanized, never shown raw.
11
+ var TONE_TO_VARIANT = {
12
+ neutral: 'secondary',
13
+ info: 'primary',
14
+ success: 'success',
15
+ warning: 'warning',
16
+ danger: 'error',
17
+ muted: 'outline',
18
+ // Semantic tones are accepted too.
19
+ primary: 'primary',
20
+ secondary: 'secondary',
21
+ error: 'error'
22
+ };
23
+ var humanizeStatus = function humanizeStatus(status) {
24
+ var words = String(status).replace(/[_-]+/g, ' ').trim().toLowerCase();
25
+ return words.charAt(0).toUpperCase() + words.slice(1);
26
+ };
27
+ var StatusPill = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
28
+ var _ref2;
29
+ var status = _ref.status,
30
+ map = _ref.map,
31
+ tone = _ref.tone,
32
+ icon = _ref.icon,
33
+ children = _ref.children,
34
+ className = _ref.className,
35
+ props = _objectWithoutProperties(_ref, _excluded);
36
+ var entry = status != null && map ? map[status] : undefined;
37
+ var resolvedTone = (entry === null || entry === void 0 ? void 0 : entry.tone) || tone || 'neutral';
38
+ var label = (_ref2 = children !== null && children !== void 0 ? children : entry === null || entry === void 0 ? void 0 : entry.label) !== null && _ref2 !== void 0 ? _ref2 : status != null ? humanizeStatus(status) : null;
39
+ var resolvedIcon = icon !== null && icon !== void 0 ? icon : entry === null || entry === void 0 ? void 0 : entry.icon;
40
+ return jsxs(Badge, _objectSpread2(_objectSpread2({
41
+ ref: ref,
42
+ variant: TONE_TO_VARIANT[resolvedTone] || 'secondary',
43
+ size: "sm",
44
+ className: cn('gap-1.5 whitespace-nowrap', className)
45
+ }, props), {}, {
46
+ children: [resolvedIcon && jsx("span", {
47
+ className: "inline-flex h-3.5 w-3.5 items-center",
48
+ "aria-hidden": "true",
49
+ children: resolvedIcon
50
+ }), label]
51
+ }));
52
+ });
53
+ StatusPill.displayName = 'StatusPill';
54
+
55
+ export { StatusPill as default, humanizeStatus };
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+ import { objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsx } from 'react/jsx-runtime';
4
+ import React from 'react';
5
+ import CartesianChart from './CartesianChart.js';
6
+
7
+ var AreaChart = /*#__PURE__*/React.forwardRef(function (props, ref) {
8
+ return jsx(CartesianChart, _objectSpread2(_objectSpread2({
9
+ ref: ref
10
+ }, props), {}, {
11
+ kind: "area"
12
+ }));
13
+ });
14
+ AreaChart.displayName = "AreaChart";
15
+
16
+ export { AreaChart as default };
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+ import { objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsx } from 'react/jsx-runtime';
4
+ import React from 'react';
5
+ import CartesianChart from './CartesianChart.js';
6
+
7
+ var BarChart = /*#__PURE__*/React.forwardRef(function (props, ref) {
8
+ return jsx(CartesianChart, _objectSpread2(_objectSpread2({
9
+ ref: ref
10
+ }, props), {}, {
11
+ kind: "bar"
12
+ }));
13
+ });
14
+ BarChart.displayName = "BarChart";
15
+
16
+ export { BarChart as default };
@@ -0,0 +1,250 @@
1
+ 'use client';
2
+ import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2, toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+ import React from 'react';
5
+ import { ResponsiveContainer, AreaChart, BarChart, LineChart, CartesianGrid, XAxis, YAxis, Tooltip, Bar, Area, Line } from 'recharts';
6
+ import { ChartFrame, ChartTooltipContent } from './ChartFrame.js';
7
+ import { useChartTheme, useReducedMotion, defaultValueFormatter } from './chartTheme.js';
8
+
9
+ var _excluded = ["kind", "data", "index", "categories", "colors", "valueFormatter", "xAxisFormatter", "height", "showLegend", "showTooltip", "showXAxis", "showYAxis", "showGrid", "yAxisWidth", "curveType", "stacked", "horizontal", "showDots", "connectNulls", "animate", "title", "description", "emptyState", "accessibleTable", "className"];
10
+ var ROOTS = {
11
+ line: LineChart,
12
+ bar: BarChart,
13
+ area: AreaChart
14
+ };
15
+ var TITLES = {
16
+ line: "Line chart",
17
+ bar: "Bar chart",
18
+ area: "Area chart"
19
+ };
20
+ var CURVES = {
21
+ linear: "linear",
22
+ monotone: "monotone",
23
+ step: "step",
24
+ natural: "natural"
25
+ };
26
+ function renderSeries(kind, _ref) {
27
+ var category = _ref.category,
28
+ color = _ref.color,
29
+ curve = _ref.curve,
30
+ stacked = _ref.stacked,
31
+ showDots = _ref.showDots,
32
+ connectNulls = _ref.connectNulls,
33
+ animate = _ref.animate,
34
+ horizontal = _ref.horizontal,
35
+ barRadius = _ref.barRadius;
36
+ var common = {
37
+ dataKey: category,
38
+ name: category,
39
+ isAnimationActive: animate
40
+ };
41
+ if (kind === "bar") {
42
+ var radius = horizontal ? [0, barRadius, barRadius, 0] : [barRadius, barRadius, 0, 0];
43
+ return jsx(Bar, _objectSpread2(_objectSpread2({}, common), {}, {
44
+ fill: color,
45
+ stackId: stacked ? "stack" : undefined,
46
+ radius: stacked ? 0 : radius,
47
+ maxBarSize: 48
48
+ }), category);
49
+ }
50
+ if (kind === "area") {
51
+ return jsx(Area, _objectSpread2(_objectSpread2({}, common), {}, {
52
+ type: curve,
53
+ stroke: color,
54
+ fill: color,
55
+ fillOpacity: stacked ? 0.4 : 0.15,
56
+ strokeWidth: 2,
57
+ stackId: stacked ? "stack" : undefined,
58
+ dot: showDots ? {
59
+ r: 3,
60
+ fill: color,
61
+ strokeWidth: 0
62
+ } : false,
63
+ activeDot: {
64
+ r: 4,
65
+ strokeWidth: 0,
66
+ fill: color
67
+ },
68
+ connectNulls: connectNulls
69
+ }), category);
70
+ }
71
+ return jsx(Line, _objectSpread2(_objectSpread2({}, common), {}, {
72
+ type: curve,
73
+ stroke: color,
74
+ strokeWidth: 2,
75
+ dot: showDots ? {
76
+ r: 3,
77
+ fill: color,
78
+ strokeWidth: 0
79
+ } : false,
80
+ activeDot: {
81
+ r: 4,
82
+ strokeWidth: 0,
83
+ fill: color
84
+ },
85
+ connectNulls: connectNulls
86
+ }), category);
87
+ }
88
+ /** Shared implementation of LineChart / BarChart / AreaChart. */
89
+ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2, ref) {
90
+ var kind = _ref2.kind,
91
+ data = _ref2.data,
92
+ index = _ref2.index,
93
+ _ref2$categories = _ref2.categories,
94
+ categories = _ref2$categories === void 0 ? [] : _ref2$categories,
95
+ colors = _ref2.colors,
96
+ _ref2$valueFormatter = _ref2.valueFormatter,
97
+ valueFormatter = _ref2$valueFormatter === void 0 ? defaultValueFormatter : _ref2$valueFormatter,
98
+ xAxisFormatter = _ref2.xAxisFormatter,
99
+ _ref2$height = _ref2.height,
100
+ height = _ref2$height === void 0 ? 300 : _ref2$height,
101
+ _ref2$showLegend = _ref2.showLegend,
102
+ showLegend = _ref2$showLegend === void 0 ? true : _ref2$showLegend,
103
+ _ref2$showTooltip = _ref2.showTooltip,
104
+ showTooltip = _ref2$showTooltip === void 0 ? true : _ref2$showTooltip,
105
+ _ref2$showXAxis = _ref2.showXAxis,
106
+ showXAxis = _ref2$showXAxis === void 0 ? true : _ref2$showXAxis,
107
+ _ref2$showYAxis = _ref2.showYAxis,
108
+ showYAxis = _ref2$showYAxis === void 0 ? true : _ref2$showYAxis,
109
+ _ref2$showGrid = _ref2.showGrid,
110
+ showGrid = _ref2$showGrid === void 0 ? true : _ref2$showGrid,
111
+ _ref2$yAxisWidth = _ref2.yAxisWidth,
112
+ yAxisWidth = _ref2$yAxisWidth === void 0 ? 48 : _ref2$yAxisWidth,
113
+ _ref2$curveType = _ref2.curveType,
114
+ curveType = _ref2$curveType === void 0 ? "monotone" : _ref2$curveType,
115
+ _ref2$stacked = _ref2.stacked,
116
+ stacked = _ref2$stacked === void 0 ? false : _ref2$stacked,
117
+ _ref2$horizontal = _ref2.horizontal,
118
+ horizontal = _ref2$horizontal === void 0 ? false : _ref2$horizontal,
119
+ _ref2$showDots = _ref2.showDots,
120
+ showDots = _ref2$showDots === void 0 ? false : _ref2$showDots,
121
+ _ref2$connectNulls = _ref2.connectNulls,
122
+ connectNulls = _ref2$connectNulls === void 0 ? false : _ref2$connectNulls,
123
+ _ref2$animate = _ref2.animate,
124
+ animate = _ref2$animate === void 0 ? true : _ref2$animate,
125
+ title = _ref2.title,
126
+ description = _ref2.description,
127
+ emptyState = _ref2.emptyState,
128
+ _ref2$accessibleTable = _ref2.accessibleTable,
129
+ accessibleTable = _ref2$accessibleTable === void 0 ? true : _ref2$accessibleTable,
130
+ className = _ref2.className,
131
+ rest = _objectWithoutProperties(_ref2, _excluded);
132
+ var _useChartTheme = useChartTheme(categories, colors),
133
+ chrome = _useChartTheme.chrome,
134
+ series = _useChartTheme.series;
135
+ var reducedMotion = useReducedMotion();
136
+ var Root = ROOTS[kind];
137
+ var isHorizontalBars = kind === "bar" && horizontal;
138
+ var curve = CURVES[curveType] || "monotone";
139
+ var tick = {
140
+ fill: chrome.axis,
141
+ fontSize: 12
142
+ };
143
+ var formatIndex = xAxisFormatter || function (v) {
144
+ return v == null ? "" : String(v);
145
+ };
146
+ var categoryAxis = {
147
+ dataKey: index,
148
+ tick: tick,
149
+ tickLine: false,
150
+ axisLine: false,
151
+ tickFormatter: xAxisFormatter,
152
+ hide: !showXAxis,
153
+ minTickGap: 8
154
+ };
155
+ var valueAxis = {
156
+ tick: tick,
157
+ tickLine: false,
158
+ axisLine: false,
159
+ tickFormatter: valueFormatter,
160
+ hide: !showYAxis,
161
+ width: yAxisWidth
162
+ };
163
+ return jsx(ChartFrame, _objectSpread2(_objectSpread2({
164
+ ref: ref,
165
+ className: className,
166
+ title: title,
167
+ description: description,
168
+ defaultTitle: TITLES[kind],
169
+ data: data,
170
+ height: height,
171
+ emptyState: emptyState,
172
+ accessibleTable: accessibleTable,
173
+ legend: showLegend ? categories.map(function (c, i) {
174
+ return {
175
+ name: c,
176
+ color: series[i]
177
+ };
178
+ }) : null,
179
+ tableColumns: [{
180
+ key: index,
181
+ label: index,
182
+ format: formatIndex
183
+ }].concat(_toConsumableArray(categories.map(function (c) {
184
+ return {
185
+ key: c,
186
+ label: c,
187
+ format: valueFormatter
188
+ };
189
+ })))
190
+ }, rest), {}, {
191
+ children: jsx(ResponsiveContainer, {
192
+ width: "100%",
193
+ height: "100%",
194
+ minWidth: 0,
195
+ children: jsxs(Root, {
196
+ data: data,
197
+ layout: isHorizontalBars ? "vertical" : "horizontal",
198
+ margin: {
199
+ top: 8,
200
+ right: 8,
201
+ bottom: 0,
202
+ left: 0
203
+ },
204
+ accessibilityLayer: false,
205
+ children: [showGrid && jsx(CartesianGrid, {
206
+ stroke: chrome.grid,
207
+ strokeDasharray: "3 3",
208
+ vertical: isHorizontalBars,
209
+ horizontal: !isHorizontalBars
210
+ }), isHorizontalBars ? jsx(XAxis, _objectSpread2(_objectSpread2({
211
+ type: "number"
212
+ }, valueAxis), {}, {
213
+ hide: !showXAxis,
214
+ width: undefined
215
+ })) : jsx(XAxis, _objectSpread2({}, categoryAxis)), isHorizontalBars ? jsx(YAxis, _objectSpread2(_objectSpread2({
216
+ type: "category"
217
+ }, categoryAxis), {}, {
218
+ hide: !showYAxis,
219
+ width: yAxisWidth,
220
+ interval: 0
221
+ })) : jsx(YAxis, _objectSpread2({}, valueAxis)), showTooltip && jsx(Tooltip, {
222
+ cursor: kind === "bar" ? {
223
+ fill: chrome.grid,
224
+ fillOpacity: 0.4
225
+ } : {
226
+ stroke: chrome.grid
227
+ },
228
+ isAnimationActive: false,
229
+ content: jsx(ChartTooltipContent, {
230
+ valueFormatter: valueFormatter
231
+ })
232
+ }), categories.map(function (category, i) {
233
+ return renderSeries(kind, {
234
+ category: category,
235
+ color: series[i],
236
+ curve: curve,
237
+ stacked: stacked,
238
+ showDots: showDots,
239
+ connectNulls: connectNulls,
240
+ animate: animate && !reducedMotion,
241
+ horizontal: isHorizontalBars,
242
+ barRadius: 4
243
+ });
244
+ })]
245
+ })
246
+ })
247
+ }));
248
+ });
249
+
250
+ export { CartesianChart as default };