@nori-ui/core 1.4.0 → 1.6.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 (176) hide show
  1. package/dist/Table.shared-BymRgTnY.d.cts +54 -0
  2. package/dist/Table.shared-BymRgTnY.d.ts +54 -0
  3. package/dist/{chunk-HZKXPN6B.js → chunk-2HMQDJ22.js} +4 -4
  4. package/dist/{chunk-HZKXPN6B.js.map → chunk-2HMQDJ22.js.map} +1 -1
  5. package/dist/{chunk-KCLWPSV5.js → chunk-2RL6WCFC.js} +4 -4
  6. package/dist/{chunk-KCLWPSV5.js.map → chunk-2RL6WCFC.js.map} +1 -1
  7. package/dist/{chunk-FDBQOQMW.js → chunk-3BDDPFCI.js} +3 -3
  8. package/dist/{chunk-FDBQOQMW.js.map → chunk-3BDDPFCI.js.map} +1 -1
  9. package/dist/{chunk-WOF67PKT.js → chunk-3CEJ5TB4.js} +3 -3
  10. package/dist/{chunk-WOF67PKT.js.map → chunk-3CEJ5TB4.js.map} +1 -1
  11. package/dist/{chunk-BNDUQNG7.js → chunk-3OIWAS2P.js} +3 -3
  12. package/dist/{chunk-BNDUQNG7.js.map → chunk-3OIWAS2P.js.map} +1 -1
  13. package/dist/{chunk-6JVUVBZH.js → chunk-4PUPKWEP.js} +5 -5
  14. package/dist/{chunk-6JVUVBZH.js.map → chunk-4PUPKWEP.js.map} +1 -1
  15. package/dist/{chunk-6PO2IWB3.js → chunk-4UFAZLSZ.js} +5 -3
  16. package/dist/chunk-4UFAZLSZ.js.map +1 -0
  17. package/dist/{chunk-V2AWSDDZ.js → chunk-5PSC5HT4.js} +8 -125
  18. package/dist/chunk-5PSC5HT4.js.map +1 -0
  19. package/dist/{chunk-LWQZ257T.js → chunk-5XEGZFG5.js} +3 -3
  20. package/dist/{chunk-LWQZ257T.js.map → chunk-5XEGZFG5.js.map} +1 -1
  21. package/dist/{chunk-WAKKQROH.js → chunk-6AD6KCVB.js} +3 -3
  22. package/dist/{chunk-WAKKQROH.js.map → chunk-6AD6KCVB.js.map} +1 -1
  23. package/dist/chunk-73CUV7MW.js +125 -0
  24. package/dist/chunk-73CUV7MW.js.map +1 -0
  25. package/dist/{chunk-GRDVE3IR.js → chunk-BZLT6R62.js} +3 -3
  26. package/dist/{chunk-GRDVE3IR.js.map → chunk-BZLT6R62.js.map} +1 -1
  27. package/dist/{chunk-Y4ZRSW35.js → chunk-CCUXO2HN.js} +3 -3
  28. package/dist/{chunk-Y4ZRSW35.js.map → chunk-CCUXO2HN.js.map} +1 -1
  29. package/dist/{chunk-2UXKXUX2.js → chunk-CPIKN4BX.js} +3 -3
  30. package/dist/{chunk-2UXKXUX2.js.map → chunk-CPIKN4BX.js.map} +1 -1
  31. package/dist/{chunk-46OT4PA6.js → chunk-DDGMLLS3.js} +3 -3
  32. package/dist/{chunk-46OT4PA6.js.map → chunk-DDGMLLS3.js.map} +1 -1
  33. package/dist/{chunk-XP55RZ3D.js → chunk-FEPTH5RV.js} +3 -3
  34. package/dist/{chunk-XP55RZ3D.js.map → chunk-FEPTH5RV.js.map} +1 -1
  35. package/dist/{chunk-MJ4AGXS7.js → chunk-GJMHNEQ3.js} +3 -3
  36. package/dist/{chunk-MJ4AGXS7.js.map → chunk-GJMHNEQ3.js.map} +1 -1
  37. package/dist/{chunk-VCJF75T2.js → chunk-JQQ3FBN7.js} +3 -3
  38. package/dist/{chunk-VCJF75T2.js.map → chunk-JQQ3FBN7.js.map} +1 -1
  39. package/dist/chunk-JXLEMBDB.js +11 -0
  40. package/dist/chunk-JXLEMBDB.js.map +1 -0
  41. package/dist/{chunk-W3HMOOON.js → chunk-JZ774T7U.js} +3 -3
  42. package/dist/{chunk-W3HMOOON.js.map → chunk-JZ774T7U.js.map} +1 -1
  43. package/dist/{chunk-SINLREQV.js → chunk-MKSDYRWQ.js} +3 -3
  44. package/dist/{chunk-SINLREQV.js.map → chunk-MKSDYRWQ.js.map} +1 -1
  45. package/dist/{chunk-AFQIK6JI.js → chunk-MRJWPRCX.js} +3 -3
  46. package/dist/{chunk-AFQIK6JI.js.map → chunk-MRJWPRCX.js.map} +1 -1
  47. package/dist/{chunk-EFK7726V.js → chunk-NF7XG2FG.js} +3 -3
  48. package/dist/{chunk-EFK7726V.js.map → chunk-NF7XG2FG.js.map} +1 -1
  49. package/dist/{chunk-WTNDPO2V.js → chunk-NNFJKRXZ.js} +3 -3
  50. package/dist/{chunk-WTNDPO2V.js.map → chunk-NNFJKRXZ.js.map} +1 -1
  51. package/dist/{chunk-CGQIVFCN.js → chunk-NRYWNOG5.js} +3 -3
  52. package/dist/{chunk-CGQIVFCN.js.map → chunk-NRYWNOG5.js.map} +1 -1
  53. package/dist/{chunk-HTF6FDB6.js → chunk-OMU4R4Y5.js} +3 -3
  54. package/dist/{chunk-HTF6FDB6.js.map → chunk-OMU4R4Y5.js.map} +1 -1
  55. package/dist/{chunk-C6TRLHMW.js → chunk-PABG3IJ6.js} +3 -3
  56. package/dist/{chunk-C6TRLHMW.js.map → chunk-PABG3IJ6.js.map} +1 -1
  57. package/dist/{chunk-RM5TSXVE.js → chunk-PNP7L4TA.js} +3 -3
  58. package/dist/{chunk-RM5TSXVE.js.map → chunk-PNP7L4TA.js.map} +1 -1
  59. package/dist/{chunk-L5X4SYJ4.js → chunk-PZS4A4VQ.js} +3 -3
  60. package/dist/{chunk-L5X4SYJ4.js.map → chunk-PZS4A4VQ.js.map} +1 -1
  61. package/dist/{chunk-4I37QSEM.js → chunk-QJVS2VXS.js} +5 -5
  62. package/dist/{chunk-4I37QSEM.js.map → chunk-QJVS2VXS.js.map} +1 -1
  63. package/dist/{chunk-H7MFAFV4.js → chunk-RUWD35UI.js} +4 -4
  64. package/dist/{chunk-H7MFAFV4.js.map → chunk-RUWD35UI.js.map} +1 -1
  65. package/dist/{chunk-5BM6H2CD.js → chunk-SFNDR6DI.js} +3 -3
  66. package/dist/{chunk-5BM6H2CD.js.map → chunk-SFNDR6DI.js.map} +1 -1
  67. package/dist/{chunk-UF5OENHV.js → chunk-TLS54G6Y.js} +3 -3
  68. package/dist/{chunk-UF5OENHV.js.map → chunk-TLS54G6Y.js.map} +1 -1
  69. package/dist/{chunk-UUXWRDWW.js → chunk-UJWCEGQY.js} +3 -3
  70. package/dist/{chunk-UUXWRDWW.js.map → chunk-UJWCEGQY.js.map} +1 -1
  71. package/dist/{chunk-UJ5KFRDE.js → chunk-UZD77M3J.js} +3 -3
  72. package/dist/{chunk-UJ5KFRDE.js.map → chunk-UZD77M3J.js.map} +1 -1
  73. package/dist/chunk-VP7DRJUZ.js +3 -0
  74. package/dist/chunk-VP7DRJUZ.js.map +1 -0
  75. package/dist/{chunk-UPVNZPFV.js → chunk-VYRJ7OE5.js} +3 -3
  76. package/dist/{chunk-UPVNZPFV.js.map → chunk-VYRJ7OE5.js.map} +1 -1
  77. package/dist/{chunk-IGLMPAWE.js → chunk-WGT345SV.js} +3 -3
  78. package/dist/{chunk-IGLMPAWE.js.map → chunk-WGT345SV.js.map} +1 -1
  79. package/dist/{chunk-XXBN6CIK.js → chunk-WP2Z2ATO.js} +5 -5
  80. package/dist/{chunk-XXBN6CIK.js.map → chunk-WP2Z2ATO.js.map} +1 -1
  81. package/dist/chunk-WYPGQVDV.js +145 -0
  82. package/dist/chunk-WYPGQVDV.js.map +1 -0
  83. package/dist/{chunk-GELLSU64.js → chunk-XALU6LOT.js} +3 -3
  84. package/dist/{chunk-GELLSU64.js.map → chunk-XALU6LOT.js.map} +1 -1
  85. package/dist/{chunk-VMAGFYHG.js → chunk-Y5TJ7CAX.js} +3 -3
  86. package/dist/{chunk-VMAGFYHG.js.map → chunk-Y5TJ7CAX.js.map} +1 -1
  87. package/dist/chunk-YZ27OS2R.js +202 -0
  88. package/dist/chunk-YZ27OS2R.js.map +1 -0
  89. package/dist/client.cjs +453 -119
  90. package/dist/client.cjs.map +1 -1
  91. package/dist/client.d.cts +4 -0
  92. package/dist/client.d.ts +4 -0
  93. package/dist/client.js +50 -45
  94. package/dist/client.js.map +1 -1
  95. package/dist/components/Accordion/index.js +2 -2
  96. package/dist/components/Alert/index.js +2 -2
  97. package/dist/components/AlertDialog/index.js +2 -2
  98. package/dist/components/Avatar/index.js +2 -2
  99. package/dist/components/Badge/index.js +2 -2
  100. package/dist/components/Box/index.js +4 -4
  101. package/dist/components/Breadcrumb/index.cjs +3 -1
  102. package/dist/components/Breadcrumb/index.cjs.map +1 -1
  103. package/dist/components/Breadcrumb/index.js +5 -5
  104. package/dist/components/Button/index.js +2 -2
  105. package/dist/components/Calendar/index.cjs +3 -1
  106. package/dist/components/Calendar/index.cjs.map +1 -1
  107. package/dist/components/Calendar/index.js +5 -5
  108. package/dist/components/Card/index.js +2 -2
  109. package/dist/components/Checkbox/index.js +2 -2
  110. package/dist/components/Combobox/index.cjs +1374 -0
  111. package/dist/components/Combobox/index.cjs.map +1 -0
  112. package/dist/components/Combobox/index.d.cts +17 -0
  113. package/dist/components/Combobox/index.d.ts +17 -0
  114. package/dist/components/Combobox/index.js +9 -0
  115. package/dist/components/Combobox/index.js.map +1 -0
  116. package/dist/components/ContextMenu/index.js +4 -4
  117. package/dist/components/DataTable/index.cjs +770 -0
  118. package/dist/components/DataTable/index.cjs.map +1 -0
  119. package/dist/components/DataTable/index.d.cts +53 -0
  120. package/dist/components/DataTable/index.d.ts +53 -0
  121. package/dist/components/DataTable/index.js +8 -0
  122. package/dist/components/DataTable/index.js.map +1 -0
  123. package/dist/components/DatePicker/index.cjs +3 -1
  124. package/dist/components/DatePicker/index.cjs.map +1 -1
  125. package/dist/components/DatePicker/index.js +7 -7
  126. package/dist/components/Dialog/index.js +2 -2
  127. package/dist/components/DropdownMenu/index.js +3 -3
  128. package/dist/components/Field/index.cjs +3 -1
  129. package/dist/components/Field/index.cjs.map +1 -1
  130. package/dist/components/Field/index.d.cts +2 -2
  131. package/dist/components/Field/index.d.ts +2 -2
  132. package/dist/components/Field/index.js +3 -3
  133. package/dist/components/FloatButton/index.cjs +3 -1
  134. package/dist/components/FloatButton/index.cjs.map +1 -1
  135. package/dist/components/FloatButton/index.js +5 -5
  136. package/dist/components/HStack/index.js +4 -4
  137. package/dist/components/InputGroup/index.js +2 -2
  138. package/dist/components/Label/index.cjs +3 -1
  139. package/dist/components/Label/index.cjs.map +1 -1
  140. package/dist/components/Label/index.js +3 -3
  141. package/dist/components/Pagination/index.cjs +3 -1
  142. package/dist/components/Pagination/index.cjs.map +1 -1
  143. package/dist/components/Pagination/index.js +6 -5
  144. package/dist/components/Popover/index.js +2 -2
  145. package/dist/components/Progress/index.js +2 -2
  146. package/dist/components/Radio/index.js +2 -2
  147. package/dist/components/SegmentedControl/index.js +2 -2
  148. package/dist/components/Select/index.js +2 -2
  149. package/dist/components/Sheet/index.js +2 -2
  150. package/dist/components/Switch/index.js +2 -2
  151. package/dist/components/Table/index.cjs +461 -0
  152. package/dist/components/Table/index.cjs.map +1 -0
  153. package/dist/components/Table/index.d.cts +16 -0
  154. package/dist/components/Table/index.d.ts +16 -0
  155. package/dist/components/Table/index.js +7 -0
  156. package/dist/components/Table/index.js.map +1 -0
  157. package/dist/components/Tabs/index.js +2 -2
  158. package/dist/components/Text/index.js +2 -2
  159. package/dist/components/TextArea/index.js +3 -3
  160. package/dist/components/TextInput/index.js +2 -2
  161. package/dist/components/Toggle/index.js +2 -2
  162. package/dist/components/Tooltip/index.js +2 -2
  163. package/dist/components/VStack/index.js +4 -4
  164. package/dist/i18n/index.cjs +3 -1
  165. package/dist/i18n/index.cjs.map +1 -1
  166. package/dist/i18n/index.js +1 -1
  167. package/dist/index.cjs +453 -119
  168. package/dist/index.cjs.map +1 -1
  169. package/dist/index.d.cts +4 -0
  170. package/dist/index.d.ts +4 -0
  171. package/dist/index.js +47 -42
  172. package/dist/slot/index.d.cts +2 -2
  173. package/dist/slot/index.d.ts +2 -2
  174. package/package.json +1 -1
  175. package/dist/chunk-6PO2IWB3.js.map +0 -1
  176. package/dist/chunk-V2AWSDDZ.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1970,7 +1970,9 @@ var defaultDictionary = {
1970
1970
  "switch.off": "Off",
1971
1971
  // field
1972
1972
  "field.requiredIndicator": "*",
1973
- "field.requiredLabel": "required"
1973
+ "field.requiredLabel": "required",
1974
+ // table / dataTable
1975
+ "table.empty": "No data"
1974
1976
  };
1975
1977
 
1976
1978
  // src/i18n/resolve.ts
@@ -6590,6 +6592,9 @@ var Checkbox = /* @__PURE__ */ __name(({
6590
6592
  }
6591
6593
  );
6592
6594
  }, "Checkbox");
6595
+ var Combobox = /* @__PURE__ */ __name((props) => {
6596
+ return /* @__PURE__ */ jsxRuntime.jsx(Select, { searchable: true, ...props });
6597
+ }, "Combobox");
6593
6598
  var MenuContext = React.createContext(null);
6594
6599
  var MenuContextProvider = /* @__PURE__ */ __name(({
6595
6600
  open,
@@ -7001,6 +7006,450 @@ var ContextMenu = Object.assign(ContextMenuRoot, {
7001
7006
  Separator: MenuSeparator,
7002
7007
  Label: MenuLabel
7003
7008
  });
7009
+ var range = /* @__PURE__ */ __name((from, to) => {
7010
+ if (to < from) {
7011
+ return [];
7012
+ }
7013
+ const out = new Array(to - from + 1);
7014
+ for (let i = 0; i < out.length; i += 1) {
7015
+ out[i] = from + i;
7016
+ }
7017
+ return out;
7018
+ }, "range");
7019
+ function usePagination(args) {
7020
+ const {
7021
+ page: controlledPage,
7022
+ defaultPage = 1,
7023
+ pageCount,
7024
+ siblingCount = 1,
7025
+ boundaryCount = 1,
7026
+ showFirstLast = false,
7027
+ showPrevNext = true,
7028
+ onPageChange
7029
+ } = args;
7030
+ const isControlled = controlledPage !== void 0;
7031
+ const [uncontrolledPage, setUncontrolledPage] = React.useState(defaultPage);
7032
+ const onChangeRef = React.useRef(onPageChange);
7033
+ onChangeRef.current = onPageChange;
7034
+ const safePageCount = Math.max(1, Math.floor(pageCount));
7035
+ const rawPage = isControlled ? controlledPage : uncontrolledPage;
7036
+ const currentPage = Math.min(Math.max(1, Math.floor(rawPage)), safePageCount);
7037
+ const goToPage = React.useCallback(
7038
+ (next2) => {
7039
+ const clamped = Math.min(Math.max(1, Math.floor(next2)), Math.max(1, Math.floor(pageCount)));
7040
+ if (!isControlled) {
7041
+ setUncontrolledPage(clamped);
7042
+ }
7043
+ onChangeRef.current?.(clamped);
7044
+ },
7045
+ [isControlled, pageCount]
7046
+ );
7047
+ const prev = React.useCallback(() => goToPage(currentPage - 1), [goToPage, currentPage]);
7048
+ const next = React.useCallback(() => goToPage(currentPage + 1), [goToPage, currentPage]);
7049
+ const first = React.useCallback(() => goToPage(1), [goToPage]);
7050
+ const last = React.useCallback(() => goToPage(safePageCount), [goToPage, safePageCount]);
7051
+ const pages = React.useMemo(() => {
7052
+ const items = [];
7053
+ const safeSibling = Math.max(0, Math.floor(siblingCount));
7054
+ const safeBoundary = Math.max(0, Math.floor(boundaryCount));
7055
+ if (showFirstLast) {
7056
+ items.push({ type: "first", disabled: currentPage <= 1 });
7057
+ }
7058
+ if (showPrevNext) {
7059
+ items.push({ type: "prev", disabled: currentPage <= 1 });
7060
+ }
7061
+ const startPages = range(1, Math.min(safeBoundary, safePageCount));
7062
+ const endPages = range(Math.max(safePageCount - safeBoundary + 1, safeBoundary + 1), safePageCount);
7063
+ const siblingsStart = Math.max(
7064
+ Math.min(currentPage - safeSibling, safePageCount - safeBoundary - safeSibling * 2 - 1),
7065
+ safeBoundary + 2
7066
+ );
7067
+ const siblingsEnd = Math.min(
7068
+ Math.max(currentPage + safeSibling, safeBoundary + safeSibling * 2 + 2),
7069
+ endPages.length > 0 ? endPages[0] - 2 : safePageCount - 1
7070
+ );
7071
+ const middle = [];
7072
+ if (siblingsStart > safeBoundary + 2) {
7073
+ middle.push("ellipsis");
7074
+ } else if (safeBoundary + 1 < safePageCount - safeBoundary) {
7075
+ middle.push(safeBoundary + 1);
7076
+ }
7077
+ for (const p of range(siblingsStart, siblingsEnd)) {
7078
+ middle.push(p);
7079
+ }
7080
+ if (siblingsEnd < safePageCount - safeBoundary - 1) {
7081
+ middle.push("ellipsis");
7082
+ } else if (safePageCount - safeBoundary > safeBoundary) {
7083
+ middle.push(safePageCount - safeBoundary);
7084
+ }
7085
+ const seen = /* @__PURE__ */ new Set();
7086
+ const pushPage = /* @__PURE__ */ __name((n) => {
7087
+ if (n < 1 || n > safePageCount || seen.has(n)) {
7088
+ return;
7089
+ }
7090
+ seen.add(n);
7091
+ items.push({ type: "page", page: n, selected: n === currentPage });
7092
+ }, "pushPage");
7093
+ for (const n of startPages) {
7094
+ pushPage(n);
7095
+ }
7096
+ for (const m of middle) {
7097
+ if (m === "ellipsis") {
7098
+ items.push({ type: "ellipsis" });
7099
+ } else {
7100
+ pushPage(m);
7101
+ }
7102
+ }
7103
+ for (const n of endPages) {
7104
+ pushPage(n);
7105
+ }
7106
+ if (showPrevNext) {
7107
+ items.push({ type: "next", disabled: currentPage >= safePageCount });
7108
+ }
7109
+ if (showFirstLast) {
7110
+ items.push({ type: "last", disabled: currentPage >= safePageCount });
7111
+ }
7112
+ return items;
7113
+ }, [currentPage, safePageCount, siblingCount, boundaryCount, showFirstLast, showPrevNext]);
7114
+ return {
7115
+ page: currentPage,
7116
+ pages,
7117
+ canPrev: currentPage > 1,
7118
+ canNext: currentPage < safePageCount,
7119
+ goToPage,
7120
+ prev,
7121
+ next,
7122
+ first,
7123
+ last
7124
+ };
7125
+ }
7126
+ __name(usePagination, "usePagination");
7127
+ var TableContext = React.createContext({
7128
+ striped: false,
7129
+ compact: false,
7130
+ bordered: false,
7131
+ rowIndex: 0,
7132
+ setRowIndex: /* @__PURE__ */ __name(() => {
7133
+ }, "setRowIndex")
7134
+ });
7135
+ function buildTableCompound(parts) {
7136
+ return Object.assign(parts.Root, {
7137
+ Header: parts.Header,
7138
+ Body: parts.Body,
7139
+ Footer: parts.Footer,
7140
+ Row: parts.Row,
7141
+ HeaderCell: parts.HeaderCell,
7142
+ Cell: parts.Cell,
7143
+ Caption: parts.Caption
7144
+ });
7145
+ }
7146
+ __name(buildTableCompound, "buildTableCompound");
7147
+ var TableRoot = /* @__PURE__ */ __name(({ striped = false, compact = false, bordered = false, children, className, testID }) => {
7148
+ const [rowIndex, setRowIndex] = React.useState(0);
7149
+ const ctxValue = {
7150
+ striped,
7151
+ compact,
7152
+ bordered,
7153
+ rowIndex,
7154
+ setRowIndex
7155
+ };
7156
+ return /* @__PURE__ */ jsxRuntime.jsx(TableContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("w-full overflow-auto", className), children: /* @__PURE__ */ jsxRuntime.jsx(
7157
+ "table",
7158
+ {
7159
+ className: cn(
7160
+ "w-full caption-bottom text-sm",
7161
+ bordered && "border border-semantic-border-default",
7162
+ className
7163
+ ),
7164
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7165
+ children
7166
+ }
7167
+ ) }) });
7168
+ }, "TableRoot");
7169
+ var TableHeader = /* @__PURE__ */ __name(({ children, className, testID }) => /* @__PURE__ */ jsxRuntime.jsx(
7170
+ "thead",
7171
+ {
7172
+ className: cn("[&_tr]:border-b [&_tr]:border-semantic-border-default", className),
7173
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7174
+ children
7175
+ }
7176
+ ), "TableHeader");
7177
+ var TableBody = /* @__PURE__ */ __name(({ children, className, testID }) => /* @__PURE__ */ jsxRuntime.jsx(
7178
+ "tbody",
7179
+ {
7180
+ className: cn("[&_tr:last-child]:border-0", className),
7181
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7182
+ children
7183
+ }
7184
+ ), "TableBody");
7185
+ var TableFooter = /* @__PURE__ */ __name(({ children, className, testID }) => /* @__PURE__ */ jsxRuntime.jsx(
7186
+ "tfoot",
7187
+ {
7188
+ className: cn("border-t border-semantic-border-default font-medium", className),
7189
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7190
+ children
7191
+ }
7192
+ ), "TableFooter");
7193
+ var TableRow = /* @__PURE__ */ __name(({ selected = false, onPress, children, className, testID }) => {
7194
+ const colors = useThemeColors();
7195
+ const handleClick = React.useCallback(() => {
7196
+ onPress?.();
7197
+ }, [onPress]);
7198
+ return /* @__PURE__ */ jsxRuntime.jsx(
7199
+ "tr",
7200
+ {
7201
+ className: cn(
7202
+ "border-b border-semantic-border-default transition-colors",
7203
+ onPress && "cursor-pointer hover:bg-semantic-background-subtle",
7204
+ selected && "bg-semantic-background-subtle",
7205
+ className
7206
+ ),
7207
+ style: selected ? { backgroundColor: colors.semantic.background.subtle } : void 0,
7208
+ onClick: onPress ? handleClick : void 0,
7209
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7210
+ children
7211
+ }
7212
+ );
7213
+ }, "TableRow");
7214
+ var TableHeaderCell = /* @__PURE__ */ __name(({ align = "left", colSpan, children, className, testID }) => /* @__PURE__ */ jsxRuntime.jsx(
7215
+ "th",
7216
+ {
7217
+ className: cn(
7218
+ "h-10 px-4 font-medium text-semantic-text-secondary",
7219
+ align === "right" && "text-right",
7220
+ align === "center" && "text-center",
7221
+ align === "left" && "text-left",
7222
+ className
7223
+ ),
7224
+ colSpan,
7225
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7226
+ children
7227
+ }
7228
+ ), "TableHeaderCell");
7229
+ var TableCell = /* @__PURE__ */ __name(({ align = "left", colSpan, children, className, testID }) => /* @__PURE__ */ jsxRuntime.jsx(
7230
+ "td",
7231
+ {
7232
+ className: cn(
7233
+ "p-4 align-middle",
7234
+ align === "right" && "text-right",
7235
+ align === "center" && "text-center",
7236
+ align === "left" && "text-left",
7237
+ className
7238
+ ),
7239
+ colSpan,
7240
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7241
+ children
7242
+ }
7243
+ ), "TableCell");
7244
+ var TableCaption = /* @__PURE__ */ __name(({ children, className, testID }) => /* @__PURE__ */ jsxRuntime.jsx(
7245
+ "caption",
7246
+ {
7247
+ className: cn("mt-4 text-sm text-semantic-text-secondary", className),
7248
+ ...testID !== void 0 ? { "data-testid": testID } : {},
7249
+ children
7250
+ }
7251
+ ), "TableCaption");
7252
+ var Table = buildTableCompound({
7253
+ Root: TableRoot,
7254
+ Header: TableHeader,
7255
+ Body: TableBody,
7256
+ Footer: TableFooter,
7257
+ Row: TableRow,
7258
+ HeaderCell: TableHeaderCell,
7259
+ Cell: TableCell,
7260
+ Caption: TableCaption
7261
+ });
7262
+ function sortData(data, sort) {
7263
+ if (!sort) {
7264
+ return data;
7265
+ }
7266
+ const key = sort.id;
7267
+ return [...data].sort((a, b) => {
7268
+ const av = a[key];
7269
+ const bv = b[key];
7270
+ if (av == null && bv == null) {
7271
+ return 0;
7272
+ }
7273
+ if (av == null) {
7274
+ return 1;
7275
+ }
7276
+ if (bv == null) {
7277
+ return -1;
7278
+ }
7279
+ const cmp2 = av < bv ? -1 : av > bv ? 1 : 0;
7280
+ return sort.direction === "asc" ? cmp2 : -cmp2;
7281
+ });
7282
+ }
7283
+ __name(sortData, "sortData");
7284
+ function SortIndicator({ direction }) {
7285
+ if (direction === void 0) {
7286
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { marginLeft: 4, opacity: 0.3 }, children: "\u21C5" });
7287
+ }
7288
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { marginLeft: 4 }, children: direction === "asc" ? "\u2191" : "\u2193" });
7289
+ }
7290
+ __name(SortIndicator, "SortIndicator");
7291
+ function DataTable({
7292
+ data,
7293
+ columns,
7294
+ pageSize = 10,
7295
+ defaultSort,
7296
+ onRowPress,
7297
+ emptyState,
7298
+ striped,
7299
+ compact,
7300
+ bordered,
7301
+ testID,
7302
+ className
7303
+ }) {
7304
+ const [sort, setSort] = React.useState(defaultSort ?? null);
7305
+ const sorted = React.useMemo(() => sortData(data, sort), [data, sort]);
7306
+ const pageCount = Math.max(1, Math.ceil(sorted.length / pageSize));
7307
+ const { page, goToPage, canPrev, canNext } = usePagination({ pageCount, defaultPage: 1 });
7308
+ const pageSlice = React.useMemo(() => {
7309
+ const start = (page - 1) * pageSize;
7310
+ return sorted.slice(start, start + pageSize);
7311
+ }, [sorted, page, pageSize]);
7312
+ const handleSort = /* @__PURE__ */ __name((colId) => {
7313
+ setSort((prev) => {
7314
+ if (prev?.id !== colId) {
7315
+ goToPage(1);
7316
+ return { id: colId, direction: "asc" };
7317
+ }
7318
+ if (prev.direction === "asc") {
7319
+ return { id: colId, direction: "desc" };
7320
+ }
7321
+ goToPage(1);
7322
+ return null;
7323
+ });
7324
+ }, "handleSort");
7325
+ const tableProps = {};
7326
+ if (striped !== void 0) {
7327
+ tableProps.striped = striped;
7328
+ }
7329
+ if (compact !== void 0) {
7330
+ tableProps.compact = compact;
7331
+ }
7332
+ if (bordered !== void 0) {
7333
+ tableProps.bordered = bordered;
7334
+ }
7335
+ if (testID !== void 0) {
7336
+ tableProps.testID = testID;
7337
+ }
7338
+ if (className !== void 0) {
7339
+ tableProps.className = className;
7340
+ }
7341
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: { width: "100%" }, children: [
7342
+ /* @__PURE__ */ jsxRuntime.jsxs(Table, { ...tableProps, children: [
7343
+ /* @__PURE__ */ jsxRuntime.jsx(Table.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(Table.Row, { children: columns.map((col) => {
7344
+ const align = col.align;
7345
+ return /* @__PURE__ */ jsxRuntime.jsx(Table.HeaderCell, { ...align !== void 0 ? { align } : {}, children: col.sortable ? /* @__PURE__ */ jsxRuntime.jsxs(
7346
+ reactNative.Pressable,
7347
+ {
7348
+ accessibilityRole: "button",
7349
+ accessibilityLabel: `Sort by ${col.id}`,
7350
+ "aria-label": `Sort by ${col.id}`,
7351
+ onPress: () => handleSort(col.id),
7352
+ style: { flexDirection: "row", alignItems: "center" },
7353
+ children: [
7354
+ typeof col.header === "string" ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { children: col.header }) : col.header,
7355
+ /* @__PURE__ */ jsxRuntime.jsx(
7356
+ SortIndicator,
7357
+ {
7358
+ ...sort?.id === col.id ? { direction: sort.direction } : {}
7359
+ }
7360
+ )
7361
+ ]
7362
+ }
7363
+ ) : col.header }, col.id);
7364
+ }) }) }),
7365
+ /* @__PURE__ */ jsxRuntime.jsx(Table.Body, { children: pageSlice.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Table.Row, { children: /* @__PURE__ */ jsxRuntime.jsx(Table.Cell, { colSpan: columns.length, children: /* @__PURE__ */ jsxRuntime.jsx(EmptyState, { children: emptyState ?? "No data" }) }) }) : pageSlice.map((row, i) => /* @__PURE__ */ jsxRuntime.jsx(
7366
+ Table.Row,
7367
+ {
7368
+ ...onRowPress !== void 0 ? { onPress: /* @__PURE__ */ __name(() => onRowPress(row), "onPress") } : {},
7369
+ children: columns.map((col) => {
7370
+ const colAlign = col.align;
7371
+ return /* @__PURE__ */ jsxRuntime.jsx(
7372
+ Table.Cell,
7373
+ {
7374
+ ...colAlign !== void 0 ? { align: colAlign } : {},
7375
+ children: col.cell(row)
7376
+ },
7377
+ col.id
7378
+ );
7379
+ })
7380
+ },
7381
+ i
7382
+ )) })
7383
+ ] }),
7384
+ pageCount > 1 && /* @__PURE__ */ jsxRuntime.jsx(
7385
+ PaginationControls,
7386
+ {
7387
+ page,
7388
+ pageCount,
7389
+ canPrev,
7390
+ canNext,
7391
+ goToPage
7392
+ }
7393
+ )
7394
+ ] });
7395
+ }
7396
+ __name(DataTable, "DataTable");
7397
+ function EmptyState({ children }) {
7398
+ return /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { paddingVertical: 32, alignItems: "center" }, children: typeof children === "string" ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: { color: "#888", fontSize: 14 }, children }) : children });
7399
+ }
7400
+ __name(EmptyState, "EmptyState");
7401
+ function PaginationControls({
7402
+ page,
7403
+ pageCount,
7404
+ canPrev,
7405
+ canNext,
7406
+ goToPage
7407
+ }) {
7408
+ return /* @__PURE__ */ jsxRuntime.jsxs(
7409
+ reactNative.View,
7410
+ {
7411
+ style: {
7412
+ flexDirection: "row",
7413
+ justifyContent: "flex-end",
7414
+ alignItems: "center",
7415
+ paddingVertical: 8,
7416
+ gap: 8
7417
+ },
7418
+ children: [
7419
+ /* @__PURE__ */ jsxRuntime.jsx(
7420
+ reactNative.Pressable,
7421
+ {
7422
+ onPress: canPrev ? () => goToPage(page - 1) : void 0,
7423
+ accessibilityRole: "button",
7424
+ accessibilityLabel: "Previous page",
7425
+ "aria-label": "Previous page",
7426
+ "aria-disabled": !canPrev,
7427
+ style: { opacity: canPrev ? 1 : 0.4, paddingHorizontal: 8 },
7428
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: { fontSize: 14 }, children: "\u2039 Prev" })
7429
+ }
7430
+ ),
7431
+ /* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: { fontSize: 14 }, "aria-live": "polite", children: [
7432
+ page,
7433
+ " / ",
7434
+ pageCount
7435
+ ] }),
7436
+ /* @__PURE__ */ jsxRuntime.jsx(
7437
+ reactNative.Pressable,
7438
+ {
7439
+ onPress: canNext ? () => goToPage(page + 1) : void 0,
7440
+ accessibilityRole: "button",
7441
+ accessibilityLabel: "Next page",
7442
+ "aria-label": "Next page",
7443
+ "aria-disabled": !canNext,
7444
+ style: { opacity: canNext ? 1 : 0.4, paddingHorizontal: 8 },
7445
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: { fontSize: 14 }, children: "Next \u203A" })
7446
+ }
7447
+ )
7448
+ ]
7449
+ }
7450
+ );
7451
+ }
7452
+ __name(PaginationControls, "PaginationControls");
7004
7453
  function formatDate(date$1, locale) {
7005
7454
  try {
7006
7455
  return new Intl.DateTimeFormat(locale, { dateStyle: "medium" }).format(date$1.toDate(date.getLocalTimeZone()));
@@ -9073,124 +9522,6 @@ var Label = /* @__PURE__ */ __name(({ htmlFor, required = false, disabled = fals
9073
9522
  }
9074
9523
  );
9075
9524
  }, "Label");
9076
- var range = /* @__PURE__ */ __name((from, to) => {
9077
- if (to < from) {
9078
- return [];
9079
- }
9080
- const out = new Array(to - from + 1);
9081
- for (let i = 0; i < out.length; i += 1) {
9082
- out[i] = from + i;
9083
- }
9084
- return out;
9085
- }, "range");
9086
- function usePagination(args) {
9087
- const {
9088
- page: controlledPage,
9089
- defaultPage = 1,
9090
- pageCount,
9091
- siblingCount = 1,
9092
- boundaryCount = 1,
9093
- showFirstLast = false,
9094
- showPrevNext = true,
9095
- onPageChange
9096
- } = args;
9097
- const isControlled = controlledPage !== void 0;
9098
- const [uncontrolledPage, setUncontrolledPage] = React.useState(defaultPage);
9099
- const onChangeRef = React.useRef(onPageChange);
9100
- onChangeRef.current = onPageChange;
9101
- const safePageCount = Math.max(1, Math.floor(pageCount));
9102
- const rawPage = isControlled ? controlledPage : uncontrolledPage;
9103
- const currentPage = Math.min(Math.max(1, Math.floor(rawPage)), safePageCount);
9104
- const goToPage = React.useCallback(
9105
- (next2) => {
9106
- const clamped = Math.min(Math.max(1, Math.floor(next2)), Math.max(1, Math.floor(pageCount)));
9107
- if (!isControlled) {
9108
- setUncontrolledPage(clamped);
9109
- }
9110
- onChangeRef.current?.(clamped);
9111
- },
9112
- [isControlled, pageCount]
9113
- );
9114
- const prev = React.useCallback(() => goToPage(currentPage - 1), [goToPage, currentPage]);
9115
- const next = React.useCallback(() => goToPage(currentPage + 1), [goToPage, currentPage]);
9116
- const first = React.useCallback(() => goToPage(1), [goToPage]);
9117
- const last = React.useCallback(() => goToPage(safePageCount), [goToPage, safePageCount]);
9118
- const pages = React.useMemo(() => {
9119
- const items = [];
9120
- const safeSibling = Math.max(0, Math.floor(siblingCount));
9121
- const safeBoundary = Math.max(0, Math.floor(boundaryCount));
9122
- if (showFirstLast) {
9123
- items.push({ type: "first", disabled: currentPage <= 1 });
9124
- }
9125
- if (showPrevNext) {
9126
- items.push({ type: "prev", disabled: currentPage <= 1 });
9127
- }
9128
- const startPages = range(1, Math.min(safeBoundary, safePageCount));
9129
- const endPages = range(Math.max(safePageCount - safeBoundary + 1, safeBoundary + 1), safePageCount);
9130
- const siblingsStart = Math.max(
9131
- Math.min(currentPage - safeSibling, safePageCount - safeBoundary - safeSibling * 2 - 1),
9132
- safeBoundary + 2
9133
- );
9134
- const siblingsEnd = Math.min(
9135
- Math.max(currentPage + safeSibling, safeBoundary + safeSibling * 2 + 2),
9136
- endPages.length > 0 ? endPages[0] - 2 : safePageCount - 1
9137
- );
9138
- const middle = [];
9139
- if (siblingsStart > safeBoundary + 2) {
9140
- middle.push("ellipsis");
9141
- } else if (safeBoundary + 1 < safePageCount - safeBoundary) {
9142
- middle.push(safeBoundary + 1);
9143
- }
9144
- for (const p of range(siblingsStart, siblingsEnd)) {
9145
- middle.push(p);
9146
- }
9147
- if (siblingsEnd < safePageCount - safeBoundary - 1) {
9148
- middle.push("ellipsis");
9149
- } else if (safePageCount - safeBoundary > safeBoundary) {
9150
- middle.push(safePageCount - safeBoundary);
9151
- }
9152
- const seen = /* @__PURE__ */ new Set();
9153
- const pushPage = /* @__PURE__ */ __name((n) => {
9154
- if (n < 1 || n > safePageCount || seen.has(n)) {
9155
- return;
9156
- }
9157
- seen.add(n);
9158
- items.push({ type: "page", page: n, selected: n === currentPage });
9159
- }, "pushPage");
9160
- for (const n of startPages) {
9161
- pushPage(n);
9162
- }
9163
- for (const m of middle) {
9164
- if (m === "ellipsis") {
9165
- items.push({ type: "ellipsis" });
9166
- } else {
9167
- pushPage(m);
9168
- }
9169
- }
9170
- for (const n of endPages) {
9171
- pushPage(n);
9172
- }
9173
- if (showPrevNext) {
9174
- items.push({ type: "next", disabled: currentPage >= safePageCount });
9175
- }
9176
- if (showFirstLast) {
9177
- items.push({ type: "last", disabled: currentPage >= safePageCount });
9178
- }
9179
- return items;
9180
- }, [currentPage, safePageCount, siblingCount, boundaryCount, showFirstLast, showPrevNext]);
9181
- return {
9182
- page: currentPage,
9183
- pages,
9184
- canPrev: currentPage > 1,
9185
- canNext: currentPage < safePageCount,
9186
- goToPage,
9187
- prev,
9188
- next,
9189
- first,
9190
- last
9191
- };
9192
- }
9193
- __name(usePagination, "usePagination");
9194
9525
  var PAGINATION_COMPACT_BREAKPOINT = 480;
9195
9526
  var PaginationContext = React.createContext(null);
9196
9527
  var usePaginationContext = /* @__PURE__ */ __name((label) => {
@@ -13302,7 +13633,9 @@ exports.Button = Button;
13302
13633
  exports.Calendar = Calendar;
13303
13634
  exports.Card = Card;
13304
13635
  exports.Checkbox = Checkbox;
13636
+ exports.Combobox = Combobox;
13305
13637
  exports.ContextMenu = ContextMenu;
13638
+ exports.DataTable = DataTable;
13306
13639
  exports.DatePicker = DatePicker;
13307
13640
  exports.Dialog = Dialog;
13308
13641
  exports.Drawer = Drawer;
@@ -13340,6 +13673,7 @@ exports.SliderGestureProvider = SliderGestureProvider;
13340
13673
  exports.Slot = Slot;
13341
13674
  exports.Spinner = Spinner;
13342
13675
  exports.Switch = Switch;
13676
+ exports.Table = Table;
13343
13677
  exports.Tabs = Tabs;
13344
13678
  exports.Text = Text;
13345
13679
  exports.TextArea = TextArea;