@aspprev/versi-ds 0.2.0 → 0.4.0

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.
@@ -4,44 +4,40 @@ import {
4
4
  } from "./chunk-2NMEKWO5.js";
5
5
 
6
6
  // src/hooks/useBreakpoint.tsx
7
- import { useState, useEffect } from "react";
7
+ import { useSyncExternalStore } from "react";
8
8
  var breakpoints = {
9
9
  mobile: 640,
10
10
  tablet: 1024,
11
11
  desktop: 1440,
12
12
  tv: 1920
13
13
  };
14
- var useBreakpoint = () => {
15
- const getBreakpoint = (width) => {
16
- const entries = Object.entries(breakpoints);
17
- return entries.reduce(
18
- (prev, [key, minWidth]) => width >= minWidth ? key : prev,
19
- "mobile"
20
- );
21
- };
22
- const [currentBreakpoint, setCurrentBreakpoint] = useState("mobile");
23
- useEffect(() => {
24
- const handleResize = () => {
25
- const newBreakpoint = getBreakpoint(window.innerWidth);
26
- setCurrentBreakpoint(newBreakpoint);
27
- };
28
- handleResize();
29
- window.addEventListener("resize", handleResize);
30
- return () => {
31
- window.removeEventListener("resize", handleResize);
32
- };
33
- }, []);
34
- return currentBreakpoint;
35
- };
14
+ function getBreakpoint(width) {
15
+ const entries = Object.entries(breakpoints);
16
+ return entries.reduce(
17
+ (previous, [name, minimumWidth]) => width >= minimumWidth ? name : previous,
18
+ "mobile"
19
+ );
20
+ }
21
+ function subscribe(onStoreChange) {
22
+ window.addEventListener("resize", onStoreChange);
23
+ return () => window.removeEventListener("resize", onStoreChange);
24
+ }
25
+ function getSnapshot() {
26
+ return getBreakpoint(window.innerWidth);
27
+ }
28
+ function getServerSnapshot() {
29
+ return "mobile";
30
+ }
31
+ var useBreakpoint = () => useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
36
32
 
37
33
  // src/components/tooltip/Tooltip.tsx
38
34
  import {
39
35
  useCallback,
40
- useEffect as useEffect3,
36
+ useEffect as useEffect2,
41
37
  useId,
42
38
  useLayoutEffect,
43
39
  useRef,
44
- useState as useState2
40
+ useState
45
41
  } from "react";
46
42
  import ReactDOM from "react-dom";
47
43
 
@@ -122,7 +118,7 @@ function calculateTooltipPosition({
122
118
  }
123
119
 
124
120
  // src/components/tooltip/use-tooltip-relationship.ts
125
- import { useEffect as useEffect2 } from "react";
121
+ import { useEffect } from "react";
126
122
 
127
123
  // src/utils/accessibility.ts
128
124
  function mergeAriaDescribedBy(...values) {
@@ -135,7 +131,7 @@ function mergeAriaDescribedBy(...values) {
135
131
 
136
132
  // src/components/tooltip/use-tooltip-relationship.ts
137
133
  function useTooltipRelationship(targetRef, tooltipId, visible) {
138
- useEffect2(() => {
134
+ useEffect(() => {
139
135
  var _a;
140
136
  const target = targetRef == null ? void 0 : targetRef.current;
141
137
  if (!target || !visible) return;
@@ -173,8 +169,8 @@ var Tooltip = ({
173
169
  const tooltipRef = useRef(null);
174
170
  const arrowRef = useRef(null);
175
171
  const tooltipId = useId();
176
- const [coords, setCoords] = useState2({ top: 0, left: 0 });
177
- const [finalPosition, setFinalPosition] = useState2(preferredPosition);
172
+ const [coords, setCoords] = useState({ top: 0, left: 0 });
173
+ const [finalPosition, setFinalPosition] = useState(preferredPosition);
178
174
  const breakpoint = useBreakpoint();
179
175
  const isMobile = breakpoint === "mobile";
180
176
  useTooltipRelationship(targetRef, tooltipId, visible);
@@ -247,7 +243,7 @@ var Tooltip = ({
247
243
  arrow.style.right = "-6px";
248
244
  arrow.style.top = `${verticalCenter}px`;
249
245
  }, [coords, finalPosition, isMobile, targetRef, visible]);
250
- useEffect3(() => {
246
+ useEffect2(() => {
251
247
  var _a;
252
248
  if (!visible) return;
253
249
  (_a = tooltipRef.current) == null ? void 0 : _a.animate([{ opacity: 0 }, { opacity: 1 }], {
@@ -307,9 +303,10 @@ var Tooltip_default = Tooltip;
307
303
 
308
304
  export {
309
305
  breakpoints,
306
+ getBreakpoint,
310
307
  useBreakpoint,
311
308
  mergeAriaDescribedBy,
312
309
  getFloatingLayerClass,
313
310
  Tooltip_default
314
311
  };
315
- //# sourceMappingURL=chunk-ET2BGHTO.js.map
312
+ //# sourceMappingURL=chunk-FTRF27XF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useBreakpoint.tsx","../src/components/tooltip/Tooltip.tsx","../src/components/tooltip/calculate-tooltip-position.ts","../src/components/tooltip/use-tooltip-relationship.ts","../src/utils/accessibility.ts","../src/utils/floating-layer.ts"],"sourcesContent":["\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nexport const breakpoints = {\n mobile: 640,\n tablet: 1024,\n desktop: 1440,\n tv: 1920,\n};\n\nexport type Breakpoint = keyof typeof breakpoints;\n\nexport function getBreakpoint(width: number): Breakpoint {\n const entries = Object.entries(breakpoints) as [Breakpoint, number][];\n return entries.reduce<Breakpoint>(\n (previous, [name, minimumWidth]) =>\n width >= minimumWidth ? name : previous,\n \"mobile\",\n );\n}\n\nfunction subscribe(onStoreChange: () => void) {\n window.addEventListener(\"resize\", onStoreChange);\n return () => window.removeEventListener(\"resize\", onStoreChange);\n}\n\nfunction getSnapshot() {\n return getBreakpoint(window.innerWidth);\n}\n\nfunction getServerSnapshot(): Breakpoint {\n return \"mobile\";\n}\n\nexport const useBreakpoint = (): Breakpoint =>\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n","\"use client\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport {\n calculateTooltipPosition,\n type TooltipPosition,\n} from \"./calculate-tooltip-position\";\nimport { useTooltipRelationship } from \"./use-tooltip-relationship\";\nimport { getFloatingLayerClass } from \"../../utils/floating-layer\";\n\nexport type TooltipProps = {\n targetRef: React.RefObject<HTMLElement | null>;\n content: React.ReactNode;\n visible: boolean;\n preferredPosition?: \"top\" | \"bottom\" | \"left\" | \"right\";\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n targetRef,\n content,\n visible,\n preferredPosition = \"bottom\",\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const arrowRef = useRef<HTMLDivElement>(null);\n const tooltipId = useId();\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const [finalPosition, setFinalPosition] =\n useState<TooltipPosition>(preferredPosition);\n const breakpoint = useBreakpoint();\n const isMobile = breakpoint === \"mobile\";\n\n useTooltipRelationship(targetRef, tooltipId, visible);\n\n const updatePosition = useCallback(() => {\n if (!targetRef.current || !tooltipRef.current) return;\n\n const target = targetRef.current.getBoundingClientRect();\n const tooltip = tooltipRef.current.getBoundingClientRect();\n\n if (isMobile) {\n setCoords({\n top: Math.max(8, (window.innerHeight - tooltip.height) / 2),\n left: Math.max(8, (window.innerWidth - tooltip.width) / 2),\n });\n setFinalPosition(\"bottom\");\n return;\n }\n\n const nextPosition = calculateTooltipPosition({\n target,\n tooltip,\n preferred: preferredPosition,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n setCoords({ top: nextPosition.top, left: nextPosition.left });\n setFinalPosition(nextPosition.position);\n }, [isMobile, preferredPosition, targetRef]);\n\n useLayoutEffect(() => {\n if (!visible) return;\n updatePosition();\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [content, updatePosition, visible]);\n\n useLayoutEffect(() => {\n if (\n !arrowRef.current ||\n isMobile ||\n !targetRef.current ||\n !tooltipRef.current\n ) {\n return;\n }\n\n const arrow = arrowRef.current;\n const tooltip = tooltipRef.current;\n const rect = targetRef.current.getBoundingClientRect();\n const horizontalCenter = Math.min(\n Math.max(rect.left + rect.width / 2 - coords.left - 6, 8),\n Math.max(8, tooltip.offsetWidth - 20),\n );\n const verticalCenter = Math.min(\n Math.max(rect.top + rect.height / 2 - coords.top - 6, 8),\n Math.max(8, tooltip.offsetHeight - 20),\n );\n\n arrow.style.top = \"\";\n arrow.style.bottom = \"\";\n arrow.style.left = \"\";\n arrow.style.right = \"\";\n\n if (finalPosition === \"bottom\") {\n arrow.style.top = \"-6px\";\n arrow.style.left = `${horizontalCenter}px`;\n return;\n }\n\n if (finalPosition === \"top\") {\n arrow.style.bottom = \"-6px\";\n arrow.style.left = `${horizontalCenter}px`;\n return;\n }\n\n if (finalPosition === \"right\") {\n arrow.style.left = \"-6px\";\n arrow.style.top = `${verticalCenter}px`;\n return;\n }\n\n arrow.style.right = \"-6px\";\n arrow.style.top = `${verticalCenter}px`;\n }, [coords, finalPosition, isMobile, targetRef, visible]);\n\n useEffect(() => {\n if (!visible) return;\n\n tooltipRef.current?.animate([{ opacity: 0 }, { opacity: 1 }], {\n duration: 150,\n easing: \"ease-out\",\n });\n }, [visible]);\n\n if (typeof window === \"undefined\") return null;\n\n return ReactDOM.createPortal(\n visible ? (\n <div\n id={tooltipId}\n ref={tooltipRef}\n role=\"tooltip\"\n style={{ top: coords.top, left: coords.left }}\n className={`fixed ${getFloatingLayerClass(targetRef.current, \"tooltip\")} max-h-[calc(100dvh-1rem)] overflow-y-auto overscroll-contain break-words whitespace-normal rounded-sm bg-surface-tooltip px-3 py-2 text-sm text-content-inverse shadow-lg ${\n isMobile ? \"w-[90vw] max-w-[90vw]\" : \"w-max max-w-sm\"\n }`}\n >\n {content}\n\n {/* Setinha só no desktop */}\n {!isMobile && (\n <>\n {finalPosition === \"bottom\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-l-[6px] border-r-[6px] border-b-surface-tooltip border-l-transparent border-r-transparent\"\n />\n )}\n {finalPosition === \"top\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-l-[6px] border-r-[6px] border-t-[6px] border-l-transparent border-r-transparent border-t-surface-tooltip\"\n />\n )}\n {finalPosition === \"right\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-r-[6px] border-t-[6px] border-b-transparent border-r-surface-tooltip border-t-transparent\"\n />\n )}\n {finalPosition === \"left\" && (\n <div\n ref={arrowRef}\n className=\"absolute h-0 w-0 border-b-[6px] border-l-[6px] border-t-[6px] border-b-transparent border-l-surface-tooltip border-t-transparent\"\n />\n )}\n </>\n )}\n </div>\n ) : null,\n document.body,\n );\n};\n\nexport default Tooltip;\n\n\n","export type TooltipPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\ntype Rect = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n width: number;\n height: number;\n};\n\ntype Size = {\n width: number;\n height: number;\n};\n\ntype CalculateTooltipPositionParams = {\n target: Rect;\n tooltip: Size;\n preferred: TooltipPosition;\n viewportWidth: number;\n viewportHeight: number;\n gap?: number;\n margin?: number;\n};\n\ntype TooltipCoordinates = {\n top: number;\n left: number;\n position: TooltipPosition;\n};\n\nconst OPPOSITE_POSITION: Record<TooltipPosition, TooltipPosition> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\nfunction coordinatesFor(\n target: Rect,\n tooltip: Size,\n position: TooltipPosition,\n gap: number,\n) {\n if (position === \"top\") {\n return {\n top: target.top - tooltip.height - gap,\n left: target.left + target.width / 2 - tooltip.width / 2,\n };\n }\n if (position === \"bottom\") {\n return {\n top: target.bottom + gap,\n left: target.left + target.width / 2 - tooltip.width / 2,\n };\n }\n if (position === \"left\") {\n return {\n top: target.top + target.height / 2 - tooltip.height / 2,\n left: target.left - tooltip.width - gap,\n };\n }\n return {\n top: target.top + target.height / 2 - tooltip.height / 2,\n left: target.right + gap,\n };\n}\n\nfunction fitsViewport(\n coordinates: { top: number; left: number },\n tooltip: Size,\n viewportWidth: number,\n viewportHeight: number,\n margin: number,\n) {\n return (\n coordinates.top >= margin &&\n coordinates.left >= margin &&\n coordinates.top + tooltip.height <= viewportHeight - margin &&\n coordinates.left + tooltip.width <= viewportWidth - margin\n );\n}\n\nfunction clamp(value: number, minimum: number, maximum: number) {\n return Math.min(Math.max(value, minimum), Math.max(minimum, maximum));\n}\n\nexport function calculateTooltipPosition({\n target,\n tooltip,\n preferred,\n viewportWidth,\n viewportHeight,\n gap = 8,\n margin = 8,\n}: CalculateTooltipPositionParams): TooltipCoordinates {\n const positions = [\n preferred,\n OPPOSITE_POSITION[preferred],\n \"bottom\",\n \"top\",\n \"right\",\n \"left\",\n ].filter(\n (position, index, values): position is TooltipPosition =>\n values.indexOf(position) === index,\n );\n\n for (const position of positions) {\n const coordinates = coordinatesFor(target, tooltip, position, gap);\n if (\n fitsViewport(\n coordinates,\n tooltip,\n viewportWidth,\n viewportHeight,\n margin,\n )\n ) {\n return { ...coordinates, position };\n }\n }\n\n const fallback = coordinatesFor(target, tooltip, preferred, gap);\n return {\n top: clamp(fallback.top, margin, viewportHeight - tooltip.height - margin),\n left: clamp(fallback.left, margin, viewportWidth - tooltip.width - margin),\n position: preferred,\n };\n}\n\n","\"use client\";\n\nimport { useEffect, type RefObject } from \"react\";\nimport { mergeAriaDescribedBy } from \"../../utils/accessibility\";\n\nexport function useTooltipRelationship(\n targetRef: RefObject<HTMLElement | null> | undefined,\n tooltipId: string,\n visible: boolean,\n) {\n useEffect(() => {\n const target = targetRef?.current;\n if (!target || !visible) return;\n\n const previousDescription = target.getAttribute(\"aria-describedby\");\n target.setAttribute(\n \"aria-describedby\",\n mergeAriaDescribedBy(previousDescription, tooltipId) ?? tooltipId,\n );\n\n return () => {\n if (previousDescription) {\n target.setAttribute(\"aria-describedby\", previousDescription);\n } else {\n target.removeAttribute(\"aria-describedby\");\n }\n };\n }, [targetRef, tooltipId, visible]);\n}\n\n\n","export function mergeAriaDescribedBy(\n ...values: Array<string | null | undefined>\n) {\n const identifiers = values\n .flatMap((value) => value?.trim().split(/\\s+/) ?? [])\n .filter(Boolean);\n\n return identifiers.length > 0\n ? Array.from(new Set(identifiers)).join(\" \")\n : undefined;\n}\n","export type FloatingLayer = \"popover\" | \"tooltip\";\n\nexport function getFloatingLayerClass(\n trigger: HTMLElement | null | undefined,\n layer: FloatingLayer,\n) {\n if (trigger?.closest('[role=\"dialog\"][aria-modal=\"true\"]')) {\n return \"z-modal-overlay\";\n }\n\n return layer === \"popover\" ? \"z-popover\" : \"z-tooltip\";\n}\n"],"mappings":"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","names":["useEffect","useEffect"]}