payload-better-editor 1.2.2 → 1.3.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 (77) hide show
  1. package/dist/admin/ErrorBoundary.d.ts +1 -10
  2. package/dist/admin/ErrorBoundary.js +14 -5
  3. package/dist/admin/ErrorBoundary.js.map +1 -1
  4. package/dist/admin/LiveEditorOverlay.js +4 -2
  5. package/dist/admin/LiveEditorOverlay.js.map +1 -1
  6. package/dist/admin/LiveEditorToggle.d.ts +2 -0
  7. package/dist/admin/LiveEditorToggle.js +14 -9
  8. package/dist/admin/LiveEditorToggle.js.map +1 -1
  9. package/dist/admin/PreviewFrame.js +6 -4
  10. package/dist/admin/PreviewFrame.js.map +1 -1
  11. package/dist/admin/PreviewToolbar.js +20 -13
  12. package/dist/admin/PreviewToolbar.js.map +1 -1
  13. package/dist/admin/SettingsBanner.js +10 -5
  14. package/dist/admin/SettingsBanner.js.map +1 -1
  15. package/dist/admin/ViewportToggle.js +30 -25
  16. package/dist/admin/ViewportToggle.js.map +1 -1
  17. package/dist/admin/blocks/AddBlockDrawer.js +7 -3
  18. package/dist/admin/blocks/AddBlockDrawer.js.map +1 -1
  19. package/dist/admin/blocks/BlockActionsToolbar.js +13 -11
  20. package/dist/admin/blocks/BlockActionsToolbar.js.map +1 -1
  21. package/dist/admin/blocks/BlockEmptyState.js +7 -3
  22. package/dist/admin/blocks/BlockEmptyState.js.map +1 -1
  23. package/dist/admin/blocks/BlockHeader.d.ts +1 -0
  24. package/dist/admin/blocks/BlockHeader.js +9 -8
  25. package/dist/admin/blocks/BlockHeader.js.map +1 -1
  26. package/dist/admin/blocks/schema.js +38 -7
  27. package/dist/admin/blocks/schema.js.map +1 -1
  28. package/dist/admin/sidebar/BlockSettingsTab.js +19 -4
  29. package/dist/admin/sidebar/BlockSettingsTab.js.map +1 -1
  30. package/dist/admin/sidebar/DocumentMetaTab.js +6 -2
  31. package/dist/admin/sidebar/DocumentMetaTab.js.map +1 -1
  32. package/dist/admin/sidebar/DocumentSettingsTab.js +6 -2
  33. package/dist/admin/sidebar/DocumentSettingsTab.js.map +1 -1
  34. package/dist/admin/sidebar/Sidebar.js +21 -16
  35. package/dist/admin/sidebar/Sidebar.js.map +1 -1
  36. package/dist/admin/sidebar/ValidationSummary.js +5 -2
  37. package/dist/admin/sidebar/ValidationSummary.js.map +1 -1
  38. package/dist/global.js +55 -39
  39. package/dist/global.js.map +1 -1
  40. package/dist/hooks/usePreviewBinding.js +6 -2
  41. package/dist/hooks/usePreviewBinding.js.map +1 -1
  42. package/dist/hooks/usePreviewSettingsSync.js +8 -3
  43. package/dist/hooks/usePreviewSettingsSync.js.map +1 -1
  44. package/dist/i18n/de.d.ts +2 -0
  45. package/dist/i18n/de.js +135 -0
  46. package/dist/i18n/de.js.map +1 -0
  47. package/dist/i18n/en.d.ts +2 -0
  48. package/dist/i18n/en.js +135 -0
  49. package/dist/i18n/en.js.map +1 -0
  50. package/dist/i18n/merge.d.ts +8 -0
  51. package/dist/i18n/merge.js +22 -0
  52. package/dist/i18n/merge.js.map +1 -0
  53. package/dist/i18n/types.d.ts +133 -0
  54. package/dist/i18n/types.js +3 -0
  55. package/dist/i18n/types.js.map +1 -0
  56. package/dist/i18n/useBetterEditorT.d.ts +2 -0
  57. package/dist/i18n/useBetterEditorT.js +10 -0
  58. package/dist/i18n/useBetterEditorT.js.map +1 -0
  59. package/dist/index.d.ts +2 -1
  60. package/dist/index.js +21 -2
  61. package/dist/index.js.map +1 -1
  62. package/dist/preview/HoverToolbar.d.ts +8 -0
  63. package/dist/preview/HoverToolbar.js +31 -29
  64. package/dist/preview/HoverToolbar.js.map +1 -1
  65. package/dist/preview/HoverToolbarController.d.ts +6 -0
  66. package/dist/preview/HoverToolbarController.js +20 -5
  67. package/dist/preview/HoverToolbarController.js.map +1 -1
  68. package/dist/styles/blocks-tab.css +1 -7
  69. package/dist/styles/overlay.css +2 -0
  70. package/dist/styles/sidebar.css +1 -0
  71. package/dist/styles/toggle.css +17 -0
  72. package/dist/types.d.ts +6 -0
  73. package/dist/types.js.map +1 -1
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.js +1 -1
  76. package/dist/version.js.map +1 -1
  77. package/package.json +13 -14
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/usePreviewBinding.ts"],"sourcesContent":["'use client'\n\nimport { useCallback, useEffect, useRef, type RefObject } from 'react'\nimport { HoverToolbarController } from '../preview/HoverToolbarController'\nimport { installClickToFocus } from '../preview/installClickToFocus'\nimport { installHoverStyles } from '../preview/installHoverStyles'\nimport type { BlockActionMessage } from '../preview/protocol'\nimport { BLOCK_ID_SELECTOR } from '../internal/dom'\nimport { getSameOriginDocument } from '../internal/iframe'\nimport { useLatestRef } from './useLatestRef'\n\nexport type PreviewBindingSettings = {\n hoverColorTopLevel: string\n hoverColorNested: string\n hoverOutlineWidth: number\n showHoverToolbar: boolean\n hoverToolbarPosition: import('../internal/constants').HoverToolbarPosition\n}\n\nexport type UsePreviewBindingArgs = {\n iframeRef: RefObject<HTMLIFrameElement | null>\n settings: PreviewBindingSettings\n interactModeRef: RefObject<boolean>\n onFocusBlock: (id: string) => void\n onBlockAction: (id: string, action: BlockActionMessage['action']) => void\n onLoadingChange: (loading: boolean) => void\n}\n\nexport type UsePreviewBindingReturn = {\n controllerRef: RefObject<HoverToolbarController | null>\n isBoundRef: RefObject<boolean>\n}\n\n/**\n * Owns the iframe load → install styles + click handler + hover toolbar\n * lifecycle. Idempotent: tears down previous bindings before installing\n * new ones, and unbinds on unmount.\n */\nexport const usePreviewBinding = ({\n iframeRef,\n settings,\n interactModeRef,\n onFocusBlock,\n onBlockAction,\n onLoadingChange,\n}: UsePreviewBindingArgs): UsePreviewBindingReturn => {\n const teardownRef = useRef<(() => void) | null>(null)\n const controllerRef = useRef<HoverToolbarController | null>(null)\n const isBoundRef = useRef(false)\n // One-shot flags so dev-only console warnings don't repeat on every\n // iframe re-load during a single editor session.\n const warnedMissingBlocksRef = useRef(false)\n const warnedCrossOriginRef = useRef(false)\n const settingsRef = useLatestRef(settings)\n const onFocusBlockRef = useLatestRef(onFocusBlock)\n const onBlockActionRef = useLatestRef(onBlockAction)\n const onLoadingChangeRef = useLatestRef(onLoadingChange)\n\n const bindToDocument = useCallback(\n (doc: Document) => {\n teardownRef.current?.()\n controllerRef.current?.destroy()\n controllerRef.current = null\n\n const s = settingsRef.current\n\n const removeStyles = installHoverStyles(doc, {\n topColor: s.hoverColorTopLevel,\n nestedColor: s.hoverColorNested,\n outlineWidth: s.hoverOutlineWidth,\n })\n const removeClick = installClickToFocus(doc, (id) => onFocusBlockRef.current(id), {\n isEnabled: () => !interactModeRef.current,\n })\n\n if (s.showHoverToolbar) {\n controllerRef.current = new HoverToolbarController(doc, {\n position: s.hoverToolbarPosition,\n outlineWidth: s.hoverOutlineWidth,\n onAction: (id, action) => onBlockActionRef.current(id, action),\n })\n }\n\n // Dev-only sanity check: zero [data-better-editor-id] elements means\n // the consumer forgot to spread getBlockProps() on their block wrappers\n // (or the page just has no blocks yet — both look identical from here).\n // Warn at most once per editor session to avoid console spam.\n if (process.env.NODE_ENV !== 'production' && !warnedMissingBlocksRef.current) {\n const blockCount = doc.querySelectorAll(BLOCK_ID_SELECTOR).length\n if (blockCount === 0) {\n warnedMissingBlocksRef.current = true\n console.warn(\n \"[better-editor] no [data-better-editor-id] elements found in the preview iframe — if your page has blocks, wrap them with `getBlockProps(block)` from 'payload-better-editor/client' so click-to-edit works.\",\n )\n }\n }\n\n isBoundRef.current = true\n teardownRef.current = () => {\n removeStyles()\n removeClick()\n controllerRef.current?.destroy()\n controllerRef.current = null\n isBoundRef.current = false\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refs are stable\n [],\n )\n\n // Bind once on mount; teardown on unmount. All inputs flow through\n // stable refs, so the load listener doesn't need to re-attach.\n useEffect(() => {\n const iframe = iframeRef.current\n if (!iframe) return\n\n const onLoad = () => {\n const doc = getSameOriginDocument(iframe)\n if (!doc) {\n onLoadingChangeRef.current(false)\n if (process.env.NODE_ENV !== 'production' && !warnedCrossOriginRef.current) {\n warnedCrossOriginRef.current = true\n console.warn(\n '[better-editor] preview iframe is cross-origin — click-to-edit, hover styles, and the in-iframe toolbar are disabled. Serve your preview URL from the same origin as the Payload admin.',\n )\n }\n return\n }\n // Fresh iframes report readyState='complete' on their initial\n // `about:blank` document before `src` has navigated. Skip and wait\n // for the real `load` event so we don't bind to an empty body.\n // `doc.URL` is a non-nullable string on Document — safer than\n // `doc.location.href`, which Firefox can briefly expose as null.\n if (!doc.URL || doc.URL === 'about:blank') return\n onLoadingChangeRef.current(false)\n bindToDocument(doc)\n }\n\n const initialDoc = getSameOriginDocument(iframe)\n if (initialDoc && initialDoc.readyState === 'complete') {\n onLoad()\n }\n iframe.addEventListener('load', onLoad)\n\n return () => {\n iframe.removeEventListener('load', onLoad)\n teardownRef.current?.()\n teardownRef.current = null\n controllerRef.current?.destroy()\n controllerRef.current = null\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refs are stable\n }, [])\n\n return { controllerRef, isBoundRef }\n}\n"],"names":["useCallback","useEffect","useRef","HoverToolbarController","installClickToFocus","installHoverStyles","BLOCK_ID_SELECTOR","getSameOriginDocument","useLatestRef","usePreviewBinding","iframeRef","settings","interactModeRef","onFocusBlock","onBlockAction","onLoadingChange","teardownRef","controllerRef","isBoundRef","warnedMissingBlocksRef","warnedCrossOriginRef","settingsRef","onFocusBlockRef","onBlockActionRef","onLoadingChangeRef","bindToDocument","doc","current","destroy","s","removeStyles","topColor","hoverColorTopLevel","nestedColor","hoverColorNested","outlineWidth","hoverOutlineWidth","removeClick","id","isEnabled","showHoverToolbar","position","hoverToolbarPosition","onAction","action","process","env","NODE_ENV","blockCount","querySelectorAll","length","console","warn","iframe","onLoad","URL","initialDoc","readyState","addEventListener","removeEventListener"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/hooks/usePreviewBinding.ts"],"sourcesContent":["'use client'\n\nimport { useCallback, useEffect, useRef, type RefObject } from 'react'\nimport { HoverToolbarController, toHoverToolbarLabels } from '../preview/HoverToolbarController'\nimport { useBetterEditorT } from '../i18n/useBetterEditorT'\nimport { installClickToFocus } from '../preview/installClickToFocus'\nimport { installHoverStyles } from '../preview/installHoverStyles'\nimport type { BlockActionMessage } from '../preview/protocol'\nimport { BLOCK_ID_SELECTOR } from '../internal/dom'\nimport { getSameOriginDocument } from '../internal/iframe'\nimport { useLatestRef } from './useLatestRef'\n\nexport type PreviewBindingSettings = {\n hoverColorTopLevel: string\n hoverColorNested: string\n hoverOutlineWidth: number\n showHoverToolbar: boolean\n hoverToolbarPosition: import('../internal/constants').HoverToolbarPosition\n}\n\nexport type UsePreviewBindingArgs = {\n iframeRef: RefObject<HTMLIFrameElement | null>\n settings: PreviewBindingSettings\n interactModeRef: RefObject<boolean>\n onFocusBlock: (id: string) => void\n onBlockAction: (id: string, action: BlockActionMessage['action']) => void\n onLoadingChange: (loading: boolean) => void\n}\n\nexport type UsePreviewBindingReturn = {\n controllerRef: RefObject<HoverToolbarController | null>\n isBoundRef: RefObject<boolean>\n}\n\n/**\n * Owns the iframe load → install styles + click handler + hover toolbar\n * lifecycle. Idempotent: tears down previous bindings before installing\n * new ones, and unbinds on unmount.\n */\nexport const usePreviewBinding = ({\n iframeRef,\n settings,\n interactModeRef,\n onFocusBlock,\n onBlockAction,\n onLoadingChange,\n}: UsePreviewBindingArgs): UsePreviewBindingReturn => {\n const t = useBetterEditorT()\n const labelsRef = useLatestRef(t.blocks.actions)\n const teardownRef = useRef<(() => void) | null>(null)\n const controllerRef = useRef<HoverToolbarController | null>(null)\n const isBoundRef = useRef(false)\n // One-shot flags so dev-only console warnings don't repeat on every\n // iframe re-load during a single editor session.\n const warnedMissingBlocksRef = useRef(false)\n const warnedCrossOriginRef = useRef(false)\n const settingsRef = useLatestRef(settings)\n const onFocusBlockRef = useLatestRef(onFocusBlock)\n const onBlockActionRef = useLatestRef(onBlockAction)\n const onLoadingChangeRef = useLatestRef(onLoadingChange)\n\n const bindToDocument = useCallback(\n (doc: Document) => {\n teardownRef.current?.()\n controllerRef.current?.destroy()\n controllerRef.current = null\n\n const s = settingsRef.current\n\n const removeStyles = installHoverStyles(doc, {\n topColor: s.hoverColorTopLevel,\n nestedColor: s.hoverColorNested,\n outlineWidth: s.hoverOutlineWidth,\n })\n const removeClick = installClickToFocus(doc, (id) => onFocusBlockRef.current(id), {\n isEnabled: () => !interactModeRef.current,\n })\n\n if (s.showHoverToolbar) {\n controllerRef.current = new HoverToolbarController(doc, {\n position: s.hoverToolbarPosition,\n outlineWidth: s.hoverOutlineWidth,\n onAction: (id, action) => onBlockActionRef.current(id, action),\n labels: toHoverToolbarLabels(labelsRef.current),\n })\n }\n\n // Dev-only sanity check: zero [data-better-editor-id] elements means\n // the consumer forgot to spread getBlockProps() on their block wrappers\n // (or the page just has no blocks yet — both look identical from here).\n // Warn at most once per editor session to avoid console spam.\n if (process.env.NODE_ENV !== 'production' && !warnedMissingBlocksRef.current) {\n const blockCount = doc.querySelectorAll(BLOCK_ID_SELECTOR).length\n if (blockCount === 0) {\n warnedMissingBlocksRef.current = true\n console.warn(\n \"[better-editor] no [data-better-editor-id] elements found in the preview iframe — if your page has blocks, wrap them with `getBlockProps(block)` from 'payload-better-editor/client' so click-to-edit works.\",\n )\n }\n }\n\n isBoundRef.current = true\n teardownRef.current = () => {\n removeStyles()\n removeClick()\n controllerRef.current?.destroy()\n controllerRef.current = null\n isBoundRef.current = false\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refs are stable\n [],\n )\n\n // Bind once on mount; teardown on unmount. All inputs flow through\n // stable refs, so the load listener doesn't need to re-attach.\n useEffect(() => {\n const iframe = iframeRef.current\n if (!iframe) return\n\n const onLoad = () => {\n const doc = getSameOriginDocument(iframe)\n if (!doc) {\n onLoadingChangeRef.current(false)\n if (process.env.NODE_ENV !== 'production' && !warnedCrossOriginRef.current) {\n warnedCrossOriginRef.current = true\n console.warn(\n '[better-editor] preview iframe is cross-origin — click-to-edit, hover styles, and the in-iframe toolbar are disabled. Serve your preview URL from the same origin as the Payload admin.',\n )\n }\n return\n }\n // Fresh iframes report readyState='complete' on their initial\n // `about:blank` document before `src` has navigated. Skip and wait\n // for the real `load` event so we don't bind to an empty body.\n // `doc.URL` is a non-nullable string on Document — safer than\n // `doc.location.href`, which Firefox can briefly expose as null.\n if (!doc.URL || doc.URL === 'about:blank') return\n onLoadingChangeRef.current(false)\n bindToDocument(doc)\n }\n\n const initialDoc = getSameOriginDocument(iframe)\n if (initialDoc && initialDoc.readyState === 'complete') {\n onLoad()\n }\n iframe.addEventListener('load', onLoad)\n\n return () => {\n iframe.removeEventListener('load', onLoad)\n teardownRef.current?.()\n teardownRef.current = null\n controllerRef.current?.destroy()\n controllerRef.current = null\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refs are stable\n }, [])\n\n return { controllerRef, isBoundRef }\n}\n"],"names":["useCallback","useEffect","useRef","HoverToolbarController","toHoverToolbarLabels","useBetterEditorT","installClickToFocus","installHoverStyles","BLOCK_ID_SELECTOR","getSameOriginDocument","useLatestRef","usePreviewBinding","iframeRef","settings","interactModeRef","onFocusBlock","onBlockAction","onLoadingChange","t","labelsRef","blocks","actions","teardownRef","controllerRef","isBoundRef","warnedMissingBlocksRef","warnedCrossOriginRef","settingsRef","onFocusBlockRef","onBlockActionRef","onLoadingChangeRef","bindToDocument","doc","current","destroy","s","removeStyles","topColor","hoverColorTopLevel","nestedColor","hoverColorNested","outlineWidth","hoverOutlineWidth","removeClick","id","isEnabled","showHoverToolbar","position","hoverToolbarPosition","onAction","action","labels","process","env","NODE_ENV","blockCount","querySelectorAll","length","console","warn","iframe","onLoad","URL","initialDoc","readyState","addEventListener","removeEventListener"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { useEffect } from 'react';
3
- import { HoverToolbarController } from '../preview/HoverToolbarController';
3
+ import { HoverToolbarController, toHoverToolbarLabels } from '../preview/HoverToolbarController';
4
+ import { useBetterEditorT } from '../i18n/useBetterEditorT';
4
5
  import { ACTIVE_CLASS, ACTIVE_SELECTOR } from '../internal/dom';
5
6
  import { TOOLBAR_ID, setHoverVars } from '../preview/hover-css';
6
7
  import { getSameOriginDocument } from '../internal/iframe';
@@ -9,6 +10,8 @@ import { getSameOriginDocument } from '../internal/iframe';
9
10
  * the iframe without recreating the controller — that would lose the
10
11
  * current selection.
11
12
  */ export const usePreviewSettingsSync = ({ iframeRef, controllerRef, isBoundRef, settings, onBlockAction })=>{
13
+ const t = useBetterEditorT();
14
+ const { blocks: { actions } } = t;
12
15
  const { hoverColorTopLevel, hoverColorNested, hoverOutlineWidth, showHoverToolbar, hoverToolbarPosition } = settings;
13
16
  useEffect(()=>{
14
17
  if (!isBoundRef.current) return;
@@ -25,7 +28,8 @@ import { getSameOriginDocument } from '../internal/iframe';
25
28
  const next = {
26
29
  position: hoverToolbarPosition,
27
30
  outlineWidth: hoverOutlineWidth,
28
- onAction: onBlockAction
31
+ onAction: onBlockAction,
32
+ labels: toHoverToolbarLabels(actions)
29
33
  };
30
34
  if (controllerRef.current) {
31
35
  controllerRef.current.update(next);
@@ -48,7 +52,8 @@ import { getSameOriginDocument } from '../internal/iframe';
48
52
  hoverOutlineWidth,
49
53
  showHoverToolbar,
50
54
  hoverToolbarPosition,
51
- onBlockAction
55
+ onBlockAction,
56
+ actions
52
57
  ]);
53
58
  };
54
59
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/usePreviewSettingsSync.ts"],"sourcesContent":["'use client'\n\nimport { useEffect, type RefObject } from 'react'\nimport { HoverToolbarController, type HoverToolbarOptions } from '../preview/HoverToolbarController'\nimport { ACTIVE_CLASS, ACTIVE_SELECTOR } from '../internal/dom'\nimport { TOOLBAR_ID, setHoverVars } from '../preview/hover-css'\nimport type { BlockActionMessage } from '../preview/protocol'\nimport { getSameOriginDocument } from '../internal/iframe'\nimport type { PreviewBindingSettings } from './usePreviewBinding'\n\nexport type UsePreviewSettingsSyncArgs = {\n iframeRef: RefObject<HTMLIFrameElement | null>\n controllerRef: RefObject<HoverToolbarController | null>\n isBoundRef: RefObject<boolean>\n settings: PreviewBindingSettings\n onBlockAction: (id: string, action: BlockActionMessage['action']) => void\n}\n\n/**\n * Pushes setting changes (hover colors, toolbar visibility/position) into\n * the iframe without recreating the controller — that would lose the\n * current selection.\n */\nexport const usePreviewSettingsSync = ({\n iframeRef,\n controllerRef,\n isBoundRef,\n settings,\n onBlockAction,\n}: UsePreviewSettingsSyncArgs): void => {\n const {\n hoverColorTopLevel,\n hoverColorNested,\n hoverOutlineWidth,\n showHoverToolbar,\n hoverToolbarPosition,\n } = settings\n\n useEffect(() => {\n if (!isBoundRef.current) return\n const iframe = iframeRef.current\n if (!iframe) return\n const doc = getSameOriginDocument(iframe)\n if (!doc) return\n\n setHoverVars(doc, {\n topColor: hoverColorTopLevel,\n nestedColor: hoverColorNested,\n outlineWidth: hoverOutlineWidth,\n })\n\n if (showHoverToolbar) {\n const next: HoverToolbarOptions = {\n position: hoverToolbarPosition,\n outlineWidth: hoverOutlineWidth,\n onAction: onBlockAction,\n }\n if (controllerRef.current) {\n controllerRef.current.update(next)\n } else {\n controllerRef.current = new HoverToolbarController(doc, next)\n }\n } else if (controllerRef.current) {\n controllerRef.current.destroy()\n controllerRef.current = null\n // Defensive: drop residue if styles outlived a previous controller.\n doc.getElementById(TOOLBAR_ID)?.remove()\n doc.querySelectorAll(ACTIVE_SELECTOR).forEach((el) => el.classList.remove(ACTIVE_CLASS))\n }\n }, [\n iframeRef,\n controllerRef,\n isBoundRef,\n hoverColorTopLevel,\n hoverColorNested,\n hoverOutlineWidth,\n showHoverToolbar,\n hoverToolbarPosition,\n onBlockAction,\n ])\n}\n"],"names":["useEffect","HoverToolbarController","ACTIVE_CLASS","ACTIVE_SELECTOR","TOOLBAR_ID","setHoverVars","getSameOriginDocument","usePreviewSettingsSync","iframeRef","controllerRef","isBoundRef","settings","onBlockAction","hoverColorTopLevel","hoverColorNested","hoverOutlineWidth","showHoverToolbar","hoverToolbarPosition","current","iframe","doc","topColor","nestedColor","outlineWidth","next","position","onAction","update","destroy","getElementById","remove","querySelectorAll","forEach","el","classList"],"mappings":"AAAA;AAEA,SAASA,SAAS,QAAwB,QAAO;AACjD,SAASC,sBAAsB,QAAkC,oCAAmC;AACpG,SAASC,YAAY,EAAEC,eAAe,QAAQ,kBAAiB;AAC/D,SAASC,UAAU,EAAEC,YAAY,QAAQ,uBAAsB;AAE/D,SAASC,qBAAqB,QAAQ,qBAAoB;AAW1D;;;;CAIC,GACD,OAAO,MAAMC,yBAAyB,CAAC,EACrCC,SAAS,EACTC,aAAa,EACbC,UAAU,EACVC,QAAQ,EACRC,aAAa,EACc;IAC3B,MAAM,EACJC,kBAAkB,EAClBC,gBAAgB,EAChBC,iBAAiB,EACjBC,gBAAgB,EAChBC,oBAAoB,EACrB,GAAGN;IAEJX,UAAU;QACR,IAAI,CAACU,WAAWQ,OAAO,EAAE;QACzB,MAAMC,SAASX,UAAUU,OAAO;QAChC,IAAI,CAACC,QAAQ;QACb,MAAMC,MAAMd,sBAAsBa;QAClC,IAAI,CAACC,KAAK;QAEVf,aAAae,KAAK;YAChBC,UAAUR;YACVS,aAAaR;YACbS,cAAcR;QAChB;QAEA,IAAIC,kBAAkB;YACpB,MAAMQ,OAA4B;gBAChCC,UAAUR;gBACVM,cAAcR;gBACdW,UAAUd;YACZ;YACA,IAAIH,cAAcS,OAAO,EAAE;gBACzBT,cAAcS,OAAO,CAACS,MAAM,CAACH;YAC/B,OAAO;gBACLf,cAAcS,OAAO,GAAG,IAAIjB,uBAAuBmB,KAAKI;YAC1D;QACF,OAAO,IAAIf,cAAcS,OAAO,EAAE;YAChCT,cAAcS,OAAO,CAACU,OAAO;YAC7BnB,cAAcS,OAAO,GAAG;YACxB,oEAAoE;YACpEE,IAAIS,cAAc,CAACzB,aAAa0B;YAChCV,IAAIW,gBAAgB,CAAC5B,iBAAiB6B,OAAO,CAAC,CAACC,KAAOA,GAAGC,SAAS,CAACJ,MAAM,CAAC5B;QAC5E;IACF,GAAG;QACDM;QACAC;QACAC;QACAG;QACAC;QACAC;QACAC;QACAC;QACAL;KACD;AACH,EAAC"}
1
+ {"version":3,"sources":["../../src/hooks/usePreviewSettingsSync.ts"],"sourcesContent":["'use client'\n\nimport { useEffect, type RefObject } from 'react'\nimport { HoverToolbarController, toHoverToolbarLabels, type HoverToolbarOptions } from '../preview/HoverToolbarController'\nimport { useBetterEditorT } from '../i18n/useBetterEditorT'\nimport { ACTIVE_CLASS, ACTIVE_SELECTOR } from '../internal/dom'\nimport { TOOLBAR_ID, setHoverVars } from '../preview/hover-css'\nimport type { BlockActionMessage } from '../preview/protocol'\nimport { getSameOriginDocument } from '../internal/iframe'\nimport type { PreviewBindingSettings } from './usePreviewBinding'\n\nexport type UsePreviewSettingsSyncArgs = {\n iframeRef: RefObject<HTMLIFrameElement | null>\n controllerRef: RefObject<HoverToolbarController | null>\n isBoundRef: RefObject<boolean>\n settings: PreviewBindingSettings\n onBlockAction: (id: string, action: BlockActionMessage['action']) => void\n}\n\n/**\n * Pushes setting changes (hover colors, toolbar visibility/position) into\n * the iframe without recreating the controller — that would lose the\n * current selection.\n */\nexport const usePreviewSettingsSync = ({\n iframeRef,\n controllerRef,\n isBoundRef,\n settings,\n onBlockAction,\n}: UsePreviewSettingsSyncArgs): void => {\n const t = useBetterEditorT()\n const { blocks: { actions } } = t\n const {\n hoverColorTopLevel,\n hoverColorNested,\n hoverOutlineWidth,\n showHoverToolbar,\n hoverToolbarPosition,\n } = settings\n\n useEffect(() => {\n if (!isBoundRef.current) return\n const iframe = iframeRef.current\n if (!iframe) return\n const doc = getSameOriginDocument(iframe)\n if (!doc) return\n\n setHoverVars(doc, {\n topColor: hoverColorTopLevel,\n nestedColor: hoverColorNested,\n outlineWidth: hoverOutlineWidth,\n })\n\n if (showHoverToolbar) {\n const next: HoverToolbarOptions = {\n position: hoverToolbarPosition,\n outlineWidth: hoverOutlineWidth,\n onAction: onBlockAction,\n labels: toHoverToolbarLabels(actions),\n }\n if (controllerRef.current) {\n controllerRef.current.update(next)\n } else {\n controllerRef.current = new HoverToolbarController(doc, next)\n }\n } else if (controllerRef.current) {\n controllerRef.current.destroy()\n controllerRef.current = null\n // Defensive: drop residue if styles outlived a previous controller.\n doc.getElementById(TOOLBAR_ID)?.remove()\n doc.querySelectorAll(ACTIVE_SELECTOR).forEach((el) => el.classList.remove(ACTIVE_CLASS))\n }\n }, [\n iframeRef,\n controllerRef,\n isBoundRef,\n hoverColorTopLevel,\n hoverColorNested,\n hoverOutlineWidth,\n showHoverToolbar,\n hoverToolbarPosition,\n onBlockAction,\n actions,\n ])\n}\n"],"names":["useEffect","HoverToolbarController","toHoverToolbarLabels","useBetterEditorT","ACTIVE_CLASS","ACTIVE_SELECTOR","TOOLBAR_ID","setHoverVars","getSameOriginDocument","usePreviewSettingsSync","iframeRef","controllerRef","isBoundRef","settings","onBlockAction","t","blocks","actions","hoverColorTopLevel","hoverColorNested","hoverOutlineWidth","showHoverToolbar","hoverToolbarPosition","current","iframe","doc","topColor","nestedColor","outlineWidth","next","position","onAction","labels","update","destroy","getElementById","remove","querySelectorAll","forEach","el","classList"],"mappings":"AAAA;AAEA,SAASA,SAAS,QAAwB,QAAO;AACjD,SAASC,sBAAsB,EAAEC,oBAAoB,QAAkC,oCAAmC;AAC1H,SAASC,gBAAgB,QAAQ,2BAA0B;AAC3D,SAASC,YAAY,EAAEC,eAAe,QAAQ,kBAAiB;AAC/D,SAASC,UAAU,EAAEC,YAAY,QAAQ,uBAAsB;AAE/D,SAASC,qBAAqB,QAAQ,qBAAoB;AAW1D;;;;CAIC,GACD,OAAO,MAAMC,yBAAyB,CAAC,EACrCC,SAAS,EACTC,aAAa,EACbC,UAAU,EACVC,QAAQ,EACRC,aAAa,EACc;IAC3B,MAAMC,IAAIZ;IACV,MAAM,EAAEa,QAAQ,EAAEC,OAAO,EAAE,EAAE,GAAGF;IAChC,MAAM,EACJG,kBAAkB,EAClBC,gBAAgB,EAChBC,iBAAiB,EACjBC,gBAAgB,EAChBC,oBAAoB,EACrB,GAAGT;IAEJb,UAAU;QACR,IAAI,CAACY,WAAWW,OAAO,EAAE;QACzB,MAAMC,SAASd,UAAUa,OAAO;QAChC,IAAI,CAACC,QAAQ;QACb,MAAMC,MAAMjB,sBAAsBgB;QAClC,IAAI,CAACC,KAAK;QAEVlB,aAAakB,KAAK;YAChBC,UAAUR;YACVS,aAAaR;YACbS,cAAcR;QAChB;QAEA,IAAIC,kBAAkB;YACpB,MAAMQ,OAA4B;gBAChCC,UAAUR;gBACVM,cAAcR;gBACdW,UAAUjB;gBACVkB,QAAQ9B,qBAAqBe;YAC/B;YACA,IAAIN,cAAcY,OAAO,EAAE;gBACzBZ,cAAcY,OAAO,CAACU,MAAM,CAACJ;YAC/B,OAAO;gBACLlB,cAAcY,OAAO,GAAG,IAAItB,uBAAuBwB,KAAKI;YAC1D;QACF,OAAO,IAAIlB,cAAcY,OAAO,EAAE;YAChCZ,cAAcY,OAAO,CAACW,OAAO;YAC7BvB,cAAcY,OAAO,GAAG;YACxB,oEAAoE;YACpEE,IAAIU,cAAc,CAAC7B,aAAa8B;YAChCX,IAAIY,gBAAgB,CAAChC,iBAAiBiC,OAAO,CAAC,CAACC,KAAOA,GAAGC,SAAS,CAACJ,MAAM,CAAChC;QAC5E;IACF,GAAG;QACDM;QACAC;QACAC;QACAM;QACAC;QACAC;QACAC;QACAC;QACAR;QACAG;KACD;AACH,EAAC"}
@@ -0,0 +1,2 @@
1
+ import type { BetterEditorTranslations } from './types';
2
+ export declare const de: BetterEditorTranslations;
@@ -0,0 +1,135 @@
1
+ export const de = {
2
+ toggle: {
3
+ open: 'Better Editor öffnen',
4
+ close: 'Better Editor schließen'
5
+ },
6
+ overlay: {
7
+ dialogLabel: 'Better Editor',
8
+ resizeSidebar: 'Sidebar-Breite ändern (← / → Pfeiltasten)'
9
+ },
10
+ toolbar: {
11
+ undo: 'Rückgängig',
12
+ undoTitle: 'Rückgängig (Cmd/Strg+Z)',
13
+ redo: 'Wiederholen',
14
+ redoTitle: 'Wiederholen (Cmd/Strg+Umschalt+Z)',
15
+ enterFullscreen: 'Vollbild aktivieren',
16
+ exitFullscreen: 'Vollbild beenden',
17
+ switchToEdit: 'In den Bearbeitungsmodus wechseln',
18
+ switchToInteract: 'In den Interaktionsmodus wechseln (Formulare, Akkordeons, Links)',
19
+ switchToInteractShort: 'In den Interaktionsmodus wechseln',
20
+ showSidebar: 'Sidebar einblenden',
21
+ hideSidebar: 'Sidebar ausblenden'
22
+ },
23
+ viewport: {
24
+ groupLabel: 'Vorschau-Ansicht',
25
+ desktop: 'Desktop',
26
+ tablet: 'Tablet',
27
+ mobile: 'Mobil',
28
+ responsive: 'Responsiv (Größe per Drag ändern)'
29
+ },
30
+ sidebar: {
31
+ tabs: {
32
+ page: 'Seite',
33
+ block: 'Blöcke',
34
+ settings: 'Einstellungen'
35
+ },
36
+ blockSelected: 'Block ausgewählt: ',
37
+ noBlockSelected: 'Kein Block ausgewählt',
38
+ validationLabel: 'Validierungsfehler',
39
+ validationSingular: '1 Feld benötigt Aufmerksamkeit',
40
+ validationPlural: ' Felder benötigen Aufmerksamkeit'
41
+ },
42
+ blocks: {
43
+ kicker: 'Block',
44
+ emptyPrompt: 'Block in der Vorschau auswählen, um seine Einstellungen zu bearbeiten.',
45
+ addBlock: 'Block hinzufügen',
46
+ blockName: 'Blockname',
47
+ blockNamePlaceholder: 'Optionale Bezeichnung für diesen Block',
48
+ schemaError: 'Block-Schema für diesen Pfad konnte nicht aufgelöst werden.',
49
+ drawerSingular: 'Block',
50
+ drawerPlural: 'Blöcke',
51
+ deselect: 'Abwählen',
52
+ actions: {
53
+ toolbar: 'Block-Aktionen',
54
+ moveUp: 'Nach oben',
55
+ moveUpLabel: 'Block nach oben verschieben',
56
+ moveDown: 'Nach unten',
57
+ moveDownLabel: 'Block nach unten verschieben',
58
+ duplicate: 'Duplizieren',
59
+ duplicateLabel: 'Block duplizieren',
60
+ addBelow: 'Block darunter einfügen',
61
+ addBelowLabel: 'Block darunter einfügen',
62
+ delete: 'Löschen',
63
+ deleteLabel: 'Block löschen'
64
+ }
65
+ },
66
+ documentFields: {
67
+ noFields: 'Keine Felder auf Dokumentebene gefunden.',
68
+ noSettings: 'Keine Dokument-Einstellungen.'
69
+ },
70
+ preview: {
71
+ title: 'Better Editor Vorschau',
72
+ loading: 'Vorschau wird geladen',
73
+ resizeLeft: 'Vorschau von links vergrößern',
74
+ resizeRight: 'Vorschau von rechts vergrößern'
75
+ },
76
+ error: {
77
+ heading: 'Better Editor ist abgestürzt',
78
+ unknown: 'Unbekannter Fehler.',
79
+ tryAgain: 'Erneut versuchen',
80
+ closeEditor: 'Editor schließen'
81
+ },
82
+ banner: {
83
+ builtBy: 'Wenn dir dieses Plugin gefällt, hinterlasse bitte einen Stern ⭐',
84
+ star: 'Stern geben',
85
+ github: 'GitHub',
86
+ reportBug: 'Fehler melden'
87
+ },
88
+ settings: {
89
+ globalLabel: 'Einstellungen',
90
+ globalDescription: 'Editorweite Einstellungen für das Better Editor Overlay.',
91
+ sidebar: {
92
+ tabLabel: 'Sidebar',
93
+ tabDescription: 'Position und Feldanordnung der Sidebar.',
94
+ position: 'Position',
95
+ positionRight: 'Rechts',
96
+ positionLeft: 'Links',
97
+ forceFullWidth: 'Felder in voller Breite stapeln',
98
+ forceFullWidthDesc: 'Überschreibt admin.width für Sidebar-Felder, sodass sie immer die volle Zeile einnehmen.'
99
+ },
100
+ viewport: {
101
+ tabLabel: 'Ansicht',
102
+ tabDescription: 'Pixelbreiten für Tablet- und Mobil-Vorschau.',
103
+ tabletWidth: 'Tablet (px)',
104
+ mobileWidth: 'Mobil (px)'
105
+ },
106
+ outline: {
107
+ tabLabel: 'Umrandung',
108
+ tabDescription: 'Umrandung und Einfärbung des ausgewählten Blocks.',
109
+ topLevelColor: 'Farbe oberste Ebene',
110
+ topLevelColorDesc: 'Hex-Farbe (z. B. `#3b82f6`).',
111
+ nestedColor: 'Farbe verschachtelt',
112
+ nestedColorDesc: 'Hex-Farbe für Blöcke innerhalb eines anderen Blocks.',
113
+ outlineWidth: 'Umrandungsbreite (px)',
114
+ outlineWidthDesc: 'Linienstärke in Pixeln (1–5).'
115
+ },
116
+ toolbar: {
117
+ tabLabel: 'Werkzeugleiste',
118
+ tabDescription: 'Schwebende Werkzeugleiste mit Verschieben / Duplizieren / Löschen für den ausgewählten Block.',
119
+ enabled: 'Aktiviert',
120
+ anchorCorner: 'Ankerposition',
121
+ topRight: 'Oben rechts',
122
+ topLeft: 'Oben links',
123
+ bottomRight: 'Unten rechts',
124
+ bottomLeft: 'Unten links'
125
+ },
126
+ validation: {
127
+ colorRequired: 'Farbe ist erforderlich',
128
+ colorInvalid: 'Muss eine Hex-Farbe (z. B. #3b82f6) oder rgb()/rgba() sein',
129
+ mustBeNumber: 'Muss eine Zahl sein',
130
+ outlineRange: 'Muss zwischen 1 und 5 liegen'
131
+ }
132
+ }
133
+ };
134
+
135
+ //# sourceMappingURL=de.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/de.ts"],"sourcesContent":["import type { BetterEditorTranslations } from './types'\n\nexport const de: BetterEditorTranslations = {\n toggle: {\n open: 'Better Editor öffnen',\n close: 'Better Editor schließen',\n },\n overlay: {\n dialogLabel: 'Better Editor',\n resizeSidebar: 'Sidebar-Breite ändern (← / → Pfeiltasten)',\n },\n toolbar: {\n undo: 'Rückgängig',\n undoTitle: 'Rückgängig (Cmd/Strg+Z)',\n redo: 'Wiederholen',\n redoTitle: 'Wiederholen (Cmd/Strg+Umschalt+Z)',\n enterFullscreen: 'Vollbild aktivieren',\n exitFullscreen: 'Vollbild beenden',\n switchToEdit: 'In den Bearbeitungsmodus wechseln',\n switchToInteract: 'In den Interaktionsmodus wechseln (Formulare, Akkordeons, Links)',\n switchToInteractShort: 'In den Interaktionsmodus wechseln',\n showSidebar: 'Sidebar einblenden',\n hideSidebar: 'Sidebar ausblenden',\n },\n viewport: {\n groupLabel: 'Vorschau-Ansicht',\n desktop: 'Desktop',\n tablet: 'Tablet',\n mobile: 'Mobil',\n responsive: 'Responsiv (Größe per Drag ändern)',\n },\n sidebar: {\n tabs: {\n page: 'Seite',\n block: 'Blöcke',\n settings: 'Einstellungen',\n },\n blockSelected: 'Block ausgewählt: ',\n noBlockSelected: 'Kein Block ausgewählt',\n validationLabel: 'Validierungsfehler',\n validationSingular: '1 Feld benötigt Aufmerksamkeit',\n validationPlural: ' Felder benötigen Aufmerksamkeit',\n },\n blocks: {\n kicker: 'Block',\n emptyPrompt: 'Block in der Vorschau auswählen, um seine Einstellungen zu bearbeiten.',\n addBlock: 'Block hinzufügen',\n blockName: 'Blockname',\n blockNamePlaceholder: 'Optionale Bezeichnung für diesen Block',\n schemaError: 'Block-Schema für diesen Pfad konnte nicht aufgelöst werden.',\n drawerSingular: 'Block',\n drawerPlural: 'Blöcke',\n deselect: 'Abwählen',\n actions: {\n toolbar: 'Block-Aktionen',\n moveUp: 'Nach oben',\n moveUpLabel: 'Block nach oben verschieben',\n moveDown: 'Nach unten',\n moveDownLabel: 'Block nach unten verschieben',\n duplicate: 'Duplizieren',\n duplicateLabel: 'Block duplizieren',\n addBelow: 'Block darunter einfügen',\n addBelowLabel: 'Block darunter einfügen',\n delete: 'Löschen',\n deleteLabel: 'Block löschen',\n },\n },\n documentFields: {\n noFields: 'Keine Felder auf Dokumentebene gefunden.',\n noSettings: 'Keine Dokument-Einstellungen.',\n },\n preview: {\n title: 'Better Editor Vorschau',\n loading: 'Vorschau wird geladen',\n resizeLeft: 'Vorschau von links vergrößern',\n resizeRight: 'Vorschau von rechts vergrößern',\n },\n error: {\n heading: 'Better Editor ist abgestürzt',\n unknown: 'Unbekannter Fehler.',\n tryAgain: 'Erneut versuchen',\n closeEditor: 'Editor schließen',\n },\n banner: {\n builtBy: 'Wenn dir dieses Plugin gefällt, hinterlasse bitte einen Stern ⭐',\n star: 'Stern geben',\n github: 'GitHub',\n reportBug: 'Fehler melden',\n },\n settings: {\n globalLabel: 'Einstellungen',\n globalDescription: 'Editorweite Einstellungen für das Better Editor Overlay.',\n sidebar: {\n tabLabel: 'Sidebar',\n tabDescription: 'Position und Feldanordnung der Sidebar.',\n position: 'Position',\n positionRight: 'Rechts',\n positionLeft: 'Links',\n forceFullWidth: 'Felder in voller Breite stapeln',\n forceFullWidthDesc:\n 'Überschreibt admin.width für Sidebar-Felder, sodass sie immer die volle Zeile einnehmen.',\n },\n viewport: {\n tabLabel: 'Ansicht',\n tabDescription: 'Pixelbreiten für Tablet- und Mobil-Vorschau.',\n tabletWidth: 'Tablet (px)',\n mobileWidth: 'Mobil (px)',\n },\n outline: {\n tabLabel: 'Umrandung',\n tabDescription: 'Umrandung und Einfärbung des ausgewählten Blocks.',\n topLevelColor: 'Farbe oberste Ebene',\n topLevelColorDesc: 'Hex-Farbe (z. B. `#3b82f6`).',\n nestedColor: 'Farbe verschachtelt',\n nestedColorDesc: 'Hex-Farbe für Blöcke innerhalb eines anderen Blocks.',\n outlineWidth: 'Umrandungsbreite (px)',\n outlineWidthDesc: 'Linienstärke in Pixeln (1–5).',\n },\n toolbar: {\n tabLabel: 'Werkzeugleiste',\n tabDescription:\n 'Schwebende Werkzeugleiste mit Verschieben / Duplizieren / Löschen für den ausgewählten Block.',\n enabled: 'Aktiviert',\n anchorCorner: 'Ankerposition',\n topRight: 'Oben rechts',\n topLeft: 'Oben links',\n bottomRight: 'Unten rechts',\n bottomLeft: 'Unten links',\n },\n validation: {\n colorRequired: 'Farbe ist erforderlich',\n colorInvalid: 'Muss eine Hex-Farbe (z. B. #3b82f6) oder rgb()/rgba() sein',\n mustBeNumber: 'Muss eine Zahl sein',\n outlineRange: 'Muss zwischen 1 und 5 liegen',\n },\n },\n}\n"],"names":["de","toggle","open","close","overlay","dialogLabel","resizeSidebar","toolbar","undo","undoTitle","redo","redoTitle","enterFullscreen","exitFullscreen","switchToEdit","switchToInteract","switchToInteractShort","showSidebar","hideSidebar","viewport","groupLabel","desktop","tablet","mobile","responsive","sidebar","tabs","page","block","settings","blockSelected","noBlockSelected","validationLabel","validationSingular","validationPlural","blocks","kicker","emptyPrompt","addBlock","blockName","blockNamePlaceholder","schemaError","drawerSingular","drawerPlural","deselect","actions","moveUp","moveUpLabel","moveDown","moveDownLabel","duplicate","duplicateLabel","addBelow","addBelowLabel","delete","deleteLabel","documentFields","noFields","noSettings","preview","title","loading","resizeLeft","resizeRight","error","heading","unknown","tryAgain","closeEditor","banner","builtBy","star","github","reportBug","globalLabel","globalDescription","tabLabel","tabDescription","position","positionRight","positionLeft","forceFullWidth","forceFullWidthDesc","tabletWidth","mobileWidth","outline","topLevelColor","topLevelColorDesc","nestedColor","nestedColorDesc","outlineWidth","outlineWidthDesc","enabled","anchorCorner","topRight","topLeft","bottomRight","bottomLeft","validation","colorRequired","colorInvalid","mustBeNumber","outlineRange"],"mappings":"AAEA,OAAO,MAAMA,KAA+B;IAC1CC,QAAQ;QACNC,MAAM;QACNC,OAAO;IACT;IACAC,SAAS;QACPC,aAAa;QACbC,eAAe;IACjB;IACAC,SAAS;QACPC,MAAM;QACNC,WAAW;QACXC,MAAM;QACNC,WAAW;QACXC,iBAAiB;QACjBC,gBAAgB;QAChBC,cAAc;QACdC,kBAAkB;QAClBC,uBAAuB;QACvBC,aAAa;QACbC,aAAa;IACf;IACAC,UAAU;QACRC,YAAY;QACZC,SAAS;QACTC,QAAQ;QACRC,QAAQ;QACRC,YAAY;IACd;IACAC,SAAS;QACPC,MAAM;YACJC,MAAM;YACNC,OAAO;YACPC,UAAU;QACZ;QACAC,eAAe;QACfC,iBAAiB;QACjBC,iBAAiB;QACjBC,oBAAoB;QACpBC,kBAAkB;IACpB;IACAC,QAAQ;QACNC,QAAQ;QACRC,aAAa;QACbC,UAAU;QACVC,WAAW;QACXC,sBAAsB;QACtBC,aAAa;QACbC,gBAAgB;QAChBC,cAAc;QACdC,UAAU;QACVC,SAAS;YACPtC,SAAS;YACTuC,QAAQ;YACRC,aAAa;YACbC,UAAU;YACVC,eAAe;YACfC,WAAW;YACXC,gBAAgB;YAChBC,UAAU;YACVC,eAAe;YACfC,QAAQ;YACRC,aAAa;QACf;IACF;IACAC,gBAAgB;QACdC,UAAU;QACVC,YAAY;IACd;IACAC,SAAS;QACPC,OAAO;QACPC,SAAS;QACTC,YAAY;QACZC,aAAa;IACf;IACAC,OAAO;QACLC,SAAS;QACTC,SAAS;QACTC,UAAU;QACVC,aAAa;IACf;IACAC,QAAQ;QACNC,SAAS;QACTC,MAAM;QACNC,QAAQ;QACRC,WAAW;IACb;IACA5C,UAAU;QACR6C,aAAa;QACbC,mBAAmB;QACnBlD,SAAS;YACPmD,UAAU;YACVC,gBAAgB;YAChBC,UAAU;YACVC,eAAe;YACfC,cAAc;YACdC,gBAAgB;YAChBC,oBACE;QACJ;QACA/D,UAAU;YACRyD,UAAU;YACVC,gBAAgB;YAChBM,aAAa;YACbC,aAAa;QACf;QACAC,SAAS;YACPT,UAAU;YACVC,gBAAgB;YAChBS,eAAe;YACfC,mBAAmB;YACnBC,aAAa;YACbC,iBAAiB;YACjBC,cAAc;YACdC,kBAAkB;QACpB;QACApF,SAAS;YACPqE,UAAU;YACVC,gBACE;YACFe,SAAS;YACTC,cAAc;YACdC,UAAU;YACVC,SAAS;YACTC,aAAa;YACbC,YAAY;QACd;QACAC,YAAY;YACVC,eAAe;YACfC,cAAc;YACdC,cAAc;YACdC,cAAc;QAChB;IACF;AACF,EAAC"}
@@ -0,0 +1,2 @@
1
+ import type { BetterEditorTranslations } from './types';
2
+ export declare const en: BetterEditorTranslations;
@@ -0,0 +1,135 @@
1
+ export const en = {
2
+ toggle: {
3
+ open: 'Open Better Editor',
4
+ close: 'Close Better Editor'
5
+ },
6
+ overlay: {
7
+ dialogLabel: 'Better Editor',
8
+ resizeSidebar: 'Resize sidebar (use ← / → arrow keys)'
9
+ },
10
+ toolbar: {
11
+ undo: 'Undo',
12
+ undoTitle: 'Undo (Cmd/Ctrl+Z)',
13
+ redo: 'Redo',
14
+ redoTitle: 'Redo (Cmd/Ctrl+Shift+Z)',
15
+ enterFullscreen: 'Enter fullscreen',
16
+ exitFullscreen: 'Exit fullscreen',
17
+ switchToEdit: 'Switch to edit mode',
18
+ switchToInteract: 'Switch to interact mode (use forms, accordions, links)',
19
+ switchToInteractShort: 'Switch to interact mode',
20
+ showSidebar: 'Show sidebar',
21
+ hideSidebar: 'Hide sidebar'
22
+ },
23
+ viewport: {
24
+ groupLabel: 'Preview viewport',
25
+ desktop: 'Desktop',
26
+ tablet: 'Tablet',
27
+ mobile: 'Mobile',
28
+ responsive: 'Responsive (drag to resize)'
29
+ },
30
+ sidebar: {
31
+ tabs: {
32
+ page: 'Page',
33
+ block: 'Blocks',
34
+ settings: 'Settings'
35
+ },
36
+ blockSelected: 'Block selected: ',
37
+ noBlockSelected: 'No block selected',
38
+ validationLabel: 'Validation errors',
39
+ validationSingular: '1 field needs attention',
40
+ validationPlural: ' fields need attention'
41
+ },
42
+ blocks: {
43
+ kicker: 'Block',
44
+ emptyPrompt: 'Select a block in the preview to edit its settings.',
45
+ addBlock: 'Add Block',
46
+ blockName: 'Block Name',
47
+ blockNamePlaceholder: 'Optional label for this block',
48
+ schemaError: 'Could not resolve block schema for this path.',
49
+ drawerSingular: 'Block',
50
+ drawerPlural: 'Blocks',
51
+ deselect: 'Deselect',
52
+ actions: {
53
+ toolbar: 'Block actions',
54
+ moveUp: 'Move up',
55
+ moveUpLabel: 'Move block up',
56
+ moveDown: 'Move down',
57
+ moveDownLabel: 'Move block down',
58
+ duplicate: 'Duplicate',
59
+ duplicateLabel: 'Duplicate block',
60
+ addBelow: 'Add block below',
61
+ addBelowLabel: 'Add block below',
62
+ delete: 'Delete',
63
+ deleteLabel: 'Delete block'
64
+ }
65
+ },
66
+ documentFields: {
67
+ noFields: 'No document-level fields found.',
68
+ noSettings: 'No document settings.'
69
+ },
70
+ preview: {
71
+ title: 'Better Editor preview',
72
+ loading: 'Loading preview',
73
+ resizeLeft: 'Resize preview from left',
74
+ resizeRight: 'Resize preview from right'
75
+ },
76
+ error: {
77
+ heading: 'Better Editor crashed',
78
+ unknown: 'Unknown error.',
79
+ tryAgain: 'Try again',
80
+ closeEditor: 'Close editor'
81
+ },
82
+ banner: {
83
+ builtBy: 'If you find this plugin useful, please leave a star ⭐',
84
+ star: 'Star',
85
+ github: 'GitHub',
86
+ reportBug: 'Report a bug'
87
+ },
88
+ settings: {
89
+ globalLabel: 'Settings',
90
+ globalDescription: 'Editor-wide preferences for the Better Editor overlay.',
91
+ sidebar: {
92
+ tabLabel: 'Sidebar',
93
+ tabDescription: 'Where the sidebar sits and how its fields are stacked.',
94
+ position: 'Position',
95
+ positionRight: 'Right',
96
+ positionLeft: 'Left',
97
+ forceFullWidth: 'Stack fields full-width',
98
+ forceFullWidthDesc: 'Override admin.width on sidebar fields so they always span the full row.'
99
+ },
100
+ viewport: {
101
+ tabLabel: 'Viewport',
102
+ tabDescription: 'Pixel widths for the Tablet and Mobile preview modes.',
103
+ tabletWidth: 'Tablet (px)',
104
+ mobileWidth: 'Mobile (px)'
105
+ },
106
+ outline: {
107
+ tabLabel: 'Outline',
108
+ tabDescription: 'Outline + tint shown on the hovered or selected block.',
109
+ topLevelColor: 'Top-level color',
110
+ topLevelColorDesc: 'Hex color (e.g. `#3b82f6`).',
111
+ nestedColor: 'Nested color',
112
+ nestedColorDesc: 'Hex color for blocks nested inside another block.',
113
+ outlineWidth: 'Outline width (px)',
114
+ outlineWidthDesc: 'Outline thickness in pixels (1–5).'
115
+ },
116
+ toolbar: {
117
+ tabLabel: 'Toolbar',
118
+ tabDescription: 'Floating Move / Duplicate / Delete toolbar that appears on the selected block.',
119
+ enabled: 'Enabled',
120
+ anchorCorner: 'Anchor corner',
121
+ topRight: 'Top right',
122
+ topLeft: 'Top left',
123
+ bottomRight: 'Bottom right',
124
+ bottomLeft: 'Bottom left'
125
+ },
126
+ validation: {
127
+ colorRequired: 'Color is required',
128
+ colorInvalid: 'Must be a hex color (e.g. #3b82f6) or rgb()/rgba()',
129
+ mustBeNumber: 'Must be a number',
130
+ outlineRange: 'Must be between 1 and 5'
131
+ }
132
+ }
133
+ };
134
+
135
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/en.ts"],"sourcesContent":["import type { BetterEditorTranslations } from './types'\n\nexport const en: BetterEditorTranslations = {\n toggle: {\n open: 'Open Better Editor',\n close: 'Close Better Editor',\n },\n overlay: {\n dialogLabel: 'Better Editor',\n resizeSidebar: 'Resize sidebar (use ← / → arrow keys)',\n },\n toolbar: {\n undo: 'Undo',\n undoTitle: 'Undo (Cmd/Ctrl+Z)',\n redo: 'Redo',\n redoTitle: 'Redo (Cmd/Ctrl+Shift+Z)',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n switchToEdit: 'Switch to edit mode',\n switchToInteract: 'Switch to interact mode (use forms, accordions, links)',\n switchToInteractShort: 'Switch to interact mode',\n showSidebar: 'Show sidebar',\n hideSidebar: 'Hide sidebar',\n },\n viewport: {\n groupLabel: 'Preview viewport',\n desktop: 'Desktop',\n tablet: 'Tablet',\n mobile: 'Mobile',\n responsive: 'Responsive (drag to resize)',\n },\n sidebar: {\n tabs: {\n page: 'Page',\n block: 'Blocks',\n settings: 'Settings',\n },\n blockSelected: 'Block selected: ',\n noBlockSelected: 'No block selected',\n validationLabel: 'Validation errors',\n validationSingular: '1 field needs attention',\n validationPlural: ' fields need attention',\n },\n blocks: {\n kicker: 'Block',\n emptyPrompt: 'Select a block in the preview to edit its settings.',\n addBlock: 'Add Block',\n blockName: 'Block Name',\n blockNamePlaceholder: 'Optional label for this block',\n schemaError: 'Could not resolve block schema for this path.',\n drawerSingular: 'Block',\n drawerPlural: 'Blocks',\n deselect: 'Deselect',\n actions: {\n toolbar: 'Block actions',\n moveUp: 'Move up',\n moveUpLabel: 'Move block up',\n moveDown: 'Move down',\n moveDownLabel: 'Move block down',\n duplicate: 'Duplicate',\n duplicateLabel: 'Duplicate block',\n addBelow: 'Add block below',\n addBelowLabel: 'Add block below',\n delete: 'Delete',\n deleteLabel: 'Delete block',\n },\n },\n documentFields: {\n noFields: 'No document-level fields found.',\n noSettings: 'No document settings.',\n },\n preview: {\n title: 'Better Editor preview',\n loading: 'Loading preview',\n resizeLeft: 'Resize preview from left',\n resizeRight: 'Resize preview from right',\n },\n error: {\n heading: 'Better Editor crashed',\n unknown: 'Unknown error.',\n tryAgain: 'Try again',\n closeEditor: 'Close editor',\n },\n banner: {\n builtBy: 'If you find this plugin useful, please leave a star ⭐',\n star: 'Star',\n github: 'GitHub',\n reportBug: 'Report a bug',\n },\n settings: {\n globalLabel: 'Settings',\n globalDescription: 'Editor-wide preferences for the Better Editor overlay.',\n sidebar: {\n tabLabel: 'Sidebar',\n tabDescription: 'Where the sidebar sits and how its fields are stacked.',\n position: 'Position',\n positionRight: 'Right',\n positionLeft: 'Left',\n forceFullWidth: 'Stack fields full-width',\n forceFullWidthDesc:\n 'Override admin.width on sidebar fields so they always span the full row.',\n },\n viewport: {\n tabLabel: 'Viewport',\n tabDescription: 'Pixel widths for the Tablet and Mobile preview modes.',\n tabletWidth: 'Tablet (px)',\n mobileWidth: 'Mobile (px)',\n },\n outline: {\n tabLabel: 'Outline',\n tabDescription: 'Outline + tint shown on the hovered or selected block.',\n topLevelColor: 'Top-level color',\n topLevelColorDesc: 'Hex color (e.g. `#3b82f6`).',\n nestedColor: 'Nested color',\n nestedColorDesc: 'Hex color for blocks nested inside another block.',\n outlineWidth: 'Outline width (px)',\n outlineWidthDesc: 'Outline thickness in pixels (1–5).',\n },\n toolbar: {\n tabLabel: 'Toolbar',\n tabDescription:\n 'Floating Move / Duplicate / Delete toolbar that appears on the selected block.',\n enabled: 'Enabled',\n anchorCorner: 'Anchor corner',\n topRight: 'Top right',\n topLeft: 'Top left',\n bottomRight: 'Bottom right',\n bottomLeft: 'Bottom left',\n },\n validation: {\n colorRequired: 'Color is required',\n colorInvalid: 'Must be a hex color (e.g. #3b82f6) or rgb()/rgba()',\n mustBeNumber: 'Must be a number',\n outlineRange: 'Must be between 1 and 5',\n },\n },\n}\n"],"names":["en","toggle","open","close","overlay","dialogLabel","resizeSidebar","toolbar","undo","undoTitle","redo","redoTitle","enterFullscreen","exitFullscreen","switchToEdit","switchToInteract","switchToInteractShort","showSidebar","hideSidebar","viewport","groupLabel","desktop","tablet","mobile","responsive","sidebar","tabs","page","block","settings","blockSelected","noBlockSelected","validationLabel","validationSingular","validationPlural","blocks","kicker","emptyPrompt","addBlock","blockName","blockNamePlaceholder","schemaError","drawerSingular","drawerPlural","deselect","actions","moveUp","moveUpLabel","moveDown","moveDownLabel","duplicate","duplicateLabel","addBelow","addBelowLabel","delete","deleteLabel","documentFields","noFields","noSettings","preview","title","loading","resizeLeft","resizeRight","error","heading","unknown","tryAgain","closeEditor","banner","builtBy","star","github","reportBug","globalLabel","globalDescription","tabLabel","tabDescription","position","positionRight","positionLeft","forceFullWidth","forceFullWidthDesc","tabletWidth","mobileWidth","outline","topLevelColor","topLevelColorDesc","nestedColor","nestedColorDesc","outlineWidth","outlineWidthDesc","enabled","anchorCorner","topRight","topLeft","bottomRight","bottomLeft","validation","colorRequired","colorInvalid","mustBeNumber","outlineRange"],"mappings":"AAEA,OAAO,MAAMA,KAA+B;IAC1CC,QAAQ;QACNC,MAAM;QACNC,OAAO;IACT;IACAC,SAAS;QACPC,aAAa;QACbC,eAAe;IACjB;IACAC,SAAS;QACPC,MAAM;QACNC,WAAW;QACXC,MAAM;QACNC,WAAW;QACXC,iBAAiB;QACjBC,gBAAgB;QAChBC,cAAc;QACdC,kBAAkB;QAClBC,uBAAuB;QACvBC,aAAa;QACbC,aAAa;IACf;IACAC,UAAU;QACRC,YAAY;QACZC,SAAS;QACTC,QAAQ;QACRC,QAAQ;QACRC,YAAY;IACd;IACAC,SAAS;QACPC,MAAM;YACJC,MAAM;YACNC,OAAO;YACPC,UAAU;QACZ;QACAC,eAAe;QACfC,iBAAiB;QACjBC,iBAAiB;QACjBC,oBAAoB;QACpBC,kBAAkB;IACpB;IACAC,QAAQ;QACNC,QAAQ;QACRC,aAAa;QACbC,UAAU;QACVC,WAAW;QACXC,sBAAsB;QACtBC,aAAa;QACbC,gBAAgB;QAChBC,cAAc;QACdC,UAAU;QACVC,SAAS;YACPtC,SAAS;YACTuC,QAAQ;YACRC,aAAa;YACbC,UAAU;YACVC,eAAe;YACfC,WAAW;YACXC,gBAAgB;YAChBC,UAAU;YACVC,eAAe;YACfC,QAAQ;YACRC,aAAa;QACf;IACF;IACAC,gBAAgB;QACdC,UAAU;QACVC,YAAY;IACd;IACAC,SAAS;QACPC,OAAO;QACPC,SAAS;QACTC,YAAY;QACZC,aAAa;IACf;IACAC,OAAO;QACLC,SAAS;QACTC,SAAS;QACTC,UAAU;QACVC,aAAa;IACf;IACAC,QAAQ;QACNC,SAAS;QACTC,MAAM;QACNC,QAAQ;QACRC,WAAW;IACb;IACA5C,UAAU;QACR6C,aAAa;QACbC,mBAAmB;QACnBlD,SAAS;YACPmD,UAAU;YACVC,gBAAgB;YAChBC,UAAU;YACVC,eAAe;YACfC,cAAc;YACdC,gBAAgB;YAChBC,oBACE;QACJ;QACA/D,UAAU;YACRyD,UAAU;YACVC,gBAAgB;YAChBM,aAAa;YACbC,aAAa;QACf;QACAC,SAAS;YACPT,UAAU;YACVC,gBAAgB;YAChBS,eAAe;YACfC,mBAAmB;YACnBC,aAAa;YACbC,iBAAiB;YACjBC,cAAc;YACdC,kBAAkB;QACpB;QACApF,SAAS;YACPqE,UAAU;YACVC,gBACE;YACFe,SAAS;YACTC,cAAc;YACdC,UAAU;YACVC,SAAS;YACTC,aAAa;YACbC,YAAY;QACd;QACAC,YAAY;YACVC,eAAe;YACfC,cAAc;YACdC,cAAc;YACdC,cAAc;QAChB;IACF;AACF,EAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BetterEditorTranslations } from './types';
2
+ export declare const deepMerge: (base: Record<string, unknown>, override: Record<string, unknown>) => Record<string, unknown>;
3
+ /**
4
+ * Merges user-supplied `betterEditor` translations from `existing` locale object
5
+ * on top of the plugin's built-in translations, so individual keys can be
6
+ * overridden without replacing the whole object.
7
+ */
8
+ export declare const mergeTranslations: (builtin: BetterEditorTranslations, existing: unknown) => BetterEditorTranslations;
@@ -0,0 +1,22 @@
1
+ export const deepMerge = (base, override)=>{
2
+ const result = {
3
+ ...base
4
+ };
5
+ for (const key of Object.keys(override)){
6
+ const ov = override[key];
7
+ const bv = base[key];
8
+ if (ov !== null && typeof ov === 'object' && !Array.isArray(ov) && bv !== null && typeof bv === 'object' && !Array.isArray(bv)) {
9
+ result[key] = deepMerge(bv, ov);
10
+ } else if (ov !== undefined) {
11
+ result[key] = ov;
12
+ }
13
+ }
14
+ return result;
15
+ };
16
+ /**
17
+ * Merges user-supplied `betterEditor` translations from `existing` locale object
18
+ * on top of the plugin's built-in translations, so individual keys can be
19
+ * overridden without replacing the whole object.
20
+ */ export const mergeTranslations = (builtin, existing)=>deepMerge(builtin, existing?.betterEditor ?? {});
21
+
22
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/merge.ts"],"sourcesContent":["import type { BetterEditorTranslations } from './types'\n\nexport const deepMerge = (\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...base }\n for (const key of Object.keys(override)) {\n const ov = override[key]\n const bv = base[key]\n if (\n ov !== null && typeof ov === 'object' && !Array.isArray(ov) &&\n bv !== null && typeof bv === 'object' && !Array.isArray(bv)\n ) {\n result[key] = deepMerge(bv as Record<string, unknown>, ov as Record<string, unknown>)\n } else if (ov !== undefined) {\n result[key] = ov\n }\n }\n return result\n}\n\n/**\n * Merges user-supplied `betterEditor` translations from `existing` locale object\n * on top of the plugin's built-in translations, so individual keys can be\n * overridden without replacing the whole object.\n */\nexport const mergeTranslations = (\n builtin: BetterEditorTranslations,\n existing: unknown,\n): BetterEditorTranslations =>\n deepMerge(\n builtin as unknown as Record<string, unknown>,\n ((existing as Record<string, unknown>)?.betterEditor as Record<string, unknown>) ?? {},\n ) as unknown as BetterEditorTranslations\n"],"names":["deepMerge","base","override","result","key","Object","keys","ov","bv","Array","isArray","undefined","mergeTranslations","builtin","existing","betterEditor"],"mappings":"AAEA,OAAO,MAAMA,YAAY,CACvBC,MACAC;IAEA,MAAMC,SAAkC;QAAE,GAAGF,IAAI;IAAC;IAClD,KAAK,MAAMG,OAAOC,OAAOC,IAAI,CAACJ,UAAW;QACvC,MAAMK,KAAKL,QAAQ,CAACE,IAAI;QACxB,MAAMI,KAAKP,IAAI,CAACG,IAAI;QACpB,IACEG,OAAO,QAAQ,OAAOA,OAAO,YAAY,CAACE,MAAMC,OAAO,CAACH,OACxDC,OAAO,QAAQ,OAAOA,OAAO,YAAY,CAACC,MAAMC,OAAO,CAACF,KACxD;YACAL,MAAM,CAACC,IAAI,GAAGJ,UAAUQ,IAA+BD;QACzD,OAAO,IAAIA,OAAOI,WAAW;YAC3BR,MAAM,CAACC,IAAI,GAAGG;QAChB;IACF;IACA,OAAOJ;AACT,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMS,oBAAoB,CAC/BC,SACAC,WAEAd,UACEa,SACA,AAAEC,UAAsCC,gBAA4C,CAAC,GAC/C"}
@@ -0,0 +1,133 @@
1
+ export type BetterEditorTranslations = {
2
+ toggle: {
3
+ open: string;
4
+ close: string;
5
+ };
6
+ overlay: {
7
+ dialogLabel: string;
8
+ resizeSidebar: string;
9
+ };
10
+ toolbar: {
11
+ undo: string;
12
+ undoTitle: string;
13
+ redo: string;
14
+ redoTitle: string;
15
+ enterFullscreen: string;
16
+ exitFullscreen: string;
17
+ switchToEdit: string;
18
+ switchToInteract: string;
19
+ switchToInteractShort: string;
20
+ showSidebar: string;
21
+ hideSidebar: string;
22
+ };
23
+ viewport: {
24
+ groupLabel: string;
25
+ desktop: string;
26
+ tablet: string;
27
+ mobile: string;
28
+ responsive: string;
29
+ };
30
+ sidebar: {
31
+ tabs: {
32
+ page: string;
33
+ block: string;
34
+ settings: string;
35
+ };
36
+ blockSelected: string;
37
+ noBlockSelected: string;
38
+ validationLabel: string;
39
+ validationSingular: string;
40
+ validationPlural: string;
41
+ };
42
+ blocks: {
43
+ kicker: string;
44
+ emptyPrompt: string;
45
+ addBlock: string;
46
+ blockName: string;
47
+ blockNamePlaceholder: string;
48
+ schemaError: string;
49
+ drawerSingular: string;
50
+ drawerPlural: string;
51
+ deselect: string;
52
+ actions: {
53
+ toolbar: string;
54
+ moveUp: string;
55
+ moveUpLabel: string;
56
+ moveDown: string;
57
+ moveDownLabel: string;
58
+ duplicate: string;
59
+ duplicateLabel: string;
60
+ addBelow: string;
61
+ addBelowLabel: string;
62
+ delete: string;
63
+ deleteLabel: string;
64
+ };
65
+ };
66
+ documentFields: {
67
+ noFields: string;
68
+ noSettings: string;
69
+ };
70
+ preview: {
71
+ title: string;
72
+ loading: string;
73
+ resizeLeft: string;
74
+ resizeRight: string;
75
+ };
76
+ error: {
77
+ heading: string;
78
+ unknown: string;
79
+ tryAgain: string;
80
+ closeEditor: string;
81
+ };
82
+ banner: {
83
+ builtBy: string;
84
+ star: string;
85
+ github: string;
86
+ reportBug: string;
87
+ };
88
+ settings: {
89
+ globalLabel: string;
90
+ globalDescription: string;
91
+ sidebar: {
92
+ tabLabel: string;
93
+ tabDescription: string;
94
+ position: string;
95
+ positionRight: string;
96
+ positionLeft: string;
97
+ forceFullWidth: string;
98
+ forceFullWidthDesc: string;
99
+ };
100
+ viewport: {
101
+ tabLabel: string;
102
+ tabDescription: string;
103
+ tabletWidth: string;
104
+ mobileWidth: string;
105
+ };
106
+ outline: {
107
+ tabLabel: string;
108
+ tabDescription: string;
109
+ topLevelColor: string;
110
+ topLevelColorDesc: string;
111
+ nestedColor: string;
112
+ nestedColorDesc: string;
113
+ outlineWidth: string;
114
+ outlineWidthDesc: string;
115
+ };
116
+ toolbar: {
117
+ tabLabel: string;
118
+ tabDescription: string;
119
+ enabled: string;
120
+ anchorCorner: string;
121
+ topRight: string;
122
+ topLeft: string;
123
+ bottomRight: string;
124
+ bottomLeft: string;
125
+ };
126
+ validation: {
127
+ colorRequired: string;
128
+ colorInvalid: string;
129
+ mustBeNumber: string;
130
+ outlineRange: string;
131
+ };
132
+ };
133
+ };
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/types.ts"],"sourcesContent":["export type BetterEditorTranslations = {\n toggle: {\n open: string\n close: string\n }\n overlay: {\n dialogLabel: string\n resizeSidebar: string\n }\n toolbar: {\n undo: string\n undoTitle: string\n redo: string\n redoTitle: string\n enterFullscreen: string\n exitFullscreen: string\n switchToEdit: string\n switchToInteract: string\n switchToInteractShort: string\n showSidebar: string\n hideSidebar: string\n }\n viewport: {\n groupLabel: string\n desktop: string\n tablet: string\n mobile: string\n responsive: string\n }\n sidebar: {\n tabs: { page: string; block: string; settings: string }\n blockSelected: string\n noBlockSelected: string\n validationLabel: string\n validationSingular: string\n validationPlural: string\n }\n blocks: {\n kicker: string\n emptyPrompt: string\n addBlock: string\n blockName: string\n blockNamePlaceholder: string\n schemaError: string\n drawerSingular: string\n drawerPlural: string\n deselect: string\n actions: {\n toolbar: string\n moveUp: string\n moveUpLabel: string\n moveDown: string\n moveDownLabel: string\n duplicate: string\n duplicateLabel: string\n addBelow: string\n addBelowLabel: string\n delete: string\n deleteLabel: string\n }\n }\n documentFields: {\n noFields: string\n noSettings: string\n }\n preview: {\n title: string\n loading: string\n resizeLeft: string\n resizeRight: string\n }\n error: {\n heading: string\n unknown: string\n tryAgain: string\n closeEditor: string\n }\n banner: {\n builtBy: string\n star: string\n github: string\n reportBug: string\n }\n settings: {\n globalLabel: string\n globalDescription: string\n sidebar: {\n tabLabel: string\n tabDescription: string\n position: string\n positionRight: string\n positionLeft: string\n forceFullWidth: string\n forceFullWidthDesc: string\n }\n viewport: {\n tabLabel: string\n tabDescription: string\n tabletWidth: string\n mobileWidth: string\n }\n outline: {\n tabLabel: string\n tabDescription: string\n topLevelColor: string\n topLevelColorDesc: string\n nestedColor: string\n nestedColorDesc: string\n outlineWidth: string\n outlineWidthDesc: string\n }\n toolbar: {\n tabLabel: string\n tabDescription: string\n enabled: string\n anchorCorner: string\n topRight: string\n topLeft: string\n bottomRight: string\n bottomLeft: string\n }\n validation: {\n colorRequired: string\n colorInvalid: string\n mustBeNumber: string\n outlineRange: string\n }\n }\n}\n"],"names":[],"mappings":"AAAA,WAgIC"}
@@ -0,0 +1,2 @@
1
+ import type { BetterEditorTranslations } from './types';
2
+ export declare const useBetterEditorT: () => BetterEditorTranslations;
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { useTranslation } from '@payloadcms/ui';
3
+ import { en } from './en';
4
+ export const useBetterEditorT = ()=>{
5
+ const { i18n } = useTranslation();
6
+ const custom = i18n.translations?.betterEditor;
7
+ return custom ?? en;
8
+ };
9
+
10
+ //# sourceMappingURL=useBetterEditorT.js.map