@furystack/shades-common-components 12.2.0 → 12.4.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 (100) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/esm/components/form.d.ts +5 -2
  3. package/esm/components/form.d.ts.map +1 -1
  4. package/esm/components/form.js +28 -6
  5. package/esm/components/form.js.map +1 -1
  6. package/esm/components/form.spec.js +207 -0
  7. package/esm/components/form.spec.js.map +1 -1
  8. package/esm/components/index.d.ts +1 -0
  9. package/esm/components/index.d.ts.map +1 -1
  10. package/esm/components/index.js +1 -0
  11. package/esm/components/index.js.map +1 -1
  12. package/esm/components/markdown/index.d.ts +5 -0
  13. package/esm/components/markdown/index.d.ts.map +1 -0
  14. package/esm/components/markdown/index.js +5 -0
  15. package/esm/components/markdown/index.js.map +1 -0
  16. package/esm/components/markdown/markdown-display.d.ts +19 -0
  17. package/esm/components/markdown/markdown-display.d.ts.map +1 -0
  18. package/esm/components/markdown/markdown-display.js +149 -0
  19. package/esm/components/markdown/markdown-display.js.map +1 -0
  20. package/esm/components/markdown/markdown-display.spec.d.ts +2 -0
  21. package/esm/components/markdown/markdown-display.spec.d.ts.map +1 -0
  22. package/esm/components/markdown/markdown-display.spec.js +191 -0
  23. package/esm/components/markdown/markdown-display.spec.js.map +1 -0
  24. package/esm/components/markdown/markdown-editor.d.ts +25 -0
  25. package/esm/components/markdown/markdown-editor.d.ts.map +1 -0
  26. package/esm/components/markdown/markdown-editor.js +113 -0
  27. package/esm/components/markdown/markdown-editor.js.map +1 -0
  28. package/esm/components/markdown/markdown-editor.spec.d.ts +2 -0
  29. package/esm/components/markdown/markdown-editor.spec.d.ts.map +1 -0
  30. package/esm/components/markdown/markdown-editor.spec.js +111 -0
  31. package/esm/components/markdown/markdown-editor.spec.js.map +1 -0
  32. package/esm/components/markdown/markdown-input.d.ts +29 -0
  33. package/esm/components/markdown/markdown-input.d.ts.map +1 -0
  34. package/esm/components/markdown/markdown-input.js +100 -0
  35. package/esm/components/markdown/markdown-input.js.map +1 -0
  36. package/esm/components/markdown/markdown-input.spec.d.ts +2 -0
  37. package/esm/components/markdown/markdown-input.spec.d.ts.map +1 -0
  38. package/esm/components/markdown/markdown-input.spec.js +215 -0
  39. package/esm/components/markdown/markdown-input.spec.js.map +1 -0
  40. package/esm/components/markdown/markdown-parser.d.ts +82 -0
  41. package/esm/components/markdown/markdown-parser.d.ts.map +1 -0
  42. package/esm/components/markdown/markdown-parser.js +274 -0
  43. package/esm/components/markdown/markdown-parser.js.map +1 -0
  44. package/esm/components/markdown/markdown-parser.spec.d.ts +2 -0
  45. package/esm/components/markdown/markdown-parser.spec.d.ts.map +1 -0
  46. package/esm/components/markdown/markdown-parser.spec.js +229 -0
  47. package/esm/components/markdown/markdown-parser.spec.js.map +1 -0
  48. package/esm/components/styles.d.ts +1 -0
  49. package/esm/components/styles.d.ts.map +1 -1
  50. package/esm/components/styles.js.map +1 -1
  51. package/esm/components/typography.d.ts.map +1 -1
  52. package/esm/components/typography.js +26 -14
  53. package/esm/components/typography.js.map +1 -1
  54. package/esm/services/css-variable-theme.d.ts +3 -0
  55. package/esm/services/css-variable-theme.d.ts.map +1 -1
  56. package/esm/services/css-variable-theme.js +3 -0
  57. package/esm/services/css-variable-theme.js.map +1 -1
  58. package/esm/services/css-variable-theme.spec.js +3 -0
  59. package/esm/services/css-variable-theme.spec.js.map +1 -1
  60. package/esm/services/default-dark-palette.d.ts +8 -0
  61. package/esm/services/default-dark-palette.d.ts.map +1 -0
  62. package/esm/services/default-dark-palette.js +56 -0
  63. package/esm/services/default-dark-palette.js.map +1 -0
  64. package/esm/services/default-dark-theme.d.ts +3 -0
  65. package/esm/services/default-dark-theme.d.ts.map +1 -1
  66. package/esm/services/default-dark-theme.js +7 -4
  67. package/esm/services/default-dark-theme.js.map +1 -1
  68. package/esm/services/default-light-theme.d.ts +3 -0
  69. package/esm/services/default-light-theme.d.ts.map +1 -1
  70. package/esm/services/default-light-theme.js +3 -0
  71. package/esm/services/default-light-theme.js.map +1 -1
  72. package/esm/services/index.d.ts +1 -0
  73. package/esm/services/index.d.ts.map +1 -1
  74. package/esm/services/index.js +1 -0
  75. package/esm/services/index.js.map +1 -1
  76. package/esm/services/theme-provider-service.d.ts +10 -1
  77. package/esm/services/theme-provider-service.d.ts.map +1 -1
  78. package/esm/services/theme-provider-service.js.map +1 -1
  79. package/package.json +2 -2
  80. package/src/components/form.spec.tsx +309 -0
  81. package/src/components/form.tsx +31 -8
  82. package/src/components/index.ts +1 -0
  83. package/src/components/markdown/index.ts +4 -0
  84. package/src/components/markdown/markdown-display.spec.tsx +243 -0
  85. package/src/components/markdown/markdown-display.tsx +202 -0
  86. package/src/components/markdown/markdown-editor.spec.tsx +142 -0
  87. package/src/components/markdown/markdown-editor.tsx +167 -0
  88. package/src/components/markdown/markdown-input.spec.tsx +274 -0
  89. package/src/components/markdown/markdown-input.tsx +143 -0
  90. package/src/components/markdown/markdown-parser.spec.ts +258 -0
  91. package/src/components/markdown/markdown-parser.ts +333 -0
  92. package/src/components/styles.tsx +1 -0
  93. package/src/components/typography.tsx +28 -15
  94. package/src/services/css-variable-theme.spec.ts +3 -0
  95. package/src/services/css-variable-theme.ts +3 -0
  96. package/src/services/default-dark-palette.ts +57 -0
  97. package/src/services/default-dark-theme.ts +7 -4
  98. package/src/services/default-light-theme.ts +3 -0
  99. package/src/services/index.ts +1 -0
  100. package/src/services/theme-provider-service.ts +7 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-editor.spec.js","sourceRoot":"","sources":["../../../src/components/markdown/markdown-editor.spec.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type MarkdownInputProps = {
2
+ /** The current Markdown string */
3
+ value: string;
4
+ /** Called when the value changes */
5
+ onValueChange?: (newValue: string) => void;
6
+ /** Maximum image file size in bytes for base64 paste. Defaults to 256KB. */
7
+ maxImageSizeBytes?: number;
8
+ /** Whether the textarea is read-only */
9
+ readOnly?: boolean;
10
+ /** Whether the textarea is disabled */
11
+ disabled?: boolean;
12
+ /** Placeholder text */
13
+ placeholder?: string;
14
+ /** Label shown above the textarea */
15
+ labelTitle?: string;
16
+ /** Number of visible text rows */
17
+ rows?: number;
18
+ };
19
+ /**
20
+ * Markdown text input with base64 image paste support.
21
+ * When the user pastes an image below the configured size limit,
22
+ * it is inlined as a `![pasted image](data:...)` Markdown image.
23
+ */
24
+ export declare const MarkdownInput: (props: MarkdownInputProps & Omit<Partial<HTMLElement>, "style"> & {
25
+ style?: Partial<CSSStyleDeclaration>;
26
+ } & {
27
+ ref?: import("@furystack/shades").RefObject<Element>;
28
+ }, children?: import("@furystack/shades").ChildrenList) => JSX.Element;
29
+ //# sourceMappingURL=markdown-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-input.d.ts","sourceRoot":"","sources":["../../../src/components/markdown/markdown-input.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;sEAiHxB,CAAA"}
@@ -0,0 +1,100 @@
1
+ import { Shade, createComponent } from '@furystack/shades';
2
+ import { cssVariableTheme } from '../../services/css-variable-theme.js';
3
+ const DEFAULT_MAX_IMAGE_SIZE = 256 * 1024;
4
+ /**
5
+ * Markdown text input with base64 image paste support.
6
+ * When the user pastes an image below the configured size limit,
7
+ * it is inlined as a `![pasted image](data:...)` Markdown image.
8
+ */
9
+ export const MarkdownInput = Shade({
10
+ shadowDomName: 'shade-markdown-input',
11
+ css: {
12
+ display: 'block',
13
+ marginBottom: '1em',
14
+ '& label': {
15
+ display: 'flex',
16
+ flexDirection: 'column',
17
+ alignItems: 'flex-start',
18
+ fontSize: cssVariableTheme.typography.fontSize.xs,
19
+ color: cssVariableTheme.text.secondary,
20
+ padding: '1em',
21
+ borderRadius: cssVariableTheme.shape.borderRadius.md,
22
+ border: `1px solid ${cssVariableTheme.action.subtleBorder}`,
23
+ transition: `color ${cssVariableTheme.transitions.duration.slow} ${cssVariableTheme.transitions.easing.default}`,
24
+ },
25
+ '&[data-disabled] label': {
26
+ color: cssVariableTheme.text.disabled,
27
+ },
28
+ '&:focus-within label': {
29
+ color: cssVariableTheme.palette.primary.main,
30
+ },
31
+ '& textarea': {
32
+ border: 'none',
33
+ backgroundColor: 'transparent',
34
+ outline: 'none',
35
+ fontSize: cssVariableTheme.typography.fontSize.sm,
36
+ fontFamily: 'monospace',
37
+ width: '100%',
38
+ resize: 'vertical',
39
+ color: cssVariableTheme.text.primary,
40
+ boxShadow: '0px 0px 0px rgba(128,128,128,0.1)',
41
+ transition: `box-shadow ${cssVariableTheme.transitions.duration.normal} ease`,
42
+ lineHeight: cssVariableTheme.typography.lineHeight.relaxed,
43
+ padding: `${cssVariableTheme.spacing.sm} 0`,
44
+ },
45
+ '&:focus-within textarea': {
46
+ boxShadow: `0px 3px 0px ${cssVariableTheme.palette.primary.main}`,
47
+ },
48
+ },
49
+ render: ({ props, useHostProps, useRef }) => {
50
+ const maxSize = props.maxImageSizeBytes ?? DEFAULT_MAX_IMAGE_SIZE;
51
+ const textareaRef = useRef('textarea');
52
+ useHostProps({
53
+ 'data-disabled': props.disabled ? '' : undefined,
54
+ });
55
+ const handleInput = (ev) => {
56
+ const target = ev.target;
57
+ props.onValueChange?.(target.value);
58
+ };
59
+ const handlePaste = (ev) => {
60
+ const items = ev.clipboardData?.items;
61
+ if (!items)
62
+ return;
63
+ for (let i = 0; i < items.length; i++) {
64
+ const item = items[i];
65
+ if (item.type.startsWith('image/')) {
66
+ const file = item.getAsFile();
67
+ if (!file || file.size > maxSize)
68
+ continue;
69
+ ev.preventDefault();
70
+ const reader = new FileReader();
71
+ reader.onload = () => {
72
+ const base64 = reader.result;
73
+ const textarea = textareaRef.current;
74
+ if (!textarea)
75
+ return;
76
+ const start = textarea.selectionStart;
77
+ const end = textarea.selectionEnd;
78
+ const before = textarea.value.slice(0, start);
79
+ const after = textarea.value.slice(end);
80
+ const imageMarkdown = `![pasted image](${base64})`;
81
+ const newValue = before + imageMarkdown + after;
82
+ textarea.value = newValue;
83
+ const cursorPos = start + imageMarkdown.length;
84
+ textarea.setSelectionRange(cursorPos, cursorPos);
85
+ props.onValueChange?.(newValue);
86
+ };
87
+ reader.onerror = () => {
88
+ console.warn('Failed to read pasted image file');
89
+ };
90
+ reader.readAsDataURL(file);
91
+ return;
92
+ }
93
+ }
94
+ };
95
+ return (createComponent("label", null,
96
+ props.labelTitle ? createComponent("span", null, props.labelTitle) : null,
97
+ createComponent("textarea", { ref: textareaRef, value: props.value, oninput: handleInput, onpaste: handlePaste, readOnly: props.readOnly, disabled: props.disabled, placeholder: props.placeholder, rows: props.rows ?? 10 })));
98
+ },
99
+ });
100
+ //# sourceMappingURL=markdown-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-input.js","sourceRoot":"","sources":["../../../src/components/markdown/markdown-input.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markdown-input.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-input.spec.d.ts","sourceRoot":"","sources":["../../../src/components/markdown/markdown-input.spec.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,215 @@
1
+ import { Injector } from '@furystack/inject';
2
+ import { createComponent, initializeShadeRoot } from '@furystack/shades';
3
+ import { sleepAsync, usingAsync } from '@furystack/utils';
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { MarkdownInput } from './markdown-input.js';
6
+ describe('MarkdownInput', () => {
7
+ beforeEach(() => {
8
+ document.body.innerHTML = '<div id="root"></div>';
9
+ });
10
+ afterEach(() => {
11
+ document.body.innerHTML = '';
12
+ vi.restoreAllMocks();
13
+ });
14
+ it('should render with shadow DOM', async () => {
15
+ await usingAsync(new Injector(), async (injector) => {
16
+ const rootElement = document.getElementById('root');
17
+ initializeShadeRoot({
18
+ injector,
19
+ rootElement,
20
+ jsxElement: createComponent(MarkdownInput, { value: "" }),
21
+ });
22
+ await sleepAsync(50);
23
+ const el = document.querySelector('shade-markdown-input');
24
+ expect(el).not.toBeNull();
25
+ });
26
+ });
27
+ it('should render a textarea with the given value', async () => {
28
+ await usingAsync(new Injector(), async (injector) => {
29
+ const rootElement = document.getElementById('root');
30
+ initializeShadeRoot({
31
+ injector,
32
+ rootElement,
33
+ jsxElement: createComponent(MarkdownInput, { value: "# Hello" }),
34
+ });
35
+ await sleepAsync(50);
36
+ const textarea = document.querySelector('shade-markdown-input textarea');
37
+ expect(textarea).not.toBeNull();
38
+ expect(textarea.value).toBe('# Hello');
39
+ });
40
+ });
41
+ it('should render the label title', async () => {
42
+ await usingAsync(new Injector(), async (injector) => {
43
+ const rootElement = document.getElementById('root');
44
+ initializeShadeRoot({
45
+ injector,
46
+ rootElement,
47
+ jsxElement: createComponent(MarkdownInput, { value: "", labelTitle: "Markdown Content" }),
48
+ });
49
+ await sleepAsync(50);
50
+ const label = document.querySelector('shade-markdown-input label');
51
+ expect(label?.textContent).toContain('Markdown Content');
52
+ });
53
+ });
54
+ it('should set placeholder on textarea', async () => {
55
+ await usingAsync(new Injector(), async (injector) => {
56
+ const rootElement = document.getElementById('root');
57
+ initializeShadeRoot({
58
+ injector,
59
+ rootElement,
60
+ jsxElement: createComponent(MarkdownInput, { value: "", placeholder: "Type markdown..." }),
61
+ });
62
+ await sleepAsync(50);
63
+ const textarea = document.querySelector('shade-markdown-input textarea');
64
+ expect(textarea.placeholder).toBe('Type markdown...');
65
+ });
66
+ });
67
+ it('should set data-disabled when disabled', async () => {
68
+ await usingAsync(new Injector(), async (injector) => {
69
+ const rootElement = document.getElementById('root');
70
+ initializeShadeRoot({
71
+ injector,
72
+ rootElement,
73
+ jsxElement: createComponent(MarkdownInput, { value: "", disabled: true }),
74
+ });
75
+ await sleepAsync(50);
76
+ const wrapper = document.querySelector('shade-markdown-input');
77
+ expect(wrapper.hasAttribute('data-disabled')).toBe(true);
78
+ const textarea = wrapper.querySelector('textarea');
79
+ expect(textarea.disabled).toBe(true);
80
+ });
81
+ });
82
+ it('should set readOnly on textarea', async () => {
83
+ await usingAsync(new Injector(), async (injector) => {
84
+ const rootElement = document.getElementById('root');
85
+ initializeShadeRoot({
86
+ injector,
87
+ rootElement,
88
+ jsxElement: createComponent(MarkdownInput, { value: "", readOnly: true }),
89
+ });
90
+ await sleepAsync(50);
91
+ const textarea = document.querySelector('shade-markdown-input textarea');
92
+ expect(textarea.readOnly).toBe(true);
93
+ });
94
+ });
95
+ it('should call onValueChange on input event', async () => {
96
+ await usingAsync(new Injector(), async (injector) => {
97
+ const rootElement = document.getElementById('root');
98
+ const onValueChange = vi.fn();
99
+ initializeShadeRoot({
100
+ injector,
101
+ rootElement,
102
+ jsxElement: createComponent(MarkdownInput, { value: "", onValueChange: onValueChange }),
103
+ });
104
+ await sleepAsync(50);
105
+ const textarea = document.querySelector('shade-markdown-input textarea');
106
+ textarea.value = '# New content';
107
+ textarea.dispatchEvent(new Event('input', { bubbles: true }));
108
+ await sleepAsync(50);
109
+ expect(onValueChange).toHaveBeenCalledWith('# New content');
110
+ });
111
+ });
112
+ it('should use custom rows prop', async () => {
113
+ await usingAsync(new Injector(), async (injector) => {
114
+ const rootElement = document.getElementById('root');
115
+ initializeShadeRoot({
116
+ injector,
117
+ rootElement,
118
+ jsxElement: createComponent(MarkdownInput, { value: "", rows: 20 }),
119
+ });
120
+ await sleepAsync(50);
121
+ const textarea = document.querySelector('shade-markdown-input textarea');
122
+ expect(textarea.rows).toBe(20);
123
+ });
124
+ });
125
+ describe('image paste', () => {
126
+ const createPasteEvent = (items) => {
127
+ const pasteEvent = new Event('paste', { bubbles: true, cancelable: true });
128
+ Object.defineProperty(pasteEvent, 'clipboardData', {
129
+ value: {
130
+ items: Object.assign(items.map((item) => ({
131
+ type: item.type,
132
+ getAsFile: () => item.file,
133
+ })), { length: items.length }),
134
+ },
135
+ });
136
+ return pasteEvent;
137
+ };
138
+ it('should inline a pasted image as base64 Markdown', async () => {
139
+ const originalFileReader = globalThis.FileReader;
140
+ try {
141
+ const fakeBase64 = 'data:image/png;base64,dGVzdA==';
142
+ globalThis.FileReader = class {
143
+ result = fakeBase64;
144
+ onload = null;
145
+ onerror = null;
146
+ readAsDataURL() {
147
+ queueMicrotask(() => this.onload?.());
148
+ }
149
+ };
150
+ await usingAsync(new Injector(), async (injector) => {
151
+ const rootElement = document.getElementById('root');
152
+ const onValueChange = vi.fn();
153
+ initializeShadeRoot({
154
+ injector,
155
+ rootElement,
156
+ jsxElement: createComponent(MarkdownInput, { value: "Hello ", onValueChange: onValueChange }),
157
+ });
158
+ await sleepAsync(50);
159
+ const textarea = document.querySelector('shade-markdown-input textarea');
160
+ textarea.selectionStart = 6;
161
+ textarea.selectionEnd = 6;
162
+ const file = new File(['png-data'], 'test.png', { type: 'image/png' });
163
+ const pasteEvent = createPasteEvent([{ type: 'image/png', file }]);
164
+ textarea.dispatchEvent(pasteEvent);
165
+ await sleepAsync(100);
166
+ expect(onValueChange).toHaveBeenCalledOnce();
167
+ const result = onValueChange.mock.calls[0][0];
168
+ expect(result).toContain('![pasted image](data:');
169
+ expect(result.startsWith('Hello ')).toBe(true);
170
+ });
171
+ }
172
+ finally {
173
+ globalThis.FileReader = originalFileReader;
174
+ }
175
+ });
176
+ it('should ignore pasted images exceeding maxImageSizeBytes', async () => {
177
+ await usingAsync(new Injector(), async (injector) => {
178
+ const rootElement = document.getElementById('root');
179
+ const onValueChange = vi.fn();
180
+ initializeShadeRoot({
181
+ injector,
182
+ rootElement,
183
+ jsxElement: createComponent(MarkdownInput, { value: "", onValueChange: onValueChange, maxImageSizeBytes: 5 }),
184
+ });
185
+ await sleepAsync(50);
186
+ const textarea = document.querySelector('shade-markdown-input textarea');
187
+ const file = new File(['this-is-larger-than-5-bytes'], 'big.png', { type: 'image/png' });
188
+ const pasteEvent = createPasteEvent([{ type: 'image/png', file }]);
189
+ textarea.dispatchEvent(pasteEvent);
190
+ await sleepAsync(100);
191
+ expect(onValueChange).not.toHaveBeenCalled();
192
+ });
193
+ });
194
+ it('should not interfere with non-image paste', async () => {
195
+ await usingAsync(new Injector(), async (injector) => {
196
+ const rootElement = document.getElementById('root');
197
+ const onValueChange = vi.fn();
198
+ initializeShadeRoot({
199
+ injector,
200
+ rootElement,
201
+ jsxElement: createComponent(MarkdownInput, { value: "", onValueChange: onValueChange }),
202
+ });
203
+ await sleepAsync(50);
204
+ const textarea = document.querySelector('shade-markdown-input textarea');
205
+ const file = new File(['text content'], 'note.txt', { type: 'text/plain' });
206
+ const pasteEvent = createPasteEvent([{ type: 'text/plain', file }]);
207
+ const wasDefaultPrevented = !textarea.dispatchEvent(pasteEvent);
208
+ await sleepAsync(100);
209
+ expect(wasDefaultPrevented).toBe(false);
210
+ expect(onValueChange).not.toHaveBeenCalled();
211
+ });
212
+ });
213
+ });
214
+ });
215
+ //# sourceMappingURL=markdown-input.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-input.spec.js","sourceRoot":"","sources":["../../../src/components/markdown/markdown-input.spec.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Zero-dependency Markdown parser that converts a Markdown string into an AST.
3
+ */
4
+ export type MarkdownNode = HeadingNode | ParagraphNode | CodeBlockNode | BlockquoteNode | ListNode | HorizontalRuleNode;
5
+ export type HeadingNode = {
6
+ type: 'heading';
7
+ level: 1 | 2 | 3 | 4 | 5 | 6;
8
+ children: InlineNode[];
9
+ };
10
+ export type ParagraphNode = {
11
+ type: 'paragraph';
12
+ children: InlineNode[];
13
+ };
14
+ export type CodeBlockNode = {
15
+ type: 'codeBlock';
16
+ language?: string;
17
+ content: string;
18
+ };
19
+ export type BlockquoteNode = {
20
+ type: 'blockquote';
21
+ children: MarkdownNode[];
22
+ };
23
+ export type ListNode = {
24
+ type: 'list';
25
+ ordered: boolean;
26
+ items: ListItemNode[];
27
+ };
28
+ export type HorizontalRuleNode = {
29
+ type: 'horizontalRule';
30
+ };
31
+ export type ListItemNode = {
32
+ children: InlineNode[];
33
+ checkbox?: 'checked' | 'unchecked';
34
+ sourceLineIndex: number;
35
+ };
36
+ export type InlineNode = TextNode | BoldNode | ItalicNode | InlineCodeNode | LinkNode | ImageNode;
37
+ export type TextNode = {
38
+ type: 'text';
39
+ content: string;
40
+ };
41
+ export type BoldNode = {
42
+ type: 'bold';
43
+ children: InlineNode[];
44
+ };
45
+ export type ItalicNode = {
46
+ type: 'italic';
47
+ children: InlineNode[];
48
+ };
49
+ export type InlineCodeNode = {
50
+ type: 'code';
51
+ content: string;
52
+ };
53
+ export type LinkNode = {
54
+ type: 'link';
55
+ href: string;
56
+ children: InlineNode[];
57
+ };
58
+ export type ImageNode = {
59
+ type: 'image';
60
+ src: string;
61
+ alt: string;
62
+ };
63
+ /**
64
+ * Parse inline Markdown formatting into an array of InlineNodes.
65
+ *
66
+ * Known limitations:
67
+ * - Backslash escapes (e.g. `\*`) are not supported; special characters are always interpreted.
68
+ * - Underscore `_` markers are not restricted to word boundaries, so identifiers like
69
+ * `some_variable_name` may produce false italic/bold matches.
70
+ */
71
+ export declare const parseInline: (text: string) => InlineNode[];
72
+ /**
73
+ * Parse a Markdown string into an array of block-level MarkdownNodes.
74
+ */
75
+ export declare const parseMarkdown: (source: string) => MarkdownNode[];
76
+ /**
77
+ * Toggle a checkbox at the given source line index in the raw Markdown string.
78
+ * Only matches checkboxes in unordered list items (`- [ ]` or `* [x]`).
79
+ * Returns the updated string.
80
+ */
81
+ export declare const toggleCheckbox: (source: string, sourceLineIndex: number) => string;
82
+ //# sourceMappingURL=markdown-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../../src/components/markdown/markdown-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,GAAG,kBAAkB,CAAA;AAEvH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,YAAY,CAAA;IAClB,QAAQ,EAAE,YAAY,EAAE,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,YAAY,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,gBAAgB,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,WAAW,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEjG,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AACxD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AAC/D,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AACnE,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAC9D,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AAC7E,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAYnE;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,UAAU,EAsGpD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,YAAY,EAqI1D,CAAA;AAKD;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,EAAE,iBAAiB,MAAM,KAAG,MAWxE,CAAA"}