@haklex/rich-ext-excalidraw 0.1.0 → 0.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/dist/ExcalidrawDisplayRenderer-DVdXrM8P.js +226 -0
- package/dist/ExcalidrawEditRenderer-C6P1ukC8.js +481 -0
- package/dist/index.mjs +79 -574
- package/dist/rich-ext-excalidraw.css +2 -1
- package/dist/rolldown-runtime-CiIaOW0V.js +13 -0
- package/dist/static.mjs +4 -14
- package/dist/transformer-BdMW9UsE.js +88 -0
- package/dist/useExcalidrawData-DcXa8vqV.js +205 -0
- package/package.json +15 -15
- package/dist/ExcalidrawNode-DEcONli3.js +0 -480
|
@@ -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 {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
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.
|
|
3
|
+
"version": "0.2.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.
|
|
31
|
-
"@haklex/rich-
|
|
32
|
-
"@haklex/rich-headless": "0.
|
|
33
|
-
"@haklex/rich-
|
|
30
|
+
"@haklex/rich-editor": "0.2.0",
|
|
31
|
+
"@haklex/rich-editor-ui": "0.2.0",
|
|
32
|
+
"@haklex/rich-headless": "0.2.0",
|
|
33
|
+
"@haklex/rich-style-token": "0.2.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@lexical/react": "^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.
|
|
40
|
-
"@vanilla-extract/vite-plugin": "^5.
|
|
41
|
-
"lexical": "^0.
|
|
42
|
-
"lucide-react": "^1.
|
|
43
|
-
"react": "19.2.
|
|
44
|
-
"react-dom": "19.2.
|
|
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": "^
|
|
46
|
+
"vite": "^8.0.10",
|
|
47
47
|
"vite-plugin-dts": "^4.5.4"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@lexical/react": "^0.
|
|
51
|
-
"lexical": "^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"
|