@mkbabb/glass-ui 10.1.4 → 11.0.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 (214) hide show
  1. package/MIGRATION.md +1024 -1461
  2. package/README.md +2 -2
  3. package/dist/DialogContent-DG5kseRQ.js +159 -0
  4. package/dist/DropdownMenuTrigger-uhSXgEfK.js +76 -0
  5. package/dist/{Surface-1nPoabc3.js → Surface-C7wq2j0A.js} +3 -0
  6. package/dist/aurora.css +1 -0
  7. package/dist/aurora.js +246 -2472
  8. package/dist/auroraImageSource-xNLDUjcy.js +30 -0
  9. package/dist/axes.js +8 -8
  10. package/dist/blob.css +1 -0
  11. package/dist/blob.js +57 -54
  12. package/dist/budget-CJfhLIIV.js +13 -0
  13. package/dist/button-CAKhiOZy.js +113 -0
  14. package/dist/button.js +1 -1
  15. package/dist/{card-ByyqRBvK.js → card-D_uXphvL.js} +4 -1
  16. package/dist/card.js +1 -1
  17. package/dist/carousel.js +3 -2
  18. package/dist/{checkbox-B1qn65se.js → checkbox-COLnvULu.js} +1 -0
  19. package/dist/checkbox.css +1 -0
  20. package/dist/checkbox.js +1 -1
  21. package/dist/{collapsible-DFzK29Oh.js → collapsible-Bd4Et730.js} +1 -0
  22. package/dist/collapsible.css +1 -0
  23. package/dist/collapsible.js +1 -1
  24. package/dist/color-HkUaTAJj.js +270 -0
  25. package/dist/{color.glsl-DTJhdekG.js → color.glsl-bFJm8k5R.js} +4 -16
  26. package/dist/color.wgsl-B-qDJ_OM.js +4 -0
  27. package/dist/{command-CatrAsrl.js → command-BsFOGZwB.js} +3 -2
  28. package/dist/command.css +1 -0
  29. package/dist/command.js +1 -1
  30. package/dist/component-styles.css +0 -1
  31. package/dist/components/_shared/axes.d.ts +7 -0
  32. package/dist/components/_shared/feedback/dot-ring.css +1 -1
  33. package/dist/components/_shared/overlay/focus-return.d.ts +9 -0
  34. package/dist/components/_shared/overlay/index.d.ts +3 -0
  35. package/dist/components/_shared/overlay/root-scroll-lock.d.ts +4 -0
  36. package/dist/components/_shared/overlay/sheet-width.d.ts +2 -0
  37. package/dist/components/_shared/shape/useBarShape.d.ts +4 -0
  38. package/dist/components/aurora/composables/auroraFallbackGround.d.ts +12 -0
  39. package/dist/components/aurora/constants/presets.d.ts +21 -0
  40. package/dist/components/aurora/index.d.ts +2 -2
  41. package/dist/components/button/styles.css +1 -1
  42. package/dist/components/dark-mode-toggle/dark-mode-toggle.css +1 -1
  43. package/dist/components/dialog/DialogContent.vue.d.ts +2 -2
  44. package/dist/components/dialog/ModalOverlay.vue.d.ts +2 -2
  45. package/dist/components/dialog/ModalScrim.vue.d.ts +26 -0
  46. package/dist/components/dialog/styles.css +1 -1
  47. package/dist/components/dock/GlassDock.vue.d.ts +4 -1
  48. package/dist/components/dock/composables/useDockClickIntegrity.d.ts +4 -0
  49. package/dist/components/dock/composables/useDockShellProps.d.ts +34 -2
  50. package/dist/components/dock/composables/useDockState.d.ts +5 -0
  51. package/dist/components/dock/index.d.ts +1 -2
  52. package/dist/components/dock/styles/controls/icon-button.css +1 -1
  53. package/dist/components/dock/styles/controls/tab-button.css +1 -1
  54. package/dist/components/dock/styles/morph.css +1 -1
  55. package/dist/components/dock/styles/run.css +1 -1
  56. package/dist/components/dock/trigger.d.ts +1 -0
  57. package/dist/components/expandable-container/ExpandableContainer.vue.d.ts +30 -29
  58. package/dist/components/menu/ContextMenu.vue.d.ts +27 -0
  59. package/dist/components/menu/DropdownMenu.vue.d.ts +5 -23
  60. package/dist/components/menu/context.d.ts +18 -5
  61. package/dist/components/menu/family-click.d.ts +2 -0
  62. package/dist/components/menu/family-context.d.ts +2 -0
  63. package/dist/components/menu/index.d.ts +1 -1
  64. package/dist/components/sheet/SheetContent.vue.d.ts +2 -2
  65. package/dist/components/sortable-list/styles.css +1 -0
  66. package/dist/components/surface/Surface.vue.d.ts +4 -1
  67. package/dist/components/tabs/composables/useTabDragMorph.d.ts +4 -7
  68. package/dist/components/tabs/styles/segmented.css +1 -1
  69. package/dist/components/tabs/types.d.ts +7 -8
  70. package/dist/composables/glass/fieldPaint.d.ts +4 -0
  71. package/dist/composables/glass/useGlassBackdropLuminance.d.ts +7 -6
  72. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +8 -0
  73. package/dist/composables/motion/core/motionTempo.d.ts +2 -1
  74. package/dist/composables/motion/morph/useDragMorph.d.ts +2 -2
  75. package/dist/composables/motion/morph/useSelectionGroup.d.ts +6 -25
  76. package/dist/composables/motion/morph/useSelectionIndicator.d.ts +8 -54
  77. package/dist/composables/motion/spring/useLiquidFlex.d.ts +3 -5
  78. package/dist/composables/motion/spring/useSpringMount.d.ts +0 -9
  79. package/dist/{configurator-Dl10mc3L.js → configurator-C1ZKEf1b.js} +7 -5
  80. package/dist/configurator.css +1 -0
  81. package/dist/configurator.js +1 -1
  82. package/dist/constants-DfrO-IaH.js +8 -0
  83. package/dist/constellation.css +1 -0
  84. package/dist/constellation.js +2 -1
  85. package/dist/control.css +1 -0
  86. package/dist/{control.css_vue_type_style_index_0_src_true_lang-BIdufaDG.js → control.css_vue_type_style_index_0_src_true_lang-D2hdtjs4.js} +1 -0
  87. package/dist/{createCanvasLifecycle-hJHobVTn.js → createCanvasLifecycle-DS0vEs_G.js} +76 -75
  88. package/dist/dark-mode-toggle.js +1 -1
  89. package/dist/{data-table-DQuWkiwL.js → data-table-lDykVYuo.js} +1 -0
  90. package/dist/data-table.css +1 -0
  91. package/dist/data-table.js +1 -1
  92. package/dist/{deck-Cm_VmyNL.js → deck-Bc-2mEKE.js} +1 -0
  93. package/dist/deck.js +1 -1
  94. package/dist/dialog.js +1 -1
  95. package/dist/dock-trigger.d.ts +1 -0
  96. package/dist/dock-trigger.js +88 -0
  97. package/dist/dock.js +677 -689
  98. package/dist/easing.js +4 -4
  99. package/dist/expandable-container-wS1awXGd.js +135 -0
  100. package/dist/expandable-container.css +1 -0
  101. package/dist/expandable-container.js +1 -1
  102. package/dist/{fading-scroll-ClCPooXb.js → fading-scroll-D3Y20ibL.js} +1 -1
  103. package/dist/fading-scroll.js +1 -1
  104. package/dist/fieldPaint-Ci77oajZ.js +7 -0
  105. package/dist/fourier-field.css +1 -0
  106. package/dist/fourier-field.js +15 -13
  107. package/dist/glSetup-DMaDgrEj.js +577 -0
  108. package/dist/glass-ui.js +66 -65
  109. package/dist/handmark.css +1 -0
  110. package/dist/handmark.js +82 -71
  111. package/dist/index.css +1 -0
  112. package/dist/index.d.ts +1 -1
  113. package/dist/{input-eLZ_AU7l.js → input-BLF2pMHE.js} +1 -1
  114. package/dist/input.js +1 -1
  115. package/dist/{label-CE03H1KL.js → label-ryNPL7e6.js} +1 -0
  116. package/dist/label.css +1 -0
  117. package/dist/label.js +1 -1
  118. package/dist/labeled-field.css +1 -0
  119. package/dist/labeled-field.js +5 -4
  120. package/dist/{menu-DaYAZiVW.js → menu-C_l2Sslf.js} +162 -112
  121. package/dist/menu.js +3 -3
  122. package/dist/metric.js +1 -0
  123. package/dist/motion-core.js +138 -44
  124. package/dist/motion-lHDAQHEE.js +91 -0
  125. package/dist/motion.js +5 -5
  126. package/dist/motionTempo-DXdVbCWr.js +13 -0
  127. package/dist/music-staff.js +1 -0
  128. package/dist/{number-field-RP89046a.js → number-field-BXFUP49Z.js} +3 -2
  129. package/dist/number-field.css +1 -0
  130. package/dist/number-field.js +1 -1
  131. package/dist/pager-dots.css +1 -0
  132. package/dist/pager-dots.js +3 -2
  133. package/dist/participation-C5y5VZTN.js +52 -0
  134. package/dist/{popover-BdpoE4Ar.js → popover-DQUmwuAa.js} +3 -2
  135. package/dist/popover.js +1 -1
  136. package/dist/{progress-eVa-mc7J.js → progress-BUn0Bw7Z.js} +1 -0
  137. package/dist/progress.css +1 -0
  138. package/dist/progress.js +1 -1
  139. package/dist/{radio-group-B58Bz16F.js → radio-group-xdEy2tdi.js} +1 -0
  140. package/dist/radio-group.css +1 -0
  141. package/dist/radio-group.js +1 -1
  142. package/dist/root-scroll-lock-DJFrQhMa.js +22 -0
  143. package/dist/select-Dt5dXm87.js +309 -0
  144. package/dist/select.js +1 -1
  145. package/dist/{separator-D4EZM10u.js → separator-C4y9p_ky.js} +1 -0
  146. package/dist/separator.css +1 -0
  147. package/dist/separator.js +1 -1
  148. package/dist/sheet-DLqNUIZl.js +347 -0
  149. package/dist/sheet-width-DgXgJNa5.js +18 -0
  150. package/dist/sheet.js +2 -2
  151. package/dist/{slider-5uoY-cLG.js → slider-CZiKrWGg.js} +8 -8
  152. package/dist/slider.js +1 -1
  153. package/dist/sortable-list.js +2 -1
  154. package/dist/{status-dot-W4LFiJps.js → status-dot-BDZKcRxy.js} +2 -1
  155. package/dist/status-dot.css +1 -0
  156. package/dist/status-dot.js +1 -1
  157. package/dist/styles/components.css +1 -1
  158. package/dist/styles/glass/glass-capsule.css +1 -1
  159. package/dist/styles/glass/glass-chip.css +1 -1
  160. package/dist/styles/glass/mark.css +1 -1
  161. package/dist/styles/glass/overlay-plate.css +1 -1
  162. package/dist/styles/glass/surface-axis.css +1 -1
  163. package/dist/styles/index.css +1 -1
  164. package/dist/styles/theme/radius.css +1 -1
  165. package/dist/styles/tokens/color-radius.css +1 -1
  166. package/dist/styles/tokens/manifest.d.ts +1 -1
  167. package/dist/styles/tokens/scale-paper.css +1 -1
  168. package/dist/styles/utilities/base-misc.css +1 -1
  169. package/dist/surface.js +1 -1
  170. package/dist/{switch-BYUZ6g9G.js → switch-DLfGYU35.js} +1 -0
  171. package/dist/switch.css +1 -0
  172. package/dist/switch.js +1 -1
  173. package/dist/tabs-NgTRPGZx.js +229 -0
  174. package/dist/tabs.js +1 -1
  175. package/dist/textarea.js +1 -1
  176. package/dist/timeline.css +1 -0
  177. package/dist/timeline.js +4 -3
  178. package/dist/toggle-group-DgXcJGD6.js +129 -0
  179. package/dist/toggle-group.css +1 -0
  180. package/dist/toggle-group.js +1 -1
  181. package/dist/tokens.js +2 -0
  182. package/dist/{tooltip-CZVubnJf.js → tooltip-Do3qCw0r.js} +1 -1
  183. package/dist/tooltip.js +1 -1
  184. package/dist/typewriter.css +1 -0
  185. package/dist/typewriter.js +1 -0
  186. package/dist/uniformBridge-CJyy7NOn.js +150 -0
  187. package/dist/useBarShape-CmP35Z8o.js +24 -0
  188. package/dist/{useCanvas2D-CQRElMyE.js → useCanvas2D-Bhpwua98.js} +1 -1
  189. package/dist/{useDockCtaReceive-BSSgD6mu.js → useDockCtaReceive-Dn_-paqP.js} +1 -1
  190. package/dist/{useDragMorph-B363RUbF.js → useDragMorph-BEI74U0t.js} +51 -40
  191. package/dist/{color.wgsl-BTszLY39.js → useGpuSubstrate-Y5XAdU8d.js} +7 -7
  192. package/dist/{useLiquidPress-h1scrPtP.js → useLiquidPress-D5mjZC6U.js} +2 -2
  193. package/dist/useScrollChrome-DMP6kDI9.js +67 -0
  194. package/dist/useSelectionGroup-DAQv5Lb5.js +186 -0
  195. package/dist/{useSpring-9u2_shxV.js → useSpring-Aof0nTRt.js} +1 -1
  196. package/dist/useSpringMount-jgNkymRl.js +73 -0
  197. package/dist/wgpuSetup-CFuqd_RP.js +1278 -0
  198. package/package.json +8 -1
  199. package/dist/DialogContent-CwIBvou_.js +0 -157
  200. package/dist/DropdownMenuTrigger-CKRnhDSQ.js +0 -93
  201. package/dist/button-BOFTUPyU.js +0 -110
  202. package/dist/composables/motion/morph/eyeglass.d.ts +0 -141
  203. package/dist/expandable-container-CZUj9BzY.js +0 -142
  204. package/dist/glass-ui.css +0 -2
  205. package/dist/motion-BvV1_24p.js +0 -61
  206. package/dist/motionTempo-tscp92Nm.js +0 -7
  207. package/dist/participation-B7UFdgXB.js +0 -55
  208. package/dist/select-BiF0FCZf.js +0 -292
  209. package/dist/sheet-DmJxgAHc.js +0 -345
  210. package/dist/tabs-C5sC0fBE.js +0 -269
  211. package/dist/toggle-group-CC5b3o1R.js +0 -125
  212. package/dist/useScrollChrome-BJbWV32F.js +0 -162
  213. package/dist/useSelectionGroup-zsEwitF6.js +0 -291
  214. package/dist/useSpringMount-OA-0mTNv.js +0 -73
@@ -0,0 +1,30 @@
1
+ import { _ as e, g as t, h as n } from "./color-HkUaTAJj.js";
2
+ //#region src/components/aurora/composables/auroraImageSource.ts
3
+ function r(e) {
4
+ let n = null, r = null, i;
5
+ return {
6
+ getDecodedImage: () => n,
7
+ setImageUploader(e) {
8
+ r = e, e && n && e(n);
9
+ },
10
+ ensureDecoded(a) {
11
+ a.source !== "image" || a.src == null || a.src !== i && (i = a.src, t(a.src).then((t) => {
12
+ n = t, r?.(t), e.wake();
13
+ }).catch((t) => {
14
+ e.onError?.(t instanceof Error ? t : Error(String(t)));
15
+ }));
16
+ }
17
+ };
18
+ }
19
+ function i(t, r, i) {
20
+ let a = null;
21
+ t.activeTexture(t.TEXTURE0);
22
+ let o = (n) => {
23
+ t.useProgram(r), t.activeTexture(t.TEXTURE0), a && t.deleteTexture(a), a = e(t, n);
24
+ };
25
+ return o(i.getDecodedImage() ?? n()), i.setImageUploader(o), () => {
26
+ a && t.deleteTexture(a), i.setImageUploader(null);
27
+ };
28
+ }
29
+ //#endregion
30
+ export { r as n, i as t };
package/dist/axes.js CHANGED
@@ -3,38 +3,38 @@ var e = [
3
3
  "glass",
4
4
  "veil",
5
5
  "opaque"
6
- ], t = [
6
+ ], t = ["live", "static"], n = [
7
7
  "wash",
8
8
  "quiet",
9
9
  "resting",
10
10
  "floating",
11
11
  "overlay"
12
- ], n = [
12
+ ], r = [
13
13
  "xs",
14
14
  "sm",
15
15
  "md",
16
16
  "lg",
17
17
  "xl"
18
- ], r = ["horizontal", "vertical"], i = [
18
+ ], i = ["horizontal", "vertical"], a = [
19
19
  "full",
20
20
  "reduced",
21
21
  "off"
22
- ], a = [
22
+ ], o = [
23
23
  "neutral",
24
24
  "success",
25
25
  "warning",
26
26
  "info",
27
27
  "destructive"
28
- ], o = [
28
+ ], s = [
29
29
  "center",
30
30
  "top",
31
31
  "right",
32
32
  "bottom",
33
33
  "left"
34
- ], s = [
34
+ ], c = [
35
35
  "click",
36
36
  "hover",
37
37
  "context"
38
- ], c = ["scrim", "graded"];
38
+ ], l = ["scrim", "graded"];
39
39
  //#endregion
40
- export { c as BACKDROPS, i as MOTIONS, r as ORIENTATIONS, o as PLACEMENTS, n as SIZES, e as SURFACES, t as SURFACE_TIERS, a as TONES, s as TRIGGERS };
40
+ export { l as BACKDROPS, t as BACKDROP_MODES, a as MOTIONS, i as ORIENTATIONS, s as PLACEMENTS, r as SIZES, e as SURFACES, n as SURFACE_TIERS, o as TONES, c as TRIGGERS };
package/dist/blob.css ADDED
@@ -0,0 +1 @@
1
+ @layer theme, base, components, utilities;@layer components{.goo-blob-wrapper[data-v-8b05f03a]{aspect-ratio:1;z-index:var(--z-content);pointer-events:none;contain:layout style;content-visibility:auto;contain-intrinsic-size:auto none;filter:drop-shadow(var(--blob-shadow-ambient)) drop-shadow(var(--blob-shadow-contact));transition:filter var(--duration-slow,.45s) var(--ease-standard,ease);position:relative;overflow:visible}.goo-blob-wrapper[data-v-8b05f03a]:hover{filter:drop-shadow(var(--blob-shadow-hover)) drop-shadow(var(--blob-shadow-contact-hover))}.goo-blob-canvas[data-v-8b05f03a]{will-change:transform;pointer-events:none;width:160%;height:160%;display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.goo-blob-hit[data-v-8b05f03a]{pointer-events:auto;cursor:pointer;clip-path:circle(var(--blob-hit-radius,50%));background:0 0;border:0;border-radius:50%;margin:0;padding:0;position:absolute;inset:0}.goo-blob-hit[data-v-8b05f03a]:focus-visible{background:radial-gradient(circle, transparent calc(var(--blob-hit-radius) - 3px), var(--focus-ring-color) calc(var(--blob-hit-radius) - 3px), var(--focus-ring-color) var(--blob-hit-radius), transparent var(--blob-hit-radius));outline:none}.goo-blob-hit[data-v-8b05f03a]:disabled{cursor:default}@media (prefers-reduced-motion:reduce){.goo-blob-wrapper[data-v-8b05f03a]{filter:drop-shadow(var(--blob-shadow-ambient)) drop-shadow(var(--blob-shadow-contact))!important;transition:none!important}}}
package/dist/blob.js CHANGED
@@ -1,12 +1,15 @@
1
+ import "./blob.css";
1
2
  import { t as e } from "./useResolveTokenColor-B2FfJnd9.js";
2
3
  import { t } from "./_plugin-vue_export-helper-B3ysoDQm.js";
3
4
  import { t as n } from "./usePointerVelocityField-Lx26_Yap.js";
4
5
  import { a as r, i, n as a, o, r as s, t as c } from "./presets-5myqNv59.js";
5
6
  import { cssToOklch as l, oklchToGammaRgb as u } from "./color.js";
6
- import { n as d, o as f, r as p, s as m, t as h, u as g } from "./color.glsl-DTJhdekG.js";
7
- import { a as _, n as v, r as y, t as b } from "./color.wgsl-BTszLY39.js";
8
- import { a as x } from "./rendererStatus-BxUlBLVy.js";
9
- import { n as S, t as C } from "./prng-2uS6J_A1.js";
7
+ import { r as d } from "./budget-CJfhLIIV.js";
8
+ import { t as f } from "./useGpuSubstrate-Y5XAdU8d.js";
9
+ import { a as p } from "./rendererStatus-BxUlBLVy.js";
10
+ import { n as m, t as h } from "./prng-2uS6J_A1.js";
11
+ import { n as g, o as _, r as v, s as y, t as b } from "./color.glsl-bFJm8k5R.js";
12
+ import { n as x, r as S, t as C } from "./color.wgsl-B-qDJ_OM.js";
10
13
  import { computed as w, createCommentVNode as T, createElementBlock as E, createElementVNode as D, defineComponent as O, inject as k, normalizeStyle as A, onScopeDispose as j, onUnmounted as M, openBlock as N, readonly as P, ref as F, shallowRef as I, useTemplateRef as L, watch as R } from "vue";
11
14
  import { SpringProgress as z } from "@mkbabb/keyframes.js";
12
15
  //#region src/components/blob/constants.ts
@@ -316,7 +319,7 @@ function Q(e, t, n, r) {
316
319
  e.phase = t, e.phaseStart = n, e.phaseDuration = r;
317
320
  }
318
321
  function xe(e, t) {
319
- let n = S(C(t + "goo")), r = [], i = [], a = [], o = -Infinity, s = e.geometry.orbitRadius, c = -1, l = null;
322
+ let n = m(h(t + "goo")), r = [], i = [], a = [], o = -Infinity, s = e.geometry.orbitRadius, c = -1, l = null;
320
323
  function u() {
321
324
  let t = e.geometry.orbitRadius;
322
325
  if (t !== s && s > 0) {
@@ -419,17 +422,17 @@ function xe(e, t) {
419
422
  function p() {
420
423
  for (let e of r) e.phaseOffset += (n() - .5) * .6, e.pertXPhase += n() * Math.PI, e.pertYPhase += n() * Math.PI;
421
424
  }
422
- function m(e) {
423
- n = S(C(e + "goo"));
425
+ function g(e) {
426
+ n = m(h(e + "goo"));
424
427
  }
425
- function h(e) {
428
+ function _(e) {
426
429
  l = e;
427
430
  }
428
- function g() {
431
+ function v() {
429
432
  for (let e of r) if (e.phase !== "orbiting") return !1;
430
433
  return !0;
431
434
  }
432
- function _(e) {
435
+ function y(e) {
433
436
  let t = Infinity;
434
437
  for (let e of r) {
435
438
  let n = e.phaseStart + e.phaseDuration;
@@ -441,10 +444,10 @@ function xe(e, t) {
441
444
  sources: i,
442
445
  tick: f,
443
446
  nudge: p,
444
- reseed: m,
445
- onPinch: h,
446
- isQuiescent: g,
447
- nextEventMs: _
447
+ reseed: g,
448
+ onPinch: _,
449
+ isQuiescent: v,
450
+ nextEventMs: y
448
451
  };
449
452
  }
450
453
  //#endregion
@@ -502,7 +505,7 @@ vec3 fbmWarpedG(vec2 p, int octaves, float warpAmp) {
502
505
  return fbmG(p + warpAmp * (q - 0.5), octaves);
503
506
  }
504
507
  `, Oe = "// Edit #4's gamut step — hue-preserving inward chroma clamp. If the linear result\n// is out of [0,1], bisect chroma toward 0 (L + h fixed) until in gamut. Preserves\n// hue exactly (only C shrinks). 16 steps resolve C to < 2^-16 of its span.\nbool inGamut(vec3 lin) {\n return all(greaterThanEqual(lin, vec3(0.0))) && all(lessThanEqual(lin, vec3(1.0)));\n}\nvec3 gamutClampOklch(vec3 lch) {\n vec3 lin = oklabToLinearSrgb(oklchToOklab(lch));\n if (inGamut(lin)) return lch;\n float lo = 0.0;\n float hi = lch.y;\n for (int i = 0; i < 16; i++) {\n float mid = 0.5 * (lo + hi);\n vec3 test = vec3(lch.x, mid, lch.z);\n if (inGamut(oklabToLinearSrgb(oklchToOklab(test)))) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return vec3(lch.x, lo, lch.z);\n}", ke = "#version 300 es\nprecision highp float;\n\nin vec2 vUv;\nout vec4 fragColor;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec3 uBaseColor;\n\n// Multi-stop palette — 2-4 in-family OKLCh stops (uploaded GAMMA sRGB, like\n// uBaseColor). uStopCount <= 1 falls back to uBaseColor (the single-color default,\n// zero regression). MAX_BLOB_STOPS is a compile-time #define.\n#define MAX_BLOB_STOPS 4\nuniform int uStopCount;\nuniform vec3 uPalette[MAX_BLOB_STOPS];\n\n// Pointer\nuniform vec2 uPointer;\nuniform float uPointerActive;\nuniform float uPointerAttraction;\nuniform float uPointerStrength;\n\n// Main body\nuniform float uBodyRadius;\n\n// Pulsation\nuniform float uPulsePhase;\nuniform float uPulseAmp;\n\n// Surface noise\nuniform float uNoiseAmp;\nuniform float uNoiseFreq;\nuniform float uNoiseSpeed;\n\n// Gooey\nuniform float uSmoothK;\nuniform float uMerge; // 0 = quadratic smin, 1 = circular smin (rounder menisci)\n\n// The stripped-surface gate. 1.0 = the flat shadowless fill-only floor; 0.0 = the\n// dressed pipeline. It is derived from the single uMorphT surface scalar.\nuniform float uStage;\n\n// The blob-to-meatball shading-morph scalar. 0.0 = the flat blob\n// fill (byte-identical to the STAGE-1 floor), 1.0 = the fully-dressed lit meatball; the\n// in-between LERPS the surface shading (NOT the geometry — the smin field is shared). The\n// renderer clamps it from config.morphT. Animating 0 to 1 gets the live morph.\nuniform float uMorphT;\n\n// The pre-FBM bounding-discard radius in UV space. main() early-outs\n// to a transparent write for any fragment OUTSIDE this radius BEFORE the two 3-octave\n// FBM calls + the OKLCh round-trip. The renderer uploads it PADDED by every\n// outward-expanding term (body + eccentric orbit + sat radius + smin band + FBM edge\n// amplitude + click-pulse + a lean/squash safety pad) so it NEVER clips the wet\n// meniscus (IQ: inflate the bound to match any outward op).\nuniform float uMaxReach;\n\n// Membrane — domain-warp strength on the FBM edge displacement (0 = plain fbm).\nuniform float uWarpAmp;\n\n// Lit glass surface — gated behind uLit so the flat fill stays default.\nuniform float uLit; // 0 = flat fill (default), 1 = lit droplet\nuniform vec3 uRimColor; // Fresnel rim tint (GAMMA sRGB, via the /color leaf)\nuniform vec3 uLightDir; // normalized light direction (x, y, z)\nuniform float uSpecStrength; // Blinn-Phong specular weight\nuniform float uSpecShininess; // specular exponent (16-64, tight glint)\nuniform float uRimPower; // Fresnel/Schlick exponent (~2-3)\nuniform float uRimStrength; // Fresnel rim weight\n\n// The procedural 2D SDF soft-shadow march, the GLSL twin of\n// the WGSL res.z/res.w lanes). uShadow gates the IQ rmshadows soft contact shadow that\n// FOLLOWS the irregular silhouette; uShadowSoftness is the penumbra hardness (4-48).\nuniform float uShadow; // 0 = no shadow, 1 = the soft contact shadow ON\nuniform float uShadowSoftness; // penumbra hardness (inverse light-source size, 4-48)\n\n// Iridescence + fake subsurface — translucent-gel read.\nuniform float uIridescence; // warm-pearl rim sheen weight (0 = off)\nuniform float uIridHue; // base hue (radians) the cosine palette biases toward (warm)\nuniform float uIridSpeed; // animated-thickness scroll for the iridescent t\nuniform float uSssScale; // fast-SSS back-light weight\nuniform float uSssPower; // fast-SSS exponent\nuniform float uCoreGlow; // thickness-driven inner-luminosity lift\n\n// Color perturbation (perceptually uniform — OKLCh L/C/h)\nuniform float uHueRange; // degrees of hue swing (converted to radians)\nuniform float uSatShift; // OKLCh chroma swing\nuniform float uBrightnessShift; // OKLCh lightness bias\nuniform float uColorNoiseFreq;\nuniform float uColorNoiseSpeed;\n\n// Satellites (max 4)\n#define MAX_SATS 4\nuniform int uSatCount;\nuniform vec2 uSatPos[MAX_SATS];\nuniform float uSatRadius[MAX_SATS];\nuniform float uSatOpacity[MAX_SATS];\n\n// The per-satellite explicit-shade seam widens the GL color contract for the hero blob.\n// uSatColorActive == 0 is the default (the derived\n// palette shade, UNCHANGED): blendSatColor() early-returns and touches\n// nothing. When a consumer supplies explicit per-satellite shades (uSatColor[i], GAMMA\n// sRGB, at uSatColorAmt[i] weight — typically 1) the fragment blends the base palette\n// OKLCh toward each satellite's shade, weighted by that satellite's smin-field proximity\n// at this pixel. The body keeps the derived base (the ask is per-SATELLITE).\nuniform int uSatColorActive;\nuniform vec3 uSatColor[MAX_SATS];\nuniform float uSatColorAmt[MAX_SATS];\n\n// Pointer trail — a decaying-radius pseudopod toward the cursor. uTrail is a\n// COMPILE-TIME-SIZED array (GLSL ES 3.00 forbids a uniform-sized array) with a\n// DYNAMIC break on uTrailCount, mirroring the satellite loop. Later samples paint\n// smaller metaballs (r *= 1 - i/N) so the trail tapers into a tail.\n#define TRAIL_N 15\nuniform int uTrailCount;\nuniform vec2 uTrailPos[TRAIL_N];\nuniform float uTrailRadius[TRAIL_N];\n\n// Velocity-driven volume-preserving squash-and-stretch.\nuniform vec2 uVelocity; // smoothed pointer velocity (motion direction + speed)\nuniform float uStretch; // squash-stretch magnitude (0 = off)\n\nconst float PI = 3.141592653589793;\n", Ae = "\n", je = ke + Ae + we + `
505
- ${h}
508
+ ${b}
506
509
 
507
510
  ` + De + Ae + Ce + `
508
511
 
@@ -514,12 +517,12 @@ ${h}
514
517
  // ONCE so the OETF can never diverge from aurora's; the line-for-line TS port
515
518
  // (__tests__/metaball-color.glsl-port.ts) mirrors that chunk. The gamut-clamp
516
519
  // below stays blob-local (aurora has no in-shader OKLCh path).
517
- ${d}
518
- ${p}
520
+ ${g}
521
+ ${v}
519
522
 
520
523
  ` + Oe + "\n\n// De-synced breath. The body throb was a single sin(uPulsePhase), a\n// mechanical pulse that re-syncs every cycle. Three DETUNED sines at IRRATIONAL\n// frequency ratios (1, 0.13/0.09 ≈ 1.444, 0.31) never re-phase, so the membrane\n// breathes like a living creature (an asymmetric slower-exhale calm band) rather\n// than a metronome. Normalized so the composite stays in ~[-1, 1].\nfloat breath(float phase) {\n return (sin(phase)\n + 0.5 * sin(phase * 1.4444 + 1.7)\n + 0.28 * sin(phase * 0.31 + 4.1)) / 1.78;\n}\n\n// The composite SDF field with its analytic gradient, returned as\n// vec3(dist, ∂d/∂x, ∂d/∂y). The domain-warped body membrane smin-merged with the\n// satellites + trail; the gradient propagates through sminG's mix(a.yz, b.yz, h)\n// so the surface normal reads the field gradient DIRECTLY (the 4-tap finite\n// difference is DELETED — its 4 full evals per lit pixel are gone).\n//\n// The ANISOTROPIC SQUASH (volume-preserving stretch) is a linear map\n// bodyUv = D·R·uv (R rotates world→(motion-axis, perp); D = diag(1/sa, sa)). The\n// body field's gradient is computed in bodyUv space, so it MUST be transformed back\n// to uv space by M^T = R^T·D (the inverse-transpose handling the SOTA-deepening [2]\n// warns the 4-tap did implicitly by sampling in screen space).\nvec3 sceneDistG(vec2 uv) {\n // De-synced pulsing body radius.\n float bodyR = uBodyRadius + breath(uPulsePhase) * uPulseAmp;\n\n // Velocity-driven, volume-preserving squash-and-stretch with saturated amplitude.\n // sa is the stretch along motion, exactly 1/sa perpendicular (area-preserving).\n // The basis (ax, perp) is captured so the gradient can be transformed back below.\n //\n // The form sa = 1 + speed*uStretch rode an UNBOUNDED critically-damped spring\n // velocity (O(5-8)/s on a fast flick) -> sa ~ 1.78-2.25x elongation, a violent\n // taffy-pull. A tanh saturation sa = 1 + tanh(speed*k)*uStretch caps the elongation\n // at 1 + uStretch (~1.5x at the default stretch 0.5) no matter how fast the flick —\n // the fastest flick reads as a lively bounce, never a rubber-band snap (the standard\n // volume-preserving squash-and-stretch restraint). k = 1.6 keeps the tanh in its\n // near-linear regime for a slow drag (the gentle squash still reads) and saturates\n // only the fast flick.\n vec2 bodyUv = uv;\n vec2 ax = vec2(1.0, 0.0);\n vec2 perp = vec2(0.0, 1.0);\n float sa = 1.0;\n float speed = length(uVelocity);\n bool squashed = uStretch > 0.0 && speed > 1e-4;\n if (squashed) {\n ax = uVelocity / speed;\n perp = vec2(-ax.y, ax.x);\n sa = 1.0 + tanh(speed * 1.6) * uStretch;\n bodyUv = vec2(dot(uv, ax) / sa, dot(uv, perp) * sa);\n }\n\n // Domain-warped FBM displacement WITH its analytic gradient (the warp-Jacobian\n // approximation per [2]). disp = (noiseVal - 0.5) · uNoiseAmp; its gradient in\n // bodyUv space is uNoiseAmp · uNoiseFreq · fbmGrad (the uNoiseFreq chain factor\n // from the bodyUv·uNoiseFreq argument).\n vec3 fbmv = fbmWarpedG(bodyUv * uNoiseFreq + uTime * uNoiseSpeed, 3, uWarpAmp);\n float bodyDisplacement = (fbmv.x - 0.5) * uNoiseAmp;\n vec2 dispGradBody = uNoiseAmp * uNoiseFreq * fbmv.yz;\n\n // Body circle WITH gradient (in bodyUv space). The displaced radius subtracts\n // the displacement, so the body gradient is circleGrad - dispGrad (sign per\n // [2]: d = circleDist - displacement ⇒ grad = circleGrad - dispGrad).\n vec3 bodyG = sdgCircle(bodyUv, vec2(0.0), bodyR + bodyDisplacement);\n vec2 bodyGradBody = bodyG.yz - dispGradBody;\n\n // Transform the body gradient back to uv space: g_uv = R^T · D · g_body, i.e.\n // scale by D = diag(1/sa, sa) in the (ax, perp) frame then reconstruct in world.\n vec2 bodyGradUv;\n if (squashed) {\n vec2 scaled = vec2(bodyGradBody.x / sa, bodyGradBody.y * sa);\n bodyGradUv = scaled.x * ax + scaled.y * perp;\n } else {\n bodyGradUv = bodyGradBody;\n }\n vec3 d = vec3(bodyG.x, bodyGradUv);\n\n // Satellites — smin-merged into the body (uMerge selects quadratic/circular).\n for (int i = 0; i < MAX_SATS; i++) {\n if (i >= uSatCount) break;\n vec3 satG = sdgCircle(uv, uSatPos[i], uSatRadius[i]);\n satG.x += (1.0 - uSatOpacity[i]) * 0.3;\n d = sminG(d, satG, uSmoothK);\n }\n\n // Pointer trail — a decaying-radius pseudopod reaching toward the cursor,\n // smin-merged so it stretches an elastic limb and snaps back.\n for (int i = 0; i < TRAIL_N; i++) {\n if (i >= uTrailCount) break;\n vec3 trailG = sdgCircle(uv, uTrailPos[i], uTrailRadius[i]);\n d = sminG(d, trailG, uSmoothK);\n }\n return d;\n}\n\n// The analytic surface normal. The field gradient grad2d arrives\n// DIRECTLY from sceneDistG (no 4-tap). The smin field is sub-unit (the CD family\n// |grad| ≤ 1) so the gradient is NOT unit-length — normalize() before the dome\n// lift (the unit contract is on the FINAL lifted normal N, not the raw field\n// gradient). The Z dome: 'interior' is the normalized depth inward from the rim\n// (-d/bodyR); z = sqrt(1 - (1 - interior)^2) is the unit half-sphere profile (flat\n// centre, steep rim). N tilts outward along the field gradient near the rim and\n// points at the viewer deep inside.\nvec3 surfaceNormalFromGrad(vec2 grad2d, float d, float bodyR) {\n vec2 g = normalize(grad2d + vec2(1e-6));\n float interior = clamp(-d / max(bodyR, 1e-4), 0.0, 1.0);\n float z = sqrt(max(0.0, 1.0 - (1.0 - interior) * (1.0 - interior)));\n return normalize(vec3(g * (1.0 - z), z) + vec3(0.0, 0.0, 1e-6));\n}\n\n// The 2D SDF soft-shadow march (IQ rmshadows improved penumbra,\n// research/viz/goo-blob.md §2.3, §5). The GLSL twin of the WGSL softShadow2D — a procedural\n// soft contact shadow FOLLOWING the irregular metaball silhouette (NOT a hard disc/box\n// shadow). Marches from ro along rd (the in-plane projection of uLightDir),\n// accumulating the closest miss via the Aaltonen penumbra (y = h*h/(2*ph) + d =\n// sqrt(h*h - y*y)) that kills the banding the naive res = min(res, h/(w*t)) shows. CHEAP:\n// 24 steps, re-uses the SAME sceneDistG().x field (NO separate field re-eval, NO FBO/\n// multi-pass — the procedural field needs none). w is the penumbra hardness (inverse\n// light-source size -> uShadowSoftness). Derivative-FREE. Returns 1.0 (lit) -> 0.0 (occluded).\nfloat softShadow2D(vec2 ro, vec2 rd, float mint, float maxt, float w) {\n float res = 1.0;\n float ph = 1e20;\n float t = mint;\n for (int i = 0; i < 24; i++) {\n if (t >= maxt) break;\n float h = sceneDistG(ro + rd * t).x;\n if (h < 0.001) return 0.0;\n float y = h * h / (2.0 * ph);\n float dd = sqrt(max(h * h - y * y, 0.0));\n res = min(res, dd / (w * max(0.001, t - y)));\n ph = h;\n t += h;\n }\n return clamp(res, 0.0, 1.0);\n}\n\n// Sample the multi-stop palette at t in [0,1], interpolating adjacent\n// stops in OKLab with a MIDPOINT CHROMA-BUMP (a linear OKLab mix of a vivid pair\n// dips chroma through grey; the bump lifts it back). Falls back to uBaseColor when\n// uStopCount <= 1. Returns an OKLCh stop [L, C, h(rad)].\nvec3 samplePaletteOklch(float t) {\n if (uStopCount <= 1) return oklabToOklch(srgbToOklab(uBaseColor));\n float n = float(uStopCount);\n float ft = clamp(t, 0.0, 1.0) * (n - 1.0);\n int i0 = int(floor(ft));\n int i1 = min(i0 + 1, uStopCount - 1);\n float f = ft - float(i0);\n // Fetch adjacent stops (uPalette is gamma sRGB) → OKLab.\n vec3 labA = srgbToOklab(uPalette[i0]);\n vec3 labB = srgbToOklab(uPalette[i1]);\n vec3 lab = mix(labA, labB, f);\n vec3 lch = oklabToOklch(lab);\n // Midpoint chroma-bump: a bell (peaks at f=0.5) lifts C off the grey midpoint.\n lch.y += 0.03 * sin(PI * f);\n return lch;\n}\n\n// The per-satellite explicit-shade blend widens the GL color contract for the hero blob.\n// It is off by default: uSatColorActive == 0 returns oklch\n// UNCHANGED (uniform control flow, zero cost). When ON, each\n// satellite carrying a positive uSatColorAmt tints the fragments in its smin-field\n// neighbourhood toward its explicit shade — mixed in OKLab (the samplePaletteOklch\n// convention; no hue wrap). The proximity weight rides the SAME opacity-inflated distance\n// the sceneDistG satellite term uses, so a fading satellite's tint fades with it. The\n// body keeps the derived palette base (no uBodyColor fork — the ask is per-SATELLITE).\nvec3 blendSatColor(vec3 oklch, vec2 uv) {\n if (uSatColorActive == 0) return oklch;\n vec3 lab = oklchToOklab(oklch);\n for (int i = 0; i < MAX_SATS; i++) {\n if (i >= uSatCount) break;\n float amt = clamp(uSatColorAmt[i], 0.0, 1.0);\n if (amt <= 0.0) continue;\n // Proximity: 1 well inside satellite i, fading to 0 across the smin band. The\n // opacity-inflated distance matches sceneDistG's satellite term.\n float di = sdCircle(uv, uSatPos[i], uSatRadius[i]) + (1.0 - uSatOpacity[i]) * 0.3;\n float w = (1.0 - smoothstep(-uSatRadius[i], uSmoothK, di)) * amt;\n lab = mix(lab, srgbToOklab(uSatColor[i]), clamp(w, 0.0, 1.0));\n }\n return oklabToOklch(lab);\n}\n\nvoid main() {\n vec2 uv = vUv - 0.5;\n\n // Pre-FBM bounding early-out. The oversized canvas (1.6x the\n // wrapper) runs the full fragment ALU — two 3-octave FBM evals + the OKLCh\n // round-trip + the lit/iridescence/SSS block — on a large transparent border\n // otherwise (~60% of the canvas is outside the droplet reach). Any fragment beyond\n // uMaxReach (the PADDED worst-case painted reach, uploaded so it never clips the\n // wet meniscus) writes transparent and returns BEFORE any of that work. This is a\n // transparent WRITE, NOT a GLSL discard: the pass is a pure premultiplied blend\n // with no depth, and discard disables the tiled-renderer fast path on mobile GPUs.\n // No fwidth is computed before the return, so there is no\n // derivative-in-non-uniform-control-flow hazard (the kept pixels compute their own\n // fwidth normally below). The pad covers the pointer-lean uv shift, so testing the\n // pre-deform uv is safe.\n if (dot(uv, uv) > uMaxReach * uMaxReach) {\n fragColor = vec4(0.0);\n return;\n }\n\n // Pointer deformation — honor the SIGN of uPointerAttraction: a positive\n // attraction leans the body IN toward the cursor, a negative shies it AWAY. The\n // signed influence flows straight into the UV shift (no hardcoded repulsion).\n //\n // The sign was inverted in the rendered result. The\n // sample-shift sign here was uv -= dir*influence; the live readback (an attraction\n // sweep over a HELD pointer) measured the body shifting MORE toward the cursor as\n // attraction went MORE NEGATIVE (a=-1 -> +0.081, a=0 -> +0.063, a=+1 -> +0.042) —\n // exactly inverted: a shy-away -1 LUNGED at the cursor, a lean-in +1 pulled back.\n // pointerDir = uPointer - uv is the toward-pointer direction in SAMPLE space; to\n // MOVE the rendered body TOWARD the pointer the sample must shift ALONG pointerDir\n // (sample the field from where the pointer is), so the sign is uv += dir*influence.\n // A positive attraction now shifts the body toward the cursor (leans in), a negative\n // shifts it away (shies) — the sign the comment + the demo slider always promised,\n // now true in the render.\n //\n // The falloff radius narrows from 0.65 to 0.5 for a calmer lean.\n // The REDRESS widened it to 0.65 to clear a synthetic floor; the live π-lane\n // read the result as a LUNGE. The drama lives in the STRENGTH (pointerStrength,\n // dropped to 0.18 in types.ts), NOT the falloff — the falloff's job is purely to keep\n // the lean COHERENT across the creature so the body, satellites and trail all tilt\n // toward the cursor as ONE. At 0.5 the body (sitting ≈0.2 uv from the cursor on a\n // hover-flick) is still well inside the cutoff, so the whole creature tilts as one —\n // a gentle, coherent \"it notices you\" lean rather than the body lunging a body-width.\n if (uPointerActive > 0.5) {\n vec2 pointerDir = uPointer - uv;\n float pointerDist = length(pointerDir);\n float influence = smoothstep(0.5, 0.0, pointerDist) * uPointerAttraction * uPointerStrength;\n uv += normalize(pointerDir + 1e-6) * influence;\n }\n\n // The de-synced pulsing body radius — also reused below for the inner-glow scale.\n float bodyR = uBodyRadius + breath(uPulsePhase) * uPulseAmp;\n\n // Composite domain-warped membrane field with its analytic gradient.\n vec3 scene = sceneDistG(uv);\n float d = scene.x;\n vec2 fieldGrad = scene.yz;\n\n // Edit #1 — fwidth-based anti-aliased edge: derive the smoothstep half-width\n // from the SDF screen-space gradient so the edge stays ~1px regardless of zoom.\n float aa = max(fwidth(d), 1e-6);\n float alpha = 1.0 - smoothstep(-aa, aa, d);\n\n if (alpha < 0.001) {\n fragColor = vec4(0.0);\n return;\n }\n\n // Edit #4 — perceptually-uniform OKLCh variation. Gamma base → linear → OKLab\n // → OKLCh; perturb L/C/h; OKLCh → OKLab → linear; hue-preserving gamut clamp.\n // The base is the multi-stop palette sample — distributed across the\n // body/satellites by the color noise field — or uBaseColor when single-stop.\n float colorNoise = fbm(uv * uColorNoiseFreq + uTime * uColorNoiseSpeed, 3);\n vec3 oklch = samplePaletteOklch(colorNoise);\n // per-satellite explicit shade (default no-op at uSatColorActive == 0).\n oklch = blendSatColor(oklch, uv);\n\n oklch.z += (colorNoise - 0.5) * uHueRange * (PI / 180.0); // hue swing, radians\n oklch.y = max(oklch.y + (colorNoise - 0.5) * uSatShift, 0.0); // chroma swing\n oklch.x = clamp(oklch.x + uBrightnessShift, 0.0, 1.0); // lightness bias\n\n // ── Blob-to-meatball shading morph (uMorphT) ────────────────────────────\n // The user #1 ask: the goo should MORPH BLOB and MEATBALL from one to another\n // with a continuous in-between, not a hard cut. The key fact: the body\n // GEOMETRY is IDENTICAL across blob/meatball (the smin SDF field, the satellites,\n // the fwidth-AA — all computed ABOVE, before this gate). ONLY the SURFACE shading\n // (flat fill vs lit/shadow/iridescence/SSS) differs. So the morph is a uMorphT\n // scalar LERPING the SHADING — NOT a geometry rebuild, NOT a path interpolation.\n //\n // uMorphT = 0 -> the flat warm-cream blob (the STAGE-1 floor);\n // uMorphT = 1 -> the lit meatball (the full STAGE-2 dressing);\n // 0 < uMorphT < 1 -> the CONTINUOUS in-between (the morph the user asked for).\n //\n // uMorphT is the single clamped config surface axis; a consumer ANIMATING\n // config.morphT 0..1 gets the live morph. The smin field is\n // byte-UNTOUCHED (the geometry is shared — that is the whole point).\n //\n // The flat color is computed ALWAYS (cheap); the EXPENSIVE dressing (the soft-shadow\n // secondary march) is gated uMorphT > 0.0 so a pure blob pays ZERO shadow-march\n // cost (the SLOW-fix discipline — a flat blob is as cheap as an early-return).\n float morphT = clamp(uMorphT, 0.0, 1.0);\n\n // STAGE-1 flat fill — the warm-cream blob color, off the PRE-dressing oklch (the\n // dressing mutates oklch below, so the flat read must snapshot it here).\n vec3 flatOkl = gamutClampOklch(oklch);\n vec3 flatLin = oklabToLinearSrgb(oklchToOklab(flatOkl));\n vec3 flatRgb = clamp(linearToSrgb(flatLin), 0.0, 1.0);\n\n // If we are fully flat (a pure blob, morphT == 0), emit the flat fill + dither and\n // return — the byte-identical STAGE-1 floor, zero dressing cost.\n if (morphT <= 0.0) {\n float ign1 = fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715))));\n flatRgb = clamp(flatRgb + (ign1 - 0.5) / 255.0, 0.0, 1.0);\n fragColor = vec4(flatRgb * alpha, alpha);\n return;\n }\n\n // Surface normal from the analytic field gradient; the 4-tap is\n // deleted. Computed once here and reused by the iridescence, the\n // fake-SSS, and the lit glass block.\n vec3 N = surfaceNormalFromGrad(fieldGrad, d, bodyR);\n vec3 V = vec3(0.0, 0.0, 1.0);\n float thickness = clamp(-d / max(bodyR, 1e-4), 0.0, 1.0); // 0 at rim, ~1 deep in\n float fres = pow(1.0 - max(dot(N, V), 0.0), 2.5); // rim-weighted angle\n\n // ── iridescence — warm-biased IQ cosine palette driving OKLCh HUE ──\n //\n // A thin-film-like sheen on the RIM (fres-weighted), NOT the cold-blue default:\n // an IQ cosine palette (a + b*cos(2pi(c*t + d))) maps the Fresnel/edge angle +\n // the FBM color field + an animated thickness onto a HUE OFFSET biased to the\n // warm arc (uIridHue), with the chroma clamped to a warm-pearl band so the rim\n // reads cream/gold (congruent with the warm-cream-glass identity). Mixed into\n // OKLCh BEFORE the gamut clamp. Default LOW.\n if (uIridescence > 0.0) {\n float t = fres + 0.3 * colorNoise + uTime * uIridSpeed;\n // Cosine palette in HUE space, centred on the warm uIridHue (~0.18 turn of\n // warm sweep so the sheen shimmers gold→peach, never swinging to cold blue).\n float iridHue = uIridHue + 0.18 * PI * cos(2.0 * PI * t);\n float w = fres * uIridescence; // rim-weighted blend\n oklch.z = mix(oklch.z, iridHue, w);\n // Warm-pearl chroma cap: lift chroma toward a pale-pearl band, clamped.\n oklch.y = min(oklch.y + 0.04 * w, oklch.y + 0.08);\n oklch.x = min(oklch.x + 0.05 * w, 1.0); // a touch brighter at the sheen\n }\n\n // ── fake subsurface translucency — thickness inner-glow + back-light ──\n //\n // A bright translucent CORE fading to a light-leaking EDGE (the -d ramp) plus\n // the fast-SSS back-light (light wrapping through the thin rim). Both lift OKLCh\n // L and warm the hue, consuming the normal. In OKLCh before the gamut clamp.\n if (uCoreGlow > 0.0 || uSssScale > 0.0) {\n // Beer-Lambert inner luminosity uses a saturating 1 - exp(-k·thickness)\n // curve — a flat thick core with a fast warm rim falloff — NOT the linear\n // coreGlow·thickness ramp (which over-brightens deep interiors). k ≈ 3 reads\n // as glass depth.\n oklch.x = min(oklch.x + uCoreGlow * (1.0 - exp(-3.0 * thickness)), 1.0);\n // Fast-SSS back-light: light wrapping through the thin (low-thickness) rim.\n vec3 L = normalize(uLightDir + vec3(1e-6));\n float back = pow(clamp(dot(V, -(L + N * thickness)), 0.0, 1.0), uSssPower);\n float sss = back * uSssScale * (1.0 - thickness);\n oklch.x = min(oklch.x + sss, 1.0);\n // Warm the THIN leaking rim only (scale by 1 - thickness): the SSS hue-warm\n // shift rides the rim, not the core; only the thin rim warms.\n oklch.z += sss * 0.1 * (1.0 - thickness);\n }\n\n // ── Soft contact shadow (the GLSL twin) ─────────────────────────────────\n // A procedural\n // soft shadow FOLLOWING the irregular silhouette: march from this fragment's uv\n // toward the in-plane projection of uLightDir; where the metaball field occludes the\n // light, DARKEN the OKLCh L — a soft grounded contact band under the dome\n // (PROCEDURAL, silhouette-following, unlike the static CSS gel-dome drop-shadow).\n // Rim-weighted (1 - thickness) so the lit interior stays bright. Gated uShadow > 0.5;\n // morphT=0 ships shadowless via the uStage early-return above. ──\n if (uShadow > 0.5) {\n vec2 L2 = normalize(uLightDir.xy + vec2(1e-6));\n float sh = softShadow2D(uv, L2, max(aa, 0.004), bodyR * 1.5, max(uShadowSoftness, 4.0));\n // The contact band sits on the LOWER rim (the side AWAY from the light), gated by\n // the away-facing rim weight + a thin-rim Gaussian band (peak thickness ≈ 0.18) so\n // the deep-lit interior + the light-facing edge stay BRIGHT (the warm-cream body\n // mean and floor hold). The 0.20 cap is a soft grounding.\n float away = clamp(-dot(normalize(fieldGrad + vec2(1e-6)), L2), 0.0, 1.0);\n float band = exp(-pow((thickness - 0.18) / 0.16, 2.0));\n float shadowDarken = (1.0 - sh) * away * band * 0.20;\n oklch.x = max(oklch.x - shadowDarken, 0.0);\n }\n\n oklch = gamutClampOklch(oklch);\n\n vec3 lin = oklabToLinearSrgb(oklchToOklab(oklch));\n\n // ── lit glass surface — Blinn-Phong glint + Fresnel rim, in LINEAR ──\n //\n // The lit terms enter lin in LINEAR space BEFORE the OETF (linearToSrgb)\n // and BEFORE the * alpha premultiply — a post-OETF apply double-gammas the\n // highlight and fringes the premultiplied edge (the named A5/A2 trap). The\n // prior flat inner-glow lift is SUBSUMED by the Fresnel rim (the curvature\n // read now comes from the surface normal, not a flat smoothstep). Gated behind\n // uLit so the flat fill stays the default (zero regression).\n if (uLit > 0.5) {\n // N, V, thickness are already computed in main() (reused by iridescence/SSS).\n vec3 L = normalize(uLightDir + vec3(1e-6)); // light direction\n vec3 H = normalize(L + V); // Blinn-Phong half-vector\n\n // Warm-cream specular glint — a near-white OKLCh TINT (L~0.97, C~0.03,\n // hue~85°) routed through the SAME spliced OKLCh matrices, NOT hardcoded\n // sRGB white (pure white reads cheap-CG). Linearized for the linear add.\n vec3 warmCream = oklabToLinearSrgb(oklchToOklab(vec3(0.97, 0.03, radians(85.0))));\n\n // Energy-conserving Blinn-Phong: the (shininess+2)/8 factor\n // DECOUPLES shininess from strength (without it, raising shininess dims the\n // glint, so the two knobs fight). SPECULAR ANTIALIASING: the FBM membrane\n // makes the normal vary fast, so a tight glint (16-64) STROBES on small\n // dock-grid blobs. Widen the effective lobe where the normal varies\n // (Toksvig-style fwidth clamp) — drop shininess, NOT raise it. nVar reads\n // the screen-space normal derivative; a high-variance pixel softens the\n // exponent so the glint stays stable.\n float nVar = length(fwidth(N));\n float shininess = uSpecShininess / (1.0 + 24.0 * nVar);\n float energyNorm = (shininess + 2.0) / 8.0;\n float spec = pow(max(dot(N, H), 0.0), shininess) * uSpecStrength * energyNorm;\n\n // Fresnel/Schlick rim — fed uRimColor (the --foreground warm rim via the\n // /color leaf). Foreground-aware minimum-contrast guard:\n // a var(--primary) blob in dark mode resolves a rim near the BODY color, so\n // the rim washes out (no contrast). When the rim's luminance sits too close\n // to the body's, the guard CHROMA-REDUCES and L-LIFTS the rim stop (a\n // perceptual move, NOT a re-tint) so the curved rim always reads. Computed in\n // OKLCh so the lift is perceptual.\n vec3 rimOkl = oklabToOklch(srgbToOklab(uRimColor));\n float bodyL = oklch.x; // the post-perturb body lightness\n float dL = abs(rimOkl.x - bodyL);\n // If the rim is within 0.22 L of the body, push it AWAY (lift if the body is\n // dark, the dark-mode primary case; the chroma-reduce keeps it neutral-warm).\n float lack = clamp((0.22 - dL) / 0.22, 0.0, 1.0);\n rimOkl.x = clamp(mix(rimOkl.x, (bodyL < 0.5 ? 0.92 : 0.18), lack), 0.0, 1.0);\n rimOkl.y *= mix(1.0, 0.5, lack); // chroma-reduce toward a pale pearl\n vec3 rimLin = oklabToLinearSrgb(oklchToOklab(rimOkl));\n\n float rimFres = pow(1.0 - max(dot(N, V), 0.0), uRimPower);\n float rim = rimFres * uRimStrength * (1.0 - 0.6 * thickness);\n\n // Combine the two warm highlights and add in LINEAR. max(spec, rim*scale)\n // keeps the glint from stacking on the rim into a blown hotspot.\n //\n // Clamp the linear highlight below unity before the add (the\n // belt-and-braces guard the re-derived specStrength makes rarely-binding but\n // never lets a worst-case normal blow to a hard white spot). The energy-\n // conserving Blinn-Phong CAN still spike on a grazing normal where the Toksvig\n // widen has not kicked in; capping the highlight magnitude at 0.85 (a contained\n // warm gleam, sub-unity) means the OETF clamp below can never crush a\n // pure-white pixel over the dome. The cap is on the highlight ALONE (not the\n // composited lin), so the body color underneath is untouched — it caps only\n // the additive catch-light's energy.\n vec3 highlight = max(warmCream * spec, rimLin * rim);\n highlight = min(highlight, vec3(0.85));\n lin += highlight;\n }\n\n vec3 rgb = clamp(linearToSrgb(lin), 0.0, 1.0); // MANDATORY OETF — closes the seam\n\n // ── Compose the blob-to-meatball shading morph ─────────────────────────\n // rgb is the fully-dressed meatball surface; flatRgb (snapshotted before the\n // dressing) is the flat blob fill. The morph is a CONTINUOUS lerp between them on\n // morphT — at morphT==1 it is byte-identical to the dressed meatball, and the\n // morphT==0 case already returned the flat fill above. The geometry (alpha/silhouette)\n // is shared, so only the SURFACE shading interpolates (the morph from one to\n // another). The dither below applies to the composited result.\n rgb = mix(flatRgb, rgb, morphT);\n\n // IGN dither: the low-chroma warm-cream dome bands on 8-bit\n // panels (visible Mach steps in the smooth L roll). Interleaved-gradient noise at\n // 1/255, applied AFTER linearToSrgb and BEFORE the *alpha premultiply (aurora\n // ships the same splice). A triangular ±0.5 LSB dither decorrelates the steps.\n float ign = fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715))));\n rgb = clamp(rgb + (ign - 0.5) / 255.0, 0.0, 1.0);\n\n // Edit #8 — premultiply AFTER the OETF: straight-alpha gamma → premultiplied.\n fragColor = vec4(rgb * alpha, alpha);\n}", Me = "[GooBlob]";
521
524
  function Ne(e) {
522
- let t = f(e, e.VERTEX_SHADER, Se, Me), n = f(e, e.FRAGMENT_SHADER, je, Me), r = m(e, t, n, Me);
525
+ let t = _(e, e.VERTEX_SHADER, Se, Me), n = _(e, e.FRAGMENT_SHADER, je, Me), r = y(e, t, n, Me);
523
526
  e.useProgram(r);
524
527
  let i = e.createVertexArray();
525
528
  e.bindVertexArray(i);
@@ -542,12 +545,12 @@ function Ne(e) {
542
545
  e.enableVertexAttribArray(o), e.vertexAttribPointer(o, 2, e.FLOAT, !1, 0, 0);
543
546
  let s = {};
544
547
  for (let t of de) s[t] = e.getUniformLocation(r, t);
545
- let c = [], l = [], u = [], d = [], p = [];
546
- for (let t = 0; t < 4; t++) c.push(e.getUniformLocation(r, `uSatPos[${t}]`)), l.push(e.getUniformLocation(r, `uSatRadius[${t}]`)), u.push(e.getUniformLocation(r, `uSatOpacity[${t}]`)), d.push(e.getUniformLocation(r, `uSatColor[${t}]`)), p.push(e.getUniformLocation(r, `uSatColorAmt[${t}]`));
547
- let h = [], g = [];
548
- for (let t = 0; t < 15; t++) h.push(e.getUniformLocation(r, `uTrailPos[${t}]`)), g.push(e.getUniformLocation(r, `uTrailRadius[${t}]`));
549
- let _ = [];
550
- for (let t = 0; t < 4; t++) _.push(e.getUniformLocation(r, `uPalette[${t}]`));
548
+ let c = [], l = [], u = [], d = [], f = [];
549
+ for (let t = 0; t < 4; t++) c.push(e.getUniformLocation(r, `uSatPos[${t}]`)), l.push(e.getUniformLocation(r, `uSatRadius[${t}]`)), u.push(e.getUniformLocation(r, `uSatOpacity[${t}]`)), d.push(e.getUniformLocation(r, `uSatColor[${t}]`)), f.push(e.getUniformLocation(r, `uSatColorAmt[${t}]`));
550
+ let p = [], m = [];
551
+ for (let t = 0; t < 15; t++) p.push(e.getUniformLocation(r, `uTrailPos[${t}]`)), m.push(e.getUniformLocation(r, `uTrailRadius[${t}]`));
552
+ let h = [];
553
+ for (let t = 0; t < 4; t++) h.push(e.getUniformLocation(r, `uPalette[${t}]`));
551
554
  return e.enable(e.BLEND), e.blendFunc(e.ONE, e.ONE_MINUS_SRC_ALPHA), {
552
555
  prog: r,
553
556
  vs: t,
@@ -560,10 +563,10 @@ function Ne(e) {
560
563
  satRadLocs: l,
561
564
  satOpLocs: u,
562
565
  satColorLocs: d,
563
- satColorAmtLocs: p,
564
- trailPosLocs: h,
565
- trailRadLocs: g,
566
- paletteLocs: _
566
+ satColorAmtLocs: f,
567
+ trailPosLocs: p,
568
+ trailRadLocs: m,
569
+ paletteLocs: h
567
570
  }
568
571
  };
569
572
  }
@@ -686,7 +689,7 @@ struct Uniforms {
686
689
  // below. NB: do NOT name the chunk with a template-interpolation form in a WGSL comment —
687
690
  // it injects the whole multi-line chunk into this // comment line and breaks the parse
688
691
  // at the first injected newline.
689
- ${b}
692
+ ${C}
690
693
 
691
694
  const FBM_LACUNARITY: f32 = 1.8;
692
695
  const FBM_GAIN: f32 = 0.42;
@@ -808,8 +811,8 @@ fn sminG(a: vec3<f32>, b: vec3<f32>, k: f32) -> vec3<f32> {
808
811
  return sminQuadraticG(a, b, k);
809
812
  }
810
813
 
811
- ${v}
812
- ${y}
814
+ ${x}
815
+ ${S}
813
816
 
814
817
  // OKLCh gamut clamp, palette sample, and breath from metaball-palette.wgsl,
815
818
  // spliced AFTER the OKLCH_MATRICES_WGSL chunk above (its matrix source). NB: do NOT
@@ -1461,7 +1464,7 @@ function Ue(e) {
1461
1464
  //#endregion
1462
1465
  //#region src/components/blob/composables/useMetaballRenderer.ts
1463
1466
  function We(e) {
1464
- let { canvasRef: t, color: n, rimColor: r, paletteStops: i, satelliteColors: a, mood: o, pointer: s, satellites: c, config: l } = e, u = null, d = I(x("webgpu")), f = Ue({
1467
+ let { canvasRef: t, color: n, rimColor: r, paletteStops: i, satelliteColors: a, mood: o, pointer: s, satellites: c, config: l } = e, u = null, m = I(p("webgpu")), h = Ue({
1465
1468
  color: n,
1466
1469
  rimColor: r,
1467
1470
  paletteStops: i,
@@ -1472,10 +1475,10 @@ function We(e) {
1472
1475
  config: l,
1473
1476
  getReducedMotion: () => u?.reducedMotion ?? !1,
1474
1477
  wake: () => u?.wake()
1475
- }), p = () => g() * (l.quality === "half" ? .5 : 1);
1476
- function m(t) {
1477
- u = _(t, {
1478
- dprPolicy: p,
1478
+ }), g = () => d() * (l.quality === "half" ? .5 : 1);
1479
+ function _(t) {
1480
+ u = f(t, {
1481
+ dprPolicy: g,
1479
1482
  composeIntersectionPark: !0,
1480
1483
  intersectionRootMargin: "200px",
1481
1484
  revealBloom: e.revealBloom ?? !0,
@@ -1490,47 +1493,47 @@ function We(e) {
1490
1493
  config: l,
1491
1494
  pointer: s,
1492
1495
  satellites: c,
1493
- resolveFrame: f.resolveFrame,
1494
- shouldContinue: f.shouldContinue,
1495
- onResize: f.recordBackingSize,
1496
- onDraw: f.recordDraw
1496
+ resolveFrame: h.resolveFrame,
1497
+ shouldContinue: h.shouldContinue,
1498
+ onResize: h.recordBackingSize,
1499
+ onDraw: h.recordDraw
1497
1500
  }),
1498
1501
  setupGL: (e) => {
1499
1502
  let { prog: n, vs: r, fs: i, vao: a, buf: o, locs: u } = Ne(e);
1500
1503
  function d(t) {
1501
- f.recordBackingSize(t), e.viewport(0, 0, t.w, t.h);
1504
+ h.recordBackingSize(t), e.viewport(0, 0, t.w, t.h);
1502
1505
  }
1503
- function p(r) {
1504
- let i = f.resolveFrame(r);
1505
- Fe(e, n, a, u, t, l, s, c, i), f.recordDraw(i);
1506
+ function f(r) {
1507
+ let i = h.resolveFrame(r);
1508
+ Fe(e, n, a, u, t, l, s, c, i), h.recordDraw(i);
1506
1509
  }
1507
1510
  return {
1508
- frame: p,
1509
- shouldContinue: f.shouldContinue,
1511
+ frame: f,
1512
+ shouldContinue: h.shouldContinue,
1510
1513
  resize: d,
1511
1514
  teardown: () => {
1512
1515
  e.deleteProgram(n), e.deleteShader(r), e.deleteShader(i), e.deleteBuffer(o), e.deleteVertexArray(a);
1513
1516
  }
1514
1517
  };
1515
1518
  },
1516
- onStatus: (e) => d.value = e
1519
+ onStatus: (e) => m.value = e
1517
1520
  }), u.armAsync().catch(() => void 0);
1518
1521
  }
1519
1522
  return R(t, (e) => {
1520
- e && !u && m(e);
1523
+ e && !u && _(e);
1521
1524
  }, { immediate: !0 }), R(n, () => u?.wake()), R(r, () => u?.wake()), R(i, () => u?.wake(), { deep: !0 }), a && R(a, () => u?.wake(), { deep: !0 }), M(() => {
1522
- f.dispose(), u?.dispose(), u = null;
1525
+ h.dispose(), u?.dispose(), u = null;
1523
1526
  }), {
1524
1527
  pause: () => {
1525
- f.pause(), u?.suspend("manual");
1528
+ h.pause(), u?.suspend("manual");
1526
1529
  },
1527
1530
  resume: () => {
1528
- f.resume(), u?.resume("manual");
1531
+ h.resume(), u?.resume("manual");
1529
1532
  },
1530
1533
  wake: () => u?.wake(),
1531
- settled: f.settled,
1532
- settledFrame: f.settledFrame,
1533
- rendererStatus: P(d)
1534
+ settled: h.settled,
1535
+ settledFrame: h.settledFrame,
1536
+ rendererStatus: P(m)
1534
1537
  };
1535
1538
  }
1536
1539
  //#endregion
@@ -0,0 +1,13 @@
1
+ function e(e, t, n) {
2
+ return Math.max(t, Math.min(n, e));
3
+ }
4
+ function t() {
5
+ let e = typeof window < "u" && window.devicePixelRatio || 1;
6
+ return Math.min(e, 2);
7
+ }
8
+ function n() {
9
+ let e = typeof window < "u" && window.devicePixelRatio || 1;
10
+ return Math.min(e, 1.5);
11
+ }
12
+ //#endregion
13
+ export { n, t as r, e as t };
@@ -0,0 +1,113 @@
1
+ import { t as e } from "./class-names-FlXcvRRT.js";
2
+ import { t } from "./DotRing-Blh4Mc3Q.js";
3
+ import { t as n } from "./vSpecular-DMJo8pfD.js";
4
+ import { t as r } from "./asElement-CRnm6A2v.js";
5
+ import { t as i } from "./useLiquidPress-D5mjZC6U.js";
6
+ import { t as a } from "./useBarShape-CmP35Z8o.js";
7
+ import { computed as o, createBlock as s, createCommentVNode as c, defineComponent as l, mergeProps as u, openBlock as d, ref as f, renderSlot as p, unref as m, useAttrs as h, withCtx as g, withDirectives as _ } from "vue";
8
+ import { Primitive as v } from "reka-ui";
9
+ //#endregion
10
+ //#region src/components/button/Button.vue
11
+ var y = /* @__PURE__ */ l({
12
+ __name: "Button",
13
+ props: {
14
+ emphasis: { default: "secondary" },
15
+ tone: { default: "neutral" },
16
+ size: { default: "md" },
17
+ iconOnly: {
18
+ type: Boolean,
19
+ default: !1
20
+ },
21
+ loading: {
22
+ type: Boolean,
23
+ default: !1
24
+ },
25
+ type: {},
26
+ disabled: { type: [Boolean, String] },
27
+ class: { type: [
28
+ Boolean,
29
+ null,
30
+ String,
31
+ Object,
32
+ Array
33
+ ] },
34
+ asChild: { type: Boolean },
35
+ as: { default: "button" }
36
+ },
37
+ setup(l) {
38
+ let y = l;
39
+ h();
40
+ let b = o(() => y.loading || y.disabled === !0 || y.disabled === "true"), x = o(() => y.disabled === !0 || y.disabled === "true"), S = o(() => !y.asChild && y.as === "button"), C = o(() => y.emphasis === "primary" || y.emphasis === "secondary"), w = o(() => C.value && !b.value), T = o(() => ({
41
+ type: S.value ? y.type ?? "button" : void 0,
42
+ disabled: S.value ? x.value : void 0,
43
+ "aria-disabled": !S.value && b.value ? "true" : void 0
44
+ })), E = f(null);
45
+ function D(e) {
46
+ E.value = r(e);
47
+ }
48
+ let O = a(E), k = i({
49
+ el: E,
50
+ disabled: () => b.value,
51
+ pressVar: "--glass-btn-press-t"
52
+ }), A = o(() => k.pressStyle.value), j = o(() => e("button tap-squish focus-ring", C.value && "glass-capsule glass-specular-track", y.emphasis === "primary" && "glass-deep", w.value && "glass-capsule-hover", y.class));
53
+ function M(e) {
54
+ b.value && (e.preventDefault(), e.stopImmediatePropagation());
55
+ }
56
+ return (e, r) => _((d(), s(m(v), u({
57
+ ref: D,
58
+ as: l.as,
59
+ "as-child": l.asChild,
60
+ "data-slot": "button",
61
+ "data-emphasis": l.emphasis,
62
+ "data-tone": l.tone,
63
+ "data-size": l.size,
64
+ "data-icon-only": l.iconOnly || void 0,
65
+ "data-shape": m(O),
66
+ "data-control-target": "",
67
+ "data-loading": l.loading || void 0,
68
+ "data-press-armed": m(k).armed ? "" : void 0,
69
+ "aria-busy": l.loading || void 0
70
+ }, T.value, {
71
+ class: j.value,
72
+ style: A.value,
73
+ onClick: M,
74
+ onPointerdown: m(k).handlers.onPointerdown,
75
+ onPointerup: m(k).handlers.onPointerup,
76
+ onPointercancel: m(k).handlers.onPointercancel,
77
+ onPointerleave: m(k).handlers.onPointerleave,
78
+ onPointerenter: m(k).handlers.onPointerenter,
79
+ onKeydown: m(k).handlers.onKeydown,
80
+ onKeyup: m(k).handlers.onKeyup,
81
+ onBlur: m(k).handlers.onBlur
82
+ }), {
83
+ default: g(() => [l.loading ? (d(), s(t, {
84
+ key: 0,
85
+ class: "button-mark"
86
+ })) : c("", !0), p(e.$slots, "default")]),
87
+ _: 3
88
+ }, 16, [
89
+ "as",
90
+ "as-child",
91
+ "data-emphasis",
92
+ "data-tone",
93
+ "data-size",
94
+ "data-icon-only",
95
+ "data-shape",
96
+ "data-loading",
97
+ "data-press-armed",
98
+ "aria-busy",
99
+ "class",
100
+ "style",
101
+ "onPointerdown",
102
+ "onPointerup",
103
+ "onPointercancel",
104
+ "onPointerleave",
105
+ "onPointerenter",
106
+ "onKeydown",
107
+ "onKeyup",
108
+ "onBlur"
109
+ ])), [[m(n), w.value]]);
110
+ }
111
+ });
112
+ //#endregion
113
+ export { y as t };
package/dist/button.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./button-BOFTUPyU.js";
1
+ import { t as e } from "./button-CAKhiOZy.js";
2
2
  export { e as Button };
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./class-names-FlXcvRRT.js";
2
- import { t } from "./Surface-1nPoabc3.js";
2
+ import { t } from "./Surface-C7wq2j0A.js";
3
3
  import { t as n } from "./useScrollTrigger-Abe5dEeO.js";
4
4
  import { computed as r, createBlock as i, createElementBlock as a, defineComponent as o, mergeProps as s, normalizeClass as c, openBlock as l, ref as u, renderSlot as d, resolveDynamicComponent as f, unref as p, watch as m, withCtx as h } from "vue";
5
5
  //#endregion
@@ -20,6 +20,7 @@ var g = /* @__PURE__ */ o({
20
20
  tier: {},
21
21
  surface: {},
22
22
  deep: { type: Boolean },
23
+ backdropMode: {},
23
24
  class: { type: [
24
25
  Boolean,
25
26
  null,
@@ -36,6 +37,7 @@ var g = /* @__PURE__ */ o({
36
37
  tier: n.tier,
37
38
  surface: n.surface,
38
39
  deep: n.deep,
40
+ "backdrop-mode": n.backdropMode,
39
41
  as: n.as,
40
42
  "data-shadow": n.shadow || void 0,
41
43
  "data-size": n.size,
@@ -51,6 +53,7 @@ var g = /* @__PURE__ */ o({
51
53
  "tier",
52
54
  "surface",
53
55
  "deep",
56
+ "backdrop-mode",
54
57
  "as",
55
58
  "data-shadow",
56
59
  "data-size",
package/dist/card.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, o as r, r as i, t as a } from "./card-ByyqRBvK.js";
1
+ import { a as e, i as t, n, o as r, r as i, t as a } from "./card-D_uXphvL.js";
2
2
  export { r as Card, n as CardContent, i as CardDescription, a as CardFooter, e as CardHeader, t as CardTitle };
package/dist/carousel.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { t as e } from "./class-names-FlXcvRRT.js";
2
2
  import { n as t } from "./useReducedMotion-vCXA_vyM.js";
3
- import { t as n } from "./button-BOFTUPyU.js";
4
- import { h as r, i, y as a } from "./deck-Cm_VmyNL.js";
3
+ import { t as n } from "./button-CAKhiOZy.js";
4
+ import { h as r, i, y as a } from "./deck-Bc-2mEKE.js";
5
5
  import { t as o } from "./useLeadTrail-DQWdpFN1.js";
6
6
  import { computed as s, createBlock as c, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createVNode as f, defineComponent as p, inject as m, mergeModels as h, normalizeClass as g, onBeforeUnmount as _, onMounted as v, openBlock as y, provide as b, ref as x, renderSlot as S, resolveDynamicComponent as C, toDisplayString as w, unref as T, useModel as E, watch as D, withCtx as O } from "vue";
7
7
  import { ChevronDown as k, ChevronLeft as A, ChevronRight as j, ChevronUp as M } from "@lucide/vue";
8
+ import "./components/carousel/styles.css";
8
9
  //#region src/components/carousel/useCarousel.ts
9
10
  var N = Symbol("glass-carousel");
10
11
  function P(e, t, n) {
@@ -1,3 +1,4 @@
1
+ import "./checkbox.css";
1
2
  import { t as e } from "./control-DJp15L4U.js";
2
3
  import { computed as t, createBlock as n, createElementVNode as r, createVNode as i, defineComponent as a, mergeProps as o, openBlock as s, renderSlot as c, unref as l, withCtx as u } from "vue";
3
4
  import { CheckboxIndicator as d, CheckboxRoot as f, useForwardPropsEmits as p } from "reka-ui";
@@ -0,0 +1 @@
1
+ @layer theme, base, components, utilities;@layer components{.checkbox{--control-bit-radius:var(--radius-md)}}
package/dist/checkbox.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./checkbox-B1qn65se.js";
1
+ import { t as e } from "./checkbox-COLnvULu.js";
2
2
  export { e as Checkbox };
@@ -1,3 +1,4 @@
1
+ import "./collapsible.css";
1
2
  import { t as e } from "./class-names-FlXcvRRT.js";
2
3
  import { computed as t, createBlock as n, defineComponent as r, inject as i, mergeProps as a, openBlock as o, provide as s, renderSlot as c, unref as l, useAttrs as u, useId as d, withCtx as f } from "vue";
3
4
  import { CollapsibleContent as p, CollapsibleRoot as m, CollapsibleTrigger as h, injectCollapsibleRootContext as g } from "reka-ui";
@@ -0,0 +1 @@
1
+ @layer theme, base, components, utilities;@keyframes disclosure-open{0%{opacity:0;block-size:0}to{block-size:var(--disclosure-content-size);opacity:1}}@keyframes disclosure-close{0%{block-size:var(--disclosure-content-size);opacity:1}to{opacity:0;block-size:0}}@layer components{.disclosure{inline-size:100%;min-inline-size:0}.disclosure-item{border-block-end:1px solid var(--glass-border-defined)}.disclosure-header{margin:0;display:flex}.disclosure-trigger{border-radius:var(--radius-control);touch-action:manipulation}.disclosure-trigger:focus-visible{box-shadow:var(--focus-ring-shadow);outline:none}.disclosure-trigger:is(:disabled,[data-disabled]){pointer-events:none;opacity:var(--opacity-disabled)}.disclosure-group-trigger{min-block-size:2.75rem;color:var(--foreground);font:inherit;text-align:start;cursor:pointer;transition:background-color var(--duration-control) var(--ease-standard), color var(--duration-control) var(--ease-standard), box-shadow var(--duration-control) var(--ease-standard);background:0 0;border:0;flex:auto;justify-content:space-between;align-items:center;padding:1rem .25rem;font-weight:600;display:flex}.disclosure-group-trigger:hover:not(:disabled,[data-disabled]){background:var(--control-surface-bg-hover)}.disclosure-icon{block-size:1rem;inline-size:1rem;color:var(--muted-foreground-strong);flex:none}.disclosure-group-trigger[data-state=open]>.disclosure-icon{rotate:180deg}.disclosure-content{color:var(--muted-foreground-strong);font-size:var(--type-small);line-height:var(--leading-small);animation-duration:var(--spring-present-duration);animation-timing-function:var(--spring-present);overflow:hidden}.disclosure-content[data-disclosure=collapsible]{--disclosure-content-size:var(--reka-collapsible-content-height)}.disclosure-content[data-disclosure=accordion]{--disclosure-content-size:var(--reka-accordion-content-height)}.disclosure-content[data-state=open]{animation-name:disclosure-open}.disclosure-content[data-state=closed]{animation-name:disclosure-close}.disclosure-content-body{padding:0 .25rem 1rem}@media (prefers-reduced-motion:reduce){.disclosure-content{animation-duration:.01ms}.disclosure-icon{transition-duration:.01ms}}@media (forced-colors:active){.disclosure-item{border-color:canvastext}.disclosure-trigger:focus-visible{outline-offset:2px;box-shadow:none;outline:2px solid highlight}}}
@@ -1,2 +1,2 @@
1
- import { n as e, r as t, t as n } from "./collapsible-DFzK29Oh.js";
1
+ import { n as e, r as t, t as n } from "./collapsible-Bd4Et730.js";
2
2
  export { t as Collapsible, n as CollapsibleContent, e as CollapsibleTrigger };