@sbkbs/ui 1.0.6 → 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.
Files changed (210) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/MIGRATION.md +96 -0
  3. package/README.md +221 -115
  4. package/dist/assets/favicon/apple-touch-icon.png +0 -0
  5. package/dist/assets/favicon/favicon-96x96.png +0 -0
  6. package/dist/assets/favicon/favicon.ico +0 -0
  7. package/dist/assets/favicon/favicon.svg +1 -0
  8. package/dist/assets/favicon/site.webmanifest +21 -0
  9. package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
  10. package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
  11. package/dist/base.css +38 -0
  12. package/dist/components/Accordion/Accordion.d.ts +13 -1
  13. package/dist/components/Accordion/Accordion.js +100 -52
  14. package/dist/components/Accordion/Accordion.js.map +1 -1
  15. package/dist/components/Alert/Alert.d.ts +17 -4
  16. package/dist/components/Alert/Alert.js +64 -20
  17. package/dist/components/Alert/Alert.js.map +1 -1
  18. package/dist/components/Avatar/Avatar.d.ts +12 -6
  19. package/dist/components/Avatar/Avatar.js +66 -0
  20. package/dist/components/Avatar/Avatar.js.map +1 -0
  21. package/dist/components/Badge/Badge.d.ts +11 -2
  22. package/dist/components/Badge/Badge.js +42 -30
  23. package/dist/components/Badge/Badge.js.map +1 -1
  24. package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
  25. package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
  26. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  27. package/dist/components/Button/Button.d.ts +10 -8
  28. package/dist/components/Button/Button.js +73 -114
  29. package/dist/components/Button/Button.js.map +1 -1
  30. package/dist/components/Card/Card.d.ts +33 -3
  31. package/dist/components/Card/Card.js +91 -30
  32. package/dist/components/Card/Card.js.map +1 -1
  33. package/dist/components/Checkbox/Checkbox.d.ts +4 -1
  34. package/dist/components/Checkbox/Checkbox.js +32 -31
  35. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  36. package/dist/components/Chip/Chip.d.ts +7 -1
  37. package/dist/components/Chip/Chip.js +19 -9
  38. package/dist/components/Chip/Chip.js.map +1 -1
  39. package/dist/components/Combobox/Combobox.d.ts +10 -2
  40. package/dist/components/Combobox/Combobox.js +146 -133
  41. package/dist/components/Combobox/Combobox.js.map +1 -1
  42. package/dist/components/Divider/Divider.d.ts +7 -1
  43. package/dist/components/Divider/Divider.js +28 -12
  44. package/dist/components/Divider/Divider.js.map +1 -1
  45. package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
  46. package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
  47. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  48. package/dist/components/EmptyState/EmptyState.d.ts +7 -1
  49. package/dist/components/EmptyState/EmptyState.js +28 -19
  50. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  51. package/dist/components/Field/Field.d.ts +21 -0
  52. package/dist/components/Field/Field.js +35 -0
  53. package/dist/components/Field/Field.js.map +1 -0
  54. package/dist/components/FileUpload/FileUpload.d.ts +9 -2
  55. package/dist/components/FileUpload/FileUpload.js +128 -102
  56. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  57. package/dist/components/Footer/Footer.d.ts +19 -6
  58. package/dist/components/Footer/Footer.js +47 -115
  59. package/dist/components/Footer/Footer.js.map +1 -1
  60. package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
  61. package/dist/components/GlassPanel/GlassPanel.js +39 -0
  62. package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
  63. package/dist/components/Header/Header.d.ts +25 -14
  64. package/dist/components/Header/Header.js +88 -148
  65. package/dist/components/Header/Header.js.map +1 -1
  66. package/dist/components/Highlight/Highlight.d.ts +13 -0
  67. package/dist/components/Highlight/Highlight.js +18 -0
  68. package/dist/components/Highlight/Highlight.js.map +1 -0
  69. package/dist/components/Icon/Icon.d.ts +21 -0
  70. package/dist/components/Icon/Icon.js +31 -0
  71. package/dist/components/Icon/Icon.js.map +1 -0
  72. package/dist/components/IconButton/IconButton.d.ts +12 -0
  73. package/dist/components/IconButton/IconButton.js +49 -0
  74. package/dist/components/IconButton/IconButton.js.map +1 -0
  75. package/dist/components/Input/Input.d.ts +3 -2
  76. package/dist/components/Input/Input.js +51 -69
  77. package/dist/components/Input/Input.js.map +1 -1
  78. package/dist/components/Layout/Layout.d.ts +2 -0
  79. package/dist/components/Layout/Layout.js +24 -18
  80. package/dist/components/Layout/Layout.js.map +1 -1
  81. package/dist/components/Logo/Logo.d.ts +27 -0
  82. package/dist/components/Logo/Logo.js +107 -0
  83. package/dist/components/Logo/Logo.js.map +1 -0
  84. package/dist/components/MiniCard/MiniCard.d.ts +21 -0
  85. package/dist/components/MiniCard/MiniCard.js +90 -0
  86. package/dist/components/MiniCard/MiniCard.js.map +1 -0
  87. package/dist/components/Modal/Modal.d.ts +16 -3
  88. package/dist/components/Modal/Modal.js +124 -93
  89. package/dist/components/Modal/Modal.js.map +1 -1
  90. package/dist/components/Navigation/Navigation.d.ts +1 -0
  91. package/dist/components/Navigation/Navigation.js +14 -14
  92. package/dist/components/Navigation/Navigation.js.map +1 -1
  93. package/dist/components/NumberInput/NumberInput.d.ts +5 -2
  94. package/dist/components/NumberInput/NumberInput.js +98 -128
  95. package/dist/components/NumberInput/NumberInput.js.map +1 -1
  96. package/dist/components/PageHeader/PageHeader.d.ts +8 -1
  97. package/dist/components/PageHeader/PageHeader.js +26 -25
  98. package/dist/components/PageHeader/PageHeader.js.map +1 -1
  99. package/dist/components/Pagination/Pagination.d.ts +15 -2
  100. package/dist/components/Pagination/Pagination.js +68 -34
  101. package/dist/components/Pagination/Pagination.js.map +1 -1
  102. package/dist/components/Paragraph/Paragraph.d.ts +8 -2
  103. package/dist/components/Paragraph/Paragraph.js +39 -36
  104. package/dist/components/Paragraph/Paragraph.js.map +1 -1
  105. package/dist/components/Popover/Popover.d.ts +12 -1
  106. package/dist/components/Popover/Popover.js +49 -37
  107. package/dist/components/Popover/Popover.js.map +1 -1
  108. package/dist/components/ProgressBar/ProgressBar.d.ts +12 -6
  109. package/dist/components/ProgressBar/ProgressBar.js +71 -0
  110. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  111. package/dist/components/Radio/Radio.d.ts +2 -1
  112. package/dist/components/Radio/Radio.js +27 -31
  113. package/dist/components/Radio/Radio.js.map +1 -1
  114. package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
  115. package/dist/components/SectionHeader/SectionHeader.js +14 -12
  116. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  117. package/dist/components/Select/Select.d.ts +6 -2
  118. package/dist/components/Select/Select.js +47 -35
  119. package/dist/components/Select/Select.js.map +1 -1
  120. package/dist/components/SideNav/SideNav.d.ts +55 -0
  121. package/dist/components/SideNav/SideNav.js +141 -0
  122. package/dist/components/SideNav/SideNav.js.map +1 -0
  123. package/dist/components/Skeleton/Skeleton.d.ts +12 -1
  124. package/dist/components/Skeleton/Skeleton.js +33 -18
  125. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  126. package/dist/components/Spinner/Spinner.d.ts +11 -3
  127. package/dist/components/Spinner/Spinner.js +57 -0
  128. package/dist/components/Spinner/Spinner.js.map +1 -0
  129. package/dist/components/Stepper/Stepper.d.ts +1 -1
  130. package/dist/components/Stepper/Stepper.js +41 -53
  131. package/dist/components/Stepper/Stepper.js.map +1 -1
  132. package/dist/components/Subtitle/Subtitle.d.ts +9 -3
  133. package/dist/components/Subtitle/Subtitle.js +29 -35
  134. package/dist/components/Subtitle/Subtitle.js.map +1 -1
  135. package/dist/components/Switch/Switch.d.ts +2 -1
  136. package/dist/components/Switch/Switch.js +45 -33
  137. package/dist/components/Switch/Switch.js.map +1 -1
  138. package/dist/components/Table/Table.d.ts +19 -1
  139. package/dist/components/Table/Table.js +48 -11
  140. package/dist/components/Table/Table.js.map +1 -1
  141. package/dist/components/Tabs/Tabs.d.ts +16 -2
  142. package/dist/components/Tabs/Tabs.js +80 -44
  143. package/dist/components/Tabs/Tabs.js.map +1 -1
  144. package/dist/components/Tag/Tag.d.ts +8 -1
  145. package/dist/components/Tag/Tag.js +27 -12
  146. package/dist/components/Tag/Tag.js.map +1 -1
  147. package/dist/components/Textarea/Textarea.d.ts +3 -1
  148. package/dist/components/Textarea/Textarea.js +36 -40
  149. package/dist/components/Textarea/Textarea.js.map +1 -1
  150. package/dist/components/Title/Title.d.ts +9 -3
  151. package/dist/components/Title/Title.js +42 -42
  152. package/dist/components/Title/Title.js.map +1 -1
  153. package/dist/components/Toast/Toast.d.ts +39 -11
  154. package/dist/components/Toast/Toast.js +130 -76
  155. package/dist/components/Toast/Toast.js.map +1 -1
  156. package/dist/components/Tooltip/Tooltip.d.ts +12 -2
  157. package/dist/components/Tooltip/Tooltip.js +50 -32
  158. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  159. package/dist/components/Typography/weight.d.ts +9 -0
  160. package/dist/components/Typography/weight.js +5 -0
  161. package/dist/components/Typography/weight.js.map +1 -0
  162. package/dist/fonts.css +8 -0
  163. package/dist/index.cjs +2 -0
  164. package/dist/index.cjs.map +1 -0
  165. package/dist/index.d.ts +55 -43
  166. package/dist/index.js +118 -83
  167. package/dist/index.js.map +1 -1
  168. package/dist/reset.css +9 -0
  169. package/dist/styles.css +1 -0
  170. package/dist/tailwind.css +153 -0
  171. package/dist/theme/ThemeProvider.d.ts +21 -3
  172. package/dist/theme/ThemeProvider.js +57 -18
  173. package/dist/theme/ThemeProvider.js.map +1 -1
  174. package/dist/theme/tokens.d.ts +43 -0
  175. package/dist/theme/tokens.js +39 -0
  176. package/dist/theme/tokens.js.map +1 -0
  177. package/dist/theme.css +327 -294
  178. package/dist/tokens.css +327 -0
  179. package/dist/utils/cn.d.ts +2 -2
  180. package/dist/utils/cn.js +19 -4
  181. package/dist/utils/cn.js.map +1 -1
  182. package/dist/utils/styles.d.ts +37 -0
  183. package/dist/utils/styles.js +35 -0
  184. package/dist/utils/styles.js.map +1 -0
  185. package/package.json +140 -117
  186. package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
  187. package/dist/components/Alert/Alert.stories.d.ts +0 -8
  188. package/dist/components/Badge/Badge.stories.d.ts +0 -8
  189. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
  190. package/dist/components/Button/Button.stories.d.ts +0 -7
  191. package/dist/components/Card/Card.stories.d.ts +0 -8
  192. package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
  193. package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
  194. package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
  195. package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
  196. package/dist/components/Input/Input.stories.d.ts +0 -9
  197. package/dist/components/Modal/Modal.stories.d.ts +0 -8
  198. package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
  199. package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
  200. package/dist/components/Radio/Radio.stories.d.ts +0 -7
  201. package/dist/components/Select/Select.stories.d.ts +0 -8
  202. package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
  203. package/dist/components/Switch/Switch.stories.d.ts +0 -8
  204. package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
  205. package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
  206. package/dist/components/Toast/Toast.stories.d.ts +0 -8
  207. package/dist/oficios-ui.css +0 -1
  208. package/dist/oficios-ui.umd.cjs +0 -2
  209. package/dist/oficios-ui.umd.cjs.map +0 -1
  210. package/dist/sbk-icon.png +0 -0
@@ -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';\n\nexport interface PopoverProps {\n children: React.ReactNode;\n content: React.ReactNode;\n defaultOpen?: boolean;\n}\n\nexport const Popover: React.FC<PopoverProps> = ({ children, content, defaultOpen = false }) => {\n const [open, setOpen] = useState(defaultOpen);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const panelRef = useRef<HTMLDivElement | null>(null);\n const popoverId = useId();\n\n useEffect(() => {\n const onClickOutside = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onClickOutside);\n return () => document.removeEventListener('mousedown', onClickOutside);\n }, []);\n\n useEffect(() => {\n if (!open || !panelRef.current) {\n return;\n }\n\n const focusable = panelRef.current.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n focusable?.focus();\n }, [open]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n triggerRef.current?.focus();\n }\n };\n if (open) {\n document.addEventListener('keydown', onKeyDown);\n }\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [open]);\n\n return (\n <div className=\"relative inline-flex\" ref={containerRef}>\n <button\n aria-controls={open ? popoverId : undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n className=\"inline-flex\"\n onClick={() => setOpen((prev) => !prev)}\n ref={triggerRef}\n type=\"button\"\n >\n {children}\n </button>\n {open && (\n <div\n className={cn(\n 'absolute left-1/2 top-full z-30 mt-2 w-max -translate-x-1/2 rounded-[var(--border-radius-md)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-3 shadow-[var(--shadow-md)]',\n )}\n id={popoverId}\n ref={panelRef}\n role=\"dialog\"\n tabIndex={-1}\n >\n {content}\n </div>\n )}\n </div>\n );\n};\n"],"names":["Popover","children","content","defaultOpen","open","setOpen","useState","containerRef","useRef","triggerRef","panelRef","popoverId","useId","useEffect","onClickOutside","event","_a","focusable","onKeyDown","jsxs","jsx","prev","cn"],"mappings":";;;AAUO,MAAMA,IAAkC,CAAC,EAAE,UAAAC,GAAU,SAAAC,GAAS,aAAAC,IAAc,SAAY;AAC7F,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAASH,CAAW,GACtCI,IAAeC,EAA8B,IAAI,GACjDC,IAAaD,EAAiC,IAAI,GAClDE,IAAWF,EAA8B,IAAI,GAC7CG,IAAYC,EAAA;AAElB,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAiB,CAACC,MAAsB;;AAC5C,OAAKC,IAAAT,EAAa,YAAb,QAAAS,EAAsB,SAASD,EAAM,WACxCV,EAAQ,EAAK;AAAA,IAEjB;AACA,oBAAS,iBAAiB,aAAaS,CAAc,GAC9C,MAAM,SAAS,oBAAoB,aAAaA,CAAc;AAAA,EACvE,GAAG,CAAA,CAAE,GAELD,EAAU,MAAM;AACd,QAAI,CAACT,KAAQ,CAACM,EAAS;AACrB;AAGF,UAAMO,IAAYP,EAAS,QAAQ;AAAA,MACjC;AAAA,IAAA;AAEF,IAAAO,KAAA,QAAAA,EAAW;AAAA,EACb,GAAG,CAACb,CAAI,CAAC,GAETS,EAAU,MAAM;AACd,UAAMK,IAAY,CAACH,MAAyB;;AAC1C,MAAIA,EAAM,QAAQ,aAChBV,EAAQ,EAAK,IACbW,IAAAP,EAAW,YAAX,QAAAO,EAAoB;AAAA,IAExB;AACA,WAAIZ,KACF,SAAS,iBAAiB,WAAWc,CAAS,GAEzC,MAAM,SAAS,oBAAoB,WAAWA,CAAS;AAAA,EAChE,GAAG,CAACd,CAAI,CAAC,GAGP,gBAAAe,EAAC,OAAA,EAAI,WAAU,wBAAuB,KAAKZ,GACzC,UAAA;AAAA,IAAA,gBAAAa;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,iBAAehB,IAAOO,IAAY;AAAA,QAClC,iBAAeP;AAAA,QACf,iBAAc;AAAA,QACd,WAAU;AAAA,QACV,SAAS,MAAMC,EAAQ,CAACgB,MAAS,CAACA,CAAI;AAAA,QACtC,KAAKZ;AAAA,QACL,MAAK;AAAA,QAEJ,UAAAR;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFG,KACC,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWE;AAAA,UACT;AAAA,QAAA;AAAA,QAEF,IAAIX;AAAA,QACJ,KAAKD;AAAA,QACL,MAAK;AAAA,QACL,UAAU;AAAA,QAET,UAAAR;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;"}
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,12 +1,18 @@
1
1
  import type React from 'react';
2
2
  export interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {
3
- /** Label descritivo para leitores de tela. */
3
+ /** Barra animada sem valor conhecido (carregamento em andamento). */
4
+ indeterminate?: boolean;
5
+ /** Label acessível. Obrigatório quando não houver texto visível associado. */
4
6
  label?: string;
5
- /** Valor atual (0–100). */
6
- value: number;
7
+ /** Exibe o percentual ao lado da barra. */
8
+ showValue?: boolean;
7
9
  size?: 'sm' | 'md' | 'lg';
8
10
  tone?: 'primary' | 'success' | 'warning' | 'error' | 'info';
9
- /** Exibe o percentual como texto ao lado da barra. */
10
- showValue?: boolean;
11
+ /** Valor atual (0 a 100). Ignorado quando `indeterminate`. */
12
+ value?: number;
11
13
  }
12
- export declare const ProgressBar: React.FC<ProgressBarProps>;
14
+ /** Barra de progresso determinada ou indeterminada ("bar load"). */
15
+ export declare const ProgressBar: {
16
+ ({ value, indeterminate, size, tone, label, showValue, className, ...props }: ProgressBarProps): import("react/jsx-runtime").JSX.Element;
17
+ displayName: string;
18
+ };
@@ -0,0 +1,71 @@
1
+ import { jsxs as o, jsx as e } from "react/jsx-runtime";
2
+ import { cn as r } from "../../utils/cn.js";
3
+ const b = { sm: "h-1", md: "h-2", lg: "h-3" }, l = {
4
+ primary: "bg-sbk-primary",
5
+ success: "bg-sbk-success",
6
+ warning: "bg-sbk-warning",
7
+ error: "bg-sbk-error",
8
+ info: "bg-sbk-info"
9
+ }, f = ({
10
+ value: n = 0,
11
+ indeterminate: s = !1,
12
+ size: t = "md",
13
+ tone: i = "primary",
14
+ label: d,
15
+ showValue: m = !1,
16
+ className: u,
17
+ ...c
18
+ }) => {
19
+ const a = Math.min(100, Math.max(0, n));
20
+ return /* @__PURE__ */ o("div", { className: r("flex items-center gap-2", u), ...c, children: [
21
+ /* @__PURE__ */ e(
22
+ "div",
23
+ {
24
+ "aria-busy": s || void 0,
25
+ "aria-label": d,
26
+ "aria-valuemax": s ? void 0 : 100,
27
+ "aria-valuemin": s ? void 0 : 0,
28
+ "aria-valuenow": s ? void 0 : a,
29
+ className: r(
30
+ "relative flex-1 overflow-hidden rounded-full bg-sbk-surface-sunken",
31
+ b[t]
32
+ ),
33
+ role: "progressbar",
34
+ children: s ? /* @__PURE__ */ e(
35
+ "div",
36
+ {
37
+ className: r(
38
+ "absolute inset-y-0 left-0 w-2/5 rounded-full animate-sbk-indeterminate motion-reduce:w-full motion-reduce:animate-pulse",
39
+ l[i]
40
+ )
41
+ }
42
+ ) : /* @__PURE__ */ e(
43
+ "div",
44
+ {
45
+ className: r(
46
+ "h-full rounded-full transition-[width] duration-300 motion-reduce:transition-none",
47
+ l[i]
48
+ ),
49
+ style: { width: `${a}%` }
50
+ }
51
+ )
52
+ }
53
+ ),
54
+ m && !s && /* @__PURE__ */ o(
55
+ "span",
56
+ {
57
+ "aria-hidden": "true",
58
+ className: "w-10 shrink-0 text-right text-xs font-semibold text-sbk-fg-muted",
59
+ children: [
60
+ a,
61
+ "%"
62
+ ]
63
+ }
64
+ )
65
+ ] });
66
+ };
67
+ f.displayName = "ProgressBar";
68
+ export {
69
+ f as ProgressBar
70
+ };
71
+ //# sourceMappingURL=ProgressBar.js.map
@@ -0,0 +1 @@
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,6 +1,7 @@
1
1
  import React from 'react';
2
2
  export interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
3
  helperText?: string;
4
- label?: string;
4
+ label?: React.ReactNode;
5
5
  }
6
+ /** Radio individual. Agrupe com <fieldset> + <legend> e o mesmo `name`. */
6
7
  export declare const Radio: React.ForwardRefExoticComponent<RadioProps & React.RefAttributes<HTMLInputElement>>;
@@ -1,36 +1,32 @@
1
- import { jsxs as a, jsx as r } from "react/jsx-runtime";
2
- import m from "react";
3
- import { cn as c } from "../../utils/cn.js";
4
- const d = m.forwardRef(
5
- ({ label: t, helperText: e, className: s, id: o, ...n }, l) => {
6
- const i = o || `radio-${Math.random().toString(36).slice(2, 9)}`;
7
- return /* @__PURE__ */ a(
8
- "label",
9
- {
10
- className: c("inline-flex cursor-pointer items-start gap-2", s),
11
- htmlFor: i,
12
- children: [
13
- /* @__PURE__ */ r(
14
- "input",
15
- {
16
- ref: l,
17
- className: "mt-0.5 h-4 w-4 border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--border-color-focus)]",
18
- id: i,
19
- type: "radio",
20
- ...n
21
- }
22
- ),
23
- /* @__PURE__ */ a("span", { className: "grid gap-0.5", children: [
24
- t && /* @__PURE__ */ r("span", { className: "text-sm text-[var(--text-primary)]", children: t }),
25
- e && /* @__PURE__ */ r("span", { className: "text-xs text-[var(--text-muted)]", children: e })
26
- ] })
27
- ]
28
- }
29
- );
1
+ import { jsxs as e, jsx as o } from "react/jsx-runtime";
2
+ import p, { useId as f } from "react";
3
+ import { cn as a } from "../../utils/cn.js";
4
+ import { choiceControl as u } from "../../utils/styles.js";
5
+ const h = p.forwardRef(
6
+ ({ label: r, helperText: i, className: d, id: n, disabled: s, ...c }, m) => {
7
+ const l = f(), t = n ?? l;
8
+ return /* @__PURE__ */ e("div", { className: a("inline-flex items-start gap-2", s && "opacity-60", d), children: [
9
+ /* @__PURE__ */ o(
10
+ "input",
11
+ {
12
+ ref: m,
13
+ "aria-describedby": i ? `${t}-helper` : void 0,
14
+ className: a(u, "rounded-full"),
15
+ disabled: s,
16
+ id: t,
17
+ type: "radio",
18
+ ...c
19
+ }
20
+ ),
21
+ /* @__PURE__ */ e("span", { className: "grid gap-0.5", children: [
22
+ r && /* @__PURE__ */ o("label", { className: "cursor-pointer text-sm font-light text-sbk-fg", htmlFor: t, children: r }),
23
+ i && /* @__PURE__ */ o("span", { className: "text-xs font-light text-sbk-fg-muted", id: `${t}-helper`, children: i })
24
+ ] })
25
+ ] });
30
26
  }
31
27
  );
32
- d.displayName = "Radio";
28
+ h.displayName = "Radio";
33
29
  export {
34
- d as Radio
30
+ h as Radio
35
31
  };
36
32
  //# sourceMappingURL=Radio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Radio.js","sources":["../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n helperText?: string;\n label?: string;\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ label, helperText, className, id, ...props }, ref) => {\n const inputId = id || `radio-${Math.random().toString(36).slice(2, 9)}`;\n\n return (\n <label\n className={cn('inline-flex cursor-pointer items-start gap-2', className)}\n htmlFor={inputId}\n >\n <input\n ref={ref}\n className=\"mt-0.5 h-4 w-4 border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--border-color-focus)]\"\n id={inputId}\n type=\"radio\"\n {...props}\n />\n <span className=\"grid gap-0.5\">\n {label && <span className=\"text-sm text-[var(--text-primary)]\">{label}</span>}\n {helperText && <span className=\"text-xs text-[var(--text-muted)]\">{helperText}</span>}\n </span>\n </label>\n );\n },\n);\n\nRadio.displayName = 'Radio';\n"],"names":["Radio","React","label","helperText","className","id","props","ref","inputId","jsxs","cn","jsx"],"mappings":";;;AAQO,MAAMA,IAAQC,EAAM;AAAA,EACzB,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,WAAAC,GAAW,IAAAC,GAAI,GAAGC,EAAA,GAASC,MAAQ;AACvD,UAAMC,IAAUH,KAAM,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAErE,WACE,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,EAAG,gDAAgDN,CAAS;AAAA,QACvE,SAASI;AAAA,QAET,UAAA;AAAA,UAAA,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAAJ;AAAA,cACA,WAAU;AAAA,cACV,IAAIC;AAAA,cACJ,MAAK;AAAA,cACJ,GAAGF;AAAA,YAAA;AAAA,UAAA;AAAA,UAEN,gBAAAG,EAAC,QAAA,EAAK,WAAU,gBACb,UAAA;AAAA,YAAAP,KAAS,gBAAAS,EAAC,QAAA,EAAK,WAAU,sCAAsC,UAAAT,GAAM;AAAA,YACrEC,KAAc,gBAAAQ,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAAR,EAAA,CAAW;AAAA,UAAA,EAAA,CAChF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;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,7 +1,12 @@
1
1
  import type React from 'react';
2
2
  export interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
3
3
  actions?: React.ReactNode;
4
+ /** Nível do título. Padrão: h2. */
5
+ as?: 'h2' | 'h3' | 'h4';
4
6
  subtitle?: React.ReactNode;
5
7
  title: React.ReactNode;
6
8
  }
7
- export declare const SectionHeader: React.FC<SectionHeaderProps>;
9
+ export declare const SectionHeader: {
10
+ ({ title, subtitle, actions, as: Tag, className, ...props }: SectionHeaderProps): import("react/jsx-runtime").JSX.Element;
11
+ displayName: string;
12
+ };
@@ -1,19 +1,21 @@
1
- import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
- import { cn as c } from "../../utils/cn.js";
3
- const d = ({
1
+ import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
+ import { cn as d } from "../../utils/cn.js";
3
+ const n = ({
4
4
  title: a,
5
5
  subtitle: t,
6
- actions: r,
7
- className: i,
8
- ...m
9
- }) => /* @__PURE__ */ s("div", { className: c("flex items-start justify-between gap-4", i), ...m, children: [
10
- /* @__PURE__ */ s("div", { className: "grid gap-1", children: [
11
- /* @__PURE__ */ e("h2", { className: "m-0 text-xl font-semibold text-[var(--text-primary)]", children: a }),
12
- t && /* @__PURE__ */ e("p", { className: "m-0 text-sm text-[var(--text-secondary)]", children: t })
6
+ actions: s,
7
+ as: m = "h2",
8
+ className: l,
9
+ ...r
10
+ }) => /* @__PURE__ */ i("div", { className: d("flex flex-wrap items-start justify-between gap-4", l), ...r, children: [
11
+ /* @__PURE__ */ i("div", { className: "grid min-w-0 gap-1", children: [
12
+ /* @__PURE__ */ e(m, { className: "m-0 text-xl font-semibold leading-tight text-sbk-fg-heading", children: a }),
13
+ t && /* @__PURE__ */ e("p", { className: "m-0 text-sm font-light text-sbk-fg-muted", children: t })
13
14
  ] }),
14
- r && /* @__PURE__ */ e("div", { className: "flex shrink-0 items-center gap-2", children: r })
15
+ s && /* @__PURE__ */ e("div", { className: "flex shrink-0 items-center gap-2", children: s })
15
16
  ] });
17
+ n.displayName = "SectionHeader";
16
18
  export {
17
- d as SectionHeader
19
+ n as SectionHeader
18
20
  };
19
21
  //# sourceMappingURL=SectionHeader.js.map
@@ -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 subtitle?: React.ReactNode;\n title: React.ReactNode;\n}\n\nexport const SectionHeader: React.FC<SectionHeaderProps> = ({\n title,\n subtitle,\n actions,\n className,\n ...props\n}) => {\n return (\n <div className={cn('flex items-start justify-between gap-4', className)} {...props}>\n <div className=\"grid gap-1\">\n <h2 className=\"m-0 text-xl font-semibold text-[var(--text-primary)]\">{title}</h2>\n {subtitle && <p className=\"m-0 text-sm text-[var(--text-secondary)]\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n );\n};\n"],"names":["SectionHeader","title","subtitle","actions","className","props","jsxs","cn","jsx"],"mappings":";;AASO,MAAMA,IAA8C,CAAC;AAAA,EAC1D,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC,EAAC,SAAI,WAAWC,EAAG,0CAA0CH,CAAS,GAAI,GAAGC,GAC3E,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,IAAA,gBAAAE,EAAC,MAAA,EAAG,WAAU,wDAAwD,UAAAP,GAAM;AAAA,IAC3EC,KAAY,gBAAAM,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAN,EAAA,CAAS;AAAA,EAAA,GACjF;AAAA,EACCC,KAAW,gBAAAK,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAL,EAAA,CAAQ;AAAA,GACzE;"}
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,13 +1,17 @@
1
1
  import React from 'react';
2
+ import { type FieldSize } from '../../utils/styles';
2
3
  export interface SelectOption {
4
+ disabled?: boolean;
3
5
  label: string;
4
6
  value: string;
5
7
  }
6
8
  export interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {
7
9
  error?: string;
8
10
  helperText?: string;
9
- label?: string;
11
+ label?: React.ReactNode;
10
12
  options: SelectOption[];
11
- size?: 'sm' | 'md' | 'lg';
13
+ /** Opção vazia inicial (ex.: "Selecione..."). */
14
+ placeholder?: string;
15
+ size?: FieldSize;
12
16
  }
13
17
  export declare const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<HTMLSelectElement>>;
@@ -1,45 +1,57 @@
1
- import { jsxs as u, jsx as a } from "react/jsx-runtime";
2
- import x from "react";
3
- import { cn as b } from "../../utils/cn.js";
4
- const f = x.forwardRef(
5
- ({ label: d, helperText: t, error: r, options: o, size: i = "md", className: l, id: n, ...c }, m) => {
6
- const e = n || `select-${Math.random().toString(36).slice(2, 9)}`, v = {
7
- sm: "min-h-8 px-3 py-1.5 text-sm",
8
- md: "min-h-10 px-3.5 py-2 text-base",
9
- lg: "min-h-12 px-4 py-3 text-lg"
10
- }[i];
11
- return /* @__PURE__ */ u("div", { className: "grid gap-1", children: [
12
- d && /* @__PURE__ */ a(
13
- "label",
14
- {
15
- className: "text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]",
16
- htmlFor: e,
17
- children: d
18
- }
19
- ),
20
- /* @__PURE__ */ a(
1
+ import { jsx as i, jsxs as s } from "react/jsx-runtime";
2
+ import b, { useId as h } from "react";
3
+ import { ChevronDown as y } from "lucide-react";
4
+ import { cn as N } from "../../utils/cn.js";
5
+ import { describedBy as x, fieldSize as I, fieldControl as S } from "../../utils/styles.js";
6
+ import { Field as g } from "../Field/Field.js";
7
+ const j = b.forwardRef(
8
+ ({
9
+ label: o,
10
+ helperText: t,
11
+ error: a,
12
+ options: n,
13
+ placeholder: d,
14
+ size: c = "md",
15
+ className: m,
16
+ id: p,
17
+ required: l,
18
+ ...u
19
+ }, f) => {
20
+ const v = h(), r = p ?? v;
21
+ return /* @__PURE__ */ i(g, { error: a, helperText: t, id: r, label: o, required: l, children: /* @__PURE__ */ s("div", { className: "relative", children: [
22
+ /* @__PURE__ */ s(
21
23
  "select",
22
24
  {
23
- ref: m,
24
- "aria-describedby": r ? `${e}-error` : t ? `${e}-helper` : void 0,
25
- "aria-invalid": r ? !0 : void 0,
26
- className: b(
27
- "w-full rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-on-surface)] outline-none transition focus:border-[var(--border-color-focus)] focus:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)] disabled:cursor-not-allowed disabled:opacity-60",
28
- r && "border-[var(--md-error)]",
29
- v,
30
- l
25
+ ref: f,
26
+ "aria-describedby": x(r, a, t),
27
+ "aria-invalid": a ? !0 : void 0,
28
+ className: N(
29
+ S,
30
+ I[c],
31
+ "cursor-pointer appearance-none pr-10",
32
+ m
31
33
  ),
32
- id: e,
33
- ...c,
34
- children: o.map((s) => /* @__PURE__ */ a("option", { value: s.value, children: s.label }, s.value))
34
+ id: r,
35
+ required: l,
36
+ ...u,
37
+ children: [
38
+ d && /* @__PURE__ */ i("option", { disabled: !0, value: "", children: d }),
39
+ n.map((e) => /* @__PURE__ */ i("option", { disabled: e.disabled, value: e.value, children: e.label }, e.value))
40
+ ]
35
41
  }
36
42
  ),
37
- r ? /* @__PURE__ */ a("span", { className: "text-xs text-[var(--md-error)]", id: `${e}-error`, role: "alert", children: r }) : t && /* @__PURE__ */ a("span", { className: "text-xs text-[var(--md-on-surface-variant)]", id: `${e}-helper`, children: t })
38
- ] });
43
+ /* @__PURE__ */ i(
44
+ y,
45
+ {
46
+ "aria-hidden": "true",
47
+ className: "pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-sbk-fg-muted"
48
+ }
49
+ )
50
+ ] }) });
39
51
  }
40
52
  );
41
- f.displayName = "Select";
53
+ j.displayName = "Select";
42
54
  export {
43
- f as Select
55
+ j as Select
44
56
  };
45
57
  //# sourceMappingURL=Select.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SelectOption {\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?: string;\n options: SelectOption[];\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ label, helperText, error, options, size = 'md', className, id, ...props }, ref) => {\n const selectId = id || `select-${Math.random().toString(36).slice(2, 9)}`;\n\n const sizeClass = {\n sm: 'min-h-8 px-3 py-1.5 text-sm',\n md: 'min-h-10 px-3.5 py-2 text-base',\n lg: 'min-h-12 px-4 py-3 text-lg',\n }[size];\n\n return (\n <div className=\"grid gap-1\">\n {label && (\n <label\n className=\"text-[var(--font-size-sm)] font-[var(--font-weight-semibold)] text-[var(--md-on-surface)]\"\n htmlFor={selectId}\n >\n {label}\n </label>\n )}\n <select\n ref={ref}\n aria-describedby={\n error ? `${selectId}-error` : helperText ? `${selectId}-helper` : undefined\n }\n aria-invalid={error ? true : undefined}\n className={cn(\n 'w-full rounded-[var(--border-radius-md)] border border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-on-surface)] outline-none transition focus:border-[var(--border-color-focus)] focus:[box-shadow:0_0_0_0.1875rem_rgba(47,93,140,0.15)] disabled:cursor-not-allowed disabled:opacity-60',\n error && 'border-[var(--md-error)]',\n sizeClass,\n className,\n )}\n id={selectId}\n {...props}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n {error ? (\n <span className=\"text-xs text-[var(--md-error)]\" id={`${selectId}-error`} role=\"alert\">\n {error}\n </span>\n ) : (\n helperText && (\n <span className=\"text-xs text-[var(--md-on-surface-variant)]\" id={`${selectId}-helper`}>\n {helperText}\n </span>\n )\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n"],"names":["Select","React","label","helperText","error","options","size","className","id","props","ref","selectId","sizeClass","jsxs","jsx","cn","option"],"mappings":";;;AAgBO,MAAMA,IAASC,EAAM;AAAA,EAC1B,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,OAAAC,GAAO,SAAAC,GAAS,MAAAC,IAAO,MAAM,WAAAC,GAAW,IAAAC,GAAI,GAAGC,EAAA,GAASC,MAAQ;AACpF,UAAMC,IAAWH,KAAM,UAAU,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,IAEjEI,IAAY;AAAA,MAChB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,EACJN,CAAI;AAEN,WACE,gBAAAO,EAAC,OAAA,EAAI,WAAU,cACZ,UAAA;AAAA,MAAAX,KACC,gBAAAY;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,SAASH;AAAA,UAER,UAAAT;AAAA,QAAA;AAAA,MAAA;AAAA,MAGL,gBAAAY;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAJ;AAAA,UACA,oBACEN,IAAQ,GAAGO,CAAQ,WAAWR,IAAa,GAAGQ,CAAQ,YAAY;AAAA,UAEpE,gBAAcP,IAAQ,KAAO;AAAA,UAC7B,WAAWW;AAAA,YACT;AAAA,YACAX,KAAS;AAAA,YACTQ;AAAA,YACAL;AAAA,UAAA;AAAA,UAEF,IAAII;AAAA,UACH,GAAGF;AAAA,UAEH,UAAAJ,EAAQ,IAAI,CAACW,MACZ,gBAAAF,EAAC,UAAA,EAA0B,OAAOE,EAAO,OACtC,UAAAA,EAAO,MAAA,GADGA,EAAO,KAEpB,CACD;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFZ,sBACE,QAAA,EAAK,WAAU,kCAAiC,IAAI,GAAGO,CAAQ,UAAU,MAAK,SAC5E,aACH,IAEAR,uBACG,QAAA,EAAK,WAAU,+CAA8C,IAAI,GAAGQ,CAAQ,WAC1E,UAAAR,EAAA,CACH;AAAA,IAAA,GAGN;AAAA,EAEJ;AACF;AAEAH,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;"}
@@ -0,0 +1,55 @@
1
+ import type React from 'react';
2
+ export interface SideNavItem {
3
+ /** Contador ou etiqueta à direita (ex.: pendências). */
4
+ badge?: React.ReactNode;
5
+ /** Subitens: o item vira um grupo expansível. */
6
+ children?: SideNavItem[];
7
+ disabled?: boolean;
8
+ href?: string;
9
+ icon?: React.ReactNode;
10
+ id: string;
11
+ label: string;
12
+ onClick?: () => void;
13
+ }
14
+ export interface SideNavSection {
15
+ id: string;
16
+ items: SideNavItem[];
17
+ /** Título da seção (ex.: "Cadastros"). */
18
+ title?: string;
19
+ }
20
+ export interface SideNavLinkRenderProps {
21
+ 'aria-current'?: 'page';
22
+ children: React.ReactNode;
23
+ className: string;
24
+ href: string;
25
+ onClick?: () => void;
26
+ title?: string;
27
+ }
28
+ export interface SideNavProps {
29
+ /** Item ativo (recebe aria-current="page"). */
30
+ activeId?: string;
31
+ 'aria-label'?: string;
32
+ className?: string;
33
+ /** Modo compacto: somente ícones, com o label disponível como tooltip nativo e para leitores de tela. */
34
+ collapsed?: boolean;
35
+ /** Grupos abertos inicialmente. Por padrão, abre o grupo que contém o item ativo. */
36
+ defaultOpenIds?: string[];
37
+ footer?: React.ReactNode;
38
+ header?: React.ReactNode;
39
+ /** Itens simples, ou `sections` para agrupar com títulos. */
40
+ items?: SideNavItem[];
41
+ onNavigate?: (item: SideNavItem) => void;
42
+ /**
43
+ * Renderização customizada de links (integração com React Router, Next.js etc.).
44
+ * Ex.: `renderLink={({ href, ...p }) => <NavLink to={href} {...p} />}`
45
+ */
46
+ renderLink?: (props: SideNavLinkRenderProps) => React.ReactNode;
47
+ sections?: SideNavSection[];
48
+ /** `light`: superfície clara. `dark`: verde escuro. `glass`: Liquid Glass. */
49
+ variant?: 'light' | 'dark' | 'glass';
50
+ }
51
+ /** Menu de navegação lateral (Navigator): seções, grupos expansíveis, ícones, badges e modo compacto. */
52
+ export declare const SideNav: {
53
+ ({ items, sections, activeId, collapsed, defaultOpenIds, onNavigate, renderLink, header, footer, variant, className, "aria-label": ariaLabel, }: SideNavProps): import("react/jsx-runtime").JSX.Element;
54
+ displayName: string;
55
+ };