@pallasoft/ps-input-components 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/components/ps-calendar-header.js +4 -7
  2. package/dist/components/ps-cascader-input.js +1 -1
  3. package/dist/components/ps-checkbox-matrix.d.ts +13 -0
  4. package/dist/components/ps-checkbox-matrix.js +24 -0
  5. package/dist/components/ps-color-picker.js +2 -2
  6. package/dist/components/ps-combobox-input.js +1 -1
  7. package/dist/components/ps-date-input.js +1 -1
  8. package/dist/components/ps-date-preset-field.js +2 -2
  9. package/dist/components/ps-field-skeleton.js +1 -1
  10. package/dist/components/ps-file-picker.js +1 -1
  11. package/dist/components/ps-multi-select-input.js +2 -2
  12. package/dist/components/ps-phone-input.js +1 -1
  13. package/dist/components/ps-portable-text-editor.d.ts +1 -1
  14. package/dist/components/ps-portable-text-editor.js +1 -2
  15. package/dist/components/ps-portable-text-link-dialog.d.ts +2 -1
  16. package/dist/components/ps-portable-text-link-dialog.js +2 -2
  17. package/dist/components/ps-portable-text-toolbar.js +2 -7
  18. package/dist/components/ps-select-input.js +1 -1
  19. package/dist/components/ps-toggle.js +1 -1
  20. package/dist/components/ps-year-input.js +1 -1
  21. package/dist/constants/ps-calendar-header-classes.d.ts +6 -0
  22. package/dist/constants/ps-calendar-header-classes.js +9 -0
  23. package/dist/constants/ps-portable-text-editor-config.d.ts +10 -2
  24. package/dist/constants/ps-portable-text-editor-config.js +10 -2
  25. package/dist/esm/components/ps-calendar-header.js +4 -7
  26. package/dist/esm/components/ps-cascader-input.js +1 -1
  27. package/dist/esm/components/ps-checkbox-matrix.js +20 -0
  28. package/dist/esm/components/ps-color-picker.js +2 -2
  29. package/dist/esm/components/ps-combobox-input.js +1 -1
  30. package/dist/esm/components/ps-date-input.js +1 -1
  31. package/dist/esm/components/ps-date-preset-field.js +2 -2
  32. package/dist/esm/components/ps-field-skeleton.js +1 -1
  33. package/dist/esm/components/ps-file-picker.js +1 -1
  34. package/dist/esm/components/ps-multi-select-input.js +2 -2
  35. package/dist/esm/components/ps-phone-input.js +1 -1
  36. package/dist/esm/components/ps-portable-text-editor.js +1 -2
  37. package/dist/esm/components/ps-portable-text-link-dialog.js +2 -2
  38. package/dist/esm/components/ps-portable-text-toolbar.js +2 -7
  39. package/dist/esm/components/ps-select-input.js +1 -1
  40. package/dist/esm/components/ps-toggle.js +1 -1
  41. package/dist/esm/components/ps-year-input.js +1 -1
  42. package/dist/esm/constants/ps-calendar-header-classes.js +6 -0
  43. package/dist/esm/constants/ps-portable-text-editor-config.js +10 -2
  44. package/dist/esm/index.js +7 -0
  45. package/dist/esm/interfaces/ps-checkbox-matrix-cell.js +1 -0
  46. package/dist/esm/interfaces/ps-checkbox-matrix-column.js +1 -0
  47. package/dist/esm/interfaces/ps-checkbox-matrix-group.js +1 -0
  48. package/dist/esm/interfaces/ps-checkbox-matrix-labels.js +1 -0
  49. package/dist/esm/interfaces/ps-checkbox-matrix-row.js +1 -0
  50. package/dist/esm/portable-text-core/components/ps-portable-text-core-editor-stub.js +2 -0
  51. package/dist/esm/portable-text-core/components/ps-portable-text-core-editor.js +64 -0
  52. package/dist/esm/portable-text-core/components/ps-portable-text-core.js +5 -26
  53. package/dist/esm/portable-text-core/constants/ps-portable-text-core-config.js +29 -9
  54. package/dist/esm/portable-text-core/contexts/ps-portable-text-core-context.js +9 -0
  55. package/dist/esm/portable-text-core/hooks/use-ps-portable-text-link-form.js +11 -5
  56. package/dist/esm/portable-text-core/hooks/use-ps-portable-text-toolbar.js +17 -49
  57. package/dist/esm/portable-text-core/index.js +4 -0
  58. package/dist/esm/portable-text-core/interfaces/ps-portable-text-active-formats.js +1 -0
  59. package/dist/esm/portable-text-core/interfaces/ps-portable-text-block-draft.js +1 -0
  60. package/dist/esm/portable-text-core/interfaces/ps-portable-text-core-class-names.js +1 -0
  61. package/dist/esm/portable-text-core/interfaces/ps-portable-text-core-context-data.js +1 -0
  62. package/dist/esm/portable-text-core/interfaces/ps-portable-text-core-props.js +1 -0
  63. package/dist/esm/portable-text-core/interfaces/ps-portable-text-extension-options.js +1 -0
  64. package/dist/esm/portable-text-core/interfaces/ps-portable-text-span-draft.js +1 -0
  65. package/dist/esm/portable-text-core/interfaces/ps-portable-text-toolbar-state.js +1 -0
  66. package/dist/esm/portable-text-core/services/ps-portable-text-command-service.js +73 -0
  67. package/dist/esm/portable-text-core/services/ps-portable-text-converter-service.js +196 -0
  68. package/dist/esm/portable-text-core/services/ps-portable-text-editor-service.js +4 -0
  69. package/dist/esm/portable-text-core/services/ps-portable-text-extension-service.js +89 -0
  70. package/dist/esm/portable-text-engine/index.js +1 -0
  71. package/dist/esm/portable-text-engine/worker.js +1 -0
  72. package/dist/esm/services/ps-checkbox-matrix-service.js +28 -0
  73. package/dist/index.d.ts +7 -0
  74. package/dist/index.js +7 -0
  75. package/dist/interfaces/ps-checkbox-matrix-cell.d.ts +6 -0
  76. package/dist/interfaces/ps-checkbox-matrix-cell.js +2 -0
  77. package/dist/interfaces/ps-checkbox-matrix-column.d.ts +5 -0
  78. package/dist/interfaces/ps-checkbox-matrix-column.js +2 -0
  79. package/dist/interfaces/ps-checkbox-matrix-group.d.ts +6 -0
  80. package/dist/interfaces/ps-checkbox-matrix-group.js +2 -0
  81. package/dist/interfaces/ps-checkbox-matrix-labels.d.ts +9 -0
  82. package/dist/interfaces/ps-checkbox-matrix-labels.js +2 -0
  83. package/dist/interfaces/ps-checkbox-matrix-row.d.ts +6 -0
  84. package/dist/interfaces/ps-checkbox-matrix-row.js +2 -0
  85. package/dist/portable-text/index.d.ts +1 -1
  86. package/dist/portable-text-core/components/ps-portable-text-core-editor-stub.d.ts +2 -0
  87. package/dist/portable-text-core/components/ps-portable-text-core-editor-stub.js +6 -0
  88. package/dist/portable-text-core/components/ps-portable-text-core-editor.d.ts +2 -0
  89. package/dist/portable-text-core/components/ps-portable-text-core-editor.js +68 -0
  90. package/dist/portable-text-core/components/ps-portable-text-core.d.ts +2 -17
  91. package/dist/portable-text-core/components/ps-portable-text-core.js +3 -24
  92. package/dist/portable-text-core/constants/ps-portable-text-core-config.d.ts +36 -19
  93. package/dist/portable-text-core/constants/ps-portable-text-core-config.js +29 -9
  94. package/dist/portable-text-core/contexts/ps-portable-text-core-context.d.ts +2 -0
  95. package/dist/portable-text-core/contexts/ps-portable-text-core-context.js +12 -0
  96. package/dist/portable-text-core/hooks/use-ps-portable-text-link-form.d.ts +3 -1
  97. package/dist/portable-text-core/hooks/use-ps-portable-text-link-form.js +10 -4
  98. package/dist/portable-text-core/hooks/use-ps-portable-text-toolbar.d.ts +5 -10
  99. package/dist/portable-text-core/hooks/use-ps-portable-text-toolbar.js +17 -49
  100. package/dist/portable-text-core/index.d.ts +5 -1
  101. package/dist/portable-text-core/index.js +4 -0
  102. package/dist/portable-text-core/interfaces/ps-portable-text-active-formats.d.ts +10 -0
  103. package/dist/portable-text-core/interfaces/ps-portable-text-active-formats.js +2 -0
  104. package/dist/portable-text-core/interfaces/ps-portable-text-block-draft.d.ts +7 -0
  105. package/dist/portable-text-core/interfaces/ps-portable-text-block-draft.js +2 -0
  106. package/dist/portable-text-core/interfaces/ps-portable-text-core-class-names.d.ts +8 -0
  107. package/dist/portable-text-core/interfaces/ps-portable-text-core-class-names.js +2 -0
  108. package/dist/portable-text-core/interfaces/ps-portable-text-core-context-data.d.ts +9 -0
  109. package/dist/portable-text-core/interfaces/ps-portable-text-core-context-data.js +2 -0
  110. package/dist/portable-text-core/interfaces/ps-portable-text-core-props.d.ts +16 -0
  111. package/dist/portable-text-core/interfaces/ps-portable-text-core-props.js +2 -0
  112. package/dist/portable-text-core/interfaces/ps-portable-text-editor-labels.d.ts +1 -0
  113. package/dist/portable-text-core/interfaces/ps-portable-text-extension-options.d.ts +6 -0
  114. package/dist/portable-text-core/interfaces/ps-portable-text-extension-options.js +2 -0
  115. package/dist/portable-text-core/interfaces/ps-portable-text-span-draft.d.ts +4 -0
  116. package/dist/portable-text-core/interfaces/ps-portable-text-span-draft.js +2 -0
  117. package/dist/portable-text-core/interfaces/ps-portable-text-toolbar-state.d.ts +5 -0
  118. package/dist/portable-text-core/interfaces/ps-portable-text-toolbar-state.js +2 -0
  119. package/dist/portable-text-core/services/ps-portable-text-command-service.d.ts +14 -0
  120. package/dist/portable-text-core/services/ps-portable-text-command-service.js +77 -0
  121. package/dist/portable-text-core/services/ps-portable-text-converter-service.d.ts +18 -0
  122. package/dist/portable-text-core/services/ps-portable-text-converter-service.js +200 -0
  123. package/dist/portable-text-core/services/ps-portable-text-editor-service.d.ts +1 -0
  124. package/dist/portable-text-core/services/ps-portable-text-editor-service.js +4 -0
  125. package/dist/portable-text-core/services/ps-portable-text-extension-service.d.ts +8 -0
  126. package/dist/portable-text-core/services/ps-portable-text-extension-service.js +93 -0
  127. package/dist/portable-text-engine/index.d.ts +1 -0
  128. package/dist/portable-text-engine/index.js +17 -0
  129. package/dist/portable-text-engine/worker.d.ts +1 -0
  130. package/dist/portable-text-engine/worker.js +17 -0
  131. package/dist/services/ps-checkbox-matrix-service.d.ts +9 -0
  132. package/dist/services/ps-checkbox-matrix-service.js +32 -0
  133. package/package.json +30 -6
  134. package/dist/constants/ps-portable-text-editor-renderers.d.ts +0 -6
  135. package/dist/constants/ps-portable-text-editor-renderers.js +0 -32
  136. package/dist/esm/constants/ps-portable-text-editor-renderers.js +0 -29
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsPortableTextConverterService = void 0;
4
+ const ps_models_1 = require("@pallasoft/ps-models");
5
+ const ps_portable_text_core_config_1 = require("../constants/ps-portable-text-core-config");
6
+ const ps_portable_text_editor_service_1 = require("./ps-portable-text-editor-service");
7
+ class PsPortableTextConverterService {
8
+ static toDocument(blocks) {
9
+ const content = [];
10
+ let lists = [];
11
+ let quote = null;
12
+ (Array.isArray(blocks) ? blocks : [])
13
+ .filter((block) => block._type === ps_models_1.Common.PortableTextConfig.blockType)
14
+ .forEach((block) => {
15
+ const paragraph = this.paragraph(block);
16
+ const listNode = this.listNode(block.listItem);
17
+ if (listNode === null) {
18
+ lists = [];
19
+ if (block.style !== ps_portable_text_core_config_1.PsPortableTextCoreConfig.styles.blockquote) {
20
+ quote = null;
21
+ content.push(paragraph);
22
+ return;
23
+ }
24
+ if (quote === null) {
25
+ quote = { type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.blockquote, content: [] };
26
+ content.push(quote);
27
+ }
28
+ this.children(quote).push(paragraph);
29
+ return;
30
+ }
31
+ quote = null;
32
+ const level = Math.min(this.level(block.level), lists.length + 1);
33
+ const open = lists.slice(0, level);
34
+ lists =
35
+ open.length === level && open[level - 1].type !== listNode ? open.slice(0, -1) : open;
36
+ if (lists.length < level) {
37
+ const list = { type: listNode, content: [] };
38
+ const parent = lists[lists.length - 1];
39
+ if (parent === undefined)
40
+ content.push(list);
41
+ else
42
+ this.children(this.children(parent)[this.children(parent).length - 1]).push(list);
43
+ lists = [...lists, list];
44
+ }
45
+ this.children(lists[level - 1]).push({
46
+ type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.listItem,
47
+ content: [paragraph],
48
+ });
49
+ });
50
+ return {
51
+ type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.document,
52
+ content: content.length === 0 ? [{ type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.paragraph }] : content,
53
+ };
54
+ }
55
+ static toBlocks(document) {
56
+ const drafts = this.children(document).flatMap((node) => this.drafts(node, 1));
57
+ const isBlank = drafts.length === 1 &&
58
+ drafts[0].listItem === undefined &&
59
+ drafts[0].style === ps_portable_text_core_config_1.PsPortableTextCoreConfig.styles.normal &&
60
+ this.children(drafts[0].paragraph).length === 0;
61
+ return isBlank
62
+ ? []
63
+ : drafts.map((draft, index) => this.block(draft, `${ps_portable_text_core_config_1.PsPortableTextCoreConfig.keyPrefix.block}${index}`));
64
+ }
65
+ static drafts(node, level) {
66
+ if (node.type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.paragraph) {
67
+ return [{ paragraph: node, style: ps_portable_text_core_config_1.PsPortableTextCoreConfig.styles.normal }];
68
+ }
69
+ if (node.type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.blockquote) {
70
+ return this.children(node)
71
+ .filter((child) => child.type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.paragraph)
72
+ .map((paragraph) => ({ paragraph, style: ps_portable_text_core_config_1.PsPortableTextCoreConfig.styles.blockquote }));
73
+ }
74
+ const listItem = this.listItem(node.type);
75
+ if (listItem === null)
76
+ return [];
77
+ return this.children(node).flatMap((item) => this.children(item).flatMap((child) => child.type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.paragraph
78
+ ? [
79
+ {
80
+ level: Math.min(level, ps_models_1.Common.PortableTextConfig.maxListLevel),
81
+ listItem,
82
+ paragraph: child,
83
+ style: ps_portable_text_core_config_1.PsPortableTextCoreConfig.styles.normal,
84
+ },
85
+ ]
86
+ : this.drafts(child, level + 1)));
87
+ }
88
+ static block(draft, key) {
89
+ const hrefs = Array.from(new Set(this.children(draft.paragraph).flatMap((node) => this.marks(node)
90
+ .filter((mark) => mark.type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.linkMark)
91
+ .map((mark) => this.href(mark))
92
+ .filter((href) => href !== null))));
93
+ const markDefs = hrefs.map((href, index) => ({
94
+ _key: `${key}${ps_portable_text_core_config_1.PsPortableTextCoreConfig.keyPrefix.link}${index}`,
95
+ _type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.linkAnnotation,
96
+ href,
97
+ }));
98
+ const spans = this.spans(draft.paragraph, markDefs);
99
+ const children = (spans.length === 0 ? [{ marks: [], text: '' }] : spans).map((span, index) => ({
100
+ _key: `${key}${ps_portable_text_core_config_1.PsPortableTextCoreConfig.keyPrefix.span}${index}`,
101
+ _type: ps_models_1.Common.PortableTextConfig.spanType,
102
+ marks: span.marks,
103
+ text: span.text,
104
+ }));
105
+ const base = {
106
+ _key: key,
107
+ _type: ps_models_1.Common.PortableTextConfig.blockType,
108
+ children,
109
+ markDefs,
110
+ style: draft.style,
111
+ };
112
+ return draft.listItem === undefined
113
+ ? base
114
+ : { ...base, level: draft.level, listItem: draft.listItem };
115
+ }
116
+ static spans(paragraph, markDefs) {
117
+ return this.children(paragraph).reduce((spans, node) => {
118
+ const previous = spans[spans.length - 1];
119
+ const isBreak = node.type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.hardBreak;
120
+ if (!isBreak && (node.type !== ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.text || !node.text)) {
121
+ return spans;
122
+ }
123
+ const marks = this.spanMarks(node, markDefs);
124
+ const text = isBreak ? ps_portable_text_core_config_1.PsPortableTextCoreConfig.lineBreak : String(node.text);
125
+ return previous !== undefined && this.isSame(previous.marks, marks)
126
+ ? [...spans.slice(0, -1), { marks, text: previous.text + text }]
127
+ : [...spans, { marks, text }];
128
+ }, []);
129
+ }
130
+ static spanMarks(node, markDefs) {
131
+ const types = this.marks(node).map((mark) => mark.type);
132
+ const decorators = ps_models_1.Common.PortableTextConfig.decorators.filter((decorator) => types.includes(ps_portable_text_core_config_1.PsPortableTextCoreConfig.decoratorMarks[decorator]));
133
+ const links = this.marks(node)
134
+ .filter((mark) => mark.type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.linkMark)
135
+ .map((mark) => markDefs.find((definition) => definition.href === this.href(mark)))
136
+ .filter((definition) => definition !== undefined)
137
+ .map((definition) => definition._key);
138
+ return [...decorators, ...links];
139
+ }
140
+ static paragraph(block) {
141
+ const links = new Map((Array.isArray(block.markDefs) ? block.markDefs : [])
142
+ .filter((definition) => definition._type === ps_portable_text_core_config_1.PsPortableTextCoreConfig.linkAnnotation)
143
+ .map((definition) => [
144
+ definition._key,
145
+ typeof definition.href === 'string'
146
+ ? ps_portable_text_editor_service_1.PsPortableTextEditorService.normalizeLink(definition.href)
147
+ : null,
148
+ ]));
149
+ const content = (Array.isArray(block.children) ? block.children : [])
150
+ .filter((child) => child._type === ps_models_1.Common.PortableTextConfig.spanType && typeof child.text === 'string')
151
+ .flatMap((child) => {
152
+ const marks = (Array.isArray(child.marks) ? child.marks : [])
153
+ .filter((mark) => typeof mark === 'string')
154
+ .flatMap((mark) => {
155
+ const decorator = ps_portable_text_editor_service_1.PsPortableTextEditorService.lookup(ps_portable_text_core_config_1.PsPortableTextCoreConfig.decoratorMarks, mark);
156
+ const href = links.get(mark);
157
+ if (decorator !== null)
158
+ return [{ type: decorator }];
159
+ return typeof href === 'string'
160
+ ? [{ type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.linkMark, attrs: { href } }]
161
+ : [];
162
+ });
163
+ return String(child.text)
164
+ .split(ps_portable_text_core_config_1.PsPortableTextCoreConfig.lineBreak)
165
+ .flatMap((text, index) => [
166
+ ...(index === 0 ? [] : [{ type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.hardBreak, marks }]),
167
+ ...(text === '' ? [] : [{ type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.text, text, marks }]),
168
+ ]);
169
+ });
170
+ return content.length === 0
171
+ ? { type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.paragraph }
172
+ : { type: ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.paragraph, content };
173
+ }
174
+ static listNode(listItem) {
175
+ return ps_portable_text_editor_service_1.PsPortableTextEditorService.lookup(ps_portable_text_core_config_1.PsPortableTextCoreConfig.listNodes, listItem);
176
+ }
177
+ static listItem(type) {
178
+ const match = Object.entries(ps_portable_text_core_config_1.PsPortableTextCoreConfig.listNodes).find(([, node]) => node === type);
179
+ return match === undefined ? null : match[0];
180
+ }
181
+ static level(level) {
182
+ return typeof level === 'number' && Number.isInteger(level)
183
+ ? Math.max(1, Math.min(level, ps_models_1.Common.PortableTextConfig.maxListLevel))
184
+ : 1;
185
+ }
186
+ static href(mark) {
187
+ const href = mark.attrs === undefined ? undefined : mark.attrs.href;
188
+ return typeof href === 'string' ? ps_portable_text_editor_service_1.PsPortableTextEditorService.normalizeLink(href) : null;
189
+ }
190
+ static marks(node) {
191
+ return Array.isArray(node.marks) ? node.marks : [];
192
+ }
193
+ static children(node) {
194
+ return Array.isArray(node.content) ? node.content : [];
195
+ }
196
+ static isSame(first, second) {
197
+ return first.length === second.length && first.every((mark, index) => mark === second[index]);
198
+ }
199
+ }
200
+ exports.PsPortableTextConverterService = PsPortableTextConverterService;
@@ -2,4 +2,5 @@ export declare class PsPortableTextEditorService {
2
2
  static normalizeLink(raw: string): string | null;
3
3
  static minHeight(minRows: number): string;
4
4
  static isSame(first: unknown, second: unknown): boolean;
5
+ static lookup(record: Record<string, string>, key: unknown): string | null;
5
6
  }
@@ -30,5 +30,9 @@ class PsPortableTextEditorService {
30
30
  static isSame(first, second) {
31
31
  return JSON.stringify(first) === JSON.stringify(second);
32
32
  }
33
+ static lookup(record, key) {
34
+ const match = Object.entries(record).find(([name]) => name === key);
35
+ return match === undefined ? null : match[1];
36
+ }
33
37
  }
34
38
  exports.PsPortableTextEditorService = PsPortableTextEditorService;
@@ -0,0 +1,8 @@
1
+ import { type AnyExtension, type Editor } from '@tiptap/core';
2
+ import type { PsPortableTextExtensionOptions } from '../interfaces/ps-portable-text-extension-options';
3
+ export declare class PsPortableTextExtensionService {
4
+ static extensions({ classNames, onLinkShortcut, placeholder, }: PsPortableTextExtensionOptions): AnyExtension[];
5
+ static listDepth(editor: Editor): number;
6
+ private static nest;
7
+ private static unnest;
8
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsPortableTextExtensionService = void 0;
4
+ const ps_models_1 = require("@pallasoft/ps-models");
5
+ const core_1 = require("@tiptap/core");
6
+ const extension_blockquote_1 = require("@tiptap/extension-blockquote");
7
+ const extension_bold_1 = require("@tiptap/extension-bold");
8
+ const extension_code_1 = require("@tiptap/extension-code");
9
+ const extension_document_1 = require("@tiptap/extension-document");
10
+ const extension_hard_break_1 = require("@tiptap/extension-hard-break");
11
+ const extension_italic_1 = require("@tiptap/extension-italic");
12
+ const extension_link_1 = require("@tiptap/extension-link");
13
+ const extension_list_1 = require("@tiptap/extension-list");
14
+ const extension_paragraph_1 = require("@tiptap/extension-paragraph");
15
+ const extension_text_1 = require("@tiptap/extension-text");
16
+ const extension_underline_1 = require("@tiptap/extension-underline");
17
+ const extensions_1 = require("@tiptap/extensions");
18
+ const ps_portable_text_core_config_1 = require("../constants/ps-portable-text-core-config");
19
+ const ps_portable_text_editor_service_1 = require("./ps-portable-text-editor-service");
20
+ class PsPortableTextExtensionService {
21
+ static extensions({ classNames, onLinkShortcut, placeholder, }) {
22
+ return [
23
+ extension_document_1.Document,
24
+ extension_paragraph_1.Paragraph,
25
+ extension_text_1.Text,
26
+ extension_hard_break_1.HardBreak,
27
+ extension_bold_1.Bold,
28
+ extension_italic_1.Italic,
29
+ extension_underline_1.Underline,
30
+ extension_code_1.Code.extend({ excludes: extension_code_1.Code.name }).configure({
31
+ HTMLAttributes: { class: classNames.code },
32
+ }),
33
+ extension_blockquote_1.Blockquote.extend({ content: ps_portable_text_core_config_1.PsPortableTextCoreConfig.blockquoteContent }).configure({
34
+ HTMLAttributes: { class: classNames.blockquote },
35
+ }),
36
+ extension_list_1.BulletList.configure({ HTMLAttributes: { class: classNames.bulletList } }),
37
+ extension_list_1.OrderedList.configure({ HTMLAttributes: { class: classNames.orderedList } }),
38
+ extension_list_1.ListItem.extend({
39
+ content: ps_portable_text_core_config_1.PsPortableTextCoreConfig.listItemContent,
40
+ addKeyboardShortcuts() {
41
+ return {
42
+ ...this.parent?.(),
43
+ [ps_portable_text_core_config_1.PsPortableTextCoreConfig.shortcuts.nest]: () => PsPortableTextExtensionService.nest(this.editor),
44
+ [ps_portable_text_core_config_1.PsPortableTextCoreConfig.shortcuts.unnest]: () => PsPortableTextExtensionService.unnest(this.editor),
45
+ };
46
+ },
47
+ }),
48
+ extension_list_1.ListKeymap,
49
+ extension_link_1.Link.configure({
50
+ autolink: true,
51
+ defaultProtocol: ps_portable_text_core_config_1.PsPortableTextCoreConfig.defaultLinkProtocol,
52
+ HTMLAttributes: { class: classNames.link },
53
+ isAllowedUri: (url, context) => context.defaultValidate(url) && ps_portable_text_editor_service_1.PsPortableTextEditorService.normalizeLink(url) !== null,
54
+ linkOnPaste: true,
55
+ openOnClick: false,
56
+ }),
57
+ extensions_1.Placeholder.configure({
58
+ emptyEditorClass: classNames.placeholder,
59
+ placeholder: ({ editor }) => (editor.isEmpty ? placeholder : ''),
60
+ }),
61
+ extensions_1.UndoRedo,
62
+ core_1.Extension.create({
63
+ name: ps_portable_text_core_config_1.PsPortableTextCoreConfig.linkShortcutExtension,
64
+ addKeyboardShortcuts: () => ({
65
+ [ps_portable_text_core_config_1.PsPortableTextCoreConfig.shortcuts.link]: () => {
66
+ onLinkShortcut();
67
+ return true;
68
+ },
69
+ }),
70
+ }),
71
+ ];
72
+ }
73
+ static listDepth(editor) {
74
+ const { $from } = editor.state.selection;
75
+ return Array.from({ length: $from.depth }, (_, index) => $from.node(index + 1)).filter((node) => node.type.name === ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.listItem).length;
76
+ }
77
+ static nest(editor) {
78
+ const depth = PsPortableTextExtensionService.listDepth(editor);
79
+ if (depth === 0)
80
+ return false;
81
+ if (depth < ps_models_1.Common.PortableTextConfig.maxListLevel) {
82
+ editor.commands.sinkListItem(ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.listItem);
83
+ }
84
+ return true;
85
+ }
86
+ static unnest(editor) {
87
+ if (PsPortableTextExtensionService.listDepth(editor) === 0)
88
+ return false;
89
+ editor.commands.liftListItem(ps_portable_text_core_config_1.PsPortableTextCoreConfig.nodes.listItem);
90
+ return true;
91
+ }
92
+ }
93
+ exports.PsPortableTextExtensionService = PsPortableTextExtensionService;
@@ -0,0 +1 @@
1
+ export * from '../portable-text-core/components/ps-portable-text-core-editor';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("../portable-text-core/components/ps-portable-text-core-editor"), exports);
@@ -0,0 +1 @@
1
+ export * from '../portable-text-core/components/ps-portable-text-core-editor-stub';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("../portable-text-core/components/ps-portable-text-core-editor-stub"), exports);
@@ -0,0 +1,9 @@
1
+ import type { PsCheckboxMatrixGroup } from '../interfaces/ps-checkbox-matrix-group';
2
+ export declare class PsCheckboxMatrixService {
3
+ static values(group: PsCheckboxMatrixGroup): string[];
4
+ static enabledValues(group: PsCheckboxMatrixGroup): string[];
5
+ static selectedCount(group: PsCheckboxMatrixGroup, value: string[]): number;
6
+ static toggle(value: string[], item: string, isSelected: boolean): string[];
7
+ static toggleGroup(value: string[], group: PsCheckboxMatrixGroup, isSelected: boolean): string[];
8
+ static isGroupComplete(group: PsCheckboxMatrixGroup, value: string[]): boolean;
9
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PsCheckboxMatrixService = void 0;
4
+ class PsCheckboxMatrixService {
5
+ static values(group) {
6
+ return group.rows.flatMap((row) => row.cells.map((cell) => cell.value));
7
+ }
8
+ static enabledValues(group) {
9
+ return group.rows.flatMap((row) => row.cells.filter((cell) => !cell.isDisabled).map((cell) => cell.value));
10
+ }
11
+ static selectedCount(group, value) {
12
+ return PsCheckboxMatrixService.values(group).filter((item) => value.includes(item)).length;
13
+ }
14
+ static toggle(value, item, isSelected) {
15
+ return isSelected
16
+ ? value.includes(item)
17
+ ? value
18
+ : [...value, item]
19
+ : value.filter((existing) => existing !== item);
20
+ }
21
+ static toggleGroup(value, group, isSelected) {
22
+ const enabled = PsCheckboxMatrixService.enabledValues(group);
23
+ return isSelected
24
+ ? [...value, ...enabled.filter((item) => !value.includes(item))]
25
+ : value.filter((item) => !enabled.includes(item));
26
+ }
27
+ static isGroupComplete(group, value) {
28
+ const enabled = PsCheckboxMatrixService.enabledValues(group);
29
+ return enabled.length > 0 && enabled.every((item) => value.includes(item));
30
+ }
31
+ }
32
+ exports.PsCheckboxMatrixService = PsCheckboxMatrixService;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pallasoft/ps-input-components",
3
- "version": "2.1.0",
3
+ "version": "3.0.0",
4
4
  "private": false,
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -30,6 +30,14 @@
30
30
  "module": "./dist/esm/portable-text-core/index.js",
31
31
  "require": "./dist/portable-text-core/index.js",
32
32
  "default": "./dist/portable-text-core/index.js"
33
+ },
34
+ "./portable-text-engine": {
35
+ "types": "./dist/portable-text-engine/index.d.ts",
36
+ "workerd": "./dist/esm/portable-text-engine/worker.js",
37
+ "worker": "./dist/esm/portable-text-engine/worker.js",
38
+ "module": "./dist/esm/portable-text-engine/index.js",
39
+ "require": "./dist/portable-text-engine/index.js",
40
+ "default": "./dist/portable-text-engine/index.js"
33
41
  }
34
42
  },
35
43
  "files": [
@@ -52,17 +60,29 @@
52
60
  "dependencies": {
53
61
  "@internationalized/date": "^3.12.2",
54
62
  "@pallasoft/ps-core-components": "^2.10.0",
55
- "@pallasoft/ps-design-system": "^1.5.0",
56
63
  "@pallasoft/ps-icons": "^1.5.4",
57
64
  "@pallasoft/ps-models": "^1.4.0",
58
65
  "@pallasoft/ps-popovers": "^1.7.0",
59
66
  "@pallasoft/ps-utilities": "^2.13.0",
60
- "@portabletext/editor": "^3.3.19",
61
- "@portabletext/sanity-bridge": "^1.2.14",
67
+ "@portabletext/schema": "^2.2.4",
68
+ "@tiptap/core": "^3.31.4",
69
+ "@tiptap/extension-blockquote": "^3.31.4",
70
+ "@tiptap/extension-bold": "^3.31.4",
71
+ "@tiptap/extension-code": "^3.31.4",
72
+ "@tiptap/extension-document": "^3.31.4",
73
+ "@tiptap/extension-hard-break": "^3.31.4",
74
+ "@tiptap/extension-italic": "^3.31.4",
75
+ "@tiptap/extension-link": "^3.31.4",
76
+ "@tiptap/extension-list": "^3.31.4",
77
+ "@tiptap/extension-paragraph": "^3.31.4",
78
+ "@tiptap/extension-text": "^3.31.4",
79
+ "@tiptap/extension-underline": "^3.31.4",
80
+ "@tiptap/extensions": "^3.31.4",
81
+ "@tiptap/pm": "^3.31.4",
82
+ "@tiptap/react": "^3.31.4",
62
83
  "libphonenumber-js": "^1.13.13",
63
84
  "react-aria-components": "^1.19.0",
64
- "react-datepicker": "^9.1.0",
65
- "rxjs": "^7.8.2"
85
+ "react-datepicker": "^9.1.0"
66
86
  },
67
87
  "peerDependencies": {
68
88
  "react": "^18 || ^19",
@@ -74,6 +94,7 @@
74
94
  "@commitlint/config-conventional": "^20.0.0",
75
95
  "@eslint/compat": "^2.0.0",
76
96
  "@ianvs/prettier-plugin-sort-imports": "^4.7.0",
97
+ "@pallasoft/ps-design-system": "^1.14.0",
77
98
  "@semantic-release/changelog": "^6.0.3",
78
99
  "@semantic-release/commit-analyzer": "^13.0.0",
79
100
  "@semantic-release/git": "^10.0.1",
@@ -120,6 +141,9 @@
120
141
  ],
121
142
  "portable-text-core": [
122
143
  "./dist/portable-text-core/index.d.ts"
144
+ ],
145
+ "portable-text-engine": [
146
+ "./dist/portable-text-engine/index.d.ts"
123
147
  ]
124
148
  }
125
149
  },
@@ -1,6 +0,0 @@
1
- import type { BlockAnnotationRenderProps, BlockDecoratorRenderProps, BlockRenderProps } from '@portabletext/editor';
2
- export declare const PsPortableTextEditorRenderers: {
3
- renderBlock: ({ children, listItem, style }: BlockRenderProps) => import("react").JSX.Element;
4
- renderDecorator: ({ children, value }: BlockDecoratorRenderProps) => import("react").JSX.Element;
5
- renderAnnotation: ({ children }: BlockAnnotationRenderProps) => import("react").JSX.Element;
6
- };
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PsPortableTextEditorRenderers = void 0;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const ps_portable_text_core_config_1 = require("../portable-text-core/constants/ps-portable-text-core-config");
6
- exports.PsPortableTextEditorRenderers = {
7
- renderBlock: ({ children, listItem, style }) => {
8
- if (listItem === ps_portable_text_core_config_1.PsPortableTextCoreConfig.listItems.bullet) {
9
- return ((0, jsx_runtime_1.jsx)("div", { className: "relative pl-6 before:absolute before:left-1 before:content-['\u2022']", children: children }));
10
- }
11
- if (listItem === ps_portable_text_core_config_1.PsPortableTextCoreConfig.listItems.number) {
12
- return ((0, jsx_runtime_1.jsx)("div", { className: "relative pl-6 before:absolute before:left-0 before:content-[counter(ps-list)'.']", style: { counterIncrement: 'ps-list' }, children: children }));
13
- }
14
- if (style === ps_portable_text_core_config_1.PsPortableTextCoreConfig.styles.blockquote) {
15
- return ((0, jsx_runtime_1.jsx)("div", { className: 'border-l-2 border-primary pl-3 text-ink/80', style: { counterReset: 'ps-list' }, children: children }));
16
- }
17
- return (0, jsx_runtime_1.jsx)("div", { style: { counterReset: 'ps-list' }, children: children });
18
- },
19
- renderDecorator: ({ children, value }) => {
20
- if (value === ps_portable_text_core_config_1.PsPortableTextCoreConfig.decorators.bold)
21
- return (0, jsx_runtime_1.jsx)("strong", { children: children });
22
- if (value === ps_portable_text_core_config_1.PsPortableTextCoreConfig.decorators.italic)
23
- return (0, jsx_runtime_1.jsx)("em", { children: children });
24
- if (value === ps_portable_text_core_config_1.PsPortableTextCoreConfig.decorators.underline)
25
- return (0, jsx_runtime_1.jsx)("u", { children: children });
26
- if (value === ps_portable_text_core_config_1.PsPortableTextCoreConfig.decorators.code) {
27
- return (0, jsx_runtime_1.jsx)("code", { className: 'rounded bg-ink/10 px-1 font-mono text-[0.9em]', children: children });
28
- }
29
- return children;
30
- },
31
- renderAnnotation: ({ children }) => ((0, jsx_runtime_1.jsx)("span", { className: 'text-primary underline', children: children })),
32
- };
@@ -1,29 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { PsPortableTextCoreConfig } from '../portable-text-core/constants/ps-portable-text-core-config';
3
- export const PsPortableTextEditorRenderers = {
4
- renderBlock: ({ children, listItem, style }) => {
5
- if (listItem === PsPortableTextCoreConfig.listItems.bullet) {
6
- return (_jsx("div", { className: "relative pl-6 before:absolute before:left-1 before:content-['\u2022']", children: children }));
7
- }
8
- if (listItem === PsPortableTextCoreConfig.listItems.number) {
9
- return (_jsx("div", { className: "relative pl-6 before:absolute before:left-0 before:content-[counter(ps-list)'.']", style: { counterIncrement: 'ps-list' }, children: children }));
10
- }
11
- if (style === PsPortableTextCoreConfig.styles.blockquote) {
12
- return (_jsx("div", { className: 'border-l-2 border-primary pl-3 text-ink/80', style: { counterReset: 'ps-list' }, children: children }));
13
- }
14
- return _jsx("div", { style: { counterReset: 'ps-list' }, children: children });
15
- },
16
- renderDecorator: ({ children, value }) => {
17
- if (value === PsPortableTextCoreConfig.decorators.bold)
18
- return _jsx("strong", { children: children });
19
- if (value === PsPortableTextCoreConfig.decorators.italic)
20
- return _jsx("em", { children: children });
21
- if (value === PsPortableTextCoreConfig.decorators.underline)
22
- return _jsx("u", { children: children });
23
- if (value === PsPortableTextCoreConfig.decorators.code) {
24
- return _jsx("code", { className: 'rounded bg-ink/10 px-1 font-mono text-[0.9em]', children: children });
25
- }
26
- return children;
27
- },
28
- renderAnnotation: ({ children }) => (_jsx("span", { className: 'text-primary underline', children: children })),
29
- };