@moontra/moonui 6.23.0 → 6.25.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.
Files changed (57) hide show
  1. package/dist/cdn/moonui.css +2 -2
  2. package/dist/cdn/moonui.esm.js +12 -12
  3. package/dist/cdn/moonui.global.js +12 -12
  4. package/dist/index.d.mts +24 -6
  5. package/dist/index.d.ts +24 -6
  6. package/dist/index.js +448 -93
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +449 -95
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +1 -1
  11. package/src/__tests__/issue-544-kontrast.test.tsx +609 -0
  12. package/src/__tests__/issue-645-overlay-tab-focus.test.tsx +262 -0
  13. package/src/__tests__/issue-646-dark-scope-override.test.tsx +297 -0
  14. package/src/__tests__/issue-661-a11y.test.tsx +113 -0
  15. package/src/__tests__/issue-661-token-kontrast.test.tsx +82 -0
  16. package/src/components/ui/__tests__/accent-foreground-contrast.test.ts +197 -0
  17. package/src/components/ui/__tests__/accordion.test.tsx +6 -4
  18. package/src/components/ui/__tests__/alert.test.tsx +4 -1
  19. package/src/components/ui/__tests__/badge.test.tsx +5 -1
  20. package/src/components/ui/__tests__/button.test.tsx +6 -1
  21. package/src/components/ui/__tests__/dark-token-contrast.test.ts +18 -18
  22. package/src/components/ui/__tests__/heading-level-policy.test.tsx +4 -4
  23. package/src/components/ui/__tests__/issue-643-card-token-parite.test.tsx +113 -0
  24. package/src/components/ui/__tests__/issue-649-button-aschild.test.tsx +199 -0
  25. package/src/components/ui/__tests__/issue-664-separator-dekoratif-rol.test.tsx +41 -0
  26. package/src/components/ui/__tests__/preset-color-shadowing.test.ts +10 -10
  27. package/src/components/ui/__tests__/primary-subtle-token.test.ts +7 -7
  28. package/src/components/ui/__tests__/progress-secondary-contrast.test.ts +38 -38
  29. package/src/components/ui/__tests__/progress-warning-error-contrast.test.ts +64 -64
  30. package/src/components/ui/__tests__/quality-group-de.test.tsx +2 -2
  31. package/src/components/ui/__tests__/responsive-color-invariance.test.ts +20 -20
  32. package/src/components/ui/__tests__/select.test.tsx +6 -1
  33. package/src/components/ui/__tests__/semantic-token-usage.test.ts +23 -23
  34. package/src/components/ui/__tests__/size-scale-convention.test.ts +10 -10
  35. package/src/components/ui/__tests__/slider-accent-contrast.test.ts +142 -136
  36. package/src/components/ui/__tests__/slider-secondary-contrast.test.ts +60 -60
  37. package/src/components/ui/__tests__/slider-warning-error-contrast.test.ts +100 -100
  38. package/src/components/ui/__tests__/switch-variant-contrast.test.tsx +103 -103
  39. package/src/components/ui/__tests__/tooltip.test.tsx +122 -0
  40. package/src/components/ui/accordion.tsx +16 -3
  41. package/src/components/ui/alert.tsx +1 -1
  42. package/src/components/ui/badge.tsx +31 -4
  43. package/src/components/ui/button.tsx +88 -21
  44. package/src/components/ui/card.tsx +59 -5
  45. package/src/components/ui/dropdown-menu.tsx +99 -5
  46. package/src/components/ui/file-upload.tsx +4 -0
  47. package/src/components/ui/index.ts +4 -1
  48. package/src/components/ui/popover-pro.tsx +41 -0
  49. package/src/components/ui/popover.tsx +162 -7
  50. package/src/components/ui/rating.tsx +24 -2
  51. package/src/components/ui/select.tsx +4 -4
  52. package/src/components/ui/simple-editor.tsx +3 -18
  53. package/src/components/ui/tabs.tsx +16 -1
  54. package/src/components/ui/textarea.tsx +6 -1
  55. package/src/components/ui/toast.tsx +17 -2
  56. package/src/components/ui/tooltip.tsx +154 -2
  57. package/src/styles/tokens.css +34 -2
package/dist/index.js CHANGED
@@ -95,7 +95,7 @@ var AccordionItem = React12__namespace.forwardRef(({ className, ...props }, ref)
95
95
  AccordionPrimitive__namespace.Item,
96
96
  {
97
97
  ref,
98
- className: cn("moonui-theme", "border-b border-gray-200 dark:border-gray-800", className),
98
+ className: cn("moonui-theme", "border-b border-border", className),
99
99
  ...props
100
100
  }
101
101
  ));
@@ -105,7 +105,9 @@ var AccordionTrigger = React12__namespace.forwardRef(({ className, children, ...
105
105
  {
106
106
  ref,
107
107
  className: cn(
108
- "flex flex-1 items-center justify-between py-4 font-medium transition-all dark:text-gray-100",
108
+ // #661-17: `dark:text-gray-100` KALDIRILDI — tetikleyici artık iki temada
109
+ // da `--foreground`u miras alır (koyu temada 213 31% 91% ≈ gray-100).
110
+ "flex flex-1 items-center justify-between py-4 font-medium transition-all",
109
111
  "hover:underline hover:text-primary",
110
112
  "[&[data-state=open]>svg]:rotate-180",
111
113
  className
@@ -123,7 +125,13 @@ var AccordionContent = React12__namespace.forwardRef(({ className, children, ...
123
125
  {
124
126
  ref,
125
127
  className: cn(
126
- "overflow-hidden text-sm text-gray-700 dark:text-gray-300 transition-all",
128
+ // #661-17: ham `text-gray-700 dark:text-gray-300` → `text-foreground/80`.
129
+ // Ölçüldü (iki tema, kart zemini): açık 10.30 → 11.48, koyu 12.19 → 9.44.
130
+ // İkisi de AA'nın (4.5) çok üstünde, yani eşik geçilmiyor — `#545 ihlal
131
+ // takası` sınıfı bir gerileme YOK. `text-muted-foreground` bilerek
132
+ // SEÇİLMEDİ: açık temada 4.76'ya inip gövde metnini görünür biçimde
133
+ // soldururdu (§9 estetik değişiklik olurdu).
134
+ "overflow-hidden text-sm text-foreground/80 transition-all",
127
135
  "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
128
136
  className
129
137
  ),
@@ -140,7 +148,7 @@ var alertVariants = classVarianceAuthority.cva(
140
148
  default: "bg-background text-foreground border-border",
141
149
  primary: "bg-primary/10 text-primary border-primary/30",
142
150
  success: "bg-success/10 text-success border-success/30",
143
- warning: "bg-warning/10 text-warning border-warning/30",
151
+ warning: "bg-warning/10 text-warning-subtle-foreground border-warning/30",
144
152
  error: "bg-destructive/10 text-destructive border-destructive/30",
145
153
  // `--info` token'ı (tokens.css) blue-500 ile birebir aynı değeri
146
154
  // taşır → görsel değişiklik yok, ancak varyant artık temaya ve
@@ -428,11 +436,22 @@ var badgeVariants = classVarianceAuthority.cva(
428
436
  // aynı varyant pro pakette token'lıydı → free ve pro `primary` için
429
437
  // farklı renk üretiyordu. Artık token'a bağlı (tema/karanlık moda duyarlı).
430
438
  // `primary` VARSAYILAN varyant olduğu için görünür bir renk değişimidir.
439
+ // #646: `dark:bg-primary/90` KALDIRILDI. `primary` VARSAYILAN varyant olduğu
440
+ // için varyant verilmeyen HER `<Badge>` bu sınıfı alıyordu; `tailwind-merge`
441
+ // `dark:` önekli arka planı tüketicinin ÖNEKSİZ `bg-*` sınıfıyla aynı grupta
442
+ // görmediğinden ikisi birden hayatta kalıyor ve koyu temada `dark:` özgüllükle
443
+ // kazanıyordu. Sonuç: `<Badge className="bg-green-500/20 text-green-300">`
444
+ // koyu temada near-white zemin + açık yeşil metin = 1.10:1 (ölçüldü,
445
+ // magnetic-button "Pending"; swipe-actions'ta 6 rozet 1.10–1.48 aralığında).
446
+ // ÖNEKSİZ `bg-primary` bırakıldı: tüketici sınıfıyla AYNI grupta çakışır ve
447
+ // doğru şekilde ezilir. Rozetin kendi görünümü BOZULMAZ — koyu temada
448
+ // `bg-primary` + `text-primary-foreground` 16.16 → 19.80'e çıkar
449
+ // (yarı saydamlık kalktığı için); açık temada değişiklik yok.
431
450
  primary: [
432
451
  "border-transparent bg-primary text-primary-foreground",
433
452
  "hover:bg-primary/90",
434
453
  "focus-visible:ring-primary/30 dark:focus-visible:ring-primary/40",
435
- "dark:bg-primary/90 dark:shadow-inner dark:shadow-primary/10"
454
+ "dark:shadow-inner dark:shadow-primary/10"
436
455
  ],
437
456
  secondary: [
438
457
  "border-transparent bg-secondary text-secondary-foreground",
@@ -447,11 +466,27 @@ var badgeVariants = classVarianceAuthority.cva(
447
466
  "focus-visible:ring-gray-400/30 dark:focus-visible:ring-gray-500/40",
448
467
  "dark:text-gray-100 dark:bg-transparent dark:backdrop-blur-sm"
449
468
  ],
469
+ // #544: `bg-error` (= --error, #ef4343) beyaz metinle 3.78 veriyordu (AA 4.5 ister),
470
+ // `dark:bg-error/90` ise gerçek koyu kart (#111827) üstünde 4.43 ile kalıyordu.
471
+ //
472
+ // TOKEN DEĞİŞTİRİLMEDİ: dark `--destructive`/`--error` METİN rolü için bilerek
473
+ // açık tutuluyor (tokens.css:518-526); değeri koyulaştırmak `text-destructive`
474
+ // yazan yüzleri kırardı ve dark-token-contrast.test.ts'in belgelediği uzlaşmayı
475
+ // bozardı. Bunun yerine #424/#442/#454'ün presedansı uygulandı: token'a değil
476
+ // VARYANTA dokunulup skalanın bir kademesine inildi.
477
+ //
478
+ // `-600` ölçümle seçildi — AA'yı geçen EN AÇIK kademe (beyazla 4.83; -500 3.76 ✗)
479
+ // ve bugünkü kırmızıya EN YAKIN aday (ΔE*ab 10.3; -700 → 16.2, `--destructive`
480
+ // light → 18.8). Hue 0° korunur, "uyarı kırmızısı" kimliği kaybolmaz.
481
+ //
482
+ // Skala kademeleri tema-BAĞIMSIZ (`.dark` onları ezmez) → tek sınıf iki temayı
483
+ // birden kapatır ve eski YARI SAYDAM `dark:bg-error/90`ın zemine bağımlılığı
484
+ // ortadan kalkar. Hover koyulaşır (-700, 6.47), açılmaz.
450
485
  destructive: [
451
- "border-transparent bg-error text-white",
452
- "hover:bg-error/90 dark:hover:bg-error/80",
486
+ "border-transparent bg-error-600 text-white",
487
+ "hover:bg-error-700 dark:hover:bg-error-700",
453
488
  "focus-visible:ring-error/30 dark:focus-visible:ring-error/25",
454
- "dark:bg-error/90 dark:text-white dark:shadow-inner dark:shadow-error/10"
489
+ "dark:text-white dark:shadow-inner dark:shadow-error/10"
455
490
  ],
456
491
  success: [
457
492
  "border-transparent bg-success text-success-foreground",
@@ -819,11 +854,20 @@ var buttonVariants = classVarianceAuthority.cva(
819
854
  "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
820
855
  "transition-all duration-200"
821
856
  ],
857
+ // #544: AÇIK tema zaten geçiyordu (`--destructive` light = #e11313, foreground
858
+ // #f8fafc ile 4.66) — #442'nin kuralı gereği DOKUNULMADI, regresyon yüzeyi sıfır.
859
+ // Kırık olan yalnız KOYU temaydı: dark `--destructive` = #ef4343 metin rolü için
860
+ // bilerek açık bırakılmış bir değer (tokens.css:518-526) ve dolgu rolünde
861
+ // foreground'la 3.61 veriyor. Token'a dokunmadan dark dolgusu opak `error`
862
+ // skalasına bağlandı (-600 → 4.62; ölçümle seçilen en açık geçen kademe).
863
+ // Not: `dark:bg-destructive` KALDIRILDI, yanına eklenmedi — iki `dark:bg-*`
864
+ // utility'si aynı anda yazılırsa hangisinin kazanacağını sınıf dizgesi sırası
865
+ // DEĞİL Tailwind'in kendi iç sıralaması belirler.
822
866
  destructive: [
823
867
  "bg-destructive text-destructive-foreground",
824
- "dark:bg-destructive dark:text-destructive-foreground",
825
- "hover:bg-destructive/90 dark:hover:bg-destructive/90",
826
- "active:bg-destructive/80 dark:active:bg-destructive/80",
868
+ "dark:bg-error-600 dark:text-destructive-foreground",
869
+ "hover:bg-destructive/90 dark:hover:bg-error-700",
870
+ "active:bg-destructive/80 dark:active:bg-error-800",
827
871
  "shadow-sm hover:shadow-md",
828
872
  "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
829
873
  "transition-all duration-200"
@@ -855,9 +899,11 @@ var buttonVariants = classVarianceAuthority.cva(
855
899
  ],
856
900
  glow: [
857
901
  "bg-blue-500 text-white",
858
- "shadow-[0_0_30px_rgba(59,130,246,0.5)]",
859
- "hover:shadow-[0_0_40px_rgba(59,130,246,0.7)]",
860
- "active:shadow-[0_0_20px_rgba(59,130,246,0.4)]",
902
+ // #664 S3: rgba(59,130,246,…) → --glow-blue-rgb (tokens.css). Değer AYNI
903
+ // (Tailwind blue-500), yalnız merkezi token'a taşındı — görsel değişiklik yok.
904
+ "shadow-[0_0_30px_rgba(var(--glow-blue-rgb),0.5)]",
905
+ "hover:shadow-[0_0_40px_rgba(var(--glow-blue-rgb),0.7)]",
906
+ "active:shadow-[0_0_20px_rgba(var(--glow-blue-rgb),0.4)]",
861
907
  "hover:bg-blue-600",
862
908
  "focus-visible:ring-blue-500/50",
863
909
  "transition-all duration-300"
@@ -886,8 +932,9 @@ var buttonVariants = classVarianceAuthority.cva(
886
932
  "bg-transparent text-green-400",
887
933
  "border-2 border-green-400",
888
934
  "hover:bg-green-400 hover:text-gray-900",
889
- "hover:shadow-[0_0_30px_rgba(74,222,128,0.6)]",
890
- "active:shadow-[0_0_15px_rgba(74,222,128,0.4)]",
935
+ // #664 S3: rgba(74,222,128,…) → --glow-green-rgb (tokens.css), piksel-özdeş.
936
+ "hover:shadow-[0_0_30px_rgba(var(--glow-green-rgb),0.6)]",
937
+ "active:shadow-[0_0_15px_rgba(var(--glow-green-rgb),0.4)]",
891
938
  "focus-visible:ring-green-400/50",
892
939
  "transition-all duration-300"
893
940
  ]
@@ -934,22 +981,40 @@ var Button = React12__namespace.forwardRef(
934
981
  rightIcon,
935
982
  children,
936
983
  disabled,
984
+ onClick,
937
985
  ...props
938
986
  }, ref) => {
939
- const Comp = asChild ? "button" : "button";
987
+ const renderAsSlot = asChild && React12__namespace.isValidElement(children);
988
+ const Comp = renderAsSlot ? reactSlot.Slot : "button";
989
+ const isDisabled = disabled || loading;
990
+ const disabledProps = renderAsSlot ? {
991
+ "aria-disabled": isDisabled || void 0,
992
+ "data-disabled": isDisabled ? "" : void 0
993
+ } : { disabled: isDisabled };
994
+ const handleClick = renderAsSlot && isDisabled ? (event) => {
995
+ event.preventDefault();
996
+ event.stopPropagation();
997
+ } : onClick;
940
998
  return /* @__PURE__ */ jsxRuntime.jsxs(
941
999
  Comp,
942
1000
  {
943
- className: cn("moonui-theme", buttonVariants({ variant, size, rounded, fullWidth, className })),
1001
+ className: cn(
1002
+ "moonui-theme",
1003
+ buttonVariants({ variant, size, rounded, fullWidth, className }),
1004
+ // `:disabled` eşleşmediği için görsel/etkileşimsel devre dışılık Slot
1005
+ // dalında açık sınıflarla verilir.
1006
+ renderAsSlot && isDisabled && "opacity-50 cursor-not-allowed pointer-events-none"
1007
+ ),
944
1008
  ref,
945
- disabled: disabled || loading,
1009
+ ...disabledProps,
946
1010
  "aria-busy": loading || void 0,
947
1011
  "data-loading": loading ? "" : void 0,
948
1012
  ...props,
1013
+ onClick: handleClick,
949
1014
  children: [
950
1015
  loading && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "w-4 h-4 animate-spin", "aria-hidden": "true" }),
951
1016
  !loading && leftIcon,
952
- children,
1017
+ renderAsSlot ? /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children }) : children,
953
1018
  !loading && rightIcon
954
1019
  ]
955
1020
  }
@@ -1100,16 +1165,16 @@ var skeletonAnimation = {
1100
1165
  }
1101
1166
  };
1102
1167
  var cardVariants = classVarianceAuthority.cva(
1103
- "rounded-lg border bg-card text-card-foreground shadow-sm dark:shadow-gray-900/20 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-100 transition-all duration-200",
1168
+ "rounded-lg border border-border bg-card text-card-foreground shadow-sm dark:shadow-black/20 transition-all duration-200",
1104
1169
  {
1105
1170
  variants: {
1106
1171
  variant: {
1107
1172
  default: "",
1108
- outline: "border border-border shadow-none bg-transparent dark:border-gray-700 dark:bg-transparent dark:text-gray-200",
1109
- filled: "border-none bg-secondary dark:bg-gray-800 dark:text-gray-100 dark:shadow-inner dark:shadow-gray-950/10",
1110
- elevated: "border-none shadow-md dark:shadow-lg dark:shadow-gray-900/30 dark:bg-card dark:text-gray-100",
1173
+ outline: "border border-border shadow-none bg-transparent dark:bg-transparent",
1174
+ filled: "border-none bg-secondary dark:bg-muted dark:shadow-inner dark:shadow-black/10",
1175
+ elevated: "border-none shadow-md dark:shadow-lg dark:shadow-black/30 dark:bg-card",
1111
1176
  gradient: "border-none bg-gradient-to-br from-primary/5 to-primary/10 dark:from-primary/10 dark:to-primary/20",
1112
- glass: "border border-white/20 bg-white/10 backdrop-blur-md dark:border-gray-700/30 dark:bg-gray-800/10"
1177
+ glass: "border border-white/20 bg-white/10 backdrop-blur-md dark:border-white/10 dark:bg-black/10"
1113
1178
  },
1114
1179
  size: {
1115
1180
  md: "",
@@ -2311,7 +2376,76 @@ var popoverContentVariants = classVarianceAuthority.cva(
2311
2376
  }
2312
2377
  }
2313
2378
  );
2314
- var Popover = PopoverPrimitive__namespace.Root;
2379
+ var PopoverModalContext = React12__namespace.createContext(false);
2380
+ var POPOVER_TAB_STOP_SELECTOR = "a[href],button,input,select,textarea,[tabindex],audio[controls],video[controls],[contenteditable]";
2381
+ function isPopoverElementHidden(node) {
2382
+ const view = node.ownerDocument.defaultView;
2383
+ if (!view)
2384
+ return false;
2385
+ if (view.getComputedStyle(node).visibility === "hidden")
2386
+ return true;
2387
+ let current = node;
2388
+ while (current) {
2389
+ if (view.getComputedStyle(current).display === "none")
2390
+ return true;
2391
+ current = current.parentElement;
2392
+ }
2393
+ return false;
2394
+ }
2395
+ function isPopoverTabStop(node) {
2396
+ if (node.hasAttribute("data-radix-focus-guard"))
2397
+ return false;
2398
+ if (node.tabIndex < 0)
2399
+ return false;
2400
+ if (node.disabled)
2401
+ return false;
2402
+ if (node.hidden)
2403
+ return false;
2404
+ if (node.getAttribute("aria-hidden") === "true")
2405
+ return false;
2406
+ if (node.closest("[inert]"))
2407
+ return false;
2408
+ return !isPopoverElementHidden(node);
2409
+ }
2410
+ function getPopoverTabStopsWithin(container) {
2411
+ return Array.from(
2412
+ container.querySelectorAll(POPOVER_TAB_STOP_SELECTOR)
2413
+ ).filter(isPopoverTabStop);
2414
+ }
2415
+ function getPopoverTrigger(content) {
2416
+ if (!content.id)
2417
+ return null;
2418
+ const id = typeof CSS !== "undefined" && typeof CSS.escape === "function" ? CSS.escape(content.id) : content.id;
2419
+ return content.ownerDocument.querySelector(
2420
+ `[aria-controls="${id}"]`
2421
+ );
2422
+ }
2423
+ function getPopoverTabStopOutside(reference, content, direction) {
2424
+ const candidates = Array.from(
2425
+ content.ownerDocument.querySelectorAll(
2426
+ POPOVER_TAB_STOP_SELECTOR
2427
+ )
2428
+ ).filter((node) => !content.contains(node) && isPopoverTabStop(node));
2429
+ if (direction === "next") {
2430
+ return candidates.find(
2431
+ (node) => Boolean(
2432
+ reference.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING
2433
+ )
2434
+ ) ?? null;
2435
+ }
2436
+ let previous = null;
2437
+ for (const node of candidates) {
2438
+ const relation = reference.compareDocumentPosition(node);
2439
+ if (node === reference || relation & Node.DOCUMENT_POSITION_PRECEDING) {
2440
+ previous = node;
2441
+ } else {
2442
+ break;
2443
+ }
2444
+ }
2445
+ return previous;
2446
+ }
2447
+ var Popover = ({ modal = false, children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(PopoverModalContext.Provider, { value: modal, children: /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Root, { ...props, modal, children }) });
2448
+ Popover.displayName = "Popover";
2315
2449
  var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
2316
2450
  var PopoverAnchor = PopoverPrimitive__namespace.Anchor;
2317
2451
  var PopoverContent = React12__namespace.forwardRef(({
@@ -2326,42 +2460,79 @@ var PopoverContent = React12__namespace.forwardRef(({
2326
2460
  closeOnInteractOutside = true,
2327
2461
  overlayBackdrop = false,
2328
2462
  sideOffset = 4,
2463
+ onKeyDown,
2329
2464
  ...props
2330
- }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2331
- overlayBackdrop && /* @__PURE__ */ jsxRuntime.jsx(
2332
- "div",
2333
- {
2334
- className: "fixed inset-0 z-40 bg-black/50"
2335
- }
2336
- ),
2337
- /* @__PURE__ */ jsxRuntime.jsx(
2338
- PopoverPrimitive__namespace.Content,
2339
- {
2340
- ref,
2341
- side,
2342
- sideOffset,
2343
- collisionPadding: 8,
2344
- onInteractOutside: (e) => {
2345
- if (!closeOnInteractOutside) {
2346
- e.preventDefault();
2347
- }
2348
- },
2349
- className: cn(
2350
- popoverContentVariants({
2351
- variant,
2352
- size,
2353
- side,
2354
- position,
2355
- radius,
2356
- shadow
2357
- }),
2358
- backdrop && "backdrop-blur-md bg-opacity-80",
2359
- className
2360
- ),
2361
- ...props
2465
+ }, ref) => {
2466
+ const isModal = React12__namespace.useContext(PopoverModalContext);
2467
+ const handleKeyDown = (event) => {
2468
+ onKeyDown?.(event);
2469
+ if (event.defaultPrevented)
2470
+ return;
2471
+ if (isModal)
2472
+ return;
2473
+ if (event.key !== "Tab")
2474
+ return;
2475
+ if (event.altKey || event.ctrlKey || event.metaKey)
2476
+ return;
2477
+ const content = event.currentTarget;
2478
+ const active = content.ownerDocument.activeElement;
2479
+ if (!active || active !== content && !content.contains(active))
2480
+ return;
2481
+ const tabStops = getPopoverTabStopsWithin(content);
2482
+ const forward = !event.shiftKey;
2483
+ const atEdge = tabStops.length === 0 ? active === content : active === (forward ? tabStops[tabStops.length - 1] : tabStops[0]);
2484
+ if (!atEdge)
2485
+ return;
2486
+ const reference = getPopoverTrigger(content) ?? content;
2487
+ const target = getPopoverTabStopOutside(
2488
+ reference,
2489
+ content,
2490
+ forward ? "next" : "previous"
2491
+ );
2492
+ event.preventDefault();
2493
+ if (target) {
2494
+ target.focus();
2495
+ } else {
2496
+ active.blur();
2362
2497
  }
2363
- )
2364
- ] }));
2498
+ };
2499
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2500
+ overlayBackdrop && /* @__PURE__ */ jsxRuntime.jsx(
2501
+ "div",
2502
+ {
2503
+ className: "fixed inset-0 z-40 bg-black/50"
2504
+ }
2505
+ ),
2506
+ /* @__PURE__ */ jsxRuntime.jsx(
2507
+ PopoverPrimitive__namespace.Content,
2508
+ {
2509
+ ref,
2510
+ side,
2511
+ sideOffset,
2512
+ collisionPadding: 8,
2513
+ onInteractOutside: (e) => {
2514
+ if (!closeOnInteractOutside) {
2515
+ e.preventDefault();
2516
+ }
2517
+ },
2518
+ onKeyDown: handleKeyDown,
2519
+ className: cn(
2520
+ popoverContentVariants({
2521
+ variant,
2522
+ size,
2523
+ side,
2524
+ position,
2525
+ radius,
2526
+ shadow
2527
+ }),
2528
+ backdrop && "backdrop-blur-md bg-opacity-80",
2529
+ className
2530
+ ),
2531
+ ...props
2532
+ }
2533
+ )
2534
+ ] });
2535
+ });
2365
2536
  PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
2366
2537
  var PopoverClose = PopoverPrimitive__namespace.Close;
2367
2538
  var PopoverSeparator = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -2453,7 +2624,22 @@ var tabsTriggerVariants = classVarianceAuthority.cva(
2453
2624
  variant: {
2454
2625
  default: "rounded-md data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm dark:data-[state=active]:bg-gray-900 dark:data-[state=active]:text-gray-100 dark:data-[state=active]:shadow-gray-950/10",
2455
2626
  underline: "rounded-none border-b-2 border-transparent pb-2 data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground dark:data-[state=active]:border-primary/80 dark:data-[state=active]:text-gray-100",
2456
- pills: "rounded-lg bg-gray-100 hover:bg-gray-200/80 border border-gray-300 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground data-[state=active]:border-primary dark:bg-gray-800 dark:hover:bg-gray-700 dark:border-gray-700 dark:data-[state=active]:bg-primary/90 dark:data-[state=active]:text-white dark:data-[state=active]:border-primary",
2627
+ // #646: `dark:data-[state=active]:text-white` KALDIRILDI. `--primary` koyu
2628
+ // temada BİLİNÇLİ near-white'tır (tokens.css:500, #368 kararı — DEĞİŞMEZ),
2629
+ // dolayısıyla aktif pill'e açıkça beyaz metin yazmak beyaz-üstüne-beyaz
2630
+ // demekti: ölçülen 1.28:1 (gerçek tarayıcı, /docs/components/tabs, koyu tema).
2631
+ // Sınıf kalkınca öneksiz `data-[state=active]:text-primary-foreground`
2632
+ // (koyu temada near-black) devreye girer → 15.91:1. Açık temada hiçbir
2633
+ // değişiklik yok (`dark:` sınıfı orada zaten uygulanmıyordu; ölçülen 4.70:1).
2634
+ //
2635
+ // ⚠️ `dark:data-[state=active]:bg-primary/90` BİLEREK KORUNDU: onu da
2636
+ // kaldırmak #545'in "ihlal takası" tuzağına düşürüyor. Aynı varyanttaki
2637
+ // `dark:bg-gray-800` (inaktif zemin) ile `data-[state=active]:bg-primary`
2638
+ // ÖZGÜLLÜKÇE EŞİT (0,2,0); kaynak sırası nedeniyle `dark:bg-gray-800`
2639
+ // kazanıyor ve aktif pill koyu temada inaktif görünüyordu — near-black metin
2640
+ // gray-800 üstünde 1.41:1 ile YENİ bir ihlal (ölçüldü). Koyu temada aktif
2641
+ // durumun zemini bu yüzden `dark:` özgüllüğünde kalmak ZORUNDA.
2642
+ pills: "rounded-lg bg-gray-100 hover:bg-gray-200/80 border border-gray-300 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground data-[state=active]:border-primary dark:bg-gray-800 dark:hover:bg-gray-700 dark:border-gray-700 dark:data-[state=active]:bg-primary/90 dark:data-[state=active]:border-primary",
2457
2643
  cards: "rounded-md bg-muted/50 hover:bg-muted data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-md dark:bg-gray-800/50 dark:hover:bg-gray-700/50 dark:data-[state=active]:bg-gray-900 dark:data-[state=active]:text-gray-100 dark:data-[state=active]:shadow-gray-950/20",
2458
2644
  minimal: "rounded-sm bg-transparent hover:bg-muted/30 data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:underline data-[state=active]:underline-offset-4 dark:hover:bg-gray-800/30 dark:data-[state=active]:text-gray-200"
2459
2645
  },
@@ -4836,7 +5022,61 @@ function DraggableList({
4836
5022
  keyExtractor(item)
4837
5023
  )) });
4838
5024
  }
4839
- var DropdownMenu = DropdownMenuPrimitive__namespace.Root;
5025
+ var DropdownMenuCloseContext = React12__namespace.createContext(null);
5026
+ var DropdownMenu = ({
5027
+ open,
5028
+ defaultOpen,
5029
+ onOpenChange,
5030
+ children,
5031
+ ...props
5032
+ }) => {
5033
+ const [uncontrolledOpen, setUncontrolledOpen] = React12__namespace.useState(
5034
+ defaultOpen ?? false
5035
+ );
5036
+ const isControlled = open !== void 0;
5037
+ const currentOpen = isControlled ? open : uncontrolledOpen;
5038
+ const handleOpenChange = React12__namespace.useCallback(
5039
+ (nextOpen) => {
5040
+ if (!isControlled)
5041
+ setUncontrolledOpen(nextOpen);
5042
+ onOpenChange?.(nextOpen);
5043
+ },
5044
+ [isControlled, onOpenChange]
5045
+ );
5046
+ const close = React12__namespace.useCallback(() => handleOpenChange(false), [
5047
+ handleOpenChange
5048
+ ]);
5049
+ return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuCloseContext.Provider, { value: close, children: /* @__PURE__ */ jsxRuntime.jsx(
5050
+ DropdownMenuPrimitive__namespace.Root,
5051
+ {
5052
+ ...props,
5053
+ open: currentOpen,
5054
+ onOpenChange: handleOpenChange,
5055
+ children
5056
+ }
5057
+ ) });
5058
+ };
5059
+ DropdownMenu.displayName = "DropdownMenu";
5060
+ function useDropdownMenuTabDismiss(onKeyDown) {
5061
+ const close = React12__namespace.useContext(DropdownMenuCloseContext);
5062
+ return (event) => {
5063
+ onKeyDown?.(event);
5064
+ if (event.defaultPrevented)
5065
+ return;
5066
+ if (event.key !== "Tab")
5067
+ return;
5068
+ if (event.altKey || event.ctrlKey || event.metaKey)
5069
+ return;
5070
+ if (!close)
5071
+ return;
5072
+ const target = event.target;
5073
+ if (target?.closest("[data-radix-menu-content]") !== event.currentTarget) {
5074
+ return;
5075
+ }
5076
+ event.preventDefault();
5077
+ close();
5078
+ };
5079
+ }
4840
5080
  var DropdownMenuTrigger = DropdownMenuPrimitive__namespace.Trigger;
4841
5081
  var DropdownMenuGroup = DropdownMenuPrimitive__namespace.Group;
4842
5082
  var DropdownMenuPortal = DropdownMenuPrimitive__namespace.Portal;
@@ -4859,30 +5099,38 @@ var DropdownMenuSubTrigger = React12__namespace.forwardRef(({ className, inset,
4859
5099
  }
4860
5100
  ));
4861
5101
  DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive__namespace.SubTrigger.displayName;
4862
- var DropdownMenuSubContent = React12__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
4863
- DropdownMenuPrimitive__namespace.SubContent,
4864
- {
4865
- ref,
4866
- className: cn(
4867
- "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg 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",
4868
- className
4869
- ),
4870
- ...props
4871
- }
4872
- ));
5102
+ var DropdownMenuSubContent = React12__namespace.forwardRef(({ className, onKeyDown, ...props }, ref) => {
5103
+ const handleKeyDown = useDropdownMenuTabDismiss(onKeyDown);
5104
+ return /* @__PURE__ */ jsxRuntime.jsx(
5105
+ DropdownMenuPrimitive__namespace.SubContent,
5106
+ {
5107
+ ref,
5108
+ onKeyDown: handleKeyDown,
5109
+ className: cn(
5110
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg 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",
5111
+ className
5112
+ ),
5113
+ ...props
5114
+ }
5115
+ );
5116
+ });
4873
5117
  DropdownMenuSubContent.displayName = DropdownMenuPrimitive__namespace.SubContent.displayName;
4874
- var DropdownMenuContent = React12__namespace.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
4875
- DropdownMenuPrimitive__namespace.Content,
4876
- {
4877
- ref,
4878
- sideOffset,
4879
- className: cn(
4880
- "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md 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",
4881
- className
4882
- ),
4883
- ...props
4884
- }
4885
- ) }));
5118
+ var DropdownMenuContent = React12__namespace.forwardRef(({ className, sideOffset = 4, onKeyDown, ...props }, ref) => {
5119
+ const handleKeyDown = useDropdownMenuTabDismiss(onKeyDown);
5120
+ return /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
5121
+ DropdownMenuPrimitive__namespace.Content,
5122
+ {
5123
+ ref,
5124
+ sideOffset,
5125
+ onKeyDown: handleKeyDown,
5126
+ className: cn(
5127
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md 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",
5128
+ className
5129
+ ),
5130
+ ...props
5131
+ }
5132
+ ) });
5133
+ });
4886
5134
  DropdownMenuContent.displayName = DropdownMenuPrimitive__namespace.Content.displayName;
4887
5135
  var DropdownMenuItem = React12__namespace.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
4888
5136
  DropdownMenuPrimitive__namespace.Item,
@@ -5366,6 +5614,10 @@ var FileUpload = React12__namespace.default.forwardRef(
5366
5614
  {
5367
5615
  className: cn(
5368
5616
  "relative border-2 border-dashed rounded-lg p-8 text-center transition-colors",
5617
+ // #661-2: dosya girdisi `opacity-0` ile tum alani kapliyor; klavyeyle
5618
+ // Tab'landiginda HICBIR gorsel iz yoktu (WCAG 2.4.7). Odak halkasi
5619
+ // sarmalayiciya `focus-within` ile bagli — kutunun kendisi odaklanamaz.
5620
+ "focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
5369
5621
  isDragOver && "border-primary bg-primary/5",
5370
5622
  disabled && "opacity-50 cursor-not-allowed",
5371
5623
  !disabled && "hover:border-primary/50 cursor-pointer"
@@ -6281,7 +6533,7 @@ var selectTriggerVariants = classVarianceAuthority.cva(
6281
6533
  );
6282
6534
  var SelectTrigger = React12__namespace.forwardRef(({ className, children, variant, size, error, success, loading, leftIcon, rightIcon, ...props }, ref) => {
6283
6535
  const icerikId = React12__namespace.useId();
6284
- const adVerilmis = props["aria-label"] != null || props["aria-labelledby"] != null;
6536
+ const isNamed = props["aria-label"] != null || props["aria-labelledby"] != null;
6285
6537
  return /* @__PURE__ */ jsxRuntime.jsxs(
6286
6538
  SelectPrimitive__namespace.Trigger,
6287
6539
  {
@@ -6300,7 +6552,7 @@ var SelectTrigger = React12__namespace.forwardRef(({ className, children, varian
6300
6552
  "data-error": error ? true : void 0,
6301
6553
  "data-success": success ? true : void 0,
6302
6554
  "data-loading": loading ? true : void 0,
6303
- "aria-labelledby": adVerilmis ? props["aria-labelledby"] : icerikId,
6555
+ "aria-labelledby": isNamed ? props["aria-labelledby"] : icerikId,
6304
6556
  children: [
6305
6557
  /* @__PURE__ */ jsxRuntime.jsxs("div", { id: icerikId, className: "flex items-center flex-1 gap-2", children: [
6306
6558
  leftIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex items-center justify-center text-muted-foreground", children: leftIcon }),
@@ -6408,8 +6660,8 @@ var SelectItem = React12__namespace.forwardRef(({ className, children, variant =
6408
6660
  variant === "default" && "focus:bg-accent focus:text-accent-foreground dark:focus:bg-gray-700 dark:focus:text-gray-100",
6409
6661
  variant === "subtle" && "focus:bg-gray-100 dark:focus:bg-gray-800 focus:text-foreground dark:focus:text-gray-200",
6410
6662
  variant === "destructive" && "text-error dark:text-red-400 focus:bg-error/10 dark:focus:bg-red-900/20 focus:text-error dark:focus:text-red-300",
6411
- variant === "success" && "text-success dark:text-green-400 focus:bg-success/10 dark:focus:bg-green-900/20 focus:text-success dark:focus:text-green-300",
6412
- variant === "warning" && "text-warning dark:text-yellow-400 focus:bg-warning/10 dark:focus:bg-yellow-900/20 focus:text-warning dark:focus:text-yellow-300",
6663
+ variant === "success" && "text-success focus:bg-success/10 focus:text-success",
6664
+ variant === "warning" && "text-warning-700 dark:text-warning-500 focus:bg-warning/10 focus:text-warning-700 dark:focus:text-warning-500",
6413
6665
  className
6414
6666
  ),
6415
6667
  ...props,
@@ -7182,8 +7434,100 @@ var tooltipVariants = classVarianceAuthority.cva(
7182
7434
  }
7183
7435
  }
7184
7436
  );
7185
- var Tooltip = TooltipPrimitive__namespace.Root;
7186
- var TooltipTrigger = TooltipPrimitive__namespace.Trigger;
7437
+ var TooltipFocusHoldContext = React12__namespace.createContext(null);
7438
+ function isKeyboardFocus(element) {
7439
+ if (!element)
7440
+ return false;
7441
+ try {
7442
+ return element.matches(":focus-visible");
7443
+ } catch {
7444
+ return true;
7445
+ }
7446
+ }
7447
+ var Tooltip = ({
7448
+ open,
7449
+ defaultOpen,
7450
+ onOpenChange,
7451
+ children,
7452
+ ...props
7453
+ }) => {
7454
+ const isControlled = open !== void 0;
7455
+ const [uncontrolledOpen, setUncontrolledOpen] = React12__namespace.useState(defaultOpen ?? false);
7456
+ const resolvedOpen = isControlled ? open : uncontrolledOpen;
7457
+ const isFocusHeldRef = React12__namespace.useRef(false);
7458
+ const hold = React12__namespace.useCallback(() => {
7459
+ isFocusHeldRef.current = true;
7460
+ }, []);
7461
+ const release = React12__namespace.useCallback(() => {
7462
+ isFocusHeldRef.current = false;
7463
+ }, []);
7464
+ const setOpen = React12__namespace.useCallback(
7465
+ (next) => {
7466
+ if (!isControlled)
7467
+ setUncontrolledOpen(next);
7468
+ onOpenChange?.(next);
7469
+ },
7470
+ [isControlled, onOpenChange]
7471
+ );
7472
+ const handleOpenChange = React12__namespace.useCallback(
7473
+ (next) => {
7474
+ if (!next && isFocusHeldRef.current)
7475
+ return;
7476
+ setOpen(next);
7477
+ },
7478
+ [setOpen]
7479
+ );
7480
+ React12__namespace.useEffect(() => {
7481
+ if (!resolvedOpen)
7482
+ return;
7483
+ const handleEscape = (event) => {
7484
+ if (event.key !== "Escape")
7485
+ return;
7486
+ isFocusHeldRef.current = false;
7487
+ setOpen(false);
7488
+ };
7489
+ document.addEventListener("keydown", handleEscape, true);
7490
+ return () => document.removeEventListener("keydown", handleEscape, true);
7491
+ }, [resolvedOpen, setOpen]);
7492
+ const focusHold = React12__namespace.useMemo(
7493
+ () => ({ hold, release }),
7494
+ [hold, release]
7495
+ );
7496
+ return /* @__PURE__ */ jsxRuntime.jsx(TooltipFocusHoldContext.Provider, { value: focusHold, children: /* @__PURE__ */ jsxRuntime.jsx(
7497
+ TooltipPrimitive__namespace.Root,
7498
+ {
7499
+ ...props,
7500
+ open: resolvedOpen,
7501
+ onOpenChange: handleOpenChange,
7502
+ children
7503
+ }
7504
+ ) });
7505
+ };
7506
+ Tooltip.displayName = "Tooltip";
7507
+ var TooltipTrigger = React12__namespace.forwardRef(({ onFocus, onBlur, onPointerDown, ...props }, ref) => {
7508
+ const focusHold = React12__namespace.useContext(TooltipFocusHoldContext);
7509
+ return /* @__PURE__ */ jsxRuntime.jsx(
7510
+ TooltipPrimitive__namespace.Trigger,
7511
+ {
7512
+ ref,
7513
+ ...props,
7514
+ onFocus: (event) => {
7515
+ if (isKeyboardFocus(event.currentTarget))
7516
+ focusHold?.hold();
7517
+ onFocus?.(event);
7518
+ },
7519
+ onBlur: (event) => {
7520
+ focusHold?.release();
7521
+ onBlur?.(event);
7522
+ },
7523
+ onPointerDown: (event) => {
7524
+ focusHold?.release();
7525
+ onPointerDown?.(event);
7526
+ }
7527
+ }
7528
+ );
7529
+ });
7530
+ TooltipTrigger.displayName = TooltipPrimitive__namespace.Trigger.displayName;
7187
7531
  var TooltipArrow = React12__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
7188
7532
  TooltipPrimitive__namespace.Arrow,
7189
7533
  {
@@ -8562,7 +8906,7 @@ var Textarea = React12__namespace.forwardRef(
8562
8906
  children: errorMessage || successMessage
8563
8907
  }
8564
8908
  ),
8565
- showCharCount && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground dark:text-gray-500 ml-auto", children: [
8909
+ showCharCount && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground ml-auto", children: [
8566
8910
  currentLength,
8567
8911
  maxLength !== void 0 && ` / ${maxLength}`
8568
8912
  ] })
@@ -8909,6 +9253,12 @@ var Rating = React12__namespace.forwardRef(
8909
9253
  },
8910
9254
  [readOnly, max, currentValue, step, commit]
8911
9255
  );
9256
+ const reactId = React12__namespace.useId();
9257
+ const optionId = React12__namespace.useCallback(
9258
+ (optionValue) => `${reactId}-option-${String(optionValue).replace(".", "-")}`,
9259
+ [reactId]
9260
+ );
9261
+ const activeValue = currentValue >= step && currentValue <= max ? currentValue : step;
8912
9262
  const renderIcon = (filled) => {
8913
9263
  if (React12__namespace.isValidElement(icon)) {
8914
9264
  const element = icon;
@@ -8938,6 +9288,7 @@ var Rating = React12__namespace.forwardRef(
8938
9288
  "aria-label": ariaLabel,
8939
9289
  "aria-orientation": "horizontal",
8940
9290
  "aria-readonly": readOnly || void 0,
9291
+ "aria-activedescendant": readOnly ? void 0 : optionId(activeValue),
8941
9292
  tabIndex: readOnly ? void 0 : 0,
8942
9293
  onKeyDown: handleKeyDown,
8943
9294
  onMouseLeave: () => setHoverValue(null),
@@ -8960,7 +9311,7 @@ var Rating = React12__namespace.forwardRef(
8960
9311
  "span",
8961
9312
  {
8962
9313
  "aria-hidden": "true",
8963
- className: "pointer-events-none absolute left-0 top-0 h-full overflow-hidden text-amber-400",
9314
+ className: "pointer-events-none absolute left-0 top-0 h-full overflow-hidden text-[rgb(var(--rating-star-rgb))]",
8964
9315
  style: { width: `${fraction * 100}%` },
8965
9316
  children: renderIcon(true)
8966
9317
  }
@@ -8971,6 +9322,7 @@ var Rating = React12__namespace.forwardRef(
8971
9322
  {
8972
9323
  type: "button",
8973
9324
  role: "radio",
9325
+ id: optionId(halfValue),
8974
9326
  "aria-checked": currentValue === halfValue,
8975
9327
  "aria-label": `${halfValue} stars`,
8976
9328
  tabIndex: -1,
@@ -8984,6 +9336,7 @@ var Rating = React12__namespace.forwardRef(
8984
9336
  {
8985
9337
  type: "button",
8986
9338
  role: "radio",
9339
+ id: optionId(starValue),
8987
9340
  "aria-checked": currentValue === starValue,
8988
9341
  "aria-label": `${starValue} stars`,
8989
9342
  tabIndex: -1,
@@ -8998,6 +9351,7 @@ var Rating = React12__namespace.forwardRef(
8998
9351
  {
8999
9352
  type: "button",
9000
9353
  role: "radio",
9354
+ id: optionId(starValue),
9001
9355
  "aria-checked": currentValue === starValue,
9002
9356
  "aria-label": `${starValue} ${starValue === 1 ? "star" : "stars"}`,
9003
9357
  tabIndex: -1,
@@ -9605,6 +9959,7 @@ exports.moonUIInputOTPSlotVariants = inputOTPSlotVariants;
9605
9959
  exports.moonUIKbdVariants = kbdVariants;
9606
9960
  exports.moonUIPopoverContentVariants = popoverContentVariants;
9607
9961
  exports.moonUIRatingVariants = ratingVariants;
9962
+ exports.moonUISeparatorVariants = separatorVariants;
9608
9963
  exports.moonUISkeletonVariants = skeletonVariants;
9609
9964
  exports.moonUISpinnerVariants = spinnerVariants;
9610
9965
  exports.moonUIToggleVariants = toggleVariants;