@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.
@@ -1651,7 +1651,7 @@ var init_Button = __esm({
1651
1651
  "cursor-pointer",
1652
1652
  "chrome-button",
1653
1653
  "transition-all duration-normal",
1654
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-offset-[length:var(--focus-ring-offset)]",
1654
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-offset-[length:var(--focus-ring-offset)]",
1655
1655
  "disabled:opacity-50 disabled:cursor-not-allowed",
1656
1656
  variantStyles[variant],
1657
1657
  sizeStyles[size],
@@ -2398,7 +2398,7 @@ var init_Badge = __esm({
2398
2398
  },
2399
2399
  className: cn(
2400
2400
  "inline-flex items-center justify-center rounded-sm",
2401
- "hover:bg-foreground/10 focus:outline-none focus:ring-1 focus:ring-ring",
2401
+ "hover:bg-foreground/10 focus:outline-none focus-visible:ring-1 focus-visible:ring-ring",
2402
2402
  "transition-colors",
2403
2403
  size === "sm" ? "w-4 h-4 ml-0.5" : size === "md" ? "w-5 h-5 ml-1" : "w-6 h-6 ml-1"
2404
2404
  ),
@@ -3756,7 +3756,7 @@ function NativeSelect({
3756
3756
  "block w-full border-[length:var(--border-width)] shadow-sm appearance-none",
3757
3757
  "px-3 py-2 pr-10 text-sm text-foreground font-medium",
3758
3758
  "bg-card",
3759
- "focus:outline-none focus:ring-2 focus:ring-offset-0 focus:ring-ring",
3759
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-ring",
3760
3760
  "disabled:bg-muted disabled:text-muted-foreground disabled:cursor-not-allowed",
3761
3761
  error ? "border-error focus:border-error" : "border-border focus:border-primary",
3762
3762
  className
@@ -3863,7 +3863,7 @@ function RichSelect({
3863
3863
  "block w-full border-[length:var(--border-width)] shadow-sm",
3864
3864
  "px-3 py-2 pr-10 text-sm text-start font-medium",
3865
3865
  "bg-card rounded-sm",
3866
- "focus:outline-none focus:ring-2 focus:ring-offset-0 focus:ring-ring",
3866
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-ring",
3867
3867
  "disabled:bg-muted disabled:text-muted-foreground disabled:cursor-not-allowed",
3868
3868
  error ? "border-error focus:border-error" : "border-border focus:border-primary",
3869
3869
  !hasValue && "text-muted-foreground"
@@ -4786,9 +4786,9 @@ var init_Radio = __esm({
4786
4786
  "flex items-center justify-center",
4787
4787
  "border-[length:var(--border-width)] transition-all cursor-pointer",
4788
4788
  sizeClasses4[size],
4789
- hasError ? "border-error peer-focus:ring-error/20" : "border-border peer-focus:ring-ring/20",
4789
+ hasError ? "border-error peer-focus-visible:ring-error/20" : "border-border peer-focus-visible:ring-ring/20",
4790
4790
  isChecked2 ? hasError ? "border-error" : "border-primary bg-primary" : "",
4791
- "peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2",
4791
+ "peer-focus:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2",
4792
4792
  disabled && "opacity-50 cursor-not-allowed",
4793
4793
  !disabled && "hover:border-[var(--color-border-hover)]"
4794
4794
  ),
@@ -5259,7 +5259,7 @@ var init_ThemeToggle = __esm({
5259
5259
  "inline-flex items-center justify-center gap-2",
5260
5260
  "text-foreground",
5261
5261
  "hover:bg-muted border-[length:var(--border-width)] border-transparent hover:border-border",
5262
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
5262
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
5263
5263
  "transition-colors duration-fast",
5264
5264
  sizeClasses5[size],
5265
5265
  className
@@ -11504,10 +11504,12 @@ var init_Container = __esm({
11504
11504
  };
11505
11505
  paddingStyles3 = {
11506
11506
  none: "px-0",
11507
- sm: "px-4",
11508
- md: "px-6",
11509
- lg: "px-8",
11510
- xl: "px-12"
11507
+ // Mobile-tighter, desktop-identical: fixed px-6 on a 360px phone eats ~13% of
11508
+ // the viewport, so each token steps down below the sm breakpoint.
11509
+ sm: "px-3 sm:px-4",
11510
+ md: "px-4 sm:px-6",
11511
+ lg: "px-4 sm:px-6 md:px-8",
11512
+ xl: "px-4 sm:px-8 md:px-12"
11511
11513
  };
11512
11514
  Container = ({
11513
11515
  size,
@@ -12206,7 +12208,7 @@ var init_Accordion = __esm({
12206
12208
  "bg-card",
12207
12209
  "hover:bg-muted",
12208
12210
  "transition-colors duration-fast",
12209
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-inset",
12211
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",
12210
12212
  "disabled:opacity-50 disabled:cursor-not-allowed",
12211
12213
  isOpen && "bg-muted font-bold"
12212
12214
  ),
@@ -18361,7 +18363,7 @@ var init_Breadcrumb = __esm({
18361
18363
  },
18362
18364
  className: cn(
18363
18365
  "flex items-center gap-1.5 transition-colors",
18364
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
18366
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
18365
18367
  isLast ? "text-foreground font-bold cursor-default" : "text-muted-foreground hover:text-foreground"
18366
18368
  ),
18367
18369
  "aria-current": isLast ? "page" : void 0,
@@ -22915,7 +22917,7 @@ function DataGrid({
22915
22917
  ] }, field.name);
22916
22918
  }) })
22917
22919
  ] }),
22918
- dangerActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "xs", className: "flex-shrink-0", children: dangerActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
22920
+ dangerActions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "xs", className: "flex-shrink-0", children: dangerActions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
22919
22921
  Button,
22920
22922
  {
22921
22923
  variant: "ghost",
@@ -22923,11 +22925,10 @@ function DataGrid({
22923
22925
  onClick: handleActionClick(action, itemData),
22924
22926
  "data-testid": `action-${action.event}`,
22925
22927
  "data-row-id": String(itemData.id),
22928
+ "aria-label": action.label,
22929
+ title: action.label,
22926
22930
  className: "text-error hover:text-error hover:bg-error/10 px-2",
22927
- children: [
22928
- action.icon && renderIconInput(action.icon, { size: "xs" }),
22929
- action.label
22930
- ]
22931
+ children: action.icon ? renderIconInput(action.icon, { size: "xs" }) : action.label
22931
22932
  },
22932
22933
  idx
22933
22934
  )) })
@@ -23729,10 +23730,7 @@ var init_FileTree = __esm({
23729
23730
  className,
23730
23731
  indent = 16
23731
23732
  }) => {
23732
- const { t } = hooks.useTranslate();
23733
- if (tree.length === 0) {
23734
- return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `p-4 ${className ?? ""}`, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: t("fileTree.noFiles") }) });
23735
- }
23733
+ if (tree.length === 0) return null;
23736
23734
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
23737
23735
  TreeNodeItem,
23738
23736
  {
@@ -23773,7 +23771,7 @@ var init_FormField = __esm({
23773
23771
  FormField.displayName = "FormField";
23774
23772
  }
23775
23773
  });
23776
- var resolveFilterType, lookStyles6, FilterGroup;
23774
+ var resolveFilterType, lookStyles6, FilterGroupControls, FilterGroupPopover, FilterGroup;
23777
23775
  var init_FilterGroup = __esm({
23778
23776
  "components/core/molecules/FilterGroup.tsx"() {
23779
23777
  "use client";
@@ -23791,10 +23789,10 @@ var init_FilterGroup = __esm({
23791
23789
  toolbar: "",
23792
23790
  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",
23793
23791
  pills: "gap-2 [&_input]:rounded-pill [&_select]:rounded-pill [&_button]:rounded-pill",
23794
- "popover-trigger": "[&>*:not(:first-child)]:hidden",
23792
+ "popover-trigger": "",
23795
23793
  "inline-column-header": "hidden"
23796
23794
  };
23797
- FilterGroup = ({
23795
+ FilterGroupControls = ({
23798
23796
  entity,
23799
23797
  filters,
23800
23798
  onFilterChange,
@@ -24130,7 +24128,7 @@ var init_FilterGroup = __esm({
24130
24128
  className: "text-muted-foreground",
24131
24129
  children: [
24132
24130
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "filter", className: "h-4 w-4" }),
24133
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24131
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-bold uppercase tracking-wide", children: t("filterGroup.filters") })
24134
24132
  ]
24135
24133
  }
24136
24134
  ),
@@ -24221,6 +24219,42 @@ var init_FilterGroup = __esm({
24221
24219
  }
24222
24220
  );
24223
24221
  };
24222
+ FilterGroupControls.displayName = "FilterGroupControls";
24223
+ FilterGroupPopover = (props) => {
24224
+ const { t } = hooks.useTranslate();
24225
+ const [open, setOpen] = React82.useState(false);
24226
+ const queryState = useQuerySingleton(props.query);
24227
+ const activeFilterCount = queryState?.filters ? Object.values(queryState.filters).filter((v) => v !== null && v !== void 0).length : 0;
24228
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative inline-block", props.className), children: [
24229
+ /* @__PURE__ */ jsxRuntime.jsx(
24230
+ Button,
24231
+ {
24232
+ variant: activeFilterCount > 0 ? "secondary" : "ghost",
24233
+ size: "sm",
24234
+ leftIcon: "filter",
24235
+ onClick: () => setOpen((o) => !o),
24236
+ "aria-expanded": open,
24237
+ "aria-haspopup": "true",
24238
+ children: /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
24239
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("filterGroup.filters") }),
24240
+ activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "primary", size: "sm", children: activeFilterCount })
24241
+ ] })
24242
+ }
24243
+ ),
24244
+ 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(
24245
+ FilterGroupControls,
24246
+ {
24247
+ ...props,
24248
+ className: void 0,
24249
+ look: "toolbar",
24250
+ variant: "vertical",
24251
+ showIcon: false
24252
+ }
24253
+ ) })
24254
+ ] });
24255
+ };
24256
+ FilterGroupPopover.displayName = "FilterGroupPopover";
24257
+ FilterGroup = (props) => props.look === "popover-trigger" ? /* @__PURE__ */ jsxRuntime.jsx(FilterGroupPopover, { ...props }) : /* @__PURE__ */ jsxRuntime.jsx(FilterGroupControls, { ...props });
24224
24258
  FilterGroup.displayName = "FilterGroup";
24225
24259
  }
24226
24260
  });
@@ -27135,7 +27169,7 @@ var init_NumberStepper = __esm({
27135
27169
  "active:bg-muted",
27136
27170
  "transition-colors duration-instant",
27137
27171
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
27138
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
27172
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
27139
27173
  styles.button
27140
27174
  ),
27141
27175
  "aria-label": t("aria.decrease"),
@@ -27176,7 +27210,7 @@ var init_NumberStepper = __esm({
27176
27210
  "active:bg-muted",
27177
27211
  "transition-colors duration-instant",
27178
27212
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
27179
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
27213
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
27180
27214
  styles.button
27181
27215
  ),
27182
27216
  "aria-label": t("aria.increase"),
@@ -27632,7 +27666,7 @@ var init_Lightbox = __esm({
27632
27666
  "p-2 rounded-full",
27633
27667
  "text-[var(--color-foreground)] bg-[var(--color-card)]",
27634
27668
  "hover:bg-opacity-70 transition-opacity",
27635
- "focus:outline-none focus:ring-2 focus:ring-ring"
27669
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
27636
27670
  ),
27637
27671
  "aria-label": t("aria.closeModal"),
27638
27672
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "x", className: "w-6 h-6" })
@@ -27651,7 +27685,7 @@ var init_Lightbox = __esm({
27651
27685
  "p-2 rounded-full",
27652
27686
  "text-[var(--color-foreground)] bg-[var(--color-card)]",
27653
27687
  "hover:bg-opacity-70 transition-opacity",
27654
- "focus:outline-none focus:ring-2 focus:ring-ring"
27688
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
27655
27689
  ),
27656
27690
  "aria-label": t("aria.previousImage"),
27657
27691
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-left", className: "w-8 h-8" })
@@ -27688,7 +27722,7 @@ var init_Lightbox = __esm({
27688
27722
  "p-2 rounded-full",
27689
27723
  "text-[var(--color-foreground)] bg-[var(--color-card)]",
27690
27724
  "hover:bg-opacity-70 transition-opacity",
27691
- "focus:outline-none focus:ring-2 focus:ring-ring"
27725
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring"
27692
27726
  ),
27693
27727
  "aria-label": t("aria.nextImage"),
27694
27728
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-right", className: "w-8 h-8" })
@@ -27862,9 +27896,20 @@ function TableView({
27862
27896
  const inlineActionCount = hasActions ? maxInlineActions != null ? Math.min(itemActions.length, maxInlineActions) : itemActions.length : 0;
27863
27897
  const hasOverflowActions = hasActions && maxInlineActions != null && itemActions.length > maxInlineActions;
27864
27898
  const actionsTrack = hasActions ? `${inlineActionCount * 6 + (hasOverflowActions ? 3 : 0)}rem` : null;
27899
+ const colFloors = React82__namespace.default.useMemo(
27900
+ () => colDefs.map((col) => {
27901
+ const longest = data.reduce((widest, row) => {
27902
+ const cell = formatCell(asFieldValue(getNestedValue(row, col.field ?? col.key)), col.format);
27903
+ return Math.max(widest, cell.length);
27904
+ }, columnLabel(col).length);
27905
+ const chrome = col.format === "badge" ? BADGE_CHROME_CH : 0;
27906
+ return Math.min(longest + chrome, MAX_MEASURED_COL_CH);
27907
+ }),
27908
+ [colDefs, data]
27909
+ );
27865
27910
  const gridTemplateColumns = [
27866
27911
  selectable ? "auto" : null,
27867
- ...colDefs.map((c) => c.width ?? "minmax(0, 1fr)"),
27912
+ ...colDefs.map((c, i) => c.width ?? `minmax(${colFloors[i]}ch, 1fr)`),
27868
27913
  actionsTrack
27869
27914
  ].filter(Boolean).join(" ");
27870
27915
  const header = /* @__PURE__ */ jsxRuntime.jsxs(
@@ -27948,7 +27993,7 @@ function TableView({
27948
27993
  col.className
27949
27994
  );
27950
27995
  if (col.format === "badge" && raw != null && raw !== "") {
27951
- 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);
27996
+ 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);
27952
27997
  }
27953
27998
  return /* @__PURE__ */ jsxRuntime.jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: formatCell(raw, col.format) }) }, col.key);
27954
27999
  }),
@@ -28031,7 +28076,7 @@ function TableView({
28031
28076
  }
28032
28077
  );
28033
28078
  }
28034
- var alignClass, weightClass, LOOKS;
28079
+ var MAX_MEASURED_COL_CH, BADGE_CHROME_CH, alignClass, weightClass, LOOKS;
28035
28080
  var init_TableView = __esm({
28036
28081
  "components/core/molecules/TableView.tsx"() {
28037
28082
  "use client";
@@ -28049,6 +28094,8 @@ var init_TableView = __esm({
28049
28094
  init_Menu();
28050
28095
  init_useDataDnd();
28051
28096
  logger.createLogger("almadar:ui:table-view");
28097
+ MAX_MEASURED_COL_CH = 32;
28098
+ BADGE_CHROME_CH = 4;
28052
28099
  alignClass = {
28053
28100
  left: "justify-start text-left",
28054
28101
  center: "justify-center text-center",
@@ -30146,7 +30193,7 @@ var init_VoteStack = __esm({
30146
30193
  "active:bg-muted",
30147
30194
  "transition-colors duration-instant",
30148
30195
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
30149
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
30196
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
30150
30197
  styles.button
30151
30198
  ),
30152
30199
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-up", className: styles.icon })
@@ -30183,7 +30230,7 @@ var init_VoteStack = __esm({
30183
30230
  "active:bg-muted",
30184
30231
  "transition-colors duration-instant",
30185
30232
  "disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent",
30186
- "focus:outline-none focus:ring-[length:var(--focus-ring-width)] focus:ring-ring focus:ring-inset",
30233
+ "focus:outline-none focus-visible:ring-[length:var(--focus-ring-width)] focus-visible:ring-ring focus-visible:ring-inset",
30187
30234
  styles.button
30188
30235
  ),
30189
30236
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "chevron-down", className: styles.icon })
@@ -30704,7 +30751,7 @@ var init_QrScanner = __esm({
30704
30751
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
30705
30752
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
30706
30753
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
30707
- "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
30754
+ "hover:bg-opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
30708
30755
  ),
30709
30756
  "aria-label": isPaused ? t("qrScanner.resumeScanning") : t("qrScanner.pauseScanning"),
30710
30757
  children: isPaused ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "play", className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "pause", className: "h-4 w-4" })
@@ -30719,7 +30766,7 @@ var init_QrScanner = __esm({
30719
30766
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
30720
30767
  "rounded-full bg-black bg-opacity-60 p-2 text-white",
30721
30768
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
30722
- "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
30769
+ "hover:bg-opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
30723
30770
  ),
30724
30771
  "aria-label": currentFacing === "environment" ? t("qrScanner.switchToFrontCamera") : t("qrScanner.switchToRearCamera"),
30725
30772
  children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: "refresh-cw", className: "h-4 w-4" })
@@ -30734,7 +30781,7 @@ var init_QrScanner = __esm({
30734
30781
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
30735
30782
  "rounded-full bg-black bg-opacity-60 px-3 py-2 text-xs text-white",
30736
30783
  // eslint-disable-next-line almadar/no-hardcoded-colors -- media overlay: always over a dark scrim
30737
- "hover:bg-opacity-80 focus:outline-none focus:ring-2 focus:ring-white"
30784
+ "hover:bg-opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-white"
30738
30785
  ),
30739
30786
  "aria-label": t("aria.mockScanDev"),
30740
30787
  children: t("qrScanner.mockScan")
@@ -42571,7 +42618,7 @@ var init_TabbedContainer = __esm({
42571
42618
  onClick: () => !isDisabled && handleTabChange(tab.id),
42572
42619
  className: cn(
42573
42620
  "flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors",
42574
- "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
42621
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
42575
42622
  "disabled:opacity-50 disabled:cursor-not-allowed",
42576
42623
  isActive ? "bg-primary text-primary-foreground" : "bg-card text-foreground hover:bg-muted",
42577
42624
  isVertical ? "justify-start" : "justify-center"