formanitor 0.0.22 → 0.0.24

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
@@ -1,14 +1,19 @@
1
- import * as React11 from 'react';
2
- import React11__default, { createContext, useContext, useRef, useEffect, useState, useMemo, useCallback } from 'react';
1
+ import * as React13 from 'react';
2
+ import React13__default, { createContext, useContext, useRef, useEffect, useState, useMemo, useCallback, useReducer } from 'react';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import * as LabelPrimitive from '@radix-ui/react-label';
7
7
  import { cva } from 'class-variance-authority';
8
+ import { useEditor, EditorContent } from '@tiptap/react';
9
+ import StarterKit from '@tiptap/starter-kit';
10
+ import Placeholder from '@tiptap/extension-placeholder';
11
+ import Underline from '@tiptap/extension-underline';
12
+ import { ChevronDown, ChevronUp, Check, Circle, X, Image, Upload, Trash2, Plus, Loader2, PenTool, Undo, Redo, ChevronRight, Calendar as Calendar$1, ChevronLeft, RefreshCw, Clock, Bold, Italic, Underline as Underline$1, Strikethrough, List, ListOrdered } from 'lucide-react';
13
+ import { Slot } from '@radix-ui/react-slot';
14
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
8
15
  import * as SelectPrimitive from '@radix-ui/react-select';
9
- import { ChevronDown, ChevronUp, Check, Circle, X, Image, Upload, Trash2, Plus, Loader2, PenTool, ChevronRight, Calendar as Calendar$1, ChevronLeft, RefreshCw, Clock } from 'lucide-react';
10
16
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
11
- import { Slot } from '@radix-ui/react-slot';
12
17
  import { format, addDays, addWeeks, addMonths, differenceInCalendarDays, parseISO } from 'date-fns';
13
18
  import { DayPicker } from 'react-day-picker';
14
19
  import * as PopoverPrimitive from '@radix-ui/react-popover';
@@ -749,7 +754,7 @@ function useField(fieldId) {
749
754
  function cn(...inputs) {
750
755
  return twMerge(clsx(inputs));
751
756
  }
752
- var Input = React11.forwardRef(
757
+ var Input = React13.forwardRef(
753
758
  ({ className, type, ...props }, ref) => {
754
759
  return /* @__PURE__ */ jsx(
755
760
  "input",
@@ -769,7 +774,7 @@ Input.displayName = "Input";
769
774
  var labelVariants = cva(
770
775
  "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
771
776
  );
772
- var Label = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
777
+ var Label = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
773
778
  LabelPrimitive.Root,
774
779
  {
775
780
  ref,
@@ -778,7 +783,7 @@ var Label = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
778
783
  }
779
784
  ));
780
785
  Label.displayName = LabelPrimitive.Root.displayName;
781
- var Textarea = React11.forwardRef(
786
+ var Textarea = React13.forwardRef(
782
787
  ({ className, height, style, ...props }, ref) => {
783
788
  return /* @__PURE__ */ jsx(
784
789
  "textarea",
@@ -824,8 +829,8 @@ var TextWidget = ({ fieldId }) => {
824
829
  const { state } = useForm();
825
830
  const showError = !!error && (touched || state.submitAttempted);
826
831
  if (!fieldDef) return null;
827
- const Component = fieldDef.type === "textarea" || fieldDef.type === "richtext" ? Textarea : Input;
828
- const isTextarea = fieldDef.type === "textarea" || fieldDef.type === "richtext";
832
+ const Component = fieldDef.type === "textarea" ? Textarea : Input;
833
+ const isTextarea = fieldDef.type === "textarea";
829
834
  const height = isTextarea && "height" in fieldDef ? fieldDef.height : void 0;
830
835
  const theme = getThemeConfig(
831
836
  isTextarea ? "textarea" : "text",
@@ -857,9 +862,298 @@ var TextWidget = ({ fieldId }) => {
857
862
  showError && /* @__PURE__ */ jsx("p", { className: "text-xs text-red-500", children: error })
858
863
  ] });
859
864
  };
865
+ var buttonVariants = cva(
866
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
867
+ {
868
+ variants: {
869
+ variant: {
870
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
871
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
872
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
873
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
874
+ ghost: "hover:bg-accent hover:text-accent-foreground",
875
+ link: "text-primary underline-offset-4 hover:underline"
876
+ },
877
+ size: {
878
+ default: "h-10 px-4 py-2",
879
+ sm: "h-9 rounded-md px-3",
880
+ lg: "h-11 rounded-md px-8",
881
+ icon: "h-10 w-10"
882
+ }
883
+ },
884
+ defaultVariants: {
885
+ variant: "default",
886
+ size: "default"
887
+ }
888
+ }
889
+ );
890
+ var Button = React13.forwardRef(
891
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
892
+ const Comp = asChild ? Slot : "button";
893
+ return /* @__PURE__ */ jsx(
894
+ Comp,
895
+ {
896
+ className: cn(buttonVariants({ variant, size, className })),
897
+ ref,
898
+ ...props
899
+ }
900
+ );
901
+ }
902
+ );
903
+ Button.displayName = "Button";
904
+ var Separator = React13.forwardRef(
905
+ ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
906
+ SeparatorPrimitive.Root,
907
+ {
908
+ ref,
909
+ decorative,
910
+ orientation,
911
+ className: cn(
912
+ "shrink-0 bg-border",
913
+ orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
914
+ className
915
+ ),
916
+ ...props
917
+ }
918
+ )
919
+ );
920
+ Separator.displayName = SeparatorPrimitive.Root.displayName;
921
+ function isEmptyHtml(html) {
922
+ const t = html.trim();
923
+ return t === "" || t === "<p></p>" || t === "<p><br></p>" || t === '<p><br class="ProseMirror-trailingBreak"></p>';
924
+ }
925
+ function RichTextToolbar({
926
+ editor,
927
+ disabled
928
+ }) {
929
+ const [, rerender] = useReducer((n) => n + 1, 0);
930
+ useEffect(() => {
931
+ if (!editor) return;
932
+ const handler = () => rerender();
933
+ editor.on("selectionUpdate", handler);
934
+ editor.on("transaction", handler);
935
+ return () => {
936
+ editor.off("selectionUpdate", handler);
937
+ editor.off("transaction", handler);
938
+ };
939
+ }, [editor]);
940
+ if (!editor) {
941
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]" });
942
+ }
943
+ const fmtBtn = (active, onClick, icon, title) => /* @__PURE__ */ jsx(
944
+ Button,
945
+ {
946
+ type: "button",
947
+ variant: active ? "secondary" : "outline",
948
+ size: "icon",
949
+ className: "h-8 w-8 shrink-0",
950
+ disabled,
951
+ title,
952
+ onClick: () => {
953
+ if (!disabled) onClick();
954
+ },
955
+ children: icon
956
+ }
957
+ );
958
+ return /* @__PURE__ */ jsxs(
959
+ "div",
960
+ {
961
+ className: "flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5",
962
+ role: "toolbar",
963
+ "aria-label": "Rich text formatting",
964
+ children: [
965
+ fmtBtn(
966
+ editor.isActive("bold"),
967
+ () => editor.chain().focus().toggleBold().run(),
968
+ /* @__PURE__ */ jsx(Bold, { className: "h-4 w-4" }),
969
+ "Bold"
970
+ ),
971
+ fmtBtn(
972
+ editor.isActive("italic"),
973
+ () => editor.chain().focus().toggleItalic().run(),
974
+ /* @__PURE__ */ jsx(Italic, { className: "h-4 w-4" }),
975
+ "Italic"
976
+ ),
977
+ fmtBtn(
978
+ editor.isActive("underline"),
979
+ () => editor.chain().focus().toggleUnderline().run(),
980
+ /* @__PURE__ */ jsx(Underline$1, { className: "h-4 w-4" }),
981
+ "Underline"
982
+ ),
983
+ fmtBtn(
984
+ editor.isActive("strike"),
985
+ () => editor.chain().focus().toggleStrike().run(),
986
+ /* @__PURE__ */ jsx(Strikethrough, { className: "h-4 w-4" }),
987
+ "Strikethrough"
988
+ ),
989
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-0.5 h-6" }),
990
+ fmtBtn(
991
+ editor.isActive("bulletList"),
992
+ () => editor.chain().focus().toggleBulletList().run(),
993
+ /* @__PURE__ */ jsx(List, { className: "h-4 w-4" }),
994
+ "Bullet list"
995
+ ),
996
+ fmtBtn(
997
+ editor.isActive("orderedList"),
998
+ () => editor.chain().focus().toggleOrderedList().run(),
999
+ /* @__PURE__ */ jsx(ListOrdered, { className: "h-4 w-4" }),
1000
+ "Numbered list"
1001
+ ),
1002
+ /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-0.5 h-6" }),
1003
+ /* @__PURE__ */ jsx(
1004
+ Button,
1005
+ {
1006
+ type: "button",
1007
+ variant: "outline",
1008
+ size: "icon",
1009
+ className: "h-8 w-8 shrink-0",
1010
+ disabled: disabled || !editor.can().undo(),
1011
+ title: "Undo",
1012
+ onClick: () => editor.chain().focus().undo().run(),
1013
+ children: /* @__PURE__ */ jsx(Undo, { className: "h-4 w-4" })
1014
+ }
1015
+ ),
1016
+ /* @__PURE__ */ jsx(
1017
+ Button,
1018
+ {
1019
+ type: "button",
1020
+ variant: "outline",
1021
+ size: "icon",
1022
+ className: "h-8 w-8 shrink-0",
1023
+ disabled: disabled || !editor.can().redo(),
1024
+ title: "Redo",
1025
+ onClick: () => editor.chain().focus().redo().run(),
1026
+ children: /* @__PURE__ */ jsx(Redo, { className: "h-4 w-4" })
1027
+ }
1028
+ )
1029
+ ]
1030
+ }
1031
+ );
1032
+ }
1033
+ var RichTextWidget = ({ fieldId }) => {
1034
+ const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);
1035
+ const { state } = useForm();
1036
+ const showError = !!error && (touched || state.submitAttempted);
1037
+ const def = fieldDef;
1038
+ const placeholder = def?.placeholder ?? "Start typing\u2026";
1039
+ const minHeight = def?.minHeight ?? 160;
1040
+ const extensions = useMemo(
1041
+ () => [
1042
+ StarterKit.configure({
1043
+ // Disable headings entirely so the UI/content can't introduce H2/H3.
1044
+ heading: false,
1045
+ bulletList: {
1046
+ HTMLAttributes: {
1047
+ class: "list-disc pl-6 my-2"
1048
+ }
1049
+ },
1050
+ orderedList: {
1051
+ HTMLAttributes: {
1052
+ class: "list-decimal pl-6 my-2"
1053
+ }
1054
+ },
1055
+ listItem: {
1056
+ HTMLAttributes: {
1057
+ class: "my-1"
1058
+ }
1059
+ }
1060
+ }),
1061
+ Underline,
1062
+ Placeholder.configure({
1063
+ placeholder
1064
+ })
1065
+ ],
1066
+ [placeholder]
1067
+ );
1068
+ const stringValue = typeof value === "string" ? value : "";
1069
+ const editor = useEditor(
1070
+ {
1071
+ extensions,
1072
+ content: stringValue || "",
1073
+ editable: !disabled,
1074
+ immediatelyRender: false,
1075
+ onUpdate: ({ editor: ed }) => {
1076
+ const html = ed.getHTML();
1077
+ setValue(isEmptyHtml(html) ? "" : html);
1078
+ },
1079
+ onBlur: () => setTouched(),
1080
+ editorProps: {
1081
+ attributes: {
1082
+ id: fieldId,
1083
+ class: "focus:outline-none",
1084
+ style: `min-height: ${minHeight}px`
1085
+ }
1086
+ }
1087
+ },
1088
+ [extensions, fieldId]
1089
+ );
1090
+ useEffect(() => {
1091
+ if (!editor || editor.isDestroyed) return;
1092
+ editor.setEditable(!disabled);
1093
+ }, [editor, disabled]);
1094
+ useEffect(() => {
1095
+ if (!editor || editor.isDestroyed) return;
1096
+ const el = editor.view.dom;
1097
+ el.style.minHeight = `${minHeight}px`;
1098
+ }, [editor, minHeight]);
1099
+ useEffect(() => {
1100
+ if (!editor || editor.isDestroyed) return;
1101
+ const fromForm = stringValue;
1102
+ const fromEditor = editor.getHTML();
1103
+ if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;
1104
+ if (fromForm && fromForm !== fromEditor) {
1105
+ editor.commands.setContent(fromForm, { emitUpdate: false });
1106
+ }
1107
+ if (!fromForm && !isEmptyHtml(fromEditor)) {
1108
+ editor.commands.setContent("", { emitUpdate: false });
1109
+ }
1110
+ }, [stringValue, editor]);
1111
+ if (!fieldDef) return null;
1112
+ const labelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
1113
+ fieldDef.label,
1114
+ " ",
1115
+ fieldDef.required && /* @__PURE__ */ jsx("span", { className: "text-red-500", children: "*" })
1116
+ ] });
1117
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
1118
+ /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, children: labelContent }),
1119
+ /* @__PURE__ */ jsxs(
1120
+ "div",
1121
+ {
1122
+ className: cn(
1123
+ "rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden",
1124
+ showError && "border-red-500",
1125
+ disabled && "opacity-60"
1126
+ ),
1127
+ children: [
1128
+ /* @__PURE__ */ jsx(RichTextToolbar, { editor, disabled }),
1129
+ /* @__PURE__ */ jsx(
1130
+ "div",
1131
+ {
1132
+ className: cn(
1133
+ "px-3 py-2",
1134
+ "[&_.ProseMirror]:outline-none",
1135
+ "[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2",
1136
+ "[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2",
1137
+ "[&_.ProseMirror_li]:list-item",
1138
+ "[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2",
1139
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground",
1140
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]",
1141
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left",
1142
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none",
1143
+ "[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0"
1144
+ ),
1145
+ children: /* @__PURE__ */ jsx(EditorContent, { editor })
1146
+ }
1147
+ )
1148
+ ]
1149
+ }
1150
+ ),
1151
+ showError && /* @__PURE__ */ jsx("p", { className: "text-xs text-red-500", children: error })
1152
+ ] });
1153
+ };
860
1154
  var Select = SelectPrimitive.Root;
861
1155
  var SelectValue = SelectPrimitive.Value;
862
- var SelectTrigger = React11.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
1156
+ var SelectTrigger = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
863
1157
  SelectPrimitive.Trigger,
864
1158
  {
865
1159
  ref,
@@ -875,7 +1169,7 @@ var SelectTrigger = React11.forwardRef(({ className, children, ...props }, ref)
875
1169
  }
876
1170
  ));
877
1171
  SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
878
- var SelectScrollUpButton = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1172
+ var SelectScrollUpButton = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
879
1173
  SelectPrimitive.ScrollUpButton,
880
1174
  {
881
1175
  ref,
@@ -888,7 +1182,7 @@ var SelectScrollUpButton = React11.forwardRef(({ className, ...props }, ref) =>
888
1182
  }
889
1183
  ));
890
1184
  SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
891
- var SelectScrollDownButton = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1185
+ var SelectScrollDownButton = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
892
1186
  SelectPrimitive.ScrollDownButton,
893
1187
  {
894
1188
  ref,
@@ -901,7 +1195,7 @@ var SelectScrollDownButton = React11.forwardRef(({ className, ...props }, ref) =
901
1195
  }
902
1196
  ));
903
1197
  SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
904
- var SelectContent = React11.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
1198
+ var SelectContent = React13.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
905
1199
  SelectPrimitive.Content,
906
1200
  {
907
1201
  ref,
@@ -929,7 +1223,7 @@ var SelectContent = React11.forwardRef(({ className, children, position = "poppe
929
1223
  }
930
1224
  ) }));
931
1225
  SelectContent.displayName = SelectPrimitive.Content.displayName;
932
- var SelectLabel = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1226
+ var SelectLabel = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
933
1227
  SelectPrimitive.Label,
934
1228
  {
935
1229
  ref,
@@ -938,7 +1232,7 @@ var SelectLabel = React11.forwardRef(({ className, ...props }, ref) => /* @__PUR
938
1232
  }
939
1233
  ));
940
1234
  SelectLabel.displayName = SelectPrimitive.Label.displayName;
941
- var SelectItem = React11.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
1235
+ var SelectItem = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
942
1236
  SelectPrimitive.Item,
943
1237
  {
944
1238
  ref,
@@ -954,7 +1248,7 @@ var SelectItem = React11.forwardRef(({ className, children, ...props }, ref) =>
954
1248
  }
955
1249
  ));
956
1250
  SelectItem.displayName = SelectPrimitive.Item.displayName;
957
- var SelectSeparator = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1251
+ var SelectSeparator = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
958
1252
  SelectPrimitive.Separator,
959
1253
  {
960
1254
  ref,
@@ -1043,7 +1337,7 @@ var SelectWidget = ({ fieldId }) => {
1043
1337
  showError && /* @__PURE__ */ jsx("p", { className: "text-xs text-red-500", children: error })
1044
1338
  ] });
1045
1339
  };
1046
- var Checkbox = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1340
+ var Checkbox = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1047
1341
  CheckboxPrimitive.Root,
1048
1342
  {
1049
1343
  ref,
@@ -1117,46 +1411,7 @@ var MultiSelectWidget = ({ fieldId }) => {
1117
1411
  showError && /* @__PURE__ */ jsx("p", { className: "text-xs text-red-500", children: error })
1118
1412
  ] });
1119
1413
  };
1120
- var buttonVariants = cva(
1121
- "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
1122
- {
1123
- variants: {
1124
- variant: {
1125
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
1126
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
1127
- outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
1128
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
1129
- ghost: "hover:bg-accent hover:text-accent-foreground",
1130
- link: "text-primary underline-offset-4 hover:underline"
1131
- },
1132
- size: {
1133
- default: "h-10 px-4 py-2",
1134
- sm: "h-9 rounded-md px-3",
1135
- lg: "h-11 rounded-md px-8",
1136
- icon: "h-10 w-10"
1137
- }
1138
- },
1139
- defaultVariants: {
1140
- variant: "default",
1141
- size: "default"
1142
- }
1143
- }
1144
- );
1145
- var Button = React11.forwardRef(
1146
- ({ className, variant, size, asChild = false, ...props }, ref) => {
1147
- const Comp = asChild ? Slot : "button";
1148
- return /* @__PURE__ */ jsx(
1149
- Comp,
1150
- {
1151
- className: cn(buttonVariants({ variant, size, className })),
1152
- ref,
1153
- ...props
1154
- }
1155
- );
1156
- }
1157
- );
1158
- Button.displayName = "Button";
1159
- var Table = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ jsx(
1414
+ var Table = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ jsx(
1160
1415
  "table",
1161
1416
  {
1162
1417
  ref,
@@ -1165,9 +1420,9 @@ var Table = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
1165
1420
  }
1166
1421
  ) }));
1167
1422
  Table.displayName = "Table";
1168
- var TableHeader = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("thead", { ref, className: cn("[&_tr]:border-b", className), ...props }));
1423
+ var TableHeader = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("thead", { ref, className: cn("[&_tr]:border-b", className), ...props }));
1169
1424
  TableHeader.displayName = "TableHeader";
1170
- var TableBody = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1425
+ var TableBody = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1171
1426
  "tbody",
1172
1427
  {
1173
1428
  ref,
@@ -1176,7 +1431,7 @@ var TableBody = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE_
1176
1431
  }
1177
1432
  ));
1178
1433
  TableBody.displayName = "TableBody";
1179
- var TableFooter = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1434
+ var TableFooter = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1180
1435
  "tfoot",
1181
1436
  {
1182
1437
  ref,
@@ -1188,7 +1443,7 @@ var TableFooter = React11.forwardRef(({ className, ...props }, ref) => /* @__PUR
1188
1443
  }
1189
1444
  ));
1190
1445
  TableFooter.displayName = "TableFooter";
1191
- var TableRow = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1446
+ var TableRow = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1192
1447
  "tr",
1193
1448
  {
1194
1449
  ref,
@@ -1200,7 +1455,7 @@ var TableRow = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__
1200
1455
  }
1201
1456
  ));
1202
1457
  TableRow.displayName = "TableRow";
1203
- var TableHead = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1458
+ var TableHead = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1204
1459
  "th",
1205
1460
  {
1206
1461
  ref,
@@ -1212,7 +1467,7 @@ var TableHead = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE_
1212
1467
  }
1213
1468
  ));
1214
1469
  TableHead.displayName = "TableHead";
1215
- var TableCell = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1470
+ var TableCell = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1216
1471
  "td",
1217
1472
  {
1218
1473
  ref,
@@ -1221,7 +1476,7 @@ var TableCell = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE_
1221
1476
  }
1222
1477
  ));
1223
1478
  TableCell.displayName = "TableCell";
1224
- var TableCaption = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1479
+ var TableCaption = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
1225
1480
  "caption",
1226
1481
  {
1227
1482
  ref,
@@ -1237,7 +1492,7 @@ var RepeatableWidget = ({
1237
1492
  if (!fieldDef || fieldDef.type !== "repeatable") return null;
1238
1493
  const def = fieldDef;
1239
1494
  const rows = Array.isArray(value) ? value : [];
1240
- const [hasInteracted, setHasInteracted] = React11__default.useState(false);
1495
+ const [hasInteracted, setHasInteracted] = React13__default.useState(false);
1241
1496
  const showError = !!error && (touched || hasInteracted);
1242
1497
  const addRow = () => {
1243
1498
  setValue([...rows, {}]);
@@ -1406,7 +1661,7 @@ function Calendar({
1406
1661
  Calendar.displayName = "Calendar";
1407
1662
  var Popover = PopoverPrimitive.Root;
1408
1663
  var PopoverTrigger = PopoverPrimitive.Trigger;
1409
- var PopoverContent = React11.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1664
+ var PopoverContent = React13.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1410
1665
  PopoverPrimitive.Content,
1411
1666
  {
1412
1667
  ref,
@@ -1485,14 +1740,14 @@ function DateTimePicker({
1485
1740
  className,
1486
1741
  placeholder = "Pick date & time"
1487
1742
  }) {
1488
- const [internalDate, setInternalDate] = React11.useState(dateTime);
1489
- const [timeString, setTimeString] = React11.useState(() => {
1743
+ const [internalDate, setInternalDate] = React13.useState(dateTime);
1744
+ const [timeString, setTimeString] = React13.useState(() => {
1490
1745
  if (!dateTime) return "";
1491
1746
  const hours = dateTime.getHours().toString().padStart(2, "0");
1492
1747
  const minutes = dateTime.getMinutes().toString().padStart(2, "0");
1493
1748
  return `${hours}:${minutes}`;
1494
1749
  });
1495
- React11.useEffect(() => {
1750
+ React13.useEffect(() => {
1496
1751
  setInternalDate(dateTime);
1497
1752
  if (!dateTime) {
1498
1753
  setTimeString("");
@@ -1636,7 +1891,7 @@ var ImageUploadWidget = ({ fieldId }) => {
1636
1891
  /* @__PURE__ */ jsx("div", { className: "border-2 border-red-300 rounded-lg p-4 bg-red-50", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-red-600", children: "Upload handler not configured. Please provide an onUpload function in FormProvider config." }) })
1637
1892
  ] });
1638
1893
  }
1639
- React11__default.useEffect(() => {
1894
+ React13__default.useEffect(() => {
1640
1895
  if (value && typeof value === "string") {
1641
1896
  setPreview(value);
1642
1897
  } else {
@@ -2275,7 +2530,7 @@ var EditableTableWidget = ({
2275
2530
  ] })
2276
2531
  ] });
2277
2532
  };
2278
- var RadioGroup = React11.forwardRef(({ className, ...props }, ref) => {
2533
+ var RadioGroup = React13.forwardRef(({ className, ...props }, ref) => {
2279
2534
  return /* @__PURE__ */ jsx(
2280
2535
  RadioGroupPrimitive.Root,
2281
2536
  {
@@ -2286,7 +2541,7 @@ var RadioGroup = React11.forwardRef(({ className, ...props }, ref) => {
2286
2541
  );
2287
2542
  });
2288
2543
  RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
2289
- var RadioGroupItem = React11.forwardRef(({ className, ...props }, ref) => {
2544
+ var RadioGroupItem = React13.forwardRef(({ className, ...props }, ref) => {
2290
2545
  return /* @__PURE__ */ jsx(
2291
2546
  RadioGroupPrimitive.Item,
2292
2547
  {
@@ -2433,7 +2688,7 @@ function useAISuggestions() {
2433
2688
  var AISuggestionsProvider = AISuggestionsContext.Provider;
2434
2689
  var Dialog = DialogPrimitive.Root;
2435
2690
  var DialogPortal = DialogPrimitive.Portal;
2436
- var DialogOverlay = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2691
+ var DialogOverlay = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2437
2692
  DialogPrimitive.Overlay,
2438
2693
  {
2439
2694
  ref,
@@ -2445,7 +2700,7 @@ var DialogOverlay = React11.forwardRef(({ className, ...props }, ref) => /* @__P
2445
2700
  }
2446
2701
  ));
2447
2702
  DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
2448
- var DialogContent = React11.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
2703
+ var DialogContent = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
2449
2704
  /* @__PURE__ */ jsx(DialogOverlay, {}),
2450
2705
  /* @__PURE__ */ jsxs(
2451
2706
  DialogPrimitive.Content,
@@ -2481,7 +2736,7 @@ var DialogHeader = ({
2481
2736
  }
2482
2737
  );
2483
2738
  DialogHeader.displayName = "DialogHeader";
2484
- var DialogTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2739
+ var DialogTitle = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2485
2740
  DialogPrimitive.Title,
2486
2741
  {
2487
2742
  ref,
@@ -2493,7 +2748,7 @@ var DialogTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PUR
2493
2748
  }
2494
2749
  ));
2495
2750
  DialogTitle.displayName = DialogPrimitive.Title.displayName;
2496
- var DialogDescription = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2751
+ var DialogDescription = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2497
2752
  DialogPrimitive.Description,
2498
2753
  {
2499
2754
  ref,
@@ -2523,6 +2778,22 @@ var AddEntityDialog = ({
2523
2778
  actionSlot != null && /* @__PURE__ */ jsx("div", { className: "px-6 py-4 flex justify-end shrink-0 border-t border-border bg-background", children: actionSlot })
2524
2779
  ] }) });
2525
2780
  };
2781
+ var BEFORE_AFTER_OPTIONS = [
2782
+ { label: "Blank", value: "" },
2783
+ { label: "AFTER FOOD", value: "AFTER FOOD" },
2784
+ { label: "BEFORE FOOD", value: "BEFORE FOOD" },
2785
+ { label: "WITH FOOD", value: "WITH FOOD" },
2786
+ { label: "SINGLE DOSE", value: "SINGLE DOSE" },
2787
+ { label: "BED TIME", value: "BED TIME" },
2788
+ { label: "EMPTY STOMACH", value: "EMPTY STOMACH" },
2789
+ { label: "LOCAL APPLICATION", value: "LOCAL APPLICATION" },
2790
+ { label: "STAT", value: "STAT" },
2791
+ { label: "INHALATION", value: "INHALATION" }
2792
+ ];
2793
+ var BEFORE_AFTER_NORMALIZATION_MAP = {
2794
+ AF: "AFTER FOOD",
2795
+ BF: "BEFORE FOOD"
2796
+ };
2526
2797
  function mapToMedication(result) {
2527
2798
  return {
2528
2799
  id: result.id,
@@ -2586,7 +2857,7 @@ function mapFrequentItemToMedication(item) {
2586
2857
  const parsed = parseDuration(item.duration);
2587
2858
  const duration_value = item.duration_value ?? parsed.value;
2588
2859
  const duration_unit = item.duration_unit ?? parsed.unit;
2589
- const before_after = item.before_after === "BEFORE FOOD" ? "BEFORE FOOD" : "AFTER FOOD";
2860
+ const before_after = normalizeBeforeAfter(item.before_after);
2590
2861
  const routeNote = item.route ? `Route: ${item.route}` : "";
2591
2862
  const baseNotes = item.notes?.trim() || "";
2592
2863
  const combinedNotes = [baseNotes, routeNote.trim()].filter((part) => part.length > 0).join(" \u2014 ");
@@ -2605,6 +2876,13 @@ function mapFrequentItemToMedication(item) {
2605
2876
  notes: combinedNotes
2606
2877
  };
2607
2878
  }
2879
+ function normalizeBeforeAfter(value) {
2880
+ if (value == null) return "AFTER FOOD";
2881
+ const mapped = BEFORE_AFTER_NORMALIZATION_MAP[value];
2882
+ if (mapped) return mapped;
2883
+ const validValues = BEFORE_AFTER_OPTIONS.map((option) => option.value);
2884
+ return validValues.includes(value) ? value : "AFTER FOOD";
2885
+ }
2608
2886
  function Spinner({
2609
2887
  value,
2610
2888
  onChange
@@ -2712,16 +2990,13 @@ function MedicationCard({
2712
2990
  )
2713
2991
  ] }),
2714
2992
  /* @__PURE__ */ jsx("div", { className: "flex gap-2 items-center flex-1 min-w-0 justify-end", children: ["morning", "afternoon", "night"].map((slot) => /* @__PURE__ */ jsx("div", { className: "flex flex-col items-center gap-0.5", children: /* @__PURE__ */ jsx(Spinner, { value: med[slot], onChange: (v) => set(slot, v) }) }, slot)) }),
2715
- /* @__PURE__ */ jsxs(
2993
+ /* @__PURE__ */ jsx(
2716
2994
  "select",
2717
2995
  {
2718
2996
  className: "text-xs border border-border rounded px-2 py-1 bg-white shrink-0",
2719
- value: med.before_after === "AFTER FOOD" ? "AF" : "BF",
2720
- onChange: (e) => set("before_after", e.target.value === "AF" ? "AFTER FOOD" : "BEFORE FOOD"),
2721
- children: [
2722
- /* @__PURE__ */ jsx("option", { value: "AF", children: "AF" }),
2723
- /* @__PURE__ */ jsx("option", { value: "BF", children: "BF" })
2724
- ]
2997
+ value: normalizeBeforeAfter(med.before_after),
2998
+ onChange: (e) => set("before_after", e.target.value),
2999
+ children: BEFORE_AFTER_OPTIONS.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.label))
2725
3000
  }
2726
3001
  )
2727
3002
  ] }),
@@ -3588,7 +3863,7 @@ var DifferentialDiagnosisWidget = ({ fieldId }) => {
3588
3863
  const items = Array.isArray(value) ? value : [];
3589
3864
  return /* @__PURE__ */ jsx(DifferentialDiagnosis, { differentialDiagnosis: items });
3590
3865
  };
3591
- var Spinner2 = React11.forwardRef(
3866
+ var Spinner2 = React13.forwardRef(
3592
3867
  ({ className, size = "md", ...props }, ref) => {
3593
3868
  const sizeClasses = {
3594
3869
  sm: "h-4 w-4 border-2",
@@ -3944,7 +4219,7 @@ var ReferralWidget = ({ fieldId }) => {
3944
4219
  showError && /* @__PURE__ */ jsx("p", { className: "text-xs text-red-500", children: error })
3945
4220
  ] });
3946
4221
  };
3947
- var Card = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4222
+ var Card = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3948
4223
  "div",
3949
4224
  {
3950
4225
  ref,
@@ -3956,7 +4231,7 @@ var Card = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
3956
4231
  }
3957
4232
  ));
3958
4233
  Card.displayName = "Card";
3959
- var CardHeader = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4234
+ var CardHeader = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3960
4235
  "div",
3961
4236
  {
3962
4237
  ref,
@@ -3965,7 +4240,7 @@ var CardHeader = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE
3965
4240
  }
3966
4241
  ));
3967
4242
  CardHeader.displayName = "CardHeader";
3968
- var CardTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4243
+ var CardTitle = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3969
4244
  "h3",
3970
4245
  {
3971
4246
  ref,
@@ -3977,7 +4252,7 @@ var CardTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE_
3977
4252
  }
3978
4253
  ));
3979
4254
  CardTitle.displayName = "CardTitle";
3980
- var CardDescription = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4255
+ var CardDescription = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3981
4256
  "p",
3982
4257
  {
3983
4258
  ref,
@@ -3986,9 +4261,9 @@ var CardDescription = React11.forwardRef(({ className, ...props }, ref) => /* @_
3986
4261
  }
3987
4262
  ));
3988
4263
  CardDescription.displayName = "CardDescription";
3989
- var CardContent = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
4264
+ var CardContent = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
3990
4265
  CardContent.displayName = "CardContent";
3991
- var CardFooter = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4266
+ var CardFooter = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3992
4267
  "div",
3993
4268
  {
3994
4269
  ref,
@@ -4410,7 +4685,7 @@ var SmartTextareaWidget = ({ fieldId }) => {
4410
4685
  },
4411
4686
  [setValue]
4412
4687
  );
4413
- React11__default.useEffect(() => {
4688
+ React13__default.useEffect(() => {
4414
4689
  if (nextKeywords !== currentKeywords) {
4415
4690
  writeValue(textValue, nextKeywords);
4416
4691
  }
@@ -6370,7 +6645,7 @@ var OphthalDiagnosisWidget = ({ fieldId }) => {
6370
6645
  ] })
6371
6646
  ] });
6372
6647
  };
6373
- var Slider = React11.forwardRef(({ className, trackClassName, thumbClassName, ...props }, ref) => /* @__PURE__ */ jsxs(
6648
+ var Slider = React13.forwardRef(({ className, trackClassName, thumbClassName, ...props }, ref) => /* @__PURE__ */ jsxs(
6374
6649
  SliderPrimitive.Root,
6375
6650
  {
6376
6651
  ref,
@@ -6763,8 +7038,9 @@ var FieldRenderer = ({ fieldId }) => {
6763
7038
  case "number":
6764
7039
  return /* @__PURE__ */ jsx(TextWidget, { fieldId });
6765
7040
  case "textarea":
6766
- case "richtext":
6767
7041
  return /* @__PURE__ */ jsx(TextWidget, { fieldId });
7042
+ case "richtext":
7043
+ return /* @__PURE__ */ jsx(RichTextWidget, { fieldId });
6768
7044
  case "date":
6769
7045
  return /* @__PURE__ */ jsx(DateWidget, { fieldId });
6770
7046
  case "datetime":
@@ -6882,7 +7158,7 @@ var DynamicForm = () => {
6882
7158
  children: child.children.map((fieldId) => /* @__PURE__ */ jsx(FieldRenderer, { fieldId }, fieldId))
6883
7159
  },
6884
7160
  child.id
6885
- ) : /* @__PURE__ */ jsx(React11__default.Fragment, {}, child.id ?? index)
7161
+ ) : /* @__PURE__ */ jsx(React13__default.Fragment, {}, child.id ?? index)
6886
7162
  ) }, node.id);
6887
7163
  }
6888
7164
  if (node.type === "column_layout") {
@@ -7466,7 +7742,7 @@ var ReadOnlyForm = ({ schema, submission }) => {
7466
7742
  child.id
7467
7743
  );
7468
7744
  }
7469
- return /* @__PURE__ */ jsx(React11__default.Fragment, {}, child.id ?? index);
7745
+ return /* @__PURE__ */ jsx(React13__default.Fragment, {}, child.id ?? index);
7470
7746
  };
7471
7747
  const hasContent = node.children.some(
7472
7748
  (child) => typeof child === "string" ? fieldMap.has(child) : child.type === "column_layout" && child.children?.some((id) => fieldMap.has(id))
@@ -7594,6 +7870,6 @@ function createUploadHandler(options) {
7594
7870
  };
7595
7871
  }
7596
7872
 
7597
- export { AddInvestigationField, AddMedicationField, DifferentialDiagnosis, DynamicForm, EMAIL_REGEX, FieldRenderer, FormControls, FormProvider, FormStore, ImageUploadWidget, ReadOnlyForm, ReadOnlyImageUpload, ReadOnlySignature, ReadOnlyTable, SignatureUploadWidget, SmartForm, SmartTextareaWidget, createUploadHandler, evaluateRules, useField, useFieldHandlers, useForm, useFormStore, useFrequentItems, useSmartKeywords, validateField, validateForm };
7873
+ export { AddInvestigationField, AddMedicationField, DifferentialDiagnosis, DynamicForm, EMAIL_REGEX, FieldRenderer, FormControls, FormProvider, FormStore, ImageUploadWidget, ReadOnlyForm, ReadOnlyImageUpload, ReadOnlySignature, ReadOnlyTable, RichTextWidget, SignatureUploadWidget, SmartForm, SmartTextareaWidget, createUploadHandler, evaluateRules, useField, useFieldHandlers, useForm, useFormStore, useFrequentItems, useSmartKeywords, validateField, validateForm };
7598
7874
  //# sourceMappingURL=index.mjs.map
7599
7875
  //# sourceMappingURL=index.mjs.map