@dreamtree-org/twreact-ui 1.3.10 → 2.0.0

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 (230) hide show
  1. package/README.md +70 -6
  2. package/ai-skills/dreamtree-ui.md +58 -15
  3. package/codemods/v2.cjs +198 -0
  4. package/dist/ai-schema.json +745 -53
  5. package/dist/charts/index.js +195 -66
  6. package/dist/components/blocks/AppShell.d.ts.map +1 -1
  7. package/dist/components/blocks/BottomActionBar.d.ts +6 -0
  8. package/dist/components/blocks/BottomActionBar.d.ts.map +1 -0
  9. package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -1
  10. package/dist/components/blocks/PageHeader.d.ts.map +1 -1
  11. package/dist/components/charts/CartesianChart.d.ts.map +1 -1
  12. package/dist/components/charts/ChartFrame.d.ts.map +1 -1
  13. package/dist/components/charts/useChartLayout.d.ts +25 -0
  14. package/dist/components/charts/useChartLayout.d.ts.map +1 -0
  15. package/dist/components/core/Button.d.ts.map +1 -1
  16. package/dist/components/core/Checkbox.d.ts.map +1 -1
  17. package/dist/components/core/ColorPicker.d.ts.map +1 -1
  18. package/dist/components/core/DatePicker.d.ts.map +1 -1
  19. package/dist/components/core/DateRangePicker.d.ts.map +1 -1
  20. package/dist/components/core/Form.d.ts.map +1 -1
  21. package/dist/components/core/Input.d.ts.map +1 -1
  22. package/dist/components/core/Loader.d.ts.map +1 -1
  23. package/dist/components/core/LocationPicker.d.ts.map +1 -1
  24. package/dist/components/core/Popover.d.ts.map +1 -1
  25. package/dist/components/core/ProgressBar.d.ts.map +1 -1
  26. package/dist/components/core/Radio.d.ts.map +1 -1
  27. package/dist/components/core/Rate.d.ts.map +1 -1
  28. package/dist/components/core/RoundedTag.d.ts.map +1 -1
  29. package/dist/components/core/SearchField.d.ts +9 -0
  30. package/dist/components/core/SearchField.d.ts.map +1 -0
  31. package/dist/components/core/SegmentedControl.d.ts +8 -0
  32. package/dist/components/core/SegmentedControl.d.ts.map +1 -0
  33. package/dist/components/core/Select.d.ts.map +1 -1
  34. package/dist/components/core/Skeleton.d.ts.map +1 -1
  35. package/dist/components/core/Slider.d.ts.map +1 -1
  36. package/dist/components/core/SpeechToText.d.ts.map +1 -1
  37. package/dist/components/core/SwipeableListItem.d.ts +4 -0
  38. package/dist/components/core/SwipeableListItem.d.ts.map +1 -0
  39. package/dist/components/core/SwipeableListItemGesture.d.ts +58 -0
  40. package/dist/components/core/SwipeableListItemGesture.d.ts.map +1 -0
  41. package/dist/components/core/Switch.d.ts.map +1 -1
  42. package/dist/components/core/Table/ActionMenu.d.ts +10 -3
  43. package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
  44. package/dist/components/core/Table/MobileCard.d.ts +10 -1
  45. package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
  46. package/dist/components/core/Table/MobileFilters.d.ts +8 -2
  47. package/dist/components/core/Table/MobileFilters.d.ts.map +1 -1
  48. package/dist/components/core/Table/Table.d.ts.map +1 -1
  49. package/dist/components/core/Table/TableRow.d.ts +2 -1
  50. package/dist/components/core/Table/TableRow.d.ts.map +1 -1
  51. package/dist/components/core/Tabs.d.ts +5 -8
  52. package/dist/components/core/Tabs.d.ts.map +1 -1
  53. package/dist/components/core/Textarea.d.ts.map +1 -1
  54. package/dist/components/core/ThreeDotPopover.d.ts +10 -22
  55. package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
  56. package/dist/components/core/Tooltip.d.ts +2 -1
  57. package/dist/components/core/Tooltip.d.ts.map +1 -1
  58. package/dist/components/core/internal/Calendar.d.ts +77 -0
  59. package/dist/components/core/internal/Calendar.d.ts.map +1 -0
  60. package/dist/components/core/menu/ActionMenuSurface.d.ts +42 -0
  61. package/dist/components/core/menu/ActionMenuSurface.d.ts.map +1 -0
  62. package/dist/components/core/menu/ActionSheetMenu.d.ts +17 -0
  63. package/dist/components/core/menu/ActionSheetMenu.d.ts.map +1 -0
  64. package/dist/components/core/menu/MenuPopover.d.ts +21 -0
  65. package/dist/components/core/menu/MenuPopover.d.ts.map +1 -0
  66. package/dist/components/core/menu/menuItems.d.ts +21 -0
  67. package/dist/components/core/menu/menuItems.d.ts.map +1 -0
  68. package/dist/components/core/menu/menuKeyboard.d.ts +16 -0
  69. package/dist/components/core/menu/menuKeyboard.d.ts.map +1 -0
  70. package/dist/components/feedback/ActionSheet.d.ts +4 -0
  71. package/dist/components/feedback/ActionSheet.d.ts.map +1 -0
  72. package/dist/components/feedback/Alert.d.ts.map +1 -1
  73. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  74. package/dist/components/feedback/Drawer.d.ts.map +1 -1
  75. package/dist/components/feedback/Sheet.d.ts +4 -0
  76. package/dist/components/feedback/Sheet.d.ts.map +1 -0
  77. package/dist/components/feedback/Toast.d.ts +4 -3
  78. package/dist/components/feedback/Toast.d.ts.map +1 -1
  79. package/dist/components/feedback/ToastItem.d.ts +47 -0
  80. package/dist/components/feedback/ToastItem.d.ts.map +1 -0
  81. package/dist/components/feedback/ToastStack.d.ts +20 -0
  82. package/dist/components/feedback/ToastStack.d.ts.map +1 -0
  83. package/dist/components/feedback/ToastSwipe.d.ts +22 -0
  84. package/dist/components/feedback/ToastSwipe.d.ts.map +1 -0
  85. package/dist/components/feedback/Tour.d.ts.map +1 -1
  86. package/dist/components/feedback/sheetCore.d.ts +30 -0
  87. package/dist/components/feedback/sheetCore.d.ts.map +1 -0
  88. package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
  89. package/dist/components/navigation/FootNav.d.ts.map +1 -1
  90. package/dist/components/navigation/Navbar.d.ts.map +1 -1
  91. package/dist/components/navigation/Sidebar.d.ts +6 -0
  92. package/dist/components/navigation/Sidebar.d.ts.map +1 -1
  93. package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -1
  94. package/dist/components/rich-text/RichTextToolbar.d.ts +6 -2
  95. package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -1
  96. package/dist/components/utility/Avatar.d.ts +8 -0
  97. package/dist/components/utility/Avatar.d.ts.map +1 -1
  98. package/dist/components/utility/AvatarGroup.d.ts +4 -0
  99. package/dist/components/utility/AvatarGroup.d.ts.map +1 -0
  100. package/dist/components/utility/Badge.d.ts.map +1 -1
  101. package/dist/components/utility/Card.d.ts.map +1 -1
  102. package/dist/components/utility/Carousel.d.ts.map +1 -1
  103. package/dist/components/utility/FileUpload.d.ts.map +1 -1
  104. package/dist/components/utility/Pagination.d.ts.map +1 -1
  105. package/dist/components/utility/PullToRefresh.d.ts +5 -0
  106. package/dist/components/utility/PullToRefresh.d.ts.map +1 -0
  107. package/dist/components/utility/Sortable.d.ts.map +1 -1
  108. package/dist/components/utility/Stepper.d.ts.map +1 -1
  109. package/dist/esm/components/blocks/AppShell.js +97 -90
  110. package/dist/esm/components/blocks/BottomActionBar.js +132 -0
  111. package/dist/esm/components/blocks/ConfirmDialog.js +40 -4
  112. package/dist/esm/components/blocks/EmptyState.js +1 -1
  113. package/dist/esm/components/blocks/ErrorState.js +1 -1
  114. package/dist/esm/components/blocks/LoadingState.js +4 -4
  115. package/dist/esm/components/blocks/PageHeader.js +16 -3
  116. package/dist/esm/components/blocks/StatCard.js +6 -6
  117. package/dist/esm/components/blocks/StatusPill.js +5 -8
  118. package/dist/esm/components/charts/CartesianChart.js +85 -62
  119. package/dist/esm/components/charts/ChartFrame.js +12 -5
  120. package/dist/esm/components/charts/useChartLayout.js +105 -0
  121. package/dist/esm/components/core/Button.js +49 -25
  122. package/dist/esm/components/core/Checkbox.js +72 -57
  123. package/dist/esm/components/core/ColorPicker.js +31 -42
  124. package/dist/esm/components/core/DatePicker.js +117 -304
  125. package/dist/esm/components/core/DateRangePicker.js +260 -308
  126. package/dist/esm/components/core/Form.js +11 -2
  127. package/dist/esm/components/core/Input.js +100 -38
  128. package/dist/esm/components/core/Loader.js +30 -44
  129. package/dist/esm/components/core/LocationPicker.js +82 -16
  130. package/dist/esm/components/core/Popover.js +59 -48
  131. package/dist/esm/components/core/ProgressBar.js +40 -72
  132. package/dist/esm/components/core/Radio.js +10 -12
  133. package/dist/esm/components/core/Rate.js +77 -14
  134. package/dist/esm/components/core/RoundedTag.js +5 -5
  135. package/dist/esm/components/core/SearchField.js +311 -0
  136. package/dist/esm/components/core/SegmentedControl.js +189 -0
  137. package/dist/esm/components/core/Select.js +185 -190
  138. package/dist/esm/components/core/Skeleton.js +13 -14
  139. package/dist/esm/components/core/Slider.js +24 -6
  140. package/dist/esm/components/core/SpeechToText.js +68 -16
  141. package/dist/esm/components/core/SwipeableListItem.js +286 -0
  142. package/dist/esm/components/core/SwipeableListItemGesture.js +219 -0
  143. package/dist/esm/components/core/Switch.js +98 -28
  144. package/dist/esm/components/core/Table/ActionMenu.js +45 -231
  145. package/dist/esm/components/core/Table/ColumnMenu.js +1 -1
  146. package/dist/esm/components/core/Table/MobileCard.js +66 -16
  147. package/dist/esm/components/core/Table/MobileFilters.js +181 -10
  148. package/dist/esm/components/core/Table/Table.js +149 -102
  149. package/dist/esm/components/core/Table/TableRow.js +10 -2
  150. package/dist/esm/components/core/Tabs.js +186 -39
  151. package/dist/esm/components/core/Textarea.js +10 -2
  152. package/dist/esm/components/core/ThreeDotPopover.js +93 -99
  153. package/dist/esm/components/core/Tooltip.js +138 -145
  154. package/dist/esm/components/core/internal/Calendar.js +381 -0
  155. package/dist/esm/components/core/menu/ActionMenuSurface.js +110 -0
  156. package/dist/esm/components/core/menu/ActionSheetMenu.js +140 -0
  157. package/dist/esm/components/core/menu/MenuPopover.js +177 -0
  158. package/dist/esm/components/core/menu/menuItems.js +61 -0
  159. package/dist/esm/components/core/menu/menuKeyboard.js +54 -0
  160. package/dist/esm/components/feedback/ActionSheet.js +55 -0
  161. package/dist/esm/components/feedback/Alert.js +63 -53
  162. package/dist/esm/components/feedback/Dialog.js +141 -53
  163. package/dist/esm/components/feedback/Drawer.js +130 -132
  164. package/dist/esm/components/feedback/Sheet.js +125 -0
  165. package/dist/esm/components/feedback/Toast.js +21 -291
  166. package/dist/esm/components/feedback/ToastItem.js +348 -0
  167. package/dist/esm/components/feedback/ToastStack.js +130 -0
  168. package/dist/esm/components/feedback/ToastSwipe.js +52 -0
  169. package/dist/esm/components/feedback/Tour.js +107 -30
  170. package/dist/esm/components/feedback/sheetCore.js +494 -0
  171. package/dist/esm/components/navigation/Breadcrumbs.js +97 -35
  172. package/dist/esm/components/navigation/Dropdown.js +1 -1
  173. package/dist/esm/components/navigation/FootNav.js +102 -13
  174. package/dist/esm/components/navigation/Navbar.js +172 -37
  175. package/dist/esm/components/navigation/Sidebar.js +263 -111
  176. package/dist/esm/components/rich-text/RichTextEditor.js +9 -3
  177. package/dist/esm/components/rich-text/RichTextToolbar.js +29 -9
  178. package/dist/esm/components/utility/Avatar.js +14 -12
  179. package/dist/esm/components/utility/AvatarGroup.js +56 -0
  180. package/dist/esm/components/utility/Badge.js +43 -23
  181. package/dist/esm/components/utility/Card.js +32 -8
  182. package/dist/esm/components/utility/Carousel.js +139 -29
  183. package/dist/esm/components/utility/FileUpload.js +106 -31
  184. package/dist/esm/components/utility/Pagination.js +31 -13
  185. package/dist/esm/components/utility/Portal.js +31 -0
  186. package/dist/esm/components/utility/PullToRefresh.js +229 -0
  187. package/dist/esm/components/utility/Sortable.js +6 -2
  188. package/dist/esm/components/utility/Stepper.js +110 -47
  189. package/dist/esm/hooks/useFloatingPosition.js +82 -0
  190. package/dist/esm/hooks/useHaptics.js +65 -0
  191. package/dist/esm/hooks/usePresence.js +58 -0
  192. package/dist/esm/hooks/usePresentation.js +21 -0
  193. package/dist/esm/hooks/useSheetDrag.js +220 -0
  194. package/dist/esm/hooks/useSliderValues.js +8 -2
  195. package/dist/esm/hooks/useSortable.js +107 -5
  196. package/dist/esm/index.js +14 -2
  197. package/dist/esm/utils/position.js +10 -63
  198. package/dist/esm/utils/touchTarget.js +4 -1
  199. package/dist/hooks/useFloatingPosition.d.ts +8 -4
  200. package/dist/hooks/useFloatingPosition.d.ts.map +1 -1
  201. package/dist/hooks/useHaptics.d.ts +19 -0
  202. package/dist/hooks/useHaptics.d.ts.map +1 -0
  203. package/dist/hooks/useSheetDrag.d.ts +31 -0
  204. package/dist/hooks/useSheetDrag.d.ts.map +1 -0
  205. package/dist/hooks/useSliderValues.d.ts +6 -2
  206. package/dist/hooks/useSliderValues.d.ts.map +1 -1
  207. package/dist/hooks/useSortable.d.ts +11 -1
  208. package/dist/hooks/useSortable.d.ts.map +1 -1
  209. package/dist/index.css +1 -1
  210. package/dist/index.d.ts +11 -2
  211. package/dist/index.esm.css +1 -1
  212. package/dist/index.esm.js +10645 -3842
  213. package/dist/index.js +10657 -3845
  214. package/dist/rich-text/index.js +41 -11
  215. package/dist/types/blocks.d.ts +32 -2
  216. package/dist/types/blocks.d.ts.map +1 -1
  217. package/dist/types/charts.d.ts +3 -1
  218. package/dist/types/charts.d.ts.map +1 -1
  219. package/dist/types/index.d.ts +409 -26
  220. package/dist/types/index.d.ts.map +1 -1
  221. package/dist/types/rich-text.d.ts +5 -0
  222. package/dist/types/rich-text.d.ts.map +1 -1
  223. package/dist/utils/position.d.ts +0 -15
  224. package/dist/utils/position.d.ts.map +1 -1
  225. package/doc/README.md +16 -0
  226. package/mcp/catalog.snapshot.json +1540 -407
  227. package/package.json +7 -2
  228. package/dist/esm/hooks/useSwipeToClose.js +0 -66
  229. package/dist/hooks/useSwipeToClose.d.ts +0 -24
  230. package/dist/hooks/useSwipeToClose.d.ts.map +0 -1
@@ -1,13 +1,20 @@
1
1
  'use client';
2
2
  import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
- import React from 'react';
4
+ import React, { useEffect } from 'react';
5
5
  import Dialog from '../feedback/Dialog.js';
6
6
  import Button from '../core/Button.js';
7
+ import { usePresentation } from '../../hooks/usePresentation.js';
8
+ import { useHaptics } from '../../hooks/useHaptics.js';
9
+ import { useLatestRef } from '../../hooks/useLatestRef.js';
7
10
 
8
- var _excluded = ["isOpen", "title", "description", "confirmLabel", "cancelLabel", "destructive", "loading", "onConfirm", "onCancel", "className"];
11
+ var _excluded = ["isOpen", "title", "description", "confirmLabel", "cancelLabel", "destructive", "loading", "onConfirm", "onCancel", "className", "presentation", "haptics"];
9
12
  // Extracted from firepro/components/ui/confirm-dialog.tsx. Replaces native confirm():
10
13
  // the title asks the question, one line says what happens, the button is named with the verb.
14
+ //
15
+ // Actions keep the DOM (and Tab) order [cancel, confirm]. `flex-col-reverse`
16
+ // shows the confirm button on top when they stack: below `sm` in the centred
17
+ // modal, and always in sheet mode, where both buttons are full width.
11
18
  var ConfirmDialog = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
12
19
  var isOpen = _ref.isOpen,
13
20
  title = _ref.title,
@@ -22,7 +29,33 @@ var ConfirmDialog = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
22
29
  onConfirm = _ref.onConfirm,
23
30
  onCancel = _ref.onCancel,
24
31
  className = _ref.className,
32
+ _ref$presentation = _ref.presentation,
33
+ presentation = _ref$presentation === void 0 ? 'auto' : _ref$presentation,
34
+ _ref$haptics = _ref.haptics,
35
+ haptics = _ref$haptics === void 0 ? false : _ref$haptics,
25
36
  props = _objectWithoutProperties(_ref, _excluded);
37
+ // Resolve once here so the footer layout and the Dialog agree on the mode.
38
+ var resolved = usePresentation(presentation);
39
+ var sheet = resolved === 'sheet';
40
+ // Opt-in haptics: a warning buzz when a destructive confirm opens, a success
41
+ // tick on confirm. Only the open transition fires the warning.
42
+ var _useHaptics = useHaptics({
43
+ enabled: haptics
44
+ }),
45
+ haptic = _useHaptics.trigger;
46
+ var openCue = useLatestRef(function () {
47
+ if (destructive) haptic('warning');
48
+ });
49
+ useEffect(function () {
50
+ if (isOpen) openCue.current();
51
+ }, [isOpen, openCue]);
52
+ var handleConfirm = function handleConfirm() {
53
+ haptic('success');
54
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
55
+ args[_key] = arguments[_key];
56
+ }
57
+ return onConfirm === null || onConfirm === void 0 ? void 0 : onConfirm.apply(void 0, args);
58
+ };
26
59
  return jsx(Dialog, _objectSpread2(_objectSpread2({
27
60
  ref: ref,
28
61
  isOpen: isOpen,
@@ -31,17 +64,20 @@ var ConfirmDialog = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
31
64
  size: "sm",
32
65
  dismissible: !loading,
33
66
  className: className,
67
+ presentation: resolved,
34
68
  footer: jsxs("div", {
35
- className: "flex flex-col-reverse gap-3 sm:flex-row sm:justify-end",
69
+ className: sheet ? 'flex flex-col-reverse gap-3' : 'flex flex-col-reverse gap-3 sm:flex-row sm:justify-end',
36
70
  children: [jsx(Button, {
37
71
  variant: "outline",
38
72
  onClick: onCancel,
39
73
  disabled: loading,
74
+ fullWidth: sheet,
40
75
  children: cancelLabel
41
76
  }), jsx(Button, {
42
77
  variant: destructive ? 'destructive' : 'primary',
43
- onClick: onConfirm,
78
+ onClick: handleConfirm,
44
79
  loading: loading,
80
+ fullWidth: sheet,
45
81
  children: confirmLabel
46
82
  })]
47
83
  })
@@ -22,7 +22,7 @@ var EmptyState = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
22
22
  className: cn('flex flex-col items-center justify-center gap-2 text-center', compact ? 'px-4 py-8' : 'px-6 py-12', className)
23
23
  }, props), {}, {
24
24
  children: [jsx("span", {
25
- className: "mb-1 grid h-12 w-12 place-items-center rounded-full bg-secondary-100 text-muted",
25
+ className: "mb-1 grid h-12 w-12 place-items-center rounded-full bg-secondary-100 text-muted dark:bg-gray-800",
26
26
  "aria-hidden": "true",
27
27
  children: icon || jsx(Inbox, {
28
28
  className: "h-6 w-6"
@@ -25,7 +25,7 @@ var ErrorState = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
25
25
  className: cn('flex flex-col items-center justify-center gap-2 px-6 py-12 text-center', className)
26
26
  }, props), {}, {
27
27
  children: [jsx("span", {
28
- className: "mb-1 grid h-12 w-12 place-items-center rounded-full bg-error-50 text-error-600",
28
+ className: "mb-1 grid h-12 w-12 place-items-center rounded-full bg-error-50 text-error-600 dark:bg-error-900/30 dark:text-error-400",
29
29
  "aria-hidden": "true",
30
30
  children: jsx(AlertCircle, {
31
31
  className: "h-6 w-6"
@@ -17,7 +17,7 @@ var Bone = function Bone(_ref) {
17
17
  className = _ref.className;
18
18
  return jsx("span", {
19
19
  "aria-hidden": "true",
20
- className: cn('block animate-pulse rounded-control bg-gray-200 motion-reduce:animate-none', className),
20
+ className: cn('block animate-pulse rounded-control bg-line motion-reduce:animate-none', className),
21
21
  style: {
22
22
  width: width,
23
23
  height: height
@@ -28,7 +28,7 @@ var Line = Bone;
28
28
  var shapes = {
29
29
  table: function table(rows) {
30
30
  return jsx("div", {
31
- className: "divide-y divide-gray-200",
31
+ className: "divide-y divide-line",
32
32
  children: Array.from({
33
33
  length: rows
34
34
  }, function (_, i) {
@@ -54,7 +54,7 @@ var shapes = {
54
54
  length: rows
55
55
  }, function (_, i) {
56
56
  return jsxs("div", {
57
- className: "flex flex-col gap-3 rounded-card border border-gray-200 p-4",
57
+ className: "flex flex-col gap-3 rounded-card border border-line p-4",
58
58
  children: [jsx(Line, {
59
59
  width: "60%",
60
60
  height: 16
@@ -72,7 +72,7 @@ var shapes = {
72
72
  length: rows
73
73
  }, function (_, i) {
74
74
  return jsxs("div", {
75
- className: "flex items-center gap-4 rounded-card border border-gray-200 bg-surface p-5",
75
+ className: "flex items-center gap-4 rounded-card border border-line bg-surface p-5",
76
76
  children: [jsx(Bone, {
77
77
  width: 48,
78
78
  height: 48
@@ -4,26 +4,35 @@ import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import React from 'react';
5
5
  import { ArrowLeft } from 'lucide-react';
6
6
  import { cn } from '../../utils/cn.js';
7
+ import { TOUCH_TARGET } from '../../utils/touchTarget.js';
8
+ import { usePresentation } from '../../hooks/usePresentation.js';
9
+ import BottomActionBar from './BottomActionBar.js';
7
10
 
8
- var _excluded = ["title", "subtitle", "actions", "back", "linkAs", "className"];
11
+ var _excluded = ["title", "subtitle", "actions", "actionsPlacement", "back", "linkAs", "className"];
9
12
  // Extracted from taskpro/client/src/features/shared/PageHeader.jsx (31 imports) and the
10
13
  // CampaignPro UX guide's page anatomy: one h1, a muted subtitle, actions top right.
14
+ // `actionsPlacement="bottom"` pins the actions in a BottomActionBar on phones (DTUI-52).
11
15
  var PageHeader = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
12
16
  var title = _ref.title,
13
17
  subtitle = _ref.subtitle,
14
18
  actions = _ref.actions,
19
+ _ref$actionsPlacement = _ref.actionsPlacement,
20
+ actionsPlacement = _ref$actionsPlacement === void 0 ? 'inline' : _ref$actionsPlacement,
15
21
  back = _ref.back,
16
22
  _ref$linkAs = _ref.linkAs,
17
23
  Link = _ref$linkAs === void 0 ? 'a' : _ref$linkAs,
18
24
  className = _ref.className,
19
25
  props = _objectWithoutProperties(_ref, _excluded);
26
+ // 'sheet' = coarse pointer at phone width; 'popover' on the server and on desktop.
27
+ var isPhone = usePresentation() === 'sheet';
28
+ var pinned = Boolean(actions) && actionsPlacement === 'bottom' && isPhone;
20
29
  return jsxs("div", _objectSpread2(_objectSpread2({
21
30
  ref: ref,
22
31
  className: cn('flex flex-col gap-3', className)
23
32
  }, props), {}, {
24
33
  children: [back && jsxs(Link, {
25
34
  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",
35
+ className: cn('inline-flex w-fit items-center gap-1.5 rounded-control text-sm text-muted hover:text-foreground', 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2', TOUCH_TARGET),
27
36
  children: [jsx(ArrowLeft, {
28
37
  className: "h-4 w-4",
29
38
  "aria-hidden": "true"
@@ -39,10 +48,14 @@ var PageHeader = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
39
48
  className: "mt-1 max-w-2xl text-sm text-muted",
40
49
  children: subtitle
41
50
  })]
42
- }), actions && jsx("div", {
51
+ }), actions && !pinned && jsx("div", {
43
52
  className: "flex flex-wrap items-center gap-3",
44
53
  children: actions
45
54
  })]
55
+ }), pinned && jsx(BottomActionBar, {
56
+ fullWidth: true,
57
+ "data-page-header-actions": "",
58
+ children: actions
46
59
  })]
47
60
  }));
48
61
  });
@@ -11,12 +11,12 @@ var _excluded = ["label", "value", "icon", "tone", "change", "loading", "classNa
11
11
  // Extracted from PracticePro/components/ui/StatCard.tsx (28 imports), with tones mapped to the
12
12
  // semantic scales instead of product colours. Class names are written out in full so Tailwind keeps them.
13
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'
14
+ primary: 'bg-primary-50 text-primary-600 dark:bg-primary-900/40 dark:text-primary-300',
15
+ secondary: 'bg-secondary-100 text-secondary-600 dark:bg-secondary-800/60 dark:text-secondary-300',
16
+ success: 'bg-success-50 text-success-600 dark:bg-success-900/40 dark:text-success-300',
17
+ warning: 'bg-warning-50 text-warning-600 dark:bg-warning-900/40 dark:text-warning-300',
18
+ error: 'bg-error-50 text-error-600 dark:bg-error-900/40 dark:text-error-300',
19
+ info: 'bg-info-50 text-info-600 dark:bg-info-900/40 dark:text-info-300'
20
20
  };
21
21
  var StatCard = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
22
22
  var _change$goodWhenUp, _change$unit;
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
- import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { jsx } from 'react/jsx-runtime';
4
4
  import React from 'react';
5
5
  import { cn } from '../../utils/cn.js';
6
6
  import Badge from '../utility/Badge.js';
@@ -37,17 +37,14 @@ var StatusPill = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
37
37
  var resolvedTone = (entry === null || entry === void 0 ? void 0 : entry.tone) || tone || 'neutral';
38
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
39
  var resolvedIcon = icon !== null && icon !== void 0 ? icon : entry === null || entry === void 0 ? void 0 : entry.icon;
40
- return jsxs(Badge, _objectSpread2(_objectSpread2({
40
+ return jsx(Badge, _objectSpread2(_objectSpread2({
41
41
  ref: ref,
42
42
  variant: TONE_TO_VARIANT[resolvedTone] || 'secondary',
43
43
  size: "sm",
44
- className: cn('gap-1.5 whitespace-nowrap', className)
44
+ className: cn('gap-1.5 whitespace-nowrap', className),
45
+ icon: resolvedIcon
45
46
  }, 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]
47
+ children: label
51
48
  }));
52
49
  });
53
50
  StatusPill.displayName = 'StatusPill';
@@ -1,13 +1,15 @@
1
1
  'use client';
2
- import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2, toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2, toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import React from 'react';
5
5
  import { ResponsiveContainer, AreaChart, BarChart, LineChart, CartesianGrid, XAxis, YAxis, Tooltip, Bar, Area, Line } from 'recharts';
6
6
  import { ChartFrame, ChartTooltipContent } from './ChartFrame.js';
7
7
  import { useChartTheme, useChartId, defaultValueFormatter } from './chartTheme.js';
8
+ import { useElementWidth, usePinnedTooltip, yAxisWidthFor, tickGapFor } from './useChartLayout.js';
8
9
  import { useReducedMotion } from '../../hooks/useReducedMotion.js';
9
10
 
10
- 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"];
11
+ var _excluded = ["kind", "data", "index", "categories", "colors", "valueFormatter", "xAxisFormatter", "height", "aspectRatio", "showLegend", "showTooltip", "showXAxis", "showYAxis", "showGrid", "yAxisWidth", "curveType", "stacked", "horizontal", "showDots", "connectNulls", "animate", "title", "description", "emptyState", "accessibleTable", "className"],
12
+ _excluded2 = ["ref"];
11
13
  var ROOTS = {
12
14
  line: LineChart,
13
15
  bar: BarChart,
@@ -101,6 +103,7 @@ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2
101
103
  xAxisFormatter = _ref2.xAxisFormatter,
102
104
  _ref2$height = _ref2.height,
103
105
  height = _ref2$height === void 0 ? 300 : _ref2$height,
106
+ aspectRatio = _ref2.aspectRatio,
104
107
  _ref2$showLegend = _ref2.showLegend,
105
108
  showLegend = _ref2$showLegend === void 0 ? true : _ref2$showLegend,
106
109
  _ref2$showTooltip = _ref2.showTooltip,
@@ -111,8 +114,7 @@ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2
111
114
  showYAxis = _ref2$showYAxis === void 0 ? true : _ref2$showYAxis,
112
115
  _ref2$showGrid = _ref2.showGrid,
113
116
  showGrid = _ref2$showGrid === void 0 ? true : _ref2$showGrid,
114
- _ref2$yAxisWidth = _ref2.yAxisWidth,
115
- yAxisWidth = _ref2$yAxisWidth === void 0 ? 48 : _ref2$yAxisWidth,
117
+ yAxisWidth = _ref2.yAxisWidth,
116
118
  _ref2$curveType = _ref2.curveType,
117
119
  curveType = _ref2$curveType === void 0 ? "monotone" : _ref2$curveType,
118
120
  _ref2$stacked = _ref2.stacked,
@@ -147,6 +149,20 @@ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2
147
149
  var formatIndex = xAxisFormatter || function (v) {
148
150
  return v == null ? "" : String(v);
149
151
  };
152
+ var _useElementWidth = useElementWidth(),
153
+ _useElementWidth2 = _slicedToArray(_useElementWidth, 2),
154
+ measureRef = _useElementWidth2[0],
155
+ width = _useElementWidth2[1];
156
+ var pin = usePinnedTooltip(showTooltip);
157
+ var _pin$wrapperProps = pin.wrapperProps,
158
+ pinRef = _pin$wrapperProps.ref,
159
+ pinWrapperProps = _objectWithoutProperties(_pin$wrapperProps, _excluded2);
160
+ // An explicit yAxisWidth always wins; otherwise narrow charts give the plot more room.
161
+ var valueAxisWidth = yAxisWidth !== null && yAxisWidth !== void 0 ? yAxisWidth : yAxisWidthFor(width);
162
+ var setWrapperNode = React.useCallback(function (node) {
163
+ measureRef.current = node;
164
+ pinRef.current = node;
165
+ }, [measureRef, pinRef]);
150
166
  var categoryAxis = {
151
167
  dataKey: index,
152
168
  tick: tick,
@@ -154,7 +170,7 @@ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2
154
170
  axisLine: false,
155
171
  tickFormatter: xAxisFormatter,
156
172
  hide: !showXAxis,
157
- minTickGap: 8
173
+ minTickGap: tickGapFor(width)
158
174
  };
159
175
  var valueAxis = {
160
176
  tick: tick,
@@ -162,7 +178,7 @@ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2
162
178
  axisLine: false,
163
179
  tickFormatter: valueFormatter,
164
180
  hide: !showYAxis,
165
- width: yAxisWidth
181
+ width: valueAxisWidth
166
182
  };
167
183
  return jsx(ChartFrame, _objectSpread2(_objectSpread2({
168
184
  ref: ref,
@@ -172,6 +188,7 @@ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2
172
188
  defaultTitle: TITLES[kind],
173
189
  data: data,
174
190
  height: height,
191
+ aspectRatio: aspectRatio,
175
192
  emptyState: emptyState,
176
193
  accessibleTable: accessibleTable,
177
194
  legend: showLegend ? categories.map(function (c, i) {
@@ -192,64 +209,70 @@ var CartesianChart = /*#__PURE__*/React.forwardRef(function CartesianChart(_ref2
192
209
  };
193
210
  })))
194
211
  }, rest), {}, {
195
- children: jsx(ResponsiveContainer, {
196
- width: "100%",
197
- height: "100%",
198
- minWidth: 0,
199
- children: jsxs(Root, {
200
- id: chartId,
201
- data: data,
202
- layout: isHorizontalBars ? "vertical" : "horizontal",
203
- margin: {
204
- top: 8,
205
- right: 8,
206
- bottom: 0,
207
- left: 0
208
- },
209
- accessibilityLayer: false,
210
- children: [showGrid && jsx(CartesianGrid, {
211
- stroke: chrome.grid,
212
- strokeDasharray: "3 3",
213
- vertical: isHorizontalBars,
214
- horizontal: !isHorizontalBars
215
- }), isHorizontalBars ? jsx(XAxis, _objectSpread2(_objectSpread2({
216
- type: "number"
217
- }, valueAxis), {}, {
218
- hide: !showXAxis,
219
- width: undefined
220
- })) : jsx(XAxis, _objectSpread2({}, categoryAxis)), isHorizontalBars ? jsx(YAxis, _objectSpread2(_objectSpread2({
221
- type: "category"
222
- }, categoryAxis), {}, {
223
- hide: !showYAxis,
224
- width: yAxisWidth,
225
- interval: 0
226
- })) : jsx(YAxis, _objectSpread2({}, valueAxis)), showTooltip && jsx(Tooltip, {
227
- cursor: kind === "bar" ? {
228
- fill: chrome.grid,
229
- fillOpacity: 0.4
230
- } : {
231
- stroke: chrome.grid
212
+ children: jsx("div", _objectSpread2(_objectSpread2({
213
+ className: "h-full w-full",
214
+ ref: setWrapperNode
215
+ }, pinWrapperProps), {}, {
216
+ children: jsx(ResponsiveContainer, {
217
+ width: "100%",
218
+ height: "100%",
219
+ minWidth: 0,
220
+ children: jsxs(Root, {
221
+ id: chartId,
222
+ onClick: pin.onChartClick,
223
+ data: data,
224
+ layout: isHorizontalBars ? "vertical" : "horizontal",
225
+ margin: {
226
+ top: 8,
227
+ right: 8,
228
+ bottom: 0,
229
+ left: 0
232
230
  },
233
- isAnimationActive: false,
234
- content: jsx(ChartTooltipContent, {
235
- valueFormatter: valueFormatter
236
- })
237
- }), categories.map(function (category, i) {
238
- return renderSeries(kind, {
239
- id: "".concat(chartId, "-").concat(i),
240
- category: category,
241
- color: series[i],
242
- curve: curve,
243
- stacked: stacked,
244
- showDots: showDots,
245
- connectNulls: connectNulls,
246
- animate: animate && !reducedMotion,
247
- horizontal: isHorizontalBars,
248
- barRadius: 4
249
- });
250
- })]
231
+ accessibilityLayer: false,
232
+ children: [showGrid && jsx(CartesianGrid, {
233
+ stroke: chrome.grid,
234
+ strokeDasharray: "3 3",
235
+ vertical: isHorizontalBars,
236
+ horizontal: !isHorizontalBars
237
+ }), isHorizontalBars ? jsx(XAxis, _objectSpread2(_objectSpread2({
238
+ type: "number"
239
+ }, valueAxis), {}, {
240
+ hide: !showXAxis,
241
+ width: undefined
242
+ })) : jsx(XAxis, _objectSpread2({}, categoryAxis)), isHorizontalBars ? jsx(YAxis, _objectSpread2(_objectSpread2({
243
+ type: "category"
244
+ }, categoryAxis), {}, {
245
+ hide: !showYAxis,
246
+ width: valueAxisWidth,
247
+ interval: 0
248
+ })) : jsx(YAxis, _objectSpread2({}, valueAxis)), showTooltip && jsx(Tooltip, _objectSpread2({
249
+ cursor: kind === "bar" ? {
250
+ fill: chrome.grid,
251
+ fillOpacity: 0.4
252
+ } : {
253
+ stroke: chrome.grid
254
+ },
255
+ isAnimationActive: false,
256
+ content: jsx(ChartTooltipContent, {
257
+ valueFormatter: valueFormatter
258
+ })
259
+ }, pin.tooltipProps)), categories.map(function (category, i) {
260
+ return renderSeries(kind, {
261
+ id: "".concat(chartId, "-").concat(i),
262
+ category: category,
263
+ color: series[i],
264
+ curve: curve,
265
+ stacked: stacked,
266
+ showDots: showDots,
267
+ connectNulls: connectNulls,
268
+ animate: animate && !reducedMotion,
269
+ horizontal: isHorizontalBars,
270
+ barRadius: 4
271
+ });
272
+ })]
273
+ })
251
274
  })
252
- })
275
+ }))
253
276
  }));
254
277
  });
255
278
 
@@ -4,14 +4,19 @@ import { jsx, jsxs } from 'react/jsx-runtime';
4
4
  import React, { useId } from 'react';
5
5
  import { cn } from '../../utils/cn.js';
6
6
 
7
- var _excluded = ["className", "title", "description", "defaultTitle", "data", "height", "emptyState", "legend", "accessibleTable", "tableColumns", "children", "aria-label"];
7
+ var _excluded = ["className", "title", "description", "defaultTitle", "data", "height", "aspectRatio", "emptyState", "legend", "accessibleTable", "tableColumns", "children", "aria-label"];
8
8
  // The swatch colour arrives as a custom property so a token (`rgb(var(--dt-*))`)
9
9
  // and a resolved rgb() string both work.
10
10
  var swatch = function swatch(size) {
11
11
  return cn("inline-block shrink-0 rounded-full bg-[color:var(--dt-chart-color)]", size);
12
12
  };
13
- var sizeStyle = function sizeStyle(height) {
14
- return {
13
+ // `aspectRatio` (e.g. 16 / 9), when given, replaces the fixed height so the chart
14
+ // scales with its container width.
15
+ var sizeStyle = function sizeStyle(height, aspectRatio) {
16
+ return aspectRatio ? {
17
+ aspectRatio: String(aspectRatio),
18
+ width: "100%"
19
+ } : {
15
20
  height: typeof height === "number" ? "".concat(height, "px") : height
16
21
  };
17
22
  };
@@ -46,6 +51,7 @@ function ChartTooltipContent(_ref2) {
46
51
  if (!active || !payload || !payload.length) return null;
47
52
  return jsxs("div", {
48
53
  className: "rounded-md border border-gray-200 bg-white px-3 py-2 text-xs text-gray-900 shadow-md dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100",
54
+ "data-chart-tooltip": "",
49
55
  children: [!hideLabel && label != null && label !== "" && jsx("p", {
50
56
  className: "mb-1 font-medium",
51
57
  children: label
@@ -119,6 +125,7 @@ var ChartFrame = /*#__PURE__*/React.forwardRef(function ChartFrame(_ref4, ref) {
119
125
  defaultTitle = _ref4.defaultTitle,
120
126
  data = _ref4.data,
121
127
  height = _ref4.height,
128
+ aspectRatio = _ref4.aspectRatio,
122
129
  _ref4$emptyState = _ref4.emptyState,
123
130
  emptyState = _ref4$emptyState === void 0 ? "No data to display" : _ref4$emptyState,
124
131
  legend = _ref4.legend,
@@ -134,7 +141,7 @@ var ChartFrame = /*#__PURE__*/React.forwardRef(function ChartFrame(_ref4, ref) {
134
141
  return jsx("div", _objectSpread2(_objectSpread2({
135
142
  ref: ref,
136
143
  className: cn("flex w-full items-center justify-center rounded-md border border-dashed border-gray-300 text-sm text-gray-500 dark:border-gray-700 dark:text-gray-400", className),
137
- style: sizeStyle(height),
144
+ style: sizeStyle(height, aspectRatio),
138
145
  role: "status",
139
146
  "aria-label": name,
140
147
  "data-empty": "true"
@@ -151,7 +158,7 @@ var ChartFrame = /*#__PURE__*/React.forwardRef(function ChartFrame(_ref4, ref) {
151
158
  "aria-label": name,
152
159
  "aria-describedby": description ? descriptionId : undefined,
153
160
  className: "w-full text-gray-500 dark:text-gray-400",
154
- style: sizeStyle(height),
161
+ style: sizeStyle(height, aspectRatio),
155
162
  children: children
156
163
  }), description && jsx("p", {
157
164
  id: descriptionId,
@@ -0,0 +1,105 @@
1
+ 'use client';
2
+ import { slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { useRef, useState, useEffect, useCallback } from 'react';
4
+
5
+ // Internal to the charts entry point. Small-screen helpers for the cartesian
6
+ // charts: measured width (for adaptive ticks / axis width) and a tooltip that a
7
+ // tap can pin open on touch screens.
8
+ /** Gap (px) recharts keeps between x-axis ticks: wider on narrow charts so labels don't collide. */
9
+ function tickGapFor(width) {
10
+ if (!width) return 8;
11
+ if (width < 360) return 32;
12
+ if (width < 640) return 16;
13
+ return 8;
14
+ }
15
+ /** Default value-axis width (px) when the consumer didn't set `yAxisWidth`. */
16
+ function yAxisWidthFor(width) {
17
+ if (!width) return 48;
18
+ return width < 400 ? 36 : 48;
19
+ }
20
+ /** Tracks the rendered width of `ref`'s element. `0` until measured. */
21
+ function useElementWidth() {
22
+ var ref = useRef(null);
23
+ var _useState = useState(0),
24
+ _useState2 = _slicedToArray(_useState, 2),
25
+ width = _useState2[0],
26
+ setWidth = _useState2[1];
27
+ useEffect(function () {
28
+ var node = ref.current;
29
+ if (!node) return undefined;
30
+ var measure = function measure() {
31
+ return setWidth(Math.round(node.getBoundingClientRect().width || 0));
32
+ };
33
+ measure();
34
+ if (typeof ResizeObserver === "undefined") return undefined;
35
+ var observer = new ResizeObserver(measure);
36
+ observer.observe(node);
37
+ return function () {
38
+ return observer.disconnect();
39
+ };
40
+ }, []);
41
+ return [ref, width];
42
+ }
43
+ var readIndex = function readIndex(state) {
44
+ var _state$activeTooltipI;
45
+ var raw = (_state$activeTooltipI = state === null || state === void 0 ? void 0 : state.activeTooltipIndex) !== null && _state$activeTooltipI !== void 0 ? _state$activeTooltipI : state === null || state === void 0 ? void 0 : state.activeIndex;
46
+ if (raw === undefined || raw === null || raw === "") return undefined;
47
+ var n = Number(raw);
48
+ return Number.isNaN(n) ? raw : n;
49
+ };
50
+ /**
51
+ * Tap-to-pin tooltip for touch. A tap on the chart pins the tooltip at the
52
+ * tapped point; a second tap on the chart, or a tap outside it, unpins it.
53
+ * Mouse and pen keep the normal hover tooltip.
54
+ *
55
+ * Returns props for a wrapper element, an `onChartClick` for the recharts root
56
+ * and `tooltipProps` to spread on `<Tooltip>`.
57
+ */
58
+ function usePinnedTooltip() {
59
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
60
+ var wrapperRef = useRef(null);
61
+ var pointerType = useRef("mouse");
62
+ var _useState3 = useState(null),
63
+ _useState4 = _slicedToArray(_useState3, 2),
64
+ pinned = _useState4[0],
65
+ setPinned = _useState4[1]; // null | { index }
66
+ var onPointerDownCapture = useCallback(function (e) {
67
+ pointerType.current = e.pointerType || "mouse";
68
+ }, []);
69
+ var toggle = useCallback(function (state) {
70
+ if (!enabled || pointerType.current !== "touch") return;
71
+ setPinned(function (current) {
72
+ return current ? null : {
73
+ index: readIndex(state)
74
+ };
75
+ });
76
+ }, [enabled]);
77
+ // A tap outside the chart unpins.
78
+ useEffect(function () {
79
+ if (!pinned) return undefined;
80
+ var onDown = function onDown(e) {
81
+ if (wrapperRef.current && !wrapperRef.current.contains(e.target)) setPinned(null);
82
+ };
83
+ document.addEventListener("pointerdown", onDown);
84
+ return function () {
85
+ return document.removeEventListener("pointerdown", onDown);
86
+ };
87
+ }, [pinned]);
88
+ var tooltipProps = pinned ? _objectSpread2({
89
+ active: true
90
+ }, pinned.index !== undefined ? {
91
+ defaultIndex: pinned.index
92
+ } : {}) : {};
93
+ return {
94
+ pinned: Boolean(pinned),
95
+ wrapperProps: {
96
+ ref: wrapperRef,
97
+ onPointerDownCapture: onPointerDownCapture,
98
+ "data-tooltip-pinned": pinned ? "true" : undefined
99
+ },
100
+ onChartClick: toggle,
101
+ tooltipProps: tooltipProps
102
+ };
103
+ }
104
+
105
+ export { tickGapFor, useElementWidth, usePinnedTooltip, yAxisWidthFor };