@sbkbs/ui 1.0.4 → 1.0.6
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.
- package/README.md +115 -115
- package/dist/components/Avatar/Avatar.d.ts +11 -0
- package/dist/components/Footer/Footer.d.ts +2 -2
- package/dist/components/Footer/Footer.js +104 -39
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/Header/Header.d.ts +11 -5
- package/dist/components/Header/Header.js +158 -98
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +12 -0
- package/dist/components/Spinner/Spinner.d.ts +7 -0
- package/dist/components/Stepper/Stepper.js +71 -46
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/oficios-ui.css +1 -0
- package/dist/oficios-ui.umd.cjs +1 -1
- package/dist/oficios-ui.umd.cjs.map +1 -1
- package/dist/sbk-icon.png +0 -0
- package/dist/theme.css +2 -0
- package/dist/utils/cn.js +2 -2
- package/package.json +21 -16
- package/dist/node_modules/clsx/dist/clsx.js +0 -17
- package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -2925
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
- package/dist/ui.css +0 -1
|
@@ -1,114 +1,174 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { jsxs as t, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useState as y, useEffect as N } from "react";
|
|
3
|
+
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,
|
|
8
88
|
subtitle: d,
|
|
9
|
-
theme:
|
|
10
|
-
onLogoClick:
|
|
11
|
-
|
|
12
|
-
|
|
89
|
+
theme: a,
|
|
90
|
+
onLogoClick: r,
|
|
91
|
+
onMenuClick: b,
|
|
92
|
+
rightContent: v,
|
|
93
|
+
showMenuIcon: x = !0,
|
|
94
|
+
userInitials: c,
|
|
95
|
+
className: g = ""
|
|
13
96
|
}) => {
|
|
14
|
-
const [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}, []), x(() => {
|
|
19
|
-
if (s) {
|
|
20
|
-
c(s);
|
|
97
|
+
const [k, m] = y(() => a ?? p()), h = k === "dark" && f ? f : n;
|
|
98
|
+
N(() => {
|
|
99
|
+
if (a) {
|
|
100
|
+
m(a);
|
|
21
101
|
return;
|
|
22
102
|
}
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}), () => n.disconnect();
|
|
31
|
-
}, [s]);
|
|
32
|
-
const N = () => e == null ? void 0 : e(), E = (t) => {
|
|
33
|
-
t.key === "Enter" && (e == null || e());
|
|
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());
|
|
34
110
|
};
|
|
35
|
-
return /* @__PURE__ */
|
|
111
|
+
return /* @__PURE__ */ t(
|
|
36
112
|
"header",
|
|
37
113
|
{
|
|
38
|
-
className:
|
|
114
|
+
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
|
|
120
|
+
),
|
|
39
121
|
children: [
|
|
40
|
-
/* @__PURE__ */
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/* @__PURE__ */ a(
|
|
52
|
-
"div",
|
|
53
|
-
{
|
|
54
|
-
className: "flex cursor-pointer items-center gap-3 transition-opacity duration-200 ease-in-out hover:opacity-80",
|
|
55
|
-
onClick: e ? N : void 0,
|
|
56
|
-
onKeyDown: e ? E : void 0,
|
|
57
|
-
role: e ? "button" : void 0,
|
|
58
|
-
tabIndex: e ? 0 : void 0,
|
|
59
|
-
children: [
|
|
60
|
-
f && /* @__PURE__ */ a("div", { className: "flex h-16 w-16 shrink-0 items-center justify-center", children: [
|
|
61
|
-
/* @__PURE__ */ r(
|
|
62
|
-
"img",
|
|
63
|
-
{
|
|
64
|
-
alt: p,
|
|
65
|
-
className: "h-full w-full object-contain",
|
|
66
|
-
onError: (t) => {
|
|
67
|
-
t.target.style.display = "none";
|
|
68
|
-
const n = t.target.nextElementSibling;
|
|
69
|
-
n && (n.style.display = "block");
|
|
70
|
-
},
|
|
71
|
-
src: f
|
|
72
|
-
}
|
|
73
|
-
),
|
|
74
|
-
/* @__PURE__ */ a(
|
|
75
|
-
"svg",
|
|
76
|
-
{
|
|
77
|
-
className: "hidden h-full w-full",
|
|
78
|
-
fill: "none",
|
|
79
|
-
stroke: "currentColor",
|
|
80
|
-
strokeWidth: "2",
|
|
81
|
-
viewBox: "0 0 24 24",
|
|
82
|
-
children: [
|
|
83
|
-
/* @__PURE__ */ r("path", { d: "M12 2L2 7l10 5 10-5-10-5z" }),
|
|
84
|
-
/* @__PURE__ */ r("path", { d: "M2 17l10 5 10-5M2 12l10 5 10-5" })
|
|
85
|
-
]
|
|
86
|
-
}
|
|
87
|
-
)
|
|
88
|
-
] }),
|
|
89
|
-
(l || d) && /* @__PURE__ */ a("div", { className: "flex flex-col gap-1", children: [
|
|
90
|
-
l && /* @__PURE__ */ r(
|
|
91
|
-
"h1",
|
|
92
|
-
{
|
|
93
|
-
className: "m-0 inline-flex items-baseline text-[1.375rem] font-bold leading-[1.2] tracking-[0.05em] text-[var(--md-on-surface)] max-md:text-xl",
|
|
94
|
-
style: { fontFamily: "var(--font-logo)" },
|
|
95
|
-
children: l
|
|
96
|
-
}
|
|
97
|
-
),
|
|
98
|
-
d && /* @__PURE__ */ r("p", { className: "m-0 text-[0.8125rem] font-normal text-[var(--md-on-surface-variant)] max-md:text-xs", children: d })
|
|
99
|
-
] })
|
|
100
|
-
]
|
|
101
|
-
}
|
|
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",
|
|
126
|
+
{
|
|
127
|
+
onClick: r,
|
|
128
|
+
onKeyDown: r ? w : void 0,
|
|
129
|
+
role: r ? "button" : void 0,
|
|
130
|
+
className: o(
|
|
131
|
+
"flex items-center gap-2.5 select-none",
|
|
132
|
+
r ? "cursor-pointer" : "cursor-default"
|
|
102
133
|
),
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
+
]
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
] }),
|
|
155
|
+
/* @__PURE__ */ t("div", { className: "flex items-center gap-2 shrink-0", children: [
|
|
156
|
+
v,
|
|
157
|
+
c && /* @__PURE__ */ e(
|
|
158
|
+
"div",
|
|
159
|
+
{
|
|
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
|
|
163
|
+
}
|
|
164
|
+
)
|
|
165
|
+
] })
|
|
107
166
|
]
|
|
108
167
|
}
|
|
109
168
|
);
|
|
110
169
|
};
|
|
170
|
+
j.displayName = "Header";
|
|
111
171
|
export {
|
|
112
|
-
|
|
172
|
+
j as Header
|
|
113
173
|
};
|
|
114
174
|
//# 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 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 da imagem do logo (tema escuro). Se não informado, usa logoSrc. */\n logoDarkSrc?: string;\n /** URL da imagem do logo (tema claro) */\n logoSrc?: string;\n /** Callback ao clicar na área do logo/título */\n onLogoClick?: () => void;\n /** Conteúdo da área direita (ex.: seletor de idioma, toggle tema, menu usuário) */\n rightContent?: React.ReactNode;\n /** Subtítulo abaixo do título */\n subtitle?: React.ReactNode;\n /** Tema opcional para escolher o logo correto sem depender do ThemeProvider do UI */\n theme?: Theme;\n /** Título exibido ao lado do logo (ex.: \"OFÍCIO.IA\") */\n title?: React.ReactNode;\n}\n\nconst detectTheme = (): Theme => {\n if (typeof document === 'undefined') {\n return 'light';\n }\n\n return document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';\n};\n\nexport const Header: React.FC<HeaderProps> = ({\n logoSrc,\n logoDarkSrc,\n logoAlt = 'Logo',\n title,\n subtitle,\n theme,\n onLogoClick,\n rightContent,\n className = '',\n}) => {\n const [isScrolled, setIsScrolled] = useState(false);\n const [resolvedTheme, setResolvedTheme] = useState<Theme>(() => theme ?? detectTheme());\n\n const logoSrcResolved = resolvedTheme === 'dark' && logoDarkSrc ? logoDarkSrc : logoSrc;\n\n useEffect(() => {\n const handleScroll = () => setIsScrolled(window.scrollY > 10);\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, []);\n\n useEffect(() => {\n if (theme) {\n setResolvedTheme(theme);\n return;\n }\n\n const syncTheme = () => setResolvedTheme(detectTheme());\n syncTheme();\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(syncTheme);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n return () => observer.disconnect();\n }, [theme]);\n\n const handleClick = () => onLogoClick?.();\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onLogoClick?.();\n }\n };\n\n return (\n <header\n className={['fixed inset-x-0 top-0 z-[1000] w-full backdrop-blur-[12px]', className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className=\"h-0.5 w-full bg-[var(--md-primary)]\" />\n <div\n className=\"flex items-center justify-between px-6 py-2 shadow-[var(--shadow-sm)] max-md:flex-col max-md:gap-3 max-md:px-4 max-md:py-3\"\n style={{\n color: 'var(--md-on-surface)',\n background: `color-mix(in srgb, var(--md-surface) ${\n isScrolled ? '14%' : '18%'\n }, transparent)`,\n borderBottom: `1px solid color-mix(in srgb, var(--md-outline-variant) ${\n isScrolled ? '22%' : '30%'\n }, transparent)`,\n }}\n >\n <div\n className=\"flex cursor-pointer items-center gap-3 transition-opacity duration-200 ease-in-out hover:opacity-80\"\n onClick={onLogoClick ? handleClick : undefined}\n onKeyDown={onLogoClick ? handleKeyDown : undefined}\n role={onLogoClick ? 'button' : undefined}\n tabIndex={onLogoClick ? 0 : undefined}\n >\n {logoSrcResolved && (\n <div className=\"flex h-16 w-16 shrink-0 items-center justify-center\">\n <img\n alt={logoAlt}\n className=\"h-full w-full object-contain\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n const next = (e.target as HTMLElement).nextElementSibling as HTMLElement;\n if (next) {\n next.style.display = 'block';\n }\n }}\n src={logoSrcResolved}\n />\n <svg\n className=\"hidden h-full w-full\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5M2 12l10 5 10-5\" />\n </svg>\n </div>\n )}\n {(title || subtitle) && (\n <div className=\"flex flex-col gap-1\">\n {title && (\n <h1\n className=\"m-0 inline-flex items-baseline text-[1.375rem] font-bold leading-[1.2] tracking-[0.05em] text-[var(--md-on-surface)] max-md:text-xl\"\n style={{ fontFamily: 'var(--font-logo)' }}\n >\n {title}\n </h1>\n )}\n {subtitle && (\n <p className=\"m-0 text-[0.8125rem] font-normal text-[var(--md-on-surface-variant)] max-md:text-xs\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n </div>\n {rightContent && (\n <div className=\"flex shrink-0 items-center gap-3 max-md:w-full max-md:flex-wrap max-md:justify-between\">\n {rightContent}\n </div>\n )}\n </div>\n </header>\n );\n};\n"],"names":["detectTheme","Header","logoSrc","logoDarkSrc","logoAlt","title","subtitle","theme","onLogoClick","rightContent","className","isScrolled","setIsScrolled","useState","resolvedTheme","setResolvedTheme","logoSrcResolved","useEffect","handleScroll","syncTheme","observer","handleClick","handleKeyDown","e","jsxs","jsx","next"],"mappings":"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"}
|
|
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;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
export interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** Label descritivo para leitores de tela. */
|
|
4
|
+
label?: string;
|
|
5
|
+
/** Valor atual (0–100). */
|
|
6
|
+
value: number;
|
|
7
|
+
size?: 'sm' | 'md' | 'lg';
|
|
8
|
+
tone?: 'primary' | 'success' | 'warning' | 'error' | 'info';
|
|
9
|
+
/** Exibe o percentual como texto ao lado da barra. */
|
|
10
|
+
showValue?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const ProgressBar: React.FC<ProgressBarProps>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
export interface SpinnerProps extends React.SVGAttributes<SVGSVGElement> {
|
|
3
|
+
/** Texto anunciado para leitores de tela. Padrão: 'Carregando...' */
|
|
4
|
+
label?: string;
|
|
5
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
6
|
+
}
|
|
7
|
+
export declare const Spinner: React.FC<SpinnerProps>;
|
|
@@ -1,46 +1,57 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { cn as
|
|
3
|
-
const
|
|
1
|
+
import { jsx as t, jsxs as o } from "react/jsx-runtime";
|
|
2
|
+
import { cn as r } from "../../utils/cn.js";
|
|
3
|
+
const u = ({
|
|
4
4
|
items: n,
|
|
5
|
-
currentStep:
|
|
6
|
-
orientation:
|
|
7
|
-
className:
|
|
8
|
-
...
|
|
5
|
+
currentStep: c,
|
|
6
|
+
orientation: v = "horizontal",
|
|
7
|
+
className: p,
|
|
8
|
+
...x
|
|
9
9
|
}) => {
|
|
10
|
-
const s = n.findIndex((e) => e.id ===
|
|
11
|
-
return /* @__PURE__ */
|
|
10
|
+
const s = n.findIndex((e) => e.id === c), l = v === "horizontal", f = (e) => e < s ? "completed" : e === s ? "active" : "pending", d = (e) => e ? "bg-[var(--md-primary)]" : "bg-[var(--md-outline-variant)]";
|
|
11
|
+
return /* @__PURE__ */ t(
|
|
12
12
|
"div",
|
|
13
13
|
{
|
|
14
14
|
"aria-label": "Progresso",
|
|
15
|
-
className:
|
|
15
|
+
className: r(l ? "flex items-start" : "flex flex-col", p),
|
|
16
16
|
role: "list",
|
|
17
|
-
...
|
|
18
|
-
children: n.map((e,
|
|
19
|
-
const
|
|
20
|
-
return /* @__PURE__ */
|
|
17
|
+
...x,
|
|
18
|
+
children: n.map((e, i) => {
|
|
19
|
+
const a = f(i), m = i === n.length - 1;
|
|
20
|
+
return /* @__PURE__ */ o(
|
|
21
21
|
"div",
|
|
22
22
|
{
|
|
23
|
-
className:
|
|
23
|
+
className: r("flex", l ? "flex-1 flex-col items-center" : "gap-4"),
|
|
24
24
|
role: "listitem",
|
|
25
25
|
children: [
|
|
26
|
-
/* @__PURE__ */
|
|
26
|
+
/* @__PURE__ */ o(
|
|
27
27
|
"div",
|
|
28
28
|
{
|
|
29
|
-
className:
|
|
30
|
-
|
|
29
|
+
className: r(
|
|
30
|
+
l ? "flex w-full items-center" : "flex flex-col items-center"
|
|
31
31
|
),
|
|
32
32
|
children: [
|
|
33
|
-
/*
|
|
33
|
+
l && /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */
|
|
34
|
+
(i === 0 ? /* @__PURE__ */ t("div", { className: "flex-1", "aria-hidden": "true" }) : /* @__PURE__ */ t(
|
|
34
35
|
"div",
|
|
35
36
|
{
|
|
36
|
-
"aria-
|
|
37
|
-
className:
|
|
37
|
+
"aria-hidden": "true",
|
|
38
|
+
className: r(
|
|
39
|
+
"h-0.5 flex-1 transition",
|
|
40
|
+
d(i <= s)
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
)),
|
|
44
|
+
/* @__PURE__ */ t(
|
|
45
|
+
"div",
|
|
46
|
+
{
|
|
47
|
+
"aria-current": a === "active" ? "step" : void 0,
|
|
48
|
+
className: r(
|
|
38
49
|
"relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition",
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
a === "completed" && "border-[var(--md-primary)] bg-[var(--md-primary)] text-[var(--md-on-primary)]",
|
|
51
|
+
a === "active" && "border-[var(--md-primary)] bg-[var(--md-surface)] text-[var(--md-primary)]",
|
|
52
|
+
a === "pending" && "border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--text-muted)]"
|
|
42
53
|
),
|
|
43
|
-
children:
|
|
54
|
+
children: a === "completed" ? /* @__PURE__ */ t(
|
|
44
55
|
"svg",
|
|
45
56
|
{
|
|
46
57
|
className: "h-4 w-4",
|
|
@@ -48,39 +59,53 @@ const f = ({
|
|
|
48
59
|
stroke: "currentColor",
|
|
49
60
|
strokeWidth: "2.5",
|
|
50
61
|
viewBox: "0 0 24 24",
|
|
51
|
-
children: /* @__PURE__ */
|
|
62
|
+
children: /* @__PURE__ */ t("path", { d: "M20 6 9 17l-5-5", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
52
63
|
}
|
|
53
|
-
) :
|
|
64
|
+
) : i + 1
|
|
54
65
|
}
|
|
55
66
|
),
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
{
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
l ? (
|
|
68
|
+
/* Conector direito: linha colorida se não for último, espaçador se for */
|
|
69
|
+
m ? /* @__PURE__ */ t("div", { className: "flex-1", "aria-hidden": "true" }) : /* @__PURE__ */ t(
|
|
70
|
+
"div",
|
|
71
|
+
{
|
|
72
|
+
"aria-hidden": "true",
|
|
73
|
+
className: r(
|
|
74
|
+
"h-0.5 flex-1 transition",
|
|
75
|
+
d(i < s)
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
) : (
|
|
80
|
+
/* Conector vertical (para orientação vertical) */
|
|
81
|
+
!m && /* @__PURE__ */ t(
|
|
82
|
+
"div",
|
|
83
|
+
{
|
|
84
|
+
"aria-hidden": "true",
|
|
85
|
+
className: r(
|
|
86
|
+
"my-1 ml-[1.0625rem] w-0.5 flex-1 transition",
|
|
87
|
+
d(i < s)
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
)
|
|
66
91
|
)
|
|
67
92
|
]
|
|
68
93
|
}
|
|
69
94
|
),
|
|
70
|
-
/* @__PURE__ */
|
|
71
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ o("div", { className: r("mt-2 text-center", !l && "mt-0 pb-6 text-left"), children: [
|
|
96
|
+
/* @__PURE__ */ t(
|
|
72
97
|
"p",
|
|
73
98
|
{
|
|
74
|
-
className:
|
|
99
|
+
className: r(
|
|
75
100
|
"text-sm font-medium leading-tight",
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
101
|
+
a === "active" && "text-[var(--md-primary)]",
|
|
102
|
+
a === "completed" && "text-[var(--text-primary)]",
|
|
103
|
+
a === "pending" && "text-[var(--text-muted)]"
|
|
79
104
|
),
|
|
80
105
|
children: e.label
|
|
81
106
|
}
|
|
82
107
|
),
|
|
83
|
-
e.description && /* @__PURE__ */
|
|
108
|
+
e.description && /* @__PURE__ */ t("p", { className: "mt-0.5 text-xs text-[var(--text-muted)]", children: e.description })
|
|
84
109
|
] })
|
|
85
110
|
]
|
|
86
111
|
},
|
|
@@ -90,8 +115,8 @@ const f = ({
|
|
|
90
115
|
}
|
|
91
116
|
);
|
|
92
117
|
};
|
|
93
|
-
|
|
118
|
+
u.displayName = "Stepper";
|
|
94
119
|
export {
|
|
95
|
-
|
|
120
|
+
u as Stepper
|
|
96
121
|
};
|
|
97
122
|
//# sourceMappingURL=Stepper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface StepperItem {\n description?: string;\n id: string;\n label: string;\n}\n\nexport type StepStatus = 'completed' | 'active' | 'pending';\n\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\n currentStep: string;\n items: StepperItem[];\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport const Stepper: React.FC<StepperProps> = ({\n items,\n currentStep,\n orientation = 'horizontal',\n className,\n ...props\n}) => {\n const currentIndex = items.findIndex((item) => item.id === currentStep);\n\n const getStatus = (index: number): StepStatus => {\n if (index < currentIndex) return 'completed';\n if (index === currentIndex) return 'active';\n return 'pending';\n };\n\n const
|
|
1
|
+
{"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface StepperItem {\n description?: string;\n id: string;\n label: string;\n}\n\nexport type StepStatus = 'completed' | 'active' | 'pending';\n\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\n currentStep: string;\n items: StepperItem[];\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport const Stepper: React.FC<StepperProps> = ({\n items,\n currentStep,\n orientation = 'horizontal',\n className,\n ...props\n}) => {\n const currentIndex = items.findIndex((item) => item.id === currentStep);\n const isHorizontal = orientation === 'horizontal';\n\n const getStatus = (index: number): StepStatus => {\n if (index < currentIndex) return 'completed';\n if (index === currentIndex) return 'active';\n return 'pending';\n };\n\n const connectorColor = (isActive: boolean) =>\n isActive ? 'bg-[var(--md-primary)]' : 'bg-[var(--md-outline-variant)]';\n\n return (\n <div\n aria-label=\"Progresso\"\n className={cn(isHorizontal ? 'flex items-start' : 'flex flex-col', className)}\n role=\"list\"\n {...props}\n >\n {items.map((item, index) => {\n const status = getStatus(index);\n const isLast = index === items.length - 1;\n\n return (\n <div\n key={item.id}\n className={cn('flex', isHorizontal ? 'flex-1 flex-col items-center' : 'gap-4')}\n role=\"listitem\"\n >\n {/* ── Indicador + conectores ─────────────────── */}\n <div\n className={cn(\n isHorizontal ? 'flex w-full items-center' : 'flex flex-col items-center',\n )}\n >\n {isHorizontal && (\n /* Conector esquerdo: espaçador no 1º item, linha colorida nos demais */\n index === 0 ? (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n ) : (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'h-0.5 flex-1 transition',\n connectorColor(index <= currentIndex),\n )}\n />\n )\n )}\n\n {/* Círculo */}\n <div\n aria-current={status === 'active' ? 'step' : undefined}\n className={cn(\n 'relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold transition',\n status === 'completed' &&\n 'border-[var(--md-primary)] bg-[var(--md-primary)] text-[var(--md-on-primary)]',\n status === 'active' &&\n 'border-[var(--md-primary)] bg-[var(--md-surface)] text-[var(--md-primary)]',\n status === 'pending' &&\n 'border-[var(--md-outline-variant)] bg-[var(--md-surface)] text-[var(--text-muted)]',\n )}\n >\n {status === 'completed' ? (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M20 6 9 17l-5-5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ) : (\n index + 1\n )}\n </div>\n\n {isHorizontal ? (\n /* Conector direito: linha colorida se não for último, espaçador se for */\n isLast ? (\n <div className=\"flex-1\" aria-hidden=\"true\" />\n ) : (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'h-0.5 flex-1 transition',\n connectorColor(index < currentIndex),\n )}\n />\n )\n ) : (\n /* Conector vertical (para orientação vertical) */\n !isLast && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'my-1 ml-[1.0625rem] w-0.5 flex-1 transition',\n connectorColor(index < currentIndex),\n )}\n />\n )\n )}\n </div>\n\n {/* ── Label + descrição ──────────────────────── */}\n <div className={cn('mt-2 text-center', !isHorizontal && 'mt-0 pb-6 text-left')}>\n <p\n className={cn(\n 'text-sm font-medium leading-tight',\n status === 'active' && 'text-[var(--md-primary)]',\n status === 'completed' && 'text-[var(--text-primary)]',\n status === 'pending' && 'text-[var(--text-muted)]',\n )}\n >\n {item.label}\n </p>\n {item.description && (\n <p className=\"mt-0.5 text-xs text-[var(--text-muted)]\">{item.description}</p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nStepper.displayName = 'Stepper';\n"],"names":["Stepper","items","currentStep","orientation","className","props","currentIndex","item","isHorizontal","getStatus","index","connectorColor","isActive","jsx","cn","status","isLast","jsxs"],"mappings":"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"}
|