@pinkpixel/marzipan 1.1.2 → 1.2.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.
- package/README.md +4 -5
- package/dist/index-CEbRSdyd.js +31 -0
- package/dist/index-CEbRSdyd.js.map +1 -0
- package/dist/index-xgEXHeDh.js +31 -0
- package/dist/index-xgEXHeDh.js.map +1 -0
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +710 -620
- package/dist/index.js.map +1 -1
- package/dist/parser.d.ts +8 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +63 -6
- package/dist/parser.js.map +1 -1
- package/dist/plugins/accentSwatchPlugin.d.ts.map +1 -1
- package/dist/plugins/accentSwatchPlugin.js +96 -80
- package/dist/plugins/accentSwatchPlugin.js.map +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +24 -27
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/tableGenerator.js +1 -1
- package/dist/plugins/tableGridPlugin.d.ts +1 -1
- package/dist/plugins/tableGridPlugin.d.ts.map +1 -1
- package/dist/plugins/tableGridPlugin.js +143 -42
- package/dist/plugins/tableGridPlugin.js.map +1 -1
- package/dist/plugins/tablePlugin.js +1 -1
- package/dist/plugins/utils/table.d.ts +12 -1
- package/dist/plugins/utils/table.d.ts.map +1 -1
- package/dist/plugins/utils/table.js +31 -6
- package/dist/plugins/utils/table.js.map +1 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +65 -1
- package/dist/styles.js.map +1 -1
- package/dist/table-CJHCBhPo.js +33 -0
- package/dist/table-CJHCBhPo.js.map +1 -0
- package/docs/index.md +2 -3
- package/docs/plugins.md +84 -7
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accentSwatchPlugin.js","sources":["../../src/plugins/accentSwatchPlugin.ts"],"sourcesContent":["// plugins/accentSwatchPlugin.ts\n// Tiny recent-colors palette with Eyedropper support (if available).\n// Persists to localStorage. No deps.\n\ntype MzEditor = {\n container: HTMLElement;\n textarea: HTMLTextAreaElement;\n updatePreview: () => void;\n // Optional if your core exposes it\n setAccent?: (hex: string) => void;\n};\n\nconst LS_KEY = 'marzipan.accent.colors';\n\nfunction normHex(hex: string): string | null {\n if (!hex) return null;\n let h = hex.trim().toLowerCase();\n if (!h.startsWith('#')) h = '#' + h;\n if (!/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(h)) return null;\n // Expand #abc -> #aabbcc\n if (h.length === 4) h = '#' + [...h.slice(1)].map(c => c + c).join('');\n return h;\n}\n\nfunction load(): string[] {\n try { return JSON.parse(localStorage.getItem(LS_KEY) || '[]'); } catch { return []; }\n}\nfunction save(arr: string[]) {\n try { localStorage.setItem(LS_KEY, JSON.stringify(arr)); } catch { /* localStorage not available */ }\n}\n\nasync function pickWithEyedropper(): Promise<string | null> {\n const anyWin = window as any;\n if (!anyWin.EyeDropper) return null;\n try {\n const eye = new anyWin.EyeDropper();\n const res = await eye.open();\n return normHex(res.sRGBHex);\n } catch { return null; }\n}\n\nfunction setAccent(editor: MzEditor, hex: string) {\n // Prefer core hook if you have one\n if (typeof editor.setAccent === 'function') editor.setAccent(hex);\n // Always set CSS var as a fallback\n document.documentElement.style.setProperty('--mz-accent', hex);\n editor.container.style.setProperty('--mz-accent', hex);\n // Broadcast (optional) for any listeners\n editor.container.dispatchEvent(new CustomEvent('marzipan:accent', { detail: { color: hex } }));\n}\n\nexport function accentSwatchPlugin(opts?: {\n max?: number; // max swatches to keep (default 12)\n defaults?: string[]; // seed colors if none saved\n title?: string; // toolbar tooltip\n label?: string; // toolbar button label/icon\n}) {\n const max = Math.max(1, opts?.max ?? 12);\n const title = opts?.title ?? 'Accent color';\n const label = opts?.label ?? '⭘';\n\n return (editor: MzEditor) => {\n const bar = editor.container.querySelector('.marzipan-toolbar') as HTMLElement ?? editor.container;\n\n // Button that opens the palette popover\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'marzipan-toolbar-button mz-btn-accent';\n btn.title = title;\n btn.textContent = label;\n btn.setAttribute('aria-label', title);\n\n // Popover elements\n let pop: HTMLElement | null = null;\n let colors: string[] = load();\n if (!colors.length && opts?.defaults?.length) {\n colors = opts.defaults\n .map(normHex)\n .filter((x): x is string => !!x)\n .slice(0, max);\n save(colors);\n }\n\n function currentAccent(): string {\n const css = getComputedStyle(editor.container);\n const v = css.getPropertyValue('--mz-accent').trim() ||\n getComputedStyle(document.documentElement).getPropertyValue('--mz-accent').trim();\n return normHex(v) || '#8b5cf6'; // fallback purple\n }\n\n function ensureFront(hex: string) {\n colors = [hex, ...colors.filter(c => c !== hex)].slice(0, max);\n save(colors);\n }\n\n function closePop() {\n if (!pop) return;\n pop.remove(); pop = null;\n document.removeEventListener('click', outsideClose, true);\n window.removeEventListener('resize', closePop);\n window.removeEventListener('scroll', closePop, true);\n }\n\n function outsideClose(e: MouseEvent) {\n if (!pop) return;\n if (e.target instanceof Node && (pop.contains(e.target) || btn.contains(e.target))) return;\n closePop();\n }\n\n function render() {\n if (!pop) return;\n const grid = pop.querySelector('.mz-accent-grid') as HTMLElement;\n grid.innerHTML = '';\n\n const cur = currentAccent();\n\n // Existing swatches\n colors.forEach((hex, i) => {\n const sw = document.createElement('button');\n sw.type = 'button';\n sw.className = 'mz-swatch';\n Object.assign(sw.style, {\n width: '28px', height: '28px', borderRadius: '50%',\n border: '1px solid #333', background: hex, cursor: 'pointer',\n boxShadow: 'inset 0 0 0 2px rgba(0,0,0,.2)',\n padding: '0', margin: '0', boxSizing: 'border-box',\n });\n if (hex === cur) sw.style.outline = '2px solid var(--mz-accent, #8b5cf6)';\n sw.title = hex;\n sw.onclick = () => {\n setAccent(editor, hex);\n ensureFront(hex);\n render();\n };\n sw.oncontextmenu = (e) => {\n e.preventDefault();\n colors.splice(i, 1);\n save(colors);\n render();\n };\n grid.appendChild(sw);\n });\n\n // “+” swatch to add new color\n const plus = document.createElement('button');\n plus.type = 'button';\n plus.className = 'mz-swatch mz-swatch-add';\n plus.textContent = '+';\n plus.title = 'Add color (click to pick, ⇧click to type, ⌥click eyedropper)';\n Object.assign(plus.style, {\n width: '28px', height: '28px', borderRadius: '50%',\n background: 'linear-gradient(135deg, #222, #2b2f36)', color: '#e7e7e7',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontWeight: '700', fontSize: '16px', cursor: 'pointer',\n border: '1px solid #333', padding: '0', margin: '0', boxSizing: 'border-box',\n });\n plus.onclick = async (e) => {\n let hex: string | null = null;\n\n if (e.shiftKey) {\n hex = normHex(prompt('Enter hex color (#RRGGBB or RRGGBB):') || '');\n } else if (e.altKey) {\n hex = await pickWithEyedropper();\n if (!hex) hex = normHex(prompt('Enter hex color:') || '');\n } else {\n // Native color input for broad support\n const input = document.createElement('input');\n input.type = 'color';\n input.value = currentAccent();\n input.onchange = () => {\n const v = normHex(input.value);\n if (!v) return;\n setAccent(editor, v);\n ensureFront(v);\n render();\n };\n input.click();\n return;\n }\n\n if (hex) {\n setAccent(editor, hex);\n ensureFront(hex);\n render();\n }\n };\n grid.appendChild(plus);\n\n // Controls: “Use current”, “Reset”\n const useCur = pop.querySelector('.mz-accent-usecur') as HTMLButtonElement;\n useCur.onclick = () => {\n const hex = currentAccent();\n ensureFront(hex);\n render();\n };\n\n const reset = pop.querySelector('.mz-accent-reset') as HTMLButtonElement;\n reset.onclick = () => {\n if (!opts?.defaults?.length) { colors = []; save(colors); render(); return; }\n colors = opts.defaults.map(normHex).filter(Boolean) as string[];\n save(colors);\n render();\n };\n }\n\n function openPop() {\n if (pop) { closePop(); return; }\n\n pop = document.createElement('div');\n pop.className = 'mz-pop mz-accent-pop';\n pop.innerHTML = `\n <div class=\"mz-accent-grid\"></div>\n <div class=\"mz-accent-row\">\n <button type=\"button\" class=\"mz-accent-usecur\">Add current</button>\n <button type=\"button\" class=\"mz-accent-reset\">Reset</button>\n </div>\n <div class=\"mz-accent-hint\">Tip: Right-click a swatch to remove. Alt-click “+” for eyedropper.</div>\n `;\n document.body.appendChild(pop);\n\n // Apply critical styles inline to avoid CSS framework resets (e.g. Tailwind)\n const r = btn.getBoundingClientRect();\n Object.assign(pop.style, {\n position: 'absolute',\n left: `${Math.round(window.scrollX + r.left)}px`,\n top: `${Math.round(window.scrollY + r.bottom + 6)}px`,\n width: '280px',\n maxWidth: 'calc(100vw - 24px)',\n background: '#1a1e24',\n border: '1px solid #333',\n borderRadius: '10px',\n boxShadow: '0 4px 16px rgba(0,0,0,.35)',\n zIndex: '10000',\n padding: '8px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '14px',\n color: '#e7e7e7',\n boxSizing: 'border-box',\n });\n\n // Style inner elements inline to survive CSS resets\n const grid = pop.querySelector('.mz-accent-grid') as HTMLElement;\n if (grid) Object.assign(grid.style, {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, 28px)',\n gap: '8px',\n padding: '6px',\n });\n const row = pop.querySelector('.mz-accent-row') as HTMLElement;\n if (row) Object.assign(row.style, { display: 'flex', gap: '8px', padding: '6px' });\n pop.querySelectorAll('.mz-accent-row button').forEach(b => {\n Object.assign((b as HTMLElement).style, {\n flex: '1',\n padding: '6px 8px',\n borderRadius: '8px',\n border: '1px solid #2b2f36',\n background: '#1a1e24',\n color: '#e7e7e7',\n cursor: 'pointer',\n fontSize: '13px',\n fontFamily: 'inherit',\n });\n });\n const hint = pop.querySelector('.mz-accent-hint') as HTMLElement;\n if (hint) Object.assign(hint.style, { fontSize: '12px', opacity: '0.7', padding: '0 6px 6px' });\n\n render();\n\n setTimeout(() => {\n document.addEventListener('click', outsideClose, true);\n window.addEventListener('resize', closePop);\n window.addEventListener('scroll', closePop, true);\n }, 0);\n }\n\n btn.onclick = openPop;\n bar.appendChild(btn);\n\n // Initialize CSS var if missing\n if (!getComputedStyle(editor.container).getPropertyValue('--mz-accent').trim()) {\n const seed = colors[0] || opts?.defaults?.[0] || '#8b5cf6';\n setAccent(editor, seed);\n }\n };\n}\n\n// Minimal CSS you can inject once in your app\nexport const accentSwatchStyles = `\n.mz-accent-pop {\n width: 280px; max-width: calc(100vw - 24px);\n background: var(--mz-pop-bg, #1a1e24);\n border: 1px solid var(--mz-pop-bd, #333);\n border-radius: 10px;\n box-shadow: 0 4px 16px rgba(0,0,0,.35);\n z-index: 10000;\n padding: 8px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n color: var(--mz-pop-fg, #e7e7e7);\n}\n.mz-accent-grid { display: grid; grid-template-columns: repeat(auto-fill, 28px); gap: 8px; padding: 6px; }\n.mz-swatch {\n width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--mz-pop-bd, #333);\n background: var(--sw, #777); cursor: pointer; box-shadow: inset 0 0 0 2px rgba(0,0,0,.2);\n transition: transform .1s;\n}\n.mz-swatch:hover { transform: scale(1.15); }\n.mz-swatch.sel { outline: 2px solid var(--mz-accent, #8b5cf6); outline-offset: 2px; }\n.mz-swatch-add { background: linear-gradient(135deg, #222, #2b2f36); color: #e7e7e7;\n display:flex; align-items:center; justify-content:center; font-weight:700; font-size:16px; }\n.mz-accent-row { display:flex; gap:8px; padding: 6px; }\n.mz-accent-row button {\n flex:1; padding:6px 8px; border-radius:8px; border:1px solid var(--mz-bd, #2b2f36);\n background: var(--mz-btn-bg, #1a1e24); color: var(--mz-btn-fg, #e7e7e7); cursor:pointer;\n font-size: 13px; transition: background .15s;\n}\n.mz-accent-row button:hover { background: var(--mz-btn-hover, #2b2f36); }\n.mz-accent-hint { font-size: 12px; opacity: .7; padding: 0 6px 6px; }\n`;"],"names":["LS_KEY","normHex","hex","h","c","load","save","arr","pickWithEyedropper","anyWin","res","setAccent","editor","accentSwatchPlugin","opts","max","title","label","bar","btn","pop","colors","x","currentAccent","v","ensureFront","closePop","outsideClose","e","render","grid","cur","i","sw","plus","input","useCur","reset","openPop","r","row","b","hint","seed","accentSwatchStyles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"accentSwatchPlugin.js","sources":["../../src/plugins/accentSwatchPlugin.ts"],"sourcesContent":["// plugins/accentSwatchPlugin.ts\n// Tiny recent-colors palette with Eyedropper support (if available).\n// Persists to localStorage. No deps.\n\ntype MzEditor = {\n container: HTMLElement;\n textarea: HTMLTextAreaElement;\n updatePreview: () => void;\n // Optional if your core exposes it\n setAccent?: (hex: string) => void;\n};\n\nconst LS_KEY = 'marzipan.accent.colors';\n\nfunction normHex(hex: string): string | null {\n if (!hex) return null;\n let h = hex.trim().toLowerCase();\n if (!h.startsWith('#')) h = '#' + h;\n if (!/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(h)) return null;\n // Expand #abc -> #aabbcc\n if (h.length === 4) h = '#' + [...h.slice(1)].map(c => c + c).join('');\n return h;\n}\n\nfunction load(): string[] {\n try { return JSON.parse(localStorage.getItem(LS_KEY) || '[]'); } catch { return []; }\n}\nfunction save(arr: string[]) {\n try { localStorage.setItem(LS_KEY, JSON.stringify(arr)); } catch { /* localStorage not available */ }\n}\n\nasync function pickWithEyedropper(): Promise<string | null> {\n const anyWin = window as any;\n if (!anyWin.EyeDropper) return null;\n try {\n const eye = new anyWin.EyeDropper();\n const res = await eye.open();\n return normHex(res.sRGBHex);\n } catch { return null; }\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nfunction setAccent(editor: MzEditor, hex: string, btnIndicator?: HTMLElement | null) {\n // Prefer core hook if you have one\n if (typeof editor.setAccent === 'function') editor.setAccent(hex);\n // Always set CSS var\n document.documentElement.style.setProperty('--mz-accent', hex);\n editor.container.style.setProperty('--mz-accent', hex);\n // Bridge accent to actual editor CSS variables for visible effect\n editor.container.style.setProperty('--cursor', hex);\n editor.container.style.setProperty('--selection', hexToRgba(hex, 0.25));\n editor.container.style.setProperty('--toolbar-active', hexToRgba(hex, 0.2));\n editor.container.style.setProperty('--link', hex);\n // Update toolbar button indicator\n if (btnIndicator) btnIndicator.style.background = hex;\n // Broadcast (optional) for any listeners\n editor.container.dispatchEvent(new CustomEvent('marzipan:accent', { detail: { color: hex } }));\n}\n\nexport function accentSwatchPlugin(opts?: {\n max?: number; // max swatches to keep (default 12)\n defaults?: string[]; // seed colors if none saved\n title?: string; // toolbar tooltip\n label?: string; // toolbar button label/icon\n}) {\n const max = Math.max(1, opts?.max ?? 12);\n const title = opts?.title ?? 'Accent color';\n\n return (editor: MzEditor) => {\n const bar = editor.container.querySelector('.marzipan-toolbar') as HTMLElement ?? editor.container;\n\n // Button that opens the palette popover\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'marzipan-toolbar-button mz-btn-accent';\n btn.title = title;\n btn.setAttribute('aria-label', title);\n // Colored dot indicator instead of plain text\n const indicator = document.createElement('span');\n indicator.className = 'mz-accent-indicator';\n Object.assign(indicator.style, {\n display: 'block',\n width: '16px',\n height: '16px',\n borderRadius: '50%',\n border: '2px solid rgba(255,255,255,0.25)',\n background: '#8b5cf6',\n boxSizing: 'border-box',\n flexShrink: '0',\n });\n btn.appendChild(indicator);\n\n // Popover elements\n let pop: HTMLElement | null = null;\n let colors: string[] = load();\n if (!colors.length && opts?.defaults?.length) {\n colors = opts.defaults\n .map(normHex)\n .filter((x): x is string => !!x)\n .slice(0, max);\n save(colors);\n }\n\n function currentAccent(): string {\n const css = getComputedStyle(editor.container);\n const v = css.getPropertyValue('--mz-accent').trim() ||\n getComputedStyle(document.documentElement).getPropertyValue('--mz-accent').trim();\n return normHex(v) || '#8b5cf6'; // fallback purple\n }\n\n function ensureFront(hex: string) {\n colors = [hex, ...colors.filter(c => c !== hex)].slice(0, max);\n save(colors);\n }\n\n function closePop() {\n if (!pop) return;\n pop.remove(); pop = null;\n document.removeEventListener('click', outsideClose, true);\n window.removeEventListener('resize', closePop);\n window.removeEventListener('scroll', closePop, true);\n }\n\n function outsideClose(e: MouseEvent) {\n if (!pop) return;\n if (e.target instanceof Node && (pop.contains(e.target) || btn.contains(e.target))) return;\n closePop();\n }\n\n function render() {\n if (!pop) return;\n const grid = pop.querySelector('.mz-accent-grid') as HTMLElement;\n grid.innerHTML = '';\n\n const cur = currentAccent();\n\n // Existing swatches\n colors.forEach((hex, i) => {\n const sw = document.createElement('button');\n sw.type = 'button';\n sw.className = 'mz-swatch';\n Object.assign(sw.style, {\n width: '28px', height: '28px', borderRadius: '50%',\n border: '1px solid #333', background: hex, cursor: 'pointer',\n boxShadow: 'inset 0 0 0 2px rgba(0,0,0,.2)',\n padding: '0', margin: '0', boxSizing: 'border-box',\n });\n if (hex === cur) sw.style.outline = '2px solid var(--mz-accent, #8b5cf6)';\n sw.title = hex;\n sw.onclick = () => {\n setAccent(editor, hex, indicator);\n ensureFront(hex);\n render();\n };\n sw.oncontextmenu = (e) => {\n e.preventDefault();\n colors.splice(i, 1);\n save(colors);\n render();\n };\n grid.appendChild(sw);\n });\n\n // “+” swatch to add new color\n const plus = document.createElement('button');\n plus.type = 'button';\n plus.className = 'mz-swatch mz-swatch-add';\n plus.textContent = '+';\n plus.title = 'Add color (click to pick, ⇧click to type, ⌥click eyedropper)';\n Object.assign(plus.style, {\n width: '28px', height: '28px', borderRadius: '50%',\n background: 'linear-gradient(135deg, #222, #2b2f36)', color: '#e7e7e7',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontWeight: '700', fontSize: '16px', cursor: 'pointer',\n border: '1px solid #333', padding: '0', margin: '0', boxSizing: 'border-box',\n });\n plus.onclick = async (e) => {\n let hex: string | null = null;\n\n if (e.shiftKey) {\n hex = normHex(prompt('Enter hex color (#RRGGBB or RRGGBB):') || '');\n } else if (e.altKey) {\n hex = await pickWithEyedropper();\n if (!hex) hex = normHex(prompt('Enter hex color:') || '');\n } else {\n // Native color input for broad support\n const input = document.createElement('input');\n input.type = 'color';\n input.value = currentAccent();\n input.onchange = () => {\n const v = normHex(input.value);\n if (!v) return;\n setAccent(editor, v, indicator);\n ensureFront(v);\n render();\n };\n input.click();\n return;\n }\n\n if (hex) {\n setAccent(editor, hex, indicator);\n ensureFront(hex);\n render();\n }\n };\n grid.appendChild(plus);\n\n // Controls: “Use current”, “Reset”\n const useCur = pop.querySelector('.mz-accent-usecur') as HTMLButtonElement;\n useCur.onclick = () => {\n const hex = currentAccent();\n ensureFront(hex);\n render();\n };\n\n const reset = pop.querySelector('.mz-accent-reset') as HTMLButtonElement;\n reset.onclick = () => {\n if (!opts?.defaults?.length) { colors = []; save(colors); render(); return; }\n colors = opts.defaults.map(normHex).filter(Boolean) as string[];\n save(colors);\n render();\n };\n }\n\n function openPop() {\n if (pop) { closePop(); return; }\n\n pop = document.createElement('div');\n pop.className = 'mz-pop mz-accent-pop';\n pop.innerHTML = `\n <div class=\"mz-accent-grid\"></div>\n <div class=\"mz-accent-row\">\n <button type=\"button\" class=\"mz-accent-usecur\">Add current</button>\n <button type=\"button\" class=\"mz-accent-reset\">Reset</button>\n </div>\n <div class=\"mz-accent-hint\">Tip: Right-click a swatch to remove. Alt-click “+” for eyedropper.</div>\n `;\n document.body.appendChild(pop);\n\n // Apply critical styles inline to avoid CSS framework resets (e.g. Tailwind)\n const r = btn.getBoundingClientRect();\n Object.assign(pop.style, {\n position: 'absolute',\n left: `${Math.round(window.scrollX + r.left)}px`,\n top: `${Math.round(window.scrollY + r.bottom + 6)}px`,\n width: '280px',\n maxWidth: 'calc(100vw - 24px)',\n background: '#1a1e24',\n border: '1px solid #333',\n borderRadius: '10px',\n boxShadow: '0 4px 16px rgba(0,0,0,.35)',\n zIndex: '10000',\n padding: '8px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '14px',\n color: '#e7e7e7',\n boxSizing: 'border-box',\n });\n\n // Style inner elements inline to survive CSS resets\n const grid = pop.querySelector('.mz-accent-grid') as HTMLElement;\n if (grid) Object.assign(grid.style, {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, 28px)',\n gap: '8px',\n padding: '6px',\n });\n const row = pop.querySelector('.mz-accent-row') as HTMLElement;\n if (row) Object.assign(row.style, { display: 'flex', gap: '8px', padding: '6px' });\n pop.querySelectorAll('.mz-accent-row button').forEach(b => {\n Object.assign((b as HTMLElement).style, {\n flex: '1',\n padding: '6px 8px',\n borderRadius: '8px',\n border: '1px solid #2b2f36',\n background: '#1a1e24',\n color: '#e7e7e7',\n cursor: 'pointer',\n fontSize: '13px',\n fontFamily: 'inherit',\n });\n });\n const hint = pop.querySelector('.mz-accent-hint') as HTMLElement;\n if (hint) Object.assign(hint.style, { fontSize: '12px', opacity: '0.7', padding: '0 6px 6px' });\n\n render();\n\n setTimeout(() => {\n document.addEventListener('click', outsideClose, true);\n window.addEventListener('resize', closePop);\n window.addEventListener('scroll', closePop, true);\n }, 0);\n }\n\n btn.onclick = openPop;\n bar.appendChild(btn);\n\n // Initialize CSS var if missing\n if (!getComputedStyle(editor.container).getPropertyValue('--mz-accent').trim()) {\n const seed = colors[0] || opts?.defaults?.[0] || '#8b5cf6';\n setAccent(editor, seed, indicator);\n }\n // Always sync the indicator to the current accent\n indicator.style.background = currentAccent();\n };\n}\n\n// Minimal CSS you can inject once in your app\nexport const accentSwatchStyles = `\n.mz-accent-pop {\n width: 280px; max-width: calc(100vw - 24px);\n background: var(--mz-pop-bg, #1a1e24);\n border: 1px solid var(--mz-pop-bd, #333);\n border-radius: 10px;\n box-shadow: 0 4px 16px rgba(0,0,0,.35);\n z-index: 10000;\n padding: 8px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n color: var(--mz-pop-fg, #e7e7e7);\n}\n.mz-accent-grid { display: grid; grid-template-columns: repeat(auto-fill, 28px); gap: 8px; padding: 6px; }\n.mz-swatch {\n width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--mz-pop-bd, #333);\n background: var(--sw, #777); cursor: pointer; box-shadow: inset 0 0 0 2px rgba(0,0,0,.2);\n transition: transform .1s;\n}\n.mz-swatch:hover { transform: scale(1.15); }\n.mz-swatch.sel { outline: 2px solid var(--mz-accent, #8b5cf6); outline-offset: 2px; }\n.mz-swatch-add { background: linear-gradient(135deg, #222, #2b2f36); color: #e7e7e7;\n display:flex; align-items:center; justify-content:center; font-weight:700; font-size:16px; }\n.mz-accent-row { display:flex; gap:8px; padding: 6px; }\n.mz-accent-row button {\n flex:1; padding:6px 8px; border-radius:8px; border:1px solid var(--mz-bd, #2b2f36);\n background: var(--mz-btn-bg, #1a1e24); color: var(--mz-btn-fg, #e7e7e7); cursor:pointer;\n font-size: 13px; transition: background .15s;\n}\n.mz-accent-row button:hover { background: var(--mz-btn-hover, #2b2f36); }\n.mz-accent-hint { font-size: 12px; opacity: .7; padding: 0 6px 6px; }\n`;"],"names":["LS_KEY","normHex","hex","h","c","load","save","arr","pickWithEyedropper","anyWin","res","hexToRgba","alpha","r","g","b","setAccent","editor","btnIndicator","accentSwatchPlugin","opts","max","title","bar","btn","indicator","pop","colors","x","currentAccent","v","ensureFront","closePop","outsideClose","e","render","grid","cur","i","sw","plus","input","useCur","reset","openPop","row","hint","seed","accentSwatchStyles"],"mappings":"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"}
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Collection of plugins that extend Marzipan's functionality.
|
|
5
5
|
*/
|
|
6
|
-
export { accentSwatchPlugin, accentSwatchStyles } from './accentSwatchPlugin';
|
|
7
6
|
export { imageManagerPlugin, imageManagerStyles } from './imageManagerPlugin';
|
|
8
7
|
export { imagePickerPlugin } from './imagePickerPlugin';
|
|
9
8
|
export type { ImagePickerOptions } from './imagePicker';
|
|
@@ -17,6 +16,7 @@ export { tableGeneratorPlugin } from './tableGenerator';
|
|
|
17
16
|
export { tinyHighlightPlugin, tinyHighlightStyles } from './tinyHighlight';
|
|
18
17
|
export type { MarzipanLike } from './tinyHighlight';
|
|
19
18
|
export { buildTableMarkdown, resolvePositiveInteger } from './utils/table';
|
|
19
|
+
export type { TableBuildOptions, ColumnAlignment, TableStyle, BorderStyle } from './utils/table';
|
|
20
20
|
export { imagePickerPlugin as coreImagePickerPlugin } from './imagePicker';
|
|
21
21
|
export type { ImagePickerOptions as CoreImagePickerOptions } from './imagePicker';
|
|
22
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjG,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/plugins/index.js
CHANGED
|
@@ -1,30 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { imagePickerPlugin as H } from "./imagePicker.js";
|
|
1
|
+
import { imageManagerPlugin as i, imageManagerStyles as o } from "./imageManagerPlugin.js";
|
|
2
|
+
import { imagePickerPlugin as l } from "./imagePickerPlugin.js";
|
|
3
|
+
import { mermaidPlugin as g } from "./mermaidPlugin.js";
|
|
4
|
+
import { mermaidExternalPlugin as n } from "./mermaidExternal.js";
|
|
5
|
+
import { tablePlugin as u } from "./tablePlugin.js";
|
|
6
|
+
import { tableGridPlugin as f, tableGridStyles as p } from "./tableGridPlugin.js";
|
|
7
|
+
import { tableGeneratorPlugin as b } from "./tableGenerator.js";
|
|
8
|
+
import { tinyHighlightPlugin as y, tinyHighlightStyles as c } from "./tinyHighlight.js";
|
|
9
|
+
import { b as k, r as G } from "../table-CJHCBhPo.js";
|
|
10
|
+
import { imagePickerPlugin as S } from "./imagePicker.js";
|
|
12
11
|
export {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
S as tinyHighlightPlugin,
|
|
28
|
-
k as tinyHighlightStyles
|
|
12
|
+
k as buildTableMarkdown,
|
|
13
|
+
S as coreImagePickerPlugin,
|
|
14
|
+
i as imageManagerPlugin,
|
|
15
|
+
o as imageManagerStyles,
|
|
16
|
+
l as imagePickerPlugin,
|
|
17
|
+
n as mermaidExternalPlugin,
|
|
18
|
+
g as mermaidPlugin,
|
|
19
|
+
G as resolvePositiveInteger,
|
|
20
|
+
b as tableGeneratorPlugin,
|
|
21
|
+
f as tableGridPlugin,
|
|
22
|
+
p as tableGridStyles,
|
|
23
|
+
u as tablePlugin,
|
|
24
|
+
y as tinyHighlightPlugin,
|
|
25
|
+
c as tinyHighlightStyles
|
|
29
26
|
};
|
|
30
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as a, b as c } from "../table-
|
|
1
|
+
import { r as a, b as c } from "../table-CJHCBhPo.js";
|
|
2
2
|
function l(n, r) {
|
|
3
3
|
const t = n.textarea, e = t.selectionStart ?? 0, o = t.selectionEnd ?? 0;
|
|
4
4
|
t.setRangeText(r, e, o, "end"), n.updatePreview?.(), t.focus();
|
|
@@ -11,6 +11,6 @@ export interface TableGridPluginOptions {
|
|
|
11
11
|
title?: string;
|
|
12
12
|
}
|
|
13
13
|
export declare function tableGridPlugin(opts?: TableGridPluginOptions): (editor: MzEditor) => void;
|
|
14
|
-
export declare const tableGridStyles = "\n.mz-pop {\n position: absolute; z-index: 9999; user-select: none;\n background: var(--mz-pop-bg, #111); color: var(--mz-pop-fg, #eee);\n border: 1px solid var(--mz-pop-bd, #333); border-radius: 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,.35); padding: 10px;\n}\n.mz-tablegrid {\n display: grid; grid-template-rows: repeat(var(--r), 16px);\n grid-template-columns: repeat(var(--c), 16px);\n gap: 4px; margin: 4px;\n}\n.mz-tablegrid .mz-cell {\n width: 16px; height: 16px; border-radius: 4px;\n background: var(--mz-cell-bg, #1d1f23); border: 1px solid var(--mz-cell-bd, #2b2f36);\n}\n.mz-tablegrid .mz-cell.sel {\n background: var(--mz-cell-sel-bg, #2f6feb); border-color: var(--mz-cell-sel-bd, #3b82f6);\n}\n.mz-tablegrid-status { font-size: 12px; opacity: .8; padding: 6px 4px 2px; text-align: center; }\n.mz-btn { cursor: pointer; }\n";
|
|
14
|
+
export declare const tableGridStyles = "\n.mz-pop {\n position: absolute; z-index: 9999; user-select: none;\n background: var(--mz-pop-bg, #111); color: var(--mz-pop-fg, #eee);\n border: 1px solid var(--mz-pop-bd, #333); border-radius: 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,.35); padding: 10px;\n}\n.mz-tablegrid {\n display: grid; grid-template-rows: repeat(var(--r), 16px);\n grid-template-columns: repeat(var(--c), 16px);\n gap: 4px; margin: 4px;\n}\n.mz-tablegrid .mz-cell {\n width: 16px; height: 16px; border-radius: 4px;\n background: var(--mz-cell-bg, #1d1f23); border: 1px solid var(--mz-cell-bd, #2b2f36);\n}\n.mz-tablegrid .mz-cell.sel {\n background: var(--mz-cell-sel-bg, #2f6feb); border-color: var(--mz-cell-sel-bd, #3b82f6);\n}\n.mz-tablegrid-status { font-size: 12px; opacity: .8; padding: 6px 4px 2px; text-align: center; }\n.mz-btn { cursor: pointer; }\n.mz-table-options {\n border-top: 1px solid var(--mz-pop-bd, #333);\n margin-top: 8px; padding-top: 8px;\n display: flex; flex-direction: column; gap: 6px;\n}\n.mz-opt-row {\n display: flex; align-items: center; gap: 8px;\n}\n.mz-opt-label {\n font-size: 11px; font-weight: 600; opacity: 0.6;\n min-width: 42px; text-transform: uppercase; letter-spacing: 0.5px;\n}\n.mz-opt-group {\n display: flex; gap: 3px; flex-wrap: wrap;\n}\n.mz-opt-btn {\n background: var(--mz-cell-bg, #1d1f23);\n border: 1px solid var(--mz-cell-bd, #2b2f36);\n color: var(--mz-pop-fg, #ccc);\n border-radius: 5px; padding: 2px 7px; font-size: 11px;\n cursor: pointer; transition: all 0.15s ease;\n font-family: inherit; line-height: 1.4;\n}\n.mz-opt-btn:hover {\n border-color: #555; background: #252830;\n}\n.mz-opt-btn.active {\n background: var(--accent, #2f6feb);\n border-color: var(--accent, #3b82f6);\n color: #fff; font-weight: 600;\n}\n.mz-opt-style { font-size: 10px; }\n";
|
|
15
15
|
export {};
|
|
16
16
|
//# sourceMappingURL=tableGridPlugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tableGridPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/tableGridPlugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tableGridPlugin.d.ts","sourceRoot":"","sources":["../../src/plugins/tableGridPlugin.ts"],"names":[],"mappings":"AAOA,KAAK,QAAQ,GAAG;IACd,SAAS,EAAE,WAAW,CAAC;IACvB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmCD,wBAAgB,eAAe,CAAC,IAAI,GAAE,sBAA2B,IAMvD,QAAQ,QAAQ,UAgLzB;AAgBD,eAAO,MAAM,eAAe,iyDAqD3B,CAAC"}
|
|
@@ -1,54 +1,123 @@
|
|
|
1
|
-
import { b as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { b as O } from "../table-CJHCBhPo.js";
|
|
2
|
+
const R = "marzipan.table.prefs";
|
|
3
|
+
function T() {
|
|
4
|
+
try {
|
|
5
|
+
const o = localStorage.getItem(R);
|
|
6
|
+
if (o) return { ...P(), ...JSON.parse(o) };
|
|
7
|
+
} catch {
|
|
8
|
+
}
|
|
9
|
+
return P();
|
|
10
|
+
}
|
|
11
|
+
function z(o) {
|
|
12
|
+
try {
|
|
13
|
+
localStorage.setItem(R, JSON.stringify(o));
|
|
14
|
+
} catch {
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function P() {
|
|
18
|
+
return { alignment: "left", style: "default", borderStyle: "solid" };
|
|
19
|
+
}
|
|
20
|
+
function q(o, s) {
|
|
21
|
+
const c = o.textarea, d = c.selectionStart ?? 0, u = c.selectionEnd ?? 0;
|
|
22
|
+
c.setRangeText(s, d, u, "end"), o.updatePreview(), c.focus();
|
|
23
|
+
}
|
|
24
|
+
function Y(o = {}) {
|
|
25
|
+
const s = Math.max(1, o.maxRows ?? 10), c = Math.max(1, o.maxColumns ?? o.maxCols ?? 10), d = o.label ?? "▦", u = o.title ?? "Insert table";
|
|
26
|
+
return (f) => {
|
|
27
|
+
const A = f.container.querySelector(".marzipan-toolbar") ?? f.container, r = T(), i = document.createElement("button");
|
|
28
|
+
i.type = "button", i.className = "marzipan-toolbar-button mz-btn-tablegrid", i.title = u, i.textContent = d, i.setAttribute("aria-label", u);
|
|
29
|
+
let l = null, y = 0, g = 0;
|
|
30
|
+
function p() {
|
|
31
|
+
l?.remove(), l = null, document.removeEventListener("click", v, !0), window.removeEventListener("resize", p), window.removeEventListener("scroll", p, !0);
|
|
14
32
|
}
|
|
15
|
-
function
|
|
16
|
-
|
|
33
|
+
function v(a) {
|
|
34
|
+
l && (a.target instanceof Node && (l.contains(a.target) || i.contains(a.target)) || p());
|
|
17
35
|
}
|
|
18
|
-
function
|
|
19
|
-
if (
|
|
20
|
-
|
|
36
|
+
function M() {
|
|
37
|
+
if (y < 1 || g < 1) return;
|
|
38
|
+
const a = Array(g).fill(r.alignment), m = O({
|
|
39
|
+
rows: y,
|
|
40
|
+
cols: g,
|
|
41
|
+
alignment: a,
|
|
42
|
+
style: r.style,
|
|
43
|
+
borderStyle: r.borderStyle
|
|
44
|
+
});
|
|
45
|
+
q(f, `
|
|
46
|
+
${m}
|
|
47
|
+
`), p();
|
|
48
|
+
}
|
|
49
|
+
function B() {
|
|
50
|
+
if (l) {
|
|
51
|
+
p();
|
|
21
52
|
return;
|
|
22
53
|
}
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
54
|
+
l = document.createElement("div"), l.className = "mz-pop mz-tablegrid-pop";
|
|
55
|
+
const a = document.createElement("div");
|
|
56
|
+
a.className = "mz-tablegrid", a.style.setProperty("--r", String(s)), a.style.setProperty("--c", String(c));
|
|
26
57
|
const m = document.createElement("div");
|
|
27
|
-
m.className = "mz-tablegrid-status", m.textContent = "
|
|
28
|
-
for (let
|
|
29
|
-
for (let
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
m.textContent = `${
|
|
33
|
-
const
|
|
34
|
-
|
|
58
|
+
m.className = "mz-tablegrid-status", m.textContent = "Hover to select size";
|
|
59
|
+
for (let t = 1; t <= s; t++)
|
|
60
|
+
for (let e = 1; e <= c; e++) {
|
|
61
|
+
const n = document.createElement("div");
|
|
62
|
+
n.className = "mz-cell", n.dataset.r = String(t), n.dataset.c = String(e), n.onmouseenter = () => {
|
|
63
|
+
y = t, g = e, m.textContent = `${t} × ${e}`, a.querySelectorAll(".mz-cell").forEach((x) => {
|
|
64
|
+
const $ = Number(x.dataset.r), I = Number(x.dataset.c);
|
|
65
|
+
x.classList.toggle("sel", $ <= t && I <= e);
|
|
35
66
|
});
|
|
36
|
-
},
|
|
37
|
-
C(u, `
|
|
38
|
-
${h(l, s)}
|
|
39
|
-
`), a();
|
|
40
|
-
}, t.appendChild(i);
|
|
67
|
+
}, n.onclick = () => M(), a.appendChild(n);
|
|
41
68
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
69
|
+
l.appendChild(a), l.appendChild(m);
|
|
70
|
+
const b = document.createElement("div");
|
|
71
|
+
b.className = "mz-table-options";
|
|
72
|
+
const w = h("Align"), k = [];
|
|
73
|
+
["left", "center", "right"].forEach((t) => {
|
|
74
|
+
const e = document.createElement("button");
|
|
75
|
+
e.type = "button", e.className = "mz-opt-btn" + (r.alignment === t ? " active" : ""), e.textContent = t === "left" ? "⬅" : t === "center" ? "⬌" : "➡", e.title = t.charAt(0).toUpperCase() + t.slice(1) + " align", e.onclick = () => {
|
|
76
|
+
r.alignment = t, z(r), k.forEach((n) => n.classList.toggle("active", n === e));
|
|
77
|
+
}, k.push(e), w.content.appendChild(e);
|
|
78
|
+
}), b.appendChild(w.row);
|
|
79
|
+
const C = h("Style"), E = [];
|
|
80
|
+
[
|
|
81
|
+
{ key: "default", label: "Default", color: "#888" },
|
|
82
|
+
{ key: "striped", label: "Striped", color: "#6366f1" },
|
|
83
|
+
{ key: "rainbow", label: "Rainbow", color: "#ec4899" },
|
|
84
|
+
{ key: "minimal", label: "Minimal", color: "#06b6d4" }
|
|
85
|
+
].forEach((t) => {
|
|
86
|
+
const e = document.createElement("button");
|
|
87
|
+
e.type = "button", e.className = "mz-opt-btn mz-opt-style" + (r.style === t.key ? " active" : ""), e.textContent = t.label, e.title = t.label + " table style", e.style.setProperty("--accent", t.color), e.onclick = () => {
|
|
88
|
+
r.style = t.key, z(r), E.forEach((n) => n.classList.toggle("active", n === e));
|
|
89
|
+
}, E.push(e), C.content.appendChild(e);
|
|
90
|
+
}), b.appendChild(C.row);
|
|
91
|
+
const S = h("Border"), N = [];
|
|
92
|
+
[
|
|
93
|
+
{ key: "solid", label: "━━" },
|
|
94
|
+
{ key: "dashed", label: "╌╌" },
|
|
95
|
+
{ key: "dotted", label: "┈┈" },
|
|
96
|
+
{ key: "double", label: "══" },
|
|
97
|
+
{ key: "none", label: "⊘" }
|
|
98
|
+
].forEach((t) => {
|
|
99
|
+
const e = document.createElement("button");
|
|
100
|
+
e.type = "button", e.className = "mz-opt-btn" + (r.borderStyle === t.key ? " active" : ""), e.textContent = t.label, e.title = t.key.charAt(0).toUpperCase() + t.key.slice(1) + " border", e.onclick = () => {
|
|
101
|
+
r.borderStyle = t.key, z(r), N.forEach((n) => n.classList.toggle("active", n === e));
|
|
102
|
+
}, N.push(e), S.content.appendChild(e);
|
|
103
|
+
}), b.appendChild(S.row), l.appendChild(b), document.body.appendChild(l);
|
|
104
|
+
const L = i.getBoundingClientRect();
|
|
105
|
+
l.style.left = `${Math.round(window.scrollX + L.left)}px`, l.style.top = `${Math.round(window.scrollY + L.bottom + 6)}px`, setTimeout(() => {
|
|
106
|
+
document.addEventListener("click", v, !0), window.addEventListener("resize", p), window.addEventListener("scroll", p, !0);
|
|
46
107
|
}, 0);
|
|
47
108
|
}
|
|
48
|
-
|
|
109
|
+
i.onclick = B, A.appendChild(i);
|
|
49
110
|
};
|
|
50
111
|
}
|
|
51
|
-
|
|
112
|
+
function h(o) {
|
|
113
|
+
const s = document.createElement("div");
|
|
114
|
+
s.className = "mz-opt-row";
|
|
115
|
+
const c = document.createElement("span");
|
|
116
|
+
c.className = "mz-opt-label", c.textContent = o;
|
|
117
|
+
const d = document.createElement("div");
|
|
118
|
+
return d.className = "mz-opt-group", s.appendChild(c), s.appendChild(d), { row: s, content: d };
|
|
119
|
+
}
|
|
120
|
+
const D = `
|
|
52
121
|
.mz-pop {
|
|
53
122
|
position: absolute; z-index: 9999; user-select: none;
|
|
54
123
|
background: var(--mz-pop-bg, #111); color: var(--mz-pop-fg, #eee);
|
|
@@ -69,9 +138,41 @@ const k = `
|
|
|
69
138
|
}
|
|
70
139
|
.mz-tablegrid-status { font-size: 12px; opacity: .8; padding: 6px 4px 2px; text-align: center; }
|
|
71
140
|
.mz-btn { cursor: pointer; }
|
|
141
|
+
.mz-table-options {
|
|
142
|
+
border-top: 1px solid var(--mz-pop-bd, #333);
|
|
143
|
+
margin-top: 8px; padding-top: 8px;
|
|
144
|
+
display: flex; flex-direction: column; gap: 6px;
|
|
145
|
+
}
|
|
146
|
+
.mz-opt-row {
|
|
147
|
+
display: flex; align-items: center; gap: 8px;
|
|
148
|
+
}
|
|
149
|
+
.mz-opt-label {
|
|
150
|
+
font-size: 11px; font-weight: 600; opacity: 0.6;
|
|
151
|
+
min-width: 42px; text-transform: uppercase; letter-spacing: 0.5px;
|
|
152
|
+
}
|
|
153
|
+
.mz-opt-group {
|
|
154
|
+
display: flex; gap: 3px; flex-wrap: wrap;
|
|
155
|
+
}
|
|
156
|
+
.mz-opt-btn {
|
|
157
|
+
background: var(--mz-cell-bg, #1d1f23);
|
|
158
|
+
border: 1px solid var(--mz-cell-bd, #2b2f36);
|
|
159
|
+
color: var(--mz-pop-fg, #ccc);
|
|
160
|
+
border-radius: 5px; padding: 2px 7px; font-size: 11px;
|
|
161
|
+
cursor: pointer; transition: all 0.15s ease;
|
|
162
|
+
font-family: inherit; line-height: 1.4;
|
|
163
|
+
}
|
|
164
|
+
.mz-opt-btn:hover {
|
|
165
|
+
border-color: #555; background: #252830;
|
|
166
|
+
}
|
|
167
|
+
.mz-opt-btn.active {
|
|
168
|
+
background: var(--accent, #2f6feb);
|
|
169
|
+
border-color: var(--accent, #3b82f6);
|
|
170
|
+
color: #fff; font-weight: 600;
|
|
171
|
+
}
|
|
172
|
+
.mz-opt-style { font-size: 10px; }
|
|
72
173
|
`;
|
|
73
174
|
export {
|
|
74
|
-
|
|
75
|
-
|
|
175
|
+
Y as tableGridPlugin,
|
|
176
|
+
D as tableGridStyles
|
|
76
177
|
};
|
|
77
178
|
//# sourceMappingURL=tableGridPlugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tableGridPlugin.js","sources":["../../src/plugins/tableGridPlugin.ts"],"sourcesContent":["// plugins/tableGridPlugin.ts\n// Zero-dep \"grid popover\" table inserter (like Notion). GFM markdown output.\n\nimport { buildTableMarkdown } from './utils/table';\n\ntype MzEditor = {\n container: HTMLElement;\n textarea: HTMLTextAreaElement;\n updatePreview: () => void;\n};\n\nexport interface TableGridPluginOptions {\n maxRows?: number;\n maxColumns?: number;\n maxCols?: number;\n label?: string;\n title?: string;\n}\n\nfunction insertAtCursor(editor: MzEditor, text: string) {\n const ta = editor.textarea;\n const s = ta.selectionStart ?? 0;\n const e = ta.selectionEnd ?? 0;\n ta.setRangeText(text, s, e, 'end');\n editor.updatePreview();\n ta.focus();\n}\n\nexport function tableGridPlugin(opts: TableGridPluginOptions = {}) {\n const resolvedMaxRows = Math.max(1, opts.maxRows ?? 10);\n const resolvedMaxCols = Math.max(1, opts.maxColumns ?? opts.maxCols ?? 10);\n const label = opts.label ?? '▦';\n const title = opts.title ?? 'Insert table';\n\n return (editor: MzEditor) => {\n const bar = editor.container.querySelector('.marzipan-toolbar') as HTMLElement ?? editor.container;\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'marzipan-toolbar-button mz-btn-tablegrid';\n btn.title = title;\n btn.textContent = label;\n btn.setAttribute('aria-label', title);\n\n let pop: HTMLElement | null = null;\n\n function closePop() {\n pop?.remove();\n pop = null;\n document.removeEventListener('click', outsideClose, true);\n window.removeEventListener('resize', closePop);\n window.removeEventListener('scroll', closePop, true);\n }\n\n function outsideClose(e: MouseEvent) {\n if (!pop) return;\n if (e.target instanceof Node && (pop.contains(e.target) || btn.contains(e.target))) return;\n closePop();\n }\n\n function openPop() {\n if (pop) { closePop(); return; }\n\n pop = document.createElement('div');\n pop.className = 'mz-pop mz-tablegrid-pop';\n\n const grid = document.createElement('div');\n grid.className = 'mz-tablegrid';\n grid.style.setProperty('--r', String(resolvedMaxRows));\n grid.style.setProperty('--c', String(resolvedMaxCols));\n\n const status = document.createElement('div');\n status.className = 'mz-tablegrid-status';\n status.textContent = '0 × 0';\n\n for (let r = 1; r <= resolvedMaxRows; r++) {\n for (let c = 1; c <= resolvedMaxCols; c++) {\n const cell = document.createElement('div');\n cell.className = 'mz-cell';\n cell.dataset.r = String(r);\n cell.dataset.c = String(c);\n cell.onmouseenter = () => {\n status.textContent = `${r} × ${c}`;\n // highlight\n grid.querySelectorAll<HTMLElement>('.mz-cell').forEach(el => {\n const rr = Number(el.dataset.r), cc = Number(el.dataset.c);\n el.classList.toggle('sel', rr <= r && cc <= c);\n });\n };\n cell.onclick = () => {\n insertAtCursor(editor, `\\n${buildTableMarkdown(r, c)}\\n`);\n closePop();\n };\n grid.appendChild(cell);\n }\n }\n\n pop.appendChild(grid);\n pop.appendChild(status);\n document.body.appendChild(pop);\n\n // position under button\n const br = btn.getBoundingClientRect();\n pop.style.left = `${Math.round(window.scrollX + br.left)}px`;\n pop.style.top = `${Math.round(window.scrollY + br.bottom + 6)}px`;\n\n setTimeout(() => {\n document.addEventListener('click', outsideClose, true);\n window.addEventListener('resize', closePop);\n window.addEventListener('scroll', closePop, true);\n }, 0);\n }\n\n btn.onclick = openPop;\n bar.appendChild(btn);\n };\n}\n\n// Minimal styles (inject once in your app)\nexport const tableGridStyles = `\n.mz-pop {\n position: absolute; z-index: 9999; user-select: none;\n background: var(--mz-pop-bg, #111); color: var(--mz-pop-fg, #eee);\n border: 1px solid var(--mz-pop-bd, #333); border-radius: 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,.35); padding: 10px;\n}\n.mz-tablegrid {\n display: grid; grid-template-rows: repeat(var(--r), 16px);\n grid-template-columns: repeat(var(--c), 16px);\n gap: 4px; margin: 4px;\n}\n.mz-tablegrid .mz-cell {\n width: 16px; height: 16px; border-radius: 4px;\n background: var(--mz-cell-bg, #1d1f23); border: 1px solid var(--mz-cell-bd, #2b2f36);\n}\n.mz-tablegrid .mz-cell.sel {\n background: var(--mz-cell-sel-bg, #2f6feb); border-color: var(--mz-cell-sel-bd, #3b82f6);\n}\n.mz-tablegrid-status { font-size: 12px; opacity: .8; padding: 6px 4px 2px; text-align: center; }\n.mz-btn { cursor: pointer; }\n`;\n"],"names":["insertAtCursor","editor","text","ta","s","e","tableGridPlugin","opts","resolvedMaxRows","resolvedMaxCols","label","title","bar","btn","pop","closePop","outsideClose","openPop","grid","status","r","c","cell","el","rr","cc","buildTableMarkdown","br","tableGridStyles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tableGridPlugin.js","sources":["../../src/plugins/tableGridPlugin.ts"],"sourcesContent":["// plugins/tableGridPlugin.ts\n// Zero-dep \"grid popover\" table inserter (like Notion). GFM markdown output.\n// Enhanced with alignment, style presets, and border style options.\n\nimport { buildTableMarkdown } from './utils/table';\nimport type { ColumnAlignment, TableStyle, BorderStyle } from './utils/table';\n\ntype MzEditor = {\n container: HTMLElement;\n textarea: HTMLTextAreaElement;\n updatePreview: () => void;\n};\n\nexport interface TableGridPluginOptions {\n maxRows?: number;\n maxColumns?: number;\n maxCols?: number;\n label?: string;\n title?: string;\n}\n\nconst LS_KEY = 'marzipan.table.prefs';\n\ninterface TablePrefs {\n alignment: ColumnAlignment;\n style: TableStyle;\n borderStyle: BorderStyle;\n}\n\nfunction loadPrefs(): TablePrefs {\n try {\n const raw = localStorage.getItem(LS_KEY);\n if (raw) return { ...defaultPrefs(), ...JSON.parse(raw) };\n } catch { /* noop */ }\n return defaultPrefs();\n}\n\nfunction savePrefs(p: TablePrefs) {\n try { localStorage.setItem(LS_KEY, JSON.stringify(p)); } catch { /* noop */ }\n}\n\nfunction defaultPrefs(): TablePrefs {\n return { alignment: 'left', style: 'default', borderStyle: 'solid' };\n}\n\nfunction insertAtCursor(editor: MzEditor, text: string) {\n const ta = editor.textarea;\n const s = ta.selectionStart ?? 0;\n const e = ta.selectionEnd ?? 0;\n ta.setRangeText(text, s, e, 'end');\n editor.updatePreview();\n ta.focus();\n}\n\nexport function tableGridPlugin(opts: TableGridPluginOptions = {}) {\n const resolvedMaxRows = Math.max(1, opts.maxRows ?? 10);\n const resolvedMaxCols = Math.max(1, opts.maxColumns ?? opts.maxCols ?? 10);\n const label = opts.label ?? '▦';\n const title = opts.title ?? 'Insert table';\n\n return (editor: MzEditor) => {\n const bar = editor.container.querySelector('.marzipan-toolbar') as HTMLElement ?? editor.container;\n const prefs = loadPrefs();\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'marzipan-toolbar-button mz-btn-tablegrid';\n btn.title = title;\n btn.textContent = label;\n btn.setAttribute('aria-label', title);\n\n let pop: HTMLElement | null = null;\n let selectedRows = 0;\n let selectedCols = 0;\n\n function closePop() {\n pop?.remove();\n pop = null;\n document.removeEventListener('click', outsideClose, true);\n window.removeEventListener('resize', closePop);\n window.removeEventListener('scroll', closePop, true);\n }\n\n function outsideClose(e: MouseEvent) {\n if (!pop) return;\n if (e.target instanceof Node && (pop.contains(e.target) || btn.contains(e.target))) return;\n closePop();\n }\n\n function doInsert() {\n if (selectedRows < 1 || selectedCols < 1) return;\n const alignArr: ColumnAlignment[] = Array(selectedCols).fill(prefs.alignment);\n const md = buildTableMarkdown({\n rows: selectedRows,\n cols: selectedCols,\n alignment: alignArr,\n style: prefs.style,\n borderStyle: prefs.borderStyle,\n });\n insertAtCursor(editor, `\\n${md}\\n`);\n closePop();\n }\n\n function openPop() {\n if (pop) { closePop(); return; }\n\n pop = document.createElement('div');\n pop.className = 'mz-pop mz-tablegrid-pop';\n\n // --- Grid section ---\n const grid = document.createElement('div');\n grid.className = 'mz-tablegrid';\n grid.style.setProperty('--r', String(resolvedMaxRows));\n grid.style.setProperty('--c', String(resolvedMaxCols));\n\n const status = document.createElement('div');\n status.className = 'mz-tablegrid-status';\n status.textContent = 'Hover to select size';\n\n for (let r = 1; r <= resolvedMaxRows; r++) {\n for (let c = 1; c <= resolvedMaxCols; c++) {\n const cell = document.createElement('div');\n cell.className = 'mz-cell';\n cell.dataset.r = String(r);\n cell.dataset.c = String(c);\n cell.onmouseenter = () => {\n selectedRows = r;\n selectedCols = c;\n status.textContent = `${r} × ${c}`;\n grid.querySelectorAll<HTMLElement>('.mz-cell').forEach(el => {\n const rr = Number(el.dataset.r), cc = Number(el.dataset.c);\n el.classList.toggle('sel', rr <= r && cc <= c);\n });\n };\n cell.onclick = () => doInsert();\n grid.appendChild(cell);\n }\n }\n\n pop.appendChild(grid);\n pop.appendChild(status);\n\n // --- Options section ---\n const optionsSection = document.createElement('div');\n optionsSection.className = 'mz-table-options';\n\n // Alignment row\n const alignRow = makeOptionRow('Align');\n const alignBtns: HTMLButtonElement[] = [];\n (['left', 'center', 'right'] as ColumnAlignment[]).forEach(a => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'mz-opt-btn' + (prefs.alignment === a ? ' active' : '');\n b.textContent = a === 'left' ? '⬅' : a === 'center' ? '⬌' : '➡';\n b.title = a.charAt(0).toUpperCase() + a.slice(1) + ' align';\n b.onclick = () => {\n prefs.alignment = a;\n savePrefs(prefs);\n alignBtns.forEach(x => x.classList.toggle('active', x === b));\n };\n alignBtns.push(b);\n alignRow.content.appendChild(b);\n });\n optionsSection.appendChild(alignRow.row);\n\n // Style row\n const styleRow = makeOptionRow('Style');\n const styleBtns: HTMLButtonElement[] = [];\n const styles: { key: TableStyle; label: string; color: string }[] = [\n { key: 'default', label: 'Default', color: '#888' },\n { key: 'striped', label: 'Striped', color: '#6366f1' },\n { key: 'rainbow', label: 'Rainbow', color: '#ec4899' },\n { key: 'minimal', label: 'Minimal', color: '#06b6d4' },\n ];\n styles.forEach(s => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'mz-opt-btn mz-opt-style' + (prefs.style === s.key ? ' active' : '');\n b.textContent = s.label;\n b.title = s.label + ' table style';\n b.style.setProperty('--accent', s.color);\n b.onclick = () => {\n prefs.style = s.key;\n savePrefs(prefs);\n styleBtns.forEach(x => x.classList.toggle('active', x === b));\n };\n styleBtns.push(b);\n styleRow.content.appendChild(b);\n });\n optionsSection.appendChild(styleRow.row);\n\n // Border row\n const borderRow = makeOptionRow('Border');\n const borderBtns: HTMLButtonElement[] = [];\n const borders: { key: BorderStyle; label: string }[] = [\n { key: 'solid', label: '━━' },\n { key: 'dashed', label: '╌╌' },\n { key: 'dotted', label: '┈┈' },\n { key: 'double', label: '══' },\n { key: 'none', label: '⊘' },\n ];\n borders.forEach(bd => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'mz-opt-btn' + (prefs.borderStyle === bd.key ? ' active' : '');\n b.textContent = bd.label;\n b.title = bd.key.charAt(0).toUpperCase() + bd.key.slice(1) + ' border';\n b.onclick = () => {\n prefs.borderStyle = bd.key;\n savePrefs(prefs);\n borderBtns.forEach(x => x.classList.toggle('active', x === b));\n };\n borderBtns.push(b);\n borderRow.content.appendChild(b);\n });\n optionsSection.appendChild(borderRow.row);\n\n pop.appendChild(optionsSection);\n\n document.body.appendChild(pop);\n\n // position under button\n const br = btn.getBoundingClientRect();\n pop.style.left = `${Math.round(window.scrollX + br.left)}px`;\n pop.style.top = `${Math.round(window.scrollY + br.bottom + 6)}px`;\n\n setTimeout(() => {\n document.addEventListener('click', outsideClose, true);\n window.addEventListener('resize', closePop);\n window.addEventListener('scroll', closePop, true);\n }, 0);\n }\n\n btn.onclick = openPop;\n bar.appendChild(btn);\n };\n}\n\nfunction makeOptionRow(label: string) {\n const row = document.createElement('div');\n row.className = 'mz-opt-row';\n const lbl = document.createElement('span');\n lbl.className = 'mz-opt-label';\n lbl.textContent = label;\n const content = document.createElement('div');\n content.className = 'mz-opt-group';\n row.appendChild(lbl);\n row.appendChild(content);\n return { row, content };\n}\n\n// Minimal styles (inject once in your app)\nexport const tableGridStyles = `\n.mz-pop {\n position: absolute; z-index: 9999; user-select: none;\n background: var(--mz-pop-bg, #111); color: var(--mz-pop-fg, #eee);\n border: 1px solid var(--mz-pop-bd, #333); border-radius: 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,.35); padding: 10px;\n}\n.mz-tablegrid {\n display: grid; grid-template-rows: repeat(var(--r), 16px);\n grid-template-columns: repeat(var(--c), 16px);\n gap: 4px; margin: 4px;\n}\n.mz-tablegrid .mz-cell {\n width: 16px; height: 16px; border-radius: 4px;\n background: var(--mz-cell-bg, #1d1f23); border: 1px solid var(--mz-cell-bd, #2b2f36);\n}\n.mz-tablegrid .mz-cell.sel {\n background: var(--mz-cell-sel-bg, #2f6feb); border-color: var(--mz-cell-sel-bd, #3b82f6);\n}\n.mz-tablegrid-status { font-size: 12px; opacity: .8; padding: 6px 4px 2px; text-align: center; }\n.mz-btn { cursor: pointer; }\n.mz-table-options {\n border-top: 1px solid var(--mz-pop-bd, #333);\n margin-top: 8px; padding-top: 8px;\n display: flex; flex-direction: column; gap: 6px;\n}\n.mz-opt-row {\n display: flex; align-items: center; gap: 8px;\n}\n.mz-opt-label {\n font-size: 11px; font-weight: 600; opacity: 0.6;\n min-width: 42px; text-transform: uppercase; letter-spacing: 0.5px;\n}\n.mz-opt-group {\n display: flex; gap: 3px; flex-wrap: wrap;\n}\n.mz-opt-btn {\n background: var(--mz-cell-bg, #1d1f23);\n border: 1px solid var(--mz-cell-bd, #2b2f36);\n color: var(--mz-pop-fg, #ccc);\n border-radius: 5px; padding: 2px 7px; font-size: 11px;\n cursor: pointer; transition: all 0.15s ease;\n font-family: inherit; line-height: 1.4;\n}\n.mz-opt-btn:hover {\n border-color: #555; background: #252830;\n}\n.mz-opt-btn.active {\n background: var(--accent, #2f6feb);\n border-color: var(--accent, #3b82f6);\n color: #fff; font-weight: 600;\n}\n.mz-opt-style { font-size: 10px; }\n`;\n"],"names":["LS_KEY","loadPrefs","raw","defaultPrefs","savePrefs","p","insertAtCursor","editor","text","ta","s","e","tableGridPlugin","opts","resolvedMaxRows","resolvedMaxCols","label","title","bar","prefs","btn","pop","selectedRows","selectedCols","closePop","outsideClose","doInsert","alignArr","md","buildTableMarkdown","openPop","grid","status","r","c","cell","el","rr","cc","optionsSection","alignRow","makeOptionRow","alignBtns","a","b","x","styleRow","styleBtns","borderRow","borderBtns","bd","br","row","lbl","content","tableGridStyles"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as i, b as f } from "../table-
|
|
1
|
+
import { r as i, b as f } from "../table-CJHCBhPo.js";
|
|
2
2
|
function p(t, o) {
|
|
3
3
|
const e = t.textarea, l = e.selectionStart ?? 0, r = e.selectionEnd ?? 0;
|
|
4
4
|
e.setRangeText(o, l, r, "end"), t.updatePreview?.(), e.focus();
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type ColumnAlignment = 'left' | 'center' | 'right';
|
|
2
|
+
export type TableStyle = 'default' | 'striped' | 'rainbow' | 'minimal';
|
|
3
|
+
export type BorderStyle = 'solid' | 'dashed' | 'dotted' | 'double' | 'none';
|
|
4
|
+
export interface TableBuildOptions {
|
|
5
|
+
rows: number;
|
|
6
|
+
cols: number;
|
|
7
|
+
headers?: string[];
|
|
8
|
+
alignment?: ColumnAlignment[];
|
|
9
|
+
style?: TableStyle;
|
|
10
|
+
borderStyle?: BorderStyle;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildTableMarkdown(rowsOrOpts: number | TableBuildOptions, colsArg?: number): string;
|
|
2
13
|
export declare function resolvePositiveInteger(value: string | null, fallback: number): number | null;
|
|
3
14
|
//# sourceMappingURL=table.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/plugins/utils/table.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/plugins/utils/table.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AACvE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAoCnG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB5F"}
|
|
@@ -1,12 +1,37 @@
|
|
|
1
|
-
export function buildTableMarkdown(
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export function buildTableMarkdown(rowsOrOpts, colsArg) {
|
|
2
|
+
let opts;
|
|
3
|
+
if (typeof rowsOrOpts === 'number') {
|
|
4
|
+
opts = { rows: rowsOrOpts, cols: colsArg ?? 2 };
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
opts = rowsOrOpts;
|
|
8
|
+
}
|
|
9
|
+
const safeRows = Math.max(1, Math.floor(opts.rows));
|
|
10
|
+
const safeCols = Math.max(1, Math.floor(opts.cols));
|
|
11
|
+
const headers = opts.headers ?? Array.from({ length: safeCols }, (_, i) => `Header ${i + 1}`);
|
|
12
|
+
const alignment = opts.alignment ?? Array(safeCols).fill('left');
|
|
13
|
+
const headerRow = headers.slice(0, safeCols).map(h => h || ' ').join(' | ');
|
|
14
|
+
const divider = Array.from({ length: safeCols }, (_, i) => {
|
|
15
|
+
const align = alignment[i] ?? 'left';
|
|
16
|
+
if (align === 'center')
|
|
17
|
+
return ':---:';
|
|
18
|
+
if (align === 'right')
|
|
19
|
+
return '---:';
|
|
20
|
+
return '---';
|
|
21
|
+
}).join(' | ');
|
|
6
22
|
const body = Array.from({ length: safeRows }, () => Array.from({ length: safeCols }, () => ' ').join(' | '))
|
|
7
23
|
.map((row) => `| ${row} |`)
|
|
8
24
|
.join('\n');
|
|
9
|
-
|
|
25
|
+
// Build annotation comment for non-default styles
|
|
26
|
+
let annotation = '';
|
|
27
|
+
const parts = [];
|
|
28
|
+
if (opts.style && opts.style !== 'default')
|
|
29
|
+
parts.push(`style=${opts.style}`);
|
|
30
|
+
if (opts.borderStyle && opts.borderStyle !== 'solid')
|
|
31
|
+
parts.push(`border=${opts.borderStyle}`);
|
|
32
|
+
if (parts.length)
|
|
33
|
+
annotation = `<!-- mz-table: ${parts.join(' ')} -->\n`;
|
|
34
|
+
return `${annotation}| ${headerRow} |\n| ${divider} |\n${body}\n`;
|
|
10
35
|
}
|
|
11
36
|
export function resolvePositiveInteger(value, fallback) {
|
|
12
37
|
if (value === null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/plugins/utils/table.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/plugins/utils/table.ts"],"names":[],"mappings":"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"}
|
package/dist/styles.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AACA;;;GAGG;AAIH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,GAAQ,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AACA;;;GAGG;AAIH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,GAAQ,UAs5B/C"}
|