softable-pixels-web 1.1.20 → 1.1.21

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 (66) hide show
  1. package/dist/{BasePopover-UzOryrTn.js → BasePopover-BVeMpuWR.js} +2 -2
  2. package/dist/{BasePopover-UzOryrTn.js.map → BasePopover-BVeMpuWR.js.map} +1 -1
  3. package/dist/{ContextMenu-vFIUXgP8.js → ContextMenu-B94eRUm7.js} +3 -3
  4. package/dist/{ContextMenu-vFIUXgP8.js.map → ContextMenu-B94eRUm7.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-C-NRJlWf.js → Popover-BDNQO09F.js} +3 -5
  10. package/dist/Popover-BDNQO09F.js.map +1 -0
  11. package/dist/{Select-CVcQGxjv.js → Select-Bad465DY.js} +4 -3
  12. package/dist/Select-Bad465DY.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 +3 -3
  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 +4 -4
  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-CzB15994.d.ts → index-BeZYjWoj.d.ts} +1 -1
  26. package/dist/{index-BymgvkBq.d.ts → index-BhxcqGNw.d.ts} +2 -2
  27. package/dist/index-BjwQCXWj.d.ts +145 -0
  28. package/dist/{index-aQIW73fh.d.ts → index-CEk3W9fj.d.ts} +1 -1
  29. package/dist/{index-ROp2paYJ.d.ts → index-Chi8TU12.d.ts} +1 -1
  30. package/dist/{index-BD5Vr9sw.d.ts → index-Cl2z9ftU.d.ts} +2 -2
  31. package/dist/{index-9BlZnPff.d.ts → index-ClqTlRGD.d.ts} +6 -5
  32. package/dist/{index-DH6rpwqM.d.ts → index-CyvNJW2l.d.ts} +2 -2
  33. package/dist/{index-DK9_OGgn.d.ts → index-DEKll7zF.d.ts} +2 -2
  34. package/dist/{index-BLsNfmom.d.ts → index-DVE8mV5m.d.ts} +4 -4
  35. package/dist/{index-B1QUSkjv.d.ts → index-Dp4TTO2D.d.ts} +5 -3
  36. package/dist/{index-v04O7Gs-.d.ts → index-modFVzpZ.d.ts} +2 -2
  37. package/dist/index.d.ts +15 -15
  38. package/dist/index.js +8 -7
  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 +2 -2
  44. package/dist/popover.js +2 -2
  45. package/dist/select.d.ts +2 -2
  46. package/dist/select.js +4 -4
  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-CRA-1_6O.d.ts} +4 -3
  56. package/dist/typography.d.ts +1 -1
  57. package/dist/use-floating.d.ts +1 -1
  58. package/dist/use-floating.js +1 -1
  59. package/dist/{useFloating-DCxblHIR.js → useFloating-DRwB71jG.js} +2 -1
  60. package/dist/{useFloating-DCxblHIR.js.map → useFloating-DRwB71jG.js.map} +1 -1
  61. package/dist/{useThemedStyles-C23Tevdv.d.ts → useThemedStyles-BUR6rDGs.d.ts} +1 -1
  62. package/package.json +1 -1
  63. package/dist/Input-B6a6mXsZ.js.map +0 -1
  64. package/dist/Popover-C-NRJlWf.js.map +0 -1
  65. package/dist/Select-CVcQGxjv.js.map +0 -1
  66. package/dist/mask-modules.js.map +0 -1
package/dist/popover.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./useThemedStyles-CrarDyWc.js";
2
2
  import "./useDismiss-CAEk_GV-.js";
3
- import "./useFloating-DCxblHIR.js";
4
- import { n as types_exports, t as Popover } from "./Popover-C-NRJlWf.js";
3
+ import "./useFloating-DRwB71jG.js";
4
+ import { n as types_exports, t as Popover } from "./Popover-BDNQO09F.js";
5
5
 
6
6
  export { Popover, types_exports as PopoverTypes };
package/dist/select.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { n as types_d_exports, t as Select } from "./index-9BlZnPff.js";
2
- import "./types-699enaOL.js";
1
+ import { n as types_d_exports, t as Select } from "./index-ClqTlRGD.js";
2
+ import "./types-CRA-1_6O.js";
3
3
  export { Select, types_d_exports as SelectTypes };
package/dist/select.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import "./useThemedStyles-CrarDyWc.js";
2
2
  import "./useDismiss-CAEk_GV-.js";
3
- import "./useFloating-DCxblHIR.js";
4
- import "./Popover-C-NRJlWf.js";
3
+ import "./useFloating-DRwB71jG.js";
4
+ import "./Popover-BDNQO09F.js";
5
5
  import "./Icon-KzwFJI_k.js";
6
6
  import "./Typography-BkFV7BhK.js";
7
- import "./BasePopover-UzOryrTn.js";
7
+ import "./BasePopover-BVeMpuWR.js";
8
8
  import "./Label-BHq2knad.js";
9
- import { n as types_exports, t as Select } from "./Select-CVcQGxjv.js";
9
+ import { n as types_exports, t as Select } from "./Select-Bad465DY.js";
10
10
 
11
11
  export { Select, types_exports as SelectTypes };
@@ -44,4 +44,4 @@ interface LayoutProps {
44
44
  type CommonStyleProps = MarginProps & PaddingProps & TextProps & LayoutProps;
45
45
  //#endregion
46
46
  export { TextProps as a, PaddingProps as i, LayoutProps as n, MarginProps as r, CommonStyleProps as t };
47
- //# sourceMappingURL=styleProps-B2pBEf9N.d.ts.map
47
+ //# sourceMappingURL=styleProps-CWZn-ouw.d.ts.map
package/dist/switch.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { t as Switch } from "./index-aQIW73fh.js";
1
+ import { t as Switch } from "./index-CEk3W9fj.js";
2
2
  export { Switch };
@@ -1,2 +1,2 @@
1
- import { n as SwitchOption, r as TabSwitchProps, t as TabSwitch } from "./index-v04O7Gs-.js";
1
+ import { n as SwitchOption, r as TabSwitchProps, t as TabSwitch } from "./index-modFVzpZ.js";
2
2
  export { SwitchOption, TabSwitch, TabSwitchProps };
@@ -1,2 +1,2 @@
1
- import { t as TextArea } from "./index-BD5Vr9sw.js";
1
+ import { t as TextArea } from "./index-Cl2z9ftU.js";
2
2
  export { TextArea };
package/dist/text-area.js CHANGED
@@ -2,6 +2,6 @@ import "./useThemedStyles-CrarDyWc.js";
2
2
  import "./Icon-KzwFJI_k.js";
3
3
  import "./Typography-BkFV7BhK.js";
4
4
  import "./Label-BHq2knad.js";
5
- import { t as TextArea } from "./TextArea-Oqw0zh_x.js";
5
+ import { t as TextArea } from "./TextArea-DHUTFFOU.js";
6
6
 
7
7
  export { TextArea };
@@ -1,2 +1,2 @@
1
- import { a as ThemeName, c as ThemeRegistry, i as ThemeMode, l as ThemeTokens, n as useTheme, o as ThemePersistence, r as ThemeContextData, s as ThemeProviderProps, t as ThemeProvider } from "./index-BD5ThARj.js";
1
+ import { a as ThemeName, c as ThemeRegistry, i as ThemeMode, l as ThemeTokens, n as useTheme, o as ThemePersistence, r as ThemeContextData, s as ThemeProviderProps, t as ThemeProvider } from "./index-BNPyjNve.js";
2
2
  export { ThemeContextData, ThemeMode, ThemeName, ThemePersistence, ThemeProvider, ThemeProviderProps, ThemeRegistry, ThemeTokens, useTheme };
@@ -15,4 +15,4 @@ type FloatingOptions = {
15
15
  };
16
16
  //#endregion
17
17
  export { Placement as n, FloatingOptions as t };
18
- //# sourceMappingURL=types-rPQapqo2.d.ts.map
18
+ //# sourceMappingURL=types-BIJRqScJ.d.ts.map
@@ -1,5 +1,5 @@
1
- import { a as TextProps, r as MarginProps } from "./styleProps-B2pBEf9N.js";
2
- import { r as TypeStyles, t as SlotStyle } from "./useThemedStyles-C23Tevdv.js";
1
+ import { a as TextProps, r as MarginProps } from "./styleProps-CWZn-ouw.js";
2
+ import { r as TypeStyles, t as SlotStyle } from "./useThemedStyles-BUR6rDGs.js";
3
3
  import { ElementType, ReactNode } from "react";
4
4
 
5
5
  //#region src/components/commons/toolkit/Typography/style.d.ts
@@ -40,4 +40,4 @@ type TextAlign = 'left' | 'center' | 'right' | 'justify';
40
40
  type TypographyVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'b1' | 'b2' | 'b3' | 'caption' | 'legal';
41
41
  //#endregion
42
42
  export { TypographyVariant as n, TypographyProps as t };
43
- //# sourceMappingURL=types-Ck6jQYTO.d.ts.map
43
+ //# sourceMappingURL=types-BM6zJmu5.d.ts.map
@@ -1,5 +1,5 @@
1
- import { i as PaddingProps } from "./styleProps-B2pBEf9N.js";
2
- import { t as FloatingOptions } from "./types-rPQapqo2.js";
1
+ import { i as PaddingProps } from "./styleProps-CWZn-ouw.js";
2
+ import { t as FloatingOptions } from "./types-BIJRqScJ.js";
3
3
  import { MouseEventHandler, ReactNode, RefObject } from "react";
4
4
 
5
5
  //#region src/components/commons/toolkit/Popover/styles.d.ts
@@ -32,6 +32,7 @@ type PopoverTriggerRenderProps = {
32
32
  interface PopoverProps extends PaddingProps {
33
33
  open?: boolean;
34
34
  portalId?: string;
35
+ containerId?: string;
35
36
  hideShadow?: boolean;
36
37
  closeOnEscape?: boolean;
37
38
  closeOnOutsideClick?: boolean;
@@ -50,4 +51,4 @@ interface PopoverProps extends PaddingProps {
50
51
  }
51
52
  //#endregion
52
53
  export { types_d_exports as n, PopoverProps as t };
53
- //# sourceMappingURL=types-699enaOL.d.ts.map
54
+ //# sourceMappingURL=types-CRA-1_6O.d.ts.map
@@ -1,4 +1,4 @@
1
- import { t as TypographyProps } from "./types-Ck6jQYTO.js";
1
+ import { t as TypographyProps } from "./types-BM6zJmu5.js";
2
2
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/commons/toolkit/Typography/index.d.ts
@@ -1,4 +1,4 @@
1
- import { t as FloatingOptions } from "./types-rPQapqo2.js";
1
+ import { t as FloatingOptions } from "./types-BIJRqScJ.js";
2
2
 
3
3
  //#region src/hooks/useFloating/index.d.ts
4
4
  type AnchorLike = {
@@ -1,3 +1,3 @@
1
- import { t as useFloating } from "./useFloating-DCxblHIR.js";
1
+ import { t as useFloating } from "./useFloating-DRwB71jG.js";
2
2
 
3
3
  export { useFloating };
@@ -278,6 +278,7 @@ function useFloating(targetRef, options) {
278
278
  ]);
279
279
  useEffect(() => {
280
280
  if (!floatingEl) return;
281
+ console.log({ scrollContainerId });
281
282
  const scrollContainer = scrollContainerId ? document.getElementById(scrollContainerId) : window;
282
283
  update();
283
284
  const rafUpdate = () => requestAnimationFrame(update);
@@ -314,4 +315,4 @@ function useFloating(targetRef, options) {
314
315
 
315
316
  //#endregion
316
317
  export { useFloating as t };
317
- //# sourceMappingURL=useFloating-DCxblHIR.js.map
318
+ //# sourceMappingURL=useFloating-DRwB71jG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFloating-DCxblHIR.js","names":["FALLBACK_PLACEMENTS: Record<Placement, Placement[]>","raw","scrollContainer: Window | HTMLElement | null"],"sources":["../src/hooks/useFloating/constants/fallbackPlacements.ts","../src/hooks/useFloating/utils/position.ts","../src/hooks/useFloating/index.ts"],"sourcesContent":["// Types\nimport type { Placement } from '@hooks/useFloating/types'\n\nexport const FALLBACK_PLACEMENTS: Record<Placement, Placement[]> = {\n 'bottom-start': [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n 'right-start',\n 'left-start'\n ],\n 'bottom-end': [\n 'bottom-end',\n 'top-end',\n 'bottom-start',\n 'top-start',\n 'left-start',\n 'right-start'\n ],\n bottom: [\n 'bottom',\n 'top',\n 'bottom-start',\n 'bottom-end',\n 'top-start',\n 'top-end'\n ],\n 'top-start': [\n 'top-start',\n 'bottom-start',\n 'top-end',\n 'bottom-end',\n 'right-start',\n 'left-start'\n ],\n 'top-end': [\n 'top-end',\n 'bottom-end',\n 'top-start',\n 'bottom-start',\n 'left-start',\n 'right-start'\n ],\n top: ['top', 'bottom', 'top-start', 'top-end', 'bottom-start', 'bottom-end'],\n 'right-start': [\n 'right-start',\n 'left-start',\n 'right-end',\n 'left-end',\n 'bottom-start',\n 'top-start'\n ],\n 'right-end': [\n 'right-end',\n 'left-end',\n 'right-start',\n 'left-start',\n 'bottom-end',\n 'top-end'\n ],\n right: [\n 'right',\n 'left',\n 'right-start',\n 'right-end',\n 'left-start',\n 'left-end'\n ],\n 'left-start': [\n 'left-start',\n 'right-start',\n 'left-end',\n 'right-end',\n 'bottom-start',\n 'top-start'\n ],\n 'left-end': [\n 'left-end',\n 'right-end',\n 'left-start',\n 'right-start',\n 'bottom-end',\n 'top-end'\n ],\n left: ['left', 'right', 'left-start', 'left-end', 'right-start', 'right-end'],\n center: ['center', 'bottom', 'top', 'right', 'left']\n}\n","// Utils\nimport { FALLBACK_PLACEMENTS } from '../constants/fallbackPlacements'\n\n// Types\nimport type { Placement, PositionResult } from '@hooks/useFloating/types'\n\ntype CalcParams = {\n rect: DOMRect\n floatingRect: DOMRect\n placement: Placement\n offsetX: number\n offsetY: number\n}\n\nfunction calcForPlacement({\n rect,\n offsetY,\n offsetX,\n placement,\n floatingRect\n}: CalcParams): Omit<PositionResult, 'placement'> {\n let top = rect.top + offsetY\n let left = rect.left + offsetX\n\n switch (placement) {\n case 'top':\n top = rect.top - floatingRect.height - offsetY\n left = rect.left + rect.width / 2 - floatingRect.width / 2 + offsetX\n break\n\n case 'top-start':\n top = rect.top - floatingRect.height - offsetY\n break\n\n case 'top-end':\n top = rect.top - floatingRect.height - offsetY\n left = rect.right - offsetX - floatingRect.width\n break\n\n case 'bottom':\n top = rect.bottom + offsetY\n left = rect.left + rect.width / 2 - floatingRect.width / 2 + offsetX\n break\n\n case 'bottom-start':\n top = rect.bottom + offsetY\n break\n\n case 'bottom-end':\n top = rect.bottom + offsetY\n left = rect.right - offsetX - floatingRect.width\n break\n\n case 'left':\n top = rect.top + rect.height / 2 - floatingRect.height / 2 + offsetY\n left = rect.left - floatingRect.width - offsetX\n break\n\n case 'left-start':\n left = rect.left - floatingRect.width - offsetX\n break\n\n case 'left-end':\n top = rect.bottom - floatingRect.height - offsetY\n left = rect.left - floatingRect.width - offsetX\n break\n\n case 'right':\n top = rect.top + rect.height / 2 - floatingRect.height / 2 + offsetY\n left = rect.right + offsetX\n break\n\n case 'right-start':\n left = rect.right + offsetX\n break\n\n case 'right-end':\n left = rect.right + offsetX\n top = rect.bottom - floatingRect.height - offsetY\n break\n\n case 'center':\n left = rect.left + rect.width / 2 - floatingRect.width / 2 + offsetX\n top = rect.top + rect.height / 2 - floatingRect.height / 2 + offsetY\n break\n }\n\n return { top, left }\n}\n\nfunction clampToViewport(\n top: number,\n left: number,\n floatingRect: DOMRect,\n margin: number\n) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const clampedLeft = Math.min(\n Math.max(left, margin),\n vw - floatingRect.width - margin\n )\n const clampedTop = Math.min(\n Math.max(top, margin),\n vh - floatingRect.height - margin\n )\n\n return { top: clampedTop, left: clampedLeft }\n}\n\nfunction overflows(\n top: number,\n left: number,\n floatingRect: DOMRect,\n margin: number\n) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n return {\n left: left < margin,\n right: left + floatingRect.width > vw - margin,\n top: top < margin,\n bottom: top + floatingRect.height > vh - margin\n }\n}\n\nfunction fallbackPlacements(p: Placement): Placement[] {\n return FALLBACK_PLACEMENTS[p] ?? [p]\n}\n\nexport function getPositionInViewport(params: {\n rect: DOMRect\n margin?: number\n offsetX?: number\n offsetY?: number\n tryFlip?: boolean\n floatingRect: DOMRect\n placement: Placement\n}): PositionResult {\n const {\n rect,\n floatingRect,\n placement,\n offsetX = 0,\n offsetY = 0,\n margin = 8,\n tryFlip = true\n } = params\n\n const tries = tryFlip ? fallbackPlacements(placement) : [placement]\n\n for (const p of tries) {\n const raw = calcForPlacement({\n rect,\n floatingRect,\n placement: p,\n offsetX,\n offsetY\n })\n const o = overflows(raw.top, raw.left, floatingRect, margin)\n if (!o.left && !o.right && !o.top && !o.bottom) {\n return { ...raw, placement: p }\n }\n }\n\n const raw = calcForPlacement({\n rect,\n offsetY,\n offsetX,\n placement,\n floatingRect\n })\n const clamped = clampToViewport(raw.top, raw.left, floatingRect, margin)\n return { ...clamped, placement }\n}\n","// External Libraries\nimport { useMemo, useState, useEffect, useCallback } from 'react'\n\n// Utils\nimport { getPositionInViewport } from '@hooks/useFloating/utils/position'\n\n// Types\nimport type { FloatingOptions } from '@hooks/useFloating/types'\n\nexport type AnchorLike = { getBoundingClientRect: () => DOMRect }\ntype Anchor = HTMLElement | AnchorLike\n\nfunction isElement(value: unknown): value is Element {\n return value instanceof Element\n}\n\nexport function useFloating(\n targetRef: React.RefObject<Anchor>,\n options?: FloatingOptions\n) {\n const {\n portalRef,\n offsetX = 0,\n offsetY = 6,\n strategy = 'fixed',\n scrollContainerId,\n viewportMargin = 8,\n keepInViewport = true,\n absoluteReference = 'portal',\n placement = 'bottom-start'\n } = options || {}\n\n const [floatingEl, setFloatingEl] = useState<HTMLElement | null>(null)\n\n const update = useCallback(() => {\n const target = targetRef.current\n const floating = floatingEl\n if (!target || !floating) return\n\n const rect = target.getBoundingClientRect()\n const floatingRect = floating.getBoundingClientRect()\n\n const pos = getPositionInViewport({\n rect,\n offsetX,\n offsetY,\n placement,\n floatingRect,\n tryFlip: keepInViewport,\n margin: viewportMargin\n })\n\n let left = pos.left\n let top = pos.top\n\n if (strategy === 'absolute') {\n if (absoluteReference === 'offsetParent') {\n const op = floating.offsetParent\n if (op instanceof HTMLElement) {\n const r = op.getBoundingClientRect()\n\n left -= r.left + op.clientLeft - op.scrollLeft\n top -= r.top + op.clientTop - op.scrollTop\n }\n }\n\n if (absoluteReference === 'portal') {\n const el = portalRef?.current\n if (el) {\n const r = el.getBoundingClientRect()\n\n left -= r.left + el.clientLeft - el.scrollLeft\n top -= r.top + el.clientTop - el.scrollTop\n }\n }\n }\n\n floating.style.top = '0px'\n floating.style.left = '0px'\n floating.style.position = strategy\n floating.style.transform = `translate(${left}px, ${top}px)`\n }, [\n offsetX,\n offsetY,\n strategy,\n floatingEl,\n placement,\n targetRef,\n keepInViewport,\n viewportMargin,\n absoluteReference,\n portalRef?.current\n ])\n\n useEffect(() => {\n if (!floatingEl) return\n\n const scrollContainer: Window | HTMLElement | null = scrollContainerId\n ? document.getElementById(scrollContainerId)\n : window\n\n update()\n\n const rafUpdate = () => requestAnimationFrame(update)\n\n // scroll (Window ou Element)\n if (scrollContainer && 'addEventListener' in scrollContainer) {\n scrollContainer.addEventListener('scroll', rafUpdate, { passive: true })\n }\n window.addEventListener('resize', rafUpdate, { passive: true })\n\n const ro = new ResizeObserver(rafUpdate)\n\n const target = targetRef.current\n\n if (isElement(target)) ro.observe(target)\n\n ro.observe(floatingEl)\n\n return () => {\n if (scrollContainer && 'removeEventListener' in scrollContainer) {\n scrollContainer.removeEventListener('scroll', rafUpdate as any)\n }\n window.removeEventListener('resize', rafUpdate)\n ro.disconnect()\n }\n }, [floatingEl, update, scrollContainerId, targetRef])\n\n const floatingRef = useCallback((el: HTMLElement | null) => {\n setFloatingEl(el)\n }, [])\n\n return useMemo(\n () => ({ floatingEl, floatingRef, update }),\n [floatingEl, floatingRef, update]\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useFloating-DRwB71jG.js","names":["FALLBACK_PLACEMENTS: Record<Placement, Placement[]>","raw","scrollContainer: Window | HTMLElement | null"],"sources":["../src/hooks/useFloating/constants/fallbackPlacements.ts","../src/hooks/useFloating/utils/position.ts","../src/hooks/useFloating/index.ts"],"sourcesContent":["// Types\nimport type { Placement } from '@hooks/useFloating/types'\n\nexport const FALLBACK_PLACEMENTS: Record<Placement, Placement[]> = {\n 'bottom-start': [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n 'right-start',\n 'left-start'\n ],\n 'bottom-end': [\n 'bottom-end',\n 'top-end',\n 'bottom-start',\n 'top-start',\n 'left-start',\n 'right-start'\n ],\n bottom: [\n 'bottom',\n 'top',\n 'bottom-start',\n 'bottom-end',\n 'top-start',\n 'top-end'\n ],\n 'top-start': [\n 'top-start',\n 'bottom-start',\n 'top-end',\n 'bottom-end',\n 'right-start',\n 'left-start'\n ],\n 'top-end': [\n 'top-end',\n 'bottom-end',\n 'top-start',\n 'bottom-start',\n 'left-start',\n 'right-start'\n ],\n top: ['top', 'bottom', 'top-start', 'top-end', 'bottom-start', 'bottom-end'],\n 'right-start': [\n 'right-start',\n 'left-start',\n 'right-end',\n 'left-end',\n 'bottom-start',\n 'top-start'\n ],\n 'right-end': [\n 'right-end',\n 'left-end',\n 'right-start',\n 'left-start',\n 'bottom-end',\n 'top-end'\n ],\n right: [\n 'right',\n 'left',\n 'right-start',\n 'right-end',\n 'left-start',\n 'left-end'\n ],\n 'left-start': [\n 'left-start',\n 'right-start',\n 'left-end',\n 'right-end',\n 'bottom-start',\n 'top-start'\n ],\n 'left-end': [\n 'left-end',\n 'right-end',\n 'left-start',\n 'right-start',\n 'bottom-end',\n 'top-end'\n ],\n left: ['left', 'right', 'left-start', 'left-end', 'right-start', 'right-end'],\n center: ['center', 'bottom', 'top', 'right', 'left']\n}\n","// Utils\nimport { FALLBACK_PLACEMENTS } from '../constants/fallbackPlacements'\n\n// Types\nimport type { Placement, PositionResult } from '@hooks/useFloating/types'\n\ntype CalcParams = {\n rect: DOMRect\n floatingRect: DOMRect\n placement: Placement\n offsetX: number\n offsetY: number\n}\n\nfunction calcForPlacement({\n rect,\n offsetY,\n offsetX,\n placement,\n floatingRect\n}: CalcParams): Omit<PositionResult, 'placement'> {\n let top = rect.top + offsetY\n let left = rect.left + offsetX\n\n switch (placement) {\n case 'top':\n top = rect.top - floatingRect.height - offsetY\n left = rect.left + rect.width / 2 - floatingRect.width / 2 + offsetX\n break\n\n case 'top-start':\n top = rect.top - floatingRect.height - offsetY\n break\n\n case 'top-end':\n top = rect.top - floatingRect.height - offsetY\n left = rect.right - offsetX - floatingRect.width\n break\n\n case 'bottom':\n top = rect.bottom + offsetY\n left = rect.left + rect.width / 2 - floatingRect.width / 2 + offsetX\n break\n\n case 'bottom-start':\n top = rect.bottom + offsetY\n break\n\n case 'bottom-end':\n top = rect.bottom + offsetY\n left = rect.right - offsetX - floatingRect.width\n break\n\n case 'left':\n top = rect.top + rect.height / 2 - floatingRect.height / 2 + offsetY\n left = rect.left - floatingRect.width - offsetX\n break\n\n case 'left-start':\n left = rect.left - floatingRect.width - offsetX\n break\n\n case 'left-end':\n top = rect.bottom - floatingRect.height - offsetY\n left = rect.left - floatingRect.width - offsetX\n break\n\n case 'right':\n top = rect.top + rect.height / 2 - floatingRect.height / 2 + offsetY\n left = rect.right + offsetX\n break\n\n case 'right-start':\n left = rect.right + offsetX\n break\n\n case 'right-end':\n left = rect.right + offsetX\n top = rect.bottom - floatingRect.height - offsetY\n break\n\n case 'center':\n left = rect.left + rect.width / 2 - floatingRect.width / 2 + offsetX\n top = rect.top + rect.height / 2 - floatingRect.height / 2 + offsetY\n break\n }\n\n return { top, left }\n}\n\nfunction clampToViewport(\n top: number,\n left: number,\n floatingRect: DOMRect,\n margin: number\n) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const clampedLeft = Math.min(\n Math.max(left, margin),\n vw - floatingRect.width - margin\n )\n const clampedTop = Math.min(\n Math.max(top, margin),\n vh - floatingRect.height - margin\n )\n\n return { top: clampedTop, left: clampedLeft }\n}\n\nfunction overflows(\n top: number,\n left: number,\n floatingRect: DOMRect,\n margin: number\n) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n return {\n left: left < margin,\n right: left + floatingRect.width > vw - margin,\n top: top < margin,\n bottom: top + floatingRect.height > vh - margin\n }\n}\n\nfunction fallbackPlacements(p: Placement): Placement[] {\n return FALLBACK_PLACEMENTS[p] ?? [p]\n}\n\nexport function getPositionInViewport(params: {\n rect: DOMRect\n margin?: number\n offsetX?: number\n offsetY?: number\n tryFlip?: boolean\n floatingRect: DOMRect\n placement: Placement\n}): PositionResult {\n const {\n rect,\n floatingRect,\n placement,\n offsetX = 0,\n offsetY = 0,\n margin = 8,\n tryFlip = true\n } = params\n\n const tries = tryFlip ? fallbackPlacements(placement) : [placement]\n\n for (const p of tries) {\n const raw = calcForPlacement({\n rect,\n floatingRect,\n placement: p,\n offsetX,\n offsetY\n })\n const o = overflows(raw.top, raw.left, floatingRect, margin)\n if (!o.left && !o.right && !o.top && !o.bottom) {\n return { ...raw, placement: p }\n }\n }\n\n const raw = calcForPlacement({\n rect,\n offsetY,\n offsetX,\n placement,\n floatingRect\n })\n const clamped = clampToViewport(raw.top, raw.left, floatingRect, margin)\n return { ...clamped, placement }\n}\n","// External Libraries\nimport { useMemo, useState, useEffect, useCallback } from 'react'\n\n// Utils\nimport { getPositionInViewport } from '@hooks/useFloating/utils/position'\n\n// Types\nimport type { FloatingOptions } from '@hooks/useFloating/types'\n\nexport type AnchorLike = { getBoundingClientRect: () => DOMRect }\ntype Anchor = HTMLElement | AnchorLike\n\nfunction isElement(value: unknown): value is Element {\n return value instanceof Element\n}\n\nexport function useFloating(\n targetRef: React.RefObject<Anchor>,\n options?: FloatingOptions\n) {\n const {\n portalRef,\n offsetX = 0,\n offsetY = 6,\n strategy = 'fixed',\n scrollContainerId,\n viewportMargin = 8,\n keepInViewport = true,\n absoluteReference = 'portal',\n placement = 'bottom-start'\n } = options || {}\n\n const [floatingEl, setFloatingEl] = useState<HTMLElement | null>(null)\n\n const update = useCallback(() => {\n const target = targetRef.current\n const floating = floatingEl\n if (!target || !floating) return\n\n const rect = target.getBoundingClientRect()\n const floatingRect = floating.getBoundingClientRect()\n\n const pos = getPositionInViewport({\n rect,\n offsetX,\n offsetY,\n placement,\n floatingRect,\n tryFlip: keepInViewport,\n margin: viewportMargin\n })\n\n let left = pos.left\n let top = pos.top\n\n if (strategy === 'absolute') {\n if (absoluteReference === 'offsetParent') {\n const op = floating.offsetParent\n if (op instanceof HTMLElement) {\n const r = op.getBoundingClientRect()\n\n left -= r.left + op.clientLeft - op.scrollLeft\n top -= r.top + op.clientTop - op.scrollTop\n }\n }\n\n if (absoluteReference === 'portal') {\n const el = portalRef?.current\n if (el) {\n const r = el.getBoundingClientRect()\n\n left -= r.left + el.clientLeft - el.scrollLeft\n top -= r.top + el.clientTop - el.scrollTop\n }\n }\n }\n\n floating.style.top = '0px'\n floating.style.left = '0px'\n floating.style.position = strategy\n floating.style.transform = `translate(${left}px, ${top}px)`\n }, [\n offsetX,\n offsetY,\n strategy,\n floatingEl,\n placement,\n targetRef,\n keepInViewport,\n viewportMargin,\n absoluteReference,\n portalRef?.current\n ])\n\n useEffect(() => {\n if (!floatingEl) return\n\n console.log({ scrollContainerId })\n\n const scrollContainer: Window | HTMLElement | null = scrollContainerId\n ? document.getElementById(scrollContainerId)\n : window\n\n update()\n\n const rafUpdate = () => requestAnimationFrame(update)\n\n // scroll (Window ou Element)\n if (scrollContainer && 'addEventListener' in scrollContainer) {\n scrollContainer.addEventListener('scroll', rafUpdate, { passive: true })\n }\n window.addEventListener('resize', rafUpdate, { passive: true })\n\n const ro = new ResizeObserver(rafUpdate)\n\n const target = targetRef.current\n\n if (isElement(target)) ro.observe(target)\n\n ro.observe(floatingEl)\n\n return () => {\n if (scrollContainer && 'removeEventListener' in scrollContainer) {\n scrollContainer.removeEventListener('scroll', rafUpdate as any)\n }\n window.removeEventListener('resize', rafUpdate)\n ro.disconnect()\n }\n }, [floatingEl, update, scrollContainerId, targetRef])\n\n const floatingRef = useCallback((el: HTMLElement | null) => {\n setFloatingEl(el)\n }, [])\n\n return useMemo(\n () => ({ floatingEl, floatingRef, update }),\n [floatingEl, floatingRef, update]\n )\n}\n"],"mappings":"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"}
@@ -107,4 +107,4 @@ type TypeStyles<TFactory extends StylesFactoryAny> = Partial<{ [K in keyof Retur
107
107
  type StylesOf<T extends (...args: any) => any> = Partial<ReturnType<T>>;
108
108
  //#endregion
109
109
  export { StylesOf as n, TypeStyles as r, SlotStyle as t };
110
- //# sourceMappingURL=useThemedStyles-C23Tevdv.d.ts.map
110
+ //# sourceMappingURL=useThemedStyles-BUR6rDGs.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "softable-pixels-web",
3
- "version": "1.1.20",
3
+ "version": "1.1.21",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "author": "softable",
@@ -1 +0,0 @@
1
- {"version":3,"file":"Input-B6a6mXsZ.js","names":[],"sources":["../src/components/commons/inputs/Input/hooks/useInput/index.ts","../src/components/commons/inputs/Input/styles.ts","../src/components/commons/inputs/Input/index.tsx"],"sourcesContent":["// External Libraries\nimport { useState, useRef } from 'react'\n\n// Types\nimport type { InputProps } from '../../types'\n\nexport function useInput({ onChange }: InputProps) {\n // Refs\n const inputRef = useRef<HTMLInputElement>(null)\n\n // States\n const [showPassword, setShowPassword] = useState(false)\n\n // Functions\n function togglePasswordVisibility() {\n setShowPassword(prev => !prev)\n }\n\n function handleRefMethods() {\n return { focus: handleFocus, blur: handleBlur }\n }\n\n function handleFocus() {\n inputRef.current?.focus()\n }\n\n function handleBlur() {\n inputRef.current?.blur()\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const value = e.target.value\n onChange?.(value)\n }\n\n return {\n inputRef,\n showPassword,\n handleChange,\n handleRefMethods,\n togglePasswordVisibility\n }\n}\n","// Hooks\nimport { styled } from '@hooks/useThemedStyles/types'\n\n// Types\nimport type { InputProps } from './types'\n\nexport function createInputStyles(props: InputProps) {\n return styled({\n container: {\n width: '100%',\n\n display: 'flex',\n flexDirection: 'column',\n\n rowGap: '0.375rem'\n },\n wrapper: {\n width: '100%',\n display: 'flex',\n alignItems: 'center',\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 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',\n outline: `2px solid var(${props.errorMessage ? '--px-color-error' : '--px-color-primary'})`\n }\n }\n },\n\n input: {\n flex: 1,\n\n fontWeight: 500,\n fontSize: '1rem',\n lineHeight: '1.5rem',\n fontFamily: 'inherit',\n color: 'var(--px-text-primary)',\n\n __rules: {\n '&:disabled': {\n cursor: 'not-allowed'\n },\n\n '&:focus': {\n outline: 'none'\n },\n\n '&::placeholder': {\n fontWeight: 400,\n color: 'var(--px-text-secondary)'\n }\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 button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n\n cursor: 'pointer',\n padding: '0.25rem',\n borderRadius: '0.5rem',\n\n __rules: {\n '&:focus': {\n outline: '1px solid var(--px-border-primary)'\n }\n }\n }\n })\n}\n","// External Libraries\nimport { forwardRef, useId, useImperativeHandle, useMemo } from 'react'\n\n// Components\nimport { Label } from '../../toolkit/Label'\nimport { Icon } from '@components/commons/toolkit/Icon'\n\n// Types\nimport type { InputProps, InputMethods } from './types'\n\n// Hooks\nimport { useInput } from './hooks/useInput'\nimport { useThemedStyles } from '@hooks/useThemedStyles'\n\n// Styles\nimport { createInputStyles } from './styles'\n\nexport const Input = forwardRef<InputMethods, InputProps>((props, ref) => {\n // Constants\n const reactId = useId()\n const inputId = useMemo(() => {\n return props.id || `input-${reactId}`\n }, [props.id, reactId])\n\n // Hooks\n const {\n inputRef,\n showPassword,\n handleChange,\n handleRefMethods,\n togglePasswordVisibility\n } = useInput(props)\n useImperativeHandle(ref, handleRefMethods)\n\n // Hooks\n const { styles, classes } = useThemedStyles(props, createInputStyles, {\n pick: p => [p.disabled, p.errorMessage],\n override: props.styles,\n applyCommonProps: true,\n commonSlot: 'container'\n })\n\n // Functions\n function getType() {\n if (props.type === 'password' && showPassword) return 'text'\n return props.type\n }\n\n function renderEndContent() {\n if (props.type === 'password') {\n return (\n <button\n type=\"button\"\n style={styles.button}\n className={classes.button}\n onClick={togglePasswordVisibility}\n >\n <Icon\n size=\"sm\"\n name={showPassword ? 'general-eye-off' : 'general-eye'}\n />\n </button>\n )\n }\n\n return props.endIcon ?? null\n }\n\n return (\n <div style={styles.container}>\n {props.hideLabel ? null : (\n <Label\n htmlFor={inputId}\n label={props.label}\n required={props.required}\n requiredColor={props.requiredColor}\n {...props.labelConfig}\n />\n )}\n\n <div style={styles.wrapper} className={classes.wrapper}>\n {props.startIcon}\n\n <input\n ref={inputRef}\n id={inputId}\n type={getType()}\n value={props.value}\n style={styles.input}\n required={props.required}\n disabled={props.disabled}\n className={classes.input}\n minLength={props.minLength}\n maxLength={props.maxLength}\n placeholder={props.placeholder}\n aria-label={!props.hideLabel ? undefined : props.label}\n onChange={handleChange}\n />\n\n {renderEndContent()}\n </div>\n\n {props.errorMessage ? (\n <span style={styles.error}>{props.errorMessage}</span>\n ) : null}\n </div>\n )\n})\n\nInput.displayName = 'Input'\n"],"mappings":";;;;;;;AAMA,SAAgB,SAAS,EAAE,YAAwB;CAEjD,MAAM,WAAW,OAAyB,KAAK;CAG/C,MAAM,CAAC,cAAc,mBAAmB,SAAS,MAAM;CAGvD,SAAS,2BAA2B;AAClC,mBAAgB,SAAQ,CAAC,KAAK;;CAGhC,SAAS,mBAAmB;AAC1B,SAAO;GAAE,OAAO;GAAa,MAAM;GAAY;;CAGjD,SAAS,cAAc;AACrB,WAAS,SAAS,OAAO;;CAG3B,SAAS,aAAa;AACpB,WAAS,SAAS,MAAM;;CAG1B,SAAS,aAAa,GAAwC;EAC5D,MAAM,QAAQ,EAAE,OAAO;AACvB,aAAW,MAAM;;AAGnB,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;;;;ACnCH,SAAgB,kBAAkB,OAAmB;AACnD,QAAO,OAAO;EACZ,WAAW;GACT,OAAO;GAEP,SAAS;GACT,eAAe;GAEf,QAAQ;GACT;EACD,SAAS;GACP,OAAO;GACP,SAAS;GACT,YAAY;GAEZ,aAAa;GACb,WAAW;GACX,cAAc;GACd,SAAS;GAET,SAAS,MAAM,WAAW,KAAM;GAChC,WAAW;GACX,aAAa,MAAM,eACf,0BACA;GAEJ,SAAS,EACP,kBAAkB;IAChB,eAAe;IACf,SAAS,iBAAiB,MAAM,eAAe,qBAAqB,qBAAqB;IAC1F,EACF;GACF;EAED,OAAO;GACL,MAAM;GAEN,YAAY;GACZ,UAAU;GACV,YAAY;GACZ,YAAY;GACZ,OAAO;GAEP,SAAS;IACP,cAAc,EACZ,QAAQ,eACT;IAED,WAAW,EACT,SAAS,QACV;IAED,kBAAkB;KAChB,YAAY;KACZ,OAAO;KACR;IACF;GACF;EAED,OAAO;GACL,SAAS;GACT,YAAY;GACZ,YAAY;GACZ,UAAU;GACV,YAAY;GACZ,OAAO;GACR;EAED,QAAQ;GACN,SAAS;GACT,YAAY;GACZ,gBAAgB;GAEhB,QAAQ;GACR,SAAS;GACT,cAAc;GAEd,SAAS,EACP,WAAW,EACT,SAAS,sCACV,EACF;GACF;EACF,CAAC;;;;;ACxEJ,MAAa,QAAQ,YAAsC,OAAO,QAAQ;CAExE,MAAM,UAAU,OAAO;CACvB,MAAM,UAAU,cAAc;AAC5B,SAAO,MAAM,MAAM,SAAS;IAC3B,CAAC,MAAM,IAAI,QAAQ,CAAC;CAGvB,MAAM,EACJ,UACA,cACA,cACA,kBACA,6BACE,SAAS,MAAM;AACnB,qBAAoB,KAAK,iBAAiB;CAG1C,MAAM,EAAE,QAAQ,YAAY,gBAAgB,OAAO,mBAAmB;EACpE,OAAM,MAAK,CAAC,EAAE,UAAU,EAAE,aAAa;EACvC,UAAU,MAAM;EAChB,kBAAkB;EAClB,YAAY;EACb,CAAC;CAGF,SAAS,UAAU;AACjB,MAAI,MAAM,SAAS,cAAc,aAAc,QAAO;AACtD,SAAO,MAAM;;CAGf,SAAS,mBAAmB;AAC1B,MAAI,MAAM,SAAS,WACjB,QACE,oBAAC;GACC,MAAK;GACL,OAAO,OAAO;GACd,WAAW,QAAQ;GACnB,SAAS;aAET,oBAAC;IACC,MAAK;IACL,MAAM,eAAe,oBAAoB;KACzC;IACK;AAIb,SAAO,MAAM,WAAW;;AAG1B,QACE,qBAAC;EAAI,OAAO,OAAO;;GAChB,MAAM,YAAY,OACjB,oBAAC;IACC,SAAS;IACT,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,eAAe,MAAM;IACrB,GAAI,MAAM;KACV;GAGJ,qBAAC;IAAI,OAAO,OAAO;IAAS,WAAW,QAAQ;;KAC5C,MAAM;KAEP,oBAAC;MACC,KAAK;MACL,IAAI;MACJ,MAAM,SAAS;MACf,OAAO,MAAM;MACb,OAAO,OAAO;MACd,UAAU,MAAM;MAChB,UAAU,MAAM;MAChB,WAAW,QAAQ;MACnB,WAAW,MAAM;MACjB,WAAW,MAAM;MACjB,aAAa,MAAM;MACnB,cAAY,CAAC,MAAM,YAAY,SAAY,MAAM;MACjD,UAAU;OACV;KAED,kBAAkB;;KACf;GAEL,MAAM,eACL,oBAAC;IAAK,OAAO,OAAO;cAAQ,MAAM;KAAoB,GACpD;;GACA;EAER;AAEF,MAAM,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Popover-C-NRJlWf.js","names":["node: HTMLElement | null","Popover: React.FC<PopoverProps>"],"sources":["../src/components/commons/toolkit/Popover/styles.ts","../src/components/commons/toolkit/Popover/utils/portal.ts","../src/components/commons/toolkit/Popover/types.ts","../src/components/commons/toolkit/Popover/index.tsx"],"sourcesContent":["// Types\nimport type { PopoverProps } from './types'\nimport { styled } from '@hooks/useThemedStyles/types'\n\nexport function createPopoverStyles({ hideShadow = false }: PopoverProps) {\n return styled({\n popoverNode: {\n position: 'fixed',\n left: 0,\n top: 0,\n\n zIndex: 10,\n\n padding: '0.25rem',\n\n backgroundColor: 'var(--px-bg)',\n boxShadow: hideShadow ? 'none' : 'var(--px-ring-1)',\n\n borderRadius: 'var(--px-radius-xl)'\n },\n\n trigger: {\n width: 'fit-content',\n height: 'fit-content'\n }\n })\n}\n","export function resolvePortalContainer(portalId?: string): HTMLElement | null {\n if (typeof document === 'undefined') return null\n if (!portalId) return document.body\n return document.getElementById(portalId) ?? document.body\n}\n\nexport function createsFixedContainingBlock(el: HTMLElement): boolean {\n let node: HTMLElement | null = el\n while (node) {\n const s = getComputedStyle(node)\n if (\n s.transform !== 'none' ||\n s.translate !== 'none' ||\n s.perspective !== 'none' ||\n s.filter !== 'none' ||\n s.backdropFilter !== 'none' ||\n s.contain.includes('paint')\n ) {\n return true\n }\n node = node.parentElement\n }\n return false\n}\n","// External Libraries\nimport type { MouseEventHandler, ReactNode, RefObject } from 'react'\n\n// Types\nimport type { createPopoverStyles } from './styles'\nimport type { FloatingOptions } from '@hooks/useFloating/types'\nimport type { PaddingProps } from '@hooks/useThemedStyles/types'\n\nexport type PopoverTriggerRenderProps = {\n ariaExpanded: boolean\n ref: RefObject<HTMLElement>\n onClick: () => void\n}\n\nexport interface PopoverProps extends PaddingProps {\n open?: boolean\n portalId?: string\n hideShadow?: boolean\n closeOnEscape?: boolean\n closeOnOutsideClick?: boolean\n floatingOptions?: FloatingOptions\n anchorRef?: RefObject<HTMLElement>\n absoluteReference?: FloatingOptions['absoluteReference']\n\n onOpenChange?: (v: boolean) => void\n onMouseEnter?: MouseEventHandler<HTMLDivElement>\n onMouseLeave?: MouseEventHandler<HTMLDivElement>\n content: (ctx: { close: () => void; widthTrigger: number }) => ReactNode\n trigger?: (props: PopoverTriggerRenderProps) => ReactNode\n\n styles?: Partial<ReturnType<typeof createPopoverStyles>>\n}\n","// External Libraries\n/** biome-ignore-all lint/suspicious/noExplicitAny: <Not needed> */\n/** biome-ignore-all lint/correctness/useExhaustiveDependencies: <Not needed> */\nimport type React from 'react'\nimport { createPortal } from 'react-dom'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\n// Hooks\nimport { useDismiss } from '@hooks/useDismiss'\nimport { useFloating } from '@hooks/useFloating'\nimport { useThemedStyles } from '@hooks/useThemedStyles'\n\n// Types\nimport type { PopoverProps } from './types'\n\n// Styles\nimport { createPopoverStyles } from './styles'\nimport { createsFixedContainingBlock } from './utils'\n\nexport * as PopoverTypes from './types'\n\nexport const Popover: React.FC<PopoverProps> = props => {\n const {\n portalId,\n anchorRef,\n floatingOptions,\n absoluteReference,\n closeOnEscape = true,\n open: controlledOpen,\n closeOnOutsideClick = true,\n trigger,\n content,\n onOpenChange,\n onMouseEnter,\n onMouseLeave\n } = props\n\n // Refs\n const triggerRef = useRef<HTMLElement | null>(null)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const portalRef = useRef<HTMLElement | null>(null)\n\n const resolvedAnchorRef = (anchorRef ?? triggerRef) as any\n\n // States\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const [widthTrigger, setWidthTrigger] = useState(\n triggerRef.current?.offsetWidth ?? 0\n )\n const [portalEl, setPortalEl] = useState<HTMLElement | null>(null)\n\n const open = controlledOpen ?? uncontrolledOpen\n\n // Hooks\n const { styles } = useThemedStyles(props, createPopoverStyles, {\n applyCommonProps: true,\n override: props.styles,\n commonSlot: 'popoverNode',\n pick: p => [p.open, p.content, p.trigger]\n })\n\n // UseEffects\n useEffect(() => {\n if (typeof document === 'undefined') return\n\n if (!portalId) {\n setPortalEl(null)\n return\n }\n\n const found = document.getElementById(portalId) as HTMLElement | null\n setPortalEl(found)\n\n if (found) return\n\n const obs = new MutationObserver(() => {\n const el = document.getElementById(portalId) as HTMLElement | null\n if (el) {\n setPortalEl(el)\n obs.disconnect()\n }\n })\n\n obs.observe(document.documentElement, { childList: true, subtree: true })\n return () => obs.disconnect()\n }, [portalId])\n\n useEffect(() => {\n portalRef.current = portalEl\n }, [portalEl])\n\n const portalContainer = useMemo(() => {\n if (typeof document === 'undefined') return null\n return portalEl ?? document.body\n }, [portalEl])\n\n const effectiveFloatingOptions = useMemo(() => {\n const base = {\n offsetY: 6,\n keepInViewport: true,\n placement: 'bottom-start',\n portalRef\n } as const\n\n const userStrategy = floatingOptions?.strategy ?? 'fixed'\n\n const shouldFixFixedInPortal =\n !!portalId &&\n portalContainer &&\n userStrategy === 'fixed' &&\n portalContainer !== document.body &&\n createsFixedContainingBlock(portalContainer)\n\n if (portalContainer)\n console.log(createsFixedContainingBlock(portalContainer))\n if (shouldFixFixedInPortal) {\n return {\n ...base,\n ...floatingOptions,\n strategy: 'absolute',\n absoluteReference: 'offsetParent'\n } as any\n }\n\n return {\n ...base,\n ...floatingOptions,\n absoluteReference: absoluteReference\n } as any\n }, [portalId, portalContainer, floatingOptions])\n\n const { floatingRef, update } = useFloating(\n resolvedAnchorRef,\n effectiveFloatingOptions\n )\n\n const setOpen = useCallback(\n (v: boolean) => {\n onOpenChange?.(v)\n if (controlledOpen === undefined) setUncontrolledOpen(v)\n },\n [controlledOpen, onOpenChange]\n )\n\n const close = useCallback(() => setOpen(false), [setOpen])\n\n useDismiss({\n open,\n closeOnEscape,\n closeOnOutsideClick,\n refs: [resolvedAnchorRef, popoverRef],\n onClose: close\n })\n\n useEffect(() => {\n if (open) requestAnimationFrame(update)\n setWidthTrigger(triggerRef.current?.offsetWidth ?? 0)\n }, [open, update])\n\n useEffect(() => {\n const handleResize = () => {\n setWidthTrigger(triggerRef.current?.offsetWidth ?? 0)\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [])\n\n const triggerNode =\n trigger?.({\n ariaExpanded: open,\n ref: triggerRef as any,\n onClick: () => setOpen(!open)\n }) ?? null\n\n const popoverNode = open ? (\n <div\n ref={el => {\n popoverRef.current = el\n floatingRef(el)\n }}\n role=\"dialog\"\n style={styles.popoverNode}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onPointerDownCapture={e => e.stopPropagation()}\n onMouseDownCapture={e => e.stopPropagation()}\n >\n {content({ close, widthTrigger })}\n </div>\n ) : null\n\n return (\n <>\n {triggerNode}\n {typeof document !== 'undefined'\n ? createPortal(popoverNode, portalContainer ?? document.body)\n : null}\n </>\n )\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Select-CVcQGxjv.js","names":["OptionItem: React.FC<OptionItemProps>","Select: React.FC<SelectProps>"],"sources":["../src/components/commons/inputs/Select/components/OptionItem/styles.ts","../src/components/commons/inputs/Select/components/OptionItem/index.tsx","../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 { styled } from '@hooks/useThemedStyles/types'\nimport type { OptionItemProps } from './types'\n\nexport function createOptionsStyles({ isSelected }: OptionItemProps) {\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: isSelected\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 */\n// Hooks\nimport { useThemedStyles } from '@hooks/useThemedStyles'\n\n// Types\nimport type { OptionItemProps } from './types'\n\n// Styles\nimport { createOptionsStyles } from './styles'\n\nexport const OptionItem: React.FC<OptionItemProps> = props => {\n // Hooks\n const { styles, classes } = useThemedStyles(props, createOptionsStyles)\n\n // Functions\n function handleClick() {\n props.onClick(props.option.value)\n }\n\n return (\n <button\n type=\"button\"\n role=\"option\"\n style={styles.container}\n className={classes.container}\n aria-label={props.option.label}\n aria-selected={props.isSelected}\n onClick={handleClick}\n >\n <span style={styles.text}>{props.option.label}</span>\n </button>\n )\n}\n","// External Libraries\nimport { useState } from 'react'\n\n// Types\nimport type { SelectProps } from '../../types'\n\nexport function useSelect({\n value,\n multiple,\n canClear,\n onChange\n}: SelectProps) {\n // States\n const [open, setOpen] = useState(false)\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 togglePanel() {\n setOpen(prev => !prev)\n }\n\n function closePanel() {\n setOpen(false)\n }\n\n return { open, togglePanel, closePanel, handleOptionClick }\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 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'\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'\nimport { BasePopover } from '@components/commons/structure/BasePopover'\n\nexport * as SelectTypes from './types'\n\nexport const Select: React.FC<SelectProps> = props => {\n // Hooks\n const { open, togglePanel, 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 // Constants\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\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\n return result\n }\n\n function renderTrigger({\n ref,\n ariaExpanded,\n onClick\n }: PopoverTriggerRenderProps) {\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 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={{ viewportMargin: 0, strategy: props.strategy }}\n trigger={renderTrigger}\n onOpenChange={togglePanel}\n >\n <div style={styles.panel}>\n {props.options.map(option => (\n <OptionItem\n key={option.value}\n option={option}\n isSelected={props.value.includes(option.value)}\n onClick={handleOptionClick}\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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mask-modules.js","names":["locales: LocaleRegistry"],"sources":["../src/services/MaskModule/MaskModule.ts","../src/services/MaskModule/enums.ts","../src/services/MaskModule/base/maskUtils.ts","../src/services/MaskModule/base/BaseMask.ts","../src/services/MaskModule/locales/br/masks/CpfMask.ts","../src/services/MaskModule/locales/br/masks/CnpjMask.ts","../src/services/MaskModule/locales/br/masks/DateMask.ts","../src/services/MaskModule/locales/br/masks/PhoneMask.ts","../src/services/MaskModule/locales/br/masks/FloatMask.ts","../src/services/MaskModule/locales/br/masks/MoneyMask.ts","../src/services/MaskModule/locales/br/masks/IntegerMask.ts","../src/services/MaskModule/locales/br/masks/ZipCodeMask.ts","../src/services/MaskModule/types.ts","../src/services/MaskModule/locales/br/masks/DocumentMask.ts","../src/services/MaskModule/locales/br/masks/NumericSymbolMask.ts","../src/services/MaskModule/base/BaseValidator.ts","../src/services/MaskModule/locales/br/validators/CpfValidator.ts","../src/services/MaskModule/locales/br/validators/CnpjValidator.ts","../src/services/MaskModule/locales/br/validators/DateValidator.ts","../src/services/MaskModule/locales/br/validators/PhoneValidator.ts","../src/services/MaskModule/locales/br/validators/FloatValidator.ts","../src/services/MaskModule/locales/br/validators/MoneyValidator.ts","../src/services/MaskModule/locales/br/validators/IntegerValidator.ts","../src/services/MaskModule/locales/br/validators/ZipCodeValidator.ts","../src/services/MaskModule/locales/br/validators/DocumentValidator.ts","../src/services/MaskModule/locales/br/validators/NumericSymbolValidator.ts","../src/services/MaskModule/locales/br/registerMasks.ts","../src/services/MaskModule/index.ts"],"sourcesContent":["// Types\nimport type { Locale, MaskType } from './enums'\nimport type { BaseMask } from './base/BaseMask'\nimport type { BaseValidator } from './base/BaseValidator'\n\ntype MaskRegistry = {\n masks: Record<MaskType, BaseMask>\n validators: Record<MaskType, BaseValidator>\n}\n\ntype LocaleRegistry = Record<Locale, MaskRegistry>\n\nconst locales: LocaleRegistry = {} as LocaleRegistry\n\nfunction ensureLocale(locale: Locale): void {\n if (!locales[locale]) {\n locales[locale] = { masks: {}, validators: {} } as LocaleRegistry[Locale]\n }\n}\n\nexport const MaskModule = {\n registerMask(locale: Locale, type: MaskType, mask: BaseMask): void {\n ensureLocale(locale)\n locales[locale].masks[type] = mask\n },\n\n registerValidator(\n locale: Locale,\n type: MaskType,\n validator: BaseValidator\n ): void {\n ensureLocale(locale)\n locales[locale].validators[type] = validator\n },\n\n getMask(locale: Locale, type: MaskType): BaseMask | undefined {\n return locales[locale]?.masks[type]\n },\n\n getValidator(locale: Locale, type: MaskType): BaseValidator | undefined {\n return locales[locale]?.validators[type]\n },\n\n reset(): void {\n Object.keys(locales).forEach(locale => {\n delete locales[locale as Locale]\n })\n }\n}\n","/**\n * Supported locales (country + language region).\n *\n * Extend this enum as needed for new countries.\n */\nexport enum Locale {\n BR = 'pt-BR', // Brazil\n US = 'en-US', // United States\n AR = 'es-AR' // Argentina\n}\n\n/**\n * Types of masks supported in the system.\n *\n * Add new types as needed for different data formats.\n */\nexport enum MaskType {\n CPF = 'CPF',\n CNPJ = 'CNPJ',\n DOCUMENT = 'DOCUMENT',\n PHONE = 'PHONE',\n DATE = 'DATE',\n FLOAT = 'FLOAT',\n INTEGER = 'INTEGER',\n MONEY = 'MONEY',\n ZIP_CODE = 'ZIP_CODE',\n NUMERIC_SYMBOL = 'NUMERIC_SYMBOL'\n}\n","/**\n * Removes all non-numeric characters from a string.\n * @param value - Input string.\n * @returns String containing only digits.\n */\nexport function onlyDigits(value: string): string {\n if (value == null) return ''\n return value.replace(/\\D/g, '')\n}\n\n/**\n * Applies the mask progressively according to the available characters.\n *\n * Alphanumeric characters (letters and digits) in the pattern will be replaced\n * by characters from the input `value`, in order. Non-alphanumeric characters\n * (e.g. `.`, `-`, `/`) are treated as static parts of the mask.\n *\n * Examples:\n *\n * applyPattern('12345', 'XXX.XXX.XXX-XX') -> '123.45'\n *\n * applyPattern('AB1234', 'AA-NN.NN') -> 'AB-12.34'\n *\n * applyPattern('12345678901', 'XXX.XXX.XXX-XX') -> '123.456.789-01'\n *\n * @param value - raw input string (partial or complete)\n * @param pattern - mask pattern where alphanumeric characters are placeholders\n * @returns partially formatted string\n */\nexport function applyPattern(value: string, pattern: string): string {\n if (value == null) return ''\n if (pattern == null) return value\n\n let result = ''\n let digitIndex = 0\n\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n\n if (/[a-zA-Z0-9]/.test(char)) {\n if (digitIndex < value.length) {\n result += value[digitIndex++]\n } else {\n break // No more digits available, stop applying more mask\n }\n } else {\n // Fixed mask character\n if (digitIndex < value.length) result += char\n }\n }\n\n return result\n}\n\n/**\n * Checks whether a string matches a regular expression.\n * @param value - Input string.\n * @param regex - Regular expression to test.\n * @returns Boolean indicating whether it matches.\n */\nexport function matchesPattern(value: string, regex: RegExp): boolean {\n return regex.test(value)\n}\n\n/**\n * Limits the length of a string to a maximum.\n * @param value - Input string.\n * @param maxLength - Maximum length allowed.\n * @returns Truncated string if longer than maxLength.\n */\nexport function limitLength(value: string, maxLength?: number): string {\n if (value == null) return ''\n if (maxLength === undefined) return value\n return value.slice(0, maxLength)\n}\n\n/**\n * Checks if a string meets min and max length constraints.\n * @param value - Input string.\n * @param min - Minimum length (optional).\n * @param max - Maximum length (optional).\n * @returns Boolean indicating whether the length is valid.\n */\nexport function isValidLength(\n value: string,\n min?: number,\n max?: number\n): boolean {\n if (value == null) return false\n\n if (min !== undefined && value.length < min) return false\n if (max !== undefined && value.length > max) return false\n return true\n}\n","import type { Mask } from '../types'\nimport { onlyDigits } from './maskUtils'\n\n/**\n * Abstract class that provides default behavior for most masks.\n * - Implements unmask() by removing all non-numeric characters.\n * - Supports optional maxLength and minLength constraints.\n */\nexport abstract class BaseMask implements Mask {\n /**\n * Maximum length of the masked string (optional).\n */\n maxLength?: number\n\n /**\n * Minimum length of the masked string (optional).\n */\n minLength?: number\n\n constructor(minLength?: number, maxLength?: number) {\n this.maxLength = maxLength\n this.minLength = minLength\n }\n\n /**\n * Removes all non-numeric characters from a string.\n * @param value - Masked or unmasked string.\n * @returns Plain string with digits only.\n */\n unmask(value: string): string {\n return onlyDigits(value)\n }\n\n /**\n * Must be implemented by each concrete mask class.\n * Applies the mask format to the input string.\n * @param value - Raw string.\n * @returns Masked string.\n */\n abstract format(value: string): string\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { applyPattern, limitLength, onlyDigits } from '../../../base/maskUtils'\n\nexport const CPF_PATTERN = 'XXX.XXX.XXX-XX'\n\nexport class CpfMask extends BaseMask {\n constructor() {\n const length = CPF_PATTERN.length\n super(length, length)\n }\n\n format(value: string): string {\n const digits = onlyDigits(value)\n const formatted = applyPattern(digits, CPF_PATTERN)\n\n return limitLength(formatted, this.maxLength)\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { applyPattern, limitLength, onlyDigits } from '../../../base/maskUtils'\n\nexport const CNPJ_PATTERN = 'XX.XXX.XXX/XXXX-XX'\n\nexport class CnpjMask extends BaseMask {\n constructor() {\n const length = CNPJ_PATTERN.length\n super(length, length)\n }\n\n format(value: string): string {\n const digits = onlyDigits(value)\n const formatted = applyPattern(digits, CNPJ_PATTERN)\n\n return limitLength(formatted, this.maxLength)\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { limitLength, onlyDigits } from '../../../base/maskUtils'\n\nconst DATE_PATTERN = 'DD/MM/YYYY'\n\nexport class DateMask extends BaseMask {\n constructor() {\n const length = DATE_PATTERN.length\n super(length, length)\n }\n\n format(value: string): string {\n const digits = onlyDigits(value)\n\n let day = digits.slice(0, 2)\n let month = digits.slice(2, 4)\n let year = digits.slice(4, 8)\n\n // Clamp day (01–31)\n if (day.length === 2) {\n const parsed = parseInt(day)\n if (parsed > 31) day = '31'\n else if (parsed < 1) day = '01'\n }\n\n // Clamp month (01–12)\n if (month.length === 2) {\n const parsed = parseInt(month)\n if (parsed > 12) month = '12'\n else if (parsed < 1) month = '01'\n }\n\n // Clamp year (>= 0000)\n if (year.length === 4) {\n const parsed = parseInt(year)\n if (parsed < 0) year = '0000'\n }\n\n // Rebuild progressively\n let result = ''\n if (day) result += day\n if (month) result += `/${month}`\n if (year) result += `/${year}`\n\n return limitLength(result, this.maxLength)\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { limitLength, onlyDigits } from '../../../base/maskUtils'\n\n/**\n * Formats a Brazilian phone number progressively:\n * (XX) XXXXX-XXXX or (XX) XXXX-XXXX depending on length.\n */\nexport class PhoneMask extends BaseMask {\n constructor(maxLength = 15) {\n super(14, maxLength) // 14 (fixo) or 15 (celular)\n }\n\n format(value: string): string {\n const digits = limitLength(onlyDigits(value), this.maxLength)\n if (!digits) return ''\n\n // DDD\n if (digits.length < 3) return `(${digits}`\n\n const ddd = digits.slice(0, 2)\n const rest = digits.slice(2)\n\n // Fixo: 8 dígitos / Celular: 9 dígitos\n if (rest.length <= 4) {\n return `(${ddd}) ${rest}`\n } else if (rest.length <= 8) {\n const part1 = rest.slice(0, 4)\n const part2 = rest.slice(4)\n return `(${ddd}) ${part1}${part2 ? `-${part2}` : ''}`\n } else {\n const part1 = rest.slice(0, 5)\n const part2 = rest.slice(5)\n return `(${ddd}) ${part1}-${part2}`\n }\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { onlyDigits, limitLength } from '../../../base/maskUtils'\n\n/**\n * Automatically formats a numeric input as a float using comma as decimal separator.\n *\n * Ignores user-entered punctuation and inserts the comma based on configured decimal places.\n */\nexport class FloatMask extends BaseMask {\n private maxDecimalPlaces: number\n\n constructor(decimalDigits = 2, maxLength = 20) {\n super(1, maxLength)\n this.maxDecimalPlaces = decimalDigits\n }\n\n format(value: string): string {\n const rawDigits = onlyDigits(value)\n const digits = limitLength(rawDigits, this.maxLength)\n\n if (!digits) return ''\n\n const length = digits.length\n\n // If the string is shorter than or equal to the number of decimal places, prefix with zeros\n if (length <= this.maxDecimalPlaces) {\n const padded = digits.padStart(this.maxDecimalPlaces + 1, '0')\n const intPart = padded.slice(0, padded.length - this.maxDecimalPlaces)\n const decimalPart = padded.slice(-this.maxDecimalPlaces)\n return `${intPart},${decimalPart}`\n }\n\n const intPart = digits.slice(0, length - this.maxDecimalPlaces)\n const decimalPart = digits.slice(-this.maxDecimalPlaces)\n const intFormatted = this.formatThousands(intPart)\n\n return `${intFormatted},${decimalPart}`\n }\n\n /**\n * Adds dot thousand separators to a string of digits.\n * Example: \"1234567\" => \"1.234.567\"\n */\n private formatThousands(value: string): string {\n return value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { onlyDigits } from '../../../base/maskUtils'\n\n/**\n * Formats input as currency, with thousand separator, decimal comma,\n * optional prefix (e.g. R$, $), and support for negatives.\n *\n * Examples:\n * - \"123456\" → \"R$ 1.234,56\"\n * - \"-123\" → \"R$ -1,23\"\n */\nexport class MoneyMask extends BaseMask {\n private maxDecimalPlaces: number\n private prefix: string\n private allowNegative: boolean\n\n constructor({\n prefix = 'R$',\n maxDecimalPlaces = 2,\n allowNegative = true,\n maxLength = 20\n }: {\n prefix?: string\n maxDecimalPlaces?: number\n allowNegative?: boolean\n maxLength?: number\n } = {}) {\n super(1, maxLength)\n this.prefix = prefix\n this.maxDecimalPlaces = maxDecimalPlaces\n this.allowNegative = allowNegative\n }\n\n format(value: string): string {\n if (!value) return ''\n\n const isNegative = this.allowNegative && value.trim().startsWith('-')\n const digits = onlyDigits(value).slice(0, this.maxLength)\n\n if (!digits) {\n return isNegative\n ? `${this.prefix} -0,${'0'.repeat(this.maxDecimalPlaces)}`\n : `${this.prefix} 0,${'0'.repeat(this.maxDecimalPlaces)}`\n }\n\n const len = digits.length\n\n // Ex: 3 digits, 2 decimals → '003' => '0,03'\n if (len <= this.maxDecimalPlaces) {\n const padded = digits.padStart(this.maxDecimalPlaces + 1, '0')\n const intPart = padded.slice(0, padded.length - this.maxDecimalPlaces)\n const decimalPart = padded.slice(-this.maxDecimalPlaces)\n return `${this.prefix} ${isNegative ? '-' : ''}${intPart},${decimalPart}`\n }\n\n const intRaw = digits.slice(0, len - this.maxDecimalPlaces)\n const decimal = digits.slice(-this.maxDecimalPlaces)\n const intFormatted = this.formatThousands(intRaw)\n\n return `${this.prefix} ${isNegative ? '-' : ''}${intFormatted},${decimal}`\n }\n\n private formatThousands(value: string): string {\n return value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { limitLength, onlyDigits } from '../../../base/maskUtils'\n\n/**\n * Formats integers, allowing only digits.\n */\nexport class IntegerMask extends BaseMask {\n constructor(maxLength = 15) {\n super(1, maxLength)\n }\n\n format(value: string): string {\n const digits = onlyDigits(value)\n return limitLength(digits, this.maxLength)\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { applyPattern, limitLength, onlyDigits } from '../../../base/maskUtils'\n\nexport const ZIP_CODE_PATTERN = 'XXXXX-XXX'\n\nexport class ZipCodeMask extends BaseMask {\n constructor() {\n const length = ZIP_CODE_PATTERN.length\n super(length, length)\n }\n\n format(value: string): string {\n const digits = onlyDigits(value)\n const formatted = applyPattern(digits, ZIP_CODE_PATTERN)\n\n return limitLength(formatted, this.maxLength)\n }\n}\n","/**\n * Represents a generic mask.\n *\n * A mask is responsible for formatting and unformatting (removing formatting) from a value.\n */\nexport interface Mask {\n /**\n * Optional minimum length of the masked string.\n */\n minLength?: number\n\n /**\n * Optional maximum length of the masked string.\n */\n maxLength?: number\n\n /**\n * Formats a plain string into a masked format.\n * @param value - Raw string (e.g., \"12345678901\").\n * @returns Masked string (e.g., \"123.456.789-01\").\n */\n format(value: string): string\n\n /**\n * Removes all mask characters from a formatted string.\n * @param value - Masked string (e.g., \"123.456.789-01\").\n * @returns Unmasked string (e.g., \"12345678901\").\n */\n unmask(value: string): string\n}\n\n/**\n * Represents a validator for a masked value.\n *\n * A validator checks whether a masked value is valid based on rules.\n */\nexport interface Validator {\n /**\n * Validates whether the input value is valid.\n * @param value - Masked string.\n * @returns `true` if valid, `false` otherwise.\n */\n validate(value: string): boolean\n}\n\n/**\n * Mode of document mask and validator.\n *\n * - AUTO: Automatically detect based on length.\n * - CPF: Force CPF.\n * - CNPJ: Force CNPJ.\n */\nexport enum DocumentMode {\n CPF = 'cpf',\n CNPJ = 'cnpj',\n AUTO = 'auto'\n}\n","import { CpfMask } from './CpfMask'\nimport { CnpjMask } from './CnpjMask'\nimport { BaseMask } from '../../../base/BaseMask'\nimport { onlyDigits } from '../../../base/maskUtils'\nimport { DocumentMode } from '../../../types'\n\nexport class DocumentMask extends BaseMask {\n private cpfMask = new CpfMask()\n private cnpjMask = new CnpjMask()\n private mode: DocumentMode\n\n constructor(mode: DocumentMode = DocumentMode.AUTO) {\n super()\n this.mode = mode\n }\n\n format(value: string): string {\n const digits = onlyDigits(value)\n const mode = this.resolveMode(digits)\n\n if (mode === DocumentMode.CPF) {\n return this.cpfMask.format(digits)\n }\n\n if (mode === DocumentMode.CNPJ) {\n return this.cnpjMask.format(digits)\n }\n\n return digits\n }\n\n private resolveMode(digits: string): DocumentMode.CPF | DocumentMode.CNPJ {\n if (this.mode === DocumentMode.CPF) return DocumentMode.CPF\n if (this.mode === DocumentMode.CNPJ) return DocumentMode.CNPJ\n\n return digits.length <= 11 ? DocumentMode.CPF : DocumentMode.CNPJ\n }\n}\n","import { BaseMask } from '../../../base/BaseMask'\nimport { limitLength } from '../../../base/maskUtils'\n\nexport class NumericSymbolMask extends BaseMask {\n constructor(maxLength = 25) {\n super(1, maxLength)\n }\n\n format(value: string): string {\n if (value == null) return ''\n\n const result = value.replace(/[^\\d.,/-]/g, '')\n return limitLength(result, this.maxLength)\n }\n}\n","import type { Validator } from '../types'\n\n/**\n * Abstract class providing common validation utilities.\n * - Supports regex validation.\n * - Supports min and max length validation.\n */\nexport abstract class BaseValidator implements Validator {\n protected pattern?: RegExp\n protected minLength?: number\n protected maxLength?: number\n\n constructor(options?: {\n pattern?: RegExp\n minLength?: number\n maxLength?: number\n }) {\n this.pattern = options?.pattern\n this.minLength = options?.minLength\n this.maxLength = options?.maxLength\n }\n\n /**\n * Validates the input value based on:\n * - Pattern matching (if defined)\n * - Min length (if defined)\n * - Max length (if defined)\n *\n * Override this method if you need custom validation logic.\n *\n * @param value - Value to validate (usually masked string)\n * @returns true if valid, false otherwise\n */\n validate(value: string): boolean {\n if (value == null) return false\n\n const length = value.length\n\n if (this.minLength !== undefined && length < this.minLength) {\n return false\n }\n\n if (this.maxLength !== undefined && length > this.maxLength) {\n return false\n }\n\n if (this.pattern && !this.pattern.test(value)) return false\n\n return true\n }\n}\n","import { CPF_PATTERN } from '../masks/CpfMask'\nimport { BaseValidator } from '../../../base/BaseValidator'\n\nexport class CpfValidator extends BaseValidator {\n constructor() {\n const length = CPF_PATTERN.length\n super({ minLength: length, maxLength: length })\n }\n\n validate(value: string): boolean {\n if (value == null) return false\n\n return isCpfValid(value)\n }\n}\n\n/**\n * Validates if a CPF (Brazilian tax ID) is valid.\n *\n * This function:\n * - Removes any non-digit characters (dots, dashes, spaces).\n * - Checks if CPF has 11 digits.\n * - Rejects CPFs where all digits are the same (e.g., '11111111111').\n * - Performs CPF check digit validation (standard algorithm).\n *\n * @param inputCPF - CPF as a string, can be formatted (e.g., \"123.456.789-09\").\n * @returns true if CPF is valid, false otherwise.\n */\nfunction isCpfValid(inputCPF: string): boolean {\n // Remove dots, dashes, and spaces\n const cpfOnlyNumbers = inputCPF.replace(/[\\s.-]/g, '')\n\n // CPF must be exactly 11 digits\n if (cpfOnlyNumbers.length !== 11) return false\n\n // Check if all digits are the same (invalid CPF)\n if (/^(\\d)\\1{10}$/.test(cpfOnlyNumbers)) return false\n\n // Validate first check digit\n let sum = 0\n for (let i = 0; i < 9; i++) {\n sum += parseInt(cpfOnlyNumbers.charAt(i)) * (10 - i)\n }\n\n let firstCheckDigit = (sum * 10) % 11\n if (firstCheckDigit === 10 || firstCheckDigit === 11) firstCheckDigit = 0\n if (firstCheckDigit !== parseInt(cpfOnlyNumbers.charAt(9))) return false\n\n // Validate second check digit\n sum = 0\n for (let i = 0; i < 10; i++) {\n sum += parseInt(cpfOnlyNumbers.charAt(i)) * (11 - i)\n }\n\n let secondCheckDigit = (sum * 10) % 11\n if (secondCheckDigit === 10 || secondCheckDigit === 11) secondCheckDigit = 0\n if (secondCheckDigit !== parseInt(cpfOnlyNumbers.charAt(10))) return false\n\n return true\n}\n","import { CNPJ_PATTERN } from '../masks/CnpjMask'\nimport { BaseValidator } from '../../../base/BaseValidator'\n\nexport class CnpjValidator extends BaseValidator {\n constructor() {\n const length = CNPJ_PATTERN.length\n super({ minLength: length, maxLength: length })\n }\n\n validate(value: string): boolean {\n if (value == null) return false\n\n return isCnpjValid(value)\n }\n}\n\n/**\n * Validates whether a given CNPJ number is valid.\n * @param cnpj The CNPJ number as a string.\n * @returns True if valid, false otherwise.\n */\nfunction isCnpjValid(cnpj: string): boolean {\n if (!cnpj) return false\n\n // Remove any non-digit characters\n const cleanedCnpj = cnpj.replace(/[^\\d]+/g, '')\n\n // CNPJ must be exactly 14 digits\n if (cleanedCnpj.length !== 14) return false\n\n // Reject CNPJs with all identical digits (e.g., 00000000000000)\n if (/^(\\d)\\1{13}$/.test(cleanedCnpj)) return false\n\n // Extract the base CNPJ and the two check digits\n const baseCnpj = cleanedCnpj.slice(0, 12)\n const checkDigits = cleanedCnpj.slice(12)\n\n // Calculate first check digit\n const firstSum = calculateCnpjWeightedSum(baseCnpj, 12, 5)\n const firstCheckDigit = calculateCnpjCheckDigit(firstSum)\n\n if (firstCheckDigit !== Number(checkDigits.charAt(0))) {\n return false\n }\n\n // Calculate second check digit (base + first check digit)\n const secondSum = calculateCnpjWeightedSum(baseCnpj + firstCheckDigit, 13, 6)\n const secondCheckDigit = calculateCnpjCheckDigit(secondSum)\n\n if (secondCheckDigit !== Number(checkDigits.charAt(1))) {\n return false\n }\n\n return true\n}\n\n/**\n * Calculates the weighted sum for CNPJ verification digits.\n * @param numbers The numeric string of the CNPJ.\n * @param size The number of digits to consider for the calculation.\n * @param position The starting multiplier position (5 or 6).\n * @returns The weighted sum.\n */\nfunction calculateCnpjWeightedSum(\n numbers: string,\n size: number,\n position: number\n): number {\n let sum = 0\n\n for (let i = 0; i < size; i++) {\n sum += Number(numbers.charAt(i)) * position\n position--\n\n if (position < 2) {\n position = 9\n }\n }\n\n return sum\n}\n\n/**\n * Calculates the verification digit based on the weighted sum.\n * @param sum The weighted sum.\n * @returns The verification digit (0-9).\n */\nfunction calculateCnpjCheckDigit(sum: number): number {\n const remainder = sum % 11\n return remainder < 2 ? 0 : 11 - remainder\n}\n","import { BaseValidator } from '../../../base/BaseValidator'\n\n/**\n * Validator for dates in the format dd/mm/yyyy.\n *\n * Ensures the format is correct and the date is valid in the calendar (e.g. 30/02 is invalid).\n */\nexport class DateValidator extends BaseValidator {\n constructor() {\n super({\n minLength: 10,\n maxLength: 10,\n pattern: /^\\d{2}\\/\\d{2}\\/\\d{4}$/ // Strictly requires dd/mm/yyyy format\n })\n }\n\n override validate(value: string): boolean {\n if (!super.validate(value)) return false\n\n const [dayStr, monthStr, yearStr] = value.split('/')\n const day = parseInt(dayStr, 10)\n const month = parseInt(monthStr, 10)\n const year = parseInt(yearStr, 10)\n\n const date = new Date(year, month - 1, day)\n\n return (\n date.getFullYear() === year &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n )\n }\n}\n","import { BaseValidator } from '../../../base/BaseValidator'\n\n/**\n * Validates a Brazilian phone number with optional mobile or landline support.\n */\nexport class PhoneValidator extends BaseValidator {\n private allowedDDDs: string[]\n\n constructor({\n allowMobile = true,\n allowLandline = true,\n allowedDDDs = Array.from({ length: 89 }, (_, i) => `${i + 11}`), // 11–99\n minLength,\n maxLength\n }: {\n allowMobile?: boolean\n allowLandline?: boolean\n allowedDDDs?: string[]\n minLength?: number\n maxLength?: number\n } = {}) {\n const mobileRegex = /^\\(?(\\d{2})\\)?\\s?\\d{5}-?\\d{4}$/ // (11) 98765-4321\n const landlineRegex = /^\\(?(\\d{2})\\)?\\s?\\d{4}-?\\d{4}$/ // (11) 3456-7890\n\n const pattern =\n allowMobile && allowLandline\n ? /^\\(?\\d{2}\\)?\\s?(\\d{4,5})-?\\d{4}$/\n : allowMobile\n ? mobileRegex\n : landlineRegex\n\n super({ pattern, minLength, maxLength })\n\n this.allowedDDDs = allowedDDDs\n }\n\n validate(value: string): boolean {\n if (!super.validate(value)) return false\n\n const digits = value.replace(/\\D/g, '')\n if (digits.length !== 10 && digits.length !== 11) return false\n\n const ddd = digits.slice(0, 2)\n return this.allowedDDDs.includes(ddd)\n }\n}\n","import { BaseValidator } from '../../../base/BaseValidator'\n\nexport class FloatValidator extends BaseValidator {\n constructor(maxDecimalPlaces = 3, minLength = 1, maxLength = 20) {\n const decimalRegex = new RegExp(`^\\\\d+(,\\\\d{1,${maxDecimalPlaces}})?$`)\n\n super({\n pattern: decimalRegex,\n minLength,\n maxLength\n })\n }\n}\n","import { BaseValidator } from '../../../base/BaseValidator'\n\n/**\n * Validates formatted currency strings.\n *\n * Supports optional prefix, negative values, and comma decimal separator.\n */\nexport class MoneyValidator extends BaseValidator {\n constructor({\n prefix = 'R$',\n maxDecimalPlaces = 2,\n allowNegative = true,\n minLength,\n maxLength\n }: {\n prefix?: string\n maxDecimalPlaces?: number\n allowNegative?: boolean\n minLength?: number\n maxLength?: number\n } = {}) {\n // Escape prefix for regex (if it has symbols)\n const escapedPrefix = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n // Matches: R$ -1.234,56\n const pattern = new RegExp(\n `^${escapedPrefix}\\\\s?${allowNegative ? '-?' : ''}\\\\d{1,3}(\\\\.\\\\d{3})*(,\\\\d{1,${maxDecimalPlaces}})?$`\n )\n\n super({\n pattern,\n minLength,\n maxLength\n })\n }\n}\n","import { BaseValidator } from '../../../base/BaseValidator'\n\nexport class IntegerValidator extends BaseValidator {\n constructor(minLength = 1, maxLength = 15) {\n super({\n pattern: /^\\d+$/,\n minLength,\n maxLength\n })\n }\n}\n","import { ZIP_CODE_PATTERN } from '../masks/ZipCodeMask'\nimport { BaseValidator } from '../../../base/BaseValidator'\n\nexport class ZipCodeValidator extends BaseValidator {\n constructor() {\n const length = ZIP_CODE_PATTERN.length\n super({ minLength: length, maxLength: length })\n }\n\n validate(value: string): boolean {\n if (value == null) return false\n\n if (this.minLength !== undefined && value.length < this.minLength)\n return false\n\n if (this.maxLength !== undefined && value.length > this.maxLength)\n return false\n\n return true\n }\n}\n","import { CpfValidator } from './CpfValidator'\nimport { CnpjValidator } from './CnpjValidator'\nimport { BaseValidator } from '../../../base/BaseValidator'\nimport { onlyDigits } from '../../../base/maskUtils'\nimport { DocumentMode } from '../../../types'\n\nexport class DocumentValidator extends BaseValidator {\n private cpfValidator = new CpfValidator()\n private cnpjValidator = new CnpjValidator()\n private mode: DocumentMode\n\n constructor(mode: DocumentMode = DocumentMode.AUTO) {\n super()\n this.mode = mode\n }\n\n validate(value: string): boolean {\n const digits = onlyDigits(value)\n const type = this.resolveType(digits)\n\n if (type === DocumentMode.CPF) {\n return this.cpfValidator.validate(value)\n }\n\n if (type === DocumentMode.CNPJ) {\n return this.cnpjValidator.validate(value)\n }\n\n return false\n }\n\n private resolveType(digits: string): DocumentMode.CPF | DocumentMode.CNPJ {\n if (this.mode === DocumentMode.CPF) return DocumentMode.CPF\n if (this.mode === DocumentMode.CNPJ) return DocumentMode.CNPJ\n\n return digits.length <= 11 ? DocumentMode.CPF : DocumentMode.CNPJ\n }\n}\n","import { BaseValidator } from '../../../base/BaseValidator'\n\nexport class NumericSymbolValidator extends BaseValidator {\n constructor(minLength = 1, maxLength = 25) {\n super({\n pattern: /^[\\d.,/-]+$/,\n minLength,\n maxLength\n })\n }\n}\n","import { MaskModule } from '../../MaskModule'\nimport { MaskType, Locale } from '../../enums'\n\nimport { CpfMask } from './masks/CpfMask'\nimport { CnpjMask } from './masks/CnpjMask'\nimport { DateMask } from './masks/DateMask'\nimport { PhoneMask } from './masks/PhoneMask'\nimport { FloatMask } from './masks/FloatMask'\nimport { MoneyMask } from './masks/MoneyMask'\nimport { IntegerMask } from './masks/IntegerMask'\nimport { ZipCodeMask } from './masks/ZipCodeMask'\nimport { DocumentMask } from './masks/DocumentMask'\nimport { NumericSymbolMask } from './masks/NumericSymbolMask'\n\nimport { CpfValidator } from './validators/CpfValidator'\nimport { CnpjValidator } from './validators/CnpjValidator'\nimport { DateValidator } from './validators/DateValidator'\nimport { PhoneValidator } from './validators/PhoneValidator'\nimport { FloatValidator } from './validators/FloatValidator'\nimport { MoneyValidator } from './validators/MoneyValidator'\nimport { IntegerValidator } from './validators/IntegerValidator'\nimport { ZipCodeValidator } from './validators/ZipCodeValidator'\nimport { DocumentValidator } from './validators/DocumentValidator'\nimport { NumericSymbolValidator } from './validators/NumericSymbolValidator'\n\nexport function registerBrMasks() {\n MaskModule.registerMask(Locale.BR, MaskType.CPF, new CpfMask())\n MaskModule.registerValidator(Locale.BR, MaskType.CPF, new CpfValidator())\n\n MaskModule.registerMask(Locale.BR, MaskType.CNPJ, new CnpjMask())\n MaskModule.registerValidator(Locale.BR, MaskType.CNPJ, new CnpjValidator())\n\n MaskModule.registerMask(Locale.BR, MaskType.DOCUMENT, new DocumentMask())\n MaskModule.registerValidator(\n Locale.BR,\n MaskType.DOCUMENT,\n new DocumentValidator()\n )\n\n MaskModule.registerMask(Locale.BR, MaskType.PHONE, new PhoneMask())\n MaskModule.registerValidator(Locale.BR, MaskType.PHONE, new PhoneValidator())\n\n MaskModule.registerMask(Locale.BR, MaskType.DATE, new DateMask())\n MaskModule.registerValidator(Locale.BR, MaskType.DATE, new DateValidator())\n\n MaskModule.registerMask(Locale.BR, MaskType.FLOAT, new FloatMask())\n MaskModule.registerValidator(Locale.BR, MaskType.FLOAT, new FloatValidator())\n\n MaskModule.registerMask(Locale.BR, MaskType.INTEGER, new IntegerMask())\n MaskModule.registerValidator(\n Locale.BR,\n MaskType.INTEGER,\n new IntegerValidator()\n )\n\n MaskModule.registerMask(Locale.BR, MaskType.MONEY, new MoneyMask())\n MaskModule.registerValidator(Locale.BR, MaskType.MONEY, new MoneyValidator())\n\n MaskModule.registerMask(\n Locale.BR,\n MaskType.NUMERIC_SYMBOL,\n new NumericSymbolMask()\n )\n MaskModule.registerValidator(\n Locale.BR,\n MaskType.NUMERIC_SYMBOL,\n new NumericSymbolValidator()\n )\n\n MaskModule.registerMask(Locale.BR, MaskType.ZIP_CODE, new ZipCodeMask())\n MaskModule.registerValidator(\n Locale.BR,\n MaskType.ZIP_CODE,\n new ZipCodeValidator()\n )\n}\n","import { registerBrMasks } from './locales/br/registerMasks'\n\nexport * from './enums'\nexport * from './MaskModule'\n\n// Register default locales\nregisterBrMasks()\n"],"mappings":"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"}