@haklex/rich-ext-excalidraw 0.1.1 → 0.3.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.
@@ -1 +1,2 @@
1
- :root{--rc-text: #000;--rc-text-secondary: #262626;--rc-text-tertiary: #737373;--rc-text-quaternary: #a3a3a3;--rc-bg: #ffffff;--rc-bg-secondary: #fafafa;--rc-bg-tertiary: #f5f5f5;--rc-fill: #e8e8e8;--rc-fill-secondary: #eeeeee;--rc-fill-tertiary: #f5f5f5;--rc-fill-quaternary: #fafafa;--rc-border: #f5f5f5;--rc-accent: #2563eb;--rc-accent-light: #2563eb20;--rc-link: #2563eb;--rc-code-text: #404040;--rc-code-bg: #f5f5f5;--rc-hr-border: #e5e5e5;--rc-quote-border: #2563eb;--rc-quote-bg: #f5f5f5;--rc-alert-info: #006bb7;--rc-alert-warning: #cc5500;--rc-alert-tip: #11cc00;--rc-alert-caution: #cc0011;--rc-alert-important: #5500cc;--rc-max-width: 700px;--rc-shadow-top-bar: 0 8px 30px rgba(0, 0, 0, .12), 0 2px 8px rgba(0, 0, 0, .06);--rc-shadow-modal: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--rc-shadow-menu: 0 1px 4px rgba(0,0,0,.04), 0 4px 16px rgba(0,0,0,.08);--rc-space-xs: 4px;--rc-space-sm: 8px;--rc-space-md: 16px;--rc-space-lg: 24px;--rc-space-xl: 32px;--rc-font-family-sans: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif: "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai: "楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs: .625em;--rc-font-size-xs: .75em;--rc-font-size-sm: .8125em;--rc-font-size-md: .875em;--rc-font-size-lg: 1.25em;--rc-font-size-base: 16px;--rc-font-size-small: 14px;--rc-line-height: 1.7;--rc-line-height-tight: 1.4;--rc-font-family: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm: 4px;--rc-radius-md: 8px;--rc-radius-lg: 12px}:root.dark{--rc-text: #fafafa;--rc-text-secondary: #a3a3a3;--rc-text-tertiary: #737373;--rc-text-quaternary: #525252;--rc-bg: #0a0a0a;--rc-bg-secondary: #171717;--rc-bg-tertiary: #262626;--rc-fill: #2a2a2a;--rc-fill-secondary: #222222;--rc-fill-tertiary: #1a1a1a;--rc-fill-quaternary: #141414;--rc-border: #262626;--rc-accent: #60a5fa;--rc-accent-light: #60a5fa20;--rc-link: #60a5fa;--rc-code-text: #d4d4d4;--rc-code-bg: #262626;--rc-hr-border: #262626;--rc-quote-border: #60a5fa;--rc-quote-bg: #262626;--rc-alert-info: #7db9e5;--rc-alert-warning: #da864a;--rc-alert-tip: #54da48;--rc-alert-caution: #e16973;--rc-alert-important: #9966e0;--rc-max-width: 700px;--rc-shadow-top-bar: 0 8px 30px rgba(0, 0, 0, .45), 0 2px 8px rgba(0, 0, 0, .3);--rc-shadow-modal: 0 10px 15px -3px rgba(0,0,0,.4), 0 4px 6px -4px rgba(0,0,0,.35);--rc-shadow-menu: 0 1px 4px rgba(0,0,0,.25), 0 4px 16px rgba(0,0,0,.4);--rc-space-xs: 4px;--rc-space-sm: 8px;--rc-space-md: 16px;--rc-space-lg: 24px;--rc-space-xl: 32px;--rc-font-family-sans: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif: "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai: "楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs: .625em;--rc-font-size-xs: .75em;--rc-font-size-sm: .8125em;--rc-font-size-md: .875em;--rc-font-size-lg: 1.25em;--rc-font-size-base: 16px;--rc-font-size-small: 14px;--rc-line-height: 1.7;--rc-line-height-tight: 1.4;--rc-font-family: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm: 4px;--rc-radius-md: 8px;--rc-radius-lg: 12px}[data-theme=dark]{--rc-text: #fafafa;--rc-text-secondary: #a3a3a3;--rc-text-tertiary: #737373;--rc-text-quaternary: #525252;--rc-bg: #0a0a0a;--rc-bg-secondary: #171717;--rc-bg-tertiary: #262626;--rc-fill: #2a2a2a;--rc-fill-secondary: #222222;--rc-fill-tertiary: #1a1a1a;--rc-fill-quaternary: #141414;--rc-border: #262626;--rc-accent: #60a5fa;--rc-accent-light: #60a5fa20;--rc-link: #60a5fa;--rc-code-text: #d4d4d4;--rc-code-bg: #262626;--rc-hr-border: #262626;--rc-quote-border: #60a5fa;--rc-quote-bg: #262626;--rc-alert-info: #7db9e5;--rc-alert-warning: #da864a;--rc-alert-tip: #54da48;--rc-alert-caution: #e16973;--rc-alert-important: #9966e0;--rc-max-width: 700px;--rc-shadow-top-bar: 0 8px 30px rgba(0, 0, 0, .45), 0 2px 8px rgba(0, 0, 0, .3);--rc-shadow-modal: 0 10px 15px -3px rgba(0,0,0,.4), 0 4px 6px -4px rgba(0,0,0,.35);--rc-shadow-menu: 0 1px 4px rgba(0,0,0,.25), 0 4px 16px rgba(0,0,0,.4);--rc-space-xs: 4px;--rc-space-sm: 8px;--rc-space-md: 16px;--rc-space-lg: 24px;--rc-space-xl: 32px;--rc-font-family-sans: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif: "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai: "楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs: .625em;--rc-font-size-xs: .75em;--rc-font-size-sm: .8125em;--rc-font-size-md: .875em;--rc-font-size-lg: 1.25em;--rc-font-size-base: 16px;--rc-font-size-small: 14px;--rc-line-height: 1.7;--rc-line-height-tight: 1.4;--rc-font-family: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm: 4px;--rc-radius-md: 8px;--rc-radius-lg: 12px}._6anxnj0{--rc-text: #000;--rc-text-secondary: #262626;--rc-text-tertiary: #737373;--rc-text-quaternary: #a3a3a3;--rc-bg: #ffffff;--rc-bg-secondary: #fafafa;--rc-bg-tertiary: #f5f5f5;--rc-fill: #e8e8e8;--rc-fill-secondary: #eeeeee;--rc-fill-tertiary: #f5f5f5;--rc-fill-quaternary: #fafafa;--rc-border: #f5f5f5;--rc-accent: #2563eb;--rc-accent-light: #2563eb20;--rc-link: #2563eb;--rc-code-text: #404040;--rc-code-bg: #f5f5f5;--rc-hr-border: #e5e5e5;--rc-quote-border: #2563eb;--rc-quote-bg: #f5f5f5;--rc-alert-info: #006bb7;--rc-alert-warning: #cc5500;--rc-alert-tip: #11cc00;--rc-alert-caution: #cc0011;--rc-alert-important: #5500cc;--rc-max-width: 700px;--rc-shadow-top-bar: 0 8px 30px rgba(0, 0, 0, .12), 0 2px 8px rgba(0, 0, 0, .06);--rc-shadow-modal: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--rc-shadow-menu: 0 1px 4px rgba(0,0,0,.04), 0 4px 16px rgba(0,0,0,.08);--rc-space-xs: 4px;--rc-space-sm: 8px;--rc-space-md: 16px;--rc-space-lg: 24px;--rc-space-xl: 32px;--rc-font-family-sans: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif: "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai: "楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs: .625em;--rc-font-size-xs: .75em;--rc-font-size-sm: .8125em;--rc-font-size-md: .875em;--rc-font-size-lg: 1.25em;--rc-font-size-base: 16px;--rc-font-size-small: 14px;--rc-line-height: 1.7;--rc-line-height-tight: 1.4;--rc-font-family: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm: 4px;--rc-radius-md: 8px;--rc-radius-lg: 12px}._6anxnj1{--rc-text: #000;--rc-text-secondary: #262626;--rc-text-tertiary: #737373;--rc-text-quaternary: #a3a3a3;--rc-bg: #ffffff;--rc-bg-secondary: #fafafa;--rc-bg-tertiary: #f5f5f5;--rc-fill: #e8e8e8;--rc-fill-secondary: #eeeeee;--rc-fill-tertiary: #f5f5f5;--rc-fill-quaternary: #fafafa;--rc-border: #f5f5f5;--rc-accent: #2563eb;--rc-accent-light: #2563eb20;--rc-link: #2563eb;--rc-code-text: #404040;--rc-code-bg: #f5f5f5;--rc-hr-border: #e5e5e5;--rc-quote-border: #2563eb;--rc-quote-bg: #f5f5f5;--rc-alert-info: #006bb7;--rc-alert-warning: #cc5500;--rc-alert-tip: #11cc00;--rc-alert-caution: #cc0011;--rc-alert-important: #5500cc;--rc-max-width: 700px;--rc-shadow-top-bar: 0 8px 30px rgba(0, 0, 0, .12), 0 2px 8px rgba(0, 0, 0, .06);--rc-shadow-modal: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--rc-shadow-menu: 0 1px 4px rgba(0,0,0,.04), 0 4px 16px rgba(0,0,0,.08);--rc-space-xs: 4px;--rc-space-sm: 8px;--rc-space-md: 16px;--rc-space-lg: 24px;--rc-space-xl: 32px;--rc-font-family-sans: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif: "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai: "楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs: .625em;--rc-font-size-xs: .75em;--rc-font-size-sm: .8125em;--rc-font-size-md: .875em;--rc-font-size-lg: 1.25em;--rc-font-size-base: 16px;--rc-font-size-small: 14px;--rc-line-height: 1.8;--rc-line-height-tight: 1.4;--rc-font-family: "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-radius-sm: 4px;--rc-radius-md: 8px;--rc-radius-lg: 12px}._6anxnj2{--rc-text: #000;--rc-text-secondary: #262626;--rc-text-tertiary: #737373;--rc-text-quaternary: #a3a3a3;--rc-bg: #ffffff;--rc-bg-secondary: #fafafa;--rc-bg-tertiary: #f5f5f5;--rc-fill: #e8e8e8;--rc-fill-secondary: #eeeeee;--rc-fill-tertiary: #f5f5f5;--rc-fill-quaternary: #fafafa;--rc-border: #f5f5f5;--rc-accent: #2563eb;--rc-accent-light: #2563eb20;--rc-link: #2563eb;--rc-code-text: #404040;--rc-code-bg: #f5f5f5;--rc-hr-border: #e5e5e5;--rc-quote-border: #a3a3a3;--rc-quote-bg: #fafafa;--rc-alert-info: #006bb7;--rc-alert-warning: #cc5500;--rc-alert-tip: #11cc00;--rc-alert-caution: #cc0011;--rc-alert-important: #5500cc;--rc-max-width: none;--rc-shadow-top-bar: 0 8px 30px rgba(0, 0, 0, .12), 0 2px 8px rgba(0, 0, 0, .06);--rc-shadow-modal: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -4px rgba(0,0,0,.1);--rc-shadow-menu: 0 1px 4px rgba(0,0,0,.04), 0 4px 16px rgba(0,0,0,.08);--rc-space-xs: 2px;--rc-space-sm: 4px;--rc-space-md: 10px;--rc-space-lg: 16px;--rc-space-xl: 20px;--rc-font-family-sans: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif: "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai: "楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono: "SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs: .625em;--rc-font-size-xs: .75em;--rc-font-size-sm: .8125em;--rc-font-size-md: .875em;--rc-font-size-lg: 1.25em;--rc-font-size-base: 14px;--rc-font-size-small: 12px;--rc-line-height: 1.5;--rc-line-height-tight: 1.3;--rc-font-family: "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm: 3px;--rc-radius-md: 6px;--rc-radius-lg: 12px}.dark ._6anxnj0,[data-theme=dark] ._6anxnj0,.dark._6anxnj0,[data-theme=dark]._6anxnj0,.dark ._6anxnj1,[data-theme=dark] ._6anxnj1,.dark._6anxnj1,[data-theme=dark]._6anxnj1,.dark ._6anxnj2,[data-theme=dark] ._6anxnj2,.dark._6anxnj2,[data-theme=dark]._6anxnj2{--rc-text: #fafafa;--rc-text-secondary: #a3a3a3;--rc-text-tertiary: #737373;--rc-text-quaternary: #525252;--rc-bg: #0a0a0a;--rc-bg-secondary: #171717;--rc-bg-tertiary: #262626;--rc-fill: #2a2a2a;--rc-fill-secondary: #222222;--rc-fill-tertiary: #1a1a1a;--rc-fill-quaternary: #141414;--rc-border: #262626;--rc-accent: #60a5fa;--rc-accent-light: #60a5fa20;--rc-link: #60a5fa;--rc-code-text: #d4d4d4;--rc-code-bg: #262626;--rc-hr-border: #262626;--rc-quote-border: #60a5fa;--rc-quote-bg: #262626;--rc-alert-info: #7db9e5;--rc-alert-warning: #da864a;--rc-alert-tip: #54da48;--rc-alert-caution: #e16973;--rc-alert-important: #9966e0;--rc-shadow-top-bar: 0 8px 30px rgba(0, 0, 0, .45), 0 2px 8px rgba(0, 0, 0, .3);--rc-shadow-modal: 0 10px 15px -3px rgba(0,0,0,.4), 0 4px 6px -4px rgba(0,0,0,.35);--rc-shadow-menu: 0 1px 4px rgba(0,0,0,.25), 0 4px 16px rgba(0,0,0,.4)}@keyframes _1c3wdzl4{to{transform:rotate(360deg)}}._1c3wdzl0{position:relative;width:100%;aspect-ratio:16 / 10;margin:1rem 0;border-radius:.5rem;overflow:hidden;background-color:var(--rc-bg)}._1c3wdzl1{position:relative;width:100%;aspect-ratio:16 / 10;margin:1rem 0;border-radius:.5rem;overflow:hidden;border:1px solid var(--rc-border)}._1c3wdzl2{position:relative;width:100%;aspect-ratio:16 / 10;display:flex;align-items:center;justify-content:center;background-color:var(--rc-bg);border-radius:.5rem;border:1px solid var(--rc-border);color:var(--rc-text-secondary);font-size:var(--rc-font-size-md)}._1c3wdzl3{display:flex;align-items:center;justify-content:center;position:absolute;inset:0;color:var(--rc-text-secondary);font-size:var(--rc-font-size-md)}._1c3wdzl3:after{content:"";display:inline-block;width:16px;height:16px;margin-left:8px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:_1c3wdzl4 .6s linear infinite}._1c3wdzl5{display:flex;align-items:center;justify-content:center;position:absolute;inset:0;padding:.75rem 1rem;background-color:color-mix(in srgb,var(--rc-alert-caution) 10%,transparent);color:var(--rc-alert-caution);font-size:var(--rc-font-size-md)}._1c3wdzl0 .App-toolbar{display:none}._1c3wdzl1 .Island,.excalidraw--view-mode .dropdown-menu-button{display:none!important}._1c3wdzl6{position:absolute;bottom:8px;right:8px;z-index:10;display:flex;gap:4px;border-radius:6px;padding:2px;background-color:color-mix(in srgb,currentColor 8%,transparent);backdrop-filter:blur(8px)}._1c3wdzl7{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:4px;border:none;background:transparent;color:var(--rc-text-secondary);cursor:pointer;transition:background .15s,color .15s}._1c3wdzl7:hover{background:color-mix(in srgb,currentColor 12%,transparent);color:var(--rc-text)}._1c3wdzl7 svg{width:16px;height:16px}._1c3wdzl8._1c3wdzl8{position:fixed;inset:0;transform:none;width:100vw;height:100vh;max-width:100vw;max-height:100vh;margin:0;padding:0;gap:0;border-radius:0;border:none;display:flex;flex-direction:column;background:var(--rc-bg);overflow:hidden}._1c3wdzl8._1c3wdzl8[data-open],._1c3wdzl8._1c3wdzl8[data-closed]{animation:none}._1c3wdzl9{display:flex;align-items:center;height:48px;flex-shrink:0;padding:0 12px 0 16px;border-bottom:1px solid var(--rc-border);gap:10px}._1c3wdzla{display:flex;align-items:center;gap:4px;flex:1}._1c3wdzlb{width:8px;height:8px;border-radius:50%;flex-shrink:0;transition:background-color .3s}._1c3wdzlc{font-size:var(--rc-font-size-md);font-weight:600;color:var(--rc-text);line-height:1}._1c3wdzld{font-size:var(--rc-font-size-sm);color:var(--rc-text-secondary);line-height:1;padding-left:10px;border-left:1px solid var(--rc-border)}._1c3wdzle{margin-left:auto;display:flex;align-items:center;gap:2px}._1c3wdzlf{margin-left:8px;flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;border:none;background:transparent;color:var(--rc-text-secondary);cursor:pointer;transition:background .15s,color .15s}._1c3wdzlf:hover{background:color-mix(in srgb,currentColor 8%,transparent);color:var(--rc-text)}._1c3wdzlg{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:4px;border:none;background:transparent;color:var(--rc-text-secondary);cursor:pointer;font-size:var(--rc-font-size-sm);white-space:nowrap;transition:background .15s,color .15s}._1c3wdzlg:hover{background:color-mix(in srgb,currentColor 8%,transparent);color:var(--rc-text)}._1c3wdzlg:disabled{opacity:.4;pointer-events:none}._1c3wdzlg svg{width:14px;height:14px;flex-shrink:0}._1c3wdzlh{width:1px;height:16px;margin:0 4px;background:var(--rc-border);flex-shrink:0}._1c3wdzli{display:inline-flex;align-items:center;padding:3px 10px;border-radius:4px;background:color-mix(in srgb,currentColor 4%,transparent);color:var(--rc-text-secondary);font-size:var(--rc-font-size-xs);font-family:var(--rc-font-mono);width:200px;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid transparent;outline:none;transition:background .15s,border-color .15s}._1c3wdzli:hover{background:color-mix(in srgb,currentColor 8%,transparent)}._1c3wdzli:focus{border-color:var(--rc-accent);background:color-mix(in srgb,currentColor 6%,transparent)}._1c3wdzlj{flex:1;position:relative;min-height:0}._1c3wdzlk{display:flex;justify-content:flex-end;gap:8px;padding:0 1.5rem 1.25rem}._1c3wdzll{padding:6px 14px;border-radius:6px;border:1px solid var(--rc-border);background:transparent;font-size:var(--rc-font-size-sm);font-weight:500;cursor:pointer;transition:background .15s;color:var(--rc-text)}._1c3wdzll:hover{background:color-mix(in srgb,currentColor 6%,transparent)}._1c3wdzlm{padding:6px 14px;border-radius:6px;border:1px solid var(--rc-accent);background:var(--rc-accent);font-size:var(--rc-font-size-sm);font-weight:500;cursor:pointer;transition:opacity .15s;color:#fff}._1c3wdzlm:hover{opacity:.9}._1c3wdzln{padding:6px 14px;border-radius:6px;border:1px solid var(--rc-alert-caution);background:transparent;font-size:var(--rc-font-size-sm);font-weight:500;cursor:pointer;transition:background .15s;color:var(--rc-alert-caution)}._1c3wdzln:hover{background:color-mix(in srgb,var(--rc-alert-caution) 10%,transparent)}._1c3wdzlo{position:absolute;inset:0;z-index:5;display:flex;align-items:center;justify-content:center;cursor:pointer;background:transparent;border:none;transition:background .2s}._1c3wdzlo:hover{background:color-mix(in srgb,currentColor 6%,transparent)}._1c3wdzlp{display:flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;background:var(--rc-bg);border:1px solid var(--rc-border);color:var(--rc-text);font-size:var(--rc-font-size-sm);font-weight:500;opacity:0;transition:opacity .2s}._1c3wdzlo:hover ._1c3wdzlp{opacity:1}
1
+ :root{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#2563eb;--rc-quote-bg:#f5f5f5;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.7;--rc-line-height-tight:1.4;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}:root.dark,[data-theme=dark]{--rc-text:#fafafa;--rc-text-secondary:#a3a3a3;--rc-text-tertiary:#737373;--rc-text-quaternary:#525252;--rc-bg:#0a0a0a;--rc-bg-secondary:#171717;--rc-bg-tertiary:#262626;--rc-fill:#2a2a2a;--rc-fill-secondary:#222;--rc-fill-tertiary:#1a1a1a;--rc-fill-quaternary:#141414;--rc-border:#262626;--rc-accent:#60a5fa;--rc-accent-light:#60a5fa20;--rc-link:#60a5fa;--rc-code-text:#d4d4d4;--rc-code-bg:#262626;--rc-hr-border:#262626;--rc-quote-border:#60a5fa;--rc-quote-bg:#262626;--rc-alert-info:#7db9e5;--rc-alert-warning:#da864a;--rc-alert-tip:#54da48;--rc-alert-caution:#e16973;--rc-alert-important:#9966e0;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #00000073, 0 2px 8px #0000004d;--rc-shadow-modal:0 10px 15px -3px #0006, 0 4px 6px -4px #00000059;--rc-shadow-menu:0 1px 4px #00000040, 0 4px 16px #0006;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.7;--rc-line-height-tight:1.4;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}._6anxnj0{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#2563eb;--rc-quote-bg:#f5f5f5;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.7;--rc-line-height-tight:1.4;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}._6anxnj1{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#2563eb;--rc-quote-bg:#f5f5f5;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:700px;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-line-height:1.8;--rc-line-height-tight:1.4;--rc-font-family:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}._6anxnj2{--rc-text:#000;--rc-text-secondary:#262626;--rc-text-tertiary:#737373;--rc-text-quaternary:#a3a3a3;--rc-bg:#fff;--rc-bg-secondary:#fafafa;--rc-bg-tertiary:#f5f5f5;--rc-fill:#e8e8e8;--rc-fill-secondary:#eee;--rc-fill-tertiary:#f5f5f5;--rc-fill-quaternary:#fafafa;--rc-border:#f5f5f5;--rc-accent:#2563eb;--rc-accent-light:#2563eb20;--rc-link:#2563eb;--rc-code-text:#404040;--rc-code-bg:#f5f5f5;--rc-hr-border:#e5e5e5;--rc-quote-border:#a3a3a3;--rc-quote-bg:#fafafa;--rc-alert-info:#006bb7;--rc-alert-warning:#c50;--rc-alert-tip:#1c0;--rc-alert-caution:#c01;--rc-alert-important:#50c;--rc-max-width:none;--rc-shadow-top-bar:0 8px 30px #0000001f, 0 2px 8px #0000000f;--rc-shadow-modal:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--rc-shadow-menu:0 1px 4px #0000000a, 0 4px 16px #00000014;--rc-space-xs:2px;--rc-space-sm:4px;--rc-space-md:10px;--rc-space-lg:16px;--rc-space-xl:20px;--rc-font-family-sans:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-font-family-serif:"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif;--rc-font-family-kai:"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif;--rc-font-mono:"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, monospace;--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:14px;--rc-font-size-small:12px;--rc-line-height:1.5;--rc-line-height-tight:1.3;--rc-font-family:"PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", -apple-system, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Not Color Emoji;--rc-radius-sm:3px;--rc-radius-md:6px;--rc-radius-lg:12px}.dark ._6anxnj0,[data-theme=dark] ._6anxnj0,.dark._6anxnj0,[data-theme=dark]._6anxnj0,.dark ._6anxnj1,[data-theme=dark] ._6anxnj1,.dark._6anxnj1,[data-theme=dark]._6anxnj1,.dark ._6anxnj2,[data-theme=dark] ._6anxnj2,.dark._6anxnj2,[data-theme=dark]._6anxnj2{--rc-text:#fafafa;--rc-text-secondary:#a3a3a3;--rc-text-tertiary:#737373;--rc-text-quaternary:#525252;--rc-bg:#0a0a0a;--rc-bg-secondary:#171717;--rc-bg-tertiary:#262626;--rc-fill:#2a2a2a;--rc-fill-secondary:#222;--rc-fill-tertiary:#1a1a1a;--rc-fill-quaternary:#141414;--rc-border:#262626;--rc-accent:#60a5fa;--rc-accent-light:#60a5fa20;--rc-link:#60a5fa;--rc-code-text:#d4d4d4;--rc-code-bg:#262626;--rc-hr-border:#262626;--rc-quote-border:#60a5fa;--rc-quote-bg:#262626;--rc-alert-info:#7db9e5;--rc-alert-warning:#da864a;--rc-alert-tip:#54da48;--rc-alert-caution:#e16973;--rc-alert-important:#9966e0;--rc-shadow-top-bar:0 8px 30px #00000073, 0 2px 8px #0000004d;--rc-shadow-modal:0 10px 15px -3px #0006, 0 4px 6px -4px #00000059;--rc-shadow-menu:0 1px 4px #00000040, 0 4px 16px #0006}@keyframes _1c3wdzl4{to{transform:rotate(360deg)}}._1c3wdzl0{aspect-ratio:16/10;background-color:var(--rc-bg);border-radius:.5rem;width:100%;margin:1rem 0;position:relative;overflow:hidden}._1c3wdzl1{aspect-ratio:16/10;border:1px solid var(--rc-border);border-radius:.5rem;width:100%;margin:1rem 0;position:relative;overflow:hidden}._1c3wdzl2{aspect-ratio:16/10;background-color:var(--rc-bg);border:1px solid var(--rc-border);width:100%;color:var(--rc-text-secondary);font-size:var(--rc-font-size-md);border-radius:.5rem;justify-content:center;align-items:center;display:flex;position:relative}._1c3wdzl3{color:var(--rc-text-secondary);font-size:var(--rc-font-size-md);justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}._1c3wdzl3:after{content:"";border:2px solid;border-right-color:#0000;border-radius:50%;width:16px;height:16px;margin-left:8px;animation:.6s linear infinite _1c3wdzl4;display:inline-block}._1c3wdzl5{background-color:color-mix(in srgb, var(--rc-alert-caution) 10%, transparent);color:var(--rc-alert-caution);font-size:var(--rc-font-size-md);justify-content:center;align-items:center;padding:.75rem 1rem;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}._1c3wdzl0 .App-toolbar{display:none}._1c3wdzl1 .Island,.excalidraw--view-mode .dropdown-menu-button{display:none!important}._1c3wdzl6{z-index:10;background-color:color-mix(in srgb, currentColor 8%, transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:6px;gap:4px;padding:2px;display:flex;position:absolute;bottom:8px;right:8px}._1c3wdzl7{width:28px;height:28px;color:var(--rc-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;transition:background .15s,color .15s;display:flex}._1c3wdzl7:hover{background:color-mix(in srgb, currentColor 12%, transparent);color:var(--rc-text)}._1c3wdzl7 svg{width:16px;height:16px}._1c3wdzl8._1c3wdzl8{background:var(--rc-bg);border:none;border-radius:0;flex-direction:column;gap:0;width:100vw;max-width:100vw;height:100vh;max-height:100vh;margin:0;padding:0;display:flex;position:fixed;top:0;bottom:0;left:0;right:0;overflow:hidden;transform:none}._1c3wdzl8._1c3wdzl8[data-open],._1c3wdzl8._1c3wdzl8[data-closed]{animation:none}._1c3wdzl9{border-bottom:1px solid var(--rc-border);flex-shrink:0;align-items:center;gap:10px;height:48px;padding:0 12px 0 16px;display:flex}._1c3wdzla{flex:1;align-items:center;gap:4px;display:flex}._1c3wdzlb{border-radius:50%;flex-shrink:0;width:8px;height:8px;transition:background-color .3s}._1c3wdzlc{font-size:var(--rc-font-size-md);color:var(--rc-text);font-weight:600;line-height:1}._1c3wdzld{font-size:var(--rc-font-size-sm);color:var(--rc-text-secondary);border-left:1px solid var(--rc-border);padding-left:10px;line-height:1}._1c3wdzle{align-items:center;gap:2px;margin-left:auto;display:flex}._1c3wdzlf{width:32px;height:32px;color:var(--rc-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;margin-left:8px;transition:background .15s,color .15s;display:flex}._1c3wdzlf:hover{background:color-mix(in srgb, currentColor 8%, transparent);color:var(--rc-text)}._1c3wdzlg{color:var(--rc-text-secondary);cursor:pointer;font-size:var(--rc-font-size-sm);white-space:nowrap;background:0 0;border:none;border-radius:4px;align-items:center;gap:4px;padding:4px 10px;transition:background .15s,color .15s;display:inline-flex}._1c3wdzlg:hover{background:color-mix(in srgb, currentColor 8%, transparent);color:var(--rc-text)}._1c3wdzlg:disabled{opacity:.4;pointer-events:none}._1c3wdzlg svg{flex-shrink:0;width:14px;height:14px}._1c3wdzlh{background:var(--rc-border);flex-shrink:0;width:1px;height:16px;margin:0 4px}._1c3wdzli{background:color-mix(in srgb, currentColor 4%, transparent);color:var(--rc-text-secondary);font-size:var(--rc-font-size-xs);font-family:var(--rc-font-mono);text-overflow:ellipsis;white-space:nowrap;border:1px solid #0000;border-radius:4px;outline:none;align-items:center;width:200px;max-width:50%;padding:3px 10px;transition:background .15s,border-color .15s;display:inline-flex;overflow:hidden}._1c3wdzli:hover{background:color-mix(in srgb, currentColor 8%, transparent)}._1c3wdzli:focus{border-color:var(--rc-accent);background:color-mix(in srgb, currentColor 6%, transparent)}._1c3wdzlj{flex:1;min-height:0;position:relative}._1c3wdzlk{justify-content:flex-end;gap:8px;padding:0 1.5rem 1.25rem;display:flex}._1c3wdzll{border:1px solid var(--rc-border);font-size:var(--rc-font-size-sm);cursor:pointer;color:var(--rc-text);background:0 0;border-radius:6px;padding:6px 14px;font-weight:500;transition:background .15s}._1c3wdzll:hover{background:color-mix(in srgb, currentColor 6%, transparent)}._1c3wdzlm{border:1px solid var(--rc-accent);background:var(--rc-accent);font-size:var(--rc-font-size-sm);cursor:pointer;color:#fff;border-radius:6px;padding:6px 14px;font-weight:500;transition:opacity .15s}._1c3wdzlm:hover{opacity:.9}._1c3wdzln{border:1px solid var(--rc-alert-caution);font-size:var(--rc-font-size-sm);cursor:pointer;color:var(--rc-alert-caution);background:0 0;border-radius:6px;padding:6px 14px;font-weight:500;transition:background .15s}._1c3wdzln:hover{background:color-mix(in srgb, var(--rc-alert-caution) 10%, transparent)}._1c3wdzlo{z-index:5;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;transition:background .2s;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}._1c3wdzlo:hover{background:color-mix(in srgb, currentColor 6%, transparent)}._1c3wdzlp{background:var(--rc-bg);border:1px solid var(--rc-border);color:var(--rc-text);font-size:var(--rc-font-size-sm);opacity:0;border-radius:6px;align-items:center;gap:6px;padding:6px 14px;font-weight:500;transition:opacity .2s;display:flex}._1c3wdzlo:hover ._1c3wdzlp{opacity:1}
2
+ /*$vite$:1*/
@@ -0,0 +1,13 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true
8
+ });
9
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
+ return target;
11
+ };
12
+ //#endregion
13
+ export { __exportAll as t };
package/dist/static.mjs CHANGED
@@ -1,14 +1,4 @@
1
- import { $, a, E, b, c, b as b2, d, b as b3, u } from "./ExcalidrawNode-DEcONli3.js";
2
- import { EXCALIDRAW_BLOCK_TRANSFORMER } from "@haklex/rich-headless/transformers";
3
- export {
4
- $ as $createExcalidrawNode,
5
- a as $isExcalidrawNode,
6
- EXCALIDRAW_BLOCK_TRANSFORMER,
7
- E as ExcalidrawConfigProvider,
8
- b as ExcalidrawDisplayRenderer,
9
- c as ExcalidrawNode,
10
- b2 as ExcalidrawRenderer,
11
- d as ExcalidrawSSRRenderer,
12
- b3 as ExcalidrawStaticRenderer,
13
- u as useExcalidrawConfig
14
- };
1
+ import { A as ExcalidrawConfigProvider, j as useExcalidrawConfig } from "./useExcalidrawData-DcXa8vqV.js";
2
+ import { t as ExcalidrawDisplayRenderer } from "./ExcalidrawDisplayRenderer-DVdXrM8P.js";
3
+ import { a as ExcalidrawSSRRenderer, i as ExcalidrawNode, n as $createExcalidrawNode, r as $isExcalidrawNode, t as EXCALIDRAW_BLOCK_TRANSFORMER } from "./transformer-BdMW9UsE.js";
4
+ export { $createExcalidrawNode, $isExcalidrawNode, EXCALIDRAW_BLOCK_TRANSFORMER, ExcalidrawConfigProvider, ExcalidrawDisplayRenderer, ExcalidrawDisplayRenderer as ExcalidrawRenderer, ExcalidrawDisplayRenderer as ExcalidrawStaticRenderer, ExcalidrawNode, ExcalidrawSSRRenderer, useExcalidrawConfig };
@@ -0,0 +1,88 @@
1
+ import { E as excalidrawPlaceholder } from "./useExcalidrawData-DcXa8vqV.js";
2
+ import { r as _defineProperty } from "./ExcalidrawDisplayRenderer-DVdXrM8P.js";
3
+ import { Suspense, createElement, lazy } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { ViewportGate } from "@haklex/rich-editor-ui";
6
+ import { DecoratorNode } from "lexical";
7
+ import { EXCALIDRAW_BLOCK_TRANSFORMER } from "@haklex/rich-headless/transformers";
8
+ //#region src/ExcalidrawSSRRenderer.tsx
9
+ var LazyDisplayRenderer = lazy(() => import("./ExcalidrawDisplayRenderer-DVdXrM8P.js").then((n) => n.n).then((m) => ({ default: m.ExcalidrawDisplayRenderer })));
10
+ var ExcalidrawPlaceholder = ({ snapshot }) => {
11
+ let label = "Excalidraw Whiteboard";
12
+ try {
13
+ const data = JSON.parse(snapshot);
14
+ if (data && typeof data === "object") {
15
+ const elementCount = Array.isArray(data.elements) ? data.elements.length : 0;
16
+ if (elementCount > 0) label = `Excalidraw Whiteboard (${elementCount} elements)`;
17
+ }
18
+ } catch {}
19
+ return /* @__PURE__ */ jsx("div", {
20
+ "aria-label": label,
21
+ className: excalidrawPlaceholder,
22
+ children: /* @__PURE__ */ jsx("span", { children: label })
23
+ });
24
+ };
25
+ var ExcalidrawSSRRenderer = ({ snapshot }) => {
26
+ return /* @__PURE__ */ jsx(ViewportGate, {
27
+ fallback: /* @__PURE__ */ jsx(ExcalidrawPlaceholder, { snapshot }),
28
+ children: /* @__PURE__ */ jsx(Suspense, {
29
+ fallback: /* @__PURE__ */ jsx(ExcalidrawPlaceholder, { snapshot }),
30
+ children: /* @__PURE__ */ jsx(LazyDisplayRenderer, { snapshot })
31
+ })
32
+ });
33
+ };
34
+ //#endregion
35
+ //#region src/ExcalidrawNode.ts
36
+ var ExcalidrawNode = class ExcalidrawNode extends DecoratorNode {
37
+ static getType() {
38
+ return "excalidraw";
39
+ }
40
+ static clone(node) {
41
+ return new ExcalidrawNode(node.__snapshot, node.__key);
42
+ }
43
+ constructor(snapshot, key) {
44
+ super(key);
45
+ _defineProperty(this, "__snapshot", void 0);
46
+ this.__snapshot = snapshot;
47
+ }
48
+ createDOM(_config) {
49
+ const div = document.createElement("div");
50
+ div.className = "rich-excalidraw-wrapper";
51
+ return div;
52
+ }
53
+ updateDOM() {
54
+ return false;
55
+ }
56
+ isInline() {
57
+ return false;
58
+ }
59
+ static importJSON(serializedNode) {
60
+ return $createExcalidrawNode(serializedNode.snapshot);
61
+ }
62
+ exportJSON() {
63
+ return {
64
+ ...super.exportJSON(),
65
+ type: "excalidraw",
66
+ snapshot: this.__snapshot,
67
+ version: 1
68
+ };
69
+ }
70
+ getSnapshot() {
71
+ return this.__snapshot;
72
+ }
73
+ setSnapshot(snapshot) {
74
+ const writable = this.getWritable();
75
+ writable.__snapshot = snapshot;
76
+ }
77
+ decorate(_editor, _config) {
78
+ return createElement(ExcalidrawSSRRenderer, { snapshot: this.__snapshot });
79
+ }
80
+ };
81
+ function $createExcalidrawNode(snapshot) {
82
+ return new ExcalidrawNode(snapshot);
83
+ }
84
+ function $isExcalidrawNode(node) {
85
+ return node instanceof ExcalidrawNode;
86
+ }
87
+ //#endregion
88
+ export { ExcalidrawSSRRenderer as a, ExcalidrawNode as i, $createExcalidrawNode as n, $isExcalidrawNode as r, EXCALIDRAW_BLOCK_TRANSFORMER as t };
@@ -0,0 +1,205 @@
1
+ import { createContext, use, useEffect, useMemo, useState } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/ExcalidrawConfigContext.tsx
4
+ var ExcalidrawConfigContext = createContext({});
5
+ function ExcalidrawConfigProvider({ apiUrl, saveSnapshot, children }) {
6
+ const value = useMemo(() => ({
7
+ apiUrl,
8
+ saveSnapshot
9
+ }), [apiUrl, saveSnapshot]);
10
+ return /* @__PURE__ */ jsx(ExcalidrawConfigContext.Provider, {
11
+ value,
12
+ children
13
+ });
14
+ }
15
+ function useExcalidrawConfig() {
16
+ return use(ExcalidrawConfigContext);
17
+ }
18
+ //#endregion
19
+ //#region src/constants.ts
20
+ var readonlyUIOptions = { canvasActions: {
21
+ toggleTheme: false,
22
+ export: false,
23
+ saveAsImage: false,
24
+ loadScene: false,
25
+ changeViewBackgroundColor: false
26
+ } };
27
+ //#endregion
28
+ //#region src/styles.css.ts
29
+ var excalidrawStaticContainer = "_1c3wdzl0";
30
+ var excalidrawEditorContainer = "_1c3wdzl1";
31
+ var excalidrawPlaceholder = "_1c3wdzl2";
32
+ var excalidrawLoading = "_1c3wdzl3";
33
+ var excalidrawError = "_1c3wdzl5";
34
+ var excalidrawActionGroup = "_1c3wdzl6";
35
+ var excalidrawActionButton = "_1c3wdzl7";
36
+ var excalidrawFullscreenPopup = "_1c3wdzl8";
37
+ var excalidrawDialogHeader = "_1c3wdzl9";
38
+ var excalidrawDialogHeaderTitle = "_1c3wdzla";
39
+ var excalidrawStatusDot = "_1c3wdzlb";
40
+ var excalidrawDialogTitle = "_1c3wdzlc";
41
+ var excalidrawDialogMeta = "_1c3wdzld";
42
+ var excalidrawHeaderActions = "_1c3wdzle";
43
+ var excalidrawHeaderClose = "_1c3wdzlf";
44
+ var excalidrawActionBarBtn = "_1c3wdzlg";
45
+ var excalidrawActionBarSep = "_1c3wdzlh";
46
+ var excalidrawActionBarUrl = "_1c3wdzli";
47
+ var excalidrawDialogCanvas = "_1c3wdzlj";
48
+ var excalidrawConfirmActions = "_1c3wdzlk";
49
+ var excalidrawConfirmBtn = "_1c3wdzll";
50
+ var excalidrawConfirmBtnPrimary = "_1c3wdzlm";
51
+ var excalidrawConfirmBtnDanger = "_1c3wdzln";
52
+ var excalidrawEditOverlay = "_1c3wdzlo";
53
+ var excalidrawEditLabel = "_1c3wdzlp";
54
+ //#endregion
55
+ //#region src/types.ts
56
+ function parseSnapshot(raw) {
57
+ if (!raw || !raw.trim()) return null;
58
+ try {
59
+ const json = JSON.parse(raw);
60
+ if (json && typeof json === "object") return {
61
+ type: "inline",
62
+ data: json
63
+ };
64
+ } catch {}
65
+ const lines = raw.split("\n");
66
+ const firstLine = lines[0].trim();
67
+ if (!firstLine.startsWith("http") && !firstLine.startsWith("blob:") && !firstLine.startsWith("ref:")) return null;
68
+ const remaining = lines.slice(1).join("\n").trim();
69
+ if (remaining) try {
70
+ const delta = JSON.parse(remaining);
71
+ if (delta && typeof delta === "object") return {
72
+ type: "delta",
73
+ baseUrl: firstLine,
74
+ delta
75
+ };
76
+ } catch {}
77
+ return {
78
+ type: "remote",
79
+ url: firstLine
80
+ };
81
+ }
82
+ function serializeSnapshot(snapshot) {
83
+ switch (snapshot.type) {
84
+ case "inline": return JSON.stringify(snapshot.data);
85
+ case "remote": return snapshot.url;
86
+ case "delta": return [snapshot.baseUrl, JSON.stringify(snapshot.delta)].join("\n");
87
+ }
88
+ }
89
+ //#endregion
90
+ //#region src/useExcalidrawData.ts
91
+ function resolveUrl(url, apiUrl) {
92
+ const refLine = url;
93
+ if (url.startsWith("http") || url.startsWith("blob:")) return {
94
+ fetchUrl: url,
95
+ refLine
96
+ };
97
+ if (url.startsWith("ref:") && apiUrl) return {
98
+ fetchUrl: `${apiUrl}/objects/${url.slice(4)}`,
99
+ refLine
100
+ };
101
+ return { error: url.startsWith("ref:") ? "Missing apiUrl for ref resolution" : "Unrecognized snapshot format" };
102
+ }
103
+ function typedToParsed(typed, apiUrl) {
104
+ switch (typed.type) {
105
+ case "inline": return {
106
+ type: "inline",
107
+ snapshot: typed.data
108
+ };
109
+ case "remote": {
110
+ const result = resolveUrl(typed.url, apiUrl);
111
+ if ("error" in result) return {
112
+ type: "error",
113
+ error: result.error
114
+ };
115
+ return {
116
+ type: "remote",
117
+ fetchUrl: result.fetchUrl,
118
+ refLine: result.refLine
119
+ };
120
+ }
121
+ case "delta": {
122
+ const result = resolveUrl(typed.baseUrl, apiUrl);
123
+ if ("error" in result) return {
124
+ type: "error",
125
+ error: result.error
126
+ };
127
+ return {
128
+ type: "incremental",
129
+ fetchUrl: result.fetchUrl,
130
+ refLine: result.refLine,
131
+ delta: typed.delta
132
+ };
133
+ }
134
+ }
135
+ }
136
+ function stringToParsed(data, apiUrl) {
137
+ const typed = parseSnapshot(data);
138
+ if (!typed) return { type: "empty" };
139
+ return typedToParsed(typed, apiUrl);
140
+ }
141
+ function useExcalidrawData(data) {
142
+ const { apiUrl } = useExcalidrawConfig();
143
+ const parsed = useMemo(() => {
144
+ if (data === null || data === void 0) return { type: "empty" };
145
+ if (typeof data === "string") return stringToParsed(data, apiUrl);
146
+ return typedToParsed(data, apiUrl);
147
+ }, [data, apiUrl]);
148
+ const [remoteSnapshot, setRemoteSnapshot] = useState();
149
+ const [baseData, setBaseData] = useState();
150
+ const [loading, setLoading] = useState(parsed.type === "remote" || parsed.type === "incremental");
151
+ const [error, setError] = useState("");
152
+ useEffect(() => {
153
+ if (parsed.type !== "remote" && parsed.type !== "incremental") return;
154
+ const { fetchUrl } = parsed;
155
+ const delta = parsed.type === "incremental" ? parsed.delta : void 0;
156
+ let cancelled = false;
157
+ setLoading(true);
158
+ setError("");
159
+ fetch(fetchUrl).then((res) => {
160
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
161
+ return res.json();
162
+ }).then(async (json) => {
163
+ if (cancelled) return;
164
+ setBaseData(json);
165
+ if ((delta ? Object.keys(delta) : []).length > 0) {
166
+ const { patch } = await import("jsondiffpatch");
167
+ if (cancelled) return;
168
+ setRemoteSnapshot(patch(structuredClone(json), delta));
169
+ } else setRemoteSnapshot(json);
170
+ setLoading(false);
171
+ }).catch((err) => {
172
+ if (!cancelled) {
173
+ setError(err instanceof Error ? err.message : "Failed to load");
174
+ setLoading(false);
175
+ }
176
+ });
177
+ return () => {
178
+ cancelled = true;
179
+ };
180
+ }, [parsed]);
181
+ if (parsed.type === "inline") return {
182
+ snapshot: parsed.snapshot,
183
+ loading: false,
184
+ error: ""
185
+ };
186
+ if (parsed.type === "remote" || parsed.type === "incremental") return {
187
+ snapshot: remoteSnapshot,
188
+ loading,
189
+ error,
190
+ baseRef: parsed.refLine,
191
+ baseData
192
+ };
193
+ if (parsed.type === "error") return {
194
+ snapshot: void 0,
195
+ loading: false,
196
+ error: parsed.error
197
+ };
198
+ return {
199
+ snapshot: void 0,
200
+ loading: false,
201
+ error: ""
202
+ };
203
+ }
204
+ //#endregion
205
+ export { ExcalidrawConfigProvider as A, excalidrawHeaderActions as C, excalidrawStaticContainer as D, excalidrawPlaceholder as E, excalidrawStatusDot as O, excalidrawFullscreenPopup as S, excalidrawLoading as T, excalidrawDialogTitle as _, excalidrawActionBarSep as a, excalidrawEditorContainer as b, excalidrawActionGroup as c, excalidrawConfirmBtnDanger as d, excalidrawConfirmBtnPrimary as f, excalidrawDialogMeta as g, excalidrawDialogHeaderTitle as h, excalidrawActionBarBtn as i, useExcalidrawConfig as j, readonlyUIOptions as k, excalidrawConfirmActions as l, excalidrawDialogHeader as m, parseSnapshot as n, excalidrawActionBarUrl as o, excalidrawDialogCanvas as p, serializeSnapshot as r, excalidrawActionButton as s, useExcalidrawData as t, excalidrawConfirmBtn as u, excalidrawEditLabel as v, excalidrawHeaderClose as w, excalidrawError as x, excalidrawEditOverlay as y };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haklex/rich-ext-excalidraw",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Excalidraw whiteboard extension",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,28 +27,28 @@
27
27
  "dependencies": {
28
28
  "@excalidraw/excalidraw": "0.17.0",
29
29
  "jsondiffpatch": "^0.7.3",
30
- "@haklex/rich-editor": "0.1.1",
31
- "@haklex/rich-style-token": "0.1.1",
32
- "@haklex/rich-headless": "0.1.1",
33
- "@haklex/rich-editor-ui": "0.1.1"
30
+ "@haklex/rich-editor": "0.3.0",
31
+ "@haklex/rich-editor-ui": "0.3.0",
32
+ "@haklex/rich-style-token": "0.3.0",
33
+ "@haklex/rich-headless": "0.3.0"
34
34
  },
35
35
  "devDependencies": {
36
- "@lexical/react": "^0.43.0",
36
+ "@lexical/react": "^0.44.0",
37
37
  "@types/react": "^19.2.14",
38
38
  "@types/react-dom": "^19.2.3",
39
- "@vanilla-extract/css": "^1.18.0",
40
- "@vanilla-extract/vite-plugin": "^5.1.4",
41
- "lexical": "^0.43.0",
42
- "lucide-react": "^1.0.0",
43
- "react": "19.2.4",
44
- "react-dom": "19.2.4",
39
+ "@vanilla-extract/css": "^1.20.1",
40
+ "@vanilla-extract/vite-plugin": "^5.2.2",
41
+ "lexical": "^0.44.0",
42
+ "lucide-react": "^1.12.0",
43
+ "react": "19.2.5",
44
+ "react-dom": "19.2.5",
45
45
  "typescript": "^5.9.3",
46
- "vite": "^7.3.1",
46
+ "vite": "^8.0.10",
47
47
  "vite-plugin-dts": "^4.5.4"
48
48
  },
49
49
  "peerDependencies": {
50
- "@lexical/react": "^0.43.0",
51
- "lexical": "^0.43.0",
50
+ "@lexical/react": "^0.44.0",
51
+ "lexical": "^0.44.0",
52
52
  "lucide-react": "^1.0.0",
53
53
  "react": ">=19",
54
54
  "react-dom": ">=19"