@trading-game/design-intelligence-layer 0.11.1 → 0.12.1

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/README.md CHANGED
@@ -149,7 +149,7 @@ npm install react react-dom tailwindcss
149
149
  | Table | `Table, TableHeader, TableBody, TableRow, TableHead, TableCell` |
150
150
  | Tabs | `Tabs, TabsList, TabsTrigger, TabsContent` |
151
151
  | Textarea | `Textarea` |
152
- | Ticket Card | `TicketCard` |
152
+ | Ticket Card | `TicketCard`, `CreditTicketCard` |
153
153
  | Toast | `Toaster` |
154
154
  | Toggle | `Toggle, toggleVariants` |
155
155
  | Toggle Group | `ToggleGroup, ToggleGroupItem` |
@@ -165,6 +165,8 @@ Blocks are pre-composed UI patterns built from design system primitives. They ar
165
165
  |---|---|---|
166
166
  | NavBar | Desktop, Mobile (closed), Mobile (open) | Landing page top navigation bar. Logo + ghost nav links (Products, Use Cases, Docs, Blog, FAQ) + Sign in / Sign up CTAs. |
167
167
  | Hero | Type 1 (Desktop + Mobile), Type 2 | Landing page hero sections. Type 1: tagline pill + heading + body + CTAs left, image right (responsive). Type 2: centred single-column, tagline pill + heading + body + primary CTA with arrow icon, no image. |
168
+ | Sheet Open Positions | Active, Empty | Right-side sheet (desktop) / bottom drawer (mobile) listing open trading positions. Active state shows a scrollable position list with win/loss colouring and a history footer link. Empty state shows an empty state illustration. |
169
+ | Header navigation | — | Product app top header bar. Back navigation button left, account balance + Demo badge centre, history and sound action buttons right. |
168
170
 
169
171
  ---
170
172
 
@@ -215,6 +217,8 @@ States: hover (`bg-secondary-hover`), focus (3px `ring-ring/50`), active (`opaci
215
217
  <Badge variant="fill" /> // Blue tint
216
218
  <Badge variant="fill-success" /> // Green tint
217
219
  <Badge variant="fill-fail" /> // Red tint
220
+ <Badge variant="fill-warning" /> // Orange tint
221
+ <Badge variant="fill-credit" /> // Amber-orange tint — credit/bonus labels (pair with TicketPlus icon)
218
222
 
219
223
  // Outline (black border, secondary-hover on hover)
220
224
  <Badge variant="outline" />
@@ -293,6 +297,7 @@ All tokens are CSS custom properties, loaded automatically via `@trading-game/de
293
297
  | `bg-secondary-hover` | `--secondary-hover` | `#EEEEEE` | Outline/secondary hover (light grey) |
294
298
  | `bg-semantic-win` | `--semantic-win` | green | Profit / positive state |
295
299
  | `bg-semantic-loss` | `--semantic-loss` | red | Loss / negative state |
300
+ | `bg-semantic-credit` | `--semantic-credit` | `#F9840F` amber-orange | Credit / bonus badge background |
296
301
 
297
302
  ### Text tokens
298
303
 
@@ -306,6 +311,7 @@ All tokens are CSS custom properties, loaded automatically via `@trading-game/de
306
311
  | `text-primary` | `#2323FF` | Brand blue inline text |
307
312
  | `text-semantic-win` | green | Profit / positive text |
308
313
  | `text-semantic-loss` | red | Loss / negative text |
314
+ | `text-semantic-credit-text` | `#713813` dark amber | Credit / bonus badge foreground |
309
315
 
310
316
  ### Border & focus tokens
311
317
 
@@ -577,6 +583,14 @@ Design tokens are managed in Figma and exported as CSS variables. To update:
577
583
 
578
584
  ## Changelog
579
585
 
586
+ ### v0.12.0
587
+ - **New semantic tokens — credit:** `--semantic-credit` (`#F9840F` amber-orange) and `--semantic-credit-text` (`#713813` dark amber) added to both `src/styles.css` and `app/globals.css`. Tailwind utilities: `bg-semantic-credit`, `text-semantic-credit-text`.
588
+ - **Badge — `fill-credit` variant:** New `fill-credit` variant for credit/bonus labels — `bg-semantic-credit/16` background with `text-semantic-credit-text` foreground. Pair with a `TicketPlus` icon. Badge base class no longer applies `tracking-wide`; letter spacing is default on all badge variants.
589
+ - **New `CreditTicketCard` component:** Exported alongside `TicketCard`. Renders the same ticket shell (notches, tear-line, shimmer stub) but with a variable-height card body and an inline `<Badge variant="fill-credit">` below the value for credit/bonus display. Props: `icon`, `label`, `value`, `currency`, `stubLabel`, `onStubClick`, `stubDisabled`, `creditAmount` (default `"0.00"`), `creditCurrency` (default `"USDT"`), `compact`.
590
+ - **`TicketCard` — `compact` prop:** New boolean prop (default `false`). When `true`, reduces left-content padding from `px-4 gap-4` to `px-2 gap-2` for mobile layouts.
591
+ - **`TicketCard` — welcome-credit props removed:** `welcomeCredit`, `freeCredit` (deprecated alias), `creditUsed`, `creditTotal`, `creditCurrency`, `creditLabel`, `creditFullWidth`, and the `Progress`-based credit bar have been removed. Use `CreditTicketCard` for the credit use case.
592
+ - **`tracking-wide` / `tracking-widest` removed from several components:** Badge base class, `Link` base class, `PaginationLink`, `CommandShortcut`, `ContextMenuShortcut`, `DropdownMenuShortcut`, and `MenubarShortcut` no longer apply letter-spacing overrides. All render with default tracking.
593
+
580
594
  ### v0.10.1
581
595
  - **TicketCard — Wallet icon:** Default icon in the circular badge is now a `Wallet` icon (replaces `CircleDollarSign`).
582
596
  - **TicketCard — sentence case labels:** The label above the value (e.g. "Total balance") and the stub label (e.g. "Deposit") no longer apply `uppercase` or `tracking-widest`. Both render in sentence case with default letter spacing.
package/dist/index.cjs CHANGED
@@ -158,6 +158,7 @@ __export(index_exports, {
158
158
  ContextMenuSubContent: () => ContextMenuSubContent,
159
159
  ContextMenuSubTrigger: () => ContextMenuSubTrigger,
160
160
  ContextMenuTrigger: () => ContextMenuTrigger,
161
+ CreditTicketCard: () => CreditTicketCard,
161
162
  Dialog: () => Dialog,
162
163
  DialogClose: () => DialogClose,
163
164
  DialogContent: () => DialogContent,
@@ -935,7 +936,7 @@ var import_class_variance_authority3 = require("class-variance-authority");
935
936
  var import_radix_ui6 = require("radix-ui");
936
937
  var import_jsx_runtime8 = require("react/jsx-runtime");
937
938
  var badgeVariants = (0, import_class_variance_authority3.cva)(
938
- "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent text-xs font-display font-semibold tracking-wide whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [&>svg]:pointer-events-none [&>svg]:size-3",
939
+ "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent text-xs font-display font-semibold whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [&>svg]:pointer-events-none [&>svg]:size-3",
939
940
  {
940
941
  variants: {
941
942
  variant: {
@@ -949,6 +950,7 @@ var badgeVariants = (0, import_class_variance_authority3.cva)(
949
950
  "fill-success": "bg-semantic-win/10 border-transparent text-semantic-win",
950
951
  "fill-fail": "bg-semantic-loss/10 border-transparent text-semantic-loss",
951
952
  "fill-warning": "bg-semantic-warning/10 border-transparent text-semantic-warning",
953
+ "fill-credit": "bg-semantic-credit/16 border-transparent text-semantic-credit-text !text-xs !font-semibold",
952
954
  // Ghost (transparent)
953
955
  ghost: "bg-transparent border-transparent text-primary [a&]:hover:bg-secondary-hover [a&]:hover:text-primary",
954
956
  "ghost-success": "bg-transparent border-transparent text-semantic-win [a&]:hover:bg-semantic-win/10 [a&]:hover:text-semantic-win",
@@ -2744,7 +2746,7 @@ function CommandShortcut(_a) {
2744
2746
  __spreadValues({
2745
2747
  "data-slot": "command-shortcut",
2746
2748
  className: cn(
2747
- "ml-auto text-xs tracking-widest text-on-subtle",
2749
+ "ml-auto text-xs text-on-subtle",
2748
2750
  className
2749
2751
  )
2750
2752
  }, props)
@@ -2964,7 +2966,7 @@ function ContextMenuShortcut(_a) {
2964
2966
  __spreadValues({
2965
2967
  "data-slot": "context-menu-shortcut",
2966
2968
  className: cn(
2967
- "ml-auto text-xs tracking-widest text-on-subtle",
2969
+ "ml-auto text-xs text-on-subtle",
2968
2970
  className
2969
2971
  )
2970
2972
  }, props)
@@ -3275,7 +3277,7 @@ function DropdownMenuShortcut(_a) {
3275
3277
  __spreadValues({
3276
3278
  "data-slot": "dropdown-menu-shortcut",
3277
3279
  className: cn(
3278
- "ml-auto text-xs tracking-widest text-on-subtle",
3280
+ "ml-auto text-xs text-on-subtle",
3279
3281
  className
3280
3282
  )
3281
3283
  }, props)
@@ -4131,7 +4133,7 @@ var import_class_variance_authority9 = require("class-variance-authority");
4131
4133
  var import_radix_ui19 = require("radix-ui");
4132
4134
  var import_jsx_runtime35 = require("react/jsx-runtime");
4133
4135
  var linkVariants = (0, import_class_variance_authority9.cva)(
4134
- "inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 active:opacity-60 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:inline font-display font-bold normal-case tracking-wide text-primary hover:underline decoration-2 underline-offset-4",
4136
+ "inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 active:opacity-60 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:inline font-display font-bold normal-case text-primary hover:underline decoration-2 underline-offset-4",
4135
4137
  {
4136
4138
  variants: {
4137
4139
  size: {
@@ -4365,7 +4367,7 @@ function MenubarShortcut(_a) {
4365
4367
  __spreadValues({
4366
4368
  "data-slot": "menubar-shortcut",
4367
4369
  className: cn(
4368
- "ml-auto text-xs tracking-widest text-on-subtle",
4370
+ "ml-auto text-xs text-on-subtle",
4369
4371
  className
4370
4372
  )
4371
4373
  }, props)
@@ -4749,7 +4751,7 @@ function PaginationLink(_a) {
4749
4751
  "data-slot": "pagination-link",
4750
4752
  "data-active": isActive,
4751
4753
  className: cn(
4752
- "inline-flex shrink-0 items-center justify-center size-10 rounded-xs text-sm font-display font-bold uppercase tracking-wide whitespace-nowrap transition-[color,background-color,border-color] outline-none border",
4754
+ "inline-flex shrink-0 items-center justify-center size-10 rounded-xs text-sm font-display font-bold uppercase whitespace-nowrap transition-[color,background-color,border-color] outline-none border",
4753
4755
  isActive ? "bg-primary/10 border-primary text-primary" : "bg-transparent border-transparent text-on-prominent hover:bg-secondary-hover",
4754
4756
  className
4755
4757
  )
@@ -6615,25 +6617,84 @@ function TicketCard({
6615
6617
  stubLabel,
6616
6618
  onStubClick,
6617
6619
  stubDisabled = false,
6618
- welcomeCredit,
6619
- freeCredit,
6620
- creditUsed = "10.00",
6621
- creditTotal = "10.00",
6620
+ compact = false
6621
+ }) {
6622
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: cn("flex w-full flex-col gap-2", className), children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "relative flex h-20 w-full items-stretch justify-between rounded-sm bg-subtle", children: [
6623
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: cn("flex flex-1 items-center overflow-hidden", compact ? "gap-2 px-2" : "gap-4 px-4"), children: [
6624
+ icon && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-full border-2 border-primary text-primary", children: icon }),
6625
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex h-11 flex-col justify-center gap-1 whitespace-nowrap", children: [
6626
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("p", { className: "text-xs text-on-subtle", children: label }),
6627
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("p", { className: "leading-none", children: [
6628
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-[20px] font-bold text-on-prominent", children: value }),
6629
+ currency && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
6630
+ " ",
6631
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-sm text-on-subtle", children: currency })
6632
+ ] })
6633
+ ] })
6634
+ ] })
6635
+ ] }),
6636
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] top-[-12px] z-10 size-6 rounded-full bg-prominent" }),
6637
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] top-[68px] z-10 size-6 rounded-full bg-prominent" }),
6638
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6639
+ "div",
6640
+ {
6641
+ "aria-hidden": true,
6642
+ className: "pointer-events-none absolute bottom-[12px] top-[12px] z-10 w-1 -translate-x-1/2",
6643
+ style: {
6644
+ right: 96,
6645
+ backgroundImage: "repeating-linear-gradient(to bottom, color-mix(in oklch, var(--border-subtle) 80%, black) 0px, color-mix(in oklch, var(--border-subtle) 80%, black) 3px, transparent 3px, transparent 6px)"
6646
+ }
6647
+ }
6648
+ ),
6649
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
6650
+ "button",
6651
+ {
6652
+ type: "button",
6653
+ onClick: onStubClick,
6654
+ disabled: stubDisabled,
6655
+ "aria-label": stubLabel,
6656
+ className: cn(
6657
+ "relative flex h-20 w-[100px] shrink-0 flex-col items-center justify-center gap-1 overflow-hidden rounded-r-sm bg-primary",
6658
+ "transition-colors duration-fast ease-standard",
6659
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
6660
+ stubDisabled ? "cursor-not-allowed opacity-50" : "hover:bg-primary-hover"
6661
+ ),
6662
+ children: [
6663
+ !stubDisabled && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6664
+ "span",
6665
+ {
6666
+ "aria-hidden": true,
6667
+ className: "pointer-events-none absolute inset-0 [animation:stub-shimmer_1.5s_linear_infinite]",
6668
+ style: {
6669
+ background: "linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.30) 50%, transparent 100%)"
6670
+ }
6671
+ }
6672
+ ),
6673
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react23.ArrowRight, { className: "size-4 text-on-prominent-static-inverse" }),
6674
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-sm font-semibold text-on-prominent-static-inverse", children: stubLabel })
6675
+ ]
6676
+ }
6677
+ )
6678
+ ] }) });
6679
+ }
6680
+ function CreditTicketCard({
6681
+ className,
6682
+ icon,
6683
+ label,
6684
+ value,
6685
+ currency,
6686
+ stubLabel,
6687
+ onStubClick,
6688
+ stubDisabled = false,
6689
+ creditAmount = "0.00",
6622
6690
  creditCurrency = "USDT",
6623
- creditLabel = "Welcome credit",
6624
- creditFullWidth = false
6691
+ compact = false
6625
6692
  }) {
6626
- var _a;
6627
- const showCredit = (_a = welcomeCredit != null ? welcomeCredit : freeCredit) != null ? _a : false;
6628
- const creditPct = Math.min(
6629
- 100,
6630
- Math.max(0, parseFloat(creditUsed) / parseFloat(creditTotal) * 100)
6631
- );
6632
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: cn("flex w-full flex-col gap-2", className), children: [
6633
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "relative flex h-20 w-full items-stretch justify-between rounded-sm bg-subtle", children: [
6634
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex flex-1 items-center gap-4 overflow-hidden px-4", children: [
6635
- icon && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-full border-2 border-primary text-primary", children: icon }),
6636
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex h-11 flex-col justify-center gap-1 whitespace-nowrap", children: [
6693
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: cn("flex w-full flex-col gap-2", className), children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "relative flex w-full items-stretch justify-between rounded-sm bg-subtle", children: [
6694
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: cn("flex flex-1 items-center overflow-hidden py-4", compact ? "gap-2 px-2" : "gap-4 px-4"), children: [
6695
+ icon && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-full border-2 border-primary text-primary", children: icon }),
6696
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex flex-col gap-2 whitespace-nowrap", children: [
6697
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex flex-col gap-1", children: [
6637
6698
  /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("p", { className: "text-xs text-on-subtle", children: label }),
6638
6699
  /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("p", { className: "leading-none", children: [
6639
6700
  /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-[20px] font-bold text-on-prominent", children: value }),
@@ -6642,74 +6703,59 @@ function TicketCard({
6642
6703
  /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-sm text-on-subtle", children: currency })
6643
6704
  ] })
6644
6705
  ] })
6706
+ ] }),
6707
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(Badge, { variant: "fill-credit", size: "sm", className: "!gap-1 !font-medium !tracking-normal", children: [
6708
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react23.TicketPlus, { className: "!size-3.5", strokeWidth: 2 }),
6709
+ "Credit: ",
6710
+ creditAmount,
6711
+ " ",
6712
+ creditCurrency
6645
6713
  ] })
6646
- ] }),
6647
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] top-[-12px] z-10 size-6 rounded-full bg-prominent" }),
6648
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] top-[68px] z-10 size-6 rounded-full bg-prominent" }),
6649
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6650
- "div",
6651
- {
6652
- "aria-hidden": true,
6653
- className: "pointer-events-none absolute bottom-[12px] top-[12px] z-10 w-1 -translate-x-1/2",
6654
- style: {
6655
- right: 96,
6656
- backgroundImage: "repeating-linear-gradient(to bottom, color-mix(in oklch, var(--border-subtle) 80%, black) 0px, color-mix(in oklch, var(--border-subtle) 80%, black) 3px, transparent 3px, transparent 6px)"
6657
- }
6714
+ ] })
6715
+ ] }),
6716
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] top-[-12px] z-10 size-6 rounded-full bg-prominent" }),
6717
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] bottom-[-12px] z-10 size-6 rounded-full bg-prominent" }),
6718
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6719
+ "div",
6720
+ {
6721
+ "aria-hidden": true,
6722
+ className: "pointer-events-none absolute bottom-[12px] top-[12px] z-10 w-1 -translate-x-1/2",
6723
+ style: {
6724
+ right: 96,
6725
+ backgroundImage: "repeating-linear-gradient(to bottom, color-mix(in oklch, var(--border-subtle) 80%, black) 0px, color-mix(in oklch, var(--border-subtle) 80%, black) 3px, transparent 3px, transparent 6px)"
6658
6726
  }
6659
- ),
6660
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
6661
- "button",
6662
- {
6663
- type: "button",
6664
- onClick: onStubClick,
6665
- disabled: stubDisabled,
6666
- "aria-label": stubLabel,
6667
- className: cn(
6668
- "relative flex h-20 w-[100px] shrink-0 flex-col items-center justify-center gap-1 overflow-hidden rounded-r-sm bg-primary",
6669
- "transition-colors duration-fast ease-standard",
6670
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
6671
- stubDisabled ? "cursor-not-allowed opacity-50" : "hover:bg-primary-hover"
6672
- ),
6673
- children: [
6674
- !stubDisabled && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6675
- "span",
6676
- {
6677
- "aria-hidden": true,
6678
- className: "pointer-events-none absolute inset-0 [animation:stub-shimmer_1.5s_linear_infinite]",
6679
- style: {
6680
- background: "linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.30) 50%, transparent 100%)"
6681
- }
6727
+ }
6728
+ ),
6729
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
6730
+ "button",
6731
+ {
6732
+ type: "button",
6733
+ onClick: onStubClick,
6734
+ disabled: stubDisabled,
6735
+ "aria-label": stubLabel,
6736
+ className: cn(
6737
+ "relative flex w-[100px] shrink-0 self-stretch flex-col items-center justify-center gap-1 overflow-hidden rounded-r-sm bg-primary",
6738
+ "transition-colors duration-fast ease-standard",
6739
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
6740
+ stubDisabled ? "cursor-not-allowed opacity-50" : "hover:bg-primary-hover"
6741
+ ),
6742
+ children: [
6743
+ !stubDisabled && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6744
+ "span",
6745
+ {
6746
+ "aria-hidden": true,
6747
+ className: "pointer-events-none absolute inset-0 [animation:stub-shimmer_1.5s_linear_infinite]",
6748
+ style: {
6749
+ background: "linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.30) 50%, transparent 100%)"
6682
6750
  }
6683
- ),
6684
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react23.ArrowRight, { className: "size-4 text-on-prominent-static-inverse" }),
6685
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-sm font-semibold text-on-prominent-static-inverse", children: stubLabel })
6686
- ]
6687
- }
6688
- )
6689
- ] }),
6690
- showCredit && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: cn(
6691
- "flex items-center gap-2 rounded-sm bg-subtle p-2",
6692
- creditFullWidth ? "w-full" : "w-[calc(100%-112px)]"
6693
- ), children: [
6694
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react23.TicketPlus, { className: "size-6 shrink-0", style: { color: "#713813" } }),
6695
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
6696
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center justify-between whitespace-nowrap text-[10px] font-semibold", style: { color: "#713813" }, children: [
6697
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { children: creditLabel }),
6698
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { children: [
6699
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-on-prominent", children: creditUsed }),
6700
- ` / ${creditTotal} ${creditCurrency}`
6701
- ] })
6702
- ] }),
6703
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6704
- Progress,
6705
- {
6706
- value: creditPct,
6707
- className: "h-1 bg-black/8 [&>[data-slot=progress-indicator]]:bg-[#ef9f00]"
6708
- }
6709
- )
6710
- ] })
6711
- ] })
6712
- ] });
6751
+ }
6752
+ ),
6753
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react23.ArrowRight, { className: "size-4 text-on-prominent-static-inverse" }),
6754
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-sm font-semibold text-on-prominent-static-inverse", children: stubLabel })
6755
+ ]
6756
+ }
6757
+ )
6758
+ ] }) });
6713
6759
  }
6714
6760
  var TicketCardDesktop = TicketCard;
6715
6761
 
@@ -6930,6 +6976,7 @@ function ToggleGroupItem(_a) {
6930
6976
  ContextMenuSubContent,
6931
6977
  ContextMenuSubTrigger,
6932
6978
  ContextMenuTrigger,
6979
+ CreditTicketCard,
6933
6980
  Dialog,
6934
6981
  DialogClose,
6935
6982
  DialogContent,