@northstar-js/react 0.1.0 → 0.2.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.
Files changed (127) hide show
  1. package/dist/actions.d.ts +71 -4
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +50 -4
  4. package/dist/actions.js.map +1 -1
  5. package/dist/backdrops/StarBackdrop.d.ts +31 -0
  6. package/dist/backdrops/StarBackdrop.d.ts.map +1 -0
  7. package/dist/backdrops/StarBackdrop.js +84 -0
  8. package/dist/backdrops/StarBackdrop.js.map +1 -0
  9. package/dist/backdrops/index.d.ts +7 -0
  10. package/dist/backdrops/index.d.ts.map +1 -0
  11. package/dist/backdrops/index.js +8 -0
  12. package/dist/backdrops/index.js.map +1 -0
  13. package/dist/backdrops/math.d.ts +39 -0
  14. package/dist/backdrops/math.d.ts.map +1 -0
  15. package/dist/backdrops/math.js +44 -0
  16. package/dist/backdrops/math.js.map +1 -0
  17. package/dist/backdrops/scenes.d.ts +20 -0
  18. package/dist/backdrops/scenes.d.ts.map +1 -0
  19. package/dist/backdrops/scenes.js +417 -0
  20. package/dist/backdrops/scenes.js.map +1 -0
  21. package/dist/backdrops.css +141 -0
  22. package/dist/data.d.ts +14 -3
  23. package/dist/data.d.ts.map +1 -1
  24. package/dist/data.js +16 -7
  25. package/dist/data.js.map +1 -1
  26. package/dist/effects/actions.d.ts +48 -0
  27. package/dist/effects/actions.d.ts.map +1 -0
  28. package/dist/effects/actions.js +80 -0
  29. package/dist/effects/actions.js.map +1 -0
  30. package/dist/effects/controls.d.ts +84 -0
  31. package/dist/effects/controls.d.ts.map +1 -0
  32. package/dist/effects/controls.js +121 -0
  33. package/dist/effects/controls.js.map +1 -0
  34. package/dist/effects/display.d.ts +92 -0
  35. package/dist/effects/display.d.ts.map +1 -0
  36. package/dist/effects/display.js +138 -0
  37. package/dist/effects/display.js.map +1 -0
  38. package/dist/effects/hooks.d.ts +13 -0
  39. package/dist/effects/hooks.d.ts.map +1 -0
  40. package/dist/effects/hooks.js +68 -0
  41. package/dist/effects/hooks.js.map +1 -0
  42. package/dist/effects/index.d.ts +14 -0
  43. package/dist/effects/index.d.ts.map +1 -0
  44. package/dist/effects/index.js +12 -0
  45. package/dist/effects/index.js.map +1 -0
  46. package/dist/effects/loaders.d.ts +67 -0
  47. package/dist/effects/loaders.d.ts.map +1 -0
  48. package/dist/effects/loaders.js +73 -0
  49. package/dist/effects/loaders.js.map +1 -0
  50. package/dist/effects/math.d.ts +23 -0
  51. package/dist/effects/math.d.ts.map +1 -0
  52. package/dist/effects/math.js +56 -0
  53. package/dist/effects/math.js.map +1 -0
  54. package/dist/effects/navigation.d.ts +55 -0
  55. package/dist/effects/navigation.d.ts.map +1 -0
  56. package/dist/effects/navigation.js +103 -0
  57. package/dist/effects/navigation.js.map +1 -0
  58. package/dist/effects/overlays.d.ts +34 -0
  59. package/dist/effects/overlays.d.ts.map +1 -0
  60. package/dist/effects/overlays.js +56 -0
  61. package/dist/effects/overlays.js.map +1 -0
  62. package/dist/effects.css +1659 -0
  63. package/dist/feedback.d.ts +6 -1
  64. package/dist/feedback.d.ts.map +1 -1
  65. package/dist/feedback.js +3 -3
  66. package/dist/feedback.js.map +1 -1
  67. package/dist/flow.d.ts +70 -0
  68. package/dist/flow.d.ts.map +1 -0
  69. package/dist/flow.js +118 -0
  70. package/dist/flow.js.map +1 -0
  71. package/dist/glass.d.ts +74 -0
  72. package/dist/glass.d.ts.map +1 -0
  73. package/dist/glass.js +139 -0
  74. package/dist/glass.js.map +1 -0
  75. package/dist/index.d.ts +14 -5
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +5 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/internal/expand.d.ts +17 -0
  80. package/dist/internal/expand.d.ts.map +1 -0
  81. package/dist/internal/expand.js +23 -0
  82. package/dist/internal/expand.js.map +1 -0
  83. package/dist/internal/interaction.d.ts +21 -0
  84. package/dist/internal/interaction.d.ts.map +1 -0
  85. package/dist/internal/interaction.js +129 -0
  86. package/dist/internal/interaction.js.map +1 -0
  87. package/dist/motion.d.ts +36 -0
  88. package/dist/motion.d.ts.map +1 -0
  89. package/dist/motion.js +80 -0
  90. package/dist/motion.js.map +1 -0
  91. package/dist/navigation.d.ts +43 -6
  92. package/dist/navigation.d.ts.map +1 -1
  93. package/dist/navigation.js +86 -19
  94. package/dist/navigation.js.map +1 -1
  95. package/dist/northstar/ExportMenu.d.ts +3 -1
  96. package/dist/northstar/ExportMenu.d.ts.map +1 -1
  97. package/dist/northstar/ExportMenu.js +2 -2
  98. package/dist/northstar/ExportMenu.js.map +1 -1
  99. package/dist/northstar/ResearchBuilder.d.ts.map +1 -1
  100. package/dist/northstar/ResearchBuilder.js +3 -3
  101. package/dist/northstar/ResearchBuilder.js.map +1 -1
  102. package/dist/northstar/Run.d.ts +3 -1
  103. package/dist/northstar/Run.d.ts.map +1 -1
  104. package/dist/northstar/Run.js +4 -3
  105. package/dist/northstar/Run.js.map +1 -1
  106. package/dist/northstar/StudyShell.d.ts +23 -1
  107. package/dist/northstar/StudyShell.d.ts.map +1 -1
  108. package/dist/northstar/StudyShell.js +6 -2
  109. package/dist/northstar/StudyShell.js.map +1 -1
  110. package/dist/northstar/StudyStatus.d.ts +3 -1
  111. package/dist/northstar/StudyStatus.d.ts.map +1 -1
  112. package/dist/northstar/StudyStatus.js +4 -2
  113. package/dist/northstar/StudyStatus.js.map +1 -1
  114. package/dist/overlays.d.ts +29 -4
  115. package/dist/overlays.d.ts.map +1 -1
  116. package/dist/overlays.js +38 -12
  117. package/dist/overlays.js.map +1 -1
  118. package/dist/provider.d.ts +31 -2
  119. package/dist/provider.d.ts.map +1 -1
  120. package/dist/provider.js +20 -6
  121. package/dist/provider.js.map +1 -1
  122. package/dist/styles.css +1069 -7
  123. package/dist/surface.d.ts +58 -0
  124. package/dist/surface.d.ts.map +1 -0
  125. package/dist/surface.js +39 -0
  126. package/dist/surface.js.map +1 -0
  127. package/package.json +18 -8
@@ -0,0 +1,56 @@
1
+ // Deterministic maths for the effects layer. Nothing here calls Math.random:
2
+ // every "scatter" is seeded, so a server render, a client render and a
3
+ // screenshot all agree.
4
+ /** The golden angle in degrees: 360 × (1 − 1/φ). Vogel's sunflower spacing. */
5
+ export const GOLDEN_ANGLE = 137.50776405003785;
6
+ const GOLDEN_RAD = (GOLDEN_ANGLE * Math.PI) / 180;
7
+ /** The first primes, used for timings that should never fall into step. */
8
+ export const PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
9
+ /** First Fibonacci numbers (1, 1, 2, 3, 5, …). */
10
+ export function fibonacci(n) {
11
+ const out = [];
12
+ let a = 1;
13
+ let b = 1;
14
+ for (let i = 0; i < n; i++) {
15
+ out.push(a);
16
+ [a, b] = [b, a + b];
17
+ }
18
+ return out;
19
+ }
20
+ /** Mulberry32: a tiny seeded PRNG, uniform in [0, 1). */
21
+ export function seeded(seed) {
22
+ let t = seed >>> 0;
23
+ return () => {
24
+ t = (t + 0x6d2b79f5) >>> 0;
25
+ let r = Math.imul(t ^ (t >>> 15), 1 | t);
26
+ r = (r + Math.imul(r ^ (r >>> 7), 61 | r)) ^ r;
27
+ return ((r ^ (r >>> 14)) >>> 0) / 4294967296;
28
+ };
29
+ }
30
+ /** Vogel's spiral: point `i` of `n` on a unit disc, golden-angle spaced. */
31
+ export function vogel(i, n) {
32
+ const r = Math.sqrt((i + 0.5) / n);
33
+ const a = i * GOLDEN_RAD;
34
+ return { x: r * Math.cos(a), y: r * Math.sin(a), r, a };
35
+ }
36
+ /** Points of a Lissajous figure x = sin(a·t + δ), y = sin(b·t), as an SVG path on a box of `size`. */
37
+ export function lissajousPath(a, b, size, delta = Math.PI / 2, steps = 160) {
38
+ const h = size / 2;
39
+ let d = '';
40
+ for (let i = 0; i <= steps; i++) {
41
+ const t = (i / steps) * Math.PI * 2;
42
+ const x = h + h * Math.sin(a * t + delta);
43
+ const y = h + h * Math.sin(b * t);
44
+ d += `${i ? 'L' : 'M'}${x.toFixed(2)} ${y.toFixed(2)}`;
45
+ }
46
+ return `${d}Z`;
47
+ }
48
+ /** Round to 2 dp for stable SVG/CSS output. */
49
+ export const r2 = (n) => Math.round(n * 100) / 100;
50
+ /** The four-point north star, centred on (x, y) with outer radius `o` and waist `w`. */
51
+ export function starPath(x, y, o, w = o * 0.2) {
52
+ const p = (a, b) => `${r2(a)} ${r2(b)}`;
53
+ return `M${p(x, y - o)} L${p(x + w, y - w)} L${p(x + o, y)} L${p(x + w, y + w)} L${p(x, y + o)} L${p(x - w, y + w)} L${p(x - o, y)} L${p(x - w, y - w)}Z`;
54
+ }
55
+ export const clamp = (n, lo, hi) => Math.min(hi, Math.max(lo, n));
56
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/effects/math.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export interface MeridianTab {
2
+ value: string;
3
+ label: React.ReactNode;
4
+ content: React.ReactNode;
5
+ disabled?: boolean;
6
+ }
7
+ export interface MeridianTabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
8
+ tabs: MeridianTab[];
9
+ value?: string;
10
+ defaultValue?: string;
11
+ onValueChange?: (value: string) => void;
12
+ /** Accessible name of the tab list. */
13
+ label: string;
14
+ }
15
+ /**
16
+ * Tabs whose indicator is a star that travels to the chosen tab along a short
17
+ * arc (a meridian seen edge-on), while the rule under the tab stretches to
18
+ * fit. Arrow keys, Home and End move and select, as in the WAI-ARIA pattern.
19
+ */
20
+ export declare function MeridianTabs({ tabs, value, defaultValue, onValueChange, label, className, ...rest }: MeridianTabsProps): import("react/jsx-runtime").JSX.Element;
21
+ export interface StarPaginationProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {
22
+ count: number;
23
+ page?: number;
24
+ defaultPage?: number;
25
+ onPageChange?: (page: number) => void;
26
+ /** Accessible name. Default "Pagination". */
27
+ label?: string;
28
+ /** Dots shown at once when there are many pages. Default 7. */
29
+ window?: number;
30
+ pageLabel?: (n: number) => string;
31
+ previousLabel?: string;
32
+ nextLabel?: string;
33
+ }
34
+ /**
35
+ * Pagination as a row of stars: the current page is a four-point star, the
36
+ * others are points of light, and the dots at the edge of a long run dim and
37
+ * shrink, the way a field thins toward the horizon.
38
+ */
39
+ export declare function StarPagination({ count, page, defaultPage, onPageChange, label, window: shown, pageLabel, previousLabel, nextLabel, className, ...rest }: StarPaginationProps): import("react/jsx-runtime").JSX.Element;
40
+ export interface ConstellationCrumb {
41
+ label: React.ReactNode;
42
+ href?: string;
43
+ }
44
+ export interface ConstellationBreadcrumbProps extends React.HTMLAttributes<HTMLElement> {
45
+ items: ConstellationCrumb[];
46
+ /** Accessible name. Default "Breadcrumbs". */
47
+ label?: string;
48
+ }
49
+ /**
50
+ * Breadcrumbs as a constellation path: each level is a star joined to the
51
+ * next by a line, magnitudes brightening toward the current page. Hovering
52
+ * or focusing a crumb lights its star.
53
+ */
54
+ export declare function ConstellationBreadcrumb({ items, label, className, ...rest }: ConstellationBreadcrumbProps): import("react/jsx-runtime").JSX.Element;
55
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/effects/navigation.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;IAChH,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,iBAAiB,2CAqGtH;AAID,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IAC9F,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,WAAe,EACf,YAAY,EACZ,KAAoB,EACpB,MAAM,EAAE,KAAS,EACjB,SAA8B,EAC9B,aAA+B,EAC/B,SAAuB,EACvB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,mBAAmB,2CA8CrB;AAID,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,4BAA6B,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IACrF,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,KAAK,EAAE,KAAqB,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,4BAA4B,2CA2BzH"}
@@ -0,0 +1,103 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useId, useRef, useState } from 'react';
4
+ import { cx, useControllable, useIsoLayoutEffect } from './hooks.js';
5
+ import { clamp, starPath } from './math.js';
6
+ const STAR = starPath(6, 6, 5.5, 1.2);
7
+ /**
8
+ * Tabs whose indicator is a star that travels to the chosen tab along a short
9
+ * arc (a meridian seen edge-on), while the rule under the tab stretches to
10
+ * fit. Arrow keys, Home and End move and select, as in the WAI-ARIA pattern.
11
+ */
12
+ export function MeridianTabs({ tabs, value, defaultValue, onValueChange, label, className, ...rest }) {
13
+ const base = useId();
14
+ const [current, setCurrent] = useControllable(value, defaultValue ?? tabs[0]?.value ?? '', onValueChange);
15
+ const list = useRef(null);
16
+ const buttons = useRef(new Map());
17
+ const [box, setBox] = useState(null);
18
+ const [ready, setReady] = useState(false);
19
+ const [hops, setHops] = useState(0);
20
+ const last = useRef(current);
21
+ useEffect(() => {
22
+ if (last.current !== current)
23
+ setHops((h) => h + 1);
24
+ last.current = current;
25
+ }, [current]);
26
+ const measure = useCallback(() => {
27
+ const el = buttons.current.get(current);
28
+ if (el)
29
+ setBox({ x: el.offsetLeft, w: el.offsetWidth });
30
+ }, [current]);
31
+ useIsoLayoutEffect(() => {
32
+ measure();
33
+ }, [measure]);
34
+ useEffect(() => {
35
+ const id = requestAnimationFrame(() => setReady(true));
36
+ if (typeof ResizeObserver === 'undefined' || !list.current)
37
+ return () => cancelAnimationFrame(id);
38
+ const ro = new ResizeObserver(() => measure());
39
+ ro.observe(list.current);
40
+ return () => {
41
+ cancelAnimationFrame(id);
42
+ ro.disconnect();
43
+ };
44
+ }, [measure]);
45
+ const enabled = tabs.filter((t) => !t.disabled);
46
+ function onKeyDown(e) {
47
+ const i = enabled.findIndex((t) => t.value === current);
48
+ let next;
49
+ if (e.key === 'ArrowRight')
50
+ next = enabled[(i + 1) % enabled.length];
51
+ else if (e.key === 'ArrowLeft')
52
+ next = enabled[(i - 1 + enabled.length) % enabled.length];
53
+ else if (e.key === 'Home')
54
+ next = enabled[0];
55
+ else if (e.key === 'End')
56
+ next = enabled[enabled.length - 1];
57
+ if (!next)
58
+ return;
59
+ e.preventDefault();
60
+ setCurrent(next.value);
61
+ buttons.current.get(next.value)?.focus();
62
+ }
63
+ return (_jsxs("div", { ...rest, className: cx('ns-fx-mtabs', className), "data-ready": ready || undefined, children: [_jsxs("div", { ref: list, role: "tablist", "aria-label": label, className: "ns-fx-mtabs__list", onKeyDown: onKeyDown, children: [tabs.map((t) => {
64
+ const selected = t.value === current;
65
+ return (_jsx("button", { type: "button", role: "tab", id: `${base}-tab-${t.value}`, "aria-controls": `${base}-panel-${t.value}`, "aria-selected": selected, tabIndex: selected ? 0 : -1, disabled: t.disabled, ref: (el) => {
66
+ if (el)
67
+ buttons.current.set(t.value, el);
68
+ else
69
+ buttons.current.delete(t.value);
70
+ }, className: "ns-fx-mtabs__tab", onClick: () => setCurrent(t.value), children: t.label }, t.value));
71
+ }), box ? (_jsxs("span", { className: "ns-fx-mtabs__track", "aria-hidden": "true", style: { '--ns-fx-x': `${box.x}px`, '--ns-fx-w': box.w }, children: [_jsx("span", { className: "ns-fx-mtabs__bar" }), _jsx("span", { className: "ns-fx-mtabs__carrier", children: _jsx("span", { className: cx('ns-fx-mtabs__hop', hops > 0 && 'ns-fx-mtabs__hop--go'), children: _jsx("svg", { viewBox: "0 0 12 12", width: "10", height: "10", focusable: "false", children: _jsx("path", { d: STAR }) }) }, hops) })] })) : null] }), tabs.map((t) => (_jsx("div", { role: "tabpanel", id: `${base}-panel-${t.value}`, "aria-labelledby": `${base}-tab-${t.value}`, hidden: t.value !== current, tabIndex: 0, className: "ns-fx-mtabs__panel", children: t.value === current ? t.content : null }, t.value)))] }));
72
+ }
73
+ /**
74
+ * Pagination as a row of stars: the current page is a four-point star, the
75
+ * others are points of light, and the dots at the edge of a long run dim and
76
+ * shrink, the way a field thins toward the horizon.
77
+ */
78
+ export function StarPagination({ count, page, defaultPage = 1, onPageChange, label = 'Pagination', window: shown = 7, pageLabel = (n) => `Page ${n}`, previousLabel = 'Previous page', nextLabel = 'Next page', className, ...rest }) {
79
+ const [p, setP] = useControllable(page, defaultPage, onPageChange);
80
+ const cur = clamp(p, 1, Math.max(1, count));
81
+ const size = Math.min(count, Math.max(3, shown));
82
+ const start = clamp(cur - Math.floor(size / 2), 1, Math.max(1, count - size + 1));
83
+ const pages = Array.from({ length: size }, (_, i) => start + i);
84
+ const go = (n) => setP(clamp(n, 1, count));
85
+ const arrow = (d) => (_jsx("svg", { viewBox: "0 0 16 16", width: "14", height: "14", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: d, fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
86
+ return (_jsxs("nav", { ...rest, "aria-label": label, className: cx('ns-fx-spage', className), children: [_jsx("button", { type: "button", className: "ns-fx-spage__step", "aria-label": previousLabel, disabled: cur <= 1, onClick: () => go(cur - 1), children: arrow('M10 3.5 5.5 8 10 12.5') }), _jsx("ul", { className: "ns-fx-spage__dots", children: pages.map((n) => {
87
+ const edge = count > size && ((n === start && start > 1) || (n === start + size - 1 && n < count));
88
+ return (_jsx("li", { children: _jsxs("button", { type: "button", className: cx('ns-fx-spage__dot', edge && 'ns-fx-spage__dot--edge'), "aria-label": pageLabel(n), "aria-current": n === cur ? 'page' : undefined, onClick: () => go(n), children: [_jsx("i", { className: "ns-fx-spage__point" }), _jsx("svg", { className: "ns-fx-spage__star", viewBox: "0 0 12 12", focusable: "false", "aria-hidden": "true", children: _jsx("path", { d: STAR }) })] }) }, n));
89
+ }) }), _jsx("button", { type: "button", className: "ns-fx-spage__step", "aria-label": nextLabel, disabled: cur >= count, onClick: () => go(cur + 1), children: arrow('M6 3.5 10.5 8 6 12.5') }), _jsxs("span", { className: "ns-fx-spage__readout", "aria-hidden": "true", children: [cur, " / ", count] })] }));
90
+ }
91
+ /**
92
+ * Breadcrumbs as a constellation path: each level is a star joined to the
93
+ * next by a line, magnitudes brightening toward the current page. Hovering
94
+ * or focusing a crumb lights its star.
95
+ */
96
+ export function ConstellationBreadcrumb({ items, label = 'Breadcrumbs', className, ...rest }) {
97
+ return (_jsx("nav", { ...rest, "aria-label": label, className: cx('ns-fx-crumbs', className), children: _jsx("ol", { className: "ns-fx-crumbs__list", children: items.map((item, i) => {
98
+ const last = i === items.length - 1;
99
+ const mag = items.length > 1 ? 0.55 + (0.45 * i) / (items.length - 1) : 1;
100
+ return (_jsxs("li", { className: "ns-fx-crumbs__item", style: { '--ns-fx-mag': mag.toFixed(2), '--ns-fx-i': i }, children: [_jsx("svg", { className: "ns-fx-crumbs__star", viewBox: "0 0 12 12", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: STAR }) }), last || !item.href ? (_jsx("span", { className: "ns-fx-crumbs__current", "aria-current": last ? 'page' : undefined, children: item.label })) : (_jsx("a", { className: "ns-fx-crumbs__link", href: item.href, children: item.label }))] }, i));
101
+ }) }) }));
102
+ }
103
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/effects/navigation.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAoBtC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAqB;IACrH,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;IACrB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,EAA6B,CAAC,CAAC;IAC7D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,EAAE;YAAE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,kBAAkB,CAAC,GAAG,EAAE;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACd,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,IAAI,OAAO,cAAc,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAClG,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,oBAAoB,CAAC,EAAE,CAAC,CAAC;YACzB,EAAE,CAAC,UAAU,EAAE,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChD,SAAS,SAAS,CAAC,CAAsB;QACvC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QACxD,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY;YAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;aAChE,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW;YAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;aACrF,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;aACxC,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;YAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,CACL,kBAAS,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,gBAAc,KAAK,IAAI,SAAS,aACpF,eAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAC,SAAS,gBAAa,KAAK,EAAE,SAAS,EAAC,mBAAmB,EAAC,SAAS,EAAE,SAAS,aACjG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACd,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;wBACrC,OAAO,CACL,iBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,EACV,EAAE,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,mBACb,GAAG,IAAI,UAAU,CAAC,CAAC,KAAK,EAAE,mBAC1B,QAAQ,EACvB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3B,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;gCACV,IAAI,EAAE;oCAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;oCACpC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;4BACvC,CAAC,EACD,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,YAEjC,CAAC,CAAC,KAAK,IAfH,CAAC,CAAC,KAAK,CAgBL,CACV,CAAC;oBACJ,CAAC,CAAC,EACD,GAAG,CAAC,CAAC,CAAC,CACL,gBAAM,SAAS,EAAC,oBAAoB,iBAAa,MAAM,EAAC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,EAAyB,aACrI,eAAM,SAAS,EAAC,kBAAkB,GAAG,EACrC,eAAM,SAAS,EAAC,sBAAsB,YACpC,eAAiB,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,IAAI,GAAG,CAAC,IAAI,sBAAsB,CAAC,YACpF,cAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,SAAS,EAAC,OAAO,YAC/D,eAAM,CAAC,EAAE,IAAI,GAAI,GACb,IAHG,IAAI,CAIR,GACF,IACF,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,cAEE,IAAI,EAAC,UAAU,EACf,EAAE,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC,KAAK,EAAE,qBACb,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,EACzC,MAAM,EAAE,CAAC,CAAC,KAAK,KAAK,OAAO,EAC3B,QAAQ,EAAE,CAAC,EACX,SAAS,EAAC,oBAAoB,YAE7B,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IARlC,CAAC,CAAC,KAAK,CASR,CACP,CAAC,IACE,CACP,CAAC;AACJ,CAAC;AAkBD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,WAAW,GAAG,CAAC,EACf,YAAY,EACZ,KAAK,GAAG,YAAY,EACpB,MAAM,EAAE,KAAK,GAAG,CAAC,EACjB,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAC9B,aAAa,GAAG,eAAe,EAC/B,SAAS,GAAG,WAAW,EACvB,SAAS,EACT,GAAG,IAAI,EACa;IACpB,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAC3B,cAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,YAClF,eAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,GAC3G,CACP,CAAC;IACF,OAAO,CACL,kBAAS,IAAI,gBAAc,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,aACvE,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,mBAAmB,gBAAa,aAAa,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAC1H,KAAK,CAAC,uBAAuB,CAAC,GACxB,EACT,aAAI,SAAS,EAAC,mBAAmB,YAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;oBACnG,OAAO,CACL,uBACE,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,IAAI,IAAI,wBAAwB,CAAC,gBACvD,SAAS,CAAC,CAAC,CAAC,kBACV,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAEpB,YAAG,SAAS,EAAC,oBAAoB,GAAG,EACpC,cAAK,SAAS,EAAC,mBAAmB,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,OAAO,iBAAa,MAAM,YACzF,eAAM,CAAC,EAAE,IAAI,GAAI,GACb,IACC,IAZF,CAAC,CAaL,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,EACL,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,mBAAmB,gBAAa,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAC1H,KAAK,CAAC,sBAAsB,CAAC,GACvB,EACT,gBAAM,SAAS,EAAC,sBAAsB,iBAAa,MAAM,aACtD,GAAG,SAAK,KAAK,IACT,IACH,CACP,CAAC;AACJ,CAAC;AAeD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,EAAgC;IACxH,OAAO,CACL,iBAAS,IAAI,gBAAc,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,YACxE,aAAI,SAAS,EAAC,oBAAoB,YAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACrB,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,OAAO,CACL,cAAY,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAyB,aACxH,cAAK,SAAS,EAAC,oBAAoB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,YAC1F,eAAM,CAAC,EAAE,IAAI,GAAI,GACb,EACL,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACpB,eAAM,SAAS,EAAC,uBAAuB,kBAAe,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAC5E,IAAI,CAAC,KAAK,GACN,CACR,CAAC,CAAC,CAAC,CACF,YAAG,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAC9C,IAAI,CAAC,KAAK,GACT,CACL,KAZM,CAAC,CAaL,CACN,CAAC;YACJ,CAAC,CAAC,GACC,GACD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface TooltipCompassProps {
2
+ content: React.ReactNode;
3
+ /** The trigger: one focusable element. It receives `aria-describedby` while the tooltip shows. */
4
+ children: React.ReactElement<{
5
+ 'aria-describedby'?: string | undefined;
6
+ }>;
7
+ side?: 'top' | 'bottom';
8
+ /** Hover delay in ms before showing. Default 250. Focus shows at once. */
9
+ delay?: number;
10
+ className?: string;
11
+ }
12
+ /**
13
+ * A tooltip whose arrow is a compass needle: it swings in and settles
14
+ * pointing at its trigger, Glacier end toward the thing described. Shows on
15
+ * hover and keyboard focus, hides on leave, blur and Escape.
16
+ */
17
+ export declare function TooltipCompass({ content, children, side, delay, className }: TooltipCompassProps): import("react/jsx-runtime").JSX.Element;
18
+ export interface ToastCometProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
19
+ title: React.ReactNode;
20
+ description?: React.ReactNode;
21
+ /** Optional action, such as a Button. */
22
+ action?: React.ReactNode;
23
+ /** Visibility. When it turns false the toast leaves, then unmounts. Default true. */
24
+ open?: boolean;
25
+ onDismiss?: () => void;
26
+ dismissLabel?: string;
27
+ }
28
+ /**
29
+ * A toast that arrives like a comet: it comes in along a short arc (two
30
+ * axes on different curves) with a tail of light that thins and fades as it
31
+ * settles. Announced politely as a status. Reduced motion: it just appears.
32
+ */
33
+ export declare function ToastComet({ title, description, action, open, onDismiss, dismissLabel, className, ...rest }: ToastCometProps): import("react/jsx-runtime").JSX.Element | null;
34
+ //# sourceMappingURL=overlays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../../src/effects/overlays.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,kGAAkG;IAClG,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;QAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAY,EAAE,KAAW,EAAE,SAAS,EAAE,EAAE,mBAAmB,2CAyC9G;AAID,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAC1F,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,yCAAyC;IACzC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,qFAAqF;IACrF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAW,EAAE,SAAS,EAAE,YAAwB,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,kDAuC/I"}
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cloneElement, useEffect, useId, useRef, useState } from 'react';
4
+ import { cx, reducedMotionNow, useTimers } from './hooks.js';
5
+ /**
6
+ * A tooltip whose arrow is a compass needle: it swings in and settles
7
+ * pointing at its trigger, Glacier end toward the thing described. Shows on
8
+ * hover and keyboard focus, hides on leave, blur and Escape.
9
+ */
10
+ export function TooltipCompass({ content, children, side = 'top', delay = 250, className }) {
11
+ const id = useId();
12
+ const [open, setOpen] = useState(false);
13
+ const timer = useRef(undefined);
14
+ useEffect(() => () => clearTimeout(timer.current), []);
15
+ const show = (ms) => {
16
+ clearTimeout(timer.current);
17
+ timer.current = setTimeout(() => setOpen(true), ms);
18
+ };
19
+ const hide = () => {
20
+ clearTimeout(timer.current);
21
+ setOpen(false);
22
+ };
23
+ const described = [children.props['aria-describedby'], open ? id : null].filter(Boolean).join(' ') || undefined;
24
+ return (_jsxs("span", { className: cx('ns-fx-tipc', className), "data-side": side, onPointerEnter: (e) => e.pointerType !== 'touch' && show(delay), onPointerLeave: hide, onFocus: () => show(0), onBlur: hide, onKeyDown: (e) => {
25
+ if (e.key === 'Escape' && open) {
26
+ e.stopPropagation();
27
+ hide();
28
+ }
29
+ }, children: [cloneElement(children, { 'aria-describedby': described }), open ? (_jsxs("span", { role: "tooltip", id: id, className: "ns-fx-tipc__bubble", children: [content, _jsxs("svg", { className: "ns-fx-tipc__needle", viewBox: "0 0 10 16", "aria-hidden": "true", focusable: "false", children: [_jsx("path", { className: "ns-fx-tipc__tail", d: "M5 0 7.2 8H2.8Z" }), _jsx("path", { className: "ns-fx-tipc__head", d: "M5 16 2.8 8H7.2Z" })] })] })) : null] }));
30
+ }
31
+ /**
32
+ * A toast that arrives like a comet: it comes in along a short arc (two
33
+ * axes on different curves) with a tail of light that thins and fades as it
34
+ * settles. Announced politely as a status. Reduced motion: it just appears.
35
+ */
36
+ export function ToastComet({ title, description, action, open = true, onDismiss, dismissLabel = 'Dismiss', className, ...rest }) {
37
+ const [present, setPresent] = useState(open);
38
+ const [leaving, setLeaving] = useState(false);
39
+ const after = useTimers();
40
+ useEffect(() => {
41
+ if (open) {
42
+ setPresent(true);
43
+ setLeaving(false);
44
+ }
45
+ else if (present) {
46
+ if (reducedMotionNow())
47
+ return setPresent(false);
48
+ setLeaving(true);
49
+ after(() => setPresent(false), 220);
50
+ }
51
+ }, [open]);
52
+ if (!present)
53
+ return null;
54
+ return (_jsx("div", { ...rest, role: "status", className: cx('ns-fx-comet', className), "data-leaving": leaving || undefined, children: _jsx("div", { className: "ns-fx-comet__x", children: _jsxs("div", { className: "ns-fx-comet__y", children: [_jsx("span", { className: "ns-fx-comet__tail", "aria-hidden": "true" }), _jsxs("div", { className: "ns-fx-comet__card", children: [_jsx("span", { className: "ns-fx-comet__head", "aria-hidden": "true" }), _jsxs("div", { className: "ns-fx-comet__text", children: [_jsx("div", { className: "ns-fx-comet__title", children: title }), description ? _jsx("div", { className: "ns-fx-comet__desc", children: description }) : null] }), action ? _jsx("div", { className: "ns-fx-comet__action", children: action }) : null, onDismiss ? (_jsx("button", { type: "button", className: "ns-fx-comet__close", "aria-label": dismissLabel, onClick: onDismiss, children: _jsx("svg", { viewBox: "0 0 12 12", width: "10", height: "10", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M3 3 9 9M9 3 3 9", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" }) }) })) : null] })] }) }) }));
55
+ }
56
+ //# sourceMappingURL=overlays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.js","sourceRoot":"","sources":["../../src/effects/overlays.tsx"],"names":[],"mappings":"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"}