softable-pixels-web 1.1.20 → 1.1.22

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 (73) hide show
  1. package/dist/{BasePopover-UzOryrTn.js → BasePopover-PZwz1wdH.js} +3 -2
  2. package/dist/BasePopover-PZwz1wdH.js.map +1 -0
  3. package/dist/{ContextMenu-vFIUXgP8.js → ContextMenu-ByeABVhU.js} +3 -3
  4. package/dist/{ContextMenu-vFIUXgP8.js.map → ContextMenu-ByeABVhU.js.map} +1 -1
  5. package/dist/{Input-B6a6mXsZ.js → Input-7z9sFjK3.js} +8 -3
  6. package/dist/Input-7z9sFjK3.js.map +1 -0
  7. package/dist/MaskModule-DBNrJACG.js +704 -0
  8. package/dist/MaskModule-DBNrJACG.js.map +1 -0
  9. package/dist/Popover-DpD3G9_i.js +265 -0
  10. package/dist/Popover-DpD3G9_i.js.map +1 -0
  11. package/dist/{Select-CVcQGxjv.js → Select-BIj1BrzP.js} +219 -22
  12. package/dist/Select-BIj1BrzP.js.map +1 -0
  13. package/dist/{TextArea-Oqw0zh_x.js → TextArea-DHUTFFOU.js} +1 -1
  14. package/dist/{TextArea-Oqw0zh_x.js.map → TextArea-DHUTFFOU.js.map} +1 -1
  15. package/dist/base-popover.d.ts +3 -3
  16. package/dist/base-popover.js +4 -4
  17. package/dist/button.d.ts +2 -2
  18. package/dist/check-item.d.ts +1 -1
  19. package/dist/checkbox.d.ts +2 -2
  20. package/dist/context-menu.d.ts +1 -1
  21. package/dist/context-menu.js +5 -5
  22. package/dist/icon-button.d.ts +1 -1
  23. package/dist/{index-BD5ThARj.d.ts → index-BNPyjNve.d.ts} +1 -1
  24. package/dist/{index-B6V8Bhgk.d.ts → index-BY84CAyh.d.ts} +2 -2
  25. package/dist/{index-DH6rpwqM.d.ts → index-B_PqEEta.d.ts} +2 -3
  26. package/dist/{index-CzB15994.d.ts → index-BeZYjWoj.d.ts} +1 -1
  27. package/dist/{index-BymgvkBq.d.ts → index-BhxcqGNw.d.ts} +2 -2
  28. package/dist/index-BjwQCXWj.d.ts +145 -0
  29. package/dist/{index-aQIW73fh.d.ts → index-CEk3W9fj.d.ts} +1 -1
  30. package/dist/{index-v04O7Gs-.d.ts → index-CK68mp8m.d.ts} +4 -4
  31. package/dist/{index-ROp2paYJ.d.ts → index-Chi8TU12.d.ts} +1 -1
  32. package/dist/{index-BD5Vr9sw.d.ts → index-Cl2z9ftU.d.ts} +2 -2
  33. package/dist/{index-BLsNfmom.d.ts → index-DVE8mV5m.d.ts} +4 -4
  34. package/dist/{index-DK9_OGgn.d.ts → index-DX2iqN-v.d.ts} +2 -3
  35. package/dist/{index-B1QUSkjv.d.ts → index-Dp4TTO2D.d.ts} +5 -3
  36. package/dist/{index-9BlZnPff.d.ts → index-VwpQusI_.d.ts} +6 -5
  37. package/dist/index.d.ts +16 -16
  38. package/dist/index.js +10 -9
  39. package/dist/input.d.ts +1 -1
  40. package/dist/input.js +2 -1
  41. package/dist/mask-modules.d.ts +2 -144
  42. package/dist/mask-modules.js +2 -704
  43. package/dist/popover.d.ts +3 -3
  44. package/dist/popover.js +4 -4
  45. package/dist/select.d.ts +2 -2
  46. package/dist/select.js +5 -5
  47. package/dist/{styleProps-B2pBEf9N.d.ts → styleProps-CWZn-ouw.d.ts} +1 -1
  48. package/dist/switch.d.ts +1 -1
  49. package/dist/tab-switch.d.ts +1 -1
  50. package/dist/text-area.d.ts +1 -1
  51. package/dist/text-area.js +1 -1
  52. package/dist/theme-context.d.ts +1 -1
  53. package/dist/{types-rPQapqo2.d.ts → types-BIJRqScJ.d.ts} +1 -1
  54. package/dist/{types-Ck6jQYTO.d.ts → types-BM6zJmu5.d.ts} +3 -3
  55. package/dist/{types-699enaOL.d.ts → types-Dm-fEm6s.d.ts} +8 -7
  56. package/dist/typography.d.ts +1 -1
  57. package/dist/use-dismiss.js +1 -1
  58. package/dist/use-floating.d.ts +1 -1
  59. package/dist/use-floating.js +1 -1
  60. package/dist/useDismiss-CgVHqmqk.js +46 -0
  61. package/dist/useDismiss-CgVHqmqk.js.map +1 -0
  62. package/dist/{useFloating-DCxblHIR.js → useFloating-DRwB71jG.js} +2 -1
  63. package/dist/{useFloating-DCxblHIR.js.map → useFloating-DRwB71jG.js.map} +1 -1
  64. package/dist/{useThemedStyles-C23Tevdv.d.ts → useThemedStyles-BUR6rDGs.d.ts} +1 -1
  65. package/package.json +1 -1
  66. package/dist/BasePopover-UzOryrTn.js.map +0 -1
  67. package/dist/Input-B6a6mXsZ.js.map +0 -1
  68. package/dist/Popover-C-NRJlWf.js +0 -170
  69. package/dist/Popover-C-NRJlWf.js.map +0 -1
  70. package/dist/Select-CVcQGxjv.js.map +0 -1
  71. package/dist/mask-modules.js.map +0 -1
  72. package/dist/useDismiss-CAEk_GV-.js +0 -35
  73. package/dist/useDismiss-CAEk_GV-.js.map +0 -1
@@ -1,12 +1,14 @@
1
1
  import { n as styled, t as useThemedStyles } from "./useThemedStyles-CrarDyWc.js";
2
2
  import { t as Icon } from "./Icon-KzwFJI_k.js";
3
- import { t as BasePopover } from "./BasePopover-UzOryrTn.js";
3
+ import { t as BasePopover } from "./BasePopover-PZwz1wdH.js";
4
4
  import { t as Label } from "./Label-BHq2knad.js";
5
- import { useMemo, useState } from "react";
5
+ import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
 
8
8
  //#region src/components/commons/inputs/Select/components/OptionItem/styles.ts
9
- function createOptionsStyles({ isSelected }) {
9
+ function createOptionsStyles(props) {
10
+ const { isSelected } = props;
11
+ const isActive = props["data-active"] === "true";
10
12
  return styled({
11
13
  container: {
12
14
  width: "100%",
@@ -17,7 +19,7 @@ function createOptionsStyles({ isSelected }) {
17
19
  padding: "0.5rem 0.75rem",
18
20
  cursor: "pointer",
19
21
  transition: "background-color 0.2s ease-out",
20
- backgroundColor: isSelected ? "var(--px-background-card-hover)" : "transparent",
22
+ backgroundColor: isSelected || isActive ? "var(--px-background-card-hover)" : "transparent",
21
23
  __rules: {
22
24
  "&:hover": { backgroundColor: "var(--px-background-card-hover) !important" },
23
25
  "&:focus": {
@@ -42,31 +44,206 @@ function createOptionsStyles({ isSelected }) {
42
44
 
43
45
  //#endregion
44
46
  //#region src/components/commons/inputs/Select/components/OptionItem/index.tsx
45
- /** biome-ignore-all lint/a11y/useSemanticElements: It's a custom select component */
46
- const OptionItem = (props) => {
47
+ const OptionItem = forwardRef((props, ref) => {
47
48
  const { styles, classes } = useThemedStyles(props, createOptionsStyles);
48
- function handleClick() {
49
- props.onClick(props.option.value);
50
- }
49
+ const { option, isSelected, onClick, ...rest } = props;
51
50
  return /* @__PURE__ */ jsx("button", {
51
+ ...rest,
52
+ ref,
52
53
  type: "button",
53
54
  role: "option",
54
55
  style: styles.container,
55
56
  className: classes.container,
56
- "aria-label": props.option.label,
57
- "aria-selected": props.isSelected,
58
- onClick: handleClick,
57
+ "aria-label": option.label,
58
+ "aria-selected": isSelected,
59
+ onClick: () => onClick(option.value),
59
60
  children: /* @__PURE__ */ jsx("span", {
60
61
  style: styles.text,
61
- children: props.option.label
62
+ children: option.label
62
63
  })
63
64
  });
64
- };
65
+ });
66
+ OptionItem.displayName = "OptionItem";
67
+
68
+ //#endregion
69
+ //#region src/hooks/useCompositeListNavigation/index.ts
70
+ function findNextEnabled(start, dir, count, isDisabled) {
71
+ if (count <= 0) return 0;
72
+ let i = start;
73
+ for (let step = 0; step < count; step++) {
74
+ i = (i + dir + count) % count;
75
+ if (!isDisabled(i)) return i;
76
+ }
77
+ return start;
78
+ }
79
+ function findFirstEnabled(count, isDisabled) {
80
+ for (let i = 0; i < count; i++) if (!isDisabled(i)) return i;
81
+ return 0;
82
+ }
83
+ function useCompositeListNavigation({ open, itemCount, initialIndex, setOpen, makeMeta, onCloseByTab }) {
84
+ const listRef = useRef(null);
85
+ const itemRefs = useRef([]);
86
+ const isDisabled = useCallback((i) => !!makeMeta(i).disabled, [makeMeta]);
87
+ const [activeIndex, setActiveIndex] = useState(0);
88
+ const focusItem = useCallback((i) => {
89
+ const el = itemRefs.current[i];
90
+ if (!el) return;
91
+ el.focus({ preventScroll: true });
92
+ el.scrollIntoView({ block: "nearest" });
93
+ }, []);
94
+ const openAndFocus = useCallback((index) => {
95
+ setOpen(true);
96
+ const next = typeof index === "number" ? index : typeof initialIndex === "number" ? initialIndex : findFirstEnabled(itemCount, isDisabled);
97
+ setActiveIndex(next);
98
+ requestAnimationFrame(() => focusItem(next));
99
+ }, [
100
+ focusItem,
101
+ initialIndex,
102
+ isDisabled,
103
+ itemCount,
104
+ setOpen
105
+ ]);
106
+ useEffect(() => {
107
+ if (!open) return;
108
+ requestAnimationFrame(() => focusItem(activeIndex));
109
+ }, [
110
+ open,
111
+ activeIndex,
112
+ focusItem
113
+ ]);
114
+ const move = useCallback((dir) => {
115
+ const next = findNextEnabled(activeIndex, dir, itemCount, isDisabled);
116
+ setActiveIndex(next);
117
+ requestAnimationFrame(() => focusItem(next));
118
+ }, [
119
+ activeIndex,
120
+ itemCount,
121
+ isDisabled,
122
+ focusItem
123
+ ]);
124
+ const activate = useCallback(() => {
125
+ const meta = makeMeta(activeIndex);
126
+ if (meta.disabled) return;
127
+ meta.onActivate?.();
128
+ }, [activeIndex, makeMeta]);
129
+ const onListKeyDown = useCallback((e) => {
130
+ if (!open) return;
131
+ switch (e.key) {
132
+ case "Tab":
133
+ onCloseByTab?.();
134
+ setOpen(false);
135
+ return;
136
+ case "ArrowDown":
137
+ e.preventDefault();
138
+ move(1);
139
+ return;
140
+ case "ArrowUp":
141
+ e.preventDefault();
142
+ move(-1);
143
+ return;
144
+ case "Home": {
145
+ e.preventDefault();
146
+ const first = findFirstEnabled(itemCount, isDisabled);
147
+ setActiveIndex(first);
148
+ requestAnimationFrame(() => focusItem(first));
149
+ return;
150
+ }
151
+ case "End": {
152
+ e.preventDefault();
153
+ let last = itemCount - 1;
154
+ for (let i = itemCount - 1; i >= 0; i--) if (!isDisabled(i)) {
155
+ last = i;
156
+ break;
157
+ }
158
+ setActiveIndex(last);
159
+ requestAnimationFrame(() => focusItem(last));
160
+ return;
161
+ }
162
+ case "Enter":
163
+ case " ":
164
+ e.preventDefault();
165
+ activate();
166
+ return;
167
+ case "Escape":
168
+ e.preventDefault();
169
+ setOpen(false);
170
+ return;
171
+ case "ArrowRight": {
172
+ e.preventDefault();
173
+ const meta = makeMeta(activeIndex);
174
+ if (meta.hasChildren) meta.onOpenChildren?.();
175
+ return;
176
+ }
177
+ case "ArrowLeft":
178
+ e.preventDefault();
179
+ makeMeta(activeIndex).onCloseChildren?.();
180
+ return;
181
+ }
182
+ }, [
183
+ open,
184
+ itemCount,
185
+ activeIndex,
186
+ move,
187
+ setOpen,
188
+ activate,
189
+ makeMeta,
190
+ focusItem,
191
+ isDisabled,
192
+ onCloseByTab
193
+ ]);
194
+ const getTriggerProps = useCallback(() => {
195
+ return { onKeyDown: (e) => {
196
+ if (e.key === "Enter" || e.key === " " || e.key === "ArrowDown") {
197
+ e.preventDefault();
198
+ if (!open) openAndFocus();
199
+ return;
200
+ }
201
+ if (e.key === "ArrowUp") {
202
+ e.preventDefault();
203
+ if (!open) openAndFocus(itemCount > 0 ? itemCount - 1 : 0);
204
+ }
205
+ } };
206
+ }, [
207
+ open,
208
+ openAndFocus,
209
+ itemCount
210
+ ]);
211
+ return {
212
+ activeIndex,
213
+ getListProps: useCallback(() => {
214
+ return {
215
+ ref: (el) => {
216
+ listRef.current = el;
217
+ },
218
+ onKeyDown: onListKeyDown
219
+ };
220
+ }, [onListKeyDown]),
221
+ getItemProps: useCallback((index) => {
222
+ const isActive = index === activeIndex;
223
+ return {
224
+ ref: (el) => {
225
+ itemRefs.current[index] = el;
226
+ },
227
+ tabIndex: isActive ? 0 : -1,
228
+ "data-active": isActive ? "true" : "false"
229
+ };
230
+ }, [activeIndex]),
231
+ openAndFocus,
232
+ setActiveIndex,
233
+ getTriggerProps
234
+ };
235
+ }
65
236
 
66
237
  //#endregion
67
238
  //#region src/components/commons/inputs/Select/hooks/useSelect/index.ts
68
- function useSelect({ value, multiple, canClear, onChange }) {
239
+ function useSelect({ value, options, multiple, disabled, canClear, onChange }) {
69
240
  const [open, setOpen] = useState(false);
241
+ const nav = useCompositeListNavigation({
242
+ open,
243
+ itemCount: options.length,
244
+ setOpen: changeOpen,
245
+ makeMeta
246
+ });
70
247
  function handleOptionClick(option) {
71
248
  const isAlreadySelected = value.includes(option);
72
249
  if (!multiple) {
@@ -81,14 +258,27 @@ function useSelect({ value, multiple, canClear, onChange }) {
81
258
  } else onChange(value.filter((v) => v !== option));
82
259
  else onChange([...value, option]);
83
260
  }
261
+ function makeMeta(index) {
262
+ const opt = options[index];
263
+ return { onActivate: () => {
264
+ if (opt) handleOptionClick(opt.value);
265
+ } };
266
+ }
267
+ function changeOpen(value$1) {
268
+ setOpen(value$1);
269
+ }
84
270
  function togglePanel() {
85
- setOpen((prev) => !prev);
271
+ if (disabled) return;
272
+ if (!open) nav.openAndFocus();
86
273
  }
87
274
  function closePanel() {
88
275
  setOpen(false);
89
276
  }
90
277
  return {
278
+ nav,
91
279
  open,
280
+ makeMeta,
281
+ changeOpen,
92
282
  togglePanel,
93
283
  closePanel,
94
284
  handleOptionClick
@@ -155,7 +345,7 @@ var types_exports = {};
155
345
  //#endregion
156
346
  //#region src/components/commons/inputs/Select/index.tsx
157
347
  const Select = (props) => {
158
- const { open, togglePanel, handleOptionClick } = useSelect(props);
348
+ const { nav, open, changeOpen, handleOptionClick } = useSelect(props);
159
349
  const { styles, classes } = useThemedStyles(props, createSelectStyles, {
160
350
  pick: (p) => [
161
351
  p.disabled,
@@ -178,6 +368,7 @@ const Select = (props) => {
178
368
  return result;
179
369
  }
180
370
  function renderTrigger({ ref, ariaExpanded, onClick }) {
371
+ const triggerKeyProps = nav.getTriggerProps();
181
372
  return /* @__PURE__ */ jsxs("button", {
182
373
  ref,
183
374
  dir: "ltr",
@@ -188,6 +379,8 @@ const Select = (props) => {
188
379
  "aria-label": props.label,
189
380
  className: classes.content,
190
381
  "aria-expanded": ariaExpanded,
382
+ disabled: props.disabled,
383
+ ...triggerKeyProps,
191
384
  onClick,
192
385
  children: [
193
386
  props.value.length ? props.startIcon : null,
@@ -218,16 +411,20 @@ const Select = (props) => {
218
411
  absoluteReference: props.absoluteReference,
219
412
  floatingOptions: {
220
413
  viewportMargin: 0,
221
- strategy: props.strategy
414
+ strategy: props.strategy,
415
+ scrollContainerId: props.scrollContainerId
222
416
  },
223
417
  trigger: renderTrigger,
224
- onOpenChange: togglePanel,
418
+ onOpenChange: changeOpen,
225
419
  children: /* @__PURE__ */ jsx("div", {
226
420
  style: styles.panel,
227
- children: props.options.map((option) => /* @__PURE__ */ jsx(OptionItem, {
421
+ role: "listbox",
422
+ ...nav.getListProps(),
423
+ children: props.options.map((option, idx) => /* @__PURE__ */ jsx(OptionItem, {
228
424
  option,
425
+ onClick: handleOptionClick,
229
426
  isSelected: props.value.includes(option.value),
230
- onClick: handleOptionClick
427
+ ...nav.getItemProps(idx)
231
428
  }, option.value))
232
429
  })
233
430
  }),
@@ -241,4 +438,4 @@ const Select = (props) => {
241
438
 
242
439
  //#endregion
243
440
  export { types_exports as n, Select as t };
244
- //# sourceMappingURL=Select-CVcQGxjv.js.map
441
+ //# sourceMappingURL=Select-BIj1BrzP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select-BIj1BrzP.js","names":["value","Select: React.FC<SelectProps>"],"sources":["../src/components/commons/inputs/Select/components/OptionItem/styles.ts","../src/components/commons/inputs/Select/components/OptionItem/index.tsx","../src/hooks/useCompositeListNavigation/index.ts","../src/components/commons/inputs/Select/hooks/useSelect/index.ts","../src/components/commons/inputs/Select/styles.ts","../src/components/commons/inputs/Select/types.ts","../src/components/commons/inputs/Select/index.tsx"],"sourcesContent":["import type { OptionItemProps } from './types'\nimport { styled } from '@hooks/useThemedStyles/types'\n\nexport function createOptionsStyles(\n props: OptionItemProps & { ['data-active']?: string }\n) {\n const { isSelected } = props\n const isActive = props['data-active'] === 'true'\n const highlighted = isSelected || isActive\n\n return styled({\n container: {\n width: '100%',\n\n display: 'flex',\n alignItems: 'center',\n textAlign: 'left',\n\n borderRadius: '0.25rem',\n padding: '0.5rem 0.75rem',\n\n cursor: 'pointer',\n transition: 'background-color 0.2s ease-out',\n\n backgroundColor: highlighted\n ? 'var(--px-background-card-hover)'\n : 'transparent',\n\n __rules: {\n '&:hover': {\n backgroundColor: 'var(--px-background-card-hover) !important'\n },\n\n '&:focus': {\n outlineOffset: '-1px',\n outline: '2px solid var(--px-color-primary)'\n }\n }\n },\n\n text: {\n flex: 1,\n\n fontSize: '1rem',\n fontWeight: 500,\n lineHeight: '1.5rem',\n fontFamily: 'inherit',\n color: 'var(--px-text-primary)',\n\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis'\n }\n })\n}\n","/** biome-ignore-all lint/a11y/useSemanticElements: It's a custom select component */\nimport type React from 'react'\nimport { forwardRef } from 'react'\n\n// Hooks\nimport { useThemedStyles } from '@hooks/useThemedStyles'\n\n// Types\nimport type { OptionItemProps } from './types'\n\n// Styles\nimport { createOptionsStyles } from './styles'\n\ntype NativeButtonProps = Omit<\n React.ComponentPropsWithoutRef<'button'>,\n 'onClick'\n>\n\nexport const OptionItem = forwardRef<\n HTMLButtonElement,\n OptionItemProps & NativeButtonProps\n>((props, ref) => {\n const { styles, classes } = useThemedStyles(props, createOptionsStyles)\n\n const { option, isSelected, onClick, ...rest } = props\n\n return (\n <button\n {...rest}\n ref={ref}\n type=\"button\"\n role=\"option\"\n style={styles.container}\n className={classes.container}\n aria-label={option.label}\n aria-selected={isSelected}\n onClick={() => onClick(option.value)}\n >\n <span style={styles.text}>{option.label}</span>\n </button>\n )\n})\n\nOptionItem.displayName = 'OptionItem'\n","// External Libraries\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nexport type CompositeItemMeta = {\n disabled?: boolean\n hasChildren?: boolean\n onActivate?: () => void\n onOpenChildren?: () => void\n onCloseChildren?: () => void\n}\n\ntype Params = {\n open: boolean\n itemCount: number\n initialIndex?: number\n onCloseByTab?: () => void\n setOpen: (v: boolean) => void\n makeMeta: (index: number) => CompositeItemMeta\n}\n\nfunction findNextEnabled(\n start: number,\n dir: 1 | -1,\n count: number,\n isDisabled: (i: number) => boolean\n) {\n if (count <= 0) return 0\n let i = start\n for (let step = 0; step < count; step++) {\n i = (i + dir + count) % count\n if (!isDisabled(i)) return i\n }\n return start\n}\n\nfunction findFirstEnabled(count: number, isDisabled: (i: number) => boolean) {\n for (let i = 0; i < count; i++) if (!isDisabled(i)) return i\n return 0\n}\n\nexport function useCompositeListNavigation({\n open,\n itemCount,\n initialIndex,\n setOpen,\n makeMeta,\n onCloseByTab\n}: Params) {\n const listRef = useRef<HTMLElement | null>(null)\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([])\n\n const isDisabled = useCallback(\n (i: number) => !!makeMeta(i).disabled,\n [makeMeta]\n )\n\n const [activeIndex, setActiveIndex] = useState(0)\n\n const focusItem = useCallback((i: number) => {\n const el = itemRefs.current[i]\n if (!el) return\n el.focus({ preventScroll: true })\n el.scrollIntoView({ block: 'nearest' })\n }, [])\n\n const openAndFocus = useCallback(\n (index?: number) => {\n setOpen(true)\n\n const next =\n typeof index === 'number'\n ? index\n : typeof initialIndex === 'number'\n ? initialIndex\n : findFirstEnabled(itemCount, isDisabled)\n\n setActiveIndex(next)\n requestAnimationFrame(() => focusItem(next))\n },\n [focusItem, initialIndex, isDisabled, itemCount, setOpen]\n )\n\n useEffect(() => {\n if (!open) return\n requestAnimationFrame(() => focusItem(activeIndex))\n }, [open, activeIndex, focusItem])\n\n const move = useCallback(\n (dir: 1 | -1) => {\n const next = findNextEnabled(activeIndex, dir, itemCount, isDisabled)\n setActiveIndex(next)\n requestAnimationFrame(() => focusItem(next))\n },\n [activeIndex, itemCount, isDisabled, focusItem]\n )\n\n const activate = useCallback(() => {\n const meta = makeMeta(activeIndex)\n if (meta.disabled) return\n meta.onActivate?.()\n }, [activeIndex, makeMeta])\n\n const onListKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!open) return\n\n switch (e.key) {\n case 'Tab': {\n // ✅ fecha e deixa o browser focar o próximo\n // (e NÃO restaura foco pro trigger)\n onCloseByTab?.()\n setOpen(false)\n return\n }\n\n case 'ArrowDown':\n e.preventDefault()\n move(+1)\n return\n\n case 'ArrowUp':\n e.preventDefault()\n move(-1)\n return\n\n case 'Home': {\n e.preventDefault()\n const first = findFirstEnabled(itemCount, isDisabled)\n setActiveIndex(first)\n requestAnimationFrame(() => focusItem(first))\n return\n }\n\n case 'End': {\n e.preventDefault()\n let last = itemCount - 1\n for (let i = itemCount - 1; i >= 0; i--) {\n if (!isDisabled(i)) {\n last = i\n break\n }\n }\n setActiveIndex(last)\n requestAnimationFrame(() => focusItem(last))\n return\n }\n\n case 'Enter':\n case ' ': {\n e.preventDefault()\n activate()\n return\n }\n\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n return\n\n case 'ArrowRight': {\n e.preventDefault()\n const meta = makeMeta(activeIndex)\n if (meta.hasChildren) meta.onOpenChildren?.()\n return\n }\n\n case 'ArrowLeft': {\n e.preventDefault()\n const meta = makeMeta(activeIndex)\n meta.onCloseChildren?.()\n return\n }\n }\n },\n [\n open,\n itemCount,\n activeIndex,\n move,\n setOpen,\n activate,\n makeMeta,\n focusItem,\n isDisabled,\n onCloseByTab\n ]\n )\n\n const getTriggerProps = useCallback(() => {\n return {\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n if (!open) openAndFocus()\n return\n }\n\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n if (!open) openAndFocus(itemCount > 0 ? itemCount - 1 : 0)\n }\n }\n }\n }, [open, openAndFocus, itemCount])\n\n const getListProps = useCallback(() => {\n return {\n ref: (el: HTMLElement | null) => {\n listRef.current = el\n },\n onKeyDown: onListKeyDown\n }\n }, [onListKeyDown])\n\n const getItemProps = useCallback(\n (index: number) => {\n const isActive = index === activeIndex\n return {\n ref: (el: HTMLButtonElement | null) => {\n itemRefs.current[index] = el\n },\n tabIndex: isActive ? 0 : -1,\n 'data-active': isActive ? 'true' : 'false'\n } as const\n },\n [activeIndex]\n )\n\n return {\n activeIndex,\n getListProps,\n getItemProps,\n openAndFocus,\n setActiveIndex,\n getTriggerProps\n }\n}\n","// External Libraries\nimport { useState } from 'react'\n\n// Types\nimport type { SelectProps } from '../../types'\nimport { useCompositeListNavigation } from '@hooks/useCompositeListNavigation'\n\nexport function useSelect({\n value,\n options,\n multiple,\n disabled,\n canClear,\n onChange\n}: SelectProps) {\n // States\n const [open, setOpen] = useState(false)\n\n // Hooks\n const nav = useCompositeListNavigation({\n open,\n itemCount: options.length,\n setOpen: changeOpen,\n makeMeta: makeMeta\n })\n\n // Functions\n function handleOptionClick(option: string) {\n const isAlreadySelected = value.includes(option)\n\n if (!multiple) {\n if (isAlreadySelected) {\n if (canClear) onChange([])\n } else onChange([option])\n\n setOpen(false)\n return\n }\n\n if (isAlreadySelected) {\n if (value.length === 1) {\n if (canClear) onChange([])\n } else onChange(value.filter(v => v !== option))\n } else onChange([...value, option])\n }\n\n function makeMeta(index: number) {\n const opt = options[index]\n return {\n onActivate: () => {\n if (opt) handleOptionClick(opt.value)\n }\n }\n }\n\n function changeOpen(value: boolean) {\n setOpen(value)\n }\n\n function togglePanel() {\n if (disabled) return\n if (!open) nav.openAndFocus()\n }\n\n function closePanel() {\n setOpen(false)\n }\n\n return {\n nav,\n open,\n makeMeta,\n changeOpen,\n togglePanel,\n closePanel,\n handleOptionClick\n }\n}\n","import { styled } from '@hooks/useThemedStyles/types'\nimport type { SelectProps } from './types'\n\nexport function createSelectStyles(props: SelectProps) {\n return styled({\n container: {\n width: '100%',\n\n display: 'flex',\n flexDirection: 'column',\n\n position: 'relative',\n\n rowGap: '0.375rem'\n },\n\n content: {\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n\n borderWidth: 1,\n columnGap: '0.25rem',\n borderRadius: '0.5rem',\n padding: '0.625rem 0.875rem',\n\n opacity: props.disabled ? 0.5 : 1,\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n boxShadow: 'var(--px-shadow-default)',\n borderColor: props.errorMessage\n ? 'var(--px-color-error)'\n : 'var(--px-border-primary)',\n\n __rules: {\n '&:focus-within': {\n outlineOffset: '-1px !important',\n outline: `2px solid var(${props.errorMessage ? '--px-color-error' : '--px-color-primary'}) !important`\n }\n }\n },\n\n text: {\n flex: 1,\n\n textAlign: 'left',\n\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n\n fontSize: '1rem',\n lineHeight: '1.5rem',\n fontFamily: 'inherit',\n fontWeight: props.value.length ? 500 : 400,\n color: props.value.length\n ? 'var(--px-text-primary)'\n : 'var(--px-text-secondary)'\n },\n\n error: {\n display: 'block',\n fontWeight: 400,\n lineHeight: '1rem',\n fontSize: '0.75rem',\n fontFamily: 'inherit',\n color: 'var(--px-text-error)'\n },\n\n panel: {\n width: '100%'\n }\n })\n}\n","import type {\n StylesOf,\n TextProps,\n LayoutProps,\n MarginProps\n} from '@hooks/useThemedStyles/types'\nimport type { createSelectStyles } from './styles'\nimport type { FloatingOptions } from '@hooks/useFloating/types'\nimport type { PopoverProps } from '@components/commons/toolkit/Popover/types'\n\nexport interface SelectProps extends LayoutProps, MarginProps {\n label: string\n value: string[]\n placeholder?: string\n options: SelectOption[]\n\n portalId?: PopoverProps['portalId']\n strategy?: FloatingOptions['strategy']\n scrollContainerId?: FloatingOptions['scrollContainerId']\n absoluteReference?: FloatingOptions['absoluteReference']\n\n canClear?: boolean\n multiple?: boolean\n required?: boolean\n disabled?: boolean\n hideLabel?: boolean\n errorMessage?: string\n maxVisibleItems?: number\n\n startIcon?: React.ReactNode\n styles?: StylesOf<typeof createSelectStyles>\n\n requiredColor?: string\n labelConfig?: TextProps\n\n onChange: (value: string[]) => void\n}\n\nexport interface SelectOption {\n label: string\n value: string\n}\n","/** biome-ignore-all lint/a11y/useSemanticElements: It's a custom select component */\n// External Libraries\nimport type React from 'react'\nimport { useMemo } from 'react'\n\n// Components\nimport { OptionItem } from './components/OptionItem'\nimport { Icon } from '@components/commons/toolkit/Icon'\nimport { Label } from '@components/commons/toolkit/Label'\nimport { BasePopover } from '@components/commons/structure/BasePopover'\n\n// Hooks\nimport { useSelect } from './hooks/useSelect'\nimport { useThemedStyles } from '@hooks/useThemedStyles'\n\n// Types\nimport type { SelectProps } from './types'\nimport type { PopoverTriggerRenderProps } from '@components/commons/toolkit/Popover/types'\n\n// Styles\nimport { createSelectStyles } from './styles'\n\nexport * as SelectTypes from './types'\n\nexport const Select: React.FC<SelectProps> = props => {\n const { nav, open, changeOpen, handleOptionClick } = useSelect(props)\n const { styles, classes } = useThemedStyles(props, createSelectStyles, {\n pick: p => [p.disabled, p.errorMessage, p.value],\n override: props.styles,\n applyCommonProps: true,\n commonSlot: 'container'\n })\n\n const maxVisible = props.maxVisibleItems ?? Infinity\n const optionsMap = useMemo(\n () => new Map(props.options.map(option => [option.value, option.label])),\n [props.options]\n )\n\n // Functions\n function renderContent() {\n if (!props.value?.length) return props.placeholder\n\n const resolvedValues = props.value.map(val => optionsMap.get(val) ?? val)\n const visibleItems = resolvedValues.slice(0, maxVisible)\n const hiddenCount = resolvedValues.length - visibleItems.length\n\n let result = visibleItems.join(', ')\n if (hiddenCount > 0) result += ` +${hiddenCount}`\n return result\n }\n\n function renderTrigger({\n ref,\n ariaExpanded,\n onClick\n }: PopoverTriggerRenderProps) {\n const triggerKeyProps = nav.getTriggerProps()\n\n return (\n <button\n ref={ref as any}\n dir=\"ltr\"\n type=\"button\"\n role=\"combobox\"\n style={styles.content}\n aria-autocomplete=\"none\"\n aria-label={props.label}\n className={classes.content}\n aria-expanded={ariaExpanded}\n disabled={props.disabled}\n {...triggerKeyProps}\n onClick={onClick}\n >\n {props.value.length ? props.startIcon : null}\n\n <span id=\"text-content\" style={styles.text}>\n {renderContent()}\n </span>\n\n <Icon size=\"sm\" name=\"chevrons-down\" />\n </button>\n )\n }\n\n return (\n <div style={styles.container}>\n {props.hideLabel ? null : (\n <Label\n label={props.label}\n required={props.required}\n requiredColor={props.requiredColor}\n {...props.labelConfig}\n />\n )}\n\n <BasePopover\n open={open}\n portalId={props.portalId}\n absoluteReference={props.absoluteReference}\n floatingOptions={{\n viewportMargin: 0,\n strategy: props.strategy,\n scrollContainerId: props.scrollContainerId\n }}\n trigger={renderTrigger}\n onOpenChange={changeOpen}\n >\n <div style={styles.panel} role=\"listbox\" {...nav.getListProps()}>\n {props.options.map((option, idx) => (\n <OptionItem\n key={option.value}\n option={option}\n onClick={handleOptionClick}\n isSelected={props.value.includes(option.value)}\n {...nav.getItemProps(idx)}\n />\n ))}\n </div>\n </BasePopover>\n\n {props.errorMessage ? (\n <span style={styles.error}>{props.errorMessage}</span>\n ) : null}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -132,4 +132,4 @@ const TextArea = (props) => {
132
132
 
133
133
  //#endregion
134
134
  export { TextArea as t };
135
- //# sourceMappingURL=TextArea-Oqw0zh_x.js.map
135
+ //# sourceMappingURL=TextArea-DHUTFFOU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextArea-Oqw0zh_x.js","names":[],"sources":["../src/components/commons/inputs/TextArea/styles.ts","../src/components/commons/inputs/TextArea/index.tsx"],"sourcesContent":["// Types\nimport { styled } from '@hooks/useThemedStyles/types'\nimport type { TextAreaProps } from './types'\n\nexport function createTextAreaStyles(props: TextAreaProps) {\n const { height = '8rem', readOnly, startIcon } = props\n\n return styled({\n container: {\n width: '100%',\n\n display: 'flex',\n flexDirection: 'column',\n\n rowGap: '0.375rem'\n },\n iconContainer: {\n position: 'absolute',\n left: '0.75rem',\n top: '1.375rem',\n transform: 'translateY(-50%)'\n },\n textArea: {\n height,\n width: '100%',\n paddingBlock: '0.75rem',\n paddingInline: '0.875rem',\n borderWidth: 1,\n borderRadius: '0.5rem',\n resize: 'none',\n\n fontWeight: '400',\n fontSize: '1rem',\n color: 'var(--px-text-primary)',\n\n borderColor: props.errorMessage\n ? 'var(--px-color-error)'\n : 'var(--px-border-primary)',\n outlineOffset: '-1px',\n\n cursor: readOnly ? 'default' : undefined,\n paddingLeft: startIcon ? '2.5rem' : undefined,\n\n __rules: {\n '&::placeholder': {\n fontWeight: 400,\n color: 'var(--px-text-secondary)'\n },\n '&:focus-within': {\n outlineOffset: '-1px',\n outline: `2px solid var(${props.errorMessage ? '--px-color-error' : '--px-color-primary'})`\n }\n }\n },\n error: {\n display: 'block',\n fontWeight: 400,\n lineHeight: '1rem',\n fontSize: '0.75rem',\n fontFamily: 'inherit',\n color: 'var(--px-text-error)'\n }\n })\n}\n","// External Libraries\nimport { useId } from 'react'\n\n// Types\nimport type { TextAreaProps } from './types'\n\n// Components\nimport { Label } from '@components/commons/toolkit/Label'\nimport { Icon } from '@components/commons/toolkit/Icon'\nimport { Typography } from '@components/commons/toolkit/Typography'\n\n// Hooks\nimport { useThemedStyles } from '@hooks/useThemedStyles'\n\n// Styles\nimport { createTextAreaStyles } from './styles'\n\nexport const TextArea = (props: TextAreaProps) => {\n const {\n value,\n disabled,\n readOnly,\n maxLength,\n hideMaxLength,\n textMaxLength,\n placeholder,\n errorMessage,\n\n label,\n required,\n requiredColor,\n labelConfig,\n\n startIcon,\n iconColor\n } = props\n\n // Hooks\n const inputId = useId()\n\n const { styles, classes } = useThemedStyles(props, createTextAreaStyles, {\n pick: p => [\n p.height,\n p.readOnly,\n p.startIcon,\n p.placeholderColor,\n p.focusedRingColor\n ],\n override: props.styles,\n applyCommonProps: true\n })\n\n // Functions\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\n if (disabled || readOnly) return\n props.onChange?.(e.target.value)\n }\n\n function renderLabel() {\n if (!label) return null\n\n return (\n <div>\n <Label\n label={label}\n htmlFor={inputId}\n required={required}\n requiredColor={requiredColor}\n {...labelConfig}\n />\n </div>\n )\n }\n\n return (\n <div style={styles.container}>\n {renderLabel()}\n\n <div style={{ position: 'relative' }}>\n {startIcon && (\n <div style={styles.iconContainer}>\n <Icon\n name={startIcon}\n color={iconColor ? iconColor : 'var(--px-text-primary)'}\n />\n </div>\n )}\n\n <textarea\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n placeholder={placeholder}\n style={styles.textArea}\n className={classes.textArea}\n onChange={handleChange}\n />\n </div>\n\n {maxLength && !hideMaxLength ? (\n <Typography variant=\"b2\" styles={{ text: { marginLeft: 'auto' } }}>\n {value?.length}/{maxLength} {textMaxLength}\n </Typography>\n ) : null}\n\n {errorMessage ? <span style={styles.error}>{errorMessage}</span> : null}\n </div>\n )\n}\n"],"mappings":";;;;;;;;AAIA,SAAgB,qBAAqB,OAAsB;CACzD,MAAM,EAAE,SAAS,QAAQ,UAAU,cAAc;AAEjD,QAAO,OAAO;EACZ,WAAW;GACT,OAAO;GAEP,SAAS;GACT,eAAe;GAEf,QAAQ;GACT;EACD,eAAe;GACb,UAAU;GACV,MAAM;GACN,KAAK;GACL,WAAW;GACZ;EACD,UAAU;GACR;GACA,OAAO;GACP,cAAc;GACd,eAAe;GACf,aAAa;GACb,cAAc;GACd,QAAQ;GAER,YAAY;GACZ,UAAU;GACV,OAAO;GAEP,aAAa,MAAM,eACf,0BACA;GACJ,eAAe;GAEf,QAAQ,WAAW,YAAY;GAC/B,aAAa,YAAY,WAAW;GAEpC,SAAS;IACP,kBAAkB;KAChB,YAAY;KACZ,OAAO;KACR;IACD,kBAAkB;KAChB,eAAe;KACf,SAAS,iBAAiB,MAAM,eAAe,qBAAqB,qBAAqB;KAC1F;IACF;GACF;EACD,OAAO;GACL,SAAS;GACT,YAAY;GACZ,YAAY;GACZ,UAAU;GACV,YAAY;GACZ,OAAO;GACR;EACF,CAAC;;;;;AC7CJ,MAAa,YAAY,UAAyB;CAChD,MAAM,EACJ,OACA,UACA,UACA,WACA,eACA,eACA,aACA,cAEA,OACA,UACA,eACA,aAEA,WACA,cACE;CAGJ,MAAM,UAAU,OAAO;CAEvB,MAAM,EAAE,QAAQ,YAAY,gBAAgB,OAAO,sBAAsB;EACvE,OAAM,MAAK;GACT,EAAE;GACF,EAAE;GACF,EAAE;GACF,EAAE;GACF,EAAE;GACH;EACD,UAAU,MAAM;EAChB,kBAAkB;EACnB,CAAC;CAGF,SAAS,aAAa,GAA2C;AAC/D,MAAI,YAAY,SAAU;AAC1B,QAAM,WAAW,EAAE,OAAO,MAAM;;CAGlC,SAAS,cAAc;AACrB,MAAI,CAAC,MAAO,QAAO;AAEnB,SACE,oBAAC,mBACC,oBAAC;GACQ;GACP,SAAS;GACC;GACK;GACf,GAAI;IACJ,GACE;;AAIV,QACE,qBAAC;EAAI,OAAO,OAAO;;GAChB,aAAa;GAEd,qBAAC;IAAI,OAAO,EAAE,UAAU,YAAY;eACjC,aACC,oBAAC;KAAI,OAAO,OAAO;eACjB,oBAAC;MACC,MAAM;MACN,OAAO,YAAY,YAAY;OAC/B;MACE,EAGR,oBAAC;KACQ;KACG;KACA;KACC;KACE;KACb,OAAO,OAAO;KACd,WAAW,QAAQ;KACnB,UAAU;MACV;KACE;GAEL,aAAa,CAAC,gBACb,qBAAC;IAAW,SAAQ;IAAK,QAAQ,EAAE,MAAM,EAAE,YAAY,QAAQ,EAAE;;KAC9D,OAAO;KAAO;KAAE;KAAU;KAAE;;KAClB,GACX;GAEH,eAAe,oBAAC;IAAK,OAAO,OAAO;cAAQ;KAAoB,GAAG;;GAC/D"}
1
+ {"version":3,"file":"TextArea-DHUTFFOU.js","names":[],"sources":["../src/components/commons/inputs/TextArea/styles.ts","../src/components/commons/inputs/TextArea/index.tsx"],"sourcesContent":["// Types\nimport { styled } from '@hooks/useThemedStyles/types'\nimport type { TextAreaProps } from './types'\n\nexport function createTextAreaStyles(props: TextAreaProps) {\n const { height = '8rem', readOnly, startIcon } = props\n\n return styled({\n container: {\n width: '100%',\n\n display: 'flex',\n flexDirection: 'column',\n\n rowGap: '0.375rem'\n },\n iconContainer: {\n position: 'absolute',\n left: '0.75rem',\n top: '1.375rem',\n transform: 'translateY(-50%)'\n },\n textArea: {\n height,\n width: '100%',\n paddingBlock: '0.75rem',\n paddingInline: '0.875rem',\n borderWidth: 1,\n borderRadius: '0.5rem',\n resize: 'none',\n\n fontWeight: '400',\n fontSize: '1rem',\n color: 'var(--px-text-primary)',\n\n borderColor: props.errorMessage\n ? 'var(--px-color-error)'\n : 'var(--px-border-primary)',\n outlineOffset: '-1px',\n\n cursor: readOnly ? 'default' : undefined,\n paddingLeft: startIcon ? '2.5rem' : undefined,\n\n __rules: {\n '&::placeholder': {\n fontWeight: 400,\n color: 'var(--px-text-secondary)'\n },\n '&:focus-within': {\n outlineOffset: '-1px',\n outline: `2px solid var(${props.errorMessage ? '--px-color-error' : '--px-color-primary'})`\n }\n }\n },\n error: {\n display: 'block',\n fontWeight: 400,\n lineHeight: '1rem',\n fontSize: '0.75rem',\n fontFamily: 'inherit',\n color: 'var(--px-text-error)'\n }\n })\n}\n","// External Libraries\nimport { useId } from 'react'\n\n// Types\nimport type { TextAreaProps } from './types'\n\n// Components\nimport { Label } from '@components/commons/toolkit/Label'\nimport { Icon } from '@components/commons/toolkit/Icon'\nimport { Typography } from '@components/commons/toolkit/Typography'\n\n// Hooks\nimport { useThemedStyles } from '@hooks/useThemedStyles'\n\n// Styles\nimport { createTextAreaStyles } from './styles'\n\nexport const TextArea = (props: TextAreaProps) => {\n const {\n value,\n disabled,\n readOnly,\n maxLength,\n hideMaxLength,\n textMaxLength,\n placeholder,\n errorMessage,\n\n label,\n required,\n requiredColor,\n labelConfig,\n\n startIcon,\n iconColor\n } = props\n\n // Hooks\n const inputId = useId()\n\n const { styles, classes } = useThemedStyles(props, createTextAreaStyles, {\n pick: p => [\n p.height,\n p.readOnly,\n p.startIcon,\n p.placeholderColor,\n p.focusedRingColor\n ],\n override: props.styles,\n applyCommonProps: true\n })\n\n // Functions\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\n if (disabled || readOnly) return\n props.onChange?.(e.target.value)\n }\n\n function renderLabel() {\n if (!label) return null\n\n return (\n <div>\n <Label\n label={label}\n htmlFor={inputId}\n required={required}\n requiredColor={requiredColor}\n {...labelConfig}\n />\n </div>\n )\n }\n\n return (\n <div style={styles.container}>\n {renderLabel()}\n\n <div style={{ position: 'relative' }}>\n {startIcon && (\n <div style={styles.iconContainer}>\n <Icon\n name={startIcon}\n color={iconColor ? iconColor : 'var(--px-text-primary)'}\n />\n </div>\n )}\n\n <textarea\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n placeholder={placeholder}\n style={styles.textArea}\n className={classes.textArea}\n onChange={handleChange}\n />\n </div>\n\n {maxLength && !hideMaxLength ? (\n <Typography variant=\"b2\" styles={{ text: { marginLeft: 'auto' } }}>\n {value?.length}/{maxLength} {textMaxLength}\n </Typography>\n ) : null}\n\n {errorMessage ? <span style={styles.error}>{errorMessage}</span> : null}\n </div>\n )\n}\n"],"mappings":";;;;;;;;AAIA,SAAgB,qBAAqB,OAAsB;CACzD,MAAM,EAAE,SAAS,QAAQ,UAAU,cAAc;AAEjD,QAAO,OAAO;EACZ,WAAW;GACT,OAAO;GAEP,SAAS;GACT,eAAe;GAEf,QAAQ;GACT;EACD,eAAe;GACb,UAAU;GACV,MAAM;GACN,KAAK;GACL,WAAW;GACZ;EACD,UAAU;GACR;GACA,OAAO;GACP,cAAc;GACd,eAAe;GACf,aAAa;GACb,cAAc;GACd,QAAQ;GAER,YAAY;GACZ,UAAU;GACV,OAAO;GAEP,aAAa,MAAM,eACf,0BACA;GACJ,eAAe;GAEf,QAAQ,WAAW,YAAY;GAC/B,aAAa,YAAY,WAAW;GAEpC,SAAS;IACP,kBAAkB;KAChB,YAAY;KACZ,OAAO;KACR;IACD,kBAAkB;KAChB,eAAe;KACf,SAAS,iBAAiB,MAAM,eAAe,qBAAqB,qBAAqB;KAC1F;IACF;GACF;EACD,OAAO;GACL,SAAS;GACT,YAAY;GACZ,YAAY;GACZ,UAAU;GACV,YAAY;GACZ,OAAO;GACR;EACF,CAAC;;;;;AC7CJ,MAAa,YAAY,UAAyB;CAChD,MAAM,EACJ,OACA,UACA,UACA,WACA,eACA,eACA,aACA,cAEA,OACA,UACA,eACA,aAEA,WACA,cACE;CAGJ,MAAM,UAAU,OAAO;CAEvB,MAAM,EAAE,QAAQ,YAAY,gBAAgB,OAAO,sBAAsB;EACvE,OAAM,MAAK;GACT,EAAE;GACF,EAAE;GACF,EAAE;GACF,EAAE;GACF,EAAE;GACH;EACD,UAAU,MAAM;EAChB,kBAAkB;EACnB,CAAC;CAGF,SAAS,aAAa,GAA2C;AAC/D,MAAI,YAAY,SAAU;AAC1B,QAAM,WAAW,EAAE,OAAO,MAAM;;CAGlC,SAAS,cAAc;AACrB,MAAI,CAAC,MAAO,QAAO;AAEnB,SACE,oBAAC,mBACC,oBAAC;GACQ;GACP,SAAS;GACC;GACK;GACf,GAAI;IACJ,GACE;;AAIV,QACE,qBAAC;EAAI,OAAO,OAAO;;GAChB,aAAa;GAEd,qBAAC;IAAI,OAAO,EAAE,UAAU,YAAY;eACjC,aACC,oBAAC;KAAI,OAAO,OAAO;eACjB,oBAAC;MACC,MAAM;MACN,OAAO,YAAY,YAAY;OAC/B;MACE,EAGR,oBAAC;KACQ;KACG;KACA;KACC;KACE;KACb,OAAO,OAAO;KACd,WAAW,QAAQ;KACnB,UAAU;MACV;KACE;GAEL,aAAa,CAAC,gBACb,qBAAC;IAAW,SAAQ;IAAK,QAAQ,EAAE,MAAM,EAAE,YAAY,QAAQ,EAAE;;KAC9D,OAAO;KAAO;KAAE;KAAU;KAAE;;KAClB,GACX;GAEH,eAAe,oBAAC;IAAK,OAAO,OAAO;cAAQ;KAAoB,GAAG;;GAC/D"}
@@ -1,4 +1,4 @@
1
- import "./types-699enaOL.js";
2
- import "./index-DK9_OGgn.js";
3
- import { t as BasePopover } from "./index-DH6rpwqM.js";
1
+ import "./types-Dm-fEm6s.js";
2
+ import "./index-DX2iqN-v.js";
3
+ import { t as BasePopover } from "./index-B_PqEEta.js";
4
4
  export { BasePopover };
@@ -1,7 +1,7 @@
1
1
  import "./useThemedStyles-CrarDyWc.js";
2
- import "./useDismiss-CAEk_GV-.js";
3
- import "./useFloating-DCxblHIR.js";
4
- import "./Popover-C-NRJlWf.js";
5
- import { t as BasePopover } from "./BasePopover-UzOryrTn.js";
2
+ import "./useDismiss-CgVHqmqk.js";
3
+ import "./useFloating-DRwB71jG.js";
4
+ import "./Popover-DpD3G9_i.js";
5
+ import { t as BasePopover } from "./BasePopover-PZwz1wdH.js";
6
6
 
7
7
  export { BasePopover };
package/dist/button.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import "./types-Ck6jQYTO.js";
2
- import { t as Button } from "./index-BLsNfmom.js";
1
+ import "./types-BM6zJmu5.js";
2
+ import { t as Button } from "./index-DVE8mV5m.js";
3
3
  export { Button };
@@ -1,2 +1,2 @@
1
- import { t as CheckItem } from "./index-CzB15994.js";
1
+ import { t as CheckItem } from "./index-BeZYjWoj.js";
2
2
  export { CheckItem };
@@ -1,3 +1,3 @@
1
- import "./types-Ck6jQYTO.js";
2
- import { t as Checkbox } from "./index-BymgvkBq.js";
1
+ import "./types-BM6zJmu5.js";
2
+ import { t as Checkbox } from "./index-BhxcqGNw.js";
3
3
  export { Checkbox };
@@ -1,2 +1,2 @@
1
- import { n as types_d_exports, t as ContextMenu } from "./index-B6V8Bhgk.js";
1
+ import { n as types_d_exports, t as ContextMenu } from "./index-BY84CAyh.js";
2
2
  export { ContextMenu, types_d_exports as ContextMenuTypes };
@@ -1,10 +1,10 @@
1
1
  import "./useThemedStyles-CrarDyWc.js";
2
2
  import "./Switch-DJNZbvzy.js";
3
- import "./useDismiss-CAEk_GV-.js";
4
- import "./useFloating-DCxblHIR.js";
5
- import "./Popover-C-NRJlWf.js";
3
+ import "./useDismiss-CgVHqmqk.js";
4
+ import "./useFloating-DRwB71jG.js";
5
+ import "./Popover-DpD3G9_i.js";
6
6
  import "./Typography-BkFV7BhK.js";
7
- import { n as types_exports, t as ContextMenu } from "./ContextMenu-vFIUXgP8.js";
8
- import "./BasePopover-UzOryrTn.js";
7
+ import { n as types_exports, t as ContextMenu } from "./ContextMenu-ByeABVhU.js";
8
+ import "./BasePopover-PZwz1wdH.js";
9
9
 
10
10
  export { ContextMenu, types_exports as ContextMenuTypes };
@@ -1,2 +1,2 @@
1
- import { t as IconButton } from "./index-ROp2paYJ.js";
1
+ import { t as IconButton } from "./index-Chi8TU12.js";
2
2
  export { IconButton };
@@ -292,4 +292,4 @@ declare const ThemeProvider: React.FC<ThemeProviderProps>;
292
292
  declare function useTheme(): ThemeContextData;
293
293
  //#endregion
294
294
  export { ThemeName as a, ThemeRegistry as c, ThemeMode as i, ThemeTokens as l, useTheme as n, ThemePersistence as o, ThemeContextData as r, ThemeProviderProps as s, ThemeProvider as t };
295
- //# sourceMappingURL=index-BD5ThARj.d.ts.map
295
+ //# sourceMappingURL=index-BNPyjNve.d.ts.map
@@ -1,4 +1,4 @@
1
- import { n as Placement } from "./types-rPQapqo2.js";
1
+ import { n as Placement } from "./types-BIJRqScJ.js";
2
2
  import { ReactNode } from "react";
3
3
  import * as react_jsx_runtime1 from "react/jsx-runtime";
4
4
 
@@ -70,4 +70,4 @@ interface ContextMenuProps<T> {
70
70
  declare const ContextMenu: <T extends string>(props: ContextMenuProps<T>) => react_jsx_runtime1.JSX.Element;
71
71
  //#endregion
72
72
  export { types_d_exports as n, ContextMenu as t };
73
- //# sourceMappingURL=index-B6V8Bhgk.d.ts.map
73
+ //# sourceMappingURL=index-BY84CAyh.d.ts.map
@@ -1,4 +1,3 @@
1
- import { t as PopoverProps } from "./types-699enaOL.js";
2
1
  import React, { PropsWithChildren } from "react";
3
2
 
4
3
  //#region src/components/commons/structure/BasePopover/types.d.ts
@@ -11,7 +10,7 @@ interface LayoutProps {
11
10
  interface PanelProps {
12
11
  padding?: string;
13
12
  }
14
- interface BasePopoverProps extends Omit<PopoverProps, 'content' | 'hideShadow'>, LayoutProps, PropsWithChildren {
13
+ interface BasePopoverProps extends Omit<PopoverTypes.PopoverProps, 'content' | 'hideShadow'>, LayoutProps, PropsWithChildren {
15
14
  panel?: PanelProps;
16
15
  }
17
16
  //#endregion
@@ -19,4 +18,4 @@ interface BasePopoverProps extends Omit<PopoverProps, 'content' | 'hideShadow'>,
19
18
  declare const BasePopover: React.FC<BasePopoverProps>;
20
19
  //#endregion
21
20
  export { BasePopover as t };
22
- //# sourceMappingURL=index-DH6rpwqM.d.ts.map
21
+ //# sourceMappingURL=index-B_PqEEta.d.ts.map
@@ -10,4 +10,4 @@ interface CheckItemProps {
10
10
  declare const CheckItem: React.FC<CheckItemProps>;
11
11
  //#endregion
12
12
  export { CheckItem as t };
13
- //# sourceMappingURL=index-CzB15994.d.ts.map
13
+ //# sourceMappingURL=index-BeZYjWoj.d.ts.map
@@ -1,4 +1,4 @@
1
- import { n as TypographyVariant } from "./types-Ck6jQYTO.js";
1
+ import { n as TypographyVariant } from "./types-BM6zJmu5.js";
2
2
  import React$1 from "react";
3
3
 
4
4
  //#region src/components/commons/toolkit/Checkbox/types.d.ts
@@ -26,4 +26,4 @@ interface CheckboxProps {
26
26
  declare const Checkbox: React$1.FC<CheckboxProps>;
27
27
  //#endregion
28
28
  export { Checkbox as t };
29
- //# sourceMappingURL=index-BymgvkBq.d.ts.map
29
+ //# sourceMappingURL=index-BhxcqGNw.d.ts.map