@trading-game/design-intelligence-layer 0.8.5 → 0.8.8

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.
package/AGENTS.md CHANGED
@@ -10,22 +10,22 @@ Before building any landing page, product screen, game view, or feature UI, you
10
10
 
11
11
  **Design principles** — the decision framework for every layout, hierarchy, motion, copy, and component choice:
12
12
  ```
13
- node_modules/@trading-game/design-intelligence-layer/docs/design-principles/trading-game-design-principles.md
13
+ node_modules/@trading-game/design-intelligence-layer/guides/design-principles/trading-game-design-principles.md
14
14
  ```
15
15
 
16
16
  **Accessibility standards** — the inclusion standard every screen must meet (WCAG 2.1 AA):
17
17
  ```
18
- node_modules/@trading-game/design-intelligence-layer/docs/accessibility-standards/trading-game-accessibility-standards.md
18
+ node_modules/@trading-game/design-intelligence-layer/guides/accessibility-standards/trading-game-accessibility-standards.md
19
19
  ```
20
20
 
21
21
  **Personas** — the three player modes (Edge Seeker, System Runner, Public Predictor) that shape all copy and UX decisions:
22
22
  ```
23
- node_modules/@trading-game/design-intelligence-layer/docs/personas/trading-game-player-field-guide.md
23
+ node_modules/@trading-game/design-intelligence-layer/guides/personas/trading-game-player-field-guide.md
24
24
  ```
25
25
 
26
26
  **Tone of voice** — the creative foundation, campaign territories, and the mirror test for all player-facing copy:
27
27
  ```
28
- node_modules/@trading-game/design-intelligence-layer/docs/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md
28
+ node_modules/@trading-game/design-intelligence-layer/guides/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md
29
29
  ```
30
30
 
31
31
  All four files apply to all projects built with this package — landing pages, product screens, and games.
@@ -39,13 +39,13 @@ Run the checklists at the end of the design principles and accessibility standar
39
39
  You MUST also follow the full agent rules file:
40
40
 
41
41
  ```
42
- node_modules/@trading-game/design-intelligence-layer/docs/rules/design-system-consuming-project.mdc
42
+ node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc
43
43
  ```
44
44
 
45
45
  **Cursor users:** Copy this file into `.cursor/rules/` after every package upgrade:
46
46
 
47
47
  ```bash
48
- cp node_modules/@trading-game/design-intelligence-layer/docs/rules/design-system-consuming-project.mdc .cursor/rules/
48
+ cp node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc .cursor/rules/
49
49
  ```
50
50
 
51
51
  ---
@@ -63,8 +63,8 @@ cp node_modules/@trading-game/design-intelligence-layer/docs/rules/design-system
63
63
  ## Reference
64
64
 
65
65
  - Full token + component reference: `node_modules/@trading-game/design-intelligence-layer/README.md`
66
- - Design principles: `node_modules/@trading-game/design-intelligence-layer/docs/design-principles/trading-game-design-principles.md`
67
- - Accessibility standards: `node_modules/@trading-game/design-intelligence-layer/docs/accessibility-standards/trading-game-accessibility-standards.md`
68
- - Personas: `node_modules/@trading-game/design-intelligence-layer/docs/personas/trading-game-player-field-guide.md`
69
- - Tone of voice: `node_modules/@trading-game/design-intelligence-layer/docs/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md`
70
- - Full agent rules: `node_modules/@trading-game/design-intelligence-layer/docs/rules/design-system-consuming-project.mdc`
66
+ - Design principles: `node_modules/@trading-game/design-intelligence-layer/guides/design-principles/trading-game-design-principles.md`
67
+ - Accessibility standards: `node_modules/@trading-game/design-intelligence-layer/guides/accessibility-standards/trading-game-accessibility-standards.md`
68
+ - Personas: `node_modules/@trading-game/design-intelligence-layer/guides/personas/trading-game-player-field-guide.md`
69
+ - Tone of voice: `node_modules/@trading-game/design-intelligence-layer/guides/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md`
70
+ - Full agent rules: `node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc`
package/README.md CHANGED
@@ -84,7 +84,9 @@ npm install react react-dom tailwindcss
84
84
  ## What's inside
85
85
 
86
86
  - **54 UI components** — buttons, forms, dialogs, charts, sidebars, and more
87
- - **Design tokens** — CSS custom properties for color, radius, and typography synced from Figma
87
+ - **Design tokens** — CSS custom properties for color, radius, typography, and transitions synced from Figma
88
+ - **Transition tokens** — semantic duration and easing tokens (`duration-base`, `ease-standard`, etc.) — no hardcoded `duration-200` anywhere
89
+ - **Light-only theme** — white backgrounds, black text, primary blue accents — no dark mode
88
90
  - **Typography classes** — heading scale (h1–xs) and body scale (lg–xs) ready to use
89
91
  - **TypeScript** — full type definitions included
90
92
  - **ESM + CJS** — works with any bundler
@@ -205,6 +207,31 @@ npm install react react-dom tailwindcss
205
207
  <Alert variant="error" /> // red — error state
206
208
  ```
207
209
 
210
+ ## Component behaviour notes
211
+
212
+ ### AlertDialog — button fill
213
+ `AlertDialogAction` and `AlertDialogCancel` fill the full container width **only** when `size="sm"`. On `size="default"` (the default), buttons are natural width and right-aligned.
214
+
215
+ ```tsx
216
+ <AlertDialogContent size="sm"> // buttons fill width (50/50 grid)
217
+ <AlertDialogContent size="default"> // buttons natural width, right-aligned
218
+ ```
219
+
220
+ ### Drawer — footer buttons
221
+ `DrawerFooter` makes all direct child buttons fill the full width automatically via `[&>*]:w-full`. Stack your buttons inside `DrawerFooter` and they will always be full-width.
222
+
223
+ ### Link — size lg
224
+ The `lg` variant of `Link` uses `text-base` (16px). The `md` and `sm` variants use `text-sm` (14px) and `text-xs` (12px) respectively.
225
+
226
+ ```tsx
227
+ <Link size="lg" /> // 16px — font-base
228
+ <Link size="md" /> // 14px — font-sm
229
+ <Link size="sm" /> // 12px — font-xs
230
+ ```
231
+
232
+ ### Tabs — line variant hover
233
+ On the `line` variant, hover state shows `text-primary` (blue) with no background fill. On the `default` (pill) variant, hover shows a grey background with `text-on-prominent`.
234
+
208
235
  ---
209
236
 
210
237
  ## Design tokens
@@ -220,6 +247,8 @@ All tokens are CSS custom properties, loaded automatically via `@trading-game/de
220
247
  | `bg-popover` | `--popover` | `#FFFFFF` | Popover/dropdown surface |
221
248
  | `bg-subtle` | `--subtle` | `#F5F5F5` | Subtle tinted surface |
222
249
  | `bg-overlay` | `--overlay` | black 50% | Modal/dialog backdrop only |
250
+ | `bg-tabs` | `--tabs` | black 4% alpha | Tab container background (`variant="default"`) |
251
+ | `bg-tabs-active` | `--tabs-active` | `#FFFFFF` | Active / selected tab pill |
223
252
  | `bg-primary` | `--primary` | `#2323FF` | Brand blue — CTAs |
224
253
  | `bg-primary-hover` | `--primary-hover` | `#0B0BD2` | Primary button hover (darker blue) |
225
254
  | `bg-secondary-hover` | `--secondary-hover` | `#EEEEEE` | Outline/secondary hover (light grey) |
@@ -250,6 +279,29 @@ All tokens are CSS custom properties, loaded automatically via `@trading-game/de
250
279
 
251
280
  > ⚠️ **`border-border` vs `border-border-subtle`:** Both resolve to the same light grey `#EEEEEE`. `border-border` is kept for backward compatibility. **Prefer `border-border-subtle` in all new code.**
252
281
 
282
+ ### Transition tokens
283
+
284
+ Duration — primitive scale:
285
+
286
+ | Tailwind class | CSS variable | Value | Used for |
287
+ |---|---|---|---|
288
+ | `duration-instant` | `--primitive-duration-instant` | `50ms` | Focus rings, hover tints |
289
+ | `duration-fast` | `--primitive-duration-fast` | `100ms` | Buttons, inputs, badges |
290
+ | `duration-base` | `--primitive-duration-base` | `200ms` | Dropdowns, popovers, accordions |
291
+ | `duration-slow` | `--primitive-duration-slow` | `300ms` | Dialogs, sheets, drawers closing |
292
+ | `duration-open` | `--primitive-duration-open` | `500ms` | Sheets, drawers entering |
293
+
294
+ Easing — primitive scale:
295
+
296
+ | Tailwind class | CSS variable | Value | Used for |
297
+ |---|---|---|---|
298
+ | `ease-standard` | `--primitive-ease-standard` | `cubic-bezier(0.2, 0, 0, 1)` | General UI — bidirectional state changes |
299
+ | `ease-enter` | `--primitive-ease-enter` | `cubic-bezier(0, 0, 0.2, 1)` | Overlays / surfaces entering |
300
+ | `ease-exit` | `--primitive-ease-exit` | `cubic-bezier(0.4, 0, 1, 1)` | Overlays / surfaces leaving |
301
+ | `ease-linear` | `--primitive-ease-linear` | `linear` | Sidebar width, progress bar |
302
+
303
+ > Always use token utilities — never raw `duration-200` or `ease-in-out` directly.
304
+
253
305
  ### Other tokens
254
306
 
255
307
  | Tailwind class | Value | Usage |
@@ -270,6 +322,23 @@ Opacity on tokens is allowed and encouraged:
270
322
  ❌ bg-white → NOT a token, use bg-background or bg-card
271
323
  ```
272
324
 
325
+ ### Primitive alpha scales
326
+
327
+ For structured alpha surfaces, the design system ships two internal alpha primitive scales. These are **CSS variables only** — not exposed as Tailwind utility classes. Always reference them via a semantic token, never directly in components.
328
+
329
+ ```
330
+ --primitive-mono-alpha-4 through --primitive-mono-alpha-80 (black at N%)
331
+ --primitive-blue-alpha-4 through --primitive-blue-alpha-80 (brand blue at N%)
332
+ Stops: 4 · 8 · 16 · 24 · 32 · 40 · 50 · 64 · 80
333
+ ```
334
+
335
+ Example — how `--tabs` uses the alpha scale:
336
+ ```css
337
+ --tabs: var(--primitive-mono-alpha-4); /* black at 4% — tab container background */
338
+ ```
339
+
340
+ > `--primitive-black-50` is deprecated. It now aliases `--primitive-mono-alpha-50`. The `--overlay` semantic token is unaffected.
341
+
273
342
  ---
274
343
 
275
344
  ## Typography
@@ -315,7 +384,7 @@ When you bump `@trading-game/design-intelligence-layer` and run `npm install` (o
315
384
 
316
385
  **Overrides:** Passing large `className` strings onto DS components can mask new defaults (e.g. old radius after a “pill button” update). After upgrading, review those callsites.
317
386
 
318
- **Cursor / AI agents:** The package ships agent rules at `node_modules/@trading-game/design-intelligence-layer/docs/rules/design-system-consuming-project.mdc`. Cursor does **not** load rules from `node_modules` by default — **re-copy** that file into `.cursor/rules/` after each upgrade so instructions match the release (same command as in **AI Agent Setup** below). The rules include **Rule 7 — Package version upgrades**: agents should search for duplicated components, align with the package, and **tell you explicitly** if local component code was replaced.
387
+ **Cursor / AI agents:** The package ships agent rules at `node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc`. Cursor does **not** load rules from `node_modules` by default — **re-copy** that file into `.cursor/rules/` after each upgrade so instructions match the release (same command as in **AI Agent Setup** below). The rules include **Rule 7 — Package version upgrades**: agents should search for duplicated components, align with the package, and **tell you explicitly** if local component code was replaced.
319
388
 
320
389
  ---
321
390
 
@@ -336,22 +405,22 @@ This tells any AI agent to:
336
405
 
337
406
  **Design principles file** (bundled in the package):
338
407
  ```
339
- node_modules/@trading-game/design-intelligence-layer/docs/design-principles/trading-game-design-principles.md
408
+ node_modules/@trading-game/design-intelligence-layer/guides/design-principles/trading-game-design-principles.md
340
409
  ```
341
410
 
342
411
  **Accessibility standards file** (bundled in the package):
343
412
  ```
344
- node_modules/@trading-game/design-intelligence-layer/docs/accessibility-standards/trading-game-accessibility-standards.md
413
+ node_modules/@trading-game/design-intelligence-layer/guides/accessibility-standards/trading-game-accessibility-standards.md
345
414
  ```
346
415
 
347
416
  **Personas file** (bundled in the package):
348
417
  ```
349
- node_modules/@trading-game/design-intelligence-layer/docs/personas/trading-game-player-field-guide.md
418
+ node_modules/@trading-game/design-intelligence-layer/guides/personas/trading-game-player-field-guide.md
350
419
  ```
351
420
 
352
421
  **Tone of voice file** (bundled in the package):
353
422
  ```
354
- node_modules/@trading-game/design-intelligence-layer/docs/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md
423
+ node_modules/@trading-game/design-intelligence-layer/guides/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md
355
424
  ```
356
425
 
357
426
  All four files apply to all projects built with this package — landing pages, product screens, and games. Every AI agent must read all of them before starting any build. Run the design principles and accessibility checklists before completing any screen. Use the personas and tone of voice to guide all player-facing copy.
@@ -362,7 +431,7 @@ Copy the included rule file into your project:
362
431
 
363
432
  ```bash
364
433
  mkdir -p .cursor/rules
365
- cp node_modules/@trading-game/design-intelligence-layer/docs/rules/design-system-consuming-project.mdc .cursor/rules/
434
+ cp node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc .cursor/rules/
366
435
  ```
367
436
 
368
437
  Re-run this **`cp` after every design-system version bump** so your workspace rules stay in sync with the installed package.
@@ -375,17 +444,17 @@ Add the following to your project's `CLAUDE.md`:
375
444
  ## Design System
376
445
 
377
446
  This project uses @trading-game/design-intelligence-layer. Before writing any UI:
378
- 1. Read node_modules/@trading-game/design-intelligence-layer/docs/design-principles/trading-game-design-principles.md — apply the 8 principles and run the 7-point checklist on every screen
379
- 2. Read node_modules/@trading-game/design-intelligence-layer/docs/accessibility-standards/trading-game-accessibility-standards.md — apply WCAG 2.1 AA standards and run the 9-point accessibility checklist on every screen
380
- 3. Read node_modules/@trading-game/design-intelligence-layer/docs/personas/trading-game-player-field-guide.md — understand the 3 player modes (Edge Seeker, System Runner, Public Predictor) that shape all copy and UX
381
- 4. Read node_modules/@trading-game/design-intelligence-layer/docs/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md — apply the voice, campaign territories, and mirror test for all player-facing copy
447
+ 1. Read node_modules/@trading-game/design-intelligence-layer/guides/design-principles/trading-game-design-principles.md — apply the 8 principles and run the 7-point checklist on every screen
448
+ 2. Read node_modules/@trading-game/design-intelligence-layer/guides/accessibility-standards/trading-game-accessibility-standards.md — apply WCAG 2.1 AA standards and run the 9-point accessibility checklist on every screen
449
+ 3. Read node_modules/@trading-game/design-intelligence-layer/guides/personas/trading-game-player-field-guide.md — understand the 3 player modes (Edge Seeker, System Runner, Public Predictor) that shape all copy and UX
450
+ 4. Read node_modules/@trading-game/design-intelligence-layer/guides/tone-of-voice/trading-game-tone-of-voice-and-campaign-brief.md — apply the voice, campaign territories, and mirror test for all player-facing copy
382
451
  5. Check if the component exists in the package — import it, don't re-implement
383
452
  6. Use only design token classes (bg-background, text-on-prominent, border-border-subtle, etc.) — no hardcoded hex or raw Tailwind palette colors
384
453
  7. Do not install lucide-react, tailwindcss, or other bundled dependencies separately
385
454
  8. If no token exists for a value, ask before using a hardcoded value
386
- 9. After upgrading the package: prefer package imports over local copies of components; if replacing local UI code with the package version, tell the user what was overwritten; re-copy docs/rules/design-system-consuming-project.mdc into .cursor/rules if using Cursor
455
+ 9. After upgrading the package: prefer package imports over local copies of components; if replacing local UI code with the package version, tell the user what was overwritten; re-copy guides/rules/design-system-consuming-project.mdc into .cursor/rules if using Cursor
387
456
 
388
- See node_modules/@trading-game/design-intelligence-layer/docs/rules/design-system-consuming-project.mdc for full rules.
457
+ See node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc for full rules.
389
458
  See node_modules/@trading-game/design-intelligence-layer/README.md for complete token and component reference.
390
459
  ```
391
460
 
@@ -450,7 +519,7 @@ npm run build:next
450
519
  Design tokens are managed in Figma and exported as CSS variables. To update:
451
520
 
452
521
  1. Update the CSS custom properties in `app/globals.css` (playground) and `src/styles.css` (published package)
453
- 2. Update `docs/rules/design-system-consuming-project.mdc` to reflect any token renames
522
+ 2. Update `guides/rules/design-system-consuming-project.mdc` to reflect any token renames
454
523
  3. Update this README's token tables
455
524
 
456
525
  ---
package/dist/index.cjs CHANGED
@@ -626,7 +626,7 @@ function AlertDialogContent(_a) {
626
626
  "data-slot": "alert-dialog-content",
627
627
  "data-size": size,
628
628
  className: cn(
629
- "group/alert-dialog-content fixed top-[50%] left-[50%] z-50 flex h-auto w-full max-w-[calc(100%-2rem)] flex-col translate-x-[-50%] translate-y-[-50%] gap-6 rounded-sm border border-border-subtle bg-background p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg",
629
+ "group/alert-dialog-content fixed top-[50%] left-[50%] z-50 flex h-auto w-full max-w-[calc(100%-2rem)] flex-col translate-x-[-50%] translate-y-[-50%] gap-6 rounded-sm border border-border-subtle bg-background p-6 shadow-lg duration-base data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg",
630
630
  className
631
631
  )
632
632
  }, props)
@@ -725,11 +725,10 @@ function AlertDialogAction(_a) {
725
725
  "variant",
726
726
  "size"
727
727
  ]);
728
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Button, { variant, size, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
728
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Button, { variant, size, asChild: true, className: cn("group-data-[size=sm]/alert-dialog-content:w-full", className), children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
729
729
  import_radix_ui3.AlertDialog.Action,
730
730
  __spreadValues({
731
- "data-slot": "alert-dialog-action",
732
- className: cn(className)
731
+ "data-slot": "alert-dialog-action"
733
732
  }, props)
734
733
  ) });
735
734
  }
@@ -743,11 +742,10 @@ function AlertDialogCancel(_a) {
743
742
  "variant",
744
743
  "size"
745
744
  ]);
746
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Button, { variant, size, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
745
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Button, { variant, size, asChild: true, className: cn("group-data-[size=sm]/alert-dialog-content:w-full", className), children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
747
746
  import_radix_ui3.AlertDialog.Cancel,
748
747
  __spreadValues({
749
- "data-slot": "alert-dialog-cancel",
750
- className: cn(className)
748
+ "data-slot": "alert-dialog-cancel"
751
749
  }, props)
752
750
  ) });
753
751
  }
@@ -2354,7 +2352,7 @@ function DialogContent(_a) {
2354
2352
  __spreadProps(__spreadValues({
2355
2353
  "data-slot": "dialog-content",
2356
2354
  className: cn(
2357
- "fixed top-[50%] left-[50%] z-50 flex h-auto w-full max-w-[calc(100%-2rem)] flex-col translate-x-[-50%] translate-y-[-50%] gap-6 rounded-sm border border-border-subtle bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",
2355
+ "fixed top-[50%] left-[50%] z-50 flex h-auto w-full max-w-[calc(100%-2rem)] flex-col translate-x-[-50%] translate-y-[-50%] gap-6 rounded-sm border border-border-subtle bg-background p-6 shadow-lg duration-base outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",
2358
2356
  className
2359
2357
  )
2360
2358
  }, props), {
@@ -2927,7 +2925,7 @@ function DrawerFooter(_a) {
2927
2925
  "div",
2928
2926
  __spreadValues({
2929
2927
  "data-slot": "drawer-footer",
2930
- className: cn("mt-auto flex flex-col gap-2 p-4", className)
2928
+ className: cn("mt-auto flex flex-col gap-2 p-4 [&>*]:w-full", className)
2931
2929
  }, props)
2932
2930
  );
2933
2931
  }
@@ -3805,7 +3803,7 @@ function ItemSeparator(_a) {
3805
3803
  );
3806
3804
  }
3807
3805
  var itemVariants = (0, import_class_variance_authority7.cva)(
3808
- "group/item flex flex-wrap items-center rounded-md border border-transparent text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-secondary-hover",
3806
+ "group/item flex flex-wrap items-center rounded-md border border-transparent text-sm transition-colors duration-instant outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-secondary-hover",
3809
3807
  {
3810
3808
  variants: {
3811
3809
  variant: {
@@ -3993,7 +3991,7 @@ var linkVariants = (0, import_class_variance_authority8.cva)(
3993
3991
  {
3994
3992
  variants: {
3995
3993
  size: {
3996
- lg: "text-sm [&_svg:not([class*='size-'])]:size-4",
3994
+ lg: "text-base [&_svg:not([class*='size-'])]:size-4",
3997
3995
  md: "text-sm [&_svg:not([class*='size-'])]:size-4",
3998
3996
  sm: "text-xs [&_svg:not([class*='size-'])]:size-[14px]"
3999
3997
  }
@@ -4424,7 +4422,7 @@ function NavigationMenuTrigger(_a) {
4424
4422
  /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4425
4423
  import_lucide_react14.ChevronDownIcon,
4426
4424
  {
4427
- className: "relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180",
4425
+ className: "relative top-[1px] ml-1 size-3 transition duration-slow group-data-[state=open]:rotate-180",
4428
4426
  "aria-hidden": "true"
4429
4427
  }
4430
4428
  )
@@ -4444,7 +4442,7 @@ function NavigationMenuContent(_a) {
4444
4442
  "data-slot": "navigation-menu-content",
4445
4443
  className: cn(
4446
4444
  "top-0 left-0 w-full p-2 pr-2.5 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out md:absolute md:w-auto",
4447
- "group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:border-border-subtle group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95",
4445
+ "group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:border-border-subtle group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-base **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95",
4448
4446
  className
4449
4447
  )
4450
4448
  }, props)
@@ -4886,10 +4884,12 @@ function SelectTrigger(_a) {
4886
4884
  var _b = _a, {
4887
4885
  className,
4888
4886
  size = "default",
4887
+ readOnly = false,
4889
4888
  children
4890
4889
  } = _b, props = __objRest(_b, [
4891
4890
  "className",
4892
4891
  "size",
4892
+ "readOnly",
4893
4893
  "children"
4894
4894
  ]);
4895
4895
  return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
@@ -4897,14 +4897,16 @@ function SelectTrigger(_a) {
4897
4897
  __spreadProps(__spreadValues({
4898
4898
  "data-slot": "select-trigger",
4899
4899
  "data-size": size,
4900
+ "data-readonly": readOnly ? "" : void 0,
4901
+ disabled: readOnly || props.disabled,
4900
4902
  className: cn(
4901
- "flex w-fit items-center justify-between gap-2 rounded-sm border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-on-subtle data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-on-subtle",
4903
+ "flex w-fit items-center justify-between gap-2 rounded-sm border border-input bg-background appearance-none px-3 py-2 text-sm whitespace-nowrap transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-on-subtle data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-on-subtle data-[readonly]:cursor-default data-[readonly]:opacity-100",
4902
4904
  className
4903
4905
  )
4904
4906
  }, props), {
4905
4907
  children: [
4906
4908
  children,
4907
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_radix_ui26.Select.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react18.ChevronDownIcon, { className: "size-4 opacity-50" }) })
4909
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_radix_ui26.Select.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react18.ChevronDownIcon, { className: cn("size-4", readOnly ? "opacity-30" : "opacity-50") }) })
4908
4910
  ]
4909
4911
  })
4910
4912
  );
@@ -5104,7 +5106,7 @@ function SheetContent(_a) {
5104
5106
  __spreadProps(__spreadValues({
5105
5107
  "data-slot": "sheet-content",
5106
5108
  className: cn(
5107
- "fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500",
5109
+ "fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-standard data-[state=closed]:animate-out data-[state=closed]:duration-slow data-[state=open]:animate-in data-[state=open]:duration-open",
5108
5110
  side === "right" && "inset-y-0 right-0 h-full w-3/4 border-l border-border-subtle data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
5109
5111
  side === "left" && "inset-y-0 left-0 h-full w-3/4 border-r border-border-subtle data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
5110
5112
  side === "top" && "inset-x-0 top-0 h-auto border-b border-border-subtle data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
@@ -5418,7 +5420,7 @@ function Sidebar(_a) {
5418
5420
  {
5419
5421
  "data-slot": "sidebar-gap",
5420
5422
  className: cn(
5421
- "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
5423
+ "relative w-(--sidebar-width) bg-transparent transition-[width] duration-base ease-linear",
5422
5424
  "group-data-[collapsible=offcanvas]:w-0",
5423
5425
  "group-data-[side=right]:rotate-180",
5424
5426
  variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
@@ -5430,7 +5432,7 @@ function Sidebar(_a) {
5430
5432
  __spreadProps(__spreadValues({
5431
5433
  "data-slot": "sidebar-container",
5432
5434
  className: cn(
5433
- "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
5435
+ "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-base ease-linear md:flex",
5434
5436
  side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
5435
5437
  // Adjust the padding for floating and inset variants.
5436
5438
  variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
@@ -6205,51 +6207,68 @@ function Tabs(_a) {
6205
6207
  );
6206
6208
  }
6207
6209
  var tabsListVariants = (0, import_class_variance_authority11.cva)(
6208
- "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-on-subtle group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none",
6210
+ "group/tabs-list inline-flex w-fit items-center justify-center text-on-subtle group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none has-[[data-icon-position=top]]:h-auto",
6209
6211
  {
6210
6212
  variants: {
6211
6213
  variant: {
6212
- default: "bg-subtle",
6214
+ default: "bg-tabs",
6213
6215
  line: "gap-1 bg-transparent"
6216
+ },
6217
+ size: {
6218
+ sm: "h-8 rounded-md p-[2px]",
6219
+ md: "h-10 rounded-lg p-1",
6220
+ lg: "h-12 rounded-xl p-1.5"
6214
6221
  }
6215
6222
  },
6216
6223
  defaultVariants: {
6217
- variant: "default"
6224
+ variant: "default",
6225
+ size: "md"
6218
6226
  }
6219
6227
  }
6220
6228
  );
6221
6229
  function TabsList(_a) {
6222
6230
  var _b = _a, {
6223
6231
  className,
6224
- variant = "default"
6232
+ variant = "default",
6233
+ size = "md"
6225
6234
  } = _b, props = __objRest(_b, [
6226
6235
  "className",
6227
- "variant"
6236
+ "variant",
6237
+ "size"
6228
6238
  ]);
6229
6239
  return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
6230
6240
  import_radix_ui32.Tabs.List,
6231
6241
  __spreadValues({
6232
6242
  "data-slot": "tabs-list",
6233
6243
  "data-variant": variant,
6234
- className: cn(tabsListVariants({ variant }), className)
6244
+ "data-size": size,
6245
+ className: cn(tabsListVariants({ variant, size }), className)
6235
6246
  }, props)
6236
6247
  );
6237
6248
  }
6238
6249
  function TabsTrigger(_a) {
6239
6250
  var _b = _a, {
6240
- className
6251
+ className,
6252
+ iconPosition = "inline"
6241
6253
  } = _b, props = __objRest(_b, [
6242
- "className"
6254
+ "className",
6255
+ "iconPosition"
6243
6256
  ]);
6244
6257
  return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
6245
6258
  import_radix_ui32.Tabs.Trigger,
6246
6259
  __spreadValues({
6247
6260
  "data-slot": "tabs-trigger",
6261
+ "data-icon-position": iconPosition,
6248
6262
  className: cn(
6249
- "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-normal whitespace-nowrap text-on-prominent/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:bg-secondary-hover hover:text-on-prominent focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-none group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
6250
- "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent",
6251
- "data-[state=active]:bg-background data-[state=active]:border-transparent data-[state=active]:text-primary data-[state=active]:font-semibold",
6263
+ "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-3 py-1 text-sm font-normal whitespace-nowrap text-on-prominent/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:bg-secondary-hover hover:text-on-prominent focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-none group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
6264
+ "group-data-[size=sm]/tabs-list:gap-1 group-data-[size=sm]/tabs-list:rounded-sm group-data-[size=sm]/tabs-list:px-2 group-data-[size=sm]/tabs-list:text-xs",
6265
+ "group-data-[size=lg]/tabs-list:gap-2 group-data-[size=lg]/tabs-list:rounded-lg group-data-[size=lg]/tabs-list:px-4 group-data-[size=lg]/tabs-list:text-base",
6266
+ "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:hover:bg-transparent group-data-[variant=line]/tabs-list:hover:text-primary group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent",
6267
+ "data-[state=active]:bg-tabs-active data-[state=active]:border-transparent data-[state=active]:text-primary data-[state=active]:font-semibold",
6252
6268
  "after:absolute after:bg-primary after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100",
6269
+ iconPosition === "top" && "h-auto flex-col gap-1 py-2",
6270
+ iconPosition === "top" && "group-data-[size=sm]/tabs-list:gap-0.5 group-data-[size=sm]/tabs-list:py-1.5",
6271
+ iconPosition === "top" && "group-data-[size=lg]/tabs-list:gap-1.5 group-data-[size=lg]/tabs-list:py-2.5",
6253
6272
  className
6254
6273
  )
6255
6274
  }, props)