payload-better-editor 1.0.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 (182) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/dist/admin/ErrorBoundary.d.ts +17 -0
  4. package/dist/admin/ErrorBoundary.js +62 -0
  5. package/dist/admin/ErrorBoundary.js.map +1 -0
  6. package/dist/admin/LiveEditorOverlay.d.ts +12 -0
  7. package/dist/admin/LiveEditorOverlay.js +160 -0
  8. package/dist/admin/LiveEditorOverlay.js.map +1 -0
  9. package/dist/admin/LiveEditorToggle.d.ts +7 -0
  10. package/dist/admin/LiveEditorToggle.js +84 -0
  11. package/dist/admin/LiveEditorToggle.js.map +1 -0
  12. package/dist/admin/PreviewFrame.d.ts +22 -0
  13. package/dist/admin/PreviewFrame.js +137 -0
  14. package/dist/admin/PreviewFrame.js.map +1 -0
  15. package/dist/admin/PreviewToolbar.d.ts +16 -0
  16. package/dist/admin/PreviewToolbar.js +90 -0
  17. package/dist/admin/PreviewToolbar.js.map +1 -0
  18. package/dist/admin/SettingsBanner.d.ts +3 -0
  19. package/dist/admin/SettingsBanner.js +105 -0
  20. package/dist/admin/SettingsBanner.js.map +1 -0
  21. package/dist/admin/ViewportToggle.d.ts +7 -0
  22. package/dist/admin/ViewportToggle.js +79 -0
  23. package/dist/admin/ViewportToggle.js.map +1 -0
  24. package/dist/admin/blocks/AddBlockDrawer.d.ts +9 -0
  25. package/dist/admin/blocks/AddBlockDrawer.js +16 -0
  26. package/dist/admin/blocks/AddBlockDrawer.js.map +1 -0
  27. package/dist/admin/blocks/BlockActionsToolbar.d.ts +15 -0
  28. package/dist/admin/blocks/BlockActionsToolbar.js +102 -0
  29. package/dist/admin/blocks/BlockActionsToolbar.js.map +1 -0
  30. package/dist/admin/blocks/BlockEmptyState.d.ts +6 -0
  31. package/dist/admin/blocks/BlockEmptyState.js +26 -0
  32. package/dist/admin/blocks/BlockEmptyState.js.map +1 -0
  33. package/dist/admin/blocks/BlockHeader.d.ts +7 -0
  34. package/dist/admin/blocks/BlockHeader.js +32 -0
  35. package/dist/admin/blocks/BlockHeader.js.map +1 -0
  36. package/dist/admin/blocks/schema.d.ts +19 -0
  37. package/dist/admin/blocks/schema.js +80 -0
  38. package/dist/admin/blocks/schema.js.map +1 -0
  39. package/dist/admin/blocks/useBlockActions.d.ts +24 -0
  40. package/dist/admin/blocks/useBlockActions.js +100 -0
  41. package/dist/admin/blocks/useBlockActions.js.map +1 -0
  42. package/dist/admin/icons.d.ts +24 -0
  43. package/dist/admin/icons.js +36 -0
  44. package/dist/admin/icons.js.map +1 -0
  45. package/dist/admin/sidebar/BlockSettingsTab.d.ts +10 -0
  46. package/dist/admin/sidebar/BlockSettingsTab.js +153 -0
  47. package/dist/admin/sidebar/BlockSettingsTab.js.map +1 -0
  48. package/dist/admin/sidebar/DocumentFieldsTab.d.ts +8 -0
  49. package/dist/admin/sidebar/DocumentFieldsTab.js +38 -0
  50. package/dist/admin/sidebar/DocumentFieldsTab.js.map +1 -0
  51. package/dist/admin/sidebar/DocumentMetaTab.d.ts +2 -0
  52. package/dist/admin/sidebar/DocumentMetaTab.js +11 -0
  53. package/dist/admin/sidebar/DocumentMetaTab.js.map +1 -0
  54. package/dist/admin/sidebar/DocumentSettingsTab.d.ts +2 -0
  55. package/dist/admin/sidebar/DocumentSettingsTab.js +48 -0
  56. package/dist/admin/sidebar/DocumentSettingsTab.js.map +1 -0
  57. package/dist/admin/sidebar/Sidebar.d.ts +10 -0
  58. package/dist/admin/sidebar/Sidebar.js +92 -0
  59. package/dist/admin/sidebar/Sidebar.js.map +1 -0
  60. package/dist/client.d.ts +34 -0
  61. package/dist/client.js +30 -0
  62. package/dist/client.js.map +1 -0
  63. package/dist/global.d.ts +4 -0
  64. package/dist/global.js +200 -0
  65. package/dist/global.js.map +1 -0
  66. package/dist/hooks/useAddBlockDrawer.d.ts +14 -0
  67. package/dist/hooks/useAddBlockDrawer.js +26 -0
  68. package/dist/hooks/useAddBlockDrawer.js.map +1 -0
  69. package/dist/hooks/useBlockActionMessages.d.ts +8 -0
  70. package/dist/hooks/useBlockActionMessages.js +107 -0
  71. package/dist/hooks/useBlockActionMessages.js.map +1 -0
  72. package/dist/hooks/useDocConfig.d.ts +6 -0
  73. package/dist/hooks/useDocConfig.js +18 -0
  74. package/dist/hooks/useDocConfig.js.map +1 -0
  75. package/dist/hooks/useFocusTrap.d.ts +2 -0
  76. package/dist/hooks/useFocusTrap.js +84 -0
  77. package/dist/hooks/useFocusTrap.js.map +1 -0
  78. package/dist/hooks/useFullscreenOverlay.d.ts +2 -0
  79. package/dist/hooks/useFullscreenOverlay.js +30 -0
  80. package/dist/hooks/useFullscreenOverlay.js.map +1 -0
  81. package/dist/hooks/useIframeResizeObserver.d.ts +2 -0
  82. package/dist/hooks/useIframeResizeObserver.js +20 -0
  83. package/dist/hooks/useIframeResizeObserver.js.map +1 -0
  84. package/dist/hooks/useLatestRef.d.ts +6 -0
  85. package/dist/hooks/useLatestRef.js +12 -0
  86. package/dist/hooks/useLatestRef.js.map +1 -0
  87. package/dist/hooks/useMainWrapperPortal.d.ts +1 -0
  88. package/dist/hooks/useMainWrapperPortal.js +64 -0
  89. package/dist/hooks/useMainWrapperPortal.js.map +1 -0
  90. package/dist/hooks/useOverlayKeyboard.d.ts +6 -0
  91. package/dist/hooks/useOverlayKeyboard.js +43 -0
  92. package/dist/hooks/useOverlayKeyboard.js.map +1 -0
  93. package/dist/hooks/usePreviewBinding.d.ts +28 -0
  94. package/dist/hooks/usePreviewBinding.js +108 -0
  95. package/dist/hooks/usePreviewBinding.js.map +1 -0
  96. package/dist/hooks/usePreviewHandleDrag.d.ts +11 -0
  97. package/dist/hooks/usePreviewHandleDrag.js +53 -0
  98. package/dist/hooks/usePreviewHandleDrag.js.map +1 -0
  99. package/dist/hooks/usePreviewSelectionSync.d.ts +15 -0
  100. package/dist/hooks/usePreviewSelectionSync.js +80 -0
  101. package/dist/hooks/usePreviewSelectionSync.js.map +1 -0
  102. package/dist/hooks/usePreviewSettingsSync.d.ts +17 -0
  103. package/dist/hooks/usePreviewSettingsSync.js +55 -0
  104. package/dist/hooks/usePreviewSettingsSync.js.map +1 -0
  105. package/dist/hooks/useSidebarResize.d.ts +8 -0
  106. package/dist/hooks/useSidebarResize.js +101 -0
  107. package/dist/hooks/useSidebarResize.js.map +1 -0
  108. package/dist/hooks/useViewportState.d.ts +10 -0
  109. package/dist/hooks/useViewportState.js +44 -0
  110. package/dist/hooks/useViewportState.js.map +1 -0
  111. package/dist/index.d.ts +25 -0
  112. package/dist/index.js +104 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/internal/constants.d.ts +22 -0
  115. package/dist/internal/constants.js +38 -0
  116. package/dist/internal/constants.js.map +1 -0
  117. package/dist/internal/dom.d.ts +4 -0
  118. package/dist/internal/dom.js +6 -0
  119. package/dist/internal/dom.js.map +1 -0
  120. package/dist/internal/iframe.d.ts +5 -0
  121. package/dist/internal/iframe.js +12 -0
  122. package/dist/internal/iframe.js.map +1 -0
  123. package/dist/internal/limits.d.ts +9 -0
  124. package/dist/internal/limits.js +11 -0
  125. package/dist/internal/limits.js.map +1 -0
  126. package/dist/internal/path.d.ts +5 -0
  127. package/dist/internal/path.js +12 -0
  128. package/dist/internal/path.js.map +1 -0
  129. package/dist/internal/postmessage.d.ts +3 -0
  130. package/dist/internal/postmessage.js +21 -0
  131. package/dist/internal/postmessage.js.map +1 -0
  132. package/dist/internal/storage-keys.d.ts +8 -0
  133. package/dist/internal/storage-keys.js +9 -0
  134. package/dist/internal/storage-keys.js.map +1 -0
  135. package/dist/internal/storage.d.ts +2 -0
  136. package/dist/internal/storage.js +20 -0
  137. package/dist/internal/storage.js.map +1 -0
  138. package/dist/preview/HoverToolbar.d.ts +8 -0
  139. package/dist/preview/HoverToolbar.js +48 -0
  140. package/dist/preview/HoverToolbar.js.map +1 -0
  141. package/dist/preview/HoverToolbarController.d.ts +31 -0
  142. package/dist/preview/HoverToolbarController.js +160 -0
  143. package/dist/preview/HoverToolbarController.js.map +1 -0
  144. package/dist/preview/hover-css.d.ts +11 -0
  145. package/dist/preview/hover-css.js +94 -0
  146. package/dist/preview/hover-css.js.map +1 -0
  147. package/dist/preview/installClickToFocus.d.ts +6 -0
  148. package/dist/preview/installClickToFocus.js +21 -0
  149. package/dist/preview/installClickToFocus.js.map +1 -0
  150. package/dist/preview/installHoverStyles.d.ts +2 -0
  151. package/dist/preview/installHoverStyles.js +15 -0
  152. package/dist/preview/installHoverStyles.js.map +1 -0
  153. package/dist/preview/protocol.d.ts +11 -0
  154. package/dist/preview/protocol.js +19 -0
  155. package/dist/preview/protocol.js.map +1 -0
  156. package/dist/preview/toolbar-position.d.ts +20 -0
  157. package/dist/preview/toolbar-position.js +22 -0
  158. package/dist/preview/toolbar-position.js.map +1 -0
  159. package/dist/providers/BetterEditorConfigProvider.d.ts +14 -0
  160. package/dist/providers/BetterEditorConfigProvider.js +26 -0
  161. package/dist/providers/BetterEditorConfigProvider.js.map +1 -0
  162. package/dist/providers/OverlayProviders.d.ts +8 -0
  163. package/dist/providers/OverlayProviders.js +22 -0
  164. package/dist/providers/OverlayProviders.js.map +1 -0
  165. package/dist/state/useBetterEditorSettings.d.ts +18 -0
  166. package/dist/state/useBetterEditorSettings.js +65 -0
  167. package/dist/state/useBetterEditorSettings.js.map +1 -0
  168. package/dist/state/useEditorHistory.d.ts +16 -0
  169. package/dist/state/useEditorHistory.js +157 -0
  170. package/dist/state/useEditorHistory.js.map +1 -0
  171. package/dist/styles/blocks-tab.css +163 -0
  172. package/dist/styles/overlay.css +133 -0
  173. package/dist/styles/preview.css +211 -0
  174. package/dist/styles/settings-banner.css +73 -0
  175. package/dist/styles/sidebar.css +88 -0
  176. package/dist/types.d.ts +41 -0
  177. package/dist/types.js +3 -0
  178. package/dist/types.js.map +1 -0
  179. package/dist/version.d.ts +1 -0
  180. package/dist/version.js +6 -0
  181. package/dist/version.js.map +1 -0
  182. package/package.json +117 -0
@@ -0,0 +1,19 @@
1
+ import type { ClientBlock, ClientField, FormState } from 'payload';
2
+ export type Resolved = {
3
+ blockType: string;
4
+ blockFields: ClientField[];
5
+ schemaPath: string;
6
+ parentPath: string;
7
+ blocksFieldSchemaPath: string;
8
+ blocksFieldBlocks: ClientBlock[];
9
+ };
10
+ export type BlockSchemaContext = {
11
+ docFields: ClientField[];
12
+ docSlug: string;
13
+ formFields: FormState;
14
+ };
15
+ export declare const findNamedField: (fields: ClientField[], name: string, schemaPath: string) => {
16
+ field: ClientField;
17
+ schemaPath: string;
18
+ } | null;
19
+ export declare const resolveBlockSchema: (context: BlockSchemaContext, blockPath: string) => Resolved | null;
@@ -0,0 +1,80 @@
1
+ const tabHasName = (tab)=>typeof tab.name === 'string';
2
+ export const findNamedField = (fields, name, schemaPath)=>{
3
+ for (const field of fields){
4
+ if (!field || typeof field !== 'object') continue;
5
+ if ('name' in field && typeof field.name === 'string' && field.name === name) {
6
+ return {
7
+ field,
8
+ schemaPath: `${schemaPath}.${name}`
9
+ };
10
+ }
11
+ if (field.type === 'tabs') {
12
+ for (const tab of field.tabs){
13
+ const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath;
14
+ const found = findNamedField(tab.fields, name, tabSchemaPath);
15
+ if (found) return found;
16
+ }
17
+ } else if (field.type === 'collapsible' || field.type === 'row') {
18
+ const found = findNamedField(field.fields, name, schemaPath);
19
+ if (found) return found;
20
+ }
21
+ // Groups are not transparent: their inner fields are reached via the
22
+ // group's own name as the next path segment.
23
+ }
24
+ return null;
25
+ };
26
+ export const resolveBlockSchema = (context, blockPath)=>{
27
+ const { docFields, docSlug, formFields } = context;
28
+ const segments = blockPath.split('.');
29
+ let currentFields = docFields;
30
+ let currentSchemaPath = docSlug;
31
+ let currentPath = '';
32
+ let blockType = null;
33
+ let blockConfig = null;
34
+ let blocksFieldSchemaPath = '';
35
+ let blocksFieldBlocks = [];
36
+ for(let i = 0; i < segments.length; i += 2){
37
+ const fieldName = segments[i];
38
+ const indexStr = segments[i + 1];
39
+ if (indexStr === undefined) break;
40
+ const index = Number(indexStr);
41
+ if (!Number.isInteger(index) || index < 0) return null;
42
+ const found = findNamedField(currentFields, fieldName, currentSchemaPath);
43
+ if (!found) return null;
44
+ const field = found.field;
45
+ currentSchemaPath = found.schemaPath;
46
+ currentPath = currentPath ? `${currentPath}.${fieldName}` : fieldName;
47
+ if (field.type === 'blocks') {
48
+ const rows = formFields[currentPath]?.rows;
49
+ if (!Array.isArray(rows) || index >= rows.length) return null;
50
+ const row = rows[index];
51
+ if (!row?.blockType) return null;
52
+ blockType = row.blockType;
53
+ const blocks = field.blocks;
54
+ blockConfig = blocks.find((b)=>b.slug === blockType) ?? null;
55
+ if (!blockConfig) return null;
56
+ // Capture parent before descending — used by "add sibling block".
57
+ blocksFieldSchemaPath = currentSchemaPath;
58
+ blocksFieldBlocks = blocks;
59
+ currentFields = blockConfig.fields;
60
+ currentSchemaPath = `${currentSchemaPath}.${blockType}`;
61
+ currentPath = `${currentPath}.${index}`;
62
+ } else if (field.type === 'array') {
63
+ currentFields = field.fields;
64
+ currentPath = `${currentPath}.${index}`;
65
+ } else {
66
+ return null;
67
+ }
68
+ }
69
+ if (!blockType || !blockConfig) return null;
70
+ return {
71
+ blockType,
72
+ blockFields: currentFields,
73
+ schemaPath: currentSchemaPath,
74
+ parentPath: currentPath,
75
+ blocksFieldSchemaPath,
76
+ blocksFieldBlocks
77
+ };
78
+ };
79
+
80
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/blocks/schema.ts"],"sourcesContent":["import type { ClientTab } from 'payload'\nimport type { ClientBlock, ClientField, FormState } from 'payload'\n\nexport type Resolved = {\n blockType: string\n blockFields: ClientField[]\n schemaPath: string\n parentPath: string\n blocksFieldSchemaPath: string\n blocksFieldBlocks: ClientBlock[]\n}\n\nexport type BlockSchemaContext = {\n docFields: ClientField[]\n docSlug: string\n formFields: FormState\n}\n\nconst tabHasName = (tab: ClientTab): tab is ClientTab & { name: string } =>\n typeof (tab as { name?: unknown }).name === 'string'\n\nexport const findNamedField = (\n fields: ClientField[],\n name: string,\n schemaPath: string,\n): { field: ClientField; schemaPath: string } | null => {\n for (const field of fields) {\n if (!field || typeof field !== 'object') continue\n\n if ('name' in field && typeof field.name === 'string' && field.name === name) {\n return { field, schemaPath: `${schemaPath}.${name}` }\n }\n\n if (field.type === 'tabs') {\n for (const tab of field.tabs) {\n const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath\n const found = findNamedField(tab.fields, name, tabSchemaPath)\n if (found) return found\n }\n } else if (field.type === 'collapsible' || field.type === 'row') {\n const found = findNamedField(field.fields, name, schemaPath)\n if (found) return found\n }\n // Groups are not transparent: their inner fields are reached via the\n // group's own name as the next path segment.\n }\n return null\n}\n\nexport const resolveBlockSchema = (\n context: BlockSchemaContext,\n blockPath: string,\n): Resolved | null => {\n const { docFields, docSlug, formFields } = context\n const segments = blockPath.split('.')\n let currentFields: ClientField[] = docFields\n let currentSchemaPath = docSlug\n let currentPath = ''\n let blockType: string | null = null\n let blockConfig: ClientBlock | null = null\n let blocksFieldSchemaPath = ''\n let blocksFieldBlocks: ClientBlock[] = []\n\n for (let i = 0; i < segments.length; i += 2) {\n const fieldName = segments[i]\n const indexStr = segments[i + 1]\n if (indexStr === undefined) break\n const index = Number(indexStr)\n if (!Number.isInteger(index) || index < 0) return null\n\n const found = findNamedField(currentFields, fieldName, currentSchemaPath)\n if (!found) return null\n const field = found.field\n currentSchemaPath = found.schemaPath\n currentPath = currentPath ? `${currentPath}.${fieldName}` : fieldName\n\n if (field.type === 'blocks') {\n const rows = formFields[currentPath]?.rows\n if (!Array.isArray(rows) || index >= rows.length) return null\n const row = rows[index] as { blockType?: string } | undefined\n if (!row?.blockType) return null\n blockType = row.blockType\n const blocks = field.blocks\n blockConfig = blocks.find((b) => b.slug === blockType) ?? null\n if (!blockConfig) return null\n // Capture parent before descending — used by \"add sibling block\".\n blocksFieldSchemaPath = currentSchemaPath\n blocksFieldBlocks = blocks\n currentFields = blockConfig.fields\n currentSchemaPath = `${currentSchemaPath}.${blockType}`\n currentPath = `${currentPath}.${index}`\n } else if (field.type === 'array') {\n currentFields = field.fields\n currentPath = `${currentPath}.${index}`\n } else {\n return null\n }\n }\n\n if (!blockType || !blockConfig) return null\n\n return {\n blockType,\n blockFields: currentFields,\n schemaPath: currentSchemaPath,\n parentPath: currentPath,\n blocksFieldSchemaPath,\n blocksFieldBlocks,\n }\n}\n"],"names":["tabHasName","tab","name","findNamedField","fields","schemaPath","field","type","tabs","tabSchemaPath","found","resolveBlockSchema","context","blockPath","docFields","docSlug","formFields","segments","split","currentFields","currentSchemaPath","currentPath","blockType","blockConfig","blocksFieldSchemaPath","blocksFieldBlocks","i","length","fieldName","indexStr","undefined","index","Number","isInteger","rows","Array","isArray","row","blocks","find","b","slug","blockFields","parentPath"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ type Args = {
2
+ selectedBlockPath: string | null;
3
+ onSelectPath: (path: string | null) => void;
4
+ onClearSelection: () => void;
5
+ };
6
+ export declare const useBlockActions: ({ selectedBlockPath, onSelectPath, onClearSelection, }: Args) => {
7
+ moveUp: () => void;
8
+ moveDown: () => void;
9
+ duplicate: () => void;
10
+ remove: () => void;
11
+ addAfter: ({ blockType, schemaPath, containerPath, index, }: {
12
+ blockType?: string;
13
+ schemaPath: string;
14
+ containerPath: string;
15
+ index: number;
16
+ }) => void;
17
+ canMoveUp: boolean;
18
+ canMoveDown: boolean;
19
+ canMutate: boolean;
20
+ parentPath: string;
21
+ rowIndex: number;
22
+ rowCount: number;
23
+ };
24
+ export {};
@@ -0,0 +1,100 @@
1
+ 'use client';
2
+ import { useAllFormFields, useForm } from '@payloadcms/ui';
3
+ import { useEditorHistory } from '../../state/useEditorHistory';
4
+ import { splitFieldPath } from '../../internal/path';
5
+ const rowCountAt = (fields, path)=>{
6
+ const rows = fields[path]?.rows;
7
+ return Array.isArray(rows) ? rows.length : 0;
8
+ };
9
+ export const useBlockActions = ({ selectedBlockPath, onSelectPath, onClearSelection })=>{
10
+ const [fields] = useAllFormFields();
11
+ const { addFieldRow, dispatchFields } = useForm();
12
+ const { commit } = useEditorHistory();
13
+ const split = selectedBlockPath ? splitFieldPath(selectedBlockPath) : null;
14
+ const parentPath = split?.parent ?? '';
15
+ const rowIndex = split ? split.index : NaN;
16
+ const rowCount = parentPath ? rowCountAt(fields, parentPath) : 0;
17
+ const canMutate = !Number.isNaN(rowIndex) && parentPath !== '' && rowIndex < rowCount;
18
+ const canMoveUp = canMutate && rowIndex > 0;
19
+ const canMoveDown = canMutate && rowIndex < rowCount - 1;
20
+ // Re-check bounds at call time: form state may have shifted between
21
+ // render and click (e.g. another action just removed the row).
22
+ const runRowAction = (kind)=>{
23
+ if (kind === 'move-up' && !canMoveUp) return;
24
+ if (kind === 'move-down' && !canMoveDown) return;
25
+ if ((kind === 'duplicate' || kind === 'remove') && !canMutate) return;
26
+ const liveCount = rowCountAt(fields, parentPath);
27
+ if (rowIndex >= liveCount) return;
28
+ if (kind === 'move-down' && rowIndex >= liveCount - 1) return;
29
+ commit(()=>{
30
+ switch(kind){
31
+ case 'move-up':
32
+ dispatchFields({
33
+ type: 'MOVE_ROW',
34
+ path: parentPath,
35
+ moveFromIndex: rowIndex,
36
+ moveToIndex: rowIndex - 1
37
+ });
38
+ break;
39
+ case 'move-down':
40
+ dispatchFields({
41
+ type: 'MOVE_ROW',
42
+ path: parentPath,
43
+ moveFromIndex: rowIndex,
44
+ moveToIndex: rowIndex + 1
45
+ });
46
+ break;
47
+ case 'duplicate':
48
+ dispatchFields({
49
+ type: 'DUPLICATE_ROW',
50
+ path: parentPath,
51
+ rowIndex
52
+ });
53
+ break;
54
+ case 'remove':
55
+ dispatchFields({
56
+ type: 'REMOVE_ROW',
57
+ path: parentPath,
58
+ rowIndex
59
+ });
60
+ break;
61
+ }
62
+ });
63
+ if (kind === 'remove') {
64
+ onClearSelection();
65
+ return;
66
+ }
67
+ const nextIndex = kind === 'move-up' ? rowIndex - 1 : kind === 'move-down' ? rowIndex + 1 : rowIndex + 1;
68
+ onSelectPath(`${parentPath}.${nextIndex}`);
69
+ };
70
+ const moveUp = ()=>runRowAction('move-up');
71
+ const moveDown = ()=>runRowAction('move-down');
72
+ const duplicate = ()=>runRowAction('duplicate');
73
+ const remove = ()=>runRowAction('remove');
74
+ const addAfter = ({ blockType, schemaPath, containerPath, index })=>{
75
+ commit(()=>{
76
+ addFieldRow({
77
+ blockType,
78
+ path: containerPath,
79
+ rowIndex: index,
80
+ schemaPath
81
+ });
82
+ });
83
+ onSelectPath(`${containerPath}.${index}`);
84
+ };
85
+ return {
86
+ moveUp,
87
+ moveDown,
88
+ duplicate,
89
+ remove,
90
+ addAfter,
91
+ canMoveUp,
92
+ canMoveDown,
93
+ canMutate,
94
+ parentPath,
95
+ rowIndex,
96
+ rowCount
97
+ };
98
+ };
99
+
100
+ //# sourceMappingURL=useBlockActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/blocks/useBlockActions.ts"],"sourcesContent":["'use client'\n\nimport { useAllFormFields, useForm } from '@payloadcms/ui'\nimport { useEditorHistory } from '../../state/useEditorHistory'\nimport { splitFieldPath } from '../../internal/path'\n\ntype Args = {\n selectedBlockPath: string | null\n onSelectPath: (path: string | null) => void\n onClearSelection: () => void\n}\n\nconst rowCountAt = (\n fields: ReturnType<typeof useAllFormFields>[0],\n path: string,\n): number => {\n const rows = fields[path]?.rows\n return Array.isArray(rows) ? rows.length : 0\n}\n\nexport const useBlockActions = ({\n selectedBlockPath,\n onSelectPath,\n onClearSelection,\n}: Args) => {\n const [fields] = useAllFormFields()\n const { addFieldRow, dispatchFields } = useForm()\n const { commit } = useEditorHistory()\n\n const split = selectedBlockPath ? splitFieldPath(selectedBlockPath) : null\n const parentPath = split?.parent ?? ''\n const rowIndex = split ? split.index : NaN\n const rowCount = parentPath ? rowCountAt(fields, parentPath) : 0\n const canMutate = !Number.isNaN(rowIndex) && parentPath !== '' && rowIndex < rowCount\n const canMoveUp = canMutate && rowIndex > 0\n const canMoveDown = canMutate && rowIndex < rowCount - 1\n\n // Re-check bounds at call time: form state may have shifted between\n // render and click (e.g. another action just removed the row).\n const runRowAction = (\n kind: 'move-up' | 'move-down' | 'duplicate' | 'remove',\n ): void => {\n if (kind === 'move-up' && !canMoveUp) return\n if (kind === 'move-down' && !canMoveDown) return\n if ((kind === 'duplicate' || kind === 'remove') && !canMutate) return\n const liveCount = rowCountAt(fields, parentPath)\n if (rowIndex >= liveCount) return\n if (kind === 'move-down' && rowIndex >= liveCount - 1) return\n commit(() => {\n switch (kind) {\n case 'move-up':\n dispatchFields({\n type: 'MOVE_ROW',\n path: parentPath,\n moveFromIndex: rowIndex,\n moveToIndex: rowIndex - 1,\n })\n break\n case 'move-down':\n dispatchFields({\n type: 'MOVE_ROW',\n path: parentPath,\n moveFromIndex: rowIndex,\n moveToIndex: rowIndex + 1,\n })\n break\n case 'duplicate':\n dispatchFields({ type: 'DUPLICATE_ROW', path: parentPath, rowIndex })\n break\n case 'remove':\n dispatchFields({ type: 'REMOVE_ROW', path: parentPath, rowIndex })\n break\n }\n })\n if (kind === 'remove') {\n onClearSelection()\n return\n }\n const nextIndex =\n kind === 'move-up' ? rowIndex - 1 : kind === 'move-down' ? rowIndex + 1 : rowIndex + 1\n onSelectPath(`${parentPath}.${nextIndex}`)\n }\n\n const moveUp = () => runRowAction('move-up')\n const moveDown = () => runRowAction('move-down')\n const duplicate = () => runRowAction('duplicate')\n const remove = () => runRowAction('remove')\n\n const addAfter = ({\n blockType,\n schemaPath,\n containerPath,\n index,\n }: {\n blockType?: string\n schemaPath: string\n containerPath: string\n index: number\n }) => {\n commit(() => {\n addFieldRow({\n blockType,\n path: containerPath,\n rowIndex: index,\n schemaPath,\n })\n })\n onSelectPath(`${containerPath}.${index}`)\n }\n\n return {\n moveUp,\n moveDown,\n duplicate,\n remove,\n addAfter,\n canMoveUp,\n canMoveDown,\n canMutate,\n parentPath,\n rowIndex,\n rowCount,\n }\n}\n"],"names":["useAllFormFields","useForm","useEditorHistory","splitFieldPath","rowCountAt","fields","path","rows","Array","isArray","length","useBlockActions","selectedBlockPath","onSelectPath","onClearSelection","addFieldRow","dispatchFields","commit","split","parentPath","parent","rowIndex","index","NaN","rowCount","canMutate","Number","isNaN","canMoveUp","canMoveDown","runRowAction","kind","liveCount","type","moveFromIndex","moveToIndex","nextIndex","moveUp","moveDown","duplicate","remove","addAfter","blockType","schemaPath","containerPath"],"mappings":"AAAA;AAEA,SAASA,gBAAgB,EAAEC,OAAO,QAAQ,iBAAgB;AAC1D,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,SAASC,cAAc,QAAQ,sBAAqB;AAQpD,MAAMC,aAAa,CACjBC,QACAC;IAEA,MAAMC,OAAOF,MAAM,CAACC,KAAK,EAAEC;IAC3B,OAAOC,MAAMC,OAAO,CAACF,QAAQA,KAAKG,MAAM,GAAG;AAC7C;AAEA,OAAO,MAAMC,kBAAkB,CAAC,EAC9BC,iBAAiB,EACjBC,YAAY,EACZC,gBAAgB,EACX;IACL,MAAM,CAACT,OAAO,GAAGL;IACjB,MAAM,EAAEe,WAAW,EAAEC,cAAc,EAAE,GAAGf;IACxC,MAAM,EAAEgB,MAAM,EAAE,GAAGf;IAEnB,MAAMgB,QAAQN,oBAAoBT,eAAeS,qBAAqB;IACtE,MAAMO,aAAaD,OAAOE,UAAU;IACpC,MAAMC,WAAWH,QAAQA,MAAMI,KAAK,GAAGC;IACvC,MAAMC,WAAWL,aAAaf,WAAWC,QAAQc,cAAc;IAC/D,MAAMM,YAAY,CAACC,OAAOC,KAAK,CAACN,aAAaF,eAAe,MAAME,WAAWG;IAC7E,MAAMI,YAAYH,aAAaJ,WAAW;IAC1C,MAAMQ,cAAcJ,aAAaJ,WAAWG,WAAW;IAEvD,oEAAoE;IACpE,+DAA+D;IAC/D,MAAMM,eAAe,CACnBC;QAEA,IAAIA,SAAS,aAAa,CAACH,WAAW;QACtC,IAAIG,SAAS,eAAe,CAACF,aAAa;QAC1C,IAAI,AAACE,CAAAA,SAAS,eAAeA,SAAS,QAAO,KAAM,CAACN,WAAW;QAC/D,MAAMO,YAAY5B,WAAWC,QAAQc;QACrC,IAAIE,YAAYW,WAAW;QAC3B,IAAID,SAAS,eAAeV,YAAYW,YAAY,GAAG;QACvDf,OAAO;YACL,OAAQc;gBACN,KAAK;oBACHf,eAAe;wBACbiB,MAAM;wBACN3B,MAAMa;wBACNe,eAAeb;wBACfc,aAAad,WAAW;oBAC1B;oBACA;gBACF,KAAK;oBACHL,eAAe;wBACbiB,MAAM;wBACN3B,MAAMa;wBACNe,eAAeb;wBACfc,aAAad,WAAW;oBAC1B;oBACA;gBACF,KAAK;oBACHL,eAAe;wBAAEiB,MAAM;wBAAiB3B,MAAMa;wBAAYE;oBAAS;oBACnE;gBACF,KAAK;oBACHL,eAAe;wBAAEiB,MAAM;wBAAc3B,MAAMa;wBAAYE;oBAAS;oBAChE;YACJ;QACF;QACA,IAAIU,SAAS,UAAU;YACrBjB;YACA;QACF;QACA,MAAMsB,YACJL,SAAS,YAAYV,WAAW,IAAIU,SAAS,cAAcV,WAAW,IAAIA,WAAW;QACvFR,aAAa,GAAGM,WAAW,CAAC,EAAEiB,WAAW;IAC3C;IAEA,MAAMC,SAAS,IAAMP,aAAa;IAClC,MAAMQ,WAAW,IAAMR,aAAa;IACpC,MAAMS,YAAY,IAAMT,aAAa;IACrC,MAAMU,SAAS,IAAMV,aAAa;IAElC,MAAMW,WAAW,CAAC,EAChBC,SAAS,EACTC,UAAU,EACVC,aAAa,EACbtB,KAAK,EAMN;QACCL,OAAO;YACLF,YAAY;gBACV2B;gBACApC,MAAMsC;gBACNvB,UAAUC;gBACVqB;YACF;QACF;QACA9B,aAAa,GAAG+B,cAAc,CAAC,EAAEtB,OAAO;IAC1C;IAEA,OAAO;QACLe;QACAC;QACAC;QACAC;QACAC;QACAb;QACAC;QACAJ;QACAN;QACAE;QACAG;IACF;AACF,EAAC"}
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { type LucideProps } from 'lucide-react';
3
+ export type { LucideProps };
4
+ export declare const ChevronUp: React.FC<LucideProps>;
5
+ export declare const ChevronDown: React.FC<LucideProps>;
6
+ export declare const CopyIcon: React.FC<LucideProps>;
7
+ export declare const TrashIcon: React.FC<LucideProps>;
8
+ export declare const PlusIcon: React.FC<LucideProps>;
9
+ export declare const DesktopIcon: React.FC<LucideProps>;
10
+ export declare const TabletIcon: React.FC<LucideProps>;
11
+ export declare const MobileIcon: React.FC<LucideProps>;
12
+ export declare const ResponsiveIcon: React.FC<LucideProps>;
13
+ export declare const FullscreenIcon: React.FC<LucideProps>;
14
+ export declare const FullscreenExitIcon: React.FC<LucideProps>;
15
+ export declare const UndoIcon: React.FC<LucideProps>;
16
+ export declare const RedoIcon: React.FC<LucideProps>;
17
+ export declare const LayoutIcon: React.FC<LucideProps>;
18
+ export declare const SidebarHideIcon: React.FC<LucideProps>;
19
+ export declare const SidebarShowIcon: React.FC<LucideProps>;
20
+ export declare const InteractIcon: React.FC<LucideProps>;
21
+ export declare const InteractOffIcon: React.FC<LucideProps>;
22
+ export declare const StarIcon: React.FC<LucideProps>;
23
+ export declare const BugIcon: React.FC<LucideProps>;
24
+ export declare const GithubIcon: React.FC<LucideProps>;
@@ -0,0 +1,36 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { ChevronUp as L_ChevronUp, ChevronDown as L_ChevronDown, Copy as L_Copy, Trash2 as L_Trash2, Plus as L_Plus, Monitor as L_Monitor, Tablet as L_Tablet, Smartphone as L_Smartphone, MoveHorizontal as L_MoveHorizontal, Expand as L_Expand, Shrink as L_Shrink, Undo as L_Undo, Redo as L_Redo, PanelLeft as L_PanelLeft, PanelRightOpen as L_PanelRightOpen, PanelRightClose as L_PanelRightClose, MousePointer2 as L_MousePointer2, MousePointer2Off as L_MousePointer2Off, Star as L_Star, Bug as L_Bug, Github as L_Github } from 'lucide-react';
5
+ // Pin default size to 16px (lucide's own default is 24); caller props win.
6
+ const sized = (Icon)=>{
7
+ const Wrapped = (props)=>/*#__PURE__*/ _jsx(Icon, {
8
+ size: 16,
9
+ ...props
10
+ });
11
+ Wrapped.displayName = `Sized(${Icon.displayName ?? Icon.name})`;
12
+ return Wrapped;
13
+ };
14
+ export const ChevronUp = sized(L_ChevronUp);
15
+ export const ChevronDown = sized(L_ChevronDown);
16
+ export const CopyIcon = sized(L_Copy);
17
+ export const TrashIcon = sized(L_Trash2);
18
+ export const PlusIcon = sized(L_Plus);
19
+ export const DesktopIcon = sized(L_Monitor);
20
+ export const TabletIcon = sized(L_Tablet);
21
+ export const MobileIcon = sized(L_Smartphone);
22
+ export const ResponsiveIcon = sized(L_MoveHorizontal);
23
+ export const FullscreenIcon = sized(L_Expand);
24
+ export const FullscreenExitIcon = sized(L_Shrink);
25
+ export const UndoIcon = sized(L_Undo);
26
+ export const RedoIcon = sized(L_Redo);
27
+ export const LayoutIcon = sized(L_PanelLeft);
28
+ export const SidebarHideIcon = sized(L_PanelRightClose);
29
+ export const SidebarShowIcon = sized(L_PanelRightOpen);
30
+ export const InteractIcon = sized(L_MousePointer2);
31
+ export const InteractOffIcon = sized(L_MousePointer2Off);
32
+ export const StarIcon = sized(L_Star);
33
+ export const BugIcon = sized(L_Bug);
34
+ export const GithubIcon = sized(L_Github);
35
+
36
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/icons.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport {\n ChevronUp as L_ChevronUp,\n ChevronDown as L_ChevronDown,\n Copy as L_Copy,\n Trash2 as L_Trash2,\n Plus as L_Plus,\n Monitor as L_Monitor,\n Tablet as L_Tablet,\n Smartphone as L_Smartphone,\n MoveHorizontal as L_MoveHorizontal,\n Expand as L_Expand,\n Shrink as L_Shrink,\n Undo as L_Undo,\n Redo as L_Redo,\n PanelLeft as L_PanelLeft,\n PanelRightOpen as L_PanelRightOpen,\n PanelRightClose as L_PanelRightClose,\n MousePointer2 as L_MousePointer2,\n MousePointer2Off as L_MousePointer2Off,\n Star as L_Star,\n Bug as L_Bug,\n Github as L_Github,\n type LucideProps,\n} from 'lucide-react'\n\nexport type { LucideProps }\n\n// Pin default size to 16px (lucide's own default is 24); caller props win.\nconst sized = (Icon: React.ComponentType<LucideProps>): React.FC<LucideProps> => {\n const Wrapped: React.FC<LucideProps> = (props) => <Icon size={16} {...props} />\n Wrapped.displayName = `Sized(${Icon.displayName ?? Icon.name})`\n return Wrapped\n}\n\nexport const ChevronUp = sized(L_ChevronUp)\nexport const ChevronDown = sized(L_ChevronDown)\nexport const CopyIcon = sized(L_Copy)\nexport const TrashIcon = sized(L_Trash2)\nexport const PlusIcon = sized(L_Plus)\nexport const DesktopIcon = sized(L_Monitor)\nexport const TabletIcon = sized(L_Tablet)\nexport const MobileIcon = sized(L_Smartphone)\nexport const ResponsiveIcon = sized(L_MoveHorizontal)\nexport const FullscreenIcon = sized(L_Expand)\nexport const FullscreenExitIcon = sized(L_Shrink)\nexport const UndoIcon = sized(L_Undo)\nexport const RedoIcon = sized(L_Redo)\nexport const LayoutIcon = sized(L_PanelLeft)\nexport const SidebarHideIcon = sized(L_PanelRightClose)\nexport const SidebarShowIcon = sized(L_PanelRightOpen)\nexport const InteractIcon = sized(L_MousePointer2)\nexport const InteractOffIcon = sized(L_MousePointer2Off)\nexport const StarIcon = sized(L_Star)\nexport const BugIcon = sized(L_Bug)\nexport const GithubIcon = sized(L_Github)\n"],"names":["React","ChevronUp","L_ChevronUp","ChevronDown","L_ChevronDown","Copy","L_Copy","Trash2","L_Trash2","Plus","L_Plus","Monitor","L_Monitor","Tablet","L_Tablet","Smartphone","L_Smartphone","MoveHorizontal","L_MoveHorizontal","Expand","L_Expand","Shrink","L_Shrink","Undo","L_Undo","Redo","L_Redo","PanelLeft","L_PanelLeft","PanelRightOpen","L_PanelRightOpen","PanelRightClose","L_PanelRightClose","MousePointer2","L_MousePointer2","MousePointer2Off","L_MousePointer2Off","Star","L_Star","Bug","L_Bug","Github","L_Github","sized","Icon","Wrapped","props","size","displayName","name","CopyIcon","TrashIcon","PlusIcon","DesktopIcon","TabletIcon","MobileIcon","ResponsiveIcon","FullscreenIcon","FullscreenExitIcon","UndoIcon","RedoIcon","LayoutIcon","SidebarHideIcon","SidebarShowIcon","InteractIcon","InteractOffIcon","StarIcon","BugIcon","GithubIcon"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AACzB,SACEC,aAAaC,WAAW,EACxBC,eAAeC,aAAa,EAC5BC,QAAQC,MAAM,EACdC,UAAUC,QAAQ,EAClBC,QAAQC,MAAM,EACdC,WAAWC,SAAS,EACpBC,UAAUC,QAAQ,EAClBC,cAAcC,YAAY,EAC1BC,kBAAkBC,gBAAgB,EAClCC,UAAUC,QAAQ,EAClBC,UAAUC,QAAQ,EAClBC,QAAQC,MAAM,EACdC,QAAQC,MAAM,EACdC,aAAaC,WAAW,EACxBC,kBAAkBC,gBAAgB,EAClCC,mBAAmBC,iBAAiB,EACpCC,iBAAiBC,eAAe,EAChCC,oBAAoBC,kBAAkB,EACtCC,QAAQC,MAAM,EACdC,OAAOC,KAAK,EACZC,UAAUC,QAAQ,QAEb,eAAc;AAIrB,2EAA2E;AAC3E,MAAMC,QAAQ,CAACC;IACb,MAAMC,UAAiC,CAACC,sBAAU,KAACF;YAAKG,MAAM;YAAK,GAAGD,KAAK;;IAC3ED,QAAQG,WAAW,GAAG,CAAC,MAAM,EAAEJ,KAAKI,WAAW,IAAIJ,KAAKK,IAAI,CAAC,CAAC,CAAC;IAC/D,OAAOJ;AACT;AAEA,OAAO,MAAM5C,YAAY0C,MAAMzC,aAAY;AAC3C,OAAO,MAAMC,cAAcwC,MAAMvC,eAAc;AAC/C,OAAO,MAAM8C,WAAWP,MAAMrC,QAAO;AACrC,OAAO,MAAM6C,YAAYR,MAAMnC,UAAS;AACxC,OAAO,MAAM4C,WAAWT,MAAMjC,QAAO;AACrC,OAAO,MAAM2C,cAAcV,MAAM/B,WAAU;AAC3C,OAAO,MAAM0C,aAAaX,MAAM7B,UAAS;AACzC,OAAO,MAAMyC,aAAaZ,MAAM3B,cAAa;AAC7C,OAAO,MAAMwC,iBAAiBb,MAAMzB,kBAAiB;AACrD,OAAO,MAAMuC,iBAAiBd,MAAMvB,UAAS;AAC7C,OAAO,MAAMsC,qBAAqBf,MAAMrB,UAAS;AACjD,OAAO,MAAMqC,WAAWhB,MAAMnB,QAAO;AACrC,OAAO,MAAMoC,WAAWjB,MAAMjB,QAAO;AACrC,OAAO,MAAMmC,aAAalB,MAAMf,aAAY;AAC5C,OAAO,MAAMkC,kBAAkBnB,MAAMX,mBAAkB;AACvD,OAAO,MAAM+B,kBAAkBpB,MAAMb,kBAAiB;AACtD,OAAO,MAAMkC,eAAerB,MAAMT,iBAAgB;AAClD,OAAO,MAAM+B,kBAAkBtB,MAAMP,oBAAmB;AACxD,OAAO,MAAM8B,WAAWvB,MAAML,QAAO;AACrC,OAAO,MAAM6B,UAAUxB,MAAMH,OAAM;AACnC,OAAO,MAAM4B,aAAazB,MAAMD,UAAS"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export type BlockSettingsTabProps = {
3
+ selectedBlockPath: string | null;
4
+ onClearSelection: () => void;
5
+ onSelectPath: (path: string | null) => void;
6
+ blocksField: string;
7
+ /** Bump to open the add-after drawer externally (iframe `+` button). */
8
+ addBelowRequestId?: number;
9
+ };
10
+ export declare const BlockSettingsTab: React.FC<BlockSettingsTabProps>;
@@ -0,0 +1,153 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import React, { useMemo } from 'react';
4
+ import { RenderFields, useAllFormFields, useDrawerSlug, useField, useModal } from '@payloadcms/ui';
5
+ import { useDocConfig } from '../../hooks/useDocConfig';
6
+ import { useAddBlockDrawer } from '../../hooks/useAddBlockDrawer';
7
+ import { AddBlockDrawer } from '../blocks/AddBlockDrawer';
8
+ import { BlockActionsToolbar } from '../blocks/BlockActionsToolbar';
9
+ import { useBlockActions } from '../blocks/useBlockActions';
10
+ import { findNamedField, resolveBlockSchema } from '../blocks/schema';
11
+ import { BlockEmptyState } from '../blocks/BlockEmptyState';
12
+ import { BlockHeader } from '../blocks/BlockHeader';
13
+ export const BlockSettingsTab = ({ selectedBlockPath, onClearSelection, onSelectPath, blocksField, addBelowRequestId = 0 })=>{
14
+ const { fields: docFields, slug: docSlug } = useDocConfig();
15
+ const [fields] = useAllFormFields();
16
+ const { toggleModal } = useModal();
17
+ const addBlockDrawerSlug = useDrawerSlug('better-editor-add-block');
18
+ const addAfterDrawerSlug = useDrawerSlug('better-editor-add-after');
19
+ const actions = useBlockActions({
20
+ selectedBlockPath,
21
+ onSelectPath,
22
+ onClearSelection
23
+ });
24
+ useAddBlockDrawer({
25
+ drawerSlug: addAfterDrawerSlug,
26
+ requestId: addBelowRequestId,
27
+ selectedBlockPath
28
+ });
29
+ const blocksFieldInfo = useMemo(()=>{
30
+ if (!docFields) return null;
31
+ return findNamedField(docFields, blocksField, docSlug || '');
32
+ }, [
33
+ docFields,
34
+ blocksField,
35
+ docSlug
36
+ ]);
37
+ const blocksFieldField = blocksFieldInfo?.field;
38
+ const availableBlocks = blocksFieldField && blocksFieldField.type === 'blocks' ? blocksFieldField.blocks : [];
39
+ const blocksSchemaPath = blocksFieldInfo?.schemaPath || '';
40
+ const topLevelRows = fields[blocksField]?.rows;
41
+ const addRowIndex = Array.isArray(topLevelRows) ? topLevelRows.length : 0;
42
+ if (!selectedBlockPath) {
43
+ return /*#__PURE__*/ _jsxs(_Fragment, {
44
+ children: [
45
+ /*#__PURE__*/ _jsx(BlockEmptyState, {
46
+ canAdd: availableBlocks.length > 0,
47
+ onAddClick: ()=>toggleModal(addBlockDrawerSlug)
48
+ }),
49
+ availableBlocks.length > 0 ? /*#__PURE__*/ _jsx(AddBlockDrawer, {
50
+ slug: addBlockDrawerSlug,
51
+ blocks: availableBlocks,
52
+ addRow: (index, blockType)=>actions.addAfter({
53
+ blockType,
54
+ schemaPath: blocksSchemaPath,
55
+ containerPath: blocksField,
56
+ index
57
+ }),
58
+ addRowIndex: addRowIndex
59
+ }) : null
60
+ ]
61
+ });
62
+ }
63
+ const resolved = docFields ? resolveBlockSchema({
64
+ docFields,
65
+ docSlug: docSlug || '',
66
+ formFields: fields
67
+ }, selectedBlockPath) : null;
68
+ return /*#__PURE__*/ _jsxs("div", {
69
+ className: "better-editor-tab better-editor-tab--native",
70
+ children: [
71
+ /*#__PURE__*/ _jsx(BlockHeader, {
72
+ blockType: resolved?.blockType || 'unknown',
73
+ path: selectedBlockPath,
74
+ onClearSelection: onClearSelection
75
+ }),
76
+ /*#__PURE__*/ _jsx("hr", {
77
+ className: "better-editor-tab__divider",
78
+ "aria-hidden": "true"
79
+ }),
80
+ /*#__PURE__*/ _jsx(BlockActionsToolbar, {
81
+ canMoveUp: actions.canMoveUp,
82
+ canMoveDown: actions.canMoveDown,
83
+ canMutate: actions.canMutate,
84
+ canAddBelow: !!resolved,
85
+ onMoveUp: actions.moveUp,
86
+ onMoveDown: actions.moveDown,
87
+ onDuplicate: actions.duplicate,
88
+ onAddBelow: ()=>toggleModal(addAfterDrawerSlug),
89
+ onDelete: actions.remove
90
+ }),
91
+ actions.canMutate && resolved && resolved.blocksFieldBlocks.length > 0 ? /*#__PURE__*/ _jsx(AddBlockDrawer, {
92
+ slug: addAfterDrawerSlug,
93
+ blocks: resolved.blocksFieldBlocks,
94
+ addRow: (index, blockType)=>actions.addAfter({
95
+ blockType,
96
+ schemaPath: resolved.blocksFieldSchemaPath,
97
+ containerPath: actions.parentPath,
98
+ index
99
+ }),
100
+ addRowIndex: actions.rowIndex + 1
101
+ }) : null,
102
+ !resolved ? /*#__PURE__*/ _jsx("div", {
103
+ className: "better-editor-tab__empty",
104
+ children: "Could not resolve block schema for this path."
105
+ }) : /*#__PURE__*/ _jsxs(_Fragment, {
106
+ children: [
107
+ /*#__PURE__*/ _jsx(BlockNameInput, {
108
+ path: `${selectedBlockPath}.blockName`
109
+ }),
110
+ /*#__PURE__*/ _jsx("hr", {
111
+ className: "better-editor-tab__divider",
112
+ "aria-hidden": "true"
113
+ }),
114
+ /*#__PURE__*/ _jsx(RenderFields, {
115
+ fields: resolved.blockFields,
116
+ parentPath: resolved.parentPath,
117
+ parentIndexPath: "",
118
+ parentSchemaPath: resolved.schemaPath,
119
+ // RenderFields' client read-gate is bypassed; the server-side
120
+ // write check still runs on save.
121
+ permissions: true
122
+ })
123
+ ]
124
+ })
125
+ ]
126
+ });
127
+ };
128
+ const BlockNameInput = ({ path })=>{
129
+ const { value, setValue } = useField({
130
+ path
131
+ });
132
+ const inputId = `be-blockname-${path}`;
133
+ return /*#__PURE__*/ _jsxs("div", {
134
+ className: "better-editor-tab__block-name",
135
+ children: [
136
+ /*#__PURE__*/ _jsx("label", {
137
+ className: "better-editor-tab__block-name-label",
138
+ htmlFor: inputId,
139
+ children: "Block Name"
140
+ }),
141
+ /*#__PURE__*/ _jsx("input", {
142
+ id: inputId,
143
+ className: "better-editor-tab__block-name-input",
144
+ type: "text",
145
+ value: value || '',
146
+ onChange: (e)=>setValue(e.target.value),
147
+ placeholder: "Optional label for this block"
148
+ })
149
+ ]
150
+ });
151
+ };
152
+
153
+ //# sourceMappingURL=BlockSettingsTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/sidebar/BlockSettingsTab.tsx"],"sourcesContent":["'use client'\n\nimport React, { useMemo } from 'react'\nimport {\n RenderFields,\n useAllFormFields,\n useDrawerSlug,\n useField,\n useModal,\n} from '@payloadcms/ui'\nimport { useDocConfig } from '../../hooks/useDocConfig'\nimport { useAddBlockDrawer } from '../../hooks/useAddBlockDrawer'\nimport { AddBlockDrawer } from '../blocks/AddBlockDrawer'\nimport { BlockActionsToolbar } from '../blocks/BlockActionsToolbar'\nimport { useBlockActions } from '../blocks/useBlockActions'\nimport { findNamedField, resolveBlockSchema } from '../blocks/schema'\nimport type { ClientBlock } from 'payload'\nimport { BlockEmptyState } from '../blocks/BlockEmptyState'\nimport { BlockHeader } from '../blocks/BlockHeader'\n\nexport type BlockSettingsTabProps = {\n selectedBlockPath: string | null\n onClearSelection: () => void\n onSelectPath: (path: string | null) => void\n blocksField: string\n /** Bump to open the add-after drawer externally (iframe `+` button). */\n addBelowRequestId?: number\n}\n\nexport const BlockSettingsTab: React.FC<BlockSettingsTabProps> = ({\n selectedBlockPath,\n onClearSelection,\n onSelectPath,\n blocksField,\n addBelowRequestId = 0,\n}) => {\n const { fields: docFields, slug: docSlug } = useDocConfig()\n const [fields] = useAllFormFields()\n const { toggleModal } = useModal()\n const addBlockDrawerSlug = useDrawerSlug('better-editor-add-block')\n const addAfterDrawerSlug = useDrawerSlug('better-editor-add-after')\n\n const actions = useBlockActions({\n selectedBlockPath,\n onSelectPath,\n onClearSelection,\n })\n\n useAddBlockDrawer({\n drawerSlug: addAfterDrawerSlug,\n requestId: addBelowRequestId,\n selectedBlockPath,\n })\n\n const blocksFieldInfo = useMemo(() => {\n if (!docFields) return null\n return findNamedField(docFields, blocksField, docSlug || '')\n }, [docFields, blocksField, docSlug])\n\n const blocksFieldField = blocksFieldInfo?.field\n const availableBlocks: ClientBlock[] =\n blocksFieldField && blocksFieldField.type === 'blocks' ? blocksFieldField.blocks : []\n const blocksSchemaPath = blocksFieldInfo?.schemaPath || ''\n const topLevelRows = fields[blocksField]?.rows\n const addRowIndex = Array.isArray(topLevelRows) ? topLevelRows.length : 0\n\n if (!selectedBlockPath) {\n return (\n <>\n <BlockEmptyState\n canAdd={availableBlocks.length > 0}\n onAddClick={() => toggleModal(addBlockDrawerSlug)}\n />\n {availableBlocks.length > 0 ? (\n <AddBlockDrawer\n slug={addBlockDrawerSlug}\n blocks={availableBlocks}\n addRow={(index, blockType) =>\n actions.addAfter({\n blockType,\n schemaPath: blocksSchemaPath,\n containerPath: blocksField,\n index,\n })\n }\n addRowIndex={addRowIndex}\n />\n ) : null}\n </>\n )\n }\n\n const resolved = docFields\n ? resolveBlockSchema({ docFields, docSlug: docSlug || '', formFields: fields }, selectedBlockPath)\n : null\n\n return (\n <div className=\"better-editor-tab better-editor-tab--native\">\n <BlockHeader\n blockType={resolved?.blockType || 'unknown'}\n path={selectedBlockPath}\n onClearSelection={onClearSelection}\n />\n\n <hr className=\"better-editor-tab__divider\" aria-hidden=\"true\" />\n\n <BlockActionsToolbar\n canMoveUp={actions.canMoveUp}\n canMoveDown={actions.canMoveDown}\n canMutate={actions.canMutate}\n canAddBelow={!!resolved}\n onMoveUp={actions.moveUp}\n onMoveDown={actions.moveDown}\n onDuplicate={actions.duplicate}\n onAddBelow={() => toggleModal(addAfterDrawerSlug)}\n onDelete={actions.remove}\n />\n\n {actions.canMutate && resolved && resolved.blocksFieldBlocks.length > 0 ? (\n <AddBlockDrawer\n slug={addAfterDrawerSlug}\n blocks={resolved.blocksFieldBlocks}\n addRow={(index, blockType) =>\n actions.addAfter({\n blockType,\n schemaPath: resolved.blocksFieldSchemaPath,\n containerPath: actions.parentPath,\n index,\n })\n }\n addRowIndex={actions.rowIndex + 1}\n />\n ) : null}\n\n {!resolved ? (\n <div className=\"better-editor-tab__empty\">\n Could not resolve block schema for this path.\n </div>\n ) : (\n <>\n <BlockNameInput path={`${selectedBlockPath}.blockName`} />\n <hr className=\"better-editor-tab__divider\" aria-hidden=\"true\" />\n <RenderFields\n fields={resolved.blockFields}\n parentPath={resolved.parentPath}\n parentIndexPath=\"\"\n parentSchemaPath={resolved.schemaPath}\n // RenderFields' client read-gate is bypassed; the server-side\n // write check still runs on save.\n permissions={true}\n />\n </>\n )}\n </div>\n )\n}\n\nconst BlockNameInput: React.FC<{ path: string }> = ({ path }) => {\n const { value, setValue } = useField<string>({ path })\n const inputId = `be-blockname-${path}`\n return (\n <div className=\"better-editor-tab__block-name\">\n <label className=\"better-editor-tab__block-name-label\" htmlFor={inputId}>\n Block Name\n </label>\n <input\n id={inputId}\n className=\"better-editor-tab__block-name-input\"\n type=\"text\"\n value={value || ''}\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Optional label for this block\"\n />\n </div>\n )\n}\n"],"names":["React","useMemo","RenderFields","useAllFormFields","useDrawerSlug","useField","useModal","useDocConfig","useAddBlockDrawer","AddBlockDrawer","BlockActionsToolbar","useBlockActions","findNamedField","resolveBlockSchema","BlockEmptyState","BlockHeader","BlockSettingsTab","selectedBlockPath","onClearSelection","onSelectPath","blocksField","addBelowRequestId","fields","docFields","slug","docSlug","toggleModal","addBlockDrawerSlug","addAfterDrawerSlug","actions","drawerSlug","requestId","blocksFieldInfo","blocksFieldField","field","availableBlocks","type","blocks","blocksSchemaPath","schemaPath","topLevelRows","rows","addRowIndex","Array","isArray","length","canAdd","onAddClick","addRow","index","blockType","addAfter","containerPath","resolved","formFields","div","className","path","hr","aria-hidden","canMoveUp","canMoveDown","canMutate","canAddBelow","onMoveUp","moveUp","onMoveDown","moveDown","onDuplicate","duplicate","onAddBelow","onDelete","remove","blocksFieldBlocks","blocksFieldSchemaPath","parentPath","rowIndex","BlockNameInput","blockFields","parentIndexPath","parentSchemaPath","permissions","value","setValue","inputId","label","htmlFor","input","id","onChange","e","target","placeholder"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { ClientField } from 'payload';
3
+ export type DocumentFieldsTabProps = {
4
+ filter: (field: ClientField) => boolean;
5
+ transform?: (fields: ClientField[]) => ClientField[];
6
+ emptyText: string;
7
+ };
8
+ export declare const DocumentFieldsTab: React.FC<DocumentFieldsTabProps>;
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React, { useMemo } from 'react';
4
+ import { RenderFields } from '@payloadcms/ui';
5
+ import { useDocConfig } from '../../hooks/useDocConfig';
6
+ // Bypass RenderFields' client-side read gate; the server still enforces
7
+ // access on save.
8
+ const FULL_ACCESS = true;
9
+ export const DocumentFieldsTab = ({ filter, transform, emptyText })=>{
10
+ const { fields: allFields, slug } = useDocConfig();
11
+ const fields = useMemo(()=>{
12
+ if (!allFields) return [];
13
+ const filtered = allFields.filter(filter);
14
+ return transform ? transform(filtered) : filtered;
15
+ }, [
16
+ allFields,
17
+ filter,
18
+ transform
19
+ ]);
20
+ if (fields.length === 0) {
21
+ return /*#__PURE__*/ _jsx("div", {
22
+ className: "better-editor-tab__empty",
23
+ children: emptyText
24
+ });
25
+ }
26
+ return /*#__PURE__*/ _jsx("div", {
27
+ className: "better-editor-tab better-editor-tab--native",
28
+ children: /*#__PURE__*/ _jsx(RenderFields, {
29
+ fields: fields,
30
+ parentPath: "",
31
+ parentIndexPath: "",
32
+ parentSchemaPath: slug,
33
+ permissions: FULL_ACCESS
34
+ })
35
+ });
36
+ };
37
+
38
+ //# sourceMappingURL=DocumentFieldsTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/sidebar/DocumentFieldsTab.tsx"],"sourcesContent":["'use client'\n\nimport React, { useMemo } from 'react'\nimport type { ClientField } from 'payload'\nimport { RenderFields } from '@payloadcms/ui'\nimport { useDocConfig } from '../../hooks/useDocConfig'\n\n// Bypass RenderFields' client-side read gate; the server still enforces\n// access on save.\nconst FULL_ACCESS = true as const\n\nexport type DocumentFieldsTabProps = {\n filter: (field: ClientField) => boolean\n transform?: (fields: ClientField[]) => ClientField[]\n emptyText: string\n}\n\nexport const DocumentFieldsTab: React.FC<DocumentFieldsTabProps> = ({\n filter,\n transform,\n emptyText,\n}) => {\n const { fields: allFields, slug } = useDocConfig()\n\n const fields = useMemo(() => {\n if (!allFields) return []\n const filtered = allFields.filter(filter)\n return transform ? transform(filtered) : filtered\n }, [allFields, filter, transform])\n\n if (fields.length === 0) {\n return <div className=\"better-editor-tab__empty\">{emptyText}</div>\n }\n\n return (\n <div className=\"better-editor-tab better-editor-tab--native\">\n <RenderFields\n fields={fields}\n parentPath=\"\"\n parentIndexPath=\"\"\n parentSchemaPath={slug}\n permissions={FULL_ACCESS}\n />\n </div>\n )\n}\n"],"names":["React","useMemo","RenderFields","useDocConfig","FULL_ACCESS","DocumentFieldsTab","filter","transform","emptyText","fields","allFields","slug","filtered","length","div","className","parentPath","parentIndexPath","parentSchemaPath","permissions"],"mappings":"AAAA;;AAEA,OAAOA,SAASC,OAAO,QAAQ,QAAO;AAEtC,SAASC,YAAY,QAAQ,iBAAgB;AAC7C,SAASC,YAAY,QAAQ,2BAA0B;AAEvD,wEAAwE;AACxE,kBAAkB;AAClB,MAAMC,cAAc;AAQpB,OAAO,MAAMC,oBAAsD,CAAC,EAClEC,MAAM,EACNC,SAAS,EACTC,SAAS,EACV;IACC,MAAM,EAAEC,QAAQC,SAAS,EAAEC,IAAI,EAAE,GAAGR;IAEpC,MAAMM,SAASR,QAAQ;QACrB,IAAI,CAACS,WAAW,OAAO,EAAE;QACzB,MAAME,WAAWF,UAAUJ,MAAM,CAACA;QAClC,OAAOC,YAAYA,UAAUK,YAAYA;IAC3C,GAAG;QAACF;QAAWJ;QAAQC;KAAU;IAEjC,IAAIE,OAAOI,MAAM,KAAK,GAAG;QACvB,qBAAO,KAACC;YAAIC,WAAU;sBAA4BP;;IACpD;IAEA,qBACE,KAACM;QAAIC,WAAU;kBACb,cAAA,KAACb;YACCO,QAAQA;YACRO,YAAW;YACXC,iBAAgB;YAChBC,kBAAkBP;YAClBQ,aAAaf;;;AAIrB,EAAC"}
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const DocumentMetaTab: React.FC;
@@ -0,0 +1,11 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { DocumentFieldsTab } from './DocumentFieldsTab';
5
+ const isSidebarField = (f)=>'admin' in f && f.admin?.position === 'sidebar';
6
+ export const DocumentMetaTab = ()=>/*#__PURE__*/ _jsx(DocumentFieldsTab, {
7
+ filter: isSidebarField,
8
+ emptyText: "No document settings."
9
+ });
10
+
11
+ //# sourceMappingURL=DocumentMetaTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/sidebar/DocumentMetaTab.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport type { ClientField } from 'payload'\nimport { DocumentFieldsTab } from './DocumentFieldsTab'\n\nconst isSidebarField = (f: ClientField): boolean =>\n 'admin' in f && f.admin?.position === 'sidebar'\n\nexport const DocumentMetaTab: React.FC = () => (\n <DocumentFieldsTab\n filter={isSidebarField}\n emptyText=\"No document settings.\"\n />\n)\n"],"names":["React","DocumentFieldsTab","isSidebarField","f","admin","position","DocumentMetaTab","filter","emptyText"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,SAASC,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,iBAAiB,CAACC,IACtB,WAAWA,KAAKA,EAAEC,KAAK,EAAEC,aAAa;AAExC,OAAO,MAAMC,kBAA4B,kBACvC,KAACL;QACCM,QAAQL;QACRM,WAAU;OAEb"}
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const DocumentSettingsTab: React.FC;