@vibes.diy/base 14.3.21 → 14.3.23

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 (222) hide show
  1. package/components/StyleControls.js +27 -3
  2. package/components/StyleControls.js.map +1 -1
  3. package/components/VibesSwitch.d.ts +1 -2
  4. package/components/VibesSwitch.js +4 -59
  5. package/components/VibesSwitch.js.map +1 -1
  6. package/components/chip-fast-path.d.ts +6 -0
  7. package/components/chip-fast-path.js +2 -0
  8. package/components/chip-fast-path.js.map +1 -0
  9. package/components/editor-tabs.d.ts +3 -0
  10. package/components/editor-tabs.js +1 -0
  11. package/components/editor-tabs.js.map +1 -1
  12. package/components/index.d.ts +2 -17
  13. package/components/index.js +2 -17
  14. package/components/index.js.map +1 -1
  15. package/components/vibe-menu/VibeMenu.d.ts +16 -0
  16. package/components/vibe-menu/VibeMenu.js +99 -0
  17. package/components/vibe-menu/VibeMenu.js.map +1 -0
  18. package/components/vibe-menu/cards/AccountCard.d.ts +40 -0
  19. package/components/vibe-menu/cards/AccountCard.js +234 -0
  20. package/components/vibe-menu/cards/AccountCard.js.map +1 -0
  21. package/components/vibe-menu/cards/CodeCard.d.ts +20 -0
  22. package/components/vibe-menu/cards/CodeCard.js +109 -0
  23. package/components/vibe-menu/cards/CodeCard.js.map +1 -0
  24. package/components/vibe-menu/cards/CodeModeWorkspace.d.ts +31 -0
  25. package/components/vibe-menu/cards/CodeModeWorkspace.js +107 -0
  26. package/components/vibe-menu/cards/CodeModeWorkspace.js.map +1 -0
  27. package/components/vibe-menu/cards/HomeCard.d.ts +22 -0
  28. package/components/vibe-menu/cards/HomeCard.js +64 -0
  29. package/components/vibe-menu/cards/HomeCard.js.map +1 -0
  30. package/components/vibe-menu/cards/ShareCard.d.ts +9 -0
  31. package/components/vibe-menu/cards/ShareCard.js +84 -0
  32. package/components/vibe-menu/cards/ShareCard.js.map +1 -0
  33. package/components/vibe-menu/cards/ShareDrills.d.ts +35 -0
  34. package/components/vibe-menu/cards/ShareDrills.js +146 -0
  35. package/components/vibe-menu/cards/ShareDrills.js.map +1 -0
  36. package/components/vibe-menu/cards/ShareLinkRows.d.ts +6 -0
  37. package/components/vibe-menu/cards/ShareLinkRows.js +27 -0
  38. package/components/vibe-menu/cards/ShareLinkRows.js.map +1 -0
  39. package/components/vibe-menu/cards/share-actions.d.ts +13 -0
  40. package/components/vibe-menu/cards/share-actions.js +37 -0
  41. package/components/vibe-menu/cards/share-actions.js.map +1 -0
  42. package/components/vibe-menu/cards/share-card.styles.d.ts +1 -0
  43. package/components/vibe-menu/cards/share-card.styles.js +90 -0
  44. package/components/vibe-menu/cards/share-card.styles.js.map +1 -0
  45. package/components/vibe-menu/cards/share-copy.d.ts +24 -0
  46. package/components/vibe-menu/cards/share-copy.js +64 -0
  47. package/components/vibe-menu/cards/share-copy.js.map +1 -0
  48. package/components/vibe-menu/cards/share-parts.d.ts +46 -0
  49. package/components/vibe-menu/cards/share-parts.js +87 -0
  50. package/components/vibe-menu/cards/share-parts.js.map +1 -0
  51. package/components/vibe-menu/code-tabs.d.ts +11 -0
  52. package/components/vibe-menu/code-tabs.js +32 -0
  53. package/components/vibe-menu/code-tabs.js.map +1 -0
  54. package/components/vibe-menu/copy.d.ts +7 -0
  55. package/components/vibe-menu/copy.js +13 -0
  56. package/components/vibe-menu/copy.js.map +1 -0
  57. package/components/vibe-menu/fixtures.d.ts +42 -0
  58. package/components/vibe-menu/fixtures.js +184 -0
  59. package/components/vibe-menu/fixtures.js.map +1 -0
  60. package/components/vibe-menu/geometry.d.ts +24 -0
  61. package/components/vibe-menu/geometry.js +28 -0
  62. package/components/vibe-menu/geometry.js.map +1 -0
  63. package/components/vibe-menu/index.d.ts +42 -0
  64. package/components/vibe-menu/index.js +43 -0
  65. package/components/vibe-menu/index.js.map +1 -0
  66. package/components/vibe-menu/menu-state.d.ts +42 -0
  67. package/components/vibe-menu/menu-state.js +82 -0
  68. package/components/vibe-menu/menu-state.js.map +1 -0
  69. package/components/vibe-menu/moments.d.ts +13 -0
  70. package/components/vibe-menu/moments.js +39 -0
  71. package/components/vibe-menu/moments.js.map +1 -0
  72. package/components/vibe-menu/motion.d.ts +10 -0
  73. package/components/vibe-menu/motion.js +10 -0
  74. package/components/vibe-menu/motion.js.map +1 -0
  75. package/components/vibe-menu/open-resolver.d.ts +46 -0
  76. package/components/vibe-menu/open-resolver.js +91 -0
  77. package/components/vibe-menu/open-resolver.js.map +1 -0
  78. package/components/vibe-menu/parts/AccessToggle.d.ts +13 -0
  79. package/components/vibe-menu/parts/AccessToggle.js +58 -0
  80. package/components/vibe-menu/parts/AccessToggle.js.map +1 -0
  81. package/components/vibe-menu/parts/ActionPill.d.ts +18 -0
  82. package/components/vibe-menu/parts/ActionPill.js +21 -0
  83. package/components/vibe-menu/parts/ActionPill.js.map +1 -0
  84. package/components/vibe-menu/parts/BackRow.d.ts +8 -0
  85. package/components/vibe-menu/parts/BackRow.js +10 -0
  86. package/components/vibe-menu/parts/BackRow.js.map +1 -0
  87. package/components/vibe-menu/parts/Chip.d.ts +37 -0
  88. package/components/vibe-menu/parts/Chip.js +62 -0
  89. package/components/vibe-menu/parts/Chip.js.map +1 -0
  90. package/components/vibe-menu/parts/Composer.d.ts +39 -0
  91. package/components/vibe-menu/parts/Composer.js +47 -0
  92. package/components/vibe-menu/parts/Composer.js.map +1 -0
  93. package/components/vibe-menu/parts/DoneButton.d.ts +5 -0
  94. package/components/vibe-menu/parts/DoneButton.js +5 -0
  95. package/components/vibe-menu/parts/DoneButton.js.map +1 -0
  96. package/components/vibe-menu/parts/Glyph.d.ts +9 -0
  97. package/components/vibe-menu/parts/Glyph.js +123 -0
  98. package/components/vibe-menu/parts/Glyph.js.map +1 -0
  99. package/components/vibe-menu/parts/GrantControls.d.ts +13 -0
  100. package/components/vibe-menu/parts/GrantControls.js +61 -0
  101. package/components/vibe-menu/parts/GrantControls.js.map +1 -0
  102. package/components/vibe-menu/parts/MemberRow.d.ts +37 -0
  103. package/components/vibe-menu/parts/MemberRow.js +70 -0
  104. package/components/vibe-menu/parts/MemberRow.js.map +1 -0
  105. package/components/vibe-menu/parts/MenuCard.d.ts +10 -0
  106. package/components/vibe-menu/parts/MenuCard.js +7 -0
  107. package/components/vibe-menu/parts/MenuCard.js.map +1 -0
  108. package/components/vibe-menu/parts/MomentLine.d.ts +23 -0
  109. package/components/vibe-menu/parts/MomentLine.js +58 -0
  110. package/components/vibe-menu/parts/MomentLine.js.map +1 -0
  111. package/components/vibe-menu/parts/Row.d.ts +41 -0
  112. package/components/vibe-menu/parts/Row.js +60 -0
  113. package/components/vibe-menu/parts/Row.js.map +1 -0
  114. package/components/vibe-menu/parts/SectionStrip.d.ts +14 -0
  115. package/components/vibe-menu/parts/SectionStrip.js +26 -0
  116. package/components/vibe-menu/parts/SectionStrip.js.map +1 -0
  117. package/components/vibe-menu/parts/VibesSwitchGlass.d.ts +24 -0
  118. package/components/vibe-menu/parts/VibesSwitchGlass.js +66 -0
  119. package/components/vibe-menu/parts/VibesSwitchGlass.js.map +1 -0
  120. package/components/vibe-menu/parts/radio-keys.d.ts +5 -0
  121. package/components/vibe-menu/parts/radio-keys.js +13 -0
  122. package/components/vibe-menu/parts/radio-keys.js.map +1 -0
  123. package/components/vibe-menu/parts/use-composer-draft.d.ts +9 -0
  124. package/components/vibe-menu/parts/use-composer-draft.js +94 -0
  125. package/components/vibe-menu/parts/use-composer-draft.js.map +1 -0
  126. package/components/vibe-menu/share-fixtures.d.ts +15 -0
  127. package/components/vibe-menu/share-fixtures.js +72 -0
  128. package/components/vibe-menu/share-fixtures.js.map +1 -0
  129. package/components/vibe-menu/shell/VibeMenuShell.d.ts +30 -0
  130. package/components/vibe-menu/shell/VibeMenuShell.js +124 -0
  131. package/components/vibe-menu/shell/VibeMenuShell.js.map +1 -0
  132. package/components/vibe-menu/shell/menu-sequence.d.ts +20 -0
  133. package/components/vibe-menu/shell/menu-sequence.js +35 -0
  134. package/components/vibe-menu/shell/menu-sequence.js.map +1 -0
  135. package/components/vibe-menu/shell/outline-geometry.d.ts +63 -0
  136. package/components/vibe-menu/shell/outline-geometry.js +83 -0
  137. package/components/vibe-menu/shell/outline-geometry.js.map +1 -0
  138. package/components/vibe-menu/shell/shell.styles.d.ts +1 -0
  139. package/components/vibe-menu/shell/shell.styles.js +386 -0
  140. package/components/vibe-menu/shell/shell.styles.js.map +1 -0
  141. package/components/vibe-menu/shell/useMenuSequencer.d.ts +33 -0
  142. package/components/vibe-menu/shell/useMenuSequencer.js +490 -0
  143. package/components/vibe-menu/shell/useMenuSequencer.js.map +1 -0
  144. package/components/vibe-menu/slices.d.ts +182 -0
  145. package/components/vibe-menu/slices.js +5 -0
  146. package/components/vibe-menu/slices.js.map +1 -0
  147. package/components/vibe-menu/use-remix-hint.d.ts +9 -0
  148. package/components/vibe-menu/use-remix-hint.js +21 -0
  149. package/components/vibe-menu/use-remix-hint.js.map +1 -0
  150. package/components/vibe-menu/vibe-menu.styles.d.ts +5 -0
  151. package/components/vibe-menu/vibe-menu.styles.js +1424 -0
  152. package/components/vibe-menu/vibe-menu.styles.js.map +1 -0
  153. package/package.json +4 -4
  154. package/components/AccountView.d.ts +0 -10
  155. package/components/AccountView.js +0 -31
  156. package/components/AccountView.js.map +0 -1
  157. package/components/AdminModeControl.d.ts +0 -7
  158. package/components/AdminModeControl.js +0 -9
  159. package/components/AdminModeControl.js.map +0 -1
  160. package/components/CodingIndicator.d.ts +0 -6
  161. package/components/CodingIndicator.js +0 -53
  162. package/components/CodingIndicator.js.map +0 -1
  163. package/components/CreditsDetailMenu.d.ts +0 -15
  164. package/components/CreditsDetailMenu.js +0 -97
  165. package/components/CreditsDetailMenu.js.map +0 -1
  166. package/components/CreditsRingView.d.ts +0 -15
  167. package/components/CreditsRingView.js +0 -77
  168. package/components/CreditsRingView.js.map +0 -1
  169. package/components/EditorTabStrip.d.ts +0 -10
  170. package/components/EditorTabStrip.js +0 -15
  171. package/components/EditorTabStrip.js.map +0 -1
  172. package/components/LinkLineControls.d.ts +0 -9
  173. package/components/LinkLineControls.js +0 -72
  174. package/components/LinkLineControls.js.map +0 -1
  175. package/components/MadeHereView.d.ts +0 -8
  176. package/components/MadeHereView.js +0 -37
  177. package/components/MadeHereView.js.map +0 -1
  178. package/components/RecentVibesList.d.ts +0 -19
  179. package/components/RecentVibesList.js +0 -106
  180. package/components/RecentVibesList.js.map +0 -1
  181. package/components/RecommendedView.d.ts +0 -22
  182. package/components/RecommendedView.js +0 -172
  183. package/components/RecommendedView.js.map +0 -1
  184. package/components/RemixInviteView.d.ts +0 -4
  185. package/components/RemixInviteView.js +0 -11
  186. package/components/RemixInviteView.js.map +0 -1
  187. package/components/SeedDataOffer.d.ts +0 -8
  188. package/components/SeedDataOffer.js +0 -15
  189. package/components/SeedDataOffer.js.map +0 -1
  190. package/components/SignedInDiscoveryView.d.ts +0 -17
  191. package/components/SignedInDiscoveryView.js +0 -30
  192. package/components/SignedInDiscoveryView.js.map +0 -1
  193. package/components/SignedOutDiscoveryView.d.ts +0 -7
  194. package/components/SignedOutDiscoveryView.js +0 -15
  195. package/components/SignedOutDiscoveryView.js.map +0 -1
  196. package/components/SignedOutSavePrompt.d.ts +0 -4
  197. package/components/SignedOutSavePrompt.js +0 -33
  198. package/components/SignedOutSavePrompt.js.map +0 -1
  199. package/components/UnifiedVibeCard.d.ts +0 -129
  200. package/components/UnifiedVibeCard.js +0 -1658
  201. package/components/UnifiedVibeCard.js.map +0 -1
  202. package/components/UnifiedVibeCardSettings.styles.d.ts +0 -3
  203. package/components/UnifiedVibeCardSettings.styles.js +0 -95
  204. package/components/UnifiedVibeCardSettings.styles.js.map +0 -1
  205. package/components/UnifiedVibeCardShare.styles.d.ts +0 -3
  206. package/components/UnifiedVibeCardShare.styles.js +0 -72
  207. package/components/UnifiedVibeCardShare.styles.js.map +0 -1
  208. package/components/ViewerAccessSummary.d.ts +0 -28
  209. package/components/ViewerAccessSummary.js +0 -105
  210. package/components/ViewerAccessSummary.js.map +0 -1
  211. package/components/ViewerStandingView.d.ts +0 -7
  212. package/components/ViewerStandingView.js +0 -10
  213. package/components/ViewerStandingView.js.map +0 -1
  214. package/hooks/useCardFloat.d.ts +0 -6
  215. package/hooks/useCardFloat.js +0 -191
  216. package/hooks/useCardFloat.js.map +0 -1
  217. package/hooks/useHomeMotionPress.d.ts +0 -17
  218. package/hooks/useHomeMotionPress.js +0 -93
  219. package/hooks/useHomeMotionPress.js.map +0 -1
  220. package/motion/card-motion-source.d.ts +0 -23
  221. package/motion/card-motion-source.js +0 -50
  222. package/motion/card-motion-source.js.map +0 -1
@@ -0,0 +1,1424 @@
1
+ import * as React from "react";
2
+ export const VIBE_MENU_LIGHT_VARS = `
3
+ color-scheme: light;
4
+ --section-home: oklch(76.02% 0.1832 146.61);
5
+ --section-account: oklch(57.46% 0.2126 29.55);
6
+ --section-code: oklch(89.78% 0.1857 98.22);
7
+ --section-share: oklch(64.39% 0.1304 231.41);
8
+ --vibes-black: #000000;
9
+ --vibes-cream: #fffff0;
10
+ --menu-ink: #1a1a1a;
11
+ --card-bg: var(--vibes-cream);
12
+ --ink: #111111;
13
+ --muted: #555555;
14
+ --line: #111111;
15
+ --line-hairline: #1111112e;
16
+ --placeholder: var(--muted);
17
+ --suggest-border: #11111173;
18
+ --share-tint: #009ace1f;
19
+ --share-tint-strong: #009ace40;
20
+ --on-home: var(--menu-ink);
21
+ --on-account: var(--vibes-cream);
22
+ --on-code: var(--menu-ink);
23
+ --on-share: var(--menu-ink);
24
+ --badge: var(--section-account);
25
+ --on-badge: var(--vibes-cream);
26
+ --obsidian-fill: rgba(6, 9, 10, 0.94);
27
+ --obsidian-edge: rgba(255, 255, 255, 0.17);
28
+ --obsidian-highlight: rgba(255, 255, 255, 0.32);
29
+ --obsidian-rim: rgba(255, 255, 255, 0.1);
30
+ --font-display: "Alte Haas Grotesk", Inter, sans-serif;
31
+ --font-tab: Inter, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
32
+ --space-9: 9px;
33
+ --space-2: 2px;
34
+ --space-4: 4px;
35
+ --space-6: 6px;
36
+ --space-8: 8px;
37
+ --space-10: 10px;
38
+ --space-12: 12px;
39
+ --space-14: 14px;
40
+ --space-16: 16px;
41
+ --space-18: 18px;
42
+ --space-24: 24px;
43
+ --radius-card: 16px;
44
+ --radius-full: 999px;
45
+ --radius-bar-end: 25px;
46
+ --radius-access-line: 24px;
47
+ --radius-input: 22px;
48
+ --radius-done: 21px;
49
+ --radius-copy: 18px;
50
+ --radius-chip: 14px;
51
+ --radius-moment: 12px;
52
+ --radius-switch: 10px;
53
+ --radius-meter: 7px;
54
+ --obsidian-shadow: 0 2px 5px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(255, 255, 255, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.16), inset 0 -1px 0 rgba(255, 255, 255, 0.05), inset 0 0 12px rgba(255, 255, 255, 0.02);
55
+ --swatch-selected: 0 0 0 2px #fffff0, 0 0 0 4px #111111;
56
+ --stroke-rule: 2px;
57
+ --stroke-hairline: 1px;
58
+ --stroke-mini: 1.5px;
59
+ --stroke-focus: 3px;
60
+ --stroke-glyph: 2.4px;
61
+ --size-icon-circle: 28px;
62
+ --size-icon-circle-phone: 22px;
63
+ --size-glyph: 14px;
64
+ --size-glyph-cta: 20px;
65
+ --size-bar: 50px;
66
+ --size-tab: 176px;
67
+ --size-home-extra: 14px;
68
+ --size-bar-end: 63px;
69
+ --size-pill-w: 120px;
70
+ --size-pill-h: 44px;
71
+ --size-ring: 3px;
72
+ --size-edge: 24px;
73
+ --size-edge-phone: 16px;
74
+ --size-pill-flat-inset: 19px;
75
+ --size-band: 8px;
76
+ --size-row: 46px;
77
+ --size-row-compact: 42px;
78
+ --size-chip: 28px;
79
+ --size-copy: 36px;
80
+ --size-input: 44px;
81
+ --size-composer: 58px;
82
+ --size-access-line: 48px;
83
+ --size-segment: 32px;
84
+ --size-segment-mini: 24px;
85
+ --size-switch-w: 36px;
86
+ --size-meter: 14px;
87
+ --size-card-max: 480px;
88
+ --size-card-max-phone: 560px;
89
+ --size-log-max: 160px;
90
+ --size-code-mode-max-w: 1200px;
91
+ --opacity-tab-inactive: 0.73;
92
+ --opacity-row-disabled: 0.35;`;
93
+ export const VIBE_MENU_DARK_VARS = `
94
+ color-scheme: dark;
95
+ --card-bg: #1a1a1a;
96
+ --ink: #e0e0e0;
97
+ --muted: #a3a3a3;
98
+ --line: #e0e0e0;
99
+ --line-hairline: #e0e0e02e;
100
+ --suggest-border: #e0e0e073;
101
+ --swatch-selected: 0 0 0 2px #1a1a1a, 0 0 0 4px #e0e0e0;`;
102
+ export const VIBE_MENU_CSS = `
103
+ /* ---------- tokens (tokens.json), light, then both dark arms ----------
104
+ Detached layers (portalled out of the menu root) carry
105
+ data-vibe-menu-detached, so every token block lists them too. */
106
+ [data-vibe-menu],
107
+ [data-vibe-menu-detached] {${VIBE_MENU_LIGHT_VARS}
108
+ }
109
+ @media (prefers-color-scheme: dark) {
110
+ [data-vibe-menu],
111
+ [data-vibe-menu-detached] {${VIBE_MENU_DARK_VARS}
112
+ }
113
+ }
114
+ .dark [data-vibe-menu],
115
+ .dark [data-vibe-menu-detached] {${VIBE_MENU_DARK_VARS}
116
+ }
117
+
118
+ /* ---------- the root: the phone container ---------- */
119
+ [data-vibe-menu] {
120
+ container-name: vibe-menu;
121
+ container-type: inline-size;
122
+ color: var(--ink);
123
+ font-family: var(--font-display);
124
+ }
125
+
126
+ /* Scrollbars (smoke F15): thin, in the menu's hairline, both themes, never the
127
+ native dark bar inside the cream card. The colour is set on the root AND
128
+ every descendant, for every scroller the menu hosts (drills, the Embed box,
129
+ injected panels): the app's global sheet sets scrollbar-color on *, which
130
+ beats a colour only inherited from the root. The width rule has zero
131
+ specificity so a part that hides its bar (the Code mode tab strip) still
132
+ wins. The webkit arm is for engines without the standard properties; Chrome
133
+ ignores it once they are set. */
134
+ [data-vibe-menu],
135
+ [data-vibe-menu] *,
136
+ [data-vibe-menu-detached],
137
+ [data-vibe-menu-detached] * {
138
+ scrollbar-color: var(--line-hairline) transparent;
139
+ }
140
+ :where([data-vibe-menu]),
141
+ :where([data-vibe-menu]) :where(*) {
142
+ scrollbar-width: thin;
143
+ }
144
+ :where([data-vibe-menu]) ::-webkit-scrollbar {
145
+ width: 6px;
146
+ height: 6px;
147
+ background: transparent;
148
+ }
149
+ :where([data-vibe-menu]) ::-webkit-scrollbar-thumb {
150
+ border-radius: var(--radius-full);
151
+ background: var(--line-hairline);
152
+ }
153
+
154
+ /* A section is set by data-section on any ancestor (or the root), using the
155
+ code keys: home | settings (Account) | vibe (Code) | share. It sets --accent
156
+ (the section colour) and --on-accent (its label colour). */
157
+ [data-vibe-menu][data-section="home"],
158
+ [data-vibe-menu] [data-section="home"] {
159
+ --accent: var(--section-home);
160
+ --on-accent: var(--on-home);
161
+ }
162
+ [data-vibe-menu][data-section="settings"],
163
+ [data-vibe-menu] [data-section="settings"] {
164
+ --accent: var(--section-account);
165
+ --on-accent: var(--on-account);
166
+ }
167
+ [data-vibe-menu][data-section="vibe"],
168
+ [data-vibe-menu] [data-section="vibe"] {
169
+ --accent: var(--section-code);
170
+ --on-accent: var(--on-code);
171
+ }
172
+ [data-vibe-menu][data-section="share"],
173
+ [data-vibe-menu] [data-section="share"] {
174
+ --accent: var(--section-share);
175
+ --on-accent: var(--on-share);
176
+ }
177
+
178
+ [data-vibe-menu],
179
+ [data-vibe-menu] * {
180
+ box-sizing: border-box;
181
+ }
182
+ /* the card's surface and side padding, so rows can bleed edge to edge */
183
+ [data-vibe-menu] .vm-card-body {
184
+ position: relative;
185
+ padding: var(--space-14) var(--space-16) var(--space-16);
186
+ background: var(--card-bg);
187
+ color: var(--ink);
188
+ font: 400 14px/20px var(--font-display);
189
+ }
190
+ [data-vibe-menu] .vm-card-body.is-framed {
191
+ border: var(--stroke-rule) solid var(--line);
192
+ border-radius: var(--radius-card) var(--radius-card) 0 0;
193
+ overflow: hidden;
194
+ }
195
+
196
+ /* ---------- shared ---------- */
197
+ /* Zero specificity: every vm-* rule wins over it, and so does any utility
198
+ class on content a host injects into the card (slots). */
199
+ :where([data-vibe-menu]) :where(button) {
200
+ font: inherit;
201
+ color: inherit;
202
+ background: none;
203
+ border: 0;
204
+ padding: 0;
205
+ cursor: pointer;
206
+ text-align: left;
207
+ touch-action: manipulation;
208
+ }
209
+ [data-vibe-menu] .vm-glyph {
210
+ width: var(--size-glyph);
211
+ height: var(--size-glyph);
212
+ fill: none;
213
+ stroke: currentColor;
214
+ stroke-width: var(--stroke-glyph);
215
+ stroke-linecap: round;
216
+ stroke-linejoin: round;
217
+ flex: none;
218
+ }
219
+ [data-vibe-menu] .vm-label,
220
+ [data-vibe-menu] .vm-seg button,
221
+ [data-vibe-menu] .vm-chip {
222
+ font: 700 14px/1 var(--font-tab);
223
+ letter-spacing: 0.08em;
224
+ text-transform: uppercase;
225
+ }
226
+ [data-vibe-menu] .vm-label.is-plain {
227
+ font: 700 16px/1.1 var(--font-display);
228
+ letter-spacing: 0;
229
+ text-transform: none;
230
+ }
231
+ [data-vibe-menu] .vm-kicker,
232
+ [data-vibe-menu] .vm-subhead {
233
+ margin: 0 0 var(--space-8);
234
+ font: 700 10.5px/1.3 var(--font-tab);
235
+ letter-spacing: 0.14em;
236
+ text-transform: uppercase;
237
+ color: var(--muted);
238
+ }
239
+ [data-vibe-menu] .vm-subhead {
240
+ margin: var(--space-16) 0 0;
241
+ padding-bottom: var(--space-8);
242
+ }
243
+ [data-vibe-menu] .vm-sub {
244
+ margin: var(--space-8) 0 var(--space-14);
245
+ font-size: 13px;
246
+ color: var(--muted);
247
+ }
248
+ [data-vibe-menu] .vm-app-name {
249
+ white-space: nowrap;
250
+ }
251
+ [data-vibe-menu] .vm-busy {
252
+ width: 12px;
253
+ height: 12px;
254
+ border-radius: 50%;
255
+ border: var(--stroke-rule) solid var(--line);
256
+ border-top-color: transparent;
257
+ flex: none;
258
+ animation: vm-spin 0.9s linear infinite;
259
+ }
260
+ @keyframes vm-spin {
261
+ to {
262
+ transform: rotate(360deg);
263
+ }
264
+ }
265
+ @media (prefers-reduced-motion: reduce) {
266
+ [data-vibe-menu] .vm-busy {
267
+ animation: none;
268
+ border-top-color: var(--line);
269
+ }
270
+ }
271
+
272
+ /* ---------- SectionStrip: the bar ---------- */
273
+ [data-vibe-menu] .vm-menu {
274
+ position: relative;
275
+ }
276
+ [data-vibe-menu] .vm-strip {
277
+ position: relative;
278
+ width: calc(var(--size-tab) * 4 + var(--size-home-extra) + var(--size-bar-end) + 2px);
279
+ height: var(--size-bar);
280
+ }
281
+ [data-vibe-menu] .vm-strip-slide {
282
+ width: 100%;
283
+ height: 100%;
284
+ display: flex;
285
+ justify-content: flex-end;
286
+ border: var(--stroke-rule) solid var(--line);
287
+ border-right: 0;
288
+ border-radius: var(--bar-tl, var(--radius-bar-end)) 0 0 var(--radius-bar-end);
289
+ overflow: hidden;
290
+ background: var(--card-bg);
291
+ }
292
+ [data-vibe-menu] .vm-tab {
293
+ position: relative;
294
+ width: var(--size-tab);
295
+ flex: none;
296
+ height: 100%;
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: flex-start;
300
+ border: 0;
301
+ padding: 0 0 0 var(--space-9);
302
+ cursor: pointer;
303
+ background: var(--accent);
304
+ }
305
+ [data-vibe-menu] .vm-tab-circle {
306
+ width: var(--size-icon-circle);
307
+ height: var(--size-icon-circle);
308
+ border-radius: 50%;
309
+ background: var(--menu-ink);
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ flex: none;
314
+ }
315
+ [data-vibe-menu] .vm-tab svg {
316
+ width: calc(var(--size-icon-circle) / 2);
317
+ height: calc(var(--size-icon-circle) / 2);
318
+ fill: none;
319
+ stroke: var(--vibes-cream);
320
+ stroke-width: 2.5;
321
+ stroke-linecap: round;
322
+ stroke-linejoin: round;
323
+ flex: none;
324
+ }
325
+ [data-vibe-menu] .vm-tab-label {
326
+ position: absolute;
327
+ inset: 0;
328
+ display: flex;
329
+ align-items: center;
330
+ justify-content: center;
331
+ padding: 0 0 0 1.9px;
332
+ font-family: var(--font-tab);
333
+ font-size: 14px;
334
+ font-weight: 700;
335
+ letter-spacing: 1.9px;
336
+ text-transform: uppercase;
337
+ white-space: nowrap;
338
+ pointer-events: none;
339
+ color: var(--on-accent);
340
+ }
341
+ [data-vibe-menu] .vm-tab[data-section="home"] {
342
+ width: calc(var(--size-tab) + var(--size-home-extra));
343
+ padding-left: calc(var(--space-9) + var(--size-home-extra) / 2);
344
+ }
345
+ [data-vibe-menu] .vm-tab[data-section="home"] .vm-tab-label {
346
+ left: calc(var(--size-home-extra) / 2);
347
+ }
348
+ [data-vibe-menu] .vm-tab[data-section="share"] {
349
+ width: calc(var(--size-tab) + var(--size-bar-end));
350
+ }
351
+ [data-vibe-menu] .vm-tab[data-section="share"] .vm-tab-label {
352
+ right: var(--size-bar-end);
353
+ }
354
+ [data-vibe-menu] .vm-tab:focus-visible {
355
+ outline: var(--stroke-focus) solid var(--line);
356
+ outline-offset: -3px;
357
+ }
358
+ /* Port change (smoke F5): the DS inset line ring vanished on the black pill
359
+ and drew square corners. The pill's ring is cream, sits in the obsidian
360
+ glass's 3px rim (offset 0), and follows the stadium (the pill's radius). */
361
+ [data-vibe-menu] .vm-pill:focus-visible {
362
+ outline: var(--stroke-focus) solid var(--vibes-cream);
363
+ outline-offset: 0;
364
+ }
365
+ [data-vibe-menu] .vm-menu.has-card .vm-tab:not(.is-active) {
366
+ opacity: var(--opacity-tab-inactive);
367
+ }
368
+ [data-vibe-menu] .vm-badge {
369
+ position: absolute;
370
+ top: -4px;
371
+ right: 6px;
372
+ min-width: 18px;
373
+ height: 18px;
374
+ padding: 0 5px;
375
+ border-radius: var(--radius-full);
376
+ background: var(--badge);
377
+ color: var(--on-badge);
378
+ font: 700 11px/18px var(--font-display);
379
+ text-align: center;
380
+ }
381
+ /* the bar sits against the pill: it runs half the glass under it */
382
+ [data-vibe-menu] .vm-bar-anchor {
383
+ position: relative;
384
+ height: var(--size-bar);
385
+ }
386
+ [data-vibe-menu] .vm-bar-anchor .vm-strip {
387
+ position: absolute;
388
+ left: 0;
389
+ bottom: 0;
390
+ }
391
+ [data-vibe-menu] .vm-bar-anchor .vm-glass {
392
+ position: absolute;
393
+ right: 0;
394
+ bottom: 0;
395
+ }
396
+ /* phones: the bar spans the width; tabs sized to their content, icon above label */
397
+ [data-vibe-menu] .vm-strip.is-phone {
398
+ width: 100%;
399
+ }
400
+ [data-vibe-menu] .vm-strip.is-phone .vm-tab {
401
+ width: auto;
402
+ flex: 1 1 auto;
403
+ flex-direction: column;
404
+ align-items: center;
405
+ justify-content: center;
406
+ gap: var(--space-2);
407
+ min-width: 0;
408
+ padding: 4px 2px;
409
+ }
410
+ [data-vibe-menu] .vm-strip.is-phone .vm-tab-circle {
411
+ width: var(--size-icon-circle-phone);
412
+ height: var(--size-icon-circle-phone);
413
+ }
414
+ [data-vibe-menu] .vm-strip.is-phone .vm-tab svg {
415
+ width: 12px;
416
+ height: 12px;
417
+ }
418
+ [data-vibe-menu] .vm-strip.is-phone .vm-tab[data-section="home"] {
419
+ padding: 4px 2px 4px calc(2px + var(--size-home-extra) * 0.7);
420
+ }
421
+ [data-vibe-menu] .vm-strip.is-phone .vm-tab[data-section="share"] {
422
+ padding-right: var(--size-bar-end);
423
+ flex-grow: 1;
424
+ }
425
+ [data-vibe-menu] .vm-strip.is-phone .vm-tab-label {
426
+ position: static;
427
+ display: block;
428
+ font-size: 9.6px;
429
+ letter-spacing: 1px;
430
+ padding: 0 0 0 1px;
431
+ }
432
+
433
+ /* ---------- VibesSwitch: the pill in its obsidian glass ---------- */
434
+ [data-vibe-menu] .vm-glass {
435
+ position: relative;
436
+ width: calc(var(--size-pill-w) + 2 * var(--size-ring));
437
+ height: calc(var(--size-pill-h) + 2 * var(--size-ring));
438
+ border-radius: var(--radius-full);
439
+ flex: none;
440
+ background:
441
+ linear-gradient(to right, transparent, var(--obsidian-highlight), transparent) top / 100% 1px no-repeat,
442
+ linear-gradient(to bottom, var(--obsidian-highlight), transparent, var(--obsidian-edge)) left / 1px 100% no-repeat,
443
+ var(--obsidian-fill);
444
+ box-shadow: var(--obsidian-shadow);
445
+ }
446
+ [data-vibe-menu] .vm-pill {
447
+ position: absolute;
448
+ left: var(--size-ring);
449
+ top: var(--size-ring);
450
+ width: var(--size-pill-w);
451
+ height: var(--size-pill-h);
452
+ padding: 0;
453
+ border: 0;
454
+ border-radius: var(--radius-full);
455
+ background: none;
456
+ cursor: pointer;
457
+ }
458
+ [data-vibe-menu] .vm-switch-art {
459
+ width: 100%;
460
+ height: 100%;
461
+ display: block;
462
+ }
463
+ [data-vibe-menu] .vm-pill .vm-badge {
464
+ top: -6px;
465
+ right: 4px;
466
+ }
467
+ [data-vibe-menu] .vm-chiclet {
468
+ display: inline-block;
469
+ padding: 2px 8px;
470
+ border-radius: var(--radius-full);
471
+ background: var(--section-code);
472
+ /* Port change: bundle.css writes #111111 (ink); text on a section colour is
473
+ menu-ink (Global Constraints), which --on-code resolves to in both themes. */
474
+ color: var(--on-code);
475
+ font: 700 11px/18px var(--font-display);
476
+ letter-spacing: 0.06em;
477
+ }
478
+
479
+ /* ---------- MenuCard: the card, its band and the folder-tab join, drawn once ---------- */
480
+ [data-vibe-menu] .vm-frame {
481
+ position: relative;
482
+ }
483
+ [data-vibe-menu] .vm-frame .vm-card {
484
+ position: absolute;
485
+ left: 0;
486
+ top: 0;
487
+ background: var(--card-bg);
488
+ color: var(--ink);
489
+ overflow: hidden;
490
+ border-radius: var(--radius-card) var(--radius-card) 0 0;
491
+ }
492
+ [data-vibe-menu] .vm-frame .vm-card .vm-card-body {
493
+ padding-bottom: calc(var(--space-16) + var(--size-band));
494
+ }
495
+ [data-vibe-menu] .vm-outline {
496
+ position: absolute;
497
+ left: 0;
498
+ top: 0;
499
+ overflow: visible;
500
+ pointer-events: none;
501
+ }
502
+ [data-vibe-menu] .vm-outline .vm-band,
503
+ [data-vibe-menu] .vm-outline .vm-cover {
504
+ fill: var(--accent);
505
+ }
506
+ [data-vibe-menu] .vm-outline .vm-edge {
507
+ fill: none;
508
+ stroke: var(--line);
509
+ stroke-width: 2;
510
+ stroke-linejoin: miter;
511
+ }
512
+
513
+ /* ---------- ActionPill: the card's one main action ---------- */
514
+ [data-vibe-menu] .vm-ask {
515
+ display: flex;
516
+ align-items: center;
517
+ justify-content: space-between;
518
+ gap: var(--space-12);
519
+ width: 100%;
520
+ padding: var(--space-14) var(--space-18);
521
+ border: var(--stroke-rule) solid var(--line);
522
+ border-radius: var(--radius-full);
523
+ background: var(--accent);
524
+ color: var(--on-accent);
525
+ font: 700 21px/1 var(--font-display);
526
+ letter-spacing: -0.02em;
527
+ cursor: pointer;
528
+ }
529
+ [data-vibe-menu] .vm-ask.is-solo {
530
+ margin-bottom: var(--space-14);
531
+ }
532
+ [data-vibe-menu] .vm-ask .vm-glyph {
533
+ width: var(--size-glyph-cta);
534
+ height: var(--size-glyph-cta);
535
+ transition: transform 160ms cubic-bezier(0.22, 1, 0.36, 1);
536
+ }
537
+ [data-vibe-menu] .vm-ask:hover .vm-glyph {
538
+ transform: translateX(4px);
539
+ }
540
+ [data-vibe-menu] .vm-ask.is-phone {
541
+ font-size: 18px;
542
+ }
543
+ [data-vibe-menu] .vm-sub:has(.vm-copy) {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: var(--space-8);
547
+ }
548
+ [data-vibe-menu] .vm-sub:has(.vm-copy) > span {
549
+ flex: 1;
550
+ }
551
+
552
+ /* ---------- Chip ---------- */
553
+ [data-vibe-menu] .vm-chip {
554
+ height: var(--size-chip);
555
+ padding: 0 var(--space-12);
556
+ border: var(--stroke-rule) solid var(--line);
557
+ border-radius: var(--radius-chip);
558
+ background: var(--accent);
559
+ color: var(--on-accent);
560
+ font-size: 11px;
561
+ flex: none;
562
+ cursor: pointer;
563
+ }
564
+ [data-vibe-menu] .vm-chip.is-ghost {
565
+ background: transparent;
566
+ color: var(--ink);
567
+ }
568
+ [data-vibe-menu] .vm-chip.is-name {
569
+ font: 700 14px/1 var(--font-display);
570
+ letter-spacing: 0;
571
+ text-transform: none;
572
+ }
573
+ [data-vibe-menu] .vm-chip.vm-copy {
574
+ height: var(--size-copy);
575
+ padding: 0 var(--space-14);
576
+ border-radius: var(--radius-copy);
577
+ flex-shrink: 0;
578
+ align-self: center;
579
+ white-space: nowrap;
580
+ }
581
+ [data-vibe-menu] .vm-suggestions {
582
+ display: flex;
583
+ flex-wrap: wrap;
584
+ gap: var(--space-6);
585
+ }
586
+ /* Port change (smoke F9): codegen writes long chips, so a chip wraps inside
587
+ the card (DS "text that can outgrow its track wraps") instead of running
588
+ past its edge; a one-line chip keeps the 28px chip height. */
589
+ [data-vibe-menu] .vm-suggest {
590
+ min-height: var(--size-chip);
591
+ max-width: 100%;
592
+ min-width: 0;
593
+ padding: var(--space-2) var(--space-12);
594
+ text-align: left;
595
+ overflow-wrap: anywhere;
596
+ border: var(--stroke-mini) solid var(--suggest-border);
597
+ border-radius: var(--radius-chip);
598
+ background: none;
599
+ color: var(--ink);
600
+ font: 400 13px/20px var(--font-display);
601
+ cursor: pointer;
602
+ }
603
+ [data-vibe-menu] .vm-suggest:hover,
604
+ [data-vibe-menu] .vm-suggest.is-hover {
605
+ border-color: var(--line);
606
+ background: color-mix(in srgb, var(--accent) 35%, transparent);
607
+ }
608
+ [data-vibe-menu] .vm-picks {
609
+ display: flex;
610
+ flex-wrap: wrap;
611
+ align-items: center;
612
+ gap: var(--space-6);
613
+ }
614
+
615
+ /* ---------- Composer: the logo pill's shape ---------- */
616
+ [data-vibe-menu] .vm-composer {
617
+ display: flex;
618
+ align-items: stretch;
619
+ min-height: var(--size-composer);
620
+ margin-bottom: var(--space-16);
621
+ border: var(--stroke-rule) solid var(--line);
622
+ border-radius: var(--radius-full);
623
+ overflow: hidden;
624
+ background: var(--card-bg);
625
+ }
626
+ [data-vibe-menu] .vm-composer:focus-within,
627
+ [data-vibe-menu] .vm-composer.is-focus {
628
+ box-shadow: 0 0 0 3px var(--accent);
629
+ }
630
+ [data-vibe-menu] .vm-composer textarea {
631
+ flex: 1;
632
+ min-width: 0;
633
+ align-self: center;
634
+ margin: 0 var(--space-12) 0 2px;
635
+ padding: 0;
636
+ resize: none;
637
+ border: 0;
638
+ outline: 0;
639
+ background: transparent;
640
+ color: var(--ink);
641
+ font: 700 18px/1.2 var(--font-display);
642
+ letter-spacing: -0.02em;
643
+ field-sizing: content;
644
+ max-height: 2.4em;
645
+ }
646
+ [data-vibe-menu] .vm-composer textarea::placeholder {
647
+ color: var(--placeholder);
648
+ }
649
+ [data-vibe-menu] .vm-composer .vm-attach {
650
+ order: -1;
651
+ width: var(--size-copy);
652
+ height: var(--size-copy);
653
+ margin-left: var(--space-10);
654
+ align-self: center;
655
+ border-radius: 50%;
656
+ display: grid;
657
+ place-items: center;
658
+ flex: none;
659
+ color: var(--muted);
660
+ }
661
+ [data-vibe-menu] .vm-composer .vm-attach:hover {
662
+ color: var(--ink);
663
+ }
664
+ [data-vibe-menu] .vm-composer .vm-glyph {
665
+ width: 16px;
666
+ height: 16px;
667
+ }
668
+ [data-vibe-menu] .vm-cap {
669
+ flex: none;
670
+ display: flex;
671
+ align-items: center;
672
+ justify-content: center;
673
+ padding: 0 var(--space-24) 0 20px;
674
+ border-left: var(--stroke-rule) solid var(--line);
675
+ background: var(--section-code);
676
+ color: var(--on-code);
677
+ font: 700 14px/1 var(--font-tab);
678
+ letter-spacing: 0.08em;
679
+ text-transform: uppercase;
680
+ white-space: nowrap;
681
+ cursor: pointer;
682
+ }
683
+ [data-vibe-menu] .vm-cap:hover {
684
+ background: color-mix(in oklch, var(--section-code), var(--menu-ink) 10%);
685
+ }
686
+ [data-vibe-menu] .vm-composer.is-building .vm-cap[data-send],
687
+ [data-vibe-menu] .vm-composer.is-building:has(textarea:not(:placeholder-shown)) .vm-cap[data-stop] {
688
+ display: none;
689
+ }
690
+ [data-vibe-menu] .vm-composer.is-building:has(textarea:not(:placeholder-shown)) .vm-cap[data-send] {
691
+ display: flex;
692
+ }
693
+ [data-vibe-menu] .vm-queue-note {
694
+ display: none;
695
+ margin: -10px 0 12px 18px;
696
+ font-size: 12px;
697
+ color: var(--muted);
698
+ }
699
+ [data-vibe-menu] .vm-composer:has(textarea:not(:placeholder-shown)) + .vm-queue-note {
700
+ display: block;
701
+ }
702
+ [data-vibe-menu] .vm-composer.is-phone textarea {
703
+ margin-right: var(--space-6);
704
+ font-size: 16px;
705
+ }
706
+ [data-vibe-menu] .vm-composer.is-phone .vm-attach {
707
+ margin-left: 4px;
708
+ width: 28px;
709
+ }
710
+ [data-vibe-menu] .vm-composer.is-phone .vm-cap {
711
+ padding: 0 var(--space-18) 0 var(--space-14);
712
+ }
713
+
714
+ /* ---------- Row: the bar's tab grammar inside the card ---------- */
715
+ [data-vibe-menu] .vm-group {
716
+ border-top: var(--stroke-rule) solid var(--line);
717
+ margin: 0 calc(-1 * var(--space-16));
718
+ }
719
+ [data-vibe-menu] .vm-group.is-flush {
720
+ border-top: var(--stroke-hairline) solid var(--line-hairline);
721
+ }
722
+ [data-vibe-menu] .vm-row {
723
+ display: flex;
724
+ align-items: center;
725
+ gap: var(--space-12);
726
+ width: 100%;
727
+ height: var(--size-row);
728
+ padding: 0 var(--space-16);
729
+ }
730
+ [data-vibe-menu] .vm-row.is-compact {
731
+ height: var(--size-row-compact);
732
+ }
733
+ [data-vibe-menu] .vm-row + .vm-row {
734
+ border-top: var(--stroke-hairline) solid var(--line-hairline);
735
+ }
736
+ [data-vibe-menu] .vm-row .vm-label {
737
+ flex: 1;
738
+ }
739
+ [data-vibe-menu] .vm-dot {
740
+ width: var(--size-icon-circle);
741
+ height: var(--size-icon-circle);
742
+ border-radius: 50%;
743
+ background: var(--ink);
744
+ color: var(--card-bg);
745
+ display: grid;
746
+ place-items: center;
747
+ flex: none;
748
+ }
749
+ [data-vibe-menu] button.vm-row:hover .vm-dot:not(.vm-app),
750
+ [data-vibe-menu] .vm-row.is-hover .vm-dot:not(.vm-app) {
751
+ background: var(--accent);
752
+ color: var(--on-accent);
753
+ }
754
+ [data-vibe-menu] .vm-row.is-quiet .vm-dot {
755
+ background: transparent;
756
+ color: var(--ink);
757
+ box-shadow: inset 0 0 0 2px var(--line);
758
+ }
759
+ [data-vibe-menu] .vm-row[aria-disabled="true"] {
760
+ opacity: 0.35;
761
+ cursor: default;
762
+ }
763
+ [data-vibe-menu] .vm-row[aria-disabled="true"] .vm-dot {
764
+ background: var(--ink) !important;
765
+ color: var(--card-bg) !important;
766
+ }
767
+ [data-vibe-menu] .vm-app,
768
+ [data-vibe-menu] .vm-initial {
769
+ font: 700 12px/1 var(--font-tab);
770
+ box-shadow: inset 0 0 0 2px var(--line);
771
+ }
772
+ [data-vibe-menu] .vm-app {
773
+ background: var(--app);
774
+ color: var(--menu-ink);
775
+ }
776
+ [data-vibe-menu] .vm-initial {
777
+ background: transparent;
778
+ color: var(--ink);
779
+ }
780
+ [data-vibe-menu] .vm-chev {
781
+ display: grid;
782
+ color: var(--muted);
783
+ transition: transform 160ms cubic-bezier(0.22, 1, 0.36, 1);
784
+ }
785
+ [data-vibe-menu] .vm-chev.is-open {
786
+ transform: rotate(90deg);
787
+ }
788
+ [data-vibe-menu] .vm-count {
789
+ font: 700 12px/1 var(--font-tab);
790
+ letter-spacing: 0.08em;
791
+ color: var(--muted);
792
+ }
793
+ [data-vibe-menu] .vm-count.is-handle {
794
+ max-width: 45%;
795
+ overflow: hidden;
796
+ text-overflow: ellipsis;
797
+ white-space: nowrap;
798
+ letter-spacing: 0.02em;
799
+ }
800
+ [data-vibe-menu] .vm-switch {
801
+ position: relative;
802
+ width: var(--size-switch-w);
803
+ height: 20px;
804
+ border: var(--stroke-rule) solid var(--line);
805
+ border-radius: var(--radius-switch);
806
+ flex: none;
807
+ }
808
+ [data-vibe-menu] .vm-switch::after {
809
+ content: "";
810
+ position: absolute;
811
+ top: 2px;
812
+ left: 2px;
813
+ width: 12px;
814
+ height: 12px;
815
+ border-radius: 50%;
816
+ background: var(--ink);
817
+ }
818
+ [data-vibe-menu] .vm-switch.is-on {
819
+ background: var(--accent);
820
+ }
821
+ [data-vibe-menu] .vm-switch.is-on::after {
822
+ left: 18px;
823
+ }
824
+
825
+ /* ---------- BackRow and DoneButton: a drill-in's frame ---------- */
826
+ [data-vibe-menu] .vm-back {
827
+ display: flex;
828
+ align-items: center;
829
+ gap: var(--space-12);
830
+ width: calc(100% + 2 * var(--space-16));
831
+ height: var(--size-row-compact);
832
+ margin: 0 calc(-1 * var(--space-16));
833
+ padding: 0 var(--space-16);
834
+ border-top: var(--stroke-rule) solid var(--line);
835
+ border-bottom: var(--stroke-hairline) solid var(--line-hairline);
836
+ }
837
+ /* A drill that replaces the whole card body (Share, Account) sits on the card's
838
+ top edge, which the outline already draws: no rule, and it takes the body's
839
+ top padding so no empty band shows above it (cards-hero.css .card-title + .h-back). */
840
+ [data-vibe-menu] .vm-back.is-top {
841
+ margin-top: calc(-1 * var(--space-14));
842
+ border-top: 0;
843
+ }
844
+ [data-vibe-menu] .vm-back .vm-label {
845
+ flex: none;
846
+ }
847
+ [data-vibe-menu] .vm-back-name {
848
+ min-width: 0;
849
+ overflow: hidden;
850
+ text-overflow: ellipsis;
851
+ white-space: nowrap;
852
+ font: 400 16px/1.1 var(--font-display);
853
+ color: var(--muted);
854
+ }
855
+ [data-vibe-menu] .vm-back:hover .vm-dot,
856
+ [data-vibe-menu] .vm-back.is-hover .vm-dot {
857
+ background: var(--accent);
858
+ color: var(--on-accent);
859
+ }
860
+ [data-vibe-menu] .vm-drill {
861
+ padding-top: var(--space-14);
862
+ }
863
+ [data-vibe-menu] .vm-drill-sec + .vm-drill-sec {
864
+ margin-top: var(--space-14);
865
+ }
866
+ [data-vibe-menu] .vm-drill-line {
867
+ margin: 0 0 var(--space-14);
868
+ font: 700 18px/1.25 var(--font-display);
869
+ letter-spacing: -0.01em;
870
+ }
871
+ [data-vibe-menu] .vm-done {
872
+ display: block;
873
+ width: 100%;
874
+ height: var(--size-row-compact);
875
+ margin-top: var(--space-16);
876
+ border: var(--stroke-rule) solid var(--line);
877
+ border-radius: var(--radius-done);
878
+ background: var(--accent);
879
+ color: var(--on-accent);
880
+ text-align: center;
881
+ font: 700 14px/1 var(--font-tab);
882
+ letter-spacing: 0.08em;
883
+ text-transform: uppercase;
884
+ cursor: pointer;
885
+ }
886
+ [data-vibe-menu] .vm-textbtn {
887
+ display: block;
888
+ width: 100%;
889
+ height: 40px;
890
+ margin-top: var(--space-4);
891
+ text-align: center;
892
+ font: 700 12px/1 var(--font-tab);
893
+ letter-spacing: 0.1em;
894
+ text-transform: uppercase;
895
+ color: var(--muted);
896
+ }
897
+ [data-vibe-menu] .vm-textbtn:hover {
898
+ color: var(--ink);
899
+ }
900
+ [data-vibe-menu] .vm-faq {
901
+ display: flex;
902
+ align-items: center;
903
+ justify-content: space-between;
904
+ gap: var(--space-12);
905
+ width: 100%;
906
+ padding: var(--space-12) 0;
907
+ font: 400 16px/1.3 var(--font-display);
908
+ }
909
+ [data-vibe-menu] .vm-faq + .vm-faq {
910
+ border-top: var(--stroke-hairline) solid var(--line-hairline);
911
+ }
912
+
913
+ /* ---------- MomentLine: the current moment ---------- */
914
+ [data-vibe-menu] .vm-moments {
915
+ display: flex;
916
+ flex-direction: column;
917
+ gap: var(--space-8);
918
+ }
919
+ [data-vibe-menu] .vm-moment {
920
+ margin: 0;
921
+ font: 400 16px/1.3 var(--font-display);
922
+ color: var(--ink);
923
+ }
924
+ [data-vibe-menu] .vm-moment.is-pinned {
925
+ padding: var(--space-10) var(--space-12) var(--space-12) var(--space-14);
926
+ border: var(--stroke-rule) solid var(--line);
927
+ border-left: var(--size-band) solid var(--accent);
928
+ border-radius: var(--radius-moment);
929
+ }
930
+ [data-vibe-menu] .vm-moment-text {
931
+ margin: 0 0 var(--space-10);
932
+ }
933
+ [data-vibe-menu] .vm-moment-actions {
934
+ display: flex;
935
+ flex-wrap: wrap;
936
+ align-items: center;
937
+ gap: var(--space-6);
938
+ }
939
+ [data-vibe-menu] .vm-moment-hint {
940
+ font-size: 12px;
941
+ color: var(--muted);
942
+ }
943
+ [data-vibe-menu] .vm-moment.is-progress,
944
+ [data-vibe-menu] .vm-moment.is-summary {
945
+ display: flex;
946
+ align-items: center;
947
+ gap: var(--space-10);
948
+ padding: 0 var(--space-2);
949
+ }
950
+ [data-vibe-menu] .vm-moment.is-summary {
951
+ color: var(--muted);
952
+ }
953
+ [data-vibe-menu] .vm-moment.is-expander {
954
+ width: 100%;
955
+ gap: var(--space-8);
956
+ }
957
+ [data-vibe-menu] .vm-moment.is-expander:hover {
958
+ color: var(--ink);
959
+ }
960
+ [data-vibe-menu] .vm-live .vm-chev {
961
+ color: var(--ink);
962
+ }
963
+ [data-vibe-menu] .vm-log-clip {
964
+ overflow: hidden;
965
+ }
966
+ /* Port addition (RULINGS R1): the log clip is always rendered (RECONCILE §5c),
967
+ so the base stylesheet owns its shut and open states. The shell's per-frame
968
+ tween (T11) writes an inline height, which overrides these during motion.
969
+ C's VIBE_MENU_SHELL_CSS does not repeat them. */
970
+ [data-vibe-menu] .vm-log-clip[data-open="false"] {
971
+ height: 0;
972
+ overflow: hidden;
973
+ }
974
+ [data-vibe-menu] .vm-log-clip[data-open="true"] {
975
+ height: auto;
976
+ /* Known adjustment (plan header): room for .vm-log's own 160px cap plus its
977
+ 8px margin-top and two hairline borders, so the clip never scrolls on top
978
+ of the log. */
979
+ max-height: calc(var(--size-log-max, 160px) + var(--space-8) + 2 * var(--stroke-hairline));
980
+ overflow: auto;
981
+ /* Smoke F15: the shell's height tween makes the clip overflow for a moment;
982
+ .vm-log scrolls itself, so the clip never shows a bar. */
983
+ scrollbar-width: none;
984
+ }
985
+ [data-vibe-menu] .vm-log-clip[data-open="true"]::-webkit-scrollbar {
986
+ display: none;
987
+ }
988
+ [data-vibe-menu] .vm-log {
989
+ max-height: var(--size-log-max);
990
+ overflow-y: auto;
991
+ overscroll-behavior: contain;
992
+ display: flex;
993
+ flex-direction: column;
994
+ gap: var(--space-6);
995
+ margin-top: var(--space-8);
996
+ padding: var(--space-10) 4px var(--space-10) var(--space-24);
997
+ border-top: var(--stroke-hairline) solid var(--line-hairline);
998
+ border-bottom: var(--stroke-hairline) solid var(--line-hairline);
999
+ font-size: 13.5px;
1000
+ line-height: 1.35;
1001
+ }
1002
+ [data-vibe-menu] .vm-log-line {
1003
+ margin: 0;
1004
+ }
1005
+ [data-vibe-menu] .vm-log-line:first-child {
1006
+ margin-top: auto;
1007
+ }
1008
+ [data-vibe-menu] .vm-log-line b {
1009
+ font: 700 10px/1 var(--font-tab);
1010
+ letter-spacing: 0.1em;
1011
+ text-transform: uppercase;
1012
+ color: var(--muted);
1013
+ margin-right: 4px;
1014
+ }
1015
+
1016
+ /* ---------- AccessToggle: Restricted | Public and its line ---------- */
1017
+ [data-vibe-menu] .vm-access {
1018
+ display: flex;
1019
+ border: var(--stroke-rule) solid var(--line);
1020
+ border-radius: var(--radius-full);
1021
+ overflow: hidden;
1022
+ }
1023
+ [data-vibe-menu] .vm-access button {
1024
+ flex: 1;
1025
+ height: var(--size-bar);
1026
+ display: flex;
1027
+ align-items: center;
1028
+ justify-content: center;
1029
+ gap: var(--space-10);
1030
+ text-align: center;
1031
+ font: 700 24px/1 var(--font-display);
1032
+ letter-spacing: -0.02em;
1033
+ color: var(--ink);
1034
+ }
1035
+ [data-vibe-menu] .vm-access button + button {
1036
+ border-left: var(--stroke-rule) solid var(--line);
1037
+ }
1038
+ [data-vibe-menu] .vm-access button.is-active {
1039
+ background: var(--accent);
1040
+ color: var(--on-accent);
1041
+ }
1042
+ [data-vibe-menu] .vm-access button:not(.is-active):hover {
1043
+ background: color-mix(in srgb, var(--accent) 20%, transparent);
1044
+ }
1045
+ /* Settings still loading (preflight ruling P14): dimmed and inert. */
1046
+ [data-vibe-menu] .vm-access[aria-disabled="true"] {
1047
+ opacity: var(--opacity-row-disabled);
1048
+ }
1049
+ [data-vibe-menu] .vm-access[aria-disabled="true"] button {
1050
+ cursor: default;
1051
+ }
1052
+ [data-vibe-menu] .vm-access[aria-disabled="true"] button:not(.is-active):hover {
1053
+ background: transparent;
1054
+ }
1055
+ [data-vibe-menu] .vm-access button .vm-busy {
1056
+ width: 16px;
1057
+ height: 16px;
1058
+ }
1059
+ [data-vibe-menu] .vm-access-line {
1060
+ display: flex;
1061
+ align-items: center;
1062
+ gap: var(--space-10);
1063
+ min-height: var(--size-access-line);
1064
+ margin: var(--space-10) 0 var(--space-12);
1065
+ padding: var(--space-6) var(--space-6) var(--space-6) var(--space-14);
1066
+ border: var(--stroke-rule) solid var(--line);
1067
+ border-radius: var(--radius-access-line);
1068
+ background: var(--share-tint);
1069
+ font-size: 16.5px;
1070
+ line-height: 1.25;
1071
+ }
1072
+ [data-vibe-menu] .vm-access-line > span {
1073
+ flex: 1;
1074
+ min-width: 0;
1075
+ }
1076
+ [data-vibe-menu] .vm-access-line .vm-glyph {
1077
+ width: 16px;
1078
+ height: 16px;
1079
+ }
1080
+ [data-vibe-menu] .vm-publish {
1081
+ display: flex;
1082
+ align-items: center;
1083
+ gap: var(--space-8);
1084
+ padding: 5px 5px 5px var(--space-10);
1085
+ border: var(--stroke-rule) solid var(--line);
1086
+ border-left: var(--size-band) solid var(--accent);
1087
+ border-radius: var(--radius-moment);
1088
+ }
1089
+ [data-vibe-menu] .vm-publish b {
1090
+ font: 700 11px/1 var(--font-tab);
1091
+ letter-spacing: 0.1em;
1092
+ text-transform: uppercase;
1093
+ }
1094
+ [data-vibe-menu] .vm-publish span {
1095
+ flex: 1;
1096
+ min-width: 0;
1097
+ font-size: 13px;
1098
+ line-height: 1.25;
1099
+ color: var(--muted);
1100
+ }
1101
+
1102
+ /* ---------- GrantControls ---------- */
1103
+ [data-vibe-menu] .vm-seg {
1104
+ display: flex;
1105
+ border: var(--stroke-rule) solid var(--line);
1106
+ border-radius: var(--radius-full);
1107
+ overflow: hidden;
1108
+ }
1109
+ [data-vibe-menu] .vm-seg button {
1110
+ flex: 1;
1111
+ height: var(--size-segment);
1112
+ text-align: center;
1113
+ font-size: 11px;
1114
+ }
1115
+ [data-vibe-menu] .vm-seg button + button {
1116
+ border-left: var(--stroke-rule) solid var(--line);
1117
+ }
1118
+ [data-vibe-menu] .vm-seg button.is-active {
1119
+ background: var(--accent);
1120
+ color: var(--on-accent);
1121
+ }
1122
+ [data-vibe-menu] .vm-seg.is-mini {
1123
+ margin: 0;
1124
+ border-width: var(--stroke-mini);
1125
+ }
1126
+ [data-vibe-menu] .vm-seg.is-mini button {
1127
+ flex: none;
1128
+ height: var(--size-segment-mini);
1129
+ padding: 0 var(--space-8);
1130
+ font-size: 10px;
1131
+ }
1132
+ [data-vibe-menu] .vm-seg.is-mini button + button {
1133
+ border-left-width: var(--stroke-mini);
1134
+ }
1135
+ [data-vibe-menu] .vm-grants {
1136
+ display: flex;
1137
+ flex-wrap: wrap;
1138
+ align-items: center;
1139
+ gap: var(--space-6) var(--space-12);
1140
+ }
1141
+ [data-vibe-menu] .vm-grant-ctl {
1142
+ display: flex;
1143
+ align-items: center;
1144
+ gap: 5px;
1145
+ }
1146
+ [data-vibe-menu] .vm-grant-name {
1147
+ font: 700 10px/1 var(--font-tab);
1148
+ letter-spacing: 0.12em;
1149
+ text-transform: uppercase;
1150
+ color: var(--muted);
1151
+ }
1152
+ [data-vibe-menu] .vm-grant-fixed {
1153
+ font: 700 10px/1 var(--font-tab);
1154
+ letter-spacing: 0.08em;
1155
+ text-transform: uppercase;
1156
+ color: var(--ink);
1157
+ }
1158
+
1159
+ /* ---------- MemberRow ---------- */
1160
+ [data-vibe-menu] .vm-input {
1161
+ width: 100%;
1162
+ height: var(--size-input);
1163
+ margin-bottom: var(--space-14);
1164
+ padding: 0 var(--space-18);
1165
+ border: var(--stroke-rule) solid var(--line);
1166
+ border-radius: var(--radius-input);
1167
+ background: transparent;
1168
+ color: var(--ink);
1169
+ font: inherit;
1170
+ }
1171
+ [data-vibe-menu] .vm-members-head {
1172
+ margin-top: 0;
1173
+ padding: 2px 0 var(--space-8);
1174
+ }
1175
+ [data-vibe-menu] .vm-members-head + .vm-input {
1176
+ height: 40px;
1177
+ margin-bottom: var(--space-8);
1178
+ }
1179
+ [data-vibe-menu] .vm-person {
1180
+ display: flex;
1181
+ flex-wrap: wrap;
1182
+ align-items: center;
1183
+ gap: var(--space-8) var(--space-12);
1184
+ padding: var(--space-6) 0;
1185
+ }
1186
+ [data-vibe-menu] .vm-person + .vm-person {
1187
+ border-top: var(--stroke-hairline) solid var(--line-hairline);
1188
+ }
1189
+ [data-vibe-menu] .vm-person .vm-label {
1190
+ flex: 1;
1191
+ min-width: 0;
1192
+ }
1193
+ [data-vibe-menu] .vm-request {
1194
+ display: flex;
1195
+ flex-wrap: wrap;
1196
+ align-items: center;
1197
+ gap: var(--space-8) var(--space-12);
1198
+ margin-bottom: 2px;
1199
+ padding: var(--space-10) var(--space-12);
1200
+ border: var(--stroke-rule) solid var(--line);
1201
+ border-radius: var(--radius-card);
1202
+ background: var(--share-tint-strong);
1203
+ }
1204
+ [data-vibe-menu] .vm-request-top {
1205
+ flex: 1 0 auto;
1206
+ }
1207
+ [data-vibe-menu] .vm-request-actions {
1208
+ display: flex;
1209
+ gap: var(--space-6);
1210
+ margin-left: auto;
1211
+ }
1212
+ [data-vibe-menu] .vm-who-block > .vm-row {
1213
+ width: calc(100% + 2 * var(--space-16));
1214
+ margin: 2px calc(-1 * var(--space-16)) 0;
1215
+ border-top: var(--stroke-hairline) solid var(--line-hairline);
1216
+ }
1217
+ [data-vibe-menu] .vm-narrow .vm-person .vm-grants,
1218
+ [data-vibe-menu] .vm-narrow .vm-request-top {
1219
+ flex-basis: 100%;
1220
+ }
1221
+ [data-vibe-menu] .vm-narrow .vm-person .vm-grants,
1222
+ [data-vibe-menu] .vm-narrow .vm-request .vm-grants {
1223
+ column-gap: var(--space-10);
1224
+ }
1225
+ /* stacking, as the prototype: card < bar < outline < glass and pill */
1226
+ [data-vibe-menu] .vm-frame .vm-card {
1227
+ z-index: 1;
1228
+ }
1229
+ [data-vibe-menu] .vm-frame .vm-strip {
1230
+ z-index: 2;
1231
+ }
1232
+ [data-vibe-menu] .vm-frame .vm-outline {
1233
+ z-index: 3;
1234
+ }
1235
+ [data-vibe-menu] .vm-frame .vm-glass {
1236
+ z-index: 4;
1237
+ }
1238
+ [data-vibe-menu] .vm-refresh {
1239
+ display: grid;
1240
+ place-items: center;
1241
+ width: var(--size-icon-circle);
1242
+ height: var(--size-icon-circle);
1243
+ border: var(--stroke-rule) solid var(--line);
1244
+ border-radius: 50%;
1245
+ color: var(--ink);
1246
+ }
1247
+ [data-vibe-menu] .vm-refresh:hover {
1248
+ background: var(--accent);
1249
+ color: var(--on-accent);
1250
+ }
1251
+
1252
+ /* ---------- port additions: not in bundle.css ---------- */
1253
+ /* Rows and the action pill can be links (Home's rows, the credits action). */
1254
+ [data-vibe-menu] :where(a.vm-row, a.vm-ask) {
1255
+ color: inherit;
1256
+ text-decoration: none;
1257
+ }
1258
+ [data-vibe-menu] a.vm-row:hover .vm-dot:not(.vm-app) {
1259
+ background: var(--accent);
1260
+ color: var(--on-accent);
1261
+ }
1262
+ /* A member's name drills into that member (spec §8). */
1263
+ [data-vibe-menu] .vm-person button.vm-label {
1264
+ text-align: left;
1265
+ }
1266
+ [data-vibe-menu] .vm-chip[aria-disabled="true"],
1267
+ [data-vibe-menu] .vm-cap:disabled,
1268
+ [data-vibe-menu] .vm-composer .vm-attach:disabled {
1269
+ opacity: var(--opacity-row-disabled);
1270
+ cursor: default;
1271
+ }
1272
+ /* Staged attachments above the composer: name chips, no emoji. */
1273
+ [data-vibe-menu] .vm-attachments {
1274
+ margin-bottom: var(--space-8);
1275
+ }
1276
+ [data-vibe-menu] .vm-attachments .vm-chip {
1277
+ display: inline-flex;
1278
+ align-items: center;
1279
+ gap: var(--space-6);
1280
+ max-width: 220px;
1281
+ }
1282
+ [data-vibe-menu] .vm-attachments .vm-chip > span:last-child {
1283
+ overflow: hidden;
1284
+ text-overflow: ellipsis;
1285
+ white-space: nowrap;
1286
+ }
1287
+ [data-vibe-menu] .vm-attachments .vm-chip[data-status="error"] {
1288
+ border-color: var(--section-account);
1289
+ }
1290
+ /* A suggestion's fast-path marks (RULINGS O4, production #2917 decorateChip).
1291
+ Siblings of .vm-suggest, since a button can't nest a button. The owner's
1292
+ toggle (FastPathToggle) is outline when not blessed, filled when blessed
1293
+ (aria-pressed); the badges are the marks every viewer sees. */
1294
+ [data-vibe-menu] .vm-suggest-item {
1295
+ display: inline-flex;
1296
+ align-items: center;
1297
+ gap: var(--space-2);
1298
+ max-width: 100%;
1299
+ min-width: 0;
1300
+ }
1301
+ [data-vibe-menu] .vm-suggest-item > * {
1302
+ flex: none;
1303
+ }
1304
+ [data-vibe-menu] .vm-suggest-item > .vm-suggest {
1305
+ flex: 0 1 auto;
1306
+ }
1307
+ [data-vibe-menu] .vm-suggest-shield {
1308
+ width: var(--size-chip);
1309
+ height: var(--size-chip);
1310
+ display: inline-grid;
1311
+ place-items: center;
1312
+ border-radius: var(--radius-full);
1313
+ background: none;
1314
+ color: var(--muted);
1315
+ }
1316
+ [data-vibe-menu] .vm-suggest-shield:hover {
1317
+ color: var(--ink);
1318
+ }
1319
+ [data-vibe-menu] .vm-suggest-shield[aria-pressed="true"] {
1320
+ color: var(--ink);
1321
+ }
1322
+ [data-vibe-menu] .vm-suggest-shield[aria-pressed="true"] .vm-glyph {
1323
+ fill: currentColor;
1324
+ }
1325
+ /* The non-interactive marks every viewer sees (production ChipShieldBadge,
1326
+ ChipJumpBadge): a filled shield ("stays in this app", server-authoritative)
1327
+ or an arrow ("opens another app"). Never both on one chip. */
1328
+ [data-vibe-menu] .vm-suggest-badge {
1329
+ width: var(--size-chip);
1330
+ height: var(--size-chip);
1331
+ display: inline-grid;
1332
+ place-items: center;
1333
+ color: var(--ink);
1334
+ }
1335
+ [data-vibe-menu] .vm-suggest-badge.is-shield .vm-glyph {
1336
+ fill: currentColor;
1337
+ }
1338
+ [data-vibe-menu] .vm-suggest-badge.is-jump {
1339
+ color: var(--muted);
1340
+ }
1341
+
1342
+ /* ---------- phones (cards-hero.css): the menu's width, not the viewport ---------- */
1343
+ @container vibe-menu (max-width: 480px) {
1344
+ [data-vibe-menu] .vm-ask {
1345
+ font-size: 18px;
1346
+ }
1347
+ /* the field keeps 16px (iOS zooms smaller fields); attach slims instead */
1348
+ [data-vibe-menu] .vm-composer textarea {
1349
+ margin-right: var(--space-6);
1350
+ font-size: 16px;
1351
+ }
1352
+ [data-vibe-menu] .vm-composer .vm-attach {
1353
+ margin-left: 4px;
1354
+ width: 28px;
1355
+ }
1356
+ [data-vibe-menu] .vm-cap {
1357
+ padding: 0 var(--space-18) 0 var(--space-14);
1358
+ }
1359
+ [data-vibe-menu] .vm-access button {
1360
+ font-size: 21px;
1361
+ }
1362
+ /* the access line keeps its sentence to two lines beside the chip */
1363
+ [data-vibe-menu] .vm-access-line {
1364
+ padding-left: 12px;
1365
+ gap: 8px;
1366
+ font-size: 15.5px;
1367
+ }
1368
+ [data-vibe-menu] .vm-access-line .vm-chip.vm-copy {
1369
+ padding: 0 10px;
1370
+ }
1371
+ /* Data and Code drop under the handle on one line (two on the narrowest) */
1372
+ [data-vibe-menu] .vm-person .vm-grants {
1373
+ flex-basis: 100%;
1374
+ column-gap: var(--space-10);
1375
+ }
1376
+ [data-vibe-menu] .vm-request .vm-grants {
1377
+ column-gap: var(--space-10);
1378
+ }
1379
+ [data-vibe-menu] .vm-request-top {
1380
+ flex-basis: 100%;
1381
+ }
1382
+ [data-vibe-menu] .vm-input {
1383
+ font-size: 16px;
1384
+ }
1385
+ }
1386
+ @container vibe-menu (max-width: 359px) {
1387
+ [data-vibe-menu] .vm-access button {
1388
+ font-size: 19px;
1389
+ }
1390
+ /* the line drops its icon here: the enclosure already marks it */
1391
+ [data-vibe-menu] .vm-access-line > .vm-glyph {
1392
+ display: none;
1393
+ }
1394
+ [data-vibe-menu] .vm-access-line {
1395
+ margin: 8px 0 10px;
1396
+ font-size: 14.5px;
1397
+ }
1398
+ [data-vibe-menu] .vm-access-line .vm-chip.vm-copy {
1399
+ padding: 0 8px;
1400
+ }
1401
+ /* the cap and attach slim so the field keeps room (REMIX THIS stays one line) */
1402
+ [data-vibe-menu] .vm-cap {
1403
+ padding: 0 13px 0 10px;
1404
+ letter-spacing: 0.05em;
1405
+ }
1406
+ [data-vibe-menu] .vm-composer .vm-attach {
1407
+ margin-left: 3px;
1408
+ width: 24px;
1409
+ }
1410
+ /* 16px, not the prototype's 14px: no text field under 16px on phones (spec §4.5) */
1411
+ [data-vibe-menu] .vm-composer textarea {
1412
+ margin: 0 4px 0 0;
1413
+ font-size: 16px;
1414
+ }
1415
+ [data-vibe-menu] .vm-chip.vm-copy {
1416
+ padding: 0 10px;
1417
+ letter-spacing: 0.06em;
1418
+ }
1419
+ }
1420
+ `;
1421
+ export function VibeMenuStyles() {
1422
+ return React.createElement("style", { "data-vibe-menu-styles": "" }, VIBE_MENU_CSS);
1423
+ }
1424
+ //# sourceMappingURL=vibe-menu.styles.js.map