@moontra/moonui 6.6.0 → 6.7.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 +6 -1
- package/dist/hooks/index.global.js.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.global.js +52 -365
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/ui/__tests__/dead-code-group-b.test.tsx +105 -0
- package/src/components/ui/accordion.tsx +7 -1
- package/src/components/ui/card.tsx +17 -1
- package/src/components/ui/popover.tsx +12 -2
- package/src/components/ui/progress.tsx +6 -1
package/package.json
CHANGED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { render, screen, waitFor } from '@testing-library/react'
|
|
2
|
+
import * as React from 'react'
|
|
3
|
+
import { Popover, PopoverTrigger, PopoverContent } from '../popover'
|
|
4
|
+
import { Progress } from '../progress'
|
|
5
|
+
import { Card } from '../card'
|
|
6
|
+
import { Accordion, AccordionItem, AccordionTrigger } from '../accordion'
|
|
7
|
+
import '@testing-library/jest-dom'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Kalite grubu B — "deklare edilmiş ama çalışmıyor" sınıfı (#307/#310/#316/#318).
|
|
11
|
+
*
|
|
12
|
+
* Bu suite ÖLÜ SINIF/PROP'ların geri gelmesini engeller. Ölü sınıf sinsi bir
|
|
13
|
+
* regresyondur: kod niyeti taşır, tsc geçer, test yazılmamışsa kimse fark etmez.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
describe('#316 popover — `side` Radix\'e gerçekten ulaşıyor', () => {
|
|
17
|
+
it('side="right" verilince içerik data-side="right" taşır', async () => {
|
|
18
|
+
render(
|
|
19
|
+
<Popover defaultOpen>
|
|
20
|
+
<PopoverTrigger>aç</PopoverTrigger>
|
|
21
|
+
<PopoverContent side="right">içerik</PopoverContent>
|
|
22
|
+
</Popover>
|
|
23
|
+
)
|
|
24
|
+
// ÖNCESİ: `side` yalnız CVA className seçiyordu, Radix'e hiç geçmiyordu →
|
|
25
|
+
// data-side her zaman varsayılan "bottom" kalıyordu.
|
|
26
|
+
await waitFor(() => {
|
|
27
|
+
const content = screen.getByText('içerik')
|
|
28
|
+
expect(content).toHaveAttribute('data-side', 'right')
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('side verilmezse Radix varsayılanı korunur', async () => {
|
|
33
|
+
render(
|
|
34
|
+
<Popover defaultOpen>
|
|
35
|
+
<PopoverTrigger>aç</PopoverTrigger>
|
|
36
|
+
<PopoverContent>içerik</PopoverContent>
|
|
37
|
+
</Popover>
|
|
38
|
+
)
|
|
39
|
+
await waitFor(() => {
|
|
40
|
+
expect(screen.getByText('içerik')).toHaveAttribute('data-side', 'bottom')
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('overlayBackdrop ÖLÜ OLMAYAN bir zemin sınıfı basar', async () => {
|
|
45
|
+
const { container } = render(
|
|
46
|
+
<Popover defaultOpen>
|
|
47
|
+
<PopoverTrigger>aç</PopoverTrigger>
|
|
48
|
+
<PopoverContent overlayBackdrop>içerik</PopoverContent>
|
|
49
|
+
</Popover>
|
|
50
|
+
)
|
|
51
|
+
const backdrop = container.querySelector('.fixed.inset-0')
|
|
52
|
+
expect(backdrop).toBeTruthy()
|
|
53
|
+
// ÖNCESİ: `bg-overlay` — `overlay` diye bir renk tanımlı olmadığı için
|
|
54
|
+
// Tailwind hiç CSS üretmiyordu, backdrop sessizce görünmezdi.
|
|
55
|
+
expect(backdrop!.className).not.toContain('bg-overlay')
|
|
56
|
+
expect(backdrop!.className).toContain('bg-black/50')
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe('#318 progress — `variant` dolguya da uygulanıyor', () => {
|
|
61
|
+
const fill = (c: HTMLElement) => c.querySelector('[class*="bg-"][style*="transform"], [class*="bg-success"], [class*="bg-warning"]')
|
|
62
|
+
|
|
63
|
+
it('variant="success" dolguyu da yeşile boyar', () => {
|
|
64
|
+
const { container } = render(<Progress value={50} variant="success" />)
|
|
65
|
+
// ÖNCESİ: track bg-success/20 olurken dolgu sabit "primary" kalıyordu.
|
|
66
|
+
const hasSuccessFill = container.innerHTML.includes('bg-success"') ||
|
|
67
|
+
/class="[^"]*\bbg-success\b[^"]*"/.test(container.innerHTML)
|
|
68
|
+
expect(hasSuccessFill).toBe(true)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('indicatorVariant açıkça verilince variant\'ı EZER', () => {
|
|
72
|
+
const { container } = render(
|
|
73
|
+
<Progress value={50} variant="success" indicatorVariant="warning" />
|
|
74
|
+
)
|
|
75
|
+
expect(/\bbg-warning\b/.test(container.innerHTML)).toBe(true)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('ikisi de verilmezse primary varsayılanı korunur', () => {
|
|
79
|
+
const { container } = render(<Progress value={50} />)
|
|
80
|
+
expect(/\bbg-primary\b/.test(container.innerHTML)).toBe(true)
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
describe('#307/#310 — ölü sınıflar kaldırıldı', () => {
|
|
85
|
+
it('accordion tetikleyicisi ölü `text-primary-400` taşımaz', () => {
|
|
86
|
+
render(
|
|
87
|
+
<Accordion type="single" collapsible>
|
|
88
|
+
<AccordionItem value="a">
|
|
89
|
+
<AccordionTrigger>başlık</AccordionTrigger>
|
|
90
|
+
</AccordionItem>
|
|
91
|
+
</Accordion>
|
|
92
|
+
)
|
|
93
|
+
const el = screen.getByText('başlık').closest('button') ?? screen.getByText('başlık')
|
|
94
|
+
expect(el.className).not.toContain('primary-400')
|
|
95
|
+
// hover:text-primary korunmalı — her iki temada çalışır
|
|
96
|
+
expect(el.className).toContain('hover:text-primary')
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
it('card elevated varyantı ölü `gray-850` taşımaz', () => {
|
|
100
|
+
const { container } = render(<Card variant="elevated">içerik</Card>)
|
|
101
|
+
const card = container.firstElementChild as HTMLElement
|
|
102
|
+
expect(card.className).not.toContain('gray-850')
|
|
103
|
+
expect(card.className).toContain('dark:bg-card')
|
|
104
|
+
})
|
|
105
|
+
})
|
|
@@ -6,6 +6,12 @@ import { ChevronDown } from "lucide-react"
|
|
|
6
6
|
|
|
7
7
|
import { cn } from "../../lib/utils"
|
|
8
8
|
|
|
9
|
+
// #307: `dark:hover:text-primary-400` ÖLÜ SINIFTI — tailwind-preset'te `primary`
|
|
10
|
+
// yalnız DEFAULT+foreground içeriyor, `400` ölçeği SADECE `brand` ailesinde tanımlı.
|
|
11
|
+
// Sınıf hiç CSS üretmiyordu, yani karanlık modda hover rengi işlevsizdi.
|
|
12
|
+
// Kaldırıldı: `hover:text-primary` zaten yeterli — `--primary` hem :root hem .dark
|
|
13
|
+
// bloğunda tanımlı olduğu için her iki temada doğru rengi verir.
|
|
14
|
+
|
|
9
15
|
const Accordion = AccordionPrimitive.Root
|
|
10
16
|
|
|
11
17
|
const AccordionItem = React.forwardRef<
|
|
@@ -29,7 +35,7 @@ const AccordionTrigger = React.forwardRef<
|
|
|
29
35
|
ref={ref}
|
|
30
36
|
className={cn(
|
|
31
37
|
"flex flex-1 items-center justify-between py-4 font-medium transition-all dark:text-gray-100",
|
|
32
|
-
"hover:underline hover:text-primary
|
|
38
|
+
"hover:underline hover:text-primary",
|
|
33
39
|
"[&[data-state=open]>svg]:rotate-180",
|
|
34
40
|
className
|
|
35
41
|
)}
|
|
@@ -6,6 +6,22 @@ import { motion, type HTMLMotionProps } from "framer-motion";
|
|
|
6
6
|
import { cn } from "../../lib/utils";
|
|
7
7
|
import { microInteractionVariants, hoverAnimations, tapAnimations } from "@/lib/micro-interactions";
|
|
8
8
|
|
|
9
|
+
// #310: `dark:bg-gray-850` ÖLÜ SINIFTI — Tailwind gri ölçeğinde 850 basamağı yok
|
|
10
|
+
// (50…800, 900, 950) ve preset de eklemiyor. `elevated` varyantının karanlık zemini
|
|
11
|
+
// hiç uygulanmıyordu; kart kökün `dark:bg-gray-900` değerinde kalıyordu.
|
|
12
|
+
// Semantik `bg-card` token'ına bağlandı.
|
|
13
|
+
//
|
|
14
|
+
// NOT — `size` ve `asChild` (aynı issue'da raporlandı) BİLİNÇLİ olarak
|
|
15
|
+
// değiştirilmedi, ayrı gerekçelerle:
|
|
16
|
+
// • `size`: CVA'da dört değerin dördü de boş string ve `compoundVariants` YOK
|
|
17
|
+
// (separator'ın aksine gizli bir çalışma yolu yok). Doğal hedefi de yok —
|
|
18
|
+
// padding kökte değil CardHeader/Content/Footer'ın kendi `p-6`'sında. Anlamlı
|
|
19
|
+
// kılmak alt-component'lerin padding'ini yeniden tasarlamak demek: görsel
|
|
20
|
+
// değişim + API kararı, bu PR'ın kapsamı dışı.
|
|
21
|
+
// • `asChild`: yalnız tipte var, gövdede hiç okunmuyor. Gerçekten uygulamak
|
|
22
|
+
// Radix `Slot` bağımlılığı + child-tek-eleman sözleşmesi demek.
|
|
23
|
+
// İkisi de #310'da açık kalıyor; bu PR ölü SINIF kısmını kapatıyor.
|
|
24
|
+
|
|
9
25
|
const cardVariants = cva(
|
|
10
26
|
"rounded-lg border bg-card text-card-foreground shadow-sm dark:shadow-gray-900/20 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-100 transition-all duration-200",
|
|
11
27
|
{
|
|
@@ -14,7 +30,7 @@ const cardVariants = cva(
|
|
|
14
30
|
default: "",
|
|
15
31
|
outline: "border border-border shadow-none bg-transparent dark:border-gray-700 dark:bg-transparent dark:text-gray-200",
|
|
16
32
|
filled: "border-none bg-secondary dark:bg-gray-800 dark:text-gray-100 dark:shadow-inner dark:shadow-gray-950/10",
|
|
17
|
-
elevated: "border-none shadow-md dark:shadow-lg dark:shadow-gray-900/30 dark:bg-
|
|
33
|
+
elevated: "border-none shadow-md dark:shadow-lg dark:shadow-gray-900/30 dark:bg-card dark:text-gray-100",
|
|
18
34
|
gradient: "border-none bg-gradient-to-br from-primary/5 to-primary/10 dark:from-primary/10 dark:to-primary/20",
|
|
19
35
|
glass: "border border-white/20 bg-white/10 backdrop-blur-md dark:border-gray-700/30 dark:bg-gray-800/10",
|
|
20
36
|
},
|
|
@@ -68,7 +68,7 @@ const PopoverTrigger = PopoverPrimitive.Trigger;
|
|
|
68
68
|
const PopoverAnchor = PopoverPrimitive.Anchor;
|
|
69
69
|
|
|
70
70
|
export interface PopoverContentProps
|
|
71
|
-
extends
|
|
71
|
+
extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>,
|
|
72
72
|
VariantProps<typeof popoverContentVariants> {
|
|
73
73
|
/**
|
|
74
74
|
* Popover'ın arka plan bulanıklığı etkin mi
|
|
@@ -103,10 +103,20 @@ const PopoverContent = React.forwardRef<
|
|
|
103
103
|
}, ref) => (
|
|
104
104
|
<>
|
|
105
105
|
{overlayBackdrop && (
|
|
106
|
-
<div
|
|
106
|
+
<div
|
|
107
|
+
/* #316: `bg-overlay` ÖLÜ SINIFTI — `overlay` adında bir renk ne
|
|
108
|
+
tailwind-preset.js'te ne tokens.css'te tanımlı (ikisinde de 0 geçiş).
|
|
109
|
+
Sınıf hiç CSS üretmiyordu, yani `overlayBackdrop` sessizce kapalıydı. */
|
|
110
|
+
className="fixed inset-0 z-40 bg-black/50"
|
|
111
|
+
/>
|
|
107
112
|
)}
|
|
108
113
|
<PopoverPrimitive.Content
|
|
109
114
|
ref={ref}
|
|
115
|
+
/* #316: `side` yalnız CVA'da animasyon sınıfı seçiyordu, Radix'e HİÇ
|
|
116
|
+
ulaşmıyordu — konumlandırma prop'u fiilen işlevsizdi. Artık gerçekten
|
|
117
|
+
geçiriliyor; CVA'daki `data-[side=…]` animasyonları da ancak bu öznitelik
|
|
118
|
+
basıldığında eşleşiyor. */
|
|
119
|
+
side={side}
|
|
110
120
|
sideOffset={sideOffset}
|
|
111
121
|
collisionPadding={8}
|
|
112
122
|
onInteractOutside={(e) => {
|
|
@@ -5,6 +5,11 @@ import { cva, type VariantProps } from "class-variance-authority";
|
|
|
5
5
|
|
|
6
6
|
import { cn } from "../../lib/utils";
|
|
7
7
|
|
|
8
|
+
// #318: `variant` TRACK'i boyuyordu, dolguyu ise bağımsız `indicatorVariant`
|
|
9
|
+
// boyuyordu ve varsayılanı sabit "primary" idi. Sonuç: `<Progress variant="success" />`
|
|
10
|
+
// yeşil track + MAVİ dolgu üretiyordu — deklare edilen varyant dolguya hiç ulaşmıyordu.
|
|
11
|
+
// Artık `indicatorVariant` verilmezse `variant`e düşer; açıkça verildiğinde yine ezer.
|
|
12
|
+
|
|
8
13
|
/**
|
|
9
14
|
* Progress Bileşeni
|
|
10
15
|
*
|
|
@@ -164,7 +169,7 @@ const Progress = React.forwardRef<
|
|
|
164
169
|
>
|
|
165
170
|
<div
|
|
166
171
|
className={cn(
|
|
167
|
-
progressIndicatorVariants({ variant: indicatorVariant
|
|
172
|
+
progressIndicatorVariants({ variant: indicatorVariant ?? variant ?? "primary", animation }),
|
|
168
173
|
indeterminate && "animate-indeterminate-progress"
|
|
169
174
|
)}
|
|
170
175
|
style={indeterminate ? {} : { transform: `translateX(-${100 - percentage}%)` }}
|