vector-prototype-components 0.1.1 → 0.1.3
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/Accordion/Accordion.js +79 -0
- package/Accordion/Accordion.js.map +1 -0
- package/Accordion/Accordion.module.css +1 -0
- package/Accordion/Accordion.module.css.js +36 -0
- package/Accordion/Accordion.module.css.js.map +1 -0
- package/ActionMenu/ActionMenu.js +49 -0
- package/ActionMenu/ActionMenu.js.map +1 -0
- package/ActionMenu/ActionMenu.module.css +1 -0
- package/ActionMenu/ActionMenu.module.css.js +16 -0
- package/ActionMenu/ActionMenu.module.css.js.map +1 -0
- package/Autocomplete/Autocomplete.js +226 -0
- package/Autocomplete/Autocomplete.js.map +1 -0
- package/Autocomplete/Autocomplete.module.css +1 -0
- package/Autocomplete/Autocomplete.module.css.js +46 -0
- package/Autocomplete/Autocomplete.module.css.js.map +1 -0
- package/Avatar/Avatar.js +66 -0
- package/Avatar/Avatar.js.map +1 -0
- package/Avatar/Avatar.module.css +1 -0
- package/Avatar/Avatar.module.css.js +26 -0
- package/Avatar/Avatar.module.css.js.map +1 -0
- package/Badge/Badge.js +40 -0
- package/Badge/Badge.js.map +1 -0
- package/Badge/Badge.module.css +1 -0
- package/Badge/Badge.module.css.js +24 -0
- package/Badge/Badge.module.css.js.map +1 -0
- package/BottomBar/BottomBar.js +19 -0
- package/BottomBar/BottomBar.js.map +1 -0
- package/BottomBar/BottomBar.module.css +1 -0
- package/BottomBar/BottomBar.module.css.js +10 -0
- package/BottomBar/BottomBar.module.css.js.map +1 -0
- package/Breadcrumbs/Breadcrumbs.js +40 -0
- package/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/Breadcrumbs/Breadcrumbs.module.css +1 -0
- package/Breadcrumbs/Breadcrumbs.module.css.js +18 -0
- package/Breadcrumbs/Breadcrumbs.module.css.js.map +1 -0
- package/Button/Button.js +53 -0
- package/Button/Button.js.map +1 -0
- package/Button/Button.module.css +1 -0
- package/Button/Button.module.css.js +24 -0
- package/Button/Button.module.css.js.map +1 -0
- package/Callout/Callout.js +66 -0
- package/Callout/Callout.js.map +1 -0
- package/Callout/Callout.module.css +1 -0
- package/Callout/Callout.module.css.js +28 -0
- package/Callout/Callout.module.css.js.map +1 -0
- package/Card/Card.js +39 -0
- package/Card/Card.js.map +1 -0
- package/Card/Card.module.css +1 -0
- package/Card/Card.module.css.js +18 -0
- package/Card/Card.module.css.js.map +1 -0
- package/Checkbox/Checkbox.js +90 -0
- package/Checkbox/Checkbox.js.map +1 -0
- package/Checkbox/Checkbox.module.css +1 -0
- package/Checkbox/Checkbox.module.css.js +22 -0
- package/Checkbox/Checkbox.module.css.js.map +1 -0
- package/Chip/Chip.js +62 -0
- package/Chip/Chip.js.map +1 -0
- package/Chip/Chip.module.css +1 -0
- package/Chip/Chip.module.css.js +24 -0
- package/Chip/Chip.module.css.js.map +1 -0
- package/DatePicker/DatePicker.js +157 -0
- package/DatePicker/DatePicker.js.map +1 -0
- package/DatePicker/DatePicker.module.css +1 -0
- package/DatePicker/DatePicker.module.css.js +48 -0
- package/DatePicker/DatePicker.module.css.js.map +1 -0
- package/DatePicker/DatePickerCalendar.js +94 -0
- package/DatePicker/DatePickerCalendar.js.map +1 -0
- package/DatePicker/DatePickerCalendar.module.css +1 -0
- package/DatePicker/DatePickerCalendar.module.css.js +32 -0
- package/DatePicker/DatePickerCalendar.module.css.js.map +1 -0
- package/Divider/Divider.js +22 -0
- package/Divider/Divider.js.map +1 -0
- package/Divider/Divider.module.css +1 -0
- package/Divider/Divider.module.css.js +12 -0
- package/Divider/Divider.module.css.js.map +1 -0
- package/Dropdown/Dropdown.js +100 -0
- package/Dropdown/Dropdown.js.map +1 -0
- package/Dropdown/Dropdown.module.css +1 -0
- package/Dropdown/Dropdown.module.css.js +20 -0
- package/Dropdown/Dropdown.module.css.js.map +1 -0
- package/Icon/Icon.js +8 -0
- package/Icon/Icon.js.map +1 -0
- package/IconButton/IconButton.js +42 -0
- package/IconButton/IconButton.js.map +1 -0
- package/IconButton/IconButton.module.css +1 -0
- package/IconButton/IconButton.module.css.js +20 -0
- package/IconButton/IconButton.module.css.js.map +1 -0
- package/InputNumber/InputNumber.js +106 -0
- package/InputNumber/InputNumber.js.map +1 -0
- package/InputNumber/InputNumber.module.css +1 -0
- package/InputNumber/InputNumber.module.css.js +30 -0
- package/InputNumber/InputNumber.module.css.js.map +1 -0
- package/Menu/Menu.js +182 -0
- package/Menu/Menu.js.map +1 -0
- package/Menu/Menu.module.css +1 -0
- package/Menu/Menu.module.css.js +56 -0
- package/Menu/Menu.module.css.js.map +1 -0
- package/Menu/menuData.js +188 -0
- package/Menu/menuData.js.map +1 -0
- package/Message/Message.js +88 -0
- package/Message/Message.js.map +1 -0
- package/Message/Message.module.css +1 -0
- package/Message/Message.module.css.js +32 -0
- package/Message/Message.module.css.js.map +1 -0
- package/Modal/Modal.js +186 -0
- package/Modal/Modal.js.map +1 -0
- package/Modal/Modal.module.css +1 -0
- package/Modal/Modal.module.css.js +44 -0
- package/Modal/Modal.module.css.js.map +1 -0
- package/Multiselect/Multiselect.js +249 -0
- package/Multiselect/Multiselect.js.map +1 -0
- package/Multiselect/Multiselect.module.css +1 -0
- package/Multiselect/Multiselect.module.css.js +64 -0
- package/Multiselect/Multiselect.module.css.js.map +1 -0
- package/Overlay/Overlay.js +18 -0
- package/Overlay/Overlay.js.map +1 -0
- package/Overlay/Overlay.module.css +1 -0
- package/Overlay/Overlay.module.css.js +8 -0
- package/Overlay/Overlay.module.css.js.map +1 -0
- package/Paginator/Paginator.js +118 -0
- package/Paginator/Paginator.js.map +1 -0
- package/Paginator/Paginator.module.css +1 -0
- package/Paginator/Paginator.module.css.js +22 -0
- package/Paginator/Paginator.module.css.js.map +1 -0
- package/Panel/Panel.js +38 -0
- package/Panel/Panel.js.map +1 -0
- package/Panel/Panel.module.css +1 -0
- package/Panel/Panel.module.css.js +16 -0
- package/Panel/Panel.module.css.js.map +1 -0
- package/ProgressSpinner/ProgressSpinner.js +64 -0
- package/ProgressSpinner/ProgressSpinner.js.map +1 -0
- package/ProgressSpinner/ProgressSpinner.module.css +1 -0
- package/ProgressSpinner/ProgressSpinner.module.css.js +16 -0
- package/ProgressSpinner/ProgressSpinner.module.css.js.map +1 -0
- package/Radio/Radio.js +44 -0
- package/Radio/Radio.js.map +1 -0
- package/Radio/Radio.module.css +1 -0
- package/Radio/Radio.module.css.js +18 -0
- package/Radio/Radio.module.css.js.map +1 -0
- package/SegmentControl/SegmentControl.js +74 -0
- package/SegmentControl/SegmentControl.js.map +1 -0
- package/SegmentControl/SegmentControl.module.css +1 -0
- package/SegmentControl/SegmentControl.module.css.js +16 -0
- package/SegmentControl/SegmentControl.module.css.js.map +1 -0
- package/Select/Select.js +153 -0
- package/Select/Select.js.map +1 -0
- package/Select/Select.module.css +1 -0
- package/Select/Select.module.css.js +46 -0
- package/Select/Select.module.css.js.map +1 -0
- package/Skeleton/Skeleton.js +78 -0
- package/Skeleton/Skeleton.js.map +1 -0
- package/Skeleton/Skeleton.module.css +1 -0
- package/Skeleton/Skeleton.module.css.js +18 -0
- package/Skeleton/Skeleton.module.css.js.map +1 -0
- package/Slider/Slider.js +116 -0
- package/Slider/Slider.js.map +1 -0
- package/Slider/Slider.module.css +1 -0
- package/Slider/Slider.module.css.js +24 -0
- package/Slider/Slider.module.css.js.map +1 -0
- package/Slot/Slot.js +25 -0
- package/Slot/Slot.js.map +1 -0
- package/Slot/Slot.module.css +1 -0
- package/Slot/Slot.module.css.js +16 -0
- package/Slot/Slot.module.css.js.map +1 -0
- package/Switch/Switch.js +42 -0
- package/Switch/Switch.js.map +1 -0
- package/Switch/Switch.module.css +1 -0
- package/Switch/Switch.module.css.js +11 -0
- package/Switch/Switch.module.css.js.map +1 -0
- package/Table/Table.js +268 -0
- package/Table/Table.js.map +1 -0
- package/Table/Table.module.css +1 -0
- package/Table/Table.module.css.js +64 -0
- package/Table/Table.module.css.js.map +1 -0
- package/TableTree/TableTree.js +139 -0
- package/TableTree/TableTree.js.map +1 -0
- package/TableTree/TableTree.module.css +1 -0
- package/TableTree/TableTree.module.css.js +62 -0
- package/TableTree/TableTree.module.css.js.map +1 -0
- package/Tabs/Tabs.js +92 -0
- package/Tabs/Tabs.js.map +1 -0
- package/Tabs/Tabs.module.css +1 -0
- package/Tabs/Tabs.module.css.js +18 -0
- package/Tabs/Tabs.module.css.js.map +1 -0
- package/Tag/Tag.js +48 -0
- package/Tag/Tag.js.map +1 -0
- package/Tag/Tag.module.css +1 -0
- package/Tag/Tag.module.css.js +30 -0
- package/Tag/Tag.module.css.js.map +1 -0
- package/TextField/TextField.js +93 -0
- package/TextField/TextField.js.map +1 -0
- package/TextField/TextField.module.css +1 -0
- package/TextField/TextField.module.css.js +36 -0
- package/TextField/TextField.module.css.js.map +1 -0
- package/Textarea/Textarea.js +52 -0
- package/Textarea/Textarea.js.map +1 -0
- package/Textarea/Textarea.module.css +1 -0
- package/Textarea/Textarea.module.css.js +32 -0
- package/Textarea/Textarea.module.css.js.map +1 -0
- package/Toast/Toast.js +82 -0
- package/Toast/Toast.js.map +1 -0
- package/Toast/Toast.module.css +1 -0
- package/Toast/Toast.module.css.js +28 -0
- package/Toast/Toast.module.css.js.map +1 -0
- package/Tooltip/Tooltip.js +61 -0
- package/Tooltip/Tooltip.js.map +1 -0
- package/Tooltip/Tooltip.module.css +1 -0
- package/Tooltip/Tooltip.module.css.js +26 -0
- package/Tooltip/Tooltip.module.css.js.map +1 -0
- package/TopBar/TopBar.js +87 -0
- package/TopBar/TopBar.js.map +1 -0
- package/TopBar/TopBar.module.css +1 -0
- package/TopBar/TopBar.module.css.js +30 -0
- package/TopBar/TopBar.module.css.js.map +1 -0
- package/index.js +90 -4157
- package/index.js.map +1 -1
- package/package.json +3 -4
- package/style.css +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { jsx as u, jsxs as w } from "react/jsx-runtime";
|
|
2
|
+
import { Icon as j } from "../Icon/Icon.js";
|
|
3
|
+
import a from "./Dropdown.module.css.js";
|
|
4
|
+
function k({
|
|
5
|
+
label: r,
|
|
6
|
+
value: v,
|
|
7
|
+
selected: s = !1,
|
|
8
|
+
active: m = !1,
|
|
9
|
+
disabled: o = !1,
|
|
10
|
+
leadingIcon: t,
|
|
11
|
+
id: b,
|
|
12
|
+
focusable: d = !0,
|
|
13
|
+
selectOnPointerDown: i = !1,
|
|
14
|
+
onClick: c,
|
|
15
|
+
onHover: y
|
|
16
|
+
}) {
|
|
17
|
+
const f = [
|
|
18
|
+
a.item,
|
|
19
|
+
s ? a.itemSelected : void 0,
|
|
20
|
+
m ? a.itemActive : void 0,
|
|
21
|
+
o ? a.itemDisabled : void 0
|
|
22
|
+
].filter(Boolean).join(" ");
|
|
23
|
+
function n() {
|
|
24
|
+
!o && c && c(v);
|
|
25
|
+
}
|
|
26
|
+
function D(e) {
|
|
27
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), n());
|
|
28
|
+
}
|
|
29
|
+
return /* @__PURE__ */ w(
|
|
30
|
+
"button",
|
|
31
|
+
{
|
|
32
|
+
type: "button",
|
|
33
|
+
role: "option",
|
|
34
|
+
id: b,
|
|
35
|
+
"aria-selected": s,
|
|
36
|
+
"aria-disabled": o,
|
|
37
|
+
className: f,
|
|
38
|
+
onClick: i ? void 0 : n,
|
|
39
|
+
onMouseDown: i ? (e) => {
|
|
40
|
+
e.preventDefault(), n();
|
|
41
|
+
} : void 0,
|
|
42
|
+
onMouseEnter: y,
|
|
43
|
+
onKeyDown: d ? D : void 0,
|
|
44
|
+
tabIndex: !d || o ? -1 : 0,
|
|
45
|
+
children: [
|
|
46
|
+
t && /* @__PURE__ */ u(j, { as: t, size: 16 }),
|
|
47
|
+
r
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
function B({
|
|
53
|
+
options: r,
|
|
54
|
+
selectedValue: v,
|
|
55
|
+
onSelect: s,
|
|
56
|
+
className: m,
|
|
57
|
+
id: o,
|
|
58
|
+
"aria-label": t,
|
|
59
|
+
"aria-labelledby": b,
|
|
60
|
+
activeIndex: d,
|
|
61
|
+
getOptionId: i,
|
|
62
|
+
optionsFocusable: c = !0,
|
|
63
|
+
selectOnPointerDown: y = !1,
|
|
64
|
+
onOptionHover: f,
|
|
65
|
+
emptyMessage: n,
|
|
66
|
+
fluid: D = !1
|
|
67
|
+
}) {
|
|
68
|
+
const e = [a.dropdown, D ? a.fluid : void 0, m].filter(Boolean).join(" ");
|
|
69
|
+
return /* @__PURE__ */ u(
|
|
70
|
+
"div",
|
|
71
|
+
{
|
|
72
|
+
role: "listbox",
|
|
73
|
+
id: o,
|
|
74
|
+
"aria-label": t,
|
|
75
|
+
"aria-labelledby": b,
|
|
76
|
+
className: e,
|
|
77
|
+
children: r.length === 0 && n ? /* @__PURE__ */ u("div", { className: a.empty, role: "presentation", children: n }) : r.map((l, h) => /* @__PURE__ */ u(
|
|
78
|
+
k,
|
|
79
|
+
{
|
|
80
|
+
id: i == null ? void 0 : i(l.value, h),
|
|
81
|
+
label: l.label,
|
|
82
|
+
value: l.value,
|
|
83
|
+
selected: l.value === v,
|
|
84
|
+
active: d === h,
|
|
85
|
+
disabled: l.disabled,
|
|
86
|
+
leadingIcon: l.leadingIcon,
|
|
87
|
+
focusable: c,
|
|
88
|
+
selectOnPointerDown: y,
|
|
89
|
+
onClick: s,
|
|
90
|
+
onHover: f ? () => f(h) : void 0
|
|
91
|
+
},
|
|
92
|
+
l.value
|
|
93
|
+
))
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
B as Dropdown
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=Dropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../src/Dropdown/Dropdown.tsx"],"sourcesContent":["import React from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport styles from './Dropdown.module.css';\n\n// ─── DropdownItem ────────────────────────────────────────────────────────────\n\nexport interface DropdownItemProps {\n /** Display label for the item. */\n label: string;\n /** Unique value identifying this item. */\n value: string;\n /** Whether the item is currently selected. */\n selected?: boolean;\n /** Whether the item is keyboard-highlighted (combobox usage). */\n active?: boolean;\n /** Whether the item is disabled. */\n disabled?: boolean;\n /** Optional leading icon. */\n leadingIcon?: PhosphorIcon;\n /** DOM id (used for aria-activedescendant wiring in combobox usage). */\n id?: string;\n /** Whether the item is focusable. False when a sibling element owns focus (combobox). */\n focusable?: boolean;\n /** Select on pointer-down instead of click — keeps a sibling input focused. */\n selectOnPointerDown?: boolean;\n /** Called when the item is chosen. */\n onClick?: (value: string) => void;\n /** Called when the pointer enters the item (host can sync highlight). */\n onHover?: () => void;\n}\n\nfunction DropdownItem({\n label,\n value,\n selected = false,\n active = false,\n disabled = false,\n leadingIcon,\n id,\n focusable = true,\n selectOnPointerDown = false,\n onClick,\n onHover,\n}: DropdownItemProps) {\n const cls = [\n styles.item,\n selected ? styles.itemSelected : undefined,\n active ? styles.itemActive : undefined,\n disabled ? styles.itemDisabled : undefined,\n ]\n .filter(Boolean)\n .join(' ');\n\n function choose() {\n if (!disabled && onClick) onClick(value);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLButtonElement>) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n choose();\n }\n }\n\n return (\n <button\n type=\"button\"\n role=\"option\"\n id={id}\n aria-selected={selected}\n aria-disabled={disabled}\n className={cls}\n onClick={selectOnPointerDown ? undefined : choose}\n onMouseDown={\n selectOnPointerDown\n ? (e) => {\n // Prevent the sibling input from blurring before selection registers\n e.preventDefault();\n choose();\n }\n : undefined\n }\n onMouseEnter={onHover}\n onKeyDown={focusable ? handleKeyDown : undefined}\n tabIndex={!focusable || disabled ? -1 : 0}\n >\n {leadingIcon && <Icon as={leadingIcon} size={16} />}\n {label}\n </button>\n );\n}\n\n// ─── Dropdown ────────────────────────────────────────────────────────────────\n\nexport interface DropdownOption {\n /** Display label. */\n label: string;\n /** Unique value. */\n value: string;\n /** Whether this option is disabled. */\n disabled?: boolean;\n /** Optional leading icon. */\n leadingIcon?: PhosphorIcon;\n}\n\nexport interface DropdownProps {\n /** List of options to display in the dropdown panel. */\n options: DropdownOption[];\n /** Currently selected value. */\n selectedValue?: string;\n /** Called when an option is selected. */\n onSelect?: (value: string) => void;\n /** Additional class name for the panel container. */\n className?: string;\n /** DOM id for the listbox (for aria-controls / aria-owns wiring). */\n id?: string;\n /** ARIA label for the listbox. */\n 'aria-label'?: string;\n /** ARIA labelledby for the listbox. */\n 'aria-labelledby'?: string;\n\n /* ─── Combobox building-block usage (e.g. Autocomplete) ─────────────────── */\n /** Index of the keyboard-highlighted option. */\n activeIndex?: number;\n /** Generate the DOM id for an option, enabling aria-activedescendant on a host input. */\n getOptionId?: (value: string, index: number) => string;\n /** When false, options are not focusable — a host element (combobox input) owns focus. */\n optionsFocusable?: boolean;\n /** Select on pointer-down instead of click (keeps a sibling input focused). */\n selectOnPointerDown?: boolean;\n /** Called when the pointer enters an option (host can sync its highlight). */\n onOptionHover?: (index: number) => void;\n /** Message rendered when there are no options. */\n emptyMessage?: string;\n /** Make the panel fill its container width instead of hugging content. */\n fluid?: boolean;\n}\n\nexport function Dropdown({\n options,\n selectedValue,\n onSelect,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n activeIndex,\n getOptionId,\n optionsFocusable = true,\n selectOnPointerDown = false,\n onOptionHover,\n emptyMessage,\n fluid = false,\n}: DropdownProps) {\n const panelCls = [styles.dropdown, fluid ? styles.fluid : undefined, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n role=\"listbox\"\n id={id}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n className={panelCls}\n >\n {options.length === 0 && emptyMessage ? (\n <div className={styles.empty} role=\"presentation\">\n {emptyMessage}\n </div>\n ) : (\n options.map((opt, index) => (\n <DropdownItem\n key={opt.value}\n id={getOptionId?.(opt.value, index)}\n label={opt.label}\n value={opt.value}\n selected={opt.value === selectedValue}\n active={activeIndex === index}\n disabled={opt.disabled}\n leadingIcon={opt.leadingIcon}\n focusable={optionsFocusable}\n selectOnPointerDown={selectOnPointerDown}\n onClick={onSelect}\n onHover={onOptionHover ? () => onOptionHover(index) : undefined}\n />\n ))\n )}\n </div>\n );\n}\n"],"names":["DropdownItem","label","value","selected","active","disabled","leadingIcon","id","focusable","selectOnPointerDown","onClick","onHover","cls","styles","choose","handleKeyDown","jsxs","jsx","Icon","Dropdown","options","selectedValue","onSelect","className","ariaLabel","ariaLabelledby","activeIndex","getOptionId","optionsFocusable","onOptionHover","emptyMessage","fluid","panelCls","opt","index"],"mappings":";;;AAgCA,SAASA,EAAa;AAAA,EACpB,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,UAAAC,IAAW;AAAA,EACX,aAAAC;AAAA,EACA,IAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,qBAAAC,IAAsB;AAAA,EACtB,SAAAC;AAAA,EACA,SAAAC;AACF,GAAsB;AACpB,QAAMC,IAAM;AAAA,IACVC,EAAO;AAAA,IACPV,IAAWU,EAAO,eAAe;AAAA,IACjCT,IAASS,EAAO,aAAa;AAAA,IAC7BR,IAAWQ,EAAO,eAAe;AAAA,EAAA,EAEhC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WAASC,IAAS;AAChB,IAAI,CAACT,KAAYK,KAASA,EAAQR,CAAK;AAAA,EACzC;AAEA,WAASa,EAAc,GAA2C;AAChE,KAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAA,GACFD,EAAA;AAAA,EAEJ;AAEA,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,IAAAT;AAAA,MACA,iBAAeJ;AAAA,MACf,iBAAeE;AAAA,MACf,WAAWO;AAAA,MACX,SAASH,IAAsB,SAAYK;AAAA,MAC3C,aACEL,IACI,CAAC,MAAM;AAEL,UAAE,eAAA,GACFK,EAAA;AAAA,MACF,IACA;AAAA,MAEN,cAAcH;AAAA,MACd,WAAWH,IAAYO,IAAgB;AAAA,MACvC,UAAU,CAACP,KAAaH,IAAW,KAAK;AAAA,MAEvC,UAAA;AAAA,QAAAC,KAAe,gBAAAW,EAACC,GAAA,EAAK,IAAIZ,GAAa,MAAM,IAAI;AAAA,QAChDL;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAgDO,SAASkB,EAAS;AAAA,EACvB,SAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,IAAAhB;AAAA,EACA,cAAciB;AAAA,EACd,mBAAmBC;AAAA,EACnB,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,qBAAAnB,IAAsB;AAAA,EACtB,eAAAoB;AAAA,EACA,cAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,GAAkB;AAChB,QAAMC,IAAW,CAACnB,EAAO,UAAUkB,IAAQlB,EAAO,QAAQ,QAAWU,CAAS,EAC3E,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAN;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,IAAAV;AAAA,MACA,cAAYiB;AAAA,MACZ,mBAAiBC;AAAA,MACjB,WAAWO;AAAA,MAEV,YAAQ,WAAW,KAAKF,IACvB,gBAAAb,EAAC,SAAI,WAAWJ,EAAO,OAAO,MAAK,gBAChC,UAAAiB,GACH,IAEAV,EAAQ,IAAI,CAACa,GAAKC,MAChB,gBAAAjB;AAAA,QAACjB;AAAA,QAAA;AAAA,UAEC,IAAI2B,KAAA,gBAAAA,EAAcM,EAAI,OAAOC;AAAA,UAC7B,OAAOD,EAAI;AAAA,UACX,OAAOA,EAAI;AAAA,UACX,UAAUA,EAAI,UAAUZ;AAAA,UACxB,QAAQK,MAAgBQ;AAAA,UACxB,UAAUD,EAAI;AAAA,UACd,aAAaA,EAAI;AAAA,UACjB,WAAWL;AAAA,UACX,qBAAAnB;AAAA,UACA,SAASa;AAAA,UACT,SAASO,IAAgB,MAAMA,EAAcK,CAAK,IAAI;AAAA,QAAA;AAAA,QAXjDD,EAAI;AAAA,MAAA,CAaZ;AAAA,IAAA;AAAA,EAAA;AAIT;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._scrollable_1rjtm_9{scrollbar-width:thin;scrollbar-color:var(--color-fill-neutral-muted) transparent}._scrollable_1rjtm_9::-webkit-scrollbar{width:8px;height:8px}._scrollable_1rjtm_9::-webkit-scrollbar-track{background:transparent;border-radius:4px}._scrollable_1rjtm_9::-webkit-scrollbar-thumb{background-color:var(--color-fill-neutral-muted);border-radius:4px}._scrollable_1rjtm_9::-webkit-scrollbar-thumb:hover{background-color:var(--color-fill-neutral-default)}._scrollable_1rjtm_9::-webkit-scrollbar-thumb:active{background-color:var(--color-fill-neutral-strong)}._dropdown_1upaa_2{display:inline-flex;flex-direction:column;gap:4px;padding:8px;background-color:var(--color-canvas-neutral-white);border:1px solid var(--color-stroke-neutral-default);border-radius:8px;box-shadow:var(--shadow-layer-sm);min-width:180px;width:max-content;box-sizing:border-box;--dropdown-visible-items: 5;max-height:calc(44px * var(--dropdown-visible-items) + 4px * (var(--dropdown-visible-items) - 1) + 18px);overflow-y:auto}._fluid_1upaa_30{width:100%;min-width:0}._item_1upaa_36{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:4px;background-color:var(--color-canvas-neutral-white);color:var(--color-text-neutral-mudle);font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-14);font-weight:var(--font-weight-medium);line-height:var(--font-line-height-14, 20px);cursor:pointer;border:none;text-align:left;width:100%;box-sizing:border-box;text-decoration:none;white-space:nowrap;transition:background-color .12s ease,color .12s ease}._item_1upaa_36:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._item_1upaa_36:hover:not(._itemDisabled_1upaa_66):not(._itemSelected_1upaa_66){background-color:var(--color-fill-interaction-neutral-subtle-hover)}._itemActive_1upaa_71:not(._itemSelected_1upaa_66){background-color:var(--color-fill-interaction-neutral-subtle-hover)}._itemSelected_1upaa_66{background-color:var(--color-fill-brand-strong);color:var(--color-text-neutral-inverse)}._itemSelected_1upaa_66:hover:not(._itemDisabled_1upaa_66){background-color:var(--color-fill-brand-strong);color:var(--color-text-neutral-inverse)}._itemDisabled_1upaa_66{opacity:.5;cursor:not-allowed;pointer-events:none}._empty_1upaa_94{padding:12px 16px;font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-14);font-weight:var(--font-weight-regular);line-height:var(--font-line-height-14, 20px);color:var(--color-text-neutral-subtle);white-space:nowrap}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import './Dropdown.module.css';const e = "_dropdown_1upaa_2 _scrollable_1rjtm_9", t = "_fluid_1upaa_30", _ = "_item_1upaa_36", i = "_itemDisabled_1upaa_66", a = "_itemSelected_1upaa_66", d = "_itemActive_1upaa_71", m = "_empty_1upaa_94", o = {
|
|
2
|
+
dropdown: e,
|
|
3
|
+
fluid: t,
|
|
4
|
+
item: _,
|
|
5
|
+
itemDisabled: i,
|
|
6
|
+
itemSelected: a,
|
|
7
|
+
itemActive: d,
|
|
8
|
+
empty: m
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
o as default,
|
|
12
|
+
e as dropdown,
|
|
13
|
+
m as empty,
|
|
14
|
+
t as fluid,
|
|
15
|
+
_ as item,
|
|
16
|
+
d as itemActive,
|
|
17
|
+
i as itemDisabled,
|
|
18
|
+
a as itemSelected
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=Dropdown.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
package/Icon/Icon.js
ADDED
package/Icon/Icon.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon.js","sources":["../../src/Icon/Icon.tsx"],"sourcesContent":["import React from 'react';\nimport type { Icon as PhosphorIcon, IconProps as PhosphorIconProps } from '@phosphor-icons/react';\n\nexport type { IconWeight } from '@phosphor-icons/react';\n\nexport interface IconProps extends Omit<PhosphorIconProps, 'weight'> {\n as: PhosphorIcon;\n weight?: PhosphorIconProps['weight'];\n}\n\nexport function Icon({ as: PhIcon, size = 20, weight = 'bold', ...props }: IconProps) {\n return <PhIcon size={size} weight={weight} {...props} />;\n}\n"],"names":["Icon","PhIcon","size","weight","props","jsx"],"mappings":";AAUO,SAASA,EAAK,EAAE,IAAIC,GAAQ,MAAAC,IAAO,IAAI,QAAAC,IAAS,QAAQ,GAAGC,KAAoB;AACpF,SAAO,gBAAAC,EAACJ,GAAA,EAAO,MAAAC,GAAY,QAAAC,GAAiB,GAAGC,GAAO;AACxD;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { Icon as r } from "../Icon/Icon.js";
|
|
3
|
+
import t from "./IconButton.module.css.js";
|
|
4
|
+
const u = {
|
|
5
|
+
ghost: t.variantGhost,
|
|
6
|
+
outline: t.variantOutline,
|
|
7
|
+
subtle: t.variantSubtle
|
|
8
|
+
}, c = {
|
|
9
|
+
xsmall: t.sizeXsmall,
|
|
10
|
+
small: t.sizeSmall,
|
|
11
|
+
medium: t.sizeMedium
|
|
12
|
+
};
|
|
13
|
+
function b({
|
|
14
|
+
icon: n,
|
|
15
|
+
variant: s = "ghost",
|
|
16
|
+
size: e = "medium",
|
|
17
|
+
className: l,
|
|
18
|
+
disabled: o,
|
|
19
|
+
...a
|
|
20
|
+
}) {
|
|
21
|
+
const m = [
|
|
22
|
+
t.iconButton,
|
|
23
|
+
u[s],
|
|
24
|
+
c[e],
|
|
25
|
+
l
|
|
26
|
+
].filter(Boolean).join(" ");
|
|
27
|
+
return /* @__PURE__ */ i(
|
|
28
|
+
"button",
|
|
29
|
+
{
|
|
30
|
+
className: m,
|
|
31
|
+
disabled: o,
|
|
32
|
+
"aria-disabled": o,
|
|
33
|
+
type: "button",
|
|
34
|
+
...a,
|
|
35
|
+
children: /* @__PURE__ */ i(r, { as: n, size: 16 })
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
b as IconButton
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=IconButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconButton.js","sources":["../../src/IconButton/IconButton.tsx"],"sourcesContent":["import React from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport styles from './IconButton.module.css';\n\nexport type IconButtonVariant = 'ghost' | 'outline' | 'subtle';\nexport type IconButtonSize = 'xsmall' | 'small' | 'medium';\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Phosphor icon component to render */\n icon: PhosphorIcon;\n variant?: IconButtonVariant;\n size?: IconButtonSize;\n /** Required for accessibility — always provide a descriptive label */\n 'aria-label': string;\n}\n\nconst VARIANT_CLASS: Record<IconButtonVariant, string> = {\n ghost: styles.variantGhost,\n outline: styles.variantOutline,\n subtle: styles.variantSubtle,\n};\n\nconst SIZE_CLASS: Record<IconButtonSize, string> = {\n xsmall: styles.sizeXsmall,\n small: styles.sizeSmall,\n medium: styles.sizeMedium,\n};\n\nexport function IconButton({\n icon,\n variant = 'ghost',\n size = 'medium',\n className,\n disabled,\n ...props\n}: IconButtonProps) {\n const cls = [\n styles.iconButton,\n VARIANT_CLASS[variant],\n SIZE_CLASS[size],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n className={cls}\n disabled={disabled}\n aria-disabled={disabled}\n type=\"button\"\n {...props}\n >\n <Icon as={icon} size={16} />\n </button>\n );\n}\n"],"names":["VARIANT_CLASS","styles","SIZE_CLASS","IconButton","icon","variant","size","className","disabled","props","cls","jsx","Icon"],"mappings":";;;AAiBA,MAAMA,IAAmD;AAAA,EACvD,OAASC,EAAO;AAAA,EAChB,SAASA,EAAO;AAAA,EAChB,QAASA,EAAO;AAClB,GAEMC,IAA6C;AAAA,EACjD,QAAQD,EAAO;AAAA,EACf,OAAQA,EAAO;AAAA,EACf,QAAQA,EAAO;AACjB;AAEO,SAASE,EAAW;AAAA,EACzB,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAoB;AAClB,QAAMC,IAAM;AAAA,IACVT,EAAO;AAAA,IACPD,EAAcK,CAAO;AAAA,IACrBH,EAAWI,CAAI;AAAA,IACfC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWD;AAAA,MACX,UAAAF;AAAA,MACA,iBAAeA;AAAA,MACf,MAAK;AAAA,MACJ,GAAGC;AAAA,MAEJ,UAAA,gBAAAE,EAACC,GAAA,EAAK,IAAIR,GAAM,MAAM,GAAA,CAAI;AAAA,IAAA;AAAA,EAAA;AAGhC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._iconButton_1j1h2_2{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;border-radius:9999px;border:1px solid transparent;cursor:pointer;padding:0;background:none;transition:background-color .12s ease,border-color .12s ease,opacity .12s ease,box-shadow .12s ease}._iconButton_1j1h2_2:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._iconButton_1j1h2_2:disabled,._iconButton_1j1h2_2[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}._sizeXsmall_1j1h2_33{width:32px;height:32px}._sizeSmall_1j1h2_34{width:36px;height:36px}._sizeMedium_1j1h2_35{width:40px;height:40px}._variantGhost_1j1h2_40{background-color:transparent;border-color:transparent;color:var(--color-icon-neutral-default)}._variantGhost_1j1h2_40:hover:not(:disabled){background-color:var(--color-fill-neutral-subtle)}._variantOutline_1j1h2_53{background-color:var(--color-canvas-neutral-white);border-color:var(--color-stroke-neutral-default);color:var(--color-icon-neutral-default)}._variantOutline_1j1h2_53:hover:not(:disabled){border-color:var(--color-stroke-interaction-neutral-hover)}._variantSubtle_1j1h2_66{background-color:var(--color-fill-brand-subtle);border-color:transparent;color:var(--color-icon-brand-default)}._variantSubtle_1j1h2_66:hover:not(:disabled){background-color:var(--color-fill-brand-muted)}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import './IconButton.module.css';const t = "_iconButton_1j1h2_2", i = "_sizeXsmall_1j1h2_33", a = "_sizeSmall_1j1h2_34", n = "_sizeMedium_1j1h2_35", s = "_variantGhost_1j1h2_40", e = "_variantOutline_1j1h2_53", _ = "_variantSubtle_1j1h2_66", l = {
|
|
2
|
+
iconButton: t,
|
|
3
|
+
sizeXsmall: i,
|
|
4
|
+
sizeSmall: a,
|
|
5
|
+
sizeMedium: n,
|
|
6
|
+
variantGhost: s,
|
|
7
|
+
variantOutline: e,
|
|
8
|
+
variantSubtle: _
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
l as default,
|
|
12
|
+
t as iconButton,
|
|
13
|
+
n as sizeMedium,
|
|
14
|
+
a as sizeSmall,
|
|
15
|
+
i as sizeXsmall,
|
|
16
|
+
s as variantGhost,
|
|
17
|
+
e as variantOutline,
|
|
18
|
+
_ as variantSubtle
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=IconButton.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconButton.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { jsxs as p, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useId as X, useState as N } from "react";
|
|
3
|
+
import { MinusCircle as Y, PlusCircle as q, CheckCircle as G, XCircle as J, Warning as K, Info as Q } from "@phosphor-icons/react";
|
|
4
|
+
import { Icon as h } from "../Icon/Icon.js";
|
|
5
|
+
import n from "./InputNumber.module.css.js";
|
|
6
|
+
const R = {
|
|
7
|
+
default: Q,
|
|
8
|
+
warning: K,
|
|
9
|
+
danger: J,
|
|
10
|
+
success: G
|
|
11
|
+
}, Z = {
|
|
12
|
+
default: "",
|
|
13
|
+
danger: n.fieldDanger,
|
|
14
|
+
success: n.fieldSuccess
|
|
15
|
+
}, ee = {
|
|
16
|
+
default: "",
|
|
17
|
+
warning: n.hintWarning,
|
|
18
|
+
danger: n.hintDanger,
|
|
19
|
+
success: n.hintSuccess
|
|
20
|
+
};
|
|
21
|
+
function le({
|
|
22
|
+
value: b,
|
|
23
|
+
defaultValue: S = 0,
|
|
24
|
+
min: l,
|
|
25
|
+
max: o,
|
|
26
|
+
step: I = 1,
|
|
27
|
+
onChange: d,
|
|
28
|
+
label: y = "Label",
|
|
29
|
+
showLabel: M = !0,
|
|
30
|
+
hint: u,
|
|
31
|
+
hintType: T,
|
|
32
|
+
status: c = "default",
|
|
33
|
+
disabled: a = !1,
|
|
34
|
+
placeholder: j = "Placeholder",
|
|
35
|
+
className: x,
|
|
36
|
+
id: A
|
|
37
|
+
}) {
|
|
38
|
+
const B = X(), r = A ?? `input-number-${B}`, g = b !== void 0, [D, F] = N(S), [v, m] = N(null), i = g ? b : D, C = T ?? (c === "danger" ? "danger" : c === "success" ? "success" : "default"), _ = (t) => {
|
|
39
|
+
let e = t;
|
|
40
|
+
return l !== void 0 && (e = Math.max(l, e)), o !== void 0 && (e = Math.min(o, e)), e;
|
|
41
|
+
}, f = (t) => {
|
|
42
|
+
const e = _(t);
|
|
43
|
+
g || F(e), d == null || d(e);
|
|
44
|
+
}, w = () => f(i + I), H = () => f(i - I), L = () => m(String(i)), V = (t) => {
|
|
45
|
+
const e = t.target.value;
|
|
46
|
+
(e === "" || e === "-" || /^-?\d*\.?\d*$/.test(e)) && m(e);
|
|
47
|
+
}, $ = () => {
|
|
48
|
+
const t = parseFloat(v ?? "");
|
|
49
|
+
isNaN(t) || f(t), m(null);
|
|
50
|
+
}, k = v ?? String(i), z = l !== void 0 && i <= l, E = o !== void 0 && i >= o, P = R[C], W = [n.root, a ? n.disabled : "", x].filter(Boolean).join(" "), O = [n.field, Z[c]].filter(Boolean).join(" "), U = [n.hint, ee[C]].filter(Boolean).join(" ");
|
|
51
|
+
return /* @__PURE__ */ p("div", { className: W, children: [
|
|
52
|
+
M && /* @__PURE__ */ s("label", { className: n.label, htmlFor: r, children: y }),
|
|
53
|
+
/* @__PURE__ */ p("div", { className: O, children: [
|
|
54
|
+
/* @__PURE__ */ s(
|
|
55
|
+
"button",
|
|
56
|
+
{
|
|
57
|
+
type: "button",
|
|
58
|
+
className: n.btn,
|
|
59
|
+
onClick: H,
|
|
60
|
+
disabled: a || z,
|
|
61
|
+
"aria-label": "Decrementar",
|
|
62
|
+
tabIndex: -1,
|
|
63
|
+
children: /* @__PURE__ */ s(h, { as: Y, size: 20 })
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ s(
|
|
67
|
+
"input",
|
|
68
|
+
{
|
|
69
|
+
id: r,
|
|
70
|
+
type: "text",
|
|
71
|
+
inputMode: "decimal",
|
|
72
|
+
className: n.input,
|
|
73
|
+
value: k,
|
|
74
|
+
placeholder: j,
|
|
75
|
+
disabled: a,
|
|
76
|
+
"aria-disabled": a,
|
|
77
|
+
"aria-describedby": u ? `${r}-hint` : void 0,
|
|
78
|
+
"aria-invalid": c === "danger" ? !0 : void 0,
|
|
79
|
+
onChange: V,
|
|
80
|
+
onFocus: L,
|
|
81
|
+
onBlur: $
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
/* @__PURE__ */ s(
|
|
85
|
+
"button",
|
|
86
|
+
{
|
|
87
|
+
type: "button",
|
|
88
|
+
className: n.btn,
|
|
89
|
+
onClick: w,
|
|
90
|
+
disabled: a || E,
|
|
91
|
+
"aria-label": "Incrementar",
|
|
92
|
+
tabIndex: -1,
|
|
93
|
+
children: /* @__PURE__ */ s(h, { as: q, size: 20 })
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
] }),
|
|
97
|
+
u && /* @__PURE__ */ p("div", { id: `${r}-hint`, className: U, children: [
|
|
98
|
+
/* @__PURE__ */ s(h, { as: P, size: 16, weight: "bold" }),
|
|
99
|
+
/* @__PURE__ */ s("span", { children: u })
|
|
100
|
+
] })
|
|
101
|
+
] });
|
|
102
|
+
}
|
|
103
|
+
export {
|
|
104
|
+
le as InputNumber
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=InputNumber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputNumber.js","sources":["../../src/InputNumber/InputNumber.tsx"],"sourcesContent":["import React, { useId, useState } from 'react';\nimport { PlusCircle, MinusCircle, Info, Warning, XCircle, CheckCircle } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport styles from './InputNumber.module.css';\n\nexport type InputNumberStatus = 'default' | 'danger' | 'success';\nexport type InputNumberHintType = 'default' | 'warning' | 'danger' | 'success';\n\nexport interface InputNumberProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n label?: string;\n showLabel?: boolean;\n hint?: string;\n hintType?: InputNumberHintType;\n status?: InputNumberStatus;\n disabled?: boolean;\n placeholder?: string;\n className?: string;\n id?: string;\n}\n\nconst HINT_ICON = {\n default: Info,\n warning: Warning,\n danger: XCircle,\n success: CheckCircle,\n} as const;\n\nconst FIELD_STATUS_CLASS: Record<InputNumberStatus, string> = {\n default: '',\n danger: styles.fieldDanger,\n success: styles.fieldSuccess,\n};\n\nconst HINT_TYPE_CLASS: Record<InputNumberHintType, string> = {\n default: '',\n warning: styles.hintWarning,\n danger: styles.hintDanger,\n success: styles.hintSuccess,\n};\n\nexport function InputNumber({\n value: valueProp,\n defaultValue = 0,\n min,\n max,\n step = 1,\n onChange,\n label = 'Label',\n showLabel = true,\n hint,\n hintType,\n status = 'default',\n disabled = false,\n placeholder = 'Placeholder',\n className,\n id: idProp,\n}: InputNumberProps) {\n const generatedId = useId();\n const inputId = idProp ?? `input-number-${generatedId}`;\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<number>(defaultValue);\n const [editStr, setEditStr] = useState<string | null>(null);\n\n const currentValue = isControlled ? valueProp! : internalValue;\n\n const resolvedHintType: InputNumberHintType =\n hintType ?? (status === 'danger' ? 'danger' : status === 'success' ? 'success' : 'default');\n\n const clamp = (v: number): number => {\n let result = v;\n if (min !== undefined) result = Math.max(min, result);\n if (max !== undefined) result = Math.min(max, result);\n return result;\n };\n\n const commit = (v: number) => {\n const clamped = clamp(v);\n if (!isControlled) setInternalValue(clamped);\n onChange?.(clamped);\n };\n\n const handleIncrement = () => commit(currentValue + step);\n const handleDecrement = () => commit(currentValue - step);\n\n const handleFocus = () => setEditStr(String(currentValue));\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value;\n if (raw === '' || raw === '-' || /^-?\\d*\\.?\\d*$/.test(raw)) {\n setEditStr(raw);\n }\n };\n const handleBlur = () => {\n const parsed = parseFloat(editStr ?? '');\n if (!isNaN(parsed)) commit(parsed);\n setEditStr(null);\n };\n\n const displayValue = editStr ?? String(currentValue);\n const isAtMin = min !== undefined && currentValue <= min;\n const isAtMax = max !== undefined && currentValue >= max;\n\n const HintIconComponent = HINT_ICON[resolvedHintType];\n\n const rootClasses = [styles.root, disabled ? styles.disabled : '', className]\n .filter(Boolean)\n .join(' ');\n const fieldClasses = [styles.field, FIELD_STATUS_CLASS[status]].filter(Boolean).join(' ');\n const hintClasses = [styles.hint, HINT_TYPE_CLASS[resolvedHintType]].filter(Boolean).join(' ');\n\n return (\n <div className={rootClasses}>\n {showLabel && (\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n )}\n <div className={fieldClasses}>\n <button\n type=\"button\"\n className={styles.btn}\n onClick={handleDecrement}\n disabled={disabled || isAtMin}\n aria-label=\"Decrementar\"\n tabIndex={-1}\n >\n <Icon as={MinusCircle} size={20} />\n </button>\n <input\n id={inputId}\n type=\"text\"\n inputMode=\"decimal\"\n className={styles.input}\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n aria-disabled={disabled}\n aria-describedby={hint ? `${inputId}-hint` : undefined}\n aria-invalid={status === 'danger' ? true : undefined}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <button\n type=\"button\"\n className={styles.btn}\n onClick={handleIncrement}\n disabled={disabled || isAtMax}\n aria-label=\"Incrementar\"\n tabIndex={-1}\n >\n <Icon as={PlusCircle} size={20} />\n </button>\n </div>\n {hint && (\n <div id={`${inputId}-hint`} className={hintClasses}>\n <Icon as={HintIconComponent} size={16} weight=\"bold\" />\n <span>{hint}</span>\n </div>\n )}\n </div>\n );\n}\n"],"names":["HINT_ICON","Info","Warning","XCircle","CheckCircle","FIELD_STATUS_CLASS","styles","HINT_TYPE_CLASS","InputNumber","valueProp","defaultValue","min","max","step","onChange","label","showLabel","hint","hintType","status","disabled","placeholder","className","idProp","generatedId","useId","inputId","isControlled","internalValue","setInternalValue","useState","editStr","setEditStr","currentValue","resolvedHintType","clamp","v","result","commit","clamped","handleIncrement","handleDecrement","handleFocus","handleInputChange","e","raw","handleBlur","parsed","displayValue","isAtMin","isAtMax","HintIconComponent","rootClasses","fieldClasses","hintClasses","jsxs","jsx","Icon","MinusCircle","PlusCircle"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._root_107d9_1{display:flex;flex-direction:column;gap:4px;width:100%;font-family:var(--font-family-base, system-ui, sans-serif)}._label_107d9_9{font-size:var(--font-size-14);font-weight:var(--font-weight-medium);line-height:var(--font-line-height-14);color:var(--color-text-neutral-mudle)}._field_107d9_16{display:flex;align-items:center;gap:8px;height:42px;padding:4px 12px;border-radius:8px;border:1px solid transparent;background-color:var(--color-fill-neutral-muted);transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease}._field_107d9_16:hover:not(:focus-within):not(._fieldDanger_107d9_28):not(._fieldSuccess_107d9_28){background-color:var(--color-fill-interaction-neutral-muted-hover)}._field_107d9_16:focus-within{background-color:#fff;border-color:var(--color-stroke-interaction-brand-focus);box-shadow:var(--shadow-focus)}._fieldDanger_107d9_28{background-color:var(--color-fill-feedback-danger-subtle);border-color:var(--color-stroke-feedback-danger-default)}._fieldSuccess_107d9_28{background-color:var(--color-fill-feedback-success-subtle)}._btn_107d9_47{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;padding:0;border:none;background:transparent;cursor:pointer;color:var(--color-icon-brand-default);line-height:0}._btn_107d9_47:disabled{opacity:.4;cursor:not-allowed}._input_107d9_67{flex:1 0 0;min-width:1px;border:none;background:transparent;outline:none;font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-14);line-height:var(--font-line-height-14);color:var(--color-text-neutral-mudle);text-align:center}._input_107d9_67::placeholder{color:var(--color-text-neutral-subtlest)}._disabled_107d9_84{opacity:.5;cursor:not-allowed;pointer-events:none}._hint_107d9_90{display:flex;align-items:center;gap:4px;font-size:var(--font-size-12);line-height:var(--font-line-height-12);color:var(--color-text-neutral-mudle)}._hintWarning_107d9_99{color:var(--color-text-feedback-warning-default)}._hintDanger_107d9_103{color:var(--color-text-feedback-danger-default)}._hintSuccess_107d9_107{color:var(--color-text-feedback-success-default)}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import './InputNumber.module.css';const n = "_root_107d9_1", t = "_label_107d9_9", _ = "_field_107d9_16", s = "_fieldDanger_107d9_28", e = "_fieldSuccess_107d9_28", i = "_btn_107d9_47", d = "_input_107d9_67", c = "_disabled_107d9_84", l = "_hint_107d9_90", o = "_hintWarning_107d9_99", a = "_hintDanger_107d9_103", r = "_hintSuccess_107d9_107", h = {
|
|
2
|
+
root: n,
|
|
3
|
+
label: t,
|
|
4
|
+
field: _,
|
|
5
|
+
fieldDanger: s,
|
|
6
|
+
fieldSuccess: e,
|
|
7
|
+
btn: i,
|
|
8
|
+
input: d,
|
|
9
|
+
disabled: c,
|
|
10
|
+
hint: l,
|
|
11
|
+
hintWarning: o,
|
|
12
|
+
hintDanger: a,
|
|
13
|
+
hintSuccess: r
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
i as btn,
|
|
17
|
+
h as default,
|
|
18
|
+
c as disabled,
|
|
19
|
+
_ as field,
|
|
20
|
+
s as fieldDanger,
|
|
21
|
+
e as fieldSuccess,
|
|
22
|
+
l as hint,
|
|
23
|
+
a as hintDanger,
|
|
24
|
+
r as hintSuccess,
|
|
25
|
+
o as hintWarning,
|
|
26
|
+
d as input,
|
|
27
|
+
t as label,
|
|
28
|
+
n as root
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=InputNumber.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputNumber.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
|
package/Menu/Menu.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { jsxs as l, jsx as n, Fragment as L } from "react/jsx-runtime";
|
|
2
|
+
import S from "react";
|
|
3
|
+
import { Article as O, CaretDown as E } from "@phosphor-icons/react";
|
|
4
|
+
import { Icon as C } from "../Icon/Icon.js";
|
|
5
|
+
import { defaultMenuSections as A } from "./menuData.js";
|
|
6
|
+
import e from "./Menu.module.css.js";
|
|
7
|
+
function w({
|
|
8
|
+
item: o,
|
|
9
|
+
size: r,
|
|
10
|
+
nested: d = !1,
|
|
11
|
+
openSubmenuKey: u,
|
|
12
|
+
onSubmenuToggle: m
|
|
13
|
+
}) {
|
|
14
|
+
const { key: i, label: h, icon: p, active: a = !1, disabled: c = !1, onClick: f, children: b } = o, y = r === "opened", t = !!(b && b.length), s = u === i, [j, x] = S.useState(null), v = (k) => {
|
|
15
|
+
const N = k.currentTarget.getBoundingClientRect();
|
|
16
|
+
x({ top: N.top + N.height / 2, left: N.right + 8 });
|
|
17
|
+
}, g = () => x(null), B = j && /* @__PURE__ */ n(
|
|
18
|
+
"span",
|
|
19
|
+
{
|
|
20
|
+
className: e.tooltip,
|
|
21
|
+
style: { top: j.top, left: j.left },
|
|
22
|
+
"aria-hidden": "true",
|
|
23
|
+
children: h
|
|
24
|
+
}
|
|
25
|
+
), M = () => {
|
|
26
|
+
c || (t && m(i), f == null || f(i));
|
|
27
|
+
};
|
|
28
|
+
if (y) {
|
|
29
|
+
const k = [
|
|
30
|
+
e.item,
|
|
31
|
+
d ? e.itemNested : "",
|
|
32
|
+
a ? e.stateActive : ""
|
|
33
|
+
].filter(Boolean).join(" "), N = [
|
|
34
|
+
e.itemCaret,
|
|
35
|
+
s ? e.itemCaretExpanded : ""
|
|
36
|
+
].filter(Boolean).join(" ");
|
|
37
|
+
return /* @__PURE__ */ l(L, { children: [
|
|
38
|
+
/* @__PURE__ */ l(
|
|
39
|
+
"button",
|
|
40
|
+
{
|
|
41
|
+
className: k,
|
|
42
|
+
disabled: c,
|
|
43
|
+
"aria-disabled": c || void 0,
|
|
44
|
+
"aria-current": a ? "page" : void 0,
|
|
45
|
+
"aria-expanded": t ? s : void 0,
|
|
46
|
+
onClick: M,
|
|
47
|
+
onMouseEnter: v,
|
|
48
|
+
onMouseLeave: g,
|
|
49
|
+
onFocus: v,
|
|
50
|
+
onBlur: g,
|
|
51
|
+
type: "button",
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ l("span", { className: e.itemLeading, children: [
|
|
54
|
+
p && !d && /* @__PURE__ */ n("span", { className: e.itemIcon, children: /* @__PURE__ */ n(C, { as: p, size: 20, weight: "bold" }) }),
|
|
55
|
+
/* @__PURE__ */ n("span", { className: e.itemLabel, children: h })
|
|
56
|
+
] }),
|
|
57
|
+
t && /* @__PURE__ */ n("span", { className: N, children: /* @__PURE__ */ n(C, { as: E, size: 12, weight: "bold" }) }),
|
|
58
|
+
B
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
t && /* @__PURE__ */ n(
|
|
63
|
+
"div",
|
|
64
|
+
{
|
|
65
|
+
className: [e.submenu, s ? e.submenuExpanded : ""].filter(Boolean).join(" "),
|
|
66
|
+
"aria-hidden": s ? void 0 : !0,
|
|
67
|
+
children: /* @__PURE__ */ n("div", { className: e.submenuInner, role: "group", children: b.map((T) => /* @__PURE__ */ n(
|
|
68
|
+
w,
|
|
69
|
+
{
|
|
70
|
+
item: T,
|
|
71
|
+
size: r,
|
|
72
|
+
nested: !0,
|
|
73
|
+
openSubmenuKey: u,
|
|
74
|
+
onSubmenuToggle: m
|
|
75
|
+
},
|
|
76
|
+
T.key
|
|
77
|
+
)) })
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
] });
|
|
81
|
+
}
|
|
82
|
+
const I = [
|
|
83
|
+
e.itemClosed,
|
|
84
|
+
a ? e.stateActive : ""
|
|
85
|
+
].filter(Boolean).join(" ");
|
|
86
|
+
return /* @__PURE__ */ l(
|
|
87
|
+
"button",
|
|
88
|
+
{
|
|
89
|
+
className: I,
|
|
90
|
+
disabled: c,
|
|
91
|
+
"aria-disabled": c || void 0,
|
|
92
|
+
"aria-current": a ? "page" : void 0,
|
|
93
|
+
"aria-label": h,
|
|
94
|
+
onClick: M,
|
|
95
|
+
onMouseEnter: v,
|
|
96
|
+
onMouseLeave: g,
|
|
97
|
+
onFocus: v,
|
|
98
|
+
onBlur: g,
|
|
99
|
+
type: "button",
|
|
100
|
+
children: [
|
|
101
|
+
p && /* @__PURE__ */ n("span", { className: e.itemIcon, children: /* @__PURE__ */ n(C, { as: p, size: 20, weight: "bold" }) }),
|
|
102
|
+
B
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
function F({ section: o, size: r, openSubmenuKey: d, onSubmenuToggle: u }) {
|
|
108
|
+
const m = r === "opened";
|
|
109
|
+
return /* @__PURE__ */ l("div", { className: e.section, children: [
|
|
110
|
+
m && o.title && /* @__PURE__ */ n("div", { className: e.sectionTitle, children: o.title }),
|
|
111
|
+
/* @__PURE__ */ n("div", { className: e.itemGroup, children: o.items.map((i) => /* @__PURE__ */ n(
|
|
112
|
+
w,
|
|
113
|
+
{
|
|
114
|
+
item: i,
|
|
115
|
+
size: r,
|
|
116
|
+
openSubmenuKey: d,
|
|
117
|
+
onSubmenuToggle: u
|
|
118
|
+
},
|
|
119
|
+
i.key
|
|
120
|
+
)) })
|
|
121
|
+
] });
|
|
122
|
+
}
|
|
123
|
+
function V({
|
|
124
|
+
size: o = "opened",
|
|
125
|
+
sections: r = A,
|
|
126
|
+
logo: d,
|
|
127
|
+
logoMark: u,
|
|
128
|
+
showFooter: m = !0,
|
|
129
|
+
onTermsClick: i,
|
|
130
|
+
onPrivacyClick: h,
|
|
131
|
+
className: p
|
|
132
|
+
}) {
|
|
133
|
+
const a = o === "opened", [c, f] = S.useState(null), b = (t) => {
|
|
134
|
+
f((s) => s === t ? null : t);
|
|
135
|
+
}, y = [
|
|
136
|
+
e.menu,
|
|
137
|
+
a ? e.menuOpened : e.menuClosed,
|
|
138
|
+
p
|
|
139
|
+
].filter(Boolean).join(" ");
|
|
140
|
+
return /* @__PURE__ */ l("nav", { className: y, "aria-label": "Side navigation", children: [
|
|
141
|
+
/* @__PURE__ */ n("div", { className: e.logo, children: a ? d ?? null : u ?? null }),
|
|
142
|
+
/* @__PURE__ */ n("div", { className: e.content, children: r.map((t, s) => /* @__PURE__ */ n(
|
|
143
|
+
F,
|
|
144
|
+
{
|
|
145
|
+
section: t,
|
|
146
|
+
size: o,
|
|
147
|
+
openSubmenuKey: c,
|
|
148
|
+
onSubmenuToggle: b
|
|
149
|
+
},
|
|
150
|
+
t.title ?? `section-${s}`
|
|
151
|
+
)) }),
|
|
152
|
+
a && m && /* @__PURE__ */ l("footer", { className: e.footer, children: [
|
|
153
|
+
/* @__PURE__ */ n("span", { className: e.footerIcon, children: /* @__PURE__ */ n(C, { as: O, size: 20, weight: "bold" }) }),
|
|
154
|
+
/* @__PURE__ */ l("p", { className: e.footerText, children: [
|
|
155
|
+
"Veja nosso ",
|
|
156
|
+
/* @__PURE__ */ n(
|
|
157
|
+
"button",
|
|
158
|
+
{
|
|
159
|
+
type: "button",
|
|
160
|
+
className: e.footerLink,
|
|
161
|
+
onClick: i,
|
|
162
|
+
children: "Termo de uso"
|
|
163
|
+
}
|
|
164
|
+
),
|
|
165
|
+
" e ",
|
|
166
|
+
/* @__PURE__ */ n(
|
|
167
|
+
"button",
|
|
168
|
+
{
|
|
169
|
+
type: "button",
|
|
170
|
+
className: e.footerLink,
|
|
171
|
+
onClick: h,
|
|
172
|
+
children: "Política de privacidade"
|
|
173
|
+
}
|
|
174
|
+
)
|
|
175
|
+
] })
|
|
176
|
+
] })
|
|
177
|
+
] });
|
|
178
|
+
}
|
|
179
|
+
export {
|
|
180
|
+
V as Menu
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=Menu.js.map
|
package/Menu/Menu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.js","sources":["../../src/Menu/Menu.tsx"],"sourcesContent":["import React from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { CaretDown, Article } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport { defaultMenuSections } from './menuData.js';\nimport styles from './Menu.module.css';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type MenuSize = 'opened' | 'closed';\nexport type MenuItemState = 'default' | 'hover' | 'active';\n\nexport interface MenuItemDef {\n /** Unique key for this item */\n key: string;\n /** Display label (shown in opened mode) */\n label: string;\n /** Phosphor icon component */\n icon?: PhosphorIcon;\n /** Whether this item is the current active page */\n active?: boolean;\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: (key: string) => void;\n /**\n * Nested sub-items. When present, the item becomes an expandable parent:\n * a trailing caret is shown and clicking toggles the submenu (Figma\n * \".Menu / <group>\" expanded state — sub-items indented).\n */\n children?: MenuItemDef[];\n}\n\nexport interface MenuSectionDef {\n /** Optional section subtitle shown in opened mode */\n title?: string;\n /** Items in this section */\n items: MenuItemDef[];\n}\n\nexport interface MenuProps {\n /** Opened (240px) or closed (72px) layout */\n size?: MenuSize;\n /**\n * Navigation sections, each with an optional title and items. Quando omitido,\n * usa `defaultMenuSections` (menu Vector fiel ao Figma). Passe explicitamente\n * para renderizar outro conjunto de itens.\n */\n sections?: MenuSectionDef[];\n /** Logo element rendered at the top (full logo for opened, small mark for closed) */\n logo?: React.ReactNode;\n /** Small logo mark shown in closed state */\n logoMark?: React.ReactNode;\n /** Whether to show the footer terms section */\n showFooter?: boolean;\n /** Terms of use link click handler */\n onTermsClick?: () => void;\n /** Privacy policy link click handler */\n onPrivacyClick?: () => void;\n className?: string;\n}\n\n// ─── MenuItem ─────────────────────────────────────────────────────────────────\n\ninterface MenuItemProps {\n item: MenuItemDef;\n size: MenuSize;\n /** Indented sub-item rendered inside an expanded parent. */\n nested?: boolean;\n /** Key of the currently open submenu (accordion — only one at a time). */\n openSubmenuKey: string | null;\n /** Notify parent to toggle a submenu by key. */\n onSubmenuToggle: (key: string) => void;\n}\n\nfunction MenuItem({\n item,\n size,\n nested = false,\n openSubmenuKey,\n onSubmenuToggle,\n}: MenuItemProps) {\n const { key, label, icon, active = false, disabled = false, onClick, children } = item;\n\n const isOpened = size === 'opened';\n const hasChildren = !!(children && children.length);\n const expanded = openSubmenuKey === key;\n\n // Tooltip posicionado via `position: fixed` + coordenadas do botão.\n // O menu usa `overflow: hidden` e a área de conteúdo tem scroll, então\n // um tooltip `absolute` seria recortado — `fixed` escapa do clipping.\n const [tipPos, setTipPos] = React.useState<{ top: number; left: number } | null>(null);\n\n const showTooltip = (e: React.MouseEvent | React.FocusEvent) => {\n const r = e.currentTarget.getBoundingClientRect();\n setTipPos({ top: r.top + r.height / 2, left: r.right + 8 });\n };\n const hideTooltip = () => setTipPos(null);\n\n // Decorativo: o nome acessível do item já vem do label visível (aberto)\n // ou do `aria-label` (fechado), então o tooltip fica fora da árvore de a11y.\n const tooltip = tipPos && (\n <span\n className={styles.tooltip}\n style={{ top: tipPos.top, left: tipPos.left }}\n aria-hidden=\"true\"\n >\n {label}\n </span>\n );\n\n const handleClick = () => {\n if (disabled) return;\n if (hasChildren) onSubmenuToggle(key);\n onClick?.(key);\n };\n\n if (isOpened) {\n const itemClass = [\n styles.item,\n nested ? styles.itemNested : '',\n active ? styles.stateActive : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const caretClass = [\n styles.itemCaret,\n expanded ? styles.itemCaretExpanded : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <>\n <button\n className={itemClass}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n aria-current={active ? 'page' : undefined}\n aria-expanded={hasChildren ? expanded : undefined}\n onClick={handleClick}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n onFocus={showTooltip}\n onBlur={hideTooltip}\n type=\"button\"\n >\n <span className={styles.itemLeading}>\n {/* Sub-itens (nested) não têm ícone no Figma (Show Leading Icon=false) */}\n {icon && !nested && (\n <span className={styles.itemIcon}>\n <Icon as={icon} size={20} weight=\"bold\" />\n </span>\n )}\n <span className={styles.itemLabel}>{label}</span>\n </span>\n {/* Caret só quando o item tem submenu (Figma: Show Trailing Icon) */}\n {hasChildren && (\n <span className={caretClass}>\n <Icon as={CaretDown} size={12} weight=\"bold\" />\n </span>\n )}\n {/* Cada item tem tooltip (mostra o label completo no hover) */}\n {tooltip}\n </button>\n\n {hasChildren && (\n <div\n className={[styles.submenu, expanded ? styles.submenuExpanded : ''].filter(Boolean).join(' ')}\n aria-hidden={expanded ? undefined : true}\n >\n <div className={styles.submenuInner} role=\"group\">\n {children!.map((child) => (\n <MenuItem\n key={child.key}\n item={child}\n size={size}\n nested\n openSubmenuKey={openSubmenuKey}\n onSubmenuToggle={onSubmenuToggle}\n />\n ))}\n </div>\n </div>\n )}\n </>\n );\n }\n\n // Closed: icon-only pill with tooltip\n const closedClass = [\n styles.itemClosed,\n active ? styles.stateActive : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n className={closedClass}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n aria-current={active ? 'page' : undefined}\n aria-label={label}\n onClick={handleClick}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n onFocus={showTooltip}\n onBlur={hideTooltip}\n type=\"button\"\n >\n {icon && (\n <span className={styles.itemIcon}>\n <Icon as={icon} size={20} weight=\"bold\" />\n </span>\n )}\n {tooltip}\n </button>\n );\n}\n\n// ─── MenuSection ──────────────────────────────────────────────────────────────\n\ninterface MenuSectionProps {\n section: MenuSectionDef;\n size: MenuSize;\n openSubmenuKey: string | null;\n onSubmenuToggle: (key: string) => void;\n}\n\nfunction MenuSection({ section, size, openSubmenuKey, onSubmenuToggle }: MenuSectionProps) {\n const isOpened = size === 'opened';\n\n return (\n <div className={styles.section}>\n {isOpened && section.title && (\n <div className={styles.sectionTitle}>{section.title}</div>\n )}\n <div className={styles.itemGroup}>\n {section.items.map((item) => (\n <MenuItem\n key={item.key}\n item={item}\n size={size}\n openSubmenuKey={openSubmenuKey}\n onSubmenuToggle={onSubmenuToggle}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ─── Menu ─────────────────────────────────────────────────────────────────────\n\nexport function Menu({\n size = 'opened',\n sections = defaultMenuSections,\n logo,\n logoMark,\n showFooter = true,\n onTermsClick,\n onPrivacyClick,\n className,\n}: MenuProps) {\n const isOpened = size === 'opened';\n\n // Accordion: apenas um submenu aberto por vez. Clicar no mesmo fecha.\n const [openSubmenuKey, setOpenSubmenuKey] = React.useState<string | null>(null);\n\n const handleSubmenuToggle = (key: string) => {\n setOpenSubmenuKey((prev) => (prev === key ? null : key));\n };\n\n const menuClass = [\n styles.menu,\n isOpened ? styles.menuOpened : styles.menuClosed,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <nav className={menuClass} aria-label=\"Side navigation\">\n {/* Logo header */}\n <div className={styles.logo}>\n {isOpened\n ? (logo ?? null)\n : (logoMark ?? null)}\n </div>\n\n {/* Scrollable sections */}\n <div className={styles.content}>\n {sections.map((section, idx) => (\n <MenuSection\n key={section.title ?? `section-${idx}`}\n section={section}\n size={size}\n openSubmenuKey={openSubmenuKey}\n onSubmenuToggle={handleSubmenuToggle}\n />\n ))}\n </div>\n\n {/* Terms footer */}\n {isOpened && showFooter && (\n <footer className={styles.footer}>\n <span className={styles.footerIcon}>\n <Icon as={Article} size={20} weight=\"bold\" />\n </span>\n <p className={styles.footerText}>\n {'Veja nosso '}\n <button\n type=\"button\"\n className={styles.footerLink}\n onClick={onTermsClick}\n >\n Termo de uso\n </button>\n {' e '}\n <button\n type=\"button\"\n className={styles.footerLink}\n onClick={onPrivacyClick}\n >\n Política de privacidade\n </button>\n </p>\n </footer>\n )}\n </nav>\n );\n}\n"],"names":["MenuItem","item","size","nested","openSubmenuKey","onSubmenuToggle","key","label","icon","active","disabled","onClick","children","isOpened","hasChildren","expanded","tipPos","setTipPos","React","showTooltip","e","r","hideTooltip","tooltip","jsx","styles","handleClick","itemClass","caretClass","jsxs","Fragment","Icon","CaretDown","child","closedClass","MenuSection","section","Menu","sections","defaultMenuSections","logo","logoMark","showFooter","onTermsClick","onPrivacyClick","className","setOpenSubmenuKey","handleSubmenuToggle","prev","menuClass","idx","Article"],"mappings":"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"}
|