@apipass/design-system 1.24.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.
- package/README.md +1 -1
- package/dist/lib/charts.index.cjs +2 -0
- package/dist/lib/charts.index.cjs.map +1 -0
- package/dist/lib/charts.index.js +7 -0
- package/dist/lib/charts.index.js.map +1 -0
- package/dist/lib/embedded-styles.js +1 -1
- package/dist/lib/lib.index.cjs +1 -1
- package/dist/lib/lib.index.js +735 -731
- package/dist/lib/lib.index.js.map +1 -1
- package/dist/lib/style.css +1 -1
- package/dist/lib/ui/components/DataTable/DataTable.cjs.map +1 -1
- package/dist/lib/ui/components/DataTable/DataTable.js.map +1 -1
- package/dist/lib/ui/components/KeyValue/KeyValue.cjs +2 -0
- package/dist/lib/ui/components/KeyValue/KeyValue.cjs.map +1 -0
- package/dist/lib/ui/components/KeyValue/KeyValue.js +77 -0
- package/dist/lib/ui/components/KeyValue/KeyValue.js.map +1 -0
- package/dist/lib/ui/layout/Section/Section.cjs +1 -1
- package/dist/lib/ui/layout/Section/Section.cjs.map +1 -1
- package/dist/lib/ui/layout/Section/Section.js.map +1 -1
- package/dist/lib/ui/primitives/Fieldset/Fieldset.cjs.map +1 -1
- package/dist/lib/ui/primitives/Fieldset/Fieldset.js.map +1 -1
- package/dist/lib/ui/primitives/Navigation/Navigation.cjs +1 -1
- package/dist/lib/ui/primitives/Navigation/Navigation.cjs.map +1 -1
- package/dist/lib/ui/primitives/Navigation/Navigation.js +20 -36
- package/dist/lib/ui/primitives/Navigation/Navigation.js.map +1 -1
- package/dist/lib/ui/primitives/NavigationPill/NavigationPill.cjs +2 -0
- package/dist/lib/ui/primitives/NavigationPill/NavigationPill.cjs.map +1 -0
- package/dist/lib/ui/primitives/NavigationPill/NavigationPill.js +33 -0
- package/dist/lib/ui/primitives/NavigationPill/NavigationPill.js.map +1 -0
- package/dist/lib/ui/primitives/Pagination/Pagination.cjs.map +1 -1
- package/dist/lib/ui/primitives/Pagination/Pagination.js.map +1 -1
- package/dist/lib/ui/primitives/Tab/Tab.cjs +1 -1
- package/dist/lib/ui/primitives/Tab/Tab.cjs.map +1 -1
- package/dist/lib/ui/primitives/Tab/Tab.js +39 -21
- package/dist/lib/ui/primitives/Tab/Tab.js.map +1 -1
- package/dist/lib/ui/primitives/Toast/Toast.cjs.map +1 -1
- package/dist/lib/ui/primitives/Toast/Toast.js.map +1 -1
- package/dist/types/charts.index.d.ts +2 -0
- package/dist/types/ui/components/KeyValue/KeyValue.d.ts +16 -0
- package/dist/types/ui/components/index.d.ts +1 -1
- package/dist/types/ui/primitives/Navigation/Navigation.d.ts +0 -4
- package/dist/types/ui/primitives/NavigationPill/NavigationPill.d.ts +10 -0
- package/dist/types/ui/primitives/Tab/Tab.d.ts +7 -3
- package/dist/types/ui/primitives/index.d.ts +1 -0
- package/package.json +7 -1
|
@@ -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":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable.cjs","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import {\n Pagination,\n PermissionGate,\n Search,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport \"./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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),I=require("../../../vendor/clsx/dist/clsx.cjs");;/* empty css */const f=require("../../icons/IconPlus.cjs"),q=require("../../icons/IconTrash.cjs"),v=require("../../primitives/Input/Input.cjs"),d=require("../../primitives/IconButton/IconButton.cjs");function w({pairs:r,onChange:t,keyPlaceholder:o,valuePlaceholder:c,addRowButtonLabel:j,removeRowButtonLabel:m,isDisabled:u,className:h}){function i(n,l){t(r.map((s,a)=>a===n?{...s,...l}:s))}function x(){t([...r,{key:"",value:""}])}function y(n){t(r.filter((l,s)=>s!==n))}return e.jsx("div",{className:I.clsx(h,"key-value-group"),children:r.map((n,l)=>{const s=l===r.length-1;return e.jsxs("div",{className:"key-value-row",children:[e.jsx("div",{className:"key-value-row-field",children:e.jsx(v.InputField,{"aria-label":o,placeholder:o,value:n.key,isDisabled:u,onChange:a=>i(l,{key:a})})}),e.jsx("div",{className:"key-value-row-field",children:e.jsx(v.InputField,{"aria-label":c,placeholder:c,value:n.value,isDisabled:u,onChange:a=>i(l,{value:a})})}),e.jsx("div",{className:"key-value-row-action",children:s?e.jsx(d.IconButton,{"aria-label":j,variant:"subtle",size:"small",isDisabled:u,onPress:x,children:e.jsx(f.IconPlus,{size:"16"})}):e.jsx(d.IconButton,{"aria-label":m,variant:"subtle",size:"small",isDisabled:u,onPress:()=>y(l),children:e.jsx(q.IconTrash,{size:"16"})})})]},l)})})}exports.KeyValue=w;
|
|
2
|
+
//# sourceMappingURL=KeyValue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyValue.cjs","sources":["../../../../../src/ui/components/KeyValue/KeyValue.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { IconPlus, IconTrash } from \"icons\";\nimport { IconButton, InputField } from \"primitives\";\nimport \"./keyValue.css\";\n\nexport type KeyValuePair = {\n key: string;\n value: string;\n};\n\nexport type KeyValueProps = {\n pairs: KeyValuePair[];\n onChange: (pairs: KeyValuePair[]) => void;\n keyPlaceholder: string;\n valuePlaceholder: string;\n addRowButtonLabel: string;\n removeRowButtonLabel: string;\n isDisabled?: boolean;\n className?: string;\n};\n\nexport function KeyValue({\n pairs,\n onChange,\n keyPlaceholder,\n valuePlaceholder,\n addRowButtonLabel,\n removeRowButtonLabel,\n isDisabled,\n className,\n}: KeyValueProps) {\n function updatePair(index: number, patch: Partial<KeyValuePair>) {\n onChange(pairs.map((pair, i) => (i === index ? { ...pair, ...patch } : pair)));\n }\n\n function addRow() {\n onChange([...pairs, { key: \"\", value: \"\" }]);\n }\n\n function removeRow(index: number) {\n onChange(pairs.filter((_, i) => i !== index));\n }\n\n return (\n <div className={clsx(className, \"key-value-group\")}>\n {pairs.map((pair, index) => {\n const isLastRow = index === pairs.length - 1;\n return (\n <div className=\"key-value-row\" key={index}>\n <div className=\"key-value-row-field\">\n <InputField\n aria-label={keyPlaceholder}\n placeholder={keyPlaceholder}\n value={pair.key}\n isDisabled={isDisabled}\n onChange={(key) => updatePair(index, { key })}\n />\n </div>\n <div className=\"key-value-row-field\">\n <InputField\n aria-label={valuePlaceholder}\n placeholder={valuePlaceholder}\n value={pair.value}\n isDisabled={isDisabled}\n onChange={(value) => updatePair(index, { value })}\n />\n </div>\n <div className=\"key-value-row-action\">\n {isLastRow ? (\n <IconButton\n aria-label={addRowButtonLabel}\n variant=\"subtle\"\n size=\"small\"\n isDisabled={isDisabled}\n onPress={addRow}\n >\n <IconPlus size=\"16\" />\n </IconButton>\n ) : (\n <IconButton\n aria-label={removeRowButtonLabel}\n variant=\"subtle\"\n size=\"small\"\n isDisabled={isDisabled}\n onPress={() => removeRow(index)}\n >\n <IconTrash size=\"16\" />\n </IconButton>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["KeyValue","pairs","onChange","keyPlaceholder","valuePlaceholder","addRowButtonLabel","removeRowButtonLabel","isDisabled","className","updatePair","index","patch","pair","i","addRow","removeRow","_","jsx","clsx","isLastRow","jsxs","InputField","key","value","IconButton","IconPlus","IconTrash"],"mappings":"4XAqBO,SAASA,EAAS,CACvB,MAAAC,EACA,SAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,WAAAC,EACA,UAAAC,CACF,EAAkB,CAChB,SAASC,EAAWC,EAAeC,EAA8B,CAC/DT,EAASD,EAAM,IAAI,CAACW,EAAMC,IAAOA,IAAMH,EAAQ,CAAE,GAAGE,EAAM,GAAGD,CAAA,EAAUC,CAAK,CAAC,CAC/E,CAEA,SAASE,GAAS,CAChBZ,EAAS,CAAC,GAAGD,EAAO,CAAE,IAAK,GAAI,MAAO,EAAA,CAAI,CAAC,CAC7C,CAEA,SAASc,EAAUL,EAAe,CAChCR,EAASD,EAAM,OAAO,CAACe,EAAGH,IAAMA,IAAMH,CAAK,CAAC,CAC9C,CAEA,OACEO,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,KAAKV,EAAW,iBAAiB,EAC9C,SAAAP,EAAM,IAAI,CAACW,EAAMF,IAAU,CAC1B,MAAMS,EAAYT,IAAUT,EAAM,OAAS,EAC3C,OACEmB,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAH,EAAAA,IAAC,MAAA,CAAI,UAAU,sBACb,SAAAA,EAAAA,IAACI,EAAAA,WAAA,CACC,aAAYlB,EACZ,YAAaA,EACb,MAAOS,EAAK,IACZ,WAAAL,EACA,SAAWe,GAAQb,EAAWC,EAAO,CAAE,IAAAY,EAAK,CAAA,CAAA,EAEhD,EACAL,EAAAA,IAAC,MAAA,CAAI,UAAU,sBACb,SAAAA,EAAAA,IAACI,EAAAA,WAAA,CACC,aAAYjB,EACZ,YAAaA,EACb,MAAOQ,EAAK,MACZ,WAAAL,EACA,SAAWgB,GAAUd,EAAWC,EAAO,CAAE,MAAAa,EAAO,CAAA,CAAA,EAEpD,EACAN,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACZ,SAAAE,EACCF,EAAAA,IAACO,EAAAA,WAAA,CACC,aAAYnB,EACZ,QAAQ,SACR,KAAK,QACL,WAAAE,EACA,QAASO,EAET,SAAAG,EAAAA,IAACQ,EAAAA,SAAA,CAAS,KAAK,IAAA,CAAK,CAAA,CAAA,EAGtBR,EAAAA,IAACO,EAAAA,WAAA,CACC,aAAYlB,EACZ,QAAQ,SACR,KAAK,QACL,WAAAC,EACA,QAAS,IAAMQ,EAAUL,CAAK,EAE9B,SAAAO,EAAAA,IAACS,EAAAA,UAAA,CAAU,KAAK,IAAA,CAAK,CAAA,CAAA,CACvB,CAEJ,CAAA,CAAA,EAzCkChB,CA0CpC,CAEJ,CAAC,CAAA,CACH,CAEJ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx as e, jsxs as y } from "react/jsx-runtime";
|
|
2
|
+
import { clsx as k } from "../../../vendor/clsx/dist/clsx.js";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { IconPlus as N } from "../../icons/IconPlus.js";
|
|
5
|
+
import { IconTrash as z } from "../../icons/IconTrash.js";
|
|
6
|
+
import { InputField as s } from "../../primitives/Input/Input.js";
|
|
7
|
+
import { IconButton as v } from "../../primitives/IconButton/IconButton.js";
|
|
8
|
+
function F({
|
|
9
|
+
pairs: o,
|
|
10
|
+
onChange: i,
|
|
11
|
+
keyPlaceholder: m,
|
|
12
|
+
valuePlaceholder: c,
|
|
13
|
+
addRowButtonLabel: f,
|
|
14
|
+
removeRowButtonLabel: d,
|
|
15
|
+
isDisabled: n,
|
|
16
|
+
className: h
|
|
17
|
+
}) {
|
|
18
|
+
function u(a, l) {
|
|
19
|
+
i(o.map((r, t) => t === a ? { ...r, ...l } : r));
|
|
20
|
+
}
|
|
21
|
+
function p() {
|
|
22
|
+
i([...o, { key: "", value: "" }]);
|
|
23
|
+
}
|
|
24
|
+
function w(a) {
|
|
25
|
+
i(o.filter((l, r) => r !== a));
|
|
26
|
+
}
|
|
27
|
+
return /* @__PURE__ */ e("div", { className: k(h, "key-value-group"), children: o.map((a, l) => {
|
|
28
|
+
const r = l === o.length - 1;
|
|
29
|
+
return /* @__PURE__ */ y("div", { className: "key-value-row", children: [
|
|
30
|
+
/* @__PURE__ */ e("div", { className: "key-value-row-field", children: /* @__PURE__ */ e(
|
|
31
|
+
s,
|
|
32
|
+
{
|
|
33
|
+
"aria-label": m,
|
|
34
|
+
placeholder: m,
|
|
35
|
+
value: a.key,
|
|
36
|
+
isDisabled: n,
|
|
37
|
+
onChange: (t) => u(l, { key: t })
|
|
38
|
+
}
|
|
39
|
+
) }),
|
|
40
|
+
/* @__PURE__ */ e("div", { className: "key-value-row-field", children: /* @__PURE__ */ e(
|
|
41
|
+
s,
|
|
42
|
+
{
|
|
43
|
+
"aria-label": c,
|
|
44
|
+
placeholder: c,
|
|
45
|
+
value: a.value,
|
|
46
|
+
isDisabled: n,
|
|
47
|
+
onChange: (t) => u(l, { value: t })
|
|
48
|
+
}
|
|
49
|
+
) }),
|
|
50
|
+
/* @__PURE__ */ e("div", { className: "key-value-row-action", children: r ? /* @__PURE__ */ e(
|
|
51
|
+
v,
|
|
52
|
+
{
|
|
53
|
+
"aria-label": f,
|
|
54
|
+
variant: "subtle",
|
|
55
|
+
size: "small",
|
|
56
|
+
isDisabled: n,
|
|
57
|
+
onPress: p,
|
|
58
|
+
children: /* @__PURE__ */ e(N, { size: "16" })
|
|
59
|
+
}
|
|
60
|
+
) : /* @__PURE__ */ e(
|
|
61
|
+
v,
|
|
62
|
+
{
|
|
63
|
+
"aria-label": d,
|
|
64
|
+
variant: "subtle",
|
|
65
|
+
size: "small",
|
|
66
|
+
isDisabled: n,
|
|
67
|
+
onPress: () => w(l),
|
|
68
|
+
children: /* @__PURE__ */ e(z, { size: "16" })
|
|
69
|
+
}
|
|
70
|
+
) })
|
|
71
|
+
] }, l);
|
|
72
|
+
}) });
|
|
73
|
+
}
|
|
74
|
+
export {
|
|
75
|
+
F as KeyValue
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=KeyValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyValue.js","sources":["../../../../../src/ui/components/KeyValue/KeyValue.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { IconPlus, IconTrash } from \"icons\";\nimport { IconButton, InputField } from \"primitives\";\nimport \"./keyValue.css\";\n\nexport type KeyValuePair = {\n key: string;\n value: string;\n};\n\nexport type KeyValueProps = {\n pairs: KeyValuePair[];\n onChange: (pairs: KeyValuePair[]) => void;\n keyPlaceholder: string;\n valuePlaceholder: string;\n addRowButtonLabel: string;\n removeRowButtonLabel: string;\n isDisabled?: boolean;\n className?: string;\n};\n\nexport function KeyValue({\n pairs,\n onChange,\n keyPlaceholder,\n valuePlaceholder,\n addRowButtonLabel,\n removeRowButtonLabel,\n isDisabled,\n className,\n}: KeyValueProps) {\n function updatePair(index: number, patch: Partial<KeyValuePair>) {\n onChange(pairs.map((pair, i) => (i === index ? { ...pair, ...patch } : pair)));\n }\n\n function addRow() {\n onChange([...pairs, { key: \"\", value: \"\" }]);\n }\n\n function removeRow(index: number) {\n onChange(pairs.filter((_, i) => i !== index));\n }\n\n return (\n <div className={clsx(className, \"key-value-group\")}>\n {pairs.map((pair, index) => {\n const isLastRow = index === pairs.length - 1;\n return (\n <div className=\"key-value-row\" key={index}>\n <div className=\"key-value-row-field\">\n <InputField\n aria-label={keyPlaceholder}\n placeholder={keyPlaceholder}\n value={pair.key}\n isDisabled={isDisabled}\n onChange={(key) => updatePair(index, { key })}\n />\n </div>\n <div className=\"key-value-row-field\">\n <InputField\n aria-label={valuePlaceholder}\n placeholder={valuePlaceholder}\n value={pair.value}\n isDisabled={isDisabled}\n onChange={(value) => updatePair(index, { value })}\n />\n </div>\n <div className=\"key-value-row-action\">\n {isLastRow ? (\n <IconButton\n aria-label={addRowButtonLabel}\n variant=\"subtle\"\n size=\"small\"\n isDisabled={isDisabled}\n onPress={addRow}\n >\n <IconPlus size=\"16\" />\n </IconButton>\n ) : (\n <IconButton\n aria-label={removeRowButtonLabel}\n variant=\"subtle\"\n size=\"small\"\n isDisabled={isDisabled}\n onPress={() => removeRow(index)}\n >\n <IconTrash size=\"16\" />\n </IconButton>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["KeyValue","pairs","onChange","keyPlaceholder","valuePlaceholder","addRowButtonLabel","removeRowButtonLabel","isDisabled","className","updatePair","index","patch","pair","i","addRow","removeRow","_","jsx","clsx","isLastRow","jsxs","InputField","key","value","IconButton","IconPlus","IconTrash"],"mappings":";;;;;;;AAqBO,SAASA,EAAS;AAAA,EACvB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AACF,GAAkB;AAChB,WAASC,EAAWC,GAAeC,GAA8B;AAC/D,IAAAT,EAASD,EAAM,IAAI,CAACW,GAAMC,MAAOA,MAAMH,IAAQ,EAAE,GAAGE,GAAM,GAAGD,EAAA,IAAUC,CAAK,CAAC;AAAA,EAC/E;AAEA,WAASE,IAAS;AAChB,IAAAZ,EAAS,CAAC,GAAGD,GAAO,EAAE,KAAK,IAAI,OAAO,GAAA,CAAI,CAAC;AAAA,EAC7C;AAEA,WAASc,EAAUL,GAAe;AAChC,IAAAR,EAASD,EAAM,OAAO,CAACe,GAAGH,MAAMA,MAAMH,CAAK,CAAC;AAAA,EAC9C;AAEA,SACE,gBAAAO,EAAC,OAAA,EAAI,WAAWC,EAAKV,GAAW,iBAAiB,GAC9C,UAAAP,EAAM,IAAI,CAACW,GAAMF,MAAU;AAC1B,UAAMS,IAAYT,MAAUT,EAAM,SAAS;AAC3C,WACE,gBAAAmB,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,MAAA,gBAAAH,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA,gBAAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,cAAYlB;AAAA,UACZ,aAAaA;AAAA,UACb,OAAOS,EAAK;AAAA,UACZ,YAAAL;AAAA,UACA,UAAU,CAACe,MAAQb,EAAWC,GAAO,EAAE,KAAAY,GAAK;AAAA,QAAA;AAAA,MAAA,GAEhD;AAAA,MACA,gBAAAL,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA,gBAAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,cAAYjB;AAAA,UACZ,aAAaA;AAAA,UACb,OAAOQ,EAAK;AAAA,UACZ,YAAAL;AAAA,UACA,UAAU,CAACgB,MAAUd,EAAWC,GAAO,EAAE,OAAAa,GAAO;AAAA,QAAA;AAAA,MAAA,GAEpD;AAAA,MACA,gBAAAN,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAAE,IACC,gBAAAF;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,cAAYnB;AAAA,UACZ,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,YAAAE;AAAA,UACA,SAASO;AAAA,UAET,UAAA,gBAAAG,EAACQ,GAAA,EAAS,MAAK,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA,IAGtB,gBAAAR;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,cAAYlB;AAAA,UACZ,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,YAAAC;AAAA,UACA,SAAS,MAAMQ,EAAUL,CAAK;AAAA,UAE9B,UAAA,gBAAAO,EAACS,GAAA,EAAU,MAAK,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA,EACvB,CAEJ;AAAA,IAAA,EAAA,GAzCkChB,CA0CpC;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -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,
|
|
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","
|
|
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","
|
|
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,
|
|
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;
|
|
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,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),e=require("../../../vendor/clsx/dist/clsx.cjs");;/* empty css */const l=require("../../utils/AnchorOrButton.cjs");function v({className:t,direction:n="row",...i}){const o=e.clsx(t,"navigation",`navigation-direction-${n}`);return a.jsx("nav",{className:o,...i})}function g({children:t,className:n,isSelected:i,icon:o,direction:s="column",size:r="medium",...c}){const u=e.clsx(n,"navigation-button",`navigation-button-direction-${s}`,`navigation-button-size-${r}`);return a.jsxs(l.AnchorOrButton,{"data-selected":i||void 0,className:u,...c,children:[o,t]})}exports.Navigation=v;exports.NavigationButton=g;
|
|
2
2
|
//# sourceMappingURL=Navigation.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Navigation.cjs","sources":["../../../../../src/ui/primitives/Navigation/Navigation.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AnchorOrButton, AnchorOrButtonProps } from \"utils\";\nimport \"./navigation.css\";\n\nexport type NavigationProps = ComponentPropsWithoutRef<\"nav\"> & {\n direction?: \"column\" | \"row\";\n};\nexport function Navigation({\n className,\n direction = \"row\",\n ...props\n}: NavigationProps) {\n const classNames = clsx(\n className,\n \"navigation\",\n `navigation-direction-${direction}`,\n );\n return <nav className={classNames} {...props} />;\n}\n\nexport type
|
|
1
|
+
{"version":3,"file":"Navigation.cjs","sources":["../../../../../src/ui/primitives/Navigation/Navigation.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AnchorOrButton, AnchorOrButtonProps } from \"utils\";\nimport \"./navigation.css\";\n\nexport type NavigationProps = ComponentPropsWithoutRef<\"nav\"> & {\n direction?: \"column\" | \"row\";\n};\nexport function Navigation({\n className,\n direction = \"row\",\n ...props\n}: NavigationProps) {\n const classNames = clsx(\n className,\n \"navigation\",\n `navigation-direction-${direction}`,\n );\n return <nav className={classNames} {...props} />;\n}\n\nexport type NavigationButtonProps = AnchorOrButtonProps & {\n isSelected?: boolean;\n icon?: ReactNode;\n size?: \"small\" | \"medium\";\n direction?: \"column\" | \"row\";\n};\nexport function NavigationButton({\n children,\n className,\n isSelected,\n icon,\n direction = \"column\",\n size = \"medium\",\n ...props\n}: NavigationButtonProps) {\n const classNames = clsx(\n className,\n \"navigation-button\",\n `navigation-button-direction-${direction}`,\n `navigation-button-size-${size}`,\n );\n return (\n <AnchorOrButton\n data-selected={isSelected || undefined}\n className={classNames}\n {...props}\n >\n {icon}\n {children}\n </AnchorOrButton>\n );\n}\n"],"names":["Navigation","className","direction","props","classNames","clsx","jsx","NavigationButton","children","isSelected","icon","size","jsxs","AnchorOrButton"],"mappings":"uPAQO,SAASA,EAAW,CACzB,UAAAC,EACA,UAAAC,EAAY,MACZ,GAAGC,CACL,EAAoB,CAClB,MAAMC,EAAaC,EAAAA,KACjBJ,EACA,aACA,wBAAwBC,CAAS,EAAA,EAEnC,OAAOI,EAAAA,IAAC,MAAA,CAAI,UAAWF,EAAa,GAAGD,EAAO,CAChD,CAQO,SAASI,EAAiB,CAC/B,SAAAC,EACA,UAAAP,EACA,WAAAQ,EACA,KAAAC,EACA,UAAAR,EAAY,SACZ,KAAAS,EAAO,SACP,GAAGR,CACL,EAA0B,CACxB,MAAMC,EAAaC,EAAAA,KACjBJ,EACA,oBACA,+BAA+BC,CAAS,GACxC,0BAA0BS,CAAI,EAAA,EAEhC,OACEC,EAAAA,KAACC,EAAAA,eAAA,CACC,gBAAeJ,GAAc,OAC7B,UAAWL,EACV,GAAGD,EAEH,SAAA,CAAAO,EACAF,CAAA,CAAA,CAAA,CAGP"}
|
|
@@ -1,57 +1,42 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { clsx as
|
|
1
|
+
import { jsx as m, jsxs as u } from "react/jsx-runtime";
|
|
2
|
+
import { clsx as a } from "../../../vendor/clsx/dist/clsx.js";
|
|
3
3
|
/* empty css */
|
|
4
|
-
import { AnchorOrButton as
|
|
4
|
+
import { AnchorOrButton as v } from "../../utils/AnchorOrButton.js";
|
|
5
5
|
function f({
|
|
6
6
|
className: t,
|
|
7
7
|
direction: n = "row",
|
|
8
|
-
...
|
|
8
|
+
...o
|
|
9
9
|
}) {
|
|
10
|
-
const
|
|
10
|
+
const i = a(
|
|
11
11
|
t,
|
|
12
12
|
"navigation",
|
|
13
13
|
`navigation-direction-${n}`
|
|
14
14
|
);
|
|
15
|
-
return /* @__PURE__ */
|
|
15
|
+
return /* @__PURE__ */ m("nav", { className: i, ...o });
|
|
16
16
|
}
|
|
17
17
|
function p({
|
|
18
|
-
className: t,
|
|
19
|
-
isSelected: n,
|
|
20
|
-
...i
|
|
21
|
-
}) {
|
|
22
|
-
const a = o(t, "navigation-pill");
|
|
23
|
-
return /* @__PURE__ */ s(
|
|
24
|
-
e,
|
|
25
|
-
{
|
|
26
|
-
"data-selected": n || void 0,
|
|
27
|
-
className: a,
|
|
28
|
-
...i
|
|
29
|
-
}
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
function x({
|
|
33
18
|
children: t,
|
|
34
19
|
className: n,
|
|
35
|
-
isSelected:
|
|
36
|
-
icon:
|
|
37
|
-
direction:
|
|
38
|
-
size:
|
|
39
|
-
...
|
|
20
|
+
isSelected: o,
|
|
21
|
+
icon: i,
|
|
22
|
+
direction: r = "column",
|
|
23
|
+
size: s = "medium",
|
|
24
|
+
...c
|
|
40
25
|
}) {
|
|
41
|
-
const
|
|
26
|
+
const e = a(
|
|
42
27
|
n,
|
|
43
28
|
"navigation-button",
|
|
44
|
-
`navigation-button-direction-${
|
|
45
|
-
`navigation-button-size-${
|
|
29
|
+
`navigation-button-direction-${r}`,
|
|
30
|
+
`navigation-button-size-${s}`
|
|
46
31
|
);
|
|
47
32
|
return /* @__PURE__ */ u(
|
|
48
|
-
|
|
33
|
+
v,
|
|
49
34
|
{
|
|
50
|
-
"data-selected":
|
|
51
|
-
className:
|
|
52
|
-
...
|
|
35
|
+
"data-selected": o || void 0,
|
|
36
|
+
className: e,
|
|
37
|
+
...c,
|
|
53
38
|
children: [
|
|
54
|
-
|
|
39
|
+
i,
|
|
55
40
|
t
|
|
56
41
|
]
|
|
57
42
|
}
|
|
@@ -59,7 +44,6 @@ function x({
|
|
|
59
44
|
}
|
|
60
45
|
export {
|
|
61
46
|
f as Navigation,
|
|
62
|
-
|
|
63
|
-
p as NavigationPill
|
|
47
|
+
p as NavigationButton
|
|
64
48
|
};
|
|
65
49
|
//# sourceMappingURL=Navigation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Navigation.js","sources":["../../../../../src/ui/primitives/Navigation/Navigation.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AnchorOrButton, AnchorOrButtonProps } from \"utils\";\nimport \"./navigation.css\";\n\nexport type NavigationProps = ComponentPropsWithoutRef<\"nav\"> & {\n direction?: \"column\" | \"row\";\n};\nexport function Navigation({\n className,\n direction = \"row\",\n ...props\n}: NavigationProps) {\n const classNames = clsx(\n className,\n \"navigation\",\n `navigation-direction-${direction}`,\n );\n return <nav className={classNames} {...props} />;\n}\n\nexport type
|
|
1
|
+
{"version":3,"file":"Navigation.js","sources":["../../../../../src/ui/primitives/Navigation/Navigation.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { AnchorOrButton, AnchorOrButtonProps } from \"utils\";\nimport \"./navigation.css\";\n\nexport type NavigationProps = ComponentPropsWithoutRef<\"nav\"> & {\n direction?: \"column\" | \"row\";\n};\nexport function Navigation({\n className,\n direction = \"row\",\n ...props\n}: NavigationProps) {\n const classNames = clsx(\n className,\n \"navigation\",\n `navigation-direction-${direction}`,\n );\n return <nav className={classNames} {...props} />;\n}\n\nexport type NavigationButtonProps = AnchorOrButtonProps & {\n isSelected?: boolean;\n icon?: ReactNode;\n size?: \"small\" | \"medium\";\n direction?: \"column\" | \"row\";\n};\nexport function NavigationButton({\n children,\n className,\n isSelected,\n icon,\n direction = \"column\",\n size = \"medium\",\n ...props\n}: NavigationButtonProps) {\n const classNames = clsx(\n className,\n \"navigation-button\",\n `navigation-button-direction-${direction}`,\n `navigation-button-size-${size}`,\n );\n return (\n <AnchorOrButton\n data-selected={isSelected || undefined}\n className={classNames}\n {...props}\n >\n {icon}\n {children}\n </AnchorOrButton>\n );\n}\n"],"names":["Navigation","className","direction","props","classNames","clsx","jsx","NavigationButton","children","isSelected","icon","size","jsxs","AnchorOrButton"],"mappings":";;;;AAQO,SAASA,EAAW;AAAA,EACzB,WAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAoB;AAClB,QAAMC,IAAaC;AAAA,IACjBJ;AAAA,IACA;AAAA,IACA,wBAAwBC,CAAS;AAAA,EAAA;AAEnC,SAAO,gBAAAI,EAAC,OAAA,EAAI,WAAWF,GAAa,GAAGD,GAAO;AAChD;AAQO,SAASI,EAAiB;AAAA,EAC/B,UAAAC;AAAA,EACA,WAAAP;AAAA,EACA,YAAAQ;AAAA,EACA,MAAAC;AAAA,EACA,WAAAR,IAAY;AAAA,EACZ,MAAAS,IAAO;AAAA,EACP,GAAGR;AACL,GAA0B;AACxB,QAAMC,IAAaC;AAAA,IACjBJ;AAAA,IACA;AAAA,IACA,+BAA+BC,CAAS;AAAA,IACxC,0BAA0BS,CAAI;AAAA,EAAA;AAEhC,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,iBAAeJ,KAAc;AAAA,MAC7B,WAAWL;AAAA,MACV,GAAGD;AAAA,MAEH,UAAA;AAAA,QAAAO;AAAA,QACAF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),n=require("../../../vendor/clsx/dist/clsx.cjs"),t=require("react-aria-components");;/* empty css */function e({className:i,...a}){const s=n.clsx(i,"navigation-pill");return l.jsx(t.Tab,{className:s,...a})}function o({className:i,...a}){const s=n.clsx(i,"navigation-pill-list");return l.jsx(t.TabList,{className:s,...a})}function c({className:i,...a}){const s=n.clsx(i,"navigation-pill-panel");return l.jsx(t.TabPanel,{className:s,...a})}function r({className:i,...a}){const s=n.clsx(i,"navigation-pills");return l.jsx(t.Tabs,{className:s,...a})}exports.NavigationPill=e;exports.NavigationPillList=o;exports.NavigationPillPanel=c;exports.NavigationPills=r;
|
|
2
|
+
//# sourceMappingURL=NavigationPill.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationPill.cjs","sources":["../../../../../src/ui/primitives/NavigationPill/NavigationPill.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n Tab as RACTab,\n TabList as RACTabList,\n TabPanel as RACTabPanel,\n Tabs as RACTabs,\n type TabListProps as RACTabListProps,\n type TabPanelProps as RACTabPanelProps,\n type TabProps as RACTabProps,\n type TabsProps as RACTabsProps,\n} from \"react-aria-components\";\nimport \"./navigationPill.css\";\n\nexport type NavigationPillProps = RACTabProps;\nexport function NavigationPill({ className, ...props }: NavigationPillProps) {\n const classNames = clsx(className, \"navigation-pill\");\n return <RACTab className={classNames} {...props} />;\n}\n\nexport type NavigationPillListProps<T> = RACTabListProps<T>;\nexport function NavigationPillList<T extends object>({\n className,\n ...props\n}: NavigationPillListProps<T>) {\n const classNames = clsx(className, \"navigation-pill-list\");\n return <RACTabList className={classNames} {...props} />;\n}\n\nexport type NavigationPillPanelProps = RACTabPanelProps;\nexport function NavigationPillPanel({\n className,\n ...props\n}: NavigationPillPanelProps) {\n const classNames = clsx(className, \"navigation-pill-panel\");\n return <RACTabPanel className={classNames} {...props} />;\n}\n\nexport type NavigationPillsProps = RACTabsProps;\nexport function NavigationPills({ className, ...props }: NavigationPillsProps) {\n const classNames = clsx(className, \"navigation-pills\");\n return <RACTabs className={classNames} {...props} />;\n}\n"],"names":["NavigationPill","className","props","classNames","clsx","jsx","RACTab","NavigationPillList","RACTabList","NavigationPillPanel","RACTabPanel","NavigationPills","RACTabs"],"mappings":"4OAcO,SAASA,EAAe,CAAE,UAAAC,EAAW,GAAGC,GAA8B,CAC3E,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,iBAAiB,EACpD,OAAOI,EAAAA,IAACC,EAAAA,IAAA,CAAO,UAAWH,EAAa,GAAGD,EAAO,CACnD,CAGO,SAASK,EAAqC,CACnD,UAAAN,EACA,GAAGC,CACL,EAA+B,CAC7B,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,sBAAsB,EACzD,OAAOI,EAAAA,IAACG,EAAAA,QAAA,CAAW,UAAWL,EAAa,GAAGD,EAAO,CACvD,CAGO,SAASO,EAAoB,CAClC,UAAAR,EACA,GAAGC,CACL,EAA6B,CAC3B,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,uBAAuB,EAC1D,OAAOI,EAAAA,IAACK,EAAAA,SAAA,CAAY,UAAWP,EAAa,GAAGD,EAAO,CACxD,CAGO,SAASS,EAAgB,CAAE,UAAAV,EAAW,GAAGC,GAA+B,CAC7E,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,kBAAkB,EACrD,OAAOI,EAAAA,IAACO,EAAAA,KAAA,CAAQ,UAAWT,EAAa,GAAGD,EAAO,CACpD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import { clsx as l } from "../../../vendor/clsx/dist/clsx.js";
|
|
3
|
+
import { Tab as t, TabList as o, TabPanel as c, Tabs as e } from "react-aria-components";
|
|
4
|
+
/* empty css */
|
|
5
|
+
function g({ className: a, ...i }) {
|
|
6
|
+
const s = l(a, "navigation-pill");
|
|
7
|
+
return /* @__PURE__ */ n(t, { className: s, ...i });
|
|
8
|
+
}
|
|
9
|
+
function u({
|
|
10
|
+
className: a,
|
|
11
|
+
...i
|
|
12
|
+
}) {
|
|
13
|
+
const s = l(a, "navigation-pill-list");
|
|
14
|
+
return /* @__PURE__ */ n(o, { className: s, ...i });
|
|
15
|
+
}
|
|
16
|
+
function v({
|
|
17
|
+
className: a,
|
|
18
|
+
...i
|
|
19
|
+
}) {
|
|
20
|
+
const s = l(a, "navigation-pill-panel");
|
|
21
|
+
return /* @__PURE__ */ n(c, { className: s, ...i });
|
|
22
|
+
}
|
|
23
|
+
function f({ className: a, ...i }) {
|
|
24
|
+
const s = l(a, "navigation-pills");
|
|
25
|
+
return /* @__PURE__ */ n(e, { className: s, ...i });
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
g as NavigationPill,
|
|
29
|
+
u as NavigationPillList,
|
|
30
|
+
v as NavigationPillPanel,
|
|
31
|
+
f as NavigationPills
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=NavigationPill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationPill.js","sources":["../../../../../src/ui/primitives/NavigationPill/NavigationPill.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n Tab as RACTab,\n TabList as RACTabList,\n TabPanel as RACTabPanel,\n Tabs as RACTabs,\n type TabListProps as RACTabListProps,\n type TabPanelProps as RACTabPanelProps,\n type TabProps as RACTabProps,\n type TabsProps as RACTabsProps,\n} from \"react-aria-components\";\nimport \"./navigationPill.css\";\n\nexport type NavigationPillProps = RACTabProps;\nexport function NavigationPill({ className, ...props }: NavigationPillProps) {\n const classNames = clsx(className, \"navigation-pill\");\n return <RACTab className={classNames} {...props} />;\n}\n\nexport type NavigationPillListProps<T> = RACTabListProps<T>;\nexport function NavigationPillList<T extends object>({\n className,\n ...props\n}: NavigationPillListProps<T>) {\n const classNames = clsx(className, \"navigation-pill-list\");\n return <RACTabList className={classNames} {...props} />;\n}\n\nexport type NavigationPillPanelProps = RACTabPanelProps;\nexport function NavigationPillPanel({\n className,\n ...props\n}: NavigationPillPanelProps) {\n const classNames = clsx(className, \"navigation-pill-panel\");\n return <RACTabPanel className={classNames} {...props} />;\n}\n\nexport type NavigationPillsProps = RACTabsProps;\nexport function NavigationPills({ className, ...props }: NavigationPillsProps) {\n const classNames = clsx(className, \"navigation-pills\");\n return <RACTabs className={classNames} {...props} />;\n}\n"],"names":["NavigationPill","className","props","classNames","clsx","jsx","RACTab","NavigationPillList","RACTabList","NavigationPillPanel","RACTabPanel","NavigationPills","RACTabs"],"mappings":";;;;AAcO,SAASA,EAAe,EAAE,WAAAC,GAAW,GAAGC,KAA8B;AAC3E,QAAMC,IAAaC,EAAKH,GAAW,iBAAiB;AACpD,SAAO,gBAAAI,EAACC,GAAA,EAAO,WAAWH,GAAa,GAAGD,GAAO;AACnD;AAGO,SAASK,EAAqC;AAAA,EACnD,WAAAN;AAAA,EACA,GAAGC;AACL,GAA+B;AAC7B,QAAMC,IAAaC,EAAKH,GAAW,sBAAsB;AACzD,SAAO,gBAAAI,EAACG,GAAA,EAAW,WAAWL,GAAa,GAAGD,GAAO;AACvD;AAGO,SAASO,EAAoB;AAAA,EAClC,WAAAR;AAAA,EACA,GAAGC;AACL,GAA6B;AAC3B,QAAMC,IAAaC,EAAKH,GAAW,uBAAuB;AAC1D,SAAO,gBAAAI,EAACK,GAAA,EAAY,WAAWP,GAAa,GAAGD,GAAO;AACxD;AAGO,SAASS,EAAgB,EAAE,WAAAV,GAAW,GAAGC,KAA+B;AAC7E,QAAMC,IAAaC,EAAKH,GAAW,kBAAkB;AACrD,SAAO,gBAAAI,EAACO,GAAA,EAAQ,WAAWT,GAAa,GAAGD,GAAO;AACpD;"}
|