@hanzo/ui 8.27.10 → 8.27.12

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 (299) hide show
  1. package/dist/backends/gui/comparison.cjs +17 -21
  2. package/dist/backends/gui/comparison.d.ts +4 -5
  3. package/dist/backends/gui/comparison.d.ts.map +1 -1
  4. package/dist/backends/gui/comparison.js +18 -22
  5. package/dist/backends/gui/comparison.js.map +1 -1
  6. package/dist/backends/gui/crypto-screener.cjs +21 -31
  7. package/dist/backends/gui/crypto-screener.d.ts +20 -24
  8. package/dist/backends/gui/crypto-screener.d.ts.map +1 -1
  9. package/dist/backends/gui/crypto-screener.js +21 -31
  10. package/dist/backends/gui/crypto-screener.js.map +1 -1
  11. package/dist/backends/gui/cursor.cjs +15 -18
  12. package/dist/backends/gui/cursor.d.ts +4 -3
  13. package/dist/backends/gui/cursor.d.ts.map +1 -1
  14. package/dist/backends/gui/cursor.js +15 -18
  15. package/dist/backends/gui/cursor.js.map +1 -1
  16. package/dist/backends/gui/data-table.cjs +144 -184
  17. package/dist/backends/gui/data-table.d.ts +64 -44
  18. package/dist/backends/gui/data-table.d.ts.map +1 -1
  19. package/dist/backends/gui/data-table.js +146 -152
  20. package/dist/backends/gui/data-table.js.map +1 -1
  21. package/dist/backends/gui/dock.cjs +1 -1
  22. package/dist/backends/gui/dock.d.ts.map +1 -1
  23. package/dist/backends/gui/dock.js +1 -1
  24. package/dist/backends/gui/dock.js.map +1 -1
  25. package/dist/backends/gui/editor.cjs +35 -31
  26. package/dist/backends/gui/editor.d.ts +11 -11
  27. package/dist/backends/gui/editor.d.ts.map +1 -1
  28. package/dist/backends/gui/editor.js +35 -31
  29. package/dist/backends/gui/editor.js.map +1 -1
  30. package/dist/backends/gui/field.cjs +132 -0
  31. package/dist/backends/gui/field.d.ts +74 -0
  32. package/dist/backends/gui/field.d.ts.map +1 -0
  33. package/dist/backends/gui/field.js +121 -0
  34. package/dist/backends/gui/field.js.map +1 -0
  35. package/dist/backends/gui/gantt.cjs +17 -19
  36. package/dist/backends/gui/gantt.d.ts +4 -5
  37. package/dist/backends/gui/gantt.d.ts.map +1 -1
  38. package/dist/backends/gui/gantt.js +18 -21
  39. package/dist/backends/gui/gantt.js.map +1 -1
  40. package/dist/backends/gui/glimpse.cjs +88 -0
  41. package/dist/backends/gui/glimpse.d.ts +57 -0
  42. package/dist/backends/gui/glimpse.d.ts.map +1 -0
  43. package/dist/backends/gui/glimpse.js +81 -0
  44. package/dist/backends/gui/glimpse.js.map +1 -0
  45. package/dist/backends/gui/grid-pattern.cjs +119 -0
  46. package/dist/backends/gui/grid-pattern.d.ts +96 -0
  47. package/dist/backends/gui/grid-pattern.d.ts.map +1 -0
  48. package/dist/backends/gui/grid-pattern.js +84 -0
  49. package/dist/backends/gui/grid-pattern.js.map +1 -0
  50. package/dist/backends/gui/image-crop.cjs +35 -0
  51. package/dist/backends/gui/image-crop.d.ts +20 -0
  52. package/dist/backends/gui/image-crop.d.ts.map +1 -0
  53. package/dist/backends/gui/image-crop.js +33 -0
  54. package/dist/backends/gui/image-crop.js.map +1 -0
  55. package/dist/backends/gui/image-zoom.cjs +58 -0
  56. package/dist/backends/gui/image-zoom.d.ts +16 -0
  57. package/dist/backends/gui/image-zoom.d.ts.map +1 -0
  58. package/dist/backends/gui/image-zoom.js +56 -0
  59. package/dist/backends/gui/image-zoom.js.map +1 -0
  60. package/dist/backends/gui/index.cjs +159 -1
  61. package/dist/backends/gui/index.d.ts +49 -0
  62. package/dist/backends/gui/index.d.ts.map +1 -1
  63. package/dist/backends/gui/index.js +49 -0
  64. package/dist/backends/gui/index.js.map +1 -1
  65. package/dist/backends/gui/interactive-grid-pattern.cjs +61 -0
  66. package/dist/backends/gui/interactive-grid-pattern.d.ts +28 -0
  67. package/dist/backends/gui/interactive-grid-pattern.d.ts.map +1 -0
  68. package/dist/backends/gui/interactive-grid-pattern.js +26 -0
  69. package/dist/backends/gui/interactive-grid-pattern.js.map +1 -0
  70. package/dist/backends/gui/iphone-15-pro.cjs +83 -0
  71. package/dist/backends/gui/iphone-15-pro.d.ts +16 -0
  72. package/dist/backends/gui/iphone-15-pro.d.ts.map +1 -0
  73. package/dist/backends/gui/iphone-15-pro.js +81 -0
  74. package/dist/backends/gui/iphone-15-pro.js.map +1 -0
  75. package/dist/backends/gui/item.cjs +154 -0
  76. package/dist/backends/gui/item.d.ts +72 -0
  77. package/dist/backends/gui/item.d.ts.map +1 -0
  78. package/dist/backends/gui/item.js +143 -0
  79. package/dist/backends/gui/item.js.map +1 -0
  80. package/dist/backends/gui/kanban.cjs +247 -0
  81. package/dist/backends/gui/kanban.d.ts +37 -0
  82. package/dist/backends/gui/kanban.d.ts.map +1 -0
  83. package/dist/backends/gui/kanban.js +212 -0
  84. package/dist/backends/gui/kanban.js.map +1 -0
  85. package/dist/backends/gui/kbd.cjs +45 -0
  86. package/dist/backends/gui/kbd.d.ts +8 -0
  87. package/dist/backends/gui/kbd.d.ts.map +1 -0
  88. package/dist/backends/gui/kbd.js +42 -0
  89. package/dist/backends/gui/kbd.js.map +1 -0
  90. package/dist/backends/gui/limelight-nav.cjs +201 -0
  91. package/dist/backends/gui/limelight-nav.d.ts +20 -0
  92. package/dist/backends/gui/limelight-nav.d.ts.map +1 -0
  93. package/dist/backends/gui/limelight-nav.js +166 -0
  94. package/dist/backends/gui/limelight-nav.js.map +1 -0
  95. package/dist/backends/gui/list.cjs +26 -0
  96. package/dist/backends/gui/list.d.ts +15 -0
  97. package/dist/backends/gui/list.d.ts.map +1 -0
  98. package/dist/backends/gui/list.js +23 -0
  99. package/dist/backends/gui/list.js.map +1 -0
  100. package/dist/backends/gui/macos-dock.cjs +84 -0
  101. package/dist/backends/gui/macos-dock.d.ts +30 -0
  102. package/dist/backends/gui/macos-dock.d.ts.map +1 -0
  103. package/dist/backends/gui/macos-dock.js +82 -0
  104. package/dist/backends/gui/macos-dock.js.map +1 -0
  105. package/dist/backends/gui/magnetic.cjs +40 -0
  106. package/dist/backends/gui/magnetic.d.ts +12 -0
  107. package/dist/backends/gui/magnetic.d.ts.map +1 -0
  108. package/dist/backends/gui/magnetic.js +38 -0
  109. package/dist/backends/gui/magnetic.js.map +1 -0
  110. package/dist/backends/gui/marquee.cjs +110 -0
  111. package/dist/backends/gui/marquee.d.ts +44 -0
  112. package/dist/backends/gui/marquee.d.ts.map +1 -0
  113. package/dist/backends/gui/marquee.js +75 -0
  114. package/dist/backends/gui/marquee.js.map +1 -0
  115. package/dist/backends/gui/menu-dock.cjs +64 -0
  116. package/dist/backends/gui/menu-dock.d.ts +21 -0
  117. package/dist/backends/gui/menu-dock.d.ts.map +1 -0
  118. package/dist/backends/gui/menu-dock.js +62 -0
  119. package/dist/backends/gui/menu-dock.js.map +1 -0
  120. package/dist/backends/gui/menubar.cjs +227 -0
  121. package/dist/backends/gui/menubar.d.ts +106 -0
  122. package/dist/backends/gui/menubar.d.ts.map +1 -0
  123. package/dist/backends/gui/menubar.js +177 -0
  124. package/dist/backends/gui/menubar.js.map +1 -0
  125. package/dist/backends/gui/message-dock.cjs +111 -0
  126. package/dist/backends/gui/message-dock.d.ts +22 -0
  127. package/dist/backends/gui/message-dock.d.ts.map +1 -0
  128. package/dist/backends/gui/message-dock.js +110 -0
  129. package/dist/backends/gui/message-dock.js.map +1 -0
  130. package/dist/backends/gui/mini-calendar.cjs +25 -0
  131. package/dist/backends/gui/mini-calendar.d.ts +22 -0
  132. package/dist/backends/gui/mini-calendar.d.ts.map +1 -0
  133. package/dist/backends/gui/mini-calendar.js +24 -0
  134. package/dist/backends/gui/mini-calendar.js.map +1 -0
  135. package/dist/backends/gui/minimal-tiptap.cjs +56 -0
  136. package/dist/backends/gui/minimal-tiptap.d.ts +20 -0
  137. package/dist/backends/gui/minimal-tiptap.d.ts.map +1 -0
  138. package/dist/backends/gui/minimal-tiptap.js +21 -0
  139. package/dist/backends/gui/minimal-tiptap.js.map +1 -0
  140. package/dist/backends/gui/motion-highlight.cjs +83 -0
  141. package/dist/backends/gui/motion-highlight.d.ts +27 -0
  142. package/dist/backends/gui/motion-highlight.d.ts.map +1 -0
  143. package/dist/backends/gui/motion-highlight.js +48 -0
  144. package/dist/backends/gui/motion-highlight.js.map +1 -0
  145. package/dist/backends/gui/navigation-bar.cjs +47 -0
  146. package/dist/backends/gui/navigation-bar.d.ts +48 -0
  147. package/dist/backends/gui/navigation-bar.d.ts.map +1 -0
  148. package/dist/backends/gui/navigation-bar.js +45 -0
  149. package/dist/backends/gui/navigation-bar.js.map +1 -0
  150. package/dist/backends/gui/news-timeline.cjs +47 -0
  151. package/dist/backends/gui/news-timeline.d.ts +39 -0
  152. package/dist/backends/gui/news-timeline.d.ts.map +1 -0
  153. package/dist/backends/gui/news-timeline.js +45 -0
  154. package/dist/backends/gui/news-timeline.js.map +1 -0
  155. package/dist/backends/gui/order-entry.cjs +53 -0
  156. package/dist/backends/gui/order-entry.d.ts +21 -0
  157. package/dist/backends/gui/order-entry.d.ts.map +1 -0
  158. package/dist/backends/gui/order-entry.js +52 -0
  159. package/dist/backends/gui/order-entry.js.map +1 -0
  160. package/dist/backends/gui/orders-history.cjs +102 -0
  161. package/dist/backends/gui/orders-history.d.ts +24 -0
  162. package/dist/backends/gui/orders-history.d.ts.map +1 -0
  163. package/dist/backends/gui/orders-history.js +67 -0
  164. package/dist/backends/gui/orders-history.js.map +1 -0
  165. package/dist/backends/gui/pagination.cjs +51 -0
  166. package/dist/backends/gui/pagination.d.ts +52 -0
  167. package/dist/backends/gui/pagination.d.ts.map +1 -0
  168. package/dist/backends/gui/pagination.js +42 -0
  169. package/dist/backends/gui/pagination.js.map +1 -0
  170. package/dist/backends/gui/particles-background.cjs +135 -0
  171. package/dist/backends/gui/particles-background.d.ts +24 -0
  172. package/dist/backends/gui/particles-background.d.ts.map +1 -0
  173. package/dist/backends/gui/particles-background.js +133 -0
  174. package/dist/backends/gui/particles-background.js.map +1 -0
  175. package/dist/backends/gui/particles.cjs +145 -0
  176. package/dist/backends/gui/particles.d.ts +25 -0
  177. package/dist/backends/gui/particles.d.ts.map +1 -0
  178. package/dist/backends/gui/particles.js +143 -0
  179. package/dist/backends/gui/particles.js.map +1 -0
  180. package/dist/backends/gui/pill.cjs +82 -0
  181. package/dist/backends/gui/pill.d.ts +12 -0
  182. package/dist/backends/gui/pill.d.ts.map +1 -0
  183. package/dist/backends/gui/pill.js +78 -0
  184. package/dist/backends/gui/pill.js.map +1 -0
  185. package/dist/backends/gui/pin-list.cjs +82 -0
  186. package/dist/backends/gui/pin-list.d.ts +42 -0
  187. package/dist/backends/gui/pin-list.d.ts.map +1 -0
  188. package/dist/backends/gui/pin-list.js +80 -0
  189. package/dist/backends/gui/pin-list.js.map +1 -0
  190. package/dist/backends/gui/pixel-image.cjs +63 -0
  191. package/dist/backends/gui/pixel-image.d.ts +21 -0
  192. package/dist/backends/gui/pixel-image.d.ts.map +1 -0
  193. package/dist/backends/gui/pixel-image.js +61 -0
  194. package/dist/backends/gui/pixel-image.js.map +1 -0
  195. package/dist/backends/gui/positions-list.cjs +60 -0
  196. package/dist/backends/gui/positions-list.d.ts +14 -0
  197. package/dist/backends/gui/positions-list.d.ts.map +1 -0
  198. package/dist/backends/gui/positions-list.js +58 -0
  199. package/dist/backends/gui/positions-list.js.map +1 -0
  200. package/dist/backends/gui/qr-code.cjs +438 -0
  201. package/dist/backends/gui/qr-code.d.ts +42 -0
  202. package/dist/backends/gui/qr-code.d.ts.map +1 -0
  203. package/dist/backends/gui/qr-code.js +402 -0
  204. package/dist/backends/gui/qr-code.js.map +1 -0
  205. package/dist/backends/gui/relative-time.cjs +167 -0
  206. package/dist/backends/gui/relative-time.d.ts +10 -0
  207. package/dist/backends/gui/relative-time.d.ts.map +1 -0
  208. package/dist/backends/gui/relative-time.js +132 -0
  209. package/dist/backends/gui/relative-time.js.map +1 -0
  210. package/dist/backends/gui/safari.cjs +65 -0
  211. package/dist/backends/gui/safari.d.ts +23 -0
  212. package/dist/backends/gui/safari.d.ts.map +1 -0
  213. package/dist/backends/gui/safari.js +63 -0
  214. package/dist/backends/gui/safari.js.map +1 -0
  215. package/dist/backends/gui/snippet.cjs +144 -0
  216. package/dist/backends/gui/snippet.d.ts +38 -0
  217. package/dist/backends/gui/snippet.d.ts.map +1 -0
  218. package/dist/backends/gui/snippet.js +141 -0
  219. package/dist/backends/gui/snippet.js.map +1 -0
  220. package/dist/backends/gui/stars-scrolling-wheel.cjs +106 -0
  221. package/dist/backends/gui/stars-scrolling-wheel.d.ts +24 -0
  222. package/dist/backends/gui/stars-scrolling-wheel.d.ts.map +1 -0
  223. package/dist/backends/gui/stars-scrolling-wheel.js +104 -0
  224. package/dist/backends/gui/stars-scrolling-wheel.js.map +1 -0
  225. package/dist/backends/gui/status.cjs +79 -0
  226. package/dist/backends/gui/status.d.ts +15 -0
  227. package/dist/backends/gui/status.d.ts.map +1 -0
  228. package/dist/backends/gui/status.js +77 -0
  229. package/dist/backends/gui/status.js.map +1 -0
  230. package/dist/backends/gui/stock-market.cjs +21 -0
  231. package/dist/backends/gui/stock-market.d.ts +17 -0
  232. package/dist/backends/gui/stock-market.d.ts.map +1 -0
  233. package/dist/backends/gui/stock-market.js +19 -0
  234. package/dist/backends/gui/stock-market.js.map +1 -0
  235. package/dist/backends/gui/stock-screener.cjs +55 -0
  236. package/dist/backends/gui/stock-screener.d.ts +41 -0
  237. package/dist/backends/gui/stock-screener.d.ts.map +1 -0
  238. package/dist/backends/gui/stock-screener.js +53 -0
  239. package/dist/backends/gui/stock-screener.js.map +1 -0
  240. package/dist/backends/gui/symbol-info.cjs +46 -0
  241. package/dist/backends/gui/symbol-info.d.ts +36 -0
  242. package/dist/backends/gui/symbol-info.d.ts.map +1 -0
  243. package/dist/backends/gui/symbol-info.js +44 -0
  244. package/dist/backends/gui/symbol-info.js.map +1 -0
  245. package/dist/backends/gui/table.cjs +104 -0
  246. package/dist/backends/gui/table.d.ts +57 -0
  247. package/dist/backends/gui/table.d.ts.map +1 -0
  248. package/dist/backends/gui/table.js +95 -0
  249. package/dist/backends/gui/table.js.map +1 -0
  250. package/dist/backends/gui/tags.cjs +22 -0
  251. package/dist/backends/gui/tags.d.ts +22 -0
  252. package/dist/backends/gui/tags.d.ts.map +1 -0
  253. package/dist/backends/gui/tags.js +20 -0
  254. package/dist/backends/gui/tags.js.map +1 -0
  255. package/dist/backends/gui/technical-analysis.cjs +58 -0
  256. package/dist/backends/gui/technical-analysis.d.ts +41 -0
  257. package/dist/backends/gui/technical-analysis.d.ts.map +1 -0
  258. package/dist/backends/gui/technical-analysis.js +56 -0
  259. package/dist/backends/gui/technical-analysis.js.map +1 -0
  260. package/dist/backends/gui/terminal.cjs +266 -0
  261. package/dist/backends/gui/terminal.d.ts +38 -0
  262. package/dist/backends/gui/terminal.d.ts.map +1 -0
  263. package/dist/backends/gui/terminal.js +231 -0
  264. package/dist/backends/gui/terminal.js.map +1 -0
  265. package/dist/backends/gui/ticker.cjs +79 -0
  266. package/dist/backends/gui/ticker.d.ts +19 -0
  267. package/dist/backends/gui/ticker.d.ts.map +1 -0
  268. package/dist/backends/gui/ticker.js +44 -0
  269. package/dist/backends/gui/ticker.js.map +1 -0
  270. package/dist/backends/gui/timeline.cjs +154 -0
  271. package/dist/backends/gui/timeline.d.ts +42 -0
  272. package/dist/backends/gui/timeline.d.ts.map +1 -0
  273. package/dist/backends/gui/timeline.js +118 -0
  274. package/dist/backends/gui/timeline.js.map +1 -0
  275. package/dist/backends/gui/toggle.cjs +96 -0
  276. package/dist/backends/gui/toggle.d.ts +29 -0
  277. package/dist/backends/gui/toggle.d.ts.map +1 -0
  278. package/dist/backends/gui/toggle.js +95 -0
  279. package/dist/backends/gui/toggle.js.map +1 -0
  280. package/dist/backends/gui/video-player.cjs +383 -0
  281. package/dist/backends/gui/video-player.d.ts +54 -0
  282. package/dist/backends/gui/video-player.d.ts.map +1 -0
  283. package/dist/backends/gui/video-player.js +348 -0
  284. package/dist/backends/gui/video-player.js.map +1 -0
  285. package/dist/gallery.html +249 -249
  286. package/dist/gui-config.cjs +5 -0
  287. package/dist/gui-config.d.ts +18 -3
  288. package/dist/gui-config.d.ts.map +1 -1
  289. package/dist/gui-config.js +5 -0
  290. package/dist/gui-config.js.map +1 -1
  291. package/dist/index.cjs +110 -1
  292. package/dist/index.d.ts +1 -1
  293. package/dist/index.d.ts.map +1 -1
  294. package/dist/index.js +1 -1
  295. package/dist/index.js.map +1 -1
  296. package/dist/index.node.cjs +110 -1
  297. package/dist/index.node.js +1 -1
  298. package/dist/styles.css +124 -124
  299. package/package.json +1 -1
@@ -1,211 +1,171 @@
1
1
  'use client';"use strict";
2
2
  'use client';
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || (function () {
20
- var ownKeys = function(o) {
21
- ownKeys = Object.getOwnPropertyNames || function (o) {
22
- var ar = [];
23
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
- return ar;
25
- };
26
- return ownKeys(o);
27
- };
28
- return function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- })();
36
3
  Object.defineProperty(exports, "__esModule", { value: true });
37
4
  exports.DataTable = DataTable;
38
5
  exports.DataTableColumnHeader = DataTableColumnHeader;
39
6
  const jsx_runtime_1 = require("react/jsx-runtime");
40
7
  /**
41
- * DataTable — a table over an array, with sorting, a text filter, column
42
- * visibility, row selection and pagination composed from one column list.
8
+ * DataTable — a sortable, filterable, paginated grid over an array of rows,
9
+ * driven by a column-definition array exactly the way the upstream guide's
10
+ * `ColumnDef[]` is: a column names an `accessorKey`, an optional `header` and
11
+ * `cell` renderer, and whether it can be sorted or hidden. Two ids carry
12
+ * meaning by convention, matched by the reference implementation's own demo —
13
+ * a column `id: 'select'` gets its checkbox for free, everything else (an
14
+ * `id: 'actions'` column included) is rendered by whatever `cell` you give it.
43
15
  *
44
- * A column names an `accessorKey` and, only where the default text rendering
45
- * is not enough, a `header`/`cell` render function; the render functions get a
46
- * `column`/`table` handle shaped like the one a caller already knows from
47
- * TanStack Table (`getIsSorted`, `toggleSorting`, `getIsSelected`, …), so a
48
- * column list ports over by keeping its shape and dropping only the
49
- * `ColumnDef` import. Rows keep the identity of their position in `data`, so
50
- * selection survives a sort or a filter.
16
+ * There is no TanStack Table here: the workspace does not carry it, and a
17
+ * generic column model over a plain array needs none of what a headless
18
+ * library buys a real backend — grouping, virtualization, server-side
19
+ * pagination. Sorting, filtering, visibility, selection and pagination are
20
+ * ~120 lines of arithmetic over arrays, kept in one `useState` each, matching
21
+ * the guide's own `SortingState`/`ColumnFiltersState`/`VisibilityState` split.
51
22
  *
52
- * The grid is ONE `Grid` (`../../grid`), header and body cells alike, so every
53
- * column shares one set of tracks; each row is a `display: contents` wrapper
54
- * carrying `role="row"` so the cells inside stay direct grid children (Grid's
55
- * own note: `grid-column` only reaches a direct child) while still grouping
56
- * into a real accessible row.
23
+ * The grid is `@hanzo/ui`'s own `Grid`/`Cell` — a real CSS grid, which is the
24
+ * one correct host for a two-dimensional layout — with the WAI-ARIA
25
+ * `table`/`row`/`columnheader`/`cell` roles standing in for the semantics a
26
+ * native `<table>` would otherwise carry.
57
27
  */
58
28
  const gui_1 = require("@hanzo/gui");
59
29
  const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
60
- const React = __importStar(require("react"));
30
+ const react_1 = require("react");
61
31
  const grid_1 = require("../../grid.cjs");
62
32
  const button_1 = require("./button.cjs");
63
33
  const checkbox_1 = require("./checkbox.cjs");
64
34
  const dropdown_menu_1 = require("./dropdown-menu.cjs");
35
+ const ink_1 = require("./ink.cjs");
65
36
  const input_1 = require("./input.cjs");
66
37
  const slot_1 = require("./slot.cjs");
67
- const resolve = (def) => ({
68
- id: def.id ?? (def.accessorKey != null ? String(def.accessorKey) : ''),
69
- def,
70
- });
71
- const cycle = (current, id, desc) => {
72
- if (typeof desc === 'boolean')
73
- return { id, desc };
74
- if (!current || current.id !== id)
75
- return { id, desc: false };
76
- return current.desc ? null : { id, desc: true };
38
+ /**
39
+ * A column's header cell: plain text when the column cannot sort, otherwise a
40
+ * button that toggles ascending/descending and shows which way it is set —
41
+ * the same affordance the reference `data-table-demo.tsx` wires up by hand.
42
+ */
43
+ function DataTableColumnHeader({ column, title, className }) {
44
+ if (!column.getCanSort())
45
+ return ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", fontWeight: "600", color: "$quiet", className: className, children: title }));
46
+ const sorted = column.getIsSorted();
47
+ return ((0, jsx_runtime_1.jsxs)(button_1.Button, { ...(0, slot_1.slot)('data-table-column-header'), variant: "ghost", size: "sm", className: className, onClick: () => column.toggleSorting(sorted === 'asc'), children: [title, sorted === 'desc' ? (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ArrowDown, { size: 14 }) : sorted === 'asc' ? (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ArrowUp, { size: 14 }) : (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ArrowUpDown, { size: 14 })] }));
48
+ }
49
+ const cellValue = (column, row) => column.accessorKey !== undefined ? row[column.accessorKey] : undefined;
50
+ const sortKey = (column, row) => {
51
+ if (column.sortingValue)
52
+ return column.sortingValue(row);
53
+ const v = cellValue(column, row);
54
+ return typeof v === 'number' ? v : String(v ?? '');
77
55
  };
78
- function DataTable({ columns, data, filterColumnId, filterPlaceholder = 'Filter…', pageSize = 10, emptyMessage = 'No results.', }) {
79
- const resolved = React.useMemo(() => columns.map(resolve), [columns]);
80
- const [sorting, setSorting] = React.useState(null);
81
- const [filterValue, setFilterValue] = React.useState('');
82
- const [hidden, setHidden] = React.useState({});
83
- const [selected, setSelected] = React.useState({});
84
- const [pageIndex, setPageIndex] = React.useState(0);
85
- const withIndex = React.useMemo(() => data.map((original, index) => ({ original, index })), [data]);
86
- const filtered = React.useMemo(() => {
87
- if (!filterColumnId || filterValue === '')
88
- return withIndex;
89
- const needle = filterValue.toLowerCase();
90
- return withIndex.filter(({ original }) => {
91
- const value = original[filterColumnId];
92
- return String(value ?? '').toLowerCase().includes(needle);
93
- });
94
- }, [withIndex, filterColumnId, filterValue]);
95
- const sorted = React.useMemo(() => {
56
+ const filterText = (column, row) => column.filterValue ? column.filterValue(row) : String(cellValue(column, row) ?? '');
57
+ const track = (width) => width === undefined ? '1fr' : typeof width === 'number' ? `${width}px` : width;
58
+ const justify = (a) => a === 'right' ? 'flex-end' : a === 'center' ? 'center' : 'flex-start';
59
+ function DataTable({ columns, data, getRowId, filterColumnId, filterPlaceholder = 'Filter…', pageSize = 0, emptyMessage = 'No results.', onRowSelectionChange, }) {
60
+ const [sorting, setSorting] = (0, react_1.useState)(null);
61
+ const [filter, setFilter] = (0, react_1.useState)('');
62
+ const [hidden, setHidden] = (0, react_1.useState)({});
63
+ const [selected, setSelected] = (0, react_1.useState)({});
64
+ const [pageIndex, setPageIndex] = (0, react_1.useState)(0);
65
+ const withIds = (0, react_1.useMemo)(() => data.map((row, i) => ({ row, id: getRowId ? getRowId(row, i) : String(i) })), [data, getRowId]);
66
+ const filterColumn = filterColumnId ? columns.find((c) => c.id === filterColumnId) : undefined;
67
+ const filtered = (0, react_1.useMemo)(() => {
68
+ if (!filterColumn || filter.trim() === '')
69
+ return withIds;
70
+ const needle = filter.toLowerCase();
71
+ return withIds.filter(({ row }) => filterText(filterColumn, row).toLowerCase().includes(needle));
72
+ }, [withIds, filterColumn, filter]);
73
+ const sorted = (0, react_1.useMemo)(() => {
96
74
  if (!sorting)
97
75
  return filtered;
98
- const col = resolved.find((c) => c.id === sorting.id);
99
- if (!col?.def.accessorKey)
76
+ const column = columns.find((c) => c.id === sorting.id);
77
+ if (!column)
100
78
  return filtered;
101
- const key = col.def.accessorKey;
102
- const dir = sorting.desc ? -1 : 1;
103
- return [...filtered].sort((a, b) => {
104
- const av = a.original[key];
105
- const bv = b.original[key];
106
- if (av == null && bv == null)
107
- return 0;
108
- if (av == null)
109
- return -1 * dir;
110
- if (bv == null)
111
- return 1 * dir;
112
- return av > bv ? dir : av < bv ? -dir : 0;
113
- });
114
- }, [filtered, sorting, resolved]);
115
- const paginate = pageSize > 0;
116
- const pageCount = paginate ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1;
117
- const clampedPageIndex = Math.min(pageIndex, pageCount - 1);
118
- const pageRows = paginate
119
- ? sorted.slice(clampedPageIndex * pageSize, clampedPageIndex * pageSize + pageSize)
120
- : sorted;
121
- const makeColumn = React.useCallback((col) => ({
122
- id: col.id,
123
- getIsSorted: () => (sorting && sorting.id === col.id ? (sorting.desc ? 'desc' : 'asc') : false),
124
- toggleSorting: (desc) => setSorting((prev) => cycle(prev, col.id, desc)),
125
- getCanHide: () => col.def.enableHiding !== false,
126
- getIsVisible: () => hidden[col.id] !== true,
127
- toggleVisibility: (visible) => setHidden((prev) => {
128
- const isHidden = prev[col.id] === true;
129
- const nextHidden = visible === undefined ? !isHidden : !visible;
130
- return { ...prev, [col.id]: nextHidden };
131
- }),
132
- }), [sorting, hidden]);
133
- const makeRow = React.useCallback((index, original) => {
134
- const id = String(index);
135
- return {
136
- id,
137
- original,
138
- getValue: (columnId) => {
139
- const col = resolved.find((c) => c.id === columnId);
140
- return col?.def.accessorKey ? original[col.def.accessorKey] : undefined;
141
- },
142
- getIsSelected: () => selected[id] === true,
143
- toggleSelected: (value) => setSelected((prev) => ({ ...prev, [id]: value === undefined ? !prev[id] : value })),
144
- };
145
- }, [resolved, selected]);
146
- const instance = React.useMemo(() => ({
147
- getAllColumns: () => resolved.map(makeColumn),
79
+ const keyed = filtered.map((entry) => ({ entry, key: sortKey(column, entry.row) }));
80
+ keyed.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
81
+ if (sorting.desc)
82
+ keyed.reverse();
83
+ return keyed.map((k) => k.entry);
84
+ }, [filtered, columns, sorting]);
85
+ const pageCount = pageSize > 0 ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1;
86
+ const paged = pageSize > 0 ? sorted.slice(pageIndex * pageSize, pageIndex * pageSize + pageSize) : sorted;
87
+ const visibleColumns = columns.filter((c) => hidden[c.id] !== true);
88
+ const hideable = columns.filter((c) => c.enableHiding !== false);
89
+ const setSelectedFor = (id, value) => {
90
+ const next = { ...selected, [id]: value };
91
+ setSelected(next);
92
+ onRowSelectionChange?.(withIds.filter((e) => next[e.id]).map((e) => e.row));
93
+ };
94
+ const toggleAllPage = (value) => {
95
+ const next = { ...selected };
96
+ for (const entry of paged)
97
+ next[entry.id] = value;
98
+ setSelected(next);
99
+ onRowSelectionChange?.(withIds.filter((e) => next[e.id]).map((e) => e.row));
100
+ };
101
+ const rowApi = (entry) => ({
102
+ id: entry.id,
103
+ original: entry.row,
104
+ getValue: (columnId) => {
105
+ const column = columns.find((c) => c.id === columnId);
106
+ return column ? cellValue(column, entry.row) : undefined;
107
+ },
108
+ getIsSelected: () => selected[entry.id] === true,
109
+ toggleSelected: (value) => setSelectedFor(entry.id, value ?? !selected[entry.id]),
110
+ });
111
+ const columnApi = (column) => ({
112
+ id: column.id,
113
+ getCanSort: () => column.enableSorting !== false,
114
+ getIsSorted: () => (sorting?.id === column.id ? (sorting.desc ? 'desc' : 'asc') : false),
115
+ toggleSorting: (desc = false) => {
116
+ if (column.enableSorting === false)
117
+ return;
118
+ setSorting({ id: column.id, desc });
119
+ },
120
+ getCanHide: () => column.enableHiding !== false,
121
+ getIsVisible: () => hidden[column.id] !== true,
122
+ toggleVisibility: (visible) => setHidden((h) => ({ ...h, [column.id]: visible === undefined ? h[column.id] !== true : !visible })),
123
+ });
124
+ const pageIds = paged.map((e) => e.id);
125
+ const allPageSelected = pageIds.length > 0 && pageIds.every((id) => selected[id]);
126
+ const somePageSelected = pageIds.some((id) => selected[id]);
127
+ const table = {
148
128
  getColumn: (id) => {
149
- const col = resolved.find((c) => c.id === id);
150
- return col ? makeColumn(col) : undefined;
129
+ const column = columns.find((c) => c.id === id);
130
+ return column ? columnApi(column) : undefined;
151
131
  },
152
- getIsAllPageRowsSelected: () => pageRows.length > 0 && pageRows.every(({ index }) => selected[String(index)] === true),
153
- getIsSomePageRowsSelected: () => pageRows.some(({ index }) => selected[String(index)] === true) &&
154
- !pageRows.every(({ index }) => selected[String(index)] === true),
155
- toggleAllPageRowsSelected: (value) => setSelected((prev) => {
156
- const allSelected = pageRows.every(({ index }) => prev[String(index)] === true);
157
- const next = value === undefined ? !allSelected : value;
158
- const out = { ...prev };
159
- for (const { index } of pageRows)
160
- out[String(index)] = next;
161
- return out;
162
- }),
163
- getFilteredRowModel: () => ({ rows: sorted.map(({ original, index }) => makeRow(index, original)) }),
164
- getFilteredSelectedRowModel: () => ({
165
- rows: sorted.filter(({ index }) => selected[String(index)] === true).map(({ original, index }) => makeRow(index, original)),
166
- }),
132
+ getAllColumns: () => columns.map(columnApi),
133
+ getRowModel: () => ({ rows: paged.map(rowApi) }),
134
+ getFilteredRowModel: () => ({ rows: filtered.map(rowApi) }),
135
+ getFilteredSelectedRowModel: () => ({ rows: filtered.filter((e) => selected[e.id]).map(rowApi) }),
136
+ getIsAllPageRowsSelected: () => allPageSelected,
137
+ getIsSomePageRowsSelected: () => somePageSelected,
138
+ toggleAllPageRowsSelected: (value) => toggleAllPage(value ?? !allPageSelected),
139
+ getCanPreviousPage: () => pageIndex > 0,
140
+ getCanNextPage: () => pageIndex < pageCount - 1,
167
141
  previousPage: () => setPageIndex((p) => Math.max(0, p - 1)),
168
142
  nextPage: () => setPageIndex((p) => Math.min(pageCount - 1, p + 1)),
169
- getCanPreviousPage: () => clampedPageIndex > 0,
170
- getCanNextPage: () => clampedPageIndex < pageCount - 1,
171
- }), [resolved, makeColumn, makeRow, pageRows, sorted, selected, pageCount, clampedPageIndex]);
172
- const visible = resolved.filter((c) => hidden[c.id] !== true);
173
- const hideable = resolved.filter((c) => c.def.enableHiding !== false);
174
- const hasSelectColumn = resolved.some((c) => c.id === 'select');
175
- const selectedCount = instance.getFilteredSelectedRowModel().rows.length;
176
- const totalCount = instance.getFilteredRowModel().rows.length;
177
- const align = (a) => a === 'right' ? 'right' : a === 'center' ? 'center' : 'left';
178
- return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$3", width: "100%", ...(0, slot_1.slot)('data-table'), children: [(filterColumnId || hideable.length > 0) && ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { items: "center", justify: "space-between", gap: "$3", ...(0, slot_1.slot)('data-table-toolbar'), children: [filterColumnId ? ((0, jsx_runtime_1.jsx)(input_1.Input, { placeholder: filterPlaceholder, value: filterValue, onChangeText: setFilterValue, maxW: 360, flex: 1, ...(0, slot_1.slot)('data-table-filter') })) : ((0, jsx_runtime_1.jsx)(gui_1.XStack, { flex: 1 })), hideable.length > 0 && ((0, jsx_runtime_1.jsxs)(dropdown_menu_1.DropdownMenu, { children: [(0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuTrigger, { asChild: true, children: (0, jsx_runtime_1.jsxs)(button_1.Button, { variant: "outline", size: "sm", ...(0, slot_1.slot)('data-table-view-options'), children: ["Columns ", (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ChevronDown, { size: 14 })] }) }), (0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuContent, { align: "end", children: hideable.map((col) => {
179
- const api = makeColumn(col);
180
- return ((0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuCheckboxItem, { checked: api.getIsVisible(), onCheckedChange: (value) => api.toggleVisibility(!!value), children: col.id }, col.id));
181
- }) })] }))] })), (0, jsx_runtime_1.jsx)(gui_1.YStack, { borderWidth: 1, borderColor: "$borderColor", rounded: "$4", overflow: "hidden", children: (0, jsx_runtime_1.jsxs)(grid_1.Grid, { columns: visible.length || 1, gap: 0, role: "table", ...(0, slot_1.slot)('data-table-grid'), children: [(0, jsx_runtime_1.jsx)("div", { role: "row", style: { display: 'contents' }, ...(0, slot_1.slot)('data-table-header-row'), children: visible.map((col) => {
182
- const api = makeColumn(col);
183
- const isSelectCol = col.id === 'select' && !col.def.header;
184
- const content = isSelectCol ? ((0, jsx_runtime_1.jsx)(checkbox_1.Checkbox, { "aria-label": "Select all", checked: instance.getIsAllPageRowsSelected() ? true : instance.getIsSomePageRowsSelected() ? 'indeterminate' : false, onCheckedChange: (value) => instance.toggleAllPageRowsSelected(!!value) })) : typeof col.def.header === 'function' ? (col.def.header({ column: api, table: instance })) : col.def.header !== undefined ? (col.def.header) : ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { fontWeight: "600", color: "$quiet", children: col.id }));
185
- return ((0, jsx_runtime_1.jsx)(grid_1.Cell, { role: "columnheader", "aria-sort": api.getIsSorted() === 'asc' ? 'ascending' : api.getIsSorted() === 'desc' ? 'descending' : 'none', style: {
186
- padding: 12,
187
- borderBottom: '1px solid var(--edge)',
188
- textAlign: align(col.def.align),
189
- }, ...(0, slot_1.slot)('data-table-head'), children: content }, col.id));
190
- }) }), pageRows.length ? (pageRows.map(({ original, index }, position) => {
191
- const row = makeRow(index, original);
192
- const isSelected = row.getIsSelected();
193
- const isLastRow = position === pageRows.length - 1;
194
- return ((0, jsx_runtime_1.jsx)("div", { role: "row", "data-state": isSelected ? 'selected' : undefined, style: { display: 'contents' }, ...(0, slot_1.slot)('data-table-row'), children: visible.map((col) => {
195
- const isSelectCol = col.id === 'select' && !col.def.cell;
196
- const content = isSelectCol ? ((0, jsx_runtime_1.jsx)(checkbox_1.Checkbox, { "aria-label": "Select row", checked: isSelected, onCheckedChange: (value) => row.toggleSelected(!!value) })) : col.def.cell ? (col.def.cell({ row, table: instance })) : ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { children: String(row.getValue(col.id) ?? '') }));
197
- return ((0, jsx_runtime_1.jsx)(grid_1.Cell, { role: "cell", style: {
198
- padding: 12,
199
- borderBottom: isLastRow ? undefined : '1px solid var(--edge)',
200
- textAlign: align(col.def.align),
201
- background: isSelected ? 'var(--hover)' : undefined,
202
- }, ...(0, slot_1.slot)('data-table-cell'), children: content }, col.id));
203
- }) }, row.id));
204
- })) : ((0, jsx_runtime_1.jsx)("div", { role: "row", style: { display: 'contents' }, children: (0, jsx_runtime_1.jsx)(grid_1.Cell, { col: visible.length || 1, role: "cell", style: { padding: 24, textAlign: 'center' }, ...(0, slot_1.slot)('data-table-empty'), children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { color: "$quiet", children: emptyMessage }) }) }))] }) }), (hasSelectColumn || paginate) && ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { items: "center", justify: "space-between", gap: "$3", ...(0, slot_1.slot)('data-table-pagination'), children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { fontSize: "$1", color: "$quiet", children: hasSelectColumn ? `${selectedCount} of ${totalCount} row(s) selected.` : '' }), paginate && ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { gap: "$2", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { variant: "outline", size: "sm", disabled: !instance.getCanPreviousPage(), onPress: instance.previousPage, children: "Previous" }), (0, jsx_runtime_1.jsx)(button_1.Button, { variant: "outline", size: "sm", disabled: !instance.getCanNextPage(), onPress: instance.nextPage, children: "Next" })] }))] }))] }));
205
- }
206
- /** A sortable header cell: a ghost button whose icon shows the active direction. */
207
- function DataTableColumnHeader({ column, title }) {
208
- const direction = column.getIsSorted();
209
- const Icon = direction === 'asc' ? lucide_icons_2_1.ChevronUp : direction === 'desc' ? lucide_icons_2_1.ChevronDown : lucide_icons_2_1.ChevronsUpDown;
210
- return ((0, jsx_runtime_1.jsxs)(button_1.Button, { variant: "ghost", size: "sm", onPress: () => column.toggleSorting(direction === 'asc'), ...(0, slot_1.slot)('data-table-column-header'), children: [title, (0, jsx_runtime_1.jsx)(Icon, { size: 14 })] }));
143
+ getPageCount: () => pageCount,
144
+ };
145
+ const selectedCount = table.getFilteredSelectedRowModel().rows.length;
146
+ const filteredCount = table.getFilteredRowModel().rows.length;
147
+ const trackList = visibleColumns.map((c) => track(c.width)).join(' ');
148
+ const headerContent = (column) => {
149
+ if (column.id === 'select')
150
+ return ((0, jsx_runtime_1.jsx)(checkbox_1.Checkbox, { "aria-label": "Select all", checked: allPageSelected ? true : somePageSelected ? 'indeterminate' : false, onCheckedChange: (value) => toggleAllPage(!!value) }));
151
+ if (typeof column.header === 'function')
152
+ return column.header({ column: columnApi(column) });
153
+ return (0, ink_1.ink)(column.header ?? column.id, gui_1.SizableText, { size: '$2', fontWeight: '600', color: '$quiet' });
154
+ };
155
+ const cellContent = (column, entry) => {
156
+ if (column.id === 'select')
157
+ return ((0, jsx_runtime_1.jsx)(checkbox_1.Checkbox, { "aria-label": "Select row", checked: selected[entry.id] === true, onCheckedChange: (value) => setSelectedFor(entry.id, !!value) }));
158
+ if (column.cell)
159
+ return column.cell({ row: rowApi(entry) });
160
+ return (0, ink_1.ink)(String(cellValue(column, entry.row) ?? ''), gui_1.SizableText, { size: '$2' });
161
+ };
162
+ const ariaSort = (column) => {
163
+ if (sorting?.id !== column.id)
164
+ return 'none';
165
+ return sorting.desc ? 'descending' : 'ascending';
166
+ };
167
+ return ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { ...(0, slot_1.slot)('data-table'), width: "100%", gap: "$3", children: [(filterColumnId || hideable.length > 0) && ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('data-table-toolbar'), items: "center", gap: "$2", children: [filterColumnId && ((0, jsx_runtime_1.jsx)(input_1.Input, { ...(0, slot_1.slot)('data-table-filter'), placeholder: filterPlaceholder, value: filter, onChangeText: setFilter, maxW: 360, width: "100%" })), hideable.length > 0 && ((0, jsx_runtime_1.jsxs)(dropdown_menu_1.DropdownMenu, { children: [(0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuTrigger, { asChild: true, children: (0, jsx_runtime_1.jsxs)(button_1.Button, { ...(0, slot_1.slot)('data-table-view-options'), variant: "outline", size: "sm", ml: "auto", children: ["Columns", (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ChevronDown, { size: 14 })] }) }), (0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuContent, { align: "end", children: hideable.map((column) => ((0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuCheckboxItem, { checked: hidden[column.id] !== true, onCheckedChange: (value) => setHidden((h) => ({ ...h, [column.id]: !value })), children: column.id }, column.id))) })] }))] })), (0, jsx_runtime_1.jsxs)(gui_1.YStack, { ...(0, slot_1.slot)('data-table-grid'), role: "table", rounded: "$3", borderWidth: 1, borderColor: "$borderColor", overflow: "hidden", children: [(0, jsx_runtime_1.jsx)(gui_1.YStack, { borderBottomWidth: 1, borderBottomColor: "$borderColor", bg: "$panel", children: (0, jsx_runtime_1.jsx)(grid_1.Grid, { role: "row", ...(0, slot_1.slot)('data-table-header-row'), columns: trackList, gap: 0, children: visibleColumns.map((column) => ((0, jsx_runtime_1.jsx)(grid_1.Cell, { role: "columnheader", "aria-sort": ariaSort(column), ...(0, slot_1.slot)('data-table-head'), style: { display: 'flex', alignItems: 'center', padding: 12, justifyContent: justify(column.align) }, children: headerContent(column) }, column.id))) }) }), paged.length === 0 ? ((0, jsx_runtime_1.jsx)(gui_1.YStack, { ...(0, slot_1.slot)('data-table-empty'), height: 96, items: "center", justify: "center", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$quiet", children: emptyMessage }) })) : (paged.map((entry) => {
168
+ const isSelected = selected[entry.id] === true;
169
+ return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { "data-state": isSelected ? 'selected' : undefined, borderBottomWidth: 1, borderBottomColor: "$borderColor", bg: isSelected ? '$hover' : undefined, children: (0, jsx_runtime_1.jsx)(grid_1.Grid, { role: "row", ...(0, slot_1.slot)('data-table-row'), "data-state": isSelected ? 'selected' : undefined, columns: trackList, gap: 0, children: visibleColumns.map((column) => ((0, jsx_runtime_1.jsx)(grid_1.Cell, { role: "cell", ...(0, slot_1.slot)('data-table-cell'), style: { display: 'flex', alignItems: 'center', padding: 12, justifyContent: justify(column.align) }, children: cellContent(column, entry) }, column.id))) }) }, entry.id));
170
+ }))] }), (0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('data-table-footer'), items: "center", justify: "space-between", children: [(0, jsx_runtime_1.jsxs)(gui_1.SizableText, { size: "$2", color: "$quiet", children: [selectedCount, " of ", filteredCount, " row(s) selected."] }), pageSize > 0 && ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('data-table-pagination'), gap: "$2", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { variant: "outline", size: "sm", disabled: !table.getCanPreviousPage(), "aria-disabled": !table.getCanPreviousPage(), onClick: () => table.previousPage(), children: "Previous" }), (0, jsx_runtime_1.jsx)(button_1.Button, { variant: "outline", size: "sm", disabled: !table.getCanNextPage(), "aria-disabled": !table.getCanNextPage(), onClick: () => table.nextPage(), children: "Next" })] }))] })] }));
211
171
  }
@@ -1,71 +1,91 @@
1
- import * as React from 'react';
1
+ import { type ReactNode } from 'react';
2
+ export type DataTableAlign = 'left' | 'center' | 'right';
2
3
  export type DataTableSortDirection = 'asc' | 'desc' | false;
3
- /** The handle a column's `header` render function gets for its own column. */
4
- export interface DataTableColumnApi {
5
- id: string;
4
+ /** What a column can be asked and told, independent of any one row. */
5
+ export interface DataTableColumnApi<TData> {
6
+ readonly id: string;
7
+ getCanSort: () => boolean;
6
8
  getIsSorted: () => DataTableSortDirection;
7
9
  toggleSorting: (desc?: boolean) => void;
8
10
  getCanHide: () => boolean;
9
11
  getIsVisible: () => boolean;
10
12
  toggleVisibility: (visible?: boolean) => void;
11
13
  }
12
- /** The handle a `cell` render function gets for the row it belongs to. */
14
+ /** One row, and the handful of things a `cell` renderer needs from it. */
13
15
  export interface DataTableRow<TData> {
14
- id: string;
15
- original: TData;
16
+ readonly id: string;
17
+ readonly original: TData;
16
18
  getValue: (columnId: string) => unknown;
17
19
  getIsSelected: () => boolean;
18
- toggleSelected: (selected?: boolean) => void;
20
+ toggleSelected: (value?: boolean) => void;
19
21
  }
20
- /** The whole-table handle, for a `select-all` header or a footer count. */
22
+ export interface DataTableColumnDef<TData> {
23
+ id: string;
24
+ /** Read directly off the row when no `cell` is given. */
25
+ accessorKey?: keyof TData;
26
+ header?: ReactNode | ((ctx: {
27
+ column: DataTableColumnApi<TData>;
28
+ }) => ReactNode);
29
+ cell?: (ctx: {
30
+ row: DataTableRow<TData>;
31
+ }) => ReactNode;
32
+ /** A CSS grid track for this column. Defaults to `1fr`. */
33
+ width?: number | string;
34
+ align?: DataTableAlign;
35
+ enableSorting?: boolean;
36
+ enableHiding?: boolean;
37
+ /** The value compared when this column is the active sort. Defaults to `accessorKey`. */
38
+ sortingValue?: (row: TData) => string | number;
39
+ /** The text searched when this column is the active filter. Defaults to `accessorKey`. */
40
+ filterValue?: (row: TData) => string;
41
+ }
42
+ /** The aggregate operations a custom `header`/`cell` can reach for — one
43
+ * object, built fresh each render, mirroring the guide's own `table`. */
21
44
  export interface DataTableInstance<TData> {
22
- getAllColumns: () => DataTableColumnApi[];
23
- getColumn: (id: string) => DataTableColumnApi | undefined;
24
- getIsAllPageRowsSelected: () => boolean;
25
- getIsSomePageRowsSelected: () => boolean;
26
- toggleAllPageRowsSelected: (selected?: boolean) => void;
45
+ getColumn: (id: string) => DataTableColumnApi<TData> | undefined;
46
+ getAllColumns: () => DataTableColumnApi<TData>[];
47
+ getRowModel: () => {
48
+ rows: DataTableRow<TData>[];
49
+ };
27
50
  getFilteredRowModel: () => {
28
- rows: Array<DataTableRow<TData>>;
51
+ rows: DataTableRow<TData>[];
29
52
  };
30
53
  getFilteredSelectedRowModel: () => {
31
- rows: Array<DataTableRow<TData>>;
54
+ rows: DataTableRow<TData>[];
32
55
  };
33
- previousPage: () => void;
34
- nextPage: () => void;
56
+ getIsAllPageRowsSelected: () => boolean;
57
+ getIsSomePageRowsSelected: () => boolean;
58
+ toggleAllPageRowsSelected: (value?: boolean) => void;
35
59
  getCanPreviousPage: () => boolean;
36
60
  getCanNextPage: () => boolean;
37
- }
38
- export interface DataTableColumnDef<TData> {
39
- /** Stable id. Defaults to `String(accessorKey)` when omitted. */
40
- id?: string;
41
- accessorKey?: keyof TData;
42
- header?: React.ReactNode | ((ctx: {
43
- column: DataTableColumnApi;
44
- table: DataTableInstance<TData>;
45
- }) => React.ReactNode);
46
- cell?: (ctx: {
47
- row: DataTableRow<TData>;
48
- table: DataTableInstance<TData>;
49
- }) => React.ReactNode;
50
- enableSorting?: boolean;
51
- enableHiding?: boolean;
52
- align?: 'left' | 'center' | 'right';
61
+ previousPage: () => void;
62
+ nextPage: () => void;
63
+ getPageCount: () => number;
53
64
  }
54
65
  export interface DataTableProps<TData> {
55
- columns: Array<DataTableColumnDef<TData>>;
66
+ columns: DataTableColumnDef<TData>[];
56
67
  data: TData[];
57
- /** Column id filtered by the toolbar's text input. Omit to hide it. */
68
+ /** Identifies a row for selection/sort stability. Defaults to its index. */
69
+ getRowId?: (row: TData, index: number) => string;
70
+ /** The column id the toolbar's text field searches. Omit to hide the field. */
58
71
  filterColumnId?: string;
59
72
  filterPlaceholder?: string;
60
- /** Rows per page. `0` disables pagination (and its footer). Default 10. */
73
+ /** Rows per page. `0` (the default) shows every row with no pager. */
61
74
  pageSize?: number;
62
- emptyMessage?: string;
75
+ emptyMessage?: ReactNode;
76
+ onRowSelectionChange?: (rows: TData[]) => void;
63
77
  }
64
- export declare function DataTable<TData>({ columns, data, filterColumnId, filterPlaceholder, pageSize, emptyMessage, }: DataTableProps<TData>): React.JSX.Element;
65
- export interface DataTableColumnHeaderProps {
66
- column: DataTableColumnApi;
67
- title: string;
78
+ export interface DataTableColumnHeaderProps<TData> {
79
+ column: DataTableColumnApi<TData>;
80
+ title: ReactNode;
81
+ className?: string;
68
82
  }
69
- /** A sortable header cell: a ghost button whose icon shows the active direction. */
70
- export declare function DataTableColumnHeader({ column, title }: DataTableColumnHeaderProps): React.JSX.Element;
83
+ /**
84
+ * A column's header cell: plain text when the column cannot sort, otherwise a
85
+ * button that toggles ascending/descending and shows which way it is set —
86
+ * the same affordance the reference `data-table-demo.tsx` wires up by hand.
87
+ */
88
+ declare function DataTableColumnHeader<TData>({ column, title, className }: DataTableColumnHeaderProps<TData>): import("react").JSX.Element;
89
+ declare function DataTable<TData>({ columns, data, getRowId, filterColumnId, filterPlaceholder, pageSize, emptyMessage, onRowSelectionChange, }: DataTableProps<TData>): import("react").JSX.Element;
90
+ export { DataTable, DataTableColumnHeader };
71
91
  //# sourceMappingURL=data-table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/data-table.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/data-table.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAczD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AACxD,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAE3D,uEAAuE;AACvE,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,OAAO,CAAA;IACzB,WAAW,EAAE,MAAM,sBAAsB,CAAA;IACzC,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,UAAU,EAAE,MAAM,OAAO,CAAA;IACzB,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY,CAAC,KAAK;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IACvC,aAAa,EAAE,MAAM,OAAO,CAAA;IAC5B,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CAC1C;AAED,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,KAAK,CAAA;IACzB,MAAM,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,SAAS,CAAC,CAAA;IAChF,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,SAAS,CAAA;IACvD,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,yFAAyF;IACzF,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,MAAM,GAAG,MAAM,CAAA;IAC9C,0FAA0F;IAC1F,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,MAAM,CAAA;CACrC;AAED;0EAC0E;AAC1E,MAAM,WAAW,iBAAiB,CAAC,KAAK;IACtC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IAChE,aAAa,EAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;IAChD,WAAW,EAAE,MAAM;QAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;KAAE,CAAA;IAClD,mBAAmB,EAAE,MAAM;QAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;KAAE,CAAA;IAC1D,2BAA2B,EAAE,MAAM;QAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;KAAE,CAAA;IAClE,wBAAwB,EAAE,MAAM,OAAO,CAAA;IACvC,yBAAyB,EAAE,MAAM,OAAO,CAAA;IACxC,yBAAyB,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACpD,kBAAkB,EAAE,MAAM,OAAO,CAAA;IACjC,cAAc,EAAE,MAAM,OAAO,CAAA;IAC7B,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,YAAY,EAAE,MAAM,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;IACpC,IAAI,EAAE,KAAK,EAAE,CAAA;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAChD,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,CAAA;CAC/C;AAED,MAAM,WAAW,0BAA0B,CAAC,KAAK;IAC/C,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACjC,KAAK,EAAE,SAAS,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,iBAAS,qBAAqB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,0BAA0B,CAAC,KAAK,CAAC,+BAqBpG;AAsBD,iBAAS,SAAS,CAAC,KAAK,EAAE,EACxB,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,iBAA6B,EAC7B,QAAY,EACZ,YAA4B,EAC5B,oBAAoB,GACrB,EAAE,cAAc,CAAC,KAAK,CAAC,+BA2PvB;AAED,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAA"}