@herca/r-kit 0.0.49 → 0.0.52

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/clients.js CHANGED
@@ -686,10 +686,10 @@ var ChipGroup = ({
686
686
  }, [selected, internalSelected]);
687
687
  const toggleSelection = (value) => {
688
688
  let newSelected;
689
- if (multiple || !multiple && internalSelected.length === 0) {
689
+ if (multiple) {
690
690
  newSelected = internalSelected.includes(value) ? internalSelected.filter((v3) => v3 !== value) : [...internalSelected, value];
691
691
  } else {
692
- newSelected = [value];
692
+ newSelected = internalSelected.includes(value) ? [] : [value];
693
693
  }
694
694
  setInternalSelected(newSelected);
695
695
  onSelect?.(newSelected);
@@ -11979,10 +11979,10 @@ var InputFile = forwardRef2(
11979
11979
  /* @__PURE__ */ jsxs71(
11980
11980
  "label",
11981
11981
  {
11982
- onDragEnter: variant === "large" ? handleDragEnter : void 0,
11983
- onDragLeave: variant === "large" ? handleDragLeave : void 0,
11984
- onDragOver: variant === "large" ? handleDragOver : void 0,
11985
- onDrop: variant === "large" ? handleDrop : void 0,
11982
+ onDragEnter: variant === "large" || variant === "medium" ? handleDragEnter : void 0,
11983
+ onDragLeave: variant === "large" || variant === "medium" ? handleDragLeave : void 0,
11984
+ onDragOver: variant === "large" || variant === "medium" ? handleDragOver : void 0,
11985
+ onDrop: variant === "large" || variant === "medium" ? handleDrop : void 0,
11986
11986
  className: cn(
11987
11987
  inputFileVariants({ variant }),
11988
11988
  "group relative flex items-center gap-2 rounded-lg border px-3 py-2 transition-all",
@@ -11993,7 +11993,7 @@ var InputFile = forwardRef2(
11993
11993
  variant === "large" && internalErrorMessage !== void 0 && "border-danger-500",
11994
11994
  //prettier-ignore
11995
11995
  variant === "large" && "flex-col items-center p-5!",
11996
- variant === "large" && isDragging && "border-primary-500 bg-primary-50",
11996
+ (variant === "large" || variant === "medium") && isDragging && "border-primary-500 bg-primary-50",
11997
11997
  //prettier-ignore
11998
11998
  disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"
11999
11999
  ),
@@ -12021,7 +12021,7 @@ var InputFile = forwardRef2(
12021
12021
  Text,
12022
12022
  {
12023
12023
  as: "p",
12024
- value: variant === "large" && !isDragging && !hint ? `Klik atau drag & drop file disini` : hint,
12024
+ value: (variant === "large" || variant === "medium") && !isDragging && !hint ? `Klik atau drag & drop file disini` : hint,
12025
12025
  className: "text-gray-600!"
12026
12026
  }
12027
12027
  )
@@ -12848,10 +12848,17 @@ var createCalendarHelpers = ({
12848
12848
  value,
12849
12849
  rangeValue,
12850
12850
  disabledDates,
12851
- dayConfigs
12851
+ dayConfigs,
12852
+ disabled
12852
12853
  }) => {
12853
12854
  const isDateDisabled = (day) => {
12854
- return disabledDates.some((d) => d.getTime() === day.fullDate.getTime());
12855
+ if (disabledDates.some((d) => d.getTime() === day.fullDate.getTime())) {
12856
+ return true;
12857
+ }
12858
+ if (disabled?.(day.fullDate) === true) {
12859
+ return true;
12860
+ }
12861
+ return false;
12855
12862
  };
12856
12863
  const getDayConfig = (day) => {
12857
12864
  return dayConfigs.find((c) => c.date.getTime() === day.fullDate.getTime());
@@ -13129,7 +13136,8 @@ function CalendarDayItem({
13129
13136
  onClick,
13130
13137
  variant,
13131
13138
  events,
13132
- backdropOnClick
13139
+ backdropOnClick,
13140
+ disabledDateClassName
13133
13141
  }) {
13134
13142
  const dayConfig = helpers.getDayConfig(day);
13135
13143
  const isSelected = helpers.isDateSelected(day);
@@ -13165,8 +13173,9 @@ function CalendarDayItem({
13165
13173
  mode === "single" && variant === "compact" && styleHelpers.getBackgroundClass(),
13166
13174
  //prettier-ignore
13167
13175
  mode === "range" && !isDisabled && helpers.getRangeBackgroundClass(day),
13168
- variant === "default" && "h-28 md:h-36 w-full rounded-none flex items-start justify-start group p-1 md:p-3 border-r border-gray-300"
13176
+ variant === "default" && "h-28 md:h-36 w-full rounded-none flex items-start justify-start group p-1 md:p-3 border-r border-gray-300",
13169
13177
  //prettier-ignore
13178
+ isDisabled && disabledDateClassName
13170
13179
  ),
13171
13180
  children: [
13172
13181
  /* @__PURE__ */ jsx382(
@@ -13345,7 +13354,8 @@ function CalendarGrid({
13345
13354
  showCalendarTooltip = true,
13346
13355
  backdropOnClick,
13347
13356
  onEventClick,
13348
- useLimitEvent = true
13357
+ useLimitEvent = true,
13358
+ disabledDateClassName
13349
13359
  }) {
13350
13360
  const isMobile = useIsMobile();
13351
13361
  const weeks = Array.from(
@@ -13473,7 +13483,8 @@ function CalendarGrid({
13473
13483
  onClick,
13474
13484
  variant,
13475
13485
  events,
13476
- backdropOnClick: variant === "default" && backdropOnClick ? (day2) => backdropOnClick?.(day2) : void 0
13486
+ backdropOnClick: variant === "default" && backdropOnClick ? (day2) => backdropOnClick?.(day2) : void 0,
13487
+ disabledDateClassName
13477
13488
  },
13478
13489
  dayIndex
13479
13490
  ))
@@ -13858,7 +13869,9 @@ var Calendar2 = ({
13858
13869
  onMonthChange,
13859
13870
  onYearChange,
13860
13871
  showDefaultController = false,
13861
- useLimitEvent = true
13872
+ useLimitEvent = true,
13873
+ disabled,
13874
+ disabledDateClassName
13862
13875
  }) => {
13863
13876
  const currentDate = /* @__PURE__ */ new Date();
13864
13877
  const [currentMonth, setCurrentMonth] = useState10(defaultMonth ?? currentDate.getMonth());
@@ -13883,7 +13896,8 @@ var Calendar2 = ({
13883
13896
  dayConfigs,
13884
13897
  rangeValue,
13885
13898
  mode,
13886
- value
13899
+ value,
13900
+ disabled
13887
13901
  });
13888
13902
  const calendarState = {
13889
13903
  currentMonth,
@@ -13899,8 +13913,8 @@ var Calendar2 = ({
13899
13913
  };
13900
13914
  const handleDateClick = (day) => {
13901
13915
  const dayConfig = calendarHelpers.getDayConfig(day);
13902
- const disabled = (dayConfig?.disabled ?? false) || calendarHelpers.isDateDisabled(day);
13903
- if (disabled) {
13916
+ const disabled2 = (dayConfig?.disabled ?? false) || calendarHelpers.isDateDisabled(day);
13917
+ if (disabled2) {
13904
13918
  return;
13905
13919
  }
13906
13920
  onChange?.(day.fullDate);
@@ -14115,7 +14129,8 @@ var Calendar2 = ({
14115
14129
  showCalendarTooltip,
14116
14130
  useLimitEvent,
14117
14131
  onEventClick,
14118
- backdropOnClick
14132
+ backdropOnClick,
14133
+ disabledDateClassName
14119
14134
  }
14120
14135
  )
14121
14136
  ] })
@@ -14257,6 +14272,9 @@ var DatePicker = ({
14257
14272
  trigger,
14258
14273
  open,
14259
14274
  onOpenChange,
14275
+ minDate,
14276
+ maxDate,
14277
+ disabledDateClassName,
14260
14278
  calendarProps,
14261
14279
  endDateCalendarProps,
14262
14280
  startDateCalendarProps,
@@ -14537,6 +14555,12 @@ var DatePicker = ({
14537
14555
  dayWrapperClassname: "justify-between",
14538
14556
  onChange: handleCalendarChange,
14539
14557
  value: selectedDate,
14558
+ disabled: (date) => {
14559
+ if (minDate !== void 0 && date < minDate) return true;
14560
+ if (maxDate !== void 0 && date > maxDate) return true;
14561
+ return false;
14562
+ },
14563
+ disabledDateClassName,
14540
14564
  ...calendarProps
14541
14565
  }
14542
14566
  ) : /* @__PURE__ */ jsxs81("div", { className: "flex", children: [
@@ -14648,6 +14672,16 @@ var DatePicker = ({
14648
14672
  value: dateRange.start,
14649
14673
  rangeValue: dateRange,
14650
14674
  mode: "range",
14675
+ disabled: (date) => {
14676
+ if (minDate !== void 0 && date < minDate) {
14677
+ return true;
14678
+ }
14679
+ if (maxDate !== void 0 && date > maxDate) {
14680
+ return true;
14681
+ }
14682
+ return false;
14683
+ },
14684
+ disabledDateClassName,
14651
14685
  ...startDateCalendarProps
14652
14686
  }
14653
14687
  ),
@@ -14665,6 +14699,16 @@ var DatePicker = ({
14665
14699
  mode: "range",
14666
14700
  defaultMonth: nextMonthData.month,
14667
14701
  defaultYear: nextMonthData.year,
14702
+ disabled: (date) => {
14703
+ if (minDate !== void 0 && date < minDate) {
14704
+ return true;
14705
+ }
14706
+ if (maxDate !== void 0 && date > maxDate) {
14707
+ return true;
14708
+ }
14709
+ return false;
14710
+ },
14711
+ disabledDateClassName,
14668
14712
  ...endDateCalendarProps
14669
14713
  }
14670
14714
  )
@@ -15242,6 +15286,7 @@ function Select({
15242
15286
  required,
15243
15287
  isSelectOpen,
15244
15288
  onOpenChange,
15289
+ searchOptions,
15245
15290
  searchPlaceholder = "Search..."
15246
15291
  }) {
15247
15292
  const [isOpen, setIsOpen] = useState14(false);
@@ -15376,6 +15421,11 @@ function Select({
15376
15421
  useEffect10(() => {
15377
15422
  onOpenChange?.(isOpen);
15378
15423
  }, [isOpen]);
15424
+ useEffect10(() => {
15425
+ if (searchOptions !== void 0) {
15426
+ setSearchTerm(searchOptions);
15427
+ }
15428
+ }, [searchOptions]);
15379
15429
  const getDisplayValue = () => {
15380
15430
  const isEmpty = value == null || isMulti && asArray(value).length === 0;
15381
15431
  if (isEmpty) {
@@ -26591,6 +26641,11 @@ var FontSize = Extension.create({
26591
26641
 
26592
26642
  // src/components/text-editor/extension/image-node.ts
26593
26643
  import Image2 from "@tiptap/extension-image";
26644
+ var getJustify = (align) => {
26645
+ if (align === "right") return "flex-end";
26646
+ if (align === "center") return "center";
26647
+ return "flex-start";
26648
+ };
26594
26649
  var ImageNode = Image2.extend({
26595
26650
  // jadikan block supaya bisa di-align
26596
26651
  inline: false,
@@ -26629,9 +26684,10 @@ var ImageNode = Image2.extend({
26629
26684
  },
26630
26685
  textAlign: {
26631
26686
  default: "left",
26632
- parseHTML: (el) => el.closest("[data-image-wrapper]")?.getAttribute("data-align") ?? "left",
26633
- renderHTML: () => ({})
26634
- // dihandle di nodeView
26687
+ parseHTML: (el) => el.getAttribute("data-text-align") ?? el.closest("[data-image-wrapper]")?.getAttribute("data-align") ?? "left",
26688
+ renderHTML: (attrs) => ({
26689
+ "data-text-align": attrs["textAlign"]
26690
+ })
26635
26691
  },
26636
26692
  url: {
26637
26693
  default: null,
@@ -26649,26 +26705,23 @@ var ImageNode = Image2.extend({
26649
26705
  },
26650
26706
  renderHTML({ HTMLAttributes }) {
26651
26707
  const {
26652
- textAlign,
26653
26708
  objectFit,
26654
26709
  url,
26655
26710
  urlTarget,
26711
+ "data-text-align": dataTextAlign,
26656
26712
  "data-url": dataUrl,
26657
- // ← ambil dari sini
26658
26713
  "data-url-target": dataUrlTarget,
26659
26714
  ...rest
26660
26715
  } = HTMLAttributes;
26661
- const align = textAlign ?? "left";
26662
- const getJustify2 = (a) => a === "right" ? "flex-end" : a === "center" ? "center" : "flex-start";
26716
+ const align = typeof dataTextAlign === "string" && dataTextAlign.length > 0 ? dataTextAlign : "left";
26663
26717
  const resolvedUrl = url ?? dataUrl ?? null;
26664
26718
  const resolvedTarget = urlTarget ?? dataUrlTarget ?? "_self";
26665
26719
  const img = [
26666
26720
  "img",
26667
26721
  mergeAttributes(rest, {
26668
26722
  style: `object-fit: ${objectFit ?? "contain"}`,
26669
- // tambahkan data-* ke <img> supaya parseHTML bisa baca saat load HTML
26670
- ...url !== null ? { "data-url": url } : {},
26671
- ...urlTarget == null ? { "data-url-target": urlTarget } : {}
26723
+ ...resolvedUrl !== null ? { "data-url": resolvedUrl } : {},
26724
+ ...resolvedTarget != null ? { "data-url-target": resolvedTarget } : {}
26672
26725
  })
26673
26726
  ];
26674
26727
  const content = resolvedUrl != null ? ["a", { href: resolvedUrl, target: resolvedTarget }, img] : img;
@@ -26677,7 +26730,7 @@ var ImageNode = Image2.extend({
26677
26730
  {
26678
26731
  "data-image-wrapper": "",
26679
26732
  "data-align": align,
26680
- "style": `display:flex;justify-content:${getJustify2(align)};`
26733
+ "style": `display:flex;justify-content:${getJustify(align)};`
26681
26734
  },
26682
26735
  content
26683
26736
  ];
@@ -26693,8 +26746,7 @@ var ImageNode = Image2.extend({
26693
26746
  const align = n.attrs["textAlign"] ?? "left";
26694
26747
  const url = n.attrs["url"];
26695
26748
  const urlTarget = n.attrs["urlTarget"] ?? "_self";
26696
- const getJustify2 = (a) => a === "right" ? "flex-end" : a === "center" ? "center" : "flex-start";
26697
- wrapper.style.cssText = `display: flex; justify-content: ${getJustify2(align)};`;
26749
+ wrapper.style.cssText = `display: flex; justify-content: ${getJustify(align)};`;
26698
26750
  wrapper.setAttribute("data-align", align);
26699
26751
  if (n.attrs["src"])
26700
26752
  img.setAttribute("src", n.attrs["src"]);
@@ -26704,6 +26756,17 @@ var ImageNode = Image2.extend({
26704
26756
  img.setAttribute("width", String(n.attrs["width"]));
26705
26757
  if (n.attrs["height"])
26706
26758
  img.setAttribute("height", String(n.attrs["height"]));
26759
+ img.setAttribute("data-text-align", align);
26760
+ if (url !== null) {
26761
+ img.setAttribute("data-url", url);
26762
+ } else {
26763
+ img.removeAttribute("data-url");
26764
+ }
26765
+ if (urlTarget !== null) {
26766
+ img.setAttribute("data-url-target", urlTarget);
26767
+ } else {
26768
+ img.removeAttribute("data-url-target");
26769
+ }
26707
26770
  img.style.objectFit = n.attrs["objectFit"] ?? "contain";
26708
26771
  wrapper.innerHTML = "";
26709
26772
  if (url !== null) {
@@ -26997,7 +27060,7 @@ var TableNode = Table2.extend({
26997
27060
  var table_node_default = TableNode;
26998
27061
 
26999
27062
  // src/components/text-editor/extension/youtube-node.ts
27000
- var getJustify = (align) => {
27063
+ var getJustify2 = (align) => {
27001
27064
  switch (align) {
27002
27065
  case "left":
27003
27066
  return "flex-start";
@@ -27063,7 +27126,7 @@ var YoutubeNode = Node3.create({
27063
27126
  const wrapper = document.createElement("div");
27064
27127
  wrapper.style.cssText = "display: flex; justify-content: center; margin: 0.5rem 0;";
27065
27128
  const updateAlignment = (align) => {
27066
- wrapper.style.justifyContent = getJustify(align);
27129
+ wrapper.style.justifyContent = getJustify2(align);
27067
27130
  };
27068
27131
  const iframe = document.createElement("iframe");
27069
27132
  iframe.setAttribute("src", node.attrs["src"]);
@@ -33621,6 +33684,16 @@ var target_link_options_default = targetOptions;
33621
33684
 
33622
33685
  // src/components/text-editor/partials/modal-insert-image.tsx
33623
33686
  import { jsx as jsx407, jsxs as jsxs92 } from "react/jsx-runtime";
33687
+ var createDefaultImageForm = () => ({
33688
+ url: null,
33689
+ image: {
33690
+ objectFit: object_fit_options_default[0],
33691
+ source: "",
33692
+ altText: "",
33693
+ width: "200",
33694
+ height: "200"
33695
+ }
33696
+ });
33624
33697
  function ModalInsertImage({
33625
33698
  isOpen,
33626
33699
  onClose,
@@ -33639,22 +33712,25 @@ function ModalInsertImage({
33639
33712
  altText: data[0].uploadedData?.data.name ?? ""
33640
33713
  };
33641
33714
  }
33642
- }
33715
+ },
33716
+ onDownload
33643
33717
  }) {
33644
33718
  const [currentTabImage, setCurrentTabImage] = useState19("0");
33719
+ const [uploadInputKey, setUploadInputKey] = useState19(0);
33720
+ const [uploadFiles, setUploadFiles] = useState19([]);
33645
33721
  const [errors, setErrors] = useState19(
33646
33722
  {}
33647
33723
  );
33648
- const [imageForm, setImageForm] = useState19({
33649
- url: null,
33650
- image: {
33651
- objectFit: object_fit_options_default[0],
33652
- source: "",
33653
- altText: "",
33654
- width: "200",
33655
- height: "200"
33656
- }
33657
- });
33724
+ const [imageForm, setImageForm] = useState19(
33725
+ createDefaultImageForm()
33726
+ );
33727
+ const resetFormState = () => {
33728
+ setCurrentTabImage("0");
33729
+ setErrors({});
33730
+ setImageForm(createDefaultImageForm());
33731
+ setUploadFiles([]);
33732
+ setUploadInputKey((prev) => prev + 1);
33733
+ };
33658
33734
  const validate = () => {
33659
33735
  const newErrors = {};
33660
33736
  if (imageForm?.image?.source === "" || imageForm?.image?.source === null || imageForm?.image?.source === void 0) {
@@ -33673,9 +33749,16 @@ function ModalInsertImage({
33673
33749
  return Object.keys(newErrors).length === 0;
33674
33750
  };
33675
33751
  useEffect14(() => {
33676
- if (isOpen && initialValues !== void 0) {
33752
+ if (!isOpen) return;
33753
+ setErrors({});
33754
+ setCurrentTabImage("0");
33755
+ setUploadFiles([]);
33756
+ setUploadInputKey((prev) => prev + 1);
33757
+ if (initialValues !== void 0) {
33677
33758
  setImageForm(initialValues);
33759
+ return;
33678
33760
  }
33761
+ setImageForm(createDefaultImageForm());
33679
33762
  }, [isOpen, initialValues]);
33680
33763
  return /* @__PURE__ */ jsxs92(Modal, { isOpen, onClose: () => onClose(false), closable: false, children: [
33681
33764
  /* @__PURE__ */ jsxs92(ModalHeader, { className: "flex-row! items-center justify-between border-b border-gray-200", children: [
@@ -33699,7 +33782,7 @@ function ModalInsertImage({
33699
33782
  if (!validate()) return;
33700
33783
  onSubmit(imageForm);
33701
33784
  onClose(false);
33702
- setImageForm(null);
33785
+ resetFormState();
33703
33786
  },
33704
33787
  className: "overflow-auto",
33705
33788
  children: [
@@ -33880,8 +33963,11 @@ function ModalInsertImage({
33880
33963
  maxSize: (attachmentField?.maxSize ?? 0) * 1024 * 1024,
33881
33964
  variant: attachmentField?.variant ?? "medium",
33882
33965
  uploadConfig: attachmentField?.uploadConfig,
33883
- onChange: attachmentField?.onChange ? (files) => attachmentField?.onChange?.(files) : void 0,
33884
- value: attachmentField?.value,
33966
+ onChange: (files) => {
33967
+ setUploadFiles(files);
33968
+ attachmentField?.onChange?.(files);
33969
+ },
33970
+ value: uploadFiles,
33885
33971
  onUploadSuccess: (results) => {
33886
33972
  const { url, altText } = attachmentField.extractUploadResult(results);
33887
33973
  setCurrentTabImage("0");
@@ -33897,8 +33983,10 @@ function ModalInsertImage({
33897
33983
  };
33898
33984
  });
33899
33985
  attachmentField?.onUploadSuccess?.(results);
33900
- }
33901
- }
33986
+ },
33987
+ onDownload
33988
+ },
33989
+ uploadInputKey
33902
33990
  ) })
33903
33991
  ]
33904
33992
  }
@@ -33912,7 +34000,7 @@ function ModalInsertImage({
33912
34000
  type: "button",
33913
34001
  onClick: () => {
33914
34002
  onClose(false);
33915
- setImageForm(null);
34003
+ resetFormState();
33916
34004
  },
33917
34005
  children: "Cancel"
33918
34006
  }
@@ -34128,7 +34216,8 @@ import { jsx as jsx409, jsxs as jsxs94 } from "react/jsx-runtime";
34128
34216
  function InsertGroup({
34129
34217
  editor,
34130
34218
  disabled = false,
34131
- attachmentField
34219
+ attachmentField,
34220
+ onDownload
34132
34221
  }) {
34133
34222
  const [isModalImageOpen, setIsModalImageOpen] = useState21(false);
34134
34223
  const [isModalYoutubeOpen, setIsModalYoutubeOpen] = useState21(false);
@@ -34285,7 +34374,8 @@ function InsertGroup({
34285
34374
  url: form.url?.source ?? null,
34286
34375
  urlTarget: form.url?.target?.value ?? "_self"
34287
34376
  }).run();
34288
- }
34377
+ },
34378
+ onDownload
34289
34379
  }
34290
34380
  )
34291
34381
  ] });
@@ -34367,7 +34457,7 @@ function TableGroup({
34367
34457
  {
34368
34458
  title: "Delete Row",
34369
34459
  icon: "table-delete-row",
34370
- onClick: () => editor.chain().focus().addRowAfter().run(),
34460
+ onClick: () => editor.chain().focus().deleteRow().run(),
34371
34461
  requiresTable: false,
34372
34462
  disabled
34373
34463
  }
@@ -34383,7 +34473,7 @@ function TableGroup({
34383
34473
  {
34384
34474
  title: "Delete Column",
34385
34475
  icon: "table-delete-column",
34386
- onClick: () => editor.chain().focus().addColumnBefore().run(),
34476
+ onClick: () => editor.chain().focus().deleteColumn().run(),
34387
34477
  requiresTable: false,
34388
34478
  disabled
34389
34479
  }
@@ -34498,7 +34588,8 @@ function TextEditor({
34498
34588
  ui: ui3,
34499
34589
  field,
34500
34590
  toolbar,
34501
- editor: editorProps
34591
+ editor: editorProps,
34592
+ onDownload
34502
34593
  }) {
34503
34594
  const {
34504
34595
  disabled = false,
@@ -34637,7 +34728,8 @@ function TextEditor({
34637
34728
  {
34638
34729
  disabled: isHtmlMode,
34639
34730
  editor,
34640
- attachmentField
34731
+ attachmentField,
34732
+ onDownload
34641
34733
  }
34642
34734
  ),
34643
34735
  table && /* @__PURE__ */ jsx411(TableGroup, { disabled: isHtmlMode, editor }),
@@ -34695,8 +34787,228 @@ function TextEditor({
34695
34787
  }
34696
34788
  );
34697
34789
  }
34790
+
34791
+ // src/components/radio/radio.tsx
34792
+ import React368, { createContext as createContext7, useContext as useContext7, useId as useId5 } from "react";
34793
+
34794
+ // src/components/radio/radio-variants.ts
34795
+ import { cva as cva13 } from "class-variance-authority";
34796
+ var RadioVariants = cva13(
34797
+ "flex items-center justify-center rounded-full border transition-all focus-visible:ring-1 focus-visible:ring-offset-0 focus-visible:outline-none",
34798
+ {
34799
+ variants: {
34800
+ size: {
34801
+ sm: "h-4 w-4",
34802
+ md: "h-5 w-5",
34803
+ lg: "h-6 w-6"
34804
+ },
34805
+ color: {
34806
+ primary: "border-primary-1000 focus-visible:ring-primary-900",
34807
+ secondary: "border-gray-600 focus-visible:ring-gray-500",
34808
+ success: "border-success-500 focus-visible:ring-success-400",
34809
+ danger: "border-danger-500 focus-visible:ring-danger-400",
34810
+ warning: "border-warning-500 focus-visible:ring-warning-400",
34811
+ info: "border-info-500 focus-visible:ring-info-400",
34812
+ orange: "border-orange-500 focus-visible:ring-orange-400",
34813
+ purple: "border-purple-500 focus-visible:ring-purple-400",
34814
+ gray: "border-gray-600 focus-visible:ring-gray-500"
34815
+ }
34816
+ },
34817
+ defaultVariants: {
34818
+ size: "md",
34819
+ color: "primary"
34820
+ }
34821
+ }
34822
+ );
34823
+ var RadioIndicatorVariants = cva13("rounded-full transition-all", {
34824
+ variants: {
34825
+ size: {
34826
+ sm: "h-2 w-2",
34827
+ md: "h-2.5 w-2.5",
34828
+ lg: "h-3 w-3"
34829
+ },
34830
+ color: {
34831
+ primary: "bg-primary-1000",
34832
+ secondary: "bg-gray-600",
34833
+ success: "bg-success-500",
34834
+ danger: "bg-danger-500",
34835
+ warning: "bg-warning-500",
34836
+ info: "bg-info-500",
34837
+ orange: "bg-orange-500",
34838
+ purple: "bg-purple-500",
34839
+ gray: "bg-gray-600"
34840
+ }
34841
+ },
34842
+ defaultVariants: {
34843
+ size: "md",
34844
+ color: "primary"
34845
+ }
34846
+ });
34847
+
34848
+ // src/components/radio/radio.tsx
34849
+ import { jsx as jsx412, jsxs as jsxs97 } from "react/jsx-runtime";
34850
+ var RadioGroupContext = createContext7(
34851
+ void 0
34852
+ );
34853
+ var RadioGroup = ({
34854
+ value,
34855
+ defaultValue,
34856
+ onValueChange,
34857
+ disabled = false,
34858
+ required = false,
34859
+ name,
34860
+ size = "md",
34861
+ color = "primary",
34862
+ className,
34863
+ label,
34864
+ hint,
34865
+ description,
34866
+ errorMessages,
34867
+ direction = "vertical",
34868
+ children
34869
+ }) => {
34870
+ const [internalValue, setInternalValue] = React368.useState(
34871
+ defaultValue ?? value ?? ""
34872
+ );
34873
+ const currentValue = value !== void 0 ? value : internalValue;
34874
+ const handleValueChange = (newValue) => {
34875
+ if (value === void 0) {
34876
+ setInternalValue(newValue);
34877
+ }
34878
+ onValueChange?.(newValue);
34879
+ };
34880
+ return /* @__PURE__ */ jsx412(
34881
+ RadioGroupContext.Provider,
34882
+ {
34883
+ value: {
34884
+ value: currentValue,
34885
+ onValueChange: handleValueChange,
34886
+ disabled,
34887
+ name,
34888
+ size,
34889
+ color
34890
+ },
34891
+ children: /* @__PURE__ */ jsx412(
34892
+ FormField,
34893
+ {
34894
+ label,
34895
+ hint,
34896
+ description,
34897
+ errorMessages,
34898
+ className,
34899
+ required,
34900
+ size,
34901
+ children: /* @__PURE__ */ jsx412(
34902
+ "div",
34903
+ {
34904
+ role: "radiogroup",
34905
+ "aria-required": required,
34906
+ className: cn(
34907
+ "flex gap-4",
34908
+ direction === "vertical" ? "flex-col" : "flex-row flex-wrap"
34909
+ ),
34910
+ children
34911
+ }
34912
+ )
34913
+ }
34914
+ )
34915
+ }
34916
+ );
34917
+ };
34918
+ var BaseRadio = ({
34919
+ id: providedId,
34920
+ value,
34921
+ checked,
34922
+ disabled: disabledProp = false,
34923
+ required = false,
34924
+ size: sizeProp,
34925
+ color: colorProp,
34926
+ onCheckedChange,
34927
+ className
34928
+ }) => {
34929
+ const generatedId = useId5();
34930
+ const id = providedId ?? generatedId;
34931
+ const context = useContext7(RadioGroupContext);
34932
+ const isChecked = context ? context.value === value : checked ?? false;
34933
+ const disabled = disabledProp ?? context?.disabled ?? false;
34934
+ const name = context?.name;
34935
+ const size = sizeProp ?? context?.size ?? "md";
34936
+ const color = colorProp ?? context?.color ?? "primary";
34937
+ const handleChange = () => {
34938
+ if (disabled) return;
34939
+ if (context) {
34940
+ context.onValueChange?.(value);
34941
+ } else {
34942
+ onCheckedChange?.(!isChecked);
34943
+ }
34944
+ };
34945
+ return /* @__PURE__ */ jsxs97(
34946
+ "button",
34947
+ {
34948
+ type: "button",
34949
+ role: "radio",
34950
+ id,
34951
+ "aria-checked": isChecked,
34952
+ "aria-required": required,
34953
+ disabled,
34954
+ onClick: handleChange,
34955
+ className: cn(
34956
+ RadioVariants({ size, color }),
34957
+ !isChecked && "border-gray-300",
34958
+ disabled && "cursor-not-allowed opacity-50",
34959
+ !disabled && "hover:border-opacity-80 cursor-pointer",
34960
+ "bg-white",
34961
+ className
34962
+ ),
34963
+ children: [
34964
+ Boolean(name) && /* @__PURE__ */ jsx412(
34965
+ "input",
34966
+ {
34967
+ type: "radio",
34968
+ name,
34969
+ value,
34970
+ checked: isChecked,
34971
+ onChange: () => {
34972
+ },
34973
+ className: "sr-only",
34974
+ disabled,
34975
+ required
34976
+ }
34977
+ ),
34978
+ /* @__PURE__ */ jsx412(
34979
+ "span",
34980
+ {
34981
+ className: cn(
34982
+ RadioIndicatorVariants({ size, color }),
34983
+ isChecked ? "scale-100" : "scale-0 bg-transparent"
34984
+ )
34985
+ }
34986
+ )
34987
+ ]
34988
+ }
34989
+ );
34990
+ };
34991
+ var Radio = ({ label, description, className, size: sizeProp, ...props }) => {
34992
+ const generatedId = useId5();
34993
+ const id = props?.id ?? generatedId;
34994
+ const context = useContext7(RadioGroupContext);
34995
+ const size = sizeProp ?? context?.size ?? "md";
34996
+ const labelSizeClasses = {
34997
+ sm: "text-xs",
34998
+ md: "text-sm",
34999
+ lg: "text-base"
35000
+ };
35001
+ return /* @__PURE__ */ jsxs97("div", { className: cn("inline-flex items-center gap-2", className), children: [
35002
+ /* @__PURE__ */ jsx412(BaseRadio, { ...props, id, size }),
35003
+ /* @__PURE__ */ jsxs97("div", { className: "flex flex-col", children: [
35004
+ Boolean(label) && /* @__PURE__ */ jsx412(FormLabel, { htmlFor: id, className: labelSizeClasses[size], children: label }),
35005
+ Boolean(description) && /* @__PURE__ */ jsx412(FormDescription, { children: description })
35006
+ ] })
35007
+ ] });
35008
+ };
34698
35009
  export {
34699
35010
  BaseCheckbox,
35011
+ BaseRadio,
34700
35012
  BaseSwitch,
34701
35013
  ButtonDropdown,
34702
35014
  ButtonGroup,
@@ -34737,6 +35049,10 @@ export {
34737
35049
  ModalPreviewAttachment,
34738
35050
  ModalTitle,
34739
35051
  PreviewItem,
35052
+ Radio,
35053
+ RadioGroup,
35054
+ RadioIndicatorVariants,
35055
+ RadioVariants,
34740
35056
  Select,
34741
35057
  Sheet,
34742
35058
  SheetClose,