@sbkbs/ui 1.0.5 → 2.0.0-beta.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 (209) 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 +17 -0
  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 -50
  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 +27 -10
  64. package/dist/components/Header/Header.js +98 -98
  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 +18 -0
  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 +15 -0
  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 +68 -55
  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 +296 -261
  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 -114
  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
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface PaginationProps {\n currentPage: number;\n onPageChange: (page: number) => void;\n totalPages: number;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n}) => {\n if (totalPages <= 1) {\n return null;\n }\n\n const pages = Array.from({ length: totalPages }, (_, i) => i + 1);\n\n return (\n <nav aria-label=\"Paginação\" className=\"flex flex-wrap items-center gap-1\">\n <button\n className=\"rounded-[var(--border-radius-sm)] border border-[var(--border-color)] px-2 py-1 text-sm disabled:opacity-50\"\n disabled={currentPage === 1}\n onClick={() => onPageChange(Math.max(currentPage - 1, 1))}\n type=\"button\"\n >\n Anterior\n </button>\n {pages.map((page) => (\n <button\n className={cn(\n 'rounded-[var(--border-radius-sm)] border px-2.5 py-1 text-sm',\n page === currentPage\n ? 'border-[var(--md-primary)] bg-[var(--md-primary)] text-[var(--md-on-primary)]'\n : 'border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]',\n )}\n key={page}\n onClick={() => onPageChange(page)}\n type=\"button\"\n >\n {page}\n </button>\n ))}\n <button\n className=\"rounded-[var(--border-radius-sm)] border border-[var(--border-color)] px-2 py-1 text-sm disabled:opacity-50\"\n disabled={currentPage === totalPages}\n onClick={() => onPageChange(Math.min(currentPage + 1, totalPages))}\n type=\"button\"\n >\n Próxima\n </button>\n </nav>\n );\n};\n"],"names":["Pagination","currentPage","totalPages","onPageChange","pages","_","jsxs","jsx","page","cn"],"mappings":";;AASO,MAAMA,IAAwC,CAAC;AAAA,EACpD,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AACF,MAAM;AACJ,MAAID,KAAc;AAChB,WAAO;AAGT,QAAME,IAAQ,MAAM,KAAK,EAAE,QAAQF,EAAA,GAAc,CAACG,GAAG,MAAM,IAAI,CAAC;AAEhE,SACE,gBAAAC,EAAC,OAAA,EAAI,cAAW,aAAY,WAAU,qCACpC,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAUN,MAAgB;AAAA,QAC1B,SAAS,MAAME,EAAa,KAAK,IAAIF,IAAc,GAAG,CAAC,CAAC;AAAA,QACxD,MAAK;AAAA,QACN,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGAG,EAAM,IAAI,CAACI,MACV,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWE;AAAA,UACT;AAAA,UACAD,MAASP,IACL,kFACA;AAAA,QAAA;AAAA,QAGN,SAAS,MAAME,EAAaK,CAAI;AAAA,QAChC,MAAK;AAAA,QAEJ,UAAAA;AAAA,MAAA;AAAA,MAJIA;AAAA,IAAA,CAMR;AAAA,IACD,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAUN,MAAgBC;AAAA,QAC1B,SAAS,MAAMC,EAAa,KAAK,IAAIF,IAAc,GAAGC,CAAU,CAAC;AAAA,QACjE,MAAK;AAAA,QACN,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF;AAEJ;"}
1
+ {"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\n\nexport interface PaginationProps {\n className?: string;\n currentPage: number;\n onPageChange: (page: number) => void;\n /** Páginas vizinhas exibidas ao redor da atual. Padrão: 1. */\n siblingCount?: number;\n /**\n * `numbered`: lista de páginas com reticências.\n * `simple`: apenas Anterior/Próxima com \"Página X de Y\" (para paginação sequencial).\n */\n variant?: 'numbered' | 'simple';\n totalPages: number;\n}\n\ntype PageToken = number | 'ellipsis-start' | 'ellipsis-end';\n\nexport const getPageTokens = (current: number, total: number, siblings = 1): PageToken[] => {\n const window = siblings * 2 + 5;\n if (total <= window) return Array.from({ length: total }, (_, i) => i + 1);\n const start = Math.max(2, current - siblings);\n const end = Math.min(total - 1, current + siblings);\n const tokens: PageToken[] = [1];\n if (start > 2) tokens.push('ellipsis-start');\n for (let p = start; p <= end; p++) tokens.push(p);\n if (end < total - 1) tokens.push('ellipsis-end');\n tokens.push(total);\n return tokens;\n};\n\nconst buttonBase = cn(\n 'inline-flex min-h-9 min-w-9 cursor-pointer items-center justify-center gap-1 rounded-sbk-sm border px-2.5 text-sm disabled:cursor-not-allowed disabled:opacity-50',\n transitionColors,\n focusRing,\n);\n\nexport const Pagination = ({\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n variant = 'numbered',\n className,\n}: PaginationProps) => {\n if (totalPages <= 1) return null;\n const idle = 'border-sbk-line bg-sbk-surface font-light text-sbk-fg hover:bg-sbk-surface-hover';\n\n return (\n <nav aria-label=\"Paginação\" className={cn('flex flex-wrap items-center gap-1', className)}>\n <button\n className={cn(buttonReset, buttonBase, idle)}\n disabled={currentPage <= 1}\n onClick={() => onPageChange(currentPage - 1)}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" className=\"size-4\" />\n Anterior\n </button>\n\n {variant === 'simple' ? (\n <span aria-live=\"polite\" className=\"px-3 text-sm font-light text-sbk-fg-muted\">\n Página <strong className=\"font-semibold text-sbk-fg\">{currentPage}</strong> de{' '}\n {totalPages}\n </span>\n ) : (\n getPageTokens(currentPage, totalPages, siblingCount).map((token) =>\n typeof token === 'number' ? (\n <button\n key={token}\n aria-current={token === currentPage ? 'page' : undefined}\n aria-label={`Página ${token}`}\n className={cn(\n buttonReset,\n buttonBase,\n token === currentPage\n ? 'border-sbk-primary bg-sbk-primary font-semibold text-sbk-on-primary'\n : idle,\n )}\n onClick={() => onPageChange(token)}\n type=\"button\"\n >\n {token}\n </button>\n ) : (\n <span key={token} aria-hidden=\"true\" className=\"px-1 text-sm text-sbk-fg-muted\">\n …\n </span>\n ),\n )\n )}\n\n <button\n className={cn(buttonReset, buttonBase, idle)}\n disabled={currentPage >= totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n type=\"button\"\n >\n Próxima\n <ChevronRight aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </nav>\n );\n};\n\nPagination.displayName = 'Pagination';\n"],"names":["getPageTokens","current","total","siblings","window","_","i","start","end","tokens","p","buttonBase","cn","transitionColors","focusRing","Pagination","currentPage","totalPages","onPageChange","siblingCount","variant","className","idle","jsxs","buttonReset","jsx","ChevronLeft","token","ChevronRight"],"mappings":";;;;AAoBO,MAAMA,IAAgB,CAACC,GAAiBC,GAAeC,IAAW,MAAmB;AAC1F,QAAMC,IAASD,IAAW,IAAI;AAC9B,MAAID,KAASE,EAAQ,QAAO,MAAM,KAAK,EAAE,QAAQF,EAAA,GAAS,CAACG,GAAGC,MAAMA,IAAI,CAAC;AACzE,QAAMC,IAAQ,KAAK,IAAI,GAAGN,IAAUE,CAAQ,GACtCK,IAAM,KAAK,IAAIN,IAAQ,GAAGD,IAAUE,CAAQ,GAC5CM,IAAsB,CAAC,CAAC;AAC9B,EAAIF,IAAQ,KAAGE,EAAO,KAAK,gBAAgB;AAC3C,WAASC,IAAIH,GAAOG,KAAKF,GAAKE,IAAK,CAAAD,EAAO,KAAKC,CAAC;AAChD,SAAIF,IAAMN,IAAQ,KAAGO,EAAO,KAAK,cAAc,GAC/CA,EAAO,KAAKP,CAAK,GACVO;AACT,GAEME,IAAaC;AAAA,EACjB;AAAA,EACAC;AAAA,EACAC;AACF,GAEaC,IAAa,CAAC;AAAA,EACzB,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAuB;AACrB,MAAIJ,KAAc,EAAG,QAAO;AAC5B,QAAMK,IAAO;AAEb,SACE,gBAAAC,EAAC,SAAI,cAAW,aAAY,WAAWX,EAAG,qCAAqCS,CAAS,GACtF,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAe;AAAA,QACzB,SAAS,MAAME,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QAEL,UAAA;AAAA,UAAA,gBAAAS,EAACC,GAAA,EAAY,eAAY,QAAO,WAAU,UAAS;AAAA,UAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAItDN,MAAY,WACX,gBAAAG,EAAC,UAAK,aAAU,UAAS,WAAU,6CAA4C,UAAA;AAAA,MAAA;AAAA,MACtE,gBAAAE,EAAC,UAAA,EAAO,WAAU,6BAA6B,UAAAT,GAAY;AAAA,MAAS;AAAA,MAAI;AAAA,MAC9EC;AAAA,IAAA,EAAA,CACH,IAEAjB,EAAcgB,GAAaC,GAAYE,CAAY,EAAE;AAAA,MAAI,CAACQ,MACxD,OAAOA,KAAU,WACf,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,gBAAcE,MAAUX,IAAc,SAAS;AAAA,UAC/C,cAAY,UAAUW,CAAK;AAAA,UAC3B,WAAWf;AAAA,YACTY;AAAA,YACAb;AAAA,YACAgB,MAAUX,IACN,wEACAM;AAAA,UAAA;AAAA,UAEN,SAAS,MAAMJ,EAAaS,CAAK;AAAA,UACjC,MAAK;AAAA,UAEJ,UAAAA;AAAA,QAAA;AAAA,QAbIA;AAAA,MAAA,sBAgBN,QAAA,EAAiB,eAAY,QAAO,WAAU,kCAAiC,iBAArEA,CAEX;AAAA,IAAA;AAAA,IAKN,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWX,EAAGY,GAAab,GAAYW,CAAI;AAAA,QAC3C,UAAUN,KAAeC;AAAA,QACzB,SAAS,MAAMC,EAAaF,IAAc,CAAC;AAAA,QAC3C,MAAK;AAAA,QACN,UAAA;AAAA,UAAA;AAAA,UAEC,gBAAAS,EAACG,GAAA,EAAa,eAAY,QAAO,WAAU,SAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACtD,GACF;AAEJ;AAEAb,EAAW,cAAc;"}
@@ -1,11 +1,17 @@
1
1
  import type React from 'react';
2
+ import { type TextWeight } from '../Typography/weight';
2
3
  export interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {
3
4
  align?: 'left' | 'center' | 'right' | 'justify';
4
5
  as?: 'p' | 'span' | 'div';
5
6
  children: React.ReactNode;
6
7
  italic?: boolean;
8
+ /** Cor secundária (Chumbo Leve). */
7
9
  muted?: boolean;
8
10
  size?: 'xs' | 'sm' | 'md' | 'lg';
9
- weight?: 'light' | 'normal' | 'medium';
11
+ /** Padrão: light (brand book: corpo em Leve 300, não em Regular 400). */
12
+ weight?: TextWeight;
10
13
  }
11
- export declare const Paragraph: React.FC<ParagraphProps>;
14
+ export declare const Paragraph: {
15
+ ({ as: Tag, size, weight, align, muted, italic, children, className, ...props }: ParagraphProps): import("react/jsx-runtime").JSX.Element;
16
+ displayName: string;
17
+ };
@@ -1,41 +1,44 @@
1
- import { jsx as v } from "react/jsx-runtime";
2
- const d = ({
1
+ import { jsx as g } from "react/jsx-runtime";
2
+ import { cn as f } from "../../utils/cn.js";
3
+ import { weightClass as n } from "../Typography/weight.js";
4
+ const o = {
5
+ xs: "text-xs leading-normal",
6
+ sm: "text-sm leading-normal",
7
+ md: "text-base leading-relaxed",
8
+ lg: "text-lg leading-relaxed"
9
+ }, d = {
10
+ left: "text-left",
11
+ center: "text-center",
12
+ right: "text-right",
13
+ justify: "text-justify"
14
+ }, p = ({
3
15
  as: t = "p",
4
16
  size: e = "md",
5
- weight: a = "normal",
6
- align: i = "left",
7
- muted: n = !1,
8
- italic: o = !1,
9
- children: r,
10
- className: l = "",
11
- ...s
12
- }) => {
13
- const m = t, g = {
14
- xs: "text-[var(--font-size-xs)] leading-[var(--line-height-normal)]",
15
- sm: "text-[var(--font-size-sm)] leading-[var(--line-height-normal)]",
16
- md: "text-[var(--font-size-base)] leading-[var(--line-height-relaxed)]",
17
- lg: "text-[var(--font-size-lg)] leading-[var(--line-height-loose)]"
18
- }, f = {
19
- light: "font-[var(--font-weight-light)]",
20
- normal: "font-[var(--font-weight-normal)]",
21
- medium: "font-[var(--font-weight-medium)]"
22
- }, h = {
23
- left: "text-left",
24
- center: "text-center",
25
- right: "text-right",
26
- justify: "text-justify"
27
- }, x = [
28
- "m-0 text-[var(--text-primary)] transition-[var(--transition-colors)]",
29
- g[e],
30
- f[a],
31
- h[i],
32
- o ? "italic" : "not-italic",
33
- n ? "text-[var(--text-muted)]" : "",
34
- l
35
- ].filter(Boolean).join(" ");
36
- return /* @__PURE__ */ v(m, { className: x, ...s, children: r });
37
- };
17
+ weight: a = "light",
18
+ align: s = "left",
19
+ muted: l = !1,
20
+ italic: r = !1,
21
+ children: x,
22
+ className: i,
23
+ ...m
24
+ }) => /* @__PURE__ */ g(
25
+ t,
26
+ {
27
+ className: f(
28
+ "m-0 font-sbk text-pretty",
29
+ o[e],
30
+ n(a),
31
+ d[s],
32
+ l ? "text-sbk-fg-muted" : "text-sbk-fg",
33
+ r && "italic",
34
+ i
35
+ ),
36
+ ...m,
37
+ children: x
38
+ }
39
+ );
40
+ p.displayName = "Paragraph";
38
41
  export {
39
- d as Paragraph
42
+ p as Paragraph
40
43
  };
41
44
  //# sourceMappingURL=Paragraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Paragraph.js","sources":["../../../src/components/Paragraph/Paragraph.tsx"],"sourcesContent":["import type React from 'react';\n\nexport interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n italic?: boolean;\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n weight?: 'light' | 'normal' | 'medium';\n}\n\nexport const Paragraph: React.FC<ParagraphProps> = ({\n as = 'p',\n size = 'md',\n weight = 'normal',\n align = 'left',\n muted = false,\n italic = false,\n children,\n className = '',\n ...props\n}) => {\n const Component = as;\n const sizeClassMap: Record<NonNullable<ParagraphProps['size']>, string> = {\n xs: 'text-[var(--font-size-xs)] leading-[var(--line-height-normal)]',\n sm: 'text-[var(--font-size-sm)] leading-[var(--line-height-normal)]',\n md: 'text-[var(--font-size-base)] leading-[var(--line-height-relaxed)]',\n lg: 'text-[var(--font-size-lg)] leading-[var(--line-height-loose)]',\n };\n const weightClassMap: Record<NonNullable<ParagraphProps['weight']>, string> = {\n light: 'font-[var(--font-weight-light)]',\n normal: 'font-[var(--font-weight-normal)]',\n medium: 'font-[var(--font-weight-medium)]',\n };\n const alignClassMap: Record<NonNullable<ParagraphProps['align']>, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n };\n const combinedClass = [\n 'm-0 text-[var(--text-primary)] transition-[var(--transition-colors)]',\n sizeClassMap[size],\n weightClassMap[weight],\n alignClassMap[align],\n italic ? 'italic' : 'not-italic',\n muted ? 'text-[var(--text-muted)]' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Component className={combinedClass} {...props}>\n {children}\n </Component>\n );\n};\n"],"names":["Paragraph","as","size","weight","align","muted","italic","children","className","props","Component","sizeClassMap","weightClassMap","alignClassMap","combinedClass"],"mappings":";AAYO,MAAMA,IAAsC,CAAC;AAAA,EAClD,IAAAC,IAAK;AAAA,EACL,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAYT,GACZU,IAAoE;AAAA,IACxE,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAEAC,IAAwE;AAAA,IAC5E,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,GAEJC,IAAsE;AAAA,IAC1E,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,GAELC,IAAgB;AAAA,IACpB;AAAA,IACAH,EAAaT,CAAI;AAAA,IACjBU,EAAeT,CAAM;AAAA,IACrBU,EAAcT,CAAK;AAAA,IACnBE,IAAS,WAAW;AAAA,IACpBD,IAAQ,6BAA6B;AAAA,IACrCG;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BACGE,GAAA,EAAU,WAAWI,GAAgB,GAAGL,GACtC,UAAAF,GACH;AAEJ;"}
1
+ {"version":3,"file":"Paragraph.js","sources":["../../../src/components/Paragraph/Paragraph.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\nimport { type TextWeight, weightClass } from '../Typography/weight';\n\nexport interface ParagraphProps extends React.HTMLAttributes<HTMLParagraphElement> {\n align?: 'left' | 'center' | 'right' | 'justify';\n as?: 'p' | 'span' | 'div';\n children: React.ReactNode;\n italic?: boolean;\n /** Cor secundária (Chumbo Leve). */\n muted?: boolean;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n /** Padrão: light (brand book: corpo em Leve 300, não em Regular 400). */\n weight?: TextWeight;\n}\n\nconst SIZE_CLASS = {\n xs: 'text-xs leading-normal',\n sm: 'text-sm leading-normal',\n md: 'text-base leading-relaxed',\n lg: 'text-lg leading-relaxed',\n} as const;\n\nconst ALIGN_CLASS = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n} as const;\n\nexport const Paragraph = ({\n as: Tag = 'p',\n size = 'md',\n weight = 'light',\n align = 'left',\n muted = false,\n italic = false,\n children,\n className,\n ...props\n}: ParagraphProps) => (\n <Tag\n className={cn(\n 'm-0 font-sbk text-pretty',\n SIZE_CLASS[size],\n weightClass(weight),\n ALIGN_CLASS[align],\n muted ? 'text-sbk-fg-muted' : 'text-sbk-fg',\n italic && 'italic',\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n);\n\nParagraph.displayName = 'Paragraph';\n"],"names":["SIZE_CLASS","ALIGN_CLASS","Paragraph","Tag","size","weight","align","muted","italic","children","className","props","jsx","cn","weightClass"],"mappings":";;;AAgBA,MAAMA,IAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAc;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX,GAEaC,IAAY,CAAC;AAAA,EACxB,IAAIC,IAAM;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACT;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAb,EAAWI,CAAI;AAAA,MACfU,EAAYT,CAAM;AAAA,MAClBJ,EAAYK,CAAK;AAAA,MACjBC,IAAQ,sBAAsB;AAAA,MAC9BC,KAAU;AAAA,MACVE;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,IAEH,UAAAF;AAAA,EAAA;AACH;AAGFP,EAAU,cAAc;"}
@@ -1,7 +1,18 @@
1
1
  import type React from 'react';
2
2
  export interface PopoverProps {
3
+ align?: 'start' | 'center' | 'end';
3
4
  children: React.ReactNode;
5
+ /** Classe do botão gatilho. */
6
+ className?: string;
4
7
  content: React.ReactNode;
5
8
  defaultOpen?: boolean;
9
+ /** Controle externo do estado aberto. */
10
+ open?: boolean;
11
+ onOpenChange?: (open: boolean) => void;
12
+ variant?: 'default' | 'glass';
6
13
  }
7
- export declare const Popover: React.FC<PopoverProps>;
14
+ /** Painel flutuante não modal ancorado a um gatilho. Fecha com Esc e clique fora. */
15
+ export declare const Popover: {
16
+ ({ children, content, defaultOpen, open: controlledOpen, onOpenChange, align, variant, className, }: PopoverProps): import("react/jsx-runtime").JSX.Element;
17
+ displayName: string;
18
+ };
@@ -1,57 +1,69 @@
1
- import { jsxs as v, jsx as u } from "react/jsx-runtime";
2
- import { useState as b, useRef as a, useId as x, useEffect as d } from "react";
3
- import { cn as w } from "../../utils/cn.js";
4
- const E = ({ children: f, content: m, defaultOpen: p = !1 }) => {
5
- const [n, t] = b(p), i = a(null), c = a(null), o = a(null), l = x();
6
- return d(() => {
7
- const e = (s) => {
8
- var r;
9
- (r = i.current) != null && r.contains(s.target) || t(!1);
10
- };
11
- return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
12
- }, []), d(() => {
13
- if (!n || !o.current)
14
- return;
15
- const e = o.current.querySelector(
1
+ import { jsxs as I, jsx as v } from "react/jsx-runtime";
2
+ import { useState as h, useRef as o, useId as j, useEffect as z } from "react";
3
+ import { cn as k } from "../../utils/cn.js";
4
+ import { buttonReset as P } from "../../utils/styles.js";
5
+ const S = { start: "left-0", center: "left-1/2 -translate-x-1/2", end: "right-0" }, q = ({
6
+ children: x,
7
+ content: g,
8
+ defaultOpen: w = !1,
9
+ open: c,
10
+ onOpenChange: r,
11
+ align: y = "center",
12
+ variant: E = "default",
13
+ className: R
14
+ }) => {
15
+ const [L, N] = h(w), e = c ?? L, d = o(null), l = o(null), u = o(null), f = j(), s = (t) => {
16
+ c === void 0 && N(t), r == null || r(t);
17
+ }, a = o(s);
18
+ return a.current = s, z(() => {
19
+ var p, b;
20
+ if (!e) return;
21
+ (b = (p = u.current) == null ? void 0 : p.querySelector(
16
22
  'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
17
- );
18
- e == null || e.focus();
19
- }, [n]), d(() => {
20
- const e = (s) => {
21
- var r;
22
- s.key === "Escape" && (t(!1), (r = c.current) == null || r.focus());
23
+ )) == null || b.focus();
24
+ const t = (i) => {
25
+ var n;
26
+ (n = d.current) != null && n.contains(i.target) || a.current(!1);
27
+ }, m = (i) => {
28
+ var n;
29
+ i.key === "Escape" && (a.current(!1), (n = l.current) == null || n.focus());
30
+ };
31
+ return document.addEventListener("mousedown", t), document.addEventListener("keydown", m), () => {
32
+ document.removeEventListener("mousedown", t), document.removeEventListener("keydown", m);
23
33
  };
24
- return n && document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
25
- }, [n]), /* @__PURE__ */ v("div", { className: "relative inline-flex", ref: i, children: [
26
- /* @__PURE__ */ u(
34
+ }, [e]), /* @__PURE__ */ I("div", { ref: d, className: "relative inline-flex", children: [
35
+ /* @__PURE__ */ v(
27
36
  "button",
28
37
  {
29
- "aria-controls": n ? l : void 0,
30
- "aria-expanded": n,
38
+ ref: l,
39
+ "aria-controls": e ? f : void 0,
40
+ "aria-expanded": e,
31
41
  "aria-haspopup": "dialog",
32
- className: "inline-flex",
33
- onClick: () => t((e) => !e),
34
- ref: c,
42
+ className: k(P, "inline-flex cursor-pointer", R),
43
+ onClick: () => s(!e),
35
44
  type: "button",
36
- children: f
45
+ children: x
37
46
  }
38
47
  ),
39
- n && /* @__PURE__ */ u(
48
+ e && /* @__PURE__ */ v(
40
49
  "div",
41
50
  {
42
- className: w(
43
- "absolute left-1/2 top-full z-30 mt-2 w-max -translate-x-1/2 rounded-[var(--border-radius-md)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-3 shadow-[var(--shadow-md)]"
51
+ ref: u,
52
+ className: k(
53
+ "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",
54
+ E === "glass" ? "sbk-glass sbk-glass-strong" : "border border-sbk-line bg-sbk-surface shadow-sbk-md",
55
+ S[y]
44
56
  ),
45
- id: l,
46
- ref: o,
57
+ id: f,
47
58
  role: "dialog",
48
59
  tabIndex: -1,
49
- children: m
60
+ children: g
50
61
  }
51
62
  )
52
63
  ] });
53
64
  };
65
+ q.displayName = "Popover";
54
66
  export {
55
- E as Popover
67
+ q as Popover
56
68
  };
57
69
  //# sourceMappingURL=Popover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import type React from 'react';\nimport { useEffect, useId, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface PopoverProps {\n children: React.ReactNode;\n content: React.ReactNode;\n defaultOpen?: boolean;\n}\n\nexport const Popover: React.FC<PopoverProps> = ({ children, content, defaultOpen = false }) => {\n const [open, setOpen] = useState(defaultOpen);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const panelRef = useRef<HTMLDivElement | null>(null);\n const popoverId = useId();\n\n useEffect(() => {\n const onClickOutside = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onClickOutside);\n return () => document.removeEventListener('mousedown', onClickOutside);\n }, []);\n\n useEffect(() => {\n if (!open || !panelRef.current) {\n return;\n }\n\n const focusable = panelRef.current.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n focusable?.focus();\n }, [open]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n triggerRef.current?.focus();\n }\n };\n if (open) {\n document.addEventListener('keydown', onKeyDown);\n }\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [open]);\n\n return (\n <div className=\"relative inline-flex\" ref={containerRef}>\n <button\n aria-controls={open ? popoverId : undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n className=\"inline-flex\"\n onClick={() => setOpen((prev) => !prev)}\n ref={triggerRef}\n type=\"button\"\n >\n {children}\n </button>\n {open && (\n <div\n className={cn(\n 'absolute left-1/2 top-full z-30 mt-2 w-max -translate-x-1/2 rounded-[var(--border-radius-md)] border border-[var(--border-color)] bg-[var(--bg-secondary)] p-3 shadow-[var(--shadow-md)]',\n )}\n id={popoverId}\n ref={panelRef}\n role=\"dialog\"\n tabIndex={-1}\n >\n {content}\n </div>\n )}\n </div>\n );\n};\n"],"names":["Popover","children","content","defaultOpen","open","setOpen","useState","containerRef","useRef","triggerRef","panelRef","popoverId","useId","useEffect","onClickOutside","event","_a","focusable","onKeyDown","jsxs","jsx","prev","cn"],"mappings":";;;AAUO,MAAMA,IAAkC,CAAC,EAAE,UAAAC,GAAU,SAAAC,GAAS,aAAAC,IAAc,SAAY;AAC7F,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAASH,CAAW,GACtCI,IAAeC,EAA8B,IAAI,GACjDC,IAAaD,EAAiC,IAAI,GAClDE,IAAWF,EAA8B,IAAI,GAC7CG,IAAYC,EAAA;AAElB,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAiB,CAACC,MAAsB;;AAC5C,OAAKC,IAAAT,EAAa,YAAb,QAAAS,EAAsB,SAASD,EAAM,WACxCV,EAAQ,EAAK;AAAA,IAEjB;AACA,oBAAS,iBAAiB,aAAaS,CAAc,GAC9C,MAAM,SAAS,oBAAoB,aAAaA,CAAc;AAAA,EACvE,GAAG,CAAA,CAAE,GAELD,EAAU,MAAM;AACd,QAAI,CAACT,KAAQ,CAACM,EAAS;AACrB;AAGF,UAAMO,IAAYP,EAAS,QAAQ;AAAA,MACjC;AAAA,IAAA;AAEF,IAAAO,KAAA,QAAAA,EAAW;AAAA,EACb,GAAG,CAACb,CAAI,CAAC,GAETS,EAAU,MAAM;AACd,UAAMK,IAAY,CAACH,MAAyB;;AAC1C,MAAIA,EAAM,QAAQ,aAChBV,EAAQ,EAAK,IACbW,IAAAP,EAAW,YAAX,QAAAO,EAAoB;AAAA,IAExB;AACA,WAAIZ,KACF,SAAS,iBAAiB,WAAWc,CAAS,GAEzC,MAAM,SAAS,oBAAoB,WAAWA,CAAS;AAAA,EAChE,GAAG,CAACd,CAAI,CAAC,GAGP,gBAAAe,EAAC,OAAA,EAAI,WAAU,wBAAuB,KAAKZ,GACzC,UAAA;AAAA,IAAA,gBAAAa;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,iBAAehB,IAAOO,IAAY;AAAA,QAClC,iBAAeP;AAAA,QACf,iBAAc;AAAA,QACd,WAAU;AAAA,QACV,SAAS,MAAMC,EAAQ,CAACgB,MAAS,CAACA,CAAI;AAAA,QACtC,KAAKZ;AAAA,QACL,MAAK;AAAA,QAEJ,UAAAR;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFG,KACC,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWE;AAAA,UACT;AAAA,QAAA;AAAA,QAEF,IAAIX;AAAA,QACJ,KAAKD;AAAA,QACL,MAAK;AAAA,QACL,UAAU;AAAA,QAET,UAAAR;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import type React from 'react';\nimport { useEffect, useId, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset } from '../../utils/styles';\n\nexport interface PopoverProps {\n align?: 'start' | 'center' | 'end';\n children: React.ReactNode;\n /** Classe do botão gatilho. */\n className?: string;\n content: React.ReactNode;\n defaultOpen?: boolean;\n /** Controle externo do estado aberto. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n variant?: 'default' | 'glass';\n}\n\nconst ALIGN = { start: 'left-0', center: 'left-1/2 -translate-x-1/2', end: 'right-0' } as const;\n\n/** Painel flutuante não modal ancorado a um gatilho. Fecha com Esc e clique fora. */\nexport const Popover = ({\n children,\n content,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n align = 'center',\n variant = 'default',\n className,\n}: PopoverProps) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = controlledOpen ?? uncontrolledOpen;\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const popoverId = useId();\n\n const setOpen = (next: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\n const setOpenRef = useRef(setOpen);\n setOpenRef.current = setOpen;\n\n useEffect(() => {\n if (!open) return;\n panelRef.current\n ?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n ?.focus();\n\n const onClickOutside = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) setOpenRef.current(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpenRef.current(false);\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('mousedown', onClickOutside);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onClickOutside);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={containerRef} className=\"relative inline-flex\">\n <button\n ref={triggerRef}\n aria-controls={open ? popoverId : undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n className={cn(buttonReset, 'inline-flex cursor-pointer', className)}\n onClick={() => setOpen(!open)}\n type=\"button\"\n >\n {children}\n </button>\n {open && (\n <div\n ref={panelRef}\n className={cn(\n 'absolute top-full z-[var(--sbk-z-dropdown)] mt-2 w-max max-w-sm rounded-sbk-md p-4 text-sm font-light text-sbk-fg animate-sbk-fade-in',\n variant === 'glass'\n ? 'sbk-glass sbk-glass-strong'\n : 'border border-sbk-line bg-sbk-surface shadow-sbk-md',\n ALIGN[align],\n )}\n id={popoverId}\n role=\"dialog\"\n tabIndex={-1}\n >\n {content}\n </div>\n )}\n </div>\n );\n};\n\nPopover.displayName = 'Popover';\n"],"names":["ALIGN","Popover","children","content","defaultOpen","controlledOpen","onOpenChange","align","variant","className","uncontrolledOpen","setUncontrolledOpen","useState","open","containerRef","useRef","triggerRef","panelRef","popoverId","useId","setOpen","next","setOpenRef","useEffect","_b","_a","onClickOutside","event","onKeyDown","jsxs","jsx","cn","buttonReset"],"mappings":";;;;AAkBA,MAAMA,IAAQ,EAAE,OAAO,UAAU,QAAQ,6BAA6B,KAAK,UAAA,GAG9DC,IAAU,CAAC;AAAA,EACtB,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAoB;AAClB,QAAM,CAACC,GAAkBC,CAAmB,IAAIC,EAASR,CAAW,GAC9DS,IAAOR,KAAkBK,GACzBI,IAAeC,EAAuB,IAAI,GAC1CC,IAAaD,EAA0B,IAAI,GAC3CE,IAAWF,EAAuB,IAAI,GACtCG,IAAYC,EAAA,GAEZC,IAAU,CAACC,MAAkB;AACjC,IAAIhB,MAAmB,UAAWM,EAAoBU,CAAI,GAC1Df,KAAA,QAAAA,EAAee;AAAA,EACjB,GACMC,IAAaP,EAAOK,CAAO;AACjC,SAAAE,EAAW,UAAUF,GAErBG,EAAU,MAAM;;AACd,QAAI,CAACV,EAAM;AACX,KAAAW,KAAAC,IAAAR,EAAS,YAAT,gBAAAQ,EACI;AAAA,MACA;AAAA,UAFJ,QAAAD,EAII;AAEJ,UAAME,IAAiB,CAACC,MAAsB;;AAC5C,OAAKF,IAAAX,EAAa,YAAb,QAAAW,EAAsB,SAASE,EAAM,WAAiBL,EAAW,QAAQ,EAAK;AAAA,IACrF,GACMM,IAAY,CAACD,MAAyB;;AAC1C,MAAIA,EAAM,QAAQ,aAChBL,EAAW,QAAQ,EAAK,IACxBG,IAAAT,EAAW,YAAX,QAAAS,EAAoB;AAAA,IAExB;AACA,oBAAS,iBAAiB,aAAaC,CAAc,GACrD,SAAS,iBAAiB,WAAWE,CAAS,GACvC,MAAM;AACX,eAAS,oBAAoB,aAAaF,CAAc,GACxD,SAAS,oBAAoB,WAAWE,CAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAACf,CAAI,CAAC,GAGP,gBAAAgB,EAAC,OAAA,EAAI,KAAKf,GAAc,WAAU,wBAChC,UAAA;AAAA,IAAA,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKd;AAAA,QACL,iBAAeH,IAAOK,IAAY;AAAA,QAClC,iBAAeL;AAAA,QACf,iBAAc;AAAA,QACd,WAAWkB,EAAGC,GAAa,8BAA8BvB,CAAS;AAAA,QAClE,SAAS,MAAMW,EAAQ,CAACP,CAAI;AAAA,QAC5B,MAAK;AAAA,QAEJ,UAAAX;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFW,KACC,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKb;AAAA,QACL,WAAWc;AAAA,UACT;AAAA,UACAvB,MAAY,UACR,+BACA;AAAA,UACJR,EAAMO,CAAK;AAAA,QAAA;AAAA,QAEb,IAAIW;AAAA,QACJ,MAAK;AAAA,QACL,UAAU;AAAA,QAET,UAAAf;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;AAEAF,EAAQ,cAAc;"}
@@ -0,0 +1,18 @@
1
+ import type React from 'react';
2
+ export interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /** Barra animada sem valor conhecido (carregamento em andamento). */
4
+ indeterminate?: boolean;
5
+ /** Label acessível. Obrigatório quando não houver texto visível associado. */
6
+ label?: string;
7
+ /** Exibe o percentual ao lado da barra. */
8
+ showValue?: boolean;
9
+ size?: 'sm' | 'md' | 'lg';
10
+ tone?: 'primary' | 'success' | 'warning' | 'error' | 'info';
11
+ /** Valor atual (0 a 100). Ignorado quando `indeterminate`. */
12
+ value?: number;
13
+ }
14
+ /** Barra de progresso determinada ou indeterminada ("bar load"). */
15
+ export declare const ProgressBar: {
16
+ ({ value, indeterminate, size, tone, label, showValue, className, ...props }: ProgressBarProps): import("react/jsx-runtime").JSX.Element;
17
+ displayName: string;
18
+ };
@@ -0,0 +1,71 @@
1
+ import { jsxs as o, jsx as e } from "react/jsx-runtime";
2
+ import { cn as r } from "../../utils/cn.js";
3
+ const b = { sm: "h-1", md: "h-2", lg: "h-3" }, l = {
4
+ primary: "bg-sbk-primary",
5
+ success: "bg-sbk-success",
6
+ warning: "bg-sbk-warning",
7
+ error: "bg-sbk-error",
8
+ info: "bg-sbk-info"
9
+ }, f = ({
10
+ value: n = 0,
11
+ indeterminate: s = !1,
12
+ size: t = "md",
13
+ tone: i = "primary",
14
+ label: d,
15
+ showValue: m = !1,
16
+ className: u,
17
+ ...c
18
+ }) => {
19
+ const a = Math.min(100, Math.max(0, n));
20
+ return /* @__PURE__ */ o("div", { className: r("flex items-center gap-2", u), ...c, children: [
21
+ /* @__PURE__ */ e(
22
+ "div",
23
+ {
24
+ "aria-busy": s || void 0,
25
+ "aria-label": d,
26
+ "aria-valuemax": s ? void 0 : 100,
27
+ "aria-valuemin": s ? void 0 : 0,
28
+ "aria-valuenow": s ? void 0 : a,
29
+ className: r(
30
+ "relative flex-1 overflow-hidden rounded-full bg-sbk-surface-sunken",
31
+ b[t]
32
+ ),
33
+ role: "progressbar",
34
+ children: s ? /* @__PURE__ */ e(
35
+ "div",
36
+ {
37
+ className: r(
38
+ "absolute inset-y-0 left-0 w-2/5 rounded-full animate-sbk-indeterminate motion-reduce:w-full motion-reduce:animate-pulse",
39
+ l[i]
40
+ )
41
+ }
42
+ ) : /* @__PURE__ */ e(
43
+ "div",
44
+ {
45
+ className: r(
46
+ "h-full rounded-full transition-[width] duration-300 motion-reduce:transition-none",
47
+ l[i]
48
+ ),
49
+ style: { width: `${a}%` }
50
+ }
51
+ )
52
+ }
53
+ ),
54
+ m && !s && /* @__PURE__ */ o(
55
+ "span",
56
+ {
57
+ "aria-hidden": "true",
58
+ className: "w-10 shrink-0 text-right text-xs font-semibold text-sbk-fg-muted",
59
+ children: [
60
+ a,
61
+ "%"
62
+ ]
63
+ }
64
+ )
65
+ ] });
66
+ };
67
+ f.displayName = "ProgressBar";
68
+ export {
69
+ f as ProgressBar
70
+ };
71
+ //# sourceMappingURL=ProgressBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBar.js","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Barra animada sem valor conhecido (carregamento em andamento). */\n indeterminate?: boolean;\n /** Label acessível. Obrigatório quando não houver texto visível associado. */\n label?: string;\n /** Exibe o percentual ao lado da barra. */\n showValue?: boolean;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'primary' | 'success' | 'warning' | 'error' | 'info';\n /** Valor atual (0 a 100). Ignorado quando `indeterminate`. */\n value?: number;\n}\n\nconst SIZE_CLASS = { sm: 'h-1', md: 'h-2', lg: 'h-3' } as const;\n\nconst TONE_CLASS: Record<NonNullable<ProgressBarProps['tone']>, string> = {\n primary: 'bg-sbk-primary',\n success: 'bg-sbk-success',\n warning: 'bg-sbk-warning',\n error: 'bg-sbk-error',\n info: 'bg-sbk-info',\n};\n\n/** Barra de progresso determinada ou indeterminada (\"bar load\"). */\nexport const ProgressBar = ({\n value = 0,\n indeterminate = false,\n size = 'md',\n tone = 'primary',\n label,\n showValue = false,\n className,\n ...props\n}: ProgressBarProps) => {\n const clamped = Math.min(100, Math.max(0, value));\n\n return (\n <div className={cn('flex items-center gap-2', className)} {...props}>\n <div\n aria-busy={indeterminate || undefined}\n aria-label={label}\n aria-valuemax={indeterminate ? undefined : 100}\n aria-valuemin={indeterminate ? undefined : 0}\n aria-valuenow={indeterminate ? undefined : clamped}\n className={cn(\n 'relative flex-1 overflow-hidden rounded-full bg-sbk-surface-sunken',\n SIZE_CLASS[size],\n )}\n role=\"progressbar\"\n >\n {indeterminate ? (\n <div\n className={cn(\n 'absolute inset-y-0 left-0 w-2/5 rounded-full animate-sbk-indeterminate motion-reduce:w-full motion-reduce:animate-pulse',\n TONE_CLASS[tone],\n )}\n />\n ) : (\n <div\n className={cn(\n 'h-full rounded-full transition-[width] duration-300 motion-reduce:transition-none',\n TONE_CLASS[tone],\n )}\n style={{ width: `${clamped}%` }}\n />\n )}\n </div>\n {showValue && !indeterminate && (\n <span\n aria-hidden=\"true\"\n className=\"w-10 shrink-0 text-right text-xs font-semibold text-sbk-fg-muted\"\n >\n {clamped}%\n </span>\n )}\n </div>\n );\n};\n\nProgressBar.displayName = 'ProgressBar';\n"],"names":["SIZE_CLASS","TONE_CLASS","ProgressBar","value","indeterminate","size","tone","label","showValue","className","props","clamped","jsxs","cn","jsx"],"mappings":";;AAgBA,MAAMA,IAAa,EAAE,IAAI,OAAO,IAAI,OAAO,IAAI,MAAA,GAEzCC,IAAoE;AAAA,EACxE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR,GAGaC,IAAc,CAAC;AAAA,EAC1B,OAAAC,IAAQ;AAAA,EACR,eAAAC,IAAgB;AAAA,EAChB,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,GAAGC;AACL,MAAwB;AACtB,QAAMC,IAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGR,CAAK,CAAC;AAEhD,SACE,gBAAAS,EAAC,SAAI,WAAWC,EAAG,2BAA2BJ,CAAS,GAAI,GAAGC,GAC5D,UAAA;AAAA,IAAA,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAWV,KAAiB;AAAA,QAC5B,cAAYG;AAAA,QACZ,iBAAeH,IAAgB,SAAY;AAAA,QAC3C,iBAAeA,IAAgB,SAAY;AAAA,QAC3C,iBAAeA,IAAgB,SAAYO;AAAA,QAC3C,WAAWE;AAAA,UACT;AAAA,UACAb,EAAWK,CAAI;AAAA,QAAA;AAAA,QAEjB,MAAK;AAAA,QAEJ,UAAAD,IACC,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAZ,EAAWK,CAAI;AAAA,YAAA;AAAA,UACjB;AAAA,QAAA,IAGF,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAZ,EAAWK,CAAI;AAAA,YAAA;AAAA,YAEjB,OAAO,EAAE,OAAO,GAAGK,CAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MAChC;AAAA,IAAA;AAAA,IAGHH,KAAa,CAACJ,KACb,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,QAET,UAAA;AAAA,UAAAD;AAAA,UAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,GAEJ;AAEJ;AAEAT,EAAY,cAAc;"}
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  export interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
3
  helperText?: string;
4
- label?: string;
4
+ label?: React.ReactNode;
5
5
  }
6
+ /** Radio individual. Agrupe com <fieldset> + <legend> e o mesmo `name`. */
6
7
  export declare const Radio: React.ForwardRefExoticComponent<RadioProps & React.RefAttributes<HTMLInputElement>>;
@@ -1,36 +1,32 @@
1
- import { jsxs as a, jsx as r } from "react/jsx-runtime";
2
- import m from "react";
3
- import { cn as c } from "../../utils/cn.js";
4
- const d = m.forwardRef(
5
- ({ label: t, helperText: e, className: s, id: o, ...n }, l) => {
6
- const i = o || `radio-${Math.random().toString(36).slice(2, 9)}`;
7
- return /* @__PURE__ */ a(
8
- "label",
9
- {
10
- className: c("inline-flex cursor-pointer items-start gap-2", s),
11
- htmlFor: i,
12
- children: [
13
- /* @__PURE__ */ r(
14
- "input",
15
- {
16
- ref: l,
17
- className: "mt-0.5 h-4 w-4 border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--border-color-focus)]",
18
- id: i,
19
- type: "radio",
20
- ...n
21
- }
22
- ),
23
- /* @__PURE__ */ a("span", { className: "grid gap-0.5", children: [
24
- t && /* @__PURE__ */ r("span", { className: "text-sm text-[var(--text-primary)]", children: t }),
25
- e && /* @__PURE__ */ r("span", { className: "text-xs text-[var(--text-muted)]", children: e })
26
- ] })
27
- ]
28
- }
29
- );
1
+ import { jsxs as e, jsx as o } from "react/jsx-runtime";
2
+ import p, { useId as f } from "react";
3
+ import { cn as a } from "../../utils/cn.js";
4
+ import { choiceControl as u } from "../../utils/styles.js";
5
+ const h = p.forwardRef(
6
+ ({ label: r, helperText: i, className: d, id: n, disabled: s, ...c }, m) => {
7
+ const l = f(), t = n ?? l;
8
+ return /* @__PURE__ */ e("div", { className: a("inline-flex items-start gap-2", s && "opacity-60", d), children: [
9
+ /* @__PURE__ */ o(
10
+ "input",
11
+ {
12
+ ref: m,
13
+ "aria-describedby": i ? `${t}-helper` : void 0,
14
+ className: a(u, "rounded-full"),
15
+ disabled: s,
16
+ id: t,
17
+ type: "radio",
18
+ ...c
19
+ }
20
+ ),
21
+ /* @__PURE__ */ e("span", { className: "grid gap-0.5", children: [
22
+ r && /* @__PURE__ */ o("label", { className: "cursor-pointer text-sm font-light text-sbk-fg", htmlFor: t, children: r }),
23
+ i && /* @__PURE__ */ o("span", { className: "text-xs font-light text-sbk-fg-muted", id: `${t}-helper`, children: i })
24
+ ] })
25
+ ] });
30
26
  }
31
27
  );
32
- d.displayName = "Radio";
28
+ h.displayName = "Radio";
33
29
  export {
34
- d as Radio
30
+ h as Radio
35
31
  };
36
32
  //# sourceMappingURL=Radio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Radio.js","sources":["../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n helperText?: string;\n label?: string;\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ label, helperText, className, id, ...props }, ref) => {\n const inputId = id || `radio-${Math.random().toString(36).slice(2, 9)}`;\n\n return (\n <label\n className={cn('inline-flex cursor-pointer items-start gap-2', className)}\n htmlFor={inputId}\n >\n <input\n ref={ref}\n className=\"mt-0.5 h-4 w-4 border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--md-primary)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--border-color-focus)]\"\n id={inputId}\n type=\"radio\"\n {...props}\n />\n <span className=\"grid gap-0.5\">\n {label && <span className=\"text-sm text-[var(--text-primary)]\">{label}</span>}\n {helperText && <span className=\"text-xs text-[var(--text-muted)]\">{helperText}</span>}\n </span>\n </label>\n );\n },\n);\n\nRadio.displayName = 'Radio';\n"],"names":["Radio","React","label","helperText","className","id","props","ref","inputId","jsxs","cn","jsx"],"mappings":";;;AAQO,MAAMA,IAAQC,EAAM;AAAA,EACzB,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,WAAAC,GAAW,IAAAC,GAAI,GAAGC,EAAA,GAASC,MAAQ;AACvD,UAAMC,IAAUH,KAAM,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAErE,WACE,gBAAAI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,EAAG,gDAAgDN,CAAS;AAAA,QACvE,SAASI;AAAA,QAET,UAAA;AAAA,UAAA,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAAJ;AAAA,cACA,WAAU;AAAA,cACV,IAAIC;AAAA,cACJ,MAAK;AAAA,cACJ,GAAGF;AAAA,YAAA;AAAA,UAAA;AAAA,UAEN,gBAAAG,EAAC,QAAA,EAAK,WAAU,gBACb,UAAA;AAAA,YAAAP,KAAS,gBAAAS,EAAC,QAAA,EAAK,WAAU,sCAAsC,UAAAT,GAAM;AAAA,YACrEC,KAAc,gBAAAQ,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAAR,EAAA,CAAW;AAAA,UAAA,EAAA,CAChF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEAH,EAAM,cAAc;"}
1
+ {"version":3,"file":"Radio.js","sources":["../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport { cn } from '../../utils/cn';\nimport { choiceControl } from '../../utils/styles';\n\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n helperText?: string;\n label?: React.ReactNode;\n}\n\n/** Radio individual. Agrupe com <fieldset> + <legend> e o mesmo `name`. */\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ label, helperText, className, id, disabled, ...props }, ref) => {\n const autoId = useId();\n const inputId = id ?? autoId;\n\n return (\n <div className={cn('inline-flex items-start gap-2', disabled && 'opacity-60', className)}>\n <input\n ref={ref}\n aria-describedby={helperText ? `${inputId}-helper` : undefined}\n className={cn(choiceControl, 'rounded-full')}\n disabled={disabled}\n id={inputId}\n type=\"radio\"\n {...props}\n />\n <span className=\"grid gap-0.5\">\n {label && (\n <label className=\"cursor-pointer text-sm font-light text-sbk-fg\" htmlFor={inputId}>\n {label}\n </label>\n )}\n {helperText && (\n <span className=\"text-xs font-light text-sbk-fg-muted\" id={`${inputId}-helper`}>\n {helperText}\n </span>\n )}\n </span>\n </div>\n );\n },\n);\n\nRadio.displayName = 'Radio';\n"],"names":["Radio","React","label","helperText","className","id","disabled","props","ref","autoId","useId","inputId","jsxs","cn","jsx","choiceControl"],"mappings":";;;;AAUO,MAAMA,IAAQC,EAAM;AAAA,EACzB,CAAC,EAAE,OAAAC,GAAO,YAAAC,GAAY,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAAQ;AACjE,UAAMC,IAASC,EAAA,GACTC,IAAUN,KAAMI;AAEtB,WACE,gBAAAG,EAAC,SAAI,WAAWC,EAAG,iCAAiCP,KAAY,cAAcF,CAAS,GACrF,UAAA;AAAA,MAAA,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAN;AAAA,UACA,oBAAkBL,IAAa,GAAGQ,CAAO,YAAY;AAAA,UACrD,WAAWE,EAAGE,GAAe,cAAc;AAAA,UAC3C,UAAAT;AAAA,UACA,IAAIK;AAAA,UACJ,MAAK;AAAA,UACJ,GAAGJ;AAAA,QAAA;AAAA,MAAA;AAAA,MAEN,gBAAAK,EAAC,QAAA,EAAK,WAAU,gBACb,UAAA;AAAA,QAAAV,uBACE,SAAA,EAAM,WAAU,iDAAgD,SAASS,GACvE,UAAAT,GACH;AAAA,QAEDC,uBACE,QAAA,EAAK,WAAU,wCAAuC,IAAI,GAAGQ,CAAO,WAClE,UAAAR,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AAEAH,EAAM,cAAc;"}
@@ -1,7 +1,12 @@
1
1
  import type React from 'react';
2
2
  export interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
3
3
  actions?: React.ReactNode;
4
+ /** Nível do título. Padrão: h2. */
5
+ as?: 'h2' | 'h3' | 'h4';
4
6
  subtitle?: React.ReactNode;
5
7
  title: React.ReactNode;
6
8
  }
7
- export declare const SectionHeader: React.FC<SectionHeaderProps>;
9
+ export declare const SectionHeader: {
10
+ ({ title, subtitle, actions, as: Tag, className, ...props }: SectionHeaderProps): import("react/jsx-runtime").JSX.Element;
11
+ displayName: string;
12
+ };
@@ -1,19 +1,21 @@
1
- import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
- import { cn as c } from "../../utils/cn.js";
3
- const d = ({
1
+ import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
+ import { cn as d } from "../../utils/cn.js";
3
+ const n = ({
4
4
  title: a,
5
5
  subtitle: t,
6
- actions: r,
7
- className: i,
8
- ...m
9
- }) => /* @__PURE__ */ s("div", { className: c("flex items-start justify-between gap-4", i), ...m, children: [
10
- /* @__PURE__ */ s("div", { className: "grid gap-1", children: [
11
- /* @__PURE__ */ e("h2", { className: "m-0 text-xl font-semibold text-[var(--text-primary)]", children: a }),
12
- t && /* @__PURE__ */ e("p", { className: "m-0 text-sm text-[var(--text-secondary)]", children: t })
6
+ actions: s,
7
+ as: m = "h2",
8
+ className: l,
9
+ ...r
10
+ }) => /* @__PURE__ */ i("div", { className: d("flex flex-wrap items-start justify-between gap-4", l), ...r, children: [
11
+ /* @__PURE__ */ i("div", { className: "grid min-w-0 gap-1", children: [
12
+ /* @__PURE__ */ e(m, { className: "m-0 text-xl font-semibold leading-tight text-sbk-fg-heading", children: a }),
13
+ t && /* @__PURE__ */ e("p", { className: "m-0 text-sm font-light text-sbk-fg-muted", children: t })
13
14
  ] }),
14
- r && /* @__PURE__ */ e("div", { className: "flex shrink-0 items-center gap-2", children: r })
15
+ s && /* @__PURE__ */ e("div", { className: "flex shrink-0 items-center gap-2", children: s })
15
16
  ] });
17
+ n.displayName = "SectionHeader";
16
18
  export {
17
- d as SectionHeader
19
+ n as SectionHeader
18
20
  };
19
21
  //# sourceMappingURL=SectionHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SectionHeader.js","sources":["../../../src/components/SectionHeader/SectionHeader.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n actions?: React.ReactNode;\n subtitle?: React.ReactNode;\n title: React.ReactNode;\n}\n\nexport const SectionHeader: React.FC<SectionHeaderProps> = ({\n title,\n subtitle,\n actions,\n className,\n ...props\n}) => {\n return (\n <div className={cn('flex items-start justify-between gap-4', className)} {...props}>\n <div className=\"grid gap-1\">\n <h2 className=\"m-0 text-xl font-semibold text-[var(--text-primary)]\">{title}</h2>\n {subtitle && <p className=\"m-0 text-sm text-[var(--text-secondary)]\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n );\n};\n"],"names":["SectionHeader","title","subtitle","actions","className","props","jsxs","cn","jsx"],"mappings":";;AASO,MAAMA,IAA8C,CAAC;AAAA,EAC1D,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC,EAAC,SAAI,WAAWC,EAAG,0CAA0CH,CAAS,GAAI,GAAGC,GAC3E,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,IAAA,gBAAAE,EAAC,MAAA,EAAG,WAAU,wDAAwD,UAAAP,GAAM;AAAA,IAC3EC,KAAY,gBAAAM,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAN,EAAA,CAAS;AAAA,EAAA,GACjF;AAAA,EACCC,KAAW,gBAAAK,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAL,EAAA,CAAQ;AAAA,GACzE;"}
1
+ {"version":3,"file":"SectionHeader.js","sources":["../../../src/components/SectionHeader/SectionHeader.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n actions?: React.ReactNode;\n /** Nível do título. Padrão: h2. */\n as?: 'h2' | 'h3' | 'h4';\n subtitle?: React.ReactNode;\n title: React.ReactNode;\n}\n\nexport const SectionHeader = ({\n title,\n subtitle,\n actions,\n as: Tag = 'h2',\n className,\n ...props\n}: SectionHeaderProps) => (\n <div className={cn('flex flex-wrap items-start justify-between gap-4', className)} {...props}>\n <div className=\"grid min-w-0 gap-1\">\n <Tag className=\"m-0 text-xl font-semibold leading-tight text-sbk-fg-heading\">{title}</Tag>\n {subtitle && <p className=\"m-0 text-sm font-light text-sbk-fg-muted\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n);\n\nSectionHeader.displayName = 'SectionHeader';\n"],"names":["SectionHeader","title","subtitle","actions","Tag","className","props","jsxs","cn","jsx"],"mappings":";;AAWO,MAAMA,IAAgB,CAAC;AAAA,EAC5B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,IAAIC,IAAM;AAAA,EACV,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC,EAAC,SAAI,WAAWC,EAAG,oDAAoDH,CAAS,GAAI,GAAGC,GACrF,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA,gBAAAE,EAACL,GAAA,EAAI,WAAU,+DAA+D,UAAAH,GAAM;AAAA,IACnFC,KAAY,gBAAAO,EAAC,KAAA,EAAE,WAAU,4CAA4C,UAAAP,EAAA,CAAS;AAAA,EAAA,GACjF;AAAA,EACCC,KAAW,gBAAAM,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAN,EAAA,CAAQ;AAAA,EAAA,CACzE;AAGFH,EAAc,cAAc;"}
@@ -1,13 +1,17 @@
1
1
  import React from 'react';
2
+ import { type FieldSize } from '../../utils/styles';
2
3
  export interface SelectOption {
4
+ disabled?: boolean;
3
5
  label: string;
4
6
  value: string;
5
7
  }
6
8
  export interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {
7
9
  error?: string;
8
10
  helperText?: string;
9
- label?: string;
11
+ label?: React.ReactNode;
10
12
  options: SelectOption[];
11
- size?: 'sm' | 'md' | 'lg';
13
+ /** Opção vazia inicial (ex.: "Selecione..."). */
14
+ placeholder?: string;
15
+ size?: FieldSize;
12
16
  }
13
17
  export declare const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<HTMLSelectElement>>;