@moontra/moonui 3.2.0 → 3.4.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.js CHANGED
@@ -30,6 +30,7 @@ var TogglePrimitive = require('@radix-ui/react-toggle');
30
30
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
31
31
  var SwitchPrimitives = require('@radix-ui/react-switch');
32
32
  var ToastPrimitives = require('@radix-ui/react-toast');
33
+ var ToggleGroupPrimitive = require('@radix-ui/react-toggle-group');
33
34
 
34
35
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
35
36
 
@@ -69,6 +70,7 @@ var TogglePrimitive__namespace = /*#__PURE__*/_interopNamespace(TogglePrimitive)
69
70
  var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
70
71
  var SwitchPrimitives__namespace = /*#__PURE__*/_interopNamespace(SwitchPrimitives);
71
72
  var ToastPrimitives__namespace = /*#__PURE__*/_interopNamespace(ToastPrimitives);
73
+ var ToggleGroupPrimitive__namespace = /*#__PURE__*/_interopNamespace(ToggleGroupPrimitive);
72
74
 
73
75
  function cn(...inputs) {
74
76
  return tailwindMerge.twMerge(clsx.clsx(inputs));
@@ -1715,14 +1717,14 @@ var CarouselNext = React10__namespace.forwardRef(({ className, variant = "outlin
1715
1717
  });
1716
1718
  CarouselNext.displayName = "CarouselNext";
1717
1719
  var checkboxVariants = classVarianceAuthority.cva(
1718
- "peer shrink-0 border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:text-primary-foreground",
1720
+ "peer shrink-0 border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:text-primary-foreground data-[state=indeterminate]:text-primary-foreground",
1719
1721
  {
1720
1722
  variants: {
1721
1723
  variant: {
1722
- default: "border-border bg-background data-[state=checked]:bg-primary data-[state=checked]:border-primary",
1723
- outline: "border-border bg-transparent data-[state=checked]:bg-primary data-[state=checked]:border-primary",
1724
- muted: "border-border bg-accent data-[state=checked]:bg-primary data-[state=checked]:border-primary",
1725
- ghost: "border-transparent bg-transparent hover:bg-accent data-[state=checked]:bg-primary data-[state=checked]:border-primary"
1724
+ default: "border-border bg-background data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary",
1725
+ outline: "border-border bg-transparent data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary",
1726
+ muted: "border-border bg-accent data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary",
1727
+ ghost: "border-transparent bg-transparent hover:bg-accent data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary"
1726
1728
  },
1727
1729
  size: {
1728
1730
  sm: "h-3.5 w-3.5",
@@ -1763,11 +1765,7 @@ var Checkbox = React10__namespace.forwardRef(({
1763
1765
  checked,
1764
1766
  ...props
1765
1767
  }, ref) => {
1766
- const [isIndeterminate, setIsIndeterminate] = React10__namespace.useState(indeterminate);
1767
- React10__namespace.useEffect(() => {
1768
- setIsIndeterminate(indeterminate);
1769
- }, [indeterminate]);
1770
- const effectiveChecked = isIndeterminate ? false : checked;
1768
+ const effectiveChecked = indeterminate ? "indeterminate" : checked;
1771
1769
  return /* @__PURE__ */ jsxRuntime.jsx(
1772
1770
  CheckboxPrimitive__namespace.Root,
1773
1771
  {
@@ -1782,7 +1780,7 @@ var Checkbox = React10__namespace.forwardRef(({
1782
1780
  "flex items-center justify-center text-current",
1783
1781
  animation === "bounce" && "data-[state=checked]:animate-bounce"
1784
1782
  ),
1785
- children: isIndeterminate ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { className: "h-[65%] w-[65%]" }) : icon ? icon : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-[65%] w-[65%]" })
1783
+ children: indeterminate ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { className: "h-[65%] w-[65%]" }) : icon ? icon : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-[65%] w-[65%]" })
1786
1784
  }
1787
1785
  )
1788
1786
  }
@@ -2574,6 +2572,44 @@ var Slider = React10__namespace.forwardRef(({
2574
2572
  document.addEventListener("mousemove", handleMouseMove);
2575
2573
  document.addEventListener("mouseup", handleMouseUp);
2576
2574
  };
2575
+ const handleThumbKeyDown = (index) => (event) => {
2576
+ if (disabled)
2577
+ return;
2578
+ const largeStep = step * 10;
2579
+ const current = sliderValue[index];
2580
+ let next;
2581
+ switch (event.key) {
2582
+ case "ArrowRight":
2583
+ case "ArrowUp":
2584
+ next = current + step;
2585
+ break;
2586
+ case "ArrowLeft":
2587
+ case "ArrowDown":
2588
+ next = current - step;
2589
+ break;
2590
+ case "PageUp":
2591
+ next = current + largeStep;
2592
+ break;
2593
+ case "PageDown":
2594
+ next = current - largeStep;
2595
+ break;
2596
+ case "Home":
2597
+ next = min;
2598
+ break;
2599
+ case "End":
2600
+ next = max;
2601
+ break;
2602
+ default:
2603
+ return;
2604
+ }
2605
+ event.preventDefault();
2606
+ const lowerBound = index > 0 ? sliderValue[index - 1] : min;
2607
+ const upperBound = index < sliderValue.length - 1 ? sliderValue[index + 1] : max;
2608
+ const bounded = Math.max(lowerBound, Math.min(upperBound, next));
2609
+ const newValues = [...sliderValue];
2610
+ newValues[index] = bounded;
2611
+ handleValueChange(newValues);
2612
+ };
2577
2613
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", ref, ...props, children: [
2578
2614
  showValueLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(
2579
2615
  "flex justify-end mb-1 text-sm text-muted-foreground",
@@ -2623,6 +2659,7 @@ var Slider = React10__namespace.forwardRef(({
2623
2659
  cursor: disabled ? "not-allowed" : "pointer"
2624
2660
  },
2625
2661
  onMouseDown: handleThumbMouseDown(i),
2662
+ onKeyDown: handleThumbKeyDown(i),
2626
2663
  "aria-label": `Thumb ${i + 1}`,
2627
2664
  tabIndex: disabled ? -1 : 0,
2628
2665
  role: "slider",
@@ -3141,8 +3178,12 @@ function ColorPicker({
3141
3178
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-10 gap-1", children: presets.map((presetColor) => /* @__PURE__ */ jsxRuntime.jsx(
3142
3179
  "button",
3143
3180
  {
3181
+ type: "button",
3182
+ "aria-label": `Select color ${presetColor}`,
3183
+ "aria-pressed": color === presetColor,
3144
3184
  className: cn(
3145
3185
  "h-7 w-7 rounded border-2 transition-all hover:scale-110",
3186
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
3146
3187
  color === presetColor ? "border-primary" : "border-transparent"
3147
3188
  ),
3148
3189
  style: { backgroundColor: presetColor },
@@ -3169,8 +3210,12 @@ function SimpleColorPicker({
3169
3210
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("moonui-theme", "flex flex-wrap gap-2", className), children: colors.map((color) => /* @__PURE__ */ jsxRuntime.jsx(
3170
3211
  "button",
3171
3212
  {
3213
+ type: "button",
3214
+ "aria-label": `Select color ${color}`,
3215
+ "aria-pressed": value === color,
3172
3216
  className: cn(
3173
3217
  "rounded-full border-2 transition-all hover:scale-110",
3218
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
3174
3219
  sizeClasses[size],
3175
3220
  value === color ? "border-primary ring-2 ring-primary/20" : "border-transparent"
3176
3221
  ),
@@ -6127,16 +6172,41 @@ var radioGroupItemVariants = classVarianceAuthority.cva(
6127
6172
  );
6128
6173
  var RadioGroupContext = React10__namespace.createContext({});
6129
6174
  var RadioGroup2 = React10__namespace.forwardRef(
6130
- ({ className, value, onValueChange, disabled, name, ...props }, ref) => {
6131
- return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupContext.Provider, { value: { value, onValueChange, disabled, name }, children: /* @__PURE__ */ jsxRuntime.jsx(
6132
- "div",
6175
+ ({ className, value, defaultValue, onValueChange, disabled, name, ...props }, ref) => {
6176
+ const [internalValue, setInternalValue] = React10__namespace.useState(
6177
+ defaultValue
6178
+ );
6179
+ const isControlled = value !== void 0;
6180
+ const currentValue = isControlled ? value : internalValue;
6181
+ const handleValueChange = React10__namespace.useCallback(
6182
+ (next) => {
6183
+ if (!isControlled) {
6184
+ setInternalValue(next);
6185
+ }
6186
+ onValueChange?.(next);
6187
+ },
6188
+ [isControlled, onValueChange]
6189
+ );
6190
+ return /* @__PURE__ */ jsxRuntime.jsx(
6191
+ RadioGroupContext.Provider,
6133
6192
  {
6134
- ref,
6135
- role: "radiogroup",
6136
- className: cn("moonui-theme", "grid gap-2", className),
6137
- ...props
6193
+ value: {
6194
+ value: currentValue,
6195
+ onValueChange: handleValueChange,
6196
+ disabled,
6197
+ name
6198
+ },
6199
+ children: /* @__PURE__ */ jsxRuntime.jsx(
6200
+ "div",
6201
+ {
6202
+ ref,
6203
+ role: "radiogroup",
6204
+ className: cn("moonui-theme", "grid gap-2", className),
6205
+ ...props
6206
+ }
6207
+ )
6138
6208
  }
6139
- ) });
6209
+ );
6140
6210
  }
6141
6211
  );
6142
6212
  RadioGroup2.displayName = "RadioGroup";
@@ -6165,7 +6235,7 @@ var RadioGroupItem = React10__namespace.forwardRef(({ className, variant, size,
6165
6235
  disabled: disabled || radioGroup.disabled,
6166
6236
  name: radioGroup.name,
6167
6237
  onChange: handleChange,
6168
- className: "sr-only",
6238
+ className: "peer sr-only",
6169
6239
  ...props
6170
6240
  }
6171
6241
  ),
@@ -6176,7 +6246,12 @@ var RadioGroupItem = React10__namespace.forwardRef(({ className, variant, size,
6176
6246
  className: cn(
6177
6247
  radioGroupItemVariants({ variant, size }),
6178
6248
  "rounded-full",
6179
- "focus-visible:ring-primary/50",
6249
+ // Gerçekte odaklanan eleman görsel olarak gizli `sr-only` input'tur.
6250
+ // Görünür label onun KARDEŞİ olduğu için label'da `:focus-visible` hiç
6251
+ // tetiklenmiyor, dolayısıyla klavye kullanıcısı hiçbir focus izi
6252
+ // görmüyordu. Tailwind `peer` deseniyle (input `peer` sınıfını taşır ve
6253
+ // DOM'da label'dan önce gelir) focus izi görünür elemana taşınır.
6254
+ "peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2 peer-focus-visible:ring-primary/50",
6180
6255
  "relative inline-flex shrink-0 cursor-pointer items-center justify-center overflow-hidden",
6181
6256
  disabled && "cursor-not-allowed opacity-50",
6182
6257
  className
@@ -8428,6 +8503,118 @@ var Spinner = React10__namespace.forwardRef(
8428
8503
  }
8429
8504
  );
8430
8505
  Spinner.displayName = "Spinner";
8506
+ var buttonGroupVariants = classVarianceAuthority.cva(
8507
+ // Temel kapsayıcı: inline-flex; çocuklar akış içinde hizalanır
8508
+ "moonui-theme inline-flex",
8509
+ {
8510
+ variants: {
8511
+ orientation: {
8512
+ // Yatay: butonlar dikeyde ortalanır (içerik-genişliği korunur)
8513
+ horizontal: "flex-row items-center",
8514
+ // Dikey: butonlar aynı genişliğe uzar (items-stretch) → kenarlar hizalanır
8515
+ vertical: "flex-col items-stretch"
8516
+ },
8517
+ attached: {
8518
+ // Bitişik: boşluk yok; radius birleştirme compoundVariants ile uygulanır
8519
+ true: "",
8520
+ // Boşluklu: normal aralık, radius korunur
8521
+ false: "gap-2"
8522
+ }
8523
+ },
8524
+ compoundVariants: [
8525
+ {
8526
+ // Yatay + bitişik: bitişik yatay kenarlar düzleşir, -ml-px ile kenarlık örtüşür
8527
+ orientation: "horizontal",
8528
+ attached: true,
8529
+ class: [
8530
+ "[&>*:not(:first-child)]:rounded-l-none",
8531
+ "[&>*:not(:last-child)]:rounded-r-none",
8532
+ "[&>*:not(:first-child)]:-ml-px"
8533
+ ]
8534
+ },
8535
+ {
8536
+ // Dikey + bitişik: bitişik dikey kenarlar düzleşir, -mt-px ile kenarlık örtüşür
8537
+ orientation: "vertical",
8538
+ attached: true,
8539
+ class: [
8540
+ "[&>*:not(:first-child)]:rounded-t-none",
8541
+ "[&>*:not(:last-child)]:rounded-b-none",
8542
+ "[&>*:not(:first-child)]:-mt-px"
8543
+ ]
8544
+ }
8545
+ ],
8546
+ defaultVariants: {
8547
+ orientation: "horizontal",
8548
+ attached: true
8549
+ }
8550
+ }
8551
+ );
8552
+ var ButtonGroup = React10__namespace.forwardRef(
8553
+ ({ className, orientation, attached, size, variant, children, ...props }, ref) => {
8554
+ const shouldPropagate = size !== void 0 || variant !== void 0;
8555
+ const enhancedChildren = shouldPropagate ? React10__namespace.Children.map(children, (child) => {
8556
+ if (!React10__namespace.isValidElement(child) || child.type !== Button) {
8557
+ return child;
8558
+ }
8559
+ const childProps = child.props;
8560
+ return React10__namespace.cloneElement(child, {
8561
+ size: childProps.size ?? size,
8562
+ variant: childProps.variant ?? variant
8563
+ });
8564
+ }) : children;
8565
+ return /* @__PURE__ */ jsxRuntime.jsx(
8566
+ "div",
8567
+ {
8568
+ ref,
8569
+ role: "group",
8570
+ className: cn(buttonGroupVariants({ orientation, attached }), className),
8571
+ ...props,
8572
+ children: enhancedChildren
8573
+ }
8574
+ );
8575
+ }
8576
+ );
8577
+ ButtonGroup.displayName = "ButtonGroup";
8578
+ var ToggleGroupContext = React10__namespace.createContext({
8579
+ size: "default",
8580
+ variant: "default"
8581
+ });
8582
+ var ToggleGroup = React10__namespace.forwardRef(({ className, variant, size, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
8583
+ ToggleGroupPrimitive__namespace.Root,
8584
+ {
8585
+ ref,
8586
+ className: cn(
8587
+ "moonui-theme inline-flex items-center justify-center gap-1",
8588
+ // Radix roving-focus kök elemana `data-orientation` yazar; dikey yerleşim
8589
+ // buna bağlanır. Yatay/tanımsız durumda taban sınıflar geçerli kalır —
8590
+ // yani mevcut render değişmez. Kardeş `button-group` ile desen paritesi.
8591
+ "data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[orientation=vertical]:justify-start",
8592
+ className
8593
+ ),
8594
+ ...props,
8595
+ children: /* @__PURE__ */ jsxRuntime.jsx(ToggleGroupContext.Provider, { value: { variant, size }, children })
8596
+ }
8597
+ ));
8598
+ ToggleGroup.displayName = "ToggleGroup";
8599
+ var ToggleGroupItem = React10__namespace.forwardRef(({ className, children, variant, size, ...props }, ref) => {
8600
+ const context = React10__namespace.useContext(ToggleGroupContext);
8601
+ return /* @__PURE__ */ jsxRuntime.jsx(
8602
+ ToggleGroupPrimitive__namespace.Item,
8603
+ {
8604
+ ref,
8605
+ className: cn(
8606
+ toggleVariants({
8607
+ variant: context.variant ?? variant,
8608
+ size: context.size ?? size
8609
+ }),
8610
+ className
8611
+ ),
8612
+ ...props,
8613
+ children
8614
+ }
8615
+ );
8616
+ });
8617
+ ToggleGroupItem.displayName = "ToggleGroupItem";
8431
8618
 
8432
8619
  Object.defineProperty(exports, 'Palette', {
8433
8620
  enumerable: true,
@@ -8474,6 +8661,7 @@ exports.BreadcrumbList = BreadcrumbList;
8474
8661
  exports.BreadcrumbPage = BreadcrumbPage;
8475
8662
  exports.BreadcrumbSeparator = BreadcrumbSeparator;
8476
8663
  exports.Button = Button;
8664
+ exports.ButtonGroup = ButtonGroup;
8477
8665
  exports.Card = Card;
8478
8666
  exports.CardCVCInput = CardCVCInput;
8479
8667
  exports.CardContent = CardContent;
@@ -8573,6 +8761,7 @@ exports.MoonUIBreadcrumbList = BreadcrumbList;
8573
8761
  exports.MoonUIBreadcrumbPage = BreadcrumbPage;
8574
8762
  exports.MoonUIBreadcrumbSeparator = BreadcrumbSeparator;
8575
8763
  exports.MoonUIButton = Button;
8764
+ exports.MoonUIButtonGroup = ButtonGroup;
8576
8765
  exports.MoonUICalendar = Calendar;
8577
8766
  exports.MoonUICard = Card;
8578
8767
  exports.MoonUICardCVCInput = CardCVCInput;
@@ -8718,6 +8907,8 @@ exports.MoonUIToastTitle = ToastTitle;
8718
8907
  exports.MoonUIToastViewport = ToastViewport;
8719
8908
  exports.MoonUIToaster = Toaster;
8720
8909
  exports.MoonUIToggle = Toggle;
8910
+ exports.MoonUIToggleGroup = ToggleGroup;
8911
+ exports.MoonUIToggleGroupItem = ToggleGroupItem;
8721
8912
  exports.MoonUITooltip = Tooltip;
8722
8913
  exports.MoonUITooltipContent = TooltipContent;
8723
8914
  exports.MoonUITooltipProvider = TooltipProvider;
@@ -8797,6 +8988,8 @@ exports.ToastTitle = ToastTitle;
8797
8988
  exports.ToastViewport = ToastViewport;
8798
8989
  exports.Toaster = Toaster;
8799
8990
  exports.Toggle = Toggle;
8991
+ exports.ToggleGroup = ToggleGroup;
8992
+ exports.ToggleGroupItem = ToggleGroupItem;
8800
8993
  exports.Tooltip = Tooltip;
8801
8994
  exports.TooltipArrow = TooltipArrow;
8802
8995
  exports.TooltipContent = TooltipContent;
@@ -8804,6 +8997,7 @@ exports.TooltipProvider = TooltipProvider;
8804
8997
  exports.TooltipTrigger = TooltipTrigger;
8805
8998
  exports.aspectRatioVariants = aspectRatioVariants;
8806
8999
  exports.badgeVariants = badgeVariants;
9000
+ exports.buttonGroupVariants = buttonGroupVariants;
8807
9001
  exports.buttonVariants = buttonVariants;
8808
9002
  exports.carouselContentVariants = carouselContentVariants;
8809
9003
  exports.carouselItemVariants = carouselItemVariants;
@@ -8813,6 +9007,7 @@ exports.collapsibleTriggerVariants = collapsibleTriggerVariants;
8813
9007
  exports.inputOTPSlotVariants = inputOTPSlotVariants;
8814
9008
  exports.kbdVariants = kbdVariants;
8815
9009
  exports.moonUIBadgeVariants = badgeVariants;
9010
+ exports.moonUIButtonGroupVariants = buttonGroupVariants;
8816
9011
  exports.moonUIButtonVariants = buttonVariants;
8817
9012
  exports.moonUICarouselContentVariants = carouselContentVariants;
8818
9013
  exports.moonUICarouselItemVariants = carouselItemVariants;