@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.
- package/dist/cdn/moonui.css +2 -2
- package/dist/cdn/moonui.esm.js +12 -12
- package/dist/cdn/moonui.global.js +12 -12
- package/dist/index.d.mts +24 -6
- package/dist/index.d.ts +24 -6
- package/dist/index.js +448 -93
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +449 -95
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/issue-544-kontrast.test.tsx +609 -0
- package/src/__tests__/issue-645-overlay-tab-focus.test.tsx +262 -0
- package/src/__tests__/issue-646-dark-scope-override.test.tsx +297 -0
- package/src/__tests__/issue-661-a11y.test.tsx +113 -0
- package/src/__tests__/issue-661-token-kontrast.test.tsx +82 -0
- package/src/components/ui/__tests__/accent-foreground-contrast.test.ts +197 -0
- package/src/components/ui/__tests__/accordion.test.tsx +6 -4
- package/src/components/ui/__tests__/alert.test.tsx +4 -1
- package/src/components/ui/__tests__/badge.test.tsx +5 -1
- package/src/components/ui/__tests__/button.test.tsx +6 -1
- package/src/components/ui/__tests__/dark-token-contrast.test.ts +18 -18
- package/src/components/ui/__tests__/heading-level-policy.test.tsx +4 -4
- package/src/components/ui/__tests__/issue-643-card-token-parite.test.tsx +113 -0
- package/src/components/ui/__tests__/issue-649-button-aschild.test.tsx +199 -0
- package/src/components/ui/__tests__/issue-664-separator-dekoratif-rol.test.tsx +41 -0
- package/src/components/ui/__tests__/preset-color-shadowing.test.ts +10 -10
- package/src/components/ui/__tests__/primary-subtle-token.test.ts +7 -7
- package/src/components/ui/__tests__/progress-secondary-contrast.test.ts +38 -38
- package/src/components/ui/__tests__/progress-warning-error-contrast.test.ts +64 -64
- package/src/components/ui/__tests__/quality-group-de.test.tsx +2 -2
- package/src/components/ui/__tests__/responsive-color-invariance.test.ts +20 -20
- package/src/components/ui/__tests__/select.test.tsx +6 -1
- package/src/components/ui/__tests__/semantic-token-usage.test.ts +23 -23
- package/src/components/ui/__tests__/size-scale-convention.test.ts +10 -10
- package/src/components/ui/__tests__/slider-accent-contrast.test.ts +142 -136
- package/src/components/ui/__tests__/slider-secondary-contrast.test.ts +60 -60
- package/src/components/ui/__tests__/slider-warning-error-contrast.test.ts +100 -100
- package/src/components/ui/__tests__/switch-variant-contrast.test.tsx +103 -103
- package/src/components/ui/__tests__/tooltip.test.tsx +122 -0
- package/src/components/ui/accordion.tsx +16 -3
- package/src/components/ui/alert.tsx +1 -1
- package/src/components/ui/badge.tsx +31 -4
- package/src/components/ui/button.tsx +88 -21
- package/src/components/ui/card.tsx +59 -5
- package/src/components/ui/dropdown-menu.tsx +99 -5
- package/src/components/ui/file-upload.tsx +4 -0
- package/src/components/ui/index.ts +4 -1
- package/src/components/ui/popover-pro.tsx +41 -0
- package/src/components/ui/popover.tsx +162 -7
- package/src/components/ui/rating.tsx +24 -2
- package/src/components/ui/select.tsx +4 -4
- package/src/components/ui/simple-editor.tsx +3 -18
- package/src/components/ui/tabs.tsx +16 -1
- package/src/components/ui/textarea.tsx +6 -1
- package/src/components/ui/toast.tsx +17 -2
- package/src/components/ui/tooltip.tsx +154 -2
- 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-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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:
|
|
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-
|
|
825
|
-
"hover:bg-destructive/90 dark:hover:bg-
|
|
826
|
-
"active:bg-destructive/80 dark:active:bg-
|
|
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
|
-
|
|
859
|
-
|
|
860
|
-
"
|
|
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
|
-
|
|
890
|
-
"
|
|
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
|
|
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(
|
|
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
|
-
|
|
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-
|
|
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:
|
|
1109
|
-
filled: "border-none bg-secondary dark:bg-
|
|
1110
|
-
elevated: "border-none shadow-md dark:shadow-lg dark:shadow-
|
|
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-
|
|
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
|
|
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) =>
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
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
|
-
|
|
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
|
|
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) =>
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
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) =>
|
|
4875
|
-
|
|
4876
|
-
{
|
|
4877
|
-
|
|
4878
|
-
|
|
4879
|
-
|
|
4880
|
-
|
|
4881
|
-
|
|
4882
|
-
|
|
4883
|
-
|
|
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
|
|
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":
|
|
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
|
|
6412
|
-
variant === "warning" && "text-warning dark:text-
|
|
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
|
|
7186
|
-
|
|
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
|
|
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-
|
|
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;
|