@aspprev/versi-ds 0.3.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 +14 -1
- 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-OQECJKGA.js → chunk-6NVJWI5B.js} +556 -608
- 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-EPV6UNUQ.js → chunk-JGCZAVYV.js} +424 -595
- package/dist/chunk-JGCZAVYV.js.map +1 -0
- 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-DO5C67KS.js → chunk-ZPY72ILO.js} +87 -75
- package/dist/chunk-ZPY72ILO.js.map +1 -0
- 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.d.ts +1 -1
- package/dist/overlays.js +1 -2
- package/package.json +10 -2
- package/dist/chunk-2NMEKWO5.js +0 -38
- package/dist/chunk-2NMEKWO5.js.map +0 -1
- package/dist/chunk-DO5C67KS.js.map +0 -1
- package/dist/chunk-EPV6UNUQ.js.map +0 -1
- package/dist/chunk-OQECJKGA.js.map +0 -1
- package/dist/chunk-YCW3REQK.js +0 -3102
- package/dist/chunk-YCW3REQK.js.map +0 -1
|
@@ -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":";;;;;;AAEA,SAAS,4BAA4B;AAE9B,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,IAAI;AACN;AAIO,SAAS,cAAc,OAA2B;AACvD,QAAM,UAAU,OAAO,QAAQ,WAAW;AAC1C,SAAO,QAAQ;AAAA,IACb,CAAC,UAAU,CAAC,MAAM,YAAY,MAC5B,SAAS,eAAe,OAAO;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,UAAU,eAA2B;AAC5C,SAAO,iBAAiB,UAAU,aAAa;AAC/C,SAAO,MAAM,OAAO,oBAAoB,UAAU,aAAa;AACjE;AAEA,SAAS,cAAc;AACrB,SAAO,cAAc,OAAO,UAAU;AACxC;AAEA,SAAS,oBAAgC;AACvC,SAAO;AACT;AAEO,IAAM,gBAAgB,MAC3B,qBAAqB,WAAW,aAAa,iBAAiB;;;AClChE;AAAA,EACE;AAAA,EACA,aAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,cAAc;;;ACsBrB,IAAM,oBAA8D;AAAA,EAClE,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACT;AAEA,SAAS,eACP,QACA,SACA,UACA,KACA;AACA,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,MACL,KAAK,OAAO,MAAM,QAAQ,SAAS;AAAA,MACnC,MAAM,OAAO,OAAO,OAAO,QAAQ,IAAI,QAAQ,QAAQ;AAAA,IACzD;AAAA,EACF;AACA,MAAI,aAAa,UAAU;AACzB,WAAO;AAAA,MACL,KAAK,OAAO,SAAS;AAAA,MACrB,MAAM,OAAO,OAAO,OAAO,QAAQ,IAAI,QAAQ,QAAQ;AAAA,IACzD;AAAA,EACF;AACA,MAAI,aAAa,QAAQ;AACvB,WAAO;AAAA,MACL,KAAK,OAAO,MAAM,OAAO,SAAS,IAAI,QAAQ,SAAS;AAAA,MACvD,MAAM,OAAO,OAAO,QAAQ,QAAQ;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AAAA,IACL,KAAK,OAAO,MAAM,OAAO,SAAS,IAAI,QAAQ,SAAS;AAAA,IACvD,MAAM,OAAO,QAAQ;AAAA,EACvB;AACF;AAEA,SAAS,aACP,aACA,SACA,eACA,gBACA,QACA;AACA,SACE,YAAY,OAAO,UACnB,YAAY,QAAQ,UACpB,YAAY,MAAM,QAAQ,UAAU,iBAAiB,UACrD,YAAY,OAAO,QAAQ,SAAS,gBAAgB;AAExD;AAEA,SAAS,MAAM,OAAe,SAAiB,SAAiB;AAC9D,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,OAAO,GAAG,KAAK,IAAI,SAAS,OAAO,CAAC;AACtE;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,SAAS;AACX,GAAuD;AACrD,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,kBAAkB,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE;AAAA,IACA,CAAC,UAAU,OAAO,WAChB,OAAO,QAAQ,QAAQ,MAAM;AAAA,EACjC;AAEA,aAAW,YAAY,WAAW;AAChC,UAAM,cAAc,eAAe,QAAQ,SAAS,UAAU,GAAG;AACjE,QACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GACA;AACA,aAAO,iCAAK,cAAL,EAAkB,SAAS;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,WAAW,eAAe,QAAQ,SAAS,WAAW,GAAG;AAC/D,SAAO;AAAA,IACL,KAAK,MAAM,SAAS,KAAK,QAAQ,iBAAiB,QAAQ,SAAS,MAAM;AAAA,IACzE,MAAM,MAAM,SAAS,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ,MAAM;AAAA,IACzE,UAAU;AAAA,EACZ;AACF;;;AChIA,SAAS,iBAAiC;;;ACFnC,SAAS,wBACX,QACH;AACA,QAAM,cAAc,OACjB,QAAQ,CAAC,UAAO;AAJrB;AAIwB,gDAAO,OAAO,MAAM,WAApB,YAA8B,CAAC;AAAA,GAAC,EACnD,OAAO,OAAO;AAEjB,SAAO,YAAY,SAAS,IACxB,MAAM,KAAK,IAAI,IAAI,WAAW,CAAC,EAAE,KAAK,GAAG,IACzC;AACN;;;ADLO,SAAS,uBACd,WACA,WACA,SACA;AACA,YAAU,MAAM;AAVlB;AAWI,UAAM,SAAS,uCAAW;AAC1B,QAAI,CAAC,UAAU,CAAC,QAAS;AAEzB,UAAM,sBAAsB,OAAO,aAAa,kBAAkB;AAClE,WAAO;AAAA,MACL;AAAA,OACA,0BAAqB,qBAAqB,SAAS,MAAnD,YAAwD;AAAA,IAC1D;AAEA,WAAO,MAAM;AACX,UAAI,qBAAqB;AACvB,eAAO,aAAa,oBAAoB,mBAAmB;AAAA,MAC7D,OAAO;AACL,eAAO,gBAAgB,kBAAkB;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,OAAO,CAAC;AACpC;;;AE1BO,SAAS,sBACd,SACA,OACA;AACA,MAAI,mCAAS,QAAQ,uCAAuC;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,YAAY,cAAc;AAC7C;;;AJiJU,mBAEI,KAFJ;AAnIV,IAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AACtB,MAAM;AACJ,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,WAAW,OAAuB,IAAI;AAC5C,QAAM,YAAY,MAAM;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;AACxD,QAAM,CAAC,eAAe,gBAAgB,IACpC,SAA0B,iBAAiB;AAC7C,QAAM,aAAa,cAAc;AACjC,QAAM,WAAW,eAAe;AAEhC,yBAAuB,WAAW,WAAW,OAAO;AAEpD,QAAM,iBAAiB,YAAY,MAAM;AACvC,QAAI,CAAC,UAAU,WAAW,CAAC,WAAW,QAAS;AAE/C,UAAM,SAAS,UAAU,QAAQ,sBAAsB;AACvD,UAAM,UAAU,WAAW,QAAQ,sBAAsB;AAEzD,QAAI,UAAU;AACZ,gBAAU;AAAA,QACR,KAAK,KAAK,IAAI,IAAI,OAAO,cAAc,QAAQ,UAAU,CAAC;AAAA,QAC1D,MAAM,KAAK,IAAI,IAAI,OAAO,aAAa,QAAQ,SAAS,CAAC;AAAA,MAC3D,CAAC;AACD,uBAAiB,QAAQ;AACzB;AAAA,IACF;AAEA,UAAM,eAAe,yBAAyB;AAAA,MAC5C;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,eAAe,OAAO;AAAA,MACtB,gBAAgB,OAAO;AAAA,IACzB,CAAC;AACD,cAAU,EAAE,KAAK,aAAa,KAAK,MAAM,aAAa,KAAK,CAAC;AAC5D,qBAAiB,aAAa,QAAQ;AAAA,EACxC,GAAG,CAAC,UAAU,mBAAmB,SAAS,CAAC;AAE3C,kBAAgB,MAAM;AACpB,QAAI,CAAC,QAAS;AACd,mBAAe;AAEf,WAAO,iBAAiB,UAAU,cAAc;AAChD,WAAO,iBAAiB,UAAU,gBAAgB,IAAI;AAEtD,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,cAAc;AACnD,aAAO,oBAAoB,UAAU,gBAAgB,IAAI;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,SAAS,gBAAgB,OAAO,CAAC;AAErC,kBAAgB,MAAM;AACpB,QACE,CAAC,SAAS,WACV,YACA,CAAC,UAAU,WACX,CAAC,WAAW,SACZ;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS;AACvB,UAAM,UAAU,WAAW;AAC3B,UAAM,OAAO,UAAU,QAAQ,sBAAsB;AACrD,UAAM,mBAAmB,KAAK;AAAA,MAC5B,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,GAAG,CAAC;AAAA,MACxD,KAAK,IAAI,GAAG,QAAQ,cAAc,EAAE;AAAA,IACtC;AACA,UAAM,iBAAiB,KAAK;AAAA,MAC1B,KAAK,IAAI,KAAK,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,GAAG,CAAC;AAAA,MACvD,KAAK,IAAI,GAAG,QAAQ,eAAe,EAAE;AAAA,IACvC;AAEA,UAAM,MAAM,MAAM;AAClB,UAAM,MAAM,SAAS;AACrB,UAAM,MAAM,OAAO;AACnB,UAAM,MAAM,QAAQ;AAEpB,QAAI,kBAAkB,UAAU;AAC9B,YAAM,MAAM,MAAM;AAClB,YAAM,MAAM,OAAO,GAAG,gBAAgB;AACtC;AAAA,IACF;AAEA,QAAI,kBAAkB,OAAO;AAC3B,YAAM,MAAM,SAAS;AACrB,YAAM,MAAM,OAAO,GAAG,gBAAgB;AACtC;AAAA,IACF;AAEA,QAAI,kBAAkB,SAAS;AAC7B,YAAM,MAAM,OAAO;AACnB,YAAM,MAAM,MAAM,GAAG,cAAc;AACnC;AAAA,IACF;AAEA,UAAM,MAAM,QAAQ;AACpB,UAAM,MAAM,MAAM,GAAG,cAAc;AAAA,EACrC,GAAG,CAAC,QAAQ,eAAe,UAAU,WAAW,OAAO,CAAC;AAExD,EAAAC,WAAU,MAAM;AAlIlB;AAmII,QAAI,CAAC,QAAS;AAEd,qBAAW,YAAX,mBAAoB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG;AAAA,MAC5D,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,MAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,SAAO,SAAS;AAAA,IACd,UACE;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,MAAK;AAAA,QACL,OAAO,EAAE,KAAK,OAAO,KAAK,MAAM,OAAO,KAAK;AAAA,QAC5C,WAAW,SAAS,sBAAsB,UAAU,SAAS,SAAS,CAAC,8KACrE,WAAW,0BAA0B,gBACvC;AAAA,QAEC;AAAA;AAAA,UAGA,CAAC,YACA,iCACG;AAAA,8BAAkB,YACjB;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,WAAU;AAAA;AAAA,YACZ;AAAA,YAED,kBAAkB,SACjB;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,WAAU;AAAA;AAAA,YACZ;AAAA,YAED,kBAAkB,WACjB;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,WAAU;AAAA;AAAA,YACZ;AAAA,YAED,kBAAkB,UACjB;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,WAAU;AAAA;AAAA,YACZ;AAAA,aAEJ;AAAA;AAAA;AAAA,IAEJ,IACE;AAAA,IACJ,SAAS;AAAA,EACX;AACF;AAEA,IAAO,kBAAQ;","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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/barcode/barcode.tsx","../src/components/file-upload/validation.ts","../src/components/file-upload/FileDropzone.tsx","../src/components/file-upload/FileUploadProgress.tsx","../src/components/file-upload/FileList.tsx","../src/components/file-upload/FileViewer.tsx","../src/components/qr-code/QRCode.tsx"],"sourcesContent":["\"use client\";\n\nimport JsBarcode from \"jsbarcode\";\nimport { useEffect, useRef } from \"react\";\n\nconst linhaDigitavelParaCodigoBarras = (linha: string): string => {\n const d = linha.replace(/\\D/g, \"\");\n\n const banco = d.substring(0, 3);\n const moeda = d.substring(3, 4);\n const campo1 = d.substring(4, 9);\n const campo2 = d.substring(10, 20);\n const campo3 = d.substring(21, 31);\n const digitoGeral = d.substring(32, 33);\n const vencimento = d.substring(33, 37);\n const valor = d.substring(37, 47);\n\n return (\n banco + moeda + digitoGeral + vencimento + valor + campo1 + campo2 + campo3\n );\n};\n\nexport interface BoletoBarCodeProps {\n linhaDigitavel: string;\n}\n\nexport function BoletoBarCode({ linhaDigitavel }: BoletoBarCodeProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n\n useEffect(() => {\n if (!svgRef.current) return;\n\n try {\n const codigoBarras = linhaDigitavelParaCodigoBarras(linhaDigitavel);\n\n JsBarcode(svgRef.current, codigoBarras, {\n format: \"ITF\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n displayValue: false,\n width: 2,\n height: 80,\n margin: 0,\n });\n } catch (error) {\n console.error(\"Erro ao gerar código de barras:\", error);\n }\n }, [linhaDigitavel]);\n\n return (\n <div className=\"w-full space-y-3 bg-surface-card\">\n <svg ref={svgRef} className=\"w-full\" />\n <p className=\"text-center font-mono text-sm tracking-widest text-content-primary\">\n {linhaDigitavel}\n </p>\n </div>\n );\n}\n\n","export type FileValidationReason = \"type\" | \"size\" | \"count\";\n\nexport interface FileRejection {\n file: File;\n reason: FileValidationReason;\n message: string;\n}\n\nexport interface FileValidationOptions {\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n}\n\nexport interface FileValidationResult {\n accepted: File[];\n rejected: FileRejection[];\n}\n\nfunction acceptsFile(file: File, accept?: string) {\n if (!accept?.trim()) return true;\n\n return accept.split(\",\").map((item) => item.trim().toLowerCase()).some((rule) => {\n if (rule.endsWith(\"/*\")) return file.type.toLowerCase().startsWith(rule.slice(0, -1));\n if (rule.startsWith(\".\")) return file.name.toLowerCase().endsWith(rule);\n return file.type.toLowerCase() === rule;\n });\n}\n\nfunction rejectionMessage(reason: FileValidationReason) {\n if (reason === \"type\") return \"Tipo de arquivo não permitido.\";\n if (reason === \"size\") return \"O arquivo excede o tamanho máximo permitido.\";\n return \"Quantidade máxima de arquivos excedida.\";\n}\n\nfunction normalizeMaxFiles(options: FileValidationOptions) {\n if (options.multiple === false) return 1;\n if (options.maxFiles === undefined || !Number.isFinite(options.maxFiles)) {\n return Number.POSITIVE_INFINITY;\n }\n return Math.max(1, Math.floor(options.maxFiles));\n}\n\nfunction normalizeMaxSize(maxSize?: number) {\n if (maxSize === undefined || !Number.isFinite(maxSize)) return undefined;\n return Math.max(0, maxSize);\n}\n\nexport function validateFiles(\n files: readonly File[] | FileList,\n options: FileValidationOptions = {},\n): FileValidationResult {\n const selected = Array.from(files);\n const maxFiles = normalizeMaxFiles(options);\n const maxSize = normalizeMaxSize(options.maxSize);\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n selected.forEach((file, index) => {\n const reason: FileValidationReason | undefined = !acceptsFile(file, options.accept)\n ? \"type\"\n : maxSize !== undefined && file.size > maxSize\n ? \"size\"\n : index >= maxFiles\n ? \"count\"\n : undefined;\n\n if (reason) {\n rejected.push({ file, reason, message: rejectionMessage(reason) });\n } else {\n accepted.push(file);\n }\n });\n\n return { accepted, rejected };\n}\n","\"use client\";\n\nimport classNames from \"classnames\";\nimport { useId, useRef, useState, type ChangeEvent, type DragEvent, type ReactNode } from \"react\";\nimport { validateFiles, type FileRejection } from \"./validation\";\n\nexport type { FileRejection } from \"./validation\";\n\nexport interface FileDropzoneProps {\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n id?: string;\n name?: string;\n required?: boolean;\n label?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode;\n className?: string;\n onFilesAccepted?: (files: File[]) => void;\n onFilesRejected?: (rejections: FileRejection[]) => void;\n}\n\nexport function FileDropzone({\n accept,\n multiple = false,\n maxFiles = multiple ? Number.POSITIVE_INFINITY : 1,\n maxSize,\n disabled = false,\n id,\n name,\n required = false,\n label = \"Selecionar arquivos\",\n hint = \"Arraste e solte os arquivos aqui ou use o teclado para selecionar.\",\n error,\n className,\n onFilesAccepted,\n onFilesRejected,\n}: FileDropzoneProps) {\n const generatedInputId = useId();\n const inputId = id ?? generatedInputId;\n const messageId = `${inputId}-message`;\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [rejectionMessage, setRejectionMessage] = useState<string>();\n\n const processFiles = (fileList: FileList | File[]) => {\n if (disabled) return;\n const { accepted, rejected } = validateFiles(fileList, {\n accept,\n maxFiles,\n maxSize,\n multiple,\n });\n setRejectionMessage(rejected.length ? rejected.map((item) => item.message).join(\" \") : undefined);\n if (accepted.length) onFilesAccepted?.(accepted);\n if (rejected.length) onFilesRejected?.(rejected);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files) processFiles(event.target.files);\n event.target.value = \"\";\n };\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragging(false);\n processFiles(event.dataTransfer.files);\n };\n const hasError = Boolean(error || rejectionMessage);\n const message = error || rejectionMessage || hint;\n\n return (\n <div\n onDragEnter={(event) => { event.preventDefault(); if (!disabled) setIsDragging(true); }}\n onDragOver={(event) => event.preventDefault()}\n onDragLeave={(event) => { if (event.currentTarget === event.target) setIsDragging(false); }}\n onDrop={handleDrop}\n className={classNames(\n \"flex min-h-32 w-full cursor-pointer flex-col items-center justify-center rounded-sm border-2 border-dashed p-6 text-center transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\",\n isDragging ? \"border-action-primary bg-primary-1/10\" : \"border-border-default bg-surface-card hover:border-border-strong\",\n disabled && \"cursor-not-allowed opacity-60\",\n hasError && \"border-field-border-error\",\n className,\n )}\n >\n <label htmlFor={inputId} className=\"flex cursor-pointer flex-col items-center focus-within:outline focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-focus-ring\">\n <span className=\"font-semibold text-content-primary\">{label}</span>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n name={name}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n required={required}\n onChange={handleInputChange}\n aria-describedby={message ? messageId : undefined}\n aria-invalid={hasError ? true : undefined}\n className=\"sr-only\"\n />\n </label>\n {message && <span id={messageId} role={hasError ? \"alert\" : undefined} className={classNames(\"mt-1 text-sm\", hasError ? \"text-field-assistive-error\" : \"text-content-secondary\")}>{message}</span>}\n </div>\n );\n}\n\nexport default FileDropzone;\n","\"use client\";\n\nimport classNames from \"classnames\";\n\nexport type FileUploadProgressStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\n\nexport interface FileUploadProgressProps {\n value?: number | null;\n label?: string;\n status?: FileUploadProgressStatus;\n showValue?: boolean;\n className?: string;\n}\n\nexport function FileUploadProgress({\n value,\n label = \"Progresso do upload\",\n status = \"uploading\",\n showValue = true,\n className,\n}: FileUploadProgressProps) {\n const resolvedValue = typeof value === \"number\"\n ? Math.min(100, Math.max(0, value))\n : undefined;\n const statusText = status === \"success\"\n ? \"Concluído\"\n : status === \"error\"\n ? \"Erro\"\n : resolvedValue === undefined\n ? \"Em andamento\"\n : `${Math.round(resolvedValue)}%`;\n\n return (\n <div className={classNames(\"w-full\", className)}>\n <div className=\"mb-1 flex items-center justify-between gap-2 text-xs text-content-secondary\">\n <span>{label}</span>\n {showValue && <span aria-hidden=\"true\">{statusText}</span>}\n </div>\n <div\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={resolvedValue === undefined ? undefined : 0}\n aria-valuemax={resolvedValue === undefined ? undefined : 100}\n aria-valuenow={resolvedValue}\n aria-valuetext={statusText}\n className=\"h-2 w-full overflow-hidden rounded-full bg-surface-muted\"\n >\n <div\n className={classNames(\n \"h-full rounded-full transition-[width] duration-200\",\n status === \"error\" ? \"bg-feedback-danger-strong\" : \"bg-action-primary\",\n resolvedValue === undefined ? \"w-1/2 animate-pulse\" : undefined,\n )}\n style={resolvedValue === undefined ? undefined : { width: `${resolvedValue}%` }}\n />\n </div>\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">{statusText}</span>\n </div>\n );\n}\n\nexport default FileUploadProgress;\n","\"use client\";\n\nimport classNames from \"classnames\";\nimport { MdClose, MdRefresh } from \"react-icons/md\";\nimport FileUploadProgress, { type FileUploadProgressStatus } from \"./FileUploadProgress\";\n\nexport type FileUploadItemStatus = FileUploadProgressStatus | \"pending\";\n\nexport interface FileUploadItem {\n id?: string;\n file: File;\n progress?: number | null;\n status?: FileUploadItemStatus;\n error?: string;\n}\n\nexport interface FileListProps {\n files: FileUploadItem[];\n accessibleName?: string;\n onRemove?: (item: FileUploadItem, index: number) => void;\n onRetry?: (item: FileUploadItem, index: number) => void;\n className?: string;\n}\n\nconst fileId = (item: FileUploadItem, index: number) => item.id ?? `${item.file.name}-${item.file.size}-${item.file.lastModified}-${index}`;\n\nconst statusDescription = (status: FileUploadItemStatus) => {\n if (status === \"uploading\") return \"Enviando\";\n if (status === \"success\") return \"Enviado\";\n if (status === \"error\") return \"Erro no envio\";\n return \"Aguardando envio\";\n};\n\nexport function FileList({ files, accessibleName = \"Arquivos selecionados\", onRemove, onRetry, className }: FileListProps) {\n return (\n <ul aria-label={accessibleName} className={classNames(\"w-full space-y-2\", className)}>\n {files.map((item, index) => {\n const status = item.status ?? \"pending\";\n const progressStatus: FileUploadProgressStatus = status === \"pending\" ? \"idle\" : status;\n return (\n <li key={fileId(item, index)} aria-busy={status === \"uploading\" || undefined} className=\"flex min-w-0 flex-wrap items-center gap-3 rounded-sm border border-border-default bg-surface-card p-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-semibold text-content-primary\" title={item.file.name}>{item.file.name}</p>\n <p className=\"text-xs text-content-secondary\">{Math.ceil(item.file.size / 1024)} KB</p>\n <span className=\"sr-only\">Status: {statusDescription(status)}</span>\n {(status === \"uploading\" || status === \"success\" || status === \"error\") && (\n <FileUploadProgress value={item.progress} status={progressStatus} label={`Progresso de ${item.file.name}`} />\n )}\n {item.error && <p role=\"alert\" className=\"mt-1 text-sm text-field-assistive-error\">{item.error}</p>}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {status === \"error\" && onRetry && <button type=\"button\" onClick={() => onRetry(item, index)} aria-label={`Tentar novamente ${item.file.name}`} className=\"flex h-11 w-11 items-center justify-center rounded-sm text-content-secondary hover:bg-surface-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-focus-ring\"><MdRefresh aria-hidden=\"true\" className=\"h-5 w-5\" /></button>}\n {onRemove && <button type=\"button\" onClick={() => onRemove(item, index)} aria-label={`Remover ${item.file.name}`} className=\"flex h-11 w-11 items-center justify-center rounded-sm text-content-secondary hover:bg-surface-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-focus-ring\"><MdClose aria-hidden=\"true\" className=\"h-5 w-5\" /></button>}\n </div>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport default FileList;\n","\"use client\";\n\nimport classNames from \"classnames\";\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nexport type FileViewerSource = string | Blob | {\n url?: string;\n blob?: Blob;\n contentType?: string;\n fileName?: string;\n};\n\nexport interface FileViewerProps {\n source?: FileViewerSource;\n fileName?: string;\n contentType?: string;\n loading?: boolean;\n error?: ReactNode;\n onLoad?: () => void;\n onError?: (error: Error) => void;\n onDownload?: () => void;\n fallback?: ReactNode;\n title?: string;\n className?: string;\n}\n\nconst extensionType = (fileName?: string) => {\n const extension = fileName?.split(\".\").pop()?.toLowerCase();\n if (extension === \"pdf\") return \"application/pdf\";\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\"].includes(extension ?? \"\")) {\n return `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n }\n if ([\"txt\", \"csv\", \"json\", \"xml\", \"md\"].includes(extension ?? \"\")) return \"text/plain\";\n return \"application/octet-stream\";\n};\n\nconst normalizeContentType = (contentType: string) => contentType.split(\";\", 1)[0].trim().toLowerCase();\n\nconst toError = (cause: unknown) => (\n cause instanceof Error ? cause : new Error(\"Não foi possível ler o arquivo.\")\n);\n\nexport function FileViewer({\n source,\n fileName,\n contentType,\n loading = false,\n error,\n onLoad,\n onError,\n onDownload,\n fallback,\n title = fileName ?? \"Visualização do arquivo\",\n className,\n}: FileViewerProps) {\n const [objectUrl, setObjectUrl] = useState<string>();\n const [textContent, setTextContent] = useState<string>();\n const [readError, setReadError] = useState<Error | null>(null);\n const onLoadRef = useRef(onLoad);\n const onErrorRef = useRef(onError);\n const resolved = typeof source === \"object\" && source !== null && !(source instanceof Blob) ? source : undefined;\n const blob = source instanceof Blob ? source : resolved?.blob;\n const url = typeof source === \"string\" ? source : resolved?.url;\n const resolvedName = fileName ?? resolved?.fileName;\n const rawType = contentType?.trim() || resolved?.contentType || blob?.type || extensionType(resolvedName);\n const resolvedType = normalizeContentType(rawType);\n const isText = resolvedType.startsWith(\"text/\") || resolvedType === \"application/json\";\n const displayError = error ?? readError?.message;\n\n useEffect(() => {\n onLoadRef.current = onLoad;\n }, [onLoad]);\n\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n\n useEffect(() => {\n let active = true;\n setReadError(null);\n setTextContent(undefined);\n\n if (!blob) {\n setObjectUrl(undefined);\n return () => { active = false; };\n }\n\n let nextUrl: string;\n try {\n nextUrl = URL.createObjectURL(blob);\n setObjectUrl(nextUrl);\n } catch (cause) {\n const nextError = toError(cause);\n setReadError(nextError);\n onErrorRef.current?.(nextError);\n return () => { active = false; };\n }\n\n if (isText) {\n blob.text()\n .then((text) => {\n if (!active) return;\n setTextContent(text);\n onLoadRef.current?.();\n })\n .catch((cause: unknown) => {\n if (!active) return;\n const nextError = toError(cause);\n setReadError(nextError);\n onErrorRef.current?.(nextError);\n });\n }\n\n return () => {\n active = false;\n URL.revokeObjectURL(nextUrl);\n };\n }, [blob, isText]);\n\n const handleMediaError = () => {\n const nextError = new Error(\"Não foi possível carregar a visualização do arquivo.\");\n setReadError(nextError);\n onErrorRef.current?.(nextError);\n };\n const handleLoad = () => onLoadRef.current?.();\n\n if (loading) {\n return (\n <div\n className={classNames(\"flex min-h-32 items-center justify-center rounded-sm border border-border-default bg-surface-card p-6 text-content-secondary\", className)}\n role=\"status\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n Carregando arquivo…\n </div>\n );\n }\n\n if (displayError) {\n return (\n <div className={classNames(\"rounded-sm border border-field-border-error bg-surface-card p-4 text-field-assistive-error\", className)} role=\"alert\">\n {displayError}\n </div>\n );\n }\n\n const displayUrl = objectUrl ?? url;\n if (!displayUrl && !textContent) {\n return (\n <div\n className={classNames(\"rounded-sm border border-border-default bg-surface-card p-4 text-content-secondary\", className)}\n role=\"region\"\n aria-label={title}\n >\n {fallback ?? \"Arquivo indisponível.\"}\n </div>\n );\n }\n\n const download = onDownload\n ? <button type=\"button\" onClick={onDownload} className=\"min-h-11 rounded-sm border border-border-default px-3 text-sm font-semibold text-content-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\">Baixar arquivo</button>\n : displayUrl\n ? <a href={displayUrl} download={resolvedName} className=\"inline-flex min-h-11 items-center rounded-sm border border-border-default px-3 text-sm font-semibold text-content-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\">Baixar arquivo</a>\n : null;\n\n return (\n <div\n className={classNames(\"flex min-w-0 flex-col gap-3 rounded-sm border border-border-default bg-surface-card p-3\", className)}\n role=\"region\"\n aria-label={title}\n >\n {resolvedType.startsWith(\"image/\") && displayUrl && (\n <img src={displayUrl} alt={title} onLoad={handleLoad} onError={handleMediaError} className=\"max-h-[70vh] max-w-full object-contain\" />\n )}\n {resolvedType === \"application/pdf\" && displayUrl && (\n <iframe src={displayUrl} title={title} onLoad={handleLoad} onError={handleMediaError} sandbox=\"\" className=\"min-h-[32rem] w-full border-0\" />\n )}\n {isText && (textContent !== undefined\n ? <pre className=\"max-h-[70vh] overflow-auto whitespace-pre-wrap break-words text-sm text-content-primary\">{textContent}</pre>\n : displayUrl && <iframe src={displayUrl} title={title} onLoad={handleLoad} onError={handleMediaError} sandbox=\"\" className=\"min-h-64 w-full border-0\" />)}\n {!resolvedType.startsWith(\"image/\") && resolvedType !== \"application/pdf\" && !isText && (\n fallback ?? <p className=\"text-content-secondary\">Este tipo de arquivo não possui visualização disponível.</p>\n )}\n {download && <div className=\"flex justify-end\">{download}</div>}\n </div>\n );\n}\n\nexport default FileViewer;\n","\"use client\";\n\nimport QRCodeGenerator from \"qrcode\";\nimport { useEffect, useId, useMemo, useRef, useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport classNames from \"classnames\";\n\nexport type QRCodeErrorCorrectionLevel = \"L\" | \"M\" | \"Q\" | \"H\";\n\nexport interface QRCodeProps extends Omit<HTMLAttributes<HTMLDivElement>, \"color\" | \"onError\"> {\n value: string;\n size?: number;\n level?: QRCodeErrorCorrectionLevel;\n includeMargin?: boolean;\n fgColor?: string;\n bgColor?: string;\n ariaLabel?: string;\n description?: string;\n loading?: boolean;\n error?: ReactNode;\n onError?: (error: Error) => void;\n}\n\nfunction getRelativeLuminance(color: string) {\n const match = color.trim().match(/^#([\\da-f]{6})$/i);\n if (!match) return null;\n\n const channels = [0, 2, 4].map((offset) => Number.parseInt(match[1].slice(offset, offset + 2), 16) / 255);\n const linear = channels.map((channel) => (\n channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4\n ));\n\n return 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2];\n}\n\nfunction resolveAccessibleColors(fgColor: string, bgColor: string) {\n const foregroundLuminance = getRelativeLuminance(fgColor);\n const backgroundLuminance = getRelativeLuminance(bgColor);\n\n if (foregroundLuminance === null || backgroundLuminance === null) {\n return { dark: fgColor, light: bgColor };\n }\n\n const lighter = Math.max(foregroundLuminance, backgroundLuminance);\n const darker = Math.min(foregroundLuminance, backgroundLuminance);\n const contrastRatio = (lighter + 0.05) / (darker + 0.05);\n\n return contrastRatio >= 3\n ? { dark: fgColor, light: bgColor }\n : { dark: \"#000000\", light: \"#FFFFFF\" };\n}\n\nexport function QRCode({\n value,\n size = 192,\n level = \"M\",\n includeMargin = true,\n fgColor = \"#000000\",\n bgColor = \"#FFFFFF\",\n ariaLabel = \"Código QR\",\n description,\n loading = false,\n error,\n onError,\n className,\n ...rest\n}: QRCodeProps) {\n const [dataUrl, setDataUrl] = useState<string | null>(null);\n const [generationError, setGenerationError] = useState<Error | null>(null);\n const onErrorRef = useRef(onError);\n const generatedId = useId();\n const resolvedSize = Math.max(1, Number.isFinite(size) ? Math.floor(size) : 192);\n const descriptionId = description\n ? `${rest.id ?? generatedId}-description`\n : undefined;\n const colors = useMemo(\n () => resolveAccessibleColors(fgColor, bgColor),\n [bgColor, fgColor],\n );\n const describedBy = [rest[\"aria-describedby\"], descriptionId].filter(Boolean).join(\" \") || undefined;\n const displayError = error ?? generationError?.message;\n const isLoading = loading || (!dataUrl && !displayError);\n\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n\n useEffect(() => {\n let active = true;\n if (error) {\n setDataUrl(null);\n setGenerationError(null);\n return () => { active = false; };\n }\n setDataUrl(null);\n setGenerationError(null);\n QRCodeGenerator.toDataURL(value, {\n width: resolvedSize,\n margin: includeMargin ? 4 : 0,\n errorCorrectionLevel: level,\n color: colors,\n })\n .then((url) => { if (active) setDataUrl(url); })\n .catch((cause: unknown) => {\n if (!active) return;\n const nextError = cause instanceof Error\n ? cause\n : new Error(\"Não foi possível gerar o código QR.\");\n setDataUrl(null);\n setGenerationError(nextError);\n onErrorRef.current?.(nextError);\n });\n return () => { active = false; };\n }, [colors, error, includeMargin, level, resolvedSize, value]);\n\n return (\n <div\n {...rest}\n role=\"img\"\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-busy={isLoading || undefined}\n aria-invalid={displayError ? true : undefined}\n className={classNames(\"inline-flex max-w-full flex-col items-center gap-2\", className)}\n >\n {displayError ? (\n <span role=\"alert\" className=\"rounded-sm border border-field-border-error p-3 text-sm text-field-assistive-error\">\n {displayError}\n </span>\n ) : dataUrl ? (\n <img src={dataUrl} alt=\"\" width={resolvedSize} height={resolvedSize} className=\"h-auto max-w-full\" />\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"inline-block animate-pulse rounded-sm bg-surface-muted\"\n style={{ width: resolvedSize, height: resolvedSize, maxWidth: \"100%\" }}\n />\n )}\n {description && <span id={descriptionId} className=\"sr-only\">{description}</span>}\n </div>\n );\n}\n\nexport default QRCode;\n"],"mappings":"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","names":["useRef","jsx","jsxs","useRef","rejectionMessage","classNames","jsx","jsxs","classNames","jsx","jsxs","classNames","classNames","useEffect","useRef","useState","jsx","jsxs","_a","useEffect","useId","useRef","useState","classNames","jsx","jsxs","_a","useState","useRef","useId","useEffect","classNames"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/barcode/barcode.tsx","../src/components/file-upload/validation.ts","../src/components/file-upload/FileDropzone.tsx","../src/components/file-upload/FileUploadProgress.tsx","../src/components/file-upload/FileList.tsx","../src/components/file-upload/FileViewer.tsx","../src/components/qr-code/QRCode.tsx"],"sourcesContent":["\"use client\";\n\nimport JsBarcode from \"jsbarcode\";\nimport { useEffect, useRef } from \"react\";\n\nconst linhaDigitavelParaCodigoBarras = (linha: string): string => {\n const d = linha.replace(/\\D/g, \"\");\n\n const banco = d.substring(0, 3);\n const moeda = d.substring(3, 4);\n const campo1 = d.substring(4, 9);\n const campo2 = d.substring(10, 20);\n const campo3 = d.substring(21, 31);\n const digitoGeral = d.substring(32, 33);\n const vencimento = d.substring(33, 37);\n const valor = d.substring(37, 47);\n\n return (\n banco + moeda + digitoGeral + vencimento + valor + campo1 + campo2 + campo3\n );\n};\n\nexport interface BoletoBarCodeProps {\n linhaDigitavel: string;\n}\n\nexport function BoletoBarCode({ linhaDigitavel }: BoletoBarCodeProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n\n useEffect(() => {\n if (!svgRef.current) return;\n\n try {\n const codigoBarras = linhaDigitavelParaCodigoBarras(linhaDigitavel);\n\n JsBarcode(svgRef.current, codigoBarras, {\n format: \"ITF\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n displayValue: false,\n width: 2,\n height: 80,\n margin: 0,\n });\n } catch (error) {\n console.error(\"Erro ao gerar código de barras:\", error);\n }\n }, [linhaDigitavel]);\n\n return (\n <div className=\"w-full space-y-3 bg-surface-card\">\n <svg ref={svgRef} className=\"w-full\" />\n <p className=\"text-center font-mono text-sm tracking-widest text-content-primary\">\n {linhaDigitavel}\n </p>\n </div>\n );\n}\n\n","export type FileValidationReason = \"type\" | \"size\" | \"count\";\n\nexport interface FileRejection {\n file: File;\n reason: FileValidationReason;\n message: string;\n}\n\nexport interface FileValidationOptions {\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n}\n\nexport interface FileValidationResult {\n accepted: File[];\n rejected: FileRejection[];\n}\n\nfunction acceptsFile(file: File, accept?: string) {\n if (!accept?.trim()) return true;\n\n return accept.split(\",\").map((item) => item.trim().toLowerCase()).some((rule) => {\n if (rule.endsWith(\"/*\")) return file.type.toLowerCase().startsWith(rule.slice(0, -1));\n if (rule.startsWith(\".\")) return file.name.toLowerCase().endsWith(rule);\n return file.type.toLowerCase() === rule;\n });\n}\n\nfunction rejectionMessage(reason: FileValidationReason) {\n if (reason === \"type\") return \"Tipo de arquivo não permitido.\";\n if (reason === \"size\") return \"O arquivo excede o tamanho máximo permitido.\";\n return \"Quantidade máxima de arquivos excedida.\";\n}\n\nfunction normalizeMaxFiles(options: FileValidationOptions) {\n if (options.multiple === false) return 1;\n if (options.maxFiles === undefined || !Number.isFinite(options.maxFiles)) {\n return Number.POSITIVE_INFINITY;\n }\n return Math.max(1, Math.floor(options.maxFiles));\n}\n\nfunction normalizeMaxSize(maxSize?: number) {\n if (maxSize === undefined || !Number.isFinite(maxSize)) return undefined;\n return Math.max(0, maxSize);\n}\n\nexport function validateFiles(\n files: readonly File[] | FileList,\n options: FileValidationOptions = {},\n): FileValidationResult {\n const selected = Array.from(files);\n const maxFiles = normalizeMaxFiles(options);\n const maxSize = normalizeMaxSize(options.maxSize);\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n selected.forEach((file, index) => {\n const reason: FileValidationReason | undefined = !acceptsFile(file, options.accept)\n ? \"type\"\n : maxSize !== undefined && file.size > maxSize\n ? \"size\"\n : index >= maxFiles\n ? \"count\"\n : undefined;\n\n if (reason) {\n rejected.push({ file, reason, message: rejectionMessage(reason) });\n } else {\n accepted.push(file);\n }\n });\n\n return { accepted, rejected };\n}\n","\"use client\";\n\nimport classNames from \"classnames\";\nimport { useId, useRef, useState, type ChangeEvent, type DragEvent, type ReactNode } from \"react\";\nimport { validateFiles, type FileRejection } from \"./validation\";\n\nexport type { FileRejection } from \"./validation\";\n\nexport interface FileDropzoneProps {\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n id?: string;\n name?: string;\n required?: boolean;\n label?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode;\n className?: string;\n onFilesAccepted?: (files: File[]) => void;\n onFilesRejected?: (rejections: FileRejection[]) => void;\n}\n\nexport function FileDropzone({\n accept,\n multiple = false,\n maxFiles = multiple ? Number.POSITIVE_INFINITY : 1,\n maxSize,\n disabled = false,\n id,\n name,\n required = false,\n label = \"Selecionar arquivos\",\n hint = \"Arraste e solte os arquivos aqui ou use o teclado para selecionar.\",\n error,\n className,\n onFilesAccepted,\n onFilesRejected,\n}: FileDropzoneProps) {\n const generatedInputId = useId();\n const inputId = id ?? generatedInputId;\n const messageId = `${inputId}-message`;\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [rejectionMessage, setRejectionMessage] = useState<string>();\n\n const processFiles = (fileList: FileList | File[]) => {\n if (disabled) return;\n const { accepted, rejected } = validateFiles(fileList, {\n accept,\n maxFiles,\n maxSize,\n multiple,\n });\n setRejectionMessage(rejected.length ? rejected.map((item) => item.message).join(\" \") : undefined);\n if (accepted.length) onFilesAccepted?.(accepted);\n if (rejected.length) onFilesRejected?.(rejected);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files) processFiles(event.target.files);\n event.target.value = \"\";\n };\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragging(false);\n processFiles(event.dataTransfer.files);\n };\n const hasError = Boolean(error || rejectionMessage);\n const message = error || rejectionMessage || hint;\n\n return (\n <div\n onDragEnter={(event) => { event.preventDefault(); if (!disabled) setIsDragging(true); }}\n onDragOver={(event) => event.preventDefault()}\n onDragLeave={(event) => { if (event.currentTarget === event.target) setIsDragging(false); }}\n onDrop={handleDrop}\n className={classNames(\n \"flex min-h-32 w-full cursor-pointer flex-col items-center justify-center rounded-sm border-2 border-dashed p-6 text-center transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\",\n isDragging ? \"border-action-primary bg-primary-1/10\" : \"border-border-default bg-surface-card hover:border-border-strong\",\n disabled && \"cursor-not-allowed opacity-60\",\n hasError && \"border-field-border-error\",\n className,\n )}\n >\n <label htmlFor={inputId} className=\"flex cursor-pointer flex-col items-center focus-within:outline focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-focus-ring\">\n <span className=\"font-semibold text-content-primary\">{label}</span>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n name={name}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n required={required}\n onChange={handleInputChange}\n aria-describedby={message ? messageId : undefined}\n aria-invalid={hasError ? true : undefined}\n className=\"sr-only\"\n />\n </label>\n {message && <span id={messageId} role={hasError ? \"alert\" : undefined} className={classNames(\"mt-1 text-sm\", hasError ? \"text-field-assistive-error\" : \"text-content-secondary\")}>{message}</span>}\n </div>\n );\n}\n\nexport default FileDropzone;\n","\"use client\";\n\nimport classNames from \"classnames\";\n\nexport type FileUploadProgressStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\n\nexport interface FileUploadProgressProps {\n value?: number | null;\n label?: string;\n status?: FileUploadProgressStatus;\n showValue?: boolean;\n className?: string;\n}\n\nexport function FileUploadProgress({\n value,\n label = \"Progresso do upload\",\n status = \"uploading\",\n showValue = true,\n className,\n}: FileUploadProgressProps) {\n const resolvedValue = typeof value === \"number\"\n ? Math.min(100, Math.max(0, value))\n : undefined;\n const statusText = status === \"success\"\n ? \"Concluído\"\n : status === \"error\"\n ? \"Erro\"\n : resolvedValue === undefined\n ? \"Em andamento\"\n : `${Math.round(resolvedValue)}%`;\n\n return (\n <div className={classNames(\"w-full\", className)}>\n <div className=\"mb-1 flex items-center justify-between gap-2 text-xs text-content-secondary\">\n <span>{label}</span>\n {showValue && <span aria-hidden=\"true\">{statusText}</span>}\n </div>\n <div\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={resolvedValue === undefined ? undefined : 0}\n aria-valuemax={resolvedValue === undefined ? undefined : 100}\n aria-valuenow={resolvedValue}\n aria-valuetext={statusText}\n className=\"h-2 w-full overflow-hidden rounded-full bg-surface-muted\"\n >\n <div\n className={classNames(\n \"h-full rounded-full transition-[width] duration-200\",\n status === \"error\" ? \"bg-feedback-danger-strong\" : \"bg-action-primary\",\n resolvedValue === undefined ? \"w-1/2 animate-pulse\" : undefined,\n )}\n style={resolvedValue === undefined ? undefined : { width: `${resolvedValue}%` }}\n />\n </div>\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">{statusText}</span>\n </div>\n );\n}\n\nexport default FileUploadProgress;\n","\"use client\";\n\nimport classNames from \"classnames\";\nimport { MdClose, MdRefresh } from \"react-icons/md\";\nimport FileUploadProgress, { type FileUploadProgressStatus } from \"./FileUploadProgress\";\n\nexport type FileUploadItemStatus = FileUploadProgressStatus | \"pending\";\n\nexport interface FileUploadItem {\n id?: string;\n file: File;\n progress?: number | null;\n status?: FileUploadItemStatus;\n error?: string;\n}\n\nexport interface FileListProps {\n files: FileUploadItem[];\n accessibleName?: string;\n onRemove?: (item: FileUploadItem, index: number) => void;\n onRetry?: (item: FileUploadItem, index: number) => void;\n className?: string;\n}\n\nconst fileId = (item: FileUploadItem, index: number) => item.id ?? `${item.file.name}-${item.file.size}-${item.file.lastModified}-${index}`;\n\nconst statusDescription = (status: FileUploadItemStatus) => {\n if (status === \"uploading\") return \"Enviando\";\n if (status === \"success\") return \"Enviado\";\n if (status === \"error\") return \"Erro no envio\";\n return \"Aguardando envio\";\n};\n\nexport function FileList({ files, accessibleName = \"Arquivos selecionados\", onRemove, onRetry, className }: FileListProps) {\n return (\n <ul aria-label={accessibleName} className={classNames(\"w-full space-y-2\", className)}>\n {files.map((item, index) => {\n const status = item.status ?? \"pending\";\n const progressStatus: FileUploadProgressStatus = status === \"pending\" ? \"idle\" : status;\n return (\n <li key={fileId(item, index)} aria-busy={status === \"uploading\" || undefined} className=\"flex min-w-0 flex-wrap items-center gap-3 rounded-sm border border-border-default bg-surface-card p-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-semibold text-content-primary\" title={item.file.name}>{item.file.name}</p>\n <p className=\"text-xs text-content-secondary\">{Math.ceil(item.file.size / 1024)} KB</p>\n <span className=\"sr-only\">Status: {statusDescription(status)}</span>\n {(status === \"uploading\" || status === \"success\" || status === \"error\") && (\n <FileUploadProgress value={item.progress} status={progressStatus} label={`Progresso de ${item.file.name}`} />\n )}\n {item.error && <p role=\"alert\" className=\"mt-1 text-sm text-field-assistive-error\">{item.error}</p>}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {status === \"error\" && onRetry && <button type=\"button\" onClick={() => onRetry(item, index)} aria-label={`Tentar novamente ${item.file.name}`} className=\"flex h-11 w-11 items-center justify-center rounded-sm text-content-secondary hover:bg-surface-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-focus-ring\"><MdRefresh aria-hidden=\"true\" className=\"h-5 w-5\" /></button>}\n {onRemove && <button type=\"button\" onClick={() => onRemove(item, index)} aria-label={`Remover ${item.file.name}`} className=\"flex h-11 w-11 items-center justify-center rounded-sm text-content-secondary hover:bg-surface-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-focus-ring\"><MdClose aria-hidden=\"true\" className=\"h-5 w-5\" /></button>}\n </div>\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport default FileList;\n","\"use client\";\n\nimport classNames from \"classnames\";\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nexport type FileViewerSource = string | Blob | {\n url?: string;\n blob?: Blob;\n contentType?: string;\n fileName?: string;\n};\n\nexport interface FileViewerProps {\n source?: FileViewerSource;\n fileName?: string;\n contentType?: string;\n loading?: boolean;\n error?: ReactNode;\n onLoad?: () => void;\n onError?: (error: Error) => void;\n onDownload?: () => void;\n fallback?: ReactNode;\n title?: string;\n className?: string;\n}\n\nconst extensionType = (fileName?: string) => {\n const extension = fileName?.split(\".\").pop()?.toLowerCase();\n if (extension === \"pdf\") return \"application/pdf\";\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\"].includes(extension ?? \"\")) {\n return `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n }\n if ([\"txt\", \"csv\", \"json\", \"xml\", \"md\"].includes(extension ?? \"\")) return \"text/plain\";\n return \"application/octet-stream\";\n};\n\nconst normalizeContentType = (contentType: string) => contentType.split(\";\", 1)[0].trim().toLowerCase();\n\nconst toError = (cause: unknown) => (\n cause instanceof Error ? cause : new Error(\"Não foi possível ler o arquivo.\")\n);\n\nexport function FileViewer({\n source,\n fileName,\n contentType,\n loading = false,\n error,\n onLoad,\n onError,\n onDownload,\n fallback,\n title = fileName ?? \"Visualização do arquivo\",\n className,\n}: FileViewerProps) {\n const [objectUrl, setObjectUrl] = useState<string>();\n const [textContent, setTextContent] = useState<string>();\n const [readError, setReadError] = useState<Error | null>(null);\n const onLoadRef = useRef(onLoad);\n const onErrorRef = useRef(onError);\n const resolved = typeof source === \"object\" && source !== null && !(source instanceof Blob) ? source : undefined;\n const blob = source instanceof Blob ? source : resolved?.blob;\n const url = typeof source === \"string\" ? source : resolved?.url;\n const resolvedName = fileName ?? resolved?.fileName;\n const rawType = contentType?.trim() || resolved?.contentType || blob?.type || extensionType(resolvedName);\n const resolvedType = normalizeContentType(rawType);\n const isText = resolvedType.startsWith(\"text/\") || resolvedType === \"application/json\";\n const displayError = error ?? readError?.message;\n\n useEffect(() => {\n onLoadRef.current = onLoad;\n }, [onLoad]);\n\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n\n useEffect(() => {\n let active = true;\n setReadError(null);\n setTextContent(undefined);\n\n if (!blob) {\n setObjectUrl(undefined);\n return () => { active = false; };\n }\n\n let nextUrl: string;\n try {\n nextUrl = URL.createObjectURL(blob);\n setObjectUrl(nextUrl);\n } catch (cause) {\n const nextError = toError(cause);\n setReadError(nextError);\n onErrorRef.current?.(nextError);\n return () => { active = false; };\n }\n\n if (isText) {\n blob.text()\n .then((text) => {\n if (!active) return;\n setTextContent(text);\n onLoadRef.current?.();\n })\n .catch((cause: unknown) => {\n if (!active) return;\n const nextError = toError(cause);\n setReadError(nextError);\n onErrorRef.current?.(nextError);\n });\n }\n\n return () => {\n active = false;\n URL.revokeObjectURL(nextUrl);\n };\n }, [blob, isText]);\n\n const handleMediaError = () => {\n const nextError = new Error(\"Não foi possível carregar a visualização do arquivo.\");\n setReadError(nextError);\n onErrorRef.current?.(nextError);\n };\n const handleLoad = () => onLoadRef.current?.();\n\n if (loading) {\n return (\n <div\n className={classNames(\"flex min-h-32 items-center justify-center rounded-sm border border-border-default bg-surface-card p-6 text-content-secondary\", className)}\n role=\"status\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n Carregando arquivo…\n </div>\n );\n }\n\n if (displayError) {\n return (\n <div className={classNames(\"rounded-sm border border-field-border-error bg-surface-card p-4 text-field-assistive-error\", className)} role=\"alert\">\n {displayError}\n </div>\n );\n }\n\n const displayUrl = objectUrl ?? url;\n if (!displayUrl && !textContent) {\n return (\n <div\n className={classNames(\"rounded-sm border border-border-default bg-surface-card p-4 text-content-secondary\", className)}\n role=\"region\"\n aria-label={title}\n >\n {fallback ?? \"Arquivo indisponível.\"}\n </div>\n );\n }\n\n const download = onDownload\n ? <button type=\"button\" onClick={onDownload} className=\"min-h-11 rounded-sm border border-border-default px-3 text-sm font-semibold text-content-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\">Baixar arquivo</button>\n : displayUrl\n ? <a href={displayUrl} download={resolvedName} className=\"inline-flex min-h-11 items-center rounded-sm border border-border-default px-3 text-sm font-semibold text-content-primary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\">Baixar arquivo</a>\n : null;\n\n return (\n <div\n className={classNames(\"flex min-w-0 flex-col gap-3 rounded-sm border border-border-default bg-surface-card p-3\", className)}\n role=\"region\"\n aria-label={title}\n >\n {resolvedType.startsWith(\"image/\") && displayUrl && (\n <img src={displayUrl} alt={title} onLoad={handleLoad} onError={handleMediaError} className=\"max-h-[70vh] max-w-full object-contain\" />\n )}\n {resolvedType === \"application/pdf\" && displayUrl && (\n <iframe src={displayUrl} title={title} onLoad={handleLoad} onError={handleMediaError} sandbox=\"\" className=\"min-h-[32rem] w-full border-0\" />\n )}\n {isText && (textContent !== undefined\n ? <pre className=\"max-h-[70vh] overflow-auto whitespace-pre-wrap break-words text-sm text-content-primary\">{textContent}</pre>\n : displayUrl && <iframe src={displayUrl} title={title} onLoad={handleLoad} onError={handleMediaError} sandbox=\"\" className=\"min-h-64 w-full border-0\" />)}\n {!resolvedType.startsWith(\"image/\") && resolvedType !== \"application/pdf\" && !isText && (\n fallback ?? <p className=\"text-content-secondary\">Este tipo de arquivo não possui visualização disponível.</p>\n )}\n {download && <div className=\"flex justify-end\">{download}</div>}\n </div>\n );\n}\n\nexport default FileViewer;\n","\"use client\";\n\nimport QRCodeGenerator from \"qrcode\";\nimport { useEffect, useId, useMemo, useRef, useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport classNames from \"classnames\";\n\nexport type QRCodeErrorCorrectionLevel = \"L\" | \"M\" | \"Q\" | \"H\";\n\nexport interface QRCodeProps extends Omit<HTMLAttributes<HTMLDivElement>, \"color\" | \"onError\"> {\n value: string;\n size?: number;\n level?: QRCodeErrorCorrectionLevel;\n includeMargin?: boolean;\n fgColor?: string;\n bgColor?: string;\n ariaLabel?: string;\n description?: string;\n loading?: boolean;\n error?: ReactNode;\n onError?: (error: Error) => void;\n}\n\nfunction getRelativeLuminance(color: string) {\n const match = color.trim().match(/^#([\\da-f]{6})$/i);\n if (!match) return null;\n\n const channels = [0, 2, 4].map((offset) => Number.parseInt(match[1].slice(offset, offset + 2), 16) / 255);\n const linear = channels.map((channel) => (\n channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4\n ));\n\n return 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2];\n}\n\nfunction resolveAccessibleColors(fgColor: string, bgColor: string) {\n const foregroundLuminance = getRelativeLuminance(fgColor);\n const backgroundLuminance = getRelativeLuminance(bgColor);\n\n if (foregroundLuminance === null || backgroundLuminance === null) {\n return { dark: fgColor, light: bgColor };\n }\n\n const lighter = Math.max(foregroundLuminance, backgroundLuminance);\n const darker = Math.min(foregroundLuminance, backgroundLuminance);\n const contrastRatio = (lighter + 0.05) / (darker + 0.05);\n\n return contrastRatio >= 3\n ? { dark: fgColor, light: bgColor }\n : { dark: \"#000000\", light: \"#FFFFFF\" };\n}\n\nexport function QRCode({\n value,\n size = 192,\n level = \"M\",\n includeMargin = true,\n fgColor = \"#000000\",\n bgColor = \"#FFFFFF\",\n ariaLabel = \"Código QR\",\n description,\n loading = false,\n error,\n onError,\n className,\n ...rest\n}: QRCodeProps) {\n const [dataUrl, setDataUrl] = useState<string | null>(null);\n const [generationError, setGenerationError] = useState<Error | null>(null);\n const onErrorRef = useRef(onError);\n const generatedId = useId();\n const resolvedSize = Math.max(1, Number.isFinite(size) ? Math.floor(size) : 192);\n const descriptionId = description\n ? `${rest.id ?? generatedId}-description`\n : undefined;\n const colors = useMemo(\n () => resolveAccessibleColors(fgColor, bgColor),\n [bgColor, fgColor],\n );\n const describedBy = [rest[\"aria-describedby\"], descriptionId].filter(Boolean).join(\" \") || undefined;\n const displayError = error ?? generationError?.message;\n const isLoading = loading || (!dataUrl && !displayError);\n\n useEffect(() => {\n onErrorRef.current = onError;\n }, [onError]);\n\n useEffect(() => {\n let active = true;\n if (error) {\n setDataUrl(null);\n setGenerationError(null);\n return () => { active = false; };\n }\n setDataUrl(null);\n setGenerationError(null);\n QRCodeGenerator.toDataURL(value, {\n width: resolvedSize,\n margin: includeMargin ? 4 : 0,\n errorCorrectionLevel: level,\n color: colors,\n })\n .then((url) => { if (active) setDataUrl(url); })\n .catch((cause: unknown) => {\n if (!active) return;\n const nextError = cause instanceof Error\n ? cause\n : new Error(\"Não foi possível gerar o código QR.\");\n setDataUrl(null);\n setGenerationError(nextError);\n onErrorRef.current?.(nextError);\n });\n return () => { active = false; };\n }, [colors, error, includeMargin, level, resolvedSize, value]);\n\n return (\n <div\n {...rest}\n role=\"img\"\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-busy={isLoading || undefined}\n aria-invalid={displayError ? true : undefined}\n className={classNames(\"inline-flex max-w-full flex-col items-center gap-2\", className)}\n >\n {displayError ? (\n <span role=\"alert\" className=\"rounded-sm border border-field-border-error p-3 text-sm text-field-assistive-error\">\n {displayError}\n </span>\n ) : dataUrl ? (\n <img src={dataUrl} alt=\"\" width={resolvedSize} height={resolvedSize} className=\"h-auto max-w-full\" />\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"inline-block animate-pulse rounded-sm bg-surface-muted\"\n style={{ width: resolvedSize, height: resolvedSize, maxWidth: \"100%\" }}\n />\n )}\n {description && <span id={descriptionId} className=\"sr-only\">{description}</span>}\n </div>\n );\n}\n\nexport default QRCode;\n"],"mappings":"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","names":["useRef","jsx","jsxs","useRef","rejectionMessage","classNames","jsx","jsxs","classNames","jsx","jsxs","classNames","classNames","useEffect","useRef","useState","jsx","jsxs","useEffect","useId","useRef","useState","classNames","jsx","jsxs"]}
|