@moontra/moonui 6.8.0 → 6.10.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/hooks/index.global.js +1 -6
- package/dist/index.d.mts +44 -35
- package/dist/index.d.ts +44 -35
- package/dist/index.global.js +52 -365
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +421 -359
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +385 -323
- package/dist/index.mjs.map +1 -1
- package/dist/lib/theme.global.js +1 -14
- package/dist/lib/theme.global.js.map +1 -1
- package/package.json +1 -1
- package/src/components/ui/__tests__/carousel.test.tsx +37 -0
- package/src/components/ui/__tests__/checkbox.test.tsx +3 -3
- package/src/components/ui/__tests__/collapsible.test.tsx +5 -5
- package/src/components/ui/__tests__/dialog.test.tsx +2 -2
- package/src/components/ui/__tests__/progress.test.tsx +4 -4
- package/src/components/ui/__tests__/quality-group-de.test.tsx +159 -0
- package/src/components/ui/__tests__/radio-group.test.tsx +4 -4
- package/src/components/ui/__tests__/size-scale-convention.test.ts +189 -0
- package/src/components/ui/__tests__/slider.test.tsx +4 -4
- package/src/components/ui/alert.tsx +5 -3
- package/src/components/ui/avatar.tsx +3 -2
- package/src/components/ui/breadcrumb.tsx +4 -2
- package/src/components/ui/card.tsx +4 -2
- package/src/components/ui/carousel.tsx +24 -0
- package/src/components/ui/checkbox.tsx +5 -3
- package/src/components/ui/collapsible.tsx +10 -6
- package/src/components/ui/color-picker.tsx +11 -5
- package/src/components/ui/command.tsx +29 -2
- package/src/components/ui/date-picker.tsx +4 -2
- package/src/components/ui/dialog.tsx +7 -5
- package/src/components/ui/popover-pro.tsx +5 -3
- package/src/components/ui/popover.tsx +4 -2
- package/src/components/ui/progress.tsx +6 -4
- package/src/components/ui/radio-group.tsx +5 -3
- package/src/components/ui/scroll-area.tsx +23 -3
- package/src/components/ui/skeleton.tsx +20 -3
- package/src/components/ui/slider.tsx +10 -6
- package/src/components/ui/table.tsx +4 -2
- package/src/components/ui/toggle-group.tsx +4 -1
- package/src/components/ui/toggle.tsx +4 -2
|
@@ -26,13 +26,15 @@ const commandVariants = cva(
|
|
|
26
26
|
},
|
|
27
27
|
size: {
|
|
28
28
|
sm: "min-h-[200px]",
|
|
29
|
-
|
|
29
|
+
md: "min-h-[300px]",
|
|
30
30
|
lg: "min-h-[400px]",
|
|
31
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
32
|
+
default: "min-h-[300px]",
|
|
31
33
|
},
|
|
32
34
|
},
|
|
33
35
|
defaultVariants: {
|
|
34
36
|
variant: "default",
|
|
35
|
-
size: "
|
|
37
|
+
size: "md",
|
|
36
38
|
},
|
|
37
39
|
}
|
|
38
40
|
)
|
|
@@ -167,6 +169,18 @@ const CommandSeparator = React.forwardRef<
|
|
|
167
169
|
>(({ className, ...props }, ref) => (
|
|
168
170
|
<CommandPrimitive.Separator
|
|
169
171
|
ref={ref}
|
|
172
|
+
/**
|
|
173
|
+
* #308-6: cmdk, Separator'a `role="separator"` basıyor ve bu eleman
|
|
174
|
+
* `CommandList`'in (`role="listbox"`) çocuğu oluyor → listbox'ın izinli çocuğu
|
|
175
|
+
* yalnız `option`/`group` olduğu için axe `aria-required-children` (critical) veriyordu.
|
|
176
|
+
*
|
|
177
|
+
* `role` EZİLEMİYOR: cmdk 1.1.1 `{...props, "cmdk-separator":"", role:"separator"}`
|
|
178
|
+
* sırasıyla yazıyor, yani kendi rolü prop'lardan SONRA geliyor (kaynak doğrulandı).
|
|
179
|
+
* `aria-hidden` ise prop yayılımının içinde olduğu için geçiyor — ve ayraç zaten
|
|
180
|
+
* tümüyle dekoratif olduğundan erişilebilirlik ağacından çıkarılması DOĞRU davranış.
|
|
181
|
+
* Böylece listbox'ın sahiplendiği çocuklar arasında görünmez.
|
|
182
|
+
*/
|
|
183
|
+
aria-hidden="true"
|
|
170
184
|
className={cn("moonui-theme", "-mx-1 h-px bg-border", className)}
|
|
171
185
|
{...props}
|
|
172
186
|
/>
|
|
@@ -219,4 +233,17 @@ export {
|
|
|
219
233
|
CommandItem,
|
|
220
234
|
CommandShortcut,
|
|
221
235
|
CommandSeparator,
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// #308-5: Sekiz Props interface'inin HİÇBİRİ export edilmiyordu → tüketici sarmalayıcı
|
|
239
|
+
// yazarken tipi yeniden türetmek zorundaydı.
|
|
240
|
+
export type {
|
|
241
|
+
CommandProps,
|
|
242
|
+
CommandDialogProps,
|
|
243
|
+
CommandInputProps,
|
|
244
|
+
CommandListProps,
|
|
245
|
+
CommandEmptyProps,
|
|
246
|
+
CommandGroupProps,
|
|
247
|
+
CommandSeparatorProps,
|
|
248
|
+
CommandItemProps,
|
|
222
249
|
}
|
|
@@ -36,10 +36,12 @@ const datePickerVariants = cva(
|
|
|
36
36
|
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
37
37
|
},
|
|
38
38
|
size: {
|
|
39
|
-
|
|
39
|
+
md: "h-10 px-4 py-2",
|
|
40
40
|
sm: "h-8 px-3 text-sm",
|
|
41
41
|
lg: "h-12 px-6 text-base",
|
|
42
42
|
icon: "h-10 w-10",
|
|
43
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
44
|
+
default: "h-10 px-4 py-2",
|
|
43
45
|
},
|
|
44
46
|
state: {
|
|
45
47
|
default: "",
|
|
@@ -50,7 +52,7 @@ const datePickerVariants = cva(
|
|
|
50
52
|
},
|
|
51
53
|
defaultVariants: {
|
|
52
54
|
variant: "default",
|
|
53
|
-
size: "
|
|
55
|
+
size: "md",
|
|
54
56
|
state: "default",
|
|
55
57
|
},
|
|
56
58
|
}
|
|
@@ -73,12 +73,14 @@ const dialogContentVariants = cva(
|
|
|
73
73
|
size: {
|
|
74
74
|
xs: "max-w-xs p-4",
|
|
75
75
|
sm: "max-w-sm p-5",
|
|
76
|
-
|
|
76
|
+
lg: "max-w-lg p-6",
|
|
77
77
|
md: "max-w-md p-6",
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
xl: "max-w-2xl p-7",
|
|
79
|
+
"2xl": "max-w-4xl p-8",
|
|
80
80
|
full: "max-w-[95vw] max-h-[95vh] p-6",
|
|
81
|
-
|
|
81
|
+
/** @deprecated `lg` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
82
|
+
default: "max-w-lg p-6",
|
|
83
|
+
},
|
|
82
84
|
radius: {
|
|
83
85
|
none: "rounded-none",
|
|
84
86
|
sm: "rounded-md",
|
|
@@ -103,7 +105,7 @@ const dialogContentVariants = cva(
|
|
|
103
105
|
},
|
|
104
106
|
defaultVariants: {
|
|
105
107
|
variant: "default",
|
|
106
|
-
size: "
|
|
108
|
+
size: "lg",
|
|
107
109
|
radius: "default",
|
|
108
110
|
animation: "default",
|
|
109
111
|
position: "default",
|
|
@@ -171,10 +171,12 @@ const popoverContentVariants = cva(
|
|
|
171
171
|
},
|
|
172
172
|
size: {
|
|
173
173
|
sm: "w-56 p-3",
|
|
174
|
-
|
|
174
|
+
md: "w-72 p-4",
|
|
175
175
|
lg: "w-96 p-6",
|
|
176
176
|
xl: "w-[32rem] p-8",
|
|
177
|
-
auto: "w-auto p-4"
|
|
177
|
+
auto: "w-auto p-4",
|
|
178
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
179
|
+
default: "w-72 p-4",
|
|
178
180
|
},
|
|
179
181
|
overlayBlur: {
|
|
180
182
|
none: "",
|
|
@@ -186,7 +188,7 @@ const popoverContentVariants = cva(
|
|
|
186
188
|
},
|
|
187
189
|
defaultVariants: {
|
|
188
190
|
variant: "default",
|
|
189
|
-
size: "
|
|
191
|
+
size: "md",
|
|
190
192
|
overlayBlur: "none"
|
|
191
193
|
}
|
|
192
194
|
}
|
|
@@ -25,8 +25,10 @@ const popoverContentVariants = cva(
|
|
|
25
25
|
},
|
|
26
26
|
size: {
|
|
27
27
|
sm: "w-48 p-3",
|
|
28
|
-
|
|
28
|
+
md: "w-72 p-4",
|
|
29
29
|
lg: "w-96 p-5",
|
|
30
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
31
|
+
default: "w-72 p-4",
|
|
30
32
|
},
|
|
31
33
|
side: {
|
|
32
34
|
top: "data-[side=top]:slide-in-from-bottom-2",
|
|
@@ -56,7 +58,7 @@ const popoverContentVariants = cva(
|
|
|
56
58
|
},
|
|
57
59
|
defaultVariants: {
|
|
58
60
|
variant: "default",
|
|
59
|
-
size: "
|
|
61
|
+
size: "md",
|
|
60
62
|
radius: "default",
|
|
61
63
|
shadow: "default",
|
|
62
64
|
},
|
|
@@ -32,10 +32,12 @@ const progressVariants = cva(
|
|
|
32
32
|
size: {
|
|
33
33
|
xs: "h-1",
|
|
34
34
|
sm: "h-1.5",
|
|
35
|
+
md: "h-2",
|
|
36
|
+
lg: "h-2.5",
|
|
37
|
+
xl: "h-3",
|
|
38
|
+
"2xl": "h-4",
|
|
39
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
35
40
|
default: "h-2",
|
|
36
|
-
md: "h-2.5",
|
|
37
|
-
lg: "h-3",
|
|
38
|
-
xl: "h-4",
|
|
39
41
|
},
|
|
40
42
|
radius: {
|
|
41
43
|
none: "rounded-none",
|
|
@@ -53,7 +55,7 @@ const progressVariants = cva(
|
|
|
53
55
|
},
|
|
54
56
|
defaultVariants: {
|
|
55
57
|
variant: "default",
|
|
56
|
-
size: "
|
|
58
|
+
size: "md",
|
|
57
59
|
radius: "full",
|
|
58
60
|
animation: "default",
|
|
59
61
|
},
|
|
@@ -24,14 +24,16 @@ const radioGroupItemVariants = cva(
|
|
|
24
24
|
},
|
|
25
25
|
size: {
|
|
26
26
|
sm: "h-3.5 w-3.5",
|
|
27
|
+
md: "h-4 w-4",
|
|
28
|
+
lg: "h-5 w-5",
|
|
29
|
+
xl: "h-6 w-6",
|
|
30
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
27
31
|
default: "h-4 w-4",
|
|
28
|
-
md: "h-5 w-5",
|
|
29
|
-
lg: "h-6 w-6",
|
|
30
32
|
},
|
|
31
33
|
},
|
|
32
34
|
defaultVariants: {
|
|
33
35
|
variant: "default",
|
|
34
|
-
size: "
|
|
36
|
+
size: "md",
|
|
35
37
|
},
|
|
36
38
|
}
|
|
37
39
|
);
|
|
@@ -5,16 +5,36 @@ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "../../lib/utils"
|
|
7
7
|
|
|
8
|
+
export interface ScrollAreaProps
|
|
9
|
+
extends React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {
|
|
10
|
+
/**
|
|
11
|
+
* #308-1: Kaydırma alanının klavyeyle odaklanabilir olup olmayacağı. Varsayılan `true`
|
|
12
|
+
* — odaklanabilir içeriği olmayan bir kaydırma alanı aksi hâlde klavyeyle erişilemez
|
|
13
|
+
* (WCAG 2.1.1). Fazladan sekme durağı istenmeyen durumlarda `false`.
|
|
14
|
+
*/
|
|
15
|
+
focusable?: boolean
|
|
16
|
+
}
|
|
17
|
+
|
|
8
18
|
const ScrollArea = React.forwardRef<
|
|
9
19
|
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
|
|
10
|
-
|
|
11
|
-
>(({ className, children, ...props }, ref) => (
|
|
20
|
+
ScrollAreaProps
|
|
21
|
+
>(({ className, children, focusable = true, ...props }, ref) => (
|
|
12
22
|
<ScrollAreaPrimitive.Root
|
|
13
23
|
ref={ref}
|
|
14
24
|
className={cn("relative overflow-hidden", className)}
|
|
15
25
|
{...props}
|
|
16
26
|
>
|
|
17
|
-
|
|
27
|
+
{/*
|
|
28
|
+
#308-1: Viewport'a `tabIndex` VERİLMİYORDU ve bu davranış Radix'ten kalıtsal DEĞİL
|
|
29
|
+
(`@radix-ui/react-scroll-area` kaynağında tabIndex geçmiyor). Sonuç: içinde
|
|
30
|
+
odaklanabilir eleman bulunmayan bir ScrollArea klavyeyle HİÇ kaydırılamıyordu
|
|
31
|
+
(WCAG 2.1.1). Kaydırılabilir bölgenin odaklanabilir olması kanonik çözümdür;
|
|
32
|
+
ek sekme durağı istemeyen tüketici `focusable={false}` diyebilir.
|
|
33
|
+
*/}
|
|
34
|
+
<ScrollAreaPrimitive.Viewport
|
|
35
|
+
tabIndex={focusable ? 0 : undefined}
|
|
36
|
+
className="h-full w-full rounded-[inherit]"
|
|
37
|
+
>
|
|
18
38
|
{children}
|
|
19
39
|
</ScrollAreaPrimitive.Viewport>
|
|
20
40
|
<ScrollBar />
|
|
@@ -24,9 +24,11 @@ const skeletonVariants = cva(
|
|
|
24
24
|
accent: "bg-accent",
|
|
25
25
|
},
|
|
26
26
|
size: {
|
|
27
|
-
|
|
27
|
+
md: "",
|
|
28
28
|
sm: "scale-90",
|
|
29
29
|
lg: "scale-110",
|
|
30
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
31
|
+
default: "",
|
|
30
32
|
},
|
|
31
33
|
shape: {
|
|
32
34
|
rect: "rounded-md",
|
|
@@ -41,7 +43,7 @@ const skeletonVariants = cva(
|
|
|
41
43
|
},
|
|
42
44
|
defaultVariants: {
|
|
43
45
|
variant: "default",
|
|
44
|
-
size: "
|
|
46
|
+
size: "md",
|
|
45
47
|
shape: "rect",
|
|
46
48
|
animation: "pulse",
|
|
47
49
|
},
|
|
@@ -144,10 +146,25 @@ export const Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(
|
|
|
144
146
|
}
|
|
145
147
|
|
|
146
148
|
const SkeletonElement = useMotion ? motion.div : "div";
|
|
147
|
-
|
|
149
|
+
|
|
148
150
|
return (
|
|
149
151
|
<SkeletonElement
|
|
150
152
|
ref={ref}
|
|
153
|
+
/**
|
|
154
|
+
* #320: Skeleton hiçbir a11y işareti taşımıyordu — ne `aria-hidden`, ne `role`,
|
|
155
|
+
* ne `aria-busy`. Radix kullanmadığı için kalıtsal semantik de yok.
|
|
156
|
+
*
|
|
157
|
+
* Konvansiyon olarak `aria-hidden` seçildi (`role="status"` DEĞİL): tek bir yükleme
|
|
158
|
+
* durumu tipik olarak ONLARCA skeleton render eder (`SkeletonText` tek başına N satır
|
|
159
|
+
* basar) — her biri canlı bölge olsaydı ekran okuyucu aynı olayı N kez duyururdu.
|
|
160
|
+
* "Yükleniyor" duyurusunun sahibi `spinner.tsx:79-105` (`role="status"` +
|
|
161
|
+
* `aria-live="polite"` + `sr-only` etiket); skeleton onun görsel yer tutucusudur.
|
|
162
|
+
* Tüketici kapsayıcıya `aria-busy` koyarak durumu bildirir.
|
|
163
|
+
*
|
|
164
|
+
* Yalnız YER TUTUCU dalında: `isLoaded && children` dalı gerçek içerik döndürür ve
|
|
165
|
+
* yukarıda kasıtlı olarak işaretlenmemiştir.
|
|
166
|
+
*/
|
|
167
|
+
aria-hidden="true"
|
|
151
168
|
className={cn(
|
|
152
169
|
"moonui-theme",
|
|
153
170
|
skeletonVariants({ variant, size, shape, animation }),
|
|
@@ -18,13 +18,15 @@ const sliderVariants = cva(
|
|
|
18
18
|
variants: {
|
|
19
19
|
size: {
|
|
20
20
|
sm: "h-5",
|
|
21
|
+
md: "h-6",
|
|
22
|
+
lg: "h-8",
|
|
23
|
+
xl: "h-10",
|
|
24
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
21
25
|
default: "h-6",
|
|
22
|
-
md: "h-8",
|
|
23
|
-
lg: "h-10",
|
|
24
26
|
},
|
|
25
27
|
},
|
|
26
28
|
defaultVariants: {
|
|
27
|
-
size: "
|
|
29
|
+
size: "md",
|
|
28
30
|
},
|
|
29
31
|
}
|
|
30
32
|
)
|
|
@@ -84,14 +86,16 @@ const sliderThumbVariants = cva(
|
|
|
84
86
|
},
|
|
85
87
|
size: {
|
|
86
88
|
sm: "h-3 w-3",
|
|
89
|
+
md: "h-4 w-4",
|
|
90
|
+
lg: "h-5 w-5",
|
|
91
|
+
xl: "h-6 w-6",
|
|
92
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
87
93
|
default: "h-4 w-4",
|
|
88
|
-
md: "h-5 w-5",
|
|
89
|
-
lg: "h-6 w-6",
|
|
90
94
|
},
|
|
91
95
|
},
|
|
92
96
|
defaultVariants: {
|
|
93
97
|
variant: "primary",
|
|
94
|
-
size: "
|
|
98
|
+
size: "md",
|
|
95
99
|
},
|
|
96
100
|
}
|
|
97
101
|
)
|
|
@@ -46,13 +46,15 @@ const tableVariants = cva(
|
|
|
46
46
|
},
|
|
47
47
|
size: {
|
|
48
48
|
sm: "text-xs",
|
|
49
|
-
|
|
49
|
+
md: "text-sm",
|
|
50
50
|
lg: "text-base",
|
|
51
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
52
|
+
default: "text-sm",
|
|
51
53
|
},
|
|
52
54
|
},
|
|
53
55
|
defaultVariants: {
|
|
54
56
|
variant: "default",
|
|
55
|
-
size: "
|
|
57
|
+
size: "md",
|
|
56
58
|
},
|
|
57
59
|
}
|
|
58
60
|
);
|
|
@@ -27,7 +27,10 @@ import { toggleVariants } from "./toggle"
|
|
|
27
27
|
const ToggleGroupContext = React.createContext<
|
|
28
28
|
VariantProps<typeof toggleVariants>
|
|
29
29
|
>({
|
|
30
|
-
|
|
30
|
+
// #319: kanonik skalada `default` bir basamak ADI değil; `toggleVariants` artık `md`
|
|
31
|
+
// kullanıyor (aynı CSS: h-10 px-3). Context varsayılanı da ona hizalandı — aksi hâlde
|
|
32
|
+
// context, deprecated alias'ı item'lara yayardı.
|
|
33
|
+
size: "md",
|
|
31
34
|
variant: "default",
|
|
32
35
|
})
|
|
33
36
|
|
|
@@ -16,14 +16,16 @@ const toggleVariants = cva(
|
|
|
16
16
|
"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",
|
|
17
17
|
},
|
|
18
18
|
size: {
|
|
19
|
-
|
|
19
|
+
md: "h-10 px-3",
|
|
20
20
|
sm: "h-9 px-2.5",
|
|
21
21
|
lg: "h-11 px-5",
|
|
22
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
23
|
+
default: "h-10 px-3",
|
|
22
24
|
},
|
|
23
25
|
},
|
|
24
26
|
defaultVariants: {
|
|
25
27
|
variant: "default",
|
|
26
|
-
size: "
|
|
28
|
+
size: "md",
|
|
27
29
|
},
|
|
28
30
|
}
|
|
29
31
|
)
|