@od-labs/payloadcms-dynamic-value-richtext 1.0.2 → 1.1.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 (46) hide show
  1. package/README.md +128 -96
  2. package/dist/exports/jsx.d.ts +9 -0
  3. package/dist/exports/jsx.js +73 -0
  4. package/dist/exports/jsx.js.map +1 -0
  5. package/dist/exports/react.d.ts +19 -0
  6. package/dist/exports/react.js +22 -0
  7. package/dist/exports/react.js.map +1 -0
  8. package/dist/exports/rsc.d.ts +1 -0
  9. package/dist/exports/rsc.js +3 -0
  10. package/dist/exports/rsc.js.map +1 -0
  11. package/dist/features/DynamicValue/feature.client.d.ts +4 -8
  12. package/dist/features/DynamicValue/feature.client.js +187 -89
  13. package/dist/features/DynamicValue/feature.client.js.map +1 -1
  14. package/dist/features/DynamicValue/feature.server.d.ts +16 -5
  15. package/dist/features/DynamicValue/feature.server.js +78 -39
  16. package/dist/features/DynamicValue/feature.server.js.map +1 -1
  17. package/dist/features/DynamicValue/types.d.ts +23 -23
  18. package/dist/features/DynamicValue/types.js.map +1 -1
  19. package/dist/icons/dynamicValue/bold.d.ts +2 -0
  20. package/dist/icons/dynamicValue/bold.js +6 -0
  21. package/dist/icons/dynamicValue/bold.js.map +1 -0
  22. package/dist/icons/dynamicValue/index.d.ts +3 -0
  23. package/dist/icons/dynamicValue/index.js +14 -0
  24. package/dist/icons/dynamicValue/index.js.map +1 -0
  25. package/dist/icons/dynamicValue/italic.d.ts +2 -0
  26. package/dist/icons/dynamicValue/italic.js +6 -0
  27. package/dist/icons/dynamicValue/italic.js.map +1 -0
  28. package/dist/icons/dynamicValue/link.d.ts +2 -0
  29. package/dist/icons/dynamicValue/link.js +6 -0
  30. package/dist/icons/dynamicValue/link.js.map +1 -0
  31. package/dist/icons/dynamicValue/strikethrough.d.ts +2 -0
  32. package/dist/icons/dynamicValue/strikethrough.js +6 -0
  33. package/dist/icons/dynamicValue/strikethrough.js.map +1 -0
  34. package/dist/icons/dynamicValue/types.d.ts +5 -0
  35. package/dist/icons/dynamicValue/types.js +3 -0
  36. package/dist/icons/dynamicValue/types.js.map +1 -0
  37. package/dist/icons/dynamicValue/underline.d.ts +2 -0
  38. package/dist/icons/dynamicValue/underline.js +6 -0
  39. package/dist/icons/dynamicValue/underline.js.map +1 -0
  40. package/dist/index.d.ts +6 -6
  41. package/dist/index.js +75 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/nodes/DynamicValueNode/index.d.ts +13 -13
  44. package/dist/nodes/DynamicValueNode/index.js +155 -83
  45. package/dist/nodes/DynamicValueNode/index.js.map +1 -1
  46. package/package.json +41 -1
@@ -1,125 +1,197 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { DecoratorNode } from '@payloadcms/richtext-lexical/lexical';
3
- import React from 'react';
4
- export class DynamicValueNode extends DecoratorNode {
1
+ import { $applyNodeReplacement, TextNode } from '@payloadcms/richtext-lexical/lexical';
2
+ import { dynamicValueIcons } from '../../icons/dynamicValue/index.js';
3
+ export const DYNAMIC_VALUE_NODE_TYPE = 'dynamic-value';
4
+ export const LEGACY_DYNAMIC_VALUE_NODE_TYPE = 'dynamicValue';
5
+ const getAppliedIconTypes = (node)=>{
6
+ const iconTypes = [];
7
+ const parent = node.getParent();
8
+ if (parent?.getType() === 'link') {
9
+ iconTypes.push('link');
10
+ }
11
+ if (node.hasFormat('bold')) {
12
+ iconTypes.push('bold');
13
+ }
14
+ if (node.hasFormat('italic')) {
15
+ iconTypes.push('italic');
16
+ }
17
+ if (node.hasFormat('underline')) {
18
+ iconTypes.push('underline');
19
+ }
20
+ if (node.hasFormat('strikethrough')) {
21
+ iconTypes.push('strikethrough');
22
+ }
23
+ return iconTypes;
24
+ };
25
+ const buildIconsDataURI = (iconTypes)=>{
26
+ if (!iconTypes.length) {
27
+ return null;
28
+ }
29
+ const fillColor = '#b7c4ff';
30
+ const strokeColor = '#b7c4ff';
31
+ const iconGap = 2;
32
+ const iconSize = 14;
33
+ const totalWidth = iconTypes.length * iconSize + (iconTypes.length - 1) * iconGap;
34
+ const paths = iconTypes.map((iconType, index)=>{
35
+ const icon = dynamicValueIcons[iconType];
36
+ const x = index * (iconSize + iconGap);
37
+ if (icon.mode === 'stroke') {
38
+ return `<g transform='translate(${x} 0)'><path d='${icon.path}' fill='none' stroke='${strokeColor}' stroke-linecap='square'/></g>`;
39
+ }
40
+ return `<g transform='translate(${x} 0)'><path d='${icon.path}' fill='${fillColor}'/></g>`;
41
+ }).join('');
42
+ const svg = `<svg xmlns='http://www.w3.org/2000/svg' width='${totalWidth}' height='14' viewBox='0 0 ${totalWidth} 20'>${paths}</svg>`;
43
+ return `url("data:image/svg+xml,${encodeURIComponent(svg)}")`;
44
+ };
45
+ const selectElementText = (dom)=>{
46
+ const selection = window.getSelection();
47
+ if (!selection) {
48
+ return;
49
+ }
50
+ const range = document.createRange();
51
+ range.selectNodeContents(dom);
52
+ selection.removeAllRanges();
53
+ selection.addRange(range);
54
+ };
55
+ let hasRegisteredSelectionStyle = false;
56
+ const ensureInvisibleSelectionStyle = ()=>{
57
+ if (hasRegisteredSelectionStyle || typeof document === 'undefined') {
58
+ return;
59
+ }
60
+ const styleElement = document.createElement('style');
61
+ styleElement.textContent = `
62
+ .payload-dynamic-value-node::selection {
63
+ background: transparent;
64
+ color: inherit;
65
+ -webkit-text-fill-color: inherit;
66
+ }
67
+
68
+ .payload-dynamic-value-node::-moz-selection {
69
+ background: transparent;
70
+ color: inherit;
71
+ -webkit-text-fill-color: inherit;
72
+ }
73
+ `;
74
+ document.head.append(styleElement);
75
+ hasRegisteredSelectionStyle = true;
76
+ };
77
+ const applyDynamicValueStyles = (node, dom)=>{
78
+ ensureInvisibleSelectionStyle();
79
+ const iconTypes = getAppliedIconTypes(node);
80
+ const iconDataURI = buildIconsDataURI(iconTypes);
81
+ const iconBlockWidth = iconTypes.length ? iconTypes.length * 16 : 0;
82
+ dom.classList.add('payload-dynamic-value-node');
83
+ dom.setAttribute('data-payload-dynamic-value', 'true');
84
+ dom.setAttribute('data-payload-dynamic-field', node.__field);
85
+ dom.setAttribute('data-payload-dynamic-icons', iconTypes.join(','));
86
+ dom.style.alignItems = 'center';
87
+ dom.style.backgroundColor = 'var(--theme-elevation-150)';
88
+ dom.style.backgroundImage = iconDataURI || 'none';
89
+ dom.style.backgroundPosition = '6px center';
90
+ dom.style.backgroundRepeat = 'no-repeat';
91
+ dom.style.backgroundSize = iconTypes.length ? `${iconBlockWidth - 2}px 14px` : '0 0';
92
+ dom.style.border = '1px solid var(--theme-elevation-300)';
93
+ dom.style.borderRadius = '4px';
94
+ dom.style.boxShadow = '0 1px 2px rgba(0,0,0,0.05)';
95
+ dom.style.color = 'var(--theme-text)';
96
+ dom.style.cursor = 'pointer';
97
+ dom.style.display = 'inline-flex';
98
+ dom.style.fontFamily = 'var(--font-mono, monospace)';
99
+ dom.style.fontSize = '0.85em';
100
+ dom.style.margin = '0 2px';
101
+ dom.style.minHeight = '1.6em';
102
+ dom.style.padding = iconTypes.length ? `1px 6px 1px ${iconBlockWidth + 12}px` : '1px 6px';
103
+ dom.style.userSelect = 'all';
104
+ dom.style.verticalAlign = 'middle';
105
+ dom.style.webkitTextFillColor = 'var(--theme-text)';
106
+ dom.onmousedown = (event)=>{
107
+ event.preventDefault();
108
+ selectElementText(dom);
109
+ };
110
+ };
111
+ export class DynamicValueNode extends TextNode {
5
112
  __field;
6
- __label;
7
- constructor(field, label, key){
8
- super(key);
113
+ constructor(field, text, key){
114
+ super(text, key);
9
115
  this.__field = field;
10
- this.__label = label ?? field;
11
116
  }
12
117
  static clone(node) {
13
- return new DynamicValueNode(node.__field, node.__label, node.getKey());
118
+ return new DynamicValueNode(node.__field, node.__text, node.__key);
14
119
  }
15
120
  static getType() {
16
- return 'dynamic-value';
121
+ return DYNAMIC_VALUE_NODE_TYPE;
17
122
  }
18
123
  static importDOM() {
19
124
  return {
20
125
  span: (domNode)=>{
21
- if (!domNode.hasAttribute('data-payload-dynamic-value')) {
22
- return null;
126
+ if (domNode instanceof HTMLSpanElement && domNode.hasAttribute('data-payload-dynamic-value')) {
127
+ return {
128
+ conversion: convertDynamicValueElement,
129
+ priority: 2
130
+ };
23
131
  }
24
- return {
25
- conversion: (domNode)=>{
26
- const field = domNode.getAttribute('data-payload-dynamic-field');
27
- const label = domNode.textContent || undefined;
28
- if (field) {
29
- return {
30
- node: $createDynamicValueNode(field, label)
31
- };
32
- }
33
- return {
34
- node: null
35
- };
36
- },
37
- priority: 1
38
- };
132
+ return null;
39
133
  }
40
134
  };
41
135
  }
42
136
  static importJSON(serializedNode) {
43
- return $createDynamicValueNode(serializedNode.field, serializedNode.label);
44
- }
45
- createDOM() {
46
- const span = document.createElement('span');
47
- span.style.display = 'inline-block';
48
- span.className = 'payload-dynamic-value-node';
49
- return span;
50
- }
51
- decorate() {
52
- return /*#__PURE__*/ _jsxs("span", {
53
- contentEditable: false,
54
- style: {
55
- alignItems: 'center',
56
- backgroundColor: 'var(--theme-elevation-150)',
57
- border: '1px solid var(--theme-elevation-300)',
58
- borderRadius: '4px',
59
- boxShadow: '0 1px 2px rgba(0,0,0,0.05)',
60
- color: 'var(--theme-text)',
61
- cursor: 'default',
62
- display: 'inline-flex',
63
- fontFamily: 'var(--font-mono, monospace)',
64
- fontSize: '0.85em',
65
- fontWeight: 600,
66
- margin: '0 2px',
67
- padding: '1px 6px',
68
- userSelect: 'none',
69
- verticalAlign: 'middle'
70
- },
71
- children: [
72
- /*#__PURE__*/ _jsx("span", {
73
- style: {
74
- color: 'var(--theme-primary)',
75
- fontSize: '0.8em',
76
- marginRight: '4px',
77
- opacity: 0.4
78
- },
79
- children: "VAR"
80
- }),
81
- this.__label
82
- ]
83
- });
137
+ const node = $createDynamicValueNode(serializedNode.field, serializedNode.label || serializedNode.text);
138
+ node.setFormat(serializedNode.format);
139
+ node.setStyle(serializedNode.style);
140
+ node.setMode(serializedNode.mode);
141
+ node.setDetail(serializedNode.detail);
142
+ return node;
143
+ }
144
+ createDOM(config) {
145
+ const dom = super.createDOM(config);
146
+ applyDynamicValueStyles(this, dom);
147
+ return dom;
84
148
  }
85
149
  exportDOM() {
86
150
  const element = document.createElement('span');
87
151
  element.setAttribute('data-payload-dynamic-value', 'true');
88
152
  element.setAttribute('data-payload-dynamic-field', this.__field);
89
- element.textContent = this.__label;
153
+ element.textContent = this.getTextContent();
90
154
  return {
91
155
  element
92
156
  };
93
157
  }
94
158
  exportJSON() {
95
159
  return {
96
- type: 'dynamic-value',
160
+ ...super.exportJSON(),
161
+ type: DYNAMIC_VALUE_NODE_TYPE,
97
162
  field: this.__field,
98
- label: this.__label,
163
+ label: this.getTextContent(),
99
164
  version: 1
100
165
  };
101
166
  }
102
167
  getField() {
103
168
  return this.__field;
104
169
  }
105
- getTextContent() {
106
- return this.__label;
107
- }
108
- isInline() {
109
- return true;
110
- }
111
- isToken() {
170
+ isTextEntity() {
112
171
  return true;
113
172
  }
114
- updateDOM() {
115
- return false;
173
+ updateDOM(prevNode, dom, config) {
174
+ const didUpdate = super.updateDOM(prevNode, dom, config);
175
+ if (prevNode.__field !== this.__field || prevNode.getFormat() !== this.getFormat()) {
176
+ applyDynamicValueStyles(this, dom);
177
+ }
178
+ return didUpdate;
116
179
  }
117
180
  }
118
- export function $createDynamicValueNode(field, label) {
119
- return new DynamicValueNode(field, label);
181
+ function convertDynamicValueElement(domNode) {
182
+ const span = domNode;
183
+ const field = span.getAttribute('data-payload-dynamic-field') || span.textContent || '';
184
+ return {
185
+ node: $createDynamicValueNode(field, span.textContent || field)
186
+ };
187
+ }
188
+ export function $createDynamicValueNode(field, text) {
189
+ const node = new DynamicValueNode(field, text || field);
190
+ node.setMode('token');
191
+ return $applyNodeReplacement(node);
120
192
  }
121
193
  export function $isDynamicValueNode(node) {
122
- return node?.getType() === 'dynamic-value';
194
+ return node?.getType() === DYNAMIC_VALUE_NODE_TYPE;
123
195
  }
124
196
 
125
197
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/nodes/DynamicValueNode/index.tsx"],"sourcesContent":["import {\r\n DecoratorNode,\r\n type DOMConversionMap,\r\n type DOMConversionOutput,\r\n type DOMExportOutput,\r\n type LexicalNode,\r\n type NodeKey,\r\n type SerializedLexicalNode,\r\n type Spread,\r\n} from '@payloadcms/richtext-lexical/lexical'\r\nimport React from 'react'\r\n\r\nexport type SerializedDynamicValueNode = Spread<\r\n {\r\n field: string\r\n label?: string\r\n },\r\n SerializedLexicalNode\r\n>\r\n\r\nexport class DynamicValueNode extends DecoratorNode<React.ReactNode> {\r\n __field: string\r\n __label: string\r\n\r\n constructor(field: string, label?: string, key?: NodeKey) {\r\n super(key)\r\n this.__field = field\r\n this.__label = label ?? field\r\n }\r\n\r\n static clone(node: DynamicValueNode): DynamicValueNode {\r\n return new DynamicValueNode(node.__field, node.__label, node.getKey())\r\n }\r\n\r\n static getType(): string {\r\n return 'dynamic-value'\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n span: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-payload-dynamic-value')) {\r\n return null\r\n }\r\n return {\r\n conversion: (domNode: HTMLElement): DOMConversionOutput => {\r\n const field = domNode.getAttribute('data-payload-dynamic-field')\r\n const label = domNode.textContent || undefined\r\n if (field) {\r\n return { node: $createDynamicValueNode(field, label) }\r\n }\r\n return { node: null }\r\n },\r\n priority: 1,\r\n }\r\n },\r\n }\r\n }\r\n\r\n static importJSON(serializedNode: SerializedDynamicValueNode): DynamicValueNode {\r\n return $createDynamicValueNode(serializedNode.field, serializedNode.label)\r\n }\r\n\r\n createDOM(): HTMLElement {\r\n const span = document.createElement('span')\r\n span.style.display = 'inline-block'\r\n span.className = 'payload-dynamic-value-node'\r\n return span\r\n }\r\n\r\n decorate(): React.ReactNode {\r\n return (\r\n <span\r\n contentEditable={false}\r\n style={{\r\n alignItems: 'center',\r\n backgroundColor: 'var(--theme-elevation-150)',\r\n border: '1px solid var(--theme-elevation-300)',\r\n borderRadius: '4px',\r\n boxShadow: '0 1px 2px rgba(0,0,0,0.05)',\r\n color: 'var(--theme-text)',\r\n cursor: 'default',\r\n display: 'inline-flex',\r\n fontFamily: 'var(--font-mono, monospace)',\r\n fontSize: '0.85em',\r\n fontWeight: 600,\r\n margin: '0 2px',\r\n padding: '1px 6px',\r\n userSelect: 'none',\r\n verticalAlign: 'middle',\r\n }}\r\n >\r\n <span\r\n style={{\r\n color: 'var(--theme-primary)',\r\n fontSize: '0.8em',\r\n marginRight: '4px',\r\n opacity: 0.4,\r\n }}\r\n >\r\n VAR\r\n </span>\r\n {this.__label}\r\n </span>\r\n )\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('span')\r\n element.setAttribute('data-payload-dynamic-value', 'true')\r\n element.setAttribute('data-payload-dynamic-field', this.__field)\r\n element.textContent = this.__label\r\n return { element }\r\n }\r\n\r\n exportJSON(): SerializedDynamicValueNode {\r\n return {\r\n type: 'dynamic-value',\r\n field: this.__field,\r\n label: this.__label,\r\n version: 1,\r\n }\r\n }\r\n\r\n getField(): string {\r\n return this.__field\r\n }\r\n\r\n getTextContent(): string {\r\n return this.__label\r\n }\r\n\r\n isInline(): boolean {\r\n return true\r\n }\r\n\r\n isToken(): boolean {\r\n return true\r\n }\r\n\r\n updateDOM(): boolean {\r\n return false\r\n }\r\n}\r\n\r\nexport function $createDynamicValueNode(field: string, label?: string): DynamicValueNode {\r\n return new DynamicValueNode(field, label)\r\n}\r\n\r\nexport function $isDynamicValueNode(\r\n node: LexicalNode | null | undefined,\r\n): node is DynamicValueNode {\r\n return node?.getType() === 'dynamic-value'\r\n}\r\n"],"names":["DecoratorNode","React","DynamicValueNode","__field","__label","field","label","key","clone","node","getKey","getType","importDOM","span","domNode","hasAttribute","conversion","getAttribute","textContent","undefined","$createDynamicValueNode","priority","importJSON","serializedNode","createDOM","document","createElement","style","display","className","decorate","contentEditable","alignItems","backgroundColor","border","borderRadius","boxShadow","color","cursor","fontFamily","fontSize","fontWeight","margin","padding","userSelect","verticalAlign","marginRight","opacity","exportDOM","element","setAttribute","exportJSON","type","version","getField","getTextContent","isInline","isToken","updateDOM","$isDynamicValueNode"],"mappings":";AAAA,SACEA,aAAa,QAQR,uCAAsC;AAC7C,OAAOC,WAAW,QAAO;AAUzB,OAAO,MAAMC,yBAAyBF;IACpCG,QAAe;IACfC,QAAe;IAEf,YAAYC,KAAa,EAAEC,KAAc,EAAEC,GAAa,CAAE;QACxD,KAAK,CAACA;QACN,IAAI,CAACJ,OAAO,GAAGE;QACf,IAAI,CAACD,OAAO,GAAGE,SAASD;IAC1B;IAEA,OAAOG,MAAMC,IAAsB,EAAoB;QACrD,OAAO,IAAIP,iBAAiBO,KAAKN,OAAO,EAAEM,KAAKL,OAAO,EAAEK,KAAKC,MAAM;IACrE;IAEA,OAAOC,UAAkB;QACvB,OAAO;IACT;IAEA,OAAOC,YAAqC;QAC1C,OAAO;YACLC,MAAM,CAACC;gBACL,IAAI,CAACA,QAAQC,YAAY,CAAC,+BAA+B;oBACvD,OAAO;gBACT;gBACA,OAAO;oBACLC,YAAY,CAACF;wBACX,MAAMT,QAAQS,QAAQG,YAAY,CAAC;wBACnC,MAAMX,QAAQQ,QAAQI,WAAW,IAAIC;wBACrC,IAAId,OAAO;4BACT,OAAO;gCAAEI,MAAMW,wBAAwBf,OAAOC;4BAAO;wBACvD;wBACA,OAAO;4BAAEG,MAAM;wBAAK;oBACtB;oBACAY,UAAU;gBACZ;YACF;QACF;IACF;IAEA,OAAOC,WAAWC,cAA0C,EAAoB;QAC9E,OAAOH,wBAAwBG,eAAelB,KAAK,EAAEkB,eAAejB,KAAK;IAC3E;IAEAkB,YAAyB;QACvB,MAAMX,OAAOY,SAASC,aAAa,CAAC;QACpCb,KAAKc,KAAK,CAACC,OAAO,GAAG;QACrBf,KAAKgB,SAAS,GAAG;QACjB,OAAOhB;IACT;IAEAiB,WAA4B;QAC1B,qBACE,MAACjB;YACCkB,iBAAiB;YACjBJ,OAAO;gBACLK,YAAY;gBACZC,iBAAiB;gBACjBC,QAAQ;gBACRC,cAAc;gBACdC,WAAW;gBACXC,OAAO;gBACPC,QAAQ;gBACRV,SAAS;gBACTW,YAAY;gBACZC,UAAU;gBACVC,YAAY;gBACZC,QAAQ;gBACRC,SAAS;gBACTC,YAAY;gBACZC,eAAe;YACjB;;8BAEA,KAAChC;oBACCc,OAAO;wBACLU,OAAO;wBACPG,UAAU;wBACVM,aAAa;wBACbC,SAAS;oBACX;8BACD;;gBAGA,IAAI,CAAC3C,OAAO;;;IAGnB;IAEA4C,YAA6B;QAC3B,MAAMC,UAAUxB,SAASC,aAAa,CAAC;QACvCuB,QAAQC,YAAY,CAAC,8BAA8B;QACnDD,QAAQC,YAAY,CAAC,8BAA8B,IAAI,CAAC/C,OAAO;QAC/D8C,QAAQ/B,WAAW,GAAG,IAAI,CAACd,OAAO;QAClC,OAAO;YAAE6C;QAAQ;IACnB;IAEAE,aAAyC;QACvC,OAAO;YACLC,MAAM;YACN/C,OAAO,IAAI,CAACF,OAAO;YACnBG,OAAO,IAAI,CAACF,OAAO;YACnBiD,SAAS;QACX;IACF;IAEAC,WAAmB;QACjB,OAAO,IAAI,CAACnD,OAAO;IACrB;IAEAoD,iBAAyB;QACvB,OAAO,IAAI,CAACnD,OAAO;IACrB;IAEAoD,WAAoB;QAClB,OAAO;IACT;IAEAC,UAAmB;QACjB,OAAO;IACT;IAEAC,YAAqB;QACnB,OAAO;IACT;AACF;AAEA,OAAO,SAAStC,wBAAwBf,KAAa,EAAEC,KAAc;IACnE,OAAO,IAAIJ,iBAAiBG,OAAOC;AACrC;AAEA,OAAO,SAASqD,oBACdlD,IAAoC;IAEpC,OAAOA,MAAME,cAAc;AAC7B"}
1
+ {"version":3,"sources":["../../../src/nodes/DynamicValueNode/index.tsx"],"sourcesContent":["import type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedTextNode,\r\n Spread,\r\n} from '@payloadcms/richtext-lexical/lexical'\r\n\r\nimport { $applyNodeReplacement, TextNode } from '@payloadcms/richtext-lexical/lexical'\r\n\r\nimport { dynamicValueIcons, type DynamicValueIconType } from '../../icons/dynamicValue/index.js'\r\n\r\nexport const DYNAMIC_VALUE_NODE_TYPE = 'dynamic-value'\r\nexport const LEGACY_DYNAMIC_VALUE_NODE_TYPE = 'dynamicValue'\r\n\r\nexport type SerializedDynamicValueNode = Spread<\r\n {\r\n field: string\r\n label?: string\r\n type: typeof DYNAMIC_VALUE_NODE_TYPE\r\n version: 1\r\n },\r\n SerializedTextNode\r\n>\r\n\r\nconst getAppliedIconTypes = (node: DynamicValueNode): DynamicValueIconType[] => {\r\n const iconTypes: DynamicValueIconType[] = []\r\n const parent = node.getParent()\r\n\r\n if (parent?.getType() === 'link') {\r\n iconTypes.push('link')\r\n }\r\n\r\n if (node.hasFormat('bold')) {\r\n iconTypes.push('bold')\r\n }\r\n\r\n if (node.hasFormat('italic')) {\r\n iconTypes.push('italic')\r\n }\r\n\r\n if (node.hasFormat('underline')) {\r\n iconTypes.push('underline')\r\n }\r\n\r\n if (node.hasFormat('strikethrough')) {\r\n iconTypes.push('strikethrough')\r\n }\r\n\r\n return iconTypes\r\n}\r\n\r\nconst buildIconsDataURI = (iconTypes: DynamicValueIconType[]): null | string => {\r\n if (!iconTypes.length) {\r\n return null\r\n }\r\n\r\n const fillColor = '#b7c4ff'\r\n const strokeColor = '#b7c4ff'\r\n const iconGap = 2\r\n const iconSize = 14\r\n const totalWidth = iconTypes.length * iconSize + (iconTypes.length - 1) * iconGap\r\n\r\n const paths = iconTypes\r\n .map((iconType, index) => {\r\n const icon = dynamicValueIcons[iconType]\r\n const x = index * (iconSize + iconGap)\r\n\r\n if (icon.mode === 'stroke') {\r\n return `<g transform='translate(${x} 0)'><path d='${icon.path}' fill='none' stroke='${strokeColor}' stroke-linecap='square'/></g>`\r\n }\r\n\r\n return `<g transform='translate(${x} 0)'><path d='${icon.path}' fill='${fillColor}'/></g>`\r\n })\r\n .join('')\r\n\r\n const svg = `<svg xmlns='http://www.w3.org/2000/svg' width='${totalWidth}' height='14' viewBox='0 0 ${totalWidth} 20'>${paths}</svg>`\r\n\r\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\")`\r\n}\r\n\r\nconst selectElementText = (dom: HTMLElement): void => {\r\n const selection = window.getSelection()\r\n if (!selection) {\r\n return\r\n }\r\n\r\n const range = document.createRange()\r\n range.selectNodeContents(dom)\r\n selection.removeAllRanges()\r\n selection.addRange(range)\r\n}\r\n\r\n\r\nlet hasRegisteredSelectionStyle = false\r\n\r\nconst ensureInvisibleSelectionStyle = (): void => {\r\n if (hasRegisteredSelectionStyle || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n const styleElement = document.createElement('style')\r\n styleElement.textContent = `\r\n .payload-dynamic-value-node::selection {\r\n background: transparent;\r\n color: inherit;\r\n -webkit-text-fill-color: inherit;\r\n }\r\n\r\n .payload-dynamic-value-node::-moz-selection {\r\n background: transparent;\r\n color: inherit;\r\n -webkit-text-fill-color: inherit;\r\n }\r\n `\r\n\r\n document.head.append(styleElement)\r\n hasRegisteredSelectionStyle = true\r\n}\r\n\r\nconst applyDynamicValueStyles = (node: DynamicValueNode, dom: HTMLElement): void => {\r\n ensureInvisibleSelectionStyle()\r\n const iconTypes = getAppliedIconTypes(node)\r\n const iconDataURI = buildIconsDataURI(iconTypes)\r\n const iconBlockWidth = iconTypes.length ? iconTypes.length * 16 : 0\r\n\r\n dom.classList.add('payload-dynamic-value-node')\r\n dom.setAttribute('data-payload-dynamic-value', 'true')\r\n dom.setAttribute('data-payload-dynamic-field', node.__field)\r\n dom.setAttribute('data-payload-dynamic-icons', iconTypes.join(','))\r\n\r\n dom.style.alignItems = 'center'\r\n dom.style.backgroundColor = 'var(--theme-elevation-150)'\r\n dom.style.backgroundImage = iconDataURI || 'none'\r\n dom.style.backgroundPosition = '6px center'\r\n dom.style.backgroundRepeat = 'no-repeat'\r\n dom.style.backgroundSize = iconTypes.length ? `${iconBlockWidth - 2}px 14px` : '0 0'\r\n dom.style.border = '1px solid var(--theme-elevation-300)'\r\n dom.style.borderRadius = '4px'\r\n dom.style.boxShadow = '0 1px 2px rgba(0,0,0,0.05)'\r\n dom.style.color = 'var(--theme-text)'\r\n dom.style.cursor = 'pointer'\r\n dom.style.display = 'inline-flex'\r\n dom.style.fontFamily = 'var(--font-mono, monospace)'\r\n dom.style.fontSize = '0.85em'\r\n dom.style.margin = '0 2px'\r\n dom.style.minHeight = '1.6em'\r\n dom.style.padding = iconTypes.length ? `1px 6px 1px ${iconBlockWidth + 12}px` : '1px 6px'\r\n dom.style.userSelect = 'all'\r\n dom.style.verticalAlign = 'middle'\r\n dom.style.webkitTextFillColor = 'var(--theme-text)'\r\n\r\n dom.onmousedown = (event) => {\r\n event.preventDefault()\r\n selectElementText(dom)\r\n }\r\n}\r\n\r\nexport class DynamicValueNode extends TextNode {\r\n __field: string\r\n\r\n constructor(field: string, text: string, key?: NodeKey) {\r\n super(text, key)\r\n this.__field = field\r\n }\r\n\r\n static clone(node: DynamicValueNode): DynamicValueNode {\r\n return new DynamicValueNode(node.__field, node.__text, node.__key)\r\n }\r\n\r\n static getType(): string {\r\n return DYNAMIC_VALUE_NODE_TYPE\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n span: (domNode: Node) => {\r\n if (\r\n domNode instanceof HTMLSpanElement &&\r\n domNode.hasAttribute('data-payload-dynamic-value')\r\n ) {\r\n return {\r\n conversion: convertDynamicValueElement,\r\n priority: 2,\r\n }\r\n }\r\n\r\n return null\r\n },\r\n }\r\n }\r\n\r\n static importJSON(serializedNode: SerializedDynamicValueNode): DynamicValueNode {\r\n const node = $createDynamicValueNode(\r\n serializedNode.field,\r\n serializedNode.label || serializedNode.text,\r\n )\r\n\r\n node.setFormat(serializedNode.format)\r\n node.setStyle(serializedNode.style)\r\n node.setMode(serializedNode.mode)\r\n node.setDetail(serializedNode.detail)\r\n\r\n return node\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config)\r\n applyDynamicValueStyles(this, dom)\r\n return dom\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('span')\r\n element.setAttribute('data-payload-dynamic-value', 'true')\r\n element.setAttribute('data-payload-dynamic-field', this.__field)\r\n element.textContent = this.getTextContent()\r\n\r\n return {\r\n element,\r\n }\r\n }\r\n\r\n exportJSON(): SerializedDynamicValueNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: DYNAMIC_VALUE_NODE_TYPE,\r\n field: this.__field,\r\n label: this.getTextContent(),\r\n version: 1,\r\n }\r\n }\r\n\r\n getField(): string {\r\n return this.__field\r\n }\r\n\r\n isTextEntity(): true {\r\n return true\r\n }\r\n\r\n updateDOM(prevNode: DynamicValueNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n const didUpdate = (super.updateDOM as (\r\n node: DynamicValueNode,\r\n element: HTMLElement,\r\n editorConfig: EditorConfig,\r\n ) => boolean)(prevNode, dom, config)\r\n\r\n if (prevNode.__field !== this.__field || prevNode.getFormat() !== this.getFormat()) {\r\n applyDynamicValueStyles(this, dom)\r\n }\r\n\r\n return didUpdate\r\n }\r\n}\r\n\r\nfunction convertDynamicValueElement(domNode: Node): DOMConversionOutput {\r\n const span = domNode as HTMLSpanElement\r\n const field = span.getAttribute('data-payload-dynamic-field') || span.textContent || ''\r\n\r\n return {\r\n node: $createDynamicValueNode(field, span.textContent || field),\r\n }\r\n}\r\n\r\nexport function $createDynamicValueNode(field: string, text?: string): DynamicValueNode {\r\n const node = new DynamicValueNode(field, text || field)\r\n node.setMode('token')\r\n return $applyNodeReplacement(node)\r\n}\r\n\r\nexport function $isDynamicValueNode(node: LexicalNode | null | undefined): node is DynamicValueNode {\r\n return node?.getType() === DYNAMIC_VALUE_NODE_TYPE\r\n}\r\n"],"names":["$applyNodeReplacement","TextNode","dynamicValueIcons","DYNAMIC_VALUE_NODE_TYPE","LEGACY_DYNAMIC_VALUE_NODE_TYPE","getAppliedIconTypes","node","iconTypes","parent","getParent","getType","push","hasFormat","buildIconsDataURI","length","fillColor","strokeColor","iconGap","iconSize","totalWidth","paths","map","iconType","index","icon","x","mode","path","join","svg","encodeURIComponent","selectElementText","dom","selection","window","getSelection","range","document","createRange","selectNodeContents","removeAllRanges","addRange","hasRegisteredSelectionStyle","ensureInvisibleSelectionStyle","styleElement","createElement","textContent","head","append","applyDynamicValueStyles","iconDataURI","iconBlockWidth","classList","add","setAttribute","__field","style","alignItems","backgroundColor","backgroundImage","backgroundPosition","backgroundRepeat","backgroundSize","border","borderRadius","boxShadow","color","cursor","display","fontFamily","fontSize","margin","minHeight","padding","userSelect","verticalAlign","webkitTextFillColor","onmousedown","event","preventDefault","DynamicValueNode","field","text","key","clone","__text","__key","importDOM","span","domNode","HTMLSpanElement","hasAttribute","conversion","convertDynamicValueElement","priority","importJSON","serializedNode","$createDynamicValueNode","label","setFormat","format","setStyle","setMode","setDetail","detail","createDOM","config","exportDOM","element","getTextContent","exportJSON","type","version","getField","isTextEntity","updateDOM","prevNode","didUpdate","getFormat","getAttribute","$isDynamicValueNode"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@od-labs/payloadcms-dynamic-value-richtext",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Dynamic Value Rich Text Plugin for PayloadCMS",
5
5
  "license": "MIT",
6
6
  "author": "OD LABS",
@@ -15,6 +15,26 @@
15
15
  "import": "./dist/exports/client.js",
16
16
  "types": "./dist/exports/client.d.ts",
17
17
  "default": "./dist/exports/client.js"
18
+ },
19
+ "./server": {
20
+ "import": "./dist/exports/server.js",
21
+ "types": "./dist/exports/server.d.ts",
22
+ "default": "./dist/exports/server.js"
23
+ },
24
+ "./jsx": {
25
+ "import": "./dist/exports/jsx.js",
26
+ "types": "./dist/exports/jsx.d.ts",
27
+ "default": "./dist/exports/jsx.js"
28
+ },
29
+ "./rsc": {
30
+ "import": "./dist/exports/rsc.js",
31
+ "types": "./dist/exports/rsc.d.ts",
32
+ "default": "./dist/exports/rsc.js"
33
+ },
34
+ "./react": {
35
+ "import": "./dist/exports/react.js",
36
+ "types": "./dist/exports/react.d.ts",
37
+ "default": "./dist/exports/react.js"
18
38
  }
19
39
  },
20
40
  "main": "./dist/index.js",
@@ -93,6 +113,26 @@
93
113
  "import": "./dist/exports/client.js",
94
114
  "types": "./dist/exports/client.d.ts",
95
115
  "default": "./dist/exports/client.js"
116
+ },
117
+ "./server": {
118
+ "import": "./dist/exports/server.js",
119
+ "types": "./dist/exports/server.d.ts",
120
+ "default": "./dist/exports/server.js"
121
+ },
122
+ "./jsx": {
123
+ "import": "./dist/exports/jsx.js",
124
+ "types": "./dist/exports/jsx.d.ts",
125
+ "default": "./dist/exports/jsx.js"
126
+ },
127
+ "./rsc": {
128
+ "import": "./dist/exports/rsc.js",
129
+ "types": "./dist/exports/rsc.d.ts",
130
+ "default": "./dist/exports/rsc.js"
131
+ },
132
+ "./react": {
133
+ "import": "./dist/exports/react.js",
134
+ "types": "./dist/exports/react.d.ts",
135
+ "default": "./dist/exports/react.js"
96
136
  }
97
137
  },
98
138
  "main": "./dist/index.js",