@intlayer/design-system 9.0.0-canary.6 → 9.0.0-canary.8

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.
Files changed (42) hide show
  1. package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs +39 -67
  2. package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs.map +1 -1
  3. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +46 -72
  4. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs.map +1 -1
  5. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs +0 -62
  6. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs.map +1 -1
  7. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs +2 -4
  8. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs.map +1 -1
  9. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +64 -145
  10. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs.map +1 -1
  11. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs +1 -1
  12. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs.map +1 -1
  13. package/dist/esm/components/MarkDownRender/MarkDownRender.mjs +1 -1
  14. package/dist/esm/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
  15. package/dist/esm/components/SwitchSelector/useSwitchSelector.mjs +0 -1
  16. package/dist/esm/components/SwitchSelector/useSwitchSelector.mjs.map +1 -1
  17. package/dist/types/api/useIntlayerAPI.d.ts +2 -2
  18. package/dist/types/components/Badge/index.d.ts +2 -2
  19. package/dist/types/components/Breadcrumb/index.d.ts +1 -1
  20. package/dist/types/components/Button/Button.d.ts +4 -4
  21. package/dist/types/components/CollapsibleTable/CollapsibleTable.d.ts +2 -2
  22. package/dist/types/components/Command/index.d.ts +2 -2
  23. package/dist/types/components/Container/index.d.ts +3 -3
  24. package/dist/types/components/DictionaryFieldEditor/ContentEditor.d.ts.map +1 -1
  25. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.d.ts.map +1 -1
  26. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts +0 -62
  27. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts.map +1 -1
  28. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts +3 -5
  29. package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts.map +1 -1
  30. package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.d.ts.map +1 -1
  31. package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.d.ts +1 -1
  32. package/dist/types/components/Input/Checkbox.d.ts +2 -2
  33. package/dist/types/components/Input/Radio.d.ts +2 -2
  34. package/dist/types/components/Link/Link.d.ts +3 -3
  35. package/dist/types/components/Pagination/Pagination.d.ts +1 -1
  36. package/dist/types/components/SwitchSelector/SwitchSelector.d.ts +2 -2
  37. package/dist/types/components/SwitchSelector/VerticalSwitchSelector.d.ts +1 -1
  38. package/dist/types/components/Tab/Tab.d.ts +1 -1
  39. package/dist/types/components/TabSelector/TabSelector.d.ts +1 -1
  40. package/dist/types/components/Tag/index.d.ts +2 -2
  41. package/dist/types/components/Toaster/Toast.d.ts +1 -1
  42. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"useDictionaryFormSchema.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.ts"],"sourcesContent":["import { useIntlayer } from 'react-intlayer';\nimport { z } from 'zod/v4';\n\nexport const QUALIFIER_TYPES = ['none', 'item', 'variant', 'meta'] as const;\nexport type QualifierType = (typeof QUALIFIER_TYPES)[number];\n\nexport const useDictionarySchema = (projectId: string) => {\n const {\n requiredErrorName,\n invalidTypeErrorName,\n requiredErrorProjectId,\n invalidTypeErrorProjectId,\n } = useIntlayer('dictionary-form-schema');\n\n return z.object({\n key: z\n .string({\n error: (issue) =>\n issue.input === undefined\n ? requiredErrorName.value\n : invalidTypeErrorName.value,\n })\n .min(1, { error: invalidTypeErrorName.value })\n .default(''),\n projectIds: z\n .array(\n z.string({\n error: (issue) =>\n issue.input === undefined\n ? requiredErrorProjectId.value\n : invalidTypeErrorProjectId.value,\n })\n )\n .default([projectId]),\n qualifierType: z.enum(QUALIFIER_TYPES).default('none'),\n item: z.coerce.number().int().positive().optional(),\n variant: z.string().optional(),\n metaId: z.string().optional(),\n });\n};\n\nexport type DictionaryFormData = z.infer<\n ReturnType<typeof useDictionarySchema>\n>;\n"],"mappings":";;;;AAGA,MAAa,kBAAkB;CAAC;CAAQ;CAAQ;CAAW;CAAO;AAGlE,MAAa,uBAAuB,cAAsB;CACxD,MAAM,EACJ,mBACA,sBACA,wBACA,8BACE,YAAY,yBAAyB;AAEzC,QAAO,EAAE,OAAO;EACd,KAAK,EACF,OAAO,EACN,QAAQ,UACN,MAAM,UAAU,SACZ,kBAAkB,QAClB,qBAAqB,OAC5B,CAAC,CACD,IAAI,GAAG,EAAE,OAAO,qBAAqB,OAAO,CAAC,CAC7C,QAAQ,GAAG;EACd,YAAY,EACT,MACC,EAAE,OAAO,EACP,QAAQ,UACN,MAAM,UAAU,SACZ,uBAAuB,QACvB,0BAA0B,OACjC,CAAC,CACH,CACA,QAAQ,CAAC,UAAU,CAAC;EACvB,eAAe,EAAE,KAAK,gBAAgB,CAAC,QAAQ,OAAO;EACtD,MAAM,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;EACnD,SAAS,EAAE,QAAQ,CAAC,UAAU;EAC9B,QAAQ,EAAE,QAAQ,CAAC,UAAU;EAC9B,CAAC"}
1
+ {"version":3,"file":"useDictionaryFormSchema.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.ts"],"sourcesContent":["import { useIntlayer } from 'react-intlayer';\nimport { z } from 'zod/v4';\n\nexport const QUALIFIER_TYPES = ['none', 'item', 'variant'] as const;\nexport type QualifierType = (typeof QUALIFIER_TYPES)[number];\n\nexport const useDictionarySchema = (projectId: string) => {\n const {\n requiredErrorName,\n invalidTypeErrorName,\n requiredErrorProjectId,\n invalidTypeErrorProjectId,\n } = useIntlayer('dictionary-form-schema');\n\n return z.object({\n key: z\n .string({\n error: (issue) =>\n issue.input === undefined\n ? requiredErrorName.value\n : invalidTypeErrorName.value,\n })\n .min(1, { error: invalidTypeErrorName.value })\n .default(''),\n projectIds: z\n .array(\n z.string({\n error: (issue) =>\n issue.input === undefined\n ? requiredErrorProjectId.value\n : invalidTypeErrorProjectId.value,\n })\n )\n .default([projectId]),\n qualifierType: z.enum(QUALIFIER_TYPES).default('none'),\n item: z.coerce.number().int().positive().optional(),\n variant: z.string().optional(),\n });\n};\n\nexport type DictionaryFormData = z.infer<\n ReturnType<typeof useDictionarySchema>\n>;\n"],"mappings":";;;;AAGA,MAAa,kBAAkB;CAAC;CAAQ;CAAQ;CAAU;AAG1D,MAAa,uBAAuB,cAAsB;CACxD,MAAM,EACJ,mBACA,sBACA,wBACA,8BACE,YAAY,yBAAyB;AAEzC,QAAO,EAAE,OAAO;EACd,KAAK,EACF,OAAO,EACN,QAAQ,UACN,MAAM,UAAU,SACZ,kBAAkB,QAClB,qBAAqB,OAC5B,CAAC,CACD,IAAI,GAAG,EAAE,OAAO,qBAAqB,OAAO,CAAC,CAC7C,QAAQ,GAAG;EACd,YAAY,EACT,MACC,EAAE,OAAO,EACP,QAAQ,UACN,MAAM,UAAU,SACZ,uBAAuB,QACvB,0BAA0B,OACjC,CAAC,CACH,CACA,QAAQ,CAAC,UAAU,CAAC;EACvB,eAAe,EAAE,KAAK,gBAAgB,CAAC,QAAQ,OAAO;EACtD,MAAM,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;EACnD,SAAS,EAAE,QAAQ,CAAC,UAAU;EAC/B,CAAC"}
@@ -26,7 +26,6 @@ import { MultiSelectElement } from "../../Form/elements/MultiselectElement.mjs";
26
26
  import { SelectElement } from "../../Form/elements/SelectElement.mjs";
27
27
  import { useForm as useForm$1 } from "../../Form/FormBase.mjs";
28
28
  import { Form } from "../../Form/Form.mjs";
29
- import { MonacoCode } from "../../IDE/MonacoCode.mjs";
30
29
  import { useDictionaryDetailsSchema } from "./useDictionaryDetailsSchema.mjs";
31
30
  import { useEffect, useMemo, useState } from "react";
32
31
  import { WandSparkles } from "lucide-react";
@@ -37,20 +36,38 @@ import { useWatch } from "react-hook-form";
37
36
  import { AnimatePresence, motion } from "framer-motion";
38
37
 
39
38
  //#region src/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.tsx
40
- const QUALIFIER_TYPES = [
41
- "collection",
42
- "variant",
43
- "meta"
44
- ];
39
+ const QUALIFIER_TYPES = ["collection", "variant"];
45
40
  /** Derive active qualifier types from dictionary qualifier fields. */
46
41
  const deriveQualifierTypes = (dict) => {
47
42
  const types = [];
48
43
  if (dict.item !== void 0) types.push("collection");
49
44
  if (dict.variant !== void 0) types.push("variant");
50
- if (dict.meta !== void 0) types.push("meta");
51
45
  return types;
52
46
  };
53
- const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }) => {
47
+ /**
48
+ * A variant can be a named string or a structured object. The CMS edits it as
49
+ * text: a value starting with `{` is parsed as JSON (object variant), anything
50
+ * else is kept as a named-variant string.
51
+ */
52
+ const formatVariant = (variant) => variant !== null && typeof variant === "object" ? JSON.stringify(variant) : variant ?? "";
53
+ const parseVariantInput = (raw) => {
54
+ if (raw.trim().startsWith("{")) try {
55
+ return {
56
+ variant: JSON.parse(raw),
57
+ error: false
58
+ };
59
+ } catch {
60
+ return {
61
+ variant: raw,
62
+ error: true
63
+ };
64
+ }
65
+ return {
66
+ variant: raw,
67
+ error: false
68
+ };
69
+ };
70
+ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling }) => {
54
71
  const { session } = useSession();
55
72
  const { project } = session ?? {};
56
73
  const { data: projectsData, isLoading: isLoadingProjects } = useGetProjects();
@@ -70,7 +87,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
70
87
  const siblings = useMemo(() => (siblingsData?.data ?? []).filter((d) => d.localId !== dictionary.localId), [siblingsData, dictionary.localId]);
71
88
  const itemSiblings = useMemo(() => siblings.filter((d) => d.item !== void 0).sort((a, b) => (a.item ?? 0) - (b.item ?? 0)), [siblings]);
72
89
  const variantSiblings = useMemo(() => siblings.filter((d) => d.variant !== void 0), [siblings]);
73
- const metaSiblings = useMemo(() => siblings.filter((d) => d.meta !== void 0), [siblings]);
74
90
  const allItemDicts = useMemo(() => {
75
91
  if (dictionary.item !== void 0) return [dictionary, ...itemSiblings].sort((a, b) => (a.item ?? 0) - (b.item ?? 0));
76
92
  return itemSiblings;
@@ -79,10 +95,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
79
95
  if (dictionary.variant !== void 0) return [dictionary, ...variantSiblings];
80
96
  return variantSiblings;
81
97
  }, [dictionary, variantSiblings]);
82
- const allMetaDicts = useMemo(() => {
83
- if (dictionary.meta !== void 0) return [dictionary, ...metaSiblings];
84
- return metaSiblings;
85
- }, [dictionary, metaSiblings]);
86
98
  useEffect(() => {
87
99
  form.reset({
88
100
  ...dictionary,
@@ -91,9 +103,8 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
91
103
  });
92
104
  setSelectedTypes(deriveQualifierTypes(dictionary));
93
105
  setItemValue(dictionary.item ?? 1);
94
- setVariantValue(dictionary.variant ?? "");
95
- setMetaJsonValue(dictionary.meta ? JSON.stringify(dictionary.meta, null, 2) : "");
96
- setMetaJsonError(false);
106
+ setVariantValue(formatVariant(dictionary.variant));
107
+ setVariantJsonError(false);
97
108
  setShowSiblingPicker(false);
98
109
  }, [dictionary, form?.reset]);
99
110
  useEffect(() => {
@@ -128,19 +139,10 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
128
139
  const hasSiblings = siblings.length > 0;
129
140
  const [selectedTypes, setSelectedTypes] = useState(() => deriveQualifierTypes(dictionary));
130
141
  const [itemValue, setItemValue] = useState(dictionary.item ?? 1);
131
- const [variantValue, setVariantValue] = useState(dictionary.variant ?? "");
132
- const [metaJsonValue, setMetaJsonValue] = useState(dictionary.meta ? JSON.stringify(dictionary.meta, null, 2) : "");
133
- const [metaJsonError, setMetaJsonError] = useState(false);
142
+ const [variantValue, setVariantValue] = useState(formatVariant(dictionary.variant));
143
+ const [variantJsonError, setVariantJsonError] = useState(false);
134
144
  const [showSiblingPicker, setShowSiblingPicker] = useState(false);
135
- const allQualifiedSiblings = useMemo(() => [
136
- ...itemSiblings,
137
- ...variantSiblings,
138
- ...metaSiblings
139
- ], [
140
- itemSiblings,
141
- variantSiblings,
142
- metaSiblings
143
- ]);
145
+ const allQualifiedSiblings = useMemo(() => [...itemSiblings, ...variantSiblings], [itemSiblings, variantSiblings]);
144
146
  const handleTypesChange = (newTypes) => {
145
147
  const nextTypes = [newTypes].flat();
146
148
  const added = nextTypes.filter((t) => !selectedTypes.includes(t));
@@ -158,10 +160,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
158
160
  ...base,
159
161
  variant: void 0
160
162
  };
161
- if (qualifier === "meta") base = {
162
- ...base,
163
- meta: void 0
164
- };
165
163
  }
166
164
  for (const qualifier of added) if (qualifier === "collection") {
167
165
  const nextItem = allItemDicts.length > 0 ? Math.max(...allItemDicts.map((d) => d.item ?? 0)) + 1 : 1;
@@ -175,19 +173,12 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
175
173
  setVariantValue(newVariant);
176
174
  base = {
177
175
  ...base,
178
- variant: newVariant
179
- };
180
- } else if (qualifier === "meta") {
181
- const initialMeta = { id: "" };
182
- setMetaJsonValue(JSON.stringify(initialMeta, null, 2));
183
- base = {
184
- ...base,
185
- meta: initialMeta
176
+ variant: parseVariantInput(newVariant).variant
186
177
  };
187
178
  }
188
179
  setSelectedTypes(nextTypes);
189
180
  setEditedDictionary(base);
190
- setMetaJsonError(false);
181
+ setVariantJsonError(false);
191
182
  if (nextTypes.length === 0 && allQualifiedSiblings.length > 0) setShowSiblingPicker(true);
192
183
  else setShowSiblingPicker(false);
193
184
  };
@@ -448,7 +439,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
448
439
  getBadgeValue: (val) => {
449
440
  if (val === "collection") return String(typeSwitch.collection);
450
441
  if (val === "variant") return String(typeSwitch.variant);
451
- if (val === "meta") return String(typeSwitch.meta);
452
442
  return val;
453
443
  },
454
444
  children: /* @__PURE__ */ jsx(MultiSelect.Input, { placeholder: typeSwitch.label.value })
@@ -499,43 +489,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
499
489
  })
500
490
  }, "item-input"),
501
491
  selectedTypes.includes("variant") && /* @__PURE__ */ jsx(motion.div, {
502
- initial: {
503
- opacity: 0,
504
- height: 0
505
- },
506
- animate: {
507
- opacity: 1,
508
- height: "auto"
509
- },
510
- exit: {
511
- opacity: 0,
512
- height: 0
513
- },
514
- transition: { duration: .2 },
515
- children: /* @__PURE__ */ jsxs("div", {
516
- className: "flex flex-col gap-2 px-1",
517
- children: [/* @__PURE__ */ jsx("label", {
518
- htmlFor: "qualifier-variant-value",
519
- className: "ml-1 font-medium text-sm",
520
- children: typeSwitch.variantValueLabel
521
- }), /* @__PURE__ */ jsx(Input, {
522
- id: "qualifier-variant-value",
523
- type: "text",
524
- value: variantValue,
525
- placeholder: typeSwitch.variantValuePlaceholder.value,
526
- onChange: (e) => {
527
- const value = e.target.value;
528
- setVariantValue(value);
529
- setEditedDictionary({
530
- ...dictionary,
531
- ...updatedDictionary ?? {},
532
- variant: value
533
- });
534
- }
535
- })]
536
- })
537
- }, "variant-input"),
538
- selectedTypes.includes("meta") && /* @__PURE__ */ jsx(motion.div, {
539
492
  initial: {
540
493
  opacity: 0,
541
494
  height: 0
@@ -553,43 +506,34 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
553
506
  className: "flex flex-col gap-2 px-1",
554
507
  children: [
555
508
  /* @__PURE__ */ jsx("label", {
556
- htmlFor: "qualifier-meta-value",
509
+ htmlFor: "qualifier-variant-value",
557
510
  className: "ml-1 font-medium text-sm",
558
- children: typeSwitch.metaValueLabel
511
+ children: typeSwitch.variantValueLabel
559
512
  }),
560
- /* @__PURE__ */ jsx("div", {
561
- id: "qualifier-meta-value",
562
- className: "overflow-hidden rounded-xl border border-input bg-background",
563
- children: /* @__PURE__ */ jsx(MonacoCode, {
564
- language: "json",
565
- showCopyButton: false,
566
- showLineNumbers: false,
567
- isDarkMode,
568
- onChange: (value) => {
569
- const raw = value ?? "";
570
- setMetaJsonValue(raw);
571
- try {
572
- const parsed = JSON.parse(raw);
573
- setMetaJsonError(false);
574
- setEditedDictionary({
575
- ...dictionary,
576
- ...updatedDictionary ?? {},
577
- meta: parsed
578
- });
579
- } catch {
580
- setMetaJsonError(true);
581
- }
582
- },
583
- children: metaJsonValue
584
- })
513
+ /* @__PURE__ */ jsx(Input, {
514
+ id: "qualifier-variant-value",
515
+ type: "text",
516
+ value: variantValue,
517
+ placeholder: typeSwitch.variantValuePlaceholder.value,
518
+ onChange: (e) => {
519
+ const value = e.target.value;
520
+ setVariantValue(value);
521
+ const { variant, error } = parseVariantInput(value);
522
+ setVariantJsonError(error);
523
+ if (!error) setEditedDictionary({
524
+ ...dictionary,
525
+ ...updatedDictionary ?? {},
526
+ variant
527
+ });
528
+ }
585
529
  }),
586
- metaJsonError && /* @__PURE__ */ jsx("p", {
530
+ variantJsonError && /* @__PURE__ */ jsx("p", {
587
531
  className: "ml-1 text-destructive text-xs",
588
- children: typeSwitch.metaJsonError
532
+ children: typeSwitch.variantJsonError
589
533
  })
590
534
  ]
591
535
  })
592
- }, "meta-input"),
536
+ }, "variant-input"),
593
537
  selectedTypes.length === 0 && showSiblingPicker && /* @__PURE__ */ jsx(motion.div, {
594
538
  initial: {
595
539
  opacity: 0,
@@ -629,23 +573,16 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
629
573
  setShowSiblingPicker(false);
630
574
  },
631
575
  className: "cursor-pointer rounded-lg border border-border px-3 py-1 text-xs transition-colors hover:bg-text/10",
632
- children: [
633
- sibling.variant !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
634
- qualifierSection.variant,
635
- ": ",
636
- sibling.variant
637
- ] }),
638
- sibling.item !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
639
- qualifierSection.item,
640
- ": ",
641
- sibling.item
642
- ] }),
643
- sibling.meta !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
644
- qualifierSection.meta,
645
- ": ",
646
- String(sibling.meta.id)
647
- ] })
648
- ]
576
+ children: [sibling.variant !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
577
+ qualifierSection.variant,
578
+ ":",
579
+ " ",
580
+ formatVariant(sibling.variant)
581
+ ] }), sibling.item !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
582
+ qualifierSection.item,
583
+ ": ",
584
+ sibling.item
585
+ ] })]
649
586
  }, sibling.localId))
650
587
  })
651
588
  ]
@@ -718,25 +655,7 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
718
655
  type: "button",
719
656
  onClick: () => !isActive && onSelectSibling?.(sibling),
720
657
  className: cn("rounded-lg px-3 py-1 text-xs transition-colors", isActive ? "bg-text font-semibold text-text-opposite" : "cursor-pointer border border-border hover:bg-text/10"),
721
- children: sibling.variant
722
- }, sibling.localId);
723
- })
724
- })]
725
- }),
726
- allMetaDicts.length > 0 && /* @__PURE__ */ jsxs("div", {
727
- className: "flex flex-col gap-2",
728
- children: [/* @__PURE__ */ jsx("p", {
729
- className: "font-medium text-muted text-xs uppercase tracking-wide",
730
- children: siblingContent.metaRecords
731
- }), /* @__PURE__ */ jsx("div", {
732
- className: "flex flex-wrap gap-2",
733
- children: allMetaDicts.map((sibling) => {
734
- const isActive = sibling.localId === dictionary.localId;
735
- return /* @__PURE__ */ jsx("button", {
736
- type: "button",
737
- onClick: () => !isActive && onSelectSibling?.(sibling),
738
- className: cn("rounded-lg px-3 py-1 text-xs transition-colors", isActive ? "bg-text font-semibold text-text-opposite" : "cursor-pointer border border-border hover:bg-text/10"),
739
- children: sibling.meta?.id
658
+ children: formatVariant(sibling.variant)
740
659
  }, sibling.localId);
741
660
  })
742
661
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"DictionaryDetailsForm.mjs","names":["useForm","FormEditableFieldInput","FormEditableFieldTextArea","FormLabel","FormInput","FormSelect","FormMultiSelect","FormButton"],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.tsx"],"sourcesContent":["'use client';\n\nimport {\n useAuditContentDeclarationMetadata,\n useGetDictionaries,\n useGetProjects,\n useGetTags,\n} from '@api/index';\nimport { useSession } from '@api/useAuth';\n\nimport { Container } from '@components/Container';\nimport {\n Form,\n FormButton,\n FormDescription,\n FormEditableFieldInput,\n FormEditableFieldTextArea,\n FormField,\n FormInput,\n FormItem,\n FormLabel,\n FormMessage,\n FormMultiSelect,\n FormSelect,\n useForm,\n} from '@components/Form';\nimport { Checkbox, Input } from '@components/Input';\nimport { Loader } from '@components/Loader';\nimport { Pagination } from '@components/Pagination';\nimport { MultiSelect, Select } from '@components/Select';\nimport { useEditedContent } from '@intlayer/editor-react';\nimport type {\n Dictionary,\n DictionaryMeta,\n LocalDictionaryId,\n} from '@intlayer/types/dictionary';\nimport { cn } from '@utils/cn';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { WandSparkles } from 'lucide-react';\nimport { type FC, useEffect, useMemo, useState } from 'react';\nimport { useWatch } from 'react-hook-form';\nimport { useIntlayer } from 'react-intlayer';\nimport { MonacoCode } from '../../IDE/MonacoCode';\nimport { useDictionaryDetailsSchema } from './useDictionaryDetailsSchema';\n\ntype DictionaryDetailsProps = {\n dictionary: Dictionary;\n mode: ('local' | 'remote')[];\n onSelectSibling?: (dictionary: Dictionary) => void;\n isDarkMode?: boolean;\n};\n\ntype QualifierType = 'collection' | 'variant' | 'meta';\n\nconst QUALIFIER_TYPES: QualifierType[] = ['collection', 'variant', 'meta'];\n\n/** Derive active qualifier types from dictionary qualifier fields. */\nconst deriveQualifierTypes = (dict: Dictionary): QualifierType[] => {\n const types: QualifierType[] = [];\n if (dict.item !== undefined) types.push('collection');\n if (dict.variant !== undefined) types.push('variant');\n if (dict.meta !== undefined) types.push('meta');\n return types;\n};\n\nexport const DictionaryDetailsForm: FC<DictionaryDetailsProps> = ({\n dictionary,\n mode,\n onSelectSibling,\n isDarkMode,\n}) => {\n const { session } = useSession();\n const { project } = session ?? {};\n const { data: projectsData, isLoading: isLoadingProjects } =\n useGetProjects() as any;\n const { data: tagsData } = useGetTags() as any;\n\n const projects = (projectsData?.data ?? []) as any[];\n const allTags = (tagsData?.data ?? []) as any[];\n\n const DictionaryDetailsSchema = useDictionaryDetailsSchema(\n String(project?.id)\n );\n const { form, isSubmitting } = useForm(DictionaryDetailsSchema, {\n defaultValues: {\n ...dictionary,\n location: dictionary.location ?? 'remote',\n },\n });\n const { editedContent, setEditedDictionary } = useEditedContent();\n const {\n titleInput,\n keyInput,\n descriptionInput,\n projectInput,\n tagsSelect,\n locationSelect,\n importModeSelect,\n filePathInput,\n auditButton,\n qualifierSection,\n siblingDictionaries: siblingContent,\n typeSwitch,\n } = useIntlayer('dictionary-details');\n const { mutate: auditContentDeclaration, isPending: isAuditing } =\n useAuditContentDeclarationMetadata();\n const updatedDictionary =\n editedContent?.[dictionary.localId as LocalDictionaryId];\n\n const { data: siblingsData, isLoading: isLoadingSiblings } =\n useGetDictionaries(\n { keys: [dictionary.key] },\n { enabled: !!dictionary.key }\n );\n\n const siblings = useMemo<Dictionary[]>(\n () =>\n ((siblingsData?.data ?? []) as unknown as Dictionary[]).filter(\n (d: Dictionary) => d.localId !== dictionary.localId\n ),\n [siblingsData, dictionary.localId]\n );\n\n const itemSiblings = useMemo(\n () =>\n siblings\n .filter((d) => d.item !== undefined)\n .sort((a, b) => (a.item ?? 0) - (b.item ?? 0)),\n [siblings]\n );\n\n const variantSiblings = useMemo(\n () => siblings.filter((d) => d.variant !== undefined),\n [siblings]\n );\n\n const metaSiblings = useMemo(\n () => siblings.filter((d) => d.meta !== undefined),\n [siblings]\n );\n\n const allItemDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.item !== undefined) {\n const combined = [dictionary, ...itemSiblings].sort(\n (a, b) => (a.item ?? 0) - (b.item ?? 0)\n );\n return combined;\n }\n return itemSiblings;\n }, [dictionary, itemSiblings]);\n\n const allVariantDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.variant !== undefined) {\n return [dictionary, ...variantSiblings];\n }\n return variantSiblings;\n }, [dictionary, variantSiblings]);\n\n const allMetaDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.meta !== undefined) {\n return [dictionary, ...metaSiblings];\n }\n return metaSiblings;\n }, [dictionary, metaSiblings]);\n\n useEffect(() => {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n setSelectedTypes(deriveQualifierTypes(dictionary));\n setItemValue(dictionary.item ?? 1);\n setVariantValue(dictionary.variant ?? '');\n setMetaJsonValue(\n dictionary.meta ? JSON.stringify(dictionary.meta, null, 2) : ''\n );\n setMetaJsonError(false);\n setShowSiblingPicker(false);\n }, [dictionary, form?.reset]);\n\n useEffect(() => {\n if (typeof updatedDictionary === 'undefined') {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n }\n }, [updatedDictionary]);\n\n const handleOnAuditFile = () => {\n const dictionaryToAudit = {\n ...dictionary,\n ...updatedDictionary,\n };\n\n auditContentDeclaration(\n {\n fileContent: JSON.stringify(dictionaryToAudit),\n },\n {\n onSuccess: (response) => {\n if (!response?.data) return;\n\n const auditedDictionary = response.data.fileContent;\n\n const merged = {\n ...dictionaryToAudit,\n ...auditedDictionary,\n tags: auditedDictionary.tags ?? dictionaryToAudit.tags ?? [],\n };\n\n setEditedDictionary(merged as Dictionary);\n form.reset(merged);\n },\n }\n );\n };\n\n const watchedLocation = useWatch({\n control: form.control,\n name: 'location',\n });\n const isLocalChecked =\n watchedLocation === 'local' || watchedLocation === 'hybrid';\n\n const hasSiblings = siblings.length > 0;\n\n const [selectedTypes, setSelectedTypes] = useState<QualifierType[]>(() =>\n deriveQualifierTypes(dictionary)\n );\n const [itemValue, setItemValue] = useState<number>(dictionary.item ?? 1);\n const [variantValue, setVariantValue] = useState<string>(\n dictionary.variant ?? ''\n );\n const [metaJsonValue, setMetaJsonValue] = useState<string>(\n dictionary.meta ? JSON.stringify(dictionary.meta, null, 2) : ''\n );\n const [metaJsonError, setMetaJsonError] = useState(false);\n const [showSiblingPicker, setShowSiblingPicker] = useState(false);\n\n const allQualifiedSiblings = useMemo<Dictionary[]>(\n () => [...itemSiblings, ...variantSiblings, ...metaSiblings],\n [itemSiblings, variantSiblings, metaSiblings]\n );\n\n const handleTypesChange = (newTypes: string | string[]) => {\n const nextTypes = [newTypes].flat() as QualifierType[];\n const added = nextTypes.filter((t) => !selectedTypes.includes(t));\n const removed = selectedTypes.filter((t) => !nextTypes.includes(t));\n\n let base = { ...dictionary, ...(updatedDictionary ?? {}) };\n\n for (const qualifier of removed) {\n if (qualifier === 'collection') base = { ...base, item: undefined };\n if (qualifier === 'variant') base = { ...base, variant: undefined };\n if (qualifier === 'meta') base = { ...base, meta: undefined };\n }\n\n for (const qualifier of added) {\n if (qualifier === 'collection') {\n const nextItem =\n allItemDicts.length > 0\n ? Math.max(...allItemDicts.map((d) => d.item ?? 0)) + 1\n : 1;\n setItemValue(nextItem);\n base = { ...base, item: nextItem };\n } else if (qualifier === 'variant') {\n const newVariant = variantValue || 'default';\n setVariantValue(newVariant);\n base = { ...base, variant: newVariant };\n } else if (qualifier === 'meta') {\n const initialMeta: DictionaryMeta = { id: '' };\n setMetaJsonValue(JSON.stringify(initialMeta, null, 2));\n base = { ...base, meta: initialMeta };\n }\n }\n\n setSelectedTypes(nextTypes);\n setEditedDictionary(base);\n setMetaJsonError(false);\n\n if (nextTypes.length === 0 && allQualifiedSiblings.length > 0) {\n setShowSiblingPicker(true);\n } else {\n setShowSiblingPicker(false);\n }\n };\n\n return (\n <Form\n className=\"flex w-full flex-col gap-8\"\n {...form}\n schema={DictionaryDetailsSchema}\n >\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormEditableFieldInput\n name=\"key\"\n label={keyInput.label}\n placeholder={keyInput.label.value}\n description={keyInput.description}\n disabled={isSubmitting}\n isRequired\n onSave={(value) => {\n form.setValue('key', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n key: value,\n });\n }}\n />\n <FormEditableFieldInput\n name=\"title\"\n label={titleInput.label}\n placeholder={titleInput.placeholder.value}\n description={titleInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('title', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n title: value,\n });\n }}\n />\n </div>\n <FormEditableFieldTextArea\n name=\"description\"\n label={descriptionInput.label}\n placeholder={descriptionInput.placeholder.value}\n description={descriptionInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('description', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n description: value,\n });\n }}\n />\n <div className=\"grid grid-cols-2 gap-8 px-1 max-md:grid-cols-1\">\n <FormField\n control={form.control}\n name=\"location\"\n render={({ field }) => {\n const value = field.value;\n const isLocal = value === 'local' || value === 'hybrid';\n const isRemote = value === 'remote' || value === 'hybrid';\n\n const handleLocalToggle = (isChecked: boolean) => {\n if (!isChecked && !isRemote) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isRemote\n ? 'hybrid'\n : 'local'\n : 'remote';\n\n field.onChange(newValue);\n\n const newFilePath = isChecked\n ? (form.getValues('filePath') ?? dictionary.filePath)\n : undefined;\n\n if (!isChecked) {\n form.setValue('filePath', undefined);\n }\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n filePath: newFilePath,\n });\n };\n\n const handleRemoteToggle = (isChecked: boolean) => {\n if (!isChecked && !isLocal) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isLocal\n ? 'hybrid'\n : 'remote'\n : 'local';\n\n field.onChange(newValue);\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n });\n };\n\n return (\n <FormItem className=\"flex flex-col gap-2 px-1\">\n <FormLabel className=\"ml-1\">{locationSelect.label}</FormLabel>\n <div className=\"ml-2 flex items-center gap-4 py-2\">\n <Checkbox\n id=\"location-local\"\n name=\"location-local\"\n label={locationSelect.local.value}\n color=\"text\"\n checked={isLocal}\n disabled={\n !mode.includes('local') && !mode.includes('remote')\n }\n onChange={(e) => handleLocalToggle(e.target.checked)}\n />\n <Checkbox\n id=\"location-remote\"\n name=\"location-remote\"\n label={locationSelect.remote.value}\n color=\"text\"\n checked={isRemote}\n disabled={\n !mode.includes('remote') &&\n dictionary.location !== 'remote' &&\n dictionary.location !== 'hybrid'\n }\n onChange={(e) => handleRemoteToggle(e.target.checked)}\n />\n </div>\n <FormDescription>\n {locationSelect.testDescription}\n </FormDescription>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n\n <AnimatePresence mode=\"wait\">\n {isLocalChecked && (\n <motion.div\n key=\"filePath-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.3 }}\n >\n <FormInput\n name=\"filePath\"\n label={filePathInput.label.value}\n placeholder={filePathInput.placeholder.value}\n description={filePathInput.description.value}\n disabled={isSubmitting || !isLocalChecked}\n onChange={(e) => {\n const value = e.target.value;\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n filePath: value,\n });\n }}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormSelect\n name=\"importMode\"\n label={importModeSelect.label.value}\n description={importModeSelect.description.value}\n onValueChange={(value) => {\n form.setValue('importMode', value as any, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n importMode: value as any,\n });\n }}\n >\n <Select.Trigger>\n <Select.Value placeholder={importModeSelect.label.value} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"static\">\n {importModeSelect.static.value}\n </Select.Item>\n <Select.Item value=\"dynamic\">\n {importModeSelect.dynamic.value}\n </Select.Item>\n <Select.Item value=\"live\">\n {importModeSelect.live.value}\n </Select.Item>\n </Select.Content>\n </FormSelect>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormMultiSelect\n name=\"projectIds\"\n label={projectInput.label.value}\n description={projectInput.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('projectIds', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n projectIds: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n projects?.find((project: any) => String(project.id) === value)\n ?.name ?? value\n }\n >\n <MultiSelect.Input placeholder={projectInput.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {projects?.map((project: any) => (\n <MultiSelect.Item\n key={String(project.id)}\n value={String(project.id)}\n >\n {project.name}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n\n <FormMultiSelect\n name=\"tags\"\n label={tagsSelect.label.value}\n description={tagsSelect.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('tags', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n tags: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n allTags?.find((tag: any) => String(tag.key) === value)?.name ??\n value\n }\n >\n <MultiSelect.Input placeholder={tagsSelect.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {allTags?.map((tag: any) => (\n <MultiSelect.Item\n key={String(tag.key)}\n value={String(tag.key)}\n >\n {tag.name ?? tag.key}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n </div>\n\n {/* Type switcher */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"card\"\n >\n <div className=\"flex flex-col gap-1\">\n <p className=\"ml-1 font-semibold text-sm\">{typeSwitch.label}</p>\n <p className=\"ml-1 text-muted text-xs\">{typeSwitch.description}</p>\n </div>\n <MultiSelect\n values={selectedTypes}\n onValueChange={handleTypesChange}\n className=\"max-w-xs\"\n >\n <MultiSelect.Trigger\n getBadgeValue={(val) => {\n if (val === 'collection') return String(typeSwitch.collection);\n if (val === 'variant') return String(typeSwitch.variant);\n if (val === 'meta') return String(typeSwitch.meta);\n return val;\n }}\n >\n <MultiSelect.Input placeholder={typeSwitch.label.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <MultiSelect.List>\n {QUALIFIER_TYPES.map((qualifier) => (\n <MultiSelect.Item key={qualifier} value={qualifier}>\n {typeSwitch[qualifier].value}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </MultiSelect.Content>\n </MultiSelect>\n <AnimatePresence>\n {selectedTypes.includes('collection') && (\n <motion.div\n key=\"item-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-item-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.itemValueLabel}\n </label>\n <Input\n id=\"qualifier-item-value\"\n type=\"number\"\n min={1}\n value={itemValue}\n placeholder={typeSwitch.itemValuePlaceholder.value}\n onChange={(e) => {\n const value = parseInt(e.target.value, 10);\n if (!Number.isNaN(value) && value >= 1) {\n setItemValue(value);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n item: value,\n });\n }\n }}\n />\n </div>\n </motion.div>\n )}\n\n {selectedTypes.includes('variant') && (\n <motion.div\n key=\"variant-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-variant-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.variantValueLabel}\n </label>\n <Input\n id=\"qualifier-variant-value\"\n type=\"text\"\n value={variantValue}\n placeholder={typeSwitch.variantValuePlaceholder.value}\n onChange={(e) => {\n const value = e.target.value;\n setVariantValue(value);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n variant: value,\n });\n }}\n />\n </div>\n </motion.div>\n )}\n\n {selectedTypes.includes('meta') && (\n <motion.div\n key=\"meta-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-meta-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.metaValueLabel}\n </label>\n <div\n id=\"qualifier-meta-value\"\n className=\"overflow-hidden rounded-xl border border-input bg-background\"\n >\n <MonacoCode\n language=\"json\"\n showCopyButton={false}\n showLineNumbers={false}\n isDarkMode={isDarkMode}\n onChange={(value) => {\n const raw = value ?? '';\n setMetaJsonValue(raw);\n try {\n const parsed = JSON.parse(raw) as DictionaryMeta;\n setMetaJsonError(false);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n meta: parsed,\n });\n } catch {\n setMetaJsonError(true);\n }\n }}\n >\n {metaJsonValue}\n </MonacoCode>\n </div>\n {metaJsonError && (\n <p className=\"ml-1 text-destructive text-xs\">\n {typeSwitch.metaJsonError}\n </p>\n )}\n </div>\n </motion.div>\n )}\n\n {selectedTypes.length === 0 && showSiblingPicker && (\n <motion.div\n key=\"sibling-picker\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <Container\n background=\"none\"\n border\n borderColor=\"neutral\"\n roundedSize=\"xl\"\n padding=\"md\"\n className=\"gap-3\"\n >\n <p className=\"font-medium text-sm\">\n {typeSwitch.disablePickerTitle}\n </p>\n <p className=\"text-muted text-xs\">\n {typeSwitch.disablePickerDescription}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allQualifiedSiblings.map((sibling) => (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => {\n onSelectSibling?.(sibling);\n setShowSiblingPicker(false);\n }}\n className=\"cursor-pointer rounded-lg border border-border px-3 py-1 text-xs transition-colors hover:bg-text/10\"\n >\n {sibling.variant !== undefined && (\n <span>\n {qualifierSection.variant}: {sibling.variant}\n </span>\n )}\n {sibling.item !== undefined && (\n <span>\n {qualifierSection.item}: {sibling.item}\n </span>\n )}\n {sibling.meta !== undefined && (\n <span>\n {qualifierSection.meta}: {String(sibling.meta.id)}\n </span>\n )}\n </button>\n ))}\n </div>\n </Container>\n </motion.div>\n )}\n </AnimatePresence>\n </Container>\n\n {/* Sibling dictionaries panel */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"neutral\"\n >\n <p className=\"font-semibold text-sm\">{siblingContent.title}</p>\n <Loader isLoading={isLoadingSiblings}>\n {!hasSiblings && (\n <p className=\"text-muted text-sm\">{siblingContent.noSiblings}</p>\n )}\n\n {allItemDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.collectionItems}\n </p>\n <Pagination\n currentPage={\n allItemDicts.findIndex(\n (dictionaryEl) =>\n dictionaryEl.localId === dictionary.localId\n ) + 1 || 1\n }\n totalPages={allItemDicts.length}\n onPageChange={(page) => {\n const target = allItemDicts[page - 1];\n if (target && onSelectSibling) {\n onSelectSibling(target);\n }\n }}\n showPrevNext\n />\n <div className=\"mt-1 flex flex-wrap gap-2\">\n {allItemDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {siblingContent.itemIndex} {sibling.item}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {allVariantDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.variants}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allVariantDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {sibling.variant}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {allMetaDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.metaRecords}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allMetaDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {sibling.meta?.id}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </Loader>\n </Container>\n\n <div className=\"flex flex-wrap items-center justify-end gap-2 max-md:flex-col\">\n <FormButton\n type=\"button\"\n size=\"icon-md\"\n label={auditButton.label.value}\n Icon={WandSparkles}\n variant=\"outline\"\n color=\"text\"\n className=\"max-md:w-full\"\n onClick={handleOnAuditFile}\n disabled={isSubmitting || isAuditing}\n isLoading={isAuditing}\n />\n </div>\n </Form>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DictionaryDetailsForm.mjs","names":["useForm","FormEditableFieldInput","FormEditableFieldTextArea","FormLabel","FormInput","FormSelect","FormMultiSelect","FormButton"],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.tsx"],"sourcesContent":["'use client';\n\nimport {\n useAuditContentDeclarationMetadata,\n useGetDictionaries,\n useGetProjects,\n useGetTags,\n} from '@api/index';\nimport { useSession } from '@api/useAuth';\n\nimport { Container } from '@components/Container';\nimport {\n Form,\n FormButton,\n FormDescription,\n FormEditableFieldInput,\n FormEditableFieldTextArea,\n FormField,\n FormInput,\n FormItem,\n FormLabel,\n FormMessage,\n FormMultiSelect,\n FormSelect,\n useForm,\n} from '@components/Form';\nimport { Checkbox, Input } from '@components/Input';\nimport { Loader } from '@components/Loader';\nimport { Pagination } from '@components/Pagination';\nimport { MultiSelect, Select } from '@components/Select';\nimport { useEditedContent } from '@intlayer/editor-react';\nimport type { Dictionary, LocalDictionaryId } from '@intlayer/types/dictionary';\nimport { cn } from '@utils/cn';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { WandSparkles } from 'lucide-react';\nimport { type FC, useEffect, useMemo, useState } from 'react';\nimport { useWatch } from 'react-hook-form';\nimport { useIntlayer } from 'react-intlayer';\nimport { useDictionaryDetailsSchema } from './useDictionaryDetailsSchema';\n\ntype DictionaryDetailsProps = {\n dictionary: Dictionary;\n mode: ('local' | 'remote')[];\n onSelectSibling?: (dictionary: Dictionary) => void;\n isDarkMode?: boolean;\n};\n\ntype QualifierType = 'collection' | 'variant';\n\nconst QUALIFIER_TYPES: QualifierType[] = ['collection', 'variant'];\n\n/** Derive active qualifier types from dictionary qualifier fields. */\nconst deriveQualifierTypes = (dict: Dictionary): QualifierType[] => {\n const types: QualifierType[] = [];\n if (dict.item !== undefined) types.push('collection');\n if (dict.variant !== undefined) types.push('variant');\n return types;\n};\n\n/**\n * A variant can be a named string or a structured object. The CMS edits it as\n * text: a value starting with `{` is parsed as JSON (object variant), anything\n * else is kept as a named-variant string.\n */\nconst formatVariant = (\n variant: string | Record<string, string | number> | undefined\n): string =>\n variant !== null && typeof variant === 'object'\n ? JSON.stringify(variant)\n : (variant ?? '');\n\nconst parseVariantInput = (\n raw: string\n): { variant: string | Record<string, string | number>; error: boolean } => {\n if (raw.trim().startsWith('{')) {\n try {\n return {\n variant: JSON.parse(raw) as Record<string, string | number>,\n error: false,\n };\n } catch {\n return { variant: raw, error: true };\n }\n }\n return { variant: raw, error: false };\n};\n\nexport const DictionaryDetailsForm: FC<DictionaryDetailsProps> = ({\n dictionary,\n mode,\n onSelectSibling,\n}) => {\n const { session } = useSession();\n const { project } = session ?? {};\n const { data: projectsData, isLoading: isLoadingProjects } =\n useGetProjects() as any;\n const { data: tagsData } = useGetTags() as any;\n\n const projects = (projectsData?.data ?? []) as any[];\n const allTags = (tagsData?.data ?? []) as any[];\n\n const DictionaryDetailsSchema = useDictionaryDetailsSchema(\n String(project?.id)\n );\n const { form, isSubmitting } = useForm(DictionaryDetailsSchema, {\n defaultValues: {\n ...dictionary,\n location: dictionary.location ?? 'remote',\n },\n });\n const { editedContent, setEditedDictionary } = useEditedContent();\n const {\n titleInput,\n keyInput,\n descriptionInput,\n projectInput,\n tagsSelect,\n locationSelect,\n importModeSelect,\n filePathInput,\n auditButton,\n qualifierSection,\n siblingDictionaries: siblingContent,\n typeSwitch,\n } = useIntlayer('dictionary-details');\n const { mutate: auditContentDeclaration, isPending: isAuditing } =\n useAuditContentDeclarationMetadata();\n const updatedDictionary =\n editedContent?.[dictionary.localId as LocalDictionaryId];\n\n const { data: siblingsData, isLoading: isLoadingSiblings } =\n useGetDictionaries(\n { keys: [dictionary.key] },\n { enabled: !!dictionary.key }\n );\n\n const siblings = useMemo<Dictionary[]>(\n () =>\n ((siblingsData?.data ?? []) as unknown as Dictionary[]).filter(\n (d: Dictionary) => d.localId !== dictionary.localId\n ),\n [siblingsData, dictionary.localId]\n );\n\n const itemSiblings = useMemo(\n () =>\n siblings\n .filter((d) => d.item !== undefined)\n .sort((a, b) => (a.item ?? 0) - (b.item ?? 0)),\n [siblings]\n );\n\n const variantSiblings = useMemo(\n () => siblings.filter((d) => d.variant !== undefined),\n [siblings]\n );\n\n const allItemDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.item !== undefined) {\n const combined = [dictionary, ...itemSiblings].sort(\n (a, b) => (a.item ?? 0) - (b.item ?? 0)\n );\n return combined;\n }\n return itemSiblings;\n }, [dictionary, itemSiblings]);\n\n const allVariantDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.variant !== undefined) {\n return [dictionary, ...variantSiblings];\n }\n return variantSiblings;\n }, [dictionary, variantSiblings]);\n\n useEffect(() => {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n setSelectedTypes(deriveQualifierTypes(dictionary));\n setItemValue(dictionary.item ?? 1);\n setVariantValue(formatVariant(dictionary.variant));\n setVariantJsonError(false);\n setShowSiblingPicker(false);\n }, [dictionary, form?.reset]);\n\n useEffect(() => {\n if (typeof updatedDictionary === 'undefined') {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n }\n }, [updatedDictionary]);\n\n const handleOnAuditFile = () => {\n const dictionaryToAudit = {\n ...dictionary,\n ...updatedDictionary,\n };\n\n auditContentDeclaration(\n {\n fileContent: JSON.stringify(dictionaryToAudit),\n },\n {\n onSuccess: (response) => {\n if (!response?.data) return;\n\n const auditedDictionary = response.data.fileContent;\n\n const merged = {\n ...dictionaryToAudit,\n ...auditedDictionary,\n tags: auditedDictionary.tags ?? dictionaryToAudit.tags ?? [],\n };\n\n setEditedDictionary(merged as Dictionary);\n form.reset(merged);\n },\n }\n );\n };\n\n const watchedLocation = useWatch({\n control: form.control,\n name: 'location',\n });\n const isLocalChecked =\n watchedLocation === 'local' || watchedLocation === 'hybrid';\n\n const hasSiblings = siblings.length > 0;\n\n const [selectedTypes, setSelectedTypes] = useState<QualifierType[]>(() =>\n deriveQualifierTypes(dictionary)\n );\n const [itemValue, setItemValue] = useState<number>(dictionary.item ?? 1);\n const [variantValue, setVariantValue] = useState<string>(\n formatVariant(dictionary.variant)\n );\n const [variantJsonError, setVariantJsonError] = useState(false);\n const [showSiblingPicker, setShowSiblingPicker] = useState(false);\n\n const allQualifiedSiblings = useMemo<Dictionary[]>(\n () => [...itemSiblings, ...variantSiblings],\n [itemSiblings, variantSiblings]\n );\n\n const handleTypesChange = (newTypes: string | string[]) => {\n const nextTypes = [newTypes].flat() as QualifierType[];\n const added = nextTypes.filter((t) => !selectedTypes.includes(t));\n const removed = selectedTypes.filter((t) => !nextTypes.includes(t));\n\n let base = { ...dictionary, ...(updatedDictionary ?? {}) };\n\n for (const qualifier of removed) {\n if (qualifier === 'collection') base = { ...base, item: undefined };\n if (qualifier === 'variant') base = { ...base, variant: undefined };\n }\n\n for (const qualifier of added) {\n if (qualifier === 'collection') {\n const nextItem =\n allItemDicts.length > 0\n ? Math.max(...allItemDicts.map((d) => d.item ?? 0)) + 1\n : 1;\n setItemValue(nextItem);\n base = { ...base, item: nextItem };\n } else if (qualifier === 'variant') {\n const newVariant = variantValue || 'default';\n setVariantValue(newVariant);\n base = { ...base, variant: parseVariantInput(newVariant).variant };\n }\n }\n\n setSelectedTypes(nextTypes);\n setEditedDictionary(base);\n setVariantJsonError(false);\n\n if (nextTypes.length === 0 && allQualifiedSiblings.length > 0) {\n setShowSiblingPicker(true);\n } else {\n setShowSiblingPicker(false);\n }\n };\n\n return (\n <Form\n className=\"flex w-full flex-col gap-8\"\n {...form}\n schema={DictionaryDetailsSchema}\n >\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormEditableFieldInput\n name=\"key\"\n label={keyInput.label}\n placeholder={keyInput.label.value}\n description={keyInput.description}\n disabled={isSubmitting}\n isRequired\n onSave={(value) => {\n form.setValue('key', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n key: value,\n });\n }}\n />\n <FormEditableFieldInput\n name=\"title\"\n label={titleInput.label}\n placeholder={titleInput.placeholder.value}\n description={titleInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('title', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n title: value,\n });\n }}\n />\n </div>\n <FormEditableFieldTextArea\n name=\"description\"\n label={descriptionInput.label}\n placeholder={descriptionInput.placeholder.value}\n description={descriptionInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('description', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n description: value,\n });\n }}\n />\n <div className=\"grid grid-cols-2 gap-8 px-1 max-md:grid-cols-1\">\n <FormField\n control={form.control}\n name=\"location\"\n render={({ field }) => {\n const value = field.value;\n const isLocal = value === 'local' || value === 'hybrid';\n const isRemote = value === 'remote' || value === 'hybrid';\n\n const handleLocalToggle = (isChecked: boolean) => {\n if (!isChecked && !isRemote) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isRemote\n ? 'hybrid'\n : 'local'\n : 'remote';\n\n field.onChange(newValue);\n\n const newFilePath = isChecked\n ? (form.getValues('filePath') ?? dictionary.filePath)\n : undefined;\n\n if (!isChecked) {\n form.setValue('filePath', undefined);\n }\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n filePath: newFilePath,\n });\n };\n\n const handleRemoteToggle = (isChecked: boolean) => {\n if (!isChecked && !isLocal) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isLocal\n ? 'hybrid'\n : 'remote'\n : 'local';\n\n field.onChange(newValue);\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n });\n };\n\n return (\n <FormItem className=\"flex flex-col gap-2 px-1\">\n <FormLabel className=\"ml-1\">{locationSelect.label}</FormLabel>\n <div className=\"ml-2 flex items-center gap-4 py-2\">\n <Checkbox\n id=\"location-local\"\n name=\"location-local\"\n label={locationSelect.local.value}\n color=\"text\"\n checked={isLocal}\n disabled={\n !mode.includes('local') && !mode.includes('remote')\n }\n onChange={(e) => handleLocalToggle(e.target.checked)}\n />\n <Checkbox\n id=\"location-remote\"\n name=\"location-remote\"\n label={locationSelect.remote.value}\n color=\"text\"\n checked={isRemote}\n disabled={\n !mode.includes('remote') &&\n dictionary.location !== 'remote' &&\n dictionary.location !== 'hybrid'\n }\n onChange={(e) => handleRemoteToggle(e.target.checked)}\n />\n </div>\n <FormDescription>\n {locationSelect.testDescription}\n </FormDescription>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n\n <AnimatePresence mode=\"wait\">\n {isLocalChecked && (\n <motion.div\n key=\"filePath-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.3 }}\n >\n <FormInput\n name=\"filePath\"\n label={filePathInput.label.value}\n placeholder={filePathInput.placeholder.value}\n description={filePathInput.description.value}\n disabled={isSubmitting || !isLocalChecked}\n onChange={(e) => {\n const value = e.target.value;\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n filePath: value,\n });\n }}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormSelect\n name=\"importMode\"\n label={importModeSelect.label.value}\n description={importModeSelect.description.value}\n onValueChange={(value) => {\n form.setValue('importMode', value as any, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n importMode: value as any,\n });\n }}\n >\n <Select.Trigger>\n <Select.Value placeholder={importModeSelect.label.value} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"static\">\n {importModeSelect.static.value}\n </Select.Item>\n <Select.Item value=\"dynamic\">\n {importModeSelect.dynamic.value}\n </Select.Item>\n <Select.Item value=\"live\">\n {importModeSelect.live.value}\n </Select.Item>\n </Select.Content>\n </FormSelect>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormMultiSelect\n name=\"projectIds\"\n label={projectInput.label.value}\n description={projectInput.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('projectIds', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n projectIds: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n projects?.find((project: any) => String(project.id) === value)\n ?.name ?? value\n }\n >\n <MultiSelect.Input placeholder={projectInput.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {projects?.map((project: any) => (\n <MultiSelect.Item\n key={String(project.id)}\n value={String(project.id)}\n >\n {project.name}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n\n <FormMultiSelect\n name=\"tags\"\n label={tagsSelect.label.value}\n description={tagsSelect.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('tags', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n tags: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n allTags?.find((tag: any) => String(tag.key) === value)?.name ??\n value\n }\n >\n <MultiSelect.Input placeholder={tagsSelect.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {allTags?.map((tag: any) => (\n <MultiSelect.Item\n key={String(tag.key)}\n value={String(tag.key)}\n >\n {tag.name ?? tag.key}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n </div>\n\n {/* Type switcher */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"card\"\n >\n <div className=\"flex flex-col gap-1\">\n <p className=\"ml-1 font-semibold text-sm\">{typeSwitch.label}</p>\n <p className=\"ml-1 text-muted text-xs\">{typeSwitch.description}</p>\n </div>\n <MultiSelect\n values={selectedTypes}\n onValueChange={handleTypesChange}\n className=\"max-w-xs\"\n >\n <MultiSelect.Trigger\n getBadgeValue={(val) => {\n if (val === 'collection') return String(typeSwitch.collection);\n if (val === 'variant') return String(typeSwitch.variant);\n return val;\n }}\n >\n <MultiSelect.Input placeholder={typeSwitch.label.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <MultiSelect.List>\n {QUALIFIER_TYPES.map((qualifier) => (\n <MultiSelect.Item key={qualifier} value={qualifier}>\n {typeSwitch[qualifier].value}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </MultiSelect.Content>\n </MultiSelect>\n <AnimatePresence>\n {selectedTypes.includes('collection') && (\n <motion.div\n key=\"item-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-item-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.itemValueLabel}\n </label>\n <Input\n id=\"qualifier-item-value\"\n type=\"number\"\n min={1}\n value={itemValue}\n placeholder={typeSwitch.itemValuePlaceholder.value}\n onChange={(e) => {\n const value = parseInt(e.target.value, 10);\n if (!Number.isNaN(value) && value >= 1) {\n setItemValue(value);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n item: value,\n });\n }\n }}\n />\n </div>\n </motion.div>\n )}\n\n {selectedTypes.includes('variant') && (\n <motion.div\n key=\"variant-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-variant-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.variantValueLabel}\n </label>\n <Input\n id=\"qualifier-variant-value\"\n type=\"text\"\n value={variantValue}\n placeholder={typeSwitch.variantValuePlaceholder.value}\n onChange={(e) => {\n const value = e.target.value;\n setVariantValue(value);\n const { variant, error } = parseVariantInput(value);\n setVariantJsonError(error);\n if (!error) {\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n variant,\n });\n }\n }}\n />\n {variantJsonError && (\n <p className=\"ml-1 text-destructive text-xs\">\n {typeSwitch.variantJsonError}\n </p>\n )}\n </div>\n </motion.div>\n )}\n\n {selectedTypes.length === 0 && showSiblingPicker && (\n <motion.div\n key=\"sibling-picker\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <Container\n background=\"none\"\n border\n borderColor=\"neutral\"\n roundedSize=\"xl\"\n padding=\"md\"\n className=\"gap-3\"\n >\n <p className=\"font-medium text-sm\">\n {typeSwitch.disablePickerTitle}\n </p>\n <p className=\"text-muted text-xs\">\n {typeSwitch.disablePickerDescription}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allQualifiedSiblings.map((sibling) => (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => {\n onSelectSibling?.(sibling);\n setShowSiblingPicker(false);\n }}\n className=\"cursor-pointer rounded-lg border border-border px-3 py-1 text-xs transition-colors hover:bg-text/10\"\n >\n {sibling.variant !== undefined && (\n <span>\n {qualifierSection.variant}:{' '}\n {formatVariant(sibling.variant)}\n </span>\n )}\n {sibling.item !== undefined && (\n <span>\n {qualifierSection.item}: {sibling.item}\n </span>\n )}\n </button>\n ))}\n </div>\n </Container>\n </motion.div>\n )}\n </AnimatePresence>\n </Container>\n\n {/* Sibling dictionaries panel */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"neutral\"\n >\n <p className=\"font-semibold text-sm\">{siblingContent.title}</p>\n <Loader isLoading={isLoadingSiblings}>\n {!hasSiblings && (\n <p className=\"text-muted text-sm\">{siblingContent.noSiblings}</p>\n )}\n\n {allItemDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.collectionItems}\n </p>\n <Pagination\n currentPage={\n allItemDicts.findIndex(\n (dictionaryEl) =>\n dictionaryEl.localId === dictionary.localId\n ) + 1 || 1\n }\n totalPages={allItemDicts.length}\n onPageChange={(page) => {\n const target = allItemDicts[page - 1];\n if (target && onSelectSibling) {\n onSelectSibling(target);\n }\n }}\n showPrevNext\n />\n <div className=\"mt-1 flex flex-wrap gap-2\">\n {allItemDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {siblingContent.itemIndex} {sibling.item}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {allVariantDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.variants}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allVariantDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {formatVariant(sibling.variant)}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </Loader>\n </Container>\n\n <div className=\"flex flex-wrap items-center justify-end gap-2 max-md:flex-col\">\n <FormButton\n type=\"button\"\n size=\"icon-md\"\n label={auditButton.label.value}\n Icon={WandSparkles}\n variant=\"outline\"\n color=\"text\"\n className=\"max-md:w-full\"\n onClick={handleOnAuditFile}\n disabled={isSubmitting || isAuditing}\n isLoading={isAuditing}\n />\n </div>\n </Form>\n );\n};\n"],"mappings":"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"}
@@ -986,7 +986,7 @@ const dictionaryDetailsContent = {
986
986
  vi: "{ \"id\": \"my-record\" }",
987
987
  uk: "{ \"id\": \"my-record\" }"
988
988
  }),
989
- metaJsonError: t({
989
+ variantJsonError: t({
990
990
  en: "Invalid JSON. Please fix before saving.",
991
991
  "en-GB": "Invalid JSON. Please fix before saving.",
992
992
  fr: "JSON invalide. Veuillez corriger avant de sauvegarder.",