@sbkbs/ui 1.0.6 → 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 (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 +296 -263
  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,165 +1,105 @@
1
- import { jsxs as t, jsx as e } from "react/jsx-runtime";
2
- import { useState as y, useEffect as N } from "react";
1
+ import { jsxs as t, jsx as e, Fragment as M } from "react/jsx-runtime";
2
+ import { useState as C, useEffect as F } from "react";
3
+ import { Menu as H } from "lucide-react";
3
4
  import { cn as o } from "../../utils/cn.js";
4
- const p = () => typeof document > "u" ? "light" : document.documentElement.getAttribute("data-theme") === "dark" ? "dark" : "light", z = ({ height: n = 36 }) => {
5
- const l = Math.round(n * 2.098961562306262);
6
- return /* @__PURE__ */ e(
7
- "svg",
8
- {
9
- "aria-label": "SBK",
10
- height: n,
11
- viewBox: "39.15 180.84 541.7 258.08",
12
- width: l,
13
- xmlns: "http://www.w3.org/2000/svg",
14
- children: /* @__PURE__ */ e("g", { transform: "translate(-49, 122)", children: /* @__PURE__ */ t("g", { children: [
15
- /* @__PURE__ */ t("g", { children: [
16
- /* @__PURE__ */ e(
17
- "path",
18
- {
19
- d: "m225.13 266.26c-27.48 0-47.67-12.07-50.38-41.01h14.16c0.62 21.44 17.69 29.56 36.85 29.56 18.11 0 39.14-7.91 39.14-29.14 0-16.24-13.12-23.74-32.48-29.99l-11.03-3.53c-24.36-7.71-42.27-16.66-42.27-40.19 0-28.1 24.78-39.97 49.76-39.97 22.9 0 46.64 8.54 47.05 35.18h-13.95c-1.87-18.32-15.82-23.94-32.47-23.94-17.29 0-36.65 7.71-36.65 27.69 0 14.78 11.04 22.28 34.36 29.77l12.49 3.96c24.36 7.7 38.3 15.82 38.93 38.73 0 30.18-26.65 42.88-53.51 42.88z",
20
- fill: "#ffffff",
21
- stroke: "#ffffff",
22
- strokeMiterlimit: 10,
23
- strokeWidth: 2
24
- }
25
- ),
26
- /* @__PURE__ */ e(
27
- "path",
28
- {
29
- d: "m351.42 264.39h-41.43v-150.53h41.43c8.53 0 17.9-0.2 26.23 2.09 16.24 4.58 27.48 17.9 27.48 35.18 0 18.74-10.41 29.98-27.9 34.56 20.82 2.71 34.15 15.2 34.15 36.85 0 34.56-31.86 41.85-59.96 41.85zm8.12-138.45h-36.02v56.49h32.06c19.16 0 34.98-8.81 34.98-30.26 0-18.74-14.16-26.23-31.02-26.23zm-1.46 63.19h-34.56v63.18h26.65c21.86 0 46.84-1.45 46.84-29.98 0-24.77-18.11-33.2-38.93-33.2z",
30
- fill: "#ffffff",
31
- fillRule: "evenodd",
32
- stroke: "#ffffff",
33
- strokeMiterlimit: 10,
34
- strokeWidth: 2
35
- }
36
- ),
37
- /* @__PURE__ */ e(
38
- "path",
39
- {
40
- d: "m443.77 264.39v-150.53h13.53v150.53zm88.07 0l-73.7-81.61 67.03-68.92h18.12l-68.91 67.88 75.99 82.65z",
41
- fill: "#ffffff",
42
- stroke: "#ffffff",
43
- strokeMiterlimit: 10,
44
- strokeWidth: 2
45
- }
46
- )
47
- ] }),
48
- /* @__PURE__ */ t("g", { children: [
49
- /* @__PURE__ */ e(
50
- "path",
51
- {
52
- d: "m99.09 118.17l-0.21 57.98-9.73 0.24 0.56-62.81c0.26-29.03 26.91-53.16 56.3-53.26l151.74-0.48c0.62 3.58 0.63 6.35 0.05 9.92l-150.35 0.22c-26.28 0.04-48.26 21.9-48.36 48.19z",
53
- fill: "#ffffff"
54
- }
55
- ),
56
- /* @__PURE__ */ e(
57
- "path",
58
- {
59
- d: "m419.9 315.79l0.22-9.33 149.3-0.15c25.73-0.02 48.97-20.27 49.14-45.96l0.4-60.49q4.64-0.28 9.57-0.07l0.32 52.61c0.21 33.16-23.62 63.29-57.93 63.33l-135.88 0.19z",
60
- fill: "#ffffff"
61
- }
62
- )
63
- ] })
64
- ] }) })
65
- }
66
- );
67
- }, M = ({ onClick: n }) => /* @__PURE__ */ t(
68
- "button",
69
- {
70
- "aria-label": "Abrir menu",
71
- onClick: n,
72
- type: "button",
73
- className: o(
74
- "flex flex-col gap-1 shrink-0 bg-transparent border-none p-1.5",
75
- n ? "cursor-pointer" : "cursor-default"
76
- ),
77
- children: [
78
- /* @__PURE__ */ e("span", { className: "block w-5 h-0.5 bg-sbk-verde-vibrante rounded-[2px]" }),
79
- /* @__PURE__ */ e("span", { className: "block w-5 h-0.5 bg-sbk-verde-vibrante rounded-[2px]" }),
80
- /* @__PURE__ */ e("span", { className: "block w-5 h-0.5 bg-sbk-verde-vibrante rounded-[2px]" })
81
- ]
82
- }
83
- ), j = ({
84
- logoSrc: n,
85
- logoDarkSrc: f,
86
- logoAlt: l = "SBK",
87
- title: i,
88
- subtitle: d,
89
- theme: a,
90
- onLogoClick: r,
91
- onMenuClick: b,
92
- rightContent: v,
93
- showMenuIcon: x = !0,
94
- userInitials: c,
95
- className: g = ""
5
+ import { focusRing as p, buttonReset as x, inverseScope as L } from "../../utils/styles.js";
6
+ import { Logo as O } from "../Logo/Logo.js";
7
+ const g = () => typeof document < "u" && document.documentElement.getAttribute("data-theme") === "dark" ? "dark" : "light", S = {
8
+ solid: L,
9
+ light: "border-b border-sbk-line bg-sbk-surface text-sbk-fg",
10
+ glass: "sbk-glass rounded-none border-x-0 border-t-0 text-sbk-fg"
11
+ }, B = ({
12
+ logoSrc: k,
13
+ logoDarkSrc: s,
14
+ logoAlt: N = "SBK",
15
+ logoVariant: v = "sbk",
16
+ title: r,
17
+ subtitle: i,
18
+ theme: n,
19
+ navigation: c,
20
+ onLogoClick: d,
21
+ onMenuClick: y,
22
+ menuExpanded: w,
23
+ menuLabel: j = "Abrir menu",
24
+ rightContent: z,
25
+ showMenuIcon: A = !0,
26
+ sticky: R = !0,
27
+ userInitials: a,
28
+ variant: l = "solid",
29
+ className: T
96
30
  }) => {
97
- const [k, m] = y(() => a ?? p()), h = k === "dark" && f ? f : n;
98
- N(() => {
99
- if (a) {
100
- m(a);
31
+ const [E, m] = C(() => n ?? g());
32
+ F(() => {
33
+ if (n) {
34
+ m(n);
101
35
  return;
102
36
  }
103
- const s = () => m(p());
104
- if (s(), typeof MutationObserver > "u") return;
105
- const u = new MutationObserver(s);
106
- return u.observe(document.documentElement, { attributes: !0, attributeFilter: ["data-theme"] }), () => u.disconnect();
107
- }, [a]);
108
- const w = (s) => {
109
- s.key === "Enter" && (r == null || r());
110
- };
37
+ if (!s || typeof MutationObserver > "u") return;
38
+ const f = () => m(g());
39
+ f();
40
+ const h = new MutationObserver(f);
41
+ return h.observe(document.documentElement, {
42
+ attributes: !0,
43
+ attributeFilter: ["data-theme"]
44
+ }), () => h.disconnect();
45
+ }, [n, s]);
46
+ const u = E === "dark" && s ? s : k, b = /* @__PURE__ */ t(M, { children: [
47
+ u ? /* @__PURE__ */ e("img", { alt: N, className: "h-8 w-auto shrink-0 object-contain", src: u }) : /* @__PURE__ */ e(O, { color: l === "solid" ? "white" : "auto", height: 28, variant: v }),
48
+ (r || i) && /* @__PURE__ */ t("span", { className: "grid min-w-0 gap-px text-left", children: [
49
+ r && /* @__PURE__ */ e("span", { className: "truncate text-base font-semibold leading-tight text-sbk-fg-heading", children: r }),
50
+ i && /* @__PURE__ */ e("span", { className: "truncate text-xs font-light leading-tight text-sbk-fg-muted", children: i })
51
+ ] })
52
+ ] });
111
53
  return /* @__PURE__ */ t(
112
54
  "header",
113
55
  {
114
56
  className: o(
115
- "sticky top-0 z-[1000] w-full h-16 shrink-0 box-border",
116
- "bg-sbk-verde-profundo",
117
- "flex items-center justify-between",
118
- "px-14",
119
- g
57
+ "z-[var(--sbk-z-sticky)] box-border flex h-16 w-full shrink-0 items-center justify-between gap-4 px-4 md:px-8",
58
+ R && "sticky top-0",
59
+ S[l],
60
+ T
120
61
  ),
121
62
  children: [
122
- /* @__PURE__ */ t("div", { className: "flex items-center gap-3 min-w-0", children: [
123
- x && /* @__PURE__ */ e(M, { onClick: b }),
124
- /* @__PURE__ */ t(
125
- "div",
63
+ /* @__PURE__ */ t("div", { className: "flex min-w-0 items-center gap-3", children: [
64
+ A && /* @__PURE__ */ e(
65
+ "button",
126
66
  {
127
- onClick: r,
128
- onKeyDown: r ? w : void 0,
129
- role: r ? "button" : void 0,
67
+ "aria-expanded": w,
68
+ "aria-label": j,
130
69
  className: o(
131
- "flex items-center gap-2.5 select-none",
132
- r ? "cursor-pointer" : "cursor-default"
70
+ x,
71
+ "inline-flex size-10 shrink-0 cursor-pointer items-center justify-center rounded-sbk-sm text-sbk-fg hover:bg-sbk-surface-hover",
72
+ p
133
73
  ),
134
- tabIndex: r ? 0 : void 0,
135
- children: [
136
- h ? /* @__PURE__ */ e(
137
- "img",
138
- {
139
- alt: l,
140
- onError: (s) => {
141
- s.target.style.display = "none";
142
- },
143
- src: h,
144
- className: "h-9 w-auto object-contain shrink-0"
145
- }
146
- ) : /* @__PURE__ */ e(z, { height: 36 }),
147
- (i || d) && /* @__PURE__ */ t("div", { className: "flex flex-col gap-[1px]", children: [
148
- i && /* @__PURE__ */ e("span", { className: "font-logo text-[1.125rem] font-semibold text-white leading-[1.2] tracking-[0.02em]", children: i }),
149
- d && /* @__PURE__ */ e("span", { className: "font-primary text-[11px] font-normal text-white/45 leading-[1.3]", children: d })
150
- ] })
151
- ]
74
+ onClick: y,
75
+ type: "button",
76
+ children: /* @__PURE__ */ e(H, { "aria-hidden": "true", className: "size-5" })
152
77
  }
153
- )
78
+ ),
79
+ d ? /* @__PURE__ */ e(
80
+ "button",
81
+ {
82
+ className: o(
83
+ x,
84
+ "flex min-w-0 cursor-pointer items-center gap-3 rounded-sbk-xs",
85
+ p
86
+ ),
87
+ onClick: d,
88
+ type: "button",
89
+ children: b
90
+ }
91
+ ) : /* @__PURE__ */ e("div", { className: "flex min-w-0 items-center gap-3", children: b })
154
92
  ] }),
155
- /* @__PURE__ */ t("div", { className: "flex items-center gap-2 shrink-0", children: [
156
- v,
157
- c && /* @__PURE__ */ e(
158
- "div",
93
+ c && /* @__PURE__ */ e("nav", { "aria-label": "Principal", className: "hidden min-w-0 flex-1 justify-center md:flex", children: c }),
94
+ /* @__PURE__ */ t("div", { className: "flex shrink-0 items-center gap-2", children: [
95
+ z,
96
+ a && /* @__PURE__ */ e(
97
+ "span",
159
98
  {
160
- "aria-label": `Usuário: ${c}`,
161
- className: "w-9 h-9 rounded-full bg-sbk-verde-vibrante flex items-center justify-center text-white font-primary font-semibold text-[13px] shrink-0 select-none",
162
- children: c
99
+ "aria-label": `Usuário: ${a}`,
100
+ className: "inline-flex size-9 shrink-0 select-none items-center justify-center rounded-full bg-sbk-ciano text-[0.8125rem] font-semibold text-sbk-branco",
101
+ role: "img",
102
+ children: a
163
103
  }
164
104
  )
165
105
  ] })
@@ -167,8 +107,8 @@ const p = () => typeof document > "u" ? "light" : document.documentElement.getAt
167
107
  }
168
108
  );
169
109
  };
170
- j.displayName = "Header";
110
+ B.displayName = "Header";
171
111
  export {
172
- j as Header
112
+ B as Header
173
113
  };
174
114
  //# sourceMappingURL=Header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Header.js","sources":["../../../src/components/Header/Header.tsx"],"sourcesContent":["import type React from 'react';\nimport { useEffect, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport type { Theme } from '../../theme/ThemeProvider';\n\nexport interface HeaderProps {\n /** Classe CSS adicional */\n className?: string;\n /** Texto alternativo do logo */\n logoAlt?: string;\n /** URL de imagem para substituir o logo SVG padrão (tema escuro) */\n logoDarkSrc?: string;\n /** URL de imagem para substituir o logo SVG padrão (tema claro) */\n logoSrc?: string;\n /** Callback ao clicar no ícone de menu (hamburger) */\n onMenuClick?: () => void;\n /** Callback ao clicar na área do logo/título */\n onLogoClick?: () => void;\n /** Conteúdo da área direita (pills de idioma/tema, etc.) */\n rightContent?: React.ReactNode;\n /** Exibe o ícone hamburger à esquerda — padrão: true */\n showMenuIcon?: boolean;\n /** Subtítulo abaixo do título */\n subtitle?: React.ReactNode;\n /** Tema opcional para escolher o logo correto sem depender do ThemeProvider */\n theme?: Theme;\n /** Título exibido ao lado do logo */\n title?: React.ReactNode;\n /** Iniciais do usuário no avatar circular turquesa (ex.: \"CF\") */\n userInitials?: string;\n}\n\nconst detectTheme = (): Theme => {\n if (typeof document === 'undefined') return 'light';\n return document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';\n};\n\nconst SbkLogoWhite: React.FC<{ height?: number }> = ({ height = 36 }) => {\n const aspect = 541.7 / 258.08;\n const width = Math.round(height * aspect);\n return (\n <svg\n aria-label=\"SBK\"\n height={height}\n viewBox=\"39.15 180.84 541.7 258.08\"\n width={width}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g transform=\"translate(-49, 122)\">\n <g>\n <g>\n {/* S */}\n <path\n d=\"m225.13 266.26c-27.48 0-47.67-12.07-50.38-41.01h14.16c0.62 21.44 17.69 29.56 36.85 29.56 18.11 0 39.14-7.91 39.14-29.14 0-16.24-13.12-23.74-32.48-29.99l-11.03-3.53c-24.36-7.71-42.27-16.66-42.27-40.19 0-28.1 24.78-39.97 49.76-39.97 22.9 0 46.64 8.54 47.05 35.18h-13.95c-1.87-18.32-15.82-23.94-32.47-23.94-17.29 0-36.65 7.71-36.65 27.69 0 14.78 11.04 22.28 34.36 29.77l12.49 3.96c24.36 7.7 38.3 15.82 38.93 38.73 0 30.18-26.65 42.88-53.51 42.88z\"\n fill=\"#ffffff\"\n stroke=\"#ffffff\"\n strokeMiterlimit={10}\n strokeWidth={2}\n />\n {/* B */}\n <path\n d=\"m351.42 264.39h-41.43v-150.53h41.43c8.53 0 17.9-0.2 26.23 2.09 16.24 4.58 27.48 17.9 27.48 35.18 0 18.74-10.41 29.98-27.9 34.56 20.82 2.71 34.15 15.2 34.15 36.85 0 34.56-31.86 41.85-59.96 41.85zm8.12-138.45h-36.02v56.49h32.06c19.16 0 34.98-8.81 34.98-30.26 0-18.74-14.16-26.23-31.02-26.23zm-1.46 63.19h-34.56v63.18h26.65c21.86 0 46.84-1.45 46.84-29.98 0-24.77-18.11-33.2-38.93-33.2z\"\n fill=\"#ffffff\"\n fillRule=\"evenodd\"\n stroke=\"#ffffff\"\n strokeMiterlimit={10}\n strokeWidth={2}\n />\n {/* K */}\n <path\n d=\"m443.77 264.39v-150.53h13.53v150.53zm88.07 0l-73.7-81.61 67.03-68.92h18.12l-68.91 67.88 75.99 82.65z\"\n fill=\"#ffffff\"\n stroke=\"#ffffff\"\n strokeMiterlimit={10}\n strokeWidth={2}\n />\n </g>\n <g>\n {/* Arco superior */}\n <path\n d=\"m99.09 118.17l-0.21 57.98-9.73 0.24 0.56-62.81c0.26-29.03 26.91-53.16 56.3-53.26l151.74-0.48c0.62 3.58 0.63 6.35 0.05 9.92l-150.35 0.22c-26.28 0.04-48.26 21.9-48.36 48.19z\"\n fill=\"#ffffff\"\n />\n {/* Arco inferior */}\n <path\n d=\"m419.9 315.79l0.22-9.33 149.3-0.15c25.73-0.02 48.97-20.27 49.14-45.96l0.4-60.49q4.64-0.28 9.57-0.07l0.32 52.61c0.21 33.16-23.62 63.29-57.93 63.33l-135.88 0.19z\"\n fill=\"#ffffff\"\n />\n </g>\n </g>\n </g>\n </svg>\n );\n};\n\nconst HamburgerIcon: React.FC<{ onClick?: () => void }> = ({ onClick }) => (\n <button\n aria-label=\"Abrir menu\"\n onClick={onClick}\n type=\"button\"\n className={cn(\n 'flex flex-col gap-1 shrink-0 bg-transparent border-none p-1.5',\n onClick ? 'cursor-pointer' : 'cursor-default',\n )}\n >\n <span className=\"block w-5 h-0.5 bg-sbk-verde-vibrante rounded-[2px]\" />\n <span className=\"block w-5 h-0.5 bg-sbk-verde-vibrante rounded-[2px]\" />\n <span className=\"block w-5 h-0.5 bg-sbk-verde-vibrante rounded-[2px]\" />\n </button>\n);\n\nexport const Header: React.FC<HeaderProps> = ({\n logoSrc,\n logoDarkSrc,\n logoAlt = 'SBK',\n title,\n subtitle,\n theme,\n onLogoClick,\n onMenuClick,\n rightContent,\n showMenuIcon = true,\n userInitials,\n className = '',\n}) => {\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(() => theme ?? detectTheme());\n\n const logoSrcResolved = resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\n\n useEffect(() => {\n if (theme) {\n setResolvedTheme(theme);\n return;\n }\n const syncTheme = () => setResolvedTheme(detectTheme());\n syncTheme();\n if (typeof MutationObserver === 'undefined') return;\n const observer = new MutationObserver(syncTheme);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });\n return () => observer.disconnect();\n }, [theme]);\n\n const handleLogoKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') onLogoClick?.();\n };\n\n return (\n <header\n className={cn(\n 'sticky top-0 z-[1000] w-full h-16 shrink-0 box-border',\n 'bg-sbk-verde-profundo',\n 'flex items-center justify-between',\n 'px-14',\n className,\n )}\n >\n {/* ── Esquerda: hamburger + logo ── */}\n <div className=\"flex items-center gap-3 min-w-0\">\n {showMenuIcon && <HamburgerIcon onClick={onMenuClick} />}\n\n <div\n onClick={onLogoClick}\n onKeyDown={onLogoClick ? handleLogoKeyDown : undefined}\n role={onLogoClick ? 'button' : undefined}\n className={cn(\n 'flex items-center gap-2.5 select-none',\n onLogoClick ? 'cursor-pointer' : 'cursor-default',\n )}\n tabIndex={onLogoClick ? 0 : undefined}\n >\n {logoSrcResolved ? (\n <img\n alt={logoAlt}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n src={logoSrcResolved}\n className=\"h-9 w-auto object-contain shrink-0\"\n />\n ) : (\n <SbkLogoWhite height={36} />\n )}\n\n {(title || subtitle) && (\n <div className=\"flex flex-col gap-[1px]\">\n {title && (\n <span className=\"font-logo text-[1.125rem] font-semibold text-white leading-[1.2] tracking-[0.02em]\">\n {title}\n </span>\n )}\n {subtitle && (\n <span className=\"font-primary text-[11px] font-normal text-white/45 leading-[1.3]\">\n {subtitle}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* ── Direita: pills + avatar ── */}\n <div className=\"flex items-center gap-2 shrink-0\">\n {rightContent}\n {userInitials && (\n <div\n aria-label={`Usuário: ${userInitials}`}\n className=\"w-9 h-9 rounded-full bg-sbk-verde-vibrante flex items-center justify-center text-white font-primary font-semibold text-[13px] shrink-0 select-none\"\n >\n {userInitials}\n </div>\n )}\n </div>\n </header>\n );\n};\n\nHeader.displayName = 'Header';\n"],"names":["detectTheme","SbkLogoWhite","height","width","jsx","jsxs","HamburgerIcon","onClick","cn","Header","logoSrc","logoDarkSrc","logoAlt","title","subtitle","theme","onLogoClick","onMenuClick","rightContent","showMenuIcon","userInitials","className","resolvedTheme","setResolvedTheme","useState","logoSrcResolved","useEffect","syncTheme","observer","handleLogoKeyDown","e"],"mappings":";;;AAgCA,MAAMA,IAAc,MACd,OAAO,WAAa,MAAoB,UACrC,SAAS,gBAAgB,aAAa,YAAY,MAAM,SAAS,SAAS,SAG7EC,IAA8C,CAAC,EAAE,QAAAC,IAAS,SAAS;AAEvE,QAAMC,IAAQ,KAAK,MAAMD,IADV,iBACyB;AACxC,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,QAAAF;AAAA,MACA,SAAQ;AAAA,MACR,OAAAC;AAAA,MACA,OAAM;AAAA,MAEN,UAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,uBACX,4BAAC,KAAA,EACC,UAAA;AAAA,QAAA,gBAAAC,EAAC,KAAA,EAEC,UAAA;AAAA,UAAA,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,MAAK;AAAA,cACL,QAAO;AAAA,cACP,kBAAkB;AAAA,cAClB,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAGf,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,MAAK;AAAA,cACL,UAAS;AAAA,cACT,QAAO;AAAA,cACP,kBAAkB;AAAA,cAClB,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAGf,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,MAAK;AAAA,cACL,QAAO;AAAA,cACP,kBAAkB;AAAA,cAClB,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,QACf,GACF;AAAA,0BACC,KAAA,EAEC,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,MAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAGP,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,MAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QACP,EAAA,CACF;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN,GAEME,IAAoD,CAAC,EAAE,SAAAC,EAAA,MAC3D,gBAAAF;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,cAAW;AAAA,IACX,SAAAE;AAAA,IACA,MAAK;AAAA,IACL,WAAWC;AAAA,MACT;AAAA,MACAD,IAAU,mBAAmB;AAAA,IAAA;AAAA,IAG/B,UAAA;AAAA,MAAA,gBAAAH,EAAC,QAAA,EAAK,WAAU,sDAAA,CAAsD;AAAA,MACtE,gBAAAA,EAAC,QAAA,EAAK,WAAU,sDAAA,CAAsD;AAAA,MACtE,gBAAAA,EAAC,QAAA,EAAK,WAAU,sDAAA,CAAsD;AAAA,IAAA;AAAA,EAAA;AACxE,GAGWK,IAAgC,CAAC;AAAA,EAC5C,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,cAAAC;AAAA,EACA,WAAAC,IAAY;AACd,MAAM;AACJ,QAAM,CAACC,GAAeC,CAAgB,IAAIC,EAAgB,MAAMT,KAASf,GAAa,GAEhFyB,IAAkBH,MAAkB,UAAUX,IAAcA,IAAcD;AAEhF,EAAAgB,EAAU,MAAM;AACd,QAAIX,GAAO;AACT,MAAAQ,EAAiBR,CAAK;AACtB;AAAA,IACF;AACA,UAAMY,IAAY,MAAMJ,EAAiBvB,GAAa;AAEtD,QADA2B,EAAA,GACI,OAAO,mBAAqB,IAAa;AAC7C,UAAMC,IAAW,IAAI,iBAAiBD,CAAS;AAC/C,WAAAC,EAAS,QAAQ,SAAS,iBAAiB,EAAE,YAAY,IAAM,iBAAiB,CAAC,YAAY,GAAG,GACzF,MAAMA,EAAS,WAAA;AAAA,EACxB,GAAG,CAACb,CAAK,CAAC;AAEV,QAAMc,IAAoB,CAACC,MAA2B;AACpD,IAAIA,EAAE,QAAQ,YAASd,KAAA,QAAAA;AAAA,EACzB;AAEA,SACE,gBAAAX;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWG;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAa;AAAA,MAAA;AAAA,MAIF,UAAA;AAAA,QAAA,gBAAAhB,EAAC,OAAA,EAAI,WAAU,mCACZ,UAAA;AAAA,UAAAc,KAAgB,gBAAAf,EAACE,GAAA,EAAc,SAASW,EAAA,CAAa;AAAA,UAEtD,gBAAAZ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASW;AAAA,cACT,WAAWA,IAAca,IAAoB;AAAA,cAC7C,MAAMb,IAAc,WAAW;AAAA,cAC/B,WAAWR;AAAA,gBACT;AAAA,gBACAQ,IAAc,mBAAmB;AAAA,cAAA;AAAA,cAEnC,UAAUA,IAAc,IAAI;AAAA,cAE3B,UAAA;AAAA,gBAAAS,IACC,gBAAArB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKQ;AAAA,oBACL,SAAS,CAACkB,MAAM;AACb,sBAAAA,EAAE,OAA4B,MAAM,UAAU;AAAA,oBACjD;AAAA,oBACA,KAAKL;AAAA,oBACL,WAAU;AAAA,kBAAA;AAAA,gBAAA,IAGZ,gBAAArB,EAACH,GAAA,EAAa,QAAQ,GAAA,CAAI;AAAA,iBAG1BY,KAASC,MACT,gBAAAT,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,kBAAAQ,KACC,gBAAAT,EAAC,QAAA,EAAK,WAAU,sFACb,UAAAS,GACH;AAAA,kBAEDC,KACC,gBAAAV,EAAC,QAAA,EAAK,WAAU,oEACb,UAAAU,EAAA,CACH;AAAA,gBAAA,EAAA,CAEJ;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAEJ,GACF;AAAA,QAGA,gBAAAT,EAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,UAAAa;AAAA,UACAE,KACC,gBAAAhB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,cAAY,YAAYgB,CAAY;AAAA,cACpC,WAAU;AAAA,cAET,UAAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAX,EAAO,cAAc;"}
1
+ {"version":3,"file":"Header.js","sources":["../../../src/components/Header/Header.tsx"],"sourcesContent":["import type React from 'react';\nimport { useEffect, useState } from 'react';\nimport { Menu } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing, inverseScope } from '../../utils/styles';\nimport type { Theme } from '../../theme/ThemeProvider';\nimport { Logo, type LogoVariant } from '../Logo/Logo';\n\nexport type HeaderVariant = 'solid' | 'light' | 'glass';\n\nexport interface HeaderProps {\n className?: string;\n /** Texto alternativo da imagem de logo customizada. */\n logoAlt?: string;\n /** Imagem de logo para o tema escuro (substitui o SVG oficial). */\n logoDarkSrc?: string;\n /** Imagem de logo customizada (substitui o SVG oficial). */\n logoSrc?: string;\n /** Logo oficial usado quando não há `logoSrc`. Padrão: sbk. */\n logoVariant?: LogoVariant;\n /** Estado do menu lateral, anunciado no botão hamburger (aria-expanded). */\n menuExpanded?: boolean;\n /** Rótulo do botão hamburger. Padrão: \"Abrir menu\". */\n menuLabel?: string;\n /** Navegação principal, exibida ao centro. */\n navigation?: React.ReactNode;\n onLogoClick?: () => void;\n onMenuClick?: () => void;\n /** Conteúdo à direita (ações, seletor de tema, menu do usuário). */\n rightContent?: React.ReactNode;\n showMenuIcon?: boolean;\n /** Fixa o header no topo. Padrão: true. */\n sticky?: boolean;\n subtitle?: React.ReactNode;\n /** Tema para escolher entre logoSrc e logoDarkSrc sem depender do ThemeProvider. */\n theme?: Theme;\n title?: React.ReactNode;\n /** Iniciais do usuário exibidas no avatar (ex.: \"CF\"). */\n userInitials?: string;\n /** `solid`: verde escuro (padrão). `light`: superfície clara. `glass`: Liquid Glass. */\n variant?: HeaderVariant;\n}\n\nconst detectTheme = (): Theme =>\n typeof document !== 'undefined' && document.documentElement.getAttribute('data-theme') === 'dark'\n ? 'dark'\n : 'light';\n\nconst VARIANT_CLASS: Record<HeaderVariant, string> = {\n solid: inverseScope,\n light: 'border-b border-sbk-line bg-sbk-surface text-sbk-fg',\n glass: 'sbk-glass rounded-none border-x-0 border-t-0 text-sbk-fg',\n};\n\nexport const Header = ({\n logoSrc,\n logoDarkSrc,\n logoAlt = 'SBK',\n logoVariant = 'sbk',\n title,\n subtitle,\n theme,\n navigation,\n onLogoClick,\n onMenuClick,\n menuExpanded,\n menuLabel = 'Abrir menu',\n rightContent,\n showMenuIcon = true,\n sticky = true,\n userInitials,\n variant = 'solid',\n className,\n}: HeaderProps) => {\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(() => theme ?? detectTheme());\n\n useEffect(() => {\n if (theme) {\n setResolvedTheme(theme);\n return;\n }\n if (!logoDarkSrc || typeof MutationObserver === 'undefined') return;\n const sync = () => setResolvedTheme(detectTheme());\n sync();\n const observer = new MutationObserver(sync);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n return () => observer.disconnect();\n }, [theme, logoDarkSrc]);\n\n const customLogo = resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\n const brand = (\n <>\n {customLogo ? (\n <img alt={logoAlt} className=\"h-8 w-auto shrink-0 object-contain\" src={customLogo} />\n ) : (\n <Logo color={variant === 'solid' ? 'white' : 'auto'} height={28} variant={logoVariant} />\n )}\n {(title || subtitle) && (\n <span className=\"grid min-w-0 gap-px text-left\">\n {title && (\n <span className=\"truncate text-base font-semibold leading-tight text-sbk-fg-heading\">\n {title}\n </span>\n )}\n {subtitle && (\n <span className=\"truncate text-xs font-light leading-tight text-sbk-fg-muted\">\n {subtitle}\n </span>\n )}\n </span>\n )}\n </>\n );\n\n return (\n <header\n className={cn(\n 'z-[var(--sbk-z-sticky)] box-border flex h-16 w-full shrink-0 items-center justify-between gap-4 px-4 md:px-8',\n sticky && 'sticky top-0',\n VARIANT_CLASS[variant],\n className,\n )}\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n {showMenuIcon && (\n <button\n aria-expanded={menuExpanded}\n aria-label={menuLabel}\n className={cn(\n buttonReset,\n 'inline-flex size-10 shrink-0 cursor-pointer items-center justify-center rounded-sbk-sm text-sbk-fg hover:bg-sbk-surface-hover',\n focusRing,\n )}\n onClick={onMenuClick}\n type=\"button\"\n >\n <Menu aria-hidden=\"true\" className=\"size-5\" />\n </button>\n )}\n {onLogoClick ? (\n <button\n className={cn(\n buttonReset,\n 'flex min-w-0 cursor-pointer items-center gap-3 rounded-sbk-xs',\n focusRing,\n )}\n onClick={onLogoClick}\n type=\"button\"\n >\n {brand}\n </button>\n ) : (\n <div className=\"flex min-w-0 items-center gap-3\">{brand}</div>\n )}\n </div>\n\n {navigation && (\n <nav aria-label=\"Principal\" className=\"hidden min-w-0 flex-1 justify-center md:flex\">\n {navigation}\n </nav>\n )}\n\n <div className=\"flex shrink-0 items-center gap-2\">\n {rightContent}\n {userInitials && (\n <span\n aria-label={`Usuário: ${userInitials}`}\n className=\"inline-flex size-9 shrink-0 select-none items-center justify-center rounded-full bg-sbk-ciano text-[0.8125rem] font-semibold text-sbk-branco\"\n role=\"img\"\n >\n {userInitials}\n </span>\n )}\n </div>\n </header>\n );\n};\n\nHeader.displayName = 'Header';\n"],"names":["detectTheme","VARIANT_CLASS","inverseScope","Header","logoSrc","logoDarkSrc","logoAlt","logoVariant","title","subtitle","theme","navigation","onLogoClick","onMenuClick","menuExpanded","menuLabel","rightContent","showMenuIcon","sticky","userInitials","variant","className","resolvedTheme","setResolvedTheme","useState","useEffect","sync","observer","customLogo","brand","jsxs","Fragment","Logo","jsx","cn","buttonReset","focusRing","Menu"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type React from 'react';
2
+ export interface HighlightProps extends React.HTMLAttributes<HTMLElement> {
3
+ /** Ciano Escuro (padrão) ou Verde Claro, conforme o brand book. */
4
+ tone?: 'ciano' | 'verde';
5
+ }
6
+ /**
7
+ * Highlight de palavra-chave do brand book: bloco retangular atrás de palavras
8
+ * estruturantes, sempre com texto branco. Use em poucas palavras por tela.
9
+ */
10
+ export declare const Highlight: {
11
+ ({ tone, className, ...props }: HighlightProps): import("react/jsx-runtime").JSX.Element;
12
+ displayName: string;
13
+ };
@@ -0,0 +1,18 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { cn as i } from "../../utils/cn.js";
3
+ const s = ({ tone: o = "ciano", className: r, ...a }) => /* @__PURE__ */ e(
4
+ "mark",
5
+ {
6
+ className: i(
7
+ "rounded-sbk-xs px-1.5 py-0.5 font-semibold text-sbk-branco [box-decoration-break:clone]",
8
+ o === "ciano" ? "bg-sbk-ciano-escuro" : "bg-sbk-verde-claro",
9
+ r
10
+ ),
11
+ ...a
12
+ }
13
+ );
14
+ s.displayName = "Highlight";
15
+ export {
16
+ s as Highlight
17
+ };
18
+ //# sourceMappingURL=Highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Highlight.js","sources":["../../../src/components/Highlight/Highlight.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface HighlightProps extends React.HTMLAttributes<HTMLElement> {\n /** Ciano Escuro (padrão) ou Verde Claro, conforme o brand book. */\n tone?: 'ciano' | 'verde';\n}\n\n/**\n * Highlight de palavra-chave do brand book: bloco retangular atrás de palavras\n * estruturantes, sempre com texto branco. Use em poucas palavras por tela.\n */\nexport const Highlight = ({ tone = 'ciano', className, ...props }: HighlightProps) => (\n <mark\n className={cn(\n 'rounded-sbk-xs px-1.5 py-0.5 font-semibold text-sbk-branco [box-decoration-break:clone]',\n tone === 'ciano' ? 'bg-sbk-ciano-escuro' : 'bg-sbk-verde-claro',\n className,\n )}\n {...props}\n />\n);\n\nHighlight.displayName = 'Highlight';\n"],"names":["Highlight","tone","className","props","jsx","cn"],"mappings":";;AAYO,MAAMA,IAAY,CAAC,EAAE,MAAAC,IAAO,SAAS,WAAAC,GAAW,GAAGC,QACxD,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAJ,MAAS,UAAU,wBAAwB;AAAA,MAC3CC;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN;AAGFH,EAAU,cAAc;"}
@@ -0,0 +1,21 @@
1
+ import type { LucideIcon, LucideProps } from 'lucide-react';
2
+ export type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
3
+ export interface IconProps extends Omit<LucideProps, 'size' | 'ref'> {
4
+ /** Componente de ícone do lucide-react (ex.: `import { Search } from 'lucide-react'`). */
5
+ icon: LucideIcon;
6
+ /**
7
+ * Texto para leitores de tela. Sem label o ícone é decorativo (`aria-hidden`).
8
+ * Informe sempre que o ícone for o único conteúdo com significado.
9
+ */
10
+ label?: string;
11
+ size?: IconSize | number;
12
+ }
13
+ /**
14
+ * Wrapper padronizado para ícones lucide-react.
15
+ * Ícones herdam a cor do texto (currentColor), o que mantém a paleta da marca.
16
+ * Traço 1.75 acompanha o peso Leve da tipografia.
17
+ */
18
+ export declare const Icon: {
19
+ ({ icon: IconComponent, label, size, strokeWidth, className, ...props }: IconProps): import("react/jsx-runtime").JSX.Element;
20
+ displayName: string;
21
+ };
@@ -0,0 +1,31 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { cn as c } from "../../utils/cn.js";
3
+ const e = { xs: 12, sm: 16, md: 20, lg: 24, xl: 32 }, d = ({
4
+ icon: m,
5
+ label: o,
6
+ size: r = "md",
7
+ strokeWidth: n = 1.75,
8
+ className: t,
9
+ ...s
10
+ }) => {
11
+ const i = typeof r == "number" ? r : e[r];
12
+ return /* @__PURE__ */ a(
13
+ m,
14
+ {
15
+ "aria-hidden": o ? void 0 : !0,
16
+ "aria-label": o,
17
+ className: c("shrink-0", t),
18
+ focusable: "false",
19
+ height: i,
20
+ role: o ? "img" : void 0,
21
+ strokeWidth: n,
22
+ width: i,
23
+ ...s
24
+ }
25
+ );
26
+ };
27
+ d.displayName = "Icon";
28
+ export {
29
+ d as Icon
30
+ };
31
+ //# sourceMappingURL=Icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.js","sources":["../../../src/components/Icon/Icon.tsx"],"sourcesContent":["import type { LucideIcon, LucideProps } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface IconProps extends Omit<LucideProps, 'size' | 'ref'> {\n /** Componente de ícone do lucide-react (ex.: `import { Search } from 'lucide-react'`). */\n icon: LucideIcon;\n /**\n * Texto para leitores de tela. Sem label o ícone é decorativo (`aria-hidden`).\n * Informe sempre que o ícone for o único conteúdo com significado.\n */\n label?: string;\n size?: IconSize | number;\n}\n\nconst SIZE_PX: Record<IconSize, number> = { xs: 12, sm: 16, md: 20, lg: 24, xl: 32 };\n\n/**\n * Wrapper padronizado para ícones lucide-react.\n * Ícones herdam a cor do texto (currentColor), o que mantém a paleta da marca.\n * Traço 1.75 acompanha o peso Leve da tipografia.\n */\nexport const Icon = ({\n icon: IconComponent,\n label,\n size = 'md',\n strokeWidth = 1.75,\n className,\n ...props\n}: IconProps) => {\n const px = typeof size === 'number' ? size : SIZE_PX[size];\n return (\n <IconComponent\n aria-hidden={label ? undefined : true}\n aria-label={label}\n className={cn('shrink-0', className)}\n focusable=\"false\"\n height={px}\n role={label ? 'img' : undefined}\n strokeWidth={strokeWidth}\n width={px}\n {...props}\n />\n );\n};\n\nIcon.displayName = 'Icon';\n"],"names":["SIZE_PX","Icon","IconComponent","label","size","strokeWidth","className","props","px","jsx","cn"],"mappings":";;AAgBA,MAAMA,IAAoC,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAA,GAOnEC,IAAO,CAAC;AAAA,EACnB,MAAMC;AAAA,EACN,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,aAAAC,IAAc;AAAA,EACd,WAAAC;AAAA,EACA,GAAGC;AACL,MAAiB;AACf,QAAMC,IAAK,OAAOJ,KAAS,WAAWA,IAAOJ,EAAQI,CAAI;AACzD,SACE,gBAAAK;AAAA,IAACP;AAAA,IAAA;AAAA,MACC,eAAaC,IAAQ,SAAY;AAAA,MACjC,cAAYA;AAAA,MACZ,WAAWO,EAAG,YAAYJ,CAAS;AAAA,MACnC,WAAU;AAAA,MACV,QAAQE;AAAA,MACR,MAAML,IAAQ,QAAQ;AAAA,MACtB,aAAAE;AAAA,MACA,OAAOG;AAAA,MACN,GAAGD;AAAA,IAAA;AAAA,EAAA;AAGV;AAEAN,EAAK,cAAc;"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ export type IconButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline' | 'inverse' | 'glass';
3
+ export interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
4
+ /** Nome acessível obrigatório: o botão não tem texto visível. */
5
+ 'aria-label': string;
6
+ children: React.ReactNode;
7
+ shape?: 'square' | 'circle';
8
+ size?: 'sm' | 'md' | 'lg';
9
+ variant?: IconButtonVariant;
10
+ }
11
+ /** Botão quadrado ou circular apenas com ícone. */
12
+ export declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,49 @@
1
+ import { jsx as i } from "react/jsx-runtime";
2
+ import c from "react";
3
+ import { cn as g } from "../../utils/cn.js";
4
+ import { focusRing as d, transitionColors as m, buttonReset as k } from "../../utils/styles.js";
5
+ const u = {
6
+ sm: "size-8 [&_svg]:size-4",
7
+ md: "size-10 [&_svg]:size-5",
8
+ lg: "size-12 [&_svg]:size-6"
9
+ }, f = {
10
+ primary: "bg-sbk-primary text-sbk-on-primary hover:bg-sbk-primary-hover",
11
+ secondary: "bg-sbk-secondary text-sbk-on-secondary hover:bg-sbk-secondary-hover",
12
+ ghost: "bg-transparent text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg",
13
+ outline: "border-sbk-line-strong bg-sbk-surface text-sbk-fg hover:bg-sbk-surface-hover",
14
+ inverse: "bg-transparent text-sbk-branco hover:bg-sbk-branco/10",
15
+ glass: "sbk-glass text-sbk-fg"
16
+ }, l = c.forwardRef(
17
+ ({
18
+ children: r,
19
+ shape: s = "square",
20
+ size: e = "md",
21
+ variant: o = "ghost",
22
+ className: t,
23
+ type: n = "button",
24
+ ...b
25
+ }, a) => /* @__PURE__ */ i(
26
+ "button",
27
+ {
28
+ ref: a,
29
+ className: g(
30
+ k,
31
+ "inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent disabled:cursor-not-allowed disabled:opacity-50",
32
+ s === "circle" ? "rounded-full" : "rounded-sbk-sm",
33
+ m,
34
+ d,
35
+ u[e],
36
+ f[o],
37
+ t
38
+ ),
39
+ type: n,
40
+ ...b,
41
+ children: r
42
+ }
43
+ )
44
+ );
45
+ l.displayName = "IconButton";
46
+ export {
47
+ l as IconButton
48
+ };
49
+ //# sourceMappingURL=IconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.js","sources":["../../../src/components/IconButton/IconButton.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { buttonReset, focusRing, transitionColors } from '../../utils/styles';\n\nexport type IconButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline' | 'inverse' | 'glass';\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Nome acessível obrigatório: o botão não tem texto visível. */\n 'aria-label': string;\n children: React.ReactNode;\n shape?: 'square' | 'circle';\n size?: 'sm' | 'md' | 'lg';\n variant?: IconButtonVariant;\n}\n\nconst SIZE_CLASS = {\n sm: 'size-8 [&_svg]:size-4',\n md: 'size-10 [&_svg]:size-5',\n lg: 'size-12 [&_svg]:size-6',\n} as const;\n\nconst VARIANT_CLASS: Record<IconButtonVariant, string> = {\n primary: 'bg-sbk-primary text-sbk-on-primary hover:bg-sbk-primary-hover',\n secondary: 'bg-sbk-secondary text-sbk-on-secondary hover:bg-sbk-secondary-hover',\n ghost: 'bg-transparent text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\n outline: 'border-sbk-line-strong bg-sbk-surface text-sbk-fg hover:bg-sbk-surface-hover',\n inverse: 'bg-transparent text-sbk-branco hover:bg-sbk-branco/10',\n glass: 'sbk-glass text-sbk-fg',\n};\n\n/** Botão quadrado ou circular apenas com ícone. */\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n children,\n shape = 'square',\n size = 'md',\n variant = 'ghost',\n className,\n type = 'button',\n ...props\n },\n ref,\n ) => (\n <button\n ref={ref}\n className={cn(\n buttonReset,\n 'inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent disabled:cursor-not-allowed disabled:opacity-50',\n shape === 'circle' ? 'rounded-full' : 'rounded-sbk-sm',\n transitionColors,\n focusRing,\n SIZE_CLASS[size],\n VARIANT_CLASS[variant],\n className,\n )}\n type={type}\n {...props}\n >\n {children}\n </button>\n ),\n);\n\nIconButton.displayName = 'IconButton';\n"],"names":["SIZE_CLASS","VARIANT_CLASS","IconButton","React","children","shape","size","variant","className","type","props","ref","jsx","cn","buttonReset","transitionColors","focusRing"],"mappings":";;;;AAeA,MAAMA,IAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAmD;AAAA,EACvD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT,GAGaC,IAAaC,EAAM;AAAA,EAC9B,CACE;AAAA,IACE,UAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,SAAAC,IAAU;AAAA,IACV,WAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,GAAGC;AAAA,EAAA,GAELC,MAEA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,WAAWE;AAAA,QACTC;AAAA,QACA;AAAA,QACAT,MAAU,WAAW,iBAAiB;AAAA,QACtCU;AAAA,QACAC;AAAA,QACAhB,EAAWM,CAAI;AAAA,QACfL,EAAcM,CAAO;AAAA,QACrBC;AAAA,MAAA;AAAA,MAEF,MAAAC;AAAA,MACC,GAAGC;AAAA,MAEH,UAAAN;AAAA,IAAA;AAAA,EAAA;AAGP;AAEAF,EAAW,cAAc;"}
@@ -1,11 +1,12 @@
1
1
  import React from 'react';
2
+ import { type FieldSize } from '../../utils/styles';
2
3
  export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
3
4
  error?: string;
4
5
  fullWidth?: boolean;
5
6
  helperText?: string;
6
- label?: string;
7
+ label?: React.ReactNode;
7
8
  leftIcon?: React.ReactNode;
8
9
  rightIcon?: React.ReactNode;
9
- size?: 'sm' | 'md' | 'lg';
10
+ size?: FieldSize;
10
11
  }
11
12
  export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;