@hexdspace/react 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +54 -6
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1553,7 +1553,7 @@ var dialogPanelVariants = cva2(
1553
1553
  "w-[min(92vw,var(--dialog-width))]",
1554
1554
  "pointer-events-auto",
1555
1555
  "data-[state=open]:animate-[dialog-fade-in_var(--motion-med)_cubic-bezier(0.16,1,0.3,1)]",
1556
- "data-[state=closed]:animate-[dialog-fade-out_var(--motion-fast)_cubic-bezier(0.4,0,1,1)]",
1556
+ "data-[state=closed]:animate-[dialog-fade-out_var(--motion-med)_cubic-bezier(0.4,0,1,1)]",
1557
1557
  "motion-reduce:animate-none",
1558
1558
  "data-[state=closed]:pointer-events-none"
1559
1559
  )
@@ -1561,7 +1561,7 @@ var dialogPanelVariants = cva2(
1561
1561
  var dialogOverlayClass = cn(
1562
1562
  "fixed inset-0 bg-[color:var(--overlay)]",
1563
1563
  "data-[state=open]:animate-[dialog-overlay-in_var(--motion-med)_cubic-bezier(0.16,1,0.3,1)]",
1564
- "data-[state=closed]:animate-[dialog-overlay-out_var(--motion-fast)_cubic-bezier(0.4,0,1,1)]",
1564
+ "data-[state=closed]:animate-[dialog-overlay-out_var(--motion-med)_cubic-bezier(0.4,0,1,1)]",
1565
1565
  "motion-reduce:animate-none",
1566
1566
  "data-[state=closed]:pointer-events-none"
1567
1567
  );
@@ -1662,7 +1662,7 @@ function Dialog({
1662
1662
  "DialogContent",
1663
1663
  dialogPanelVariants(),
1664
1664
  "data-[state=open]:[&_.dialog-surface]:animate-[dialog-surface-in_var(--motion-med)_cubic-bezier(0.16,1,0.3,1)]",
1665
- "data-[state=closed]:[&_.dialog-surface]:animate-[dialog-surface-out_var(--motion-fast)_cubic-bezier(0.4,0,1,1)]",
1665
+ "data-[state=closed]:[&_.dialog-surface]:animate-[dialog-surface-out_var(--motion-med)_cubic-bezier(0.4,0,1,1)]",
1666
1666
  "motion-reduce:[&_.dialog-surface]:animate-none",
1667
1667
  className
1668
1668
  ),
@@ -1905,13 +1905,52 @@ var dialogController = new DialogController(registry, open, resolve, dismiss, cl
1905
1905
  import { Fragment as Fragment2, jsx as jsx11 } from "react/jsx-runtime";
1906
1906
  var DialogHost = () => {
1907
1907
  const [state, setState] = React3.useState(dialogController.handleGetRegistry().getState());
1908
+ const [closingIds, setClosingIds] = React3.useState(() => /* @__PURE__ */ new Set());
1909
+ const closeTimers = React3.useRef(/* @__PURE__ */ new Map());
1910
+ const [closeDelayMs, setCloseDelayMs] = React3.useState(160);
1908
1911
  React3.useEffect(() => dialogController.handleGetRegistry().subscribe(setState), []);
1912
+ React3.useEffect(() => {
1913
+ if (typeof window === "undefined") return;
1914
+ const raw = getComputedStyle(document.documentElement).getPropertyValue("--motion-fast").trim();
1915
+ const parsed = parseDurationMs(raw);
1916
+ if (parsed) setCloseDelayMs(parsed);
1917
+ }, []);
1918
+ React3.useEffect(() => {
1919
+ return () => {
1920
+ for (const timer of closeTimers.current.values()) {
1921
+ window.clearTimeout(timer);
1922
+ }
1923
+ closeTimers.current.clear();
1924
+ };
1925
+ }, []);
1926
+ const scheduleClose = React3.useCallback(
1927
+ (id, action, result) => {
1928
+ if (closingIds.has(id)) return;
1929
+ setClosingIds((prev) => new Set(prev).add(id));
1930
+ const timer = window.setTimeout(() => {
1931
+ if (action === "resolve") {
1932
+ dialogController.handleResolve(id, result);
1933
+ } else {
1934
+ dialogController.handleDismiss(id);
1935
+ }
1936
+ setClosingIds((prev) => {
1937
+ const next = new Set(prev);
1938
+ next.delete(id);
1939
+ return next;
1940
+ });
1941
+ closeTimers.current.delete(id);
1942
+ }, closeDelayMs);
1943
+ closeTimers.current.set(id, timer);
1944
+ },
1945
+ [closeDelayMs, closingIds]
1946
+ );
1909
1947
  return /* @__PURE__ */ jsx11(Fragment2, { children: state.stack.map((dialog, index) => {
1910
1948
  const template = getDialogTemplate(dialog.templateKey);
1911
1949
  if (!template) {
1912
1950
  console.error(`Missing dialog template: ${dialog.templateKey}`);
1913
1951
  return null;
1914
1952
  }
1953
+ const isClosing = closingIds.has(dialog.id);
1915
1954
  return /* @__PURE__ */ jsx11(
1916
1955
  Dialog,
1917
1956
  {
@@ -1921,14 +1960,23 @@ var DialogHost = () => {
1921
1960
  modal: dialog.options.modal,
1922
1961
  dismissible: dialog.options.dismissible,
1923
1962
  zIndex: dialog.options.zIndex + index,
1924
- defaultOpen: true,
1925
- onResolve: (result) => dialogController.handleResolve(dialog.id, result),
1926
- onDismiss: () => dialogController.handleDismiss(dialog.id)
1963
+ open: !isClosing,
1964
+ onResolve: (result) => scheduleClose(dialog.id, "resolve", result),
1965
+ onDismiss: () => scheduleClose(dialog.id, "dismiss")
1927
1966
  },
1928
1967
  dialog.id
1929
1968
  );
1930
1969
  }) });
1931
1970
  };
1971
+ function parseDurationMs(value) {
1972
+ if (!value) return null;
1973
+ const trimmed = value.trim();
1974
+ const asNumber = Number(trimmed.replace(/ms|s/g, ""));
1975
+ if (Number.isNaN(asNumber)) return null;
1976
+ if (trimmed.endsWith("ms")) return asNumber;
1977
+ if (trimmed.endsWith("s")) return asNumber * 1e3;
1978
+ return asNumber;
1979
+ }
1932
1980
 
1933
1981
  // src/feature/dialog/infra/web/react/useDialog.tsx
1934
1982
  import { useMemo as useMemo3 } from "react";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hexdspace/react",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",