@aspprev/versi-ds 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/charts.js +1 -2
- package/dist/{chunk-ATWH3MA6.js → chunk-2XXVEFFY.js} +18 -35
- package/dist/{chunk-ATWH3MA6.js.map → chunk-2XXVEFFY.js.map} +1 -1
- package/dist/{chunk-V66QL3TD.js → chunk-5MRS4PDD.js} +200 -211
- package/dist/{chunk-V66QL3TD.js.map → chunk-5MRS4PDD.js.map} +1 -1
- package/dist/{chunk-LPLXAKPJ.js → chunk-6NVJWI5B.js} +551 -603
- package/dist/chunk-6NVJWI5B.js.map +1 -0
- package/dist/chunk-7IY43S3Y.js +2833 -0
- package/dist/chunk-7IY43S3Y.js.map +1 -0
- package/dist/{chunk-LTW323JQ.js → chunk-JGCZAVYV.js} +420 -594
- package/dist/{chunk-LTW323JQ.js.map → chunk-JGCZAVYV.js.map} +1 -1
- package/dist/{chunk-FTRF27XF.js → chunk-MMTKCHRP.js} +7 -17
- package/dist/{chunk-FTRF27XF.js.map → chunk-MMTKCHRP.js.map} +1 -1
- package/dist/{chunk-7JI5637G.js → chunk-YIUITJ4V.js} +45 -77
- package/dist/{chunk-7JI5637G.js.map → chunk-YIUITJ4V.js.map} +1 -1
- package/dist/{chunk-WOD44OEH.js → chunk-ZPY72ILO.js} +41 -58
- package/dist/{chunk-WOD44OEH.js.map → chunk-ZPY72ILO.js.map} +1 -1
- package/dist/core.js +3 -4
- package/dist/countries-browser.d.ts +11 -0
- package/dist/countries-browser.js +44 -0
- package/dist/countries-browser.js.map +1 -0
- package/dist/countries.d.ts +6 -46
- package/dist/countries.js +280 -7
- package/dist/countries.js.map +1 -1
- package/dist/country-metadata-DOgzawAc.d.ts +27 -0
- package/dist/documents.js +2 -3
- package/dist/flags-00-MPU4ISEM.js +85 -0
- package/dist/flags-00-MPU4ISEM.js.map +1 -0
- package/dist/flags-01-PWC64NSQ.js +13 -0
- package/dist/flags-01-PWC64NSQ.js.map +1 -0
- package/dist/flags-02-GNF7X6MP.js +10 -0
- package/dist/flags-02-GNF7X6MP.js.map +1 -0
- package/dist/flags-03-STVDA6UG.js +82 -0
- package/dist/flags-03-STVDA6UG.js.map +1 -0
- package/dist/flags-04-Z6AHZIWG.js +31 -0
- package/dist/flags-04-Z6AHZIWG.js.map +1 -0
- package/dist/flags-05-QBADBC6C.js +13 -0
- package/dist/flags-05-QBADBC6C.js.map +1 -0
- package/dist/flags-06-O55E67OI.js +28 -0
- package/dist/flags-06-O55E67OI.js.map +1 -0
- package/dist/flags-07-RSWJQIRW.js +64 -0
- package/dist/flags-07-RSWJQIRW.js.map +1 -0
- package/dist/flags-08-HHXIPTKX.js +31 -0
- package/dist/flags-08-HHXIPTKX.js.map +1 -0
- package/dist/flags-09-OEZBQ62G.js +64 -0
- package/dist/flags-09-OEZBQ62G.js.map +1 -0
- package/dist/flags-10-XJY5UMQR.js +73 -0
- package/dist/flags-10-XJY5UMQR.js.map +1 -0
- package/dist/flags-11-7M75OPUJ.js +34 -0
- package/dist/flags-11-7M75OPUJ.js.map +1 -0
- package/dist/flags-12-JY22PFQH.js +31 -0
- package/dist/flags-12-JY22PFQH.js.map +1 -0
- package/dist/flags-13-BERDGZCT.js +52 -0
- package/dist/flags-13-BERDGZCT.js.map +1 -0
- package/dist/flags-14-XVPM2GQ2.js +31 -0
- package/dist/flags-14-XVPM2GQ2.js.map +1 -0
- package/dist/flags-15-WESIXIDR.js +64 -0
- package/dist/flags-15-WESIXIDR.js.map +1 -0
- package/dist/flags-16-PTNHBPYG.js +40 -0
- package/dist/flags-16-PTNHBPYG.js.map +1 -0
- package/dist/flags-17-UYXBV5BH.js +10 -0
- package/dist/flags-17-UYXBV5BH.js.map +1 -0
- package/dist/flags-18-VMKDO7W4.js +91 -0
- package/dist/flags-18-VMKDO7W4.js.map +1 -0
- package/dist/flags-19-635PQOEQ.js +43 -0
- package/dist/flags-19-635PQOEQ.js.map +1 -0
- package/dist/forms.d.ts +2 -2
- package/dist/forms.js +3 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -9
- package/dist/manifest.json +32 -10
- package/dist/overlays.js +1 -2
- package/package.json +4 -2
- package/dist/chunk-2NMEKWO5.js +0 -38
- package/dist/chunk-2NMEKWO5.js.map +0 -1
- package/dist/chunk-LPLXAKPJ.js.map +0 -1
- package/dist/chunk-YCW3REQK.js +0 -3102
- package/dist/chunk-YCW3REQK.js.map +0 -1
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__spreadProps,
|
|
3
|
-
__spreadValues
|
|
4
|
-
} from "./chunk-2NMEKWO5.js";
|
|
5
|
-
|
|
6
1
|
// src/hooks/useBreakpoint.tsx
|
|
7
2
|
import { useSyncExternalStore } from "react";
|
|
8
3
|
var breakpoints = {
|
|
@@ -106,7 +101,7 @@ function calculateTooltipPosition({
|
|
|
106
101
|
viewportHeight,
|
|
107
102
|
margin
|
|
108
103
|
)) {
|
|
109
|
-
return
|
|
104
|
+
return { ...coordinates, position };
|
|
110
105
|
}
|
|
111
106
|
}
|
|
112
107
|
const fallback = coordinatesFor(target, tooltip, preferred, gap);
|
|
@@ -122,23 +117,19 @@ import { useEffect } from "react";
|
|
|
122
117
|
|
|
123
118
|
// src/utils/accessibility.ts
|
|
124
119
|
function mergeAriaDescribedBy(...values) {
|
|
125
|
-
const identifiers = values.flatMap((value) =>
|
|
126
|
-
var _a;
|
|
127
|
-
return (_a = value == null ? void 0 : value.trim().split(/\s+/)) != null ? _a : [];
|
|
128
|
-
}).filter(Boolean);
|
|
120
|
+
const identifiers = values.flatMap((value) => value?.trim().split(/\s+/) ?? []).filter(Boolean);
|
|
129
121
|
return identifiers.length > 0 ? Array.from(new Set(identifiers)).join(" ") : void 0;
|
|
130
122
|
}
|
|
131
123
|
|
|
132
124
|
// src/components/tooltip/use-tooltip-relationship.ts
|
|
133
125
|
function useTooltipRelationship(targetRef, tooltipId, visible) {
|
|
134
126
|
useEffect(() => {
|
|
135
|
-
|
|
136
|
-
const target = targetRef == null ? void 0 : targetRef.current;
|
|
127
|
+
const target = targetRef?.current;
|
|
137
128
|
if (!target || !visible) return;
|
|
138
129
|
const previousDescription = target.getAttribute("aria-describedby");
|
|
139
130
|
target.setAttribute(
|
|
140
131
|
"aria-describedby",
|
|
141
|
-
|
|
132
|
+
mergeAriaDescribedBy(previousDescription, tooltipId) ?? tooltipId
|
|
142
133
|
);
|
|
143
134
|
return () => {
|
|
144
135
|
if (previousDescription) {
|
|
@@ -152,7 +143,7 @@ function useTooltipRelationship(targetRef, tooltipId, visible) {
|
|
|
152
143
|
|
|
153
144
|
// src/utils/floating-layer.ts
|
|
154
145
|
function getFloatingLayerClass(trigger, layer) {
|
|
155
|
-
if (trigger
|
|
146
|
+
if (trigger?.closest('[role="dialog"][aria-modal="true"]')) {
|
|
156
147
|
return "z-modal-overlay";
|
|
157
148
|
}
|
|
158
149
|
return layer === "popover" ? "z-popover" : "z-tooltip";
|
|
@@ -244,9 +235,8 @@ var Tooltip = ({
|
|
|
244
235
|
arrow.style.top = `${verticalCenter}px`;
|
|
245
236
|
}, [coords, finalPosition, isMobile, targetRef, visible]);
|
|
246
237
|
useEffect2(() => {
|
|
247
|
-
var _a;
|
|
248
238
|
if (!visible) return;
|
|
249
|
-
|
|
239
|
+
tooltipRef.current?.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
250
240
|
duration: 150,
|
|
251
241
|
easing: "ease-out"
|
|
252
242
|
});
|
|
@@ -309,4 +299,4 @@ export {
|
|
|
309
299
|
getFloatingLayerClass,
|
|
310
300
|
Tooltip_default
|
|
311
301
|
};
|
|
312
|
-
//# sourceMappingURL=chunk-
|
|
302
|
+
//# sourceMappingURL=chunk-MMTKCHRP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useBreakpoint.tsx","../src/components/tooltip/Tooltip.tsx","../src/components/tooltip/calculate-tooltip-position.ts","../src/components/tooltip/use-tooltip-relationship.ts","../src/utils/accessibility.ts","../src/utils/floating-layer.ts"],"sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nexport const breakpoints = {\n mobile: 640,\n tablet: 1024,\n desktop: 1440,\n tv: 1920,\n};\n\nexport type Breakpoint = keyof typeof breakpoints;\n\nexport function getBreakpoint(width: number): Breakpoint {\n const entries = Object.entries(breakpoints) as [Breakpoint, number][];\n return entries.reduce<Breakpoint>(\n (previous, [name, minimumWidth]) =>\n width >= minimumWidth ? name : previous,\n \"mobile\",\n );\n}\n\nfunction subscribe(onStoreChange: () => void) {\n window.addEventListener(\"resize\", onStoreChange);\n return () => window.removeEventListener(\"resize\", onStoreChange);\n}\n\nfunction getSnapshot() {\n return getBreakpoint(window.innerWidth);\n}\n\nfunction getServerSnapshot(): Breakpoint {\n return \"mobile\";\n}\n\nexport const useBreakpoint = (): Breakpoint =>\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n","\"use client\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport {\n calculateTooltipPosition,\n type TooltipPosition,\n} from \"./calculate-tooltip-position\";\nimport { useTooltipRelationship } from \"./use-tooltip-relationship\";\nimport { getFloatingLayerClass } from \"../../utils/floating-layer\";\n\nexport type TooltipProps = {\n targetRef: React.RefObject<HTMLElement | null>;\n content: React.ReactNode;\n visible: boolean;\n preferredPosition?: \"top\" | \"bottom\" | \"left\" | \"right\";\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n targetRef,\n content,\n visible,\n preferredPosition = \"bottom\",\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const arrowRef = useRef<HTMLDivElement>(null);\n const tooltipId = useId();\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const [finalPosition, setFinalPosition] =\n useState<TooltipPosition>(preferredPosition);\n const breakpoint = useBreakpoint();\n const isMobile = breakpoint === \"mobile\";\n\n useTooltipRelationship(targetRef, tooltipId, visible);\n\n const updatePosition = useCallback(() => {\n if (!targetRef.current || !tooltipRef.current) return;\n\n const target = targetRef.current.getBoundingClientRect();\n const tooltip = tooltipRef.current.getBoundingClientRect();\n\n if (isMobile) {\n setCoords({\n top: Math.max(8, (window.innerHeight - tooltip.height) / 2),\n left: Math.max(8, (window.innerWidth - tooltip.width) / 2),\n });\n setFinalPosition(\"bottom\");\n return;\n }\n\n const nextPosition = calculateTooltipPosition({\n target,\n tooltip,\n preferred: preferredPosition,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n setCoords({ top: nextPosition.top, left: nextPosition.left });\n setFinalPosition(nextPosition.position);\n }, [isMobile, preferredPosition, targetRef]);\n\n useLayoutEffect(() => {\n if (!visible) return;\n updatePosition();\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [content, updatePosition, visible]);\n\n useLayoutEffect(() => {\n if (\n !arrowRef.current ||\n isMobile ||\n !targetRef.current ||\n !tooltipRef.current\n ) {\n return;\n }\n\n const arrow = arrowRef.current;\n const tooltip = tooltipRef.current;\n const rect = targetRef.current.getBoundingClientRect();\n const horizontalCenter = Math.min(\n Math.max(rect.left + rect.width / 2 - coords.left - 6, 8),\n Math.max(8, tooltip.offsetWidth - 20),\n );\n const verticalCenter = Math.min(\n Math.max(rect.top + rect.height / 2 - coords.top - 6, 8),\n Math.max(8, tooltip.offsetHeight - 20),\n );\n\n arrow.style.top = \"\";\n arrow.style.bottom = \"\";\n arrow.style.left = \"\";\n arrow.style.right = \"\";\n\n if (finalPosition === \"bottom\") {\n arrow.style.top = \"-6px\";\n arrow.style.left = `${horizontalCenter}px`;\n return;\n }\n\n if (finalPosition === \"top\") {\n arrow.style.bottom = \"-6px\";\n arrow.style.left = `${horizontalCenter}px`;\n return;\n }\n\n if (finalPosition === \"right\") {\n arrow.style.left = \"-6px\";\n arrow.style.top = `${verticalCenter}px`;\n return;\n }\n\n arrow.style.right = \"-6px\";\n arrow.style.top = `${verticalCenter}px`;\n }, [coords, finalPosition, isMobile, targetRef, visible]);\n\n useEffect(() => {\n if (!visible) return;\n\n tooltipRef.current?.animate([{ opacity: 0 }, { opacity: 1 }], {\n duration: 150,\n easing: \"ease-out\",\n });\n }, [visible]);\n\n if (typeof window === \"undefined\") return null;\n\n return ReactDOM.createPortal(\n visible ? (\n <div\n id={tooltipId}\n ref={tooltipRef}\n role=\"tooltip\"\n style={{ top: coords.top, left: coords.left }}\n className={`fixed ${getFloatingLayerClass(targetRef.current, \"tooltip\")} max-h-[calc(100dvh-1rem)] overflow-y-auto overscroll-contain break-words whitespace-normal rounded-sm bg-surface-tooltip px-3 py-2 text-sm text-content-inverse shadow-lg ${\n isMobile ? \"w-[90vw] max-w-[90vw]\" : \"w-max max-w-sm\"\n }`}\n >\n {content}\n\n {/* Setinha só no desktop */}\n {!isMobile && (\n <>\n {finalPosition === \"bottom\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-l-[6px] border-r-[6px] border-b-surface-tooltip border-l-transparent border-r-transparent\"\n />\n )}\n {finalPosition === \"top\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-l-[6px] border-r-[6px] border-t-[6px] border-l-transparent border-r-transparent border-t-surface-tooltip\"\n />\n )}\n {finalPosition === \"right\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-r-[6px] border-t-[6px] border-b-transparent border-r-surface-tooltip border-t-transparent\"\n />\n )}\n {finalPosition === \"left\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-l-[6px] border-t-[6px] border-b-transparent border-l-surface-tooltip border-t-transparent\"\n />\n )}\n </>\n )}\n </div>\n ) : null,\n document.body,\n );\n};\n\nexport default Tooltip;\n\n\n","export type TooltipPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\ntype Rect = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n width: number;\n height: number;\n};\n\ntype Size = {\n width: number;\n height: number;\n};\n\ntype CalculateTooltipPositionParams = {\n target: Rect;\n tooltip: Size;\n preferred: TooltipPosition;\n viewportWidth: number;\n viewportHeight: number;\n gap?: number;\n margin?: number;\n};\n\ntype TooltipCoordinates = {\n top: number;\n left: number;\n position: TooltipPosition;\n};\n\nconst OPPOSITE_POSITION: Record<TooltipPosition, TooltipPosition> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\nfunction coordinatesFor(\n target: Rect,\n tooltip: Size,\n position: TooltipPosition,\n gap: number,\n) {\n if (position === \"top\") {\n return {\n top: target.top - tooltip.height - gap,\n left: target.left + target.width / 2 - tooltip.width / 2,\n };\n }\n if (position === \"bottom\") {\n return {\n top: target.bottom + gap,\n left: target.left + target.width / 2 - tooltip.width / 2,\n };\n }\n if (position === \"left\") {\n return {\n top: target.top + target.height / 2 - tooltip.height / 2,\n left: target.left - tooltip.width - gap,\n };\n }\n return {\n top: target.top + target.height / 2 - tooltip.height / 2,\n left: target.right + gap,\n };\n}\n\nfunction fitsViewport(\n coordinates: { top: number; left: number },\n tooltip: Size,\n viewportWidth: number,\n viewportHeight: number,\n margin: number,\n) {\n return (\n coordinates.top >= margin &&\n coordinates.left >= margin &&\n coordinates.top + tooltip.height <= viewportHeight - margin &&\n coordinates.left + tooltip.width <= viewportWidth - margin\n );\n}\n\nfunction clamp(value: number, minimum: number, maximum: number) {\n return Math.min(Math.max(value, minimum), Math.max(minimum, maximum));\n}\n\nexport function calculateTooltipPosition({\n target,\n tooltip,\n preferred,\n viewportWidth,\n viewportHeight,\n gap = 8,\n margin = 8,\n}: CalculateTooltipPositionParams): TooltipCoordinates {\n const positions = [\n preferred,\n OPPOSITE_POSITION[preferred],\n \"bottom\",\n \"top\",\n \"right\",\n \"left\",\n ].filter(\n (position, index, values): position is TooltipPosition =>\n values.indexOf(position) === index,\n );\n\n for (const position of positions) {\n const coordinates = coordinatesFor(target, tooltip, position, gap);\n if (\n fitsViewport(\n coordinates,\n tooltip,\n viewportWidth,\n viewportHeight,\n margin,\n )\n ) {\n return { ...coordinates, position };\n }\n }\n\n const fallback = coordinatesFor(target, tooltip, preferred, gap);\n return {\n top: clamp(fallback.top, margin, viewportHeight - tooltip.height - margin),\n left: clamp(fallback.left, margin, viewportWidth - tooltip.width - margin),\n position: preferred,\n };\n}\n\n","\"use client\";\n\nimport { useEffect, type RefObject } from \"react\";\nimport { mergeAriaDescribedBy } from \"../../utils/accessibility\";\n\nexport function useTooltipRelationship(\n targetRef: RefObject<HTMLElement | null> | undefined,\n tooltipId: string,\n visible: boolean,\n) {\n useEffect(() => {\n const target = targetRef?.current;\n if (!target || !visible) return;\n\n const previousDescription = target.getAttribute(\"aria-describedby\");\n target.setAttribute(\n \"aria-describedby\",\n mergeAriaDescribedBy(previousDescription, tooltipId) ?? tooltipId,\n );\n\n return () => {\n if (previousDescription) {\n target.setAttribute(\"aria-describedby\", previousDescription);\n } else {\n target.removeAttribute(\"aria-describedby\");\n }\n };\n }, [targetRef, tooltipId, visible]);\n}\n\n\n","export function mergeAriaDescribedBy(\n ...values: Array<string | null | undefined>\n) {\n const identifiers = values\n .flatMap((value) => value?.trim().split(/\\s+/) ?? [])\n .filter(Boolean);\n\n return identifiers.length > 0\n ? Array.from(new Set(identifiers)).join(\" \")\n : undefined;\n}\n","export type FloatingLayer = \"popover\" | \"tooltip\";\n\nexport function getFloatingLayerClass(\n trigger: HTMLElement | null | undefined,\n layer: FloatingLayer,\n) {\n if (trigger?.closest('[role=\"dialog\"][aria-modal=\"true\"]')) {\n return \"z-modal-overlay\";\n }\n\n return layer === \"popover\" ? \"z-popover\" : \"z-tooltip\";\n}\n"],"mappings":"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","names":["useEffect","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useBreakpoint.tsx","../src/components/tooltip/Tooltip.tsx","../src/components/tooltip/calculate-tooltip-position.ts","../src/components/tooltip/use-tooltip-relationship.ts","../src/utils/accessibility.ts","../src/utils/floating-layer.ts"],"sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nexport const breakpoints = {\n mobile: 640,\n tablet: 1024,\n desktop: 1440,\n tv: 1920,\n};\n\nexport type Breakpoint = keyof typeof breakpoints;\n\nexport function getBreakpoint(width: number): Breakpoint {\n const entries = Object.entries(breakpoints) as [Breakpoint, number][];\n return entries.reduce<Breakpoint>(\n (previous, [name, minimumWidth]) =>\n width >= minimumWidth ? name : previous,\n \"mobile\",\n );\n}\n\nfunction subscribe(onStoreChange: () => void) {\n window.addEventListener(\"resize\", onStoreChange);\n return () => window.removeEventListener(\"resize\", onStoreChange);\n}\n\nfunction getSnapshot() {\n return getBreakpoint(window.innerWidth);\n}\n\nfunction getServerSnapshot(): Breakpoint {\n return \"mobile\";\n}\n\nexport const useBreakpoint = (): Breakpoint =>\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n","\"use client\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport {\n calculateTooltipPosition,\n type TooltipPosition,\n} from \"./calculate-tooltip-position\";\nimport { useTooltipRelationship } from \"./use-tooltip-relationship\";\nimport { getFloatingLayerClass } from \"../../utils/floating-layer\";\n\nexport type TooltipProps = {\n targetRef: React.RefObject<HTMLElement | null>;\n content: React.ReactNode;\n visible: boolean;\n preferredPosition?: \"top\" | \"bottom\" | \"left\" | \"right\";\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n targetRef,\n content,\n visible,\n preferredPosition = \"bottom\",\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const arrowRef = useRef<HTMLDivElement>(null);\n const tooltipId = useId();\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const [finalPosition, setFinalPosition] =\n useState<TooltipPosition>(preferredPosition);\n const breakpoint = useBreakpoint();\n const isMobile = breakpoint === \"mobile\";\n\n useTooltipRelationship(targetRef, tooltipId, visible);\n\n const updatePosition = useCallback(() => {\n if (!targetRef.current || !tooltipRef.current) return;\n\n const target = targetRef.current.getBoundingClientRect();\n const tooltip = tooltipRef.current.getBoundingClientRect();\n\n if (isMobile) {\n setCoords({\n top: Math.max(8, (window.innerHeight - tooltip.height) / 2),\n left: Math.max(8, (window.innerWidth - tooltip.width) / 2),\n });\n setFinalPosition(\"bottom\");\n return;\n }\n\n const nextPosition = calculateTooltipPosition({\n target,\n tooltip,\n preferred: preferredPosition,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n setCoords({ top: nextPosition.top, left: nextPosition.left });\n setFinalPosition(nextPosition.position);\n }, [isMobile, preferredPosition, targetRef]);\n\n useLayoutEffect(() => {\n if (!visible) return;\n updatePosition();\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [content, updatePosition, visible]);\n\n useLayoutEffect(() => {\n if (\n !arrowRef.current ||\n isMobile ||\n !targetRef.current ||\n !tooltipRef.current\n ) {\n return;\n }\n\n const arrow = arrowRef.current;\n const tooltip = tooltipRef.current;\n const rect = targetRef.current.getBoundingClientRect();\n const horizontalCenter = Math.min(\n Math.max(rect.left + rect.width / 2 - coords.left - 6, 8),\n Math.max(8, tooltip.offsetWidth - 20),\n );\n const verticalCenter = Math.min(\n Math.max(rect.top + rect.height / 2 - coords.top - 6, 8),\n Math.max(8, tooltip.offsetHeight - 20),\n );\n\n arrow.style.top = \"\";\n arrow.style.bottom = \"\";\n arrow.style.left = \"\";\n arrow.style.right = \"\";\n\n if (finalPosition === \"bottom\") {\n arrow.style.top = \"-6px\";\n arrow.style.left = `${horizontalCenter}px`;\n return;\n }\n\n if (finalPosition === \"top\") {\n arrow.style.bottom = \"-6px\";\n arrow.style.left = `${horizontalCenter}px`;\n return;\n }\n\n if (finalPosition === \"right\") {\n arrow.style.left = \"-6px\";\n arrow.style.top = `${verticalCenter}px`;\n return;\n }\n\n arrow.style.right = \"-6px\";\n arrow.style.top = `${verticalCenter}px`;\n }, [coords, finalPosition, isMobile, targetRef, visible]);\n\n useEffect(() => {\n if (!visible) return;\n\n tooltipRef.current?.animate([{ opacity: 0 }, { opacity: 1 }], {\n duration: 150,\n easing: \"ease-out\",\n });\n }, [visible]);\n\n if (typeof window === \"undefined\") return null;\n\n return ReactDOM.createPortal(\n visible ? (\n <div\n id={tooltipId}\n ref={tooltipRef}\n role=\"tooltip\"\n style={{ top: coords.top, left: coords.left }}\n className={`fixed ${getFloatingLayerClass(targetRef.current, \"tooltip\")} max-h-[calc(100dvh-1rem)] overflow-y-auto overscroll-contain break-words whitespace-normal rounded-sm bg-surface-tooltip px-3 py-2 text-sm text-content-inverse shadow-lg ${\n isMobile ? \"w-[90vw] max-w-[90vw]\" : \"w-max max-w-sm\"\n }`}\n >\n {content}\n\n {/* Setinha só no desktop */}\n {!isMobile && (\n <>\n {finalPosition === \"bottom\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-l-[6px] border-r-[6px] border-b-surface-tooltip border-l-transparent border-r-transparent\"\n />\n )}\n {finalPosition === \"top\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-l-[6px] border-r-[6px] border-t-[6px] border-l-transparent border-r-transparent border-t-surface-tooltip\"\n />\n )}\n {finalPosition === \"right\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-r-[6px] border-t-[6px] border-b-transparent border-r-surface-tooltip border-t-transparent\"\n />\n )}\n {finalPosition === \"left\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-l-[6px] border-t-[6px] border-b-transparent border-l-surface-tooltip border-t-transparent\"\n />\n )}\n </>\n )}\n </div>\n ) : null,\n document.body,\n );\n};\n\nexport default Tooltip;\n\n\n","export type TooltipPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\ntype Rect = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n width: number;\n height: number;\n};\n\ntype Size = {\n width: number;\n height: number;\n};\n\ntype CalculateTooltipPositionParams = {\n target: Rect;\n tooltip: Size;\n preferred: TooltipPosition;\n viewportWidth: number;\n viewportHeight: number;\n gap?: number;\n margin?: number;\n};\n\ntype TooltipCoordinates = {\n top: number;\n left: number;\n position: TooltipPosition;\n};\n\nconst OPPOSITE_POSITION: Record<TooltipPosition, TooltipPosition> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\nfunction coordinatesFor(\n target: Rect,\n tooltip: Size,\n position: TooltipPosition,\n gap: number,\n) {\n if (position === \"top\") {\n return {\n top: target.top - tooltip.height - gap,\n left: target.left + target.width / 2 - tooltip.width / 2,\n };\n }\n if (position === \"bottom\") {\n return {\n top: target.bottom + gap,\n left: target.left + target.width / 2 - tooltip.width / 2,\n };\n }\n if (position === \"left\") {\n return {\n top: target.top + target.height / 2 - tooltip.height / 2,\n left: target.left - tooltip.width - gap,\n };\n }\n return {\n top: target.top + target.height / 2 - tooltip.height / 2,\n left: target.right + gap,\n };\n}\n\nfunction fitsViewport(\n coordinates: { top: number; left: number },\n tooltip: Size,\n viewportWidth: number,\n viewportHeight: number,\n margin: number,\n) {\n return (\n coordinates.top >= margin &&\n coordinates.left >= margin &&\n coordinates.top + tooltip.height <= viewportHeight - margin &&\n coordinates.left + tooltip.width <= viewportWidth - margin\n );\n}\n\nfunction clamp(value: number, minimum: number, maximum: number) {\n return Math.min(Math.max(value, minimum), Math.max(minimum, maximum));\n}\n\nexport function calculateTooltipPosition({\n target,\n tooltip,\n preferred,\n viewportWidth,\n viewportHeight,\n gap = 8,\n margin = 8,\n}: CalculateTooltipPositionParams): TooltipCoordinates {\n const positions = [\n preferred,\n OPPOSITE_POSITION[preferred],\n \"bottom\",\n \"top\",\n \"right\",\n \"left\",\n ].filter(\n (position, index, values): position is TooltipPosition =>\n values.indexOf(position) === index,\n );\n\n for (const position of positions) {\n const coordinates = coordinatesFor(target, tooltip, position, gap);\n if (\n fitsViewport(\n coordinates,\n tooltip,\n viewportWidth,\n viewportHeight,\n margin,\n )\n ) {\n return { ...coordinates, position };\n }\n }\n\n const fallback = coordinatesFor(target, tooltip, preferred, gap);\n return {\n top: clamp(fallback.top, margin, viewportHeight - tooltip.height - margin),\n left: clamp(fallback.left, margin, viewportWidth - tooltip.width - margin),\n position: preferred,\n };\n}\n\n","\"use client\";\n\nimport { useEffect, type RefObject } from \"react\";\nimport { mergeAriaDescribedBy } from \"../../utils/accessibility\";\n\nexport function useTooltipRelationship(\n targetRef: RefObject<HTMLElement | null> | undefined,\n tooltipId: string,\n visible: boolean,\n) {\n useEffect(() => {\n const target = targetRef?.current;\n if (!target || !visible) return;\n\n const previousDescription = target.getAttribute(\"aria-describedby\");\n target.setAttribute(\n \"aria-describedby\",\n mergeAriaDescribedBy(previousDescription, tooltipId) ?? tooltipId,\n );\n\n return () => {\n if (previousDescription) {\n target.setAttribute(\"aria-describedby\", previousDescription);\n } else {\n target.removeAttribute(\"aria-describedby\");\n }\n };\n }, [targetRef, tooltipId, visible]);\n}\n\n\n","export function mergeAriaDescribedBy(\n ...values: Array<string | null | undefined>\n) {\n const identifiers = values\n .flatMap((value) => value?.trim().split(/\\s+/) ?? [])\n .filter(Boolean);\n\n return identifiers.length > 0\n ? Array.from(new Set(identifiers)).join(\" \")\n : undefined;\n}\n","export type FloatingLayer = \"popover\" | \"tooltip\";\n\nexport function getFloatingLayerClass(\n trigger: HTMLElement | null | undefined,\n layer: FloatingLayer,\n) {\n if (trigger?.closest('[role=\"dialog\"][aria-modal=\"true\"]')) {\n return \"z-modal-overlay\";\n }\n\n return layer === \"popover\" ? \"z-popover\" : \"z-tooltip\";\n}\n"],"mappings":"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","names":["useEffect","useEffect"]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__objRest,
|
|
3
|
-
__spreadProps,
|
|
4
|
-
__spreadValues
|
|
5
|
-
} from "./chunk-2NMEKWO5.js";
|
|
6
|
-
|
|
7
1
|
// src/components/barcode/barcode.tsx
|
|
8
2
|
import JsBarcode from "jsbarcode";
|
|
9
3
|
import { useEffect, useRef } from "react";
|
|
@@ -47,7 +41,7 @@ function BoletoBarCode({ linhaDigitavel }) {
|
|
|
47
41
|
|
|
48
42
|
// src/components/file-upload/validation.ts
|
|
49
43
|
function acceptsFile(file, accept) {
|
|
50
|
-
if (!
|
|
44
|
+
if (!accept?.trim()) return true;
|
|
51
45
|
return accept.split(",").map((item) => item.trim().toLowerCase()).some((rule) => {
|
|
52
46
|
if (rule.endsWith("/*")) return file.type.toLowerCase().startsWith(rule.slice(0, -1));
|
|
53
47
|
if (rule.startsWith(".")) return file.name.toLowerCase().endsWith(rule);
|
|
@@ -108,7 +102,7 @@ function FileDropzone({
|
|
|
108
102
|
onFilesRejected
|
|
109
103
|
}) {
|
|
110
104
|
const generatedInputId = useId();
|
|
111
|
-
const inputId = id
|
|
105
|
+
const inputId = id ?? generatedInputId;
|
|
112
106
|
const messageId = `${inputId}-message`;
|
|
113
107
|
const inputRef = useRef2(null);
|
|
114
108
|
const [isDragging, setIsDragging] = useState(false);
|
|
@@ -122,8 +116,8 @@ function FileDropzone({
|
|
|
122
116
|
multiple
|
|
123
117
|
});
|
|
124
118
|
setRejectionMessage(rejected.length ? rejected.map((item) => item.message).join(" ") : void 0);
|
|
125
|
-
if (accepted.length) onFilesAccepted
|
|
126
|
-
if (rejected.length) onFilesRejected
|
|
119
|
+
if (accepted.length) onFilesAccepted?.(accepted);
|
|
120
|
+
if (rejected.length) onFilesRejected?.(rejected);
|
|
127
121
|
};
|
|
128
122
|
const handleInputChange = (event) => {
|
|
129
123
|
if (event.target.files) processFiles(event.target.files);
|
|
@@ -232,10 +226,7 @@ var FileUploadProgress_default = FileUploadProgress;
|
|
|
232
226
|
import classNames3 from "classnames";
|
|
233
227
|
import { MdClose, MdRefresh } from "react-icons/md";
|
|
234
228
|
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
235
|
-
var fileId = (item, index) => {
|
|
236
|
-
var _a;
|
|
237
|
-
return (_a = item.id) != null ? _a : `${item.file.name}-${item.file.size}-${item.file.lastModified}-${index}`;
|
|
238
|
-
};
|
|
229
|
+
var fileId = (item, index) => item.id ?? `${item.file.name}-${item.file.size}-${item.file.lastModified}-${index}`;
|
|
239
230
|
var statusDescription = (status) => {
|
|
240
231
|
if (status === "uploading") return "Enviando";
|
|
241
232
|
if (status === "success") return "Enviado";
|
|
@@ -244,8 +235,7 @@ var statusDescription = (status) => {
|
|
|
244
235
|
};
|
|
245
236
|
function FileList({ files, accessibleName = "Arquivos selecionados", onRemove, onRetry, className }) {
|
|
246
237
|
return /* @__PURE__ */ jsx4("ul", { "aria-label": accessibleName, className: classNames3("w-full space-y-2", className), children: files.map((item, index) => {
|
|
247
|
-
|
|
248
|
-
const status = (_a = item.status) != null ? _a : "pending";
|
|
238
|
+
const status = item.status ?? "pending";
|
|
249
239
|
const progressStatus = status === "pending" ? "idle" : status;
|
|
250
240
|
return /* @__PURE__ */ jsxs4("li", { "aria-busy": status === "uploading" || void 0, className: "flex min-w-0 flex-wrap items-center gap-3 rounded-sm border border-border-default bg-surface-card p-3", children: [
|
|
251
241
|
/* @__PURE__ */ jsxs4("div", { className: "min-w-0 flex-1", children: [
|
|
@@ -275,13 +265,12 @@ import classNames4 from "classnames";
|
|
|
275
265
|
import { useEffect as useEffect2, useRef as useRef3, useState as useState2 } from "react";
|
|
276
266
|
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
277
267
|
var extensionType = (fileName) => {
|
|
278
|
-
|
|
279
|
-
const extension = (_a = fileName == null ? void 0 : fileName.split(".").pop()) == null ? void 0 : _a.toLowerCase();
|
|
268
|
+
const extension = fileName?.split(".").pop()?.toLowerCase();
|
|
280
269
|
if (extension === "pdf") return "application/pdf";
|
|
281
|
-
if (["png", "jpg", "jpeg", "gif", "webp", "svg"].includes(extension
|
|
270
|
+
if (["png", "jpg", "jpeg", "gif", "webp", "svg"].includes(extension ?? "")) {
|
|
282
271
|
return `image/${extension === "jpg" ? "jpeg" : extension}`;
|
|
283
272
|
}
|
|
284
|
-
if (["txt", "csv", "json", "xml", "md"].includes(extension
|
|
273
|
+
if (["txt", "csv", "json", "xml", "md"].includes(extension ?? "")) return "text/plain";
|
|
285
274
|
return "application/octet-stream";
|
|
286
275
|
};
|
|
287
276
|
var normalizeContentType = (contentType) => contentType.split(";", 1)[0].trim().toLowerCase();
|
|
@@ -296,7 +285,7 @@ function FileViewer({
|
|
|
296
285
|
onError,
|
|
297
286
|
onDownload,
|
|
298
287
|
fallback,
|
|
299
|
-
title = fileName
|
|
288
|
+
title = fileName ?? "Visualiza\xE7\xE3o do arquivo",
|
|
300
289
|
className
|
|
301
290
|
}) {
|
|
302
291
|
const [objectUrl, setObjectUrl] = useState2();
|
|
@@ -305,13 +294,13 @@ function FileViewer({
|
|
|
305
294
|
const onLoadRef = useRef3(onLoad);
|
|
306
295
|
const onErrorRef = useRef3(onError);
|
|
307
296
|
const resolved = typeof source === "object" && source !== null && !(source instanceof Blob) ? source : void 0;
|
|
308
|
-
const blob = source instanceof Blob ? source : resolved
|
|
309
|
-
const url = typeof source === "string" ? source : resolved
|
|
310
|
-
const resolvedName = fileName
|
|
311
|
-
const rawType =
|
|
297
|
+
const blob = source instanceof Blob ? source : resolved?.blob;
|
|
298
|
+
const url = typeof source === "string" ? source : resolved?.url;
|
|
299
|
+
const resolvedName = fileName ?? resolved?.fileName;
|
|
300
|
+
const rawType = contentType?.trim() || resolved?.contentType || blob?.type || extensionType(resolvedName);
|
|
312
301
|
const resolvedType = normalizeContentType(rawType);
|
|
313
302
|
const isText = resolvedType.startsWith("text/") || resolvedType === "application/json";
|
|
314
|
-
const displayError = error
|
|
303
|
+
const displayError = error ?? readError?.message;
|
|
315
304
|
useEffect2(() => {
|
|
316
305
|
onLoadRef.current = onLoad;
|
|
317
306
|
}, [onLoad]);
|
|
@@ -319,7 +308,6 @@ function FileViewer({
|
|
|
319
308
|
onErrorRef.current = onError;
|
|
320
309
|
}, [onError]);
|
|
321
310
|
useEffect2(() => {
|
|
322
|
-
var _a;
|
|
323
311
|
let active = true;
|
|
324
312
|
setReadError(null);
|
|
325
313
|
setTextContent(void 0);
|
|
@@ -336,23 +324,21 @@ function FileViewer({
|
|
|
336
324
|
} catch (cause) {
|
|
337
325
|
const nextError = toError(cause);
|
|
338
326
|
setReadError(nextError);
|
|
339
|
-
|
|
327
|
+
onErrorRef.current?.(nextError);
|
|
340
328
|
return () => {
|
|
341
329
|
active = false;
|
|
342
330
|
};
|
|
343
331
|
}
|
|
344
332
|
if (isText) {
|
|
345
333
|
blob.text().then((text) => {
|
|
346
|
-
var _a2;
|
|
347
334
|
if (!active) return;
|
|
348
335
|
setTextContent(text);
|
|
349
|
-
|
|
336
|
+
onLoadRef.current?.();
|
|
350
337
|
}).catch((cause) => {
|
|
351
|
-
var _a2;
|
|
352
338
|
if (!active) return;
|
|
353
339
|
const nextError = toError(cause);
|
|
354
340
|
setReadError(nextError);
|
|
355
|
-
|
|
341
|
+
onErrorRef.current?.(nextError);
|
|
356
342
|
});
|
|
357
343
|
}
|
|
358
344
|
return () => {
|
|
@@ -361,15 +347,11 @@ function FileViewer({
|
|
|
361
347
|
};
|
|
362
348
|
}, [blob, isText]);
|
|
363
349
|
const handleMediaError = () => {
|
|
364
|
-
var _a;
|
|
365
350
|
const nextError = new Error("N\xE3o foi poss\xEDvel carregar a visualiza\xE7\xE3o do arquivo.");
|
|
366
351
|
setReadError(nextError);
|
|
367
|
-
|
|
368
|
-
};
|
|
369
|
-
const handleLoad = () => {
|
|
370
|
-
var _a;
|
|
371
|
-
return (_a = onLoadRef.current) == null ? void 0 : _a.call(onLoadRef);
|
|
352
|
+
onErrorRef.current?.(nextError);
|
|
372
353
|
};
|
|
354
|
+
const handleLoad = () => onLoadRef.current?.();
|
|
373
355
|
if (loading) {
|
|
374
356
|
return /* @__PURE__ */ jsx5(
|
|
375
357
|
"div",
|
|
@@ -385,7 +367,7 @@ function FileViewer({
|
|
|
385
367
|
if (displayError) {
|
|
386
368
|
return /* @__PURE__ */ jsx5("div", { className: classNames4("rounded-sm border border-field-border-error bg-surface-card p-4 text-field-assistive-error", className), role: "alert", children: displayError });
|
|
387
369
|
}
|
|
388
|
-
const displayUrl = objectUrl
|
|
370
|
+
const displayUrl = objectUrl ?? url;
|
|
389
371
|
if (!displayUrl && !textContent) {
|
|
390
372
|
return /* @__PURE__ */ jsx5(
|
|
391
373
|
"div",
|
|
@@ -393,7 +375,7 @@ function FileViewer({
|
|
|
393
375
|
className: classNames4("rounded-sm border border-border-default bg-surface-card p-4 text-content-secondary", className),
|
|
394
376
|
role: "region",
|
|
395
377
|
"aria-label": title,
|
|
396
|
-
children: fallback
|
|
378
|
+
children: fallback ?? "Arquivo indispon\xEDvel."
|
|
397
379
|
}
|
|
398
380
|
);
|
|
399
381
|
}
|
|
@@ -408,7 +390,7 @@ function FileViewer({
|
|
|
408
390
|
resolvedType.startsWith("image/") && displayUrl && /* @__PURE__ */ jsx5("img", { src: displayUrl, alt: title, onLoad: handleLoad, onError: handleMediaError, className: "max-h-[70vh] max-w-full object-contain" }),
|
|
409
391
|
resolvedType === "application/pdf" && displayUrl && /* @__PURE__ */ jsx5("iframe", { src: displayUrl, title, onLoad: handleLoad, onError: handleMediaError, sandbox: "", className: "min-h-[32rem] w-full border-0" }),
|
|
410
392
|
isText && (textContent !== void 0 ? /* @__PURE__ */ jsx5("pre", { className: "max-h-[70vh] overflow-auto whitespace-pre-wrap break-words text-sm text-content-primary", children: textContent }) : displayUrl && /* @__PURE__ */ jsx5("iframe", { src: displayUrl, title, onLoad: handleLoad, onError: handleMediaError, sandbox: "", className: "min-h-64 w-full border-0" })),
|
|
411
|
-
!resolvedType.startsWith("image/") && resolvedType !== "application/pdf" && !isText && (fallback
|
|
393
|
+
!resolvedType.startsWith("image/") && resolvedType !== "application/pdf" && !isText && (fallback ?? /* @__PURE__ */ jsx5("p", { className: "text-content-secondary", children: "Este tipo de arquivo n\xE3o possui visualiza\xE7\xE3o dispon\xEDvel." })),
|
|
412
394
|
download && /* @__PURE__ */ jsx5("div", { className: "flex justify-end", children: download })
|
|
413
395
|
]
|
|
414
396
|
}
|
|
@@ -439,47 +421,33 @@ function resolveAccessibleColors(fgColor, bgColor) {
|
|
|
439
421
|
const contrastRatio = (lighter + 0.05) / (darker + 0.05);
|
|
440
422
|
return contrastRatio >= 3 ? { dark: fgColor, light: bgColor } : { dark: "#000000", light: "#FFFFFF" };
|
|
441
423
|
}
|
|
442
|
-
function QRCode(
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
"value",
|
|
458
|
-
"size",
|
|
459
|
-
"level",
|
|
460
|
-
"includeMargin",
|
|
461
|
-
"fgColor",
|
|
462
|
-
"bgColor",
|
|
463
|
-
"ariaLabel",
|
|
464
|
-
"description",
|
|
465
|
-
"loading",
|
|
466
|
-
"error",
|
|
467
|
-
"onError",
|
|
468
|
-
"className"
|
|
469
|
-
]);
|
|
470
|
-
var _a2;
|
|
424
|
+
function QRCode({
|
|
425
|
+
value,
|
|
426
|
+
size = 192,
|
|
427
|
+
level = "M",
|
|
428
|
+
includeMargin = true,
|
|
429
|
+
fgColor = "#000000",
|
|
430
|
+
bgColor = "#FFFFFF",
|
|
431
|
+
ariaLabel = "C\xF3digo QR",
|
|
432
|
+
description,
|
|
433
|
+
loading = false,
|
|
434
|
+
error,
|
|
435
|
+
onError,
|
|
436
|
+
className,
|
|
437
|
+
...rest
|
|
438
|
+
}) {
|
|
471
439
|
const [dataUrl, setDataUrl] = useState3(null);
|
|
472
440
|
const [generationError, setGenerationError] = useState3(null);
|
|
473
441
|
const onErrorRef = useRef4(onError);
|
|
474
442
|
const generatedId = useId2();
|
|
475
443
|
const resolvedSize = Math.max(1, Number.isFinite(size) ? Math.floor(size) : 192);
|
|
476
|
-
const descriptionId = description ? `${
|
|
444
|
+
const descriptionId = description ? `${rest.id ?? generatedId}-description` : void 0;
|
|
477
445
|
const colors = useMemo(
|
|
478
446
|
() => resolveAccessibleColors(fgColor, bgColor),
|
|
479
447
|
[bgColor, fgColor]
|
|
480
448
|
);
|
|
481
449
|
const describedBy = [rest["aria-describedby"], descriptionId].filter(Boolean).join(" ") || void 0;
|
|
482
|
-
const displayError = error
|
|
450
|
+
const displayError = error ?? generationError?.message;
|
|
483
451
|
const isLoading = loading || !dataUrl && !displayError;
|
|
484
452
|
useEffect3(() => {
|
|
485
453
|
onErrorRef.current = onError;
|
|
@@ -503,12 +471,11 @@ function QRCode(_a) {
|
|
|
503
471
|
}).then((url) => {
|
|
504
472
|
if (active) setDataUrl(url);
|
|
505
473
|
}).catch((cause) => {
|
|
506
|
-
var _a3;
|
|
507
474
|
if (!active) return;
|
|
508
475
|
const nextError = cause instanceof Error ? cause : new Error("N\xE3o foi poss\xEDvel gerar o c\xF3digo QR.");
|
|
509
476
|
setDataUrl(null);
|
|
510
477
|
setGenerationError(nextError);
|
|
511
|
-
|
|
478
|
+
onErrorRef.current?.(nextError);
|
|
512
479
|
});
|
|
513
480
|
return () => {
|
|
514
481
|
active = false;
|
|
@@ -516,7 +483,8 @@ function QRCode(_a) {
|
|
|
516
483
|
}, [colors, error, includeMargin, level, resolvedSize, value]);
|
|
517
484
|
return /* @__PURE__ */ jsxs6(
|
|
518
485
|
"div",
|
|
519
|
-
|
|
486
|
+
{
|
|
487
|
+
...rest,
|
|
520
488
|
role: "img",
|
|
521
489
|
"aria-label": ariaLabel,
|
|
522
490
|
"aria-describedby": describedBy,
|
|
@@ -534,7 +502,7 @@ function QRCode(_a) {
|
|
|
534
502
|
),
|
|
535
503
|
description && /* @__PURE__ */ jsx6("span", { id: descriptionId, className: "sr-only", children: description })
|
|
536
504
|
]
|
|
537
|
-
}
|
|
505
|
+
}
|
|
538
506
|
);
|
|
539
507
|
}
|
|
540
508
|
var QRCode_default = QRCode;
|
|
@@ -548,4 +516,4 @@ export {
|
|
|
548
516
|
FileViewer_default,
|
|
549
517
|
QRCode_default
|
|
550
518
|
};
|
|
551
|
-
//# sourceMappingURL=chunk-
|
|
519
|
+
//# sourceMappingURL=chunk-YIUITJ4V.js.map
|