@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
@@ -4,6 +4,8 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { forwardRef, useState, useRef, useId, useMemo, useCallback, useImperativeHandle, useEffect } from 'react';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { useLatestRef } from '../../../hooks/useLatestRef.js';
7
+ import { useMediaQuery } from '../../../hooks/useMediaQuery.js';
8
+ import { usePresentation } from '../../../hooks/usePresentation.js';
7
9
  import { Plus, RefreshCcw, Save, X, AlertCircle, Search, ChevronUp, ChevronDown, MoreVertical, List } from 'lucide-react';
8
10
  import Select from '../Select.js';
9
11
  import { DEFAULT_ACTIONS } from './constants.js';
@@ -16,7 +18,7 @@ import TableRow from './TableRow.js';
16
18
  import MobileCard from './MobileCard.js';
17
19
  import FieldInput from './FieldInput.js';
18
20
 
19
- var _excluded = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "replaceDefaultActions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange", "showReloadButton", "renderReloadButton", "onReload", "stripedRows", "theme", "responsiveBreakpoint", "showToolbar", "showColumnPicker", "wrapCells", "mobileMaxFields", "serverSide", "totalRecords", "pageNumber", "onPageChange", "TheadComponent", "TfootComponent", "interactive", "onSave", "onEdit", "onRowAdd", "onRowDelete", "editKeyBinding", "newRowPosition", "addRowRef", "onInitAddRow", "renderAddRowButton", "renderExternalAddRow"],
21
+ var _excluded = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "replaceDefaultActions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange", "showReloadButton", "renderReloadButton", "onReload", "stripedRows", "theme", "responsiveBreakpoint", "showToolbar", "showColumnPicker", "wrapCells", "mobileMaxFields", "serverSide", "totalRecords", "pageNumber", "onPageChange", "TheadComponent", "TfootComponent", "interactive", "onSave", "onEdit", "onRowAdd", "onRowDelete", "editKeyBinding", "newRowPosition", "addRowRef", "onInitAddRow", "renderAddRowButton", "renderExternalAddRow", "actionMenuPresentation", "defaultMobileView", "mobileFiltersPresentation", "swipeActions", "stickyHeader"],
20
22
  _excluded2 = ["_key", "_isNew"];
21
23
  var DEFAULT_DATA = [];
22
24
  var DEFAULT_COLUMNS = [];
@@ -112,101 +114,113 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
112
114
  onInitAddRow = _ref.onInitAddRow,
113
115
  renderAddRowButton = _ref.renderAddRowButton,
114
116
  renderExternalAddRow = _ref.renderExternalAddRow,
117
+ _ref$actionMenuPresen = _ref.actionMenuPresentation,
118
+ actionMenuPresentation = _ref$actionMenuPresen === void 0 ? "auto" : _ref$actionMenuPresen,
119
+ _ref$defaultMobileVie = _ref.defaultMobileView,
120
+ defaultMobileView = _ref$defaultMobileVie === void 0 ? false : _ref$defaultMobileVie,
121
+ _ref$mobileFiltersPre = _ref.mobileFiltersPresentation,
122
+ mobileFiltersPresentation = _ref$mobileFiltersPre === void 0 ? "auto" : _ref$mobileFiltersPre,
123
+ swipeActions = _ref.swipeActions,
124
+ _ref$stickyHeader = _ref.stickyHeader,
125
+ stickyHeader = _ref$stickyHeader === void 0 ? false : _ref$stickyHeader,
115
126
  props = _objectWithoutProperties(_ref, _excluded);
116
127
  theme = _objectSpread2(_objectSpread2({}, DEFAULT_THEME), theme);
128
+ // Card mode follows a media query (SSR-safe): `defaultMobileView` on the
129
+ // server and while hydrating, then the live match. Same semantics as the old
130
+ // `window.innerWidth < responsiveBreakpoint` check.
131
+ var isMobileView = useMediaQuery("not all and (min-width: ".concat(Number(responsiveBreakpoint) || 0, "px)"), {
132
+ defaultValue: Boolean(defaultMobileView)
133
+ });
134
+ var phoneFilters = usePresentation(mobileFiltersPresentation === "sheet" ? "sheet" : mobileFiltersPresentation === "inline" ? "popover" : "auto") === "sheet";
117
135
  // State
118
- var _useState = useState(false),
119
- _useState2 = _slicedToArray(_useState, 2),
120
- isMobileView = _useState2[0],
121
- setIsMobileView = _useState2[1];
122
- var _useState3 = useState(function () {
136
+ var _useState = useState(function () {
123
137
  return Array.isArray(initialData) ? initialData : [];
124
138
  }),
139
+ _useState2 = _slicedToArray(_useState, 2),
140
+ tableData = _useState2[0],
141
+ setTableData = _useState2[1];
142
+ var _useState3 = useState(false),
125
143
  _useState4 = _slicedToArray(_useState3, 2),
126
- tableData = _useState4[0],
127
- setTableData = _useState4[1];
128
- var _useState5 = useState(false),
144
+ loading = _useState4[0],
145
+ _setLoading = _useState4[1];
146
+ var _useState5 = useState(pageSize),
129
147
  _useState6 = _slicedToArray(_useState5, 2),
130
- loading = _useState6[0],
131
- _setLoading = _useState6[1];
132
- var _useState7 = useState(pageSize),
133
- _useState8 = _slicedToArray(_useState7, 2),
134
- limit = _useState8[0],
135
- setLimit = _useState8[1];
136
- var _useState9 = useState(function () {
148
+ limit = _useState6[0],
149
+ setLimit = _useState6[1];
150
+ var _useState7 = useState(function () {
137
151
  return typeof pageNumber === "number" ? pageNumber : 1;
138
152
  }),
139
- _useState0 = _slicedToArray(_useState9, 2),
140
- currentPage = _useState0[0],
141
- setCurrentPage = _useState0[1];
142
- var _useState1 = useState(function () {
153
+ _useState8 = _slicedToArray(_useState7, 2),
154
+ currentPage = _useState8[0],
155
+ setCurrentPage = _useState8[1];
156
+ var _useState9 = useState(function () {
143
157
  return Array.isArray(initialColumns) ? initialColumns.map(function (c) {
144
158
  return _objectSpread2({}, c);
145
159
  }) : [];
146
160
  }),
161
+ _useState0 = _slicedToArray(_useState9, 2),
162
+ columnsState = _useState0[0],
163
+ setColumnsState = _useState0[1];
164
+ var _useState1 = useState(false),
147
165
  _useState10 = _slicedToArray(_useState1, 2),
148
- columnsState = _useState10[0],
149
- setColumnsState = _useState10[1];
150
- var _useState11 = useState(false),
151
- _useState12 = _slicedToArray(_useState11, 2),
152
- showColumnMenu = _useState12[0],
153
- setShowColumnMenu = _useState12[1];
154
- var _useState13 = useState({
166
+ showColumnMenu = _useState10[0],
167
+ setShowColumnMenu = _useState10[1];
168
+ var _useState11 = useState({
155
169
  key: null,
156
170
  direction: "asc"
157
171
  }),
172
+ _useState12 = _slicedToArray(_useState11, 2),
173
+ sortConfig = _useState12[0],
174
+ setSortConfig = _useState12[1];
175
+ var _useState13 = useState({}),
158
176
  _useState14 = _slicedToArray(_useState13, 2),
159
- sortConfig = _useState14[0],
160
- setSortConfig = _useState14[1];
161
- var _useState15 = useState({}),
177
+ filters = _useState14[0],
178
+ setFilters = _useState14[1];
179
+ var _useState15 = useState(""),
162
180
  _useState16 = _slicedToArray(_useState15, 2),
163
- filters = _useState16[0],
164
- setFilters = _useState16[1];
165
- var _useState17 = useState(""),
181
+ searchInput = _useState16[0],
182
+ setSearchInput = _useState16[1];
183
+ var _useState17 = useState(function () {
184
+ return new Set();
185
+ }),
166
186
  _useState18 = _slicedToArray(_useState17, 2),
167
- searchInput = _useState18[0],
168
- setSearchInput = _useState18[1];
187
+ selectedRows = _useState18[0],
188
+ setSelectedRows = _useState18[1];
169
189
  var _useState19 = useState(function () {
170
190
  return new Set();
171
191
  }),
172
192
  _useState20 = _slicedToArray(_useState19, 2),
173
- selectedRows = _useState20[0],
174
- setSelectedRows = _useState20[1];
175
- var _useState21 = useState(function () {
176
- return new Set();
177
- }),
193
+ expandedRows = _useState20[0],
194
+ setExpandedRows = _useState20[1];
195
+ var _useState21 = useState(null),
178
196
  _useState22 = _slicedToArray(_useState21, 2),
179
- expandedRows = _useState22[0],
180
- setExpandedRows = _useState22[1];
181
- var _useState23 = useState(null),
197
+ activeActionRowKey = _useState22[0],
198
+ setActiveActionRowKey = _useState22[1];
199
+ var _useState23 = useState(false),
182
200
  _useState24 = _slicedToArray(_useState23, 2),
183
- activeActionRowKey = _useState24[0],
184
- setActiveActionRowKey = _useState24[1];
185
- var _useState25 = useState(false),
186
- _useState26 = _slicedToArray(_useState25, 2),
187
- showMobileFilters = _useState26[0],
188
- setShowMobileFilters = _useState26[1];
201
+ showMobileFilters = _useState24[0],
202
+ setShowMobileFilters = _useState24[1];
189
203
  // Interactive Mode State
190
- var _useState27 = useState({}),
204
+ var _useState25 = useState({}),
205
+ _useState26 = _slicedToArray(_useState25, 2),
206
+ pendingEdits = _useState26[0],
207
+ setPendingEdits = _useState26[1];
208
+ var _useState27 = useState([]),
191
209
  _useState28 = _slicedToArray(_useState27, 2),
192
- pendingEdits = _useState28[0],
193
- setPendingEdits = _useState28[1];
194
- var _useState29 = useState([]),
210
+ newRows = _useState28[0],
211
+ setNewRows = _useState28[1];
212
+ var _useState29 = useState(null),
195
213
  _useState30 = _slicedToArray(_useState29, 2),
196
- newRows = _useState30[0],
197
- setNewRows = _useState30[1];
214
+ activeCell = _useState30[0],
215
+ setActiveCell = _useState30[1];
198
216
  var _useState31 = useState(null),
199
217
  _useState32 = _slicedToArray(_useState31, 2),
200
- activeCell = _useState32[0],
201
- setActiveCell = _useState32[1];
202
- var _useState33 = useState(null),
218
+ editingCell = _useState32[0],
219
+ setEditingCell = _useState32[1];
220
+ var _useState33 = useState(false),
203
221
  _useState34 = _slicedToArray(_useState33, 2),
204
- editingCell = _useState34[0],
205
- setEditingCell = _useState34[1];
206
- var _useState35 = useState(false),
207
- _useState36 = _slicedToArray(_useState35, 2),
208
- isSaving = _useState36[0],
209
- setIsSaving = _useState36[1];
222
+ isSaving = _useState34[0],
223
+ setIsSaving = _useState34[1];
210
224
  var tableContainerRef = useRef(null);
211
225
  // Refs
212
226
  var columnMenuRef = useRef(null);
@@ -564,10 +578,10 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
564
578
  }, [pageSize]);
565
579
  // Follow an external `pageNumber` change (adjust-during-render pattern);
566
580
  // internal page navigation is left alone while the prop is unchanged.
567
- var _useState37 = useState(pageNumber),
568
- _useState38 = _slicedToArray(_useState37, 2),
569
- prevPageNumber = _useState38[0],
570
- setPrevPageNumber = _useState38[1];
581
+ var _useState35 = useState(pageNumber),
582
+ _useState36 = _slicedToArray(_useState35, 2),
583
+ prevPageNumber = _useState36[0],
584
+ setPrevPageNumber = _useState36[1];
571
585
  if (pageNumber !== prevPageNumber) {
572
586
  setPrevPageNumber(pageNumber);
573
587
  if (typeof pageNumber === "number" && pageNumber !== currentPage) {
@@ -588,16 +602,6 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
588
602
  initialDataRef.current = initialData;
589
603
  }
590
604
  }, [initialData]);
591
- useEffect(function () {
592
- var checkMobile = function checkMobile() {
593
- return setIsMobileView(window.innerWidth < responsiveBreakpoint);
594
- };
595
- checkMobile();
596
- window.addEventListener("resize", checkMobile);
597
- return function () {
598
- return window.removeEventListener("resize", checkMobile);
599
- };
600
- }, [responsiveBreakpoint]);
601
605
  // Click-outside handlers
602
606
  var closeColumnMenu = useCallback(function () {
603
607
  return setShowColumnMenu(false);
@@ -608,14 +612,21 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
608
612
  useClickOutside([columnMenuRef, columnToggleBtnRef], closeColumnMenu, {
609
613
  enabled: showColumnMenu
610
614
  });
611
- useClickOutside([actionMenuRef], closeActionMenu, {
612
- enabled: activeActionRowKey !== null
613
- });
614
615
  // Computed values
615
616
  var activeAnchorEl = useMemo(function () {
616
617
  if (activeActionRowKey === null) return null;
617
618
  return actionButtonRefs.current[activeActionRowKey];
618
619
  }, [activeActionRowKey]);
620
+ // The trigger counts as "inside": a press on it must not close the menu
621
+ // only for the trigger's own click to re-open it.
622
+ var activeAnchorRef = useMemo(function () {
623
+ return {
624
+ current: activeAnchorEl
625
+ };
626
+ }, [activeAnchorEl]);
627
+ useClickOutside([actionMenuRef, activeAnchorRef], closeActionMenu, {
628
+ enabled: activeActionRowKey !== null
629
+ });
619
630
  var visibleColumns = useMemo(function () {
620
631
  return columnsState.filter(function (col) {
621
632
  return col.isVisible !== false;
@@ -937,6 +948,21 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
937
948
  });
938
949
  setCurrentPage(1);
939
950
  }, [onFilter, onFilterChange]);
951
+ // Commits several filters at once (the phone filter sheet's Apply).
952
+ var applyFilters = useCallback(function (patch) {
953
+ setFilters(function (prev) {
954
+ var newFilters = _objectSpread2(_objectSpread2({}, prev), patch);
955
+ onFilter === null || onFilter === void 0 || onFilter(newFilters);
956
+ onFilterChange === null || onFilterChange === void 0 || onFilterChange(newFilters);
957
+ return newFilters;
958
+ });
959
+ setCurrentPage(1);
960
+ }, [onFilter, onFilterChange]);
961
+ // One open swipe row at a time: `{ key, side }`.
962
+ var _useState37 = useState(null),
963
+ _useState38 = _slicedToArray(_useState37, 2),
964
+ openSwipe = _useState38[0],
965
+ setOpenSwipe = _useState38[1];
940
966
  var handleSelectAll = useCallback(function () {
941
967
  setSelectedRows(function (prev) {
942
968
  var newSelection = new Set(prev);
@@ -1133,6 +1159,7 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
1133
1159
  activeAnchorEl: activeAnchorEl,
1134
1160
  registerActionButton: registerActionButton,
1135
1161
  actionMenuRef: actionMenuRef,
1162
+ actionMenuPresentation: actionMenuPresentation,
1136
1163
  toggleExpandRow: toggleExpandRow,
1137
1164
  handleSelectRow: handleSelectRow,
1138
1165
  toggleActions: toggleActions,
@@ -1147,7 +1174,10 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
1147
1174
  onCellDoubleClick: handleCellDoubleClick,
1148
1175
  renderInteractiveCellInput: renderInteractiveCellInput,
1149
1176
  invalidCellSet: invalidCellSet,
1150
- pendingEdits: pendingEdits
1177
+ pendingEdits: pendingEdits,
1178
+ swipeActions: swipeActions,
1179
+ openSwipe: openSwipe,
1180
+ setOpenSwipe: setOpenSwipe
1151
1181
  };
1152
1182
  var showToolbarBar = showToolbar || interactive && (isDirty || !!renderAddRowButton || !!renderExternalAddRow);
1153
1183
  var renderAddRowClickableRow = useCallback(function () {
@@ -1314,7 +1344,9 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
1314
1344
  filterable: filterable,
1315
1345
  visibleColumns: visibleColumns,
1316
1346
  filters: filters,
1317
- handleFilter: handleFilter
1347
+ handleFilter: handleFilter,
1348
+ applyFilters: applyFilters,
1349
+ presentation: phoneFilters ? "sheet" : "inline"
1318
1350
  }), columnPickerVisible && showColumnMenu && jsx(ColumnMenu, {
1319
1351
  id: columnMenuId,
1320
1352
  columns: columnsState,
@@ -1322,12 +1354,16 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
1322
1354
  menuRef: columnMenuRef,
1323
1355
  theme: safeTheme
1324
1356
  }), !isMobileView && jsx("div", {
1325
- className: "overflow-x-auto overflow-y-visible",
1357
+ "data-sticky-header": stickyHeader ? "" : undefined,
1358
+ className: cn(stickyHeader ? "overflow-auto overscroll-contain" : "overflow-x-auto overflow-y-visible"),
1359
+ style: stickyHeader && stickyHeader !== true ? {
1360
+ maxHeight: typeof stickyHeader === "number" ? "".concat(stickyHeader, "px") : stickyHeader
1361
+ } : undefined,
1326
1362
  children: jsxs("table", _objectSpread2(_objectSpread2({
1327
1363
  className: cn("min-w-full divide-y divide-line", className)
1328
1364
  }, props), {}, {
1329
1365
  children: [jsxs("thead", {
1330
- className: safeTheme.accentColor,
1366
+ className: cn(safeTheme.accentColor, stickyHeader && "sticky top-0 z-sticky shadow-[0_1px_0_0] shadow-line"),
1331
1367
  children: [jsxs("tr", {
1332
1368
  children: [hasDetailsColumn && jsx("th", {
1333
1369
  className: "w-8 px-4 py-3"
@@ -1344,33 +1380,44 @@ var Table = /*#__PURE__*/forwardRef(function Table(_ref, ref) {
1344
1380
  })
1345
1381
  }), visibleColumns.map(function (column) {
1346
1382
  var _column$rules;
1383
+ var isSortable = sortable && column.sortable !== false;
1384
+ var isSorted = sortConfig.key === column.key;
1385
+ var ariaSort = !isSortable ? undefined : isSorted ? sortConfig.direction === "desc" ? "descending" : "ascending" : "none";
1386
+ var labelContent = jsxs(Fragment, {
1387
+ children: [jsx("span", {
1388
+ children: column.label
1389
+ }), (column.required || ((_column$rules = column.rules) === null || _column$rules === void 0 ? void 0 : _column$rules.required)) && jsx("span", {
1390
+ className: "text-error-500 font-bold ml-0.5",
1391
+ title: "Required field",
1392
+ children: "*"
1393
+ })]
1394
+ });
1347
1395
  return jsx("th", {
1348
- className: cn("px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider", {
1349
- "cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800": sortable && column.sortable !== false
1350
- }),
1351
- onClick: function onClick() {
1352
- return column.sortable !== false && handleSort(column.key);
1353
- },
1354
- children: jsxs("div", {
1355
- className: "flex items-center gap-1",
1356
- children: [jsx("span", {
1357
- children: column.label
1358
- }), (column.required || ((_column$rules = column.rules) === null || _column$rules === void 0 ? void 0 : _column$rules.required)) && jsx("span", {
1359
- className: "text-error-500 font-bold ml-0.5",
1360
- title: "Required field",
1361
- children: "*"
1362
- }), sortable && column.sortable !== false && jsxs("div", {
1396
+ scope: "col",
1397
+ "aria-sort": ariaSort,
1398
+ className: cn("px-6 py-3 text-left text-xs font-medium text-primary-700 uppercase tracking-wider", isSortable && "p-0"),
1399
+ children: isSortable ? jsxs("button", {
1400
+ type: "button",
1401
+ onClick: function onClick() {
1402
+ return handleSort(column.key);
1403
+ },
1404
+ className: cn("flex w-full items-center gap-1 px-6 py-3 text-left uppercase tracking-wider", "hover:bg-line/50 outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500", "transition-colors duration-fast motion-reduce:transition-none"),
1405
+ children: [labelContent, jsxs("span", {
1363
1406
  className: "flex flex-col",
1407
+ "aria-hidden": "true",
1364
1408
  children: [jsx(ChevronUp, {
1365
1409
  className: cn("h-3 w-3", {
1366
- "text-primary-600": sortConfig.key === column.key && sortConfig.direction === "asc"
1410
+ "text-primary-600": isSorted && sortConfig.direction === "asc"
1367
1411
  })
1368
1412
  }), jsx(ChevronDown, {
1369
1413
  className: cn("h-3 w-3 -mt-1", {
1370
- "text-primary-600": sortConfig.key === column.key && sortConfig.direction === "desc"
1414
+ "text-primary-600": isSorted && sortConfig.direction === "desc"
1371
1415
  })
1372
1416
  })]
1373
1417
  })]
1418
+ }) : jsx("div", {
1419
+ className: "flex items-center gap-1",
1420
+ children: labelContent
1374
1421
  })
1375
1422
  }, column.key);
1376
1423
  }), columnPickerVisible && jsx("th", {
@@ -5,6 +5,7 @@ import React from 'react';
5
5
  import { cn } from '../../../utils/cn.js';
6
6
  import { Trash2, MoreVertical } from 'lucide-react';
7
7
  import ActionMenu from './ActionMenu.js';
8
+ import { TOUCH_TARGET } from '../../../utils/touchTarget.js';
8
9
  import { getRowKey, resolveActions, rowHasDetails, getActionLabelText, getHoverClass, getStripeProps } from './helpers.js';
9
10
 
10
11
  /**
@@ -35,6 +36,8 @@ function TableRow(_ref) {
35
36
  activeAnchorEl = _ref.activeAnchorEl,
36
37
  registerActionButton = _ref.registerActionButton,
37
38
  actionMenuRef = _ref.actionMenuRef,
39
+ _ref$actionMenuPresen = _ref.actionMenuPresentation,
40
+ actionMenuPresentation = _ref$actionMenuPresen === void 0 ? "auto" : _ref$actionMenuPresen,
38
41
  toggleExpandRow = _ref.toggleExpandRow,
39
42
  handleSelectRow = _ref.handleSelectRow,
40
43
  toggleActions = _ref.toggleActions,
@@ -209,17 +212,21 @@ function TableRow(_ref) {
209
212
  }), menuActions.length > 0 && jsxs("div", {
210
213
  className: "relative inline-block",
211
214
  children: [jsx("button", {
215
+ type: "button",
212
216
  ref: function ref(el) {
213
217
  return registerActionButton === null || registerActionButton === void 0 ? void 0 : registerActionButton(actionCellKey, el);
214
218
  },
215
219
  onClick: function onClick(e) {
216
220
  return toggleActions(e, actionCellKey, row);
217
221
  },
222
+ "aria-haspopup": "menu",
218
223
  "aria-expanded": activeActionRowKey === actionCellKey,
219
- className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800",
224
+ "aria-label": "Actions",
225
+ className: cn("inline-flex items-center justify-center p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800", "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500", TOUCH_TARGET),
220
226
  title: "Actions",
221
227
  children: jsx(MoreVertical, {
222
- className: "h-4 w-4"
228
+ className: "h-4 w-4",
229
+ "aria-hidden": "true"
223
230
  })
224
231
  }), activeActionRowKey === actionCellKey && jsx(ActionMenu, {
225
232
  actions: menuActions,
@@ -230,6 +237,7 @@ function TableRow(_ref) {
230
237
  menuRef: actionMenuRef,
231
238
  anchorEl: activeAnchorEl,
232
239
  onClose: closeActionMenu,
240
+ presentation: actionMenuPresentation,
233
241
  theme: theme
234
242
  })]
235
243
  })]