@intlayer/design-system 8.7.13 → 8.8.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 (43) hide show
  1. package/dist/esm/components/ContentEditor/ContentEditorTextArea.mjs +1 -1
  2. package/dist/esm/components/DictionaryEditor/NodeWrapper/PluralWrapper.mjs +33 -0
  3. package/dist/esm/components/DictionaryEditor/NodeWrapper/PluralWrapper.mjs.map +1 -0
  4. package/dist/esm/components/DictionaryEditor/NodeWrapper/index.mjs +5 -0
  5. package/dist/esm/components/DictionaryEditor/NodeWrapper/index.mjs.map +1 -1
  6. package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +2 -2
  7. package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +1 -1
  8. package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +3 -3
  9. package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +1 -1
  10. package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +2 -2
  11. package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs.map +1 -1
  12. package/dist/esm/components/DictionaryFieldEditor/NodeTypeSelector.mjs +5 -1
  13. package/dist/esm/components/DictionaryFieldEditor/NodeTypeSelector.mjs.map +1 -1
  14. package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +2 -2
  15. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +3 -3
  16. package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs.map +1 -1
  17. package/dist/esm/components/DictionaryFieldEditor/nodeTypeSelector.content.mjs +20 -0
  18. package/dist/esm/components/DictionaryFieldEditor/nodeTypeSelector.content.mjs.map +1 -1
  19. package/dist/esm/components/Form/elements/OTPElement.mjs +1 -1
  20. package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs +1 -1
  21. package/dist/esm/components/Modal/Modal.mjs +2 -2
  22. package/dist/esm/components/Modal/Modal.mjs.map +1 -1
  23. package/dist/esm/components/Navbar/MobileNavbar.mjs +1 -1
  24. package/dist/esm/components/Pagination/Pagination.mjs +1 -1
  25. package/dist/esm/components/RightDrawer/RightDrawer.mjs +3 -3
  26. package/dist/esm/hooks/index.mjs +9 -9
  27. package/dist/types/components/Badge/index.d.ts +2 -2
  28. package/dist/types/components/Button/Button.d.ts +3 -3
  29. package/dist/types/components/Command/index.d.ts +1 -1
  30. package/dist/types/components/DictionaryEditor/NodeWrapper/PluralWrapper.d.ts +13 -0
  31. package/dist/types/components/DictionaryEditor/NodeWrapper/PluralWrapper.d.ts.map +1 -0
  32. package/dist/types/components/DictionaryEditor/NodeWrapper/index.d.ts.map +1 -1
  33. package/dist/types/components/DictionaryFieldEditor/StructureView/StructureView.d.ts.map +1 -1
  34. package/dist/types/components/DictionaryFieldEditor/nodeTypeSelector.content.d.ts +20 -0
  35. package/dist/types/components/DictionaryFieldEditor/nodeTypeSelector.content.d.ts.map +1 -1
  36. package/dist/types/components/Input/Checkbox.d.ts +1 -1
  37. package/dist/types/components/Link/Link.d.ts +2 -2
  38. package/dist/types/components/Modal/Modal.d.ts +1 -1
  39. package/dist/types/components/Modal/Modal.d.ts.map +1 -1
  40. package/dist/types/components/Pagination/Pagination.d.ts +1 -1
  41. package/dist/types/components/TabSelector/TabSelector.d.ts +1 -1
  42. package/dist/types/components/Tag/index.d.ts +1 -1
  43. package/package.json +14 -14
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
+ import { useUser } from "../../hooks/useUser/index.mjs";
3
4
  import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
4
5
  import { AutoCompleteTextarea } from "../TextArea/AutocompleteTextArea.mjs";
5
- import { useUser } from "../../hooks/useUser/index.mjs";
6
6
  import { useEffect, useState } from "react";
7
7
  import { Check, X } from "lucide-react";
8
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -0,0 +1,33 @@
1
+ import { NodeWrapper, traceKeys } 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/PluralWrapper.tsx
7
+ const PluralWrapper = (props) => {
8
+ const { keyPath, section } = props;
9
+ return /* @__PURE__ */ jsx("div", {
10
+ className: "ml-2 grid grid-cols-[auto,1fr] gap-2",
11
+ children: Object.keys(section).filter((key) => !traceKeys.includes(key)).map((key) => {
12
+ const newKeyPathEl = {
13
+ type: NodeTypes.PLURAL,
14
+ key
15
+ };
16
+ const newKeyPath = [...keyPath, newKeyPathEl];
17
+ const subSection = section[NodeTypes.PLURAL][key];
18
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
19
+ className: "flex items-center font-bold",
20
+ children: key
21
+ }), /* @__PURE__ */ createElement(NodeWrapper, {
22
+ ...props,
23
+ key,
24
+ keyPath: newKeyPath,
25
+ section: subSection
26
+ })] });
27
+ })
28
+ });
29
+ };
30
+
31
+ //#endregion
32
+ export { PluralWrapper };
33
+ //# sourceMappingURL=PluralWrapper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluralWrapper.mjs","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/PluralWrapper.tsx"],"sourcesContent":["import type { PluralContent } 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, traceKeys } from './index';\n\ntype PluralWrapperProps = Omit<NodeWrapperProps, 'section'> & {\n section: PluralContent<ContentNode>;\n};\n\nexport const PluralWrapper: FC<PluralWrapperProps> = (props) => {\n const { keyPath, section } = props;\n\n return (\n <div className=\"ml-2 grid grid-cols-[auto,1fr] gap-2\">\n {Object.keys(section)\n .filter((key) => !traceKeys.includes(key))\n .map((key) => {\n const newKeyPathEl: KeyPath = {\n type: NodeTypes.PLURAL,\n key,\n };\n const newKeyPath: KeyPath[] = [...keyPath, newKeyPathEl];\n\n const subSection =\n section[NodeTypes.PLURAL][\n key as keyof (typeof section)[typeof NodeTypes.PLURAL]\n ]!;\n\n return (\n <>\n <span className=\"flex items-center font-bold\">{key}</span>\n <NodeWrapper\n {...props}\n key={key}\n keyPath={newKeyPath}\n section={subSection}\n />\n </>\n );\n })}\n </div>\n );\n};\n"],"mappings":";;;;;;AAWA,MAAa,iBAAyC,UAAU;CAC9D,MAAM,EAAE,SAAS,YAAY;AAE7B,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ,OAAO,KAAK,QAAQ,CAClB,QAAQ,QAAQ,CAAC,UAAU,SAAS,IAAI,CAAC,CACzC,KAAK,QAAQ;GACZ,MAAM,eAAwB;IAC5B,MAAM,UAAU;IAChB;IACD;GACD,MAAM,aAAwB,CAAC,GAAG,SAAS,aAAa;GAExD,MAAM,aACJ,QAAQ,UAAU,QAChB;AAGJ,UACE,8CACE,oBAAC,QAAD;IAAM,WAAU;cAA+B;IAAW,GAC1D,8BAAC,aAAD;IACE,GAAI;IACC;IACL,SAAS;IACT,SAAS;IACT,EACD;IAEL;EACA"}
@@ -11,6 +11,7 @@ import { InsertionWrapper } from "./InsertionWrapper.mjs";
11
11
  import { MarkdownWrapper } from "./MarkdownWrapper.mjs";
12
12
  import { NestedObjectWrapper } from "./NestedObjectWrapper.mjs";
13
13
  import { NumberWrapper } from "./NumberWrapper.mjs";
14
+ import { PluralWrapper } from "./PluralWrapper.mjs";
14
15
  import { TranslationWrapper } from "./TranslationWrapper.mjs";
15
16
  import { memo, useMemo } from "react";
16
17
  import { jsx } from "react/jsx-runtime";
@@ -59,6 +60,10 @@ const NodeWrapper = memo((props) => {
59
60
  ...props,
60
61
  section
61
62
  });
63
+ if (nodeType === NodeTypes.PLURAL) return /* @__PURE__ */ jsx(PluralWrapper, {
64
+ ...props,
65
+ section
66
+ });
62
67
  if (nodeType === NodeTypes.CONDITION) return /* @__PURE__ */ jsx(ConditionWrapper, {
63
68
  ...props,
64
69
  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 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 { 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.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":";;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,YAAsB;CAAC;CAAY;CAAM;CAAW;AAejE,MAAa,cAAoC,MAAM,UAAU;CAC/D,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,UAAU,cAAc;AAM5B,SAL2B,wBACzB,MAAM,eACN,MAAM,SACN,cAEuB,IAAI,MAAM;IAClC;EAAC,MAAM;EAAe,MAAM;EAAS,MAAM;EAAQ,CAAC;CAEvD,MAAM,WAAW,cAAc,YAAY,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAE/D,KAAI,OAAO,YAAY,UAAU;AAC/B,MAAI,aAAa,UAAU,WACzB,QACE,oBAAC,QAAD;GAAM,WAAU;aAAuB;GAA8B;AAIzE,MAAI,aAAa,UAAU,OACzB,QACE,oBAAC,OAAD;GAAK,WAAU;aAAuC;GAEhD;AAIV,MAAI,aAAa,UAAU,SACzB,QACE,oBAAC,iBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,KACzB,QACE,oBAAC,aAAD;GAAa,GAAI;GAAgB;GAAuC;AAI5E,MAAI,aAAa,UAAU,YACzB,QACE,oBAAC,oBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,YACzB,QACE,oBAAC,oBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,UACzB,QACE,oBAAC,kBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,UACzB,QACE,oBAAC,kBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,MACzB,QACE,oBAAC,cAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,KACzB,QAAO,oBAAC,aAAD;GAAa,GAAI;GAAgB;GAA0B;AAGpE,SACE,oBAAC,qBAAD;GACE,GAAI;GACK;GACT;;AAIN,KAAI,OAAO,YAAY,SACrB,QAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;EAAW;AAGvD,KAAI,OAAO,YAAY,SACrB,QAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;EAAW;AAGvD,KAAI,OAAO,YAAY,UACrB,QAAO,oBAAC,gBAAD;EAAgB,GAAI;EAAgB;EAAW;EAExD"}
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;CAAW;AAejE,MAAa,cAAoC,MAAM,UAAU;CAC/D,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,UAAU,cAAc;AAM5B,SAL2B,wBACzB,MAAM,eACN,MAAM,SACN,cAEuB,IAAI,MAAM;IAClC;EAAC,MAAM;EAAe,MAAM;EAAS,MAAM;EAAQ,CAAC;CAEvD,MAAM,WAAW,cAAc,YAAY,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAE/D,KAAI,OAAO,YAAY,UAAU;AAC/B,MAAI,aAAa,UAAU,WACzB,QACE,oBAAC,QAAD;GAAM,WAAU;aAAuB;GAA8B;AAIzE,MAAI,aAAa,UAAU,OACzB,QACE,oBAAC,OAAD;GAAK,WAAU;aAAuC;GAEhD;AAIV,MAAI,aAAa,UAAU,SACzB,QACE,oBAAC,iBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,KACzB,QACE,oBAAC,aAAD;GAAa,GAAI;GAAgB;GAAuC;AAI5E,MAAI,aAAa,UAAU,YACzB,QACE,oBAAC,oBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,YACzB,QACE,oBAAC,oBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,OACzB,QACE,oBAAC,eAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,UACzB,QACE,oBAAC,kBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,UACzB,QACE,oBAAC,kBAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,MACzB,QACE,oBAAC,cAAD;GACE,GAAI;GACK;GACT;AAIN,MAAI,aAAa,UAAU,KACzB,QAAO,oBAAC,aAAD;GAAa,GAAI;GAAgB;GAA0B;AAGpE,SACE,oBAAC,qBAAD;GACE,GAAI;GACK;GACT;;AAIN,KAAI,OAAO,YAAY,SACrB,QAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;EAAW;AAGvD,KAAI,OAAO,YAAY,SACrB,QAAO,oBAAC,eAAD;EAAe,GAAI;EAAgB;EAAW;AAGvD,KAAI,OAAO,YAAY,UACrB,QAAO,oBAAC,gBAAD;EAAgB,GAAI;EAAgB;EAAW;EAExD"}
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
 
3
+ import { useAuditContentDeclarationField } from "../../../hooks/reactQuery.mjs";
3
4
  import { Container } from "../../Container/index.mjs";
4
5
  import { Button, ButtonColor, ButtonSize, ButtonTextAlign, ButtonVariant } from "../../Button/Button.mjs";
5
6
  import { InputVariant } from "../../Input/Input.mjs";
6
7
  import { SwitchSelector, SwitchSelectorColor, SwitchSelectorSize } from "../../SwitchSelector/SwitchSelector.mjs";
7
8
  import { useLocaleSwitcherContent } from "../../LocaleSwitcherContentDropDown/LocaleSwitcherContentContext.mjs";
8
9
  import { ContentEditorInput as ContentEditorInput$1 } from "../../ContentEditor/ContentEditorInput.mjs";
9
- import { useAuditContentDeclarationField } from "../../../hooks/reactQuery.mjs";
10
10
  import { ContentEditorTextArea as ContentEditorTextArea$1 } from "../../ContentEditor/ContentEditorTextArea.mjs";
11
11
  import { renameKey } from "./object.mjs";
12
12
  import { Label } from "../../Label/index.mjs";
@@ -15,9 +15,9 @@ import { EnumKeyInput } from "../EnumKeyInput.mjs";
15
15
  import { Fragment, useState } from "react";
16
16
  import { Plus, Trash, WandSparkles } from "lucide-react";
17
17
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
18
+ import { useConfiguration, useEditedContent } from "@intlayer/editor-react";
18
19
  import { useIntlayer, useLocale } from "react-intlayer";
19
20
  import { getLocaleName } from "@intlayer/core/localization";
20
- import { useConfiguration, useEditedContent } from "@intlayer/editor-react";
21
21
  import { getEmptyNode, getNodeType } from "@intlayer/core/dictionaryManipulator";
22
22
  import * as NodeTypes from "@intlayer/types/nodeType";
23
23
 
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
- import { ButtonColor } from "../../Button/Button.mjs";
4
3
  import { useSession } from "../../../hooks/useAuth/useSession.mjs";
5
4
  import { useAddDictionary, useGetProjects } from "../../../hooks/reactQuery.mjs";
5
+ import { ButtonColor } from "../../Button/Button.mjs";
6
6
  import { MultiSelect } from "../../Select/Multiselect.mjs";
7
7
  import { useForm } from "../../Form/FormBase.mjs";
8
8
  import { Form } from "../../Form/Form.mjs";
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
 
3
+ import { useSession } from "../../../hooks/useAuth/useSession.mjs";
4
+ import { useAuditContentDeclarationMetadata, useGetProjects, useGetTags } from "../../../hooks/reactQuery.mjs";
3
5
  import { Loader } from "../../Loader/index.mjs";
4
6
  import { ButtonColor, ButtonSize, ButtonVariant } from "../../Button/Button.mjs";
5
7
  import { Checkbox } from "../../Input/Checkbox.mjs";
6
- import { useSession } from "../../../hooks/useAuth/useSession.mjs";
7
- import { useAuditContentDeclarationMetadata, useGetProjects, useGetTags } from "../../../hooks/reactQuery.mjs";
8
8
  import { MultiSelect } from "../../Select/Multiselect.mjs";
9
9
  import { Select } from "../../Select/Select.mjs";
10
10
  import { useForm as useForm$1 } from "../../Form/FormBase.mjs";
@@ -13,8 +13,8 @@ import { useDictionaryDetailsSchema } from "./useDictionaryDetailsSchema.mjs";
13
13
  import { useEffect } from "react";
14
14
  import { WandSparkles } from "lucide-react";
15
15
  import { jsx, jsxs } from "react/jsx-runtime";
16
- import { useIntlayer } from "react-intlayer";
17
16
  import { useEditedContent } from "@intlayer/editor-react";
17
+ import { useIntlayer } from "react-intlayer";
18
18
  import { AnimatePresence, motion } from "framer-motion";
19
19
  import { useWatch } from "react-hook-form";
20
20
 
@@ -12,8 +12,8 @@ import { StructureEditor } from "./StructureEditor.mjs";
12
12
  import { useEffect } from "react";
13
13
  import { ArrowLeft } from "lucide-react";
14
14
  import { jsx, jsxs } from "react/jsx-runtime";
15
- import { useIntlayer } from "react-intlayer";
16
15
  import { useConfiguration, useDictionariesRecordActions, useFocusUnmergedDictionary } from "@intlayer/editor-react";
16
+ import { useIntlayer } from "react-intlayer";
17
17
 
18
18
  //#region src/components/DictionaryFieldEditor/DictionaryFieldEditor.tsx
19
19
  const DictionaryFieldEditor = ({ dictionary, onClickDictionaryList, isDarkMode, mode, onDelete, onSave, showReturnButton = true }) => {
@@ -4,8 +4,8 @@ import { getIsEditableSection } from "../getIsEditableSection.mjs";
4
4
  import { ChevronRight, Plus } from "lucide-react";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import { internationalization } from "@intlayer/config/built";
7
- import { useIntlayer } from "react-intlayer";
8
7
  import { useEditedContentActions, useEditorLocale, useFocusUnmergedDictionary } from "@intlayer/editor-react";
8
+ import { useIntlayer } from "react-intlayer";
9
9
  import { getContentNodeByKeyPath, getEmptyNode, getNodeType } from "@intlayer/core/dictionaryManipulator";
10
10
  import * as NodeTypes from "@intlayer/types/nodeType";
11
11
  import { isSameKeyPath } from "@intlayer/core/utils";
@@ -51,7 +51,7 @@ const NavigationViewNode = ({ section: sectionProp, keyPath, dictionary }) => {
51
51
  }, translationKey);
52
52
  })
53
53
  });
54
- if (nodeType === NodeTypes.ENUMERATION || nodeType === NodeTypes.CONDITION) return /* @__PURE__ */ jsx("div", {
54
+ if (nodeType === NodeTypes.ENUMERATION || nodeType === NodeTypes.PLURAL || nodeType === NodeTypes.CONDITION) return /* @__PURE__ */ jsx("div", {
55
55
  className: "flex flex-col justify-between gap-2",
56
56
  children: Object.keys(section[nodeType]).map((key) => {
57
57
  return /* @__PURE__ */ jsx(NavigationViewNode, {
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationViewNode.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.tsx"],"sourcesContent":["import { Accordion } from '@components/Accordion';\nimport {\n Button,\n ButtonColor,\n ButtonTextAlign,\n ButtonVariant,\n} from '@components/Button';\nimport { internationalization } from '@intlayer/config/built';\nimport { camelCaseToSentence } from '@intlayer/config/client';\nimport {\n getContentNodeByKeyPath,\n getEmptyNode,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport { isSameKeyPath } from '@intlayer/core/utils';\nimport {\n useEditedContentActions,\n useEditorLocale,\n useFocusUnmergedDictionary,\n} from '@intlayer/editor-react';\nimport type { LocalDictionaryId } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { ContentNode, Dictionary } from 'intlayer';\nimport { ChevronRight, Plus } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { getIsEditableSection } from '../getIsEditableSection';\n\nexport const traceKeys: string[] = ['filePath', 'id', 'nodeType'];\n\nexport type NodeWrapperProps = {\n keyPath: KeyPath[];\n section: ContentNode;\n dictionary: Dictionary;\n};\n\nexport const NavigationViewNode: FC<NodeWrapperProps> = ({\n section: sectionProp,\n keyPath,\n dictionary,\n}) => {\n const { locales } = internationalization;\n\n const currentLocale = useEditorLocale();\n const section = getContentNodeByKeyPath(sectionProp, keyPath, currentLocale);\n const { addEditedContent } = useEditedContentActions();\n const { setFocusedContentKeyPath, focusedContent } =\n useFocusUnmergedDictionary();\n const { addNewElement, goToField } = useIntlayer('navigation-view');\n const nodeType = getNodeType(section);\n const getIsSelected = (keyPath: KeyPath[]) =>\n (focusedContent?.keyPath?.length ?? 0) > 0 &&\n isSameKeyPath(keyPath, focusedContent?.keyPath ?? []);\n const isEditableSubSection = getIsEditableSection(section);\n\n if (!section) return <></>;\n\n if (isEditableSubSection) {\n return (\n <Button\n label={goToField.label.value}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n className=\"w-full\"\n onClick={() => setFocusedContentKeyPath(keyPath)}\n IconRight={ChevronRight}\n >\n {camelCaseToSentence(keyPath[keyPath.length - 1].key as string)}\n </Button>\n );\n }\n\n if (typeof section === 'object') {\n if (nodeType === NodeTypes.REACT_NODE) {\n return <>React Node</>;\n }\n\n if (nodeType === NodeTypes.TRANSLATION) {\n return (\n <div className=\"flex flex-col justify-between gap-2\">\n {locales.map((translationKey) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.TRANSLATION, key: translationKey },\n ];\n\n return (\n <NavigationViewNode\n key={translationKey}\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n );\n })}\n </div>\n );\n }\n\n if (\n nodeType === NodeTypes.ENUMERATION ||\n nodeType === NodeTypes.CONDITION\n ) {\n return (\n <div className=\"flex flex-col justify-between gap-2\">\n {Object.keys(\n (section as any)[nodeType as unknown as keyof typeof section]\n ).map((key) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: nodeType, key },\n ];\n\n return (\n <NavigationViewNode\n key={key}\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n );\n })}\n </div>\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n return (\n <div className=\"flex flex-col justify-between gap-2\">\n {(section as unknown as ContentNode[]).map((subSection, index) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.ARRAY, key: index },\n ];\n\n const isEditableSubSection = getIsEditableSection(subSection);\n\n if (isEditableSubSection) {\n return (\n <Button\n key={JSON.stringify(childKeyPath)}\n label={`${goToField.label.value} ${index}`}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n className=\"w-full\"\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n IconRight={ChevronRight}\n isActive={getIsSelected(childKeyPath)}\n >\n Item {index}\n </Button>\n );\n }\n\n return (\n <Accordion\n key={JSON.stringify(childKeyPath)}\n label={`${goToField.label.value} ${index}`}\n header={`Item ${index}`}\n isActive={getIsSelected(childKeyPath)}\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n >\n <div className=\"mt-2 flex w-full max-w-full\">\n <div className=\"flex-1 pl-10\">\n <NavigationViewNode\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n </div>\n </div>\n </Accordion>\n );\n })}\n\n <Button\n label={addNewElement.label.value}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.NEUTRAL}\n textAlign={ButtonTextAlign.LEFT}\n onClick={() => {\n const newKeyPath: KeyPath[] = [\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: (section as unknown as ContentNode[]).length,\n },\n ];\n const sectionArray = section as unknown as ContentNode[];\n const emptySectionEl =\n getEmptyNode(\n sectionArray[\n (sectionArray.length - 1) as keyof typeof sectionArray\n ] as ContentNode\n ) ?? '';\n addEditedContent(\n dictionary.localId as LocalDictionaryId,\n emptySectionEl,\n newKeyPath,\n false\n );\n setFocusedContentKeyPath(newKeyPath);\n }}\n Icon={Plus}\n >\n {addNewElement.text}\n </Button>\n </div>\n );\n }\n\n if (typeof section.nodeType === 'string') {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: section.nodeType } as KeyPath,\n ];\n\n return (\n <NavigationViewNode\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n );\n }\n\n const sectionArray = Object.keys(section);\n return (\n <div className=\"flex w-full max-w-full flex-col justify-between gap-2\">\n {sectionArray.map((key) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.OBJECT, key },\n ];\n\n const subSection = getContentNodeByKeyPath(sectionProp, childKeyPath);\n const isEditableSubSection = getIsEditableSection(subSection);\n\n if (isEditableSubSection) {\n return (\n <Button\n label={`${goToField.label.value} ${key}`}\n key={key}\n isActive={getIsSelected(childKeyPath)}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n className=\"w-full\"\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n IconRight={ChevronRight}\n >\n {camelCaseToSentence(key)}\n </Button>\n );\n }\n\n return (\n <Accordion\n key={key}\n label={`${goToField.label.value} ${key}`}\n isActive={getIsSelected(childKeyPath)}\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n header={camelCaseToSentence(key)}\n >\n <div className=\"mt-2 flex w-full max-w-full\">\n <div className=\"flex-1 pl-10\">\n <NavigationViewNode\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n </div>\n </div>\n </Accordion>\n );\n })}\n </div>\n );\n }\n\n return (\n <>\n Error loading section --\n {nodeType}\n --\n {JSON.stringify(section)}\n --\n {JSON.stringify(keyPath)}\n </>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"NavigationViewNode.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.tsx"],"sourcesContent":["import { Accordion } from '@components/Accordion';\nimport {\n Button,\n ButtonColor,\n ButtonTextAlign,\n ButtonVariant,\n} from '@components/Button';\nimport { internationalization } from '@intlayer/config/built';\nimport { camelCaseToSentence } from '@intlayer/config/client';\nimport {\n getContentNodeByKeyPath,\n getEmptyNode,\n getNodeType,\n} from '@intlayer/core/dictionaryManipulator';\nimport { isSameKeyPath } from '@intlayer/core/utils';\nimport {\n useEditedContentActions,\n useEditorLocale,\n useFocusUnmergedDictionary,\n} from '@intlayer/editor-react';\nimport type { LocalDictionaryId } from '@intlayer/types/dictionary';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport type { ContentNode, Dictionary } from 'intlayer';\nimport { ChevronRight, Plus } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { getIsEditableSection } from '../getIsEditableSection';\n\nexport const traceKeys: string[] = ['filePath', 'id', 'nodeType'];\n\nexport type NodeWrapperProps = {\n keyPath: KeyPath[];\n section: ContentNode;\n dictionary: Dictionary;\n};\n\nexport const NavigationViewNode: FC<NodeWrapperProps> = ({\n section: sectionProp,\n keyPath,\n dictionary,\n}) => {\n const { locales } = internationalization;\n\n const currentLocale = useEditorLocale();\n const section = getContentNodeByKeyPath(sectionProp, keyPath, currentLocale);\n const { addEditedContent } = useEditedContentActions();\n const { setFocusedContentKeyPath, focusedContent } =\n useFocusUnmergedDictionary();\n const { addNewElement, goToField } = useIntlayer('navigation-view');\n const nodeType = getNodeType(section);\n const getIsSelected = (keyPath: KeyPath[]) =>\n (focusedContent?.keyPath?.length ?? 0) > 0 &&\n isSameKeyPath(keyPath, focusedContent?.keyPath ?? []);\n const isEditableSubSection = getIsEditableSection(section);\n\n if (!section) return <></>;\n\n if (isEditableSubSection) {\n return (\n <Button\n label={goToField.label.value}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n className=\"w-full\"\n onClick={() => setFocusedContentKeyPath(keyPath)}\n IconRight={ChevronRight}\n >\n {camelCaseToSentence(keyPath[keyPath.length - 1].key as string)}\n </Button>\n );\n }\n\n if (typeof section === 'object') {\n if (nodeType === NodeTypes.REACT_NODE) {\n return <>React Node</>;\n }\n\n if (nodeType === NodeTypes.TRANSLATION) {\n return (\n <div className=\"flex flex-col justify-between gap-2\">\n {locales.map((translationKey) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.TRANSLATION, key: translationKey },\n ];\n\n return (\n <NavigationViewNode\n key={translationKey}\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n );\n })}\n </div>\n );\n }\n\n if (\n nodeType === NodeTypes.ENUMERATION ||\n nodeType === NodeTypes.PLURAL ||\n nodeType === NodeTypes.CONDITION\n ) {\n return (\n <div className=\"flex flex-col justify-between gap-2\">\n {Object.keys(\n (section as any)[nodeType as unknown as keyof typeof section]\n ).map((key) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: nodeType, key },\n ];\n\n return (\n <NavigationViewNode\n key={key}\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n );\n })}\n </div>\n );\n }\n\n if (nodeType === NodeTypes.ARRAY) {\n return (\n <div className=\"flex flex-col justify-between gap-2\">\n {(section as unknown as ContentNode[]).map((subSection, index) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.ARRAY, key: index },\n ];\n\n const isEditableSubSection = getIsEditableSection(subSection);\n\n if (isEditableSubSection) {\n return (\n <Button\n key={JSON.stringify(childKeyPath)}\n label={`${goToField.label.value} ${index}`}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n className=\"w-full\"\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n IconRight={ChevronRight}\n isActive={getIsSelected(childKeyPath)}\n >\n Item {index}\n </Button>\n );\n }\n\n return (\n <Accordion\n key={JSON.stringify(childKeyPath)}\n label={`${goToField.label.value} ${index}`}\n header={`Item ${index}`}\n isActive={getIsSelected(childKeyPath)}\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n >\n <div className=\"mt-2 flex w-full max-w-full\">\n <div className=\"flex-1 pl-10\">\n <NavigationViewNode\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n </div>\n </div>\n </Accordion>\n );\n })}\n\n <Button\n label={addNewElement.label.value}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.NEUTRAL}\n textAlign={ButtonTextAlign.LEFT}\n onClick={() => {\n const newKeyPath: KeyPath[] = [\n ...keyPath,\n {\n type: NodeTypes.ARRAY,\n key: (section as unknown as ContentNode[]).length,\n },\n ];\n const sectionArray = section as unknown as ContentNode[];\n const emptySectionEl =\n getEmptyNode(\n sectionArray[\n (sectionArray.length - 1) as keyof typeof sectionArray\n ] as ContentNode\n ) ?? '';\n addEditedContent(\n dictionary.localId as LocalDictionaryId,\n emptySectionEl,\n newKeyPath,\n false\n );\n setFocusedContentKeyPath(newKeyPath);\n }}\n Icon={Plus}\n >\n {addNewElement.text}\n </Button>\n </div>\n );\n }\n\n if (typeof section.nodeType === 'string') {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: section.nodeType } as KeyPath,\n ];\n\n return (\n <NavigationViewNode\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n );\n }\n\n const sectionArray = Object.keys(section);\n return (\n <div className=\"flex w-full max-w-full flex-col justify-between gap-2\">\n {sectionArray.map((key) => {\n const childKeyPath: KeyPath[] = [\n ...keyPath,\n { type: NodeTypes.OBJECT, key },\n ];\n\n const subSection = getContentNodeByKeyPath(sectionProp, childKeyPath);\n const isEditableSubSection = getIsEditableSection(subSection);\n\n if (isEditableSubSection) {\n return (\n <Button\n label={`${goToField.label.value} ${key}`}\n key={key}\n isActive={getIsSelected(childKeyPath)}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n className=\"w-full\"\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n IconRight={ChevronRight}\n >\n {camelCaseToSentence(key)}\n </Button>\n );\n }\n\n return (\n <Accordion\n key={key}\n label={`${goToField.label.value} ${key}`}\n isActive={getIsSelected(childKeyPath)}\n onClick={() => setFocusedContentKeyPath(childKeyPath)}\n header={camelCaseToSentence(key)}\n >\n <div className=\"mt-2 flex w-full max-w-full\">\n <div className=\"flex-1 pl-10\">\n <NavigationViewNode\n keyPath={childKeyPath}\n section={sectionProp}\n dictionary={dictionary}\n />\n </div>\n </div>\n </Accordion>\n );\n })}\n </div>\n );\n }\n\n return (\n <>\n Error loading section --\n {nodeType}\n --\n {JSON.stringify(section)}\n --\n {JSON.stringify(keyPath)}\n </>\n );\n};\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, 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, 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);
@@ -47,6 +47,10 @@ const NodeTypeSelector = ({ section, onValueChange: onValueChangeProp }) => {
47
47
  value: NodeTypes.ENUMERATION,
48
48
  children: enumeration
49
49
  }),
50
+ /* @__PURE__ */ jsx(Select.Item, {
51
+ value: NodeTypes.PLURAL,
52
+ children: plural
53
+ }),
50
54
  /* @__PURE__ */ jsx(Select.Item, {
51
55
  value: NodeTypes.GENDER,
52
56
  children: gender
@@ -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 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.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,oBACA,MACA,QACA,WACA,UACA,WACA,WACA,SACE,YAAY,qBAAqB;CAErC,MAAM,CAAC,SAAS,cAAc,SADb,YAAY,QAC4B,CAAC;CAE1D,MAAM,iBAAiB,YAAsB;AAC3C,aAAW,QAAQ;AACnB,oBAAkB,QAAQ;;AAG5B,QACE,qBAAC,QAAD;EAAQ,OAAO;EAAwB;YAAvC,CACE,oBAAC,OAAO,SAAR,YACE,oBAAC,OAAO,OAAR,EAAc,aAAa,oBAAsB,GAClC,GACjB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;IAA2B;GACvE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;IAAmB;GACxD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAqB;GAC5D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAU;IAAsB;GAC9D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAmB;GAC1D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAQ;IAAoB;GAC1D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;IAA0B;GACtE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAqB;GAC5D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;IAAwB;GAClE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAW;IAAuB;GAChE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAmB;GAC1D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;IAAwB;GAClE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;IAAY;cACvC;IACW;GACd,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;IAAmB;GACzC,IACV"}
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,qBAAqB;CAErC,MAAM,CAAC,SAAS,cAAc,SADb,YAAY,QAC4B,CAAC;CAE1D,MAAM,iBAAiB,YAAsB;AAC3C,aAAW,QAAQ;AACnB,oBAAkB,QAAQ;;AAG5B,QACE,qBAAC,QAAD;EAAQ,OAAO;EAAwB;YAAvC,CACE,oBAAC,OAAO,SAAR,YACE,oBAAC,OAAO,OAAR,EAAc,aAAa,oBAAsB,GAClC,GACjB,qBAAC,OAAO,SAAR;GACE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;IAA2B;GACvE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;IAAmB;GACxD,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAqB;GAC5D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAU;IAAsB;GAC9D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAmB;GAC1D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAQ;IAAoB;GAC1D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAc;IAA0B;GACtE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAqB;GAC5D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAqB;GAC5D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;IAAwB;GAClE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAW;IAAuB;GAChE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAS;IAAmB;GAC1D,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAY;IAAwB;GAClE,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;IAAY;cACvC;IACW;GACd,oBAAC,OAAO,MAAR;IAAa,OAAO,UAAU;cAAO;IAAmB;GACzC,IACV"}
@@ -1,16 +1,16 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../../utils/cn.mjs";
4
- import { ButtonColor, ButtonVariant } from "../../Button/Button.mjs";
5
4
  import { useAuth } from "../../../hooks/useAuth/useAuth.mjs";
6
5
  import { useDeleteDictionary, usePushDictionaries, useWriteDictionary } from "../../../hooks/reactQuery.mjs";
6
+ import { ButtonColor, ButtonVariant } from "../../Button/Button.mjs";
7
7
  import { Modal, ModalSize } from "../../Modal/Modal.mjs";
8
8
  import { Form } from "../../Form/Form.mjs";
9
9
  import { useState } from "react";
10
10
  import { ArrowUpFromLine, Download, RotateCcw, Save, Trash } from "lucide-react";
11
11
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
12
- import { useIntlayer } from "react-intlayer";
13
12
  import { useDictionariesRecordActions, useEditedContent } from "@intlayer/editor-react";
13
+ import { useIntlayer } from "react-intlayer";
14
14
 
15
15
  //#region src/components/DictionaryFieldEditor/SaveForm/SaveForm.tsx
16
16
  const SaveForm = ({ dictionary, mode, className, onDelete, onSave, ...props }) => {
@@ -7,8 +7,8 @@ import { EditableFieldInput } from "../../EditableField/EditableFieldInput.mjs";
7
7
  import { NodeTypeSelector } from "../NodeTypeSelector.mjs";
8
8
  import { Plus, Trash } from "lucide-react";
9
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
- import { useIntlayer } from "react-intlayer";
11
10
  import { useConfiguration, useEditedContentActions, useFocusUnmergedDictionary } from "@intlayer/editor-react";
11
+ import { useIntlayer } from "react-intlayer";
12
12
  import { getDefaultNode, getNodeChildren, getNodeType } from "@intlayer/core/dictionaryManipulator";
13
13
  import * as NodeTypes from "@intlayer/types/nodeType";
14
14
  import { isSameKeyPath } from "@intlayer/core/utils";
@@ -16,13 +16,13 @@ import { camelCaseToSentence } from "@intlayer/config/client";
16
16
 
17
17
  //#region src/components/DictionaryFieldEditor/StructureView/StructureView.tsx
18
18
  const NodeTypeView = ({ section, dictionaryLocalId, keyPath, onNodeTypeChange: onNodeTypeChangeProp }) => {
19
- const locales = useConfiguration()?.internationalization.locales ?? [];
19
+ const locales = useConfiguration()?.internationalization?.locales ?? [];
20
20
  const nodeType = getNodeType(section);
21
21
  const children = getNodeChildren(section);
22
22
  const onNodeTypeChange = (content) => {
23
23
  onNodeTypeChangeProp(getDefaultNode(nodeType, locales, content));
24
24
  };
25
- if (nodeType === NodeTypes.TRANSLATION || nodeType === NodeTypes.CONDITION || nodeType === NodeTypes.GENDER || nodeType === NodeTypes.ENUMERATION) {
25
+ if (nodeType === NodeTypes.TRANSLATION || nodeType === NodeTypes.CONDITION || nodeType === NodeTypes.GENDER || nodeType === NodeTypes.ENUMERATION || nodeType === NodeTypes.PLURAL) {
26
26
  const firstKey = Object.keys(section[nodeType])[0];
27
27
  const childrenKeyPath = [...keyPath, {
28
28
  type: nodeType,
@@ -1 +1 @@
1
- {"version":3,"file":"StructureView.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/StructureView/StructureView.tsx"],"sourcesContent":["'use client';\n\nimport {\n Button,\n ButtonColor,\n ButtonSize,\n ButtonVariant,\n} from '@components/Button';\nimport { Container } from '@components/Container';\nimport { EditableFieldInput } from '@components/EditableField';\nimport { InputVariant } from '@components/Input';\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 ) {\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=\"xl\"\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={InputVariant.INVISIBLE}\n />\n <Button\n label={deleteButton.label.value}\n variant={ButtonVariant.HOVERABLE}\n size={ButtonSize.ICON_SM}\n color={ButtonColor.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={ButtonVariant.HOVERABLE}\n size={ButtonSize.MD}\n color={ButtonColor.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 {\n Button,\n ButtonColor,\n ButtonSize,\n ButtonVariant,\n} from '@components/Button';\nimport { Container } from '@components/Container';\nimport { EditableFieldInput } from '@components/EditableField';\nimport { InputVariant } from '@components/Input';\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=\"xl\"\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={InputVariant.INVISIBLE}\n />\n <Button\n label={deleteButton.label.value}\n variant={ButtonVariant.HOVERABLE}\n size={ButtonSize.ICON_SM}\n color={ButtonColor.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={ButtonVariant.HOVERABLE}\n size={ButtonSize.MD}\n color={ButtonColor.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":";;;;;;;;;;;;;;;;;AAuCA,MAAM,gBAAuC,EAC3C,SACA,mBACA,SACA,kBAAkB,2BACd;CACJ,MAAM,UAAU,kBAAkB,EAAE,sBAAsB,WAAW,EAAE;CACvE,MAAM,WAAW,YAAY,QAAQ;CACrC,MAAM,WAAW,gBAAgB,QAAQ;CAEzC,MAAM,oBAAoB,YAA0B;AAOlD,uBAN2B,eACzB,UACA,SACA,QAGqC,CAAC;;AAG1C,KACE,aAAa,UAAU,eACvB,aAAa,UAAU,aACvB,aAAa,UAAU,UACvB,aAAa,UAAU,eACvB,aAAa,UAAU,QACvB;EACA,MAAM,WAAW,OAAO,KACrB,QAAiC,UACnC,CAAC;EACF,MAAM,kBAAkB,CACtB,GAAG,SACH;GAAE,MAAM;GAAU,KAAK;GAAU,CAClC;AAED,SACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,kBAAD;IACW;IACT,gBAAgB,aACd,qBACE,eAAe,UAAU,QAAQ,CAClC;IAEH,GAEF,oBAAC,cAAD;IACE,SAAS;IACT,SAAS;IACU;IACD;IAClB,EACE;;;AAIV,KAAI,aAAa,UAAU,OAAO;EAChC,MAAM,kBAAkB,CAAC,GAAG,SAAS;GAAE,MAAM;GAAU,KAAK;GAAG,CAAY;AAC3E,SACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,kBAAD;IACW;IACT,gBAAgB,aACd,qBACE,eAAe,UAAU,QAAQ,CAClC;IAEH,GAEF,oBAAC,cAAD;IACE,SAAS;IACT,SAAS;IACU;IACD;IAClB,EACE;;;AAIV,KAAI,aAAa,UAAU,OACzB,QACE,4CACE,oBAAC,kBAAD;EACW;EACT,gBAAgB,aACd,qBACE,eAAe,UAAU,QAAQ,CAClC;EAEH,GACF,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,eAAD;GACW;GACA;GACU;GACnB;EACE,EACL;AAIP,QACE,oBAAC,kBAAD;EACW;EACT,gBAAgB,aACd,qBAAqB,eAAe,UAAU,QAAQ,CAAgB;EAExE;;AAWN,MAAa,YAAkC,EAC7C,YACA,SACA,SACA,wBACI;CACJ,MAAM,EAAE,gBAAgB,6BACtB,4BAA4B;CAC9B,MAAM,EAAE,qBAAqB,qBAAqB,yBAAyB;CAE3E,MAAM,EAAE,YAAY,iBAAiB,YAAY,iBAAiB;CAElE,MAAM,uBAAuB,YAAoB;AAC/C,sBAAoB,mBAAmB,SAAS,QAAQ;EACxD,MAAM,cAAyB,QAAQ,MAAM,GAAG,GAAG;EACnD,MAAM,cAAuB,QAAQ,QAAQ,SAAS;AAKtD,2BAAyB,CAHvB,GAAG,aACH;GAAE,GAAG;GAAa,KAAK;GAAS,CAEC,CAAC;;AAGtC,QACE,oBAAC,WAAD;EACE,cAAa;EACb,aAAY;EACZ,WAAU;EACV;EACA,aAAY;EACZ,YAAW;EACX,iBAAe,cAAc,SAAS,gBAAgB,WAAW,EAAE,CAAC;EACpE,eAAe,yBAAyB,QAAQ;YAEhD,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,OAAO,eAAe,YACrB,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,oBAAD;MACE,MAAK;MACL,cAAW;MACX,aAAa,WAAW,YAAY;MACpC,cAAc;MACd,SAAS,UAAU,oBAAoB,MAAM;MAC7C;MACA,GACF,oBAAC,QAAD;MACE,OAAO,aAAa,MAAM;MAC1B;MACA;MACA;MACA,WAAU;MACV,MAAM;MACN,eAAe;AACb,wBAAiB,mBAAmB,QAAW,QAAQ;AAGvD,gCADiC,QAAQ,MAAM,GAAG,GACZ,CAAC;;MAEzC,EACE;QAEN,qBAAC,QAAD;KAAM,WAAU;eAAhB;MAA4C;MACvC,oBAAoB,WAAW;MAAC;MAC9B;OACH;OAER,oBAAC,cAAD;IACW;IACU;IACV;IACT,mBAAmB,YAAY;AAC7B,sBAAiB,mBAAmB,SAAS,QAAQ;;IAEvD,EACE;;EACI;;AAUhB,MAAa,cAAmC,EAC9C,SACA,SACA,wBACI;CACJ,MAAM,EAAE,kBAAkB,YAAY,iBAAiB;CACvD,MAAM,EAAE,6BAA6B,4BAA4B;CACjE,MAAM,EAAE,qBAAqB,yBAAyB;AAEtD,KAAI,CAAC,WAAW,OAAO,YAAY,SACjC,QAAO,oBAAC,OAAD,YAAK,iBAAmB;AAGjC,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,MAAD;GAAI,WAAU;aACX,OAAO,KAAK,QAAQ,CAAC,KAAK,QACzB,oBAAC,MAAD;IAEE,WAAU;cAEV,oBAAC,UAAD;KACE,YAAY;KACZ,SAAS,UAAU;KACnB,SAAS,CAAC,GAAG,SAAS;MAAE,MAAM,UAAU;MAAQ;MAAK,CAAC;KACnC;KACnB;IACC,EATE,GAAG,KAAK,UAAU,QAAQ,CAAC,UAAU,MASvC,CACL;GACC,GACL,oBAAC,QAAD;GACE,OAAO,cAAc,MAAM;GAC3B;GACA;GACA;GACA,MAAM;GACN,WAAU;GACV,eAAe;IACb,MAAM,SAAS;IACf,MAAM,aAAa,CACjB,GAAG,SACH;KAAE,MAAM,UAAU;KAAQ,KAAK;KAAQ,CACxC;AACD,qBAAiB,mBAAmB,IAAI,WAAW;AACnD,6BAAyB,WAAW;;aAGrC,cAAc;GACR,EACL;;;AAUV,MAAa,iBAAyC,EACpD,SACA,SACA,wBACI;AACJ,KACE,CAAC,WACD,OAAO,YAAY,YACnB,OAAO,QAAQ,aAAa,SAE5B,QACE,oBAAC,UAAD;EACE,YAAY;EACH;EACA;EACU;EACnB;AAIN,QACE,oBAAC,YAAD;EACW;EACA;EACU;EACnB"}
@@ -164,6 +164,26 @@ const nodeTypeSelectorContent = {
164
164
  vi: "Kiểu liệt kê",
165
165
  uk: "Перерахування"
166
166
  }),
167
+ plural: t({
168
+ en: "Plural",
169
+ "en-GB": "Plural",
170
+ fr: "Pluriel",
171
+ es: "Plural",
172
+ de: "Plural",
173
+ ja: "複数形",
174
+ ko: "복수",
175
+ zh: "复数",
176
+ it: "Plurale",
177
+ pt: "Plural",
178
+ hi: "बहुवचन",
179
+ ar: "جمع",
180
+ ru: "Множественное число",
181
+ tr: "Çoğul",
182
+ pl: "Liczba mnoga",
183
+ id: "Jamak",
184
+ vi: "Số nhiều",
185
+ uk: "Множина"
186
+ }),
167
187
  gender: t({
168
188
  en: "Gender",
169
189
  "en-GB": "Gender",
@@ -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 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 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,7 +1,7 @@
1
1
  'use client';
2
2
 
3
- import { InputIndicator, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "../../Input/OTPInput.mjs";
4
3
  import { useItemSelector } from "../../../hooks/useItemSelector.mjs";
4
+ import { InputIndicator, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "../../Input/OTPInput.mjs";
5
5
  import { useFormField } from "../FormField.mjs";
6
6
  import { FormItemLayout } from "../layout/FormItemLayout.mjs";
7
7
  import { Form } from "../Form.mjs";
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
 
3
+ import { usePersistedStore } from "../../hooks/usePersistedStore.mjs";
3
4
  import { Container } from "../Container/index.mjs";
4
5
  import { Button, ButtonColor, ButtonSize, ButtonTextAlign, ButtonVariant } from "../Button/Button.mjs";
5
6
  import { Input } from "../Input/Input.mjs";
6
7
  import { SwitchSelector, SwitchSelectorColor, SwitchSelectorSize } from "../SwitchSelector/SwitchSelector.mjs";
7
- import { usePersistedStore } from "../../hooks/usePersistedStore.mjs";
8
8
  import { DropDown } from "../DropDown/index.mjs";
9
9
  import { useLocaleSwitcherContent } from "./LocaleSwitcherContentContext.mjs";
10
10
  import { useMemo, useRef, useState } from "react";
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../utils/cn.mjs";
4
+ import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
5
+ import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
4
6
  import { Container } from "../Container/index.mjs";
5
7
  import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
6
8
  import { H3 } from "../Headers/index.mjs";
7
- import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
8
- import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
9
9
  import { useEffect } from "react";
10
10
  import { cva } from "class-variance-authority";
11
11
  import { X } from "lucide-react";
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.mjs","names":["m"],"sources":["../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["'use client';\n\nimport { useGetElementOrWindow, useScrollBlockage } from '@hooks/index';\nimport { cn } from '@utils/cn';\nimport { cva } from 'class-variance-authority';\nimport { motion as m } from 'framer-motion';\nimport { X } from 'lucide-react';\nimport { type FC, type ReactNode, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, ButtonColor, ButtonSize, ButtonVariant } from '../Button';\nimport { Container, type ContainerProps } from '../Container';\nimport { H3 } from '../Headers';\n\n/**\n * Enumeration of available modal sizes\n */\nexport enum ModalSize {\n SM = 'sm',\n MD = 'md',\n LG = 'lg',\n XL = 'xl',\n UNSET = 'unset',\n}\n\ntype ModalProps = {\n children: ReactNode;\n isOpen: boolean;\n onClose?: () => void;\n container?: HTMLElement;\n disableScroll?: boolean;\n hasCloseButton?: boolean;\n title?: ReactNode;\n size?: ModalSize | `${ModalSize}`;\n /**\n * Defines if the modal content area is scrollable.\n */\n isScrollable?: boolean | 'x' | 'y';\n} & Pick<\n ContainerProps,\n | 'className'\n | 'transparency'\n | 'border'\n | 'background'\n | 'roundedSize'\n | 'borderColor'\n | 'padding'\n | 'separator'\n | 'gap'\n>;\n\nconst modalVariants = cva(\n 'flex cursor-default flex-col overflow-hidden shadow-sm',\n {\n variants: {\n size: {\n sm: 'h-auto max-h-[30vh] w-[95vw] max-w-xl',\n md: 'h-auto max-h-[50vh] w-[95vw] max-w-xl',\n lg: 'h-auto max-h-[70vh] w-[95vw] max-w-4xl',\n xl: 'h-auto max-h-[95vh] w-[95vw] max-w-6xl',\n unset: 'h-auto max-h-[95vh] w-[95vw]',\n },\n },\n defaultVariants: {\n size: 'unset',\n },\n }\n);\n\n// Mapped from Container/index.tsx to apply internally\nconst contentPaddingVariants = {\n none: 'p-0',\n sm: 'px-2 py-4',\n md: 'px-4 py-6',\n lg: 'px-6 py-8',\n xl: 'px-8 py-10',\n '2xl': 'px-10 py-12',\n};\n\nconst MotionModal = m.create(Container);\n\n/**\n * Modal Component\n *\n * A highly customizable modal dialog component with portal rendering, Framer Motion animations,\n * and comprehensive accessibility features. Supports multiple size variants and scroll management.\n *\n * Features:\n * - Portal rendering to any container element (defaults to document.body)\n * - Smooth animations with Framer Motion\n * - Size variants: SM, MD, LG, XL, UNSET with responsive sizing\n * - Optional title and close button\n * - Background scroll prevention\n * - Click-outside-to-close functionality\n * - Full accessibility support with ARIA attributes\n * - Keyboard navigation support (ESC to close)\n * - Extensible styling with Container props\n *\n * @example\n * Basic usage:\n * ```jsx\n * <Modal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)}>\n * <p>Modal content goes here</p>\n * </Modal>\n * ```\n *\n * @example\n * With title and close button:\n * ```jsx\n * <Modal\n * isOpen={isOpen}\n * onClose={onClose}\n * title=\"Confirm Action\"\n * hasCloseButton\n * size={ModalSize.LG}\n * >\n * <div>\n * <p>Are you sure you want to continue?</p>\n * <Button onClick={onConfirm}>Confirm</Button>\n * </div>\n * </Modal>\n * ```\n *\n * @example\n * Custom container and styling:\n * ```jsx\n * <Modal\n * isOpen={isOpen}\n * onClose={onClose}\n * container={customContainer}\n * background=\"card\"\n * padding=\"lg\"\n * border=\"default\"\n * >\n * Content with custom styling\n * </Modal>\n * ```\n *\n * Accessibility Notes:\n * - Modal receives focus when opened\n * - Background content is hidden from screen readers when modal is open\n * - ESC key closes modal (handled by browser for role=\"dialog\")\n * - Click outside modal closes it\n * - Close button has descriptive label for screen readers\n *\n * @param props - Modal component props\n * @returns JSX element rendered via createPortal\n */\nexport const Modal: FC<ModalProps> = ({\n children,\n isOpen,\n container,\n onClose,\n hasCloseButton = false,\n title,\n size = ModalSize.MD,\n className,\n isScrollable = false, // Enable the scroll of the content\n disableScroll = true, // Disable the scroll of the background\n padding = 'none', // Extract padding here\n ...props\n}) => {\n const containerElement = useGetElementOrWindow(container);\n\n useScrollBlockage({ key: 'modal', disableScroll: isOpen && disableScroll });\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen && onClose) {\n onClose();\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen, onClose]);\n\n if (!containerElement) return <></>;\n\n const hasTitle = Boolean(title);\n\n // Determine the class for the inner content based on the padding prop\n const contentPaddingClass =\n contentPaddingVariants[\n (padding as keyof typeof contentPaddingVariants) || 'none'\n ];\n\n return createPortal(\n <m.div\n className=\"invisible fixed top-0 left-0 z-50 flex size-full cursor-pointer items-center justify-center overflow-hidden bg-background/40 backdrop-blur\"\n animate={isOpen ? 'visible' : 'invisible'}\n variants={{\n visible: {\n opacity: 1,\n visibility: 'visible',\n transition: { duration: 0.1, when: 'beforeChildren' },\n },\n invisible: {\n opacity: 0,\n visibility: 'hidden',\n transition: { duration: 0.1, when: 'afterChildren' },\n },\n }}\n onClick={(e) => {\n e.stopPropagation();\n onClose?.();\n }}\n aria-hidden={!isOpen}\n >\n <MotionModal\n onClick={(e) => e.stopPropagation()}\n initial={{ scale: isOpen ? 0.5 : 1 }}\n animate={{ scale: isOpen ? 1 : 0.5 }}\n transition={{ duration: 0.3 }}\n className={modalVariants({ size, className })}\n role=\"dialog\"\n aria-modal\n roundedSize=\"4xl\"\n // Force the outer container to have no padding so scrollbars hit the edge\n padding=\"none\"\n {...props}\n >\n {/* HEADER SECTION */}\n <div\n className={cn(\n 'relative flex-none px-4 pt-4',\n hasCloseButton && hasTitle\n ? `flex items-start`\n : hasCloseButton\n ? `flex justify-end`\n : hasTitle\n ? `items-center`\n : `hidden`\n )}\n >\n {hasTitle && (\n <H3 className=\"mb-2 ml-1 flex items-center justify-center font-bold text-lg\">\n {title}\n </H3>\n )}\n {hasCloseButton && (\n <Button\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n label=\"Close modal\"\n className=\"ml-auto\"\n onClick={(e) => {\n e.stopPropagation();\n onClose?.();\n }}\n Icon={X}\n size={ButtonSize.ICON_MD}\n />\n )}\n </div>\n\n {/* SCROLLABLE WRAPPER - Full width, no padding */}\n <div\n className={cn(\n 'flex min-h-0 w-full flex-1 flex-col',\n // Scrollbars will now appear at the very edge of this div (the modal edge)\n isScrollable === true && 'overflow-auto',\n isScrollable === 'y' && 'overflow-y-auto overflow-x-hidden',\n isScrollable === 'x' && 'overflow-x-auto overflow-y-hidden',\n !isScrollable && 'overflow-visible'\n )}\n >\n {/* CONTENT PADDING WRAPPER */}\n {/* We apply the padding class here, effectively putting content inside the scroll area */}\n <div\n className={cn(\n 'flex h-full w-full flex-1 flex-col',\n contentPaddingClass\n )}\n >\n {children}\n </div>\n </div>\n </MotionModal>\n </m.div>,\n containerElement\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAgBA,IAAY,YAAL;AACL;AACA;AACA;AACA;AACA;;KACD;AA4BD,MAAM,gBAAgB,IACpB,0DACA;CACE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,OAAO;EACR,EACF;CACD,iBAAiB,EACf,MAAM,SACP;CACF,CACF;AAGD,MAAM,yBAAyB;CAC7B,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACR;AAED,MAAM,cAAcA,OAAE,OAAO,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqEvC,MAAa,SAAyB,EACpC,UACA,QACA,WACA,SACA,iBAAiB,OACjB,OACA,aACA,WACA,eAAe,OACf,gBAAgB,MAChB,UAAU,QACV,GAAG,YACC;CACJ,MAAM,mBAAmB,sBAAsB,UAAU;AAEzD,mBAAkB;EAAE,KAAK;EAAS,eAAe,UAAU;EAAe,CAAC;AAE3E,iBAAgB;EACd,MAAM,gBAAgB,UAAyB;AAC7C,OAAI,MAAM,QAAQ,YAAY,UAAU,QACtC,UAAS;;AAGb,WAAS,iBAAiB,WAAW,aAAa;AAClD,eAAa;AACX,YAAS,oBAAoB,WAAW,aAAa;;IAEtD,CAAC,QAAQ,QAAQ,CAAC;AAErB,KAAI,CAAC,iBAAkB,QAAO,kCAAK;CAEnC,MAAM,WAAW,QAAQ,MAAM;CAG/B,MAAM,sBACJ,uBACG,WAAmD;AAGxD,QAAO,aACL,oBAACA,OAAE,KAAH;EACE,WAAU;EACV,SAAS,SAAS,YAAY;EAC9B,UAAU;GACR,SAAS;IACP,SAAS;IACT,YAAY;IACZ,YAAY;KAAE,UAAU;KAAK,MAAM;KAAkB;IACtD;GACD,WAAW;IACT,SAAS;IACT,YAAY;IACZ,YAAY;KAAE,UAAU;KAAK,MAAM;KAAiB;IACrD;GACF;EACD,UAAU,MAAM;AACd,KAAE,iBAAiB;AACnB,cAAW;;EAEb,eAAa,CAAC;YAEd,qBAAC,aAAD;GACE,UAAU,MAAM,EAAE,iBAAiB;GACnC,SAAS,EAAE,OAAO,SAAS,KAAM,GAAG;GACpC,SAAS,EAAE,OAAO,SAAS,IAAI,IAAK;GACpC,YAAY,EAAE,UAAU,IAAK;GAC7B,WAAW,cAAc;IAAE;IAAM;IAAW,CAAC;GAC7C,MAAK;GACL;GACA,aAAY;GAEZ,SAAQ;GACR,GAAI;aAXN,CAcE,qBAAC,OAAD;IACE,WAAW,GACT,gCACA,kBAAkB,WACd,qBACA,iBACE,qBACA,WACE,iBACA,SACT;cAVH,CAYG,YACC,oBAAC,IAAD;KAAI,WAAU;eACX;KACE,GAEN,kBACC,oBAAC,QAAD;KACE;KACA;KACA,OAAM;KACN,WAAU;KACV,UAAU,MAAM;AACd,QAAE,iBAAiB;AACnB,iBAAW;;KAEb,MAAM;KACN;KACA,EAEA;OAGN,oBAAC,OAAD;IACE,WAAW,GACT,uCAEA,iBAAiB,QAAQ,iBACzB,iBAAiB,OAAO,qCACxB,iBAAiB,OAAO,qCACxB,CAAC,gBAAgB,mBAClB;cAID,oBAAC,OAAD;KACE,WAAW,GACT,sCACA,oBACD;KAEA;KACG;IACF,EACM;;EACR,GACR,iBACD"}
1
+ {"version":3,"file":"Modal.mjs","names":["m"],"sources":["../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["'use client';\n\nimport { useGetElementOrWindow, useScrollBlockage } from '@hooks/index';\nimport { cn } from '@utils/cn';\nimport { cva } from 'class-variance-authority';\nimport { motion as m } from 'framer-motion';\nimport { X } from 'lucide-react';\nimport { type FC, type ReactNode, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, ButtonColor, ButtonSize, ButtonVariant } from '../Button';\nimport { Container, type ContainerProps } from '../Container';\nimport { H3 } from '../Headers';\n\n/**\n * Enumeration of available modal sizes\n */\nexport enum ModalSize {\n SM = 'sm',\n MD = 'md',\n LG = 'lg',\n XL = 'xl',\n UNSET = 'unset',\n}\n\ntype ModalProps = {\n children: ReactNode;\n isOpen: boolean;\n onClose?: () => void;\n container?: HTMLElement;\n disableScroll?: boolean;\n hasCloseButton?: boolean;\n title?: ReactNode;\n size?: ModalSize | `${ModalSize}`;\n /**\n * Defines if the modal content area is scrollable.\n */\n isScrollable?: boolean | 'x' | 'y';\n} & Partial<\n Pick<\n ContainerProps,\n | 'className'\n | 'transparency'\n | 'border'\n | 'background'\n | 'roundedSize'\n | 'borderColor'\n | 'padding'\n | 'separator'\n | 'gap'\n >\n>;\n\nconst modalVariants = cva(\n 'flex cursor-default flex-col overflow-hidden shadow-sm',\n {\n variants: {\n size: {\n sm: 'h-auto max-h-[30vh] w-[95vw] max-w-xl',\n md: 'h-auto max-h-[50vh] w-[95vw] max-w-xl',\n lg: 'h-auto max-h-[70vh] w-[95vw] max-w-4xl',\n xl: 'h-auto max-h-[95vh] w-[95vw] max-w-6xl',\n unset: 'h-auto max-h-[95vh] w-[95vw]',\n },\n },\n defaultVariants: {\n size: 'unset',\n },\n }\n);\n\n// Mapped from Container/index.tsx to apply internally\nconst contentPaddingVariants = {\n none: 'p-0',\n sm: 'px-2 py-4',\n md: 'px-4 py-6',\n lg: 'px-6 py-8',\n xl: 'px-8 py-10',\n '2xl': 'px-10 py-12',\n};\n\nconst MotionModal = m.create(Container);\n\n/**\n * Modal Component\n *\n * A highly customizable modal dialog component with portal rendering, Framer Motion animations,\n * and comprehensive accessibility features. Supports multiple size variants and scroll management.\n *\n * Features:\n * - Portal rendering to any container element (defaults to document.body)\n * - Smooth animations with Framer Motion\n * - Size variants: SM, MD, LG, XL, UNSET with responsive sizing\n * - Optional title and close button\n * - Background scroll prevention\n * - Click-outside-to-close functionality\n * - Full accessibility support with ARIA attributes\n * - Keyboard navigation support (ESC to close)\n * - Extensible styling with Container props\n *\n * @example\n * Basic usage:\n * ```jsx\n * <Modal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)}>\n * <p>Modal content goes here</p>\n * </Modal>\n * ```\n *\n * @example\n * With title and close button:\n * ```jsx\n * <Modal\n * isOpen={isOpen}\n * onClose={onClose}\n * title=\"Confirm Action\"\n * hasCloseButton\n * size={ModalSize.LG}\n * >\n * <div>\n * <p>Are you sure you want to continue?</p>\n * <Button onClick={onConfirm}>Confirm</Button>\n * </div>\n * </Modal>\n * ```\n *\n * @example\n * Custom container and styling:\n * ```jsx\n * <Modal\n * isOpen={isOpen}\n * onClose={onClose}\n * container={customContainer}\n * background=\"card\"\n * padding=\"lg\"\n * border=\"default\"\n * >\n * Content with custom styling\n * </Modal>\n * ```\n *\n * Accessibility Notes:\n * - Modal receives focus when opened\n * - Background content is hidden from screen readers when modal is open\n * - ESC key closes modal (handled by browser for role=\"dialog\")\n * - Click outside modal closes it\n * - Close button has descriptive label for screen readers\n *\n * @param props - Modal component props\n * @returns JSX element rendered via createPortal\n */\nexport const Modal: FC<ModalProps> = ({\n children,\n isOpen,\n container,\n onClose,\n hasCloseButton = false,\n title,\n size = ModalSize.MD,\n className,\n isScrollable = false, // Enable the scroll of the content\n disableScroll = true, // Disable the scroll of the background\n padding = 'none', // Extract padding here\n ...props\n}) => {\n const containerElement = useGetElementOrWindow(container);\n\n useScrollBlockage({ key: 'modal', disableScroll: isOpen && disableScroll });\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen && onClose) {\n onClose();\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen, onClose]);\n\n if (!containerElement) return <></>;\n\n const hasTitle = Boolean(title);\n\n // Determine the class for the inner content based on the padding prop\n const contentPaddingClass =\n contentPaddingVariants[\n (padding as keyof typeof contentPaddingVariants) || 'none'\n ];\n\n return createPortal(\n <m.div\n className=\"invisible fixed top-0 left-0 z-50 flex size-full cursor-pointer items-center justify-center overflow-hidden bg-background/40 backdrop-blur\"\n animate={isOpen ? 'visible' : 'invisible'}\n variants={{\n visible: {\n opacity: 1,\n visibility: 'visible',\n transition: { duration: 0.1, when: 'beforeChildren' },\n },\n invisible: {\n opacity: 0,\n visibility: 'hidden',\n transition: { duration: 0.1, when: 'afterChildren' },\n },\n }}\n onClick={(e) => {\n e.stopPropagation();\n onClose?.();\n }}\n aria-hidden={!isOpen}\n >\n <MotionModal\n onClick={(e) => e.stopPropagation()}\n initial={{ scale: isOpen ? 0.5 : 1 }}\n animate={{ scale: isOpen ? 1 : 0.5 }}\n transition={{ duration: 0.3 }}\n className={modalVariants({ size, className })}\n role=\"dialog\"\n aria-modal\n roundedSize=\"4xl\"\n // Force the outer container to have no padding so scrollbars hit the edge\n padding=\"none\"\n {...props}\n >\n {/* HEADER SECTION */}\n <div\n className={cn(\n 'relative flex-none px-4 pt-4',\n hasCloseButton && hasTitle\n ? `flex items-start`\n : hasCloseButton\n ? `flex justify-end`\n : hasTitle\n ? `items-center`\n : `hidden`\n )}\n >\n {hasTitle && (\n <H3 className=\"mb-2 ml-1 flex items-center justify-center font-bold text-lg\">\n {title}\n </H3>\n )}\n {hasCloseButton && (\n <Button\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n label=\"Close modal\"\n className=\"ml-auto\"\n onClick={(e) => {\n e.stopPropagation();\n onClose?.();\n }}\n Icon={X}\n size={ButtonSize.ICON_MD}\n />\n )}\n </div>\n\n {/* SCROLLABLE WRAPPER - Full width, no padding */}\n <div\n className={cn(\n 'flex min-h-0 w-full flex-1 flex-col',\n // Scrollbars will now appear at the very edge of this div (the modal edge)\n isScrollable === true && 'overflow-auto',\n isScrollable === 'y' && 'overflow-y-auto overflow-x-hidden',\n isScrollable === 'x' && 'overflow-x-auto overflow-y-hidden',\n !isScrollable && 'overflow-visible'\n )}\n >\n {/* CONTENT PADDING WRAPPER */}\n {/* We apply the padding class here, effectively putting content inside the scroll area */}\n <div\n className={cn(\n 'flex h-full w-full flex-1 flex-col',\n contentPaddingClass\n )}\n >\n {children}\n </div>\n </div>\n </MotionModal>\n </m.div>,\n containerElement\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAgBA,IAAY,YAAL;AACL;AACA;AACA;AACA;AACA;;KACD;AA8BD,MAAM,gBAAgB,IACpB,0DACA;CACE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,OAAO;EACR,EACF;CACD,iBAAiB,EACf,MAAM,SACP;CACF,CACF;AAGD,MAAM,yBAAyB;CAC7B,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACR;AAED,MAAM,cAAcA,OAAE,OAAO,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqEvC,MAAa,SAAyB,EACpC,UACA,QACA,WACA,SACA,iBAAiB,OACjB,OACA,aACA,WACA,eAAe,OACf,gBAAgB,MAChB,UAAU,QACV,GAAG,YACC;CACJ,MAAM,mBAAmB,sBAAsB,UAAU;AAEzD,mBAAkB;EAAE,KAAK;EAAS,eAAe,UAAU;EAAe,CAAC;AAE3E,iBAAgB;EACd,MAAM,gBAAgB,UAAyB;AAC7C,OAAI,MAAM,QAAQ,YAAY,UAAU,QACtC,UAAS;;AAGb,WAAS,iBAAiB,WAAW,aAAa;AAClD,eAAa;AACX,YAAS,oBAAoB,WAAW,aAAa;;IAEtD,CAAC,QAAQ,QAAQ,CAAC;AAErB,KAAI,CAAC,iBAAkB,QAAO,kCAAK;CAEnC,MAAM,WAAW,QAAQ,MAAM;CAG/B,MAAM,sBACJ,uBACG,WAAmD;AAGxD,QAAO,aACL,oBAACA,OAAE,KAAH;EACE,WAAU;EACV,SAAS,SAAS,YAAY;EAC9B,UAAU;GACR,SAAS;IACP,SAAS;IACT,YAAY;IACZ,YAAY;KAAE,UAAU;KAAK,MAAM;KAAkB;IACtD;GACD,WAAW;IACT,SAAS;IACT,YAAY;IACZ,YAAY;KAAE,UAAU;KAAK,MAAM;KAAiB;IACrD;GACF;EACD,UAAU,MAAM;AACd,KAAE,iBAAiB;AACnB,cAAW;;EAEb,eAAa,CAAC;YAEd,qBAAC,aAAD;GACE,UAAU,MAAM,EAAE,iBAAiB;GACnC,SAAS,EAAE,OAAO,SAAS,KAAM,GAAG;GACpC,SAAS,EAAE,OAAO,SAAS,IAAI,IAAK;GACpC,YAAY,EAAE,UAAU,IAAK;GAC7B,WAAW,cAAc;IAAE;IAAM;IAAW,CAAC;GAC7C,MAAK;GACL;GACA,aAAY;GAEZ,SAAQ;GACR,GAAI;aAXN,CAcE,qBAAC,OAAD;IACE,WAAW,GACT,gCACA,kBAAkB,WACd,qBACA,iBACE,qBACA,WACE,iBACA,SACT;cAVH,CAYG,YACC,oBAAC,IAAD;KAAI,WAAU;eACX;KACE,GAEN,kBACC,oBAAC,QAAD;KACE;KACA;KACA,OAAM;KACN,WAAU;KACV,UAAU,MAAM;AACd,QAAE,iBAAiB;AACnB,iBAAW;;KAEb,MAAM;KACN;KACA,EAEA;OAGN,oBAAC,OAAD;IACE,WAAW,GACT,uCAEA,iBAAiB,QAAQ,iBACzB,iBAAiB,OAAO,qCACxB,iBAAiB,OAAO,qCACxB,CAAC,gBAAgB,mBAClB;cAID,oBAAC,OAAD;KACE,WAAW,GACT,sCACA,oBACD;KAEA;KACG;IACF,EACM;;EACR,GACR,iBACD"}
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../utils/cn.mjs";
4
- import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
5
4
  import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
6
5
  import { useScrollDetection } from "../../hooks/useScrollDetection.mjs";
6
+ import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
7
7
  import { Burger } from "./Burger.mjs";
8
8
  import { useRef, useState } from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../utils/cn.mjs";
4
- import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
5
4
  import { useItemSelector } from "../../hooks/useItemSelector.mjs";
5
+ import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
6
6
  import { useEffect, useRef } from "react";
7
7
  import { cva } from "class-variance-authority";
8
8
  import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
 
3
+ import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
4
+ import { useDevice } from "../../hooks/useDevice.mjs";
5
+ import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
3
6
  import { Container } from "../Container/index.mjs";
4
7
  import { Button, ButtonColor, ButtonSize, ButtonVariant } from "../Button/Button.mjs";
5
- import { useDevice } from "../../hooks/useDevice.mjs";
6
8
  import { KeyboardShortcut } from "../KeyboardShortcut/KeyboardShortcut.mjs";
7
9
  import { Popover } from "../Popover/dynamic.mjs";
8
- import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
9
- import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
10
10
  import { MaxWidthSmoother } from "../MaxWidthSmoother/index.mjs";
11
11
  import { isElementAtTopAndNotCovered } from "./isElementAtTopAndNotCovered.mjs";
12
12
  import { useRightDrawer } from "./useRightDrawer.mjs";
@@ -1,22 +1,22 @@
1
- import { calculateIsMobile, checkIsIOS, checkIsIphoneOrSafariDevice, checkIsMac, checkIsMobileScreen, checkIsMobileUserAgent, getBreakpointFromSize, useDevice } from "./useDevice.mjs";
2
- import { useItemSelector } from "./useItemSelector.mjs";
1
+ import { useKeyboardDetector } from "./useKeyboardDetector.mjs";
2
+ import { useGetElementOrWindow } from "./useGetElementOrWindow.mjs";
3
+ import { useScrollY } from "./useScrollY.mjs";
3
4
  import { usePersistedStore } from "./usePersistedStore.mjs";
5
+ import { useHorizontalSwipe } from "./useHorizontalSwipe.mjs";
6
+ import { useItemSelector } from "./useItemSelector.mjs";
7
+ import { calculateIsMobile, checkIsIOS, checkIsIphoneOrSafariDevice, checkIsMac, checkIsMobileScreen, checkIsMobileUserAgent, getBreakpointFromSize, useDevice } from "./useDevice.mjs";
4
8
  import { useOAuth2 } from "./useAuth/useOAuth2.mjs";
5
9
  import { useSession } from "./useAuth/useSession.mjs";
6
10
  import { useAuth } from "./useAuth/useAuth.mjs";
7
11
  import { useIntlayerAuth, useIntlayerOAuth } from "./useIntlayerAPI.mjs";
8
12
  import { useAddDictionary, useAddNewAccessKey, useAddOrganization, useAddOrganizationMember, useAddPasskey, useAddProject, useAddTag, useAppQuery, useAskDocQuestion, useAskResetPassword, useAuditContentDeclaration, useAuditContentDeclarationField, useAuditContentDeclarationMetadata, useAuditScan, useAuditTag, useAutocomplete, useBitbucketAuth, useBitbucketCheckConfig, useBitbucketGetConfigFile, useBitbucketRepos, useCancelSubscription, useChangePassword, useCreatePortalSession, useCreateUser, useDeleteAccessKey, useDeleteDictionary, useDeleteOrganization, useDeletePasskey, useDeleteProject, useDeleteSSOProvider, useDeleteShowcaseProject, useDeleteTag, useDeleteUser, useDisableTwoFactor, useEnableTwoFactor, useFillAllTranslations, useGetCIConfig, useGetDictionaries, useGetDictionariesKeys, useGetDictionary, useGetDiscussions, useGetDiscussionsData, useGetEditorDictionaries, useGetInvoices, useGetNewsletterStatus, useGetOrganizations, useGetOtherShowcaseProjects, useGetPaymentMethod, useGetPricing, useGetProjects, useGetRecursiveAuditStatus, useGetShowcaseProjectById, useGetShowcaseProjects, useGetSubscription, useGetTags, useGetUserByAccount, useGetUserById, useGetUsers, useGetVerifyEmailStatus, useGithubAuth, useGithubCheckConfig, useGithubGetAuthUrl, useGithubGetConfigFile, useGithubRepos, useGitlabAuth, useGitlabCheckConfig, useGitlabGetConfigFile, useGitlabProjects, useInfiniteGetDictionaries, useListPasskeys, useListSSOProviders, useLogin, useLogout, usePauseTranslationJob, usePushCIConfig, usePushDictionaries, useQueryClient, useRefreshAccessKey, useRegister, useRegisterSSO, useResetPassword, useResumeTranslationJob, useSearchDoc, useSelectOrganization, useSelectProject, useSignInMagicLink, useSignInPasskey, useSignInSSO, useStartRecursiveAudit, useStopTranslationJob, useSubmitShowcaseProject, useSubscribeToNewsletter, useToggleShowcaseDownvote, useToggleShowcaseUpvote, useTranslateJSONDeclaration, useTriggerBuild, useTriggerWebhook, useUnselectOrganization, useUnselectProject, useUnsubscribeFromNewsletter, useUpdateDictionary, useUpdateOrganization, useUpdateOrganizationMembers, useUpdateOrganizationMembersById, useUpdateProject, useUpdateProjectMembers, useUpdateShowcaseProject, useUpdateTag, useUpdateUser, useVerifyBackupCode, useVerifyEmail, useVerifyTotp, useWriteDictionary } from "./reactQuery.mjs";
9
- import { useUser } from "./useUser/index.mjs";
10
- import { useHorizontalSwipe } from "./useHorizontalSwipe.mjs";
13
+ import { useSearch } from "./useSearch.mjs";
14
+ import { useIsMounted } from "./useIsMounted.mjs";
11
15
  import { useGetElementById } from "./useGetElementById.mjs";
12
- import { useGetElementOrWindow } from "./useGetElementOrWindow.mjs";
13
16
  import { useIsDarkMode } from "./useIsDarkMode.mjs";
14
- import { useIsMounted } from "./useIsMounted.mjs";
15
- import { useKeyboardDetector } from "./useKeyboardDetector.mjs";
16
17
  import { useScreenWidth } from "./useScreenWidth.mjs";
17
18
  import { useScrollBlockage } from "./useScrollBlockage/index.mjs";
18
19
  import { useScrollDetection } from "./useScrollDetection.mjs";
19
- import { useScrollY } from "./useScrollY.mjs";
20
- import { useSearch } from "./useSearch.mjs";
20
+ import { useUser } from "./useUser/index.mjs";
21
21
 
22
22
  export { calculateIsMobile, checkIsIOS, checkIsIphoneOrSafariDevice, checkIsMac, checkIsMobileScreen, checkIsMobileUserAgent, getBreakpointFromSize, useAddDictionary, useAddNewAccessKey, useAddOrganization, useAddOrganizationMember, useAddPasskey, useAddProject, useAddTag, useAppQuery, useAskDocQuestion, useAskResetPassword, useAuditContentDeclaration, useAuditContentDeclarationField, useAuditContentDeclarationMetadata, useAuditScan, useAuditTag, useAuth, useAutocomplete, useBitbucketAuth, useBitbucketCheckConfig, useBitbucketGetConfigFile, useBitbucketRepos, useCancelSubscription, useChangePassword, useCreatePortalSession, useCreateUser, useDeleteAccessKey, useDeleteDictionary, useDeleteOrganization, useDeletePasskey, useDeleteProject, useDeleteSSOProvider, useDeleteShowcaseProject, useDeleteTag, useDeleteUser, useDevice, useDisableTwoFactor, useEnableTwoFactor, useFillAllTranslations, useGetCIConfig, useGetDictionaries, useGetDictionariesKeys, useGetDictionary, useGetDiscussions, useGetDiscussionsData, useGetEditorDictionaries, useGetElementById, useGetElementOrWindow, useGetInvoices, useGetNewsletterStatus, useGetOrganizations, useGetOtherShowcaseProjects, useGetPaymentMethod, useGetPricing, useGetProjects, useGetRecursiveAuditStatus, useGetShowcaseProjectById, useGetShowcaseProjects, useGetSubscription, useGetTags, useGetUserByAccount, useGetUserById, useGetUsers, useGetVerifyEmailStatus, useGithubAuth, useGithubCheckConfig, useGithubGetAuthUrl, useGithubGetConfigFile, useGithubRepos, useGitlabAuth, useGitlabCheckConfig, useGitlabGetConfigFile, useGitlabProjects, useHorizontalSwipe, useInfiniteGetDictionaries, useIntlayerAuth, useIntlayerOAuth, useIsDarkMode, useIsMounted, useItemSelector, useKeyboardDetector, useListPasskeys, useListSSOProviders, useLogin, useLogout, useOAuth2, usePauseTranslationJob, usePersistedStore, usePushCIConfig, usePushDictionaries, useQueryClient, useRefreshAccessKey, useRegister, useRegisterSSO, useResetPassword, useResumeTranslationJob, useScreenWidth, useScrollBlockage, useScrollDetection, useScrollY, useSearch, useSearchDoc, useSelectOrganization, useSelectProject, useSession, useSignInMagicLink, useSignInPasskey, useSignInSSO, useStartRecursiveAudit, useStopTranslationJob, useSubmitShowcaseProject, useSubscribeToNewsletter, useToggleShowcaseDownvote, useToggleShowcaseUpvote, useTranslateJSONDeclaration, useTriggerBuild, useTriggerWebhook, useUnselectOrganization, useUnselectProject, useUnsubscribeFromNewsletter, useUpdateDictionary, useUpdateOrganization, useUpdateOrganizationMembers, useUpdateOrganizationMembersById, useUpdateProject, useUpdateProjectMembers, useUpdateShowcaseProject, useUpdateTag, useUpdateUser, useUser, useVerifyBackupCode, useVerifyEmail, useVerifyTotp, useWriteDictionary };
@@ -43,8 +43,8 @@ declare enum BadgeSize {
43
43
  * @description Defines the styling variants for different badge combinations
44
44
  */
45
45
  declare const badgeVariants: (props?: {
46
- color?: "text" | "error" | "custom" | "primary" | "secondary" | "destructive" | "neutral" | "light" | "dark" | "success";
47
- variant?: "none" | "default" | "hoverable" | "outline";
46
+ color?: "text" | "error" | "custom" | "primary" | "secondary" | "destructive" | "success" | "neutral" | "light" | "dark";
47
+ variant?: "none" | "default" | "outline" | "hoverable";
48
48
  size?: "sm" | "md" | "lg";
49
49
  } & _$class_variance_authority_types0.ClassProp) => string;
50
50
  /**
@@ -61,10 +61,10 @@ declare enum ButtonTextAlign {
61
61
  */
62
62
  declare const buttonVariants: (props?: {
63
63
  size?: "sm" | "md" | "lg" | "xl" | "icon-sm" | "icon-md" | "icon-lg" | "icon-xl";
64
- color?: "text" | "error" | "custom" | "primary" | "secondary" | "destructive" | "neutral" | "light" | "dark" | "text-inverse" | "success" | "card" | "current";
64
+ color?: "text" | "error" | "custom" | "primary" | "secondary" | "destructive" | "success" | "neutral" | "light" | "dark" | "text-inverse" | "card" | "current";
65
65
  roundedSize?: "sm" | "md" | "lg" | "xl" | "2xl" | "none" | "3xl" | "full" | "4xl" | "5xl";
66
- variant?: "none" | "default" | "input" | "invisible-link" | "hoverable" | "outline" | "link" | "fade";
67
- textAlign?: "left" | "right" | "center";
66
+ variant?: "none" | "default" | "input" | "outline" | "hoverable" | "invisible-link" | "link" | "fade";
67
+ textAlign?: "left" | "center" | "right";
68
68
  isFullWidth?: boolean;
69
69
  } & _$class_variance_authority_types0.ClassProp) => string;
70
70
  /**
@@ -29,7 +29,7 @@ declare const Command: {
29
29
  ref?: React.Ref<HTMLInputElement>;
30
30
  } & {
31
31
  asChild?: boolean;
32
- }, "key" | keyof _$react.InputHTMLAttributes<HTMLInputElement> | "asChild">, "type" | "onChange" | "value"> & {
32
+ }, "key" | "asChild" | keyof _$react.InputHTMLAttributes<HTMLInputElement>>, "type" | "onChange" | "value"> & {
33
33
  value?: string;
34
34
  onValueChange?: (search: string) => void;
35
35
  } & _$react.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,13 @@
1
+ import { NodeWrapperProps } from "./index.js";
2
+ import { FC } from "react";
3
+ import { PluralContent } from "@intlayer/core/transpiler";
4
+ import { ContentNode } from "@intlayer/types/dictionary";
5
+
6
+ //#region src/components/DictionaryEditor/NodeWrapper/PluralWrapper.d.ts
7
+ type PluralWrapperProps = Omit<NodeWrapperProps, 'section'> & {
8
+ section: PluralContent<ContentNode>;
9
+ };
10
+ declare const PluralWrapper: FC<PluralWrapperProps>;
11
+ //#endregion
12
+ export { PluralWrapper };
13
+ //# sourceMappingURL=PluralWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluralWrapper.d.ts","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/PluralWrapper.tsx"],"mappings":";;;;;;KAOK,kBAAA,GAAqB,IAAA,CAAK,gBAAA;EAC7B,OAAA,EAAS,aAAA,CAAc,WAAA;AAAA;AAAA,cAGZ,aAAA,EAAe,EAAA,CAAG,kBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"mappings":";;;;;;cAkCa,SAAA;AAAA,KAED,gBAAA;EACV,OAAA,EAAS,OAAA;EACT,UAAA,EAAY,UAAA;EACZ,OAAA,EAAS,WAAA;EACT,eAAA,GAAkB,OAAA;IAAW,OAAA,EAAS,OAAA;IAAW,QAAA;EAAA;EACjD,MAAA,EAAQ,MAAA;EACR,aAAA,EAAe,WAAA;EACf,cAAA,EAAgB,OAAA;EAChB,cAAA,GAAiB,OAAA,EAAS,OAAA;EAC1B,WAAA,IAAe,OAAA,EAAS,OAAA;EACxB,aAAA,IAAiB,OAAA,aAAoB,SAAA;AAAA;AAAA,cAG1B,WAAA,EAAa,EAAA,CAAG,gBAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"mappings":";;;;;;cAoCa,SAAA;AAAA,KAED,gBAAA;EACV,OAAA,EAAS,OAAA;EACT,UAAA,EAAY,UAAA;EACZ,OAAA,EAAS,WAAA;EACT,eAAA,GAAkB,OAAA;IAAW,OAAA,EAAS,OAAA;IAAW,QAAA;EAAA;EACjD,MAAA,EAAQ,MAAA;EACR,aAAA,EAAe,WAAA;EACf,cAAA,EAAgB,OAAA;EAChB,cAAA,GAAiB,OAAA,EAAS,OAAA;EAC1B,WAAA,IAAe,OAAA,EAAS,OAAA;EACxB,aAAA,IAAiB,OAAA,aAAoB,SAAA;AAAA;AAAA,cAG1B,WAAA,EAAa,EAAA,CAAG,gBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"StructureView.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/StructureView/StructureView.tsx"],"mappings":";;;;;;KAqJK,gBAAA;EACH,UAAA;EACA,iBAAA,EAAmB,iBAAA;EACnB,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,aAAA;AAAA;AAAA,cAGE,QAAA,EAAU,EAAA,CAAG,gBAAA;AAAA,KAgFrB,eAAA;EACH,iBAAA,EAAmB,iBAAA;EACnB,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,aAAA;AAAA;AAAA,cAGE,UAAA,EAAY,EAAA,CAAG,eAAA;AAAA,KAqDvB,kBAAA;EACH,iBAAA,EAAmB,iBAAA;EACnB,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,aAAA;AAAA;AAAA,cAGE,aAAA,EAAe,EAAA,CAAG,kBAAA"}
1
+ {"version":3,"file":"StructureView.d.ts","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/StructureView/StructureView.tsx"],"mappings":";;;;;;KAsJK,gBAAA;EACH,UAAA;EACA,iBAAA,EAAmB,iBAAA;EACnB,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,aAAA;AAAA;AAAA,cAGE,QAAA,EAAU,EAAA,CAAG,gBAAA;AAAA,KAgFrB,eAAA;EACH,iBAAA,EAAmB,iBAAA;EACnB,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,aAAA;AAAA;AAAA,cAGE,UAAA,EAAY,EAAA,CAAG,eAAA;AAAA,KAqDvB,kBAAA;EACH,iBAAA,EAAmB,iBAAA;EACnB,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,aAAA;AAAA;AAAA,cAGE,aAAA,EAAe,EAAA,CAAG,kBAAA"}
@@ -164,6 +164,26 @@ declare const nodeTypeSelectorContent: {
164
164
  vi: string;
165
165
  uk: string;
166
166
  }>;
167
+ plural: _$_intlayer_core_transpiler0.TranslationContent<unknown, {
168
+ en: string;
169
+ 'en-GB': string;
170
+ fr: string;
171
+ es: string;
172
+ de: string;
173
+ ja: string;
174
+ ko: string;
175
+ zh: string;
176
+ it: string;
177
+ pt: string;
178
+ hi: string;
179
+ ar: string;
180
+ ru: string;
181
+ tr: string;
182
+ pl: string;
183
+ id: string;
184
+ vi: string;
185
+ uk: string;
186
+ }>;
167
187
  gender: _$_intlayer_core_transpiler0.TranslationContent<unknown, {
168
188
  en: string;
169
189
  'en-GB': string;
@@ -1 +1 @@
1
- {"version":3,"file":"nodeTypeSelector.content.d.ts","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/nodeTypeSelector.content.ts"],"mappings":";;;cAEa,uBAAA;;;wBAoTS,4BAAA,CAAA,kBAAA"}
1
+ {"version":3,"file":"nodeTypeSelector.content.d.ts","names":[],"sources":["../../../../src/components/DictionaryFieldEditor/nodeTypeSelector.content.ts"],"mappings":";;;cAEa,uBAAA;;;wBAwUS,4BAAA,CAAA,kBAAA"}
@@ -6,7 +6,7 @@ import { VariantProps } from "class-variance-authority";
6
6
  declare const checkboxVariants: (props?: {
7
7
  variant?: "default";
8
8
  size?: "xs" | "sm" | "md" | "lg";
9
- color?: "error" | "success" | "text" | "custom" | "primary" | "secondary" | "destructive" | "neutral" | "light" | "dark";
9
+ color?: "error" | "success" | "text" | "custom" | "primary" | "secondary" | "neutral" | "destructive" | "light" | "dark";
10
10
  validationStyleEnabled?: "enabled" | "disabled";
11
11
  } & _$class_variance_authority_types0.ClassProp) => string;
12
12
  declare enum CheckboxSize {
@@ -53,9 +53,9 @@ declare enum LinkUnderlined {
53
53
  FALSE = "false"
54
54
  }
55
55
  declare const linkVariants: (props?: {
56
- variant?: "default" | "invisible-link" | "button" | "button-outlined" | "hoverable";
56
+ variant?: "default" | "hoverable" | "invisible-link" | "button" | "button-outlined";
57
57
  roundedSize?: "sm" | "md" | "lg" | "xl" | "2xl" | "none" | "3xl" | "full";
58
- color?: "text" | "error" | "custom" | "primary" | "secondary" | "destructive" | "neutral" | "light" | "dark" | "text-inverse" | "success";
58
+ color?: "text" | "error" | "custom" | "primary" | "secondary" | "destructive" | "success" | "neutral" | "light" | "dark" | "text-inverse";
59
59
  size?: "sm" | "md" | "lg" | "xl" | "custom";
60
60
  underlined?: boolean | LinkUnderlined.DEFAULT;
61
61
  } & _$class_variance_authority_types0.ClassProp) => string;
@@ -25,7 +25,7 @@ type ModalProps = {
25
25
  * Defines if the modal content area is scrollable.
26
26
  */
27
27
  isScrollable?: boolean | 'x' | 'y';
28
- } & Pick<ContainerProps, 'className' | 'transparency' | 'border' | 'background' | 'roundedSize' | 'borderColor' | 'padding' | 'separator' | 'gap'>;
28
+ } & Partial<Pick<ContainerProps, 'className' | 'transparency' | 'border' | 'background' | 'roundedSize' | 'borderColor' | 'padding' | 'separator' | 'gap'>>;
29
29
  /**
30
30
  * Modal Component
31
31
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","names":[],"sources":["../../../../src/components/Modal/Modal.tsx"],"mappings":";;;;;;AAgBA;aAAY,SAAA;EACV,EAAA;EACA,EAAA;EACA,EAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,KAGG,UAAA;EACH,QAAA,EAAU,SAAA;EACV,MAAA;EACA,OAAA;EACA,SAAA,GAAY,WAAA;EACZ,aAAA;EACA,cAAA;EACA,KAAA,GAAQ,SAAA;EACR,IAAA,GAAO,SAAA,MAAe,SAAA;EAAf;;;EAIP,YAAA;AAAA,IACE,IAAA,CACF,cAAA;;;;;;;;;;;;;;;;;;;;AA6GF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,KAAA,EAAO,EAAA,CAAG,UAAA"}
1
+ {"version":3,"file":"Modal.d.ts","names":[],"sources":["../../../../src/components/Modal/Modal.tsx"],"mappings":";;;;;;AAgBA;aAAY,SAAA;EACV,EAAA;EACA,EAAA;EACA,EAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,KAGG,UAAA;EACH,QAAA,EAAU,SAAA;EACV,MAAA;EACA,OAAA;EACA,SAAA,GAAY,WAAA;EACZ,aAAA;EACA,cAAA;EACA,KAAA,GAAQ,SAAA;EACR,IAAA,GAAO,SAAA,MAAe,SAAA;EAAf;;;EAIP,YAAA;AAAA,IACE,OAAA,CACF,IAAA,CACE,cAAA;;;;;;;;;;;;;;;;;;;;;;AA8GJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,KAAA,EAAO,EAAA,CAAG,UAAA"}
@@ -5,7 +5,7 @@ import { VariantProps } from "class-variance-authority";
5
5
  //#region src/components/Pagination/Pagination.d.ts
6
6
  declare const paginationVariants: (props?: {
7
7
  size?: "sm" | "md" | "lg";
8
- color?: "text" | "primary" | "secondary" | "destructive" | "neutral";
8
+ color?: "text" | "primary" | "secondary" | "neutral" | "destructive";
9
9
  variant?: "default" | "bordered" | "ghost";
10
10
  } & _$class_variance_authority_types0.ClassProp) => string;
11
11
  declare enum PaginationSize {
@@ -15,7 +15,7 @@ declare enum TabSelectorColor {
15
15
  TEXT = "text"
16
16
  }
17
17
  declare const tabSelectorVariant: (props?: {
18
- color?: "text" | "primary" | "secondary" | "destructive" | "neutral" | "light" | "dark";
18
+ color?: "text" | "primary" | "secondary" | "neutral" | "destructive" | "light" | "dark";
19
19
  } & _$class_variance_authority_types0.ClassProp) => string;
20
20
  type TabSelectorItemProps = HTMLAttributes<HTMLElement> & {
21
21
  key: string | number;
@@ -186,7 +186,7 @@ declare enum TagBackground {
186
186
  }
187
187
  declare const containerVariants: (props?: {
188
188
  roundedSize?: "sm" | "md" | "lg" | "xl" | "2xl" | "none" | "3xl" | "full";
189
- color?: "text" | "error" | "primary" | "neutral" | "success" | "warning" | "blue" | "yellow" | "green" | "red" | "orange" | "purple" | "pink" | "brown" | "gray" | "black" | "white";
189
+ color?: "text" | "error" | "primary" | "success" | "neutral" | "warning" | "blue" | "yellow" | "green" | "red" | "orange" | "purple" | "pink" | "brown" | "gray" | "black" | "white";
190
190
  size?: "xs" | "sm" | "md" | "lg" | "xl";
191
191
  border?: "none" | "with";
192
192
  background?: "none" | "with";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/design-system",
3
- "version": "8.7.13",
3
+ "version": "8.8.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": [
@@ -421,12 +421,12 @@
421
421
  "dependencies": {
422
422
  "@better-auth/passkey": "1.6.9",
423
423
  "@better-auth/sso": "1.6.9",
424
- "@intlayer/api": "8.7.13",
425
- "@intlayer/config": "8.7.13",
426
- "@intlayer/core": "8.7.13",
427
- "@intlayer/dictionaries-entry": "8.7.13",
428
- "@intlayer/editor-react": "8.7.13",
429
- "@intlayer/types": "8.7.13",
424
+ "@intlayer/api": "8.8.0",
425
+ "@intlayer/config": "8.8.0",
426
+ "@intlayer/core": "8.8.0",
427
+ "@intlayer/dictionaries-entry": "8.8.0",
428
+ "@intlayer/editor-react": "8.8.0",
429
+ "@intlayer/types": "8.8.0",
430
430
  "@radix-ui/react-dialog": "1.1.15",
431
431
  "@radix-ui/react-select": "2.2.6",
432
432
  "@radix-ui/react-slot": "1.2.4",
@@ -438,12 +438,12 @@
438
438
  "class-variance-authority": "0.7.1",
439
439
  "cmdk": "1.1.1",
440
440
  "defu": "6.1.7",
441
- "react-intlayer": "8.7.13",
441
+ "react-intlayer": "8.8.0",
442
442
  "rollup-preserve-directives": "1.1.3",
443
443
  "zod": "4.4.2"
444
444
  },
445
445
  "devDependencies": {
446
- "@intlayer/backend": "8.7.13",
446
+ "@intlayer/backend": "8.8.0",
447
447
  "@shikijs/transformers": "4.0.2",
448
448
  "@storybook/addon-a11y": "8.6.14",
449
449
  "@storybook/addon-essentials": "8.6.14",
@@ -473,7 +473,7 @@
473
473
  "@utils/ts-config-types": "1.0.4",
474
474
  "clsx": "2.1.1",
475
475
  "fast-glob": "3.3.3",
476
- "intlayer": "8.7.13",
476
+ "intlayer": "8.8.0",
477
477
  "rimraf": "6.1.3",
478
478
  "shiki": "4.0.2",
479
479
  "storybook": "8.6.17",
@@ -481,26 +481,26 @@
481
481
  "tsdown": "0.21.10",
482
482
  "typescript": "6.0.3",
483
483
  "vite": "8.0.10",
484
- "vite-intlayer": "8.7.13",
484
+ "vite-intlayer": "8.8.0",
485
485
  "vite-plugin-dts": "5.0.0",
486
486
  "vitest": "4.1.5"
487
487
  },
488
488
  "peerDependencies": {
489
489
  "@better-fetch/fetch": "1.1.21",
490
490
  "@hookform/resolvers": "5.2.2",
491
- "@intlayer/backend": "8.7.13",
491
+ "@intlayer/backend": "8.8.0",
492
492
  "@monaco-editor/react": "4.7.0",
493
493
  "@shikijs/transformers": "4.0.2",
494
494
  "@tanstack/react-query": "5.100.9",
495
495
  "@tanstack/react-query-devtools": "5.100.9",
496
496
  "framer-motion": "12.38.0",
497
497
  "fuse.js": "7.3.0",
498
- "intlayer": "8.7.13",
498
+ "intlayer": "8.8.0",
499
499
  "lucide-react": "1.14.0",
500
500
  "react": ">=16.0.0",
501
501
  "react-dom": ">=16.0.0",
502
502
  "react-hook-form": "7.75.0",
503
- "react-intlayer": "8.7.13",
503
+ "react-intlayer": "8.8.0",
504
504
  "shiki": "4.0.2",
505
505
  "tailwindcss": "4.2.4"
506
506
  },