@moontra/moonui 6.9.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/index.d.mts +34 -33
- package/dist/index.d.ts +34 -33
- package/dist/index.global.js +6 -6
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +114 -71
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +114 -71
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- 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__/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/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 +4 -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/skeleton.tsx +4 -2
- 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
package/package.json
CHANGED
|
@@ -84,13 +84,13 @@ describe('Checkbox Components', () => {
|
|
|
84
84
|
it('renders md size correctly', () => {
|
|
85
85
|
render(<Checkbox size="md" data-testid="checkbox" />)
|
|
86
86
|
const checkbox = screen.getByTestId('checkbox')
|
|
87
|
-
expect(checkbox).toHaveClass('h-
|
|
87
|
+
expect(checkbox).toHaveClass('h-4', 'w-4')
|
|
88
88
|
})
|
|
89
89
|
|
|
90
90
|
it('renders lg size correctly', () => {
|
|
91
91
|
render(<Checkbox size="lg" data-testid="checkbox" />)
|
|
92
92
|
const checkbox = screen.getByTestId('checkbox')
|
|
93
|
-
expect(checkbox).toHaveClass('h-
|
|
93
|
+
expect(checkbox).toHaveClass('h-5', 'w-5')
|
|
94
94
|
})
|
|
95
95
|
|
|
96
96
|
it('uses default size as default', () => {
|
|
@@ -538,7 +538,7 @@ describe('Checkbox Components', () => {
|
|
|
538
538
|
|
|
539
539
|
const checkbox = screen.getByTestId('checkbox')
|
|
540
540
|
expect(checkbox).toHaveClass('bg-transparent')
|
|
541
|
-
expect(checkbox).toHaveClass('h-
|
|
541
|
+
expect(checkbox).toHaveClass('h-5', 'w-5')
|
|
542
542
|
expect(checkbox).toHaveClass('rounded-full')
|
|
543
543
|
expect(checkbox).toHaveClass('transition-all')
|
|
544
544
|
expect(checkbox).toHaveClass('custom-class')
|
|
@@ -197,7 +197,7 @@ describe('Collapsible Components', () => {
|
|
|
197
197
|
)
|
|
198
198
|
|
|
199
199
|
const trigger = screen.getByTestId('trigger')
|
|
200
|
-
expect(trigger).toHaveClass('text-
|
|
200
|
+
expect(trigger).toHaveClass('text-sm')
|
|
201
201
|
})
|
|
202
202
|
|
|
203
203
|
it('renders lg size correctly', () => {
|
|
@@ -211,7 +211,7 @@ describe('Collapsible Components', () => {
|
|
|
211
211
|
)
|
|
212
212
|
|
|
213
213
|
const trigger = screen.getByTestId('trigger')
|
|
214
|
-
expect(trigger).toHaveClass('text-
|
|
214
|
+
expect(trigger).toHaveClass('text-base')
|
|
215
215
|
})
|
|
216
216
|
|
|
217
217
|
it('renders chevron icon', () => {
|
|
@@ -382,7 +382,7 @@ describe('Collapsible Components', () => {
|
|
|
382
382
|
)
|
|
383
383
|
|
|
384
384
|
const content = screen.getByTestId('content')
|
|
385
|
-
expect(content).toHaveClass('text-
|
|
385
|
+
expect(content).toHaveClass('text-sm')
|
|
386
386
|
})
|
|
387
387
|
|
|
388
388
|
it('renders lg size correctly', () => {
|
|
@@ -396,7 +396,7 @@ describe('Collapsible Components', () => {
|
|
|
396
396
|
)
|
|
397
397
|
|
|
398
398
|
const content = screen.getByTestId('content')
|
|
399
|
-
expect(content).toHaveClass('text-
|
|
399
|
+
expect(content).toHaveClass('text-base')
|
|
400
400
|
})
|
|
401
401
|
|
|
402
402
|
it('renders content wrapper with padding', () => {
|
|
@@ -438,7 +438,7 @@ describe('Collapsible Components', () => {
|
|
|
438
438
|
it('collapsibleContentVariants generates correct classes', () => {
|
|
439
439
|
expect(collapsibleContentVariants()).toContain('overflow-hidden transition-all')
|
|
440
440
|
expect(collapsibleContentVariants({ variant: 'outline' })).toContain('border')
|
|
441
|
-
expect(collapsibleContentVariants({ size: 'lg' })).toContain('text-
|
|
441
|
+
expect(collapsibleContentVariants({ size: 'lg' })).toContain('text-base')
|
|
442
442
|
})
|
|
443
443
|
})
|
|
444
444
|
|
|
@@ -252,7 +252,7 @@ describe('Dialog Components', () => {
|
|
|
252
252
|
</Dialog>
|
|
253
253
|
)
|
|
254
254
|
|
|
255
|
-
expect(screen.getByTestId('content')).toHaveClass('max-w-
|
|
255
|
+
expect(screen.getByTestId('content')).toHaveClass('max-w-lg p-6')
|
|
256
256
|
})
|
|
257
257
|
|
|
258
258
|
it('renders different radius variants', () => {
|
|
@@ -685,7 +685,7 @@ describe('Dialog Components', () => {
|
|
|
685
685
|
const content = screen.getByTestId('dialog-content')
|
|
686
686
|
expect(content).toHaveClass('custom-dialog')
|
|
687
687
|
expect(content).toHaveClass('border-primary/20 dark:border-primary/30')
|
|
688
|
-
expect(content).toHaveClass('max-w-
|
|
688
|
+
expect(content).toHaveClass('max-w-lg p-6')
|
|
689
689
|
expect(content).toHaveClass('rounded-2xl')
|
|
690
690
|
expect(content).toHaveClass('top-[5%]')
|
|
691
691
|
expect(screen.getByTestId('dialog-title')).toHaveTextContent('Advanced Dialog')
|
|
@@ -122,19 +122,19 @@ describe('Progress Component', () => {
|
|
|
122
122
|
it('renders md size correctly', () => {
|
|
123
123
|
render(<Progress size="md" />)
|
|
124
124
|
const progress = screen.getByRole('progressbar')
|
|
125
|
-
expect(progress).toHaveClass('h-2
|
|
125
|
+
expect(progress).toHaveClass('h-2')
|
|
126
126
|
})
|
|
127
127
|
|
|
128
128
|
it('renders lg size correctly', () => {
|
|
129
129
|
render(<Progress size="lg" />)
|
|
130
130
|
const progress = screen.getByRole('progressbar')
|
|
131
|
-
expect(progress).toHaveClass('h-
|
|
131
|
+
expect(progress).toHaveClass('h-2.5')
|
|
132
132
|
})
|
|
133
133
|
|
|
134
134
|
it('renders xl size correctly', () => {
|
|
135
135
|
render(<Progress size="xl" />)
|
|
136
136
|
const progress = screen.getByRole('progressbar')
|
|
137
|
-
expect(progress).toHaveClass('h-
|
|
137
|
+
expect(progress).toHaveClass('h-3')
|
|
138
138
|
})
|
|
139
139
|
})
|
|
140
140
|
|
|
@@ -327,7 +327,7 @@ describe('Progress Component', () => {
|
|
|
327
327
|
|
|
328
328
|
const progress = screen.getByRole('progressbar')
|
|
329
329
|
expect(progress).toHaveClass('bg-success/20')
|
|
330
|
-
expect(progress).toHaveClass('h-
|
|
330
|
+
expect(progress).toHaveClass('h-2.5')
|
|
331
331
|
expect(progress).toHaveClass('rounded-sm')
|
|
332
332
|
expect(progress).toHaveClass('[&>div]:duration-300')
|
|
333
333
|
|
|
@@ -199,7 +199,7 @@ describe('RadioGroup Components', () => {
|
|
|
199
199
|
)
|
|
200
200
|
|
|
201
201
|
const label = screen.getByDisplayValue('test').nextElementSibling
|
|
202
|
-
expect(label).toHaveClass('h-
|
|
202
|
+
expect(label).toHaveClass('h-4', 'w-4')
|
|
203
203
|
})
|
|
204
204
|
|
|
205
205
|
it('renders lg size correctly', () => {
|
|
@@ -210,7 +210,7 @@ describe('RadioGroup Components', () => {
|
|
|
210
210
|
)
|
|
211
211
|
|
|
212
212
|
const label = screen.getByDisplayValue('test').nextElementSibling
|
|
213
|
-
expect(label).toHaveClass('h-
|
|
213
|
+
expect(label).toHaveClass('h-5', 'w-5')
|
|
214
214
|
})
|
|
215
215
|
|
|
216
216
|
it('renders custom indicator when checked', () => {
|
|
@@ -466,8 +466,8 @@ describe('RadioGroup Components', () => {
|
|
|
466
466
|
const filledItem = screen.getByDisplayValue('filled').nextElementSibling
|
|
467
467
|
|
|
468
468
|
expect(defaultItem).toHaveClass('h-3.5', 'w-3.5', 'border-border', 'bg-background')
|
|
469
|
-
expect(outlineItem).toHaveClass('h-
|
|
470
|
-
expect(filledItem).toHaveClass('h-
|
|
469
|
+
expect(outlineItem).toHaveClass('h-4', 'w-4', 'border-border', 'bg-transparent')
|
|
470
|
+
expect(filledItem).toHaveClass('h-5', 'w-5', 'border-primary', 'bg-primary/10')
|
|
471
471
|
})
|
|
472
472
|
|
|
473
473
|
it('handles name attribute for form submission', () => {
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #319 — `size` skalası konvansiyon bekçisi (free paket).
|
|
3
|
+
*
|
|
4
|
+
* Bu test bir component'i değil, **kütüphane genelindeki API tutarlılığını** koruyor.
|
|
5
|
+
* Denetim öncesi durum: 80 `size` varyant haritası, **23 farklı skala**; orta basamak kimi
|
|
6
|
+
* yerde `default`, kimi yerde `md`, **17 haritada İKİSİ BİRDEN ayrı basamak** olarak. Sonuç:
|
|
7
|
+
* `size="md"` bazı component'lerde çalışıyor, bazılarında sessizce varsayılana düşüyordu; ve
|
|
8
|
+
* `default` ile `md` **farklı** şeyler üretiyordu (ör. checkbox 16px vs 20px).
|
|
9
|
+
*
|
|
10
|
+
* Kanonik karar: `xs · sm · md · lg · xl · 2xl · 3xl · 4xl · 5xl`.
|
|
11
|
+
* `default` bir AD değil, bir varsayılan-işaretidir → CVA'da yeri `defaultVariants`.
|
|
12
|
+
* Geri uyum için `default` anahtarı **saf alias** olarak korunuyor (en az bir minor sürüm).
|
|
13
|
+
*
|
|
14
|
+
* Yeni bir component eklerken bu testin kırılması, skalanın sapmaya başladığı anlamına gelir.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'fs'
|
|
17
|
+
import * as path from 'path'
|
|
18
|
+
|
|
19
|
+
/** Sıralı boyut basamakları — kanonik skala. */
|
|
20
|
+
const CANONICAL_STEPS = ['xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl', '4xl', '5xl']
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Boyut basamağı OLMAYAN, ama `size` ekseninde meşru olan özel değerler.
|
|
24
|
+
* Bunlar bir ölçek üzerinde yer tutmaz; ayrı bir davranış seçer.
|
|
25
|
+
*/
|
|
26
|
+
const SPECIAL_VALUES = ['icon', 'full', 'fullscreen', 'auto', 'responsive']
|
|
27
|
+
|
|
28
|
+
/** Geriye dönük uyum için korunan, kaldırılması planlanan alias. */
|
|
29
|
+
const DEPRECATED_ALIAS = 'default'
|
|
30
|
+
|
|
31
|
+
const ALLOWED = new Set([...CANONICAL_STEPS, ...SPECIAL_VALUES, DEPRECATED_ALIAS])
|
|
32
|
+
|
|
33
|
+
interface SizeMap {
|
|
34
|
+
file: string
|
|
35
|
+
line: number
|
|
36
|
+
entries: Array<[string, string]>
|
|
37
|
+
defaultVariant: string | null
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function collectSizeMaps(root: string): SizeMap[] {
|
|
41
|
+
const files: string[] = []
|
|
42
|
+
;(function walk(dir: string) {
|
|
43
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
44
|
+
const p = path.join(dir, e.name)
|
|
45
|
+
if (e.isDirectory()) {
|
|
46
|
+
if (!/node_modules|__tests__|dist/.test(p)) walk(p)
|
|
47
|
+
} else if (/\.tsx?$/.test(e.name) && !/\.stories\./.test(e.name)) {
|
|
48
|
+
files.push(p)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
})(root)
|
|
52
|
+
|
|
53
|
+
const maps: SizeMap[] = []
|
|
54
|
+
for (const f of files) {
|
|
55
|
+
const src = fs.readFileSync(f, 'utf8')
|
|
56
|
+
const re = /\bsize:\s*\{/g
|
|
57
|
+
let m: RegExpExecArray | null
|
|
58
|
+
while ((m = re.exec(src))) {
|
|
59
|
+
// dengeli parantezle bloğu çıkar
|
|
60
|
+
let i = src.indexOf('{', m.index)
|
|
61
|
+
let depth = 0
|
|
62
|
+
let end = i
|
|
63
|
+
for (; end < src.length; end++) {
|
|
64
|
+
if (src[end] === '{') depth++
|
|
65
|
+
else if (src[end] === '}') {
|
|
66
|
+
depth--
|
|
67
|
+
if (depth === 0) break
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const body = src.slice(i + 1, end)
|
|
71
|
+
const entries = [
|
|
72
|
+
...body.matchAll(/\n[ \t]*(["']?)([A-Za-z0-9_]+)\1[ \t]*:[ \t]*(["'])([\s\S]*?)\3/g),
|
|
73
|
+
].map((x) => [x[2], x[4].replace(/\s+/g, ' ').trim()] as [string, string])
|
|
74
|
+
if (!entries.length) {
|
|
75
|
+
re.lastIndex = end
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
const dvBlock = src.slice(end).match(/defaultVariants:\s*\{([^}]*)\}/)
|
|
79
|
+
const dv = dvBlock?.[1].match(/\bsize\s*:\s*["']([^"']+)["']/)?.[1] ?? null
|
|
80
|
+
maps.push({
|
|
81
|
+
file: path.relative(process.cwd(), f),
|
|
82
|
+
line: src.slice(0, m.index).split('\n').length,
|
|
83
|
+
entries,
|
|
84
|
+
defaultVariant: dv,
|
|
85
|
+
})
|
|
86
|
+
re.lastIndex = end
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return maps
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const SRC_ROOT = path.resolve(__dirname, '../../..')
|
|
93
|
+
const maps = collectSizeMaps(SRC_ROOT)
|
|
94
|
+
|
|
95
|
+
describe('#319 size skalası konvansiyonu (free)', () => {
|
|
96
|
+
it('taranacak size haritası buldu (tarayıcının kendisi sessizce boşa düşmesin)', () => {
|
|
97
|
+
// Bu koruma olmadan, regex bozulduğunda tüm testler "0 harita" ile YEŞİL geçerdi.
|
|
98
|
+
expect(maps.length).toBeGreaterThan(20)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('her size anahtarı kanonik sözlükte', () => {
|
|
102
|
+
const sapmalar = maps.flatMap((m) =>
|
|
103
|
+
m.entries
|
|
104
|
+
.map(([k]) => k)
|
|
105
|
+
.filter((k) => !ALLOWED.has(k))
|
|
106
|
+
.map((k) => `${m.file}:${m.line} → "${k}"`)
|
|
107
|
+
)
|
|
108
|
+
expect(sapmalar).toEqual([])
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('`default` yalnız SAF ALIAS olarak var — başka bir basamakla aynı değeri taşır', () => {
|
|
112
|
+
const ihlaller = maps
|
|
113
|
+
.filter((m) => m.entries.some(([k]) => k === DEPRECATED_ALIAS))
|
|
114
|
+
.filter((m) => {
|
|
115
|
+
const val = m.entries.find(([k]) => k === DEPRECATED_ALIAS)![1]
|
|
116
|
+
// aynı değeri taşıyan, `default` olmayan en az bir anahtar bulunmalı
|
|
117
|
+
return !m.entries.some(([k, v]) => k !== DEPRECATED_ALIAS && v === val)
|
|
118
|
+
})
|
|
119
|
+
.map((m) => `${m.file}:${m.line}`)
|
|
120
|
+
expect(ihlaller).toEqual([])
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('`defaultVariants.size` kanonik bir ada işaret eder, `default`a DEĞİL', () => {
|
|
124
|
+
const ihlaller = maps
|
|
125
|
+
.filter((m) => m.defaultVariant === DEPRECATED_ALIAS)
|
|
126
|
+
.map((m) => `${m.file}:${m.line}`)
|
|
127
|
+
expect(ihlaller).toEqual([])
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Denetimin asıl bulgusu buydu: `default` ile `md` **ayrı basamaklar** olduğu için
|
|
132
|
+
* `size="default"` ve `size="md"` farklı şeyler üretiyordu (checkbox 16px vs 20px).
|
|
133
|
+
*
|
|
134
|
+
* Kural `default === md` DEĞİL — dialog'da `md` (max-w-md) varsayılandan küçüktü, orada
|
|
135
|
+
* `default` bilerek `lg`ye eşlendi. Doğru ve daha güçlü kural: `default`, component'in
|
|
136
|
+
* gerçekten varsayılan olarak ürettiği şeyin alias'ı olmalı. Böylece `size="default"`
|
|
137
|
+
* yazan tüketici, prop hiç vermemiş gibi bir sonuç alır.
|
|
138
|
+
*/
|
|
139
|
+
it('`default`, `defaultVariants`ın işaret ettiği basamakla AYNI değeri üretir', () => {
|
|
140
|
+
const ihlaller = maps
|
|
141
|
+
.filter((m) => m.entries.some(([k]) => k === DEPRECATED_ALIAS))
|
|
142
|
+
.filter((m) => {
|
|
143
|
+
const aliasVal = m.entries.find(([k]) => k === DEPRECATED_ALIAS)![1]
|
|
144
|
+
const dvVal = m.entries.find(([k]) => k === m.defaultVariant)?.[1]
|
|
145
|
+
return dvVal === undefined || aliasVal !== dvVal
|
|
146
|
+
})
|
|
147
|
+
.map((m) => `${m.file}:${m.line} (default→"${m.defaultVariant}")`)
|
|
148
|
+
expect(ihlaller).toEqual([])
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* CVA DIŞI kaçış yolu. `AdvancedColorPicker` (pro) `size`'ı bir cva varyantı değil, elle
|
|
153
|
+
* yazılmış bir TS union + `sizeClasses` sözlüğü olarak tutuyordu — bu yüzden hem otomatik
|
|
154
|
+
* migrasyondan hem de yukarıdaki cva tabanlı kurallardan KAÇTI ve `"sm" | "default" | "lg"`
|
|
155
|
+
* olarak kaldı. Docs senkronu sırasında yakalandı; bu kural o boşluğu kapatır.
|
|
156
|
+
*/
|
|
157
|
+
it('elle yazılmış `size?:` union tipleri de kanonik skalayı kullanır', () => {
|
|
158
|
+
const files: string[] = []
|
|
159
|
+
;(function walk(dir: string) {
|
|
160
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
161
|
+
const p = path.join(dir, e.name)
|
|
162
|
+
if (e.isDirectory()) {
|
|
163
|
+
if (!/node_modules|__tests__|dist/.test(p)) walk(p)
|
|
164
|
+
} else if (/\.tsx?$/.test(e.name) && !/\.stories\./.test(e.name)) files.push(p)
|
|
165
|
+
}
|
|
166
|
+
})(SRC_ROOT)
|
|
167
|
+
|
|
168
|
+
const ihlaller: string[] = []
|
|
169
|
+
for (const f of files) {
|
|
170
|
+
const src = fs.readFileSync(f, 'utf8')
|
|
171
|
+
for (const m of src.matchAll(/\bsize\??\s*:\s*((?:"[a-zA-Z0-9_]+"\s*\|\s*)+"[a-zA-Z0-9_]+")/g)) {
|
|
172
|
+
const values = [...m[1].matchAll(/"([a-zA-Z0-9_]+)"/g)].map((x) => x[1])
|
|
173
|
+
const yer = `${path.relative(process.cwd(), f)}:${src.slice(0, m.index).split('\n').length}`
|
|
174
|
+
|
|
175
|
+
// (a) sözlük dışı bir değer
|
|
176
|
+
const disi = values.filter((v) => !ALLOWED.has(v))
|
|
177
|
+
if (disi.length) ihlaller.push(`${yer} → sözlük dışı: ${disi.join(', ')}`)
|
|
178
|
+
|
|
179
|
+
// (b) `default` ALIAS'tır: kanonik adın YERİNE geçemez, yanında durur.
|
|
180
|
+
// `"sm" | "default" | "lg"` gibi bir union `md`yi hiç sunmadığı için ihlaldir —
|
|
181
|
+
// color-picker tam olarak bu şekilde migrasyondan kaçmıştı.
|
|
182
|
+
if (values.includes(DEPRECATED_ALIAS) && !values.includes('md')) {
|
|
183
|
+
ihlaller.push(`${yer} → \`default\` var ama kanonik \`md\` YOK`)
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
expect(ihlaller).toEqual([])
|
|
188
|
+
})
|
|
189
|
+
})
|
|
@@ -53,14 +53,14 @@ describe('Slider Component', () => {
|
|
|
53
53
|
render(<Slider size="md" data-testid="slider" />)
|
|
54
54
|
|
|
55
55
|
const sliderContainer = screen.getByTestId('slider').children[0] as HTMLElement
|
|
56
|
-
expect(sliderContainer).toHaveClass('h-
|
|
56
|
+
expect(sliderContainer).toHaveClass('h-6')
|
|
57
57
|
})
|
|
58
58
|
|
|
59
59
|
it('renders lg size correctly', () => {
|
|
60
60
|
render(<Slider size="lg" data-testid="slider" />)
|
|
61
61
|
|
|
62
62
|
const sliderContainer = screen.getByTestId('slider').children[0] as HTMLElement
|
|
63
|
-
expect(sliderContainer).toHaveClass('h-
|
|
63
|
+
expect(sliderContainer).toHaveClass('h-8')
|
|
64
64
|
})
|
|
65
65
|
})
|
|
66
66
|
|
|
@@ -180,14 +180,14 @@ describe('Slider Component', () => {
|
|
|
180
180
|
render(<Slider thumbSize="md" data-testid="slider" />)
|
|
181
181
|
|
|
182
182
|
const thumb = screen.getByRole('slider')
|
|
183
|
-
expect(thumb).toHaveClass('h-
|
|
183
|
+
expect(thumb).toHaveClass('h-4', 'w-4')
|
|
184
184
|
})
|
|
185
185
|
|
|
186
186
|
it('renders lg thumb size correctly', () => {
|
|
187
187
|
render(<Slider thumbSize="lg" data-testid="slider" />)
|
|
188
188
|
|
|
189
189
|
const thumb = screen.getByRole('slider')
|
|
190
|
-
expect(thumb).toHaveClass('h-
|
|
190
|
+
expect(thumb).toHaveClass('h-5', 'w-5')
|
|
191
191
|
})
|
|
192
192
|
})
|
|
193
193
|
|
|
@@ -30,9 +30,11 @@ const alertVariants = cva(
|
|
|
30
30
|
},
|
|
31
31
|
size: {
|
|
32
32
|
sm: "py-2 text-xs",
|
|
33
|
-
|
|
33
|
+
md: "py-3 text-sm",
|
|
34
34
|
lg: "py-4 text-base",
|
|
35
|
-
|
|
35
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
36
|
+
default: "py-3 text-sm",
|
|
37
|
+
},
|
|
36
38
|
radius: {
|
|
37
39
|
none: "rounded-none",
|
|
38
40
|
sm: "rounded-sm",
|
|
@@ -46,7 +48,7 @@ const alertVariants = cva(
|
|
|
46
48
|
},
|
|
47
49
|
defaultVariants: {
|
|
48
50
|
variant: "default",
|
|
49
|
-
size: "
|
|
51
|
+
size: "md",
|
|
50
52
|
radius: "default",
|
|
51
53
|
withClose: false,
|
|
52
54
|
},
|
|
@@ -11,13 +11,14 @@ const avatarVariants = cva(
|
|
|
11
11
|
{
|
|
12
12
|
variants: {
|
|
13
13
|
size: {
|
|
14
|
-
default: "h-10 w-10",
|
|
15
14
|
xs: "h-6 w-6",
|
|
16
15
|
sm: "h-8 w-8",
|
|
17
16
|
md: "h-10 w-10",
|
|
18
17
|
lg: "h-12 w-12",
|
|
19
18
|
xl: "h-16 w-16",
|
|
20
19
|
"2xl": "h-20 w-20",
|
|
20
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
21
|
+
default: "h-10 w-10",
|
|
21
22
|
},
|
|
22
23
|
radius: {
|
|
23
24
|
default: "rounded-full",
|
|
@@ -34,7 +35,7 @@ const avatarVariants = cva(
|
|
|
34
35
|
}
|
|
35
36
|
},
|
|
36
37
|
defaultVariants: {
|
|
37
|
-
size: "
|
|
38
|
+
size: "md",
|
|
38
39
|
radius: "default",
|
|
39
40
|
variant: "default"
|
|
40
41
|
},
|
|
@@ -17,14 +17,16 @@ const breadcrumbVariants = cva(
|
|
|
17
17
|
ghost: "text-foreground/60 transition-colors",
|
|
18
18
|
},
|
|
19
19
|
size: {
|
|
20
|
-
|
|
20
|
+
md: "text-sm",
|
|
21
21
|
sm: "text-xs",
|
|
22
22
|
lg: "text-base",
|
|
23
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
24
|
+
default: "text-sm",
|
|
23
25
|
},
|
|
24
26
|
},
|
|
25
27
|
defaultVariants: {
|
|
26
28
|
variant: "default",
|
|
27
|
-
size: "
|
|
29
|
+
size: "md",
|
|
28
30
|
},
|
|
29
31
|
}
|
|
30
32
|
);
|
|
@@ -35,10 +35,12 @@ const cardVariants = cva(
|
|
|
35
35
|
glass: "border border-white/20 bg-white/10 backdrop-blur-md dark:border-gray-700/30 dark:bg-gray-800/10",
|
|
36
36
|
},
|
|
37
37
|
size: {
|
|
38
|
-
|
|
38
|
+
md: "",
|
|
39
39
|
sm: "",
|
|
40
40
|
lg: "",
|
|
41
41
|
xl: "",
|
|
42
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
43
|
+
default: "",
|
|
42
44
|
},
|
|
43
45
|
radius: {
|
|
44
46
|
default: "rounded-lg",
|
|
@@ -54,7 +56,7 @@ const cardVariants = cva(
|
|
|
54
56
|
},
|
|
55
57
|
defaultVariants: {
|
|
56
58
|
variant: "default",
|
|
57
|
-
size: "
|
|
59
|
+
size: "md",
|
|
58
60
|
radius: "default",
|
|
59
61
|
},
|
|
60
62
|
}
|
|
@@ -26,9 +26,11 @@ const checkboxVariants = cva(
|
|
|
26
26
|
},
|
|
27
27
|
size: {
|
|
28
28
|
sm: "h-3.5 w-3.5",
|
|
29
|
+
md: "h-4 w-4",
|
|
30
|
+
lg: "h-5 w-5",
|
|
31
|
+
xl: "h-6 w-6",
|
|
32
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
29
33
|
default: "h-4 w-4",
|
|
30
|
-
md: "h-5 w-5",
|
|
31
|
-
lg: "h-6 w-6",
|
|
32
34
|
},
|
|
33
35
|
radius: {
|
|
34
36
|
none: "rounded-none",
|
|
@@ -46,7 +48,7 @@ const checkboxVariants = cva(
|
|
|
46
48
|
},
|
|
47
49
|
defaultVariants: {
|
|
48
50
|
variant: "default",
|
|
49
|
-
size: "
|
|
51
|
+
size: "md",
|
|
50
52
|
radius: "default",
|
|
51
53
|
animation: "default",
|
|
52
54
|
},
|
|
@@ -27,14 +27,16 @@ const collapsibleTriggerVariants = cva(
|
|
|
27
27
|
},
|
|
28
28
|
size: {
|
|
29
29
|
sm: "text-xs py-2 px-3",
|
|
30
|
+
md: "text-sm py-3 px-4",
|
|
31
|
+
lg: "text-base py-4 px-4",
|
|
32
|
+
xl: "text-lg py-5 px-5",
|
|
33
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
30
34
|
default: "text-sm py-3 px-4",
|
|
31
|
-
md: "text-base py-4 px-4",
|
|
32
|
-
lg: "text-lg py-5 px-5",
|
|
33
35
|
},
|
|
34
36
|
},
|
|
35
37
|
defaultVariants: {
|
|
36
38
|
variant: "default",
|
|
37
|
-
size: "
|
|
39
|
+
size: "md",
|
|
38
40
|
},
|
|
39
41
|
}
|
|
40
42
|
)
|
|
@@ -85,14 +87,16 @@ const collapsibleContentVariants = cva(
|
|
|
85
87
|
},
|
|
86
88
|
size: {
|
|
87
89
|
sm: "text-xs",
|
|
90
|
+
md: "text-sm",
|
|
91
|
+
lg: "text-base",
|
|
92
|
+
xl: "text-lg",
|
|
93
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
88
94
|
default: "text-sm",
|
|
89
|
-
md: "text-base",
|
|
90
|
-
lg: "text-lg",
|
|
91
95
|
},
|
|
92
96
|
},
|
|
93
97
|
defaultVariants: {
|
|
94
98
|
variant: "default",
|
|
95
|
-
size: "
|
|
99
|
+
size: "md",
|
|
96
100
|
},
|
|
97
101
|
}
|
|
98
102
|
)
|
|
@@ -27,10 +27,12 @@ const colorPickerVariants = cva(
|
|
|
27
27
|
{
|
|
28
28
|
variants: {
|
|
29
29
|
size: {
|
|
30
|
-
|
|
30
|
+
md: "h-10 w-10",
|
|
31
31
|
sm: "h-8 w-8",
|
|
32
32
|
lg: "h-12 w-12",
|
|
33
33
|
xl: "h-16 w-16",
|
|
34
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
35
|
+
default: "h-10 w-10",
|
|
34
36
|
},
|
|
35
37
|
shape: {
|
|
36
38
|
square: "rounded-md",
|
|
@@ -39,7 +41,7 @@ const colorPickerVariants = cva(
|
|
|
39
41
|
},
|
|
40
42
|
},
|
|
41
43
|
defaultVariants: {
|
|
42
|
-
size: "
|
|
44
|
+
size: "md",
|
|
43
45
|
shape: "square",
|
|
44
46
|
},
|
|
45
47
|
}
|
|
@@ -563,7 +565,8 @@ export interface SimpleColorPickerProps {
|
|
|
563
565
|
onChange?: (color: string) => void;
|
|
564
566
|
colors?: string[];
|
|
565
567
|
className?: string;
|
|
566
|
-
|
|
568
|
+
/** #319: kanonik skala; `default` `md`nin deprecated alias'ıdır. */
|
|
569
|
+
size?: "sm" | "md" | "lg" | "default";
|
|
567
570
|
}
|
|
568
571
|
|
|
569
572
|
export function SimpleColorPicker({
|
|
@@ -571,12 +574,15 @@ export function SimpleColorPicker({
|
|
|
571
574
|
onChange,
|
|
572
575
|
colors = defaultPresets.slice(0, 10),
|
|
573
576
|
className,
|
|
574
|
-
|
|
577
|
+
// #319: varsayılan kanonik ada çekildi (aynı CSS: h-8 w-8)
|
|
578
|
+
size = "md",
|
|
575
579
|
}: SimpleColorPickerProps) {
|
|
576
580
|
const sizeClasses = {
|
|
577
581
|
sm: "h-6 w-6",
|
|
578
|
-
|
|
582
|
+
md: "h-8 w-8",
|
|
579
583
|
lg: "h-10 w-10",
|
|
584
|
+
/** @deprecated `md` kullanın — #319 kanonik skala; aynı çıktıyı üretir. */
|
|
585
|
+
default: "h-8 w-8",
|
|
580
586
|
};
|
|
581
587
|
|
|
582
588
|
return (
|
|
@@ -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
|
)
|
|
@@ -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",
|