diff --git a/scripts/docs-site/assets.mjs b/scripts/docs-site/assets.mjs index 3d75b90a7..0ae66da5a 100644 --- a/scripts/docs-site/assets.mjs +++ b/scripts/docs-site/assets.mjs @@ -6,6 +6,7 @@ export function siteCss() { .oc-table-wrap{max-width:100%;overflow:auto;margin:22px 0 28px;border:1px solid var(--line-strong);border-radius:8px;background:color-mix(in srgb,var(--paper) 72%,transparent)}.doc .oc-table{margin:0;width:100%;min-width:560px;border-collapse:separate;border-spacing:0;font-size:13px}.doc .oc-table th,.doc .oc-table td{border:0;border-bottom:1px solid var(--line);padding:10px 12px;text-align:left;vertical-align:top;overflow-wrap:anywhere;word-break:break-word}.doc .oc-table th{position:sticky;top:0;background:color-mix(in srgb,var(--paper-2) 86%,var(--soft) 14%);color:var(--ink);font:780 12px/1.35 ui-sans-serif,system-ui,sans-serif}.doc .oc-table tr:last-child td{border-bottom:0}.doc .oc-table td:first-child{color:var(--ink);font-weight:720}.oc-lead{margin:18px 0 28px;color:var(--text);font:500 17px/1.72 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}.oc-lead p{margin:0}.oc-pullquote{margin:30px 0;padding:3px 0 3px 24px;border-left:3px solid var(--brand);color:var(--ink)}.oc-pullquote blockquote{margin:0;padding:0;border:0;font:650 20px/1.55 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-style:normal}.oc-pullquote figcaption{margin-top:10px;color:var(--muted);font-size:12px}.oc-stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr));gap:12px;margin:24px 0}.oc-stat{border:1px solid var(--line-strong);border-radius:8px;background:color-mix(in srgb,var(--paper) 72%,transparent);padding:15px 16px}.oc-stat strong{display:block;color:var(--ink);font:780 24px/1 ui-sans-serif,system-ui,sans-serif;margin:0 0 8px}.oc-stat>span{display:block;color:var(--muted);font-size:12px;line-height:1.35}.oc-stat-delta{display:inline-block!important;width:max-content;margin-top:10px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--brand) 35%,var(--line-strong));border-radius:999px;background:color-mix(in srgb,var(--brand) 10%,var(--paper));color:var(--brand)!important}.oc-stat div p{margin:.8em 0 0}.oc-cta{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;align-items:end;margin:32px 0;padding:22px;border:1px solid color-mix(in srgb,var(--brand) 34%,var(--line-strong));border-radius:8px;background:linear-gradient(135deg,color-mix(in srgb,var(--paper) 82%,var(--brand) 18%),color-mix(in srgb,var(--paper-2) 92%,transparent));box-shadow:var(--shadow)}.oc-cta-copy>span{display:block;color:var(--brand);font:780 12px/1.2 ui-sans-serif,system-ui,sans-serif;margin:0 0 7px}.oc-cta-copy strong{display:block;color:var(--ink);font:780 19px/1.28 ui-sans-serif,system-ui,sans-serif;margin:0 0 8px}.oc-cta-copy p{margin:0;color:var(--text)}.oc-cta-actions{display:flex;flex-wrap:wrap;gap:9px;align-items:center}.oc-cta-link{display:inline-flex;align-items:center;justify-content:center;min-height:36px;padding:8px 12px;border:1px solid var(--line-strong);border-radius:7px;font:780 13px/1 ui-sans-serif,system-ui,sans-serif;transition:background .16s ease,border-color .16s ease,color .16s ease,filter .16s ease}.oc-cta-link-primary{background:var(--brand);border-color:var(--brand);color:#1b0d08}.oc-cta-link-secondary{background:color-mix(in srgb,var(--paper) 78%,transparent);color:var(--ink)}.oc-cta-link:after{content:"β†’";margin-left:8px}.oc-cta-link:hover{filter:brightness(1.04)}.oc-cta-link-primary:hover{background:color-mix(in srgb,var(--brand) 86%,white 14%);border-color:color-mix(in srgb,var(--brand) 86%,white 14%);color:#1b0d08}.oc-cta-link-secondary:hover{background:color-mix(in srgb,var(--soft) 62%,var(--paper) 38%);border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));color:var(--ink)}.oc-cta-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr));gap:14px;margin:24px 0}.oc-cta-card{display:block;min-height:160px;border:1px solid var(--line-strong);border-radius:8px;background:color-mix(in srgb,var(--paper) 78%,transparent);padding:18px 20px;color:var(--text);transition:border-color .16s ease,background .16s ease}.oc-cta-card:hover,.oc-cta-card:focus-visible{border-color:var(--brand);background:color-mix(in srgb,var(--soft) 38%,transparent);outline:0}.oc-cta-card .oc-card-icon{margin-bottom:14px}.oc-cta-card strong{display:block;color:var(--ink);font:760 16px/1.3 ui-sans-serif,system-ui,sans-serif;margin:0 0 4px}.oc-cta-kicker{display:block;color:var(--brand);font:760 12px/1.35 ui-sans-serif,system-ui,sans-serif;margin:0 0 9px}.oc-cta-card p{margin:0 0 14px;color:var(--muted)}.oc-cta-card .oc-cta-actions{margin-top:16px}.oc-chart{margin:28px 0;padding:16px;border:1px solid var(--line-strong);border-radius:8px;background:color-mix(in srgb,var(--paper) 76%,transparent)}.oc-chart figcaption{display:flex;align-items:baseline;justify-content:space-between;gap:14px;margin:0 0 16px}.oc-chart figcaption strong{color:var(--ink);font:780 15px/1.25 ui-sans-serif,system-ui,sans-serif}.oc-chart figcaption span{color:var(--muted);font-size:12px}.oc-chart-bars{display:grid;gap:10px}.oc-chart-row{display:grid;grid-template-columns:minmax(86px,150px) minmax(120px,1fr) auto;gap:10px;align-items:center}.oc-chart-row>span{color:var(--text);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-row strong{color:var(--ink);font:760 12px/1 ui-sans-serif,system-ui,sans-serif}.oc-chart-track{height:10px;border-radius:999px;background:color-mix(in srgb,var(--line-strong) 62%,transparent);overflow:hidden}.oc-chart-track i{display:block;width:var(--oc-chart-value);height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--brand),color-mix(in srgb,var(--brand) 54%,#48b49a 46%))}.oc-chart-line-wrap{display:grid;gap:10px}.oc-chart-line-svg{display:block;width:100%;height:auto;overflow:visible}.oc-chart-line-svg polyline{fill:none;stroke:var(--brand);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}.oc-chart-line-svg circle{fill:var(--paper);stroke:var(--brand);stroke-width:3}.oc-chart-gridline{stroke:var(--line-strong);stroke-width:1}.oc-chart-axis{display:flex;justify-content:space-between;gap:8px;color:var(--muted);font-size:11px}.oc-chart-axis span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oc-chart-data{position:absolute!important;width:1px!important;height:1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important}@media(max-width:820px){.oc-cta{grid-template-columns:1fr}.oc-chart-row{grid-template-columns:minmax(74px,110px) minmax(90px,1fr) auto}.doc .oc-table{min-width:0;table-layout:fixed}} *{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:120px}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.72 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}a:hover{color:var(--ink)}img{max-width:100%;height:auto}button,input,select{font:inherit}.hidden{display:none!important}.oc-visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}:root[data-theme="dark"] .dark\\:hidden{display:none!important}:root[data-theme="dark"] .dark\\:block{display:block!important}:root[data-theme="light"] .dark\\:block{display:none!important} .site-header{position:sticky;top:0;z-index:70;background:color-mix(in srgb,var(--bg) 94%,transparent);backdrop-filter:blur(18px);border-bottom:1px solid var(--line)}.header-row,.tabs{max-width:1780px;margin:0 auto}.doc-shell{max-width:1780px;margin:0 auto}.header-row{height:62px;display:grid;grid-template-columns:minmax(340px,1fr) minmax(360px,430px) minmax(340px,1fr);gap:24px;align-items:center;padding:0 56px}.header-left{display:flex;align-items:center;gap:16px;min-width:0}.brand{display:inline-flex;align-items:center;flex:0 0 auto}.brand img{width:24px;height:24px;image-rendering:pixelated}.language-picker{position:relative;min-width:0}.language-trigger{height:36px;border:1px solid transparent;border-radius:999px;background:color-mix(in srgb,var(--paper) 62%,transparent);color:var(--ink);display:flex;align-items:center;gap:9px;max-width:190px;padding:0 12px 0 11px;cursor:pointer;box-shadow:inset 0 1px 0 rgba(255,255,255,.02);transition:background .16s ease,border-color .16s ease,box-shadow .16s ease,color .16s ease}.language-trigger:hover,.language-picker.open .language-trigger{background:linear-gradient(180deg,color-mix(in srgb,var(--brand) 22%,var(--paper) 78%),color-mix(in srgb,var(--soft) 74%,var(--paper) 26%));border-color:color-mix(in srgb,var(--brand) 46%,var(--line-strong));color:var(--ink);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 13%,transparent),0 10px 30px rgba(0,0,0,.20),inset 0 1px 0 rgba(255,255,255,.04)}.language-trigger:focus-visible{outline:0;border-color:var(--brand);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 28%,transparent),0 10px 30px rgba(0,0,0,.20)}.language-trigger:hover .language-chevron{color:var(--brand)}.locale-flag{width:21px;height:21px;border-radius:50%;display:inline-grid;place-items:center;font-size:17px;line-height:1;overflow:hidden;flex:0 0 auto}.language-current{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;color:var(--ink)}.language-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;color:var(--muted);line-height:1;transition:transform .16s ease,color .16s ease}.language-chevron .icon{width:16px;height:16px}.language-picker.open .language-chevron{transform:rotate(180deg);color:var(--brand)}.language-menu{position:absolute;top:calc(100% + 10px);left:0;width:min(340px,calc(100vw - 32px));max-height:min(72vh,720px);overflow:auto;display:none;z-index:80;padding:10px;background:color-mix(in srgb,var(--bg) 92%,#000 8%);border:1px solid var(--line-strong);border-radius:22px;box-shadow:0 30px 90px rgba(0,0,0,.52),inset 0 1px 0 rgba(255,255,255,.03)}.language-picker.open .language-menu{display:block}.language-option{display:grid;grid-template-columns:30px minmax(0,1fr) 22px;align-items:center;gap:12px;padding:12px 16px;border-radius:16px;color:var(--ink);font-weight:800;font-size:18px;line-height:1.2}.language-option:hover{background:color-mix(in srgb,var(--paper-2) 84%,transparent);color:var(--ink)}.language-option.active{color:var(--brand)}.language-option.active:hover{background:color-mix(in srgb,var(--soft) 84%,transparent)}.language-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.language-check{opacity:0;color:var(--brand);font-size:19px;text-align:right}.language-option.active .language-check{opacity:1}.icon{display:block;width:18px;height:18px;min-width:18px;max-width:18px;flex:0 0 18px}.search-button{height:38px;border:1px solid var(--line-strong);border-radius:12px;background:color-mix(in srgb,var(--paper) 86%,transparent);color:var(--muted);display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:0 9px 0 14px;cursor:pointer;text-align:left;box-shadow:inset 0 1px 0 rgba(255,255,255,.03)}.search-button:hover{border-color:color-mix(in srgb,var(--brand) 42%,var(--line));color:var(--text)}.search-button:hover .search-shortcut{border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));color:var(--ink);background:color-mix(in srgb,var(--soft) 64%,var(--paper) 36%)}.search-label{min-width:0;font-size:14px;color:var(--muted)}.search-shortcut{display:inline-grid;place-items:center;justify-self:end;min-width:44px;height:28px;padding:0 9px;border:1px solid var(--line-strong);border-radius:10px;background:color-mix(in srgb,var(--paper-2) 82%,transparent);color:var(--text);font:760 13px/1 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;box-shadow:inset 0 1px 0 rgba(255,255,255,.03)}.header-links{display:flex;align-items:center;justify-content:flex-end;gap:22px;color:var(--muted);font-size:14px;white-space:nowrap}.header-links a{display:inline-flex;align-items:center;gap:7px;color:var(--muted);font-weight:650}.header-links a:hover{color:var(--ink)}.header-links a .icon{width:16px;height:16px;color:var(--ink)}.header-links button{border:0;background:transparent;color:var(--muted);cursor:pointer;padding:4px}.header-links button:hover{color:var(--ink)}.theme-toggle{display:inline-grid;place-items:center;width:28px;height:28px}.theme-toggle .icon{width:18px;height:18px}.nav-toggle{display:none;border:1px solid var(--line-strong);background:var(--paper);color:var(--ink);border-radius:8px;padding:7px 10px}.sidebar-close{display:none} +.search-shortcut{display:inline-flex;align-items:center;justify-content:flex-end;gap:2px;color:var(--muted);font:760 15px/1 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;background:transparent;border:0;border-radius:0;box-shadow:none;min-width:0;height:15px;padding:0}.search-shortcut span{display:block;line-height:15px}.search-shortcut .icon{width:15px;height:15px;min-width:15px;max-width:15px;stroke-width:2.2}.search-button:hover .search-shortcut{background:transparent;border-color:transparent;color:var(--ink)} .theme-toggle-icon{display:none;place-items:center}:root[data-theme="dark"] .theme-toggle-icon-dark,:root[data-theme="light"] .theme-toggle-icon-light{display:grid} .tabs{position:relative;display:flex;align-items:center;gap:32px;min-height:58px;padding:0 56px;overflow-x:auto;white-space:nowrap}.tab-link{position:relative;color:var(--muted);font-weight:700;font-size:14px;padding:17px 0 18px;transition:color .18s ease}.tab-link:hover{color:var(--ink)}.tab-link.active{color:var(--ink)}.tab-underline{position:absolute;left:0;bottom:0;height:2px;width:var(--tu-w,0);transform:translate3d(var(--tu-x,0),0,0);background:var(--brand);border-radius:2px;pointer-events:none;opacity:0;will-change:transform,width;transition:transform .28s cubic-bezier(.4,0,.2,1),width .28s cubic-bezier(.4,0,.2,1),opacity .18s ease}.tabs.is-ready .tab-underline{opacity:1}.tab-underline.no-transition{transition:none}@media(prefers-reduced-motion:reduce){.tab-underline{transition:opacity .18s ease}} .doc-shell{display:grid;grid-template-columns:340px minmax(0,1fr);gap:72px;padding:38px 56px 90px}.sidebar{position:sticky;top:148px;align-self:start;max-height:calc(100vh - 172px);overflow:auto;padding:0 6px 64px 0;scrollbar-gutter:stable;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--muted) 42%,transparent) transparent}.sidebar::-webkit-scrollbar{width:8px}.sidebar::-webkit-scrollbar-track{background:transparent}.sidebar::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--muted) 34%,transparent);background-clip:content-box;border:2px solid transparent;border-radius:999px}.sidebar:hover::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--muted) 56%,transparent)}.sidebar.has-overflow{--sidebar-fade-top:0px;--sidebar-fade-bottom:0px;mask-image:linear-gradient(to bottom,transparent 0,#000 var(--sidebar-fade-top),#000 calc(100% - var(--sidebar-fade-bottom)),transparent 100%);-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 var(--sidebar-fade-top),#000 calc(100% - var(--sidebar-fade-bottom)),transparent 100%)}.sidebar.can-scroll-up{--sidebar-fade-top:18px}.sidebar.can-scroll-down{--sidebar-fade-bottom:30px}.nav-section{margin:0 0 33px}.nav-section h2{font:750 13px/1.2 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--ink);letter-spacing:0;margin:0 0 14px}.nav-link{display:block;color:var(--muted);border-radius:9px;padding:7px 14px;margin:2px 0;font-size:14px;line-height:1.48}.nav-link:hover{color:var(--ink);background:color-mix(in srgb,var(--paper) 68%,transparent)}.nav-link.active{background:var(--soft);color:var(--brand);font-weight:730}.nav-nested{padding-left:10px;border-left:1px solid var(--line);margin:9px 0 0 6px}.nav-nested h2{font-size:12px;color:var(--muted);margin:0 0 5px;text-transform:none} @@ -19,7 +20,7 @@ export function siteCss() { .breadcrumbs{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12px;margin:0 0 12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.breadcrumbs span{min-width:0;overflow:hidden;text-overflow:ellipsis}.breadcrumbs .breadcrumb-part{display:inline-flex;align-items:center;gap:8px;flex:0 1 auto}.breadcrumbs .breadcrumb-separator{flex:0 0 auto}.breadcrumbs [aria-current="page"]{color:var(--text)}.page-status{display:flex;flex-wrap:wrap;gap:7px;margin:13px 0 0}.page-status-badge{display:inline-flex;align-items:center;min-height:24px;max-width:100%;border:1px solid var(--line-strong);border-radius:999px;background:color-mix(in srgb,var(--paper) 76%,transparent);color:var(--muted);padding:4px 9px;font:760 12px/1.25 ui-sans-serif,system-ui,sans-serif}.page-status-beta,.page-status-status{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--soft) 68%,transparent)}.page-status-deprecated{color:#d97706;border-color:color-mix(in srgb,#d97706 42%,var(--line-strong))}.page-tools{display:flex;align-items:center;gap:8px;margin-top:16px}.page-tools a,.page-tools button,.page-feedback button,.oc-prompt button{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);border-radius:7px;padding:6px 9px;font:760 12px/1 ui-sans-serif,system-ui,sans-serif;cursor:pointer}.page-tools a:hover,.page-tools button:hover,.page-feedback button:hover,.oc-prompt button:hover{border-color:var(--brand);color:var(--ink)}.oc-code figcaption{justify-content:space-between;gap:12px}.oc-code figcaption .oc-code-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;letter-spacing:.08em}.oc-code figcaption button{position:relative;display:grid;place-items:center;flex:0 0 32px;width:32px;height:30px;padding:0;border:1px solid transparent;background:transparent;color:var(--muted);border-radius:8px;cursor:pointer}.oc-code figcaption button:before,.oc-code figcaption button:after{content:"";position:absolute;box-sizing:border-box;width:13px;height:13px;border:1.6px solid currentColor;border-radius:4px;background:color-mix(in srgb,var(--paper-2) 42%,var(--code-block) 58%)}.oc-code figcaption button:before{left:7px;top:6px;opacity:.72}.oc-code figcaption button:after{left:11px;top:10px}.oc-code figcaption button:hover{border-color:color-mix(in srgb,var(--brand) 32%,var(--line-strong));background:color-mix(in srgb,var(--soft) 46%,transparent);color:var(--ink)}.oc-code figcaption button[data-copy-state="copied"]{color:var(--brand)}.oc-code figcaption button[data-copy-state="copied"]:before{content:"βœ“";position:static;width:auto;height:auto;border:0;background:transparent;font:900 14px/1 ui-sans-serif,system-ui,sans-serif}.oc-code figcaption button[data-copy-state="copied"]:after,.oc-code figcaption button[data-copy-state="failed"]:after{content:none}.oc-code figcaption button[data-copy-state="failed"]{color:#fca5a5}.oc-code figcaption button[data-copy-state="failed"]:before{content:"!";position:static;width:auto;height:auto;border:0;background:transparent;font:900 14px/1 ui-sans-serif,system-ui,sans-serif}.doc pre code{display:block;min-width:max-content}.doc .oc-code pre code{white-space:pre}.doc .code-line,.oc-code .code-line{display:block;min-height:1.5em;line-height:1.5;padding:0 2px;border-left:2px solid transparent;white-space:pre}.doc .code-line:before{content:attr(data-line);display:none;width:2.4em;margin-right:1em;color:var(--muted);text-align:right;user-select:none}.doc .has-line-numbers .code-line:before{display:inline-block}.doc .code-line.is-highlighted{background:color-mix(in srgb,var(--brand) 14%,transparent);border-left-color:var(--brand)}.doc .code-line.is-dimmed{opacity:.46}.doc .code-line.is-added{background:color-mix(in srgb,#48b49a 13%,transparent);border-left-color:#48b49a}.doc .code-line.is-removed{background:color-mix(in srgb,#d97706 12%,transparent);border-left-color:#d97706}.doc .oc-code.is-wrapped pre,.doc .oc-code.is-wrapped code{white-space:pre-wrap;min-width:0}.doc .oc-code.is-wrapped .code-line{white-space:pre-wrap}.doc .oc-code.is-expandable pre{max-height:360px}.oc-badge{display:inline-flex;align-items:center;min-height:1.55em;padding:0 .5em;border:1px solid var(--line-strong);border-radius:999px;background:var(--soft);color:var(--ink);font:760 .76em/1 ui-sans-serif,system-ui,sans-serif;vertical-align:middle}.oc-badge-orange{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong))}.oc-badge-green{color:#48b49a;border-color:color-mix(in srgb,#48b49a 38%,var(--line-strong))}.oc-panel,.oc-prompt,.oc-mermaid{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 86%,transparent);border-radius:8px;margin:18px 0;padding:16px}.oc-panel>strong{display:block;color:var(--ink);font:760 14px/1.3 ui-sans-serif,system-ui,sans-serif;margin:0 0 8px}.oc-prompt header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}.oc-prompt strong{color:var(--ink);font:760 14px/1.3 ui-sans-serif,system-ui,sans-serif}.oc-prompt p:last-child,.oc-panel p:last-child{margin-bottom:0}.oc-tile-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:10px;margin:18px 0}.oc-tile{display:flex;align-items:flex-start;gap:12px;border:1px solid var(--line-strong);border-radius:8px;padding:14px;color:var(--text);background:transparent}.oc-tile:hover{border-color:var(--brand);background:color-mix(in srgb,var(--soft) 28%,transparent)}.oc-tile strong{display:block;color:var(--ink);font:750 14px/1.3 ui-sans-serif,system-ui,sans-serif;margin:0 0 5px}.oc-tile p{margin:0;color:var(--muted);line-height:1.5}.oc-tile .oc-card-icon{flex:0 0 20px;width:20px;height:20px}.oc-mermaid{overflow:auto;display:grid;place-items:center;min-height:180px;padding:18px;color:var(--code-text);font:13px/1.65 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.oc-mermaid svg{display:block;max-width:100%;height:auto}.oc-mermaid pre{width:100%;margin:0}.oc-mermaid.is-rendered{background:color-mix(in srgb,var(--paper) 70%,transparent)}.oc-mermaid.is-error{display:block;place-items:normal;border-color:color-mix(in srgb,#d97706 42%,var(--line-strong))}.page-feedback{display:flex;align-items:center;gap:9px;border-top:1px solid var(--line);margin-top:42px;padding-top:18px;color:var(--muted);font-size:13px}.page-feedback output{color:var(--brand);font-weight:760}.page-nav{display:grid;grid-template-columns:1fr 1fr;gap:14px;border-top:1px solid var(--line);margin-top:24px;padding-top:18px}.page-nav a{border:1px solid var(--line-strong);background:var(--paper);border-radius:10px;padding:13px;color:var(--text)}.page-nav a:hover{border-color:var(--brand)}.page-nav small{display:block;color:var(--muted);font-size:11px;text-transform:uppercase}.next{text-align:right} .article-meta-row{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:0 0 12px}.article-meta-row .breadcrumbs{margin:0;min-width:0}.article-meta-row .page-tools{margin:0 0 0 auto}.page-actions{display:inline-flex;align-items:stretch;position:relative}.page-tools .page-actions-primary,.page-tools .page-actions-more summary{height:30px;min-height:30px;border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);font:760 12px/1 ui-sans-serif,system-ui,sans-serif;cursor:pointer}.page-tools .page-actions-primary{display:inline-flex;align-items:center;gap:7px;white-space:nowrap;border-right:1px solid var(--line-strong);border-radius:7px 0 0 7px;margin-right:-1px;padding:0 9px}.page-tools .page-actions-primary .icon{width:15px;height:15px;min-width:15px}.page-tools .page-actions-more{position:relative}.page-tools .page-actions-more summary{display:grid;place-items:center;width:34px;border-radius:0 7px 7px 0;padding:0;list-style:none}.page-tools .page-actions-more summary::-webkit-details-marker{display:none}.page-tools .page-actions-more summary::marker{content:""}.page-tools .page-actions-primary:hover,.page-tools .page-actions-more[open] summary,.page-tools .page-actions-more summary:hover{border-color:var(--brand);color:var(--ink)}.page-actions-chevron{display:grid;place-items:center;color:var(--muted)}.page-tools .page-actions-more summary .page-actions-chevron .icon{width:15px;height:15px;min-width:15px;transition:transform .16s ease}.page-tools .page-actions-more[open] .page-actions-chevron .icon{transform:rotate(180deg)}.page-tools .page-actions-more .page-actions-menu{position:absolute;top:calc(100% + 8px);left:auto;right:0;z-index:40;display:none;gap:4px;min-width:260px;padding:8px;border:1px solid var(--line-strong);border-radius:10px;background:var(--paper);box-shadow:var(--shadow)}.page-tools .page-actions-more[open] .page-actions-menu{display:grid}.page-tools .page-action{display:grid;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:10px;width:100%;padding:9px;border:0;border-radius:8px;background:transparent;color:var(--text);text-align:left;text-decoration:none;cursor:pointer}.page-tools .page-action:hover{background:var(--soft);color:var(--ink)}.page-tools .page-action .icon{width:17px;height:17px}.page-tools .page-action strong{display:block;color:var(--ink);font:760 12px/1.2 ui-sans-serif,system-ui,sans-serif}.page-tools .page-action small{display:block;margin-top:3px;color:var(--muted);font:650 11px/1.25 ui-sans-serif,system-ui,sans-serif}.page-tools .page-action-external{justify-self:end;color:var(--muted);font-size:12px}.page-feedback-links{display:flex;align-items:center;gap:9px;margin-left:auto}.page-feedback-links a{border:1px solid var(--line-strong);background:color-mix(in srgb,var(--paper) 82%,transparent);color:var(--muted);border-radius:7px;padding:6px 9px;font:760 12px/1 ui-sans-serif,system-ui,sans-serif}.page-feedback-links a:hover{border-color:var(--brand);color:var(--ink)}@media(max-width:620px){.page-feedback-links{flex-basis:100%;margin:3px 0 0}} .doc .oc-code.is-expandable{position:relative}.doc .oc-code.is-expandable pre{max-height:360px;padding-bottom:44px}.doc .oc-code.is-expandable.is-expanded pre{max-height:none}.doc .oc-code.is-expandable:not(.is-expanded):after{content:"";position:absolute;left:0;right:0;bottom:39px;height:72px;background:linear-gradient(180deg,transparent,var(--code-block));pointer-events:none}.oc-code-expand{position:absolute;left:0;right:0;bottom:0;z-index:2;width:100%;min-height:40px;border:0;border-top:1px solid var(--code-border);background:color-mix(in srgb,var(--code-block) 88%,var(--paper-2) 12%);color:var(--brand);font:760 12px/1 ui-sans-serif,system-ui,sans-serif;cursor:pointer}.oc-code-expand:hover,.oc-code-expand:focus-visible{color:var(--ink);background:color-mix(in srgb,var(--soft) 48%,var(--code-block));outline:0} -.search-modal{position:fixed;inset:0;background:rgba(0,0,0,.62);display:none;z-index:90;padding:8vh 18px}.search-modal.open{display:block}.search-panel{max-width:760px;margin:0 auto;background:var(--paper);border:1px solid var(--line-strong);border-radius:14px;box-shadow:var(--shadow);overflow:hidden}.search-head{display:flex;gap:10px;padding:12px;border-bottom:1px solid var(--line)}.search-head input{flex:1;border:1px solid var(--line-strong);border-radius:10px;padding:10px;background:var(--bg);color:var(--text)}.search-head button{border:1px solid var(--line-strong);background:var(--paper-2);color:var(--text);border-radius:9px;padding:0 12px}.search-hints{display:flex;flex-wrap:wrap;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 58%,transparent)}.search-hints button{border:1px solid var(--line-strong);border-radius:999px;background:transparent;color:var(--muted);padding:5px 9px;font:730 12px/1 ui-sans-serif,system-ui,sans-serif;cursor:pointer}.search-hints button:hover{color:var(--ink);border-color:var(--brand)}.search-results{min-height:220px;max-height:62vh;overflow:auto;padding:8px 12px 14px}.search-results.is-loading{cursor:progress}.search-state{margin:0;padding:12px;color:var(--muted)}.search-result{display:block;border-bottom:1px solid var(--line);padding:12px;color:var(--text)}.search-result strong{display:block;color:var(--ink)}.search-result p{margin:.35em 0 0;color:var(--muted);font-size:13px} +.search-modal{position:fixed;inset:0;background:rgba(0,0,0,.62);display:none;z-index:90;padding:clamp(12px,8vh,72px) 18px}.search-modal.open{display:block}.search-panel{display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;width:min(820px,100%);max-height:min(640px,calc(100vh - 16vh));margin:0 auto;background:var(--paper);border:1px solid var(--line-strong);border-radius:14px;box-shadow:var(--shadow);overflow:hidden}.search-head{position:relative;padding:12px;border-bottom:1px solid var(--line)}.search-head input{width:100%;border:1px solid var(--line-strong);border-radius:10px;padding:12px 44px 12px 12px;background:var(--bg);color:var(--text);outline:0}.search-head input:focus{border-color:color-mix(in srgb,var(--brand) 42%,var(--line-strong));box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 16%,transparent)}.search-close{position:absolute;top:50%;right:22px;display:inline-grid;place-items:center;width:28px;height:28px;transform:translateY(-50%);border:0;background:transparent;color:var(--muted);border-radius:7px;padding:0;cursor:pointer}.search-close:hover,.search-close:focus-visible{color:var(--ink);background:color-mix(in srgb,var(--paper-2) 72%,transparent);outline:0}.search-close .icon{width:17px;height:17px}.search-hints{grid-row:2;display:flex;flex-wrap:wrap;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 58%,transparent)}.search-modal.has-query .search-hints{display:none}.search-hints button{border:1px solid var(--line-strong);border-radius:999px;background:transparent;color:var(--muted);padding:6px 10px;font:730 12px/1 ui-sans-serif,system-ui,sans-serif;cursor:pointer}.search-hints button:hover,.search-hints button:focus-visible{color:var(--ink);border-color:var(--brand);background:color-mix(in srgb,var(--soft) 42%,transparent);outline:0}.search-results{grid-row:3;position:relative;min-height:0;max-height:min(440px,calc(100vh - 260px));overflow:auto;padding:8px 12px 22px;scrollbar-color:color-mix(in srgb,var(--muted) 62%,transparent) transparent}.search-results:after{content:"";position:sticky;left:0;right:0;bottom:-22px;display:block;height:26px;margin:0 -12px -22px;pointer-events:none;background:linear-gradient(180deg,transparent,var(--paper) 82%)}.search-results::-webkit-scrollbar{width:10px}.search-results::-webkit-scrollbar-track{background:transparent}.search-results::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--muted) 58%,transparent);border:3px solid transparent;border-radius:999px;background-clip:content-box}.search-results.is-loading{cursor:progress;display:grid;place-items:center}.search-results.is-loading:after{display:none}.search-state{margin:0;padding:12px;color:var(--muted)}.search-loading{display:grid;place-items:center;gap:12px;padding:36px 0;color:var(--muted);font-weight:720}.search-empty{min-height:260px;display:grid;place-content:center;justify-items:center;gap:10px;padding:34px;color:var(--muted);text-align:center}.search-empty-icon{display:grid;place-items:center;width:42px;height:42px;margin:0 0 4px;border:1px solid color-mix(in srgb,var(--brand) 30%,var(--line-strong));border-radius:999px;background:color-mix(in srgb,var(--soft) 36%,transparent);color:color-mix(in srgb,var(--brand) 78%,var(--muted))}.search-empty-icon .icon{width:19px;height:19px;min-width:19px;max-width:19px;stroke-width:2.1}.search-empty strong{max-width:100%;overflow-wrap:anywhere;color:var(--ink);font:780 16px/1.35 ui-sans-serif,system-ui,sans-serif}.search-empty p{max-width:420px;margin:0 auto;color:var(--text);font-size:13px}.search-empty-kbd{display:inline-flex;align-items:center;gap:2px;height:20px;margin:0 .18em;padding:0 6px;border:1px solid var(--line-strong);border-radius:7px;background:color-mix(in srgb,var(--paper-2) 70%,transparent);color:var(--ink);vertical-align:-4px}.search-empty-kbd .icon{width:13px;height:13px;min-width:13px;max-width:13px;stroke-width:2.2}.search-spinner{display:inline-flex;width:42px;height:42px;flex:0 0 auto;align-items:center;justify-content:center;border:1px solid color-mix(in srgb,var(--brand) 36%,var(--line));border-radius:999px;background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.18),transparent 28%),color-mix(in srgb,var(--paper-2) 82%,var(--brand) 18%);box-shadow:inset 0 0 0 1px rgba(255,255,255,.04),0 10px 32px color-mix(in srgb,var(--brand) 18%,transparent);transform-style:preserve-3d;animation:search-spinner-orbit 2.8s linear infinite}.search-spinner-emoji:before{content:"πŸ¦‘";display:block;font-size:22px;line-height:1;transform:translateZ(8px);transform-style:preserve-3d;animation:search-spinner-emoji 2.8s steps(1,end) infinite,search-spinner-emoji-spin 2.8s linear infinite}.search-result{display:grid;grid-template-columns:minmax(0,1fr) 24px;grid-template-areas:"meta enter" "title enter" "snippet snippet";gap:5px 10px;border-bottom:1px solid var(--line);border-radius:0;padding:12px 14px;color:var(--text);outline:0}.search-result:hover,.search-result:focus-visible,.search-result.active{border-radius:10px;background:color-mix(in srgb,var(--paper-2) 92%,transparent);color:var(--text)}.search-result.active{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--line-strong) 92%,transparent)}.search-result-meta{grid-area:meta;display:flex;min-width:0;gap:8px;align-items:center;color:var(--muted);font:700 12px/1 ui-sans-serif,system-ui,sans-serif}.search-result-meta span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-meta span+span:before{content:"/";margin-right:8px;color:var(--muted)}.search-result strong{grid-area:title;display:block;min-width:0;color:var(--ink);font:780 15px/1.35 ui-sans-serif,system-ui,sans-serif}.search-result p{grid-area:snippet;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:.1em 0 0;color:var(--muted);font-size:13px}.search-result mark{border-radius:3px;background:color-mix(in srgb,var(--brand) 28%,transparent);color:var(--ink);box-shadow:0 0 0 1px color-mix(in srgb,var(--brand) 22%,transparent);box-decoration-break:clone;-webkit-box-decoration-break:clone}.search-result-enter{grid-area:enter;align-self:center;justify-self:end;display:grid;place-items:center;width:24px;height:24px;color:var(--muted);opacity:0}.search-result-enter .icon{width:17px;height:17px;min-width:17px;max-width:17px;stroke-width:2.1}.search-result.active .search-result-enter,.search-result:hover .search-result-enter{opacity:1}.search-molty{grid-row:4;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;width:100%;border:0;border-top:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 60%,transparent);color:var(--text);padding:11px 14px;cursor:pointer;text-align:left}.search-molty:hover,.search-molty:focus-visible{background:color-mix(in srgb,var(--soft) 52%,var(--paper) 48%);outline:0}.search-molty img{width:28px;height:28px;border-radius:999px}.search-molty span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-molty [hidden]{display:none}.search-molty strong{color:var(--brand);font-weight:800;background:linear-gradient(90deg,var(--brand),color-mix(in srgb,var(--brand) 55%,white 45%),var(--brand));background-size:220% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:search-term-shimmer 1.7s ease-in-out infinite}.search-molty-shortcut{display:inline-flex;align-items:center;justify-content:flex-end;gap:2px;color:var(--muted);height:15px}.search-molty-shortcut .icon{width:15px;height:15px;min-width:15px;max-width:15px;stroke-width:2.2}.search-molty:hover .search-molty-shortcut,.search-molty:focus-visible .search-molty-shortcut{color:var(--ink)}@media(max-width:640px){.search-modal{padding:10px}.search-modal.open{display:grid;align-items:center}.search-panel{border-radius:12px}.search-head{padding:9px}.search-head input{font-size:16px;line-height:1.35;padding:11px 40px 11px 11px}.search-close{right:16px}.search-hints{flex-wrap:nowrap;overflow-x:auto;gap:7px;padding:8px 9px}.search-hints button{flex:0 0 auto}.search-results{max-height:min(340px,calc(100vh - 230px));padding:7px 8px 20px}.search-results:after{margin:0 -8px -20px}.search-empty{min-height:220px;padding:22px 18px}.search-empty p{max-width:280px}.search-result{grid-template-columns:minmax(0,1fr);grid-template-areas:"meta" "title" "snippet";padding:11px 10px}.search-result-enter{display:none}.search-molty{gap:8px;padding:10px 11px}.search-molty img{width:24px;height:24px}.search-molty-shortcut{display:none}}@keyframes search-term-shimmer{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}@keyframes search-spinner-orbit{0%{transform:rotateY(0deg)}12.49%{transform:rotateY(89deg)}12.5%{transform:rotateY(90deg)}25%{transform:rotateY(180deg)}37.49%{transform:rotateY(269deg)}37.5%{transform:rotateY(270deg)}50%{transform:rotateY(360deg)}62.49%{transform:rotateY(449deg)}62.5%{transform:rotateY(450deg)}75%{transform:rotateY(540deg)}87.49%{transform:rotateY(629deg)}87.5%{transform:rotateY(630deg)}100%{transform:rotateY(720deg)}}@keyframes search-spinner-emoji-spin{0%{transform:translateZ(8px) rotateY(0deg)}12.49%{transform:translateZ(8px) rotateY(-89deg)}12.5%{transform:translateZ(8px) rotateY(-90deg)}25%{transform:translateZ(8px) rotateY(-180deg)}37.49%{transform:translateZ(8px) rotateY(-269deg)}37.5%{transform:translateZ(8px) rotateY(-270deg)}50%{transform:translateZ(8px) rotateY(-360deg)}62.49%{transform:translateZ(8px) rotateY(-449deg)}62.5%{transform:translateZ(8px) rotateY(-450deg)}75%{transform:translateZ(8px) rotateY(-540deg)}87.49%{transform:translateZ(8px) rotateY(-629deg)}87.5%{transform:translateZ(8px) rotateY(-630deg)}100%{transform:translateZ(8px) rotateY(-720deg)}}@keyframes search-spinner-emoji{0%,12.49%{content:"πŸ¦‘"}12.5%,37.49%{content:"🦞"}37.5%,62.49%{content:"🦐"}62.5%,87.49%{content:"πŸ¦€"}87.5%,100%{content:"πŸ¦‘"}}@media(prefers-reduced-motion:reduce){.search-spinner,.search-spinner-emoji:before,.search-molty strong{animation:none}} .docs-chat{position:fixed;top:0;right:0;bottom:0;width:min(380px,calc(100vw - 28px));z-index:80;pointer-events:none}.docs-chat-launcher{position:absolute;right:18px;bottom:18px;height:46px;border:1px solid color-mix(in srgb,var(--brand) 48%,var(--line-strong));border-radius:999px;background:color-mix(in srgb,var(--paper-2) 86%,#000 14%);color:var(--ink);display:flex;align-items:center;gap:9px;padding:0 17px 0 8px;font-weight:850;cursor:pointer;box-shadow:0 16px 44px rgba(0,0,0,.30),inset 0 1px 0 rgba(255,255,255,.03);pointer-events:auto;overflow:hidden;isolation:isolate;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease}.docs-chat.open .docs-chat-launcher{display:none}.docs-chat-launcher:after{content:"";position:absolute;inset:-1px;border-radius:inherit;background:linear-gradient(90deg,transparent 36%,color-mix(in srgb,var(--brand) 20%,transparent) 74%,color-mix(in srgb,var(--brand) 34%,transparent));opacity:0;z-index:-1;transition:opacity .2s ease}.docs-chat-launcher:hover{border-color:var(--brand);color:var(--ink);transform:translateY(-1px);box-shadow:0 18px 50px rgba(0,0,0,.34),0 0 22px color-mix(in srgb,var(--brand) 10%,transparent),inset 0 1px 0 rgba(255,255,255,.04)}.docs-chat-launcher:hover:after{opacity:1}.docs-chat-avatar{display:block;width:32px;height:32px;border-radius:999px;object-fit:contain;flex:0 0 auto}.docs-chat-launcher .docs-chat-avatar{width:30px;height:30px}.docs-chat-title .docs-chat-avatar{width:34px;height:34px}.docs-chat-panel{position:absolute;inset:0;display:none;grid-template-rows:auto auto minmax(0,1fr) auto;background:color-mix(in srgb,var(--paper) 94%,#000 6%);border-left:1px solid var(--line-strong);box-shadow:-24px 0 70px rgba(0,0,0,.34);overflow:hidden;pointer-events:auto}.docs-chat.open .docs-chat-panel{display:grid}.docs-chat-head{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:64px;padding:14px 14px 13px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper-2) 88%,transparent)}.docs-chat-head p{margin:0 0 2px;color:var(--brand);font-size:12px;font-weight:850;text-transform:uppercase}.docs-chat-head h2{margin:0;color:var(--ink);font:760 18px/1.1 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}.docs-chat-actions{display:flex;align-items:center;gap:7px}.docs-chat-icon{position:relative;display:grid;place-items:center;width:34px;height:34px;border:1px solid transparent;border-radius:10px;background:transparent;color:var(--muted);padding:0;line-height:1;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease}.docs-chat-icon .icon{width:17px;height:17px}.docs-chat-icon:hover{border-color:color-mix(in srgb,var(--brand) 38%,var(--line-strong));background:color-mix(in srgb,var(--paper-2) 82%,transparent);color:var(--ink)}.docs-chat-icon:disabled{opacity:.35;cursor:not-allowed}.docs-chat-icon[data-copy-state="copied"]{color:var(--brand);border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));background:color-mix(in srgb,var(--soft) 70%,transparent)}.docs-chat-minimize{font-size:22px}.docs-chat-clear[hidden]{display:none}.docs-chat-auth{padding:14px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--paper) 92%,#000 8%)}.docs-chat-auth[hidden]{display:none}.docs-chat-auth-card{border:1px solid var(--line-strong);border-radius:14px;background:color-mix(in srgb,var(--paper-2) 86%,transparent);padding:14px}.docs-chat-auth-card p{margin:0 0 16px;color:var(--text);font-size:14px;line-height:1.45;text-wrap:balance}.docs-chat-auth-card strong{display:block;color:var(--ink);font:760 15px/1.25 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;margin-bottom:8px}.docs-chat-verify{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:40px;border:1px solid var(--brand);border-radius:12px;background:var(--brand);color:#15100e!important;font-weight:850;padding:0 14px;text-decoration:none!important}.docs-chat-github-icon{width:18px;height:18px;fill:currentColor;flex:0 0 auto}.docs-chat-verify:hover{background:color-mix(in srgb,var(--brand) 86%,white 14%);color:#15100e!important}.docs-chat-log{overflow:auto;padding:14px 14px 16px;display:flex;flex-direction:column;gap:10px}.docs-chat-message{max-width:94%;border:1px solid var(--line);border-radius:14px;padding:10px 12px;overflow-wrap:break-word}.docs-chat-message p{margin:0 0 .7em}.docs-chat-message p:last-child{margin-bottom:0}.docs-chat-message a{color:var(--brand);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px;word-break:break-word}.docs-chat-message code{background:var(--code);border:1px solid var(--line-strong);border-radius:5px;padding:.05em .32em;color:var(--code-text);font-size:.9em}.docs-chat-code{margin:.35em 0 .85em;border:1px solid var(--line-strong);border-radius:8px;background:color-mix(in srgb,var(--code) 92%,#000 8%);overflow:hidden;box-shadow:0 14px 40px rgba(0,0,0,.22)}.docs-chat-code-head{display:flex;align-items:center;min-height:28px;padding:5px 10px;border-bottom:1px solid var(--line);color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase}.docs-chat-code pre{margin:0;padding:12px;overflow:auto;white-space:pre;line-height:1.55}.docs-chat-code code{display:block;background:transparent!important;border:0!important;border-radius:0!important;padding:0!important;color:var(--code-text);font-size:12px}.docs-chat-message.user{align-self:flex-end;background:var(--brand);border-color:var(--brand);color:#14100f}.docs-chat-message.assistant{align-self:flex-start;background:var(--paper-2);color:var(--text)}.docs-chat-message.thinking{padding:14px;min-height:42px;display:inline-flex;align-items:center}.docs-chat-thinking{display:inline-flex;gap:7px;align-items:flex-end;height:14px}.docs-chat-thinking span{width:7px;height:7px;border-radius:50%;background:var(--muted);animation:docs-chat-dot 1.25s cubic-bezier(.4,0,.2,1) infinite;will-change:transform,opacity,background-color}.docs-chat-thinking span:nth-child(2){animation-delay:.18s}.docs-chat-thinking span:nth-child(3){animation-delay:.36s}@keyframes docs-chat-dot{0%,80%,100%{opacity:.3;transform:translateY(0) scale(.85);background:var(--muted)}40%{opacity:1;transform:translateY(-5px) scale(1);background:var(--brand)}}@media(prefers-reduced-motion:reduce){.docs-chat-thinking span{animation-duration:2.4s;animation-name:docs-chat-dot-fade}@keyframes docs-chat-dot-fade{0%,100%{opacity:.35}50%{opacity:1}}}.docs-chat-message.error{border-color:#8b2f28;color:#ffb4a8;background:color-mix(in srgb,#401510 35%,var(--paper))}.docs-chat-form{display:grid;grid-template-columns:1fr auto;gap:10px;padding:12px;border-top:1px solid var(--line);background:var(--paper)}.docs-chat-form[hidden]{display:none}.docs-chat-form textarea{resize:none;min-height:50px;max-height:160px;border:1px solid var(--line-strong);border-radius:14px;background:var(--bg);color:var(--ink);padding:12px 12px;line-height:1.35}.docs-chat-form textarea:focus{outline:2px solid color-mix(in srgb,var(--brand) 42%,transparent);border-color:var(--brand)}.docs-chat-form button{align-self:end;display:grid;place-items:center;width:42px;height:42px;border:1px solid var(--brand);border-radius:12px;background:var(--brand);color:#15100e;font-weight:850;padding:0;cursor:pointer}.docs-chat-form button .icon{width:18px;height:18px}.docs-chat-form button:disabled{opacity:.55;cursor:wait} .docs-chat{top:auto;right:18px;bottom:18px;width:min(420px,calc(100vw - 36px));height:min(680px,calc(100vh - 36px));transition:width .24s cubic-bezier(.23,1,.32,1),height .24s cubic-bezier(.23,1,.32,1)}.docs-chat-launcher{right:0;bottom:0}.docs-chat.expanded{width:min(760px,calc(100vw - 36px));height:min(860px,calc(100vh - 36px))}.docs-chat.open{pointer-events:auto}.docs-chat:not(.open):not(.closing){right:18px!important}.docs-chat.open .docs-chat-launcher,.docs-chat.closing .docs-chat-launcher{display:flex;opacity:0;visibility:hidden;pointer-events:none}.docs-chat-panel{display:grid;opacity:0;transform:translateY(10px) scale(.985);transform-origin:bottom right;pointer-events:none;transition:transform .2s cubic-bezier(.23,1,.32,1),opacity .16s ease}.docs-chat.open .docs-chat-panel{display:grid;opacity:1;transform:none;pointer-events:auto}.docs-chat-maximize[aria-pressed="true"]{border-color:color-mix(in srgb,var(--brand) 44%,var(--line-strong));background:color-mix(in srgb,var(--soft) 68%,transparent);color:var(--ink)}.docs-chat-maximize .icon{transition:none}@media(prefers-reduced-motion:reduce){.docs-chat,.docs-chat-panel{transition:none}} .docs-chat-panel{grid-template-rows:auto auto minmax(0,1fr) auto;inline-size:100%;min-width:0;max-width:100%;background:var(--bg);border:1px solid var(--line-strong);border-radius:16px;box-shadow:0 22px 70px rgba(0,0,0,.42);overflow:hidden}.docs-chat-panel>*{min-width:0;max-width:100%}.docs-chat-head{grid-row:1;min-height:58px;overflow:hidden;padding:10px 14px;background:var(--bg);border-bottom:1px solid var(--line);cursor:grab;touch-action:none;user-select:none}.docs-chat.dragging .docs-chat-head{cursor:grabbing}.docs-chat-title{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0}.docs-chat-mark{display:grid;place-items:center;flex:0 0 28px;width:28px;height:28px;color:var(--brand);filter:drop-shadow(0 0 12px color-mix(in srgb,var(--brand) 35%,transparent))}.docs-chat-mark .icon{width:25px;height:25px;stroke-width:1.8}.docs-chat-head h2{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:500 17px/1.05 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;letter-spacing:.04em}.docs-chat-actions{flex:0 0 auto;min-width:0;gap:6px}.docs-chat-icon{width:29px;height:29px;border-radius:10px;color:color-mix(in srgb,var(--muted) 82%,transparent)}.docs-chat-icon[hidden]{display:none}.docs-chat-icon .icon{width:17px;height:17px}.docs-chat-copy[data-copy-state] .icon{display:none}.docs-chat-copy[data-copy-state]:before{font:900 15px/1 ui-sans-serif,system-ui,sans-serif}.docs-chat-copy[data-copy-state="copied"]:before{content:"βœ“"}.docs-chat-copy[data-copy-state="failed"]:before{content:"!"}.docs-chat-minimize{font-size:27px;font-weight:320}.docs-chat-log{grid-row:3;min-width:0;overflow-x:hidden;padding:24px 22px 18px;gap:12px}.docs-chat-message{max-width:min(86%,calc(100% - 28px));min-width:0;overflow-wrap:anywhere;word-break:break-word}.docs-chat-message.user{margin-right:0}.docs-chat-code{max-width:100%}.docs-chat-empty{max-width:300px;margin:0 auto;color:color-mix(in srgb,var(--muted) 72%,transparent);text-align:center;font:500 15px/1.45 ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;letter-spacing:.03em}.docs-chat-form{grid-row:4;position:relative;display:block;width:100%;min-width:0;max-width:100%;overflow:hidden;padding:16px 22px 22px;border-top:0;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--bg) 96%,#000 4%) 22%)}.docs-chat:not([data-chat-auth-state="ready"]) .docs-chat-form{display:none}.docs-chat-form textarea{display:block;inline-size:100%;max-width:100%;min-width:0;min-height:118px;max-height:158px;border-radius:22px;padding:20px 66px 42px 20px;background:var(--bg);font-size:16px;line-height:1.5;overflow:hidden;box-shadow:inset 0 1px 0 rgba(255,255,255,.02)}.docs-chat-form textarea:focus{outline:0;border-color:var(--brand);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 48%,transparent),inset 0 0 0 4px color-mix(in srgb,var(--brand) 12%,transparent),inset 0 1px 0 rgba(255,255,255,.03)}.docs-chat-attach{position:absolute;left:40px;bottom:38px;display:grid;place-items:center;width:28px;height:28px;color:var(--muted);pointer-events:none}.docs-chat-attach .icon{width:17px;height:17px}.docs-chat-form button{position:absolute;right:34px;bottom:34px;width:38px;height:38px;border-radius:999px}.docs-chat-auth{grid-row:4;align-self:end;border-top:1px solid var(--line);border-bottom:0;background:var(--bg);padding:16px 22px 22px}.docs-chat-auth-card{border-radius:16px} @@ -34,7 +35,7 @@ export function siteCss() { export function siteJs() { return ` const root=document.documentElement;const saved=localStorage.getItem("theme");root.dataset.theme=saved||"dark"; -const modal=document.querySelector(".search-modal");const input=document.querySelector("[data-search-input]");const results=document.querySelector("[data-search-results]");let pagefindReady;let navigating=false; +const modal=document.querySelector(".search-modal");const input=document.querySelector("[data-search-input]");const results=document.querySelector("[data-search-results]");const moltySearch=document.querySelector("[data-search-molty]");const moltySearchPrefix=document.querySelector("[data-search-molty-prefix]");const moltySearchTerm=document.querySelector("[data-search-molty-term]");let pagefindReady;let pagefindLoadAttempt=0;let navigating=false;let searchItems=[];let searchActiveIndex=-1; function withBase(url){const base=window.OPENCLAW_DOCS_BASE||"";if(!base||!url.startsWith("/"))return url;return url===base||url.startsWith(base+"/")?url:base+url} function closeLanguage(){const picker=document.querySelector("[data-language-picker]");const trigger=document.querySelector("[data-language-trigger]");picker?.classList.remove("open");trigger?.setAttribute("aria-expanded","false")} function toggleLanguage(){const picker=document.querySelector("[data-language-picker]");const trigger=document.querySelector("[data-language-trigger]");const open=!picker?.classList.contains("open");picker?.classList.toggle("open",open);trigger?.setAttribute("aria-expanded",String(open))} @@ -77,7 +78,11 @@ function setActiveTocLink(id){const toc=document.querySelector(".toc");if(!toc)r function currentTocHeadingId(headings){const top=parseFloat(getComputedStyle(document.documentElement).scrollPaddingTop)||120;const scroller=document.scrollingElement||document.documentElement;if(scroller.scrollTop+innerHeight>=scroller.scrollHeight-2)return headings.at(-1)?.id||"";let current=headings[0];for(const heading of headings){if(heading.getBoundingClientRect().top<=top+1)current=heading;else break}return current?.id||""} function initTocScrollspy(){tocObserver?.disconnect();tocObserver=null;if(tocScrollHandler){removeEventListener("scroll",tocScrollHandler);tocScrollHandler=null;}const toc=document.querySelector(".toc");if(!toc)return;const links=[...toc.querySelectorAll('a[href^="#"]')];const headings=[...document.querySelectorAll(".doc h2[id],.doc h3[id]")].filter(heading=>links.some(link=>tocLinkId(link)===heading.id));links.forEach(link=>link.classList.remove("active"));if(!headings.length)return;const sync=()=>setActiveTocLink(currentTocHeadingId(headings));let tocScrollRaf=0;tocScrollHandler=()=>{cancelAnimationFrame(tocScrollRaf);tocScrollRaf=requestAnimationFrame(sync)};addEventListener("scroll",tocScrollHandler,{passive:true});requestAnimationFrame(sync);if(!("IntersectionObserver" in window)){sync();return}tocObserver=new IntersectionObserver(sync,{rootMargin:"-120px 0px -70% 0px",threshold:[0,1]});headings.forEach(heading=>tocObserver.observe(heading))} async function navigateTo(url,replace=false){if(navigating)return false;navigating=true;closeLanguage();try{const res=await fetch(url.href,{credentials:"same-origin"});if(!res.ok||!res.headers.get("content-type")?.includes("text/html"))return false;const nextDoc=new DOMParser().parseFromString(await res.text(),"text/html");if(!nextDoc.querySelector(".main"))return false;syncSidebar(nextDoc);swap(".header-left",nextDoc);swapTabs(nextDoc);swap(".main",nextDoc);syncStickyHeaderOffset();syncTocDisclosure();initCodeGroups();initPageFeedback();initMermaid();document.title=nextDoc.title;history[replace?"replaceState":"pushState"]({docs:true},"",url.href);setNavOpen(false);scrollTarget(url.hash);initTocScrollspy();return true}catch{return false}finally{navigating=false}} -function openSearch(){modal?.classList.add("open");setTimeout(()=>input?.focus(),0);pagefindReady ||= import(withBase("/pagefind/pagefind.js")).then(m=>m.init?.().then?.(()=>m)??m)} +function unavailableSearch(){return {unavailable:true,search:async()=>({results:[]})}} +function loadPagefind(){if(pagefindReady)return pagefindReady;const src=withBase("/pagefind/pagefind.js")+(pagefindLoadAttempt?"?retry="+pagefindLoadAttempt:"");pagefindLoadAttempt+=1;pagefindReady=import(src).then(m=>m.init?.().then?.(()=>m)??m).catch(()=>{pagefindReady=null;return unavailableSearch()});return pagefindReady} +function openSearch(){if(!modal)return;modal.classList.add("open");if(!searchQuery()&&results&&!results.innerHTML.trim())results.innerHTML=searchInitialHtml();setSearchChrome(searchQuery());setTimeout(()=>input?.focus(),0);loadPagefind()} +function clearSearch(){clearTimeout(searchTimer);seq+=1;searchItems=[];searchActiveIndex=-1;setSearchLoading(false);if(input)input.value="";setSearchChrome("");if(results){results.classList.remove("is-loading");results.innerHTML=searchInitialHtml()}} +function closeSearch(){modal?.classList.remove("open");clearSearch()} function escapeHtml(text){return String(text).replace(/[&<>"']/g,ch=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[ch]))} function trimTrailingPunctuation(value){return value.replace(/[.,;!?]+$/,"")} function compactGithubLinks(text){return String(text).replace(/(^|[\\s>])https:\\/\\/github\\.com\\/openclaw\\/openclaw\\/issues\\/(\\d+)\\/?(?=[\\s).,;!?]|$)/g,(_,prefix,number)=>prefix+"[Issue #"+number+"](https://github.com/openclaw/openclaw/issues/"+number+")").replace(/(^|[\\s>])https:\\/\\/github\\.com\\/openclaw\\/openclaw\\/pull\\/(\\d+)\\/?(?=[\\s).,;!?]|$)/g,(_,prefix,number)=>prefix+"[PR #"+number+"](https://github.com/openclaw/openclaw/pull/"+number+")").replace(/(^|[\\s>])https:\\/\\/github\\.com\\/openclaw\\/openclaw\\/commit\\/([0-9a-f]{7,40})\\/?(?=[\\s).,;!?]|$)/gi,(_,prefix,sha)=>prefix+"[commit "+sha.slice(0,7)+"](https://github.com/openclaw/openclaw/commit/"+sha+")").replace(/(^|[\\s>])https:\\/\\/github\\.com\\/openclaw\\/openclaw\\/blob\\/([0-9a-f]{7,40})\\/([^\\s)]+)/gi,(_,prefix,sha,path)=>{const cleanPath=trimTrailingPunctuation(path);const suffix=path.slice(cleanPath.length);const label=decodeURIComponent(cleanPath).replace(/#L(\\d+)(?:-L(\\d+))?$/,(_line,from,to)=>to?":L"+from+"-L"+to:":L"+from);return prefix+"["+label+"](https://github.com/openclaw/openclaw/blob/"+sha+"/"+cleanPath+")"+suffix})} @@ -94,7 +99,8 @@ function addChatThinking(){const log=document.querySelector("[data-chat-log]");i function setChatClearVisible(visible){for(const selector of ["[data-chat-clear]","[data-chat-copy]"]){const btn=document.querySelector(selector);if(!btn)continue;if(visible)btn.removeAttribute("hidden");else btn.setAttribute("hidden","")}} function clearChat(){const log=document.querySelector("[data-chat-log]");if(!log)return;log.innerHTML=chatEmptyHtml;log.scrollTop=0;setChatClearVisible(false);document.querySelector("[data-chat-input]")?.focus()} function isAuthFetchError(err){const msg=String(err?.message||err||"").toLowerCase();return msg==="auth_required"||msg.includes("load failed")||msg.includes("failed to fetch")||msg.includes("networkerror")} -function chatSignInUrl(){const url=new URL("https://hub.openclaw.ai/docs/auth");url.searchParams.set("return_to",location.href);return url.href} +const pendingMoltyQuestionKey="openclaw-docs-pending-molty-question"; +function chatSignInUrl(){const url=new URL("https://hub.openclaw.ai/docs/auth");const back=new URL(location.href);if(localStorage.getItem(pendingMoltyQuestionKey))back.searchParams.set("molty_resume","1");url.searchParams.set("return_to",back.href);return url.href} function initChat(){ const chat=document.querySelector("[data-docs-chat]"); const auth=document.querySelector("[data-chat-auth]"); @@ -120,6 +126,9 @@ let resetChatTimer=0;const resetChatLauncherPosition=()=>{chatPanelRight=chatBas const chatText=()=>[...document.querySelectorAll(".docs-chat-message")].filter(item=>!item.classList.contains("thinking")).map(item=>(item.classList.contains("user")?"You: ":"OpenClaw: ")+item.innerText.trim()).filter(Boolean).join("\\n\\n"); const chatErrorMessage=async res=>{const fallback="Docs agent returned "+res.status;try{const data=await res.clone().json();return typeof data?.error==="string"&&data.error.trim()?data.error.trim():fallback}catch{return fallback}}; const sendChatMessage=async(message,{echoUser=true}={})=>{const api=window.OPENCLAW_DOCS_CHAT_API;if(!api||!message)return;if(!await ensureAuth())return;lastMessage=message;setRetryEnabled();if(echoUser)addChatMessage("user",message);setChatClearVisible(true);const reply=addChatThinking();if(submit)submit.disabled=true;if(retry)retry.disabled=true;try{const res=await fetch(api,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",redirect:"manual",body:JSON.stringify({message,retrieval:"auto",confidenceThreshold:.3})});if(res.type==="opaqueredirect"||res.redirected||res.status===0||res.status===401||res.status===403)throw new Error("AUTH_REQUIRED");if(!res.ok)throw new Error(await chatErrorMessage(res));if(!res.body)throw new Error("Docs agent did not stream a response");const reader=res.body.getReader();const decoder=new TextDecoder();let raw="";while(true){const {done,value}=await reader.read();if(done)break;raw+=decoder.decode(value,{stream:true});if(reply&&raw.trim()){if(reply.classList.contains("thinking"))reply.classList.remove("thinking");reply.innerHTML=renderChatText(raw);reply.parentElement.scrollTop=reply.parentElement.scrollHeight}}if(!raw&&reply){reply.classList.remove("thinking");reply.innerHTML="

No response.

"}}catch(err){if(reply){const msg=isAuthFetchError(err)?"[Verify with GitHub]("+chatSignInUrl()+"), then ask again.":err?.message||"Docs agent failed.";reply.className="docs-chat-message error";reply.innerHTML=renderChatText(msg);if(isAuthFetchError(err))setAuthState("required")}}finally{if(submit)submit.disabled=authState!=="ready";setRetryEnabled();if(authState==="ready")input.focus()}}; +const askMoltyQuestion=async message=>{const question=String(message||"").trim();setOpen(true);if(!question){localStorage.removeItem(pendingMoltyQuestionKey);await ensureAuth();return}localStorage.setItem(pendingMoltyQuestionKey,question);if(!await ensureAuth())return;localStorage.removeItem(pendingMoltyQuestionKey);await sendChatMessage(question)}; +window.OPENCLAW_DOCS_ASK_MOLTY=askMoltyQuestion; +const resumeMolty=new URLSearchParams(location.search).get("molty_resume")==="1";const pendingMoltyQuestion=localStorage.getItem(pendingMoltyQuestionKey);if(resumeMolty&&pendingMoltyQuestion){const clean=new URL(location.href);clean.searchParams.delete("molty_resume");history.replaceState(history.state,"",clean.href);setTimeout(()=>askMoltyQuestion(pendingMoltyQuestion),0)} setAuthState("unknown"); document.addEventListener("click",e=>{if(e.target.closest("[data-chat-maximize]")){if(!chat.classList.contains("open"))setOpen(true);setExpanded(!chat.classList.contains("expanded"));return}if(e.target.closest("[data-chat-toggle]")){setOpen(!chat.classList.contains("open"));return}if(e.target.closest("[data-chat-minimize]")){setOpen(false);return}if(e.target.closest("[data-chat-clear]")){clearChat();lastMessage="";setRetryEnabled();return}if(e.target.closest("[data-chat-copy]")){copyText(chatText(),copy);return}if(e.target.closest("[data-chat-retry]")){if(lastMessage)sendChatMessage(lastMessage,{echoUser:false});return}}); document.addEventListener("keydown",e=>{if(e.key==="Escape"&&chat.classList.contains("open"))setOpen(false)}); @@ -134,16 +143,35 @@ initPageFeedback(); initMermaid(); scrollActiveNavLink(); initTocScrollspy(); -document.addEventListener("click",async e=>{const pageActions=e.target.closest(".page-actions");document.querySelectorAll(".page-actions-more[open]").forEach(menu=>{if(!pageActions?.contains(menu))menu.removeAttribute("open")});const toc=e.target.closest(".toc");document.querySelectorAll(".toc[open]").forEach(menu=>{if(compactTocQuery.matches&&!toc?.contains(menu))menu.open=false});if(e.target.closest(".toc a")&&compactTocQuery.matches)e.target.closest(".toc").open=false;if(handleDocsControlClick(e))return;const theme=e.target.closest("[data-theme-toggle]");if(theme){const next=root.dataset.theme==="dark"?"light":"dark";root.dataset.theme=next;localStorage.setItem("theme",next);initMermaid(true);return}const trigger=e.target.closest("[data-language-trigger]");if(trigger){e.stopPropagation();toggleLanguage();return}const picker=document.querySelector("[data-language-picker]");if(picker&&!picker.contains(e.target))closeLanguage();const navToggle=e.target.closest("[data-nav-toggle]");if(navToggle){setNavOpen(!document.body.classList.contains("nav-open"));return}if(e.target.closest("[data-nav-close]")){setNavOpen(false);return}if(document.body.classList.contains("nav-open")&&!e.target.closest(".sidebar")){setNavOpen(false);return}if(e.target.closest("[data-search-open]")){openSearch();return}if(e.target.closest("[data-search-close]")){modal?.classList.remove("open");return}const link=e.target.closest("a[href]");if(!link)return;if(link.closest("[data-language-picker]"))return;if(link.target||link.download||!isPlainLeftClick(e))return;const url=new URL(link.href,location.href);if(url.pathname===location.pathname&&url.search===location.search&&url.hash)return;if(!isDocsPage(url))return;e.preventDefault();modal?.classList.remove("open");const ok=await navigateTo(url);if(!ok)location.href=url.href}); -modal?.addEventListener("click",e=>{if(e.target===modal)modal.classList.remove("open")});addEventListener("keydown",e=>{if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()==="k"){e.preventDefault();openSearch()}if(e.key==="Escape"){modal?.classList.remove("open");document.querySelectorAll(".page-actions-more[open]").forEach(menu=>menu.removeAttribute("open"));document.querySelectorAll(".toc[open]").forEach(menu=>{if(compactTocQuery.matches)menu.open=false});closeLanguage();setNavOpen(false)}}); +document.addEventListener("click",async e=>{const pageActions=e.target.closest(".page-actions");document.querySelectorAll(".page-actions-more[open]").forEach(menu=>{if(!pageActions?.contains(menu))menu.removeAttribute("open")});const toc=e.target.closest(".toc");document.querySelectorAll(".toc[open]").forEach(menu=>{if(compactTocQuery.matches&&!toc?.contains(menu))menu.open=false});if(e.target.closest(".toc a")&&compactTocQuery.matches)e.target.closest(".toc").open=false;if(handleDocsControlClick(e))return;const theme=e.target.closest("[data-theme-toggle]");if(theme){const next=root.dataset.theme==="dark"?"light":"dark";root.dataset.theme=next;localStorage.setItem("theme",next);initMermaid(true);return}const trigger=e.target.closest("[data-language-trigger]");if(trigger){e.stopPropagation();toggleLanguage();return}const picker=document.querySelector("[data-language-picker]");if(picker&&!picker.contains(e.target))closeLanguage();const navToggle=e.target.closest("[data-nav-toggle]");if(navToggle){setNavOpen(!document.body.classList.contains("nav-open"));return}if(e.target.closest("[data-nav-close]")){setNavOpen(false);return}if(document.body.classList.contains("nav-open")&&!e.target.closest(".sidebar")){setNavOpen(false);return}if(e.target.closest("[data-search-open]")){openSearch();return}if(e.target.closest("[data-search-clear]")){clearSearch();input?.focus();return}const link=e.target.closest("a[href]");if(!link)return;if(link.closest("[data-language-picker]"))return;if(link.target||link.download||!isPlainLeftClick(e))return;const url=new URL(link.href,location.href);if(url.pathname===location.pathname&&url.search===location.search&&url.hash)return;if(!isDocsPage(url))return;e.preventDefault();closeSearch();const ok=await navigateTo(url);if(!ok)location.href=url.href}); +modal?.addEventListener("click",e=>{if(e.target===modal)closeSearch()});function isEditableTarget(target){return target instanceof Element&&!!target.closest("input,textarea,select,[contenteditable]")}function isSearchShortcutEvent(e){return (e.metaKey||e.ctrlKey)&&!e.altKey&&!e.shiftKey&&(e.code==="KeyK"||String(e.key).toLowerCase()==="k")}function searchFocusable(){return [...modal?.querySelectorAll("a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\\\"-1\\\"])")||[]].filter(el=>!el.hidden&&el.getAttribute("aria-hidden")!=="true"&&el.offsetParent!==null)}function trapSearchFocus(e){if(e.key!=="Tab"||!modal?.classList.contains("open"))return false;const items=searchFocusable();if(!items.length){e.preventDefault();input?.focus();return true}const first=items[0];const last=items[items.length-1];if(!modal.contains(document.activeElement)){e.preventDefault();first.focus();return true}if(e.shiftKey&&document.activeElement===first){e.preventDefault();last.focus();return true}if(!e.shiftKey&&document.activeElement===last){e.preventDefault();first.focus();return true}return false}addEventListener("keydown",e=>{if(trapSearchFocus(e))return;if(isSearchShortcutEvent(e)){if(!isEditableTarget(e.target)){e.preventDefault();e.stopPropagation();openSearch()}return}if(e.key==="Escape"){closeSearch();document.querySelectorAll(".page-actions-more[open]").forEach(menu=>menu.removeAttribute("open"));document.querySelectorAll(".toc[open]").forEach(menu=>{if(compactTocQuery.matches)menu.open=false});closeLanguage();setNavOpen(false)}},{capture:true}); addEventListener("popstate",()=>navigateTo(new URL(location.href),true)); document.addEventListener("scroll",e=>{if(e.target?.classList?.contains("sidebar"))updateSidebarFade()},{capture:true,passive:true}); let tocScrollRaf=0;function scheduleTocDisclosure(){if(tocScrollRaf)return;tocScrollRaf=requestAnimationFrame(()=>{tocScrollRaf=0;syncTocDisclosure()})}addEventListener("scroll",scheduleTocDisclosure,{passive:true});addEventListener("scrollend",scheduleTocDisclosure,{passive:true}); let tabResizeRaf=0;addEventListener("resize",()=>{syncStickyHeaderOffset();syncTocDisclosure();cancelAnimationFrame(tabResizeRaf);tabResizeRaf=requestAnimationFrame(()=>{placeTabUnderline(false);updateSidebarFade()})}); if(document.fonts?.ready)document.fonts.ready.then(()=>placeTabUnderline(false)); requestAnimationFrame(()=>placeTabUnderline(false)); -let seq=0;let searchTimer=0;const searchAliases={install:"getting started onboarding setup curl node",setup:"install onboarding getting started",telegram:"channels telegram groups tdlib pairing",slack:"channels slack app bot socket mode",gateway:"gateway auth heartbeat remote health restart",plugin:"plugins capabilities tools skills",plugins:"plugins capabilities tools skills",config:"configuration json5 env defaults",model:"models providers openai anthropic google"};function expandSearchQuery(q){const extra=q.toLowerCase().split(/\\s+/).flatMap(word=>searchAliases[word]?[searchAliases[word]]:[]);return [q,...extra].join(" ").trim()}async function runSearch(q,id){if(!results)return;if(!results.innerHTML.trim())results.innerHTML='

Searching...

';results.classList.add("is-loading");const pf=await (pagefindReady ||= import(withBase("/pagefind/pagefind.js")).then(m=>m.init?.().then?.(()=>m)??m));if(id!==seq)return;const search=await pf.search(q);const items=await Promise.all(search.results.slice(0,12).map(r=>r.data()));if(id!==seq)return;results.classList.remove("is-loading");results.innerHTML=items.length?items.map(item=>''+item.meta.title+'

'+item.excerpt+'

').join(""):'

No results. Try install, telegram, gateway, or plugins.

'} -input?.addEventListener("input",e=>{const q=e.target.value.trim();const id=++seq;clearTimeout(searchTimer);results?.classList.remove("is-loading");if(!q){if(results)results.innerHTML="";return}searchTimer=setTimeout(()=>runSearch(expandSearchQuery(q),id),140)}); -document.addEventListener("click",e=>{const suggestion=e.target.closest("[data-search-suggestion]");if(!suggestion||!input)return;input.value=suggestion.dataset.searchSuggestion||"";input.dispatchEvent(new Event("input",{bubbles:true}));input.focus()}); +let seq=0;let searchTimer=0;const searchCommandIcon='';const searchEnterIcon='';const searchEmptyIcon='';const searchAliases={install:"getting started onboarding setup curl node",setup:"install onboarding getting started",telegram:"channels telegram groups tdlib pairing",slack:"channels slack app bot socket mode",gateway:"gateway auth heartbeat remote health restart",doctor:"gateway health heartbeat restart diagnostics",plugin:"plugins capabilities tools skills",plugins:"plugins capabilities tools skills",config:"configuration json5 env defaults",model:"models providers openai anthropic google"};function expandSearchQuery(q){const extra=q.toLowerCase().split(/\\s+/).flatMap(word=>searchAliases[word]?[searchAliases[word]]:[]);return [q,...extra].join(" ").trim()} +function searchQuery(){return input?.value.trim()||""} +function escapeSearchHtml(value){const div=document.createElement("div");div.textContent=String(value||"");return div.innerHTML} +function setSearchChrome(q){modal?.classList.toggle("has-query",!!q);if(moltySearchPrefix)moltySearchPrefix.textContent=q?"Ask Molty about":"Ask Molty";if(moltySearchTerm){moltySearchTerm.textContent=q;moltySearchTerm.hidden=!q}} +function setSearchLoading(loading){modal?.classList.toggle("is-searching",loading);results?.classList.toggle("is-loading",loading)} +function searchLoadingHtml(){return '
Searching...
'}function showSearchLoading(){if(results&&!results.querySelector(".search-loading"))results.innerHTML=searchLoadingHtml()} +function searchInitialHtml(){return '
'+searchEmptyIcon+'Search the docs

Search setup, commands, integrations, and config docs.

'} +function searchUnavailableHtml(){return '
'+searchEmptyIcon+'Search index unavailable.

Build the preview search index to enable results.

'} +function canAskMoltyFromSearch(){return Boolean(moltySearch&&window.OPENCLAW_DOCS_ASK_MOLTY)} +function setActiveSearchResult(index){if(!searchItems.length){searchActiveIndex=-1;return}searchActiveIndex=(index+searchItems.length)%searchItems.length;for(const node of results?.querySelectorAll("[data-search-result-index]")||[]){const active=Number(node.dataset.searchResultIndex)===searchActiveIndex;node.classList.toggle("active",active);node.setAttribute("aria-selected",String(active));if(active)node.scrollIntoView({block:"nearest"})}} +function searchResultHtml(item,index){const meta=item.meta||{};const metaParts=[meta.category,meta.section].filter(Boolean).map(part=>''+escapeSearchHtml(part)+'').join("");return ''+(metaParts?'
'+metaParts+'
':"")+''+escapeSearchHtml(meta.title||item.url)+'

'+(item.excerpt||"")+"

"} +function searchEmptyHtml(q){const fallback=canAskMoltyFromSearch()?'

Try another search, or '+searchCommandIcon+searchEnterIcon+' to ask Molty directly.

':'

Try another search or use the docs navigation.

';return '
'+searchEmptyIcon+'No matches for β€œ'+escapeSearchHtml(q)+'”.'+fallback+'
'} +function renderSearchResults(items,q){searchItems=items;searchActiveIndex=-1;if(!results)return;results.innerHTML=items.length?items.map(searchResultHtml).join(""):searchEmptyHtml(q);if(items.length)setActiveSearchResult(0)} +async function runSearch(q,id){if(!results)return;setSearchChrome(q);setSearchLoading(true);showSearchLoading();const pf=await loadPagefind();if(id!==seq)return;if(pf?.unavailable){setSearchLoading(false);searchItems=[];searchActiveIndex=-1;results.innerHTML=searchUnavailableHtml();return}try{let search=await pf.search(q);const expanded=expandSearchQuery(q);if(!search.results.length&&expanded!==q)search=await pf.search(expanded);const items=await Promise.all(search.results.slice(0,12).map(r=>r.data()));if(id!==seq)return;setSearchLoading(false);renderSearchResults(items,q)}catch{if(id!==seq)return;setSearchLoading(false);searchItems=[];searchActiveIndex=-1;results.innerHTML=searchUnavailableHtml()}} +function scheduleSearch(immediate=false){const q=searchQuery();const id=++seq;clearTimeout(searchTimer);setSearchChrome(q);searchItems=[];searchActiveIndex=-1;if(!q){setSearchLoading(false);if(results)results.innerHTML=searchInitialHtml();return}setSearchLoading(true);showSearchLoading();const run=()=>runSearch(q,id);if(immediate)run();else searchTimer=setTimeout(run,240)} +async function askMoltyFromSearch(){if(!canAskMoltyFromSearch())return;const q=searchQuery();closeSearch();await window.OPENCLAW_DOCS_ASK_MOLTY(q)} +input?.addEventListener("input",()=>scheduleSearch(false)); +input?.addEventListener("keydown",e=>{if(e.key==="Enter"&&(e.metaKey||e.ctrlKey)){e.preventDefault();askMoltyFromSearch();return}if(e.key==="ArrowDown"){if(searchItems.length){e.preventDefault();setActiveSearchResult(searchActiveIndex+1)}return}if(e.key==="ArrowUp"){if(searchItems.length){e.preventDefault();setActiveSearchResult(searchActiveIndex-1)}return}if(e.key==="Enter"&&!e.shiftKey){const active=results?.querySelector(".search-result.active");if(active){e.preventDefault();active.click()}}}); +results?.addEventListener("pointermove",e=>{const result=e.target.closest?.("[data-search-result-index]");if(result)setActiveSearchResult(Number(result.dataset.searchResultIndex))}); +results?.addEventListener("focusin",e=>{const result=e.target.closest?.("[data-search-result-index]");if(result)setActiveSearchResult(Number(result.dataset.searchResultIndex))}); +moltySearch?.addEventListener("click",()=>askMoltyFromSearch()); +document.addEventListener("click",e=>{const suggestion=e.target.closest("[data-search-suggestion]");if(!suggestion||!input)return;input.value=suggestion.dataset.searchSuggestion||"";input.focus();scheduleSearch(true)}); `; } diff --git a/scripts/docs-site/assets/molty-avatar-hover.gif b/scripts/docs-site/assets/molty-avatar-hover.gif new file mode 100644 index 000000000..53ac22b24 Binary files /dev/null and b/scripts/docs-site/assets/molty-avatar-hover.gif differ diff --git a/scripts/docs-site/assets/molty-avatar.png b/scripts/docs-site/assets/molty-avatar.png new file mode 100644 index 000000000..969f50e40 Binary files /dev/null and b/scripts/docs-site/assets/molty-avatar.png differ diff --git a/scripts/docs-site/build.mjs b/scripts/docs-site/build.mjs index 6cc3c3c7b..4da0e61a7 100644 --- a/scripts/docs-site/build.mjs +++ b/scripts/docs-site/build.mjs @@ -15,6 +15,7 @@ import { renderPageOgSvg } from "./og-card-template.mjs"; const root = process.cwd(); const docsDir = path.join(root, "docs"); const siteAssetsDir = path.join(root, "scripts", "docs-site"); +const shellPublicAssetsDir = path.join(siteAssetsDir, "assets"); const outDir = path.join(root, "dist", "docs-site"); const config = JSON.parse(fs.readFileSync(path.join(docsDir, "docs.json"), "utf8")); const sourceMetadata = readSourceMetadata(root); @@ -325,6 +326,7 @@ ${page.hidden ? "" : pageMarkdownScript(page)}

${escapeHtml(page.title)}

${pageStatus(page)} +${pageSearchMetadata(page, nav)}
${html}
${page.hidden ? "" : pageFeedback(page)} ${pager(prev, next)} @@ -352,7 +354,7 @@ function siteHeader(page, nav, activeTab) { return `