@moontra/moonui 6.19.0 → 6.19.2

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.mjs CHANGED
@@ -2548,10 +2548,70 @@ var sliderRangeVariants = cva(
2548
2548
  // tüketici --secondary-500'ü ezerek özelleştirebilir.
2549
2549
  // Regresyon: __tests__/slider-secondary-contrast.test.ts
2550
2550
  secondary: "bg-[rgb(var(--secondary-500))]",
2551
- accent: "bg-accent",
2551
+ // #448 (#389/#407'nin `accent` kardeşi — ama ÇÖZÜM SINIFI farklı): range
2552
+ // `bg-accent`, track `bg-accent/20` idi — aynı yüzey token'ının iki alfası.
2553
+ // `--accent` HER İKİ temada da kusurluydu (warning/error'dan ağır: onlar
2554
+ // yalnız light'ta kusurluydu): A ekseni light 1.123 · dark 1.303 · gerçek
2555
+ // docs kartı (#111827) 1.162. Eşik 3:1 (WCAG 1.4.11 non-text).
2556
+ //
2557
+ // KÖK NEDEN: `--accent` bir YÜZEY token'ı — `hover:bg-accent` tinti olarak
2558
+ // tasarlanmış ve iki temada da kendi zeminine BİTİŞİK duruyor (light
2559
+ // rgb(235,239,245) beyaz üstünde, dark rgb(29,40,58) rgb(3,7,17) üstünde).
2560
+ // Dolgu/kenarlık rolüne yapısal olarak uygun değil; bu yüzden track'i
2561
+ // değiştirerek onarmak da MÜMKÜN DEĞİL (light'ta accent'ten 3:1 uzakta
2562
+ // duran daha açık bir yüzey yok).
2563
+ //
2564
+ // #389'un tek-orta-ton kademe araması AYNEN uygulanamadı: tokens.css'te
2565
+ // `--accent-50 … --accent-950` skalası YOK (skalası olan aileler:
2566
+ // primary/secondary/success/warning/error/brand/brand-accent).
2567
+ // `bg-accent-foreground` de elendi — `--accent-foreground` iki temada da
2568
+ // `--primary` ile BİREBİR aynı değer (varyant primary klonuna dönerdi) ve
2569
+ // 7 tema preset'inin 2'sinde beyaz (Creative/Nature), yani tek başına
2570
+ // dolgu olamaz.
2571
+ //
2572
+ // ÇÖZÜM: sistemin TEK nötr skalası olan slate (`--secondary-*`) — `--accent`
2573
+ // ile aynı hue ailesi (216° ↔ 215°), üstelik light temada `--accent` ile
2574
+ // `--secondary` BİREBİR aynı token değerini taşıyor. Tema-kör tek kademe
2575
+ // SEÇİLEMEDİ: bu ailede iki temayı birden geçen tek kademe 500'dür, o da
2576
+ // `secondary` varyantının kendi rengi (ΔE*ab = 0.0 — iki varyant klon olurdu).
2577
+ // Bu yüzden #442'nin `dark:` ayrımı deseni kullanıldı, tema başına ayrı kademe.
2578
+ // Tam tarama (11 kademe × 2 tema × 3 zemin × 2 eksen): DARK'ta eşiği geçen VE
2579
+ // kardeş varyantlardan ayırt edilebilen (ΔE*ab ≥ 10) TEK kademe 400
2580
+ // (500 = secondary klonu · ≤300 `default`/`primary` ile çakışıyor · ≥600 eşiğin
2581
+ // altında). LIGHT'ta {600,700,800} uygun; 700 kardeş ayrımını maksimize eder
2582
+ // (ΔE 21.2 · 600→12.7 · 800→14.9).
2583
+ // Ölçülen — A: light 1.123 → 10.081 ✓ · dark 1.303 → 7.533 ✓ · docs kartı
2584
+ // 1.162 → 6.717 ✓. Track `bg-accent/20` DEĞİŞMEDİ (yedi varyantın ortak deseni).
2585
+ // Regresyon: __tests__/slider-accent-contrast.test.ts
2586
+ accent: "bg-[rgb(var(--secondary-700))] dark:bg-[rgb(var(--secondary-400))]",
2552
2587
  success: "bg-success",
2553
- warning: "bg-warning",
2554
- error: "bg-error"
2588
+ // #442 (#424/PR #440'ın slider ikizi): range `bg-warning`/`bg-error` idi —
2589
+ // track (`bg-warning/20` · `bg-error/20`) AYNI token'ın alfalı hâli olduğundan
2590
+ // LIGHT temada ayrım kayboluyordu: warning 1.835 · error 2.893 (eşik 3:1,
2591
+ // WCAG 1.4.11 non-text). DARK tema zaten temizdi (warning 6.97 · error 4.46).
2592
+ //
2593
+ // KÖK NEDEN: `--warning` ve `--error` tokens.css'in `.dark` bloğunda
2594
+ // EZİLMİYOR — iki temada aynı renk. Kardeşleri tema-uyarlanabilir olduğu
2595
+ // için geçiyor (`--success` light %29 → dark %36; ölçüm: success A ekseni
2596
+ // light 3.73 / dark 4.83). Bu iki aile o uyarlamadan yoksun.
2597
+ //
2598
+ // ÇÖZÜM: eksik tema-uyarlamasını component düzeyinde ver — light'ta skalanın
2599
+ // -700 kademesine in, dark'ta semantik token'a DOKUNMA (dark render bit-bit
2600
+ // aynı kalır, regresyon yüzeyi sıfır). Tema-KÖR bir -700 ataması dark'ı
2601
+ // kırardı: gerçek docs kartı (#111827) üstünde warning 2.499 ✗ · error 2.232 ✗.
2602
+ // Tam skala taraması (11 kademe × 2 aile × 3 zemin × 2 tema) track `/20` iken
2603
+ // iki temayı birden geçen kademe kümesini BOŞ buluyor → `dark:` ayrımı ZORUNLU;
2604
+ // #389'un tek-orta-ton (`--secondary-500`) çözümü burada uygulanamaz, çünkü
2605
+ // orada `--secondary` temaya göre değişiyordu. Aynı `dark:` deseni badge.tsx:51-63
2606
+ // ve progress.tsx:110-111'de zaten kullanılıyor.
2607
+ // Ölçülen sonuç — warning: light 1.835 → 4.235 ✓ · error: light 2.893 → 4.950 ✓
2608
+ // (dark değişmedi: 6.97 / 4.46; docs kartı 5.77 / 3.82).
2609
+ // Skala token'ları RGB üçlüsüdür (semantiklerin HSL'inden farklı) →
2610
+ // `rgb(var(--x-700))` kompozisyonu; `bg-warning-700` YAZILMADI, preset bu
2611
+ // ailelere sayısal skala açmıyor (#307 ölü-sınıf tuzağı).
2612
+ // Regresyon: __tests__/slider-warning-error-contrast.test.ts
2613
+ warning: "bg-[rgb(var(--warning-700))] dark:bg-warning",
2614
+ error: "bg-[rgb(var(--error-700))] dark:bg-error"
2555
2615
  }
2556
2616
  },
2557
2617
  defaultVariants: {
@@ -2578,10 +2638,36 @@ var sliderThumbVariants = cva(
2578
2638
  // aynı kademe: tutamaç ve dolgu tek renkte okunur.
2579
2639
  // Regresyon: __tests__/slider-secondary-contrast.test.ts
2580
2640
  secondary: "border-[rgb(var(--secondary-500))] bg-background",
2581
- accent: "border-accent bg-background",
2641
+ // #448 EKSEN B (range'den FARKLI eksen: bileşen↔sayfa-zemini) — tutamacın
2642
+ // dolgusu `bg-background`, yani zeminin kendisi; ayırt edilebilirliğini
2643
+ // YALNIZ kenarlık taşır → non-text UI bileşeni, WCAG 1.4.11 ≥3:1.
2644
+ // `border-accent` iki temada da kayboluyordu: light 1.154 · dark 1.359 ·
2645
+ // gerçek docs kartı 1.197. Range ile AYNI kademeler seçildi — #407'nin
2646
+ // gerekçesi burada da geçerli: "tutamaç ve dolgu tek renkte okunur".
2647
+ // Ölçülen — light 1.154 → 10.355 ✓ · dark 1.359 → 7.857 ✓ · docs kartı
2648
+ // 1.197 → 6.919 ✓.
2649
+ // Regresyon: __tests__/slider-accent-contrast.test.ts
2650
+ accent: "border-[rgb(var(--secondary-700))] dark:border-[rgb(var(--secondary-400))] bg-background",
2582
2651
  success: "border-success bg-background",
2583
- warning: "border-warning bg-background",
2584
- error: "border-error bg-background"
2652
+ // #442 EKSEN B (range'den FARKLI eksen: bileşen↔sayfa-zemini) — #407'de
2653
+ // `secondary` için açılan eksenin warning/error karşılığı. Tutamacın dolgusu
2654
+ // `bg-background`, yani zeminin kendisi; ayırt edilebilirliği YALNIZ kenarlık
2655
+ // taşır → non-text UI bileşeni, WCAG 1.4.11 ≥3:1.
2656
+ // ÖLÇÜLEN (eski değerler): warning light **2.133 ✗** · error light 3.781 ✓;
2657
+ // dark ikisi de rahat geçiyordu (9.45 / 5.33).
2658
+ //
2659
+ // `warning` KUSURLUYDU, düzeltildi. `error` bu eksende zaten geçiyordu ama
2660
+ // yine de aynı ifadeye çekildi: range light'ta -700'e indiği için kenarlık
2661
+ // `border-error`da bırakılsaydı LIGHT temada dolgu rgb(185,28,28), tutamaç
2662
+ // rgb(239,67,67) olurdu — düzeltmenin KENDİSİ iki-tonlu bir görünüm üretirdi.
2663
+ // #407'nin gerekçesi birebir geçerli: "tutamaç ve dolgu tek renkte okunur".
2664
+ // Değişim kontrastı düşürmüyor, artırıyor: error light 3.781 → 6.470.
2665
+ // Dark'ta `dark:border-*` semantik token'ı koruduğu için render bit-bit aynı.
2666
+ // Ölçülen sonuç — warning: light 2.133 → 4.923 ✓ · error: light 3.781 → 6.470 ✓
2667
+ // (dark değişmedi: 9.45 / 5.33; docs kartı 8.32 / 4.69).
2668
+ // Regresyon: __tests__/slider-warning-error-contrast.test.ts
2669
+ warning: "border-[rgb(var(--warning-700))] dark:border-warning bg-background",
2670
+ error: "border-[rgb(var(--error-700))] dark:border-error bg-background"
2585
2671
  },
2586
2672
  size: {
2587
2673
  sm: "h-3 w-3",
@@ -3773,6 +3859,8 @@ var CommandShortcut = ({
3773
3859
  };
3774
3860
  CommandShortcut.displayName = "CommandShortcut";
3775
3861
  var TableSortContext = React12.createContext(null);
3862
+ var TableStripedContext = React12.createContext(false);
3863
+ var STRIPED_ROW_CLASSES = "odd:bg-muted/50 hover:bg-accent";
3776
3864
  function nextSortDirection(current) {
3777
3865
  if (current === "asc")
3778
3866
  return "desc";
@@ -3825,6 +3913,7 @@ var Table = React12.forwardRef(({
3825
3913
  onRowSelectionChange: _onRowSelectionChange,
3826
3914
  disableRowSelection: _disableRowSelection,
3827
3915
  getRowId: _getRowId,
3916
+ children,
3828
3917
  ...props
3829
3918
  }, ref) => {
3830
3919
  const striped = variant === "striped";
@@ -3832,20 +3921,9 @@ var Table = React12.forwardRef(({
3832
3921
  () => ({ sortColumn, sortDirection, onSortChange }),
3833
3922
  [sortColumn, sortDirection, onSortChange]
3834
3923
  );
3835
- const childrenWithProps = React12.Children.map(props.children, (child) => {
3836
- if (React12.isValidElement(child)) {
3837
- if (child.type === "tbody") {
3838
- const tbodyProps = child.props;
3839
- return React12.cloneElement(child, {
3840
- className: cn(tbodyProps.className, striped && "even:[&>tr]:bg-muted/50")
3841
- });
3842
- }
3843
- }
3844
- return child;
3845
- });
3846
3924
  return /* @__PURE__ */ jsxs("div", { className: "relative w-full overflow-auto", children: [
3847
3925
  loading && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-background/60 flex items-center justify-center z-10", children: /* @__PURE__ */ jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" }) }),
3848
- /* @__PURE__ */ jsx(TableSortContext.Provider, { value: sortContextValue, children: /* @__PURE__ */ jsx(
3926
+ /* @__PURE__ */ jsx(TableSortContext.Provider, { value: sortContextValue, children: /* @__PURE__ */ jsx(TableStripedContext.Provider, { value: striped, children: /* @__PURE__ */ jsx(
3849
3927
  "table",
3850
3928
  {
3851
3929
  ref,
@@ -3855,13 +3933,13 @@ var Table = React12.forwardRef(({
3855
3933
  className
3856
3934
  ),
3857
3935
  ...props,
3858
- children: childrenWithProps
3936
+ children
3859
3937
  }
3860
- ) })
3938
+ ) }) })
3861
3939
  ] });
3862
3940
  });
3863
3941
  Table.displayName = "Table";
3864
- var TableHeader = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("thead", { ref, className: cn("moonui-theme", "[&_tr]:border-b", className), ...props }));
3942
+ var TableHeader = React12.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("thead", { ref, className: cn("moonui-theme", "[&_tr]:border-b", className), ...props, children: /* @__PURE__ */ jsx(TableStripedContext.Provider, { value: false, children }) }));
3865
3943
  TableHeader.displayName = "TableHeader";
3866
3944
  var TableBody = React12.forwardRef(({ className, emptyContent, emptyMessage = "No data available", children, ...props }, ref) => {
3867
3945
  const hasChildren = React12.Children.count(children) > 0;
@@ -3876,26 +3954,31 @@ var TableBody = React12.forwardRef(({ className, emptyContent, emptyMessage = "N
3876
3954
  );
3877
3955
  });
3878
3956
  TableBody.displayName = "TableBody";
3879
- var TableFooter = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3957
+ var TableFooter = React12.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
3880
3958
  "tfoot",
3881
3959
  {
3882
3960
  ref,
3883
3961
  className: cn("moonui-theme", "bg-primary text-primary-foreground font-medium", className),
3884
- ...props
3962
+ ...props,
3963
+ children: /* @__PURE__ */ jsx(TableStripedContext.Provider, { value: false, children })
3885
3964
  }
3886
3965
  ));
3887
3966
  TableFooter.displayName = "TableFooter";
3888
- var TableRow = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3889
- "tr",
3890
- {
3891
- ref,
3892
- className: cn(
3893
- "border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",
3894
- className
3895
- ),
3896
- ...props
3897
- }
3898
- ));
3967
+ var TableRow = React12.forwardRef(({ className, ...props }, ref) => {
3968
+ const striped = React12.useContext(TableStripedContext);
3969
+ return /* @__PURE__ */ jsx(
3970
+ "tr",
3971
+ {
3972
+ ref,
3973
+ className: cn(
3974
+ "border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",
3975
+ striped && STRIPED_ROW_CLASSES,
3976
+ className
3977
+ ),
3978
+ ...props
3979
+ }
3980
+ );
3981
+ });
3899
3982
  TableRow.displayName = "TableRow";
3900
3983
  var TableHead = React12.forwardRef(
3901
3984
  ({ className, sortable, sorted, onSort, columnId, align = "left", children, ...props }, ref) => {
@@ -4910,8 +4993,31 @@ var progressIndicatorVariants = cva(
4910
4993
  // Regresyon: __tests__/progress-secondary-contrast.test.ts
4911
4994
  secondary: "bg-[rgb(var(--secondary-500))]",
4912
4995
  success: "bg-success",
4913
- warning: "bg-warning",
4914
- error: "bg-error"
4996
+ // #424 (#372'nin kardeşi): dolgu `bg-warning`/`bg-error` idi — track
4997
+ // (`bg-warning/20` · `bg-error/20`) AYNI token'ın alfalı hâli olduğundan
4998
+ // LIGHT temada ayrım kayboluyordu: warning 1.83 · error 2.89 (eşik 3:1,
4999
+ // WCAG 1.4.11). DARK tema zaten temizdi (warning 6.97 · error 4.46).
5000
+ //
5001
+ // KÖK NEDEN: `--warning` ve `--error` tokens.css'te `.dark` bloğunda
5002
+ // EZİLMİYOR — iki temada aynı renk. Kardeşleri `--success` (light 29% →
5003
+ // dark 36%) ve `--primary` tema-uyarlanabilir olduğu için eşiği geçiyor;
5004
+ // bu iki aile o uyarlamadan yoksun kaldığı için light'ta kalıyor.
5005
+ //
5006
+ // ÇÖZÜM: eksik tema-uyarlamasını component düzeyinde ver — light'ta
5007
+ // skalanın -700 kademesine in, dark'ta semantik token'a DOKUNMA.
5008
+ // Tema-KÖR bir -700 ataması dark'ı kırardı (docs kartında warning 2.50 ✗
5009
+ // · error 2.23 ✗); `dark:` ayrımı tam olarak bunu önler ve dark render'ı
5010
+ // bit-bit aynı bırakır. Aynı desen badge.tsx:51-63'te zaten kullanılıyor.
5011
+ // Track alfaları BİLEREK `/20` kaldı: altı varyantın tamamı o konvansiyonu
5012
+ // paylaşıyor ve alfayı düşürmek track↔zemin ayrımını zayıflatırdı
5013
+ // (warning 1.162 → 1.081). Ölçülen sonuç — warning: light 4.24 ✓ /
5014
+ // dark 6.97 ✓ (docs kartı #111827: 5.77) · error: light 4.95 ✓ /
5015
+ // dark 4.46 ✓ (docs kartı 3.82). Skala token'ları RGB üçlüsüdür
5016
+ // (semantiklerin HSL'inden farklı) → `rgb(var(--x-700))` kompozisyonu;
5017
+ // `bg-warning-700` YAZILMADI, preset o sınıfı üretmez (#307 ölü-sınıf).
5018
+ // Regresyon: __tests__/progress-warning-error-contrast.test.ts
5019
+ warning: "bg-[rgb(var(--warning-700))] dark:bg-warning",
5020
+ error: "bg-[rgb(var(--error-700))] dark:bg-error"
4915
5021
  },
4916
5022
  animation: {
4917
5023
  default: "transition-all duration-500",
@@ -8016,12 +8122,53 @@ var switchVariants = cva(
8016
8122
  md: "h-6 w-11",
8017
8123
  lg: "h-7 w-14"
8018
8124
  },
8125
+ // #454 — checked track'in İKİ ekseni de ölçüldü (eşik 3:1, WCAG 1.4.11
8126
+ // non-text UI). Switch'te bu iki eksen AYNI sayıyı verir, çünkü thumb
8127
+ // `bg-background` taşır (switchThumbVariants tabanı):
8128
+ // A) checked track ↔ sayfa/kart zemini → kontrol "açık" okunuyor mu?
8129
+ // B) thumb ↔ checked track → tutamacın KONUMU görülüyor mu?
8130
+ // Ölçüm zeminleri: `--background` · `--card` · docs kabuğunun gerçek koyu
8131
+ // kartı (#111827). Regresyon: __tests__/switch-variant-contrast.test.tsx
8019
8132
  variant: {
8020
8133
  primary: "data-[state=checked]:bg-primary",
8134
+ // light 4.920 · dark 19.256 ✓
8021
8135
  success: "data-[state=checked]:bg-success",
8022
- warning: "data-[state=checked]:bg-warning",
8136
+ // light 4.904 · dark 6.043 ✓
8137
+ // #454 kardeş kusuru (#424/PR #440 progress · #442/PR #446 slider ile AYNI
8138
+ // sınıf, üçüncü component): `--warning` tokens.css'in `.dark` bloğunda
8139
+ // EZİLMİYOR, yani iki temada da aynı turuncu. Dark'ta zemin koyu olduğu
8140
+ // için geçiyor (9.446), LIGHT'ta beyaz üstünde 2.133 ✗ — açık temada
8141
+ // checked warning switch'in tutamacı da kayboluyordu (B ekseni 2.133).
8142
+ // ÇÖZÜM (emsalle birebir aynı şekil): eksik tema-uyarlamasını component
8143
+ // düzeyinde ver — light'ta skalanın -700 kademesine in, dark'ta semantik
8144
+ // token'a DOKUNMA (dark render bit-bit aynı kalır, regresyon yüzeyi sıfır).
8145
+ // Light'ta eşiği geçen kademe kümesi {700,800,900,950}; en açık olanı
8146
+ // seçildi (turuncu kimliğini en çok koruyan). Ölçülen: 2.133 → 4.923 ✓.
8147
+ warning: "data-[state=checked]:bg-[rgb(var(--warning-700))] dark:data-[state=checked]:bg-warning",
8023
8148
  destructive: "data-[state=checked]:bg-error",
8024
- secondary: "data-[state=checked]:bg-accent"
8149
+ // light 3.781 · dark 5.328 ✓ (dokunulmadı)
8150
+ // #454 asıl kusuru: `secondary` varyantı `bg-accent` kullanıyordu — ADI
8151
+ // `secondary`, TOKEN'ı `accent`. `--accent` bir YÜZEY token'ı (`hover:bg-accent`
8152
+ // tinti) ve iki temada da kendi zeminine bitişik: light rgb(235,239,245)
8153
+ // beyaz üstünde 1.154 · dark rgb(29,40,58) 1.359 · docs kartı 1.197.
8154
+ // Yani checked switch hem sayfadan hem de kendi tutamacından ayrışmıyordu:
8155
+ // "açık" durum GÖRÜNMÜYORDU (switch'in tek işi durumu göstermek).
8156
+ //
8157
+ // AD ↔ TOKEN KARARI: varyant kendi ailesine, `--secondary-*` slate skalasına
8158
+ // bağlandı. `bg-secondary` (semantik) BİLEREK seçilmedi — light'ta `--accent`
8159
+ // ile BİREBİR aynı değer (1.154), dark'ta daha da kötü (1.007). Skala
8160
+ // taraması (11 kademe × 2 tema × 3 zemin × 2 eksen + kardeş ΔE*ab ≥ 10 klon
8161
+ // filtresi): light {500,600,700,800,900,950} · dark {300,400,500} → iki
8162
+ // temayı birden geçen TEK kademe **500**, yani `dark:` ayrımına gerek yok.
8163
+ // #448'in slider'daki 700/400 ayrımı burada GEREKMEZ ve İSTENMEZ: orada 500
8164
+ // elenmişti çünkü slider'ın `secondary` varyantı zaten o rengi kullanıyordu
8165
+ // (ΔE = 0.0 → klon). Switch'in `accent` adlı bir varyantı YOK, dolayısıyla
8166
+ // 500 serbest ve kardeşlerden ayrık (ΔE: primary 69.5/51.6 · success
8167
+ // 63.6/74.8 · warning 96.0 · destructive 85.0 — hepsi ≥ 10).
8168
+ // Yan fayda: slider'ın `secondary` varyantı da #389/PR #406'da aynı kademeye
8169
+ // sabitlenmişti → aynı varyant adı artık iki component'te aynı rengi veriyor.
8170
+ // Ölçülen: A/B light 1.154 → 4.759 ✓ · dark 1.359 → 4.234 ✓ · kart 1.197 → 3.728 ✓.
8171
+ secondary: "data-[state=checked]:bg-[rgb(var(--secondary-500))]"
8025
8172
  }
8026
8173
  },
8027
8174
  defaultVariants: {