@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.
- package/dist/actions.d.ts +71 -4
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +50 -4
- package/dist/actions.js.map +1 -1
- package/dist/backdrops/StarBackdrop.d.ts +31 -0
- package/dist/backdrops/StarBackdrop.d.ts.map +1 -0
- package/dist/backdrops/StarBackdrop.js +84 -0
- package/dist/backdrops/StarBackdrop.js.map +1 -0
- package/dist/backdrops/index.d.ts +7 -0
- package/dist/backdrops/index.d.ts.map +1 -0
- package/dist/backdrops/index.js +8 -0
- package/dist/backdrops/index.js.map +1 -0
- package/dist/backdrops/math.d.ts +39 -0
- package/dist/backdrops/math.d.ts.map +1 -0
- package/dist/backdrops/math.js +44 -0
- package/dist/backdrops/math.js.map +1 -0
- package/dist/backdrops/scenes.d.ts +20 -0
- package/dist/backdrops/scenes.d.ts.map +1 -0
- package/dist/backdrops/scenes.js +417 -0
- package/dist/backdrops/scenes.js.map +1 -0
- package/dist/backdrops.css +141 -0
- package/dist/data.d.ts +14 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +16 -7
- package/dist/data.js.map +1 -1
- package/dist/effects/actions.d.ts +48 -0
- package/dist/effects/actions.d.ts.map +1 -0
- package/dist/effects/actions.js +80 -0
- package/dist/effects/actions.js.map +1 -0
- package/dist/effects/controls.d.ts +84 -0
- package/dist/effects/controls.d.ts.map +1 -0
- package/dist/effects/controls.js +121 -0
- package/dist/effects/controls.js.map +1 -0
- package/dist/effects/display.d.ts +92 -0
- package/dist/effects/display.d.ts.map +1 -0
- package/dist/effects/display.js +138 -0
- package/dist/effects/display.js.map +1 -0
- package/dist/effects/hooks.d.ts +13 -0
- package/dist/effects/hooks.d.ts.map +1 -0
- package/dist/effects/hooks.js +68 -0
- package/dist/effects/hooks.js.map +1 -0
- package/dist/effects/index.d.ts +14 -0
- package/dist/effects/index.d.ts.map +1 -0
- package/dist/effects/index.js +12 -0
- package/dist/effects/index.js.map +1 -0
- package/dist/effects/loaders.d.ts +67 -0
- package/dist/effects/loaders.d.ts.map +1 -0
- package/dist/effects/loaders.js +73 -0
- package/dist/effects/loaders.js.map +1 -0
- package/dist/effects/math.d.ts +23 -0
- package/dist/effects/math.d.ts.map +1 -0
- package/dist/effects/math.js +56 -0
- package/dist/effects/math.js.map +1 -0
- package/dist/effects/navigation.d.ts +55 -0
- package/dist/effects/navigation.d.ts.map +1 -0
- package/dist/effects/navigation.js +103 -0
- package/dist/effects/navigation.js.map +1 -0
- package/dist/effects/overlays.d.ts +34 -0
- package/dist/effects/overlays.d.ts.map +1 -0
- package/dist/effects/overlays.js +56 -0
- package/dist/effects/overlays.js.map +1 -0
- package/dist/effects.css +1659 -0
- package/dist/feedback.d.ts +6 -1
- package/dist/feedback.d.ts.map +1 -1
- package/dist/feedback.js +3 -3
- package/dist/feedback.js.map +1 -1
- package/dist/flow.d.ts +70 -0
- package/dist/flow.d.ts.map +1 -0
- package/dist/flow.js +118 -0
- package/dist/flow.js.map +1 -0
- package/dist/glass.d.ts +74 -0
- package/dist/glass.d.ts.map +1 -0
- package/dist/glass.js +139 -0
- package/dist/glass.js.map +1 -0
- package/dist/index.d.ts +14 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/expand.d.ts +17 -0
- package/dist/internal/expand.d.ts.map +1 -0
- package/dist/internal/expand.js +23 -0
- package/dist/internal/expand.js.map +1 -0
- package/dist/internal/interaction.d.ts +21 -0
- package/dist/internal/interaction.d.ts.map +1 -0
- package/dist/internal/interaction.js +129 -0
- package/dist/internal/interaction.js.map +1 -0
- package/dist/motion.d.ts +36 -0
- package/dist/motion.d.ts.map +1 -0
- package/dist/motion.js +80 -0
- package/dist/motion.js.map +1 -0
- package/dist/navigation.d.ts +43 -6
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +86 -19
- package/dist/navigation.js.map +1 -1
- package/dist/northstar/ExportMenu.d.ts +3 -1
- package/dist/northstar/ExportMenu.d.ts.map +1 -1
- package/dist/northstar/ExportMenu.js +2 -2
- package/dist/northstar/ExportMenu.js.map +1 -1
- package/dist/northstar/ResearchBuilder.d.ts.map +1 -1
- package/dist/northstar/ResearchBuilder.js +3 -3
- package/dist/northstar/ResearchBuilder.js.map +1 -1
- package/dist/northstar/Run.d.ts +3 -1
- package/dist/northstar/Run.d.ts.map +1 -1
- package/dist/northstar/Run.js +4 -3
- package/dist/northstar/Run.js.map +1 -1
- package/dist/northstar/StudyShell.d.ts +23 -1
- package/dist/northstar/StudyShell.d.ts.map +1 -1
- package/dist/northstar/StudyShell.js +6 -2
- package/dist/northstar/StudyShell.js.map +1 -1
- package/dist/northstar/StudyStatus.d.ts +3 -1
- package/dist/northstar/StudyStatus.d.ts.map +1 -1
- package/dist/northstar/StudyStatus.js +4 -2
- package/dist/northstar/StudyStatus.js.map +1 -1
- package/dist/overlays.d.ts +29 -4
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +38 -12
- package/dist/overlays.js.map +1 -1
- package/dist/provider.d.ts +31 -2
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +20 -6
- package/dist/provider.js.map +1 -1
- package/dist/styles.css +1069 -7
- package/dist/surface.d.ts +58 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +39 -0
- package/dist/surface.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|