@sbkbs/ui 1.0.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/MIGRATION.md +96 -0
  3. package/README.md +221 -115
  4. package/dist/assets/favicon/apple-touch-icon.png +0 -0
  5. package/dist/assets/favicon/favicon-96x96.png +0 -0
  6. package/dist/assets/favicon/favicon.ico +0 -0
  7. package/dist/assets/favicon/favicon.svg +1 -0
  8. package/dist/assets/favicon/site.webmanifest +21 -0
  9. package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
  10. package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
  11. package/dist/base.css +38 -0
  12. package/dist/components/Accordion/Accordion.d.ts +13 -1
  13. package/dist/components/Accordion/Accordion.js +100 -52
  14. package/dist/components/Accordion/Accordion.js.map +1 -1
  15. package/dist/components/Alert/Alert.d.ts +17 -4
  16. package/dist/components/Alert/Alert.js +64 -20
  17. package/dist/components/Alert/Alert.js.map +1 -1
  18. package/dist/components/Avatar/Avatar.d.ts +12 -6
  19. package/dist/components/Avatar/Avatar.js +66 -0
  20. package/dist/components/Avatar/Avatar.js.map +1 -0
  21. package/dist/components/Badge/Badge.d.ts +11 -2
  22. package/dist/components/Badge/Badge.js +42 -30
  23. package/dist/components/Badge/Badge.js.map +1 -1
  24. package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
  25. package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
  26. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  27. package/dist/components/Button/Button.d.ts +10 -8
  28. package/dist/components/Button/Button.js +73 -114
  29. package/dist/components/Button/Button.js.map +1 -1
  30. package/dist/components/Card/Card.d.ts +33 -3
  31. package/dist/components/Card/Card.js +91 -30
  32. package/dist/components/Card/Card.js.map +1 -1
  33. package/dist/components/Checkbox/Checkbox.d.ts +4 -1
  34. package/dist/components/Checkbox/Checkbox.js +32 -31
  35. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  36. package/dist/components/Chip/Chip.d.ts +7 -1
  37. package/dist/components/Chip/Chip.js +19 -9
  38. package/dist/components/Chip/Chip.js.map +1 -1
  39. package/dist/components/Combobox/Combobox.d.ts +10 -2
  40. package/dist/components/Combobox/Combobox.js +146 -133
  41. package/dist/components/Combobox/Combobox.js.map +1 -1
  42. package/dist/components/Divider/Divider.d.ts +7 -1
  43. package/dist/components/Divider/Divider.js +28 -12
  44. package/dist/components/Divider/Divider.js.map +1 -1
  45. package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
  46. package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
  47. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
  48. package/dist/components/EmptyState/EmptyState.d.ts +7 -1
  49. package/dist/components/EmptyState/EmptyState.js +28 -19
  50. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  51. package/dist/components/Field/Field.d.ts +21 -0
  52. package/dist/components/Field/Field.js +35 -0
  53. package/dist/components/Field/Field.js.map +1 -0
  54. package/dist/components/FileUpload/FileUpload.d.ts +9 -2
  55. package/dist/components/FileUpload/FileUpload.js +128 -102
  56. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  57. package/dist/components/Footer/Footer.d.ts +19 -6
  58. package/dist/components/Footer/Footer.js +47 -115
  59. package/dist/components/Footer/Footer.js.map +1 -1
  60. package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
  61. package/dist/components/GlassPanel/GlassPanel.js +39 -0
  62. package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
  63. package/dist/components/Header/Header.d.ts +25 -14
  64. package/dist/components/Header/Header.js +88 -148
  65. package/dist/components/Header/Header.js.map +1 -1
  66. package/dist/components/Highlight/Highlight.d.ts +13 -0
  67. package/dist/components/Highlight/Highlight.js +18 -0
  68. package/dist/components/Highlight/Highlight.js.map +1 -0
  69. package/dist/components/Icon/Icon.d.ts +21 -0
  70. package/dist/components/Icon/Icon.js +31 -0
  71. package/dist/components/Icon/Icon.js.map +1 -0
  72. package/dist/components/IconButton/IconButton.d.ts +12 -0
  73. package/dist/components/IconButton/IconButton.js +49 -0
  74. package/dist/components/IconButton/IconButton.js.map +1 -0
  75. package/dist/components/Input/Input.d.ts +3 -2
  76. package/dist/components/Input/Input.js +51 -69
  77. package/dist/components/Input/Input.js.map +1 -1
  78. package/dist/components/Layout/Layout.d.ts +2 -0
  79. package/dist/components/Layout/Layout.js +24 -18
  80. package/dist/components/Layout/Layout.js.map +1 -1
  81. package/dist/components/Logo/Logo.d.ts +27 -0
  82. package/dist/components/Logo/Logo.js +107 -0
  83. package/dist/components/Logo/Logo.js.map +1 -0
  84. package/dist/components/MiniCard/MiniCard.d.ts +21 -0
  85. package/dist/components/MiniCard/MiniCard.js +90 -0
  86. package/dist/components/MiniCard/MiniCard.js.map +1 -0
  87. package/dist/components/Modal/Modal.d.ts +16 -3
  88. package/dist/components/Modal/Modal.js +124 -93
  89. package/dist/components/Modal/Modal.js.map +1 -1
  90. package/dist/components/Navigation/Navigation.d.ts +1 -0
  91. package/dist/components/Navigation/Navigation.js +14 -14
  92. package/dist/components/Navigation/Navigation.js.map +1 -1
  93. package/dist/components/NumberInput/NumberInput.d.ts +5 -2
  94. package/dist/components/NumberInput/NumberInput.js +98 -128
  95. package/dist/components/NumberInput/NumberInput.js.map +1 -1
  96. package/dist/components/PageHeader/PageHeader.d.ts +8 -1
  97. package/dist/components/PageHeader/PageHeader.js +26 -25
  98. package/dist/components/PageHeader/PageHeader.js.map +1 -1
  99. package/dist/components/Pagination/Pagination.d.ts +15 -2
  100. package/dist/components/Pagination/Pagination.js +68 -34
  101. package/dist/components/Pagination/Pagination.js.map +1 -1
  102. package/dist/components/Paragraph/Paragraph.d.ts +8 -2
  103. package/dist/components/Paragraph/Paragraph.js +39 -36
  104. package/dist/components/Paragraph/Paragraph.js.map +1 -1
  105. package/dist/components/Popover/Popover.d.ts +12 -1
  106. package/dist/components/Popover/Popover.js +49 -37
  107. package/dist/components/Popover/Popover.js.map +1 -1
  108. package/dist/components/ProgressBar/ProgressBar.d.ts +12 -6
  109. package/dist/components/ProgressBar/ProgressBar.js +71 -0
  110. package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
  111. package/dist/components/Radio/Radio.d.ts +2 -1
  112. package/dist/components/Radio/Radio.js +27 -31
  113. package/dist/components/Radio/Radio.js.map +1 -1
  114. package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
  115. package/dist/components/SectionHeader/SectionHeader.js +14 -12
  116. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  117. package/dist/components/Select/Select.d.ts +6 -2
  118. package/dist/components/Select/Select.js +47 -35
  119. package/dist/components/Select/Select.js.map +1 -1
  120. package/dist/components/SideNav/SideNav.d.ts +55 -0
  121. package/dist/components/SideNav/SideNav.js +141 -0
  122. package/dist/components/SideNav/SideNav.js.map +1 -0
  123. package/dist/components/Skeleton/Skeleton.d.ts +12 -1
  124. package/dist/components/Skeleton/Skeleton.js +33 -18
  125. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  126. package/dist/components/Spinner/Spinner.d.ts +11 -3
  127. package/dist/components/Spinner/Spinner.js +57 -0
  128. package/dist/components/Spinner/Spinner.js.map +1 -0
  129. package/dist/components/Stepper/Stepper.d.ts +1 -1
  130. package/dist/components/Stepper/Stepper.js +41 -53
  131. package/dist/components/Stepper/Stepper.js.map +1 -1
  132. package/dist/components/Subtitle/Subtitle.d.ts +9 -3
  133. package/dist/components/Subtitle/Subtitle.js +29 -35
  134. package/dist/components/Subtitle/Subtitle.js.map +1 -1
  135. package/dist/components/Switch/Switch.d.ts +2 -1
  136. package/dist/components/Switch/Switch.js +45 -33
  137. package/dist/components/Switch/Switch.js.map +1 -1
  138. package/dist/components/Table/Table.d.ts +19 -1
  139. package/dist/components/Table/Table.js +48 -11
  140. package/dist/components/Table/Table.js.map +1 -1
  141. package/dist/components/Tabs/Tabs.d.ts +16 -2
  142. package/dist/components/Tabs/Tabs.js +80 -44
  143. package/dist/components/Tabs/Tabs.js.map +1 -1
  144. package/dist/components/Tag/Tag.d.ts +8 -1
  145. package/dist/components/Tag/Tag.js +27 -12
  146. package/dist/components/Tag/Tag.js.map +1 -1
  147. package/dist/components/Textarea/Textarea.d.ts +3 -1
  148. package/dist/components/Textarea/Textarea.js +36 -40
  149. package/dist/components/Textarea/Textarea.js.map +1 -1
  150. package/dist/components/Title/Title.d.ts +9 -3
  151. package/dist/components/Title/Title.js +42 -42
  152. package/dist/components/Title/Title.js.map +1 -1
  153. package/dist/components/Toast/Toast.d.ts +39 -11
  154. package/dist/components/Toast/Toast.js +130 -76
  155. package/dist/components/Toast/Toast.js.map +1 -1
  156. package/dist/components/Tooltip/Tooltip.d.ts +12 -2
  157. package/dist/components/Tooltip/Tooltip.js +50 -32
  158. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  159. package/dist/components/Typography/weight.d.ts +9 -0
  160. package/dist/components/Typography/weight.js +5 -0
  161. package/dist/components/Typography/weight.js.map +1 -0
  162. package/dist/fonts.css +8 -0
  163. package/dist/index.cjs +2 -0
  164. package/dist/index.cjs.map +1 -0
  165. package/dist/index.d.ts +55 -43
  166. package/dist/index.js +118 -83
  167. package/dist/index.js.map +1 -1
  168. package/dist/reset.css +9 -0
  169. package/dist/styles.css +1 -0
  170. package/dist/tailwind.css +153 -0
  171. package/dist/theme/ThemeProvider.d.ts +21 -3
  172. package/dist/theme/ThemeProvider.js +57 -18
  173. package/dist/theme/ThemeProvider.js.map +1 -1
  174. package/dist/theme/tokens.d.ts +43 -0
  175. package/dist/theme/tokens.js +39 -0
  176. package/dist/theme/tokens.js.map +1 -0
  177. package/dist/theme.css +327 -294
  178. package/dist/tokens.css +327 -0
  179. package/dist/utils/cn.d.ts +2 -2
  180. package/dist/utils/cn.js +19 -4
  181. package/dist/utils/cn.js.map +1 -1
  182. package/dist/utils/styles.d.ts +37 -0
  183. package/dist/utils/styles.js +35 -0
  184. package/dist/utils/styles.js.map +1 -0
  185. package/package.json +140 -117
  186. package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
  187. package/dist/components/Alert/Alert.stories.d.ts +0 -8
  188. package/dist/components/Badge/Badge.stories.d.ts +0 -8
  189. package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
  190. package/dist/components/Button/Button.stories.d.ts +0 -7
  191. package/dist/components/Card/Card.stories.d.ts +0 -8
  192. package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
  193. package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
  194. package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
  195. package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
  196. package/dist/components/Input/Input.stories.d.ts +0 -9
  197. package/dist/components/Modal/Modal.stories.d.ts +0 -8
  198. package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
  199. package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
  200. package/dist/components/Radio/Radio.stories.d.ts +0 -7
  201. package/dist/components/Select/Select.stories.d.ts +0 -8
  202. package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
  203. package/dist/components/Switch/Switch.stories.d.ts +0 -8
  204. package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
  205. package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
  206. package/dist/components/Toast/Toast.stories.d.ts +0 -8
  207. package/dist/oficios-ui.css +0 -1
  208. package/dist/oficios-ui.umd.cjs +0 -2
  209. package/dist/oficios-ui.umd.cjs.map +0 -1
  210. package/dist/sbk-icon.png +0 -0
@@ -1,26 +1,33 @@
1
- import { jsx as e, jsxs as i } from "react/jsx-runtime";
2
- import { cn as o } from "../../utils/cn.js";
3
- const m = ({
4
- items: l,
5
- separator: s = "/",
6
- className: t,
7
- ...c
8
- }) => /* @__PURE__ */ e("nav", { "aria-label": "Breadcrumb", className: o("flex items-center", t), ...c, children: /* @__PURE__ */ e("ol", { className: "flex flex-wrap items-center gap-1 text-sm", children: l.map((r, a) => {
9
- const n = a === l.length - 1;
10
- return /* @__PURE__ */ i("li", { className: "flex items-center gap-1", children: [
11
- a > 0 && /* @__PURE__ */ e("span", { "aria-hidden": "true", className: "select-none text-[var(--text-muted)]", children: s }),
12
- n ? /* @__PURE__ */ e("span", { "aria-current": "page", className: "font-medium text-[var(--text-primary)]", children: r.label }) : r.href ? /* @__PURE__ */ e(
1
+ import { jsx as e, jsxs as m } from "react/jsx-runtime";
2
+ import { ChevronRight as o } from "lucide-react";
3
+ import { cn as l } from "../../utils/cn.js";
4
+ import { focusRing as f } from "../../utils/styles.js";
5
+ const d = ({ items: s, separator: t, className: n, ...i }) => /* @__PURE__ */ e("nav", { "aria-label": "Breadcrumb", className: l("flex items-center", n), ...i, children: /* @__PURE__ */ e("ol", { className: "m-0 flex list-none flex-wrap items-center gap-1.5 p-0 text-sm", children: s.map((r, a) => {
6
+ const c = a === s.length - 1;
7
+ return /* @__PURE__ */ m("li", { className: "flex items-center gap-1.5", children: [
8
+ a > 0 && /* @__PURE__ */ e(
9
+ "span",
10
+ {
11
+ "aria-hidden": "true",
12
+ className: "inline-flex select-none text-sbk-fg-muted [&_svg]:size-3.5",
13
+ children: t ?? /* @__PURE__ */ e(o, {})
14
+ }
15
+ ),
16
+ c ? /* @__PURE__ */ e("span", { "aria-current": "page", className: "font-semibold text-sbk-fg-heading", children: r.label }) : r.href ? /* @__PURE__ */ e(
13
17
  "a",
14
18
  {
15
- className: "text-[var(--md-primary)] transition hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-color-focus)]",
19
+ className: l(
20
+ "rounded-sbk-xs font-light text-sbk-fg-muted underline-offset-4 hover:text-sbk-primary hover:underline",
21
+ f
22
+ ),
16
23
  href: r.href,
17
24
  children: r.label
18
25
  }
19
- ) : /* @__PURE__ */ e("span", { className: "text-[var(--text-secondary)]", children: r.label })
26
+ ) : /* @__PURE__ */ e("span", { className: "font-light text-sbk-fg-muted", children: r.label })
20
27
  ] }, a);
21
28
  }) }) });
22
- m.displayName = "Breadcrumb";
29
+ d.displayName = "Breadcrumb";
23
30
  export {
24
- m as Breadcrumb
31
+ d as Breadcrumb
25
32
  };
26
33
  //# sourceMappingURL=Breadcrumb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.js","sources":["../../../src/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface BreadcrumbItem {\n href?: string;\n label: React.ReactNode;\n}\n\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\n items: BreadcrumbItem[];\n separator?: React.ReactNode;\n}\n\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({\n items,\n separator = '/',\n className,\n ...props\n}) => {\n return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center', className)} {...props}>\n <ol className=\"flex flex-wrap items-center gap-1 text-sm\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className=\"flex items-center gap-1\">\n {index > 0 && (\n <span aria-hidden=\"true\" className=\"select-none text-[var(--text-muted)]\">\n {separator}\n </span>\n )}\n {isLast ? (\n <span aria-current=\"page\" className=\"font-medium text-[var(--text-primary)]\">\n {item.label}\n </span>\n ) : item.href ? (\n <a\n className=\"text-[var(--md-primary)] transition hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border-color-focus)]\"\n href={item.href}\n >\n {item.label}\n </a>\n ) : (\n <span className=\"text-[var(--text-secondary)]\">{item.label}</span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nBreadcrumb.displayName = 'Breadcrumb';\n"],"names":["Breadcrumb","items","separator","className","props","cn","jsx","item","index","isLast","jsxs"],"mappings":";;AAaO,MAAMA,IAAwC,CAAC;AAAA,EACpD,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,GAAGC;AACL,wBAEK,OAAA,EAAI,cAAW,cAAa,WAAWC,EAAG,qBAAqBF,CAAS,GAAI,GAAGC,GAC9E,UAAA,gBAAAE,EAAC,QAAG,WAAU,6CACX,YAAM,IAAI,CAACC,GAAMC,MAAU;AAC1B,QAAMC,IAASD,MAAUP,EAAM,SAAS;AACxC,SACE,gBAAAS,EAAC,MAAA,EAAe,WAAU,2BACvB,UAAA;AAAA,IAAAF,IAAQ,KACP,gBAAAF,EAAC,QAAA,EAAK,eAAY,QAAO,WAAU,wCAChC,UAAAJ,EAAA,CACH;AAAA,IAEDO,IACC,gBAAAH,EAAC,QAAA,EAAK,gBAAa,QAAO,WAAU,0CACjC,UAAAC,EAAK,MAAA,CACR,IACEA,EAAK,OACP,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAMC,EAAK;AAAA,QAEV,UAAAA,EAAK;AAAA,MAAA;AAAA,IAAA,IAGR,gBAAAD,EAAC,QAAA,EAAK,WAAU,gCAAgC,YAAK,MAAA,CAAM;AAAA,EAAA,EAAA,GAlBtDE,CAoBT;AAEJ,CAAC,GACH,GACF;AAIJR,EAAW,cAAc;"}
1
+ {"version":3,"file":"Breadcrumb.js","sources":["../../../src/components/Breadcrumb/Breadcrumb.tsx"],"sourcesContent":["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"],"names":["Breadcrumb","items","separator","className","props","jsx","cn","item","index","isLast","jsxs","ChevronRight","focusRing"],"mappings":";;;;AAeO,MAAMA,IAAa,CAAC,EAAE,OAAAC,GAAO,WAAAC,GAAW,WAAAC,GAAW,GAAGC,EAAA,MAC3D,gBAAAC,EAAC,OAAA,EAAI,cAAW,cAAa,WAAWC,EAAG,qBAAqBH,CAAS,GAAI,GAAGC,GAC9E,UAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,iEACX,UAAAJ,EAAM,IAAI,CAACM,GAAMC,MAAU;AAC1B,QAAMC,IAASD,MAAUP,EAAM,SAAS;AACxC,SACE,gBAAAS,EAAC,MAAA,EAAe,WAAU,6BACvB,UAAA;AAAA,IAAAF,IAAQ,KACP,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,QAET,UAAAH,uBAAcS,GAAA,CAAA,CAAa;AAAA,MAAA;AAAA,IAAA;AAAA,IAG/BF,IACC,gBAAAJ,EAAC,QAAA,EAAK,gBAAa,QAAO,WAAU,qCACjC,UAAAE,EAAK,MAAA,CACR,IACEA,EAAK,OACP,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC;AAAA,UACT;AAAA,UACAM;AAAA,QAAA;AAAA,QAEF,MAAML,EAAK;AAAA,QAEV,UAAAA,EAAK;AAAA,MAAA;AAAA,IAAA,IAGR,gBAAAF,EAAC,QAAA,EAAK,WAAU,gCAAgC,YAAK,MAAA,CAAM;AAAA,EAAA,EAAA,GAxBtDG,CA0BT;AAEJ,CAAC,GACH,EAAA,CACF;AAGFR,EAAW,cAAc;"}
@@ -1,16 +1,18 @@
1
- import type React from 'react';
2
- /** Paletas do guia de marca (só afeta variant primary). Use para escolher o modelo de cor do botão. */
3
- export type ButtonPalette = 'verde-vibrante' | 'verde-profundo' | 'grafite-azulado' | 'azul-acinzentado' | 'cinza-medio' | 'cinza-escuro' | 'off-white';
1
+ import React from 'react';
2
+ export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'link' | 'inverse' | 'glass' | 'success' | 'error' | 'warning' | 'info' | 'neutral';
3
+ export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
4
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
5
5
  children: React.ReactNode;
6
+ /** Reduz o padding horizontal (útil em toolbars e tabelas). */
6
7
  compact?: boolean;
7
8
  fullWidth?: boolean;
9
+ /** Mostra spinner, desabilita o botão e anuncia `aria-busy`. A largura é preservada. */
8
10
  isLoading?: boolean;
11
+ /** Texto anunciado durante o carregamento. Padrão: "Carregando". */
12
+ loadingLabel?: string;
9
13
  leftIcon?: React.ReactNode;
10
- /** Paleta de cor do guia de marca (aplica-se ao primary). Ignorado em outros variants. */
11
- palette?: ButtonPalette;
12
14
  rightIcon?: React.ReactNode;
13
- size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
14
- variant?: 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'neutral' | 'ghost';
15
+ size?: ButtonSize;
16
+ variant?: ButtonVariant;
15
17
  }
16
- export declare const Button: React.FC<ButtonProps>;
18
+ export declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -1,122 +1,81 @@
1
- import { jsxs as h, jsx as a } from "react/jsx-runtime";
2
- import { cn as N } from "../../utils/cn.js";
3
- const P = ({
4
- variant: i = "primary",
5
- size: t = "md",
6
- compact: r = !1,
7
- fullWidth: l = !1,
8
- isLoading: o = !1,
9
- leftIcon: d,
10
- rightIcon: v,
11
- children: c,
12
- className: p = "",
13
- disabled: w,
14
- palette: e,
15
- style: b,
16
- ...f
17
- }) => {
18
- const y = "relative inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap rounded-[var(--border-radius-md)] border border-transparent font-semibold leading-none tracking-[0.01em] transition-[all_var(--transition-base)]", x = "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--md-primary)]", g = "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-60", u = l ? "w-full" : "", z = e === "off-white" && i === "primary" ? "border-[var(--border-color)]" : "", C = {
19
- xs: r ? "min-h-[1.75rem] min-w-[1.75rem] gap-1 px-2 py-1 text-[var(--font-size-xs)]" : "min-h-8 min-w-8 gap-1.5 px-3 py-1.5 text-[var(--font-size-xs)]",
20
- sm: r ? "min-h-8 min-w-8 gap-[0.3125rem] px-2.5 py-1.5 text-[var(--font-size-sm)]" : "min-h-9 min-w-9 gap-[0.4375rem] px-3.5 py-2 text-[var(--font-size-sm)]",
21
- md: r ? "min-h-[2.375rem] min-w-[2.375rem] gap-1.5 px-3 py-2 text-[var(--font-size-base)]" : "min-h-11 min-w-11 gap-2 px-4 py-2.5 text-[var(--font-size-base)]",
22
- lg: r ? "min-h-[2.625rem] min-w-[2.625rem] gap-[0.4375rem] px-3.5 py-[0.5625rem] text-[var(--font-size-lg)]" : "min-h-12 min-w-12 gap-[0.5625rem] px-6 py-4 text-[var(--font-size-lg)]",
23
- xl: r ? "min-h-12 min-w-12 gap-2 px-4 py-3 text-[var(--font-size-xl)]" : "min-h-14 min-w-14 gap-2.5 px-8 py-6 text-[var(--font-size-xl)]"
24
- }, j = {
25
- primary: "bg-[var(--md-primary)] text-[var(--md-on-primary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--primary-color-hover)] hover:shadow-[var(--shadow-md)]",
26
- secondary: "bg-[var(--md-secondary)] text-[var(--md-on-secondary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--secondary-color-light)] hover:shadow-[var(--shadow-md)]",
27
- success: "bg-[var(--success-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--success-color-light)] hover:shadow-[var(--shadow-md)]",
28
- error: "bg-[var(--md-error)] text-[var(--md-on-error)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--error-color-light)] hover:shadow-[var(--shadow-md)]",
29
- warning: "bg-[var(--warning-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--warning-color-light)] hover:shadow-[var(--shadow-md)]",
30
- info: "bg-[var(--info-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--info-color-light)] hover:shadow-[var(--shadow-md)]",
31
- neutral: "bg-[var(--neutral-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--neutral-color-light)] hover:shadow-[var(--shadow-md)]",
32
- ghost: "border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--md-on-surface)] shadow-[var(--shadow-xs)] hover:bg-[var(--bg-hover)] hover:text-[var(--md-primary)] hover:border-[var(--border-color-hover)]"
33
- }, m = {
34
- xs: r ? "h-3 w-3" : "h-3.5 w-3.5",
35
- sm: r ? "h-3.5 w-3.5" : "h-4 w-4",
36
- md: "h-[1.125rem] w-[1.125rem]",
37
- lg: "h-5 w-5",
38
- xl: "h-5 w-5"
39
- }, n = {
40
- "verde-vibrante": {
41
- primary: "var(--brand-verde-vibrante)",
42
- hover: "var(--brand-verde-profundo)"
43
- },
44
- "verde-profundo": {
45
- primary: "var(--brand-verde-profundo)",
46
- hover: "var(--brand-grafite-azulado)"
47
- },
48
- "grafite-azulado": {
49
- primary: "var(--brand-grafite-azulado)",
50
- hover: "var(--brand-cinza-escuro)"
51
- },
52
- "azul-acinzentado": {
53
- primary: "var(--brand-azul-acinzentado)",
54
- hover: "var(--brand-grafite-azulado)"
55
- },
56
- "cinza-medio": {
57
- primary: "var(--brand-cinza-medio)",
58
- hover: "var(--brand-cinza-escuro)"
59
- },
60
- "cinza-escuro": {
61
- primary: "var(--brand-cinza-escuro)",
62
- hover: "var(--brand-preto)"
63
- },
64
- "off-white": {
65
- primary: "var(--brand-off-white)",
66
- hover: "var(--brand-branco)",
67
- onPrimary: "var(--brand-grafite-azulado)"
68
- }
69
- }, s = {};
70
- e && i === "primary" && (s["--md-primary"] = n[e].primary, s["--primary-color-hover"] = n[e].hover, n[e].onPrimary && (s["--md-on-primary"] = n[e].onPrimary));
71
- const k = N(
72
- y,
73
- x,
74
- g,
75
- C[t],
76
- j[i],
77
- z,
78
- u,
79
- p
80
- );
81
- return /* @__PURE__ */ h(
1
+ import { jsxs as a, jsx as s } from "react/jsx-runtime";
2
+ import f from "react";
3
+ import { cn as o } from "../../utils/cn.js";
4
+ import { focusRing as h, transitionColors as u, buttonReset as v } from "../../utils/styles.js";
5
+ import { Spinner as y } from "../Spinner/Spinner.js";
6
+ const S = {
7
+ xs: "min-h-7 gap-1 px-2.5 text-xs",
8
+ sm: "min-h-8 gap-1.5 px-3 text-sm",
9
+ md: "min-h-10 gap-2 px-4 text-sm",
10
+ lg: "min-h-12 gap-2 px-5 text-base",
11
+ xl: "min-h-14 gap-2.5 px-7 text-lg"
12
+ }, w = {
13
+ xs: "px-1.5",
14
+ sm: "px-2",
15
+ md: "px-2.5",
16
+ lg: "px-3",
17
+ xl: "px-4"
18
+ }, C = {
19
+ primary: "bg-sbk-primary text-sbk-on-primary hover:bg-sbk-primary-hover",
20
+ secondary: "bg-sbk-secondary text-sbk-on-secondary hover:bg-sbk-secondary-hover",
21
+ outline: "border-sbk-primary bg-transparent text-sbk-primary hover:bg-sbk-primary-subtle dark:border-sbk-fg dark:text-sbk-fg",
22
+ ghost: "bg-transparent text-sbk-fg hover:bg-sbk-surface-hover",
23
+ link: "min-h-0 bg-transparent px-0 text-sbk-primary underline-offset-4 hover:underline dark:text-sbk-fg",
24
+ inverse: "bg-sbk-surface-inverse text-sbk-fg-inverse hover:opacity-90",
25
+ glass: "sbk-glass text-sbk-fg hover:sbk-glass-strong",
26
+ success: "bg-sbk-success text-sbk-on-state hover:opacity-90",
27
+ error: "bg-sbk-error text-sbk-on-state hover:opacity-90",
28
+ warning: "bg-sbk-warning text-sbk-on-state hover:opacity-90",
29
+ info: "bg-sbk-info text-sbk-on-state hover:opacity-90",
30
+ neutral: "border-sbk-line-strong bg-sbk-surface text-sbk-fg hover:bg-sbk-surface-hover"
31
+ }, N = f.forwardRef(
32
+ ({
33
+ variant: i = "primary",
34
+ size: r = "md",
35
+ compact: b = !1,
36
+ fullWidth: l = !1,
37
+ isLoading: e = !1,
38
+ loadingLabel: p = "Carregando",
39
+ leftIcon: t,
40
+ rightIcon: n,
41
+ children: m,
42
+ className: x,
43
+ disabled: c,
44
+ type: g = "button",
45
+ ...k
46
+ }, d) => /* @__PURE__ */ a(
82
47
  "button",
83
48
  {
84
- className: k,
85
- disabled: w || o,
86
- style: { ...s, ...b },
87
- ...f,
49
+ ref: d,
50
+ "aria-busy": e || void 0,
51
+ className: o(
52
+ v,
53
+ "relative inline-flex select-none items-center justify-center whitespace-nowrap rounded-sbk-sm border border-transparent font-sbk font-semibold leading-none",
54
+ "cursor-pointer disabled:cursor-not-allowed disabled:opacity-50",
55
+ u,
56
+ h,
57
+ S[r],
58
+ b && w[r],
59
+ C[i],
60
+ l && "w-full",
61
+ x
62
+ ),
63
+ disabled: c || e,
64
+ type: g,
65
+ ...k,
88
66
  children: [
89
- o && /* @__PURE__ */ a(
90
- "span",
91
- {
92
- "aria-hidden": "true",
93
- className: "absolute inline-flex h-[1em] w-[1em] animate-spin items-center justify-center",
94
- children: /* @__PURE__ */ h("svg", { fill: "none", stroke: "currentColor", strokeWidth: "2", viewBox: "0 0 24 24", children: [
95
- /* @__PURE__ */ a("circle", { cx: "12", cy: "12", r: "10", strokeOpacity: "0.25" }),
96
- /* @__PURE__ */ a("path", { d: "M12 2 A10 10 0 0 1 22 12", strokeLinecap: "round" })
97
- ] })
98
- }
99
- ),
100
- !o && d && /* @__PURE__ */ a(
101
- "span",
102
- {
103
- className: `mr-1 inline-flex shrink-0 items-center justify-center leading-none ${m[t]}`,
104
- children: d
105
- }
106
- ),
107
- !o && /* @__PURE__ */ a("span", { className: "btn__content inline-flex items-center justify-center", children: c }),
108
- !o && v && /* @__PURE__ */ a(
109
- "span",
110
- {
111
- className: `ml-1 inline-flex shrink-0 items-center justify-center leading-none ${m[t]}`,
112
- children: v
113
- }
114
- )
67
+ e && /* @__PURE__ */ s("span", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ s(y, { label: p, size: "sm" }) }),
68
+ /* @__PURE__ */ a("span", { className: o("inline-flex items-center gap-[inherit]", e && "invisible"), children: [
69
+ t && /* @__PURE__ */ s("span", { "aria-hidden": "true", className: "inline-flex shrink-0 [&_svg]:size-[1.15em]", children: t }),
70
+ m,
71
+ n && /* @__PURE__ */ s("span", { "aria-hidden": "true", className: "inline-flex shrink-0 [&_svg]:size-[1.15em]", children: n })
72
+ ] })
115
73
  ]
116
74
  }
117
- );
118
- };
75
+ )
76
+ );
77
+ N.displayName = "Button";
119
78
  export {
120
- P as Button
79
+ N as Button
121
80
  };
122
81
  //# sourceMappingURL=Button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import type React from 'react';\nimport type { CSSProperties } from 'react';\nimport { cn } from '../../utils/cn';\n\n/** Paletas do guia de marca (só afeta variant primary). Use para escolher o modelo de cor do botão. */\nexport type ButtonPalette =\n | 'verde-vibrante'\n | 'verde-profundo'\n | 'grafite-azulado'\n | 'azul-acinzentado'\n | 'cinza-medio'\n | 'cinza-escuro'\n | 'off-white';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n compact?: boolean;\n fullWidth?: boolean;\n isLoading?: boolean;\n leftIcon?: React.ReactNode;\n /** Paleta de cor do guia de marca (aplica-se ao primary). Ignorado em outros variants. */\n palette?: ButtonPalette;\n rightIcon?: React.ReactNode;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?:\n | 'primary'\n | 'secondary'\n | 'success'\n | 'error'\n | 'warning'\n | 'info'\n | 'neutral'\n | 'ghost';\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n compact = false,\n fullWidth = false,\n isLoading = false,\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n palette,\n style,\n ...props\n}) => {\n const baseClass =\n 'relative inline-flex select-none items-center justify-center overflow-hidden whitespace-nowrap rounded-[var(--border-radius-md)] border border-transparent font-semibold leading-none tracking-[0.01em] transition-[all_var(--transition-base)]';\n const focusClass =\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--md-primary)]';\n const disabledClass =\n 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-60';\n const fullWidthClass = fullWidth ? 'w-full' : '';\n const offWhiteBorderClass =\n palette === 'off-white' && variant === 'primary' ? 'border-[var(--border-color)]' : '';\n\n const sizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact\n ? 'min-h-[1.75rem] min-w-[1.75rem] gap-1 px-2 py-1 text-[var(--font-size-xs)]'\n : 'min-h-8 min-w-8 gap-1.5 px-3 py-1.5 text-[var(--font-size-xs)]',\n sm: compact\n ? 'min-h-8 min-w-8 gap-[0.3125rem] px-2.5 py-1.5 text-[var(--font-size-sm)]'\n : 'min-h-9 min-w-9 gap-[0.4375rem] px-3.5 py-2 text-[var(--font-size-sm)]',\n md: compact\n ? 'min-h-[2.375rem] min-w-[2.375rem] gap-1.5 px-3 py-2 text-[var(--font-size-base)]'\n : 'min-h-11 min-w-11 gap-2 px-4 py-2.5 text-[var(--font-size-base)]',\n lg: compact\n ? 'min-h-[2.625rem] min-w-[2.625rem] gap-[0.4375rem] px-3.5 py-[0.5625rem] text-[var(--font-size-lg)]'\n : 'min-h-12 min-w-12 gap-[0.5625rem] px-6 py-4 text-[var(--font-size-lg)]',\n xl: compact\n ? 'min-h-12 min-w-12 gap-2 px-4 py-3 text-[var(--font-size-xl)]'\n : 'min-h-14 min-w-14 gap-2.5 px-8 py-6 text-[var(--font-size-xl)]',\n };\n\n const variantClassMap: Record<NonNullable<ButtonProps['variant']>, string> = {\n primary:\n 'bg-[var(--md-primary)] text-[var(--md-on-primary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--primary-color-hover)] hover:shadow-[var(--shadow-md)]',\n secondary:\n 'bg-[var(--md-secondary)] text-[var(--md-on-secondary)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--secondary-color-light)] hover:shadow-[var(--shadow-md)]',\n success:\n 'bg-[var(--success-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--success-color-light)] hover:shadow-[var(--shadow-md)]',\n error:\n 'bg-[var(--md-error)] text-[var(--md-on-error)] shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--error-color-light)] hover:shadow-[var(--shadow-md)]',\n warning:\n 'bg-[var(--warning-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--warning-color-light)] hover:shadow-[var(--shadow-md)]',\n info: 'bg-[var(--info-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--info-color-light)] hover:shadow-[var(--shadow-md)]',\n neutral:\n 'bg-[var(--neutral-color)] text-white shadow-[var(--shadow-sm)] hover:translate-y-[-0.125rem] hover:bg-[var(--neutral-color-light)] hover:shadow-[var(--shadow-md)]',\n ghost:\n 'border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--md-on-surface)] shadow-[var(--shadow-xs)] hover:bg-[var(--bg-hover)] hover:text-[var(--md-primary)] hover:border-[var(--border-color-hover)]',\n };\n\n const iconSizeClassMap: Record<NonNullable<ButtonProps['size']>, string> = {\n xs: compact ? 'h-3 w-3' : 'h-3.5 w-3.5',\n sm: compact ? 'h-3.5 w-3.5' : 'h-4 w-4',\n md: 'h-[1.125rem] w-[1.125rem]',\n lg: 'h-5 w-5',\n xl: 'h-5 w-5',\n };\n\n const paletteVars: Record<ButtonPalette, { primary: string; hover: string; onPrimary?: string }> =\n {\n 'verde-vibrante': {\n primary: 'var(--brand-verde-vibrante)',\n hover: 'var(--brand-verde-profundo)',\n },\n 'verde-profundo': {\n primary: 'var(--brand-verde-profundo)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'grafite-azulado': {\n primary: 'var(--brand-grafite-azulado)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'azul-acinzentado': {\n primary: 'var(--brand-azul-acinzentado)',\n hover: 'var(--brand-grafite-azulado)',\n },\n 'cinza-medio': {\n primary: 'var(--brand-cinza-medio)',\n hover: 'var(--brand-cinza-escuro)',\n },\n 'cinza-escuro': {\n primary: 'var(--brand-cinza-escuro)',\n hover: 'var(--brand-preto)',\n },\n 'off-white': {\n primary: 'var(--brand-off-white)',\n hover: 'var(--brand-branco)',\n onPrimary: 'var(--brand-grafite-azulado)',\n },\n };\n\n type ButtonCssVars = CSSProperties & {\n '--md-primary'?: string;\n '--primary-color-hover'?: string;\n '--md-on-primary'?: string;\n };\n const paletteStyle: ButtonCssVars = {};\n if (palette && variant === 'primary') {\n paletteStyle['--md-primary'] = paletteVars[palette].primary;\n paletteStyle['--primary-color-hover'] = paletteVars[palette].hover;\n if (paletteVars[palette].onPrimary) {\n paletteStyle['--md-on-primary'] = paletteVars[palette].onPrimary;\n }\n }\n\n const combinedClass = cn(\n baseClass,\n focusClass,\n disabledClass,\n sizeClassMap[size],\n variantClassMap[variant],\n offWhiteBorderClass,\n fullWidthClass,\n className,\n );\n\n return (\n <button\n className={combinedClass}\n disabled={disabled || isLoading}\n style={{ ...paletteStyle, ...style }}\n {...props}\n >\n {isLoading && (\n <span\n aria-hidden=\"true\"\n className=\"absolute inline-flex h-[1em] w-[1em] animate-spin items-center justify-center\"\n >\n <svg fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity=\"0.25\" />\n <path d=\"M12 2 A10 10 0 0 1 22 12\" strokeLinecap=\"round\" />\n </svg>\n </span>\n )}\n {!isLoading && leftIcon && (\n <span\n className={`mr-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {leftIcon}\n </span>\n )}\n {!isLoading && (\n <span className=\"btn__content inline-flex items-center justify-center\">{children}</span>\n )}\n {!isLoading && rightIcon && (\n <span\n className={`ml-1 inline-flex shrink-0 items-center justify-center leading-none ${iconSizeClassMap[size]}`}\n >\n {rightIcon}\n </span>\n )}\n </button>\n );\n};\n"],"names":["Button","variant","size","compact","fullWidth","isLoading","leftIcon","rightIcon","children","className","disabled","palette","style","props","baseClass","focusClass","disabledClass","fullWidthClass","offWhiteBorderClass","sizeClassMap","variantClassMap","iconSizeClassMap","paletteVars","paletteStyle","combinedClass","cn","jsxs","jsx"],"mappings":";;AAmCO,MAAMA,IAAgC,CAAC;AAAA,EAC5C,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IACJ,mPACIC,IACJ,0HACIC,IACJ,gFACIC,IAAiBb,IAAY,WAAW,IACxCc,IACJP,MAAY,eAAeV,MAAY,YAAY,iCAAiC,IAEhFkB,IAAiE;AAAA,IACrE,IAAIhB,IACA,+EACA;AAAA,IACJ,IAAIA,IACA,6EACA;AAAA,IACJ,IAAIA,IACA,qFACA;AAAA,IACJ,IAAIA,IACA,uGACA;AAAA,IACJ,IAAIA,IACA,iEACA;AAAA,EAAA,GAGAiB,IAAuE;AAAA,IAC3E,SACE;AAAA,IACF,WACE;AAAA,IACF,SACE;AAAA,IACF,OACE;AAAA,IACF,SACE;AAAA,IACF,MAAM;AAAA,IACN,SACE;AAAA,IACF,OACE;AAAA,EAAA,GAGEC,IAAqE;AAAA,IACzE,IAAIlB,IAAU,YAAY;AAAA,IAC1B,IAAIA,IAAU,gBAAgB;AAAA,IAC9B,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAmB,IACJ;AAAA,IACE,kBAAkB;AAAA,MAChB,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,kBAAkB;AAAA,MAChB,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,mBAAmB;AAAA,MACjB,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,oBAAoB;AAAA,MAClB,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,eAAe;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,gBAAgB;AAAA,MACd,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,aAAa;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb,GAQEC,IAA8B,CAAA;AACpC,EAAIZ,KAAWV,MAAY,cACzBsB,EAAa,cAAc,IAAID,EAAYX,CAAO,EAAE,SACpDY,EAAa,uBAAuB,IAAID,EAAYX,CAAO,EAAE,OACzDW,EAAYX,CAAO,EAAE,cACvBY,EAAa,iBAAiB,IAAID,EAAYX,CAAO,EAAE;AAI3D,QAAMa,IAAgBC;AAAA,IACpBX;AAAA,IACAC;AAAA,IACAC;AAAA,IACAG,EAAajB,CAAI;AAAA,IACjBkB,EAAgBnB,CAAO;AAAA,IACvBiB;AAAA,IACAD;AAAA,IACAR;AAAA,EAAA;AAGF,SACE,gBAAAiB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWF;AAAA,MACX,UAAUd,KAAYL;AAAA,MACtB,OAAO,EAAE,GAAGkB,GAAc,GAAGX,EAAA;AAAA,MAC5B,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAR,KACC,gBAAAsB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,YAEV,UAAA,gBAAAD,EAAC,SAAI,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,SAAQ,aAC7D,UAAA;AAAA,cAAA,gBAAAC,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,eAAc,OAAA,CAAO;AAAA,cACpD,gBAAAA,EAAC,QAAA,EAAK,GAAE,4BAA2B,eAAc,QAAA,CAAQ;AAAA,YAAA,EAAA,CAC3D;AAAA,UAAA;AAAA,QAAA;AAAA,QAGH,CAACtB,KAAaC,KACb,gBAAAqB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,sEAAsEN,EAAiBnB,CAAI,CAAC;AAAA,YAEtG,UAAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ,CAACD,KACA,gBAAAsB,EAAC,QAAA,EAAK,WAAU,wDAAwD,UAAAnB,GAAS;AAAA,QAElF,CAACH,KAAaE,KACb,gBAAAoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,sEAAsEN,EAAiBnB,CAAI,CAAC;AAAA,YAEtG,UAAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAIR;"}
1
+ {"version":3,"file":"Button.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["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"],"names":["SIZE_CLASS","COMPACT_CLASS","VARIANT_CLASS","Button","React","variant","size","compact","fullWidth","isLoading","loadingLabel","leftIcon","rightIcon","children","className","disabled","type","props","ref","jsxs","cn","buttonReset","transitionColors","focusRing","jsx","Spinner"],"mappings":";;;;;AAoCA,MAAMA,IAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAA4C;AAAA,EAChD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAA+C;AAAA,EACnD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SACE;AAAA,EACF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AACX,GAEaC,IAASC,EAAM;AAAA,EAC1B,CACE;AAAA,IACE,SAAAC,IAAU;AAAA,IACV,MAAAC,IAAO;AAAA,IACP,SAAAC,IAAU;AAAA,IACV,WAAAC,IAAY;AAAA,IACZ,WAAAC,IAAY;AAAA,IACZ,cAAAC,IAAe;AAAA,IACf,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,GAAGC;AAAA,EAAA,GAELC,MAEA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,aAAWT,KAAa;AAAA,MACxB,WAAWW;AAAA,QACTC;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,QACAC;AAAA,QACAvB,EAAWM,CAAI;AAAA,QACfC,KAAWN,EAAcK,CAAI;AAAA,QAC7BJ,EAAcG,CAAO;AAAA,QACrBG,KAAa;AAAA,QACbM;AAAA,MAAA;AAAA,MAEF,UAAUC,KAAYN;AAAA,MACtB,MAAAO;AAAA,MACC,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAR,KACC,gBAAAe,EAAC,QAAA,EAAK,WAAU,qDACd,UAAA,gBAAAA,EAACC,KAAQ,OAAOf,GAAc,MAAK,KAAA,CAAK,EAAA,CAC1C;AAAA,0BAED,QAAA,EAAK,WAAWU,EAAG,0CAA0CX,KAAa,WAAW,GACnF,UAAA;AAAA,UAAAE,uBACE,QAAA,EAAK,eAAY,QAAO,WAAU,8CAChC,UAAAA,GACH;AAAA,UAEDE;AAAA,UACAD,KACC,gBAAAY,EAAC,QAAA,EAAK,eAAY,QAAO,WAAU,8CAChC,UAAAZ,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAT,EAAO,cAAc;"}
@@ -1,8 +1,38 @@
1
- import type React from 'react';
1
+ import React from 'react';
2
+ export type CardVariant = 'default' | 'elevated' | 'outlined' | 'flat' | 'inverse' | 'glass';
2
3
  export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
3
4
  children: React.ReactNode;
5
+ /** Realce de hover (borda e sombra). Para cards clicáveis, use um <a>/<button> dentro do card. */
4
6
  hoverable?: boolean;
7
+ /**
8
+ * Cards empilhados atrás do card principal, com opacidades de 90% a 60%
9
+ * (sistema de cards do brand book). Use com moderação, em destaques.
10
+ */
11
+ layered?: boolean;
5
12
  padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';
6
- variant?: 'default' | 'elevated' | 'outlined' | 'flat';
13
+ variant?: CardVariant;
7
14
  }
8
- export declare const Card: React.FC<CardProps>;
15
+ export declare const Card: React.ForwardRefExoticComponent<CardProps & React.RefAttributes<HTMLDivElement>>;
16
+ export declare const CardHeader: {
17
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
18
+ displayName: string;
19
+ };
20
+ export interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
21
+ as?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
22
+ }
23
+ export declare const CardTitle: {
24
+ ({ as: Tag, className, ...props }: CardTitleProps): import("react/jsx-runtime").JSX.Element;
25
+ displayName: string;
26
+ };
27
+ export declare const CardDescription: {
28
+ ({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): import("react/jsx-runtime").JSX.Element;
29
+ displayName: string;
30
+ };
31
+ export declare const CardContent: {
32
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
33
+ displayName: string;
34
+ };
35
+ export declare const CardFooter: {
36
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
37
+ displayName: string;
38
+ };
@@ -1,33 +1,94 @@
1
- import { jsx as m } from "react/jsx-runtime";
2
- const c = ({
3
- variant: a = "default",
4
- padding: r = "md",
5
- hoverable: o = !1,
6
- children: s,
7
- className: d = "",
8
- ...e
9
- }) => {
10
- const n = "relative overflow-hidden rounded-[var(--border-radius-lg)] transition-[var(--transition-all)]", l = {
11
- default: "bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-sm)]",
12
- elevated: "bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-lg)]",
13
- outlined: "bg-transparent border border-[var(--md-outline-variant)] shadow-none",
14
- flat: "bg-[var(--md-surface)] border-0 shadow-none"
15
- }, t = {
16
- none: "p-0",
17
- sm: "p-[var(--spacing-md)]",
18
- md: "p-[var(--spacing-lg)]",
19
- lg: "p-[var(--spacing-xl)]",
20
- xl: "p-[var(--spacing-2xl)]"
21
- }, i = o ? "hover:shadow-[var(--shadow-md)]" : "", v = [
22
- n,
23
- l[a],
24
- t[r],
25
- i,
26
- d
27
- ].filter(Boolean).join(" ");
28
- return /* @__PURE__ */ m("div", { className: v, ...e, children: s });
29
- };
1
+ import { jsx as a, jsxs as m } from "react/jsx-runtime";
2
+ import c from "react";
3
+ import { cn as t } from "../../utils/cn.js";
4
+ import { transitionColors as p, inverseScope as f } from "../../utils/styles.js";
5
+ const g = {
6
+ default: "border border-sbk-line bg-sbk-surface text-sbk-fg",
7
+ elevated: "border border-sbk-line bg-sbk-surface text-sbk-fg shadow-sbk-sm",
8
+ outlined: "border border-sbk-line-strong bg-transparent text-sbk-fg",
9
+ flat: "border border-transparent bg-sbk-surface-sunken text-sbk-fg",
10
+ inverse: t("border border-transparent", f),
11
+ glass: "sbk-glass text-sbk-fg"
12
+ }, k = {
13
+ none: "p-0",
14
+ sm: "p-3",
15
+ md: "p-4",
16
+ lg: "p-6",
17
+ xl: "p-8"
18
+ }, u = c.forwardRef(
19
+ ({
20
+ variant: e = "default",
21
+ padding: s = "md",
22
+ hoverable: r = !1,
23
+ layered: d = !1,
24
+ children: n,
25
+ className: i,
26
+ ...l
27
+ }, b) => {
28
+ const o = /* @__PURE__ */ a(
29
+ "div",
30
+ {
31
+ ref: b,
32
+ className: t(
33
+ "relative overflow-hidden rounded-sbk-md",
34
+ g[e],
35
+ k[s],
36
+ r && t(
37
+ "hover:border-sbk-line-strong hover:shadow-sbk-md",
38
+ p,
39
+ "transition-shadow"
40
+ ),
41
+ i
42
+ ),
43
+ ...l,
44
+ children: n
45
+ }
46
+ );
47
+ return d ? /* @__PURE__ */ m("div", { className: "relative isolate pb-4", children: [
48
+ /* @__PURE__ */ a(
49
+ "span",
50
+ {
51
+ "aria-hidden": "true",
52
+ 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)]"
53
+ }
54
+ ),
55
+ /* @__PURE__ */ a(
56
+ "span",
57
+ {
58
+ "aria-hidden": "true",
59
+ className: "absolute inset-x-3 top-2 bottom-2 -z-10 rounded-sbk-md bg-sbk-ciano opacity-[var(--sbk-card-layer-opacity-2)]"
60
+ }
61
+ ),
62
+ o
63
+ ] }) : o;
64
+ }
65
+ );
66
+ u.displayName = "Card";
67
+ const x = ({ className: e, ...s }) => /* @__PURE__ */ a("div", { className: t("mb-3 flex items-start justify-between gap-3", e), ...s });
68
+ x.displayName = "CardHeader";
69
+ const C = ({ as: e = "h3", className: s, ...r }) => /* @__PURE__ */ a(
70
+ e,
71
+ {
72
+ className: t("m-0 text-lg font-semibold leading-tight text-sbk-fg-heading", s),
73
+ ...r
74
+ }
75
+ );
76
+ C.displayName = "CardTitle";
77
+ const N = ({
78
+ className: e,
79
+ ...s
80
+ }) => /* @__PURE__ */ a("p", { className: t("m-0 text-sm font-light text-sbk-fg-muted", e), ...s });
81
+ N.displayName = "CardDescription";
82
+ const v = ({ className: e, ...s }) => /* @__PURE__ */ a("div", { className: t("font-light", e), ...s });
83
+ v.displayName = "CardContent";
84
+ const h = ({ className: e, ...s }) => /* @__PURE__ */ a("div", { className: t("mt-4 flex items-center justify-end gap-2", e), ...s });
85
+ h.displayName = "CardFooter";
30
86
  export {
31
- c as Card
87
+ u as Card,
88
+ v as CardContent,
89
+ N as CardDescription,
90
+ h as CardFooter,
91
+ x as CardHeader,
92
+ C as CardTitle
32
93
  };
33
94
  //# sourceMappingURL=Card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card.js","sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["import type React from 'react';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n hoverable?: boolean;\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'default' | 'elevated' | 'outlined' | 'flat';\n}\n\nexport const Card: React.FC<CardProps> = ({\n variant = 'default',\n padding = 'md',\n hoverable = false,\n children,\n className = '',\n ...props\n}) => {\n const baseClass =\n 'relative overflow-hidden rounded-[var(--border-radius-lg)] transition-[var(--transition-all)]';\n const variantClassMap: Record<NonNullable<CardProps['variant']>, string> = {\n default:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-sm)]',\n elevated:\n 'bg-[var(--md-surface)] border border-[var(--md-outline-variant)] shadow-[var(--shadow-lg)]',\n outlined: 'bg-transparent border border-[var(--md-outline-variant)] shadow-none',\n flat: 'bg-[var(--md-surface)] border-0 shadow-none',\n };\n const paddingClassMap: Record<NonNullable<CardProps['padding']>, string> = {\n none: 'p-0',\n sm: 'p-[var(--spacing-md)]',\n md: 'p-[var(--spacing-lg)]',\n lg: 'p-[var(--spacing-xl)]',\n xl: 'p-[var(--spacing-2xl)]',\n };\n const hoverableClass = hoverable ? 'hover:shadow-[var(--shadow-md)]' : '';\n const combinedClass = [\n baseClass,\n variantClassMap[variant],\n paddingClassMap[padding],\n hoverableClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={combinedClass} {...props}>\n {children}\n </div>\n );\n};\n"],"names":["Card","variant","padding","hoverable","children","className","props","baseClass","variantClassMap","paddingClassMap","hoverableClass","combinedClass"],"mappings":";AASO,MAAMA,IAA4B,CAAC;AAAA,EACxC,SAAAC,IAAU;AAAA,EACV,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IACJ,iGACIC,IAAqE;AAAA,IACzE,SACE;AAAA,IACF,UACE;AAAA,IACF,UAAU;AAAA,IACV,MAAM;AAAA,EAAA,GAEFC,IAAqE;AAAA,IACzE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAEAC,IAAiBP,IAAY,oCAAoC,IACjEQ,IAAgB;AAAA,IACpBJ;AAAA,IACAC,EAAgBP,CAAO;AAAA,IACvBQ,EAAgBP,CAAO;AAAA,IACvBQ;AAAA,IACAL;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BACG,OAAA,EAAI,WAAWM,GAAgB,GAAGL,GAChC,UAAAF,GACH;AAEJ;"}
1
+ {"version":3,"file":"Card.js","sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["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"],"names":["VARIANT_CLASS","cn","inverseScope","PADDING_CLASS","Card","React","variant","padding","hoverable","layered","children","className","props","ref","card","jsx","transitionColors","jsxs","CardHeader","CardTitle","Tag","CardDescription","CardContent","CardFooter"],"mappings":";;;;AAmBA,MAAMA,IAA6C;AAAA,EACjD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAASC,EAAG,6BAA6BC,CAAY;AAAA,EACrD,OAAO;AACT,GAEMC,IAAmE;AAAA,EACvE,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEaC,IAAOC,EAAM;AAAA,EACxB,CACE;AAAA,IACE,SAAAC,IAAU;AAAA,IACV,SAAAC,IAAU;AAAA,IACV,WAAAC,IAAY;AAAA,IACZ,SAAAC,IAAU;AAAA,IACV,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IACJ,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAF;AAAA,QACA,WAAWZ;AAAA,UACT;AAAA,UACAD,EAAcM,CAAO;AAAA,UACrBH,EAAcI,CAAO;AAAA,UACrBC,KACEP;AAAA,YACE;AAAA,YACAe;AAAA,YACA;AAAA,UAAA;AAAA,UAEJL;AAAA,QAAA;AAAA,QAED,GAAGC;AAAA,QAEH,UAAAF;AAAA,MAAA;AAAA,IAAA;AAIL,WAAKD,IAIH,gBAAAQ,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAEZ,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAEXD;AAAA,IAAA,GACH,IAdmBA;AAAA,EAgBvB;AACF;AACAV,EAAK,cAAc;AAEZ,MAAMc,IAAa,CAAC,EAAE,WAAAP,GAAW,GAAGC,EAAA,MACzC,gBAAAG,EAAC,OAAA,EAAI,WAAWd,EAAG,+CAA+CU,CAAS,GAAI,GAAGC,EAAA,CAAO;AAE3FM,EAAW,cAAc;AAKlB,MAAMC,IAAY,CAAC,EAAE,IAAIC,IAAM,MAAM,WAAAT,GAAW,GAAGC,EAAA,MACxD,gBAAAG;AAAA,EAACK;AAAA,EAAA;AAAA,IACC,WAAWnB,EAAG,+DAA+DU,CAAS;AAAA,IACrF,GAAGC;AAAA,EAAA;AACN;AAEFO,EAAU,cAAc;AAEjB,MAAME,IAAkB,CAAC;AAAA,EAC9B,WAAAV;AAAA,EACA,GAAGC;AACL,MACE,gBAAAG,EAAC,OAAE,WAAWd,EAAG,4CAA4CU,CAAS,GAAI,GAAGC,EAAA,CAAO;AAEtFS,EAAgB,cAAc;AAEvB,MAAMC,IAAc,CAAC,EAAE,WAAAX,GAAW,GAAGC,EAAA,MAC1C,gBAAAG,EAAC,OAAA,EAAI,WAAWd,EAAG,cAAcU,CAAS,GAAI,GAAGC,EAAA,CAAO;AAE1DU,EAAY,cAAc;AAEnB,MAAMC,IAAa,CAAC,EAAE,WAAAZ,GAAW,GAAGC,EAAA,MACzC,gBAAAG,EAAC,OAAA,EAAI,WAAWd,EAAG,4CAA4CU,CAAS,GAAI,GAAGC,EAAA,CAAO;AAExFW,EAAW,cAAc;"}
@@ -1,6 +1,9 @@
1
1
  import React from 'react';
2
2
  export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {
3
+ error?: string;
3
4
  helperText?: string;
4
- label?: string;
5
+ /** Estado intermediário (ex.: "selecionar todos" parcial). */
6
+ indeterminate?: boolean;
7
+ label?: React.ReactNode;
5
8
  }
6
9
  export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;