@mkbabb/glass-ui 3.5.0 → 3.6.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 (80) hide show
  1. package/dist/{DataTable-DyKc_26a.js → DataTable-BGVXx0Ww.js} +1 -1
  2. package/dist/{NumberFieldContent-jO-zGOHf.js → NumberFieldContent-Bhhmk95p.js} +1 -1
  3. package/dist/animated-digit.js +1 -1
  4. package/dist/api/index.d.ts +2 -1
  5. package/dist/api.js +1 -1
  6. package/dist/aurora.js +259 -81
  7. package/dist/{button-i8Ek5vvg.js → button-BcMzVrqs.js} +2 -2
  8. package/dist/button.js +1 -1
  9. package/dist/carousel.js +1 -1
  10. package/dist/color.js +1 -1
  11. package/dist/components/custom/aurora/composables/color.d.ts +35 -2
  12. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  13. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +6 -0
  14. package/dist/components/custom/aurora/constants/presets.d.ts +9 -0
  15. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
  16. package/dist/components/custom/aurora/index.d.ts +3 -2
  17. package/dist/components/custom/constellation/Constellation.vue.d.ts +45 -0
  18. package/dist/components/custom/constellation/constellationField.d.ts +85 -0
  19. package/dist/components/custom/constellation/index.d.ts +3 -0
  20. package/dist/components/custom/dock/GlassDock.vue.d.ts +34 -3
  21. package/dist/composables/glass/canvas2d/index.d.ts +2 -0
  22. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +48 -0
  23. package/dist/composables/glass/index.d.ts +2 -0
  24. package/dist/composables/motion/core/index.d.ts +1 -0
  25. package/dist/composables/motion/index.d.ts +1 -0
  26. package/dist/composables/motion/useAnimatedNumberMap.d.ts +29 -0
  27. package/dist/composables/motion/useStagger.d.ts +50 -0
  28. package/dist/confirm-dialog.js +1 -1
  29. package/dist/constellation.d.ts +1 -0
  30. package/dist/constellation.js +182 -0
  31. package/dist/controls.js +1 -1
  32. package/dist/dark.js +1 -1
  33. package/dist/data-table.js +1 -1
  34. package/dist/dock.js +121 -102
  35. package/dist/expandable-container.js +1 -1
  36. package/dist/forms.js +1 -1
  37. package/dist/glass-ui.css +1 -1
  38. package/dist/glass-ui.js +79 -78
  39. package/dist/goo-blob.js +3 -3
  40. package/dist/icon-tooltip.js +1 -1
  41. package/dist/keyboard.js +1 -1
  42. package/dist/labeled-field.js +2 -2
  43. package/dist/motion-core.js +90 -49
  44. package/dist/motion.js +31 -21
  45. package/dist/number-field.js +1 -1
  46. package/dist/responsive-tabs.js +1 -1
  47. package/dist/search.js +1 -1
  48. package/dist/sortable-list.js +1 -1
  49. package/dist/styles/dock.css +185 -1
  50. package/dist/styles/glass-refract.css +60 -0
  51. package/dist/styles/glass-specular-track.css +43 -130
  52. package/dist/styles/glass.css +243 -27
  53. package/dist/styles/index.css +1 -0
  54. package/dist/styles/theme.css +6 -0
  55. package/dist/styles/tokens.css +33 -0
  56. package/dist/tabs.js +2 -2
  57. package/dist/{useAnimatedNumber-BF6r64lA.js → useAnimatedNumber-DfVgP4te.js} +1 -1
  58. package/dist/useCanvas2D-BeNJqqIS.js +95 -0
  59. package/dist/watercolor-dot.js +1 -1
  60. package/package.json +21 -1
  61. package/src/styles/dock.css +185 -1
  62. package/src/styles/glass-refract.css +60 -0
  63. package/src/styles/glass-specular-track.css +43 -130
  64. package/src/styles/glass.css +243 -27
  65. package/src/styles/index.css +1 -0
  66. package/src/styles/theme.css +6 -0
  67. package/src/styles/tokens.css +33 -0
  68. /package/dist/{IconTooltip-BTyYn4mr.js → IconTooltip-DZlCkU-0.js} +0 -0
  69. /package/dist/{Input-CU9CNKmo.js → Input-CRJ2owjN.js} +0 -0
  70. /package/dist/{UnderlineTabs-Cq_AD03t.js → UnderlineTabs-CuIK16JI.js} +0 -0
  71. /package/dist/{color-rkK4RMx2.js → color-DS-iLRVM.js} +0 -0
  72. /package/dist/{compile-DVgAxagk.js → compile-C62K_FpC.js} +0 -0
  73. /package/dist/{constants-DsCdlK9I.js → constants-C8NMonuo.js} +0 -0
  74. /package/dist/{presets-1OhFpaIC.js → presets-Dyv9Zl7W.js} +0 -0
  75. /package/dist/{prng-Bz_1Tydc.js → prng-CjVgzjQT.js} +0 -0
  76. /package/dist/{useGlobalDark-CWiaCoEw.js → useGlobalDark-D7R9OypB.js} +0 -0
  77. /package/dist/{useIntersectionPause-DAdVPVp4.js → useIntersectionPause-DsQYGc8V.js} +0 -0
  78. /package/dist/{useKeyboardShortcuts-BQfnAHHW.js → useKeyboardShortcuts-i8tHd5WO.js} +0 -0
  79. /package/dist/{useSortable-DnyGXKKY.js → useSortable-muI29agz.js} +0 -0
  80. /package/dist/{useViewTransition-CJnqg6wl.js → useViewTransition-DI0Rs2rV.js} +0 -0
@@ -54,8 +54,8 @@ var d = /* @__PURE__ */ r({
54
54
  secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 active:bg-secondary/70 aria-pressed:bg-secondary/60",
55
55
  accent: "bg-accent text-accent-foreground border border-border/40 hover:bg-accent/80 active:bg-accent/70 aria-pressed:bg-accent/60",
56
56
  ghost: "bg-transparent text-foreground/70 hover:bg-foreground/8 hover:text-foreground active:bg-foreground/12 aria-pressed:bg-foreground/10 aria-pressed:text-foreground",
57
- glass: "glass-wash glass-specular-track text-foreground hover:bg-[var(--glass-bg-resting)] hover:border-[var(--glass-border-resting)] active:bg-[var(--glass-bg-floating)] active:border-[var(--glass-border-floating)] aria-pressed:bg-[color-mix(in_srgb,var(--foreground)_10%,var(--glass-bg-resting))]",
58
- "glass-wash": "glass-wash glass-specular-track text-foreground/70 hover:bg-foreground/[0.04] hover:border-[var(--surface-tint-22)] hover:text-foreground active:bg-foreground/[0.08] aria-pressed:bg-foreground/[0.1] aria-pressed:text-foreground",
57
+ glass: "glass-wash text-foreground hover:bg-[var(--glass-bg-resting)] hover:border-[var(--glass-border-resting)] active:bg-[var(--glass-bg-floating)] active:border-[var(--glass-border-floating)] aria-pressed:bg-[color-mix(in_srgb,var(--foreground)_10%,var(--glass-bg-resting))]",
58
+ "glass-wash": "glass-wash text-foreground/70 hover:bg-foreground/[0.04] hover:border-[var(--surface-tint-22)] hover:text-foreground active:bg-foreground/[0.08] aria-pressed:bg-foreground/[0.1] aria-pressed:text-foreground",
59
59
  ai: "bg-amber-500/15 text-amber-700 hover:bg-amber-500/25 active:bg-amber-500/35 dark:text-amber-400 aria-pressed:bg-amber-500/30",
60
60
  link: "text-primary underline-offset-4 hover:underline active:opacity-80 active:scale-100"
61
61
  },
package/dist/button.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./button-i8Ek5vvg.js";
1
+ import { n as e, t } from "./button-BcMzVrqs.js";
2
2
  export { e as Button, t as buttonVariants };
package/dist/carousel.js CHANGED
@@ -3,7 +3,7 @@ import { t } from "./createLucideIcon-DuDoe_ra.js";
3
3
  import { t as n } from "./chevron-down-pBY8sYfV.js";
4
4
  import { t as r } from "./chevron-right-BjeKC22V.js";
5
5
  import { t as i } from "./chevron-up-DBeNHUm1.js";
6
- import { n as a } from "./button-i8Ek5vvg.js";
6
+ import { n as a } from "./button-BcMzVrqs.js";
7
7
  import { Fragment as o, computed as s, createBlock as c, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createVNode as f, defineComponent as p, mergeProps as m, normalizeClass as h, onMounted as g, openBlock as _, ref as v, renderList as y, renderSlot as b, resolveDynamicComponent as x, toDisplayString as S, unref as C, watch as w, withCtx as T } from "vue";
8
8
  import { createInjectionState as E } from "@vueuse/core";
9
9
  import D from "embla-carousel-vue";
package/dist/color.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, r, t as i } from "./color-rkK4RMx2.js";
1
+ import { a as e, i as t, n, r, t as i } from "./color-DS-iLRVM.js";
2
2
  export { i as cssToOklch, n as defaultBlobColorResolver, r as oklchStopToHex, t as oklchToGammaRgb, e as oklchToLinear };
@@ -1,3 +1,4 @@
1
+ import { type AuroraConfig } from "../constants/presets";
1
2
  import { type OklchStop } from "../../../../composables/color";
2
3
  export { cssToOklch, oklchStopToHex, oklchToLinear, } from "../../../../composables/color";
3
4
  export type { OklchStop } from "../../../../composables/color";
@@ -29,11 +30,22 @@ export declare function hexToOklchStop(hex: string): OklchStop;
29
30
  * derived stops differently:
30
31
  * - `analogous` — the ramp walks the seed hue ± a small spread (neighbouring
31
32
  * hues; the painterly default).
32
- * - `complementary` — stops split between the seed hue and its opposite (+180°).
33
+ * - `complementary` — stops travel from the seed hue toward its opposite (+180°)
34
+ * along the LONG arc (keeps the ramp saturated; the short arc cuts through grey
35
+ * on a warm→cool pair — the muddy-midtone defect).
36
+ * - `split-complementary` — anchor + the two hues flanking the complement (±150/210).
33
37
  * - `triad` — stops distributed across the seed hue and its two 120° partners.
38
+ * - `tetradic` — anchor + the three 90° partners (90/180/270).
34
39
  * - `monochrome` — every stop holds the seed hue; only L and C travel.
35
40
  */
36
- export type AuroraHarmony = "analogous" | "complementary" | "triad" | "monochrome";
41
+ export type AuroraHarmony = "analogous" | "complementary" | "split-complementary" | "triad" | "tetradic" | "monochrome";
42
+ /**
43
+ * Eased L/C journey shapes for the derived ramp. `bell` (the W5 default for chroma)
44
+ * peaks the chroma in the mids and desaturates the extremes — the painterly
45
+ * "saturated body, calm edges" curve. `linear` is the prior monotone falloff
46
+ * (the named pre-W5 branch — NOT a back-compat alias, a first-class choice).
47
+ */
48
+ export type DeriveEasing = "linear" | "sine" | "bell";
37
49
  export interface DeriveAuroraOptions {
38
50
  /** Number of stops to produce. Default 4; clamped to [2, MAX_STOPS]. */
39
51
  stopCount?: number;
@@ -45,6 +57,16 @@ export interface DeriveAuroraOptions {
45
57
  chromaFalloff?: number;
46
58
  /** Hue walk in degrees for analogous; ignored by monochrome. Default ~28. */
47
59
  hueSpread?: number;
60
+ /** L-ramp easing across the band. Default `linear` (monotone ascent). */
61
+ lightnessEasing?: DeriveEasing;
62
+ /** C-ramp easing. Default `bell` (peak in the mids — the W5 painterly default). */
63
+ chromaEasing?: DeriveEasing;
64
+ /**
65
+ * Warm-light / cool-shadow temperature coupling (0..1). A hue delta that warms
66
+ * the lights and cools the shadows — the single most-cited painting rule, the
67
+ * fold that makes the oil/oil-pastel mediums read as mixed paint. Default 0.
68
+ */
69
+ temperatureShift?: number;
48
70
  }
49
71
  /**
50
72
  * Seed ONE color into a harmonious, gamut-safe N-stop aurora palette.
@@ -63,3 +85,14 @@ export interface DeriveAuroraOptions {
63
85
  * @param options ramp shape — stop count, harmony, L/C/h spreads.
64
86
  */
65
87
  export declare function deriveAurora(seed: string | OklchStop, options?: DeriveAuroraOptions): OklchStop[];
88
+ /** Atmospheric mood words for {@link deriveScene}. */
89
+ export type AuroraMood = "atmospheric" | "painterly" | "vivid" | "muted";
90
+ /**
91
+ * Seed ONE color + a mood word into a WHOLE `AuroraConfig` — palette (via
92
+ * `deriveAurora`), nuclei layout (a rule-of-thirds/golden prior), medium, and the
93
+ * motion/output knobs the mood implies. A SUPERSET front door over `deriveAurora`:
94
+ * a consumer hands a seed + `"painterly"` and gets a coherent backdrop, not just a
95
+ * palette. The base is the wispy-sky `DEFAULT_AURORA_CONFIG` (every field the mood
96
+ * does not touch stays the library default).
97
+ */
98
+ export declare function deriveScene(seed: string | OklchStop, mood?: AuroraMood): AuroraConfig;
@@ -9,7 +9,7 @@
9
9
  * shader-uniform boundary: a NEW uniform name must be added here, and the cache is
10
10
  * keyed off it, so a fresh uniform always gets a location slot.
11
11
  */
12
- export declare const UNIFORM_NAMES: readonly ["uTime", "uPalette", "uStopCount", "uNucleiCount", "uNucleiPos", "uNucleiRadius", "uNucleiPaletteBias", "uNucleiValueBias", "uNucleiDriftRadius", "uNucleiDriftPhase", "uNucleiElong", "uNucleiAngle", "uSoftmaxBeta", "uValueVariance", "uWarpAmount", "uWarpScale", "uWarpDrift", "uWarpMode", "uNoiseOctaves", "uMedium", "uFlowPattern", "uFlowFocal", "uFlowAngle", "uFlowCurl", "uCursor", "uCursorStrength", "uCursorRadius", "uStrokeAmount", "uStrokeScale", "uStrokeAnisotropy", "uStrokeLayers", "uStrokeMode", "uWetEdge", "uGranulation", "uImpasto", "uBrokenColor", "uCanvasGrain", "uNucleiDrift", "uPaletteDrift", "uBreathDepth", "uBreathPeriod", "uSaturation", "uPaperGrain", "uAlpha"];
12
+ export declare const UNIFORM_NAMES: readonly ["uTime", "uPalette", "uStopCount", "uNucleiCount", "uNucleiPos", "uNucleiRadius", "uNucleiPaletteBias", "uNucleiValueBias", "uNucleiDriftRadius", "uNucleiDriftPhase", "uNucleiElong", "uNucleiAngle", "uSoftmaxBeta", "uValueVariance", "uWarpAmount", "uWarpScale", "uWarpDrift", "uWarpMode", "uNoiseOctaves", "uMedium", "uHuePath", "uFlowPattern", "uFlowFocal", "uFlowAngle", "uFlowCurl", "uCursor", "uCursorStrength", "uCursorRadius", "uStrokeAmount", "uStrokeScale", "uStrokeAnisotropy", "uStrokeLayers", "uStrokeMode", "uWetEdge", "uGranulation", "uImpasto", "uBrokenColor", "uCanvasGrain", "uNucleiDrift", "uPaletteDrift", "uBreathDepth", "uBreathPeriod", "uSaturation", "uPaperGrain", "uAlpha"];
13
13
  export type UniformName = (typeof UNIFORM_NAMES)[number];
14
14
  export type UniformLocations = Record<UniformName, WebGLUniformLocation | null>;
15
15
  export interface GlProgram {
@@ -25,6 +25,12 @@ export declare const MEDIUM_ID: {
25
25
  readonly oil: 3;
26
26
  readonly crayon: 4;
27
27
  };
28
+ export declare const HUE_PATH_ID: {
29
+ readonly shorter: 0;
30
+ readonly longer: 1;
31
+ readonly increasing: 2;
32
+ readonly decreasing: 3;
33
+ };
28
34
  export declare const FLOW_ID: {
29
35
  readonly none: 0;
30
36
  readonly radial: 1;
@@ -12,6 +12,8 @@
12
12
  */
13
13
  import type { OklchStop } from "../../../../composables/color";
14
14
  export type { OklchStop };
15
+ import type { HueInterpolationMethod } from "@mkbabb/value.js";
16
+ export type AuroraHuePath = HueInterpolationMethod;
15
17
  export interface AuroraNucleus {
16
18
  /** 0..1 in CSS-top-origin space (0 = top, 1 = bottom). Runtime flips Y. */
17
19
  x: number;
@@ -63,6 +65,13 @@ export interface AuroraConfig {
63
65
  warpMode: WarpMode;
64
66
  noiseOctaves: 3 | 4 | 5;
65
67
  medium: AuroraMedium;
68
+ /**
69
+ * W5 — the hue-arc method for the OKLCh palette interpolation. Optional;
70
+ * omitted = `"shorter"` (the OKLab-rectangular ramp — the muddy-midtone-free
71
+ * default). `"increasing"`/`"decreasing"` request the OKLCh hue-arc for a
72
+ * deliberate rainbow sweep across the stops. Aliased on `/api` as `AuroraHuePath`.
73
+ */
74
+ huePath?: AuroraHuePath;
66
75
  flow: AuroraFlow;
67
76
  strokeAmount: number;
68
77
  strokeScale: number;
@@ -1 +1 @@
1
- export declare const AURORA_COMPOSITION_GLSL = "// \u2500\u2500 Palette LUT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvec3 samplePalette(float id) {\n id = clamp(id, 0.0, 1.0);\n float scaled = id * float(uStopCount - 1);\n int i0 = int(floor(scaled));\n int i1 = min(i0 + 1, uStopCount - 1);\n float t = fract(scaled);\n t = smoothstep(0.0, 1.0, t);\n return mix(uPalette[i0], uPalette[i1], t);\n}\n\n// \u2500\u2500 Nuclei field \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvoid nucleiField(vec2 p, float t, out float paletteId, out float valueMod) {\n float accumBias = 0.0;\n float accumValue = 0.0;\n float accumW = 0.0;\n for (int i = 0; i < MAX_NUCLEI; i++) {\n if (i >= uNucleiCount) break;\n vec2 posI = uNucleiPos[i]\n + uNucleiDriftRadius[i] * vec2(\n cos(t * uNucleiDrift * K_NUCLEI + uNucleiDriftPhase[i]),\n sin(t * uNucleiDrift * K_NUCLEI + uNucleiDriftPhase[i] * 1.13)\n );\n vec2 diff = p - posI;\n // Anisotropic Gaussian: rotate diff into the nucleus's local frame\n // (major axis along uNucleiAngle), then scale the major-axis component by\n // 1/elongation so the squared distance describes an ellipse. Defaults\n // 1.0/0.0 reduce to the isotropic dot(diff, diff).\n float ca = cos(uNucleiAngle[i]);\n float sa = sin(uNucleiAngle[i]);\n vec2 local = vec2( ca * diff.x + sa * diff.y,\n -sa * diff.x + ca * diff.y);\n float along = local.x / max(uNucleiElong[i], 0.01);\n float across = local.y;\n float d2 = along * along + across * across;\n float r = max(uNucleiRadius[i], 0.01);\n float w = exp(-uSoftmaxBeta * d2 / (r * r));\n accumBias += w * uNucleiPaletteBias[i];\n accumValue += w * uNucleiValueBias[i];\n accumW += w;\n }\n paletteId = accumBias / max(accumW, 1e-4);\n valueMod = accumValue / max(accumW, 1e-4);\n\n // Palette drift \u2014 slow global paletteId breathe between adjacent stops. The\n // rate rides K_PAL (perceptible ~30\u201360s hue cycle at the default coefficient);\n // the amplitude lifts the authored coefficient into a 0.03..0.06 paletteId band\n // so the palette visibly travels rather than dithering within one stop.\n float palAmp = clamp(uPaletteDrift * 6.0, 0.0, 0.06);\n paletteId += palAmp * sin(t * uPaletteDrift * K_PAL);\n paletteId = clamp(paletteId, 0.0, 1.0);\n}\n";
1
+ export declare const AURORA_COMPOSITION_GLSL = "// \u2500\u2500 Palette LUT (W5 \u2014 OKLCh/OKLab interpolation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// The endpoints stay CPU-baked to LINEAR sRGB (the Aras precompute pattern); only\n// the BETWEEN-endpoint interpolation moves to perceptual space. OKLab-rectangular\n// for the default ramp (holds chroma, no grey midpoint); the OKLCh hue-arc only on\n// uHuePath increasing/decreasing (deliberate rainbow travel). The prior linear\n// mix() (the muddy-midtone source) is GONE.\nvec3 samplePalette(float id) {\n id = clamp(id, 0.0, 1.0);\n float scaled = id * float(uStopCount - 1);\n int i0 = int(floor(scaled));\n int i1 = min(i0 + 1, uStopCount - 1);\n float t = fract(scaled);\n t = smoothstep(0.0, 1.0, t);\n vec3 a = uPalette[i0];\n vec3 b = uPalette[i1];\n // increasing(2)/decreasing(3) request the OKLCh hue-arc (rainbow sweep); every\n // other method takes the OKLab-rectangular straight line (no hue detour).\n if (uHuePath == 2 || uHuePath == 3) {\n return mixPaletteOklchArc(a, b, t, uHuePath);\n }\n return mixPaletteOklab(a, b, t);\n}\n\n// \u2500\u2500 Nuclei field \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvoid nucleiField(vec2 p, float t, out float paletteId, out float valueMod) {\n float accumBias = 0.0;\n float accumValue = 0.0;\n float accumW = 0.0;\n for (int i = 0; i < MAX_NUCLEI; i++) {\n if (i >= uNucleiCount) break;\n vec2 posI = uNucleiPos[i]\n + uNucleiDriftRadius[i] * vec2(\n cos(t * uNucleiDrift * K_NUCLEI + uNucleiDriftPhase[i]),\n sin(t * uNucleiDrift * K_NUCLEI + uNucleiDriftPhase[i] * 1.13)\n );\n vec2 diff = p - posI;\n // Anisotropic Gaussian: rotate diff into the nucleus's local frame\n // (major axis along uNucleiAngle), then scale the major-axis component by\n // 1/elongation so the squared distance describes an ellipse. Defaults\n // 1.0/0.0 reduce to the isotropic dot(diff, diff).\n float ca = cos(uNucleiAngle[i]);\n float sa = sin(uNucleiAngle[i]);\n vec2 local = vec2( ca * diff.x + sa * diff.y,\n -sa * diff.x + ca * diff.y);\n float along = local.x / max(uNucleiElong[i], 0.01);\n float across = local.y;\n float d2 = along * along + across * across;\n float r = max(uNucleiRadius[i], 0.01);\n float w = exp(-uSoftmaxBeta * d2 / (r * r));\n accumBias += w * uNucleiPaletteBias[i];\n accumValue += w * uNucleiValueBias[i];\n accumW += w;\n }\n paletteId = accumBias / max(accumW, 1e-4);\n valueMod = accumValue / max(accumW, 1e-4);\n\n // Palette drift \u2014 slow global paletteId breathe between adjacent stops. The\n // rate rides K_PAL (perceptible ~30\u201360s hue cycle at the default coefficient);\n // the amplitude lifts the authored coefficient into a 0.03..0.06 paletteId band\n // so the palette visibly travels rather than dithering within one stop.\n float palAmp = clamp(uPaletteDrift * 6.0, 0.0, 0.06);\n paletteId += palAmp * sin(t * uPaletteDrift * K_PAL);\n paletteId = clamp(paletteId, 0.0, 1.0);\n}\n";
@@ -6,5 +6,6 @@ export { useCursorInteraction } from "./composables/useCursorInteraction";
6
6
  export { createAurora } from "./composables/runtime";
7
7
  export type { AuroraRuntimeMode, AuroraRuntimeOptions } from "./composables/runtime";
8
8
  export { DEFAULT_AURORA_CONFIG, MAX_NUCLEI, MAX_STOPS, type AuroraConfig, type AuroraCursorApi, type AuroraFlow, type AuroraInstance, type AuroraMedium, type AuroraNucleus, type FlowPattern, type OklchStop, type StrokeMode, type WarpMode, } from "./constants/presets";
9
- export { cssToOklch, deriveAurora, flattenPalette, hexToOklchStop, oklchStopToHex, oklchToLinear, paletteToCssGradient, } from "./composables/color";
10
- export type { AuroraHarmony, DeriveAuroraOptions } from "./composables/color";
9
+ export { cssToOklch, deriveAurora, deriveScene, flattenPalette, hexToOklchStop, oklchStopToHex, oklchToLinear, paletteToCssGradient, } from "./composables/color";
10
+ export type { AuroraHarmony, AuroraMood, DeriveAuroraOptions, DeriveEasing, } from "./composables/color";
11
+ export type { AuroraHuePath } from "./constants/presets";
@@ -0,0 +1,45 @@
1
+ import { type HTMLAttributes } from "vue";
2
+ import { type ConstellationField } from "./constellationField";
3
+ /**
4
+ * Constellation — a slow, geometric proximity-graph lattice on a Canvas2D
5
+ * surface. Nodes drift + bounce; near nodes link with distance-falloff
6
+ * hairlines; the web leans toward the cursor and taps ripple. It composes the
7
+ * `useCanvas2D` substrate, so it inherits the offscreen / tab-hidden /
8
+ * reduced-motion freeze for free (no hand-rolled RAF-park).
9
+ *
10
+ * The lattice ships NEUTRAL. A branded skin (a focal ring, a callout label) is
11
+ * the consumer's `drawOverlay(ctx, field, now)` pass — it runs AFTER the four
12
+ * neutral passes and receives the live field so it can pin itself to a real
13
+ * node. Zero deck-domain content lives in the component.
14
+ *
15
+ * Palette reads `--constellation-node` / `--constellation-node-dim` /
16
+ * `--constellation-line` off the canvas (neutral fallbacks), so a consumer
17
+ * override or a dark-mode flip re-tints the lattice.
18
+ */
19
+ type __VLS_Props = {
20
+ /** Node count. Default 64. */
21
+ count?: number;
22
+ /** Link distance in px (the falloff reach). Default 132. */
23
+ link?: number;
24
+ /** Drift speed. Default 0.16. */
25
+ speed?: number;
26
+ /**
27
+ * Seed for a REPRODUCIBLE field. A `number` or `string` (hashed) seeds the
28
+ * shared `mulberry32`; omit for a fresh `Math.random` field each mount.
29
+ */
30
+ seed?: number | string;
31
+ /** Steer-toward-cursor + tap ripples. Default true; auto-off under reduced-motion. */
32
+ pointerReactive?: boolean;
33
+ class?: HTMLAttributes["class"];
34
+ /**
35
+ * The skin seam. Runs after the neutral passes with the live field, so a
36
+ * consumer paints its own focal mark pinned to a real node. The branded
37
+ * content (a domain accent, a callout label) lives HERE, in the consumer.
38
+ */
39
+ drawOverlay?: (ctx: CanvasRenderingContext2D, field: ConstellationField, now: number) => void;
40
+ };
41
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
42
+ field: ConstellationField;
43
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
44
+ declare const _default: typeof __VLS_export;
45
+ export default _default;
@@ -0,0 +1,85 @@
1
+ /** Reference width the `k` scale factor is keyed to (CSS px). */
2
+ export declare const BASE_WIDTH = 1280;
3
+ export interface ConstellationNode {
4
+ x: number;
5
+ y: number;
6
+ vx: number;
7
+ vy: number;
8
+ r: number;
9
+ dim: boolean;
10
+ }
11
+ export interface ConstellationRipple {
12
+ x: number;
13
+ y: number;
14
+ /** `performance.now()` at first draw; -1 until stamped. */
15
+ start: number;
16
+ }
17
+ /** The pointer position in canvas-local CSS px (`-1` = inactive). */
18
+ export interface ConstellationPointer {
19
+ x: number;
20
+ y: number;
21
+ }
22
+ /** The neutral palette resolved off the canvas custom properties. */
23
+ export interface ConstellationPalette {
24
+ node: string;
25
+ nodeDim: string;
26
+ line: string;
27
+ }
28
+ /**
29
+ * The field state the component exposes to its `drawOverlay` consumer so a
30
+ * skin can pin itself to a real field node. `k` is the `width / BASE_WIDTH`
31
+ * scale, `dpr` the device-pixel ratio applied by the substrate.
32
+ */
33
+ export interface ConstellationField {
34
+ nodes: ConstellationNode[];
35
+ /** The host canvas — for `getComputedStyle` token reads in an overlay. */
36
+ canvas: HTMLCanvasElement | null;
37
+ w: number;
38
+ h: number;
39
+ k: number;
40
+ dpr: number;
41
+ }
42
+ /**
43
+ * The `<Constellation>` consumer prop surface (the public type a consumer types
44
+ * a wrapper against). The `drawOverlay` seam is the branded-skin injection — it
45
+ * runs AFTER the neutral passes with the live field.
46
+ */
47
+ export interface ConstellationProps {
48
+ /** Node count. Default 64. */
49
+ count?: number;
50
+ /** Link distance in px (the falloff reach). Default 132. */
51
+ link?: number;
52
+ /** Drift speed. Default 0.16. */
53
+ speed?: number;
54
+ /** Seed for a reproducible field (number or hashed string); omit for `Math.random`. */
55
+ seed?: number | string;
56
+ /** Steer-toward-cursor + tap ripples. Default true; auto-off under reduced-motion. */
57
+ pointerReactive?: boolean;
58
+ class?: string;
59
+ /** The skin seam — paints the consumer's focal mark on the live field. */
60
+ drawOverlay?: (ctx: CanvasRenderingContext2D, field: ConstellationField, now: number) => void;
61
+ }
62
+ export declare const DEFAULT_PALETTE: ConstellationPalette;
63
+ /** Resolve the neutral palette off a canvas's resolved custom properties. */
64
+ export declare function readPalette(canvas: HTMLCanvasElement): ConstellationPalette;
65
+ /**
66
+ * Seed `count` drifting nodes inside `w × h`. `rng` is a `() => number` in
67
+ * `[0, 1)` (the glass-ui `mulberry32`/`Math.random`); a seeded `rng` lays out a
68
+ * reproducible field. No node is pinned — every node drifts (pinning a focal
69
+ * node is consumer skin, not field mechanics).
70
+ */
71
+ export declare function seedField(rng: () => number, count: number, w: number, h: number, speed: number): ConstellationNode[];
72
+ /**
73
+ * Advance the field one step: drift + wall-bounce every node, then (if the
74
+ * pointer is live) lean nodes within reach toward the cursor WITHOUT changing
75
+ * their speed (the slow geometric drift is preserved). `k` is the scale factor.
76
+ */
77
+ export declare function stepField(field: ConstellationField, k: number, speed: number, pointer: ConstellationPointer | null): void;
78
+ /** Pass 1 — hairline edges between any two nodes within `link` px (alpha falls off with distance). */
79
+ export declare function drawEdges(ctx: CanvasRenderingContext2D, field: ConstellationField, link: number, palette: ConstellationPalette): void;
80
+ /** Pass 2 — ambient node dots. */
81
+ export declare function drawNodes(ctx: CanvasRenderingContext2D, field: ConstellationField, palette: ConstellationPalette): void;
82
+ /** Pass 3 — the cursor joins the web: faint links to nodes within reach + a soft cursor node. */
83
+ export declare function drawPointerWeb(ctx: CanvasRenderingContext2D, field: ConstellationField, link: number, palette: ConstellationPalette, pointer: ConstellationPointer | null): void;
84
+ /** Pass 4 — tap ripples: expanding rings that fade over ~0.9s; consumed entries are spliced. */
85
+ export declare function drawRipples(ctx: CanvasRenderingContext2D, field: ConstellationField, now: number, ripples: ConstellationRipple[], palette: ConstellationPalette): void;
@@ -0,0 +1,3 @@
1
+ export { default as Constellation } from "./Constellation.vue";
2
+ export { seedField, stepField, readPalette, drawEdges, drawNodes, drawPointerWeb, drawRipples, BASE_WIDTH, DEFAULT_PALETTE, } from "./constellationField";
3
+ export type { ConstellationNode, ConstellationRipple, ConstellationPointer, ConstellationPalette, ConstellationField, ConstellationProps, } from "./constellationField";
@@ -28,8 +28,38 @@ type __VLS_Props = {
28
28
  * chassis vocabulary. AJ-W1-δ / G-AJ-D7.
29
29
  */
30
30
  variant?: "dock" | "rail" | "instrument-strip";
31
- /** Corner treatment for vertical rail/tool-palette docks. */
32
- shape?: "pill" | "rounded";
31
+ /**
32
+ * Corner treatment.
33
+ * `"pill"` — the stadium silhouette (default).
34
+ * `"rounded"` — a finite rounded radius (`--radius-xl`).
35
+ * `"card"` — the AW.W3b big-dock card shell: a finite concentric
36
+ * radius (`--dock-card-radius`, default `--radius-3xl`)
37
+ * ABOVE 2xl, below pill — does NOT collapse to a stadium.
38
+ * Collapsed it returns to a pill; the pill↔card swap
39
+ * morphs on the `--dock-motion-resize` spring. A `@supports
40
+ * (corner-shape: squircle)` enhancement reads better at the
41
+ * large radius (the border-radius arc is the contract).
42
+ *
43
+ * `"pill"`/`"rounded"` previously bound ONLY under the vertical rail
44
+ * variant — on a horizontal dock the prop silently no-op'd. AW.W3b adds
45
+ * the horizontal-root shape rules (closing that documented-but-dead prop),
46
+ * so `shape` now paints on a horizontal dock too.
47
+ */
48
+ shape?: "pill" | "rounded" | "card";
49
+ /**
50
+ * In-cap arrangement. `"linear"` (default) lays the active layer out as a
51
+ * linear row/column. `"grid"` makes the active layer a self-wrapping tile
52
+ * grid (Launchpad/Stage-Manager track symmetry — `auto-fill` columns of
53
+ * `--dock-tile-min`). ORTHOGONAL to `overflow` (the OVER-cap strategy):
54
+ * `layout` is the IN-cap arrangement.
55
+ *
56
+ * Hard contract: a `layout="grid"` dock is `alwaysExpanded` (a 2D panel
57
+ * does not read as a collapsible pill, and no width morph means no
58
+ * per-frame grid reflow). The canonical pairing is
59
+ * `shape="card" layout="grid"` (the props stay independent — no
60
+ * auto-implication of `shape`).
61
+ */
62
+ layout?: "linear" | "grid";
33
63
  /**
34
64
  * Layout axis of the dock. `"horizontal"` (default) lays items out
35
65
  * left-to-right and animates `width`; `"vertical"` lays items out
@@ -101,7 +131,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
101
131
  orientation: "horizontal" | "vertical";
102
132
  variant: "dock" | "rail" | "instrument-strip";
103
133
  density: DockDensity;
104
- shape: "pill" | "rounded";
134
+ shape: "pill" | "rounded" | "card";
135
+ layout: "linear" | "grid";
105
136
  collapseDelay: number;
106
137
  alwaysExpanded: boolean;
107
138
  startCollapsed: boolean;
@@ -0,0 +1,2 @@
1
+ export { createCanvas2D } from "./useCanvas2D";
2
+ export type { Canvas2DFrame, Canvas2DHandle, Canvas2DOptions, Canvas2DSuspendReason, } from "./useCanvas2D";
@@ -0,0 +1,48 @@
1
+ import { type MaybeRefOrGetter } from "vue";
2
+ /** The suspend reasons that gate the loop. Twins the WebGL substrate's union. */
3
+ export type Canvas2DSuspendReason = "tab-hidden" | "off-screen" | "manual";
4
+ /** The per-frame hooks a consumer's `setup(ctx)` returns. */
5
+ export interface Canvas2DFrame {
6
+ /**
7
+ * Draw one frame. `ctx` is pre-transformed for CSS px (the dpr scale is
8
+ * applied by the substrate's resize), `now` is `performance.now()` ms. The
9
+ * consumer steps + clears + paints — the substrate clears nothing.
10
+ */
11
+ render: (ctx: CanvasRenderingContext2D, now: number) => void;
12
+ /** Release per-instance resources. Runs on dispose. */
13
+ teardown?: () => void;
14
+ }
15
+ export interface Canvas2DOptions {
16
+ /** The canvas element ref (or getter). The substrate observes + sizes it. */
17
+ canvas: MaybeRefOrGetter<HTMLCanvasElement | null>;
18
+ /** Build per-instance state on a fresh 2D context; returns the frame hooks. */
19
+ setup: (ctx: CanvasRenderingContext2D) => Canvas2DFrame;
20
+ /** Auto-`arm()` once the canvas resolves (default `true`). */
21
+ autoStart?: boolean;
22
+ /**
23
+ * Honor `prefers-reduced-motion: reduce` by painting ONE static frame then
24
+ * parking the loop. Live-monitored via a `matchMedia` `change` listener;
25
+ * re-arms (one static frame) on un-reduce. Default `true`.
26
+ */
27
+ respectReducedMotion?: boolean;
28
+ /** `getContext("2d", …)` attributes. */
29
+ contextAttrs?: CanvasRenderingContext2DSettings;
30
+ /** IntersectionObserver `rootMargin` for the offscreen seam. Default `200px`. */
31
+ rootMargin?: string;
32
+ }
33
+ export interface Canvas2DHandle {
34
+ /** Run the cheap init (2D context + `setup` + arm the loop). Idempotent; no-op post-dispose. */
35
+ arm: () => void;
36
+ suspend: (reason?: Canvas2DSuspendReason) => void;
37
+ resume: (reason?: Canvas2DSuspendReason) => void;
38
+ /** Re-arm a parked loop on demand (a setter that re-introduced motion calls this). */
39
+ wake: () => void;
40
+ dispose: () => void;
41
+ /** `true` while the suspend set is empty (the loop is live). */
42
+ isRunning: () => boolean;
43
+ /** The live 2D context (null before arm / after dispose). */
44
+ readonly ctx: CanvasRenderingContext2D | null;
45
+ /** The live `prefers-reduced-motion: reduce` state (consumers read it to skip stepping). */
46
+ readonly reducedMotion: boolean;
47
+ }
48
+ export declare function createCanvas2D(options: Canvas2DOptions): Canvas2DHandle;
@@ -1 +1,3 @@
1
1
  export { useGlassRenderer, createGlassFilter, destroyGlassFilter, type GlassTier, type GlassFilterState, type UseGlassRendererReturn, } from "./useGlassRenderer";
2
+ export { createCanvas2D } from "./canvas2d";
3
+ export type { Canvas2DFrame, Canvas2DHandle, Canvas2DOptions, Canvas2DSuspendReason, } from "./canvas2d";
@@ -1,5 +1,6 @@
1
1
  export * from "../constants";
2
2
  export * from "../useStaggerReveal";
3
+ export * from "../useStagger";
3
4
  export * from "../useScrollProgress";
4
5
  export * from "../useRAFLoop";
5
6
  export * from "../useIntersectionPause";
@@ -4,4 +4,5 @@ export * from "./useSpringMount";
4
4
  export * from "./useSpringPress";
5
5
  export * from "./useNumericTransition";
6
6
  export * from "./useAnimatedNumber";
7
+ export * from "./useAnimatedNumberMap";
7
8
  export * from "./useCountup";
@@ -0,0 +1,29 @@
1
+ import { type ComputedRef } from "vue";
2
+ import { type UseAnimatedNumberOptions } from "./useAnimatedNumber";
3
+ export interface UseAnimatedNumberMapOptions extends UseAnimatedNumberOptions {
4
+ }
5
+ /**
6
+ * Fan out N independent `useAnimatedNumber` instances into a `Record<K, ...>`.
7
+ *
8
+ * Each key gets one rAF-smoothed `ComputedRef<number | null>`. The smoothing
9
+ * options apply identically across the set; consumers that need per-key
10
+ * options should call `useAnimatedNumber` per key directly.
11
+ *
12
+ * The `null` propagation is preserved: when `source(key)` resolves to `null`,
13
+ * the corresponding ref returns `null` rather than freezing on the last
14
+ * smoothed sample. This matches the per-metric `raw → smoothed` contract.
15
+ *
16
+ * @example
17
+ * const keys = ["ping", "jitter", "download", "upload"] as const;
18
+ * const smoothed = useAnimatedNumberMap({
19
+ * keys,
20
+ * source: (k) => computed(() => store.resultFor(k).value ?? null),
21
+ * damping: DAMPING.domPill,
22
+ * snapThreshold: SNAP_THRESHOLD.dom,
23
+ * });
24
+ * // smoothed.ping.value, smoothed.jitter.value, ...
25
+ */
26
+ export declare function useAnimatedNumberMap<K extends string>(options: {
27
+ keys: readonly K[];
28
+ source: (key: K) => ComputedRef<number | null>;
29
+ } & UseAnimatedNumberMapOptions): Record<K, ComputedRef<number | null>>;
@@ -0,0 +1,50 @@
1
+ import { type Ref } from "vue";
2
+ export interface UseStaggerOptions {
3
+ /** Count of staggered slots. Each slot maps to one boolean in `revealed`. */
4
+ items: number;
5
+ /**
6
+ * Delay between consecutive reveals.
7
+ *
8
+ * Default 80ms — mirrors the `--motion-stagger-default` token in
9
+ * `tokens.css` (AJ-W4-κ canon). Consumers driving per-row CSS
10
+ * `animation-delay` cascades on the same surface should also read
11
+ * `--motion-stagger-default` so the JS-driven cascade (this composable)
12
+ * and the CSS-driven cascade stay in lockstep.
13
+ *
14
+ * The two adjacent canon tiers are:
15
+ * - `--motion-stagger-tight: 40ms` — dense row cascades
16
+ * - `--motion-stagger-relaxed: 120ms` — wide series cascades
17
+ */
18
+ delayMs?: number;
19
+ /** Delay before the first reveal fires. Default 0. */
20
+ initialDelayMs?: number;
21
+ /** Auto-start on creation. Default true. */
22
+ immediate?: boolean;
23
+ /**
24
+ * When true, honour `prefers-reduced-motion: reduce` by flipping every
25
+ * slot true synchronously instead of cascading the timeline. Mirrors
26
+ * the canonical opt-in on `useAnimatedNumber` and the global
27
+ * `transitions.css` / `utilities.css` reduced-motion brackets. SSR
28
+ * environments (no `window.matchMedia`) treat the option as a no-op.
29
+ * Default true.
30
+ */
31
+ respectReducedMotion?: boolean;
32
+ }
33
+ export interface UseStaggerControls {
34
+ /** Per-slot reveal state. `revealed.value[i]` flips true at `initialDelayMs + i * delayMs`. */
35
+ revealed: Ref<boolean[]>;
36
+ /** Re-arm the cascade. Resets `revealed` to all-false then fires the timeline. */
37
+ start: () => void;
38
+ /** Reset to all-false. Cancels any pending reveals. */
39
+ reset: () => void;
40
+ /** True once every slot has flipped. */
41
+ isComplete: Ref<boolean>;
42
+ }
43
+ /**
44
+ * Drive a fixed-count staggered reveal off a single timer cascade.
45
+ *
46
+ * @example
47
+ * const { revealed, start } = useStagger({ items: visible.value.length, delayMs: 80, initialDelayMs: 80, immediate: false });
48
+ * watch(allComplete, (done, prev) => { if (done && !prev) start(); });
49
+ */
50
+ export declare function useStagger(options: UseStaggerOptions): UseStaggerControls;
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./createLucideIcon-DuDoe_ra.js";
2
- import { n as t } from "./button-i8Ek5vvg.js";
2
+ import { n as t } from "./button-BcMzVrqs.js";
3
3
  import { t as n } from "./_plugin-vue_export-helper-C1je1s0u.js";
4
4
  import { Transition as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, mergeModels as d, openBlock as f, renderSlot as p, toDisplayString as m, unref as h, useModel as g, withCtx as _, withKeys as v, withModifiers as y } from "vue";
5
5
  var b = e("loader-circle", [["path", {
@@ -0,0 +1 @@
1
+ export * from "./components/custom/constellation";