@bearmenu/ui 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/{chunk-ERMIA7NP.js → chunk-7PPCH42H.js} +3 -3
  2. package/dist/{chunk-HLQ2IRE7.js → chunk-BAZFVSSG.js} +3 -3
  3. package/dist/chunk-D5QHEHXJ.js +26 -0
  4. package/dist/{chunk-UISA4CIG.js → chunk-N2KNBPAQ.js} +2 -2
  5. package/dist/{chunk-7H54PTVH.js → chunk-PSR7N36A.js} +38 -10
  6. package/dist/chunk-RIDXFY6M.js +38 -0
  7. package/dist/chunk-UUJVXN2O.js +82 -0
  8. package/dist/chunk-WKMLZDUT.js +122 -0
  9. package/dist/chunk-XK2ZDQVE.js +122 -0
  10. package/dist/{chunk-4KOMHDZD.js → chunk-Y5D5LP4A.js} +18 -3
  11. package/dist/chunk-YJ6OBKZJ.js +32 -0
  12. package/dist/{chunk-ESO2EM3L.js → chunk-ZBBUKXM5.js} +2 -2
  13. package/dist/chunk-ZFNOCP6W.js +106 -0
  14. package/dist/components/accordion.js +11 -5
  15. package/dist/components/alert-dialog.js +5 -3
  16. package/dist/components/alert.d.ts +5 -2
  17. package/dist/components/alert.js +25 -9
  18. package/dist/components/avatar.d.ts +17 -2
  19. package/dist/components/avatar.js +91 -12
  20. package/dist/components/badge.d.ts +1 -1
  21. package/dist/components/badge.js +1 -1
  22. package/dist/components/breadcrumb.js +5 -2
  23. package/dist/components/button-group.d.ts +14 -0
  24. package/dist/components/button-group.js +39 -0
  25. package/dist/components/button.d.ts +4 -2
  26. package/dist/components/button.js +1 -1
  27. package/dist/components/calendar.js +3 -3
  28. package/dist/components/card.d.ts +13 -5
  29. package/dist/components/card.js +2 -2
  30. package/dist/components/carousel.d.ts +20 -3
  31. package/dist/components/carousel.js +72 -12
  32. package/dist/components/checkbox.js +1 -1
  33. package/dist/components/circular-progress.d.ts +16 -0
  34. package/dist/components/circular-progress.js +105 -0
  35. package/dist/components/combobox.d.ts +27 -0
  36. package/dist/components/combobox.js +102 -0
  37. package/dist/components/command.d.ts +29 -16
  38. package/dist/components/command.js +2 -2
  39. package/dist/components/currency-input.d.ts +1 -0
  40. package/dist/components/currency-input.js +73 -52
  41. package/dist/components/date-input.d.ts +10 -0
  42. package/dist/components/date-input.js +40 -0
  43. package/dist/components/description-list.d.ts +15 -0
  44. package/dist/components/description-list.js +67 -0
  45. package/dist/components/dialog.d.ts +13 -2
  46. package/dist/components/dialog.js +1 -1
  47. package/dist/components/drawer.d.ts +5 -2
  48. package/dist/components/drawer.js +47 -9
  49. package/dist/components/dropdown-menu.d.ts +7 -2
  50. package/dist/components/dropdown-menu.js +22 -6
  51. package/dist/components/empty-state.js +2 -2
  52. package/dist/components/field.d.ts +22 -0
  53. package/dist/components/field.js +130 -0
  54. package/dist/components/form.d.ts +2 -1
  55. package/dist/components/form.js +11 -1
  56. package/dist/components/haptic-button.js +3 -3
  57. package/dist/components/input-group.d.ts +18 -0
  58. package/dist/components/input-group.js +92 -0
  59. package/dist/components/input.d.ts +8 -2
  60. package/dist/components/input.js +1 -1
  61. package/dist/components/item.d.ts +23 -0
  62. package/dist/components/item.js +120 -0
  63. package/dist/components/kbd.d.ts +13 -0
  64. package/dist/components/kbd.js +49 -0
  65. package/dist/components/lazy-markdown.d.ts +3 -1
  66. package/dist/components/lazy-markdown.js +7 -7
  67. package/dist/components/link-button.js +1 -1
  68. package/dist/components/multi-select-combobox.js +92 -83
  69. package/dist/components/multi-select-menu.d.ts +0 -4
  70. package/dist/components/multi-select-menu.js +28 -17
  71. package/dist/components/native-select.d.ts +12 -0
  72. package/dist/components/native-select.js +49 -0
  73. package/dist/components/pagination.d.ts +5 -2
  74. package/dist/components/pagination.js +66 -7
  75. package/dist/components/place-about-tab.js +4 -4
  76. package/dist/components/place-card.js +1 -1
  77. package/dist/components/place-details-mobile.js +4 -4
  78. package/dist/components/popover.d.ts +7 -1
  79. package/dist/components/popover.js +1 -1
  80. package/dist/components/progress.d.ts +5 -1
  81. package/dist/components/progress.js +17 -3
  82. package/dist/components/radio-group.js +12 -3
  83. package/dist/components/rating.d.ts +2 -0
  84. package/dist/components/rating.js +88 -70
  85. package/dist/components/search-bar.d.ts +1 -2
  86. package/dist/components/search-bar.js +37 -60
  87. package/dist/components/searchable-select.js +76 -72
  88. package/dist/components/select.d.ts +5 -1
  89. package/dist/components/select.js +30 -14
  90. package/dist/components/selection-bar.d.ts +11 -0
  91. package/dist/components/selection-bar.js +65 -0
  92. package/dist/components/separator.js +3 -2
  93. package/dist/components/sheet.d.ts +1 -1
  94. package/dist/components/sheet.js +1 -1
  95. package/dist/components/skeleton-card.js +1 -1
  96. package/dist/components/skeleton.js +1 -1
  97. package/dist/components/slider.js +21 -4
  98. package/dist/components/sliding-panels.js +15 -13
  99. package/dist/components/spinner.d.ts +17 -0
  100. package/dist/components/spinner.js +50 -0
  101. package/dist/components/stepper.d.ts +18 -0
  102. package/dist/components/stepper.js +199 -0
  103. package/dist/components/sticky-container.js +1 -0
  104. package/dist/components/switch.js +4 -3
  105. package/dist/components/table.d.ts +23 -5
  106. package/dist/components/table.js +121 -35
  107. package/dist/components/tabs.d.ts +3 -1
  108. package/dist/components/tabs.js +37 -9
  109. package/dist/components/tag-group.d.ts +9 -0
  110. package/dist/components/tag-group.js +26 -0
  111. package/dist/components/tag.d.ts +17 -0
  112. package/dist/components/tag.js +61 -0
  113. package/dist/components/text.d.ts +3 -3
  114. package/dist/components/text.js +1 -1
  115. package/dist/components/textarea.js +2 -1
  116. package/dist/components/toast.js +1 -1
  117. package/dist/components/toaster.js +1 -1
  118. package/dist/components/toggle-group.js +1 -1
  119. package/dist/components/toggle.js +1 -1
  120. package/dist/components/tooltip.d.ts +3 -2
  121. package/dist/components/tooltip.js +16 -2
  122. package/package.json +44 -26
  123. package/src/components/accordion.tsx +11 -6
  124. package/src/components/alert-dialog.tsx +4 -2
  125. package/src/components/alert.tsx +20 -8
  126. package/src/components/avatar.tsx +106 -13
  127. package/src/components/badge.tsx +12 -11
  128. package/src/components/breadcrumb.tsx +5 -2
  129. package/src/components/button-group.stories.tsx +52 -0
  130. package/src/components/button-group.tsx +40 -0
  131. package/src/components/button.test.tsx +174 -0
  132. package/src/components/button.tsx +42 -19
  133. package/src/components/calendar.tsx +2 -2
  134. package/src/components/card.tsx +55 -13
  135. package/src/components/carousel.tsx +85 -13
  136. package/src/components/checkbox.test.tsx +58 -0
  137. package/src/components/checkbox.tsx +8 -3
  138. package/src/components/circular-progress.stories.tsx +39 -0
  139. package/src/components/circular-progress.tsx +102 -0
  140. package/src/components/collapsible.stories.tsx +7 -3
  141. package/src/components/combobox.stories.tsx +82 -0
  142. package/src/components/combobox.test.tsx +118 -0
  143. package/src/components/combobox.tsx +136 -0
  144. package/src/components/command.test.tsx +91 -0
  145. package/src/components/command.tsx +38 -15
  146. package/src/components/currency-input.test.tsx +63 -0
  147. package/src/components/currency-input.tsx +84 -66
  148. package/src/components/date-input.stories.tsx +31 -0
  149. package/src/components/date-input.tsx +43 -0
  150. package/src/components/description-list.stories.tsx +62 -0
  151. package/src/components/description-list.tsx +68 -0
  152. package/src/components/dialog.test.tsx +84 -0
  153. package/src/components/dialog.tsx +64 -24
  154. package/src/components/drawer.tsx +72 -23
  155. package/src/components/dropdown-menu.test.tsx +180 -0
  156. package/src/components/dropdown-menu.tsx +31 -6
  157. package/src/components/field.stories.tsx +36 -0
  158. package/src/components/field.test.tsx +157 -0
  159. package/src/components/field.tsx +146 -0
  160. package/src/components/form.stories.tsx +3 -2
  161. package/src/components/form.test.tsx +95 -0
  162. package/src/components/form.tsx +9 -0
  163. package/src/components/haptic-button.tsx +1 -1
  164. package/src/components/input-group.stories.tsx +61 -0
  165. package/src/components/input-group.tsx +99 -0
  166. package/src/components/input.test.tsx +103 -0
  167. package/src/components/input.tsx +24 -7
  168. package/src/components/item.stories.tsx +52 -0
  169. package/src/components/item.tsx +115 -0
  170. package/src/components/kbd.stories.tsx +33 -0
  171. package/src/components/kbd.tsx +46 -0
  172. package/src/components/lazy-markdown.tsx +10 -7
  173. package/src/components/multi-select-combobox.test.tsx +101 -0
  174. package/src/components/multi-select-combobox.tsx +85 -82
  175. package/src/components/multi-select-menu.tsx +49 -41
  176. package/src/components/native-select.stories.tsx +52 -0
  177. package/src/components/native-select.tsx +45 -0
  178. package/src/components/pagination.tsx +64 -5
  179. package/src/components/popover.tsx +66 -3
  180. package/src/components/progress.tsx +27 -4
  181. package/src/components/radio-group.test.tsx +64 -0
  182. package/src/components/radio-group.tsx +11 -3
  183. package/src/components/rating.test.tsx +112 -0
  184. package/src/components/rating.tsx +97 -82
  185. package/src/components/search-bar.stories.tsx +1 -32
  186. package/src/components/search-bar.tsx +22 -59
  187. package/src/components/searchable-select.tsx +69 -73
  188. package/src/components/select.tsx +34 -19
  189. package/src/components/selection-bar.stories.tsx +37 -0
  190. package/src/components/selection-bar.tsx +65 -0
  191. package/src/components/separator.tsx +5 -2
  192. package/src/components/sheet.tsx +1 -1
  193. package/src/components/skeleton.tsx +2 -2
  194. package/src/components/slider.test.tsx +45 -0
  195. package/src/components/slider.tsx +31 -12
  196. package/src/components/sliding-panels.tsx +14 -12
  197. package/src/components/spinner.stories.tsx +35 -0
  198. package/src/components/spinner.tsx +50 -0
  199. package/src/components/stepper.stories.tsx +71 -0
  200. package/src/components/stepper.tsx +220 -0
  201. package/src/components/sticky-container.tsx +1 -0
  202. package/src/components/switch.test.tsx +52 -0
  203. package/src/components/switch.tsx +4 -3
  204. package/src/components/table.tsx +140 -35
  205. package/src/components/tabs.test.tsx +107 -0
  206. package/src/components/tabs.tsx +70 -23
  207. package/src/components/tag-group.stories.tsx +39 -0
  208. package/src/components/tag-group.tsx +28 -0
  209. package/src/components/tag.stories.tsx +50 -0
  210. package/src/components/tag.tsx +63 -0
  211. package/src/components/text.test.tsx +1 -1
  212. package/src/components/text.tsx +19 -3
  213. package/src/components/textarea.test.tsx +48 -0
  214. package/src/components/textarea.tsx +2 -1
  215. package/src/components/toast.tsx +4 -3
  216. package/src/components/toggle.tsx +2 -2
  217. package/src/components/tooltip.tsx +12 -2
  218. package/src/globals.css +142 -90
  219. package/dist/chunk-2BMJRXQX.js +0 -80
  220. package/dist/chunk-4AVS6CV4.js +0 -89
  221. package/dist/chunk-4UO73SKC.js +0 -26
  222. package/dist/chunk-CW24PLDW.js +0 -24
  223. package/dist/chunk-IQASCH2V.js +0 -25
  224. package/dist/chunk-NKHH23YK.js +0 -31
  225. package/dist/chunk-QJ54Z7TC.js +0 -83
package/src/globals.css CHANGED
@@ -26,25 +26,6 @@ h6 {
26
26
  transform: translateZ(0);
27
27
  }
28
28
 
29
- /* Dynamic tab content - auto-sizes to tallest content */
30
- .tab-content-container {
31
- display: grid;
32
- grid-template-rows: 1fr;
33
- }
34
-
35
- .tab-content-container > * {
36
- grid-row: 1;
37
- grid-column: 1;
38
- opacity: 0;
39
- pointer-events: none;
40
- transition: opacity 0.2s ease;
41
- }
42
-
43
- .tab-content-container > [data-state="active"] {
44
- opacity: 1;
45
- pointer-events: auto;
46
- }
47
-
48
29
  :root {
49
30
  /* Safe area insets for PWA/iOS notch support */
50
31
  --sat: env(safe-area-inset-top);
@@ -93,6 +74,45 @@ h6 {
93
74
  --success-foreground: oklch(0.985 0 0);
94
75
  --warning: oklch(0.72 0.18 68);
95
76
  --warning-foreground: oklch(0.18 0.04 45);
77
+
78
+ /* Brown variant — replaces hardcoded #482E1F across button/badge */
79
+ --brown: oklch(0.31 0.05 45);
80
+ --brown-foreground: oklch(0.985 0 0);
81
+
82
+ /* Shadow tokens — color + per-step alpha (themed in .dark) */
83
+ --shadow-color: 0 0% 0%;
84
+ --shadow-alpha-2xs: 0.05;
85
+ --shadow-alpha-xs: 0.08;
86
+ --shadow-alpha-sm: 0.1;
87
+ --shadow-alpha-md: 0.12;
88
+ --shadow-alpha-lg: 0.15;
89
+ --shadow-alpha-xl: 0.18;
90
+ --shadow-alpha-2xl: 0.25;
91
+
92
+ /* Motion */
93
+ --duration-instant: 0ms;
94
+ --duration-fast: 150ms;
95
+ --duration-base: 200ms;
96
+ --duration-slow: 300ms;
97
+ --duration-slower: 500ms;
98
+ --duration-drawer: 350ms;
99
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
100
+ --ease-in: cubic-bezier(0.7, 0, 0.84, 0);
101
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
102
+ --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);
103
+ --ease-spring: cubic-bezier(0.5, 1.5, 0.5, 1);
104
+
105
+ /* Z-index scale */
106
+ --z-base: 0;
107
+ --z-sticky: 100;
108
+ --z-fixed: 200;
109
+ --z-overlay: 800;
110
+ --z-drawer: 900;
111
+ --z-modal: 1000;
112
+ --z-popover: 1100;
113
+ --z-dropdown: 1200;
114
+ --z-tooltip: 1300;
115
+ --z-toast: 1400;
96
116
  }
97
117
 
98
118
  .dark {
@@ -110,7 +130,8 @@ h6 {
110
130
  --muted-foreground: oklch(0.6 0.012 60);
111
131
  --accent: oklch(0.3 0.04 50);
112
132
  --accent-foreground: oklch(0.97 0.008 60);
113
- --destructive: oklch(0.396 0.141 25.723);
133
+ /* AA-compliant on dark surfaces but dialed back from 0.68 to soften eye strain */
134
+ --destructive: oklch(0.58 0.17 25.7);
114
135
  --destructive-foreground: oklch(0.985 0 0);
115
136
  --border: oklch(0.3 0.015 45);
116
137
  --input: oklch(0.3 0.015 45);
@@ -136,6 +157,18 @@ h6 {
136
157
  --success-foreground: oklch(0.985 0 0);
137
158
  --warning: oklch(0.76 0.15 68);
138
159
  --warning-foreground: oklch(0.18 0.04 45);
160
+
161
+ --brown: oklch(0.31 0.05 45);
162
+ --brown-foreground: oklch(0.985 0 0);
163
+
164
+ /* Heavier shadow alphas — default Tailwind tints disappear on dark surfaces */
165
+ --shadow-alpha-2xs: 0.25;
166
+ --shadow-alpha-xs: 0.3;
167
+ --shadow-alpha-sm: 0.35;
168
+ --shadow-alpha-md: 0.4;
169
+ --shadow-alpha-lg: 0.5;
170
+ --shadow-alpha-xl: 0.55;
171
+ --shadow-alpha-2xl: 0.65;
139
172
  }
140
173
 
141
174
  @theme inline {
@@ -165,10 +198,18 @@ h6 {
165
198
  --color-chart-3: var(--chart-3);
166
199
  --color-chart-4: var(--chart-4);
167
200
  --color-chart-5: var(--chart-5);
201
+ --color-brown: var(--brown);
202
+ --color-brown-foreground: var(--brown-foreground);
203
+
204
+ /* Radius scale */
168
205
  --radius-sm: calc(var(--radius) - 4px);
169
206
  --radius-md: calc(var(--radius) - 2px);
170
207
  --radius-lg: var(--radius);
171
208
  --radius-xl: calc(var(--radius) + 4px);
209
+ --radius-2xl: calc(var(--radius) + 8px);
210
+ --radius-3xl: calc(var(--radius) + 14px);
211
+ --radius-4xl: calc(var(--radius) + 22px);
212
+
172
213
  --color-sidebar: var(--sidebar);
173
214
  --color-sidebar-foreground: var(--sidebar-foreground);
174
215
  --color-sidebar-primary: var(--sidebar-primary);
@@ -185,6 +226,29 @@ h6 {
185
226
  --color-surface-foreground: var(--surface-foreground);
186
227
  --color-surface-2: var(--surface-2);
187
228
  --color-line-soft: var(--line-soft);
229
+
230
+ /* Theme-aware shadow utilities — override Tailwind defaults so they
231
+ stay visible on dark surfaces */
232
+ --shadow-2xs: 0 1px hsl(var(--shadow-color) / var(--shadow-alpha-2xs));
233
+ --shadow-xs: 0 1px 2px 0 hsl(var(--shadow-color) / var(--shadow-alpha-xs));
234
+ --shadow-sm:
235
+ 0 1px 3px 0 hsl(var(--shadow-color) / var(--shadow-alpha-sm)),
236
+ 0 1px 2px -1px hsl(var(--shadow-color) / var(--shadow-alpha-sm));
237
+ --shadow-md:
238
+ 0 4px 6px -1px hsl(var(--shadow-color) / var(--shadow-alpha-md)),
239
+ 0 2px 4px -2px hsl(var(--shadow-color) / var(--shadow-alpha-md));
240
+ --shadow-lg:
241
+ 0 10px 15px -3px hsl(var(--shadow-color) / var(--shadow-alpha-lg)),
242
+ 0 4px 6px -4px hsl(var(--shadow-color) / var(--shadow-alpha-lg));
243
+ --shadow-xl:
244
+ 0 20px 25px -5px hsl(var(--shadow-color) / var(--shadow-alpha-xl)),
245
+ 0 8px 10px -6px hsl(var(--shadow-color) / var(--shadow-alpha-xl));
246
+ --shadow-2xl: 0 25px 50px -12px hsl(var(--shadow-color) / var(--shadow-alpha-2xl));
247
+
248
+ /* Default transition tokens — consumed by Tailwind's `transition-*` utilities */
249
+ --default-transition-duration: var(--duration-base);
250
+ --default-transition-timing-function: var(--ease-out);
251
+
188
252
  --animate-highlight-ring: highlight-ring 5s ease-out forwards;
189
253
  }
190
254
 
@@ -207,41 +271,42 @@ h6 {
207
271
  }
208
272
  }
209
273
 
210
- /* Global glass effects — dark mode default */
211
- .glass {
212
- background: rgba(255, 255, 255, 0.04);
213
- backdrop-filter: blur(16px);
214
- border: 1px solid rgba(255, 255, 255, 0.15);
215
- box-shadow:
216
- 0 2px 8px rgba(0, 0, 0, 0.12),
217
- 0 1px 2px rgba(0, 0, 0, 0.06);
218
- }
219
-
220
- /* Light-mode: opaque background for modal surfaces (Dialog, Sheet, Drawer) */
221
- :root .glass[role="dialog"] {
222
- background: rgba(255, 255, 255, 0.97);
223
- border-color: rgba(0, 0, 0, 0.08);
224
- backdrop-filter: blur(20px);
274
+ /* Respect prefers-reduced-motion globally */
275
+ @media (prefers-reduced-motion: reduce) {
276
+ *,
277
+ *::before,
278
+ *::after {
279
+ animation-duration: 0.01ms !important;
280
+ animation-iteration-count: 1 !important;
281
+ transition-duration: 0.01ms !important;
282
+ scroll-behavior: auto !important;
283
+ }
225
284
  }
226
285
 
227
- .dark .glass[role="dialog"] {
228
- background: rgba(255, 255, 255, 0.04);
229
- border-color: rgba(255, 255, 255, 0.15);
286
+ /* Glass surface — token-driven, works in both themes. Was previously a hardcoded
287
+ rgba(255,255,255,...) literal with a [role="dialog"]-only light-mode override,
288
+ which left ~38 non-dialog consumers invisible on light pages. */
289
+ .glass {
290
+ background: color-mix(in oklch, var(--card) 55%, transparent);
291
+ backdrop-filter: blur(20px) saturate(180%);
292
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
293
+ border: 1px solid color-mix(in oklch, var(--foreground) 14%, transparent);
294
+ box-shadow: var(--shadow-md);
230
295
  }
231
296
 
232
297
  .glass-hover {
233
298
  transition:
234
- background-color 0.2s ease,
235
- border-color 0.2s ease;
299
+ background-color var(--duration-base) var(--ease-out),
300
+ border-color var(--duration-base) var(--ease-out);
236
301
  }
237
302
 
238
303
  .glass-hover:hover {
239
- background: rgba(255, 255, 255, 0.08);
240
- border-color: rgba(255, 255, 255, 0.25);
304
+ background: color-mix(in oklch, var(--card) 70%, transparent);
305
+ border-color: color-mix(in oklch, var(--foreground) 24%, transparent);
241
306
  }
242
307
 
243
308
  .glass-glow {
244
- box-shadow: 0 0 12px rgba(212, 175, 55, 0.15);
309
+ box-shadow: 0 0 12px color-mix(in oklch, var(--accent) 60%, transparent);
245
310
  }
246
311
 
247
312
  /* Scroll-to highlight pulse */
@@ -266,7 +331,7 @@ h6 {
266
331
  animation: highlight-pulse 1s ease-in-out 3;
267
332
  }
268
333
 
269
- /* Scrollbar styling */
334
+ /* Scrollbar styling — token-driven, single rule covers both themes */
270
335
  ::-webkit-scrollbar {
271
336
  width: 8px;
272
337
  }
@@ -276,20 +341,12 @@ h6 {
276
341
  }
277
342
 
278
343
  ::-webkit-scrollbar-thumb {
279
- background: oklch(0.7 0 0 / 0.3);
344
+ background: color-mix(in oklch, var(--muted-foreground) 35%, transparent);
280
345
  border-radius: 4px;
281
346
  }
282
347
 
283
348
  ::-webkit-scrollbar-thumb:hover {
284
- background: oklch(0.7 0 0 / 0.5);
285
- }
286
-
287
- .dark ::-webkit-scrollbar-thumb {
288
- background: oklch(1 0 0 / 0.1);
289
- }
290
-
291
- .dark ::-webkit-scrollbar-thumb:hover {
292
- background: oklch(1 0 0 / 0.2);
349
+ background: color-mix(in oklch, var(--muted-foreground) 60%, transparent);
293
350
  }
294
351
 
295
352
  /* Hide scrollbar for horizontal carousels */
@@ -302,22 +359,17 @@ h6 {
302
359
  display: none !important;
303
360
  }
304
361
 
305
- /* Selection styling */
362
+ /* Selection themed via accent tokens (was hardcoded gold+white, 1.06:1 in light) */
306
363
  ::selection {
307
- background: rgba(212, 175, 55, 0.3);
308
- color: #ffffff;
364
+ background: color-mix(in oklch, var(--accent) 60%, transparent);
365
+ color: var(--accent-foreground);
309
366
  }
310
367
 
311
- /* Focus ring styling */
368
+ /* Focus ring helper */
312
369
  .focus-ring {
313
370
  @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background;
314
371
  }
315
372
 
316
- /* App Background — solid color, no gradient */
317
- .bg-cave-depth {
318
- background: var(--background);
319
- }
320
-
321
373
  /* Highlight ring animation — used when scrolling to a specific card */
322
374
  @keyframes highlight-ring {
323
375
  0% {
@@ -355,20 +407,27 @@ h6 {
355
407
  }
356
408
 
357
409
  .animate-collapsible-down {
358
- animation: collapsible-down 0.3s ease-out;
410
+ animation: collapsible-down var(--duration-slow) var(--ease-out);
359
411
  }
360
412
 
361
413
  .animate-collapsible-up {
362
- animation: collapsible-up 0.2s ease-in;
414
+ animation: collapsible-up var(--duration-base) var(--ease-in);
415
+ }
416
+
417
+ /* Shimmer — referenced by Skeleton (was undefined → animation was dead) */
418
+ @keyframes shimmer {
419
+ 100% {
420
+ transform: translateX(100%);
421
+ }
363
422
  }
364
423
 
365
424
  /* Swiper pagination styling for experience cards */
366
425
  .swiper-pagination-bullet {
367
- background: rgba(255, 255, 255, 0.3) !important;
426
+ background: color-mix(in oklch, var(--foreground) 30%, transparent) !important;
368
427
  opacity: 1 !important;
369
428
  width: 6px !important;
370
429
  height: 6px !important;
371
- transition: all 0.3s ease !important;
430
+ transition: all var(--duration-slow) var(--ease-out) !important;
372
431
  }
373
432
 
374
433
  .swiper-pagination-bullet-active {
@@ -377,14 +436,6 @@ h6 {
377
436
  border-radius: 4px !important;
378
437
  }
379
438
 
380
- .dark .swiper-pagination-bullet {
381
- background: rgba(255, 255, 255, 0.3) !important;
382
- }
383
-
384
- .dark .swiper-pagination-bullet-active {
385
- background: var(--color-primary) !important;
386
- }
387
-
388
439
  /* Safe Area Utilities for PWA */
389
440
  .safe-top {
390
441
  padding-top: max(3rem, env(safe-area-inset-top));
@@ -402,26 +453,27 @@ h6 {
402
453
  padding-right: max(0px, env(safe-area-inset-right));
403
454
  }
404
455
 
405
- /* Specific for mobile header (3rem = 48px = 12 in Tailwind) */
406
- /* Only apply safe area padding when app is in PWA/standalone mode */
407
- /* @media (max-width: 768px) and (display-mode: standalone) {
408
- .mobile-header-safe {
409
- padding-top: calc(3rem + env(safe-area-inset-top, 0px));
410
- }
411
- } */
412
-
413
- /* In browser mode, just use normal padding */
414
- /* @media (max-width: 768px) and (display-mode: browser) {
415
- .mobile-header-safe {
416
- padding-top: 3rem;
417
- }
418
- } */
419
-
420
456
  /* For sticky header */
421
457
  .sticky-header-safe {
422
458
  top: env(safe-area-inset-top, 0);
423
459
  }
424
460
 
461
+ /* In PWA standalone mode the sticky bar pins below the safe-area inset, leaving
462
+ the strip under the notch transparent. When the bar is actually stuck
463
+ (data-stuck="true"), extend its current background up into that strip so the
464
+ status bar sits over the bar's color instead of empty space.
465
+ Browser mode never matches `display-mode: standalone`, so this is a no-op. */
466
+ @media (display-mode: standalone) {
467
+ .sticky-header-safe[data-stuck="true"]::before {
468
+ content: "";
469
+ position: absolute;
470
+ inset: calc(-1 * env(safe-area-inset-top, 0)) 0 auto 0;
471
+ height: env(safe-area-inset-top, 0);
472
+ background: inherit;
473
+ pointer-events: none;
474
+ }
475
+ }
476
+
425
477
  /* For mobile bottom nav */
426
478
  .mobile-nav-safe {
427
479
  bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
@@ -1,80 +0,0 @@
1
- import { useHaptic } from './chunk-R47NEOSI.js';
2
- import { cn } from './chunk-FEK5XGZW.js';
3
- import { __objRest, __spreadValues } from './chunk-3GWWZKX7.js';
4
- import * as React from 'react';
5
- import { Slot } from '@radix-ui/react-slot';
6
- import { cva } from 'class-variance-authority';
7
- import { jsx } from 'react/jsx-runtime';
8
-
9
- var buttonVariants = cva(
10
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-3xl text-sm font-medium transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer [@media(pointer:coarse)]:active:scale-95",
11
- {
12
- variants: {
13
- variant: {
14
- default: "bg-primary backdrop-blur-sm text-primary-foreground shadow-lg hover:bg-primary/85 border border-primary/20 transition-colors duration-200",
15
- destructive: "bg-destructive text-destructive-foreground shadow-lg hover:bg-destructive/90 hover:shadow-destructive/20 backdrop-blur-sm border border-destructive/20",
16
- outline: "border border-border bg-sidebar backdrop-blur-md hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:border-sidebar-accent-foreground/20 hover:shadow-lg",
17
- secondary: "bg-secondary text-secondary-foreground shadow-lg hover:bg-secondary/90 hover:shadow-secondary/20 backdrop-blur-sm border border-secondary/20",
18
- ghost: "hover:bg-foreground/10 hover:text-foreground transition-colors duration-200",
19
- link: "text-primary underline-offset-4 hover:underline hover:text-primary/80",
20
- glass: "glass glass-hover text-foreground hover:text-accent-foreground",
21
- brown: "bg-[#482E1F] text-white shadow-lg hover:bg-[#352317] hover:shadow-[#482E1F]/20 backdrop-blur-sm border border-[#482E1F]/30 transition-all duration-300",
22
- antagonist: "bg-primary-foreground text-primary shadow-lg hover:bg-primary-foreground/90 hover:shadow-primary-foreground/20 backdrop-blur-sm border border-primary-foreground/20 transition-all duration-300"
23
- },
24
- size: {
25
- default: "h-11 px-6 py-2",
26
- sm: "h-9 rounded-lg px-4",
27
- lg: "h-12 rounded-xl px-8",
28
- icon: "h-11 w-11"
29
- }
30
- },
31
- defaultVariants: {
32
- variant: "default",
33
- size: "default"
34
- }
35
- }
36
- );
37
- var Button = React.forwardRef(
38
- (_a, ref) => {
39
- var _b = _a, {
40
- className,
41
- variant,
42
- size,
43
- asChild = false,
44
- haptic = true,
45
- hapticStyle = "light",
46
- onClick
47
- } = _b, props = __objRest(_b, [
48
- "className",
49
- "variant",
50
- "size",
51
- "asChild",
52
- "haptic",
53
- "hapticStyle",
54
- "onClick"
55
- ]);
56
- const Comp = asChild ? Slot : "button";
57
- const { trigger } = useHaptic();
58
- const [isMounted, setIsMounted] = React.useState(false);
59
- React.useEffect(() => {
60
- setIsMounted(true);
61
- }, []);
62
- const handleClick = (event) => {
63
- if (haptic && isMounted) {
64
- trigger(hapticStyle);
65
- }
66
- onClick == null ? void 0 : onClick(event);
67
- };
68
- return /* @__PURE__ */ jsx(
69
- Comp,
70
- __spreadValues({
71
- className: cn(buttonVariants({ variant, size, className })),
72
- ref,
73
- onClick: handleClick
74
- }, props)
75
- );
76
- }
77
- );
78
- Button.displayName = "Button";
79
-
80
- export { Button, buttonVariants };
@@ -1,89 +0,0 @@
1
- import { cn } from './chunk-FEK5XGZW.js';
2
- import { __objRest, __spreadValues, __spreadProps } from './chunk-3GWWZKX7.js';
3
- import * as React from 'react';
4
- import * as DialogPrimitive from '@radix-ui/react-dialog';
5
- import { X } from 'lucide-react';
6
- import { jsx, jsxs } from 'react/jsx-runtime';
7
-
8
- var Dialog = DialogPrimitive.Root;
9
- var DialogTrigger = DialogPrimitive.Trigger;
10
- var DialogPortal = DialogPrimitive.Portal;
11
- var DialogClose = DialogPrimitive.Close;
12
- var DialogOverlay = React.forwardRef((_a, ref) => {
13
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
14
- return /* @__PURE__ */ jsx(
15
- DialogPrimitive.Overlay,
16
- __spreadValues({
17
- ref,
18
- className: cn(
19
- "fixed inset-0 z-[1000] bg-black/50 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
20
- className
21
- )
22
- }, props)
23
- );
24
- });
25
- DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
26
- var DialogContent = React.forwardRef((_a, ref) => {
27
- var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
28
- return /* @__PURE__ */ jsxs(DialogPortal, { children: [
29
- /* @__PURE__ */ jsx(DialogOverlay, {}),
30
- /* @__PURE__ */ jsxs(
31
- DialogPrimitive.Content,
32
- __spreadProps(__spreadValues({
33
- ref,
34
- className: cn(
35
- "fixed left-[50%] top-[50%] z-[1000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-card p-6 shadow-2xl duration-300 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 rounded-2xl border border-border",
36
- className
37
- )
38
- }, props), {
39
- children: [
40
- children,
41
- /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-lg opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:bg-muted p-2", children: [
42
- /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
43
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
44
- ] })
45
- ]
46
- })
47
- )
48
- ] });
49
- });
50
- DialogContent.displayName = DialogPrimitive.Content.displayName;
51
- var DialogHeader = (_a) => {
52
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
53
- return /* @__PURE__ */ jsx("div", __spreadValues({ className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className) }, props));
54
- };
55
- DialogHeader.displayName = "DialogHeader";
56
- var DialogFooter = (_a) => {
57
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
58
- return /* @__PURE__ */ jsx(
59
- "div",
60
- __spreadValues({
61
- className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)
62
- }, props)
63
- );
64
- };
65
- DialogFooter.displayName = "DialogFooter";
66
- var DialogTitle = React.forwardRef((_a, ref) => {
67
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
68
- return /* @__PURE__ */ jsx(
69
- DialogPrimitive.Title,
70
- __spreadValues({
71
- ref,
72
- className: cn("text-lg font-semibold leading-none tracking-tight", className)
73
- }, props)
74
- );
75
- });
76
- DialogTitle.displayName = DialogPrimitive.Title.displayName;
77
- var DialogDescription = React.forwardRef((_a, ref) => {
78
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
79
- return /* @__PURE__ */ jsx(
80
- DialogPrimitive.Description,
81
- __spreadValues({
82
- ref,
83
- className: cn("text-sm text-muted-foreground", className)
84
- }, props)
85
- );
86
- });
87
- DialogDescription.displayName = DialogPrimitive.Description.displayName;
88
-
89
- export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
@@ -1,26 +0,0 @@
1
- import { cn } from './chunk-FEK5XGZW.js';
2
- import { __objRest, __spreadValues } from './chunk-3GWWZKX7.js';
3
- import * as React from 'react';
4
- import * as PopoverPrimitive from '@radix-ui/react-popover';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- var Popover = PopoverPrimitive.Root;
8
- var PopoverTrigger = PopoverPrimitive.Trigger;
9
- var PopoverContent = React.forwardRef((_a, ref) => {
10
- var _b = _a, { className, align = "center", sideOffset = 4 } = _b, props = __objRest(_b, ["className", "align", "sideOffset"]);
11
- return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
12
- PopoverPrimitive.Content,
13
- __spreadValues({
14
- ref,
15
- align,
16
- sideOffset,
17
- className: cn(
18
- "z-50 w-72 rounded-xl bg-cave-depth p-4 text-popover-foreground shadow-2xl outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border border-border/50",
19
- className
20
- )
21
- }, props)
22
- ) });
23
- });
24
- PopoverContent.displayName = PopoverPrimitive.Content.displayName;
25
-
26
- export { Popover, PopoverContent, PopoverTrigger };
@@ -1,24 +0,0 @@
1
- import { cn } from './chunk-FEK5XGZW.js';
2
- import { __objRest, __spreadValues } from './chunk-3GWWZKX7.js';
3
- import * as React from 'react';
4
- import { jsx } from 'react/jsx-runtime';
5
-
6
- var Input = React.forwardRef(
7
- (_a, ref) => {
8
- var _b = _a, { className, type } = _b, props = __objRest(_b, ["className", "type"]);
9
- return /* @__PURE__ */ jsx(
10
- "input",
11
- __spreadValues({
12
- type,
13
- className: cn(
14
- "flex h-11 w-full rounded-xl border border-border bg-input/50 backdrop-blur-md px-4 py-2 text-base transition-all duration-300 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:bg-input focus-visible:border-accent-foreground/30 focus-visible:shadow-lg focus-visible:shadow-accent/10 disabled:cursor-not-allowed disabled:opacity-50",
15
- className
16
- ),
17
- ref
18
- }, props)
19
- );
20
- }
21
- );
22
- Input.displayName = "Input";
23
-
24
- export { Input };
@@ -1,25 +0,0 @@
1
- import { cn } from './chunk-FEK5XGZW.js';
2
- import { __objRest, __spreadProps, __spreadValues } from './chunk-3GWWZKX7.js';
3
- import * as React from 'react';
4
- import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
5
- import { Check } from 'lucide-react';
6
- import { jsx } from 'react/jsx-runtime';
7
-
8
- var Checkbox = React.forwardRef((_a, ref) => {
9
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
10
- return /* @__PURE__ */ jsx(
11
- CheckboxPrimitive.Root,
12
- __spreadProps(__spreadValues({
13
- ref,
14
- className: cn(
15
- "peer h-5 w-5 shrink-0 rounded-md border border-border bg-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary data-[state=checked]:shadow-lg data-[state=checked]:shadow-primary/20 data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground data-[state=indeterminate]:border-primary data-[state=indeterminate]:shadow-lg data-[state=indeterminate]:shadow-primary/20 hover:border-primary/40 hover:shadow-md",
16
- className
17
- )
18
- }, props), {
19
- children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: cn("flex items-center justify-center text-current"), children: /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 animate-in zoom-in-50 duration-200" }) })
20
- })
21
- );
22
- });
23
- Checkbox.displayName = CheckboxPrimitive.Root.displayName;
24
-
25
- export { Checkbox };
@@ -1,31 +0,0 @@
1
- import { cn } from './chunk-FEK5XGZW.js';
2
- import { __objRest, __spreadValues } from './chunk-3GWWZKX7.js';
3
- import { cva } from 'class-variance-authority';
4
- import { jsx } from 'react/jsx-runtime';
5
-
6
- var badgeVariants = cva(
7
- "inline-flex items-center rounded-lg border px-2.5 py-0.5 text-xs font-semibold transition-[background-color,color,box-shadow,border-color] duration-300 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 backdrop-blur-md",
8
- {
9
- variants: {
10
- variant: {
11
- default: "border-transparent bg-primary/80 text-primary-foreground shadow-lg hover:bg-primary hover:shadow-xl hover:shadow-primary/20",
12
- secondary: "border-transparent bg-secondary/80 text-secondary-foreground shadow-lg hover:bg-secondary hover:shadow-xl hover:shadow-secondary/20",
13
- destructive: "border-transparent bg-destructive/80 text-destructive-foreground shadow-lg hover:bg-destructive hover:shadow-xl hover:shadow-destructive/20",
14
- outline: "text-foreground glass glass-hover",
15
- overlay: "border-transparent bg-black/50 text-white backdrop-blur-sm shadow-lg",
16
- glass: "glass glass-hover text-foreground border-border/50",
17
- success: "border-transparent bg-green-500/80 text-primary shadow-lg hover:bg-green-500 hover:shadow-xl hover:shadow-green-500/20",
18
- warning: "border-transparent bg-yellow-500/80 text-primary shadow-lg hover:bg-yellow-500 hover:shadow-xl hover:shadow-yellow-500/20"
19
- }
20
- },
21
- defaultVariants: {
22
- variant: "default"
23
- }
24
- }
25
- );
26
- function Badge(_a) {
27
- var _b = _a, { className, variant } = _b, props = __objRest(_b, ["className", "variant"]);
28
- return /* @__PURE__ */ jsx("div", __spreadValues({ className: cn(badgeVariants({ variant }), className) }, props));
29
- }
30
-
31
- export { Badge, badgeVariants };