@intlayer/design-system 9.0.2 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/esm/api/useAuth/useOAuth2.mjs +1 -1
  2. package/dist/esm/api/useAuth/useSession.mjs +1 -1
  3. package/dist/esm/components/DictionaryEditor/NodeWrapper/SelectWrapper.mjs +33 -0
  4. package/dist/esm/components/DictionaryEditor/NodeWrapper/SelectWrapper.mjs.map +1 -0
  5. package/dist/esm/components/DictionaryEditor/NodeWrapper/index.mjs +5 -0
  6. package/dist/esm/components/DictionaryEditor/NodeWrapper/index.mjs.map +1 -1
  7. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +93 -0
  8. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs.map +1 -1
  9. package/dist/esm/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.mjs +84 -0
  10. package/dist/esm/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.mjs.map +1 -1
  11. package/dist/esm/components/DictionaryFieldEditor/NodeTypeSelector.mjs +5 -1
  12. package/dist/esm/components/DictionaryFieldEditor/NodeTypeSelector.mjs.map +1 -1
  13. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +1 -1
  14. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs.map +1 -1
  15. package/dist/esm/components/DictionaryFieldEditor/nodeTypeSelector.content.mjs +20 -0
  16. package/dist/esm/components/DictionaryFieldEditor/nodeTypeSelector.content.mjs.map +1 -1
  17. package/dist/types/components/DictionaryEditor/NodeWrapper/SelectWrapper.d.ts +11 -0
  18. package/dist/types/components/DictionaryEditor/NodeWrapper/SelectWrapper.d.ts.map +1 -0
  19. package/dist/types/components/DictionaryEditor/NodeWrapper/index.d.ts.map +1 -1
  20. package/dist/types/components/DictionaryFieldEditor/ContentEditorView/TextEditor.d.ts.map +1 -1
  21. package/dist/types/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.d.ts +84 -0
  22. package/dist/types/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.d.ts.map +1 -1
  23. package/dist/types/components/DictionaryFieldEditor/StructureView/StructureView.d.ts.map +1 -1
  24. package/dist/types/components/DictionaryFieldEditor/nodeTypeSelector.content.d.ts +20 -0
  25. package/dist/types/components/DictionaryFieldEditor/nodeTypeSelector.content.d.ts.map +1 -1
  26. package/package.json +45 -45
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
- import { editor } from "@intlayer/config/built";
4
3
  import { useQuery } from "@tanstack/react-query";
4
+ import { editor } from "@intlayer/config/built";
5
5
  import { getOAuthAPI } from "@intlayer/api";
6
6
  import { useConfiguration } from "@intlayer/editor-react";
7
7
  import { defu } from "defu";
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { getAuthAPI } from "../../libs/auth.mjs";
4
- import { editor } from "@intlayer/config/built";
5
4
  import { useQuery, useQueryClient } from "@tanstack/react-query";
5
+ import { editor } from "@intlayer/config/built";
6
6
  import { useConfiguration } from "@intlayer/editor-react";
7
7
 
8
8
  //#region src/api/useAuth/useSession.ts
@@ -0,0 +1,33 @@
1
+ import { NodeWrapper } from "./index.mjs";
2
+ import { createElement } from "react";
3
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
4
+ import * as NodeTypes from "@intlayer/types/nodeType";
5
+
6
+ //#region src/components/DictionaryEditor/NodeWrapper/SelectWrapper.tsx
7
+ const SelectWrapper = (props) => {
8
+ const { keyPath, section } = props;
9
+ const cases = section[NodeTypes.SELECT];
10
+ return /* @__PURE__ */ jsx("div", {
11
+ className: "ml-2 grid grid-cols-[auto,1fr] gap-2",
12
+ children: Object.keys(cases).map((caseKey) => {
13
+ const newKeyPathEl = {
14
+ type: NodeTypes.SELECT,
15
+ key: caseKey
16
+ };
17
+ const newKeyPath = [...keyPath, newKeyPathEl];
18
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
19
+ className: "flex items-center font-bold",
20
+ children: caseKey
21
+ }), /* @__PURE__ */ createElement(NodeWrapper, {
22
+ ...props,
23
+ key: caseKey,
24
+ keyPath: newKeyPath,
25
+ section: cases[caseKey]
26
+ })] });
27
+ })
28
+ });
29
+ };
30
+
31
+ //#endregion
32
+ export { SelectWrapper };
33
+ //# sourceMappingURL=SelectWrapper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectWrapper.mjs","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/SelectWrapper.tsx"],"sourcesContent":["import type { SelectContent } from '@intlayer/core/transpiler';\nimport type { ContentNode } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { FC } from 'react';\nimport { NodeWrapper, type NodeWrapperProps } from './index';\n\ntype SelectWrapperProps = Omit<NodeWrapperProps, 'section'> & {\n section: SelectContent;\n};\n\nexport const SelectWrapper: FC<SelectWrapperProps> = (props) => {\n const { keyPath, section } = props;\n\n const cases = section[NodeTypes.SELECT] as Record<string, ContentNode>;\n\n return (\n <div className=\"ml-2 grid grid-cols-[auto,1fr] gap-2\">\n {Object.keys(cases).map((caseKey) => {\n const newKeyPathEl: KeyPath = {\n type: NodeTypes.SELECT,\n key: caseKey,\n };\n const newKeyPath: KeyPath[] = [...keyPath, newKeyPathEl];\n\n return (\n <>\n <span className=\"flex items-center font-bold\">{caseKey}</span>\n <NodeWrapper\n {...props}\n key={caseKey}\n keyPath={newKeyPath}\n section={cases[caseKey]}\n />\n </>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;;;AAWA,MAAa,iBAAyC,UAAU;CAC9D,MAAM,EAAE,SAAS,YAAY;CAE7B,MAAM,QAAQ,QAAQ,UAAU;CAEhC,OACE,oBAAC,OAAD;EAAK,WAAU;YACZ,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK,YAAY;GACnC,MAAM,eAAwB;IAC5B,MAAM,UAAU;IAChB,KAAK;GACP;GACA,MAAM,aAAwB,CAAC,GAAG,SAAS,YAAY;GAEvD,OACE,8CACE,oBAAC,QAAD;IAAM,WAAU;cAA+B;GAAc,IAC7D,8BAAC,aAAD;IACE,GAAI;IACJ,KAAK;IACL,SAAS;IACT,SAAS,MAAM;GAChB,EACD;EAEN,CAAC;CACE;AAET"}
@@ -12,6 +12,7 @@ import { MarkdownWrapper } from "./MarkdownWrapper.mjs";
12
12
  import { NestedObjectWrapper } from "./NestedObjectWrapper.mjs";
13
13
  import { NumberWrapper } from "./NumberWrapper.mjs";
14
14
  import { PluralWrapper } from "./PluralWrapper.mjs";
15
+ import { SelectWrapper } from "./SelectWrapper.mjs";
15
16
  import { TranslationWrapper } from "./TranslationWrapper.mjs";
16
17
  import { memo, useMemo } from "react";
17
18
  import { jsx } from "react/jsx-runtime";
@@ -64,6 +65,10 @@ const NodeWrapper = memo((props) => {
64
65
  ...props,
65
66
  section
66
67
  });
68
+ if (nodeType === NodeTypes.SELECT) return /* @__PURE__ */ jsx(SelectWrapper, {
69
+ ...props,
70
+ section
71
+ });
67
72
  if (nodeType === NodeTypes.CONDITION) return /* @__PURE__ */ jsx(ConditionWrapper, {
68
73
  ...props,
69
74
  section
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n getContentNodeByKeyPath,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport type {\n ConditionContent,\n EnumerationContent,\n FileContent,\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n PluralContent,\n TranslationContent,\n} from '@intlayer/core/transpiler';\nimport { useEditorLocale } from '@intlayer/editor-react';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { ContentNode, Dictionary } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { type FC, memo, type ReactNode, useMemo } from 'react';\nimport { ArrayWrapper } from './ArrayWrapper';\nimport { BooleanWrapper } from './BooleanWrapper';\nimport { ConditionWrapper } from './ConditionWrapper';\nimport { EnumerationWrapper } from './EnumerationWrapper';\nimport { FileWrapper } from './FileWrapper';\nimport { HtmlWrapper } from './HtmlWrapper';\nimport { InsertionWrapper } from './InsertionWrapper';\nimport { MarkdownWrapper } from './MarkdownWrapper';\nimport { NestedObjectWrapper } from './NestedObjectWrapper';\nimport { NumberWrapper } from './NumberWrapper';\nimport { PluralWrapper } from './PluralWrapper';\nimport { StringWrapper } from './StringWrapper';\nimport { TranslationWrapper } from './TranslationWrapper';\n\nexport const traceKeys: string[] = ['filePath', 'id', 'nodeType'];\n\nexport type NodeWrapperProps = {\n keyPath: KeyPath[];\n dictionary: Dictionary;\n section: ContentNode;\n onContentChange: (content: { keyPath: KeyPath[]; newValue: string }) => void;\n locale: Locale;\n editedContent: ContentNode;\n focusedKeyPath: KeyPath[] | undefined;\n onFocusKeyPath: (keyPath: KeyPath[]) => void;\n onClickEdit?: (keyPath: KeyPath[]) => void;\n renderSection?: (content: string) => ReactNode;\n};\n\nexport const NodeWrapper: FC<NodeWrapperProps> = memo((props) => {\n const currentLocale = useEditorLocale();\n const section = useMemo(() => {\n const editedContentValue = getContentNodeByKeyPath(\n props.editedContent,\n props.keyPath,\n currentLocale\n );\n return editedContentValue ?? props.section;\n }, [props.editedContent, props.keyPath, props.section]);\n\n const nodeType = useMemo(() => getNodeType(section), [section]);\n\n if (typeof section === 'object') {\n if (nodeType === NodeTypes.REACT_NODE) {\n return (\n <span className=\"text-neutral text-xs\">React node not editable</span>\n );\n }\n\n if (nodeType === NodeTypes.NESTED) {\n return (\n <div className=\"ml-2 grid grid-cols-[auto,1fr] gap-2\">\n [Nested] Dictionary\n </div>\n );\n }\n\n if (nodeType === NodeTypes.MARKDOWN) {\n return (\n <MarkdownWrapper\n {...props}\n section={section as MarkdownContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.HTML) {\n return (\n <HtmlWrapper {...props} section={section as HTMLContent<ContentNode>} />\n );\n }\n\n if (nodeType === NodeTypes.TRANSLATION) {\n return (\n <TranslationWrapper\n {...props}\n section={section as TranslationContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.ENUMERATION) {\n return (\n <EnumerationWrapper\n {...props}\n section={section as EnumerationContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.PLURAL) {\n return (\n <PluralWrapper\n {...props}\n section={section as PluralContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.CONDITION) {\n return (\n <ConditionWrapper\n {...props}\n section={section as ConditionContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.INSERTION) {\n return (\n <InsertionWrapper\n {...props}\n section={section as InsertionContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n return (\n <ArrayWrapper\n {...props}\n section={section as unknown as ContentNode[]}\n />\n );\n }\n\n if (nodeType === NodeTypes.FILE) {\n return <FileWrapper {...props} section={section as FileContent} />;\n }\n\n return (\n <NestedObjectWrapper\n {...props}\n section={section as unknown as Record<string, ContentNode>}\n />\n );\n }\n\n if (typeof section === 'string') {\n return <StringWrapper {...props} section={section} />;\n }\n\n if (typeof section === 'number') {\n return <NumberWrapper {...props} section={section} />;\n }\n\n if (typeof section === 'boolean') {\n return <BooleanWrapper {...props} section={section} />;\n }\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAa,YAAsB;CAAC;CAAY;CAAM;AAAU;AAehE,MAAa,cAAoC,MAAM,UAAU;CAC/D,MAAM,gBAAgB,gBAAgB;CACtC,MAAM,UAAU,cAAc;EAM5B,OAL2B,wBACzB,MAAM,eACN,MAAM,SACN,aAEsB,KAAK,MAAM;CACrC,GAAG;EAAC,MAAM;EAAe,MAAM;EAAS,MAAM;CAAO,CAAC;CAEtD,MAAM,WAAW,cAAc,YAAY,OAAO,GAAG,CAAC,OAAO,CAAC;CAE9D,IAAI,OAAO,YAAY,UAAU;EAC/B,IAAI,aAAa,UAAU,YACzB,OACE,oBAAC,QAAD;GAAM,WAAU;aAAuB;EAA6B;EAIxE,IAAI,aAAa,UAAU,QACzB,OACE,oBAAC,OAAD;GAAK,WAAU;aAAuC;EAEjD;EAIT,IAAI,aAAa,UAAU,UACzB,OACE,oBAAC,iBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,MACzB,OACE,oBAAC,aAAD;GAAa,GAAI;GAAgB;EAAsC;EAI3E,IAAI,aAAa,UAAU,aACzB,OACE,oBAAC,oBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,aACzB,OACE,oBAAC,oBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,QACzB,OACE,oBAAC,eAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,WACzB,OACE,oBAAC,kBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,WACzB,OACE,oBAAC,kBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,OACzB,OACE,oBAAC,cAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,MACzB,OAAO,oBAAC,aAAD;GAAa,GAAI;GAAgB;EAAyB;EAGnE,OACE,oBAAC,qBAAD;GACE,GAAI;GACK;EACV;CAEL;CAEA,IAAI,OAAO,YAAY,UACrB,OAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;CAAU;CAGtD,IAAI,OAAO,YAAY,UACrB,OAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;CAAU;CAGtD,IAAI,OAAO,YAAY,WACrB,OAAO,oBAAC,gBAAD;EAAgB,GAAI;EAAgB;CAAU;AAEzD,CAAC"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n getContentNodeByKeyPath,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport type {\n ConditionContent,\n EnumerationContent,\n FileContent,\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n PluralContent,\n SelectContent,\n TranslationContent,\n} from '@intlayer/core/transpiler';\nimport { useEditorLocale } from '@intlayer/editor-react';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { ContentNode, Dictionary } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { type FC, memo, type ReactNode, useMemo } from 'react';\nimport { ArrayWrapper } from './ArrayWrapper';\nimport { BooleanWrapper } from './BooleanWrapper';\nimport { ConditionWrapper } from './ConditionWrapper';\nimport { EnumerationWrapper } from './EnumerationWrapper';\nimport { FileWrapper } from './FileWrapper';\nimport { HtmlWrapper } from './HtmlWrapper';\nimport { InsertionWrapper } from './InsertionWrapper';\nimport { MarkdownWrapper } from './MarkdownWrapper';\nimport { NestedObjectWrapper } from './NestedObjectWrapper';\nimport { NumberWrapper } from './NumberWrapper';\nimport { PluralWrapper } from './PluralWrapper';\nimport { SelectWrapper } from './SelectWrapper';\nimport { StringWrapper } from './StringWrapper';\nimport { TranslationWrapper } from './TranslationWrapper';\n\nexport const traceKeys: string[] = ['filePath', 'id', 'nodeType'];\n\nexport type NodeWrapperProps = {\n keyPath: KeyPath[];\n dictionary: Dictionary;\n section: ContentNode;\n onContentChange: (content: { keyPath: KeyPath[]; newValue: string }) => void;\n locale: Locale;\n editedContent: ContentNode;\n focusedKeyPath: KeyPath[] | undefined;\n onFocusKeyPath: (keyPath: KeyPath[]) => void;\n onClickEdit?: (keyPath: KeyPath[]) => void;\n renderSection?: (content: string) => ReactNode;\n};\n\nexport const NodeWrapper: FC<NodeWrapperProps> = memo((props) => {\n const currentLocale = useEditorLocale();\n const section = useMemo(() => {\n const editedContentValue = getContentNodeByKeyPath(\n props.editedContent,\n props.keyPath,\n currentLocale\n );\n return editedContentValue ?? props.section;\n }, [props.editedContent, props.keyPath, props.section]);\n\n const nodeType = useMemo(() => getNodeType(section), [section]);\n\n if (typeof section === 'object') {\n if (nodeType === NodeTypes.REACT_NODE) {\n return (\n <span className=\"text-neutral text-xs\">React node not editable</span>\n );\n }\n\n if (nodeType === NodeTypes.NESTED) {\n return (\n <div className=\"ml-2 grid grid-cols-[auto,1fr] gap-2\">\n [Nested] Dictionary\n </div>\n );\n }\n\n if (nodeType === NodeTypes.MARKDOWN) {\n return (\n <MarkdownWrapper\n {...props}\n section={section as MarkdownContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.HTML) {\n return (\n <HtmlWrapper {...props} section={section as HTMLContent<ContentNode>} />\n );\n }\n\n if (nodeType === NodeTypes.TRANSLATION) {\n return (\n <TranslationWrapper\n {...props}\n section={section as TranslationContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.ENUMERATION) {\n return (\n <EnumerationWrapper\n {...props}\n section={section as EnumerationContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.PLURAL) {\n return (\n <PluralWrapper\n {...props}\n section={section as PluralContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.SELECT) {\n return <SelectWrapper {...props} section={section as SelectContent} />;\n }\n\n if (nodeType === NodeTypes.CONDITION) {\n return (\n <ConditionWrapper\n {...props}\n section={section as ConditionContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.INSERTION) {\n return (\n <InsertionWrapper\n {...props}\n section={section as InsertionContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n return (\n <ArrayWrapper\n {...props}\n section={section as unknown as ContentNode[]}\n />\n );\n }\n\n if (nodeType === NodeTypes.FILE) {\n return <FileWrapper {...props} section={section as FileContent} />;\n }\n\n return (\n <NestedObjectWrapper\n {...props}\n section={section as unknown as Record<string, ContentNode>}\n />\n );\n }\n\n if (typeof section === 'string') {\n return <StringWrapper {...props} section={section} />;\n }\n\n if (typeof section === 'number') {\n return <NumberWrapper {...props} section={section} />;\n }\n\n if (typeof section === 'boolean') {\n return <BooleanWrapper {...props} section={section} />;\n }\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAa,YAAsB;CAAC;CAAY;CAAM;AAAU;AAehE,MAAa,cAAoC,MAAM,UAAU;CAC/D,MAAM,gBAAgB,gBAAgB;CACtC,MAAM,UAAU,cAAc;EAM5B,OAL2B,wBACzB,MAAM,eACN,MAAM,SACN,aAEsB,KAAK,MAAM;CACrC,GAAG;EAAC,MAAM;EAAe,MAAM;EAAS,MAAM;CAAO,CAAC;CAEtD,MAAM,WAAW,cAAc,YAAY,OAAO,GAAG,CAAC,OAAO,CAAC;CAE9D,IAAI,OAAO,YAAY,UAAU;EAC/B,IAAI,aAAa,UAAU,YACzB,OACE,oBAAC,QAAD;GAAM,WAAU;aAAuB;EAA6B;EAIxE,IAAI,aAAa,UAAU,QACzB,OACE,oBAAC,OAAD;GAAK,WAAU;aAAuC;EAEjD;EAIT,IAAI,aAAa,UAAU,UACzB,OACE,oBAAC,iBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,MACzB,OACE,oBAAC,aAAD;GAAa,GAAI;GAAgB;EAAsC;EAI3E,IAAI,aAAa,UAAU,aACzB,OACE,oBAAC,oBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,aACzB,OACE,oBAAC,oBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,QACzB,OACE,oBAAC,eAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,QACzB,OAAO,oBAAC,eAAD;GAAe,GAAI;GAAgB;EAA2B;EAGvE,IAAI,aAAa,UAAU,WACzB,OACE,oBAAC,kBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,WACzB,OACE,oBAAC,kBAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,OACzB,OACE,oBAAC,cAAD;GACE,GAAI;GACK;EACV;EAIL,IAAI,aAAa,UAAU,MACzB,OAAO,oBAAC,aAAD;GAAa,GAAI;GAAgB;EAAyB;EAGnE,OACE,oBAAC,qBAAD;GACE,GAAI;GACK;EACV;CAEL;CAEA,IAAI,OAAO,YAAY,UACrB,OAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;CAAU;CAGtD,IAAI,OAAO,YAAY,UACrB,OAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;CAAU;CAGtD,IAAI,OAAO,YAAY,WACrB,OAAO,oBAAC,gBAAD;EAAgB,GAAI;EAAgB;CAAU;AAEzD,CAAC"}
@@ -232,6 +232,93 @@ const EnumerationTextEditor = ({ section, keyPath, dictionary, renderSection })
232
232
  })]
233
233
  });
234
234
  };
235
+ const SelectTextEditor = ({ section, keyPath, dictionary, renderSection }) => {
236
+ const { addEditedContent } = useEditedContent();
237
+ const { addNewSelectCase, removeSelectCase } = useIntlayer("navigation-view");
238
+ const content = section[NodeTypes.SELECT];
239
+ const firstKey = Object.keys(content)[0];
240
+ return /* @__PURE__ */ jsxs("div", {
241
+ className: "flex flex-col gap-2",
242
+ children: [/* @__PURE__ */ jsx("table", {
243
+ className: "w-full",
244
+ children: /* @__PURE__ */ jsx("tbody", {
245
+ className: "flex w-full flex-col gap-2",
246
+ children: Object.keys(content).map((caseKey) => {
247
+ const childrenKeyPath = [...keyPath, {
248
+ type: NodeTypes.SELECT,
249
+ key: caseKey
250
+ }];
251
+ const uniqueKey = `${JSON.stringify(keyPath)}-select-${caseKey}`;
252
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
253
+ /* @__PURE__ */ jsx("tr", {
254
+ className: "mt-2 w-full",
255
+ children: /* @__PURE__ */ jsx("td", {
256
+ className: "flex w-full",
257
+ children: /* @__PURE__ */ jsx("div", {
258
+ className: "flex flex-1",
259
+ children: /* @__PURE__ */ jsx(Button, {
260
+ label: removeSelectCase.label.value,
261
+ variant: "hoverable",
262
+ size: "sm",
263
+ color: "error",
264
+ className: "ml-auto text-neutral hover:text-error",
265
+ Icon: Trash,
266
+ onClick: () => addEditedContent(dictionary.localId, void 0, childrenKeyPath),
267
+ children: removeSelectCase.text
268
+ })
269
+ })
270
+ })
271
+ }),
272
+ /* @__PURE__ */ jsx("tr", {
273
+ className: "w-full p-2",
274
+ children: /* @__PURE__ */ jsx("td", {
275
+ className: "flex w-full",
276
+ children: /* @__PURE__ */ jsx(ContentEditorInput$1, {
277
+ "aria-label": "Edit case",
278
+ type: "text",
279
+ variant: "default",
280
+ onContentChange: (value) => {
281
+ const newValue = {
282
+ ...section,
283
+ [NodeTypes.SELECT]: renameKey(content, caseKey, String(value))
284
+ };
285
+ addEditedContent(dictionary.localId, newValue, keyPath);
286
+ },
287
+ children: caseKey
288
+ })
289
+ })
290
+ }),
291
+ /* @__PURE__ */ jsx("tr", {
292
+ className: "block w-full",
293
+ children: /* @__PURE__ */ jsx("td", {
294
+ className: "flex w-full",
295
+ children: /* @__PURE__ */ jsx(TextEditor, {
296
+ section: content[caseKey] ?? getEmptyNode(content[firstKey]),
297
+ keyPath: childrenKeyPath,
298
+ dictionary,
299
+ renderSection
300
+ })
301
+ })
302
+ })
303
+ ] }, uniqueKey);
304
+ })
305
+ })
306
+ }), /* @__PURE__ */ jsx(Button, {
307
+ label: addNewSelectCase.label.value,
308
+ variant: "hoverable",
309
+ color: "neutral",
310
+ textAlign: "left",
311
+ isFullWidth: true,
312
+ onClick: () => addEditedContent(dictionary.localId, getEmptyNode(content[firstKey]) ?? "", [...keyPath, {
313
+ type: NodeTypes.SELECT,
314
+ key: "newCase"
315
+ }]),
316
+ Icon: Plus,
317
+ className: "m-2",
318
+ children: addNewSelectCase.text
319
+ })]
320
+ });
321
+ };
235
322
  const ConditionTextEditor = ({ section, keyPath, dictionary, renderSection }) => {
236
323
  const content = section[NodeTypes.CONDITION];
237
324
  return /* @__PURE__ */ jsx("table", {
@@ -654,6 +741,12 @@ const TextEditor = memo(function TextEditor({ section, keyPath, dictionary, rend
654
741
  keyPath,
655
742
  section
656
743
  });
744
+ if (nodeType === NodeTypes.SELECT) return /* @__PURE__ */ jsx(SelectTextEditor, {
745
+ dictionary,
746
+ renderSection,
747
+ keyPath,
748
+ section
749
+ });
657
750
  if (nodeType === NodeTypes.GENDER) return /* @__PURE__ */ jsx(GenderTextEditor, {
658
751
  dictionary,
659
752
  renderSection,
@@ -1 +1 @@
1
- {"version":3,"file":"TextEditor.mjs","names":["ContentEditorTextAreaBase","ContentEditorInputBase"],"sources":["../../../../../src/components/DictionaryFieldEditor/ContentEditorView/TextEditor.tsx"],"sourcesContent":["'use client';\n\nimport { useAuditContentDeclarationField } from '@api/index';\nimport { Accordion } from '@components/Accordion';\nimport { Button } from '@components/Button';\nimport { Container } from '@components/Container';\nimport {\n ContentEditorInput as ContentEditorInputBase,\n type ContentEditorInputProps as ContentEditorInputPropsBase,\n} from '@components/ContentEditor/ContentEditorInput';\nimport {\n ContentEditorTextArea as ContentEditorTextAreaBase,\n type ContentEditorTextAreaProps as ContentEditorTextAreaPropsBase,\n} from '@components/ContentEditor/ContentEditorTextArea';\nimport { renameKey } from '@components/DictionaryFieldEditor/ContentEditorView/object';\nimport { Label } from '@components/Label';\nimport { Loader } from '@components/Loader';\nimport { useLocaleSwitcherContent } from '@components/LocaleSwitcherContentDropDown';\nimport {\n SwitchSelector,\n type SwitchSelectorChoices,\n type SwitchSelectorProps,\n} from '@components/SwitchSelector';\nimport { camelCaseToSentence } from '@intlayer/config/client';\nimport {\n getEmptyNode,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport { getLocaleName } from '@intlayer/core/localization';\nimport type {\n ConditionContent,\n EnumerationContent,\n FileContent,\n GenderContent,\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n PluralContent,\n TranslationContent,\n} from '@intlayer/core/transpiler';\nimport { useConfiguration, useEditedContent } from '@intlayer/editor-react';\nimport type { ContentNode, Dictionary } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { Plus, Trash, WandSparkles } from 'lucide-react';\nimport {\n type FC,\n Fragment,\n lazy,\n memo,\n type ReactNode,\n Suspense,\n useState,\n} from 'react';\nimport { useIntlayer, useLocale } from 'react-intlayer';\nimport { EnumKeyInput } from '../EnumKeyInput';\nimport { SafeHtmlRenderer } from './SafeHtmlRenderer';\n\nconst LazyMarkdownRenderer = lazy(() =>\n import('@components/MarkDownRender').then((m) => ({\n default: m.MarkdownRenderer,\n }))\n);\n\n// Lazy-loaded so the Tiptap/Novel editor bundle is only fetched when a markdown\n// field is actually edited.\nconst LazyMarkdownEditor = lazy(() =>\n import('@components/MarkdownEditor').then((m) => ({\n default: m.MarkdownEditor,\n }))\n);\n\n// Renders children only after the accordion is first opened (mount-once pattern).\n// Prevents deeply nested sub-trees from mounting on initial render.\ntype CollapsibleEditorProps = TextEditorProps & { label: string };\nconst CollapsibleEditor = memo<CollapsibleEditorProps>(\n function CollapsibleEditor({ label, ...editorProps }) {\n const [hasOpened, setHasOpened] = useState(false);\n return (\n <Accordion\n header={label}\n label={label}\n onToggle={(isOpen) => {\n if (isOpen && !hasOpened) setHasOpened(true);\n }}\n >\n {hasOpened ? <TextEditor {...editorProps} /> : null}\n </Accordion>\n );\n }\n);\n\nexport const traceKeys: string[] = ['filePath', 'id', 'nodeType'];\n\ntype ContentEditorTextAreaProps = Omit<\n ContentEditorTextAreaPropsBase,\n 'onContentChange'\n> & {\n keyPath: KeyPath[];\n dictionary: Dictionary;\n};\n\nconst ContentEditorTextArea: FC<ContentEditorTextAreaProps> = ({\n keyPath,\n dictionary,\n ...props\n}) => {\n const { editedContent, addEditedContent } = useEditedContent();\n const configuration = useConfiguration();\n const { mutate: auditContentDeclarationField, isPending: isAuditing } =\n useAuditContentDeclarationField();\n\n return (\n <ContentEditorTextAreaBase\n variant=\"default\"\n onContentChange={(newValue) =>\n addEditedContent(dictionary.localId!, newValue, keyPath)\n }\n additionalButtons={\n <Button\n Icon={WandSparkles}\n label=\"Audit\"\n variant=\"hoverable\"\n size=\"icon-sm\"\n color=\"text\"\n className=\"cursor-pointer hover:scale-110\"\n isLoading={isAuditing}\n onClick={() => {\n auditContentDeclarationField(\n {\n fileContent: JSON.stringify({\n ...dictionary,\n ...(editedContent?.[dictionary.localId!] ?? {}),\n }),\n keyPath,\n locales: configuration?.internationalization.locales ?? [],\n aiOptions: {\n apiKey: configuration?.ai?.apiKey,\n model: configuration?.ai?.model,\n temperature: configuration?.ai?.temperature,\n },\n },\n {\n onSuccess: (response) => {\n if (!response?.data) return;\n\n try {\n const editedContent = response.data.fileContent as string;\n\n addEditedContent(\n dictionary.localId!,\n editedContent,\n keyPath\n );\n } catch (error) {\n console.error(error);\n }\n },\n }\n );\n }}\n />\n }\n {...props}\n />\n );\n};\n\ntype ContentEditorInputProps = Omit<\n ContentEditorInputPropsBase,\n 'onContentChange'\n> & {\n keyPath: KeyPath[];\n dictionary: Dictionary;\n};\n\nconst ContentEditorInput: FC<ContentEditorInputProps> = ({\n keyPath,\n dictionary,\n ...props\n}) => {\n const { addEditedContent } = useEditedContent();\n\n return (\n <ContentEditorInputBase\n variant=\"default\"\n onContentChange={(newValue) =>\n addEditedContent(dictionary.localId!, newValue, keyPath)\n }\n {...props}\n />\n );\n};\n\nconst toggleContent = [\n {\n content: 'False',\n value: false,\n },\n {\n content: 'True',\n value: true,\n },\n] as SwitchSelectorChoices<boolean>;\n\ntype ContentEditorToggleProps = SwitchSelectorProps & {\n dictionary: Dictionary;\n keyPath: KeyPath[];\n};\n\nconst ContentEditorToggle: FC<ContentEditorToggleProps> = ({\n dictionary,\n keyPath,\n ...props\n}) => {\n const { addEditedContent } = useEditedContent();\n\n return (\n <SwitchSelector\n choices={toggleContent}\n value={true}\n onChange={(value) =>\n addEditedContent(dictionary.localId!, value, keyPath)\n }\n color=\"text\"\n size=\"sm\"\n {...props}\n />\n );\n};\n\nexport type TextEditorProps = {\n dictionary: Dictionary;\n keyPath: KeyPath[];\n section: ContentNode;\n isDarkMode?: boolean;\n /**\n * Custom renderer for string leaves. Receives the leaf content and its full\n * key path so the renderer can write edits back to the right location.\n */\n renderSection?: (content: string, keyPath: KeyPath[]) => ReactNode;\n onContentChange?: (newValue: string) => void;\n};\n\nconst TranslationTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}: TextEditorProps) => {\n const { locale, defaultLocale } = useLocale();\n const { selectedLocales } = useLocaleSwitcherContent();\n\n const content: any = (section as TranslationContent<string>)[\n NodeTypes.TRANSLATION\n ];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {selectedLocales.map((translationKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-translation-${translationKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 w-full p-2 text-xs\">\n <td className=\"flex w-full\">\n {getLocaleName(translationKey, locale)}\n </td>\n </tr>\n <tr className=\"flex\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[translationKey] ??\n getEmptyNode(content[defaultLocale])\n }\n keyPath={[\n ...keyPath,\n { type: NodeTypes.TRANSLATION, key: translationKey },\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst EnumerationTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const { addEditedContent } = useEditedContent();\n const { addNewEnumeration, removeEnumeration } =\n useIntlayer('navigation-view');\n\n const content = (section as EnumerationContent<string>)[\n NodeTypes.ENUMERATION\n ];\n const firstKey = Object.keys(content)[0] as keyof typeof content;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {Object.keys(\n (section as EnumerationContent<ContentNode>)[NodeTypes.ENUMERATION]\n ).map((enumKey) => {\n const childrenKeyPath = [\n ...keyPath,\n { type: NodeTypes.ENUMERATION, key: enumKey },\n ] as KeyPath[];\n const uniqueKey = `${JSON.stringify(keyPath)}-enumeration-${enumKey}`;\n\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 w-full\">\n <td className=\"flex w-full\">\n <div className=\"flex flex-1\">\n <Button\n label={removeEnumeration.label.value}\n variant=\"hoverable\"\n size=\"sm\"\n color=\"error\"\n className=\"ml-auto text-neutral hover:text-error\"\n Icon={Trash}\n onClick={() =>\n addEditedContent(\n dictionary.localId!,\n undefined,\n childrenKeyPath\n )\n }\n >\n {removeEnumeration.text}\n </Button>\n </div>\n </td>\n </tr>\n <tr className=\"w-full p-2\">\n <td className=\"flex w-full\">\n <EnumKeyInput\n value={enumKey}\n onChange={(value) => {\n const preValueContent = (\n section as EnumerationContent<string>\n )[NodeTypes.ENUMERATION];\n\n const newValueContent = renameKey(\n preValueContent,\n enumKey as keyof typeof preValueContent,\n value\n );\n const newValue = {\n ...(section as EnumerationContent<string>),\n [NodeTypes.ENUMERATION]: newValueContent,\n };\n\n console.log('newValue', newValue);\n\n addEditedContent(\n dictionary.localId!,\n newValue,\n keyPath\n );\n }}\n />\n </td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditor\n section={\n content[enumKey as keyof typeof content] ??\n getEmptyNode(content[firstKey])\n }\n keyPath={childrenKeyPath}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n\n <Button\n label={addNewEnumeration.label.value}\n variant=\"hoverable\"\n color=\"neutral\"\n textAlign=\"left\"\n isFullWidth\n onClick={() =>\n addEditedContent(\n dictionary.localId!,\n getEmptyNode(content[firstKey]) ?? '',\n [...keyPath, { type: NodeTypes.ENUMERATION, key: 'unknown' }]\n )\n }\n Icon={Plus}\n className=\"m-2\"\n >\n {addNewEnumeration.text}\n </Button>\n </div>\n );\n};\n\nconst ConditionTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const content = (section as ConditionContent<string>)[NodeTypes.CONDITION];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {['true', 'false', 'fallback'].map((condKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-condition-${condKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 block w-full p-2 text-xs\">\n <td className=\"flex w-full\">{String(condKey)}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[condKey as keyof typeof content] ??\n getEmptyNode(content.true)\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.CONDITION,\n key: condKey,\n } as KeyPath,\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst GenderTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const content = (section as GenderContent<string>)[NodeTypes.GENDER];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {['male', 'female', 'fallback'].map((condKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-gender-${condKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 block w-full p-2 text-xs\">\n <td className=\"flex w-full\">{String(condKey)}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[condKey as keyof typeof content] ??\n getEmptyNode(content.male)\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.GENDER,\n key: condKey,\n } as KeyPath,\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst PLURAL_CATEGORIES = ['zero', 'one', 'two', 'few', 'many', 'other'];\n\nconst PluralTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const content = (section as PluralContent<string>)[NodeTypes.PLURAL];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {PLURAL_CATEGORIES.map((pluralKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-plural-${pluralKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 block w-full p-2 text-xs\">\n <td className=\"flex w-full\">{pluralKey}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[pluralKey as keyof typeof content] ??\n getEmptyNode(content.other)\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.PLURAL,\n key: pluralKey,\n } as KeyPath,\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst ArrayTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const { addEditedContent } = useEditedContent();\n const { addNewElement, removeElement } = useIntlayer('navigation-view');\n\n return (\n <div className=\"flex flex-col gap-2\">\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {(section as unknown as ContentNode[]).map((subSection, index) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-array-${index}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 w-full p-2\">\n <td className=\"flex w-full\">\n <div className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"text-xs\">{String(index)}</span>\n <Button\n label={removeElement.label.value}\n variant=\"hoverable\"\n size=\"sm\"\n color=\"error\"\n className=\"ml-auto text-neutral hover:text-error\"\n onClick={() => {\n const newKeyPath: KeyPath[] = [\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: index, // Fixed: Use index instead of length\n },\n ];\n addEditedContent(\n dictionary.localId!,\n undefined,\n newKeyPath\n );\n }}\n Icon={Trash}\n >\n {removeElement.text}\n </Button>\n </div>\n </td>\n </tr>\n\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n subSection ??\n getEmptyNode((section as unknown as ContentNode[])[0])\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: index,\n },\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n <Button\n label={addNewElement.label.value}\n variant=\"hoverable\"\n color=\"neutral\"\n textAlign=\"left\"\n isFullWidth\n onClick={() => {\n const newKeyPath: KeyPath[] = [\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: (section as unknown as ContentNode[]).length, // Keeps length for adding new items\n },\n ];\n addEditedContent(\n dictionary.localId!,\n getEmptyNode((section as unknown as ContentNode[])[0]) ?? '',\n newKeyPath,\n false\n );\n }}\n Icon={Plus}\n >\n {addNewElement.text}\n </Button>\n </div>\n );\n};\n\nconst ObjectTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const typedSection = section as unknown as Record<string, ContentNode>;\n const firstKey = Object.keys(typedSection)[0] as keyof typeof section;\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex flex-col gap-2\">\n {Object.keys(typedSection).map((key) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.OBJECT, key },\n ];\n const subSection =\n typedSection[key as keyof typeof section] ??\n getEmptyNode(typedSection[firstKey]);\n const uniqueKey = `${JSON.stringify(keyPath)}-object-${key}`;\n // Collapse any object/array (typed or plain) — only true primitives render inline.\n // getIsEditableSection can't be used here: it inspects getNodeChildren(), which for\n // translation nodes returns the first locale value (a string), causing translation\n // subtrees to be mistakenly treated as leaves and mounted all at once.\n const isLeaf = subSection === null || typeof subSection !== 'object';\n\n if (isLeaf) {\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 p-2 text-xs\">\n <td className=\"flex w-full\">{String(key)}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditor\n section={subSection}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n }\n\n return (\n <tr\n key={uniqueKey}\n className=\"block w-full border-neutral/10 border-t py-1\"\n >\n <td className=\"flex w-full\">\n <CollapsibleEditor\n label={camelCaseToSentence(key)}\n section={subSection}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nenum MarkdownViewMode {\n Edit,\n Raw,\n Preview,\n}\n\nenum HtmlViewMode {\n Edit,\n Preview,\n}\n\nconst HtmlTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n}) => {\n const [mode, setMode] = useState(HtmlViewMode.Edit);\n const toggleContent = [\n {\n content: 'Edit',\n value: HtmlViewMode.Edit,\n },\n {\n content: 'Preview',\n value: HtmlViewMode.Preview,\n },\n ] as SwitchSelectorChoices<HtmlViewMode>;\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.HTML }];\n\n const content = (section as HTMLContent<ContentNode>)[\n NodeTypes.HTML\n ] as ContentNode;\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <SwitchSelector\n choices={toggleContent}\n value={mode}\n onChange={setMode}\n color=\"text\"\n size=\"sm\"\n className=\"ml-auto\"\n />\n\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={\n mode === HtmlViewMode.Preview\n ? (rawContent) => <SafeHtmlRenderer rawContent={rawContent} />\n : undefined\n }\n />\n </div>\n );\n};\n\nconst MarkdownTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n isDarkMode,\n}) => {\n const [mode, setMode] = useState(MarkdownViewMode.Edit);\n const { addEditedContent } = useEditedContent();\n const toggleContent = [\n {\n content: 'Edit',\n value: MarkdownViewMode.Edit,\n },\n {\n content: 'Raw',\n value: MarkdownViewMode.Raw,\n },\n {\n content: 'Preview',\n value: MarkdownViewMode.Preview,\n },\n ] as SwitchSelectorChoices<MarkdownViewMode>;\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.MARKDOWN }];\n\n const content = ((section as MarkdownContent<ContentNode>)[\n NodeTypes.MARKDOWN\n ] ?? '') as ContentNode;\n\n /**\n * WYSIWYG editor rendered on every markdown string leaf. When the markdown\n * node wraps another node (e.g. `md(t({ ... }))`), the recursive editor\n * walks the inner structure and calls this renderer once per string leaf,\n * so each locale/branch gets its own rich-text surface writing back to its\n * own key path.\n */\n const renderMarkdownEditor = (\n leafContent: string,\n leafKeyPath: KeyPath[]\n ): ReactNode => (\n <Suspense fallback={<Loader />}>\n <LazyMarkdownEditor\n key={JSON.stringify(leafKeyPath)}\n defaultValue={leafContent}\n onChange={(markdown) =>\n addEditedContent(dictionary.localId!, markdown, leafKeyPath)\n }\n />\n </Suspense>\n );\n\n const renderMarkdownPreview = (leafContent: string): ReactNode => (\n <Suspense fallback={<Loader />}>\n <LazyMarkdownRenderer isDarkMode={isDarkMode}>\n {leafContent}\n </LazyMarkdownRenderer>\n </Suspense>\n );\n\n const renderSectionByMode: TextEditorProps['renderSection'] =\n mode === MarkdownViewMode.Edit\n ? renderMarkdownEditor\n : mode === MarkdownViewMode.Preview\n ? renderMarkdownPreview\n : undefined;\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <SwitchSelector\n choices={toggleContent}\n value={mode}\n onChange={setMode}\n color=\"text\"\n size=\"sm\"\n className=\"ml-auto\"\n />\n\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={renderSectionByMode}\n />\n </div>\n );\n};\n\nconst InsertionTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n ...props\n}) => {\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.INSERTION }];\n\n const content = (section as InsertionContent<ContentNode>)[\n NodeTypes.INSERTION\n ];\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n {...props}\n />\n </div>\n );\n};\n\nconst FileTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n ...props\n}) => {\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.FILE }];\n\n const fileUrl = (section as FileContent)[NodeTypes.FILE];\n const { content } = section as FileContent;\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <span className=\"text-neutral text-sm\">{fileUrl} </span>\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n {...props}\n />\n </div>\n );\n};\n\nconst NestedTextEditor: FC<TextEditorProps> = ({\n keyPath,\n dictionary,\n renderSection,\n section,\n ...props\n}) => {\n const { addEditedContent } = useEditedContent();\n\n const content = (section as any)[NodeTypes.NESTED];\n const childrenKeyPath = [...keyPath, { type: NodeTypes.NESTED }] as KeyPath[];\n\n return (\n <div className=\"flex w-full flex-col gap-4 p-2\">\n <Label>Dictionary key</Label>\n <ContentEditorInputBase\n aria-label=\"Edit field\"\n type=\"text\"\n variant=\"default\"\n {...props}\n onContentChange={(newValue) => {\n addEditedContent(\n dictionary.localId!,\n {\n ...content,\n dictionaryKey: String(newValue),\n },\n childrenKeyPath\n );\n }}\n >\n {content.dictionaryKey ?? ''}\n </ContentEditorInputBase>\n\n <Label>Path (optional)</Label>\n <ContentEditorInputBase\n aria-label=\"Edit field\"\n type=\"text\"\n variant=\"default\"\n {...props}\n onContentChange={(newValue) => {\n addEditedContent(\n dictionary.localId!,\n {\n ...content,\n path: newValue !== '' ? newValue : undefined,\n },\n childrenKeyPath\n );\n }}\n >\n {content.path ?? ''}\n </ContentEditorInputBase>\n </div>\n );\n};\n\nexport const TextEditor = memo<TextEditorProps>(function TextEditor({\n section,\n keyPath,\n dictionary,\n renderSection,\n isDarkMode,\n}) {\n const { tsxNotEditable } = useIntlayer('navigation-view');\n const nodeType = getNodeType(section);\n\n if (nodeType === NodeTypes.REACT_NODE) {\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <span>(React Node)</span>\n <span className=\"flex text-neutral text-xs\">{tsxNotEditable}</span>\n </div>\n );\n }\n\n if (nodeType === NodeTypes.NESTED) {\n return (\n <NestedTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.TRANSLATION) {\n return (\n <TranslationTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.ENUMERATION) {\n return (\n <EnumerationTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.CONDITION) {\n return (\n <ConditionTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.GENDER) {\n return (\n <GenderTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.PLURAL) {\n return (\n <PluralTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.INSERTION) {\n return (\n <InsertionTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.MARKDOWN) {\n return (\n <MarkdownTextEditor\n dictionary={dictionary}\n keyPath={keyPath}\n section={section}\n isDarkMode={isDarkMode}\n />\n );\n }\n\n if (nodeType === NodeTypes.HTML) {\n return (\n <HtmlTextEditor\n dictionary={dictionary}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.FILE) {\n return (\n <FileTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n return (\n <ArrayTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.OBJECT) {\n return (\n <ObjectTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.NUMBER) {\n return (\n <div className=\"w-full p-2\">\n <ContentEditorInput\n dictionary={dictionary}\n keyPath={keyPath}\n type=\"number\"\n aria-label=\"Edit field\"\n >\n {section as number}\n </ContentEditorInput>\n </div>\n );\n }\n\n if (nodeType === NodeTypes.TEXT) {\n return (\n <div className=\"w-full p-2\">\n {typeof renderSection === 'function' ? (\n renderSection(section as string, keyPath)\n ) : (\n <ContentEditorTextArea\n variant=\"default\"\n aria-label=\"Edit field\"\n keyPath={keyPath}\n dictionary={dictionary}\n >\n {section as string}\n </ContentEditorTextArea>\n )}\n </div>\n );\n }\n\n if (nodeType === NodeTypes.BOOLEAN) {\n return (\n <div className=\"w-full p-2\">\n <ContentEditorToggle\n dictionary={dictionary}\n keyPath={keyPath}\n value={section as boolean}\n />\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-2\">\n Error. Format not supported.\n {JSON.stringify(section, null, 2)}\n {JSON.stringify(keyPath, null, 2)}\n NodeType : {nodeType}\n </div>\n );\n});\n\nexport const TextEditorContainer = memo<TextEditorProps>(\n function TextEditorContainer(props) {\n return (\n <Container\n border\n background=\"none\"\n className=\"top-6 flex h-full flex-1 flex-col gap-6 overflow-hidden p-2 md:sticky\"\n roundedSize=\"2xl\"\n >\n <TextEditor {...props} />\n </Container>\n );\n }\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"TextEditor.mjs","names":["ContentEditorTextAreaBase","ContentEditorInputBase"],"sources":["../../../../../src/components/DictionaryFieldEditor/ContentEditorView/TextEditor.tsx"],"sourcesContent":["'use client';\n\nimport { useAuditContentDeclarationField } from '@api/index';\nimport { Accordion } from '@components/Accordion';\nimport { Button } from '@components/Button';\nimport { Container } from '@components/Container';\nimport {\n ContentEditorInput as ContentEditorInputBase,\n type ContentEditorInputProps as ContentEditorInputPropsBase,\n} from '@components/ContentEditor/ContentEditorInput';\nimport {\n ContentEditorTextArea as ContentEditorTextAreaBase,\n type ContentEditorTextAreaProps as ContentEditorTextAreaPropsBase,\n} from '@components/ContentEditor/ContentEditorTextArea';\nimport { renameKey } from '@components/DictionaryFieldEditor/ContentEditorView/object';\nimport { Label } from '@components/Label';\nimport { Loader } from '@components/Loader';\nimport { useLocaleSwitcherContent } from '@components/LocaleSwitcherContentDropDown';\nimport {\n SwitchSelector,\n type SwitchSelectorChoices,\n type SwitchSelectorProps,\n} from '@components/SwitchSelector';\nimport { camelCaseToSentence } from '@intlayer/config/client';\nimport {\n getEmptyNode,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport { getLocaleName } from '@intlayer/core/localization';\nimport type {\n ConditionContent,\n EnumerationContent,\n FileContent,\n GenderContent,\n HTMLContent,\n InsertionContent,\n MarkdownContent,\n PluralContent,\n SelectContent,\n TranslationContent,\n} from '@intlayer/core/transpiler';\nimport { useConfiguration, useEditedContent } from '@intlayer/editor-react';\nimport type { ContentNode, Dictionary } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { Plus, Trash, WandSparkles } from 'lucide-react';\nimport {\n type FC,\n Fragment,\n lazy,\n memo,\n type ReactNode,\n Suspense,\n useState,\n} from 'react';\nimport { useIntlayer, useLocale } from 'react-intlayer';\nimport { EnumKeyInput } from '../EnumKeyInput';\nimport { SafeHtmlRenderer } from './SafeHtmlRenderer';\n\nconst LazyMarkdownRenderer = lazy(() =>\n import('@components/MarkDownRender').then((m) => ({\n default: m.MarkdownRenderer,\n }))\n);\n\n// Lazy-loaded so the Tiptap/Novel editor bundle is only fetched when a markdown\n// field is actually edited.\nconst LazyMarkdownEditor = lazy(() =>\n import('@components/MarkdownEditor').then((m) => ({\n default: m.MarkdownEditor,\n }))\n);\n\n// Renders children only after the accordion is first opened (mount-once pattern).\n// Prevents deeply nested sub-trees from mounting on initial render.\ntype CollapsibleEditorProps = TextEditorProps & { label: string };\nconst CollapsibleEditor = memo<CollapsibleEditorProps>(\n function CollapsibleEditor({ label, ...editorProps }) {\n const [hasOpened, setHasOpened] = useState(false);\n return (\n <Accordion\n header={label}\n label={label}\n onToggle={(isOpen) => {\n if (isOpen && !hasOpened) setHasOpened(true);\n }}\n >\n {hasOpened ? <TextEditor {...editorProps} /> : null}\n </Accordion>\n );\n }\n);\n\nexport const traceKeys: string[] = ['filePath', 'id', 'nodeType'];\n\ntype ContentEditorTextAreaProps = Omit<\n ContentEditorTextAreaPropsBase,\n 'onContentChange'\n> & {\n keyPath: KeyPath[];\n dictionary: Dictionary;\n};\n\nconst ContentEditorTextArea: FC<ContentEditorTextAreaProps> = ({\n keyPath,\n dictionary,\n ...props\n}) => {\n const { editedContent, addEditedContent } = useEditedContent();\n const configuration = useConfiguration();\n const { mutate: auditContentDeclarationField, isPending: isAuditing } =\n useAuditContentDeclarationField();\n\n return (\n <ContentEditorTextAreaBase\n variant=\"default\"\n onContentChange={(newValue) =>\n addEditedContent(dictionary.localId!, newValue, keyPath)\n }\n additionalButtons={\n <Button\n Icon={WandSparkles}\n label=\"Audit\"\n variant=\"hoverable\"\n size=\"icon-sm\"\n color=\"text\"\n className=\"cursor-pointer hover:scale-110\"\n isLoading={isAuditing}\n onClick={() => {\n auditContentDeclarationField(\n {\n fileContent: JSON.stringify({\n ...dictionary,\n ...(editedContent?.[dictionary.localId!] ?? {}),\n }),\n keyPath,\n locales: configuration?.internationalization.locales ?? [],\n aiOptions: {\n apiKey: configuration?.ai?.apiKey,\n model: configuration?.ai?.model,\n temperature: configuration?.ai?.temperature,\n },\n },\n {\n onSuccess: (response) => {\n if (!response?.data) return;\n\n try {\n const editedContent = response.data.fileContent as string;\n\n addEditedContent(\n dictionary.localId!,\n editedContent,\n keyPath\n );\n } catch (error) {\n console.error(error);\n }\n },\n }\n );\n }}\n />\n }\n {...props}\n />\n );\n};\n\ntype ContentEditorInputProps = Omit<\n ContentEditorInputPropsBase,\n 'onContentChange'\n> & {\n keyPath: KeyPath[];\n dictionary: Dictionary;\n};\n\nconst ContentEditorInput: FC<ContentEditorInputProps> = ({\n keyPath,\n dictionary,\n ...props\n}) => {\n const { addEditedContent } = useEditedContent();\n\n return (\n <ContentEditorInputBase\n variant=\"default\"\n onContentChange={(newValue) =>\n addEditedContent(dictionary.localId!, newValue, keyPath)\n }\n {...props}\n />\n );\n};\n\nconst toggleContent = [\n {\n content: 'False',\n value: false,\n },\n {\n content: 'True',\n value: true,\n },\n] as SwitchSelectorChoices<boolean>;\n\ntype ContentEditorToggleProps = SwitchSelectorProps & {\n dictionary: Dictionary;\n keyPath: KeyPath[];\n};\n\nconst ContentEditorToggle: FC<ContentEditorToggleProps> = ({\n dictionary,\n keyPath,\n ...props\n}) => {\n const { addEditedContent } = useEditedContent();\n\n return (\n <SwitchSelector\n choices={toggleContent}\n value={true}\n onChange={(value) =>\n addEditedContent(dictionary.localId!, value, keyPath)\n }\n color=\"text\"\n size=\"sm\"\n {...props}\n />\n );\n};\n\nexport type TextEditorProps = {\n dictionary: Dictionary;\n keyPath: KeyPath[];\n section: ContentNode;\n isDarkMode?: boolean;\n /**\n * Custom renderer for string leaves. Receives the leaf content and its full\n * key path so the renderer can write edits back to the right location.\n */\n renderSection?: (content: string, keyPath: KeyPath[]) => ReactNode;\n onContentChange?: (newValue: string) => void;\n};\n\nconst TranslationTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}: TextEditorProps) => {\n const { locale, defaultLocale } = useLocale();\n const { selectedLocales } = useLocaleSwitcherContent();\n\n const content: any = (section as TranslationContent<string>)[\n NodeTypes.TRANSLATION\n ];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {selectedLocales.map((translationKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-translation-${translationKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 w-full p-2 text-xs\">\n <td className=\"flex w-full\">\n {getLocaleName(translationKey, locale)}\n </td>\n </tr>\n <tr className=\"flex\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[translationKey] ??\n getEmptyNode(content[defaultLocale])\n }\n keyPath={[\n ...keyPath,\n { type: NodeTypes.TRANSLATION, key: translationKey },\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst EnumerationTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const { addEditedContent } = useEditedContent();\n const { addNewEnumeration, removeEnumeration } =\n useIntlayer('navigation-view');\n\n const content = (section as EnumerationContent<string>)[\n NodeTypes.ENUMERATION\n ];\n const firstKey = Object.keys(content)[0] as keyof typeof content;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {Object.keys(\n (section as EnumerationContent<ContentNode>)[NodeTypes.ENUMERATION]\n ).map((enumKey) => {\n const childrenKeyPath = [\n ...keyPath,\n { type: NodeTypes.ENUMERATION, key: enumKey },\n ] as KeyPath[];\n const uniqueKey = `${JSON.stringify(keyPath)}-enumeration-${enumKey}`;\n\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 w-full\">\n <td className=\"flex w-full\">\n <div className=\"flex flex-1\">\n <Button\n label={removeEnumeration.label.value}\n variant=\"hoverable\"\n size=\"sm\"\n color=\"error\"\n className=\"ml-auto text-neutral hover:text-error\"\n Icon={Trash}\n onClick={() =>\n addEditedContent(\n dictionary.localId!,\n undefined,\n childrenKeyPath\n )\n }\n >\n {removeEnumeration.text}\n </Button>\n </div>\n </td>\n </tr>\n <tr className=\"w-full p-2\">\n <td className=\"flex w-full\">\n <EnumKeyInput\n value={enumKey}\n onChange={(value) => {\n const preValueContent = (\n section as EnumerationContent<string>\n )[NodeTypes.ENUMERATION];\n\n const newValueContent = renameKey(\n preValueContent,\n enumKey as keyof typeof preValueContent,\n value\n );\n const newValue = {\n ...(section as EnumerationContent<string>),\n [NodeTypes.ENUMERATION]: newValueContent,\n };\n\n console.log('newValue', newValue);\n\n addEditedContent(\n dictionary.localId!,\n newValue,\n keyPath\n );\n }}\n />\n </td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditor\n section={\n content[enumKey as keyof typeof content] ??\n getEmptyNode(content[firstKey])\n }\n keyPath={childrenKeyPath}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n\n <Button\n label={addNewEnumeration.label.value}\n variant=\"hoverable\"\n color=\"neutral\"\n textAlign=\"left\"\n isFullWidth\n onClick={() =>\n addEditedContent(\n dictionary.localId!,\n getEmptyNode(content[firstKey]) ?? '',\n [...keyPath, { type: NodeTypes.ENUMERATION, key: 'unknown' }]\n )\n }\n Icon={Plus}\n className=\"m-2\"\n >\n {addNewEnumeration.text}\n </Button>\n </div>\n );\n};\n\nconst SelectTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const { addEditedContent } = useEditedContent();\n const { addNewSelectCase, removeSelectCase } = useIntlayer('navigation-view');\n\n const content = (section as SelectContent)[NodeTypes.SELECT] as Record<\n string,\n ContentNode\n >;\n const firstKey = Object.keys(content)[0];\n\n return (\n <div className=\"flex flex-col gap-2\">\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {Object.keys(content).map((caseKey) => {\n const childrenKeyPath = [\n ...keyPath,\n { type: NodeTypes.SELECT, key: caseKey },\n ] as KeyPath[];\n const uniqueKey = `${JSON.stringify(keyPath)}-select-${caseKey}`;\n\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 w-full\">\n <td className=\"flex w-full\">\n <div className=\"flex flex-1\">\n <Button\n label={removeSelectCase.label.value}\n variant=\"hoverable\"\n size=\"sm\"\n color=\"error\"\n className=\"ml-auto text-neutral hover:text-error\"\n Icon={Trash}\n onClick={() =>\n addEditedContent(\n dictionary.localId!,\n undefined,\n childrenKeyPath\n )\n }\n >\n {removeSelectCase.text}\n </Button>\n </div>\n </td>\n </tr>\n <tr className=\"w-full p-2\">\n <td className=\"flex w-full\">\n {/* Select cases are free-form strings, so the key is edited\n as plain text rather than through `EnumKeyInput`, which\n only builds numeric comparators. */}\n <ContentEditorInputBase\n aria-label=\"Edit case\"\n type=\"text\"\n variant=\"default\"\n onContentChange={(value) => {\n const newValue = {\n ...(section as SelectContent),\n [NodeTypes.SELECT]: renameKey(\n content,\n caseKey,\n String(value)\n ),\n };\n\n addEditedContent(\n dictionary.localId!,\n newValue as ContentNode,\n keyPath\n );\n }}\n >\n {caseKey}\n </ContentEditorInputBase>\n </td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditor\n section={\n content[caseKey] ?? getEmptyNode(content[firstKey])\n }\n keyPath={childrenKeyPath}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n\n <Button\n label={addNewSelectCase.label.value}\n variant=\"hoverable\"\n color=\"neutral\"\n textAlign=\"left\"\n isFullWidth\n onClick={() =>\n addEditedContent(\n dictionary.localId!,\n getEmptyNode(content[firstKey]) ?? '',\n [...keyPath, { type: NodeTypes.SELECT, key: 'newCase' }]\n )\n }\n Icon={Plus}\n className=\"m-2\"\n >\n {addNewSelectCase.text}\n </Button>\n </div>\n );\n};\n\nconst ConditionTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const content = (section as ConditionContent<string>)[NodeTypes.CONDITION];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {['true', 'false', 'fallback'].map((condKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-condition-${condKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 block w-full p-2 text-xs\">\n <td className=\"flex w-full\">{String(condKey)}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[condKey as keyof typeof content] ??\n getEmptyNode(content.true)\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.CONDITION,\n key: condKey,\n } as KeyPath,\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst GenderTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const content = (section as GenderContent<string>)[NodeTypes.GENDER];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {['male', 'female', 'fallback'].map((condKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-gender-${condKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 block w-full p-2 text-xs\">\n <td className=\"flex w-full\">{String(condKey)}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[condKey as keyof typeof content] ??\n getEmptyNode(content.male)\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.GENDER,\n key: condKey,\n } as KeyPath,\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst PLURAL_CATEGORIES = ['zero', 'one', 'two', 'few', 'many', 'other'];\n\nconst PluralTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const content = (section as PluralContent<string>)[NodeTypes.PLURAL];\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {PLURAL_CATEGORIES.map((pluralKey) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-plural-${pluralKey}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 block w-full p-2 text-xs\">\n <td className=\"flex w-full\">{pluralKey}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n content[pluralKey as keyof typeof content] ??\n getEmptyNode(content.other)\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.PLURAL,\n key: pluralKey,\n } as KeyPath,\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nconst ArrayTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const { addEditedContent } = useEditedContent();\n const { addNewElement, removeElement } = useIntlayer('navigation-view');\n\n return (\n <div className=\"flex flex-col gap-2\">\n <table className=\"w-full\">\n <tbody className=\"flex w-full flex-col gap-2\">\n {(section as unknown as ContentNode[]).map((subSection, index) => {\n const uniqueKey = `${JSON.stringify(keyPath)}-array-${index}`;\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 w-full p-2\">\n <td className=\"flex w-full\">\n <div className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"text-xs\">{String(index)}</span>\n <Button\n label={removeElement.label.value}\n variant=\"hoverable\"\n size=\"sm\"\n color=\"error\"\n className=\"ml-auto text-neutral hover:text-error\"\n onClick={() => {\n const newKeyPath: KeyPath[] = [\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: index, // Fixed: Use index instead of length\n },\n ];\n addEditedContent(\n dictionary.localId!,\n undefined,\n newKeyPath\n );\n }}\n Icon={Trash}\n >\n {removeElement.text}\n </Button>\n </div>\n </td>\n </tr>\n\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditorContainer\n section={\n subSection ??\n getEmptyNode((section as unknown as ContentNode[])[0])\n }\n keyPath={[\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: index,\n },\n ]}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n })}\n </tbody>\n </table>\n <Button\n label={addNewElement.label.value}\n variant=\"hoverable\"\n color=\"neutral\"\n textAlign=\"left\"\n isFullWidth\n onClick={() => {\n const newKeyPath: KeyPath[] = [\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: (section as unknown as ContentNode[]).length, // Keeps length for adding new items\n },\n ];\n addEditedContent(\n dictionary.localId!,\n getEmptyNode((section as unknown as ContentNode[])[0]) ?? '',\n newKeyPath,\n false\n );\n }}\n Icon={Plus}\n >\n {addNewElement.text}\n </Button>\n </div>\n );\n};\n\nconst ObjectTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n renderSection,\n}) => {\n const typedSection = section as unknown as Record<string, ContentNode>;\n const firstKey = Object.keys(typedSection)[0] as keyof typeof section;\n\n return (\n <table className=\"w-full\">\n <tbody className=\"flex flex-col gap-2\">\n {Object.keys(typedSection).map((key) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.OBJECT, key },\n ];\n const subSection =\n typedSection[key as keyof typeof section] ??\n getEmptyNode(typedSection[firstKey]);\n const uniqueKey = `${JSON.stringify(keyPath)}-object-${key}`;\n // Collapse any object/array (typed or plain) — only true primitives render inline.\n // getIsEditableSection can't be used here: it inspects getNodeChildren(), which for\n // translation nodes returns the first locale value (a string), causing translation\n // subtrees to be mistakenly treated as leaves and mounted all at once.\n const isLeaf = subSection === null || typeof subSection !== 'object';\n\n if (isLeaf) {\n return (\n <Fragment key={uniqueKey}>\n <tr className=\"mt-2 p-2 text-xs\">\n <td className=\"flex w-full\">{String(key)}</td>\n </tr>\n <tr className=\"block w-full\">\n <td className=\"flex w-full\">\n <TextEditor\n section={subSection}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n </Fragment>\n );\n }\n\n return (\n <tr\n key={uniqueKey}\n className=\"block w-full border-neutral/10 border-t py-1\"\n >\n <td className=\"flex w-full\">\n <CollapsibleEditor\n label={camelCaseToSentence(key)}\n section={subSection}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={renderSection}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nenum MarkdownViewMode {\n Edit,\n Raw,\n Preview,\n}\n\nenum HtmlViewMode {\n Edit,\n Preview,\n}\n\nconst HtmlTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n}) => {\n const [mode, setMode] = useState(HtmlViewMode.Edit);\n const toggleContent = [\n {\n content: 'Edit',\n value: HtmlViewMode.Edit,\n },\n {\n content: 'Preview',\n value: HtmlViewMode.Preview,\n },\n ] as SwitchSelectorChoices<HtmlViewMode>;\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.HTML }];\n\n const content = (section as HTMLContent<ContentNode>)[\n NodeTypes.HTML\n ] as ContentNode;\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <SwitchSelector\n choices={toggleContent}\n value={mode}\n onChange={setMode}\n color=\"text\"\n size=\"sm\"\n className=\"ml-auto\"\n />\n\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={\n mode === HtmlViewMode.Preview\n ? (rawContent) => <SafeHtmlRenderer rawContent={rawContent} />\n : undefined\n }\n />\n </div>\n );\n};\n\nconst MarkdownTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n dictionary,\n isDarkMode,\n}) => {\n const [mode, setMode] = useState(MarkdownViewMode.Edit);\n const { addEditedContent } = useEditedContent();\n const toggleContent = [\n {\n content: 'Edit',\n value: MarkdownViewMode.Edit,\n },\n {\n content: 'Raw',\n value: MarkdownViewMode.Raw,\n },\n {\n content: 'Preview',\n value: MarkdownViewMode.Preview,\n },\n ] as SwitchSelectorChoices<MarkdownViewMode>;\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.MARKDOWN }];\n\n const content = ((section as MarkdownContent<ContentNode>)[\n NodeTypes.MARKDOWN\n ] ?? '') as ContentNode;\n\n /**\n * WYSIWYG editor rendered on every markdown string leaf. When the markdown\n * node wraps another node (e.g. `md(t({ ... }))`), the recursive editor\n * walks the inner structure and calls this renderer once per string leaf,\n * so each locale/branch gets its own rich-text surface writing back to its\n * own key path.\n */\n const renderMarkdownEditor = (\n leafContent: string,\n leafKeyPath: KeyPath[]\n ): ReactNode => (\n <Suspense fallback={<Loader />}>\n <LazyMarkdownEditor\n key={JSON.stringify(leafKeyPath)}\n defaultValue={leafContent}\n onChange={(markdown) =>\n addEditedContent(dictionary.localId!, markdown, leafKeyPath)\n }\n />\n </Suspense>\n );\n\n const renderMarkdownPreview = (leafContent: string): ReactNode => (\n <Suspense fallback={<Loader />}>\n <LazyMarkdownRenderer isDarkMode={isDarkMode}>\n {leafContent}\n </LazyMarkdownRenderer>\n </Suspense>\n );\n\n const renderSectionByMode: TextEditorProps['renderSection'] =\n mode === MarkdownViewMode.Edit\n ? renderMarkdownEditor\n : mode === MarkdownViewMode.Preview\n ? renderMarkdownPreview\n : undefined;\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <SwitchSelector\n choices={toggleContent}\n value={mode}\n onChange={setMode}\n color=\"text\"\n size=\"sm\"\n className=\"ml-auto\"\n />\n\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n dictionary={dictionary}\n renderSection={renderSectionByMode}\n />\n </div>\n );\n};\n\nconst InsertionTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n ...props\n}) => {\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.INSERTION }];\n\n const content = (section as InsertionContent<ContentNode>)[\n NodeTypes.INSERTION\n ];\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n {...props}\n />\n </div>\n );\n};\n\nconst FileTextEditor: FC<TextEditorProps> = ({\n section,\n keyPath,\n ...props\n}) => {\n const childKeyPath: KeyPath[] = [...keyPath, { type: NodeTypes.FILE }];\n\n const fileUrl = (section as FileContent)[NodeTypes.FILE];\n const { content } = section as FileContent;\n\n return (\n <div className=\"flex w-full flex-col justify-center gap-6 p-2\">\n <span className=\"text-neutral text-sm\">{fileUrl} </span>\n <TextEditorContainer\n section={content}\n keyPath={childKeyPath}\n {...props}\n />\n </div>\n );\n};\n\nconst NestedTextEditor: FC<TextEditorProps> = ({\n keyPath,\n dictionary,\n renderSection,\n section,\n ...props\n}) => {\n const { addEditedContent } = useEditedContent();\n\n const content = (section as any)[NodeTypes.NESTED];\n const childrenKeyPath = [...keyPath, { type: NodeTypes.NESTED }] as KeyPath[];\n\n return (\n <div className=\"flex w-full flex-col gap-4 p-2\">\n <Label>Dictionary key</Label>\n <ContentEditorInputBase\n aria-label=\"Edit field\"\n type=\"text\"\n variant=\"default\"\n {...props}\n onContentChange={(newValue) => {\n addEditedContent(\n dictionary.localId!,\n {\n ...content,\n dictionaryKey: String(newValue),\n },\n childrenKeyPath\n );\n }}\n >\n {content.dictionaryKey ?? ''}\n </ContentEditorInputBase>\n\n <Label>Path (optional)</Label>\n <ContentEditorInputBase\n aria-label=\"Edit field\"\n type=\"text\"\n variant=\"default\"\n {...props}\n onContentChange={(newValue) => {\n addEditedContent(\n dictionary.localId!,\n {\n ...content,\n path: newValue !== '' ? newValue : undefined,\n },\n childrenKeyPath\n );\n }}\n >\n {content.path ?? ''}\n </ContentEditorInputBase>\n </div>\n );\n};\n\nexport const TextEditor = memo<TextEditorProps>(function TextEditor({\n section,\n keyPath,\n dictionary,\n renderSection,\n isDarkMode,\n}) {\n const { tsxNotEditable } = useIntlayer('navigation-view');\n const nodeType = getNodeType(section);\n\n if (nodeType === NodeTypes.REACT_NODE) {\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <span>(React Node)</span>\n <span className=\"flex text-neutral text-xs\">{tsxNotEditable}</span>\n </div>\n );\n }\n\n if (nodeType === NodeTypes.NESTED) {\n return (\n <NestedTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.TRANSLATION) {\n return (\n <TranslationTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.ENUMERATION) {\n return (\n <EnumerationTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.CONDITION) {\n return (\n <ConditionTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.SELECT) {\n return (\n <SelectTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.GENDER) {\n return (\n <GenderTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.PLURAL) {\n return (\n <PluralTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.INSERTION) {\n return (\n <InsertionTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.MARKDOWN) {\n return (\n <MarkdownTextEditor\n dictionary={dictionary}\n keyPath={keyPath}\n section={section}\n isDarkMode={isDarkMode}\n />\n );\n }\n\n if (nodeType === NodeTypes.HTML) {\n return (\n <HtmlTextEditor\n dictionary={dictionary}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.FILE) {\n return (\n <FileTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n return (\n <ArrayTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.OBJECT) {\n return (\n <ObjectTextEditor\n dictionary={dictionary}\n renderSection={renderSection}\n keyPath={keyPath}\n section={section}\n />\n );\n }\n\n if (nodeType === NodeTypes.NUMBER) {\n return (\n <div className=\"w-full p-2\">\n <ContentEditorInput\n dictionary={dictionary}\n keyPath={keyPath}\n type=\"number\"\n aria-label=\"Edit field\"\n >\n {section as number}\n </ContentEditorInput>\n </div>\n );\n }\n\n if (nodeType === NodeTypes.TEXT) {\n return (\n <div className=\"w-full p-2\">\n {typeof renderSection === 'function' ? (\n renderSection(section as string, keyPath)\n ) : (\n <ContentEditorTextArea\n variant=\"default\"\n aria-label=\"Edit field\"\n keyPath={keyPath}\n dictionary={dictionary}\n >\n {section as string}\n </ContentEditorTextArea>\n )}\n </div>\n );\n }\n\n if (nodeType === NodeTypes.BOOLEAN) {\n return (\n <div className=\"w-full p-2\">\n <ContentEditorToggle\n dictionary={dictionary}\n keyPath={keyPath}\n value={section as boolean}\n />\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-2\">\n Error. Format not supported.\n {JSON.stringify(section, null, 2)}\n {JSON.stringify(keyPath, null, 2)}\n NodeType : {nodeType}\n </div>\n );\n});\n\nexport const TextEditorContainer = memo<TextEditorProps>(\n function TextEditorContainer(props) {\n return (\n <Container\n border\n background=\"none\"\n className=\"top-6 flex h-full flex-1 flex-col gap-6 overflow-hidden p-2 md:sticky\"\n roundedSize=\"2xl\"\n >\n <TextEditor {...props} />\n </Container>\n );\n }\n);\n"],"mappings":"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"}
@@ -170,6 +170,90 @@ const navigationViewContent = {
170
170
  uk: "Додати новий перелік"
171
171
  })
172
172
  },
173
+ addNewSelectCase: {
174
+ label: t({
175
+ en: "Click to add a select case",
176
+ "en-GB": "Click to add a select case",
177
+ fr: "Cliquez pour ajouter un cas de sélection",
178
+ es: "Haga clic para agregar un caso de selección",
179
+ de: "Klicken Sie, um einen Auswahlfall hinzuzufügen",
180
+ ja: "選択ケースを追加するにはクリック",
181
+ ko: "선택 케이스를 추가하려면 클릭하세요",
182
+ zh: "点击添加选择分支",
183
+ it: "Clicca per aggiungere un caso di selezione",
184
+ pt: "Clique para adicionar um caso de seleção",
185
+ hi: "चयन केस जोड़ने के लिए क्लिक करें",
186
+ ar: "انقر لإضافة حالة تحديد",
187
+ ru: "Нажмите, чтобы добавить вариант выбора",
188
+ tr: "Seçim durumu eklemek için tıklayın",
189
+ pl: "Kliknij, aby dodać przypadek wyboru",
190
+ id: "Klik untuk menambah kasus pilihan",
191
+ vi: "Nhấp để thêm trường hợp lựa chọn",
192
+ uk: "Натисніть, щоб додати варіант вибору"
193
+ }),
194
+ text: t({
195
+ en: "Add new case",
196
+ "en-GB": "Add new case",
197
+ fr: "Ajouter un nouveau cas",
198
+ es: "Agregar nuevo caso",
199
+ de: "Neuen Fall hinzufügen",
200
+ ja: "新しいケースを追加",
201
+ ko: "새 케이스 추가",
202
+ zh: "添加新分支",
203
+ it: "Aggiungi nuovo caso",
204
+ pt: "Adicionar novo caso",
205
+ hi: "नया केस जोड़ें",
206
+ ar: "أضف حالة جديدة",
207
+ ru: "Добавить новый вариант",
208
+ tr: "Yeni durum ekle",
209
+ pl: "Dodaj nowy przypadek",
210
+ id: "Tambahkan kasus baru",
211
+ vi: "Thêm trường hợp mới",
212
+ uk: "Додати новий варіант"
213
+ })
214
+ },
215
+ removeSelectCase: {
216
+ label: t({
217
+ en: "Click to remove the select case",
218
+ "en-GB": "Click to remove the select case",
219
+ fr: "Cliquez pour supprimer le cas de sélection",
220
+ es: "Haga clic para eliminar el caso de selección",
221
+ de: "Klicken Sie, um den Auswahlfall zu entfernen",
222
+ ja: "選択ケースを削除するにはクリック",
223
+ ko: "선택 케이스를 제거하려면 클릭하세요",
224
+ zh: "点击删除选择分支",
225
+ it: "Clicca per rimuovere il caso di selezione",
226
+ pt: "Clique para remover o caso de seleção",
227
+ hi: "चयन केस निकालने के लिए क्लिक करें",
228
+ ar: "انقر لإزالة حالة التحديد",
229
+ ru: "Нажмите, чтобы удалить вариант выбора",
230
+ tr: "Seçim durumunu kaldırmak için tıklayın",
231
+ pl: "Kliknij, aby usunąć przypadek wyboru",
232
+ id: "Klik untuk menghapus kasus pilihan",
233
+ vi: "Nhấp để xóa trường hợp lựa chọn",
234
+ uk: "Натисніть, щоб видалити варіант вибору"
235
+ }),
236
+ text: t({
237
+ en: "Remove case",
238
+ "en-GB": "Remove case",
239
+ fr: "Supprimer le cas",
240
+ es: "Eliminar caso",
241
+ de: "Fall entfernen",
242
+ ja: "ケースを削除",
243
+ ko: "케이스 제거",
244
+ zh: "删除分支",
245
+ it: "Rimuovi caso",
246
+ pt: "Remover caso",
247
+ hi: "केस निकालें",
248
+ ar: "إزالة الحالة",
249
+ ru: "Удалить вариант",
250
+ tr: "Durumu kaldır",
251
+ pl: "Usuń przypadek",
252
+ id: "Hapus kasus",
253
+ vi: "Xóa trường hợp",
254
+ uk: "Видалити варіант"
255
+ })
256
+ },
173
257
  removeEnumeration: {
174
258
  label: t({
175
259
  en: "Click to remove enumeration",
@@ -1 +1 @@
1
- {"version":3,"file":"navigationViewNode.content.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.ts"],"sourcesContent":["import { type Dictionary, t } from 'intlayer';\n\nexport const navigationViewContent = {\n key: 'navigation-view',\n content: {\n tsxNotEditable: t({\n en: 'React node is not editable',\n 'en-GB': 'React node is not editable',\n fr: 'Node React non éditable',\n es: 'Nodo React no editable',\n de: 'React-Knoten ist nicht bearbeitbar',\n ja: '編集できないReactノードです',\n ko: '편집할 수 없는 React 노드입니다',\n zh: '不可编辑的 React 节点',\n it: 'Node React non modificabile',\n pt: 'Nó React não editável',\n hi: 'सम्पादित न करने योग्य React नोड',\n ar: 'عقدة React غير قابلة للتحرير',\n ru: 'React-узел не редактируемый',\n tr: 'React düğümü düzenlenemez',\n pl: 'Węzeł React nie jest edytowalny',\n id: 'React node tidak dapat diedit',\n vi: 'React node không thể chỉnh sửa',\n uk: 'Елемент React не редагується',\n }),\n goToField: {\n label: t({\n en: 'Go to field',\n 'en-GB': 'Go to field',\n fr: 'Aller au champ',\n es: 'Ir al campo',\n de: 'Zum Feld gehen',\n ja: 'フィールドに移動',\n ko: '필드로 이동',\n zh: '转到字段',\n it: 'Vai al campo',\n pt: 'Ir para o campo',\n hi: 'फ़ील्ड पर जाएं',\n ar: 'اذهب إلى الحقل',\n ru: 'Перейти к полю',\n tr: 'Alana git',\n pl: 'Przejdź do pola',\n id: 'Buka field',\n vi: 'Đi tới trường',\n uk: 'Перейти до поля',\n }),\n },\n addNewElement: {\n label: t({\n en: 'Click to add element',\n 'en-GB': 'Click to add element',\n fr: 'Cliquez pour ajouter un élément',\n es: 'Haga clic para agregar un elemento',\n de: 'Klicken Sie, um ein Element hinzuzufügen',\n ja: '要素を追加するにはクリック',\n ko: '요소를 추가하려면 클릭하세요',\n zh: '点击添加元素',\n it: 'Clicca per aggiungere un elemento',\n pt: 'Clique para adicionar um elemento',\n hi: 'तत्व जोड़ने के लिए क्लिक करें',\n ar: 'انقر لإضافة عنصر',\n ru: 'Нажмите, чтобы добавить элемент',\n tr: 'Eleman eklemek için tıklayın',\n pl: 'Kliknij, aby dodać element',\n id: 'Klik untuk menambah elemen',\n vi: 'Nhấp để thêm phần tử',\n uk: 'Натисніть, щоб додати елемент',\n }),\n text: t({\n en: 'Add new element',\n 'en-GB': 'Add new element',\n fr: 'Ajouter un nouvel élément',\n es: 'Agregar nuevo elemento',\n de: 'Neues Element hinzufügen',\n ja: '新しい要素を追加',\n ko: '새 요소 추가',\n zh: '添加新元素',\n it: 'Aggiungi nuovo elemento',\n pt: 'Adicionar novo elemento',\n hi: 'नया तत्व जोड़ें',\n ar: 'أضف عنصرًا جديدًا',\n ru: 'Добавить новый элемент',\n tr: 'Yeni eleman ekle',\n pl: 'Dodaj nowy element',\n id: 'Tambahkan elemen baru',\n vi: 'Thêm phần tử mới',\n uk: 'Додати новий елемент',\n }),\n },\n removeElement: {\n label: t({\n en: 'Click to remove element',\n 'en-GB': 'Click to remove element',\n fr: 'Cliquez pour supprimer un élément',\n es: 'Haga clic para eliminar un elemento',\n de: 'Klicken Sie, um ein Element zu entfernen',\n ja: '要素を削除するにはクリック',\n ko: '요소를 제거하려면 클릭하세요',\n zh: '点击删除元素',\n it: 'Clicca per rimuovere un elemento',\n pt: 'Clique para remover um elemento',\n hi: 'तत्व निकालने के लिए क्लिक करें',\n ar: 'انقر لإزالة عنصر',\n ru: 'Нажмите, чтобы удалить элемент',\n tr: 'Elemanı kaldırmak için tıklayın',\n pl: 'Kliknij, aby usunąć element',\n id: 'Klik untuk menghapus elemen',\n vi: 'Nhấp để xóa phần tử',\n uk: 'Натисніть, щоб видалити елемент',\n }),\n text: t({\n en: 'Remove element',\n 'en-GB': 'Remove element',\n fr: 'Supprimer l’élément',\n es: 'Eliminar elemento',\n de: 'Element entfernen',\n ja: '要素を削除',\n ko: '요소 제거',\n zh: '删除元素',\n it: 'Rimuovi elemento',\n pt: 'Remover elemento',\n hi: 'तत्व निकालें',\n ar: 'إزالة عنصر',\n ru: 'Удалить элемент',\n tr: 'Elemanı kaldır',\n pl: 'Usuń element',\n id: 'Hapus elemen',\n vi: 'Xóa phần tử',\n uk: 'Видалити елемент',\n }),\n },\n addNewEnumeration: {\n label: t({\n en: 'Click to add enumeration',\n 'en-GB': 'Click to add enumeration',\n fr: 'Cliquez pour ajouter une énumération',\n es: 'Haga clic para agregar una enumeración',\n de: 'Klicken Sie, um eine Aufzählung hinzuzufügen',\n ja: '列挙を追加するにはクリック',\n ko: '열거를 추가하려면 클릭하세요',\n zh: '点击添加枚举',\n it: 'Clicca per aggiungere un enumerazione',\n pt: 'Clique para adicionar uma enumeração',\n hi: 'सूची जोड़ने के लिए क्लिक करें',\n ar: 'انقر لإضافة تعداد',\n ru: 'Нажмите, чтобы добавить перечисление',\n tr: 'Numaralandırma eklemek için tıklayın',\n pl: 'Kliknij, aby dodać enumerację',\n id: 'Klik untuk menambah enumerasi',\n vi: 'Nhấp để thêm enumeration',\n uk: 'Натисніть, щоб додати перелік',\n }),\n text: t({\n en: 'Add new enumeration',\n 'en-GB': 'Add new enumeration',\n fr: 'Ajouter une nouvelle énumération',\n es: 'Agregar nueva enumeración',\n de: 'Neue Aufzählung hinzufügen',\n ja: '新しい列挙を追加',\n ko: '새 목록 추가',\n zh: '添加新枚举',\n it: 'Aggiungi nuova enumerazione',\n pt: 'Adicionar nova enumeração',\n hi: 'नया सूची जोड़ें',\n ar: 'أضف تعدادًا جديدًا',\n ru: 'Добавить новое перечисление',\n tr: 'Yeni numaralandırma ekle',\n pl: 'Dodaj nową enumerację',\n id: 'Tambahkan enumerasi baru',\n vi: 'Thêm enumeration mới',\n uk: 'Додати новий перелік',\n }),\n },\n removeEnumeration: {\n label: t({\n en: 'Click to remove enumeration',\n 'en-GB': 'Click to remove enumeration',\n fr: 'Cliquez pour supprimer une énumération',\n es: 'Haga clic para eliminar una enumeración',\n de: 'Klicken Sie, um eine Aufzählung zu entfernen',\n ja: '列挙を削除するにはクリック',\n ko: '목록을 제거하려면 클릭하세요',\n zh: '点击删除枚举',\n it: \"Clicca per rimuovere un'enumerazione\",\n pt: 'Clique para remover uma enumeração',\n hi: 'सूची निकालने के लिए क्लिक करें',\n ar: 'انقر لإزالة تعداد',\n ru: 'Нажмите, чтобы удалить перечисление',\n tr: 'Numaralandırmayı kaldırmak için tıklayın',\n pl: 'Kliknij, aby usunąć enumerację',\n id: 'Klik untuk menghapus enumerasi',\n vi: 'Nhấp để xóa enumeration',\n uk: 'Натисніть, щоб видалити перелік',\n }),\n text: t({\n en: 'Remove enumeration',\n 'en-GB': 'Remove enumeration',\n fr: 'Supprimer l’énumération',\n es: 'Eliminar enumeración',\n de: 'Aufzählung entfernen',\n ja: '列挙を削除',\n ko: '목록 제거',\n zh: '删除枚举',\n it: 'Rimuovi enumerazione',\n pt: 'Remover enumeração',\n hi: 'सूची निकालें',\n ar: 'إزالة تعداد',\n ru: 'Удалить перечисление',\n tr: 'Numaralandırmayı kaldır',\n pl: 'Usuń enumerację',\n id: 'Hapus enumerasi',\n vi: 'Xóa enumeration',\n uk: 'Видалити перелік',\n }),\n },\n },\n title: 'Navigation view content',\n description:\n 'Content declarations used for UI interactions within the navigation view of the Dictionary Field Editor. Includes labels and helper texts for adding or removing elements, enumerations, and conditions.',\n tags: ['editor UI', 'form navigation', 'dictionary editor'],\n} satisfies Dictionary;\n\nexport default navigationViewContent;\n"],"mappings":"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"}
1
+ {"version":3,"file":"navigationViewNode.content.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.ts"],"sourcesContent":["import { type Dictionary, t } from 'intlayer';\n\nexport const navigationViewContent = {\n key: 'navigation-view',\n content: {\n tsxNotEditable: t({\n en: 'React node is not editable',\n 'en-GB': 'React node is not editable',\n fr: 'Node React non éditable',\n es: 'Nodo React no editable',\n de: 'React-Knoten ist nicht bearbeitbar',\n ja: '編集できないReactノードです',\n ko: '편집할 수 없는 React 노드입니다',\n zh: '不可编辑的 React 节点',\n it: 'Node React non modificabile',\n pt: 'Nó React não editável',\n hi: 'सम्पादित न करने योग्य React नोड',\n ar: 'عقدة React غير قابلة للتحرير',\n ru: 'React-узел не редактируемый',\n tr: 'React düğümü düzenlenemez',\n pl: 'Węzeł React nie jest edytowalny',\n id: 'React node tidak dapat diedit',\n vi: 'React node không thể chỉnh sửa',\n uk: 'Елемент React не редагується',\n }),\n goToField: {\n label: t({\n en: 'Go to field',\n 'en-GB': 'Go to field',\n fr: 'Aller au champ',\n es: 'Ir al campo',\n de: 'Zum Feld gehen',\n ja: 'フィールドに移動',\n ko: '필드로 이동',\n zh: '转到字段',\n it: 'Vai al campo',\n pt: 'Ir para o campo',\n hi: 'फ़ील्ड पर जाएं',\n ar: 'اذهب إلى الحقل',\n ru: 'Перейти к полю',\n tr: 'Alana git',\n pl: 'Przejdź do pola',\n id: 'Buka field',\n vi: 'Đi tới trường',\n uk: 'Перейти до поля',\n }),\n },\n addNewElement: {\n label: t({\n en: 'Click to add element',\n 'en-GB': 'Click to add element',\n fr: 'Cliquez pour ajouter un élément',\n es: 'Haga clic para agregar un elemento',\n de: 'Klicken Sie, um ein Element hinzuzufügen',\n ja: '要素を追加するにはクリック',\n ko: '요소를 추가하려면 클릭하세요',\n zh: '点击添加元素',\n it: 'Clicca per aggiungere un elemento',\n pt: 'Clique para adicionar um elemento',\n hi: 'तत्व जोड़ने के लिए क्लिक करें',\n ar: 'انقر لإضافة عنصر',\n ru: 'Нажмите, чтобы добавить элемент',\n tr: 'Eleman eklemek için tıklayın',\n pl: 'Kliknij, aby dodać element',\n id: 'Klik untuk menambah elemen',\n vi: 'Nhấp để thêm phần tử',\n uk: 'Натисніть, щоб додати елемент',\n }),\n text: t({\n en: 'Add new element',\n 'en-GB': 'Add new element',\n fr: 'Ajouter un nouvel élément',\n es: 'Agregar nuevo elemento',\n de: 'Neues Element hinzufügen',\n ja: '新しい要素を追加',\n ko: '새 요소 추가',\n zh: '添加新元素',\n it: 'Aggiungi nuovo elemento',\n pt: 'Adicionar novo elemento',\n hi: 'नया तत्व जोड़ें',\n ar: 'أضف عنصرًا جديدًا',\n ru: 'Добавить новый элемент',\n tr: 'Yeni eleman ekle',\n pl: 'Dodaj nowy element',\n id: 'Tambahkan elemen baru',\n vi: 'Thêm phần tử mới',\n uk: 'Додати новий елемент',\n }),\n },\n removeElement: {\n label: t({\n en: 'Click to remove element',\n 'en-GB': 'Click to remove element',\n fr: 'Cliquez pour supprimer un élément',\n es: 'Haga clic para eliminar un elemento',\n de: 'Klicken Sie, um ein Element zu entfernen',\n ja: '要素を削除するにはクリック',\n ko: '요소를 제거하려면 클릭하세요',\n zh: '点击删除元素',\n it: 'Clicca per rimuovere un elemento',\n pt: 'Clique para remover um elemento',\n hi: 'तत्व निकालने के लिए क्लिक करें',\n ar: 'انقر لإزالة عنصر',\n ru: 'Нажмите, чтобы удалить элемент',\n tr: 'Elemanı kaldırmak için tıklayın',\n pl: 'Kliknij, aby usunąć element',\n id: 'Klik untuk menghapus elemen',\n vi: 'Nhấp để xóa phần tử',\n uk: 'Натисніть, щоб видалити елемент',\n }),\n text: t({\n en: 'Remove element',\n 'en-GB': 'Remove element',\n fr: 'Supprimer l’élément',\n es: 'Eliminar elemento',\n de: 'Element entfernen',\n ja: '要素を削除',\n ko: '요소 제거',\n zh: '删除元素',\n it: 'Rimuovi elemento',\n pt: 'Remover elemento',\n hi: 'तत्व निकालें',\n ar: 'إزالة عنصر',\n ru: 'Удалить элемент',\n tr: 'Elemanı kaldır',\n pl: 'Usuń element',\n id: 'Hapus elemen',\n vi: 'Xóa phần tử',\n uk: 'Видалити елемент',\n }),\n },\n addNewEnumeration: {\n label: t({\n en: 'Click to add enumeration',\n 'en-GB': 'Click to add enumeration',\n fr: 'Cliquez pour ajouter une énumération',\n es: 'Haga clic para agregar una enumeración',\n de: 'Klicken Sie, um eine Aufzählung hinzuzufügen',\n ja: '列挙を追加するにはクリック',\n ko: '열거를 추가하려면 클릭하세요',\n zh: '点击添加枚举',\n it: 'Clicca per aggiungere un enumerazione',\n pt: 'Clique para adicionar uma enumeração',\n hi: 'सूची जोड़ने के लिए क्लिक करें',\n ar: 'انقر لإضافة تعداد',\n ru: 'Нажмите, чтобы добавить перечисление',\n tr: 'Numaralandırma eklemek için tıklayın',\n pl: 'Kliknij, aby dodać enumerację',\n id: 'Klik untuk menambah enumerasi',\n vi: 'Nhấp để thêm enumeration',\n uk: 'Натисніть, щоб додати перелік',\n }),\n text: t({\n en: 'Add new enumeration',\n 'en-GB': 'Add new enumeration',\n fr: 'Ajouter une nouvelle énumération',\n es: 'Agregar nueva enumeración',\n de: 'Neue Aufzählung hinzufügen',\n ja: '新しい列挙を追加',\n ko: '새 목록 추가',\n zh: '添加新枚举',\n it: 'Aggiungi nuova enumerazione',\n pt: 'Adicionar nova enumeração',\n hi: 'नया सूची जोड़ें',\n ar: 'أضف تعدادًا جديدًا',\n ru: 'Добавить новое перечисление',\n tr: 'Yeni numaralandırma ekle',\n pl: 'Dodaj nową enumerację',\n id: 'Tambahkan enumerasi baru',\n vi: 'Thêm enumeration mới',\n uk: 'Додати новий перелік',\n }),\n },\n addNewSelectCase: {\n label: t({\n en: 'Click to add a select case',\n 'en-GB': 'Click to add a select case',\n fr: 'Cliquez pour ajouter un cas de sélection',\n es: 'Haga clic para agregar un caso de selección',\n de: 'Klicken Sie, um einen Auswahlfall hinzuzufügen',\n ja: '選択ケースを追加するにはクリック',\n ko: '선택 케이스를 추가하려면 클릭하세요',\n zh: '点击添加选择分支',\n it: 'Clicca per aggiungere un caso di selezione',\n pt: 'Clique para adicionar um caso de seleção',\n hi: 'चयन केस जोड़ने के लिए क्लिक करें',\n ar: 'انقر لإضافة حالة تحديد',\n ru: 'Нажмите, чтобы добавить вариант выбора',\n tr: 'Seçim durumu eklemek için tıklayın',\n pl: 'Kliknij, aby dodać przypadek wyboru',\n id: 'Klik untuk menambah kasus pilihan',\n vi: 'Nhấp để thêm trường hợp lựa chọn',\n uk: 'Натисніть, щоб додати варіант вибору',\n }),\n text: t({\n en: 'Add new case',\n 'en-GB': 'Add new case',\n fr: 'Ajouter un nouveau cas',\n es: 'Agregar nuevo caso',\n de: 'Neuen Fall hinzufügen',\n ja: '新しいケースを追加',\n ko: '새 케이스 추가',\n zh: '添加新分支',\n it: 'Aggiungi nuovo caso',\n pt: 'Adicionar novo caso',\n hi: 'नया केस जोड़ें',\n ar: 'أضف حالة جديدة',\n ru: 'Добавить новый вариант',\n tr: 'Yeni durum ekle',\n pl: 'Dodaj nowy przypadek',\n id: 'Tambahkan kasus baru',\n vi: 'Thêm trường hợp mới',\n uk: 'Додати новий варіант',\n }),\n },\n removeSelectCase: {\n label: t({\n en: 'Click to remove the select case',\n 'en-GB': 'Click to remove the select case',\n fr: 'Cliquez pour supprimer le cas de sélection',\n es: 'Haga clic para eliminar el caso de selección',\n de: 'Klicken Sie, um den Auswahlfall zu entfernen',\n ja: '選択ケースを削除するにはクリック',\n ko: '선택 케이스를 제거하려면 클릭하세요',\n zh: '点击删除选择分支',\n it: 'Clicca per rimuovere il caso di selezione',\n pt: 'Clique para remover o caso de seleção',\n hi: 'चयन केस निकालने के लिए क्लिक करें',\n ar: 'انقر لإزالة حالة التحديد',\n ru: 'Нажмите, чтобы удалить вариант выбора',\n tr: 'Seçim durumunu kaldırmak için tıklayın',\n pl: 'Kliknij, aby usunąć przypadek wyboru',\n id: 'Klik untuk menghapus kasus pilihan',\n vi: 'Nhấp để xóa trường hợp lựa chọn',\n uk: 'Натисніть, щоб видалити варіант вибору',\n }),\n text: t({\n en: 'Remove case',\n 'en-GB': 'Remove case',\n fr: 'Supprimer le cas',\n es: 'Eliminar caso',\n de: 'Fall entfernen',\n ja: 'ケースを削除',\n ko: '케이스 제거',\n zh: '删除分支',\n it: 'Rimuovi caso',\n pt: 'Remover caso',\n hi: 'केस निकालें',\n ar: 'إزالة الحالة',\n ru: 'Удалить вариант',\n tr: 'Durumu kaldır',\n pl: 'Usuń przypadek',\n id: 'Hapus kasus',\n vi: 'Xóa trường hợp',\n uk: 'Видалити варіант',\n }),\n },\n removeEnumeration: {\n label: t({\n en: 'Click to remove enumeration',\n 'en-GB': 'Click to remove enumeration',\n fr: 'Cliquez pour supprimer une énumération',\n es: 'Haga clic para eliminar una enumeración',\n de: 'Klicken Sie, um eine Aufzählung zu entfernen',\n ja: '列挙を削除するにはクリック',\n ko: '목록을 제거하려면 클릭하세요',\n zh: '点击删除枚举',\n it: \"Clicca per rimuovere un'enumerazione\",\n pt: 'Clique para remover uma enumeração',\n hi: 'सूची निकालने के लिए क्लिक करें',\n ar: 'انقر لإزالة تعداد',\n ru: 'Нажмите, чтобы удалить перечисление',\n tr: 'Numaralandırmayı kaldırmak için tıklayın',\n pl: 'Kliknij, aby usunąć enumerację',\n id: 'Klik untuk menghapus enumerasi',\n vi: 'Nhấp để xóa enumeration',\n uk: 'Натисніть, щоб видалити перелік',\n }),\n text: t({\n en: 'Remove enumeration',\n 'en-GB': 'Remove enumeration',\n fr: 'Supprimer l’énumération',\n es: 'Eliminar enumeración',\n de: 'Aufzählung entfernen',\n ja: '列挙を削除',\n ko: '목록 제거',\n zh: '删除枚举',\n it: 'Rimuovi enumerazione',\n pt: 'Remover enumeração',\n hi: 'सूची निकालें',\n ar: 'إزالة تعداد',\n ru: 'Удалить перечисление',\n tr: 'Numaralandırmayı kaldır',\n pl: 'Usuń enumerację',\n id: 'Hapus enumerasi',\n vi: 'Xóa enumeration',\n uk: 'Видалити перелік',\n }),\n },\n },\n title: 'Navigation view content',\n description:\n 'Content declarations used for UI interactions within the navigation view of the Dictionary Field Editor. Includes labels and helper texts for adding or removing elements, enumerations, and conditions.',\n tags: ['editor UI', 'form navigation', 'dictionary editor'],\n} satisfies Dictionary;\n\nexport default navigationViewContent;\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import * as NodeTypes from "@intlayer/types/nodeType";
9
9
 
10
10
  //#region src/components/DictionaryFieldEditor/NodeTypeSelector.tsx
11
11
  const NodeTypeSelector = ({ section, onValueChange: onValueChangeProp }) => {
12
- const { multilingual, text, number, boolean, node, array, enumeration, plural, triggerPlaceHolder, nest, gender, condition, markdown, insertion, reactNode, file } = useIntlayer("node-type-selector");
12
+ const { multilingual, text, number, boolean, node, array, enumeration, plural, triggerPlaceHolder, nest, gender, select, condition, markdown, insertion, reactNode, file } = useIntlayer("node-type-selector");
13
13
  const [keyType, setKeyType] = useState(getNodeType(section));
14
14
  const onValueChange = (keyType) => {
15
15
  setKeyType(keyType);
@@ -55,6 +55,10 @@ const NodeTypeSelector = ({ section, onValueChange: onValueChangeProp }) => {
55
55
  value: NodeTypes.GENDER,
56
56
  children: gender
57
57
  }),
58
+ /* @__PURE__ */ jsx(Select.Item, {
59
+ value: NodeTypes.SELECT,
60
+ children: select
61
+ }),
58
62
  /* @__PURE__ */ jsx(Select.Item, {
59
63
  value: NodeTypes.INSERTION,
60
64
  children: insertion
@@ -1 +1 @@
1
- {"version":3,"file":"NodeTypeSelector.mjs","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/NodeTypeSelector.tsx"],"sourcesContent":["'use client';\n\nimport { getNodeType } from '@intlayer/core/dictionaryManipulator';\nimport type { ContentNode } from '@intlayer/types/dictionary';\nimport type { NodeType } from '@intlayer/types/nodeType';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { type FC, useState } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\n\ntype NodeTypeSelectorProps = {\n section: ContentNode;\n onValueChange: (keyType: NodeType) => void;\n};\n\nexport const NodeTypeSelector: FC<NodeTypeSelectorProps> = ({\n section,\n onValueChange: onValueChangeProp,\n}) => {\n const {\n multilingual,\n text,\n number,\n boolean,\n node,\n array,\n enumeration,\n plural,\n triggerPlaceHolder,\n nest,\n gender,\n condition,\n markdown,\n insertion,\n reactNode,\n file,\n } = useIntlayer('node-type-selector');\n const nodeType = getNodeType(section);\n const [keyType, setKeyType] = useState<NodeType>(nodeType);\n\n const onValueChange = (keyType: NodeType) => {\n setKeyType(keyType);\n onValueChangeProp(keyType);\n };\n\n return (\n <Select value={keyType} onValueChange={onValueChange}>\n <Select.Trigger>\n <Select.Value placeholder={triggerPlaceHolder} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value={NodeTypes.TRANSLATION}>{multilingual}</Select.Item>\n <Select.Item value={NodeTypes.TEXT}>{text}</Select.Item>\n <Select.Item value={NodeTypes.NUMBER}>{number}</Select.Item>\n <Select.Item value={NodeTypes.BOOLEAN}>{boolean}</Select.Item>\n <Select.Item value={NodeTypes.OBJECT}>{node}</Select.Item>\n <Select.Item value={NodeTypes.ARRAY}>{array}</Select.Item>\n <Select.Item value={NodeTypes.ENUMERATION}>{enumeration}</Select.Item>\n <Select.Item value={NodeTypes.PLURAL}>{plural}</Select.Item>\n <Select.Item value={NodeTypes.GENDER}>{gender}</Select.Item>\n <Select.Item value={NodeTypes.INSERTION}>{insertion}</Select.Item>\n <Select.Item value={NodeTypes.MARKDOWN}>{markdown}</Select.Item>\n <Select.Item value={NodeTypes.NESTED}>{nest}</Select.Item>\n <Select.Item value={NodeTypes.CONDITION}>{condition}</Select.Item>\n <Select.Item value={NodeTypes.REACT_NODE} disabled>\n {reactNode}\n </Select.Item>\n <Select.Item value={NodeTypes.FILE}>{file}</Select.Item>\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;;;AAeA,MAAa,oBAA+C,EAC1D,SACA,eAAe,wBACX;CACJ,MAAM,EACJ,cACA,MACA,QACA,SACA,MACA,OACA,aACA,QACA,oBACA,MACA,QACA,WACA,UACA,WACA,WACA,SACE,YAAY,oBAAoB;CAEpC,MAAM,CAAC,SAAS,cAAc,SADb,YAAY,OAC2B,CAAC;CAEzD,MAAM,iBAAiB,YAAsB;EAC3C,WAAW,OAAO;EAClB,kBAAkB,OAAO;CAC3B;CAEA,OACE,qBAAC,QAAD;EAAQ,OAAO;EAAwB;YAAvC,CACE,oBAAC,OAAO,SAAR,YACE,oBAAC,OAAO,OAAR,EAAc,aAAa,mBAAqB,GAClC,IAChB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;GAA0B;GACtE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;GAAkB;GACvD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAoB;GAC3D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAU;GAAqB;GAC7D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAkB;GACzD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAQ;GAAmB;GACzD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;GAAyB;GACrE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAoB;GAC3D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAoB;GAC3D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;GAAuB;GACjE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAW;GAAsB;GAC/D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAkB;GACzD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;GAAuB;GACjE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;IAAY;cACvC;GACU;GACb,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;GAAkB;EACzC,IACV;;AAEZ"}
1
+ {"version":3,"file":"NodeTypeSelector.mjs","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/NodeTypeSelector.tsx"],"sourcesContent":["'use client';\n\nimport { getNodeType } from '@intlayer/core/dictionaryManipulator';\nimport type { ContentNode } from '@intlayer/types/dictionary';\nimport type { NodeType } from '@intlayer/types/nodeType';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { type FC, useState } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { Select } from '../Select';\n\ntype NodeTypeSelectorProps = {\n section: ContentNode;\n onValueChange: (keyType: NodeType) => void;\n};\n\nexport const NodeTypeSelector: FC<NodeTypeSelectorProps> = ({\n section,\n onValueChange: onValueChangeProp,\n}) => {\n const {\n multilingual,\n text,\n number,\n boolean,\n node,\n array,\n enumeration,\n plural,\n triggerPlaceHolder,\n nest,\n gender,\n select,\n condition,\n markdown,\n insertion,\n reactNode,\n file,\n } = useIntlayer('node-type-selector');\n const nodeType = getNodeType(section);\n const [keyType, setKeyType] = useState<NodeType>(nodeType);\n\n const onValueChange = (keyType: NodeType) => {\n setKeyType(keyType);\n onValueChangeProp(keyType);\n };\n\n return (\n <Select value={keyType} onValueChange={onValueChange}>\n <Select.Trigger>\n <Select.Value placeholder={triggerPlaceHolder} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value={NodeTypes.TRANSLATION}>{multilingual}</Select.Item>\n <Select.Item value={NodeTypes.TEXT}>{text}</Select.Item>\n <Select.Item value={NodeTypes.NUMBER}>{number}</Select.Item>\n <Select.Item value={NodeTypes.BOOLEAN}>{boolean}</Select.Item>\n <Select.Item value={NodeTypes.OBJECT}>{node}</Select.Item>\n <Select.Item value={NodeTypes.ARRAY}>{array}</Select.Item>\n <Select.Item value={NodeTypes.ENUMERATION}>{enumeration}</Select.Item>\n <Select.Item value={NodeTypes.PLURAL}>{plural}</Select.Item>\n <Select.Item value={NodeTypes.GENDER}>{gender}</Select.Item>\n <Select.Item value={NodeTypes.SELECT}>{select}</Select.Item>\n <Select.Item value={NodeTypes.INSERTION}>{insertion}</Select.Item>\n <Select.Item value={NodeTypes.MARKDOWN}>{markdown}</Select.Item>\n <Select.Item value={NodeTypes.NESTED}>{nest}</Select.Item>\n <Select.Item value={NodeTypes.CONDITION}>{condition}</Select.Item>\n <Select.Item value={NodeTypes.REACT_NODE} disabled>\n {reactNode}\n </Select.Item>\n <Select.Item value={NodeTypes.FILE}>{file}</Select.Item>\n </Select.Content>\n </Select>\n );\n};\n"],"mappings":";;;;;;;;;;AAeA,MAAa,oBAA+C,EAC1D,SACA,eAAe,wBACX;CACJ,MAAM,EACJ,cACA,MACA,QACA,SACA,MACA,OACA,aACA,QACA,oBACA,MACA,QACA,QACA,WACA,UACA,WACA,WACA,SACE,YAAY,oBAAoB;CAEpC,MAAM,CAAC,SAAS,cAAc,SADb,YAAY,OAC2B,CAAC;CAEzD,MAAM,iBAAiB,YAAsB;EAC3C,WAAW,OAAO;EAClB,kBAAkB,OAAO;CAC3B;CAEA,OACE,qBAAC,QAAD;EAAQ,OAAO;EAAwB;YAAvC,CACE,oBAAC,OAAO,SAAR,YACE,oBAAC,OAAO,OAAR,EAAc,aAAa,mBAAqB,GAClC,IAChB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;GAA0B;GACtE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;GAAkB;GACvD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAoB;GAC3D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAU;GAAqB;GAC7D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAkB;GACzD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAQ;GAAmB;GACzD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;GAAyB;GACrE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAoB;GAC3D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAoB;GAC3D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAoB;GAC3D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;GAAuB;GACjE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAW;GAAsB;GAC/D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;GAAkB;GACzD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;GAAuB;GACjE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;IAAY;cACvC;GACU;GACb,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;GAAkB;EACzC,IACV;;AAEZ"}
@@ -21,7 +21,7 @@ const NodeTypeView = ({ section, dictionaryLocalId, keyPath, onNodeTypeChange: o
21
21
  const onNodeTypeChange = (content) => {
22
22
  onNodeTypeChangeProp(getDefaultNode(nodeType, locales, content));
23
23
  };
24
- if (nodeType === NodeTypes.TRANSLATION || nodeType === NodeTypes.CONDITION || nodeType === NodeTypes.GENDER || nodeType === NodeTypes.ENUMERATION || nodeType === NodeTypes.PLURAL) {
24
+ if (nodeType === NodeTypes.TRANSLATION || nodeType === NodeTypes.CONDITION || nodeType === NodeTypes.GENDER || nodeType === NodeTypes.SELECT || nodeType === NodeTypes.ENUMERATION || nodeType === NodeTypes.PLURAL) {
25
25
  const firstKey = Object.keys(section[nodeType])[0];
26
26
  const childrenKeyPath = [...keyPath, {
27
27
  type: nodeType,
@@ -1 +1 @@
1
- {"version":3,"file":"StructureView.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/StructureView/StructureView.tsx"],"sourcesContent":["'use client';\n\nimport { Button } from '@components/Button';\nimport { Container } from '@components/Container';\nimport { EditableFieldInput } from '@components/EditableField';\nimport { camelCaseToSentence } from '@intlayer/config/client';\nimport {\n getDefaultNode,\n getNodeChildren,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport { isSameKeyPath } from '@intlayer/core/utils';\nimport {\n useConfiguration,\n useEditedContentActions,\n useFocusUnmergedDictionary,\n} from '@intlayer/editor-react';\nimport type { LocalDictionaryId, TypedNode } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { ContentNode } from 'intlayer';\nimport { Plus, Trash } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { NodeTypeSelector } from '../NodeTypeSelector';\n\ntype NodeTypeViewProps = {\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n onNodeTypeChange: (content?: ContentNode) => void;\n};\n\nconst NodeTypeView: FC<NodeTypeViewProps> = ({\n section,\n dictionaryLocalId,\n keyPath,\n onNodeTypeChange: onNodeTypeChangeProp,\n}) => {\n const locales = useConfiguration()?.internationalization?.locales ?? [];\n const nodeType = getNodeType(section);\n const children = getNodeChildren(section);\n\n const onNodeTypeChange = (content?: ContentNode) => {\n const transformedContent = getDefaultNode(\n nodeType,\n locales,\n content\n ) as ContentNode;\n\n onNodeTypeChangeProp(transformedContent);\n };\n\n if (\n nodeType === NodeTypes.TRANSLATION ||\n nodeType === NodeTypes.CONDITION ||\n nodeType === NodeTypes.GENDER ||\n nodeType === NodeTypes.ENUMERATION ||\n nodeType === NodeTypes.PLURAL\n ) {\n const firstKey = Object.keys(\n (section as unknown as TypedNode)[nodeType as keyof typeof section]\n )[0];\n const childrenKeyPath = [\n ...keyPath,\n { type: nodeType, key: firstKey },\n ] as KeyPath[];\n\n return (\n <div className=\"flex w-full flex-col gap-1\">\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(\n getDefaultNode(nodeType, locales) as ContentNode\n )\n }\n />\n\n <NodeTypeView\n section={children}\n keyPath={childrenKeyPath}\n dictionaryLocalId={dictionaryLocalId}\n onNodeTypeChange={onNodeTypeChange}\n />\n </div>\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n const childrenKeyPath = [...keyPath, { type: nodeType, key: 0 } as KeyPath];\n return (\n <div className=\"flex w-full flex-col gap-1\">\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(\n getDefaultNode(nodeType, locales) as ContentNode\n )\n }\n />\n\n <NodeTypeView\n section={children}\n keyPath={childrenKeyPath}\n dictionaryLocalId={dictionaryLocalId}\n onNodeTypeChange={onNodeTypeChange}\n />\n </div>\n );\n }\n\n if (nodeType === NodeTypes.OBJECT) {\n return (\n <>\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(\n getDefaultNode(nodeType, locales) as ContentNode\n )\n }\n />\n <div className=\"mt-6 ml-10\">\n <StructureView\n keyPath={keyPath}\n section={section}\n dictionaryLocalId={dictionaryLocalId}\n />\n </div>\n </>\n );\n }\n\n return (\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(getDefaultNode(nodeType, locales) as ContentNode)\n }\n />\n );\n};\n\ntype NodeWrapperProps = {\n sectionKey?: string;\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n};\n\nexport const NodeView: FC<NodeWrapperProps> = ({\n sectionKey,\n section,\n keyPath,\n dictionaryLocalId,\n}) => {\n const { focusedContent, setFocusedContentKeyPath } =\n useFocusUnmergedDictionary();\n const { renameEditedContent, addEditedContent } = useEditedContentActions();\n\n const { titleInput, deleteButton } = useIntlayer('structure-view');\n\n const handleRenameNodeKey = (keyName: string) => {\n renameEditedContent(dictionaryLocalId, keyName, keyPath);\n const prevKeyPath: KeyPath[] = keyPath.slice(0, -1);\n const lastKeyPath: KeyPath = keyPath[keyPath.length - 1]!;\n const newKeyPath: KeyPath[] = [\n ...prevKeyPath,\n { ...lastKeyPath, key: keyName } as KeyPath,\n ];\n setFocusedContentKeyPath(newKeyPath);\n };\n\n return (\n <Container\n transparency=\"xl\"\n roundedSize=\"2xl\"\n className=\"w-full min-w-80 gap-2 overflow-auto px-5 py-2\"\n border\n borderColor=\"text\"\n background=\"none\"\n aria-selected={isSameKeyPath(keyPath, focusedContent?.keyPath ?? [])}\n onClick={() => setFocusedContentKeyPath(keyPath)}\n >\n <div className=\"flex w-full flex-col items-start justify-between gap-3\">\n {typeof sectionKey === 'string' && (\n <div className=\"w-full\">\n <div className=\"flex w-full items-center justify-between gap-10\">\n <EditableFieldInput\n name=\"key\"\n aria-label=\"Key\"\n placeholder={titleInput.placeholder.value}\n defaultValue={sectionKey}\n onSave={(value) => handleRenameNodeKey(value)}\n variant=\"invisible\"\n />\n <Button\n label={deleteButton.label.value}\n variant=\"hoverable\"\n size=\"icon-sm\"\n color=\"text\"\n className=\"translate-x-2\"\n Icon={Trash}\n onClick={() => {\n addEditedContent(dictionaryLocalId, undefined, keyPath);\n\n const parentKeyPath: KeyPath[] = keyPath.slice(0, -1);\n setFocusedContentKeyPath(parentKeyPath);\n }}\n />\n </div>\n\n <span className=\"ml-3 text-neutral text-sm\">\n ( {camelCaseToSentence(sectionKey)} )\n </span>\n </div>\n )}\n <NodeTypeView\n keyPath={keyPath}\n dictionaryLocalId={dictionaryLocalId}\n section={section}\n onNodeTypeChange={(content) => {\n addEditedContent(dictionaryLocalId, content, keyPath);\n }}\n />\n </div>\n </Container>\n );\n};\n\ntype ObjectViewProps = {\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n};\n\nexport const ObjectView: FC<ObjectViewProps> = ({\n section,\n keyPath,\n dictionaryLocalId,\n}) => {\n const { addNodeButton } = useIntlayer('structure-view');\n const { setFocusedContentKeyPath } = useFocusUnmergedDictionary();\n const { addEditedContent } = useEditedContentActions();\n\n if (!section || typeof section !== 'object') {\n return <div>Not an object</div>;\n }\n\n return (\n <div className=\"flex flex-col gap-2 overflow-y-auto\">\n <ul className=\"mr-auto flex flex-col gap-4\">\n {Object.keys(section).map((key) => (\n <li\n key={`${JSON.stringify(keyPath)}-object-${key}`}\n className=\"flex w-full\"\n >\n <NodeView\n sectionKey={key}\n section={section?.[key as keyof typeof section]}\n keyPath={[...keyPath, { type: NodeTypes.OBJECT, key }]}\n dictionaryLocalId={dictionaryLocalId}\n />\n </li>\n ))}\n </ul>\n <Button\n label={addNodeButton.label.value}\n variant=\"hoverable\"\n size=\"md\"\n color=\"text\"\n Icon={Plus}\n className=\"flex-1\"\n onClick={() => {\n const newKey = 'newKey';\n const newKeyPath = [\n ...keyPath,\n { type: NodeTypes.OBJECT, key: newKey },\n ] as KeyPath[];\n addEditedContent(dictionaryLocalId, '', newKeyPath);\n setFocusedContentKeyPath(newKeyPath);\n }}\n >\n {addNodeButton.text}\n </Button>\n </div>\n );\n};\n\ntype StructureViewProps = {\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n};\n\nexport const StructureView: FC<StructureViewProps> = ({\n section,\n keyPath,\n dictionaryLocalId,\n}) => {\n if (\n !section ||\n typeof section !== 'object' ||\n typeof section.nodeType === 'string'\n ) {\n return (\n <NodeView\n sectionKey=\"content\"\n section={section}\n keyPath={keyPath}\n dictionaryLocalId={dictionaryLocalId}\n />\n );\n }\n\n return (\n <ObjectView\n section={section}\n keyPath={keyPath}\n dictionaryLocalId={dictionaryLocalId}\n />\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"StructureView.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/StructureView/StructureView.tsx"],"sourcesContent":["'use client';\n\nimport { Button } from '@components/Button';\nimport { Container } from '@components/Container';\nimport { EditableFieldInput } from '@components/EditableField';\nimport { camelCaseToSentence } from '@intlayer/config/client';\nimport {\n getDefaultNode,\n getNodeChildren,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport { isSameKeyPath } from '@intlayer/core/utils';\nimport {\n useConfiguration,\n useEditedContentActions,\n useFocusUnmergedDictionary,\n} from '@intlayer/editor-react';\nimport type { LocalDictionaryId, TypedNode } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { ContentNode } from 'intlayer';\nimport { Plus, Trash } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { NodeTypeSelector } from '../NodeTypeSelector';\n\ntype NodeTypeViewProps = {\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n onNodeTypeChange: (content?: ContentNode) => void;\n};\n\nconst NodeTypeView: FC<NodeTypeViewProps> = ({\n section,\n dictionaryLocalId,\n keyPath,\n onNodeTypeChange: onNodeTypeChangeProp,\n}) => {\n const locales = useConfiguration()?.internationalization?.locales ?? [];\n const nodeType = getNodeType(section);\n const children = getNodeChildren(section);\n\n const onNodeTypeChange = (content?: ContentNode) => {\n const transformedContent = getDefaultNode(\n nodeType,\n locales,\n content\n ) as ContentNode;\n\n onNodeTypeChangeProp(transformedContent);\n };\n\n if (\n nodeType === NodeTypes.TRANSLATION ||\n nodeType === NodeTypes.CONDITION ||\n nodeType === NodeTypes.GENDER ||\n nodeType === NodeTypes.SELECT ||\n nodeType === NodeTypes.ENUMERATION ||\n nodeType === NodeTypes.PLURAL\n ) {\n const firstKey = Object.keys(\n (section as unknown as TypedNode)[nodeType as keyof typeof section]\n )[0];\n const childrenKeyPath = [\n ...keyPath,\n { type: nodeType, key: firstKey },\n ] as KeyPath[];\n\n return (\n <div className=\"flex w-full flex-col gap-1\">\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(\n getDefaultNode(nodeType, locales) as ContentNode\n )\n }\n />\n\n <NodeTypeView\n section={children}\n keyPath={childrenKeyPath}\n dictionaryLocalId={dictionaryLocalId}\n onNodeTypeChange={onNodeTypeChange}\n />\n </div>\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n const childrenKeyPath = [...keyPath, { type: nodeType, key: 0 } as KeyPath];\n return (\n <div className=\"flex w-full flex-col gap-1\">\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(\n getDefaultNode(nodeType, locales) as ContentNode\n )\n }\n />\n\n <NodeTypeView\n section={children}\n keyPath={childrenKeyPath}\n dictionaryLocalId={dictionaryLocalId}\n onNodeTypeChange={onNodeTypeChange}\n />\n </div>\n );\n }\n\n if (nodeType === NodeTypes.OBJECT) {\n return (\n <>\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(\n getDefaultNode(nodeType, locales) as ContentNode\n )\n }\n />\n <div className=\"mt-6 ml-10\">\n <StructureView\n keyPath={keyPath}\n section={section}\n dictionaryLocalId={dictionaryLocalId}\n />\n </div>\n </>\n );\n }\n\n return (\n <NodeTypeSelector\n section={section}\n onValueChange={(nodeType) =>\n onNodeTypeChangeProp(getDefaultNode(nodeType, locales) as ContentNode)\n }\n />\n );\n};\n\ntype NodeWrapperProps = {\n sectionKey?: string;\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n};\n\nexport const NodeView: FC<NodeWrapperProps> = ({\n sectionKey,\n section,\n keyPath,\n dictionaryLocalId,\n}) => {\n const { focusedContent, setFocusedContentKeyPath } =\n useFocusUnmergedDictionary();\n const { renameEditedContent, addEditedContent } = useEditedContentActions();\n\n const { titleInput, deleteButton } = useIntlayer('structure-view');\n\n const handleRenameNodeKey = (keyName: string) => {\n renameEditedContent(dictionaryLocalId, keyName, keyPath);\n const prevKeyPath: KeyPath[] = keyPath.slice(0, -1);\n const lastKeyPath: KeyPath = keyPath[keyPath.length - 1]!;\n const newKeyPath: KeyPath[] = [\n ...prevKeyPath,\n { ...lastKeyPath, key: keyName } as KeyPath,\n ];\n setFocusedContentKeyPath(newKeyPath);\n };\n\n return (\n <Container\n transparency=\"xl\"\n roundedSize=\"2xl\"\n className=\"w-full min-w-80 gap-2 overflow-auto px-5 py-2\"\n border\n borderColor=\"text\"\n background=\"none\"\n aria-selected={isSameKeyPath(keyPath, focusedContent?.keyPath ?? [])}\n onClick={() => setFocusedContentKeyPath(keyPath)}\n >\n <div className=\"flex w-full flex-col items-start justify-between gap-3\">\n {typeof sectionKey === 'string' && (\n <div className=\"w-full\">\n <div className=\"flex w-full items-center justify-between gap-10\">\n <EditableFieldInput\n name=\"key\"\n aria-label=\"Key\"\n placeholder={titleInput.placeholder.value}\n defaultValue={sectionKey}\n onSave={(value) => handleRenameNodeKey(value)}\n variant=\"invisible\"\n />\n <Button\n label={deleteButton.label.value}\n variant=\"hoverable\"\n size=\"icon-sm\"\n color=\"text\"\n className=\"translate-x-2\"\n Icon={Trash}\n onClick={() => {\n addEditedContent(dictionaryLocalId, undefined, keyPath);\n\n const parentKeyPath: KeyPath[] = keyPath.slice(0, -1);\n setFocusedContentKeyPath(parentKeyPath);\n }}\n />\n </div>\n\n <span className=\"ml-3 text-neutral text-sm\">\n ( {camelCaseToSentence(sectionKey)} )\n </span>\n </div>\n )}\n <NodeTypeView\n keyPath={keyPath}\n dictionaryLocalId={dictionaryLocalId}\n section={section}\n onNodeTypeChange={(content) => {\n addEditedContent(dictionaryLocalId, content, keyPath);\n }}\n />\n </div>\n </Container>\n );\n};\n\ntype ObjectViewProps = {\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n};\n\nexport const ObjectView: FC<ObjectViewProps> = ({\n section,\n keyPath,\n dictionaryLocalId,\n}) => {\n const { addNodeButton } = useIntlayer('structure-view');\n const { setFocusedContentKeyPath } = useFocusUnmergedDictionary();\n const { addEditedContent } = useEditedContentActions();\n\n if (!section || typeof section !== 'object') {\n return <div>Not an object</div>;\n }\n\n return (\n <div className=\"flex flex-col gap-2 overflow-y-auto\">\n <ul className=\"mr-auto flex flex-col gap-4\">\n {Object.keys(section).map((key) => (\n <li\n key={`${JSON.stringify(keyPath)}-object-${key}`}\n className=\"flex w-full\"\n >\n <NodeView\n sectionKey={key}\n section={section?.[key as keyof typeof section]}\n keyPath={[...keyPath, { type: NodeTypes.OBJECT, key }]}\n dictionaryLocalId={dictionaryLocalId}\n />\n </li>\n ))}\n </ul>\n <Button\n label={addNodeButton.label.value}\n variant=\"hoverable\"\n size=\"md\"\n color=\"text\"\n Icon={Plus}\n className=\"flex-1\"\n onClick={() => {\n const newKey = 'newKey';\n const newKeyPath = [\n ...keyPath,\n { type: NodeTypes.OBJECT, key: newKey },\n ] as KeyPath[];\n addEditedContent(dictionaryLocalId, '', newKeyPath);\n setFocusedContentKeyPath(newKeyPath);\n }}\n >\n {addNodeButton.text}\n </Button>\n </div>\n );\n};\n\ntype StructureViewProps = {\n dictionaryLocalId: LocalDictionaryId;\n keyPath: KeyPath[];\n section: ContentNode;\n};\n\nexport const StructureView: FC<StructureViewProps> = ({\n section,\n keyPath,\n dictionaryLocalId,\n}) => {\n if (\n !section ||\n typeof section !== 'object' ||\n typeof section.nodeType === 'string'\n ) {\n return (\n <NodeView\n sectionKey=\"content\"\n section={section}\n keyPath={keyPath}\n dictionaryLocalId={dictionaryLocalId}\n />\n );\n }\n\n return (\n <ObjectView\n section={section}\n keyPath={keyPath}\n dictionaryLocalId={dictionaryLocalId}\n />\n );\n};\n"],"mappings":"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"}
@@ -204,6 +204,26 @@ const nodeTypeSelectorContent = {
204
204
  vi: "Giới tính",
205
205
  uk: "Стать"
206
206
  }),
207
+ select: t({
208
+ en: "Select",
209
+ "en-GB": "Select",
210
+ fr: "Sélection",
211
+ es: "Selección",
212
+ de: "Auswahl",
213
+ ja: "選択",
214
+ ko: "선택",
215
+ zh: "选择",
216
+ it: "Selezione",
217
+ pt: "Seleção",
218
+ hi: "चयन",
219
+ ar: "تحديد",
220
+ ru: "Выбор",
221
+ tr: "Seçim",
222
+ pl: "Wybór",
223
+ id: "Pilihan",
224
+ vi: "Lựa chọn",
225
+ uk: "Вибір"
226
+ }),
207
227
  nest: t({
208
228
  en: "Nesting",
209
229
  "en-GB": "Nesting",
@@ -1 +1 @@
1
- {"version":3,"file":"nodeTypeSelector.content.mjs","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/nodeTypeSelector.content.ts"],"sourcesContent":["import { type Dictionary, t } from 'intlayer';\n\nexport const nodeTypeSelectorContent = {\n key: 'node-type-selector',\n content: {\n triggerPlaceHolder: t({\n en: 'Node type',\n 'en-GB': 'Node type',\n fr: 'Type du Nœud',\n es: 'Tipo del nodo',\n de: 'Knotentyp',\n ja: 'ノードタイプ',\n ko: '노드 유형',\n zh: '节点类型',\n it: 'Tipo di nodo',\n pt: 'Tipo de nó',\n hi: 'नोड प्रकार',\n ar: 'نوع العقدة',\n ru: 'Тип узла',\n tr: 'Düğüm türü',\n pl: 'Typ węzła',\n id: 'Tipe Node',\n vi: 'Kiểu node',\n uk: 'Тип вузла',\n }),\n multilingual: t({\n en: 'Multilingual content',\n 'en-GB': 'Multilingual content',\n fr: 'Contenu Multilingue',\n es: 'Contenido multilingüe',\n de: 'Mehrsprachiger Inhalt',\n ja: '複数言語コンテンツ',\n ko: '다중 언어 콘텐츠',\n zh: '多语言内容',\n it: 'Contenuto multilingue',\n pt: 'Conteúdo multilíngue',\n hi: 'बहुभाषी सामग्री',\n ar: 'محتوى متعدد اللغات',\n ru: 'Многоязычный контент',\n tr: 'Çok dilli içerik',\n pl: 'Treść wielojęzyczna',\n id: 'Konten multibahasa',\n vi: 'Nội dung đa ngôn ngữ',\n uk: 'Багатомовний вміст',\n }),\n text: t({\n en: 'Text',\n 'en-GB': 'Text',\n fr: 'Texte',\n es: 'Texto',\n de: 'Text',\n ja: 'テキスト',\n ko: '텍스트',\n zh: '文本',\n it: 'Testo',\n pt: 'Texto',\n hi: 'पाठ',\n ar: 'نص',\n ru: 'Текст',\n tr: 'Metin',\n pl: 'Tekst',\n id: 'Teks',\n vi: 'Văn bản',\n uk: 'Текст',\n }),\n number: t({\n en: 'Number',\n 'en-GB': 'Number',\n fr: 'Nombre',\n es: 'Número',\n de: 'Zahl',\n ja: '数字',\n ko: '숫자',\n zh: '数字',\n it: 'Numero',\n pt: 'Número',\n hi: 'संख्या',\n ar: 'رقم',\n ru: 'Число',\n tr: 'Sayı',\n pl: 'Liczba',\n id: 'Angka',\n vi: 'Số',\n uk: 'Число',\n }),\n boolean: t({\n en: 'Boolean',\n 'en-GB': 'Boolean',\n fr: 'Booléen',\n es: 'Booleano',\n de: 'Bool',\n ja: 'ブール',\n ko: '불리언',\n zh: '布尔',\n it: 'Booleano',\n pt: 'Booleano',\n hi: 'बूलियन',\n ar: 'منطقي',\n ru: 'Булево',\n tr: 'Boolean',\n pl: 'Wartość logiczna',\n id: 'Boolean',\n vi: 'Boolean',\n uk: 'Булеве',\n }),\n node: t({\n en: 'Object',\n 'en-GB': 'Object',\n fr: 'Objet',\n es: 'Objeto',\n de: 'Objekt',\n ja: 'オブジェクト',\n ko: '객체',\n zh: '对象',\n it: 'Oggetto',\n pt: 'Objeto',\n hi: 'ऑब्जेक्ट',\n ar: 'كائن',\n ru: 'Объект',\n tr: 'Nesne',\n pl: 'Obiekt',\n id: 'Object',\n vi: 'Đối tượng',\n uk: \"Об'єкт\",\n }),\n array: t({\n en: 'Array',\n 'en-GB': 'Array',\n fr: 'Tableau',\n es: 'Arreglo',\n de: 'Array',\n ja: '配列',\n ko: '배열',\n zh: '数组',\n it: 'Array',\n pt: 'Array',\n hi: 'ऐरे',\n ar: 'مصفوفة',\n ru: 'Массив',\n tr: 'Dizi',\n pl: 'Tablica',\n id: 'Array',\n vi: 'Mảng',\n uk: 'Масив',\n }),\n enumeration: t({\n en: 'Enumeration',\n 'en-GB': 'Enumeration',\n fr: 'Énumération',\n es: 'Enumeración',\n de: 'Enumeration',\n ja: '列挙',\n ko: '열거',\n zh: '枚举',\n it: 'Enumerazione',\n pt: 'Enumeração',\n hi: 'गणना',\n ar: 'تعداد',\n ru: 'Перечисление',\n tr: 'Numaralandırma',\n pl: 'Wyliczenie',\n id: 'Enumeration',\n vi: 'Kiểu liệt kê',\n uk: 'Перерахування',\n }),\n plural: t({\n en: 'Plural',\n 'en-GB': 'Plural',\n fr: 'Pluriel',\n es: 'Plural',\n de: 'Plural',\n ja: '複数形',\n ko: '복수',\n zh: '复数',\n it: 'Plurale',\n pt: 'Plural',\n hi: 'बहुवचन',\n ar: 'جمع',\n ru: 'Множественное число',\n tr: 'Çoğul',\n pl: 'Liczba mnoga',\n id: 'Jamak',\n vi: 'Số nhiều',\n uk: 'Множина',\n }),\n gender: t({\n en: 'Gender',\n 'en-GB': 'Gender',\n fr: 'Genre',\n es: 'Género',\n de: 'Geschlecht',\n ja: '性別',\n ko: '성별',\n zh: '性别',\n it: 'Genere',\n pt: 'Gênero',\n hi: 'लिंग',\n ar: 'جنس',\n ru: 'Пол',\n tr: 'Cins',\n pl: 'Płeć',\n id: 'Gender',\n vi: 'Giới tính',\n uk: 'Стать',\n }),\n nest: t({\n en: 'Nesting',\n 'en-GB': 'Nesting',\n fr: 'Imbriquation',\n es: 'Anidación',\n de: 'Vererbung',\n ja: 'ネスト',\n ko: '중첩',\n zh: '嵌套',\n it: 'Nidificazione',\n pt: 'Nido',\n hi: 'नेस्टेंस',\n ar: 'مستوى',\n ru: 'Вложенность',\n tr: 'İç içe geçme',\n pl: 'Zagnieżdżanie',\n id: 'Nesting',\n vi: 'Lồng nhau',\n uk: 'Вкладеність',\n }),\n insertion: t({\n en: 'Insertion',\n 'en-GB': 'Insertion',\n fr: 'Insertion',\n es: 'Inserción',\n de: 'Einfügung',\n ja: '挿入',\n ko: '삽입',\n zh: '插入',\n it: 'Inserimento',\n pt: 'Inserção',\n hi: 'सम्मिलन',\n ar: 'إدراج',\n ru: 'Вставка',\n tr: 'Ekleme',\n pl: 'Wstawianie',\n id: 'Insertion',\n vi: 'Chèn',\n uk: 'Вставка',\n }),\n condition: t({\n en: 'Condition',\n 'en-GB': 'Condition',\n fr: 'Condition',\n es: 'Condición',\n de: 'Bedingung',\n ja: '条件',\n ko: '조건',\n zh: '条件',\n it: 'Condizione',\n pt: 'Condição',\n hi: 'शर्त्ता',\n ar: 'شرط',\n ru: 'Условие',\n tr: 'Koşul',\n pl: 'Warunek',\n id: 'Condition',\n vi: 'Điều kiện',\n uk: 'Умова',\n }),\n file: t({\n en: 'File',\n 'en-GB': 'File',\n fr: 'Fichier',\n es: 'Archivo',\n de: 'Datei',\n ja: 'ファイル',\n ko: '파일',\n zh: '文件',\n it: 'File',\n pt: 'Arquivo',\n hi: 'फ़ाइल',\n ar: 'ملف',\n ru: 'Файл',\n tr: 'Dosya',\n pl: 'Plik',\n id: 'File',\n vi: 'Tệp',\n uk: 'Файл',\n }),\n markdown: t({\n en: 'Markdown',\n 'en-GB': 'Markdown',\n fr: 'Markdown',\n es: 'Markdown',\n de: 'Markdown',\n ja: 'マークダウン',\n ko: '마크다운',\n zh: 'Markdown',\n it: 'Markdown',\n pt: 'Markdown',\n hi: 'मार्कडाउन',\n ar: 'مارك داون',\n ru: 'Markdown',\n tr: 'Markdown',\n pl: 'Markdown',\n id: 'Markdown',\n vi: 'Markdown',\n uk: 'Markdown',\n }),\n reactNode: t({\n en: 'React Node',\n 'en-GB': 'React Node',\n fr: 'Node React',\n es: 'Nodo React',\n de: 'React-Knoten',\n ja: 'リアル・ノード',\n ko: '리액 노드',\n zh: 'React 节点',\n it: 'Nodo React',\n pt: 'Nó React',\n hi: 'रेड नोड',\n ar: 'عقدة رياكت',\n ru: 'Реакт узел',\n tr: 'React Node',\n pl: 'Węzeł React',\n id: 'React Node',\n vi: 'React Node',\n uk: 'React-вузол',\n }),\n },\n title: 'Node type selector',\n description:\n 'Defines the available node types that can be selected for content modeling, including text, number, boolean, object structures, arrays, and other specialized types like enumeration, gender, condition, and markdown.',\n tags: ['content modeling', 'field type', 'editor'],\n} satisfies Dictionary;\n\nexport default nodeTypeSelectorContent;\n"],"mappings":"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"}
1
+ {"version":3,"file":"nodeTypeSelector.content.mjs","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/nodeTypeSelector.content.ts"],"sourcesContent":["import { type Dictionary, t } from 'intlayer';\n\nexport const nodeTypeSelectorContent = {\n key: 'node-type-selector',\n content: {\n triggerPlaceHolder: t({\n en: 'Node type',\n 'en-GB': 'Node type',\n fr: 'Type du Nœud',\n es: 'Tipo del nodo',\n de: 'Knotentyp',\n ja: 'ノードタイプ',\n ko: '노드 유형',\n zh: '节点类型',\n it: 'Tipo di nodo',\n pt: 'Tipo de nó',\n hi: 'नोड प्रकार',\n ar: 'نوع العقدة',\n ru: 'Тип узла',\n tr: 'Düğüm türü',\n pl: 'Typ węzła',\n id: 'Tipe Node',\n vi: 'Kiểu node',\n uk: 'Тип вузла',\n }),\n multilingual: t({\n en: 'Multilingual content',\n 'en-GB': 'Multilingual content',\n fr: 'Contenu Multilingue',\n es: 'Contenido multilingüe',\n de: 'Mehrsprachiger Inhalt',\n ja: '複数言語コンテンツ',\n ko: '다중 언어 콘텐츠',\n zh: '多语言内容',\n it: 'Contenuto multilingue',\n pt: 'Conteúdo multilíngue',\n hi: 'बहुभाषी सामग्री',\n ar: 'محتوى متعدد اللغات',\n ru: 'Многоязычный контент',\n tr: 'Çok dilli içerik',\n pl: 'Treść wielojęzyczna',\n id: 'Konten multibahasa',\n vi: 'Nội dung đa ngôn ngữ',\n uk: 'Багатомовний вміст',\n }),\n text: t({\n en: 'Text',\n 'en-GB': 'Text',\n fr: 'Texte',\n es: 'Texto',\n de: 'Text',\n ja: 'テキスト',\n ko: '텍스트',\n zh: '文本',\n it: 'Testo',\n pt: 'Texto',\n hi: 'पाठ',\n ar: 'نص',\n ru: 'Текст',\n tr: 'Metin',\n pl: 'Tekst',\n id: 'Teks',\n vi: 'Văn bản',\n uk: 'Текст',\n }),\n number: t({\n en: 'Number',\n 'en-GB': 'Number',\n fr: 'Nombre',\n es: 'Número',\n de: 'Zahl',\n ja: '数字',\n ko: '숫자',\n zh: '数字',\n it: 'Numero',\n pt: 'Número',\n hi: 'संख्या',\n ar: 'رقم',\n ru: 'Число',\n tr: 'Sayı',\n pl: 'Liczba',\n id: 'Angka',\n vi: 'Số',\n uk: 'Число',\n }),\n boolean: t({\n en: 'Boolean',\n 'en-GB': 'Boolean',\n fr: 'Booléen',\n es: 'Booleano',\n de: 'Bool',\n ja: 'ブール',\n ko: '불리언',\n zh: '布尔',\n it: 'Booleano',\n pt: 'Booleano',\n hi: 'बूलियन',\n ar: 'منطقي',\n ru: 'Булево',\n tr: 'Boolean',\n pl: 'Wartość logiczna',\n id: 'Boolean',\n vi: 'Boolean',\n uk: 'Булеве',\n }),\n node: t({\n en: 'Object',\n 'en-GB': 'Object',\n fr: 'Objet',\n es: 'Objeto',\n de: 'Objekt',\n ja: 'オブジェクト',\n ko: '객체',\n zh: '对象',\n it: 'Oggetto',\n pt: 'Objeto',\n hi: 'ऑब्जेक्ट',\n ar: 'كائن',\n ru: 'Объект',\n tr: 'Nesne',\n pl: 'Obiekt',\n id: 'Object',\n vi: 'Đối tượng',\n uk: \"Об'єкт\",\n }),\n array: t({\n en: 'Array',\n 'en-GB': 'Array',\n fr: 'Tableau',\n es: 'Arreglo',\n de: 'Array',\n ja: '配列',\n ko: '배열',\n zh: '数组',\n it: 'Array',\n pt: 'Array',\n hi: 'ऐरे',\n ar: 'مصفوفة',\n ru: 'Массив',\n tr: 'Dizi',\n pl: 'Tablica',\n id: 'Array',\n vi: 'Mảng',\n uk: 'Масив',\n }),\n enumeration: t({\n en: 'Enumeration',\n 'en-GB': 'Enumeration',\n fr: 'Énumération',\n es: 'Enumeración',\n de: 'Enumeration',\n ja: '列挙',\n ko: '열거',\n zh: '枚举',\n it: 'Enumerazione',\n pt: 'Enumeração',\n hi: 'गणना',\n ar: 'تعداد',\n ru: 'Перечисление',\n tr: 'Numaralandırma',\n pl: 'Wyliczenie',\n id: 'Enumeration',\n vi: 'Kiểu liệt kê',\n uk: 'Перерахування',\n }),\n plural: t({\n en: 'Plural',\n 'en-GB': 'Plural',\n fr: 'Pluriel',\n es: 'Plural',\n de: 'Plural',\n ja: '複数形',\n ko: '복수',\n zh: '复数',\n it: 'Plurale',\n pt: 'Plural',\n hi: 'बहुवचन',\n ar: 'جمع',\n ru: 'Множественное число',\n tr: 'Çoğul',\n pl: 'Liczba mnoga',\n id: 'Jamak',\n vi: 'Số nhiều',\n uk: 'Множина',\n }),\n gender: t({\n en: 'Gender',\n 'en-GB': 'Gender',\n fr: 'Genre',\n es: 'Género',\n de: 'Geschlecht',\n ja: '性別',\n ko: '성별',\n zh: '性别',\n it: 'Genere',\n pt: 'Gênero',\n hi: 'लिंग',\n ar: 'جنس',\n ru: 'Пол',\n tr: 'Cins',\n pl: 'Płeć',\n id: 'Gender',\n vi: 'Giới tính',\n uk: 'Стать',\n }),\n select: t({\n en: 'Select',\n 'en-GB': 'Select',\n fr: 'Sélection',\n es: 'Selección',\n de: 'Auswahl',\n ja: '選択',\n ko: '선택',\n zh: '选择',\n it: 'Selezione',\n pt: 'Seleção',\n hi: 'चयन',\n ar: 'تحديد',\n ru: 'Выбор',\n tr: 'Seçim',\n pl: 'Wybór',\n id: 'Pilihan',\n vi: 'Lựa chọn',\n uk: 'Вибір',\n }),\n nest: t({\n en: 'Nesting',\n 'en-GB': 'Nesting',\n fr: 'Imbriquation',\n es: 'Anidación',\n de: 'Vererbung',\n ja: 'ネスト',\n ko: '중첩',\n zh: '嵌套',\n it: 'Nidificazione',\n pt: 'Nido',\n hi: 'नेस्टेंस',\n ar: 'مستوى',\n ru: 'Вложенность',\n tr: 'İç içe geçme',\n pl: 'Zagnieżdżanie',\n id: 'Nesting',\n vi: 'Lồng nhau',\n uk: 'Вкладеність',\n }),\n insertion: t({\n en: 'Insertion',\n 'en-GB': 'Insertion',\n fr: 'Insertion',\n es: 'Inserción',\n de: 'Einfügung',\n ja: '挿入',\n ko: '삽입',\n zh: '插入',\n it: 'Inserimento',\n pt: 'Inserção',\n hi: 'सम्मिलन',\n ar: 'إدراج',\n ru: 'Вставка',\n tr: 'Ekleme',\n pl: 'Wstawianie',\n id: 'Insertion',\n vi: 'Chèn',\n uk: 'Вставка',\n }),\n condition: t({\n en: 'Condition',\n 'en-GB': 'Condition',\n fr: 'Condition',\n es: 'Condición',\n de: 'Bedingung',\n ja: '条件',\n ko: '조건',\n zh: '条件',\n it: 'Condizione',\n pt: 'Condição',\n hi: 'शर्त्ता',\n ar: 'شرط',\n ru: 'Условие',\n tr: 'Koşul',\n pl: 'Warunek',\n id: 'Condition',\n vi: 'Điều kiện',\n uk: 'Умова',\n }),\n file: t({\n en: 'File',\n 'en-GB': 'File',\n fr: 'Fichier',\n es: 'Archivo',\n de: 'Datei',\n ja: 'ファイル',\n ko: '파일',\n zh: '文件',\n it: 'File',\n pt: 'Arquivo',\n hi: 'फ़ाइल',\n ar: 'ملف',\n ru: 'Файл',\n tr: 'Dosya',\n pl: 'Plik',\n id: 'File',\n vi: 'Tệp',\n uk: 'Файл',\n }),\n markdown: t({\n en: 'Markdown',\n 'en-GB': 'Markdown',\n fr: 'Markdown',\n es: 'Markdown',\n de: 'Markdown',\n ja: 'マークダウン',\n ko: '마크다운',\n zh: 'Markdown',\n it: 'Markdown',\n pt: 'Markdown',\n hi: 'मार्कडाउन',\n ar: 'مارك داون',\n ru: 'Markdown',\n tr: 'Markdown',\n pl: 'Markdown',\n id: 'Markdown',\n vi: 'Markdown',\n uk: 'Markdown',\n }),\n reactNode: t({\n en: 'React Node',\n 'en-GB': 'React Node',\n fr: 'Node React',\n es: 'Nodo React',\n de: 'React-Knoten',\n ja: 'リアル・ノード',\n ko: '리액 노드',\n zh: 'React 节点',\n it: 'Nodo React',\n pt: 'Nó React',\n hi: 'रेड नोड',\n ar: 'عقدة رياكت',\n ru: 'Реакт узел',\n tr: 'React Node',\n pl: 'Węzeł React',\n id: 'React Node',\n vi: 'React Node',\n uk: 'React-вузол',\n }),\n },\n title: 'Node type selector',\n description:\n 'Defines the available node types that can be selected for content modeling, including text, number, boolean, object structures, arrays, and other specialized types like enumeration, gender, condition, and markdown.',\n tags: ['content modeling', 'field type', 'editor'],\n} satisfies Dictionary;\n\nexport default nodeTypeSelectorContent;\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { NodeWrapperProps } from "./index.js";
2
+ import { FC } from "react";
3
+ import { SelectContent } from "@intlayer/core/transpiler";
4
+ //#region src/components/DictionaryEditor/NodeWrapper/SelectWrapper.d.ts
5
+ type SelectWrapperProps = Omit<NodeWrapperProps, 'section'> & {
6
+ section: SelectContent;
7
+ };
8
+ declare const SelectWrapper: FC<SelectWrapperProps>;
9
+ //#endregion
10
+ export { SelectWrapper };
11
+ //# sourceMappingURL=SelectWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectWrapper.d.ts","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/SelectWrapper.tsx"],"mappings":";;;;KAOK,qBAAqB,KAAK;EAC7B,SAAS;;cAGE,eAAe,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"mappings":";;;;;cAoCa;KAED;EACV,SAAS;EACT,YAAY;EACZ,SAAS;EACT,kBAAkB;IAAW,SAAS;IAAW;;EACjD,QAAQ;EACR,eAAe;EACf,gBAAgB;EAChB,iBAAiB,SAAS;EAC1B,eAAe,SAAS;EACxB,iBAAiB,oBAAoB;;cAG1B,aAAa,GAAG"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"mappings":";;;;;cAsCa;KAED;EACV,SAAS;EACT,YAAY;EACZ,SAAS;EACT,kBAAkB;IAAW,SAAS;IAAW;;EACjD,QAAQ;EACR,eAAe;EACf,gBAAgB;EAChB,iBAAiB,SAAS;EAC1B,eAAe,SAAS;EACxB,iBAAiB,oBAAoB;;cAG1B,aAAa,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextEditor.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/ContentEditorView/TextEditor.tsx"],"mappings":";;;;cA4Fa;KA2ID;EACV,YAAY;EACZ,SAAS;EACT,SAAS;EACT;;;;;EAKA,iBAAiB,iBAAiB,SAAS,cAAc;EACzD,mBAAmB;;cAytBR,4BAAU,qBAAA;cA8MV,qCAAmB,qBAAA"}
1
+ {"version":3,"file":"TextEditor.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/ContentEditorView/TextEditor.tsx"],"mappings":";;;;cA6Fa;KA2ID;EACV,YAAY;EACZ,SAAS;EACT,SAAS;EACT;;;;;EAKA,iBAAiB,iBAAiB,SAAS,cAAc;EACzD,mBAAmB;;cAk1BR,4BAAU,qBAAA;cAyNV,qCAAmB,qBAAA"}
@@ -170,6 +170,90 @@ declare const navigationViewContent: {
170
170
  uk: string;
171
171
  }>;
172
172
  };
173
+ addNewSelectCase: {
174
+ label: import("@intlayer/core/transpiler").TranslationContent<unknown, {
175
+ en: string;
176
+ 'en-GB': string;
177
+ fr: string;
178
+ es: string;
179
+ de: string;
180
+ ja: string;
181
+ ko: string;
182
+ zh: string;
183
+ it: string;
184
+ pt: string;
185
+ hi: string;
186
+ ar: string;
187
+ ru: string;
188
+ tr: string;
189
+ pl: string;
190
+ id: string;
191
+ vi: string;
192
+ uk: string;
193
+ }>;
194
+ text: import("@intlayer/core/transpiler").TranslationContent<unknown, {
195
+ en: string;
196
+ 'en-GB': string;
197
+ fr: string;
198
+ es: string;
199
+ de: string;
200
+ ja: string;
201
+ ko: string;
202
+ zh: string;
203
+ it: string;
204
+ pt: string;
205
+ hi: string;
206
+ ar: string;
207
+ ru: string;
208
+ tr: string;
209
+ pl: string;
210
+ id: string;
211
+ vi: string;
212
+ uk: string;
213
+ }>;
214
+ };
215
+ removeSelectCase: {
216
+ label: import("@intlayer/core/transpiler").TranslationContent<unknown, {
217
+ en: string;
218
+ 'en-GB': string;
219
+ fr: string;
220
+ es: string;
221
+ de: string;
222
+ ja: string;
223
+ ko: string;
224
+ zh: string;
225
+ it: string;
226
+ pt: string;
227
+ hi: string;
228
+ ar: string;
229
+ ru: string;
230
+ tr: string;
231
+ pl: string;
232
+ id: string;
233
+ vi: string;
234
+ uk: string;
235
+ }>;
236
+ text: import("@intlayer/core/transpiler").TranslationContent<unknown, {
237
+ en: string;
238
+ 'en-GB': string;
239
+ fr: string;
240
+ es: string;
241
+ de: string;
242
+ ja: string;
243
+ ko: string;
244
+ zh: string;
245
+ it: string;
246
+ pt: string;
247
+ hi: string;
248
+ ar: string;
249
+ ru: string;
250
+ tr: string;
251
+ pl: string;
252
+ id: string;
253
+ vi: string;
254
+ uk: string;
255
+ }>;
256
+ };
173
257
  removeEnumeration: {
174
258
  label: import("@intlayer/core/transpiler").TranslationContent<unknown, {
175
259
  en: string;
@@ -1 +1 @@
1
- {"version":3,"file":"navigationViewNode.content.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.ts"],"mappings":";cAEa;;;IAGT,oDAAc;;;;;;;;;;;;;;;;;;;;IAoBd;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;;IAqBP;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI"}
1
+ {"version":3,"file":"navigationViewNode.content.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.ts"],"mappings":";cAEa;;;IAGT,oDAAc;;;;;;;;;;;;;;;;;;;;IAoBd;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;;IAqBP;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI;;;;;;;;;;;;;;;;;;;;;IAqBN;MACE,2CAAK;;;;;;;;;;;;;;;;;;;;MAoBL,0CAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"StructureView.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/StructureView/StructureView.tsx"],"mappings":";;;;;KAgJK;EACH;EACA,mBAAmB;EACnB,SAAS;EACT,SAAS;;cAGE,UAAU,GAAG;KAgFrB;EACH,mBAAmB;EACnB,SAAS;EACT,SAAS;;cAGE,YAAY,GAAG;KAqDvB;EACH,mBAAmB;EACnB,SAAS;EACT,SAAS;;cAGE,eAAe,GAAG"}
1
+ {"version":3,"file":"StructureView.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/StructureView/StructureView.tsx"],"mappings":";;;;;KAiJK;EACH;EACA,mBAAmB;EACnB,SAAS;EACT,SAAS;;cAGE,UAAU,GAAG;KAgFrB;EACH,mBAAmB;EACnB,SAAS;EACT,SAAS;;cAGE,YAAY,GAAG;KAqDvB;EACH,mBAAmB;EACnB,SAAS;EACT,SAAS;;cAGE,eAAe,GAAG"}
@@ -202,6 +202,26 @@ declare const nodeTypeSelectorContent: {
202
202
  vi: string;
203
203
  uk: string;
204
204
  }>;
205
+ select: import("@intlayer/core/transpiler").TranslationContent<unknown, {
206
+ en: string;
207
+ 'en-GB': string;
208
+ fr: string;
209
+ es: string;
210
+ de: string;
211
+ ja: string;
212
+ ko: string;
213
+ zh: string;
214
+ it: string;
215
+ pt: string;
216
+ hi: string;
217
+ ar: string;
218
+ ru: string;
219
+ tr: string;
220
+ pl: string;
221
+ id: string;
222
+ vi: string;
223
+ uk: string;
224
+ }>;
205
225
  nest: import("@intlayer/core/transpiler").TranslationContent<unknown, {
206
226
  en: string;
207
227
  'en-GB': string;
@@ -1 +1 @@
1
- {"version":3,"file":"nodeTypeSelector.content.d.ts","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/nodeTypeSelector.content.ts"],"mappings":";cAEa;;;IAGT,wDAAkB;;;;;;;;;;;;;;;;;;;;IAoBlB,kDAAY;;;;;;;;;;;;;;;;;;;;IAoBZ,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,4CAAM;;;;;;;;;;;;;;;;;;;;IAoBN,6CAAO;;;;;;;;;;;;;;;;;;;;IAoBP,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,2CAAK;;;;;;;;;;;;;;;;;;;;IAoBL,iDAAW;;;;;;;;;;;;;;;;;;;;IAoBX,4CAAM;;;;;;;;;;;;;;;;;;;;IAoBN,4CAAM;;;;;;;;;;;;;;;;;;;;IAoBN,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,+CAAS;;;;;;;;;;;;;;;;;;;;IAoBT,+CAAS;;;;;;;;;;;;;;;;;;;;IAoBT,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,8CAAQ;;;;;;;;;;;;;;;;;;;;IAoBR,+CAAS"}
1
+ {"version":3,"file":"nodeTypeSelector.content.d.ts","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/nodeTypeSelector.content.ts"],"mappings":";cAEa;;;IAGT,wDAAkB;;;;;;;;;;;;;;;;;;;;IAoBlB,kDAAY;;;;;;;;;;;;;;;;;;;;IAoBZ,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,4CAAM;;;;;;;;;;;;;;;;;;;;IAoBN,6CAAO;;;;;;;;;;;;;;;;;;;;IAoBP,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,2CAAK;;;;;;;;;;;;;;;;;;;;IAoBL,iDAAW;;;;;;;;;;;;;;;;;;;;IAoBX,4CAAM;;;;;;;;;;;;;;;;;;;;IAoBN,4CAAM;;;;;;;;;;;;;;;;;;;;IAoBN,4CAAM;;;;;;;;;;;;;;;;;;;;IAoBN,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,+CAAS;;;;;;;;;;;;;;;;;;;;IAoBT,+CAAS;;;;;;;;;;;;;;;;;;;;IAoBT,0CAAI;;;;;;;;;;;;;;;;;;;;IAoBJ,8CAAQ;;;;;;;;;;;;;;;;;;;;IAoBR,+CAAS"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/design-system",
3
- "version": "9.0.2",
3
+ "version": "9.1.0",
4
4
  "private": false,
5
5
  "description": "Intlayer design system, including UI components used in the Intlayer editor, website, and visual editor/CMS.",
6
6
  "keywords": [
@@ -442,46 +442,46 @@
442
442
  "dependencies": {
443
443
  "@better-auth/passkey": "1.6.25",
444
444
  "@better-auth/sso": "1.6.25",
445
- "@intlayer/api": "9.0.2",
446
- "@intlayer/config": "9.0.2",
447
- "@intlayer/core": "9.0.2",
448
- "@intlayer/dictionaries-entry": "9.0.2",
449
- "@intlayer/editor-react": "9.0.2",
450
- "@intlayer/engine": "9.0.2",
451
- "@intlayer/types": "9.0.2",
452
- "@radix-ui/react-dialog": "1.1.20",
453
- "@radix-ui/react-select": "2.3.4",
454
- "@radix-ui/react-slot": "1.3.0",
455
- "@radix-ui/react-toast": "1.2.20",
445
+ "@intlayer/api": "9.1.0",
446
+ "@intlayer/config": "9.1.0",
447
+ "@intlayer/core": "9.1.0",
448
+ "@intlayer/dictionaries-entry": "9.1.0",
449
+ "@intlayer/editor-react": "9.1.0",
450
+ "@intlayer/engine": "9.1.0",
451
+ "@intlayer/types": "9.1.0",
452
+ "@radix-ui/react-dialog": "1.1.23",
453
+ "@radix-ui/react-select": "2.3.7",
454
+ "@radix-ui/react-slot": "1.3.3",
455
+ "@radix-ui/react-toast": "1.2.23",
456
456
  "@tailwindcss/aspect-ratio": "0.4.2",
457
457
  "@tanstack/query-async-storage-persister": "5.101.4",
458
458
  "@tanstack/react-query-persist-client": "5.101.4",
459
- "@tanstack/react-virtual": "3.14.8",
460
- "@tiptap/core": "3.28.0",
461
- "@tiptap/extension-character-count": "3.28.0",
462
- "@tiptap/extension-color": "3.28.0",
463
- "@tiptap/extension-highlight": "3.28.0",
464
- "@tiptap/extension-horizontal-rule": "3.28.0",
465
- "@tiptap/extension-image": "3.28.0",
466
- "@tiptap/extension-link": "3.28.0",
467
- "@tiptap/extension-placeholder": "3.28.0",
468
- "@tiptap/extension-task-item": "3.28.0",
469
- "@tiptap/extension-task-list": "3.28.0",
470
- "@tiptap/extension-text-style": "3.28.0",
471
- "@tiptap/extension-underline": "3.28.0",
472
- "@tiptap/extension-youtube": "3.28.0",
473
- "@tiptap/pm": "3.28.0",
474
- "@tiptap/react": "3.28.0",
475
- "@tiptap/starter-kit": "3.28.0",
476
- "@tiptap/suggestion": "3.28.0",
459
+ "@tanstack/react-virtual": "3.14.9",
460
+ "@tiptap/core": "3.29.2",
461
+ "@tiptap/extension-character-count": "3.29.2",
462
+ "@tiptap/extension-color": "3.29.2",
463
+ "@tiptap/extension-highlight": "3.29.2",
464
+ "@tiptap/extension-horizontal-rule": "3.29.2",
465
+ "@tiptap/extension-image": "3.29.2",
466
+ "@tiptap/extension-link": "3.29.2",
467
+ "@tiptap/extension-placeholder": "3.29.2",
468
+ "@tiptap/extension-task-item": "3.29.2",
469
+ "@tiptap/extension-task-list": "3.29.2",
470
+ "@tiptap/extension-text-style": "3.29.2",
471
+ "@tiptap/extension-underline": "3.29.2",
472
+ "@tiptap/extension-youtube": "3.29.2",
473
+ "@tiptap/pm": "3.29.2",
474
+ "@tiptap/react": "3.29.2",
475
+ "@tiptap/starter-kit": "3.29.2",
476
+ "@tiptap/suggestion": "3.29.2",
477
477
  "better-auth": "1.6.25",
478
478
  "class-variance-authority": "0.7.1",
479
479
  "cmdk": "1.1.1",
480
- "cnfast": "^0.0.8",
480
+ "cnfast": "^0.1.0",
481
481
  "defu": "6.1.7",
482
482
  "dompurify": "3.4.12",
483
- "isomorphic-dompurify": "3.19.0",
484
- "react-intlayer": "9.0.2",
483
+ "isomorphic-dompurify": "3.20.0",
484
+ "react-intlayer": "9.1.0",
485
485
  "rollup-preserve-directives": "1.1.3",
486
486
  "tiptap-extension-code-block-shiki": "^1.2.0",
487
487
  "tiptap-extension-global-drag-handle": "^0.1.18",
@@ -490,7 +490,7 @@
490
490
  "zod": "4.4.3"
491
491
  },
492
492
  "devDependencies": {
493
- "@intlayer/backend": "9.0.2",
493
+ "@intlayer/backend": "9.1.0",
494
494
  "@shikijs/transformers": "4.3.1",
495
495
  "@storybook/addon-a11y": "8.6.14",
496
496
  "@storybook/addon-essentials": "8.6.14",
@@ -514,39 +514,39 @@
514
514
  "@testing-library/user-event": "14.6.1",
515
515
  "@types/dompurify": "3.2.0",
516
516
  "@types/espree": "11.1.0",
517
- "@types/node": "26.1.1",
517
+ "@types/node": "26.1.2",
518
518
  "@types/react": "19.2.17",
519
519
  "@types/react-dom": "19.2.3",
520
520
  "@utils/ts-config": "1.0.4",
521
521
  "@utils/ts-config-types": "1.0.4",
522
522
  "fast-glob": "3.3.3",
523
- "intlayer": "9.0.2",
523
+ "intlayer": "9.1.0",
524
524
  "rimraf": "6.1.3",
525
525
  "shiki": "4.3.1",
526
526
  "storybook": "8.6.17",
527
527
  "tsdown": "0.22.14",
528
528
  "typescript": "7.0.2",
529
- "vite": "8.1.5",
530
- "vite-intlayer": "9.0.2",
529
+ "vite": "8.2.0",
530
+ "vite-intlayer": "9.1.0",
531
531
  "vite-plugin-dts": "5.0.3",
532
532
  "vitest": "4.1.10"
533
533
  },
534
534
  "peerDependencies": {
535
535
  "@better-fetch/fetch": "1.3.1",
536
- "@hookform/resolvers": "5.4.0",
537
- "@intlayer/backend": "9.0.2",
536
+ "@hookform/resolvers": "5.5.7",
537
+ "@intlayer/backend": "9.1.0",
538
538
  "@monaco-editor/react": "4.7.0",
539
539
  "@shikijs/transformers": "4.3.1",
540
540
  "@tanstack/react-query": "5.101.4",
541
541
  "@tanstack/react-query-devtools": "5.101.4",
542
- "framer-motion": "12.42.2",
542
+ "framer-motion": "12.43.0",
543
543
  "fuse.js": "7.5.0",
544
- "intlayer": "9.0.2",
545
- "lucide-react": "1.26.0",
544
+ "intlayer": "9.1.0",
545
+ "lucide-react": "1.28.0",
546
546
  "react": ">=16.0.0",
547
547
  "react-dom": ">=16.0.0",
548
- "react-hook-form": "7.82.0",
549
- "react-intlayer": "9.0.2",
548
+ "react-hook-form": "7.83.0",
549
+ "react-intlayer": "9.1.0",
550
550
  "shiki": "4.3.1",
551
551
  "tailwindcss": "4.3.3"
552
552
  },