@frontfriend/tailwind 4.0.15 → 4.0.17

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontfriend/tailwind",
3
- "version": "4.0.15",
3
+ "version": "4.0.17",
4
4
  "description": "Design token management for Tailwind CSS",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/types/index.d.ts",
@@ -48,12 +48,23 @@
48
48
  "footer": "flex flex-row justify-end gap-4",
49
49
  "title": "text-lg font-semibold text-neutral-mid",
50
50
  "description": "text-sm text-neutral-subtle font-medium",
51
+ "media": "mb-2 inline-flex size-16 items-center justify-center rounded-md bg-neutral-subtle sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8",
51
52
  "cancel": "sm:mt-0"
52
53
  },
53
54
  "avatar": {
54
- "root": "font-primary relative border-neutral-low flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
55
+ "root": "font-primary group/avatar relative border-neutral-low flex h-10 w-10 shrink-0 overflow-hidden rounded-full select-none",
55
56
  "image": "aspect-square h-full w-full",
56
- "fallback": "bg-brand-low flex h-full w-full items-center justify-center rounded-full text-interactive-mid text-[40cqw]"
57
+ "fallback": "bg-brand-low flex h-full w-full items-center justify-center rounded-full text-interactive-mid text-[40cqw] group-data-[size=sm]/avatar:text-xs",
58
+ "badge": "absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-brand-mid text-onbrand-mid ring-2 ring-layer-base select-none group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2 group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
59
+ "group": "group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-layer-base",
60
+ "groupCount": "relative flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-brand-low text-sm text-interactive-mid ring-2 ring-layer-base group-has-data-[size=lg]/avatar-group:h-10 group-has-data-[size=lg]/avatar-group:w-10 group-has-data-[size=sm]/avatar-group:h-6 group-has-data-[size=sm]/avatar-group:w-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
61
+ "props": {
62
+ "size": {
63
+ "default": "",
64
+ "sm": "h-6 w-6",
65
+ "lg": "h-10 w-10"
66
+ }
67
+ }
57
68
  },
58
69
  "badge": {
59
70
  "root": "font-primary shrink-0 [&>svg]:h-4 [&>svg]:w-4 gap-x-1 pt-0.5 pb-0.5 pl-2.5 pr-2.5 rounded-sm text-xs leading-snug font-medium border flex items-center justify-center box-border h-5 inline-flex overflow-hidden",
@@ -228,6 +239,7 @@
228
239
  "description": "text-xs font-medium text-neutral-subtle",
229
240
  "header": "flex flex-col space-y-1.5 p-4 pb-0 rounded-t-2xl",
230
241
  "content": "p-4 gap-4",
242
+ "action": "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
231
243
  "footer": "flex gap-4 items-center p-4 bg-neutral-subtle rounded-b-2xl",
232
244
  "footerAlign": {
233
245
  "justify": "flex justify-between",
@@ -259,7 +271,8 @@
259
271
  "slots": {
260
272
  "dialog": {
261
273
  "content": "overflow-hidden p-0",
262
- "root": "**:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-neutral-mid [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5"
274
+ "root": "**:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-neutral-mid [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5",
275
+ "srOnly": "sr-only"
263
276
  },
264
277
  "input": {
265
278
  "wrapper": "flex h-9 items-center gap-2 border-b border-neutral-subtle px-3 text-neutral-subtle",
@@ -702,6 +715,12 @@
702
715
  },
703
716
  "popover": {
704
717
  "root": "z-30 font-primary w-72 rounded border gap-0 border-neutral-subtle bg-layer-popover text-neutral-mid shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 shadow-md",
718
+ "slots": {
719
+ "trigger": "rounded",
720
+ "header": "flex flex-col gap-1 text-sm",
721
+ "title": "font-medium",
722
+ "description": "text-neutral-subtle"
723
+ },
705
724
  "padding": {
706
725
  "true": "p-4",
707
726
  "false": "p-0"
@@ -783,13 +802,13 @@
783
802
  },
784
803
  "sidebar": {
785
804
  "sheet": {
786
- "root": "w-[--sidebar-width] bg-layer-below p-0 text-neutral-strong [&>button]:hidden"
805
+ "root": "w-[var(--sidebar-width)] bg-layer-below p-0 text-neutral-strong [&>button]:hidden"
787
806
  },
788
807
  "provider": {
789
808
  "wrapper": "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar"
790
809
  },
791
810
  "root": {
792
- "base": "flex h-full w-[--sidebar-width] flex-col bg-layer-below text-neutral-strong",
811
+ "base": "flex h-full w-[var(--sidebar-width)] flex-col bg-layer-below text-neutral-strong",
793
812
  "props": {
794
813
  "width": {
795
814
  "root": "16rem",
@@ -801,24 +820,24 @@
801
820
  "container": "flex h-full w-full flex-col",
802
821
  "default": "group peer hidden lg:block",
803
822
  "wrapper": {
804
- "base": "duration-200 relative h-svh w-[--sidebar-width] bg-transparent transition-[width] ease-linear",
823
+ "base": "duration-200 relative h-svh w-[var(--sidebar-width)] bg-transparent transition-[width] ease-linear",
805
824
  "collapsibleOffcanvas": "group-data-[collapsible=offcanvas]:w-0",
806
825
  "flipped": "group-data-[side=right]:rotate-180",
807
826
  "variants": {
808
827
  "floating": "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]",
809
828
  "inset": "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]",
810
- "default": "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
829
+ "default": "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)]"
811
830
  }
812
831
  },
813
832
  "fixed": {
814
- "base": "duration-200 fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] ease-linear md:flex border-neutral-subtle",
833
+ "base": "duration-200 fixed inset-y-0 z-10 hidden h-svh w-[var(--sidebar-width)] transition-[left,right,width] ease-linear md:flex border-neutral-subtle",
815
834
  "side": {
816
835
  "left": "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]",
817
836
  "right": "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]"
818
837
  },
819
838
  "variants": {
820
839
  "floatingOrInset": "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]",
821
- "default": "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l"
840
+ "default": "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)] group-data-[side=left]:border-r group-data-[side=right]:border-l"
822
841
  },
823
842
  "inner": "flex h-full w-full flex-col text-neutral-strong bg-layer-below group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-neutral-subtle group-data-[variant=floating]:shadow"
824
843
  }
@@ -846,7 +865,7 @@
846
865
  "skeleton": {
847
866
  "root": "rounded-md h-8 flex gap-2 px-2 items-center",
848
867
  "icon": "size-4 rounded-md",
849
- "text": "h-4 flex-1 max-w-[--skeleton-width]"
868
+ "text": "h-4 flex-1 max-w-[var(--skeleton-width)]"
850
869
  },
851
870
  "button": {
852
871
  "root": "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded py-2 px-3 text-left text-sm outline-none transition-[width,height,padding] focus-visible:ring-2 active:bg-neutral-subtle active:text-neutral-strong disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-neutral-subtle data-[active=true]:font-medium data-[active=true]:text-neutral-strong data-[state=open]:hover:bg-neutral-subtle data-[state=open]: group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 font-medium",
@@ -942,6 +961,8 @@
942
961
  }
943
962
  },
944
963
  "icon": {
964
+ "root": "size-4",
965
+ "loading": "size-4 animate-spin",
945
966
  "variant": {
946
967
  "neutral": "text-icon-neutral-mid",
947
968
  "destructive": "text-icon-onnegative-low",
@@ -1076,7 +1097,17 @@
1076
1097
  "root": "text-center",
1077
1098
  "prefix": "absolute left-14 top-1/2 transform -translate-y-1/2 font-medium text-sm font-primary disabled:opacity-100 disabled:bg-disabled disabled:text-disabled disabled:cursor-not-allowed",
1078
1099
  "suffix": "absolute right-14 top-1/2 transform -translate-y-1/2 font-medium text-sm font-primary disabled:opacity-100 disabled:bg-disabled disabled:text-disabled disabled:cursor-not-allowed",
1079
- "padding": "px-16"
1100
+ "padding": "px-16",
1101
+ "slots": {
1102
+ "numberField": {
1103
+ "root": "grid gap-1.5",
1104
+ "content": "relative [&>[data-slot=input]]:has-[[data-slot=increment]]:pr-5 [&>[data-slot=input]]:has-[[data-slot=decrement]]:pl-5",
1105
+ "input": "flex h-9 w-full rounded-md border border-neutral-subtle bg-layer-below py-1 text-sm text-center shadow-sm transition-colors placeholder:text-neutral-mid focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-brand-mid disabled:cursor-not-allowed disabled:opacity-50",
1106
+ "increment": "absolute top-1/2 -translate-y-1/2 right-0 disabled:cursor-not-allowed disabled:opacity-20 p-3",
1107
+ "decrement": "absolute top-1/2 -translate-y-1/2 left-0 p-3 disabled:cursor-not-allowed disabled:opacity-20",
1108
+ "icon": "h-4 w-4"
1109
+ }
1110
+ }
1080
1111
  },
1081
1112
  "resizable": {
1082
1113
  "root": "flex h-full w-full data-[panel-group-direction=vertical]:flex-col data-[orientation=vertical]:flex-col",
@@ -1096,11 +1127,13 @@
1096
1127
  "item": "group/step flex items-center justify-center not-last:flex-1 data-[disabled]:pointer-events-none data-[disabled]:opacity-60 group-data-[orientation=horizontal]/stepper-nav:flex-row group-data-[orientation=vertical]/stepper-nav:flex-col",
1097
1128
  "trigger": "focus-visible:border-brand-mid focus-visible:ring-interactive-mid/50 inline-flex cursor-pointer items-center gap-2.5 rounded-full outline-none focus-visible:z-10 focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-60",
1098
1129
  "indicator": "border-neutral-subtle bg-neutral-subtle text-neutral-strong data-[state=completed]:bg-brand-mid data-[state=completed]:text-onbrand-mid data-[state=active]:bg-brand-mid data-[state=active]:text-onbrand-mid data-[state=loading]:bg-brand-mid data-[state=loading]:text-onbrand-mid relative flex size-6 shrink-0 items-center justify-center overflow-hidden rounded-full text-xs",
1130
+ "indicatorContent": "absolute",
1099
1131
  "separator": "bg-neutral-subtle group-data-[state=completed]/step:bg-brand-mid data-[state=completed]:bg-brand-mid m-0.5 rounded-sm group-data-[orientation=horizontal]/stepper-nav:h-0.5 group-data-[orientation=horizontal]/stepper-nav:flex-1 group-data-[orientation=vertical]/stepper-nav:h-12 group-data-[orientation=vertical]/stepper-nav:w-0.5",
1100
1132
  "title": "text-sm leading-none font-medium text-neutral-strong",
1101
1133
  "description": "text-sm text-neutral-mid",
1102
1134
  "panel": "w-full",
1103
- "content": "w-full"
1135
+ "content": "w-full",
1136
+ "contentHidden": "hidden"
1104
1137
  }
1105
1138
  },
1106
1139
  "tabBar": {
@@ -240,11 +240,13 @@ const MINIMAL_V4_FALLBACKS = {
240
240
  item: 'group/step flex items-center justify-center not-last:flex-1 data-[disabled]:pointer-events-none data-[disabled]:opacity-60 group-data-[orientation=horizontal]/stepper-nav:flex-row group-data-[orientation=vertical]/stepper-nav:flex-col',
241
241
  trigger: 'focus-visible:border-ring focus-visible:ring-ring/50 inline-flex cursor-pointer items-center gap-2.5 rounded-full outline-none focus-visible:z-10 focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-60',
242
242
  indicator: 'border-background bg-muted text-foreground data-[state=completed]:bg-primary data-[state=completed]:text-primary-foreground data-[state=active]:bg-primary data-[state=active]:text-primary-foreground relative flex size-6 shrink-0 items-center justify-center overflow-hidden rounded-full text-xs',
243
+ indicatorContent: 'absolute',
243
244
  separator: 'bg-muted group-data-[state=completed]/step:bg-primary data-[state=completed]:bg-primary m-0.5 rounded-sm group-data-[orientation=horizontal]/stepper-nav:h-0.5 group-data-[orientation=horizontal]/stepper-nav:flex-1 group-data-[orientation=vertical]/stepper-nav:h-12 group-data-[orientation=vertical]/stepper-nav:w-0.5',
244
245
  title: 'text-sm leading-none font-medium text-foreground',
245
246
  description: 'text-sm text-muted-foreground',
246
247
  panel: 'w-full',
247
248
  content: 'w-full',
249
+ contentHidden: 'hidden',
248
250
  },
249
251
  themeprovider: { root: 'contents' },
250
252
  themepicker: {
@@ -333,6 +335,18 @@ const SHADCN_DEFAULTS = {
333
335
  input: {
334
336
  root:
335
337
  'font-primary flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base md:text-sm shadow-xs transition-[color,box-shadow] outline-none text-foreground placeholder:text-muted-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive disabled:cursor-not-allowed disabled:opacity-50',
338
+ numberField: {
339
+ root: 'grid gap-1.5',
340
+ content:
341
+ 'relative [&>[data-slot=input]]:has-[[data-slot=increment]]:pr-5 [&>[data-slot=input]]:has-[[data-slot=decrement]]:pl-5',
342
+ input:
343
+ 'flex h-9 w-full rounded-md border border-input bg-transparent py-1 text-sm text-center shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',
344
+ increment:
345
+ 'absolute top-1/2 -translate-y-1/2 right-0 disabled:cursor-not-allowed disabled:opacity-20 p-3',
346
+ decrement:
347
+ 'absolute top-1/2 -translate-y-1/2 left-0 p-3 disabled:cursor-not-allowed disabled:opacity-20',
348
+ icon: 'h-4 w-4',
349
+ },
336
350
  },
337
351
  // Fidelity pass (#468 follow-up): align components whose neutralized treatment
338
352
  // visibly diverged from shadcn new-york-v4 (size scale / padding / shape).
@@ -362,9 +376,22 @@ const SHADCN_DEFAULTS = {
362
376
  icon: 'size-2 rounded-full',
363
377
  },
364
378
  avatar: {
365
- root: 'font-primary relative flex size-8 shrink-0 overflow-hidden rounded-full',
379
+ root: 'font-primary group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none',
366
380
  fallback:
367
- 'bg-muted flex size-full items-center justify-center rounded-full text-sm text-muted-foreground',
381
+ 'bg-muted flex size-full items-center justify-center rounded-full text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs',
382
+ badge:
383
+ 'absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground ring-2 ring-background select-none group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2 group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2',
384
+ group:
385
+ 'group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background',
386
+ groupCount:
387
+ 'relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3',
388
+ props: {
389
+ size: {
390
+ default: '',
391
+ sm: 'size-6',
392
+ lg: 'size-10',
393
+ },
394
+ },
368
395
  },
369
396
  card: {
370
397
  root:
@@ -373,11 +400,87 @@ const SHADCN_DEFAULTS = {
373
400
  content: 'px-6',
374
401
  footer: 'flex gap-4 items-center px-6',
375
402
  },
403
+ navigationmenu: {
404
+ item: 'relative',
405
+ },
406
+ sheet: {
407
+ srOnly: 'sr-only',
408
+ },
409
+ sidebar: {
410
+ srOnly: 'sr-only',
411
+ },
412
+ resizable: {
413
+ handleIcon: 'z-10 flex h-4 w-3 items-center justify-center rounded-xs border bg-border',
414
+ iconSize: '2.5',
415
+ icons: {
416
+ handle: 'GripVertical',
417
+ },
418
+ },
419
+ chart: {
420
+ slots: {
421
+ tooltip: {
422
+ root: 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',
423
+ label: {
424
+ root: 'flex flex-1 justify-between leading-none',
425
+ wrapper: 'font-medium',
426
+ },
427
+ payload: {
428
+ root: 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',
429
+ wrapper: 'grid gap-1.5',
430
+ },
431
+ indicator: 'shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]',
432
+ value: 'font-mono font-medium tabular-nums text-foreground',
433
+ },
434
+ legend: {
435
+ content: {
436
+ root: 'flex items-center justify-center gap-4',
437
+ wrapper: 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground',
438
+ },
439
+ align: {
440
+ true: 'pb-3',
441
+ false: 'pt-3',
442
+ },
443
+ item: 'h-2 w-2 shrink-0 rounded-[2px]',
444
+ },
445
+ dot: {
446
+ indicator: {
447
+ root: 'items-center',
448
+ size: 'h-2.5 w-2.5',
449
+ },
450
+ },
451
+ line: {
452
+ indicator: {
453
+ size: 'w-1',
454
+ },
455
+ },
456
+ dashed: {
457
+ indicator: {
458
+ root: 'w-0 border-[1.5px] border-dashed bg-transparent',
459
+ label: 'my-0.5',
460
+ },
461
+ },
462
+ nest: {
463
+ label: {
464
+ true: 'items-end',
465
+ false: 'items-center',
466
+ container: 'grid gap-1.5',
467
+ text: 'text-muted-foreground',
468
+ },
469
+ },
470
+ },
471
+ },
472
+ drawer: {
473
+ handle:
474
+ 'bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block',
475
+ },
376
476
  tooltip: {
377
477
  content:
378
478
  'z-30 w-fit overflow-hidden rounded-md font-normal font-primary bg-foreground px-3 py-1.5 text-xs text-balance text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
479
+ arrow:
480
+ 'z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground',
379
481
  },
380
482
  tabs: {
483
+ root: 'group/tabs flex gap-2 data-[orientation=horizontal]:flex-col',
381
484
  list: {
382
485
  root:
383
486
  'inline-flex h-9 w-fit gap-1 items-center justify-center rounded-lg p-[3px] font-primary bg-muted text-muted-foreground',
@@ -453,6 +556,7 @@ const FORBIDDEN_DEFAULT_CLASS_PATTERNS = [
453
556
  /(?:^|:)text-onbrand(?:-|$)/,
454
557
  /(?:^|:)(?:text|fill)-icon-(?:brand|onbrand)(?:-|$)/,
455
558
  /(?:^|:)border-brand(?:-|$)/,
559
+ /(?:^|:)ring-brand(?:-|$)/,
456
560
  /(?:^|:)bg-layer(?:-|$)/,
457
561
  /(?:^|:)bg-disabled$/,
458
562
  /(?:^|:)text-disabled$/,
@@ -585,6 +689,21 @@ function mapBorderClass(base, prefix) {
585
689
  return important + withVariantTone(prefix, mapped);
586
690
  }
587
691
 
692
+ function mapRingClass(base, prefix) {
693
+ const match = base.match(/^!?ring-([a-z]+)(?:-[a-z]+)*(?:-(hover|active|selected|disabled))?$/);
694
+ if (!match) return null;
695
+ const important = base.startsWith('!') ? '!' : '';
696
+ const family = match[1];
697
+ // `ring-ring`, `ring-border`, `ring-background`, … carry no FF color family and
698
+ // are already neutral shadcn tokens, so they fall through untouched here.
699
+ if (!COLOR_FAMILIES.has(family)) return null;
700
+
701
+ let mapped;
702
+ if (family === 'negative') mapped = 'ring-destructive';
703
+ else mapped = 'ring-ring';
704
+ return important + withVariantTone(prefix, mapped);
705
+ }
706
+
588
707
  function neutralizeClassToken(token) {
589
708
  if (!token) return token;
590
709
  if (DIRECT_CLASS_MAP[token]) return DIRECT_CLASS_MAP[token];
@@ -599,6 +718,7 @@ function neutralizeClassToken(token) {
599
718
  || mapBgClass(core, prefix)
600
719
  || mapTextClass(core, prefix)
601
720
  || mapBorderClass(core, prefix)
721
+ || mapRingClass(core, prefix)
602
722
  || mapRadiusClass(core)
603
723
  || core;
604
724