gridsmith-ui 0.6.1 → 0.6.3

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/dist/index.d.ts CHANGED
@@ -658,15 +658,18 @@ interface TagProps {
658
658
  declare const Tag: react.ForwardRefExoticComponent<TagProps & react.RefAttributes<HTMLSpanElement>>;
659
659
 
660
660
  type AvatarStatus = "online" | "away" | "busy" | "offline";
661
+ type AvatarColor = "auto" | "accent" | "neutral" | 1 | 2 | 3 | 4 | 5;
661
662
  interface AvatarProps {
662
663
  initials?: string;
663
664
  src?: string;
664
665
  alt?: string;
665
666
  size?: "sm" | "md" | "lg";
666
667
  status?: AvatarStatus;
668
+ /** Initials background. "auto" (default) derives a stable palette tint from alt/initials so groups vary; use "accent" sparingly. */
669
+ color?: AvatarColor;
667
670
  className?: string;
668
671
  }
669
- declare function Avatar({ initials, src, alt, size, status, className }: AvatarProps): react_jsx_runtime.JSX.Element;
672
+ declare function Avatar({ initials, src, alt, size, status, color, className }: AvatarProps): react_jsx_runtime.JSX.Element;
670
673
 
671
674
  interface AvatarGroupItem {
672
675
  /** Display name — used for the tooltip and, when initials are omitted, to derive them. */
@@ -675,6 +678,7 @@ interface AvatarGroupItem {
675
678
  src?: string;
676
679
  alt?: string;
677
680
  status?: AvatarStatus;
681
+ color?: AvatarColor;
678
682
  }
679
683
  interface AvatarGroupProps {
680
684
  items: AvatarGroupItem[];
@@ -879,12 +883,17 @@ interface Tab {
879
883
  disabled?: boolean;
880
884
  /** Truncate long labels and show tooltip on hover. */
881
885
  truncate?: boolean;
886
+ /** Section heading in vertical layouts; becomes the option group in the mobile Dropdown. */
887
+ group?: string;
882
888
  }
883
889
  interface TabsArrayProps {
884
890
  tabs: Tab[];
885
891
  activeTab: string;
886
892
  onTabChange: (id: string) => void;
887
- orientation?: "horizontal" | "vertical";
893
+ /** "responsive" renders vertical from the md breakpoint up and collapses to a Dropdown below it. */
894
+ orientation?: "horizontal" | "vertical" | "responsive";
895
+ /** Below md, tabs either side-scroll (default) or collapse to a Dropdown. "responsive" implies "dropdown". */
896
+ mobile?: "scroll" | "dropdown";
888
897
  variant?: TabsVariant;
889
898
  fullWidth?: boolean;
890
899
  overflow?: TabsOverflow;
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
- import { Skeleton } from './chunk-OUYJXVLQ.js';
2
- export { Skeleton } from './chunk-OUYJXVLQ.js';
3
- import { Badge } from './chunk-UYGTAVKR.js';
4
- export { Badge } from './chunk-UYGTAVKR.js';
1
+ import { Skeleton } from './chunk-QGBG72OB.js';
2
+ export { Skeleton } from './chunk-QGBG72OB.js';
3
+ import { Badge } from './chunk-TYU2LQGK.js';
4
+ export { Badge } from './chunk-TYU2LQGK.js';
5
5
  import { useBreakpoint } from './chunk-DPF6776I.js';
6
6
  export { BreakpointWidthProvider, useBreakpoint } from './chunk-DPF6776I.js';
7
- import { Tooltip, useTextOverflow, usePosition, Slot } from './chunk-CHNY75QI.js';
8
- export { Tooltip, useTextOverflow } from './chunk-CHNY75QI.js';
7
+ import { Tooltip, useTextOverflow, usePosition, Slot } from './chunk-R5QGJURZ.js';
8
+ export { Tooltip, useTextOverflow } from './chunk-R5QGJURZ.js';
9
9
  import { Icon } from './chunk-GX6O72IV.js';
10
- import { cn, GLASS_SURFACE, GLASS_BACKDROP, GLASS_DROPDOWN, lockBodyScroll, unlockBodyScroll, GLASS_OVERLAY } from './chunk-IUBWNDUK.js';
11
- import { createContext, forwardRef, useContext, useState, useRef, useEffect, useCallback, useId, isValidElement, cloneElement, useMemo, Children, Fragment as Fragment$1, useLayoutEffect } from 'react';
10
+ import { cn, GLASS_SURFACE, ACTIVE_RING, GLASS_BACKDROP, GLASS_DROPDOWN, lockBodyScroll, unlockBodyScroll, GLASS_OVERLAY, FOCUS_RING, HAS_FOCUS_RING, FOCUS_WITHIN_RING } from './chunk-TTZSZNJ6.js';
11
+ import { createContext, forwardRef, useContext, useState, useRef, useEffect, useCallback, useId, isValidElement, cloneElement, Fragment as Fragment$1, useMemo, Children, useLayoutEffect } from 'react';
12
12
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
13
13
  import { createPortal } from 'react-dom';
14
14
 
@@ -324,7 +324,7 @@ function Input({ className, size = "md", error = false, prefix, suffix, ...props
324
324
  "rounded-[var(--ds-radius-md)]",
325
325
  "shadow-[var(--ds-input-shadow)]",
326
326
  hoverBorder,
327
- "has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-[var(--ds-input-focus-ring)] has-[:focus-visible]:border-[var(--ds-input-focus-ring)]",
327
+ HAS_FOCUS_RING,
328
328
  "transition-colors duration-[var(--ds-transition-speed)]",
329
329
  props.disabled && "cursor-not-allowed opacity-disabled",
330
330
  props.readOnly && "bg-[var(--ds-bg-muted)] cursor-default",
@@ -366,7 +366,7 @@ function Input({ className, size = "md", error = false, prefix, suffix, ...props
366
366
  "shadow-[var(--ds-input-shadow)]",
367
367
  "placeholder:text-[var(--ds-text-muted)]",
368
368
  hoverBorder,
369
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
369
+ FOCUS_RING,
370
370
  "disabled:cursor-not-allowed disabled:opacity-disabled",
371
371
  "read-only:bg-[var(--ds-bg-muted)] read-only:text-[var(--ds-text-secondary)] read-only:cursor-default",
372
372
  "transition-colors duration-[var(--ds-transition-speed)]",
@@ -406,7 +406,7 @@ function Textarea({ className, autoResize, maxRows, ref, ...props }) {
406
406
  "shadow-[var(--ds-input-shadow)]",
407
407
  "placeholder:text-[var(--ds-text-muted)]",
408
408
  "hover:border-[var(--ds-input-border-hover)]",
409
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
409
+ FOCUS_RING,
410
410
  "disabled:cursor-not-allowed disabled:opacity-disabled disabled:hover:border-[var(--ds-input-border)]",
411
411
  "read-only:bg-[var(--ds-bg-muted)] read-only:text-[var(--ds-text-secondary)] read-only:cursor-default read-only:hover:border-[var(--ds-input-border)]",
412
412
  "transition-colors duration-[var(--ds-transition-speed)]",
@@ -677,8 +677,8 @@ function Dropdown({
677
677
  "shadow-[var(--ds-input-shadow)]",
678
678
  "transition-colors",
679
679
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
680
- open && !error && "border-[var(--ds-input-focus-ring)] ring-2 ring-[var(--ds-input-focus-ring)]",
681
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
680
+ open && !error && ACTIVE_RING,
681
+ FOCUS_RING,
682
682
  "cursor-pointer disabled:cursor-not-allowed disabled:opacity-disabled",
683
683
  !selectedValues.length && "text-[var(--ds-text-muted)]"
684
684
  ),
@@ -885,7 +885,7 @@ function Combobox({ value, onChange, options, placeholder = "Search\u2026", disa
885
885
  "shadow-[var(--ds-input-shadow)]",
886
886
  "transition-colors duration-[var(--ds-transition-speed)]",
887
887
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
888
- "has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-[var(--ds-input-focus-ring)] has-[:focus-visible]:border-[var(--ds-input-focus-ring)]",
888
+ HAS_FOCUS_RING,
889
889
  disabled && "opacity-disabled pointer-events-none"
890
890
  ),
891
891
  children: [
@@ -1290,7 +1290,7 @@ function DatePicker({ value, onChange, placeholder = "Pick a date", disabled, cl
1290
1290
  "transition-colors cursor-pointer",
1291
1291
  "px-ds-3 py-ds-2",
1292
1292
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
1293
- open && "border-[var(--ds-accent-primary)] ring-2 ring-[var(--ds-input-focus-ring)]",
1293
+ open && ACTIVE_RING,
1294
1294
  disabled && "opacity-disabled cursor-not-allowed",
1295
1295
  value ? "text-[var(--ds-text-primary)]" : "text-[var(--ds-text-muted)]"
1296
1296
  ),
@@ -1695,8 +1695,8 @@ function DateRangePicker({
1695
1695
  "transition-colors cursor-pointer",
1696
1696
  "px-ds-3 py-ds-2",
1697
1697
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
1698
- open && "border-[var(--ds-accent-primary)] ring-2 ring-[var(--ds-input-focus-ring)]",
1699
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)]",
1698
+ open && ACTIVE_RING,
1699
+ FOCUS_RING,
1700
1700
  disabled && "opacity-disabled cursor-not-allowed",
1701
1701
  summary ? "text-[var(--ds-text-primary)]" : "text-[var(--ds-text-muted)]"
1702
1702
  ),
@@ -1907,7 +1907,7 @@ function FileUpload({ onFiles, accept, multiple = true, maxSize, className, erro
1907
1907
  "flex flex-col items-center justify-center gap-ds-2 cursor-pointer group",
1908
1908
  "border-2 border-dashed rounded-[var(--ds-radius-md)]",
1909
1909
  "transition-colors",
1910
- error ? "border-[var(--ds-status-error)]" : dragOver ? "border-[var(--ds-accent-primary)] bg-[var(--ds-accent-whisper)]" : "border-[var(--ds-border-default)] hover:border-[var(--ds-accent-primary)] hover:bg-[var(--ds-accent-whisper)]"
1910
+ error ? "border-[var(--ds-status-error)]" : dragOver ? `${ACTIVE_RING} bg-[var(--ds-accent-whisper)]` : "border-[var(--ds-border-default)] hover:border-[var(--ds-accent-primary)] hover:bg-[var(--ds-accent-whisper)]"
1911
1911
  ),
1912
1912
  style: { padding: "var(--ds-space-8) var(--ds-space-4)" },
1913
1913
  children: [
@@ -2190,7 +2190,7 @@ function TimePicker({
2190
2190
  "transition-colors cursor-pointer",
2191
2191
  "px-ds-3 py-ds-2",
2192
2192
  !error && !disabled && !open && "hover:border-[var(--ds-input-border-hover)]",
2193
- open && "border-[var(--ds-accent-primary)] ring-2 ring-[var(--ds-input-focus-ring)]",
2193
+ open && ACTIVE_RING,
2194
2194
  disabled && "opacity-disabled cursor-not-allowed",
2195
2195
  value ? "text-[var(--ds-text-primary)]" : "text-[var(--ds-text-muted)]"
2196
2196
  ),
@@ -2382,7 +2382,8 @@ function NumberInput({
2382
2382
  "bg-[var(--ds-input-bg)]",
2383
2383
  "transition-colors duration-[var(--ds-transition-speed)]",
2384
2384
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
2385
- "focus-within:ring-2 focus-within:ring-[var(--ds-input-focus-ring)] focus-within:border-[var(--ds-input-focus-ring)] focus-within:hover:border-[var(--ds-input-focus-ring)]",
2385
+ FOCUS_WITHIN_RING,
2386
+ "focus-within:hover:border-[var(--ds-border-focus)]",
2386
2387
  disabled && "opacity-disabled cursor-not-allowed",
2387
2388
  className
2388
2389
  ),
@@ -2654,7 +2655,7 @@ function TagInput({
2654
2655
  "shadow-[var(--ds-input-shadow)]",
2655
2656
  "transition-colors duration-[var(--ds-transition-speed)] cursor-text",
2656
2657
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
2657
- "has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-[var(--ds-input-focus-ring)] has-[:focus-visible]:border-[var(--ds-input-focus-ring)]",
2658
+ HAS_FOCUS_RING,
2658
2659
  disabled && "opacity-disabled cursor-not-allowed",
2659
2660
  className
2660
2661
  ),
@@ -2796,7 +2797,7 @@ function PinInput({
2796
2797
  "shadow-[var(--ds-input-shadow)]",
2797
2798
  "transition-colors",
2798
2799
  !error && !disabled && "hover:border-[var(--ds-input-border-hover)]",
2799
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
2800
+ FOCUS_RING,
2800
2801
  "placeholder:text-[var(--ds-text-muted)]",
2801
2802
  sizes3[size],
2802
2803
  disabled && "opacity-disabled cursor-not-allowed"
@@ -3157,7 +3158,7 @@ function ColorPicker({
3157
3158
  "border-[length:var(--ds-border-width)] border-[var(--ds-input-border)]",
3158
3159
  "rounded-[var(--ds-radius-sm)]",
3159
3160
  "hover:border-[var(--ds-input-border-hover)]",
3160
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]"
3161
+ FOCUS_RING
3161
3162
  )
3162
3163
  }
3163
3164
  )
@@ -3175,7 +3176,7 @@ function ColorPicker({
3175
3176
  "border-[length:var(--ds-border-width)]",
3176
3177
  "hover:scale-110 transition-transform",
3177
3178
  "focus-visible:shadow-[var(--ds-shadow-focus)] outline-none",
3178
- swatch.toLowerCase() === value.toLowerCase() ? "border-[var(--ds-accent-primary)] ring-1 ring-[var(--ds-accent-primary)]" : "border-[var(--ds-border-default)]"
3179
+ swatch.toLowerCase() === value.toLowerCase() ? ACTIVE_RING : "border-[var(--ds-border-default)]"
3179
3180
  ),
3180
3181
  style: { backgroundColor: swatch },
3181
3182
  "aria-label": swatch
@@ -3579,13 +3580,30 @@ var sizeStyles3 = {
3579
3580
  md: "h-10 w-10 text-sm",
3580
3581
  lg: "h-12 w-12 text-base"
3581
3582
  };
3583
+ var paletteStyles = {
3584
+ 1: "bg-[var(--ds-palette-1-bg,var(--ds-bg-muted))] text-[var(--ds-palette-1-text,var(--ds-text-secondary))]",
3585
+ 2: "bg-[var(--ds-palette-2-bg,var(--ds-bg-muted))] text-[var(--ds-palette-2-text,var(--ds-text-secondary))]",
3586
+ 3: "bg-[var(--ds-palette-3-bg,var(--ds-bg-muted))] text-[var(--ds-palette-3-text,var(--ds-text-secondary))]",
3587
+ 4: "bg-[var(--ds-palette-4-bg,var(--ds-bg-muted))] text-[var(--ds-palette-4-text,var(--ds-text-secondary))]",
3588
+ 5: "bg-[var(--ds-palette-5-bg,var(--ds-bg-muted))] text-[var(--ds-palette-5-text,var(--ds-text-secondary))]"
3589
+ };
3590
+ function paletteFor(seed) {
3591
+ let h = 0;
3592
+ for (const ch of seed) h = h * 31 + ch.charCodeAt(0) >>> 0;
3593
+ return h % 5 + 1;
3594
+ }
3595
+ function colorStyles(color, seed) {
3596
+ if (color === "accent") return "bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]";
3597
+ if (color === "neutral") return "bg-[var(--ds-bg-muted)] text-[var(--ds-text-secondary)]";
3598
+ return paletteStyles[color === "auto" ? paletteFor(seed) : color];
3599
+ }
3582
3600
  var statusVariantMap = {
3583
3601
  online: "success",
3584
3602
  away: "warning",
3585
3603
  busy: "error",
3586
3604
  offline: "offline"
3587
3605
  };
3588
- function Avatar({ initials, src, alt, size = "md", status, className }) {
3606
+ function Avatar({ initials, src, alt, size = "md", status, color = "auto", className }) {
3589
3607
  const base = cn(
3590
3608
  "inline-flex items-center justify-center font-medium shrink-0",
3591
3609
  "rounded-[var(--ds-radius-full)]",
@@ -3604,7 +3622,7 @@ function Avatar({ initials, src, alt, size = "md", status, className }) {
3604
3622
  {
3605
3623
  className: cn(
3606
3624
  base,
3607
- "bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]",
3625
+ colorStyles(color, alt ?? initials ?? ""),
3608
3626
  "border-[length:var(--ds-border-width)] border-transparent"
3609
3627
  ),
3610
3628
  children: initials
@@ -3766,7 +3784,7 @@ function MentionInput({
3766
3784
  "shadow-[var(--ds-input-shadow)]",
3767
3785
  "placeholder:text-[var(--ds-text-muted)]",
3768
3786
  "hover:border-[var(--ds-input-border-hover)]",
3769
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ds-input-focus-ring)] focus-visible:border-[var(--ds-input-focus-ring)]",
3787
+ FOCUS_RING,
3770
3788
  "disabled:cursor-not-allowed disabled:opacity-disabled disabled:hover:border-[var(--ds-input-border)]",
3771
3789
  "transition-colors duration-[var(--ds-transition-speed)]"
3772
3790
  )
@@ -3990,8 +4008,8 @@ var Card = forwardRef(function Card2({
3990
4008
  isSelectable && !disabled && "cursor-pointer select-none transition-all duration-[var(--ds-transition-speed)] ease-[var(--ds-transition-ease)]",
3991
4009
  isSelectable && !disabled && !selected && "hover:border-[var(--ds-accent-primary)]",
3992
4010
  isSelectable && "focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]",
3993
- showRing && "border-[var(--ds-accent-primary)] ring-1 ring-[var(--ds-accent-primary)]",
3994
- hasSelectType && selected && "border-[var(--ds-accent-primary)] bg-[var(--ds-accent-subtle)]",
4011
+ (showRing || hasSelectType && selected) && ACTIVE_RING,
4012
+ hasSelectType && selected && "bg-[var(--ds-accent-subtle)]",
3995
4013
  disabled && "opacity-disabled cursor-not-allowed",
3996
4014
  className
3997
4015
  ),
@@ -4536,7 +4554,7 @@ function Table({
4536
4554
  "border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]",
4537
4555
  "rounded-[var(--ds-radius-md)] bg-[var(--ds-bg-surface)]",
4538
4556
  "p-ds-4 space-y-ds-2",
4539
- isSelected && "ring-1 ring-[var(--ds-accent-primary)]",
4557
+ isSelected && ACTIVE_RING,
4540
4558
  onRowClick && "cursor-pointer hover:bg-[var(--ds-bg-muted)] focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]"
4541
4559
  ),
4542
4560
  onClick: onRowClick ? () => onRowClick(row, originalIdx) : void 0,
@@ -6343,6 +6361,7 @@ function AvatarGroup({ items, max = 4, size = "sm", ring = "canvas", onOverflowC
6343
6361
  initials,
6344
6362
  size,
6345
6363
  status: item.status,
6364
+ color: item.color,
6346
6365
  className: ringClass
6347
6366
  },
6348
6367
  i
@@ -7109,7 +7128,7 @@ function ChatInputBar({ onSend }) {
7109
7128
  "border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]",
7110
7129
  "bg-[var(--ds-input-bg)]",
7111
7130
  "shadow-[var(--ds-input-shadow)]",
7112
- "focus-within:ring-2 focus-within:ring-[var(--ds-input-focus-ring)] focus-within:border-[var(--ds-input-focus-ring)]",
7131
+ FOCUS_WITHIN_RING,
7113
7132
  "transition-colors duration-[var(--ds-transition-speed)]"
7114
7133
  ),
7115
7134
  children: [
@@ -7560,9 +7579,23 @@ function TabsRoot(props) {
7560
7579
  overflow = "scroll",
7561
7580
  className
7562
7581
  } = props;
7582
+ const isMobile = useBreakpoint("md");
7583
+ const effectiveOrientation = orientation === "responsive" ? "vertical" : orientation;
7563
7584
  if ("tabs" in props && props.tabs) {
7564
- const { tabs } = props;
7565
- if (orientation === "vertical") {
7585
+ const { tabs, mobile = "scroll" } = props;
7586
+ const collapseToDropdown = isMobile && (orientation === "responsive" || mobile === "dropdown");
7587
+ if (collapseToDropdown) {
7588
+ return /* @__PURE__ */ jsx(
7589
+ Dropdown,
7590
+ {
7591
+ options: tabs.filter((t) => !t.disabled).map((t) => ({ id: t.id, label: t.label, group: t.group })),
7592
+ value: activeTab,
7593
+ onChange: (v) => onTabChange(v),
7594
+ className
7595
+ }
7596
+ );
7597
+ }
7598
+ if (effectiveOrientation === "vertical") {
7566
7599
  return /* @__PURE__ */ jsx(
7567
7600
  "div",
7568
7601
  {
@@ -7573,7 +7606,20 @@ function TabsRoot(props) {
7573
7606
  variant === "underline" && "border-r-[length:var(--ds-border-width)] border-[var(--ds-border-default)] pr-ds-1",
7574
7607
  className
7575
7608
  ),
7576
- children: tabs.map((tab) => /* @__PURE__ */ jsx(TabButton, { hasPanel: false, ...tab, orientation, variant, activeTab, onTabChange, fullWidth, onKeyDown: (e) => handleTabKeyDown(e, tab.id, () => tabs, orientation, onTabChange) }, tab.id))
7609
+ children: tabs.map((tab, i) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
7610
+ tab.group && tab.group !== tabs[i - 1]?.group && /* @__PURE__ */ jsx(
7611
+ "span",
7612
+ {
7613
+ "aria-hidden": "true",
7614
+ className: cn(
7615
+ "px-ds-3 pb-ds-1 text-xs font-semibold uppercase tracking-wider text-[var(--ds-text-muted)]",
7616
+ i > 0 && "mt-ds-3"
7617
+ ),
7618
+ children: tab.group
7619
+ }
7620
+ ),
7621
+ /* @__PURE__ */ jsx(TabButton, { hasPanel: false, ...tab, orientation: effectiveOrientation, variant, activeTab, onTabChange, fullWidth, onKeyDown: (e) => handleTabKeyDown(e, tab.id, () => tabs, effectiveOrientation, onTabChange) })
7622
+ ] }, tab.id))
7577
7623
  }
7578
7624
  );
7579
7625
  }
@@ -7590,11 +7636,11 @@ function TabsRoot(props) {
7590
7636
  fullWidth && "w-full",
7591
7637
  className
7592
7638
  ),
7593
- children: tabs.map((tab) => /* @__PURE__ */ jsx(TabButton, { hasPanel: false, ...tab, orientation, variant, activeTab, onTabChange, fullWidth, onKeyDown: (e) => handleTabKeyDown(e, tab.id, () => tabs, orientation, onTabChange) }, tab.id))
7639
+ children: tabs.map((tab) => /* @__PURE__ */ jsx(TabButton, { hasPanel: false, ...tab, orientation: effectiveOrientation, variant, activeTab, onTabChange, fullWidth, onKeyDown: (e) => handleTabKeyDown(e, tab.id, () => tabs, effectiveOrientation, onTabChange) }, tab.id))
7594
7640
  }
7595
7641
  );
7596
7642
  }
7597
- return /* @__PURE__ */ jsx(TabsContext.Provider, { value: { activeTab, onTabChange, orientation, variant, fullWidth, overflow }, children: /* @__PURE__ */ jsx("div", { className, children: props.children }) });
7643
+ return /* @__PURE__ */ jsx(TabsContext.Provider, { value: { activeTab, onTabChange, orientation: effectiveOrientation, variant, fullWidth, overflow }, children: /* @__PURE__ */ jsx("div", { className, children: props.children }) });
7598
7644
  }
7599
7645
  var Tabs = Object.assign(TabsRoot, {
7600
7646
  List: TabsList,
@@ -8103,9 +8149,9 @@ function StepCircle({ status, index, onClick, clickable }) {
8103
8149
  clickable && "cursor-pointer",
8104
8150
  !clickable && "cursor-default",
8105
8151
  status === "complete" && "bg-[var(--ds-accent-primary)] [background-image:var(--ds-gradient)] text-[var(--ds-text-on-primary)]",
8106
- status === "current" && "border-2 border-[var(--ds-accent-primary)] text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)]",
8152
+ status === "current" && `border-2 ${ACTIVE_RING} text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)]`,
8107
8153
  status === "error" && "bg-[var(--ds-status-error)] text-[var(--ds-text-on-primary)]",
8108
- status === "loading" && "border-2 border-[var(--ds-accent-primary)] text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)] animate-pulse",
8154
+ status === "loading" && `border-2 ${ACTIVE_RING} text-[var(--ds-accent-primary)] bg-[var(--ds-bg-surface)] animate-pulse`,
8109
8155
  status === "upcoming" && "border-[length:var(--ds-border-width)] border-[var(--ds-border-default)] text-[var(--ds-text-muted)] bg-[var(--ds-bg-surface)]"
8110
8156
  ),
8111
8157
  children: status === "complete" ? /* @__PURE__ */ jsx(Icon, { name: "check", size: 14 }) : status === "error" ? /* @__PURE__ */ jsx(Icon, { name: "warning", size: 14 }) : index + 1