nimbus-docs 0.1.6 → 0.1.8

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.
@@ -0,0 +1,350 @@
1
+ import * as react from "react";
2
+ import { ReactNode, RefObject } from "react";
3
+ import { ClassValue } from "clsx";
4
+
5
+ //#region src/react/diagram.d.ts
6
+ type Depth = "intuition" | "working" | "mechanism";
7
+ type ReducedMotionMode = "respect" | "ignore";
8
+ type DiagramPhase = "idle" | "ready" | "playing" | "paused";
9
+ interface DiagramContextValue {
10
+ /** Stable per-instance id from useId. */
11
+ id: string;
12
+ /** Derived lifecycle state. */
13
+ phase: DiagramPhase;
14
+ /** True when the diagram should be advancing animation. */
15
+ playing: boolean;
16
+ /** Element intersects the viewport (direct IntersectionObserver). */
17
+ visible: boolean;
18
+ /** Browser tab is visible (Page Visibility API). */
19
+ tabVisible: boolean;
20
+ /** Reduced-motion is in effect (OS + reducedMotion="respect" mode). */
21
+ reducedMotion: boolean;
22
+ /** Reader's depth setting. Stub until the depth dial ships. */
23
+ depth: Depth;
24
+ /** Theme tokens. Stub until row 4 wires real values. */
25
+ theme: {
26
+ id: string;
27
+ };
28
+ /** Trigger a reset — bumps the subtree key; children's useState resets. */
29
+ reset: () => void;
30
+ /** Toggle play/pause from user action. */
31
+ toggle: () => void;
32
+ }
33
+ declare function useDiagram(): DiagramContextValue | null;
34
+ /**
35
+ * Returns the wrapper context, or a default + one-time dev warning when
36
+ * called outside a `<Diagram>`. Used by every hook in nimbus-docs/react
37
+ * so authors can prototype without forgetting the wrapper.
38
+ */
39
+ declare function useDiagramOrDefault(hookName: string): DiagramContextValue;
40
+ interface DiagramProps {
41
+ children: ReactNode;
42
+ fallback?: string;
43
+ pauseWhenOffscreen?: boolean;
44
+ reducedMotion?: ReducedMotionMode;
45
+ /** Forwarded; Astro's client:* directive dictates the actual hydration timing. */
46
+ hydration?: "visible" | "idle" | "load";
47
+ /** Wrap children in an error boundary that exposes a Reset button on render failure. Default: true. */
48
+ errorBoundary?: boolean;
49
+ /** Listen for space (toggle) / r (reset) keypresses bubbling from inside the region. Skipped when target is an interactive element. Default: true. */
50
+ keyboard?: boolean;
51
+ /** ARIA region label. */
52
+ label?: string;
53
+ className?: string;
54
+ }
55
+ declare function DiagramRoot(props: DiagramProps): react.JSX.Element;
56
+ declare const Diagram: typeof DiagramRoot;
57
+ //#endregion
58
+ //#region src/react/registry.d.ts
59
+ /**
60
+ * Page-scoped Diagram registry.
61
+ *
62
+ * Module-level singleton — shared across Astro islands because Vite
63
+ * de-duplicates module imports per page (both in dev HMR and in prod
64
+ * via shared chunks). React Context cannot bridge separate islands;
65
+ * a plain singleton can.
66
+ *
67
+ * Subscribed via useSyncExternalStore from <DiagramPauseAll>.
68
+ */
69
+ interface RegistryEntry {
70
+ id: string;
71
+ /** Set the user-paused flag directly (idempotent). */
72
+ setPaused: (paused: boolean) => void;
73
+ /** Read the current user-paused flag at call time. */
74
+ userPaused: () => boolean;
75
+ }
76
+ declare class DiagramRegistry {
77
+ private entries;
78
+ private listeners;
79
+ /** Bumped on every membership change — useSyncExternalStore snapshot key. */
80
+ private version;
81
+ register(entry: RegistryEntry): () => void;
82
+ /**
83
+ * Pause everything when at least one diagram is unpaused; resume
84
+ * everything otherwise. A naive per-entry toggle would *invert* mixed
85
+ * states — resuming the diagrams a reader had deliberately paused.
86
+ */
87
+ toggleAll(): void;
88
+ count: () => number;
89
+ getVersion: () => number;
90
+ subscribe: (listener: () => void) => (() => void);
91
+ private notify;
92
+ }
93
+ declare const diagramRegistry: DiagramRegistry;
94
+ //#endregion
95
+ //#region src/react/hooks/use-phase.d.ts
96
+ interface UsePhaseStepBase {
97
+ /** Stable step id; appears as `current`. */
98
+ id: string;
99
+ /** Milliseconds to hold this step before advancing. */
100
+ hold: number;
101
+ }
102
+ interface UsePhaseStep<C extends Record<string, unknown> = Record<string, never>, D = unknown> extends UsePhaseStepBase {
103
+ /**
104
+ * Predicate gate. When false, this step is skipped for the current cycle.
105
+ * Receives `{ cycle, current, ...context }` where `current` is the id of
106
+ * the previous step that survived the predicate pass (empty string at
107
+ * cycle start).
108
+ */
109
+ when?: (ctx: {
110
+ cycle: number;
111
+ current: string;
112
+ } & C) => boolean;
113
+ /**
114
+ * Arbitrary payload surfaced as `data` while this step holds — e.g.
115
+ * which node/edge lights up. Replaces per-card `ACTIVE_MAP` lookup
116
+ * tables; `data` is `null` when idle or when an autoplaying walker is
117
+ * frozen by reduced motion.
118
+ */
119
+ data?: D;
120
+ }
121
+ interface UsePhaseOptions<C extends Record<string, unknown> = Record<string, never>, D = unknown> {
122
+ steps: UsePhaseStep<C, D>[];
123
+ /** Values made available to each step's `when` predicate. */
124
+ context?: C;
125
+ /** When true (default), the sequence restarts after the last step. */
126
+ loop?: boolean;
127
+ /**
128
+ * When true (default) the walker runs as soon as the diagram plays.
129
+ * When false it starts idle (`current === ""`) and runs once per
130
+ * `start()` call — the shape for click-triggered one-shot sequences.
131
+ */
132
+ autoplay?: boolean;
133
+ }
134
+ interface UsePhaseReturn<D = unknown> {
135
+ /** Id of the currently-active step. Empty string when idle or `steps` is empty. */
136
+ current: string;
137
+ /** Index into the *filtered* sequence for the current cycle. */
138
+ index: number;
139
+ /** Completed passes through the sequence. Starts at 0. */
140
+ cycle: number;
141
+ /** The active step's `data` payload. `null` when idle or motion-frozen. */
142
+ data: D | null;
143
+ /** True while the walker is active. Always true when `autoplay`. */
144
+ running: boolean;
145
+ /** Begin a run from the first step. No-op while already running. */
146
+ start: () => void;
147
+ /** Advance one step (or wrap to next cycle if at the end). */
148
+ advance: () => void;
149
+ /** Jump to a named step in the current cycle's sequence. Wakes an idle walker. */
150
+ goto: (id: string) => void;
151
+ /** Reset cycle and index to 0 (and return to idle when `autoplay: false`). */
152
+ reset: () => void;
153
+ }
154
+ /**
155
+ * Predicate-gated phase walker. Reads `playing` / `visible` / `tabVisible`
156
+ * / `reducedMotion` from the surrounding `<Diagram>` and pauses
157
+ * automatically when any gate fails.
158
+ *
159
+ * Steps may carry a `when(ctx)` predicate that filters them out for a
160
+ * given cycle, and a `data` payload surfaced while the step holds. Mode
161
+ * toggles, branches, alternating loops — anything cycle-dependent —
162
+ * composes via the predicate plus user-supplied `context`.
163
+ *
164
+ * Two run modes:
165
+ * - `autoplay: true` (default) — ambient looping animation. Freezes under
166
+ * reduced motion (`data` reads `null`).
167
+ * - `autoplay: false` — idle until `start()`. Started runs are
168
+ * user-initiated *function*, not decoration: they keep advancing under
169
+ * reduced motion (gate your CSS transition durations card-side), and a
170
+ * `start()` while the page is paused arms as soon as play resumes.
171
+ *
172
+ * The scheduler depends on the current step's *values* (id, hold), not
173
+ * on `steps` / `context` identity — inline literals are safe and won't
174
+ * re-arm the hold timer under frequent re-renders.
175
+ */
176
+ declare function usePhase<C extends Record<string, unknown> = Record<string, never>, D = unknown>({
177
+ steps,
178
+ context,
179
+ loop,
180
+ autoplay
181
+ }: UsePhaseOptions<C, D>): UsePhaseReturn<D>;
182
+ //#endregion
183
+ //#region src/react/hooks/use-measure.d.ts
184
+ interface UseMeasureOptions {
185
+ /**
186
+ * Additional dependencies that should re-trigger measurement when they
187
+ * change. Use when component state changes the layout in a way the
188
+ * container's ResizeObserver might miss — e.g. an animated CSS `gap`
189
+ * that grows the container only as the transition progresses, or a
190
+ * state-driven layout swap that doesn't change the container's size.
191
+ */
192
+ deps?: unknown[];
193
+ }
194
+ /**
195
+ * DOM rect + optional selector callback. The selector receives the
196
+ * observed element and its rect, and returns whatever derived geometry
197
+ * the author needs (NodeRect, EdgeData, etc.).
198
+ *
199
+ * For multi-element measurements (e.g. measuring a container plus 5
200
+ * child nodes), pass the container ref and read the other refs from
201
+ * closure inside the selector. The selector recomputes when the
202
+ * container resizes — which it typically does when children grow
203
+ * because the container's intrinsic size is content-derived. For
204
+ * state-driven re-layouts that the ResizeObserver might miss, pass
205
+ * `options.deps`.
206
+ */
207
+ declare function useMeasure<T extends HTMLElement | SVGElement, R = DOMRectReadOnly>(ref: RefObject<T | null>, selector?: (el: T, rect: DOMRectReadOnly) => R, options?: UseMeasureOptions): {
208
+ rect: DOMRectReadOnly | null;
209
+ selected: R | null;
210
+ };
211
+ //#endregion
212
+ //#region src/react/hooks/use-tab-indicator.d.ts
213
+ interface UseTabIndicatorReturn {
214
+ /** Inline rect of the active tab, relative to the container. Null until first measure. */
215
+ style: {
216
+ top: number;
217
+ left: number;
218
+ width: number;
219
+ height: number;
220
+ } | null;
221
+ }
222
+ /**
223
+ * Headless sliding-indicator measurement for a tab group.
224
+ *
225
+ * Pure state + lifecycle — no DOM produced, no styling assumed. The
226
+ * consumer renders the indicator however it wants, applying `style`
227
+ * positionally.
228
+ *
229
+ * Re-measures on `activeId` change and on container resize. Returns
230
+ * `null` style when `activeId` is null or its tab ref isn't mounted —
231
+ * consumer renders nothing in that case, which also prevents a
232
+ * "mount-from-zero" transition the first time the indicator appears.
233
+ */
234
+ declare function useTabIndicator(containerRef: RefObject<HTMLElement | null>, getTab: (id: string) => HTMLElement | null, activeId: string | null): UseTabIndicatorReturn;
235
+ //#endregion
236
+ //#region src/react/hooks/use-ref-setters.d.ts
237
+ /**
238
+ * Stable per-id ref callbacks for a refs map — the ergonomic half of the
239
+ * "refs map + setter factory" pattern. Instead of N individual `useRef`s
240
+ * and N inline `ref={(el) => …}` arrows (which churn refs every render),
241
+ * keep one map and hand each element a cached callback:
242
+ *
243
+ * ```tsx
244
+ * const nodeRefs = useRef<Partial<Record<NodeId, HTMLDivElement | null>>>({});
245
+ * const setNode = useRefSetters(nodeRefs);
246
+ *
247
+ * <div ref={setNode("prompt")}>Prompt</div>
248
+ * <div ref={setNode("model")}>Model</div>
249
+ * ```
250
+ *
251
+ * Measurement stays caller-side (read `refs.current` inside a `useMeasure`
252
+ * selector) — this hook owns only the ref plumbing.
253
+ */
254
+ declare function useRefSetters<K extends string, E extends Element = HTMLDivElement>(refs: RefObject<Partial<Record<K, E | null>>>): (id: K) => (el: E | null) => void;
255
+ //#endregion
256
+ //#region src/react/hooks/use-media-query.d.ts
257
+ /**
258
+ * Reactive `window.matchMedia` subscription, SSR-safe.
259
+ *
260
+ * The server snapshot returns `defaultValue` (default `false`), so static
261
+ * builds render the no-match branch and hydrate without mismatch warnings;
262
+ * the first client render corrects it if the query matches.
263
+ *
264
+ * ```ts
265
+ * const isMobile = useMediaQuery("(max-width: 640px)");
266
+ * ```
267
+ */
268
+ declare function useMediaQuery(query: string, defaultValue?: boolean): boolean;
269
+ //#endregion
270
+ //#region src/react/geometry.d.ts
271
+ /**
272
+ * Pure edge-routing math for diagram cards. No React, no DOM — every
273
+ * function maps numbers to numbers (or an SVG path string). Colors,
274
+ * stroke widths, markers, and node outlines stay user-side.
275
+ */
276
+ interface Point {
277
+ x: number;
278
+ y: number;
279
+ }
280
+ type RectSide = "top" | "right" | "bottom" | "left";
281
+ /**
282
+ * Minimal rect shape consumed by `edgePoint`: left/top origin plus size,
283
+ * relative to whatever container the SVG layer is positioned against.
284
+ * Richer rect types (with `r`/`b`/`cx`/`cy`) are structurally compatible.
285
+ */
286
+ interface EdgeRect {
287
+ l: number;
288
+ t: number;
289
+ w: number;
290
+ h: number;
291
+ }
292
+ /** Anchor point on a rect edge. `frac` runs 0→1 from top/left. */
293
+ declare function edgePoint(rect: EdgeRect, side: RectSide, frac?: number): Point;
294
+ /**
295
+ * - `straight` — direct line; axis-aligned lines are shortened by
296
+ * `arrowOffset` at the destination so an arrowhead marker doesn't
297
+ * overlap the target.
298
+ * - `elbow` — one right-angle corner with a quadratic rounding,
299
+ * radius clamped to half of each segment; end shortened by
300
+ * `arrowOffset`.
301
+ * - `vSplit` — vertical S-path through the midpoint Y (drop, run,
302
+ * drop), corners rounded; no arrow offset (designed for marker-less
303
+ * connectors).
304
+ * - `auto` — `straight` when endpoints are axis-aligned within 2px,
305
+ * else `elbow`.
306
+ */
307
+ type EdgeRoute = "straight" | "elbow" | "vSplit" | "auto";
308
+ interface RouteOptions {
309
+ /** End-shortening so arrowheads sit flush. Default 6. */
310
+ arrowOffset?: number;
311
+ /** Corner radius. Defaults: elbow 10, vSplit 6. */
312
+ radius?: number;
313
+ }
314
+ /** Build an SVG path string between two points using the given route. */
315
+ declare function routeEdge(from: Point, to: Point, route?: EdgeRoute, options?: RouteOptions): string;
316
+ /** Anchor: `[nodeId, side]` with an optional frac (default 0.5). */
317
+ type EdgeAnchor<NodeId extends string = string> = readonly [NodeId, RectSide] | readonly [NodeId, RectSide, number];
318
+ interface EdgeSpec<NodeId extends string = string, EdgeId extends string = string> {
319
+ id: EdgeId;
320
+ from: EdgeAnchor<NodeId>;
321
+ to: EdgeAnchor<NodeId>;
322
+ route?: EdgeRoute;
323
+ /** Carried through to the resolved edge for styling decisions. */
324
+ ghost?: boolean;
325
+ }
326
+ interface ResolvedEdge<EdgeId extends string = string> {
327
+ id: EdgeId;
328
+ from: Point;
329
+ to: Point;
330
+ /** Ready-to-render SVG path string. */
331
+ d: string;
332
+ ghost?: boolean;
333
+ }
334
+ /**
335
+ * Resolve declarative edge specs against a map of measured rects.
336
+ * Specs whose endpoints aren't in `rects` yet (unmounted nodes,
337
+ * first-paint gaps) are skipped rather than rendered degenerate.
338
+ */
339
+ declare function resolveEdges<NodeId extends string = string, EdgeId extends string = string>(specs: readonly EdgeSpec<NodeId, EdgeId>[], rects: Partial<Record<NodeId, EdgeRect>>, options?: RouteOptions): ResolvedEdge<EdgeId>[];
340
+ //#endregion
341
+ //#region src/react/cn.d.ts
342
+ /**
343
+ * Compose class names with Tailwind conflict resolution. Vendored into
344
+ * lab/diagram so the framework-surface files don't depend on apps/www's
345
+ * `@/lib/cn` alias — keeps the lift to `nimbus-docs/react` verbatim.
346
+ */
347
+ declare function cn(...inputs: ClassValue[]): string;
348
+ //#endregion
349
+ export { type Depth, Diagram, type DiagramContextValue, type DiagramPhase, type DiagramProps, type EdgeAnchor, type EdgeRect, type EdgeRoute, type EdgeSpec, type Point, type RectSide, type ReducedMotionMode, type ResolvedEdge, type RouteOptions, type UseMeasureOptions, type UsePhaseOptions, type UsePhaseReturn, type UsePhaseStep, type UseTabIndicatorReturn, cn, diagramRegistry, edgePoint, resolveEdges, routeEdge, useDiagram, useDiagramOrDefault, useMeasure, useMediaQuery, usePhase, useRefSetters, useTabIndicator };
350
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","names":[],"sources":["../src/react/diagram.tsx","../src/react/registry.ts","../src/react/hooks/use-phase.ts","../src/react/hooks/use-measure.ts","../src/react/hooks/use-tab-indicator.ts","../src/react/hooks/use-ref-setters.ts","../src/react/hooks/use-media-query.ts","../src/react/geometry.ts","../src/react/cn.ts"],"mappings":"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"}