@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.
Files changed (42) hide show
  1. package/dist/hooks/index.global.js +1 -6
  2. package/dist/index.d.mts +44 -35
  3. package/dist/index.d.ts +44 -35
  4. package/dist/index.global.js +52 -365
  5. package/dist/index.global.js.map +1 -1
  6. package/dist/index.js +421 -359
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +385 -323
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/lib/theme.global.js +1 -14
  11. package/dist/lib/theme.global.js.map +1 -1
  12. package/package.json +1 -1
  13. package/src/components/ui/__tests__/carousel.test.tsx +37 -0
  14. package/src/components/ui/__tests__/checkbox.test.tsx +3 -3
  15. package/src/components/ui/__tests__/collapsible.test.tsx +5 -5
  16. package/src/components/ui/__tests__/dialog.test.tsx +2 -2
  17. package/src/components/ui/__tests__/progress.test.tsx +4 -4
  18. package/src/components/ui/__tests__/quality-group-de.test.tsx +159 -0
  19. package/src/components/ui/__tests__/radio-group.test.tsx +4 -4
  20. package/src/components/ui/__tests__/size-scale-convention.test.ts +189 -0
  21. package/src/components/ui/__tests__/slider.test.tsx +4 -4
  22. package/src/components/ui/alert.tsx +5 -3
  23. package/src/components/ui/avatar.tsx +3 -2
  24. package/src/components/ui/breadcrumb.tsx +4 -2
  25. package/src/components/ui/card.tsx +4 -2
  26. package/src/components/ui/carousel.tsx +24 -0
  27. package/src/components/ui/checkbox.tsx +5 -3
  28. package/src/components/ui/collapsible.tsx +10 -6
  29. package/src/components/ui/color-picker.tsx +11 -5
  30. package/src/components/ui/command.tsx +29 -2
  31. package/src/components/ui/date-picker.tsx +4 -2
  32. package/src/components/ui/dialog.tsx +7 -5
  33. package/src/components/ui/popover-pro.tsx +5 -3
  34. package/src/components/ui/popover.tsx +4 -2
  35. package/src/components/ui/progress.tsx +6 -4
  36. package/src/components/ui/radio-group.tsx +5 -3
  37. package/src/components/ui/scroll-area.tsx +23 -3
  38. package/src/components/ui/skeleton.tsx +20 -3
  39. package/src/components/ui/slider.tsx +10 -6
  40. package/src/components/ui/table.tsx +4 -2
  41. package/src/components/ui/toggle-group.tsx +4 -1
  42. 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
- default: "min-h-[300px]",
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: "default",
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
- default: "h-10 px-4 py-2",
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: "default",
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
- default: "max-w-lg p-6",
76
+ lg: "max-w-lg p-6",
77
77
  md: "max-w-md p-6",
78
- lg: "max-w-2xl p-7",
79
- xl: "max-w-4xl p-8",
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: "default",
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
- default: "w-72 p-4",
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: "default",
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
- default: "w-72 p-4",
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: "default",
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: "default",
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: "default",
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
- React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
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
- <ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
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
- default: "",
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: "default",
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: "default",
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: "default",
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
- default: "text-sm",
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: "default",
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
- size: "default",
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
- default: "h-10 px-3",
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: "default",
28
+ size: "md",
27
29
  },
28
30
  }
29
31
  )