@payload-onpage/react 0.0.0-stage → 0.2.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.
- package/LICENSE +21 -0
- package/README.md +13 -2
- package/dist/OnPageClient.d.ts +18 -0
- package/dist/OnPageClient.d.ts.map +1 -0
- package/dist/OnPageClient.js +51 -0
- package/dist/OnPageClient.js.map +1 -0
- package/dist/annotations.d.ts +55 -0
- package/dist/annotations.d.ts.map +1 -0
- package/dist/annotations.js +60 -0
- package/dist/annotations.js.map +1 -0
- package/dist/context.d.ts +7 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +19 -0
- package/dist/context.js.map +1 -0
- package/dist/dom.d.ts +42 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +95 -0
- package/dist/dom.js.map +1 -0
- package/dist/editor/FieldHost.d.ts +5 -0
- package/dist/editor/FieldHost.d.ts.map +1 -0
- package/dist/editor/FieldHost.js +36 -0
- package/dist/editor/FieldHost.js.map +1 -0
- package/dist/editor/Ghosts.d.ts +6 -0
- package/dist/editor/Ghosts.d.ts.map +1 -0
- package/dist/editor/Ghosts.js +37 -0
- package/dist/editor/Ghosts.js.map +1 -0
- package/dist/editor/OnPageEditor.d.ts +25 -0
- package/dist/editor/OnPageEditor.d.ts.map +1 -0
- package/dist/editor/OnPageEditor.js +211 -0
- package/dist/editor/OnPageEditor.js.map +1 -0
- package/dist/editor/useGhosts.d.ts +24 -0
- package/dist/editor/useGhosts.d.ts.map +1 -0
- package/dist/editor/useGhosts.js +34 -0
- package/dist/editor/useGhosts.js.map +1 -0
- package/dist/editor/usePageEvents.d.ts +3 -0
- package/dist/editor/usePageEvents.d.ts.map +1 -0
- package/dist/editor/usePageEvents.js +164 -0
- package/dist/editor/usePageEvents.js.map +1 -0
- package/dist/editor-kit.d.ts +19 -0
- package/dist/editor-kit.d.ts.map +1 -0
- package/dist/editor-kit.js +17 -0
- package/dist/editor-kit.js.map +1 -0
- package/dist/editors/CheckboxEditor.d.ts +3 -0
- package/dist/editors/CheckboxEditor.d.ts.map +1 -0
- package/dist/editors/CheckboxEditor.js +10 -0
- package/dist/editors/CheckboxEditor.js.map +1 -0
- package/dist/editors/ColorEditor.d.ts +4 -0
- package/dist/editors/ColorEditor.d.ts.map +1 -0
- package/dist/editors/ColorEditor.js +21 -0
- package/dist/editors/ColorEditor.js.map +1 -0
- package/dist/editors/DateEditor.d.ts +3 -0
- package/dist/editors/DateEditor.d.ts.map +1 -0
- package/dist/editors/DateEditor.js +28 -0
- package/dist/editors/DateEditor.js.map +1 -0
- package/dist/editors/InlineText.d.ts +4 -0
- package/dist/editors/InlineText.d.ts.map +1 -0
- package/dist/editors/InlineText.js +77 -0
- package/dist/editors/InlineText.js.map +1 -0
- package/dist/editors/NumberEditor.d.ts +4 -0
- package/dist/editors/NumberEditor.d.ts.map +1 -0
- package/dist/editors/NumberEditor.js +23 -0
- package/dist/editors/NumberEditor.js.map +1 -0
- package/dist/editors/RelationshipEditor.d.ts +3 -0
- package/dist/editors/RelationshipEditor.d.ts.map +1 -0
- package/dist/editors/RelationshipEditor.js +60 -0
- package/dist/editors/RelationshipEditor.js.map +1 -0
- package/dist/editors/SelectEditor.d.ts +4 -0
- package/dist/editors/SelectEditor.d.ts.map +1 -0
- package/dist/editors/SelectEditor.js +36 -0
- package/dist/editors/SelectEditor.js.map +1 -0
- package/dist/editors/UploadEditor.d.ts +3 -0
- package/dist/editors/UploadEditor.d.ts.map +1 -0
- package/dist/editors/UploadEditor.js +48 -0
- package/dist/editors/UploadEditor.js.map +1 -0
- package/dist/editors/index.d.ts +13 -0
- package/dist/editors/index.d.ts.map +1 -0
- package/dist/editors/index.js +23 -0
- package/dist/editors/index.js.map +1 -0
- package/dist/editors/useDebouncedSearch.d.ts +17 -0
- package/dist/editors/useDebouncedSearch.d.ts.map +1 -0
- package/dist/editors/useDebouncedSearch.js +50 -0
- package/dist/editors/useDebouncedSearch.js.map +1 -0
- package/dist/hub.d.ts +14 -0
- package/dist/hub.d.ts.map +1 -0
- package/dist/hub.js +20 -0
- package/dist/hub.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +12 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +83 -0
- package/dist/layout.js.map +1 -0
- package/dist/locators.d.ts +19 -0
- package/dist/locators.d.ts.map +1 -0
- package/dist/locators.js +215 -0
- package/dist/locators.js.map +1 -0
- package/dist/messages.d.ts +100 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +112 -0
- package/dist/messages.js.map +1 -0
- package/dist/registry.d.ts +15 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +29 -0
- package/dist/registry.js.map +1 -0
- package/dist/renderers.d.ts +7 -0
- package/dist/renderers.d.ts.map +1 -0
- package/dist/renderers.js +12 -0
- package/dist/renderers.js.map +1 -0
- package/dist/sanitize.d.ts +2 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +49 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/styles.d.ts +8 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +122 -0
- package/dist/styles.js.map +1 -0
- package/dist/targets.d.ts +18 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +86 -0
- package/dist/targets.js.map +1 -0
- package/dist/types.d.ts +131 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/BlockPicker.d.ts +3 -0
- package/dist/ui/BlockPicker.d.ts.map +1 -0
- package/dist/ui/BlockPicker.js +27 -0
- package/dist/ui/BlockPicker.js.map +1 -0
- package/dist/ui/Dialog.d.ts +22 -0
- package/dist/ui/Dialog.d.ts.map +1 -0
- package/dist/ui/Dialog.js +83 -0
- package/dist/ui/Dialog.js.map +1 -0
- package/dist/ui/Dock.d.ts +7 -0
- package/dist/ui/Dock.d.ts.map +1 -0
- package/dist/ui/Dock.js +104 -0
- package/dist/ui/Dock.js.map +1 -0
- package/dist/ui/Overlay.d.ts +2 -0
- package/dist/ui/Overlay.d.ts.map +1 -0
- package/dist/ui/Overlay.js +150 -0
- package/dist/ui/Overlay.js.map +1 -0
- package/dist/ui/PostButton.d.ts +10 -0
- package/dist/ui/PostButton.d.ts.map +1 -0
- package/dist/ui/PostButton.js +7 -0
- package/dist/ui/PostButton.js.map +1 -0
- package/dist/ui/PreviewToolbar.d.ts +15 -0
- package/dist/ui/PreviewToolbar.d.ts.map +1 -0
- package/dist/ui/PreviewToolbar.js +45 -0
- package/dist/ui/PreviewToolbar.js.map +1 -0
- package/dist/ui/SettingsPanel.d.ts +11 -0
- package/dist/ui/SettingsPanel.d.ts.map +1 -0
- package/dist/ui/SettingsPanel.js +130 -0
- package/dist/ui/SettingsPanel.js.map +1 -0
- package/dist/useEvent.d.ts +7 -0
- package/dist/useEvent.d.ts.map +1 -0
- package/dist/useEvent.js +15 -0
- package/dist/useEvent.js.map +1 -0
- package/package.json +71 -4
- package/src/OnPageClient.tsx +67 -0
- package/src/annotations.ts +83 -0
- package/src/context.tsx +23 -0
- package/src/dom.ts +118 -0
- package/src/editor/FieldHost.tsx +66 -0
- package/src/editor/Ghosts.tsx +55 -0
- package/src/editor/OnPageEditor.tsx +315 -0
- package/src/editor/useGhosts.ts +64 -0
- package/src/editor/usePageEvents.ts +161 -0
- package/src/editor-kit.ts +27 -0
- package/src/editors/CheckboxEditor.tsx +31 -0
- package/src/editors/ColorEditor.tsx +64 -0
- package/src/editors/DateEditor.tsx +64 -0
- package/src/editors/InlineText.tsx +106 -0
- package/src/editors/NumberEditor.tsx +69 -0
- package/src/editors/RelationshipEditor.tsx +153 -0
- package/src/editors/SelectEditor.tsx +74 -0
- package/src/editors/UploadEditor.tsx +130 -0
- package/src/editors/index.ts +35 -0
- package/src/editors/useDebouncedSearch.ts +54 -0
- package/src/hub.ts +32 -0
- package/src/index.ts +55 -0
- package/src/layout.ts +83 -0
- package/src/locators.ts +210 -0
- package/src/messages.ts +120 -0
- package/src/registry.ts +43 -0
- package/src/renderers.ts +15 -0
- package/src/sanitize.ts +52 -0
- package/src/styles.ts +122 -0
- package/src/targets.ts +101 -0
- package/src/types.ts +132 -0
- package/src/ui/BlockPicker.tsx +49 -0
- package/src/ui/Dialog.tsx +159 -0
- package/src/ui/Dock.tsx +240 -0
- package/src/ui/Overlay.tsx +324 -0
- package/src/ui/PostButton.tsx +26 -0
- package/src/ui/PreviewToolbar.tsx +123 -0
- package/src/ui/SettingsPanel.tsx +279 -0
- package/src/useEvent.ts +16 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Dialog } from "../ui/Dialog.js";
|
|
5
|
+
/** Payload stores dates as ISO strings; the input works in local time. */
|
|
6
|
+
const toLocalInput = (iso, withTime) => {
|
|
7
|
+
if (typeof iso !== 'string' || !iso)
|
|
8
|
+
return '';
|
|
9
|
+
const d = new Date(iso);
|
|
10
|
+
if (Number.isNaN(d.getTime()))
|
|
11
|
+
return '';
|
|
12
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
13
|
+
const date = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
14
|
+
return withTime ? `${date}T${pad(d.getHours())}:${pad(d.getMinutes())}` : date;
|
|
15
|
+
};
|
|
16
|
+
export function DateEditor({ field, value, element, commit, close, t }) {
|
|
17
|
+
const withTime = field.pickerAppearance === 'dayAndTime' || field.pickerAppearance === 'timeOnly';
|
|
18
|
+
const [draft, setDraft] = useState(toLocalInput(value, withTime));
|
|
19
|
+
const save = () => {
|
|
20
|
+
// Date-only values are stored at local noon, which survives any timezone shift (as Payload's picker does).
|
|
21
|
+
const next = draft ? new Date(withTime ? draft : `${draft}T12:00:00`).toISOString() : null;
|
|
22
|
+
if (next !== value)
|
|
23
|
+
commit(next);
|
|
24
|
+
close();
|
|
25
|
+
};
|
|
26
|
+
return (_jsxs(Dialog, { variant: "popover", anchor: element, title: field.label, onClose: close, t: t, testId: "onpage-date", children: [_jsx("div", { className: "po-row", children: _jsx("input", { className: "po-input", type: withTime ? 'datetime-local' : 'date', "aria-label": field.label, "data-autofocus": true, value: draft, onChange: (e) => setDraft(e.target.value), onKeyDown: (e) => e.key === 'Enter' && save(), "data-testid": "onpage-date-input" }) }), _jsxs("div", { className: "po-actions", children: [_jsx("button", { type: "button", className: "po-btn po-primary", onClick: save, "data-testid": "onpage-apply", children: t('common.apply') }), !field.required && (_jsx("button", { type: "button", className: "po-btn", onClick: () => setDraft(''), children: t('common.clear') }))] })] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=DateEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateEditor.js","sourceRoot":"","sources":["../../src/editors/DateEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FieldEditorProps } from '../types.ts';
|
|
2
|
+
export declare const escapeHtml: (s: string) => string;
|
|
3
|
+
export declare function InlineText({ field, value, element, commit, preview, close, ghost, live, point, t, }: FieldEditorProps): import("react").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=InlineText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineText.d.ts","sourceRoot":"","sources":["../../src/editors/InlineText.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,KAAG,MACuD,CAAA;AAE9F,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,OAAO,EACP,MAAM,EACN,OAAO,EACP,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,CAAC,GACF,EAAE,gBAAgB,+BAyElB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* In-place editing for text, textarea and email fields.
|
|
5
|
+
*
|
|
6
|
+
* The site's element is never made editable (React owns its DOM). An editable
|
|
7
|
+
* twin with the same computed typography is laid over it and the original is
|
|
8
|
+
* hidden. In client mode each keystroke re-renders the page live underneath;
|
|
9
|
+
* in refresh mode the twin shows the text and, after commit, stays as a ghost
|
|
10
|
+
* until the server render arrives. Blur/Enter commits (one undo step), Escape
|
|
11
|
+
* cancels.
|
|
12
|
+
*/
|
|
13
|
+
import { useLayoutEffect, useRef } from 'react';
|
|
14
|
+
import { toText } from '@payload-onpage/core';
|
|
15
|
+
import { copyTypography, HIDDEN, placeCaret, placeOver, typographyOf } from "../dom.js";
|
|
16
|
+
import { useTrackElement } from "../layout.js";
|
|
17
|
+
export const escapeHtml = (s) => s.replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[c]);
|
|
18
|
+
export function InlineText({ field, value, element, commit, preview, close, ghost, live, point, t, }) {
|
|
19
|
+
const multiline = field.type === 'textarea';
|
|
20
|
+
const ref = useRef(null);
|
|
21
|
+
const initial = useRef(toText(value));
|
|
22
|
+
const done = useRef(false);
|
|
23
|
+
useLayoutEffect(() => {
|
|
24
|
+
const el = element();
|
|
25
|
+
const twin = ref.current;
|
|
26
|
+
if (!twin)
|
|
27
|
+
return;
|
|
28
|
+
if (el) {
|
|
29
|
+
copyTypography(el, twin);
|
|
30
|
+
placeOver(twin, el, { minWidth: 40, minHeight: true });
|
|
31
|
+
el.setAttribute(HIDDEN, 'true');
|
|
32
|
+
}
|
|
33
|
+
twin.textContent = initial.current;
|
|
34
|
+
twin.focus({ preventScroll: true });
|
|
35
|
+
placeCaret(twin, point);
|
|
36
|
+
return () => element()?.removeAttribute(HIDDEN);
|
|
37
|
+
// Runs once: the twin takes over the element for its lifetime.
|
|
38
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
39
|
+
}, []);
|
|
40
|
+
// Follow the element as the page reflows (client mode re-renders it live).
|
|
41
|
+
useTrackElement(element, (el) => {
|
|
42
|
+
if (!ref.current)
|
|
43
|
+
return;
|
|
44
|
+
if (!el.hasAttribute(HIDDEN))
|
|
45
|
+
el.setAttribute(HIDDEN, 'true');
|
|
46
|
+
placeOver(ref.current, el, { minWidth: 40, minHeight: true });
|
|
47
|
+
});
|
|
48
|
+
const read = () => {
|
|
49
|
+
// textContent, not innerText: innerText applies CSS (text-transform:
|
|
50
|
+
// uppercase on an eyebrow would save "SANDBOX" for "Sandbox").
|
|
51
|
+
const text = (ref.current?.textContent ?? '').replace(/\u00a0/g, ' ').replace(/\n$/, '');
|
|
52
|
+
return multiline ? text : text.replace(/\s*\n\s*/g, ' ');
|
|
53
|
+
};
|
|
54
|
+
const finish = (save) => {
|
|
55
|
+
if (done.current)
|
|
56
|
+
return;
|
|
57
|
+
done.current = true;
|
|
58
|
+
const text = read();
|
|
59
|
+
if (save && text !== initial.current) {
|
|
60
|
+
commit(text === '' && !field.required ? null : text);
|
|
61
|
+
if (!live && ref.current)
|
|
62
|
+
ghost({ html: escapeHtml(text), style: typographyOf(ref.current) });
|
|
63
|
+
}
|
|
64
|
+
close();
|
|
65
|
+
};
|
|
66
|
+
return (_jsx("div", { ref: ref, className: "po-inline", contentEditable: "plaintext-only", suppressContentEditableWarning: true, role: "textbox", tabIndex: 0, "aria-multiline": multiline, "aria-label": t('inline.label', { field: field.label }), "data-testid": "onpage-inline-text", spellCheck: true, onInput: () => live && preview(read()), onBlur: () => finish(true), onKeyDown: (e) => {
|
|
67
|
+
if (e.key === 'Escape') {
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
finish(false);
|
|
70
|
+
}
|
|
71
|
+
else if (e.key === 'Enter' && (!multiline || e.metaKey || e.ctrlKey)) {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
finish(true);
|
|
74
|
+
}
|
|
75
|
+
} }));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=InlineText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineText.js","sourceRoot":"","sources":["../../src/editors/InlineText.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FieldEditorProps } from '../types.ts';
|
|
2
|
+
/** Number input, with a slider when the field has min and max. */
|
|
3
|
+
export declare function NumberEditor({ field, value, element, commit, preview, close, live, t, }: FieldEditorProps): import("react").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=NumberEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberEditor.d.ts","sourceRoot":"","sources":["../../src/editors/NumberEditor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGnD,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,OAAO,EACP,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,CAAC,GACF,EAAE,gBAAgB,+BAmDlB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { toText } from '@payload-onpage/core';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { Dialog } from "../ui/Dialog.js";
|
|
6
|
+
/** Number input, with a slider when the field has min and max. */
|
|
7
|
+
export function NumberEditor({ field, value, element, commit, preview, close, live, t, }) {
|
|
8
|
+
const [draft, setDraft] = useState(toText(value));
|
|
9
|
+
const slider = field.min !== undefined && field.max !== undefined;
|
|
10
|
+
const save = () => {
|
|
11
|
+
const next = draft === '' ? null : Number(draft);
|
|
12
|
+
if (next !== value && (next === null || !Number.isNaN(next)))
|
|
13
|
+
commit(next);
|
|
14
|
+
close();
|
|
15
|
+
};
|
|
16
|
+
const change = (v) => {
|
|
17
|
+
setDraft(v);
|
|
18
|
+
if (live && v !== '' && !Number.isNaN(Number(v)))
|
|
19
|
+
preview(Number(v));
|
|
20
|
+
};
|
|
21
|
+
return (_jsxs(Dialog, { variant: "popover", anchor: element, title: field.label, onClose: close, t: t, testId: "onpage-number", children: [_jsxs("div", { className: "po-row", children: [slider && (_jsx("input", { type: "range", "aria-label": field.label, min: field.min, max: field.max, value: draft || field.min, onChange: (e) => change(e.target.value), "data-testid": "onpage-number-slider" })), _jsx("input", { className: "po-input", type: "number", "aria-label": field.label, "data-autofocus": true, min: field.min, max: field.max, value: draft, onChange: (e) => change(e.target.value), onKeyDown: (e) => e.key === 'Enter' && save(), "data-testid": "onpage-number-input" })] }), _jsx("button", { type: "button", className: "po-btn po-primary", onClick: save, "data-testid": "onpage-apply", children: t('common.apply') })] }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=NumberEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberEditor.js","sourceRoot":"","sources":["../../src/editors/NumberEditor.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAkB,CAAA;AAEzC,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,OAAO,EACP,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,CAAC,GACgB;IACjB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,CAAA;IACjE,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAChD,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1E,KAAK,EAAE,CAAA;IACT,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE;QAC3B,QAAQ,CAAC,CAAC,CAAC,CAAA;QACX,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;IACD,OAAO,CACL,MAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,KAAK,EACd,CAAC,EAAE,CAAC,EACJ,MAAM,EAAC,eAAe,aAEtB,eAAK,SAAS,EAAC,QAAQ,aACpB,MAAM,IAAI,CACT,gBACE,IAAI,EAAC,OAAO,gBACA,KAAK,CAAC,KAAK,EACvB,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,GAAG,EACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,iBAC3B,sBAAsB,GAClC,CACH,EACD,gBACE,SAAS,EAAC,UAAU,EACpB,IAAI,EAAC,QAAQ,gBACD,KAAK,CAAC,KAAK,0BAEvB,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACvC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,EAAE,iBACjC,qBAAqB,GACjC,IACE,EACN,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,mBAAmB,EAAC,OAAO,EAAE,IAAI,iBAAc,cAAc,YAC1F,CAAC,CAAC,cAAc,CAAC,GACX,IACF,CACV,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipEditor.d.ts","sourceRoot":"","sources":["../../src/editors/RelationshipEditor.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAInD,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,KAAK,EACL,KAAK,EACL,OAAO,EACP,MAAM,EACN,KAAK,EACL,CAAC,GACF,EAAE,gBAAgB,+BAkIlB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Relationship editor: search the related collection(s) by their title field
|
|
5
|
+
* (Payload REST, so access control applies) and pick one, or several for
|
|
6
|
+
* hasMany. Polymorphic fields get a collection switch and store `{ relationTo, value }`.
|
|
7
|
+
*/
|
|
8
|
+
import { relationId, relationTitle } from '@payload-onpage/core';
|
|
9
|
+
import { useCallback, useState } from 'react';
|
|
10
|
+
import { useOnPage } from "../context.js";
|
|
11
|
+
import { Dialog } from "../ui/Dialog.js";
|
|
12
|
+
import { useDebouncedSearch } from "./useDebouncedSearch.js";
|
|
13
|
+
export function RelationshipEditor({ docKey, field, value, element, commit, close, t, }) {
|
|
14
|
+
const { session, snap } = useOnPage();
|
|
15
|
+
const targets = Array.isArray(field.relationTo)
|
|
16
|
+
? field.relationTo
|
|
17
|
+
: field.relationTo
|
|
18
|
+
? [field.relationTo]
|
|
19
|
+
: [];
|
|
20
|
+
const poly = Array.isArray(field.relationTo);
|
|
21
|
+
const [collection, setCollection] = useState(targets[0] ?? '');
|
|
22
|
+
const relations = snap.docs[docKey]?.schema?.relations ?? {};
|
|
23
|
+
const titleField = relations[collection]?.titleField;
|
|
24
|
+
const many = !!field.hasMany;
|
|
25
|
+
const current = many
|
|
26
|
+
? Array.isArray(value)
|
|
27
|
+
? value
|
|
28
|
+
: []
|
|
29
|
+
: value == null
|
|
30
|
+
? []
|
|
31
|
+
: [value];
|
|
32
|
+
const ds = session.dataSource;
|
|
33
|
+
const search = useCallback(async (query) => ds.search
|
|
34
|
+
? {
|
|
35
|
+
items: await ds.search(collection, {
|
|
36
|
+
query,
|
|
37
|
+
titleField,
|
|
38
|
+
locale: session.locale,
|
|
39
|
+
limit: 12,
|
|
40
|
+
}),
|
|
41
|
+
hasMore: false,
|
|
42
|
+
}
|
|
43
|
+
: { items: [], hasMore: false }, [ds, collection, titleField, session.locale]);
|
|
44
|
+
const results = useDebouncedSearch(ds.search ? search : null, []);
|
|
45
|
+
const wrap = (hit) => poly ? { relationTo: collection, value: hit.doc } : hit.doc;
|
|
46
|
+
const same = (v, id) => String(relationId(v)) === String(id);
|
|
47
|
+
const pick = (hit) => {
|
|
48
|
+
if (!many) {
|
|
49
|
+
commit(wrap(hit));
|
|
50
|
+
close();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
commit(current.some((v) => same(v, hit.id))
|
|
54
|
+
? current.filter((v) => !same(v, hit.id))
|
|
55
|
+
: [...current, wrap(hit)]);
|
|
56
|
+
};
|
|
57
|
+
const remove = (i) => commit(many ? current.filter((_, j) => j !== i) : null);
|
|
58
|
+
return (_jsxs(Dialog, { variant: "popover", anchor: element, title: field.label, onClose: close, t: t, width: 320, testId: "onpage-relationship", children: [current.map((v, i) => (_jsxs("div", { className: "po-rel-item", children: [relationTitle(v, titleField), (!field.required || many) && (_jsx("button", { type: "button", onClick: () => remove(i), "aria-label": `${t('common.remove')} ${relationTitle(v, titleField)}`, children: "\u2715" }))] }, `${String(relationId(v))}-${i}`))), poly && (_jsx("div", { className: "po-seg", role: "radiogroup", "aria-label": field.label, children: targets.map((c) => (_jsx("button", { type: "button", role: "radio", "aria-checked": c === collection, onClick: () => setCollection(c), children: relations[c]?.label ?? c }, c))) })), !ds.search ? (_jsx("p", { className: "po-muted", children: t('search.unsupported') })) : (_jsxs(_Fragment, { children: [_jsx("input", { className: "po-input", "aria-label": t('search.placeholder'), placeholder: t('search.placeholder'), value: results.query, "data-autofocus": true, onChange: (e) => results.setQuery(e.target.value), "data-testid": "onpage-relationship-search" }), results.error && _jsx("p", { className: "po-error", children: results.error }), _jsx("div", { className: "po-pop-list", role: "listbox", "aria-multiselectable": many, "aria-label": field.label, children: results.items.map((h) => (_jsx("button", { type: "button", role: "option", "aria-selected": current.some((v) => same(v, h.id)), onClick: () => pick(h), "data-testid": `onpage-relationship-${h.id}`, children: h.title }, String(h.id)))) })] }))] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=RelationshipEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipEditor.js","sourceRoot":"","sources":["../../src/editors/RelationshipEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FieldEditorProps } from '../types.ts';
|
|
2
|
+
/** Select / radio: pick one (closes) or toggle several (hasMany). */
|
|
3
|
+
export declare function SelectEditor({ field, value, element, commit, close, t }: FieldEditorProps): import("react").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=SelectEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectEditor.d.ts","sourceRoot":"","sources":["../../src/editors/SelectEditor.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGnD,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,gBAAgB,+BAkEzF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { toText } from '@payload-onpage/core';
|
|
4
|
+
import { Dialog } from "../ui/Dialog.js";
|
|
5
|
+
/** Select / radio: pick one (closes) or toggle several (hasMany). */
|
|
6
|
+
export function SelectEditor({ field, value, element, commit, close, t }) {
|
|
7
|
+
const options = field.options ?? [];
|
|
8
|
+
const many = !!field.hasMany;
|
|
9
|
+
const current = many
|
|
10
|
+
? Array.isArray(value)
|
|
11
|
+
? value
|
|
12
|
+
: []
|
|
13
|
+
: value == null
|
|
14
|
+
? []
|
|
15
|
+
: [toText(value)];
|
|
16
|
+
const pick = (v) => {
|
|
17
|
+
if (!many) {
|
|
18
|
+
commit(v);
|
|
19
|
+
close();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const set = new Set(current);
|
|
23
|
+
if (v === null)
|
|
24
|
+
set.clear();
|
|
25
|
+
else if (set.has(v))
|
|
26
|
+
set.delete(v);
|
|
27
|
+
else
|
|
28
|
+
set.add(v);
|
|
29
|
+
commit(options.map((o) => o.value).filter((o) => set.has(o)));
|
|
30
|
+
};
|
|
31
|
+
return (_jsx(Dialog, { variant: "popover", anchor: element, title: field.label, onClose: close, t: t, testId: "onpage-select", children: _jsxs("div", { className: "po-pop-list", role: "listbox", "aria-multiselectable": many, "aria-label": field.label, children: [!field.required && !many && (_jsx("button", { type: "button", role: "option", "aria-selected": !current.length, onClick: () => pick(null), children: t('common.none') })), options.map((o) => {
|
|
32
|
+
const selected = current.includes(o.value);
|
|
33
|
+
return (_jsxs("button", { type: "button", role: "option", "aria-selected": selected, onClick: () => pick(o.value), "data-testid": `onpage-option-${o.value}`, children: [many ? (selected ? '☑ ' : '☐ ') : '', o.label] }, o.value));
|
|
34
|
+
})] }) }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=SelectEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectEditor.js","sourceRoot":"","sources":["../../src/editors/SelectEditor.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAkB,CAAA;AAEzC,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAoB;IACxF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAA;IACnC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;IAC5B,MAAM,OAAO,GAAa,IAAI;QAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,CAAC,CAAE,KAAkB;YACrB,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,KAAK,IAAI,IAAI;YACb,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACrB,MAAM,IAAI,GAAG,CAAC,CAAgB,EAAE,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,CAAC,CAAC,CAAA;YACT,KAAK,EAAE,CAAA;YACP,OAAM;QACR,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QAC5B,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,EAAE,CAAA;aACtB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;;YAC7B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACf,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAA;IACD,OAAO,CACL,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,KAAK,EACd,CAAC,EAAE,CAAC,EACJ,MAAM,EAAC,eAAe,YAEtB,eACE,SAAS,EAAC,aAAa,EACvB,IAAI,EAAC,SAAS,0BACQ,IAAI,gBACd,KAAK,CAAC,KAAK,aAEtB,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,CAC3B,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,mBACE,CAAC,OAAO,CAAC,MAAM,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAExB,CAAC,CAAC,aAAa,CAAC,GACV,CACV,EACA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;oBAC1C,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,mBACE,QAAQ,EACvB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,iBACf,iBAAiB,CAAC,CAAC,KAAK,EAAE,aAEtC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EACpC,CAAC,CAAC,KAAK,KARH,CAAC,CAAC,KAAK,CASL,CACV,CAAA;gBACH,CAAC,CAAC,IACE,GACC,CACV,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadEditor.d.ts","sourceRoot":"","sources":["../../src/editors/UploadEditor.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAInD,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,gBAAgB,+BAmHhF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Image editor: pick from the upload collection (search, pages) or upload a
|
|
5
|
+
* new file, through the MediaLibrary port. The chosen document goes into state
|
|
6
|
+
* populated, so a client-rendered page shows it at once; saving sends its id.
|
|
7
|
+
*/
|
|
8
|
+
import { relationId } from '@payload-onpage/core';
|
|
9
|
+
import { useCallback, useRef, useState } from 'react';
|
|
10
|
+
import { useOnPage } from "../context.js";
|
|
11
|
+
import { Dialog } from "../ui/Dialog.js";
|
|
12
|
+
import { useDebouncedSearch } from "./useDebouncedSearch.js";
|
|
13
|
+
export function UploadEditor({ field, value, commit, close, t }) {
|
|
14
|
+
const { media } = useOnPage();
|
|
15
|
+
const relationTo = (Array.isArray(field.relationTo) ? field.relationTo[0] : field.relationTo) ?? 'media';
|
|
16
|
+
const [uploading, setUploading] = useState(false);
|
|
17
|
+
const [uploadError, setUploadError] = useState(null);
|
|
18
|
+
const fileRef = useRef(null);
|
|
19
|
+
const search = useCallback((query, page) => media
|
|
20
|
+
? media.search({ query, page, relationTo })
|
|
21
|
+
: Promise.resolve({ items: [], hasMore: false }), [media, relationTo]);
|
|
22
|
+
const results = useDebouncedSearch(media ? search : null, []);
|
|
23
|
+
const currentId = relationId(value);
|
|
24
|
+
const choose = (m) => {
|
|
25
|
+
commit(m.doc);
|
|
26
|
+
close();
|
|
27
|
+
};
|
|
28
|
+
const upload = async (file) => {
|
|
29
|
+
if (!media?.upload)
|
|
30
|
+
return;
|
|
31
|
+
setUploading(true);
|
|
32
|
+
try {
|
|
33
|
+
choose(await media.upload(file, { relationTo }));
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
setUploadError(e.message);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
setUploading(false);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const actions = (_jsxs(_Fragment, { children: [_jsx("input", { className: "po-input po-search", "aria-label": t('media.search'), placeholder: t('media.search'), value: results.query, "data-autofocus": true, onChange: (e) => results.setQuery(e.target.value), "data-testid": "onpage-media-search" }), media?.upload && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "po-btn", onClick: () => fileRef.current?.click(), disabled: uploading, "data-testid": "onpage-media-upload", children: t('media.upload') }), _jsx("input", { ref: fileRef, type: "file", accept: "image/*", hidden: true, onChange: (e) => e.target.files?.[0] && void upload(e.target.files[0]) })] })), !field.required && currentId != null && (_jsx("button", { type: "button", className: "po-btn", onClick: () => {
|
|
43
|
+
commit(null);
|
|
44
|
+
close();
|
|
45
|
+
}, "data-testid": "onpage-media-remove", children: t('common.remove') }))] }));
|
|
46
|
+
return (_jsxs(Dialog, { title: field.label, onClose: close, t: t, actions: actions, testId: "onpage-media-picker", children: [(results.error ?? uploadError) && _jsx("p", { className: "po-error", children: results.error ?? uploadError }), _jsx("div", { className: "po-grid", children: results.items.map((m) => (_jsxs("button", { type: "button", className: "po-tile", onClick: () => choose(m), "aria-current": String(m.id) === String(currentId), "data-testid": `onpage-media-${m.id}`, children: [_jsx("img", { src: m.thumbnailUrl ?? m.url ?? '', alt: m.alt ?? '', loading: "lazy" }), _jsx("span", { children: m.alt || m.filename })] }, String(m.id)))) }), !results.busy && !results.items.length && _jsx("p", { className: "po-muted", children: t('media.empty') }), results.hasMore && (_jsx("div", { className: "po-center", children: _jsx("button", { type: "button", className: "po-btn", onClick: results.more, disabled: results.busy, children: t('media.more') }) })), (results.busy || uploading) && _jsx("p", { className: "po-muted", children: t('media.loading') })] }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=UploadEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadEditor.js","sourceRoot":"","sources":["../../src/editors/UploadEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The default field editors. Spread, override or remove (`null`) entries via the `editors` option. */
|
|
2
|
+
import type { EditorRegistry } from '../types.ts';
|
|
3
|
+
import { CheckboxEditor } from './CheckboxEditor.tsx';
|
|
4
|
+
import { ColorEditor } from './ColorEditor.tsx';
|
|
5
|
+
import { DateEditor } from './DateEditor.tsx';
|
|
6
|
+
import { InlineText } from './InlineText.tsx';
|
|
7
|
+
import { NumberEditor } from './NumberEditor.tsx';
|
|
8
|
+
import { RelationshipEditor } from './RelationshipEditor.tsx';
|
|
9
|
+
import { SelectEditor } from './SelectEditor.tsx';
|
|
10
|
+
import { UploadEditor } from './UploadEditor.tsx';
|
|
11
|
+
export declare const defaultEditors: EditorRegistry;
|
|
12
|
+
export { CheckboxEditor, ColorEditor, DateEditor, InlineText, NumberEditor, RelationshipEditor, SelectEditor, UploadEditor, };
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editors/index.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,eAAO,MAAM,cAAc,EAAE,cAY5B,CAAA;AAED,OAAO,EACL,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,GACb,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CheckboxEditor } from "./CheckboxEditor.js";
|
|
2
|
+
import { ColorEditor } from "./ColorEditor.js";
|
|
3
|
+
import { DateEditor } from "./DateEditor.js";
|
|
4
|
+
import { InlineText } from "./InlineText.js";
|
|
5
|
+
import { NumberEditor } from "./NumberEditor.js";
|
|
6
|
+
import { RelationshipEditor } from "./RelationshipEditor.js";
|
|
7
|
+
import { SelectEditor } from "./SelectEditor.js";
|
|
8
|
+
import { UploadEditor } from "./UploadEditor.js";
|
|
9
|
+
export const defaultEditors = {
|
|
10
|
+
text: { mode: 'inline', component: InlineText },
|
|
11
|
+
textarea: { mode: 'inline', component: InlineText },
|
|
12
|
+
email: { mode: 'inline', component: InlineText },
|
|
13
|
+
select: { mode: 'popover', component: SelectEditor },
|
|
14
|
+
radio: { mode: 'popover', component: SelectEditor },
|
|
15
|
+
checkbox: { mode: 'popover', component: CheckboxEditor },
|
|
16
|
+
number: { mode: 'popover', component: NumberEditor },
|
|
17
|
+
date: { mode: 'popover', component: DateEditor },
|
|
18
|
+
relationship: { mode: 'popover', component: RelationshipEditor },
|
|
19
|
+
upload: { mode: 'popover', component: UploadEditor },
|
|
20
|
+
color: { mode: 'popover', component: ColorEditor },
|
|
21
|
+
};
|
|
22
|
+
export { CheckboxEditor, ColorEditor, DateEditor, InlineText, NumberEditor, RelationshipEditor, SelectEditor, UploadEditor, };
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editors/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAoB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAA0B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAoB,CAAA;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE;IAC/C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE;IACnD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE;IAChD,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE;IACpD,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE;IACnD,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE;IACxD,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE;IACpD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE;IAChD,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE;IAChE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE;IACpD,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE;CACnD,CAAA;AAED,OAAO,EACL,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,GACb,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run `search(query, page)` 250ms after the inputs settle; results accumulate
|
|
3
|
+
* across pages and reset when the query changes. Stale responses are ignored.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useDebouncedSearch<T>(search: ((query: string, page: number) => Promise<{
|
|
6
|
+
items: T[];
|
|
7
|
+
hasMore: boolean;
|
|
8
|
+
}>) | null, deps: unknown[]): {
|
|
9
|
+
query: string;
|
|
10
|
+
setQuery: (q: string) => void;
|
|
11
|
+
items: T[];
|
|
12
|
+
hasMore: boolean;
|
|
13
|
+
more: () => void;
|
|
14
|
+
busy: boolean;
|
|
15
|
+
error: string | null;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=useDebouncedSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedSearch.d.ts","sourceRoot":"","sources":["../../src/editors/useDebouncedSearch.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,GAAG,IAAI,EAC3F,IAAI,EAAE,OAAO,EAAE;;kBAiCC,MAAM;;;;;;EAUvB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Run `search(query, page)` 250ms after the inputs settle; results accumulate
|
|
5
|
+
* across pages and reset when the query changes. Stale responses are ignored.
|
|
6
|
+
*/
|
|
7
|
+
export function useDebouncedSearch(search, deps) {
|
|
8
|
+
const [query, setQuery] = useState('');
|
|
9
|
+
const [page, setPage] = useState(1);
|
|
10
|
+
const [items, setItems] = useState([]);
|
|
11
|
+
const [hasMore, setHasMore] = useState(false);
|
|
12
|
+
const [busy, setBusy] = useState(false);
|
|
13
|
+
const [error, setError] = useState(null);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (!search)
|
|
16
|
+
return;
|
|
17
|
+
let live = true;
|
|
18
|
+
const timer = setTimeout(() => {
|
|
19
|
+
setBusy(true);
|
|
20
|
+
search(query, page)
|
|
21
|
+
.then((res) => {
|
|
22
|
+
if (!live)
|
|
23
|
+
return;
|
|
24
|
+
setItems((prev) => (page === 1 ? res.items : [...prev, ...res.items]));
|
|
25
|
+
setHasMore(res.hasMore);
|
|
26
|
+
setError(null);
|
|
27
|
+
})
|
|
28
|
+
.catch((e) => live && setError(e instanceof Error ? e.message : String(e)))
|
|
29
|
+
.finally(() => live && setBusy(false));
|
|
30
|
+
}, 250);
|
|
31
|
+
return () => {
|
|
32
|
+
live = false;
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
};
|
|
35
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
+
}, [search, query, page, ...deps]);
|
|
37
|
+
return {
|
|
38
|
+
query,
|
|
39
|
+
setQuery: (q) => {
|
|
40
|
+
setQuery(q);
|
|
41
|
+
setPage(1);
|
|
42
|
+
},
|
|
43
|
+
items,
|
|
44
|
+
hasMore,
|
|
45
|
+
more: () => setPage((p) => p + 1),
|
|
46
|
+
busy,
|
|
47
|
+
error,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=useDebouncedSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedSearch.js","sourceRoot":"","sources":["../../src/editors/useDebouncedSearch.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA2F,EAC3F,IAAe;IAEf,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACnC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAM,EAAE,CAAC,CAAA;IAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,IAAI,IAAI,GAAG,IAAI,CAAA;QACf,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAA;YACb,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;iBAChB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACZ,IAAI,CAAC,IAAI;oBAAE,OAAM;gBACjB,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACtE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACvB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACnF,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1C,CAAC,EAAE,GAAG,CAAC,CAAA;QACP,OAAO,GAAG,EAAE;YACV,IAAI,GAAG,KAAK,CAAA;YACZ,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC,CAAA;QACD,uDAAuD;IACzD,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAElC,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE;YACtB,QAAQ,CAAC,CAAC,CAAC,CAAA;YACX,OAAO,CAAC,CAAC,CAAC,CAAA;QACZ,CAAC;QACD,KAAK;QACL,OAAO;QACP,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI;QACJ,KAAK;KACN,CAAA;AACH,CAAC"}
|
package/dist/hub.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The editor hub: a module-level store holding the mounted editor, so
|
|
3
|
+
* components anywhere on the page (client-mode documents, custom UI) can reach
|
|
4
|
+
* it without being rendered inside it. That keeps `<OnPage />` a sibling in the
|
|
5
|
+
* layout, not a wrapper. Kept on `globalThis` so two copies of the package
|
|
6
|
+
* (a bundling mistake) still share one editor.
|
|
7
|
+
*/
|
|
8
|
+
import type { OnPageContextValue } from './types.ts';
|
|
9
|
+
export declare const hub: {
|
|
10
|
+
get: () => OnPageContextValue | null;
|
|
11
|
+
set: (value: OnPageContextValue | null) => void;
|
|
12
|
+
subscribe: (fn: () => void) => (() => void);
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAapD,eAAO,MAAM,GAAG;eACL,kBAAkB,GAAG,IAAI;iBACrB,kBAAkB,GAAG,IAAI,KAAG,IAAI;oBAK7B,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC;CAI1C,CAAA"}
|
package/dist/hub.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const KEY = Symbol.for('payload-onpage.hub');
|
|
2
|
+
const store = (globalThis[KEY] ??= {
|
|
3
|
+
current: null,
|
|
4
|
+
listeners: new Set(),
|
|
5
|
+
});
|
|
6
|
+
export const hub = {
|
|
7
|
+
get: () => store.current,
|
|
8
|
+
set: (value) => {
|
|
9
|
+
if (value === store.current)
|
|
10
|
+
return;
|
|
11
|
+
store.current = value;
|
|
12
|
+
for (const fn of store.listeners)
|
|
13
|
+
fn();
|
|
14
|
+
},
|
|
15
|
+
subscribe: (fn) => {
|
|
16
|
+
store.listeners.add(fn);
|
|
17
|
+
return () => store.listeners.delete(fn);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=hub.js.map
|
package/dist/hub.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.js","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"AAcA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AAC5C,MAAM,KAAK,GAAQ,CAAE,UAA8C,CAAC,GAAG,CAAC,KAAK;IAC3E,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI,GAAG,EAAE;CACrB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,GAAG,EAAE,GAA8B,EAAE,CAAC,KAAK,CAAC,OAAO;IACnD,GAAG,EAAE,CAAC,KAAgC,EAAQ,EAAE;QAC9C,IAAI,KAAK,KAAK,KAAK,CAAC,OAAO;YAAE,OAAM;QACnC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;QACrB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,SAAS;YAAE,EAAE,EAAE,CAAA;IACxC,CAAC;IACD,SAAS,EAAE,CAAC,EAAc,EAAgB,EAAE;QAC1C,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACvB,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC;CACF,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @payload-onpage/react — the on-page editor UI.
|
|
3
|
+
*
|
|
4
|
+
* <OnPageEditor dataSource={payloadRest()} media={payloadUploads()} links={{ exit: '/api/onpage/exit' }} />
|
|
5
|
+
*
|
|
6
|
+
* Framework adapters (e.g. @payload-onpage/next) mount it for you. Building a
|
|
7
|
+
* field editor? See `@payload-onpage/react/editor-kit`.
|
|
8
|
+
*/
|
|
9
|
+
export { OnPageEditor, type OnPageEditorProps } from './editor/OnPageEditor.tsx';
|
|
10
|
+
export { OnPageClient, type OnPageClientProps } from './OnPageClient.tsx';
|
|
11
|
+
export { PreviewToolbar, inPreviewFrame, FRAME_PARAM, type PreviewToolbarProps, } from './ui/PreviewToolbar.tsx';
|
|
12
|
+
export { useOnPage, useOnPageOptional } from './context.tsx';
|
|
13
|
+
export type { EditorRegistry, FieldEditorDef, FieldEditorProps, Links, OnPageContextValue, TargetIndex, } from './types.ts';
|
|
14
|
+
export { defaultEditors, CheckboxEditor, ColorEditor, DateEditor, InlineText, NumberEditor, RelationshipEditor, SelectEditor, UploadEditor, } from './editors/index.ts';
|
|
15
|
+
export { resolveEditor, mergeEditors } from './registry.ts';
|
|
16
|
+
export { annotations, stega, composite, rowPrefixes } from './locators.ts';
|
|
17
|
+
export { editable, editableOff, p, ATTR, type Editable, type EditableTarget, type FieldKind, } from './annotations.ts';
|
|
18
|
+
export { clientState, fullReload } from './renderers.ts';
|
|
19
|
+
export { defaultMessages, createTranslate, type Messages, type MessageKey, type Translate, } from './messages.ts';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EACL,cAAc,EACd,cAAc,EACd,WAAW,EACX,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC5D,YAAY,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,KAAK,EACL,kBAAkB,EAClB,WAAW,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,cAAc,EACd,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EACL,QAAQ,EACR,WAAW,EACX,CAAC,EACD,IAAI,EACJ,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,eAAe,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @payload-onpage/react — the on-page editor UI.
|
|
3
|
+
*
|
|
4
|
+
* <OnPageEditor dataSource={payloadRest()} media={payloadUploads()} links={{ exit: '/api/onpage/exit' }} />
|
|
5
|
+
*
|
|
6
|
+
* Framework adapters (e.g. @payload-onpage/next) mount it for you. Building a
|
|
7
|
+
* field editor? See `@payload-onpage/react/editor-kit`.
|
|
8
|
+
*/
|
|
9
|
+
export { OnPageEditor } from "./editor/OnPageEditor.js";
|
|
10
|
+
export { OnPageClient } from "./OnPageClient.js";
|
|
11
|
+
export { PreviewToolbar, inPreviewFrame, FRAME_PARAM, } from "./ui/PreviewToolbar.js";
|
|
12
|
+
export { useOnPage, useOnPageOptional } from "./context.js";
|
|
13
|
+
export { defaultEditors, CheckboxEditor, ColorEditor, DateEditor, InlineText, NumberEditor, RelationshipEditor, SelectEditor, UploadEditor, } from "./editors/index.js";
|
|
14
|
+
export { resolveEditor, mergeEditors } from "./registry.js";
|
|
15
|
+
export { annotations, stega, composite, rowPrefixes } from "./locators.js";
|
|
16
|
+
export { editable, editableOff, p, ATTR, } from "./annotations.js";
|
|
17
|
+
export { clientState, fullReload } from "./renderers.js";
|
|
18
|
+
export { defaultMessages, createTranslate, } from "./messages.js";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAA0B,MAAM,0BAA2B,CAAA;AAChF,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAoB,CAAA;AACzE,OAAO,EACL,cAAc,EACd,cAAc,EACd,WAAW,GAEZ,MAAM,wBAAyB,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,cAAe,CAAA;AAS5D,OAAO,EACL,cAAc,EACd,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EACL,QAAQ,EACR,WAAW,EACX,CAAC,EACD,IAAI,GAIL,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EACL,eAAe,EACf,eAAe,GAIhB,MAAM,eAAe,CAAA"}
|