@apipass/design-system 2.0.0 → 3.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.
@@ -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\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 nestedColumns?: Column<any>[];\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\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":"wgBAuCA,SAASA,GAAmB,CAC1B,OAAAC,EACA,KAAAC,CACF,EAGG,CACD,MAAMC,EAAUF,EAAO,YAAc,GAC/BG,EACJC,EAAAA,IAAC,SAAA,CACC,UAAU,4BACV,aAAYJ,EAAO,MACnB,SAAU,CAACE,EACX,QAASA,EAAU,IAAMF,EAAO,QAAQC,CAAI,EAAI,OAE/C,SAAAD,EAAO,IAAA,CAAA,EAGZ,OAAIE,EAAgBC,EAElBC,MAACC,GAAAA,gBAAe,UAAW,GAAO,cAAeL,EAAO,eAAiB,GACtE,SAAAG,CAAA,CACH,CAEJ,CA8BO,SAASG,EAAoC,CAClD,QAAAC,EACA,KAAAC,EACA,QAAAC,EACA,WAAAC,EACA,gBAAAC,EAAkB,GAClB,kBAAAC,EAAoB,YACpB,WAAAC,EAAa,CAAA,EACb,UAAAC,EAAY,GACZ,eAAAC,EAAiB,aACjB,aAAAC,EAAe,mBACf,cAAAC,EAAgB,WAChB,UAAAC,EAAY,OACZ,SAAAC,EAAW,GACX,cAAAC,EACA,cAAAC,EACA,qBAAAC,EAAuB,aACvB,mBAAAC,EAAqB,mBACrB,iBAAAC,EACA,wBAAAC,EACA,cAAAC,EACA,eAAAC,CACF,EAAsB,CACpB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/B,CAACC,EAAMC,CAAO,EAAIF,EAAAA,SAAS,CAAC,EAC5B,CAACG,EAAUC,CAAW,EAAIJ,EAAAA,SAAsB,IAAI,GAAK,EACzD,CAACK,EAAaC,CAAc,EAAIN,EAAAA,SAAoC,IAAI,GAAK,EAE7EO,EAAY,CAAC,CAAChB,GAAiB,CAAC,CAACD,EACjCkB,EAAgB,CAAC,CAAC5B,EAExB,SAAS6B,EAAUtC,EAAS,CAC1B,MAAMuC,EAAKvC,EAAK,GAChBiC,EAAaO,GAAS,CACpB,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,GAAIC,EAAK,IAAIF,CAAE,EACbE,EAAK,OAAOF,CAAE,UAEdE,EAAK,IAAIF,CAAE,EACP,CAACL,EAAY,IAAIK,CAAE,EAAG,CACxB,MAAMG,EAAStB,EAAepB,CAAI,EAC9B0C,aAAkB,SACpBP,EAAgBQ,GAAM,IAAI,IAAIA,CAAC,EAAE,IAAIJ,EAAI,CAAE,OAAQ,UAAW,KAAM,CAAA,CAAC,CAAG,CAAC,EACzEG,EAAO,KAAME,GAAS,CACpBT,EAAgBQ,GAAM,IAAI,IAAIA,CAAC,EAAE,IAAIJ,EAAI,CAAE,OAAQ,SAAU,KAAMK,CAAA,CAAM,CAAC,CAC5E,CAAC,GAEDT,EAAgBQ,GAAM,IAAI,IAAIA,CAAC,EAAE,IAAIJ,EAAI,CAAE,OAAQ,SAAU,KAAMG,CAAA,CAAQ,CAAC,CAEhF,CAEF,OAAOD,CACT,CAAC,CACH,CAEA,MAAMI,EAAYjC,EAAW,OAAS,EAChCkC,EAAaD,GAAa,CAAC,CAACrC,EAE5BuC,EAAWC,EAAAA,QAAQ,IAAM,CAC7B,GAAI,CAACrB,EAAM,KAAA,GAAU,CAACkB,EAAW,OAAOtC,EACxC,MAAM0C,EAAQtB,EAAM,YAAA,EACpB,OAAOpB,EAAK,OAAQP,GAClBY,EAAW,KAAMsC,GACf,OAAOlD,EAAKkD,CAAC,GAAK,EAAE,EACjB,cACA,SAASD,CAAK,CAAA,CACnB,CAEJ,EAAG,CAAC1C,EAAMoB,EAAOf,EAAYiC,CAAS,CAAC,EAEjCM,EAAa,KAAK,IAAI,EAAG,KAAK,KAAKJ,EAAS,OAAS7B,CAAQ,CAAC,EAC9DkC,EAAc,KAAK,IAAItB,EAAMqB,CAAU,EACvCE,EAAWN,EAAS,OACvBK,EAAc,GAAKlC,EACpBkC,EAAclC,CAAA,EAGhB,SAASoC,EAAQtD,EAASuD,EAA2B,CACnD,OAAIA,EAAI,OAAeA,EAAI,OAAOvD,CAAI,EAC/B,OAAQA,EAAiCuD,EAAI,GAAa,GAAK,EAAE,CAC1E,CAEA,cACGC,QAAA,CAAK,UAAU,SAAS,IAAI,MAAM,UAAU,aAC1C,SAAA,CAAAV,GACCW,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACZ,SAAA,CAAAZ,GACC1C,EAAAA,IAACuD,EAAAA,OAAA,CACC,YAAa/C,EACb,SAAWgD,GAAM,CACf/B,EAAS+B,CAAC,EACV5B,EAAQ,CAAC,CACX,EACA,UAAU,mBAAA,CAAA,EAGbvB,GAAWL,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAsB,SAAAK,CAAA,CAAQ,CAAA,EAC3D,EAGDK,EACCV,EAAAA,IAAC,MAAA,CACC,KAAK,SACL,YAAU,SACV,aAAYW,EACZ,UAAU,oBAET,SAAAA,CAAA,CAAA,EAEDiC,EAAS,SAAW,QACrB,MAAA,CAAI,KAAK,SAAS,UAAU,qCAC1B,SAAAhC,CAAA,CACH,EAEA0C,EAAAA,KAACG,EAAAA,MAAA,CAAM,KAAI,GACT,SAAA,CAAAH,OAACI,EAAAA,UAAA,CACE,SAAA,CAAAzB,GAAajC,EAAAA,IAAC2D,EAAAA,YAAA,CAAY,UAAU,uBAAA,CAAwB,EAC5DxD,EAAQ,IAAI,CAACiD,EAAKQ,IACjB5D,EAAAA,IAAC2D,EAAAA,YAAA,CAEC,MAAOP,EAAI,MACX,YAAaQ,IAAQ,EAEpB,SAAAR,EAAI,KAAA,EAJA,OAAOA,EAAI,GAAG,CAAA,CAMtB,EACAlB,GACClC,EAAAA,IAAC2D,EAAAA,YAAA,CAAY,MAAM,QAAQ,UAAU,6BAClC,SAAApD,CAAA,CACH,CAAA,EAEJ,EACAP,EAAAA,IAAC6D,EAAAA,UAAA,CACE,SAAAX,EAAS,QAASrD,GAAS,CAC1B,MAAMiE,EAAajC,EAAS,IAAIhC,EAAK,EAAE,EACjCkE,EAAShC,EAAY,IAAIlC,EAAK,EAAE,EAChC4C,EAAoB,CACxBa,EAAAA,KAACU,EAAAA,SAAA,CAAuB,GAAInE,EAAK,GAC9B,SAAA,CAAAoC,GACCjC,EAAAA,IAACiE,EAAAA,UAAA,CAAU,UAAU,yBACnB,SAAAjE,EAAAA,IAAC,SAAA,CACC,UAAU,wBACV,aAAY8D,EAAa,eAAiB,aAC1C,gBAAeA,EACf,QAAS,IAAM3B,EAAUtC,CAAI,EAE5B,SAAAiE,QACEI,EAAAA,gBAAA,CAAgB,KAAK,KAAK,EAE3BlE,EAAAA,IAACmE,EAAAA,iBAAA,CAAiB,KAAK,IAAA,CAAK,CAAA,CAAA,EAGlC,EAEDhE,EAAQ,IAAKiD,GACZpD,EAAAA,IAACiE,aAAgC,MAAOb,EAAI,MACzC,SAAAD,EAAQtD,EAAMuD,CAAG,CAAA,EADJ,OAAOA,EAAI,GAAG,CAE9B,CACD,EACAlB,GACClC,EAAAA,IAACiE,EAAAA,UAAA,CAAU,MAAM,QAAQ,UAAU,8BACjC,SAAAjE,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACX,UAAA,OAAOM,GAAe,WACpBA,EAAWT,CAAI,EACfS,GACF,IAAKV,GACLI,EAAAA,IAACL,GAAA,CAAiC,OAAAC,EAAgB,KAAAC,CAAA,EAA5BD,EAAO,GAAiC,CAC/D,EACH,CAAA,CACF,CAAA,CAAA,EAhCWC,EAAK,EAkCpB,CAAA,EAEF,OAAIiE,GACFrB,EAAK,KACHzC,EAAAA,IAACgE,EAAAA,UAAmC,GAAI,GAAGnE,EAAK,EAAE,UAAW,UAAU,wBACrE,SAAAG,EAAAA,IAACiE,EAAAA,UAAA,CACC,QAAS9D,EAAQ,OAAS,GAAK+B,EAAgB,EAAI,GACnD,UAAU,yBAEV,SAAAlC,EAAAA,IAACE,EAAA,CACC,QAASc,EACT,MAAM+C,GAAA,YAAAA,EAAQ,OAAQ,CAAA,EACtB,UAAW,CAACA,GAAUA,EAAO,SAAW,UACxC,eAAgB7C,EAChB,aAAcC,EACd,WAAYC,EACZ,kBAAmBC,EACnB,QAASC,GAAA,YAAAA,EAAgBzB,GACzB,SAAU0B,GAAkBR,CAAA,CAAA,CAC9B,CAAA,CACF,EAhBa,GAAGlB,EAAK,EAAE,SAiBzB,CAAA,EAGG4C,CACT,CAAC,CAAA,CACH,CAAA,EACF,EAGFzC,EAAAA,IAACoE,EAAAA,WAAA,CACC,KAAMnB,EACN,WAAAD,EACA,aAAcpB,EACd,cAAAf,EACA,UAAAC,CAAA,CAAA,CACF,EACF,CAEJ"}
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 +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\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 nestedColumns?: Column<any>[];\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\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 \"./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,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),m=require("../../../vendor/clsx/dist/clsx.cjs");;/* empty css */const g=require("../../primitives/Image/Image.cjs");function d({children:t,className:r,elementType:o="section",padding:n="600",paddingBottom:l,paddingTop:u,...e}){const{variant:x="subtle",...a}=e,c=m.clsx(r,"section",`section-variant-${e.variant}`,`section-padding-top-${u||n}`,`section-padding-bottom-${l||n}`),i=e.variant==="image"?s.jsx(g.Image,{alt:"Background image",role:"presentation",src:e.src,size:"fill",aspectRatio:"fill",className:"section-image"}):null;switch(o){case"section":return s.jsxs("section",{className:c,...a,children:[i," ",t]});case"header":return s.jsxs("header",{className:c,...a,children:[i," ",t]});case"footer":return s.jsxs("footer",{className:c,...a,children:[i," ",t]})}}exports.Section=d;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),m=require("../../../vendor/clsx/dist/clsx.cjs");;/* empty css */const g=require("../../primitives/Image/Image.cjs");function d({children:t,className:r,elementType:o="section",padding:n="600",paddingBottom:l,paddingTop:u,...e}){const{variant:x="subtle",...a}=e,i=m.clsx(r,"section",`section-variant-${e.variant}`,`section-padding-top-${u||n}`,`section-padding-bottom-${l||n}`),c=e.variant==="image"?s.jsx(g.Image,{alt:"Background image",role:"presentation",src:e.src,size:"fill",aspectRatio:"fill",className:"section-image"}):null;switch(o){case"section":return s.jsxs("section",{className:i,...a,children:[c," ",t]});case"header":return s.jsxs("header",{className:i,...a,children:[c," ",t]});case"footer":return s.jsxs("footer",{className:i,...a,children:[c," ",t]})}}exports.Section=d;
2
2
  //# sourceMappingURL=Section.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Section.cjs","sources":["../../../../../src/ui/layout/Section/Section.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Image } from \"primitives\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport \"./section.css\";\n\nexport type SectionProps = ComponentPropsWithoutRef<\n \"section\" | \"header\" | \"footer\"\n> & {\n elementType?: \"section\" | \"header\" | \"footer\";\n padding?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingTop?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingBottom?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n} & (\n | {\n variant?: \"brand\" | \"neutral\" | \"stroke\" | \"subtle\";\n src?: undefined;\n }\n | {\n variant: \"image\";\n /**\n * An image src\n */\n src: string;\n }\n );\nexport function Section({\n children,\n className,\n elementType = \"section\",\n padding = \"600\",\n paddingBottom,\n paddingTop,\n ...props\n}: SectionProps) {\n const { variant = \"subtle\", ...spreadProps } = props;\n const classNames = clsx(\n className,\n \"section\",\n `section-variant-${props.variant}`,\n `section-padding-top-${paddingTop || padding}`,\n `section-padding-bottom-${paddingBottom || padding}`,\n );\n const image =\n props.variant === \"image\" ? (\n <Image\n alt=\"Background image\"\n role=\"presentation\"\n src={props.src}\n size=\"fill\"\n aspectRatio=\"fill\"\n className=\"section-image\"\n />\n ) : null;\n switch (elementType) {\n case \"section\":\n return (\n <section className={classNames} {...spreadProps}>\n {image} {children}\n </section>\n );\n case \"header\":\n return (\n <header className={classNames} {...spreadProps}>\n {image} {children}\n </header>\n );\n case \"footer\":\n return (\n <footer className={classNames} {...spreadProps}>\n {image} {children}\n </footer>\n );\n }\n}\n"],"names":["Section","children","className","elementType","padding","paddingBottom","paddingTop","props","variant","spreadProps","classNames","clsx","image","jsx","Image","jsxs"],"mappings":"sPAyBO,SAASA,EAAQ,CACtB,SAAAC,EACA,UAAAC,EACA,YAAAC,EAAc,UACd,QAAAC,EAAU,MACV,cAAAC,EACA,WAAAC,EACA,GAAGC,CACL,EAAiB,CACf,KAAM,CAAE,QAAAC,EAAU,SAAU,GAAGC,GAAgBF,EACzCG,EAAaC,EAAAA,KACjBT,EACA,UACA,mBAAmBK,EAAM,OAAO,GAChC,uBAAuBD,GAAcF,CAAO,GAC5C,0BAA0BC,GAAiBD,CAAO,EAAA,EAE9CQ,EACJL,EAAM,UAAY,QAChBM,EAAAA,IAACC,EAAAA,MAAA,CACC,IAAI,mBACJ,KAAK,eACL,IAAKP,EAAM,IACX,KAAK,OACL,YAAY,OACZ,UAAU,eAAA,CAAA,EAEV,KACN,OAAQJ,EAAA,CACN,IAAK,UACH,OACEY,EAAAA,KAAC,UAAA,CAAQ,UAAWL,EAAa,GAAGD,EACjC,SAAA,CAAAG,EAAM,IAAEX,CAAA,EACX,EAEJ,IAAK,SACH,OACEc,EAAAA,KAAC,SAAA,CAAO,UAAWL,EAAa,GAAGD,EAChC,SAAA,CAAAG,EAAM,IAAEX,CAAA,EACX,EAEJ,IAAK,SACH,OACEc,EAAAA,KAAC,SAAA,CAAO,UAAWL,EAAa,GAAGD,EAChC,SAAA,CAAAG,EAAM,IAAEX,CAAA,EACX,CAAA,CAGR"}
1
+ {"version":3,"file":"Section.cjs","sources":["../../../../../src/ui/layout/Section/Section.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Image } from \"primitives\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport \"./section.css\";\n\nexport type SectionProps = ComponentPropsWithoutRef<\n \"section\" | \"header\" | \"footer\"\n> & {\n elementType?: \"section\" | \"header\" | \"footer\";\n padding?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingTop?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingBottom?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n} & (\n | {\n variant?: \"brand\" | \"neutral\" | \"stroke\" | \"subtle\";\n src?: undefined;\n }\n | {\n variant: \"image\";\n /**\n * An image src\n */\n src: string;\n }\n );\nexport function Section({\n children,\n className,\n elementType = \"section\",\n padding = \"600\",\n paddingBottom,\n paddingTop,\n ...props\n}: SectionProps) {\n const { variant: _variant = \"subtle\", ...spreadProps } = props;\n const classNames = clsx(\n className,\n \"section\",\n `section-variant-${props.variant}`,\n `section-padding-top-${paddingTop || padding}`,\n `section-padding-bottom-${paddingBottom || padding}`,\n );\n const image =\n props.variant === \"image\" ? (\n <Image\n alt=\"Background image\"\n role=\"presentation\"\n src={props.src}\n size=\"fill\"\n aspectRatio=\"fill\"\n className=\"section-image\"\n />\n ) : null;\n switch (elementType) {\n case \"section\":\n return (\n <section className={classNames} {...spreadProps}>\n {image} {children}\n </section>\n );\n case \"header\":\n return (\n <header className={classNames} {...spreadProps}>\n {image} {children}\n </header>\n );\n case \"footer\":\n return (\n <footer className={classNames} {...spreadProps}>\n {image} {children}\n </footer>\n );\n }\n}\n"],"names":["Section","children","className","elementType","padding","paddingBottom","paddingTop","props","_variant","spreadProps","classNames","clsx","image","jsx","Image","jsxs"],"mappings":"sPAyBO,SAASA,EAAQ,CACtB,SAAAC,EACA,UAAAC,EACA,YAAAC,EAAc,UACd,QAAAC,EAAU,MACV,cAAAC,EACA,WAAAC,EACA,GAAGC,CACL,EAAiB,CACf,KAAM,CAAE,QAASC,EAAW,SAAU,GAAGC,GAAgBF,EACnDG,EAAaC,EAAAA,KACjBT,EACA,UACA,mBAAmBK,EAAM,OAAO,GAChC,uBAAuBD,GAAcF,CAAO,GAC5C,0BAA0BC,GAAiBD,CAAO,EAAA,EAE9CQ,EACJL,EAAM,UAAY,QAChBM,EAAAA,IAACC,EAAAA,MAAA,CACC,IAAI,mBACJ,KAAK,eACL,IAAKP,EAAM,IACX,KAAK,OACL,YAAY,OACZ,UAAU,eAAA,CAAA,EAEV,KACN,OAAQJ,EAAA,CACN,IAAK,UACH,OACEY,EAAAA,KAAC,UAAA,CAAQ,UAAWL,EAAa,GAAGD,EACjC,SAAA,CAAAG,EAAM,IAAEX,CAAA,EACX,EAEJ,IAAK,SACH,OACEc,EAAAA,KAAC,SAAA,CAAO,UAAWL,EAAa,GAAGD,EAChC,SAAA,CAAAG,EAAM,IAAEX,CAAA,EACX,EAEJ,IAAK,SACH,OACEc,EAAAA,KAAC,SAAA,CAAO,UAAWL,EAAa,GAAGD,EAChC,SAAA,CAAAG,EAAM,IAAEX,CAAA,EACX,CAAA,CAGR"}
@@ -1 +1 @@
1
- {"version":3,"file":"Section.js","sources":["../../../../../src/ui/layout/Section/Section.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Image } from \"primitives\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport \"./section.css\";\n\nexport type SectionProps = ComponentPropsWithoutRef<\n \"section\" | \"header\" | \"footer\"\n> & {\n elementType?: \"section\" | \"header\" | \"footer\";\n padding?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingTop?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingBottom?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n} & (\n | {\n variant?: \"brand\" | \"neutral\" | \"stroke\" | \"subtle\";\n src?: undefined;\n }\n | {\n variant: \"image\";\n /**\n * An image src\n */\n src: string;\n }\n );\nexport function Section({\n children,\n className,\n elementType = \"section\",\n padding = \"600\",\n paddingBottom,\n paddingTop,\n ...props\n}: SectionProps) {\n const { variant = \"subtle\", ...spreadProps } = props;\n const classNames = clsx(\n className,\n \"section\",\n `section-variant-${props.variant}`,\n `section-padding-top-${paddingTop || padding}`,\n `section-padding-bottom-${paddingBottom || padding}`,\n );\n const image =\n props.variant === \"image\" ? (\n <Image\n alt=\"Background image\"\n role=\"presentation\"\n src={props.src}\n size=\"fill\"\n aspectRatio=\"fill\"\n className=\"section-image\"\n />\n ) : null;\n switch (elementType) {\n case \"section\":\n return (\n <section className={classNames} {...spreadProps}>\n {image} {children}\n </section>\n );\n case \"header\":\n return (\n <header className={classNames} {...spreadProps}>\n {image} {children}\n </header>\n );\n case \"footer\":\n return (\n <footer className={classNames} {...spreadProps}>\n {image} {children}\n </footer>\n );\n }\n}\n"],"names":["Section","children","className","elementType","padding","paddingBottom","paddingTop","props","variant","spreadProps","classNames","clsx","image","jsx","Image","jsxs"],"mappings":";;;;AAyBO,SAASA,EAAQ;AAAA,EACtB,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,SAAAC,IAAU;AAAA,EACV,eAAAC;AAAA,EACA,YAAAC;AAAA,EACA,GAAGC;AACL,GAAiB;AACf,QAAM,EAAE,SAAAC,IAAU,UAAU,GAAGC,MAAgBF,GACzCG,IAAaC;AAAA,IACjBT;AAAA,IACA;AAAA,IACA,mBAAmBK,EAAM,OAAO;AAAA,IAChC,uBAAuBD,KAAcF,CAAO;AAAA,IAC5C,0BAA0BC,KAAiBD,CAAO;AAAA,EAAA,GAE9CQ,IACJL,EAAM,YAAY,UAChB,gBAAAM;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAI;AAAA,MACJ,MAAK;AAAA,MACL,KAAKP,EAAM;AAAA,MACX,MAAK;AAAA,MACL,aAAY;AAAA,MACZ,WAAU;AAAA,IAAA;AAAA,EAAA,IAEV;AACN,UAAQJ,GAAA;AAAA,IACN,KAAK;AACH,aACE,gBAAAY,EAAC,WAAA,EAAQ,WAAWL,GAAa,GAAGD,GACjC,UAAA;AAAA,QAAAG;AAAA,QAAM;AAAA,QAAEX;AAAA,MAAA,GACX;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAc,EAAC,UAAA,EAAO,WAAWL,GAAa,GAAGD,GAChC,UAAA;AAAA,QAAAG;AAAA,QAAM;AAAA,QAAEX;AAAA,MAAA,GACX;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAc,EAAC,UAAA,EAAO,WAAWL,GAAa,GAAGD,GAChC,UAAA;AAAA,QAAAG;AAAA,QAAM;AAAA,QAAEX;AAAA,MAAA,GACX;AAAA,EAAA;AAGR;"}
1
+ {"version":3,"file":"Section.js","sources":["../../../../../src/ui/layout/Section/Section.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Image } from \"primitives\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport \"./section.css\";\n\nexport type SectionProps = ComponentPropsWithoutRef<\n \"section\" | \"header\" | \"footer\"\n> & {\n elementType?: \"section\" | \"header\" | \"footer\";\n padding?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingTop?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n paddingBottom?: \"600\" | \"800\" | \"1200\" | \"1600\" | \"4000\";\n} & (\n | {\n variant?: \"brand\" | \"neutral\" | \"stroke\" | \"subtle\";\n src?: undefined;\n }\n | {\n variant: \"image\";\n /**\n * An image src\n */\n src: string;\n }\n );\nexport function Section({\n children,\n className,\n elementType = \"section\",\n padding = \"600\",\n paddingBottom,\n paddingTop,\n ...props\n}: SectionProps) {\n const { variant: _variant = \"subtle\", ...spreadProps } = props;\n const classNames = clsx(\n className,\n \"section\",\n `section-variant-${props.variant}`,\n `section-padding-top-${paddingTop || padding}`,\n `section-padding-bottom-${paddingBottom || padding}`,\n );\n const image =\n props.variant === \"image\" ? (\n <Image\n alt=\"Background image\"\n role=\"presentation\"\n src={props.src}\n size=\"fill\"\n aspectRatio=\"fill\"\n className=\"section-image\"\n />\n ) : null;\n switch (elementType) {\n case \"section\":\n return (\n <section className={classNames} {...spreadProps}>\n {image} {children}\n </section>\n );\n case \"header\":\n return (\n <header className={classNames} {...spreadProps}>\n {image} {children}\n </header>\n );\n case \"footer\":\n return (\n <footer className={classNames} {...spreadProps}>\n {image} {children}\n </footer>\n );\n }\n}\n"],"names":["Section","children","className","elementType","padding","paddingBottom","paddingTop","props","_variant","spreadProps","classNames","clsx","image","jsx","Image","jsxs"],"mappings":";;;;AAyBO,SAASA,EAAQ;AAAA,EACtB,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,SAAAC,IAAU;AAAA,EACV,eAAAC;AAAA,EACA,YAAAC;AAAA,EACA,GAAGC;AACL,GAAiB;AACf,QAAM,EAAE,SAASC,IAAW,UAAU,GAAGC,MAAgBF,GACnDG,IAAaC;AAAA,IACjBT;AAAA,IACA;AAAA,IACA,mBAAmBK,EAAM,OAAO;AAAA,IAChC,uBAAuBD,KAAcF,CAAO;AAAA,IAC5C,0BAA0BC,KAAiBD,CAAO;AAAA,EAAA,GAE9CQ,IACJL,EAAM,YAAY,UAChB,gBAAAM;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAI;AAAA,MACJ,MAAK;AAAA,MACL,KAAKP,EAAM;AAAA,MACX,MAAK;AAAA,MACL,aAAY;AAAA,MACZ,WAAU;AAAA,IAAA;AAAA,EAAA,IAEV;AACN,UAAQJ,GAAA;AAAA,IACN,KAAK;AACH,aACE,gBAAAY,EAAC,WAAA,EAAQ,WAAWL,GAAa,GAAGD,GACjC,UAAA;AAAA,QAAAG;AAAA,QAAM;AAAA,QAAEX;AAAA,MAAA,GACX;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAc,EAAC,UAAA,EAAO,WAAWL,GAAa,GAAGD,GAChC,UAAA;AAAA,QAAAG;AAAA,QAAM;AAAA,QAAEX;AAAA,MAAA,GACX;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAc,EAAC,UAAA,EAAO,WAAWL,GAAa,GAAGD,GAChC,UAAA;AAAA,QAAAG;AAAA,QAAM;AAAA,QAAEX;AAAA,MAAA,GACX;AAAA,EAAA;AAGR;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Fieldset.cjs","sources":["../../../../../src/ui/primitives/Fieldset/Fieldset.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport {\n FieldError as RACFieldError,\n Form as RACForm,\n Keyboard as RACKeyboard,\n Label as RACLabel,\n Text as RACText,\n type FieldErrorProps as RACFieldErrorProps,\n type FormProps as RACFormProps,\n type LabelProps as RACLabelProps,\n type TextProps as RACTextProps,\n type ValidationResult as RACValidationResult,\n} from \"react-aria-components\";\nimport \"./fieldset.css\";\n\nexport type FieldsetProps = ComponentPropsWithoutRef<\"fieldset\">;\nexport function Fieldset({ ...props }: FieldsetProps) {\n const classNames = clsx(\"fieldset\");\n return <fieldset {...props} className={classNames} />;\n}\n\nexport type LegendProps = ComponentPropsWithoutRef<\"legend\">;\nexport function Legend({ ...props }: LegendProps) {\n const classNames = clsx(\"legend\");\n return <legend {...props} className={classNames} />;\n}\n\nexport type FieldGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport function FieldGroup({ ...props }: FieldGroupProps) {\n const classNames = clsx(\"field-group\");\n return <div {...props} className={classNames} />;\n}\n\nexport type FormProps = RACFormProps & { singleLine?: boolean };\nexport function Form({ className, singleLine, ...props }: FormProps) {\n const classNames = clsx(className, \"form\", singleLine && \"form-single-line\");\n return <RACForm className={classNames} {...props} />;\n}\n\nexport type FormDataValue = FormDataEntryValue | FormDataEntryValue[];\nexport function formEventTargetToFormData(target: HTMLFormElement) {\n const dataIsArray = (data: FormDataValue): data is FormDataEntryValue[] =>\n Array.isArray(data);\n\n const formData = new FormData(target);\n const data: {\n [k: string]: FormDataValue;\n } = {};\n\n formData.forEach((value, key) => {\n if (!Reflect.has(data, key)) {\n data[key] = value;\n return;\n }\n // convert to array from single value\n const currentItem = data[key];\n if (dataIsArray(currentItem)) {\n currentItem.push(value);\n } else {\n data[key] = [currentItem, value];\n }\n });\n return data;\n}\n\n/**\n * Used by TextField, SelectField, TextareaField, SliderField, etc.\n */\nexport type SharedFieldProps = {\n label?: string;\n description?: string;\n placeholder?: string;\n errorMessage?: string | ((validation: RACValidationResult) => string);\n};\n\nexport type FieldProps = ComponentPropsWithoutRef<\"div\">;\nexport function Field({ className, ...props }: FieldProps) {\n const classNames = clsx(className, \"field\");\n return <div className={classNames} {...props} />;\n}\nexport type LabelProps = RACLabelProps;\nexport function Label({ className, ...props }: LabelProps) {\n const classNames = clsx(className, \"label\");\n return <RACLabel className={classNames} slot=\"label\" {...props} />;\n}\nexport type DescriptionProps = RACTextProps;\nexport function Description({ className, ...props }: DescriptionProps) {\n const classNames = clsx(className, \"description\");\n return <RACText className={classNames} slot=\"description\" {...props} />;\n}\nexport type FieldErrorProps = RACFieldErrorProps;\nexport function FieldError({ className, ...props }: FieldErrorProps) {\n const classNames = clsx(className, \"error-message\");\n return <RACFieldError {...props} className={classNames} />;\n}\nexport type KeyboardProps = RACTextProps;\nexport function Keyboard({ className, children, ...props }: KeyboardProps) {\n const classNames = clsx(className, \"keyboard\");\n const items =\n typeof children === \"string\"\n ? children.split(\"\").map((k) => <kbd key={k}>{k}</kbd>)\n : children;\n return (\n <RACKeyboard {...props} className={classNames}>\n {items}\n </RACKeyboard>\n );\n}\n"],"names":["Fieldset","props","classNames","clsx","jsx","Legend","FieldGroup","Form","className","singleLine","RACForm","formEventTargetToFormData","target","dataIsArray","data","formData","value","key","currentItem","Field","Label","RACLabel","Description","RACText","FieldError","RACFieldError","Keyboard","children","items","k","RACKeyboard"],"mappings":"sOAiBO,SAASA,EAAS,CAAE,GAAGC,GAAwB,CACpD,MAAMC,EAAaC,EAAAA,KAAK,UAAU,EAClC,OAAOC,EAAAA,IAAC,WAAA,CAAU,GAAGH,EAAO,UAAWC,EAAY,CACrD,CAGO,SAASG,EAAO,CAAE,GAAGJ,GAAsB,CAChD,MAAMC,EAAaC,EAAAA,KAAK,QAAQ,EAChC,OAAOC,EAAAA,IAAC,SAAA,CAAQ,GAAGH,EAAO,UAAWC,EAAY,CACnD,CAGO,SAASI,EAAW,CAAE,GAAGL,GAA0B,CACxD,MAAMC,EAAaC,EAAAA,KAAK,aAAa,EACrC,OAAOC,EAAAA,IAAC,MAAA,CAAK,GAAGH,EAAO,UAAWC,EAAY,CAChD,CAGO,SAASK,EAAK,CAAE,UAAAC,EAAW,WAAAC,EAAY,GAAGR,GAAoB,CACnE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,OAAQC,GAAc,kBAAkB,EAC3E,OAAOL,EAAAA,IAACM,EAAAA,KAAA,CAAQ,UAAWR,EAAa,GAAGD,EAAO,CACpD,CAGO,SAASU,EAA0BC,EAAyB,CACjE,MAAMC,EAAeC,GACnB,MAAM,QAAQA,CAAI,EAEdC,EAAW,IAAI,SAASH,CAAM,EAC9BE,EAEF,CAAA,EAEJ,OAAAC,EAAS,QAAQ,CAACC,EAAOC,IAAQ,CAC/B,GAAI,CAAC,QAAQ,IAAIH,EAAMG,CAAG,EAAG,CAC3BH,EAAKG,CAAG,EAAID,EACZ,MACF,CAEA,MAAME,EAAcJ,EAAKG,CAAG,EACxBJ,EAAYK,CAAW,EACzBA,EAAY,KAAKF,CAAK,EAEtBF,EAAKG,CAAG,EAAI,CAACC,EAAaF,CAAK,CAEnC,CAAC,EACMF,CACT,CAaO,SAASK,EAAM,CAAE,UAAAX,EAAW,GAAGP,GAAqB,CACzD,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,OAAO,EAC1C,OAAOJ,EAAAA,IAAC,MAAA,CAAI,UAAWF,EAAa,GAAGD,EAAO,CAChD,CAEO,SAASmB,EAAM,CAAE,UAAAZ,EAAW,GAAGP,GAAqB,CACzD,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,OAAO,EAC1C,aAAQa,EAAAA,MAAA,CAAS,UAAWnB,EAAY,KAAK,QAAS,GAAGD,EAAO,CAClE,CAEO,SAASqB,EAAY,CAAE,UAAAd,EAAW,GAAGP,GAA2B,CACrE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,aAAa,EAChD,aAAQe,EAAAA,KAAA,CAAQ,UAAWrB,EAAY,KAAK,cAAe,GAAGD,EAAO,CACvE,CAEO,SAASuB,EAAW,CAAE,UAAAhB,EAAW,GAAGP,GAA0B,CACnE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,eAAe,EAClD,OAAOJ,EAAAA,IAACqB,EAAAA,WAAA,CAAe,GAAGxB,EAAO,UAAWC,EAAY,CAC1D,CAEO,SAASwB,EAAS,CAAE,UAAAlB,EAAW,SAAAmB,EAAU,GAAG1B,GAAwB,CACzE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,UAAU,EACvCoB,EACJ,OAAOD,GAAa,SAChBA,EAAS,MAAM,EAAE,EAAE,IAAKE,GAAMzB,EAAAA,IAAC,MAAA,CAAa,SAAAyB,GAAJA,CAAM,CAAM,EACpDF,EACN,aACGG,EAAAA,SAAA,CAAa,GAAG7B,EAAO,UAAWC,EAChC,SAAA0B,EACH,CAEJ"}
1
+ {"version":3,"file":"Fieldset.cjs","sources":["../../../../../src/ui/primitives/Fieldset/Fieldset.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport {\n FieldError as RACFieldError,\n Form as RACForm,\n Keyboard as RACKeyboard,\n Label as RACLabel,\n Text as RACText,\n type FieldErrorProps as RACFieldErrorProps,\n type FormProps as RACFormProps,\n type LabelProps as RACLabelProps,\n type TextProps as RACTextProps,\n type ValidationResult as RACValidationResult,\n} from \"react-aria-components\";\nimport \"./fieldset.css\";\n\nexport type FieldsetProps = ComponentPropsWithoutRef<\"fieldset\">;\nexport function Fieldset({ ...props }: FieldsetProps) {\n const classNames = clsx(\"fieldset\");\n return <fieldset {...props} className={classNames} />;\n}\n\nexport type LegendProps = ComponentPropsWithoutRef<\"legend\">;\nexport function Legend({ ...props }: LegendProps) {\n const classNames = clsx(\"legend\");\n return <legend {...props} className={classNames} />;\n}\n\nexport type FieldGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport function FieldGroup({ ...props }: FieldGroupProps) {\n const classNames = clsx(\"field-group\");\n return <div {...props} className={classNames} />;\n}\n\nexport type FormProps = RACFormProps & { singleLine?: boolean };\nexport function Form({ className, singleLine, ...props }: FormProps) {\n const classNames = clsx(className, \"form\", singleLine && \"form-single-line\");\n return <RACForm className={classNames} {...props} />;\n}\n\nexport type FormDataValue = FormDataEntryValue | FormDataEntryValue[];\n// eslint-disable-next-line react-refresh/only-export-components -- utilitário reaproveitado fora deste arquivo, não é um componente\nexport function formEventTargetToFormData(target: HTMLFormElement) {\n const dataIsArray = (data: FormDataValue): data is FormDataEntryValue[] =>\n Array.isArray(data);\n\n const formData = new FormData(target);\n const data: {\n [k: string]: FormDataValue;\n } = {};\n\n formData.forEach((value, key) => {\n if (!Reflect.has(data, key)) {\n data[key] = value;\n return;\n }\n // convert to array from single value\n const currentItem = data[key];\n if (dataIsArray(currentItem)) {\n currentItem.push(value);\n } else {\n data[key] = [currentItem, value];\n }\n });\n return data;\n}\n\n/**\n * Used by TextField, SelectField, TextareaField, SliderField, etc.\n */\nexport type SharedFieldProps = {\n label?: string;\n description?: string;\n placeholder?: string;\n errorMessage?: string | ((validation: RACValidationResult) => string);\n};\n\nexport type FieldProps = ComponentPropsWithoutRef<\"div\">;\nexport function Field({ className, ...props }: FieldProps) {\n const classNames = clsx(className, \"field\");\n return <div className={classNames} {...props} />;\n}\nexport type LabelProps = RACLabelProps;\nexport function Label({ className, ...props }: LabelProps) {\n const classNames = clsx(className, \"label\");\n return <RACLabel className={classNames} slot=\"label\" {...props} />;\n}\nexport type DescriptionProps = RACTextProps;\nexport function Description({ className, ...props }: DescriptionProps) {\n const classNames = clsx(className, \"description\");\n return <RACText className={classNames} slot=\"description\" {...props} />;\n}\nexport type FieldErrorProps = RACFieldErrorProps;\nexport function FieldError({ className, ...props }: FieldErrorProps) {\n const classNames = clsx(className, \"error-message\");\n return <RACFieldError {...props} className={classNames} />;\n}\nexport type KeyboardProps = RACTextProps;\nexport function Keyboard({ className, children, ...props }: KeyboardProps) {\n const classNames = clsx(className, \"keyboard\");\n const items =\n typeof children === \"string\"\n ? children.split(\"\").map((k) => <kbd key={k}>{k}</kbd>)\n : children;\n return (\n <RACKeyboard {...props} className={classNames}>\n {items}\n </RACKeyboard>\n );\n}\n"],"names":["Fieldset","props","classNames","clsx","jsx","Legend","FieldGroup","Form","className","singleLine","RACForm","formEventTargetToFormData","target","dataIsArray","data","formData","value","key","currentItem","Field","Label","RACLabel","Description","RACText","FieldError","RACFieldError","Keyboard","children","items","k","RACKeyboard"],"mappings":"sOAiBO,SAASA,EAAS,CAAE,GAAGC,GAAwB,CACpD,MAAMC,EAAaC,EAAAA,KAAK,UAAU,EAClC,OAAOC,EAAAA,IAAC,WAAA,CAAU,GAAGH,EAAO,UAAWC,EAAY,CACrD,CAGO,SAASG,EAAO,CAAE,GAAGJ,GAAsB,CAChD,MAAMC,EAAaC,EAAAA,KAAK,QAAQ,EAChC,OAAOC,EAAAA,IAAC,SAAA,CAAQ,GAAGH,EAAO,UAAWC,EAAY,CACnD,CAGO,SAASI,EAAW,CAAE,GAAGL,GAA0B,CACxD,MAAMC,EAAaC,EAAAA,KAAK,aAAa,EACrC,OAAOC,EAAAA,IAAC,MAAA,CAAK,GAAGH,EAAO,UAAWC,EAAY,CAChD,CAGO,SAASK,EAAK,CAAE,UAAAC,EAAW,WAAAC,EAAY,GAAGR,GAAoB,CACnE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,OAAQC,GAAc,kBAAkB,EAC3E,OAAOL,EAAAA,IAACM,EAAAA,KAAA,CAAQ,UAAWR,EAAa,GAAGD,EAAO,CACpD,CAIO,SAASU,EAA0BC,EAAyB,CACjE,MAAMC,EAAeC,GACnB,MAAM,QAAQA,CAAI,EAEdC,EAAW,IAAI,SAASH,CAAM,EAC9BE,EAEF,CAAA,EAEJ,OAAAC,EAAS,QAAQ,CAACC,EAAOC,IAAQ,CAC/B,GAAI,CAAC,QAAQ,IAAIH,EAAMG,CAAG,EAAG,CAC3BH,EAAKG,CAAG,EAAID,EACZ,MACF,CAEA,MAAME,EAAcJ,EAAKG,CAAG,EACxBJ,EAAYK,CAAW,EACzBA,EAAY,KAAKF,CAAK,EAEtBF,EAAKG,CAAG,EAAI,CAACC,EAAaF,CAAK,CAEnC,CAAC,EACMF,CACT,CAaO,SAASK,EAAM,CAAE,UAAAX,EAAW,GAAGP,GAAqB,CACzD,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,OAAO,EAC1C,OAAOJ,EAAAA,IAAC,MAAA,CAAI,UAAWF,EAAa,GAAGD,EAAO,CAChD,CAEO,SAASmB,EAAM,CAAE,UAAAZ,EAAW,GAAGP,GAAqB,CACzD,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,OAAO,EAC1C,aAAQa,EAAAA,MAAA,CAAS,UAAWnB,EAAY,KAAK,QAAS,GAAGD,EAAO,CAClE,CAEO,SAASqB,EAAY,CAAE,UAAAd,EAAW,GAAGP,GAA2B,CACrE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,aAAa,EAChD,aAAQe,EAAAA,KAAA,CAAQ,UAAWrB,EAAY,KAAK,cAAe,GAAGD,EAAO,CACvE,CAEO,SAASuB,EAAW,CAAE,UAAAhB,EAAW,GAAGP,GAA0B,CACnE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,eAAe,EAClD,OAAOJ,EAAAA,IAACqB,EAAAA,WAAA,CAAe,GAAGxB,EAAO,UAAWC,EAAY,CAC1D,CAEO,SAASwB,EAAS,CAAE,UAAAlB,EAAW,SAAAmB,EAAU,GAAG1B,GAAwB,CACzE,MAAMC,EAAaC,EAAAA,KAAKK,EAAW,UAAU,EACvCoB,EACJ,OAAOD,GAAa,SAChBA,EAAS,MAAM,EAAE,EAAE,IAAKE,GAAMzB,EAAAA,IAAC,MAAA,CAAa,SAAAyB,GAAJA,CAAM,CAAM,EACpDF,EACN,aACGG,EAAAA,SAAA,CAAa,GAAG7B,EAAO,UAAWC,EAChC,SAAA0B,EACH,CAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"Fieldset.js","sources":["../../../../../src/ui/primitives/Fieldset/Fieldset.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport {\n FieldError as RACFieldError,\n Form as RACForm,\n Keyboard as RACKeyboard,\n Label as RACLabel,\n Text as RACText,\n type FieldErrorProps as RACFieldErrorProps,\n type FormProps as RACFormProps,\n type LabelProps as RACLabelProps,\n type TextProps as RACTextProps,\n type ValidationResult as RACValidationResult,\n} from \"react-aria-components\";\nimport \"./fieldset.css\";\n\nexport type FieldsetProps = ComponentPropsWithoutRef<\"fieldset\">;\nexport function Fieldset({ ...props }: FieldsetProps) {\n const classNames = clsx(\"fieldset\");\n return <fieldset {...props} className={classNames} />;\n}\n\nexport type LegendProps = ComponentPropsWithoutRef<\"legend\">;\nexport function Legend({ ...props }: LegendProps) {\n const classNames = clsx(\"legend\");\n return <legend {...props} className={classNames} />;\n}\n\nexport type FieldGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport function FieldGroup({ ...props }: FieldGroupProps) {\n const classNames = clsx(\"field-group\");\n return <div {...props} className={classNames} />;\n}\n\nexport type FormProps = RACFormProps & { singleLine?: boolean };\nexport function Form({ className, singleLine, ...props }: FormProps) {\n const classNames = clsx(className, \"form\", singleLine && \"form-single-line\");\n return <RACForm className={classNames} {...props} />;\n}\n\nexport type FormDataValue = FormDataEntryValue | FormDataEntryValue[];\nexport function formEventTargetToFormData(target: HTMLFormElement) {\n const dataIsArray = (data: FormDataValue): data is FormDataEntryValue[] =>\n Array.isArray(data);\n\n const formData = new FormData(target);\n const data: {\n [k: string]: FormDataValue;\n } = {};\n\n formData.forEach((value, key) => {\n if (!Reflect.has(data, key)) {\n data[key] = value;\n return;\n }\n // convert to array from single value\n const currentItem = data[key];\n if (dataIsArray(currentItem)) {\n currentItem.push(value);\n } else {\n data[key] = [currentItem, value];\n }\n });\n return data;\n}\n\n/**\n * Used by TextField, SelectField, TextareaField, SliderField, etc.\n */\nexport type SharedFieldProps = {\n label?: string;\n description?: string;\n placeholder?: string;\n errorMessage?: string | ((validation: RACValidationResult) => string);\n};\n\nexport type FieldProps = ComponentPropsWithoutRef<\"div\">;\nexport function Field({ className, ...props }: FieldProps) {\n const classNames = clsx(className, \"field\");\n return <div className={classNames} {...props} />;\n}\nexport type LabelProps = RACLabelProps;\nexport function Label({ className, ...props }: LabelProps) {\n const classNames = clsx(className, \"label\");\n return <RACLabel className={classNames} slot=\"label\" {...props} />;\n}\nexport type DescriptionProps = RACTextProps;\nexport function Description({ className, ...props }: DescriptionProps) {\n const classNames = clsx(className, \"description\");\n return <RACText className={classNames} slot=\"description\" {...props} />;\n}\nexport type FieldErrorProps = RACFieldErrorProps;\nexport function FieldError({ className, ...props }: FieldErrorProps) {\n const classNames = clsx(className, \"error-message\");\n return <RACFieldError {...props} className={classNames} />;\n}\nexport type KeyboardProps = RACTextProps;\nexport function Keyboard({ className, children, ...props }: KeyboardProps) {\n const classNames = clsx(className, \"keyboard\");\n const items =\n typeof children === \"string\"\n ? children.split(\"\").map((k) => <kbd key={k}>{k}</kbd>)\n : children;\n return (\n <RACKeyboard {...props} className={classNames}>\n {items}\n </RACKeyboard>\n );\n}\n"],"names":["Fieldset","props","classNames","clsx","jsx","Legend","FieldGroup","Form","className","singleLine","RACForm","formEventTargetToFormData","target","dataIsArray","data","formData","value","key","currentItem","Field","Label","RACLabel","Description","RACText","FieldError","RACFieldError","Keyboard","children","items","k","RACKeyboard"],"mappings":";;;;AAiBO,SAASA,EAAS,EAAE,GAAGC,KAAwB;AACpD,QAAMC,IAAaC,EAAK,UAAU;AAClC,SAAO,gBAAAC,EAAC,YAAA,EAAU,GAAGH,GAAO,WAAWC,GAAY;AACrD;AAGO,SAASG,EAAO,EAAE,GAAGJ,KAAsB;AAChD,QAAMC,IAAaC,EAAK,QAAQ;AAChC,SAAO,gBAAAC,EAAC,UAAA,EAAQ,GAAGH,GAAO,WAAWC,GAAY;AACnD;AAGO,SAASI,EAAW,EAAE,GAAGL,KAA0B;AACxD,QAAMC,IAAaC,EAAK,aAAa;AACrC,SAAO,gBAAAC,EAAC,OAAA,EAAK,GAAGH,GAAO,WAAWC,GAAY;AAChD;AAGO,SAASK,EAAK,EAAE,WAAAC,GAAW,YAAAC,GAAY,GAAGR,KAAoB;AACnE,QAAMC,IAAaC,EAAKK,GAAW,QAAQC,KAAc,kBAAkB;AAC3E,SAAO,gBAAAL,EAACM,GAAA,EAAQ,WAAWR,GAAa,GAAGD,GAAO;AACpD;AAGO,SAASU,EAA0BC,GAAyB;AACjE,QAAMC,IAAc,CAACC,MACnB,MAAM,QAAQA,CAAI,GAEdC,IAAW,IAAI,SAASH,CAAM,GAC9BE,IAEF,CAAA;AAEJ,SAAAC,EAAS,QAAQ,CAACC,GAAOC,MAAQ;AAC/B,QAAI,CAAC,QAAQ,IAAIH,GAAMG,CAAG,GAAG;AAC3B,MAAAH,EAAKG,CAAG,IAAID;AACZ;AAAA,IACF;AAEA,UAAME,IAAcJ,EAAKG,CAAG;AAC5B,IAAIJ,EAAYK,CAAW,IACzBA,EAAY,KAAKF,CAAK,IAEtBF,EAAKG,CAAG,IAAI,CAACC,GAAaF,CAAK;AAAA,EAEnC,CAAC,GACMF;AACT;AAaO,SAASK,EAAM,EAAE,WAAAX,GAAW,GAAGP,KAAqB;AACzD,QAAMC,IAAaC,EAAKK,GAAW,OAAO;AAC1C,SAAO,gBAAAJ,EAAC,OAAA,EAAI,WAAWF,GAAa,GAAGD,GAAO;AAChD;AAEO,SAASmB,EAAM,EAAE,WAAAZ,GAAW,GAAGP,KAAqB;AACzD,QAAMC,IAAaC,EAAKK,GAAW,OAAO;AAC1C,2BAAQa,GAAA,EAAS,WAAWnB,GAAY,MAAK,SAAS,GAAGD,GAAO;AAClE;AAEO,SAASqB,EAAY,EAAE,WAAAd,GAAW,GAAGP,KAA2B;AACrE,QAAMC,IAAaC,EAAKK,GAAW,aAAa;AAChD,2BAAQe,GAAA,EAAQ,WAAWrB,GAAY,MAAK,eAAe,GAAGD,GAAO;AACvE;AAEO,SAASuB,EAAW,EAAE,WAAAhB,GAAW,GAAGP,KAA0B;AACnE,QAAMC,IAAaC,EAAKK,GAAW,eAAe;AAClD,SAAO,gBAAAJ,EAACqB,GAAA,EAAe,GAAGxB,GAAO,WAAWC,GAAY;AAC1D;AAEO,SAASwB,EAAS,EAAE,WAAAlB,GAAW,UAAAmB,GAAU,GAAG1B,KAAwB;AACzE,QAAMC,IAAaC,EAAKK,GAAW,UAAU,GACvCoB,IACJ,OAAOD,KAAa,WAChBA,EAAS,MAAM,EAAE,EAAE,IAAI,CAACE,MAAM,gBAAAzB,EAAC,OAAA,EAAa,UAAAyB,KAAJA,CAAM,CAAM,IACpDF;AACN,2BACGG,GAAA,EAAa,GAAG7B,GAAO,WAAWC,GAChC,UAAA0B,GACH;AAEJ;"}
1
+ {"version":3,"file":"Fieldset.js","sources":["../../../../../src/ui/primitives/Fieldset/Fieldset.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport {\n FieldError as RACFieldError,\n Form as RACForm,\n Keyboard as RACKeyboard,\n Label as RACLabel,\n Text as RACText,\n type FieldErrorProps as RACFieldErrorProps,\n type FormProps as RACFormProps,\n type LabelProps as RACLabelProps,\n type TextProps as RACTextProps,\n type ValidationResult as RACValidationResult,\n} from \"react-aria-components\";\nimport \"./fieldset.css\";\n\nexport type FieldsetProps = ComponentPropsWithoutRef<\"fieldset\">;\nexport function Fieldset({ ...props }: FieldsetProps) {\n const classNames = clsx(\"fieldset\");\n return <fieldset {...props} className={classNames} />;\n}\n\nexport type LegendProps = ComponentPropsWithoutRef<\"legend\">;\nexport function Legend({ ...props }: LegendProps) {\n const classNames = clsx(\"legend\");\n return <legend {...props} className={classNames} />;\n}\n\nexport type FieldGroupProps = ComponentPropsWithoutRef<\"div\">;\nexport function FieldGroup({ ...props }: FieldGroupProps) {\n const classNames = clsx(\"field-group\");\n return <div {...props} className={classNames} />;\n}\n\nexport type FormProps = RACFormProps & { singleLine?: boolean };\nexport function Form({ className, singleLine, ...props }: FormProps) {\n const classNames = clsx(className, \"form\", singleLine && \"form-single-line\");\n return <RACForm className={classNames} {...props} />;\n}\n\nexport type FormDataValue = FormDataEntryValue | FormDataEntryValue[];\n// eslint-disable-next-line react-refresh/only-export-components -- utilitário reaproveitado fora deste arquivo, não é um componente\nexport function formEventTargetToFormData(target: HTMLFormElement) {\n const dataIsArray = (data: FormDataValue): data is FormDataEntryValue[] =>\n Array.isArray(data);\n\n const formData = new FormData(target);\n const data: {\n [k: string]: FormDataValue;\n } = {};\n\n formData.forEach((value, key) => {\n if (!Reflect.has(data, key)) {\n data[key] = value;\n return;\n }\n // convert to array from single value\n const currentItem = data[key];\n if (dataIsArray(currentItem)) {\n currentItem.push(value);\n } else {\n data[key] = [currentItem, value];\n }\n });\n return data;\n}\n\n/**\n * Used by TextField, SelectField, TextareaField, SliderField, etc.\n */\nexport type SharedFieldProps = {\n label?: string;\n description?: string;\n placeholder?: string;\n errorMessage?: string | ((validation: RACValidationResult) => string);\n};\n\nexport type FieldProps = ComponentPropsWithoutRef<\"div\">;\nexport function Field({ className, ...props }: FieldProps) {\n const classNames = clsx(className, \"field\");\n return <div className={classNames} {...props} />;\n}\nexport type LabelProps = RACLabelProps;\nexport function Label({ className, ...props }: LabelProps) {\n const classNames = clsx(className, \"label\");\n return <RACLabel className={classNames} slot=\"label\" {...props} />;\n}\nexport type DescriptionProps = RACTextProps;\nexport function Description({ className, ...props }: DescriptionProps) {\n const classNames = clsx(className, \"description\");\n return <RACText className={classNames} slot=\"description\" {...props} />;\n}\nexport type FieldErrorProps = RACFieldErrorProps;\nexport function FieldError({ className, ...props }: FieldErrorProps) {\n const classNames = clsx(className, \"error-message\");\n return <RACFieldError {...props} className={classNames} />;\n}\nexport type KeyboardProps = RACTextProps;\nexport function Keyboard({ className, children, ...props }: KeyboardProps) {\n const classNames = clsx(className, \"keyboard\");\n const items =\n typeof children === \"string\"\n ? children.split(\"\").map((k) => <kbd key={k}>{k}</kbd>)\n : children;\n return (\n <RACKeyboard {...props} className={classNames}>\n {items}\n </RACKeyboard>\n );\n}\n"],"names":["Fieldset","props","classNames","clsx","jsx","Legend","FieldGroup","Form","className","singleLine","RACForm","formEventTargetToFormData","target","dataIsArray","data","formData","value","key","currentItem","Field","Label","RACLabel","Description","RACText","FieldError","RACFieldError","Keyboard","children","items","k","RACKeyboard"],"mappings":";;;;AAiBO,SAASA,EAAS,EAAE,GAAGC,KAAwB;AACpD,QAAMC,IAAaC,EAAK,UAAU;AAClC,SAAO,gBAAAC,EAAC,YAAA,EAAU,GAAGH,GAAO,WAAWC,GAAY;AACrD;AAGO,SAASG,EAAO,EAAE,GAAGJ,KAAsB;AAChD,QAAMC,IAAaC,EAAK,QAAQ;AAChC,SAAO,gBAAAC,EAAC,UAAA,EAAQ,GAAGH,GAAO,WAAWC,GAAY;AACnD;AAGO,SAASI,EAAW,EAAE,GAAGL,KAA0B;AACxD,QAAMC,IAAaC,EAAK,aAAa;AACrC,SAAO,gBAAAC,EAAC,OAAA,EAAK,GAAGH,GAAO,WAAWC,GAAY;AAChD;AAGO,SAASK,EAAK,EAAE,WAAAC,GAAW,YAAAC,GAAY,GAAGR,KAAoB;AACnE,QAAMC,IAAaC,EAAKK,GAAW,QAAQC,KAAc,kBAAkB;AAC3E,SAAO,gBAAAL,EAACM,GAAA,EAAQ,WAAWR,GAAa,GAAGD,GAAO;AACpD;AAIO,SAASU,EAA0BC,GAAyB;AACjE,QAAMC,IAAc,CAACC,MACnB,MAAM,QAAQA,CAAI,GAEdC,IAAW,IAAI,SAASH,CAAM,GAC9BE,IAEF,CAAA;AAEJ,SAAAC,EAAS,QAAQ,CAACC,GAAOC,MAAQ;AAC/B,QAAI,CAAC,QAAQ,IAAIH,GAAMG,CAAG,GAAG;AAC3B,MAAAH,EAAKG,CAAG,IAAID;AACZ;AAAA,IACF;AAEA,UAAME,IAAcJ,EAAKG,CAAG;AAC5B,IAAIJ,EAAYK,CAAW,IACzBA,EAAY,KAAKF,CAAK,IAEtBF,EAAKG,CAAG,IAAI,CAACC,GAAaF,CAAK;AAAA,EAEnC,CAAC,GACMF;AACT;AAaO,SAASK,EAAM,EAAE,WAAAX,GAAW,GAAGP,KAAqB;AACzD,QAAMC,IAAaC,EAAKK,GAAW,OAAO;AAC1C,SAAO,gBAAAJ,EAAC,OAAA,EAAI,WAAWF,GAAa,GAAGD,GAAO;AAChD;AAEO,SAASmB,EAAM,EAAE,WAAAZ,GAAW,GAAGP,KAAqB;AACzD,QAAMC,IAAaC,EAAKK,GAAW,OAAO;AAC1C,2BAAQa,GAAA,EAAS,WAAWnB,GAAY,MAAK,SAAS,GAAGD,GAAO;AAClE;AAEO,SAASqB,EAAY,EAAE,WAAAd,GAAW,GAAGP,KAA2B;AACrE,QAAMC,IAAaC,EAAKK,GAAW,aAAa;AAChD,2BAAQe,GAAA,EAAQ,WAAWrB,GAAY,MAAK,eAAe,GAAGD,GAAO;AACvE;AAEO,SAASuB,EAAW,EAAE,WAAAhB,GAAW,GAAGP,KAA0B;AACnE,QAAMC,IAAaC,EAAKK,GAAW,eAAe;AAClD,SAAO,gBAAAJ,EAACqB,GAAA,EAAe,GAAGxB,GAAO,WAAWC,GAAY;AAC1D;AAEO,SAASwB,EAAS,EAAE,WAAAlB,GAAW,UAAAmB,GAAU,GAAG1B,KAAwB;AACzE,QAAMC,IAAaC,EAAKK,GAAW,UAAU,GACvCoB,IACJ,OAAOD,KAAa,WAChBA,EAAS,MAAM,EAAE,EAAE,IAAI,CAACE,MAAM,gBAAAzB,EAAC,OAAA,EAAa,UAAAyB,KAAJA,CAAM,CAAM,IACpDF;AACN,2BACGG,GAAA,EAAa,GAAG7B,GAAO,WAAWC,GAChC,UAAA0B,GACH;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.cjs","sources":["../../../../../src/ui/primitives/Pagination/Pagination.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useMediaQuery } from \"hooks\";\nimport { IconArrowLeft, IconArrowRight } from \"icons\";\nimport type React from \"react\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./pagination.css\";\n\nexport type PaginationManualProps = React.ComponentPropsWithoutRef<\"nav\">;\n\nexport type PaginationControlledProps = {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n previousLabel: string;\n nextLabel: string;\n className?: string;\n};\n\nexport type PaginationProps = PaginationManualProps | PaginationControlledProps;\n\nfunction isControlledProps(\n props: PaginationProps,\n): props is PaginationControlledProps {\n return \"totalPages\" in props;\n}\n\nexport function Pagination(props: PaginationProps) {\n if (isControlledProps(props)) {\n const { page, totalPages, onPageChange, previousLabel, nextLabel, className } = props;\n if (totalPages <= 1) return null;\n return (\n <nav aria-label=\"Page navigation\" className={clsx(className, \"pagination\")}>\n <PaginationPrevious isDisabled={page <= 1} onPress={() => onPageChange(Math.max(1, page - 1))}>\n {previousLabel}\n </PaginationPrevious>\n <PaginationList>\n {buildPaginationPages(page, totalPages).map((p, i) =>\n p === \"...\" ? (\n <PaginationGap key={`gap-${i}`} />\n ) : (\n <PaginationPage key={p} current={p === page} onPress={() => onPageChange(p)}>\n {String(p)}\n </PaginationPage>\n ),\n )}\n </PaginationList>\n <PaginationNext isDisabled={page >= totalPages} onPress={() => onPageChange(Math.min(totalPages, page + 1))}>\n {nextLabel}\n </PaginationNext>\n </nav>\n );\n }\n const { \"aria-label\": ariaLabel = \"Page navigation\", className, ...rest } = props;\n return <nav aria-label={ariaLabel} {...rest} className={clsx(className, \"pagination\")} />;\n}\n\nexport function PaginationPrevious({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Previous\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Previous page\"\n >\n <IconArrowLeft size=\"16\" />\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationNext({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Next\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Next page\"\n >\n {children}\n <IconArrowRight size=\"16\" />\n </AnchorOrButton>\n );\n}\n\nexport function PaginationList({ children }: { children: React.ReactNode }) {\n const { isTabletUp } = useMediaQuery();\n return isTabletUp && <span className=\"pagination-list\">{children}</span>;\n}\n\nexport function PaginationPage({\n href,\n onPress,\n children,\n current = false,\n}: {\n href?: string;\n onPress?: () => void;\n children: string;\n current?: boolean;\n}) {\n return (\n <AnchorOrButton\n {...(href ? { href } : {})}\n onPress={onPress}\n aria-label={`Page ${children}`}\n aria-current={current ? \"page\" : undefined}\n className={clsx(\"pagination-btn\", current && \"pagination-btn-active\")}\n >\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationGap() {\n return (\n <div aria-hidden=\"true\" className=\"pagination-gap\">\n &hellip;\n </div>\n );\n}\n\nexport function buildPaginationPages(current: number, total: number): Array<number | \"...\"> {\n if (total <= 6) return Array.from({ length: total }, (_, i) => i + 1);\n const head = [1, 2, 3];\n const tail = [total - 1, total];\n if (current <= 4) return [...head, \"...\", ...tail];\n if (current >= total - 3) return [1, 2, \"...\", total - 2, total - 1, total];\n return [1, \"...\", current - 1, current, current + 1, \"...\", total];\n}\n"],"names":["isControlledProps","props","Pagination","page","totalPages","onPageChange","previousLabel","nextLabel","className","jsxs","clsx","jsx","PaginationPrevious","PaginationList","buildPaginationPages","p","i","PaginationGap","PaginationPage","PaginationNext","ariaLabel","rest","href","onPress","isDisabled","children","AnchorOrButton","IconArrowLeft","IconArrowRight","isTabletUp","useMediaQuery","current","total","_","head","tail"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination.cjs","sources":["../../../../../src/ui/primitives/Pagination/Pagination.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useMediaQuery } from \"hooks\";\nimport { IconArrowLeft, IconArrowRight } from \"icons\";\nimport type React from \"react\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./pagination.css\";\n\nexport type PaginationManualProps = React.ComponentPropsWithoutRef<\"nav\">;\n\nexport type PaginationControlledProps = {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n previousLabel: string;\n nextLabel: string;\n className?: string;\n};\n\nexport type PaginationProps = PaginationManualProps | PaginationControlledProps;\n\nfunction isControlledProps(\n props: PaginationProps,\n): props is PaginationControlledProps {\n return \"totalPages\" in props;\n}\n\nexport function Pagination(props: PaginationProps) {\n if (isControlledProps(props)) {\n const { page, totalPages, onPageChange, previousLabel, nextLabel, className } = props;\n if (totalPages <= 1) return null;\n return (\n <nav aria-label=\"Page navigation\" className={clsx(className, \"pagination\")}>\n <PaginationPrevious isDisabled={page <= 1} onPress={() => onPageChange(Math.max(1, page - 1))}>\n {previousLabel}\n </PaginationPrevious>\n <PaginationList>\n {buildPaginationPages(page, totalPages).map((p, i) =>\n p === \"...\" ? (\n <PaginationGap key={`gap-${i}`} />\n ) : (\n <PaginationPage key={p} current={p === page} onPress={() => onPageChange(p)}>\n {String(p)}\n </PaginationPage>\n ),\n )}\n </PaginationList>\n <PaginationNext isDisabled={page >= totalPages} onPress={() => onPageChange(Math.min(totalPages, page + 1))}>\n {nextLabel}\n </PaginationNext>\n </nav>\n );\n }\n const { \"aria-label\": ariaLabel = \"Page navigation\", className, ...rest } = props;\n return <nav aria-label={ariaLabel} {...rest} className={clsx(className, \"pagination\")} />;\n}\n\nexport function PaginationPrevious({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Previous\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Previous page\"\n >\n <IconArrowLeft size=\"16\" />\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationNext({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Next\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Next page\"\n >\n {children}\n <IconArrowRight size=\"16\" />\n </AnchorOrButton>\n );\n}\n\nexport function PaginationList({ children }: { children: React.ReactNode }) {\n const { isTabletUp } = useMediaQuery();\n return isTabletUp && <span className=\"pagination-list\">{children}</span>;\n}\n\nexport function PaginationPage({\n href,\n onPress,\n children,\n current = false,\n}: {\n href?: string;\n onPress?: () => void;\n children: string;\n current?: boolean;\n}) {\n return (\n <AnchorOrButton\n {...(href ? { href } : {})}\n onPress={onPress}\n aria-label={`Page ${children}`}\n aria-current={current ? \"page\" : undefined}\n className={clsx(\"pagination-btn\", current && \"pagination-btn-active\")}\n >\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationGap() {\n return (\n <div aria-hidden=\"true\" className=\"pagination-gap\">\n &hellip;\n </div>\n );\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- utilitário reaproveitado fora deste arquivo, não é um componente\nexport function buildPaginationPages(current: number, total: number): Array<number | \"...\"> {\n if (total <= 6) return Array.from({ length: total }, (_, i) => i + 1);\n const head = [1, 2, 3];\n const tail = [total - 1, total];\n if (current <= 4) return [...head, \"...\", ...tail];\n if (current >= total - 3) return [1, 2, \"...\", total - 2, total - 1, total];\n return [1, \"...\", current - 1, current, current + 1, \"...\", total];\n}\n"],"names":["isControlledProps","props","Pagination","page","totalPages","onPageChange","previousLabel","nextLabel","className","jsxs","clsx","jsx","PaginationPrevious","PaginationList","buildPaginationPages","p","i","PaginationGap","PaginationPage","PaginationNext","ariaLabel","rest","href","onPress","isDisabled","children","AnchorOrButton","IconArrowLeft","IconArrowRight","isTabletUp","useMediaQuery","current","total","_","head","tail"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["../../../../../src/ui/primitives/Pagination/Pagination.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useMediaQuery } from \"hooks\";\nimport { IconArrowLeft, IconArrowRight } from \"icons\";\nimport type React from \"react\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./pagination.css\";\n\nexport type PaginationManualProps = React.ComponentPropsWithoutRef<\"nav\">;\n\nexport type PaginationControlledProps = {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n previousLabel: string;\n nextLabel: string;\n className?: string;\n};\n\nexport type PaginationProps = PaginationManualProps | PaginationControlledProps;\n\nfunction isControlledProps(\n props: PaginationProps,\n): props is PaginationControlledProps {\n return \"totalPages\" in props;\n}\n\nexport function Pagination(props: PaginationProps) {\n if (isControlledProps(props)) {\n const { page, totalPages, onPageChange, previousLabel, nextLabel, className } = props;\n if (totalPages <= 1) return null;\n return (\n <nav aria-label=\"Page navigation\" className={clsx(className, \"pagination\")}>\n <PaginationPrevious isDisabled={page <= 1} onPress={() => onPageChange(Math.max(1, page - 1))}>\n {previousLabel}\n </PaginationPrevious>\n <PaginationList>\n {buildPaginationPages(page, totalPages).map((p, i) =>\n p === \"...\" ? (\n <PaginationGap key={`gap-${i}`} />\n ) : (\n <PaginationPage key={p} current={p === page} onPress={() => onPageChange(p)}>\n {String(p)}\n </PaginationPage>\n ),\n )}\n </PaginationList>\n <PaginationNext isDisabled={page >= totalPages} onPress={() => onPageChange(Math.min(totalPages, page + 1))}>\n {nextLabel}\n </PaginationNext>\n </nav>\n );\n }\n const { \"aria-label\": ariaLabel = \"Page navigation\", className, ...rest } = props;\n return <nav aria-label={ariaLabel} {...rest} className={clsx(className, \"pagination\")} />;\n}\n\nexport function PaginationPrevious({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Previous\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Previous page\"\n >\n <IconArrowLeft size=\"16\" />\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationNext({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Next\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Next page\"\n >\n {children}\n <IconArrowRight size=\"16\" />\n </AnchorOrButton>\n );\n}\n\nexport function PaginationList({ children }: { children: React.ReactNode }) {\n const { isTabletUp } = useMediaQuery();\n return isTabletUp && <span className=\"pagination-list\">{children}</span>;\n}\n\nexport function PaginationPage({\n href,\n onPress,\n children,\n current = false,\n}: {\n href?: string;\n onPress?: () => void;\n children: string;\n current?: boolean;\n}) {\n return (\n <AnchorOrButton\n {...(href ? { href } : {})}\n onPress={onPress}\n aria-label={`Page ${children}`}\n aria-current={current ? \"page\" : undefined}\n className={clsx(\"pagination-btn\", current && \"pagination-btn-active\")}\n >\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationGap() {\n return (\n <div aria-hidden=\"true\" className=\"pagination-gap\">\n &hellip;\n </div>\n );\n}\n\nexport function buildPaginationPages(current: number, total: number): Array<number | \"...\"> {\n if (total <= 6) return Array.from({ length: total }, (_, i) => i + 1);\n const head = [1, 2, 3];\n const tail = [total - 1, total];\n if (current <= 4) return [...head, \"...\", ...tail];\n if (current >= total - 3) return [1, 2, \"...\", total - 2, total - 1, total];\n return [1, \"...\", current - 1, current, current + 1, \"...\", total];\n}\n"],"names":["isControlledProps","props","Pagination","page","totalPages","onPageChange","previousLabel","nextLabel","className","jsxs","clsx","jsx","PaginationPrevious","PaginationList","buildPaginationPages","p","i","PaginationGap","PaginationPage","PaginationNext","ariaLabel","rest","href","onPress","isDisabled","children","AnchorOrButton","IconArrowLeft","IconArrowRight","isTabletUp","useMediaQuery","current","total","_","head","tail"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination.js","sources":["../../../../../src/ui/primitives/Pagination/Pagination.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useMediaQuery } from \"hooks\";\nimport { IconArrowLeft, IconArrowRight } from \"icons\";\nimport type React from \"react\";\nimport { AnchorOrButton } from \"utils\";\nimport \"./pagination.css\";\n\nexport type PaginationManualProps = React.ComponentPropsWithoutRef<\"nav\">;\n\nexport type PaginationControlledProps = {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n previousLabel: string;\n nextLabel: string;\n className?: string;\n};\n\nexport type PaginationProps = PaginationManualProps | PaginationControlledProps;\n\nfunction isControlledProps(\n props: PaginationProps,\n): props is PaginationControlledProps {\n return \"totalPages\" in props;\n}\n\nexport function Pagination(props: PaginationProps) {\n if (isControlledProps(props)) {\n const { page, totalPages, onPageChange, previousLabel, nextLabel, className } = props;\n if (totalPages <= 1) return null;\n return (\n <nav aria-label=\"Page navigation\" className={clsx(className, \"pagination\")}>\n <PaginationPrevious isDisabled={page <= 1} onPress={() => onPageChange(Math.max(1, page - 1))}>\n {previousLabel}\n </PaginationPrevious>\n <PaginationList>\n {buildPaginationPages(page, totalPages).map((p, i) =>\n p === \"...\" ? (\n <PaginationGap key={`gap-${i}`} />\n ) : (\n <PaginationPage key={p} current={p === page} onPress={() => onPageChange(p)}>\n {String(p)}\n </PaginationPage>\n ),\n )}\n </PaginationList>\n <PaginationNext isDisabled={page >= totalPages} onPress={() => onPageChange(Math.min(totalPages, page + 1))}>\n {nextLabel}\n </PaginationNext>\n </nav>\n );\n }\n const { \"aria-label\": ariaLabel = \"Page navigation\", className, ...rest } = props;\n return <nav aria-label={ariaLabel} {...rest} className={clsx(className, \"pagination\")} />;\n}\n\nexport function PaginationPrevious({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Previous\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Previous page\"\n >\n <IconArrowLeft size=\"16\" />\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationNext({\n href = null,\n onPress,\n isDisabled = false,\n children = \"Next\",\n}: {\n href?: string | null;\n onPress?: () => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <AnchorOrButton\n {...(href !== null ? { href } : {})}\n onPress={onPress}\n isDisabled={isDisabled || (href === null && !onPress)}\n className={clsx(\"pagination-btn\", \"pagination-nav\")}\n aria-label=\"Next page\"\n >\n {children}\n <IconArrowRight size=\"16\" />\n </AnchorOrButton>\n );\n}\n\nexport function PaginationList({ children }: { children: React.ReactNode }) {\n const { isTabletUp } = useMediaQuery();\n return isTabletUp && <span className=\"pagination-list\">{children}</span>;\n}\n\nexport function PaginationPage({\n href,\n onPress,\n children,\n current = false,\n}: {\n href?: string;\n onPress?: () => void;\n children: string;\n current?: boolean;\n}) {\n return (\n <AnchorOrButton\n {...(href ? { href } : {})}\n onPress={onPress}\n aria-label={`Page ${children}`}\n aria-current={current ? \"page\" : undefined}\n className={clsx(\"pagination-btn\", current && \"pagination-btn-active\")}\n >\n {children}\n </AnchorOrButton>\n );\n}\n\nexport function PaginationGap() {\n return (\n <div aria-hidden=\"true\" className=\"pagination-gap\">\n &hellip;\n </div>\n );\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- utilitário reaproveitado fora deste arquivo, não é um componente\nexport function buildPaginationPages(current: number, total: number): Array<number | \"...\"> {\n if (total <= 6) return Array.from({ length: total }, (_, i) => i + 1);\n const head = [1, 2, 3];\n const tail = [total - 1, total];\n if (current <= 4) return [...head, \"...\", ...tail];\n if (current >= total - 3) return [1, 2, \"...\", total - 2, total - 1, total];\n return [1, \"...\", current - 1, current, current + 1, \"...\", total];\n}\n"],"names":["isControlledProps","props","Pagination","page","totalPages","onPageChange","previousLabel","nextLabel","className","jsxs","clsx","jsx","PaginationPrevious","PaginationList","buildPaginationPages","p","i","PaginationGap","PaginationPage","PaginationNext","ariaLabel","rest","href","onPress","isDisabled","children","AnchorOrButton","IconArrowLeft","IconArrowRight","isTabletUp","useMediaQuery","current","total","_","head","tail"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.cjs","sources":["../../../../../src/ui/primitives/Toast/Toast.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n IconAlertTriangle,\n IconCheckCircle,\n IconInfo,\n IconXCircle,\n} from \"icons\";\nimport {\n ToastContainer as RTToastContainer,\n type IconProps as RTIconProps,\n type ToastContainerProps as RTToastContainerProps,\n} from \"react-toastify\";\nimport \"react-toastify/dist/ReactToastify.css\";\nimport \"./toast.css\";\n\n// Re-export the full react-toastify imperative API so consumers get everything\n// (toast.success/error/..., toast.promise, toast.update, dismiss, etc.) from a\n// single design-system entry point.\nexport { toast } from \"react-toastify\";\nexport type {\n Id,\n Theme,\n ToastContent,\n ToastOptions,\n ToastPosition,\n TypeOptions,\n} from \"react-toastify\";\n\n/**\n * Maps each react-toastify toast type to the matching design-system icon.\n * Icons inherit the toast's text color via `--icon-color: currentColor`\n * (see toast.css), so they stay on-brand per variant. Returning `null` for\n * the `default` type hides the icon slot for plain toasts.\n */\nfunction dsToastIcon({ type }: RTIconProps): React.ReactNode {\n switch (type) {\n case \"success\":\n return <IconCheckCircle size=\"20\" />;\n case \"error\":\n return <IconXCircle size=\"20\" />;\n case \"warning\":\n return <IconAlertTriangle size=\"20\" />;\n case \"info\":\n return <IconInfo size=\"20\" />;\n default:\n return null;\n }\n}\n\nexport type ToastContainerProps = RTToastContainerProps;\n\n/**\n * Design-system-themed react-toastify container. Styling is applied by mapping\n * `--toastify-*` variables onto `--sds-*` tokens in toast.css (scoped to the\n * `.apipass-toast-container` class added here), so toasts read as the same\n * family as the `Notification` primitive.\n *\n * Mount this once inside your app/MFE root. For shadow-root micro-frontends,\n * mount it inside the federated module root (not the Angular Shell) so toasts\n * render inside the shadow tree where the injected design-system CSS applies.\n */\nexport function ToastContainer({\n className,\n position = \"top-right\",\n autoClose = 5000,\n theme = \"colored\",\n icon = dsToastIcon,\n ...props\n}: ToastContainerProps) {\n return (\n <RTToastContainer\n className={clsx(\n \"apipass-toast-container\",\n typeof className === \"string\" ? className : undefined,\n )}\n position={position}\n autoClose={autoClose}\n theme={theme}\n icon={icon}\n {...props}\n />\n );\n}\n"],"names":["dsToastIcon","type","jsx","IconCheckCircle","IconXCircle","IconAlertTriangle","IconInfo","ToastContainer","className","position","autoClose","theme","icon","props","RTToastContainer","clsx"],"mappings":"ifAkCA,SAASA,EAAY,CAAE,KAAAC,GAAsC,CAC3D,OAAQA,EAAA,CACN,IAAK,UACH,OAAOC,EAAAA,IAACC,EAAAA,gBAAA,CAAgB,KAAK,IAAA,CAAK,EACpC,IAAK,QACH,OAAOD,EAAAA,IAACE,EAAAA,YAAA,CAAY,KAAK,IAAA,CAAK,EAChC,IAAK,UACH,OAAOF,EAAAA,IAACG,EAAAA,kBAAA,CAAkB,KAAK,IAAA,CAAK,EACtC,IAAK,OACH,OAAOH,EAAAA,IAACI,EAAAA,SAAA,CAAS,KAAK,IAAA,CAAK,EAC7B,QACE,OAAO,IAAA,CAEb,CAcO,SAASC,EAAe,CAC7B,UAAAC,EACA,SAAAC,EAAW,YACX,UAAAC,EAAY,IACZ,MAAAC,EAAQ,UACR,KAAAC,EAAOZ,EACP,GAAGa,CACL,EAAwB,CACtB,OACEX,EAAAA,IAACY,EAAAA,eAAA,CACC,UAAWC,EAAAA,KACT,0BACA,OAAOP,GAAc,SAAWA,EAAY,MAAA,EAE9C,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,KAAAC,EACC,GAAGC,CAAA,CAAA,CAGV"}
1
+ {"version":3,"file":"Toast.cjs","sources":["../../../../../src/ui/primitives/Toast/Toast.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n IconAlertTriangle,\n IconCheckCircle,\n IconInfo,\n IconXCircle,\n} from \"icons\";\nimport {\n ToastContainer as RTToastContainer,\n type IconProps as RTIconProps,\n type ToastContainerProps as RTToastContainerProps,\n} from \"react-toastify\";\nimport \"react-toastify/dist/ReactToastify.css\";\nimport \"./toast.css\";\n\n// Re-export the full react-toastify imperative API so consumers get everything\n// (toast.success/error/..., toast.promise, toast.update, dismiss, etc.) from a\n// single design-system entry point.\n// eslint-disable-next-line react-refresh/only-export-components -- re-export de API imperativa, não é um componente\nexport { toast } from \"react-toastify\";\nexport type {\n Id,\n Theme,\n ToastContent,\n ToastOptions,\n ToastPosition,\n TypeOptions,\n} from \"react-toastify\";\n\n/**\n * Maps each react-toastify toast type to the matching design-system icon.\n * Icons inherit the toast's text color via `--icon-color: currentColor`\n * (see toast.css), so they stay on-brand per variant. Returning `null` for\n * the `default` type hides the icon slot for plain toasts.\n */\nfunction dsToastIcon({ type }: RTIconProps): React.ReactNode {\n switch (type) {\n case \"success\":\n return <IconCheckCircle size=\"20\" />;\n case \"error\":\n return <IconXCircle size=\"20\" />;\n case \"warning\":\n return <IconAlertTriangle size=\"20\" />;\n case \"info\":\n return <IconInfo size=\"20\" />;\n default:\n return null;\n }\n}\n\nexport type ToastContainerProps = RTToastContainerProps;\n\n/**\n * Design-system-themed react-toastify container. Styling is applied by mapping\n * `--toastify-*` variables onto `--sds-*` tokens in toast.css (scoped to the\n * `.apipass-toast-container` class added here), so toasts read as the same\n * family as the `Notification` primitive.\n *\n * Mount this once inside your app/MFE root. For shadow-root micro-frontends,\n * mount it inside the federated module root (not the Angular Shell) so toasts\n * render inside the shadow tree where the injected design-system CSS applies.\n */\nexport function ToastContainer({\n className,\n position = \"top-right\",\n autoClose = 5000,\n theme = \"colored\",\n icon = dsToastIcon,\n ...props\n}: ToastContainerProps) {\n return (\n <RTToastContainer\n className={clsx(\n \"apipass-toast-container\",\n typeof className === \"string\" ? className : undefined,\n )}\n position={position}\n autoClose={autoClose}\n theme={theme}\n icon={icon}\n {...props}\n />\n );\n}\n"],"names":["dsToastIcon","type","jsx","IconCheckCircle","IconXCircle","IconAlertTriangle","IconInfo","ToastContainer","className","position","autoClose","theme","icon","props","RTToastContainer","clsx"],"mappings":"ifAmCA,SAASA,EAAY,CAAE,KAAAC,GAAsC,CAC3D,OAAQA,EAAA,CACN,IAAK,UACH,OAAOC,EAAAA,IAACC,EAAAA,gBAAA,CAAgB,KAAK,IAAA,CAAK,EACpC,IAAK,QACH,OAAOD,EAAAA,IAACE,EAAAA,YAAA,CAAY,KAAK,IAAA,CAAK,EAChC,IAAK,UACH,OAAOF,EAAAA,IAACG,EAAAA,kBAAA,CAAkB,KAAK,IAAA,CAAK,EACtC,IAAK,OACH,OAAOH,EAAAA,IAACI,EAAAA,SAAA,CAAS,KAAK,IAAA,CAAK,EAC7B,QACE,OAAO,IAAA,CAEb,CAcO,SAASC,EAAe,CAC7B,UAAAC,EACA,SAAAC,EAAW,YACX,UAAAC,EAAY,IACZ,MAAAC,EAAQ,UACR,KAAAC,EAAOZ,EACP,GAAGa,CACL,EAAwB,CACtB,OACEX,EAAAA,IAACY,EAAAA,eAAA,CACC,UAAWC,EAAAA,KACT,0BACA,OAAOP,GAAc,SAAWA,EAAY,MAAA,EAE9C,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,KAAAC,EACC,GAAGC,CAAA,CAAA,CAGV"}
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.js","sources":["../../../../../src/ui/primitives/Toast/Toast.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n IconAlertTriangle,\n IconCheckCircle,\n IconInfo,\n IconXCircle,\n} from \"icons\";\nimport {\n ToastContainer as RTToastContainer,\n type IconProps as RTIconProps,\n type ToastContainerProps as RTToastContainerProps,\n} from \"react-toastify\";\nimport \"react-toastify/dist/ReactToastify.css\";\nimport \"./toast.css\";\n\n// Re-export the full react-toastify imperative API so consumers get everything\n// (toast.success/error/..., toast.promise, toast.update, dismiss, etc.) from a\n// single design-system entry point.\nexport { toast } from \"react-toastify\";\nexport type {\n Id,\n Theme,\n ToastContent,\n ToastOptions,\n ToastPosition,\n TypeOptions,\n} from \"react-toastify\";\n\n/**\n * Maps each react-toastify toast type to the matching design-system icon.\n * Icons inherit the toast's text color via `--icon-color: currentColor`\n * (see toast.css), so they stay on-brand per variant. Returning `null` for\n * the `default` type hides the icon slot for plain toasts.\n */\nfunction dsToastIcon({ type }: RTIconProps): React.ReactNode {\n switch (type) {\n case \"success\":\n return <IconCheckCircle size=\"20\" />;\n case \"error\":\n return <IconXCircle size=\"20\" />;\n case \"warning\":\n return <IconAlertTriangle size=\"20\" />;\n case \"info\":\n return <IconInfo size=\"20\" />;\n default:\n return null;\n }\n}\n\nexport type ToastContainerProps = RTToastContainerProps;\n\n/**\n * Design-system-themed react-toastify container. Styling is applied by mapping\n * `--toastify-*` variables onto `--sds-*` tokens in toast.css (scoped to the\n * `.apipass-toast-container` class added here), so toasts read as the same\n * family as the `Notification` primitive.\n *\n * Mount this once inside your app/MFE root. For shadow-root micro-frontends,\n * mount it inside the federated module root (not the Angular Shell) so toasts\n * render inside the shadow tree where the injected design-system CSS applies.\n */\nexport function ToastContainer({\n className,\n position = \"top-right\",\n autoClose = 5000,\n theme = \"colored\",\n icon = dsToastIcon,\n ...props\n}: ToastContainerProps) {\n return (\n <RTToastContainer\n className={clsx(\n \"apipass-toast-container\",\n typeof className === \"string\" ? className : undefined,\n )}\n position={position}\n autoClose={autoClose}\n theme={theme}\n icon={icon}\n {...props}\n />\n );\n}\n"],"names":["dsToastIcon","type","jsx","IconCheckCircle","IconXCircle","IconAlertTriangle","IconInfo","ToastContainer","className","position","autoClose","theme","icon","props","RTToastContainer","clsx"],"mappings":";;;;;;;;;;AAkCA,SAASA,EAAY,EAAE,MAAAC,KAAsC;AAC3D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO,gBAAAC,EAACC,GAAA,EAAgB,MAAK,KAAA,CAAK;AAAA,IACpC,KAAK;AACH,aAAO,gBAAAD,EAACE,GAAA,EAAY,MAAK,KAAA,CAAK;AAAA,IAChC,KAAK;AACH,aAAO,gBAAAF,EAACG,GAAA,EAAkB,MAAK,KAAA,CAAK;AAAA,IACtC,KAAK;AACH,aAAO,gBAAAH,EAACI,GAAA,EAAS,MAAK,KAAA,CAAK;AAAA,IAC7B;AACE,aAAO;AAAA,EAAA;AAEb;AAcO,SAASC,EAAe;AAAA,EAC7B,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAOZ;AAAA,EACP,GAAGa;AACL,GAAwB;AACtB,SACE,gBAAAX;AAAA,IAACY;AAAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA,OAAOP,KAAc,WAAWA,IAAY;AAAA,MAAA;AAAA,MAE9C,UAAAC;AAAA,MACA,WAAAC;AAAA,MACA,OAAAC;AAAA,MACA,MAAAC;AAAA,MACC,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;"}
1
+ {"version":3,"file":"Toast.js","sources":["../../../../../src/ui/primitives/Toast/Toast.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n IconAlertTriangle,\n IconCheckCircle,\n IconInfo,\n IconXCircle,\n} from \"icons\";\nimport {\n ToastContainer as RTToastContainer,\n type IconProps as RTIconProps,\n type ToastContainerProps as RTToastContainerProps,\n} from \"react-toastify\";\nimport \"react-toastify/dist/ReactToastify.css\";\nimport \"./toast.css\";\n\n// Re-export the full react-toastify imperative API so consumers get everything\n// (toast.success/error/..., toast.promise, toast.update, dismiss, etc.) from a\n// single design-system entry point.\n// eslint-disable-next-line react-refresh/only-export-components -- re-export de API imperativa, não é um componente\nexport { toast } from \"react-toastify\";\nexport type {\n Id,\n Theme,\n ToastContent,\n ToastOptions,\n ToastPosition,\n TypeOptions,\n} from \"react-toastify\";\n\n/**\n * Maps each react-toastify toast type to the matching design-system icon.\n * Icons inherit the toast's text color via `--icon-color: currentColor`\n * (see toast.css), so they stay on-brand per variant. Returning `null` for\n * the `default` type hides the icon slot for plain toasts.\n */\nfunction dsToastIcon({ type }: RTIconProps): React.ReactNode {\n switch (type) {\n case \"success\":\n return <IconCheckCircle size=\"20\" />;\n case \"error\":\n return <IconXCircle size=\"20\" />;\n case \"warning\":\n return <IconAlertTriangle size=\"20\" />;\n case \"info\":\n return <IconInfo size=\"20\" />;\n default:\n return null;\n }\n}\n\nexport type ToastContainerProps = RTToastContainerProps;\n\n/**\n * Design-system-themed react-toastify container. Styling is applied by mapping\n * `--toastify-*` variables onto `--sds-*` tokens in toast.css (scoped to the\n * `.apipass-toast-container` class added here), so toasts read as the same\n * family as the `Notification` primitive.\n *\n * Mount this once inside your app/MFE root. For shadow-root micro-frontends,\n * mount it inside the federated module root (not the Angular Shell) so toasts\n * render inside the shadow tree where the injected design-system CSS applies.\n */\nexport function ToastContainer({\n className,\n position = \"top-right\",\n autoClose = 5000,\n theme = \"colored\",\n icon = dsToastIcon,\n ...props\n}: ToastContainerProps) {\n return (\n <RTToastContainer\n className={clsx(\n \"apipass-toast-container\",\n typeof className === \"string\" ? className : undefined,\n )}\n position={position}\n autoClose={autoClose}\n theme={theme}\n icon={icon}\n {...props}\n />\n );\n}\n"],"names":["dsToastIcon","type","jsx","IconCheckCircle","IconXCircle","IconAlertTriangle","IconInfo","ToastContainer","className","position","autoClose","theme","icon","props","RTToastContainer","clsx"],"mappings":";;;;;;;;;;AAmCA,SAASA,EAAY,EAAE,MAAAC,KAAsC;AAC3D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO,gBAAAC,EAACC,GAAA,EAAgB,MAAK,KAAA,CAAK;AAAA,IACpC,KAAK;AACH,aAAO,gBAAAD,EAACE,GAAA,EAAY,MAAK,KAAA,CAAK;AAAA,IAChC,KAAK;AACH,aAAO,gBAAAF,EAACG,GAAA,EAAkB,MAAK,KAAA,CAAK;AAAA,IACtC,KAAK;AACH,aAAO,gBAAAH,EAACI,GAAA,EAAS,MAAK,KAAA,CAAK;AAAA,IAC7B;AACE,aAAO;AAAA,EAAA;AAEb;AAcO,SAASC,EAAe;AAAA,EAC7B,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAOZ;AAAA,EACP,GAAGa;AACL,GAAwB;AACtB,SACE,gBAAAX;AAAA,IAACY;AAAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA,OAAOP,KAAc,WAAWA,IAAY;AAAA,MAAA;AAAA,MAE9C,UAAAC;AAAA,MACA,WAAAC;AAAA,MACA,OAAAC;AAAA,MACA,MAAAC;AAAA,MACC,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;"}
@@ -0,0 +1,2 @@
1
+ export * from "./ui/components/charts/chart-palette";
2
+ export * from "./ui/components/charts/TimeSeriesChart/TimeSeriesChart";
@@ -1,7 +1,6 @@
1
1
  export * from "./Breadcrumb/Breadcrumb";
2
2
  export * from "./Card/Card";
3
3
  export * from "./charts/chart-palette";
4
- export * from "./charts/TimeSeriesChart/TimeSeriesChart";
5
4
  export * from "./ConfirmDialog/ConfirmDialog";
6
5
  export * from "./DataTable/DataTable";
7
6
  export * from "./FormModal/FormModal";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apipass/design-system",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "description": "APIPass React Design System",
6
6
  "sideEffects": [
@@ -21,6 +21,11 @@
21
21
  "import": "./dist/lib/lib.index.js",
22
22
  "require": "./dist/lib/lib.index.cjs"
23
23
  },
24
+ "./charts": {
25
+ "types": "./dist/types/charts.index.d.ts",
26
+ "import": "./dist/lib/charts.index.js",
27
+ "require": "./dist/lib/charts.index.cjs"
28
+ },
24
29
  "./style.css": "./dist/lib/style.css",
25
30
  "./embedded-styles": {
26
31
  "types": "./dist/lib/embedded-styles.d.ts",
@@ -37,6 +42,7 @@
37
42
  "app:build": "tsc && vite build",
38
43
  "app:lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
39
44
  "app:preview": "vite preview",
45
+ "storybook:install": "npm ci",
40
46
  "storybook": "storybook dev -p 6006 --no-open",
41
47
  "storybook:build": "storybook build --output-dir dist/storybook",
42
48
  "build": "npm run app:build; npm run storybook:build",