@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/utils/cn.ts","../src/components/Logo/Logo.tsx","../src/components/Typography/weight.ts","../src/components/Title/Title.tsx","../src/components/Subtitle/Subtitle.tsx","../src/components/Paragraph/Paragraph.tsx","../src/components/Highlight/Highlight.tsx","../src/components/Icon/Icon.tsx","../src/utils/styles.ts","../src/components/Spinner/Spinner.tsx","../src/components/Button/Button.tsx","../src/components/IconButton/IconButton.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/Field/Field.tsx","../src/components/Input/Input.tsx","../src/components/NumberInput/NumberInput.tsx","../src/components/Select/Select.tsx","../src/components/Combobox/Combobox.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Radio/Radio.tsx","../src/components/Switch/Switch.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Card/Card.tsx","../src/components/MiniCard/MiniCard.tsx","../src/components/GlassPanel/GlassPanel.tsx","../src/components/Table/Table.tsx","../src/components/Badge/Badge.tsx","../src/components/Tag/Tag.tsx","../src/components/Chip/Chip.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Divider/Divider.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Alert/Alert.tsx","../src/components/Toast/Toast.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Modal/Modal.tsx","../src/components/Popover/Popover.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Header/Header.tsx","../src/components/Footer/Footer.tsx","../src/components/SideNav/SideNav.tsx","../src/components/Navigation/Navigation.tsx","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Pagination/Pagination.tsx","../src/components/Stepper/Stepper.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Layout/Layout.tsx"],"sourcesContent":["import {\r\n createContext,\r\n type ReactNode,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\n/** Tema efetivamente aplicado. */\r\nexport type Theme = 'light' | 'dark';\r\n/** Preferência do usuário: `system` segue prefers-color-scheme. */\r\nexport type ThemePreference = Theme | 'system';\r\n/** `sbk-ia`: produto digital (padrão). `sbk`: institucional (marca-mãe). */\r\nexport type Brand = 'sbk-ia' | 'sbk';\r\n\r\ninterface ThemeContextType {\r\n brand: Brand;\r\n /** Preferência escolhida (pode ser `system`). */\r\n preference: ThemePreference;\r\n setBrand: (brand: Brand) => void;\r\n setTheme: (preference: ThemePreference) => void;\r\n /** Tema efetivo (`light` ou `dark`), já resolvido quando a preferência é `system`. */\r\n theme: Theme;\r\n toggleTheme: () => void;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\r\n\r\nexport const useTheme = (): ThemeContextType => {\r\n const context = useContext(ThemeContext);\r\n if (!context) throw new Error('useTheme deve ser usado dentro de ThemeProvider');\r\n return context;\r\n};\r\n\r\nexport interface ThemeProviderProps {\r\n children: ReactNode;\r\n defaultBrand?: Brand;\r\n defaultTheme?: ThemePreference;\r\n /** Chave no localStorage. `null` desativa a persistência. Padrão: \"theme\". */\r\n storageKey?: string | null;\r\n}\r\n\r\nconst readStorage = (key: string | null): ThemePreference | null => {\r\n if (!key || typeof window === 'undefined') return null;\r\n try {\r\n const value = window.localStorage.getItem(key);\r\n return value === 'light' || value === 'dark' || value === 'system' ? value : null;\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\nconst systemTheme = (): Theme =>\r\n typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches\r\n ? 'dark'\r\n : 'light';\r\n\r\n/**\r\n * Aplica `data-theme` e `data-brand` no <html>. Os tokens da lib reagem a esses atributos.\r\n * Para evitar flash no primeiro paint em SSR, defina os atributos no HTML inicial.\r\n */\r\nexport const ThemeProvider = ({\r\n children,\r\n defaultTheme = 'light',\r\n defaultBrand = 'sbk-ia',\r\n storageKey = 'theme',\r\n}: ThemeProviderProps) => {\r\n const [preference, setPreference] = useState<ThemePreference>(\r\n () => readStorage(storageKey) ?? defaultTheme,\r\n );\r\n const [brand, setBrand] = useState<Brand>(defaultBrand);\r\n const [system, setSystem] = useState<Theme>(systemTheme);\r\n const theme: Theme = preference === 'system' ? system : preference;\r\n\r\n useEffect(() => {\r\n if (preference !== 'system' || typeof window === 'undefined' || !window.matchMedia) return;\r\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\r\n const onChange = () => setSystem(mql.matches ? 'dark' : 'light');\r\n onChange();\r\n mql.addEventListener?.('change', onChange);\r\n return () => mql.removeEventListener?.('change', onChange);\r\n }, [preference]);\r\n\r\n useEffect(() => {\r\n const root = document.documentElement;\r\n root.setAttribute('data-theme', theme);\r\n root.style.colorScheme = theme;\r\n }, [theme]);\r\n\r\n useEffect(() => {\r\n const root = document.documentElement;\r\n if (brand === 'sbk') root.setAttribute('data-brand', 'sbk');\r\n else root.removeAttribute('data-brand');\r\n }, [brand]);\r\n\r\n useEffect(() => {\r\n if (!storageKey) return;\r\n try {\r\n window.localStorage.setItem(storageKey, preference);\r\n } catch {\r\n /* armazenamento indisponível (modo privado): ignora */\r\n }\r\n }, [preference, storageKey]);\r\n\r\n const toggleTheme = useCallback(\r\n () => setPreference(theme === 'dark' ? 'light' : 'dark'),\r\n [theme],\r\n );\r\n\r\n const value = useMemo(\r\n () => ({ theme, preference, setTheme: setPreference, toggleTheme, brand, setBrand }),\r\n [theme, preference, toggleTheme, brand],\r\n );\r\n\r\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\r\n};\r\n","/**\r\n * Tokens da marca SBK (Brand Book 2026) para uso em JS/TS:\r\n * gráficos, canvas, e-mails, geração de PDF ou qualquer lugar sem CSS custom properties.\r\n * Em componentes React prefira as classes/variáveis CSS, que reagem a tema e marca.\r\n */\r\nexport const sbkTokens = {\r\n color: {\r\n verdeEscuro: '#023631',\r\n cianoEscuro: '#075056',\r\n offWhite: '#ECEFF3',\r\n verdeClaro: '#0A5A52',\r\n verdeProfundo: '#012824',\r\n ciano: '#2A7C79',\r\n cianoProfundo: '#0E4442',\r\n chumboLeve: '#4A545E',\r\n preto: '#000000',\r\n branco: '#FFFFFF',\r\n },\r\n /** Proposta pendente de aprovação da marca. */\r\n state: {\r\n sucesso: '#1D6B43',\r\n alerta: '#B45309',\r\n erro: '#B42318',\r\n info: '#075056',\r\n },\r\n font: {\r\n family: '\"Plus Jakarta Sans\", Calibri, system-ui, sans-serif',\r\n weight: { heading: 600, body: 300 },\r\n },\r\n radius: { xs: 4, sm: 8, md: 12, lg: 16 },\r\n cardLayerOpacity: [0.9, 0.75, 0.6],\r\n} as const;\r\n\r\n/** Paleta ordenada para séries de gráficos (do mais escuro ao mais claro, dentro do espectro verde/ciano). */\r\nexport const sbkChartPalette = [\r\n sbkTokens.color.verdeEscuro,\r\n sbkTokens.color.ciano,\r\n sbkTokens.color.cianoEscuro,\r\n sbkTokens.color.verdeClaro,\r\n sbkTokens.color.chumboLeve,\r\n sbkTokens.color.cianoProfundo,\r\n] as const;\r\n\r\nexport type SbkTokens = typeof sbkTokens;\r\n","import { clsx, type ClassValue } from 'clsx';\r\nimport { extendTailwindMerge } from 'tailwind-merge';\r\n\r\nconst twMerge = extendTailwindMerge<'sbk-glass'>({\r\n extend: {\r\n classGroups: {\r\n 'sbk-glass': ['sbk-glass'],\r\n },\r\n // sbk-glass define o próprio fundo: remove bg-* anteriores (ex.: bg-transparent do buttonReset)\r\n conflictingClassGroups: {\r\n 'sbk-glass': ['bg-color'],\r\n },\r\n theme: {\r\n radius: ['sbk-xs', 'sbk-sm', 'sbk-md', 'sbk-lg'],\r\n shadow: ['sbk-sm', 'sbk-md', 'sbk-glass'],\r\n font: ['sbk'],\r\n },\r\n },\r\n});\r\n\r\n/**\r\n * Utilitário de composição de classes Tailwind.\r\n * Usa clsx para lógica condicional e tailwind-merge (ciente dos tokens sbk)\r\n * para resolver conflitos, permitindo que o className do consumidor sobrescreva o padrão.\r\n */\r\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\r\n","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport type LogoVariant = 'sbk' | 'sbk-ia';\r\n/**\r\n * - `auto`: cor de título do tema atual (verde escuro no claro, branco no escuro)\r\n * - `dark`: Verde Escuro, para fundos claros\r\n * - `white`: para fundos escuros\r\n * - `black`: monocromática\r\n */\r\nexport type LogoColor = 'auto' | 'dark' | 'white' | 'black';\r\n\r\nexport interface LogoProps extends Omit<React.SVGAttributes<SVGSVGElement>, 'color'> {\r\n /** Reserva a zona de respiro do brand book (espaço livre igual à altura do símbolo). */\r\n clearSpace?: boolean;\r\n color?: LogoColor;\r\n /** Altura em px. A largura acompanha a proporção oficial. */\r\n height?: number;\r\n /** Nome acessível. Padrão: \"SBK\" ou \"SBK IA\". */\r\n title?: string;\r\n variant?: LogoVariant;\r\n}\r\n\r\nconst COLOR_CLASS: Record<LogoColor, string> = {\r\n auto: 'text-sbk-fg-heading',\r\n dark: 'text-sbk-verde-escuro',\r\n white: 'text-sbk-branco',\r\n black: 'text-sbk-preto',\r\n};\r\n\r\n/** Cor do recorte do wordmark dentro do bloco da SBK IA. */\r\nconst KNOCKOUT: Record<LogoColor, string> = {\r\n auto: 'var(--sbk-color-surface)',\r\n dark: 'var(--sbk-branco)',\r\n white: 'var(--sbk-preto)',\r\n black: 'var(--sbk-branco)',\r\n};\r\n\r\nconst SBK_VIEWBOX = { x: 39.15, y: 180.84, w: 541.7, h: 258.08 };\r\nconst SBK_IA_VIEWBOX = { x: 48.06, y: 293.2, w: 405.56, h: 128.33 };\r\n\r\n/** Paths oficiais: ui/docs/SBK_logo_2026.svg */\r\nconst SbkMark = () => (\r\n <g fill=\"currentColor\" transform=\"translate(-49, 122)\">\r\n <g stroke=\"currentColor\" strokeMiterlimit={10} strokeWidth={2}>\r\n <path d=\"m225.13 266.26c-27.48 0-47.67-12.07-50.38-41.01h14.16c0.62 21.44 17.69 29.56 36.85 29.56 18.11 0 39.14-7.91 39.14-29.14 0-16.24-13.12-23.74-32.48-29.99l-11.03-3.53c-24.36-7.71-42.27-16.66-42.27-40.19 0-28.1 24.78-39.97 49.76-39.97 22.9 0 46.64 8.54 47.05 35.18h-13.95c-1.87-18.32-15.82-23.94-32.47-23.94-17.29 0-36.65 7.71-36.65 27.69 0 14.78 11.04 22.28 34.36 29.77l12.49 3.96c24.36 7.7 38.3 15.82 38.93 38.73 0 30.18-26.65 42.88-53.51 42.88z\" />\r\n <path\r\n d=\"m351.42 264.39h-41.43v-150.53h41.43c8.53 0 17.9-0.2 26.23 2.09 16.24 4.58 27.48 17.9 27.48 35.18 0 18.74-10.41 29.98-27.9 34.56 20.82 2.71 34.15 15.2 34.15 36.85 0 34.56-31.86 41.85-59.96 41.85zm8.12-138.45h-36.02v56.49h32.06c19.16 0 34.98-8.81 34.98-30.26 0-18.74-14.16-26.23-31.02-26.23zm-1.46 63.19h-34.56v63.18h26.65c21.86 0 46.84-1.45 46.84-29.98 0-24.77-18.11-33.2-38.93-33.2z\"\r\n fillRule=\"evenodd\"\r\n />\r\n <path d=\"m443.77 264.39v-150.53h13.53v150.53zm88.07 0l-73.7-81.61 67.03-68.92h18.12l-68.91 67.88 75.99 82.65z\" />\r\n </g>\r\n <path d=\"m99.09 118.17l-0.21 57.98-9.73 0.24 0.56-62.81c0.26-29.03 26.91-53.16 56.3-53.26l151.74-0.48c0.62 3.58 0.63 6.35 0.05 9.92l-150.35 0.22c-26.28 0.04-48.26 21.9-48.36 48.19z\" />\r\n <path d=\"m419.9 315.79l0.22-9.33 149.3-0.15c25.73-0.02 48.97-20.27 49.14-45.96l0.4-60.49q4.64-0.28 9.57-0.07l0.32 52.61c0.21 33.16-23.62 63.29-57.93 63.33l-135.88 0.19z\" />\r\n </g>\r\n);\r\n\r\n/** Paths oficiais: ui/docs/SBK_IA_logo_2026.svg (glyphs \"IA\" expandidos para evitar ids globais) */\r\nconst SbkIaMark = ({ knockout }: { knockout: string }) => (\r\n <g>\r\n <path\r\n d=\"M 0.00165 -0.00185625 L -341.502256 -0.00185625 C -357.81085 -0.00185625 -371.033506 13.2208 -371.033506 29.529394 L -371.033506 93.802831 C -371.033506 110.115331 -357.81085 123.334081 -341.502256 123.334081 L 0.00165 123.334081 C 16.310244 123.334081 29.5329 110.115331 29.5329 93.802831 L 29.5329 29.529394 C 29.5329 13.2208 16.310244 -0.00185625 0.00165 -0.00185625 Z\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeMiterlimit={10}\r\n strokeWidth={5}\r\n transform=\"matrix(1, 0, 0, -1, 421.5921, 419.0333)\"\r\n />\r\n <path\r\n d=\"M 280.578125 419.230469 L 80.089844 419.230469 C 63.78125 419.230469 50.558594 406.011719 50.558594 389.699219 L 50.558594 325.425781 C 50.558594 309.117188 63.78125 295.898438 80.089844 295.898438 L 280.578125 295.898438 C 296.886719 295.898438 310.109375 309.117188 310.109375 325.425781 L 310.109375 389.699219 C 310.109375 406.011719 296.886719 419.230469 280.578125 419.230469\"\r\n fill=\"currentColor\"\r\n />\r\n <g fill=\"currentColor\">\r\n <path\r\n d=\"M 17.8125 0 L 17.8125 -75.75 L 11 -75.75 L 11 0 Z\"\r\n transform=\"translate(327.5737, 394.627)\"\r\n />\r\n <path\r\n d=\"M 71.453125 0 L 39.28125 -75.75 L 32.0625 -75.75 L 1.15625 0 L 8.375 0 L 16.546875 -21.15625 L 54.890625 -21.15625 L 63.484375 0 Z M 52.484375 -26.8125 L 18.75 -26.8125 L 35.203125 -69.140625 Z\"\r\n transform=\"translate(356.385092, 394.627)\"\r\n />\r\n </g>\r\n <g fill={knockout} stroke={knockout} strokeMiterlimit={10}>\r\n <path d=\"M 114.230469 396.132812 C 100.488281 396.132812 90.390625 390.09375 89.039062 375.625 L 96.117188 375.625 C 96.429688 386.347656 104.964844 390.40625 114.542969 390.40625 C 123.597656 390.40625 134.113281 386.453125 134.113281 375.832031 C 134.113281 367.714844 127.554688 363.964844 117.871094 360.84375 L 112.355469 359.074219 C 100.175781 355.222656 91.222656 350.746094 91.222656 338.980469 C 91.222656 324.929688 103.613281 318.996094 116.105469 318.996094 C 127.554688 318.996094 139.421875 323.261719 139.628906 336.589844 L 132.65625 336.589844 C 131.71875 327.429688 124.742188 324.617188 116.414062 324.617188 C 107.777344 324.617188 98.09375 328.46875 98.09375 338.460938 C 98.09375 345.851562 103.613281 349.601562 115.269531 353.347656 L 121.515625 355.328125 C 133.695312 359.175781 140.671875 363.238281 140.984375 374.6875 C 140.984375 389.78125 127.660156 396.132812 114.230469 396.132812\" />\r\n <path d=\"M 180.703125 357.5625 L 163.421875 357.5625 L 163.421875 389.15625 L 176.746094 389.15625 C 187.679688 389.15625 200.167969 388.429688 200.167969 374.167969 C 200.167969 361.78125 191.113281 357.5625 180.703125 357.5625 M 181.433594 325.96875 L 163.421875 325.96875 L 163.421875 354.214844 L 179.453125 354.214844 C 189.03125 354.214844 196.941406 349.808594 196.941406 339.085938 C 196.941406 329.71875 189.863281 325.96875 181.433594 325.96875 M 177.371094 395.195312 L 156.65625 395.195312 L 156.65625 319.933594 L 177.371094 319.933594 C 181.640625 319.933594 186.324219 319.828125 190.488281 320.972656 C 198.609375 323.265625 204.230469 329.925781 204.230469 338.566406 C 204.230469 347.933594 199.023438 353.554688 190.28125 355.847656 C 200.691406 357.199219 207.351562 363.445312 207.351562 374.273438 C 207.351562 391.550781 191.425781 395.195312 177.371094 395.195312\" />\r\n <path\r\n d=\"M 0.00183125 0.0001875 L -36.849731 40.804875 L -3.3302 75.261906 L 5.724488 75.261906 L -28.732544 41.328312 L 9.26355 0.0001875 Z M -44.033325 75.261906 L -37.2677 75.261906 L -37.2677 0.0001875 L -44.033325 0.0001875 Z\"\r\n transform=\"matrix(1, 0, 0, -1, 267.5802, 395.1955)\"\r\n />\r\n </g>\r\n </g>\r\n);\r\n\r\n/**\r\n * Logo oficial SBK / SBK IA a partir dos SVGs do time de marca.\r\n * Não aplica sombras, gradientes, distorção ou rotação (usos indevidos do brand book).\r\n */\r\nexport const Logo = ({\r\n variant = 'sbk',\r\n color = 'auto',\r\n height = 32,\r\n clearSpace = false,\r\n title,\r\n className,\r\n style,\r\n ...props\r\n}: LogoProps) => {\r\n const box = variant === 'sbk' ? SBK_VIEWBOX : SBK_IA_VIEWBOX;\r\n const width = Math.round((height * box.w) / box.h);\r\n const accessibleName = title ?? (variant === 'sbk' ? 'SBK' : 'SBK IA');\r\n\r\n return (\r\n <svg\r\n aria-label={accessibleName}\r\n className={cn('inline-block shrink-0', COLOR_CLASS[color], className)}\r\n height={height}\r\n role=\"img\"\r\n style={{ ...(clearSpace ? { padding: height, boxSizing: 'content-box' } : null), ...style }}\r\n viewBox={`${box.x} ${box.y} ${box.w} ${box.h}`}\r\n width={width}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n {...props}\r\n >\r\n <title>{accessibleName}</title>\r\n {variant === 'sbk' ? <SbkMark /> : <SbkIaMark knockout={KNOCKOUT[color]} />}\r\n </svg>\r\n );\r\n};\r\n\r\nLogo.displayName = 'Logo';\r\n","/**\r\n * Pesos do brand book: 300 (Leve) e 600 (Seminegrito).\r\n * Os valores legados da 1.x continuam aceitos e são mapeados para o peso oficial mais próximo.\r\n */\r\nexport type BrandWeight = 'light' | 'semibold';\r\n\r\n/** @deprecated Use 'light' ou 'semibold'. Serão removidos na 3.0. */\r\nexport type LegacyWeight = 'normal' | 'medium' | 'bold' | 'extrabold';\r\n\r\nexport type TextWeight = BrandWeight | LegacyWeight;\r\n\r\nexport const weightClass = (weight: TextWeight): string =>\r\n weight === 'light' || weight === 'normal' ? 'font-light' : 'font-semibold';\r\n","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","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","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","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface HighlightProps extends React.HTMLAttributes<HTMLElement> {\r\n /** Ciano Escuro (padrão) ou Verde Claro, conforme o brand book. */\r\n tone?: 'ciano' | 'verde';\r\n}\r\n\r\n/**\r\n * Highlight de palavra-chave do brand book: bloco retangular atrás de palavras\r\n * estruturantes, sempre com texto branco. Use em poucas palavras por tela.\r\n */\r\nexport const Highlight = ({ tone = 'ciano', className, ...props }: HighlightProps) => (\r\n <mark\r\n className={cn(\r\n 'rounded-sbk-xs px-1.5 py-0.5 font-semibold text-sbk-branco [box-decoration-break:clone]',\r\n tone === 'ciano' ? 'bg-sbk-ciano-escuro' : 'bg-sbk-verde-claro',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n);\r\n\r\nHighlight.displayName = 'Highlight';\r\n","import type { LucideIcon, LucideProps } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nexport interface IconProps extends Omit<LucideProps, 'size' | 'ref'> {\r\n /** Componente de ícone do lucide-react (ex.: `import { Search } from 'lucide-react'`). */\r\n icon: LucideIcon;\r\n /**\r\n * Texto para leitores de tela. Sem label o ícone é decorativo (`aria-hidden`).\r\n * Informe sempre que o ícone for o único conteúdo com significado.\r\n */\r\n label?: string;\r\n size?: IconSize | number;\r\n}\r\n\r\nconst SIZE_PX: Record<IconSize, number> = { xs: 12, sm: 16, md: 20, lg: 24, xl: 32 };\r\n\r\n/**\r\n * Wrapper padronizado para ícones lucide-react.\r\n * Ícones herdam a cor do texto (currentColor), o que mantém a paleta da marca.\r\n * Traço 1.75 acompanha o peso Leve da tipografia.\r\n */\r\nexport const Icon = ({\r\n icon: IconComponent,\r\n label,\r\n size = 'md',\r\n strokeWidth = 1.75,\r\n className,\r\n ...props\r\n}: IconProps) => {\r\n const px = typeof size === 'number' ? size : SIZE_PX[size];\r\n return (\r\n <IconComponent\r\n aria-hidden={label ? undefined : true}\r\n aria-label={label}\r\n className={cn('shrink-0', className)}\r\n focusable=\"false\"\r\n height={px}\r\n role={label ? 'img' : undefined}\r\n strokeWidth={strokeWidth}\r\n width={px}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nIcon.displayName = 'Icon';\r\n","/**\r\n * Fragmentos de classe compartilhados entre componentes.\r\n * Centralizar aqui garante foco, hover e estados idênticos em toda a lib.\r\n */\r\n\r\n/**\r\n * Zera o estilo nativo de <button> (fundo, borda, fonte, margem) para que os componentes\r\n * funcionem mesmo em apps sem reset CSS. Aplique antes das demais classes no cn().\r\n */\r\nexport const buttonReset =\r\n 'm-0 appearance-none border-0 border-solid bg-transparent p-0 font-sbk text-inherit no-underline';\r\n\r\n/** Anel de foco visível apenas na navegação por teclado. */\r\nexport const focusRing =\r\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid';\r\n\r\n/** Transição padrão de cores, respeitando prefers-reduced-motion. */\r\nexport const transitionColors =\r\n 'transition-colors duration-150 ease-out motion-reduce:transition-none';\r\n\r\n/** Rótulo de campo de formulário. */\r\nexport const fieldLabel = 'text-sm font-semibold text-sbk-fg';\r\n\r\n/** Controle de formulário (input, select, textarea). */\r\nexport const fieldControl = [\r\n 'm-0 w-full rounded-sbk-sm border border-solid border-sbk-line-strong bg-sbk-surface font-sbk font-light text-sbk-fg',\r\n 'placeholder:text-sbk-fg-muted',\r\n 'hover:border-sbk-fg-muted',\r\n 'focus:border-sbk-primary focus:outline-2 focus:outline-offset-0 focus:outline-sbk-focus focus:outline-solid',\r\n 'disabled:cursor-not-allowed disabled:bg-sbk-surface-sunken disabled:opacity-60',\r\n 'aria-invalid:border-sbk-error aria-invalid:focus:outline-sbk-error',\r\n transitionColors,\r\n].join(' ');\r\n\r\n/** Texto de apoio abaixo do campo. */\r\nexport const fieldHelper = 'text-xs font-light text-sbk-fg-muted';\r\n\r\n/** Mensagem de erro abaixo do campo. */\r\nexport const fieldError = 'text-xs font-semibold text-sbk-error-fg';\r\n\r\n/** Tamanhos de controle de formulário. */\r\nexport const fieldSize = {\r\n sm: 'min-h-8 px-3 py-1.5 text-sm',\r\n md: 'min-h-10 px-3.5 py-2 text-base',\r\n lg: 'min-h-12 px-4 py-3 text-lg',\r\n} as const;\r\n\r\nexport type FieldSize = keyof typeof fieldSize;\r\n\r\n/** Monta o aria-describedby a partir dos ids de erro e de apoio. */\r\nexport const describedBy = (id: string, error?: string, helperText?: string) =>\r\n error ? `${id}-error` : helperText ? `${id}-helper` : undefined;\r\n\r\n/**\r\n * Redefine os tokens de texto e linha para uma superfície invertida (verde escuro no tema claro).\r\n * Filhos que usam text-sbk-fg, text-sbk-fg-heading ou text-sbk-fg-muted ficam legíveis sem props extras.\r\n */\r\nexport const inverseScope = [\r\n 'bg-sbk-surface-inverse text-sbk-fg-inverse',\r\n '[--sbk-color-fg:var(--sbk-color-fg-inverse)]',\r\n '[--sbk-color-fg-heading:var(--sbk-color-fg-inverse)]',\r\n '[--sbk-color-fg-muted:color-mix(in_srgb,var(--sbk-color-fg-inverse)_72%,transparent)]',\r\n '[--sbk-color-line:color-mix(in_srgb,var(--sbk-color-fg-inverse)_18%,transparent)]',\r\n '[--sbk-color-surface-hover:color-mix(in_srgb,var(--sbk-color-fg-inverse)_10%,transparent)]',\r\n '[--sbk-color-focus:var(--sbk-color-fg-inverse)]',\r\n].join(' ');\r\n\r\n/** Checkbox e radio nativos coloridos com a marca (accent-color). */\r\nexport const choiceControl =\r\n 'mt-0.5 size-4 shrink-0 cursor-pointer accent-sbk-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid disabled:cursor-not-allowed';\r\n","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","import React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\nimport { Spinner } from '../Spinner/Spinner';\r\n\r\nexport type ButtonVariant =\r\n | 'primary'\r\n | 'secondary'\r\n | 'outline'\r\n | 'ghost'\r\n | 'link'\r\n | 'inverse'\r\n | 'glass'\r\n | 'success'\r\n | 'error'\r\n | 'warning'\r\n | 'info'\r\n | 'neutral';\r\n\r\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n children: React.ReactNode;\r\n /** Reduz o padding horizontal (útil em toolbars e tabelas). */\r\n compact?: boolean;\r\n fullWidth?: boolean;\r\n /** Mostra spinner, desabilita o botão e anuncia `aria-busy`. A largura é preservada. */\r\n isLoading?: boolean;\r\n /** Texto anunciado durante o carregamento. Padrão: \"Carregando\". */\r\n loadingLabel?: string;\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n size?: ButtonSize;\r\n variant?: ButtonVariant;\r\n}\r\n\r\nconst SIZE_CLASS: Record<ButtonSize, string> = {\r\n xs: 'min-h-7 gap-1 px-2.5 text-xs',\r\n sm: 'min-h-8 gap-1.5 px-3 text-sm',\r\n md: 'min-h-10 gap-2 px-4 text-sm',\r\n lg: 'min-h-12 gap-2 px-5 text-base',\r\n xl: 'min-h-14 gap-2.5 px-7 text-lg',\r\n};\r\n\r\nconst COMPACT_CLASS: Record<ButtonSize, string> = {\r\n xs: 'px-1.5',\r\n sm: 'px-2',\r\n md: 'px-2.5',\r\n lg: 'px-3',\r\n xl: 'px-4',\r\n};\r\n\r\nconst VARIANT_CLASS: Record<ButtonVariant, string> = {\r\n primary: 'bg-sbk-primary text-sbk-on-primary hover:bg-sbk-primary-hover',\r\n secondary: 'bg-sbk-secondary text-sbk-on-secondary hover:bg-sbk-secondary-hover',\r\n outline:\r\n 'border-sbk-primary bg-transparent text-sbk-primary hover:bg-sbk-primary-subtle dark:border-sbk-fg dark:text-sbk-fg',\r\n ghost: 'bg-transparent text-sbk-fg hover:bg-sbk-surface-hover',\r\n link: 'min-h-0 bg-transparent px-0 text-sbk-primary underline-offset-4 hover:underline dark:text-sbk-fg',\r\n inverse: 'bg-sbk-surface-inverse text-sbk-fg-inverse hover:opacity-90',\r\n glass: 'sbk-glass text-sbk-fg hover:sbk-glass-strong',\r\n success: 'bg-sbk-success text-sbk-on-state hover:opacity-90',\r\n error: 'bg-sbk-error text-sbk-on-state hover:opacity-90',\r\n warning: 'bg-sbk-warning text-sbk-on-state hover:opacity-90',\r\n info: 'bg-sbk-info text-sbk-on-state hover:opacity-90',\r\n neutral: 'border-sbk-line-strong bg-sbk-surface text-sbk-fg hover:bg-sbk-surface-hover',\r\n};\r\n\r\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n {\r\n variant = 'primary',\r\n size = 'md',\r\n compact = false,\r\n fullWidth = false,\r\n isLoading = false,\r\n loadingLabel = 'Carregando',\r\n leftIcon,\r\n rightIcon,\r\n children,\r\n className,\r\n disabled,\r\n type = 'button',\r\n ...props\r\n },\r\n ref,\r\n ) => (\r\n <button\r\n ref={ref}\r\n aria-busy={isLoading || undefined}\r\n className={cn(\r\n buttonReset,\r\n 'relative inline-flex select-none items-center justify-center whitespace-nowrap rounded-sbk-sm border border-transparent font-sbk font-semibold leading-none',\r\n 'cursor-pointer disabled:cursor-not-allowed disabled:opacity-50',\r\n transitionColors,\r\n focusRing,\r\n SIZE_CLASS[size],\r\n compact && COMPACT_CLASS[size],\r\n VARIANT_CLASS[variant],\r\n fullWidth && 'w-full',\r\n className,\r\n )}\r\n disabled={disabled || isLoading}\r\n type={type}\r\n {...props}\r\n >\r\n {isLoading && (\r\n <span className=\"absolute inset-0 flex items-center justify-center\">\r\n <Spinner label={loadingLabel} size=\"sm\" />\r\n </span>\r\n )}\r\n <span className={cn('inline-flex items-center gap-[inherit]', isLoading && 'invisible')}>\r\n {leftIcon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 [&_svg]:size-[1.15em]\">\r\n {leftIcon}\r\n </span>\r\n )}\r\n {children}\r\n {rightIcon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 [&_svg]:size-[1.15em]\">\r\n {rightIcon}\r\n </span>\r\n )}\r\n </span>\r\n </button>\r\n ),\r\n);\r\n\r\nButton.displayName = 'Button';\r\n","import React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\n\r\nexport type IconButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline' | 'inverse' | 'glass';\r\n\r\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /** Nome acessível obrigatório: o botão não tem texto visível. */\r\n 'aria-label': string;\r\n children: React.ReactNode;\r\n shape?: 'square' | 'circle';\r\n size?: 'sm' | 'md' | 'lg';\r\n variant?: IconButtonVariant;\r\n}\r\n\r\nconst SIZE_CLASS = {\r\n sm: 'size-8 [&_svg]:size-4',\r\n md: 'size-10 [&_svg]:size-5',\r\n lg: 'size-12 [&_svg]:size-6',\r\n} as const;\r\n\r\nconst VARIANT_CLASS: Record<IconButtonVariant, string> = {\r\n primary: 'bg-sbk-primary text-sbk-on-primary hover:bg-sbk-primary-hover',\r\n secondary: 'bg-sbk-secondary text-sbk-on-secondary hover:bg-sbk-secondary-hover',\r\n ghost: 'bg-transparent text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n outline: 'border-sbk-line-strong bg-sbk-surface text-sbk-fg hover:bg-sbk-surface-hover',\r\n inverse: 'bg-transparent text-sbk-branco hover:bg-sbk-branco/10',\r\n glass: 'sbk-glass text-sbk-fg',\r\n};\r\n\r\n/** Botão quadrado ou circular apenas com ícone. */\r\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\r\n (\r\n {\r\n children,\r\n shape = 'square',\r\n size = 'md',\r\n variant = 'ghost',\r\n className,\r\n type = 'button',\r\n ...props\r\n },\r\n ref,\r\n ) => (\r\n <button\r\n ref={ref}\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent disabled:cursor-not-allowed disabled:opacity-50',\r\n shape === 'circle' ? 'rounded-full' : 'rounded-sbk-sm',\r\n transitionColors,\r\n focusRing,\r\n SIZE_CLASS[size],\r\n VARIANT_CLASS[variant],\r\n className,\r\n )}\r\n type={type}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n ),\r\n);\r\n\r\nIconButton.displayName = 'IconButton';\r\n","import type React from 'react';\r\nimport { useEffect, useId, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing } from '../../utils/styles';\r\n\r\nexport interface DropdownMenuItem {\r\n /** Ação destrutiva (ex.: excluir), exibida em cor de erro. */\r\n danger?: boolean;\r\n disabled?: boolean;\r\n icon?: React.ReactNode;\r\n id: string;\r\n label: React.ReactNode;\r\n onSelect?: () => void;\r\n /** Atalho exibido à direita (ex.: \"Ctrl+S\"). */\r\n shortcut?: string;\r\n type?: 'item';\r\n}\r\n\r\nexport interface DropdownMenuSeparator {\r\n id: string;\r\n type: 'separator';\r\n}\r\n\r\nexport type DropdownMenuEntry = DropdownMenuItem | DropdownMenuSeparator;\r\n\r\nexport interface DropdownMenuProps {\r\n align?: 'start' | 'end';\r\n /** Rótulo acessível do menu quando o gatilho não tem texto. */\r\n 'aria-label'?: string;\r\n items: DropdownMenuEntry[];\r\n /** Conteúdo do botão gatilho. */\r\n trigger: React.ReactNode;\r\n triggerClassName?: string;\r\n variant?: 'default' | 'glass';\r\n}\r\n\r\nconst isItem = (entry: DropdownMenuEntry): entry is DropdownMenuItem => entry.type !== 'separator';\r\n\r\n/** Menu de ações (padrão ARIA menu button): setas, Home/End, Enter, Esc e digitação por letra. */\r\nexport const DropdownMenu = ({\r\n trigger,\r\n items,\r\n align = 'start',\r\n variant = 'default',\r\n triggerClassName,\r\n 'aria-label': ariaLabel,\r\n}: DropdownMenuProps) => {\r\n const [open, setOpen] = useState(false);\r\n const menuId = useId();\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const enabledItems = () =>\r\n Array.from(\r\n menuRef.current?.querySelectorAll<HTMLElement>(\r\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])',\r\n ) ?? [],\r\n );\r\n\r\n const focusAt = (index: number) => {\r\n const list = enabledItems();\r\n if (list.length === 0) return;\r\n list[(index + list.length) % list.length]?.focus();\r\n };\r\n\r\n const close = (restoreFocus = true) => {\r\n setOpen(false);\r\n if (restoreFocus) triggerRef.current?.focus();\r\n };\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n requestAnimationFrame(() =>\r\n menuRef.current\r\n ?.querySelector<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\r\n ?.focus(),\r\n );\r\n const onClickOutside = (e: MouseEvent) => {\r\n if (!containerRef.current?.contains(e.target as Node)) setOpen(false);\r\n };\r\n document.addEventListener('mousedown', onClickOutside);\r\n return () => document.removeEventListener('mousedown', onClickOutside);\r\n }, [open]);\r\n\r\n const onMenuKeyDown = (e: React.KeyboardEvent) => {\r\n const list = enabledItems();\r\n const index = list.indexOf(document.activeElement as HTMLElement);\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n focusAt(index + 1);\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n focusAt(index - 1);\r\n } else if (e.key === 'Home') {\r\n e.preventDefault();\r\n focusAt(0);\r\n } else if (e.key === 'End') {\r\n e.preventDefault();\r\n focusAt(list.length - 1);\r\n } else if (e.key === 'Escape') {\r\n e.preventDefault();\r\n close();\r\n } else if (e.key === 'Tab') {\r\n close(false);\r\n } else if (e.key.length === 1 && /\\S/.test(e.key)) {\r\n const char = e.key.toLocaleLowerCase('pt-BR');\r\n const match = list.findIndex(\r\n (el, i) => i > index && el.textContent?.trim().toLocaleLowerCase('pt-BR').startsWith(char),\r\n );\r\n const fallback = list.findIndex((el) =>\r\n el.textContent?.trim().toLocaleLowerCase('pt-BR').startsWith(char),\r\n );\r\n const target = match >= 0 ? match : fallback;\r\n if (target >= 0) focusAt(target);\r\n }\r\n };\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 ? menuId : undefined}\r\n aria-expanded={open}\r\n aria-haspopup=\"menu\"\r\n aria-label={ariaLabel}\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex cursor-pointer items-center',\r\n focusRing,\r\n triggerClassName,\r\n )}\r\n onClick={() => setOpen((v) => !v)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n setOpen(true);\r\n }\r\n }}\r\n type=\"button\"\r\n >\r\n {trigger}\r\n </button>\r\n {open && (\r\n <div\r\n ref={menuRef}\r\n aria-label={ariaLabel}\r\n className={cn(\r\n 'absolute top-full z-[var(--sbk-z-dropdown)] mt-1 min-w-48 rounded-sbk-sm p-1 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 === 'end' ? 'right-0' : 'left-0',\r\n )}\r\n id={menuId}\r\n onKeyDown={onMenuKeyDown}\r\n role=\"menu\"\r\n tabIndex={-1}\r\n >\r\n {items.map((entry) =>\r\n isItem(entry) ? (\r\n <div\r\n key={entry.id}\r\n aria-disabled={entry.disabled || undefined}\r\n className={cn(\r\n 'flex cursor-pointer select-none items-center gap-2 rounded-sbk-xs px-2.5 py-2 text-sm font-light outline-none',\r\n 'hover:bg-sbk-surface-hover focus:bg-sbk-surface-hover',\r\n entry.danger ? 'text-sbk-error-fg' : 'text-sbk-fg',\r\n entry.disabled && 'pointer-events-none opacity-50',\r\n '[&_svg]:size-4 [&_svg]:shrink-0',\r\n )}\r\n onClick={() => {\r\n if (entry.disabled) return;\r\n entry.onSelect?.();\r\n close();\r\n }}\r\n onKeyDown={(e) => {\r\n if ((e.key === 'Enter' || e.key === ' ') && !entry.disabled) {\r\n e.preventDefault();\r\n entry.onSelect?.();\r\n close();\r\n }\r\n }}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n >\r\n {entry.icon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex text-sbk-fg-muted\">\r\n {entry.icon}\r\n </span>\r\n )}\r\n <span className=\"flex-1\">{entry.label}</span>\r\n {entry.shortcut && (\r\n <kbd className=\"font-sbk text-xs font-light text-sbk-fg-muted\">\r\n {entry.shortcut}\r\n </kbd>\r\n )}\r\n </div>\r\n ) : (\r\n <div key={entry.id} className=\"my-1 h-px bg-sbk-line\" role=\"separator\" />\r\n ),\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nDropdownMenu.displayName = 'DropdownMenu';\r\n","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { fieldError, fieldHelper, fieldLabel } from '../../utils/styles';\r\n\r\nexport interface FieldProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n error?: string;\r\n helperText?: string;\r\n /** id do controle. Os textos de apoio recebem `${id}-helper` e `${id}-error`. */\r\n id: string;\r\n label?: React.ReactNode;\r\n /** Use `span` quando o controle não for rotulável por <label> (ex.: grupo, upload). */\r\n labelAs?: 'label' | 'span';\r\n required?: boolean;\r\n}\r\n\r\n/**\r\n * Estrutura comum de campo: rótulo, controle, texto de apoio e erro.\r\n * Use para compor controles próprios mantendo o padrão visual e de acessibilidade.\r\n */\r\nexport const Field = ({\r\n id,\r\n label,\r\n labelAs = 'label',\r\n helperText,\r\n error,\r\n required,\r\n className,\r\n children,\r\n}: FieldProps) => {\r\n const LabelTag = labelAs;\r\n return (\r\n <div className={cn('grid gap-1.5', className)}>\r\n {label && (\r\n <LabelTag\r\n className={fieldLabel}\r\n {...(labelAs === 'label' ? { htmlFor: id } : { id: `${id}-label` })}\r\n >\r\n {label}\r\n {required && (\r\n <span aria-hidden=\"true\" className=\"ml-0.5 text-sbk-error-fg\">\r\n *\r\n </span>\r\n )}\r\n </LabelTag>\r\n )}\r\n {children}\r\n {error ? (\r\n <span className={fieldError} id={`${id}-error`} role=\"alert\">\r\n {error}\r\n </span>\r\n ) : (\r\n helperText && (\r\n <span className={fieldHelper} id={`${id}-helper`}>\r\n {helperText}\r\n </span>\r\n )\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nField.displayName = 'Field';\r\n","import React, { useId } from '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 InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\r\n error?: string;\r\n fullWidth?: boolean;\r\n helperText?: string;\r\n label?: React.ReactNode;\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n size?: FieldSize;\r\n}\r\n\r\nconst iconSlot =\r\n 'pointer-events-none absolute z-[1] flex items-center text-sbk-fg-muted group-focus-within:text-sbk-primary [&_svg]:size-[1.125rem]';\r\n\r\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n label,\r\n error,\r\n helperText,\r\n leftIcon,\r\n rightIcon,\r\n fullWidth = false,\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 inputId = id ?? autoId;\r\n\r\n return (\r\n <Field\r\n className={cn(fullWidth && 'w-full')}\r\n error={error}\r\n helperText={helperText}\r\n id={inputId}\r\n label={label}\r\n required={required}\r\n >\r\n <div className=\"group relative flex w-full items-center\">\r\n {leftIcon && <span className={cn(iconSlot, 'left-3')}>{leftIcon}</span>}\r\n <input\r\n ref={ref}\r\n aria-describedby={describedBy(inputId, error, helperText)}\r\n aria-invalid={error ? true : undefined}\r\n className={cn(\r\n fieldControl,\r\n fieldSize[size],\r\n leftIcon && 'pl-10',\r\n rightIcon && 'pr-10',\r\n className,\r\n )}\r\n id={inputId}\r\n required={required}\r\n {...props}\r\n />\r\n {rightIcon && <span className={cn(iconSlot, 'right-3')}>{rightIcon}</span>}\r\n </div>\r\n </Field>\r\n );\r\n },\r\n);\r\n\r\nInput.displayName = 'Input';\r\n","import React, { useId } from 'react';\r\nimport { Minus, Plus } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, describedBy, focusRing, transitionColors } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface NumberInputProps extends Omit<\r\n React.InputHTMLAttributes<HTMLInputElement>,\r\n 'type' | 'size' | 'onChange' | 'value' | 'defaultValue'\r\n> {\r\n defaultValue?: number;\r\n error?: string;\r\n helperText?: string;\r\n label?: React.ReactNode;\r\n max?: number;\r\n min?: number;\r\n onChange?: (value: number | null) => void;\r\n size?: 'sm' | 'md' | 'lg';\r\n step?: number;\r\n value?: number | null;\r\n}\r\n\r\nconst HEIGHT = { sm: 'min-h-8 text-sm', md: 'min-h-10 text-base', lg: 'min-h-12 text-lg' } as const;\r\nconst STEPPER = {\r\n sm: 'w-8 [&_svg]:size-3.5',\r\n md: 'w-10 [&_svg]:size-4',\r\n lg: 'w-12 [&_svg]:size-5',\r\n} as const;\r\n\r\nconst clamp = (n: number, min?: number, max?: number) =>\r\n Math.min(max ?? Number.POSITIVE_INFINITY, Math.max(min ?? Number.NEGATIVE_INFINITY, n));\r\n\r\n/** Campo numérico com botões de incremento. Controlado via `value` + `onChange`. */\r\nexport const NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\r\n (\r\n {\r\n label,\r\n error,\r\n helperText,\r\n size = 'md',\r\n min,\r\n max,\r\n step = 1,\r\n onChange,\r\n className,\r\n id,\r\n value,\r\n defaultValue,\r\n disabled,\r\n required,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const autoId = useId();\r\n const inputId = id ?? autoId;\r\n const current = value ?? defaultValue ?? 0;\r\n\r\n const stepBy = (dir: 1 | -1) => onChange?.(clamp(current + dir * step, min, max));\r\n\r\n const stepperClass = cn(\r\n 'flex shrink-0 cursor-pointer items-center justify-center bg-sbk-surface-sunken text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg disabled:cursor-not-allowed disabled:opacity-50',\r\n transitionColors,\r\n focusRing,\r\n STEPPER[size],\r\n );\r\n\r\n return (\r\n <Field error={error} helperText={helperText} id={inputId} label={label} required={required}>\r\n <div\r\n className={cn(\r\n 'inline-flex overflow-hidden rounded-sbk-sm border border-sbk-line-strong bg-sbk-surface',\r\n 'focus-within:border-sbk-primary',\r\n error && 'border-sbk-error',\r\n disabled && 'opacity-60',\r\n )}\r\n >\r\n <button\r\n aria-controls={inputId}\r\n aria-label=\"Diminuir\"\r\n className={cn(buttonReset, stepperClass, 'border-r border-sbk-line')}\r\n disabled={disabled || (min !== undefined && current <= min)}\r\n onClick={() => stepBy(-1)}\r\n tabIndex={-1}\r\n type=\"button\"\r\n >\r\n <Minus aria-hidden=\"true\" />\r\n </button>\r\n <input\r\n ref={ref}\r\n aria-describedby={describedBy(inputId, error, helperText)}\r\n aria-invalid={error ? true : undefined}\r\n className={cn(\r\n 'w-full min-w-0 bg-transparent px-3 text-center font-light text-sbk-fg outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\r\n HEIGHT[size],\r\n className,\r\n )}\r\n defaultValue={value === undefined ? defaultValue : undefined}\r\n disabled={disabled}\r\n id={inputId}\r\n inputMode=\"decimal\"\r\n max={max}\r\n min={min}\r\n onChange={(e) => onChange?.(e.target.value === '' ? null : Number(e.target.value))}\r\n required={required}\r\n step={step}\r\n type=\"number\"\r\n value={value === undefined ? undefined : (value ?? '')}\r\n {...props}\r\n />\r\n <button\r\n aria-controls={inputId}\r\n aria-label=\"Aumentar\"\r\n className={cn(buttonReset, stepperClass, 'border-l border-sbk-line')}\r\n disabled={disabled || (max !== undefined && current >= max)}\r\n onClick={() => stepBy(1)}\r\n tabIndex={-1}\r\n type=\"button\"\r\n >\r\n <Plus aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n </Field>\r\n );\r\n },\r\n);\r\n\r\nNumberInput.displayName = 'NumberInput';\r\n","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","import React, { useEffect, useId, useRef, useState } from 'react';\r\nimport { Check, ChevronDown } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { describedBy, fieldControl, fieldSize } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface ComboboxOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport interface ComboboxProps {\r\n className?: string;\r\n disabled?: boolean;\r\n /** Texto exibido quando o filtro não encontra opções. */\r\n emptyText?: string;\r\n error?: string;\r\n helperText?: string;\r\n id?: string;\r\n label?: React.ReactNode;\r\n onChange?: (value: string) => void;\r\n options: ComboboxOption[];\r\n placeholder?: string;\r\n required?: boolean;\r\n value?: string;\r\n}\r\n\r\n/** Campo com busca e lista de opções (padrão ARIA combobox + listbox). */\r\nexport const Combobox = ({\r\n label,\r\n helperText,\r\n error,\r\n options,\r\n value,\r\n onChange,\r\n placeholder = 'Selecione ou pesquise...',\r\n emptyText = 'Nenhum resultado encontrado.',\r\n disabled = false,\r\n required,\r\n id,\r\n className,\r\n}: ComboboxProps) => {\r\n const autoId = useId();\r\n const inputId = id ?? autoId;\r\n const listId = `${inputId}-list`;\r\n const [query, setQuery] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [activeIndex, setActiveIndex] = useState(-1);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const listRef = useRef<HTMLUListElement>(null);\r\n\r\n const selectedOption = options.find((o) => o.value === value);\r\n const normalizedQuery = query.trim().toLocaleLowerCase('pt-BR');\r\n const filtered = normalizedQuery\r\n ? options.filter((o) => o.label.toLocaleLowerCase('pt-BR').includes(normalizedQuery))\r\n : options;\r\n\r\n const close = () => {\r\n setIsOpen(false);\r\n setQuery('');\r\n setActiveIndex(-1);\r\n };\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (!containerRef.current?.contains(e.target as Node)) close();\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n if (activeIndex < 0) return;\r\n listRef.current\r\n ?.querySelector(`[data-index=\"${activeIndex}\"]`)\r\n ?.scrollIntoView?.({ block: 'nearest' });\r\n }, [activeIndex]);\r\n\r\n const handleSelect = (option: ComboboxOption) => {\r\n onChange?.(option.value);\r\n close();\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (!isOpen) {\r\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\r\n e.preventDefault();\r\n setIsOpen(true);\r\n setActiveIndex(0);\r\n }\r\n return;\r\n }\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n setActiveIndex((i) => Math.min(i + 1, filtered.length - 1));\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n setActiveIndex((i) => Math.max(i - 1, 0));\r\n } else if (e.key === 'Home') {\r\n e.preventDefault();\r\n setActiveIndex(0);\r\n } else if (e.key === 'End') {\r\n e.preventDefault();\r\n setActiveIndex(filtered.length - 1);\r\n } else if (e.key === 'Enter') {\r\n e.preventDefault();\r\n const option = filtered[activeIndex];\r\n if (option) handleSelect(option);\r\n } else if (e.key === 'Escape' || e.key === 'Tab') {\r\n close();\r\n }\r\n };\r\n\r\n return (\r\n <Field\r\n className={className}\r\n error={error}\r\n helperText={helperText}\r\n id={inputId}\r\n label={label}\r\n required={required}\r\n >\r\n <div ref={containerRef} className=\"relative\">\r\n <input\r\n aria-activedescendant={\r\n isOpen && activeIndex >= 0 ? `${inputId}-option-${activeIndex}` : undefined\r\n }\r\n aria-autocomplete=\"list\"\r\n aria-controls={listId}\r\n aria-describedby={describedBy(inputId, error, helperText)}\r\n aria-expanded={isOpen}\r\n aria-invalid={error ? true : undefined}\r\n autoComplete=\"off\"\r\n className={cn(fieldControl, fieldSize.md, 'pr-10')}\r\n disabled={disabled}\r\n id={inputId}\r\n onChange={(e) => {\r\n setQuery(e.target.value);\r\n setIsOpen(true);\r\n setActiveIndex(0);\r\n }}\r\n onClick={() => setIsOpen(true)}\r\n onKeyDown={handleKeyDown}\r\n placeholder={placeholder}\r\n required={required}\r\n role=\"combobox\"\r\n type=\"text\"\r\n value={isOpen ? query : (selectedOption?.label ?? '')}\r\n />\r\n <ChevronDown\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-sbk-fg-muted transition-transform motion-reduce:transition-none',\r\n isOpen && 'rotate-180',\r\n )}\r\n />\r\n\r\n {isOpen && (\r\n <ul\r\n ref={listRef}\r\n className=\"absolute z-[var(--sbk-z-dropdown)] mt-1 max-h-60 w-full overflow-auto rounded-sbk-sm border border-sbk-line bg-sbk-surface py-1 shadow-sbk-md animate-sbk-fade-in\"\r\n id={listId}\r\n role=\"listbox\"\r\n >\r\n {filtered.length === 0 && (\r\n <li\r\n aria-disabled=\"true\"\r\n className=\"px-3.5 py-2.5 text-sm font-light text-sbk-fg-muted\"\r\n role=\"option\"\r\n aria-selected={false}\r\n >\r\n {emptyText}\r\n </li>\r\n )}\r\n {filtered.map((option, index) => {\r\n const selected = option.value === value;\r\n return (\r\n <li\r\n key={option.value}\r\n aria-selected={selected}\r\n className={cn(\r\n 'flex cursor-pointer items-center justify-between gap-2 px-3.5 py-2 text-sm font-light text-sbk-fg',\r\n index === activeIndex && 'bg-sbk-surface-hover',\r\n selected && 'font-semibold text-sbk-primary',\r\n )}\r\n data-index={index}\r\n id={`${inputId}-option-${index}`}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleSelect(option);\r\n }}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n role=\"option\"\r\n >\r\n {option.label}\r\n {selected && <Check aria-hidden=\"true\" className=\"size-4\" />}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n )}\r\n </div>\r\n </Field>\r\n );\r\n};\r\n\r\nCombobox.displayName = 'Combobox';\r\n","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","import React, { useEffect, useId, useImperativeHandle, useRef } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { choiceControl } from '../../utils/styles';\r\n\r\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\r\n error?: string;\r\n helperText?: string;\r\n /** Estado intermediário (ex.: \"selecionar todos\" parcial). */\r\n indeterminate?: boolean;\r\n label?: React.ReactNode;\r\n}\r\n\r\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n ({ label, helperText, error, indeterminate = false, className, id, disabled, ...props }, ref) => {\r\n const autoId = useId();\r\n const inputId = id ?? autoId;\r\n const innerRef = useRef<HTMLInputElement>(null);\r\n useImperativeHandle(ref, () => innerRef.current as HTMLInputElement);\r\n\r\n useEffect(() => {\r\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\r\n }, [indeterminate]);\r\n\r\n const hintId = error ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined;\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={innerRef}\r\n aria-describedby={hintId}\r\n aria-invalid={error ? true : undefined}\r\n className={choiceControl}\r\n disabled={disabled}\r\n id={inputId}\r\n type=\"checkbox\"\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 {error ? (\r\n <span className=\"text-xs font-semibold text-sbk-error-fg\" id={hintId} role=\"alert\">\r\n {error}\r\n </span>\r\n ) : (\r\n helperText && (\r\n <span className=\"text-xs font-light text-sbk-fg-muted\" id={hintId}>\r\n {helperText}\r\n </span>\r\n )\r\n )}\r\n </span>\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nCheckbox.displayName = 'Checkbox';\r\n","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","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","import React, { useId, useRef, useState } from 'react';\r\nimport { FileText, UploadCloud, X } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\nimport { Field } from '../Field/Field';\r\n\r\nexport interface FileUploadProps {\r\n accept?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n error?: string;\r\n helperText?: string;\r\n id?: string;\r\n label?: React.ReactNode;\r\n maxSizeBytes?: number;\r\n multiple?: boolean;\r\n onChange?: (files: File[]) => void;\r\n /** Lista os arquivos selecionados com opção de remover. Padrão: true. */\r\n showFileList?: boolean;\r\n}\r\n\r\nconst formatSize = (bytes: number) =>\r\n bytes >= 1024 * 1024\r\n ? `${(bytes / 1024 / 1024).toFixed(1)} MB`\r\n : `${Math.max(1, Math.round(bytes / 1024))} KB`;\r\n\r\n/** Área de upload com arrastar e soltar, acessível por teclado. */\r\nexport const FileUpload = ({\r\n label,\r\n helperText,\r\n error,\r\n accept,\r\n multiple = false,\r\n maxSizeBytes,\r\n disabled = false,\r\n showFileList = true,\r\n onChange,\r\n id,\r\n className,\r\n}: FileUploadProps) => {\r\n const autoId = useId();\r\n const inputId = id ?? autoId;\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [sizeError, setSizeError] = useState<string | null>(null);\r\n const [files, setFiles] = useState<File[]>([]);\r\n\r\n const commit = (next: File[]) => {\r\n setFiles(next);\r\n onChange?.(next);\r\n };\r\n\r\n const handleFiles = (fileList: FileList | null) => {\r\n if (!fileList || fileList.length === 0) return;\r\n const incoming = Array.from(fileList);\r\n if (maxSizeBytes) {\r\n const oversized = incoming.find((f) => f.size > maxSizeBytes);\r\n if (oversized) {\r\n setSizeError(\r\n `Arquivo \"${oversized.name}\" excede o tamanho máximo de ${formatSize(maxSizeBytes)}.`,\r\n );\r\n return;\r\n }\r\n }\r\n setSizeError(null);\r\n commit(multiple ? [...files, ...incoming] : incoming.slice(0, 1));\r\n };\r\n\r\n const displayError = error ?? sizeError ?? undefined;\r\n const hints = [\r\n accept && `Formatos aceitos: ${accept}`,\r\n maxSizeBytes && `Tamanho máximo: ${formatSize(maxSizeBytes)}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' · ');\r\n\r\n return (\r\n <Field\r\n className={className}\r\n error={displayError}\r\n helperText={helperText}\r\n id={inputId}\r\n label={label}\r\n labelAs=\"span\"\r\n >\r\n <div\r\n aria-describedby={\r\n displayError ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined\r\n }\r\n aria-disabled={disabled || undefined}\r\n aria-labelledby={label ? `${inputId}-label` : undefined}\r\n className={cn(\r\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-sbk-md border-2 border-dashed p-8 text-center',\r\n transitionColors,\r\n focusRing,\r\n isDragging\r\n ? 'border-sbk-primary bg-sbk-primary-subtle'\r\n : 'border-sbk-line-strong bg-sbk-surface hover:border-sbk-primary hover:bg-sbk-surface-hover',\r\n displayError && 'border-sbk-error',\r\n disabled && 'pointer-events-none opacity-60',\r\n )}\r\n onClick={() => !disabled && inputRef.current?.click()}\r\n onDragLeave={() => setIsDragging(false)}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n if (!disabled) setIsDragging(true);\r\n }}\r\n onDrop={(e) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n if (!disabled) handleFiles(e.dataTransfer.files);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n inputRef.current?.click();\r\n }\r\n }}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n >\r\n <UploadCloud aria-hidden=\"true\" className=\"size-8 text-sbk-primary\" strokeWidth={1.5} />\r\n <p className=\"m-0 text-sm font-light text-sbk-fg\">\r\n Arraste arquivos aqui ou{' '}\r\n <span className=\"font-semibold text-sbk-primary underline\">clique para selecionar</span>\r\n </p>\r\n {hints && <p className=\"m-0 text-xs font-light text-sbk-fg-muted\">{hints}</p>}\r\n </div>\r\n <input\r\n ref={inputRef}\r\n accept={accept}\r\n className=\"sr-only\"\r\n disabled={disabled}\r\n id={inputId}\r\n multiple={multiple}\r\n onChange={(e) => {\r\n handleFiles(e.target.files);\r\n e.target.value = '';\r\n }}\r\n tabIndex={-1}\r\n type=\"file\"\r\n />\r\n {showFileList && files.length > 0 && (\r\n <ul aria-label=\"Arquivos selecionados\" className=\"m-0 grid list-none gap-1.5 p-0\">\r\n {files.map((file, index) => (\r\n <li\r\n key={`${file.name}-${index}`}\r\n className=\"flex items-center gap-2 rounded-sbk-sm border border-sbk-line bg-sbk-surface px-3 py-2 text-sm\"\r\n >\r\n <FileText aria-hidden=\"true\" className=\"size-4 shrink-0 text-sbk-fg-muted\" />\r\n <span className=\"min-w-0 flex-1 truncate font-light text-sbk-fg\">{file.name}</span>\r\n <span className=\"shrink-0 text-xs font-light text-sbk-fg-muted\">\r\n {formatSize(file.size)}\r\n </span>\r\n <button\r\n aria-label={`Remover ${file.name}`}\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex size-6 cursor-pointer items-center justify-center rounded-sbk-xs text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n focusRing,\r\n )}\r\n disabled={disabled}\r\n onClick={() => commit(files.filter((_, i) => i !== index))}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" className=\"size-4\" />\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </Field>\r\n );\r\n};\r\n\r\nFileUpload.displayName = 'FileUpload';\r\n","import React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { inverseScope, transitionColors } from '../../utils/styles';\r\n\r\nexport type CardVariant = 'default' | 'elevated' | 'outlined' | 'flat' | 'inverse' | 'glass';\r\n\r\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n children: React.ReactNode;\r\n /** Realce de hover (borda e sombra). Para cards clicáveis, use um <a>/<button> dentro do card. */\r\n hoverable?: boolean;\r\n /**\r\n * Cards empilhados atrás do card principal, com opacidades de 90% a 60%\r\n * (sistema de cards do brand book). Use com moderação, em destaques.\r\n */\r\n layered?: boolean;\r\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\r\n variant?: CardVariant;\r\n}\r\n\r\nconst VARIANT_CLASS: Record<CardVariant, string> = {\r\n default: 'border border-sbk-line bg-sbk-surface text-sbk-fg',\r\n elevated: 'border border-sbk-line bg-sbk-surface text-sbk-fg shadow-sbk-sm',\r\n outlined: 'border border-sbk-line-strong bg-transparent text-sbk-fg',\r\n flat: 'border border-transparent bg-sbk-surface-sunken text-sbk-fg',\r\n inverse: cn('border border-transparent', inverseScope),\r\n glass: 'sbk-glass text-sbk-fg',\r\n};\r\n\r\nconst PADDING_CLASS: Record<NonNullable<CardProps['padding']>, string> = {\r\n none: 'p-0',\r\n sm: 'p-3',\r\n md: 'p-4',\r\n lg: 'p-6',\r\n xl: 'p-8',\r\n};\r\n\r\nexport const Card = React.forwardRef<HTMLDivElement, CardProps>(\r\n (\r\n {\r\n variant = 'default',\r\n padding = 'md',\r\n hoverable = false,\r\n layered = false,\r\n children,\r\n className,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const card = (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'relative overflow-hidden rounded-sbk-md',\r\n VARIANT_CLASS[variant],\r\n PADDING_CLASS[padding],\r\n hoverable &&\r\n cn(\r\n 'hover:border-sbk-line-strong hover:shadow-sbk-md',\r\n transitionColors,\r\n 'transition-shadow',\r\n ),\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n\r\n if (!layered) return card;\r\n\r\n // Camadas atrás do card (sistema de cards do brand book, opacidades 75% e 60%).\r\n return (\r\n <div className=\"relative isolate pb-4\">\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"absolute inset-x-6 top-4 bottom-0 -z-20 rounded-sbk-md bg-sbk-verde-claro opacity-[var(--sbk-card-layer-opacity-3)]\"\r\n />\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"absolute inset-x-3 top-2 bottom-2 -z-10 rounded-sbk-md bg-sbk-ciano opacity-[var(--sbk-card-layer-opacity-2)]\"\r\n />\r\n {card}\r\n </div>\r\n );\r\n },\r\n);\r\nCard.displayName = 'Card';\r\n\r\nexport const CardHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div className={cn('mb-3 flex items-start justify-between gap-3', className)} {...props} />\r\n);\r\nCardHeader.displayName = 'CardHeader';\r\n\r\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\r\n as?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n}\r\nexport const CardTitle = ({ as: Tag = 'h3', className, ...props }: CardTitleProps) => (\r\n <Tag\r\n className={cn('m-0 text-lg font-semibold leading-tight text-sbk-fg-heading', className)}\r\n {...props}\r\n />\r\n);\r\nCardTitle.displayName = 'CardTitle';\r\n\r\nexport const CardDescription = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLParagraphElement>) => (\r\n <p className={cn('m-0 text-sm font-light text-sbk-fg-muted', className)} {...props} />\r\n);\r\nCardDescription.displayName = 'CardDescription';\r\n\r\nexport const CardContent = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div className={cn('font-light', className)} {...props} />\r\n);\r\nCardContent.displayName = 'CardContent';\r\n\r\nexport const CardFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div className={cn('mt-4 flex items-center justify-end gap-2', className)} {...props} />\r\n);\r\nCardFooter.displayName = 'CardFooter';\r\n","import type React from 'react';\r\nimport { ArrowDownRight, ArrowRight, ArrowUpRight } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { inverseScope } from '../../utils/styles';\r\nimport { Icon } from '../Icon/Icon';\r\n\r\nexport type MiniCardTrend = 'up' | 'down' | 'neutral';\r\n\r\nexport interface MiniCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Variação exibida ao lado do valor (ex.: \"+12%\"). */\r\n delta?: React.ReactNode;\r\n /** Texto de apoio abaixo do valor. */\r\n description?: React.ReactNode;\r\n icon?: React.ReactNode;\r\n label: React.ReactNode;\r\n /** Direção da variação. `up` não significa \"bom\": ajuste `trendPositive` quando cair for positivo. */\r\n trend?: MiniCardTrend;\r\n /** Define se a tendência informada é positiva. Padrão: `up` positivo, `down` negativo. */\r\n trendPositive?: boolean;\r\n value: React.ReactNode;\r\n variant?: 'default' | 'inverse' | 'highlight' | 'glass';\r\n}\r\n\r\nconst VARIANT_CLASS: Record<NonNullable<MiniCardProps['variant']>, string> = {\r\n default: 'border border-sbk-line bg-sbk-surface text-sbk-fg',\r\n inverse: cn('border border-transparent', inverseScope),\r\n highlight: 'border border-transparent bg-sbk-highlight-bg text-sbk-highlight-fg',\r\n glass: 'sbk-glass text-sbk-fg',\r\n};\r\n\r\nconst TREND_ICON = { up: ArrowUpRight, down: ArrowDownRight, neutral: ArrowRight } as const;\r\nconst TREND_LABEL = { up: 'alta', down: 'queda', neutral: 'estável' } as const;\r\n\r\n/** Card compacto de indicador (KPI): rótulo, valor, variação e ícone. */\r\nexport const MiniCard = ({\r\n label,\r\n value,\r\n delta,\r\n trend,\r\n trendPositive,\r\n description,\r\n icon,\r\n variant = 'default',\r\n className,\r\n ...props\r\n}: MiniCardProps) => {\r\n const onColor = variant !== 'default' && variant !== 'glass';\r\n const positive = trendPositive ?? trend !== 'down';\r\n const trendColor =\r\n onColor || trend === 'neutral' || !trend\r\n ? ''\r\n : positive\r\n ? 'text-sbk-success-fg'\r\n : 'text-sbk-error-fg';\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex min-w-0 items-start gap-3 rounded-sbk-sm p-4',\r\n VARIANT_CLASS[variant],\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <div className=\"grid min-w-0 flex-1 gap-1\">\r\n <span\r\n className={cn(\r\n 'truncate text-xs font-semibold uppercase tracking-wide',\r\n onColor ? 'opacity-80' : 'text-sbk-fg-muted',\r\n )}\r\n >\r\n {label}\r\n </span>\r\n <div className=\"flex flex-wrap items-baseline gap-2\">\r\n <span\r\n className={cn('text-2xl font-semibold leading-none', !onColor && 'text-sbk-fg-heading')}\r\n >\r\n {value}\r\n </span>\r\n {delta && (\r\n <span\r\n className={cn('inline-flex items-center gap-0.5 text-xs font-semibold', trendColor)}\r\n >\r\n {trend && <Icon icon={TREND_ICON[trend]} size=\"xs\" />}\r\n {delta}\r\n {trend && <span className=\"sr-only\">({TREND_LABEL[trend]})</span>}\r\n </span>\r\n )}\r\n </div>\r\n {description && (\r\n <span className={cn('text-xs font-light', onColor ? 'opacity-80' : 'text-sbk-fg-muted')}>\r\n {description}\r\n </span>\r\n )}\r\n </div>\r\n {icon && (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'inline-flex size-9 shrink-0 items-center justify-center rounded-sbk-sm [&_svg]:size-5',\r\n onColor ? 'bg-sbk-branco/15' : 'bg-sbk-primary-subtle text-sbk-primary',\r\n )}\r\n >\r\n {icon}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nMiniCard.displayName = 'MiniCard';\r\n","import React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface GlassPanelProps extends React.HTMLAttributes<HTMLDivElement> {\r\n as?: 'div' | 'section' | 'aside' | 'header' | 'nav' | 'footer';\r\n /** Intensidade do desfoque. Padrão: md (20px). */\r\n blur?: 'sm' | 'md' | 'lg';\r\n padding?: 'none' | 'sm' | 'md' | 'lg';\r\n radius?: 'sm' | 'md' | 'lg' | 'full';\r\n /** Aumenta a opacidade do fundo para melhorar a leitura sobre imagens movimentadas. */\r\n strong?: boolean;\r\n}\r\n\r\nconst BLUR = { sm: '12px', md: '20px', lg: '32px' } as const;\r\nconst PADDING = { none: 'p-0', sm: 'p-3', md: 'p-5', lg: 'p-8' } as const;\r\nconst RADIUS = {\r\n sm: 'rounded-sbk-sm',\r\n md: 'rounded-sbk-md',\r\n lg: 'rounded-sbk-lg',\r\n full: 'rounded-full',\r\n} as const;\r\n\r\n/**\r\n * Superfície \"Liquid Glass\" (inspirada no material da Apple): translucidez tingida de verde,\r\n * desfoque com saturação, borda especular e brilho interno.\r\n *\r\n * Acessibilidade: em `prefers-reduced-transparency` ou sem suporte a `backdrop-filter`,\r\n * cai para superfície opaca. Garanta contraste do texto sobre o conteúdo de fundo.\r\n */\r\nexport const GlassPanel = React.forwardRef<HTMLDivElement, GlassPanelProps>(\r\n (\r\n {\r\n as: Tag = 'div',\r\n blur = 'md',\r\n padding = 'md',\r\n radius = 'md',\r\n strong = false,\r\n className,\r\n style,\r\n ...props\r\n },\r\n ref,\r\n ) => (\r\n <Tag\r\n ref={ref}\r\n className={cn(\r\n 'sbk-glass text-sbk-fg',\r\n strong && 'sbk-glass-strong',\r\n PADDING[padding],\r\n RADIUS[radius],\r\n className,\r\n )}\r\n style={{ '--sbk-glass-blur': BLUR[blur], ...style } as React.CSSProperties}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\nGlassPanel.displayName = 'GlassPanel';\r\n","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","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport type BadgeTone =\r\n | 'neutral'\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'warning'\r\n | 'error'\r\n | 'info';\r\n\r\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n /** Ponto colorido antes do texto (status). */\r\n dot?: boolean;\r\n size?: 'sm' | 'md';\r\n tone?: BadgeTone;\r\n /** `solid`: fundo cheio. `subtle`: fundo suave com texto colorido. Padrão: solid. */\r\n variant?: 'solid' | 'subtle';\r\n}\r\n\r\nconst SOLID: Record<BadgeTone, string> = {\r\n neutral: 'bg-sbk-surface-sunken text-sbk-fg-muted border border-sbk-line',\r\n primary: 'bg-sbk-primary text-sbk-on-primary',\r\n secondary: 'bg-sbk-secondary text-sbk-on-secondary',\r\n success: 'bg-sbk-success text-sbk-on-state',\r\n warning: 'bg-sbk-warning text-sbk-on-state',\r\n error: 'bg-sbk-error text-sbk-on-state',\r\n info: 'bg-sbk-info text-sbk-on-state',\r\n};\r\n\r\nconst SUBTLE: Record<BadgeTone, string> = {\r\n neutral: 'bg-sbk-surface-sunken text-sbk-fg-muted',\r\n primary: 'bg-sbk-primary-subtle text-sbk-primary dark:text-sbk-fg',\r\n secondary: 'bg-sbk-primary-subtle text-sbk-secondary dark:text-sbk-fg',\r\n success: 'bg-sbk-success-subtle text-sbk-success-fg',\r\n warning: 'bg-sbk-warning-subtle text-sbk-warning-fg',\r\n error: 'bg-sbk-error-subtle text-sbk-error-fg',\r\n info: 'bg-sbk-info-subtle text-sbk-info-fg',\r\n};\r\n\r\n/** Etiqueta curta de status ou contagem (formato pill da SBK IA). */\r\nexport const Badge = ({\r\n size = 'md',\r\n tone = 'neutral',\r\n variant = 'solid',\r\n dot = false,\r\n className,\r\n children,\r\n ...props\r\n}: BadgeProps) => (\r\n <span\r\n className={cn(\r\n 'inline-flex items-center gap-1.5 whitespace-nowrap rounded-full font-semibold leading-none',\r\n size === 'sm' ? 'px-2 py-0.5 text-[0.6875rem]' : 'px-2.5 py-1 text-xs',\r\n (variant === 'solid' ? SOLID : SUBTLE)[tone],\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {dot && <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-current\" />}\r\n {children}\r\n </span>\r\n);\r\n\r\nBadge.displayName = 'Badge';\r\n","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","import type React from 'react';\r\nimport { Check } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\n\r\nexport interface ChipProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n icon?: React.ReactNode;\r\n /** Estado de seleção (filtro ativo), anunciado via aria-pressed. */\r\n selected?: boolean;\r\n}\r\n\r\n/** Filtro rápido alternável (toggle button). */\r\nexport const Chip = ({ selected = false, icon, className, children, ...props }: ChipProps) => (\r\n <button\r\n aria-pressed={selected}\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex cursor-pointer items-center gap-1.5 rounded-full border px-3 py-1.5 text-sm disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:size-4',\r\n transitionColors,\r\n focusRing,\r\n selected\r\n ? 'border-sbk-primary bg-sbk-primary-subtle font-semibold text-sbk-fg-heading'\r\n : 'border-sbk-line-strong bg-sbk-surface font-light text-sbk-fg hover:bg-sbk-surface-hover',\r\n className,\r\n )}\r\n type=\"button\"\r\n {...props}\r\n >\r\n {selected ? (\r\n <Check aria-hidden=\"true\" />\r\n ) : (\r\n icon && (\r\n <span aria-hidden=\"true\" className=\"inline-flex\">\r\n {icon}\r\n </span>\r\n )\r\n )}\r\n {children}\r\n </button>\r\n);\r\n\r\nChip.displayName = 'Chip';\r\n","import type React from 'react';\r\nimport { useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n /** Nome da pessoa: usado como label acessível e para gerar as iniciais. */\r\n alt: string;\r\n shape?: 'circle' | 'square';\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n /** URL da imagem. Se ausente ou com erro, exibe as iniciais. */\r\n src?: string;\r\n /** Indicador de presença. */\r\n status?: 'online' | 'offline' | 'busy';\r\n}\r\n\r\nconst SIZE_CLASS: Record<NonNullable<AvatarProps['size']>, string> = {\r\n xs: 'size-6 text-[0.625rem]',\r\n sm: 'size-8 text-xs',\r\n md: 'size-10 text-sm',\r\n lg: 'size-12 text-base',\r\n xl: 'size-16 text-lg',\r\n};\r\n\r\nconst STATUS_CLASS = {\r\n online: 'bg-sbk-success',\r\n offline: 'bg-sbk-line-strong',\r\n busy: 'bg-sbk-error',\r\n} as const;\r\nconst STATUS_LABEL = { online: 'online', offline: 'offline', busy: 'ocupado' } as const;\r\n\r\n/** Extrai até 2 iniciais. Ex.: \"Carlos Augusto\" gera \"CA\". */\r\nexport const getInitials = (name: string): string =>\r\n name\r\n .trim()\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .slice(0, 2)\r\n .map((word) => word[0]?.toUpperCase() ?? '')\r\n .join('');\r\n\r\nexport const Avatar = ({\r\n src,\r\n alt,\r\n size = 'md',\r\n shape = 'circle',\r\n status,\r\n className,\r\n ...props\r\n}: AvatarProps) => {\r\n const [imgError, setImgError] = useState(false);\r\n const showImage = src && !imgError;\r\n const label = status ? `${alt} (${STATUS_LABEL[status]})` : alt;\r\n\r\n return (\r\n <span className={cn('relative inline-flex shrink-0', className)} {...props}>\r\n <span\r\n aria-label={label}\r\n className={cn(\r\n 'inline-flex select-none items-center justify-center overflow-hidden bg-sbk-ciano font-semibold text-sbk-branco',\r\n shape === 'circle' ? 'rounded-full' : 'rounded-sbk-sm',\r\n SIZE_CLASS[size],\r\n )}\r\n role=\"img\"\r\n >\r\n {showImage ? (\r\n <img\r\n alt=\"\"\r\n className=\"size-full object-cover\"\r\n onError={() => setImgError(true)}\r\n src={src}\r\n />\r\n ) : (\r\n <span aria-hidden=\"true\">{getInitials(alt)}</span>\r\n )}\r\n </span>\r\n {status && (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'absolute bottom-0 right-0 size-2.5 rounded-full ring-2 ring-sbk-surface',\r\n STATUS_CLASS[status],\r\n )}\r\n />\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\nAvatar.displayName = 'Avatar';\r\n","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** Texto central (ex.: \"ou\"). Apenas na orientação horizontal. */\r\n label?: React.ReactNode;\r\n orientation?: 'horizontal' | 'vertical';\r\n}\r\n\r\n/** Linha divisória funcional (brand book: linhas conduzem o olhar, não decoram). */\r\nexport const Divider = ({\r\n orientation = 'horizontal',\r\n label,\r\n className,\r\n ...props\r\n}: DividerProps) => {\r\n if (label && orientation === 'horizontal') {\r\n return (\r\n <div\r\n aria-orientation=\"horizontal\"\r\n className={cn('flex items-center gap-3', className)}\r\n role=\"separator\"\r\n {...props}\r\n >\r\n <span className=\"h-px flex-1 bg-sbk-line\" />\r\n <span className=\"text-xs font-light text-sbk-fg-muted\">{label}</span>\r\n <span className=\"h-px flex-1 bg-sbk-line\" />\r\n </div>\r\n );\r\n }\r\n return (\r\n <div\r\n aria-orientation={orientation}\r\n className={cn(\r\n 'shrink-0 bg-sbk-line',\r\n orientation === 'horizontal' ? 'h-px w-full' : 'h-full w-px self-stretch',\r\n className,\r\n )}\r\n role=\"separator\"\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nDivider.displayName = 'Divider';\r\n","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n action?: React.ReactNode;\r\n description?: React.ReactNode;\r\n icon?: React.ReactNode;\r\n title: React.ReactNode;\r\n /** Nível do título. Padrão: h3. */\r\n titleAs?: 'h2' | 'h3' | 'h4';\r\n}\r\n\r\n/** Estado vazio: ausência de dados com orientação do próximo passo. */\r\nexport const EmptyState = ({\r\n icon,\r\n title,\r\n titleAs: TitleTag = 'h3',\r\n description,\r\n action,\r\n className,\r\n ...props\r\n}: EmptyStateProps) => (\r\n <div\r\n className={cn(\r\n 'grid justify-items-center gap-3 rounded-sbk-md border border-dashed border-sbk-line-strong bg-sbk-surface p-8 text-center',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {icon && (\r\n <div\r\n aria-hidden=\"true\"\r\n className=\"inline-flex size-12 items-center justify-center rounded-full bg-sbk-primary-subtle text-sbk-primary [&_svg]:size-6\"\r\n >\r\n {icon}\r\n </div>\r\n )}\r\n <TitleTag className=\"m-0 text-lg font-semibold text-sbk-fg-heading\">{title}</TitleTag>\r\n {description && (\r\n <p className=\"m-0 max-w-[30rem] text-sm font-light text-sbk-fg-muted\">{description}</p>\r\n )}\r\n {action && <div className=\"mt-1\">{action}</div>}\r\n </div>\r\n);\r\n\r\nEmptyState.displayName = 'EmptyState';\r\n","import type React from 'react';\r\nimport { AlertTriangle, CheckCircle2, Info, X, XCircle } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing } from '../../utils/styles';\r\n\r\nexport type AlertTone = 'info' | 'success' | 'warning' | 'error';\r\n\r\nexport interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Ações (botões/links) exibidas abaixo do texto. */\r\n action?: React.ReactNode;\r\n /** Ícone customizado. `false` remove o ícone. */\r\n icon?: React.ReactNode | false;\r\n onClose?: () => void;\r\n title?: React.ReactNode;\r\n tone?: AlertTone;\r\n}\r\n\r\nconst TONE: Record<AlertTone, { box: string; icon: string; Icon: typeof Info }> = {\r\n info: { box: 'border-sbk-info/30 bg-sbk-info-subtle', icon: 'text-sbk-info-fg', Icon: Info },\r\n success: {\r\n box: 'border-sbk-success/30 bg-sbk-success-subtle',\r\n icon: 'text-sbk-success-fg',\r\n Icon: CheckCircle2,\r\n },\r\n warning: {\r\n box: 'border-sbk-warning/30 bg-sbk-warning-subtle',\r\n icon: 'text-sbk-warning-fg',\r\n Icon: AlertTriangle,\r\n },\r\n error: {\r\n box: 'border-sbk-error/30 bg-sbk-error-subtle',\r\n icon: 'text-sbk-error-fg',\r\n Icon: XCircle,\r\n },\r\n};\r\n\r\n/**\r\n * Mensagem de feedback persistente na página.\r\n * `error` e `warning` usam role=\"alert\" (anúncio imediato); `info` e `success` usam role=\"status\".\r\n */\r\nexport const Alert = ({\r\n title,\r\n tone = 'info',\r\n icon,\r\n action,\r\n onClose,\r\n children,\r\n className,\r\n role,\r\n ...props\r\n}: AlertProps) => {\r\n const { box, icon: iconColor, Icon } = TONE[tone];\r\n const urgent = tone === 'error' || tone === 'warning';\r\n\r\n return (\r\n <div\r\n className={cn('flex items-start gap-3 rounded-sbk-sm border p-4 text-sbk-fg', box, className)}\r\n role={role ?? (urgent ? 'alert' : 'status')}\r\n {...props}\r\n >\r\n {icon !== false && (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn('mt-0.5 inline-flex shrink-0 [&_svg]:size-5', iconColor)}\r\n >\r\n {icon ?? <Icon strokeWidth={1.75} />}\r\n </span>\r\n )}\r\n <div className=\"grid min-w-0 flex-1 gap-1\">\r\n {title && <p className=\"m-0 text-sm font-semibold text-sbk-fg-heading\">{title}</p>}\r\n {children && <div className=\"text-sm font-light leading-relaxed\">{children}</div>}\r\n {action && <div className=\"mt-2 flex flex-wrap gap-2\">{action}</div>}\r\n </div>\r\n {onClose && (\r\n <button\r\n aria-label=\"Fechar alerta\"\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sbk-xs text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n focusRing,\r\n )}\r\n onClick={onClose}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" className=\"size-4\" />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nAlert.displayName = 'Alert';\r\n","import type React from 'react';\r\nimport {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { AlertTriangle, CheckCircle2, Info, X, XCircle } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing } from '../../utils/styles';\r\n\r\nexport type ToastTone = 'info' | 'success' | 'warning' | 'error';\r\n\r\nexport interface ToastProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Ação opcional (ex.: \"Desfazer\"). */\r\n action?: { label: string; onClick: () => void };\r\n description?: React.ReactNode;\r\n /** Tempo até fechar (ms). 0 mantém aberto. Sobrescreve o padrão do provider. */\r\n durationMs?: number;\r\n id?: string;\r\n onDismiss?: () => void;\r\n title: React.ReactNode;\r\n tone?: ToastTone;\r\n variant?: 'default' | 'glass';\r\n}\r\n\r\nconst TONE: Record<ToastTone, { bar: string; icon: string; Icon: typeof Info }> = {\r\n info: { bar: 'bg-sbk-info', icon: 'text-sbk-info-fg', Icon: Info },\r\n success: { bar: 'bg-sbk-success', icon: 'text-sbk-success-fg', Icon: CheckCircle2 },\r\n warning: { bar: 'bg-sbk-warning', icon: 'text-sbk-warning-fg', Icon: AlertTriangle },\r\n error: { bar: 'bg-sbk-error', icon: 'text-sbk-error-fg', Icon: XCircle },\r\n};\r\n\r\nexport const Toast = ({\r\n tone = 'info',\r\n variant = 'default',\r\n title,\r\n description,\r\n action,\r\n onDismiss,\r\n durationMs: _durationMs,\r\n className,\r\n ...props\r\n}: ToastProps) => {\r\n const { bar, icon, Icon } = TONE[tone];\r\n const urgent = tone === 'error' || tone === 'warning';\r\n\r\n return (\r\n <div\r\n aria-atomic=\"true\"\r\n aria-live={urgent ? 'assertive' : 'polite'}\r\n className={cn(\r\n 'relative flex w-[22rem] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid max-w-[calc(100vw-2rem)] items-start gap-3 overflow-hidden rounded-sbk-sm py-3 pl-4 pr-3 text-sbk-fg animate-sbk-scale-in motion-reduce:animate-none',\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 className,\r\n )}\r\n onKeyDown={(e) => e.key === 'Escape' && onDismiss?.()}\r\n role={urgent ? 'alert' : 'status'}\r\n tabIndex={0}\r\n {...props}\r\n >\r\n <span aria-hidden=\"true\" className={cn('absolute inset-y-0 left-0 w-1', bar)} />\r\n <Icon aria-hidden=\"true\" className={cn('mt-0.5 size-5 shrink-0', icon)} strokeWidth={1.75} />\r\n <div className=\"grid min-w-0 flex-1 gap-0.5\">\r\n <p className=\"m-0 text-sm font-semibold text-sbk-fg-heading\">{title}</p>\r\n {description && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{description}</p>}\r\n {action && (\r\n <button\r\n className={cn(\r\n buttonReset,\r\n 'mt-1 w-fit cursor-pointer text-sm font-semibold text-sbk-primary underline-offset-4 hover:underline',\r\n focusRing,\r\n )}\r\n onClick={action.onClick}\r\n type=\"button\"\r\n >\r\n {action.label}\r\n </button>\r\n )}\r\n </div>\r\n {onDismiss && (\r\n <button\r\n aria-label=\"Fechar notificação\"\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sbk-xs text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n focusRing,\r\n )}\r\n onClick={onDismiss}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" className=\"size-4\" />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\nToast.displayName = 'Toast';\r\n\r\ntype ToastInput = Omit<ToastProps, 'id'> & { id?: string };\r\ntype ToastItem = ToastProps & { id: string };\r\n\r\ninterface ToastContextValue {\r\n dismissToast: (id: string) => void;\r\n /** Adiciona um toast e retorna o id. */\r\n pushToast: (toast: ToastInput) => string;\r\n toasts: ToastItem[];\r\n}\r\n\r\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined);\r\n\r\nexport type ToastPosition =\r\n | 'top-right'\r\n | 'top-center'\r\n | 'bottom-right'\r\n | 'bottom-center'\r\n | 'bottom-left';\r\n\r\nexport interface ToastProviderProps {\r\n children: React.ReactNode;\r\n /** Duração padrão (ms). Padrão: 5000. */\r\n durationMs?: number;\r\n /** Quantidade máxima visível; os mais antigos saem primeiro. Padrão: 4. */\r\n max?: number;\r\n position?: ToastPosition;\r\n}\r\n\r\nlet toastCounter = 0;\r\n\r\nexport const ToastProvider = ({\r\n children,\r\n durationMs = 5000,\r\n max = 4,\r\n position = 'bottom-right',\r\n}: ToastProviderProps) => {\r\n const [toasts, setToasts] = useState<ToastItem[]>([]);\r\n const timers = useRef(new Map<string, ReturnType<typeof setTimeout>>());\r\n\r\n const dismissToast = useCallback((id: string) => {\r\n clearTimeout(timers.current.get(id));\r\n timers.current.delete(id);\r\n setToasts((prev) => prev.filter((t) => t.id !== id));\r\n }, []);\r\n\r\n const schedule = useCallback(\r\n (id: string, ms: number) => {\r\n if (ms > 0)\r\n timers.current.set(\r\n id,\r\n setTimeout(() => dismissToast(id), ms),\r\n );\r\n },\r\n [dismissToast],\r\n );\r\n\r\n const pushToast = useCallback(\r\n (toast: ToastInput) => {\r\n const id = toast.id ?? `sbk-toast-${++toastCounter}`;\r\n setToasts((prev) => [...prev.filter((t) => t.id !== id), { ...toast, id }].slice(-max));\r\n schedule(id, toast.durationMs ?? durationMs);\r\n return id;\r\n },\r\n [durationMs, max, schedule],\r\n );\r\n\r\n useEffect(() => {\r\n const map = timers.current;\r\n return () => {\r\n map.forEach(clearTimeout);\r\n map.clear();\r\n };\r\n }, []);\r\n\r\n /** Pausa os timers enquanto o usuário interage (WCAG 2.2.1). */\r\n const pause = () => {\r\n timers.current.forEach(clearTimeout);\r\n timers.current.clear();\r\n };\r\n const resume = () => toasts.forEach((t) => schedule(t.id, t.durationMs ?? durationMs));\r\n\r\n const value = useMemo(\r\n () => ({ toasts, pushToast, dismissToast }),\r\n [toasts, pushToast, dismissToast],\r\n );\r\n\r\n return (\r\n <ToastContext.Provider value={value}>\r\n {children}\r\n <ToastViewport onPause={pause} onResume={resume} position={position} />\r\n </ToastContext.Provider>\r\n );\r\n};\r\n\r\nexport const useToast = (): ToastContextValue => {\r\n const context = useContext(ToastContext);\r\n if (!context) throw new Error('useToast deve ser usado dentro de ToastProvider');\r\n return context;\r\n};\r\n\r\nconst POSITION: Record<ToastPosition, string> = {\r\n 'top-right': 'top-4 right-4',\r\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\r\n 'bottom-right': 'bottom-4 right-4',\r\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\r\n 'bottom-left': 'bottom-4 left-4',\r\n};\r\n\r\nexport interface ToastViewportProps {\r\n onPause?: () => void;\r\n onResume?: () => void;\r\n position?: ToastPosition;\r\n}\r\n\r\nexport const ToastViewport = ({\r\n position = 'bottom-right',\r\n onPause,\r\n onResume,\r\n}: ToastViewportProps) => {\r\n const context = useContext(ToastContext);\r\n if (!context || context.toasts.length === 0) return null;\r\n return (\r\n <section\r\n aria-label=\"Notificações\"\r\n className={cn(\r\n 'pointer-events-none fixed z-[var(--sbk-z-toast)] grid gap-2',\r\n POSITION[position],\r\n )}\r\n onBlur={onResume}\r\n onFocus={onPause}\r\n onMouseEnter={onPause}\r\n onMouseLeave={onResume}\r\n >\r\n {context.toasts.map((toast) => (\r\n <Toast\r\n key={toast.id}\r\n {...toast}\r\n className=\"pointer-events-auto\"\r\n onDismiss={() => context.dismissToast(toast.id)}\r\n />\r\n ))}\r\n </section>\r\n );\r\n};\r\nToastViewport.displayName = 'ToastViewport';\r\n","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","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","import type React from 'react';\r\nimport { useEffect, useId, useRef } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { X } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\r\n\r\nexport interface ModalProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n closeOnEscape?: boolean;\r\n closeOnOverlayClick?: boolean;\r\n /** Rótulo do botão de fechar. Padrão: \"Fechar modal\". */\r\n closeLabel?: string;\r\n /** Rodapé fixo (ações). */\r\n footer?: React.ReactNode;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n showCloseButton?: boolean;\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\r\n subtitle?: React.ReactNode;\r\n title?: React.ReactNode;\r\n variant?: 'default' | 'glass';\r\n}\r\n\r\nconst SIZE_CLASS: Record<NonNullable<ModalProps['size']>, string> = {\r\n sm: 'max-w-[25rem]',\r\n md: 'max-w-[32rem]',\r\n lg: 'max-w-[44rem]',\r\n xl: 'max-w-[56rem]',\r\n full: 'max-w-[calc(100vw-2rem)] h-[calc(100dvh-2rem)]',\r\n};\r\n\r\nconst FOCUSABLE =\r\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\r\n\r\n/**\r\n * Diálogo modal com focus trap, restauração de foco, Esc e bloqueio de rolagem.\r\n * Renderizado em portal no <body>.\r\n */\r\nexport const Modal = ({\r\n isOpen,\r\n onClose,\r\n title,\r\n subtitle,\r\n children,\r\n footer,\r\n size = 'md',\r\n variant = 'default',\r\n showCloseButton = true,\r\n closeOnOverlayClick = true,\r\n closeOnEscape = true,\r\n closeLabel = 'Fechar modal',\r\n className,\r\n}: ModalProps) => {\r\n const dialogRef = useRef<HTMLDivElement>(null);\r\n const onCloseRef = useRef(onClose);\r\n onCloseRef.current = onClose;\r\n const titleId = useId();\r\n const subtitleId = useId();\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const previouslyFocused = document.activeElement as HTMLElement | null;\r\n const previousOverflow = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n\r\n const frame = requestAnimationFrame(() => {\r\n const target = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE) ?? dialogRef.current;\r\n target?.focus();\r\n });\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && closeOnEscape) {\r\n e.stopPropagation();\r\n onCloseRef.current();\r\n return;\r\n }\r\n if (e.key !== 'Tab' || !dialogRef.current) return;\r\n const focusable = Array.from(dialogRef.current.querySelectorAll<HTMLElement>(FOCUSABLE));\r\n if (focusable.length === 0) {\r\n e.preventDefault();\r\n return;\r\n }\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n if (e.shiftKey && document.activeElement === first) {\r\n e.preventDefault();\r\n last.focus();\r\n } else if (!e.shiftKey && document.activeElement === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n };\r\n document.addEventListener('keydown', handleKeyDown);\r\n\r\n return () => {\r\n cancelAnimationFrame(frame);\r\n document.removeEventListener('keydown', handleKeyDown);\r\n document.body.style.overflow = previousOverflow;\r\n previouslyFocused?.focus?.();\r\n };\r\n }, [isOpen, closeOnEscape]);\r\n\r\n if (!isOpen || typeof document === 'undefined') return null;\r\n\r\n const isGlass = variant === 'glass';\r\n\r\n return createPortal(\r\n <div\r\n className=\"fixed inset-0 z-[var(--sbk-z-modal)] flex items-center justify-center overflow-y-auto bg-sbk-overlay p-4 animate-sbk-fade-in\"\r\n data-testid=\"modal-overlay\"\r\n onMouseDown={(e) => {\r\n if (closeOnOverlayClick && e.target === e.currentTarget) onClose();\r\n }}\r\n >\r\n <div\r\n ref={dialogRef}\r\n aria-describedby={subtitle ? subtitleId : undefined}\r\n aria-labelledby={title ? titleId : undefined}\r\n aria-modal=\"true\"\r\n className={cn(\r\n 'relative flex max-h-[calc(100dvh-2rem)] w-full flex-col overflow-hidden rounded-sbk-lg text-sbk-fg outline-none animate-sbk-scale-in motion-reduce:animate-none',\r\n isGlass\r\n ? 'sbk-glass sbk-glass-strong'\r\n : 'border border-sbk-line bg-sbk-surface shadow-sbk-md',\r\n SIZE_CLASS[size],\r\n className,\r\n )}\r\n role=\"dialog\"\r\n tabIndex={-1}\r\n >\r\n {(title || subtitle || showCloseButton) && (\r\n <div\r\n className={cn(\r\n 'flex shrink-0 items-start justify-between gap-4 px-6 pb-4 pt-6',\r\n !isGlass && 'border-b border-sbk-line',\r\n )}\r\n >\r\n <div className=\"grid flex-1 gap-1\">\r\n {title && (\r\n <h2\r\n className=\"m-0 text-xl font-semibold leading-tight text-sbk-fg-heading\"\r\n id={titleId}\r\n >\r\n {title}\r\n </h2>\r\n )}\r\n {subtitle && (\r\n <p className=\"m-0 text-sm font-light text-sbk-fg-muted\" id={subtitleId}>\r\n {subtitle}\r\n </p>\r\n )}\r\n </div>\r\n {showCloseButton && (\r\n <button\r\n aria-label={closeLabel}\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-sbk-sm text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n transitionColors,\r\n focusRing,\r\n )}\r\n onClick={onClose}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" className=\"size-5\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"min-h-0 flex-1 overflow-y-auto px-6 py-5 font-light\">{children}</div>\r\n {footer && (\r\n <div\r\n className={cn(\r\n 'flex shrink-0 items-center justify-end gap-2 px-6 py-4',\r\n !isGlass && 'border-t border-sbk-line bg-sbk-surface-sunken',\r\n )}\r\n >\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n </div>,\r\n document.body,\r\n );\r\n};\r\n\r\nModal.displayName = 'Modal';\r\n","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","import type React from 'react';\r\nimport { cloneElement, isValidElement, useEffect, useId, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface TooltipProps {\r\n /** Elemento focável que dispara o tooltip (botão, link). Texto puro recebe tabIndex=0. */\r\n children: React.ReactNode;\r\n content: React.ReactNode;\r\n /** Atraso para abrir no hover, em ms. Padrão: 150. */\r\n delay?: number;\r\n side?: 'top' | 'bottom' | 'left' | 'right';\r\n}\r\n\r\nconst SIDE_CLASS: Record<NonNullable<TooltipProps['side']>, string> = {\r\n top: 'bottom-full left-1/2 mb-2 -translate-x-1/2',\r\n bottom: 'top-full left-1/2 mt-2 -translate-x-1/2',\r\n left: 'right-full top-1/2 mr-2 -translate-y-1/2',\r\n right: 'left-full top-1/2 ml-2 -translate-y-1/2',\r\n};\r\n\r\n/**\r\n * Dica contextual em hover e foco (WCAG 1.4.13: dispensável com Esc, persistente enquanto hover).\r\n * Não use para informação crítica: ela precisa estar visível na tela.\r\n */\r\nexport const Tooltip = ({ children, content, side = 'top', delay = 150 }: TooltipProps) => {\r\n const [open, setOpen] = useState(false);\r\n const tooltipId = useId();\r\n const timer = useRef<ReturnType<typeof setTimeout>>();\r\n\r\n useEffect(() => () => clearTimeout(timer.current), []);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && setOpen(false);\r\n document.addEventListener('keydown', onKey);\r\n return () => document.removeEventListener('keydown', onKey);\r\n }, [open]);\r\n\r\n const show = (withDelay: boolean) => {\r\n clearTimeout(timer.current);\r\n if (withDelay) timer.current = setTimeout(() => setOpen(true), delay);\r\n else setOpen(true);\r\n };\r\n const hide = () => {\r\n clearTimeout(timer.current);\r\n setOpen(false);\r\n };\r\n\r\n const trigger = isValidElement<Record<string, unknown>>(children) ? (\r\n cloneElement(children, { 'aria-describedby': tooltipId })\r\n ) : (\r\n <span aria-describedby={tooltipId} tabIndex={0}>\r\n {children}\r\n </span>\r\n );\r\n\r\n return (\r\n <span\r\n className=\"relative inline-flex\"\r\n onBlur={hide}\r\n onFocus={() => show(false)}\r\n onMouseEnter={() => show(true)}\r\n onMouseLeave={hide}\r\n >\r\n {trigger}\r\n <span\r\n aria-hidden={!open}\r\n className={cn(\r\n 'pointer-events-none absolute z-[var(--sbk-z-tooltip)] w-max max-w-64 rounded-sbk-xs bg-sbk-surface-inverse px-2.5 py-1.5 text-xs font-light text-sbk-fg-inverse shadow-sbk-sm',\r\n 'transition-opacity duration-150 motion-reduce:transition-none',\r\n open ? 'visible opacity-100' : 'invisible opacity-0',\r\n SIDE_CLASS[side],\r\n )}\r\n id={tooltipId}\r\n role=\"tooltip\"\r\n >\r\n {content}\r\n </span>\r\n </span>\r\n );\r\n};\r\n\r\nTooltip.displayName = 'Tooltip';\r\n","import type React from 'react';\r\nimport { useId, useRef, useState } from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, transitionColors } from '../../utils/styles';\r\n\r\nexport interface AccordionItem {\r\n content: React.ReactNode;\r\n disabled?: boolean;\r\n id: string;\r\n title: React.ReactNode;\r\n}\r\n\r\nexport interface AccordionProps {\r\n className?: string;\r\n /** Item aberto inicialmente (modo single). */\r\n defaultOpenId?: string;\r\n /** Itens abertos inicialmente (modo multiple). */\r\n defaultOpenIds?: string[];\r\n items: AccordionItem[];\r\n /** `single`: um item aberto por vez. `multiple`: vários. Padrão: single. */\r\n type?: 'single' | 'multiple';\r\n /** `separated`: cards independentes. `flush`: lista contínua com divisórias. */\r\n variant?: 'separated' | 'flush';\r\n}\r\n\r\nexport const Accordion = ({\r\n items,\r\n defaultOpenId,\r\n defaultOpenIds,\r\n type = 'single',\r\n variant = 'separated',\r\n className,\r\n}: AccordionProps) => {\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n defaultOpenIds ?? (defaultOpenId ? [defaultOpenId] : []),\r\n );\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const baseId = useId();\r\n\r\n const toggle = (id: string) =>\r\n setOpenIds((prev) =>\r\n prev.includes(id) ? prev.filter((x) => x !== id) : type === 'single' ? [id] : [...prev, id],\r\n );\r\n\r\n const onKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\r\n const buttons = Array.from(\r\n rootRef.current?.querySelectorAll<HTMLButtonElement>(\r\n '[data-accordion-trigger]:not(:disabled)',\r\n ) ?? [],\r\n );\r\n const index = buttons.indexOf(event.currentTarget);\r\n const targets: Record<string, number> = {\r\n ArrowDown: (index + 1) % buttons.length,\r\n ArrowUp: (index - 1 + buttons.length) % buttons.length,\r\n Home: 0,\r\n End: buttons.length - 1,\r\n };\r\n if (event.key in targets) {\r\n event.preventDefault();\r\n buttons[targets[event.key]]?.focus();\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={cn(\r\n variant === 'separated'\r\n ? 'grid gap-2'\r\n : 'divide-y divide-sbk-line overflow-hidden rounded-sbk-sm border border-sbk-line',\r\n className,\r\n )}\r\n >\r\n {items.map((item) => {\r\n const isOpen = openIds.includes(item.id);\r\n const triggerId = `${baseId}-trigger-${item.id}`;\r\n const panelId = `${baseId}-panel-${item.id}`;\r\n return (\r\n <div\r\n key={item.id}\r\n className={cn(\r\n variant === 'separated' && 'overflow-hidden rounded-sbk-sm border border-sbk-line',\r\n 'bg-sbk-surface',\r\n )}\r\n >\r\n <h3 className=\"m-0\">\r\n <button\r\n aria-controls={panelId}\r\n aria-expanded={isOpen}\r\n className={cn(\r\n buttonReset,\r\n 'flex w-full cursor-pointer items-center justify-between gap-3 px-4 py-3 text-left text-sm font-semibold text-sbk-fg hover:bg-sbk-surface-hover disabled:cursor-not-allowed disabled:opacity-50',\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 )}\r\n data-accordion-trigger=\"\"\r\n disabled={item.disabled}\r\n id={triggerId}\r\n onClick={() => toggle(item.id)}\r\n onKeyDown={onKeyDown}\r\n type=\"button\"\r\n >\r\n {item.title}\r\n <ChevronDown\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'size-4 shrink-0 text-sbk-fg-muted transition-transform duration-200 motion-reduce:transition-none',\r\n isOpen && 'rotate-180',\r\n )}\r\n />\r\n </button>\r\n </h3>\r\n {isOpen && (\r\n <div\r\n aria-labelledby={triggerId}\r\n className=\"px-4 pb-4 pt-1 text-sm font-light text-sbk-fg-muted animate-sbk-fade-in motion-reduce:animate-none\"\r\n id={panelId}\r\n role=\"region\"\r\n >\r\n {item.content}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nAccordion.displayName = 'Accordion';\r\n","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","import type React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { Menu } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing, inverseScope } from '../../utils/styles';\r\nimport type { Theme } from '../../theme/ThemeProvider';\r\nimport { Logo, type LogoVariant } from '../Logo/Logo';\r\n\r\nexport type HeaderVariant = 'solid' | 'light' | 'glass';\r\n\r\nexport interface HeaderProps {\r\n className?: string;\r\n /** Texto alternativo da imagem de logo customizada. */\r\n logoAlt?: string;\r\n /** Imagem de logo para o tema escuro (substitui o SVG oficial). */\r\n logoDarkSrc?: string;\r\n /** Imagem de logo customizada (substitui o SVG oficial). */\r\n logoSrc?: string;\r\n /** Logo oficial usado quando não há `logoSrc`. Padrão: sbk. */\r\n logoVariant?: LogoVariant;\r\n /** Estado do menu lateral, anunciado no botão hamburger (aria-expanded). */\r\n menuExpanded?: boolean;\r\n /** Rótulo do botão hamburger. Padrão: \"Abrir menu\". */\r\n menuLabel?: string;\r\n /** Navegação principal, exibida ao centro. */\r\n navigation?: React.ReactNode;\r\n onLogoClick?: () => void;\r\n onMenuClick?: () => void;\r\n /** Conteúdo à direita (ações, seletor de tema, menu do usuário). */\r\n rightContent?: React.ReactNode;\r\n showMenuIcon?: boolean;\r\n /** Fixa o header no topo. Padrão: true. */\r\n sticky?: boolean;\r\n subtitle?: React.ReactNode;\r\n /** Tema para escolher entre logoSrc e logoDarkSrc sem depender do ThemeProvider. */\r\n theme?: Theme;\r\n title?: React.ReactNode;\r\n /** Iniciais do usuário exibidas no avatar (ex.: \"CF\"). */\r\n userInitials?: string;\r\n /** `solid`: verde escuro (padrão). `light`: superfície clara. `glass`: Liquid Glass. */\r\n variant?: HeaderVariant;\r\n}\r\n\r\nconst detectTheme = (): Theme =>\r\n typeof document !== 'undefined' && document.documentElement.getAttribute('data-theme') === 'dark'\r\n ? 'dark'\r\n : 'light';\r\n\r\nconst VARIANT_CLASS: Record<HeaderVariant, string> = {\r\n solid: inverseScope,\r\n light: 'border-b border-sbk-line bg-sbk-surface text-sbk-fg',\r\n glass: 'sbk-glass rounded-none border-x-0 border-t-0 text-sbk-fg',\r\n};\r\n\r\nexport const Header = ({\r\n logoSrc,\r\n logoDarkSrc,\r\n logoAlt = 'SBK',\r\n logoVariant = 'sbk',\r\n title,\r\n subtitle,\r\n theme,\r\n navigation,\r\n onLogoClick,\r\n onMenuClick,\r\n menuExpanded,\r\n menuLabel = 'Abrir menu',\r\n rightContent,\r\n showMenuIcon = true,\r\n sticky = true,\r\n userInitials,\r\n variant = 'solid',\r\n className,\r\n}: HeaderProps) => {\r\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(() => theme ?? detectTheme());\r\n\r\n useEffect(() => {\r\n if (theme) {\r\n setResolvedTheme(theme);\r\n return;\r\n }\r\n if (!logoDarkSrc || typeof MutationObserver === 'undefined') return;\r\n const sync = () => setResolvedTheme(detectTheme());\r\n sync();\r\n const observer = new MutationObserver(sync);\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['data-theme'],\r\n });\r\n return () => observer.disconnect();\r\n }, [theme, logoDarkSrc]);\r\n\r\n const customLogo = resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\r\n const brand = (\r\n <>\r\n {customLogo ? (\r\n <img alt={logoAlt} className=\"h-8 w-auto shrink-0 object-contain\" src={customLogo} />\r\n ) : (\r\n <Logo color={variant === 'solid' ? 'white' : 'auto'} height={28} variant={logoVariant} />\r\n )}\r\n {(title || subtitle) && (\r\n <span className=\"grid min-w-0 gap-px text-left\">\r\n {title && (\r\n <span className=\"truncate text-base font-semibold leading-tight text-sbk-fg-heading\">\r\n {title}\r\n </span>\r\n )}\r\n {subtitle && (\r\n <span className=\"truncate text-xs font-light leading-tight text-sbk-fg-muted\">\r\n {subtitle}\r\n </span>\r\n )}\r\n </span>\r\n )}\r\n </>\r\n );\r\n\r\n return (\r\n <header\r\n className={cn(\r\n 'z-[var(--sbk-z-sticky)] box-border flex h-16 w-full shrink-0 items-center justify-between gap-4 px-4 md:px-8',\r\n sticky && 'sticky top-0',\r\n VARIANT_CLASS[variant],\r\n className,\r\n )}\r\n >\r\n <div className=\"flex min-w-0 items-center gap-3\">\r\n {showMenuIcon && (\r\n <button\r\n aria-expanded={menuExpanded}\r\n aria-label={menuLabel}\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex size-10 shrink-0 cursor-pointer items-center justify-center rounded-sbk-sm text-sbk-fg hover:bg-sbk-surface-hover',\r\n focusRing,\r\n )}\r\n onClick={onMenuClick}\r\n type=\"button\"\r\n >\r\n <Menu aria-hidden=\"true\" className=\"size-5\" />\r\n </button>\r\n )}\r\n {onLogoClick ? (\r\n <button\r\n className={cn(\r\n buttonReset,\r\n 'flex min-w-0 cursor-pointer items-center gap-3 rounded-sbk-xs',\r\n focusRing,\r\n )}\r\n onClick={onLogoClick}\r\n type=\"button\"\r\n >\r\n {brand}\r\n </button>\r\n ) : (\r\n <div className=\"flex min-w-0 items-center gap-3\">{brand}</div>\r\n )}\r\n </div>\r\n\r\n {navigation && (\r\n <nav aria-label=\"Principal\" className=\"hidden min-w-0 flex-1 justify-center md:flex\">\r\n {navigation}\r\n </nav>\r\n )}\r\n\r\n <div className=\"flex shrink-0 items-center gap-2\">\r\n {rightContent}\r\n {userInitials && (\r\n <span\r\n aria-label={`Usuário: ${userInitials}`}\r\n className=\"inline-flex size-9 shrink-0 select-none items-center justify-center rounded-full bg-sbk-ciano text-[0.8125rem] font-semibold text-sbk-branco\"\r\n role=\"img\"\r\n >\r\n {userInitials}\r\n </span>\r\n )}\r\n </div>\r\n </header>\r\n );\r\n};\r\n\r\nHeader.displayName = 'Header';\r\n","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { focusRing } from '../../utils/styles';\r\nimport { Logo, type LogoVariant } from '../Logo/Logo';\r\n\r\nexport interface FooterLink {\r\n href: string;\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface FooterProps {\r\n className?: string;\r\n /** Texto de copyright (ex.: \"© 2026 SBK\"). */\r\n copyright?: React.ReactNode;\r\n /** Links institucionais (privacidade, termos, suporte). */\r\n links?: FooterLink[];\r\n logoAlt?: string;\r\n /** @deprecated Não utilizado. Mantido por compatibilidade com a 1.x. */\r\n logoFallbackText?: string;\r\n /** Imagem de logo customizada (substitui o SVG oficial). */\r\n logoSrc?: string;\r\n logoVariant?: LogoVariant;\r\n /** Texto antes do logo. Padrão: \"Powered by\". Use \"\" para ocultar. */\r\n poweredByText?: string;\r\n /** `default`: superfície clara. `inverse`: verde escuro. `glass`: Liquid Glass. */\r\n variant?: 'default' | 'inverse' | 'glass';\r\n}\r\n\r\nconst VARIANT_CLASS = {\r\n default: 'border-t border-sbk-line bg-sbk-surface',\r\n inverse:\r\n 'bg-sbk-surface-inverse text-sbk-fg-inverse [--sbk-color-fg-muted:color-mix(in_srgb,var(--sbk-color-fg-inverse)_72%,transparent)] [--sbk-color-fg-heading:var(--sbk-color-fg-inverse)]',\r\n glass: 'sbk-glass rounded-none border-x-0 border-b-0',\r\n} as const;\r\n\r\nexport const Footer = ({\r\n poweredByText = 'Powered by',\r\n logoSrc,\r\n logoAlt = 'SBK',\r\n logoVariant = 'sbk',\r\n links,\r\n copyright,\r\n variant = 'default',\r\n className,\r\n}: FooterProps) => (\r\n <footer\r\n className={cn(\r\n 'relative box-border flex w-full shrink-0 flex-wrap items-center justify-center gap-x-8 gap-y-3 px-4 py-5 md:px-8',\r\n (links || copyright) && 'md:justify-between',\r\n VARIANT_CLASS[variant],\r\n className,\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2.5\">\r\n {poweredByText && (\r\n <span className=\"text-xs font-light text-sbk-fg-muted\">{poweredByText}</span>\r\n )}\r\n {logoSrc ? (\r\n <img alt={logoAlt} className=\"h-7 w-auto object-contain\" src={logoSrc} />\r\n ) : (\r\n <Logo color={variant === 'inverse' ? 'white' : 'auto'} height={22} variant={logoVariant} />\r\n )}\r\n </div>\r\n {links && links.length > 0 && (\r\n <nav aria-label=\"Rodapé\">\r\n <ul className=\"m-0 flex list-none flex-wrap gap-x-5 gap-y-2 p-0\">\r\n {links.map((link) => (\r\n <li key={link.href}>\r\n <a\r\n className={cn(\r\n 'rounded-sbk-xs text-xs font-light text-sbk-fg-muted underline-offset-4 hover:text-sbk-fg-heading hover:underline',\r\n focusRing,\r\n )}\r\n href={link.href}\r\n >\r\n {link.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </nav>\r\n )}\r\n {copyright && <p className=\"m-0 text-xs font-light text-sbk-fg-muted\">{copyright}</p>}\r\n </footer>\r\n);\r\n\r\nFooter.displayName = 'Footer';\r\n","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","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {}\r\n/** Container lateral simples. Para menu de navegação completo, use SideNav. */\r\nexport const Sidebar: React.FC<SidebarProps> = ({ className, ...props }) => (\r\n <aside\r\n className={cn(\r\n 'h-full rounded-sbk-md border border-sbk-line bg-sbk-surface p-4 text-sbk-fg',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n);\r\n\r\nexport interface TopbarProps extends React.HTMLAttributes<HTMLElement> {}\r\nexport const Topbar: React.FC<TopbarProps> = ({ className, ...props }) => (\r\n <header\r\n className={cn(\r\n 'flex min-h-14 items-center justify-between gap-4 border-b border-sbk-line bg-sbk-surface px-4 text-sbk-fg',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n);\r\n","import type React from 'react';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { focusRing } from '../../utils/styles';\r\n\r\nexport interface BreadcrumbItem {\r\n href?: string;\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\r\n items: BreadcrumbItem[];\r\n separator?: React.ReactNode;\r\n}\r\n\r\nexport const Breadcrumb = ({ items, separator, className, ...props }: BreadcrumbProps) => (\r\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center', className)} {...props}>\r\n <ol className=\"m-0 flex list-none flex-wrap items-center gap-1.5 p-0 text-sm\">\r\n {items.map((item, index) => {\r\n const isLast = index === items.length - 1;\r\n return (\r\n <li key={index} className=\"flex items-center gap-1.5\">\r\n {index > 0 && (\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"inline-flex select-none text-sbk-fg-muted [&_svg]:size-3.5\"\r\n >\r\n {separator ?? <ChevronRight />}\r\n </span>\r\n )}\r\n {isLast ? (\r\n <span aria-current=\"page\" className=\"font-semibold text-sbk-fg-heading\">\r\n {item.label}\r\n </span>\r\n ) : item.href ? (\r\n <a\r\n className={cn(\r\n 'rounded-sbk-xs font-light text-sbk-fg-muted underline-offset-4 hover:text-sbk-primary hover:underline',\r\n focusRing,\r\n )}\r\n href={item.href}\r\n >\r\n {item.label}\r\n </a>\r\n ) : (\r\n <span className=\"font-light text-sbk-fg-muted\">{item.label}</span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n);\r\n\r\nBreadcrumb.displayName = 'Breadcrumb';\r\n","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","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","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","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","import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\r\n}\r\n\r\nexport const Container: React.FC<ContainerProps> = ({ size = 'lg', className, ...props }) => {\r\n const sizeClass = {\r\n sm: 'max-w-2xl',\r\n md: 'max-w-4xl',\r\n lg: 'max-w-6xl',\r\n xl: 'max-w-7xl',\r\n full: 'max-w-none',\r\n }[size];\r\n return <div className={cn('mx-auto w-full px-4', sizeClass, className)} {...props} />;\r\n};\r\n\r\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\r\n gap?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n}\r\n\r\nexport const Stack: React.FC<StackProps> = ({ gap = 'md', className, ...props }) => {\r\n const gapClass = {\r\n xs: 'gap-1',\r\n sm: 'gap-2',\r\n md: 'gap-3',\r\n lg: 'gap-4',\r\n xl: 'gap-6',\r\n }[gap];\r\n return <div className={cn('flex flex-col', gapClass, className)} {...props} />;\r\n};\r\n\r\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n cols?: 1 | 2 | 3 | 4;\r\n gap?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n /** Empilha colunas em telas pequenas. Padrão: true. */\r\n responsive?: boolean;\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({\r\n cols = 2,\r\n gap = 'md',\r\n responsive = true,\r\n className,\r\n ...props\r\n}) => {\r\n const colsClass = {\r\n 1: 'grid-cols-1',\r\n 2: responsive ? 'grid-cols-1 sm:grid-cols-2' : 'grid-cols-2',\r\n 3: responsive ? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3' : 'grid-cols-3',\r\n 4: responsive ? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4' : 'grid-cols-4',\r\n }[cols];\r\n const gapClass = {\r\n xs: 'gap-1',\r\n sm: 'gap-2',\r\n md: 'gap-3',\r\n lg: 'gap-4',\r\n xl: 'gap-6',\r\n }[gap];\r\n return <div className={cn('grid', colsClass, gapClass, className)} {...props} />;\r\n};\r\n"],"names":["ThemeContext","createContext","useTheme","context","useContext","readStorage","key","value","systemTheme","_a","ThemeProvider","children","defaultTheme","defaultBrand","storageKey","preference","setPreference","useState","brand","setBrand","system","setSystem","theme","useEffect","mql","onChange","root","toggleTheme","useCallback","useMemo","jsx","sbkTokens","sbkChartPalette","twMerge","extendTailwindMerge","cn","inputs","clsx","COLOR_CLASS","KNOCKOUT","SBK_VIEWBOX","SBK_IA_VIEWBOX","SbkMark","jsxs","SbkIaMark","knockout","Logo","variant","color","height","clearSpace","title","className","style","props","box","width","accessibleName","weightClass","weight","SIZE_CLASS","ALIGN_CLASS","Title","Tag","size","align","italic","Subtitle","muted","Paragraph","Highlight","tone","SIZE_PX","Icon","IconComponent","label","strokeWidth","px","buttonReset","focusRing","transitionColors","fieldLabel","fieldControl","fieldHelper","fieldError","fieldSize","describedBy","id","error","helperText","inverseScope","choiceControl","TONE_CLASS","Spinner","showLabel","COMPACT_CLASS","VARIANT_CLASS","Button","React","compact","fullWidth","isLoading","loadingLabel","leftIcon","rightIcon","disabled","type","ref","IconButton","shape","isItem","entry","DropdownMenu","trigger","items","triggerClassName","ariaLabel","open","setOpen","menuId","useId","triggerRef","useRef","menuRef","containerRef","enabledItems","focusAt","index","list","close","restoreFocus","_b","onClickOutside","e","onMenuKeyDown","char","match","el","i","fallback","target","v","Field","labelAs","required","LabelTag","iconSlot","Input","autoId","inputId","HEIGHT","STEPPER","clamp","n","min","max","NumberInput","step","defaultValue","current","stepBy","dir","stepperClass","Minus","Plus","Select","options","placeholder","selectId","option","ChevronDown","Combobox","emptyText","listId","query","setQuery","isOpen","setIsOpen","activeIndex","setActiveIndex","listRef","selectedOption","o","normalizedQuery","filtered","handleClickOutside","_c","handleSelect","handleKeyDown","selected","Check","Textarea","resizable","textareaId","Checkbox","indeterminate","innerRef","useImperativeHandle","hintId","Radio","TRACK","THUMB","THUMB_ON","Switch","checked","onCheckedChange","switchId","formatSize","bytes","FileUpload","accept","multiple","maxSizeBytes","showFileList","inputRef","isDragging","setIsDragging","sizeError","setSizeError","files","setFiles","commit","next","handleFiles","fileList","incoming","oversized","f","displayError","hints","UploadCloud","file","FileText","_","X","PADDING_CLASS","Card","padding","hoverable","layered","card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","TREND_ICON","ArrowUpRight","ArrowDownRight","ArrowRight","TREND_LABEL","MiniCard","delta","trend","trendPositive","description","icon","onColor","trendColor","BLUR","PADDING","RADIUS","GlassPanel","blur","radius","strong","Table","caption","captionHidden","dense","striped","wrapperClassName","SOLID","SUBTLE","Badge","dot","onRemove","removeLabel","Chip","STATUS_CLASS","STATUS_LABEL","getInitials","name","word","Avatar","src","alt","status","imgError","setImgError","showImage","Divider","orientation","EmptyState","TitleTag","action","TONE","Info","CheckCircle2","AlertTriangle","XCircle","Alert","onClose","role","iconColor","urgent","Toast","onDismiss","_durationMs","bar","ToastContext","toastCounter","ToastProvider","durationMs","position","toasts","setToasts","timers","dismissToast","prev","t","schedule","ms","pushToast","toast","map","pause","resume","ToastViewport","useToast","POSITION","onPause","onResume","base","Skeleton","circle","lines","ProgressBar","showValue","clamped","FOCUSABLE","Modal","subtitle","footer","showCloseButton","closeOnOverlayClick","closeOnEscape","closeLabel","dialogRef","onCloseRef","titleId","subtitleId","previouslyFocused","previousOverflow","frame","focusable","first","last","isGlass","createPortal","ALIGN","Popover","content","defaultOpen","controlledOpen","onOpenChange","uncontrolledOpen","setUncontrolledOpen","panelRef","popoverId","setOpenRef","event","onKeyDown","SIDE_CLASS","Tooltip","side","delay","tooltipId","timer","onKey","show","withDelay","hide","isValidElement","cloneElement","Accordion","defaultOpenId","defaultOpenIds","openIds","setOpenIds","rootRef","baseId","toggle","x","buttons","targets","item","triggerId","panelId","TAB_VARIANT","Tabs","defaultTabId","tabId","onTabChange","internal","setInternal","activeId","styles","select","enabled","it","pos","isActive","detectTheme","Header","logoSrc","logoDarkSrc","logoAlt","logoVariant","navigation","onLogoClick","onMenuClick","menuExpanded","menuLabel","rightContent","showMenuIcon","sticky","userInitials","resolvedTheme","setResolvedTheme","sync","observer","customLogo","Fragment","Menu","Footer","poweredByText","links","copyright","link","containsActive","c","SideNav","sections","collapsed","onNavigate","renderLink","header","allSections","s","itemClass","active","depth","renderItem","groupId","child","handleClick","common","section","Sidebar","Topbar","Breadcrumb","separator","isLast","ChevronRight","getPageTokens","total","siblings","window","start","end","tokens","p","buttonBase","Pagination","currentPage","totalPages","onPageChange","siblingCount","idle","ChevronLeft","token","Stepper","currentStep","currentIndex","isHorizontal","getStatus","connectorColor","PageHeader","actions","breadcrumb","SectionHeader","Container","sizeClass","Stack","gap","gapClass","Grid","cols","responsive","colsClass"],"mappings":"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"}