@sovann72-dev/lynqify-ui 1.0.0 → 1.0.1

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 (48) hide show
  1. package/dist/components/NoteEditor/BatchImageGalleryNodeView.d.ts +19 -0
  2. package/dist/components/RichTextEditor/Extension/Indent/backspace.indent.handlers.d.ts +18 -0
  3. package/dist/components/RichTextEditor/Extension/Indent/indent.extension.d.ts +26 -0
  4. package/dist/components/RichTextEditor/Extension/Indent/indent.handlers.d.ts +16 -0
  5. package/{src/components/RichTextEditor/Extension/Indent/indent.types.ts → dist/components/RichTextEditor/Extension/Indent/indent.types.d.ts} +10 -35
  6. package/dist/components/RichTextEditor/Extension/Indent/indent.utils.d.ts +8 -0
  7. package/dist/components/RichTextEditor/Extension/Indent/outdent.handlers.d.ts +6 -0
  8. package/dist/components/RichTextEditor/Extension/Indent/shifttab.indent.handlers.d.ts +18 -0
  9. package/dist/components/RichTextEditor/Extension/Indent/tab.indent.handlers.d.ts +21 -0
  10. package/dist/components/RichTextEditor/Extension/List/custom-list-item.extension.d.ts +17 -0
  11. package/dist/components/RichTextEditor/Extension/List/dynamic-bullet-styling.extension.d.ts +2 -0
  12. package/dist/components/RichTextEditor/Extension/batch-segment-images.extension.d.ts +19 -0
  13. package/dist/components/RichTextEditor/Extension/batch-segment-images.types.d.ts +33 -0
  14. package/dist/components/RichTextEditor/Extension/custom-image.extension.d.ts +4 -0
  15. package/dist/components/RichTextEditor/Extension/custom-link.extension.d.ts +3 -0
  16. package/dist/components/RichTextEditor/Extension/custom-mention.extension.d.ts +3 -0
  17. package/dist/components/RichTextEditor/Extension/custom-paragraph.extension.d.ts +6 -0
  18. package/dist/components/RichTextEditor/Extension/extensions.d.ts +4 -0
  19. package/dist/components/RichTextEditor/Extension/file-filtering.extension.d.ts +1 -0
  20. package/dist/components/RichTextEditor/Extension/list-indent-integration.extension.d.ts +2 -0
  21. package/dist/components/RichTextEditor/Extension/mentionstorage.extension.d.ts +9 -0
  22. package/dist/components/RichTextEditor/Extension/tiptap-extension-fontsize.d.ts +21 -0
  23. package/dist/components/RichTextEditor/Extension/tiptap-extension-lineheight.d.ts +21 -0
  24. package/{src/index.ts → dist/index.d.ts} +5 -17
  25. package/dist/lynqify-ui.js +3264 -0
  26. package/dist/lynqify-ui.umd.cjs +30 -0
  27. package/package.json +60 -31
  28. package/src/components/RichTextEditor/Extension/Indent/backspace.indent.handlers.ts +0 -77
  29. package/src/components/RichTextEditor/Extension/Indent/indent.extension.ts +0 -285
  30. package/src/components/RichTextEditor/Extension/Indent/indent.handlers.ts +0 -121
  31. package/src/components/RichTextEditor/Extension/Indent/indent.utils.ts +0 -8
  32. package/src/components/RichTextEditor/Extension/Indent/outdent.handlers.ts +0 -71
  33. package/src/components/RichTextEditor/Extension/Indent/shifttab.indent.handlers.ts +0 -133
  34. package/src/components/RichTextEditor/Extension/Indent/tab.indent.handlers.ts +0 -103
  35. package/src/components/RichTextEditor/Extension/List/custom-list-item.extension.ts +0 -107
  36. package/src/components/RichTextEditor/Extension/List/dynamic-bullet-styling.extension.ts +0 -40
  37. package/src/components/RichTextEditor/Extension/batch-segment-images.extension.ts +0 -486
  38. package/src/components/RichTextEditor/Extension/batch-segment-images.types.ts +0 -35
  39. package/src/components/RichTextEditor/Extension/custom-image.extension.ts +0 -18
  40. package/src/components/RichTextEditor/Extension/custom-link.extension.ts +0 -58
  41. package/src/components/RichTextEditor/Extension/custom-mention.extension.ts +0 -29
  42. package/src/components/RichTextEditor/Extension/custom-paragraph.extension.ts +0 -46
  43. package/src/components/RichTextEditor/Extension/extensions.ts +0 -118
  44. package/src/components/RichTextEditor/Extension/file-filtering.extension.ts +0 -0
  45. package/src/components/RichTextEditor/Extension/list-indent-integration.extension.ts +0 -125
  46. package/src/components/RichTextEditor/Extension/mentionstorage.extension.ts +0 -10
  47. package/src/components/RichTextEditor/Extension/tiptap-extension-fontsize.ts +0 -73
  48. package/src/components/RichTextEditor/Extension/tiptap-extension-lineheight.ts +0 -73
@@ -1,118 +0,0 @@
1
- import Bold from '@tiptap/extension-bold';
2
- import Color from '@tiptap/extension-color';
3
- import Document from '@tiptap/extension-document';
4
- import FileHandler from '@tiptap/extension-file-handler';
5
- import HardBreak from '@tiptap/extension-hard-break';
6
- import Heading from '@tiptap/extension-heading';
7
- import Highlight from '@tiptap/extension-highlight';
8
- import Image from '@tiptap/extension-image';
9
- import Italic from '@tiptap/extension-italic';
10
- import Link from '@tiptap/extension-link';
11
- import {
12
- BulletList,
13
- OrderedList,
14
- ListItem,
15
- ListKeymap,
16
- TaskList,
17
- TaskItem,
18
- } from '@tiptap/extension-list';
19
- import Mention from '@tiptap/extension-mention';
20
- import Paragraph from '@tiptap/extension-paragraph';
21
- import { Table, TableCell, TableHeader, TableRow } from '@tiptap/extension-table';
22
- import Text from '@tiptap/extension-text';
23
- import TextAlign from '@tiptap/extension-text-align';
24
- import { TextStyle } from '@tiptap/extension-text-style';
25
- import Underline from '@tiptap/extension-underline';
26
- import { CharacterCount, Placeholder, UndoRedo as History } from '@tiptap/extensions';
27
- import { CustomParagraph } from '@/components/RichTextEditor/Extension/custom-paragraph.extension';
28
- import { IndentExtension } from '@/components/RichTextEditor/Extension/Indent/indent.extension';
29
- import {
30
- CustomListItem,
31
- CustomBulletList,
32
- CustomOrderedList,
33
- } from '@/components/RichTextEditor/Extension/List/custom-list-item.extension';
34
- import { DynamicBulletStyling } from '@/components/RichTextEditor/Extension/List/dynamic-bullet-styling.extension';
35
- import { ListIndentIntegration } from '@/components/RichTextEditor/Extension/list-indent-integration.extension';
36
- import { FontSize } from '@/components/RichTextEditor/Extension/tiptap-extension-fontsize';
37
- import { LineHeight } from '@/components/RichTextEditor/Extension/tiptap-extension-lineheight';
38
-
39
- export const ALL_EXTENSIONS = [
40
- Bold,
41
- CharacterCount,
42
- Color,
43
- Document,
44
- FileHandler,
45
- Heading,
46
- Highlight,
47
- Image,
48
- Link,
49
- ListItem,
50
- ListKeymap,
51
- Mention,
52
- OrderedList,
53
- Placeholder,
54
- Table,
55
- TableCell,
56
- TableHeader,
57
- TableRow,
58
- TaskItem,
59
- TaskList,
60
- TextAlign,
61
- TextStyle,
62
- Underline,
63
-
64
- // Missing from BASE_EXTENSIONS
65
- Paragraph,
66
- Text,
67
- Italic,
68
- // Gapcursor,
69
- HardBreak,
70
- History,
71
- CustomListItem,
72
- FontSize,
73
- LineHeight,
74
- BulletList,
75
- DynamicBulletStyling,
76
- ];
77
-
78
- export const BASE_EXTENSIONS = [
79
- CustomParagraph, // CONVENTION - Replaces Paragraph with selectable indent spacing (T006-T007)
80
- TextStyle,
81
- Color,
82
- History.configure({
83
- // T012, T091: Pause-based undo/redo granularity (FR-032, FR-033)
84
- // Verified: Rapid Tab presses within 500ms are grouped as single undo unit
85
- // This matches Google Docs behavior (spec requirement)
86
- newGroupDelay: 500, // Group operations within 500ms window
87
- depth: 100, // Max undo stack depth
88
- }),
89
- // COMMENTED OUT TEMPORARILY THE GAPCURSOR FIRST BECAUSE WE DON'T NEED VISUAL EFFECT FROM GAPCUROSR AND WE DO CUSTOM IMAGES CURSOR ANYWAY. UNCOMMENT IT IF NEEDED LATER.
90
- // Gapcursor,
91
- HardBreak,
92
- Underline,
93
- Bold,
94
- Italic,
95
- TaskItem,
96
- CustomListItem, // T011: ListItem with indent attribute
97
- Document,
98
- Text,
99
- FontSize,
100
- LineHeight,
101
- CustomBulletList, // T009: BulletList with indent attribute
102
- // No custom keymap, just dynamic styling
103
- DynamicBulletStyling,
104
- ListIndentIntegration, // T029: Indent attribute transfer (FR-020, FR-021, FR-023)
105
-
106
- TextAlign.configure({
107
- types: ['heading', 'paragraph'],
108
- }),
109
- CustomOrderedList.configure({
110
- // T010: OrderedList with indent attribute
111
- itemTypeName: 'listItem',
112
- keepMarks: true,
113
- keepAttributes: true,
114
- }),
115
-
116
- // Must be last to have highest keyboard shortcut priority
117
- IndentExtension,
118
- ];
@@ -1,125 +0,0 @@
1
- /**
2
- * List-Indent Integration Extension
3
- *
4
- * Handles indent attribute transfer between paragraphs and lists.
5
- * Includes paste handling for external content (Google Docs, Word).
6
- *
7
- * **Core Behavior (FR-020, FR-021, FR-023):**
8
- * - When paragraph with indent becomes list → indent transfers to listItem
9
- * - Paragraph inside list loses indent attribute
10
- * - List maintains paragraph's indent level
11
- *
12
- * **Paste Handling (FR-026, FR-027, FR-028):**
13
- * - T088: Detects Google Docs nested lists, preserves 1:1 nesting
14
- * - T089: Parses Word paragraph indents (padding/margin) into indent levels
15
- * - T090: Normalizes external glyph styles (I, II, III → 1, 2, 3)
16
- *
17
- * **Implementation via ProseMirror appendTransaction plugin**
18
- * - Monitors document changes
19
- * - Detects indented paragraphs inside lists
20
- * - Transfers indent from paragraph to parent list
21
- * - Clears paragraph indent attribute
22
- *
23
- * @see specs/001-richtext-indent-lists/research.md (Decision 1, Decision 4)
24
- * @see specs/001-richtext-indent-lists/data-model.md (State Transition Rules)
25
- */
26
-
27
- import { Extension } from '@tiptap/core';
28
- import { Plugin, Transaction } from '@tiptap/pm/state';
29
-
30
- const isListParent = (name: string) => name === 'bulletList' || name === 'orderedList';
31
- const isTextNode = (name: string) => name === 'paragraph' || name === 'heading';
32
-
33
- export const ListIndentIntegration = Extension.create({
34
- name: 'listIndentIntegration',
35
-
36
- addProseMirrorPlugins() {
37
- return [
38
- // Indent attribute transfer plugin
39
- new Plugin({
40
- appendTransaction: (transactions, oldState, newState) => {
41
- // Only process if document changed
42
- if (!transactions.find((t) => t.docChanged)) {
43
- return null;
44
- }
45
-
46
- let tr: Transaction | null = null;
47
-
48
- // Scan document for indented paragraphs inside list items
49
- newState.doc.descendants((node, pos) => {
50
- // Find indented text nodes (paragraph/heading)
51
- if (isTextNode(node.type.name) && (node?.attrs?.indent ?? 0) > 0) {
52
- const resolvedPos = newState.doc.resolve(pos);
53
- const parent = resolvedPos.parent;
54
-
55
- // If paragraph is inside a list item, transfer indent
56
- if (parent.type.name === 'listItem') {
57
- // Find the bulletList/orderedList ancestor
58
- let listPos = null;
59
- for (let d = resolvedPos.depth - 1; d > 0; d--) {
60
- const ancestorNode = resolvedPos.node(d);
61
- if (isListParent(ancestorNode.type.name)) {
62
- // Get position of list node
63
- listPos = resolvedPos.start(d) - 1;
64
- break;
65
- }
66
- }
67
-
68
- if (listPos !== null && listPos >= 0) {
69
- // Create transaction if needed
70
- if (!tr) {
71
- tr = newState.tr;
72
- }
73
-
74
- const existingIndent = node.attrs.indent;
75
-
76
- // FR-021: Remove indent from paragraph inside list
77
- tr.setNodeAttribute(pos, 'indent', 0);
78
-
79
- // FR-020: Transfer indent to parent list
80
- tr.setNodeAttribute(listPos, 'indent', existingIndent);
81
- }
82
- }
83
- }
84
- });
85
-
86
- return tr;
87
- },
88
- }),
89
-
90
- // T088, T089, T090: Paste transformation plugin
91
- new Plugin({
92
- props: {
93
- transformPastedHTML(html) {
94
- // T089: FR-027 - Parse Word paragraph indents (padding/margin)
95
- // Convert padding-left or margin-left to indent attributes
96
- const wordIndentRegex =
97
- /<p[^>]*style="[^"]*(?:padding|margin)-left:\s*(\d+)(?:px|pt|em)[^"]*"[^>]*>/gi;
98
- html = html.replace(wordIndentRegex, (match, pixels) => {
99
- const indentLevel = Math.floor(parseInt(pixels, 10) / 40); // 40px ≈ 1 indent level
100
- return `<p data-indent="${indentLevel}">`;
101
- });
102
-
103
- // T090: FR-028 - Normalize glyph styles (Roman numerals → Arabic)
104
- // Convert list-style-type attributes to default (1, 2, 3)
105
- const romanStyleRegex =
106
- /<ol[^>]*style="[^"]*list-style-type:\s*(upper-roman|lower-roman|upper-alpha|lower-alpha)[^"]*"[^>]*>/gi;
107
- html = html.replace(romanStyleRegex, () => {
108
- // Remove the style attribute, defaulting to standard 1, 2, 3
109
- return '<ol>';
110
- });
111
-
112
- // Normalize list-style-type in li elements as well
113
- const liStyleRegex = /<li[^>]*style="[^"]*list-style-type:\s*[^;"\s]+[^"]*"[^>]*>/gi;
114
- html = html.replace(liStyleRegex, (match) => {
115
- // Strip list-style-type from li elements
116
- return match.replace(/list-style-type:\s*[^;"\s]+;?/gi, '');
117
- });
118
-
119
- return html;
120
- },
121
- },
122
- }),
123
- ];
124
- },
125
- });
@@ -1,10 +0,0 @@
1
- import { Extension } from '@tiptap/core';
2
-
3
- export const MentionStorage = Extension.create({
4
- name: 'MentionStorage',
5
- addStorage() {
6
- return {
7
- suggestions: [],
8
- };
9
- },
10
- });
@@ -1,73 +0,0 @@
1
- import { Extension } from '@tiptap/core';
2
- import '@tiptap/extension-text-style';
3
-
4
- type FontSizeOptions = {
5
- types: string[];
6
- getStyle: (fontSize: string) => string;
7
- };
8
-
9
- declare module '@tiptap/core' {
10
- interface Commands<ReturnType> {
11
- fontSize: {
12
- /**
13
- * Set the font size attribute
14
- */
15
- setFontSize: (size: string) => ReturnType;
16
- /**
17
- * Unset the font size attribute
18
- */
19
- unsetFontSize: () => ReturnType;
20
- };
21
- }
22
- }
23
-
24
- export const FontSize = Extension.create<FontSizeOptions>({
25
- name: 'fontSize',
26
-
27
- addOptions(): FontSizeOptions {
28
- return {
29
- types: ['textStyle'],
30
- getStyle: (fontSize: string) => {
31
- return `font-size: ${fontSize}`;
32
- },
33
- };
34
- },
35
-
36
- addGlobalAttributes() {
37
- return [
38
- {
39
- types: this.options.types,
40
- attributes: {
41
- fontSize: {
42
- default: null,
43
- parseHTML: (element) => element.style.fontSize.replace(/['"]+/g, ''),
44
- renderHTML: (attributes) => {
45
- if (!attributes.fontSize) {
46
- return {};
47
- }
48
-
49
- return {
50
- style: this.options.getStyle(attributes.fontSize),
51
- };
52
- },
53
- },
54
- },
55
- },
56
- ];
57
- },
58
-
59
- addCommands() {
60
- return {
61
- setFontSize:
62
- (fontSize) =>
63
- ({ chain }) => {
64
- return chain().setMark('textStyle', { fontSize }).run();
65
- },
66
- unsetFontSize:
67
- () =>
68
- ({ chain }) => {
69
- return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();
70
- },
71
- };
72
- },
73
- });
@@ -1,73 +0,0 @@
1
- import { Extension } from '@tiptap/core';
2
- import '@tiptap/extension-text-style';
3
-
4
- type LineHeightOptions = {
5
- types: string[];
6
- getStyle: (lineHeight: string) => string;
7
- };
8
-
9
- declare module '@tiptap/core' {
10
- interface Commands<ReturnType> {
11
- lineHeight: {
12
- /**
13
- * Set the line height attribute
14
- */
15
- setLineHeight: (lineHeight: string) => ReturnType;
16
- /**
17
- * Unset the line height attribute
18
- */
19
- unsetLineHeight: () => ReturnType;
20
- };
21
- }
22
- }
23
-
24
- export const LineHeight = Extension.create<LineHeightOptions>({
25
- name: 'lineHeight',
26
-
27
- addOptions(): LineHeightOptions {
28
- return {
29
- types: ['textStyle'],
30
- getStyle: (lineHeight: string) => {
31
- return `line-height: ${lineHeight};`;
32
- },
33
- };
34
- },
35
-
36
- addGlobalAttributes() {
37
- return [
38
- {
39
- types: this.options.types,
40
- attributes: {
41
- lineHeight: {
42
- default: null,
43
- parseHTML: (element) => element.style.lineHeight.replace(/['"]+/g, ''),
44
- renderHTML: (attributes) => {
45
- if (!attributes.lineHeight) {
46
- return {};
47
- }
48
-
49
- return {
50
- style: this.options.getStyle(attributes.lineHeight),
51
- };
52
- },
53
- },
54
- },
55
- },
56
- ];
57
- },
58
-
59
- addCommands() {
60
- return {
61
- setLineHeight:
62
- (lineHeight) =>
63
- ({ chain }) => {
64
- return chain().setMark('textStyle', { lineHeight }).run();
65
- },
66
- unsetLineHeight:
67
- () =>
68
- ({ chain }) => {
69
- return chain().setMark('textStyle', { lineHeight: null }).removeEmptyTextStyle().run();
70
- },
71
- };
72
- },
73
- });