@sbkbs/ui 2.0.0-beta.0 → 2.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/CHANGELOG.md +57 -57
- package/dist/assets/favicon/site.webmanifest +21 -21
- package/dist/base.css +38 -38
- package/dist/components/Accordion/Accordion.js.map +1 -1
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Chip/Chip.js.map +1 -1
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/Field/Field.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/GlassPanel/GlassPanel.js.map +1 -1
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/Highlight/Highlight.js.map +1 -1
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/IconButton/IconButton.js.map +1 -1
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Logo/Logo.js.map +1 -1
- package/dist/components/MiniCard/MiniCard.js.map +1 -1
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Navigation/Navigation.js.map +1 -1
- package/dist/components/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Paragraph/Paragraph.js.map +1 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/SideNav/SideNav.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/Subtitle/Subtitle.js.map +1 -1
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tag/Tag.js.map +1 -1
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Title/Title.js.map +1 -1
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Typography/weight.js.map +1 -1
- package/dist/fonts.css +8 -8
- package/dist/index.cjs.map +1 -1
- package/dist/reset.css +9 -9
- package/dist/tailwind.css +153 -153
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/tokens.js.map +1 -1
- package/dist/theme.css +327 -327
- package/dist/tokens.css +327 -327
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/styles.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader.js","sources":["../../../src/components/PageHeader/PageHeader.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { inverseScope } from '../../utils/styles';\n\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n actions?: React.ReactNode;\n /** Conteúdo acima do título (ex.: Breadcrumb). */\n breadcrumb?: React.ReactNode;\n subtitle?: React.ReactNode;\n title: React.ReactNode;\n /** `plain`: sem caixa. `card`: superfície com borda. `inverse`: bloco verde escuro (hero). */\n variant?: 'plain' | 'card' | 'inverse';\n}\n\nconst VARIANT_CLASS = {\n plain: '',\n card: 'rounded-sbk-md border border-sbk-line bg-sbk-surface p-5',\n inverse: cn('rounded-sbk-md p-6 md:p-8', inverseScope),\n} as const;\n\nexport const PageHeader = ({\n title,\n subtitle,\n actions,\n breadcrumb,\n variant = 'card',\n className,\n ...props\n}: PageHeaderProps) => (\n <header className={cn('grid gap-3', VARIANT_CLASS[variant], className)} {...props}>\n {breadcrumb}\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"grid min-w-0 gap-1\">\n <h1 className=\"m-0 text-2xl font-semibold leading-tight text-sbk-fg-heading md:text-[1.75rem]\">\n {title}\n </h1>\n {subtitle && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n </header>\n);\n\nPageHeader.displayName = 'PageHeader';\n"],"names":["VARIANT_CLASS","cn","inverseScope","PageHeader","title","subtitle","actions","breadcrumb","variant","className","props","jsxs","jsx"],"mappings":";;;AAcA,MAAMA,IAAgB;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAASC,EAAG,6BAA6BC,CAAY;AACvD,GAEaC,IAAa,CAAC;AAAA,EACzB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC,EAAC,UAAA,EAAO,WAAWV,EAAG,cAAcD,EAAcQ,CAAO,GAAGC,CAAS,GAAI,GAAGC,GACzE,UAAA;AAAA,EAAAH;AAAA,EACD,gBAAAI,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,kFACX,UAAAR,GACH;AAAA,MACCC,KAAY,gBAAAO,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAP,EAAA,CAAS;AAAA,IAAA,GACjF;AAAA,IACCC,KAAW,gBAAAM,EAAC,OAAA,EAAI,WAAU,8CAA8C,UAAAN,EAAA,CAAQ;AAAA,EAAA,EAAA,CACnF;AAAA,EAAA,CACF;AAGFH,EAAW,cAAc;"}
|
|
1
|
+
{"version":3,"file":"PageHeader.js","sources":["../../../src/components/PageHeader/PageHeader.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { inverseScope } from '../../utils/styles';\r\n\r\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n actions?: React.ReactNode;\r\n /** Conteúdo acima do título (ex.: Breadcrumb). */\r\n breadcrumb?: React.ReactNode;\r\n subtitle?: React.ReactNode;\r\n title: React.ReactNode;\r\n /** `plain`: sem caixa. `card`: superfície com borda. `inverse`: bloco verde escuro (hero). */\r\n variant?: 'plain' | 'card' | 'inverse';\r\n}\r\n\r\nconst VARIANT_CLASS = {\r\n plain: '',\r\n card: 'rounded-sbk-md border border-sbk-line bg-sbk-surface p-5',\r\n inverse: cn('rounded-sbk-md p-6 md:p-8', inverseScope),\r\n} as const;\r\n\r\nexport const PageHeader = ({\r\n title,\r\n subtitle,\r\n actions,\r\n breadcrumb,\r\n variant = 'card',\r\n className,\r\n ...props\r\n}: PageHeaderProps) => (\r\n <header className={cn('grid gap-3', VARIANT_CLASS[variant], className)} {...props}>\r\n {breadcrumb}\r\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\r\n <div className=\"grid min-w-0 gap-1\">\r\n <h1 className=\"m-0 text-2xl font-semibold leading-tight text-sbk-fg-heading md:text-[1.75rem]\">\r\n {title}\r\n </h1>\r\n {subtitle && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{subtitle}</p>}\r\n </div>\r\n {actions && <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\r\n </div>\r\n </header>\r\n);\r\n\r\nPageHeader.displayName = 'PageHeader';\r\n"],"names":["VARIANT_CLASS","cn","inverseScope","PageHeader","title","subtitle","actions","breadcrumb","variant","className","props","jsxs","jsx"],"mappings":";;;AAcA,MAAMA,IAAgB;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAASC,EAAG,6BAA6BC,CAAY;AACvD,GAEaC,IAAa,CAAC;AAAA,EACzB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC,EAAC,UAAA,EAAO,WAAWV,EAAG,cAAcD,EAAcQ,CAAO,GAAGC,CAAS,GAAI,GAAGC,GACzE,UAAA;AAAA,EAAAH;AAAA,EACD,gBAAAI,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,kFACX,UAAAR,GACH;AAAA,MACCC,KAAY,gBAAAO,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAP,EAAA,CAAS;AAAA,IAAA,GACjF;AAAA,IACCC,KAAW,gBAAAM,EAAC,OAAA,EAAI,WAAU,8CAA8C,UAAAN,EAAA,CAAQ;AAAA,EAAA,EAAA,CACnF;AAAA,EAAA,CACF;AAGFH,EAAW,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\n\nexport interface PaginationProps {\n className?: string;\n currentPage: number;\n onPageChange: (page: number) => void;\n /** Páginas vizinhas exibidas ao redor da atual. Padrão: 1. */\n siblingCount?: number;\n /**\n * `numbered`: lista de páginas com reticências.\n * `simple`: apenas Anterior/Próxima com \"Página X de Y\" (para paginação sequencial).\n */\n variant?: 'numbered' | 'simple';\n totalPages: number;\n}\n\ntype PageToken = number | 'ellipsis-start' | 'ellipsis-end';\n\nexport const getPageTokens = (current: number, total: number, siblings = 1): PageToken[] => {\n const window = siblings * 2 + 5;\n if (total <= window) return Array.from({ length: total }, (_, i) => i + 1);\n const start = Math.max(2, current - siblings);\n const end = Math.min(total - 1, current + siblings);\n const tokens: PageToken[] = [1];\n if (start > 2) tokens.push('ellipsis-start');\n for (let p = start; p <= end; p++) tokens.push(p);\n if (end < total - 1) tokens.push('ellipsis-end');\n tokens.push(total);\n return tokens;\n};\n\nconst buttonBase = cn(\n 'inline-flex min-h-9 min-w-9 cursor-pointer items-center justify-center gap-1 rounded-sbk-sm border px-2.5 text-sm disabled:cursor-not-allowed disabled:opacity-50',\n transitionColors,\n focusRing,\n);\n\nexport const Pagination = ({\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n variant = 'numbered',\n className,\n}: PaginationProps) => {\n if (totalPages <= 1) return null;\n const idle = 'border-sbk-line bg-sbk-surface font-light text-sbk-fg hover:bg-sbk-surface-hover';\n\n return (\n <nav aria-label=\"Paginação\" className={cn('flex flex-wrap items-center gap-1', className)}>\n <button\n className={cn(buttonReset, buttonBase, idle)}\n disabled={currentPage <= 1}\n onClick={() => onPageChange(currentPage - 1)}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" className=\"size-4\" />\n Anterior\n </button>\n\n {variant === 'simple' ? (\n <span aria-live=\"polite\" className=\"px-3 text-sm font-light text-sbk-fg-muted\">\n Página <strong className=\"font-semibold text-sbk-fg\">{currentPage}</strong> de{' '}\n {totalPages}\n </span>\n ) : (\n getPageTokens(currentPage, totalPages, siblingCount).map((token) =>\n typeof token === 'number' ? (\n <button\n key={token}\n aria-current={token === currentPage ? 'page' : undefined}\n aria-label={`Página ${token}`}\n className={cn(\n buttonReset,\n buttonBase,\n token === currentPage\n ? 'border-sbk-primary bg-sbk-primary font-semibold text-sbk-on-primary'\n : idle,\n )}\n onClick={() => onPageChange(token)}\n type=\"button\"\n >\n {token}\n </button>\n ) : (\n <span key={token} aria-hidden=\"true\" className=\"px-1 text-sm text-sbk-fg-muted\">\n …\n </span>\n ),\n )\n )}\n\n <button\n className={cn(buttonReset, buttonBase, idle)}\n disabled={currentPage >= totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n type=\"button\"\n >\n Próxima\n <ChevronRight aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </nav>\n );\n};\n\nPagination.displayName = 'Pagination';\n"],"names":["getPageTokens","current","total","siblings","window","_","i","start","end","tokens","p","buttonBase","cn","transitionColors","focusRing","Pagination","currentPage","totalPages","onPageChange","siblingCount","variant","className","idle","jsxs","buttonReset","jsx","ChevronLeft","token","ChevronRight"],"mappings":";;;;AAoBO,MAAMA,IAAgB,CAACC,GAAiBC,GAAeC,IAAW,MAAmB;AAC1F,QAAMC,IAASD,IAAW,IAAI;AAC9B,MAAID,KAASE,EAAQ,QAAO,MAAM,KAAK,EAAE,QAAQF,EAAA,GAAS,CAACG,GAAGC,MAAMA,IAAI,CAAC;AACzE,QAAMC,IAAQ,KAAK,IAAI,GAAGN,IAAUE,CAAQ,GACtCK,IAAM,KAAK,IAAIN,IAAQ,GAAGD,IAAUE,CAAQ,GAC5CM,IAAsB,CAAC,CAAC;AAC9B,EAAIF,IAAQ,KAAGE,EAAO,KAAK,gBAAgB;AAC3C,WAASC,IAAIH,GAAOG,KAAKF,GAAKE,IAAK,CAAAD,EAAO,KAAKC,CAAC;AAChD,SAAIF,IAAMN,IAAQ,KAAGO,EAAO,KAAK,cAAc,GAC/CA,EAAO,KAAKP,CAAK,GACVO;AACT,GAEME,IAAaC;AAAA,EACjB;AAAA,EACAC;AAAA,EACAC;AACF,GAEaC,IAAa,CAAC;AAAA,EACzB,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAuB;AACrB,MAAIJ,KAAc,EAAG,QAAO;AAC5B,QAAMK,IAAO;AAEb,SACE,gBAAAC,EAAC,SAAI,cAAW,aAAY,WAAWX,EAAG,qCAAqCS,CAAS,GACtF,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAe;AAAA,QACzB,SAAS,MAAME,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QAEL,UAAA;AAAA,UAAA,gBAAAS,EAACC,GAAA,EAAY,eAAY,QAAO,WAAU,UAAS;AAAA,UAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAItDN,MAAY,WACX,gBAAAG,EAAC,UAAK,aAAU,UAAS,WAAU,6CAA4C,UAAA;AAAA,MAAA;AAAA,MACtE,gBAAAE,EAAC,UAAA,EAAO,WAAU,6BAA6B,UAAAT,GAAY;AAAA,MAAS;AAAA,MAAI;AAAA,MAC9EC;AAAA,IAAA,EAAA,CACH,IAEAjB,EAAcgB,GAAaC,GAAYE,CAAY,EAAE;AAAA,MAAI,CAACQ,MACxD,OAAOA,KAAU,WACf,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,gBAAcE,MAAUX,IAAc,SAAS;AAAA,UAC/C,cAAY,UAAUW,CAAK;AAAA,UAC3B,WAAWf;AAAA,YACTY;AAAA,YACAb;AAAA,YACAgB,MAAUX,IACN,wEACAM;AAAA,UAAA;AAAA,UAEN,SAAS,MAAMJ,EAAaS,CAAK;AAAA,UACjC,MAAK;AAAA,UAEJ,UAAAA;AAAA,QAAA;AAAA,QAbIA;AAAA,MAAA,sBAgBN,QAAA,EAAiB,eAAY,QAAO,WAAU,kCAAiC,iBAArEA,CAEX;AAAA,IAAA;AAAA,IAKN,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAeC;AAAA,QACzB,SAAS,MAAMC,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QACN,UAAA;AAAA,UAAA;AAAA,UAEC,gBAAAS,EAACG,GAAA,EAAa,eAAY,QAAO,WAAU,SAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACtD,GACF;AAEJ;AAEAb,EAAW,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\n\r\nexport interface PaginationProps {\r\n className?: string;\r\n currentPage: number;\r\n onPageChange: (page: number) => void;\r\n /** Páginas vizinhas exibidas ao redor da atual. Padrão: 1. */\r\n siblingCount?: number;\r\n /**\r\n * `numbered`: lista de páginas com reticências.\r\n * `simple`: apenas Anterior/Próxima com \"Página X de Y\" (para paginação sequencial).\r\n */\r\n variant?: 'numbered' | 'simple';\r\n totalPages: number;\r\n}\r\n\r\ntype PageToken = number | 'ellipsis-start' | 'ellipsis-end';\r\n\r\nexport const getPageTokens = (current: number, total: number, siblings = 1): PageToken[] => {\r\n const window = siblings * 2 + 5;\r\n if (total <= window) return Array.from({ length: total }, (_, i) => i + 1);\r\n const start = Math.max(2, current - siblings);\r\n const end = Math.min(total - 1, current + siblings);\r\n const tokens: PageToken[] = [1];\r\n if (start > 2) tokens.push('ellipsis-start');\r\n for (let p = start; p <= end; p++) tokens.push(p);\r\n if (end < total - 1) tokens.push('ellipsis-end');\r\n tokens.push(total);\r\n return tokens;\r\n};\r\n\r\nconst buttonBase = cn(\r\n 'inline-flex min-h-9 min-w-9 cursor-pointer items-center justify-center gap-1 rounded-sbk-sm border px-2.5 text-sm disabled:cursor-not-allowed disabled:opacity-50',\r\n transitionColors,\r\n focusRing,\r\n);\r\n\r\nexport const Pagination = ({\r\n currentPage,\r\n totalPages,\r\n onPageChange,\r\n siblingCount = 1,\r\n variant = 'numbered',\r\n className,\r\n}: PaginationProps) => {\r\n if (totalPages <= 1) return null;\r\n const idle = 'border-sbk-line bg-sbk-surface font-light text-sbk-fg hover:bg-sbk-surface-hover';\r\n\r\n return (\r\n <nav aria-label=\"Paginação\" className={cn('flex flex-wrap items-center gap-1', className)}>\r\n <button\r\n className={cn(buttonReset, buttonBase, idle)}\r\n disabled={currentPage <= 1}\r\n onClick={() => onPageChange(currentPage - 1)}\r\n type=\"button\"\r\n >\r\n <ChevronLeft aria-hidden=\"true\" className=\"size-4\" />\r\n Anterior\r\n </button>\r\n\r\n {variant === 'simple' ? (\r\n <span aria-live=\"polite\" className=\"px-3 text-sm font-light text-sbk-fg-muted\">\r\n Página <strong className=\"font-semibold text-sbk-fg\">{currentPage}</strong> de{' '}\r\n {totalPages}\r\n </span>\r\n ) : (\r\n getPageTokens(currentPage, totalPages, siblingCount).map((token) =>\r\n typeof token === 'number' ? (\r\n <button\r\n key={token}\r\n aria-current={token === currentPage ? 'page' : undefined}\r\n aria-label={`Página ${token}`}\r\n className={cn(\r\n buttonReset,\r\n buttonBase,\r\n token === currentPage\r\n ? 'border-sbk-primary bg-sbk-primary font-semibold text-sbk-on-primary'\r\n : idle,\r\n )}\r\n onClick={() => onPageChange(token)}\r\n type=\"button\"\r\n >\r\n {token}\r\n </button>\r\n ) : (\r\n <span key={token} aria-hidden=\"true\" className=\"px-1 text-sm text-sbk-fg-muted\">\r\n …\r\n </span>\r\n ),\r\n )\r\n )}\r\n\r\n <button\r\n className={cn(buttonReset, buttonBase, idle)}\r\n disabled={currentPage >= totalPages}\r\n onClick={() => onPageChange(currentPage + 1)}\r\n type=\"button\"\r\n >\r\n Próxima\r\n <ChevronRight aria-hidden=\"true\" className=\"size-4\" />\r\n </button>\r\n </nav>\r\n );\r\n};\r\n\r\nPagination.displayName = 'Pagination';\r\n"],"names":["getPageTokens","current","total","siblings","window","_","i","start","end","tokens","p","buttonBase","cn","transitionColors","focusRing","Pagination","currentPage","totalPages","onPageChange","siblingCount","variant","className","idle","jsxs","buttonReset","jsx","ChevronLeft","token","ChevronRight"],"mappings":";;;;AAoBO,MAAMA,IAAgB,CAACC,GAAiBC,GAAeC,IAAW,MAAmB;AAC1F,QAAMC,IAASD,IAAW,IAAI;AAC9B,MAAID,KAASE,EAAQ,QAAO,MAAM,KAAK,EAAE,QAAQF,EAAA,GAAS,CAACG,GAAGC,MAAMA,IAAI,CAAC;AACzE,QAAMC,IAAQ,KAAK,IAAI,GAAGN,IAAUE,CAAQ,GACtCK,IAAM,KAAK,IAAIN,IAAQ,GAAGD,IAAUE,CAAQ,GAC5CM,IAAsB,CAAC,CAAC;AAC9B,EAAIF,IAAQ,KAAGE,EAAO,KAAK,gBAAgB;AAC3C,WAASC,IAAIH,GAAOG,KAAKF,GAAKE,IAAK,CAAAD,EAAO,KAAKC,CAAC;AAChD,SAAIF,IAAMN,IAAQ,KAAGO,EAAO,KAAK,cAAc,GAC/CA,EAAO,KAAKP,CAAK,GACVO;AACT,GAEME,IAAaC;AAAA,EACjB;AAAA,EACAC;AAAA,EACAC;AACF,GAEaC,IAAa,CAAC;AAAA,EACzB,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAuB;AACrB,MAAIJ,KAAc,EAAG,QAAO;AAC5B,QAAMK,IAAO;AAEb,SACE,gBAAAC,EAAC,SAAI,cAAW,aAAY,WAAWX,EAAG,qCAAqCS,CAAS,GACtF,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAe;AAAA,QACzB,SAAS,MAAME,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QAEL,UAAA;AAAA,UAAA,gBAAAS,EAACC,GAAA,EAAY,eAAY,QAAO,WAAU,UAAS;AAAA,UAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAItDN,MAAY,WACX,gBAAAG,EAAC,UAAK,aAAU,UAAS,WAAU,6CAA4C,UAAA;AAAA,MAAA;AAAA,MACtE,gBAAAE,EAAC,UAAA,EAAO,WAAU,6BAA6B,UAAAT,GAAY;AAAA,MAAS;AAAA,MAAI;AAAA,MAC9EC;AAAA,IAAA,EAAA,CACH,IAEAjB,EAAcgB,GAAaC,GAAYE,CAAY,EAAE;AAAA,MAAI,CAACQ,MACxD,OAAOA,KAAU,WACf,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,gBAAcE,MAAUX,IAAc,SAAS;AAAA,UAC/C,cAAY,UAAUW,CAAK;AAAA,UAC3B,WAAWf;AAAA,YACTY;AAAA,YACAb;AAAA,YACAgB,MAAUX,IACN,wEACAM;AAAA,UAAA;AAAA,UAEN,SAAS,MAAMJ,EAAaS,CAAK;AAAA,UACjC,MAAK;AAAA,UAEJ,UAAAA;AAAA,QAAA;AAAA,QAbIA;AAAA,MAAA,sBAgBN,QAAA,EAAiB,eAAY,QAAO,WAAU,kCAAiC,iBAArEA,CAEX;AAAA,IAAA;AAAA,IAKN,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAeC;AAAA,QACzB,SAAS,MAAMC,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QACN,UAAA;AAAA,UAAA;AAAA,UAEC,gBAAAS,EAACG,GAAA,EAAa,eAAY,QAAO,WAAU,SAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACtD,GACF;AAEJ;AAEAb,EAAW,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Paragraph.js","sources":["../../../src/components/Paragraph/Paragraph.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { type TextWeight, weightClass } from '../Typography/weight';\n\nexport interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n italic?: boolean;\n /** Cor secundária (Chumbo Leve). */\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n /** Padrão: light (brand book: corpo em Leve 300, não em Regular 400). */\n weight?: TextWeight;\n}\n\nconst SIZE_CLASS = {\n xs: 'text-xs leading-normal',\n sm: 'text-sm leading-normal',\n md: 'text-base leading-relaxed',\n lg: 'text-lg leading-relaxed',\n} as const;\n\nconst ALIGN_CLASS = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n} as const;\n\nexport const Paragraph = ({\n as: Tag = 'p',\n size = 'md',\n weight = 'light',\n align = 'left',\n muted = false,\n italic = false,\n children,\n className,\n ...props\n}: ParagraphProps) => (\n <Tag\n className={cn(\n 'm-0 font-sbk text-pretty',\n SIZE_CLASS[size],\n weightClass(weight),\n ALIGN_CLASS[align],\n muted ? 'text-sbk-fg-muted' : 'text-sbk-fg',\n italic && 'italic',\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n);\n\nParagraph.displayName = 'Paragraph';\n"],"names":["SIZE_CLASS","ALIGN_CLASS","Paragraph","Tag","size","weight","align","muted","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAc;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX,GAEaC,IAAY,CAAC;AAAA,EACxB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAb,EAAWI,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBJ,EAAYK,CAAK;AAAA,MACjBC,IAAQ,sBAAsB;AAAA,MAC9BC,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAU,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Paragraph.js","sources":["../../../src/components/Paragraph/Paragraph.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { type TextWeight, weightClass } from '../Typography/weight';\r\n\r\nexport interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {\r\n align?: 'left' | 'center' | 'right' | 'justify';\r\n as?: 'p' | 'span' | 'div';\r\n children: React.ReactNode;\r\n italic?: boolean;\r\n /** Cor secundária (Chumbo Leve). */\r\n muted?: boolean;\r\n size?: 'xs' | 'sm' | 'md' | 'lg';\r\n /** Padrão: light (brand book: corpo em Leve 300, não em Regular 400). */\r\n weight?: TextWeight;\r\n}\r\n\r\nconst SIZE_CLASS = {\r\n xs: 'text-xs leading-normal',\r\n sm: 'text-sm leading-normal',\r\n md: 'text-base leading-relaxed',\r\n lg: 'text-lg leading-relaxed',\r\n} as const;\r\n\r\nconst ALIGN_CLASS = {\r\n left: 'text-left',\r\n center: 'text-center',\r\n right: 'text-right',\r\n justify: 'text-justify',\r\n} as const;\r\n\r\nexport const Paragraph = ({\r\n as: Tag = 'p',\r\n size = 'md',\r\n weight = 'light',\r\n align = 'left',\r\n muted = false,\r\n italic = false,\r\n children,\r\n className,\r\n ...props\r\n}: ParagraphProps) => (\r\n <Tag\r\n className={cn(\r\n 'm-0 font-sbk text-pretty',\r\n SIZE_CLASS[size],\r\n weightClass(weight),\r\n ALIGN_CLASS[align],\r\n muted ? 'text-sbk-fg-muted' : 'text-sbk-fg',\r\n italic && 'italic',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </Tag>\r\n);\r\n\r\nParagraph.displayName = 'Paragraph';\r\n"],"names":["SIZE_CLASS","ALIGN_CLASS","Paragraph","Tag","size","weight","align","muted","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAc;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX,GAEaC,IAAY,CAAC;AAAA,EACxB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAb,EAAWI,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBJ,EAAYK,CAAK;AAAA,MACjBC,IAAQ,sBAAsB;AAAA,MAC9BC,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAU,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import type React from 'react';\nimport { useEffect, useId, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset } from '../../utils/styles';\n\nexport interface PopoverProps {\n align?: 'start' | 'center' | 'end';\n children: React.ReactNode;\n /** Classe do botão gatilho. */\n className?: string;\n content: React.ReactNode;\n defaultOpen?: boolean;\n /** Controle externo do estado aberto. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n variant?: 'default' | 'glass';\n}\n\nconst ALIGN = { start: 'left-0', center: 'left-1/2 -translate-x-1/2', end: 'right-0' } as const;\n\n/** Painel flutuante não modal ancorado a um gatilho. Fecha com Esc e clique fora. */\nexport const Popover = ({\n children,\n content,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n align = 'center',\n variant = 'default',\n className,\n}: PopoverProps) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = controlledOpen ?? uncontrolledOpen;\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const popoverId = useId();\n\n const setOpen = (next: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\n const setOpenRef = useRef(setOpen);\n setOpenRef.current = setOpen;\n\n useEffect(() => {\n if (!open) return;\n panelRef.current\n ?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n ?.focus();\n\n const onClickOutside = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) setOpenRef.current(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpenRef.current(false);\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('mousedown', onClickOutside);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onClickOutside);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={containerRef} className=\"relative inline-flex\">\n <button\n ref={triggerRef}\n aria-controls={open ? popoverId : undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n className={cn(buttonReset, 'inline-flex cursor-pointer', className)}\n onClick={() => setOpen(!open)}\n type=\"button\"\n >\n {children}\n </button>\n {open && (\n <div\n ref={panelRef}\n className={cn(\n 'absolute top-full z-[var(--sbk-z-dropdown)] mt-2 w-max max-w-sm rounded-sbk-md p-4 text-sm font-light text-sbk-fg animate-sbk-fade-in',\n variant === 'glass'\n ? 'sbk-glass sbk-glass-strong'\n : 'border border-sbk-line bg-sbk-surface shadow-sbk-md',\n ALIGN[align],\n )}\n id={popoverId}\n role=\"dialog\"\n tabIndex={-1}\n >\n {content}\n </div>\n )}\n </div>\n );\n};\n\nPopover.displayName = 'Popover';\n"],"names":["ALIGN","Popover","children","content","defaultOpen","controlledOpen","onOpenChange","align","variant","className","uncontrolledOpen","setUncontrolledOpen","useState","open","containerRef","useRef","triggerRef","panelRef","popoverId","useId","setOpen","next","setOpenRef","useEffect","_b","_a","onClickOutside","event","onKeyDown","jsxs","jsx","cn","buttonReset"],"mappings":";;;;AAkBA,MAAMA,IAAQ,EAAE,OAAO,UAAU,QAAQ,6BAA6B,KAAK,UAAA,GAG9DC,IAAU,CAAC;AAAA,EACtB,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAoB;AAClB,QAAM,CAACC,GAAkBC,CAAmB,IAAIC,EAASR,CAAW,GAC9DS,IAAOR,KAAkBK,GACzBI,IAAeC,EAAuB,IAAI,GAC1CC,IAAaD,EAA0B,IAAI,GAC3CE,IAAWF,EAAuB,IAAI,GACtCG,IAAYC,EAAA,GAEZC,IAAU,CAACC,MAAkB;AACjC,IAAIhB,MAAmB,UAAWM,EAAoBU,CAAI,GAC1Df,KAAA,QAAAA,EAAee;AAAA,EACjB,GACMC,IAAaP,EAAOK,CAAO;AACjC,SAAAE,EAAW,UAAUF,GAErBG,EAAU,MAAM;;AACd,QAAI,CAACV,EAAM;AACX,KAAAW,KAAAC,IAAAR,EAAS,YAAT,gBAAAQ,EACI;AAAA,MACA;AAAA,UAFJ,QAAAD,EAII;AAEJ,UAAME,IAAiB,CAACC,MAAsB;;AAC5C,OAAKF,IAAAX,EAAa,YAAb,QAAAW,EAAsB,SAASE,EAAM,WAAiBL,EAAW,QAAQ,EAAK;AAAA,IACrF,GACMM,IAAY,CAACD,MAAyB;;AAC1C,MAAIA,EAAM,QAAQ,aAChBL,EAAW,QAAQ,EAAK,IACxBG,IAAAT,EAAW,YAAX,QAAAS,EAAoB;AAAA,IAExB;AACA,oBAAS,iBAAiB,aAAaC,CAAc,GACrD,SAAS,iBAAiB,WAAWE,CAAS,GACvC,MAAM;AACX,eAAS,oBAAoB,aAAaF,CAAc,GACxD,SAAS,oBAAoB,WAAWE,CAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAACf,CAAI,CAAC,GAGP,gBAAAgB,EAAC,OAAA,EAAI,KAAKf,GAAc,WAAU,wBAChC,UAAA;AAAA,IAAA,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKd;AAAA,QACL,iBAAeH,IAAOK,IAAY;AAAA,QAClC,iBAAeL;AAAA,QACf,iBAAc;AAAA,QACd,WAAWkB,EAAGC,GAAa,8BAA8BvB,CAAS;AAAA,QAClE,SAAS,MAAMW,EAAQ,CAACP,CAAI;AAAA,QAC5B,MAAK;AAAA,QAEJ,UAAAX;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFW,KACC,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKb;AAAA,QACL,WAAWc;AAAA,UACT;AAAA,UACAvB,MAAY,UACR,+BACA;AAAA,UACJR,EAAMO,CAAK;AAAA,QAAA;AAAA,QAEb,IAAIW;AAAA,QACJ,MAAK;AAAA,QACL,UAAU;AAAA,QAET,UAAAf;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;AAEAF,EAAQ,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { useEffect, useId, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset } from '../../utils/styles';\r\n\r\nexport interface PopoverProps {\r\n align?: 'start' | 'center' | 'end';\r\n children: React.ReactNode;\r\n /** Classe do botão gatilho. */\r\n className?: string;\r\n content: React.ReactNode;\r\n defaultOpen?: boolean;\r\n /** Controle externo do estado aberto. */\r\n open?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n variant?: 'default' | 'glass';\r\n}\r\n\r\nconst ALIGN = { start: 'left-0', center: 'left-1/2 -translate-x-1/2', end: 'right-0' } as const;\r\n\r\n/** Painel flutuante não modal ancorado a um gatilho. Fecha com Esc e clique fora. */\r\nexport const Popover = ({\r\n children,\r\n content,\r\n defaultOpen = false,\r\n open: controlledOpen,\r\n onOpenChange,\r\n align = 'center',\r\n variant = 'default',\r\n className,\r\n}: PopoverProps) => {\r\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\r\n const open = controlledOpen ?? uncontrolledOpen;\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n const popoverId = useId();\r\n\r\n const setOpen = (next: boolean) => {\r\n if (controlledOpen === undefined) setUncontrolledOpen(next);\r\n onOpenChange?.(next);\r\n };\r\n const setOpenRef = useRef(setOpen);\r\n setOpenRef.current = setOpen;\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n panelRef.current\r\n ?.querySelector<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n )\r\n ?.focus();\r\n\r\n const onClickOutside = (event: MouseEvent) => {\r\n if (!containerRef.current?.contains(event.target as Node)) setOpenRef.current(false);\r\n };\r\n const onKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n setOpenRef.current(false);\r\n triggerRef.current?.focus();\r\n }\r\n };\r\n document.addEventListener('mousedown', onClickOutside);\r\n document.addEventListener('keydown', onKeyDown);\r\n return () => {\r\n document.removeEventListener('mousedown', onClickOutside);\r\n document.removeEventListener('keydown', onKeyDown);\r\n };\r\n }, [open]);\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative inline-flex\">\r\n <button\r\n ref={triggerRef}\r\n aria-controls={open ? popoverId : undefined}\r\n aria-expanded={open}\r\n aria-haspopup=\"dialog\"\r\n className={cn(buttonReset, 'inline-flex cursor-pointer', className)}\r\n onClick={() => setOpen(!open)}\r\n type=\"button\"\r\n >\r\n {children}\r\n </button>\r\n {open && (\r\n <div\r\n ref={panelRef}\r\n className={cn(\r\n 'absolute top-full z-[var(--sbk-z-dropdown)] mt-2 w-max max-w-sm rounded-sbk-md p-4 text-sm font-light text-sbk-fg animate-sbk-fade-in',\r\n variant === 'glass'\r\n ? 'sbk-glass sbk-glass-strong'\r\n : 'border border-sbk-line bg-sbk-surface shadow-sbk-md',\r\n ALIGN[align],\r\n )}\r\n id={popoverId}\r\n role=\"dialog\"\r\n tabIndex={-1}\r\n >\r\n {content}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nPopover.displayName = 'Popover';\r\n"],"names":["ALIGN","Popover","children","content","defaultOpen","controlledOpen","onOpenChange","align","variant","className","uncontrolledOpen","setUncontrolledOpen","useState","open","containerRef","useRef","triggerRef","panelRef","popoverId","useId","setOpen","next","setOpenRef","useEffect","_b","_a","onClickOutside","event","onKeyDown","jsxs","jsx","cn","buttonReset"],"mappings":";;;;AAkBA,MAAMA,IAAQ,EAAE,OAAO,UAAU,QAAQ,6BAA6B,KAAK,UAAA,GAG9DC,IAAU,CAAC;AAAA,EACtB,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAoB;AAClB,QAAM,CAACC,GAAkBC,CAAmB,IAAIC,EAASR,CAAW,GAC9DS,IAAOR,KAAkBK,GACzBI,IAAeC,EAAuB,IAAI,GAC1CC,IAAaD,EAA0B,IAAI,GAC3CE,IAAWF,EAAuB,IAAI,GACtCG,IAAYC,EAAA,GAEZC,IAAU,CAACC,MAAkB;AACjC,IAAIhB,MAAmB,UAAWM,EAAoBU,CAAI,GAC1Df,KAAA,QAAAA,EAAee;AAAA,EACjB,GACMC,IAAaP,EAAOK,CAAO;AACjC,SAAAE,EAAW,UAAUF,GAErBG,EAAU,MAAM;;AACd,QAAI,CAACV,EAAM;AACX,KAAAW,KAAAC,IAAAR,EAAS,YAAT,gBAAAQ,EACI;AAAA,MACA;AAAA,UAFJ,QAAAD,EAII;AAEJ,UAAME,IAAiB,CAACC,MAAsB;;AAC5C,OAAKF,IAAAX,EAAa,YAAb,QAAAW,EAAsB,SAASE,EAAM,WAAiBL,EAAW,QAAQ,EAAK;AAAA,IACrF,GACMM,IAAY,CAACD,MAAyB;;AAC1C,MAAIA,EAAM,QAAQ,aAChBL,EAAW,QAAQ,EAAK,IACxBG,IAAAT,EAAW,YAAX,QAAAS,EAAoB;AAAA,IAExB;AACA,oBAAS,iBAAiB,aAAaC,CAAc,GACrD,SAAS,iBAAiB,WAAWE,CAAS,GACvC,MAAM;AACX,eAAS,oBAAoB,aAAaF,CAAc,GACxD,SAAS,oBAAoB,WAAWE,CAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAACf,CAAI,CAAC,GAGP,gBAAAgB,EAAC,OAAA,EAAI,KAAKf,GAAc,WAAU,wBAChC,UAAA;AAAA,IAAA,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKd;AAAA,QACL,iBAAeH,IAAOK,IAAY;AAAA,QAClC,iBAAeL;AAAA,QACf,iBAAc;AAAA,QACd,WAAWkB,EAAGC,GAAa,8BAA8BvB,CAAS;AAAA,QAClE,SAAS,MAAMW,EAAQ,CAACP,CAAI;AAAA,QAC5B,MAAK;AAAA,QAEJ,UAAAX;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFW,KACC,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKb;AAAA,QACL,WAAWc;AAAA,UACT;AAAA,UACAvB,MAAY,UACR,+BACA;AAAA,UACJR,EAAMO,CAAK;AAAA,QAAA;AAAA,QAEb,IAAIW;AAAA,QACJ,MAAK;AAAA,QACL,UAAU;AAAA,QAET,UAAAf;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;AAEAF,EAAQ,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.js","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Barra animada sem valor conhecido (carregamento em andamento). */\n indeterminate?: boolean;\n /** Label acessível. Obrigatório quando não houver texto visível associado. */\n label?: string;\n /** Exibe o percentual ao lado da barra. */\n showValue?: boolean;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'primary' | 'success' | 'warning' | 'error' | 'info';\n /** Valor atual (0 a 100). Ignorado quando `indeterminate`. */\n value?: number;\n}\n\nconst SIZE_CLASS = { sm: 'h-1', md: 'h-2', lg: 'h-3' } as const;\n\nconst TONE_CLASS: Record<NonNullable<ProgressBarProps['tone']>, string> = {\n primary: 'bg-sbk-primary',\n success: 'bg-sbk-success',\n warning: 'bg-sbk-warning',\n error: 'bg-sbk-error',\n info: 'bg-sbk-info',\n};\n\n/** Barra de progresso determinada ou indeterminada (\"bar load\"). */\nexport const ProgressBar = ({\n value = 0,\n indeterminate = false,\n size = 'md',\n tone = 'primary',\n label,\n showValue = false,\n className,\n ...props\n}: ProgressBarProps) => {\n const clamped = Math.min(100, Math.max(0, value));\n\n return (\n <div className={cn('flex items-center gap-2', className)} {...props}>\n <div\n aria-busy={indeterminate || undefined}\n aria-label={label}\n aria-valuemax={indeterminate ? undefined : 100}\n aria-valuemin={indeterminate ? undefined : 0}\n aria-valuenow={indeterminate ? undefined : clamped}\n className={cn(\n 'relative flex-1 overflow-hidden rounded-full bg-sbk-surface-sunken',\n SIZE_CLASS[size],\n )}\n role=\"progressbar\"\n >\n {indeterminate ? (\n <div\n className={cn(\n 'absolute inset-y-0 left-0 w-2/5 rounded-full animate-sbk-indeterminate motion-reduce:w-full motion-reduce:animate-pulse',\n TONE_CLASS[tone],\n )}\n />\n ) : (\n <div\n className={cn(\n 'h-full rounded-full transition-[width] duration-300 motion-reduce:transition-none',\n TONE_CLASS[tone],\n )}\n style={{ width: `${clamped}%` }}\n />\n )}\n </div>\n {showValue && !indeterminate && (\n <span\n aria-hidden=\"true\"\n className=\"w-10 shrink-0 text-right text-xs font-semibold text-sbk-fg-muted\"\n >\n {clamped}%\n </span>\n )}\n </div>\n );\n};\n\nProgressBar.displayName = 'ProgressBar';\n"],"names":["SIZE_CLASS","TONE_CLASS","ProgressBar","value","indeterminate","size","tone","label","showValue","className","props","clamped","jsxs","cn","jsx"],"mappings":";;AAgBA,MAAMA,IAAa,EAAE,IAAI,OAAO,IAAI,OAAO,IAAI,MAAA,GAEzCC,IAAoE;AAAA,EACxE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR,GAGaC,IAAc,CAAC;AAAA,EAC1B,OAAAC,IAAQ;AAAA,EACR,eAAAC,IAAgB;AAAA,EAChB,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,GAAGC;AACL,MAAwB;AACtB,QAAMC,IAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGR,CAAK,CAAC;AAEhD,SACE,gBAAAS,EAAC,SAAI,WAAWC,EAAG,2BAA2BJ,CAAS,GAAI,GAAGC,GAC5D,UAAA;AAAA,IAAA,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAWV,KAAiB;AAAA,QAC5B,cAAYG;AAAA,QACZ,iBAAeH,IAAgB,SAAY;AAAA,QAC3C,iBAAeA,IAAgB,SAAY;AAAA,QAC3C,iBAAeA,IAAgB,SAAYO;AAAA,QAC3C,WAAWE;AAAA,UACT;AAAA,UACAb,EAAWK,CAAI;AAAA,QAAA;AAAA,QAEjB,MAAK;AAAA,QAEJ,UAAAD,IACC,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAZ,EAAWK,CAAI;AAAA,YAAA;AAAA,UACjB;AAAA,QAAA,IAGF,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAZ,EAAWK,CAAI;AAAA,YAAA;AAAA,YAEjB,OAAO,EAAE,OAAO,GAAGK,CAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MAChC;AAAA,IAAA;AAAA,IAGHH,KAAa,CAACJ,KACb,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,QAET,UAAA;AAAA,UAAAD;AAAA,UAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,GAEJ;AAEJ;AAEAT,EAAY,cAAc;"}
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Barra animada sem valor conhecido (carregamento em andamento). */\r\n indeterminate?: boolean;\r\n /** Label acessível. Obrigatório quando não houver texto visível associado. */\r\n label?: string;\r\n /** Exibe o percentual ao lado da barra. */\r\n showValue?: boolean;\r\n size?: 'sm' | 'md' | 'lg';\r\n tone?: 'primary' | 'success' | 'warning' | 'error' | 'info';\r\n /** Valor atual (0 a 100). Ignorado quando `indeterminate`. */\r\n value?: number;\r\n}\r\n\r\nconst SIZE_CLASS = { sm: 'h-1', md: 'h-2', lg: 'h-3' } as const;\r\n\r\nconst TONE_CLASS: Record<NonNullable<ProgressBarProps['tone']>, string> = {\r\n primary: 'bg-sbk-primary',\r\n success: 'bg-sbk-success',\r\n warning: 'bg-sbk-warning',\r\n error: 'bg-sbk-error',\r\n info: 'bg-sbk-info',\r\n};\r\n\r\n/** Barra de progresso determinada ou indeterminada (\"bar load\"). */\r\nexport const ProgressBar = ({\r\n value = 0,\r\n indeterminate = false,\r\n size = 'md',\r\n tone = 'primary',\r\n label,\r\n showValue = false,\r\n className,\r\n ...props\r\n}: ProgressBarProps) => {\r\n const clamped = Math.min(100, Math.max(0, value));\r\n\r\n return (\r\n <div className={cn('flex items-center gap-2', className)} {...props}>\r\n <div\r\n aria-busy={indeterminate || undefined}\r\n aria-label={label}\r\n aria-valuemax={indeterminate ? undefined : 100}\r\n aria-valuemin={indeterminate ? undefined : 0}\r\n aria-valuenow={indeterminate ? undefined : clamped}\r\n className={cn(\r\n 'relative flex-1 overflow-hidden rounded-full bg-sbk-surface-sunken',\r\n SIZE_CLASS[size],\r\n )}\r\n role=\"progressbar\"\r\n >\r\n {indeterminate ? (\r\n <div\r\n className={cn(\r\n 'absolute inset-y-0 left-0 w-2/5 rounded-full animate-sbk-indeterminate motion-reduce:w-full motion-reduce:animate-pulse',\r\n TONE_CLASS[tone],\r\n )}\r\n />\r\n ) : (\r\n <div\r\n className={cn(\r\n 'h-full rounded-full transition-[width] duration-300 motion-reduce:transition-none',\r\n TONE_CLASS[tone],\r\n )}\r\n style={{ width: `${clamped}%` }}\r\n />\r\n )}\r\n </div>\r\n {showValue && !indeterminate && (\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"w-10 shrink-0 text-right text-xs font-semibold text-sbk-fg-muted\"\r\n >\r\n {clamped}%\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nProgressBar.displayName = 'ProgressBar';\r\n"],"names":["SIZE_CLASS","TONE_CLASS","ProgressBar","value","indeterminate","size","tone","label","showValue","className","props","clamped","jsxs","cn","jsx"],"mappings":";;AAgBA,MAAMA,IAAa,EAAE,IAAI,OAAO,IAAI,OAAO,IAAI,MAAA,GAEzCC,IAAoE;AAAA,EACxE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR,GAGaC,IAAc,CAAC;AAAA,EAC1B,OAAAC,IAAQ;AAAA,EACR,eAAAC,IAAgB;AAAA,EAChB,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,GAAGC;AACL,MAAwB;AACtB,QAAMC,IAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGR,CAAK,CAAC;AAEhD,SACE,gBAAAS,EAAC,SAAI,WAAWC,EAAG,2BAA2BJ,CAAS,GAAI,GAAGC,GAC5D,UAAA;AAAA,IAAA,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAWV,KAAiB;AAAA,QAC5B,cAAYG;AAAA,QACZ,iBAAeH,IAAgB,SAAY;AAAA,QAC3C,iBAAeA,IAAgB,SAAY;AAAA,QAC3C,iBAAeA,IAAgB,SAAYO;AAAA,QAC3C,WAAWE;AAAA,UACT;AAAA,UACAb,EAAWK,CAAI;AAAA,QAAA;AAAA,QAEjB,MAAK;AAAA,QAEJ,UAAAD,IACC,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAZ,EAAWK,CAAI;AAAA,YAAA;AAAA,UACjB;AAAA,QAAA,IAGF,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAZ,EAAWK,CAAI;AAAA,YAAA;AAAA,YAEjB,OAAO,EAAE,OAAO,GAAGK,CAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MAChC;AAAA,IAAA;AAAA,IAGHH,KAAa,CAACJ,KACb,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,QAET,UAAA;AAAA,UAAAD;AAAA,UAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,GAEJ;AAEJ;AAEAT,EAAY,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Radio.js","sources":["../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport { cn } from '../../utils/cn';\nimport { choiceControl } from '../../utils/styles';\n\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n helperText?: string;\n label?: React.ReactNode;\n}\n\n/** Radio individual. Agrupe com <fieldset> + <legend> e o mesmo `name`. */\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ label, helperText, className, id, disabled, ...props }, ref) => {\n const autoId = useId();\n const inputId = id ?? autoId;\n\n return (\n <div className={cn('inline-flex items-start gap-2', disabled && 'opacity-60', className)}>\n <input\n ref={ref}\n aria-describedby={helperText ? `${inputId}-helper` : undefined}\n className={cn(choiceControl, 'rounded-full')}\n disabled={disabled}\n id={inputId}\n type=\"radio\"\n {...props}\n />\n <span className=\"grid gap-0.5\">\n {label && (\n <label className=\"cursor-pointer text-sm font-light text-sbk-fg\" htmlFor={inputId}>\n {label}\n </label>\n )}\n {helperText && (\n <span className=\"text-xs font-light text-sbk-fg-muted\" id={`${inputId}-helper`}>\n {helperText}\n </span>\n )}\n </span>\n </div>\n );\n },\n);\n\nRadio.displayName = 'Radio';\n"],"names":["Radio","React","label","helperText","className","id","disabled","props","ref","autoId","useId","inputId","jsxs","cn","jsx","choiceControl"],"mappings":";;;;AAUO,MAAMA,IAAQC,EAAM;AAAA,EACzB,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAAQ;AACjE,UAAMC,IAASC,EAAA,GACTC,IAAUN,KAAMI;AAEtB,WACE,gBAAAG,EAAC,SAAI,WAAWC,EAAG,iCAAiCP,KAAY,cAAcF,CAAS,GACrF,UAAA;AAAA,MAAA,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,oBAAkBL,IAAa,GAAGQ,CAAO,YAAY;AAAA,UACrD,WAAWE,EAAGE,GAAe,cAAc;AAAA,UAC3C,UAAAT;AAAA,UACA,IAAIK;AAAA,UACJ,MAAK;AAAA,UACJ,GAAGJ;AAAA,QAAA;AAAA,MAAA;AAAA,MAEN,gBAAAK,EAAC,QAAA,EAAK,WAAU,gBACb,UAAA;AAAA,QAAAV,uBACE,SAAA,EAAM,WAAU,iDAAgD,SAASS,GACvE,UAAAT,GACH;AAAA,QAEDC,uBACE,QAAA,EAAK,WAAU,wCAAuC,IAAI,GAAGQ,CAAO,WAClE,UAAAR,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AAEAH,EAAM,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Radio.js","sources":["../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import React, { useId } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { choiceControl } from '../../utils/styles';\r\n\r\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\r\n helperText?: string;\r\n label?: React.ReactNode;\r\n}\r\n\r\n/** Radio individual. Agrupe com <fieldset> + <legend> e o mesmo `name`. */\r\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\r\n ({ label, helperText, className, id, disabled, ...props }, ref) => {\r\n const autoId = useId();\r\n const inputId = id ?? autoId;\r\n\r\n return (\r\n <div className={cn('inline-flex items-start gap-2', disabled && 'opacity-60', className)}>\r\n <input\r\n ref={ref}\r\n aria-describedby={helperText ? `${inputId}-helper` : undefined}\r\n className={cn(choiceControl, 'rounded-full')}\r\n disabled={disabled}\r\n id={inputId}\r\n type=\"radio\"\r\n {...props}\r\n />\r\n <span className=\"grid gap-0.5\">\r\n {label && (\r\n <label className=\"cursor-pointer text-sm font-light text-sbk-fg\" htmlFor={inputId}>\r\n {label}\r\n </label>\r\n )}\r\n {helperText && (\r\n <span className=\"text-xs font-light text-sbk-fg-muted\" id={`${inputId}-helper`}>\r\n {helperText}\r\n </span>\r\n )}\r\n </span>\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nRadio.displayName = 'Radio';\r\n"],"names":["Radio","React","label","helperText","className","id","disabled","props","ref","autoId","useId","inputId","jsxs","cn","jsx","choiceControl"],"mappings":";;;;AAUO,MAAMA,IAAQC,EAAM;AAAA,EACzB,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAAQ;AACjE,UAAMC,IAASC,EAAA,GACTC,IAAUN,KAAMI;AAEtB,WACE,gBAAAG,EAAC,SAAI,WAAWC,EAAG,iCAAiCP,KAAY,cAAcF,CAAS,GACrF,UAAA;AAAA,MAAA,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,oBAAkBL,IAAa,GAAGQ,CAAO,YAAY;AAAA,UACrD,WAAWE,EAAGE,GAAe,cAAc;AAAA,UAC3C,UAAAT;AAAA,UACA,IAAIK;AAAA,UACJ,MAAK;AAAA,UACJ,GAAGJ;AAAA,QAAA;AAAA,MAAA;AAAA,MAEN,gBAAAK,EAAC,QAAA,EAAK,WAAU,gBACb,UAAA;AAAA,QAAAV,uBACE,SAAA,EAAM,WAAU,iDAAgD,SAASS,GACvE,UAAAT,GACH;AAAA,QAEDC,uBACE,QAAA,EAAK,WAAU,wCAAuC,IAAI,GAAGQ,CAAO,WAClE,UAAAR,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AAEAH,EAAM,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SectionHeader.js","sources":["../../../src/components/SectionHeader/SectionHeader.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n actions?: React.ReactNode;\n /** Nível do título. Padrão: h2. */\n as?: 'h2' | 'h3' | 'h4';\n subtitle?: React.ReactNode;\n title: React.ReactNode;\n}\n\nexport const SectionHeader = ({\n title,\n subtitle,\n actions,\n as: Tag = 'h2',\n className,\n ...props\n}: SectionHeaderProps) => (\n <div className={cn('flex flex-wrap items-start justify-between gap-4', className)} {...props}>\n <div className=\"grid min-w-0 gap-1\">\n <Tag className=\"m-0 text-xl font-semibold leading-tight text-sbk-fg-heading\">{title}</Tag>\n {subtitle && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n);\n\nSectionHeader.displayName = 'SectionHeader';\n"],"names":["SectionHeader","title","subtitle","actions","Tag","className","props","jsxs","cn","jsx"],"mappings":";;AAWO,MAAMA,IAAgB,CAAC;AAAA,EAC5B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,IAAIC,IAAM;AAAA,EACV,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC,EAAC,SAAI,WAAWC,EAAG,oDAAoDH,CAAS,GAAI,GAAGC,GACrF,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA,gBAAAE,EAACL,GAAA,EAAI,WAAU,+DAA+D,UAAAH,GAAM;AAAA,IACnFC,KAAY,gBAAAO,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAP,EAAA,CAAS;AAAA,EAAA,GACjF;AAAA,EACCC,KAAW,gBAAAM,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAN,EAAA,CAAQ;AAAA,EAAA,CACzE;AAGFH,EAAc,cAAc;"}
|
|
1
|
+
{"version":3,"file":"SectionHeader.js","sources":["../../../src/components/SectionHeader/SectionHeader.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n actions?: React.ReactNode;\r\n /** Nível do título. Padrão: h2. */\r\n as?: 'h2' | 'h3' | 'h4';\r\n subtitle?: React.ReactNode;\r\n title: React.ReactNode;\r\n}\r\n\r\nexport const SectionHeader = ({\r\n title,\r\n subtitle,\r\n actions,\r\n as: Tag = 'h2',\r\n className,\r\n ...props\r\n}: SectionHeaderProps) => (\r\n <div className={cn('flex flex-wrap items-start justify-between gap-4', className)} {...props}>\r\n <div className=\"grid min-w-0 gap-1\">\r\n <Tag className=\"m-0 text-xl font-semibold leading-tight text-sbk-fg-heading\">{title}</Tag>\r\n {subtitle && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{subtitle}</p>}\r\n </div>\r\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\r\n </div>\r\n);\r\n\r\nSectionHeader.displayName = 'SectionHeader';\r\n"],"names":["SectionHeader","title","subtitle","actions","Tag","className","props","jsxs","cn","jsx"],"mappings":";;AAWO,MAAMA,IAAgB,CAAC;AAAA,EAC5B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,IAAIC,IAAM;AAAA,EACV,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC,EAAC,SAAI,WAAWC,EAAG,oDAAoDH,CAAS,GAAI,GAAGC,GACrF,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA,gBAAAE,EAACL,GAAA,EAAI,WAAU,+DAA+D,UAAAH,GAAM;AAAA,IACnFC,KAAY,gBAAAO,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAP,EAAA,CAAS;AAAA,EAAA,GACjF;AAAA,EACCC,KAAW,gBAAAM,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAN,EAAA,CAAQ;AAAA,EAAA,CACzE;AAGFH,EAAc,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { describedBy, fieldControl, fieldSize, type FieldSize } from '../../utils/styles';\nimport { Field } from '../Field/Field';\n\nexport interface SelectOption {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n error?: string;\n helperText?: string;\n label?: React.ReactNode;\n options: SelectOption[];\n /** Opção vazia inicial (ex.: \"Selecione...\"). */\n placeholder?: string;\n size?: FieldSize;\n}\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n label,\n helperText,\n error,\n options,\n placeholder,\n size = 'md',\n className,\n id,\n required,\n ...props\n },\n ref,\n ) => {\n const autoId = useId();\n const selectId = id ?? autoId;\n\n return (\n <Field error={error} helperText={helperText} id={selectId} label={label} required={required}>\n <div className=\"relative\">\n <select\n ref={ref}\n aria-describedby={describedBy(selectId, error, helperText)}\n aria-invalid={error ? true : undefined}\n className={cn(\n fieldControl,\n fieldSize[size],\n 'cursor-pointer appearance-none pr-10',\n className,\n )}\n id={selectId}\n required={required}\n {...props}\n >\n {placeholder && (\n <option disabled value=\"\">\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option key={option.value} disabled={option.disabled} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-sbk-fg-muted\"\n />\n </div>\n </Field>\n );\n },\n);\n\nSelect.displayName = 'Select';\n"],"names":["Select","React","label","helperText","error","options","placeholder","size","className","id","required","props","ref","autoId","useId","selectId","jsx","Field","jsxs","describedBy","cn","fieldControl","fieldSize","option","ChevronDown"],"mappings":";;;;;;AAsBO,MAAMA,IAASC,EAAM;AAAA,EAC1B,CACE;AAAA,IACE,OAAAC;AAAA,IACA,YAAAC;AAAA,IACA,OAAAC;AAAA,IACA,SAAAC;AAAA,IACA,aAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,WAAAC;AAAA,IACA,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAASC,EAAA,GACTC,IAAWN,KAAMI;AAEvB,WACE,gBAAAG,EAACC,GAAA,EAAM,OAAAb,GAAc,YAAAD,GAAwB,IAAIY,GAAU,OAAAb,GAAc,UAAAQ,GACvE,UAAA,gBAAAQ,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,oBAAkBO,EAAYJ,GAAUX,GAAOD,CAAU;AAAA,UACzD,gBAAcC,IAAQ,KAAO;AAAA,UAC7B,WAAWgB;AAAA,YACTC;AAAA,YACAC,EAAUf,CAAI;AAAA,YACd;AAAA,YACAC;AAAA,UAAA;AAAA,UAEF,IAAIO;AAAA,UACJ,UAAAL;AAAA,UACC,GAAGC;AAAA,UAEH,UAAA;AAAA,YAAAL,uBACE,UAAA,EAAO,UAAQ,IAAC,OAAM,IACpB,UAAAA,GACH;AAAA,YAEDD,EAAQ,IAAI,CAACkB,MACZ,gBAAAP,EAAC,YAA0B,UAAUO,EAAO,UAAU,OAAOA,EAAO,OACjE,UAAAA,EAAO,MAAA,GADGA,EAAO,KAEpB,CACD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEH,gBAAAP;AAAA,QAACQ;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,EAAA,CACF,EAAA,CACF;AAAA,EAEJ;AACF;AAEAxB,EAAO,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["import React, { useId } from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { describedBy, fieldControl, fieldSize, type FieldSize } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface SelectOption {\r\n disabled?: boolean;\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\r\n error?: string;\r\n helperText?: string;\r\n label?: React.ReactNode;\r\n options: SelectOption[];\r\n /** Opção vazia inicial (ex.: \"Selecione...\"). */\r\n placeholder?: string;\r\n size?: FieldSize;\r\n}\r\n\r\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\r\n (\r\n {\r\n label,\r\n helperText,\r\n error,\r\n options,\r\n placeholder,\r\n size = 'md',\r\n className,\r\n id,\r\n required,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const autoId = useId();\r\n const selectId = id ?? autoId;\r\n\r\n return (\r\n <Field error={error} helperText={helperText} id={selectId} label={label} required={required}>\r\n <div className=\"relative\">\r\n <select\r\n ref={ref}\r\n aria-describedby={describedBy(selectId, error, helperText)}\r\n aria-invalid={error ? true : undefined}\r\n className={cn(\r\n fieldControl,\r\n fieldSize[size],\r\n 'cursor-pointer appearance-none pr-10',\r\n className,\r\n )}\r\n id={selectId}\r\n required={required}\r\n {...props}\r\n >\r\n {placeholder && (\r\n <option disabled value=\"\">\r\n {placeholder}\r\n </option>\r\n )}\r\n {options.map((option) => (\r\n <option key={option.value} disabled={option.disabled} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n <ChevronDown\r\n aria-hidden=\"true\"\r\n className=\"pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-sbk-fg-muted\"\r\n />\r\n </div>\r\n </Field>\r\n );\r\n },\r\n);\r\n\r\nSelect.displayName = 'Select';\r\n"],"names":["Select","React","label","helperText","error","options","placeholder","size","className","id","required","props","ref","autoId","useId","selectId","jsx","Field","jsxs","describedBy","cn","fieldControl","fieldSize","option","ChevronDown"],"mappings":";;;;;;AAsBO,MAAMA,IAASC,EAAM;AAAA,EAC1B,CACE;AAAA,IACE,OAAAC;AAAA,IACA,YAAAC;AAAA,IACA,OAAAC;AAAA,IACA,SAAAC;AAAA,IACA,aAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,WAAAC;AAAA,IACA,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAASC,EAAA,GACTC,IAAWN,KAAMI;AAEvB,WACE,gBAAAG,EAACC,GAAA,EAAM,OAAAb,GAAc,YAAAD,GAAwB,IAAIY,GAAU,OAAAb,GAAc,UAAAQ,GACvE,UAAA,gBAAAQ,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,oBAAkBO,EAAYJ,GAAUX,GAAOD,CAAU;AAAA,UACzD,gBAAcC,IAAQ,KAAO;AAAA,UAC7B,WAAWgB;AAAA,YACTC;AAAA,YACAC,EAAUf,CAAI;AAAA,YACd;AAAA,YACAC;AAAA,UAAA;AAAA,UAEF,IAAIO;AAAA,UACJ,UAAAL;AAAA,UACC,GAAGC;AAAA,UAEH,UAAA;AAAA,YAAAL,uBACE,UAAA,EAAO,UAAQ,IAAC,OAAM,IACpB,UAAAA,GACH;AAAA,YAEDD,EAAQ,IAAI,CAACkB,MACZ,gBAAAP,EAAC,YAA0B,UAAUO,EAAO,UAAU,OAAOA,EAAO,OACjE,UAAAA,EAAO,MAAA,GADGA,EAAO,KAEpB,CACD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEH,gBAAAP;AAAA,QAACQ;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,EAAA,CACF,EAAA,CACF;AAAA,EAEJ;AACF;AAEAxB,EAAO,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideNav.js","sources":["../../../src/components/SideNav/SideNav.tsx"],"sourcesContent":["import type React from 'react';\nimport { useId, useState } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, inverseScope, transitionColors } from '../../utils/styles';\n\nexport interface SideNavItem {\n /** Contador ou etiqueta à direita (ex.: pendências). */\n badge?: React.ReactNode;\n /** Subitens: o item vira um grupo expansível. */\n children?: SideNavItem[];\n disabled?: boolean;\n href?: string;\n icon?: React.ReactNode;\n id: string;\n label: string;\n onClick?: () => void;\n}\n\nexport interface SideNavSection {\n id: string;\n items: SideNavItem[];\n /** Título da seção (ex.: \"Cadastros\"). */\n title?: string;\n}\n\nexport interface SideNavLinkRenderProps {\n 'aria-current'?: 'page';\n children: React.ReactNode;\n className: string;\n href: string;\n onClick?: () => void;\n title?: string;\n}\n\nexport interface SideNavProps {\n /** Item ativo (recebe aria-current=\"page\"). */\n activeId?: string;\n 'aria-label'?: string;\n className?: string;\n /** Modo compacto: somente ícones, com o label disponível como tooltip nativo e para leitores de tela. */\n collapsed?: boolean;\n /** Grupos abertos inicialmente. Por padrão, abre o grupo que contém o item ativo. */\n defaultOpenIds?: string[];\n footer?: React.ReactNode;\n header?: React.ReactNode;\n /** Itens simples, ou `sections` para agrupar com títulos. */\n items?: SideNavItem[];\n onNavigate?: (item: SideNavItem) => void;\n /**\n * Renderização customizada de links (integração com React Router, Next.js etc.).\n * Ex.: `renderLink={({ href, ...p }) => <NavLink to={href} {...p} />}`\n */\n renderLink?: (props: SideNavLinkRenderProps) => React.ReactNode;\n sections?: SideNavSection[];\n /** `light`: superfície clara. `dark`: verde escuro. `glass`: Liquid Glass. */\n variant?: 'light' | 'dark' | 'glass';\n}\n\nconst VARIANT_CLASS = {\n light: 'border-r border-sbk-line bg-sbk-surface text-sbk-fg',\n dark: inverseScope,\n glass: 'sbk-glass rounded-none border-y-0 border-l-0 text-sbk-fg',\n} as const;\n\nconst containsActive = (item: SideNavItem, activeId?: string): boolean =>\n !!activeId && (item.id === activeId || !!item.children?.some((c) => containsActive(c, activeId)));\n\n/** Menu de navegação lateral (Navigator): seções, grupos expansíveis, ícones, badges e modo compacto. */\nexport const SideNav = ({\n items,\n sections,\n activeId,\n collapsed = false,\n defaultOpenIds,\n onNavigate,\n renderLink,\n header,\n footer,\n variant = 'light',\n className,\n 'aria-label': ariaLabel = 'Navegação',\n}: SideNavProps) => {\n const allSections: SideNavSection[] = sections ?? [{ id: 'default', items: items ?? [] }];\n const baseId = useId();\n const [openIds, setOpenIds] = useState<string[]>(\n () =>\n defaultOpenIds ??\n allSections\n .flatMap((s) => s.items)\n .filter((i) => i.children && containsActive(i, activeId))\n .map((i) => i.id),\n );\n\n const toggle = (id: string) =>\n setOpenIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\n\n const itemClass = (active: boolean, depth: number, disabled?: boolean) =>\n cn(\n buttonReset,\n 'group relative flex w-full cursor-pointer items-center gap-3 rounded-sbk-sm text-left text-sm no-underline',\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid',\n transitionColors,\n collapsed ? 'size-10 justify-center p-0' : 'min-h-10 px-3 py-2',\n depth > 0 && !collapsed && 'pl-10',\n active\n ? 'bg-sbk-primary-subtle font-semibold text-sbk-fg-heading before:absolute before:inset-y-2 before:left-0 before:w-0.5 before:rounded-full before:bg-sbk-primary before:content-[\"\"]'\n : 'font-light text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\n variant === 'dark' && active && 'bg-sbk-branco/12 before:bg-sbk-branco',\n disabled && 'pointer-events-none opacity-50',\n );\n\n const renderItem = (item: SideNavItem, depth = 0): React.ReactNode => {\n const active = item.id === activeId;\n const content = (\n <>\n {item.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 [&_svg]:size-5\">\n {item.icon}\n </span>\n )}\n <span className={cn('min-w-0 flex-1 truncate', collapsed && 'sr-only')}>{item.label}</span>\n {item.badge && !collapsed && (\n <span className=\"shrink-0 text-xs font-semibold\">{item.badge}</span>\n )}\n </>\n );\n\n if (item.children?.length && !collapsed) {\n const open = openIds.includes(item.id);\n const groupId = `${baseId}-group-${item.id}`;\n return (\n <li key={item.id}>\n <button\n aria-controls={groupId}\n aria-expanded={open}\n className={itemClass(containsActive(item, activeId) && !open, depth, item.disabled)}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n type=\"button\"\n >\n {content}\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'size-4 shrink-0 transition-transform motion-reduce:transition-none',\n open && 'rotate-180',\n )}\n />\n </button>\n {open && (\n <ul className=\"m-0 mt-0.5 grid list-none gap-0.5 p-0\" id={groupId}>\n {item.children.map((child) => renderItem(child, depth + 1))}\n </ul>\n )}\n </li>\n );\n }\n\n const handleClick = () => {\n item.onClick?.();\n onNavigate?.(item);\n };\n const common = {\n 'aria-current': active ? ('page' as const) : undefined,\n className: itemClass(active, depth, item.disabled),\n title: collapsed ? item.label : undefined,\n };\n\n return (\n <li key={item.id}>\n {item.href ? (\n renderLink ? (\n renderLink({ ...common, href: item.href, onClick: handleClick, children: content })\n ) : (\n <a\n {...common}\n aria-disabled={item.disabled || undefined}\n href={item.href}\n onClick={handleClick}\n >\n {content}\n </a>\n )\n ) : (\n <button {...common} disabled={item.disabled} onClick={handleClick} type=\"button\">\n {content}\n </button>\n )}\n </li>\n );\n };\n\n return (\n <aside\n className={cn(\n 'flex h-full shrink-0 flex-col',\n collapsed ? 'w-16 items-center' : 'w-64',\n 'transition-[width] duration-200 motion-reduce:transition-none',\n VARIANT_CLASS[variant],\n className,\n )}\n >\n {header && <div className={cn('shrink-0 px-4 py-4', collapsed && 'px-2')}>{header}</div>}\n <nav\n aria-label={ariaLabel}\n className={cn('min-h-0 flex-1 overflow-y-auto py-2', collapsed ? 'px-3' : 'px-3')}\n >\n {allSections.map((section) => (\n <div key={section.id} className=\"mb-4 last:mb-0\">\n {section.title &&\n (collapsed ? (\n <div aria-hidden=\"true\" className=\"mx-auto my-2 h-px w-6 bg-sbk-line\" />\n ) : (\n <h2\n className=\"m-0 mb-1 px-3 text-xs font-semibold uppercase tracking-wide text-sbk-fg-muted\"\n id={`${baseId}-${section.id}`}\n >\n {section.title}\n </h2>\n ))}\n <ul\n aria-labelledby={section.title && !collapsed ? `${baseId}-${section.id}` : undefined}\n className=\"m-0 grid list-none gap-0.5 p-0\"\n >\n {section.items.map((item) => renderItem(item))}\n </ul>\n </div>\n ))}\n </nav>\n {footer && (\n <div className={cn('shrink-0 border-t border-sbk-line px-4 py-3', collapsed && 'px-2')}>\n {footer}\n </div>\n )}\n </aside>\n );\n};\n\nSideNav.displayName = 'SideNav';\n"],"names":["VARIANT_CLASS","inverseScope","containsActive","item","activeId","_a","c","SideNav","items","sections","collapsed","defaultOpenIds","onNavigate","renderLink","header","footer","variant","className","ariaLabel","allSections","baseId","useId","openIds","setOpenIds","useState","s","i","toggle","id","prev","x","itemClass","active","depth","disabled","cn","buttonReset","transitionColors","renderItem","content","jsxs","Fragment","jsx","open","groupId","ChevronDown","child","handleClick","common","section"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SideNav.js","sources":["../../../src/components/SideNav/SideNav.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { useId, useState } from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, inverseScope, transitionColors } from '../../utils/styles';\r\n\r\nexport interface SideNavItem {\r\n /** Contador ou etiqueta à direita (ex.: pendências). */\r\n badge?: React.ReactNode;\r\n /** Subitens: o item vira um grupo expansível. */\r\n children?: SideNavItem[];\r\n disabled?: boolean;\r\n href?: string;\r\n icon?: React.ReactNode;\r\n id: string;\r\n label: string;\r\n onClick?: () => void;\r\n}\r\n\r\nexport interface SideNavSection {\r\n id: string;\r\n items: SideNavItem[];\r\n /** Título da seção (ex.: \"Cadastros\"). */\r\n title?: string;\r\n}\r\n\r\nexport interface SideNavLinkRenderProps {\r\n 'aria-current'?: 'page';\r\n children: React.ReactNode;\r\n className: string;\r\n href: string;\r\n onClick?: () => void;\r\n title?: string;\r\n}\r\n\r\nexport interface SideNavProps {\r\n /** Item ativo (recebe aria-current=\"page\"). */\r\n activeId?: string;\r\n 'aria-label'?: string;\r\n className?: string;\r\n /** Modo compacto: somente ícones, com o label disponível como tooltip nativo e para leitores de tela. */\r\n collapsed?: boolean;\r\n /** Grupos abertos inicialmente. Por padrão, abre o grupo que contém o item ativo. */\r\n defaultOpenIds?: string[];\r\n footer?: React.ReactNode;\r\n header?: React.ReactNode;\r\n /** Itens simples, ou `sections` para agrupar com títulos. */\r\n items?: SideNavItem[];\r\n onNavigate?: (item: SideNavItem) => void;\r\n /**\r\n * Renderização customizada de links (integração com React Router, Next.js etc.).\r\n * Ex.: `renderLink={({ href, ...p }) => <NavLink to={href} {...p} />}`\r\n */\r\n renderLink?: (props: SideNavLinkRenderProps) => React.ReactNode;\r\n sections?: SideNavSection[];\r\n /** `light`: superfície clara. `dark`: verde escuro. `glass`: Liquid Glass. */\r\n variant?: 'light' | 'dark' | 'glass';\r\n}\r\n\r\nconst VARIANT_CLASS = {\r\n light: 'border-r border-sbk-line bg-sbk-surface text-sbk-fg',\r\n dark: inverseScope,\r\n glass: 'sbk-glass rounded-none border-y-0 border-l-0 text-sbk-fg',\r\n} as const;\r\n\r\nconst containsActive = (item: SideNavItem, activeId?: string): boolean =>\r\n !!activeId && (item.id === activeId || !!item.children?.some((c) => containsActive(c, activeId)));\r\n\r\n/** Menu de navegação lateral (Navigator): seções, grupos expansíveis, ícones, badges e modo compacto. */\r\nexport const SideNav = ({\r\n items,\r\n sections,\r\n activeId,\r\n collapsed = false,\r\n defaultOpenIds,\r\n onNavigate,\r\n renderLink,\r\n header,\r\n footer,\r\n variant = 'light',\r\n className,\r\n 'aria-label': ariaLabel = 'Navegação',\r\n}: SideNavProps) => {\r\n const allSections: SideNavSection[] = sections ?? [{ id: 'default', items: items ?? [] }];\r\n const baseId = useId();\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n () =>\r\n defaultOpenIds ??\r\n allSections\r\n .flatMap((s) => s.items)\r\n .filter((i) => i.children && containsActive(i, activeId))\r\n .map((i) => i.id),\r\n );\r\n\r\n const toggle = (id: string) =>\r\n setOpenIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]));\r\n\r\n const itemClass = (active: boolean, depth: number, disabled?: boolean) =>\r\n cn(\r\n buttonReset,\r\n 'group relative flex w-full cursor-pointer items-center gap-3 rounded-sbk-sm text-left text-sm no-underline',\r\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid',\r\n transitionColors,\r\n collapsed ? 'size-10 justify-center p-0' : 'min-h-10 px-3 py-2',\r\n depth > 0 && !collapsed && 'pl-10',\r\n active\r\n ? 'bg-sbk-primary-subtle font-semibold text-sbk-fg-heading before:absolute before:inset-y-2 before:left-0 before:w-0.5 before:rounded-full before:bg-sbk-primary before:content-[\"\"]'\r\n : 'font-light text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n variant === 'dark' && active && 'bg-sbk-branco/12 before:bg-sbk-branco',\r\n disabled && 'pointer-events-none opacity-50',\r\n );\r\n\r\n const renderItem = (item: SideNavItem, depth = 0): React.ReactNode => {\r\n const active = item.id === activeId;\r\n const content = (\r\n <>\r\n {item.icon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 [&_svg]:size-5\">\r\n {item.icon}\r\n </span>\r\n )}\r\n <span className={cn('min-w-0 flex-1 truncate', collapsed && 'sr-only')}>{item.label}</span>\r\n {item.badge && !collapsed && (\r\n <span className=\"shrink-0 text-xs font-semibold\">{item.badge}</span>\r\n )}\r\n </>\r\n );\r\n\r\n if (item.children?.length && !collapsed) {\r\n const open = openIds.includes(item.id);\r\n const groupId = `${baseId}-group-${item.id}`;\r\n return (\r\n <li key={item.id}>\r\n <button\r\n aria-controls={groupId}\r\n aria-expanded={open}\r\n className={itemClass(containsActive(item, activeId) && !open, depth, item.disabled)}\r\n disabled={item.disabled}\r\n onClick={() => toggle(item.id)}\r\n type=\"button\"\r\n >\r\n {content}\r\n <ChevronDown\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'size-4 shrink-0 transition-transform motion-reduce:transition-none',\r\n open && 'rotate-180',\r\n )}\r\n />\r\n </button>\r\n {open && (\r\n <ul className=\"m-0 mt-0.5 grid list-none gap-0.5 p-0\" id={groupId}>\r\n {item.children.map((child) => renderItem(child, depth + 1))}\r\n </ul>\r\n )}\r\n </li>\r\n );\r\n }\r\n\r\n const handleClick = () => {\r\n item.onClick?.();\r\n onNavigate?.(item);\r\n };\r\n const common = {\r\n 'aria-current': active ? ('page' as const) : undefined,\r\n className: itemClass(active, depth, item.disabled),\r\n title: collapsed ? item.label : undefined,\r\n };\r\n\r\n return (\r\n <li key={item.id}>\r\n {item.href ? (\r\n renderLink ? (\r\n renderLink({ ...common, href: item.href, onClick: handleClick, children: content })\r\n ) : (\r\n <a\r\n {...common}\r\n aria-disabled={item.disabled || undefined}\r\n href={item.href}\r\n onClick={handleClick}\r\n >\r\n {content}\r\n </a>\r\n )\r\n ) : (\r\n <button {...common} disabled={item.disabled} onClick={handleClick} type=\"button\">\r\n {content}\r\n </button>\r\n )}\r\n </li>\r\n );\r\n };\r\n\r\n return (\r\n <aside\r\n className={cn(\r\n 'flex h-full shrink-0 flex-col',\r\n collapsed ? 'w-16 items-center' : 'w-64',\r\n 'transition-[width] duration-200 motion-reduce:transition-none',\r\n VARIANT_CLASS[variant],\r\n className,\r\n )}\r\n >\r\n {header && <div className={cn('shrink-0 px-4 py-4', collapsed && 'px-2')}>{header}</div>}\r\n <nav\r\n aria-label={ariaLabel}\r\n className={cn('min-h-0 flex-1 overflow-y-auto py-2', collapsed ? 'px-3' : 'px-3')}\r\n >\r\n {allSections.map((section) => (\r\n <div key={section.id} className=\"mb-4 last:mb-0\">\r\n {section.title &&\r\n (collapsed ? (\r\n <div aria-hidden=\"true\" className=\"mx-auto my-2 h-px w-6 bg-sbk-line\" />\r\n ) : (\r\n <h2\r\n className=\"m-0 mb-1 px-3 text-xs font-semibold uppercase tracking-wide text-sbk-fg-muted\"\r\n id={`${baseId}-${section.id}`}\r\n >\r\n {section.title}\r\n </h2>\r\n ))}\r\n <ul\r\n aria-labelledby={section.title && !collapsed ? `${baseId}-${section.id}` : undefined}\r\n className=\"m-0 grid list-none gap-0.5 p-0\"\r\n >\r\n {section.items.map((item) => renderItem(item))}\r\n </ul>\r\n </div>\r\n ))}\r\n </nav>\r\n {footer && (\r\n <div className={cn('shrink-0 border-t border-sbk-line px-4 py-3', collapsed && 'px-2')}>\r\n {footer}\r\n </div>\r\n )}\r\n </aside>\r\n );\r\n};\r\n\r\nSideNav.displayName = 'SideNav';\r\n"],"names":["VARIANT_CLASS","inverseScope","containsActive","item","activeId","_a","c","SideNav","items","sections","collapsed","defaultOpenIds","onNavigate","renderLink","header","footer","variant","className","ariaLabel","allSections","baseId","useId","openIds","setOpenIds","useState","s","i","toggle","id","prev","x","itemClass","active","depth","disabled","cn","buttonReset","transitionColors","renderItem","content","jsxs","Fragment","jsx","open","groupId","ChevronDown","child","handleClick","common","section"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Skeleton.js","sources":["../../../src/components/Skeleton/Skeleton.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Atalho para `variant=\"circle\"`. */\n circle?: boolean;\n height?: string;\n /** Número de linhas quando `variant=\"text\"`. A última fica mais curta. */\n lines?: number;\n variant?: 'rect' | 'circle' | 'text';\n width?: string;\n}\n\nconst base = 'animate-pulse bg-sbk-line motion-reduce:animate-none';\n\n/**\n * Placeholder de carregamento. É decorativo (`aria-hidden`): anuncie o estado\n * de carregamento no container com `aria-busy=\"true\"` ou um Spinner.\n */\nexport const Skeleton = ({\n circle = false,\n variant = circle ? 'circle' : 'rect',\n lines = 3,\n width,\n height,\n className,\n style,\n ...props\n}: SkeletonProps) => {\n if (variant === 'text') {\n return (\n <div\n aria-hidden=\"true\"\n className={cn('grid gap-2', className)}\n style={{ width, ...style }}\n {...props}\n >\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className={cn(base, 'h-3 rounded-sbk-xs', i === lines - 1 && lines > 1 && 'w-3/5')}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n aria-hidden=\"true\"\n className={cn(base, variant === 'circle' ? 'rounded-full' : 'rounded-sbk-sm', className)}\n style={{ width, height, ...style }}\n {...props}\n />\n );\n};\n\nSkeleton.displayName = 'Skeleton';\n"],"names":["base","Skeleton","circle","variant","lines","width","height","className","style","props","jsx","cn","_","i"],"mappings":";;AAaA,MAAMA,IAAO,wDAMAC,IAAW,CAAC;AAAA,EACvB,QAAAC,IAAS;AAAA,EACT,SAAAC,IAAUD,IAAS,WAAW;AAAA,EAC9B,OAAAE,IAAQ;AAAA,EACR,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,MACMN,MAAY,SAEZ,gBAAAO;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAWC,EAAG,cAAcJ,CAAS;AAAA,IACrC,OAAO,EAAE,OAAAF,GAAO,GAAGG,EAAA;AAAA,IAClB,GAAGC;AAAA,IAEH,UAAA,MAAM,KAAK,EAAE,QAAQL,KAAS,CAACQ,GAAGC,MACjC,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWC,EAAGX,GAAM,sBAAsBa,MAAMT,IAAQ,KAAKA,IAAQ,KAAK,OAAO;AAAA,MAAA;AAAA,MAD5ES;AAAA,IAAA,CAGR;AAAA,EAAA;AAAA,IAML,gBAAAH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAWC,EAAGX,GAAMG,MAAY,WAAW,iBAAiB,kBAAkBI,CAAS;AAAA,IACvF,OAAO,EAAE,OAAAF,GAAO,QAAAC,GAAQ,GAAGE,EAAA;AAAA,IAC1B,GAAGC;AAAA,EAAA;AAAA;AAKVR,EAAS,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Skeleton.js","sources":["../../../src/components/Skeleton/Skeleton.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Atalho para `variant=\"circle\"`. */\r\n circle?: boolean;\r\n height?: string;\r\n /** Número de linhas quando `variant=\"text\"`. A última fica mais curta. */\r\n lines?: number;\r\n variant?: 'rect' | 'circle' | 'text';\r\n width?: string;\r\n}\r\n\r\nconst base = 'animate-pulse bg-sbk-line motion-reduce:animate-none';\r\n\r\n/**\r\n * Placeholder de carregamento. É decorativo (`aria-hidden`): anuncie o estado\r\n * de carregamento no container com `aria-busy=\"true\"` ou um Spinner.\r\n */\r\nexport const Skeleton = ({\r\n circle = false,\r\n variant = circle ? 'circle' : 'rect',\r\n lines = 3,\r\n width,\r\n height,\r\n className,\r\n style,\r\n ...props\r\n}: SkeletonProps) => {\r\n if (variant === 'text') {\r\n return (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn('grid gap-2', className)}\r\n style={{ width, ...style }}\r\n {...props}\r\n >\r\n {Array.from({ length: lines }, (_, i) => (\r\n <div\r\n key={i}\r\n className={cn(base, 'h-3 rounded-sbk-xs', i === lines - 1 && lines > 1 && 'w-3/5')}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn(base, variant === 'circle' ? 'rounded-full' : 'rounded-sbk-sm', className)}\r\n style={{ width, height, ...style }}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nSkeleton.displayName = 'Skeleton';\r\n"],"names":["base","Skeleton","circle","variant","lines","width","height","className","style","props","jsx","cn","_","i"],"mappings":";;AAaA,MAAMA,IAAO,wDAMAC,IAAW,CAAC;AAAA,EACvB,QAAAC,IAAS;AAAA,EACT,SAAAC,IAAUD,IAAS,WAAW;AAAA,EAC9B,OAAAE,IAAQ;AAAA,EACR,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,MACMN,MAAY,SAEZ,gBAAAO;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAWC,EAAG,cAAcJ,CAAS;AAAA,IACrC,OAAO,EAAE,OAAAF,GAAO,GAAGG,EAAA;AAAA,IAClB,GAAGC;AAAA,IAEH,UAAA,MAAM,KAAK,EAAE,QAAQL,KAAS,CAACQ,GAAGC,MACjC,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWC,EAAGX,GAAM,sBAAsBa,MAAMT,IAAQ,KAAKA,IAAQ,KAAK,OAAO;AAAA,MAAA;AAAA,MAD5ES;AAAA,IAAA,CAGR;AAAA,EAAA;AAAA,IAML,gBAAAH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAWC,EAAGX,GAAMG,MAAY,WAAW,iBAAiB,kBAAkBI,CAAS;AAAA,IACvF,OAAO,EAAE,OAAAF,GAAO,QAAAC,GAAQ,GAAGE,EAAA;AAAA,IAC1B,GAAGC;AAAA,EAAA;AAAA;AAKVR,EAAS,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Spinner.js","sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SpinnerProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\n /** Texto anunciado para leitores de tela. Padrão: \"Carregando\". */\n label?: string;\n /** Exibe o label visualmente ao lado do spinner. */\n showLabel?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** `current` herda a cor do texto (útil dentro de botões). */\n tone?: 'current' | 'primary' | 'muted' | 'inverse';\n}\n\nconst SIZE_CLASS: Record<NonNullable<SpinnerProps['size']>, string> = {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n xl: 'size-10',\n};\n\nconst TONE_CLASS: Record<NonNullable<SpinnerProps['tone']>, string> = {\n current: 'text-current',\n primary: 'text-sbk-primary',\n muted: 'text-sbk-fg-muted',\n inverse: 'text-sbk-branco',\n};\n\n/** Indicador de carregamento circular. Em prefers-reduced-motion a rotação fica mais lenta. */\nexport const Spinner = ({\n size = 'md',\n label = 'Carregando',\n showLabel = false,\n tone = 'current',\n className,\n ...props\n}: SpinnerProps) => (\n <span\n className={cn('inline-flex items-center gap-2', TONE_CLASS[tone], className)}\n role=\"status\"\n {...props}\n >\n <svg\n aria-hidden=\"true\"\n className={cn('animate-spin motion-reduce:[animation-duration:2.5s]', SIZE_CLASS[size])}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2.5\" />\n <path\n d=\"M12 2a10 10 0 0 1 10 10\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth=\"2.5\"\n />\n </svg>\n <span className={showLabel ? 'text-sm font-light text-sbk-fg-muted' : 'sr-only'}>{label}</span>\n </span>\n);\n\nSpinner.displayName = 'Spinner';\n"],"names":["SIZE_CLASS","TONE_CLASS","Spinner","size","label","showLabel","tone","className","props","jsxs","cn","jsx"],"mappings":";;AAaA,MAAMA,IAAgE;AAAA,EACpE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAgE;AAAA,EACpE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX,GAGaC,IAAU,CAAC;AAAA,EACtB,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC,EAAG,kCAAkCT,EAAWK,CAAI,GAAGC,CAAS;AAAA,IAC3E,MAAK;AAAA,IACJ,GAAGC;AAAA,IAEJ,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAWC,EAAG,wDAAwDV,EAAWG,CAAI,CAAC;AAAA,UACtF,MAAK;AAAA,UACL,SAAQ;AAAA,UAER,UAAA;AAAA,YAAA,gBAAAQ,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,eAAc,OAAM,aAAY,OAAM;AAAA,YAC3F,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,eAAc;AAAA,gBACd,aAAY;AAAA,cAAA;AAAA,YAAA;AAAA,UACd;AAAA,QAAA;AAAA,MAAA;AAAA,wBAED,QAAA,EAAK,WAAWN,IAAY,yCAAyC,WAAY,UAAAD,EAAA,CAAM;AAAA,IAAA;AAAA,EAAA;AAC1F;AAGFF,EAAQ,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Spinner.js","sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface SpinnerProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\r\n /** Texto anunciado para leitores de tela. Padrão: \"Carregando\". */\r\n label?: string;\r\n /** Exibe o label visualmente ao lado do spinner. */\r\n showLabel?: boolean;\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n /** `current` herda a cor do texto (útil dentro de botões). */\r\n tone?: 'current' | 'primary' | 'muted' | 'inverse';\r\n}\r\n\r\nconst SIZE_CLASS: Record<NonNullable<SpinnerProps['size']>, string> = {\r\n xs: 'size-3',\r\n sm: 'size-4',\r\n md: 'size-5',\r\n lg: 'size-6',\r\n xl: 'size-10',\r\n};\r\n\r\nconst TONE_CLASS: Record<NonNullable<SpinnerProps['tone']>, string> = {\r\n current: 'text-current',\r\n primary: 'text-sbk-primary',\r\n muted: 'text-sbk-fg-muted',\r\n inverse: 'text-sbk-branco',\r\n};\r\n\r\n/** Indicador de carregamento circular. Em prefers-reduced-motion a rotação fica mais lenta. */\r\nexport const Spinner = ({\r\n size = 'md',\r\n label = 'Carregando',\r\n showLabel = false,\r\n tone = 'current',\r\n className,\r\n ...props\r\n}: SpinnerProps) => (\r\n <span\r\n className={cn('inline-flex items-center gap-2', TONE_CLASS[tone], className)}\r\n role=\"status\"\r\n {...props}\r\n >\r\n <svg\r\n aria-hidden=\"true\"\r\n className={cn('animate-spin motion-reduce:[animation-duration:2.5s]', SIZE_CLASS[size])}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2.5\" />\r\n <path\r\n d=\"M12 2a10 10 0 0 1 10 10\"\r\n stroke=\"currentColor\"\r\n strokeLinecap=\"round\"\r\n strokeWidth=\"2.5\"\r\n />\r\n </svg>\r\n <span className={showLabel ? 'text-sm font-light text-sbk-fg-muted' : 'sr-only'}>{label}</span>\r\n </span>\r\n);\r\n\r\nSpinner.displayName = 'Spinner';\r\n"],"names":["SIZE_CLASS","TONE_CLASS","Spinner","size","label","showLabel","tone","className","props","jsxs","cn","jsx"],"mappings":";;AAaA,MAAMA,IAAgE;AAAA,EACpE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAgE;AAAA,EACpE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX,GAGaC,IAAU,CAAC;AAAA,EACtB,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC,EAAG,kCAAkCT,EAAWK,CAAI,GAAGC,CAAS;AAAA,IAC3E,MAAK;AAAA,IACJ,GAAGC;AAAA,IAEJ,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAWC,EAAG,wDAAwDV,EAAWG,CAAI,CAAC;AAAA,UACtF,MAAK;AAAA,UACL,SAAQ;AAAA,UAER,UAAA;AAAA,YAAA,gBAAAQ,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,eAAc,OAAM,aAAY,OAAM;AAAA,YAC3F,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,eAAc;AAAA,gBACd,aAAY;AAAA,cAAA;AAAA,YAAA;AAAA,UACd;AAAA,QAAA;AAAA,MAAA;AAAA,wBAED,QAAA,EAAK,WAAWN,IAAY,yCAAyC,WAAY,UAAAD,EAAA,CAAM;AAAA,IAAA;AAAA,EAAA;AAC1F;AAGFF,EAAQ,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import type React from 'react';\nimport { Check } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\nexport interface StepperItem {\n description?: string;\n id: string;\n label: string;\n}\n\nexport type StepStatus = 'completed' | 'active' | 'pending';\n\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\n currentStep: string;\n items: StepperItem[];\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport const Stepper: React.FC<StepperProps> = ({\n items,\n currentStep,\n orientation = 'horizontal',\n className,\n ...props\n}) => {\n const currentIndex = items.findIndex((item) => item.id === currentStep);\n const isHorizontal = orientation === 'horizontal';\n\n const getStatus = (index: number): StepStatus => {\n if (index < currentIndex) return 'completed';\n if (index === currentIndex) return 'active';\n return 'pending';\n };\n\n const connectorColor = (isActive: boolean) =>\n isActive ? 'bg-sbk-primary' : 'bg-sbk-line-strong';\n\n return (\n <div\n aria-label=\"Progresso\"\n className={cn(isHorizontal ? 'flex items-start' : 'flex flex-col', className)}\n role=\"list\"\n {...props}\n >\n {items.map((item, index) => {\n const status = getStatus(index);\n const isLast = index === items.length - 1;\n\n return (\n <div\n key={item.id}\n className={cn('flex', isHorizontal ? 'flex-1 flex-col items-center' : 'gap-4')}\n role=\"listitem\"\n >\n {/* ── Indicador + conectores ─────────────────── */}\n <div\n className={cn(\n isHorizontal ? 'flex w-full items-center' : 'flex flex-col items-center',\n )}\n >\n {isHorizontal &&\n /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */\n (index === 0 ? (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n ) : (\n <div\n aria-hidden=\"true\"\n className={cn('h-0.5 flex-1', connectorColor(index <= currentIndex))}\n />\n ))}\n\n {/* Círculo */}\n <div\n aria-current={status === 'active' ? 'step' : undefined}\n className={cn(\n 'relative z-10 flex size-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition-colors motion-reduce:transition-none',\n status === 'completed' && 'border-sbk-primary bg-sbk-primary text-sbk-on-primary',\n status === 'active' && 'border-sbk-primary bg-sbk-surface text-sbk-primary',\n status === 'pending' && 'border-sbk-line-strong bg-sbk-surface text-sbk-fg-muted',\n )}\n >\n {status === 'completed' ? (\n <>\n <Check aria-hidden=\"true\" className=\"size-4\" strokeWidth={2.5} />\n <span className=\"sr-only\">Concluído: </span>\n </>\n ) : (\n index + 1\n )}\n </div>\n\n {isHorizontal ? (\n /* Conector direito: linha colorida se não for último, espaçador se for */\n isLast ? (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n ) : (\n <div\n aria-hidden=\"true\"\n className={cn('h-0.5 flex-1', connectorColor(index < currentIndex))}\n />\n )\n ) : (\n /* Conector vertical (para orientação vertical) */\n !isLast && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'my-1 ml-[1.0625rem] w-0.5 flex-1',\n connectorColor(index < currentIndex),\n )}\n />\n )\n )}\n </div>\n\n {/* ── Label + descrição ──────────────────────── */}\n <div className={cn('mt-2 text-center', !isHorizontal && 'mt-0 pb-6 text-left')}>\n <p\n className={cn(\n 'm-0 text-sm font-semibold leading-tight',\n status === 'active' && 'text-sbk-fg-heading',\n status === 'completed' && 'text-sbk-fg',\n status === 'pending' && 'font-light text-sbk-fg-muted',\n )}\n >\n {item.label}\n </p>\n {item.description && (\n <p className=\"m-0 mt-0.5 text-xs font-light text-sbk-fg-muted\">\n {item.description}\n </p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nStepper.displayName = 'Stepper';\n"],"names":["Stepper","items","currentStep","orientation","className","props","currentIndex","item","isHorizontal","getStatus","index","connectorColor","isActive","jsx","cn","status","isLast","jsxs","Fragment","Check"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { Check } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface StepperItem {\r\n description?: string;\r\n id: string;\r\n label: string;\r\n}\r\n\r\nexport type StepStatus = 'completed' | 'active' | 'pending';\r\n\r\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\r\n currentStep: string;\r\n items: StepperItem[];\r\n orientation?: 'horizontal' | 'vertical';\r\n}\r\n\r\nexport const Stepper: React.FC<StepperProps> = ({\r\n items,\r\n currentStep,\r\n orientation = 'horizontal',\r\n className,\r\n ...props\r\n}) => {\r\n const currentIndex = items.findIndex((item) => item.id === currentStep);\r\n const isHorizontal = orientation === 'horizontal';\r\n\r\n const getStatus = (index: number): StepStatus => {\r\n if (index < currentIndex) return 'completed';\r\n if (index === currentIndex) return 'active';\r\n return 'pending';\r\n };\r\n\r\n const connectorColor = (isActive: boolean) =>\r\n isActive ? 'bg-sbk-primary' : 'bg-sbk-line-strong';\r\n\r\n return (\r\n <div\r\n aria-label=\"Progresso\"\r\n className={cn(isHorizontal ? 'flex items-start' : 'flex flex-col', className)}\r\n role=\"list\"\r\n {...props}\r\n >\r\n {items.map((item, index) => {\r\n const status = getStatus(index);\r\n const isLast = index === items.length - 1;\r\n\r\n return (\r\n <div\r\n key={item.id}\r\n className={cn('flex', isHorizontal ? 'flex-1 flex-col items-center' : 'gap-4')}\r\n role=\"listitem\"\r\n >\r\n {/* ── Indicador + conectores ─────────────────── */}\r\n <div\r\n className={cn(\r\n isHorizontal ? 'flex w-full items-center' : 'flex flex-col items-center',\r\n )}\r\n >\r\n {isHorizontal &&\r\n /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */\r\n (index === 0 ? (\r\n <div className=\"flex-1\" aria-hidden=\"true\" />\r\n ) : (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn('h-0.5 flex-1', connectorColor(index <= currentIndex))}\r\n />\r\n ))}\r\n\r\n {/* Círculo */}\r\n <div\r\n aria-current={status === 'active' ? 'step' : undefined}\r\n className={cn(\r\n 'relative z-10 flex size-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition-colors motion-reduce:transition-none',\r\n status === 'completed' && 'border-sbk-primary bg-sbk-primary text-sbk-on-primary',\r\n status === 'active' && 'border-sbk-primary bg-sbk-surface text-sbk-primary',\r\n status === 'pending' && 'border-sbk-line-strong bg-sbk-surface text-sbk-fg-muted',\r\n )}\r\n >\r\n {status === 'completed' ? (\r\n <>\r\n <Check aria-hidden=\"true\" className=\"size-4\" strokeWidth={2.5} />\r\n <span className=\"sr-only\">Concluído: </span>\r\n </>\r\n ) : (\r\n index + 1\r\n )}\r\n </div>\r\n\r\n {isHorizontal ? (\r\n /* Conector direito: linha colorida se não for último, espaçador se for */\r\n isLast ? (\r\n <div className=\"flex-1\" aria-hidden=\"true\" />\r\n ) : (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn('h-0.5 flex-1', connectorColor(index < currentIndex))}\r\n />\r\n )\r\n ) : (\r\n /* Conector vertical (para orientação vertical) */\r\n !isLast && (\r\n <div\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'my-1 ml-[1.0625rem] w-0.5 flex-1',\r\n connectorColor(index < currentIndex),\r\n )}\r\n />\r\n )\r\n )}\r\n </div>\r\n\r\n {/* ── Label + descrição ──────────────────────── */}\r\n <div className={cn('mt-2 text-center', !isHorizontal && 'mt-0 pb-6 text-left')}>\r\n <p\r\n className={cn(\r\n 'm-0 text-sm font-semibold leading-tight',\r\n status === 'active' && 'text-sbk-fg-heading',\r\n status === 'completed' && 'text-sbk-fg',\r\n status === 'pending' && 'font-light text-sbk-fg-muted',\r\n )}\r\n >\r\n {item.label}\r\n </p>\r\n {item.description && (\r\n <p className=\"m-0 mt-0.5 text-xs font-light text-sbk-fg-muted\">\r\n {item.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nStepper.displayName = 'Stepper';\r\n"],"names":["Stepper","items","currentStep","orientation","className","props","currentIndex","item","isHorizontal","getStatus","index","connectorColor","isActive","jsx","cn","status","isLast","jsxs","Fragment","Check"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Subtitle.js","sources":["../../../src/components/Subtitle/Subtitle.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { type TextWeight, weightClass } from '../Typography/weight';\n\nexport interface SubtitleProps extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'p' | 'span' | 'div' | 'h2' | 'h3' | 'h4';\n children: React.ReactNode;\n italic?: boolean;\n /** Cor secundária (Chumbo Leve). */\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n /** Padrão: semibold (brand book: subtítulos em Seminegrito). */\n weight?: TextWeight;\n}\n\nconst SIZE_CLASS = { xs: 'text-xs', sm: 'text-sm', md: 'text-base', lg: 'text-lg' } as const;\nconst ALIGN_CLASS = { left: 'text-left', center: 'text-center', right: 'text-right' } as const;\n\nexport const Subtitle = ({\n as: Tag = 'p',\n size = 'md',\n weight = 'semibold',\n align = 'left',\n muted = false,\n italic = false,\n children,\n className,\n ...props\n}: SubtitleProps) => (\n <Tag\n className={cn(\n 'm-0 font-sbk leading-snug',\n SIZE_CLASS[size],\n weightClass(weight),\n ALIGN_CLASS[align],\n muted ? 'text-sbk-fg-muted' : 'text-sbk-fg',\n italic && 'italic',\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n);\n\nSubtitle.displayName = 'Subtitle';\n"],"names":["SIZE_CLASS","ALIGN_CLASS","Subtitle","Tag","size","weight","align","muted","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAAa,EAAE,IAAI,WAAW,IAAI,WAAW,IAAI,aAAa,IAAI,UAAA,GAClEC,IAAc,EAAE,MAAM,aAAa,QAAQ,eAAe,OAAO,aAAA,GAE1DC,IAAW,CAAC;AAAA,EACvB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAb,EAAWI,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBJ,EAAYK,CAAK;AAAA,MACjBC,IAAQ,sBAAsB;AAAA,MAC9BC,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAS,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Subtitle.js","sources":["../../../src/components/Subtitle/Subtitle.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { type TextWeight, weightClass } from '../Typography/weight';\r\n\r\nexport interface SubtitleProps extends React.HTMLAttributes<HTMLParagraphElement> {\r\n align?: 'left' | 'center' | 'right';\r\n as?: 'p' | 'span' | 'div' | 'h2' | 'h3' | 'h4';\r\n children: React.ReactNode;\r\n italic?: boolean;\r\n /** Cor secundária (Chumbo Leve). */\r\n muted?: boolean;\r\n size?: 'xs' | 'sm' | 'md' | 'lg';\r\n /** Padrão: semibold (brand book: subtítulos em Seminegrito). */\r\n weight?: TextWeight;\r\n}\r\n\r\nconst SIZE_CLASS = { xs: 'text-xs', sm: 'text-sm', md: 'text-base', lg: 'text-lg' } as const;\r\nconst ALIGN_CLASS = { left: 'text-left', center: 'text-center', right: 'text-right' } as const;\r\n\r\nexport const Subtitle = ({\r\n as: Tag = 'p',\r\n size = 'md',\r\n weight = 'semibold',\r\n align = 'left',\r\n muted = false,\r\n italic = false,\r\n children,\r\n className,\r\n ...props\r\n}: SubtitleProps) => (\r\n <Tag\r\n className={cn(\r\n 'm-0 font-sbk leading-snug',\r\n SIZE_CLASS[size],\r\n weightClass(weight),\r\n ALIGN_CLASS[align],\r\n muted ? 'text-sbk-fg-muted' : 'text-sbk-fg',\r\n italic && 'italic',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </Tag>\r\n);\r\n\r\nSubtitle.displayName = 'Subtitle';\r\n"],"names":["SIZE_CLASS","ALIGN_CLASS","Subtitle","Tag","size","weight","align","muted","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAAa,EAAE,IAAI,WAAW,IAAI,WAAW,IAAI,aAAa,IAAI,UAAA,GAClEC,IAAc,EAAE,MAAM,aAAa,QAAQ,eAAe,OAAO,aAAA,GAE1DC,IAAW,CAAC;AAAA,EACvB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAb,EAAWI,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBJ,EAAYK,CAAK;AAAA,MACjBC,IAAQ,sBAAsB;AAAA,MAC9BC,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAS,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.js","sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\n\nexport interface SwitchProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'onChange'\n> {\n checked?: boolean;\n label?: React.ReactNode;\n onCheckedChange?: (checked: boolean) => void;\n size?: 'sm' | 'md';\n}\n\nconst TRACK = { sm: 'h-5 w-9', md: 'h-6 w-11' } as const;\nconst THUMB = { sm: 'size-4', md: 'size-5' } as const;\nconst THUMB_ON = { sm: 'translate-x-4', md: 'translate-x-5' } as const;\n\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n (\n { checked = false, onCheckedChange, label, size = 'md', className, id, disabled, ...props },\n ref,\n ) => {\n const autoId = useId();\n const switchId = id ?? autoId;\n\n return (\n <div className={cn('inline-flex items-center gap-2', disabled && 'opacity-60', className)}>\n <button\n ref={ref}\n aria-checked={checked}\n className={cn(\n buttonReset,\n 'relative inline-flex shrink-0 cursor-pointer items-center rounded-full border disabled:cursor-not-allowed',\n TRACK[size],\n transitionColors,\n focusRing,\n checked\n ? 'border-sbk-primary bg-sbk-primary'\n : 'border-sbk-line-strong bg-sbk-surface-sunken',\n )}\n disabled={disabled}\n id={switchId}\n onClick={() => onCheckedChange?.(!checked)}\n role=\"switch\"\n type=\"button\"\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'inline-block rounded-full bg-sbk-branco shadow-sbk-sm transition-transform duration-150 motion-reduce:transition-none',\n THUMB[size],\n checked ? THUMB_ON[size] : 'translate-x-0.5',\n )}\n />\n </button>\n {label && (\n <label className=\"cursor-pointer text-sm font-light text-sbk-fg\" htmlFor={switchId}>\n {label}\n </label>\n )}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["TRACK","THUMB","THUMB_ON","Switch","React","checked","onCheckedChange","label","size","className","id","disabled","props","ref","autoId","useId","switchId","jsxs","cn","jsx","buttonReset","transitionColors","focusRing"],"mappings":";;;;AAcA,MAAMA,IAAQ,EAAE,IAAI,WAAW,IAAI,WAAA,GAC7BC,IAAQ,EAAE,IAAI,UAAU,IAAI,SAAA,GAC5BC,IAAW,EAAE,IAAI,iBAAiB,IAAI,gBAAA,GAE/BC,IAASC,EAAM;AAAA,EAC1B,CACE,EAAE,SAAAC,IAAU,IAAO,iBAAAC,GAAiB,OAAAC,GAAO,MAAAC,IAAO,MAAM,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GACpFC,MACG;AACH,UAAMC,IAASC,EAAA,GACTC,IAAWN,KAAMI;AAEvB,WACE,gBAAAG,EAAC,SAAI,WAAWC,EAAG,kCAAkCP,KAAY,cAAcF,CAAS,GACtF,UAAA;AAAA,MAAA,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,gBAAcR;AAAA,UACd,WAAWa;AAAA,YACTE;AAAA,YACA;AAAA,YACApB,EAAMQ,CAAI;AAAA,YACVa;AAAA,YACAC;AAAA,YACAjB,IACI,sCACA;AAAA,UAAA;AAAA,UAEN,UAAAM;AAAA,UACA,IAAIK;AAAA,UACJ,SAAS,MAAMV,KAAA,gBAAAA,EAAkB,CAACD;AAAA,UAClC,MAAK;AAAA,UACL,MAAK;AAAA,UACJ,GAAGO;AAAA,UAEJ,UAAA,gBAAAO;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAWD;AAAA,gBACT;AAAA,gBACAjB,EAAMO,CAAI;AAAA,gBACVH,IAAUH,EAASM,CAAI,IAAI;AAAA,cAAA;AAAA,YAC7B;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,MAEDD,KACC,gBAAAY,EAAC,SAAA,EAAM,WAAU,iDAAgD,SAASH,GACvE,UAAAT,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEAJ,EAAO,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import React, { useId } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\n\r\nexport interface SwitchProps extends Omit<\r\n React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n 'onChange'\r\n> {\r\n checked?: boolean;\r\n label?: React.ReactNode;\r\n onCheckedChange?: (checked: boolean) => void;\r\n size?: 'sm' | 'md';\r\n}\r\n\r\nconst TRACK = { sm: 'h-5 w-9', md: 'h-6 w-11' } as const;\r\nconst THUMB = { sm: 'size-4', md: 'size-5' } as const;\r\nconst THUMB_ON = { sm: 'translate-x-4', md: 'translate-x-5' } as const;\r\n\r\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\r\n (\r\n { checked = false, onCheckedChange, label, size = 'md', className, id, disabled, ...props },\r\n ref,\r\n ) => {\r\n const autoId = useId();\r\n const switchId = id ?? autoId;\r\n\r\n return (\r\n <div className={cn('inline-flex items-center gap-2', disabled && 'opacity-60', className)}>\r\n <button\r\n ref={ref}\r\n aria-checked={checked}\r\n className={cn(\r\n buttonReset,\r\n 'relative inline-flex shrink-0 cursor-pointer items-center rounded-full border disabled:cursor-not-allowed',\r\n TRACK[size],\r\n transitionColors,\r\n focusRing,\r\n checked\r\n ? 'border-sbk-primary bg-sbk-primary'\r\n : 'border-sbk-line-strong bg-sbk-surface-sunken',\r\n )}\r\n disabled={disabled}\r\n id={switchId}\r\n onClick={() => onCheckedChange?.(!checked)}\r\n role=\"switch\"\r\n type=\"button\"\r\n {...props}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'inline-block rounded-full bg-sbk-branco shadow-sbk-sm transition-transform duration-150 motion-reduce:transition-none',\r\n THUMB[size],\r\n checked ? THUMB_ON[size] : 'translate-x-0.5',\r\n )}\r\n />\r\n </button>\r\n {label && (\r\n <label className=\"cursor-pointer text-sm font-light text-sbk-fg\" htmlFor={switchId}>\r\n {label}\r\n </label>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nSwitch.displayName = 'Switch';\r\n"],"names":["TRACK","THUMB","THUMB_ON","Switch","React","checked","onCheckedChange","label","size","className","id","disabled","props","ref","autoId","useId","switchId","jsxs","cn","jsx","buttonReset","transitionColors","focusRing"],"mappings":";;;;AAcA,MAAMA,IAAQ,EAAE,IAAI,WAAW,IAAI,WAAA,GAC7BC,IAAQ,EAAE,IAAI,UAAU,IAAI,SAAA,GAC5BC,IAAW,EAAE,IAAI,iBAAiB,IAAI,gBAAA,GAE/BC,IAASC,EAAM;AAAA,EAC1B,CACE,EAAE,SAAAC,IAAU,IAAO,iBAAAC,GAAiB,OAAAC,GAAO,MAAAC,IAAO,MAAM,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GACpFC,MACG;AACH,UAAMC,IAASC,EAAA,GACTC,IAAWN,KAAMI;AAEvB,WACE,gBAAAG,EAAC,SAAI,WAAWC,EAAG,kCAAkCP,KAAY,cAAcF,CAAS,GACtF,UAAA;AAAA,MAAA,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,gBAAcR;AAAA,UACd,WAAWa;AAAA,YACTE;AAAA,YACA;AAAA,YACApB,EAAMQ,CAAI;AAAA,YACVa;AAAA,YACAC;AAAA,YACAjB,IACI,sCACA;AAAA,UAAA;AAAA,UAEN,UAAAM;AAAA,UACA,IAAIK;AAAA,UACJ,SAAS,MAAMV,KAAA,gBAAAA,EAAkB,CAACD;AAAA,UAClC,MAAK;AAAA,UACL,MAAK;AAAA,UACJ,GAAGO;AAAA,UAEJ,UAAA,gBAAAO;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAWD;AAAA,gBACT;AAAA,gBACAjB,EAAMO,CAAI;AAAA,gBACVH,IAAUH,EAASM,CAAI,IAAI;AAAA,cAAA;AAAA,YAC7B;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,MAEDD,KACC,gBAAAY,EAAC,SAAA,EAAM,WAAU,iDAAgD,SAASH,GACvE,UAAAT,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAEAJ,EAAO,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.js","sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {\n /** Legenda da tabela (visível ou apenas para leitores de tela com `captionHidden`). */\n caption?: React.ReactNode;\n captionHidden?: boolean;\n /** Linhas mais baixas. */\n dense?: boolean;\n /** Realce de hover nas linhas do corpo. Padrão: true. */\n hoverable?: boolean;\n /** Linhas zebradas. */\n striped?: boolean;\n /** Classe do container com rolagem horizontal. */\n wrapperClassName?: string;\n}\n\n/**\n * Tabela estilizada. Use <thead>/<tbody> com <th scope=\"col\"> normalmente;\n * o estilo das células é aplicado pelo componente.\n */\nexport const Table = ({\n caption,\n captionHidden = false,\n dense = false,\n hoverable = true,\n striped = false,\n className,\n wrapperClassName,\n children,\n ...props\n}: TableProps) => (\n <div\n className={cn(\n 'overflow-x-auto rounded-sbk-sm border border-sbk-line bg-sbk-surface',\n wrapperClassName,\n )}\n >\n <table\n className={cn(\n 'w-full border-collapse text-left text-sm text-sbk-fg',\n '[&_th]:bg-sbk-surface-sunken [&_th]:font-semibold [&_th]:text-sbk-fg-heading [&_th]:text-xs [&_th]:uppercase [&_th]:tracking-wide',\n '[&_td]:font-light [&_td]:border-t [&_td]:border-sbk-line',\n dense\n ? '[&_td]:px-3 [&_td]:py-2 [&_th]:px-3 [&_th]:py-2'\n : '[&_td]:px-4 [&_td]:py-3 [&_th]:px-4 [&_th]:py-3',\n hoverable && '[&_tbody_tr:hover]:bg-sbk-surface-hover',\n striped && '[&_tbody_tr:nth-child(even)]:bg-sbk-surface-sunken',\n className,\n )}\n {...props}\n >\n {caption && (\n <caption\n className={cn(\n 'px-4 py-3 text-left text-sm font-semibold text-sbk-fg-heading',\n captionHidden && 'sr-only',\n )}\n >\n {caption}\n </caption>\n )}\n {children}\n </table>\n </div>\n);\n\nTable.displayName = 'Table';\n"],"names":["Table","caption","captionHidden","dense","hoverable","striped","className","wrapperClassName","children","props","jsx","cn","jsxs"],"mappings":";;AAqBO,MAAMA,IAAQ,CAAC;AAAA,EACpB,SAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAJ;AAAA,IAAA;AAAA,IAGF,UAAA,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACAR,IACI,oDACA;AAAA,UACJC,KAAa;AAAA,UACbC,KAAW;AAAA,UACXC;AAAA,QAAA;AAAA,QAED,GAAGG;AAAA,QAEH,UAAA;AAAA,UAAAR,KACC,gBAAAS;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWC;AAAA,gBACT;AAAA,gBACAT,KAAiB;AAAA,cAAA;AAAA,cAGlB,UAAAD;AAAA,YAAA;AAAA,UAAA;AAAA,UAGJO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH;AACF;AAGFR,EAAM,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {\r\n /** Legenda da tabela (visível ou apenas para leitores de tela com `captionHidden`). */\r\n caption?: React.ReactNode;\r\n captionHidden?: boolean;\r\n /** Linhas mais baixas. */\r\n dense?: boolean;\r\n /** Realce de hover nas linhas do corpo. Padrão: true. */\r\n hoverable?: boolean;\r\n /** Linhas zebradas. */\r\n striped?: boolean;\r\n /** Classe do container com rolagem horizontal. */\r\n wrapperClassName?: string;\r\n}\r\n\r\n/**\r\n * Tabela estilizada. Use <thead>/<tbody> com <th scope=\"col\"> normalmente;\r\n * o estilo das células é aplicado pelo componente.\r\n */\r\nexport const Table = ({\r\n caption,\r\n captionHidden = false,\r\n dense = false,\r\n hoverable = true,\r\n striped = false,\r\n className,\r\n wrapperClassName,\r\n children,\r\n ...props\r\n}: TableProps) => (\r\n <div\r\n className={cn(\r\n 'overflow-x-auto rounded-sbk-sm border border-sbk-line bg-sbk-surface',\r\n wrapperClassName,\r\n )}\r\n >\r\n <table\r\n className={cn(\r\n 'w-full border-collapse text-left text-sm text-sbk-fg',\r\n '[&_th]:bg-sbk-surface-sunken [&_th]:font-semibold [&_th]:text-sbk-fg-heading [&_th]:text-xs [&_th]:uppercase [&_th]:tracking-wide',\r\n '[&_td]:font-light [&_td]:border-t [&_td]:border-sbk-line',\r\n dense\r\n ? '[&_td]:px-3 [&_td]:py-2 [&_th]:px-3 [&_th]:py-2'\r\n : '[&_td]:px-4 [&_td]:py-3 [&_th]:px-4 [&_th]:py-3',\r\n hoverable && '[&_tbody_tr:hover]:bg-sbk-surface-hover',\r\n striped && '[&_tbody_tr:nth-child(even)]:bg-sbk-surface-sunken',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {caption && (\r\n <caption\r\n className={cn(\r\n 'px-4 py-3 text-left text-sm font-semibold text-sbk-fg-heading',\r\n captionHidden && 'sr-only',\r\n )}\r\n >\r\n {caption}\r\n </caption>\r\n )}\r\n {children}\r\n </table>\r\n </div>\r\n);\r\n\r\nTable.displayName = 'Table';\r\n"],"names":["Table","caption","captionHidden","dense","hoverable","striped","className","wrapperClassName","children","props","jsx","cn","jsxs"],"mappings":";;AAqBO,MAAMA,IAAQ,CAAC;AAAA,EACpB,SAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAJ;AAAA,IAAA;AAAA,IAGF,UAAA,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACAR,IACI,oDACA;AAAA,UACJC,KAAa;AAAA,UACbC,KAAW;AAAA,UACXC;AAAA,QAAA;AAAA,QAED,GAAGG;AAAA,QAEH,UAAA;AAAA,UAAAR,KACC,gBAAAS;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWC;AAAA,gBACT;AAAA,gBACAT,KAAiB;AAAA,cAAA;AAAA,cAGlB,UAAAD;AAAA,YAAA;AAAA,UAAA;AAAA,UAGJO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH;AACF;AAGFR,EAAM,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import type React from 'react';\nimport { useId, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, transitionColors } from '../../utils/styles';\n\nexport interface TabItem {\n content: React.ReactNode;\n disabled?: boolean;\n icon?: React.ReactNode;\n id: string;\n label: React.ReactNode;\n}\n\nexport interface TabsProps {\n /** Rótulo acessível da lista de abas. */\n 'aria-label'?: string;\n className?: string;\n defaultTabId?: string;\n items: TabItem[];\n onTabChange?: (id: string) => void;\n /** Aba ativa controlada externamente. */\n tabId?: string;\n /** `pill`: segmentado. `line`: sublinhado. Padrão: pill. */\n variant?: 'pill' | 'line';\n}\n\nconst TAB_VARIANT = {\n pill: {\n list: 'inline-flex flex-wrap gap-1 rounded-sbk-sm bg-sbk-surface-sunken p-1',\n tab: 'rounded-sbk-xs px-3 py-1.5',\n active: 'bg-sbk-surface text-sbk-fg-heading shadow-sbk-sm',\n idle: 'text-sbk-fg-muted hover:text-sbk-fg',\n },\n line: {\n list: 'flex flex-wrap gap-4 border-b border-sbk-line',\n tab: '-mb-px border-b-2 px-1 py-2.5',\n active: 'border-sbk-primary text-sbk-fg-heading',\n idle: 'border-transparent text-sbk-fg-muted hover:border-sbk-line-strong hover:text-sbk-fg',\n },\n} as const;\n\n/** Abas (padrão ARIA tabs com ativação automática): setas, Home e End. */\nexport const Tabs = ({\n items,\n defaultTabId,\n tabId,\n onTabChange,\n variant = 'pill',\n className,\n 'aria-label': ariaLabel,\n}: TabsProps) => {\n const [internal, setInternal] = useState(defaultTabId ?? items.find((i) => !i.disabled)?.id);\n const activeId = tabId ?? internal;\n const baseId = useId();\n const listRef = useRef<HTMLDivElement>(null);\n const selected = items.find((item) => item.id === activeId) ?? items[0];\n const styles = TAB_VARIANT[variant];\n\n const select = (id: string) => {\n if (tabId === undefined) setInternal(id);\n onTabChange?.(id);\n };\n\n const onKeyDown = (e: React.KeyboardEvent, index: number) => {\n const enabled = items.map((it, i) => (it.disabled ? -1 : i)).filter((i) => i >= 0);\n const pos = enabled.indexOf(index);\n const next: Record<string, number | undefined> = {\n ArrowRight: enabled[(pos + 1) % enabled.length],\n ArrowLeft: enabled[(pos - 1 + enabled.length) % enabled.length],\n Home: enabled[0],\n End: enabled[enabled.length - 1],\n };\n const target = next[e.key];\n if (target === undefined) return;\n e.preventDefault();\n select(items[target].id);\n listRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')[target]?.focus();\n };\n\n return (\n <div className={cn('grid gap-3', className)}>\n <div\n ref={listRef}\n aria-label={ariaLabel}\n aria-orientation=\"horizontal\"\n className={styles.list}\n role=\"tablist\"\n >\n {items.map((item, index) => {\n const isActive = item.id === selected?.id;\n return (\n <button\n key={item.id}\n aria-controls={`${baseId}-panel-${item.id}`}\n aria-selected={isActive}\n className={cn(\n buttonReset,\n 'inline-flex cursor-pointer items-center gap-2 text-sm font-semibold disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:size-4',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid',\n transitionColors,\n styles.tab,\n isActive ? styles.active : styles.idle,\n )}\n disabled={item.disabled}\n id={`${baseId}-tab-${item.id}`}\n onClick={() => select(item.id)}\n onKeyDown={(e) => onKeyDown(e, index)}\n role=\"tab\"\n tabIndex={isActive ? 0 : -1}\n type=\"button\"\n >\n {item.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex\">\n {item.icon}\n </span>\n )}\n {item.label}\n </button>\n );\n })}\n </div>\n {selected && (\n <div\n aria-labelledby={`${baseId}-tab-${selected.id}`}\n className=\"rounded-sbk-sm font-light text-sbk-fg focus-visible:outline-2 focus-visible:outline-sbk-focus focus-visible:outline-solid\"\n id={`${baseId}-panel-${selected.id}`}\n role=\"tabpanel\"\n tabIndex={0}\n >\n {selected.content}\n </div>\n )}\n </div>\n );\n};\n\nTabs.displayName = 'Tabs';\n"],"names":["TAB_VARIANT","Tabs","items","defaultTabId","tabId","onTabChange","variant","className","ariaLabel","internal","setInternal","useState","_a","i","activeId","baseId","useId","listRef","useRef","selected","item","styles","select","id","onKeyDown","index","enabled","it","pos","target","_b","cn","jsx","isActive","jsxs","buttonReset","transitionColors","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tabs.js","sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { useId, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, transitionColors } from '../../utils/styles';\r\n\r\nexport interface TabItem {\r\n content: React.ReactNode;\r\n disabled?: boolean;\r\n icon?: React.ReactNode;\r\n id: string;\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface TabsProps {\r\n /** Rótulo acessível da lista de abas. */\r\n 'aria-label'?: string;\r\n className?: string;\r\n defaultTabId?: string;\r\n items: TabItem[];\r\n onTabChange?: (id: string) => void;\r\n /** Aba ativa controlada externamente. */\r\n tabId?: string;\r\n /** `pill`: segmentado. `line`: sublinhado. Padrão: pill. */\r\n variant?: 'pill' | 'line';\r\n}\r\n\r\nconst TAB_VARIANT = {\r\n pill: {\r\n list: 'inline-flex flex-wrap gap-1 rounded-sbk-sm bg-sbk-surface-sunken p-1',\r\n tab: 'rounded-sbk-xs px-3 py-1.5',\r\n active: 'bg-sbk-surface text-sbk-fg-heading shadow-sbk-sm',\r\n idle: 'text-sbk-fg-muted hover:text-sbk-fg',\r\n },\r\n line: {\r\n list: 'flex flex-wrap gap-4 border-b border-sbk-line',\r\n tab: '-mb-px border-b-2 px-1 py-2.5',\r\n active: 'border-sbk-primary text-sbk-fg-heading',\r\n idle: 'border-transparent text-sbk-fg-muted hover:border-sbk-line-strong hover:text-sbk-fg',\r\n },\r\n} as const;\r\n\r\n/** Abas (padrão ARIA tabs com ativação automática): setas, Home e End. */\r\nexport const Tabs = ({\r\n items,\r\n defaultTabId,\r\n tabId,\r\n onTabChange,\r\n variant = 'pill',\r\n className,\r\n 'aria-label': ariaLabel,\r\n}: TabsProps) => {\r\n const [internal, setInternal] = useState(defaultTabId ?? items.find((i) => !i.disabled)?.id);\r\n const activeId = tabId ?? internal;\r\n const baseId = useId();\r\n const listRef = useRef<HTMLDivElement>(null);\r\n const selected = items.find((item) => item.id === activeId) ?? items[0];\r\n const styles = TAB_VARIANT[variant];\r\n\r\n const select = (id: string) => {\r\n if (tabId === undefined) setInternal(id);\r\n onTabChange?.(id);\r\n };\r\n\r\n const onKeyDown = (e: React.KeyboardEvent, index: number) => {\r\n const enabled = items.map((it, i) => (it.disabled ? -1 : i)).filter((i) => i >= 0);\r\n const pos = enabled.indexOf(index);\r\n const next: Record<string, number | undefined> = {\r\n ArrowRight: enabled[(pos + 1) % enabled.length],\r\n ArrowLeft: enabled[(pos - 1 + enabled.length) % enabled.length],\r\n Home: enabled[0],\r\n End: enabled[enabled.length - 1],\r\n };\r\n const target = next[e.key];\r\n if (target === undefined) return;\r\n e.preventDefault();\r\n select(items[target].id);\r\n listRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')[target]?.focus();\r\n };\r\n\r\n return (\r\n <div className={cn('grid gap-3', className)}>\r\n <div\r\n ref={listRef}\r\n aria-label={ariaLabel}\r\n aria-orientation=\"horizontal\"\r\n className={styles.list}\r\n role=\"tablist\"\r\n >\r\n {items.map((item, index) => {\r\n const isActive = item.id === selected?.id;\r\n return (\r\n <button\r\n key={item.id}\r\n aria-controls={`${baseId}-panel-${item.id}`}\r\n aria-selected={isActive}\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex cursor-pointer items-center gap-2 text-sm font-semibold disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:size-4',\r\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid',\r\n transitionColors,\r\n styles.tab,\r\n isActive ? styles.active : styles.idle,\r\n )}\r\n disabled={item.disabled}\r\n id={`${baseId}-tab-${item.id}`}\r\n onClick={() => select(item.id)}\r\n onKeyDown={(e) => onKeyDown(e, index)}\r\n role=\"tab\"\r\n tabIndex={isActive ? 0 : -1}\r\n type=\"button\"\r\n >\r\n {item.icon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex\">\r\n {item.icon}\r\n </span>\r\n )}\r\n {item.label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n {selected && (\r\n <div\r\n aria-labelledby={`${baseId}-tab-${selected.id}`}\r\n className=\"rounded-sbk-sm font-light text-sbk-fg focus-visible:outline-2 focus-visible:outline-sbk-focus focus-visible:outline-solid\"\r\n id={`${baseId}-panel-${selected.id}`}\r\n role=\"tabpanel\"\r\n tabIndex={0}\r\n >\r\n {selected.content}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nTabs.displayName = 'Tabs';\r\n"],"names":["TAB_VARIANT","Tabs","items","defaultTabId","tabId","onTabChange","variant","className","ariaLabel","internal","setInternal","useState","_a","i","activeId","baseId","useId","listRef","useRef","selected","item","styles","select","id","onKeyDown","index","enabled","it","pos","target","_b","cn","jsx","isActive","jsxs","buttonReset","transitionColors","e"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tag.js","sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type React from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing } from '../../utils/styles';\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n icon?: React.ReactNode;\n onRemove?: () => void;\n /** Rótulo acessível do botão de remover. Padrão: \"Remover\". */\n removeLabel?: string;\n}\n\n/** Etiqueta de metadado, opcionalmente removível. */\nexport const Tag = ({\n className,\n children,\n icon,\n onRemove,\n removeLabel = 'Remover',\n ...props\n}: TagProps) => (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-sbk-xs border border-sbk-line bg-sbk-surface px-2.5 py-1 text-xs font-light text-sbk-fg [&_svg]:size-3.5',\n className,\n )}\n {...props}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex text-sbk-fg-muted\">\n {icon}\n </span>\n )}\n {children}\n {onRemove && (\n <button\n aria-label={typeof children === 'string' ? `${removeLabel} ${children}` : removeLabel}\n className={cn(\n buttonReset,\n '-mr-1 inline-flex size-4 cursor-pointer items-center justify-center rounded-full text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\n focusRing,\n )}\n onClick={onRemove}\n type=\"button\"\n >\n <X aria-hidden=\"true\" />\n </button>\n )}\n </span>\n);\n\nTag.displayName = 'Tag';\n"],"names":["Tag","className","children","icon","onRemove","removeLabel","props","jsxs","cn","jsx","buttonReset","focusRing","X"],"mappings":";;;;AAaO,MAAMA,IAAM,CAAC;AAAA,EAClB,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAP;AAAA,IAAA;AAAA,IAED,GAAGK;AAAA,IAEH,UAAA;AAAA,MAAAH,uBACE,QAAA,EAAK,eAAY,QAAO,WAAU,iCAChC,UAAAA,GACH;AAAA,MAEDD;AAAA,MACAE,KACC,gBAAAK;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAY,OAAOP,KAAa,WAAW,GAAGG,CAAW,IAAIH,CAAQ,KAAKG;AAAA,UAC1E,WAAWG;AAAA,YACTE;AAAA,YACA;AAAA,YACAC;AAAA,UAAA;AAAA,UAEF,SAASP;AAAA,UACT,MAAK;AAAA,UAEL,UAAA,gBAAAK,EAACG,GAAA,EAAE,eAAY,OAAA,CAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACxB;AAAA,EAAA;AAEJ;AAGFZ,EAAI,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Tag.js","sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { X } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing } from '../../utils/styles';\r\n\r\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n icon?: React.ReactNode;\r\n onRemove?: () => void;\r\n /** Rótulo acessível do botão de remover. Padrão: \"Remover\". */\r\n removeLabel?: string;\r\n}\r\n\r\n/** Etiqueta de metadado, opcionalmente removível. */\r\nexport const Tag = ({\r\n className,\r\n children,\r\n icon,\r\n onRemove,\r\n removeLabel = 'Remover',\r\n ...props\r\n}: TagProps) => (\r\n <span\r\n className={cn(\r\n 'inline-flex items-center gap-1.5 rounded-sbk-xs border border-sbk-line bg-sbk-surface px-2.5 py-1 text-xs font-light text-sbk-fg [&_svg]:size-3.5',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {icon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex text-sbk-fg-muted\">\r\n {icon}\r\n </span>\r\n )}\r\n {children}\r\n {onRemove && (\r\n <button\r\n aria-label={typeof children === 'string' ? `${removeLabel} ${children}` : removeLabel}\r\n className={cn(\r\n buttonReset,\r\n '-mr-1 inline-flex size-4 cursor-pointer items-center justify-center rounded-full text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n focusRing,\r\n )}\r\n onClick={onRemove}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" />\r\n </button>\r\n )}\r\n </span>\r\n);\r\n\r\nTag.displayName = 'Tag';\r\n"],"names":["Tag","className","children","icon","onRemove","removeLabel","props","jsxs","cn","jsx","buttonReset","focusRing","X"],"mappings":";;;;AAaO,MAAMA,IAAM,CAAC;AAAA,EAClB,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAP;AAAA,IAAA;AAAA,IAED,GAAGK;AAAA,IAEH,UAAA;AAAA,MAAAH,uBACE,QAAA,EAAK,eAAY,QAAO,WAAU,iCAChC,UAAAA,GACH;AAAA,MAEDD;AAAA,MACAE,KACC,gBAAAK;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAY,OAAOP,KAAa,WAAW,GAAGG,CAAW,IAAIH,CAAQ,KAAKG;AAAA,UAC1E,WAAWG;AAAA,YACTE;AAAA,YACA;AAAA,YACAC;AAAA,UAAA;AAAA,UAEF,SAASP;AAAA,UACT,MAAK;AAAA,UAEL,UAAA,gBAAAK,EAACG,GAAA,EAAE,eAAY,OAAA,CAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACxB;AAAA,EAAA;AAEJ;AAGFZ,EAAI,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport { cn } from '../../utils/cn';\nimport { describedBy, fieldControl } from '../../utils/styles';\nimport { Field } from '../Field/Field';\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: string;\n helperText?: string;\n label?: React.ReactNode;\n /** Permite redimensionar verticalmente. Padrão: true. */\n resizable?: boolean;\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ label, helperText, error, resizable = true, className, id, required, ...props }, ref) => {\n const autoId = useId();\n const textareaId = id ?? autoId;\n\n return (\n <Field\n error={error}\n helperText={helperText}\n id={textareaId}\n label={label}\n required={required}\n >\n <textarea\n ref={ref}\n aria-describedby={describedBy(textareaId, error, helperText)}\n aria-invalid={error ? true : undefined}\n className={cn(\n fieldControl,\n 'min-h-24 px-3.5 py-2 text-base',\n resizable ? 'resize-y' : 'resize-none',\n className,\n )}\n id={textareaId}\n required={required}\n {...props}\n />\n </Field>\n );\n },\n);\n\nTextarea.displayName = 'Textarea';\n"],"names":["Textarea","React","label","helperText","error","resizable","className","id","required","props","ref","autoId","useId","textareaId","jsx","Field","describedBy","cn","fieldControl"],"mappings":";;;;;AAaO,MAAMA,IAAWC,EAAM;AAAA,EAC5B,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,OAAAC,GAAO,WAAAC,IAAY,IAAM,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAAQ;AAC1F,UAAMC,IAASC,EAAA,GACTC,IAAaN,KAAMI;AAEzB,WACE,gBAAAG;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAAX;AAAA,QACA,YAAAD;AAAA,QACA,IAAIU;AAAA,QACJ,OAAAX;AAAA,QACA,UAAAM;AAAA,QAEA,UAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAJ;AAAA,YACA,oBAAkBM,EAAYH,GAAYT,GAAOD,CAAU;AAAA,YAC3D,gBAAcC,IAAQ,KAAO;AAAA,YAC7B,WAAWa;AAAA,cACTC;AAAA,cACA;AAAA,cACAb,IAAY,aAAa;AAAA,cACzBC;AAAA,YAAA;AAAA,YAEF,IAAIO;AAAA,YACJ,UAAAL;AAAA,YACC,GAAGC;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAGN;AACF;AAEAT,EAAS,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import React, { useId } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { describedBy, fieldControl } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n error?: string;\r\n helperText?: string;\r\n label?: React.ReactNode;\r\n /** Permite redimensionar verticalmente. Padrão: true. */\r\n resizable?: boolean;\r\n}\r\n\r\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n ({ label, helperText, error, resizable = true, className, id, required, ...props }, ref) => {\r\n const autoId = useId();\r\n const textareaId = id ?? autoId;\r\n\r\n return (\r\n <Field\r\n error={error}\r\n helperText={helperText}\r\n id={textareaId}\r\n label={label}\r\n required={required}\r\n >\r\n <textarea\r\n ref={ref}\r\n aria-describedby={describedBy(textareaId, error, helperText)}\r\n aria-invalid={error ? true : undefined}\r\n className={cn(\r\n fieldControl,\r\n 'min-h-24 px-3.5 py-2 text-base',\r\n resizable ? 'resize-y' : 'resize-none',\r\n className,\r\n )}\r\n id={textareaId}\r\n required={required}\r\n {...props}\r\n />\r\n </Field>\r\n );\r\n },\r\n);\r\n\r\nTextarea.displayName = 'Textarea';\r\n"],"names":["Textarea","React","label","helperText","error","resizable","className","id","required","props","ref","autoId","useId","textareaId","jsx","Field","describedBy","cn","fieldControl"],"mappings":";;;;;AAaO,MAAMA,IAAWC,EAAM;AAAA,EAC5B,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,OAAAC,GAAO,WAAAC,IAAY,IAAM,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAAQ;AAC1F,UAAMC,IAASC,EAAA,GACTC,IAAaN,KAAMI;AAEzB,WACE,gBAAAG;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAAX;AAAA,QACA,YAAAD;AAAA,QACA,IAAIU;AAAA,QACJ,OAAAX;AAAA,QACA,UAAAM;AAAA,QAEA,UAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAJ;AAAA,YACA,oBAAkBM,EAAYH,GAAYT,GAAOD,CAAU;AAAA,YAC3D,gBAAcC,IAAQ,KAAO;AAAA,YAC7B,WAAWa;AAAA,cACTC;AAAA,cACA;AAAA,cACAb,IAAY,aAAa;AAAA,cACzBC;AAAA,YAAA;AAAA,YAEF,IAAIO;AAAA,YACJ,UAAAL;AAAA,YACC,GAAGC;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAGN;AACF;AAEAT,EAAS,cAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Title.js","sources":["../../../src/components/Title/Title.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { type TextWeight, weightClass } from '../Typography/weight';\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n align?: 'left' | 'center' | 'right';\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n children: React.ReactNode;\n /** `heading`: Verde Escuro (padrão). `default`: cor de texto. `inherit`: herda do pai. */\n color?: 'heading' | 'default' | 'inherit';\n italic?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n /** Padrão: semibold (Seminegrito, brand book). */\n weight?: TextWeight;\n}\n\nconst SIZE_CLASS: Record<NonNullable<TitleProps['size']>, string> = {\n xs: 'text-sm',\n sm: 'text-base',\n md: 'text-lg',\n lg: 'text-xl',\n xl: 'text-2xl',\n '2xl': 'text-[2rem]',\n '3xl': 'text-[2.5rem]',\n '4xl': 'text-5xl',\n};\n\nconst COLOR_CLASS = {\n heading: 'text-sbk-fg-heading',\n default: 'text-sbk-fg',\n inherit: 'text-inherit',\n} as const;\nconst ALIGN_CLASS = { left: 'text-left', center: 'text-center', right: 'text-right' } as const;\n\nexport const Title = ({\n as: Tag = 'h1',\n size = '2xl',\n weight = 'semibold',\n align = 'left',\n color = 'heading',\n italic = false,\n children,\n className,\n ...props\n}: TitleProps) => (\n <Tag\n className={cn(\n 'm-0 font-sbk leading-tight tracking-[-0.01em] text-balance',\n SIZE_CLASS[size],\n weightClass(weight),\n COLOR_CLASS[color],\n ALIGN_CLASS[align],\n italic && 'italic',\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n);\n\nTitle.displayName = 'Title';\n"],"names":["SIZE_CLASS","COLOR_CLASS","ALIGN_CLASS","Title","Tag","size","weight","align","color","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAA8D;AAAA,EAClE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT,GAEMC,IAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX,GACMC,IAAc,EAAE,MAAM,aAAa,QAAQ,eAAe,OAAO,aAAA,GAE1DC,IAAQ,CAAC;AAAA,EACpB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAd,EAAWK,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBL,EAAYO,CAAK;AAAA,MACjBN,EAAYK,CAAK;AAAA,MACjBE,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAM,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Title.js","sources":["../../../src/components/Title/Title.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { type TextWeight, weightClass } from '../Typography/weight';\r\n\r\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\r\n align?: 'left' | 'center' | 'right';\r\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n children: React.ReactNode;\r\n /** `heading`: Verde Escuro (padrão). `default`: cor de texto. `inherit`: herda do pai. */\r\n color?: 'heading' | 'default' | 'inherit';\r\n italic?: boolean;\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\r\n /** Padrão: semibold (Seminegrito, brand book). */\r\n weight?: TextWeight;\r\n}\r\n\r\nconst SIZE_CLASS: Record<NonNullable<TitleProps['size']>, string> = {\r\n xs: 'text-sm',\r\n sm: 'text-base',\r\n md: 'text-lg',\r\n lg: 'text-xl',\r\n xl: 'text-2xl',\r\n '2xl': 'text-[2rem]',\r\n '3xl': 'text-[2.5rem]',\r\n '4xl': 'text-5xl',\r\n};\r\n\r\nconst COLOR_CLASS = {\r\n heading: 'text-sbk-fg-heading',\r\n default: 'text-sbk-fg',\r\n inherit: 'text-inherit',\r\n} as const;\r\nconst ALIGN_CLASS = { left: 'text-left', center: 'text-center', right: 'text-right' } as const;\r\n\r\nexport const Title = ({\r\n as: Tag = 'h1',\r\n size = '2xl',\r\n weight = 'semibold',\r\n align = 'left',\r\n color = 'heading',\r\n italic = false,\r\n children,\r\n className,\r\n ...props\r\n}: TitleProps) => (\r\n <Tag\r\n className={cn(\r\n 'm-0 font-sbk leading-tight tracking-[-0.01em] text-balance',\r\n SIZE_CLASS[size],\r\n weightClass(weight),\r\n COLOR_CLASS[color],\r\n ALIGN_CLASS[align],\r\n italic && 'italic',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </Tag>\r\n);\r\n\r\nTitle.displayName = 'Title';\r\n"],"names":["SIZE_CLASS","COLOR_CLASS","ALIGN_CLASS","Title","Tag","size","weight","align","color","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAA8D;AAAA,EAClE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT,GAEMC,IAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX,GACMC,IAAc,EAAE,MAAM,aAAa,QAAQ,eAAe,OAAO,aAAA,GAE1DC,IAAQ,CAAC;AAAA,EACpB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAd,EAAWK,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBL,EAAYO,CAAK;AAAA,MACjBN,EAAYK,CAAK;AAAA,MACjBE,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAM,cAAc;"}
|