@almadar/ui 5.129.0 → 5.131.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.
@@ -5126,7 +5126,7 @@ var init_Button = __esm({
5126
5126
  "cursor-pointer",
5127
5127
  "chrome-button",
5128
5128
  "transition-all duration-normal",
5129
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-offset-[length:var(--focus-ring-offset)]",
5129
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-offset-[length:var(--focus-ring-offset)]",
5130
5130
  "disabled:opacity-50 disabled:cursor-not-allowed",
5131
5131
  variantStyles2[variant],
5132
5132
  sizeStyles[size],
@@ -5749,7 +5749,7 @@ var init_Badge = __esm({
5749
5749
  },
5750
5750
  className: cn(
5751
5751
  "inline-flex items-center justify-center rounded-sm",
5752
- "hover:bg-foreground/10 focus:outline-none focus:ring-1 focus:ring-ring",
5752
+ "hover:bg-foreground/10 focus:outline-none focus-visible:ring-1 focus-visible:ring-ring",
5753
5753
  "transition-colors",
5754
5754
  size === "sm" ? "w-4 h-4 ml-0.5" : size === "md" ? "w-5 h-5 ml-1" : "w-6 h-6 ml-1"
5755
5755
  ),
@@ -7107,7 +7107,7 @@ function NativeSelect({
7107
7107
  "block w-full border-[length:var(--border-width)] shadow-sm appearance-none",
7108
7108
  "px-3 py-2 pr-10 text-sm text-foreground font-medium",
7109
7109
  "bg-card",
7110
- "focus:outline-none focus:ring-2 focus:ring-offset-0 focus:ring-ring",
7110
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-ring",
7111
7111
  "disabled:bg-muted disabled:text-muted-foreground disabled:cursor-not-allowed",
7112
7112
  error ? "border-error focus:border-error" : "border-border focus:border-primary",
7113
7113
  className
@@ -7214,7 +7214,7 @@ function RichSelect({
7214
7214
  "block w-full border-[length:var(--border-width)] shadow-sm",
7215
7215
  "px-3 py-2 pr-10 text-sm text-start font-medium",
7216
7216
  "bg-card rounded-sm",
7217
- "focus:outline-none focus:ring-2 focus:ring-offset-0 focus:ring-ring",
7217
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-ring",
7218
7218
  "disabled:bg-muted disabled:text-muted-foreground disabled:cursor-not-allowed",
7219
7219
  error ? "border-error focus:border-error" : "border-border focus:border-primary",
7220
7220
  !hasValue && "text-muted-foreground"
@@ -8137,9 +8137,9 @@ var init_Radio = __esm({
8137
8137
  "flex items-center justify-center",
8138
8138
  "border-[length:var(--border-width)] transition-all cursor-pointer",
8139
8139
  sizeClasses4[size],
8140
- hasError ? "border-error peer-focus:ring-error/20" : "border-border peer-focus:ring-ring/20",
8140
+ hasError ? "border-error peer-focus-visible:ring-error/20" : "border-border peer-focus-visible:ring-ring/20",
8141
8141
  isChecked2 ? hasError ? "border-error" : "border-primary bg-primary" : "",
8142
- "peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2",
8142
+ "peer-focus:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2",
8143
8143
  disabled && "opacity-50 cursor-not-allowed",
8144
8144
  !disabled && "hover:border-[var(--color-border-hover)]"
8145
8145
  ),
@@ -8525,7 +8525,7 @@ var init_ThemeToggle = __esm({
8525
8525
  "inline-flex items-center justify-center gap-2",
8526
8526
  "text-foreground",
8527
8527
  "hover:bg-muted border-[length:var(--border-width)] border-transparent hover:border-border",
8528
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
8528
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
8529
8529
  "transition-colors duration-fast",
8530
8530
  sizeClasses5[size],
8531
8531
  className
@@ -14912,10 +14912,12 @@ var init_Container = __esm({
14912
14912
  };
14913
14913
  paddingStyles3 = {
14914
14914
  none: "px-0",
14915
- sm: "px-4",
14916
- md: "px-6",
14917
- lg: "px-8",
14918
- xl: "px-12"
14915
+ // Mobile-tighter, desktop-identical: fixed px-6 on a 360px phone eats ~13% of
14916
+ // the viewport, so each token steps down below the sm breakpoint.
14917
+ sm: "px-3 sm:px-4",
14918
+ md: "px-4 sm:px-6",
14919
+ lg: "px-4 sm:px-6 md:px-8",
14920
+ xl: "px-4 sm:px-8 md:px-12"
14919
14921
  };
14920
14922
  Container = ({
14921
14923
  size,
@@ -15614,7 +15616,7 @@ var init_Accordion = __esm({
15614
15616
  "bg-card",
15615
15617
  "hover:bg-muted",
15616
15618
  "transition-colors duration-fast",
15617
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-inset",
15619
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",
15618
15620
  "disabled:opacity-50 disabled:cursor-not-allowed",
15619
15621
  isOpen && "bg-muted font-bold"
15620
15622
  ),
@@ -20992,7 +20994,7 @@ var init_Breadcrumb = __esm({
20992
20994
  },
20993
20995
  className: cn(
20994
20996
  "flex items-center gap-1.5 transition-colors",
20995
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
20997
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
20996
20998
  isLast ? "text-foreground font-bold cursor-default" : "text-muted-foreground hover:text-foreground"
20997
20999
  ),
20998
21000
  "aria-current": isLast ? "page" : void 0,
@@ -25627,7 +25629,7 @@ function DataGrid({
25627
25629
  ] }, field.name);
25628
25630
  }) })
25629
25631
  ] }),
25630
- dangerActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "xs", className: "flex-shrink-0", children: dangerActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
25632
+ dangerActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "xs", className: "flex-shrink-0", children: dangerActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
25631
25633
  Button,
25632
25634
  {
25633
25635
  variant: "ghost",
@@ -25635,11 +25637,10 @@ function DataGrid({
25635
25637
  onClick: handleActionClick(action, itemData),
25636
25638
  "data-testid": `action-${action.event}`,
25637
25639
  "data-row-id": String(itemData.id),
25640
+ "aria-label": action.label,
25641
+ title: action.label,
25638
25642
  className: "text-error hover:text-error hover:bg-error/10 px-2",
25639
- children: [
25640
- action.icon && renderIconInput(action.icon, { size: "xs" }),
25641
- action.label
25642
- ]
25643
+ children: action.icon ? renderIconInput(action.icon, { size: "xs" }) : action.label
25643
25644
  },
25644
25645
  idx
25645
25646
  )) })
@@ -26441,10 +26442,7 @@ var init_FileTree = __esm({
26441
26442
  className,
26442
26443
  indent = 16
26443
26444
  }) => {
26444
- const { t } = hooks.useTranslate();
26445
- if (tree.length === 0) {
26446
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
26447
- }
26445
+ if (tree.length === 0) return null;
26448
26446
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
26449
26447
  TreeNodeItem,
26450
26448
  {
@@ -26549,7 +26547,7 @@ var init_useQuerySingleton = __esm({
26549
26547
  queryStores = /* @__PURE__ */ new Map();
26550
26548
  }
26551
26549
  });
26552
- var resolveFilterType, lookStyles6, FilterGroup;
26550
+ var resolveFilterType, lookStyles6, FilterGroupControls, FilterGroupPopover, FilterGroup;
26553
26551
  var init_FilterGroup = __esm({
26554
26552
  "components/core/molecules/FilterGroup.tsx"() {
26555
26553
  "use client";
@@ -26567,10 +26565,10 @@ var init_FilterGroup = __esm({
26567
26565
  toolbar: "",
26568
26566
  chips: "gap-1 [&_input]:rounded-pill [&_select]:rounded-pill [&_button]:rounded-pill [&_input]:!px-3 [&_select]:!px-3 [&_input]:bg-muted [&_select]:bg-muted [&_label]:hidden",
26569
26567
  pills: "gap-2 [&_input]:rounded-pill [&_select]:rounded-pill [&_button]:rounded-pill",
26570
- "popover-trigger": "[&>*:not(:first-child)]:hidden",
26568
+ "popover-trigger": "",
26571
26569
  "inline-column-header": "hidden"
26572
26570
  };
26573
- FilterGroup = ({
26571
+ FilterGroupControls = ({
26574
26572
  entity,
26575
26573
  filters,
26576
26574
  onFilterChange,
@@ -26906,7 +26904,7 @@ var init_FilterGroup = __esm({
26906
26904
  className: "text-muted-foreground",
26907
26905
  children: [
26908
26906
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
26909
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
26907
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
26910
26908
  ]
26911
26909
  }
26912
26910
  ),
@@ -26997,6 +26995,42 @@ var init_FilterGroup = __esm({
26997
26995
  }
26998
26996
  );
26999
26997
  };
26998
+ FilterGroupControls.displayName = "FilterGroupControls";
26999
+ FilterGroupPopover = (props) => {
27000
+ const { t } = hooks.useTranslate();
27001
+ const [open, setOpen] = React91.useState(false);
27002
+ const queryState = useQuerySingleton(props.query);
27003
+ const activeFilterCount = queryState?.filters ? Object.values(queryState.filters).filter((v) => v !== null && v !== void 0).length : 0;
27004
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative inline-block", props.className), children: [
27005
+ /* @__PURE__ */ jsxRuntime.jsx(
27006
+ Button,
27007
+ {
27008
+ variant: activeFilterCount > 0 ? "secondary" : "ghost",
27009
+ size: "sm",
27010
+ leftIcon: "filter",
27011
+ onClick: () => setOpen((o) => !o),
27012
+ "aria-expanded": open,
27013
+ "aria-haspopup": "true",
27014
+ children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
27015
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("filterGroup.filters") }),
27016
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: activeFilterCount })
27017
+ ] })
27018
+ }
27019
+ ),
27020
+ open && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-0 z-50 mt-2 min-w-[16rem] rounded-lg border border-[var(--color-border)] bg-[var(--color-card)] p-card-md shadow-main", children: /* @__PURE__ */ jsxRuntime.jsx(
27021
+ FilterGroupControls,
27022
+ {
27023
+ ...props,
27024
+ className: void 0,
27025
+ look: "toolbar",
27026
+ variant: "vertical",
27027
+ showIcon: false
27028
+ }
27029
+ ) })
27030
+ ] });
27031
+ };
27032
+ FilterGroupPopover.displayName = "FilterGroupPopover";
27033
+ FilterGroup = (props) => props.look === "popover-trigger" ? /* @__PURE__ */ jsxRuntime.jsx(FilterGroupPopover, { ...props }) : /* @__PURE__ */ jsxRuntime.jsx(FilterGroupControls, { ...props });
27000
27034
  FilterGroup.displayName = "FilterGroup";
27001
27035
  }
27002
27036
  });
@@ -29911,7 +29945,7 @@ var init_NumberStepper = __esm({
29911
29945
  "active:bg-muted",
29912
29946
  "transition-colors duration-instant",
29913
29947
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
29914
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
29948
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
29915
29949
  styles.button
29916
29950
  ),
29917
29951
  "aria-label": t("aria.decrease"),
@@ -29952,7 +29986,7 @@ var init_NumberStepper = __esm({
29952
29986
  "active:bg-muted",
29953
29987
  "transition-colors duration-instant",
29954
29988
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
29955
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
29989
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
29956
29990
  styles.button
29957
29991
  ),
29958
29992
  "aria-label": t("aria.increase"),
@@ -30408,7 +30442,7 @@ var init_Lightbox = __esm({
30408
30442
  "p-2 rounded-full",
30409
30443
  "text-[var(--color-foreground)] bg-[var(--color-card)]",
30410
30444
  "hover:bg-opacity-70 transition-opacity",
30411
- "focus:outline-none focus:ring-2 focus:ring-ring"
30445
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
30412
30446
  ),
30413
30447
  "aria-label": t("aria.closeModal"),
30414
30448
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "w-6 h-6" })
@@ -30427,7 +30461,7 @@ var init_Lightbox = __esm({
30427
30461
  "p-2 rounded-full",
30428
30462
  "text-[var(--color-foreground)] bg-[var(--color-card)]",
30429
30463
  "hover:bg-opacity-70 transition-opacity",
30430
- "focus:outline-none focus:ring-2 focus:ring-ring"
30464
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
30431
30465
  ),
30432
30466
  "aria-label": t("aria.previousImage"),
30433
30467
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-left", className: "w-8 h-8" })
@@ -30464,7 +30498,7 @@ var init_Lightbox = __esm({
30464
30498
  "p-2 rounded-full",
30465
30499
  "text-[var(--color-foreground)] bg-[var(--color-card)]",
30466
30500
  "hover:bg-opacity-70 transition-opacity",
30467
- "focus:outline-none focus:ring-2 focus:ring-ring"
30501
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
30468
30502
  ),
30469
30503
  "aria-label": t("aria.nextImage"),
30470
30504
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-right", className: "w-8 h-8" })
@@ -30638,9 +30672,20 @@ function TableView({
30638
30672
  const inlineActionCount = hasActions ? maxInlineActions != null ? Math.min(itemActions.length, maxInlineActions) : itemActions.length : 0;
30639
30673
  const hasOverflowActions = hasActions && maxInlineActions != null && itemActions.length > maxInlineActions;
30640
30674
  const actionsTrack = hasActions ? `${inlineActionCount * 6 + (hasOverflowActions ? 3 : 0)}rem` : null;
30675
+ const colFloors = React91__namespace.default.useMemo(
30676
+ () => colDefs.map((col) => {
30677
+ const longest = data.reduce((widest, row) => {
30678
+ const cell = formatCell(asFieldValue(getNestedValue(row, col.field ?? col.key)), col.format);
30679
+ return Math.max(widest, cell.length);
30680
+ }, columnLabel(col).length);
30681
+ const chrome = col.format === "badge" ? BADGE_CHROME_CH : 0;
30682
+ return Math.min(longest + chrome, MAX_MEASURED_COL_CH);
30683
+ }),
30684
+ [colDefs, data]
30685
+ );
30641
30686
  const gridTemplateColumns = [
30642
30687
  selectable ? "auto" : null,
30643
- ...colDefs.map((c) => c.width ?? "minmax(0, 1fr)"),
30688
+ ...colDefs.map((c, i) => c.width ?? `minmax(${colFloors[i]}ch, 1fr)`),
30644
30689
  actionsTrack
30645
30690
  ].filter(Boolean).join(" ");
30646
30691
  const header = /* @__PURE__ */ jsxRuntime.jsxs(
@@ -30724,7 +30769,7 @@ function TableView({
30724
30769
  col.className
30725
30770
  );
30726
30771
  if (col.format === "badge" && raw != null && raw !== "") {
30727
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: statusVariant4(String(raw)), size: "sm", children: String(raw) }) }, col.key);
30772
+ return /* @__PURE__ */ jsxRuntime.jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: statusVariant4(String(raw)), size: "sm", className: "whitespace-nowrap", children: String(raw) }) }, col.key);
30728
30773
  }
30729
30774
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: formatCell(raw, col.format) }) }, col.key);
30730
30775
  }),
@@ -30807,7 +30852,7 @@ function TableView({
30807
30852
  }
30808
30853
  );
30809
30854
  }
30810
- var alignClass, weightClass, LOOKS;
30855
+ var MAX_MEASURED_COL_CH, BADGE_CHROME_CH, alignClass, weightClass, LOOKS;
30811
30856
  var init_TableView = __esm({
30812
30857
  "components/core/molecules/TableView.tsx"() {
30813
30858
  "use client";
@@ -30825,6 +30870,8 @@ var init_TableView = __esm({
30825
30870
  init_Menu();
30826
30871
  init_useDataDnd();
30827
30872
  logger.createLogger("almadar:ui:table-view");
30873
+ MAX_MEASURED_COL_CH = 32;
30874
+ BADGE_CHROME_CH = 4;
30828
30875
  alignClass = {
30829
30876
  left: "justify-start text-left",
30830
30877
  center: "justify-center text-center",
@@ -33060,7 +33107,7 @@ var init_VoteStack = __esm({
33060
33107
  "active:bg-muted",
33061
33108
  "transition-colors duration-instant",
33062
33109
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
33063
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
33110
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
33064
33111
  styles.button
33065
33112
  ),
33066
33113
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-up", className: styles.icon })
@@ -33097,7 +33144,7 @@ var init_VoteStack = __esm({
33097
33144
  "active:bg-muted",
33098
33145
  "transition-colors duration-instant",
33099
33146
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
33100
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
33147
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
33101
33148
  styles.button
33102
33149
  ),
33103
33150
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-down", className: styles.icon })
@@ -33618,7 +33665,7 @@ var init_QrScanner = __esm({
33618
33665
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
33619
33666
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
33620
33667
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
33621
- "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
33668
+ "hover:bg-opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
33622
33669
  ),
33623
33670
  "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
33624
33671
  children: isPaused ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "pause", className: "h-4 w-4" })
@@ -33633,7 +33680,7 @@ var init_QrScanner = __esm({
33633
33680
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
33634
33681
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
33635
33682
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
33636
- "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
33683
+ "hover:bg-opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
33637
33684
  ),
33638
33685
  "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
33639
33686
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
@@ -33648,7 +33695,7 @@ var init_QrScanner = __esm({
33648
33695
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
33649
33696
  "rounded-full bg-black bg-opacity-60 px-3 py-2 text-xs text-white",
33650
33697
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
33651
- "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
33698
+ "hover:bg-opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
33652
33699
  ),
33653
33700
  "aria-label": t("aria.mockScanDev"),
33654
33701
  children: t("qrScanner.mockScan")
@@ -45076,7 +45123,7 @@ var init_TabbedContainer = __esm({
45076
45123
  onClick: () => !isDisabled && handleTabChange(tab.id),
45077
45124
  className: cn(
45078
45125
  "flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors",
45079
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
45126
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
45080
45127
  "disabled:opacity-50 disabled:cursor-not-allowed",
45081
45128
  isActive ? "bg-primary text-primary-foreground" : "bg-card text-foreground hover:bg-muted",
45082
45129
  isVertical ? "justify-start" : "justify-center"