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.
Files changed (218) hide show
  1. package/Accordion/Accordion.js +79 -0
  2. package/Accordion/Accordion.js.map +1 -0
  3. package/Accordion/Accordion.module.css +1 -0
  4. package/Accordion/Accordion.module.css.js +36 -0
  5. package/Accordion/Accordion.module.css.js.map +1 -0
  6. package/ActionMenu/ActionMenu.js +49 -0
  7. package/ActionMenu/ActionMenu.js.map +1 -0
  8. package/ActionMenu/ActionMenu.module.css +1 -0
  9. package/ActionMenu/ActionMenu.module.css.js +16 -0
  10. package/ActionMenu/ActionMenu.module.css.js.map +1 -0
  11. package/Autocomplete/Autocomplete.js +226 -0
  12. package/Autocomplete/Autocomplete.js.map +1 -0
  13. package/Autocomplete/Autocomplete.module.css +1 -0
  14. package/Autocomplete/Autocomplete.module.css.js +46 -0
  15. package/Autocomplete/Autocomplete.module.css.js.map +1 -0
  16. package/Avatar/Avatar.js +66 -0
  17. package/Avatar/Avatar.js.map +1 -0
  18. package/Avatar/Avatar.module.css +1 -0
  19. package/Avatar/Avatar.module.css.js +26 -0
  20. package/Avatar/Avatar.module.css.js.map +1 -0
  21. package/Badge/Badge.js +40 -0
  22. package/Badge/Badge.js.map +1 -0
  23. package/Badge/Badge.module.css +1 -0
  24. package/Badge/Badge.module.css.js +24 -0
  25. package/Badge/Badge.module.css.js.map +1 -0
  26. package/BottomBar/BottomBar.js +19 -0
  27. package/BottomBar/BottomBar.js.map +1 -0
  28. package/BottomBar/BottomBar.module.css +1 -0
  29. package/BottomBar/BottomBar.module.css.js +10 -0
  30. package/BottomBar/BottomBar.module.css.js.map +1 -0
  31. package/Breadcrumbs/Breadcrumbs.js +40 -0
  32. package/Breadcrumbs/Breadcrumbs.js.map +1 -0
  33. package/Breadcrumbs/Breadcrumbs.module.css +1 -0
  34. package/Breadcrumbs/Breadcrumbs.module.css.js +18 -0
  35. package/Breadcrumbs/Breadcrumbs.module.css.js.map +1 -0
  36. package/Button/Button.js +53 -0
  37. package/Button/Button.js.map +1 -0
  38. package/Button/Button.module.css +1 -0
  39. package/Button/Button.module.css.js +24 -0
  40. package/Button/Button.module.css.js.map +1 -0
  41. package/Callout/Callout.js +66 -0
  42. package/Callout/Callout.js.map +1 -0
  43. package/Callout/Callout.module.css +1 -0
  44. package/Callout/Callout.module.css.js +28 -0
  45. package/Callout/Callout.module.css.js.map +1 -0
  46. package/Card/Card.js +39 -0
  47. package/Card/Card.js.map +1 -0
  48. package/Card/Card.module.css +1 -0
  49. package/Card/Card.module.css.js +18 -0
  50. package/Card/Card.module.css.js.map +1 -0
  51. package/Checkbox/Checkbox.js +90 -0
  52. package/Checkbox/Checkbox.js.map +1 -0
  53. package/Checkbox/Checkbox.module.css +1 -0
  54. package/Checkbox/Checkbox.module.css.js +22 -0
  55. package/Checkbox/Checkbox.module.css.js.map +1 -0
  56. package/Chip/Chip.js +62 -0
  57. package/Chip/Chip.js.map +1 -0
  58. package/Chip/Chip.module.css +1 -0
  59. package/Chip/Chip.module.css.js +24 -0
  60. package/Chip/Chip.module.css.js.map +1 -0
  61. package/DatePicker/DatePicker.js +157 -0
  62. package/DatePicker/DatePicker.js.map +1 -0
  63. package/DatePicker/DatePicker.module.css +1 -0
  64. package/DatePicker/DatePicker.module.css.js +48 -0
  65. package/DatePicker/DatePicker.module.css.js.map +1 -0
  66. package/DatePicker/DatePickerCalendar.js +94 -0
  67. package/DatePicker/DatePickerCalendar.js.map +1 -0
  68. package/DatePicker/DatePickerCalendar.module.css +1 -0
  69. package/DatePicker/DatePickerCalendar.module.css.js +32 -0
  70. package/DatePicker/DatePickerCalendar.module.css.js.map +1 -0
  71. package/Divider/Divider.js +22 -0
  72. package/Divider/Divider.js.map +1 -0
  73. package/Divider/Divider.module.css +1 -0
  74. package/Divider/Divider.module.css.js +12 -0
  75. package/Divider/Divider.module.css.js.map +1 -0
  76. package/Dropdown/Dropdown.js +100 -0
  77. package/Dropdown/Dropdown.js.map +1 -0
  78. package/Dropdown/Dropdown.module.css +1 -0
  79. package/Dropdown/Dropdown.module.css.js +20 -0
  80. package/Dropdown/Dropdown.module.css.js.map +1 -0
  81. package/Icon/Icon.js +8 -0
  82. package/Icon/Icon.js.map +1 -0
  83. package/IconButton/IconButton.js +42 -0
  84. package/IconButton/IconButton.js.map +1 -0
  85. package/IconButton/IconButton.module.css +1 -0
  86. package/IconButton/IconButton.module.css.js +20 -0
  87. package/IconButton/IconButton.module.css.js.map +1 -0
  88. package/InputNumber/InputNumber.js +106 -0
  89. package/InputNumber/InputNumber.js.map +1 -0
  90. package/InputNumber/InputNumber.module.css +1 -0
  91. package/InputNumber/InputNumber.module.css.js +30 -0
  92. package/InputNumber/InputNumber.module.css.js.map +1 -0
  93. package/Menu/Menu.js +182 -0
  94. package/Menu/Menu.js.map +1 -0
  95. package/Menu/Menu.module.css +1 -0
  96. package/Menu/Menu.module.css.js +56 -0
  97. package/Menu/Menu.module.css.js.map +1 -0
  98. package/Menu/menuData.js +188 -0
  99. package/Menu/menuData.js.map +1 -0
  100. package/Message/Message.js +88 -0
  101. package/Message/Message.js.map +1 -0
  102. package/Message/Message.module.css +1 -0
  103. package/Message/Message.module.css.js +32 -0
  104. package/Message/Message.module.css.js.map +1 -0
  105. package/Modal/Modal.js +186 -0
  106. package/Modal/Modal.js.map +1 -0
  107. package/Modal/Modal.module.css +1 -0
  108. package/Modal/Modal.module.css.js +44 -0
  109. package/Modal/Modal.module.css.js.map +1 -0
  110. package/Multiselect/Multiselect.js +249 -0
  111. package/Multiselect/Multiselect.js.map +1 -0
  112. package/Multiselect/Multiselect.module.css +1 -0
  113. package/Multiselect/Multiselect.module.css.js +64 -0
  114. package/Multiselect/Multiselect.module.css.js.map +1 -0
  115. package/Overlay/Overlay.js +18 -0
  116. package/Overlay/Overlay.js.map +1 -0
  117. package/Overlay/Overlay.module.css +1 -0
  118. package/Overlay/Overlay.module.css.js +8 -0
  119. package/Overlay/Overlay.module.css.js.map +1 -0
  120. package/Paginator/Paginator.js +118 -0
  121. package/Paginator/Paginator.js.map +1 -0
  122. package/Paginator/Paginator.module.css +1 -0
  123. package/Paginator/Paginator.module.css.js +22 -0
  124. package/Paginator/Paginator.module.css.js.map +1 -0
  125. package/Panel/Panel.js +38 -0
  126. package/Panel/Panel.js.map +1 -0
  127. package/Panel/Panel.module.css +1 -0
  128. package/Panel/Panel.module.css.js +16 -0
  129. package/Panel/Panel.module.css.js.map +1 -0
  130. package/ProgressSpinner/ProgressSpinner.js +64 -0
  131. package/ProgressSpinner/ProgressSpinner.js.map +1 -0
  132. package/ProgressSpinner/ProgressSpinner.module.css +1 -0
  133. package/ProgressSpinner/ProgressSpinner.module.css.js +16 -0
  134. package/ProgressSpinner/ProgressSpinner.module.css.js.map +1 -0
  135. package/Radio/Radio.js +44 -0
  136. package/Radio/Radio.js.map +1 -0
  137. package/Radio/Radio.module.css +1 -0
  138. package/Radio/Radio.module.css.js +18 -0
  139. package/Radio/Radio.module.css.js.map +1 -0
  140. package/SegmentControl/SegmentControl.js +74 -0
  141. package/SegmentControl/SegmentControl.js.map +1 -0
  142. package/SegmentControl/SegmentControl.module.css +1 -0
  143. package/SegmentControl/SegmentControl.module.css.js +16 -0
  144. package/SegmentControl/SegmentControl.module.css.js.map +1 -0
  145. package/Select/Select.js +153 -0
  146. package/Select/Select.js.map +1 -0
  147. package/Select/Select.module.css +1 -0
  148. package/Select/Select.module.css.js +46 -0
  149. package/Select/Select.module.css.js.map +1 -0
  150. package/Skeleton/Skeleton.js +78 -0
  151. package/Skeleton/Skeleton.js.map +1 -0
  152. package/Skeleton/Skeleton.module.css +1 -0
  153. package/Skeleton/Skeleton.module.css.js +18 -0
  154. package/Skeleton/Skeleton.module.css.js.map +1 -0
  155. package/Slider/Slider.js +116 -0
  156. package/Slider/Slider.js.map +1 -0
  157. package/Slider/Slider.module.css +1 -0
  158. package/Slider/Slider.module.css.js +24 -0
  159. package/Slider/Slider.module.css.js.map +1 -0
  160. package/Slot/Slot.js +25 -0
  161. package/Slot/Slot.js.map +1 -0
  162. package/Slot/Slot.module.css +1 -0
  163. package/Slot/Slot.module.css.js +16 -0
  164. package/Slot/Slot.module.css.js.map +1 -0
  165. package/Switch/Switch.js +42 -0
  166. package/Switch/Switch.js.map +1 -0
  167. package/Switch/Switch.module.css +1 -0
  168. package/Switch/Switch.module.css.js +11 -0
  169. package/Switch/Switch.module.css.js.map +1 -0
  170. package/Table/Table.js +268 -0
  171. package/Table/Table.js.map +1 -0
  172. package/Table/Table.module.css +1 -0
  173. package/Table/Table.module.css.js +64 -0
  174. package/Table/Table.module.css.js.map +1 -0
  175. package/TableTree/TableTree.js +139 -0
  176. package/TableTree/TableTree.js.map +1 -0
  177. package/TableTree/TableTree.module.css +1 -0
  178. package/TableTree/TableTree.module.css.js +62 -0
  179. package/TableTree/TableTree.module.css.js.map +1 -0
  180. package/Tabs/Tabs.js +92 -0
  181. package/Tabs/Tabs.js.map +1 -0
  182. package/Tabs/Tabs.module.css +1 -0
  183. package/Tabs/Tabs.module.css.js +18 -0
  184. package/Tabs/Tabs.module.css.js.map +1 -0
  185. package/Tag/Tag.js +48 -0
  186. package/Tag/Tag.js.map +1 -0
  187. package/Tag/Tag.module.css +1 -0
  188. package/Tag/Tag.module.css.js +30 -0
  189. package/Tag/Tag.module.css.js.map +1 -0
  190. package/TextField/TextField.js +93 -0
  191. package/TextField/TextField.js.map +1 -0
  192. package/TextField/TextField.module.css +1 -0
  193. package/TextField/TextField.module.css.js +36 -0
  194. package/TextField/TextField.module.css.js.map +1 -0
  195. package/Textarea/Textarea.js +52 -0
  196. package/Textarea/Textarea.js.map +1 -0
  197. package/Textarea/Textarea.module.css +1 -0
  198. package/Textarea/Textarea.module.css.js +32 -0
  199. package/Textarea/Textarea.module.css.js.map +1 -0
  200. package/Toast/Toast.js +82 -0
  201. package/Toast/Toast.js.map +1 -0
  202. package/Toast/Toast.module.css +1 -0
  203. package/Toast/Toast.module.css.js +28 -0
  204. package/Toast/Toast.module.css.js.map +1 -0
  205. package/Tooltip/Tooltip.js +61 -0
  206. package/Tooltip/Tooltip.js.map +1 -0
  207. package/Tooltip/Tooltip.module.css +1 -0
  208. package/Tooltip/Tooltip.module.css.js +26 -0
  209. package/Tooltip/Tooltip.module.css.js.map +1 -0
  210. package/TopBar/TopBar.js +87 -0
  211. package/TopBar/TopBar.js.map +1 -0
  212. package/TopBar/TopBar.module.css +1 -0
  213. package/TopBar/TopBar.module.css.js +30 -0
  214. package/TopBar/TopBar.module.css.js.map +1 -0
  215. package/index.js +90 -4157
  216. package/index.js.map +1 -1
  217. package/package.json +3 -4
  218. 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
@@ -0,0 +1,8 @@
1
+ import { jsx as c } from "react/jsx-runtime";
2
+ function f({ as: o, size: r = 20, weight: n = "bold", ...t }) {
3
+ return /* @__PURE__ */ c(o, { size: r, weight: n, ...t });
4
+ }
5
+ export {
6
+ f as Icon
7
+ };
8
+ //# sourceMappingURL=Icon.js.map
@@ -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":";;;;;AA0BA,MAAMA,IAAY;AAAA,EAChB,SAASC;AAAA,EACT,SAASC;AAAA,EACT,QAAQC;AAAA,EACR,SAASC;AACX,GAEMC,IAAwD;AAAA,EAC5D,SAAS;AAAA,EACT,QAAQC,EAAO;AAAA,EACf,SAASA,EAAO;AAClB,GAEMC,KAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,SAASD,EAAO;AAAA,EAChB,QAAQA,EAAO;AAAA,EACf,SAASA,EAAO;AAClB;AAEO,SAASE,GAAY;AAAA,EAC1B,OAAOC;AAAA,EACP,cAAAC,IAAe;AAAA,EACf,KAAAC;AAAA,EACA,KAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,WAAAC;AAAA,EACA,IAAIC;AACN,GAAqB;AACnB,QAAMC,IAAcC,EAAA,GACdC,IAAUH,KAAU,gBAAgBC,CAAW,IAE/CG,IAAelB,MAAc,QAC7B,CAACmB,GAAeC,CAAgB,IAAIC,EAAiBpB,CAAY,GACjE,CAACqB,GAASC,CAAU,IAAIF,EAAwB,IAAI,GAEpDG,IAAeN,IAAelB,IAAamB,GAE3CM,IACJhB,MAAaC,MAAW,WAAW,WAAWA,MAAW,YAAY,YAAY,YAE7EgB,IAAQ,CAACC,MAAsB;AACnC,QAAIC,IAASD;AACb,WAAIzB,MAAQ,WAAW0B,IAAS,KAAK,IAAI1B,GAAK0B,CAAM,IAChDzB,MAAQ,WAAWyB,IAAS,KAAK,IAAIzB,GAAKyB,CAAM,IAC7CA;AAAA,EACT,GAEMC,IAAS,CAACF,MAAc;AAC5B,UAAMG,IAAUJ,EAAMC,CAAC;AACvB,IAAKT,KAAcE,EAAiBU,CAAO,GAC3CzB,KAAA,QAAAA,EAAWyB;AAAA,EACb,GAEMC,IAAkB,MAAMF,EAAOL,IAAepB,CAAI,GAClD4B,IAAkB,MAAMH,EAAOL,IAAepB,CAAI,GAElD6B,IAAc,MAAMV,EAAW,OAAOC,CAAY,CAAC,GACnDU,IAAoB,CAACC,MAA2C;AACpE,UAAMC,IAAMD,EAAE,OAAO;AACrB,KAAIC,MAAQ,MAAMA,MAAQ,OAAO,gBAAgB,KAAKA,CAAG,MACvDb,EAAWa,CAAG;AAAA,EAElB,GACMC,IAAa,MAAM;AACvB,UAAMC,IAAS,WAAWhB,KAAW,EAAE;AACvC,IAAK,MAAMgB,CAAM,OAAUA,CAAM,GACjCf,EAAW,IAAI;AAAA,EACjB,GAEMgB,IAAejB,KAAW,OAAOE,CAAY,GAC7CgB,IAAUtC,MAAQ,UAAasB,KAAgBtB,GAC/CuC,IAAUtC,MAAQ,UAAaqB,KAAgBrB,GAE/CuC,IAAoBnD,EAAUkC,CAAgB,GAE9CkB,IAAc,CAAC9C,EAAO,MAAMc,IAAWd,EAAO,WAAW,IAAIgB,CAAS,EACzE,OAAO,OAAO,EACd,KAAK,GAAG,GACL+B,IAAe,CAAC/C,EAAO,OAAOD,EAAmBc,CAAM,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAClFmC,IAAc,CAAChD,EAAO,MAAMC,GAAgB2B,CAAgB,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7F,SACE,gBAAAqB,EAAC,OAAA,EAAI,WAAWH,GACb,UAAA;AAAA,IAAApC,uBACE,SAAA,EAAM,WAAWV,EAAO,OAAO,SAASoB,GACtC,UAAAX,EAAA,CACH;AAAA,IAEF,gBAAAwC,EAAC,OAAA,EAAI,WAAWF,GACd,UAAA;AAAA,MAAA,gBAAAG;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWlD,EAAO;AAAA,UAClB,SAASmC;AAAA,UACT,UAAUrB,KAAY6B;AAAA,UACtB,cAAW;AAAA,UACX,UAAU;AAAA,UAEV,UAAA,gBAAAO,EAACC,GAAA,EAAK,IAAIC,GAAa,MAAM,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAEnC,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAI9B;AAAA,UACJ,MAAK;AAAA,UACL,WAAU;AAAA,UACV,WAAWpB,EAAO;AAAA,UAClB,OAAO0C;AAAA,UACP,aAAA3B;AAAA,UACA,UAAAD;AAAA,UACA,iBAAeA;AAAA,UACf,oBAAkBH,IAAO,GAAGS,CAAO,UAAU;AAAA,UAC7C,gBAAcP,MAAW,WAAW,KAAO;AAAA,UAC3C,UAAUwB;AAAA,UACV,SAASD;AAAA,UACT,QAAQI;AAAA,QAAA;AAAA,MAAA;AAAA,MAEV,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWlD,EAAO;AAAA,UAClB,SAASkC;AAAA,UACT,UAAUpB,KAAY8B;AAAA,UACtB,cAAW;AAAA,UACX,UAAU;AAAA,UAEV,UAAA,gBAAAM,EAACC,GAAA,EAAK,IAAIE,GAAY,MAAM,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IAClC,GACF;AAAA,IACC1C,uBACE,OAAA,EAAI,IAAI,GAAGS,CAAO,SAAS,WAAW4B,GACrC,UAAA;AAAA,MAAA,gBAAAE,EAACC,KAAK,IAAIN,GAAmB,MAAM,IAAI,QAAO,QAAO;AAAA,MACrD,gBAAAK,EAAC,UAAM,UAAAvC,EAAA,CAAK;AAAA,IAAA,EAAA,CACd;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -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
@@ -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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"}