@apipass/design-system 4.2.2 → 5.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 (53) hide show
  1. package/dist/lib/embedded-styles.d.ts +4 -0
  2. package/dist/lib/embedded-styles.js +3 -1
  3. package/dist/lib/style.css +1 -1
  4. package/dist/lib/ui/components/Breadcrumb/Breadcrumb.cjs +1 -1
  5. package/dist/lib/ui/components/Breadcrumb/Breadcrumb.cjs.map +1 -1
  6. package/dist/lib/ui/components/Breadcrumb/Breadcrumb.js +1 -1
  7. package/dist/lib/ui/components/Breadcrumb/Breadcrumb.js.map +1 -1
  8. package/dist/lib/ui/components/DataTable/DataTable.cjs +1 -1
  9. package/dist/lib/ui/components/DataTable/DataTable.cjs.map +1 -1
  10. package/dist/lib/ui/components/DataTable/DataTable.js +118 -106
  11. package/dist/lib/ui/components/DataTable/DataTable.js.map +1 -1
  12. package/dist/lib/ui/primitives/Accordion/Accordion.cjs +1 -1
  13. package/dist/lib/ui/primitives/Accordion/Accordion.cjs.map +1 -1
  14. package/dist/lib/ui/primitives/Accordion/Accordion.js +5 -5
  15. package/dist/lib/ui/primitives/Accordion/Accordion.js.map +1 -1
  16. package/dist/lib/ui/primitives/Alert/Alert.cjs +1 -1
  17. package/dist/lib/ui/primitives/Alert/Alert.cjs.map +1 -1
  18. package/dist/lib/ui/primitives/Alert/Alert.js +1 -1
  19. package/dist/lib/ui/primitives/Alert/Alert.js.map +1 -1
  20. package/dist/lib/ui/primitives/Checkbox/Checkbox.cjs +1 -1
  21. package/dist/lib/ui/primitives/Checkbox/Checkbox.cjs.map +1 -1
  22. package/dist/lib/ui/primitives/Checkbox/Checkbox.js +9 -9
  23. package/dist/lib/ui/primitives/Checkbox/Checkbox.js.map +1 -1
  24. package/dist/lib/ui/primitives/Fieldset/Fieldset.cjs +1 -1
  25. package/dist/lib/ui/primitives/Fieldset/Fieldset.cjs.map +1 -1
  26. package/dist/lib/ui/primitives/Fieldset/Fieldset.js +1 -1
  27. package/dist/lib/ui/primitives/Fieldset/Fieldset.js.map +1 -1
  28. package/dist/lib/ui/primitives/Pagination/Pagination.cjs +1 -1
  29. package/dist/lib/ui/primitives/Pagination/Pagination.cjs.map +1 -1
  30. package/dist/lib/ui/primitives/Pagination/Pagination.js +6 -6
  31. package/dist/lib/ui/primitives/Pagination/Pagination.js.map +1 -1
  32. package/dist/lib/ui/primitives/Radio/Radio.cjs +1 -1
  33. package/dist/lib/ui/primitives/Radio/Radio.cjs.map +1 -1
  34. package/dist/lib/ui/primitives/Radio/Radio.js +8 -8
  35. package/dist/lib/ui/primitives/Radio/Radio.js.map +1 -1
  36. package/dist/lib/ui/primitives/Switch/Switch.cjs +1 -1
  37. package/dist/lib/ui/primitives/Switch/Switch.cjs.map +1 -1
  38. package/dist/lib/ui/primitives/Switch/Switch.js +1 -1
  39. package/dist/lib/ui/primitives/Switch/Switch.js.map +1 -1
  40. package/dist/lib/ui/primitives/Table/Table.cjs +1 -1
  41. package/dist/lib/ui/primitives/Table/Table.cjs.map +1 -1
  42. package/dist/lib/ui/primitives/Table/Table.js +44 -44
  43. package/dist/lib/ui/primitives/Table/Table.js.map +1 -1
  44. package/dist/lib/ui/primitives/Text/Text.cjs +1 -1
  45. package/dist/lib/ui/primitives/Text/Text.cjs.map +1 -1
  46. package/dist/lib/ui/primitives/Text/Text.js +16 -16
  47. package/dist/lib/ui/primitives/Text/Text.js.map +1 -1
  48. package/dist/lib/ui/primitives/Tooltip/Tooltip.cjs +1 -1
  49. package/dist/lib/ui/primitives/Tooltip/Tooltip.cjs.map +1 -1
  50. package/dist/lib/ui/primitives/Tooltip/Tooltip.js +9 -9
  51. package/dist/lib/ui/primitives/Tooltip/Tooltip.js.map +1 -1
  52. package/dist/types/ui/components/DataTable/DataTable.d.ts +10 -1
  53. package/package.json +2 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("../../../vendor/clsx/dist/clsx.cjs");;/* empty css */const s=require("../../layout/Flex/Flex.cjs"),o=require("../../utils/AnchorOrButton.cjs");function d({items:a,className:l}){const u=a.length-1;return e.jsx("nav",{"aria-label":"Breadcrumb",className:t.clsx(l,"breadcrumb"),children:e.jsx(s.Flex,{alignSecondary:"center",gap:"100",children:a.map((r,n)=>{const c=n===u;return e.jsxs(s.Flex,{alignSecondary:"center",gap:"100",children:[c?e.jsx("span",{className:"breadcrumb-current","aria-current":"page",children:r.label}):e.jsx(o.AnchorOrButton,{...r.href?{href:r.href}:{},onPress:r.onPress,className:"breadcrumb-link",children:r.label}),!c&&e.jsx("span",{className:"breadcrumb-separator","aria-hidden":"true",children:"/"})]},`${r.label}-${n}`)})})})}exports.Breadcrumb=d;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("../../../vendor/clsx/dist/clsx.cjs");;/* empty css */const s=require("../../layout/Flex/Flex.cjs"),d=require("../../utils/AnchorOrButton.cjs");function o({items:a,className:l}){const u=a.length-1;return e.jsx("nav",{"aria-label":"Breadcrumb",className:t.clsx(l,"sds-breadcrumb"),children:e.jsx(s.Flex,{alignSecondary:"center",gap:"100",children:a.map((r,n)=>{const c=n===u;return e.jsxs(s.Flex,{alignSecondary:"center",gap:"100",children:[c?e.jsx("span",{className:"breadcrumb-current","aria-current":"page",children:r.label}):e.jsx(d.AnchorOrButton,{...r.href?{href:r.href}:{},onPress:r.onPress,className:"breadcrumb-link",children:r.label}),!c&&e.jsx("span",{className:"breadcrumb-separator","aria-hidden":"true",children:"/"})]},`${r.label}-${n}`)})})})}exports.Breadcrumb=o;
2
2
  //# sourceMappingURL=Breadcrumb.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.cjs","sources":["../../../../../src/ui/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Flex } from \"layout\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./breadcrumb.css\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onPress?: () => void;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumb({ items, className }: BreadcrumbProps) {\n const lastIndex = items.length - 1;\n return (\n <nav aria-label=\"Breadcrumb\" className={clsx(className, \"breadcrumb\")}>\n <Flex alignSecondary=\"center\" gap=\"100\">\n {items.map((item, index) => {\n const isCurrentPage = index === lastIndex;\n return (\n <Flex\n key={`${item.label}-${index}`}\n alignSecondary=\"center\"\n gap=\"100\"\n >\n {isCurrentPage ? (\n <span className=\"breadcrumb-current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <AnchorOrButton\n {...(item.href ? { href: item.href } : {})}\n onPress={item.onPress}\n className=\"breadcrumb-link\"\n >\n {item.label}\n </AnchorOrButton>\n )}\n {!isCurrentPage && (\n <span className=\"breadcrumb-separator\" aria-hidden=\"true\">\n /\n </span>\n )}\n </Flex>\n );\n })}\n </Flex>\n </nav>\n );\n}\n"],"names":["Breadcrumb","items","className","lastIndex","clsx","Flex","item","index","isCurrentPage","jsxs","jsx","AnchorOrButton"],"mappings":"+RAgBO,SAASA,EAAW,CAAE,MAAAC,EAAO,UAAAC,GAA8B,CAChE,MAAMC,EAAYF,EAAM,OAAS,EACjC,aACG,MAAA,CAAI,aAAW,aAAa,UAAWG,EAAAA,KAAKF,EAAW,YAAY,EAClE,eAACG,EAAAA,KAAA,CAAK,eAAe,SAAS,IAAI,MAC/B,WAAM,IAAI,CAACC,EAAMC,IAAU,CAC1B,MAAMC,EAAgBD,IAAUJ,EAChC,OACEM,EAAAA,KAACJ,EAAAA,KAAA,CAEC,eAAe,SACf,IAAI,MAEH,SAAA,CAAAG,EACCE,EAAAA,IAAC,QAAK,UAAU,qBAAqB,eAAa,OAC/C,SAAAJ,EAAK,MACR,EAEAI,EAAAA,IAACC,EAAAA,eAAA,CACE,GAAIL,EAAK,KAAO,CAAE,KAAMA,EAAK,IAAA,EAAS,CAAA,EACvC,QAASA,EAAK,QACd,UAAU,kBAET,SAAAA,EAAK,KAAA,CAAA,EAGT,CAACE,GACAE,MAAC,OAAA,CAAK,UAAU,uBAAuB,cAAY,OAAO,SAAA,GAAA,CAE1D,CAAA,CAAA,EApBG,GAAGJ,EAAK,KAAK,IAAIC,CAAK,EAAA,CAwBjC,CAAC,EACH,EACF,CAEJ"}
1
+ {"version":3,"file":"Breadcrumb.cjs","sources":["../../../../../src/ui/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Flex } from \"layout\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./breadcrumb.css\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onPress?: () => void;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumb({ items, className }: BreadcrumbProps) {\n const lastIndex = items.length - 1;\n return (\n <nav aria-label=\"Breadcrumb\" className={clsx(className, \"sds-breadcrumb\")}>\n <Flex alignSecondary=\"center\" gap=\"100\">\n {items.map((item, index) => {\n const isCurrentPage = index === lastIndex;\n return (\n <Flex\n key={`${item.label}-${index}`}\n alignSecondary=\"center\"\n gap=\"100\"\n >\n {isCurrentPage ? (\n <span className=\"breadcrumb-current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <AnchorOrButton\n {...(item.href ? { href: item.href } : {})}\n onPress={item.onPress}\n className=\"breadcrumb-link\"\n >\n {item.label}\n </AnchorOrButton>\n )}\n {!isCurrentPage && (\n <span className=\"breadcrumb-separator\" aria-hidden=\"true\">\n /\n </span>\n )}\n </Flex>\n );\n })}\n </Flex>\n </nav>\n );\n}\n"],"names":["Breadcrumb","items","className","lastIndex","clsx","Flex","item","index","isCurrentPage","jsxs","jsx","AnchorOrButton"],"mappings":"+RAgBO,SAASA,EAAW,CAAE,MAAAC,EAAO,UAAAC,GAA8B,CAChE,MAAMC,EAAYF,EAAM,OAAS,EACjC,aACG,MAAA,CAAI,aAAW,aAAa,UAAWG,EAAAA,KAAKF,EAAW,gBAAgB,EACtE,eAACG,EAAAA,KAAA,CAAK,eAAe,SAAS,IAAI,MAC/B,WAAM,IAAI,CAACC,EAAMC,IAAU,CAC1B,MAAMC,EAAgBD,IAAUJ,EAChC,OACEM,EAAAA,KAACJ,EAAAA,KAAA,CAEC,eAAe,SACf,IAAI,MAEH,SAAA,CAAAG,EACCE,EAAAA,IAAC,QAAK,UAAU,qBAAqB,eAAa,OAC/C,SAAAJ,EAAK,MACR,EAEAI,EAAAA,IAACC,EAAAA,eAAA,CACE,GAAIL,EAAK,KAAO,CAAE,KAAMA,EAAK,IAAA,EAAS,CAAA,EACvC,QAASA,EAAK,QACd,UAAU,kBAET,SAAAA,EAAK,KAAA,CAAA,EAGT,CAACE,GACAE,MAAC,OAAA,CAAK,UAAU,uBAAuB,cAAY,OAAO,SAAA,GAAA,CAE1D,CAAA,CAAA,EApBG,GAAGJ,EAAK,KAAK,IAAIC,CAAK,EAAA,CAwBjC,CAAC,EACH,EACF,CAEJ"}
@@ -5,7 +5,7 @@ import { Flex as l } from "../../layout/Flex/Flex.js";
5
5
  import { AnchorOrButton as b } from "../../utils/AnchorOrButton.js";
6
6
  function f({ items: e, className: s }) {
7
7
  const o = e.length - 1;
8
- return /* @__PURE__ */ a("nav", { "aria-label": "Breadcrumb", className: t(s, "breadcrumb"), children: /* @__PURE__ */ a(l, { alignSecondary: "center", gap: "100", children: e.map((r, n) => {
8
+ return /* @__PURE__ */ a("nav", { "aria-label": "Breadcrumb", className: t(s, "sds-breadcrumb"), children: /* @__PURE__ */ a(l, { alignSecondary: "center", gap: "100", children: e.map((r, n) => {
9
9
  const c = n === o;
10
10
  return /* @__PURE__ */ d(
11
11
  l,
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.js","sources":["../../../../../src/ui/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Flex } from \"layout\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./breadcrumb.css\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onPress?: () => void;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumb({ items, className }: BreadcrumbProps) {\n const lastIndex = items.length - 1;\n return (\n <nav aria-label=\"Breadcrumb\" className={clsx(className, \"breadcrumb\")}>\n <Flex alignSecondary=\"center\" gap=\"100\">\n {items.map((item, index) => {\n const isCurrentPage = index === lastIndex;\n return (\n <Flex\n key={`${item.label}-${index}`}\n alignSecondary=\"center\"\n gap=\"100\"\n >\n {isCurrentPage ? (\n <span className=\"breadcrumb-current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <AnchorOrButton\n {...(item.href ? { href: item.href } : {})}\n onPress={item.onPress}\n className=\"breadcrumb-link\"\n >\n {item.label}\n </AnchorOrButton>\n )}\n {!isCurrentPage && (\n <span className=\"breadcrumb-separator\" aria-hidden=\"true\">\n /\n </span>\n )}\n </Flex>\n );\n })}\n </Flex>\n </nav>\n );\n}\n"],"names":["Breadcrumb","items","className","lastIndex","clsx","Flex","item","index","isCurrentPage","jsxs","jsx","AnchorOrButton"],"mappings":";;;;;AAgBO,SAASA,EAAW,EAAE,OAAAC,GAAO,WAAAC,KAA8B;AAChE,QAAMC,IAAYF,EAAM,SAAS;AACjC,2BACG,OAAA,EAAI,cAAW,cAAa,WAAWG,EAAKF,GAAW,YAAY,GAClE,4BAACG,GAAA,EAAK,gBAAe,UAAS,KAAI,OAC/B,YAAM,IAAI,CAACC,GAAMC,MAAU;AAC1B,UAAMC,IAAgBD,MAAUJ;AAChC,WACE,gBAAAM;AAAA,MAACJ;AAAA,MAAA;AAAA,QAEC,gBAAe;AAAA,QACf,KAAI;AAAA,QAEH,UAAA;AAAA,UAAAG,IACC,gBAAAE,EAAC,UAAK,WAAU,sBAAqB,gBAAa,QAC/C,UAAAJ,EAAK,OACR,IAEA,gBAAAI;AAAA,YAACC;AAAA,YAAA;AAAA,cACE,GAAIL,EAAK,OAAO,EAAE,MAAMA,EAAK,KAAA,IAAS,CAAA;AAAA,cACvC,SAASA,EAAK;AAAA,cACd,WAAU;AAAA,cAET,UAAAA,EAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAGT,CAACE,KACA,gBAAAE,EAAC,QAAA,EAAK,WAAU,wBAAuB,eAAY,QAAO,UAAA,IAAA,CAE1D;AAAA,QAAA;AAAA,MAAA;AAAA,MApBG,GAAGJ,EAAK,KAAK,IAAIC,CAAK;AAAA,IAAA;AAAA,EAwBjC,CAAC,GACH,GACF;AAEJ;"}
1
+ {"version":3,"file":"Breadcrumb.js","sources":["../../../../../src/ui/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Flex } from \"layout\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./breadcrumb.css\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onPress?: () => void;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport function Breadcrumb({ items, className }: BreadcrumbProps) {\n const lastIndex = items.length - 1;\n return (\n <nav aria-label=\"Breadcrumb\" className={clsx(className, \"sds-breadcrumb\")}>\n <Flex alignSecondary=\"center\" gap=\"100\">\n {items.map((item, index) => {\n const isCurrentPage = index === lastIndex;\n return (\n <Flex\n key={`${item.label}-${index}`}\n alignSecondary=\"center\"\n gap=\"100\"\n >\n {isCurrentPage ? (\n <span className=\"breadcrumb-current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <AnchorOrButton\n {...(item.href ? { href: item.href } : {})}\n onPress={item.onPress}\n className=\"breadcrumb-link\"\n >\n {item.label}\n </AnchorOrButton>\n )}\n {!isCurrentPage && (\n <span className=\"breadcrumb-separator\" aria-hidden=\"true\">\n /\n </span>\n )}\n </Flex>\n );\n })}\n </Flex>\n </nav>\n );\n}\n"],"names":["Breadcrumb","items","className","lastIndex","clsx","Flex","item","index","isCurrentPage","jsxs","jsx","AnchorOrButton"],"mappings":";;;;;AAgBO,SAASA,EAAW,EAAE,OAAAC,GAAO,WAAAC,KAA8B;AAChE,QAAMC,IAAYF,EAAM,SAAS;AACjC,2BACG,OAAA,EAAI,cAAW,cAAa,WAAWG,EAAKF,GAAW,gBAAgB,GACtE,4BAACG,GAAA,EAAK,gBAAe,UAAS,KAAI,OAC/B,YAAM,IAAI,CAACC,GAAMC,MAAU;AAC1B,UAAMC,IAAgBD,MAAUJ;AAChC,WACE,gBAAAM;AAAA,MAACJ;AAAA,MAAA;AAAA,QAEC,gBAAe;AAAA,QACf,KAAI;AAAA,QAEH,UAAA;AAAA,UAAAG,IACC,gBAAAE,EAAC,UAAK,WAAU,sBAAqB,gBAAa,QAC/C,UAAAJ,EAAK,OACR,IAEA,gBAAAI;AAAA,YAACC;AAAA,YAAA;AAAA,cACE,GAAIL,EAAK,OAAO,EAAE,MAAMA,EAAK,KAAA,IAAS,CAAA;AAAA,cACvC,SAASA,EAAK;AAAA,cACd,WAAU;AAAA,cAET,UAAAA,EAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAGT,CAACE,KACA,gBAAAE,EAAC,QAAA,EAAK,WAAU,wBAAuB,eAAY,QAAO,UAAA,IAAA,CAE1D;AAAA,QAAA;AAAA,MAAA;AAAA,MApBG,GAAGJ,EAAK,KAAK,IAAIC,CAAK;AAAA,IAAA;AAAA,EAwBjC,CAAC,GACH,GACF;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),h=require("react");;/* empty css */const Z=require("../../primitives/Search/Search.cjs"),t=require("../../primitives/Table/Table.cjs"),_=require("../../icons/IconChevronDown.cjs"),A=require("../../icons/IconChevronRight.cjs"),K=require("../../primitives/Pagination/Pagination.cjs"),ee=require("../../primitives/PermissionGate/PermissionGate.cjs"),ae=require("../../layout/Flex/Flex.cjs");function se({action:n,item:c}){const o=n.isAllowed!==!1,d=e.jsx("button",{className:"data-table-row-action-btn","aria-label":n.label,disabled:!o,onClick:o?()=>n.onPress(c):void 0,children:n.icon});return o?d:e.jsx(ee.PermissionGate,{isAllowed:!1,noAccessLabel:n.noAccessLabel??"",children:d})}function M({columns:n,data:c,actions:o,rowActions:d,rowActionsLabel:R="",searchPlaceholder:L="Search...",searchKeys:g=[],isLoading:k=!1,loadingMessage:N="Loading...",emptyMessage:D="No records found",previousLabel:I="Previous",nextLabel:E="Next",pageSize:b=10,nestedColumns:T,getNestedData:S,nestedLoadingMessage:B="Loading...",nestedEmptyMessage:F="No records found",nestedSearchKeys:G,nestedSearchPlaceholder:H,nestedActions:j,nestedPageSize:$}){const[p,O]=h.useState(""),[Q,v]=h.useState(1),[z,J]=h.useState(new Set),[P,w]=h.useState(new Map),q=!!S&&!!T,f=!!d;function U(a){const s=a.id;J(r=>{const i=new Set(r);if(i.has(s))i.delete(s);else if(i.add(s),!P.has(s)){const l=S(a);l instanceof Promise?(w(u=>new Map(u).set(s,{status:"loading",data:[]})),l.then(u=>{w(Y=>new Map(Y).set(s,{status:"loaded",data:u}))})):w(u=>new Map(u).set(s,{status:"loaded",data:l}))}return i})}const x=g.length>0,V=x||!!o,m=h.useMemo(()=>{if(!p.trim()||!x)return c;const a=p.toLowerCase();return c.filter(s=>g.some(r=>String(s[r]??"").toLowerCase().includes(a)))},[c,p,g,x]),y=Math.max(1,Math.ceil(m.length/b)),C=Math.min(Q,y),W=m.slice((C-1)*b,C*b);function X(a,s){return s.render?s.render(a):String(a[s.key]??"")}return e.jsxs(ae.Flex,{direction:"column",gap:"300",className:"data-table",children:[V&&e.jsxs("div",{className:"data-table-toolbar",children:[x&&e.jsx(Z.Search,{placeholder:L,onSearch:a=>{O(a),v(1)},className:"data-table-search"}),o&&e.jsx("div",{className:"data-table-actions",children:o})]}),k?e.jsx("div",{role:"status","aria-live":"polite","aria-label":N,className:"data-table-status",children:N}):m.length===0?e.jsx("div",{role:"status",className:"data-table-status data-table-empty",children:D}):e.jsxs(t.Table,{grid:!0,children:[e.jsxs(t.TableHead,{children:[q&&e.jsx(t.TableColumn,{className:"data-table-expand-col"}),n.map((a,s)=>e.jsx(t.TableColumn,{align:a.align,isRowHeader:s===0,children:a.label},String(a.key))),f&&e.jsx(t.TableColumn,{align:"right",className:"data-table-row-actions-col",children:R})]}),e.jsx(t.TableBody,{children:W.flatMap(a=>{const s=z.has(a.id),r=P.get(a.id),i=[e.jsxs(t.TableRow,{id:a.id,children:[q&&e.jsx(t.TableCell,{className:"data-table-expand-cell",children:e.jsx("button",{className:"data-table-expand-btn","aria-label":s?"Collapse row":"Expand row","aria-expanded":s,onClick:()=>U(a),children:s?e.jsx(_.IconChevronDown,{size:"16"}):e.jsx(A.IconChevronRight,{size:"16"})})}),n.map(l=>e.jsx(t.TableCell,{align:l.align,children:X(a,l)},String(l.key))),f&&e.jsx(t.TableCell,{align:"right",className:"data-table-row-actions-cell",children:e.jsx("div",{className:"data-table-row-actions",children:(typeof d=="function"?d(a):d).map(l=>e.jsx(se,{action:l,item:a},l.key))})})]},a.id)];return s&&i.push(e.jsx(t.TableRow,{id:`${a.id}-nested`,className:"data-table-nested-row",children:e.jsx(t.TableCell,{colSpan:n.length+1+(f?1:0),className:"data-table-nested-cell",children:e.jsx(M,{columns:T,data:(r==null?void 0:r.data)??[],isLoading:!r||r.status==="loading",loadingMessage:B,emptyMessage:F,searchKeys:G,searchPlaceholder:H,actions:j==null?void 0:j(a),pageSize:$??b})})},`${a.id}-nested`)),i})})]}),e.jsx(K.Pagination,{page:C,totalPages:y,onPageChange:v,previousLabel:I,nextLabel:E})]})}exports.DataTable=M;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),h=require("react");;/* empty css */const K=require("../../primitives/Search/Search.cjs"),t=require("../../primitives/Table/Table.cjs"),ee=require("../../icons/IconChevronDown.cjs"),ae=require("../../icons/IconChevronRight.cjs"),se=require("../../primitives/Pagination/Pagination.cjs"),te=require("../../primitives/PermissionGate/PermissionGate.cjs"),le=require("../../layout/Flex/Flex.cjs");function ne({action:n,item:c}){const o=n.isAllowed!==!1,d=e.jsx("button",{className:"data-table-row-action-btn","aria-label":n.label,disabled:!o,onClick:o?()=>n.onPress(c):void 0,children:n.icon});return o?d:e.jsx(te.PermissionGate,{isAllowed:!1,noAccessLabel:n.noAccessLabel??"",children:d})}function R({columns:n,data:c,actions:o,rowActions:d,rowActionsLabel:L="",selectable:T=!1,selectedKeys:k,onSelectionChange:D,searchPlaceholder:I="Search...",searchKeys:g=[],isLoading:E=!1,loadingMessage:S="Loading...",emptyMessage:B="No records found",previousLabel:F="Previous",nextLabel:G="Next",pageSize:b=10,nestedColumns:v,getNestedData:P,nestedLoadingMessage:H="Loading...",nestedEmptyMessage:$="No records found",nestedSearchKeys:O,nestedSearchPlaceholder:Q,nestedActions:j,nestedPageSize:z}){const[p,J]=h.useState(""),[U,M]=h.useState(1),[V,W]=h.useState(new Set),[q,w]=h.useState(new Map),f=!!P&&!!v,m=!!d;function X(a){const s=a.id;W(r=>{const i=new Set(r);if(i.has(s))i.delete(s);else if(i.add(s),!q.has(s)){const l=P(a);l instanceof Promise?(w(u=>new Map(u).set(s,{status:"loading",data:[]})),l.then(u=>{w(A=>new Map(A).set(s,{status:"loaded",data:u}))})):w(u=>new Map(u).set(s,{status:"loaded",data:l}))}return i})}const x=g.length>0,Y=x||!!o,C=h.useMemo(()=>{if(!p.trim()||!x)return c;const a=p.toLowerCase();return c.filter(s=>g.some(r=>String(s[r]??"").toLowerCase().includes(a)))},[c,p,g,x]),y=Math.max(1,Math.ceil(C.length/b)),N=Math.min(U,y),Z=C.slice((N-1)*b,N*b);function _(a,s){return s.render?s.render(a):String(a[s.key]??"")}return e.jsxs(le.Flex,{direction:"column",gap:"300",className:"data-table",children:[Y&&e.jsxs("div",{className:"data-table-toolbar",children:[x&&e.jsx(K.Search,{placeholder:I,onSearch:a=>{J(a),M(1)},className:"data-table-search"}),o&&e.jsx("div",{className:"data-table-actions",children:o})]}),E?e.jsx("div",{role:"status","aria-live":"polite","aria-label":S,className:"data-table-status",children:S}):C.length===0?e.jsx("div",{role:"status",className:"data-table-status data-table-empty",children:B}):e.jsxs(t.Table,{grid:!0,selectionMode:T?"multiple":"none",selectedKeys:k,onSelectionChange:D,children:[e.jsxs(t.TableHead,{children:[f&&e.jsx(t.TableColumn,{className:"data-table-expand-col"}),n.map((a,s)=>e.jsx(t.TableColumn,{align:a.align,isRowHeader:s===0,children:a.label},String(a.key))),m&&e.jsx(t.TableColumn,{align:"right",className:"data-table-row-actions-col",children:L})]}),e.jsx(t.TableBody,{children:Z.flatMap(a=>{const s=V.has(a.id),r=q.get(a.id),i=[e.jsxs(t.TableRow,{id:a.id,children:[f&&e.jsx(t.TableCell,{className:"data-table-expand-cell",children:e.jsx("button",{className:"data-table-expand-btn","aria-label":s?"Collapse row":"Expand row","aria-expanded":s,onClick:()=>X(a),children:s?e.jsx(ee.IconChevronDown,{size:"16"}):e.jsx(ae.IconChevronRight,{size:"16"})})}),n.map(l=>e.jsx(t.TableCell,{align:l.align,children:_(a,l)},String(l.key))),m&&e.jsx(t.TableCell,{align:"right",className:"data-table-row-actions-cell",children:e.jsx("div",{className:"data-table-row-actions",children:(typeof d=="function"?d(a):d).map(l=>e.jsx(ne,{action:l,item:a},l.key))})})]},a.id)];return s&&i.push(e.jsx(t.TableRow,{id:`${a.id}-nested`,className:"data-table-nested-row",children:e.jsx(t.TableCell,{colSpan:n.length+(f?1:0)+(T?1:0)+(m?1:0),className:"data-table-nested-cell",children:e.jsx(R,{columns:v,data:(r==null?void 0:r.data)??[],isLoading:!r||r.status==="loading",loadingMessage:H,emptyMessage:$,searchKeys:O,searchPlaceholder:Q,actions:j==null?void 0:j(a),pageSize:z??b})})},`${a.id}-nested`)),i})})]}),e.jsx(se.Pagination,{page:N,totalPages:y,onPageChange:M,previousLabel:F,nextLabel:G})]})}exports.DataTable=R;
2
2
  //# sourceMappingURL=DataTable.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.cjs","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import {\n Pagination,\n PermissionGate,\n Search,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport \"./datatable.css\";\n\nexport interface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"start\" | \"center\" | \"right\";\n render?: (item: T) => ReactNode;\n}\n\nexport interface RowActionDef<T> {\n /** Unique key for this action. */\n key: string;\n /** aria-label for the button. */\n label: string;\n /** Icon element rendered inside the button. */\n icon: ReactNode;\n /** When false, button is disabled and a tooltip with `noAccessLabel` is shown. Default: true. */\n isAllowed?: boolean;\n /** Tooltip text shown when `isAllowed` is false. */\n noAccessLabel?: string;\n /** Called with the row item when the button is pressed. */\n onPress: (item: T) => void;\n}\n\nfunction RowActionButton<T>({\n action,\n item,\n}: {\n action: RowActionDef<T>;\n item: T;\n}) {\n const allowed = action.isAllowed !== false;\n const btn = (\n <button\n className=\"data-table-row-action-btn\"\n aria-label={action.label}\n disabled={!allowed}\n onClick={allowed ? () => action.onPress(item) : undefined}\n >\n {action.icon}\n </button>\n );\n if (allowed) return btn;\n return (\n <PermissionGate isAllowed={false} noAccessLabel={action.noAccessLabel ?? \"\"}>\n {btn}\n </PermissionGate>\n );\n}\n\n// O tipo da linha aninhada é independente de T (não há relação genérica entre linha pai e linhas\n// filhas), então \"any\" é usado deliberadamente como fronteira de erasure de tipo.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NestedStatus = { status: \"loading\"; data: never[] } | { status: \"loaded\"; data: any[] };\n\nexport interface DataTableProps<T extends { id: string }> {\n columns: Column<T>[];\n data: T[];\n actions?: ReactNode;\n /** Per-row action buttons rendered in a dedicated last column. */\n rowActions?: RowActionDef<T>[] | ((item: T) => RowActionDef<T>[]);\n /** Label for the row actions column header. Defaults to empty string. */\n rowActionsLabel?: string;\n searchPlaceholder?: string;\n searchKeys?: (keyof T)[];\n isLoading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n previousLabel?: string;\n nextLabel?: string;\n pageSize?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedColumns?: Column<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedSearchKeys?: (keyof any)[];\n nestedSearchPlaceholder?: string;\n nestedActions?: (item: T) => ReactNode;\n nestedPageSize?: number;\n}\n\nexport function DataTable<T extends { id: string }>({\n columns,\n data,\n actions,\n rowActions,\n rowActionsLabel = \"\",\n searchPlaceholder = \"Search...\",\n searchKeys = [],\n isLoading = false,\n loadingMessage = \"Loading...\",\n emptyMessage = \"No records found\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n nestedColumns,\n getNestedData,\n nestedLoadingMessage = \"Loading...\",\n nestedEmptyMessage = \"No records found\",\n nestedSearchKeys,\n nestedSearchPlaceholder,\n nestedActions,\n nestedPageSize,\n}: DataTableProps<T>) {\n const [query, setQuery] = useState(\"\");\n const [page, setPage] = useState(1);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [nestedCache, setNestedCache] = useState<Map<string, NestedStatus>>(new Map());\n\n const hasNested = !!getNestedData && !!nestedColumns;\n const hasRowActions = !!rowActions;\n\n function toggleRow(item: T) {\n const id = item.id;\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n if (!nestedCache.has(id)) {\n const result = getNestedData!(item);\n if (result instanceof Promise) {\n setNestedCache((c) => new Map(c).set(id, { status: \"loading\", data: [] }));\n result.then((rows) => {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: rows }));\n });\n } else {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: result }));\n }\n }\n }\n return next;\n });\n }\n\n const hasSearch = searchKeys.length > 0;\n const hasToolbar = hasSearch || !!actions;\n\n const filtered = useMemo(() => {\n if (!query.trim() || !hasSearch) return data;\n const lower = query.toLowerCase();\n return data.filter((item) =>\n searchKeys.some((k) =>\n String(item[k] ?? \"\")\n .toLowerCase()\n .includes(lower),\n ),\n );\n }, [data, query, searchKeys, hasSearch]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const pageData = filtered.slice(\n (currentPage - 1) * pageSize,\n currentPage * pageSize,\n );\n\n function getCell(item: T, col: Column<T>): ReactNode {\n if (col.render) return col.render(item);\n return String((item as Record<string, unknown>)[col.key as string] ?? \"\");\n }\n\n return (\n <Flex direction=\"column\" gap=\"300\" className=\"data-table\">\n {hasToolbar && (\n <div className=\"data-table-toolbar\">\n {hasSearch && (\n <Search\n placeholder={searchPlaceholder}\n onSearch={(v) => {\n setQuery(v);\n setPage(1);\n }}\n className=\"data-table-search\"\n />\n )}\n {actions && <div className=\"data-table-actions\">{actions}</div>}\n </div>\n )}\n\n {isLoading ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={loadingMessage}\n className=\"data-table-status\"\n >\n {loadingMessage}\n </div>\n ) : filtered.length === 0 ? (\n <div role=\"status\" className=\"data-table-status data-table-empty\">\n {emptyMessage}\n </div>\n ) : (\n <Table grid>\n <TableHead>\n {hasNested && <TableColumn className=\"data-table-expand-col\" />}\n {columns.map((col, idx) => (\n <TableColumn\n key={String(col.key)}\n align={col.align}\n isRowHeader={idx === 0}\n >\n {col.label}\n </TableColumn>\n ))}\n {hasRowActions && (\n <TableColumn align=\"right\" className=\"data-table-row-actions-col\">\n {rowActionsLabel}\n </TableColumn>\n )}\n </TableHead>\n <TableBody>\n {pageData.flatMap((item) => {\n const isExpanded = expanded.has(item.id);\n const cached = nestedCache.get(item.id);\n const rows: ReactNode[] = [\n <TableRow key={item.id} id={item.id}>\n {hasNested && (\n <TableCell className=\"data-table-expand-cell\">\n <button\n className=\"data-table-expand-btn\"\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n onClick={() => toggleRow(item)}\n >\n {isExpanded ? (\n <IconChevronDown size=\"16\" />\n ) : (\n <IconChevronRight size=\"16\" />\n )}\n </button>\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={String(col.key)} align={col.align}>\n {getCell(item, col)}\n </TableCell>\n ))}\n {hasRowActions && (\n <TableCell align=\"right\" className=\"data-table-row-actions-cell\">\n <div className=\"data-table-row-actions\">\n {(typeof rowActions === \"function\"\n ? rowActions(item)\n : rowActions!\n ).map((action) => (\n <RowActionButton key={action.key} action={action} item={item} />\n ))}\n </div>\n </TableCell>\n )}\n </TableRow>,\n ];\n if (isExpanded) {\n rows.push(\n <TableRow key={`${item.id}-nested`} id={`${item.id}-nested`} className=\"data-table-nested-row\">\n <TableCell\n colSpan={columns.length + 1 + (hasRowActions ? 1 : 0)}\n className=\"data-table-nested-cell\"\n >\n <DataTable\n columns={nestedColumns!}\n data={cached?.data ?? []}\n isLoading={!cached || cached.status === \"loading\"}\n loadingMessage={nestedLoadingMessage}\n emptyMessage={nestedEmptyMessage}\n searchKeys={nestedSearchKeys}\n searchPlaceholder={nestedSearchPlaceholder}\n actions={nestedActions?.(item)}\n pageSize={nestedPageSize ?? pageSize}\n />\n </TableCell>\n </TableRow>,\n );\n }\n return rows;\n })}\n </TableBody>\n </Table>\n )}\n\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n previousLabel={previousLabel}\n nextLabel={nextLabel}\n />\n </Flex>\n );\n}\n"],"names":["RowActionButton","action","item","allowed","btn","jsx","PermissionGate","DataTable","columns","data","actions","rowActions","rowActionsLabel","searchPlaceholder","searchKeys","isLoading","loadingMessage","emptyMessage","previousLabel","nextLabel","pageSize","nestedColumns","getNestedData","nestedLoadingMessage","nestedEmptyMessage","nestedSearchKeys","nestedSearchPlaceholder","nestedActions","nestedPageSize","query","setQuery","useState","page","setPage","expanded","setExpanded","nestedCache","setNestedCache","hasNested","hasRowActions","toggleRow","id","prev","next","result","c","rows","hasSearch","hasToolbar","filtered","useMemo","lower","k","totalPages","currentPage","pageData","getCell","col","Flex","jsxs","Search","v","Table","TableHead","TableColumn","idx","TableBody","isExpanded","cached","TableRow","TableCell","IconChevronDown","IconChevronRight","Pagination"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.cjs","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import {\n Pagination,\n PermissionGate,\n Search,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { Selection } from \"react-aria-components\";\nimport \"./datatable.css\";\n\nexport interface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"start\" | \"center\" | \"right\";\n render?: (item: T) => ReactNode;\n}\n\nexport interface RowActionDef<T> {\n /** Unique key for this action. */\n key: string;\n /** aria-label for the button. */\n label: string;\n /** Icon element rendered inside the button. */\n icon: ReactNode;\n /** When false, button is disabled and a tooltip with `noAccessLabel` is shown. Default: true. */\n isAllowed?: boolean;\n /** Tooltip text shown when `isAllowed` is false. */\n noAccessLabel?: string;\n /** Called with the row item when the button is pressed. */\n onPress: (item: T) => void;\n}\n\nfunction RowActionButton<T>({\n action,\n item,\n}: {\n action: RowActionDef<T>;\n item: T;\n}) {\n const allowed = action.isAllowed !== false;\n const btn = (\n <button\n className=\"data-table-row-action-btn\"\n aria-label={action.label}\n disabled={!allowed}\n onClick={allowed ? () => action.onPress(item) : undefined}\n >\n {action.icon}\n </button>\n );\n if (allowed) return btn;\n return (\n <PermissionGate isAllowed={false} noAccessLabel={action.noAccessLabel ?? \"\"}>\n {btn}\n </PermissionGate>\n );\n}\n\n// O tipo da linha aninhada é independente de T (não há relação genérica entre linha pai e linhas\n// filhas), então \"any\" é usado deliberadamente como fronteira de erasure de tipo.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NestedStatus = { status: \"loading\"; data: never[] } | { status: \"loaded\"; data: any[] };\n\nexport interface DataTableProps<T extends { id: string }> {\n columns: Column<T>[];\n data: T[];\n actions?: ReactNode;\n /** Per-row action buttons rendered in a dedicated last column. */\n rowActions?: RowActionDef<T>[] | ((item: T) => RowActionDef<T>[]);\n /** Label for the row actions column header. Defaults to empty string. */\n rowActionsLabel?: string;\n /**\n * When true, renders a checkbox column before the first data column — a per-row checkbox on\n * every row, plus a \"select all\" checkbox in the header. Off by default.\n */\n selectable?: boolean;\n /** Controlled selection state. Omit to let the table manage its own selection internally. */\n selectedKeys?: Selection;\n onSelectionChange?: (keys: Selection) => void;\n searchPlaceholder?: string;\n searchKeys?: (keyof T)[];\n isLoading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n previousLabel?: string;\n nextLabel?: string;\n pageSize?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedColumns?: Column<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedSearchKeys?: (keyof any)[];\n nestedSearchPlaceholder?: string;\n nestedActions?: (item: T) => ReactNode;\n nestedPageSize?: number;\n}\n\nexport function DataTable<T extends { id: string }>({\n columns,\n data,\n actions,\n rowActions,\n rowActionsLabel = \"\",\n selectable = false,\n selectedKeys,\n onSelectionChange,\n searchPlaceholder = \"Search...\",\n searchKeys = [],\n isLoading = false,\n loadingMessage = \"Loading...\",\n emptyMessage = \"No records found\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n nestedColumns,\n getNestedData,\n nestedLoadingMessage = \"Loading...\",\n nestedEmptyMessage = \"No records found\",\n nestedSearchKeys,\n nestedSearchPlaceholder,\n nestedActions,\n nestedPageSize,\n}: DataTableProps<T>) {\n const [query, setQuery] = useState(\"\");\n const [page, setPage] = useState(1);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [nestedCache, setNestedCache] = useState<Map<string, NestedStatus>>(new Map());\n\n const hasNested = !!getNestedData && !!nestedColumns;\n const hasRowActions = !!rowActions;\n\n function toggleRow(item: T) {\n const id = item.id;\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n if (!nestedCache.has(id)) {\n const result = getNestedData!(item);\n if (result instanceof Promise) {\n setNestedCache((c) => new Map(c).set(id, { status: \"loading\", data: [] }));\n result.then((rows) => {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: rows }));\n });\n } else {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: result }));\n }\n }\n }\n return next;\n });\n }\n\n const hasSearch = searchKeys.length > 0;\n const hasToolbar = hasSearch || !!actions;\n\n const filtered = useMemo(() => {\n if (!query.trim() || !hasSearch) return data;\n const lower = query.toLowerCase();\n return data.filter((item) =>\n searchKeys.some((k) =>\n String(item[k] ?? \"\")\n .toLowerCase()\n .includes(lower),\n ),\n );\n }, [data, query, searchKeys, hasSearch]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const pageData = filtered.slice(\n (currentPage - 1) * pageSize,\n currentPage * pageSize,\n );\n\n function getCell(item: T, col: Column<T>): ReactNode {\n if (col.render) return col.render(item);\n return String((item as Record<string, unknown>)[col.key as string] ?? \"\");\n }\n\n return (\n <Flex direction=\"column\" gap=\"300\" className=\"data-table\">\n {hasToolbar && (\n <div className=\"data-table-toolbar\">\n {hasSearch && (\n <Search\n placeholder={searchPlaceholder}\n onSearch={(v) => {\n setQuery(v);\n setPage(1);\n }}\n className=\"data-table-search\"\n />\n )}\n {actions && <div className=\"data-table-actions\">{actions}</div>}\n </div>\n )}\n\n {isLoading ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={loadingMessage}\n className=\"data-table-status\"\n >\n {loadingMessage}\n </div>\n ) : filtered.length === 0 ? (\n <div role=\"status\" className=\"data-table-status data-table-empty\">\n {emptyMessage}\n </div>\n ) : (\n <Table\n grid\n selectionMode={selectable ? \"multiple\" : \"none\"}\n selectedKeys={selectedKeys}\n onSelectionChange={onSelectionChange}\n >\n <TableHead>\n {hasNested && <TableColumn className=\"data-table-expand-col\" />}\n {columns.map((col, idx) => (\n <TableColumn\n key={String(col.key)}\n align={col.align}\n isRowHeader={idx === 0}\n >\n {col.label}\n </TableColumn>\n ))}\n {hasRowActions && (\n <TableColumn align=\"right\" className=\"data-table-row-actions-col\">\n {rowActionsLabel}\n </TableColumn>\n )}\n </TableHead>\n <TableBody>\n {pageData.flatMap((item) => {\n const isExpanded = expanded.has(item.id);\n const cached = nestedCache.get(item.id);\n const rows: ReactNode[] = [\n <TableRow key={item.id} id={item.id}>\n {hasNested && (\n <TableCell className=\"data-table-expand-cell\">\n <button\n className=\"data-table-expand-btn\"\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n onClick={() => toggleRow(item)}\n >\n {isExpanded ? (\n <IconChevronDown size=\"16\" />\n ) : (\n <IconChevronRight size=\"16\" />\n )}\n </button>\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={String(col.key)} align={col.align}>\n {getCell(item, col)}\n </TableCell>\n ))}\n {hasRowActions && (\n <TableCell align=\"right\" className=\"data-table-row-actions-cell\">\n <div className=\"data-table-row-actions\">\n {(typeof rowActions === \"function\"\n ? rowActions(item)\n : rowActions!\n ).map((action) => (\n <RowActionButton key={action.key} action={action} item={item} />\n ))}\n </div>\n </TableCell>\n )}\n </TableRow>,\n ];\n if (isExpanded) {\n rows.push(\n <TableRow key={`${item.id}-nested`} id={`${item.id}-nested`} className=\"data-table-nested-row\">\n <TableCell\n colSpan={\n columns.length +\n (hasNested ? 1 : 0) +\n (selectable ? 1 : 0) +\n (hasRowActions ? 1 : 0)\n }\n className=\"data-table-nested-cell\"\n >\n <DataTable\n columns={nestedColumns!}\n data={cached?.data ?? []}\n isLoading={!cached || cached.status === \"loading\"}\n loadingMessage={nestedLoadingMessage}\n emptyMessage={nestedEmptyMessage}\n searchKeys={nestedSearchKeys}\n searchPlaceholder={nestedSearchPlaceholder}\n actions={nestedActions?.(item)}\n pageSize={nestedPageSize ?? pageSize}\n />\n </TableCell>\n </TableRow>,\n );\n }\n return rows;\n })}\n </TableBody>\n </Table>\n )}\n\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n previousLabel={previousLabel}\n nextLabel={nextLabel}\n />\n </Flex>\n );\n}\n"],"names":["RowActionButton","action","item","allowed","btn","jsx","PermissionGate","DataTable","columns","data","actions","rowActions","rowActionsLabel","selectable","selectedKeys","onSelectionChange","searchPlaceholder","searchKeys","isLoading","loadingMessage","emptyMessage","previousLabel","nextLabel","pageSize","nestedColumns","getNestedData","nestedLoadingMessage","nestedEmptyMessage","nestedSearchKeys","nestedSearchPlaceholder","nestedActions","nestedPageSize","query","setQuery","useState","page","setPage","expanded","setExpanded","nestedCache","setNestedCache","hasNested","hasRowActions","toggleRow","id","prev","next","result","c","rows","hasSearch","hasToolbar","filtered","useMemo","lower","k","totalPages","currentPage","pageData","getCell","col","Flex","jsxs","Search","v","Table","TableHead","TableColumn","idx","TableBody","isExpanded","cached","TableRow","TableCell","IconChevronDown","IconChevronRight","Pagination"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { jsxs as h, jsx as e } from "react/jsx-runtime";
2
- import { useState as u, useMemo as A } from "react";
2
+ import { useState as b, useMemo as ea } from "react";
3
3
  /* empty css */
4
- import { Search as K } from "../../primitives/Search/Search.js";
5
- import { Table as aa, TableHead as ea, TableColumn as M, TableBody as ta, TableRow as E, TableCell as g } from "../../primitives/Table/Table.js";
6
- import { IconChevronDown as la } from "../../icons/IconChevronDown.js";
7
- import { IconChevronRight as na } from "../../icons/IconChevronRight.js";
8
- import { Pagination as sa } from "../../primitives/Pagination/Pagination.js";
9
- import { PermissionGate as ra } from "../../primitives/PermissionGate/PermissionGate.js";
10
- import { Flex as oa } from "../../layout/Flex/Flex.js";
11
- function da({
4
+ import { Search as ta } from "../../primitives/Search/Search.js";
5
+ import { Table as la, TableHead as na, TableColumn as P, TableBody as sa, TableRow as j, TableCell as g } from "../../primitives/Table/Table.js";
6
+ import { IconChevronDown as ra } from "../../icons/IconChevronDown.js";
7
+ import { IconChevronRight as oa } from "../../icons/IconChevronRight.js";
8
+ import { Pagination as da } from "../../primitives/Pagination/Pagination.js";
9
+ import { PermissionGate as ia } from "../../primitives/PermissionGate/PermissionGate.js";
10
+ import { Flex as ca } from "../../layout/Flex/Flex.js";
11
+ function ha({
12
12
  action: n,
13
13
  item: i
14
14
  }) {
@@ -22,154 +22,166 @@ function da({
22
22
  children: n.icon
23
23
  }
24
24
  );
25
- return r ? o : /* @__PURE__ */ e(ra, { isAllowed: !1, noAccessLabel: n.noAccessLabel ?? "", children: o });
25
+ return r ? o : /* @__PURE__ */ e(ia, { isAllowed: !1, noAccessLabel: n.noAccessLabel ?? "", children: o });
26
26
  }
27
- function ia({
27
+ function pa({
28
28
  columns: n,
29
29
  data: i,
30
30
  actions: r,
31
31
  rowActions: o,
32
- rowActionsLabel: j = "",
33
- searchPlaceholder: B = "Search...",
32
+ rowActionsLabel: B = "",
33
+ selectable: S = !1,
34
+ selectedKeys: D,
35
+ onSelectionChange: H,
36
+ searchPlaceholder: I = "Search...",
34
37
  searchKeys: m = [],
35
- isLoading: D = !1,
36
- loadingMessage: P = "Loading...",
37
- emptyMessage: H = "No records found",
38
- previousLabel: I = "Previous",
39
- nextLabel: $ = "Next",
40
- pageSize: b = 10,
41
- nestedColumns: S,
42
- getNestedData: y,
43
- nestedLoadingMessage: q = "Loading...",
44
- nestedEmptyMessage: F = "No records found",
45
- nestedSearchKeys: G,
46
- nestedSearchPlaceholder: Q,
38
+ isLoading: $ = !1,
39
+ loadingMessage: y = "Loading...",
40
+ emptyMessage: q = "No records found",
41
+ previousLabel: F = "Previous",
42
+ nextLabel: G = "Next",
43
+ pageSize: p = 10,
44
+ nestedColumns: T,
45
+ getNestedData: L,
46
+ nestedLoadingMessage: Q = "Loading...",
47
+ nestedEmptyMessage: z = "No records found",
48
+ nestedSearchKeys: J,
49
+ nestedSearchPlaceholder: O,
47
50
  nestedActions: f,
48
- nestedPageSize: z
51
+ nestedPageSize: U
49
52
  }) {
50
- const [w, J] = u(""), [O, T] = u(1), [U, V] = u(/* @__PURE__ */ new Set()), [L, N] = u(/* @__PURE__ */ new Map()), k = !!y && !!S, x = !!o;
51
- function W(a) {
53
+ const [w, V] = b(""), [W, k] = b(1), [X, Y] = b(/* @__PURE__ */ new Set()), [R, N] = b(/* @__PURE__ */ new Map()), x = !!L && !!T, C = !!o;
54
+ function Z(a) {
52
55
  const t = a.id;
53
- V((s) => {
56
+ Y((s) => {
54
57
  const d = new Set(s);
55
58
  if (d.has(t))
56
59
  d.delete(t);
57
- else if (d.add(t), !L.has(t)) {
58
- const l = y(a);
60
+ else if (d.add(t), !R.has(t)) {
61
+ const l = L(a);
59
62
  l instanceof Promise ? (N((c) => new Map(c).set(t, { status: "loading", data: [] })), l.then((c) => {
60
- N((_) => new Map(_).set(t, { status: "loaded", data: c }));
63
+ N((aa) => new Map(aa).set(t, { status: "loaded", data: c }));
61
64
  })) : N((c) => new Map(c).set(t, { status: "loaded", data: l }));
62
65
  }
63
66
  return d;
64
67
  });
65
68
  }
66
- const p = m.length > 0, X = p || !!r, C = A(() => {
67
- if (!w.trim() || !p) return i;
69
+ const u = m.length > 0, _ = u || !!r, M = ea(() => {
70
+ if (!w.trim() || !u) return i;
68
71
  const a = w.toLowerCase();
69
72
  return i.filter(
70
73
  (t) => m.some(
71
74
  (s) => String(t[s] ?? "").toLowerCase().includes(a)
72
75
  )
73
76
  );
74
- }, [i, w, m, p]), R = Math.max(1, Math.ceil(C.length / b)), v = Math.min(O, R), Y = C.slice(
75
- (v - 1) * b,
76
- v * b
77
+ }, [i, w, m, u]), E = Math.max(1, Math.ceil(M.length / p)), v = Math.min(W, E), A = M.slice(
78
+ (v - 1) * p,
79
+ v * p
77
80
  );
78
- function Z(a, t) {
81
+ function K(a, t) {
79
82
  return t.render ? t.render(a) : String(a[t.key] ?? "");
80
83
  }
81
- return /* @__PURE__ */ h(oa, { direction: "column", gap: "300", className: "data-table", children: [
82
- X && /* @__PURE__ */ h("div", { className: "data-table-toolbar", children: [
83
- p && /* @__PURE__ */ e(
84
- K,
84
+ return /* @__PURE__ */ h(ca, { direction: "column", gap: "300", className: "data-table", children: [
85
+ _ && /* @__PURE__ */ h("div", { className: "data-table-toolbar", children: [
86
+ u && /* @__PURE__ */ e(
87
+ ta,
85
88
  {
86
- placeholder: B,
89
+ placeholder: I,
87
90
  onSearch: (a) => {
88
- J(a), T(1);
91
+ V(a), k(1);
89
92
  },
90
93
  className: "data-table-search"
91
94
  }
92
95
  ),
93
96
  r && /* @__PURE__ */ e("div", { className: "data-table-actions", children: r })
94
97
  ] }),
95
- D ? /* @__PURE__ */ e(
98
+ $ ? /* @__PURE__ */ e(
96
99
  "div",
97
100
  {
98
101
  role: "status",
99
102
  "aria-live": "polite",
100
- "aria-label": P,
103
+ "aria-label": y,
101
104
  className: "data-table-status",
102
- children: P
105
+ children: y
103
106
  }
104
- ) : C.length === 0 ? /* @__PURE__ */ e("div", { role: "status", className: "data-table-status data-table-empty", children: H }) : /* @__PURE__ */ h(aa, { grid: !0, children: [
105
- /* @__PURE__ */ h(ea, { children: [
106
- k && /* @__PURE__ */ e(M, { className: "data-table-expand-col" }),
107
- n.map((a, t) => /* @__PURE__ */ e(
108
- M,
109
- {
110
- align: a.align,
111
- isRowHeader: t === 0,
112
- children: a.label
113
- },
114
- String(a.key)
115
- )),
116
- x && /* @__PURE__ */ e(M, { align: "right", className: "data-table-row-actions-col", children: j })
117
- ] }),
118
- /* @__PURE__ */ e(ta, { children: Y.flatMap((a) => {
119
- const t = U.has(a.id), s = L.get(a.id), d = [
120
- /* @__PURE__ */ h(E, { id: a.id, children: [
121
- k && /* @__PURE__ */ e(g, { className: "data-table-expand-cell", children: /* @__PURE__ */ e(
122
- "button",
107
+ ) : M.length === 0 ? /* @__PURE__ */ e("div", { role: "status", className: "data-table-status data-table-empty", children: q }) : /* @__PURE__ */ h(
108
+ la,
109
+ {
110
+ grid: !0,
111
+ selectionMode: S ? "multiple" : "none",
112
+ selectedKeys: D,
113
+ onSelectionChange: H,
114
+ children: [
115
+ /* @__PURE__ */ h(na, { children: [
116
+ x && /* @__PURE__ */ e(P, { className: "data-table-expand-col" }),
117
+ n.map((a, t) => /* @__PURE__ */ e(
118
+ P,
123
119
  {
124
- className: "data-table-expand-btn",
125
- "aria-label": t ? "Collapse row" : "Expand row",
126
- "aria-expanded": t,
127
- onClick: () => W(a),
128
- children: t ? /* @__PURE__ */ e(la, { size: "16" }) : /* @__PURE__ */ e(na, { size: "16" })
129
- }
130
- ) }),
131
- n.map((l) => /* @__PURE__ */ e(g, { align: l.align, children: Z(a, l) }, String(l.key))),
132
- x && /* @__PURE__ */ e(g, { align: "right", className: "data-table-row-actions-cell", children: /* @__PURE__ */ e("div", { className: "data-table-row-actions", children: (typeof o == "function" ? o(a) : o).map((l) => /* @__PURE__ */ e(da, { action: l, item: a }, l.key)) }) })
133
- ] }, a.id)
134
- ];
135
- return t && d.push(
136
- /* @__PURE__ */ e(E, { id: `${a.id}-nested`, className: "data-table-nested-row", children: /* @__PURE__ */ e(
137
- g,
138
- {
139
- colSpan: n.length + 1 + (x ? 1 : 0),
140
- className: "data-table-nested-cell",
141
- children: /* @__PURE__ */ e(
142
- ia,
120
+ align: a.align,
121
+ isRowHeader: t === 0,
122
+ children: a.label
123
+ },
124
+ String(a.key)
125
+ )),
126
+ C && /* @__PURE__ */ e(P, { align: "right", className: "data-table-row-actions-col", children: B })
127
+ ] }),
128
+ /* @__PURE__ */ e(sa, { children: A.flatMap((a) => {
129
+ const t = X.has(a.id), s = R.get(a.id), d = [
130
+ /* @__PURE__ */ h(j, { id: a.id, children: [
131
+ x && /* @__PURE__ */ e(g, { className: "data-table-expand-cell", children: /* @__PURE__ */ e(
132
+ "button",
133
+ {
134
+ className: "data-table-expand-btn",
135
+ "aria-label": t ? "Collapse row" : "Expand row",
136
+ "aria-expanded": t,
137
+ onClick: () => Z(a),
138
+ children: t ? /* @__PURE__ */ e(ra, { size: "16" }) : /* @__PURE__ */ e(oa, { size: "16" })
139
+ }
140
+ ) }),
141
+ n.map((l) => /* @__PURE__ */ e(g, { align: l.align, children: K(a, l) }, String(l.key))),
142
+ C && /* @__PURE__ */ e(g, { align: "right", className: "data-table-row-actions-cell", children: /* @__PURE__ */ e("div", { className: "data-table-row-actions", children: (typeof o == "function" ? o(a) : o).map((l) => /* @__PURE__ */ e(ha, { action: l, item: a }, l.key)) }) })
143
+ ] }, a.id)
144
+ ];
145
+ return t && d.push(
146
+ /* @__PURE__ */ e(j, { id: `${a.id}-nested`, className: "data-table-nested-row", children: /* @__PURE__ */ e(
147
+ g,
143
148
  {
144
- columns: S,
145
- data: (s == null ? void 0 : s.data) ?? [],
146
- isLoading: !s || s.status === "loading",
147
- loadingMessage: q,
148
- emptyMessage: F,
149
- searchKeys: G,
150
- searchPlaceholder: Q,
151
- actions: f == null ? void 0 : f(a),
152
- pageSize: z ?? b
149
+ colSpan: n.length + (x ? 1 : 0) + (S ? 1 : 0) + (C ? 1 : 0),
150
+ className: "data-table-nested-cell",
151
+ children: /* @__PURE__ */ e(
152
+ pa,
153
+ {
154
+ columns: T,
155
+ data: (s == null ? void 0 : s.data) ?? [],
156
+ isLoading: !s || s.status === "loading",
157
+ loadingMessage: Q,
158
+ emptyMessage: z,
159
+ searchKeys: J,
160
+ searchPlaceholder: O,
161
+ actions: f == null ? void 0 : f(a),
162
+ pageSize: U ?? p
163
+ }
164
+ )
153
165
  }
154
- )
155
- }
156
- ) }, `${a.id}-nested`)
157
- ), d;
158
- }) })
159
- ] }),
166
+ ) }, `${a.id}-nested`)
167
+ ), d;
168
+ }) })
169
+ ]
170
+ }
171
+ ),
160
172
  /* @__PURE__ */ e(
161
- sa,
173
+ da,
162
174
  {
163
175
  page: v,
164
- totalPages: R,
165
- onPageChange: T,
166
- previousLabel: I,
167
- nextLabel: $
176
+ totalPages: E,
177
+ onPageChange: k,
178
+ previousLabel: F,
179
+ nextLabel: G
168
180
  }
169
181
  )
170
182
  ] });
171
183
  }
172
184
  export {
173
- ia as DataTable
185
+ pa as DataTable
174
186
  };
175
187
  //# sourceMappingURL=DataTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import {\n Pagination,\n PermissionGate,\n Search,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport \"./datatable.css\";\n\nexport interface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"start\" | \"center\" | \"right\";\n render?: (item: T) => ReactNode;\n}\n\nexport interface RowActionDef<T> {\n /** Unique key for this action. */\n key: string;\n /** aria-label for the button. */\n label: string;\n /** Icon element rendered inside the button. */\n icon: ReactNode;\n /** When false, button is disabled and a tooltip with `noAccessLabel` is shown. Default: true. */\n isAllowed?: boolean;\n /** Tooltip text shown when `isAllowed` is false. */\n noAccessLabel?: string;\n /** Called with the row item when the button is pressed. */\n onPress: (item: T) => void;\n}\n\nfunction RowActionButton<T>({\n action,\n item,\n}: {\n action: RowActionDef<T>;\n item: T;\n}) {\n const allowed = action.isAllowed !== false;\n const btn = (\n <button\n className=\"data-table-row-action-btn\"\n aria-label={action.label}\n disabled={!allowed}\n onClick={allowed ? () => action.onPress(item) : undefined}\n >\n {action.icon}\n </button>\n );\n if (allowed) return btn;\n return (\n <PermissionGate isAllowed={false} noAccessLabel={action.noAccessLabel ?? \"\"}>\n {btn}\n </PermissionGate>\n );\n}\n\n// O tipo da linha aninhada é independente de T (não há relação genérica entre linha pai e linhas\n// filhas), então \"any\" é usado deliberadamente como fronteira de erasure de tipo.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NestedStatus = { status: \"loading\"; data: never[] } | { status: \"loaded\"; data: any[] };\n\nexport interface DataTableProps<T extends { id: string }> {\n columns: Column<T>[];\n data: T[];\n actions?: ReactNode;\n /** Per-row action buttons rendered in a dedicated last column. */\n rowActions?: RowActionDef<T>[] | ((item: T) => RowActionDef<T>[]);\n /** Label for the row actions column header. Defaults to empty string. */\n rowActionsLabel?: string;\n searchPlaceholder?: string;\n searchKeys?: (keyof T)[];\n isLoading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n previousLabel?: string;\n nextLabel?: string;\n pageSize?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedColumns?: Column<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedSearchKeys?: (keyof any)[];\n nestedSearchPlaceholder?: string;\n nestedActions?: (item: T) => ReactNode;\n nestedPageSize?: number;\n}\n\nexport function DataTable<T extends { id: string }>({\n columns,\n data,\n actions,\n rowActions,\n rowActionsLabel = \"\",\n searchPlaceholder = \"Search...\",\n searchKeys = [],\n isLoading = false,\n loadingMessage = \"Loading...\",\n emptyMessage = \"No records found\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n nestedColumns,\n getNestedData,\n nestedLoadingMessage = \"Loading...\",\n nestedEmptyMessage = \"No records found\",\n nestedSearchKeys,\n nestedSearchPlaceholder,\n nestedActions,\n nestedPageSize,\n}: DataTableProps<T>) {\n const [query, setQuery] = useState(\"\");\n const [page, setPage] = useState(1);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [nestedCache, setNestedCache] = useState<Map<string, NestedStatus>>(new Map());\n\n const hasNested = !!getNestedData && !!nestedColumns;\n const hasRowActions = !!rowActions;\n\n function toggleRow(item: T) {\n const id = item.id;\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n if (!nestedCache.has(id)) {\n const result = getNestedData!(item);\n if (result instanceof Promise) {\n setNestedCache((c) => new Map(c).set(id, { status: \"loading\", data: [] }));\n result.then((rows) => {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: rows }));\n });\n } else {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: result }));\n }\n }\n }\n return next;\n });\n }\n\n const hasSearch = searchKeys.length > 0;\n const hasToolbar = hasSearch || !!actions;\n\n const filtered = useMemo(() => {\n if (!query.trim() || !hasSearch) return data;\n const lower = query.toLowerCase();\n return data.filter((item) =>\n searchKeys.some((k) =>\n String(item[k] ?? \"\")\n .toLowerCase()\n .includes(lower),\n ),\n );\n }, [data, query, searchKeys, hasSearch]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const pageData = filtered.slice(\n (currentPage - 1) * pageSize,\n currentPage * pageSize,\n );\n\n function getCell(item: T, col: Column<T>): ReactNode {\n if (col.render) return col.render(item);\n return String((item as Record<string, unknown>)[col.key as string] ?? \"\");\n }\n\n return (\n <Flex direction=\"column\" gap=\"300\" className=\"data-table\">\n {hasToolbar && (\n <div className=\"data-table-toolbar\">\n {hasSearch && (\n <Search\n placeholder={searchPlaceholder}\n onSearch={(v) => {\n setQuery(v);\n setPage(1);\n }}\n className=\"data-table-search\"\n />\n )}\n {actions && <div className=\"data-table-actions\">{actions}</div>}\n </div>\n )}\n\n {isLoading ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={loadingMessage}\n className=\"data-table-status\"\n >\n {loadingMessage}\n </div>\n ) : filtered.length === 0 ? (\n <div role=\"status\" className=\"data-table-status data-table-empty\">\n {emptyMessage}\n </div>\n ) : (\n <Table grid>\n <TableHead>\n {hasNested && <TableColumn className=\"data-table-expand-col\" />}\n {columns.map((col, idx) => (\n <TableColumn\n key={String(col.key)}\n align={col.align}\n isRowHeader={idx === 0}\n >\n {col.label}\n </TableColumn>\n ))}\n {hasRowActions && (\n <TableColumn align=\"right\" className=\"data-table-row-actions-col\">\n {rowActionsLabel}\n </TableColumn>\n )}\n </TableHead>\n <TableBody>\n {pageData.flatMap((item) => {\n const isExpanded = expanded.has(item.id);\n const cached = nestedCache.get(item.id);\n const rows: ReactNode[] = [\n <TableRow key={item.id} id={item.id}>\n {hasNested && (\n <TableCell className=\"data-table-expand-cell\">\n <button\n className=\"data-table-expand-btn\"\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n onClick={() => toggleRow(item)}\n >\n {isExpanded ? (\n <IconChevronDown size=\"16\" />\n ) : (\n <IconChevronRight size=\"16\" />\n )}\n </button>\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={String(col.key)} align={col.align}>\n {getCell(item, col)}\n </TableCell>\n ))}\n {hasRowActions && (\n <TableCell align=\"right\" className=\"data-table-row-actions-cell\">\n <div className=\"data-table-row-actions\">\n {(typeof rowActions === \"function\"\n ? rowActions(item)\n : rowActions!\n ).map((action) => (\n <RowActionButton key={action.key} action={action} item={item} />\n ))}\n </div>\n </TableCell>\n )}\n </TableRow>,\n ];\n if (isExpanded) {\n rows.push(\n <TableRow key={`${item.id}-nested`} id={`${item.id}-nested`} className=\"data-table-nested-row\">\n <TableCell\n colSpan={columns.length + 1 + (hasRowActions ? 1 : 0)}\n className=\"data-table-nested-cell\"\n >\n <DataTable\n columns={nestedColumns!}\n data={cached?.data ?? []}\n isLoading={!cached || cached.status === \"loading\"}\n loadingMessage={nestedLoadingMessage}\n emptyMessage={nestedEmptyMessage}\n searchKeys={nestedSearchKeys}\n searchPlaceholder={nestedSearchPlaceholder}\n actions={nestedActions?.(item)}\n pageSize={nestedPageSize ?? pageSize}\n />\n </TableCell>\n </TableRow>,\n );\n }\n return rows;\n })}\n </TableBody>\n </Table>\n )}\n\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n previousLabel={previousLabel}\n nextLabel={nextLabel}\n />\n </Flex>\n );\n}\n"],"names":["RowActionButton","action","item","allowed","btn","jsx","PermissionGate","DataTable","columns","data","actions","rowActions","rowActionsLabel","searchPlaceholder","searchKeys","isLoading","loadingMessage","emptyMessage","previousLabel","nextLabel","pageSize","nestedColumns","getNestedData","nestedLoadingMessage","nestedEmptyMessage","nestedSearchKeys","nestedSearchPlaceholder","nestedActions","nestedPageSize","query","setQuery","useState","page","setPage","expanded","setExpanded","nestedCache","setNestedCache","hasNested","hasRowActions","toggleRow","id","prev","next","result","rows","c","hasSearch","hasToolbar","filtered","useMemo","lower","k","totalPages","currentPage","pageData","getCell","col","Flex","jsxs","Search","v","Table","TableHead","TableColumn","idx","TableBody","isExpanded","cached","TableRow","TableCell","IconChevronDown","IconChevronRight","Pagination"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.js","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import {\n Pagination,\n PermissionGate,\n Search,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { Selection } from \"react-aria-components\";\nimport \"./datatable.css\";\n\nexport interface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"start\" | \"center\" | \"right\";\n render?: (item: T) => ReactNode;\n}\n\nexport interface RowActionDef<T> {\n /** Unique key for this action. */\n key: string;\n /** aria-label for the button. */\n label: string;\n /** Icon element rendered inside the button. */\n icon: ReactNode;\n /** When false, button is disabled and a tooltip with `noAccessLabel` is shown. Default: true. */\n isAllowed?: boolean;\n /** Tooltip text shown when `isAllowed` is false. */\n noAccessLabel?: string;\n /** Called with the row item when the button is pressed. */\n onPress: (item: T) => void;\n}\n\nfunction RowActionButton<T>({\n action,\n item,\n}: {\n action: RowActionDef<T>;\n item: T;\n}) {\n const allowed = action.isAllowed !== false;\n const btn = (\n <button\n className=\"data-table-row-action-btn\"\n aria-label={action.label}\n disabled={!allowed}\n onClick={allowed ? () => action.onPress(item) : undefined}\n >\n {action.icon}\n </button>\n );\n if (allowed) return btn;\n return (\n <PermissionGate isAllowed={false} noAccessLabel={action.noAccessLabel ?? \"\"}>\n {btn}\n </PermissionGate>\n );\n}\n\n// O tipo da linha aninhada é independente de T (não há relação genérica entre linha pai e linhas\n// filhas), então \"any\" é usado deliberadamente como fronteira de erasure de tipo.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NestedStatus = { status: \"loading\"; data: never[] } | { status: \"loaded\"; data: any[] };\n\nexport interface DataTableProps<T extends { id: string }> {\n columns: Column<T>[];\n data: T[];\n actions?: ReactNode;\n /** Per-row action buttons rendered in a dedicated last column. */\n rowActions?: RowActionDef<T>[] | ((item: T) => RowActionDef<T>[]);\n /** Label for the row actions column header. Defaults to empty string. */\n rowActionsLabel?: string;\n /**\n * When true, renders a checkbox column before the first data column — a per-row checkbox on\n * every row, plus a \"select all\" checkbox in the header. Off by default.\n */\n selectable?: boolean;\n /** Controlled selection state. Omit to let the table manage its own selection internally. */\n selectedKeys?: Selection;\n onSelectionChange?: (keys: Selection) => void;\n searchPlaceholder?: string;\n searchKeys?: (keyof T)[];\n isLoading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n previousLabel?: string;\n nextLabel?: string;\n pageSize?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedColumns?: Column<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedSearchKeys?: (keyof any)[];\n nestedSearchPlaceholder?: string;\n nestedActions?: (item: T) => ReactNode;\n nestedPageSize?: number;\n}\n\nexport function DataTable<T extends { id: string }>({\n columns,\n data,\n actions,\n rowActions,\n rowActionsLabel = \"\",\n selectable = false,\n selectedKeys,\n onSelectionChange,\n searchPlaceholder = \"Search...\",\n searchKeys = [],\n isLoading = false,\n loadingMessage = \"Loading...\",\n emptyMessage = \"No records found\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n nestedColumns,\n getNestedData,\n nestedLoadingMessage = \"Loading...\",\n nestedEmptyMessage = \"No records found\",\n nestedSearchKeys,\n nestedSearchPlaceholder,\n nestedActions,\n nestedPageSize,\n}: DataTableProps<T>) {\n const [query, setQuery] = useState(\"\");\n const [page, setPage] = useState(1);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [nestedCache, setNestedCache] = useState<Map<string, NestedStatus>>(new Map());\n\n const hasNested = !!getNestedData && !!nestedColumns;\n const hasRowActions = !!rowActions;\n\n function toggleRow(item: T) {\n const id = item.id;\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n if (!nestedCache.has(id)) {\n const result = getNestedData!(item);\n if (result instanceof Promise) {\n setNestedCache((c) => new Map(c).set(id, { status: \"loading\", data: [] }));\n result.then((rows) => {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: rows }));\n });\n } else {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: result }));\n }\n }\n }\n return next;\n });\n }\n\n const hasSearch = searchKeys.length > 0;\n const hasToolbar = hasSearch || !!actions;\n\n const filtered = useMemo(() => {\n if (!query.trim() || !hasSearch) return data;\n const lower = query.toLowerCase();\n return data.filter((item) =>\n searchKeys.some((k) =>\n String(item[k] ?? \"\")\n .toLowerCase()\n .includes(lower),\n ),\n );\n }, [data, query, searchKeys, hasSearch]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const pageData = filtered.slice(\n (currentPage - 1) * pageSize,\n currentPage * pageSize,\n );\n\n function getCell(item: T, col: Column<T>): ReactNode {\n if (col.render) return col.render(item);\n return String((item as Record<string, unknown>)[col.key as string] ?? \"\");\n }\n\n return (\n <Flex direction=\"column\" gap=\"300\" className=\"data-table\">\n {hasToolbar && (\n <div className=\"data-table-toolbar\">\n {hasSearch && (\n <Search\n placeholder={searchPlaceholder}\n onSearch={(v) => {\n setQuery(v);\n setPage(1);\n }}\n className=\"data-table-search\"\n />\n )}\n {actions && <div className=\"data-table-actions\">{actions}</div>}\n </div>\n )}\n\n {isLoading ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={loadingMessage}\n className=\"data-table-status\"\n >\n {loadingMessage}\n </div>\n ) : filtered.length === 0 ? (\n <div role=\"status\" className=\"data-table-status data-table-empty\">\n {emptyMessage}\n </div>\n ) : (\n <Table\n grid\n selectionMode={selectable ? \"multiple\" : \"none\"}\n selectedKeys={selectedKeys}\n onSelectionChange={onSelectionChange}\n >\n <TableHead>\n {hasNested && <TableColumn className=\"data-table-expand-col\" />}\n {columns.map((col, idx) => (\n <TableColumn\n key={String(col.key)}\n align={col.align}\n isRowHeader={idx === 0}\n >\n {col.label}\n </TableColumn>\n ))}\n {hasRowActions && (\n <TableColumn align=\"right\" className=\"data-table-row-actions-col\">\n {rowActionsLabel}\n </TableColumn>\n )}\n </TableHead>\n <TableBody>\n {pageData.flatMap((item) => {\n const isExpanded = expanded.has(item.id);\n const cached = nestedCache.get(item.id);\n const rows: ReactNode[] = [\n <TableRow key={item.id} id={item.id}>\n {hasNested && (\n <TableCell className=\"data-table-expand-cell\">\n <button\n className=\"data-table-expand-btn\"\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n onClick={() => toggleRow(item)}\n >\n {isExpanded ? (\n <IconChevronDown size=\"16\" />\n ) : (\n <IconChevronRight size=\"16\" />\n )}\n </button>\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={String(col.key)} align={col.align}>\n {getCell(item, col)}\n </TableCell>\n ))}\n {hasRowActions && (\n <TableCell align=\"right\" className=\"data-table-row-actions-cell\">\n <div className=\"data-table-row-actions\">\n {(typeof rowActions === \"function\"\n ? rowActions(item)\n : rowActions!\n ).map((action) => (\n <RowActionButton key={action.key} action={action} item={item} />\n ))}\n </div>\n </TableCell>\n )}\n </TableRow>,\n ];\n if (isExpanded) {\n rows.push(\n <TableRow key={`${item.id}-nested`} id={`${item.id}-nested`} className=\"data-table-nested-row\">\n <TableCell\n colSpan={\n columns.length +\n (hasNested ? 1 : 0) +\n (selectable ? 1 : 0) +\n (hasRowActions ? 1 : 0)\n }\n className=\"data-table-nested-cell\"\n >\n <DataTable\n columns={nestedColumns!}\n data={cached?.data ?? []}\n isLoading={!cached || cached.status === \"loading\"}\n loadingMessage={nestedLoadingMessage}\n emptyMessage={nestedEmptyMessage}\n searchKeys={nestedSearchKeys}\n searchPlaceholder={nestedSearchPlaceholder}\n actions={nestedActions?.(item)}\n pageSize={nestedPageSize ?? pageSize}\n />\n </TableCell>\n </TableRow>,\n );\n }\n return rows;\n })}\n </TableBody>\n </Table>\n )}\n\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n previousLabel={previousLabel}\n nextLabel={nextLabel}\n />\n </Flex>\n );\n}\n"],"names":["RowActionButton","action","item","allowed","btn","jsx","PermissionGate","DataTable","columns","data","actions","rowActions","rowActionsLabel","selectable","selectedKeys","onSelectionChange","searchPlaceholder","searchKeys","isLoading","loadingMessage","emptyMessage","previousLabel","nextLabel","pageSize","nestedColumns","getNestedData","nestedLoadingMessage","nestedEmptyMessage","nestedSearchKeys","nestedSearchPlaceholder","nestedActions","nestedPageSize","query","setQuery","useState","page","setPage","expanded","setExpanded","nestedCache","setNestedCache","hasNested","hasRowActions","toggleRow","id","prev","next","result","rows","c","hasSearch","hasToolbar","filtered","useMemo","lower","k","totalPages","currentPage","pageData","getCell","col","Flex","jsxs","Search","v","Table","TableHead","TableColumn","idx","TableBody","isExpanded","cached","TableRow","TableCell","IconChevronDown","IconChevronRight","Pagination"],"mappings":";;;;;;;;;;AAwCA,SAASA,GAAmB;AAAA,EAC1B,QAAAC;AAAA,EACA,MAAAC;AACF,GAGG;AACD,QAAMC,IAAUF,EAAO,cAAc,IAC/BG,IACJ,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAYJ,EAAO;AAAA,MACnB,UAAU,CAACE;AAAA,MACX,SAASA,IAAU,MAAMF,EAAO,QAAQC,CAAI,IAAI;AAAA,MAE/C,UAAAD,EAAO;AAAA,IAAA;AAAA,EAAA;AAGZ,SAAIE,IAAgBC,IAElB,gBAAAC,EAACC,MAAe,WAAW,IAAO,eAAeL,EAAO,iBAAiB,IACtE,UAAAG,EAAA,CACH;AAEJ;AA4CO,SAASG,GAAoC;AAAA,EAClD,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,YAAAC,IAAa;AAAA,EACb,cAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,YAAAC,IAAa,CAAA;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,gBAAAC,IAAiB;AAAA,EACjB,cAAAC,IAAe;AAAA,EACf,eAAAC,IAAgB;AAAA,EAChB,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,sBAAAC,IAAuB;AAAA,EACvB,oBAAAC,IAAqB;AAAA,EACrB,kBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAS,EAAE,GAC/B,CAACC,GAAMC,CAAO,IAAIF,EAAS,CAAC,GAC5B,CAACG,GAAUC,CAAW,IAAIJ,EAAsB,oBAAI,KAAK,GACzD,CAACK,GAAaC,CAAc,IAAIN,EAAoC,oBAAI,KAAK,GAE7EO,IAAY,CAAC,CAAChB,KAAiB,CAAC,CAACD,GACjCkB,IAAgB,CAAC,CAAC/B;AAExB,WAASgC,EAAUzC,GAAS;AAC1B,UAAM0C,IAAK1C,EAAK;AAChB,IAAAoC,EAAY,CAACO,MAAS;AACpB,YAAMC,IAAO,IAAI,IAAID,CAAI;AACzB,UAAIC,EAAK,IAAIF,CAAE;AACb,QAAAE,EAAK,OAAOF,CAAE;AAAA,eAEdE,EAAK,IAAIF,CAAE,GACP,CAACL,EAAY,IAAIK,CAAE,GAAG;AACxB,cAAMG,IAAStB,EAAevB,CAAI;AAClC,QAAI6C,aAAkB,WACpBP,EAAe,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,IAAII,GAAI,EAAE,QAAQ,WAAW,MAAM,CAAA,EAAC,CAAG,CAAC,GACzEG,EAAO,KAAK,CAACC,MAAS;AACpB,UAAAR,EAAe,CAACS,OAAM,IAAI,IAAIA,EAAC,EAAE,IAAIL,GAAI,EAAE,QAAQ,UAAU,MAAMI,EAAA,CAAM,CAAC;AAAA,QAC5E,CAAC,KAEDR,EAAe,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,IAAII,GAAI,EAAE,QAAQ,UAAU,MAAMG,EAAA,CAAQ,CAAC;AAAA,MAEhF;AAEF,aAAOD;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAMI,IAAYjC,EAAW,SAAS,GAChCkC,IAAaD,KAAa,CAAC,CAACxC,GAE5B0C,IAAWC,GAAQ,MAAM;AAC7B,QAAI,CAACrB,EAAM,KAAA,KAAU,CAACkB,EAAW,QAAOzC;AACxC,UAAM6C,IAAQtB,EAAM,YAAA;AACpB,WAAOvB,EAAK;AAAA,MAAO,CAACP,MAClBe,EAAW;AAAA,QAAK,CAACsC,MACf,OAAOrD,EAAKqD,CAAC,KAAK,EAAE,EACjB,cACA,SAASD,CAAK;AAAA,MAAA;AAAA,IACnB;AAAA,EAEJ,GAAG,CAAC7C,GAAMuB,GAAOf,GAAYiC,CAAS,CAAC,GAEjCM,IAAa,KAAK,IAAI,GAAG,KAAK,KAAKJ,EAAS,SAAS7B,CAAQ,CAAC,GAC9DkC,IAAc,KAAK,IAAItB,GAAMqB,CAAU,GACvCE,IAAWN,EAAS;AAAA,KACvBK,IAAc,KAAKlC;AAAA,IACpBkC,IAAclC;AAAA,EAAA;AAGhB,WAASoC,EAAQzD,GAAS0D,GAA2B;AACnD,WAAIA,EAAI,SAAeA,EAAI,OAAO1D,CAAI,IAC/B,OAAQA,EAAiC0D,EAAI,GAAa,KAAK,EAAE;AAAA,EAC1E;AAEA,2BACGC,IAAA,EAAK,WAAU,UAAS,KAAI,OAAM,WAAU,cAC1C,UAAA;AAAA,IAAAV,KACC,gBAAAW,EAAC,OAAA,EAAI,WAAU,sBACZ,UAAA;AAAA,MAAAZ,KACC,gBAAA7C;AAAA,QAAC0D;AAAA,QAAA;AAAA,UACC,aAAa/C;AAAA,UACb,UAAU,CAACgD,MAAM;AACf,YAAA/B,EAAS+B,CAAC,GACV5B,EAAQ,CAAC;AAAA,UACX;AAAA,UACA,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAGb1B,KAAW,gBAAAL,EAAC,OAAA,EAAI,WAAU,sBAAsB,UAAAK,EAAA,CAAQ;AAAA,IAAA,GAC3D;AAAA,IAGDQ,IACC,gBAAAb;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAU;AAAA,QACV,cAAYc;AAAA,QACZ,WAAU;AAAA,QAET,UAAAA;AAAA,MAAA;AAAA,IAAA,IAEDiC,EAAS,WAAW,IACtB,gBAAA/C,EAAC,OAAA,EAAI,MAAK,UAAS,WAAU,sCAC1B,UAAAe,EAAA,CACH,IAEA,gBAAA0C;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAI;AAAA,QACJ,eAAepD,IAAa,aAAa;AAAA,QACzC,cAAAC;AAAA,QACA,mBAAAC;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAA+C,EAACI,IAAA,EACE,UAAA;AAAA,YAAAzB,KAAa,gBAAApC,EAAC8D,GAAA,EAAY,WAAU,wBAAA,CAAwB;AAAA,YAC5D3D,EAAQ,IAAI,CAACoD,GAAKQ,MACjB,gBAAA/D;AAAA,cAAC8D;AAAA,cAAA;AAAA,gBAEC,OAAOP,EAAI;AAAA,gBACX,aAAaQ,MAAQ;AAAA,gBAEpB,UAAAR,EAAI;AAAA,cAAA;AAAA,cAJA,OAAOA,EAAI,GAAG;AAAA,YAAA,CAMtB;AAAA,YACAlB,KACC,gBAAArC,EAAC8D,GAAA,EAAY,OAAM,SAAQ,WAAU,8BAClC,UAAAvD,EAAA,CACH;AAAA,UAAA,GAEJ;AAAA,UACA,gBAAAP,EAACgE,IAAA,EACE,UAAAX,EAAS,QAAQ,CAACxD,MAAS;AAC1B,kBAAMoE,IAAajC,EAAS,IAAInC,EAAK,EAAE,GACjCqE,IAAShC,EAAY,IAAIrC,EAAK,EAAE,GAChC8C,IAAoB;AAAA,cACxB,gBAAAc,EAACU,GAAA,EAAuB,IAAItE,EAAK,IAC9B,UAAA;AAAA,gBAAAuC,KACC,gBAAApC,EAACoE,GAAA,EAAU,WAAU,0BACnB,UAAA,gBAAApE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,cAAYiE,IAAa,iBAAiB;AAAA,oBAC1C,iBAAeA;AAAA,oBACf,SAAS,MAAM3B,EAAUzC,CAAI;AAAA,oBAE5B,UAAAoE,sBACEI,IAAA,EAAgB,MAAK,MAAK,IAE3B,gBAAArE,EAACsE,IAAA,EAAiB,MAAK,KAAA,CAAK;AAAA,kBAAA;AAAA,gBAAA,GAGlC;AAAA,gBAEDnE,EAAQ,IAAI,CAACoD,MACZ,gBAAAvD,EAACoE,KAAgC,OAAOb,EAAI,OACzC,UAAAD,EAAQzD,GAAM0D,CAAG,EAAA,GADJ,OAAOA,EAAI,GAAG,CAE9B,CACD;AAAA,gBACAlB,KACC,gBAAArC,EAACoE,GAAA,EAAU,OAAM,SAAQ,WAAU,+BACjC,UAAA,gBAAApE,EAAC,OAAA,EAAI,WAAU,0BACX,WAAA,OAAOM,KAAe,aACpBA,EAAWT,CAAI,IACfS,GACF,IAAI,CAACV,MACL,gBAAAI,EAACL,IAAA,EAAiC,QAAAC,GAAgB,MAAAC,EAAA,GAA5BD,EAAO,GAAiC,CAC/D,GACH,EAAA,CACF;AAAA,cAAA,EAAA,GAhCWC,EAAK,EAkCpB;AAAA,YAAA;AAEF,mBAAIoE,KACFtB,EAAK;AAAA,cACH,gBAAA3C,EAACmE,KAAmC,IAAI,GAAGtE,EAAK,EAAE,WAAW,WAAU,yBACrE,UAAA,gBAAAG;AAAA,gBAACoE;AAAA,gBAAA;AAAA,kBACC,SACEjE,EAAQ,UACPiC,IAAY,IAAI,MAChB5B,IAAa,IAAI,MACjB6B,IAAgB,IAAI;AAAA,kBAEvB,WAAU;AAAA,kBAEV,UAAA,gBAAArC;AAAA,oBAACE;AAAA,oBAAA;AAAA,sBACC,SAASiB;AAAA,sBACT,OAAM+C,KAAA,gBAAAA,EAAQ,SAAQ,CAAA;AAAA,sBACtB,WAAW,CAACA,KAAUA,EAAO,WAAW;AAAA,sBACxC,gBAAgB7C;AAAA,sBAChB,cAAcC;AAAA,sBACd,YAAYC;AAAA,sBACZ,mBAAmBC;AAAA,sBACnB,SAASC,KAAA,gBAAAA,EAAgB5B;AAAA,sBACzB,UAAU6B,KAAkBR;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC9B;AAAA,cAAA,EACF,GArBa,GAAGrB,EAAK,EAAE,SAsBzB;AAAA,YAAA,GAGG8C;AAAA,UACT,CAAC,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIJ,gBAAA3C;AAAA,MAACuE;AAAA,MAAA;AAAA,QACC,MAAMnB;AAAA,QACN,YAAAD;AAAA,QACA,cAAcpB;AAAA,QACd,eAAAf;AAAA,QACA,WAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("../../../vendor/clsx/dist/clsx.cjs"),c=require("react-aria-components");;/* empty css */const l=require("../../icons/IconChevronDown.cjs");function d({className:s,...i}){const o=r.clsx(s,"accordion");return e.jsx(c.DisclosureGroup,{className:o,...i})}function m({className:s,title:i,isExpanded:o,isDisabled:u,children:n,...t}){const a=r.clsx(s,"accordion-item");return e.jsxs(c.Disclosure,{className:a,...t,children:[e.jsx(c.Heading,{className:"accordion-item-title",children:e.jsxs(c.Button,{slot:"trigger",children:[i,e.jsx("span",{role:"img","aria-hidden":"true","aria-label":"accordion item indicator",className:"accordion-item-indicator",children:e.jsx(l.IconChevronDown,{size:"20"})})]})}),e.jsx(c.DisclosurePanel,{className:"accordion-item-content",children:e.jsx(e.Fragment,{children:n})})]})}exports.Accordion=d;exports.AccordionItem=m;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("../../../vendor/clsx/dist/clsx.cjs"),c=require("react-aria-components");;/* empty css */const l=require("../../icons/IconChevronDown.cjs");function d({className:s,...i}){const o=r.clsx(s,"sds-accordion");return e.jsx(c.DisclosureGroup,{className:o,...i})}function m({className:s,title:i,isExpanded:o,isDisabled:u,children:n,...t}){const a=r.clsx(s,"accordion-item");return e.jsxs(c.Disclosure,{className:a,...t,children:[e.jsx(c.Heading,{className:"accordion-item-title",children:e.jsxs(c.Button,{slot:"trigger",children:[i,e.jsx("span",{role:"img","aria-hidden":"true","aria-label":"accordion item indicator",className:"accordion-item-indicator",children:e.jsx(l.IconChevronDown,{size:"20"})})]})}),e.jsx(c.DisclosurePanel,{className:"accordion-item-content",children:e.jsx(e.Fragment,{children:n})})]})}exports.Accordion=d;exports.AccordionItem=m;
2
2
  //# sourceMappingURL=Accordion.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.cjs","sources":["../../../../../src/ui/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { IconChevronDown } from \"icons\";\nimport {\n Button,\n Disclosure,\n DisclosureGroup,\n DisclosurePanel,\n Heading,\n type DisclosureGroupProps,\n type DisclosureProps,\n} from \"react-aria-components\";\nimport \"./accordion.css\";\n\nexport type AccordionProps = DisclosureGroupProps;\nexport function Accordion({ className, ...props }: AccordionProps) {\n const classNames = clsx(className, \"accordion\");\n return <DisclosureGroup className={classNames} {...props} />;\n}\n\nexport type AccordionItemProps = DisclosureProps & { title: string };\nexport function AccordionItem({\n className,\n title,\n isExpanded,\n isDisabled,\n children,\n ...props\n}: AccordionItemProps) {\n const classNames = clsx(className, \"accordion-item\");\n return (\n <Disclosure className={classNames} {...props}>\n <Heading className=\"accordion-item-title\">\n <Button slot=\"trigger\">\n {title}\n <span\n role=\"img\"\n aria-hidden=\"true\"\n aria-label=\"accordion item indicator\"\n className=\"accordion-item-indicator\"\n >\n <IconChevronDown size=\"20\" />\n </span>\n </Button>\n </Heading>\n <DisclosurePanel className=\"accordion-item-content\">\n <>{children}</>\n </DisclosurePanel>\n </Disclosure>\n );\n}\n"],"names":["Accordion","className","props","classNames","clsx","jsx","DisclosureGroup","AccordionItem","title","isExpanded","isDisabled","children","jsxs","Disclosure","Heading","Button","IconChevronDown","DisclosurePanel","Fragment"],"mappings":"0RAcO,SAASA,EAAU,CAAE,UAAAC,EAAW,GAAGC,GAAyB,CACjE,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,WAAW,EAC9C,OAAOI,EAAAA,IAACC,EAAAA,gBAAA,CAAgB,UAAWH,EAAa,GAAGD,EAAO,CAC5D,CAGO,SAASK,EAAc,CAC5B,UAAAN,EACA,MAAAO,EACA,WAAAC,EACA,WAAAC,EACA,SAAAC,EACA,GAAGT,CACL,EAAuB,CACrB,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,gBAAgB,EACnD,OACEW,EAAAA,KAACC,EAAAA,WAAA,CAAW,UAAWV,EAAa,GAAGD,EACrC,SAAA,CAAAG,EAAAA,IAACS,EAAAA,SAAQ,UAAU,uBACjB,SAAAF,EAAAA,KAACG,SAAA,CAAO,KAAK,UACV,SAAA,CAAAP,EACDH,EAAAA,IAAC,OAAA,CACC,KAAK,MACL,cAAY,OACZ,aAAW,2BACX,UAAU,2BAEV,SAAAA,EAAAA,IAACW,EAAAA,gBAAA,CAAgB,KAAK,IAAA,CAAK,CAAA,CAAA,CAC7B,CAAA,CACF,CAAA,CACF,QACCC,EAAAA,gBAAA,CAAgB,UAAU,yBACzB,SAAAZ,EAAAA,IAAAa,EAAAA,SAAA,CAAG,SAAAP,EAAS,CAAA,CACd,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"Accordion.cjs","sources":["../../../../../src/ui/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { IconChevronDown } from \"icons\";\nimport {\n Button,\n Disclosure,\n DisclosureGroup,\n DisclosurePanel,\n Heading,\n type DisclosureGroupProps,\n type DisclosureProps,\n} from \"react-aria-components\";\nimport \"./accordion.css\";\n\nexport type AccordionProps = DisclosureGroupProps;\nexport function Accordion({ className, ...props }: AccordionProps) {\n const classNames = clsx(className, \"sds-accordion\");\n return <DisclosureGroup className={classNames} {...props} />;\n}\n\nexport type AccordionItemProps = DisclosureProps & { title: string };\nexport function AccordionItem({\n className,\n title,\n isExpanded,\n isDisabled,\n children,\n ...props\n}: AccordionItemProps) {\n const classNames = clsx(className, \"accordion-item\");\n return (\n <Disclosure className={classNames} {...props}>\n <Heading className=\"accordion-item-title\">\n <Button slot=\"trigger\">\n {title}\n <span\n role=\"img\"\n aria-hidden=\"true\"\n aria-label=\"accordion item indicator\"\n className=\"accordion-item-indicator\"\n >\n <IconChevronDown size=\"20\" />\n </span>\n </Button>\n </Heading>\n <DisclosurePanel className=\"accordion-item-content\">\n <>{children}</>\n </DisclosurePanel>\n </Disclosure>\n );\n}\n"],"names":["Accordion","className","props","classNames","clsx","jsx","DisclosureGroup","AccordionItem","title","isExpanded","isDisabled","children","jsxs","Disclosure","Heading","Button","IconChevronDown","DisclosurePanel","Fragment"],"mappings":"0RAcO,SAASA,EAAU,CAAE,UAAAC,EAAW,GAAGC,GAAyB,CACjE,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,eAAe,EAClD,OAAOI,EAAAA,IAACC,EAAAA,gBAAA,CAAgB,UAAWH,EAAa,GAAGD,EAAO,CAC5D,CAGO,SAASK,EAAc,CAC5B,UAAAN,EACA,MAAAO,EACA,WAAAC,EACA,WAAAC,EACA,SAAAC,EACA,GAAGT,CACL,EAAuB,CACrB,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,gBAAgB,EACnD,OACEW,EAAAA,KAACC,EAAAA,WAAA,CAAW,UAAWV,EAAa,GAAGD,EACrC,SAAA,CAAAG,EAAAA,IAACS,EAAAA,SAAQ,UAAU,uBACjB,SAAAF,EAAAA,KAACG,SAAA,CAAO,KAAK,UACV,SAAA,CAAAP,EACDH,EAAAA,IAAC,OAAA,CACC,KAAK,MACL,cAAY,OACZ,aAAW,2BACX,UAAU,2BAEV,SAAAA,EAAAA,IAACW,EAAAA,gBAAA,CAAgB,KAAK,IAAA,CAAK,CAAA,CAAA,CAC7B,CAAA,CACF,CAAA,CACF,QACCC,EAAAA,gBAAA,CAAgB,UAAU,yBACzB,SAAAZ,EAAAA,IAAAa,EAAAA,SAAA,CAAG,SAAAP,EAAS,CAAA,CACd,CAAA,EACF,CAEJ"}