@od-labs/payloadcms-dynamic-value-richtext 1.0.2 → 1.0.3

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/README.md CHANGED
@@ -1,96 +1,128 @@
1
- # Payload Dynamic Value Rich Text Plugin
2
-
3
- A powerful [Payload CMS](https://payloadcms.com) plugin for the Lexical editor that allows you to designate field values as dynamic variables. These variables can be reused throughout your rich text content and are visually represented as interactive badges.
4
-
5
- ## Features
6
-
7
- - **Inline Autocomplete**: Trigger a searchable list of available dynamic fields using `@` (default) or a custom character (like `#`).
8
- - **Visual Badges**: Variables appear in the editor as clean, non-editable badges with a "VAR" prefix, making them distinct from regular text.
9
- - **Automatic Field Resolution**: Pull fields automatically from specified Collections and Globals, or provide manually defined fields.
10
- - **Unit Tokenization**: Variables are treated as single units—selecting or deleting them happens in a single action.
11
- - **Clipboard Support**: Copy and paste dynamic values between editors or documents while maintaining their data integrity.
12
- - **Light & Dark Mode**: Seamlessly integrates with Payload's admin UI theme.
13
-
14
- ## Installation
15
-
16
- ```bash
17
- pnpm add @od-labs/payloadcms-dynamic-value-richtext
18
- # or
19
- npm install @od-labs/payloadcms-dynamic-value-richtext
20
- ```
21
-
22
- ## Basic Setup
23
-
24
- Add the plugin to your `payload.config.ts`:
25
-
26
- ```typescript
27
- import { buildConfig } from 'payload'
28
- import { dynamicValuePlugin } from '@od-labs/payloadcms-dynamic-value-richtext'
29
-
30
- export default buildConfig({
31
- plugins: [
32
- dynamicValuePlugin({
33
- collections: ['company-settings', 'sites'],
34
- globals: ['contact-info'],
35
- trigger: '@',
36
- }),
37
- ],
38
- // ... rest of config
39
- })
40
- ```
41
-
42
- ## Configuration
43
-
44
- In your Lexical editor configuration, add the `DynamicValueFeature` to your list of features:
45
-
46
- ```typescript
47
- import { DynamicValueFeature } from '@od-labs/payloadcms-dynamic-value-richtext'
48
-
49
- // In your collection/global field definition:
50
- {
51
- name: 'content',
52
- type: 'richText',
53
- editor: lexicalEditor({
54
- features: ({ defaultFeatures }) => [
55
- ...defaultFeatures,
56
- DynamicValueFeature(),
57
- ],
58
- }),
59
- }
60
- ```
61
-
62
- ### Plugin Options
63
-
64
- | Option | Type | Description |
65
- | :------------ | :----------------- | :---------------------------------------------------------------------- |
66
- | `collections` | `CollectionSlug[]` | Automatically extract all text-based fields from these collections. |
67
- | `globals` | `GlobalSlug[]` | Automatically extract all text-based fields from these globals. |
68
- | `fields` | `Field[]` | Manually provide a list of Payload fields to be used as dynamic values. |
69
- | `trigger` | `string` | The character that triggers the autocomplete popup. Defaults to `@`. |
70
-
71
- ## How it Works
72
-
73
- 1. **Resolution**: The plugin recursively flattens the fields of your chosen collections and globals. For example, if you have a Global `contact-info` with a field `email`, it becomes available as `contact-info.email`.
74
- 2. **Injection**: When you type the trigger character in the editor, a popup appears showing all available fields.
75
- 3. **Storage**: The variable is stored as a custom `DecoratorNode` in Lexical, which holds a reference to the field path (`value`) and the display label.
76
-
77
- ## Development
78
-
79
- To run the development environment:
80
-
81
- 1. Clone the repository
82
- 2. Install dependencies: `pnpm install`
83
- 3. Create a `.env` in the `dev` folder (see `.env.example`)
84
- 4. Run development: `pnpm dev`
85
-
86
- ## Ownership
87
-
88
- Created & Owned by **OD LABS**. This plugin is open and free for use to all under the MIT License.
89
-
90
- ## Contributions
91
-
92
- Contributions are welcome! If you have ideas for improvements or find any issues, feel free to open a Pull Request or create an Issue.
93
-
94
- ## License
95
-
96
- MIT
1
+ # Payload Dynamic Value Rich Text Plugin
2
+
3
+ A powerful [Payload CMS](https://payloadcms.com) plugin for the Lexical editor that allows you to designate field values as dynamic variables. These variables can be reused throughout your rich text content and are visually represented as interactive badges.
4
+
5
+ ## Features
6
+
7
+ - **Inline Autocomplete**: Trigger a searchable list of available dynamic fields using `@` (default) or a custom character (like `#`).
8
+ - **Visual Badges**: Variables appear in the editor as clean, non-editable badges with a "VAR" prefix, making them distinct from regular text.
9
+ - **Automatic Field Resolution**: Pull fields automatically from specified Collections and Globals, or provide manually defined fields.
10
+ - **Unit Tokenization**: Variables are treated as single units—selecting or deleting them happens in a single action.
11
+ - **Clipboard Support**: Copy and paste dynamic values between editors or documents while maintaining their data integrity.
12
+ - **Light & Dark Mode**: Seamlessly integrates with Payload's admin UI theme.
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ pnpm add @od-labs/payloadcms-dynamic-value-richtext
18
+ # or
19
+ npm install @od-labs/payloadcms-dynamic-value-richtext
20
+ ```
21
+
22
+ ## Basic Setup
23
+
24
+ Add the plugin to your `payload.config.ts`:
25
+
26
+ ```typescript
27
+ import { buildConfig } from 'payload'
28
+ import { dynamicValuePlugin } from '@od-labs/payloadcms-dynamic-value-richtext'
29
+
30
+ export default buildConfig({
31
+ plugins: [
32
+ dynamicValuePlugin({
33
+ collections: ['company-settings', 'sites'],
34
+ globals: ['contact-info'],
35
+ trigger: '@',
36
+ }),
37
+ ],
38
+ // ... rest of config
39
+ })
40
+ ```
41
+
42
+ ## Configuration
43
+
44
+ In your Lexical editor configuration, add the `DynamicValueFeature` to your list of features:
45
+
46
+ ```typescript
47
+ import { DynamicValueFeature } from '@od-labs/payloadcms-dynamic-value-richtext'
48
+
49
+ // In your collection/global field definition:
50
+ {
51
+ name: 'content',
52
+ type: 'richText',
53
+ editor: lexicalEditor({
54
+ features: ({ defaultFeatures }) => [
55
+ ...defaultFeatures,
56
+ DynamicValueFeature(),
57
+ ],
58
+ }),
59
+ }
60
+ ```
61
+
62
+ ### Plugin Options
63
+
64
+ | Option | Type | Description |
65
+ | :------------ | :----------------- | :---------------------------------------------------------------------- |
66
+ | `collections` | `CollectionSlug[]` | Automatically extract all text-based fields from these collections. |
67
+ | `globals` | `GlobalSlug[]` | Automatically extract all text-based fields from these globals. |
68
+ | `fields` | `Field[]` | Manually provide a list of Payload fields to be used as dynamic values. |
69
+ | `trigger` | `string` | The character that triggers the autocomplete popup. Defaults to `@`. |
70
+
71
+ ## How it Works
72
+
73
+ 1. **Resolution**: The plugin recursively flattens the fields of your chosen collections and globals. For example, if you have a Global `contact-info` with a field `email`, it becomes available as `contact-info.email`.
74
+ 2. **Injection**: When you type the trigger character in the editor, a popup appears showing all available fields.
75
+ 3. **Storage**: The variable is stored as a custom `DecoratorNode` in Lexical, which holds a reference to the field path (`value`) and the display label.
76
+
77
+ ## Frontend Rendering (Important)
78
+
79
+ If you render Lexical content on your website with `RichText`, you must provide this plugin's JSX converters.
80
+ Without this, Payload will show custom nodes as `unknown node`.
81
+
82
+ ### Option A: automatic (recommended)
83
+
84
+ Use the plugin-provided wrapper component that injects converters for you:
85
+
86
+ ```tsx
87
+ import { DynamicValueRichText } from '@od-labs/payloadcms-dynamic-value-richtext/react'
88
+
89
+ ;<DynamicValueRichText data={page.content} payloadData={page} />
90
+ ```
91
+
92
+ ### Option B: manual converters
93
+
94
+ ```tsx
95
+ import { RichText } from '@payloadcms/richtext-lexical/react'
96
+ import { DynamicValueJSXConverters } from '@od-labs/payloadcms-dynamic-value-richtext/jsx'
97
+
98
+ ;<RichText data={page.content} converters={DynamicValueJSXConverters} />
99
+ ```
100
+
101
+ If you want to resolve the dynamic value from real document data at render time:
102
+
103
+ ```tsx
104
+ import { createDynamicValueJSXConverters } from '@od-labs/payloadcms-dynamic-value-richtext/jsx'
105
+
106
+ const converters = createDynamicValueJSXConverters({ data: page })
107
+ ```
108
+
109
+ ## Development
110
+
111
+ To run the development environment:
112
+
113
+ 1. Clone the repository
114
+ 2. Install dependencies: `pnpm install`
115
+ 3. Create a `.env` in the `dev` folder (see `.env.example`)
116
+ 4. Run development: `pnpm dev`
117
+
118
+ ## Ownership
119
+
120
+ Created & Owned by **OD LABS**. This plugin is open and free for use to all under the MIT License.
121
+
122
+ ## Contributions
123
+
124
+ Contributions are welcome! If you have ideas for improvements or find any issues, feel free to open a Pull Request or create an Issue.
125
+
126
+ ## License
127
+
128
+ MIT
@@ -0,0 +1,13 @@
1
+ import type { JSXConverters } from '@payloadcms/richtext-lexical/react';
2
+ import React from 'react';
3
+ import type { SerializedDynamicValueNode } from '../nodes/DynamicValueNode/index.js';
4
+ /**
5
+ * JSX converters for dynamic value nodes. Includes both the current node type and
6
+ * the legacy type to keep older content working.
7
+ */
8
+ export declare const DynamicValueJSXConverters: JSXConverters;
9
+ export declare const withDynamicValueJSXConverters: (converters?: JSXConverters) => JSXConverters;
10
+ export declare function createDynamicValueJSXConverters(options: {
11
+ data?: Record<string, unknown>;
12
+ fallback?: (node: SerializedDynamicValueNode) => React.ReactNode;
13
+ }): JSXConverters;
@@ -0,0 +1,56 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { DYNAMIC_VALUE_NODE_TYPE, LEGACY_DYNAMIC_VALUE_NODE_TYPE } from '../nodes/DynamicValueNode/index.js';
4
+ const renderDynamicValueLabel = (node)=>{
5
+ return /*#__PURE__*/ _jsx("span", {
6
+ "data-payload-dynamic-field": node.field,
7
+ "data-payload-dynamic-value": "true",
8
+ children: node.label
9
+ }, node.field);
10
+ };
11
+ const dynamicValueJSXConverter = ({ node })=>{
12
+ const dynamicNode = node;
13
+ return renderDynamicValueLabel(dynamicNode);
14
+ };
15
+ /**
16
+ * JSX converters for dynamic value nodes. Includes both the current node type and
17
+ * the legacy type to keep older content working.
18
+ */ export const DynamicValueJSXConverters = {
19
+ [DYNAMIC_VALUE_NODE_TYPE]: dynamicValueJSXConverter,
20
+ [LEGACY_DYNAMIC_VALUE_NODE_TYPE]: dynamicValueJSXConverter
21
+ };
22
+ export const withDynamicValueJSXConverters = (converters)=>({
23
+ ...converters || {},
24
+ ...DynamicValueJSXConverters
25
+ });
26
+ export function createDynamicValueJSXConverters(options) {
27
+ const { data = {}, fallback } = options;
28
+ const converter = ({ node })=>{
29
+ const dynamicNode = node;
30
+ const resolvedValue = dynamicNode.field.split('.').reduce((current, key)=>{
31
+ if (current && typeof current === 'object' && key in current) {
32
+ return current[key];
33
+ }
34
+ return undefined;
35
+ }, data);
36
+ if (resolvedValue !== undefined && resolvedValue !== null && resolvedValue !== '') {
37
+ return /*#__PURE__*/ _jsx("span", {
38
+ "data-payload-dynamic-field": dynamicNode.field,
39
+ "data-payload-dynamic-value": "true",
40
+ children: String(resolvedValue)
41
+ }, dynamicNode.field);
42
+ }
43
+ if (fallback) {
44
+ return /*#__PURE__*/ _jsx(React.Fragment, {
45
+ children: fallback(dynamicNode)
46
+ }, dynamicNode.field);
47
+ }
48
+ return renderDynamicValueLabel(dynamicNode);
49
+ };
50
+ return {
51
+ [DYNAMIC_VALUE_NODE_TYPE]: converter,
52
+ [LEGACY_DYNAMIC_VALUE_NODE_TYPE]: converter
53
+ };
54
+ }
55
+
56
+ //# sourceMappingURL=jsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/jsx.tsx"],"sourcesContent":["import type { JSXConverters } from '@payloadcms/richtext-lexical/react'\r\n\r\nimport React from 'react'\r\n\r\nimport type { SerializedDynamicValueNode } from '../nodes/DynamicValueNode/index.js'\r\n\r\nimport {\r\n DYNAMIC_VALUE_NODE_TYPE,\r\n LEGACY_DYNAMIC_VALUE_NODE_TYPE,\r\n} from '../nodes/DynamicValueNode/index.js'\r\n\r\nconst renderDynamicValueLabel = (node: SerializedDynamicValueNode) => {\r\n return (\r\n <span\r\n data-payload-dynamic-field={node.field}\r\n data-payload-dynamic-value=\"true\"\r\n key={node.field}\r\n >\r\n {node.label}\r\n </span>\r\n )\r\n}\r\n\r\nconst dynamicValueJSXConverter = ({ node }: { node: unknown }) => {\r\n const dynamicNode = node as SerializedDynamicValueNode\r\n return renderDynamicValueLabel(dynamicNode)\r\n}\r\n\r\n/**\r\n * JSX converters for dynamic value nodes. Includes both the current node type and\r\n * the legacy type to keep older content working.\r\n */\r\nexport const DynamicValueJSXConverters: JSXConverters = {\r\n [DYNAMIC_VALUE_NODE_TYPE]: dynamicValueJSXConverter,\r\n [LEGACY_DYNAMIC_VALUE_NODE_TYPE]: dynamicValueJSXConverter,\r\n}\r\n\r\nexport const withDynamicValueJSXConverters = (converters?: JSXConverters): JSXConverters => ({\r\n ...(converters || {}),\r\n ...DynamicValueJSXConverters,\r\n})\r\n\r\nexport function createDynamicValueJSXConverters(options: {\r\n data?: Record<string, unknown>\r\n fallback?: (node: SerializedDynamicValueNode) => React.ReactNode\r\n}): JSXConverters {\r\n const { data = {}, fallback } = options\r\n\r\n const converter = ({ node }: { node: unknown }) => {\r\n const dynamicNode = node as SerializedDynamicValueNode\r\n const resolvedValue = dynamicNode.field.split('.').reduce<unknown>((current, key) => {\r\n if (current && typeof current === 'object' && key in (current as Record<string, unknown>)) {\r\n return (current as Record<string, unknown>)[key]\r\n }\r\n\r\n return undefined\r\n }, data)\r\n\r\n if (resolvedValue !== undefined && resolvedValue !== null && resolvedValue !== '') {\r\n return (\r\n <span\r\n data-payload-dynamic-field={dynamicNode.field}\r\n data-payload-dynamic-value=\"true\"\r\n key={dynamicNode.field}\r\n >\r\n {String(resolvedValue)}\r\n </span>\r\n )\r\n }\r\n\r\n if (fallback) {\r\n return <React.Fragment key={dynamicNode.field}>{fallback(dynamicNode)}</React.Fragment>\r\n }\r\n\r\n return renderDynamicValueLabel(dynamicNode)\r\n }\r\n\r\n return {\r\n [DYNAMIC_VALUE_NODE_TYPE]: converter,\r\n [LEGACY_DYNAMIC_VALUE_NODE_TYPE]: converter,\r\n }\r\n}\r\n"],"names":["React","DYNAMIC_VALUE_NODE_TYPE","LEGACY_DYNAMIC_VALUE_NODE_TYPE","renderDynamicValueLabel","node","span","data-payload-dynamic-field","field","data-payload-dynamic-value","label","dynamicValueJSXConverter","dynamicNode","DynamicValueJSXConverters","withDynamicValueJSXConverters","converters","createDynamicValueJSXConverters","options","data","fallback","converter","resolvedValue","split","reduce","current","key","undefined","String","Fragment"],"mappings":";AAEA,OAAOA,WAAW,QAAO;AAIzB,SACEC,uBAAuB,EACvBC,8BAA8B,QACzB,qCAAoC;AAE3C,MAAMC,0BAA0B,CAACC;IAC/B,qBACE,KAACC;QACCC,8BAA4BF,KAAKG,KAAK;QACtCC,8BAA2B;kBAG1BJ,KAAKK,KAAK;OAFNL,KAAKG,KAAK;AAKrB;AAEA,MAAMG,2BAA2B,CAAC,EAAEN,IAAI,EAAqB;IAC3D,MAAMO,cAAcP;IACpB,OAAOD,wBAAwBQ;AACjC;AAEA;;;CAGC,GACD,OAAO,MAAMC,4BAA2C;IACtD,CAACX,wBAAwB,EAAES;IAC3B,CAACR,+BAA+B,EAAEQ;AACpC,EAAC;AAED,OAAO,MAAMG,gCAAgC,CAACC,aAA+C,CAAA;QAC3F,GAAIA,cAAc,CAAC,CAAC;QACpB,GAAGF,yBAAyB;IAC9B,CAAA,EAAE;AAEF,OAAO,SAASG,gCAAgCC,OAG/C;IACC,MAAM,EAAEC,OAAO,CAAC,CAAC,EAAEC,QAAQ,EAAE,GAAGF;IAEhC,MAAMG,YAAY,CAAC,EAAEf,IAAI,EAAqB;QAC5C,MAAMO,cAAcP;QACpB,MAAMgB,gBAAgBT,YAAYJ,KAAK,CAACc,KAAK,CAAC,KAAKC,MAAM,CAAU,CAACC,SAASC;YAC3E,IAAID,WAAW,OAAOA,YAAY,YAAYC,OAAQD,SAAqC;gBACzF,OAAO,AAACA,OAAmC,CAACC,IAAI;YAClD;YAEA,OAAOC;QACT,GAAGR;QAEH,IAAIG,kBAAkBK,aAAaL,kBAAkB,QAAQA,kBAAkB,IAAI;YACjF,qBACE,KAACf;gBACCC,8BAA4BK,YAAYJ,KAAK;gBAC7CC,8BAA2B;0BAG1BkB,OAAON;eAFHT,YAAYJ,KAAK;QAK5B;QAEA,IAAIW,UAAU;YACZ,qBAAO,KAAClB,MAAM2B,QAAQ;0BAA0BT,SAASP;eAA7BA,YAAYJ,KAAK;QAC/C;QAEA,OAAOJ,wBAAwBQ;IACjC;IAEA,OAAO;QACL,CAACV,wBAAwB,EAAEkB;QAC3B,CAACjB,+BAA+B,EAAEiB;IACpC;AACF"}
@@ -0,0 +1,19 @@
1
+ import type { JSXConverters } from '@payloadcms/richtext-lexical/react';
2
+ import React from 'react';
3
+ type DynamicValueRichTextProps = {
4
+ className?: string;
5
+ converters?: JSXConverters;
6
+ data: any;
7
+ disableContainer?: boolean;
8
+ disableIndent?: boolean | string[];
9
+ disableTextAlign?: boolean | string[];
10
+ payloadData?: Record<string, unknown>;
11
+ };
12
+ /**
13
+ * Drop-in RichText renderer that always includes dynamic-value converters.
14
+ *
15
+ * This prevents "unknown node" output for DynamicValueNode even if the
16
+ * consuming app forgets to pass plugin converters manually.
17
+ */
18
+ export declare const DynamicValueRichText: React.FC<DynamicValueRichTextProps>;
19
+ export {};
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { RichText } from '@payloadcms/richtext-lexical/react';
3
+ import React from 'react';
4
+ import { createDynamicValueJSXConverters } from './jsx.js';
5
+ /**
6
+ * Drop-in RichText renderer that always includes dynamic-value converters.
7
+ *
8
+ * This prevents "unknown node" output for DynamicValueNode even if the
9
+ * consuming app forgets to pass plugin converters manually.
10
+ */ export const DynamicValueRichText = ({ converters, payloadData, ...props })=>{
11
+ return /*#__PURE__*/ _jsx(RichText, {
12
+ ...props,
13
+ converters: {
14
+ ...converters || {},
15
+ ...createDynamicValueJSXConverters({
16
+ data: payloadData || props.data || {}
17
+ })
18
+ }
19
+ });
20
+ };
21
+
22
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/react.tsx"],"sourcesContent":["import type { JSXConverters } from '@payloadcms/richtext-lexical/react'\r\n\r\nimport { RichText } from '@payloadcms/richtext-lexical/react'\r\nimport React from 'react'\r\n\r\nimport { createDynamicValueJSXConverters } from './jsx.js'\r\n\r\ntype DynamicValueRichTextProps = {\r\n className?: string\r\n converters?: JSXConverters\r\n data: any\r\n disableContainer?: boolean\r\n disableIndent?: boolean | string[]\r\n disableTextAlign?: boolean | string[]\r\n payloadData?: Record<string, unknown>\r\n}\r\n\r\n/**\r\n * Drop-in RichText renderer that always includes dynamic-value converters.\r\n *\r\n * This prevents \"unknown node\" output for DynamicValueNode even if the\r\n * consuming app forgets to pass plugin converters manually.\r\n */\r\nexport const DynamicValueRichText: React.FC<DynamicValueRichTextProps> = ({\r\n converters,\r\n payloadData,\r\n ...props\r\n}) => {\r\n return (\r\n <RichText\r\n {...props}\r\n converters={{\r\n ...(converters || {}),\r\n ...createDynamicValueJSXConverters({ data: payloadData || props.data || {} }),\r\n }}\r\n />\r\n )\r\n}\r\n"],"names":["RichText","React","createDynamicValueJSXConverters","DynamicValueRichText","converters","payloadData","props","data"],"mappings":";AAEA,SAASA,QAAQ,QAAQ,qCAAoC;AAC7D,OAAOC,WAAW,QAAO;AAEzB,SAASC,+BAA+B,QAAQ,WAAU;AAY1D;;;;;CAKC,GACD,OAAO,MAAMC,uBAA4D,CAAC,EACxEC,UAAU,EACVC,WAAW,EACX,GAAGC,OACJ;IACC,qBACE,KAACN;QACE,GAAGM,KAAK;QACTF,YAAY;YACV,GAAIA,cAAc,CAAC,CAAC;YACpB,GAAGF,gCAAgC;gBAAEK,MAAMF,eAAeC,MAAMC,IAAI,IAAI,CAAC;YAAE,EAAE;QAC/E;;AAGN,EAAC"}
@@ -0,0 +1 @@
1
+ export { createDynamicValueJSXConverters, DynamicValueJSXConverters } from './jsx.js';
@@ -0,0 +1,3 @@
1
+ export { createDynamicValueJSXConverters, DynamicValueJSXConverters } from './jsx.js';
2
+
3
+ //# sourceMappingURL=rsc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/rsc.tsx"],"sourcesContent":["export { createDynamicValueJSXConverters, DynamicValueJSXConverters } from './jsx.js'\r\n"],"names":["createDynamicValueJSXConverters","DynamicValueJSXConverters"],"mappings":"AAAA,SAASA,+BAA+B,EAAEC,yBAAyB,QAAQ,WAAU"}
@@ -1,8 +1,4 @@
1
- import type { DynamicValueOption } from './types.js';
2
- export declare const DynamicValueFeatureClient: import("@payloadcms/richtext-lexical").FeatureProviderProviderClient<{
3
- options: DynamicValueOption[];
4
- trigger: string;
5
- }, {
6
- options: DynamicValueOption[];
7
- trigger: string;
8
- }>;
1
+ import { type LexicalNode } from '@payloadcms/richtext-lexical/lexical';
2
+ import { DynamicValueNode } from '../../nodes/DynamicValueNode/index.js';
3
+ export declare function $isDynamicValueNode(node: LexicalNode | null | undefined): node is DynamicValueNode;
4
+ export declare const DynamicValueFeatureClient: import("@payloadcms/richtext-lexical").FeatureProviderProviderClient<undefined, any>;