@mkbabb/glass-ui 3.8.0 → 3.9.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 (164) hide show
  1. package/README.md +1 -6
  2. package/dist/{CardAction-q2qHCJFG.js → CardAction-DuArVky-.js} +4 -4
  3. package/dist/{CommandShortcut-SzWRhROC.js → CommandShortcut-CefCj5mt.js} +7 -7
  4. package/dist/{ContextMenuSubContent-Do977Cbf.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
  5. package/dist/{DataTable-CvlWXz65.js → DataTable-CUHMukiQ.js} +1 -1
  6. package/dist/{DialogContent-DjZWT3lK.js → DialogContent-BRkT1cjP.js} +1 -1
  7. package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
  8. package/dist/{SelectScrollDownButton-C7TRe-ep.js → SelectScrollDownButton-T32cVFeM.js} +3 -3
  9. package/dist/{SelectSeparator-L8pPEn4L.js → SelectSeparator-C4Ql0gzV.js} +1 -1
  10. package/dist/{TabsList-qyHZ2lKY.js → TabsList-B8CVOQPC.js} +2 -2
  11. package/dist/{Toaster-CabYEEF_.js → Toaster-1rYWrmAm.js} +1 -1
  12. package/dist/{ToggleGroupItem-CkXUcBlt.js → ToggleGroupItem-Cev4pOVK.js} +4 -4
  13. package/dist/animated-digit.js +1 -1
  14. package/dist/api/index.d.ts +1 -1
  15. package/dist/api.js +1 -1
  16. package/dist/aurora.js +10 -10
  17. package/dist/{badge-DHQrc_GQ.js → badge-BvwvT50i.js} +4 -4
  18. package/dist/badge.js +1 -1
  19. package/dist/{button-CAywcrhO.js → button-DN39cGqL.js} +13 -12
  20. package/dist/button.js +1 -1
  21. package/dist/card.js +1 -1
  22. package/dist/carousel.js +1 -1
  23. package/dist/color.js +1 -1
  24. package/dist/command.js +1 -1
  25. package/dist/{compile-BBTRjvQS.js → compile-DAjIoEy2.js} +1 -1
  26. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
  27. package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
  28. package/dist/components/custom/dock/GlassDock.vue.d.ts +45 -63
  29. package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
  30. package/dist/components/custom/dock/index.d.ts +2 -1
  31. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +19 -5
  32. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
  33. package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
  34. package/dist/components/custom/tabs/index.d.ts +2 -5
  35. package/dist/components/ui/button/index.d.ts +1 -1
  36. package/dist/components/ui/card/Card.vue.d.ts +5 -3
  37. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
  38. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
  39. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +3 -4
  40. package/dist/components/ui/slider/index.d.ts +14 -7
  41. package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
  42. package/dist/composables/context/createContext.d.ts +1 -1
  43. package/dist/configurator.js +1 -1
  44. package/dist/confirm-dialog.js +1 -1
  45. package/dist/constellation.js +1 -1
  46. package/dist/context-menu.js +1 -1
  47. package/dist/controls.js +1 -1
  48. package/dist/dark.js +1 -1
  49. package/dist/data-table.js +1 -1
  50. package/dist/deck-progress.js +1 -1
  51. package/dist/dialog.js +1 -1
  52. package/dist/dock.js +256 -243
  53. package/dist/{dropdown-menu-B_4bWyyG.js → dropdown-menu-D77jX6Df.js} +3 -3
  54. package/dist/dropdown-menu.js +1 -1
  55. package/dist/expandable-container.js +1 -1
  56. package/dist/forms.js +5 -5
  57. package/dist/fourier-field.js +3 -3
  58. package/dist/glass-ui.css +1 -1
  59. package/dist/glass-ui.js +101 -104
  60. package/dist/goo-blob.js +36 -32
  61. package/dist/hover-popover.js +1 -1
  62. package/dist/icon-tooltip.js +1 -1
  63. package/dist/index.d.ts +0 -2
  64. package/dist/keyboard.js +1 -1
  65. package/dist/labeled-field.js +4 -4
  66. package/dist/{menuItemVariants-DKM85SNE.js → menuItemVariants-CCoBNkU5.js} +1 -1
  67. package/dist/motion-core.js +4 -4
  68. package/dist/motion.js +2 -2
  69. package/dist/number-field.js +1 -1
  70. package/dist/pulse.js +1 -1
  71. package/dist/reactive.js +1 -1
  72. package/dist/scrolling-text.js +1 -1
  73. package/dist/search.js +4 -4
  74. package/dist/select.js +2 -2
  75. package/dist/{slider-D9puf-Ko.js → slider-DC2mwuoe.js} +1 -1
  76. package/dist/slider.js +1 -1
  77. package/dist/sortable-list.js +1 -1
  78. package/dist/status-dot.js +17 -16
  79. package/dist/styles/animations.css +6 -2
  80. package/dist/styles/components.css +1 -1
  81. package/dist/styles/dock/density.css +230 -0
  82. package/dist/styles/dock/layer-group.css +263 -0
  83. package/dist/styles/dock/layers.css +355 -0
  84. package/dist/styles/dock/morph.css +244 -0
  85. package/dist/styles/dock/overflow.css +201 -0
  86. package/dist/styles/dock/shell.css +457 -0
  87. package/dist/styles/dock-controls.css +166 -32
  88. package/dist/styles/dock.css +42 -1349
  89. package/dist/styles/glass.css +396 -75
  90. package/dist/styles/index.css +12 -11
  91. package/dist/styles/theme.css +51 -0
  92. package/dist/styles/tokens.css +501 -55
  93. package/dist/styles/utilities.css +89 -39
  94. package/dist/tabs.js +182 -151
  95. package/dist/timeline.js +1 -1
  96. package/dist/toast.js +1 -1
  97. package/dist/toggle-group.js +1 -1
  98. package/dist/{useAnimatedNumber-C_3wZLx4.js → useAnimatedNumber-C5I3wWd8.js} +1 -1
  99. package/dist/{useConfiguratorState-CMff4GzH.js → useConfiguratorState-DxAqksK6.js} +21 -10
  100. package/dist/watercolor-dot.js +1 -1
  101. package/package.json +32 -33
  102. package/src/styles/animations.css +6 -2
  103. package/src/styles/dock/density.css +230 -0
  104. package/src/styles/dock/layer-group.css +263 -0
  105. package/src/styles/dock/layers.css +355 -0
  106. package/src/styles/dock/morph.css +244 -0
  107. package/src/styles/dock/overflow.css +201 -0
  108. package/src/styles/dock/shell.css +457 -0
  109. package/src/styles/dock-controls.css +166 -32
  110. package/src/styles/dock.css +42 -1349
  111. package/src/styles/glass.css +396 -75
  112. package/src/styles/index.css +12 -11
  113. package/src/styles/theme.css +51 -0
  114. package/src/styles/tokens.css +501 -55
  115. package/src/styles/utilities.css +89 -39
  116. package/dist/DiscoGlyph-CG0F410s.js +0 -132
  117. package/dist/GlyphFace-DRjDkB0s.js +0 -51
  118. package/dist/UnderlineTabs-Uxn-R3MT.js +0 -39
  119. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +0 -7
  120. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +0 -4
  121. package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +0 -58
  122. package/dist/components/custom/disco-glyph/index.d.ts +0 -1
  123. package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +0 -36
  124. package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +0 -28
  125. package/dist/components/custom/glass-carousel/index.d.ts +0 -4
  126. package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +0 -30
  127. package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +0 -64
  128. package/dist/components/custom/glyph-face/index.d.ts +0 -2
  129. package/dist/components/custom/glyph-face/keys.d.ts +0 -9
  130. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +0 -73
  131. package/dist/components/custom/responsive-tabs/index.d.ts +0 -2
  132. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +0 -27
  133. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +0 -60
  134. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +0 -20
  135. package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +0 -39
  136. package/dist/disco-glyph.d.ts +0 -1
  137. package/dist/disco-glyph.js +0 -2
  138. package/dist/glass-carousel.d.ts +0 -1
  139. package/dist/glass-carousel.js +0 -219
  140. package/dist/glyph-face.d.ts +0 -1
  141. package/dist/glyph-face.js +0 -3
  142. package/dist/keys-BsYjEFOW.js +0 -9
  143. package/dist/responsive-tabs.d.ts +0 -1
  144. package/dist/responsive-tabs.js +0 -95
  145. package/dist/styles/disco-glyph.css +0 -26
  146. package/dist/styles/glyph-face.css +0 -92
  147. package/src/styles/disco-glyph.css +0 -26
  148. package/src/styles/glyph-face.css +0 -92
  149. /package/dist/{DeckProgress-AVgbIULY.js → DeckProgress-Dmk4_AKN.js} +0 -0
  150. /package/dist/{HoverPopover-D56O6Ylp.js → HoverPopover-2LOIW34a.js} +0 -0
  151. /package/dist/{IconTooltip-D2T5nYOM.js → IconTooltip-yefK7cJc.js} +0 -0
  152. /package/dist/{Input-DVG_J0ne.js → Input-DWQQIOC4.js} +0 -0
  153. /package/dist/{ScrollingText-CVyqxvfv.js → ScrollingText-BPP84wKo.js} +0 -0
  154. /package/dist/{color-DMLTunJK.js → color-8jBjWiJ6.js} +0 -0
  155. /package/dist/{constants-BPOqYJAm.js → constants-CS75AWHG.js} +0 -0
  156. /package/dist/{presets-D1XPuTj-.js → presets-BKVyQfbt.js} +0 -0
  157. /package/dist/{prng-COGhh02-.js → prng-wHuHlNHE.js} +0 -0
  158. /package/dist/{useGlobalDark-D3EBWzXK.js → useGlobalDark-yhL4Wp-s.js} +0 -0
  159. /package/dist/{useIntersectionPause-Bj4sPkMh.js → useIntersectionPause-Cc-H9ees.js} +0 -0
  160. /package/dist/{useInterval-CcLfq2WU.js → useInterval-Dsmqwi03.js} +0 -0
  161. /package/dist/{useKeyboardShortcuts-BXWXOZ-9.js → useKeyboardShortcuts-Be3w_Rwk.js} +0 -0
  162. /package/dist/{useScrollProgress-C9ysDic5.js → useScrollProgress-CAH8Ofwt.js} +0 -0
  163. /package/dist/{useSortable-MGAbCGVJ.js → useSortable-C8ReQ50P.js} +0 -0
  164. /package/dist/{useTextHighlight-9nMW23Qb.js → useTextHighlight-DON84L8w.js} +0 -0
@@ -191,14 +191,32 @@
191
191
  AL-W10 SLIM (X6 §M-1 + Y7 §3 + DESIGN.md §L3). I compose this
192
192
  class onto every interactive surface that wants the iOS tap-
193
193
  squish idiom; the press scales to `--scale-press` (0.96, the
194
- canonical iOS `.regular` control rung) and the spring carries
195
- the return via `--spring-snappy` (the §L3 release-spring
196
- contract). I keep this as a single canonical rung — NOT a
197
- 3-rung ladder. The one outlier I leave alone is the button
198
- `0.97` (`--scale-press-btn`), which consumes its own slightly-
199
- softer token directly. The dock control now tracks the canonical
200
- `--scale-press` (0.96) too (AT.W7-dock-b press canon — the prior
201
- deeper `0.92` was retired to ONE source).
194
+ canonical iOS `.regular` control rung). I keep this as a single
195
+ canonical rung — NOT a 3-rung ladder. The one outlier I leave
196
+ alone is the button `0.97` (`--scale-press-btn`), which consumes
197
+ its own slightly-softer token directly. The dock control now
198
+ tracks the canonical `--scale-press` (0.96) too (AT.W7-dock-b
199
+ press canon — the prior deeper `0.92` was retired to ONE source).
200
+
201
+ AX.W52 §6 doctrine — the `scale` register is reconciled onto
202
+ `--spring-smooth` (was `--spring-snappy`), the ONE button/interactive
203
+ scale register the §6 easing doctrine records and the gate asserts
204
+ across `.btn-pill`/`.tap-squish`/`.glass-btn`/`btn-interactive`. At
205
+ ζ=0.86 `--spring-smooth` settles a press crisply with a sub-perceptual
206
+ (~0.5%) peak — no visible bounce — so press still reads alive while
207
+ hover reads as a smooth glide on the SAME spring.
208
+
209
+ The transition lists the SURFACE legs (bg/border/box-shadow/color/
210
+ opacity) on the bezier `--ease-standard` alongside the spring `scale`
211
+ leg — the SAME coherent set `.btn-pill` carries. This is load-bearing:
212
+ `.tap-squish` and `.btn-pill` are co-composed on the button base and
213
+ this `transition` shorthand would otherwise CLOBBER `.btn-pill`'s
214
+ surface legs down to a scale-only animation (the cascade bug that left
215
+ every button transitioning ONLY `scale` — the live-readback RED). With
216
+ both classes carrying the full set, whichever wins the surface cross-
217
+ fade survives. On a non-button press surface the extra legs are inert
218
+ unless that prop changes, in which case a smooth cross-fade is the
219
+ desired interactive read anyway.
202
220
 
203
221
  Under PRM I retire the press transform entirely and lean on the
204
222
  consumer's own hover/active bg-tint cascade to acknowledge the
@@ -206,7 +224,13 @@
206
224
  .tap-squish {
207
225
  /* AQ.W3 §W3.2 identity base */
208
226
  scale: 1;
209
- transition: scale var(--duration-fast) var(--spring-snappy);
227
+ transition:
228
+ background-color var(--duration-fast) var(--ease-standard),
229
+ border-color var(--duration-fast) var(--ease-standard),
230
+ box-shadow var(--duration-fast) var(--ease-standard),
231
+ color var(--duration-fast) var(--ease-standard),
232
+ opacity var(--duration-fast) var(--ease-standard),
233
+ scale var(--duration-fast) var(--spring-smooth);
210
234
  transform-origin: center center;
211
235
  }
212
236
  .tap-squish:active {
@@ -683,9 +707,12 @@
683
707
  `--duration-fast` + `--ease-standard` tokens. */
684
708
  @utility scale-on-hover {
685
709
  /* Individual-transform identity base (AQ.W3 §W3.2). Transition the `scale`
686
- longhand (not `transform`) so the migrated hover scale animates. */
710
+ longhand (not `transform`) so the migrated hover scale animates.
711
+ AX.W52 §6 doctrine — the `scale` transform leg rides `--spring-smooth`
712
+ (the settle register), NOT the bezier `--ease-standard` (a transform on a
713
+ bezier reads mechanical; springs read alive on transform). */
687
714
  scale: 1;
688
- transition: scale var(--duration-fast) var(--ease-standard);
715
+ transition: scale var(--duration-fast) var(--spring-smooth);
689
716
 
690
717
  &:hover {
691
718
  scale: var(--scale-hover);
@@ -1005,22 +1032,28 @@
1005
1032
 
1006
1033
  /* ── Interactive-button four-state recipe ────────────────────────────────
1007
1034
  `.btn-interactive` carries the canonical "Button-with-spring-hover"
1008
- four-state contract — transition + hover-scale (`--scale-hover`) +
1009
- active-press (`--scale-press`) + disabled-opacity + focus-ring fade-in.
1010
- The Button primitive's variants emit the four states except `hover:scale-*`;
1011
- this is the canonical opt-in that adds the spring-hover lift. Consumed by
1012
- keyframes.js at 7 sites. */
1035
+ four-state contract — transition + hover-scale + active-press + disabled-
1036
+ opacity + focus-ring fade-in. The Button primitive's variants emit the four
1037
+ states except `hover:scale-*`; this is the canonical opt-in that adds the
1038
+ spring-hover lift. Consumed by keyframes.js at 7 sites.
1039
+
1040
+ AX.W52 §6 — the hover lift is the restrained `--scale-hover-btn` (1.035, NOT
1041
+ the emphatic 1.08 `--scale-hover`) routed through `--spring-smooth` — the ONE
1042
+ button scale register the §6 doctrine records and the gate asserts across
1043
+ `.btn-pill`/`.tap-squish`/`.glass-btn`/`btn-interactive`. The surface legs
1044
+ stay on the bezier `--ease-standard` (a colour cross-fade reads as a wobble
1045
+ on a spring); only the `scale` transform leg springs. */
1013
1046
  @utility btn-interactive {
1014
1047
  /* AQ.W3 §W3.2 identity base */
1015
1048
  scale: 1;
1016
1049
  transition:
1017
1050
  background-color var(--duration-fast) var(--ease-standard),
1018
1051
  color var(--duration-fast) var(--ease-standard),
1019
- scale var(--duration-fast) var(--ease-standard),
1052
+ scale var(--duration-fast) var(--spring-smooth),
1020
1053
  opacity var(--duration-fast) var(--ease-standard);
1021
1054
 
1022
1055
  &:hover {
1023
- scale: var(--scale-hover);
1056
+ scale: var(--scale-hover-btn);
1024
1057
  }
1025
1058
 
1026
1059
  &:active {
@@ -1036,11 +1069,11 @@
1036
1069
  box-shadow: var(--focus-ring-shadow);
1037
1070
  outline: none;
1038
1071
  /* Fade in; base state has no box-shadow transition → instant
1039
- removal */
1072
+ removal. The `scale` leg keeps the `--spring-smooth` register. */
1040
1073
  transition:
1041
1074
  background-color var(--duration-fast) var(--ease-standard),
1042
1075
  color var(--duration-fast) var(--ease-standard),
1043
- scale var(--duration-fast) var(--ease-standard),
1076
+ scale var(--duration-fast) var(--spring-smooth),
1044
1077
  opacity var(--duration-fast) var(--ease-standard),
1045
1078
  box-shadow var(--duration-fast) var(--ease-standard);
1046
1079
  }
@@ -1068,36 +1101,52 @@ html.no-transition *::after {
1068
1101
  transition-duration: 0s !important;
1069
1102
  }
1070
1103
 
1071
- /* ── Forced-colors restoration (AQ.W2 §5) ──────────────────────────────
1104
+ /* ── Forced-colors focus + silhouette rung (AQ.W2 §5 · generalized AX.W36) ────
1072
1105
  Windows High Contrast / forced-colors mode STRIPS `box-shadow` — so the
1073
1106
  glass focus rings (box-shadow + `outline: none`) vanish, leaving keyboard
1074
- users with no visible focus (a WCAG 2.4.7 failure forced-colors exposes).
1075
- Restore a real `outline` keyed to the system `Highlight` color (outline
1076
- survives forced-colors; box-shadow does not). The box-shadow ring stays the
1077
- primary in normal mode (it carries the glass aesthetic) — these two are
1078
- mutually exclusive by media query, NOT a parallel path.
1079
-
1080
- `forced-color-adjust: none` is deliberately NOT used — glass-ui's
1081
- glassmorphic chrome is decorative and yields to the user's forced palette
1082
- (css forced-colors guidance). Baseline Widely Available; this IS the
1083
- fallback mechanism (it only activates under forced-colors), so no nested
1084
- guard. */
1107
+ users with no visible focus. Restore a real `outline` keyed to the system
1108
+ `Highlight` color (outline survives forced-colors; box-shadow does not). The
1109
+ box-shadow ring stays the primary in normal mode (it carries the glass
1110
+ aesthetic) — these two are mutually exclusive by media query, NOT a parallel
1111
+ path.
1112
+
1113
+ AX.W36 — the focus-survival selector set is GENERALIZED to the broader
1114
+ interactive surface: the dock CONTROLS (`.dock-icon-button` / `.dock-tab-button`
1115
+ / `.dock-select-trigger` / `.dock-dropdown-trigger`) + the pill button base
1116
+ (`.btn-pill`) all carry a box-shadow focus ring (dock.css / utilities.css) that
1117
+ vanishes under WHC just like the original five. This is the SAME `Highlight`
1118
+ outline rung extended to cover them — ONE block, ONE path (the glass-language
1119
+ structure-survival skin for the tier panes / StatusDot / floating surfaces lives
1120
+ co-located with the ladder it skins, in glass.css).
1121
+
1122
+ `forced-color-adjust: none` is deliberately NOT used — glass-ui's glassmorphic
1123
+ chrome is decorative and yields to the user's forced palette (css forced-colors
1124
+ guidance). Baseline Widely Available; this IS the fallback mechanism (it only
1125
+ activates under forced-colors), so no nested guard. */
1085
1126
  @media (forced-colors: active) {
1086
1127
  .focus-ring:focus-visible,
1087
1128
  .glass-btn:focus-visible,
1088
1129
  .interactive-item:focus-visible,
1130
+ .btn-pill:focus-visible,
1131
+ .dock-icon-button:focus-visible,
1132
+ .dock-tab-button:focus-visible,
1133
+ .dock-select-trigger:focus-visible,
1134
+ .dock-dropdown-trigger:focus-visible,
1089
1135
  .input-pill:focus,
1090
1136
  .input-pill:focus-visible {
1091
1137
  outline: 2px solid Highlight;
1092
1138
  outline-offset: 2px;
1093
1139
  }
1094
1140
 
1095
- /* Structural edges borne ONLY by box-shadow (the hairline catch-light /
1096
- glass pill edge / card plate) also vanish — restore a real border so
1097
- the silhouette survives. CanvasText is the system text/border color. */
1141
+ /* Structural edges borne ONLY by box-shadow (the hairline catch-light + the
1142
+ dock SHELL pill edge) also vanish — restore a real border so the silhouette
1143
+ survives. CanvasText is the system text/border color. The `.glass-dock`
1144
+ shell is OUT of the glass-material group BY DESIGN (it hand-rolls a parallel
1145
+ surface — see glass.css), so it keeps its WHC edge HERE; the five-rung ladder
1146
+ + `.glass-card` get their WHC border from the co-located glass-language skin
1147
+ in glass.css (one source per surface family, no double-declaration). */
1098
1148
  .hairline-accent,
1099
- .glass-dock,
1100
- .glass-card {
1149
+ .glass-dock {
1101
1150
  border: 1px solid CanvasText;
1102
1151
  }
1103
1152
  }
@@ -1108,12 +1157,13 @@ html.no-transition *::after {
1108
1157
  to the WCAG 2.5.5 (44px) minimum — ONE amendment retiring the per-consumer
1109
1158
  `min-h-[44px]` one-liners. Token-driven (`--touch-target`); fine-pointer
1110
1159
  byte-identical. Targets `Button size="icon"` (via the `data-size="icon"`
1111
- attr Button.vue reflects), ExpandableContainer + ResponsiveTabs triggers.
1160
+ attr Button.vue reflects), ExpandableContainer + SegmentedTabs (responsive
1161
+ mobile Select) triggers.
1112
1162
  `min-block/inline-size` only RAISES — a larger explicit size is never lost. */
1113
1163
  @media (pointer: coarse) {
1114
1164
  [data-size="icon"],
1115
1165
  .expandable-container__trigger,
1116
- .responsive-tabs__trigger {
1166
+ .segmented-tabs__trigger {
1117
1167
  min-block-size: var(--touch-target, 2.75rem);
1118
1168
  min-inline-size: var(--touch-target, 2.75rem);
1119
1169
  }
@@ -1,132 +0,0 @@
1
- import { r as e } from "./keys-BsYjEFOW.js";
2
- import { computed as t, createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeClass as a, openBlock as o, useId as s, watch as c } from "vue";
3
- //#region src/components/custom/disco-glyph/DiscoGlyph.vue?vue&type=script&setup=true&lang.ts
4
- var l = ["viewBox"], u = [
5
- "id",
6
- "x1",
7
- "y1",
8
- "x2",
9
- "y2"
10
- ], d = ["stop-color"], f = ["stop-color"], p = ["stop-color"], m = ["stop-color"], h = ["stop-color"], g = ["stop-color"], _ = ["stop-color"], v = ["stop-color"], y = ["id"], b = ["d"], x = ["d", "fill"], S = ["d", "fill"], C = /* @__PURE__ */ i({
11
- __name: "DiscoGlyph",
12
- props: {
13
- silhouette: {},
14
- viewBox: { default: "0 0 24 24" },
15
- active: {
16
- type: Boolean,
17
- default: !1
18
- },
19
- phaseColor: { default: "currentColor" },
20
- facetAxis: { default: "diagonal" }
21
- },
22
- setup(i) {
23
- let C = i, w = s(), T = t(() => `disco-facet-${w}`), E = t(() => `disco-cap-${w}`), D = t(() => {
24
- switch (C.facetAxis) {
25
- case "horizontal": return {
26
- x1: "0",
27
- y1: "0.5",
28
- x2: "1",
29
- y2: "0.5"
30
- };
31
- case "vertical": return {
32
- x1: "0.5",
33
- y1: "0",
34
- x2: "0.5",
35
- y2: "1"
36
- };
37
- default: return {
38
- x1: "0",
39
- y1: "0",
40
- x2: "1",
41
- y2: "1"
42
- };
43
- }
44
- }), O = e();
45
- return O && c(() => C.silhouette, (e) => {
46
- O.value = e;
47
- }, { immediate: !0 }), (e, t) => (o(), n("svg", {
48
- xmlns: "http://www.w3.org/2000/svg",
49
- viewBox: i.viewBox,
50
- fill: "none",
51
- class: a(["disco-glyph", { "disco-glyph--phase-tinted": i.active }]),
52
- "aria-hidden": "true"
53
- }, [
54
- r("defs", null, [r("linearGradient", {
55
- id: T.value,
56
- x1: D.value.x1,
57
- y1: D.value.y1,
58
- x2: D.value.x2,
59
- y2: D.value.y2
60
- }, [
61
- r("stop", {
62
- offset: "0%",
63
- "stop-color": i.phaseColor,
64
- "stop-opacity": "0.85"
65
- }, null, 8, d),
66
- r("stop", {
67
- offset: "14%",
68
- "stop-color": i.phaseColor,
69
- "stop-opacity": "1"
70
- }, null, 8, f),
71
- r("stop", {
72
- offset: "28%",
73
- "stop-color": i.phaseColor,
74
- "stop-opacity": "0.7"
75
- }, null, 8, p),
76
- r("stop", {
77
- offset: "42%",
78
- "stop-color": i.phaseColor,
79
- "stop-opacity": "0.95"
80
- }, null, 8, m),
81
- r("stop", {
82
- offset: "56%",
83
- "stop-color": i.phaseColor,
84
- "stop-opacity": "0.6"
85
- }, null, 8, h),
86
- r("stop", {
87
- offset: "70%",
88
- "stop-color": i.phaseColor,
89
- "stop-opacity": "0.85"
90
- }, null, 8, g),
91
- r("stop", {
92
- offset: "84%",
93
- "stop-color": i.phaseColor,
94
- "stop-opacity": "0.5"
95
- }, null, 8, _),
96
- r("stop", {
97
- offset: "100%",
98
- "stop-color": i.phaseColor,
99
- "stop-opacity": "0.75"
100
- }, null, 8, v)
101
- ], 8, u), r("linearGradient", {
102
- id: E.value,
103
- x1: "0",
104
- y1: "0",
105
- x2: "0.5",
106
- y2: "0.5"
107
- }, [...t[0] ||= [r("stop", {
108
- offset: "0%",
109
- "stop-color": "white",
110
- "stop-opacity": "0.55"
111
- }, null, -1), r("stop", {
112
- offset: "40%",
113
- "stop-color": "white",
114
- "stop-opacity": "0"
115
- }, null, -1)]], 8, y)]),
116
- r("path", {
117
- d: i.silhouette,
118
- fill: "currentColor"
119
- }, null, 8, b),
120
- r("path", {
121
- d: i.silhouette,
122
- fill: `url(#${T.value})`
123
- }, null, 8, x),
124
- r("path", {
125
- d: i.silhouette,
126
- fill: `url(#${E.value})`
127
- }, null, 8, S)
128
- ], 10, l));
129
- }
130
- });
131
- //#endregion
132
- export { C as t };
@@ -1,51 +0,0 @@
1
- import { t as e } from "./cn-DJXf4yaB.js";
2
- import { n as t } from "./keys-BsYjEFOW.js";
3
- import { computed as n, createElementBlock as r, createElementVNode as i, defineComponent as a, normalizeClass as o, normalizeStyle as s, openBlock as c, ref as l, renderSlot as u } from "vue";
4
- //#region src/components/custom/glyph-face/GlyphFace.vue?vue&type=script&setup=true&lang.ts
5
- var d = ["data-active"], f = /* @__PURE__ */ a({
6
- __name: "GlyphFace",
7
- props: {
8
- active: {
9
- type: Boolean,
10
- default: !1
11
- },
12
- tint: {},
13
- silhouette: {},
14
- class: { type: [
15
- Boolean,
16
- null,
17
- String,
18
- Object,
19
- Array
20
- ] }
21
- },
22
- setup(a) {
23
- let f = a, p = l(void 0);
24
- t(p);
25
- let m = n(() => e("glyph-face", f.class)), h = n(() => {
26
- let e = { "--gf-tint": f.tint ?? "transparent" }, t = f.silhouette ?? p.value;
27
- if (t) {
28
- let n = t.trim();
29
- e["--gf-silhouette"] = /^[Mm][\s.,\d-]/.test(n) ? `path('${n}')` : n;
30
- }
31
- return e;
32
- });
33
- return (e, t) => (c(), r("span", {
34
- class: o(m.value),
35
- "data-active": a.active ? "true" : "false",
36
- style: s(h.value)
37
- }, [
38
- t[0] ||= i("span", {
39
- class: "glyph-face-backplate",
40
- "aria-hidden": "true"
41
- }, null, -1),
42
- u(e.$slots, "default"),
43
- t[1] ||= i("span", {
44
- class: "glyph-face-cap",
45
- "aria-hidden": "true"
46
- }, null, -1)
47
- ], 14, d));
48
- }
49
- });
50
- //#endregion
51
- export { f as t };
@@ -1,39 +0,0 @@
1
- import { t as e } from "./cn-DJXf4yaB.js";
2
- import { t } from "./_plugin-vue_export-helper-ok8pgSl5.js";
3
- import { Fragment as n, createElementBlock as r, defineComponent as i, mergeModels as a, normalizeClass as o, openBlock as s, renderList as c, toDisplayString as l, unref as u, useModel as d } from "vue";
4
- //#region src/components/custom/tabs/UnderlineTabs.vue?vue&type=script&setup=true&lang.ts
5
- var f = ["aria-selected", "onClick"], p = /* @__PURE__ */ t(/* @__PURE__ */ i({
6
- __name: "UnderlineTabs",
7
- props: /* @__PURE__ */ a({
8
- options: {},
9
- class: { type: [
10
- Boolean,
11
- null,
12
- String,
13
- Object,
14
- Array
15
- ] }
16
- }, {
17
- modelValue: { required: !0 },
18
- modelModifiers: {}
19
- }),
20
- emits: ["update:modelValue"],
21
- setup(t) {
22
- let i = t, a = d(t, "modelValue");
23
- function p(e) {
24
- a.value = e;
25
- }
26
- return (d, m) => (s(), r("div", {
27
- role: "tablist",
28
- class: o(u(e)("underline-tabs", i.class))
29
- }, [(s(!0), r(n, null, c(t.options, (e) => (s(), r("button", {
30
- key: e.value,
31
- class: "underline-tab",
32
- role: "tab",
33
- "aria-selected": a.value === e.value ? "true" : "false",
34
- onClick: (t) => p(e.value)
35
- }, l(e.label), 9, f))), 128))], 2));
36
- }
37
- }), [["__scopeId", "data-v-f3ec0f83"]]);
38
- //#endregion
39
- export { p as t };
@@ -1,7 +0,0 @@
1
- /** The tensor-target format the CONSUMER declares (NOT baked in the substrate). */
2
- export declare const PAINTERLY_TENSOR_FORMAT: "rgba16float";
3
- /** The anisotropic-Kuwahara sector count the CONSUMER declares. */
4
- export declare const PAINTERLY_KUWAHARA_SECTORS: 8;
5
- export declare const PAINTERLY_TENSOR_WGSL = "\n@group(0) @binding(0) var baseTex: texture_2d<f32>;\n@group(0) @binding(1) var baseSampler: sampler;\n\nconst W_LUMA: vec3f = vec3f(0.2126, 0.7152, 0.0722);\n\n@fragment\nfn tensor_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let texel = 1.0 / vec2f(textureDimensions(baseTex));\n // 3x3 Sobel over luma.\n var l: array<f32, 9>;\n var k = 0;\n for (var dy = -1; dy <= 1; dy = dy + 1) {\n for (var dx = -1; dx <= 1; dx = dx + 1) {\n let s = textureSample(baseTex, baseSampler, uv + vec2f(f32(dx), f32(dy)) * texel).rgb;\n l[k] = dot(s, W_LUMA);\n k = k + 1;\n }\n }\n let gx = (l[2] + 2.0 * l[5] + l[8]) - (l[0] + 2.0 * l[3] + l[6]);\n let gy = (l[6] + 2.0 * l[7] + l[8]) - (l[0] + 2.0 * l[1] + l[2]);\n // (Jxx, Jyy, Jxy) \u2014 RGBA16F target (magnitudes exceed [0,1], 8-bit LDR clips).\n return vec4f(gx * gx, gy * gy, gx * gy, 1.0);\n}";
6
- export declare const PAINTERLY_SMOOTH_WGSL = "\n@group(0) @binding(0) var tensorTex: texture_2d<f32>;\n@group(0) @binding(1) var tensorSampler: sampler;\n@group(0) @binding(2) var<uniform> dir: vec2f;\n\n@fragment\nfn smooth_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let texel = 1.0 / vec2f(textureDimensions(tensorTex));\n // 9-tap Gaussian (sigma ~2) along the dir axis.\n let w = array<f32, 5>(0.227027, 0.194594, 0.121622, 0.054054, 0.016216);\n var sum = textureSample(tensorTex, tensorSampler, uv).xyz * w[0];\n for (var i = 1; i < 5; i = i + 1) {\n let off = dir * texel * f32(i);\n sum = sum + textureSample(tensorTex, tensorSampler, uv + off).xyz * w[i];\n sum = sum + textureSample(tensorTex, tensorSampler, uv - off).xyz * w[i];\n }\n return vec4f(sum, 1.0);\n}";
7
- export declare const PAINTERLY_KUWAHARA_WGSL: string;
@@ -1,4 +0,0 @@
1
- /** The wake velocity-texture format (the CONSUMER declares it; the substrate bakes none). */
2
- export declare const WAKE_TEXTURE_FORMAT: "rg16float";
3
- export declare const WAKE_ADVECT_WGSL = "\nstruct WakeUniforms {\n dt: f32,\n tempo: f32, // the master tempo scalar (0 under PRM/pause \u2014 freezes injection)\n dissipation: f32,\n pad: f32,\n splatPos: vec2f, // the delta-tracked pointer position (0..1)\n splatVel: vec2f, // the pointer velocity (the splat direction/strength)\n splatRadius: f32,\n rippleAmp: f32, // a click \u2192 a radial-ripple impulse\n pad2: vec2f,\n};\n\n@group(0) @binding(0) var velTex: texture_2d<f32>;\n@group(0) @binding(1) var velSampler: sampler;\n@group(0) @binding(2) var<uniform> U: WakeUniforms;\n\n@fragment\nfn advect_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n let texel = 1.0 / vec2f(textureDimensions(velTex));\n // Self-advection: trace back along the local velocity by dt (semi-Lagrangian).\n let v0 = textureSample(velTex, velSampler, uv).xy;\n let back = uv - v0 * U.dt;\n var v = textureSample(velTex, velSampler, back).xy;\n // Dissipate (the eddies decay so the wake lingers but fades).\n v = v * U.dissipation;\n\n // Delta-tracked Gaussian SPLAT \u2014 the pointer writes velocity into the field. The\n // injection is gated by the master tempo (0 under PRM \u2192 no new motion under reduce).\n let d = uv - U.splatPos;\n let g = exp(-dot(d, d) / max(U.splatRadius * U.splatRadius, 1e-6));\n v = v + U.splatVel * g * U.tempo;\n\n // Click \u2192 a radial-ripple impulse (pushes velocity radially outward from the splat).\n if (U.rippleAmp > 0.001) {\n let dir = d / max(length(d), 1e-4);\n v = v + dir * U.rippleAmp * g * U.tempo;\n }\n\n return vec4f(v, 0.0, 1.0);\n}";
4
- export declare const WAKE_APPLY_WGSL = "\n@group(0) @binding(0) var wakeTex: texture_2d<f32>;\n@group(0) @binding(1) var wakeSampler: sampler;\n\nfn wakeBias(uv: vec2f) -> vec2f {\n return textureSample(wakeTex, wakeSampler, uv).xy;\n}";
@@ -1,58 +0,0 @@
1
- /**
2
- * <DiscoGlyph> — faceted SVG glyph primitive.
3
- *
4
- * Three layers paint over a single `silhouette` path:
5
- * 1. base — the silhouette filled `currentColor` so consumers retain the
6
- * lucide cascade (Vignelli-clean colour register at idle).
7
- * 2. facet — an 8-stop linear gradient that simulates ~6 facets cutting
8
- * across the glyph face. `phaseColor` (default `currentColor`) drives
9
- * the hue; in active states a phase var (`--phase-color` or similar)
10
- * reads through. Q.W3.A.3: gradient axis adapts to silhouette via
11
- * `facetAxis` so each consumer picks the axis that cuts *across* its
12
- * dominant stroke direction (CheckDisco's V-shape calls for vertical;
13
- * ArrowRightDisco's horizontal shaft also vertical; PlayDisco's
14
- * triangle works on the diagonal).
15
- * 3. cap — a 165° specular catch-light gradient. White at the upper-left,
16
- * transparent past 40%; the polished-metal hot-spot a real disco
17
- * glyph would carry under club lighting.
18
- *
19
- * Q.W3.A.1 silhouette hand-off: when wrapped in a `<GlyphFace>`, this
20
- * primitive publishes its `silhouette` prop upward via the
21
- * `GLYPH_FACE_SILHOUETTE_KEY` injection slot, so the GlyphFace cap clips
22
- * to the disco silhouette without the wrapping consumer (PrimaryAction)
23
- * needing to mirror the path on every glyph swap. The provide/inject
24
- * path is reactive — GlyphFace re-reads when the descendant's
25
- * `silhouette` prop changes (e.g. PrimaryAction's `glyphFor(state)`
26
- * branches across Play / Check / ArrowRight / RotateCcw).
27
- *
28
- * `useId()` scopes the gradient ids so multiple glyphs on one page do not
29
- * collide post-SSR/hydration. The id format mirrors the existing speedtest
30
- * conventions (`disco-facet-<id>` / `disco-cap-<id>`).
31
- */
32
- type __VLS_Props = {
33
- /** SVG path d-attribute describing the glyph silhouette. */
34
- silhouette: string;
35
- /** SVG viewBox. Defaults `0 0 24 24`. */
36
- viewBox?: string;
37
- /** Phase-tinted state — wired through CSS class consumers may hook. */
38
- active?: boolean;
39
- /** Stop-color for the facet gradient. Defaults `currentColor`. */
40
- phaseColor?: string;
41
- /**
42
- * Axis along which the facet gradient runs. The 8 stops cut
43
- * perpendicular to this axis, so a diagonal axis gives diagonal
44
- * facets, vertical gives horizontal facets across the glyph,
45
- * etc. Q.W3.A.3 default stays diagonal; consumers picking an
46
- * axis that cuts across the silhouette's dominant stroke
47
- * sharpen the facet read at small render sizes.
48
- */
49
- facetAxis?: "diagonal" | "horizontal" | "vertical";
50
- };
51
- declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
52
- active: boolean;
53
- viewBox: string;
54
- phaseColor: string;
55
- facetAxis: "diagonal" | "horizontal" | "vertical";
56
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
57
- declare const _default: typeof __VLS_export;
58
- export default _default;
@@ -1 +0,0 @@
1
- export { default as DiscoGlyph } from "./DiscoGlyph.vue";
@@ -1,36 +0,0 @@
1
- import { type HTMLAttributes } from "vue";
2
- type __VLS_Props = {
3
- /** Scroll axis */
4
- orientation?: "horizontal" | "vertical";
5
- /** Expanded = items spread to fill space; collapsed = compact pill */
6
- expanded?: boolean;
7
- /** Enable scroll-snap */
8
- snap?: boolean | "mandatory" | "proximity";
9
- /** Show overflow fade indicators */
10
- fadeOverflow?: boolean;
11
- class?: HTMLAttributes["class"];
12
- };
13
- declare var __VLS_15: {};
14
- type __VLS_Slots = {} & {
15
- default?: (props: typeof __VLS_15) => any;
16
- };
17
- declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
18
- canScrollStart: import("vue").Ref<boolean, boolean>;
19
- canScrollEnd: import("vue").Ref<boolean, boolean>;
20
- scrollToItem: (index: number) => void;
21
- isTransitioning: import("vue").Ref<boolean, boolean>;
22
- visualExpanded: import("vue").Ref<boolean, boolean>;
23
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
24
- orientation: "horizontal" | "vertical";
25
- expanded: boolean;
26
- snap: boolean | "mandatory" | "proximity";
27
- fadeOverflow: boolean;
28
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
29
- declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
30
- declare const _default: typeof __VLS_export;
31
- export default _default;
32
- type __VLS_WithSlots<T, S> = T & {
33
- new (): {
34
- $slots: S;
35
- };
36
- };
@@ -1,28 +0,0 @@
1
- import { type HTMLAttributes } from "vue";
2
- type __VLS_Props = {
3
- /** Whether this item is the active/highlighted one */
4
- active?: boolean;
5
- /** Whether the item grows/shrinks between expanded and collapsed modes */
6
- expandable?: boolean;
7
- class?: HTMLAttributes["class"];
8
- };
9
- declare var __VLS_1: {};
10
- type __VLS_Slots = {} & {
11
- default?: (props: typeof __VLS_1) => any;
12
- };
13
- declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
14
- click: (e: MouseEvent) => any;
15
- }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
16
- onClick?: ((e: MouseEvent) => any) | undefined;
17
- }>, {
18
- active: boolean;
19
- expandable: boolean;
20
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
- declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
22
- declare const _default: typeof __VLS_export;
23
- export default _default;
24
- type __VLS_WithSlots<T, S> = T & {
25
- new (): {
26
- $slots: S;
27
- };
28
- };
@@ -1,4 +0,0 @@
1
- export { default as GlassCarousel } from "./GlassCarousel.vue";
2
- export { default as GlassCarouselItem } from "./GlassCarouselItem.vue";
3
- export { useGlassCarousel } from "./useGlassCarousel";
4
- export type { UseGlassCarouselOptions } from "./useGlassCarousel";
@@ -1,30 +0,0 @@
1
- import { type Ref } from "vue";
2
- export interface UseGlassCarouselOptions {
3
- /** Scroll axis */
4
- orientation: Ref<"horizontal" | "vertical">;
5
- /** The logical expanded state */
6
- expanded: Ref<boolean>;
7
- /** The carousel root element ref — dimensions are animated on this element */
8
- rootEl: Ref<HTMLElement | null>;
9
- /** The scroll viewport element ref (reka-ui ScrollAreaViewport) */
10
- viewportEl: Ref<HTMLElement | null>;
11
- /** Fade duration in ms before the mode swap (default: 60) */
12
- fadeMs?: number;
13
- }
14
- /**
15
- * Composable for GlassCarousel — manages scroll overflow detection,
16
- * expand/collapse transitions (following GlassDock's FLIP pattern),
17
- * and item scroll-to behavior.
18
- */
19
- export declare function useGlassCarousel(options: UseGlassCarouselOptions): {
20
- canScrollStart: Ref<boolean, boolean>;
21
- canScrollEnd: Ref<boolean, boolean>;
22
- getOverflowFadeClass: () => "" | "scroll-fade-y" | "scroll-fade-mask" | "scroll-fade-top" | "scroll-fade-bottom";
23
- updateOverflow: () => void;
24
- scrollToItem: (index: number) => void;
25
- visualExpanded: Ref<boolean, boolean>;
26
- isTransitioning: Ref<boolean, boolean>;
27
- transitionSize: Ref<string | null, string | null>;
28
- suppressTransition: Ref<boolean, boolean>;
29
- onTransitionEnd: (e: TransitionEvent) => void;
30
- };