@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.
- package/CHANGELOG.md +57 -0
- package/MIGRATION.md +96 -0
- package/README.md +221 -115
- package/dist/assets/favicon/apple-touch-icon.png +0 -0
- package/dist/assets/favicon/favicon-96x96.png +0 -0
- package/dist/assets/favicon/favicon.ico +0 -0
- package/dist/assets/favicon/favicon.svg +1 -0
- package/dist/assets/favicon/site.webmanifest +21 -0
- package/dist/assets/favicon/web-app-manifest-192x192.png +0 -0
- package/dist/assets/favicon/web-app-manifest-512x512.png +0 -0
- package/dist/base.css +38 -0
- package/dist/components/Accordion/Accordion.d.ts +13 -1
- package/dist/components/Accordion/Accordion.js +100 -52
- package/dist/components/Accordion/Accordion.js.map +1 -1
- package/dist/components/Alert/Alert.d.ts +17 -4
- package/dist/components/Alert/Alert.js +64 -20
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Avatar/Avatar.d.ts +12 -6
- package/dist/components/Avatar/Avatar.js +66 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Badge/Badge.d.ts +11 -2
- package/dist/components/Badge/Badge.js +42 -30
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +5 -2
- package/dist/components/Breadcrumb/Breadcrumb.js +23 -16
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/Button/Button.d.ts +10 -8
- package/dist/components/Button/Button.js +73 -114
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Card/Card.d.ts +33 -3
- package/dist/components/Card/Card.js +91 -30
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +4 -1
- package/dist/components/Checkbox/Checkbox.js +32 -31
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Chip/Chip.d.ts +7 -1
- package/dist/components/Chip/Chip.js +19 -9
- package/dist/components/Chip/Chip.js.map +1 -1
- package/dist/components/Combobox/Combobox.d.ts +10 -2
- package/dist/components/Combobox/Combobox.js +146 -133
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Divider/Divider.d.ts +7 -1
- package/dist/components/Divider/Divider.js +28 -12
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +33 -0
- package/dist/components/DropdownMenu/DropdownMenu.js +147 -0
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/components/EmptyState/EmptyState.d.ts +7 -1
- package/dist/components/EmptyState/EmptyState.js +28 -19
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/Field/Field.d.ts +21 -0
- package/dist/components/Field/Field.js +35 -0
- package/dist/components/Field/Field.js.map +1 -0
- package/dist/components/FileUpload/FileUpload.d.ts +9 -2
- package/dist/components/FileUpload/FileUpload.js +128 -102
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/Footer/Footer.d.ts +19 -6
- package/dist/components/Footer/Footer.js +47 -115
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/GlassPanel/GlassPanel.d.ts +18 -0
- package/dist/components/GlassPanel/GlassPanel.js +39 -0
- package/dist/components/GlassPanel/GlassPanel.js.map +1 -0
- package/dist/components/Header/Header.d.ts +25 -14
- package/dist/components/Header/Header.js +88 -148
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/Highlight/Highlight.d.ts +13 -0
- package/dist/components/Highlight/Highlight.js +18 -0
- package/dist/components/Highlight/Highlight.js.map +1 -0
- package/dist/components/Icon/Icon.d.ts +21 -0
- package/dist/components/Icon/Icon.js +31 -0
- package/dist/components/Icon/Icon.js.map +1 -0
- package/dist/components/IconButton/IconButton.d.ts +12 -0
- package/dist/components/IconButton/IconButton.js +49 -0
- package/dist/components/IconButton/IconButton.js.map +1 -0
- package/dist/components/Input/Input.d.ts +3 -2
- package/dist/components/Input/Input.js +51 -69
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Layout/Layout.d.ts +2 -0
- package/dist/components/Layout/Layout.js +24 -18
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Logo/Logo.d.ts +27 -0
- package/dist/components/Logo/Logo.js +107 -0
- package/dist/components/Logo/Logo.js.map +1 -0
- package/dist/components/MiniCard/MiniCard.d.ts +21 -0
- package/dist/components/MiniCard/MiniCard.js +90 -0
- package/dist/components/MiniCard/MiniCard.js.map +1 -0
- package/dist/components/Modal/Modal.d.ts +16 -3
- package/dist/components/Modal/Modal.js +124 -93
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Navigation/Navigation.d.ts +1 -0
- package/dist/components/Navigation/Navigation.js +14 -14
- package/dist/components/Navigation/Navigation.js.map +1 -1
- package/dist/components/NumberInput/NumberInput.d.ts +5 -2
- package/dist/components/NumberInput/NumberInput.js +98 -128
- package/dist/components/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/PageHeader/PageHeader.d.ts +8 -1
- package/dist/components/PageHeader/PageHeader.js +26 -25
- package/dist/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/components/Pagination/Pagination.d.ts +15 -2
- package/dist/components/Pagination/Pagination.js +68 -34
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Paragraph/Paragraph.d.ts +8 -2
- package/dist/components/Paragraph/Paragraph.js +39 -36
- package/dist/components/Paragraph/Paragraph.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +12 -1
- package/dist/components/Popover/Popover.js +49 -37
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +12 -6
- package/dist/components/ProgressBar/ProgressBar.js +71 -0
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -0
- package/dist/components/Radio/Radio.d.ts +2 -1
- package/dist/components/Radio/Radio.js +27 -31
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.d.ts +6 -1
- package/dist/components/SectionHeader/SectionHeader.js +14 -12
- package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/Select/Select.d.ts +6 -2
- package/dist/components/Select/Select.js +47 -35
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/SideNav/SideNav.d.ts +55 -0
- package/dist/components/SideNav/SideNav.js +141 -0
- package/dist/components/SideNav/SideNav.js.map +1 -0
- package/dist/components/Skeleton/Skeleton.d.ts +12 -1
- package/dist/components/Skeleton/Skeleton.js +33 -18
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +11 -3
- package/dist/components/Spinner/Spinner.js +57 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Stepper/Stepper.d.ts +1 -1
- package/dist/components/Stepper/Stepper.js +41 -53
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/Subtitle/Subtitle.d.ts +9 -3
- package/dist/components/Subtitle/Subtitle.js +29 -35
- package/dist/components/Subtitle/Subtitle.js.map +1 -1
- package/dist/components/Switch/Switch.d.ts +2 -1
- package/dist/components/Switch/Switch.js +45 -33
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Table/Table.d.ts +19 -1
- package/dist/components/Table/Table.js +48 -11
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +16 -2
- package/dist/components/Tabs/Tabs.js +80 -44
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tag/Tag.d.ts +8 -1
- package/dist/components/Tag/Tag.js +27 -12
- package/dist/components/Tag/Tag.js.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts +3 -1
- package/dist/components/Textarea/Textarea.js +36 -40
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Title/Title.d.ts +9 -3
- package/dist/components/Title/Title.js +42 -42
- package/dist/components/Title/Title.js.map +1 -1
- package/dist/components/Toast/Toast.d.ts +39 -11
- package/dist/components/Toast/Toast.js +130 -76
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +12 -2
- package/dist/components/Tooltip/Tooltip.js +50 -32
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Typography/weight.d.ts +9 -0
- package/dist/components/Typography/weight.js +5 -0
- package/dist/components/Typography/weight.js.map +1 -0
- package/dist/fonts.css +8 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +55 -43
- package/dist/index.js +118 -83
- package/dist/index.js.map +1 -1
- package/dist/reset.css +9 -0
- package/dist/styles.css +1 -0
- package/dist/tailwind.css +153 -0
- package/dist/theme/ThemeProvider.d.ts +21 -3
- package/dist/theme/ThemeProvider.js +57 -18
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/tokens.d.ts +43 -0
- package/dist/theme/tokens.js +39 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme.css +327 -294
- package/dist/tokens.css +327 -0
- package/dist/utils/cn.d.ts +2 -2
- package/dist/utils/cn.js +19 -4
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/styles.d.ts +37 -0
- package/dist/utils/styles.js +35 -0
- package/dist/utils/styles.js.map +1 -0
- package/package.json +140 -117
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -7
- package/dist/components/Alert/Alert.stories.d.ts +0 -8
- package/dist/components/Badge/Badge.stories.d.ts +0 -8
- package/dist/components/Breadcrumb/Breadcrumb.stories.d.ts +0 -8
- package/dist/components/Button/Button.stories.d.ts +0 -7
- package/dist/components/Card/Card.stories.d.ts +0 -8
- package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -7
- package/dist/components/Combobox/Combobox.stories.d.ts +0 -9
- package/dist/components/Feedback/Feedback.stories.d.ts +0 -5
- package/dist/components/FileUpload/FileUpload.stories.d.ts +0 -10
- package/dist/components/Input/Input.stories.d.ts +0 -9
- package/dist/components/Modal/Modal.stories.d.ts +0 -8
- package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -8
- package/dist/components/Pagination/Pagination.stories.d.ts +0 -8
- package/dist/components/Radio/Radio.stories.d.ts +0 -7
- package/dist/components/Select/Select.stories.d.ts +0 -8
- package/dist/components/Stepper/Stepper.stories.d.ts +0 -8
- package/dist/components/Switch/Switch.stories.d.ts +0 -8
- package/dist/components/Tabs/Tabs.stories.d.ts +0 -8
- package/dist/components/Textarea/Textarea.stories.d.ts +0 -7
- package/dist/components/Toast/Toast.stories.d.ts +0 -8
- package/dist/oficios-ui.css +0 -1
- package/dist/oficios-ui.umd.cjs +0 -2
- package/dist/oficios-ui.umd.cjs.map +0 -1
- package/dist/sbk-icon.png +0 -0
|
@@ -1,56 +1,104 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
1
|
+
import { jsx as s, jsxs as b } from "react/jsx-runtime";
|
|
2
|
+
import { useState as w, useRef as v, useId as N } from "react";
|
|
3
|
+
import { ChevronDown as A } from "lucide-react";
|
|
4
|
+
import { cn as n } from "../../utils/cn.js";
|
|
5
|
+
import { transitionColors as I, buttonReset as D } from "../../utils/styles.js";
|
|
6
|
+
const $ = ({
|
|
7
|
+
items: f,
|
|
8
|
+
defaultOpenId: i,
|
|
9
|
+
defaultOpenIds: g,
|
|
10
|
+
type: m = "single",
|
|
11
|
+
variant: d = "separated",
|
|
12
|
+
className: p
|
|
13
|
+
}) => {
|
|
14
|
+
const [h, k] = w(
|
|
15
|
+
g ?? (i ? [i] : [])
|
|
16
|
+
), a = v(null), l = N(), x = (e) => k(
|
|
17
|
+
(o) => o.includes(e) ? o.filter((t) => t !== e) : m === "single" ? [e] : [...o, e]
|
|
18
|
+
), y = (e) => {
|
|
19
|
+
var c, u;
|
|
20
|
+
const o = Array.from(
|
|
21
|
+
((c = a.current) == null ? void 0 : c.querySelectorAll(
|
|
22
|
+
"[data-accordion-trigger]:not(:disabled)"
|
|
23
|
+
)) ?? []
|
|
24
|
+
), t = o.indexOf(e.currentTarget), r = {
|
|
25
|
+
ArrowDown: (t + 1) % o.length,
|
|
26
|
+
ArrowUp: (t - 1 + o.length) % o.length,
|
|
27
|
+
Home: 0,
|
|
28
|
+
End: o.length - 1
|
|
29
|
+
};
|
|
30
|
+
e.key in r && (e.preventDefault(), (u = o[r[e.key]]) == null || u.focus());
|
|
31
|
+
};
|
|
32
|
+
return /* @__PURE__ */ s(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
ref: a,
|
|
36
|
+
className: n(
|
|
37
|
+
d === "separated" ? "grid gap-2" : "divide-y divide-sbk-line overflow-hidden rounded-sbk-sm border border-sbk-line",
|
|
38
|
+
p
|
|
39
|
+
),
|
|
40
|
+
children: f.map((e) => {
|
|
41
|
+
const o = h.includes(e.id), t = `${l}-trigger-${e.id}`, r = `${l}-panel-${e.id}`;
|
|
42
|
+
return /* @__PURE__ */ b(
|
|
43
|
+
"div",
|
|
44
|
+
{
|
|
45
|
+
className: n(
|
|
46
|
+
d === "separated" && "overflow-hidden rounded-sbk-sm border border-sbk-line",
|
|
47
|
+
"bg-sbk-surface"
|
|
48
|
+
),
|
|
49
|
+
children: [
|
|
50
|
+
/* @__PURE__ */ s("h3", { className: "m-0", children: /* @__PURE__ */ b(
|
|
51
|
+
"button",
|
|
52
|
+
{
|
|
53
|
+
"aria-controls": r,
|
|
54
|
+
"aria-expanded": o,
|
|
55
|
+
className: n(
|
|
56
|
+
D,
|
|
57
|
+
"flex w-full cursor-pointer items-center justify-between gap-3 px-4 py-3 text-left text-sm font-semibold text-sbk-fg hover:bg-sbk-surface-hover disabled:cursor-not-allowed disabled:opacity-50",
|
|
58
|
+
"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid",
|
|
59
|
+
I
|
|
60
|
+
),
|
|
61
|
+
"data-accordion-trigger": "",
|
|
62
|
+
disabled: e.disabled,
|
|
63
|
+
id: t,
|
|
64
|
+
onClick: () => x(e.id),
|
|
65
|
+
onKeyDown: y,
|
|
66
|
+
type: "button",
|
|
67
|
+
children: [
|
|
68
|
+
e.title,
|
|
69
|
+
/* @__PURE__ */ s(
|
|
70
|
+
A,
|
|
71
|
+
{
|
|
72
|
+
"aria-hidden": "true",
|
|
73
|
+
className: n(
|
|
74
|
+
"size-4 shrink-0 text-sbk-fg-muted transition-transform duration-200 motion-reduce:transition-none",
|
|
75
|
+
o && "rotate-180"
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
) }),
|
|
82
|
+
o && /* @__PURE__ */ s(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
"aria-labelledby": t,
|
|
86
|
+
className: "px-4 pb-4 pt-1 text-sm font-light text-sbk-fg-muted animate-sbk-fade-in motion-reduce:animate-none",
|
|
87
|
+
id: r,
|
|
88
|
+
role: "region",
|
|
89
|
+
children: e.content
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
e.id
|
|
95
|
+
);
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
);
|
|
52
99
|
};
|
|
100
|
+
$.displayName = "Accordion";
|
|
53
101
|
export {
|
|
54
|
-
|
|
102
|
+
$ as Accordion
|
|
55
103
|
};
|
|
56
104
|
//# sourceMappingURL=Accordion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.js","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import type React from 'react';\nimport { useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface AccordionItem {\n content: React.ReactNode;\n id: string;\n title: React.ReactNode;\n}\n\nexport interface AccordionProps {\n defaultOpenId?: string;\n items: AccordionItem[];\n}\n\nexport const Accordion
|
|
1
|
+
{"version":3,"file":"Accordion.js","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { useId, useRef, useState } from 'react';\r\nimport { ChevronDown } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, transitionColors } from '../../utils/styles';\r\n\r\nexport interface AccordionItem {\r\n content: React.ReactNode;\r\n disabled?: boolean;\r\n id: string;\r\n title: React.ReactNode;\r\n}\r\n\r\nexport interface AccordionProps {\r\n className?: string;\r\n /** Item aberto inicialmente (modo single). */\r\n defaultOpenId?: string;\r\n /** Itens abertos inicialmente (modo multiple). */\r\n defaultOpenIds?: string[];\r\n items: AccordionItem[];\r\n /** `single`: um item aberto por vez. `multiple`: vários. Padrão: single. */\r\n type?: 'single' | 'multiple';\r\n /** `separated`: cards independentes. `flush`: lista contínua com divisórias. */\r\n variant?: 'separated' | 'flush';\r\n}\r\n\r\nexport const Accordion = ({\r\n items,\r\n defaultOpenId,\r\n defaultOpenIds,\r\n type = 'single',\r\n variant = 'separated',\r\n className,\r\n}: AccordionProps) => {\r\n const [openIds, setOpenIds] = useState<string[]>(\r\n defaultOpenIds ?? (defaultOpenId ? [defaultOpenId] : []),\r\n );\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const baseId = useId();\r\n\r\n const toggle = (id: string) =>\r\n setOpenIds((prev) =>\r\n prev.includes(id) ? prev.filter((x) => x !== id) : type === 'single' ? [id] : [...prev, id],\r\n );\r\n\r\n const onKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\r\n const buttons = Array.from(\r\n rootRef.current?.querySelectorAll<HTMLButtonElement>(\r\n '[data-accordion-trigger]:not(:disabled)',\r\n ) ?? [],\r\n );\r\n const index = buttons.indexOf(event.currentTarget);\r\n const targets: Record<string, number> = {\r\n ArrowDown: (index + 1) % buttons.length,\r\n ArrowUp: (index - 1 + buttons.length) % buttons.length,\r\n Home: 0,\r\n End: buttons.length - 1,\r\n };\r\n if (event.key in targets) {\r\n event.preventDefault();\r\n buttons[targets[event.key]]?.focus();\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={cn(\r\n variant === 'separated'\r\n ? 'grid gap-2'\r\n : 'divide-y divide-sbk-line overflow-hidden rounded-sbk-sm border border-sbk-line',\r\n className,\r\n )}\r\n >\r\n {items.map((item) => {\r\n const isOpen = openIds.includes(item.id);\r\n const triggerId = `${baseId}-trigger-${item.id}`;\r\n const panelId = `${baseId}-panel-${item.id}`;\r\n return (\r\n <div\r\n key={item.id}\r\n className={cn(\r\n variant === 'separated' && 'overflow-hidden rounded-sbk-sm border border-sbk-line',\r\n 'bg-sbk-surface',\r\n )}\r\n >\r\n <h3 className=\"m-0\">\r\n <button\r\n aria-controls={panelId}\r\n aria-expanded={isOpen}\r\n className={cn(\r\n buttonReset,\r\n 'flex w-full cursor-pointer items-center justify-between gap-3 px-4 py-3 text-left text-sm font-semibold text-sbk-fg hover:bg-sbk-surface-hover disabled:cursor-not-allowed disabled:opacity-50',\r\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-sbk-focus focus-visible:outline-solid',\r\n transitionColors,\r\n )}\r\n data-accordion-trigger=\"\"\r\n disabled={item.disabled}\r\n id={triggerId}\r\n onClick={() => toggle(item.id)}\r\n onKeyDown={onKeyDown}\r\n type=\"button\"\r\n >\r\n {item.title}\r\n <ChevronDown\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'size-4 shrink-0 text-sbk-fg-muted transition-transform duration-200 motion-reduce:transition-none',\r\n isOpen && 'rotate-180',\r\n )}\r\n />\r\n </button>\r\n </h3>\r\n {isOpen && (\r\n <div\r\n aria-labelledby={triggerId}\r\n className=\"px-4 pb-4 pt-1 text-sm font-light text-sbk-fg-muted animate-sbk-fade-in motion-reduce:animate-none\"\r\n id={panelId}\r\n role=\"region\"\r\n >\r\n {item.content}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nAccordion.displayName = 'Accordion';\r\n"],"names":["Accordion","items","defaultOpenId","defaultOpenIds","type","variant","className","openIds","setOpenIds","useState","rootRef","useRef","baseId","useId","toggle","id","prev","x","onKeyDown","event","buttons","_a","index","targets","_b","jsx","cn","item","isOpen","triggerId","panelId","jsxs","buttonReset","transitionColors","ChevronDown"],"mappings":";;;;;AA0BO,MAAMA,IAAY,CAAC;AAAA,EACxB,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,WAAAC;AACF,MAAsB;AACpB,QAAM,CAACC,GAASC,CAAU,IAAIC;AAAA,IAC5BN,MAAmBD,IAAgB,CAACA,CAAa,IAAI,CAAA;AAAA,EAAC,GAElDQ,IAAUC,EAAuB,IAAI,GACrCC,IAASC,EAAA,GAETC,IAAS,CAACC,MACdP;AAAA,IAAW,CAACQ,MACVA,EAAK,SAASD,CAAE,IAAIC,EAAK,OAAO,CAACC,MAAMA,MAAMF,CAAE,IAAIX,MAAS,WAAW,CAACW,CAAE,IAAI,CAAC,GAAGC,GAAMD,CAAE;AAAA,EAAA,GAGxFG,IAAY,CAACC,MAAkD;;AACnE,UAAMC,IAAU,MAAM;AAAA,QACpBC,IAAAX,EAAQ,YAAR,gBAAAW,EAAiB;AAAA,QACf;AAAA,YACG,CAAA;AAAA,IAAC,GAEFC,IAAQF,EAAQ,QAAQD,EAAM,aAAa,GAC3CI,IAAkC;AAAA,MACtC,YAAYD,IAAQ,KAAKF,EAAQ;AAAA,MACjC,UAAUE,IAAQ,IAAIF,EAAQ,UAAUA,EAAQ;AAAA,MAChD,MAAM;AAAA,MACN,KAAKA,EAAQ,SAAS;AAAA,IAAA;AAExB,IAAID,EAAM,OAAOI,MACfJ,EAAM,eAAA,IACNK,IAAAJ,EAAQG,EAAQJ,EAAM,GAAG,CAAC,MAA1B,QAAAK,EAA6B;AAAA,EAEjC;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKf;AAAA,MACL,WAAWgB;AAAA,QACTrB,MAAY,cACR,eACA;AAAA,QACJC;AAAA,MAAA;AAAA,MAGD,UAAAL,EAAM,IAAI,CAAC0B,MAAS;AACnB,cAAMC,IAASrB,EAAQ,SAASoB,EAAK,EAAE,GACjCE,IAAY,GAAGjB,CAAM,YAAYe,EAAK,EAAE,IACxCG,IAAU,GAAGlB,CAAM,UAAUe,EAAK,EAAE;AAC1C,eACE,gBAAAI;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAWL;AAAA,cACTrB,MAAY,eAAe;AAAA,cAC3B;AAAA,YAAA;AAAA,YAGF,UAAA;AAAA,cAAA,gBAAAoB,EAAC,MAAA,EAAG,WAAU,OACZ,UAAA,gBAAAM;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,iBAAeD;AAAA,kBACf,iBAAeF;AAAA,kBACf,WAAWF;AAAA,oBACTM;AAAA,oBACA;AAAA,oBACA;AAAA,oBACAC;AAAA,kBAAA;AAAA,kBAEF,0BAAuB;AAAA,kBACvB,UAAUN,EAAK;AAAA,kBACf,IAAIE;AAAA,kBACJ,SAAS,MAAMf,EAAOa,EAAK,EAAE;AAAA,kBAC7B,WAAAT;AAAA,kBACA,MAAK;AAAA,kBAEJ,UAAA;AAAA,oBAAAS,EAAK;AAAA,oBACN,gBAAAF;AAAA,sBAACS;AAAA,sBAAA;AAAA,wBACC,eAAY;AAAA,wBACZ,WAAWR;AAAA,0BACT;AAAA,0BACAE,KAAU;AAAA,wBAAA;AAAA,sBACZ;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA,GAEJ;AAAA,cACCA,KACC,gBAAAH;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,mBAAiBI;AAAA,kBACjB,WAAU;AAAA,kBACV,IAAIC;AAAA,kBACJ,MAAK;AAAA,kBAEJ,UAAAH,EAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACR;AAAA,UAAA;AAAA,UAzCGA,EAAK;AAAA,QAAA;AAAA,MA6ChB,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA3B,EAAU,cAAc;"}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
export type AlertTone = 'info' | 'success' | 'warning' | 'error';
|
|
3
|
+
export interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
4
|
+
/** Ações (botões/links) exibidas abaixo do texto. */
|
|
5
|
+
action?: React.ReactNode;
|
|
6
|
+
/** Ícone customizado. `false` remove o ícone. */
|
|
7
|
+
icon?: React.ReactNode | false;
|
|
8
|
+
onClose?: () => void;
|
|
9
|
+
title?: React.ReactNode;
|
|
10
|
+
tone?: AlertTone;
|
|
5
11
|
}
|
|
6
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Mensagem de feedback persistente na página.
|
|
14
|
+
* `error` e `warning` usam role="alert" (anúncio imediato); `info` e `success` usam role="status".
|
|
15
|
+
*/
|
|
16
|
+
export declare const Alert: {
|
|
17
|
+
({ title, tone, icon, action, onClose, children, className, role, ...props }: AlertProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
displayName: string;
|
|
19
|
+
};
|
|
@@ -1,32 +1,76 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { jsxs as c, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { XCircle as k, AlertTriangle as u, CheckCircle2 as h, Info as p, X as N } from "lucide-react";
|
|
3
|
+
import { cn as r } from "../../utils/cn.js";
|
|
4
|
+
import { focusRing as v, buttonReset as w } from "../../utils/styles.js";
|
|
5
|
+
const I = {
|
|
6
|
+
info: { box: "border-sbk-info/30 bg-sbk-info-subtle", icon: "text-sbk-info-fg", Icon: p },
|
|
7
|
+
success: {
|
|
8
|
+
box: "border-sbk-success/30 bg-sbk-success-subtle",
|
|
9
|
+
icon: "text-sbk-success-fg",
|
|
10
|
+
Icon: h
|
|
11
|
+
},
|
|
12
|
+
warning: {
|
|
13
|
+
box: "border-sbk-warning/30 bg-sbk-warning-subtle",
|
|
14
|
+
icon: "text-sbk-warning-fg",
|
|
15
|
+
Icon: u
|
|
16
|
+
},
|
|
17
|
+
error: {
|
|
18
|
+
box: "border-sbk-error/30 bg-sbk-error-subtle",
|
|
19
|
+
icon: "text-sbk-error-fg",
|
|
20
|
+
Icon: k
|
|
21
|
+
}
|
|
22
|
+
}, C = ({
|
|
23
|
+
title: t,
|
|
24
|
+
tone: s = "info",
|
|
25
|
+
icon: n,
|
|
26
|
+
action: o,
|
|
27
|
+
onClose: i,
|
|
6
28
|
children: a,
|
|
7
|
-
className:
|
|
8
|
-
|
|
29
|
+
className: b,
|
|
30
|
+
role: l,
|
|
31
|
+
...d
|
|
9
32
|
}) => {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
success: "border-[var(--success-color)]/40 bg-[var(--success-color)]/10 text-[var(--text-primary)]",
|
|
13
|
-
warning: "border-[var(--warning-color)]/40 bg-[var(--warning-color)]/10 text-[var(--text-primary)]",
|
|
14
|
-
error: "border-[var(--md-error)]/40 bg-[var(--md-error)]/10 text-[var(--text-primary)]"
|
|
15
|
-
}[o];
|
|
16
|
-
return /* @__PURE__ */ n(
|
|
33
|
+
const { box: f, icon: g, Icon: m } = I[s], x = s === "error" || s === "warning";
|
|
34
|
+
return /* @__PURE__ */ c(
|
|
17
35
|
"div",
|
|
18
36
|
{
|
|
19
|
-
className:
|
|
20
|
-
role: "alert",
|
|
21
|
-
...
|
|
37
|
+
className: r("flex items-start gap-3 rounded-sbk-sm border p-4 text-sbk-fg", f, b),
|
|
38
|
+
role: l ?? (x ? "alert" : "status"),
|
|
39
|
+
...d,
|
|
22
40
|
children: [
|
|
23
|
-
|
|
24
|
-
|
|
41
|
+
n !== !1 && /* @__PURE__ */ e(
|
|
42
|
+
"span",
|
|
43
|
+
{
|
|
44
|
+
"aria-hidden": "true",
|
|
45
|
+
className: r("mt-0.5 inline-flex shrink-0 [&_svg]:size-5", g),
|
|
46
|
+
children: n ?? /* @__PURE__ */ e(m, { strokeWidth: 1.75 })
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
/* @__PURE__ */ c("div", { className: "grid min-w-0 flex-1 gap-1", children: [
|
|
50
|
+
t && /* @__PURE__ */ e("p", { className: "m-0 text-sm font-semibold text-sbk-fg-heading", children: t }),
|
|
51
|
+
a && /* @__PURE__ */ e("div", { className: "text-sm font-light leading-relaxed", children: a }),
|
|
52
|
+
o && /* @__PURE__ */ e("div", { className: "mt-2 flex flex-wrap gap-2", children: o })
|
|
53
|
+
] }),
|
|
54
|
+
i && /* @__PURE__ */ e(
|
|
55
|
+
"button",
|
|
56
|
+
{
|
|
57
|
+
"aria-label": "Fechar alerta",
|
|
58
|
+
className: r(
|
|
59
|
+
w,
|
|
60
|
+
"inline-flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sbk-xs text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg",
|
|
61
|
+
v
|
|
62
|
+
),
|
|
63
|
+
onClick: i,
|
|
64
|
+
type: "button",
|
|
65
|
+
children: /* @__PURE__ */ e(N, { "aria-hidden": "true", className: "size-4" })
|
|
66
|
+
}
|
|
67
|
+
)
|
|
25
68
|
]
|
|
26
69
|
}
|
|
27
70
|
);
|
|
28
71
|
};
|
|
72
|
+
C.displayName = "Alert";
|
|
29
73
|
export {
|
|
30
|
-
|
|
74
|
+
C as Alert
|
|
31
75
|
};
|
|
32
76
|
//# sourceMappingURL=Alert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.js","sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\
|
|
1
|
+
{"version":3,"file":"Alert.js","sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { AlertTriangle, CheckCircle2, Info, X, XCircle } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\nimport { buttonReset, focusRing } from '../../utils/styles';\r\n\r\nexport type AlertTone = 'info' | 'success' | 'warning' | 'error';\r\n\r\nexport interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Ações (botões/links) exibidas abaixo do texto. */\r\n action?: React.ReactNode;\r\n /** Ícone customizado. `false` remove o ícone. */\r\n icon?: React.ReactNode | false;\r\n onClose?: () => void;\r\n title?: React.ReactNode;\r\n tone?: AlertTone;\r\n}\r\n\r\nconst TONE: Record<AlertTone, { box: string; icon: string; Icon: typeof Info }> = {\r\n info: { box: 'border-sbk-info/30 bg-sbk-info-subtle', icon: 'text-sbk-info-fg', Icon: Info },\r\n success: {\r\n box: 'border-sbk-success/30 bg-sbk-success-subtle',\r\n icon: 'text-sbk-success-fg',\r\n Icon: CheckCircle2,\r\n },\r\n warning: {\r\n box: 'border-sbk-warning/30 bg-sbk-warning-subtle',\r\n icon: 'text-sbk-warning-fg',\r\n Icon: AlertTriangle,\r\n },\r\n error: {\r\n box: 'border-sbk-error/30 bg-sbk-error-subtle',\r\n icon: 'text-sbk-error-fg',\r\n Icon: XCircle,\r\n },\r\n};\r\n\r\n/**\r\n * Mensagem de feedback persistente na página.\r\n * `error` e `warning` usam role=\"alert\" (anúncio imediato); `info` e `success` usam role=\"status\".\r\n */\r\nexport const Alert = ({\r\n title,\r\n tone = 'info',\r\n icon,\r\n action,\r\n onClose,\r\n children,\r\n className,\r\n role,\r\n ...props\r\n}: AlertProps) => {\r\n const { box, icon: iconColor, Icon } = TONE[tone];\r\n const urgent = tone === 'error' || tone === 'warning';\r\n\r\n return (\r\n <div\r\n className={cn('flex items-start gap-3 rounded-sbk-sm border p-4 text-sbk-fg', box, className)}\r\n role={role ?? (urgent ? 'alert' : 'status')}\r\n {...props}\r\n >\r\n {icon !== false && (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn('mt-0.5 inline-flex shrink-0 [&_svg]:size-5', iconColor)}\r\n >\r\n {icon ?? <Icon strokeWidth={1.75} />}\r\n </span>\r\n )}\r\n <div className=\"grid min-w-0 flex-1 gap-1\">\r\n {title && <p className=\"m-0 text-sm font-semibold text-sbk-fg-heading\">{title}</p>}\r\n {children && <div className=\"text-sm font-light leading-relaxed\">{children}</div>}\r\n {action && <div className=\"mt-2 flex flex-wrap gap-2\">{action}</div>}\r\n </div>\r\n {onClose && (\r\n <button\r\n aria-label=\"Fechar alerta\"\r\n className={cn(\r\n buttonReset,\r\n 'inline-flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-sbk-xs text-sbk-fg-muted hover:bg-sbk-surface-hover hover:text-sbk-fg',\r\n focusRing,\r\n )}\r\n onClick={onClose}\r\n type=\"button\"\r\n >\r\n <X aria-hidden=\"true\" className=\"size-4\" />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nAlert.displayName = 'Alert';\r\n"],"names":["TONE","Info","CheckCircle2","AlertTriangle","XCircle","Alert","title","tone","icon","action","onClose","children","className","role","props","box","iconColor","Icon","urgent","jsxs","cn","jsx","buttonReset","focusRing","X"],"mappings":";;;;AAiBA,MAAMA,IAA4E;AAAA,EAChF,MAAM,EAAE,KAAK,yCAAyC,MAAM,oBAAoB,MAAMC,EAAA;AAAA,EACtF,SAAS;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAMC;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAMC;AAAA,EAAA;AAAA,EAER,OAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAMC;AAAA,EAAA;AAEV,GAMaC,IAAQ,CAAC;AAAA,EACpB,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAGC;AACL,MAAkB;AAChB,QAAM,EAAE,KAAAC,GAAK,MAAMC,GAAW,MAAAC,EAAA,IAASjB,EAAKO,CAAI,GAC1CW,IAASX,MAAS,WAAWA,MAAS;AAE5C,SACE,gBAAAY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAG,gEAAgEL,GAAKH,CAAS;AAAA,MAC5F,MAAMC,MAASK,IAAS,UAAU;AAAA,MACjC,GAAGJ;AAAA,MAEH,UAAA;AAAA,QAAAN,MAAS,MACR,gBAAAa;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAWD,EAAG,8CAA8CJ,CAAS;AAAA,YAEpE,UAAAR,KAAQ,gBAAAa,EAACJ,GAAA,EAAK,aAAa,KAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAGtC,gBAAAE,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,UAAAb,KAAS,gBAAAe,EAAC,KAAA,EAAE,WAAU,iDAAiD,UAAAf,GAAM;AAAA,UAC7EK,KAAY,gBAAAU,EAAC,OAAA,EAAI,WAAU,sCAAsC,UAAAV,GAAS;AAAA,UAC1EF,KAAU,gBAAAY,EAAC,OAAA,EAAI,WAAU,6BAA6B,UAAAZ,EAAA,CAAO;AAAA,QAAA,GAChE;AAAA,QACCC,KACC,gBAAAW;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAWD;AAAA,cACTE;AAAA,cACA;AAAA,cACAC;AAAA,YAAA;AAAA,YAEF,SAASb;AAAA,YACT,MAAK;AAAA,YAEL,UAAA,gBAAAW,EAACG,GAAA,EAAE,eAAY,QAAO,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MAC3C;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAnB,EAAM,cAAc;"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
export interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
3
|
-
/**
|
|
3
|
+
/** Nome da pessoa: usado como label acessível e para gerar as iniciais. */
|
|
4
4
|
alt: string;
|
|
5
|
-
/** URL da imagem. Se ausente ou falhar no carregamento, exibe as iniciais. */
|
|
6
|
-
src?: string;
|
|
7
|
-
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
8
|
-
/** Formato do avatar. Padrão: 'circle' */
|
|
9
5
|
shape?: 'circle' | 'square';
|
|
6
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
7
|
+
/** URL da imagem. Se ausente ou com erro, exibe as iniciais. */
|
|
8
|
+
src?: string;
|
|
9
|
+
/** Indicador de presença. */
|
|
10
|
+
status?: 'online' | 'offline' | 'busy';
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
+
/** Extrai até 2 iniciais. Ex.: "Carlos Augusto" gera "CA". */
|
|
13
|
+
export declare const getInitials: (name: string) => string;
|
|
14
|
+
export declare const Avatar: {
|
|
15
|
+
({ src, alt, size, shape, status, className, ...props }: AvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
displayName: string;
|
|
17
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsxs as f, jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import { useState as g } from "react";
|
|
3
|
+
import { cn as o } from "../../utils/cn.js";
|
|
4
|
+
const u = {
|
|
5
|
+
xs: "size-6 text-[0.625rem]",
|
|
6
|
+
sm: "size-8 text-xs",
|
|
7
|
+
md: "size-10 text-sm",
|
|
8
|
+
lg: "size-12 text-base",
|
|
9
|
+
xl: "size-16 text-lg"
|
|
10
|
+
}, p = {
|
|
11
|
+
online: "bg-sbk-success",
|
|
12
|
+
offline: "bg-sbk-line-strong",
|
|
13
|
+
busy: "bg-sbk-error"
|
|
14
|
+
}, x = { online: "online", offline: "offline", busy: "ocupado" }, S = (s) => s.trim().split(/\s+/).filter(Boolean).slice(0, 2).map((e) => {
|
|
15
|
+
var r;
|
|
16
|
+
return ((r = e[0]) == null ? void 0 : r.toUpperCase()) ?? "";
|
|
17
|
+
}).join(""), h = ({
|
|
18
|
+
src: s,
|
|
19
|
+
alt: e,
|
|
20
|
+
size: r = "md",
|
|
21
|
+
shape: l = "circle",
|
|
22
|
+
status: i,
|
|
23
|
+
className: t,
|
|
24
|
+
...a
|
|
25
|
+
}) => {
|
|
26
|
+
const [c, m] = g(!1), b = s && !c, d = i ? `${e} (${x[i]})` : e;
|
|
27
|
+
return /* @__PURE__ */ f("span", { className: o("relative inline-flex shrink-0", t), ...a, children: [
|
|
28
|
+
/* @__PURE__ */ n(
|
|
29
|
+
"span",
|
|
30
|
+
{
|
|
31
|
+
"aria-label": d,
|
|
32
|
+
className: o(
|
|
33
|
+
"inline-flex select-none items-center justify-center overflow-hidden bg-sbk-ciano font-semibold text-sbk-branco",
|
|
34
|
+
l === "circle" ? "rounded-full" : "rounded-sbk-sm",
|
|
35
|
+
u[r]
|
|
36
|
+
),
|
|
37
|
+
role: "img",
|
|
38
|
+
children: b ? /* @__PURE__ */ n(
|
|
39
|
+
"img",
|
|
40
|
+
{
|
|
41
|
+
alt: "",
|
|
42
|
+
className: "size-full object-cover",
|
|
43
|
+
onError: () => m(!0),
|
|
44
|
+
src: s
|
|
45
|
+
}
|
|
46
|
+
) : /* @__PURE__ */ n("span", { "aria-hidden": "true", children: S(e) })
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
i && /* @__PURE__ */ n(
|
|
50
|
+
"span",
|
|
51
|
+
{
|
|
52
|
+
"aria-hidden": "true",
|
|
53
|
+
className: o(
|
|
54
|
+
"absolute bottom-0 right-0 size-2.5 rounded-full ring-2 ring-sbk-surface",
|
|
55
|
+
p[i]
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
] });
|
|
60
|
+
};
|
|
61
|
+
h.displayName = "Avatar";
|
|
62
|
+
export {
|
|
63
|
+
h as Avatar,
|
|
64
|
+
S as getInitials
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n /** Nome da pessoa: usado como label acessível e para gerar as iniciais. */\r\n alt: string;\r\n shape?: 'circle' | 'square';\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n /** URL da imagem. Se ausente ou com erro, exibe as iniciais. */\r\n src?: string;\r\n /** Indicador de presença. */\r\n status?: 'online' | 'offline' | 'busy';\r\n}\r\n\r\nconst SIZE_CLASS: Record<NonNullable<AvatarProps['size']>, string> = {\r\n xs: 'size-6 text-[0.625rem]',\r\n sm: 'size-8 text-xs',\r\n md: 'size-10 text-sm',\r\n lg: 'size-12 text-base',\r\n xl: 'size-16 text-lg',\r\n};\r\n\r\nconst STATUS_CLASS = {\r\n online: 'bg-sbk-success',\r\n offline: 'bg-sbk-line-strong',\r\n busy: 'bg-sbk-error',\r\n} as const;\r\nconst STATUS_LABEL = { online: 'online', offline: 'offline', busy: 'ocupado' } as const;\r\n\r\n/** Extrai até 2 iniciais. Ex.: \"Carlos Augusto\" gera \"CA\". */\r\nexport const getInitials = (name: string): string =>\r\n name\r\n .trim()\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .slice(0, 2)\r\n .map((word) => word[0]?.toUpperCase() ?? '')\r\n .join('');\r\n\r\nexport const Avatar = ({\r\n src,\r\n alt,\r\n size = 'md',\r\n shape = 'circle',\r\n status,\r\n className,\r\n ...props\r\n}: AvatarProps) => {\r\n const [imgError, setImgError] = useState(false);\r\n const showImage = src && !imgError;\r\n const label = status ? `${alt} (${STATUS_LABEL[status]})` : alt;\r\n\r\n return (\r\n <span className={cn('relative inline-flex shrink-0', className)} {...props}>\r\n <span\r\n aria-label={label}\r\n className={cn(\r\n 'inline-flex select-none items-center justify-center overflow-hidden bg-sbk-ciano font-semibold text-sbk-branco',\r\n shape === 'circle' ? 'rounded-full' : 'rounded-sbk-sm',\r\n SIZE_CLASS[size],\r\n )}\r\n role=\"img\"\r\n >\r\n {showImage ? (\r\n <img\r\n alt=\"\"\r\n className=\"size-full object-cover\"\r\n onError={() => setImgError(true)}\r\n src={src}\r\n />\r\n ) : (\r\n <span aria-hidden=\"true\">{getInitials(alt)}</span>\r\n )}\r\n </span>\r\n {status && (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n 'absolute bottom-0 right-0 size-2.5 rounded-full ring-2 ring-sbk-surface',\r\n STATUS_CLASS[status],\r\n )}\r\n />\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\nAvatar.displayName = 'Avatar';\r\n"],"names":["SIZE_CLASS","STATUS_CLASS","STATUS_LABEL","getInitials","name","word","_a","Avatar","src","alt","size","shape","status","className","props","imgError","setImgError","useState","showImage","label","jsxs","cn","jsx"],"mappings":";;;AAeA,MAAMA,IAA+D;AAAA,EACnE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAe;AAAA,EACnB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AACR,GACMC,IAAe,EAAE,QAAQ,UAAU,SAAS,WAAW,MAAM,UAAA,GAGtDC,IAAc,CAACC,MAC1BA,EACG,KAAA,EACA,MAAM,KAAK,EACX,OAAO,OAAO,EACd,MAAM,GAAG,CAAC,EACV,IAAI,CAACC;;AAAS,WAAAC,IAAAD,EAAK,CAAC,MAAN,gBAAAC,EAAS,kBAAiB;AAAA,CAAE,EAC1C,KAAK,EAAE,GAECC,IAAS,CAAC;AAAA,EACrB,KAAAC;AAAA,EACA,KAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAAmB;AACjB,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAAYV,KAAO,CAACO,GACpBI,IAAQP,IAAS,GAAGH,CAAG,KAAKP,EAAaU,CAAM,CAAC,MAAMH;AAE5D,SACE,gBAAAW,EAAC,UAAK,WAAWC,EAAG,iCAAiCR,CAAS,GAAI,GAAGC,GACnE,UAAA;AAAA,IAAA,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAYH;AAAA,QACZ,WAAWE;AAAA,UACT;AAAA,UACAV,MAAU,WAAW,iBAAiB;AAAA,UACtCX,EAAWU,CAAI;AAAA,QAAA;AAAA,QAEjB,MAAK;AAAA,QAEJ,UAAAQ,IACC,gBAAAI;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,SAAS,MAAMN,EAAY,EAAI;AAAA,YAC/B,KAAAR;AAAA,UAAA;AAAA,QAAA,IAGF,gBAAAc,EAAC,QAAA,EAAK,eAAY,QAAQ,UAAAnB,EAAYM,CAAG,EAAA,CAAE;AAAA,MAAA;AAAA,IAAA;AAAA,IAG9CG,KACC,gBAAAU;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAWD;AAAA,UACT;AAAA,UACApB,EAAaW,CAAM;AAAA,QAAA;AAAA,MACrB;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;AAEAL,EAAO,cAAc;"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
|
+
export type BadgeTone = 'neutral' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';
|
|
2
3
|
export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
4
|
+
/** Ponto colorido antes do texto (status). */
|
|
5
|
+
dot?: boolean;
|
|
3
6
|
size?: 'sm' | 'md';
|
|
4
|
-
tone?:
|
|
7
|
+
tone?: BadgeTone;
|
|
8
|
+
/** `solid`: fundo cheio. `subtle`: fundo suave com texto colorido. Padrão: solid. */
|
|
9
|
+
variant?: 'solid' | 'subtle';
|
|
5
10
|
}
|
|
6
|
-
|
|
11
|
+
/** Etiqueta curta de status ou contagem (formato pill da SBK IA). */
|
|
12
|
+
export declare const Badge: {
|
|
13
|
+
({ size, tone, variant, dot, className, children, ...props }: BadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
displayName: string;
|
|
15
|
+
};
|
|
@@ -1,35 +1,47 @@
|
|
|
1
|
-
import { jsx as
|
|
1
|
+
import { jsxs as o, jsx as k } from "react/jsx-runtime";
|
|
2
2
|
import { cn as i } from "../../utils/cn.js";
|
|
3
|
-
const
|
|
4
|
-
|
|
3
|
+
const g = {
|
|
4
|
+
neutral: "bg-sbk-surface-sunken text-sbk-fg-muted border border-sbk-line",
|
|
5
|
+
primary: "bg-sbk-primary text-sbk-on-primary",
|
|
6
|
+
secondary: "bg-sbk-secondary text-sbk-on-secondary",
|
|
7
|
+
success: "bg-sbk-success text-sbk-on-state",
|
|
8
|
+
warning: "bg-sbk-warning text-sbk-on-state",
|
|
9
|
+
error: "bg-sbk-error text-sbk-on-state",
|
|
10
|
+
info: "bg-sbk-info text-sbk-on-state"
|
|
11
|
+
}, c = {
|
|
12
|
+
neutral: "bg-sbk-surface-sunken text-sbk-fg-muted",
|
|
13
|
+
primary: "bg-sbk-primary-subtle text-sbk-primary dark:text-sbk-fg",
|
|
14
|
+
secondary: "bg-sbk-primary-subtle text-sbk-secondary dark:text-sbk-fg",
|
|
15
|
+
success: "bg-sbk-success-subtle text-sbk-success-fg",
|
|
16
|
+
warning: "bg-sbk-warning-subtle text-sbk-warning-fg",
|
|
17
|
+
error: "bg-sbk-error-subtle text-sbk-error-fg",
|
|
18
|
+
info: "bg-sbk-info-subtle text-sbk-info-fg"
|
|
19
|
+
}, d = ({
|
|
20
|
+
size: s = "md",
|
|
5
21
|
tone: e = "neutral",
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
children: a
|
|
29
|
-
}
|
|
30
|
-
);
|
|
31
|
-
};
|
|
22
|
+
variant: t = "solid",
|
|
23
|
+
dot: r = !1,
|
|
24
|
+
className: b,
|
|
25
|
+
children: n,
|
|
26
|
+
...a
|
|
27
|
+
}) => /* @__PURE__ */ o(
|
|
28
|
+
"span",
|
|
29
|
+
{
|
|
30
|
+
className: i(
|
|
31
|
+
"inline-flex items-center gap-1.5 whitespace-nowrap rounded-full font-semibold leading-none",
|
|
32
|
+
s === "sm" ? "px-2 py-0.5 text-[0.6875rem]" : "px-2.5 py-1 text-xs",
|
|
33
|
+
(t === "solid" ? g : c)[e],
|
|
34
|
+
b
|
|
35
|
+
),
|
|
36
|
+
...a,
|
|
37
|
+
children: [
|
|
38
|
+
r && /* @__PURE__ */ k("span", { "aria-hidden": "true", className: "size-1.5 rounded-full bg-current" }),
|
|
39
|
+
n
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
d.displayName = "Badge";
|
|
32
44
|
export {
|
|
33
|
-
|
|
45
|
+
d as Badge
|
|
34
46
|
};
|
|
35
47
|
//# sourceMappingURL=Badge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.js","sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import type React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: 'sm' | 'md';\n tone?:
|
|
1
|
+
{"version":3,"file":"Badge.js","sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import type React from 'react';\r\nimport { cn } from '../../utils/cn';\r\n\r\nexport type BadgeTone =\r\n | 'neutral'\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'warning'\r\n | 'error'\r\n | 'info';\r\n\r\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n /** Ponto colorido antes do texto (status). */\r\n dot?: boolean;\r\n size?: 'sm' | 'md';\r\n tone?: BadgeTone;\r\n /** `solid`: fundo cheio. `subtle`: fundo suave com texto colorido. Padrão: solid. */\r\n variant?: 'solid' | 'subtle';\r\n}\r\n\r\nconst SOLID: Record<BadgeTone, string> = {\r\n neutral: 'bg-sbk-surface-sunken text-sbk-fg-muted border border-sbk-line',\r\n primary: 'bg-sbk-primary text-sbk-on-primary',\r\n secondary: 'bg-sbk-secondary text-sbk-on-secondary',\r\n success: 'bg-sbk-success text-sbk-on-state',\r\n warning: 'bg-sbk-warning text-sbk-on-state',\r\n error: 'bg-sbk-error text-sbk-on-state',\r\n info: 'bg-sbk-info text-sbk-on-state',\r\n};\r\n\r\nconst SUBTLE: Record<BadgeTone, string> = {\r\n neutral: 'bg-sbk-surface-sunken text-sbk-fg-muted',\r\n primary: 'bg-sbk-primary-subtle text-sbk-primary dark:text-sbk-fg',\r\n secondary: 'bg-sbk-primary-subtle text-sbk-secondary dark:text-sbk-fg',\r\n success: 'bg-sbk-success-subtle text-sbk-success-fg',\r\n warning: 'bg-sbk-warning-subtle text-sbk-warning-fg',\r\n error: 'bg-sbk-error-subtle text-sbk-error-fg',\r\n info: 'bg-sbk-info-subtle text-sbk-info-fg',\r\n};\r\n\r\n/** Etiqueta curta de status ou contagem (formato pill da SBK IA). */\r\nexport const Badge = ({\r\n size = 'md',\r\n tone = 'neutral',\r\n variant = 'solid',\r\n dot = false,\r\n className,\r\n children,\r\n ...props\r\n}: BadgeProps) => (\r\n <span\r\n className={cn(\r\n 'inline-flex items-center gap-1.5 whitespace-nowrap rounded-full font-semibold leading-none',\r\n size === 'sm' ? 'px-2 py-0.5 text-[0.6875rem]' : 'px-2.5 py-1 text-xs',\r\n (variant === 'solid' ? SOLID : SUBTLE)[tone],\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {dot && <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-current\" />}\r\n {children}\r\n </span>\r\n);\r\n\r\nBadge.displayName = 'Badge';\r\n"],"names":["SOLID","SUBTLE","Badge","size","tone","variant","dot","className","children","props","jsxs","cn","jsx"],"mappings":";;AAqBA,MAAMA,IAAmC;AAAA,EACvC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR,GAEMC,IAAoC;AAAA,EACxC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR,GAGaC,IAAQ,CAAC;AAAA,EACpB,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,KAAAC,IAAM;AAAA,EACN,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAR,MAAS,OAAO,iCAAiC;AAAA,OAChDE,MAAY,UAAUL,IAAQC,GAAQG,CAAI;AAAA,MAC3CG;AAAA,IAAA;AAAA,IAED,GAAGE;AAAA,IAEH,UAAA;AAAA,MAAAH,KAAO,gBAAAM,EAAC,QAAA,EAAK,eAAY,QAAO,WAAU,oCAAmC;AAAA,MAC7EJ;AAAA,IAAA;AAAA,EAAA;AACH;AAGFN,EAAM,cAAc;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import type React from 'react';
|
|
2
2
|
export interface BreadcrumbItem {
|
|
3
3
|
href?: string;
|
|
4
4
|
label: React.ReactNode;
|
|
@@ -7,4 +7,7 @@ export interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
7
7
|
items: BreadcrumbItem[];
|
|
8
8
|
separator?: React.ReactNode;
|
|
9
9
|
}
|
|
10
|
-
export declare const Breadcrumb:
|
|
10
|
+
export declare const Breadcrumb: {
|
|
11
|
+
({ items, separator, className, ...props }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
displayName: string;
|
|
13
|
+
};
|