@jungherz-de/notionkit-elements 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"notionkit-elements.esm.min.js","sources":["../node_modules/@jungherz-de/notionkit/notionkit-styles.js","../src/util/strings.js","../src/base.js","../src/components/forms/nk-btn.js","../src/components/forms/nk-input.js","../src/components/forms/nk-textarea.js","../src/components/forms/nk-select.js","../src/components/forms/nk-switch.js","../src/components/forms/nk-check.js","../src/components/forms/nk-radio.js","../src/components/forms/nk-slider.js","../src/components/forms/nk-field.js","../src/components/forms/nk-fields.js","../src/components/content/nk-tag.js","../src/components/content/nk-progress.js","../src/components/content/nk-callout.js","../src/components/content/nk-divider.js","../src/components/content/nk-heading.js","../src/components/content/nk-toggle.js","../src/components/content/nk-todo.js","../src/components/content/nk-kbd.js","../src/components/content/nk-code.js","../src/util/highlight.js","../src/components/content/nk-quote.js","../src/components/shell/nk-app.js","../src/util/focus.js","../src/components/shell/nk-sidebar.js","../src/components/shell/nk-workspace-switcher.js","../src/components/shell/nk-section-label.js","../src/components/shell/nk-tree.js","../src/components/shell/nk-tree-item.js","../src/components/shell/nk-topbar.js","../src/components/shell/nk-breadcrumb.js","../src/components/shell/nk-theme-toggle.js","../src/components/shell/nk-tab-bar.js","../src/components/shell/nk-tab-bar-item.js","../src/components/page/nk-page.js","../src/components/page/nk-page-cover.js","../src/components/page/nk-page-title.js","../src/components/page/nk-page-actions.js","../src/components/page/nk-block-host.js","../src/components/page/nk-banner.js","../src/components/page/nk-empty.js","../src/components/page/nk-skeleton.js","../src/components/page/nk-synced.js","../src/util/floating.js","../src/components/page/nk-tabs.js","../src/components/page/nk-tab.js","../src/components/page/nk-segmented.js","../src/components/page/nk-stats.js","../src/components/page/nk-stat.js","../src/components/page/nk-avatar-group.js","../src/util/avatar.js","../src/components/page/nk-avatar.js","../src/components/page/nk-mention.js","../src/components/page/nk-template-btn.js","../src/components/page/nk-model-card.js","../src/components/page/nk-profile-row.js","../src/components/page/nk-danger-zone.js","../src/components/page/nk-member-list.js","../src/components/page/nk-member-row.js","../src/components/page/nk-props.js","../src/components/page/nk-prop.js","../src/components/page/nk-panels.js","../src/components/page/nk-panel.js","../src/components/overlays/nk-sheet.js","../src/components/page/nk-steps.js","../src/components/content/nk-bookmark.js","../src/components/forms/nk-copy-field.js","../src/components/forms/nk-image-picker.js","../src/util/dates.js","../src/components/forms/nk-calendar.js","../src/components/overlays/nk-peek.js","../src/components/overlays/nk-dialog.js","../src/components/overlays/nk-tooltip.js","../src/components/overlays/nk-modal.js","../src/components/overlays/nk-settings-pane.js","../src/components/overlays/nk-settings-user.js","../src/util/fuzzy.js","../src/components/overlays/nk-cmdk.js","../src/components/overlays/nk-menu.js","../src/components/overlays/nk-menu-item.js","../src/components/overlays/nk-pop.js","../src/util/emoji.js","../src/components/overlays/nk-emoji-picker.js","../src/components/overlays/nk-toast.js","../src/components/data/nk-database.js","../src/util/property-cell.js","../src/components/data/nk-table-view.js","../src/components/data/nk-board-view.js","../src/components/data/nk-list-view.js","../src/components/data/nk-calendar-view.js","../src/components/data/nk-gallery-view.js","../src/components/data/nk-filter-bar.js","../src/components/data/nk-comments.js","../src/components/data/nk-comment.js","../src/components/data/nk-ai-thread.js","../src/components/data/nk-ai-msg.js","../src/components/data/nk-ai-input-row.js"],"sourcesContent":["// NotionKit v1.17.0 – Constructable Stylesheet\n// Auto-generated by build-styles-js.mjs – do not edit manually.\n\n// The :root and [data-theme=\"dark\"] blocks that declare --nk-* …\nconst tokensCss = \":root{color-scheme:light;--nk-bg: #ffffff;--nk-bg-sidebar: #f9f8f7;--nk-bg-hover: rgba(55,53,47,.06);--nk-bg-active: rgba(55,53,47,.08);--nk-bg-callout: #f0efed;--nk-bg-code: #f7f6f3;--nk-bg-card: #ffffff;--nk-bg-input: rgba(242,241,238,.6);--nk-text: #2c2c2b;--nk-text-secondary: #7d7a75;--nk-text-tertiary: #91918e;--nk-text-sidebar: #5f5e5b;--nk-border: rgba(28,19,1,.11);--nk-border-strong: rgba(27,21,0,.19);--nk-accent: #2383e2;--nk-on-accent: #ffffff;--nk-danger: #cd3c3a;--nk-tag-gray-bg: #e3e2e0;--nk-tag-gray-text: #32302c;--nk-tag-brown-bg: #eee0da;--nk-tag-brown-text: #442a1e;--nk-tag-orange-bg: #fadec9;--nk-tag-orange-text: #49290e;--nk-tag-yellow-bg: #fdecc8;--nk-tag-yellow-text: #402c1b;--nk-tag-green-bg: #dbeddb;--nk-tag-green-text: #1c3829;--nk-tag-blue-bg: #d3e5ef;--nk-tag-blue-text: #183347;--nk-tag-purple-bg: #e8deee;--nk-tag-purple-text: #412454;--nk-tag-pink-bg: #f5e0e9;--nk-tag-pink-text: #4c2337;--nk-tag-red-bg: #ffe2dd;--nk-tag-red-text: #5d1715;--nk-tint-gray: #f1f1ef;--nk-color-gray: #787774;--nk-tint-brown: #f4eeee;--nk-color-brown: #9f6b53;--nk-tint-orange: #fbecdd;--nk-color-orange: #d9730d;--nk-tint-yellow: #fbf3db;--nk-color-yellow: #cb912f;--nk-tint-green: #edf3ec;--nk-color-green: #448361;--nk-tint-blue: #e7f3f8;--nk-color-blue: #337ea9;--nk-tint-purple: #f8f3fc;--nk-color-purple: #9065b0;--nk-tint-pink: #fcf1f6;--nk-color-pink: #c14c8a;--nk-tint-red: #fdebec;--nk-color-red: #cd3c3a;--nk-decor-purple: #9065b0;--nk-decor-blue: #529cca;--nk-decor-orange: #d9730d;--nk-scrim: rgba(15,15,15,.6);--nk-scrim-soft: rgba(15,15,15,.5);--nk-sidebar-width: 260px;--nk-peek-width: 560px;--nk-page-full-max: none;--nk-cover-height: 200px;--nk-panel-cover-height: 64px;--nk-tab-bar-height: 58px;--nk-radius: 6px;--nk-font: ui-sans-serif, -apple-system, \\\"Segoe UI\\\", Inter, Helvetica, Arial, sans-serif;--nk-font-mono: ui-monospace, \\\"SF Mono\\\", Menlo, Consolas, monospace;--nk-shadow-menu: rgba(15,15,15,.05) 0px 0px 0px 1px, rgba(15,15,15,.1) 0px 3px 6px, rgba(15,15,15,.2) 0px 9px 24px;--nk-shadow-card: 0 1px 2px rgba(0,0,0,.04);--nk-shadow-btn: inset 0 0 0 1px rgba(15,15,15,.1), 0 1px 2px rgba(15,15,15,.1);--nk-shadow-knob: 0 1px 2px rgba(0,0,0,.2);--nk-shadow-segment: 0 1px 2px rgba(0,0,0,.08)}[data-theme=dark]{color-scheme:dark;--nk-bg: #191919;--nk-bg-sidebar: #202020;--nk-bg-hover: rgba(255,255,255,.055);--nk-bg-active: rgba(255,255,255,.08);--nk-bg-callout: #252525;--nk-bg-code: #202020;--nk-bg-card: #202020;--nk-bg-input: rgba(255,255,255,.055);--nk-text: rgba(255,255,255,.81);--nk-text-secondary: rgba(255,255,255,.46);--nk-text-tertiary: rgba(255,255,255,.32);--nk-text-sidebar: rgba(255,255,255,.62);--nk-border: rgba(255,255,255,.094);--nk-border-strong: rgba(255,255,255,.16);--nk-accent: #529CCA;--nk-danger: #df5452;--nk-tag-gray-bg: #373737;--nk-tag-gray-text: rgba(255,255,255,.85);--nk-tag-brown-bg: #603b2c;--nk-tag-brown-text: rgba(255,255,255,.85);--nk-tag-orange-bg: #854c1d;--nk-tag-orange-text: rgba(255,255,255,.85);--nk-tag-yellow-bg: #89632a;--nk-tag-yellow-text: rgba(255,255,255,.85);--nk-tag-green-bg: #2b593f;--nk-tag-green-text: rgba(255,255,255,.85);--nk-tag-blue-bg: #28456c;--nk-tag-blue-text: rgba(255,255,255,.85);--nk-tag-purple-bg: #492f64;--nk-tag-purple-text: rgba(255,255,255,.85);--nk-tag-pink-bg: #69314c;--nk-tag-pink-text: rgba(255,255,255,.85);--nk-tag-red-bg: #6e3630;--nk-tag-red-text: rgba(255,255,255,.85);--nk-tint-gray: #252525;--nk-color-gray: #9b9b9b;--nk-tint-brown: #2e2724;--nk-color-brown: #ba856f;--nk-tint-orange: #36291f;--nk-color-orange: #c77d48;--nk-tint-yellow: #372e20;--nk-color-yellow: #ca8f3d;--nk-tint-green: #242b26;--nk-color-green: #529e72;--nk-tint-blue: #1f282d;--nk-color-blue: #5e87c9;--nk-tint-purple: #2a2430;--nk-color-purple: #9d68d3;--nk-tint-pink: #2e2328;--nk-color-pink: #d15796;--nk-tint-red: #332523;--nk-color-red: #df5452;--nk-shadow-menu: rgba(15,15,15,.2) 0px 0px 0px 1px, rgba(15,15,15,.4) 0px 3px 6px, rgba(15,15,15,.6) 0px 9px 24px;--nk-shadow-card: none;--nk-shadow-btn: inset 0 0 0 1px rgba(255,255,255,.1), 0 1px 2px rgba(0,0,0,.3)}\";\n\n// … and everything else, in two pieces around where they were.\nconst componentsHead = \"[class*=nk-],[class*=nk-] *,[class*=nk-]:before,[class*=nk-]:after,[class*=nk-] *:before,[class*=nk-] *:after{box-sizing:border-box}[class*=nk-] :where(h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd,pre,ul,ol,li){margin:0;padding:0}[class*=nk-] :where(ul,ol){list-style:none}[class*=nk-] :where(button,input,select,textarea,option,optgroup,fieldset,legend),:where(button,input,select,textarea)[class*=nk-]{margin:0;padding:0}[class*=nk-][hidden]:not([hidden=until-found i]){display:none!important}::slotted([hidden]:not([hidden=\\\"until-found\\\" i])){display:none!important}\";\nconst componentsTail = \".nk-body{margin:0;min-height:100vh;min-height:100dvh;font-family:var(--nk-font);font-size:14px;background:var(--nk-bg);color:var(--nk-text);-webkit-font-smoothing:auto;transition:background .25s ease,color .25s ease}.nk-app{display:flex;height:100vh;height:100dvh;overflow:hidden}.nk-sidebar{width:calc(var(--nk-sidebar-width) + env(safe-area-inset-left,0px));min-width:calc(var(--nk-sidebar-width) + env(safe-area-inset-left,0px));padding-left:env(safe-area-inset-left,0px);background:var(--nk-bg-sidebar);display:flex;flex-direction:column;border-right:1px solid var(--nk-border);transition:background .25s ease,margin-left .24s cubic-bezier(.2,.8,.25,1)}.nk-workspace{display:flex;align-items:center;gap:8px;padding:10px 12px;margin:6px 8px 2px;border-radius:var(--nk-radius);cursor:pointer;font-weight:500;user-select:none}.nk-workspace:hover{background:var(--nk-bg-hover)}.nk-workspace .avatar,.nk-workspace ::slotted(.avatar),.nk-workspace ::slotted([slot=\\\"avatar\\\"]){width:22px;height:22px;border-radius:4px;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-size:11px;font-weight:600;display:flex;align-items:center;justify-content:center}.nk-workspace .chev{margin-left:auto;color:var(--nk-text-tertiary);font-size:11px}.nk-sidebar-scroll{flex:1;overflow-y:auto;padding:4px 8px 16px}.nk-sidebar-scroll::-webkit-scrollbar{width:8px}.nk-sidebar-scroll::-webkit-scrollbar-thumb{background:var(--nk-border-strong);border-radius:4px}.nk-section-label{font-size:12px;font-weight:500;letter-spacing:.01em;color:var(--nk-text-tertiary);padding:14px 10px 4px;display:flex;justify-content:space-between;align-items:center}.nk-section-label .plus{cursor:pointer;border-radius:4px;padding:0 4px;font-size:13px;opacity:0;transition:opacity .15s}.nk-section-label:hover .plus{opacity:1}.nk-section-label .plus:hover{background:var(--nk-bg-hover)}.nk-sidebar-footer{padding:8px;border-top:1px solid var(--nk-border);color:var(--nk-text-sidebar);font-size:14px}.nk-sidebar-footer .nk-tree-item{min-height:26px}.nk-sidebar-backdrop{display:none;position:fixed;inset:0;z-index:59;background:var(--nk-scrim-soft)}.nk-sidebar-toggle{display:none}.nk-sidebar.collapsed{margin-left:calc(0px - var(--nk-sidebar-width) - env(safe-area-inset-left,0px));visibility:hidden;transition:background .25s ease,margin-left .24s cubic-bezier(.2,.8,.25,1),visibility 0s linear .24s}.nk-sidebar-toggle.collapsed{display:inline-flex}.nk-sidebar-head{display:flex;align-items:center}.nk-sidebar-head>.nk-workspace,.nk-sidebar-head ::slotted(.nk-workspace){flex:1;min-width:0}.nk-sidebar-collapse{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;margin:4px 12px 0 -4px;padding:0;border:none;border-radius:var(--nk-radius);background:transparent;color:var(--nk-text-tertiary);cursor:pointer;opacity:0;transition:opacity .15s}.nk-sidebar:hover .nk-sidebar-collapse,.nk-sidebar-collapse:focus-visible{opacity:1}.nk-sidebar-collapse:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-sidebar-collapse svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-main{flex:1;display:flex;flex-direction:column;min-width:0}.nk-topbar{height:44px;display:flex;align-items:center;padding:0 max(12px,env(safe-area-inset-right,0px)) 0 max(12px,env(safe-area-inset-left,0px));gap:8px;flex-shrink:0}.nk-breadcrumb{display:flex;align-items:center;gap:4px;font-size:14px}.nk-breadcrumb .crumb,.nk-breadcrumb ::slotted(.crumb){padding:2px 6px;border-radius:4px;cursor:pointer;color:var(--nk-text-sidebar);display:flex;align-items:center;gap:5px}.nk-breadcrumb .crumb:hover{background:var(--nk-bg-hover)}a.crumb{text-decoration:none}.nk-breadcrumb .crumb.current,.nk-breadcrumb ::slotted(.crumb.current){color:var(--nk-text)}.nk-breadcrumb .sep{color:var(--nk-text-tertiary);font-size:12px}.nk-topbar-actions{margin-left:auto;display:flex;align-items:center;gap:4px}.nk-topbar-btn{padding:4px 8px;border-radius:var(--nk-radius);cursor:pointer;color:var(--nk-text-sidebar);font-size:14px;user-select:none;border:none;background:transparent;font-family:inherit}.nk-topbar-btn:hover{background:var(--nk-bg-hover)}.nk-topbar-btn svg,.nk-topbar-btn ::slotted(svg){width:16px;height:16px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-share-btn{font-size:14px;padding:4px 8px}.nk-topbar-meta,.nk-topbar-actions ::slotted(.nk-topbar-meta){padding:4px 8px;font-size:12px;color:var(--nk-text-tertiary);white-space:nowrap}.nk-theme-toggle{font-size:15px;width:30px;height:28px;padding:0}.nk-tab-bar{display:none;flex:none;align-items:stretch;gap:2px;position:sticky;bottom:0;z-index:30;box-sizing:border-box;height:calc(var(--nk-tab-bar-height) - 6px + max(6px,env(safe-area-inset-bottom,0px)));padding:6px max(4px,env(safe-area-inset-right,0px)) max(6px,env(safe-area-inset-bottom,0px)) max(4px,env(safe-area-inset-left,0px));background:var(--nk-bg-sidebar);border-top:1px solid var(--nk-border)}.nk-tab-bar.always{display:flex}.nk-tab-bar.fixed{position:fixed;left:0;right:0;bottom:0}.nk-tab-bar-spacer{display:none;flex:none;height:calc(var(--nk-tab-bar-height) - 6px + max(6px,env(safe-area-inset-bottom,0px)))}.nk-tab-bar.always.fixed+.nk-tab-bar-spacer{display:block}.nk-tab-bar.floating{position:fixed;left:max(12px,env(safe-area-inset-left,0px));right:max(12px,env(safe-area-inset-right,0px));bottom:calc(12px + env(safe-area-inset-bottom,0px));height:var(--nk-tab-bar-height);padding:6px;border:1px solid var(--nk-border);border-radius:16px;box-shadow:var(--nk-shadow-menu)}.nk-tab-bar-item{flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:4px 2px;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:10.5px;line-height:1.2;color:var(--nk-text-secondary);text-decoration:none;cursor:pointer;user-select:none;-webkit-tap-highlight-color:transparent}.nk-tab-bar-item:hover{color:var(--nk-text);background:var(--nk-bg-hover)}.nk-tab-bar-item.active{color:var(--nk-accent)}.nk-tab-bar-item:disabled{opacity:.5;cursor:not-allowed}.nk-tab-bar-item .icon,.nk-tab-bar-item ::slotted([slot=\\\"icon\\\"]){font-size:20px;line-height:1}.nk-tab-bar-item .label,.nk-tab-bar-item ::slotted(.label){max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nk-tree-item{display:flex;align-items:center;gap:6px;padding:3px 8px 3px 10px;border-radius:var(--nk-radius);cursor:pointer;user-select:none;color:var(--nk-text-sidebar);position:relative;min-height:var(--_nk-row, 28px)}.nk-tree-item:hover{background:var(--nk-bg-hover)}.nk-tree-item.active{background:var(--nk-bg-active);color:var(--nk-text);font-weight:500}.nk-tree-item.compact{min-height:26px}.nk-tree-item .icon,.nk-tree-item ::slotted(.icon),.nk-tree-item ::slotted([slot=\\\"icon\\\"]){font-size:15px;width:20px;text-align:center;flex-shrink:0}.nk-tree-item .label,.nk-tree-item ::slotted(.label){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-tree-item .actions{margin-left:auto;display:none;gap:2px;color:var(--nk-text-tertiary)}.nk-tree-item:hover .actions{display:flex}.nk-tree-item .actions span{padding:0 3px;border-radius:3px;font-size:12px}.nk-tree-item .actions span:hover{background:var(--nk-bg-active)}.nk-tree-children{margin-left:14px;border-left:1px solid var(--nk-border);padding-left:4px;overflow:hidden}.nk-tree-children.collapsed{display:none}.nk-toggle-arrow{width:16px;height:16px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;font-size:9px;color:var(--nk-text-tertiary);border-radius:3px;transition:transform .15s}.nk-toggle-arrow.open{transform:rotate(90deg)}.nk-kbd-hint{margin-left:auto;display:flex;gap:3px;align-items:center}.nk-kbd{font-family:inherit;font-size:10.5px;background:var(--nk-bg-callout);border:1px solid var(--nk-border-strong);border-bottom-width:2px;border-radius:4px;padding:0 4px}.nk-page-scroll{flex:1;overflow-y:auto}.nk-page-scroll::-webkit-scrollbar{width:10px}.nk-page-scroll::-webkit-scrollbar-thumb{background:var(--nk-border-strong);border-radius:5px;border:2px solid var(--nk-bg)}.nk-cover{height:var(--nk-cover-height);background:radial-gradient(ellipse at 20% 40%,color-mix(in srgb,var(--nk-decor-purple) 35%,transparent),transparent 55%),radial-gradient(ellipse at 80% 20%,color-mix(in srgb,var(--nk-decor-blue) 35%,transparent),transparent 55%),radial-gradient(ellipse at 60% 90%,color-mix(in srgb,var(--nk-decor-orange) 25%,transparent),transparent 55%),var(--nk-bg-callout)}.nk-cover>img,.nk-cover ::slotted(img){display:block;width:100%;height:100%;object-fit:cover}.nk-page{max-width:760px;margin:0 auto;padding:24px max(64px,env(safe-area-inset-right,0px)) 120px max(64px,env(safe-area-inset-left,0px));font-size:16px;line-height:1.5}.nk-page.full{max-width:var(--nk-page-full-max)}.nk-page.small{font-size:14px}.nk-cover+.nk-page:has(>.nk-page-icon:not([hidden])),.nk-page.covered{padding-top:0}.nk-page-icon,.nk-page ::slotted(.nk-page-icon),.nk-page ::slotted([slot=\\\"icon\\\"]){font-size:64px;line-height:1;margin-top:0;cursor:pointer;user-select:none;display:inline-block}.nk-cover+.nk-page .nk-page-icon,.nk-cover+.nk-page ::slotted(.nk-page-icon),.nk-cover+.nk-page ::slotted([slot=\\\"icon\\\"]),.nk-page.covered .nk-page-icon,.nk-page.covered ::slotted(.nk-page-icon),.nk-page.covered ::slotted([slot=\\\"icon\\\"]){margin-top:-42px}.nk-page-title{font-size:var(--_nk-title, 40px);font-weight:700;line-height:1.2;margin:8px 0 4px;outline:none;letter-spacing:0}.nk-page-meta{color:var(--nk-text-tertiary);font-size:13px;margin-bottom:24px;display:flex;gap:16px}.nk-props{display:flex;flex-direction:column;margin:0 0 var(--nk-block-space, 20px);font-size:14px;line-height:1.5}.nk-props.flush{margin:0}.nk-prop{display:flex;flex-wrap:wrap;align-items:flex-start;min-width:0}.nk-prop .p-name{flex:0 0 160px;min-width:0;min-height:34px;padding:0 6px;display:flex;align-items:center;gap:6px;overflow:hidden;border-radius:var(--nk-radius);color:var(--nk-text-secondary);white-space:nowrap;user-select:none}.nk-prop .p-icon,.nk-prop ::slotted([slot=\\\"icon\\\"]){width:16px;flex-shrink:0;text-align:center;font-size:13px}.nk-prop .p-value{flex:1 1 220px;min-width:0;min-height:34px;padding:5px 8px;display:flex;align-items:center;flex-wrap:wrap;gap:4px 6px;border-radius:var(--nk-radius);overflow-wrap:anywhere}.nk-prop .p-value.text{display:block;align-content:center}.nk-prop .p-name:hover,.nk-prop .p-value:hover{background:var(--nk-bg-hover)}.nk-page p.lead{font-size:1em;line-height:1.6;color:var(--nk-text-secondary);margin-bottom:20px}.nk-page ::slotted(p.lead){font-size:1em;line-height:1.6;color:var(--nk-text-secondary);margin-bottom:20px!important}.nk-heading{font-size:1.5em;font-weight:600;line-height:1.3;margin:32px 0 10px;display:flex;align-items:center;gap:8px}:is(.nk-props,.nk-callout,.nk-bookmark,.nk-toggle,.nk-divider,.nk-quote,.nk-code,.nk-database,.nk-danger-zone,.nk-gallery-grid,.nk-template-btn,.nk-synced,.nk-banner,.nk-panels,.nk-skeleton,.nk-steps,.nk-comments,.nk-block-host,.nk-model-card,.nk-ai-input-row).flush{margin-top:0;margin-bottom:0}.nk-callout{display:flex;gap:10px;align-items:flex-start;background:var(--nk-bg-callout);border-radius:var(--nk-radius);padding:16px 16px 16px 12px;margin:var(--nk-block-space, 16px) 0;line-height:1.5}.nk-callout .c-icon,.nk-callout ::slotted(.c-icon),.nk-callout ::slotted([slot=\\\"icon\\\"]){font-size:17px}.nk-bookmark{display:flex;min-width:0;margin:var(--nk-block-space, 8px) 0;overflow:hidden;border:1px solid var(--nk-border);border-radius:var(--nk-radius);color:var(--nk-text);text-decoration:none;transition:background .12s ease}.nk-bookmark:hover{background:var(--nk-bg-hover)}.nk-bookmark .bm-text{flex:1 1 0;min-width:0;padding:12px 14px 14px;font-size:14px;line-height:20px}.nk-bookmark .bm-title{display:block;min-height:24px;margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nk-bookmark .bm-desc{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;max-height:32px;font-size:12px;line-height:16px;color:var(--nk-text-secondary)}.nk-bookmark .bm-url{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:12px;line-height:16px;white-space:nowrap}.nk-bookmark .bm-url>span{min-width:0;overflow:hidden;text-overflow:ellipsis}.nk-bookmark .bm-favicon{flex:none;width:16px;height:16px}.nk-bookmark .bm-cover{position:relative;flex:0 0 33%;max-width:240px}.nk-bookmark .bm-cover>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}.nk-todo{display:flex;align-items:flex-start;gap:8px;padding:4px 0}.nk-todo input[type=checkbox]{appearance:none;width:16px;height:16px;margin-top:3px;border:1.4px solid var(--nk-border-strong);border-radius:2px;cursor:pointer;flex-shrink:0;position:relative;background:var(--nk-bg)}.nk-todo input[type=checkbox]:checked{background:var(--nk-accent);border-color:var(--nk-accent)}.nk-todo input[type=checkbox]:checked:after{content:\\\"\\\\2713\\\";color:var(--nk-on-accent);font-size:11px;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.nk-todo input:checked+span{text-decoration:line-through;color:var(--nk-text-tertiary)}.nk-todo input:disabled{opacity:.5;cursor:not-allowed}.nk-toggle{margin:var(--nk-block-space, 6px) 0}.nk-toggle summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px;padding:4px 6px;border-radius:var(--nk-radius);font-weight:500;user-select:none}.nk-toggle summary::-webkit-details-marker{display:none}.nk-toggle summary:hover{background:var(--nk-bg-hover)}.nk-toggle summary:before{content:\\\"\\\\25b8\\\";color:var(--nk-text-tertiary);font-size:11px;transition:transform .15s;display:inline-block}.nk-toggle[open] summary:before{transform:rotate(90deg)}.nk-toggle .toggle-body,.nk-toggle ::slotted(.toggle-body){padding:4px 0 8px 26px;color:var(--nk-text-secondary);line-height:1.55}.nk-divider{border:none;border-top:1px solid var(--nk-border);margin:var(--nk-block-space, 24px) 0}.nk-quote{border-left:3px solid var(--nk-text);padding:2px 0 2px 14px;margin:var(--nk-block-space, 16px) 0;color:var(--nk-text-secondary);line-height:1.5}.nk-quote .q-cite{display:block;margin-top:6px;font-size:12.5px;color:var(--nk-text-tertiary)}.nk-mention{display:inline-flex;align-items:center;gap:4px;padding:0 4px;border-radius:4px;font-weight:500;cursor:pointer;white-space:nowrap}.nk-mention:hover{background:var(--nk-bg-hover)}.nk-mention.person{color:var(--nk-text)}.nk-mention.person .mini-avatar,.nk-mention.person .nk-avatar,.nk-mention.person ::slotted(.mini-avatar),.nk-mention.person ::slotted([slot=\\\"avatar\\\"]){width:16px;height:16px;border-radius:50%;color:var(--nk-on-accent);font-size:8.5px;font-weight:600;display:inline-flex;align-items:center;justify-content:center}.nk-mention.page{color:var(--nk-text-secondary);text-decoration:underline;text-decoration-color:var(--nk-border-strong);text-underline-offset:2px}.nk-mention.date{color:var(--nk-color-orange)}.nk-inline-code{font-family:var(--nk-font-mono);font-size:85%;color:var(--nk-danger);background:color-mix(in srgb,var(--nk-danger) 8%,transparent);border-radius:4px;padding:1px 5px}.nk-code{background:var(--nk-bg-code);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:20px 24px;font-family:var(--nk-font-mono);font-size:13px;line-height:1.6;margin:var(--nk-block-space, 14px) 0;overflow-x:auto;color:var(--nk-text-secondary);white-space:pre;position:relative}.nk-code .lang{position:absolute;top:6px;right:10px;font-size:11px;color:var(--nk-text-tertiary);font-family:var(--nk-font)}.nk-code .tag,.nk-code ::slotted(.tag){color:var(--nk-accent)}.nk-code .attr,.nk-code ::slotted(.attr){color:var(--nk-color-orange)}.nk-database{margin:var(--nk-block-space, 12px) 0 var(--nk-block-space, 8px)}.nk-db-tabs{display:flex;gap:2px;align-items:center;padding:0 0 6px;margin-bottom:0;font-size:14px}.nk-db-tab{padding:4px 8px;cursor:pointer;color:var(--nk-text-secondary);border-radius:var(--nk-radius);user-select:none;line-height:20px;display:flex;align-items:center;gap:6px;flex-shrink:0;white-space:nowrap}.nk-db-tab:hover{color:var(--nk-text);background:var(--nk-bg-hover)}.nk-db-tab.active{color:var(--nk-text);background:var(--nk-bg-active);font-weight:500}.nk-db-tab.add{color:var(--nk-text-tertiary)}.nk-db-tab .badge,.nk-db-tab ::slotted(.badge){background:var(--nk-bg-callout);border-radius:8px;font-size:11px;padding:0 6px;color:var(--nk-text-tertiary)}.nk-db-toolbar{display:flex;align-items:center;gap:8px;min-width:0;padding-bottom:6px}.nk-db-toolbar>.nk-db-tabs{flex:1 1 auto;min-width:0;padding-bottom:0;overflow-x:auto;scrollbar-width:none}.nk-db-toolbar>.nk-db-tabs::-webkit-scrollbar{display:none}.nk-db-toolbar .tools{flex:none;display:flex;align-items:center;gap:4px;margin-left:auto}.nk-db-tool{display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 8px;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:14px;color:var(--nk-text-secondary);white-space:nowrap;cursor:pointer;user-select:none}.nk-db-tool:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-db-tool.active{color:var(--nk-accent)}.nk-filter-row{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:2px 0 8px}.nk-filter-pill{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border:1px solid var(--nk-border-strong);border-radius:12px;background:transparent;font-family:inherit;font-size:13px;line-height:1;color:var(--nk-text-secondary);white-space:nowrap;cursor:pointer;user-select:none}.nk-filter-pill:hover{background:var(--nk-bg-hover)}.nk-filter-pill.active{color:var(--nk-accent);border-color:color-mix(in srgb,var(--nk-accent) 35%,transparent);background:color-mix(in srgb,var(--nk-accent) 6%,transparent)}.nk-filter-pill.add{border-color:transparent;color:var(--nk-text-tertiary)}.nk-filter-pill.add:hover{color:var(--nk-text-secondary)}.nk-filter-pill button{padding:0;border:none;background:none;font:inherit;color:inherit;cursor:pointer}.nk-filter-pill .fp-remove{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:-4px;border-radius:50%;font-size:13px}.nk-filter-pill .fp-remove:hover{background:color-mix(in srgb,currentColor 15%,transparent)}.nk-table-wrap{overflow-x:auto}.nk-table{width:100%;border-collapse:collapse;font-size:14px}.nk-table th{text-align:left;font-weight:400;color:var(--nk-text-secondary);height:36px;padding:0 8px;border-bottom:1px solid var(--nk-border);border-right:1px solid var(--nk-border);font-size:14px;white-space:nowrap;user-select:none;cursor:pointer}.nk-table th:hover{background:var(--nk-bg-hover)}.nk-table th .th-icon,.nk-table th ::slotted(.th-icon){margin-right:6px;font-size:13px;color:var(--nk-text-tertiary)}.nk-table td{height:36px;padding:6px 8px;line-height:1.5;border-bottom:1px solid var(--nk-border);border-right:1px solid var(--nk-border);white-space:nowrap;vertical-align:middle}.nk-table th:last-child,.nk-table td:last-child{border-right:none}.nk-table.wrap td,.nk-table td.wrap{white-space:normal;vertical-align:top}.nk-table tbody tr:hover{background:var(--nk-bg-hover)}.nk-table .row-title{display:flex;align-items:center;gap:7px;font-weight:500;cursor:pointer}.nk-table .row-title:hover{text-decoration:underline;text-decoration-color:var(--nk-text-tertiary)}.nk-table .date-cell{color:var(--nk-text-secondary)}.nk-table .num{text-align:right;font-variant-numeric:tabular-nums}.nk-table .row-actions{display:flex;justify-content:flex-end;gap:4px}.nk-table th.actions{cursor:default}.nk-table th.actions:hover{background:none}.nk-table .td-desc{display:block;font-size:12px;line-height:16px;color:var(--nk-text-tertiary)}.nk-table .td-text.gray{color:var(--nk-color-gray)}.nk-table .td-text.brown{color:var(--nk-color-brown)}.nk-table .td-text.orange{color:var(--nk-color-orange)}.nk-table .td-text.yellow{color:var(--nk-color-yellow)}.nk-table .td-text.green{color:var(--nk-color-green)}.nk-table .td-text.blue{color:var(--nk-color-blue)}.nk-table .td-text.purple{color:var(--nk-color-purple)}.nk-table .td-text.pink{color:var(--nk-color-pink)}.nk-table .td-text.red{color:var(--nk-color-red)}.nk-table .person-cell{display:flex;align-items:center;gap:6px;color:var(--nk-text-secondary)}.nk-table .person-cell .mini-avatar,.nk-table .person-cell ::slotted(.mini-avatar){width:20px;height:20px;border-radius:50%;font-size:10px;color:var(--nk-on-accent);display:inline-flex;align-items:center;justify-content:center;font-weight:600}.nk-new-row,.nk-table .new-row{color:var(--nk-text-tertiary);cursor:pointer;padding:8px;display:flex;align-items:center;gap:7px;font-size:14px}.nk-new-row:hover,.nk-table .new-row:hover{background:var(--nk-bg-hover)}.nk-tag{display:inline-flex;align-items:center;max-width:100%;height:20px;padding:0 6px;border-radius:3px;font-size:14px;font-weight:400;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;background:var(--nk-tag-gray-bg);color:var(--nk-tag-gray-text)}.nk-tag.gray{background:var(--nk-tag-gray-bg);color:var(--nk-tag-gray-text)}.nk-tag.brown{background:var(--nk-tag-brown-bg);color:var(--nk-tag-brown-text)}.nk-tag.orange{background:var(--nk-tag-orange-bg);color:var(--nk-tag-orange-text)}.nk-tag.yellow{background:var(--nk-tag-yellow-bg);color:var(--nk-tag-yellow-text)}.nk-tag.green{background:var(--nk-tag-green-bg);color:var(--nk-tag-green-text)}.nk-tag.blue{background:var(--nk-tag-blue-bg);color:var(--nk-tag-blue-text)}.nk-tag.purple{background:var(--nk-tag-purple-bg);color:var(--nk-tag-purple-text)}.nk-tag.pink{background:var(--nk-tag-pink-bg);color:var(--nk-tag-pink-text)}.nk-tag.red{background:var(--nk-tag-red-bg);color:var(--nk-tag-red-text)}.nk-progress{width:110px;height:6px;border-radius:3px;background:var(--nk-tint-blue);overflow:hidden;display:inline-block}.nk-progress>i{display:block;height:100%;background:var(--nk-color-blue);border-radius:3px}.nk-progress.wide{width:100%;flex:1 1 60px;max-height:6px}.nk-progress-label{font-size:12px;color:var(--nk-text-tertiary);margin-left:7px;white-space:nowrap}.nk-list{display:flex;flex-direction:column;font-size:14px}.nk-list-item{display:flex;align-items:center;gap:8px;min-width:0;overflow:hidden;min-height:36px;padding:4px 6px;border-bottom:1px solid var(--nk-border);color:inherit;text-decoration:none;cursor:pointer}.nk-list-item:hover{background:var(--nk-bg-hover)}.nk-list-item.static{cursor:default}.nk-list-item.static:hover{background:none}.nk-list>.nk-list-item:last-child,.nk-list ::slotted(.nk-list-item:last-child),.nk-list-item.last{border-bottom:none}.nk-list-item .l-icon,.nk-list-item ::slotted([slot=\\\"icon\\\"]){width:20px;flex-shrink:0;text-align:center;font-size:15px}.nk-list-item .l-title,.nk-list-item ::slotted(.l-title){flex:1 1 auto;min-width:0;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-list-item .l-meta,.nk-list-item ::slotted(.l-meta){flex:none;display:flex;align-items:center;gap:8px;margin-left:auto;font-size:12px;color:var(--nk-text-secondary);white-space:nowrap}.nk-calendar-view{font-size:14px}.nk-calendar-view .cv-head{display:flex;align-items:center;gap:4px;padding:2px 0 8px}.nk-calendar-view .cv-title{flex:1;font-weight:600;white-space:nowrap}.nk-calendar-view .cv-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));border-top:1px solid var(--nk-border);border-left:1px solid var(--nk-border)}.nk-calendar-view.weeks .cv-grid{grid-template-columns:32px repeat(7,minmax(0,1fr))}.nk-calendar-view :is(.cv-wd,.cv-week,.cv-day){min-width:0;border-right:1px solid var(--nk-border);border-bottom:1px solid var(--nk-border)}.nk-calendar-view .cv-wd{padding:4px 8px;font-size:12px;color:var(--nk-text-secondary);text-align:center}.nk-calendar-view .cv-week{padding:6px 0;font-size:11px;color:var(--nk-text-tertiary);text-align:center;font-variant-numeric:tabular-nums}.nk-calendar-view .cv-day{display:flex;flex-direction:column;gap:3px;min-height:112px;padding:4px 4px 6px}.nk-calendar-view .cv-day:is(.out,.off){background:var(--nk-bg-sidebar)}.nk-calendar-view .cv-num{align-self:flex-end;min-width:22px;height:22px;padding:0 6px;border-radius:11px;font-size:13px;line-height:22px;text-align:center;color:var(--nk-text-secondary);font-variant-numeric:tabular-nums}.nk-calendar-view .cv-day.out .cv-num{color:var(--nk-text-tertiary)}.nk-calendar-view .cv-day.today .cv-num{background:var(--nk-danger);color:var(--nk-on-accent)}.nk-calendar-view .cv-item{display:block;min-width:0;padding:3px 6px;border-radius:4px;background:var(--nk-bg-card);border:1px solid var(--nk-border);box-shadow:var(--nk-shadow-card);font-size:12.5px;line-height:18px;color:var(--nk-text);text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.nk-calendar-view .cv-item:hover{background:var(--nk-bg-hover)}.nk-board{display:none;gap:12px;padding:14px 2px;overflow-x:auto}.nk-board.active{display:flex}.nk-board-col{min-width:220px;width:220px;flex-shrink:0}.nk-board-col-header{display:flex;align-items:center;gap:7px;margin-bottom:8px;font-size:13.5px;font-weight:500}.nk-board-col-header .count{color:var(--nk-text-tertiary);font-weight:400}.nk-card{background:var(--nk-bg-card);border:1px solid var(--nk-border);border-radius:8px;padding:10px 12px;margin-bottom:8px;cursor:grab;box-shadow:var(--nk-shadow-card);transition:border-color .15s}.nk-card:hover{border-color:var(--nk-border-strong)}.nk-card .card-title,.nk-card ::slotted(.card-title){font-weight:500;margin-bottom:7px;display:flex;gap:6px;align-items:center}.nk-card .card-meta,.nk-card ::slotted(.card-meta){display:flex;gap:6px;flex-wrap:wrap;align-items:center;font-size:12px;color:var(--nk-text-secondary)}.nk-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(260px,100%),1fr));gap:16px;padding:14px 2px}.nk-gallery.small{grid-template-columns:repeat(auto-fill,minmax(min(180px,100%),1fr));gap:12px}.nk-gallery.large{grid-template-columns:repeat(auto-fill,minmax(min(340px,100%),1fr))}.nk-gallery .nk-card{display:flex;flex-direction:column;min-width:0;margin:0;color:inherit;text-decoration:none;cursor:pointer}.nk-gallery .nk-card>.nk-cover{flex:none;height:auto;aspect-ratio:2 / 1;margin:-10px -12px 10px;border-radius:7px 7px 0 0;overflow:hidden}.nk-gallery.fit .nk-card>.nk-cover:has(>img){background:var(--nk-bg-callout)}.nk-gallery.fit .nk-card>.nk-cover>img{object-fit:contain}.nk-gallery .card-title{min-width:0}.nk-gallery>.card-item{display:flex;min-width:0}.nk-gallery>.card-item>.nk-card{flex:1 1 auto}.nk-gallery>.nk-new-row{justify-content:center;min-height:64px;border:1px dashed var(--nk-border-strong);border-radius:8px}.nk-field{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:9px 0;--_nk-field-min: 210px}.nk-field .f-label,.nk-field ::slotted(.f-label),.nk-field ::slotted([slot=\\\"label\\\"]){font-size:14px}.nk-field .f-desc,.nk-field ::slotted(.f-desc),.nk-field ::slotted([slot=\\\"desc\\\"]){font-size:12px;color:var(--nk-text-secondary);margin-top:2px;line-height:1.45}.nk-field .f-control,.nk-field ::slotted(.f-control){flex-shrink:0}.nk-field.stacked,.nk-fields>.nk-field{flex-direction:column;align-items:stretch;gap:6px;min-width:0}.nk-field.stacked .f-control,.nk-fields>.nk-field .f-control{width:100%;min-width:0}.nk-field.stacked .nk-input,.nk-field.stacked .nk-textarea,.nk-field.stacked .nk-select,.nk-fields>.nk-field .nk-input,.nk-fields>.nk-field .nk-textarea,.nk-fields>.nk-field .nk-select{width:100%;min-width:0}.nk-field.compact,.nk-fields>.nk-field{padding:0;gap:4px;min-width:0}.nk-field.compact .f-label,.nk-field.compact ::slotted([slot=\\\"label\\\"]),.nk-fields>.nk-field .f-label,.nk-fields>.nk-field ::slotted([slot=\\\"label\\\"]){font-size:12px;color:var(--nk-text-tertiary)}.nk-fields{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px 12px;padding:9px 0}.nk-fields.fit{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.nk-fields>.nk-field{min-width:0}.nk-input,.nk-select,.nk-textarea{font-family:inherit;font-size:14px;line-height:20px;color:var(--nk-text);background:var(--nk-bg-input);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:5px 10px;outline:none;transition:border-color .15s,box-shadow .15s;min-width:var(--_nk-field-min, 210px);max-width:100%}.nk-input:hover,.nk-select:hover,.nk-textarea:hover{border-color:var(--nk-border-strong)}.nk-input:focus,.nk-select:focus,.nk-textarea:focus{border-color:color-mix(in srgb,var(--nk-accent) 60%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--nk-accent) 30%,transparent)}.nk-input::placeholder,.nk-textarea::placeholder{color:var(--nk-text-tertiary)}.nk-input.wide,.nk-textarea.wide,.nk-select.wide{width:100%;min-width:0}.nk-input[type=date],.nk-input[type=time],.nk-input[type=datetime-local],.nk-input[type=month]{appearance:none}.nk-input::-webkit-date-and-time-value{text-align:start;min-height:1lh}.nk-select.compact{min-width:120px}.nk-textarea{resize:vertical;min-height:70px;line-height:1.5}.nk-select{appearance:none;cursor:pointer;padding-right:26px;background-image:linear-gradient(45deg,transparent 50%,var(--nk-text-tertiary) 50%),linear-gradient(135deg,var(--nk-text-tertiary) 50%,transparent 50%);background-position:calc(100% - 14px) 55%,calc(100% - 10px) 55%;background-size:4px 4px;background-repeat:no-repeat}.nk-copy-field{display:flex;align-items:center;gap:2px;min-width:var(--_nk-field-min, 210px);max-width:100%;padding:0 3px 0 10px;font-size:14px;line-height:20px;color:var(--nk-text);background:var(--nk-bg-input);border:1px solid var(--nk-border);border-radius:var(--nk-radius)}.nk-copy-field.wide{width:100%;min-width:0}.nk-copy-field.wrap{align-items:flex-start}.nk-copy-field .cf-value{flex:1 1 auto;min-width:0;padding:5px 6px 5px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:all}.nk-copy-field.mono .cf-value{font-family:var(--nk-font-mono);font-size:13px}.nk-copy-field.wrap .cf-value{white-space:pre-wrap;overflow-wrap:anywhere}.nk-copy-field .cf-btn{flex:none;height:24px;margin:3px 0;padding:0 8px;border:none;border-radius:4px;background:transparent;font-family:inherit;font-size:13px;color:var(--nk-text-secondary);white-space:nowrap;cursor:pointer}.nk-copy-field .cf-btn:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-copy-field .cf-btn.copied{color:var(--nk-color-green)}.nk-calendar{display:block;width:max-content;max-width:100%;margin-inline:auto;font-size:14px;user-select:none;-webkit-user-select:none}.nk-calendar .cal-head{display:flex;align-items:center;gap:2px;padding:0 0 6px 6px}.nk-calendar .cal-title{flex:1;font-weight:600;white-space:nowrap}.nk-calendar .cal-nav,.nk-calendar-view .cal-nav{display:inline-flex;align-items:center;justify-content:center;height:28px;min-width:28px;padding:0 6px;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:13px;color:var(--nk-text-secondary);cursor:pointer}.nk-calendar .cal-nav:hover,.nk-calendar-view .cal-nav:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-calendar .cal-nav svg,.nk-calendar-view .cal-nav svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-calendar .cal-grid{display:grid;grid-template-columns:repeat(7,var(--_nk-cell, 36px));row-gap:2px}.nk-calendar.weeks .cal-grid{grid-template-columns:24px repeat(7,var(--_nk-cell, 36px))}.nk-calendar .cal-wd,.nk-calendar .cal-week{display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--nk-text-tertiary);font-variant-numeric:tabular-nums}.nk-calendar .cal-wd{height:24px}.nk-calendar .cal-week{font-size:11px}.nk-calendar .cal-day{position:relative;display:inline-flex;align-items:center;justify-content:center;width:var(--_nk-cell, 36px);height:var(--_nk-cell, 36px);padding:0;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:14px;color:var(--nk-text);font-variant-numeric:tabular-nums;cursor:pointer}.nk-calendar .cal-day:hover{background:var(--nk-bg-hover)}.nk-calendar .cal-day:focus-visible{outline:2px solid color-mix(in srgb,var(--nk-accent) 60%,transparent);outline-offset:-2px}.nk-calendar .cal-day.out,.nk-calendar .cal-day.off{color:var(--nk-text-tertiary)}.nk-calendar .cal-day.today{color:var(--nk-danger);font-weight:600}.nk-calendar .cal-day.in-range{border-radius:0;background:color-mix(in srgb,var(--nk-accent) 12%,transparent)}.nk-calendar .cal-day:is(.selected,.start,.end){background:var(--nk-accent);color:var(--nk-on-accent);font-weight:500}.nk-calendar .cal-day.start:not(.end){border-radius:var(--nk-radius) 0 0 var(--nk-radius)}.nk-calendar .cal-day.end:not(.start){border-radius:0 var(--nk-radius) var(--nk-radius) 0}.nk-calendar .cal-day[aria-disabled=true]{color:var(--nk-text-tertiary);background:none;opacity:.5;cursor:default}.nk-calendar .cal-marks{position:absolute;left:0;right:0;bottom:3px;display:flex;justify-content:center;gap:2px;pointer-events:none}.nk-calendar .cal-marks i{width:4px;height:4px;border-radius:50%;background:var(--nk-color-gray)}.nk-calendar .cal-day:is(.selected,.start,.end) .cal-marks i{background:var(--nk-on-accent)}.nk-calendar .cal-foot{display:flex;align-items:center;gap:8px;margin-top:8px;padding:8px 2px 0;border-top:1px solid var(--nk-border)}.nk-calendar .cal-foot .nk-input{min-width:0;flex:1 1 auto}.nk-btn{font-family:inherit;font-size:14px;line-height:20px;font-weight:500;border-radius:var(--nk-radius);cursor:pointer;padding:3px 12px;border:1px solid transparent;transition:background .15s,border-color .15s,box-shadow .15s,opacity .15s;display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap}.nk-btn svg,.nk-btn ::slotted(svg){width:15px;height:15px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-btn.primary{background:var(--nk-accent);color:var(--nk-on-accent)}.nk-btn.primary:hover:not(:disabled,[aria-disabled=true]){opacity:.88}.nk-btn.secondary{background:var(--nk-bg-card);color:var(--nk-text);box-shadow:var(--nk-shadow-btn)}.nk-btn.secondary:hover:not(:disabled,[aria-disabled=true]){background:color-mix(in srgb,var(--nk-bg-card),var(--nk-text) 6%)}.nk-btn.danger{background:var(--nk-bg-card);color:var(--nk-danger);box-shadow:var(--nk-shadow-btn)}.nk-btn.danger:hover:not(:disabled,[aria-disabled=true]){background:color-mix(in srgb,var(--nk-danger) 8%,var(--nk-bg-card))}.nk-btn.danger-solid{background:var(--nk-danger);color:var(--nk-on-accent)}.nk-btn.danger-solid:hover:not(:disabled,[aria-disabled=true]){opacity:.88}.nk-btn.small{padding:1px 8px;font-size:13px;line-height:20px}a.nk-btn{text-decoration:none}.nk-btn:disabled,.nk-btn[aria-disabled=true]{opacity:.5;cursor:not-allowed}.nk-switch{position:relative;width:34px;height:20px;flex-shrink:0;appearance:none;border:none;cursor:pointer;border-radius:20px;background:var(--nk-border-strong);transition:background .2s}.nk-switch:after{content:\\\"\\\";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--nk-on-accent);transition:transform .2s;box-shadow:var(--nk-shadow-knob)}.nk-switch:checked,.nk-switch[aria-checked=true]{background:var(--nk-accent)}.nk-switch:checked:after,.nk-switch[aria-checked=true]:after{transform:translate(14px)}.nk-switch:disabled{opacity:.5;cursor:not-allowed}.nk-switch-label{display:inline-flex;align-items:flex-start;gap:8px;font-size:14px;cursor:pointer}.nk-switch-label>.nk-switch{font-size:inherit;line-height:inherit;margin-top:max(0px,calc((1lh - 20px)/2))}.nk-switch-label>span{padding-top:max(0px,calc((20px - 1lh)/2))}.nk-switch-label:has(.nk-switch:disabled){cursor:not-allowed;color:var(--nk-text-tertiary)}.nk-check{display:flex;align-items:flex-start;gap:8px;padding:4px 0;font-size:14px;cursor:pointer}.nk-check input{appearance:none;width:16px;height:16px;flex-shrink:0;border:1.4px solid var(--nk-border-strong);border-radius:3px;cursor:pointer;position:relative;background:var(--nk-bg);font-size:inherit;line-height:inherit;margin-top:max(0px,calc((1lh - 16px)/2))}.nk-check input[type=radio]{border-radius:50%}.nk-check input:checked{background:var(--nk-accent);border-color:var(--nk-accent)}.nk-check input:checked:after{content:\\\"\\\\2713\\\";color:var(--nk-on-accent);font-size:10.5px;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.nk-check input[type=radio]:checked:after{content:\\\"\\\\25cf\\\";font-size:7px}.nk-check input:disabled{opacity:.5;cursor:not-allowed}.nk-check input:disabled+*{opacity:.6}.nk-slider{width:210px;accent-color:var(--nk-accent);cursor:pointer}.nk-slider-value{font-size:12.5px;color:var(--nk-text-tertiary);margin-top:3px}.nk-profile-row{display:flex;align-items:center;gap:14px;padding:8px 0}.nk-profile-row .big-avatar,.nk-profile-row ::slotted(.big-avatar),.nk-profile-row ::slotted([slot=\\\"avatar\\\"]){width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-size:20px;font-weight:600;display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.nk-profile-row .big-avatar>img{display:block;width:100%;height:100%;object-fit:cover}.nk-profile-row .big-avatar.square,.nk-profile-row ::slotted(.big-avatar.square){border-radius:8px}.nk-profile-row .pr-actions{display:flex;flex-direction:column;gap:6px}.nk-profile-row .pr-remove{color:var(--nk-text-tertiary)}.nk-model-card{border:1px solid var(--nk-border-strong);border-radius:8px;padding:12px 14px;margin-bottom:var(--nk-block-space, 10px);cursor:pointer;display:flex;align-items:flex-start;gap:11px;transition:border-color .15s,background .15s}.nk-model-card:hover{background:var(--nk-bg-hover)}.nk-model-card.selected{border-color:var(--nk-accent);background:color-mix(in srgb,var(--nk-accent) 6%,transparent)}.nk-model-card .m-radio{width:15px;height:15px;border-radius:50%;flex-shrink:0;margin-top:2px;border:1.4px solid var(--nk-border-strong);position:relative}.nk-model-card.selected .m-radio{border-color:var(--nk-accent)}.nk-model-card.selected .m-radio:after{content:\\\"\\\";position:absolute;inset:3px;border-radius:50%;background:var(--nk-accent)}.nk-model-card .m-name,.nk-model-card ::slotted(.m-name),.nk-model-card ::slotted([slot=\\\"title\\\"]){font-weight:500;font-size:14px;display:flex;align-items:center;gap:7px}.nk-model-card .m-desc,.nk-model-card ::slotted(.m-desc),.nk-model-card ::slotted([slot=\\\"desc\\\"]){font-size:12px;color:var(--nk-text-secondary);margin-top:2px;line-height:1.45}.nk-danger-zone{border:1px solid color-mix(in srgb,var(--nk-danger) 40%,transparent);border-radius:8px;padding:14px 16px;margin-top:var(--nk-block-space, 26px)}.nk-danger-zone .dz-title{color:var(--nk-danger);font-weight:600;font-size:13px;margin-bottom:8px}.nk-member-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid var(--nk-border)}.nk-member-list>.nk-member-row:last-child,.nk-member-list ::slotted(.nk-member-row:last-child),.nk-member-row.last{border-bottom:none}.nk-member-row .mini-avatar,.nk-member-row .nk-avatar,.nk-member-row ::slotted(.mini-avatar),.nk-member-row ::slotted([slot=\\\"avatar\\\"]){width:28px;height:28px;border-radius:50%;color:var(--nk-on-accent);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;flex-shrink:0}.nk-member-row>:has(>.m-mail){min-width:0}.nk-member-row .m-mail{font-size:12px;color:var(--nk-text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nk-member-row .nk-select{min-width:120px;margin-left:auto}.nk-member-row ::slotted([slot=\\\"role\\\"]){margin-left:auto}.nk-modal-backdrop{position:fixed;inset:0;background:var(--nk-scrim);padding:env(safe-area-inset-top,0px) env(safe-area-inset-right,0px) env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px);display:flex;align-items:center;justify-content:center;z-index:100;opacity:0;pointer-events:none;transition:opacity .2s ease}.nk-modal-backdrop.open{opacity:1;pointer-events:auto}.nk-modal{width:min(1150px,92vw);height:min(715px,86vh);max-width:100%;max-height:100%;background:var(--nk-bg);border-radius:10px;box-shadow:var(--nk-shadow-menu);display:flex;overflow:hidden;transform:scale(.98) translateY(6px);transition:transform .2s ease}.nk-modal-backdrop.open .nk-modal{transform:none}.nk-settings-nav{width:240px;min-width:240px;background:var(--nk-bg-sidebar);border-right:1px solid var(--nk-border);padding:10px 8px;overflow-y:auto;flex-shrink:0}.nk-settings-user{display:flex;align-items:center;gap:9px;padding:6px 10px 12px;margin-bottom:4px}.nk-settings-user .avatar,.nk-settings-user ::slotted(.avatar),.nk-settings-user ::slotted([slot=\\\"avatar\\\"]){width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-weight:600;font-size:13px;display:flex;align-items:center;justify-content:center}.nk-settings-user .name{font-weight:500;font-size:14px}.nk-settings-user .mail{font-size:12px;color:var(--nk-text-secondary)}.nk-settings-nav .nk-tree-item{min-height:28px}.nk-settings-nav .nk-tree-item.active{background:var(--nk-bg-active);color:var(--nk-text);font-weight:500}.nk-settings-content{flex:1;overflow-y:auto;padding:36px 60px 80px;min-width:0}.nk-settings-content::-webkit-scrollbar{width:10px}.nk-settings-content::-webkit-scrollbar-thumb{background:var(--nk-border-strong);border-radius:5px;border:2px solid var(--nk-bg)}.nk-settings-pane{display:none;max-width:800px}.nk-settings-pane.active{display:block}.nk-settings-pane>h2{font-size:22px;font-weight:600;line-height:1.3;margin-bottom:20px}.nk-settings-pane>h3{font-size:16px;font-weight:500;padding-bottom:8px;border-bottom:1px solid var(--nk-border);margin:30px 0 12px}.nk-settings-pane ::slotted(h2){font-size:22px;font-weight:600;line-height:1.3;padding:0!important;margin:0 0 20px!important}.nk-settings-pane ::slotted(h3){font-size:16px;font-weight:500;border:0;border-bottom:1px solid var(--nk-border);padding:0 0 8px!important;margin:30px 0 12px!important}.nk-pop{background:var(--nk-bg);border-radius:10px;box-shadow:var(--nk-shadow-menu);padding:10px;width:296px}.nk-emoji-search{width:100%;font-family:inherit;font-size:14px;color:var(--nk-text);background:var(--nk-bg-input);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:6px 10px;outline:none;margin-bottom:8px}.nk-emoji-grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px}.nk-emoji-grid span,.nk-emoji-grid ::slotted(span){font-size:18px;text-align:center;padding:4px 0;border-radius:5px;cursor:pointer;user-select:none}.nk-emoji-grid span:hover{background:var(--nk-bg-hover)}.nk-emoji-cats{display:flex;gap:2px;margin-top:8px;padding-top:8px;border-top:1px solid var(--nk-border)}.nk-emoji-cats span{font-size:14px;padding:3px 7px;border-radius:5px;cursor:pointer;color:var(--nk-text-tertiary);filter:grayscale(1);opacity:.6}.nk-emoji-cats span.active,.nk-emoji-cats span:hover{filter:none;opacity:1;background:var(--nk-bg-hover)}.nk-menu{padding:5px;width:230px}.nk-menu-item{display:flex;align-items:center;gap:9px;padding:4px 8px;min-height:var(--_nk-row, 28px);border-radius:5px;cursor:pointer;font-size:14px;user-select:none}.nk-menu-item:hover{background:var(--nk-bg-hover)}.nk-menu-item .m-icon,.nk-menu-item ::slotted(.m-icon),.nk-menu-item ::slotted([slot=\\\"icon\\\"]){width:17px;text-align:center;font-size:14px}.nk-menu-item .m-shortcut,.nk-menu-item ::slotted(.m-shortcut){margin-left:auto;font-size:12px;color:var(--nk-text-tertiary)}.nk-menu-item.danger{color:var(--nk-danger)}.nk-menu-item>.nk-switch{margin-left:auto}.nk-menu-sep{border-top:1px solid var(--nk-border);margin:5px 4px}.nk-menu-label{font-size:12px;color:var(--nk-text-tertiary);padding:5px 8px 2px}.nk-pop.floating{z-index:106;opacity:0;visibility:hidden;pointer-events:none;max-height:min(var(--_nk-float-max, 100dvh),100dvh - 16px);overflow-y:auto;overscroll-behavior:contain;transform:translateY(-4px) scale(.98);transform-origin:top;transition:opacity .15s ease,transform .15s ease,visibility 0s linear .15s}.nk-pop.floating.open{opacity:1;visibility:visible;pointer-events:auto;transform:none;transition:opacity .15s ease,transform .15s ease,visibility 0s}.nk-cmdk-backdrop{position:fixed;inset:0;background:var(--nk-scrim-soft);display:flex;justify-content:center;align-items:flex-start;padding:max(14vh,env(safe-area-inset-top,0px)) env(safe-area-inset-right,0px) env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px);z-index:110;opacity:0;pointer-events:none;transition:opacity .18s ease}.nk-cmdk-backdrop.open{opacity:1;pointer-events:auto}.nk-cmdk{max-width:100%;width:min(560px,92vw);background:var(--nk-bg);border-radius:12px;box-shadow:var(--nk-shadow-menu);overflow:hidden;transform:scale(.98);transition:transform .18s ease}.nk-cmdk-backdrop.open .nk-cmdk{transform:scale(1)}.nk-cmdk-input-row{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--nk-border)}.nk-cmdk-input-row input{flex:1;border:none;outline:none;background:transparent;font-family:inherit;font-size:16px;color:var(--nk-text)}.nk-cmdk-input-row input::placeholder{color:var(--nk-text-tertiary)}.nk-cmdk-list{max-height:320px;overflow-y:auto;padding:6px}.nk-cmdk-group{font-size:12px;color:var(--nk-text-tertiary);padding:8px 10px 3px}.nk-cmdk-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer;font-size:14px;user-select:none}.nk-cmdk-item.selected{background:var(--nk-bg-active)}.nk-cmdk-item .m-icon,.nk-cmdk-item ::slotted(.m-icon),.nk-cmdk-item ::slotted([slot=\\\"icon\\\"]){width:17px;text-align:center;font-size:14px}.nk-cmdk-item .m-shortcut,.nk-cmdk-item ::slotted(.m-shortcut){margin-left:auto;font-size:12px;color:var(--nk-text-tertiary)}.nk-cmdk-empty{padding:30px;text-align:center;color:var(--nk-text-tertiary);font-size:13.5px}.nk-cmdk-footer{display:flex;gap:14px;padding:8px 16px;border-top:1px solid var(--nk-border);font-size:11.5px;color:var(--nk-text-tertiary)}.nk-sheet-backdrop{position:fixed;inset:0;z-index:100;display:none;flex-direction:column;align-items:center;justify-content:flex-end;padding-top:max(24px,env(safe-area-inset-top,0px));background:var(--nk-scrim-soft);opacity:0;transition:opacity .2s ease,display .25s allow-discrete}.nk-sheet-backdrop.open{display:flex;opacity:1}@starting-style{.nk-sheet-backdrop.open{opacity:0}}.nk-sheet{--_nk-row: 40px;width:100%;max-width:640px;max-height:100%;overflow-y:auto;overscroll-behavior:contain;padding:6px max(10px,env(safe-area-inset-right,0px)) max(16px,env(safe-area-inset-bottom,0px)) max(10px,env(safe-area-inset-left,0px));background:var(--nk-bg);color:var(--nk-text);border-radius:14px 14px 0 0;box-shadow:var(--nk-shadow-menu);translate:0 100%;transition:translate .25s cubic-bezier(.2,.8,.2,1)}.nk-sheet-backdrop.open .nk-sheet{translate:none}@starting-style{.nk-sheet-backdrop.open .nk-sheet{translate:0 100%}}.nk-sheet .sh-grabber,.nk-sheet ::slotted(.sh-grabber){width:36px;height:4px;margin:4px auto 10px;border-radius:2px;background:var(--nk-border-strong)}.nk-sheet .sh-title,.nk-sheet ::slotted(.sh-title){font-size:14px;font-weight:600;text-align:center;padding:0 8px 10px}.nk-dialog-backdrop{position:fixed;inset:0;z-index:105;display:none;align-items:center;justify-content:center;padding:max(16px,env(safe-area-inset-top,0px)) max(16px,env(safe-area-inset-right,0px)) max(16px,env(safe-area-inset-bottom,0px)) max(16px,env(safe-area-inset-left,0px));background:var(--nk-scrim-soft);opacity:0;transition:opacity .2s ease,display .2s allow-discrete}.nk-dialog-backdrop.open{display:flex;opacity:1}@starting-style{.nk-dialog-backdrop.open{opacity:0}}.nk-dialog{width:440px;max-width:100%;max-height:100%;overflow-y:auto;overscroll-behavior:contain;padding:20px 24px;border-radius:10px;outline:none;background:var(--nk-bg);color:var(--nk-text);box-shadow:var(--nk-shadow-menu);scale:.98;translate:0 6px;transition:scale .2s ease,translate .2s ease}.nk-dialog.wide{width:560px}.nk-dialog-backdrop.open .nk-dialog{scale:none;translate:none}@starting-style{.nk-dialog-backdrop.open .nk-dialog{scale:.98;translate:0 6px}}.nk-dialog .dl-title{font-size:16px;font-weight:600;line-height:1.4;margin-bottom:6px}.nk-dialog .dl-body{font-size:14px;line-height:1.5}.nk-dialog .dl-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px}.nk-peek-backdrop{position:fixed;inset:0;z-index:50;display:none;pointer-events:none;transition:background-color .2s ease,display .25s allow-discrete}.nk-peek-backdrop.open{display:block}.nk-peek{--_nk-title: 32px;position:absolute;top:0;right:0;bottom:0;width:min(var(--nk-peek-width),100%);display:flex;flex-direction:column;pointer-events:auto;outline:none;background:var(--nk-bg);color:var(--nk-text);box-shadow:var(--nk-shadow-menu);translate:100% 0;transition:translate .25s cubic-bezier(.2,.8,.2,1)}.nk-peek-backdrop.open .nk-peek{translate:none}@starting-style{.nk-peek-backdrop.open .nk-peek{translate:100% 0}}.nk-peek .pk-bar{flex:none;display:flex;align-items:center;gap:2px;height:44px;padding:0 12px}.nk-peek .pk-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:4px 48px 64px;font-size:16px;line-height:1.5}.nk-peek .pk-resize{position:absolute;top:0;bottom:0;left:-4px;width:8px;z-index:1;cursor:col-resize;touch-action:none;outline:none}.nk-peek .pk-resize:after{content:\\\"\\\";position:absolute;top:0;bottom:0;left:3px;width:2px;transition:background .15s}.nk-peek .pk-resize:hover:after,.nk-peek .pk-resize:focus-visible:after,.nk-peek .pk-resize.active:after{background:var(--nk-accent)}.nk-app.peek-inset .nk-main{padding-right:min(var(--nk-peek-width),100%)}.nk-toast{position:fixed;bottom:max(20px,calc(env(safe-area-inset-bottom,0px) + 12px));left:50%;transform:translate(-50%) translateY(80px);z-index:120;width:max-content;max-width:calc(100% - 32px);background:var(--nk-text);color:var(--nk-bg);padding:8px 16px;border-radius:8px;font-size:14px;opacity:0;transition:all .3s ease;pointer-events:none;box-shadow:var(--nk-shadow-menu);display:flex;gap:8px;align-items:center}.nk-toast.show{opacity:1;transform:translate(-50%) translateY(0)}.nk-tooltip{z-index:130;max-width:260px;padding:4px 8px;border-radius:var(--nk-radius);overflow-wrap:break-word;background:var(--nk-text);color:var(--nk-bg);box-shadow:var(--nk-shadow-menu);font-size:12px;font-weight:500;line-height:16px;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .1s ease,visibility 0s linear .1s}.nk-tooltip.open{opacity:1;visibility:visible;transition:opacity .1s ease}.nk-tooltip .tt-key{margin-left:6px;color:color-mix(in srgb,var(--nk-bg) 60%,transparent)}.nk-tooltip.lines{white-space:pre-line}.nk-gallery-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));gap:20px 32px;margin:var(--nk-block-space, 12px) 0}.nk-g-item>h4{font-size:12px;font-weight:500;color:var(--nk-text-tertiary);text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px}.nk-g-item ::slotted(h4){font-size:12px;font-weight:500;color:var(--nk-text-tertiary);text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px!important}.nk-tabs{display:flex;gap:2px;border-bottom:1px solid var(--nk-border);font-size:14px}.nk-tab{padding:7px 11px;cursor:pointer;color:var(--nk-text-secondary);border-bottom:2px solid transparent;margin-bottom:-1px;user-select:none}.nk-tab:hover{color:var(--nk-text)}.nk-tab.active{color:var(--nk-text);border-bottom-color:var(--nk-text);font-weight:500}.nk-tab-panel{padding:12px 2px;color:var(--nk-text-secondary);line-height:1.55;font-size:14px}.nk-tabs.scroll{overflow-x:auto;overflow-y:hidden;scrollbar-width:none;white-space:nowrap;border-bottom:0;padding-bottom:1px;box-shadow:inset 0 -1px 0 var(--nk-border)}.nk-tabs.scroll::-webkit-scrollbar{display:none}.nk-template-btn{display:flex;align-items:center;gap:8px;width:100%;font-family:inherit;font-size:14px;color:var(--nk-text-secondary);background:var(--nk-bg-callout);border:none;border-radius:var(--nk-radius);padding:8px 12px;cursor:pointer;margin-bottom:var(--nk-block-space, 6px);text-align:left}.nk-template-btn:hover{background:var(--nk-bg-hover)}.nk-stats{display:flex;gap:10px}.nk-stat{flex:1;border:1px solid var(--nk-border);border-radius:8px;padding:12px 14px}.nk-stat .s-label,.nk-stat ::slotted(.s-label),.nk-stat ::slotted([slot=\\\"label\\\"]){font-size:12px;color:var(--nk-text-secondary);margin-bottom:4px}.nk-stat .s-value,.nk-stat ::slotted(.s-value),.nk-stat ::slotted([slot=\\\"value\\\"]){font-size:22px;font-weight:600;letter-spacing:-.01em}.nk-stat .s-delta,.nk-stat ::slotted(.s-delta),.nk-stat ::slotted([slot=\\\"delta\\\"]){font-size:12px;margin-top:3px}.nk-stat .s-delta.up,.nk-stat ::slotted(.s-delta.up),.nk-stat ::slotted([slot=\\\"delta\\\"].up){color:var(--nk-color-green)}.nk-stat .s-delta.down,.nk-stat ::slotted(.s-delta.down),.nk-stat ::slotted([slot=\\\"delta\\\"].down){color:var(--nk-danger)}.nk-synced{border:1.5px solid color-mix(in srgb,var(--nk-danger) 55%,transparent);border-radius:8px;padding:12px 14px;position:relative;margin:var(--nk-block-space, 8px) 0}.nk-synced .synced-badge{position:absolute;top:-9px;right:10px;font-size:11px;background:var(--nk-danger);color:var(--nk-on-accent);border-radius:8px;padding:1px 8px}.nk-segmented{display:inline-flex;background:var(--nk-bg-callout);border-radius:7px;padding:2px}.nk-segmented button{font-family:inherit;font-size:14px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 12px;border-radius:5px;cursor:pointer}.nk-segmented ::slotted(button){font-family:inherit;font-size:14px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 12px!important;border-radius:5px;cursor:pointer}.nk-segmented button.active,.nk-segmented ::slotted(button.active){background:var(--nk-bg);color:var(--nk-text);font-weight:500;box-shadow:var(--nk-shadow-segment)}.nk-segmented.wrap{flex-wrap:wrap}.nk-segmented.scroll{max-width:100%;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}.nk-segmented.scroll::-webkit-scrollbar{display:none}.nk-segmented.scroll button,.nk-segmented.scroll ::slotted(button){flex-shrink:0;white-space:nowrap}.nk-banner{display:flex;align-items:center;gap:10px;font-size:14px;border-radius:8px;padding:10px 14px;margin-bottom:var(--nk-block-space, 8px);color:var(--nk-text)}.nk-banner.info{background:var(--nk-tint-blue)}.nk-banner.success{background:var(--nk-tint-green)}.nk-banner.warning{background:var(--nk-tint-yellow)}.nk-banner.danger{background:var(--nk-tint-red)}.nk-banner .b-action,.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){margin-left:auto;padding:0;border:0;background:none;color:inherit;font:inherit;font-weight:500;text-align:left;cursor:pointer;text-decoration:underline;text-underline-offset:2px}.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){margin-left:auto!important}.nk-avatar-group{display:flex}.nk-avatar-group .mini-avatar,.nk-avatar-group .nk-avatar,.nk-avatar-group ::slotted(.mini-avatar),.nk-avatar-group ::slotted(.nk-avatar){width:26px;height:26px;border-radius:50%;color:var(--nk-on-accent);font-size:10.5px;font-weight:600;border:2px solid var(--nk-bg);display:flex;align-items:center;justify-content:center;margin-left:-7px}.nk-avatar-group .mini-avatar:first-child,.nk-avatar-group .nk-avatar:first-child,.nk-avatar-group ::slotted(.mini-avatar:first-child),.nk-avatar-group ::slotted(.nk-avatar:first-child){margin-left:0}.nk-avatar-group .more,.nk-avatar-group ::slotted(.more){background:var(--nk-bg-callout);color:var(--nk-text-secondary)}.nk-avatar{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:24px;height:24px;border-radius:50%;overflow:hidden;vertical-align:middle;font-size:10px;font-weight:600;line-height:1;color:var(--nk-on-accent);user-select:none;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));object-fit:cover}.nk-avatar.small{width:20px;height:20px;font-size:9px}.nk-avatar.large{width:32px;height:32px;font-size:12px}.nk-avatar.xlarge{width:56px;height:56px;font-size:20px}.nk-avatar.square{border-radius:4px}.nk-avatar>img,.nk-avatar ::slotted(img){display:block;width:100%;height:100%;object-fit:cover}.nk-avatar.gray,.nk-calendar .cal-marks i.gray{background:var(--nk-color-gray)}.nk-avatar.brown,.nk-calendar .cal-marks i.brown{background:var(--nk-color-brown)}.nk-avatar.orange,.nk-calendar .cal-marks i.orange{background:var(--nk-color-orange)}.nk-avatar.yellow,.nk-calendar .cal-marks i.yellow{background:var(--nk-color-yellow)}.nk-avatar.green,.nk-calendar .cal-marks i.green{background:var(--nk-color-green)}.nk-avatar.blue,.nk-calendar .cal-marks i.blue{background:var(--nk-color-blue)}.nk-avatar.purple,.nk-calendar .cal-marks i.purple{background:var(--nk-color-purple)}.nk-avatar.pink,.nk-calendar .cal-marks i.pink{background:var(--nk-color-pink)}.nk-avatar.red,.nk-calendar .cal-marks i.red{background:var(--nk-color-red)}.nk-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));gap:12px;margin:var(--nk-block-space, 12px) 0}.nk-panels.flush{margin:0}.nk-panel{display:flex;flex-direction:column;gap:6px;min-width:0;--_nk-field-min: min(210px, 100%);padding:14px 16px;border:1px solid var(--nk-border);border-radius:10px;background:var(--nk-bg-card);box-shadow:var(--nk-shadow-card);font-size:14px;line-height:1.5;color:inherit;text-decoration:none;text-align:left}:is(a,button).nk-panel{cursor:pointer;font-family:inherit;transition:border-color .15s,background .15s}:is(a,button).nk-panel:hover{border-color:var(--nk-border-strong)}.nk-panel>h3,.nk-panel>.p-head>h3{font-size:14px;font-weight:600;line-height:1.4}.nk-panel ::slotted(h3){font-size:14px;font-weight:600;line-height:1.4;margin:0!important}.nk-panel>p{font-size:13px;color:var(--nk-text-secondary)}.nk-panel ::slotted(p){font-size:13px;color:var(--nk-text-secondary);margin:0!important}.nk-panel>.p-head{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;min-width:0}.nk-panel>.p-head>h3{flex:1 1 auto;min-width:0}.nk-panel .p-end{flex:none;display:flex;align-items:center;gap:6px;margin-left:auto}.nk-panel>.nk-cover{flex:none;height:var(--nk-panel-cover-height);margin:-14px -16px 2px;border-radius:9px 9px 0 0}.nk-panel>.nk-page-icon{font-size:28px}.nk-panel>.nk-cover+.nk-page-icon{margin-top:-24px}.nk-skeleton{border-radius:5px;margin-bottom:var(--nk-block-space, 10px);background:linear-gradient(90deg,var(--nk-bg-callout) 25%,var(--nk-bg-hover) 50%,var(--nk-bg-callout) 75%);background-size:200% 100%;animation:nk-shimmer 1.6s infinite}@keyframes nk-shimmer{to{background-position:-200% 0}}.nk-empty{text-align:center;padding:36px 20px;border:1.5px dashed var(--nk-border-strong);border-radius:10px;color:var(--nk-text-tertiary)}.nk-empty .e-icon,.nk-empty ::slotted(.e-icon),.nk-empty ::slotted([slot=\\\"icon\\\"]){font-size:30px;margin-bottom:8px}.nk-empty .e-title,.nk-empty ::slotted(.e-title),.nk-empty ::slotted([slot=\\\"title\\\"]){font-weight:500;color:var(--nk-text-secondary);margin-bottom:3px;font-size:14px}.nk-empty .e-desc,.nk-empty ::slotted(.e-desc),.nk-empty ::slotted([slot=\\\"desc\\\"]){font-size:13px;margin-bottom:12px}.nk-empty .e-actions,.nk-empty ::slotted(.e-actions){display:flex;flex-wrap:wrap;justify-content:center;gap:8px}.nk-steps{display:flex;flex-direction:column;margin:var(--nk-block-space, 8px) 0;padding:0;list-style:none;font-size:14px}.nk-step{position:relative;display:flex;align-items:flex-start;gap:10px;padding-bottom:14px;line-height:20px;color:var(--nk-text-tertiary)}.nk-step:last-child{padding-bottom:0}.nk-step:not(:last-child):after{content:\\\"\\\";position:absolute;left:10px;top:24px;bottom:4px;width:1px;background:var(--nk-border)}.nk-step .st-mark{flex:none;width:20px;height:20px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--nk-border-strong);background:var(--nk-bg);font-size:11px;font-weight:600;line-height:1}.nk-step .st-desc{display:block;font-size:12px;line-height:18px;color:var(--nk-text-tertiary);font-weight:400}.nk-step.done{color:var(--nk-text-secondary)}.nk-step.done .st-mark{background:var(--nk-tag-green-bg);color:var(--nk-tag-green-text);border-color:transparent}.nk-step.current{color:var(--nk-text);font-weight:500}.nk-step.current .st-mark{border-color:var(--nk-accent);color:var(--nk-accent)}.nk-step.skipped .st-mark{border-style:dashed}.nk-step button.st-label,.nk-step a.st-label{font:inherit;color:inherit;text-align:left;text-decoration:none;background:none;border:0;border-radius:3px;cursor:pointer}.nk-step button.st-label:hover,.nk-step a.st-label:hover{text-decoration:underline;text-decoration-color:var(--nk-text-tertiary);text-underline-offset:2px}.nk-step button.st-label:focus-visible,.nk-step a.st-label:focus-visible{outline:2px solid color-mix(in srgb,var(--nk-accent) 60%,transparent);outline-offset:2px}.nk-steps.horizontal{flex-direction:row;align-items:flex-start;gap:10px}.nk-steps.horizontal .nk-step{flex:none;padding-bottom:0;min-width:0;white-space:nowrap}.nk-steps.horizontal .nk-step:not(:last-child){flex:1 1 auto}.nk-steps.horizontal .nk-step:not(:last-child):after{position:static;flex:1 1 16px;width:auto;min-width:16px;height:1px;margin-top:10px}.nk-comments{border-left:1px solid var(--nk-border);padding:4px 0 4px 18px;margin:var(--nk-block-space, 8px) 0 var(--nk-block-space, 8px) 8px}.nk-comment{display:flex;gap:9px;margin-bottom:14px}.nk-comment .mini-avatar,.nk-comment ::slotted(.mini-avatar),.nk-comment ::slotted([slot=\\\"avatar\\\"]){width:24px;height:24px;border-radius:50%;color:var(--nk-on-accent);flex-shrink:0;font-size:10px;font-weight:600;display:flex;align-items:center;justify-content:center}.nk-comment .c-head,.nk-comment ::slotted(.c-head){font-size:12px;color:var(--nk-text-tertiary);margin-bottom:2px}.nk-comment .c-head b{color:var(--nk-text);font-weight:600}.nk-comment .c-body,.nk-comment ::slotted(.c-body){font-size:14px;line-height:1.5}.nk-comment-input{display:flex;gap:8px;align-items:center;margin-top:4px}.nk-comment-input input{min-width:0;flex:1}.nk-ai-thread{display:flex;flex-direction:column;gap:14px}.nk-ai-msg{display:flex;gap:9px}.nk-ai-msg .mini-avatar,.nk-ai-msg ::slotted(.mini-avatar),.nk-ai-msg ::slotted([slot=\\\"avatar\\\"]){width:24px;height:24px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:12px;background:var(--nk-bg-callout)}.nk-ai-msg.user .mini-avatar,.nk-ai-msg.user ::slotted(.mini-avatar),.nk-ai-msg.user ::slotted([slot=\\\"avatar\\\"]){background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-size:9.5px;font-weight:600}.nk-ai-msg .a-body,.nk-ai-msg ::slotted(.a-body){font-size:14px;line-height:1.55;padding-top:2px}.nk-ai-msg .a-name,.nk-ai-msg ::slotted(.a-name){font-size:12px;font-weight:600;margin-bottom:2px}.nk-ai-msg .a-name span{color:var(--nk-text-tertiary);font-weight:400}.nk-ai-msg.user.bubble{justify-content:flex-end}.nk-ai-msg.bubble .a-body,.nk-ai-msg.bubble ::slotted(.a-body){max-width:85%;padding:6px 12px;border-radius:16px;background:var(--nk-bg-callout)}.nk-ai-actions{display:flex;gap:4px;margin-top:6px}.nk-ai-actions button{font-family:inherit;font-size:12px;color:var(--nk-text-secondary);background:transparent;border:1px solid var(--nk-border);border-radius:5px;padding:2px 8px;cursor:pointer}.nk-ai-actions ::slotted(button){font-family:inherit;font-size:12px;color:var(--nk-text-secondary);background:transparent;border:1px solid var(--nk-border);border-radius:5px;padding:2px 8px!important;cursor:pointer}.nk-ai-actions button:hover,.nk-ai-actions ::slotted(button:hover){background:var(--nk-bg-hover);color:var(--nk-text)}.nk-ai-input-row{display:flex;align-items:center;gap:8px;margin-top:var(--nk-block-space, 14px);border:1px solid var(--nk-border-strong);border-radius:10px;padding:8px 12px}.nk-ai-input-row:focus-within{border-color:var(--nk-accent)}.nk-ai-input-row input{flex:1;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;color:var(--nk-text);min-width:0}.nk-ai-input-row input::placeholder{color:var(--nk-text-tertiary)}.nk-ai-send{border:none;background:var(--nk-accent);color:var(--nk-on-accent);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:13px;flex-shrink:0}.nk-block-host{position:relative;border-radius:var(--nk-radius);margin:var(--nk-block-space, 8px) 0;padding:2px 0 2px 2px;transition:background .15s,box-shadow .15s}.nk-block-host:hover{background:var(--nk-bg-hover)}.nk-block-host:focus-within{background:transparent;box-shadow:0 0 0 2px color-mix(in srgb,var(--nk-accent) 25%,transparent)}.nk-block-host.nk-drop-target{box-shadow:0 -2px 0 0 var(--nk-accent);background:transparent}.nk-block-host .nk-block-handle,.nk-block-host ::slotted(.nk-block-handle){position:absolute;left:-26px;top:4px;width:18px;height:20px;border-radius:4px;display:flex;align-items:center;justify-content:center;color:var(--nk-text-tertiary);font-size:13px;cursor:grab;opacity:0;transition:opacity .15s;user-select:none}.nk-block-host:hover .nk-block-handle{opacity:1}.nk-block-host .nk-block-actions{position:absolute;display:flex;gap:1px;z-index:2;opacity:0;transition:opacity .15s;pointer-events:none}.nk-block-host .nk-block-actions.show{opacity:1;pointer-events:auto}.nk-block-host .nk-block-actions button,.nk-block-host .nk-block-actions ::slotted(button){width:20px;height:22px;padding:0;border:none;border-radius:4px;background:transparent;color:var(--nk-text-tertiary);font-family:inherit;font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.nk-block-host .nk-block-actions button:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-block-host .nk-block-actions .drag{cursor:grab}.nk-block-host .nk-block-actions .drag:active{cursor:grabbing}.nk-prose,.nk-block-host .ProseMirror{font-family:var(--nk-font);line-height:1.5;color:var(--nk-text);overflow-wrap:break-word}.nk-block-host .ProseMirror{outline:none;min-height:60px;padding:4px 2px}.nk-prose>*+*,.nk-block-host .ProseMirror>*+*{margin-top:6px}.nk-prose h1,.nk-block-host .ProseMirror h1{font-size:1.875em;font-weight:600;line-height:1.3;letter-spacing:-.01em;margin:32px 0 4px}.nk-prose h2,.nk-block-host .ProseMirror h2{font-size:1.5em;font-weight:600;line-height:1.3;margin:24px 0 4px}.nk-prose h3,.nk-block-host .ProseMirror h3{font-size:1.25em;font-weight:600;line-height:1.3;margin:16px 0 2px}.nk-prose :is(h4,h5,h6),.nk-block-host .ProseMirror :is(h4,h5,h6){font-size:1em;font-weight:600;margin:12px 0 0}.nk-prose>:first-child,.nk-block-host .ProseMirror>:first-child{margin-top:0}.nk-prose>:last-child,.nk-block-host .ProseMirror>:last-child{margin-bottom:0}.nk-prose p:empty:before{content:\\\"\\\";display:inline-block}.nk-prose :is(strong,b),.nk-block-host .ProseMirror :is(strong,b){font-weight:600}.nk-prose :is(ul,ol),.nk-block-host .ProseMirror :is(ul,ol){padding-left:24px;margin:4px 0}.nk-prose ul,.nk-block-host .ProseMirror ul{list-style:disc}.nk-prose ol,.nk-block-host .ProseMirror ol{list-style:decimal}.nk-prose li,.nk-block-host .ProseMirror li{margin:2px 0}.nk-prose li::marker,.nk-block-host .ProseMirror li::marker{color:var(--nk-text-tertiary)}.nk-prose ul[data-type=taskList],.nk-block-host .ProseMirror ul[data-type=taskList]{list-style:none;padding-left:2px}.nk-prose ul[data-type=taskList] li,.nk-block-host .ProseMirror ul[data-type=taskList] li{display:flex;gap:8px;align-items:flex-start}.nk-prose ul[data-type=taskList] li>label,.nk-block-host .ProseMirror ul[data-type=taskList] li>label{flex-shrink:0;margin-top:max(0px,calc((1lh - 16px)/2));user-select:none}.nk-prose ul[data-type=taskList] li>div,.nk-block-host .ProseMirror ul[data-type=taskList] li>div{flex:1;min-width:0}.nk-prose ul[data-type=taskList] input[type=checkbox],.nk-block-host .ProseMirror ul[data-type=taskList] input[type=checkbox]{appearance:none;width:16px;height:16px;margin:0;border:1.4px solid var(--nk-border-strong);border-radius:2px;cursor:pointer;position:relative;background:var(--nk-bg);display:block}.nk-prose ul[data-type=taskList] input[type=checkbox]:checked,.nk-block-host .ProseMirror ul[data-type=taskList] input[type=checkbox]:checked{background:var(--nk-accent);border-color:var(--nk-accent)}.nk-prose ul[data-type=taskList] input[type=checkbox]:checked:after,.nk-block-host .ProseMirror ul[data-type=taskList] input[type=checkbox]:checked:after{content:\\\"\\\\2713\\\";color:var(--nk-on-accent);font-size:11px;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.nk-prose li[data-checked=true]>div,.nk-block-host .ProseMirror li[data-checked=true]>div{text-decoration:line-through;color:var(--nk-text-tertiary)}.nk-prose blockquote,.nk-block-host .ProseMirror blockquote{border-left:3px solid var(--nk-text);padding:2px 0 2px 14px;margin:12px 0;color:var(--nk-text-secondary)}.nk-prose code,.nk-block-host .ProseMirror code{font-family:var(--nk-font-mono);font-size:85%;color:var(--nk-danger);background:color-mix(in srgb,var(--nk-danger) 8%,transparent);border-radius:4px;padding:1px 5px}.nk-prose pre,.nk-block-host .ProseMirror pre{background:var(--nk-bg-code);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:16px 20px;margin:12px 0;font-family:var(--nk-font-mono);font-size:13px;line-height:1.6;color:var(--nk-text-secondary);overflow-x:auto}.nk-prose pre code,.nk-block-host .ProseMirror pre code{background:none;color:inherit;padding:0;font-size:inherit}.nk-prose hr,.nk-block-host .ProseMirror hr{border:none;border-top:1px solid var(--nk-border);margin:20px 0}.nk-prose a,.nk-block-host .ProseMirror a{color:var(--nk-accent);text-decoration:underline;text-underline-offset:2px}.nk-prose img{max-width:100%;height:auto}.nk-prose table{display:block;width:max-content;max-width:100%;overflow-x:auto;border-collapse:collapse;font-size:14px;margin:12px 0}.nk-prose :is(th,td){padding:6px 10px;border:1px solid var(--nk-border);text-align:left;vertical-align:top}.nk-prose th{font-weight:600}.nk-block-host .ProseMirror-gapcursor:after{border-top-color:var(--nk-text)}.nk-block-host .ProseMirror .ProseMirror-selectednode{background:color-mix(in srgb,var(--nk-accent) 8%,transparent)}.nk-block-host .ProseMirror-selectednode{box-shadow:0 0 0 2px color-mix(in srgb,var(--nk-accent) 35%,transparent);border-radius:3px}.nk-block-host .ProseMirror ::selection{background:color-mix(in srgb,var(--nk-accent) 25%,transparent)}.nk-block-host .ProseMirror p.is-editor-empty:first-child:before,.nk-block-host .ProseMirror .is-empty:before{content:attr(data-placeholder);color:var(--nk-text-tertiary);float:left;height:0;pointer-events:none}.nk-block-host .bn-container{font-family:var(--nk-font);color:var(--nk-text);background:transparent}.nk-block-host .bn-editor{padding:4px 2px}.nk-block-host .bn-block-content{font-size:14px;line-height:1.6}.nk-block-host .bn-side-menu{color:var(--nk-text-tertiary)}.nk-block-host .bn-drag-handle{border-radius:4px}.nk-block-host .bn-drag-handle:hover{background:var(--nk-bg-hover)}.nk-block-host .novel-editor{font-family:var(--nk-font);color:var(--nk-text)}.nk-block-host .novel-prose{max-width:none}.nk-slash-menu,.nk-block-host .bn-suggestion-menu,.nk-block-host .tippy-box{background:var(--nk-bg);border-radius:10px;box-shadow:var(--nk-shadow-menu);padding:6px;width:280px;max-height:320px;overflow-y:auto;font-family:var(--nk-font);font-size:14px;color:var(--nk-text)}.nk-slash-menu-label{font-size:12px;color:var(--nk-text-tertiary);padding:6px 9px 2px}.nk-slash-item{display:flex;align-items:center;gap:10px;padding:6px 9px;border-radius:5px;cursor:pointer;user-select:none}.nk-slash-item:hover,.nk-slash-item.selected{background:var(--nk-bg-hover)}.nk-slash-item .m-icon,.nk-slash-item ::slotted(.m-icon){width:28px;height:28px;flex-shrink:0;border-radius:4px;background:var(--nk-bg-callout);border:1px solid var(--nk-border);display:flex;align-items:center;justify-content:center;font-size:15px}.nk-slash-item .m-desc{font-size:12px;color:var(--nk-text-tertiary)}.nk-bubble-menu{display:flex;align-items:center;gap:2px;background:var(--nk-bg);border-radius:8px;box-shadow:var(--nk-shadow-menu);padding:4px}.nk-bubble-menu button{font-family:inherit;font-size:13px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 8px;border-radius:5px;cursor:pointer}.nk-bubble-menu ::slotted(button){font-family:inherit;font-size:13px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 8px!important;border-radius:5px;cursor:pointer}.nk-bubble-menu button:hover,.nk-bubble-menu ::slotted(button:hover){background:var(--nk-bg-hover);color:var(--nk-text)}.nk-bubble-menu button.active,.nk-bubble-menu ::slotted(button.active){color:var(--nk-accent)}@media(max-width:860px){.nk-sidebar{display:none;position:fixed;inset:0 auto 0 0;z-index:60;transform:translate(-100%);transition:background .25s ease,transform .24s cubic-bezier(.2,.8,.25,1),display .24s allow-discrete}.nk-sidebar.open{display:flex;transform:none}@starting-style{.nk-sidebar.open{transform:translate(-100%)}}.nk-sidebar-backdrop{opacity:0;transition:opacity .24s ease,display .24s allow-discrete}.nk-sidebar-backdrop.open{display:block;opacity:1}@starting-style{.nk-sidebar-backdrop.open{opacity:0}}.nk-sidebar-toggle{display:inline-flex}.nk-sidebar.collapsed{margin-left:0;visibility:visible;transition:background .25s ease,transform .24s cubic-bezier(.2,.8,.25,1),display .24s allow-discrete}.nk-sidebar-collapse{display:none}.nk-tab-bar{display:flex}.nk-tab-bar.fixed+.nk-tab-bar-spacer{display:block}.nk-page{padding-left:max(24px,env(safe-area-inset-left,0px));padding-right:max(24px,env(safe-area-inset-right,0px));padding-bottom:80px}.nk-settings-nav{width:60px;min-width:60px}.nk-settings-nav .label,.nk-settings-nav .nk-section-label,.nk-settings-user .u-text{display:none}.nk-settings-content{padding:24px}.nk-cmdk-backdrop{padding-top:max(6vh,env(safe-area-inset-top,0px))}.nk-cmdk{width:min(560px,96vw)}.nk-stats{flex-wrap:wrap}.nk-breadcrumb{min-width:0}.nk-breadcrumb>.crumb:not(:last-child),.nk-breadcrumb ::slotted(.crumb:not(:last-child)),.nk-breadcrumb>.sep,.nk-breadcrumb ::slotted(.sep),.nk-topbar-meta,.nk-topbar-actions ::slotted(.nk-topbar-meta){display:none}.nk-breadcrumb>.crumb:last-child,.nk-breadcrumb ::slotted(.crumb:last-child){display:block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-topbar-actions{flex-shrink:0}.nk-field{flex-wrap:wrap;row-gap:6px}.nk-field .f-control,.nk-field ::slotted(.f-control){max-width:100%;min-width:0}.nk-input,.nk-select,.nk-textarea,.nk-slider{max-width:100%}.nk-prop{flex-direction:column;align-items:stretch}.nk-prop .p-name{flex:none;min-height:26px}.nk-prop .p-value{flex:none;min-height:30px;padding:3px 6px 7px}.nk-steps.horizontal .nk-step:not(.current)>:not(.st-mark){display:none}.nk-pop.sheet{position:fixed!important;inset:auto 0 0!important;width:auto!important;transform:none!important;z-index:106;--_nk-row: 40px;max-height:85dvh;overflow-y:auto;overscroll-behavior:contain;border-radius:14px 14px 0 0;padding:6px max(8px,env(safe-area-inset-right,0px)) max(12px,env(safe-area-inset-bottom,0px)) max(8px,env(safe-area-inset-left,0px));box-shadow:0 0 0 100vmax var(--nk-scrim-soft),var(--nk-shadow-menu)}.nk-pop.sheet:before{content:\\\"\\\";display:block;width:36px;height:4px;margin:4px auto 8px;border-radius:2px;background:var(--nk-border-strong)}.nk-pop.sheet.floating{translate:0 100%;transition:opacity .2s ease,translate .25s cubic-bezier(.2,.8,.2,1),visibility 0s linear .25s}.nk-pop.sheet.floating.open{translate:none;transition:opacity .2s ease,translate .25s cubic-bezier(.2,.8,.2,1),visibility 0s}.nk-pop.sheet,.nk-sheet{--_nk-cell: 44px}.nk-calendar-view .cv-day{min-height:64px;padding:2px 2px 4px}.nk-calendar-view .cv-item{padding:1px 4px;font-size:11px;line-height:16px}.nk-peek-backdrop{pointer-events:auto}.nk-peek-backdrop.open{background-color:var(--nk-scrim-soft)}@starting-style{.nk-peek-backdrop.open{background-color:transparent}}.nk-peek{--_nk-title: 28px;top:auto;left:0;width:auto;max-height:92dvh;border-radius:14px 14px 0 0;translate:0 100%}.nk-peek-backdrop.open .nk-peek{translate:none}@starting-style{.nk-peek-backdrop.open .nk-peek{translate:0 100%}}.nk-peek:before{content:\\\"\\\";flex:none;width:36px;height:4px;margin:10px auto 0;border-radius:2px;background:var(--nk-border-strong)}.nk-peek .pk-bar{height:40px;padding:0 max(8px,env(safe-area-inset-right,0px)) 0 max(8px,env(safe-area-inset-left,0px))}.nk-peek .pk-body{padding:0 max(20px,env(safe-area-inset-right,0px)) max(24px,env(safe-area-inset-bottom,0px)) max(20px,env(safe-area-inset-left,0px))}.nk-peek .pk-resize{display:none}.nk-banner{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:baseline}.nk-banner .b-action,.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){grid-column:1 / -1;justify-self:start;margin-left:0}.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){margin-left:0!important}.nk-app.peek-inset .nk-main{padding-right:0}.nk-dialog-backdrop{flex-direction:column;justify-content:flex-end;padding:max(24px,env(safe-area-inset-top,0px)) 0 0}.nk-dialog{width:100%;max-width:640px;border-radius:14px 14px 0 0;scale:none;translate:0 100%;padding:6px max(20px,env(safe-area-inset-right,0px)) max(16px,env(safe-area-inset-bottom,0px)) max(20px,env(safe-area-inset-left,0px));transition:translate .25s cubic-bezier(.2,.8,.2,1)}.nk-dialog.wide{width:100%}.nk-dialog-backdrop.open .nk-dialog{translate:none}@starting-style{.nk-dialog-backdrop.open .nk-dialog{translate:0 100%}}.nk-dialog:before{content:\\\"\\\";display:block;width:36px;height:4px;margin:4px auto 14px;border-radius:2px;background:var(--nk-border-strong)}.nk-dialog .dl-actions{flex-direction:column-reverse}:root:has(.nk-tab-bar:not([hidden])) .nk-toast{bottom:calc(var(--nk-tab-bar-height) + max(6px,env(safe-area-inset-bottom,0px)) + 6px)}:root:has(.nk-tab-bar.floating:not([hidden])) .nk-toast{bottom:calc(var(--nk-tab-bar-height) + 24px + env(safe-area-inset-bottom,0px))}}@media(prefers-reduced-motion:reduce){.nk-skeleton{animation:none;background:var(--nk-bg-callout)}[class*=nk-],[class*=nk-]:before,[class*=nk-]:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}\\n\";\n\nconst componentsCss = componentsHead + componentsTail;\nconst css = componentsHead + tokensCss + componentsTail;\n\nconst nkSheet = new CSSStyleSheet();\nnkSheet.replaceSync(css);\n\nconst tokensSheet = new CSSStyleSheet();\ntokensSheet.replaceSync(tokensCss);\n\nconst componentsSheet = new CSSStyleSheet();\ncomponentsSheet.replaceSync(componentsCss);\n\nexport { nkSheet, css, tokensSheet, tokensCss, componentsSheet, componentsCss };\n","// The texts the elements show and announce by themselves – button labels,\n// placeholders, accessible names – in English and German (NotionKit\n// Elements 1.17.0). The language is the element's own: the nearest `lang`\n// attribute, across shadow roots, else <html lang>; German for \"de…\",\n// English for anything else. setStrings() adds or replaces texts, for one\n// language or for all of them, and an attribute on the element wins over\n// every one of these.\nconst BUILT_IN = {\n en: {\n copy: 'Copy', copied: 'Copied', show: 'Show', hide: 'Hide',\n uploadImage: 'Upload image', changeImage: 'Change image', remove: 'Remove',\n close: 'Close', resize: 'Resize',\n today: 'Today', previousMonth: 'Previous month', nextMonth: 'Next month', clear: 'Clear', time: 'Time',\n filter: 'Filter', sort: 'Sort', addFilter: '+ Filter', removeFilter: 'Remove filter', search: 'Search …',\n closeSidebar: 'Close sidebar', newPage: '+ New page',\n commentPlaceholder: 'Comment …', send: 'Send', askPlaceholder: 'Ask something …',\n commandPlaceholder: 'Search or type a command …', emojiPlaceholder: 'Search…',\n toggleTheme: 'Toggle light / dark', synced: '⟳ synced',\n message: 'Message', breadcrumb: 'Breadcrumb', commandPalette: 'Command palette', comment: 'Comment',\n searchEmoji: 'Search emoji', settings: 'Settings', title: 'Title', changeIcon: 'Change icon',\n add: 'Add', more: 'More',\n },\n de: {\n copy: 'Kopieren', copied: 'Kopiert', show: 'Zeigen', hide: 'Verbergen',\n uploadImage: 'Bild hochladen', changeImage: 'Bild ändern', remove: 'Entfernen',\n close: 'Schließen', resize: 'Breite ändern',\n today: 'Heute', previousMonth: 'Voriger Monat', nextMonth: 'Nächster Monat', clear: 'Leeren', time: 'Uhrzeit',\n filter: 'Filter', sort: 'Sortieren', addFilter: '+ Filter', removeFilter: 'Filter entfernen', search: 'Suchen …',\n closeSidebar: 'Seitenleiste schließen', newPage: '+ Neue Seite',\n commentPlaceholder: 'Kommentieren …', send: 'Senden', askPlaceholder: 'Frag etwas …',\n commandPlaceholder: 'Suchen oder Befehl eingeben …', emojiPlaceholder: 'Suchen …',\n toggleTheme: 'Hell / Dunkel', synced: '⟳ synchronisiert',\n message: 'Nachricht', breadcrumb: 'Pfad', commandPalette: 'Befehlspalette', comment: 'Kommentar',\n searchEmoji: 'Emoji suchen', settings: 'Einstellungen', title: 'Titel', changeIcon: 'Symbol ändern',\n add: 'Hinzufügen', more: 'Mehr',\n },\n};\nconst custom = {};\nconst listeners = new Set();\n\n/**\n * Adds or replaces texts: setStrings({ copy: 'Copy link' }) for every\n * language, setStrings({ copy: 'Copier' }, 'fr') for one – a language of its\n * own too. The elements on the page take them at once.\n */\nexport function setStrings(strings, lang = '*') {\n const key = String(lang).toLowerCase().split('-')[0];\n custom[key] = { ...custom[key], ...strings };\n for (const fn of listeners) fn();\n}\n\n/** The keys and texts built in for a language ('en' or 'de'), for an app that fills in its own. */\nexport function builtInStrings(lang = 'en') {\n return { ...(BUILT_IN[String(lang).toLowerCase().split('-')[0]] || BUILT_IN.en) };\n}\n\n/** Called after every setStrings(); base.js hands the change on to the elements. */\nexport function onStringsChange(fn) { listeners.add(fn); }\n\n/** The language of `el`: its nearest lang attribute, across shadow roots, else the page's; the primary subtag. */\nexport function langOf(el) {\n for (let node = el; node; node = node.getRootNode?.().host) {\n const hit = node.closest?.('[lang]');\n if (hit) return hit.getAttribute('lang').toLowerCase().split('-')[0];\n }\n return (document.documentElement.lang || 'en').toLowerCase().split('-')[0];\n}\n\n/** The text `key` for `el`: its language's own set by setStrings(), then the one for every language, the built-in one, English. */\nexport function str(key, el) {\n const lang = langOf(el);\n return custom[lang]?.[key] ?? custom['*']?.[key] ?? BUILT_IN[lang]?.[key] ?? BUILT_IN.en[key] ?? key;\n}\n","// ============================================================\n// NotionKit Elements – base classes\n//\n// Every <nk-*> element is a thin shell around the markup notionkit.css already\n// styles. The shadow root adopts the *components* half of that stylesheet and\n// nothing else; the element ships no visual CSS of its own.\n// ============================================================\nimport { componentsSheet, tokensCss } from '@jungherz-de/notionkit/notionkit-styles.js';\nimport { onStringsChange, str as textFor } from './util/strings.js';\n\n// ── Design tokens ──\n// The shadow roots deliberately adopt componentsSheet only. The full sheet\n// would bring the :root / [data-theme] token blocks along, and those match the\n// .nk-wrapper below — every --nk-* token would then be re-declared inside each\n// shadow root, where a matching rule always beats an inherited value. A page's\n// own `:root { --nk-accent: … }` would never arrive.\n//\n// So the token defaults go on the document once, and every shadow root\n// inherits them like any other custom property. They sit in a cascade layer so\n// an ordinary (unlayered) brand stylesheet — and notionkit.css itself, if the\n// page loads it — wins over them, no matter the load order.\n\nconst TOKENS_INJECTED = '__nkDefaultTokensInjected';\n\nfunction injectDefaultTokens() {\n if (typeof document === 'undefined') return; // SSR / non-DOM\n if (globalThis[TOKENS_INJECTED]) return; // another bundle copy did it\n globalThis[TOKENS_INJECTED] = true;\n\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(`@layer notionkit-defaults { ${tokensCss} }`);\n // Append — never assign — so an app's own adopted sheets survive.\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n}\n\ninjectDefaultTokens();\n\n// ── Global theme sync ──\n// data-theme on <html> is the only source of truth. One MutationObserver\n// mirrors it onto every registered instance; no element sets a theme itself.\n\nconst instances = new Set();\n\nfunction getCurrentTheme() {\n return document.documentElement.getAttribute('data-theme') || 'light';\n}\n\nfunction syncAllThemes() {\n const theme = getCurrentTheme();\n for (const instance of instances) instance._syncTheme(theme);\n}\n\n// The built-in texts follow the language (1.17.0): setStrings() and a new\n// lang on <html> reach the elements already on the page, too.\nfunction syncAllStrings() {\n for (const instance of instances) instance.onStringsChanged();\n}\nonStringsChange(syncAllStrings);\n\nif (typeof window !== 'undefined' && typeof MutationObserver !== 'undefined') {\n new MutationObserver(records => {\n if (records.some(r => r.attributeName === 'data-theme')) syncAllThemes();\n if (records.some(r => r.attributeName === 'lang')) syncAllStrings();\n }).observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'lang']\n });\n}\n\n// ── Host stylesheets ──\n// Layout plumbing only: how the host box participates in the outer layout, and\n// that `hidden` keeps working. :host([hidden]) has a higher specificity than\n// :host, so it wins regardless of order. The wrapper is layout-transparent.\n// `flush` on any element drops the outer margin of its box (NotionKit\n// 1.16.0) – for a block in a flex column with a gap of its own; a whole\n// column does it for every block with --nk-block-space: 0.\n\nconst hostSheets = new Map();\n\nfunction hostSheetFor(display) {\n let sheet = hostSheets.get(display);\n if (!sheet) {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(`\n :host { display: ${display}; }\n :host([hidden]) { display: none; }\n :host([flush]) .nk-wrapper > * { margin-top: 0; margin-bottom: 0; }\n .nk-wrapper { display: contents; }\n `);\n hostSheets.set(display, sheet);\n }\n return sheet;\n}\n\n// ── Base class ──\n\nexport class NkElement extends HTMLElement {\n\n /**\n * How the host takes part in the outer layout. Default 'contents': the host\n * generates no box, so the inner .nk-* element sits in the parent's layout\n * exactly where the class markup would – a button stays inline, a sidebar\n * is a direct flex child of the app, a tree row and its children box are\n * siblings. That is what makes the pixel parity with the class markup hold.\n * Consequence: style the parent or the tokens, not the host; `hidden` on\n * the host still works. Override with 'block' / 'inline-block' only when a\n * host box is genuinely needed.\n */\n static get display() { return 'contents'; }\n\n /**\n * Optional CSSStyleSheet with component-specific host rules, adopted after\n * the shared sheets. Positioning and sizing of the host only — never colour,\n * spacing or typography; those belong to notionkit.css.\n */\n static get hostStyles() { return null; }\n\n /**\n * Opt in when the component *copies* light-DOM children into its shadow tree\n * (options, breadcrumb crumbs). A MutationObserver then calls\n * projectLightDom() again whenever those children change, so a framework\n * that swaps them keeps the rendered element in step. Components that merely\n * *slot* their children use `slotchange` instead.\n */\n static get observesLightDom() { return false; }\n\n /** What the light-DOM observer watches. Drop `subtree` for shallow copies. */\n static get lightDomObserverInit() {\n return { childList: true, subtree: true, characterData: true, attributes: true };\n }\n\n /**\n * 'named' (default) or 'manual'. Manual assignment lets a component route\n * light-DOM nodes itself – text nodes into a label slot, nested elements\n * into a children slot – so <nk-tree-item icon=\"🏠\">Home</nk-tree-item>\n * reads naturally. With 'manual' the component calls assignSlots() on\n * every childList change.\n */\n static get slotAssignment() { return 'named'; }\n\n static get observedAttributes() { return []; }\n\n constructor() {\n super();\n this._initialized = false;\n this._shadow = this.attachShadow({ mode: 'open', slotAssignment: this.constructor.slotAssignment });\n const sheets = [componentsSheet, hostSheetFor(this.constructor.display)];\n const extra = this.constructor.hostStyles;\n if (extra) sheets.push(extra);\n this._shadow.adoptedStyleSheets = sheets;\n }\n\n connectedCallback() {\n if (!this._initialized) {\n // A framework may have set properties on the instance before the\n // definition arrived (hybrids binds checked=\"${bool}\" as a property\n // while the element is still a plain HTMLElement). Such an own property\n // shadows the accessor on the prototype for good; re-apply it through\n // the setter so the attribute – and with it render() – sees the value.\n this._upgradeOwnProperties();\n this._initialized = true;\n\n // The wrapper mirrors data-theme from <html> so [data-theme]-keyed\n // component rules apply inside the root. Token *values* need no\n // mirroring — they inherit.\n this._wrapper = document.createElement('div');\n this._wrapper.className = 'nk-wrapper';\n this._wrapper.setAttribute('data-theme', getCurrentTheme());\n this._shadow.appendChild(this._wrapper);\n\n this.render();\n } else {\n this._wrapper.setAttribute('data-theme', getCurrentTheme());\n }\n\n // Everything below runs on every connect, not just the first. Moving an\n // element in the DOM disconnects and reconnects it, and disconnectedCallback\n // tears all of this down — without re-arming it here a moved element would\n // keep its markup but silently stop reacting.\n this.setupEvents();\n instances.add(this);\n\n if (this.constructor.observesLightDom) {\n this._lightDomObserver ??= new MutationObserver(records => this.projectLightDom(records));\n this._lightDomObserver.observe(this, this.constructor.lightDomObserverInit);\n }\n if (this.constructor.slotAssignment === 'manual') {\n this.assignSlots();\n this._slotObserver ??= new MutationObserver(() => this.assignSlots());\n this._slotObserver.observe(this, { childList: true });\n }\n }\n\n disconnectedCallback() {\n instances.delete(this);\n this._lightDomObserver?.disconnect();\n this._slotObserver?.disconnect();\n this.teardownEvents();\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (!this._initialized) return;\n if (oldValue === newValue) return;\n this.onAttributeChanged(name, oldValue, newValue);\n }\n\n _syncTheme(theme) {\n this._wrapper?.setAttribute('data-theme', theme);\n }\n\n /**\n * The text `key` in this element's language – its nearest lang attribute,\n * across shadow roots, else the page's: the one setStrings() gave, else the\n * built-in English or German one (1.17.0). A project's own element reads\n * its texts here too, after setStrings({ myKey: '…' }).\n */\n str(key) { return textFor(key, this); }\n\n /**\n * The texts may have changed: setStrings() ran or <html lang> changed.\n * Components with built-in texts apply them again here; an attribute on\n * the element still wins.\n */\n onStringsChanged() {}\n\n _upgradeOwnProperties() {\n for (const key of Object.keys(this)) {\n if (key.startsWith('_')) continue;\n let proto = Object.getPrototypeOf(this), desc;\n while (proto && proto !== HTMLElement.prototype && !(desc = Object.getOwnPropertyDescriptor(proto, key))) proto = Object.getPrototypeOf(proto);\n if (!desc?.set) continue;\n const value = this[key];\n delete this[key];\n this[key] = value;\n }\n }\n\n /** Subclasses override to build the inner DOM inside this._wrapper. Runs once. */\n render() {}\n\n /** Subclasses override to attach event listeners. Runs on every connect. */\n setupEvents() {}\n\n /** Subclasses override to remove event listeners. Runs on every disconnect. */\n teardownEvents() {}\n\n /** Subclasses override to react to attribute changes after render(). */\n onAttributeChanged(name, oldValue, newValue) {}\n\n /**\n * Subclasses that set observesLightDom override this to (re-)copy their\n * light-DOM children into the shadow tree. Runs on every change to those\n * children, so it has to be safe to call repeatedly.\n */\n projectLightDom() {}\n\n /** Components with manual slot assignment override this. */\n assignSlots() {}\n\n /**\n * Escape hatch: re-copy the light-DOM children now. The observer covers the\n * ordinary cases; this is for the ones it cannot see, so nobody has to reach\n * into element.shadowRoot.\n */\n refresh() { this.projectLightDom(); if (this.constructor.slotAssignment === 'manual') this.assignSlots(); }\n\n // ── Utilities ──\n\n /**\n * For elements whose heading arrives as `title` – nk-settings-pane,\n * nk-danger-zone, nk-empty, nk-model-card. `title` is also the global HTML\n * attribute, and a title on the host shows as a browser tooltip over the\n * whole element. So the value is read into this._titleText and the\n * attribute is taken off the host; a later setAttribute('title') arrives\n * through attributeChangedCallback and is taken the same way. The removal\n * fires the callback with null, which is ignored – only '' clears the\n * heading. The element's own `title` accessor answers from the stored\n * value, so a framework that binds `title` as a property never puts an\n * attribute on the host at all. Returns whether a value was taken.\n */\n takeTitle(value = this.getAttribute('title')) {\n if (value === null) return false;\n this._titleText = value;\n this.removeAttribute('title');\n return true;\n }\n\n getBoolAttr(name) {\n return this.hasAttribute(name);\n }\n\n setBoolAttr(name, value) {\n if (value) this.setAttribute(name, '');\n else this.removeAttribute(name);\n }\n\n createElement(tag, classes = [], attrs = {}) {\n const el = document.createElement(tag);\n if (classes.length) el.classList.add(...classes);\n for (const [key, val] of Object.entries(attrs)) {\n if (val !== null && val !== undefined && val !== false) el.setAttribute(key, val === true ? '' : val);\n }\n return el;\n }\n\n /** Dispatches a composed, bubbling CustomEvent — the nk-* event contract. */\n emit(eventName, detail = null) {\n return this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail\n }));\n }\n}\n\n// ── Form-associated base class ──\n// ElementInternals gives the element a place in the surrounding <form>:\n// FormData, reset, validation and :disabled through <fieldset>.\n\nexport class NkFormElement extends NkElement {\n\n static formAssociated = true;\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n }\n\n get form() { return this._internals.form; }\n get validationMessage() { return this._internals.validationMessage; }\n get validity() { return this._internals.validity; }\n get willValidate() { return this._internals.willValidate; }\n\n checkValidity() { return this._internals.checkValidity(); }\n reportValidity() { return this._internals.reportValidity(); }\n\n connectedCallback() {\n const first = !this._initialized;\n super.connectedCallback();\n // A `disabled` attribute in the markup fires formDisabledCallback on\n // parse or upgrade – before the first connect, when nothing is rendered\n // yet. The state was remembered below; apply it now that render() ran.\n if (first && this._formDisabled) this.onFormDisabled(true);\n }\n\n formResetCallback() { this.resetValue(); }\n formStateRestoreCallback(state, mode) { this.restoreValue(state, mode); }\n formDisabledCallback(disabled) {\n this._formDisabled = disabled;\n if (this._initialized) this.onFormDisabled(disabled);\n }\n\n /** Subclasses override. */\n resetValue() {}\n restoreValue(state, mode) {}\n onFormDisabled(disabled) {}\n\n setFormValue(value, state) {\n this._internals.setFormValue(value, state);\n }\n\n setValidity(flags, message, anchor) {\n this._internals.setValidity(flags, message, anchor);\n }\n\n /** Mirrors the native control's validity onto the host, so required works. */\n syncValidityFrom(control) {\n if (!control) return;\n if (control.validity.valid) this._internals.setValidity({});\n else this._internals.setValidity(control.validity, control.validationMessage, control);\n }\n}\n\nexport { getCurrentTheme };\n\n// For projects that import single elements (components/nk-*.js): the one\n// dictionary every element reads its built-in texts from.\nexport { setStrings, builtInStrings } from './util/strings.js';\n","import { NkElement } from '../../base.js';\n\n// <nk-btn variant=\"primary\" small>Save</nk-btn> → <button class=\"nk-btn primary small\">\n// <nk-btn href=\"/docs\" variant=\"secondary\">Docs</nk-btn> → <a class=\"nk-btn secondary\">\n// <nk-btn variant=\"topbar\">⭐</nk-btn> → <button class=\"nk-topbar-btn\">\n// <nk-btn variant=\"tool\" active>Filter</nk-btn> → <button class=\"nk-db-tool active\"> (slot=\"tools\" of nk-database)\n// <nk-btn variant=\"sidebar\" aria-label=\"Menu\">☰</nk-btn> → <button class=\"nk-topbar-btn nk-sidebar-toggle\">:\n// on a phone it opens the page's <nk-sidebar> as a drawer; on the desktop\n// it shows while that sidebar is collapsed (.collapsed) and expands it.\n//\n// Modifier classes become attributes. A slotted <svg> is sized by the\n// `.nk-btn ::slotted(svg)` twin; pass the icon itself, never wrapped.\nconst VARIANTS = ['primary', 'secondary', 'danger', 'danger-solid', 'topbar', 'share'];\n\nclass NkBtn extends NkElement {\n static get observedAttributes() { return ['variant', 'small', 'disabled', 'type', 'href', 'title', 'aria-label', 'aria-haspopup', 'active']; }\n\n render() {\n this._build();\n }\n\n _build() {\n const href = this.getAttribute('href');\n const el = href ? this.createElement('a', [], { href }) : this.createElement('button', [], { type: this.getAttribute('type') || 'button' });\n el.className = this._computeClasses().join(' ');\n el.appendChild(document.createElement('slot'));\n this._applyState(el);\n if (this._btn) {\n this._btn.removeEventListener('click', this._onClick);\n this._btn.replaceWith(el);\n } else {\n this._wrapper.appendChild(el);\n }\n this._btn = el;\n if (this._onClick) el.addEventListener('click', this._onClick);\n }\n\n _applyState(el) {\n const disabled = this.getBoolAttr('disabled');\n if (el.tagName === 'BUTTON') el.disabled = disabled;\n else el.setAttribute('aria-disabled', disabled ? 'true' : 'false');\n const title = this.getAttribute('title');\n title ? el.setAttribute('title', title) : el.removeAttribute('title');\n // The accessible name and the popup hint belong on the button itself.\n for (const name of ['aria-label', 'aria-haspopup']) {\n const v = this.getAttribute(name);\n v ? el.setAttribute(name, v) : el.removeAttribute(name);\n }\n if (this.getAttribute('variant') === 'sidebar') el.setAttribute('aria-expanded', this._sidebar()?.open ? 'true' : 'false');\n else el.removeAttribute('aria-expanded');\n }\n\n /** The sidebar the ☰ opens: the one in its own app, else the page's. */\n _sidebar() { return this.closest('nk-app')?.querySelector('nk-sidebar') ?? document.querySelector('nk-sidebar'); }\n _sidebarCollapsed() { return this.getAttribute('variant') === 'sidebar' && !!this._sidebar()?.hasAttribute('collapsed'); }\n\n setupEvents() {\n this._onClick = (e) => {\n if (this.getBoolAttr('disabled')) { e.preventDefault(); e.stopPropagation(); return; }\n if (this.getAttribute('variant') === 'sidebar') {\n const sidebar = this._sidebar();\n if (sidebar?.hasAttribute('collapsed') && !matchMedia('(max-width: 860px)').matches) sidebar.expand?.();\n else sidebar?.toggle?.();\n return;\n }\n // A button inside a shadow root is not a submit button of the outer\n // form; forward the intent to the form the host sits in.\n const type = this.getAttribute('type');\n if (type === 'submit' || type === 'reset') {\n const form = this.closest('form');\n if (form) type === 'submit' ? form.requestSubmit() : form.reset();\n }\n };\n // The ☰ says whether its drawer is open, however the drawer closed.\n this._onToggle = (e) => {\n if (this.getAttribute('variant') === 'sidebar' && e.target === this._sidebar()) this._btn.setAttribute('aria-expanded', e.detail.open ? 'true' : 'false');\n };\n // On the desktop the ☰ shows while its sidebar is collapsed.\n this._onCollapse = (e) => {\n if (this.getAttribute('variant') === 'sidebar' && e.target === this._sidebar()) this._btn.classList.toggle('collapsed', e.detail.collapsed);\n };\n this._btn.addEventListener('click', this._onClick);\n document.addEventListener('nk-toggle', this._onToggle);\n document.addEventListener('nk-collapse', this._onCollapse);\n if (this.getAttribute('variant') === 'sidebar') this._btn.className = this._computeClasses().join(' ');\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n document.removeEventListener('nk-toggle', this._onToggle);\n document.removeEventListener('nk-collapse', this._onCollapse);\n }\n\n onAttributeChanged(name) {\n if (!this._btn) return;\n switch (name) {\n case 'href':\n this._build();\n break;\n case 'variant':\n this._btn.className = this._computeClasses().join(' ');\n this._applyState(this._btn);\n break;\n case 'small':\n case 'active':\n this._btn.className = this._computeClasses().join(' ');\n break;\n case 'type':\n if (this._btn.tagName === 'BUTTON') this._btn.setAttribute('type', this.getAttribute('type') || 'button');\n break;\n default:\n this._applyState(this._btn);\n }\n }\n\n _computeClasses() {\n const variant = this.getAttribute('variant');\n if (variant === 'topbar') return ['nk-topbar-btn'];\n if (variant === 'share') return ['nk-topbar-btn', 'nk-share-btn'];\n if (variant === 'sidebar') return this._sidebarCollapsed() ? ['nk-topbar-btn', 'nk-sidebar-toggle', 'collapsed'] : ['nk-topbar-btn', 'nk-sidebar-toggle'];\n if (variant === 'tool') return this.getBoolAttr('active') ? ['nk-db-tool', 'active'] : ['nk-db-tool'];\n const classes = ['nk-btn'];\n if (VARIANTS.includes(variant)) classes.push(variant);\n if (this.getBoolAttr('small')) classes.push('small');\n return classes;\n }\n\n focus(options) { this._btn?.focus(options); }\n click() { this._btn?.click(); }\n\n get variant() { return this.getAttribute('variant'); }\n set variant(v) { v ? this.setAttribute('variant', v) : this.removeAttribute('variant'); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n get small() { return this.getBoolAttr('small'); }\n set small(v) { this.setBoolAttr('small', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get type() { return this.getAttribute('type') || 'button'; }\n set type(v) { this.setAttribute('type', v); }\n get href() { return this.getAttribute('href'); }\n set href(v) { v ? this.setAttribute('href', v) : this.removeAttribute('href'); }\n}\n\ncustomElements.define('nk-btn', NkBtn);\nexport { NkBtn };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-input name=\"title\" value=\"…\" placeholder=\"…\" wide></nk-input> → <input class=\"nk-input wide\">\n// Takes part in the surrounding <form> through ElementInternals.\nconst FORWARDED = ['type', 'placeholder', 'name', 'min', 'max', 'step', 'autocomplete', 'pattern', 'maxlength', 'minlength', 'inputmode', 'list', 'aria-label'];\nconst BOOLEANS = ['required', 'disabled', 'readonly'];\n\nclass NkInput extends NkFormElement {\n static get observedAttributes() { return ['value', 'wide', ...FORWARDED, ...BOOLEANS]; }\n\n render() {\n this._input = this.createElement('input', ['nk-input']);\n for (const attr of FORWARDED) this._forward(attr);\n for (const attr of BOOLEANS) this._forward(attr);\n this._input.value = this.getAttribute('value') ?? '';\n this._defaultValue = this._input.value;\n this._syncWide();\n this._wrapper.appendChild(this._input);\n this._syncFormValue();\n }\n\n _forward(attr) {\n if (BOOLEANS.includes(attr)) {\n this._input[attr === 'readonly' ? 'readOnly' : attr] = this.getBoolAttr(attr) || (attr === 'disabled' && !!this._formDisabled);\n return;\n }\n const v = this.getAttribute(attr);\n if (v === null) this._input.removeAttribute(attr);\n else this._input.setAttribute(attr, v);\n }\n\n _syncWide() {\n this._input.classList.toggle('wide', this.getBoolAttr('wide'));\n }\n\n setupEvents() {\n this._onInput = () => {\n this._syncFormValue();\n this.emit('nk-input', { value: this._input.value, name: this.name });\n };\n this._onChange = () => {\n this._syncFormValue();\n this.emit('nk-change', { value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._input) return;\n if (name === 'value') { this._input.value = this.getAttribute('value') ?? ''; this._syncFormValue(); return; }\n if (name === 'wide') { this._syncWide(); return; }\n this._forward(name);\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.value);\n this.syncValidityFrom(this._input);\n }\n\n resetValue() {\n this._input.value = this.getAttribute('value') ?? '';\n this._syncFormValue();\n }\n\n restoreValue(state) {\n if (typeof state === 'string') { this._input.value = state; this._syncFormValue(); }\n }\n\n onFormDisabled(disabled) {\n this._input.disabled = disabled || this.getBoolAttr('disabled');\n }\n\n focus(options) { this._input?.focus(options); }\n blur() { this._input?.blur(); }\n select() { this._input?.select(); }\n\n get value() { return this._input?.value ?? (this.getAttribute('value') ?? ''); }\n set value(v) {\n if (this._input) { this._input.value = v ?? ''; this._syncFormValue(); }\n else this.setAttribute('value', v ?? '');\n }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get type() { return this.getAttribute('type') || 'text'; }\n set type(v) { this.setAttribute('type', v); }\n get placeholder() { return this.getAttribute('placeholder'); }\n set placeholder(v) { this.setAttribute('placeholder', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get required() { return this.getBoolAttr('required'); }\n set required(v) { this.setBoolAttr('required', v); }\n get readonly() { return this.getBoolAttr('readonly'); }\n set readonly(v) { this.setBoolAttr('readonly', v); }\n get wide() { return this.getBoolAttr('wide'); }\n set wide(v) { this.setBoolAttr('wide', v); }\n}\n\ncustomElements.define('nk-input', NkInput);\nexport { NkInput };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-textarea name=\"bio\" rows=\"3\" wide>Text</nk-textarea> → <textarea class=\"nk-textarea wide\">\n// The initial value is the `value` attribute, or the element's text content.\nconst FORWARDED = ['placeholder', 'name', 'rows', 'maxlength', 'minlength', 'autocomplete', 'aria-label'];\nconst BOOLEANS = ['required', 'disabled', 'readonly'];\n\nclass NkTextarea extends NkFormElement {\n static get observedAttributes() { return ['value', 'wide', ...FORWARDED, ...BOOLEANS]; }\n\n render() {\n this._input = this.createElement('textarea', ['nk-textarea']);\n for (const attr of [...FORWARDED, ...BOOLEANS]) this._forward(attr);\n this._input.value = this.getAttribute('value') ?? this.textContent.trim();\n this._syncWide();\n this._wrapper.appendChild(this._input);\n this._syncFormValue();\n }\n\n _forward(attr) {\n if (BOOLEANS.includes(attr)) {\n this._input[attr === 'readonly' ? 'readOnly' : attr] = this.getBoolAttr(attr) || (attr === 'disabled' && !!this._formDisabled);\n return;\n }\n const v = this.getAttribute(attr);\n if (v === null) this._input.removeAttribute(attr);\n else this._input.setAttribute(attr, v);\n }\n\n _syncWide() { this._input.classList.toggle('wide', this.getBoolAttr('wide')); }\n\n setupEvents() {\n this._onInput = () => {\n this._syncFormValue();\n this.emit('nk-input', { value: this._input.value, name: this.name });\n };\n this._onChange = () => {\n this._syncFormValue();\n this.emit('nk-change', { value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._input) return;\n if (name === 'value') { this._input.value = this.getAttribute('value') ?? ''; this._syncFormValue(); return; }\n if (name === 'wide') { this._syncWide(); return; }\n this._forward(name);\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.value);\n this.syncValidityFrom(this._input);\n }\n\n resetValue() {\n this._input.value = this.getAttribute('value') ?? this.textContent.trim();\n this._syncFormValue();\n }\n\n restoreValue(state) {\n if (typeof state === 'string') { this._input.value = state; this._syncFormValue(); }\n }\n\n onFormDisabled(disabled) { this._input.disabled = disabled || this.getBoolAttr('disabled'); }\n\n focus(options) { this._input?.focus(options); }\n blur() { this._input?.blur(); }\n\n get value() { return this._input?.value ?? (this.getAttribute('value') ?? ''); }\n set value(v) {\n if (this._input) { this._input.value = v ?? ''; this._syncFormValue(); }\n else this.setAttribute('value', v ?? '');\n }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get required() { return this.getBoolAttr('required'); }\n set required(v) { this.setBoolAttr('required', v); }\n get wide() { return this.getBoolAttr('wide'); }\n set wide(v) { this.setBoolAttr('wide', v); }\n}\n\ncustomElements.define('nk-textarea', NkTextarea);\nexport { NkTextarea };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-select name=\"role\" value=\"editor\">\n// <option value=\"viewer\">Viewer</option>\n// <option value=\"editor\">Editor</option>\n// </nk-select>\n//\n// The light-DOM <option>s are copied into the shadow <select>. A\n// MutationObserver keeps the copy in step when a framework swaps them; the\n// empty string is a valid value; the live selection survives a rebuild. A\n// value – attribute or property – whose option is not there yet waits and\n// wins over the browser's preselection once the option arrives, unless\n// someone has chosen another option in the meantime; settling on it fires\n// no nk-change.\nclass NkSelect extends NkFormElement {\n static get observedAttributes() { return ['value', 'name', 'disabled', 'required', 'compact', 'wide', 'aria-label']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._select = this.createElement('select', ['nk-select']);\n this._forwardAll();\n this._wrapper.appendChild(this._select);\n this._defaultValue = this.getAttribute('value');\n this._pending = this._defaultValue;\n // Children may not be parsed yet when connectedCallback runs.\n this.projectLightDom();\n requestAnimationFrame(() => this.projectLightDom());\n }\n\n _forwardAll() {\n const name = this.getAttribute('name');\n name ? this._select.setAttribute('name', name) : this._select.removeAttribute('name');\n const label = this.getAttribute('aria-label');\n label ? this._select.setAttribute('aria-label', label) : this._select.removeAttribute('aria-label');\n this._select.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._select.required = this.getBoolAttr('required');\n this._select.classList.toggle('compact', this.getBoolAttr('compact'));\n this._select.classList.toggle('wide', this.getBoolAttr('wide'));\n }\n\n projectLightDom() {\n if (!this._select) return;\n // The options are pure data — the clones carry no listeners — so skipping\n // an unchanged rebuild is safe, and it keeps an open dropdown from\n // snapping shut on light-DOM churn elsewhere.\n const nodes = [...this.children].filter(n => n.matches('option, optgroup'));\n const signature = nodes.map(n => n.outerHTML).join('');\n if (signature === this._optionSignature) return;\n this._optionSignature = signature;\n\n // innerHTML = '' drops the selection; remember it first. selectedIndex -1\n // means \"nothing selected\", which is not an option whose value is \"\".\n const previous = this._select.selectedIndex >= 0 ? this._select.value : null;\n\n this._select.innerHTML = '';\n for (const node of nodes) this._select.appendChild(node.cloneNode(true));\n\n // A value that waits for its option first – it keeps waiting while the\n // option is missing; else the live selection when it survived; else the\n // browser default (first option / `selected`).\n if (this._pending != null) { if (this._applyValue(this._pending)) this._pending = null; }\n else this._applyValue(previous);\n this._syncFormValue();\n }\n\n /** Selects `value` if an option carries it, and reports whether it did. */\n _applyValue(value) {\n if (value === null) return false;\n if (![...this._select.options].some(o => o.value === value)) return false;\n this._select.value = value;\n return true;\n }\n\n setupEvents() {\n this._onChange = () => {\n this._pending = null;\n this._syncFormValue();\n this.emit('nk-change', { value: this._select.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._select.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._select?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._select) return;\n if (name === 'value') {\n const value = this.getAttribute('value');\n this._pending = value === null || this._applyValue(value) ? null : value;\n this._syncFormValue();\n return;\n }\n this._forwardAll();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._select.value);\n this.syncValidityFrom(this._select);\n }\n\n resetValue() {\n this._pending = null;\n if (!this._applyValue(this._defaultValue)) this._select.selectedIndex = 0;\n this._syncFormValue();\n }\n\n restoreValue(state) {\n if (typeof state === 'string') { this._applyValue(state); this._syncFormValue(); }\n }\n\n onFormDisabled(disabled) { this._select.disabled = disabled || this.getBoolAttr('disabled'); }\n\n focus(options) { this._select?.focus(options); }\n\n get value() { return this._pending ?? this._select?.value ?? ''; }\n set value(v) {\n const value = v == null ? '' : String(v);\n if (!this._select) { this.setAttribute('value', value); return; }\n // No option carries it yet: keep it until one does.\n this._pending = this._applyValue(value) ? null : value;\n this._syncFormValue();\n }\n get selectedIndex() { return this._select?.selectedIndex ?? -1; }\n get options() { return this._select?.options ?? []; }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get required() { return this.getBoolAttr('required'); }\n set required(v) { this.setBoolAttr('required', v); }\n get compact() { return this.getBoolAttr('compact'); }\n set compact(v) { this.setBoolAttr('compact', v); }\n get wide() { return this.getBoolAttr('wide'); }\n set wide(v) { this.setBoolAttr('wide', v); }\n}\n\ncustomElements.define('nk-select', NkSelect);\nexport { NkSelect };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-switch name=\"notify\" checked></nk-switch>\n// → <button class=\"nk-switch\" role=\"switch\" aria-checked=\"true\">\n// notionkit.css styles the state through [aria-checked]; the toggling is here.\n//\n// <nk-switch checked>Waiting</nk-switch> (or text=\"Waiting\")\n// → <label class=\"nk-switch-label\"><button class=\"nk-switch\" …></button><span>Waiting</span></label>\n// Visible text beside the switch, for several switches in one row where no\n// nk-field row names them. Without text the label wrapper is layout-\n// transparent (display: contents), so the bare button stays the bare button.\nclass NkSwitch extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value', 'label', 'text']; }\n\n render() {\n this._row = this.createElement('label', ['nk-switch-label']);\n this._btn = this.createElement('button', ['nk-switch'], { type: 'button', role: 'switch' });\n this._text = document.createElement('span');\n this._slot = document.createElement('slot');\n this._textNode = document.createTextNode('');\n this._slot.appendChild(this._textNode);\n this._text.appendChild(this._slot);\n this._row.append(this._btn, this._text);\n this._defaultChecked = this.getBoolAttr('checked');\n this._apply();\n this._syncText();\n this._wrapper.appendChild(this._row);\n this._syncFormValue();\n }\n\n _apply() {\n this._btn.setAttribute('aria-checked', this.getBoolAttr('checked') ? 'true' : 'false');\n this._btn.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n const label = this.getAttribute('label');\n label ? this._btn.setAttribute('aria-label', label) : this._btn.removeAttribute('aria-label');\n }\n\n _syncText() {\n // Only on a change: WebKit fires slotchange for a write to the slot's\n // fallback text, even the same text, and this runs on slotchange – an\n // endless loop that froze Safari with an empty <nk-switch>.\n const text = this.getAttribute('text') ?? '';\n if (this._textNode.data !== text) this._textNode.data = text;\n const hasText = !!(this.getAttribute('text') || this._slot.assignedNodes().some(n => n.nodeType === Node.ELEMENT_NODE || n.data.trim()));\n this._text.hidden = !hasText;\n this._row.style.display = hasText ? '' : 'contents';\n }\n\n setupEvents() {\n this._onClick = () => this.toggle();\n this._onSlot = () => this._syncText();\n this._btn.addEventListener('click', this._onClick);\n this._slot.addEventListener('slotchange', this._onSlot);\n this._syncText();\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n toggle() {\n if (this.getBoolAttr('disabled') || this._formDisabled) return;\n this.checked = !this.checked;\n this.emit('nk-change', { checked: this.checked, value: this.getAttribute('value') || 'on', name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n onAttributeChanged(name) {\n if (!this._btn) return;\n if (name === 'text') { this._syncText(); return; }\n this._apply();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n const val = this.getAttribute('value') || 'on';\n this.setFormValue(this.getBoolAttr('checked') ? val : null, this.getBoolAttr('checked') ? 'checked' : 'unchecked');\n }\n\n resetValue() { this.setBoolAttr('checked', this._defaultChecked); }\n restoreValue(state) { if (state === 'checked' || state === 'unchecked') this.setBoolAttr('checked', state === 'checked'); }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n focus(options) { this._btn?.focus(options); }\n\n get checked() { return this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n get text() { return this.getAttribute('text'); }\n set text(v) { v == null ? this.removeAttribute('text') : this.setAttribute('text', v); }\n}\n\ncustomElements.define('nk-switch', NkSwitch);\nexport { NkSwitch };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-check name=\"mail\" value=\"weekly\" checked>Weekly digest</nk-check>\n// → <label class=\"nk-check\"><input type=\"checkbox\"> Weekly digest</label>\nclass NkCheck extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value', 'text', 'indeterminate', 'required']; }\n\n render() {\n const label = this.createElement('label', ['nk-check']);\n this._input = this.createElement('input', [], { type: 'checkbox' });\n const slot = document.createElement('slot');\n this._text = document.createTextNode('');\n slot.appendChild(this._text);\n this._apply();\n this._defaultChecked = this.getBoolAttr('checked');\n label.appendChild(this._input);\n label.appendChild(slot);\n this._wrapper.appendChild(label);\n this._syncFormValue();\n }\n\n _apply() {\n this._input.checked = this.getBoolAttr('checked');\n this._input.indeterminate = this.getBoolAttr('indeterminate');\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._input.required = this.getBoolAttr('required');\n const name = this.getAttribute('name');\n name ? this._input.setAttribute('name', name) : this._input.removeAttribute('name');\n this._input.value = this.getAttribute('value') || 'on';\n if (this._text) this._text.data = this.getAttribute('text') ?? '';\n }\n\n setupEvents() {\n this._onChange = () => {\n this._syncing = true;\n this.setBoolAttr('checked', this._input.checked);\n this.removeAttribute('indeterminate');\n this._syncing = false;\n this._syncFormValue();\n this.emit('nk-change', { checked: this._input.checked, value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged() {\n if (this._syncing || !this._input) return;\n this._apply();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.checked ? this._input.value : null, this._input.checked ? 'checked' : 'unchecked');\n this.syncValidityFrom(this._input);\n }\n\n resetValue() { this.setBoolAttr('checked', this._defaultChecked); }\n restoreValue(state) { if (state === 'checked' || state === 'unchecked') this.setBoolAttr('checked', state === 'checked'); }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n focus(options) { this._input?.focus(options); }\n\n get checked() { return this._input?.checked ?? this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get indeterminate() { return this.getBoolAttr('indeterminate'); }\n set indeterminate(v) { this.setBoolAttr('indeterminate', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get text() { return this.getAttribute('text'); }\n set text(v) { v == null ? this.removeAttribute('text') : this.setAttribute('text', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-check', NkCheck);\nexport { NkCheck };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-radio name=\"style\" value=\"concise\" checked>Concise</nk-radio>\n// → <label class=\"nk-check\"><input type=\"radio\"> Concise</label>\n//\n// ── Grouping ──\n// Every <nk-radio> keeps its <input type=\"radio\"> in its own shadow root, and\n// native radio grouping works per tree — it does not reach across shadow\n// boundaries. Two <nk-radio name=\"x\"> would therefore both stay checked. So\n// the group is kept here, following the native definition: same `name`,\n// same containing tree, same form owner. One tab stop per group, arrow keys\n// move within it (wrapping, skipping disabled), and select as they go.\n\nconst ARROW_KEYS = { ArrowDown: 1, ArrowRight: 1, ArrowUp: -1, ArrowLeft: -1 };\n\n/** Form owner, also for a peer that has not been upgraded yet. */\nfunction ownerForm(el) {\n return (el.form !== undefined ? el.form : el.closest('form')) ?? null;\n}\n\n/** Only the selected radio is a tab stop; arrow keys move within the group. */\nfunction syncGroupTabIndex(group) {\n const enabled = group.filter(el => !el.disabled);\n if (!enabled.length) return;\n const focusable = enabled.find(el => el.checked) || enabled[0];\n for (const el of group) {\n if (el._input) el._input.tabIndex = el === focusable ? 0 : -1;\n }\n}\n\nclass NkRadio extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value', 'text', 'required']; }\n\n render() {\n const label = this.createElement('label', ['nk-check']);\n this._input = this.createElement('input', [], { type: 'radio' });\n const slot = document.createElement('slot');\n this._text = document.createTextNode('');\n slot.appendChild(this._text);\n // `name` on the inner input is inert (it is alone in its tree); it stays\n // as a devtools courtesy. The group above is the real one.\n this._apply();\n this._defaultChecked = this.getBoolAttr('checked');\n label.appendChild(this._input);\n label.appendChild(slot);\n this._wrapper.appendChild(label);\n this._syncFormValue();\n // Elements upgrade in document order, so the last `checked` one in the\n // markup wins the group — the same outcome native radios produce.\n if (this._input.checked) this._uncheckPeers();\n syncGroupTabIndex(this._group());\n }\n\n _apply() {\n this._input.checked = this.getBoolAttr('checked');\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._input.required = this.getBoolAttr('required');\n const name = this.getAttribute('name');\n name ? this._input.setAttribute('name', name) : this._input.removeAttribute('name');\n this._input.value = this.getAttribute('value') || '';\n if (this._text) this._text.data = this.getAttribute('text') ?? '';\n }\n\n setupEvents() {\n this._onChange = () => this._applyChange();\n this._onKeyDown = (e) => {\n const dir = ARROW_KEYS[e.key];\n if (!dir || e.ctrlKey || e.metaKey || e.altKey) return;\n const group = this._group().filter(el => !el.disabled);\n if (group.length < 2) return;\n e.preventDefault();\n const next = group[(group.indexOf(this) + dir + group.length) % group.length];\n next._input.focus();\n next._input.checked = true;\n next._applyChange();\n };\n this._input.addEventListener('change', this._onChange);\n this._input.addEventListener('keydown', this._onKeyDown);\n syncGroupTabIndex(this._group());\n }\n\n teardownEvents() {\n this._input?.removeEventListener('change', this._onChange);\n this._input?.removeEventListener('keydown', this._onKeyDown);\n }\n\n /** Shared by user change and arrow-key selection, so both look identical. */\n _applyChange() {\n if (this._input.checked) this._uncheckPeers();\n this._syncing = true;\n this.setBoolAttr('checked', this._input.checked);\n this._syncing = false;\n this._syncFormValue();\n syncGroupTabIndex(this._group());\n this.emit('nk-change', { checked: this._input.checked, value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n /** Same name, same tree, same form owner — in document order, this element included. */\n _group() {\n const name = this.getAttribute('name');\n const root = this.getRootNode();\n if (!name || typeof root?.querySelectorAll !== 'function') return [this];\n const form = ownerForm(this);\n return [...root.querySelectorAll('nk-radio')].filter(\n el => el.getAttribute('name') === name && ownerForm(el) === form\n );\n }\n\n _uncheckPeers() {\n for (const el of this._group()) {\n if (el !== this && el.checked) el.checked = false;\n }\n }\n\n onAttributeChanged(name) {\n if (this._syncing || !this._input) return;\n this._apply();\n if (name === 'checked' && this._input.checked) this._uncheckPeers();\n this._syncFormValue();\n syncGroupTabIndex(this._group());\n }\n\n _syncFormValue() {\n const val = this.getAttribute('value') || '';\n this.setFormValue(this._input.checked ? val : null, this._input.checked ? 'checked' : 'unchecked');\n this.syncValidityFrom(this._input);\n }\n\n resetValue() {\n this._input.checked = this._defaultChecked;\n this.setBoolAttr('checked', this._defaultChecked);\n this._syncFormValue();\n syncGroupTabIndex(this._group());\n }\n\n restoreValue(state) {\n if (state === 'checked') this.checked = true;\n }\n\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); syncGroupTabIndex(this._group()); }\n\n focus(options) { this._input?.focus(options); }\n\n get checked() { return this._input?.checked ?? this.getBoolAttr('checked'); }\n set checked(v) {\n if (this._input) this._input.checked = v;\n // Also covers the case where the attribute is already present, so\n // setBoolAttr stays silent and onAttributeChanged never runs.\n if (v) this._uncheckPeers();\n this.setBoolAttr('checked', v);\n if (this._input) { this._syncFormValue(); syncGroupTabIndex(this._group()); }\n }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get text() { return this.getAttribute('text'); }\n set text(v) { v == null ? this.removeAttribute('text') : this.setAttribute('text', v); }\n get value() { return this.getAttribute('value') || ''; }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-radio', NkRadio);\nexport { NkRadio };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-slider name=\"size\" min=\"12\" max=\"18\" value=\"14\" show-value></nk-slider>\n// → <input type=\"range\" class=\"nk-slider\"> <div class=\"nk-slider-value\">14</div>\nconst FORWARDED = ['name', 'min', 'max', 'step', 'aria-label'];\n\nclass NkSlider extends NkFormElement {\n static get observedAttributes() { return ['value', 'disabled', 'show-value', 'unit', ...FORWARDED]; }\n\n render() {\n this._input = this.createElement('input', ['nk-slider'], { type: 'range' });\n this._out = this.createElement('div', ['nk-slider-value']);\n this._apply();\n this._input.value = this.getAttribute('value') ?? this._input.value;\n this._defaultValue = this._input.value;\n this._wrapper.appendChild(this._input);\n this._wrapper.appendChild(this._out);\n this._syncOut();\n this._syncFormValue();\n }\n\n _apply() {\n for (const attr of FORWARDED) {\n const v = this.getAttribute(attr);\n v === null ? this._input.removeAttribute(attr) : this._input.setAttribute(attr, v);\n }\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._out.style.display = this.getBoolAttr('show-value') ? '' : 'none';\n }\n\n _syncOut() {\n this._out.textContent = `${this._input.value}${this.getAttribute('unit') || ''}`;\n }\n\n setupEvents() {\n this._onInput = () => {\n this._syncOut();\n this._syncFormValue();\n this.emit('nk-input', { value: Number(this._input.value), name: this.name });\n };\n this._onChange = () => {\n this._syncFormValue();\n this.emit('nk-change', { value: Number(this._input.value), name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._input) return;\n if (name === 'value') this._input.value = this.getAttribute('value') ?? '';\n else this._apply();\n this._syncOut();\n this._syncFormValue();\n }\n\n _syncFormValue() { this.setFormValue(this._input.value); }\n resetValue() { this._input.value = this._defaultValue; this._syncOut(); this._syncFormValue(); }\n restoreValue(state) { if (typeof state === 'string') { this._input.value = state; this._syncOut(); this._syncFormValue(); } }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n focus(options) { this._input?.focus(options); }\n\n get value() { return Number(this._input?.value ?? this.getAttribute('value')); }\n set value(v) {\n if (this._input) { this._input.value = v; this._syncOut(); this._syncFormValue(); }\n else this.setAttribute('value', v);\n }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get showValue() { return this.getBoolAttr('show-value'); }\n set showValue(v) { this.setBoolAttr('show-value', v); }\n}\n\ncustomElements.define('nk-slider', NkSlider);\nexport { NkSlider };\n","import { NkElement } from '../../base.js';\n\n// <nk-field label=\"Display name\" desc=\"Shown next to your comments\">\n// <nk-input value=\"Marcel\"></nk-input>\n// </nk-field>\n// → <div class=\"nk-field\"><div><div class=\"f-label\">…</div><div class=\"f-desc\">…</div></div>\n// <div class=\"f-control\">…</div></div>\n// Rich label / description content goes through slot=\"label\" / slot=\"desc\"\n// (twins `.nk-field ::slotted([slot=\"label\"])` etc. in notionkit.css).\n//\n// `stacked` puts the label above a full-width control, `compact` shrinks the\n// label and drops the row padding; inside <nk-fields> both are on by\n// default. A stacked field sets `wide` on its nk-input / nk-textarea /\n// nk-select, since the stylesheet's `.nk-field.stacked .nk-input` cannot\n// reach into the control's shadow root.\nconst WIDE = ['nk-input', 'nk-textarea', 'nk-select'];\n\nclass NkField extends NkElement {\n static get observedAttributes() { return ['label', 'desc', 'stacked', 'compact']; }\n\n render() {\n this._field = this.createElement('div', ['nk-field']);\n const text = document.createElement('div');\n this._label = this.createElement('div', ['f-label']);\n const labelSlot = this.createElement('slot', [], { name: 'label' });\n labelSlot.appendChild(this._label);\n this._desc = this.createElement('div', ['f-desc']);\n const descSlot = this.createElement('slot', [], { name: 'desc' });\n descSlot.appendChild(this._desc);\n text.appendChild(labelSlot);\n text.appendChild(descSlot);\n const control = this.createElement('div', ['f-control']);\n this._slot = document.createElement('slot');\n control.appendChild(this._slot);\n this._field.appendChild(text);\n this._field.appendChild(control);\n this._wrapper.appendChild(this._field);\n this._widened = new Set();\n this._sync();\n }\n\n setupEvents() {\n this._onSlot = () => this._syncWide();\n this._slot.addEventListener('slotchange', this._onSlot);\n this._sync();\n }\n\n teardownEvents() {\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged() { this._sync(); }\n\n get stacked() { return this.getBoolAttr('stacked') || !!this.closest('nk-fields'); }\n set stacked(v) { this.setBoolAttr('stacked', v); }\n get compact() { return this.getBoolAttr('compact') || !!this.closest('nk-fields'); }\n set compact(v) { this.setBoolAttr('compact', v); }\n\n _sync() {\n if (!this._label) return;\n this._label.textContent = this.getAttribute('label') || '';\n const desc = this.getAttribute('desc');\n this._desc.textContent = desc || '';\n this._desc.style.display = desc ? '' : 'none';\n this._field.classList.toggle('stacked', this.stacked);\n this._field.classList.toggle('compact', this.compact);\n this._syncWide();\n }\n\n _syncWide() {\n if (!this._slot) return;\n const stacked = this.stacked;\n for (const el of this._slot.assignedElements()) {\n if (!WIDE.includes(el.localName)) continue;\n if (stacked && !el.hasAttribute('wide')) { el.setAttribute('wide', ''); this._widened.add(el); }\n else if (!stacked && this._widened.has(el)) { el.removeAttribute('wide'); this._widened.delete(el); }\n }\n }\n\n get label() { return this.getAttribute('label'); }\n set label(v) { this.setAttribute('label', v); }\n get desc() { return this.getAttribute('desc'); }\n set desc(v) { v == null ? this.removeAttribute('desc') : this.setAttribute('desc', v); }\n}\n\ncustomElements.define('nk-field', NkField);\nexport { NkField };\n","import { NkElement } from '../../base.js';\n\n// <nk-fields>\n// <nk-field label=\"Name\"><nk-input name=\"name\"></nk-input></nk-field>\n// <nk-field label=\"Email\"><nk-input name=\"email\"></nk-input></nk-field>\n// </nk-fields>\n// → <div class=\"nk-fields\">…</div>\n// A grid of short fields side by side, wrapping as the width allows. Every\n// nk-field inside renders itself stacked and compact (12px label above a\n// full-width control) – the class markup does the same through\n// `.nk-fields > .nk-field`, which cannot cross the shadow boundary here.\n// `fit` (NotionKit 1.11.0) lets the fields share the row instead of keeping\n// 150px columns: two fields in a wide dialog are two halves.\nclass NkFields extends NkElement {\n static get observedAttributes() { return ['fit']; }\n\n render() {\n this._grid = this.createElement('div', ['nk-fields']);\n this._grid.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._grid);\n this.onAttributeChanged();\n }\n\n onAttributeChanged() { this._grid?.classList.toggle('fit', this.getBoolAttr('fit')); }\n\n get fit() { return this.getBoolAttr('fit'); }\n set fit(v) { this.setBoolAttr('fit', v); }\n}\n\ncustomElements.define('nk-fields', NkFields);\nexport { NkFields };\n","import { NkElement } from '../../base.js';\n\n// <nk-tag color=\"blue\">Text</nk-tag> — modifier class .blue becomes color=\"blue\".\n// Notion's nine select colours; without `color` the stylesheet draws the grey tag.\nconst COLORS = ['gray', 'brown', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'red'];\n\nclass NkTag extends NkElement {\n static get observedAttributes() { return ['color']; }\n\n render() {\n this._tag = this.createElement('span', this._computeClasses());\n this._tag.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._tag);\n }\n\n onAttributeChanged() {\n if (this._tag) this._tag.className = this._computeClasses().join(' ');\n }\n\n _computeClasses() {\n const classes = ['nk-tag'];\n const color = this.getAttribute('color');\n if (COLORS.includes(color)) classes.push(color);\n return classes;\n }\n\n get color() { return this.getAttribute('color'); }\n set color(v) { v ? this.setAttribute('color', v) : this.removeAttribute('color'); }\n}\n\ncustomElements.define('nk-tag', NkTag);\nexport { NkTag };\n","import { NkElement } from '../../base.js';\n\n// <nk-progress value=\"72\" label=\"72%\"></nk-progress>\n// <nk-progress value=\"72\" label=\"72 %\" wide></nk-progress> → fills its row, the label stays beside it\n// The bar is `.nk-progress > i` — a child combinator, so both nodes live here.\nclass NkProgress extends NkElement {\n static get observedAttributes() { return ['value', 'max', 'label', 'wide']; }\n\n render() {\n this._bar = this.createElement('span', ['nk-progress'], { role: 'progressbar' });\n this._fill = document.createElement('i');\n this._bar.appendChild(this._fill);\n this._label = this.createElement('span', ['nk-progress-label']);\n this._wrapper.appendChild(this._bar);\n this._wrapper.appendChild(this._label);\n this._sync();\n }\n\n onAttributeChanged() { this._sync(); }\n\n _sync() {\n if (!this._bar) return;\n const max = Number(this.getAttribute('max')) || 100;\n const value = Math.min(max, Math.max(0, Number(this.getAttribute('value')) || 0));\n this._fill.style.width = `${(value / max) * 100}%`;\n this._bar.classList.toggle('wide', this.getBoolAttr('wide'));\n this._bar.setAttribute('aria-valuenow', value);\n this._bar.setAttribute('aria-valuemin', 0);\n this._bar.setAttribute('aria-valuemax', max);\n const label = this.getAttribute('label');\n this._label.textContent = label ?? '';\n this._label.style.display = label === null ? 'none' : '';\n }\n\n get value() { return Number(this.getAttribute('value')) || 0; }\n set value(v) { this.setAttribute('value', v); }\n get max() { return Number(this.getAttribute('max')) || 100; }\n set max(v) { this.setAttribute('max', v); }\n get label() { return this.getAttribute('label'); }\n set label(v) { v == null ? this.removeAttribute('label') : this.setAttribute('label', v); }\n}\n\ncustomElements.define('nk-progress', NkProgress);\nexport { NkProgress };\n","import { NkElement } from '../../base.js';\n\n// <nk-callout icon=\"💡\">text</nk-callout>\n// <nk-callout><span slot=\"icon\">📌</span>text</nk-callout>\n// The .c-icon rule has ::slotted(.c-icon) / ::slotted([slot=\"icon\"]) twins in\n// notionkit.css – those size an icon passed in from the light DOM. Pass the\n// icon node itself, never wrapped: ::slotted() only matches the assigned node.\nclass NkCallout extends NkElement {\n static get observedAttributes() { return ['icon']; }\n\n render() {\n this._box = this.createElement('div', ['nk-callout']);\n this._icon = this.createElement('span', ['c-icon']);\n const iconSlot = this.createElement('slot', [], { name: 'icon' });\n iconSlot.appendChild(this._icon);\n const body = document.createElement('div');\n body.appendChild(document.createElement('slot'));\n this._box.appendChild(iconSlot);\n this._box.appendChild(body);\n this._wrapper.appendChild(this._box);\n this._syncIcon();\n }\n\n onAttributeChanged() { this._syncIcon(); }\n\n _syncIcon() {\n if (this._icon) this._icon.textContent = this.getAttribute('icon') || '💡';\n }\n\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n}\n\ncustomElements.define('nk-callout', NkCallout);\nexport { NkCallout };\n","import { NkElement } from '../../base.js';\n\n// <nk-divider></nk-divider> → <hr class=\"nk-divider\">\nclass NkDivider extends NkElement {\n render() {\n this._wrapper.appendChild(this.createElement('hr', ['nk-divider']));\n }\n}\n\ncustomElements.define('nk-divider', NkDivider);\nexport { NkDivider };\n","import { NkElement } from '../../base.js';\n\n// <nk-heading level=\"2\">Section</nk-heading> → <h2 class=\"nk-heading\">\n// The heading level is real markup (h1–h4), so the outline stays honest.\nclass NkHeading extends NkElement {\n static get observedAttributes() { return ['level']; }\n\n render() {\n this._build();\n }\n\n _build() {\n const level = Math.min(4, Math.max(1, Number(this.getAttribute('level')) || 2));\n const h = this.createElement(`h${level}`, ['nk-heading']);\n h.appendChild(document.createElement('slot'));\n if (this._heading) this._heading.replaceWith(h);\n else this._wrapper.appendChild(h);\n this._heading = h;\n }\n\n onAttributeChanged() { this._build(); }\n\n get level() { return Number(this.getAttribute('level')) || 2; }\n set level(v) { this.setAttribute('level', v); }\n}\n\ncustomElements.define('nk-heading', NkHeading);\nexport { NkHeading };\n","import { NkElement } from '../../base.js';\n\n// <nk-toggle label=\"Details\" open>Body…</nk-toggle>\n// → <details class=\"nk-toggle\" open><summary>Details</summary><div class=\"toggle-body\">…</div></details>\n// The summary marker is a pseudo-element and cannot be styled on slotted\n// content, so the summary is rendered here (label attribute or slot=\"label\").\nclass NkToggle extends NkElement {\n static get observedAttributes() { return ['label', 'open']; }\n\n render() {\n this._details = this.createElement('details', ['nk-toggle']);\n const summary = document.createElement('summary');\n this._label = document.createElement('span');\n const labelSlot = this.createElement('slot', [], { name: 'label' });\n labelSlot.appendChild(this._label);\n summary.appendChild(labelSlot);\n const body = this.createElement('div', ['toggle-body']);\n body.appendChild(document.createElement('slot'));\n this._details.appendChild(summary);\n this._details.appendChild(body);\n this._details.open = this.getBoolAttr('open');\n this._wrapper.appendChild(this._details);\n this._sync();\n }\n\n setupEvents() {\n this._onToggle = () => {\n this._syncing = true;\n this.setBoolAttr('open', this._details.open);\n this._syncing = false;\n this.emit('nk-toggle', { open: this._details.open });\n };\n this._details.addEventListener('toggle', this._onToggle);\n }\n\n teardownEvents() {\n this._details?.removeEventListener('toggle', this._onToggle);\n }\n\n onAttributeChanged(name) {\n if (!this._details) return;\n if (name === 'open') { if (!this._syncing) this._details.open = this.getBoolAttr('open'); return; }\n this._sync();\n }\n\n _sync() { this._label.textContent = this.getAttribute('label') || ''; }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get label() { return this.getAttribute('label'); }\n set label(v) { this.setAttribute('label', v); }\n}\n\ncustomElements.define('nk-toggle', NkToggle);\nexport { NkToggle };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-todo name=\"task\" value=\"1\" checked>Write the docs</nk-todo>\n// → <label class=\"nk-todo\"><input type=\"checkbox\"><span>Write the docs</span></label>\n// `.nk-todo input:checked + span` strikes the text through — both siblings\n// are rendered here so the combinator works; the text is slotted into <span>.\nclass NkTodo extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value']; }\n\n render() {\n const label = this.createElement('label', ['nk-todo']);\n this._input = this.createElement('input', [], { type: 'checkbox' });\n this._apply();\n this._defaultChecked = this.getBoolAttr('checked');\n const text = document.createElement('span');\n text.appendChild(document.createElement('slot'));\n label.appendChild(this._input);\n label.appendChild(text);\n this._wrapper.appendChild(label);\n this._syncFormValue();\n }\n\n _apply() {\n this._input.checked = this.getBoolAttr('checked');\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n const name = this.getAttribute('name');\n name ? this._input.setAttribute('name', name) : this._input.removeAttribute('name');\n this._input.value = this.getAttribute('value') || 'on';\n }\n\n setupEvents() {\n this._onChange = () => {\n this._syncing = true;\n this.setBoolAttr('checked', this._input.checked);\n this._syncing = false;\n this._syncFormValue();\n this.emit('nk-change', { checked: this._input.checked, value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged() {\n if (this._syncing || !this._input) return;\n this._apply();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.checked ? this._input.value : null, this._input.checked ? 'checked' : 'unchecked');\n }\n\n resetValue() { this.setBoolAttr('checked', this._defaultChecked); }\n restoreValue(state) { if (state === 'checked' || state === 'unchecked') this.setBoolAttr('checked', state === 'checked'); }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n get checked() { return this._input?.checked ?? this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-todo', NkTodo);\nexport { NkTodo };\n","import { NkElement } from '../../base.js';\n\n// <nk-kbd>⌘</nk-kbd> <nk-kbd>K</nk-kbd> → <kbd class=\"nk-kbd\">\nclass NkKbd extends NkElement {\n\n render() {\n const kbd = this.createElement('kbd', ['nk-kbd']);\n kbd.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(kbd);\n }\n}\n\ncustomElements.define('nk-kbd', NkKbd);\nexport { NkKbd };\n","import { NkElement } from '../../base.js';\nimport { highlightHtml } from '../../util/highlight.js';\n\n// <nk-code lang=\"html\">&lt;div class=\"nk-btn\"&gt;…</nk-code>\n// The block keeps whatever whitespace it is given (white-space: pre). Text\n// content is slotted as-is; add `highlight` to colour HTML tags/attributes,\n// which copies the text into the shadow tree (light DOM is then ignored).\nclass NkCode extends NkElement {\n static get observedAttributes() { return ['lang', 'highlight']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._box = this.createElement('div', ['nk-code']);\n this._lang = this.createElement('span', ['lang']);\n this._slot = document.createElement('slot');\n this._pre = this.createElement('span', ['hl']);\n this._box.appendChild(this._lang);\n this._box.appendChild(this._slot);\n this._box.appendChild(this._pre);\n this._wrapper.appendChild(this._box);\n this._sync();\n this.projectLightDom();\n }\n\n onAttributeChanged() { this._sync(); this.projectLightDom(); }\n\n _sync() {\n if (!this._lang) return;\n const lang = this.getAttribute('lang');\n this._lang.textContent = lang || '';\n this._lang.style.display = lang ? '' : 'none';\n }\n\n projectLightDom() {\n if (!this._pre) return;\n const highlight = this.hasAttribute('highlight');\n this._slot.style.display = highlight ? 'none' : '';\n this._pre.style.display = highlight ? '' : 'none';\n if (!highlight) return;\n const text = this.textContent.replace(/^\\n/, '');\n if (text === this._lastText) return;\n this._lastText = text;\n this._pre.innerHTML = highlightHtml(text);\n }\n\n get lang() { return this.getAttribute('lang'); }\n set lang(v) { v == null ? this.removeAttribute('lang') : this.setAttribute('lang', v); }\n}\n\ncustomElements.define('nk-code', NkCode);\nexport { NkCode };\n","// Minimal HTML highlighter emitting the .tag / .attr hooks .nk-code styles.\n// Mirrors tools/highlight.mjs in the NotionKit foundation – no third-party\n// highlighter, no other languages. Anything that is not HTML is escaped only.\nexport function escapeHtml(s) {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nexport function highlightHtml(source) {\n return escapeHtml(source).replace(/&lt;(\\/?)([a-zA-Z][\\w-]*)([^&]*?)(\\/?)&gt;/g, (m, close, tag, attrs, self) => {\n const attrHtml = attrs.replace(/([\\w-]+)(=)(\"[^\"]*\"|'[^']*')?/g,\n (a, name, eq, val) => `<span class=\"attr\">${name}</span>${eq}${val ?? ''}`);\n return `&lt;${close}<span class=\"tag\">${tag}</span>${attrHtml}${self}&gt;`;\n });\n}\n","import { NkElement } from '../../base.js';\n\n// <nk-quote cite=\"Ada Lovelace\">The Analytical Engine weaves…</nk-quote>\n// .q-cite has no ::slotted() twin, so the citation is rendered here.\nclass NkQuote extends NkElement {\n static get observedAttributes() { return ['cite']; }\n\n render() {\n this._quote = this.createElement('blockquote', ['nk-quote']);\n this._quote.appendChild(document.createElement('slot'));\n this._cite = this.createElement('cite', ['q-cite']);\n this._quote.appendChild(this._cite);\n this._wrapper.appendChild(this._quote);\n this._sync();\n }\n\n onAttributeChanged() { this._sync(); }\n\n _sync() {\n if (!this._cite) return;\n const cite = this.getAttribute('cite');\n this._cite.textContent = cite || '';\n this._cite.style.display = cite ? '' : 'none';\n }\n\n get cite() { return this.getAttribute('cite'); }\n set cite(v) { v == null ? this.removeAttribute('cite') : this.setAttribute('cite', v); }\n}\n\ncustomElements.define('nk-quote', NkQuote);\nexport { NkQuote };\n","import { NkElement } from '../../base.js';\n\n// <nk-app>\n// <nk-sidebar slot=\"sidebar\">…</nk-sidebar>\n// <nk-topbar>…</nk-topbar>\n// <nk-page>…</nk-page>\n// </nk-app>\n// → <div class=\"nk-app\"><aside class=\"nk-sidebar\">…</aside><main class=\"nk-main\">…</main></div>\n// The outermost element of a workspace app: a full-height flex row.\n// `peek-inset` (NotionKit 1.10.0) gives the main column a right padding as\n// wide as the side peek – <nk-peek inset> sets it while it is open.\nclass NkApp extends NkElement {\n static get observedAttributes() { return ['peek-inset']; }\n\n render() {\n const app = this._app = this.createElement('div', ['nk-app']);\n app.classList.toggle('peek-inset', this.getBoolAttr('peek-inset'));\n app.appendChild(this.createElement('slot', [], { name: 'sidebar' }));\n const main = this.createElement('main', ['nk-main']);\n main.appendChild(document.createElement('slot'));\n app.appendChild(main);\n this._wrapper.appendChild(app);\n }\n\n onAttributeChanged() { this._app.classList.toggle('peek-inset', this.getBoolAttr('peek-inset')); }\n}\n\ncustomElements.define('nk-app', NkApp);\nexport { NkApp };\n","// Overlay plumbing shared by nk-modal, nk-sheet, nk-cmdk and nk-menu: body\n// scroll lock with a refcount, `inert` on everything outside the overlay so\n// focus and assistive technology stay inside – nested shadow roots included –\n// and the focused element behind shadow hosts, to return focus to.\nlet locks = 0, previousOverflow = '';\n\nexport function lockScroll() {\n if (locks++ === 0) {\n previousOverflow = document.documentElement.style.overflow;\n document.documentElement.style.overflow = 'hidden';\n }\n}\n\nexport function unlockScroll() {\n if (locks > 0 && --locks === 0) document.documentElement.style.overflow = previousOverflow;\n}\n\n// Floating layers under <body> that open from inside an overlay – a menu, a\n// date picker – and the tooltip and toast stay usable: made inert, a date\n// picker opened from a dialog showed but took no click.\nconst LAYERS = 'nk-menu[floating], nk-calendar[floating], nk-tooltip, nk-toast';\n\n/** Makes every sibling along `el`'s ancestor chain inert (shadow hosts included), floating layers aside; returns the undo. */\nexport function inertOutside(el) {\n const made = [];\n let node = el;\n while (node && node !== document.body) {\n const parent = node.parentNode instanceof ShadowRoot ? node.parentNode : node.parentNode;\n if (!parent) break;\n for (const sib of parent.children) {\n if (sib === node || sib.inert || /^(SCRIPT|STYLE|LINK|TEMPLATE)$/.test(sib.tagName) || sib.matches(LAYERS)) continue;\n sib.inert = true;\n made.push(sib);\n }\n node = parent instanceof ShadowRoot ? parent.host : parent;\n }\n return () => { for (const c of made) c.inert = false; };\n}\n\n/** The focused element itself, looking into shadow roots (document.activeElement stops at the host). */\nexport function deepActiveElement() {\n let el = document.activeElement;\n while (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement;\n return el;\n}\n\n/** The first tabbable element inside a light-DOM subtree, looking into shadow roots. */\nexport function firstFocusable(root) {\n const SEL = 'a[href], button:not([disabled]), input:not([disabled]):not([type=hidden]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"]), [contenteditable=\"true\"], [contenteditable=\"plaintext-only\"]';\n const walk = (node) => {\n for (const el of node.querySelectorAll('*')) {\n if (el.matches(SEL) && el.getClientRects().length) return el;\n if (el.shadowRoot) { const inner = walk(el.shadowRoot); if (inner) return inner; }\n }\n return null;\n };\n return walk(root);\n}\n","import { NkElement } from '../../base.js';\nimport { deepActiveElement } from '../../util/focus.js';\n\n// <nk-sidebar slot=\"sidebar\">\n// <nk-workspace-switcher slot=\"workspace\" name=\"Acme\"></nk-workspace-switcher>\n// <nk-tree>…</nk-tree>\n// <nk-tree-item slot=\"footer\" icon=\"⚙️\">Settings</nk-tree-item>\n// </nk-sidebar>\n// → <aside class=\"nk-sidebar\"><div class=\"nk-workspace\">…</div>\n// <div class=\"nk-sidebar-scroll\">…</div><div class=\"nk-sidebar-footer\">…</div></aside>\n//\n// The host is display:contents so the <aside> is a direct flex child of\n// .nk-app, exactly like the class markup. Below 860px notionkit.css hides the\n// aside; `open` brings it back as a drawer over the page. The drawer is the\n// stylesheet's since NotionKit 1.7.0 (.nk-sidebar.open, .nk-sidebar-backdrop\n// .open) – the sidebar slides and the scrim fades by the same rules as the\n// class markup; the element toggles the two classes. <nk-btn variant=\"sidebar\">\n// in the topbar is the ☰ that opens it.\n//\n// `collapsible` (NotionKit 1.10.0): on the desktop Notion's « beside the\n// workspace row collapses the sidebar – it slides out to the left, the main\n// column takes the width, nothing in it takes focus – and the topbar's ☰\n// brings it back; ⌘\\ or Ctrl+\\ toggles it (on a phone the drawer).\n// `collapsed` is the state, collapse() / expand() / toggleCollapsed() the\n// API, nk-collapse { collapsed } the moment to keep it. collapse-label names\n// the « (default \"Close sidebar\", in German \"Seitenleiste schließen\") and is\n// its tooltip for <nk-tooltip>.\nconst COLLAPSE_ICON = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m18 17-5-5 5-5M11 17l-5-5 5-5\"/></svg>';\nconst phone = () => matchMedia('(max-width: 860px)').matches;\n\nclass NkSidebar extends NkElement {\n static get observedAttributes() { return ['open', 'collapsible', 'collapsed', 'collapse-label']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-sidebar-backdrop']);\n this._aside = this.createElement('aside', ['nk-sidebar']);\n const head = this.createElement('div', ['nk-sidebar-head']);\n this._collapse = this.createElement('button', ['nk-sidebar-collapse'], { type: 'button', 'data-tooltip-key': '⌘\\\\' });\n this._collapse.innerHTML = COLLAPSE_ICON;\n head.append(this.createElement('slot', [], { name: 'workspace' }), this._collapse);\n this._aside.appendChild(head);\n const scroll = this.createElement('div', ['nk-sidebar-scroll']);\n scroll.appendChild(document.createElement('slot'));\n this._aside.appendChild(scroll);\n this._footer = this.createElement('div', ['nk-sidebar-footer']);\n this._footerSlot = this.createElement('slot', [], { name: 'footer' });\n this._footer.appendChild(this._footerSlot);\n this._aside.appendChild(this._footer);\n this._wrapper.appendChild(this._backdrop);\n this._wrapper.appendChild(this._aside);\n this._syncFooter();\n this._syncOpen();\n this._syncCollapse();\n }\n\n _syncCollapse() {\n const label = this.getAttribute('collapse-label') || this.str('closeSidebar');\n this._collapse.hidden = !this.getBoolAttr('collapsible');\n this._collapse.setAttribute('aria-label', label);\n this._collapse.dataset.tooltip = label;\n this._aside.classList.toggle('collapsed', this.getBoolAttr('collapsed'));\n }\n\n /** The ☰ that brings the sidebar back: the one in its own app, else the page's. */\n _toggleButton() {\n const sel = 'nk-btn[variant=\"sidebar\"]';\n return this.closest('nk-app')?.querySelector(sel) ?? document.querySelector(sel);\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._aside.classList.toggle('open', open);\n this._backdrop.classList.toggle('open', open);\n }\n\n _syncFooter() {\n const nodes = this._footerSlot.assignedElements();\n // The footer box carries padding and a border; only render it when used.\n this._footer.style.display = nodes.length ? '' : 'none';\n // Footer rows are 26px in the class version (.nk-sidebar-footer .nk-tree-item).\n for (const el of nodes) if (el.localName === 'nk-tree-item') el.setAttribute('compact', '');\n }\n\n setupEvents() {\n this._onSlot = () => this._syncFooter();\n this._onBackdrop = () => this.close();\n this._onKey = (e) => {\n if (e.key === 'Escape' && this.getBoolAttr('open')) this.close();\n // Notion's ⌘\\: the collapse on the desktop, the drawer on a phone.\n if (e.key === '\\\\' && (e.metaKey || e.ctrlKey) && this.getBoolAttr('collapsible') && !e.defaultPrevented) {\n e.preventDefault();\n phone() ? this.toggle() : this.toggleCollapsed();\n }\n };\n this._onCollapse = () => this.collapse();\n this._footerSlot.addEventListener('slotchange', this._onSlot);\n this._backdrop.addEventListener('click', this._onBackdrop);\n this._collapse.addEventListener('click', this._onCollapse);\n document.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._footerSlot?.removeEventListener('slotchange', this._onSlot);\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n this._collapse?.removeEventListener('click', this._onCollapse);\n document.removeEventListener('keydown', this._onKey);\n }\n\n onStringsChanged() { this._syncCollapse(); }\n\n onAttributeChanged(name) {\n if (name === 'open') {\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n return;\n }\n // Focus follows to the control that is left: the ☰ after collapsing, the « after expanding.\n const active = deepActiveElement();\n const fromSidebar = active && (this.contains(active) || this._shadow.contains(active));\n const fromToggle = active?.closest?.('.nk-sidebar-toggle');\n this._syncCollapse();\n if (name !== 'collapsed') return;\n const collapsed = this.getBoolAttr('collapsed');\n this.emit('nk-collapse', { collapsed });\n // Two frames later: with reduced motion every nk- element transitions for\n // .01ms, the inherited visibility included, so the « is focusable only then.\n const later = fn => requestAnimationFrame(() => requestAnimationFrame(fn));\n if (collapsed && fromSidebar) later(() => this._toggleButton()?.focus({ preventScroll: true }));\n if (!collapsed && fromToggle && !this._collapse.hidden) later(() => this._collapse.focus({ preventScroll: true }));\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n\n collapse() { this.setBoolAttr('collapsed', true); }\n expand() { this.setBoolAttr('collapsed', false); }\n toggleCollapsed() { this.setBoolAttr('collapsed', !this.getBoolAttr('collapsed')); }\n get collapsed() { return this.getBoolAttr('collapsed'); }\n set collapsed(v) { this.setBoolAttr('collapsed', v); }\n}\n\ncustomElements.define('nk-sidebar', NkSidebar);\nexport { NkSidebar };\n","import { NkElement } from '../../base.js';\n\n// <nk-workspace-switcher slot=\"workspace\" name=\"Acme\" avatar=\"A\">\n// <nk-menu slot=\"menu\">…</nk-menu>\n// </nk-workspace-switcher>\n// → <div class=\"nk-workspace\"><div class=\"avatar\">A</div><span>Acme</span><span class=\"chev\">⌄</span></div>\n// A click toggles `open` and shows whatever sits in the menu slot below the\n// row; clicking outside or pressing Escape closes it.\nconst menuSheet = new CSSStyleSheet();\nmenuSheet.replaceSync(`\n .nk-ws-anchor { position: relative; flex: 1 1 auto; min-width: 0; }\n .nk-ws-menu { display: none; position: absolute; left: 8px; top: calc(100% - 2px); z-index: 50; }\n :host([open]) .nk-ws-menu { display: block; }\n`);\n\nclass NkWorkspaceSwitcher extends NkElement {\n static get hostStyles() { return menuSheet; }\n static get observedAttributes() { return ['name', 'avatar', 'open']; }\n\n render() {\n this._row = this.createElement('div', ['nk-workspace'], { role: 'button', tabindex: '0', 'aria-haspopup': 'menu' });\n this._avatar = this.createElement('div', ['avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n this._name = document.createElement('span');\n const chev = this.createElement('span', ['chev']);\n chev.textContent = '⌄';\n this._row.append(avatarSlot, this._name, chev);\n this._menu = this.createElement('div', ['nk-ws-menu']);\n this._menu.appendChild(this.createElement('slot', [], { name: 'menu' }));\n const anchor = this.createElement('div', ['nk-ws-anchor']);\n anchor.append(this._row, this._menu);\n this._wrapper.appendChild(anchor);\n this._sync();\n }\n\n _sync() {\n const name = this.getAttribute('name') || '';\n this._name.textContent = name;\n this._avatar.textContent = this.getAttribute('avatar') || name.trim().charAt(0).toUpperCase();\n this._row.setAttribute('aria-expanded', this.getBoolAttr('open') ? 'true' : 'false');\n }\n\n setupEvents() {\n this._onClick = () => this.toggle();\n this._onKey = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.toggle(); } };\n this._onDocClick = (e) => { if (this.getBoolAttr('open') && !e.composedPath().includes(this)) this.close(); };\n this._onDocKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) this.close(); };\n this._onMenuSelect = () => this.close();\n this._row.addEventListener('click', this._onClick);\n this._row.addEventListener('keydown', this._onKey);\n this._menu.addEventListener('nk-select', this._onMenuSelect);\n document.addEventListener('click', this._onDocClick);\n document.addEventListener('keydown', this._onDocKey);\n }\n\n teardownEvents() {\n this._row?.removeEventListener('click', this._onClick);\n this._row?.removeEventListener('keydown', this._onKey);\n this._menu?.removeEventListener('nk-select', this._onMenuSelect);\n document.removeEventListener('click', this._onDocClick);\n document.removeEventListener('keydown', this._onDocKey);\n }\n\n onAttributeChanged(name) {\n this._sync();\n if (name === 'open') this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n}\n\ncustomElements.define('nk-workspace-switcher', NkWorkspaceSwitcher);\nexport { NkWorkspaceSwitcher };\n","import { NkElement } from '../../base.js';\n\n// <nk-section-label addable>Favourites</nk-section-label>\n// → <div class=\"nk-section-label\">Favourites <span class=\"plus\">+</span></div>\n// The + appears on hover (a hover-parent rule, so it lives in the same tree)\n// and fires nk-action { action: 'add' }.\nclass NkSectionLabel extends NkElement {\n static get observedAttributes() { return ['label', 'addable']; }\n\n render() {\n this._box = this.createElement('div', ['nk-section-label']);\n this._text = document.createElement('span');\n this._text.appendChild(document.createElement('slot'));\n this._plus = this.createElement('span', ['plus'], { role: 'button', title: '+' });\n this._plus.textContent = '+';\n this._box.append(this._text, this._plus);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n const label = this.getAttribute('label');\n if (label !== null) this._text.textContent = label;\n this._plus.style.display = this.getBoolAttr('addable') ? '' : 'none';\n }\n\n setupEvents() {\n this._onPlus = (e) => { e.stopPropagation(); this.emit('nk-action', { action: 'add' }); };\n this._plus.addEventListener('click', this._onPlus);\n }\n\n teardownEvents() { this._plus?.removeEventListener('click', this._onPlus); }\n\n onAttributeChanged() { this._sync(); }\n\n get addable() { return this.getBoolAttr('addable'); }\n set addable(v) { this.setBoolAttr('addable', v); }\n}\n\ncustomElements.define('nk-section-label', NkSectionLabel);\nexport { NkSectionLabel };\n","import { NkElement } from '../../base.js';\n\n// <nk-tree>\n// <nk-section-label addable>Favourites</nk-section-label>\n// <nk-tree-item icon=\"📊\" open>Project overview\n// <nk-tree-item icon=\"🚀\" active>NotionKit MVP</nk-tree-item>\n// </nk-tree-item>\n// </nk-tree>\n//\n// A container for tree items: keeps a single `active` item (listening to\n// nk-select from any depth), gives the group one tab stop with arrow-key\n// navigation, and can render items from data:\n// tree.data = [{ label, icon, value, href, open, active, children: [...] }]\nconst KEYS = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End']);\n\nclass NkTree extends NkElement {\n static get observedAttributes() { return ['manual']; }\n\n render() {\n const box = this.createElement('div', [], { role: 'tree' });\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n this._box = box;\n }\n\n /** Makes `item` the single active item (called by the item after nk-select was not cancelled). */\n setActive(item) {\n if (this.getBoolAttr('manual')) return;\n for (const other of this.querySelectorAll('nk-tree-item[active]')) if (other !== item) other.removeAttribute('active');\n item.setAttribute('active', '');\n this._syncTabIndex(item);\n }\n\n setupEvents() {\n this._onKey = (e) => {\n if (!KEYS.has(e.key) || e.ctrlKey || e.metaKey || e.altKey) return;\n const item = e.target.closest?.('nk-tree-item');\n if (!item) return;\n const visible = this.visibleItems();\n const i = visible.indexOf(item);\n if (i < 0) return;\n let next = null;\n switch (e.key) {\n case 'ArrowDown': next = visible[i + 1]; break;\n case 'ArrowUp': next = visible[i - 1]; break;\n case 'Home': next = visible[0]; break;\n case 'End': next = visible[visible.length - 1]; break;\n case 'ArrowRight':\n if (item.hasChildren && !item.open) item.open = true;\n else if (item.hasChildren) next = item.querySelector('nk-tree-item');\n break;\n case 'ArrowLeft':\n if (item.hasChildren && item.open) item.open = false;\n else next = item.parentElement?.closest('nk-tree-item');\n break;\n }\n e.preventDefault();\n if (next) { this._syncTabIndex(next); next.focus(); }\n };\n this._onSlot = () => this._syncTabIndex();\n this.addEventListener('keydown', this._onKey);\n this._box.querySelector('slot').addEventListener('slotchange', this._onSlot);\n this._syncTabIndex();\n }\n\n teardownEvents() {\n this.removeEventListener('keydown', this._onKey);\n this._box?.querySelector('slot').removeEventListener('slotchange', this._onSlot);\n }\n\n /** Items whose every ancestor item inside this tree is open – i.e. rendered. */\n visibleItems() {\n return [...this.querySelectorAll('nk-tree-item')].filter(item => {\n for (let p = item.parentElement?.closest('nk-tree-item'); p && this.contains(p); p = p.parentElement?.closest('nk-tree-item')) {\n if (!p.open) return false;\n }\n return true;\n });\n }\n\n /** Items upgrade after the tree; each one asks for a resync once rendered. */\n requestSync() {\n if (this._syncQueued) return;\n this._syncQueued = true;\n queueMicrotask(() => { this._syncQueued = false; this._syncTabIndex(); });\n }\n\n _syncTabIndex(focusable) {\n const items = [...this.querySelectorAll('nk-tree-item')];\n if (!items.length) return;\n const visible = this.visibleItems();\n const target = focusable || visible.find(i => i.active) || visible[0];\n // A method call, not a property write: assigning a property to an element\n // that has not been upgraded yet would create an own property that shadows\n // the accessor forever.\n for (const item of items) item.setTabbable?.(item === target);\n }\n\n /** Renders items from data into the light DOM (replacing existing items). */\n set data(list) {\n this._data = list;\n const build = (nodes) => nodes.map(n => {\n const item = document.createElement('nk-tree-item');\n if (n.icon) item.setAttribute('icon', n.icon);\n if (n.value != null) item.setAttribute('value', n.value);\n if (n.href) item.setAttribute('href', n.href);\n if (n.open) item.setAttribute('open', '');\n if (n.active) item.setAttribute('active', '');\n item.append(document.createTextNode(n.label ?? ''), ...build(n.children || []));\n return item;\n });\n for (const old of this.querySelectorAll(':scope > nk-tree-item')) old.remove();\n this.append(...build(list || []));\n }\n get data() { return this._data; }\n\n get activeItem() { return this.querySelector('nk-tree-item[active]'); }\n get value() { return this.activeItem?.value ?? null; }\n}\n\ncustomElements.define('nk-tree', NkTree);\nexport { NkTree };\n","import { NkElement } from '../../base.js';\n\n// <nk-tree-item icon=\"📊\" value=\"overview\" open>\n// Project overview\n// <nk-tree-item icon=\"🚀\" value=\"mvp\" active>NotionKit MVP</nk-tree-item>\n// </nk-tree-item>\n//\n// → <div class=\"nk-tree-item active\"><span class=\"nk-toggle-arrow open\">▸</span>\n// <span class=\"icon\">📊</span><span class=\"label\">…</span>\n// <span class=\"actions\"><span>+</span><span>⋯</span></span></div>\n// <div class=\"nk-tree-children\">…</div>\n//\n// Both halves – the row and the .nk-tree-children box that must be its next\n// sibling – are rendered here. Slots are assigned manually: text becomes the\n// label, nested <nk-tree-item>s become the children, `slot=\"icon\"` /\n// `slot=\"end\"` nodes go where they say. The hover actions are shadow-internal\n// (`.nk-tree-item:hover .actions` is a hover-parent rule) and report through\n// nk-action.\nclass NkTreeItem extends NkElement {\n static get slotAssignment() { return 'manual'; }\n static get observedAttributes() { return ['label', 'icon', 'value', 'href', 'active', 'open', 'compact', 'no-actions']; }\n\n render() {\n this._row = this.createElement('div', ['nk-tree-item'], { role: 'treeitem', tabindex: '-1' });\n this._arrow = this.createElement('span', ['nk-toggle-arrow'], { 'aria-hidden': 'true' });\n this._arrow.textContent = '▸';\n this._iconSlot = this.createElement('slot', [], { name: 'icon' });\n this._icon = this.createElement('span', ['icon']);\n this._iconSlot.appendChild(this._icon);\n this._label = this.createElement('span', ['label']);\n this._labelSlot = this.createElement('slot', [], { name: 'label' });\n this._labelText = document.createTextNode('');\n this._labelSlot.appendChild(this._labelText);\n this._label.appendChild(this._labelSlot);\n this._actions = this.createElement('span', ['actions']);\n for (const [action, glyph, title] of [['add', '+', this.str('add')], ['more', '⋯', this.str('more')]]) {\n const b = this.createElement('span', [], { 'data-action': action, role: 'button', title });\n b.textContent = glyph;\n this._actions.appendChild(b);\n }\n this._endSlot = this.createElement('slot', [], { name: 'end' });\n this._row.append(this._arrow, this._iconSlot, this._label, this._actions, this._endSlot);\n this._children = this.createElement('div', ['nk-tree-children'], { role: 'group' });\n this._childSlot = this.createElement('slot', [], { name: 'children' });\n this._children.appendChild(this._childSlot);\n this._wrapper.append(this._row, this._children);\n this._sync();\n this.closest('nk-tree')?.requestSync?.();\n }\n\n /** Routes light-DOM nodes: nested items → children, slot=\"icon\"/\"end\" → there, the rest → label. */\n assignSlots() {\n if (!this._row) return;\n const icon = [], end = [], children = [], label = [];\n for (const node of this.childNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const slot = node.getAttribute('slot');\n if (slot === 'icon') icon.push(node);\n else if (slot === 'end') end.push(node);\n else if (node.localName === 'nk-tree-item') children.push(node);\n else label.push(node);\n } else if (node.nodeType === Node.TEXT_NODE) {\n // Every text node, empty and blank ones too: a template engine fills\n // an expression's node after the item is built (\"${i} ${title}\"),\n // and the blank node between two expressions is the space.\n label.push(node);\n }\n }\n this._iconSlot.assign(...icon);\n this._endSlot.assign(...end);\n this._childSlot.assign(...children);\n this._labelSlot.assign(...(this.hasAttribute('label') ? [] : label));\n this._hasChildren = children.length > 0;\n this._hasEnd = end.length > 0;\n this._sync();\n }\n\n _sync() {\n const active = this.getBoolAttr('active'), open = this.getBoolAttr('open');\n this._row.classList.toggle('active', active);\n this._row.classList.toggle('compact', this.getBoolAttr('compact'));\n this._row.setAttribute('aria-selected', active ? 'true' : 'false');\n this._arrow.classList.toggle('open', open);\n this._arrow.style.display = this._hasChildren ? '' : 'none';\n if (this._hasChildren) this._row.setAttribute('aria-expanded', open ? 'true' : 'false');\n else this._row.removeAttribute('aria-expanded');\n this._children.classList.toggle('collapsed', !open || !this._hasChildren);\n // Fallback content: write on a change only (see nk-switch).\n const icon = this.getAttribute('icon') || '';\n if (this._icon.textContent !== icon) this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n const label = this.getAttribute('label') || '';\n if (this._labelText.data !== label) this._labelText.data = label;\n // .actions is display:none until hover (a hover-parent rule); `hidden`\n // would lose to that rule, so the block is detached instead.\n const wantActions = !this.getBoolAttr('no-actions') && !this._hasEnd;\n if (wantActions && !this._actions.isConnected) this._row.insertBefore(this._actions, this._endSlot);\n if (!wantActions && this._actions.isConnected) this._actions.remove();\n const href = this.getAttribute('href');\n href ? this._row.setAttribute('data-href', href) : this._row.removeAttribute('data-href');\n }\n\n setupEvents() {\n this._onRowClick = (e) => {\n const action = e.target.closest?.('[data-action]');\n if (action) { e.stopPropagation(); this.emit('nk-action', { action: action.dataset.action, value: this.value, label: this.label }); return; }\n if (e.target === this._arrow || this._arrow.contains(e.target)) { e.stopPropagation(); this.toggle(); return; }\n this.select();\n };\n this._onKey = (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.select(); }\n };\n this._row.addEventListener('click', this._onRowClick);\n this._row.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._row?.removeEventListener('click', this._onRowClick);\n this._row?.removeEventListener('keydown', this._onKey);\n }\n\n onStringsChanged() { for (const b of this._actions.children) b.title = this.str(b.dataset.action); }\n\n onAttributeChanged(name) {\n if (name === 'label') this.assignSlots();\n else this._sync();\n if (name === 'open') this.emit('nk-toggle', { open: this.getBoolAttr('open'), value: this.value });\n }\n\n /** Fires nk-select; a listener may preventDefault to keep the item from becoming active. */\n select() {\n const ok = this.emit('nk-select', { value: this.value, label: this.label, href: this.getAttribute('href'), item: this });\n if (!ok) return;\n const tree = this.closest('nk-tree');\n if (tree) tree.setActive(this);\n else this.setBoolAttr('active', true);\n if (this.getAttribute('href')) location.assign(this.getAttribute('href'));\n }\n\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n focus(options) { this._row?.focus(options); }\n /** Roving tabindex, managed by <nk-tree>. */\n setTabbable(v) { if (this._row) this._row.tabIndex = v ? 0 : -1; }\n get tabbable() { return this._row?.tabIndex === 0; }\n get hasChildren() { return !!this._hasChildren; }\n\n get label() { return this.getAttribute('label') ?? this._labelSlot?.assignedNodes().map(n => n.textContent).join('').trim() ?? ''; }\n set label(v) { this.setAttribute('label', v); }\n get value() { return this.getAttribute('value') ?? this.label; }\n set value(v) { this.setAttribute('value', v); }\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get compact() { return this.getBoolAttr('compact'); }\n set compact(v) { this.setBoolAttr('compact', v); }\n}\n\ncustomElements.define('nk-tree-item', NkTreeItem);\nexport { NkTreeItem };\n","import { NkElement } from '../../base.js';\n\n// <nk-topbar>\n// <nk-breadcrumb>…</nk-breadcrumb>\n// <nk-btn slot=\"actions\" variant=\"share\">Share</nk-btn>\n// <nk-theme-toggle slot=\"actions\"></nk-theme-toggle>\n// </nk-topbar>\n// → <div class=\"nk-topbar\">…<div class=\"nk-topbar-actions\">…</div></div>\n// display:contents host, so the bar is a direct flex child of .nk-main.\nclass NkTopbar extends NkElement {\n\n render() {\n const bar = this.createElement('div', ['nk-topbar']);\n bar.appendChild(document.createElement('slot'));\n const actions = this.createElement('div', ['nk-topbar-actions']);\n actions.appendChild(this.createElement('slot', [], { name: 'actions' }));\n bar.appendChild(actions);\n this._wrapper.appendChild(bar);\n }\n}\n\ncustomElements.define('nk-topbar', NkTopbar);\nexport { NkTopbar };\n","import { NkElement } from '../../base.js';\n\n// <nk-breadcrumb>\n// <a href=\"/overview\">📊 Project overview</a>\n// <span>🚀 NotionKit MVP</span>\n// </nk-breadcrumb>\n// → <nav class=\"nk-breadcrumb\"><a class=\"crumb\">…</a><span class=\"sep\">/</span><span class=\"crumb current\">…</span></nav>\n//\n// The children are *cloned* into the shadow tree so the separators can be\n// interleaved and `.crumb:hover` (no ::slotted twin) applies. A\n// MutationObserver keeps the copy in step. Clicking a clone fires nk-select\n// and, unless prevented, forwards the click to the original – so an <a>\n// navigates exactly once and framework listeners see it.\nclass NkBreadcrumb extends NkElement {\n static get observedAttributes() { return ['separator']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._nav = this.createElement('nav', ['nk-breadcrumb'], { 'aria-label': this.str('breadcrumb') });\n this._wrapper.appendChild(this._nav);\n this.projectLightDom();\n }\n\n projectLightDom() {\n if (!this._nav) return;\n const originals = [...this.children];\n const sep = this.getAttribute('separator') ?? '/';\n const signature = originals.map(o => o.outerHTML).join('') + sep;\n if (signature === this._signature) return;\n this._signature = signature;\n this._nav.innerHTML = '';\n const explicitCurrent = originals.some(o => o.hasAttribute('current') || o.classList.contains('current'));\n originals.forEach((original, i) => {\n if (i > 0) {\n const s = this.createElement('span', ['sep'], { 'aria-hidden': 'true' });\n s.textContent = sep;\n this._nav.appendChild(s);\n }\n const clone = original.cloneNode(true);\n clone.removeAttribute('slot');\n clone.classList.add('crumb');\n const current = explicitCurrent ? (original.hasAttribute('current') || original.classList.contains('current')) : i === originals.length - 1;\n clone.classList.toggle('current', current);\n if (current) clone.setAttribute('aria-current', 'page');\n clone.dataset.index = i;\n this._nav.appendChild(clone);\n });\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const clone = e.target.closest('.crumb');\n if (!clone) return;\n e.preventDefault();\n const index = Number(clone.dataset.index);\n // Look the original up at click time: a framework may have replaced it.\n const original = this.children[index];\n const ok = this.emit('nk-select', {\n index, label: clone.textContent.trim(), href: original?.getAttribute('href') ?? null,\n value: original?.dataset.value ?? original?.getAttribute('href') ?? clone.textContent.trim(),\n current: clone.classList.contains('current'),\n });\n if (ok) original?.click();\n };\n this._nav.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._nav?.removeEventListener('click', this._onClick); }\n\n onAttributeChanged() { this.projectLightDom(); }\n onStringsChanged() { this._nav.setAttribute('aria-label', this.str('breadcrumb')); }\n\n get separator() { return this.getAttribute('separator') ?? '/'; }\n set separator(v) { this.setAttribute('separator', v); }\n}\n\ncustomElements.define('nk-breadcrumb', NkBreadcrumb);\nexport { NkBreadcrumb };\n","import { NkElement, getCurrentTheme } from '../../base.js';\n\n// <nk-theme-toggle slot=\"actions\"></nk-theme-toggle>\n// → <button class=\"nk-topbar-btn nk-theme-toggle\">🌙</button>\n// Flips data-theme on <html> (the only theme source), remembers the choice in\n// localStorage (`storage-key`, default nk-theme), applies a stored or\n// system preference on first connect when <html> carries no theme yet, and\n// accepts postMessage({ nkTheme }) from a parent page (the landing page's\n// embedded demo uses that).\nclass NkThemeToggle extends NkElement {\n static get observedAttributes() { return ['storage-key', 'title'];\n\n }\n\n render() {\n this._btn = this.createElement('button', ['nk-topbar-btn', 'nk-theme-toggle'], { type: 'button' });\n this._syncTitle();\n this._wrapper.appendChild(this._btn);\n const root = document.documentElement;\n let stored = null;\n try { stored = localStorage.getItem(this.storageKey); } catch {}\n if (stored === 'light' || stored === 'dark') root.setAttribute('data-theme', stored);\n else if (!root.hasAttribute('data-theme')) root.setAttribute('data-theme', matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');\n this._syncGlyph();\n }\n\n _syncGlyph() {\n if (this._btn) this._btn.textContent = getCurrentTheme() === 'dark' ? '☀️' : '🌙';\n }\n\n _syncTheme(theme) {\n super._syncTheme(theme);\n this._syncGlyph();\n }\n\n setupEvents() {\n this._onClick = () => this.apply(getCurrentTheme() === 'dark' ? 'light' : 'dark');\n this._onMessage = (e) => { const t = e.data?.nkTheme; if (t === 'light' || t === 'dark') this.apply(t); };\n this._btn.addEventListener('click', this._onClick);\n window.addEventListener('message', this._onMessage);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n window.removeEventListener('message', this._onMessage);\n }\n\n _syncTitle() { this._btn.title = this.getAttribute('title') || this.str('toggleTheme'); }\n onStringsChanged() { this._syncTitle(); }\n\n onAttributeChanged(name) {\n if (name === 'title' && this._btn) this._syncTitle();\n }\n\n /** Sets the theme on <html>, persists it and reports it. */\n apply(theme) {\n document.documentElement.setAttribute('data-theme', theme);\n try { localStorage.setItem(this.storageKey, theme); } catch {}\n this._syncGlyph();\n this.emit('nk-change', { value: theme });\n }\n\n get storageKey() { return this.getAttribute('storage-key') || 'nk-theme'; }\n get value() { return getCurrentTheme(); }\n set value(v) { this.apply(v); }\n}\n\ncustomElements.define('nk-theme-toggle', NkThemeToggle);\nexport { NkThemeToggle };\n","import { NkElement } from '../../base.js';\n\n// <nk-tab-bar value=\"inbox\">\n// <nk-tab-bar-item icon=\"🏠\" value=\"home\">Home</nk-tab-bar-item>\n// <nk-tab-bar-item icon=\"📥\" value=\"inbox\">Inbox</nk-tab-bar-item>\n// <nk-tab-bar-item icon=\"☰\" drawer>More</nk-tab-bar-item>\n// </nk-tab-bar>\n// → <nav class=\"nk-tab-bar\">…</nav>\n//\n// The thumb-reachable twin of the sidebar for phones and installed PWAs. As\n// the last child of <nk-app> it is slotted into .nk-main below the scrolling\n// page, so it never moves and needs no bottom padding anywhere. The\n// stylesheet hides it above 860px – there the sidebar is the navigation –\n// and shows it below; `always` shows it at every width (previews, phone\n// frames), `fixed` pins it to the viewport (standalone PWAs) with a spacer\n// holding its place, `floating` makes it a capsule. Exactly one item is `active`; a\n// `drawer` item opens the sidebar instead of becoming active.\nclass NkTabBar extends NkElement {\n static get observedAttributes() { return ['value', 'always', 'fixed', 'floating', 'label']; }\n\n render() {\n this._bar = this.createElement('nav', ['nk-tab-bar']);\n this._slot = document.createElement('slot');\n this._bar.appendChild(this._slot);\n // With `fixed` the bar leaves the flow; the spacer (styled by the\n // stylesheet, shown only then) keeps its height so the page ends above it.\n this._spacer = this.createElement('div', ['nk-tab-bar-spacer']);\n this._wrapper.append(this._bar, this._spacer);\n this._syncBar();\n this._sync();\n }\n\n get items() { return [...this.querySelectorAll(':scope > nk-tab-bar-item')]; }\n\n // Attribute access only: on the first connect the children are in the DOM\n // but not yet upgraded, so their accessors do not exist.\n _valueOf(item) { return item.getAttribute('value') ?? item.getAttribute('label') ?? item.textContent.trim(); }\n\n _syncBar() {\n this._bar.classList.toggle('always', this.getBoolAttr('always'));\n this._bar.classList.toggle('fixed', this.getBoolAttr('fixed'));\n this._bar.classList.toggle('floating', this.getBoolAttr('floating'));\n const label = this.getAttribute('label');\n label ? this._bar.setAttribute('aria-label', label) : this._bar.removeAttribute('aria-label');\n }\n\n _sync() {\n const items = this.items.filter(i => !i.hasAttribute('drawer'));\n if (!items.length) return;\n let value = this.getAttribute('value');\n if (value === null || !items.some(i => this._valueOf(i) === value)) {\n const preset = items.find(i => i.hasAttribute('active')) || items[0];\n value = this._valueOf(preset);\n }\n for (const item of items) {\n if (this._valueOf(item) === value) item.setAttribute('active', ''); else item.removeAttribute('active');\n }\n this._value = value;\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._slot.addEventListener('slotchange', this._onSlot);\n this._sync();\n }\n\n teardownEvents() {\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged(name) {\n if (name !== 'value') { this._syncBar(); return; }\n const before = this._value;\n this._sync();\n if (this._value !== before) this.emit('nk-change', { value: this._value });\n }\n\n get value() { return this._value ?? this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n get always() { return this.getBoolAttr('always'); }\n set always(v) { this.setBoolAttr('always', v); }\n get fixed() { return this.getBoolAttr('fixed'); }\n set fixed(v) { this.setBoolAttr('fixed', v); }\n get floating() { return this.getBoolAttr('floating'); }\n set floating(v) { this.setBoolAttr('floating', v); }\n}\n\ncustomElements.define('nk-tab-bar', NkTabBar);\nexport { NkTabBar };\n","import { NkElement } from '../../base.js';\n\n// <nk-tab-bar-item icon=\"📥\" value=\"inbox\" active>Inbox</nk-tab-bar-item>\n// → <button class=\"nk-tab-bar-item active\" type=\"button\">\n// <span class=\"icon\">📥</span><span class=\"label\">Inbox</span></button>\n//\n// One destination of <nk-tab-bar>. A click emits nk-select (cancelable);\n// inside a bar it then moves the bar's `value`, standalone it sets its own\n// `active`. With `href` it navigates afterwards, with `drawer` it opens the\n// nearest <nk-sidebar> as a drawer instead of becoming active – the usual\n// fifth item (\"More\"). The icon is an attribute or a `slot=\"icon\"` node.\nclass NkTabBarItem extends NkElement {\n static get observedAttributes() { return ['icon', 'label', 'value', 'href', 'active', 'disabled', 'drawer']; }\n\n render() {\n this._btn = this.createElement('button', ['nk-tab-bar-item'], { type: 'button' });\n this._iconSlot = this.createElement('slot', [], { name: 'icon' });\n this._icon = this.createElement('span', ['icon'], { 'aria-hidden': 'true' });\n this._iconSlot.appendChild(this._icon);\n this._label = this.createElement('span', ['label']);\n this._labelSlot = document.createElement('slot');\n this._labelText = document.createTextNode('');\n this._labelSlot.appendChild(this._labelText);\n this._label.appendChild(this._labelSlot);\n this._btn.append(this._iconSlot, this._label);\n this._wrapper.appendChild(this._btn);\n this._sync();\n }\n\n _sync() {\n this._icon.textContent = this.getAttribute('icon') ?? '';\n this._labelText.data = this.getAttribute('label') ?? '';\n const active = this.getBoolAttr('active');\n this._btn.classList.toggle('active', active);\n active ? this._btn.setAttribute('aria-current', 'page') : this._btn.removeAttribute('aria-current');\n this._btn.disabled = this.getBoolAttr('disabled');\n const href = this.getAttribute('href');\n href ? this._btn.setAttribute('data-href', href) : this._btn.removeAttribute('data-href');\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._btn.addEventListener('click', this._onClick);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n }\n\n select() {\n if (this.getBoolAttr('disabled')) return;\n const href = this.getAttribute('href');\n const ok = this.emit('nk-select', { value: this.value, label: this.label, href, item: this, drawer: this.getBoolAttr('drawer') });\n if (!ok) return;\n if (this.getBoolAttr('drawer')) {\n const sidebar = this.closest('nk-app')?.querySelector('nk-sidebar') ?? document.querySelector('nk-sidebar');\n sidebar?.toggle?.();\n return;\n }\n const bar = this.closest('nk-tab-bar');\n if (bar) bar.value = this.value;\n else this.setBoolAttr('active', true);\n if (href) location.assign(href);\n }\n\n onAttributeChanged() { this._sync(); }\n focus(o) { this._btn?.focus(o); }\n\n get value() { return this.getAttribute('value') ?? this.label; }\n set value(v) { this.setAttribute('value', v); }\n get label() { return this.getAttribute('label') ?? this.textContent.trim(); }\n set label(v) { this.setAttribute('label', v); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get drawer() { return this.getBoolAttr('drawer'); }\n set drawer(v) { this.setBoolAttr('drawer', v); }\n}\n\ncustomElements.define('nk-tab-bar-item', NkTabBarItem);\nexport { NkTabBarItem };\n","import { NkElement } from '../../base.js';\n\n// <nk-page icon=\"🚀\" cover full small>\n// <nk-page-title>NotionKit MVP</nk-page-title>\n// <nk-page-actions>…</nk-page-actions>\n// <p class=\"lead\">…</p>\n// …blocks…\n// </nk-page>\n// → <div class=\"nk-page-scroll\"><div class=\"nk-cover\"></div><div class=\"nk-page\">\n// <div class=\"nk-page-icon\">🚀</div>…</div></div>\n//\n// The host is display:contents, so .nk-page-scroll is the flex child of\n// .nk-main that scrolls. `narrow` drops the scroll wrapper for pages that are\n// the document itself (landing / docs skeleton). The page icon is rendered\n// here because its ::slotted twin is keyed on the parent (.nk-page). `full` and\n// `small` are Notion's page options – full width, 14px text – set on the page.\nclass NkPage extends NkElement {\n static get observedAttributes() { return ['icon', 'cover', 'narrow', 'full', 'small']; }\n\n render() {\n this._page = this.createElement('div', ['nk-page']);\n this._icon = this.createElement('div', ['nk-page-icon'], { role: 'button', title: this.str('changeIcon') });\n this._iconSlot = this.createElement('slot', [], { name: 'icon' });\n this._iconSlot.appendChild(this._icon);\n this._page.appendChild(this._iconSlot);\n this._page.appendChild(document.createElement('slot'));\n this._cover = this.createElement('div', ['nk-cover']);\n this._coverSlot = this.createElement('slot', [], { name: 'cover' });\n this._coverSlot.appendChild(this._cover);\n this._build();\n }\n\n _build() {\n this._wrapper.replaceChildren();\n if (this.getBoolAttr('narrow')) {\n this._wrapper.append(this._coverSlot, this._page);\n } else {\n const scroll = this.createElement('div', ['nk-page-scroll']);\n scroll.append(this._coverSlot, this._page);\n this._wrapper.appendChild(scroll);\n }\n this._sync();\n }\n\n _sync() {\n const icon = this.getAttribute('icon') || '';\n // Fallback content: write on a change only (see nk-switch).\n if (this._icon.textContent !== icon) this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n this._cover.style.display = this.getBoolAttr('cover') ? '' : 'none';\n // `covered` is the stylesheet's twin of `.nk-cover + .nk-page` with an\n // icon: the icon overlaps the cover and the page drops its top padding.\n // Without a cover (attribute or a slotted nk-page-cover) the icon sits in\n // the padding; without an icon (attribute or slot=\"icon\") the page keeps\n // it, so the title never touches the cover (NotionKit 1.13.0).\n const filled = slot => slot.assignedNodes().some(n => n.nodeType === Node.ELEMENT_NODE || n.data.trim());\n const covered = this.getBoolAttr('cover') || filled(this._coverSlot), iconed = !!icon || filled(this._iconSlot);\n this._page.classList.toggle('covered', covered && iconed);\n this._page.classList.toggle('full', this.getBoolAttr('full'));\n this._page.classList.toggle('small', this.getBoolAttr('small'));\n }\n\n setupEvents() {\n this._onIcon = () => this.emit('nk-action', { action: 'icon', value: this.getAttribute('icon') });\n this._onCover = () => this._sync();\n this._icon.addEventListener('click', this._onIcon);\n this._coverSlot.addEventListener('slotchange', this._onCover);\n this._iconSlot.addEventListener('slotchange', this._onCover);\n this._sync();\n }\n\n teardownEvents() {\n this._icon?.removeEventListener('click', this._onIcon);\n this._coverSlot?.removeEventListener('slotchange', this._onCover);\n this._iconSlot?.removeEventListener('slotchange', this._onCover);\n }\n\n onStringsChanged() { this._icon.title = this.str('changeIcon'); }\n\n onAttributeChanged(name) {\n if (name === 'narrow') this._build();\n else this._sync();\n }\n\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n get cover() { return this.getBoolAttr('cover'); }\n set cover(v) { this.setBoolAttr('cover', v); }\n get full() { return this.getBoolAttr('full'); }\n set full(v) { this.setBoolAttr('full', v); }\n get small() { return this.getBoolAttr('small'); }\n set small(v) { this.setBoolAttr('small', v); }\n}\n\ncustomElements.define('nk-page', NkPage);\nexport { NkPage };\n","import { NkElement } from '../../base.js';\n\n// <nk-page-cover slot=\"cover\"></nk-page-cover> → the token gradient\n// <nk-page-cover slot=\"cover\" src=\"cover.jpg\" position=\"center 30%\"></nk-page-cover> → a picture\n// → <div class=\"nk-cover\"><img src=\"cover.jpg\" alt=\"\"></div>: the picture fills\n// the band, cropped rather than stretched; `position` moves the crop, as\n// Notion's \"Reposition\" does. The gradient stays underneath while it loads.\n// The band is as tall as the token --nk-cover-height (200px), which reaches\n// the shadow root: style=\"--nk-cover-height: 30vh\" sets one cover.\nclass NkPageCover extends NkElement {\n static get observedAttributes() { return ['src', 'position']; }\n\n render() {\n this._cover = this.createElement('div', ['nk-cover']);\n this._img = this.createElement('img', [], { alt: '' });\n this._wrapper.appendChild(this._cover);\n this._sync();\n }\n\n _sync() {\n const src = this.getAttribute('src');\n if (src) {\n this._img.src = src;\n this._img.style.objectPosition = this.getAttribute('position') || '';\n if (!this._img.isConnected) this._cover.appendChild(this._img);\n } else this._img.remove();\n }\n\n onAttributeChanged() { this._sync(); }\n\n get src() { return this.getAttribute('src'); }\n set src(v) { v == null ? this.removeAttribute('src') : this.setAttribute('src', v); }\n}\n\ncustomElements.define('nk-page-cover', NkPageCover);\nexport { NkPageCover };\n","import { NkElement } from '../../base.js';\n\n// <nk-page-title>NotionKit MVP</nk-page-title> → <h1 class=\"nk-page-title\">\n// <nk-page-title editable placeholder=\"Untitled\">…</nk-page-title>\n// With `editable` the text is copied into the shadow heading (contenteditable\n// cannot edit slotted nodes) and nk-change fires on blur / Enter.\nclass NkPageTitle extends NkElement {\n static get observedAttributes() { return ['editable', 'placeholder', 'value']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._h1 = this.createElement('h1', ['nk-page-title']);\n this._slot = document.createElement('slot');\n this._h1.appendChild(this._slot);\n this._wrapper.appendChild(this._h1);\n this._sync();\n }\n\n _sync() {\n const editable = this.getBoolAttr('editable');\n if (editable) {\n if (this._slot.isConnected) this._slot.remove();\n this._h1.setAttribute('contenteditable', 'plaintext-only');\n this._h1.setAttribute('spellcheck', 'false');\n this._h1.setAttribute('role', 'textbox');\n this._h1.setAttribute('aria-label', this.str('title'));\n const text = this.getAttribute('value') ?? this.textContent.trim();\n if (this._h1.textContent !== text && document.activeElement !== this) this._h1.textContent = text;\n this._h1.setAttribute('data-placeholder', this.getAttribute('placeholder') || '');\n } else {\n this._h1.removeAttribute('contenteditable');\n this._h1.removeAttribute('role');\n if (this.hasAttribute('value')) { if (this._slot.isConnected) this._slot.remove(); this._h1.textContent = this.getAttribute('value'); }\n else if (!this._slot.isConnected) { this._h1.textContent = ''; this._h1.appendChild(this._slot); }\n }\n }\n\n projectLightDom() { if (this._h1 && !this.hasAttribute('value')) this._sync(); }\n\n setupEvents() {\n this._committed = this.value;\n this._onKey = (e) => { if (e.key === 'Enter') { e.preventDefault(); this._h1.blur(); } };\n this._onBlur = () => this._commit();\n this._h1.addEventListener('keydown', this._onKey);\n this._h1.addEventListener('blur', this._onBlur);\n }\n\n teardownEvents() {\n this._h1?.removeEventListener('keydown', this._onKey);\n this._h1?.removeEventListener('blur', this._onBlur);\n }\n\n _commit() {\n const value = this._h1.textContent.trim();\n if (value === this._committed) return;\n this._committed = value;\n this.emit('nk-change', { value });\n }\n\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { if (this._h1.hasAttribute('role')) this._h1.setAttribute('aria-label', this.str('title')); }\n\n get value() { return this.getBoolAttr('editable') ? (this._h1?.textContent.trim() ?? '') : (this.getAttribute('value') ?? this.textContent.trim()); }\n set value(v) { this.setAttribute('value', v); }\n get editable() { return this.getBoolAttr('editable'); }\n set editable(v) { this.setBoolAttr('editable', v); }\n focus(o) { this._h1?.focus(o); }\n}\n\ncustomElements.define('nk-page-title', NkPageTitle);\nexport { NkPageTitle };\n","import { NkElement } from '../../base.js';\n\n// <nk-page-actions><span>👤 Ada</span><span>📅 12 May</span><span>🏷️ <nk-tag color=\"purple\">Design</nk-tag></span></nk-page-actions>\n// → <div class=\"nk-page-meta\">…</div> – the meta row under the title\nclass NkPageActions extends NkElement {\n render() {\n const row = this.createElement('div', ['nk-page-meta']);\n row.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(row);\n }\n}\n\ncustomElements.define('nk-page-actions', NkPageActions);\nexport { NkPageActions };\n","import { NkElement } from '../../base.js';\n\n// <nk-block-host handle><p>Editable content lives here.</p></nk-block-host>\n// → <div class=\"nk-block-host\"><span class=\"nk-block-handle\">⠿</span>…</div>\n// The optical shell for editor content (hover wash, focus ring, drop target).\n// Mount an editor into the light DOM; <nk-editor> (v1.1) does that for TipTap.\nclass NkBlockHost extends NkElement {\n static get observedAttributes() { return ['handle', 'drop-target']; }\n\n render() {\n this._box = this.createElement('div', ['nk-block-host']);\n this._handle = this.createElement('span', ['nk-block-handle'], { 'aria-hidden': 'true' });\n this._handle.textContent = '⠿';\n this._box.appendChild(this._handle);\n this._box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n this._handle.style.display = this.getBoolAttr('handle') ? '' : 'none';\n this._box.classList.toggle('nk-drop-target', this.getBoolAttr('drop-target'));\n }\n\n onAttributeChanged() { this._sync(); }\n\n get handle() { return this.getBoolAttr('handle'); }\n set handle(v) { this.setBoolAttr('handle', v); }\n get dropTarget() { return this.getBoolAttr('drop-target'); }\n set dropTarget(v) { this.setBoolAttr('drop-target', v); }\n}\n\ncustomElements.define('nk-block-host', NkBlockHost);\nexport { NkBlockHost };\n","import { NkElement } from '../../base.js';\n\n// <nk-banner variant=\"info\">ℹ️ <span>Text</span><button slot=\"action\" type=\"button\">Open</button></nk-banner>\n// → <div class=\"nk-banner info\">…<button class=\"b-action\" type=\"button\">Open</button></div>\n//\n// The action is a <button>, which NotionKit (1.11.0) strips down to\n// underlined text; below 860px it moves under the text.\nconst VARIANTS = ['info', 'success', 'warning', 'danger'];\n\nclass NkBanner extends NkElement {\n static get observedAttributes() { return ['variant']; }\n\n render() {\n this._box = this.createElement('div', this._classes(), { role: 'status' });\n this._box.appendChild(document.createElement('slot'));\n this._box.appendChild(this.createElement('slot', [], { name: 'action' }));\n this._wrapper.appendChild(this._box);\n }\n\n _classes() {\n const v = this.getAttribute('variant');\n return ['nk-banner', ...(VARIANTS.includes(v) ? [v] : [])];\n }\n\n onAttributeChanged() { if (this._box) this._box.className = this._classes().join(' '); }\n\n get variant() { return this.getAttribute('variant'); }\n set variant(v) { v ? this.setAttribute('variant', v) : this.removeAttribute('variant'); }\n}\n\ncustomElements.define('nk-banner', NkBanner);\nexport { NkBanner };\n","import { NkElement } from '../../base.js';\n\n// <nk-empty icon=\"🗂️\" title=\"No entries yet\" desc=\"Create the first one.\"><nk-btn variant=\"primary\" small>+ New</nk-btn></nk-empty>\n// → <div class=\"nk-empty\"><div class=\"e-icon\">🗂️</div><div class=\"e-title\">…</div><div class=\"e-desc\">…</div><div class=\"e-actions\">…</div></div>\n// `title` is the heading, never a tooltip – see NkElement.takeTitle(). The\n// default slot sits in .e-actions, so several buttons keep 8px apart.\nclass NkEmpty extends NkElement {\n static get observedAttributes() { return ['icon', 'title', 'desc']; }\n\n render() {\n const box = this.createElement('div', ['nk-empty']);\n this._parts = {};\n for (const [slot, cls] of [['icon', 'e-icon'], ['title', 'e-title'], ['desc', 'e-desc']]) {\n const el = this.createElement('div', [cls]);\n const s = this.createElement('slot', [], { name: slot });\n s.appendChild(el);\n box.appendChild(s);\n this._parts[slot] = el;\n }\n const actions = this.createElement('div', ['e-actions']);\n actions.appendChild(document.createElement('slot'));\n box.appendChild(actions);\n this._wrapper.appendChild(box);\n this.takeTitle();\n this._sync();\n }\n\n _sync() {\n for (const [slot, el] of Object.entries(this._parts)) {\n const v = slot === 'title' ? this._titleText : this.getAttribute(slot);\n el.textContent = v || '';\n el.style.display = v ? '' : 'none';\n }\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n}\n\ncustomElements.define('nk-empty', NkEmpty);\nexport { NkEmpty };\n","import { NkElement } from '../../base.js';\n\n// <nk-skeleton height=\"18\" width=\"60%\"></nk-skeleton>\n// <nk-skeleton lines=\"3\" widths=\"100%,85%,40%\"></nk-skeleton>\n// → <div class=\"nk-skeleton\" style=\"height:…;width:…\"></div> × lines\nclass NkSkeleton extends NkElement {\n static get observedAttributes() { return ['lines', 'height', 'width', 'widths']; }\n\n render() { this._build(); }\n\n _build() {\n this._wrapper.replaceChildren();\n const lines = Math.max(1, Number(this.getAttribute('lines')) || 1);\n const height = this.getAttribute('height') || '13';\n const widths = (this.getAttribute('widths') || '').split(',').map(s => s.trim()).filter(Boolean);\n const width = this.getAttribute('width');\n for (let i = 0; i < lines; i++) {\n const line = this.createElement('div', ['nk-skeleton'], { 'aria-hidden': 'true' });\n line.style.height = /^\\d+(\\.\\d+)?$/.test(height) ? `${height}px` : height;\n const w = widths[i] ?? width;\n if (w) line.style.width = w;\n this._wrapper.appendChild(line);\n }\n }\n\n onAttributeChanged() { this._build(); }\n}\n\ncustomElements.define('nk-skeleton', NkSkeleton);\nexport { NkSkeleton };\n","import { NkElement } from '../../base.js';\n\n// <nk-synced badge=\"⟳ 3 places\">…</nk-synced>\n// → <div class=\"nk-synced\"><span class=\"synced-badge\">⟳ 3 places</span>…</div>\nclass NkSynced extends NkElement {\n static get observedAttributes() { return ['badge']; }\n\n render() {\n const box = this.createElement('div', ['nk-synced']);\n this._badge = this.createElement('span', ['synced-badge']);\n box.appendChild(this._badge);\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() { this._badge.textContent = this.getAttribute('badge') ?? this.str('synced'); }\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n\n get badge() { return this.getAttribute('badge'); }\n set badge(v) { this.setAttribute('badge', v); }\n}\n\ncustomElements.define('nk-synced', NkSynced);\nexport { NkSynced };\n","// Placement for elements that float over the page – <nk-menu floating>,\n// <nk-calendar floating>, <nk-tooltip>: the host is a fixed box put under\n// its anchor. A transformed ancestor – an open nk-modal or nk-dialog –\n// becomes the containing block of a fixed box, so the frame it really sits\n// in is measured and taken off.\n\n/** The border box of an element, or of the first descendant with one (display: contents hosts). */\nexport function boxOf(el) {\n if (el.getClientRects().length) return el.getBoundingClientRect();\n for (const child of [...(el.shadowRoot?.children ?? []), ...el.children]) {\n const r = boxOf(child);\n if (r.width || r.height) return r;\n }\n return el.getBoundingClientRect();\n}\n\n/**\n * Where a fixed `host` really sits: the viewport position of its containing\n * block's left, top and right edges – the viewport's own, unless a\n * transformed ancestor takes its place – and the host's size.\n */\nfunction frameOf(host) {\n const s = host.style;\n s.top = '0px'; s.left = '0px'; s.right = 'auto';\n const a = host.getBoundingClientRect();\n s.left = 'auto'; s.right = '0px';\n const b = host.getBoundingClientRect();\n return { x: a.left, y: a.top, right: b.right, width: a.width, height: a.height };\n}\n\n/**\n * Puts `host` 6px below `target` – an element or a rect ({ left, top, right,\n * bottom }, a DOMRect) – centred on it: above with side=\"top\", or where the\n * window ends below; kept 8px inside the window. For <nk-tooltip>.\n */\nexport function placeNear(host, target, side = 'bottom', gap = 6) {\n const r = target instanceof Element ? boxOf(target) : target;\n const f = frameOf(host), w = f.width, h = f.height;\n const below = r.bottom + gap, above = r.top - gap - h;\n const top = side === 'top' ? (above < 8 ? below : above) : (below + h > innerHeight - 8 ? above : below);\n const left = Math.min(Math.max(8, (r.left + r.right) / 2 - w / 2), innerWidth - 8 - w);\n host.style.top = `${Math.round(top - f.y)}px`;\n host.style.left = `${Math.round(left - f.x)}px`;\n host.style.right = 'auto';\n}\n\n/**\n * Puts `host` 6px under `anchor`, right edges aligned – left edges with\n * align=\"start\". Where the window ends below and there is more room above,\n * it opens upwards; either way --_nk-float-max caps its height to the room\n * there, and a longer menu scrolls.\n */\nexport function placeUnder(host, anchor, align) {\n const r = boxOf(anchor), gap = 6, edge = 8;\n host.style.removeProperty('--_nk-float-max');\n const f = frameOf(host);\n const roomBelow = innerHeight - r.bottom - gap - edge, roomAbove = r.top - gap - edge;\n const up = f.height > roomBelow && roomAbove > roomBelow;\n const room = Math.max(0, Math.floor(up ? roomAbove : roomBelow));\n if (f.height > room) host.style.setProperty('--_nk-float-max', `${room}px`);\n host.style.top = `${(up ? r.top - gap - Math.min(f.height, room) : r.bottom + gap) - f.y}px`;\n if (align === 'start') { host.style.left = `${r.left - f.x}px`; host.style.right = 'auto'; }\n else { host.style.right = `${f.right - Math.min(r.right, innerWidth - edge)}px`; host.style.left = 'auto'; }\n}\n","import { NkElement } from '../../base.js';\nimport { boxOf } from '../../util/floating.js';\n\n// <nk-tabs value=\"notes\">\n// <nk-tab value=\"notes\">📝 Notes</nk-tab>\n// <nk-tab value=\"tasks\">✅ Tasks</nk-tab>\n// <div slot=\"panel\" data-tab=\"notes\" class=\"nk-tab-panel\">…</div>\n// <div slot=\"panel\" data-tab=\"tasks\" class=\"nk-tab-panel\">…</div>\n// </nk-tabs>\n// → <div class=\"nk-tabs\" role=\"tablist\">…</div> + the panels below it.\n// The tabs keep one tab active and hide every panel whose data-tab does not\n// match `value` (through the hidden attribute – the panels stay yours).\n// `scroll` (NotionKit 1.12.0) keeps many tabs in one row that scrolls\n// sideways and holds the active tab in view – after the first layout, on\n// every change and when the row's width changes – as <nk-segmented scroll>.\nconst KEYS = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n\nclass NkTabs extends NkElement {\n static get observedAttributes() { return ['value', 'scroll']; }\n\n render() {\n this._strip = this.createElement('div', ['nk-tabs'], { role: 'tablist' });\n this._tabSlot = document.createElement('slot');\n this._strip.appendChild(this._tabSlot);\n this._panelSlot = this.createElement('slot', [], { name: 'panel' });\n this._wrapper.append(this._strip, this._panelSlot);\n this._sync();\n }\n\n get tabs() { return [...this.querySelectorAll(':scope > nk-tab')]; }\n get panels() { return [...this.querySelectorAll(':scope > [slot=\"panel\"]')]; }\n\n _sync() {\n const tabs = this.tabs;\n if (!tabs.length) return;\n let value = this.getAttribute('value');\n if (value === null || !tabs.some(t => t.getAttribute('value') === value || (t.getAttribute('value') === null && t.textContent.trim() === value))) {\n const preset = tabs.find(t => t.hasAttribute('active')) || tabs[0];\n value = preset.getAttribute('value') ?? preset.textContent.trim();\n }\n for (const tab of tabs) {\n const v = tab.getAttribute('value') ?? tab.textContent.trim();\n if (v === value) tab.setAttribute('active', ''); else tab.removeAttribute('active');\n }\n for (const panel of this.panels) panel.hidden = panel.dataset.tab !== value;\n this._value = value;\n this._strip.classList.toggle('scroll', this.getBoolAttr('scroll'));\n this._reveal(this._revealed ? 'smooth' : 'instant');\n }\n\n /** Scrolls the row the least distance that shows the active tab whole. */\n _reveal(behavior) {\n if (!this.getBoolAttr('scroll') || !this._strip?.clientWidth) return;\n const tab = this.tabs.find(t => t.hasAttribute('active'));\n if (!tab) return;\n const row = this._strip.getBoundingClientRect(), r = boxOf(tab), pad = 8;\n const delta = r.left < row.left ? r.left - row.left - pad : r.right > row.right ? r.right - row.right + pad : 0;\n const smooth = behavior === 'smooth' && !matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (delta) this._strip.scrollBy({ left: delta, behavior: smooth ? 'smooth' : 'instant' });\n this._revealed = true;\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._onKey = (e) => {\n const dir = KEYS[e.key];\n if (!dir) return;\n const tabs = this.tabs.filter(t => !t.hasAttribute('disabled'));\n const i = tabs.indexOf(e.target.closest?.('nk-tab'));\n if (i < 0 || tabs.length < 2) return;\n e.preventDefault();\n const next = tabs[(i + dir + tabs.length) % tabs.length];\n next.select();\n next.focus();\n };\n this._tabSlot.addEventListener('slotchange', this._onSlot);\n this._panelSlot.addEventListener('slotchange', this._onSlot);\n this.addEventListener('keydown', this._onKey);\n this._resize = new ResizeObserver(() => this._reveal('instant'));\n this._resize.observe(this._strip);\n this._sync();\n }\n\n teardownEvents() {\n this._tabSlot?.removeEventListener('slotchange', this._onSlot);\n this._panelSlot?.removeEventListener('slotchange', this._onSlot);\n this.removeEventListener('keydown', this._onKey);\n this._resize?.disconnect();\n }\n\n onAttributeChanged() {\n const before = this._value;\n this._sync();\n if (this._value !== before) this.emit('nk-change', { value: this._value });\n }\n\n get value() { return this._value ?? this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n get scroll() { return this.getBoolAttr('scroll'); }\n set scroll(v) { this.setBoolAttr('scroll', v); }\n}\n\ncustomElements.define('nk-tabs', NkTabs);\nexport { NkTabs };\n","import { NkElement } from '../../base.js';\n\n// <nk-tab value=\"notes\" active>📝 Notes</nk-tab> → <span class=\"nk-tab active\" role=\"tab\">\nclass NkTab extends NkElement {\n static get observedAttributes() { return ['active', 'value', 'disabled']; }\n\n render() {\n this._tab = this.createElement('span', ['nk-tab'], { role: 'tab' });\n this._tab.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._tab);\n this._sync();\n }\n\n _sync() {\n const active = this.getBoolAttr('active');\n this._tab.classList.toggle('active', active);\n this._tab.setAttribute('aria-selected', active ? 'true' : 'false');\n this._tab.tabIndex = active ? 0 : -1;\n this._tab.setAttribute('aria-disabled', this.getBoolAttr('disabled') ? 'true' : 'false');\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._onKey = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.select(); } };\n this._tab.addEventListener('click', this._onClick);\n this._tab.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._tab?.removeEventListener('click', this._onClick);\n this._tab?.removeEventListener('keydown', this._onKey);\n }\n\n select() {\n if (this.getBoolAttr('disabled')) return;\n const ok = this.emit('nk-select', { value: this.value, label: this.textContent.trim(), item: this });\n if (!ok) return;\n const tabs = this.closest('nk-tabs');\n if (tabs) tabs.value = this.value;\n else this.setBoolAttr('active', true);\n }\n\n onAttributeChanged() { this._sync(); }\n focus(o) { this._tab?.focus(o); }\n\n get value() { return this.getAttribute('value') ?? this.textContent.trim(); }\n set value(v) { this.setAttribute('value', v); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n}\n\ncustomElements.define('nk-tab', NkTab);\nexport { NkTab };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-segmented name=\"range\" value=\"week\">\n// <button value=\"week\">Week</button><button value=\"month\">Month</button>\n// </nk-segmented>\n// → <div class=\"nk-segmented\">…</div> with .active on the chosen button.\n// The buttons stay in the light DOM (their look comes from the ::slotted\n// twins); the element sets type/role, moves .active and submits the value.\n// With `scroll` the chosen option is kept in view – after the first layout,\n// on every change and when the row's width changes – by scrolling the row\n// alone, never the page, by a relative distance, so right-to-left works too.\nconst KEYS = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n\nclass NkSegmented extends NkFormElement {\n static get observedAttributes() { return ['value', 'name', 'disabled', 'scroll', 'wrap']; }\n\n render() {\n this._box = this.createElement('div', ['nk-segmented'], { role: 'radiogroup' });\n this._slot = document.createElement('slot');\n this._box.appendChild(this._slot);\n this._wrapper.appendChild(this._box);\n this._syncBox();\n this._sync();\n }\n\n // `scroll`: one horizontally scrollable row, scrollbar hidden; `wrap`: rows.\n _syncBox() {\n this._box.classList.toggle('scroll', this.getBoolAttr('scroll'));\n this._box.classList.toggle('wrap', this.getBoolAttr('wrap'));\n }\n\n get buttons() { return this._slot?.assignedElements().filter(el => el.localName === 'button') ?? []; }\n _valueOf(btn) { return btn.getAttribute('value') ?? btn.textContent.trim(); }\n\n _sync() {\n const buttons = this.buttons;\n if (!buttons.length) return;\n let value = this.getAttribute('value');\n if (value === null || !buttons.some(b => this._valueOf(b) === value)) {\n value = this._valueOf(buttons.find(b => b.classList.contains('active')) || buttons[0]);\n }\n if (this._defaultValue === undefined) this._defaultValue = value;\n const disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n for (const b of buttons) {\n const on = this._valueOf(b) === value;\n b.type = 'button';\n b.setAttribute('role', 'radio');\n b.setAttribute('aria-checked', on ? 'true' : 'false');\n b.classList.toggle('active', on);\n b.tabIndex = on ? 0 : -1;\n b.disabled = disabled;\n }\n this._value = value;\n this.setFormValue(value);\n this._reveal(this._revealed ? 'smooth' : 'instant');\n }\n\n /** Scrolls the row the least distance that shows the chosen button whole. */\n _reveal(behavior) {\n if (!this.getBoolAttr('scroll') || !this._box?.clientWidth) return;\n const btn = this.buttons.find(b => b.classList.contains('active'));\n if (!btn) return;\n const row = this._box.getBoundingClientRect(), r = btn.getBoundingClientRect(), pad = 8;\n const delta = r.left < row.left ? r.left - row.left - pad : r.right > row.right ? r.right - row.right + pad : 0;\n const smooth = behavior === 'smooth' && !matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (delta) this._box.scrollBy({ left: delta, behavior: smooth ? 'smooth' : 'instant' });\n this._revealed = true;\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._onClick = (e) => {\n const btn = e.target.closest?.('button');\n if (!btn || !this.buttons.includes(btn) || btn.disabled) return;\n this._choose(this._valueOf(btn));\n };\n this._onKey = (e) => {\n const dir = KEYS[e.key];\n if (!dir) return;\n const buttons = this.buttons;\n const i = buttons.indexOf(e.target.closest?.('button'));\n if (i < 0 || buttons.length < 2) return;\n e.preventDefault();\n const next = buttons[(i + dir + buttons.length) % buttons.length];\n this._choose(this._valueOf(next));\n next.focus();\n };\n this._slot.addEventListener('slotchange', this._onSlot);\n this.addEventListener('click', this._onClick);\n this.addEventListener('keydown', this._onKey);\n this._resize = new ResizeObserver(() => this._reveal('instant'));\n this._resize.observe(this._box);\n this._sync();\n }\n\n teardownEvents() {\n this._slot?.removeEventListener('slotchange', this._onSlot);\n this.removeEventListener('click', this._onClick);\n this.removeEventListener('keydown', this._onKey);\n this._resize?.disconnect();\n }\n\n _choose(value) {\n if (value === this._value) return;\n this._syncing = true;\n this.setAttribute('value', value);\n this._syncing = false;\n this._sync();\n this.emit('nk-change', { value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n onAttributeChanged(name) {\n if (name === 'scroll' || name === 'wrap') { this._syncBox(); return; }\n if (!this._syncing) this._sync();\n }\n resetValue() { if (this._defaultValue !== undefined) this.setAttribute('value', this._defaultValue); }\n onFormDisabled(d) { this._formDisabled = d; this._sync(); }\n\n get value() { return this._value ?? this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get scroll() { return this.getBoolAttr('scroll'); }\n set scroll(v) { this.setBoolAttr('scroll', v); }\n get wrap() { return this.getBoolAttr('wrap'); }\n set wrap(v) { this.setBoolAttr('wrap', v); }\n}\n\ncustomElements.define('nk-segmented', NkSegmented);\nexport { NkSegmented };\n","import { NkElement } from '../../base.js';\n\n// <nk-stats><nk-stat …></nk-stat>…</nk-stats> → <div class=\"nk-stats\">\nclass NkStats extends NkElement {\n render() {\n const row = this.createElement('div', ['nk-stats']);\n row.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(row);\n }\n}\n\ncustomElements.define('nk-stats', NkStats);\nexport { NkStats };\n","import { NkElement } from '../../base.js';\n\n// <nk-stat label=\"Active pages\" value=\"128\" delta=\"▲ 12 this week\" trend=\"up\"></nk-stat>\n// → <div class=\"nk-stat\"><div class=\"s-label\">…</div><div class=\"s-value\">…</div><div class=\"s-delta up\">…</div></div>\nclass NkStat extends NkElement {\n static get observedAttributes() { return ['label', 'value', 'delta', 'trend']; }\n\n render() {\n const box = this.createElement('div', ['nk-stat']);\n this._parts = {};\n for (const [slot, cls] of [['label', 's-label'], ['value', 's-value'], ['delta', 's-delta']]) {\n const el = this.createElement('div', [cls]);\n const s = this.createElement('slot', [], { name: slot });\n s.appendChild(el);\n box.appendChild(s);\n this._parts[slot] = el;\n }\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n for (const [slot, el] of Object.entries(this._parts)) {\n const v = this.getAttribute(slot);\n el.textContent = v ?? '';\n el.style.display = v === null ? 'none' : '';\n }\n const trend = this.getAttribute('trend');\n this._parts.delta.className = 's-delta' + (trend === 'up' || trend === 'down' ? ` ${trend}` : '');\n }\n\n onAttributeChanged() { this._sync(); }\n\n get value() { return this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-stat', NkStat);\nexport { NkStat };\n","import { NkElement } from '../../base.js';\n\n// <nk-avatar-group more=\"+2\">\n// <span class=\"mini-avatar\" style=\"background:#448361\">SL</span>…\n// </nk-avatar-group>\n// → <div class=\"nk-avatar-group\">…<span class=\"mini-avatar more\">+2</span></div>\n// The avatars stay in the light DOM (::slotted twins size and overlap them);\n// the \"more\" bubble is rendered here from the attribute.\nclass NkAvatarGroup extends NkElement {\n static get observedAttributes() { return ['more']; }\n\n render() {\n const box = this.createElement('div', ['nk-avatar-group']);\n box.appendChild(document.createElement('slot'));\n this._more = this.createElement('span', ['mini-avatar', 'more']);\n box.appendChild(this._more);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n const more = this.getAttribute('more');\n this._more.textContent = more || '';\n this._more.style.display = more ? '' : 'none';\n }\n\n onAttributeChanged() { this._sync(); }\n\n get more() { return this.getAttribute('more'); }\n set more(v) { v == null ? this.removeAttribute('more') : this.setAttribute('more', v); }\n}\n\ncustomElements.define('nk-avatar-group', NkAvatarGroup);\nexport { NkAvatarGroup };\n","// Shared by every element that draws an avatar: nk-avatar itself, member\n// rows, comments and the person cells of a database view.\nexport const AVATAR_COLORS = ['gray', 'brown', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'red'];\n\n/**\n * Paints an .nk-avatar. One of Notion's nine colour names becomes its class,\n * so the tokens decide the shade in each theme; any other value – a hex, a\n * gradient, a var() – is taken as an inline background, as before 1.6.0.\n * Without a colour the avatar keeps the stylesheet's gradient.\n */\nexport function paintAvatar(el, color) {\n for (const c of AVATAR_COLORS) el.classList.toggle(c, c === color);\n el.style.background = color && !AVATAR_COLORS.includes(color) ? color : '';\n}\n\n/** \"Sara Lindt\" → \"SL\", \"Planer (Dev)\" → \"PD\", \"Anna-Lena Groß\" → \"AG\": the first letter or digit of each word; a word without one is skipped. */\nexport const initialsOf = name => String(name || '').split(/\\s+/).map(w => w.match(/[\\p{L}\\p{N}]/u)?.[0]).filter(Boolean).join('').slice(0, 2).toUpperCase();\n","import { NkElement } from '../../base.js';\nimport { paintAvatar, initialsOf } from '../../util/avatar.js';\n\n// <nk-avatar>MK</nk-avatar> → <span class=\"nk-avatar\">MK</span>\n// <nk-avatar size=\"small\" color=\"green\">SL</nk-avatar>\n// <nk-avatar name=\"Ada Lovelace\" size=\"large\"></nk-avatar> → initials \"AL\"\n// <nk-avatar src=\"ada.jpg\" name=\"Ada Lovelace\" size=\"xlarge\"></nk-avatar>\n// <nk-avatar square>A</nk-avatar> → a workspace icon\n// size: small (20px) · default 24px · large (32px) · xlarge (56px). color: one\n// of Notion's nine names, or any CSS background. Without content the initials\n// come from `name`; with `src` a photo fills the circle and `name` is its alt.\nclass NkAvatar extends NkElement {\n static get observedAttributes() { return ['size', 'color', 'square', 'src', 'name']; }\n\n render() {\n this._box = this.createElement('span', ['nk-avatar']);\n this._slot = document.createElement('slot');\n this._initials = document.createTextNode('');\n this._slot.appendChild(this._initials);\n this._img = this.createElement('img', [], { alt: '' });\n this._box.appendChild(this._slot);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n const size = this.getAttribute('size');\n for (const s of ['small', 'large', 'xlarge']) this._box.classList.toggle(s, s === size);\n this._box.classList.toggle('square', this.getBoolAttr('square'));\n paintAvatar(this._box, this.getAttribute('color'));\n const name = this.getAttribute('name');\n this._initials.data = initialsOf(name);\n const src = this.getAttribute('src');\n if (src) {\n this._img.src = src;\n this._img.alt = name || '';\n if (this._slot.isConnected) this._slot.replaceWith(this._img);\n } else if (this._img.isConnected) this._img.replaceWith(this._slot);\n // A picture or initials with a name speak for themselves; a bare glyph is decoration.\n if (name && !src) { this._box.setAttribute('role', 'img'); this._box.setAttribute('aria-label', name); }\n else { this._box.removeAttribute('role'); this._box.removeAttribute('aria-label'); }\n }\n\n onAttributeChanged() { this._sync(); }\n\n get size() { return this.getAttribute('size'); }\n set size(v) { v == null ? this.removeAttribute('size') : this.setAttribute('size', v); }\n get color() { return this.getAttribute('color'); }\n set color(v) { v == null ? this.removeAttribute('color') : this.setAttribute('color', v); }\n get src() { return this.getAttribute('src'); }\n set src(v) { v == null ? this.removeAttribute('src') : this.setAttribute('src', v); }\n}\n\ncustomElements.define('nk-avatar', NkAvatar);\nexport { NkAvatar };\n","import { NkElement } from '../../base.js';\n\n// <nk-mention type=\"person\"><span slot=\"avatar\" class=\"mini-avatar\" style=\"background:#448361\">SL</span>Sara Lindt</nk-mention>\n// <nk-mention type=\"page\">📄 Onboarding</nk-mention> <nk-mention type=\"date\">📅 May 20</nk-mention>\n// → <span class=\"nk-mention person\">…</span>\nconst TYPES = ['person', 'page', 'date'];\n\nclass NkMention extends NkElement {\n static get observedAttributes() { return ['type']; }\n\n render() {\n this._box = this.createElement('span', this._classes());\n this._box.appendChild(this.createElement('slot', [], { name: 'avatar' }));\n this._box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n }\n\n _classes() {\n const t = this.getAttribute('type');\n return ['nk-mention', ...(TYPES.includes(t) ? [t] : [])];\n }\n\n onAttributeChanged() { if (this._box) this._box.className = this._classes().join(' '); }\n\n get type() { return this.getAttribute('type'); }\n set type(v) { v ? this.setAttribute('type', v) : this.removeAttribute('type'); }\n}\n\ncustomElements.define('nk-mention', NkMention);\nexport { NkMention };\n","import { NkElement } from '../../base.js';\n\n// <nk-template-btn icon=\"📅\" value=\"week-plan\">Insert week plan</nk-template-btn>\n// → <button class=\"nk-template-btn\">📅 Insert week plan</button>\nclass NkTemplateBtn extends NkElement {\n static get observedAttributes() { return ['icon', 'value', 'disabled']; }\n\n render() {\n this._btn = this.createElement('button', ['nk-template-btn'], { type: 'button' });\n // One flex item: \"📅 Insert week plan\" is a single text run in the class\n // markup, so icon, space and label must not become separate flex items.\n const run = document.createElement('span');\n this._icon = document.createElement('span');\n this._space = document.createTextNode(' ');\n run.append(this._icon, this._space, document.createElement('slot'));\n this._btn.appendChild(run);\n this._wrapper.appendChild(this._btn);\n this._sync();\n }\n\n _sync() {\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._space.data = icon ? ' ' : '';\n this._btn.disabled = this.getBoolAttr('disabled');\n }\n\n setupEvents() {\n this._onClick = () => this.emit('nk-select', { value: this.value, label: this.textContent.trim() });\n this._btn.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._btn?.removeEventListener('click', this._onClick); }\n onAttributeChanged() { this._sync(); }\n focus(o) { this._btn?.focus(o); }\n\n get value() { return this.getAttribute('value') ?? this.textContent.trim(); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-template-btn', NkTemplateBtn);\nexport { NkTemplateBtn };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-model-card name=\"model\" value=\"gpt\" title=\"Mona Pro\" desc=\"Best for long documents\" selected></nk-model-card>\n// → <div class=\"nk-model-card selected\"><div class=\"m-radio\"></div><div><div class=\"m-name\">…</div><div class=\"m-desc\">…</div></div></div>\n// Cards with the same `name` in the same tree behave like radios and submit\n// the selected value with the form. `title` is the card's name, never a\n// tooltip – see NkElement.takeTitle().\nclass NkModelCard extends NkFormElement {\n static get observedAttributes() { return ['name', 'value', 'title', 'desc', 'selected', 'disabled']; }\n\n render() {\n this._card = this.createElement('div', ['nk-model-card'], { role: 'radio', tabindex: '0' });\n this._card.appendChild(this.createElement('div', ['m-radio']));\n const text = document.createElement('div');\n this._name = this.createElement('div', ['m-name']);\n const titleSlot = this.createElement('slot', [], { name: 'title' });\n titleSlot.appendChild(this._name);\n this._desc = this.createElement('div', ['m-desc']);\n const descSlot = this.createElement('slot', [], { name: 'desc' });\n descSlot.appendChild(this._desc);\n text.append(titleSlot, descSlot);\n this._card.appendChild(text);\n this._wrapper.appendChild(this._card);\n this._defaultSelected = this.getBoolAttr('selected');\n this.takeTitle();\n this._sync();\n if (this.getBoolAttr('selected')) this._unselectPeers();\n }\n\n _sync() {\n const on = this.getBoolAttr('selected');\n this._card.classList.toggle('selected', on);\n this._card.setAttribute('aria-checked', on ? 'true' : 'false');\n this._card.setAttribute('aria-disabled', this.getBoolAttr('disabled') ? 'true' : 'false');\n this._name.textContent = this._titleText || '';\n const desc = this.getAttribute('desc');\n this._desc.textContent = desc || '';\n this._desc.style.display = desc ? '' : 'none';\n this.setFormValue(on ? (this.getAttribute('value') || 'on') : null, on ? 'selected' : 'unselected');\n }\n\n _group() {\n const name = this.getAttribute('name');\n const root = this.getRootNode();\n if (!name || typeof root?.querySelectorAll !== 'function') return [this];\n return [...root.querySelectorAll('nk-model-card')].filter(el => el.getAttribute('name') === name);\n }\n\n _unselectPeers() {\n for (const el of this._group()) if (el !== this && el.hasAttribute('selected')) el.removeAttribute('selected');\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._onKey = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.select(); } };\n this._card.addEventListener('click', this._onClick);\n this._card.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._card?.removeEventListener('click', this._onClick);\n this._card?.removeEventListener('keydown', this._onKey);\n }\n\n select() {\n if (this.getBoolAttr('disabled') || this.getBoolAttr('selected')) return;\n this.setBoolAttr('selected', true);\n this.emit('nk-change', { value: this.value, name: this.name, checked: true });\n this.emit('nk-select', { value: this.value, label: this.title });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n if (name === 'selected' && this.getBoolAttr('selected')) this._unselectPeers();\n }\n\n resetValue() { this.setBoolAttr('selected', this._defaultSelected); }\n focus(o) { this._card?.focus(o); }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n get selected() { return this.getBoolAttr('selected'); }\n set selected(v) { this.setBoolAttr('selected', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n}\n\ncustomElements.define('nk-model-card', NkModelCard);\nexport { NkModelCard };\n","import { NkElement } from '../../base.js';\n\n// <nk-profile-row avatar=\"MK\"><nk-btn variant=\"secondary\" small>Change photo</nk-btn></nk-profile-row>\n// → <div class=\"nk-profile-row\"><div class=\"big-avatar\">MK</div>…</div>\nclass NkProfileRow extends NkElement {\n static get observedAttributes() { return ['avatar']; }\n\n render() {\n const row = this.createElement('div', ['nk-profile-row']);\n this._avatar = this.createElement('div', ['big-avatar']);\n const s = this.createElement('slot', [], { name: 'avatar' });\n s.appendChild(this._avatar);\n row.appendChild(s);\n row.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(row);\n this._sync();\n }\n\n _sync() { this._avatar.textContent = this.getAttribute('avatar') || ''; }\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-profile-row', NkProfileRow);\nexport { NkProfileRow };\n","import { NkElement } from '../../base.js';\n\n// <nk-danger-zone title=\"Danger zone\">…</nk-danger-zone>\n// → <div class=\"nk-danger-zone\"><div class=\"dz-title\">Danger zone</div>…</div>\n// `title` is the heading, never a tooltip – see NkElement.takeTitle().\nclass NkDangerZone extends NkElement {\n static get observedAttributes() { return ['title']; }\n\n render() {\n const box = this.createElement('div', ['nk-danger-zone']);\n this._titleEl = this.createElement('div', ['dz-title']);\n box.appendChild(this._titleEl);\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n this.takeTitle();\n this._sync();\n }\n\n _sync() {\n const t = this._titleText;\n this._titleEl.textContent = t || '';\n this._titleEl.style.display = t ? '' : 'none';\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n}\n\ncustomElements.define('nk-danger-zone', NkDangerZone);\nexport { NkDangerZone };\n","import { NkElement } from '../../base.js';\n\n// <nk-member-list><nk-member-row …></nk-member-row>…</nk-member-list>\n// → <div class=\"nk-member-list\">…</div>; the last row gets `last` (no border).\nclass NkMemberList extends NkElement {\n render() {\n const box = this.createElement('div', ['nk-member-list']);\n this._slot = document.createElement('slot');\n box.appendChild(this._slot);\n this._wrapper.appendChild(box);\n this._mark();\n }\n\n _mark() {\n const rows = this._slot.assignedElements().filter(el => el.localName === 'nk-member-row');\n rows.forEach((row, i) => { if (i === rows.length - 1) row.setAttribute('last', ''); else row.removeAttribute('last'); });\n }\n\n setupEvents() {\n this._onSlot = () => this._mark();\n this._slot.addEventListener('slotchange', this._onSlot);\n this._mark();\n }\n\n teardownEvents() { this._slot?.removeEventListener('slotchange', this._onSlot); }\n}\n\ncustomElements.define('nk-member-list', NkMemberList);\nexport { NkMemberList };\n","import { NkElement } from '../../base.js';\nimport { paintAvatar, initialsOf } from '../../util/avatar.js';\n\n// <nk-member-row name=\"Sara Lindt\" mail=\"sara@…\" avatar=\"SL\" color=\"green\">\n// <nk-select slot=\"role\" compact>…</nk-select>\n// </nk-member-row>\n// → <div class=\"nk-member-row\"><span class=\"nk-avatar green\">SL</span><div>Sara Lindt<div class=\"m-mail\">…</div></div><select …></div>\n// color: one of Notion's nine names, or any CSS background; without it the\n// avatar gradient. The row sizes the avatar to 28px.\nclass NkMemberRow extends NkElement {\n static get observedAttributes() { return ['name', 'mail', 'avatar', 'color', 'last']; }\n\n render() {\n this._row = this.createElement('div', ['nk-member-row']);\n this._avatar = this.createElement('span', ['nk-avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n const text = document.createElement('div');\n this._name = document.createTextNode('');\n this._mail = this.createElement('div', ['m-mail']);\n text.append(this._name, this._mail);\n // `.nk-member-row .nk-select { margin-left: auto }` cannot reach a select\n // inside another shadow root, and a display:contents host takes no margin –\n // so the role slot sits in a box that carries that rule.\n const role = document.createElement('div');\n role.style.marginLeft = 'auto';\n role.appendChild(this.createElement('slot', [], { name: 'role' }));\n this._row.append(avatarSlot, text, role, document.createElement('slot'));\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n _sync() {\n this._name.data = this.getAttribute('name') || '';\n const mail = this.getAttribute('mail');\n this._mail.textContent = mail || '';\n this._mail.style.display = mail ? '' : 'none';\n const avatar = this.getAttribute('avatar');\n this._avatar.textContent = avatar || initialsOf(this.getAttribute('name'));\n paintAvatar(this._avatar, this.getAttribute('color'));\n this._row.classList.toggle('last', this.getBoolAttr('last'));\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-member-row', NkMemberRow);\nexport { NkMemberRow };\n","import { NkElement } from '../../base.js';\n\n// <nk-props>\n// <nk-prop label=\"Status\" icon=\"◉\"><nk-tag color=\"blue\">In progress</nk-tag></nk-prop>\n// <nk-prop label=\"Owner\" icon=\"👤\"><nk-avatar size=\"small\">MK</nk-avatar>Marcel Karas</nk-prop>\n// </nk-props>\n// → <dl class=\"nk-props\">…</dl> – the properties under a page title. The rows\n// are <nk-prop> hosts with display: contents, so each .nk-prop is a row of\n// this list. `flush` (NotionKit 1.12.0) drops the outer margin meant for the\n// flow under a title – for a list inside a panel or a flex column.\nclass NkProps extends NkElement {\n static get observedAttributes() { return ['flush']; }\n\n render() {\n this._list = this.createElement('dl', ['nk-props']);\n this._list.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._list);\n this.onAttributeChanged();\n }\n\n onAttributeChanged() { this._list?.classList.toggle('flush', this.getBoolAttr('flush')); }\n\n get flush() { return this.getBoolAttr('flush'); }\n set flush(v) { this.setBoolAttr('flush', v); }\n}\n\ncustomElements.define('nk-props', NkProps);\nexport { NkProps };\n","import { NkElement } from '../../base.js';\n\n// <nk-prop label=\"Due\" icon=\"📅\">2 June 2026</nk-prop>\n// → <div class=\"nk-prop\"><dt class=\"p-name\"><span class=\"p-icon\">📅</span>Due</dt><dd class=\"p-value\">2 June 2026</dd></div>\n// The value is the element's content – tags, an avatar and a name, a date, a\n// <nk-progress wide>. slot=\"icon\" replaces the icon glyph. A click on the\n// name or the value fires nk-action { action: 'name' | 'value', label }, the\n// moment Notion opens the property's editor. `text` (NotionKit 1.12.0) lets a\n// value that is text – an address, a model name with a tag – flow as text\n// instead of setting its parts one under the other.\nclass NkProp extends NkElement {\n static get observedAttributes() { return ['label', 'icon', 'text']; }\n\n render() {\n this._row = this.createElement('div', ['nk-prop']);\n this._name = this.createElement('dt', ['p-name']);\n this._icon = this.createElement('span', ['p-icon']);\n const iconSlot = this.createElement('slot', [], { name: 'icon' });\n iconSlot.appendChild(this._icon);\n this._label = document.createTextNode('');\n this._name.append(iconSlot, this._label);\n this._value = this.createElement('dd', ['p-value']);\n this._value.appendChild(document.createElement('slot'));\n this._row.append(this._name, this._value);\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n _sync() {\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._icon.style.display = icon ? '' : 'none';\n this._label.data = this.getAttribute('label') || '';\n this._value.classList.toggle('text', this.getBoolAttr('text'));\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const part = e.composedPath().includes(this._name) ? 'name' : 'value';\n this.emit('nk-action', { action: part, label: this.label });\n };\n this._row.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._row?.removeEventListener('click', this._onClick); }\n onAttributeChanged() { this._sync(); }\n\n get label() { return this.getAttribute('label') || ''; }\n set label(v) { this.setAttribute('label', v); }\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n get text() { return this.getBoolAttr('text'); }\n set text(v) { this.setBoolAttr('text', v); }\n}\n\ncustomElements.define('nk-prop', NkProp);\nexport { NkProp };\n","import { NkElement } from '../../base.js';\n\n// <nk-panels><nk-panel …></nk-panel><nk-panel …></nk-panel></nk-panels>\n// → <div class=\"nk-panels\">…</div>: columns of at least 200px that share the\n// row and fall to one on a phone. The <nk-panel> hosts are display: contents,\n// so each .nk-panel is a cell of this grid. `flush` (NotionKit 1.12.0) drops\n// the grid's outer margin.\nclass NkPanels extends NkElement {\n static get observedAttributes() { return ['flush']; }\n\n render() {\n this._grid = this.createElement('div', ['nk-panels']);\n this._grid.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._grid);\n this.onAttributeChanged();\n }\n\n onAttributeChanged() { this._grid?.classList.toggle('flush', this.getBoolAttr('flush')); }\n\n get flush() { return this.getBoolAttr('flush'); }\n set flush(v) { this.setBoolAttr('flush', v); }\n}\n\ncustomElements.define('nk-panels', NkPanels);\nexport { NkPanels };\n","import { NkElement } from '../../base.js';\n\n// <nk-panel title=\"Weekly review\"><p>Three pages changed.</p></nk-panel>\n// <nk-panel href=\"/roadmap\" cover=\"covers/aurora.svg\" icon=\"🚀\" title=\"Roadmap\"><p>2 min ago</p></nk-panel>\n// → <a class=\"nk-panel\" href=\"/roadmap\"><div class=\"nk-cover\"><img src=\"…\" alt=\"\"></div>\n// <div class=\"nk-page-icon\">🚀</div><h3>Roadmap</h3>…</a>\n// <nk-panel title=\"Contacts database\"><nk-tag slot=\"end\" color=\"green\">Connected</nk-tag>…</nk-panel>\n// → … <div class=\"p-head\"><h3>Contacts database</h3><span class=\"p-end\">…</span></div>\n// `cover` without a value draws the token gradient, with one a picture; `icon`\n// overlaps the cover as on a page – a page tile, as on Notion's Home. With\n// `href` the panel is a link. `title` is the heading, never a tooltip.\n// slot=\"end\" (NotionKit 1.12.0) sits at the right edge of the title – a state\n// as a tag, a button – and moves under it where both do not fit.\nclass NkPanel extends NkElement {\n static get observedAttributes() { return ['title', 'icon', 'cover', 'href', 'target']; }\n\n render() {\n this._cover = this.createElement('div', ['nk-cover']);\n this._img = this.createElement('img', [], { alt: '' });\n this._icon = this.createElement('div', ['nk-page-icon']);\n this._heading = document.createElement('h3');\n this._endSlot = this.createElement('slot', [], { name: 'end' });\n this._end = this.createElement('span', ['p-end']);\n this._end.appendChild(this._endSlot);\n this._head = this.createElement('div', ['p-head']);\n this._head.append(this._heading, this._end);\n this._slot = document.createElement('slot');\n this.takeTitle();\n this._build();\n }\n\n _build() {\n const href = this.getAttribute('href');\n const box = this.createElement(href ? 'a' : 'div', ['nk-panel']);\n box.append(this._cover, this._icon, this._head, this._slot);\n this._wrapper.replaceChildren(box);\n this._box = box;\n this._sync();\n }\n\n _sync() {\n const href = this.getAttribute('href');\n if (href) { this._box.setAttribute('href', href); this._box.target = this.getAttribute('target') || ''; }\n const cover = this.getAttribute('cover');\n // The band is in the tree only with `cover`: hidden, it still matched\n // `.nk-cover + .nk-page-icon` and pulled a lone icon over the tile's edge.\n if (cover === null) this._cover.remove();\n else if (!this._cover.isConnected) this._box.prepend(this._cover);\n if (cover) { this._img.src = cover; if (!this._img.isConnected) this._cover.appendChild(this._img); }\n else this._img.remove();\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._icon.style.display = icon ? '' : 'none';\n const title = this._titleText || '';\n if (this._heading.textContent !== title) this._heading.textContent = title;\n this._heading.style.display = title ? '' : 'none';\n // The end and the whole head leave the layout when they are empty, so a\n // title alone lays out as it always did.\n const end = this._endSlot.assignedNodes().some(n => n.nodeType === Node.ELEMENT_NODE || n.textContent.trim());\n this._end.style.display = end ? '' : 'none';\n this._head.style.display = title || end ? '' : 'none';\n }\n\n setupEvents() {\n this._onEnd = () => this._sync();\n this._endSlot.addEventListener('slotchange', this._onEnd);\n }\n\n teardownEvents() { this._endSlot?.removeEventListener('slotchange', this._onEnd); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n if (name === 'href' && (value === null) !== (this._box.localName === 'div')) { this._build(); return; }\n this._sync();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n get href() { return this.getAttribute('href'); }\n set href(v) { v == null ? this.removeAttribute('href') : this.setAttribute('href', v); }\n}\n\ncustomElements.define('nk-panel', NkPanel);\nexport { NkPanel };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, firstFocusable, deepActiveElement } from '../../util/focus.js';\n\n// <nk-sheet id=\"more\" title=\"More\">\n// <nk-tree manual>\n// <nk-section-label>Favourites</nk-section-label>\n// <nk-tree-item icon=\"🚀\">NotionKit MVP</nk-tree-item>\n// </nk-tree>\n// </nk-sheet>\n// → <div class=\"nk-sheet-backdrop open\"><div class=\"nk-sheet\" role=\"dialog\">\n// <div class=\"sh-grabber\"></div><div class=\"sh-title\">More</div>…</div></div>\n//\n// A bottom sheet (NotionKit 1.7.0) with nk-modal's contract: show(), close()\n// and toggle(), Escape and the backdrop close it, focus moves in and back\n// out, the page behind is scroll-locked and inert. It lies above the tab\n// bar; rows inside are 40px high. `title` is the heading shown under the\n// grabber and the dialog's name, never a tooltip – see NkElement.takeTitle().\n// Choosing a row does not close the sheet – the app decides (nk-select\n// bubbles out). Put the element directly under <body>: a transformed\n// ancestor would trap the fixed backdrop.\nclass NkSheet extends NkElement {\n static get observedAttributes() { return ['open', 'title']; }\n\n render() {\n this.takeTitle();\n this._backdrop = this.createElement('div', ['nk-sheet-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-sheet'], { role: 'dialog', 'aria-modal': 'true', tabindex: '-1' });\n this._heading = this.createElement('div', ['sh-title'], { id: 'title' });\n this._box.append(this.createElement('div', ['sh-grabber']), this._heading, document.createElement('slot'));\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncTitle();\n this._syncOpen();\n }\n\n _syncTitle() {\n const text = this._titleText || '';\n this._heading.textContent = text;\n this._heading.hidden = !text;\n if (text) this._box.setAttribute('aria-labelledby', 'title');\n else this._box.removeAttribute('aria-labelledby');\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = deepActiveElement();\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => (firstFocusable(this) || this._box).focus({ preventScroll: true }));\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n const back = this._returnFocus;\n if (back && typeof back.focus === 'function' && back.isConnected) back.focus({ preventScroll: true });\n this._returnFocus = null;\n }\n }\n\n setupEvents() {\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._backdrop.addEventListener('click', this._onBackdrop);\n document.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n document.removeEventListener('keydown', this._onKey);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onAttributeChanged(name, oldValue, value) {\n if (name === 'title') { if (this.takeTitle(value)) this._syncTitle(); return; }\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._syncTitle(); }\n}\n\ncustomElements.define('nk-sheet', NkSheet);\nexport { NkSheet };\n","import { NkElement } from '../../base.js';\n\n// <nk-steps label=\"Connect your own model\" current=\"2\"\n// steps=\"Choose a provider, Enter the API key, Test the connection\"></nk-steps>\n// steps.steps = [{ label: 'Choose a provider', desc: 'Anthropic' }, 'Enter the API key', …];\n// → <ol class=\"nk-steps\" aria-label=\"…\">\n// <li class=\"nk-step done\"><span class=\"st-mark\">✓</span><span>Choose a provider<span class=\"st-desc\">Anthropic</span></span></li>\n// <li class=\"nk-step current\" aria-current=\"step\"><span class=\"st-mark\">2</span><span>Enter the API key</span></li>\n// <li class=\"nk-step\"><span class=\"st-mark\">3</span><span>Test the connection</span></li></ol>\n// A setup in a few steps (NotionKit 1.7.0). `current` counts from 1; the\n// steps before it are done, one past the last marks all of them done. The\n// `steps` attribute is a comma-separated list; the property also takes\n// { label, desc, state, value } objects for a line under the label and a\n// state of its own – 'done', 'skipped' or 'open' (NotionKit 1.12.0) – for a\n// wizard that lets a step be skipped while a later one is done.\n// `selectable` makes each label a button: a click or Enter fires\n// nk-select { index, value, step } – index counts from 1, like `current` –\n// and, unless cancelled, makes that step current. `horizontal` sets the\n// steps in one row above a wizard.\n// A step with `href` (1.17.0) shows its label as a link, <a class=\"st-label\">,\n// with or without `selectable` – to open a chapter in a new tab or copy its\n// address. A plain click, or Enter, fires the same nk-select; cancelling it\n// keeps the browser from following the link, for a router of your own. A\n// middle click or one with Cmd, Ctrl, Shift or Alt fires nothing and does\n// what a link does.\nclass NkSteps extends NkElement {\n static get observedAttributes() { return ['steps', 'current', 'label', 'selectable', 'horizontal']; }\n\n render() {\n this._list = this.createElement('ol', ['nk-steps']);\n this._wrapper.appendChild(this._list);\n this._sync();\n }\n\n _items() {\n if (this._steps) return this._steps;\n return (this.getAttribute('steps') || '').split(',').map(s => s.trim()).filter(Boolean);\n }\n\n _step(i) {\n const step = this._items()[i];\n return typeof step === 'object' && step ? step : step === undefined ? undefined : { label: String(step) };\n }\n\n _sync() {\n const label = this.getAttribute('label');\n if (label) this._list.setAttribute('aria-label', label); else this._list.removeAttribute('aria-label');\n this._list.classList.toggle('horizontal', this.getBoolAttr('horizontal'));\n const current = this.current, selectable = this.getBoolAttr('selectable');\n // Rebuilding drops the focused label; the new one at that place takes it back.\n const focused = this.shadowRoot?.activeElement?.closest?.('li')?.dataset.index;\n this._list.replaceChildren(...this._items().map((_, i) => {\n const n = i + 1, { label: text, desc, state, href } = this._step(i);\n // A state of its own wins; without one, the steps before `current` are done.\n const done = state ? state === 'done' : n < current, skipped = state === 'skipped';\n const li = this.createElement('li', ['nk-step'], { 'data-index': String(n) });\n li.classList.toggle('done', done);\n li.classList.toggle('skipped', skipped);\n li.classList.toggle('current', n === current);\n if (n === current) li.setAttribute('aria-current', 'step');\n const mark = this.createElement('span', ['st-mark'], { 'aria-hidden': 'true' });\n mark.textContent = done ? '✓' : skipped ? '–' : String(n);\n const body = href != null && href !== '' ? this.createElement('a', ['st-label'], { href: String(href) })\n : selectable ? this.createElement('button', ['st-label'], { type: 'button' }) : document.createElement('span');\n body.textContent = text ?? '';\n if (desc) { const d = this.createElement('span', ['st-desc']); d.textContent = desc; body.appendChild(d); }\n li.append(mark, body);\n return li;\n }));\n if (focused) this._list.querySelector(`li[data-index=\"${focused}\"] .st-label`)?.focus();\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const li = e.target.closest?.('li.nk-step');\n if (!li || !this._list.contains(li)) return;\n const link = li.querySelector('a.st-label');\n if (link) {\n // The link contract: a plain left click is a selection, any other\n // one the browser's. The mark beside the link counts as the link.\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n if (!link.contains(e.target)) { link.click(); return; }\n if (!this.select(Number(li.dataset.index))) e.preventDefault();\n return;\n }\n if (this.getBoolAttr('selectable')) this.select(Number(li.dataset.index));\n };\n this._list.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._list?.removeEventListener('click', this._onClick); }\n onAttributeChanged() { this._sync(); }\n\n /** Jumps to step `index` (from 1): fires nk-select { index, value, step } and, unless cancelled, makes it current. */\n select(index) {\n const step = this._step(index - 1);\n if (!step) return false;\n const ok = this.emit('nk-select', { index, value: step.value ?? step.label, step });\n if (ok) this.current = index;\n return ok;\n }\n\n get steps() { return this._items(); }\n set steps(v) { this._steps = Array.isArray(v) ? v : null; if (this._list) this._sync(); }\n get current() { const n = parseInt(this.getAttribute('current'), 10); return Number.isFinite(n) ? n : 1; }\n set current(v) { this.setAttribute('current', String(v)); }\n get selectable() { return this.getBoolAttr('selectable'); }\n set selectable(v) { this.setBoolAttr('selectable', v); }\n get horizontal() { return this.getBoolAttr('horizontal'); }\n set horizontal(v) { this.setBoolAttr('horizontal', v); }\n /** Moves on to the next step; returns the new current step. */\n next() { this.current = Math.min(this.current + 1, this._items().length + 1); return this.current; }\n}\n\ncustomElements.define('nk-steps', NkSteps);\nexport { NkSteps };\n","import { NkElement } from '../../base.js';\n\n// <nk-bookmark href=\"https://notionkit.jungherz.com\" title=\"NotionKit\" desc=\"…\"\n// favicon=\"favicon.svg\" cover=\"og.jpg\"></nk-bookmark>\n// → <a class=\"nk-bookmark\" href=\"…\" target=\"_blank\" rel=\"noopener\">\n// <span class=\"bm-text\"><span class=\"bm-title\">…</span><span class=\"bm-desc\">…</span>\n// <span class=\"bm-url\"><img class=\"bm-favicon\"><span>…</span></span></span>\n// <span class=\"bm-cover\"><img></span></a>\n// Notion's link block (NotionKit 1.8.0), filled from what you know of the\n// page: og:title, og:description, og:image. `title` is the heading, never a\n// tooltip – see NkElement.takeTitle(); without it the host name stands in.\n// The address shown is `href`, or `url` where it should read differently. A\n// part without a value is left out, not hidden – the stylesheet gives the\n// description its own display. Opens in a new tab unless `target` says so.\nclass NkBookmark extends NkElement {\n static get observedAttributes() { return ['href', 'title', 'desc', 'favicon', 'cover', 'target', 'url']; }\n\n render() {\n this.takeTitle();\n this._a = this.createElement('a', ['nk-bookmark']);\n this._wrapper.appendChild(this._a);\n this._sync();\n }\n\n _sync() {\n if (!this._a) return;\n const href = this.getAttribute('href') || '';\n this._a.setAttribute('href', href);\n const target = this.getAttribute('target') || '_blank';\n this._a.setAttribute('target', target);\n if (target === '_blank') this._a.setAttribute('rel', 'noopener'); else this._a.removeAttribute('rel');\n let host = href;\n try { host = new URL(href, location.href).host; } catch { /* keep the text */ }\n\n const text = this.createElement('span', ['bm-text']);\n const title = this.createElement('span', ['bm-title']);\n title.textContent = this._titleText || host;\n text.appendChild(title);\n const desc = this.getAttribute('desc');\n if (desc) { const d = this.createElement('span', ['bm-desc']); d.textContent = desc; text.appendChild(d); }\n const url = this.createElement('span', ['bm-url']);\n const favicon = this.getAttribute('favicon');\n if (favicon) url.appendChild(this.createElement('img', ['bm-favicon'], { src: favicon, alt: '' }));\n const address = document.createElement('span');\n address.textContent = this.getAttribute('url') || href;\n url.appendChild(address);\n text.appendChild(url);\n const parts = [text];\n const cover = this.getAttribute('cover');\n if (cover) { const c = this.createElement('span', ['bm-cover']); c.appendChild(this.createElement('img', [], { src: cover, alt: '' })); parts.push(c); }\n this._a.replaceChildren(...parts);\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n }\n\n focus(o) { this._a?.focus(o); }\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); this._sync(); }\n get href() { return this.getAttribute('href') || ''; }\n set href(v) { this.setAttribute('href', v); }\n}\n\ncustomElements.define('nk-bookmark', NkBookmark);\nexport { NkBookmark };\n","import { NkElement } from '../../base.js';\n\n// <nk-copy-field value=\"https://monahilft.notionkit.app\"></nk-copy-field>\n// <nk-copy-field value=\"ntn_4f2…\" secret mono></nk-copy-field>\n// → <div class=\"nk-copy-field mono\"><span class=\"cf-value\">…</span>\n// <button class=\"cf-btn\">Show</button><button class=\"cf-btn\">Copy</button></div>\n// A value to take along – a link, an address, a key (NotionKit 1.8.0). Copy\n// writes it to the clipboard and says \"Copied\" in green for a moment; where\n// the clipboard is not allowed, the value is shown and selected instead, for\n// ⌘C. `secret` masks it behind a Show/Hide toggle; Copy still copies the\n// real value. `value` set as a property is not reflected, so a key never\n// lands in the markup. Fires nk-action { action: 'copy', value, ok }. The\n// texts come in English or German after the language (1.17.0, setStrings()\n// for others); copy-label, copied-label, show-label, hide-label set them here.\nclass NkCopyField extends NkElement {\n static get observedAttributes() { return ['value', 'mono', 'wrap', 'wide', 'secret', 'copy-label', 'copied-label', 'show-label', 'hide-label']; }\n\n render() {\n this._val ??= this.getAttribute('value') ?? '';\n this._box = this.createElement('div', ['nk-copy-field']);\n this._text = this.createElement('span', ['cf-value']);\n this._show = this.createElement('button', ['cf-btn'], { type: 'button' });\n this._copy = this.createElement('button', ['cf-btn'], { type: 'button' });\n this._box.append(this._text, this._copy);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n if (!this._box) return;\n for (const m of ['mono', 'wrap', 'wide']) this._box.classList.toggle(m, this.getBoolAttr(m));\n const secret = this.getBoolAttr('secret');\n this._text.textContent = secret && !this._revealed ? '•'.repeat(Math.min(this._val.length, 24)) : this._val;\n // Not `hidden`: .cf-btn sets no display of its own that could lose to it,\n // but a button that is not there cannot be tabbed to either.\n if (secret && !this._show.isConnected) this._copy.before(this._show);\n if (!secret) this._show.remove();\n this._show.textContent = this._revealed ? (this.getAttribute('hide-label') || this.str('hide')) : (this.getAttribute('show-label') || this.str('show'));\n this._show.setAttribute('aria-pressed', String(!!this._revealed));\n this._copy.textContent = this._copied ? (this.getAttribute('copied-label') || this.str('copied')) : (this.getAttribute('copy-label') || this.str('copy'));\n this._copy.classList.toggle('copied', !!this._copied);\n }\n\n setupEvents() {\n this._onCopy = () => this.copy();\n this._onShow = () => { this._revealed = !this._revealed; this._sync(); };\n this._copy.addEventListener('click', this._onCopy);\n this._show.addEventListener('click', this._onShow);\n }\n\n teardownEvents() {\n this._copy?.removeEventListener('click', this._onCopy);\n this._show?.removeEventListener('click', this._onShow);\n clearTimeout(this._timer);\n }\n\n onStringsChanged() { this._sync(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'value') this._val = value ?? '';\n this._sync();\n }\n\n /** Copies the value; resolves to whether the clipboard took it. */\n async copy() {\n const value = this._val;\n let ok = true;\n try { await navigator.clipboard.writeText(value); } catch { ok = false; }\n if (ok) {\n this._copied = true;\n clearTimeout(this._timer);\n this._timer = setTimeout(() => { this._copied = false; this._sync(); }, 1500);\n } else {\n this._revealed = true;\n }\n this._sync();\n if (!ok) getSelection()?.selectAllChildren(this._text);\n this.emit('nk-action', { action: 'copy', value, ok });\n return ok;\n }\n\n get value() { return this._val ?? this.getAttribute('value') ?? ''; }\n set value(v) { this._val = v == null ? '' : String(v); this._sync(); }\n get secret() { return this.getBoolAttr('secret'); }\n set secret(v) { this.setBoolAttr('secret', v); }\n}\n\ncustomElements.define('nk-copy-field', NkCopyField);\nexport { NkCopyField };\n","import { NkElement } from '../../base.js';\n\n// <nk-image-picker initials=\"MK\" label=\"Profile picture\"></nk-image-picker>\n// <nk-image-picker square initials=\"M\" max=\"256\" type=\"image/png\"></nk-image-picker>\n// → <div class=\"nk-profile-row\"><div class=\"big-avatar\">MK | <img></div>\n// <div class=\"pr-actions\"><button class=\"nk-btn secondary small\">Upload image</button>\n// <button class=\"nk-btn secondary small pr-remove\">Remove</button><input type=\"file\" hidden></div></div>\n//\n// A picture for a person or a workspace (NotionKit 1.8.0): the profile row\n// with its actions, round – or `square`, a workspace icon. Ported from\n// GlassKit Elements' glk-image-picker: the file goes through\n// createImageBitmap with imageOrientation 'from-image' – the EXIF rotation\n// of a phone photo without a library – onto a canvas no larger than `max`\n// (default 512), out as `type` (default image/jpeg, on white; image/png\n// keeps transparency) at `quality` (0.82). The file input is hidden and\n// opened from a real button, and cleared after every pick, so the same file\n// can be chosen again. Not form-associated: listen to nk-change and upload\n// the data URL. `src` set as a property is not reflected, so megabytes of\n// data URL never land in the DOM.\n// Events: nk-change { dataUrl, width, height, size } after a pick, and on\n// remove with an empty dataUrl; nk-error { message, name } when the\n// file cannot be decoded (HEIC outside Safari, a broken file).\n// Texts: English or German after the language (1.17.0, setStrings() for\n// others); choose-label, change-label, remove-label set them here.\n// label names the group.\n\nfunction dataUrlBytes(url) {\n const b64 = url.slice(url.indexOf(',') + 1);\n const padding = b64.endsWith('==') ? 2 : b64.endsWith('=') ? 1 : 0;\n return Math.floor((b64.length * 3) / 4) - padding;\n}\n\nclass NkImagePicker extends NkElement {\n static get observedAttributes() { return ['src', 'initials', 'square', 'label', 'max', 'type', 'quality', 'accept', 'choose-label', 'change-label', 'remove-label']; }\n\n render() {\n this._src ??= this.getAttribute('src') || '';\n this._row = this.createElement('div', ['nk-profile-row'], { role: 'group' });\n this._avatar = this.createElement('div', ['big-avatar']);\n const actions = this.createElement('div', ['pr-actions']);\n this._choose = this.createElement('button', ['nk-btn', 'secondary', 'small'], { type: 'button' });\n this._remove = this.createElement('button', ['nk-btn', 'secondary', 'small', 'pr-remove'], { type: 'button' });\n this._input = this.createElement('input', [], { type: 'file', tabindex: '-1' });\n this._input.hidden = true;\n actions.append(this._choose, this._remove, this._input);\n this._row.append(this._avatar, actions);\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n get _max() { return Math.max(1, Math.floor(Number(this.getAttribute('max'))) || 512); }\n get _type() { return this.getAttribute('type') || 'image/jpeg'; }\n get _quality() { const q = Number(this.getAttribute('quality')); return this.hasAttribute('quality') && q >= 0 && q <= 1 ? q : 0.82; }\n\n _sync() {\n if (!this._row) return;\n this._avatar.classList.toggle('square', this.getBoolAttr('square'));\n if (!this._src) {\n this._img = null;\n this._avatar.textContent = this.getAttribute('initials') || '';\n } else if (!this._img || this._img.getAttribute('src') !== this._src) {\n this._img = this.createElement('img', [], { src: this._src, alt: '' });\n this._avatar.replaceChildren(this._img);\n }\n const label = this.getAttribute('label');\n if (label) this._row.setAttribute('aria-label', label); else this._row.removeAttribute('aria-label');\n this._choose.textContent = this._src ? (this.getAttribute('change-label') || this.str('changeImage')) : (this.getAttribute('choose-label') || this.str('uploadImage'));\n this._remove.textContent = this.getAttribute('remove-label') || this.str('remove');\n this._remove.hidden = !this._src;\n this._input.accept = this.getAttribute('accept') || 'image/*';\n }\n\n async _pick(file) {\n if (!file) return;\n try {\n const bitmap = await createImageBitmap(file, { imageOrientation: 'from-image' });\n const scale = Math.min(1, this._max / Math.max(bitmap.width, bitmap.height));\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(bitmap.width * scale));\n canvas.height = Math.max(1, Math.round(bitmap.height * scale));\n const ctx = canvas.getContext('2d');\n if (this._type === 'image/jpeg') {\n // JPEG has no alpha; without this a transparent PNG comes out on black.\n ctx.fillStyle = '#fff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n ctx.drawImage(bitmap, 0, 0, canvas.width, canvas.height);\n bitmap.close();\n const dataUrl = canvas.toDataURL(this._type, this._quality);\n this.src = dataUrl;\n this.emit('nk-change', { dataUrl, width: canvas.width, height: canvas.height, size: dataUrlBytes(dataUrl) });\n } catch (error) {\n this.emit('nk-error', { message: error?.message || String(error), name: file.name });\n }\n }\n\n setupEvents() {\n this._onChoose = () => this._input.click();\n this._onChange = (e) => { const file = e.target.files?.[0]; e.target.value = ''; this._pick(file); };\n this._onRemove = () => {\n this.src = '';\n this._choose.focus(); // the remove button just went away under the focus\n this.emit('nk-change', { dataUrl: '', width: 0, height: 0, size: 0 });\n };\n this._choose.addEventListener('click', this._onChoose);\n this._input.addEventListener('change', this._onChange);\n this._remove.addEventListener('click', this._onRemove);\n }\n\n teardownEvents() {\n this._choose?.removeEventListener('click', this._onChoose);\n this._input?.removeEventListener('change', this._onChange);\n this._remove?.removeEventListener('click', this._onRemove);\n }\n\n onStringsChanged() { this._sync(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'src') this._src = value || '';\n this._sync();\n }\n\n /** Opens the file dialog, as the button does. */\n choose() { this._input?.click(); }\n get src() { return this._src ?? this.getAttribute('src') ?? ''; }\n set src(v) { this._src = v || ''; this._sync(); }\n get square() { return this.getBoolAttr('square'); }\n set square(v) { this.setBoolAttr('square', v); }\n}\n\ncustomElements.define('nk-image-picker', NkImagePicker);\nexport { NkImagePicker };\n","// Calendar days for nk-calendar and nk-calendar-view: local days as\n// 'YYYY-MM-DD', no library. Weeks are ISO weeks (Monday-based, the week with\n// the year's first Thursday); the first weekday comes from the locale.\nconst pad = n => String(n).padStart(2, '0');\n\nexport const isoOf = d => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\nexport const addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n\n/** 'YYYY-MM-DD[THH:MM]', 'D.M.YYYY', a Date or { start } → a local Date at midnight, or null. */\nexport function parseDay(v) {\n if (v instanceof Date) return Number.isNaN(v.getTime()) ? null : new Date(v.getFullYear(), v.getMonth(), v.getDate());\n if (v && typeof v === 'object') return v.start ? parseDay(v.start) : null;\n const s = String(v ?? '').trim();\n let m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (m) return new Date(+m[1], +m[2] - 1, +m[3]);\n m = s.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/);\n return m ? new Date(+m[3], +m[2] - 1, +m[1]) : null;\n}\n\nexport function isoWeek(d) {\n const t = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n t.setUTCDate(t.getUTCDate() + 4 - (t.getUTCDay() || 7));\n return Math.ceil(((t - Date.UTC(t.getUTCFullYear(), 0, 1)) / 864e5 + 1) / 7);\n}\n\n/** The page's language unless the element names one. */\nexport const resolveLocale = attr => attr || document.documentElement.lang || navigator.language || 'en';\n\n/** 0 = Sunday … 6 = Saturday, from Intl.Locale's week info; Monday where the browser cannot say. */\nexport function firstWeekday(locale) {\n try {\n const l = new Intl.Locale(locale), info = l.getWeekInfo?.() ?? l.weekInfo;\n if (info?.firstDay) return info.firstDay % 7;\n } catch { /* an unknown tag */ }\n return 1;\n}\n\n/** Short weekday names from `weekStart` on; `length` cuts them (2 → \"Mo\"). */\nexport function weekdayNames(locale, weekStart, length = 0) {\n const f = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n // 7 June 2026 is a Sunday, so 7 + n is weekday n.\n return Array.from({ length: 7 }, (_, i) => {\n const name = f.format(new Date(2026, 5, 7 + ((weekStart + i) % 7))).replace('.', '');\n return length ? name.slice(0, length) : name;\n });\n}\n\n/** A month from its week start: `first`, `day(i)` for the i-th cell, the `rows` it needs. */\nexport function monthGrid(month, weekStart) {\n const [y, m] = month.split('-').map(Number), first = new Date(y, m - 1, 1), offset = (first.getDay() - weekStart + 7) % 7;\n return { m, first, day: i => new Date(y, m - 1, 1 - offset + i), rows: Math.ceil((offset + new Date(y, m, 0).getDate()) / 7) };\n}\n\nexport function stepMonth(month, n) {\n const [y, m] = month.split('-').map(Number);\n return isoOf(new Date(y, m - 1 + n, 1)).slice(0, 7);\n}\n\n/** \"KW\" for German, \"W\" elsewhere – the head of the week column. */\nexport const weekLabel = locale => (/^de\\b/i.test(locale) ? 'KW' : 'W');\n\nexport const CHEVRONS = {\n prev: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\"/></svg>',\n next: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\"/></svg>',\n};\n","import { NkFormElement } from '../../base.js';\nimport { isoOf, parseDay, addDays, isoWeek, resolveLocale, firstWeekday, weekdayNames, monthGrid, stepMonth, weekLabel, CHEVRONS } from '../../util/dates.js';\nimport { placeUnder } from '../../util/floating.js';\nimport { deepActiveElement } from '../../util/focus.js';\n\n// <nk-calendar name=\"due\" value=\"2026-06-02\" weeks weekend=\"6,0\"></nk-calendar>\n// <nk-calendar range value=\"2026-06-08/2026-06-12\"></nk-calendar>\n// <nk-calendar floating sheet id=\"picker\"></nk-calendar> picker.show(button)\n// → [<div class=\"nk-pop floating sheet open\">]<div class=\"nk-calendar weeks\">\n// <div class=\"cal-head\"><div class=\"cal-title\">June 2026</div><button class=\"cal-nav\">Today</button>‹ ›</div>\n// <div class=\"cal-grid\"><span class=\"cal-wd\">W</span>…<span class=\"cal-week\">23</span><button class=\"cal-day selected\">2</button>…</div>\n// [<div class=\"cal-foot\"><input class=\"nk-input\" type=\"time\"></div>]</div>\n//\n// Notion's date picker (NotionKit 1.9.0), after GlassKit Elements'\n// glk-calendar, with what a planning tool needs on top: a range, ISO\n// calendar weeks, days not worked, marks and a time.\n// value: YYYY-MM-DD; with `range` the ISO interval \"start/end\"; with `time`\n// YYYY-MM-DDTHH:MM. Also as the properties value, start, end.\n// month (YYYY-MM shown; default the value's, else today's), min, max, today,\n// locale (default the page's lang), week-start (0 = Sunday … 6 = Saturday;\n// default from the locale, Monday where the browser cannot say), weeks,\n// weekend (weekdays not worked, \"6,0\" for Saturday and Sunday), range, time,\n// clearable, label and the texts today-label, prev-label, next-label,\n// week-label, time-label, clear-label – without them English or German\n// after the language (1.17.0). `time` belongs to single days; a range has\n// none.\n// days (property, or JSON attribute): { 'YYYY-MM-DD': { off, label, marks } }\n// – `off` greys a holiday, `label` names the day (tooltip and screen\n// reader), `marks` puts up to three dots in the nine colours on it.\n// Keys: arrows by a day or a week, Home/End to the ends of the week,\n// PageUp/PageDown by a month (Shift: a year); Enter or Space picks. Arrows\n// only move, so the picker stays quiet while someone looks around. Days\n// outside min/max are aria-disabled – in the arrow path and announced, never\n// picked. A range takes two picks, in either order. Form-associated: the\n// value goes with the form, reset restores it.\n// Events: nk-change { value, start, end, time } when a pick – for a range the\n// second one –, a new time or Clear changes the value; nk-month { month } when the month\n// changes; nk-toggle { open } with `floating`. `required` makes an empty\n// value invalid.\n// `floating` makes it a popover over the page – show(anchor) puts it under\n// the anchor, right edges aligned (align=\"start\": left edges) – and `sheet`\n// a bottom sheet with 44px cells on a phone, as <nk-menu floating sheet>.\n// A pick closes it – the second of a range; with `time` Escape or a tap\n// outside does. Put a floating calendar directly under <body>.\nconst STEPS = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };\nconst floatSheet = new CSSStyleSheet();\nfloatSheet.replaceSync(`:host([floating]) { display: block; position: fixed; top: 0; left: 0; z-index: 106; pointer-events: none; }`);\n\nclass NkCalendar extends NkFormElement {\n static get hostStyles() { return floatSheet; }\n static get observedAttributes() {\n return ['value', 'month', 'min', 'max', 'today', 'locale', 'week-start', 'weeks', 'weekend', 'range', 'time', 'clearable', 'days',\n 'label', 'today-label', 'prev-label', 'next-label', 'week-label', 'time-label', 'clear-label', 'floating', 'sheet', 'open', 'align', 'required'];\n }\n\n render() {\n // A value or month set as a property before the first connect wins over the attributes.\n this._readValue(this._pendingValue ?? this.getAttribute('value'));\n const month = this._pendingMonth || this._attrMonth();\n if (month) this._month = month;\n this._initialValue = this.getAttribute('value') ?? '';\n this._build();\n }\n\n // ── value ──\n _readValue(v) {\n const s = String(v ?? '');\n this._start = this._end = this._day = null;\n this._time = '';\n if (this.getBoolAttr('range')) {\n const [a, b] = s.split('/');\n this._start = parseDay(a) ? isoOf(parseDay(a)) : null;\n this._end = parseDay(b) ? isoOf(parseDay(b)) : null;\n } else if (parseDay(s)) {\n this._day = isoOf(parseDay(s));\n this._time = s.match(/T(\\d{2}:\\d{2})/)?.[1] ?? '';\n }\n // A new value brings its month; without one the month stays.\n const shown = this._day || this._start;\n this._month = shown ? shown.slice(0, 7) : (this._month || this._attrMonth() || this._todayIso().slice(0, 7));\n this._focus = null;\n }\n\n _attrMonth() { const m = this.getAttribute('month'); return /^\\d{4}-\\d{2}$/.test(m || '') ? m : null; }\n _todayIso() { return this.getAttribute('today') || isoOf(new Date()); }\n\n get value() {\n if (this.getBoolAttr('range')) return this._start ? `${this._start}${this._end ? `/${this._end}` : ''}` : '';\n return this._day ? `${this._day}${this.getBoolAttr('time') && this._time ? `T${this._time}` : ''}` : '';\n }\n set value(v) {\n this._readValue(v);\n if (this._grid) this._draw(); else this._pendingValue = String(v ?? '');\n }\n get start() { return this.getBoolAttr('range') ? this._start : this._day; }\n get end() { return this.getBoolAttr('range') ? this._end : this._day; }\n get month() { return this._month; }\n set month(v) {\n if (!/^\\d{4}-\\d{2}$/.test(v)) return;\n this._month = v; this._focus = null;\n if (this._grid) this._draw(); else this._pendingMonth = v;\n }\n get days() { return this._days ?? {}; }\n set days(v) { this._days = v && typeof v === 'object' ? v : {}; if (this._grid) this._draw(); }\n\n // ── markup ──\n _build() {\n const floating = this.getBoolAttr('floating');\n this._cal = this.createElement('div', ['nk-calendar'], { role: 'group' });\n const head = this.createElement('div', ['cal-head']);\n this._title = this.createElement('div', ['cal-title'], { 'aria-live': 'polite' });\n this._todayBtn = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev.innerHTML = CHEVRONS.prev;\n this._next = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._next.innerHTML = CHEVRONS.next;\n head.append(this._title, this._todayBtn, this._prev, this._next);\n this._grid = this.createElement('div', ['cal-grid']);\n this._foot = this.createElement('div', ['cal-foot']);\n this._timeInput = this.createElement('input', ['nk-input'], { type: 'time' });\n this._clear = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._cal.append(head, this._grid);\n this._pop = floating ? this.createElement('div', ['nk-pop', 'floating']) : null;\n if (this._pop) this._pop.appendChild(this._cal);\n this._wrapper.replaceChildren(this._pop ?? this._cal);\n this._draw();\n }\n\n get _hasTime() { return this.getBoolAttr('time') && !this.getBoolAttr('range'); }\n get _locale() { return resolveLocale(this.getAttribute('locale')); }\n get _weekStart() {\n const n = Number(this.getAttribute('week-start'));\n return this.hasAttribute('week-start') && Number.isInteger(n) && n >= 0 && n <= 6 ? n : firstWeekday(this._locale);\n }\n\n _syncPop() {\n this._pop?.classList.toggle('sheet', this.getBoolAttr('sheet'));\n this._pop?.classList.toggle('open', this.getBoolAttr('open'));\n }\n\n _draw() {\n const locale = this._locale, ws = this._weekStart, weeks = this.getBoolAttr('weeks'), range = this.getBoolAttr('range');\n const g = monthGrid(this._month, ws), today = this._todayIso();\n const min = this.getAttribute('min') || '', max = this.getAttribute('max') || '';\n const weekend = new Set((this.getAttribute('weekend') || '').split(',').map(s => s.trim()).filter(Boolean).map(Number));\n let days = this._days;\n if (!days && this.hasAttribute('days')) { try { days = JSON.parse(this.getAttribute('days')); } catch { days = {}; } }\n days ??= {};\n const long = new Intl.DateTimeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });\n this._cal.classList.toggle('weeks', weeks);\n this._syncPop();\n const label = this.getAttribute('label');\n if (label) this._cal.setAttribute('aria-label', label); else this._cal.removeAttribute('aria-label');\n this._title.textContent = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(g.first);\n this._todayBtn.textContent = this.getAttribute('today-label') || this.str('today');\n this._prev.setAttribute('aria-label', this.getAttribute('prev-label') || this.str('previousMonth'));\n this._next.setAttribute('aria-label', this.getAttribute('next-label') || this.str('nextMonth'));\n\n // The one tab stop: the focused day, else the chosen one, else the 1st.\n const cells = Array.from({ length: 42 }, (_, i) => isoOf(g.day(i)));\n const chosen = range ? this._start : this._day;\n if (!this._focus || !cells.includes(this._focus)) this._focus = cells.includes(chosen) ? chosen : `${this._month}-01`;\n\n const nodes = [];\n if (weeks) nodes.push(this._head(this.getAttribute('week-label') || weekLabel(locale)));\n for (const w of weekdayNames(locale, ws, 2)) nodes.push(this._head(w));\n for (let i = 0; i < 42; i++) {\n const d = g.day(i), iso = cells[i], info = days[iso] || {};\n if (weeks && i % 7 === 0) { const wk = this.createElement('span', ['cal-week'], { 'aria-hidden': 'true' }); wk.textContent = isoWeek(d); nodes.push(wk); }\n const inRange = range && this._start && this._end && iso > this._start && iso < this._end;\n const cls = ['cal-day', d.getMonth() !== g.m - 1 && 'out', (weekend.has(d.getDay()) || info.off) && 'off', iso === today && 'today',\n !range && iso === this._day && 'selected', range && iso === this._start && 'start', range && iso === (this._end || this._start) && this._start && 'end', inRange && 'in-range'].filter(Boolean);\n const day = this.createElement('button', cls, { type: 'button', 'data-date': iso, tabindex: iso === this._focus ? '0' : '-1',\n 'aria-pressed': String(cls.includes('selected') || cls.includes('start') || cls.includes('end')),\n 'aria-label': `${long.format(d)}${info.label ? `, ${info.label}` : ''}` });\n if (info.label) day.title = info.label;\n if ((min && iso < min) || (max && iso > max)) day.setAttribute('aria-disabled', 'true');\n day.textContent = d.getDate();\n const marks = (info.marks || []).slice(0, 3);\n if (marks.length) {\n const m = this.createElement('span', ['cal-marks']);\n for (const tone of marks) m.appendChild(this.createElement('i', [tone]));\n day.appendChild(m);\n }\n nodes.push(day);\n }\n // The days are drawn anew; focus inside the grid moves to the new tab stop.\n const focused = this._grid.contains(this._shadow.activeElement);\n this._grid.replaceChildren(...nodes);\n if (focused) this.focusDay();\n\n const time = this._hasTime, clearable = this.getBoolAttr('clearable');\n this._timeInput.value = this._time;\n this._timeInput.setAttribute('aria-label', this.getAttribute('time-label') || this.str('time'));\n this._clear.textContent = this.getAttribute('clear-label') || this.str('clear');\n this._foot.replaceChildren(...[time && this._timeInput, clearable && this._clear].filter(Boolean));\n if (time || clearable) this._cal.appendChild(this._foot); else this._foot.remove();\n this._syncForm();\n }\n\n _syncForm() {\n this.setFormValue(this.value);\n if (this.getBoolAttr('required') && !this.value) this.setValidity({ valueMissing: true }, 'Please choose a date.', this._grid?.querySelector('[tabindex=\"0\"]') ?? undefined);\n else this.setValidity({});\n }\n\n _head(text) {\n const s = this.createElement('span', ['cal-wd'], { 'aria-hidden': 'true' });\n s.textContent = text;\n return s;\n }\n\n // ── interaction ──\n _goMonth(month, focus) {\n if (month !== this._month) { this._month = month; this.emit('nk-month', { month }); }\n this._focus = focus ?? null;\n this._draw();\n }\n\n _pick(iso) {\n const day = this._grid.querySelector(`[data-date=\"${iso}\"]`);\n if (day?.getAttribute('aria-disabled') === 'true') return;\n const before = this.value;\n let done = true;\n if (this.getBoolAttr('range')) {\n if (!this._start || this._end) { this._start = iso; this._end = null; done = false; }\n else if (iso < this._start) { this._end = this._start; this._start = iso; }\n else this._end = iso;\n } else this._day = iso;\n this._focus = iso;\n if (iso.slice(0, 7) !== this._month) this._goMonth(iso.slice(0, 7), iso); else this._draw();\n if (!done) return;\n // Only a new value is a change; the same day again just closes a popover.\n if (this.value !== before) this.emit('nk-change', { value: this.value, start: this.start, end: this.end, time: this._time || null });\n if (this.getBoolAttr('floating') && !this._hasTime) this.close();\n }\n\n setupEvents() {\n this._onGrid = (e) => { const day = e.target.closest('.cal-day'); if (day) this._pick(day.dataset.date); };\n this._onToday = () => { const t = this._todayIso(); this._goMonth(t.slice(0, 7), t); };\n this._onPrev = () => this._goMonth(stepMonth(this._month, -1));\n this._onNext = () => this._goMonth(stepMonth(this._month, 1));\n this._onKey = (e) => {\n // Enter and Space are the day button's own click.\n const day = e.target.closest?.('.cal-day');\n if (!day) return;\n const date = parseDay(day.dataset.date), ws = this._weekStart, wd = (date.getDay() - ws + 7) % 7;\n let target = null;\n if (STEPS[e.key]) target = addDays(date, STEPS[e.key]);\n else if (e.key === 'Home') target = addDays(date, -wd);\n else if (e.key === 'End') target = addDays(date, 6 - wd);\n else if (e.key === 'PageUp' || e.key === 'PageDown') {\n const months = (e.key === 'PageUp' ? -1 : 1) * (e.shiftKey ? 12 : 1);\n const last = new Date(date.getFullYear(), date.getMonth() + months + 1, 0).getDate();\n target = new Date(date.getFullYear(), date.getMonth() + months, Math.min(date.getDate(), last));\n }\n if (!target) return;\n e.preventDefault();\n const iso = isoOf(target);\n if (iso.slice(0, 7) !== this._month) this._goMonth(iso.slice(0, 7), iso);\n else { this._focus = iso; this._draw(); }\n };\n this._onTime = () => {\n this._time = this._timeInput.value;\n this._syncForm();\n if (this._day) this.emit('nk-change', { value: this.value, start: this.start, end: this.end, time: this._time || null });\n };\n this._onClear = () => {\n if (!this.value) return;\n this._day = this._start = this._end = null; this._time = '';\n this._draw();\n this.emit('nk-change', { value: '', start: null, end: null, time: null });\n };\n // Floating: a tap outside closes it and reaches nothing else; Escape closes (captured, before a modal around it).\n this._onOutside = (e) => {\n const path = e.composedPath();\n if (path.includes(this) || (this._anchor && path.includes(this._anchor))) return;\n e.preventDefault(); e.stopPropagation();\n this.close();\n };\n this._onEscape = (e) => { if (e.key === 'Escape' && this.getBoolAttr('floating') && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._grid.addEventListener('click', this._onGrid);\n this._grid.addEventListener('keydown', this._onKey);\n this._todayBtn.addEventListener('click', this._onToday);\n this._prev.addEventListener('click', this._onPrev);\n this._next.addEventListener('click', this._onNext);\n this._timeInput.addEventListener('change', this._onTime);\n this._clear.addEventListener('click', this._onClear);\n document.addEventListener('keydown', this._onEscape, true);\n if (this.getBoolAttr('open')) document.addEventListener('click', this._onOutside, true);\n }\n\n teardownEvents() {\n this._grid?.removeEventListener('click', this._onGrid);\n this._grid?.removeEventListener('keydown', this._onKey);\n this._todayBtn?.removeEventListener('click', this._onToday);\n this._prev?.removeEventListener('click', this._onPrev);\n this._next?.removeEventListener('click', this._onNext);\n this._timeInput?.removeEventListener('change', this._onTime);\n this._clear?.removeEventListener('click', this._onClear);\n document.removeEventListener('keydown', this._onEscape, true);\n document.removeEventListener('click', this._onOutside, true);\n }\n\n onStringsChanged() { if (this._grid) this._draw(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'value') { this._readValue(value); this._draw(); return; }\n if (name === 'month') { this.month = value; return; }\n if (name === 'open' || name === 'sheet') { this._syncPop(); if (name === 'open') this._syncOpen(); return; }\n if (name === 'align') return;\n if (name === 'floating') { this.teardownEvents(); this._build(); if (this.isConnected) this.setupEvents(); return; }\n if (name === 'range') this._readValue(this.getAttribute('value'));\n if (name === 'days') this._days = null;\n this._draw();\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n if (this._anchor) (this._anchor.shadowRoot?.querySelector('button, a[href]') ?? this._anchor).setAttribute('aria-expanded', String(open));\n if (open) {\n this._returnFocus = deepActiveElement();\n if (this._returnFocus?.matches(':focus-visible')) requestAnimationFrame(() => this.focusDay());\n document.addEventListener('click', this._onOutside, true);\n } else {\n document.removeEventListener('click', this._onOutside, true);\n const back = this._returnFocus;\n this._returnFocus = null;\n const active = deepActiveElement();\n if (back?.isConnected && active && this._shadow.contains(active)) back.focus({ preventScroll: true });\n }\n this.emit('nk-toggle', { open });\n }\n\n // ── form ──\n resetValue() { this._readValue(this._initialValue); this._draw(); }\n restoreValue(state) { this._readValue(state); this._draw(); }\n onFormDisabled(disabled) { this._cal?.toggleAttribute('inert', disabled); }\n\n // ── API ──\n /** Opens under `anchor` (with `floating`), on the month of the value. */\n show(anchor) {\n if (anchor) { this._anchor = anchor; placeUnder(this, anchor, this.getAttribute('align')); }\n const shown = this.start;\n if (shown && shown.slice(0, 7) !== this._month) { this._month = shown.slice(0, 7); this._focus = null; this._draw(); }\n this.setBoolAttr('open', true);\n }\n close() { this.setBoolAttr('open', false); }\n toggle(anchor) { this.getBoolAttr('open') ? this.close() : this.show(anchor); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n /** Moves focus to the day with the tab stop. */\n focusDay() { this._grid?.querySelector('[tabindex=\"0\"]')?.focus(); }\n}\n\ncustomElements.define('nk-calendar', NkCalendar);\nexport { NkCalendar };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, deepActiveElement } from '../../util/focus.js';\n\n// <nk-peek id=\"peek\" label=\"Database Table-View\">\n// <nk-btn slot=\"actions\" variant=\"topbar\" aria-label=\"Open as page\"><svg …></svg></nk-btn>\n// <nk-page-title>🗃️ Database Table-View</nk-page-title>\n// <nk-props>…</nk-props>\n// <div class=\"nk-prose\">…</div>\n// <nk-comments>…</nk-comments>\n// </nk-peek>\n// → <div class=\"nk-peek-backdrop open\"><aside class=\"nk-peek\" role=\"dialog\">\n// <div class=\"pk-bar\"><button class=\"nk-topbar-btn\">»</button>…actions…</div>\n// <div class=\"pk-body\">…</div></aside></div>\n//\n// Notion's side peek (NotionKit 1.8.0): a row beside the table, which stays\n// usable – no scrim, nothing inert. show() slides it in and moves focus to\n// it; », Escape and a click elsewhere on the page close it, and Escape and »\n// hand focus back. A click that calls show() again – on another row – only\n// swaps the content, and clicks inside other overlays (a menu opened from\n// the peek) leave it open. Below 860px it is a bottom sheet over a dimmed\n// page; there it is modal: the page is inert and scroll-locked, the dimmed\n// page takes the tap that closes it. Put it directly under <body>.\n//\n// `resizable` (NotionKit 1.10.0): the left edge takes the pointer – and the\n// arrow keys, 16px a step – to make the peek wider or narrower, as in\n// Notion: from `min` (380) to `max` (all but 320px of the window). The width\n// is the token --nk-peek-width, set on :root; `width` (px) sets it too, and\n// nk-resize { width } fires when a drag or a key ends – the moment to keep\n// it. resize-label names the edge (default \"Resize\", in German \"Breite\n// ändern\").\n// `inset`: while it is open on the desktop, the page's <nk-app> gets\n// `peek-inset` – its main column makes room instead of lying under the peek.\nconst CLOSE_ICON = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 17 5-5-5-5M13 17l5-5-5-5\"/></svg>';\nconst OVERLAYS = new Set(['nk-menu', 'nk-pop', 'nk-modal', 'nk-sheet', 'nk-dialog', 'nk-cmdk', 'nk-toast']);\nconst OVERLAY_CLASSES = ['nk-pop', 'nk-modal-backdrop', 'nk-sheet-backdrop', 'nk-dialog-backdrop', 'nk-cmdk-backdrop'];\nconst phone = () => matchMedia('(max-width: 860px)').matches;\n\nclass NkPeek extends NkElement {\n static get observedAttributes() { return ['open', 'label', 'close-label', 'resizable', 'width', 'min', 'max', 'resize-label', 'inset']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-peek-backdrop']);\n this._box = this.createElement('aside', ['nk-peek'], { role: 'dialog', tabindex: '-1' });\n this._handle = this.createElement('div', ['pk-resize'], { role: 'separator', 'aria-orientation': 'vertical', tabindex: '0' });\n this._box.appendChild(this._handle);\n const bar = this.createElement('div', ['pk-bar']);\n this._close = this.createElement('button', ['nk-topbar-btn'], { type: 'button' });\n this._close.innerHTML = CLOSE_ICON;\n bar.append(this._close, this.createElement('slot', [], { name: 'actions' }));\n const body = this.createElement('div', ['pk-body']);\n body.appendChild(document.createElement('slot'));\n this._box.append(bar, body);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncLabels();\n this._syncResize();\n if (this.hasAttribute('width')) this._setWidth(Number(this.getAttribute('width')));\n this._syncOpen();\n }\n\n // ── width ──\n get _min() { return Number(this.getAttribute('min')) || 380; }\n get _max() { return Number(this.getAttribute('max')) || Math.max(this._min, innerWidth - 320); }\n /** The peek's width in px – the token --nk-peek-width. */\n get width() { return parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--nk-peek-width')) || 560; }\n set width(v) { this._setWidth(Number(v)); }\n\n _setWidth(w) {\n if (!Number.isFinite(w)) return;\n w = Math.round(Math.min(Math.max(w, this._min), Math.max(this._min, this._max)));\n document.documentElement.style.setProperty('--nk-peek-width', `${w}px`);\n this._handle.setAttribute('aria-valuenow', w);\n }\n\n _syncResize() {\n this._handle.hidden = !this.getBoolAttr('resizable');\n this._handle.setAttribute('aria-label', this.getAttribute('resize-label') || this.str('resize'));\n this._handle.setAttribute('aria-valuemin', this._min);\n this._handle.setAttribute('aria-valuenow', Math.round(this.width));\n }\n\n /** The app whose main column makes room: the peek's own, else the page's. */\n _app() { return this.closest('nk-app') ?? document.querySelector('nk-app'); }\n _syncInset() {\n const on = this.getBoolAttr('inset') && this.getBoolAttr('open') && !phone();\n if (on) this._app()?.setAttribute('peek-inset', '');\n else if (this._insetApp) this._app()?.removeAttribute('peek-inset');\n this._insetApp = on;\n }\n\n _syncLabels() {\n const label = this.getAttribute('label');\n if (label) this._box.setAttribute('aria-label', label); else this._box.removeAttribute('aria-label');\n this._close.setAttribute('aria-label', this.getAttribute('close-label') || this.str('close'));\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._syncInset();\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = deepActiveElement();\n if (phone()) {\n this._modal = true;\n this._box.setAttribute('aria-modal', 'true');\n lockScroll();\n this._undoInert = inertOutside(this);\n }\n requestAnimationFrame(() => this._box.focus({ preventScroll: true }));\n } else {\n if (this._modal) { this._modal = false; this._box.removeAttribute('aria-modal'); unlockScroll(); this._undoInert?.(); this._undoInert = null; }\n const active = deepActiveElement();\n const inside = active && (this.contains(active) || this._shadow.contains(active) || active === document.body);\n const back = this._returnFocus;\n this._returnFocus = null;\n if (inside && back?.isConnected && typeof back.focus === 'function') back.focus({ preventScroll: true });\n }\n }\n\n setupEvents() {\n this._onClose = () => this.close();\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) this.close(); };\n // Bubble phase, after the page's own handlers: a click that showed the\n // peek again (another row) must not close it.\n this._onOutside = (e) => {\n if (!this.getBoolAttr('open') || this._shownAt >= e.timeStamp) return;\n const path = e.composedPath();\n if (path.includes(this)) return;\n if (path.some(n => n.nodeType === 1 && (OVERLAYS.has(n.localName) || OVERLAY_CLASSES.some(c => n.classList.contains(c))))) return;\n this.close();\n };\n // The left edge: a drag with pointer capture, or the arrow keys.\n const resized = () => this.emit('nk-resize', { width: Math.round(this.width) });\n this._onResizeStart = (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n this._handle.setPointerCapture(e.pointerId);\n this._handle.classList.add('active');\n };\n this._onResizeMove = (e) => { if (this._handle.hasPointerCapture(e.pointerId)) this._setWidth(innerWidth - e.clientX); };\n this._onResizeEnd = () => { this._handle.classList.remove('active'); resized(); };\n this._onResizeKey = (e) => {\n const step = { ArrowLeft: 16, ArrowRight: -16 }[e.key];\n if (!step) return;\n e.preventDefault();\n this._setWidth(this.width + step);\n resized();\n };\n this._onViewport = () => this._syncInset();\n this._close.addEventListener('click', this._onClose);\n this._backdrop.addEventListener('click', this._onBackdrop);\n this._handle.addEventListener('pointerdown', this._onResizeStart);\n this._handle.addEventListener('pointermove', this._onResizeMove);\n this._handle.addEventListener('lostpointercapture', this._onResizeEnd);\n this._handle.addEventListener('keydown', this._onResizeKey);\n document.addEventListener('keydown', this._onKey);\n document.addEventListener('click', this._onOutside);\n addEventListener('resize', this._onViewport);\n }\n\n teardownEvents() {\n this._close?.removeEventListener('click', this._onClose);\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n this._handle?.removeEventListener('pointerdown', this._onResizeStart);\n this._handle?.removeEventListener('pointermove', this._onResizeMove);\n this._handle?.removeEventListener('lostpointercapture', this._onResizeEnd);\n this._handle?.removeEventListener('keydown', this._onResizeKey);\n document.removeEventListener('keydown', this._onKey);\n document.removeEventListener('click', this._onOutside);\n removeEventListener('resize', this._onViewport);\n if (this._insetApp) { this._app()?.removeAttribute('peek-inset'); this._insetApp = false; }\n if (this._modal) { this._modal = false; unlockScroll(); this._undoInert?.(); this._undoInert = null; }\n this._wasOpen = false;\n }\n\n onStringsChanged() { this._syncResize(); this._syncLabels(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'width') { this._setWidth(Number(value)); return; }\n if (name === 'inset') { this._syncInset(); return; }\n if (name !== 'open') { this._syncLabels(); this._syncResize(); return; }\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n show() { this._shownAt = performance.now(); this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.getBoolAttr('open') ? this.close() : this.show(); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { v ? this.show() : this.close(); }\n}\n\ncustomElements.define('nk-peek', NkPeek);\nexport { NkPeek };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, firstFocusable, deepActiveElement } from '../../util/focus.js';\n\n// <nk-dialog id=\"trash\" title=\"Move “Roadmap” to trash?\" alert>\n// The page and its sub-pages can be restored from Trash for 30 days.\n// <nk-btn slot=\"actions\" variant=\"secondary\" value=\"\">Cancel</nk-btn>\n// <nk-btn slot=\"actions\" variant=\"danger-solid\" value=\"trash\">Move to trash</nk-btn>\n// </nk-dialog>\n// → <div class=\"nk-dialog-backdrop open\"><div class=\"nk-dialog\" role=\"alertdialog\">\n// <div class=\"dl-title\">…</div><div class=\"dl-body\">…</div><div class=\"dl-actions\">…</div></div></div>\n//\n// A question or a short form (NotionKit 1.10.0) with the contract of\n// <nk-modal> and <nk-sheet>: show(), close(), toggle(), nk-toggle; Escape –\n// captured, so it closes before a peek, a menu or a modal behind it – and\n// the backdrop close it; focus moves in, to an [autofocus] element or the\n// first field or button, and back out; the page behind is inert and\n// scroll-locked. It lies above the modal and the sheet, so a question can\n// come from either. 440px, `wide` 560px; below 860px a bottom sheet with the\n// buttons stacked, the confirming one on top.\n// A button in slot=\"actions\" with a `value` closes it with that value, and\n// one anywhere inside with `data-close` with that attribute's value – a\n// button with a value elsewhere, an option of <nk-segmented> say, leaves it\n// open. The submit of a <form method=\"dialog\"> inside closes it too, with\n// its submitter's value. Before it closes, nk-close { value } fires and can\n// be cancelled – the place to check an input dialog; Escape and the\n// backdrop close with ''.\n// `returnValue` keeps the last value. `alert` makes it an alertdialog, named\n// and described by its title and text. `title` is the heading, never a\n// tooltip – see NkElement.takeTitle(). Put it directly under <body>.\nclass NkDialog extends NkElement {\n static get observedAttributes() { return ['open', 'title', 'wide', 'alert']; }\n\n render() {\n this.takeTitle();\n this.returnValue = '';\n this._backdrop = this.createElement('div', ['nk-dialog-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-dialog'], { 'aria-modal': 'true', tabindex: '-1' });\n this._heading = this.createElement('div', ['dl-title'], { id: 'title' });\n const body = this.createElement('div', ['dl-body'], { id: 'body' });\n body.appendChild(document.createElement('slot'));\n this._actions = this.createElement('div', ['dl-actions']);\n this._actionsSlot = this.createElement('slot', [], { name: 'actions' });\n this._actions.appendChild(this._actionsSlot);\n this._box.append(this._heading, body, this._actions);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncTitle();\n this._syncMode();\n this._syncOpen();\n }\n\n _syncTitle() {\n const text = this._titleText || '';\n this._heading.textContent = text;\n this._heading.hidden = !text;\n if (text) this._box.setAttribute('aria-labelledby', 'title');\n else this._box.removeAttribute('aria-labelledby');\n }\n\n _syncMode() {\n const alert = this.getBoolAttr('alert');\n this._box.setAttribute('role', alert ? 'alertdialog' : 'dialog');\n if (alert) this._box.setAttribute('aria-describedby', 'body'); else this._box.removeAttribute('aria-describedby');\n this._box.classList.toggle('wide', this.getBoolAttr('wide'));\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = this._from ?? deepActiveElement();\n this._from = null;\n // An overlay behind – a modal – made this host inert; the dialog lifts that while it is open.\n this._wasInert = this.inert;\n this.inert = false;\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => (this.querySelector('[autofocus]') || firstFocusable(this) || this._box).focus({ preventScroll: true }));\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n this.inert = this._wasInert;\n const back = this._returnFocus;\n this._returnFocus = null;\n if (back?.isConnected && typeof back.focus === 'function') back.focus({ preventScroll: true });\n }\n }\n\n setupEvents() {\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(''); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(''); } };\n // A button in the actions with a value closes it, and one with data-close\n // anywhere inside; a submit button is the form's.\n this._onClick = (e) => {\n const path = e.composedPath(), own = path.slice(0, Math.max(0, path.indexOf(this))).filter(n => n instanceof Element && this.contains(n));\n const button = own.find(n => n.localName === 'nk-btn' || n.localName === 'button');\n if (!button || button.getAttribute('type') === 'submit' || button.hasAttribute('disabled')) return;\n if (button.hasAttribute('data-close')) { this.close(button.getAttribute('data-close')); return; }\n if (button.hasAttribute('value') && own.some(n => n.getAttribute('slot') === 'actions')) this.close(button.getAttribute('value'));\n };\n this._onSubmit = (e) => {\n if ((e.target.getAttribute('method') || '').toLowerCase() !== 'dialog') return;\n e.preventDefault();\n this.close(e.submitter?.value || e.submitter?.getAttribute?.('value') || 'submit');\n };\n this._onSlot = () => { this._actions.hidden = !this._actionsSlot.assignedElements().length; };\n this._backdrop.addEventListener('click', this._onBackdrop);\n this.addEventListener('click', this._onClick);\n this.addEventListener('submit', this._onSubmit);\n this._actionsSlot.addEventListener('slotchange', this._onSlot);\n document.addEventListener('keydown', this._onKey, true);\n this._onSlot();\n }\n\n teardownEvents() {\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n this.removeEventListener('click', this._onClick);\n this.removeEventListener('submit', this._onSubmit);\n this._actionsSlot?.removeEventListener('slotchange', this._onSlot);\n document.removeEventListener('keydown', this._onKey, true);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onAttributeChanged(name, oldValue, value) {\n if (name === 'title') { if (this.takeTitle(value)) this._syncTitle(); return; }\n if (name !== 'open') { this._syncMode(); return; }\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n /** Opens it; focus goes back to `from` when it closes (default: what had focus – pass the ⋯ of a menu that closes). */\n show(from) { this.returnValue = ''; this._from = from ?? null; this.setBoolAttr('open', true); }\n /** Closes with `value`, unless an nk-close listener cancels it. Returns whether it closed. */\n close(value = '') {\n if (!this.getBoolAttr('open')) return false;\n if (!this.emit('nk-close', { value })) return false;\n this.returnValue = value;\n this.setBoolAttr('open', false);\n return true;\n }\n toggle() { this.getBoolAttr('open') ? this.close('') : this.show(); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { v ? this.show() : this.close(''); }\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._syncTitle(); }\n}\n\ncustomElements.define('nk-dialog', NkDialog);\nexport { NkDialog };\n","import { NkElement } from '../../base.js';\nimport { placeNear } from '../../util/floating.js';\nimport { deepActiveElement } from '../../util/focus.js';\n\n// <nk-tooltip></nk-tooltip> one for the page: every [data-tooltip]\n// <button data-tooltip=\"Close sidebar\" data-tooltip-key=\"⌘\\\">«</button>\n// <nk-tooltip for=\"saveBtn\" shortcut=\"⌘S\">Save the page</nk-tooltip>\n// tip.show(barOrRect, 'Shell · 12.10.–30.11.'); tip.hide();\n// → <div class=\"nk-tooltip open\" role=\"tooltip\">Close sidebar<span class=\"tt-key\">⌘\\</span></div>\n//\n// Notion's hover hint (NotionKit 1.10.0). Without `for` it serves every\n// element with data-tooltip – and data-tooltip-key for a shortcut – on the\n// page, inside shadow roots too: the tooltips of a whole toolbar in one\n// element. With `for` it belongs to the element with that id and shows its\n// own content and `shortcut`. It appears after `delay` ms (400) under the\n// pointer and at once on keyboard focus, never on touch; leaving, a press,\n// blur, scrolling – the wheel too, inside a shadow root – and Escape hide\n// it. It sits 6px below its target and centred, above it where the window\n// ends – placement=\"top\" prefers above – and 8px inside the window\n// (placeNear in util/floating.js). show(target, text, shortcut) takes an\n// element or a rect, for what has no element of its own: the bars of a\n// Gantt chart; such a tooltip stays until hide(), the pointer on another\n// [data-tooltip], a press or Escape. A line break in the text is kept.\n// While it shows, the target's aria-describedby names it (in the same\n// document or shadow root).\nconst hostSheet = new CSSStyleSheet();\nhostSheet.replaceSync(`:host { display: block; position: fixed; top: 0; left: 0; z-index: 130; pointer-events: none; }`);\nlet count = 0;\n\nclass NkTooltip extends NkElement {\n static get hostStyles() { return hostSheet; }\n static get observedAttributes() { return ['for', 'shortcut']; }\n\n render() {\n this._bubble = this.createElement('div', ['nk-tooltip'], { role: 'tooltip' });\n this._slot = document.createElement('slot');\n this._text = document.createTextNode('');\n this._key = this.createElement('span', ['tt-key']);\n this._bubble.append(this._slot, this._text, this._key);\n this._wrapper.appendChild(this._bubble);\n this._fill(null);\n }\n\n get _delay() { const d = Number(this.getAttribute('delay')); return this.hasAttribute('delay') && d >= 0 ? d : 400; }\n\n /** Own content (text null) or a given text and shortcut. */\n _fill(text, key = this.getAttribute('shortcut')) {\n this._slot.style.display = text == null ? '' : 'none';\n this._text.data = text ?? '';\n this._bubble.classList.toggle('lines', (text ?? '').includes('\\n'));\n this._key.textContent = key || '';\n this._key.hidden = !key;\n }\n\n /** Shows it at `target` – an element or a rect – with `text` (else its own content) and `shortcut`. */\n show(target, text, shortcut) {\n clearTimeout(this._timer);\n if (!target) return;\n // What the pointer is on now: a rect has no element, so moving over the\n // page leaves a tooltip shown for one alone.\n this._target = target instanceof Element ? target : null;\n this._fill(text ?? null, shortcut);\n this._describe(target);\n placeNear(this, target, this.getAttribute('placement') === 'top' ? 'top' : 'bottom');\n this._bubble.classList.add('open');\n }\n\n hide() {\n clearTimeout(this._timer);\n this._bubble?.classList.remove('open');\n this._describe(null);\n this._target = null;\n }\n\n get open() { return !!this._bubble?.classList.contains('open'); }\n\n _describe(target) {\n if (this._described) {\n const ids = (this._described.getAttribute('aria-describedby') || '').split(/\\s+/).filter(id => id && id !== this.id);\n ids.length ? this._described.setAttribute('aria-describedby', ids.join(' ')) : this._described.removeAttribute('aria-describedby');\n this._described = null;\n }\n if (!(target instanceof Element) || target.getRootNode() !== this.getRootNode()) return;\n this.id ||= `nk-tooltip-${++count}`;\n const ids = (target.getAttribute('aria-describedby') || '').split(/\\s+/).filter(Boolean);\n if (!ids.includes(this.id)) target.setAttribute('aria-describedby', [...ids, this.id].join(' '));\n this._described = target;\n }\n\n /** The element this tooltip serves for an event: its `for` target, or the nearest [data-tooltip]. */\n _targetOf(e) {\n const path = e.composedPath();\n const own = this.getAttribute('for');\n if (own) { const el = this.getRootNode().getElementById?.(own); return el && path.includes(el) ? el : null; }\n return path.find(n => n instanceof Element && n.hasAttribute('data-tooltip')) ?? null;\n }\n\n _showFor(el) {\n const own = this.hasAttribute('for');\n this.show(el, own ? null : el.getAttribute('data-tooltip'), own ? this.getAttribute('shortcut') : el.getAttribute('data-tooltip-key'));\n }\n\n setupEvents() {\n this._onOver = (e) => {\n const el = e.pointerType === 'touch' ? null : this._targetOf(e);\n if (el === this._target) return;\n this.hide();\n if (!el) return;\n this._target = el;\n this._timer = setTimeout(() => this._showFor(el), this._delay);\n };\n this._onFocus = (e) => {\n const el = this._targetOf(e);\n if (!el || !deepActiveElement()?.matches(':focus-visible')) return;\n this.hide();\n this._target = el;\n this._showFor(el);\n };\n this._onHide = () => this.hide();\n this._onKey = (e) => { if (e.key === 'Escape' && this.open) this.hide(); };\n document.addEventListener('pointerover', this._onOver);\n document.addEventListener('focusin', this._onFocus);\n document.addEventListener('focusout', this._onHide);\n document.addEventListener('pointerdown', this._onHide, true);\n document.addEventListener('scroll', this._onHide, true);\n // Scroll events do not leave a shadow root; the wheel does.\n document.addEventListener('wheel', this._onHide, { capture: true, passive: true });\n document.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n document.removeEventListener('pointerover', this._onOver);\n document.removeEventListener('focusin', this._onFocus);\n document.removeEventListener('focusout', this._onHide);\n document.removeEventListener('pointerdown', this._onHide, true);\n document.removeEventListener('scroll', this._onHide, true);\n document.removeEventListener('wheel', this._onHide, { capture: true });\n document.removeEventListener('keydown', this._onKey);\n this.hide();\n }\n\n onAttributeChanged(name) { if (name === 'shortcut' && !this._text.data) this._fill(null); if (name === 'for') this.hide(); }\n}\n\ncustomElements.define('nk-tooltip', NkTooltip);\nexport { NkTooltip };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, firstFocusable } from '../../util/focus.js';\n\n// <nk-modal id=\"settings\">\n// <nk-settings-user slot=\"user\" name=\"…\" mail=\"…\"></nk-settings-user>\n// <nk-settings-pane name=\"profile\" group=\"Account\" icon=\"👤\" label=\"My profile\" title=\"My profile\" active>…</nk-settings-pane>\n// <nk-settings-pane name=\"members\" group=\"Workspace\" icon=\"👥\" label=\"Members\" title=\"Members\">…</nk-settings-pane>\n// </nk-modal>\n// → <div class=\"nk-modal-backdrop open\"><div class=\"nk-modal\" role=\"dialog\">\n// <nav class=\"nk-settings-nav\">…user… section labels + tree rows…</nav>\n// <div class=\"nk-settings-content\">…panes…</div></div></div>\n//\n// The modal renders the nav rows itself from the panes' label/icon/group, so\n// `.nk-settings-nav .nk-tree-item` and the 860px icon-rail rules match with\n// no JS breakpoint. Escape and the backdrop close it; focus moves in and\n// back out; the page behind is scroll-locked and inert. Put the element\n// directly under <body>: a transformed ancestor would trap the fixed backdrop.\nclass NkModal extends NkElement {\n static get observedAttributes() { return ['open', 'pane']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-modal-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-modal'], { role: 'dialog', 'aria-modal': 'true', tabindex: '-1' });\n this._nav = this.createElement('nav', ['nk-settings-nav'], { 'aria-label': this.str('settings') });\n this._nav.appendChild(this.createElement('slot', [], { name: 'user' }));\n this._rows = document.createElement('div');\n this._nav.appendChild(this._rows);\n this._nav.appendChild(this.createElement('slot', [], { name: 'nav' }));\n this._content = this.createElement('div', ['nk-settings-content']);\n this._slot = document.createElement('slot');\n this._content.appendChild(this._slot);\n this._box.append(this._nav, this._content);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncOpen();\n this.requestNav();\n }\n\n get panes() { return [...this.querySelectorAll(':scope > nk-settings-pane')]; }\n\n /** Rebuilds the nav from the panes (debounced – panes upgrade after the modal). */\n requestNav() {\n if (this._navQueued) return;\n this._navQueued = true;\n queueMicrotask(() => { this._navQueued = false; this._buildNav(); });\n }\n\n _buildNav() {\n if (!this._rows) return;\n const panes = this.panes;\n const labelled = panes.filter(p => p.getAttribute('label'));\n this._rows.replaceChildren();\n this._nav.style.display = (labelled.length || this.querySelector(':scope > [slot=\"nav\"], :scope > [slot=\"user\"]')) ? '' : 'none';\n let lastGroup = null;\n for (const pane of labelled) {\n const group = pane.getAttribute('group');\n if (group && group !== lastGroup) {\n const label = this.createElement('div', ['nk-section-label']);\n label.textContent = group;\n this._rows.appendChild(label);\n lastGroup = group;\n }\n const row = this.createElement('div', ['nk-tree-item'], { role: 'tab', tabindex: '0', 'data-pane': pane.name });\n const icon = this.createElement('span', ['icon']);\n icon.textContent = pane.getAttribute('icon') || '';\n const text = this.createElement('span', ['label']);\n text.textContent = pane.getAttribute('label');\n row.append(icon, text);\n this._rows.appendChild(row);\n }\n this._syncActive();\n }\n\n /** Marks the active pane and its nav row without rebuilding the rows (keeps focus). */\n _syncActive() {\n const panes = this.panes;\n let current = this.getAttribute('pane');\n if (!panes.some(p => p.name === current)) current = (panes.find(p => p.hasAttribute('active')) || panes[0])?.name ?? null;\n for (const row of this._rows.querySelectorAll('[data-pane]')) {\n const on = row.dataset.pane === current;\n row.classList.toggle('active', on);\n row.setAttribute('aria-selected', on ? 'true' : 'false');\n }\n for (const pane of panes) pane.active = pane.name === current;\n this._current = current;\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = document.activeElement;\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => {\n const target = this._rows.querySelector('.nk-tree-item.active') || firstFocusable(this) || this._box;\n target.focus({ preventScroll: true });\n });\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n const back = this._returnFocus;\n if (back && typeof back.focus === 'function' && back.isConnected) back.focus({ preventScroll: true });\n this._returnFocus = null;\n }\n }\n\n setupEvents() {\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._onNavClick = (e) => { const row = e.target.closest('[data-pane]'); if (row) { row.focus(); this.pane = row.dataset.pane; } };\n this._onNavKey = (e) => {\n const row = e.target.closest?.('[data-pane]');\n if (!row) return;\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.pane = row.dataset.pane; return; }\n const dir = { ArrowDown: 1, ArrowUp: -1 }[e.key];\n if (!dir) return;\n const rows = [...this._rows.querySelectorAll('[data-pane]')];\n const next = rows[(rows.indexOf(row) + dir + rows.length) % rows.length];\n e.preventDefault(); next.focus(); this.pane = next.dataset.pane;\n };\n this._onSlot = () => this.requestNav();\n this._backdrop.addEventListener('click', this._onBackdrop);\n document.addEventListener('keydown', this._onKey);\n this._rows.addEventListener('click', this._onNavClick);\n this._rows.addEventListener('keydown', this._onNavKey);\n this._slot.addEventListener('slotchange', this._onSlot);\n }\n\n teardownEvents() {\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n document.removeEventListener('keydown', this._onKey);\n this._rows?.removeEventListener('click', this._onNavClick);\n this._rows?.removeEventListener('keydown', this._onNavKey);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onStringsChanged() { this._nav.setAttribute('aria-label', this.str('settings')); }\n\n onAttributeChanged(name) {\n if (name === 'open') {\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n } else if (name === 'pane') {\n const before = this._current;\n this._syncActive();\n if (this._current !== before) this.emit('nk-select', { value: this._current, label: this.panes.find(p => p.name === this._current)?.getAttribute('label') ?? this._current });\n }\n }\n\n show(pane) { if (pane) this.setAttribute('pane', pane); this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get pane() { return this._current ?? this.getAttribute('pane'); }\n set pane(v) { this.setAttribute('pane', v); }\n}\n\ncustomElements.define('nk-modal', NkModal);\nexport { NkModal };\n","import { NkElement } from '../../base.js';\n\n// <nk-settings-pane name=\"profile\" label=\"My profile\" icon=\"👤\" group=\"Account\" title=\"My profile\" active>…</nk-settings-pane>\n// `title` is the heading, never a tooltip – see NkElement.takeTitle().\n// → <section class=\"nk-settings-pane active\"><h2>My profile</h2>…</section>\n// `label`, `icon` and `group` feed the nav that <nk-modal> renders; `title`\n// renders the pane heading (child-combinator rule, so it lives here). Slotted\n// <h2>/<h3> are styled by their twins.\nclass NkSettingsPane extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'icon', 'group', 'title', 'active']; }\n\n render() {\n this._section = this.createElement('section', ['nk-settings-pane'], { role: 'tabpanel' });\n this._h2 = document.createElement('h2');\n this._section.appendChild(this._h2);\n this._section.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._section);\n this.takeTitle();\n this._sync();\n }\n\n _sync() {\n const title = this._titleText;\n this._h2.textContent = title || '';\n this._h2.style.display = title ? '' : 'none';\n this._section.classList.toggle('active', this.getBoolAttr('active'));\n this._section.setAttribute('aria-label', this.getAttribute('label') || title || this.getAttribute('name') || '');\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n if (['label', 'icon', 'group', 'name'].includes(name)) this.closest('nk-modal')?.requestNav?.();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n get name() { return this.getAttribute('name') ?? this.getAttribute('label') ?? ''; }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n}\n\ncustomElements.define('nk-settings-pane', NkSettingsPane);\nexport { NkSettingsPane };\n","import { NkElement } from '../../base.js';\n\n// <nk-settings-user slot=\"user\" name=\"Marcel Karas\" mail=\"marcel@…\" avatar=\"MK\"></nk-settings-user>\n// → <div class=\"nk-settings-user\"><div class=\"avatar\">MK</div><div class=\"u-text\"><div class=\"name\">…</div><div class=\"mail\">…</div></div></div>\nclass NkSettingsUser extends NkElement {\n static get observedAttributes() { return ['name', 'mail', 'avatar']; }\n\n render() {\n const box = this.createElement('div', ['nk-settings-user']);\n this._avatar = this.createElement('div', ['avatar']);\n const s = this.createElement('slot', [], { name: 'avatar' });\n s.appendChild(this._avatar);\n const text = this.createElement('div', ['u-text']);\n this._name = this.createElement('div', ['name']);\n this._mail = this.createElement('div', ['mail']);\n text.append(this._name, this._mail);\n box.append(s, text);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n const name = this.getAttribute('name') || '';\n this._name.textContent = name;\n const mail = this.getAttribute('mail');\n this._mail.textContent = mail || '';\n this._mail.style.display = mail ? '' : 'none';\n this._avatar.textContent = this.getAttribute('avatar') || name.split(/\\s+/).map(w => w[0]).join('').slice(0, 2).toUpperCase();\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-settings-user', NkSettingsUser);\nexport { NkSettingsUser };\n","// Subsequence scoring for the command palette: every query character must\n// appear in order; consecutive hits, word starts and an early first hit score\n// higher. Returns 0 when the query does not match.\nexport function fuzzyScore(query, text) {\n const q = query.trim().toLowerCase();\n if (!q) return 1;\n const t = text.toLowerCase();\n let ti = 0, score = 0, streak = 0;\n for (let qi = 0; qi < q.length; qi++) {\n const idx = t.indexOf(q[qi], ti);\n if (idx < 0) return 0;\n const wordStart = idx === 0 || /[\\s\\-_/.]/.test(t[idx - 1]);\n streak = idx === ti ? streak + 1 : 0;\n score += 1 + streak * 2 + (wordStart ? 3 : 0) - Math.min(3, (idx - ti) * 0.25);\n ti = idx + 1;\n }\n if (t.startsWith(q)) score += 10;\n return Math.max(0.01, score / (1 + t.length / 40));\n}\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside } from '../../util/focus.js';\nimport { fuzzyScore } from '../../util/fuzzy.js';\n\n// <nk-cmdk id=\"palette\" placeholder=\"Search or type a command …\"></nk-cmdk>\n// palette.commands = [\n// { group: 'Pages', items: [{ id: 'mvp', icon: '🚀', label: 'NotionKit MVP', keywords: 'project' }] },\n// { group: 'Actions', items: [{ id: 'theme', icon: '🌙', label: 'Toggle theme', shortcut: '⌘⇧L', action: () => … }] },\n// ];\n// → <div class=\"nk-cmdk-backdrop open\"><div class=\"nk-cmdk\"><div class=\"nk-cmdk-input-row\">🔍<input><kbd>esc</kbd></div>\n// <div class=\"nk-cmdk-list\">…</div><div class=\"nk-cmdk-footer\">…</div></div></div>\n// mod+K toggles (attribute `hotkey`), ↑↓ move, Enter picks (nk-command +\n// item.action), Escape / backdrop close. Fuzzy subsequence search over\n// label + keywords. Put the element directly under <body>.\nclass NkCmdk extends NkElement {\n static get observedAttributes() { return ['open', 'hotkey', 'placeholder']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-cmdk-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-cmdk'], { role: 'dialog', 'aria-modal': 'true' });\n const row = this.createElement('div', ['nk-cmdk-input-row']);\n const glass = document.createElement('span');\n glass.style.fontSize = '15px';\n glass.textContent = '🔍';\n this._input = this.createElement('input', [], { type: 'text', autocomplete: 'off', role: 'combobox', 'aria-expanded': 'true', 'aria-autocomplete': 'list' });\n const esc = this.createElement('kbd', ['nk-kbd']);\n esc.textContent = 'esc';\n row.append(glass, this._input, esc);\n this._list = this.createElement('div', ['nk-cmdk-list'], { role: 'listbox', id: 'list' });\n this._input.setAttribute('aria-controls', 'list');\n this._footer = this.createElement('div', ['nk-cmdk-footer']);\n const footerSlot = this.createElement('slot', [], { name: 'footer' });\n footerSlot.innerHTML = '<span><kbd class=\"nk-kbd\">↑</kbd><kbd class=\"nk-kbd\">↓</kbd> navigate</span><span><kbd class=\"nk-kbd\">↵</kbd> open</span><span><kbd class=\"nk-kbd\">⌘</kbd><kbd class=\"nk-kbd\">K</kbd> toggle</span>';\n this._footer.appendChild(footerSlot);\n this._box.append(row, this._list, this._footer);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._commands = [];\n this._index = 0;\n this._syncAttrs();\n this._renderList();\n this._syncOpen();\n }\n\n _syncAttrs() {\n this._input.placeholder = this.getAttribute('placeholder') || this.str('commandPlaceholder');\n this._box.setAttribute('aria-label', this.str('commandPalette'));\n }\n onStringsChanged() { this._syncAttrs(); }\n\n /** Filtered, flat list in group order, best matches first within a group. */\n results() {\n const q = this._input?.value ?? '';\n const out = [];\n for (const group of this._commands) {\n const scored = (group.items || []).map(item => ({ item, group: group.group, score: fuzzyScore(q, `${item.label} ${item.keywords || ''}`) })).filter(r => r.score > 0);\n scored.sort((a, b) => b.score - a.score);\n out.push(...scored);\n }\n return out;\n }\n\n _renderList() {\n if (!this._list) return;\n const results = this.results();\n this._index = Math.min(this._index, Math.max(0, results.length - 1));\n this._list.replaceChildren();\n if (!results.length) {\n const empty = this.createElement('div', ['nk-cmdk-empty']);\n empty.textContent = `No results for “${this._input.value}”`;\n this._list.appendChild(empty);\n this._input.removeAttribute('aria-activedescendant');\n return;\n }\n let lastGroup = null;\n results.forEach((r, i) => {\n if (r.group && r.group !== lastGroup) {\n const g = this.createElement('div', ['nk-cmdk-group']);\n g.textContent = r.group;\n this._list.appendChild(g);\n lastGroup = r.group;\n }\n const el = this.createElement('div', ['nk-cmdk-item'], { role: 'option', id: `opt-${i}`, 'data-index': i });\n el.classList.toggle('selected', i === this._index);\n el.setAttribute('aria-selected', i === this._index ? 'true' : 'false');\n const icon = this.createElement('span', ['m-icon']);\n icon.textContent = r.item.icon || '';\n const label = document.createElement('span');\n label.textContent = r.item.label;\n el.append(icon, label);\n if (r.item.shortcut) { const sc = this.createElement('span', ['m-shortcut']); sc.textContent = r.item.shortcut; el.appendChild(sc); }\n this._list.appendChild(el);\n });\n this._input.setAttribute('aria-activedescendant', `opt-${this._index}`);\n }\n\n _move(dir) {\n const n = this.results().length;\n if (!n) return;\n this._index = (this._index + dir + n) % n;\n for (const el of this._list.querySelectorAll('.nk-cmdk-item')) {\n const on = Number(el.dataset.index) === this._index;\n el.classList.toggle('selected', on);\n el.setAttribute('aria-selected', on ? 'true' : 'false');\n if (on) el.scrollIntoView({ block: 'nearest' });\n }\n this._input.setAttribute('aria-activedescendant', `opt-${this._index}`);\n }\n\n pick(index = this._index) {\n const r = this.results()[index];\n if (!r) return;\n const query = this._input.value;\n this.close();\n const ok = this.emit('nk-command', { id: r.item.id ?? r.item.label, item: r.item, query });\n if (ok && typeof r.item.action === 'function') r.item.action(r.item);\n }\n\n _matchesHotkey(e) {\n const spec = (this.getAttribute('hotkey') || 'mod+k').toLowerCase().split('+');\n const key = spec.pop();\n const mod = spec.includes('mod') ? (e.metaKey || e.ctrlKey) : true;\n const shift = spec.includes('shift') ? e.shiftKey : !e.shiftKey;\n const alt = spec.includes('alt') ? e.altKey : !e.altKey;\n return mod && shift && alt && e.key.toLowerCase() === key;\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = document.activeElement;\n this._input.value = '';\n this._index = 0;\n this._renderList();\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => this._input.focus({ preventScroll: true }));\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n const back = this._returnFocus;\n if (back && typeof back.focus === 'function' && back.isConnected) back.focus({ preventScroll: true });\n this._returnFocus = null;\n }\n }\n\n setupEvents() {\n this._onDocKey = (e) => {\n if (this._matchesHotkey(e)) { e.preventDefault(); this.toggle(); return; }\n if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); }\n };\n this._onInput = () => { this._index = 0; this._renderList(); };\n this._onInputKey = (e) => {\n if (e.key === 'ArrowDown') { e.preventDefault(); this._move(1); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); this._move(-1); }\n else if (e.key === 'Enter') { e.preventDefault(); this.pick(); }\n };\n this._onListClick = (e) => { const el = e.target.closest('.nk-cmdk-item'); if (el) this.pick(Number(el.dataset.index)); };\n this._onListMove = (e) => { const el = e.target.closest('.nk-cmdk-item'); if (el && Number(el.dataset.index) !== this._index) { this._index = Number(el.dataset.index); this._move(0); } };\n this._onListDown = (e) => e.preventDefault(); // keep the input focused\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n document.addEventListener('keydown', this._onDocKey);\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('keydown', this._onInputKey);\n this._list.addEventListener('click', this._onListClick);\n this._list.addEventListener('mousemove', this._onListMove);\n this._list.addEventListener('mousedown', this._onListDown);\n this._backdrop.addEventListener('click', this._onBackdrop);\n }\n\n teardownEvents() {\n document.removeEventListener('keydown', this._onDocKey);\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('keydown', this._onInputKey);\n this._list?.removeEventListener('click', this._onListClick);\n this._list?.removeEventListener('mousemove', this._onListMove);\n this._list?.removeEventListener('mousedown', this._onListDown);\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onAttributeChanged(name) {\n if (name === 'open') { this._syncOpen(); this.emit('nk-toggle', { open: this.getBoolAttr('open') }); }\n else this._syncAttrs();\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get commands() { return this._commands; }\n set commands(list) { this._commands = Array.isArray(list) ? list : []; this._index = 0; this._renderList(); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get query() { return this._input?.value ?? ''; }\n set query(v) { if (this._input) { this._input.value = v; this._index = 0; this._renderList(); } }\n}\n\ncustomElements.define('nk-cmdk', NkCmdk);\nexport { NkCmdk };\n","import { NkElement } from '../../base.js';\nimport { deepActiveElement } from '../../util/focus.js';\nimport { placeUnder } from '../../util/floating.js';\n\n// <nk-menu>\n// <nk-menu-item type=\"label\">Page</nk-menu-item>\n// <nk-menu-item icon=\"✏️\" shortcut=\"⌘E\" value=\"rename\">Rename</nk-menu-item>\n// <nk-menu-item type=\"separator\"></nk-menu-item>\n// <nk-menu-item icon=\"🗑️\" danger value=\"delete\">Delete</nk-menu-item>\n// </nk-menu>\n// → <div class=\"nk-pop nk-menu\" role=\"menu\">…</div>\n// ↑↓ move between items, Enter selects, nk-select bubbles from the item.\n//\n// <nk-menu floating sheet> is a menu over the page (NotionKit 1.7.0): it\n// fades in like the palette when `open` is set and is a bottom sheet on a\n// phone. The host becomes the fixed box you position – show(anchor) puts it\n// under the anchor, right edges aligned (align=\"start\": left edges). A tap\n// outside closes it and reaches nothing else; Escape and a chosen item\n// close it too, a switch row does not. Opened from the keyboard, focus moves\n// to the first item; closing returns it to where it was.\nconst floatSheet = new CSSStyleSheet();\nfloatSheet.replaceSync(`:host([floating]) { display: block; position: fixed; top: 0; left: 0; z-index: 106; pointer-events: none; }`);\n\nclass NkMenu extends NkElement {\n static get hostStyles() { return floatSheet; }\n static get observedAttributes() { return ['floating', 'sheet', 'open', 'align']; }\n\n render() {\n this._box = this.createElement('div', ['nk-pop', 'nk-menu'], { role: 'menu' });\n this._box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n this._syncMode();\n }\n\n _syncMode() {\n this._box.classList.toggle('floating', this.getBoolAttr('floating'));\n this._box.classList.toggle('sheet', this.getBoolAttr('sheet'));\n this._box.classList.toggle('open', this.getBoolAttr('open'));\n }\n\n onAttributeChanged(name) {\n this._syncMode();\n if (name !== 'open') return;\n const open = this.getBoolAttr('open');\n // aria-expanded belongs on the control itself, inside a host such as <nk-btn>.\n if (this._anchor) (this._anchor.shadowRoot?.querySelector('button, a[href]') ?? this._anchor).setAttribute('aria-expanded', String(open));\n if (open) {\n this._returnFocus = deepActiveElement();\n if (this._returnFocus?.matches(':focus-visible')) requestAnimationFrame(() => this.focusFirst());\n document.addEventListener('click', this._onOutside, true);\n } else {\n document.removeEventListener('click', this._onOutside, true);\n const back = this._returnFocus;\n this._returnFocus = null;\n if (back?.isConnected && this.contains(document.activeElement)) back.focus({ preventScroll: true });\n }\n this.emit('nk-toggle', { open });\n }\n\n /** Opens under `anchor` (any element, display: contents hosts included). */\n show(anchor) {\n if (anchor) {\n this._anchor = anchor;\n placeUnder(this, anchor, this.getAttribute('align'));\n }\n this.setBoolAttr('open', true);\n }\n close() { this.setBoolAttr('open', false); }\n toggle(anchor) { this.getBoolAttr('open') ? this.close() : this.show(anchor); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n\n get items() { return [...this.querySelectorAll(':scope > nk-menu-item')].filter(i => i.selectable); }\n\n setupEvents() {\n this._onKey = (e) => {\n const dir = { ArrowDown: 1, ArrowUp: -1 }[e.key];\n const current = e.target.closest?.('nk-menu-item');\n const items = this.items;\n if (!items.length) return;\n if (dir) {\n e.preventDefault();\n const i = items.indexOf(current);\n items[(i + dir + items.length) % items.length].focus();\n } else if ((e.key === 'Enter' || e.key === ' ') && current) {\n e.preventDefault(); current.select();\n }\n };\n this.addEventListener('keydown', this._onKey);\n // Floating: outside taps close and go nowhere else; Escape and a chosen item close.\n this._onOutside = (e) => {\n const path = e.composedPath();\n if (path.includes(this) || (this._anchor && path.includes(this._anchor))) return;\n e.preventDefault(); e.stopPropagation();\n this.close();\n };\n // Captured, so a menu inside a modal or sheet closes before they do.\n this._onEscape = (e) => { if (e.key === 'Escape' && this.getBoolAttr('floating') && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._onSelect = () => { if (this.getBoolAttr('floating')) this.close(); };\n document.addEventListener('keydown', this._onEscape, true);\n this.addEventListener('nk-select', this._onSelect);\n if (this.getBoolAttr('open')) document.addEventListener('click', this._onOutside, true);\n }\n\n teardownEvents() {\n this.removeEventListener('keydown', this._onKey);\n document.removeEventListener('keydown', this._onEscape, true);\n this.removeEventListener('nk-select', this._onSelect);\n document.removeEventListener('click', this._onOutside, true);\n }\n\n /** Focuses the first item (called by a popover when it opens). */\n focusFirst() { this.items[0]?.focus(); }\n}\n\ncustomElements.define('nk-menu', NkMenu);\nexport { NkMenu };\n","import { NkElement } from '../../base.js';\n\n// <nk-menu-item icon=\"✏️\" shortcut=\"⌘E\" value=\"rename\">Rename</nk-menu-item>\n// <nk-menu-item type=\"separator\"></nk-menu-item> <nk-menu-item type=\"label\">Danger</nk-menu-item>\n// <nk-menu-item icon=\"🗑️\" danger value=\"delete\">Delete</nk-menu-item>\n// <nk-menu-item type=\"switch\" icon=\"🔡\" value=\"small\" checked>Small text</nk-menu-item>\n// <nk-menu-item type=\"check\" icon=\"◉\" value=\"open\" checked>Status: Open</nk-menu-item>\n// → <div class=\"nk-menu-item danger\"><span class=\"m-icon\">🗑️</span>Delete<span class=\"m-shortcut\">…</span></div>\n// A switch item carries a .nk-switch on the right, as \"Small text\" does in\n// Notion's page menu; a check item a ✓ where the shortcut stands, as in a\n// filter menu. A click on either flips `checked` and fires nk-change\n// { value, checked } instead of nk-select, so the menu around it stays open.\nclass NkMenuItem extends NkElement {\n static get observedAttributes() { return ['icon', 'shortcut', 'danger', 'value', 'type', 'disabled', 'checked']; }\n\n render() { this._build(); }\n\n _build() {\n const type = this.getAttribute('type');\n let el;\n if (type === 'separator') {\n el = this.createElement('div', ['nk-menu-sep'], { role: 'separator' });\n } else if (type === 'label') {\n el = this.createElement('div', ['nk-menu-label']);\n el.appendChild(document.createElement('slot'));\n } else {\n const isSwitch = type === 'switch';\n this._check = type === 'check';\n el = this.createElement('div', ['nk-menu-item'], { role: isSwitch || this._check ? 'menuitemcheckbox' : 'menuitem', tabindex: '-1' });\n this._icon = this.createElement('span', ['m-icon']);\n const iconSlot = this.createElement('slot', [], { name: 'icon' });\n iconSlot.appendChild(this._icon);\n this._shortcut = this.createElement('span', ['m-shortcut']);\n el.append(iconSlot, document.createElement('slot'), this._shortcut);\n this._switch = isSwitch ? this.createElement('span', ['nk-switch'], { 'aria-hidden': 'true' }) : null;\n if (this._switch) el.appendChild(this._switch);\n }\n if (this._el) { this._el.removeEventListener('click', this._onClick); this._el.replaceWith(el); } else this._wrapper.appendChild(el);\n this._el = el;\n if (this._onClick) el.addEventListener('click', this._onClick);\n this._sync();\n }\n\n _sync() {\n if (!this._el.classList.contains('nk-menu-item')) return;\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._icon.style.display = icon ? '' : 'none';\n const sc = this.getAttribute('shortcut');\n this._shortcut.textContent = sc || '';\n this._shortcut.style.display = sc ? '' : 'none';\n this._el.classList.toggle('danger', this.getBoolAttr('danger'));\n this._el.setAttribute('aria-disabled', this.getBoolAttr('disabled') ? 'true' : 'false');\n if (this._switch || this._check) {\n const on = this.getBoolAttr('checked') ? 'true' : 'false';\n this._el.setAttribute('aria-checked', on);\n if (this._switch) this._switch.setAttribute('aria-checked', on);\n if (this._check) { this._shortcut.textContent = on === 'true' ? '✓' : ''; this._shortcut.style.display = ''; }\n }\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._el.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._el?.removeEventListener('click', this._onClick); }\n\n select() {\n if (!this._el.classList.contains('nk-menu-item') || this.getBoolAttr('disabled')) return;\n if (this._switch || this._check) {\n this.checked = !this.checked;\n this.emit('nk-change', { value: this.value, checked: this.checked, item: this });\n return;\n }\n this.emit('nk-select', { value: this.value, label: this.textContent.trim(), item: this });\n }\n\n onAttributeChanged(name) { name === 'type' ? this._build() : this._sync(); }\n focus(o) { this._el?.focus(o); }\n get selectable() { return this._el?.classList.contains('nk-menu-item') && !this.getBoolAttr('disabled'); }\n\n get checked() { return this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get value() { return this.getAttribute('value') ?? this.textContent.trim(); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-menu-item', NkMenuItem);\nexport { NkMenuItem };\n","import { NkElement } from '../../base.js';\n\n// <nk-pop placement=\"bottom-start\">\n// <nk-btn slot=\"trigger\" variant=\"secondary\">Options</nk-btn>\n// <nk-menu>…</nk-menu>\n// </nk-pop>\n// The trigger stays in the light DOM; a click on it toggles `open`, outside\n// clicks and Escape close. Content is wrapped in `.nk-pop` unless it brings\n// its own surface (nk-menu, nk-emoji-picker) or `bare` is set. The only\n// styling here is positioning – the surface look is the stylesheet's.\nconst popSheet = new CSSStyleSheet();\npopSheet.replaceSync(`\n .nk-pop-anchor { position: relative; display: inline-block; }\n .nk-pop-float { display: none; position: absolute; z-index: 50; top: 100%; left: 0; margin-top: 4px; }\n :host([open]) .nk-pop-float { display: block; }\n :host([placement=\"bottom-end\"]) .nk-pop-float { left: auto; right: 0; }\n :host([placement=\"top-start\"]) .nk-pop-float { top: auto; bottom: 100%; margin: 0 0 4px; }\n :host([placement=\"top-end\"]) .nk-pop-float { top: auto; bottom: 100%; left: auto; right: 0; margin: 0 0 4px; }\n`);\nconst OWN_SURFACE = new Set(['nk-menu', 'nk-emoji-picker']);\n\nclass NkPop extends NkElement {\n static get hostStyles() { return popSheet; }\n static get observedAttributes() { return ['open', 'placement', 'bare']; }\n\n render() {\n const anchor = this.createElement('div', ['nk-pop-anchor']);\n this._triggerSlot = this.createElement('slot', [], { name: 'trigger' });\n this._float = this.createElement('div', ['nk-pop-float']);\n this._surface = this.createElement('div', ['nk-pop']);\n this._slot = document.createElement('slot');\n this._surface.appendChild(this._slot);\n this._float.appendChild(this._surface);\n anchor.append(this._triggerSlot, this._float);\n this._wrapper.appendChild(anchor);\n this._syncSurface();\n }\n\n _syncSurface() {\n const bare = this.getBoolAttr('bare') || this._slot.assignedElements().some(el => OWN_SURFACE.has(el.localName));\n this._surface.className = bare ? '' : 'nk-pop';\n }\n\n setupEvents() {\n this._onTrigger = (e) => {\n if (!e.composedPath().some(n => n instanceof Element && n.getAttribute?.('slot') === 'trigger')) return;\n e.stopPropagation();\n this.toggle();\n };\n this._onDocClick = (e) => { if (this.getBoolAttr('open') && !e.composedPath().includes(this)) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) this.close(); };\n this._onSelect = (e) => { if (e.target !== this) this.close(); };\n this._onSlot = () => this._syncSurface();\n this.addEventListener('click', this._onTrigger);\n document.addEventListener('click', this._onDocClick);\n document.addEventListener('keydown', this._onKey);\n this._float.addEventListener('nk-select', this._onSelect);\n this._slot.addEventListener('slotchange', this._onSlot);\n }\n\n teardownEvents() {\n this.removeEventListener('click', this._onTrigger);\n document.removeEventListener('click', this._onDocClick);\n document.removeEventListener('keydown', this._onKey);\n this._float?.removeEventListener('nk-select', this._onSelect);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged(name) {\n if (name === 'bare') this._syncSurface();\n if (name === 'open') {\n const open = this.getBoolAttr('open');\n for (const el of this._triggerSlot.assignedElements()) el.setAttribute('aria-expanded', open ? 'true' : 'false');\n this.emit('nk-toggle', { open });\n }\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get placement() { return this.getAttribute('placement') || 'bottom-start'; }\n set placement(v) { this.setAttribute('placement', v); }\n}\n\ncustomElements.define('nk-pop', NkPop);\nexport { NkPop };\n","// Built-in emoji set for <nk-emoji-picker>: eight categories, names for\n// search. Override with `picker.emojis = [{ char, name, cat }]`.\nconst C = (cat, icon, list) => list.map(([char, name]) => ({ char, name, cat, icon }));\nexport const EMOJI_CATEGORIES = [\n { id: 'smileys', icon: '😀' }, { id: 'people', icon: '👋' }, { id: 'nature', icon: '🌿' }, { id: 'food', icon: '☕' },\n { id: 'activity', icon: '🎯' }, { id: 'travel', icon: '🚀' }, { id: 'objects', icon: '💡' }, { id: 'symbols', icon: '✅' },\n];\nexport const EMOJI = [\n ...C('smileys', '😀', [['😀', 'grinning'], ['😊', 'smile blush'], ['😂', 'joy laugh'], ['🙂', 'slight smile'], ['😉', 'wink'], ['😍', 'heart eyes love'], ['🤔', 'thinking'], ['😎', 'cool sunglasses'], ['🥳', 'party'], ['😴', 'sleep'], ['🤯', 'mind blown'], ['😅', 'sweat smile'], ['🙃', 'upside down'], ['😇', 'angel halo'], ['🤗', 'hug'], ['😢', 'cry sad']]),\n ...C('people', '👋', [['👋', 'wave hello'], ['👍', 'thumbs up'], ['👎', 'thumbs down'], ['🙏', 'pray thanks'], ['👏', 'clap'], ['🤝', 'handshake deal'], ['💪', 'strong'], ['👀', 'eyes look'], ['🧠', 'brain knowledge'], ['❤️', 'heart love'], ['👤', 'person user'], ['👥', 'people team members'], ['🧑‍💻', 'developer'], ['🙋', 'raise hand'], ['✍️', 'writing'], ['🫶', 'heart hands']]),\n ...C('nature', '🌿', [['🌿', 'leaf herb'], ['🌱', 'seedling'], ['🌳', 'tree'], ['🌸', 'blossom flower'], ['🌞', 'sun'], ['🌙', 'moon night'], ['⭐', 'star'], ['🔥', 'fire hot'], ['🌈', 'rainbow'], ['🌊', 'wave water'], ['🍀', 'clover luck'], ['🐝', 'bee'], ['🦋', 'butterfly'], ['🐢', 'turtle'], ['🌍', 'earth globe'], ['❄️', 'snow']]),\n ...C('food', '☕', [['☕', 'coffee'], ['🍵', 'tea'], ['🍎', 'apple'], ['🍕', 'pizza'], ['🍰', 'cake'], ['🍪', 'cookie'], ['🥐', 'croissant'], ['🍔', 'burger'], ['🍜', 'noodles'], ['🍺', 'beer'], ['🍷', 'wine'], ['🥗', 'salad'], ['🍫', 'chocolate'], ['🍓', 'strawberry'], ['🥑', 'avocado'], ['🍩', 'donut']]),\n ...C('activity', '🎯', [['🎯', 'target goal'], ['🏆', 'trophy win'], ['🎉', 'tada celebration'], ['🎨', 'art palette design'], ['🎙️', 'microphone podcast voice'], ['🎬', 'clapper movie'], ['🎮', 'game'], ['⚽', 'football'], ['🏃', 'run'], ['🧘', 'yoga calm'], ['🎵', 'music'], ['🎲', 'dice'], ['🏁', 'finish flag'], ['🎓', 'graduation learn'], ['🧩', 'puzzle piece'], ['🔁', 'repeat retro']]),\n ...C('travel', '🚀', [['🚀', 'rocket launch'], ['✈️', 'plane travel'], ['🚗', 'car'], ['🚲', 'bike'], ['🏠', 'house home'], ['🏢', 'office building'], ['🗺️', 'map'], ['🧭', 'compass'], ['⛰️', 'mountain'], ['🏖️', 'beach'], ['🚉', 'station'], ['🛰️', 'satellite'], ['🌆', 'city'], ['🏕️', 'camping'], ['⛵', 'sailboat'], ['🛫', 'departure']]),\n ...C('objects', '💡', [['💡', 'idea bulb'], ['📊', 'chart bar'], ['📈', 'chart up'], ['📅', 'calendar date'], ['📄', 'page document'], ['📁', 'folder'], ['🗃️', 'card box database'], ['📌', 'pin'], ['🔍', 'search'], ['🛠️', 'tools'], ['⚙️', 'gear settings'], ['🔔', 'bell notification'], ['💎', 'gem diamond'], ['📝', 'memo notes'], ['📎', 'paperclip files'], ['🔒', 'lock secure'], ['💬', 'speech comment'], ['📤', 'export outbox'], ['📥', 'inbox'], ['🗑️', 'trash bin'], ['🖥️', 'desktop'], ['📱', 'phone'], ['💻', 'laptop'], ['🧾', 'receipt']]),\n ...C('symbols', '✅', [['✅', 'check done'], ['✨', 'sparkles ai magic'], ['❌', 'cross no'], ['⚠️', 'warning'], ['ℹ️', 'info'], ['❓', 'question'], ['➕', 'plus add'], ['➡️', 'arrow right'], ['🔴', 'red circle'], ['🟢', 'green circle'], ['🟡', 'yellow circle'], ['🔵', 'blue circle'], ['⏳', 'hourglass wait'], ['♻️', 'recycle'], ['🆕', 'new'], ['💯', 'hundred']]),\n];\n","import { NkElement } from '../../base.js';\nimport { EMOJI, EMOJI_CATEGORIES } from '../../util/emoji.js';\n\n// <nk-emoji-picker></nk-emoji-picker>\n// → <div class=\"nk-pop\"><input class=\"nk-emoji-search\"><div class=\"nk-emoji-grid\">…</div><div class=\"nk-emoji-cats\">…</div></div>\n// Built-in set with names for search; `picker.emojis = [{ char, name, cat }]`\n// replaces it. A click fires nk-select { emoji }.\nclass NkEmojiPicker extends NkElement {\n static get observedAttributes() { return ['placeholder', 'value']; }\n\n render() {\n this._box = this.createElement('div', ['nk-pop']);\n this._search = this.createElement('input', ['nk-emoji-search'], { type: 'search', autocomplete: 'off' });\n this._grid = this.createElement('div', ['nk-emoji-grid'], { role: 'listbox' });\n this._cats = this.createElement('div', ['nk-emoji-cats'], { role: 'tablist' });\n this._box.append(this._search, this._grid, this._cats);\n this._wrapper.appendChild(this._box);\n this._emojis = EMOJI;\n this._cat = EMOJI_CATEGORIES[0].id;\n this._renderCats();\n this._renderGrid();\n this._syncAttrs();\n }\n\n _syncAttrs() {\n this._search.placeholder = this.getAttribute('placeholder') || this.str('emojiPlaceholder');\n this._search.setAttribute('aria-label', this.str('searchEmoji'));\n }\n onStringsChanged() { this._syncAttrs(); }\n\n _renderCats() {\n this._cats.replaceChildren();\n const cats = this._categories();\n for (const cat of cats) {\n const el = this.createElement('span', [], { role: 'tab', 'data-cat': cat.id, title: cat.id });\n el.textContent = cat.icon;\n el.classList.toggle('active', cat.id === this._cat);\n this._cats.appendChild(el);\n }\n this._cats.style.display = cats.length > 1 ? '' : 'none';\n }\n\n _categories() {\n if (this._catList) return this._catList;\n const seen = new Map();\n for (const e of this._emojis) if (e.cat && !seen.has(e.cat)) seen.set(e.cat, { id: e.cat, icon: e.icon || EMOJI_CATEGORIES.find(c => c.id === e.cat)?.icon || e.char });\n return [...seen.values()];\n }\n\n _renderGrid() {\n const q = this._search.value.trim().toLowerCase();\n const list = q ? this._emojis.filter(e => (e.name || '').toLowerCase().includes(q) || e.char === q) : this._emojis.filter(e => !e.cat || e.cat === this._cat);\n this._grid.replaceChildren();\n for (const e of list.slice(0, 64)) {\n const s = this.createElement('span', [], { role: 'option', title: e.name || '', 'data-emoji': e.char });\n s.textContent = e.char;\n this._grid.appendChild(s);\n }\n for (const el of this._cats.children) el.classList.toggle('active', !q && el.dataset.cat === this._cat);\n }\n\n setupEvents() {\n this._onInput = () => this._renderGrid();\n this._onGrid = (e) => { const s = e.target.closest('[data-emoji]'); if (s) this.select(s.dataset.emoji); };\n this._onCats = (e) => { const c = e.target.closest('[data-cat]'); if (!c) return; this._cat = c.dataset.cat; this._search.value = ''; this._renderGrid(); };\n this._onKey = (e) => { if (e.key === 'Enter') { const first = this._grid.querySelector('[data-emoji]'); if (first) this.select(first.dataset.emoji); } };\n this._search.addEventListener('input', this._onInput);\n this._search.addEventListener('keydown', this._onKey);\n this._grid.addEventListener('click', this._onGrid);\n this._cats.addEventListener('click', this._onCats);\n }\n\n teardownEvents() {\n this._search?.removeEventListener('input', this._onInput);\n this._search?.removeEventListener('keydown', this._onKey);\n this._grid?.removeEventListener('click', this._onGrid);\n this._cats?.removeEventListener('click', this._onCats);\n }\n\n select(emoji) {\n this.setAttribute('value', emoji);\n this.emit('nk-select', { emoji, value: emoji });\n }\n\n onAttributeChanged() { this._syncAttrs(); }\n focus(o) { this._search?.focus(o); }\n\n /** Category strip override: [{ id, icon }]. Emojis without `cat` show in every category. */\n get categories() { return this._categories(); }\n set categories(list) { this._catList = Array.isArray(list) && list.length ? list : null; this._cat = this._categories()[0]?.id; this._renderCats(); this._renderGrid(); }\n get emojis() { return this._emojis; }\n set emojis(list) { this._emojis = Array.isArray(list) ? list : EMOJI; this._cat = this._categories()[0]?.id; this._renderCats(); this._renderGrid(); }\n get value() { return this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-emoji-picker', NkEmojiPicker);\nexport { NkEmojiPicker };\n","import { NkElement } from '../../base.js';\n\n// <nk-toast id=\"toast\"></nk-toast> … toast.show('Saved');\n// → <div class=\"nk-toast show\">✓ Saved</div>\n// One node, bottom-centred, auto-hides after `duration` ms (default 2200).\n// Above a tab bar at the bottom of the screen it rises 12px over the bar:\n// notionkit.css does that for class markup with :has(), which cannot see\n// into shadow roots, so the element measures the bar when it opens.\nclass NkToast extends NkElement {\n static get observedAttributes() { return ['open', 'duration', 'icon']; }\n\n render() {\n this._box = this.createElement('div', ['nk-toast'], { role: 'status', 'aria-live': 'polite' });\n this._icon = document.createElement('span');\n this._msg = document.createElement('span');\n this._box.append(this._icon, this._msg, document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n if (this.getBoolAttr('open')) this._lift();\n this._box.classList.toggle('show', this.getBoolAttr('open'));\n const icon = this.getAttribute('icon') ?? '✓';\n this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n }\n\n // A bar counts when it is rendered and ends near the bottom of the viewport –\n // the app's own bar, fixed, sticky or floating. A tab bar shown as a preview\n // somewhere in a page does not lift the toast.\n _lift() {\n const bars = [...document.querySelectorAll('.nk-tab-bar')];\n for (const host of document.querySelectorAll('nk-tab-bar')) {\n const bar = host.shadowRoot?.querySelector('.nk-tab-bar');\n if (bar) bars.push(bar);\n }\n const rect = bars.map(b => b.getBoundingClientRect())\n .find(r => r.height > 0 && r.top < innerHeight && r.bottom > innerHeight - 60);\n this._box.style.bottom = rect ? `${Math.round(innerHeight - rect.top + 12)}px` : '';\n }\n\n /** Shows `message` (or the slotted content when omitted) and hides it again after `duration`. */\n show(message, { duration } = {}) {\n if (message !== undefined) this._msg.textContent = message;\n clearTimeout(this._timer);\n this.setBoolAttr('open', true);\n const ms = duration ?? Number(this.getAttribute('duration')) ?? 2200;\n if (ms > 0) this._timer = setTimeout(() => this.close(), ms || 2200);\n }\n\n close() { clearTimeout(this._timer); this.setBoolAttr('open', false); }\n\n onAttributeChanged(name) {\n this._sync();\n if (name === 'open') this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n disconnectedCallback() { super.disconnectedCallback(); clearTimeout(this._timer); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get message() { return this._msg?.textContent ?? ''; }\n set message(v) { if (this._msg) this._msg.textContent = v; }\n}\n\ncustomElements.define('nk-toast', NkToast);\nexport { NkToast };\n","import { NkElement } from '../../base.js';\n\n// <nk-database id=\"db\" view=\"table\" add-view>\n// <nk-table-view name=\"table\" label=\"▦ Table\" count></nk-table-view>\n// <nk-board-view name=\"board\" label=\"▤ Board\" group-by=\"status\"></nk-board-view>\n// </nk-database>\n// db.columns = [{ key: 'name', label: 'Name', type: 'text', icon: '📄', title: true }, { key: 'status', type: 'select', options: [...] }, …];\n// db.rows = [{ id: 1, icon: '🧭', name: '…', status: 'done', … }];\n// <nk-btn slot=\"tools\" variant=\"tool\">Filter</nk-btn> … sit right of the tabs,\n// <nk-filter-bar slot=\"filters\"> under them (NotionKit 1.7.0's toolbar).\n// → <div class=\"nk-database\"><div class=\"nk-db-toolbar\"><div class=\"nk-db-tabs\">…</div>\n// <div class=\"tools\">…</div></div>…filters…active view…</div>\n// The tabs come from the child views; data is pushed into every view.\nclass NkDatabase extends NkElement {\n static get observedAttributes() { return ['view', 'add-view']; }\n\n render() {\n this._box = this.createElement('div', ['nk-database']);\n this._toolbar = this.createElement('div', ['nk-db-toolbar']);\n this._tabs = this.createElement('div', ['nk-db-tabs'], { role: 'tablist' });\n const tools = this.createElement('div', ['tools']);\n this._toolsSlot = this.createElement('slot', [], { name: 'tools' });\n tools.appendChild(this._toolsSlot);\n this._toolbar.append(this._tabs, tools);\n this._slot = document.createElement('slot');\n this._box.append(this._toolbar, this.createElement('slot', [], { name: 'filters' }), this._slot);\n this._wrapper.appendChild(this._box);\n this._columns = []; this._rows = [];\n this._sync();\n }\n\n get views() { return this._slot?.assignedElements().filter(el => /^nk-[a-z]+-view$/.test(el.localName)) ?? []; }\n\n _sync() {\n if (!this._tabs) return;\n const views = this.views;\n let current = this.getAttribute('view');\n if (!views.some(v => v.name === current)) current = views[0]?.name ?? null;\n this._tabs.replaceChildren();\n for (const v of views) {\n const tab = this.createElement('span', ['nk-db-tab'], { role: 'tab', 'data-view': v.name, tabindex: '0' });\n tab.classList.toggle('active', v.name === current);\n tab.setAttribute('aria-selected', v.name === current ? 'true' : 'false');\n tab.append(document.createTextNode(v.getAttribute('label') || v.name));\n const badge = v.hasAttribute('count') ? String(this._rows.length) : v.getAttribute('badge');\n if (badge) { const b = this.createElement('span', ['badge']); b.textContent = badge; tab.appendChild(b); }\n this._tabs.appendChild(tab);\n v.hidden = v.name !== current;\n // A method call, not a property write: a view that has not been upgraded\n // yet would otherwise get an own `data` property that shadows its setter.\n v.setData?.(this._columns, this._rows);\n }\n if (this.getBoolAttr('add-view')) {\n const add = this.createElement('span', ['nk-db-tab', 'add'], { role: 'button', 'data-add': '', tabindex: '0' });\n add.textContent = '+';\n this._tabs.appendChild(add);\n }\n this._toolbar.hidden = !views.length && !this._toolsSlot.assignedElements().length;\n this._current = current;\n }\n\n /** Views upgrade after the database; each one asks for a resync once rendered. */\n requestSync() {\n if (this._syncQueued) return;\n this._syncQueued = true;\n queueMicrotask(() => { this._syncQueued = false; this._sync(); });\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const tab = e.target.closest('[data-view]');\n if (tab) { this.view = tab.dataset.view; return; }\n if (e.target.closest('[data-add]')) this.emit('nk-action', { action: 'add-view' });\n };\n this._onKey = (e) => { if ((e.key === 'Enter' || e.key === ' ') && e.target.closest('[data-view],[data-add]')) { e.preventDefault(); e.target.click(); } };\n this._onSlot = () => this._sync();\n this._tabs.addEventListener('click', this._onClick);\n this._tabs.addEventListener('keydown', this._onKey);\n this._slot.addEventListener('slotchange', this._onSlot);\n this._toolsSlot.addEventListener('slotchange', this._onSlot);\n this._sync();\n }\n\n teardownEvents() {\n this._tabs?.removeEventListener('click', this._onClick);\n this._tabs?.removeEventListener('keydown', this._onKey);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n this._toolsSlot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged(name) {\n const before = this._current;\n this._sync();\n if (name === 'view' && this._current !== before) this.emit('nk-view-change', { view: this._current });\n }\n\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._sync(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._sync(); }\n get view() { return this._current ?? this.getAttribute('view'); }\n set view(v) { this.setAttribute('view', v); }\n /** Re-renders every view after in-place row mutations. */\n refresh() { this._sync(); }\n}\n\ncustomElements.define('nk-database', NkDatabase);\nexport { NkDatabase };\n","// Polymorphic property renderer for database views. Returns plain DOM built\n// from NotionKit classes – deliberately not a custom element: every cell rule\n// starts with `.nk-table`, so a cell inside its own shadow root would never\n// be styled. Exported for consumers who render tables themselves.\n//\n// column: { key, label, type, icon, options: [{ value, label, color }], title }\n// types: text | select | multi-select | date | person | checkbox | url | number | progress | actions\n// url: a string is an address outside, opened in a new tab; { href, label,\n// target } a link of your own – to another page of the app, with its text.\n// actions: buttons for the row from column.actions [{ action, label, icon,\n// danger, disabled, tooltip }]; the row's value – action names or objects –\n// picks which of them it shows, all of them without one.\n// text: a string, or { text, desc, color, tooltip, sort } – one of Notion's\n// nine text colours for a tone, a quiet second line under it, the whole\n// text in a tooltip (served by <nk-tooltip>), a value to sort by.\n// progress: 0–100, the bar and its percentage as Intl writes it in\n// column.locale, else the page's language (\"45 %\" in German).\n// date: the value as given, or with column.format ('short', 'relative' or\n// Intl.DateTimeFormat options) and column.locale formatted from an ISO date\n// or date-time, D.M.YYYY, a Date or a timestamp; { start, end } is a range.\n// Sorting (compareBy) goes by column.sortKey – another field of the row –\n// when there is one, else by a value's `sort`, a date's time, a select's\n// place among its options; empty cells come last in both directions.\nimport { paintAvatar, initialsOf } from './avatar.js';\nimport { resolveLocale } from './dates.js';\n\nconst el = (tag, cls, text) => { const n = document.createElement(tag); if (cls) n.className = cls; if (text != null) n.textContent = text; return n; };\nconst COLORS = ['gray', 'brown', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'red'];\n\nexport function optionFor(column, value) {\n const opts = column.options || [];\n return opts.find(o => o.value === value) || opts.find(o => o.label === value) || null;\n}\n\nexport function tagFor(column, value) {\n const opt = optionFor(column, value);\n const color = opt?.color && COLORS.includes(opt.color) ? opt.color : 'gray'; // Notion's default option colour\n return el('span', `nk-tag ${color}`, opt?.label ?? String(value));\n}\n\n/** The text of a value: a string as it is, a text, link or person object's text, label or name. */\nexport const textOf = v => (v && typeof v === 'object' ? v.text ?? v.label ?? v.name ?? '' : String(v ?? ''));\n\n/** The time of a date value in ms: an ISO date – local midnight – or date-time, D.M.YYYY, a Date, a timestamp, a range's start; NaN when it is none. */\nexport function timeOf(v) {\n if (v instanceof Date) return v.getTime();\n if (typeof v === 'number') return v;\n if (v && typeof v === 'object') return timeOf(v.start);\n const s = String(v ?? '').trim();\n let m = s.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/);\n if (m) return new Date(+m[3], +m[2] - 1, +m[1]).getTime();\n m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (m) return new Date(+m[1], +m[2] - 1, +m[3]).getTime();\n return /^\\d{4}-\\d{2}-\\d{2}T/.test(s) ? Date.parse(s) : NaN;\n}\n\n/**\n * A date as its column shows it: as given without column.format; 'short' –\n * day and month, the year when it is not this one; 'relative' – minutes or\n * hours ago or ahead within a day, else the short date; or the options of\n * Intl.DateTimeFormat. A range { start, end } stands as start → end.\n */\nexport function formatDate(column, value) {\n if (value && typeof value === 'object' && !(value instanceof Date)) return [value.start, value.end].filter(Boolean).map(v => formatDate(column, v)).join(' → ');\n const format = column.format, t = timeOf(value);\n if (!format || Number.isNaN(t)) return String(value ?? '');\n const d = new Date(t), locale = column.locale || resolveLocale();\n if (format === 'relative') {\n const minutes = Math.round((t - Date.now()) / 60000), rel = new Intl.RelativeTimeFormat(locale, { numeric: 'auto', style: 'short' });\n if (Math.abs(minutes) < 60) return rel.format(minutes, 'minute');\n if (Math.abs(minutes) < 24 * 60) return rel.format(Math.round(minutes / 60), 'hour');\n }\n if (format === 'short' || format === 'relative') {\n const year = d.getFullYear() === new Date().getFullYear() ? {} : { year: 'numeric' };\n return d.toLocaleDateString(locale, { day: '2-digit', month: '2-digit', ...year });\n }\n return typeof format === 'object' ? new Intl.DateTimeFormat(locale, format).format(d) : String(value);\n}\n\nexport function renderPropertyCell(column, value, row = {}) {\n const type = column.type || 'text';\n if (type === 'actions') return actions(column, value);\n if (value === undefined || value === null || value === '') {\n if (type === 'checkbox') return checkbox(column, false, row);\n if (type === 'progress') return progress(column, 0);\n return el('span', type === 'person' ? 'person-cell' : null, type === 'text' && column.title ? '' : '—');\n }\n switch (type) {\n case 'select': return tagFor(column, value);\n case 'multi-select': {\n const wrap = el('span');\n wrap.style.display = 'inline-flex'; wrap.style.gap = '4px'; wrap.style.flexWrap = 'wrap';\n for (const v of Array.isArray(value) ? value : String(value).split(',').map(s => s.trim()).filter(Boolean)) wrap.appendChild(tagFor(column, v));\n return wrap;\n }\n case 'date': return el('span', 'date-cell', formatDate(column, value));\n case 'person': {\n const cell = el('span', 'person-cell');\n const p = typeof value === 'string' ? { name: value } : value;\n // color: one of Notion's nine names, or any CSS background; none – the avatar gradient.\n const avatar = el('span', 'nk-avatar small', p.initials || p.avatar || initialsOf(p.name));\n paintAvatar(avatar, p.color);\n cell.append(avatar, document.createTextNode(' ' + (p.name || '')));\n return cell;\n }\n case 'checkbox': return checkbox(column, !!value, row);\n case 'url': {\n const link = typeof value === 'object' ? value : { href: String(value), label: String(value).replace(/^https?:\\/\\//, ''), target: '_blank' };\n const a = el('a', null, link.label ?? link.href);\n a.href = link.href ?? '';\n if (link.target) a.target = link.target;\n if (link.target === '_blank') a.rel = 'noopener';\n return a;\n }\n // column.locale / column.format: Intl.NumberFormat locale and options, e.g. { minimumFractionDigits: 1 }.\n case 'number': return el('span', null, typeof value === 'number' ? value.toLocaleString(column.locale, column.format) : String(value));\n case 'progress': return progress(column, Number(value) || 0);\n default: {\n const o = typeof value === 'object' ? value : { text: value };\n let t;\n if (column.title) {\n t = el('span', 'row-title');\n if (row.icon) t.append(document.createTextNode(row.icon + ' '));\n t.append(document.createTextNode(String(o.text ?? '')));\n } else if (typeof value === 'object') {\n t = el('span', o.color && COLORS.includes(o.color) ? `td-text ${o.color}` : 'td-text', String(o.text ?? ''));\n } else return el('span', null, String(value));\n if (o.tooltip) t.dataset.tooltip = o.tooltip;\n if (!o.desc) return t;\n const frag = document.createDocumentFragment();\n frag.append(t, el('span', 'td-desc', String(o.desc)));\n return frag;\n }\n }\n}\n\nfunction actions(column, value) {\n const all = column.actions || [];\n const list = value == null ? all\n : (Array.isArray(value) ? value : [value]).map(v => typeof v === 'string' ? all.find(a => a.action === v) ?? { action: v, label: v } : v);\n const wrap = el('span', 'row-actions');\n for (const a of list) {\n const b = el('button', `nk-btn ${a.danger ? 'danger' : 'secondary'} small`, [a.icon, a.label ?? a.action].filter(Boolean).join(' '));\n b.type = 'button';\n b.dataset.action = a.action;\n b.disabled = !!a.disabled;\n if (a.tooltip) b.dataset.tooltip = a.tooltip;\n wrap.appendChild(b);\n }\n return wrap;\n}\n\nfunction checkbox(column, checked, row) {\n const label = el('label', 'nk-check');\n const input = el('input');\n input.type = 'checkbox'; input.checked = checked;\n input.dataset.key = column.key;\n if (row.id != null) input.dataset.rowId = row.id;\n label.appendChild(input);\n return label;\n}\n\nfunction progress(column, value) {\n const frag = document.createDocumentFragment();\n const bar = el('span', 'nk-progress');\n const fill = el('i'); fill.style.width = `${Math.max(0, Math.min(100, value))}%`;\n bar.appendChild(fill);\n frag.append(bar, el('span', 'nk-progress-label', formatPercent(column, value)));\n return frag;\n}\n\n/** A progress value of 0–100 as Intl writes a percentage in column.locale, else the page's language: 45 → \"45%\", in German \"45 %\". */\nexport function formatPercent(column, value) {\n const n = Number(value) || 0;\n try {\n return new Intl.NumberFormat(column.locale || resolveLocale(), { style: 'percent', maximumFractionDigits: 0 }).format(n / 100);\n } catch { return `${Math.round(n)}%`; } // a lang Intl does not take\n}\n\n/** A select's place among its options: the order Notion sorts by. */\nfunction rankOf(column, value) {\n const i = (column.options || []).findIndex(o => o.value === value || o.label === value);\n return i < 0 ? (column.options || []).length : i;\n}\n\n/** What a column sorts a row by – see the head of this file. */\nfunction sortValue(column, row) {\n if (column.sortKey) return row[column.sortKey];\n const v = row[column.key];\n if (v === undefined || v === null || v === '') return null;\n if (typeof v === 'object' && !Array.isArray(v) && 'sort' in v) return v.sort;\n switch (column.type || 'text') {\n case 'number': case 'progress': return Number(v);\n case 'checkbox': return v ? 1 : 0;\n case 'date': { const t = timeOf(v); return Number.isNaN(t) ? String(v) : t; }\n case 'select': return rankOf(column, v);\n case 'multi-select': { const first = (Array.isArray(v) ? v : String(v).split(','))[0]; return first == null ? null : rankOf(column, String(first).trim()); }\n default: return textOf(v);\n }\n}\n\n/** Sort comparator for a column; empty cells come last whichever the direction. */\nexport function compareBy(column, dir = 1) {\n const empty = v => v === null || v === undefined || v === '' || Number.isNaN(v);\n return (a, b) => {\n const x = sortValue(column, a), y = sortValue(column, b);\n if (empty(x) || empty(y)) return empty(x) === empty(y) ? 0 : empty(x) ? 1 : -1;\n if (typeof x === 'number' && typeof y === 'number') return (x - y) * dir;\n return String(x).localeCompare(String(y), undefined, { numeric: true }) * dir;\n };\n}\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, compareBy } from '../../util/property-cell.js';\n\n// <nk-table-view name=\"table\" label=\"▦ Table\" count new-row sortable wrap></nk-table-view>\n// `wrap` lets cell text break (`.nk-table.wrap`), like Notion's \"wrap column\".\n// Standalone: view.columns = […]; view.rows = […]; Inside <nk-database> the\n// database pushes `data`. → <div class=\"nk-table-wrap\"><table class=\"nk-table\">…</table><div class=\"nk-new-row\">+ New page</div></div>\n// Cells are plain markup from renderPropertyCell(); rows fire nk-select\n// { row, id, key, cell } – `key` and `cell` say which cell was hit, to open\n// an editor there, like the date picker under a due date – checkboxes\n// nk-change, headers nk-action { action: 'sort' } (and sort locally\n// with `sortable`), the add row nk-action { action: 'new-row' }. A column of\n// type 'actions' (NotionKit 1.12.0) sets buttons in each row; a click on one\n// fires nk-action { action, row, id, anchor } instead of selecting the row,\n// and its header sorts nothing.\nclass NkTableView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'new-row', 'new-row-label', 'sortable', 'sort-key', 'sort-dir', 'wrap']; }\n\n render() {\n this._wrap = this.createElement('div', ['nk-table-wrap']);\n this._table = this.createElement('table', ['nk-table']);\n this._thead = document.createElement('thead');\n this._tbody = document.createElement('tbody');\n this._table.append(this._thead, this._tbody);\n this._newRow = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0' });\n this._wrap.append(this._table, this._newRow);\n this._wrapper.appendChild(this._wrap);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _sortedRows() {\n const key = this.getAttribute('sort-key');\n const col = this._columns.find(c => c.key === key);\n if (!col) return this._rows;\n return [...this._rows].sort(compareBy(col, this.getAttribute('sort-dir') === 'desc' ? -1 : 1));\n }\n\n _render() {\n if (!this._thead) return;\n this._table.classList.toggle('wrap', this.getBoolAttr('wrap'));\n const tr = document.createElement('tr');\n for (const col of this._columns) {\n const actions = col.type === 'actions';\n const th = this.createElement('th', actions ? ['actions'] : [], actions ? { scope: 'col' } : { 'data-key': col.key, scope: 'col' });\n if (col.icon) { const i = this.createElement('span', ['th-icon']); i.textContent = col.icon; th.appendChild(i); }\n th.appendChild(document.createTextNode(col.label ?? (actions ? '' : col.key)));\n if (col.key === this.getAttribute('sort-key')) th.appendChild(document.createTextNode(this.getAttribute('sort-dir') === 'desc' ? ' ↓' : ' ↑'));\n if (col.width) th.style.width = col.width;\n tr.appendChild(th);\n }\n this._thead.replaceChildren(tr);\n this._tbody.replaceChildren();\n for (const row of this._sortedRows()) {\n const r = this.createElement('tr', [], { 'data-id': row.id ?? '' });\n for (const col of this._columns) {\n const td = document.createElement('td');\n // Numbers right-aligned in figures of equal width, as Notion sets them.\n if (col.type === 'number') td.className = 'num';\n td.appendChild(renderPropertyCell(col, row[col.key], row));\n r.appendChild(td);\n }\n this._tbody.appendChild(r);\n }\n this._newRow.textContent = this.getAttribute('new-row-label') || this.str('newPage');\n this._newRow.style.display = this.getBoolAttr('new-row') ? '' : 'none';\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (this._newRow.contains(e.target)) { this.emit('nk-action', { action: 'new-row' }); return; }\n const th = e.target.closest('th[data-key]');\n if (th) {\n const key = th.dataset.key;\n const dir = this.getAttribute('sort-key') === key && this.getAttribute('sort-dir') !== 'desc' ? 'desc' : 'asc';\n const ok = this.emit('nk-action', { action: 'sort', key, value: dir });\n if (ok && this.getBoolAttr('sortable')) { this.setAttribute('sort-key', key); this.setAttribute('sort-dir', dir); }\n return;\n }\n const act = e.target.closest('button[data-action]');\n if (act) {\n const row = this._rowById(act.closest('tr[data-id]')?.dataset.id);\n if (!act.disabled) this.emit('nk-action', { action: act.dataset.action, row, id: row?.id, anchor: act });\n return;\n }\n if (e.target.closest('input[type=checkbox], a')) return;\n const tr = e.target.closest('tr[data-id]');\n if (!tr) return;\n // Which cell: `key` names its column, `cell` is there to anchor an editor to.\n const cell = e.target.closest('td');\n const row = this._rowById(tr.dataset.id);\n this.emit('nk-select', { row, id: row?.id, value: row?.id, key: cell ? this._columns[cell.cellIndex]?.key : undefined, cell });\n };\n this._onChange = (e) => {\n const input = e.target;\n if (input.type !== 'checkbox') return;\n const row = this._rowById(input.dataset.rowId);\n if (row) row[input.dataset.key] = input.checked;\n this.emit('nk-change', { row, key: input.dataset.key, value: input.checked });\n };\n this._onKey = (e) => { if ((e.key === 'Enter' || e.key === ' ') && e.target === this._newRow) { e.preventDefault(); this.emit('nk-action', { action: 'new-row' }); } };\n this._wrap.addEventListener('click', this._onClick);\n this._wrap.addEventListener('change', this._onChange);\n this._wrap.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._wrap?.removeEventListener('click', this._onClick);\n this._wrap?.removeEventListener('change', this._onChange);\n this._wrap?.removeEventListener('keydown', this._onKey);\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n onStringsChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'table'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-table-view', NkTableView);\nexport { NkTableView };\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, tagFor, textOf, formatDate, formatPercent } from '../../util/property-cell.js';\n\n// <nk-board-view name=\"board\" label=\"▤ Board\" group-by=\"status\" new-row></nk-board-view>\n// Groups rows by a select column (default: the first select column); one\n// column per option, in option order. Cards show the title column and the\n// `meta-keys` (default: date and progress columns). Drag a card onto another\n// column to change its value – the row is updated and nk-change fires.\n// → <div class=\"nk-board active\"><div class=\"nk-board-col\">…</div>…</div>\nclass NkBoardView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'group-by', 'title-key', 'meta-keys', 'new-row']; }\n\n render() {\n this._board = this.createElement('div', ['nk-board', 'active']);\n this._wrapper.appendChild(this._board);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _groupColumn() {\n const key = this.getAttribute('group-by');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.type === 'select') || null;\n }\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n _metaColumns() {\n const keys = (this.getAttribute('meta-keys') || '').split(',').map(s => s.trim()).filter(Boolean);\n if (keys.length) return keys.map(k => this._columns.find(c => c.key === k)).filter(Boolean);\n return this._columns.filter(c => c.type === 'date' || c.type === 'progress');\n }\n\n _render() {\n if (!this._board) return;\n this._board.replaceChildren();\n const group = this._groupColumn(), title = this._titleColumn();\n if (!group) return;\n const options = group.options?.length ? group.options : [...new Set(this._rows.map(r => r[group.key]))].map(v => ({ value: v, label: String(v) }));\n for (const opt of options) {\n const col = this.createElement('div', ['nk-board-col'], { 'data-value': opt.value });\n const header = this.createElement('div', ['nk-board-col-header']);\n const cards = this._rows.filter(r => r[group.key] === opt.value || r[group.key] === opt.label);\n const count = this.createElement('span', ['count']);\n count.textContent = String(cards.length);\n header.append(tagFor(group, opt.value), count);\n col.appendChild(header);\n for (const row of cards) {\n const card = this.createElement('div', ['nk-card'], { draggable: 'true', 'data-id': row.id ?? '', tabindex: '0' });\n const t = this.createElement('div', ['card-title']);\n t.textContent = `${row.icon ? row.icon + ' ' : ''}${title ? textOf(row[title.key]) : ''}`;\n const meta = this.createElement('div', ['card-meta']);\n for (const c of this._metaColumns()) {\n const v = row[c.key];\n if (v === undefined || v === null || v === '') continue;\n const s = document.createElement('span');\n if (c.type === 'progress') s.textContent = `▰ ${formatPercent(c, v)}`;\n else if (c.type === 'date') s.textContent = `📅 ${formatDate(c, v)}`;\n else s.appendChild(renderPropertyCell(c, v, row));\n meta.appendChild(s);\n }\n card.append(t, meta);\n col.appendChild(card);\n }\n if (this.getBoolAttr('new-row')) {\n const add = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0', 'data-add': opt.value });\n add.style.padding = '6px 10px';\n add.textContent = '+';\n col.appendChild(add);\n }\n this._board.appendChild(col);\n }\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const add = e.target.closest('[data-add]');\n if (add) { this.emit('nk-action', { action: 'new-row', value: add.dataset.add }); return; }\n const card = e.target.closest('.nk-card');\n if (card) { const row = this._rowById(card.dataset.id); this.emit('nk-select', { row, id: row?.id, value: row?.id }); }\n };\n this._onDragStart = (e) => { const card = e.target.closest?.('.nk-card'); if (!card) return; this._dragId = card.dataset.id; e.dataTransfer.effectAllowed = 'move'; try { e.dataTransfer.setData('text/plain', card.dataset.id); } catch {} };\n this._onDragOver = (e) => { if (this._dragId != null && e.target.closest('.nk-board-col')) { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; } };\n this._onDrop = (e) => {\n const col = e.target.closest('.nk-board-col');\n if (!col || this._dragId == null) return;\n e.preventDefault();\n this.move(this._dragId, col.dataset.value);\n this._dragId = null;\n };\n this._board.addEventListener('click', this._onClick);\n this._board.addEventListener('dragstart', this._onDragStart);\n this._board.addEventListener('dragover', this._onDragOver);\n this._board.addEventListener('drop', this._onDrop);\n }\n\n teardownEvents() {\n this._board?.removeEventListener('click', this._onClick);\n this._board?.removeEventListener('dragstart', this._onDragStart);\n this._board?.removeEventListener('dragover', this._onDragOver);\n this._board?.removeEventListener('drop', this._onDrop);\n }\n\n /** Moves a row into another column (sets the group value) and reports it. */\n move(id, value) {\n const row = this._rowById(id), group = this._groupColumn();\n if (!row || !group || row[group.key] === value) return;\n row[group.key] = value;\n this._render();\n this.emit('nk-change', { row, key: group.key, value });\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'board'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-board-view', NkBoardView);\nexport { NkBoardView };\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, textOf, formatDate } from '../../util/property-cell.js';\n\n// <nk-list-view name=\"list\" label=\"☰ List\" meta-keys=\"due,status\" new-row></nk-list-view>\n// The third database view: one line per row – icon and title, the `meta-keys`\n// on the right (default: the select and date columns, in column order). Dates\n// and text stand as text, selects as tags, a person as avatar and name.\n// Standalone: view.columns = […]; view.rows = […]. Inside <nk-database> the\n// database pushes the data. Rows fire nk-select, the add row nk-action\n// { action: 'new-row' }.\n// → <div class=\"nk-list\"><div class=\"nk-list-item\"><span class=\"l-icon\">…</span><span class=\"l-title\">…</span><span class=\"l-meta\">…</span></div>…</div>\nclass NkListView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'title-key', 'meta-keys', 'new-row', 'new-row-label']; }\n\n render() {\n this._box = document.createElement('div');\n this._list = this.createElement('div', ['nk-list'], { role: 'list' });\n this._newRow = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0' });\n this._box.append(this._list, this._newRow);\n this._wrapper.appendChild(this._box);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n _metaColumns() {\n const keys = (this.getAttribute('meta-keys') || '').split(',').map(s => s.trim()).filter(Boolean);\n if (keys.length) return keys.map(k => this._columns.find(c => c.key === k)).filter(Boolean);\n return this._columns.filter(c => c.type === 'select' || c.type === 'date');\n }\n\n _render() {\n if (!this._list) return;\n const title = this._titleColumn(), meta = this._metaColumns();\n this._list.replaceChildren();\n for (const row of this._rows) {\n const item = this.createElement('div', ['nk-list-item'], { role: 'listitem', tabindex: '0', 'data-id': row.id ?? '' });\n const icon = this.createElement('span', ['l-icon']);\n icon.textContent = row.icon || '';\n if (!row.icon) icon.style.display = 'none';\n const t = this.createElement('span', ['l-title']);\n t.textContent = title ? textOf(row[title.key]) : '';\n const m = this.createElement('span', ['l-meta']);\n for (const c of meta) {\n const v = row[c.key];\n if (v === undefined || v === null || v === '') continue;\n m.appendChild(c.type === 'date' ? document.createTextNode(formatDate(c, v)) : c.type === 'text' || !c.type ? document.createTextNode(textOf(v)) : renderPropertyCell(c, v, row));\n }\n item.append(icon, t, m);\n this._list.appendChild(item);\n }\n this._newRow.textContent = this.getAttribute('new-row-label') || this.str('newPage');\n this._newRow.style.display = this.getBoolAttr('new-row') ? '' : 'none';\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (this._newRow.contains(e.target)) { this.emit('nk-action', { action: 'new-row' }); return; }\n const item = e.target.closest('.nk-list-item');\n if (item) { const row = this._rowById(item.dataset.id); this.emit('nk-select', { row, id: row?.id, value: row?.id }); }\n };\n this._onKey = (e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n if (e.target === this._newRow || e.target.classList?.contains('nk-list-item')) { e.preventDefault(); e.target.click(); }\n };\n this._box.addEventListener('click', this._onClick);\n this._box.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._box?.removeEventListener('click', this._onClick);\n this._box?.removeEventListener('keydown', this._onKey);\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n onStringsChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'list'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-list-view', NkListView);\nexport { NkListView };\n","import { NkElement } from '../../base.js';\nimport { textOf } from '../../util/property-cell.js';\nimport { isoOf, parseDay, isoWeek, resolveLocale, firstWeekday, weekdayNames, monthGrid, stepMonth, weekLabel, CHEVRONS } from '../../util/dates.js';\n\n// <nk-calendar-view name=\"calendar\" label=\"📅 Calendar\" date-key=\"due\" weeks></nk-calendar-view>\n// The fourth database view (NotionKit 1.9.0): a month, the rows as cards on\n// their dates. `date-key` names the date column (default: the first one),\n// `title-key` the title (default: the title column); dates are YYYY-MM-DD or\n// D.M.YYYY, a range { start, end } stands on its start. month (YYYY-MM;\n// default today's), weeks (the ISO week in front of each row), week-start\n// (0 = Sunday … 6 = Saturday; default from the locale), weekend (weekdays\n// washed like the days of other months, \"6,0\"), today, locale and the texts\n// today-label, prev-label, next-label, week-label – without them English\n// or German after the language (1.17.0).\n// Standalone: view.columns = […]; view.rows = […]. Inside <nk-database> the\n// database pushes the data. A card fires nk-select { row, id, value } like a\n// row of the table, Today and ‹ › nk-month { month }.\n// → <div class=\"nk-calendar-view weeks\"><div class=\"cv-head\"><div class=\"cv-title\">May 2026</div><button class=\"cal-nav\">Today</button>‹ ›</div>\n// <div class=\"cv-grid\"><div class=\"cv-wd\">W</div>…<div class=\"cv-week\">21</div><div class=\"cv-day today\"><span class=\"cv-num\">20</span><button class=\"cv-item\">🗃️ …</button></div>…</div></div>\nclass NkCalendarView extends NkElement {\n static get observedAttributes() {\n return ['name', 'label', 'badge', 'count', 'date-key', 'title-key', 'month', 'weeks', 'week-start', 'weekend', 'today', 'locale',\n 'today-label', 'prev-label', 'next-label', 'week-label'];\n }\n\n render() {\n this._box = this.createElement('div', ['nk-calendar-view']);\n const head = this.createElement('div', ['cv-head']);\n this._title = this.createElement('div', ['cv-title']);\n this._todayBtn = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev.innerHTML = CHEVRONS.prev;\n this._next = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._next.innerHTML = CHEVRONS.next;\n head.append(this._title, this._todayBtn, this._prev, this._next);\n this._grid = this.createElement('div', ['cv-grid']);\n this._box.append(head, this._grid);\n this._wrapper.appendChild(this._box);\n this._columns ??= []; this._rows ??= [];\n this._month ??= this._attrMonth() ?? this._todayIso().slice(0, 7);\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _attrMonth() { const m = this.getAttribute('month'); return /^\\d{4}-\\d{2}$/.test(m || '') ? m : null; }\n _todayIso() { return this.getAttribute('today') || isoOf(new Date()); }\n _dateColumn() {\n const key = this.getAttribute('date-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.type === 'date') || null;\n }\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n\n _render() {\n if (!this._grid) return;\n const locale = resolveLocale(this.getAttribute('locale')), weeks = this.getBoolAttr('weeks');\n const n = Number(this.getAttribute('week-start'));\n const ws = this.hasAttribute('week-start') && Number.isInteger(n) && n >= 0 && n <= 6 ? n : firstWeekday(locale);\n const g = monthGrid(this._month, ws), today = this._todayIso();\n const weekend = new Set((this.getAttribute('weekend') || '').split(',').map(s => s.trim()).filter(Boolean).map(Number));\n const dateCol = this._dateColumn(), titleCol = this._titleColumn(), byDay = {};\n if (dateCol) for (const row of this._rows) {\n const d = parseDay(row[dateCol.key]);\n if (d) (byDay[isoOf(d)] ||= []).push(row);\n }\n this._box.classList.toggle('weeks', weeks);\n this._title.textContent = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(g.first);\n this._todayBtn.textContent = this.getAttribute('today-label') || this.str('today');\n this._prev.setAttribute('aria-label', this.getAttribute('prev-label') || this.str('previousMonth'));\n this._next.setAttribute('aria-label', this.getAttribute('next-label') || this.str('nextMonth'));\n\n const cell = (cls, text) => { const el = this.createElement('div', [cls]); el.textContent = text; return el; };\n const nodes = [];\n if (weeks) nodes.push(cell('cv-wd', this.getAttribute('week-label') || weekLabel(locale)));\n for (const w of weekdayNames(locale, ws)) nodes.push(cell('cv-wd', w));\n for (let i = 0; i < g.rows * 7; i++) {\n const d = g.day(i), iso = isoOf(d);\n if (weeks && i % 7 === 0) nodes.push(cell('cv-week', isoWeek(d)));\n const day = this.createElement('div', ['cv-day', d.getMonth() !== g.m - 1 && 'out', weekend.has(d.getDay()) && 'off', iso === today && 'today'].filter(Boolean));\n const num = this.createElement('span', ['cv-num']);\n num.textContent = d.getDate();\n day.appendChild(num);\n for (const row of byDay[iso] || []) {\n const item = this.createElement('button', ['cv-item'], { type: 'button', 'data-id': row.id ?? '' });\n const title = titleCol ? textOf(row[titleCol.key]) : '';\n item.textContent = row.icon ? `${row.icon} ${title}` : title;\n day.appendChild(item);\n }\n nodes.push(day);\n }\n this._grid.replaceChildren(...nodes);\n }\n\n _goMonth(month) {\n if (month === this._month) return;\n this._month = month;\n this._render();\n this.emit('nk-month', { month });\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (e.target.closest('.cal-nav') === this._todayBtn) { this._goMonth(this._todayIso().slice(0, 7)); return; }\n if (e.target.closest('.cal-nav') === this._prev) { this._goMonth(stepMonth(this._month, -1)); return; }\n if (e.target.closest('.cal-nav') === this._next) { this._goMonth(stepMonth(this._month, 1)); return; }\n const item = e.target.closest('.cv-item');\n if (item) { const row = this._rowById(item.dataset.id); this.emit('nk-select', { row, id: row?.id, value: row?.id }); }\n };\n this._box.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._box?.removeEventListener('click', this._onClick); }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n\n onStringsChanged() { this._render(); }\n\n onAttributeChanged(name) {\n if (name === 'month') this._month = this._attrMonth() ?? this._month;\n this._render();\n if (name === 'label' || name === 'badge' || name === 'count') this.closest('nk-database')?.requestSync?.();\n }\n\n get name() { return this.getAttribute('name') || 'calendar'; }\n /** The month shown, YYYY-MM. */\n get month() { return this._month; }\n set month(v) { if (!/^\\d{4}-\\d{2}$/.test(v)) return; if (this._grid) this._goMonth(v); else this._month = v; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-calendar-view', NkCalendarView);\nexport { NkCalendarView };\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, textOf, formatDate, formatPercent } from '../../util/property-cell.js';\n\n// <nk-gallery-view name=\"gallery\" label=\"🖼 Gallery\" meta-keys=\"status,due\" new-row></nk-gallery-view>\n// The fifth database view (NotionKit 1.14.0): the rows as cards with a\n// picture on top, in a grid that fills the row – Notion's gallery, for a\n// course catalog or a reading list. `cover-key` names the row field with the\n// picture's URL (default: cover); a row without one shows the cover\n// gradient, and `no-cover` leaves the pictures out. `size` small | medium |\n// large sets the card size, `fit` shows a picture whole instead of cropped.\n// Cards show the title column and the `meta-keys` (default: select and date\n// columns). Standalone: view.columns = […]; view.rows = […]. Inside\n// <nk-database> the database pushes the data. A card fires nk-select\n// { row, id, value } on a click, Enter or Space, like a row of the table;\n// the add card nk-action { action: 'new-row' }.\n// `href-key` (1.17.0) names the row field with the card's address: a row\n// with one gets a link, <a class=\"nk-card\" href>, in a .card-item that\n// carries the list item's role – to open a course in a new tab or copy its\n// address. A plain click, or Enter, fires the same nk-select; cancelling it\n// keeps the browser from following the link. A middle click or one with\n// Cmd, Ctrl, Shift or Alt fires nothing and does what a link does.\n// → <div class=\"nk-gallery\" role=\"list\"><div class=\"nk-card\" role=\"listitem\" tabindex=\"0\">\n// <div class=\"nk-cover\"><img src=\"…\" alt=\"\"></div><div class=\"card-title\">🧭 …</div><div class=\"card-meta\">…</div></div>\n// <div class=\"card-item\" role=\"listitem\"><a class=\"nk-card\" href=\"/courses/safety\">…</a></div>\n// <div class=\"nk-new-row\">+ New page</div></div>\nconst SIZES = ['small', 'large'];\n\nclass NkGalleryView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'cover-key', 'no-cover', 'size', 'fit', 'title-key', 'meta-keys', 'href-key', 'new-row', 'new-row-label']; }\n\n render() {\n this._grid = this.createElement('div', ['nk-gallery'], { role: 'list' });\n this._wrapper.appendChild(this._grid);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n _metaColumns() {\n const keys = (this.getAttribute('meta-keys') || '').split(',').map(s => s.trim()).filter(Boolean);\n if (keys.length) return keys.map(k => this._columns.find(c => c.key === k)).filter(Boolean);\n return this._columns.filter(c => c.type === 'select' || c.type === 'date');\n }\n\n _render() {\n if (!this._grid) return;\n const size = this.getAttribute('size');\n this._grid.className = ['nk-gallery', SIZES.includes(size) && size, this.getBoolAttr('fit') && 'fit'].filter(Boolean).join(' ');\n const title = this._titleColumn(), meta = this._metaColumns();\n const coverKey = this.getAttribute('cover-key') || 'cover', covers = !this.getBoolAttr('no-cover');\n const hrefKey = this.getAttribute('href-key');\n this._grid.replaceChildren();\n for (const row of this._rows) {\n const link = hrefKey ? row[hrefKey] : null, href = link && typeof link === 'object' ? link.href : link;\n const card = href\n ? this.createElement('a', ['nk-card'], { href: String(href), 'data-id': row.id ?? '' })\n : this.createElement('div', ['nk-card'], { role: 'listitem', tabindex: '0', 'data-id': row.id ?? '' });\n if (covers) {\n const cover = this.createElement('div', ['nk-cover']);\n if (row[coverKey]) cover.appendChild(this.createElement('img', [], { src: row[coverKey], alt: '' }));\n card.appendChild(cover);\n }\n const t = this.createElement('div', ['card-title']);\n t.textContent = `${row.icon ? row.icon + ' ' : ''}${title ? textOf(row[title.key]) : ''}`;\n const m = this.createElement('div', ['card-meta']);\n for (const c of meta) {\n const v = row[c.key];\n if (v === undefined || v === null || v === '') continue;\n const s = document.createElement('span');\n if (c.type === 'progress') s.textContent = `▰ ${formatPercent(c, v)}`;\n else if (c.type === 'date') s.textContent = `📅 ${formatDate(c, v)}`;\n else s.appendChild(renderPropertyCell(c, v, row));\n m.appendChild(s);\n }\n card.append(t, m);\n if (href) {\n const item = this.createElement('div', ['card-item'], { role: 'listitem' });\n item.appendChild(card);\n this._grid.appendChild(item);\n } else this._grid.appendChild(card);\n }\n if (this.getBoolAttr('new-row')) {\n const add = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0', 'data-add': '' });\n add.textContent = this.getAttribute('new-row-label') || this.str('newPage');\n this._grid.appendChild(add);\n }\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (e.target.closest('[data-add]')) { this.emit('nk-action', { action: 'new-row' }); return; }\n const card = e.target.closest('.nk-card');\n if (!card) return;\n // The link contract: a plain left click is a selection, any other one the browser's.\n const link = card.localName === 'a';\n if (link && (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)) return;\n const row = this._rowById(card.dataset.id);\n if (!this.emit('nk-select', { row, id: row?.id, value: row?.id }) && link) e.preventDefault();\n };\n this._onKey = (e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n if (e.target.localName === 'a') return; // a link card: Enter is the browser's click, Space scrolls\n if (e.target.matches?.('.nk-card, [data-add]')) { e.preventDefault(); e.target.click(); }\n };\n this._grid.addEventListener('click', this._onClick);\n this._grid.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._grid?.removeEventListener('click', this._onClick);\n this._grid?.removeEventListener('keydown', this._onKey);\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n onStringsChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'gallery'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-gallery-view', NkGalleryView);\nexport { NkGalleryView };\n","import { NkElement } from '../../base.js';\n\n// <nk-filter-bar add no-filter no-sort></nk-filter-bar>\n// bar.filters = [{ key: 'status', value: 'done', op: 'is-not', label: 'Status: Open' }];\n// The filters in effect as NotionKit's filter pills (1.7.0), no inline style:\n// → <div class=\"nk-filter-row\">[Filter][Sort]\n// <span class=\"nk-filter-pill active\"><button>Status: Open</button><button class=\"fp-remove\">×</button></span>…\n// <button class=\"nk-filter-pill add\">+ Filter</button> …slot… [search]</div>\n// Filter and Sort are .nk-db-tool buttons (hide them with no-filter / no-sort\n// when the database toolbar carries its own); they fire nk-action. A pill's\n// label fires nk-action { action: 'edit', index, filter }, the add pill\n// nk-action { action: 'add' } – each with the clicked button as `anchor`, to\n// open a menu under it. × removes the filter; every change to filters or\n// search fires nk-change { filters, search }. In slot=\"filters\" of\n// <nk-database> the row sits right under the view tabs. The texts come in\n// English or German after the language (1.17.0, setStrings() for others);\n// filter-label, sort-label, add-label, remove-label (the × reads\n// \"<remove-label>: <pill>\") and placeholder set them here.\nclass NkFilterBar extends NkElement {\n static get observedAttributes() { return ['search', 'placeholder', 'no-filter', 'no-sort', 'value', 'add', 'add-label', 'filter-label', 'sort-label', 'remove-label']; }\n\n render() {\n this._row = this.createElement('div', ['nk-filter-row']);\n this._filterBtn = this.createElement('button', ['nk-db-tool'], { type: 'button', 'data-action': 'filter' });\n this._sortBtn = this.createElement('button', ['nk-db-tool'], { type: 'button', 'data-action': 'sort' });\n this._pillStart = document.createComment('pills');\n this._addBtn = this.createElement('button', ['nk-filter-pill', 'add'], { type: 'button', 'data-action': 'add' });\n this._input = this.createElement('input', ['nk-input'], { type: 'search', autocomplete: 'off' });\n this._row.append(this._filterBtn, this._sortBtn, this._pillStart, this._addBtn, document.createElement('slot'), this._input);\n this._wrapper.appendChild(this._row);\n this._filters = [];\n this._sync();\n }\n\n _sync() {\n this._filterBtn.textContent = this.getAttribute('filter-label') || this.str('filter');\n this._filterBtn.hidden = this.getBoolAttr('no-filter');\n this._filterBtn.classList.toggle('active', this._filters.length > 0);\n this._sortBtn.textContent = this.getAttribute('sort-label') || this.str('sort');\n this._sortBtn.hidden = this.getBoolAttr('no-sort');\n this._addBtn.textContent = this.getAttribute('add-label') || this.str('addFilter');\n this._addBtn.hidden = !this.getBoolAttr('add');\n this._input.hidden = !this.getBoolAttr('search');\n this._input.placeholder = this.getAttribute('placeholder') || this.str('search');\n if (this.hasAttribute('value') && this._input.value !== this.getAttribute('value')) this._input.value = this.getAttribute('value');\n for (const old of this._row.querySelectorAll('[data-pill]')) old.remove();\n const removeLabel = this.getAttribute('remove-label') || this.str('removeFilter');\n this._pillStart.after(...this._filters.map((f, i) => {\n const pill = this.createElement('span', ['nk-filter-pill', 'active'], { 'data-pill': i });\n const label = this.createElement('button', [], { type: 'button', 'data-edit': i });\n label.textContent = f.label ?? `${f.key}: ${f.value}`;\n const remove = this.createElement('button', ['fp-remove'], { type: 'button', 'data-remove': i, 'aria-label': `${removeLabel}: ${label.textContent}` });\n remove.textContent = '×';\n pill.append(label, remove);\n return pill;\n }));\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const remove = e.target.closest('[data-remove]');\n if (remove) { const i = Number(remove.dataset.remove); this._filters = this._filters.filter((_, j) => j !== i); this._sync(); this._emitChange(); return; }\n const edit = e.target.closest('[data-edit]');\n if (edit) { const index = Number(edit.dataset.edit); this.emit('nk-action', { action: 'edit', index, filter: this._filters[index], anchor: edit }); return; }\n const btn = e.target.closest('[data-action]');\n if (btn) this.emit('nk-action', { action: btn.dataset.action, anchor: btn });\n };\n this._onInput = () => { clearTimeout(this._debounce); this._debounce = setTimeout(() => this._emitChange(), 150); };\n this._row.addEventListener('click', this._onClick);\n this._input.addEventListener('input', this._onInput);\n }\n\n teardownEvents() {\n this._row?.removeEventListener('click', this._onClick);\n this._input?.removeEventListener('input', this._onInput);\n clearTimeout(this._debounce);\n }\n\n _emitChange() { this.emit('nk-change', { filters: [...this._filters], search: this._input.value }); }\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n\n // A copy each way: the caller's array is never changed – removing a pill\n // only reports the new list in nk-change.\n get filters() { return [...this._filters]; }\n set filters(v) { this._filters = Array.isArray(v) ? [...v] : []; if (this._row) this._sync(); }\n get value() { return this._input?.value ?? ''; }\n set value(v) { if (this._input) this._input.value = v ?? ''; }\n /**\n * Applies filters and search to rows: a filter keeps rows where row[key]\n * equals value – or differs from it with op: 'is-not'; the search looks\n * for the text in every string field (a person's name, a text or link\n * object's text).\n */\n apply(rows) {\n const q = this.value.trim().toLowerCase();\n return rows.filter(r => this._filters.every(f => (f.op === 'is-not' ? r[f.key] !== f.value : r[f.key] === f.value))\n && (!q || Object.values(r).some(v => String(typeof v === 'object' && v ? v.name ?? v.text ?? v.label ?? '' : v ?? '').toLowerCase().includes(q))));\n }\n}\n\ncustomElements.define('nk-filter-bar', NkFilterBar);\nexport { NkFilterBar };\n","import { NkElement } from '../../base.js';\n\n// <nk-comments placeholder=\"Comment …\" send-label=\"Send\">\n// <nk-comment …>…</nk-comment>\n// </nk-comments>\n// → <div class=\"nk-comments\">…<div class=\"nk-comment-input\"><input class=\"nk-input\"><button class=\"nk-btn primary small\">Send</button></div></div>\n// Enter or the button fires nk-submit { text } and clears the field.\nclass NkComments extends NkElement {\n static get observedAttributes() { return ['placeholder', 'send-label', 'no-input', 'disabled']; }\n\n render() {\n const box = this.createElement('div', ['nk-comments']);\n box.appendChild(document.createElement('slot'));\n this._row = this.createElement('div', ['nk-comment-input']);\n this._input = this.createElement('input', ['nk-input'], { type: 'text' });\n this._btn = this.createElement('button', ['nk-btn', 'primary', 'small'], { type: 'button' });\n this._row.append(this._input, this._btn);\n box.appendChild(this._row);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n this._input.placeholder = this.getAttribute('placeholder') || this.str('commentPlaceholder');\n this._input.setAttribute('aria-label', this.str('comment'));\n this._btn.textContent = this.getAttribute('send-label') || this.str('send');\n this._row.style.display = this.getBoolAttr('no-input') ? 'none' : '';\n this._input.disabled = this._btn.disabled = this.getBoolAttr('disabled');\n }\n\n setupEvents() {\n this._onSend = () => this.submit();\n this._onKey = (e) => { if (e.key === 'Enter') { e.preventDefault(); this.submit(); } };\n this._btn.addEventListener('click', this._onSend);\n this._input.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onSend);\n this._input?.removeEventListener('keydown', this._onKey);\n }\n\n submit() {\n const text = this._input.value.trim();\n if (!text) return;\n const ok = this.emit('nk-submit', { text });\n if (ok) this._input.value = '';\n }\n\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n focus(o) { this._input?.focus(o); }\n get value() { return this._input?.value ?? ''; }\n set value(v) { if (this._input) this._input.value = v ?? ''; }\n}\n\ncustomElements.define('nk-comments', NkComments);\nexport { NkComments };\n","import { NkElement } from '../../base.js';\nimport { paintAvatar, initialsOf } from '../../util/avatar.js';\n\n// <nk-comment author=\"Sara Lindt\" time=\"1 hr ago\" avatar=\"SL\" color=\"green\">The board view feels close.</nk-comment>\n// → <div class=\"nk-comment\"><span class=\"nk-avatar green\">SL</span><div><div class=\"c-head\"><b>Sara Lindt</b> · 1 hr ago</div><div class=\"c-body\">…</div></div></div>\n// color: one of Notion's nine names, or any CSS background; without it the avatar gradient.\n// slot=\"head\" adds content after the name (e.g. an <nk-tag>).\nclass NkComment extends NkElement {\n static get observedAttributes() { return ['author', 'time', 'avatar', 'color']; }\n\n render() {\n const box = this.createElement('div', ['nk-comment']);\n this._avatar = this.createElement('span', ['nk-avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n const text = document.createElement('div');\n this._head = this.createElement('div', ['c-head']);\n this._author = document.createElement('b');\n this._time = document.createTextNode('');\n this._head.append(this._author, this.createElement('slot', [], { name: 'head' }), this._time);\n const body = this.createElement('div', ['c-body']);\n body.appendChild(document.createElement('slot'));\n text.append(this._head, body);\n box.append(avatarSlot, text);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n const author = this.getAttribute('author') || '';\n this._author.textContent = author;\n const time = this.getAttribute('time');\n this._time.data = time ? ` · ${time}` : '';\n this._avatar.textContent = this.getAttribute('avatar') || initialsOf(author);\n paintAvatar(this._avatar, this.getAttribute('color'));\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-comment', NkComment);\nexport { NkComment };\n","import { NkElement } from '../../base.js';\n\n// <nk-ai-thread><nk-ai-msg …>…</nk-ai-msg>…</nk-ai-thread> → <div class=\"nk-ai-thread\">\nclass NkAiThread extends NkElement {\n render() {\n const box = this.createElement('div', ['nk-ai-thread'], { role: 'log', 'aria-live': 'polite' });\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n }\n}\n\ncustomElements.define('nk-ai-thread', NkAiThread);\nexport { NkAiThread };\n","import { NkElement } from '../../base.js';\n\n// <nk-ai-msg role=\"user\" name=\"You\" avatar=\"MK\">Summarise the open tasks.</nk-ai-msg>\n// <nk-ai-msg role=\"assistant\" name=\"Mona\" badge=\"· AI\" avatar=\"✨\">\n// Two tasks are open …\n// <button slot=\"actions\" value=\"copy\">📋 Copy</button><button slot=\"actions\" value=\"retry\">↻ Rephrase</button>\n// </nk-ai-msg>\n// <nk-ai-msg role=\"user\" bubble>What is still open?</nk-ai-msg> → a grey bubble on the right, as in Notion's AI chat\n// → <div class=\"nk-ai-msg user\"><span class=\"mini-avatar\">MK</span><div class=\"a-body\"><div class=\"a-name\">You</div>…<div class=\"nk-ai-actions\">…</div></div></div>\n// Action buttons stay in the light DOM (slotted twins) and fire nk-action { action: value }.\nclass NkAiMsg extends NkElement {\n static get observedAttributes() { return ['role', 'name', 'badge', 'avatar', 'color', 'bubble']; }\n\n render() {\n this._box = this.createElement('div', ['nk-ai-msg']);\n this._avatar = this.createElement('span', ['mini-avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n this._avatarSlot = avatarSlot;\n const body = this.createElement('div', ['a-body']);\n this._name = this.createElement('div', ['a-name']);\n this._nameText = document.createTextNode('');\n this._badge = document.createElement('span');\n this._name.append(this._nameText, this._badge);\n this._actions = this.createElement('div', ['nk-ai-actions']);\n this._actionSlot = this.createElement('slot', [], { name: 'actions' });\n this._actions.appendChild(this._actionSlot);\n body.append(this._name, document.createElement('slot'), this._actions);\n this._box.append(avatarSlot, body);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n const user = this.getAttribute('role') === 'user';\n const bubble = this.getBoolAttr('bubble');\n this._box.classList.toggle('user', user);\n this._box.classList.toggle('bubble', bubble);\n const name = this.getAttribute('name');\n // Runs on slotchange: write text on a change only (see nk-switch).\n if (this._nameText.data !== (name || '')) this._nameText.data = name || '';\n const badge = this.getAttribute('badge'), badgeText = badge ? ` ${badge}` : '';\n if (this._badge.textContent !== badgeText) this._badge.textContent = badgeText;\n // A bubble stands without avatar and name; the text says who asked.\n this._name.style.display = name && !bubble ? '' : 'none';\n this._avatarSlot.style.display = bubble ? 'none' : '';\n const avatar = this.getAttribute('avatar') || (user ? (name || 'U').slice(0, 2).toUpperCase() : '✨');\n if (this._avatar.textContent !== avatar) this._avatar.textContent = avatar;\n const color = this.getAttribute('color');\n this._avatar.style.background = color || '';\n this._actions.style.display = this._actionSlot.assignedElements().length ? '' : 'none';\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._onClick = (e) => {\n const btn = e.target.closest?.('button');\n if (btn && this._actionSlot.assignedElements().includes(btn)) this.emit('nk-action', { action: btn.value || btn.textContent.trim(), value: btn.value || btn.textContent.trim() });\n };\n this._actionSlot.addEventListener('slotchange', this._onSlot);\n this.addEventListener('click', this._onClick);\n this._sync();\n }\n\n teardownEvents() {\n this._actionSlot?.removeEventListener('slotchange', this._onSlot);\n this.removeEventListener('click', this._onClick);\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-ai-msg', NkAiMsg);\nexport { NkAiMsg };\n","import { NkElement } from '../../base.js';\n\n// <nk-ai-input-row placeholder=\"Ask Mona something …\"></nk-ai-input-row>\n// → <div class=\"nk-ai-input-row\"><span>✨</span><input><button class=\"nk-ai-send\">↑</button></div>\n// Enter or the send button fires nk-submit { text } and clears the field.\nclass NkAiInputRow extends NkElement {\n static get observedAttributes() { return ['placeholder', 'value', 'disabled', 'icon']; }\n\n render() {\n this._row = this.createElement('div', ['nk-ai-input-row']);\n this._icon = document.createElement('span');\n this._icon.style.fontSize = '14px';\n this._input = this.createElement('input', [], { type: 'text' });\n this._btn = this.createElement('button', ['nk-ai-send'], { type: 'button' });\n this._btn.textContent = '↑';\n this._row.append(this._icon, this._input, this._btn);\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n _sync() {\n this._input.placeholder = this.getAttribute('placeholder') || this.str('askPlaceholder');\n this._input.setAttribute('aria-label', this.str('message'));\n this._btn.setAttribute('aria-label', this.str('send'));\n if (this.hasAttribute('value') && this._input.value !== this.getAttribute('value')) this._input.value = this.getAttribute('value');\n this._input.disabled = this._btn.disabled = this.getBoolAttr('disabled');\n const icon = this.getAttribute('icon') ?? '✨';\n this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n }\n\n setupEvents() {\n this._onSend = () => this.submit();\n this._onKey = (e) => { if (e.key === 'Enter') { e.preventDefault(); this.submit(); } };\n this._btn.addEventListener('click', this._onSend);\n this._input.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onSend);\n this._input?.removeEventListener('keydown', this._onKey);\n }\n\n submit() {\n const text = this._input.value.trim();\n if (!text || this.getBoolAttr('disabled')) return;\n const ok = this.emit('nk-submit', { text });\n if (ok) this._input.value = '';\n }\n\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n focus(o) { this._input?.focus(o); }\n get value() { return this._input?.value ?? ''; }\n set value(v) { if (this._input) this._input.value = v ?? ''; }\n}\n\ncustomElements.define('nk-ai-input-row', NkAiInputRow);\nexport { NkAiInputRow };\n"],"names":["tokensCss","componentsHead","componentsTail","componentsCss","css","CSSStyleSheet","replaceSync","componentsSheet","BUILT_IN","en","copy","copied","show","hide","uploadImage","changeImage","remove","close","resize","today","previousMonth","nextMonth","clear","time","filter","sort","addFilter","removeFilter","search","closeSidebar","newPage","commentPlaceholder","send","askPlaceholder","commandPlaceholder","emojiPlaceholder","toggleTheme","synced","message","breadcrumb","commandPalette","comment","searchEmoji","settings","title","changeIcon","add","more","de","custom","listeners","Set","setStrings","strings","lang","key","String","toLowerCase","split","fn","builtInStrings","str","el","node","getRootNode","host","hit","closest","getAttribute","document","documentElement","langOf","TOKENS_INJECTED","globalThis","sheet","adoptedStyleSheets","injectDefaultTokens","instances","getCurrentTheme","syncAllStrings","instance","onStringsChanged","window","MutationObserver","records","some","r","attributeName","theme","_syncTheme","syncAllThemes","observe","attributes","attributeFilter","hostSheets","Map","hostSheetFor","display","get","set","NkElement","HTMLElement","hostStyles","observesLightDom","lightDomObserverInit","childList","subtree","characterData","slotAssignment","observedAttributes","constructor","super","this","_initialized","_shadow","attachShadow","mode","sheets","extra","push","connectedCallback","_wrapper","setAttribute","_upgradeOwnProperties","createElement","className","appendChild","render","setupEvents","_lightDomObserver","projectLightDom","assignSlots","_slotObserver","disconnectedCallback","delete","disconnect","teardownEvents","attributeChangedCallback","name","oldValue","newValue","onAttributeChanged","textFor","Object","keys","startsWith","desc","proto","getPrototypeOf","prototype","getOwnPropertyDescriptor","value","refresh","takeTitle","_titleText","removeAttribute","getBoolAttr","hasAttribute","setBoolAttr","tag","classes","attrs","length","classList","val","entries","emit","eventName","detail","dispatchEvent","CustomEvent","bubbles","composed","cancelable","NkFormElement","static","_internals","attachInternals","form","validationMessage","validity","willValidate","checkValidity","reportValidity","first","_formDisabled","onFormDisabled","formResetCallback","resetValue","formStateRestoreCallback","state","restoreValue","formDisabledCallback","disabled","setFormValue","setValidity","flags","anchor","syncValidityFrom","control","valid","VARIANTS","NkBtn","_build","href","type","_computeClasses","join","_applyState","_btn","removeEventListener","_onClick","replaceWith","addEventListener","tagName","v","_sidebar","open","querySelector","_sidebarCollapsed","e","preventDefault","stopPropagation","sidebar","matchMedia","matches","expand","toggle","requestSubmit","reset","_onToggle","target","_onCollapse","collapsed","variant","includes","focus","options","click","active","small","customElements","define","FORWARDED","BOOLEANS","NkInput","_input","attr","_forward","_defaultValue","_syncWide","_syncFormValue","_onInput","_onChange","Event","blur","select","placeholder","required","readonly","wide","NkTextarea","textContent","trim","NkSelect","_select","_forwardAll","_pending","requestAnimationFrame","label","nodes","children","n","signature","map","outerHTML","_optionSignature","previous","selectedIndex","innerHTML","cloneNode","_applyValue","o","compact","NkSwitch","_row","role","_text","_slot","_textNode","createTextNode","append","_defaultChecked","_apply","_syncText","text","data","hasText","assignedNodes","nodeType","Node","ELEMENT_NODE","hidden","style","_onSlot","checked","NkCheck","slot","indeterminate","_syncing","ARROW_KEYS","ArrowDown","ArrowRight","ArrowUp","ArrowLeft","ownerForm","undefined","syncGroupTabIndex","group","enabled","focusable","find","tabIndex","NkRadio","_uncheckPeers","_group","_applyChange","_onKeyDown","dir","ctrlKey","metaKey","altKey","next","indexOf","root","querySelectorAll","NkSlider","_out","_syncOut","Number","showValue","WIDE","NkField","_field","_label","labelSlot","_desc","descSlot","_widened","_sync","stacked","assignedElements","localName","has","NkFields","_grid","fit","COLORS","NkTag","_tag","color","NkProgress","_bar","_fill","max","Math","min","width","NkCallout","_box","_icon","iconSlot","body","_syncIcon","icon","NkDivider","NkHeading","level","h","_heading","NkToggle","_details","summary","NkTodo","NkKbd","kbd","NkCode","_lang","_pre","highlight","replace","s","_lastText","m","self","a","eq","NkQuote","_quote","_cite","cite","NkApp","app","_app","main","locks","previousOverflow","lockScroll","overflow","unlockScroll","inertOutside","made","parent","parentNode","ShadowRoot","sib","inert","test","c","deepActiveElement","activeElement","shadowRoot","firstFocusable","walk","getClientRects","inner","NkSidebar","_backdrop","_aside","head","_collapse","scroll","_footer","_footerSlot","_syncFooter","_syncOpen","_syncCollapse","dataset","tooltip","_toggleButton","sel","_onBackdrop","_onKey","defaultPrevented","toggleCollapsed","collapse","fromSidebar","contains","fromToggle","later","preventScroll","menuSheet","NkWorkspaceSwitcher","tabindex","_avatar","avatarSlot","_name","chev","_menu","charAt","toUpperCase","_onDocClick","composedPath","_onDocKey","_onMenuSelect","NkSectionLabel","_plus","_onPlus","action","addable","KEYS","NkTree","box","setActive","item","other","_syncTabIndex","visible","visibleItems","i","hasChildren","parentElement","p","requestSync","_syncQueued","queueMicrotask","items","setTabbable","list","_data","build","old","activeItem","NkTreeItem","_arrow","_iconSlot","_labelSlot","_labelText","_actions","glyph","b","_endSlot","_children","_childSlot","end","childNodes","TEXT_NODE","assign","_hasChildren","_hasEnd","wantActions","isConnected","insertBefore","_onRowClick","tree","location","tabbable","NkTopbar","bar","actions","NkBreadcrumb","_nav","originals","sep","_signature","explicitCurrent","forEach","original","clone","current","index","separator","NkThemeToggle","_syncTitle","stored","localStorage","getItem","storageKey","_syncGlyph","apply","_onMessage","t","nkTheme","setItem","NkTabBar","_spacer","_syncBar","_valueOf","preset","_value","before","always","fixed","floating","NkTabBarItem","drawer","NkPage","_page","_cover","_coverSlot","replaceChildren","filled","covered","iconed","_onIcon","_onCover","cover","full","NkPageCover","_img","alt","src","objectPosition","NkPageTitle","_h1","_committed","_onBlur","_commit","editable","NkPageActions","row","NkBlockHost","_handle","handle","dropTarget","NkBanner","_classes","NkEmpty","_parts","cls","_old","NkSkeleton","lines","height","widths","Boolean","line","w","NkSynced","_badge","badge","boxOf","getBoundingClientRect","child","frameOf","top","left","right","x","y","placeUnder","align","removeProperty","f","roomBelow","innerHeight","bottom","roomAbove","up","room","floor","setProperty","innerWidth","NkTabs","_strip","_tabSlot","_panelSlot","tabs","panels","tab","panel","_reveal","_revealed","behavior","clientWidth","delta","smooth","scrollBy","_resize","ResizeObserver","NkTab","_tab","NkSegmented","_syncBox","buttons","btn","on","_choose","d","wrap","NkStats","NkStat","trend","NkAvatarGroup","_more","AVATAR_COLORS","paintAvatar","background","initialsOf","match","slice","NkAvatar","_initials","size","TYPES","NkMention","NkTemplateBtn","run","_space","NkModelCard","_card","titleSlot","_defaultSelected","_unselectPeers","selected","NkProfileRow","NkDangerZone","_titleEl","NkMemberList","_mark","rows","NkMemberRow","_mail","marginLeft","mail","avatar","NkProps","_list","flush","NkProp","part","NkPanels","NkPanel","_end","_head","prepend","_onEnd","NkSheet","id","_wasOpen","_returnFocus","_undoInert","back","NkSteps","_items","_steps","_step","step","selectable","focused","_","done","skipped","li","mark","link","button","shiftKey","ok","steps","Array","isArray","parseInt","isFinite","horizontal","NkBookmark","_a","URL","url","favicon","address","parts","NkCopyField","_val","_show","_copy","secret","repeat","_copied","_onCopy","_onShow","clearTimeout","_timer","navigator","clipboard","writeText","setTimeout","getSelection","selectAllChildren","dataUrlBytes","b64","padding","endsWith","NkImagePicker","_src","_remove","_max","_type","_quality","q","accept","_pick","file","bitmap","createImageBitmap","imageOrientation","scale","canvas","round","ctx","getContext","fillStyle","fillRect","drawImage","dataUrl","toDataURL","error","_onChoose","files","_onRemove","choose","square","pad","padStart","isoOf","getFullYear","getMonth","getDate","addDays","Date","parseDay","isNaN","getTime","start","isoWeek","UTC","setUTCDate","getUTCDate","getUTCDay","ceil","getUTCFullYear","resolveLocale","language","firstWeekday","locale","l","Intl","Locale","info","getWeekInfo","weekInfo","firstDay","weekdayNames","weekStart","DateTimeFormat","weekday","from","format","monthGrid","month","offset","getDay","day","stepMonth","weekLabel","CHEVRONS","STEPS","floatSheet","NkCalendar","_readValue","_pendingValue","_pendingMonth","_attrMonth","_month","_initialValue","_start","_day","_time","shown","_todayIso","_focus","_draw","days","_days","_cal","_title","_todayBtn","_prev","_next","_foot","_timeInput","_clear","_pop","_hasTime","_locale","_weekStart","isInteger","_syncPop","ws","weeks","range","g","weekend","JSON","parse","long","year","cells","chosen","iso","wk","inRange","off","marks","tone","focusDay","clearable","_syncForm","valueMissing","_goMonth","_onGrid","date","_onToday","_onPrev","_onNext","wd","months","last","_onTime","_onClear","_onOutside","path","_anchor","_onEscape","toggleAttribute","OVERLAYS","OVERLAY_CLASSES","phone","NkPeek","_close","_syncLabels","_syncResize","_setWidth","_min","parseFloat","getComputedStyle","getPropertyValue","_syncInset","_insetApp","_modal","inside","_onClose","_shownAt","timeStamp","resized","_onResizeStart","setPointerCapture","pointerId","_onResizeMove","hasPointerCapture","clientX","_onResizeEnd","_onResizeKey","_onViewport","performance","now","NkDialog","returnValue","_actionsSlot","_syncMode","alert","_from","_wasInert","own","Element","_onSubmit","submitter","hostSheet","count","NkTooltip","_bubble","_key","_delay","shortcut","_target","_describe","side","gap","below","above","placeNear","_described","ids","_targetOf","getElementById","_showFor","_onOver","pointerType","_onFocus","_onHide","capture","passive","NkModal","_rows","_content","requestNav","panes","_navQueued","_buildNav","labelled","lastGroup","pane","_syncActive","_current","_onNavClick","_onNavKey","NkSettingsPane","_section","_h2","NkSettingsUser","fuzzyScore","query","ti","score","streak","qi","idx","NkCmdk","glass","fontSize","autocomplete","esc","footerSlot","_commands","_index","_syncAttrs","_renderList","results","out","scored","keywords","empty","sc","_move","scrollIntoView","block","pick","_matchesHotkey","spec","pop","mod","shift","_onInputKey","_onListClick","_onListMove","_onListDown","commands","NkMenu","focusFirst","_onSelect","NkMenuItem","isSwitch","_check","_shortcut","_switch","_el","popSheet","OWN_SURFACE","NkPop","_triggerSlot","_float","_surface","_syncSurface","bare","_onTrigger","placement","C","cat","char","EMOJI_CATEGORIES","EMOJI","NkEmojiPicker","_search","_cats","_emojis","_cat","_renderCats","_renderGrid","cats","_categories","_catList","seen","values","emoji","_onCats","categories","emojis","NkToast","_msg","_lift","bars","rect","duration","ms","NkDatabase","_toolbar","_tabs","tools","_toolsSlot","_columns","views","setData","view","columns","tagFor","column","opt","opts","optionFor","textOf","timeOf","NaN","formatDate","minutes","rel","RelativeTimeFormat","numeric","abs","toLocaleDateString","renderPropertyCell","all","danger","checkbox","progress","flexWrap","cell","initials","toLocaleString","frag","createDocumentFragment","input","rowId","fill","formatPercent","NumberFormat","maximumFractionDigits","rankOf","findIndex","sortValue","sortKey","compareBy","localeCompare","NkTableView","_wrap","_table","_thead","_tbody","_newRow","_render","_sortedRows","col","tr","th","scope","td","act","_rowById","cellIndex","NkBoardView","_board","_groupColumn","_titleColumn","_metaColumns","k","header","cards","card","draggable","meta","_onDragStart","_dragId","dataTransfer","effectAllowed","_onDragOver","dropEffect","_onDrop","move","NkListView","NkCalendarView","_dateColumn","dateCol","titleCol","byDay","num","SIZES","NkGalleryView","coverKey","covers","hrefKey","NkFilterBar","_filterBtn","_sortBtn","_pillStart","createComment","_addBtn","_filters","removeLabel","after","pill","j","_emitChange","edit","_debounce","filters","every","op","NkComments","_onSend","submit","NkComment","_author","author","NkAiThread","NkAiMsg","_avatarSlot","_nameText","_actionSlot","user","bubble","badgeText","NkAiInputRow"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"notionkit-elements.esm.min.js","sources":["../node_modules/@jungherz-de/notionkit/notionkit-styles.js","../src/util/strings.js","../src/base.js","../src/components/forms/nk-btn.js","../src/components/forms/nk-input.js","../src/components/forms/nk-textarea.js","../src/components/forms/nk-select.js","../src/components/forms/nk-switch.js","../src/components/forms/nk-check.js","../src/components/forms/nk-radio.js","../src/components/forms/nk-slider.js","../src/components/forms/nk-field.js","../src/components/forms/nk-fields.js","../src/components/content/nk-tag.js","../src/components/content/nk-progress.js","../src/components/content/nk-callout.js","../src/components/content/nk-divider.js","../src/components/content/nk-heading.js","../src/components/content/nk-toggle.js","../src/components/content/nk-todo.js","../src/components/content/nk-kbd.js","../src/components/content/nk-code.js","../src/util/highlight.js","../src/components/content/nk-quote.js","../src/components/shell/nk-app.js","../src/util/focus.js","../src/components/shell/nk-sidebar.js","../src/components/shell/nk-workspace-switcher.js","../src/components/shell/nk-section-label.js","../src/components/shell/nk-tree.js","../src/components/shell/nk-tree-item.js","../src/components/shell/nk-topbar.js","../src/components/shell/nk-breadcrumb.js","../src/components/shell/nk-theme-toggle.js","../src/components/shell/nk-tab-bar.js","../src/components/shell/nk-tab-bar-item.js","../src/components/page/nk-page.js","../src/components/page/nk-page-cover.js","../src/components/page/nk-page-title.js","../src/components/page/nk-page-actions.js","../src/components/page/nk-block-host.js","../src/components/page/nk-banner.js","../src/components/page/nk-empty.js","../src/components/page/nk-skeleton.js","../src/components/page/nk-synced.js","../src/util/floating.js","../src/components/page/nk-tabs.js","../src/components/page/nk-tab.js","../src/components/page/nk-segmented.js","../src/components/page/nk-stats.js","../src/components/page/nk-stat.js","../src/components/page/nk-avatar-group.js","../src/util/avatar.js","../src/components/page/nk-avatar.js","../src/components/page/nk-mention.js","../src/components/page/nk-template-btn.js","../src/components/page/nk-model-card.js","../src/components/page/nk-profile-row.js","../src/components/page/nk-danger-zone.js","../src/components/page/nk-member-list.js","../src/components/page/nk-member-row.js","../src/components/page/nk-props.js","../src/components/page/nk-prop.js","../src/components/page/nk-panels.js","../src/components/page/nk-panel.js","../src/components/overlays/nk-sheet.js","../src/components/page/nk-steps.js","../src/components/content/nk-bookmark.js","../src/components/forms/nk-copy-field.js","../src/components/forms/nk-image-picker.js","../src/util/dates.js","../src/components/forms/nk-calendar.js","../src/components/overlays/nk-peek.js","../src/components/overlays/nk-dialog.js","../src/components/overlays/nk-tooltip.js","../src/components/overlays/nk-modal.js","../src/components/overlays/nk-settings-pane.js","../src/components/overlays/nk-settings-user.js","../src/util/fuzzy.js","../src/components/overlays/nk-cmdk.js","../src/components/overlays/nk-menu.js","../src/components/overlays/nk-menu-item.js","../src/components/overlays/nk-pop.js","../src/util/emoji.js","../src/components/overlays/nk-emoji-picker.js","../src/components/overlays/nk-toast.js","../src/components/data/nk-database.js","../src/util/property-cell.js","../src/components/data/nk-table-view.js","../src/components/data/nk-board-view.js","../src/components/data/nk-list-view.js","../src/components/data/nk-calendar-view.js","../src/components/data/nk-gallery-view.js","../src/components/data/nk-filter-bar.js","../src/components/data/nk-comments.js","../src/components/data/nk-comment.js","../src/components/data/nk-ai-thread.js","../src/components/data/nk-ai-msg.js","../src/components/data/nk-ai-input-row.js"],"sourcesContent":["// NotionKit v1.18.0 – Constructable Stylesheet\n// Auto-generated by build-styles-js.mjs – do not edit manually.\n\n// The :root and [data-theme=\"dark\"] blocks that declare --nk-* …\nconst tokensCss = \":root{color-scheme:light;--nk-bg: #ffffff;--nk-bg-sidebar: #f9f8f7;--nk-bg-hover: rgba(55,53,47,.06);--nk-bg-active: rgba(55,53,47,.08);--nk-bg-callout: #f0efed;--nk-bg-code: #f7f6f3;--nk-bg-card: #ffffff;--nk-bg-input: rgba(242,241,238,.6);--nk-text: #2c2c2b;--nk-text-secondary: #7d7a75;--nk-text-tertiary: #91918e;--nk-text-sidebar: #5f5e5b;--nk-border: rgba(28,19,1,.11);--nk-border-strong: rgba(27,21,0,.19);--nk-accent: #2383e2;--nk-on-accent: #ffffff;--nk-danger: #cd3c3a;--nk-tag-gray-bg: #e3e2e0;--nk-tag-gray-text: #32302c;--nk-tag-brown-bg: #eee0da;--nk-tag-brown-text: #442a1e;--nk-tag-orange-bg: #fadec9;--nk-tag-orange-text: #49290e;--nk-tag-yellow-bg: #fdecc8;--nk-tag-yellow-text: #402c1b;--nk-tag-green-bg: #dbeddb;--nk-tag-green-text: #1c3829;--nk-tag-blue-bg: #d3e5ef;--nk-tag-blue-text: #183347;--nk-tag-purple-bg: #e8deee;--nk-tag-purple-text: #412454;--nk-tag-pink-bg: #f5e0e9;--nk-tag-pink-text: #4c2337;--nk-tag-red-bg: #ffe2dd;--nk-tag-red-text: #5d1715;--nk-tint-gray: #f1f1ef;--nk-color-gray: #787774;--nk-tint-brown: #f4eeee;--nk-color-brown: #9f6b53;--nk-tint-orange: #fbecdd;--nk-color-orange: #d9730d;--nk-tint-yellow: #fbf3db;--nk-color-yellow: #cb912f;--nk-tint-green: #edf3ec;--nk-color-green: #448361;--nk-tint-blue: #e7f3f8;--nk-color-blue: #337ea9;--nk-tint-purple: #f8f3fc;--nk-color-purple: #9065b0;--nk-tint-pink: #fcf1f6;--nk-color-pink: #c14c8a;--nk-tint-red: #fdebec;--nk-color-red: #cd3c3a;--nk-decor-purple: #9065b0;--nk-decor-blue: #529cca;--nk-decor-orange: #d9730d;--nk-scrim: rgba(15,15,15,.6);--nk-scrim-soft: rgba(15,15,15,.5);--nk-sidebar-width: 260px;--nk-peek-width: 560px;--nk-page-full-max: none;--nk-cover-height: 200px;--nk-panel-cover-height: 64px;--nk-tab-bar-height: 58px;--nk-radius: 6px;--nk-font: ui-sans-serif, -apple-system, \\\"Segoe UI\\\", Inter, Helvetica, Arial, sans-serif;--nk-font-mono: ui-monospace, \\\"SF Mono\\\", Menlo, Consolas, monospace;--nk-shadow-menu: rgba(15,15,15,.05) 0px 0px 0px 1px, rgba(15,15,15,.1) 0px 3px 6px, rgba(15,15,15,.2) 0px 9px 24px;--nk-shadow-card: 0 1px 2px rgba(0,0,0,.04);--nk-shadow-btn: inset 0 0 0 1px rgba(15,15,15,.1), 0 1px 2px rgba(15,15,15,.1);--nk-shadow-knob: 0 1px 2px rgba(0,0,0,.2);--nk-shadow-segment: 0 1px 2px rgba(0,0,0,.08)}[data-theme=dark]{color-scheme:dark;--nk-bg: #191919;--nk-bg-sidebar: #202020;--nk-bg-hover: rgba(255,255,255,.055);--nk-bg-active: rgba(255,255,255,.08);--nk-bg-callout: #252525;--nk-bg-code: #202020;--nk-bg-card: #202020;--nk-bg-input: rgba(255,255,255,.055);--nk-text: rgba(255,255,255,.81);--nk-text-secondary: rgba(255,255,255,.46);--nk-text-tertiary: rgba(255,255,255,.32);--nk-text-sidebar: rgba(255,255,255,.62);--nk-border: rgba(255,255,255,.094);--nk-border-strong: rgba(255,255,255,.16);--nk-accent: #529CCA;--nk-danger: #df5452;--nk-tag-gray-bg: #373737;--nk-tag-gray-text: rgba(255,255,255,.85);--nk-tag-brown-bg: #603b2c;--nk-tag-brown-text: rgba(255,255,255,.85);--nk-tag-orange-bg: #854c1d;--nk-tag-orange-text: rgba(255,255,255,.85);--nk-tag-yellow-bg: #89632a;--nk-tag-yellow-text: rgba(255,255,255,.85);--nk-tag-green-bg: #2b593f;--nk-tag-green-text: rgba(255,255,255,.85);--nk-tag-blue-bg: #28456c;--nk-tag-blue-text: rgba(255,255,255,.85);--nk-tag-purple-bg: #492f64;--nk-tag-purple-text: rgba(255,255,255,.85);--nk-tag-pink-bg: #69314c;--nk-tag-pink-text: rgba(255,255,255,.85);--nk-tag-red-bg: #6e3630;--nk-tag-red-text: rgba(255,255,255,.85);--nk-tint-gray: #252525;--nk-color-gray: #9b9b9b;--nk-tint-brown: #2e2724;--nk-color-brown: #ba856f;--nk-tint-orange: #36291f;--nk-color-orange: #c77d48;--nk-tint-yellow: #372e20;--nk-color-yellow: #ca8f3d;--nk-tint-green: #242b26;--nk-color-green: #529e72;--nk-tint-blue: #1f282d;--nk-color-blue: #5e87c9;--nk-tint-purple: #2a2430;--nk-color-purple: #9d68d3;--nk-tint-pink: #2e2328;--nk-color-pink: #d15796;--nk-tint-red: #332523;--nk-color-red: #df5452;--nk-shadow-menu: rgba(15,15,15,.2) 0px 0px 0px 1px, rgba(15,15,15,.4) 0px 3px 6px, rgba(15,15,15,.6) 0px 9px 24px;--nk-shadow-card: none;--nk-shadow-btn: inset 0 0 0 1px rgba(255,255,255,.1), 0 1px 2px rgba(0,0,0,.3)}\";\n\n// … and everything else, in two pieces around where they were.\nconst componentsHead = \"[class*=nk-],[class*=nk-] *,[class*=nk-]:before,[class*=nk-]:after,[class*=nk-] *:before,[class*=nk-] *:after{box-sizing:border-box}[class*=nk-] :where(h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd,pre,ul,ol,li){margin:0;padding:0}[class*=nk-] :where(ul,ol){list-style:none}[class*=nk-] :where(button,input,select,textarea,option,optgroup,fieldset,legend),:where(button,input,select,textarea)[class*=nk-]{margin:0;padding:0}[class*=nk-][hidden]:not([hidden=until-found i]){display:none!important}::slotted([hidden]:not([hidden=\\\"until-found\\\" i])){display:none!important}\";\nconst componentsTail = \".nk-body{margin:0;min-height:100vh;min-height:100dvh;font-family:var(--nk-font);font-size:14px;background:var(--nk-bg);color:var(--nk-text);-webkit-font-smoothing:auto;transition:background .25s ease,color .25s ease}.nk-app{display:flex;height:100vh;height:100dvh;overflow:hidden}.nk-sidebar{width:calc(var(--nk-sidebar-width) + env(safe-area-inset-left,0px));min-width:calc(var(--nk-sidebar-width) + env(safe-area-inset-left,0px));padding-left:env(safe-area-inset-left,0px);background:var(--nk-bg-sidebar);display:flex;flex-direction:column;border-right:1px solid var(--nk-border);transition:background .25s ease,margin-left .24s cubic-bezier(.2,.8,.25,1)}.nk-workspace{display:flex;align-items:center;gap:8px;padding:10px 12px;margin:6px 8px 2px;border-radius:var(--nk-radius);cursor:pointer;font-weight:500;user-select:none}.nk-workspace:hover{background:var(--nk-bg-hover)}.nk-workspace .avatar,.nk-workspace ::slotted(.avatar),.nk-workspace ::slotted([slot=\\\"avatar\\\"]){width:22px;height:22px;border-radius:4px;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-size:11px;font-weight:600;display:flex;align-items:center;justify-content:center}.nk-workspace .chev{margin-left:auto;color:var(--nk-text-tertiary);font-size:11px}.nk-sidebar-scroll{flex:1;overflow-y:auto;padding:4px 8px 16px}.nk-sidebar-scroll::-webkit-scrollbar{width:8px}.nk-sidebar-scroll::-webkit-scrollbar-thumb{background:var(--nk-border-strong);border-radius:4px}.nk-section-label{font-size:12px;font-weight:500;letter-spacing:.01em;color:var(--nk-text-tertiary);padding:14px 10px 4px;display:flex;justify-content:space-between;align-items:center}.nk-section-label .plus{cursor:pointer;border-radius:4px;padding:0 4px;font-size:13px;opacity:0;transition:opacity .15s}.nk-section-label:hover .plus{opacity:1}.nk-section-label .plus:hover{background:var(--nk-bg-hover)}.nk-sidebar-footer{padding:8px;border-top:1px solid var(--nk-border);color:var(--nk-text-sidebar);font-size:14px}.nk-sidebar-footer .nk-tree-item{min-height:26px}.nk-sidebar-backdrop{display:none;position:fixed;inset:0;z-index:59;background:var(--nk-scrim-soft)}.nk-sidebar-toggle{display:none}.nk-sidebar.collapsed{margin-left:calc(0px - var(--nk-sidebar-width) - env(safe-area-inset-left,0px));visibility:hidden;transition:background .25s ease,margin-left .24s cubic-bezier(.2,.8,.25,1),visibility 0s linear .24s}.nk-sidebar-toggle.collapsed{display:inline-flex}.nk-sidebar-head{display:flex;align-items:center}.nk-sidebar-head>.nk-workspace,.nk-sidebar-head ::slotted(.nk-workspace){flex:1;min-width:0}.nk-sidebar-collapse{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;margin:4px 12px 0 -4px;padding:0;border:none;border-radius:var(--nk-radius);background:transparent;color:var(--nk-text-tertiary);cursor:pointer;opacity:0;transition:opacity .15s}.nk-sidebar:hover .nk-sidebar-collapse,.nk-sidebar-collapse:focus-visible{opacity:1}.nk-sidebar-collapse:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-sidebar-collapse svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-main{flex:1;display:flex;flex-direction:column;min-width:0}.nk-topbar{height:44px;display:flex;align-items:center;padding:0 max(12px,env(safe-area-inset-right,0px)) 0 max(12px,env(safe-area-inset-left,0px));gap:8px;flex-shrink:0}.nk-breadcrumb{display:flex;align-items:center;gap:4px;font-size:14px}.nk-breadcrumb .crumb,.nk-breadcrumb ::slotted(.crumb){padding:2px 6px;border-radius:4px;cursor:pointer;color:var(--nk-text-sidebar);display:flex;align-items:center;gap:5px}.nk-breadcrumb .crumb:hover{background:var(--nk-bg-hover)}a.crumb{text-decoration:none}.nk-breadcrumb .crumb.current,.nk-breadcrumb ::slotted(.crumb.current){color:var(--nk-text)}.nk-breadcrumb .sep{color:var(--nk-text-tertiary);font-size:12px}.nk-topbar-actions{margin-left:auto;display:flex;align-items:center;gap:4px}.nk-topbar-btn{padding:4px 8px;border-radius:var(--nk-radius);cursor:pointer;color:var(--nk-text-sidebar);font-size:14px;user-select:none;border:none;background:transparent;font-family:inherit}.nk-topbar-btn:hover{background:var(--nk-bg-hover)}.nk-topbar-btn svg,.nk-topbar-btn ::slotted(svg){width:16px;height:16px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-share-btn{font-size:14px;padding:4px 8px}.nk-topbar-meta,.nk-topbar-actions ::slotted(.nk-topbar-meta){padding:4px 8px;font-size:12px;color:var(--nk-text-tertiary);white-space:nowrap}.nk-theme-toggle{font-size:15px;width:30px;height:28px;padding:0}.nk-tab-bar{display:none;flex:none;align-items:stretch;gap:2px;position:sticky;bottom:0;z-index:30;box-sizing:border-box;height:calc(var(--nk-tab-bar-height) - 6px + max(6px,env(safe-area-inset-bottom,0px)));padding:6px max(4px,env(safe-area-inset-right,0px)) max(6px,env(safe-area-inset-bottom,0px)) max(4px,env(safe-area-inset-left,0px));background:var(--nk-bg-sidebar);border-top:1px solid var(--nk-border)}.nk-tab-bar.always{display:flex}.nk-tab-bar.fixed{position:fixed;left:0;right:0;bottom:0}.nk-tab-bar-spacer{display:none;flex:none;height:calc(var(--nk-tab-bar-height) - 6px + max(6px,env(safe-area-inset-bottom,0px)))}.nk-tab-bar.always.fixed+.nk-tab-bar-spacer{display:block}.nk-tab-bar.floating{position:fixed;left:max(12px,env(safe-area-inset-left,0px));right:max(12px,env(safe-area-inset-right,0px));bottom:calc(12px + env(safe-area-inset-bottom,0px));height:var(--nk-tab-bar-height);padding:6px;border:1px solid var(--nk-border);border-radius:16px;box-shadow:var(--nk-shadow-menu)}.nk-tab-bar-item{flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:4px 2px;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:10.5px;line-height:1.2;color:var(--nk-text-secondary);text-decoration:none;cursor:pointer;user-select:none;-webkit-tap-highlight-color:transparent}.nk-tab-bar-item:hover{color:var(--nk-text);background:var(--nk-bg-hover)}.nk-tab-bar-item.active{color:var(--nk-accent)}.nk-tab-bar-item:disabled{opacity:.5;cursor:not-allowed}.nk-tab-bar-item .icon,.nk-tab-bar-item ::slotted([slot=\\\"icon\\\"]){font-size:20px;line-height:1}.nk-tab-bar-item .label,.nk-tab-bar-item ::slotted(.label){max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nk-tree-item{display:flex;align-items:center;gap:6px;padding:3px 8px 3px 10px;border-radius:var(--nk-radius);cursor:pointer;user-select:none;color:var(--nk-text-sidebar);position:relative;min-height:var(--_nk-row, 28px)}.nk-tree-item:hover{background:var(--nk-bg-hover)}.nk-tree-item.active{background:var(--nk-bg-active);color:var(--nk-text);font-weight:500}.nk-tree-item.compact{min-height:26px}.nk-tree-item .icon,.nk-tree-item ::slotted(.icon),.nk-tree-item ::slotted([slot=\\\"icon\\\"]){font-size:15px;width:20px;text-align:center;flex-shrink:0}.nk-tree-item .label,.nk-tree-item ::slotted(.label){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-tree-item .actions{margin-left:auto;display:none;gap:2px;color:var(--nk-text-tertiary)}.nk-tree-item:hover .actions{display:flex}.nk-tree-item .actions span{padding:0 3px;border-radius:3px;font-size:12px}.nk-tree-item .actions span:hover{background:var(--nk-bg-active)}.nk-tree-children{margin-left:14px;border-left:1px solid var(--nk-border);padding-left:4px;overflow:hidden}.nk-tree-children.collapsed{display:none}.nk-toggle-arrow{width:16px;height:16px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;font-size:9px;color:var(--nk-text-tertiary);border-radius:3px;transition:transform .15s}.nk-toggle-arrow.open{transform:rotate(90deg)}.nk-kbd-hint{margin-left:auto;display:flex;gap:3px;align-items:center}.nk-kbd{font-family:inherit;font-size:10.5px;background:var(--nk-bg-callout);border:1px solid var(--nk-border-strong);border-bottom-width:2px;border-radius:4px;padding:0 4px}.nk-page-scroll{flex:1;overflow-y:auto}.nk-page-scroll::-webkit-scrollbar{width:10px}.nk-page-scroll::-webkit-scrollbar-thumb{background:var(--nk-border-strong);border-radius:5px;border:2px solid var(--nk-bg)}.nk-cover{height:var(--nk-cover-height);background:radial-gradient(ellipse at 20% 40%,color-mix(in srgb,var(--nk-decor-purple) 35%,transparent),transparent 55%),radial-gradient(ellipse at 80% 20%,color-mix(in srgb,var(--nk-decor-blue) 35%,transparent),transparent 55%),radial-gradient(ellipse at 60% 90%,color-mix(in srgb,var(--nk-decor-orange) 25%,transparent),transparent 55%),var(--nk-bg-callout)}.nk-cover>img,.nk-cover ::slotted(img){display:block;width:100%;height:100%;object-fit:cover}.nk-page{max-width:760px;margin:0 auto;padding:24px max(64px,env(safe-area-inset-right,0px)) 120px max(64px,env(safe-area-inset-left,0px));font-size:16px;line-height:1.5}.nk-page.full{max-width:var(--nk-page-full-max)}.nk-page.small{font-size:14px}.nk-cover+.nk-page:has(>.nk-page-icon:not([hidden])),.nk-page.covered{padding-top:0}.nk-page-icon,.nk-page ::slotted(.nk-page-icon),.nk-page ::slotted([slot=\\\"icon\\\"]){font-size:64px;line-height:1;margin-top:0;cursor:pointer;user-select:none;display:inline-block}.nk-cover+.nk-page .nk-page-icon,.nk-cover+.nk-page ::slotted(.nk-page-icon),.nk-cover+.nk-page ::slotted([slot=\\\"icon\\\"]),.nk-page.covered .nk-page-icon,.nk-page.covered ::slotted(.nk-page-icon),.nk-page.covered ::slotted([slot=\\\"icon\\\"]){margin-top:-42px}.nk-page-title{font-size:var(--_nk-title, 40px);font-weight:700;line-height:1.2;margin:8px 0 4px;outline:none;letter-spacing:0}.nk-page-meta{color:var(--nk-text-tertiary);font-size:13px;margin-bottom:24px;display:flex;gap:16px}.nk-props{display:flex;flex-direction:column;margin:0 0 var(--nk-block-space, 20px);font-size:14px;line-height:1.5}.nk-props.flush{margin:0}.nk-prop{display:flex;flex-wrap:wrap;align-items:flex-start;min-width:0}.nk-prop .p-name{flex:0 0 160px;min-width:0;min-height:34px;padding:0 6px;display:flex;align-items:center;gap:6px;overflow:hidden;border-radius:var(--nk-radius);color:var(--nk-text-secondary);white-space:nowrap;user-select:none}.nk-prop .p-icon,.nk-prop ::slotted([slot=\\\"icon\\\"]){width:16px;flex-shrink:0;text-align:center;font-size:13px}.nk-prop .p-value{flex:1 1 220px;min-width:0;min-height:34px;padding:5px 8px;display:flex;align-items:center;flex-wrap:wrap;gap:4px 6px;border-radius:var(--nk-radius);overflow-wrap:anywhere}.nk-prop .p-value.text{display:block;align-content:center}.nk-prop .p-name:hover,.nk-prop .p-value:hover{background:var(--nk-bg-hover)}.nk-page p.lead{font-size:1em;line-height:1.6;color:var(--nk-text-secondary);margin-bottom:20px}.nk-page ::slotted(p.lead){font-size:1em;line-height:1.6;color:var(--nk-text-secondary);margin-bottom:20px!important}.nk-heading{font-size:1.5em;font-weight:600;line-height:1.3;margin:32px 0 10px;display:flex;align-items:center;gap:8px}:is(.nk-props,.nk-callout,.nk-bookmark,.nk-toggle,.nk-divider,.nk-quote,.nk-code,.nk-database,.nk-danger-zone,.nk-gallery-grid,.nk-template-btn,.nk-synced,.nk-banner,.nk-panels,.nk-skeleton,.nk-steps,.nk-comments,.nk-block-host,.nk-model-card,.nk-ai-input-row).flush{margin-top:0;margin-bottom:0}.nk-callout{display:flex;gap:10px;align-items:flex-start;background:var(--nk-bg-callout);border-radius:var(--nk-radius);padding:16px 16px 16px 12px;margin:var(--nk-block-space, 16px) 0;line-height:1.5}.nk-callout .c-icon,.nk-callout ::slotted(.c-icon),.nk-callout ::slotted([slot=\\\"icon\\\"]){font-size:17px}.nk-bookmark{display:flex;min-width:0;margin:var(--nk-block-space, 8px) 0;overflow:hidden;border:1px solid var(--nk-border);border-radius:var(--nk-radius);color:var(--nk-text);text-decoration:none;transition:background .12s ease}.nk-bookmark:hover{background:var(--nk-bg-hover)}.nk-bookmark .bm-text{flex:1 1 0;min-width:0;padding:12px 14px 14px;font-size:14px;line-height:20px}.nk-bookmark .bm-title{display:block;min-height:24px;margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nk-bookmark .bm-desc{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;max-height:32px;font-size:12px;line-height:16px;color:var(--nk-text-secondary)}.nk-bookmark .bm-url{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:12px;line-height:16px;white-space:nowrap}.nk-bookmark .bm-url>span{min-width:0;overflow:hidden;text-overflow:ellipsis}.nk-bookmark .bm-favicon{flex:none;width:16px;height:16px}.nk-bookmark .bm-cover{position:relative;flex:0 0 33%;max-width:240px}.nk-bookmark .bm-cover>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}.nk-todo{display:flex;align-items:flex-start;gap:8px;padding:4px 0}.nk-todo input[type=checkbox]{appearance:none;width:16px;height:16px;margin-top:3px;border:1.4px solid var(--nk-border-strong);border-radius:2px;cursor:pointer;flex-shrink:0;position:relative;background:var(--nk-bg)}.nk-todo input[type=checkbox]:checked{background:var(--nk-accent);border-color:var(--nk-accent)}.nk-todo input[type=checkbox]:checked:after{content:\\\"\\\\2713\\\";color:var(--nk-on-accent);font-size:11px;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.nk-todo input:checked+span{text-decoration:line-through;color:var(--nk-text-tertiary)}.nk-todo input:disabled{opacity:.5;cursor:not-allowed}.nk-toggle{margin:var(--nk-block-space, 6px) 0}.nk-toggle summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px;padding:4px 6px;border-radius:var(--nk-radius);font-weight:500;user-select:none}.nk-toggle summary::-webkit-details-marker{display:none}.nk-toggle summary:hover{background:var(--nk-bg-hover)}.nk-toggle summary:before{content:\\\"\\\\25b8\\\";color:var(--nk-text-tertiary);font-size:11px;transition:transform .15s;display:inline-block}.nk-toggle[open] summary:before{transform:rotate(90deg)}.nk-toggle .toggle-body,.nk-toggle ::slotted(.toggle-body){padding:4px 0 8px 26px;color:var(--nk-text-secondary);line-height:1.55}.nk-divider{border:none;border-top:1px solid var(--nk-border);margin:var(--nk-block-space, 24px) 0}.nk-quote{border-left:3px solid var(--nk-text);padding:2px 0 2px 14px;margin:var(--nk-block-space, 16px) 0;color:var(--nk-text-secondary);line-height:1.5}.nk-quote .q-cite{display:block;margin-top:6px;font-size:12.5px;color:var(--nk-text-tertiary)}.nk-mention{display:inline-flex;align-items:center;gap:4px;padding:0 4px;border-radius:4px;font-weight:500;cursor:pointer;white-space:nowrap}.nk-mention:hover{background:var(--nk-bg-hover)}.nk-mention.person{color:var(--nk-text)}.nk-mention.person .mini-avatar,.nk-mention.person .nk-avatar,.nk-mention.person ::slotted(.mini-avatar),.nk-mention.person ::slotted([slot=\\\"avatar\\\"]){width:16px;height:16px;border-radius:50%;color:var(--nk-on-accent);font-size:8.5px;font-weight:600;display:inline-flex;align-items:center;justify-content:center}.nk-mention.page{color:var(--nk-text-secondary);text-decoration:underline;text-decoration-color:var(--nk-border-strong);text-underline-offset:2px}.nk-mention.date{color:var(--nk-color-orange)}.nk-inline-code{font-family:var(--nk-font-mono);font-size:85%;color:var(--nk-danger);background:color-mix(in srgb,var(--nk-danger) 8%,transparent);border-radius:4px;padding:1px 5px}.nk-code{background:var(--nk-bg-code);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:20px 24px;font-family:var(--nk-font-mono);font-size:13px;line-height:1.6;margin:var(--nk-block-space, 14px) 0;overflow-x:auto;color:var(--nk-text-secondary);white-space:pre;position:relative}.nk-code .lang{position:absolute;top:6px;right:10px;font-size:11px;color:var(--nk-text-tertiary);font-family:var(--nk-font)}.nk-code .tag,.nk-code ::slotted(.tag){color:var(--nk-accent)}.nk-code .attr,.nk-code ::slotted(.attr){color:var(--nk-color-orange)}.nk-database{margin:var(--nk-block-space, 12px) 0 var(--nk-block-space, 8px)}.nk-db-tabs{display:flex;gap:2px;align-items:center;padding:0 0 6px;margin-bottom:0;font-size:14px}.nk-db-tab{padding:4px 8px;cursor:pointer;color:var(--nk-text-secondary);border-radius:var(--nk-radius);user-select:none;line-height:20px;display:flex;align-items:center;gap:6px;flex-shrink:0;white-space:nowrap}.nk-db-tab:hover{color:var(--nk-text);background:var(--nk-bg-hover)}.nk-db-tab.active{color:var(--nk-text);background:var(--nk-bg-active);font-weight:500}.nk-db-tab.add{color:var(--nk-text-tertiary)}.nk-db-tab .badge,.nk-db-tab ::slotted(.badge){background:var(--nk-bg-callout);border-radius:8px;font-size:11px;padding:0 6px;color:var(--nk-text-tertiary)}.nk-db-toolbar{display:flex;align-items:center;gap:8px;min-width:0;padding-bottom:6px}.nk-db-toolbar>.nk-db-tabs{flex:1 1 auto;min-width:0;padding-bottom:0;overflow-x:auto;scrollbar-width:none}.nk-db-toolbar>.nk-db-tabs::-webkit-scrollbar{display:none}.nk-db-toolbar .tools{flex:none;display:flex;align-items:center;gap:4px;margin-left:auto}.nk-db-tool{display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 8px;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:14px;color:var(--nk-text-secondary);white-space:nowrap;cursor:pointer;user-select:none}.nk-db-tool:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-db-tool.active{color:var(--nk-accent)}.nk-filter-row{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:2px 0 8px}.nk-filter-pill{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border:1px solid var(--nk-border-strong);border-radius:12px;background:transparent;font-family:inherit;font-size:13px;line-height:1;color:var(--nk-text-secondary);white-space:nowrap;cursor:pointer;user-select:none}.nk-filter-pill:hover{background:var(--nk-bg-hover)}.nk-filter-pill.active{color:var(--nk-accent);border-color:color-mix(in srgb,var(--nk-accent) 35%,transparent);background:color-mix(in srgb,var(--nk-accent) 6%,transparent)}.nk-filter-pill.add{border-color:transparent;color:var(--nk-text-tertiary)}.nk-filter-pill.add:hover{color:var(--nk-text-secondary)}.nk-filter-pill button{padding:0;border:none;background:none;font:inherit;color:inherit;cursor:pointer}.nk-filter-pill .fp-remove{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-right:-4px;border-radius:50%;font-size:13px}.nk-filter-pill .fp-remove:hover{background:color-mix(in srgb,currentColor 15%,transparent)}.nk-table-wrap{overflow-x:auto}.nk-table{width:100%;border-collapse:collapse;font-size:14px}.nk-table th{text-align:left;font-weight:400;color:var(--nk-text-secondary);height:36px;padding:0 8px;border-bottom:1px solid var(--nk-border);border-right:1px solid var(--nk-border);font-size:14px;white-space:nowrap;user-select:none;cursor:pointer}.nk-table th:hover{background:var(--nk-bg-hover)}.nk-table th .th-icon,.nk-table th ::slotted(.th-icon){margin-right:6px;font-size:13px;color:var(--nk-text-tertiary)}.nk-table td{height:36px;padding:6px 8px;line-height:1.5;border-bottom:1px solid var(--nk-border);border-right:1px solid var(--nk-border);white-space:nowrap;vertical-align:middle}.nk-table th:last-child,.nk-table td:last-child{border-right:none}.nk-table.wrap td,.nk-table td.wrap{white-space:normal;vertical-align:top}.nk-table tbody tr:hover{background:var(--nk-bg-hover)}.nk-table .row-title{display:flex;align-items:center;gap:7px;font-weight:500;cursor:pointer}.nk-table .row-title:hover{text-decoration:underline;text-decoration-color:var(--nk-text-tertiary)}.nk-table .date-cell{color:var(--nk-text-secondary)}.nk-table .num{text-align:right;font-variant-numeric:tabular-nums}.nk-table .row-actions{display:flex;justify-content:flex-end;gap:4px}.nk-table th.actions{cursor:default}.nk-table th.actions:hover{background:none}.nk-table .td-desc{display:block;font-size:12px;line-height:16px;color:var(--nk-text-tertiary)}.nk-table .td-text.gray{color:var(--nk-color-gray)}.nk-table .td-text.brown{color:var(--nk-color-brown)}.nk-table .td-text.orange{color:var(--nk-color-orange)}.nk-table .td-text.yellow{color:var(--nk-color-yellow)}.nk-table .td-text.green{color:var(--nk-color-green)}.nk-table .td-text.blue{color:var(--nk-color-blue)}.nk-table .td-text.purple{color:var(--nk-color-purple)}.nk-table .td-text.pink{color:var(--nk-color-pink)}.nk-table .td-text.red{color:var(--nk-color-red)}.nk-table .person-cell{display:flex;align-items:center;gap:6px;color:var(--nk-text-secondary)}.nk-table .person-cell .mini-avatar,.nk-table .person-cell ::slotted(.mini-avatar){width:20px;height:20px;border-radius:50%;font-size:10px;color:var(--nk-on-accent);display:inline-flex;align-items:center;justify-content:center;font-weight:600}.nk-new-row,.nk-table .new-row{color:var(--nk-text-tertiary);cursor:pointer;padding:8px;display:flex;align-items:center;gap:7px;font-size:14px}.nk-new-row:hover,.nk-table .new-row:hover{background:var(--nk-bg-hover)}.nk-tag{display:inline-flex;align-items:center;max-width:100%;height:20px;padding:0 6px;border-radius:3px;font-size:14px;font-weight:400;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;background:var(--nk-tag-gray-bg);color:var(--nk-tag-gray-text)}.nk-tag.gray{background:var(--nk-tag-gray-bg);color:var(--nk-tag-gray-text)}.nk-tag.brown{background:var(--nk-tag-brown-bg);color:var(--nk-tag-brown-text)}.nk-tag.orange{background:var(--nk-tag-orange-bg);color:var(--nk-tag-orange-text)}.nk-tag.yellow{background:var(--nk-tag-yellow-bg);color:var(--nk-tag-yellow-text)}.nk-tag.green{background:var(--nk-tag-green-bg);color:var(--nk-tag-green-text)}.nk-tag.blue{background:var(--nk-tag-blue-bg);color:var(--nk-tag-blue-text)}.nk-tag.purple{background:var(--nk-tag-purple-bg);color:var(--nk-tag-purple-text)}.nk-tag.pink{background:var(--nk-tag-pink-bg);color:var(--nk-tag-pink-text)}.nk-tag.red{background:var(--nk-tag-red-bg);color:var(--nk-tag-red-text)}.nk-progress{width:110px;height:6px;border-radius:3px;background:var(--nk-tint-blue);overflow:hidden;display:inline-block}.nk-progress>i{display:block;height:100%;background:var(--nk-color-blue);border-radius:3px}.nk-progress.wide{width:100%;flex:1 1 60px;max-height:6px}.nk-progress-label{font-size:12px;color:var(--nk-text-tertiary);margin-left:7px;white-space:nowrap}.nk-progress-row{display:inline-flex;align-items:center;max-width:100%;vertical-align:middle}.nk-progress-row:has(>.nk-progress.wide){display:flex;flex:1 1 60px;width:100%;max-height:max-content}.nk-list{display:flex;flex-direction:column;font-size:14px}.nk-list-item{display:flex;align-items:center;gap:8px;min-width:0;overflow:hidden;min-height:36px;padding:4px 6px;border-bottom:1px solid var(--nk-border);color:inherit;text-decoration:none;cursor:pointer}.nk-list-item:hover{background:var(--nk-bg-hover)}.nk-list-item.static{cursor:default}.nk-list-item.static:hover{background:none}.nk-list>.nk-list-item:last-child,.nk-list ::slotted(.nk-list-item:last-child),.nk-list-item.last{border-bottom:none}.nk-list-item .l-icon,.nk-list-item ::slotted([slot=\\\"icon\\\"]){width:20px;flex-shrink:0;text-align:center;font-size:15px}.nk-list-item .l-title,.nk-list-item ::slotted(.l-title){flex:1 1 auto;min-width:0;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-list-item .l-meta,.nk-list-item ::slotted(.l-meta){flex:none;display:flex;align-items:center;gap:8px;margin-left:auto;font-size:12px;color:var(--nk-text-secondary);white-space:nowrap}.nk-calendar-view{font-size:14px}.nk-calendar-view .cv-head{display:flex;align-items:center;gap:4px;padding:2px 0 8px}.nk-calendar-view .cv-title{flex:1;font-weight:600;white-space:nowrap}.nk-calendar-view .cv-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));border-top:1px solid var(--nk-border);border-left:1px solid var(--nk-border)}.nk-calendar-view.weeks .cv-grid{grid-template-columns:32px repeat(7,minmax(0,1fr))}.nk-calendar-view :is(.cv-wd,.cv-week,.cv-day){min-width:0;border-right:1px solid var(--nk-border);border-bottom:1px solid var(--nk-border)}.nk-calendar-view .cv-wd{padding:4px 8px;font-size:12px;color:var(--nk-text-secondary);text-align:center}.nk-calendar-view .cv-week{padding:6px 0;font-size:11px;color:var(--nk-text-tertiary);text-align:center;font-variant-numeric:tabular-nums}.nk-calendar-view .cv-day{display:flex;flex-direction:column;gap:3px;min-height:112px;padding:4px 4px 6px}.nk-calendar-view .cv-day:is(.out,.off){background:var(--nk-bg-sidebar)}.nk-calendar-view .cv-num{align-self:flex-end;min-width:22px;height:22px;padding:0 6px;border-radius:11px;font-size:13px;line-height:22px;text-align:center;color:var(--nk-text-secondary);font-variant-numeric:tabular-nums}.nk-calendar-view .cv-day.out .cv-num{color:var(--nk-text-tertiary)}.nk-calendar-view .cv-day.today .cv-num{background:var(--nk-danger);color:var(--nk-on-accent)}.nk-calendar-view .cv-item{display:block;min-width:0;padding:3px 6px;border-radius:4px;background:var(--nk-bg-card);border:1px solid var(--nk-border);box-shadow:var(--nk-shadow-card);font-size:12.5px;line-height:18px;color:var(--nk-text);text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.nk-calendar-view .cv-item:hover{background:var(--nk-bg-hover)}.nk-board{display:none;gap:12px;padding:14px 2px;overflow-x:auto}.nk-board.active{display:flex}.nk-board-col{min-width:220px;width:220px;flex-shrink:0}.nk-board-col-header{display:flex;align-items:center;gap:7px;margin-bottom:8px;font-size:13.5px;font-weight:500}.nk-board-col-header .count{color:var(--nk-text-tertiary);font-weight:400}.nk-card{background:var(--nk-bg-card);border:1px solid var(--nk-border);border-radius:8px;padding:10px 12px;margin-bottom:8px;cursor:grab;box-shadow:var(--nk-shadow-card);transition:border-color .15s}.nk-card:hover{border-color:var(--nk-border-strong)}.nk-card .card-title,.nk-card ::slotted(.card-title){font-weight:500;margin-bottom:7px;display:flex;gap:6px;align-items:center}.nk-card .card-meta,.nk-card ::slotted(.card-meta){display:flex;gap:6px;flex-wrap:wrap;align-items:center;font-size:12px;color:var(--nk-text-secondary)}.nk-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(260px,100%),1fr));gap:16px;padding:14px 2px}.nk-gallery.small{grid-template-columns:repeat(auto-fill,minmax(min(180px,100%),1fr));gap:12px}.nk-gallery.large{grid-template-columns:repeat(auto-fill,minmax(min(340px,100%),1fr))}.nk-gallery .nk-card{display:flex;flex-direction:column;min-width:0;margin:0;color:inherit;text-decoration:none;cursor:pointer}.nk-gallery .nk-card>.nk-cover{flex:none;height:auto;aspect-ratio:2 / 1;margin:-10px -12px 10px;border-radius:7px 7px 0 0;overflow:hidden}.nk-gallery.fit .nk-card>.nk-cover:has(>img){background:var(--nk-bg-callout)}.nk-gallery.fit .nk-card>.nk-cover>img{object-fit:contain}.nk-gallery .card-title{min-width:0}.nk-gallery>.card-item{display:flex;min-width:0}.nk-gallery>.card-item>.nk-card{flex:1 1 auto}.nk-gallery>.nk-new-row{justify-content:center;min-height:64px;border:1px dashed var(--nk-border-strong);border-radius:8px}.nk-field{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:9px 0;--_nk-field-min: 210px}.nk-field .f-label,.nk-field ::slotted(.f-label),.nk-field ::slotted([slot=\\\"label\\\"]){font-size:14px}.nk-field .f-desc,.nk-field ::slotted(.f-desc),.nk-field ::slotted([slot=\\\"desc\\\"]){font-size:12px;color:var(--nk-text-secondary);margin-top:2px;line-height:1.45}.nk-field .f-control,.nk-field ::slotted(.f-control){flex-shrink:0}.nk-field.stacked,.nk-fields>.nk-field{flex-direction:column;align-items:stretch;gap:6px;min-width:0}.nk-field.stacked .f-control,.nk-fields>.nk-field .f-control{width:100%;min-width:0}.nk-field.stacked .nk-input,.nk-field.stacked .nk-textarea,.nk-field.stacked .nk-select,.nk-fields>.nk-field .nk-input,.nk-fields>.nk-field .nk-textarea,.nk-fields>.nk-field .nk-select{width:100%;min-width:0}.nk-field.compact,.nk-fields>.nk-field{padding:0;gap:4px;min-width:0}.nk-field.compact .f-label,.nk-field.compact ::slotted([slot=\\\"label\\\"]),.nk-fields>.nk-field .f-label,.nk-fields>.nk-field ::slotted([slot=\\\"label\\\"]){font-size:12px;color:var(--nk-text-tertiary)}.nk-fields{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px 12px;padding:9px 0}.nk-fields.fit{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.nk-fields>.nk-field{min-width:0}.nk-input,.nk-select,.nk-textarea{font-family:inherit;font-size:14px;line-height:20px;color:var(--nk-text);background:var(--nk-bg-input);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:5px 10px;outline:none;transition:border-color .15s,box-shadow .15s;min-width:var(--_nk-field-min, 210px);max-width:100%}.nk-input:hover,.nk-select:hover,.nk-textarea:hover{border-color:var(--nk-border-strong)}.nk-input:focus,.nk-select:focus,.nk-textarea:focus{border-color:color-mix(in srgb,var(--nk-accent) 60%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--nk-accent) 30%,transparent)}.nk-input::placeholder,.nk-textarea::placeholder{color:var(--nk-text-tertiary)}.nk-input.wide,.nk-textarea.wide,.nk-select.wide{width:100%;min-width:0}.nk-input[type=date],.nk-input[type=time],.nk-input[type=datetime-local],.nk-input[type=month]{appearance:none}.nk-input::-webkit-date-and-time-value{text-align:start;min-height:1lh}.nk-select.compact{min-width:120px}.nk-textarea{resize:vertical;min-height:70px;line-height:1.5}.nk-select{appearance:none;cursor:pointer;padding-right:26px;background-image:linear-gradient(45deg,transparent 50%,var(--nk-text-tertiary) 50%),linear-gradient(135deg,var(--nk-text-tertiary) 50%,transparent 50%);background-position:calc(100% - 14px) 55%,calc(100% - 10px) 55%;background-size:4px 4px;background-repeat:no-repeat}.nk-copy-field{display:flex;align-items:center;gap:2px;min-width:var(--_nk-field-min, 210px);max-width:100%;padding:0 3px 0 10px;font-size:14px;line-height:20px;color:var(--nk-text);background:var(--nk-bg-input);border:1px solid var(--nk-border);border-radius:var(--nk-radius)}.nk-copy-field.wide{width:100%;min-width:0}.nk-copy-field.wrap{align-items:flex-start}.nk-copy-field .cf-value{flex:1 1 auto;min-width:0;padding:5px 6px 5px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:all}.nk-copy-field.mono .cf-value{font-family:var(--nk-font-mono);font-size:13px}.nk-copy-field.wrap .cf-value{white-space:pre-wrap;overflow-wrap:anywhere}.nk-copy-field .cf-btn{flex:none;height:24px;margin:3px 0;padding:0 8px;border:none;border-radius:4px;background:transparent;font-family:inherit;font-size:13px;color:var(--nk-text-secondary);white-space:nowrap;cursor:pointer}.nk-copy-field .cf-btn:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-copy-field .cf-btn.copied{color:var(--nk-color-green)}.nk-copy-field .cf-btn>svg{display:none;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-copy-field.icons .cf-btn:has(>svg){display:inline-flex;align-items:center;justify-content:center;width:28px;padding:0}.nk-copy-field.icons .cf-btn>svg{display:block}.nk-copy-field.icons .cf-btn:has(>svg)>span{display:none}.nk-calendar{display:block;width:max-content;max-width:100%;margin-inline:auto;font-size:14px;user-select:none;-webkit-user-select:none}.nk-calendar .cal-head{display:flex;align-items:center;gap:2px;padding:0 0 6px 6px}.nk-calendar .cal-title{flex:1;font-weight:600;white-space:nowrap}.nk-calendar .cal-nav,.nk-calendar-view .cal-nav{display:inline-flex;align-items:center;justify-content:center;height:28px;min-width:28px;padding:0 6px;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:13px;color:var(--nk-text-secondary);cursor:pointer}.nk-calendar .cal-nav:hover,.nk-calendar-view .cal-nav:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-calendar .cal-nav svg,.nk-calendar-view .cal-nav svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-calendar .cal-grid{display:grid;grid-template-columns:repeat(7,var(--_nk-cell, 36px));row-gap:2px}.nk-calendar.weeks .cal-grid{grid-template-columns:24px repeat(7,var(--_nk-cell, 36px))}.nk-calendar .cal-wd,.nk-calendar .cal-week{display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--nk-text-tertiary);font-variant-numeric:tabular-nums}.nk-calendar .cal-wd{height:24px}.nk-calendar .cal-week{font-size:11px}.nk-calendar .cal-day{position:relative;display:inline-flex;align-items:center;justify-content:center;width:var(--_nk-cell, 36px);height:var(--_nk-cell, 36px);padding:0;border:none;border-radius:var(--nk-radius);background:transparent;font-family:inherit;font-size:14px;color:var(--nk-text);font-variant-numeric:tabular-nums;cursor:pointer}.nk-calendar .cal-day:hover{background:var(--nk-bg-hover)}.nk-calendar .cal-day:focus-visible{outline:2px solid color-mix(in srgb,var(--nk-accent) 60%,transparent);outline-offset:-2px}.nk-calendar .cal-day.out,.nk-calendar .cal-day.off{color:var(--nk-text-tertiary)}.nk-calendar .cal-day.today{color:var(--nk-danger);font-weight:600}.nk-calendar .cal-day.in-range{border-radius:0;background:color-mix(in srgb,var(--nk-accent) 12%,transparent)}.nk-calendar .cal-day:is(.selected,.start,.end){background:var(--nk-accent);color:var(--nk-on-accent);font-weight:500}.nk-calendar .cal-day.start:not(.end){border-radius:var(--nk-radius) 0 0 var(--nk-radius)}.nk-calendar .cal-day.end:not(.start){border-radius:0 var(--nk-radius) var(--nk-radius) 0}.nk-calendar .cal-day[aria-disabled=true]{color:var(--nk-text-tertiary);background:none;opacity:.5;cursor:default}.nk-calendar .cal-marks{position:absolute;left:0;right:0;bottom:3px;display:flex;justify-content:center;gap:2px;pointer-events:none}.nk-calendar .cal-marks i{width:4px;height:4px;border-radius:50%;background:var(--nk-color-gray)}.nk-calendar .cal-day:is(.selected,.start,.end) .cal-marks i{background:var(--nk-on-accent)}.nk-calendar .cal-foot{display:flex;align-items:center;gap:8px;margin-top:8px;padding:8px 2px 0;border-top:1px solid var(--nk-border)}.nk-calendar .cal-foot .nk-input{min-width:0;flex:1 1 auto}.nk-btn{font-family:inherit;font-size:14px;line-height:20px;font-weight:500;border-radius:var(--nk-radius);cursor:pointer;padding:3px 12px;border:1px solid transparent;transition:background .15s,border-color .15s,box-shadow .15s,opacity .15s;display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap}.nk-btn svg,.nk-btn ::slotted(svg){width:15px;height:15px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.nk-btn.primary{background:var(--nk-accent);color:var(--nk-on-accent)}.nk-btn.primary:hover:not(:disabled,[aria-disabled=true]){opacity:.88}.nk-btn.secondary{background:var(--nk-bg-card);color:var(--nk-text);box-shadow:var(--nk-shadow-btn)}.nk-btn.secondary:hover:not(:disabled,[aria-disabled=true]){background:color-mix(in srgb,var(--nk-bg-card),var(--nk-text) 6%)}.nk-btn.danger{background:var(--nk-bg-card);color:var(--nk-danger);box-shadow:var(--nk-shadow-btn)}.nk-btn.danger:hover:not(:disabled,[aria-disabled=true]){background:color-mix(in srgb,var(--nk-danger) 8%,var(--nk-bg-card))}.nk-btn.danger-solid{background:var(--nk-danger);color:var(--nk-on-accent)}.nk-btn.danger-solid:hover:not(:disabled,[aria-disabled=true]){opacity:.88}.nk-btn.small{padding:1px 8px;font-size:13px;line-height:20px}a.nk-btn{text-decoration:none}.nk-btn:disabled,.nk-btn[aria-disabled=true]{opacity:.5;cursor:not-allowed}.nk-switch{position:relative;width:34px;height:20px;flex-shrink:0;appearance:none;border:none;cursor:pointer;border-radius:20px;background:var(--nk-border-strong);transition:background .2s}.nk-switch:after{content:\\\"\\\";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--nk-on-accent);transition:transform .2s;box-shadow:var(--nk-shadow-knob)}.nk-switch:checked,.nk-switch[aria-checked=true]{background:var(--nk-accent)}.nk-switch:checked:after,.nk-switch[aria-checked=true]:after{transform:translate(14px)}.nk-switch:disabled{opacity:.5;cursor:not-allowed}.nk-switch-label{display:inline-flex;align-items:flex-start;gap:8px;font-size:14px;cursor:pointer}.nk-switch-label>.nk-switch{font-size:inherit;line-height:inherit;margin-top:max(0px,calc((1lh - 20px)/2))}.nk-switch-label>span{padding-top:max(0px,calc((20px - 1lh)/2))}.nk-switch-label:has(.nk-switch:disabled){cursor:not-allowed;color:var(--nk-text-tertiary)}.nk-check{display:flex;align-items:flex-start;gap:8px;padding:4px 0;font-size:14px;cursor:pointer}.nk-check input{appearance:none;width:16px;height:16px;flex-shrink:0;border:1.4px solid var(--nk-border-strong);border-radius:3px;cursor:pointer;position:relative;background:var(--nk-bg);font-size:inherit;line-height:inherit;margin-top:max(0px,calc((1lh - 16px)/2))}.nk-check input[type=radio]{border-radius:50%}.nk-check input:checked{background:var(--nk-accent);border-color:var(--nk-accent)}.nk-check input:checked:after{content:\\\"\\\\2713\\\";color:var(--nk-on-accent);font-size:10.5px;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.nk-check input[type=radio]:checked:after{content:\\\"\\\\25cf\\\";font-size:7px}.nk-check input:disabled{opacity:.5;cursor:not-allowed}.nk-check input:disabled+*{opacity:.6}.nk-slider{width:210px;accent-color:var(--nk-accent);cursor:pointer}.nk-slider-value{font-size:12.5px;color:var(--nk-text-tertiary);margin-top:3px}.nk-profile-row{display:flex;align-items:center;gap:14px;padding:8px 0}.nk-profile-row .big-avatar,.nk-profile-row ::slotted(.big-avatar),.nk-profile-row ::slotted([slot=\\\"avatar\\\"]){width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-size:20px;font-weight:600;display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.nk-profile-row .big-avatar>img{display:block;width:100%;height:100%;object-fit:cover}.nk-profile-row .big-avatar.square,.nk-profile-row ::slotted(.big-avatar.square){border-radius:8px}.nk-profile-row .pr-actions{display:flex;flex-direction:column;gap:6px}.nk-profile-row .pr-remove{color:var(--nk-text-tertiary)}.nk-model-card{border:1px solid var(--nk-border-strong);border-radius:8px;padding:12px 14px;margin-bottom:var(--nk-block-space, 10px);cursor:pointer;display:flex;align-items:flex-start;gap:11px;transition:border-color .15s,background .15s}.nk-model-card:hover{background:var(--nk-bg-hover)}.nk-model-card.selected{border-color:var(--nk-accent);background:color-mix(in srgb,var(--nk-accent) 6%,transparent)}.nk-model-card .m-radio{width:15px;height:15px;border-radius:50%;flex-shrink:0;margin-top:2px;border:1.4px solid var(--nk-border-strong);position:relative}.nk-model-card.selected .m-radio{border-color:var(--nk-accent)}.nk-model-card.selected .m-radio:after{content:\\\"\\\";position:absolute;inset:3px;border-radius:50%;background:var(--nk-accent)}.nk-model-card .m-name,.nk-model-card ::slotted(.m-name),.nk-model-card ::slotted([slot=\\\"title\\\"]){font-weight:500;font-size:14px;display:flex;align-items:center;gap:7px}.nk-model-card .m-desc,.nk-model-card ::slotted(.m-desc),.nk-model-card ::slotted([slot=\\\"desc\\\"]){font-size:12px;color:var(--nk-text-secondary);margin-top:2px;line-height:1.45}.nk-danger-zone{border:1px solid color-mix(in srgb,var(--nk-danger) 40%,transparent);border-radius:8px;padding:14px 16px;margin-top:var(--nk-block-space, 26px)}.nk-danger-zone .dz-title{color:var(--nk-danger);font-weight:600;font-size:13px;margin-bottom:8px}.nk-member-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid var(--nk-border)}.nk-member-list>.nk-member-row:last-child,.nk-member-list ::slotted(.nk-member-row:last-child),.nk-member-row.last{border-bottom:none}.nk-member-row .mini-avatar,.nk-member-row .nk-avatar,.nk-member-row ::slotted(.mini-avatar),.nk-member-row ::slotted([slot=\\\"avatar\\\"]){width:28px;height:28px;border-radius:50%;color:var(--nk-on-accent);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;flex-shrink:0}.nk-member-row>:has(>.m-mail){min-width:0}.nk-member-row .m-mail{font-size:12px;color:var(--nk-text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nk-member-row .nk-select{min-width:120px;margin-left:auto}.nk-member-row ::slotted([slot=\\\"role\\\"]){margin-left:auto}.nk-modal-backdrop{position:fixed;inset:0;background:var(--nk-scrim);padding:env(safe-area-inset-top,0px) env(safe-area-inset-right,0px) env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px);display:flex;align-items:center;justify-content:center;z-index:100;opacity:0;pointer-events:none;transition:opacity .2s ease}.nk-modal-backdrop.open{opacity:1;pointer-events:auto}.nk-modal{width:min(1150px,92vw);height:min(715px,86vh);max-width:100%;max-height:100%;background:var(--nk-bg);border-radius:10px;box-shadow:var(--nk-shadow-menu);display:flex;overflow:hidden;transform:scale(.98) translateY(6px);transition:transform .2s ease}.nk-modal-backdrop.open .nk-modal{transform:none}.nk-settings-nav{width:240px;min-width:240px;background:var(--nk-bg-sidebar);border-right:1px solid var(--nk-border);padding:10px 8px;overflow-y:auto;flex-shrink:0}.nk-settings-user{display:flex;align-items:center;gap:9px;padding:6px 10px 12px;margin-bottom:4px}.nk-settings-user .avatar,.nk-settings-user ::slotted(.avatar),.nk-settings-user ::slotted([slot=\\\"avatar\\\"]){width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-weight:600;font-size:13px;display:flex;align-items:center;justify-content:center}.nk-settings-user .name{font-weight:500;font-size:14px}.nk-settings-user .mail{font-size:12px;color:var(--nk-text-secondary)}.nk-settings-nav .nk-tree-item{min-height:28px}.nk-settings-nav .nk-tree-item.active{background:var(--nk-bg-active);color:var(--nk-text);font-weight:500}.nk-settings-content{flex:1;overflow-y:auto;padding:36px 60px 80px;min-width:0}.nk-settings-content::-webkit-scrollbar{width:10px}.nk-settings-content::-webkit-scrollbar-thumb{background:var(--nk-border-strong);border-radius:5px;border:2px solid var(--nk-bg)}.nk-settings-pane{display:none;max-width:800px}.nk-settings-pane.active{display:block}.nk-settings-pane>h2{font-size:22px;font-weight:600;line-height:1.3;margin-bottom:20px}.nk-settings-pane>h3{font-size:16px;font-weight:500;padding-bottom:8px;border-bottom:1px solid var(--nk-border);margin:30px 0 12px}.nk-settings-pane ::slotted(h2){font-size:22px;font-weight:600;line-height:1.3;padding:0!important;margin:0 0 20px!important}.nk-settings-pane ::slotted(h3){font-size:16px;font-weight:500;border:0;border-bottom:1px solid var(--nk-border);padding:0 0 8px!important;margin:30px 0 12px!important}.nk-pop{background:var(--nk-bg);border-radius:10px;box-shadow:var(--nk-shadow-menu);padding:10px;width:296px}.nk-emoji-search{width:100%;font-family:inherit;font-size:14px;color:var(--nk-text);background:var(--nk-bg-input);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:6px 10px;outline:none;margin-bottom:8px}.nk-emoji-grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px}.nk-emoji-grid span,.nk-emoji-grid ::slotted(span){font-size:18px;text-align:center;padding:4px 0;border-radius:5px;cursor:pointer;user-select:none}.nk-emoji-grid span:hover{background:var(--nk-bg-hover)}.nk-emoji-cats{display:flex;gap:2px;margin-top:8px;padding-top:8px;border-top:1px solid var(--nk-border)}.nk-emoji-cats span{font-size:14px;padding:3px 7px;border-radius:5px;cursor:pointer;color:var(--nk-text-tertiary);filter:grayscale(1);opacity:.6}.nk-emoji-cats span.active,.nk-emoji-cats span:hover{filter:none;opacity:1;background:var(--nk-bg-hover)}.nk-menu{padding:5px;width:230px}.nk-menu-item{display:flex;align-items:center;gap:9px;padding:4px 8px;min-height:var(--_nk-row, 28px);border-radius:5px;cursor:pointer;font-size:14px;user-select:none}.nk-menu-item:hover{background:var(--nk-bg-hover)}.nk-menu-item .m-icon,.nk-menu-item ::slotted(.m-icon),.nk-menu-item ::slotted([slot=\\\"icon\\\"]){width:17px;text-align:center;font-size:14px}.nk-menu-item .m-shortcut,.nk-menu-item ::slotted(.m-shortcut){margin-left:auto;font-size:12px;color:var(--nk-text-tertiary)}.nk-menu-item.danger{color:var(--nk-danger)}.nk-menu-item>.nk-switch{margin-left:auto}.nk-menu-sep{border-top:1px solid var(--nk-border);margin:5px 4px}.nk-menu-label{font-size:12px;color:var(--nk-text-tertiary);padding:5px 8px 2px}.nk-pop.floating{z-index:106;opacity:0;visibility:hidden;pointer-events:none;max-height:min(var(--_nk-float-max, 100dvh),100dvh - 16px);overflow-y:auto;overscroll-behavior:contain;transform:translateY(-4px) scale(.98);transform-origin:top;transition:opacity .15s ease,transform .15s ease,visibility 0s linear .15s}.nk-pop.floating.open{opacity:1;visibility:visible;pointer-events:auto;transform:none;transition:opacity .15s ease,transform .15s ease,visibility 0s}.nk-cmdk-backdrop{position:fixed;inset:0;background:var(--nk-scrim-soft);display:flex;justify-content:center;align-items:flex-start;padding:max(14vh,env(safe-area-inset-top,0px)) env(safe-area-inset-right,0px) env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px);z-index:110;opacity:0;pointer-events:none;transition:opacity .18s ease}.nk-cmdk-backdrop.open{opacity:1;pointer-events:auto}.nk-cmdk{max-width:100%;width:min(560px,92vw);background:var(--nk-bg);border-radius:12px;box-shadow:var(--nk-shadow-menu);overflow:hidden;transform:scale(.98);transition:transform .18s ease}.nk-cmdk-backdrop.open .nk-cmdk{transform:scale(1)}.nk-cmdk-input-row{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--nk-border)}.nk-cmdk-input-row input{flex:1;border:none;outline:none;background:transparent;font-family:inherit;font-size:16px;color:var(--nk-text)}.nk-cmdk-input-row input::placeholder{color:var(--nk-text-tertiary)}.nk-cmdk-list{max-height:320px;overflow-y:auto;padding:6px}.nk-cmdk-group{font-size:12px;color:var(--nk-text-tertiary);padding:8px 10px 3px}.nk-cmdk-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer;font-size:14px;user-select:none}.nk-cmdk-item.selected{background:var(--nk-bg-active)}.nk-cmdk-item .m-icon,.nk-cmdk-item ::slotted(.m-icon),.nk-cmdk-item ::slotted([slot=\\\"icon\\\"]){width:17px;text-align:center;font-size:14px}.nk-cmdk-item .m-shortcut,.nk-cmdk-item ::slotted(.m-shortcut){margin-left:auto;font-size:12px;color:var(--nk-text-tertiary)}.nk-cmdk-empty{padding:30px;text-align:center;color:var(--nk-text-tertiary);font-size:13.5px}.nk-cmdk-footer{display:flex;gap:14px;padding:8px 16px;border-top:1px solid var(--nk-border);font-size:11.5px;color:var(--nk-text-tertiary)}.nk-sheet-backdrop{position:fixed;inset:0;z-index:100;display:none;flex-direction:column;align-items:center;justify-content:flex-end;padding-top:max(24px,env(safe-area-inset-top,0px));background:var(--nk-scrim-soft);opacity:0;transition:opacity .2s ease,display .25s allow-discrete}.nk-sheet-backdrop.open{display:flex;opacity:1}@starting-style{.nk-sheet-backdrop.open{opacity:0}}.nk-sheet{--_nk-row: 40px;width:100%;max-width:640px;max-height:100%;overflow-y:auto;overscroll-behavior:contain;padding:6px max(10px,env(safe-area-inset-right,0px)) max(16px,env(safe-area-inset-bottom,0px)) max(10px,env(safe-area-inset-left,0px));background:var(--nk-bg);color:var(--nk-text);border-radius:14px 14px 0 0;box-shadow:var(--nk-shadow-menu);translate:0 100%;transition:translate .25s cubic-bezier(.2,.8,.2,1)}.nk-sheet-backdrop.open .nk-sheet{translate:none}@starting-style{.nk-sheet-backdrop.open .nk-sheet{translate:0 100%}}.nk-sheet .sh-grabber,.nk-sheet ::slotted(.sh-grabber){width:36px;height:4px;margin:4px auto 10px;border-radius:2px;background:var(--nk-border-strong)}.nk-sheet .sh-title,.nk-sheet ::slotted(.sh-title){font-size:14px;font-weight:600;text-align:center;padding:0 8px 10px}.nk-dialog-backdrop{position:fixed;inset:0;z-index:105;display:none;align-items:center;justify-content:center;padding:max(16px,env(safe-area-inset-top,0px)) max(16px,env(safe-area-inset-right,0px)) max(16px,env(safe-area-inset-bottom,0px)) max(16px,env(safe-area-inset-left,0px));background:var(--nk-scrim-soft);opacity:0;transition:opacity .2s ease,display .2s allow-discrete}.nk-dialog-backdrop.open{display:flex;opacity:1}@starting-style{.nk-dialog-backdrop.open{opacity:0}}.nk-dialog{width:440px;max-width:100%;max-height:100%;overflow-y:auto;overscroll-behavior:contain;padding:20px 24px;border-radius:10px;outline:none;background:var(--nk-bg);color:var(--nk-text);box-shadow:var(--nk-shadow-menu);scale:.98;translate:0 6px;transition:scale .2s ease,translate .2s ease}.nk-dialog.wide{width:560px}.nk-dialog-backdrop.open .nk-dialog{scale:none;translate:none}@starting-style{.nk-dialog-backdrop.open .nk-dialog{scale:.98;translate:0 6px}}.nk-dialog .dl-title{font-size:16px;font-weight:600;line-height:1.4;margin-bottom:6px}.nk-dialog .dl-body{font-size:14px;line-height:1.5}.nk-dialog .dl-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px}.nk-peek-backdrop{position:fixed;inset:0;z-index:50;display:none;pointer-events:none;transition:background-color .2s ease,display .25s allow-discrete}.nk-peek-backdrop.open{display:block}.nk-peek{--_nk-title: 32px;position:absolute;top:0;right:0;bottom:0;width:min(var(--nk-peek-width),100%);display:flex;flex-direction:column;pointer-events:auto;outline:none;background:var(--nk-bg);color:var(--nk-text);box-shadow:var(--nk-shadow-menu);translate:100% 0;transition:translate .25s cubic-bezier(.2,.8,.2,1)}.nk-peek-backdrop.open .nk-peek{translate:none}@starting-style{.nk-peek-backdrop.open .nk-peek{translate:100% 0}}.nk-peek .pk-bar{flex:none;display:flex;align-items:center;gap:2px;height:44px;padding:0 12px}.nk-peek .pk-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:4px 48px 64px;font-size:16px;line-height:1.5}.nk-peek .pk-resize{position:absolute;top:0;bottom:0;left:-4px;width:8px;z-index:1;cursor:col-resize;touch-action:none;outline:none}.nk-peek .pk-resize:after{content:\\\"\\\";position:absolute;top:0;bottom:0;left:3px;width:2px;transition:background .15s}.nk-peek .pk-resize:hover:after,.nk-peek .pk-resize:focus-visible:after,.nk-peek .pk-resize.active:after{background:var(--nk-accent)}.nk-app.peek-inset .nk-main{padding-right:min(var(--nk-peek-width),100%)}.nk-toast{position:fixed;bottom:max(20px,calc(env(safe-area-inset-bottom,0px) + 12px));left:50%;transform:translate(-50%) translateY(80px);z-index:120;width:max-content;max-width:calc(100% - 32px);background:var(--nk-text);color:var(--nk-bg);padding:8px 16px;border-radius:8px;font-size:14px;opacity:0;transition:all .3s ease;pointer-events:none;box-shadow:var(--nk-shadow-menu);display:flex;gap:8px;align-items:center}.nk-toast.show{opacity:1;transform:translate(-50%) translateY(0)}.nk-tooltip{z-index:130;max-width:260px;padding:4px 8px;border-radius:var(--nk-radius);overflow-wrap:break-word;background:var(--nk-text);color:var(--nk-bg);box-shadow:var(--nk-shadow-menu);font-size:12px;font-weight:500;line-height:16px;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .1s ease,visibility 0s linear .1s}.nk-tooltip.open{opacity:1;visibility:visible;transition:opacity .1s ease}.nk-tooltip .tt-key{margin-left:6px;color:color-mix(in srgb,var(--nk-bg) 60%,transparent)}.nk-tooltip.lines{white-space:pre-line}.nk-gallery-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));gap:20px 32px;margin:var(--nk-block-space, 12px) 0}.nk-g-item>h4{font-size:12px;font-weight:500;color:var(--nk-text-tertiary);text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px}.nk-g-item ::slotted(h4){font-size:12px;font-weight:500;color:var(--nk-text-tertiary);text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px!important}.nk-tabs{display:flex;gap:2px;border-bottom:1px solid var(--nk-border);font-size:14px}.nk-tab{padding:7px 11px;cursor:pointer;color:var(--nk-text-secondary);border-bottom:2px solid transparent;margin-bottom:-1px;user-select:none}.nk-tab:hover{color:var(--nk-text)}.nk-tab.active{color:var(--nk-text);border-bottom-color:var(--nk-text);font-weight:500}.nk-tab-panel{padding:12px 2px;color:var(--nk-text-secondary);line-height:1.55;font-size:14px}.nk-tabs.scroll{overflow-x:auto;overflow-y:hidden;scrollbar-width:none;white-space:nowrap;border-bottom:0;padding-bottom:1px;box-shadow:inset 0 -1px 0 var(--nk-border)}.nk-tabs.scroll::-webkit-scrollbar{display:none}.nk-template-btn{display:flex;align-items:center;gap:8px;width:100%;font-family:inherit;font-size:14px;color:var(--nk-text-secondary);background:var(--nk-bg-callout);border:none;border-radius:var(--nk-radius);padding:8px 12px;cursor:pointer;margin-bottom:var(--nk-block-space, 6px);text-align:left}.nk-template-btn:hover{background:var(--nk-bg-hover)}.nk-stats{display:flex;gap:10px}.nk-stat{flex:1;border:1px solid var(--nk-border);border-radius:8px;padding:12px 14px}.nk-stat .s-label,.nk-stat ::slotted(.s-label),.nk-stat ::slotted([slot=\\\"label\\\"]){font-size:12px;color:var(--nk-text-secondary);margin-bottom:4px}.nk-stat .s-value,.nk-stat ::slotted(.s-value),.nk-stat ::slotted([slot=\\\"value\\\"]){font-size:22px;font-weight:600;letter-spacing:-.01em}.nk-stat .s-delta,.nk-stat ::slotted(.s-delta),.nk-stat ::slotted([slot=\\\"delta\\\"]){font-size:12px;margin-top:3px}.nk-stat .s-delta.up,.nk-stat ::slotted(.s-delta.up),.nk-stat ::slotted([slot=\\\"delta\\\"].up){color:var(--nk-color-green)}.nk-stat .s-delta.down,.nk-stat ::slotted(.s-delta.down),.nk-stat ::slotted([slot=\\\"delta\\\"].down){color:var(--nk-danger)}.nk-synced{border:1.5px solid color-mix(in srgb,var(--nk-danger) 55%,transparent);border-radius:8px;padding:12px 14px;position:relative;margin:var(--nk-block-space, 8px) 0}.nk-synced .synced-badge{position:absolute;top:-9px;right:10px;font-size:11px;background:var(--nk-danger);color:var(--nk-on-accent);border-radius:8px;padding:1px 8px}.nk-segmented{display:inline-flex;background:var(--nk-bg-callout);border-radius:7px;padding:2px}.nk-segmented button{font-family:inherit;font-size:14px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 12px;border-radius:5px;cursor:pointer}.nk-segmented ::slotted(button){font-family:inherit;font-size:14px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 12px!important;border-radius:5px;cursor:pointer}.nk-segmented button.active,.nk-segmented ::slotted(button.active){background:var(--nk-bg);color:var(--nk-text);font-weight:500;box-shadow:var(--nk-shadow-segment)}.nk-segmented.wrap{flex-wrap:wrap}.nk-segmented.scroll{max-width:100%;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}.nk-segmented.scroll::-webkit-scrollbar{display:none}.nk-segmented.scroll button,.nk-segmented.scroll ::slotted(button){flex-shrink:0;white-space:nowrap}.nk-banner{display:flex;align-items:center;gap:10px;font-size:14px;border-radius:8px;padding:10px 14px;margin-bottom:var(--nk-block-space, 8px);color:var(--nk-text)}.nk-banner.info{background:var(--nk-tint-blue)}.nk-banner.success{background:var(--nk-tint-green)}.nk-banner.warning{background:var(--nk-tint-yellow)}.nk-banner.danger{background:var(--nk-tint-red)}.nk-banner .b-action,.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){margin-left:auto;padding:0;border:0;background:none;color:inherit;font:inherit;font-weight:500;text-align:left;cursor:pointer;text-decoration:underline;text-underline-offset:2px}.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){margin-left:auto!important}.nk-avatar-group{display:flex}.nk-avatar-group .mini-avatar,.nk-avatar-group .nk-avatar,.nk-avatar-group ::slotted(.mini-avatar),.nk-avatar-group ::slotted(.nk-avatar){width:26px;height:26px;border-radius:50%;color:var(--nk-on-accent);font-size:10.5px;font-weight:600;border:2px solid var(--nk-bg);display:flex;align-items:center;justify-content:center;margin-left:-7px}.nk-avatar-group .mini-avatar:first-child,.nk-avatar-group .nk-avatar:first-child,.nk-avatar-group ::slotted(.mini-avatar:first-child),.nk-avatar-group ::slotted(.nk-avatar:first-child){margin-left:0}.nk-avatar-group .more,.nk-avatar-group ::slotted(.more){background:var(--nk-bg-callout);color:var(--nk-text-secondary)}.nk-avatar{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:24px;height:24px;border-radius:50%;overflow:hidden;vertical-align:middle;font-size:10px;font-weight:600;line-height:1;color:var(--nk-on-accent);user-select:none;background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));object-fit:cover}.nk-avatar.small{width:20px;height:20px;font-size:9px}.nk-avatar.large{width:32px;height:32px;font-size:12px}.nk-avatar.xlarge{width:56px;height:56px;font-size:20px}.nk-avatar.square{border-radius:4px}.nk-avatar>img,.nk-avatar ::slotted(img){display:block;width:100%;height:100%;object-fit:cover}.nk-avatar.gray,.nk-calendar .cal-marks i.gray{background:var(--nk-color-gray)}.nk-avatar.brown,.nk-calendar .cal-marks i.brown{background:var(--nk-color-brown)}.nk-avatar.orange,.nk-calendar .cal-marks i.orange{background:var(--nk-color-orange)}.nk-avatar.yellow,.nk-calendar .cal-marks i.yellow{background:var(--nk-color-yellow)}.nk-avatar.green,.nk-calendar .cal-marks i.green{background:var(--nk-color-green)}.nk-avatar.blue,.nk-calendar .cal-marks i.blue{background:var(--nk-color-blue)}.nk-avatar.purple,.nk-calendar .cal-marks i.purple{background:var(--nk-color-purple)}.nk-avatar.pink,.nk-calendar .cal-marks i.pink{background:var(--nk-color-pink)}.nk-avatar.red,.nk-calendar .cal-marks i.red{background:var(--nk-color-red)}.nk-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));gap:12px;margin:var(--nk-block-space, 12px) 0}.nk-panels.flush{margin:0}.nk-panel{display:flex;flex-direction:column;gap:6px;min-width:0;--_nk-field-min: min(210px, 100%);padding:14px 16px;border:1px solid var(--nk-border);border-radius:10px;background:var(--nk-bg-card);box-shadow:var(--nk-shadow-card);font-size:14px;line-height:1.5;color:inherit;text-decoration:none;text-align:left}:is(a,button).nk-panel{cursor:pointer;font-family:inherit;transition:border-color .15s,background .15s}:is(a,button).nk-panel:hover{border-color:var(--nk-border-strong)}.nk-panel>h3,.nk-panel>.p-head>h3{font-size:14px;font-weight:600;line-height:1.4}.nk-panel ::slotted(h3){font-size:14px;font-weight:600;line-height:1.4;margin:0!important}.nk-panel>p{font-size:13px;color:var(--nk-text-secondary)}.nk-panel ::slotted(p){font-size:13px;color:var(--nk-text-secondary);margin:0!important}.nk-panel>.p-head{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;min-width:0}.nk-panel>.p-head>h3{flex:1 1 auto;min-width:0}.nk-panel .p-end{flex:none;display:flex;align-items:center;gap:6px;margin-left:auto}.nk-panel>.nk-cover{flex:none;height:var(--nk-panel-cover-height);margin:-14px -16px 2px;border-radius:9px 9px 0 0}.nk-panel>.nk-page-icon{font-size:28px}.nk-panel>.nk-cover+.nk-page-icon{margin-top:-24px}.nk-skeleton{border-radius:5px;margin-bottom:var(--nk-block-space, 10px);background:linear-gradient(90deg,var(--nk-bg-callout) 25%,var(--nk-bg-hover) 50%,var(--nk-bg-callout) 75%);background-size:200% 100%;animation:nk-shimmer 1.6s infinite}@keyframes nk-shimmer{to{background-position:-200% 0}}.nk-empty{text-align:center;padding:36px 20px;border:1.5px dashed var(--nk-border-strong);border-radius:10px;color:var(--nk-text-tertiary)}.nk-empty .e-icon,.nk-empty ::slotted(.e-icon),.nk-empty ::slotted([slot=\\\"icon\\\"]){font-size:30px;margin-bottom:8px}.nk-empty .e-title,.nk-empty ::slotted(.e-title),.nk-empty ::slotted([slot=\\\"title\\\"]){font-weight:500;color:var(--nk-text-secondary);margin-bottom:3px;font-size:14px}.nk-empty .e-desc,.nk-empty ::slotted(.e-desc),.nk-empty ::slotted([slot=\\\"desc\\\"]){font-size:13px;margin-bottom:12px}.nk-empty .e-actions,.nk-empty ::slotted(.e-actions){display:flex;flex-wrap:wrap;justify-content:center;gap:8px}.nk-steps{display:flex;flex-direction:column;margin:var(--nk-block-space, 8px) 0;padding:0;list-style:none;font-size:14px}.nk-step{position:relative;display:flex;align-items:flex-start;gap:10px;padding-bottom:14px;line-height:20px;color:var(--nk-text-tertiary)}.nk-step:last-child{padding-bottom:0}.nk-step:not(:last-child):after{content:\\\"\\\";position:absolute;left:10px;top:24px;bottom:4px;width:1px;background:var(--nk-border)}.nk-step .st-mark{flex:none;width:20px;height:20px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--nk-border-strong);background:var(--nk-bg);font-size:11px;font-weight:600;line-height:1}.nk-step .st-desc{display:block;font-size:12px;line-height:18px;color:var(--nk-text-tertiary);font-weight:400}.nk-step.done{color:var(--nk-text-secondary)}.nk-step.done .st-mark{background:var(--nk-tag-green-bg);color:var(--nk-tag-green-text);border-color:transparent}.nk-step.current{color:var(--nk-text);font-weight:500}.nk-step.current .st-mark{border-color:var(--nk-accent);color:var(--nk-accent)}.nk-step.skipped .st-mark{border-style:dashed}.nk-step button.st-label,.nk-step a.st-label{font:inherit;color:inherit;text-align:left;text-decoration:none;background:none;border:0;border-radius:3px;cursor:pointer}.nk-step button.st-label:hover,.nk-step a.st-label:hover{text-decoration:underline;text-decoration-color:var(--nk-text-tertiary);text-underline-offset:2px}.nk-step button.st-label:focus-visible,.nk-step a.st-label:focus-visible{outline:2px solid color-mix(in srgb,var(--nk-accent) 60%,transparent);outline-offset:2px}.nk-steps.horizontal{flex-direction:row;align-items:flex-start;gap:10px}.nk-steps.horizontal .nk-step{flex:none;padding-bottom:0;min-width:0;white-space:nowrap}.nk-steps.horizontal .nk-step:not(:last-child){flex:1 1 auto}.nk-steps.horizontal .nk-step:not(:last-child):after{position:static;flex:1 1 16px;width:auto;min-width:16px;height:1px;margin-top:10px}.nk-comments{border-left:1px solid var(--nk-border);padding:4px 0 4px 18px;margin:var(--nk-block-space, 8px) 0 var(--nk-block-space, 8px) 8px}.nk-comment{display:flex;gap:9px;margin-bottom:14px}.nk-comment .mini-avatar,.nk-comment ::slotted(.mini-avatar),.nk-comment ::slotted([slot=\\\"avatar\\\"]){width:24px;height:24px;border-radius:50%;color:var(--nk-on-accent);flex-shrink:0;font-size:10px;font-weight:600;display:flex;align-items:center;justify-content:center}.nk-comment .c-head,.nk-comment ::slotted(.c-head){font-size:12px;color:var(--nk-text-tertiary);margin-bottom:2px}.nk-comment .c-head b{color:var(--nk-text);font-weight:600}.nk-comment .c-body,.nk-comment ::slotted(.c-body){font-size:14px;line-height:1.5}.nk-comment-input{display:flex;gap:8px;align-items:center;margin-top:4px}.nk-comment-input input{min-width:0;flex:1}.nk-ai-thread{display:flex;flex-direction:column;gap:14px}.nk-ai-msg{display:flex;gap:9px}.nk-ai-msg .mini-avatar,.nk-ai-msg ::slotted(.mini-avatar),.nk-ai-msg ::slotted([slot=\\\"avatar\\\"]){width:24px;height:24px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:12px;background:var(--nk-bg-callout)}.nk-ai-msg.user .mini-avatar,.nk-ai-msg.user ::slotted(.mini-avatar),.nk-ai-msg.user ::slotted([slot=\\\"avatar\\\"]){background:linear-gradient(135deg,var(--nk-decor-purple),var(--nk-decor-blue));color:var(--nk-on-accent);font-size:9.5px;font-weight:600}.nk-ai-msg .a-body,.nk-ai-msg ::slotted(.a-body){font-size:14px;line-height:1.55;padding-top:2px}.nk-ai-msg .a-name,.nk-ai-msg ::slotted(.a-name){font-size:12px;font-weight:600;margin-bottom:2px}.nk-ai-msg .a-name span{color:var(--nk-text-tertiary);font-weight:400}.nk-ai-msg.user.bubble{justify-content:flex-end}.nk-ai-msg.bubble .a-body,.nk-ai-msg.bubble ::slotted(.a-body){max-width:85%;padding:6px 12px;border-radius:16px;background:var(--nk-bg-callout)}.nk-ai-actions{display:flex;gap:4px;margin-top:6px}.nk-ai-actions button{font-family:inherit;font-size:12px;color:var(--nk-text-secondary);background:transparent;border:1px solid var(--nk-border);border-radius:5px;padding:2px 8px;cursor:pointer}.nk-ai-actions ::slotted(button){font-family:inherit;font-size:12px;color:var(--nk-text-secondary);background:transparent;border:1px solid var(--nk-border);border-radius:5px;padding:2px 8px!important;cursor:pointer}.nk-ai-actions button:hover,.nk-ai-actions ::slotted(button:hover){background:var(--nk-bg-hover);color:var(--nk-text)}.nk-ai-input-row{display:flex;align-items:center;gap:8px;margin-top:var(--nk-block-space, 14px);border:1px solid var(--nk-border-strong);border-radius:10px;padding:8px 12px}.nk-ai-input-row:focus-within{border-color:var(--nk-accent)}.nk-ai-input-row input{flex:1;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;color:var(--nk-text);min-width:0}.nk-ai-input-row input::placeholder{color:var(--nk-text-tertiary)}.nk-ai-send{border:none;background:var(--nk-accent);color:var(--nk-on-accent);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:13px;flex-shrink:0}.nk-block-host{position:relative;border-radius:var(--nk-radius);margin:var(--nk-block-space, 8px) 0;padding:2px 0 2px 2px;transition:background .15s,box-shadow .15s}.nk-block-host:hover{background:var(--nk-bg-hover)}.nk-block-host:focus-within{background:transparent;box-shadow:0 0 0 2px color-mix(in srgb,var(--nk-accent) 25%,transparent)}.nk-block-host.nk-drop-target{box-shadow:0 -2px 0 0 var(--nk-accent);background:transparent}.nk-block-host .nk-block-handle,.nk-block-host ::slotted(.nk-block-handle){position:absolute;left:-26px;top:4px;width:18px;height:20px;border-radius:4px;display:flex;align-items:center;justify-content:center;color:var(--nk-text-tertiary);font-size:13px;cursor:grab;opacity:0;transition:opacity .15s;user-select:none}.nk-block-host:hover .nk-block-handle{opacity:1}.nk-block-host .nk-block-actions{position:absolute;display:flex;gap:1px;z-index:2;opacity:0;transition:opacity .15s;pointer-events:none}.nk-block-host .nk-block-actions.show{opacity:1;pointer-events:auto}.nk-block-host .nk-block-actions button,.nk-block-host .nk-block-actions ::slotted(button){width:20px;height:22px;padding:0;border:none;border-radius:4px;background:transparent;color:var(--nk-text-tertiary);font-family:inherit;font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.nk-block-host .nk-block-actions button:hover{background:var(--nk-bg-hover);color:var(--nk-text)}.nk-block-host .nk-block-actions .drag{cursor:grab}.nk-block-host .nk-block-actions .drag:active{cursor:grabbing}.nk-prose,.nk-block-host .ProseMirror{font-family:var(--nk-font);line-height:1.5;color:var(--nk-text);overflow-wrap:break-word}.nk-block-host .ProseMirror{outline:none;min-height:60px;padding:4px 2px}.nk-prose>*+*,.nk-block-host .ProseMirror>*+*{margin-top:6px}.nk-prose h1,.nk-block-host .ProseMirror h1{font-size:1.875em;font-weight:600;line-height:1.3;letter-spacing:-.01em;margin:32px 0 4px}.nk-prose h2,.nk-block-host .ProseMirror h2{font-size:1.5em;font-weight:600;line-height:1.3;margin:24px 0 4px}.nk-prose h3,.nk-block-host .ProseMirror h3{font-size:1.25em;font-weight:600;line-height:1.3;margin:16px 0 2px}.nk-prose :is(h4,h5,h6),.nk-block-host .ProseMirror :is(h4,h5,h6){font-size:1em;font-weight:600;margin:12px 0 0}.nk-prose>:first-child,.nk-block-host .ProseMirror>:first-child{margin-top:0}.nk-prose>:last-child,.nk-block-host .ProseMirror>:last-child{margin-bottom:0}.nk-prose p:empty:before{content:\\\"\\\";display:inline-block}.nk-prose :is(strong,b),.nk-block-host .ProseMirror :is(strong,b){font-weight:600}.nk-prose :is(ul,ol),.nk-block-host .ProseMirror :is(ul,ol){padding-left:24px;margin:4px 0}.nk-prose ul,.nk-block-host .ProseMirror ul{list-style:disc}.nk-prose ol,.nk-block-host .ProseMirror ol{list-style:decimal}.nk-prose li,.nk-block-host .ProseMirror li{margin:2px 0}.nk-prose li::marker,.nk-block-host .ProseMirror li::marker{color:var(--nk-text-tertiary)}.nk-prose ul[data-type=taskList],.nk-block-host .ProseMirror ul[data-type=taskList]{list-style:none;padding-left:2px}.nk-prose ul[data-type=taskList] li,.nk-block-host .ProseMirror ul[data-type=taskList] li{display:flex;gap:8px;align-items:flex-start}.nk-prose ul[data-type=taskList] li>label,.nk-block-host .ProseMirror ul[data-type=taskList] li>label{flex-shrink:0;margin-top:max(0px,calc((1lh - 16px)/2));user-select:none}.nk-prose ul[data-type=taskList] li>div,.nk-block-host .ProseMirror ul[data-type=taskList] li>div{flex:1;min-width:0}.nk-prose ul[data-type=taskList] input[type=checkbox],.nk-block-host .ProseMirror ul[data-type=taskList] input[type=checkbox]{appearance:none;width:16px;height:16px;margin:0;border:1.4px solid var(--nk-border-strong);border-radius:2px;cursor:pointer;position:relative;background:var(--nk-bg);display:block}.nk-prose ul[data-type=taskList] input[type=checkbox]:checked,.nk-block-host .ProseMirror ul[data-type=taskList] input[type=checkbox]:checked{background:var(--nk-accent);border-color:var(--nk-accent)}.nk-prose ul[data-type=taskList] input[type=checkbox]:checked:after,.nk-block-host .ProseMirror ul[data-type=taskList] input[type=checkbox]:checked:after{content:\\\"\\\\2713\\\";color:var(--nk-on-accent);font-size:11px;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.nk-prose li[data-checked=true]>div,.nk-block-host .ProseMirror li[data-checked=true]>div{text-decoration:line-through;color:var(--nk-text-tertiary)}.nk-prose blockquote,.nk-block-host .ProseMirror blockquote{border-left:3px solid var(--nk-text);padding:2px 0 2px 14px;margin:12px 0;color:var(--nk-text-secondary)}.nk-prose code,.nk-block-host .ProseMirror code{font-family:var(--nk-font-mono);font-size:85%;color:var(--nk-danger);background:color-mix(in srgb,var(--nk-danger) 8%,transparent);border-radius:4px;padding:1px 5px}.nk-prose pre,.nk-block-host .ProseMirror pre{background:var(--nk-bg-code);border:1px solid var(--nk-border);border-radius:var(--nk-radius);padding:16px 20px;margin:12px 0;font-family:var(--nk-font-mono);font-size:13px;line-height:1.6;color:var(--nk-text-secondary);overflow-x:auto}.nk-prose pre code,.nk-block-host .ProseMirror pre code{background:none;color:inherit;padding:0;font-size:inherit}.nk-prose hr,.nk-block-host .ProseMirror hr{border:none;border-top:1px solid var(--nk-border);margin:20px 0}.nk-prose a,.nk-block-host .ProseMirror a{color:var(--nk-accent);text-decoration:underline;text-underline-offset:2px}.nk-prose img{max-width:100%;height:auto}.nk-prose table{display:block;width:max-content;max-width:100%;overflow-x:auto;border-collapse:collapse;font-size:14px;margin:12px 0}.nk-prose :is(th,td){padding:6px 10px;border:1px solid var(--nk-border);text-align:left;vertical-align:top}.nk-prose th{font-weight:600}.nk-block-host .ProseMirror-gapcursor:after{border-top-color:var(--nk-text)}.nk-block-host .ProseMirror .ProseMirror-selectednode{background:color-mix(in srgb,var(--nk-accent) 8%,transparent)}.nk-block-host .ProseMirror-selectednode{box-shadow:0 0 0 2px color-mix(in srgb,var(--nk-accent) 35%,transparent);border-radius:3px}.nk-block-host .ProseMirror ::selection{background:color-mix(in srgb,var(--nk-accent) 25%,transparent)}.nk-block-host .ProseMirror p.is-editor-empty:first-child:before,.nk-block-host .ProseMirror .is-empty:before{content:attr(data-placeholder);color:var(--nk-text-tertiary);float:left;height:0;pointer-events:none}.nk-block-host .bn-container{font-family:var(--nk-font);color:var(--nk-text);background:transparent}.nk-block-host .bn-editor{padding:4px 2px}.nk-block-host .bn-block-content{font-size:14px;line-height:1.6}.nk-block-host .bn-side-menu{color:var(--nk-text-tertiary)}.nk-block-host .bn-drag-handle{border-radius:4px}.nk-block-host .bn-drag-handle:hover{background:var(--nk-bg-hover)}.nk-block-host .novel-editor{font-family:var(--nk-font);color:var(--nk-text)}.nk-block-host .novel-prose{max-width:none}.nk-slash-menu,.nk-block-host .bn-suggestion-menu,.nk-block-host .tippy-box{background:var(--nk-bg);border-radius:10px;box-shadow:var(--nk-shadow-menu);padding:6px;width:280px;max-height:320px;overflow-y:auto;font-family:var(--nk-font);font-size:14px;color:var(--nk-text)}.nk-slash-menu-label{font-size:12px;color:var(--nk-text-tertiary);padding:6px 9px 2px}.nk-slash-item{display:flex;align-items:center;gap:10px;padding:6px 9px;border-radius:5px;cursor:pointer;user-select:none}.nk-slash-item:hover,.nk-slash-item.selected{background:var(--nk-bg-hover)}.nk-slash-item .m-icon,.nk-slash-item ::slotted(.m-icon){width:28px;height:28px;flex-shrink:0;border-radius:4px;background:var(--nk-bg-callout);border:1px solid var(--nk-border);display:flex;align-items:center;justify-content:center;font-size:15px}.nk-slash-item .m-desc{font-size:12px;color:var(--nk-text-tertiary)}.nk-bubble-menu{display:flex;align-items:center;gap:2px;background:var(--nk-bg);border-radius:8px;box-shadow:var(--nk-shadow-menu);padding:4px}.nk-bubble-menu button{font-family:inherit;font-size:13px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 8px;border-radius:5px;cursor:pointer}.nk-bubble-menu ::slotted(button){font-family:inherit;font-size:13px;border:none;background:transparent;color:var(--nk-text-secondary);padding:4px 8px!important;border-radius:5px;cursor:pointer}.nk-bubble-menu button:hover,.nk-bubble-menu ::slotted(button:hover){background:var(--nk-bg-hover);color:var(--nk-text)}.nk-bubble-menu button.active,.nk-bubble-menu ::slotted(button.active){color:var(--nk-accent)}@media(max-width:860px){.nk-sidebar{display:none;position:fixed;inset:0 auto 0 0;z-index:60;transform:translate(-100%);transition:background .25s ease,transform .24s cubic-bezier(.2,.8,.25,1),display .24s allow-discrete}.nk-sidebar.open{display:flex;transform:none}@starting-style{.nk-sidebar.open{transform:translate(-100%)}}.nk-sidebar-backdrop{opacity:0;transition:opacity .24s ease,display .24s allow-discrete}.nk-sidebar-backdrop.open{display:block;opacity:1}@starting-style{.nk-sidebar-backdrop.open{opacity:0}}.nk-sidebar-toggle{display:inline-flex}.nk-sidebar.collapsed{margin-left:0;visibility:visible;transition:background .25s ease,transform .24s cubic-bezier(.2,.8,.25,1),display .24s allow-discrete}.nk-sidebar-collapse{display:none}.nk-tab-bar{display:flex}.nk-tab-bar.fixed+.nk-tab-bar-spacer{display:block}.nk-page{padding-left:max(24px,env(safe-area-inset-left,0px));padding-right:max(24px,env(safe-area-inset-right,0px));padding-bottom:80px}.nk-settings-nav{width:60px;min-width:60px}.nk-settings-nav .label,.nk-settings-nav .nk-section-label,.nk-settings-user .u-text{display:none}.nk-settings-content{padding:24px}.nk-cmdk-backdrop{padding-top:max(6vh,env(safe-area-inset-top,0px))}.nk-cmdk{width:min(560px,96vw)}.nk-stats{flex-wrap:wrap}.nk-breadcrumb{min-width:0}.nk-breadcrumb>.crumb:not(:last-child),.nk-breadcrumb ::slotted(.crumb:not(:last-child)),.nk-breadcrumb>.sep,.nk-breadcrumb ::slotted(.sep),.nk-topbar-meta,.nk-topbar-actions ::slotted(.nk-topbar-meta){display:none}.nk-breadcrumb>.crumb:last-child,.nk-breadcrumb ::slotted(.crumb:last-child){display:block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-topbar-actions{flex-shrink:0}.nk-field{flex-wrap:wrap;row-gap:6px}.nk-field .f-control,.nk-field ::slotted(.f-control){max-width:100%;min-width:0}.nk-input,.nk-select,.nk-textarea,.nk-slider{max-width:100%}.nk-prop{flex-direction:column;flex-wrap:nowrap;align-items:stretch}.nk-prop .p-name{flex:none;min-height:26px}.nk-prop .p-value{flex:none;min-height:30px;padding:3px 6px 7px}.nk-copy-field .cf-btn:has(>svg){display:inline-flex;align-items:center;justify-content:center;width:28px;padding:0}.nk-copy-field .cf-btn>svg{display:block}.nk-copy-field .cf-btn:has(>svg)>span{display:none}.nk-steps.horizontal .nk-step:not(.current)>:not(.st-mark){display:none}.nk-pop.sheet{position:fixed!important;inset:auto 0 0!important;width:auto!important;transform:none!important;z-index:106;--_nk-row: 40px;max-height:85dvh;overflow-y:auto;overscroll-behavior:contain;border-radius:14px 14px 0 0;padding:6px max(8px,env(safe-area-inset-right,0px)) max(12px,env(safe-area-inset-bottom,0px)) max(8px,env(safe-area-inset-left,0px));box-shadow:0 0 0 100vmax var(--nk-scrim-soft),var(--nk-shadow-menu)}.nk-pop.sheet:before{content:\\\"\\\";display:block;width:36px;height:4px;margin:4px auto 8px;border-radius:2px;background:var(--nk-border-strong)}.nk-pop.sheet.floating{translate:0 100%;transition:opacity .2s ease,translate .25s cubic-bezier(.2,.8,.2,1),visibility 0s linear .25s}.nk-pop.sheet.floating.open{translate:none;transition:opacity .2s ease,translate .25s cubic-bezier(.2,.8,.2,1),visibility 0s}.nk-pop.sheet,.nk-sheet{--_nk-cell: 44px}.nk-calendar-view .cv-day{min-height:64px;padding:2px 2px 4px}.nk-calendar-view .cv-item{padding:1px 4px;font-size:11px;line-height:16px}.nk-peek-backdrop{pointer-events:auto}.nk-peek-backdrop.open{background-color:var(--nk-scrim-soft)}@starting-style{.nk-peek-backdrop.open{background-color:transparent}}.nk-peek{--_nk-title: 28px;top:auto;left:0;width:auto;max-height:92dvh;border-radius:14px 14px 0 0;translate:0 100%}.nk-peek-backdrop.open .nk-peek{translate:none}@starting-style{.nk-peek-backdrop.open .nk-peek{translate:0 100%}}.nk-peek:before{content:\\\"\\\";flex:none;width:36px;height:4px;margin:10px auto 0;border-radius:2px;background:var(--nk-border-strong)}.nk-peek .pk-bar{height:40px;padding:0 max(8px,env(safe-area-inset-right,0px)) 0 max(8px,env(safe-area-inset-left,0px))}.nk-peek .pk-body{padding:0 max(20px,env(safe-area-inset-right,0px)) max(24px,env(safe-area-inset-bottom,0px)) max(20px,env(safe-area-inset-left,0px))}.nk-peek .pk-resize{display:none}.nk-banner{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:baseline}.nk-banner .b-action,.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){grid-column:1 / -1;justify-self:start;margin-left:0}.nk-banner ::slotted(.b-action),.nk-banner ::slotted([slot=\\\"action\\\"]){margin-left:0!important}.nk-app.peek-inset .nk-main{padding-right:0}.nk-dialog-backdrop{flex-direction:column;justify-content:flex-end;padding:max(24px,env(safe-area-inset-top,0px)) 0 0}.nk-dialog{width:100%;max-width:640px;border-radius:14px 14px 0 0;scale:none;translate:0 100%;padding:6px max(20px,env(safe-area-inset-right,0px)) max(16px,env(safe-area-inset-bottom,0px)) max(20px,env(safe-area-inset-left,0px));transition:translate .25s cubic-bezier(.2,.8,.2,1)}.nk-dialog.wide{width:100%}.nk-dialog-backdrop.open .nk-dialog{translate:none}@starting-style{.nk-dialog-backdrop.open .nk-dialog{translate:0 100%}}.nk-dialog:before{content:\\\"\\\";display:block;width:36px;height:4px;margin:4px auto 14px;border-radius:2px;background:var(--nk-border-strong)}.nk-dialog .dl-actions{flex-direction:column-reverse}:root:has(.nk-tab-bar:not([hidden])) .nk-toast{bottom:calc(var(--nk-tab-bar-height) + max(6px,env(safe-area-inset-bottom,0px)) + 6px)}:root:has(.nk-tab-bar.floating:not([hidden])) .nk-toast{bottom:calc(var(--nk-tab-bar-height) + 24px + env(safe-area-inset-bottom,0px))}}@media(prefers-reduced-motion:reduce){.nk-skeleton{animation:none;background:var(--nk-bg-callout)}[class*=nk-],[class*=nk-]:before,[class*=nk-]:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}\\n\";\n\nconst componentsCss = componentsHead + componentsTail;\nconst css = componentsHead + tokensCss + componentsTail;\n\nconst nkSheet = new CSSStyleSheet();\nnkSheet.replaceSync(css);\n\nconst tokensSheet = new CSSStyleSheet();\ntokensSheet.replaceSync(tokensCss);\n\nconst componentsSheet = new CSSStyleSheet();\ncomponentsSheet.replaceSync(componentsCss);\n\nexport { nkSheet, css, tokensSheet, tokensCss, componentsSheet, componentsCss };\n","// The texts the elements show and announce by themselves – button labels,\n// placeholders, accessible names – in English and German (NotionKit\n// Elements 1.17.0). The language is the element's own: the nearest `lang`\n// attribute, across shadow roots, else <html lang>; German for \"de…\",\n// English for anything else. setStrings() adds or replaces texts, for one\n// language or for all of them, and an attribute on the element wins over\n// every one of these.\nconst BUILT_IN = {\n en: {\n copy: 'Copy', copied: 'Copied', show: 'Show', hide: 'Hide',\n uploadImage: 'Upload image', changeImage: 'Change image', remove: 'Remove',\n close: 'Close', resize: 'Resize',\n today: 'Today', previousMonth: 'Previous month', nextMonth: 'Next month', clear: 'Clear', time: 'Time',\n filter: 'Filter', sort: 'Sort', addFilter: '+ Filter', removeFilter: 'Remove filter', search: 'Search …',\n closeSidebar: 'Close sidebar', newPage: '+ New page',\n commentPlaceholder: 'Comment …', send: 'Send', askPlaceholder: 'Ask something …',\n commandPlaceholder: 'Search or type a command …', emojiPlaceholder: 'Search…',\n toggleTheme: 'Toggle light / dark', synced: '⟳ synced',\n message: 'Message', breadcrumb: 'Breadcrumb', commandPalette: 'Command palette', comment: 'Comment',\n searchEmoji: 'Search emoji', settings: 'Settings', title: 'Title', changeIcon: 'Change icon',\n add: 'Add', more: 'More',\n },\n de: {\n copy: 'Kopieren', copied: 'Kopiert', show: 'Zeigen', hide: 'Verbergen',\n uploadImage: 'Bild hochladen', changeImage: 'Bild ändern', remove: 'Entfernen',\n close: 'Schließen', resize: 'Breite ändern',\n today: 'Heute', previousMonth: 'Voriger Monat', nextMonth: 'Nächster Monat', clear: 'Leeren', time: 'Uhrzeit',\n filter: 'Filter', sort: 'Sortieren', addFilter: '+ Filter', removeFilter: 'Filter entfernen', search: 'Suchen …',\n closeSidebar: 'Seitenleiste schließen', newPage: '+ Neue Seite',\n commentPlaceholder: 'Kommentieren …', send: 'Senden', askPlaceholder: 'Frag etwas …',\n commandPlaceholder: 'Suchen oder Befehl eingeben …', emojiPlaceholder: 'Suchen …',\n toggleTheme: 'Hell / Dunkel', synced: '⟳ synchronisiert',\n message: 'Nachricht', breadcrumb: 'Pfad', commandPalette: 'Befehlspalette', comment: 'Kommentar',\n searchEmoji: 'Emoji suchen', settings: 'Einstellungen', title: 'Titel', changeIcon: 'Symbol ändern',\n add: 'Hinzufügen', more: 'Mehr',\n },\n};\nconst custom = {};\nconst listeners = new Set();\n\n/**\n * Adds or replaces texts: setStrings({ copy: 'Copy link' }) for every\n * language, setStrings({ copy: 'Copier' }, 'fr') for one – a language of its\n * own too. The elements on the page take them at once.\n */\nexport function setStrings(strings, lang = '*') {\n const key = String(lang).toLowerCase().split('-')[0];\n custom[key] = { ...custom[key], ...strings };\n for (const fn of listeners) fn();\n}\n\n/** The keys and texts built in for a language ('en' or 'de'), for an app that fills in its own. */\nexport function builtInStrings(lang = 'en') {\n return { ...(BUILT_IN[String(lang).toLowerCase().split('-')[0]] || BUILT_IN.en) };\n}\n\n/** Called after every setStrings(); base.js hands the change on to the elements. */\nexport function onStringsChange(fn) { listeners.add(fn); }\n\n/** The language of `el`: its nearest lang attribute, across shadow roots, else the page's; the primary subtag. */\nexport function langOf(el) {\n for (let node = el; node; node = node.getRootNode?.().host) {\n const hit = node.closest?.('[lang]');\n if (hit) return hit.getAttribute('lang').toLowerCase().split('-')[0];\n }\n return (document.documentElement.lang || 'en').toLowerCase().split('-')[0];\n}\n\n/** The text `key` for `el`: its language's own set by setStrings(), then the one for every language, the built-in one, English. */\nexport function str(key, el) {\n const lang = langOf(el);\n return custom[lang]?.[key] ?? custom['*']?.[key] ?? BUILT_IN[lang]?.[key] ?? BUILT_IN.en[key] ?? key;\n}\n","// ============================================================\n// NotionKit Elements – base classes\n//\n// Every <nk-*> element is a thin shell around the markup notionkit.css already\n// styles. The shadow root adopts the *components* half of that stylesheet and\n// nothing else; the element ships no visual CSS of its own.\n// ============================================================\nimport { componentsSheet, tokensCss } from '@jungherz-de/notionkit/notionkit-styles.js';\nimport { onStringsChange, str as textFor } from './util/strings.js';\n\n// ── Design tokens ──\n// The shadow roots deliberately adopt componentsSheet only. The full sheet\n// would bring the :root / [data-theme] token blocks along, and those match the\n// .nk-wrapper below — every --nk-* token would then be re-declared inside each\n// shadow root, where a matching rule always beats an inherited value. A page's\n// own `:root { --nk-accent: … }` would never arrive.\n//\n// So the token defaults go on the document once, and every shadow root\n// inherits them like any other custom property. They sit in a cascade layer so\n// an ordinary (unlayered) brand stylesheet — and notionkit.css itself, if the\n// page loads it — wins over them, no matter the load order.\n\nconst TOKENS_INJECTED = '__nkDefaultTokensInjected';\n\nfunction injectDefaultTokens() {\n if (typeof document === 'undefined') return; // SSR / non-DOM\n if (globalThis[TOKENS_INJECTED]) return; // another bundle copy did it\n globalThis[TOKENS_INJECTED] = true;\n\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(`@layer notionkit-defaults { ${tokensCss} }`);\n // Append — never assign — so an app's own adopted sheets survive.\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n}\n\ninjectDefaultTokens();\n\n// ── Global theme sync ──\n// data-theme on <html> is the only source of truth. One MutationObserver\n// mirrors it onto every registered instance; no element sets a theme itself.\n\nconst instances = new Set();\n\nfunction getCurrentTheme() {\n return document.documentElement.getAttribute('data-theme') || 'light';\n}\n\nfunction syncAllThemes() {\n const theme = getCurrentTheme();\n for (const instance of instances) instance._syncTheme(theme);\n}\n\n// The built-in texts follow the language (1.17.0): setStrings() and a new\n// lang on <html> reach the elements already on the page, too.\nfunction syncAllStrings() {\n for (const instance of instances) instance.onStringsChanged();\n}\nonStringsChange(syncAllStrings);\n\nif (typeof window !== 'undefined' && typeof MutationObserver !== 'undefined') {\n new MutationObserver(records => {\n if (records.some(r => r.attributeName === 'data-theme')) syncAllThemes();\n if (records.some(r => r.attributeName === 'lang')) syncAllStrings();\n }).observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'lang']\n });\n}\n\n// ── Host stylesheets ──\n// Layout plumbing only: how the host box participates in the outer layout, and\n// that `hidden` keeps working. :host([hidden]) has a higher specificity than\n// :host, so it wins regardless of order. The wrapper is layout-transparent.\n// `flush` on any element drops the outer margin of its box (NotionKit\n// 1.16.0) – for a block in a flex column with a gap of its own; a whole\n// column does it for every block with --nk-block-space: 0.\n\nconst hostSheets = new Map();\n\nfunction hostSheetFor(display) {\n let sheet = hostSheets.get(display);\n if (!sheet) {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(`\n :host { display: ${display}; }\n :host([hidden]) { display: none; }\n :host([flush]) .nk-wrapper > * { margin-top: 0; margin-bottom: 0; }\n .nk-wrapper { display: contents; }\n `);\n hostSheets.set(display, sheet);\n }\n return sheet;\n}\n\n// ── Base class ──\n\nexport class NkElement extends HTMLElement {\n\n /**\n * How the host takes part in the outer layout. Default 'contents': the host\n * generates no box, so the inner .nk-* element sits in the parent's layout\n * exactly where the class markup would – a button stays inline, a sidebar\n * is a direct flex child of the app, a tree row and its children box are\n * siblings. That is what makes the pixel parity with the class markup hold.\n * Consequence: style the parent or the tokens, not the host; `hidden` on\n * the host still works. Override with 'block' / 'inline-block' only when a\n * host box is genuinely needed.\n */\n static get display() { return 'contents'; }\n\n /**\n * Optional CSSStyleSheet with component-specific host rules, adopted after\n * the shared sheets. Positioning and sizing of the host only — never colour,\n * spacing or typography; those belong to notionkit.css.\n */\n static get hostStyles() { return null; }\n\n /**\n * Opt in when the component *copies* light-DOM children into its shadow tree\n * (options, breadcrumb crumbs). A MutationObserver then calls\n * projectLightDom() again whenever those children change, so a framework\n * that swaps them keeps the rendered element in step. Components that merely\n * *slot* their children use `slotchange` instead.\n */\n static get observesLightDom() { return false; }\n\n /** What the light-DOM observer watches. Drop `subtree` for shallow copies. */\n static get lightDomObserverInit() {\n return { childList: true, subtree: true, characterData: true, attributes: true };\n }\n\n /**\n * 'named' (default) or 'manual'. Manual assignment lets a component route\n * light-DOM nodes itself – text nodes into a label slot, nested elements\n * into a children slot – so <nk-tree-item icon=\"🏠\">Home</nk-tree-item>\n * reads naturally. With 'manual' the component calls assignSlots() on\n * every childList change.\n */\n static get slotAssignment() { return 'named'; }\n\n static get observedAttributes() { return []; }\n\n constructor() {\n super();\n this._initialized = false;\n this._shadow = this.attachShadow({ mode: 'open', slotAssignment: this.constructor.slotAssignment });\n const sheets = [componentsSheet, hostSheetFor(this.constructor.display)];\n const extra = this.constructor.hostStyles;\n if (extra) sheets.push(extra);\n this._shadow.adoptedStyleSheets = sheets;\n }\n\n connectedCallback() {\n if (!this._initialized) {\n // A framework may have set properties on the instance before the\n // definition arrived (hybrids binds checked=\"${bool}\" as a property\n // while the element is still a plain HTMLElement). Such an own property\n // shadows the accessor on the prototype for good; re-apply it through\n // the setter so the attribute – and with it render() – sees the value.\n this._upgradeOwnProperties();\n this._initialized = true;\n\n // The wrapper mirrors data-theme from <html> so [data-theme]-keyed\n // component rules apply inside the root. Token *values* need no\n // mirroring — they inherit.\n this._wrapper = document.createElement('div');\n this._wrapper.className = 'nk-wrapper';\n this._wrapper.setAttribute('data-theme', getCurrentTheme());\n this._shadow.appendChild(this._wrapper);\n\n this.render();\n } else {\n this._wrapper.setAttribute('data-theme', getCurrentTheme());\n }\n\n // Everything below runs on every connect, not just the first. Moving an\n // element in the DOM disconnects and reconnects it, and disconnectedCallback\n // tears all of this down — without re-arming it here a moved element would\n // keep its markup but silently stop reacting.\n this.setupEvents();\n instances.add(this);\n\n if (this.constructor.observesLightDom) {\n this._lightDomObserver ??= new MutationObserver(records => this.projectLightDom(records));\n this._lightDomObserver.observe(this, this.constructor.lightDomObserverInit);\n }\n if (this.constructor.slotAssignment === 'manual') {\n this.assignSlots();\n this._slotObserver ??= new MutationObserver(() => this.assignSlots());\n this._slotObserver.observe(this, { childList: true });\n }\n }\n\n disconnectedCallback() {\n instances.delete(this);\n this._lightDomObserver?.disconnect();\n this._slotObserver?.disconnect();\n this.teardownEvents();\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (!this._initialized) return;\n if (oldValue === newValue) return;\n this.onAttributeChanged(name, oldValue, newValue);\n }\n\n _syncTheme(theme) {\n this._wrapper?.setAttribute('data-theme', theme);\n }\n\n /**\n * The text `key` in this element's language – its nearest lang attribute,\n * across shadow roots, else the page's: the one setStrings() gave, else the\n * built-in English or German one (1.17.0). A project's own element reads\n * its texts here too, after setStrings({ myKey: '…' }).\n */\n str(key) { return textFor(key, this); }\n\n /**\n * The texts may have changed: setStrings() ran or <html lang> changed.\n * Components with built-in texts apply them again here; an attribute on\n * the element still wins.\n */\n onStringsChanged() {}\n\n _upgradeOwnProperties() {\n for (const key of Object.keys(this)) {\n if (key.startsWith('_')) continue;\n let proto = Object.getPrototypeOf(this), desc;\n while (proto && proto !== HTMLElement.prototype && !(desc = Object.getOwnPropertyDescriptor(proto, key))) proto = Object.getPrototypeOf(proto);\n if (!desc?.set) continue;\n const value = this[key];\n delete this[key];\n this[key] = value;\n }\n }\n\n /** Subclasses override to build the inner DOM inside this._wrapper. Runs once. */\n render() {}\n\n /** Subclasses override to attach event listeners. Runs on every connect. */\n setupEvents() {}\n\n /** Subclasses override to remove event listeners. Runs on every disconnect. */\n teardownEvents() {}\n\n /** Subclasses override to react to attribute changes after render(). */\n onAttributeChanged(name, oldValue, newValue) {}\n\n /**\n * Subclasses that set observesLightDom override this to (re-)copy their\n * light-DOM children into the shadow tree. Runs on every change to those\n * children, so it has to be safe to call repeatedly.\n */\n projectLightDom() {}\n\n /** Components with manual slot assignment override this. */\n assignSlots() {}\n\n /**\n * Escape hatch: re-copy the light-DOM children now. The observer covers the\n * ordinary cases; this is for the ones it cannot see, so nobody has to reach\n * into element.shadowRoot.\n */\n refresh() { this.projectLightDom(); if (this.constructor.slotAssignment === 'manual') this.assignSlots(); }\n\n // ── Utilities ──\n\n /**\n * For elements whose heading arrives as `title` – nk-settings-pane,\n * nk-danger-zone, nk-empty, nk-model-card. `title` is also the global HTML\n * attribute, and a title on the host shows as a browser tooltip over the\n * whole element. So the value is read into this._titleText and the\n * attribute is taken off the host; a later setAttribute('title') arrives\n * through attributeChangedCallback and is taken the same way. The removal\n * fires the callback with null, which is ignored – only '' clears the\n * heading. The element's own `title` accessor answers from the stored\n * value, so a framework that binds `title` as a property never puts an\n * attribute on the host at all. Returns whether a value was taken.\n */\n takeTitle(value = this.getAttribute('title')) {\n if (value === null) return false;\n this._titleText = value;\n this.removeAttribute('title');\n return true;\n }\n\n getBoolAttr(name) {\n return this.hasAttribute(name);\n }\n\n setBoolAttr(name, value) {\n if (value) this.setAttribute(name, '');\n else this.removeAttribute(name);\n }\n\n createElement(tag, classes = [], attrs = {}) {\n const el = document.createElement(tag);\n if (classes.length) el.classList.add(...classes);\n for (const [key, val] of Object.entries(attrs)) {\n if (val !== null && val !== undefined && val !== false) el.setAttribute(key, val === true ? '' : val);\n }\n return el;\n }\n\n /** Dispatches a composed, bubbling CustomEvent — the nk-* event contract. */\n emit(eventName, detail = null) {\n return this.dispatchEvent(new CustomEvent(eventName, {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail\n }));\n }\n}\n\n// ── Form-associated base class ──\n// ElementInternals gives the element a place in the surrounding <form>:\n// FormData, reset, validation and :disabled through <fieldset>.\n\nexport class NkFormElement extends NkElement {\n\n static formAssociated = true;\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n }\n\n get form() { return this._internals.form; }\n get validationMessage() { return this._internals.validationMessage; }\n get validity() { return this._internals.validity; }\n get willValidate() { return this._internals.willValidate; }\n\n checkValidity() { return this._internals.checkValidity(); }\n reportValidity() { return this._internals.reportValidity(); }\n\n connectedCallback() {\n const first = !this._initialized;\n super.connectedCallback();\n // A `disabled` attribute in the markup fires formDisabledCallback on\n // parse or upgrade – before the first connect, when nothing is rendered\n // yet. The state was remembered below; apply it now that render() ran.\n if (first && this._formDisabled) this.onFormDisabled(true);\n }\n\n formResetCallback() { this.resetValue(); }\n formStateRestoreCallback(state, mode) { this.restoreValue(state, mode); }\n formDisabledCallback(disabled) {\n this._formDisabled = disabled;\n if (this._initialized) this.onFormDisabled(disabled);\n }\n\n /** Subclasses override. */\n resetValue() {}\n restoreValue(state, mode) {}\n onFormDisabled(disabled) {}\n\n setFormValue(value, state) {\n this._internals.setFormValue(value, state);\n }\n\n setValidity(flags, message, anchor) {\n this._internals.setValidity(flags, message, anchor);\n }\n\n /** Mirrors the native control's validity onto the host, so required works. */\n syncValidityFrom(control) {\n if (!control) return;\n if (control.validity.valid) this._internals.setValidity({});\n else this._internals.setValidity(control.validity, control.validationMessage, control);\n }\n}\n\nexport { getCurrentTheme };\n\n// For projects that import single elements (components/nk-*.js): the one\n// dictionary every element reads its built-in texts from.\nexport { setStrings, builtInStrings } from './util/strings.js';\n","import { NkElement } from '../../base.js';\n\n// <nk-btn variant=\"primary\" small>Save</nk-btn> → <button class=\"nk-btn primary small\">\n// <nk-btn href=\"/docs\" variant=\"secondary\">Docs</nk-btn> → <a class=\"nk-btn secondary\">\n// <nk-btn variant=\"topbar\">⭐</nk-btn> → <button class=\"nk-topbar-btn\">\n// <nk-btn variant=\"tool\" active>Filter</nk-btn> → <button class=\"nk-db-tool active\"> (slot=\"tools\" of nk-database)\n// <nk-btn variant=\"sidebar\" aria-label=\"Menu\">☰</nk-btn> → <button class=\"nk-topbar-btn nk-sidebar-toggle\">:\n// on a phone it opens the page's <nk-sidebar> as a drawer; on the desktop\n// it shows while that sidebar is collapsed (.collapsed) and expands it.\n//\n// Modifier classes become attributes. A slotted <svg> is sized by the\n// `.nk-btn ::slotted(svg)` twin; pass the icon itself, never wrapped.\nconst VARIANTS = ['primary', 'secondary', 'danger', 'danger-solid', 'topbar', 'share'];\n\nclass NkBtn extends NkElement {\n static get observedAttributes() { return ['variant', 'small', 'disabled', 'type', 'href', 'title', 'aria-label', 'aria-haspopup', 'active']; }\n\n render() {\n this._build();\n }\n\n _build() {\n const href = this.getAttribute('href');\n const el = href ? this.createElement('a', [], { href }) : this.createElement('button', [], { type: this.getAttribute('type') || 'button' });\n el.className = this._computeClasses().join(' ');\n el.appendChild(document.createElement('slot'));\n this._applyState(el);\n if (this._btn) {\n this._btn.removeEventListener('click', this._onClick);\n this._btn.replaceWith(el);\n } else {\n this._wrapper.appendChild(el);\n }\n this._btn = el;\n if (this._onClick) el.addEventListener('click', this._onClick);\n }\n\n _applyState(el) {\n const disabled = this.getBoolAttr('disabled');\n if (el.tagName === 'BUTTON') el.disabled = disabled;\n else el.setAttribute('aria-disabled', disabled ? 'true' : 'false');\n const title = this.getAttribute('title');\n title ? el.setAttribute('title', title) : el.removeAttribute('title');\n // The accessible name and the popup hint belong on the button itself.\n for (const name of ['aria-label', 'aria-haspopup']) {\n const v = this.getAttribute(name);\n v ? el.setAttribute(name, v) : el.removeAttribute(name);\n }\n if (this.getAttribute('variant') === 'sidebar') el.setAttribute('aria-expanded', this._sidebar()?.open ? 'true' : 'false');\n else el.removeAttribute('aria-expanded');\n }\n\n /** The sidebar the ☰ opens: the one in its own app, else the page's. */\n _sidebar() { return this.closest('nk-app')?.querySelector('nk-sidebar') ?? document.querySelector('nk-sidebar'); }\n _sidebarCollapsed() { return this.getAttribute('variant') === 'sidebar' && !!this._sidebar()?.hasAttribute('collapsed'); }\n\n setupEvents() {\n this._onClick = (e) => {\n if (this.getBoolAttr('disabled')) { e.preventDefault(); e.stopPropagation(); return; }\n if (this.getAttribute('variant') === 'sidebar') {\n const sidebar = this._sidebar();\n if (sidebar?.hasAttribute('collapsed') && !matchMedia('(max-width: 860px)').matches) sidebar.expand?.();\n else sidebar?.toggle?.();\n return;\n }\n // A button inside a shadow root is not a submit button of the outer\n // form; forward the intent to the form the host sits in.\n const type = this.getAttribute('type');\n if (type === 'submit' || type === 'reset') {\n const form = this.closest('form');\n if (form) type === 'submit' ? form.requestSubmit() : form.reset();\n }\n };\n // The ☰ says whether its drawer is open, however the drawer closed.\n this._onToggle = (e) => {\n if (this.getAttribute('variant') === 'sidebar' && e.target === this._sidebar()) this._btn.setAttribute('aria-expanded', e.detail.open ? 'true' : 'false');\n };\n // On the desktop the ☰ shows while its sidebar is collapsed.\n this._onCollapse = (e) => {\n if (this.getAttribute('variant') === 'sidebar' && e.target === this._sidebar()) this._btn.classList.toggle('collapsed', e.detail.collapsed);\n };\n this._btn.addEventListener('click', this._onClick);\n document.addEventListener('nk-toggle', this._onToggle);\n document.addEventListener('nk-collapse', this._onCollapse);\n if (this.getAttribute('variant') === 'sidebar') this._btn.className = this._computeClasses().join(' ');\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n document.removeEventListener('nk-toggle', this._onToggle);\n document.removeEventListener('nk-collapse', this._onCollapse);\n }\n\n onAttributeChanged(name) {\n if (!this._btn) return;\n switch (name) {\n case 'href':\n this._build();\n break;\n case 'variant':\n this._btn.className = this._computeClasses().join(' ');\n this._applyState(this._btn);\n break;\n case 'small':\n case 'active':\n this._btn.className = this._computeClasses().join(' ');\n break;\n case 'type':\n if (this._btn.tagName === 'BUTTON') this._btn.setAttribute('type', this.getAttribute('type') || 'button');\n break;\n default:\n this._applyState(this._btn);\n }\n }\n\n _computeClasses() {\n const variant = this.getAttribute('variant');\n if (variant === 'topbar') return ['nk-topbar-btn'];\n if (variant === 'share') return ['nk-topbar-btn', 'nk-share-btn'];\n if (variant === 'sidebar') return this._sidebarCollapsed() ? ['nk-topbar-btn', 'nk-sidebar-toggle', 'collapsed'] : ['nk-topbar-btn', 'nk-sidebar-toggle'];\n if (variant === 'tool') return this.getBoolAttr('active') ? ['nk-db-tool', 'active'] : ['nk-db-tool'];\n const classes = ['nk-btn'];\n if (VARIANTS.includes(variant)) classes.push(variant);\n if (this.getBoolAttr('small')) classes.push('small');\n return classes;\n }\n\n focus(options) { this._btn?.focus(options); }\n click() { this._btn?.click(); }\n\n get variant() { return this.getAttribute('variant'); }\n set variant(v) { v ? this.setAttribute('variant', v) : this.removeAttribute('variant'); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n get small() { return this.getBoolAttr('small'); }\n set small(v) { this.setBoolAttr('small', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get type() { return this.getAttribute('type') || 'button'; }\n set type(v) { this.setAttribute('type', v); }\n get href() { return this.getAttribute('href'); }\n set href(v) { v ? this.setAttribute('href', v) : this.removeAttribute('href'); }\n}\n\ncustomElements.define('nk-btn', NkBtn);\nexport { NkBtn };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-input name=\"title\" value=\"…\" placeholder=\"…\" wide></nk-input> → <input class=\"nk-input wide\">\n// Takes part in the surrounding <form> through ElementInternals.\nconst FORWARDED = ['type', 'placeholder', 'name', 'min', 'max', 'step', 'autocomplete', 'pattern', 'maxlength', 'minlength', 'inputmode', 'list', 'aria-label'];\nconst BOOLEANS = ['required', 'disabled', 'readonly'];\n\nclass NkInput extends NkFormElement {\n static get observedAttributes() { return ['value', 'wide', ...FORWARDED, ...BOOLEANS]; }\n\n render() {\n this._input = this.createElement('input', ['nk-input']);\n for (const attr of FORWARDED) this._forward(attr);\n for (const attr of BOOLEANS) this._forward(attr);\n this._input.value = this.getAttribute('value') ?? '';\n this._defaultValue = this._input.value;\n this._syncWide();\n this._wrapper.appendChild(this._input);\n this._syncFormValue();\n }\n\n _forward(attr) {\n if (BOOLEANS.includes(attr)) {\n this._input[attr === 'readonly' ? 'readOnly' : attr] = this.getBoolAttr(attr) || (attr === 'disabled' && !!this._formDisabled);\n return;\n }\n const v = this.getAttribute(attr);\n if (v === null) this._input.removeAttribute(attr);\n else this._input.setAttribute(attr, v);\n }\n\n _syncWide() {\n this._input.classList.toggle('wide', this.getBoolAttr('wide'));\n }\n\n setupEvents() {\n this._onInput = () => {\n this._syncFormValue();\n this.emit('nk-input', { value: this._input.value, name: this.name });\n };\n this._onChange = () => {\n this._syncFormValue();\n this.emit('nk-change', { value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._input) return;\n if (name === 'value') { this._input.value = this.getAttribute('value') ?? ''; this._syncFormValue(); return; }\n if (name === 'wide') { this._syncWide(); return; }\n this._forward(name);\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.value);\n this.syncValidityFrom(this._input);\n }\n\n resetValue() {\n this._input.value = this.getAttribute('value') ?? '';\n this._syncFormValue();\n }\n\n restoreValue(state) {\n if (typeof state === 'string') { this._input.value = state; this._syncFormValue(); }\n }\n\n onFormDisabled(disabled) {\n this._input.disabled = disabled || this.getBoolAttr('disabled');\n }\n\n focus(options) { this._input?.focus(options); }\n blur() { this._input?.blur(); }\n select() { this._input?.select(); }\n\n get value() { return this._input?.value ?? (this.getAttribute('value') ?? ''); }\n set value(v) {\n if (this._input) { this._input.value = v ?? ''; this._syncFormValue(); }\n else this.setAttribute('value', v ?? '');\n }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get type() { return this.getAttribute('type') || 'text'; }\n set type(v) { this.setAttribute('type', v); }\n get placeholder() { return this.getAttribute('placeholder'); }\n set placeholder(v) { this.setAttribute('placeholder', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get required() { return this.getBoolAttr('required'); }\n set required(v) { this.setBoolAttr('required', v); }\n get readonly() { return this.getBoolAttr('readonly'); }\n set readonly(v) { this.setBoolAttr('readonly', v); }\n get wide() { return this.getBoolAttr('wide'); }\n set wide(v) { this.setBoolAttr('wide', v); }\n}\n\ncustomElements.define('nk-input', NkInput);\nexport { NkInput };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-textarea name=\"bio\" rows=\"3\" wide>Text</nk-textarea> → <textarea class=\"nk-textarea wide\">\n// The initial value is the `value` attribute, or the element's text content.\nconst FORWARDED = ['placeholder', 'name', 'rows', 'maxlength', 'minlength', 'autocomplete', 'aria-label'];\nconst BOOLEANS = ['required', 'disabled', 'readonly'];\n\nclass NkTextarea extends NkFormElement {\n static get observedAttributes() { return ['value', 'wide', ...FORWARDED, ...BOOLEANS]; }\n\n render() {\n this._input = this.createElement('textarea', ['nk-textarea']);\n for (const attr of [...FORWARDED, ...BOOLEANS]) this._forward(attr);\n this._input.value = this.getAttribute('value') ?? this.textContent.trim();\n this._syncWide();\n this._wrapper.appendChild(this._input);\n this._syncFormValue();\n }\n\n _forward(attr) {\n if (BOOLEANS.includes(attr)) {\n this._input[attr === 'readonly' ? 'readOnly' : attr] = this.getBoolAttr(attr) || (attr === 'disabled' && !!this._formDisabled);\n return;\n }\n const v = this.getAttribute(attr);\n if (v === null) this._input.removeAttribute(attr);\n else this._input.setAttribute(attr, v);\n }\n\n _syncWide() { this._input.classList.toggle('wide', this.getBoolAttr('wide')); }\n\n setupEvents() {\n this._onInput = () => {\n this._syncFormValue();\n this.emit('nk-input', { value: this._input.value, name: this.name });\n };\n this._onChange = () => {\n this._syncFormValue();\n this.emit('nk-change', { value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._input) return;\n if (name === 'value') { this._input.value = this.getAttribute('value') ?? ''; this._syncFormValue(); return; }\n if (name === 'wide') { this._syncWide(); return; }\n this._forward(name);\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.value);\n this.syncValidityFrom(this._input);\n }\n\n resetValue() {\n this._input.value = this.getAttribute('value') ?? this.textContent.trim();\n this._syncFormValue();\n }\n\n restoreValue(state) {\n if (typeof state === 'string') { this._input.value = state; this._syncFormValue(); }\n }\n\n onFormDisabled(disabled) { this._input.disabled = disabled || this.getBoolAttr('disabled'); }\n\n focus(options) { this._input?.focus(options); }\n blur() { this._input?.blur(); }\n\n get value() { return this._input?.value ?? (this.getAttribute('value') ?? ''); }\n set value(v) {\n if (this._input) { this._input.value = v ?? ''; this._syncFormValue(); }\n else this.setAttribute('value', v ?? '');\n }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get required() { return this.getBoolAttr('required'); }\n set required(v) { this.setBoolAttr('required', v); }\n get wide() { return this.getBoolAttr('wide'); }\n set wide(v) { this.setBoolAttr('wide', v); }\n}\n\ncustomElements.define('nk-textarea', NkTextarea);\nexport { NkTextarea };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-select name=\"role\" value=\"editor\">\n// <option value=\"viewer\">Viewer</option>\n// <option value=\"editor\">Editor</option>\n// </nk-select>\n//\n// The light-DOM <option>s are copied into the shadow <select>. A\n// MutationObserver keeps the copy in step when a framework swaps them; the\n// empty string is a valid value; the live selection survives a rebuild. A\n// value – attribute or property – whose option is not there yet waits and\n// wins over the browser's preselection once the option arrives, unless\n// someone has chosen another option in the meantime; settling on it fires\n// no nk-change.\nclass NkSelect extends NkFormElement {\n static get observedAttributes() { return ['value', 'name', 'disabled', 'required', 'compact', 'wide', 'aria-label']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._select = this.createElement('select', ['nk-select']);\n this._forwardAll();\n this._wrapper.appendChild(this._select);\n this._defaultValue = this.getAttribute('value');\n this._pending = this._defaultValue;\n // Children may not be parsed yet when connectedCallback runs.\n this.projectLightDom();\n requestAnimationFrame(() => this.projectLightDom());\n }\n\n _forwardAll() {\n const name = this.getAttribute('name');\n name ? this._select.setAttribute('name', name) : this._select.removeAttribute('name');\n const label = this.getAttribute('aria-label');\n label ? this._select.setAttribute('aria-label', label) : this._select.removeAttribute('aria-label');\n this._select.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._select.required = this.getBoolAttr('required');\n this._select.classList.toggle('compact', this.getBoolAttr('compact'));\n this._select.classList.toggle('wide', this.getBoolAttr('wide'));\n }\n\n projectLightDom() {\n if (!this._select) return;\n // The options are pure data — the clones carry no listeners — so skipping\n // an unchanged rebuild is safe, and it keeps an open dropdown from\n // snapping shut on light-DOM churn elsewhere.\n const nodes = [...this.children].filter(n => n.matches('option, optgroup'));\n const signature = nodes.map(n => n.outerHTML).join('');\n if (signature === this._optionSignature) return;\n this._optionSignature = signature;\n\n // innerHTML = '' drops the selection; remember it first. selectedIndex -1\n // means \"nothing selected\", which is not an option whose value is \"\".\n const previous = this._select.selectedIndex >= 0 ? this._select.value : null;\n\n this._select.innerHTML = '';\n for (const node of nodes) this._select.appendChild(node.cloneNode(true));\n\n // A value that waits for its option first – it keeps waiting while the\n // option is missing; else the live selection when it survived; else the\n // browser default (first option / `selected`).\n if (this._pending != null) { if (this._applyValue(this._pending)) this._pending = null; }\n else this._applyValue(previous);\n this._syncFormValue();\n }\n\n /** Selects `value` if an option carries it, and reports whether it did. */\n _applyValue(value) {\n if (value === null) return false;\n if (![...this._select.options].some(o => o.value === value)) return false;\n this._select.value = value;\n return true;\n }\n\n setupEvents() {\n this._onChange = () => {\n this._pending = null;\n this._syncFormValue();\n this.emit('nk-change', { value: this._select.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._select.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._select?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._select) return;\n if (name === 'value') {\n const value = this.getAttribute('value');\n this._pending = value === null || this._applyValue(value) ? null : value;\n this._syncFormValue();\n return;\n }\n this._forwardAll();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._select.value);\n this.syncValidityFrom(this._select);\n }\n\n resetValue() {\n this._pending = null;\n if (!this._applyValue(this._defaultValue)) this._select.selectedIndex = 0;\n this._syncFormValue();\n }\n\n restoreValue(state) {\n if (typeof state === 'string') { this._applyValue(state); this._syncFormValue(); }\n }\n\n onFormDisabled(disabled) { this._select.disabled = disabled || this.getBoolAttr('disabled'); }\n\n focus(options) { this._select?.focus(options); }\n\n get value() { return this._pending ?? this._select?.value ?? ''; }\n set value(v) {\n const value = v == null ? '' : String(v);\n if (!this._select) { this.setAttribute('value', value); return; }\n // No option carries it yet: keep it until one does.\n this._pending = this._applyValue(value) ? null : value;\n this._syncFormValue();\n }\n get selectedIndex() { return this._select?.selectedIndex ?? -1; }\n get options() { return this._select?.options ?? []; }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get required() { return this.getBoolAttr('required'); }\n set required(v) { this.setBoolAttr('required', v); }\n get compact() { return this.getBoolAttr('compact'); }\n set compact(v) { this.setBoolAttr('compact', v); }\n get wide() { return this.getBoolAttr('wide'); }\n set wide(v) { this.setBoolAttr('wide', v); }\n}\n\ncustomElements.define('nk-select', NkSelect);\nexport { NkSelect };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-switch name=\"notify\" checked></nk-switch>\n// → <button class=\"nk-switch\" role=\"switch\" aria-checked=\"true\">\n// notionkit.css styles the state through [aria-checked]; the toggling is here.\n//\n// <nk-switch checked>Waiting</nk-switch> (or text=\"Waiting\")\n// → <label class=\"nk-switch-label\"><button class=\"nk-switch\" …></button><span>Waiting</span></label>\n// Visible text beside the switch, for several switches in one row where no\n// nk-field row names them. Without text the label wrapper is layout-\n// transparent (display: contents), so the bare button stays the bare button.\nclass NkSwitch extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value', 'label', 'text']; }\n\n render() {\n this._row = this.createElement('label', ['nk-switch-label']);\n this._btn = this.createElement('button', ['nk-switch'], { type: 'button', role: 'switch' });\n this._text = document.createElement('span');\n this._slot = document.createElement('slot');\n this._textNode = document.createTextNode('');\n this._slot.appendChild(this._textNode);\n this._text.appendChild(this._slot);\n this._row.append(this._btn, this._text);\n this._defaultChecked = this.getBoolAttr('checked');\n this._apply();\n this._syncText();\n this._wrapper.appendChild(this._row);\n this._syncFormValue();\n }\n\n _apply() {\n this._btn.setAttribute('aria-checked', this.getBoolAttr('checked') ? 'true' : 'false');\n this._btn.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n const label = this.getAttribute('label');\n label ? this._btn.setAttribute('aria-label', label) : this._btn.removeAttribute('aria-label');\n }\n\n _syncText() {\n // Only on a change: WebKit fires slotchange for a write to the slot's\n // fallback text, even the same text, and this runs on slotchange – an\n // endless loop that froze Safari with an empty <nk-switch>.\n const text = this.getAttribute('text') ?? '';\n if (this._textNode.data !== text) this._textNode.data = text;\n const hasText = !!(this.getAttribute('text') || this._slot.assignedNodes().some(n => n.nodeType === Node.ELEMENT_NODE || n.data.trim()));\n this._text.hidden = !hasText;\n this._row.style.display = hasText ? '' : 'contents';\n }\n\n setupEvents() {\n this._onClick = () => this.toggle();\n this._onSlot = () => this._syncText();\n this._btn.addEventListener('click', this._onClick);\n this._slot.addEventListener('slotchange', this._onSlot);\n this._syncText();\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n toggle() {\n if (this.getBoolAttr('disabled') || this._formDisabled) return;\n this.checked = !this.checked;\n this.emit('nk-change', { checked: this.checked, value: this.getAttribute('value') || 'on', name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n onAttributeChanged(name) {\n if (!this._btn) return;\n if (name === 'text') { this._syncText(); return; }\n this._apply();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n const val = this.getAttribute('value') || 'on';\n this.setFormValue(this.getBoolAttr('checked') ? val : null, this.getBoolAttr('checked') ? 'checked' : 'unchecked');\n }\n\n resetValue() { this.setBoolAttr('checked', this._defaultChecked); }\n restoreValue(state) { if (state === 'checked' || state === 'unchecked') this.setBoolAttr('checked', state === 'checked'); }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n focus(options) { this._btn?.focus(options); }\n\n get checked() { return this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n get text() { return this.getAttribute('text'); }\n set text(v) { v == null ? this.removeAttribute('text') : this.setAttribute('text', v); }\n}\n\ncustomElements.define('nk-switch', NkSwitch);\nexport { NkSwitch };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-check name=\"mail\" value=\"weekly\" checked>Weekly digest</nk-check>\n// → <label class=\"nk-check\"><input type=\"checkbox\"> Weekly digest</label>\nclass NkCheck extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value', 'text', 'indeterminate', 'required']; }\n\n render() {\n const label = this.createElement('label', ['nk-check']);\n this._input = this.createElement('input', [], { type: 'checkbox' });\n const slot = document.createElement('slot');\n this._text = document.createTextNode('');\n slot.appendChild(this._text);\n this._apply();\n this._defaultChecked = this.getBoolAttr('checked');\n label.appendChild(this._input);\n label.appendChild(slot);\n this._wrapper.appendChild(label);\n this._syncFormValue();\n }\n\n _apply() {\n this._input.checked = this.getBoolAttr('checked');\n this._input.indeterminate = this.getBoolAttr('indeterminate');\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._input.required = this.getBoolAttr('required');\n const name = this.getAttribute('name');\n name ? this._input.setAttribute('name', name) : this._input.removeAttribute('name');\n this._input.value = this.getAttribute('value') || 'on';\n if (this._text) this._text.data = this.getAttribute('text') ?? '';\n }\n\n setupEvents() {\n this._onChange = () => {\n this._syncing = true;\n this.setBoolAttr('checked', this._input.checked);\n this.removeAttribute('indeterminate');\n this._syncing = false;\n this._syncFormValue();\n this.emit('nk-change', { checked: this._input.checked, value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged() {\n if (this._syncing || !this._input) return;\n this._apply();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.checked ? this._input.value : null, this._input.checked ? 'checked' : 'unchecked');\n this.syncValidityFrom(this._input);\n }\n\n resetValue() { this.setBoolAttr('checked', this._defaultChecked); }\n restoreValue(state) { if (state === 'checked' || state === 'unchecked') this.setBoolAttr('checked', state === 'checked'); }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n focus(options) { this._input?.focus(options); }\n\n get checked() { return this._input?.checked ?? this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get indeterminate() { return this.getBoolAttr('indeterminate'); }\n set indeterminate(v) { this.setBoolAttr('indeterminate', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get text() { return this.getAttribute('text'); }\n set text(v) { v == null ? this.removeAttribute('text') : this.setAttribute('text', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-check', NkCheck);\nexport { NkCheck };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-radio name=\"style\" value=\"concise\" checked>Concise</nk-radio>\n// → <label class=\"nk-check\"><input type=\"radio\"> Concise</label>\n//\n// ── Grouping ──\n// Every <nk-radio> keeps its <input type=\"radio\"> in its own shadow root, and\n// native radio grouping works per tree — it does not reach across shadow\n// boundaries. Two <nk-radio name=\"x\"> would therefore both stay checked. So\n// the group is kept here, following the native definition: same `name`,\n// same containing tree, same form owner. One tab stop per group, arrow keys\n// move within it (wrapping, skipping disabled), and select as they go.\n\nconst ARROW_KEYS = { ArrowDown: 1, ArrowRight: 1, ArrowUp: -1, ArrowLeft: -1 };\n\n/** Form owner, also for a peer that has not been upgraded yet. */\nfunction ownerForm(el) {\n return (el.form !== undefined ? el.form : el.closest('form')) ?? null;\n}\n\n/** Only the selected radio is a tab stop; arrow keys move within the group. */\nfunction syncGroupTabIndex(group) {\n const enabled = group.filter(el => !el.disabled);\n if (!enabled.length) return;\n const focusable = enabled.find(el => el.checked) || enabled[0];\n for (const el of group) {\n if (el._input) el._input.tabIndex = el === focusable ? 0 : -1;\n }\n}\n\nclass NkRadio extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value', 'text', 'required']; }\n\n render() {\n const label = this.createElement('label', ['nk-check']);\n this._input = this.createElement('input', [], { type: 'radio' });\n const slot = document.createElement('slot');\n this._text = document.createTextNode('');\n slot.appendChild(this._text);\n // `name` on the inner input is inert (it is alone in its tree); it stays\n // as a devtools courtesy. The group above is the real one.\n this._apply();\n this._defaultChecked = this.getBoolAttr('checked');\n label.appendChild(this._input);\n label.appendChild(slot);\n this._wrapper.appendChild(label);\n this._syncFormValue();\n // Elements upgrade in document order, so the last `checked` one in the\n // markup wins the group — the same outcome native radios produce.\n if (this._input.checked) this._uncheckPeers();\n syncGroupTabIndex(this._group());\n }\n\n _apply() {\n this._input.checked = this.getBoolAttr('checked');\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._input.required = this.getBoolAttr('required');\n const name = this.getAttribute('name');\n name ? this._input.setAttribute('name', name) : this._input.removeAttribute('name');\n this._input.value = this.getAttribute('value') || '';\n if (this._text) this._text.data = this.getAttribute('text') ?? '';\n }\n\n setupEvents() {\n this._onChange = () => this._applyChange();\n this._onKeyDown = (e) => {\n const dir = ARROW_KEYS[e.key];\n if (!dir || e.ctrlKey || e.metaKey || e.altKey) return;\n const group = this._group().filter(el => !el.disabled);\n if (group.length < 2) return;\n e.preventDefault();\n const next = group[(group.indexOf(this) + dir + group.length) % group.length];\n next._input.focus();\n next._input.checked = true;\n next._applyChange();\n };\n this._input.addEventListener('change', this._onChange);\n this._input.addEventListener('keydown', this._onKeyDown);\n syncGroupTabIndex(this._group());\n }\n\n teardownEvents() {\n this._input?.removeEventListener('change', this._onChange);\n this._input?.removeEventListener('keydown', this._onKeyDown);\n }\n\n /** Shared by user change and arrow-key selection, so both look identical. */\n _applyChange() {\n if (this._input.checked) this._uncheckPeers();\n this._syncing = true;\n this.setBoolAttr('checked', this._input.checked);\n this._syncing = false;\n this._syncFormValue();\n syncGroupTabIndex(this._group());\n this.emit('nk-change', { checked: this._input.checked, value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n /** Same name, same tree, same form owner — in document order, this element included. */\n _group() {\n const name = this.getAttribute('name');\n const root = this.getRootNode();\n if (!name || typeof root?.querySelectorAll !== 'function') return [this];\n const form = ownerForm(this);\n return [...root.querySelectorAll('nk-radio')].filter(\n el => el.getAttribute('name') === name && ownerForm(el) === form\n );\n }\n\n _uncheckPeers() {\n for (const el of this._group()) {\n if (el !== this && el.checked) el.checked = false;\n }\n }\n\n onAttributeChanged(name) {\n if (this._syncing || !this._input) return;\n this._apply();\n if (name === 'checked' && this._input.checked) this._uncheckPeers();\n this._syncFormValue();\n syncGroupTabIndex(this._group());\n }\n\n _syncFormValue() {\n const val = this.getAttribute('value') || '';\n this.setFormValue(this._input.checked ? val : null, this._input.checked ? 'checked' : 'unchecked');\n this.syncValidityFrom(this._input);\n }\n\n resetValue() {\n this._input.checked = this._defaultChecked;\n this.setBoolAttr('checked', this._defaultChecked);\n this._syncFormValue();\n syncGroupTabIndex(this._group());\n }\n\n restoreValue(state) {\n if (state === 'checked') this.checked = true;\n }\n\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); syncGroupTabIndex(this._group()); }\n\n focus(options) { this._input?.focus(options); }\n\n get checked() { return this._input?.checked ?? this.getBoolAttr('checked'); }\n set checked(v) {\n if (this._input) this._input.checked = v;\n // Also covers the case where the attribute is already present, so\n // setBoolAttr stays silent and onAttributeChanged never runs.\n if (v) this._uncheckPeers();\n this.setBoolAttr('checked', v);\n if (this._input) { this._syncFormValue(); syncGroupTabIndex(this._group()); }\n }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get text() { return this.getAttribute('text'); }\n set text(v) { v == null ? this.removeAttribute('text') : this.setAttribute('text', v); }\n get value() { return this.getAttribute('value') || ''; }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-radio', NkRadio);\nexport { NkRadio };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-slider name=\"size\" min=\"12\" max=\"18\" value=\"14\" show-value></nk-slider>\n// → <input type=\"range\" class=\"nk-slider\"> <div class=\"nk-slider-value\">14</div>\nconst FORWARDED = ['name', 'min', 'max', 'step', 'aria-label'];\n\nclass NkSlider extends NkFormElement {\n static get observedAttributes() { return ['value', 'disabled', 'show-value', 'unit', ...FORWARDED]; }\n\n render() {\n this._input = this.createElement('input', ['nk-slider'], { type: 'range' });\n this._out = this.createElement('div', ['nk-slider-value']);\n this._apply();\n this._input.value = this.getAttribute('value') ?? this._input.value;\n this._defaultValue = this._input.value;\n this._wrapper.appendChild(this._input);\n this._wrapper.appendChild(this._out);\n this._syncOut();\n this._syncFormValue();\n }\n\n _apply() {\n for (const attr of FORWARDED) {\n const v = this.getAttribute(attr);\n v === null ? this._input.removeAttribute(attr) : this._input.setAttribute(attr, v);\n }\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n this._out.style.display = this.getBoolAttr('show-value') ? '' : 'none';\n }\n\n _syncOut() {\n this._out.textContent = `${this._input.value}${this.getAttribute('unit') || ''}`;\n }\n\n setupEvents() {\n this._onInput = () => {\n this._syncOut();\n this._syncFormValue();\n this.emit('nk-input', { value: Number(this._input.value), name: this.name });\n };\n this._onChange = () => {\n this._syncFormValue();\n this.emit('nk-change', { value: Number(this._input.value), name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged(name) {\n if (!this._input) return;\n if (name === 'value') this._input.value = this.getAttribute('value') ?? '';\n else this._apply();\n this._syncOut();\n this._syncFormValue();\n }\n\n _syncFormValue() { this.setFormValue(this._input.value); }\n resetValue() { this._input.value = this._defaultValue; this._syncOut(); this._syncFormValue(); }\n restoreValue(state) { if (typeof state === 'string') { this._input.value = state; this._syncOut(); this._syncFormValue(); } }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n focus(options) { this._input?.focus(options); }\n\n get value() { return Number(this._input?.value ?? this.getAttribute('value')); }\n set value(v) {\n if (this._input) { this._input.value = v; this._syncOut(); this._syncFormValue(); }\n else this.setAttribute('value', v);\n }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get showValue() { return this.getBoolAttr('show-value'); }\n set showValue(v) { this.setBoolAttr('show-value', v); }\n}\n\ncustomElements.define('nk-slider', NkSlider);\nexport { NkSlider };\n","import { NkElement } from '../../base.js';\n\n// <nk-field label=\"Display name\" desc=\"Shown next to your comments\">\n// <nk-input value=\"Marcel\"></nk-input>\n// </nk-field>\n// → <div class=\"nk-field\"><div><div class=\"f-label\">…</div><div class=\"f-desc\">…</div></div>\n// <div class=\"f-control\">…</div></div>\n// Rich label / description content goes through slot=\"label\" / slot=\"desc\"\n// (twins `.nk-field ::slotted([slot=\"label\"])` etc. in notionkit.css).\n//\n// `stacked` puts the label above a full-width control, `compact` shrinks the\n// label and drops the row padding; inside <nk-fields> both are on by\n// default. A stacked field sets `wide` on its nk-input / nk-textarea /\n// nk-select, since the stylesheet's `.nk-field.stacked .nk-input` cannot\n// reach into the control's shadow root.\nconst WIDE = ['nk-input', 'nk-textarea', 'nk-select'];\n\nclass NkField extends NkElement {\n static get observedAttributes() { return ['label', 'desc', 'stacked', 'compact']; }\n\n render() {\n this._field = this.createElement('div', ['nk-field']);\n const text = document.createElement('div');\n this._label = this.createElement('div', ['f-label']);\n const labelSlot = this.createElement('slot', [], { name: 'label' });\n labelSlot.appendChild(this._label);\n this._desc = this.createElement('div', ['f-desc']);\n const descSlot = this.createElement('slot', [], { name: 'desc' });\n descSlot.appendChild(this._desc);\n text.appendChild(labelSlot);\n text.appendChild(descSlot);\n const control = this.createElement('div', ['f-control']);\n this._slot = document.createElement('slot');\n control.appendChild(this._slot);\n this._field.appendChild(text);\n this._field.appendChild(control);\n this._wrapper.appendChild(this._field);\n this._widened = new Set();\n this._sync();\n }\n\n setupEvents() {\n this._onSlot = () => this._syncWide();\n this._slot.addEventListener('slotchange', this._onSlot);\n this._sync();\n }\n\n teardownEvents() {\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged() { this._sync(); }\n\n get stacked() { return this.getBoolAttr('stacked') || !!this.closest('nk-fields'); }\n set stacked(v) { this.setBoolAttr('stacked', v); }\n get compact() { return this.getBoolAttr('compact') || !!this.closest('nk-fields'); }\n set compact(v) { this.setBoolAttr('compact', v); }\n\n _sync() {\n if (!this._label) return;\n this._label.textContent = this.getAttribute('label') || '';\n const desc = this.getAttribute('desc');\n this._desc.textContent = desc || '';\n this._desc.style.display = desc ? '' : 'none';\n this._field.classList.toggle('stacked', this.stacked);\n this._field.classList.toggle('compact', this.compact);\n this._syncWide();\n }\n\n _syncWide() {\n if (!this._slot) return;\n const stacked = this.stacked;\n for (const el of this._slot.assignedElements()) {\n if (!WIDE.includes(el.localName)) continue;\n if (stacked && !el.hasAttribute('wide')) { el.setAttribute('wide', ''); this._widened.add(el); }\n else if (!stacked && this._widened.has(el)) { el.removeAttribute('wide'); this._widened.delete(el); }\n }\n }\n\n get label() { return this.getAttribute('label'); }\n set label(v) { this.setAttribute('label', v); }\n get desc() { return this.getAttribute('desc'); }\n set desc(v) { v == null ? this.removeAttribute('desc') : this.setAttribute('desc', v); }\n}\n\ncustomElements.define('nk-field', NkField);\nexport { NkField };\n","import { NkElement } from '../../base.js';\n\n// <nk-fields>\n// <nk-field label=\"Name\"><nk-input name=\"name\"></nk-input></nk-field>\n// <nk-field label=\"Email\"><nk-input name=\"email\"></nk-input></nk-field>\n// </nk-fields>\n// → <div class=\"nk-fields\">…</div>\n// A grid of short fields side by side, wrapping as the width allows. Every\n// nk-field inside renders itself stacked and compact (12px label above a\n// full-width control) – the class markup does the same through\n// `.nk-fields > .nk-field`, which cannot cross the shadow boundary here.\n// `fit` (NotionKit 1.11.0) lets the fields share the row instead of keeping\n// 150px columns: two fields in a wide dialog are two halves.\nclass NkFields extends NkElement {\n static get observedAttributes() { return ['fit']; }\n\n render() {\n this._grid = this.createElement('div', ['nk-fields']);\n this._grid.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._grid);\n this.onAttributeChanged();\n }\n\n onAttributeChanged() { this._grid?.classList.toggle('fit', this.getBoolAttr('fit')); }\n\n get fit() { return this.getBoolAttr('fit'); }\n set fit(v) { this.setBoolAttr('fit', v); }\n}\n\ncustomElements.define('nk-fields', NkFields);\nexport { NkFields };\n","import { NkElement } from '../../base.js';\n\n// <nk-tag color=\"blue\">Text</nk-tag> — modifier class .blue becomes color=\"blue\".\n// Notion's nine select colours; without `color` the stylesheet draws the grey tag.\nconst COLORS = ['gray', 'brown', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'red'];\n\nclass NkTag extends NkElement {\n static get observedAttributes() { return ['color']; }\n\n render() {\n this._tag = this.createElement('span', this._computeClasses());\n this._tag.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._tag);\n }\n\n onAttributeChanged() {\n if (this._tag) this._tag.className = this._computeClasses().join(' ');\n }\n\n _computeClasses() {\n const classes = ['nk-tag'];\n const color = this.getAttribute('color');\n if (COLORS.includes(color)) classes.push(color);\n return classes;\n }\n\n get color() { return this.getAttribute('color'); }\n set color(v) { v ? this.setAttribute('color', v) : this.removeAttribute('color'); }\n}\n\ncustomElements.define('nk-tag', NkTag);\nexport { NkTag };\n","import { NkElement } from '../../base.js';\n\n// <nk-progress value=\"72\" label=\"72%\"></nk-progress>\n// <nk-progress value=\"72\" label=\"72 %\" wide></nk-progress> → fills its row, the label stays beside it\n// The bar is `.nk-progress > i` — a child combinator, so both nodes live here.\n// With a label the two form one .nk-progress-row (1.18.0): the label beside\n// the bar in a flex column too – a panel – where the host, display: contents,\n// would let them stand one under the other.\nclass NkProgress extends NkElement {\n static get observedAttributes() { return ['value', 'max', 'label', 'wide']; }\n\n render() {\n this._bar = this.createElement('span', ['nk-progress'], { role: 'progressbar' });\n this._fill = document.createElement('i');\n this._bar.appendChild(this._fill);\n this._label = this.createElement('span', ['nk-progress-label']);\n this._row = this.createElement('span', ['nk-progress-row']);\n this._sync();\n }\n\n onAttributeChanged() { this._sync(); }\n\n _sync() {\n if (!this._bar) return;\n const max = Number(this.getAttribute('max')) || 100;\n const value = Math.min(max, Math.max(0, Number(this.getAttribute('value')) || 0));\n this._fill.style.width = `${(value / max) * 100}%`;\n this._bar.classList.toggle('wide', this.getBoolAttr('wide'));\n this._bar.setAttribute('aria-valuenow', value);\n this._bar.setAttribute('aria-valuemin', 0);\n this._bar.setAttribute('aria-valuemax', max);\n const label = this.getAttribute('label');\n this._label.textContent = label ?? '';\n if (label === null) { if (this._bar.parentNode !== this._wrapper) this._wrapper.replaceChildren(this._bar); }\n else if (this._bar.parentNode !== this._row) { this._row.replaceChildren(this._bar, this._label); this._wrapper.replaceChildren(this._row); }\n }\n\n get value() { return Number(this.getAttribute('value')) || 0; }\n set value(v) { this.setAttribute('value', v); }\n get max() { return Number(this.getAttribute('max')) || 100; }\n set max(v) { this.setAttribute('max', v); }\n get label() { return this.getAttribute('label'); }\n set label(v) { v == null ? this.removeAttribute('label') : this.setAttribute('label', v); }\n}\n\ncustomElements.define('nk-progress', NkProgress);\nexport { NkProgress };\n","import { NkElement } from '../../base.js';\n\n// <nk-callout icon=\"💡\">text</nk-callout>\n// <nk-callout><span slot=\"icon\">📌</span>text</nk-callout>\n// The .c-icon rule has ::slotted(.c-icon) / ::slotted([slot=\"icon\"]) twins in\n// notionkit.css – those size an icon passed in from the light DOM. Pass the\n// icon node itself, never wrapped: ::slotted() only matches the assigned node.\nclass NkCallout extends NkElement {\n static get observedAttributes() { return ['icon']; }\n\n render() {\n this._box = this.createElement('div', ['nk-callout']);\n this._icon = this.createElement('span', ['c-icon']);\n const iconSlot = this.createElement('slot', [], { name: 'icon' });\n iconSlot.appendChild(this._icon);\n const body = document.createElement('div');\n body.appendChild(document.createElement('slot'));\n this._box.appendChild(iconSlot);\n this._box.appendChild(body);\n this._wrapper.appendChild(this._box);\n this._syncIcon();\n }\n\n onAttributeChanged() { this._syncIcon(); }\n\n _syncIcon() {\n if (this._icon) this._icon.textContent = this.getAttribute('icon') || '💡';\n }\n\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n}\n\ncustomElements.define('nk-callout', NkCallout);\nexport { NkCallout };\n","import { NkElement } from '../../base.js';\n\n// <nk-divider></nk-divider> → <hr class=\"nk-divider\">\nclass NkDivider extends NkElement {\n render() {\n this._wrapper.appendChild(this.createElement('hr', ['nk-divider']));\n }\n}\n\ncustomElements.define('nk-divider', NkDivider);\nexport { NkDivider };\n","import { NkElement } from '../../base.js';\n\n// <nk-heading level=\"2\">Section</nk-heading> → <h2 class=\"nk-heading\">\n// The heading level is real markup (h1–h4), so the outline stays honest.\nclass NkHeading extends NkElement {\n static get observedAttributes() { return ['level']; }\n\n render() {\n this._build();\n }\n\n _build() {\n const level = Math.min(4, Math.max(1, Number(this.getAttribute('level')) || 2));\n const h = this.createElement(`h${level}`, ['nk-heading']);\n h.appendChild(document.createElement('slot'));\n if (this._heading) this._heading.replaceWith(h);\n else this._wrapper.appendChild(h);\n this._heading = h;\n }\n\n onAttributeChanged() { this._build(); }\n\n get level() { return Number(this.getAttribute('level')) || 2; }\n set level(v) { this.setAttribute('level', v); }\n}\n\ncustomElements.define('nk-heading', NkHeading);\nexport { NkHeading };\n","import { NkElement } from '../../base.js';\n\n// <nk-toggle label=\"Details\" open>Body…</nk-toggle>\n// → <details class=\"nk-toggle\" open><summary>Details</summary><div class=\"toggle-body\">…</div></details>\n// The summary marker is a pseudo-element and cannot be styled on slotted\n// content, so the summary is rendered here (label attribute or slot=\"label\").\nclass NkToggle extends NkElement {\n static get observedAttributes() { return ['label', 'open']; }\n\n render() {\n this._details = this.createElement('details', ['nk-toggle']);\n const summary = document.createElement('summary');\n this._label = document.createElement('span');\n const labelSlot = this.createElement('slot', [], { name: 'label' });\n labelSlot.appendChild(this._label);\n summary.appendChild(labelSlot);\n const body = this.createElement('div', ['toggle-body']);\n body.appendChild(document.createElement('slot'));\n this._details.appendChild(summary);\n this._details.appendChild(body);\n this._details.open = this.getBoolAttr('open');\n this._wrapper.appendChild(this._details);\n this._sync();\n }\n\n setupEvents() {\n this._onToggle = () => {\n this._syncing = true;\n this.setBoolAttr('open', this._details.open);\n this._syncing = false;\n this.emit('nk-toggle', { open: this._details.open });\n };\n this._details.addEventListener('toggle', this._onToggle);\n }\n\n teardownEvents() {\n this._details?.removeEventListener('toggle', this._onToggle);\n }\n\n onAttributeChanged(name) {\n if (!this._details) return;\n if (name === 'open') { if (!this._syncing) this._details.open = this.getBoolAttr('open'); return; }\n this._sync();\n }\n\n _sync() { this._label.textContent = this.getAttribute('label') || ''; }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get label() { return this.getAttribute('label'); }\n set label(v) { this.setAttribute('label', v); }\n}\n\ncustomElements.define('nk-toggle', NkToggle);\nexport { NkToggle };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-todo name=\"task\" value=\"1\" checked>Write the docs</nk-todo>\n// → <label class=\"nk-todo\"><input type=\"checkbox\"><span>Write the docs</span></label>\n// `.nk-todo input:checked + span` strikes the text through — both siblings\n// are rendered here so the combinator works; the text is slotted into <span>.\nclass NkTodo extends NkFormElement {\n static get observedAttributes() { return ['checked', 'disabled', 'name', 'value']; }\n\n render() {\n const label = this.createElement('label', ['nk-todo']);\n this._input = this.createElement('input', [], { type: 'checkbox' });\n this._apply();\n this._defaultChecked = this.getBoolAttr('checked');\n const text = document.createElement('span');\n text.appendChild(document.createElement('slot'));\n label.appendChild(this._input);\n label.appendChild(text);\n this._wrapper.appendChild(label);\n this._syncFormValue();\n }\n\n _apply() {\n this._input.checked = this.getBoolAttr('checked');\n this._input.disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n const name = this.getAttribute('name');\n name ? this._input.setAttribute('name', name) : this._input.removeAttribute('name');\n this._input.value = this.getAttribute('value') || 'on';\n }\n\n setupEvents() {\n this._onChange = () => {\n this._syncing = true;\n this.setBoolAttr('checked', this._input.checked);\n this._syncing = false;\n this._syncFormValue();\n this.emit('nk-change', { checked: this._input.checked, value: this._input.value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n };\n this._input.addEventListener('change', this._onChange);\n }\n\n teardownEvents() {\n this._input?.removeEventListener('change', this._onChange);\n }\n\n onAttributeChanged() {\n if (this._syncing || !this._input) return;\n this._apply();\n this._syncFormValue();\n }\n\n _syncFormValue() {\n this.setFormValue(this._input.checked ? this._input.value : null, this._input.checked ? 'checked' : 'unchecked');\n }\n\n resetValue() { this.setBoolAttr('checked', this._defaultChecked); }\n restoreValue(state) { if (state === 'checked' || state === 'unchecked') this.setBoolAttr('checked', state === 'checked'); }\n onFormDisabled(disabled) { this._formDisabled = disabled; this._apply(); }\n\n get checked() { return this._input?.checked ?? this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-todo', NkTodo);\nexport { NkTodo };\n","import { NkElement } from '../../base.js';\n\n// <nk-kbd>⌘</nk-kbd> <nk-kbd>K</nk-kbd> → <kbd class=\"nk-kbd\">\nclass NkKbd extends NkElement {\n\n render() {\n const kbd = this.createElement('kbd', ['nk-kbd']);\n kbd.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(kbd);\n }\n}\n\ncustomElements.define('nk-kbd', NkKbd);\nexport { NkKbd };\n","import { NkElement } from '../../base.js';\nimport { highlightHtml } from '../../util/highlight.js';\n\n// <nk-code lang=\"html\">&lt;div class=\"nk-btn\"&gt;…</nk-code>\n// The block keeps whatever whitespace it is given (white-space: pre). Text\n// content is slotted as-is; add `highlight` to colour HTML tags/attributes,\n// which copies the text into the shadow tree (light DOM is then ignored).\nclass NkCode extends NkElement {\n static get observedAttributes() { return ['lang', 'highlight']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._box = this.createElement('div', ['nk-code']);\n this._lang = this.createElement('span', ['lang']);\n this._slot = document.createElement('slot');\n this._pre = this.createElement('span', ['hl']);\n this._box.appendChild(this._lang);\n this._box.appendChild(this._slot);\n this._box.appendChild(this._pre);\n this._wrapper.appendChild(this._box);\n this._sync();\n this.projectLightDom();\n }\n\n onAttributeChanged() { this._sync(); this.projectLightDom(); }\n\n _sync() {\n if (!this._lang) return;\n const lang = this.getAttribute('lang');\n this._lang.textContent = lang || '';\n this._lang.style.display = lang ? '' : 'none';\n }\n\n projectLightDom() {\n if (!this._pre) return;\n const highlight = this.hasAttribute('highlight');\n this._slot.style.display = highlight ? 'none' : '';\n this._pre.style.display = highlight ? '' : 'none';\n if (!highlight) return;\n const text = this.textContent.replace(/^\\n/, '');\n if (text === this._lastText) return;\n this._lastText = text;\n this._pre.innerHTML = highlightHtml(text);\n }\n\n get lang() { return this.getAttribute('lang'); }\n set lang(v) { v == null ? this.removeAttribute('lang') : this.setAttribute('lang', v); }\n}\n\ncustomElements.define('nk-code', NkCode);\nexport { NkCode };\n","// Minimal HTML highlighter emitting the .tag / .attr hooks .nk-code styles.\n// Mirrors tools/highlight.mjs in the NotionKit foundation – no third-party\n// highlighter, no other languages. Anything that is not HTML is escaped only.\nexport function escapeHtml(s) {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nexport function highlightHtml(source) {\n return escapeHtml(source).replace(/&lt;(\\/?)([a-zA-Z][\\w-]*)([^&]*?)(\\/?)&gt;/g, (m, close, tag, attrs, self) => {\n const attrHtml = attrs.replace(/([\\w-]+)(=)(\"[^\"]*\"|'[^']*')?/g,\n (a, name, eq, val) => `<span class=\"attr\">${name}</span>${eq}${val ?? ''}`);\n return `&lt;${close}<span class=\"tag\">${tag}</span>${attrHtml}${self}&gt;`;\n });\n}\n","import { NkElement } from '../../base.js';\n\n// <nk-quote cite=\"Ada Lovelace\">The Analytical Engine weaves…</nk-quote>\n// .q-cite has no ::slotted() twin, so the citation is rendered here.\nclass NkQuote extends NkElement {\n static get observedAttributes() { return ['cite']; }\n\n render() {\n this._quote = this.createElement('blockquote', ['nk-quote']);\n this._quote.appendChild(document.createElement('slot'));\n this._cite = this.createElement('cite', ['q-cite']);\n this._quote.appendChild(this._cite);\n this._wrapper.appendChild(this._quote);\n this._sync();\n }\n\n onAttributeChanged() { this._sync(); }\n\n _sync() {\n if (!this._cite) return;\n const cite = this.getAttribute('cite');\n this._cite.textContent = cite || '';\n this._cite.style.display = cite ? '' : 'none';\n }\n\n get cite() { return this.getAttribute('cite'); }\n set cite(v) { v == null ? this.removeAttribute('cite') : this.setAttribute('cite', v); }\n}\n\ncustomElements.define('nk-quote', NkQuote);\nexport { NkQuote };\n","import { NkElement } from '../../base.js';\n\n// <nk-app>\n// <nk-sidebar slot=\"sidebar\">…</nk-sidebar>\n// <nk-topbar>…</nk-topbar>\n// <nk-page>…</nk-page>\n// </nk-app>\n// → <div class=\"nk-app\"><aside class=\"nk-sidebar\">…</aside><main class=\"nk-main\">…</main></div>\n// The outermost element of a workspace app: a full-height flex row.\n// `peek-inset` (NotionKit 1.10.0) gives the main column a right padding as\n// wide as the side peek – <nk-peek inset> sets it while it is open.\nclass NkApp extends NkElement {\n static get observedAttributes() { return ['peek-inset']; }\n\n render() {\n const app = this._app = this.createElement('div', ['nk-app']);\n app.classList.toggle('peek-inset', this.getBoolAttr('peek-inset'));\n app.appendChild(this.createElement('slot', [], { name: 'sidebar' }));\n const main = this.createElement('main', ['nk-main']);\n main.appendChild(document.createElement('slot'));\n app.appendChild(main);\n this._wrapper.appendChild(app);\n }\n\n onAttributeChanged() { this._app.classList.toggle('peek-inset', this.getBoolAttr('peek-inset')); }\n}\n\ncustomElements.define('nk-app', NkApp);\nexport { NkApp };\n","// Overlay plumbing shared by nk-modal, nk-sheet, nk-cmdk and nk-menu: body\n// scroll lock with a refcount, `inert` on everything outside the overlay so\n// focus and assistive technology stay inside – nested shadow roots included –\n// and the focused element behind shadow hosts, to return focus to.\nlet locks = 0, previousOverflow = '';\n\nexport function lockScroll() {\n if (locks++ === 0) {\n previousOverflow = document.documentElement.style.overflow;\n document.documentElement.style.overflow = 'hidden';\n }\n}\n\nexport function unlockScroll() {\n if (locks > 0 && --locks === 0) document.documentElement.style.overflow = previousOverflow;\n}\n\n// Floating layers under <body> that open from inside an overlay – a menu, a\n// date picker – and the tooltip and toast stay usable: made inert, a date\n// picker opened from a dialog showed but took no click.\nconst LAYERS = 'nk-menu[floating], nk-calendar[floating], nk-tooltip, nk-toast';\n\n/** Makes every sibling along `el`'s ancestor chain inert (shadow hosts included), floating layers aside; returns the undo. */\nexport function inertOutside(el) {\n const made = [];\n let node = el;\n while (node && node !== document.body) {\n const parent = node.parentNode instanceof ShadowRoot ? node.parentNode : node.parentNode;\n if (!parent) break;\n for (const sib of parent.children) {\n if (sib === node || sib.inert || /^(SCRIPT|STYLE|LINK|TEMPLATE)$/.test(sib.tagName) || sib.matches(LAYERS)) continue;\n sib.inert = true;\n made.push(sib);\n }\n node = parent instanceof ShadowRoot ? parent.host : parent;\n }\n return () => { for (const c of made) c.inert = false; };\n}\n\n/** The focused element itself, looking into shadow roots (document.activeElement stops at the host). */\nexport function deepActiveElement() {\n let el = document.activeElement;\n while (el?.shadowRoot?.activeElement) el = el.shadowRoot.activeElement;\n return el;\n}\n\n/** The first tabbable element inside a light-DOM subtree, looking into shadow roots. */\nexport function firstFocusable(root) {\n const SEL = 'a[href], button:not([disabled]), input:not([disabled]):not([type=hidden]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"]), [contenteditable=\"true\"], [contenteditable=\"plaintext-only\"]';\n const walk = (node) => {\n for (const el of node.querySelectorAll('*')) {\n if (el.matches(SEL) && el.getClientRects().length) return el;\n if (el.shadowRoot) { const inner = walk(el.shadowRoot); if (inner) return inner; }\n }\n return null;\n };\n return walk(root);\n}\n","import { NkElement } from '../../base.js';\nimport { deepActiveElement } from '../../util/focus.js';\n\n// <nk-sidebar slot=\"sidebar\">\n// <nk-workspace-switcher slot=\"workspace\" name=\"Acme\"></nk-workspace-switcher>\n// <nk-tree>…</nk-tree>\n// <nk-tree-item slot=\"footer\" icon=\"⚙️\">Settings</nk-tree-item>\n// </nk-sidebar>\n// → <aside class=\"nk-sidebar\"><div class=\"nk-workspace\">…</div>\n// <div class=\"nk-sidebar-scroll\">…</div><div class=\"nk-sidebar-footer\">…</div></aside>\n//\n// The host is display:contents so the <aside> is a direct flex child of\n// .nk-app, exactly like the class markup. Below 860px notionkit.css hides the\n// aside; `open` brings it back as a drawer over the page. The drawer is the\n// stylesheet's since NotionKit 1.7.0 (.nk-sidebar.open, .nk-sidebar-backdrop\n// .open) – the sidebar slides and the scrim fades by the same rules as the\n// class markup; the element toggles the two classes. <nk-btn variant=\"sidebar\">\n// in the topbar is the ☰ that opens it.\n//\n// `collapsible` (NotionKit 1.10.0): on the desktop Notion's « beside the\n// workspace row collapses the sidebar – it slides out to the left, the main\n// column takes the width, nothing in it takes focus – and the topbar's ☰\n// brings it back; ⌘\\ or Ctrl+\\ toggles it (on a phone the drawer).\n// `collapsed` is the state, collapse() / expand() / toggleCollapsed() the\n// API, nk-collapse { collapsed } the moment to keep it. collapse-label names\n// the « (default \"Close sidebar\", in German \"Seitenleiste schließen\") and is\n// its tooltip for <nk-tooltip>.\nconst COLLAPSE_ICON = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m18 17-5-5 5-5M11 17l-5-5 5-5\"/></svg>';\nconst phone = () => matchMedia('(max-width: 860px)').matches;\n\nclass NkSidebar extends NkElement {\n static get observedAttributes() { return ['open', 'collapsible', 'collapsed', 'collapse-label']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-sidebar-backdrop']);\n this._aside = this.createElement('aside', ['nk-sidebar']);\n const head = this.createElement('div', ['nk-sidebar-head']);\n this._collapse = this.createElement('button', ['nk-sidebar-collapse'], { type: 'button', 'data-tooltip-key': '⌘\\\\' });\n this._collapse.innerHTML = COLLAPSE_ICON;\n head.append(this.createElement('slot', [], { name: 'workspace' }), this._collapse);\n this._aside.appendChild(head);\n const scroll = this.createElement('div', ['nk-sidebar-scroll']);\n scroll.appendChild(document.createElement('slot'));\n this._aside.appendChild(scroll);\n this._footer = this.createElement('div', ['nk-sidebar-footer']);\n this._footerSlot = this.createElement('slot', [], { name: 'footer' });\n this._footer.appendChild(this._footerSlot);\n this._aside.appendChild(this._footer);\n this._wrapper.appendChild(this._backdrop);\n this._wrapper.appendChild(this._aside);\n this._syncFooter();\n this._syncOpen();\n this._syncCollapse();\n }\n\n _syncCollapse() {\n const label = this.getAttribute('collapse-label') || this.str('closeSidebar');\n this._collapse.hidden = !this.getBoolAttr('collapsible');\n this._collapse.setAttribute('aria-label', label);\n this._collapse.dataset.tooltip = label;\n this._aside.classList.toggle('collapsed', this.getBoolAttr('collapsed'));\n }\n\n /** The ☰ that brings the sidebar back: the one in its own app, else the page's. */\n _toggleButton() {\n const sel = 'nk-btn[variant=\"sidebar\"]';\n return this.closest('nk-app')?.querySelector(sel) ?? document.querySelector(sel);\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._aside.classList.toggle('open', open);\n this._backdrop.classList.toggle('open', open);\n }\n\n _syncFooter() {\n const nodes = this._footerSlot.assignedElements();\n // The footer box carries padding and a border; only render it when used.\n this._footer.style.display = nodes.length ? '' : 'none';\n // Footer rows are 26px in the class version (.nk-sidebar-footer .nk-tree-item).\n for (const el of nodes) if (el.localName === 'nk-tree-item') el.setAttribute('compact', '');\n }\n\n setupEvents() {\n this._onSlot = () => this._syncFooter();\n this._onBackdrop = () => this.close();\n this._onKey = (e) => {\n if (e.key === 'Escape' && this.getBoolAttr('open')) this.close();\n // Notion's ⌘\\: the collapse on the desktop, the drawer on a phone.\n if (e.key === '\\\\' && (e.metaKey || e.ctrlKey) && this.getBoolAttr('collapsible') && !e.defaultPrevented) {\n e.preventDefault();\n phone() ? this.toggle() : this.toggleCollapsed();\n }\n };\n this._onCollapse = () => this.collapse();\n this._footerSlot.addEventListener('slotchange', this._onSlot);\n this._backdrop.addEventListener('click', this._onBackdrop);\n this._collapse.addEventListener('click', this._onCollapse);\n document.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._footerSlot?.removeEventListener('slotchange', this._onSlot);\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n this._collapse?.removeEventListener('click', this._onCollapse);\n document.removeEventListener('keydown', this._onKey);\n }\n\n onStringsChanged() { this._syncCollapse(); }\n\n onAttributeChanged(name) {\n if (name === 'open') {\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n return;\n }\n // Focus follows to the control that is left: the ☰ after collapsing, the « after expanding.\n const active = deepActiveElement();\n const fromSidebar = active && (this.contains(active) || this._shadow.contains(active));\n const fromToggle = active?.closest?.('.nk-sidebar-toggle');\n this._syncCollapse();\n if (name !== 'collapsed') return;\n const collapsed = this.getBoolAttr('collapsed');\n this.emit('nk-collapse', { collapsed });\n // Two frames later: with reduced motion every nk- element transitions for\n // .01ms, the inherited visibility included, so the « is focusable only then.\n const later = fn => requestAnimationFrame(() => requestAnimationFrame(fn));\n if (collapsed && fromSidebar) later(() => this._toggleButton()?.focus({ preventScroll: true }));\n if (!collapsed && fromToggle && !this._collapse.hidden) later(() => this._collapse.focus({ preventScroll: true }));\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n\n collapse() { this.setBoolAttr('collapsed', true); }\n expand() { this.setBoolAttr('collapsed', false); }\n toggleCollapsed() { this.setBoolAttr('collapsed', !this.getBoolAttr('collapsed')); }\n get collapsed() { return this.getBoolAttr('collapsed'); }\n set collapsed(v) { this.setBoolAttr('collapsed', v); }\n}\n\ncustomElements.define('nk-sidebar', NkSidebar);\nexport { NkSidebar };\n","import { NkElement } from '../../base.js';\n\n// <nk-workspace-switcher slot=\"workspace\" name=\"Acme\" avatar=\"A\">\n// <nk-menu slot=\"menu\">…</nk-menu>\n// </nk-workspace-switcher>\n// → <div class=\"nk-workspace\"><div class=\"avatar\">A</div><span>Acme</span><span class=\"chev\">⌄</span></div>\n// A click toggles `open` and shows whatever sits in the menu slot below the\n// row; clicking outside or pressing Escape closes it.\nconst menuSheet = new CSSStyleSheet();\nmenuSheet.replaceSync(`\n .nk-ws-anchor { position: relative; flex: 1 1 auto; min-width: 0; }\n .nk-ws-menu { display: none; position: absolute; left: 8px; top: calc(100% - 2px); z-index: 50; }\n :host([open]) .nk-ws-menu { display: block; }\n`);\n\nclass NkWorkspaceSwitcher extends NkElement {\n static get hostStyles() { return menuSheet; }\n static get observedAttributes() { return ['name', 'avatar', 'open']; }\n\n render() {\n this._row = this.createElement('div', ['nk-workspace'], { role: 'button', tabindex: '0', 'aria-haspopup': 'menu' });\n this._avatar = this.createElement('div', ['avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n this._name = document.createElement('span');\n const chev = this.createElement('span', ['chev']);\n chev.textContent = '⌄';\n this._row.append(avatarSlot, this._name, chev);\n this._menu = this.createElement('div', ['nk-ws-menu']);\n this._menu.appendChild(this.createElement('slot', [], { name: 'menu' }));\n const anchor = this.createElement('div', ['nk-ws-anchor']);\n anchor.append(this._row, this._menu);\n this._wrapper.appendChild(anchor);\n this._sync();\n }\n\n _sync() {\n const name = this.getAttribute('name') || '';\n this._name.textContent = name;\n this._avatar.textContent = this.getAttribute('avatar') || name.trim().charAt(0).toUpperCase();\n this._row.setAttribute('aria-expanded', this.getBoolAttr('open') ? 'true' : 'false');\n }\n\n setupEvents() {\n this._onClick = () => this.toggle();\n this._onKey = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.toggle(); } };\n this._onDocClick = (e) => { if (this.getBoolAttr('open') && !e.composedPath().includes(this)) this.close(); };\n this._onDocKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) this.close(); };\n this._onMenuSelect = () => this.close();\n this._row.addEventListener('click', this._onClick);\n this._row.addEventListener('keydown', this._onKey);\n this._menu.addEventListener('nk-select', this._onMenuSelect);\n document.addEventListener('click', this._onDocClick);\n document.addEventListener('keydown', this._onDocKey);\n }\n\n teardownEvents() {\n this._row?.removeEventListener('click', this._onClick);\n this._row?.removeEventListener('keydown', this._onKey);\n this._menu?.removeEventListener('nk-select', this._onMenuSelect);\n document.removeEventListener('click', this._onDocClick);\n document.removeEventListener('keydown', this._onDocKey);\n }\n\n onAttributeChanged(name) {\n this._sync();\n if (name === 'open') this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n}\n\ncustomElements.define('nk-workspace-switcher', NkWorkspaceSwitcher);\nexport { NkWorkspaceSwitcher };\n","import { NkElement } from '../../base.js';\n\n// <nk-section-label addable>Favourites</nk-section-label>\n// → <div class=\"nk-section-label\">Favourites <span class=\"plus\">+</span></div>\n// The + appears on hover (a hover-parent rule, so it lives in the same tree)\n// and fires nk-action { action: 'add' }.\nclass NkSectionLabel extends NkElement {\n static get observedAttributes() { return ['label', 'addable']; }\n\n render() {\n this._box = this.createElement('div', ['nk-section-label']);\n this._text = document.createElement('span');\n this._text.appendChild(document.createElement('slot'));\n this._plus = this.createElement('span', ['plus'], { role: 'button', title: '+' });\n this._plus.textContent = '+';\n this._box.append(this._text, this._plus);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n const label = this.getAttribute('label');\n if (label !== null) this._text.textContent = label;\n this._plus.style.display = this.getBoolAttr('addable') ? '' : 'none';\n }\n\n setupEvents() {\n this._onPlus = (e) => { e.stopPropagation(); this.emit('nk-action', { action: 'add' }); };\n this._plus.addEventListener('click', this._onPlus);\n }\n\n teardownEvents() { this._plus?.removeEventListener('click', this._onPlus); }\n\n onAttributeChanged() { this._sync(); }\n\n get addable() { return this.getBoolAttr('addable'); }\n set addable(v) { this.setBoolAttr('addable', v); }\n}\n\ncustomElements.define('nk-section-label', NkSectionLabel);\nexport { NkSectionLabel };\n","import { NkElement } from '../../base.js';\n\n// <nk-tree>\n// <nk-section-label addable>Favourites</nk-section-label>\n// <nk-tree-item icon=\"📊\" open>Project overview\n// <nk-tree-item icon=\"🚀\" active>NotionKit MVP</nk-tree-item>\n// </nk-tree-item>\n// </nk-tree>\n//\n// A container for tree items: keeps a single `active` item (listening to\n// nk-select from any depth), gives the group one tab stop with arrow-key\n// navigation, and can render items from data:\n// tree.data = [{ label, icon, value, href, open, active, children: [...] }]\nconst KEYS = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End']);\n\nclass NkTree extends NkElement {\n static get observedAttributes() { return ['manual']; }\n\n render() {\n const box = this.createElement('div', [], { role: 'tree' });\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n this._box = box;\n }\n\n /** Makes `item` the single active item (called by the item after nk-select was not cancelled). */\n setActive(item) {\n if (this.getBoolAttr('manual')) return;\n for (const other of this.querySelectorAll('nk-tree-item[active]')) if (other !== item) other.removeAttribute('active');\n item.setAttribute('active', '');\n this._syncTabIndex(item);\n }\n\n setupEvents() {\n this._onKey = (e) => {\n if (!KEYS.has(e.key) || e.ctrlKey || e.metaKey || e.altKey) return;\n const item = e.target.closest?.('nk-tree-item');\n if (!item) return;\n const visible = this.visibleItems();\n const i = visible.indexOf(item);\n if (i < 0) return;\n let next = null;\n switch (e.key) {\n case 'ArrowDown': next = visible[i + 1]; break;\n case 'ArrowUp': next = visible[i - 1]; break;\n case 'Home': next = visible[0]; break;\n case 'End': next = visible[visible.length - 1]; break;\n case 'ArrowRight':\n if (item.hasChildren && !item.open) item.open = true;\n else if (item.hasChildren) next = item.querySelector('nk-tree-item');\n break;\n case 'ArrowLeft':\n if (item.hasChildren && item.open) item.open = false;\n else next = item.parentElement?.closest('nk-tree-item');\n break;\n }\n e.preventDefault();\n if (next) { this._syncTabIndex(next); next.focus(); }\n };\n this._onSlot = () => this._syncTabIndex();\n this.addEventListener('keydown', this._onKey);\n this._box.querySelector('slot').addEventListener('slotchange', this._onSlot);\n this._syncTabIndex();\n }\n\n teardownEvents() {\n this.removeEventListener('keydown', this._onKey);\n this._box?.querySelector('slot').removeEventListener('slotchange', this._onSlot);\n }\n\n /** Items whose every ancestor item inside this tree is open – i.e. rendered. */\n visibleItems() {\n return [...this.querySelectorAll('nk-tree-item')].filter(item => {\n for (let p = item.parentElement?.closest('nk-tree-item'); p && this.contains(p); p = p.parentElement?.closest('nk-tree-item')) {\n if (!p.open) return false;\n }\n return true;\n });\n }\n\n /** Items upgrade after the tree; each one asks for a resync once rendered. */\n requestSync() {\n if (this._syncQueued) return;\n this._syncQueued = true;\n queueMicrotask(() => { this._syncQueued = false; this._syncTabIndex(); });\n }\n\n _syncTabIndex(focusable) {\n const items = [...this.querySelectorAll('nk-tree-item')];\n if (!items.length) return;\n const visible = this.visibleItems();\n const target = focusable || visible.find(i => i.active) || visible[0];\n // A method call, not a property write: assigning a property to an element\n // that has not been upgraded yet would create an own property that shadows\n // the accessor forever.\n for (const item of items) item.setTabbable?.(item === target);\n }\n\n /** Renders items from data into the light DOM (replacing existing items). */\n set data(list) {\n this._data = list;\n const build = (nodes) => nodes.map(n => {\n const item = document.createElement('nk-tree-item');\n if (n.icon) item.setAttribute('icon', n.icon);\n if (n.value != null) item.setAttribute('value', n.value);\n if (n.href) item.setAttribute('href', n.href);\n if (n.open) item.setAttribute('open', '');\n if (n.active) item.setAttribute('active', '');\n item.append(document.createTextNode(n.label ?? ''), ...build(n.children || []));\n return item;\n });\n for (const old of this.querySelectorAll(':scope > nk-tree-item')) old.remove();\n this.append(...build(list || []));\n }\n get data() { return this._data; }\n\n get activeItem() { return this.querySelector('nk-tree-item[active]'); }\n get value() { return this.activeItem?.value ?? null; }\n}\n\ncustomElements.define('nk-tree', NkTree);\nexport { NkTree };\n","import { NkElement } from '../../base.js';\n\n// <nk-tree-item icon=\"📊\" value=\"overview\" open>\n// Project overview\n// <nk-tree-item icon=\"🚀\" value=\"mvp\" active>NotionKit MVP</nk-tree-item>\n// </nk-tree-item>\n//\n// → <div class=\"nk-tree-item active\"><span class=\"nk-toggle-arrow open\">▸</span>\n// <span class=\"icon\">📊</span><span class=\"label\">…</span>\n// <span class=\"actions\"><span>+</span><span>⋯</span></span></div>\n// <div class=\"nk-tree-children\">…</div>\n//\n// Both halves – the row and the .nk-tree-children box that must be its next\n// sibling – are rendered here. Slots are assigned manually: text becomes the\n// label, nested <nk-tree-item>s become the children, `slot=\"icon\"` /\n// `slot=\"end\"` nodes go where they say. The hover actions are shadow-internal\n// (`.nk-tree-item:hover .actions` is a hover-parent rule) and report through\n// nk-action.\nclass NkTreeItem extends NkElement {\n static get slotAssignment() { return 'manual'; }\n static get observedAttributes() { return ['label', 'icon', 'value', 'href', 'active', 'open', 'compact', 'no-actions']; }\n\n render() {\n this._row = this.createElement('div', ['nk-tree-item'], { role: 'treeitem', tabindex: '-1' });\n this._arrow = this.createElement('span', ['nk-toggle-arrow'], { 'aria-hidden': 'true' });\n this._arrow.textContent = '▸';\n this._iconSlot = this.createElement('slot', [], { name: 'icon' });\n this._icon = this.createElement('span', ['icon']);\n this._iconSlot.appendChild(this._icon);\n this._label = this.createElement('span', ['label']);\n this._labelSlot = this.createElement('slot', [], { name: 'label' });\n this._labelText = document.createTextNode('');\n this._labelSlot.appendChild(this._labelText);\n this._label.appendChild(this._labelSlot);\n this._actions = this.createElement('span', ['actions']);\n for (const [action, glyph, title] of [['add', '+', this.str('add')], ['more', '⋯', this.str('more')]]) {\n const b = this.createElement('span', [], { 'data-action': action, role: 'button', title });\n b.textContent = glyph;\n this._actions.appendChild(b);\n }\n this._endSlot = this.createElement('slot', [], { name: 'end' });\n this._row.append(this._arrow, this._iconSlot, this._label, this._actions, this._endSlot);\n this._children = this.createElement('div', ['nk-tree-children'], { role: 'group' });\n this._childSlot = this.createElement('slot', [], { name: 'children' });\n this._children.appendChild(this._childSlot);\n this._wrapper.append(this._row, this._children);\n this._sync();\n this.closest('nk-tree')?.requestSync?.();\n }\n\n /** Routes light-DOM nodes: nested items → children, slot=\"icon\"/\"end\" → there, the rest → label. */\n assignSlots() {\n if (!this._row) return;\n const icon = [], end = [], children = [], label = [];\n for (const node of this.childNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const slot = node.getAttribute('slot');\n if (slot === 'icon') icon.push(node);\n else if (slot === 'end') end.push(node);\n else if (node.localName === 'nk-tree-item') children.push(node);\n else label.push(node);\n } else if (node.nodeType === Node.TEXT_NODE) {\n // Every text node, empty and blank ones too: a template engine fills\n // an expression's node after the item is built (\"${i} ${title}\"),\n // and the blank node between two expressions is the space.\n label.push(node);\n }\n }\n this._iconSlot.assign(...icon);\n this._endSlot.assign(...end);\n this._childSlot.assign(...children);\n this._labelSlot.assign(...(this.hasAttribute('label') ? [] : label));\n this._hasChildren = children.length > 0;\n this._hasEnd = end.length > 0;\n this._sync();\n }\n\n _sync() {\n const active = this.getBoolAttr('active'), open = this.getBoolAttr('open');\n this._row.classList.toggle('active', active);\n this._row.classList.toggle('compact', this.getBoolAttr('compact'));\n this._row.setAttribute('aria-selected', active ? 'true' : 'false');\n this._arrow.classList.toggle('open', open);\n this._arrow.style.display = this._hasChildren ? '' : 'none';\n if (this._hasChildren) this._row.setAttribute('aria-expanded', open ? 'true' : 'false');\n else this._row.removeAttribute('aria-expanded');\n this._children.classList.toggle('collapsed', !open || !this._hasChildren);\n // Fallback content: write on a change only (see nk-switch).\n const icon = this.getAttribute('icon') || '';\n if (this._icon.textContent !== icon) this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n const label = this.getAttribute('label') || '';\n if (this._labelText.data !== label) this._labelText.data = label;\n // .actions is display:none until hover (a hover-parent rule); `hidden`\n // would lose to that rule, so the block is detached instead.\n const wantActions = !this.getBoolAttr('no-actions') && !this._hasEnd;\n if (wantActions && !this._actions.isConnected) this._row.insertBefore(this._actions, this._endSlot);\n if (!wantActions && this._actions.isConnected) this._actions.remove();\n const href = this.getAttribute('href');\n href ? this._row.setAttribute('data-href', href) : this._row.removeAttribute('data-href');\n }\n\n setupEvents() {\n this._onRowClick = (e) => {\n const action = e.target.closest?.('[data-action]');\n if (action) { e.stopPropagation(); this.emit('nk-action', { action: action.dataset.action, value: this.value, label: this.label }); return; }\n if (e.target === this._arrow || this._arrow.contains(e.target)) { e.stopPropagation(); this.toggle(); return; }\n this.select();\n };\n this._onKey = (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.select(); }\n };\n this._row.addEventListener('click', this._onRowClick);\n this._row.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._row?.removeEventListener('click', this._onRowClick);\n this._row?.removeEventListener('keydown', this._onKey);\n }\n\n onStringsChanged() { for (const b of this._actions.children) b.title = this.str(b.dataset.action); }\n\n onAttributeChanged(name) {\n if (name === 'label') this.assignSlots();\n else this._sync();\n if (name === 'open') this.emit('nk-toggle', { open: this.getBoolAttr('open'), value: this.value });\n }\n\n /** Fires nk-select; a listener may preventDefault to keep the item from becoming active. */\n select() {\n const ok = this.emit('nk-select', { value: this.value, label: this.label, href: this.getAttribute('href'), item: this });\n if (!ok) return;\n const tree = this.closest('nk-tree');\n if (tree) tree.setActive(this);\n else this.setBoolAttr('active', true);\n if (this.getAttribute('href')) location.assign(this.getAttribute('href'));\n }\n\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n focus(options) { this._row?.focus(options); }\n /** Roving tabindex, managed by <nk-tree>. */\n setTabbable(v) { if (this._row) this._row.tabIndex = v ? 0 : -1; }\n get tabbable() { return this._row?.tabIndex === 0; }\n get hasChildren() { return !!this._hasChildren; }\n\n get label() { return this.getAttribute('label') ?? this._labelSlot?.assignedNodes().map(n => n.textContent).join('').trim() ?? ''; }\n set label(v) { this.setAttribute('label', v); }\n get value() { return this.getAttribute('value') ?? this.label; }\n set value(v) { this.setAttribute('value', v); }\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get compact() { return this.getBoolAttr('compact'); }\n set compact(v) { this.setBoolAttr('compact', v); }\n}\n\ncustomElements.define('nk-tree-item', NkTreeItem);\nexport { NkTreeItem };\n","import { NkElement } from '../../base.js';\n\n// <nk-topbar>\n// <nk-breadcrumb>…</nk-breadcrumb>\n// <nk-btn slot=\"actions\" variant=\"share\">Share</nk-btn>\n// <nk-theme-toggle slot=\"actions\"></nk-theme-toggle>\n// </nk-topbar>\n// → <div class=\"nk-topbar\">…<div class=\"nk-topbar-actions\">…</div></div>\n// display:contents host, so the bar is a direct flex child of .nk-main.\nclass NkTopbar extends NkElement {\n\n render() {\n const bar = this.createElement('div', ['nk-topbar']);\n bar.appendChild(document.createElement('slot'));\n const actions = this.createElement('div', ['nk-topbar-actions']);\n actions.appendChild(this.createElement('slot', [], { name: 'actions' }));\n bar.appendChild(actions);\n this._wrapper.appendChild(bar);\n }\n}\n\ncustomElements.define('nk-topbar', NkTopbar);\nexport { NkTopbar };\n","import { NkElement } from '../../base.js';\n\n// <nk-breadcrumb>\n// <a href=\"/overview\">📊 Project overview</a>\n// <span>🚀 NotionKit MVP</span>\n// </nk-breadcrumb>\n// → <nav class=\"nk-breadcrumb\"><a class=\"crumb\">…</a><span class=\"sep\">/</span><span class=\"crumb current\">…</span></nav>\n//\n// The children are *cloned* into the shadow tree so the separators can be\n// interleaved and `.crumb:hover` (no ::slotted twin) applies. A\n// MutationObserver keeps the copy in step. Clicking a clone fires nk-select\n// and, unless prevented, forwards the click to the original – so an <a>\n// navigates exactly once and framework listeners see it.\nclass NkBreadcrumb extends NkElement {\n static get observedAttributes() { return ['separator']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._nav = this.createElement('nav', ['nk-breadcrumb'], { 'aria-label': this.str('breadcrumb') });\n this._wrapper.appendChild(this._nav);\n this.projectLightDom();\n }\n\n projectLightDom() {\n if (!this._nav) return;\n const originals = [...this.children];\n const sep = this.getAttribute('separator') ?? '/';\n const signature = originals.map(o => o.outerHTML).join('') + sep;\n if (signature === this._signature) return;\n this._signature = signature;\n this._nav.innerHTML = '';\n const explicitCurrent = originals.some(o => o.hasAttribute('current') || o.classList.contains('current'));\n originals.forEach((original, i) => {\n if (i > 0) {\n const s = this.createElement('span', ['sep'], { 'aria-hidden': 'true' });\n s.textContent = sep;\n this._nav.appendChild(s);\n }\n const clone = original.cloneNode(true);\n clone.removeAttribute('slot');\n clone.classList.add('crumb');\n const current = explicitCurrent ? (original.hasAttribute('current') || original.classList.contains('current')) : i === originals.length - 1;\n clone.classList.toggle('current', current);\n if (current) clone.setAttribute('aria-current', 'page');\n clone.dataset.index = i;\n this._nav.appendChild(clone);\n });\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const clone = e.target.closest('.crumb');\n if (!clone) return;\n e.preventDefault();\n const index = Number(clone.dataset.index);\n // Look the original up at click time: a framework may have replaced it.\n const original = this.children[index];\n const ok = this.emit('nk-select', {\n index, label: clone.textContent.trim(), href: original?.getAttribute('href') ?? null,\n value: original?.dataset.value ?? original?.getAttribute('href') ?? clone.textContent.trim(),\n current: clone.classList.contains('current'),\n });\n if (ok) original?.click();\n };\n this._nav.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._nav?.removeEventListener('click', this._onClick); }\n\n onAttributeChanged() { this.projectLightDom(); }\n onStringsChanged() { this._nav.setAttribute('aria-label', this.str('breadcrumb')); }\n\n get separator() { return this.getAttribute('separator') ?? '/'; }\n set separator(v) { this.setAttribute('separator', v); }\n}\n\ncustomElements.define('nk-breadcrumb', NkBreadcrumb);\nexport { NkBreadcrumb };\n","import { NkElement, getCurrentTheme } from '../../base.js';\n\n// <nk-theme-toggle slot=\"actions\"></nk-theme-toggle>\n// → <button class=\"nk-topbar-btn nk-theme-toggle\">🌙</button>\n// Flips data-theme on <html> (the only theme source), remembers the choice in\n// localStorage (`storage-key`, default nk-theme), applies a stored or\n// system preference on first connect when <html> carries no theme yet, and\n// accepts postMessage({ nkTheme }) from a parent page (the landing page's\n// embedded demo uses that).\nclass NkThemeToggle extends NkElement {\n static get observedAttributes() { return ['storage-key', 'title'];\n\n }\n\n render() {\n this._btn = this.createElement('button', ['nk-topbar-btn', 'nk-theme-toggle'], { type: 'button' });\n this._syncTitle();\n this._wrapper.appendChild(this._btn);\n const root = document.documentElement;\n let stored = null;\n try { stored = localStorage.getItem(this.storageKey); } catch {}\n if (stored === 'light' || stored === 'dark') root.setAttribute('data-theme', stored);\n else if (!root.hasAttribute('data-theme')) root.setAttribute('data-theme', matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');\n this._syncGlyph();\n }\n\n _syncGlyph() {\n if (this._btn) this._btn.textContent = getCurrentTheme() === 'dark' ? '☀️' : '🌙';\n }\n\n _syncTheme(theme) {\n super._syncTheme(theme);\n this._syncGlyph();\n }\n\n setupEvents() {\n this._onClick = () => this.apply(getCurrentTheme() === 'dark' ? 'light' : 'dark');\n this._onMessage = (e) => { const t = e.data?.nkTheme; if (t === 'light' || t === 'dark') this.apply(t); };\n this._btn.addEventListener('click', this._onClick);\n window.addEventListener('message', this._onMessage);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n window.removeEventListener('message', this._onMessage);\n }\n\n _syncTitle() { this._btn.title = this.getAttribute('title') || this.str('toggleTheme'); }\n onStringsChanged() { this._syncTitle(); }\n\n onAttributeChanged(name) {\n if (name === 'title' && this._btn) this._syncTitle();\n }\n\n /** Sets the theme on <html>, persists it and reports it. */\n apply(theme) {\n document.documentElement.setAttribute('data-theme', theme);\n try { localStorage.setItem(this.storageKey, theme); } catch {}\n this._syncGlyph();\n this.emit('nk-change', { value: theme });\n }\n\n get storageKey() { return this.getAttribute('storage-key') || 'nk-theme'; }\n get value() { return getCurrentTheme(); }\n set value(v) { this.apply(v); }\n}\n\ncustomElements.define('nk-theme-toggle', NkThemeToggle);\nexport { NkThemeToggle };\n","import { NkElement } from '../../base.js';\n\n// <nk-tab-bar value=\"inbox\">\n// <nk-tab-bar-item icon=\"🏠\" value=\"home\">Home</nk-tab-bar-item>\n// <nk-tab-bar-item icon=\"📥\" value=\"inbox\">Inbox</nk-tab-bar-item>\n// <nk-tab-bar-item icon=\"☰\" drawer>More</nk-tab-bar-item>\n// </nk-tab-bar>\n// → <nav class=\"nk-tab-bar\">…</nav>\n//\n// The thumb-reachable twin of the sidebar for phones and installed PWAs. As\n// the last child of <nk-app> it is slotted into .nk-main below the scrolling\n// page, so it never moves and needs no bottom padding anywhere. The\n// stylesheet hides it above 860px – there the sidebar is the navigation –\n// and shows it below; `always` shows it at every width (previews, phone\n// frames), `fixed` pins it to the viewport (standalone PWAs) with a spacer\n// holding its place, `floating` makes it a capsule. The item whose value is\n// the bar's `value` is `active`; a `drawer` item opens the sidebar instead of\n// becoming active when clicked. A value no item has – a page without a tab\n// of its own, opened from the drawer – marks the drawer item, as iOS marks\n// \"More\" (1.18.0); without one no item is active. Without a value the item\n// marked `active`, else the first, is the one.\nclass NkTabBar extends NkElement {\n static get observedAttributes() { return ['value', 'always', 'fixed', 'floating', 'label']; }\n\n render() {\n this._bar = this.createElement('nav', ['nk-tab-bar']);\n this._slot = document.createElement('slot');\n this._bar.appendChild(this._slot);\n // With `fixed` the bar leaves the flow; the spacer (styled by the\n // stylesheet, shown only then) keeps its height so the page ends above it.\n this._spacer = this.createElement('div', ['nk-tab-bar-spacer']);\n this._wrapper.append(this._bar, this._spacer);\n this._syncBar();\n this._sync();\n }\n\n get items() { return [...this.querySelectorAll(':scope > nk-tab-bar-item')]; }\n\n // Attribute access only: on the first connect the children are in the DOM\n // but not yet upgraded, so their accessors do not exist.\n _valueOf(item) { return item.getAttribute('value') ?? item.getAttribute('label') ?? item.textContent.trim(); }\n\n _syncBar() {\n this._bar.classList.toggle('always', this.getBoolAttr('always'));\n this._bar.classList.toggle('fixed', this.getBoolAttr('fixed'));\n this._bar.classList.toggle('floating', this.getBoolAttr('floating'));\n const label = this.getAttribute('label');\n label ? this._bar.setAttribute('aria-label', label) : this._bar.removeAttribute('aria-label');\n }\n\n _sync() {\n const items = this.items.filter(i => !i.hasAttribute('drawer')), drawers = this.items.filter(i => i.hasAttribute('drawer'));\n if (!items.length) return;\n let value = this.getAttribute('value');\n if (value === null) {\n const preset = items.find(i => i.hasAttribute('active')) || items[0];\n value = this._valueOf(preset);\n }\n const known = items.some(i => this._valueOf(i) === value);\n for (const item of items) {\n if (this._valueOf(item) === value) item.setAttribute('active', ''); else item.removeAttribute('active');\n }\n drawers.forEach((item, n) => { if (!known && n === 0) item.setAttribute('active', ''); else item.removeAttribute('active'); });\n this._value = value;\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._slot.addEventListener('slotchange', this._onSlot);\n this._sync();\n }\n\n teardownEvents() {\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged(name) {\n if (name !== 'value') { this._syncBar(); return; }\n const before = this._value;\n this._sync();\n if (this._value !== before) this.emit('nk-change', { value: this._value });\n }\n\n get value() { return this._value ?? this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n get always() { return this.getBoolAttr('always'); }\n set always(v) { this.setBoolAttr('always', v); }\n get fixed() { return this.getBoolAttr('fixed'); }\n set fixed(v) { this.setBoolAttr('fixed', v); }\n get floating() { return this.getBoolAttr('floating'); }\n set floating(v) { this.setBoolAttr('floating', v); }\n}\n\ncustomElements.define('nk-tab-bar', NkTabBar);\nexport { NkTabBar };\n","import { NkElement } from '../../base.js';\n\n// <nk-tab-bar-item icon=\"📥\" value=\"inbox\" active>Inbox</nk-tab-bar-item>\n// → <button class=\"nk-tab-bar-item active\" type=\"button\">\n// <span class=\"icon\">📥</span><span class=\"label\">Inbox</span></button>\n//\n// One destination of <nk-tab-bar>. A click emits nk-select (cancelable);\n// inside a bar it then moves the bar's `value`, standalone it sets its own\n// `active`. With `href` it navigates afterwards, with `drawer` it opens the\n// nearest <nk-sidebar> as a drawer instead of becoming active – the usual\n// fifth item (\"More\"). The icon is an attribute or a `slot=\"icon\"` node.\nclass NkTabBarItem extends NkElement {\n static get observedAttributes() { return ['icon', 'label', 'value', 'href', 'active', 'disabled', 'drawer']; }\n\n render() {\n this._btn = this.createElement('button', ['nk-tab-bar-item'], { type: 'button' });\n this._iconSlot = this.createElement('slot', [], { name: 'icon' });\n this._icon = this.createElement('span', ['icon'], { 'aria-hidden': 'true' });\n this._iconSlot.appendChild(this._icon);\n this._label = this.createElement('span', ['label']);\n this._labelSlot = document.createElement('slot');\n this._labelText = document.createTextNode('');\n this._labelSlot.appendChild(this._labelText);\n this._label.appendChild(this._labelSlot);\n this._btn.append(this._iconSlot, this._label);\n this._wrapper.appendChild(this._btn);\n this._sync();\n }\n\n _sync() {\n this._icon.textContent = this.getAttribute('icon') ?? '';\n this._labelText.data = this.getAttribute('label') ?? '';\n const active = this.getBoolAttr('active');\n this._btn.classList.toggle('active', active);\n active ? this._btn.setAttribute('aria-current', 'page') : this._btn.removeAttribute('aria-current');\n this._btn.disabled = this.getBoolAttr('disabled');\n const href = this.getAttribute('href');\n href ? this._btn.setAttribute('data-href', href) : this._btn.removeAttribute('data-href');\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._btn.addEventListener('click', this._onClick);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onClick);\n }\n\n select() {\n if (this.getBoolAttr('disabled')) return;\n const href = this.getAttribute('href');\n const ok = this.emit('nk-select', { value: this.value, label: this.label, href, item: this, drawer: this.getBoolAttr('drawer') });\n if (!ok) return;\n if (this.getBoolAttr('drawer')) {\n const sidebar = this.closest('nk-app')?.querySelector('nk-sidebar') ?? document.querySelector('nk-sidebar');\n sidebar?.toggle?.();\n return;\n }\n const bar = this.closest('nk-tab-bar');\n if (bar) bar.value = this.value;\n else this.setBoolAttr('active', true);\n if (href) location.assign(href);\n }\n\n onAttributeChanged() { this._sync(); }\n focus(o) { this._btn?.focus(o); }\n\n get value() { return this.getAttribute('value') ?? this.label; }\n set value(v) { this.setAttribute('value', v); }\n get label() { return this.getAttribute('label') ?? this.textContent.trim(); }\n set label(v) { this.setAttribute('label', v); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n get disabled() { return this.getBoolAttr('disabled'); }\n set disabled(v) { this.setBoolAttr('disabled', v); }\n get drawer() { return this.getBoolAttr('drawer'); }\n set drawer(v) { this.setBoolAttr('drawer', v); }\n}\n\ncustomElements.define('nk-tab-bar-item', NkTabBarItem);\nexport { NkTabBarItem };\n","import { NkElement } from '../../base.js';\n\n// <nk-page icon=\"🚀\" cover full small>\n// <nk-page-title>NotionKit MVP</nk-page-title>\n// <nk-page-actions>…</nk-page-actions>\n// <p class=\"lead\">…</p>\n// …blocks…\n// </nk-page>\n// → <div class=\"nk-page-scroll\"><div class=\"nk-cover\"></div><div class=\"nk-page\">\n// <div class=\"nk-page-icon\">🚀</div>…</div></div>\n//\n// The host is display:contents, so .nk-page-scroll is the flex child of\n// .nk-main that scrolls. `narrow` drops the scroll wrapper for pages that are\n// the document itself (landing / docs skeleton). The page icon is rendered\n// here because its ::slotted twin is keyed on the parent (.nk-page). `full` and\n// `small` are Notion's page options – full width, 14px text – set on the page.\nclass NkPage extends NkElement {\n static get observedAttributes() { return ['icon', 'cover', 'narrow', 'full', 'small']; }\n\n render() {\n this._page = this.createElement('div', ['nk-page']);\n this._icon = this.createElement('div', ['nk-page-icon'], { role: 'button', title: this.str('changeIcon') });\n this._iconSlot = this.createElement('slot', [], { name: 'icon' });\n this._iconSlot.appendChild(this._icon);\n this._page.appendChild(this._iconSlot);\n this._page.appendChild(document.createElement('slot'));\n this._cover = this.createElement('div', ['nk-cover']);\n this._coverSlot = this.createElement('slot', [], { name: 'cover' });\n this._coverSlot.appendChild(this._cover);\n this._build();\n }\n\n _build() {\n this._wrapper.replaceChildren();\n if (this.getBoolAttr('narrow')) {\n this._wrapper.append(this._coverSlot, this._page);\n } else {\n const scroll = this.createElement('div', ['nk-page-scroll']);\n scroll.append(this._coverSlot, this._page);\n this._wrapper.appendChild(scroll);\n }\n this._sync();\n }\n\n _sync() {\n const icon = this.getAttribute('icon') || '';\n // Fallback content: write on a change only (see nk-switch).\n if (this._icon.textContent !== icon) this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n this._cover.style.display = this.getBoolAttr('cover') ? '' : 'none';\n // `covered` is the stylesheet's twin of `.nk-cover + .nk-page` with an\n // icon: the icon overlaps the cover and the page drops its top padding.\n // Without a cover (attribute or a slotted nk-page-cover) the icon sits in\n // the padding; without an icon (attribute or slot=\"icon\") the page keeps\n // it, so the title never touches the cover (NotionKit 1.13.0).\n const filled = slot => slot.assignedNodes().some(n => n.nodeType === Node.ELEMENT_NODE || n.data.trim());\n const covered = this.getBoolAttr('cover') || filled(this._coverSlot), iconed = !!icon || filled(this._iconSlot);\n this._page.classList.toggle('covered', covered && iconed);\n this._page.classList.toggle('full', this.getBoolAttr('full'));\n this._page.classList.toggle('small', this.getBoolAttr('small'));\n }\n\n setupEvents() {\n this._onIcon = () => this.emit('nk-action', { action: 'icon', value: this.getAttribute('icon') });\n this._onCover = () => this._sync();\n this._icon.addEventListener('click', this._onIcon);\n this._coverSlot.addEventListener('slotchange', this._onCover);\n this._iconSlot.addEventListener('slotchange', this._onCover);\n this._sync();\n }\n\n teardownEvents() {\n this._icon?.removeEventListener('click', this._onIcon);\n this._coverSlot?.removeEventListener('slotchange', this._onCover);\n this._iconSlot?.removeEventListener('slotchange', this._onCover);\n }\n\n onStringsChanged() { this._icon.title = this.str('changeIcon'); }\n\n onAttributeChanged(name) {\n if (name === 'narrow') this._build();\n else this._sync();\n }\n\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n get cover() { return this.getBoolAttr('cover'); }\n set cover(v) { this.setBoolAttr('cover', v); }\n get full() { return this.getBoolAttr('full'); }\n set full(v) { this.setBoolAttr('full', v); }\n get small() { return this.getBoolAttr('small'); }\n set small(v) { this.setBoolAttr('small', v); }\n}\n\ncustomElements.define('nk-page', NkPage);\nexport { NkPage };\n","import { NkElement } from '../../base.js';\n\n// <nk-page-cover slot=\"cover\"></nk-page-cover> → the token gradient\n// <nk-page-cover slot=\"cover\" src=\"cover.jpg\" position=\"center 30%\"></nk-page-cover> → a picture\n// → <div class=\"nk-cover\"><img src=\"cover.jpg\" alt=\"\"></div>: the picture fills\n// the band, cropped rather than stretched; `position` moves the crop, as\n// Notion's \"Reposition\" does. The gradient stays underneath while it loads.\n// The band is as tall as the token --nk-cover-height (200px), which reaches\n// the shadow root: style=\"--nk-cover-height: 30vh\" sets one cover.\nclass NkPageCover extends NkElement {\n static get observedAttributes() { return ['src', 'position']; }\n\n render() {\n this._cover = this.createElement('div', ['nk-cover']);\n this._img = this.createElement('img', [], { alt: '' });\n this._wrapper.appendChild(this._cover);\n this._sync();\n }\n\n _sync() {\n const src = this.getAttribute('src');\n if (src) {\n this._img.src = src;\n this._img.style.objectPosition = this.getAttribute('position') || '';\n if (!this._img.isConnected) this._cover.appendChild(this._img);\n } else this._img.remove();\n }\n\n onAttributeChanged() { this._sync(); }\n\n get src() { return this.getAttribute('src'); }\n set src(v) { v == null ? this.removeAttribute('src') : this.setAttribute('src', v); }\n}\n\ncustomElements.define('nk-page-cover', NkPageCover);\nexport { NkPageCover };\n","import { NkElement } from '../../base.js';\n\n// <nk-page-title>NotionKit MVP</nk-page-title> → <h1 class=\"nk-page-title\">\n// <nk-page-title editable placeholder=\"Untitled\">…</nk-page-title>\n// With `editable` the text is copied into the shadow heading (contenteditable\n// cannot edit slotted nodes) and nk-change fires on blur / Enter.\nclass NkPageTitle extends NkElement {\n static get observedAttributes() { return ['editable', 'placeholder', 'value']; }\n static get observesLightDom() { return true; }\n\n render() {\n this._h1 = this.createElement('h1', ['nk-page-title']);\n this._slot = document.createElement('slot');\n this._h1.appendChild(this._slot);\n this._wrapper.appendChild(this._h1);\n this._sync();\n }\n\n _sync() {\n const editable = this.getBoolAttr('editable');\n if (editable) {\n if (this._slot.isConnected) this._slot.remove();\n this._h1.setAttribute('contenteditable', 'plaintext-only');\n this._h1.setAttribute('spellcheck', 'false');\n this._h1.setAttribute('role', 'textbox');\n this._h1.setAttribute('aria-label', this.str('title'));\n const text = this.getAttribute('value') ?? this.textContent.trim();\n if (this._h1.textContent !== text && document.activeElement !== this) this._h1.textContent = text;\n this._h1.setAttribute('data-placeholder', this.getAttribute('placeholder') || '');\n } else {\n this._h1.removeAttribute('contenteditable');\n this._h1.removeAttribute('role');\n if (this.hasAttribute('value')) { if (this._slot.isConnected) this._slot.remove(); this._h1.textContent = this.getAttribute('value'); }\n else if (!this._slot.isConnected) { this._h1.textContent = ''; this._h1.appendChild(this._slot); }\n }\n }\n\n projectLightDom() { if (this._h1 && !this.hasAttribute('value')) this._sync(); }\n\n setupEvents() {\n this._committed = this.value;\n this._onKey = (e) => { if (e.key === 'Enter') { e.preventDefault(); this._h1.blur(); } };\n this._onBlur = () => this._commit();\n this._h1.addEventListener('keydown', this._onKey);\n this._h1.addEventListener('blur', this._onBlur);\n }\n\n teardownEvents() {\n this._h1?.removeEventListener('keydown', this._onKey);\n this._h1?.removeEventListener('blur', this._onBlur);\n }\n\n _commit() {\n const value = this._h1.textContent.trim();\n if (value === this._committed) return;\n this._committed = value;\n this.emit('nk-change', { value });\n }\n\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { if (this._h1.hasAttribute('role')) this._h1.setAttribute('aria-label', this.str('title')); }\n\n get value() { return this.getBoolAttr('editable') ? (this._h1?.textContent.trim() ?? '') : (this.getAttribute('value') ?? this.textContent.trim()); }\n set value(v) { this.setAttribute('value', v); }\n get editable() { return this.getBoolAttr('editable'); }\n set editable(v) { this.setBoolAttr('editable', v); }\n focus(o) { this._h1?.focus(o); }\n}\n\ncustomElements.define('nk-page-title', NkPageTitle);\nexport { NkPageTitle };\n","import { NkElement } from '../../base.js';\n\n// <nk-page-actions><span>👤 Ada</span><span>📅 12 May</span><span>🏷️ <nk-tag color=\"purple\">Design</nk-tag></span></nk-page-actions>\n// → <div class=\"nk-page-meta\">…</div> – the meta row under the title\nclass NkPageActions extends NkElement {\n render() {\n const row = this.createElement('div', ['nk-page-meta']);\n row.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(row);\n }\n}\n\ncustomElements.define('nk-page-actions', NkPageActions);\nexport { NkPageActions };\n","import { NkElement } from '../../base.js';\n\n// <nk-block-host handle><p>Editable content lives here.</p></nk-block-host>\n// → <div class=\"nk-block-host\"><span class=\"nk-block-handle\">⠿</span>…</div>\n// The optical shell for editor content (hover wash, focus ring, drop target).\n// Mount an editor into the light DOM; <nk-editor> (v1.1) does that for TipTap.\nclass NkBlockHost extends NkElement {\n static get observedAttributes() { return ['handle', 'drop-target']; }\n\n render() {\n this._box = this.createElement('div', ['nk-block-host']);\n this._handle = this.createElement('span', ['nk-block-handle'], { 'aria-hidden': 'true' });\n this._handle.textContent = '⠿';\n this._box.appendChild(this._handle);\n this._box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n this._handle.style.display = this.getBoolAttr('handle') ? '' : 'none';\n this._box.classList.toggle('nk-drop-target', this.getBoolAttr('drop-target'));\n }\n\n onAttributeChanged() { this._sync(); }\n\n get handle() { return this.getBoolAttr('handle'); }\n set handle(v) { this.setBoolAttr('handle', v); }\n get dropTarget() { return this.getBoolAttr('drop-target'); }\n set dropTarget(v) { this.setBoolAttr('drop-target', v); }\n}\n\ncustomElements.define('nk-block-host', NkBlockHost);\nexport { NkBlockHost };\n","import { NkElement } from '../../base.js';\n\n// <nk-banner variant=\"info\">ℹ️ <span>Text</span><button slot=\"action\" type=\"button\">Open</button></nk-banner>\n// → <div class=\"nk-banner info\">…<button class=\"b-action\" type=\"button\">Open</button></div>\n//\n// The action is a <button>, which NotionKit (1.11.0) strips down to\n// underlined text; below 860px it moves under the text.\nconst VARIANTS = ['info', 'success', 'warning', 'danger'];\n\nclass NkBanner extends NkElement {\n static get observedAttributes() { return ['variant']; }\n\n render() {\n this._box = this.createElement('div', this._classes(), { role: 'status' });\n this._box.appendChild(document.createElement('slot'));\n this._box.appendChild(this.createElement('slot', [], { name: 'action' }));\n this._wrapper.appendChild(this._box);\n }\n\n _classes() {\n const v = this.getAttribute('variant');\n return ['nk-banner', ...(VARIANTS.includes(v) ? [v] : [])];\n }\n\n onAttributeChanged() { if (this._box) this._box.className = this._classes().join(' '); }\n\n get variant() { return this.getAttribute('variant'); }\n set variant(v) { v ? this.setAttribute('variant', v) : this.removeAttribute('variant'); }\n}\n\ncustomElements.define('nk-banner', NkBanner);\nexport { NkBanner };\n","import { NkElement } from '../../base.js';\n\n// <nk-empty icon=\"🗂️\" title=\"No entries yet\" desc=\"Create the first one.\"><nk-btn variant=\"primary\" small>+ New</nk-btn></nk-empty>\n// → <div class=\"nk-empty\"><div class=\"e-icon\">🗂️</div><div class=\"e-title\">…</div><div class=\"e-desc\">…</div><div class=\"e-actions\">…</div></div>\n// `title` is the heading, never a tooltip – see NkElement.takeTitle(). The\n// default slot sits in .e-actions, so several buttons keep 8px apart.\nclass NkEmpty extends NkElement {\n static get observedAttributes() { return ['icon', 'title', 'desc']; }\n\n render() {\n const box = this.createElement('div', ['nk-empty']);\n this._parts = {};\n for (const [slot, cls] of [['icon', 'e-icon'], ['title', 'e-title'], ['desc', 'e-desc']]) {\n const el = this.createElement('div', [cls]);\n const s = this.createElement('slot', [], { name: slot });\n s.appendChild(el);\n box.appendChild(s);\n this._parts[slot] = el;\n }\n const actions = this.createElement('div', ['e-actions']);\n actions.appendChild(document.createElement('slot'));\n box.appendChild(actions);\n this._wrapper.appendChild(box);\n this.takeTitle();\n this._sync();\n }\n\n _sync() {\n for (const [slot, el] of Object.entries(this._parts)) {\n const v = slot === 'title' ? this._titleText : this.getAttribute(slot);\n el.textContent = v || '';\n el.style.display = v ? '' : 'none';\n }\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n}\n\ncustomElements.define('nk-empty', NkEmpty);\nexport { NkEmpty };\n","import { NkElement } from '../../base.js';\n\n// <nk-skeleton height=\"18\" width=\"60%\"></nk-skeleton>\n// <nk-skeleton lines=\"3\" widths=\"100%,85%,40%\"></nk-skeleton>\n// → <div class=\"nk-skeleton\" style=\"height:…;width:…\"></div> × lines\nclass NkSkeleton extends NkElement {\n static get observedAttributes() { return ['lines', 'height', 'width', 'widths']; }\n\n render() { this._build(); }\n\n _build() {\n this._wrapper.replaceChildren();\n const lines = Math.max(1, Number(this.getAttribute('lines')) || 1);\n const height = this.getAttribute('height') || '13';\n const widths = (this.getAttribute('widths') || '').split(',').map(s => s.trim()).filter(Boolean);\n const width = this.getAttribute('width');\n for (let i = 0; i < lines; i++) {\n const line = this.createElement('div', ['nk-skeleton'], { 'aria-hidden': 'true' });\n line.style.height = /^\\d+(\\.\\d+)?$/.test(height) ? `${height}px` : height;\n const w = widths[i] ?? width;\n if (w) line.style.width = w;\n this._wrapper.appendChild(line);\n }\n }\n\n onAttributeChanged() { this._build(); }\n}\n\ncustomElements.define('nk-skeleton', NkSkeleton);\nexport { NkSkeleton };\n","import { NkElement } from '../../base.js';\n\n// <nk-synced badge=\"⟳ 3 places\">…</nk-synced>\n// → <div class=\"nk-synced\"><span class=\"synced-badge\">⟳ 3 places</span>…</div>\nclass NkSynced extends NkElement {\n static get observedAttributes() { return ['badge']; }\n\n render() {\n const box = this.createElement('div', ['nk-synced']);\n this._badge = this.createElement('span', ['synced-badge']);\n box.appendChild(this._badge);\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() { this._badge.textContent = this.getAttribute('badge') ?? this.str('synced'); }\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n\n get badge() { return this.getAttribute('badge'); }\n set badge(v) { this.setAttribute('badge', v); }\n}\n\ncustomElements.define('nk-synced', NkSynced);\nexport { NkSynced };\n","// Placement for elements that float over the page – <nk-menu floating>,\n// <nk-calendar floating>, <nk-tooltip>: the host is a fixed box put under\n// its anchor. A transformed ancestor – an open nk-modal or nk-dialog –\n// becomes the containing block of a fixed box, so the frame it really sits\n// in is measured and taken off.\n\n/** The border box of an element, or of the first descendant with one (display: contents hosts). */\nexport function boxOf(el) {\n if (el.getClientRects().length) return el.getBoundingClientRect();\n for (const child of [...(el.shadowRoot?.children ?? []), ...el.children]) {\n const r = boxOf(child);\n if (r.width || r.height) return r;\n }\n return el.getBoundingClientRect();\n}\n\n/**\n * Where a fixed `host` really sits: the viewport position of its containing\n * block's left, top and right edges – the viewport's own, unless a\n * transformed ancestor takes its place – and the host's size.\n */\nfunction frameOf(host) {\n const s = host.style;\n s.top = '0px'; s.left = '0px'; s.right = 'auto';\n const a = host.getBoundingClientRect();\n s.left = 'auto'; s.right = '0px';\n const b = host.getBoundingClientRect();\n return { x: a.left, y: a.top, right: b.right, width: a.width, height: a.height };\n}\n\n/**\n * Puts `host` 6px below `target` – an element or a rect ({ left, top, right,\n * bottom }, a DOMRect) – centred on it: above with side=\"top\", or where the\n * window ends below; kept 8px inside the window. For <nk-tooltip>.\n */\nexport function placeNear(host, target, side = 'bottom', gap = 6) {\n const r = target instanceof Element ? boxOf(target) : target;\n const f = frameOf(host), w = f.width, h = f.height;\n const below = r.bottom + gap, above = r.top - gap - h;\n const top = side === 'top' ? (above < 8 ? below : above) : (below + h > innerHeight - 8 ? above : below);\n const left = Math.min(Math.max(8, (r.left + r.right) / 2 - w / 2), innerWidth - 8 - w);\n host.style.top = `${Math.round(top - f.y)}px`;\n host.style.left = `${Math.round(left - f.x)}px`;\n host.style.right = 'auto';\n}\n\n/**\n * Puts `host` 6px under `anchor`, right edges aligned – left edges with\n * align=\"start\". Where the window ends below and there is more room above,\n * it opens upwards; either way --_nk-float-max caps its height to the room\n * there, and a longer menu scrolls.\n */\nexport function placeUnder(host, anchor, align) {\n const r = boxOf(anchor), gap = 6, edge = 8;\n host.style.removeProperty('--_nk-float-max');\n const f = frameOf(host);\n const roomBelow = innerHeight - r.bottom - gap - edge, roomAbove = r.top - gap - edge;\n const up = f.height > roomBelow && roomAbove > roomBelow;\n const room = Math.max(0, Math.floor(up ? roomAbove : roomBelow));\n if (f.height > room) host.style.setProperty('--_nk-float-max', `${room}px`);\n host.style.top = `${(up ? r.top - gap - Math.min(f.height, room) : r.bottom + gap) - f.y}px`;\n if (align === 'start') { host.style.left = `${r.left - f.x}px`; host.style.right = 'auto'; }\n else { host.style.right = `${f.right - Math.min(r.right, innerWidth - edge)}px`; host.style.left = 'auto'; }\n}\n","import { NkElement } from '../../base.js';\nimport { boxOf } from '../../util/floating.js';\n\n// <nk-tabs value=\"notes\">\n// <nk-tab value=\"notes\">📝 Notes</nk-tab>\n// <nk-tab value=\"tasks\">✅ Tasks</nk-tab>\n// <div slot=\"panel\" data-tab=\"notes\" class=\"nk-tab-panel\">…</div>\n// <div slot=\"panel\" data-tab=\"tasks\" class=\"nk-tab-panel\">…</div>\n// </nk-tabs>\n// → <div class=\"nk-tabs\" role=\"tablist\">…</div> + the panels below it.\n// The tabs keep one tab active and hide every panel whose data-tab does not\n// match `value` (through the hidden attribute – the panels stay yours).\n// `scroll` (NotionKit 1.12.0) keeps many tabs in one row that scrolls\n// sideways and holds the active tab in view – after the first layout, on\n// every change and when the row's width changes – as <nk-segmented scroll>.\nconst KEYS = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n\nclass NkTabs extends NkElement {\n static get observedAttributes() { return ['value', 'scroll']; }\n\n render() {\n this._strip = this.createElement('div', ['nk-tabs'], { role: 'tablist' });\n this._tabSlot = document.createElement('slot');\n this._strip.appendChild(this._tabSlot);\n this._panelSlot = this.createElement('slot', [], { name: 'panel' });\n this._wrapper.append(this._strip, this._panelSlot);\n this._sync();\n }\n\n get tabs() { return [...this.querySelectorAll(':scope > nk-tab')]; }\n get panels() { return [...this.querySelectorAll(':scope > [slot=\"panel\"]')]; }\n\n _sync() {\n const tabs = this.tabs;\n if (!tabs.length) return;\n let value = this.getAttribute('value');\n if (value === null || !tabs.some(t => t.getAttribute('value') === value || (t.getAttribute('value') === null && t.textContent.trim() === value))) {\n const preset = tabs.find(t => t.hasAttribute('active')) || tabs[0];\n value = preset.getAttribute('value') ?? preset.textContent.trim();\n }\n for (const tab of tabs) {\n const v = tab.getAttribute('value') ?? tab.textContent.trim();\n if (v === value) tab.setAttribute('active', ''); else tab.removeAttribute('active');\n }\n for (const panel of this.panels) panel.hidden = panel.dataset.tab !== value;\n this._value = value;\n this._strip.classList.toggle('scroll', this.getBoolAttr('scroll'));\n this._reveal(this._revealed ? 'smooth' : 'instant');\n }\n\n /** Scrolls the row the least distance that shows the active tab whole. */\n _reveal(behavior) {\n if (!this.getBoolAttr('scroll') || !this._strip?.clientWidth) return;\n const tab = this.tabs.find(t => t.hasAttribute('active'));\n if (!tab) return;\n const row = this._strip.getBoundingClientRect(), r = boxOf(tab), pad = 8;\n const delta = r.left < row.left ? r.left - row.left - pad : r.right > row.right ? r.right - row.right + pad : 0;\n const smooth = behavior === 'smooth' && !matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (delta) this._strip.scrollBy({ left: delta, behavior: smooth ? 'smooth' : 'instant' });\n this._revealed = true;\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._onKey = (e) => {\n const dir = KEYS[e.key];\n if (!dir) return;\n const tabs = this.tabs.filter(t => !t.hasAttribute('disabled'));\n const i = tabs.indexOf(e.target.closest?.('nk-tab'));\n if (i < 0 || tabs.length < 2) return;\n e.preventDefault();\n const next = tabs[(i + dir + tabs.length) % tabs.length];\n next.select();\n next.focus();\n };\n this._tabSlot.addEventListener('slotchange', this._onSlot);\n this._panelSlot.addEventListener('slotchange', this._onSlot);\n this.addEventListener('keydown', this._onKey);\n this._resize = new ResizeObserver(() => this._reveal('instant'));\n this._resize.observe(this._strip);\n this._sync();\n }\n\n teardownEvents() {\n this._tabSlot?.removeEventListener('slotchange', this._onSlot);\n this._panelSlot?.removeEventListener('slotchange', this._onSlot);\n this.removeEventListener('keydown', this._onKey);\n this._resize?.disconnect();\n }\n\n onAttributeChanged() {\n const before = this._value;\n this._sync();\n if (this._value !== before) this.emit('nk-change', { value: this._value });\n }\n\n get value() { return this._value ?? this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n get scroll() { return this.getBoolAttr('scroll'); }\n set scroll(v) { this.setBoolAttr('scroll', v); }\n}\n\ncustomElements.define('nk-tabs', NkTabs);\nexport { NkTabs };\n","import { NkElement } from '../../base.js';\n\n// <nk-tab value=\"notes\" active>📝 Notes</nk-tab> → <span class=\"nk-tab active\" role=\"tab\">\nclass NkTab extends NkElement {\n static get observedAttributes() { return ['active', 'value', 'disabled']; }\n\n render() {\n this._tab = this.createElement('span', ['nk-tab'], { role: 'tab' });\n this._tab.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._tab);\n this._sync();\n }\n\n _sync() {\n const active = this.getBoolAttr('active');\n this._tab.classList.toggle('active', active);\n this._tab.setAttribute('aria-selected', active ? 'true' : 'false');\n this._tab.tabIndex = active ? 0 : -1;\n this._tab.setAttribute('aria-disabled', this.getBoolAttr('disabled') ? 'true' : 'false');\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._onKey = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.select(); } };\n this._tab.addEventListener('click', this._onClick);\n this._tab.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._tab?.removeEventListener('click', this._onClick);\n this._tab?.removeEventListener('keydown', this._onKey);\n }\n\n select() {\n if (this.getBoolAttr('disabled')) return;\n const ok = this.emit('nk-select', { value: this.value, label: this.textContent.trim(), item: this });\n if (!ok) return;\n const tabs = this.closest('nk-tabs');\n if (tabs) tabs.value = this.value;\n else this.setBoolAttr('active', true);\n }\n\n onAttributeChanged() { this._sync(); }\n focus(o) { this._tab?.focus(o); }\n\n get value() { return this.getAttribute('value') ?? this.textContent.trim(); }\n set value(v) { this.setAttribute('value', v); }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n}\n\ncustomElements.define('nk-tab', NkTab);\nexport { NkTab };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-segmented name=\"range\" value=\"week\">\n// <button value=\"week\">Week</button><button value=\"month\">Month</button>\n// </nk-segmented>\n// → <div class=\"nk-segmented\">…</div> with .active on the chosen button.\n// The buttons stay in the light DOM (their look comes from the ::slotted\n// twins); the element sets type/role, moves .active and submits the value.\n// With `scroll` the chosen option is kept in view – after the first layout,\n// on every change and when the row's width changes – by scrolling the row\n// alone, never the page, by a relative distance, so right-to-left works too.\nconst KEYS = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n\nclass NkSegmented extends NkFormElement {\n static get observedAttributes() { return ['value', 'name', 'disabled', 'scroll', 'wrap']; }\n\n render() {\n this._box = this.createElement('div', ['nk-segmented'], { role: 'radiogroup' });\n this._slot = document.createElement('slot');\n this._box.appendChild(this._slot);\n this._wrapper.appendChild(this._box);\n this._syncBox();\n this._sync();\n }\n\n // `scroll`: one horizontally scrollable row, scrollbar hidden; `wrap`: rows.\n _syncBox() {\n this._box.classList.toggle('scroll', this.getBoolAttr('scroll'));\n this._box.classList.toggle('wrap', this.getBoolAttr('wrap'));\n }\n\n get buttons() { return this._slot?.assignedElements().filter(el => el.localName === 'button') ?? []; }\n _valueOf(btn) { return btn.getAttribute('value') ?? btn.textContent.trim(); }\n\n _sync() {\n const buttons = this.buttons;\n if (!buttons.length) return;\n let value = this.getAttribute('value');\n if (value === null || !buttons.some(b => this._valueOf(b) === value)) {\n value = this._valueOf(buttons.find(b => b.classList.contains('active')) || buttons[0]);\n }\n if (this._defaultValue === undefined) this._defaultValue = value;\n const disabled = this.getBoolAttr('disabled') || !!this._formDisabled;\n for (const b of buttons) {\n const on = this._valueOf(b) === value;\n b.type = 'button';\n b.setAttribute('role', 'radio');\n b.setAttribute('aria-checked', on ? 'true' : 'false');\n b.classList.toggle('active', on);\n b.tabIndex = on ? 0 : -1;\n b.disabled = disabled;\n }\n this._value = value;\n this.setFormValue(value);\n this._reveal(this._revealed ? 'smooth' : 'instant');\n }\n\n /** Scrolls the row the least distance that shows the chosen button whole. */\n _reveal(behavior) {\n if (!this.getBoolAttr('scroll') || !this._box?.clientWidth) return;\n const btn = this.buttons.find(b => b.classList.contains('active'));\n if (!btn) return;\n const row = this._box.getBoundingClientRect(), r = btn.getBoundingClientRect(), pad = 8;\n const delta = r.left < row.left ? r.left - row.left - pad : r.right > row.right ? r.right - row.right + pad : 0;\n const smooth = behavior === 'smooth' && !matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (delta) this._box.scrollBy({ left: delta, behavior: smooth ? 'smooth' : 'instant' });\n this._revealed = true;\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._onClick = (e) => {\n const btn = e.target.closest?.('button');\n if (!btn || !this.buttons.includes(btn) || btn.disabled) return;\n this._choose(this._valueOf(btn));\n };\n this._onKey = (e) => {\n const dir = KEYS[e.key];\n if (!dir) return;\n const buttons = this.buttons;\n const i = buttons.indexOf(e.target.closest?.('button'));\n if (i < 0 || buttons.length < 2) return;\n e.preventDefault();\n const next = buttons[(i + dir + buttons.length) % buttons.length];\n this._choose(this._valueOf(next));\n next.focus();\n };\n this._slot.addEventListener('slotchange', this._onSlot);\n this.addEventListener('click', this._onClick);\n this.addEventListener('keydown', this._onKey);\n this._resize = new ResizeObserver(() => this._reveal('instant'));\n this._resize.observe(this._box);\n this._sync();\n }\n\n teardownEvents() {\n this._slot?.removeEventListener('slotchange', this._onSlot);\n this.removeEventListener('click', this._onClick);\n this.removeEventListener('keydown', this._onKey);\n this._resize?.disconnect();\n }\n\n _choose(value) {\n if (value === this._value) return;\n this._syncing = true;\n this.setAttribute('value', value);\n this._syncing = false;\n this._sync();\n this.emit('nk-change', { value, name: this.name });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n onAttributeChanged(name) {\n if (name === 'scroll' || name === 'wrap') { this._syncBox(); return; }\n if (!this._syncing) this._sync();\n }\n resetValue() { if (this._defaultValue !== undefined) this.setAttribute('value', this._defaultValue); }\n onFormDisabled(d) { this._formDisabled = d; this._sync(); }\n\n get value() { return this._value ?? this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n get scroll() { return this.getBoolAttr('scroll'); }\n set scroll(v) { this.setBoolAttr('scroll', v); }\n get wrap() { return this.getBoolAttr('wrap'); }\n set wrap(v) { this.setBoolAttr('wrap', v); }\n}\n\ncustomElements.define('nk-segmented', NkSegmented);\nexport { NkSegmented };\n","import { NkElement } from '../../base.js';\n\n// <nk-stats><nk-stat …></nk-stat>…</nk-stats> → <div class=\"nk-stats\">\nclass NkStats extends NkElement {\n render() {\n const row = this.createElement('div', ['nk-stats']);\n row.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(row);\n }\n}\n\ncustomElements.define('nk-stats', NkStats);\nexport { NkStats };\n","import { NkElement } from '../../base.js';\n\n// <nk-stat label=\"Active pages\" value=\"128\" delta=\"▲ 12 this week\" trend=\"up\"></nk-stat>\n// → <div class=\"nk-stat\"><div class=\"s-label\">…</div><div class=\"s-value\">…</div><div class=\"s-delta up\">…</div></div>\nclass NkStat extends NkElement {\n static get observedAttributes() { return ['label', 'value', 'delta', 'trend']; }\n\n render() {\n const box = this.createElement('div', ['nk-stat']);\n this._parts = {};\n for (const [slot, cls] of [['label', 's-label'], ['value', 's-value'], ['delta', 's-delta']]) {\n const el = this.createElement('div', [cls]);\n const s = this.createElement('slot', [], { name: slot });\n s.appendChild(el);\n box.appendChild(s);\n this._parts[slot] = el;\n }\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n for (const [slot, el] of Object.entries(this._parts)) {\n const v = this.getAttribute(slot);\n el.textContent = v ?? '';\n el.style.display = v === null ? 'none' : '';\n }\n const trend = this.getAttribute('trend');\n this._parts.delta.className = 's-delta' + (trend === 'up' || trend === 'down' ? ` ${trend}` : '');\n }\n\n onAttributeChanged() { this._sync(); }\n\n get value() { return this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-stat', NkStat);\nexport { NkStat };\n","import { NkElement } from '../../base.js';\n\n// <nk-avatar-group more=\"+2\">\n// <span class=\"mini-avatar\" style=\"background:#448361\">SL</span>…\n// </nk-avatar-group>\n// → <div class=\"nk-avatar-group\">…<span class=\"mini-avatar more\">+2</span></div>\n// The avatars stay in the light DOM (::slotted twins size and overlap them);\n// the \"more\" bubble is rendered here from the attribute.\nclass NkAvatarGroup extends NkElement {\n static get observedAttributes() { return ['more']; }\n\n render() {\n const box = this.createElement('div', ['nk-avatar-group']);\n box.appendChild(document.createElement('slot'));\n this._more = this.createElement('span', ['mini-avatar', 'more']);\n box.appendChild(this._more);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n const more = this.getAttribute('more');\n this._more.textContent = more || '';\n this._more.style.display = more ? '' : 'none';\n }\n\n onAttributeChanged() { this._sync(); }\n\n get more() { return this.getAttribute('more'); }\n set more(v) { v == null ? this.removeAttribute('more') : this.setAttribute('more', v); }\n}\n\ncustomElements.define('nk-avatar-group', NkAvatarGroup);\nexport { NkAvatarGroup };\n","// Shared by every element that draws an avatar: nk-avatar itself, member\n// rows, comments and the person cells of a database view.\nexport const AVATAR_COLORS = ['gray', 'brown', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'red'];\n\n/**\n * Paints an .nk-avatar. One of Notion's nine colour names becomes its class,\n * so the tokens decide the shade in each theme; any other value – a hex, a\n * gradient, a var() – is taken as an inline background, as before 1.6.0.\n * Without a colour the avatar keeps the stylesheet's gradient.\n */\nexport function paintAvatar(el, color) {\n for (const c of AVATAR_COLORS) el.classList.toggle(c, c === color);\n el.style.background = color && !AVATAR_COLORS.includes(color) ? color : '';\n}\n\n/** \"Sara Lindt\" → \"SL\", \"Planer (Dev)\" → \"PD\", \"Anna-Lena Groß\" → \"AG\": the first letter or digit of each word; a word without one is skipped. */\nexport const initialsOf = name => String(name || '').split(/\\s+/).map(w => w.match(/[\\p{L}\\p{N}]/u)?.[0]).filter(Boolean).join('').slice(0, 2).toUpperCase();\n","import { NkElement } from '../../base.js';\nimport { paintAvatar, initialsOf } from '../../util/avatar.js';\n\n// <nk-avatar>MK</nk-avatar> → <span class=\"nk-avatar\">MK</span>\n// <nk-avatar size=\"small\" color=\"green\">SL</nk-avatar>\n// <nk-avatar name=\"Ada Lovelace\" size=\"large\"></nk-avatar> → initials \"AL\"\n// <nk-avatar src=\"ada.jpg\" name=\"Ada Lovelace\" size=\"xlarge\"></nk-avatar>\n// <nk-avatar square>A</nk-avatar> → a workspace icon\n// size: small (20px) · default 24px · large (32px) · xlarge (56px). color: one\n// of Notion's nine names, or any CSS background. Without content the initials\n// come from `name`; with `src` a photo fills the circle and `name` is its alt.\nclass NkAvatar extends NkElement {\n static get observedAttributes() { return ['size', 'color', 'square', 'src', 'name']; }\n\n render() {\n this._box = this.createElement('span', ['nk-avatar']);\n this._slot = document.createElement('slot');\n this._initials = document.createTextNode('');\n this._slot.appendChild(this._initials);\n this._img = this.createElement('img', [], { alt: '' });\n this._box.appendChild(this._slot);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n const size = this.getAttribute('size');\n for (const s of ['small', 'large', 'xlarge']) this._box.classList.toggle(s, s === size);\n this._box.classList.toggle('square', this.getBoolAttr('square'));\n paintAvatar(this._box, this.getAttribute('color'));\n const name = this.getAttribute('name');\n this._initials.data = initialsOf(name);\n const src = this.getAttribute('src');\n if (src) {\n this._img.src = src;\n this._img.alt = name || '';\n if (this._slot.isConnected) this._slot.replaceWith(this._img);\n } else if (this._img.isConnected) this._img.replaceWith(this._slot);\n // A picture or initials with a name speak for themselves; a bare glyph is decoration.\n if (name && !src) { this._box.setAttribute('role', 'img'); this._box.setAttribute('aria-label', name); }\n else { this._box.removeAttribute('role'); this._box.removeAttribute('aria-label'); }\n }\n\n onAttributeChanged() { this._sync(); }\n\n get size() { return this.getAttribute('size'); }\n set size(v) { v == null ? this.removeAttribute('size') : this.setAttribute('size', v); }\n get color() { return this.getAttribute('color'); }\n set color(v) { v == null ? this.removeAttribute('color') : this.setAttribute('color', v); }\n get src() { return this.getAttribute('src'); }\n set src(v) { v == null ? this.removeAttribute('src') : this.setAttribute('src', v); }\n}\n\ncustomElements.define('nk-avatar', NkAvatar);\nexport { NkAvatar };\n","import { NkElement } from '../../base.js';\n\n// <nk-mention type=\"person\"><span slot=\"avatar\" class=\"mini-avatar\" style=\"background:#448361\">SL</span>Sara Lindt</nk-mention>\n// <nk-mention type=\"page\">📄 Onboarding</nk-mention> <nk-mention type=\"date\">📅 May 20</nk-mention>\n// → <span class=\"nk-mention person\">…</span>\nconst TYPES = ['person', 'page', 'date'];\n\nclass NkMention extends NkElement {\n static get observedAttributes() { return ['type']; }\n\n render() {\n this._box = this.createElement('span', this._classes());\n this._box.appendChild(this.createElement('slot', [], { name: 'avatar' }));\n this._box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n }\n\n _classes() {\n const t = this.getAttribute('type');\n return ['nk-mention', ...(TYPES.includes(t) ? [t] : [])];\n }\n\n onAttributeChanged() { if (this._box) this._box.className = this._classes().join(' '); }\n\n get type() { return this.getAttribute('type'); }\n set type(v) { v ? this.setAttribute('type', v) : this.removeAttribute('type'); }\n}\n\ncustomElements.define('nk-mention', NkMention);\nexport { NkMention };\n","import { NkElement } from '../../base.js';\n\n// <nk-template-btn icon=\"📅\" value=\"week-plan\">Insert week plan</nk-template-btn>\n// → <button class=\"nk-template-btn\">📅 Insert week plan</button>\nclass NkTemplateBtn extends NkElement {\n static get observedAttributes() { return ['icon', 'value', 'disabled']; }\n\n render() {\n this._btn = this.createElement('button', ['nk-template-btn'], { type: 'button' });\n // One flex item: \"📅 Insert week plan\" is a single text run in the class\n // markup, so icon, space and label must not become separate flex items.\n const run = document.createElement('span');\n this._icon = document.createElement('span');\n this._space = document.createTextNode(' ');\n run.append(this._icon, this._space, document.createElement('slot'));\n this._btn.appendChild(run);\n this._wrapper.appendChild(this._btn);\n this._sync();\n }\n\n _sync() {\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._space.data = icon ? ' ' : '';\n this._btn.disabled = this.getBoolAttr('disabled');\n }\n\n setupEvents() {\n this._onClick = () => this.emit('nk-select', { value: this.value, label: this.textContent.trim() });\n this._btn.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._btn?.removeEventListener('click', this._onClick); }\n onAttributeChanged() { this._sync(); }\n focus(o) { this._btn?.focus(o); }\n\n get value() { return this.getAttribute('value') ?? this.textContent.trim(); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-template-btn', NkTemplateBtn);\nexport { NkTemplateBtn };\n","import { NkFormElement } from '../../base.js';\n\n// <nk-model-card name=\"model\" value=\"gpt\" title=\"Mona Pro\" desc=\"Best for long documents\" selected></nk-model-card>\n// → <div class=\"nk-model-card selected\"><div class=\"m-radio\"></div><div><div class=\"m-name\">…</div><div class=\"m-desc\">…</div></div></div>\n// Cards with the same `name` in the same tree behave like radios and submit\n// the selected value with the form. `title` is the card's name, never a\n// tooltip – see NkElement.takeTitle().\nclass NkModelCard extends NkFormElement {\n static get observedAttributes() { return ['name', 'value', 'title', 'desc', 'selected', 'disabled']; }\n\n render() {\n this._card = this.createElement('div', ['nk-model-card'], { role: 'radio', tabindex: '0' });\n this._card.appendChild(this.createElement('div', ['m-radio']));\n const text = document.createElement('div');\n this._name = this.createElement('div', ['m-name']);\n const titleSlot = this.createElement('slot', [], { name: 'title' });\n titleSlot.appendChild(this._name);\n this._desc = this.createElement('div', ['m-desc']);\n const descSlot = this.createElement('slot', [], { name: 'desc' });\n descSlot.appendChild(this._desc);\n text.append(titleSlot, descSlot);\n this._card.appendChild(text);\n this._wrapper.appendChild(this._card);\n this._defaultSelected = this.getBoolAttr('selected');\n this.takeTitle();\n this._sync();\n if (this.getBoolAttr('selected')) this._unselectPeers();\n }\n\n _sync() {\n const on = this.getBoolAttr('selected');\n this._card.classList.toggle('selected', on);\n this._card.setAttribute('aria-checked', on ? 'true' : 'false');\n this._card.setAttribute('aria-disabled', this.getBoolAttr('disabled') ? 'true' : 'false');\n this._name.textContent = this._titleText || '';\n const desc = this.getAttribute('desc');\n this._desc.textContent = desc || '';\n this._desc.style.display = desc ? '' : 'none';\n this.setFormValue(on ? (this.getAttribute('value') || 'on') : null, on ? 'selected' : 'unselected');\n }\n\n _group() {\n const name = this.getAttribute('name');\n const root = this.getRootNode();\n if (!name || typeof root?.querySelectorAll !== 'function') return [this];\n return [...root.querySelectorAll('nk-model-card')].filter(el => el.getAttribute('name') === name);\n }\n\n _unselectPeers() {\n for (const el of this._group()) if (el !== this && el.hasAttribute('selected')) el.removeAttribute('selected');\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._onKey = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.select(); } };\n this._card.addEventListener('click', this._onClick);\n this._card.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._card?.removeEventListener('click', this._onClick);\n this._card?.removeEventListener('keydown', this._onKey);\n }\n\n select() {\n if (this.getBoolAttr('disabled') || this.getBoolAttr('selected')) return;\n this.setBoolAttr('selected', true);\n this.emit('nk-change', { value: this.value, name: this.name, checked: true });\n this.emit('nk-select', { value: this.value, label: this.title });\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n if (name === 'selected' && this.getBoolAttr('selected')) this._unselectPeers();\n }\n\n resetValue() { this.setBoolAttr('selected', this._defaultSelected); }\n focus(o) { this._card?.focus(o); }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n get selected() { return this.getBoolAttr('selected'); }\n set selected(v) { this.setBoolAttr('selected', v); }\n get value() { return this.getAttribute('value') || 'on'; }\n set value(v) { this.setAttribute('value', v); }\n get name() { return this.getAttribute('name'); }\n set name(v) { this.setAttribute('name', v); }\n}\n\ncustomElements.define('nk-model-card', NkModelCard);\nexport { NkModelCard };\n","import { NkElement } from '../../base.js';\n\n// <nk-profile-row avatar=\"MK\"><nk-btn variant=\"secondary\" small>Change photo</nk-btn></nk-profile-row>\n// → <div class=\"nk-profile-row\"><div class=\"big-avatar\">MK</div>…</div>\nclass NkProfileRow extends NkElement {\n static get observedAttributes() { return ['avatar']; }\n\n render() {\n const row = this.createElement('div', ['nk-profile-row']);\n this._avatar = this.createElement('div', ['big-avatar']);\n const s = this.createElement('slot', [], { name: 'avatar' });\n s.appendChild(this._avatar);\n row.appendChild(s);\n row.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(row);\n this._sync();\n }\n\n _sync() { this._avatar.textContent = this.getAttribute('avatar') || ''; }\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-profile-row', NkProfileRow);\nexport { NkProfileRow };\n","import { NkElement } from '../../base.js';\n\n// <nk-danger-zone title=\"Danger zone\">…</nk-danger-zone>\n// → <div class=\"nk-danger-zone\"><div class=\"dz-title\">Danger zone</div>…</div>\n// `title` is the heading, never a tooltip – see NkElement.takeTitle().\nclass NkDangerZone extends NkElement {\n static get observedAttributes() { return ['title']; }\n\n render() {\n const box = this.createElement('div', ['nk-danger-zone']);\n this._titleEl = this.createElement('div', ['dz-title']);\n box.appendChild(this._titleEl);\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n this.takeTitle();\n this._sync();\n }\n\n _sync() {\n const t = this._titleText;\n this._titleEl.textContent = t || '';\n this._titleEl.style.display = t ? '' : 'none';\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n}\n\ncustomElements.define('nk-danger-zone', NkDangerZone);\nexport { NkDangerZone };\n","import { NkElement } from '../../base.js';\n\n// <nk-member-list><nk-member-row …></nk-member-row>…</nk-member-list>\n// → <div class=\"nk-member-list\">…</div>; the last row gets `last` (no border).\nclass NkMemberList extends NkElement {\n render() {\n const box = this.createElement('div', ['nk-member-list']);\n this._slot = document.createElement('slot');\n box.appendChild(this._slot);\n this._wrapper.appendChild(box);\n this._mark();\n }\n\n _mark() {\n const rows = this._slot.assignedElements().filter(el => el.localName === 'nk-member-row');\n rows.forEach((row, i) => { if (i === rows.length - 1) row.setAttribute('last', ''); else row.removeAttribute('last'); });\n }\n\n setupEvents() {\n this._onSlot = () => this._mark();\n this._slot.addEventListener('slotchange', this._onSlot);\n this._mark();\n }\n\n teardownEvents() { this._slot?.removeEventListener('slotchange', this._onSlot); }\n}\n\ncustomElements.define('nk-member-list', NkMemberList);\nexport { NkMemberList };\n","import { NkElement } from '../../base.js';\nimport { paintAvatar, initialsOf } from '../../util/avatar.js';\n\n// <nk-member-row name=\"Sara Lindt\" mail=\"sara@…\" avatar=\"SL\" color=\"green\">\n// <nk-select slot=\"role\" compact>…</nk-select>\n// </nk-member-row>\n// → <div class=\"nk-member-row\"><span class=\"nk-avatar green\">SL</span><div>Sara Lindt<div class=\"m-mail\">…</div></div><select …></div>\n// color: one of Notion's nine names, or any CSS background; without it the\n// avatar gradient. The row sizes the avatar to 28px.\nclass NkMemberRow extends NkElement {\n static get observedAttributes() { return ['name', 'mail', 'avatar', 'color', 'last']; }\n\n render() {\n this._row = this.createElement('div', ['nk-member-row']);\n this._avatar = this.createElement('span', ['nk-avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n const text = document.createElement('div');\n this._name = document.createTextNode('');\n this._mail = this.createElement('div', ['m-mail']);\n text.append(this._name, this._mail);\n // `.nk-member-row .nk-select { margin-left: auto }` cannot reach a select\n // inside another shadow root, and a display:contents host takes no margin –\n // so the role slot sits in a box that carries that rule.\n const role = document.createElement('div');\n role.style.marginLeft = 'auto';\n role.appendChild(this.createElement('slot', [], { name: 'role' }));\n this._row.append(avatarSlot, text, role, document.createElement('slot'));\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n _sync() {\n this._name.data = this.getAttribute('name') || '';\n const mail = this.getAttribute('mail');\n this._mail.textContent = mail || '';\n this._mail.style.display = mail ? '' : 'none';\n const avatar = this.getAttribute('avatar');\n this._avatar.textContent = avatar || initialsOf(this.getAttribute('name'));\n paintAvatar(this._avatar, this.getAttribute('color'));\n this._row.classList.toggle('last', this.getBoolAttr('last'));\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-member-row', NkMemberRow);\nexport { NkMemberRow };\n","import { NkElement } from '../../base.js';\n\n// <nk-props>\n// <nk-prop label=\"Status\" icon=\"◉\"><nk-tag color=\"blue\">In progress</nk-tag></nk-prop>\n// <nk-prop label=\"Owner\" icon=\"👤\"><nk-avatar size=\"small\">MK</nk-avatar>Marcel Karas</nk-prop>\n// </nk-props>\n// → <dl class=\"nk-props\">…</dl> – the properties under a page title. The rows\n// are <nk-prop> hosts with display: contents, so each .nk-prop is a row of\n// this list. `flush` (NotionKit 1.12.0) drops the outer margin meant for the\n// flow under a title – for a list inside a panel or a flex column.\nclass NkProps extends NkElement {\n static get observedAttributes() { return ['flush']; }\n\n render() {\n this._list = this.createElement('dl', ['nk-props']);\n this._list.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._list);\n this.onAttributeChanged();\n }\n\n onAttributeChanged() { this._list?.classList.toggle('flush', this.getBoolAttr('flush')); }\n\n get flush() { return this.getBoolAttr('flush'); }\n set flush(v) { this.setBoolAttr('flush', v); }\n}\n\ncustomElements.define('nk-props', NkProps);\nexport { NkProps };\n","import { NkElement } from '../../base.js';\n\n// <nk-prop label=\"Due\" icon=\"📅\">2 June 2026</nk-prop>\n// → <div class=\"nk-prop\"><dt class=\"p-name\"><span class=\"p-icon\">📅</span>Due</dt><dd class=\"p-value\">2 June 2026</dd></div>\n// The value is the element's content – tags, an avatar and a name, a date, a\n// <nk-progress wide>. slot=\"icon\" replaces the icon glyph. A click on the\n// name or the value fires nk-action { action: 'name' | 'value', label }, the\n// moment Notion opens the property's editor. `text` (NotionKit 1.12.0) lets a\n// value that is text – an address, a model name with a tag – flow as text\n// instead of setting its parts one under the other.\nclass NkProp extends NkElement {\n static get observedAttributes() { return ['label', 'icon', 'text']; }\n\n render() {\n this._row = this.createElement('div', ['nk-prop']);\n this._name = this.createElement('dt', ['p-name']);\n this._icon = this.createElement('span', ['p-icon']);\n const iconSlot = this.createElement('slot', [], { name: 'icon' });\n iconSlot.appendChild(this._icon);\n this._label = document.createTextNode('');\n this._name.append(iconSlot, this._label);\n this._value = this.createElement('dd', ['p-value']);\n this._value.appendChild(document.createElement('slot'));\n this._row.append(this._name, this._value);\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n _sync() {\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._icon.style.display = icon ? '' : 'none';\n this._label.data = this.getAttribute('label') || '';\n this._value.classList.toggle('text', this.getBoolAttr('text'));\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const part = e.composedPath().includes(this._name) ? 'name' : 'value';\n this.emit('nk-action', { action: part, label: this.label });\n };\n this._row.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._row?.removeEventListener('click', this._onClick); }\n onAttributeChanged() { this._sync(); }\n\n get label() { return this.getAttribute('label') || ''; }\n set label(v) { this.setAttribute('label', v); }\n get icon() { return this.getAttribute('icon'); }\n set icon(v) { v == null ? this.removeAttribute('icon') : this.setAttribute('icon', v); }\n get text() { return this.getBoolAttr('text'); }\n set text(v) { this.setBoolAttr('text', v); }\n}\n\ncustomElements.define('nk-prop', NkProp);\nexport { NkProp };\n","import { NkElement } from '../../base.js';\n\n// <nk-panels><nk-panel …></nk-panel><nk-panel …></nk-panel></nk-panels>\n// → <div class=\"nk-panels\">…</div>: columns of at least 200px that share the\n// row and fall to one on a phone. The <nk-panel> hosts are display: contents,\n// so each .nk-panel is a cell of this grid. `flush` (NotionKit 1.12.0) drops\n// the grid's outer margin.\nclass NkPanels extends NkElement {\n static get observedAttributes() { return ['flush']; }\n\n render() {\n this._grid = this.createElement('div', ['nk-panels']);\n this._grid.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._grid);\n this.onAttributeChanged();\n }\n\n onAttributeChanged() { this._grid?.classList.toggle('flush', this.getBoolAttr('flush')); }\n\n get flush() { return this.getBoolAttr('flush'); }\n set flush(v) { this.setBoolAttr('flush', v); }\n}\n\ncustomElements.define('nk-panels', NkPanels);\nexport { NkPanels };\n","import { NkElement } from '../../base.js';\n\n// <nk-panel title=\"Weekly review\"><p>Three pages changed.</p></nk-panel>\n// <nk-panel href=\"/roadmap\" cover=\"covers/aurora.svg\" icon=\"🚀\" title=\"Roadmap\"><p>2 min ago</p></nk-panel>\n// → <a class=\"nk-panel\" href=\"/roadmap\"><div class=\"nk-cover\"><img src=\"…\" alt=\"\"></div>\n// <div class=\"nk-page-icon\">🚀</div><h3>Roadmap</h3>…</a>\n// <nk-panel title=\"Contacts database\"><nk-tag slot=\"end\" color=\"green\">Connected</nk-tag>…</nk-panel>\n// → … <div class=\"p-head\"><h3>Contacts database</h3><span class=\"p-end\">…</span></div>\n// `cover` without a value draws the token gradient, with one a picture; `icon`\n// overlaps the cover as on a page – a page tile, as on Notion's Home. With\n// `href` the panel is a link. `title` is the heading, never a tooltip.\n// slot=\"end\" (NotionKit 1.12.0) sits at the right edge of the title – a state\n// as a tag, a button – and moves under it where both do not fit.\nclass NkPanel extends NkElement {\n static get observedAttributes() { return ['title', 'icon', 'cover', 'href', 'target']; }\n\n render() {\n this._cover = this.createElement('div', ['nk-cover']);\n this._img = this.createElement('img', [], { alt: '' });\n this._icon = this.createElement('div', ['nk-page-icon']);\n this._heading = document.createElement('h3');\n this._endSlot = this.createElement('slot', [], { name: 'end' });\n this._end = this.createElement('span', ['p-end']);\n this._end.appendChild(this._endSlot);\n this._head = this.createElement('div', ['p-head']);\n this._head.append(this._heading, this._end);\n this._slot = document.createElement('slot');\n this.takeTitle();\n this._build();\n }\n\n _build() {\n const href = this.getAttribute('href');\n const box = this.createElement(href ? 'a' : 'div', ['nk-panel']);\n box.append(this._cover, this._icon, this._head, this._slot);\n this._wrapper.replaceChildren(box);\n this._box = box;\n this._sync();\n }\n\n _sync() {\n const href = this.getAttribute('href');\n if (href) { this._box.setAttribute('href', href); this._box.target = this.getAttribute('target') || ''; }\n const cover = this.getAttribute('cover');\n // The band is in the tree only with `cover`: hidden, it still matched\n // `.nk-cover + .nk-page-icon` and pulled a lone icon over the tile's edge.\n if (cover === null) this._cover.remove();\n else if (!this._cover.isConnected) this._box.prepend(this._cover);\n if (cover) { this._img.src = cover; if (!this._img.isConnected) this._cover.appendChild(this._img); }\n else this._img.remove();\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._icon.style.display = icon ? '' : 'none';\n const title = this._titleText || '';\n if (this._heading.textContent !== title) this._heading.textContent = title;\n this._heading.style.display = title ? '' : 'none';\n // The end and the whole head leave the layout when they are empty, so a\n // title alone lays out as it always did.\n const end = this._endSlot.assignedNodes().some(n => n.nodeType === Node.ELEMENT_NODE || n.textContent.trim());\n this._end.style.display = end ? '' : 'none';\n this._head.style.display = title || end ? '' : 'none';\n }\n\n setupEvents() {\n this._onEnd = () => this._sync();\n this._endSlot.addEventListener('slotchange', this._onEnd);\n }\n\n teardownEvents() { this._endSlot?.removeEventListener('slotchange', this._onEnd); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n if (name === 'href' && (value === null) !== (this._box.localName === 'div')) { this._build(); return; }\n this._sync();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n get href() { return this.getAttribute('href'); }\n set href(v) { v == null ? this.removeAttribute('href') : this.setAttribute('href', v); }\n}\n\ncustomElements.define('nk-panel', NkPanel);\nexport { NkPanel };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, firstFocusable, deepActiveElement } from '../../util/focus.js';\n\n// <nk-sheet id=\"more\" title=\"More\">\n// <nk-tree manual>\n// <nk-section-label>Favourites</nk-section-label>\n// <nk-tree-item icon=\"🚀\">NotionKit MVP</nk-tree-item>\n// </nk-tree>\n// </nk-sheet>\n// → <div class=\"nk-sheet-backdrop open\"><div class=\"nk-sheet\" role=\"dialog\">\n// <div class=\"sh-grabber\"></div><div class=\"sh-title\">More</div>…</div></div>\n//\n// A bottom sheet (NotionKit 1.7.0) with nk-modal's contract: show(), close()\n// and toggle(), Escape and the backdrop close it, focus moves in and back\n// out, the page behind is scroll-locked and inert. It lies above the tab\n// bar; rows inside are 40px high. `title` is the heading shown under the\n// grabber and the dialog's name, never a tooltip – see NkElement.takeTitle().\n// Choosing a row does not close the sheet – the app decides (nk-select\n// bubbles out). Put the element directly under <body>: a transformed\n// ancestor would trap the fixed backdrop.\nclass NkSheet extends NkElement {\n static get observedAttributes() { return ['open', 'title']; }\n\n render() {\n this.takeTitle();\n this._backdrop = this.createElement('div', ['nk-sheet-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-sheet'], { role: 'dialog', 'aria-modal': 'true', tabindex: '-1' });\n this._heading = this.createElement('div', ['sh-title'], { id: 'title' });\n this._box.append(this.createElement('div', ['sh-grabber']), this._heading, document.createElement('slot'));\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncTitle();\n this._syncOpen();\n }\n\n _syncTitle() {\n const text = this._titleText || '';\n this._heading.textContent = text;\n this._heading.hidden = !text;\n if (text) this._box.setAttribute('aria-labelledby', 'title');\n else this._box.removeAttribute('aria-labelledby');\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = deepActiveElement();\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => (firstFocusable(this) || this._box).focus({ preventScroll: true }));\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n const back = this._returnFocus;\n if (back && typeof back.focus === 'function' && back.isConnected) back.focus({ preventScroll: true });\n this._returnFocus = null;\n }\n }\n\n setupEvents() {\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._backdrop.addEventListener('click', this._onBackdrop);\n document.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n document.removeEventListener('keydown', this._onKey);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onAttributeChanged(name, oldValue, value) {\n if (name === 'title') { if (this.takeTitle(value)) this._syncTitle(); return; }\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._syncTitle(); }\n}\n\ncustomElements.define('nk-sheet', NkSheet);\nexport { NkSheet };\n","import { NkElement } from '../../base.js';\n\n// <nk-steps label=\"Connect your own model\" current=\"2\"\n// steps=\"Choose a provider, Enter the API key, Test the connection\"></nk-steps>\n// steps.steps = [{ label: 'Choose a provider', desc: 'Anthropic' }, 'Enter the API key', …];\n// → <ol class=\"nk-steps\" aria-label=\"…\">\n// <li class=\"nk-step done\"><span class=\"st-mark\">✓</span><span>Choose a provider<span class=\"st-desc\">Anthropic</span></span></li>\n// <li class=\"nk-step current\" aria-current=\"step\"><span class=\"st-mark\">2</span><span>Enter the API key</span></li>\n// <li class=\"nk-step\"><span class=\"st-mark\">3</span><span>Test the connection</span></li></ol>\n// A setup in a few steps (NotionKit 1.7.0). `current` counts from 1; the\n// steps before it are done, one past the last marks all of them done. The\n// `steps` attribute is a comma-separated list; the property also takes\n// { label, desc, state, value } objects for a line under the label and a\n// state of its own – 'done', 'skipped' or 'open' (NotionKit 1.12.0) – for a\n// wizard that lets a step be skipped while a later one is done.\n// `selectable` makes each label a button: a click or Enter fires\n// nk-select { index, value, step } – index counts from 1, like `current` –\n// and, unless cancelled, makes that step current. `horizontal` sets the\n// steps in one row above a wizard.\n// A step with `href` (1.17.0) shows its label as a link, <a class=\"st-label\">,\n// with or without `selectable` – to open a chapter in a new tab or copy its\n// address. A plain click, or Enter, fires the same nk-select; cancelling it\n// keeps the browser from following the link, for a router of your own. A\n// middle click or one with Cmd, Ctrl, Shift or Alt fires nothing and does\n// what a link does.\nclass NkSteps extends NkElement {\n static get observedAttributes() { return ['steps', 'current', 'label', 'selectable', 'horizontal']; }\n\n render() {\n this._list = this.createElement('ol', ['nk-steps']);\n this._wrapper.appendChild(this._list);\n this._sync();\n }\n\n _items() {\n if (this._steps) return this._steps;\n return (this.getAttribute('steps') || '').split(',').map(s => s.trim()).filter(Boolean);\n }\n\n _step(i) {\n const step = this._items()[i];\n return typeof step === 'object' && step ? step : step === undefined ? undefined : { label: String(step) };\n }\n\n _sync() {\n const label = this.getAttribute('label');\n if (label) this._list.setAttribute('aria-label', label); else this._list.removeAttribute('aria-label');\n this._list.classList.toggle('horizontal', this.getBoolAttr('horizontal'));\n const current = this.current, selectable = this.getBoolAttr('selectable');\n // Rebuilding drops the focused label; the new one at that place takes it back.\n const focused = this.shadowRoot?.activeElement?.closest?.('li')?.dataset.index;\n this._list.replaceChildren(...this._items().map((_, i) => {\n const n = i + 1, { label: text, desc, state, href } = this._step(i);\n // A state of its own wins; without one, the steps before `current` are done.\n const done = state ? state === 'done' : n < current, skipped = state === 'skipped';\n const li = this.createElement('li', ['nk-step'], { 'data-index': String(n) });\n li.classList.toggle('done', done);\n li.classList.toggle('skipped', skipped);\n li.classList.toggle('current', n === current);\n if (n === current) li.setAttribute('aria-current', 'step');\n const mark = this.createElement('span', ['st-mark'], { 'aria-hidden': 'true' });\n mark.textContent = done ? '✓' : skipped ? '–' : String(n);\n const body = href != null && href !== '' ? this.createElement('a', ['st-label'], { href: String(href) })\n : selectable ? this.createElement('button', ['st-label'], { type: 'button' }) : document.createElement('span');\n body.textContent = text ?? '';\n if (desc) { const d = this.createElement('span', ['st-desc']); d.textContent = desc; body.appendChild(d); }\n li.append(mark, body);\n return li;\n }));\n if (focused) this._list.querySelector(`li[data-index=\"${focused}\"] .st-label`)?.focus();\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const li = e.target.closest?.('li.nk-step');\n if (!li || !this._list.contains(li)) return;\n const link = li.querySelector('a.st-label');\n if (link) {\n // The link contract: a plain left click is a selection, any other\n // one the browser's. The mark beside the link counts as the link.\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n if (!link.contains(e.target)) { link.click(); return; }\n if (!this.select(Number(li.dataset.index))) e.preventDefault();\n return;\n }\n if (this.getBoolAttr('selectable')) this.select(Number(li.dataset.index));\n };\n this._list.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._list?.removeEventListener('click', this._onClick); }\n onAttributeChanged() { this._sync(); }\n\n /** Jumps to step `index` (from 1): fires nk-select { index, value, step } and, unless cancelled, makes it current. */\n select(index) {\n const step = this._step(index - 1);\n if (!step) return false;\n const ok = this.emit('nk-select', { index, value: step.value ?? step.label, step });\n if (ok) this.current = index;\n return ok;\n }\n\n get steps() { return this._items(); }\n set steps(v) { this._steps = Array.isArray(v) ? v : null; if (this._list) this._sync(); }\n get current() { const n = parseInt(this.getAttribute('current'), 10); return Number.isFinite(n) ? n : 1; }\n set current(v) { this.setAttribute('current', String(v)); }\n get selectable() { return this.getBoolAttr('selectable'); }\n set selectable(v) { this.setBoolAttr('selectable', v); }\n get horizontal() { return this.getBoolAttr('horizontal'); }\n set horizontal(v) { this.setBoolAttr('horizontal', v); }\n /** Moves on to the next step; returns the new current step. */\n next() { this.current = Math.min(this.current + 1, this._items().length + 1); return this.current; }\n}\n\ncustomElements.define('nk-steps', NkSteps);\nexport { NkSteps };\n","import { NkElement } from '../../base.js';\n\n// <nk-bookmark href=\"https://notionkit.jungherz.com\" title=\"NotionKit\" desc=\"…\"\n// favicon=\"favicon.svg\" cover=\"og.jpg\"></nk-bookmark>\n// → <a class=\"nk-bookmark\" href=\"…\" target=\"_blank\" rel=\"noopener\">\n// <span class=\"bm-text\"><span class=\"bm-title\">…</span><span class=\"bm-desc\">…</span>\n// <span class=\"bm-url\"><img class=\"bm-favicon\"><span>…</span></span></span>\n// <span class=\"bm-cover\"><img></span></a>\n// Notion's link block (NotionKit 1.8.0), filled from what you know of the\n// page: og:title, og:description, og:image. `title` is the heading, never a\n// tooltip – see NkElement.takeTitle(); without it the host name stands in.\n// The address shown is `href`, or `url` where it should read differently. A\n// part without a value is left out, not hidden – the stylesheet gives the\n// description its own display. Opens in a new tab unless `target` says so.\nclass NkBookmark extends NkElement {\n static get observedAttributes() { return ['href', 'title', 'desc', 'favicon', 'cover', 'target', 'url']; }\n\n render() {\n this.takeTitle();\n this._a = this.createElement('a', ['nk-bookmark']);\n this._wrapper.appendChild(this._a);\n this._sync();\n }\n\n _sync() {\n if (!this._a) return;\n const href = this.getAttribute('href') || '';\n this._a.setAttribute('href', href);\n const target = this.getAttribute('target') || '_blank';\n this._a.setAttribute('target', target);\n if (target === '_blank') this._a.setAttribute('rel', 'noopener'); else this._a.removeAttribute('rel');\n let host = href;\n try { host = new URL(href, location.href).host; } catch { /* keep the text */ }\n\n const text = this.createElement('span', ['bm-text']);\n const title = this.createElement('span', ['bm-title']);\n title.textContent = this._titleText || host;\n text.appendChild(title);\n const desc = this.getAttribute('desc');\n if (desc) { const d = this.createElement('span', ['bm-desc']); d.textContent = desc; text.appendChild(d); }\n const url = this.createElement('span', ['bm-url']);\n const favicon = this.getAttribute('favicon');\n if (favicon) url.appendChild(this.createElement('img', ['bm-favicon'], { src: favicon, alt: '' }));\n const address = document.createElement('span');\n address.textContent = this.getAttribute('url') || href;\n url.appendChild(address);\n text.appendChild(url);\n const parts = [text];\n const cover = this.getAttribute('cover');\n if (cover) { const c = this.createElement('span', ['bm-cover']); c.appendChild(this.createElement('img', [], { src: cover, alt: '' })); parts.push(c); }\n this._a.replaceChildren(...parts);\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n }\n\n focus(o) { this._a?.focus(o); }\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); this._sync(); }\n get href() { return this.getAttribute('href') || ''; }\n set href(v) { this.setAttribute('href', v); }\n}\n\ncustomElements.define('nk-bookmark', NkBookmark);\nexport { NkBookmark };\n","import { NkElement } from '../../base.js';\n\n// <nk-copy-field value=\"https://monahilft.notionkit.app\"></nk-copy-field>\n// <nk-copy-field value=\"ntn_4f2…\" secret mono></nk-copy-field>\n// → <div class=\"nk-copy-field mono\"><span class=\"cf-value\">…</span>\n// <button class=\"cf-btn\" aria-label=\"Show\"><svg>…</svg><span>Show</span></button>\n// <button class=\"cf-btn\" aria-label=\"Copy\"><svg>…</svg><span>Copy</span></button></div>\n// A value to take along – a link, an address, a key (NotionKit 1.8.0). Copy\n// writes it to the clipboard and says \"Copied\" in green for a moment; where\n// the clipboard is not allowed, the value is shown and selected instead, for\n// ⌘C. `secret` masks it behind a Show/Hide toggle; Copy still copies the\n// real value. `value` set as a property is not reflected, so a key never\n// lands in the markup. Fires nk-action { action: 'copy', value, ok }. The\n// texts come in English or German after the language (1.17.0, setStrings()\n// for others); copy-label, copied-label, show-label, hide-label set them here.\n// Each button carries an icon beside its word (1.18.0): on a phone, and with\n// `icons` anywhere, the icon stands in for the word – two overlapping squares,\n// an eye, a check in green for the moment after – and a masked key keeps a\n// dozen characters more. The word stays the button's name, and while the\n// icons show, its tooltip for <nk-tooltip>.\nconst ICONS = {\n copy: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 9V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h4\"/><rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\"/></svg>',\n copied: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20 6 9 17l-5-5\"/></svg>',\n show: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>',\n hide: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"m3 3 18 18\"/></svg>',\n};\nconst PHONE = typeof matchMedia === 'function' ? matchMedia('(max-width: 860px)') : null;\n\nclass NkCopyField extends NkElement {\n static get observedAttributes() { return ['value', 'mono', 'wrap', 'wide', 'secret', 'icons', 'copy-label', 'copied-label', 'show-label', 'hide-label']; }\n\n render() {\n this._val ??= this.getAttribute('value') ?? '';\n this._box = this.createElement('div', ['nk-copy-field']);\n this._text = this.createElement('span', ['cf-value']);\n this._show = this.createElement('button', ['cf-btn'], { type: 'button' });\n this._copy = this.createElement('button', ['cf-btn'], { type: 'button' });\n this._box.append(this._text, this._copy);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n if (!this._box) return;\n for (const m of ['mono', 'wrap', 'wide', 'icons']) this._box.classList.toggle(m, this.getBoolAttr(m));\n const secret = this.getBoolAttr('secret');\n this._text.textContent = secret && !this._revealed ? '•'.repeat(Math.min(this._val.length, 24)) : this._val;\n // Not `hidden`: .cf-btn sets no display of its own that could lose to it,\n // but a button that is not there cannot be tabbed to either.\n if (secret && !this._show.isConnected) this._copy.before(this._show);\n if (!secret) this._show.remove();\n const tip = this.getBoolAttr('icons') || !!PHONE?.matches;\n this._button(this._show, this._revealed ? 'hide' : 'show', this._revealed ? (this.getAttribute('hide-label') || this.str('hide')) : (this.getAttribute('show-label') || this.str('show')), tip);\n this._show.setAttribute('aria-pressed', String(!!this._revealed));\n this._button(this._copy, this._copied ? 'copied' : 'copy', this._copied ? (this.getAttribute('copied-label') || this.str('copied')) : (this.getAttribute('copy-label') || this.str('copy')), tip);\n this._copy.classList.toggle('copied', !!this._copied);\n }\n\n /** The icon and the word of a button; the word is its name, and its tooltip while the icon stands in for it. */\n _button(btn, icon, word, tip) {\n if (btn.dataset.icon !== icon) { btn.innerHTML = `${ICONS[icon]}<span></span>`; btn.dataset.icon = icon; }\n btn.lastChild.textContent = word;\n btn.setAttribute('aria-label', word);\n if (tip) btn.setAttribute('data-tooltip', word); else btn.removeAttribute('data-tooltip');\n }\n\n setupEvents() {\n this._onCopy = () => this.copy();\n this._onShow = () => { this._revealed = !this._revealed; this._sync(); };\n this._onPhone = () => this._sync();\n this._copy.addEventListener('click', this._onCopy);\n this._show.addEventListener('click', this._onShow);\n PHONE?.addEventListener('change', this._onPhone);\n }\n\n teardownEvents() {\n this._copy?.removeEventListener('click', this._onCopy);\n this._show?.removeEventListener('click', this._onShow);\n PHONE?.removeEventListener('change', this._onPhone);\n clearTimeout(this._timer);\n }\n\n onStringsChanged() { this._sync(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'value') this._val = value ?? '';\n this._sync();\n }\n\n /** Copies the value; resolves to whether the clipboard took it. */\n async copy() {\n const value = this._val;\n let ok = true;\n try { await navigator.clipboard.writeText(value); } catch { ok = false; }\n if (ok) {\n this._copied = true;\n clearTimeout(this._timer);\n this._timer = setTimeout(() => { this._copied = false; this._sync(); }, 1500);\n } else {\n this._revealed = true;\n }\n this._sync();\n if (!ok) getSelection()?.selectAllChildren(this._text);\n this.emit('nk-action', { action: 'copy', value, ok });\n return ok;\n }\n\n get value() { return this._val ?? this.getAttribute('value') ?? ''; }\n set value(v) { this._val = v == null ? '' : String(v); this._sync(); }\n get secret() { return this.getBoolAttr('secret'); }\n set secret(v) { this.setBoolAttr('secret', v); }\n get icons() { return this.getBoolAttr('icons'); }\n set icons(v) { this.setBoolAttr('icons', v); }\n}\n\ncustomElements.define('nk-copy-field', NkCopyField);\nexport { NkCopyField };\n","import { NkElement } from '../../base.js';\n\n// <nk-image-picker initials=\"MK\" label=\"Profile picture\"></nk-image-picker>\n// <nk-image-picker square initials=\"M\" max=\"256\" type=\"image/png\"></nk-image-picker>\n// → <div class=\"nk-profile-row\"><div class=\"big-avatar\">MK | <img></div>\n// <div class=\"pr-actions\"><button class=\"nk-btn secondary small\">Upload image</button>\n// <button class=\"nk-btn secondary small pr-remove\">Remove</button><input type=\"file\" hidden></div></div>\n//\n// A picture for a person or a workspace (NotionKit 1.8.0): the profile row\n// with its actions, round – or `square`, a workspace icon. Ported from\n// GlassKit Elements' glk-image-picker: the file goes through\n// createImageBitmap with imageOrientation 'from-image' – the EXIF rotation\n// of a phone photo without a library – onto a canvas no larger than `max`\n// (default 512), out as `type` (default image/jpeg, on white; image/png\n// keeps transparency) at `quality` (0.82). The file input is hidden and\n// opened from a real button, and cleared after every pick, so the same file\n// can be chosen again. Not form-associated: listen to nk-change and upload\n// the data URL. `src` set as a property is not reflected, so megabytes of\n// data URL never land in the DOM.\n// Events: nk-change { dataUrl, width, height, size } after a pick, and on\n// remove with an empty dataUrl; nk-error { message, name } when the\n// file cannot be decoded (HEIC outside Safari, a broken file).\n// Texts: English or German after the language (1.17.0, setStrings() for\n// others); choose-label, change-label, remove-label set them here.\n// label names the group.\n\nfunction dataUrlBytes(url) {\n const b64 = url.slice(url.indexOf(',') + 1);\n const padding = b64.endsWith('==') ? 2 : b64.endsWith('=') ? 1 : 0;\n return Math.floor((b64.length * 3) / 4) - padding;\n}\n\nclass NkImagePicker extends NkElement {\n static get observedAttributes() { return ['src', 'initials', 'square', 'label', 'max', 'type', 'quality', 'accept', 'choose-label', 'change-label', 'remove-label']; }\n\n render() {\n this._src ??= this.getAttribute('src') || '';\n this._row = this.createElement('div', ['nk-profile-row'], { role: 'group' });\n this._avatar = this.createElement('div', ['big-avatar']);\n const actions = this.createElement('div', ['pr-actions']);\n this._choose = this.createElement('button', ['nk-btn', 'secondary', 'small'], { type: 'button' });\n this._remove = this.createElement('button', ['nk-btn', 'secondary', 'small', 'pr-remove'], { type: 'button' });\n this._input = this.createElement('input', [], { type: 'file', tabindex: '-1' });\n this._input.hidden = true;\n actions.append(this._choose, this._remove, this._input);\n this._row.append(this._avatar, actions);\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n get _max() { return Math.max(1, Math.floor(Number(this.getAttribute('max'))) || 512); }\n get _type() { return this.getAttribute('type') || 'image/jpeg'; }\n get _quality() { const q = Number(this.getAttribute('quality')); return this.hasAttribute('quality') && q >= 0 && q <= 1 ? q : 0.82; }\n\n _sync() {\n if (!this._row) return;\n this._avatar.classList.toggle('square', this.getBoolAttr('square'));\n if (!this._src) {\n this._img = null;\n this._avatar.textContent = this.getAttribute('initials') || '';\n } else if (!this._img || this._img.getAttribute('src') !== this._src) {\n this._img = this.createElement('img', [], { src: this._src, alt: '' });\n this._avatar.replaceChildren(this._img);\n }\n const label = this.getAttribute('label');\n if (label) this._row.setAttribute('aria-label', label); else this._row.removeAttribute('aria-label');\n this._choose.textContent = this._src ? (this.getAttribute('change-label') || this.str('changeImage')) : (this.getAttribute('choose-label') || this.str('uploadImage'));\n this._remove.textContent = this.getAttribute('remove-label') || this.str('remove');\n this._remove.hidden = !this._src;\n this._input.accept = this.getAttribute('accept') || 'image/*';\n }\n\n async _pick(file) {\n if (!file) return;\n try {\n const bitmap = await createImageBitmap(file, { imageOrientation: 'from-image' });\n const scale = Math.min(1, this._max / Math.max(bitmap.width, bitmap.height));\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(bitmap.width * scale));\n canvas.height = Math.max(1, Math.round(bitmap.height * scale));\n const ctx = canvas.getContext('2d');\n if (this._type === 'image/jpeg') {\n // JPEG has no alpha; without this a transparent PNG comes out on black.\n ctx.fillStyle = '#fff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n ctx.drawImage(bitmap, 0, 0, canvas.width, canvas.height);\n bitmap.close();\n const dataUrl = canvas.toDataURL(this._type, this._quality);\n this.src = dataUrl;\n this.emit('nk-change', { dataUrl, width: canvas.width, height: canvas.height, size: dataUrlBytes(dataUrl) });\n } catch (error) {\n this.emit('nk-error', { message: error?.message || String(error), name: file.name });\n }\n }\n\n setupEvents() {\n this._onChoose = () => this._input.click();\n this._onChange = (e) => { const file = e.target.files?.[0]; e.target.value = ''; this._pick(file); };\n this._onRemove = () => {\n this.src = '';\n this._choose.focus(); // the remove button just went away under the focus\n this.emit('nk-change', { dataUrl: '', width: 0, height: 0, size: 0 });\n };\n this._choose.addEventListener('click', this._onChoose);\n this._input.addEventListener('change', this._onChange);\n this._remove.addEventListener('click', this._onRemove);\n }\n\n teardownEvents() {\n this._choose?.removeEventListener('click', this._onChoose);\n this._input?.removeEventListener('change', this._onChange);\n this._remove?.removeEventListener('click', this._onRemove);\n }\n\n onStringsChanged() { this._sync(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'src') this._src = value || '';\n this._sync();\n }\n\n /** Opens the file dialog, as the button does. */\n choose() { this._input?.click(); }\n get src() { return this._src ?? this.getAttribute('src') ?? ''; }\n set src(v) { this._src = v || ''; this._sync(); }\n get square() { return this.getBoolAttr('square'); }\n set square(v) { this.setBoolAttr('square', v); }\n}\n\ncustomElements.define('nk-image-picker', NkImagePicker);\nexport { NkImagePicker };\n","// Calendar days for nk-calendar and nk-calendar-view: local days as\n// 'YYYY-MM-DD', no library. Weeks are ISO weeks (Monday-based, the week with\n// the year's first Thursday); the first weekday comes from the locale.\nconst pad = n => String(n).padStart(2, '0');\n\nexport const isoOf = d => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\nexport const addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n\n/** 'YYYY-MM-DD[THH:MM]', 'D.M.YYYY', a Date or { start } → a local Date at midnight, or null. */\nexport function parseDay(v) {\n if (v instanceof Date) return Number.isNaN(v.getTime()) ? null : new Date(v.getFullYear(), v.getMonth(), v.getDate());\n if (v && typeof v === 'object') return v.start ? parseDay(v.start) : null;\n const s = String(v ?? '').trim();\n let m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (m) return new Date(+m[1], +m[2] - 1, +m[3]);\n m = s.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/);\n return m ? new Date(+m[3], +m[2] - 1, +m[1]) : null;\n}\n\nexport function isoWeek(d) {\n const t = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n t.setUTCDate(t.getUTCDate() + 4 - (t.getUTCDay() || 7));\n return Math.ceil(((t - Date.UTC(t.getUTCFullYear(), 0, 1)) / 864e5 + 1) / 7);\n}\n\n/** The page's language unless the element names one. */\nexport const resolveLocale = attr => attr || document.documentElement.lang || navigator.language || 'en';\n\n/** 0 = Sunday … 6 = Saturday, from Intl.Locale's week info; Monday where the browser cannot say. */\nexport function firstWeekday(locale) {\n try {\n const l = new Intl.Locale(locale), info = l.getWeekInfo?.() ?? l.weekInfo;\n if (info?.firstDay) return info.firstDay % 7;\n } catch { /* an unknown tag */ }\n return 1;\n}\n\n/** Short weekday names from `weekStart` on; `length` cuts them (2 → \"Mo\"). */\nexport function weekdayNames(locale, weekStart, length = 0) {\n const f = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n // 7 June 2026 is a Sunday, so 7 + n is weekday n.\n return Array.from({ length: 7 }, (_, i) => {\n const name = f.format(new Date(2026, 5, 7 + ((weekStart + i) % 7))).replace('.', '');\n return length ? name.slice(0, length) : name;\n });\n}\n\n/** A month from its week start: `first`, `day(i)` for the i-th cell, the `rows` it needs. */\nexport function monthGrid(month, weekStart) {\n const [y, m] = month.split('-').map(Number), first = new Date(y, m - 1, 1), offset = (first.getDay() - weekStart + 7) % 7;\n return { m, first, day: i => new Date(y, m - 1, 1 - offset + i), rows: Math.ceil((offset + new Date(y, m, 0).getDate()) / 7) };\n}\n\nexport function stepMonth(month, n) {\n const [y, m] = month.split('-').map(Number);\n return isoOf(new Date(y, m - 1 + n, 1)).slice(0, 7);\n}\n\n/** \"KW\" for German, \"W\" elsewhere – the head of the week column. */\nexport const weekLabel = locale => (/^de\\b/i.test(locale) ? 'KW' : 'W');\n\nexport const CHEVRONS = {\n prev: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\"/></svg>',\n next: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\"/></svg>',\n};\n","import { NkFormElement } from '../../base.js';\nimport { isoOf, parseDay, addDays, isoWeek, resolveLocale, firstWeekday, weekdayNames, monthGrid, stepMonth, weekLabel, CHEVRONS } from '../../util/dates.js';\nimport { placeUnder } from '../../util/floating.js';\nimport { deepActiveElement } from '../../util/focus.js';\n\n// <nk-calendar name=\"due\" value=\"2026-06-02\" weeks weekend=\"6,0\"></nk-calendar>\n// <nk-calendar range value=\"2026-06-08/2026-06-12\"></nk-calendar>\n// <nk-calendar floating sheet id=\"picker\"></nk-calendar> picker.show(button)\n// → [<div class=\"nk-pop floating sheet open\">]<div class=\"nk-calendar weeks\">\n// <div class=\"cal-head\"><div class=\"cal-title\">June 2026</div><button class=\"cal-nav\">Today</button>‹ ›</div>\n// <div class=\"cal-grid\"><span class=\"cal-wd\">W</span>…<span class=\"cal-week\">23</span><button class=\"cal-day selected\">2</button>…</div>\n// [<div class=\"cal-foot\"><input class=\"nk-input\" type=\"time\"></div>]</div>\n//\n// Notion's date picker (NotionKit 1.9.0), after GlassKit Elements'\n// glk-calendar, with what a planning tool needs on top: a range, ISO\n// calendar weeks, days not worked, marks and a time.\n// value: YYYY-MM-DD; with `range` the ISO interval \"start/end\"; with `time`\n// YYYY-MM-DDTHH:MM. Also as the properties value, start, end.\n// month (YYYY-MM shown; default the value's, else today's), min, max, today,\n// locale (default the page's lang), week-start (0 = Sunday … 6 = Saturday;\n// default from the locale, Monday where the browser cannot say), weeks,\n// weekend (weekdays not worked, \"6,0\" for Saturday and Sunday), range, time,\n// clearable, label and the texts today-label, prev-label, next-label,\n// week-label, time-label, clear-label – without them English or German\n// after the language (1.17.0). `time` belongs to single days; a range has\n// none.\n// days (property, or JSON attribute): { 'YYYY-MM-DD': { off, label, marks } }\n// – `off` greys a holiday, `label` names the day (tooltip and screen\n// reader), `marks` puts up to three dots in the nine colours on it.\n// Keys: arrows by a day or a week, Home/End to the ends of the week,\n// PageUp/PageDown by a month (Shift: a year); Enter or Space picks. Arrows\n// only move, so the picker stays quiet while someone looks around. Days\n// outside min/max are aria-disabled – in the arrow path and announced, never\n// picked. A range takes two picks, in either order. Form-associated: the\n// value goes with the form, reset restores it.\n// Events: nk-change { value, start, end, time } when a pick – for a range the\n// second one –, a new time or Clear changes the value; nk-month { month } when the month\n// changes; nk-toggle { open } with `floating`. `required` makes an empty\n// value invalid.\n// `floating` makes it a popover over the page – show(anchor) puts it under\n// the anchor, right edges aligned (align=\"start\": left edges) – and `sheet`\n// a bottom sheet with 44px cells on a phone, as <nk-menu floating sheet>.\n// A pick closes it – the second of a range; with `time` Escape or a tap\n// outside does. Put a floating calendar directly under <body>.\nconst STEPS = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 };\nconst floatSheet = new CSSStyleSheet();\nfloatSheet.replaceSync(`:host([floating]) { display: block; position: fixed; top: 0; left: 0; z-index: 106; pointer-events: none; }`);\n\nclass NkCalendar extends NkFormElement {\n static get hostStyles() { return floatSheet; }\n static get observedAttributes() {\n return ['value', 'month', 'min', 'max', 'today', 'locale', 'week-start', 'weeks', 'weekend', 'range', 'time', 'clearable', 'days',\n 'label', 'today-label', 'prev-label', 'next-label', 'week-label', 'time-label', 'clear-label', 'floating', 'sheet', 'open', 'align', 'required'];\n }\n\n render() {\n // A value or month set as a property before the first connect wins over the attributes.\n this._readValue(this._pendingValue ?? this.getAttribute('value'));\n const month = this._pendingMonth || this._attrMonth();\n if (month) this._month = month;\n this._initialValue = this.getAttribute('value') ?? '';\n this._build();\n }\n\n // ── value ──\n _readValue(v) {\n const s = String(v ?? '');\n this._start = this._end = this._day = null;\n this._time = '';\n if (this.getBoolAttr('range')) {\n const [a, b] = s.split('/');\n this._start = parseDay(a) ? isoOf(parseDay(a)) : null;\n this._end = parseDay(b) ? isoOf(parseDay(b)) : null;\n } else if (parseDay(s)) {\n this._day = isoOf(parseDay(s));\n this._time = s.match(/T(\\d{2}:\\d{2})/)?.[1] ?? '';\n }\n // A new value brings its month; without one the month stays.\n const shown = this._day || this._start;\n this._month = shown ? shown.slice(0, 7) : (this._month || this._attrMonth() || this._todayIso().slice(0, 7));\n this._focus = null;\n }\n\n _attrMonth() { const m = this.getAttribute('month'); return /^\\d{4}-\\d{2}$/.test(m || '') ? m : null; }\n _todayIso() { return this.getAttribute('today') || isoOf(new Date()); }\n\n get value() {\n if (this.getBoolAttr('range')) return this._start ? `${this._start}${this._end ? `/${this._end}` : ''}` : '';\n return this._day ? `${this._day}${this.getBoolAttr('time') && this._time ? `T${this._time}` : ''}` : '';\n }\n set value(v) {\n this._readValue(v);\n if (this._grid) this._draw(); else this._pendingValue = String(v ?? '');\n }\n get start() { return this.getBoolAttr('range') ? this._start : this._day; }\n get end() { return this.getBoolAttr('range') ? this._end : this._day; }\n get month() { return this._month; }\n set month(v) {\n if (!/^\\d{4}-\\d{2}$/.test(v)) return;\n this._month = v; this._focus = null;\n if (this._grid) this._draw(); else this._pendingMonth = v;\n }\n get days() { return this._days ?? {}; }\n set days(v) { this._days = v && typeof v === 'object' ? v : {}; if (this._grid) this._draw(); }\n\n // ── markup ──\n _build() {\n const floating = this.getBoolAttr('floating');\n this._cal = this.createElement('div', ['nk-calendar'], { role: 'group' });\n const head = this.createElement('div', ['cal-head']);\n this._title = this.createElement('div', ['cal-title'], { 'aria-live': 'polite' });\n this._todayBtn = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev.innerHTML = CHEVRONS.prev;\n this._next = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._next.innerHTML = CHEVRONS.next;\n head.append(this._title, this._todayBtn, this._prev, this._next);\n this._grid = this.createElement('div', ['cal-grid']);\n this._foot = this.createElement('div', ['cal-foot']);\n this._timeInput = this.createElement('input', ['nk-input'], { type: 'time' });\n this._clear = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._cal.append(head, this._grid);\n this._pop = floating ? this.createElement('div', ['nk-pop', 'floating']) : null;\n if (this._pop) this._pop.appendChild(this._cal);\n this._wrapper.replaceChildren(this._pop ?? this._cal);\n this._draw();\n }\n\n get _hasTime() { return this.getBoolAttr('time') && !this.getBoolAttr('range'); }\n get _locale() { return resolveLocale(this.getAttribute('locale')); }\n get _weekStart() {\n const n = Number(this.getAttribute('week-start'));\n return this.hasAttribute('week-start') && Number.isInteger(n) && n >= 0 && n <= 6 ? n : firstWeekday(this._locale);\n }\n\n _syncPop() {\n this._pop?.classList.toggle('sheet', this.getBoolAttr('sheet'));\n this._pop?.classList.toggle('open', this.getBoolAttr('open'));\n }\n\n _draw() {\n const locale = this._locale, ws = this._weekStart, weeks = this.getBoolAttr('weeks'), range = this.getBoolAttr('range');\n const g = monthGrid(this._month, ws), today = this._todayIso();\n const min = this.getAttribute('min') || '', max = this.getAttribute('max') || '';\n const weekend = new Set((this.getAttribute('weekend') || '').split(',').map(s => s.trim()).filter(Boolean).map(Number));\n let days = this._days;\n if (!days && this.hasAttribute('days')) { try { days = JSON.parse(this.getAttribute('days')); } catch { days = {}; } }\n days ??= {};\n const long = new Intl.DateTimeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });\n this._cal.classList.toggle('weeks', weeks);\n this._syncPop();\n const label = this.getAttribute('label');\n if (label) this._cal.setAttribute('aria-label', label); else this._cal.removeAttribute('aria-label');\n this._title.textContent = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(g.first);\n this._todayBtn.textContent = this.getAttribute('today-label') || this.str('today');\n this._prev.setAttribute('aria-label', this.getAttribute('prev-label') || this.str('previousMonth'));\n this._next.setAttribute('aria-label', this.getAttribute('next-label') || this.str('nextMonth'));\n\n // The one tab stop: the focused day, else the chosen one, else the 1st.\n const cells = Array.from({ length: 42 }, (_, i) => isoOf(g.day(i)));\n const chosen = range ? this._start : this._day;\n if (!this._focus || !cells.includes(this._focus)) this._focus = cells.includes(chosen) ? chosen : `${this._month}-01`;\n\n const nodes = [];\n if (weeks) nodes.push(this._head(this.getAttribute('week-label') || weekLabel(locale)));\n for (const w of weekdayNames(locale, ws, 2)) nodes.push(this._head(w));\n for (let i = 0; i < 42; i++) {\n const d = g.day(i), iso = cells[i], info = days[iso] || {};\n if (weeks && i % 7 === 0) { const wk = this.createElement('span', ['cal-week'], { 'aria-hidden': 'true' }); wk.textContent = isoWeek(d); nodes.push(wk); }\n const inRange = range && this._start && this._end && iso > this._start && iso < this._end;\n const cls = ['cal-day', d.getMonth() !== g.m - 1 && 'out', (weekend.has(d.getDay()) || info.off) && 'off', iso === today && 'today',\n !range && iso === this._day && 'selected', range && iso === this._start && 'start', range && iso === (this._end || this._start) && this._start && 'end', inRange && 'in-range'].filter(Boolean);\n const day = this.createElement('button', cls, { type: 'button', 'data-date': iso, tabindex: iso === this._focus ? '0' : '-1',\n 'aria-pressed': String(cls.includes('selected') || cls.includes('start') || cls.includes('end')),\n 'aria-label': `${long.format(d)}${info.label ? `, ${info.label}` : ''}` });\n if (info.label) day.title = info.label;\n if ((min && iso < min) || (max && iso > max)) day.setAttribute('aria-disabled', 'true');\n day.textContent = d.getDate();\n const marks = (info.marks || []).slice(0, 3);\n if (marks.length) {\n const m = this.createElement('span', ['cal-marks']);\n for (const tone of marks) m.appendChild(this.createElement('i', [tone]));\n day.appendChild(m);\n }\n nodes.push(day);\n }\n // The days are drawn anew; focus inside the grid moves to the new tab stop.\n const focused = this._grid.contains(this._shadow.activeElement);\n this._grid.replaceChildren(...nodes);\n if (focused) this.focusDay();\n\n const time = this._hasTime, clearable = this.getBoolAttr('clearable');\n this._timeInput.value = this._time;\n this._timeInput.setAttribute('aria-label', this.getAttribute('time-label') || this.str('time'));\n this._clear.textContent = this.getAttribute('clear-label') || this.str('clear');\n this._foot.replaceChildren(...[time && this._timeInput, clearable && this._clear].filter(Boolean));\n if (time || clearable) this._cal.appendChild(this._foot); else this._foot.remove();\n this._syncForm();\n }\n\n _syncForm() {\n this.setFormValue(this.value);\n if (this.getBoolAttr('required') && !this.value) this.setValidity({ valueMissing: true }, 'Please choose a date.', this._grid?.querySelector('[tabindex=\"0\"]') ?? undefined);\n else this.setValidity({});\n }\n\n _head(text) {\n const s = this.createElement('span', ['cal-wd'], { 'aria-hidden': 'true' });\n s.textContent = text;\n return s;\n }\n\n // ── interaction ──\n _goMonth(month, focus) {\n if (month !== this._month) { this._month = month; this.emit('nk-month', { month }); }\n this._focus = focus ?? null;\n this._draw();\n }\n\n _pick(iso) {\n const day = this._grid.querySelector(`[data-date=\"${iso}\"]`);\n if (day?.getAttribute('aria-disabled') === 'true') return;\n const before = this.value;\n let done = true;\n if (this.getBoolAttr('range')) {\n if (!this._start || this._end) { this._start = iso; this._end = null; done = false; }\n else if (iso < this._start) { this._end = this._start; this._start = iso; }\n else this._end = iso;\n } else this._day = iso;\n this._focus = iso;\n if (iso.slice(0, 7) !== this._month) this._goMonth(iso.slice(0, 7), iso); else this._draw();\n if (!done) return;\n // Only a new value is a change; the same day again just closes a popover.\n if (this.value !== before) this.emit('nk-change', { value: this.value, start: this.start, end: this.end, time: this._time || null });\n if (this.getBoolAttr('floating') && !this._hasTime) this.close();\n }\n\n setupEvents() {\n this._onGrid = (e) => { const day = e.target.closest('.cal-day'); if (day) this._pick(day.dataset.date); };\n this._onToday = () => { const t = this._todayIso(); this._goMonth(t.slice(0, 7), t); };\n this._onPrev = () => this._goMonth(stepMonth(this._month, -1));\n this._onNext = () => this._goMonth(stepMonth(this._month, 1));\n this._onKey = (e) => {\n // Enter and Space are the day button's own click.\n const day = e.target.closest?.('.cal-day');\n if (!day) return;\n const date = parseDay(day.dataset.date), ws = this._weekStart, wd = (date.getDay() - ws + 7) % 7;\n let target = null;\n if (STEPS[e.key]) target = addDays(date, STEPS[e.key]);\n else if (e.key === 'Home') target = addDays(date, -wd);\n else if (e.key === 'End') target = addDays(date, 6 - wd);\n else if (e.key === 'PageUp' || e.key === 'PageDown') {\n const months = (e.key === 'PageUp' ? -1 : 1) * (e.shiftKey ? 12 : 1);\n const last = new Date(date.getFullYear(), date.getMonth() + months + 1, 0).getDate();\n target = new Date(date.getFullYear(), date.getMonth() + months, Math.min(date.getDate(), last));\n }\n if (!target) return;\n e.preventDefault();\n const iso = isoOf(target);\n if (iso.slice(0, 7) !== this._month) this._goMonth(iso.slice(0, 7), iso);\n else { this._focus = iso; this._draw(); }\n };\n this._onTime = () => {\n this._time = this._timeInput.value;\n this._syncForm();\n if (this._day) this.emit('nk-change', { value: this.value, start: this.start, end: this.end, time: this._time || null });\n };\n this._onClear = () => {\n if (!this.value) return;\n this._day = this._start = this._end = null; this._time = '';\n this._draw();\n this.emit('nk-change', { value: '', start: null, end: null, time: null });\n };\n // Floating: a tap outside closes it and reaches nothing else; Escape closes (captured, before a modal around it).\n this._onOutside = (e) => {\n const path = e.composedPath();\n if (path.includes(this) || (this._anchor && path.includes(this._anchor))) return;\n e.preventDefault(); e.stopPropagation();\n this.close();\n };\n this._onEscape = (e) => { if (e.key === 'Escape' && this.getBoolAttr('floating') && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._grid.addEventListener('click', this._onGrid);\n this._grid.addEventListener('keydown', this._onKey);\n this._todayBtn.addEventListener('click', this._onToday);\n this._prev.addEventListener('click', this._onPrev);\n this._next.addEventListener('click', this._onNext);\n this._timeInput.addEventListener('change', this._onTime);\n this._clear.addEventListener('click', this._onClear);\n document.addEventListener('keydown', this._onEscape, true);\n if (this.getBoolAttr('open')) document.addEventListener('click', this._onOutside, true);\n }\n\n teardownEvents() {\n this._grid?.removeEventListener('click', this._onGrid);\n this._grid?.removeEventListener('keydown', this._onKey);\n this._todayBtn?.removeEventListener('click', this._onToday);\n this._prev?.removeEventListener('click', this._onPrev);\n this._next?.removeEventListener('click', this._onNext);\n this._timeInput?.removeEventListener('change', this._onTime);\n this._clear?.removeEventListener('click', this._onClear);\n document.removeEventListener('keydown', this._onEscape, true);\n document.removeEventListener('click', this._onOutside, true);\n }\n\n onStringsChanged() { if (this._grid) this._draw(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'value') { this._readValue(value); this._draw(); return; }\n if (name === 'month') { this.month = value; return; }\n if (name === 'open' || name === 'sheet') { this._syncPop(); if (name === 'open') this._syncOpen(); return; }\n if (name === 'align') return;\n if (name === 'floating') { this.teardownEvents(); this._build(); if (this.isConnected) this.setupEvents(); return; }\n if (name === 'range') this._readValue(this.getAttribute('value'));\n if (name === 'days') this._days = null;\n this._draw();\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n if (this._anchor) (this._anchor.shadowRoot?.querySelector('button, a[href]') ?? this._anchor).setAttribute('aria-expanded', String(open));\n if (open) {\n this._returnFocus = deepActiveElement();\n if (this._returnFocus?.matches(':focus-visible')) requestAnimationFrame(() => this.focusDay());\n document.addEventListener('click', this._onOutside, true);\n } else {\n document.removeEventListener('click', this._onOutside, true);\n const back = this._returnFocus;\n this._returnFocus = null;\n const active = deepActiveElement();\n if (back?.isConnected && active && this._shadow.contains(active)) back.focus({ preventScroll: true });\n }\n this.emit('nk-toggle', { open });\n }\n\n // ── form ──\n resetValue() { this._readValue(this._initialValue); this._draw(); }\n restoreValue(state) { this._readValue(state); this._draw(); }\n onFormDisabled(disabled) { this._cal?.toggleAttribute('inert', disabled); }\n\n // ── API ──\n /** Opens under `anchor` (with `floating`), on the month of the value. */\n show(anchor) {\n if (anchor) { this._anchor = anchor; placeUnder(this, anchor, this.getAttribute('align')); }\n const shown = this.start;\n if (shown && shown.slice(0, 7) !== this._month) { this._month = shown.slice(0, 7); this._focus = null; this._draw(); }\n this.setBoolAttr('open', true);\n }\n close() { this.setBoolAttr('open', false); }\n toggle(anchor) { this.getBoolAttr('open') ? this.close() : this.show(anchor); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n /** Moves focus to the day with the tab stop. */\n focusDay() { this._grid?.querySelector('[tabindex=\"0\"]')?.focus(); }\n}\n\ncustomElements.define('nk-calendar', NkCalendar);\nexport { NkCalendar };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, deepActiveElement } from '../../util/focus.js';\n\n// <nk-peek id=\"peek\" label=\"Database Table-View\">\n// <nk-btn slot=\"actions\" variant=\"topbar\" aria-label=\"Open as page\"><svg …></svg></nk-btn>\n// <nk-page-title>🗃️ Database Table-View</nk-page-title>\n// <nk-props>…</nk-props>\n// <div class=\"nk-prose\">…</div>\n// <nk-comments>…</nk-comments>\n// </nk-peek>\n// → <div class=\"nk-peek-backdrop open\"><aside class=\"nk-peek\" role=\"dialog\">\n// <div class=\"pk-bar\"><button class=\"nk-topbar-btn\">»</button>…actions…</div>\n// <div class=\"pk-body\">…</div></aside></div>\n//\n// Notion's side peek (NotionKit 1.8.0): a row beside the table, which stays\n// usable – no scrim, nothing inert. show() slides it in and moves focus to\n// it; », Escape and a click elsewhere on the page close it, and Escape and »\n// hand focus back. A click that calls show() again – on another row – only\n// swaps the content, and clicks inside other overlays (a menu opened from\n// the peek) leave it open. Below 860px it is a bottom sheet over a dimmed\n// page; there it is modal: the page is inert and scroll-locked, the dimmed\n// page takes the tap that closes it. Put it directly under <body>.\n//\n// `resizable` (NotionKit 1.10.0): the left edge takes the pointer – and the\n// arrow keys, 16px a step – to make the peek wider or narrower, as in\n// Notion: from `min` (380) to `max` (all but 320px of the window). The width\n// is the token --nk-peek-width, set on :root; `width` (px) sets it too, and\n// nk-resize { width } fires when a drag or a key ends – the moment to keep\n// it. resize-label names the edge (default \"Resize\", in German \"Breite\n// ändern\").\n// `inset`: while it is open on the desktop, the page's <nk-app> gets\n// `peek-inset` – its main column makes room instead of lying under the peek.\nconst CLOSE_ICON = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m6 17 5-5-5-5M13 17l5-5-5-5\"/></svg>';\nconst OVERLAYS = new Set(['nk-menu', 'nk-pop', 'nk-modal', 'nk-sheet', 'nk-dialog', 'nk-cmdk', 'nk-toast']);\nconst OVERLAY_CLASSES = ['nk-pop', 'nk-modal-backdrop', 'nk-sheet-backdrop', 'nk-dialog-backdrop', 'nk-cmdk-backdrop'];\nconst phone = () => matchMedia('(max-width: 860px)').matches;\n\nclass NkPeek extends NkElement {\n static get observedAttributes() { return ['open', 'label', 'close-label', 'resizable', 'width', 'min', 'max', 'resize-label', 'inset']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-peek-backdrop']);\n this._box = this.createElement('aside', ['nk-peek'], { role: 'dialog', tabindex: '-1' });\n this._handle = this.createElement('div', ['pk-resize'], { role: 'separator', 'aria-orientation': 'vertical', tabindex: '0' });\n this._box.appendChild(this._handle);\n const bar = this.createElement('div', ['pk-bar']);\n this._close = this.createElement('button', ['nk-topbar-btn'], { type: 'button' });\n this._close.innerHTML = CLOSE_ICON;\n bar.append(this._close, this.createElement('slot', [], { name: 'actions' }));\n const body = this.createElement('div', ['pk-body']);\n body.appendChild(document.createElement('slot'));\n this._box.append(bar, body);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncLabels();\n this._syncResize();\n if (this.hasAttribute('width')) this._setWidth(Number(this.getAttribute('width')));\n this._syncOpen();\n }\n\n // ── width ──\n get _min() { return Number(this.getAttribute('min')) || 380; }\n get _max() { return Number(this.getAttribute('max')) || Math.max(this._min, innerWidth - 320); }\n /** The peek's width in px – the token --nk-peek-width. */\n get width() { return parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--nk-peek-width')) || 560; }\n set width(v) { this._setWidth(Number(v)); }\n\n _setWidth(w) {\n if (!Number.isFinite(w)) return;\n w = Math.round(Math.min(Math.max(w, this._min), Math.max(this._min, this._max)));\n document.documentElement.style.setProperty('--nk-peek-width', `${w}px`);\n this._handle.setAttribute('aria-valuenow', w);\n }\n\n _syncResize() {\n this._handle.hidden = !this.getBoolAttr('resizable');\n this._handle.setAttribute('aria-label', this.getAttribute('resize-label') || this.str('resize'));\n this._handle.setAttribute('aria-valuemin', this._min);\n this._handle.setAttribute('aria-valuenow', Math.round(this.width));\n }\n\n /** The app whose main column makes room: the peek's own, else the page's. */\n _app() { return this.closest('nk-app') ?? document.querySelector('nk-app'); }\n _syncInset() {\n const on = this.getBoolAttr('inset') && this.getBoolAttr('open') && !phone();\n if (on) this._app()?.setAttribute('peek-inset', '');\n else if (this._insetApp) this._app()?.removeAttribute('peek-inset');\n this._insetApp = on;\n }\n\n _syncLabels() {\n const label = this.getAttribute('label');\n if (label) this._box.setAttribute('aria-label', label); else this._box.removeAttribute('aria-label');\n this._close.setAttribute('aria-label', this.getAttribute('close-label') || this.str('close'));\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._syncInset();\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = deepActiveElement();\n if (phone()) {\n this._modal = true;\n this._box.setAttribute('aria-modal', 'true');\n lockScroll();\n this._undoInert = inertOutside(this);\n }\n requestAnimationFrame(() => this._box.focus({ preventScroll: true }));\n } else {\n if (this._modal) { this._modal = false; this._box.removeAttribute('aria-modal'); unlockScroll(); this._undoInert?.(); this._undoInert = null; }\n const active = deepActiveElement();\n const inside = active && (this.contains(active) || this._shadow.contains(active) || active === document.body);\n const back = this._returnFocus;\n this._returnFocus = null;\n if (inside && back?.isConnected && typeof back.focus === 'function') back.focus({ preventScroll: true });\n }\n }\n\n setupEvents() {\n this._onClose = () => this.close();\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) this.close(); };\n // Bubble phase, after the page's own handlers: a click that showed the\n // peek again (another row) must not close it.\n this._onOutside = (e) => {\n if (!this.getBoolAttr('open') || this._shownAt >= e.timeStamp) return;\n const path = e.composedPath();\n if (path.includes(this)) return;\n if (path.some(n => n.nodeType === 1 && (OVERLAYS.has(n.localName) || OVERLAY_CLASSES.some(c => n.classList.contains(c))))) return;\n this.close();\n };\n // The left edge: a drag with pointer capture, or the arrow keys.\n const resized = () => this.emit('nk-resize', { width: Math.round(this.width) });\n this._onResizeStart = (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n this._handle.setPointerCapture(e.pointerId);\n this._handle.classList.add('active');\n };\n this._onResizeMove = (e) => { if (this._handle.hasPointerCapture(e.pointerId)) this._setWidth(innerWidth - e.clientX); };\n this._onResizeEnd = () => { this._handle.classList.remove('active'); resized(); };\n this._onResizeKey = (e) => {\n const step = { ArrowLeft: 16, ArrowRight: -16 }[e.key];\n if (!step) return;\n e.preventDefault();\n this._setWidth(this.width + step);\n resized();\n };\n this._onViewport = () => this._syncInset();\n this._close.addEventListener('click', this._onClose);\n this._backdrop.addEventListener('click', this._onBackdrop);\n this._handle.addEventListener('pointerdown', this._onResizeStart);\n this._handle.addEventListener('pointermove', this._onResizeMove);\n this._handle.addEventListener('lostpointercapture', this._onResizeEnd);\n this._handle.addEventListener('keydown', this._onResizeKey);\n document.addEventListener('keydown', this._onKey);\n document.addEventListener('click', this._onOutside);\n addEventListener('resize', this._onViewport);\n }\n\n teardownEvents() {\n this._close?.removeEventListener('click', this._onClose);\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n this._handle?.removeEventListener('pointerdown', this._onResizeStart);\n this._handle?.removeEventListener('pointermove', this._onResizeMove);\n this._handle?.removeEventListener('lostpointercapture', this._onResizeEnd);\n this._handle?.removeEventListener('keydown', this._onResizeKey);\n document.removeEventListener('keydown', this._onKey);\n document.removeEventListener('click', this._onOutside);\n removeEventListener('resize', this._onViewport);\n if (this._insetApp) { this._app()?.removeAttribute('peek-inset'); this._insetApp = false; }\n if (this._modal) { this._modal = false; unlockScroll(); this._undoInert?.(); this._undoInert = null; }\n this._wasOpen = false;\n }\n\n onStringsChanged() { this._syncResize(); this._syncLabels(); }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'width') { this._setWidth(Number(value)); return; }\n if (name === 'inset') { this._syncInset(); return; }\n if (name !== 'open') { this._syncLabels(); this._syncResize(); return; }\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n show() { this._shownAt = performance.now(); this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.getBoolAttr('open') ? this.close() : this.show(); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { v ? this.show() : this.close(); }\n}\n\ncustomElements.define('nk-peek', NkPeek);\nexport { NkPeek };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, firstFocusable, deepActiveElement } from '../../util/focus.js';\n\n// <nk-dialog id=\"trash\" title=\"Move “Roadmap” to trash?\" alert>\n// The page and its sub-pages can be restored from Trash for 30 days.\n// <nk-btn slot=\"actions\" variant=\"secondary\" value=\"\">Cancel</nk-btn>\n// <nk-btn slot=\"actions\" variant=\"danger-solid\" value=\"trash\">Move to trash</nk-btn>\n// </nk-dialog>\n// → <div class=\"nk-dialog-backdrop open\"><div class=\"nk-dialog\" role=\"alertdialog\">\n// <div class=\"dl-title\">…</div><div class=\"dl-body\">…</div><div class=\"dl-actions\">…</div></div></div>\n//\n// A question or a short form (NotionKit 1.10.0) with the contract of\n// <nk-modal> and <nk-sheet>: show(), close(), toggle(), nk-toggle; Escape –\n// captured, so it closes before a peek, a menu or a modal behind it – and\n// the backdrop close it; focus moves in, to an [autofocus] element or the\n// first field or button, and back out; the page behind is inert and\n// scroll-locked. It lies above the modal and the sheet, so a question can\n// come from either. 440px, `wide` 560px; below 860px a bottom sheet with the\n// buttons stacked, the confirming one on top.\n// A button in slot=\"actions\" with a `value` closes it with that value, and\n// one anywhere inside with `data-close` with that attribute's value – a\n// button with a value elsewhere, an option of <nk-segmented> say, leaves it\n// open. The submit of a <form method=\"dialog\"> inside closes it too, with\n// its submitter's value. Before it closes, nk-close { value } fires and can\n// be cancelled – the place to check an input dialog; Escape and the\n// backdrop close with ''.\n// `returnValue` keeps the last value. `alert` makes it an alertdialog, named\n// and described by its title and text. `title` is the heading, never a\n// tooltip – see NkElement.takeTitle(). Put it directly under <body>.\nclass NkDialog extends NkElement {\n static get observedAttributes() { return ['open', 'title', 'wide', 'alert']; }\n\n render() {\n this.takeTitle();\n this.returnValue = '';\n this._backdrop = this.createElement('div', ['nk-dialog-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-dialog'], { 'aria-modal': 'true', tabindex: '-1' });\n this._heading = this.createElement('div', ['dl-title'], { id: 'title' });\n const body = this.createElement('div', ['dl-body'], { id: 'body' });\n body.appendChild(document.createElement('slot'));\n this._actions = this.createElement('div', ['dl-actions']);\n this._actionsSlot = this.createElement('slot', [], { name: 'actions' });\n this._actions.appendChild(this._actionsSlot);\n this._box.append(this._heading, body, this._actions);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncTitle();\n this._syncMode();\n this._syncOpen();\n }\n\n _syncTitle() {\n const text = this._titleText || '';\n this._heading.textContent = text;\n this._heading.hidden = !text;\n if (text) this._box.setAttribute('aria-labelledby', 'title');\n else this._box.removeAttribute('aria-labelledby');\n }\n\n _syncMode() {\n const alert = this.getBoolAttr('alert');\n this._box.setAttribute('role', alert ? 'alertdialog' : 'dialog');\n if (alert) this._box.setAttribute('aria-describedby', 'body'); else this._box.removeAttribute('aria-describedby');\n this._box.classList.toggle('wide', this.getBoolAttr('wide'));\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = this._from ?? deepActiveElement();\n this._from = null;\n // An overlay behind – a modal – made this host inert; the dialog lifts that while it is open.\n this._wasInert = this.inert;\n this.inert = false;\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => (this.querySelector('[autofocus]') || firstFocusable(this) || this._box).focus({ preventScroll: true }));\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n this.inert = this._wasInert;\n const back = this._returnFocus;\n this._returnFocus = null;\n if (back?.isConnected && typeof back.focus === 'function') back.focus({ preventScroll: true });\n }\n }\n\n setupEvents() {\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(''); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(''); } };\n // A button in the actions with a value closes it, and one with data-close\n // anywhere inside; a submit button is the form's.\n this._onClick = (e) => {\n const path = e.composedPath(), own = path.slice(0, Math.max(0, path.indexOf(this))).filter(n => n instanceof Element && this.contains(n));\n const button = own.find(n => n.localName === 'nk-btn' || n.localName === 'button');\n if (!button || button.getAttribute('type') === 'submit' || button.hasAttribute('disabled')) return;\n if (button.hasAttribute('data-close')) { this.close(button.getAttribute('data-close')); return; }\n if (button.hasAttribute('value') && own.some(n => n.getAttribute('slot') === 'actions')) this.close(button.getAttribute('value'));\n };\n this._onSubmit = (e) => {\n if ((e.target.getAttribute('method') || '').toLowerCase() !== 'dialog') return;\n e.preventDefault();\n this.close(e.submitter?.value || e.submitter?.getAttribute?.('value') || 'submit');\n };\n this._onSlot = () => { this._actions.hidden = !this._actionsSlot.assignedElements().length; };\n this._backdrop.addEventListener('click', this._onBackdrop);\n this.addEventListener('click', this._onClick);\n this.addEventListener('submit', this._onSubmit);\n this._actionsSlot.addEventListener('slotchange', this._onSlot);\n document.addEventListener('keydown', this._onKey, true);\n this._onSlot();\n }\n\n teardownEvents() {\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n this.removeEventListener('click', this._onClick);\n this.removeEventListener('submit', this._onSubmit);\n this._actionsSlot?.removeEventListener('slotchange', this._onSlot);\n document.removeEventListener('keydown', this._onKey, true);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onAttributeChanged(name, oldValue, value) {\n if (name === 'title') { if (this.takeTitle(value)) this._syncTitle(); return; }\n if (name !== 'open') { this._syncMode(); return; }\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n /** Opens it; focus goes back to `from` when it closes (default: what had focus – pass the ⋯ of a menu that closes). */\n show(from) { this.returnValue = ''; this._from = from ?? null; this.setBoolAttr('open', true); }\n /** Closes with `value`, unless an nk-close listener cancels it. Returns whether it closed. */\n close(value = '') {\n if (!this.getBoolAttr('open')) return false;\n if (!this.emit('nk-close', { value })) return false;\n this.returnValue = value;\n this.setBoolAttr('open', false);\n return true;\n }\n toggle() { this.getBoolAttr('open') ? this.close('') : this.show(); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { v ? this.show() : this.close(''); }\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._syncTitle(); }\n}\n\ncustomElements.define('nk-dialog', NkDialog);\nexport { NkDialog };\n","import { NkElement } from '../../base.js';\nimport { placeNear } from '../../util/floating.js';\nimport { deepActiveElement } from '../../util/focus.js';\n\n// <nk-tooltip></nk-tooltip> one for the page: every [data-tooltip]\n// <button data-tooltip=\"Close sidebar\" data-tooltip-key=\"⌘\\\">«</button>\n// <nk-tooltip for=\"saveBtn\" shortcut=\"⌘S\">Save the page</nk-tooltip>\n// tip.show(barOrRect, 'Shell · 12.10.–30.11.'); tip.hide();\n// → <div class=\"nk-tooltip open\" role=\"tooltip\">Close sidebar<span class=\"tt-key\">⌘\\</span></div>\n//\n// Notion's hover hint (NotionKit 1.10.0). Without `for` it serves every\n// element with data-tooltip – and data-tooltip-key for a shortcut – on the\n// page, inside shadow roots too: the tooltips of a whole toolbar in one\n// element. With `for` it belongs to the element with that id and shows its\n// own content and `shortcut`. It appears after `delay` ms (400) under the\n// pointer and at once on keyboard focus, never on touch; leaving, a press,\n// blur, scrolling – the wheel too, inside a shadow root – and Escape hide\n// it. It sits 6px below its target and centred, above it where the window\n// ends – placement=\"top\" prefers above – and 8px inside the window\n// (placeNear in util/floating.js). show(target, text, shortcut) takes an\n// element or a rect, for what has no element of its own: the bars of a\n// Gantt chart; such a tooltip stays until hide(), the pointer on another\n// [data-tooltip], a press or Escape. A line break in the text is kept.\n// While it shows, the target's aria-describedby names it (in the same\n// document or shadow root).\nconst hostSheet = new CSSStyleSheet();\nhostSheet.replaceSync(`:host { display: block; position: fixed; top: 0; left: 0; z-index: 130; pointer-events: none; }`);\nlet count = 0;\n\nclass NkTooltip extends NkElement {\n static get hostStyles() { return hostSheet; }\n static get observedAttributes() { return ['for', 'shortcut']; }\n\n render() {\n this._bubble = this.createElement('div', ['nk-tooltip'], { role: 'tooltip' });\n this._slot = document.createElement('slot');\n this._text = document.createTextNode('');\n this._key = this.createElement('span', ['tt-key']);\n this._bubble.append(this._slot, this._text, this._key);\n this._wrapper.appendChild(this._bubble);\n this._fill(null);\n }\n\n get _delay() { const d = Number(this.getAttribute('delay')); return this.hasAttribute('delay') && d >= 0 ? d : 400; }\n\n /** Own content (text null) or a given text and shortcut. */\n _fill(text, key = this.getAttribute('shortcut')) {\n this._slot.style.display = text == null ? '' : 'none';\n this._text.data = text ?? '';\n this._bubble.classList.toggle('lines', (text ?? '').includes('\\n'));\n this._key.textContent = key || '';\n this._key.hidden = !key;\n }\n\n /** Shows it at `target` – an element or a rect – with `text` (else its own content) and `shortcut`. */\n show(target, text, shortcut) {\n clearTimeout(this._timer);\n if (!target) return;\n // What the pointer is on now: a rect has no element, so moving over the\n // page leaves a tooltip shown for one alone.\n this._target = target instanceof Element ? target : null;\n this._fill(text ?? null, shortcut);\n this._describe(target);\n placeNear(this, target, this.getAttribute('placement') === 'top' ? 'top' : 'bottom');\n this._bubble.classList.add('open');\n }\n\n hide() {\n clearTimeout(this._timer);\n this._bubble?.classList.remove('open');\n this._describe(null);\n this._target = null;\n }\n\n get open() { return !!this._bubble?.classList.contains('open'); }\n\n _describe(target) {\n if (this._described) {\n const ids = (this._described.getAttribute('aria-describedby') || '').split(/\\s+/).filter(id => id && id !== this.id);\n ids.length ? this._described.setAttribute('aria-describedby', ids.join(' ')) : this._described.removeAttribute('aria-describedby');\n this._described = null;\n }\n if (!(target instanceof Element) || target.getRootNode() !== this.getRootNode()) return;\n this.id ||= `nk-tooltip-${++count}`;\n const ids = (target.getAttribute('aria-describedby') || '').split(/\\s+/).filter(Boolean);\n if (!ids.includes(this.id)) target.setAttribute('aria-describedby', [...ids, this.id].join(' '));\n this._described = target;\n }\n\n /** The element this tooltip serves for an event: its `for` target, or the nearest [data-tooltip]. */\n _targetOf(e) {\n const path = e.composedPath();\n const own = this.getAttribute('for');\n if (own) { const el = this.getRootNode().getElementById?.(own); return el && path.includes(el) ? el : null; }\n return path.find(n => n instanceof Element && n.hasAttribute('data-tooltip')) ?? null;\n }\n\n _showFor(el) {\n const own = this.hasAttribute('for');\n this.show(el, own ? null : el.getAttribute('data-tooltip'), own ? this.getAttribute('shortcut') : el.getAttribute('data-tooltip-key'));\n }\n\n setupEvents() {\n this._onOver = (e) => {\n const el = e.pointerType === 'touch' ? null : this._targetOf(e);\n if (el === this._target) return;\n this.hide();\n if (!el) return;\n this._target = el;\n this._timer = setTimeout(() => this._showFor(el), this._delay);\n };\n this._onFocus = (e) => {\n const el = this._targetOf(e);\n if (!el || !deepActiveElement()?.matches(':focus-visible')) return;\n this.hide();\n this._target = el;\n this._showFor(el);\n };\n this._onHide = () => this.hide();\n this._onKey = (e) => { if (e.key === 'Escape' && this.open) this.hide(); };\n document.addEventListener('pointerover', this._onOver);\n document.addEventListener('focusin', this._onFocus);\n document.addEventListener('focusout', this._onHide);\n document.addEventListener('pointerdown', this._onHide, true);\n document.addEventListener('scroll', this._onHide, true);\n // Scroll events do not leave a shadow root; the wheel does.\n document.addEventListener('wheel', this._onHide, { capture: true, passive: true });\n document.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n document.removeEventListener('pointerover', this._onOver);\n document.removeEventListener('focusin', this._onFocus);\n document.removeEventListener('focusout', this._onHide);\n document.removeEventListener('pointerdown', this._onHide, true);\n document.removeEventListener('scroll', this._onHide, true);\n document.removeEventListener('wheel', this._onHide, { capture: true });\n document.removeEventListener('keydown', this._onKey);\n this.hide();\n }\n\n onAttributeChanged(name) { if (name === 'shortcut' && !this._text.data) this._fill(null); if (name === 'for') this.hide(); }\n}\n\ncustomElements.define('nk-tooltip', NkTooltip);\nexport { NkTooltip };\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside, firstFocusable } from '../../util/focus.js';\n\n// <nk-modal id=\"settings\">\n// <nk-settings-user slot=\"user\" name=\"…\" mail=\"…\"></nk-settings-user>\n// <nk-settings-pane name=\"profile\" group=\"Account\" icon=\"👤\" label=\"My profile\" title=\"My profile\" active>…</nk-settings-pane>\n// <nk-settings-pane name=\"members\" group=\"Workspace\" icon=\"👥\" label=\"Members\" title=\"Members\">…</nk-settings-pane>\n// </nk-modal>\n// → <div class=\"nk-modal-backdrop open\"><div class=\"nk-modal\" role=\"dialog\">\n// <nav class=\"nk-settings-nav\">…user… section labels + tree rows…</nav>\n// <div class=\"nk-settings-content\">…panes…</div></div></div>\n//\n// The modal renders the nav rows itself from the panes' label/icon/group, so\n// `.nk-settings-nav .nk-tree-item` and the 860px icon-rail rules match with\n// no JS breakpoint. Escape and the backdrop close it; focus moves in and\n// back out; the page behind is scroll-locked and inert. Put the element\n// directly under <body>: a transformed ancestor would trap the fixed backdrop.\nclass NkModal extends NkElement {\n static get observedAttributes() { return ['open', 'pane']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-modal-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-modal'], { role: 'dialog', 'aria-modal': 'true', tabindex: '-1' });\n this._nav = this.createElement('nav', ['nk-settings-nav'], { 'aria-label': this.str('settings') });\n this._nav.appendChild(this.createElement('slot', [], { name: 'user' }));\n this._rows = document.createElement('div');\n this._nav.appendChild(this._rows);\n this._nav.appendChild(this.createElement('slot', [], { name: 'nav' }));\n this._content = this.createElement('div', ['nk-settings-content']);\n this._slot = document.createElement('slot');\n this._content.appendChild(this._slot);\n this._box.append(this._nav, this._content);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._syncOpen();\n this.requestNav();\n }\n\n get panes() { return [...this.querySelectorAll(':scope > nk-settings-pane')]; }\n\n /** Rebuilds the nav from the panes (debounced – panes upgrade after the modal). */\n requestNav() {\n if (this._navQueued) return;\n this._navQueued = true;\n queueMicrotask(() => { this._navQueued = false; this._buildNav(); });\n }\n\n _buildNav() {\n if (!this._rows) return;\n const panes = this.panes;\n const labelled = panes.filter(p => p.getAttribute('label'));\n this._rows.replaceChildren();\n this._nav.style.display = (labelled.length || this.querySelector(':scope > [slot=\"nav\"], :scope > [slot=\"user\"]')) ? '' : 'none';\n let lastGroup = null;\n for (const pane of labelled) {\n const group = pane.getAttribute('group');\n if (group && group !== lastGroup) {\n const label = this.createElement('div', ['nk-section-label']);\n label.textContent = group;\n this._rows.appendChild(label);\n lastGroup = group;\n }\n const row = this.createElement('div', ['nk-tree-item'], { role: 'tab', tabindex: '0', 'data-pane': pane.name });\n const icon = this.createElement('span', ['icon']);\n icon.textContent = pane.getAttribute('icon') || '';\n const text = this.createElement('span', ['label']);\n text.textContent = pane.getAttribute('label');\n row.append(icon, text);\n this._rows.appendChild(row);\n }\n this._syncActive();\n }\n\n /** Marks the active pane and its nav row without rebuilding the rows (keeps focus). */\n _syncActive() {\n const panes = this.panes;\n let current = this.getAttribute('pane');\n if (!panes.some(p => p.name === current)) current = (panes.find(p => p.hasAttribute('active')) || panes[0])?.name ?? null;\n for (const row of this._rows.querySelectorAll('[data-pane]')) {\n const on = row.dataset.pane === current;\n row.classList.toggle('active', on);\n row.setAttribute('aria-selected', on ? 'true' : 'false');\n }\n for (const pane of panes) pane.active = pane.name === current;\n this._current = current;\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = document.activeElement;\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => {\n const target = this._rows.querySelector('.nk-tree-item.active') || firstFocusable(this) || this._box;\n target.focus({ preventScroll: true });\n });\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n const back = this._returnFocus;\n if (back && typeof back.focus === 'function' && back.isConnected) back.focus({ preventScroll: true });\n this._returnFocus = null;\n }\n }\n\n setupEvents() {\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._onNavClick = (e) => { const row = e.target.closest('[data-pane]'); if (row) { row.focus(); this.pane = row.dataset.pane; } };\n this._onNavKey = (e) => {\n const row = e.target.closest?.('[data-pane]');\n if (!row) return;\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this.pane = row.dataset.pane; return; }\n const dir = { ArrowDown: 1, ArrowUp: -1 }[e.key];\n if (!dir) return;\n const rows = [...this._rows.querySelectorAll('[data-pane]')];\n const next = rows[(rows.indexOf(row) + dir + rows.length) % rows.length];\n e.preventDefault(); next.focus(); this.pane = next.dataset.pane;\n };\n this._onSlot = () => this.requestNav();\n this._backdrop.addEventListener('click', this._onBackdrop);\n document.addEventListener('keydown', this._onKey);\n this._rows.addEventListener('click', this._onNavClick);\n this._rows.addEventListener('keydown', this._onNavKey);\n this._slot.addEventListener('slotchange', this._onSlot);\n }\n\n teardownEvents() {\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n document.removeEventListener('keydown', this._onKey);\n this._rows?.removeEventListener('click', this._onNavClick);\n this._rows?.removeEventListener('keydown', this._onNavKey);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onStringsChanged() { this._nav.setAttribute('aria-label', this.str('settings')); }\n\n onAttributeChanged(name) {\n if (name === 'open') {\n this._syncOpen();\n this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n } else if (name === 'pane') {\n const before = this._current;\n this._syncActive();\n if (this._current !== before) this.emit('nk-select', { value: this._current, label: this.panes.find(p => p.name === this._current)?.getAttribute('label') ?? this._current });\n }\n }\n\n show(pane) { if (pane) this.setAttribute('pane', pane); this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get pane() { return this._current ?? this.getAttribute('pane'); }\n set pane(v) { this.setAttribute('pane', v); }\n}\n\ncustomElements.define('nk-modal', NkModal);\nexport { NkModal };\n","import { NkElement } from '../../base.js';\n\n// <nk-settings-pane name=\"profile\" label=\"My profile\" icon=\"👤\" group=\"Account\" title=\"My profile\" active>…</nk-settings-pane>\n// `title` is the heading, never a tooltip – see NkElement.takeTitle().\n// → <section class=\"nk-settings-pane active\"><h2>My profile</h2>…</section>\n// `label`, `icon` and `group` feed the nav that <nk-modal> renders; `title`\n// renders the pane heading (child-combinator rule, so it lives here). Slotted\n// <h2>/<h3> are styled by their twins.\nclass NkSettingsPane extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'icon', 'group', 'title', 'active']; }\n\n render() {\n this._section = this.createElement('section', ['nk-settings-pane'], { role: 'tabpanel' });\n this._h2 = document.createElement('h2');\n this._section.appendChild(this._h2);\n this._section.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._section);\n this.takeTitle();\n this._sync();\n }\n\n _sync() {\n const title = this._titleText;\n this._h2.textContent = title || '';\n this._h2.style.display = title ? '' : 'none';\n this._section.classList.toggle('active', this.getBoolAttr('active'));\n this._section.setAttribute('aria-label', this.getAttribute('label') || title || this.getAttribute('name') || '');\n }\n\n onAttributeChanged(name, _old, value) {\n if (name === 'title' && !this.takeTitle(value)) return;\n this._sync();\n if (['label', 'icon', 'group', 'name'].includes(name)) this.closest('nk-modal')?.requestNav?.();\n }\n\n get title() { return this._titleText ?? ''; }\n set title(v) { this._titleText = v == null ? '' : String(v); if (this._initialized) this._sync(); }\n get name() { return this.getAttribute('name') ?? this.getAttribute('label') ?? ''; }\n get active() { return this.getBoolAttr('active'); }\n set active(v) { this.setBoolAttr('active', v); }\n}\n\ncustomElements.define('nk-settings-pane', NkSettingsPane);\nexport { NkSettingsPane };\n","import { NkElement } from '../../base.js';\n\n// <nk-settings-user slot=\"user\" name=\"Marcel Karas\" mail=\"marcel@…\" avatar=\"MK\"></nk-settings-user>\n// → <div class=\"nk-settings-user\"><div class=\"avatar\">MK</div><div class=\"u-text\"><div class=\"name\">…</div><div class=\"mail\">…</div></div></div>\nclass NkSettingsUser extends NkElement {\n static get observedAttributes() { return ['name', 'mail', 'avatar']; }\n\n render() {\n const box = this.createElement('div', ['nk-settings-user']);\n this._avatar = this.createElement('div', ['avatar']);\n const s = this.createElement('slot', [], { name: 'avatar' });\n s.appendChild(this._avatar);\n const text = this.createElement('div', ['u-text']);\n this._name = this.createElement('div', ['name']);\n this._mail = this.createElement('div', ['mail']);\n text.append(this._name, this._mail);\n box.append(s, text);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n const name = this.getAttribute('name') || '';\n this._name.textContent = name;\n const mail = this.getAttribute('mail');\n this._mail.textContent = mail || '';\n this._mail.style.display = mail ? '' : 'none';\n this._avatar.textContent = this.getAttribute('avatar') || name.split(/\\s+/).map(w => w[0]).join('').slice(0, 2).toUpperCase();\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-settings-user', NkSettingsUser);\nexport { NkSettingsUser };\n","// Subsequence scoring for the command palette: every query character must\n// appear in order; consecutive hits, word starts and an early first hit score\n// higher. Returns 0 when the query does not match.\nexport function fuzzyScore(query, text) {\n const q = query.trim().toLowerCase();\n if (!q) return 1;\n const t = text.toLowerCase();\n let ti = 0, score = 0, streak = 0;\n for (let qi = 0; qi < q.length; qi++) {\n const idx = t.indexOf(q[qi], ti);\n if (idx < 0) return 0;\n const wordStart = idx === 0 || /[\\s\\-_/.]/.test(t[idx - 1]);\n streak = idx === ti ? streak + 1 : 0;\n score += 1 + streak * 2 + (wordStart ? 3 : 0) - Math.min(3, (idx - ti) * 0.25);\n ti = idx + 1;\n }\n if (t.startsWith(q)) score += 10;\n return Math.max(0.01, score / (1 + t.length / 40));\n}\n","import { NkElement } from '../../base.js';\nimport { lockScroll, unlockScroll, inertOutside } from '../../util/focus.js';\nimport { fuzzyScore } from '../../util/fuzzy.js';\n\n// <nk-cmdk id=\"palette\" placeholder=\"Search or type a command …\"></nk-cmdk>\n// palette.commands = [\n// { group: 'Pages', items: [{ id: 'mvp', icon: '🚀', label: 'NotionKit MVP', keywords: 'project' }] },\n// { group: 'Actions', items: [{ id: 'theme', icon: '🌙', label: 'Toggle theme', shortcut: '⌘⇧L', action: () => … }] },\n// ];\n// → <div class=\"nk-cmdk-backdrop open\"><div class=\"nk-cmdk\"><div class=\"nk-cmdk-input-row\">🔍<input><kbd>esc</kbd></div>\n// <div class=\"nk-cmdk-list\">…</div><div class=\"nk-cmdk-footer\">…</div></div></div>\n// mod+K toggles (attribute `hotkey`), ↑↓ move, Enter picks (nk-command +\n// item.action), Escape / backdrop close. Fuzzy subsequence search over\n// label + keywords. Put the element directly under <body>.\nclass NkCmdk extends NkElement {\n static get observedAttributes() { return ['open', 'hotkey', 'placeholder']; }\n\n render() {\n this._backdrop = this.createElement('div', ['nk-cmdk-backdrop']);\n this._backdrop.inert = true;\n this._box = this.createElement('div', ['nk-cmdk'], { role: 'dialog', 'aria-modal': 'true' });\n const row = this.createElement('div', ['nk-cmdk-input-row']);\n const glass = document.createElement('span');\n glass.style.fontSize = '15px';\n glass.textContent = '🔍';\n this._input = this.createElement('input', [], { type: 'text', autocomplete: 'off', role: 'combobox', 'aria-expanded': 'true', 'aria-autocomplete': 'list' });\n const esc = this.createElement('kbd', ['nk-kbd']);\n esc.textContent = 'esc';\n row.append(glass, this._input, esc);\n this._list = this.createElement('div', ['nk-cmdk-list'], { role: 'listbox', id: 'list' });\n this._input.setAttribute('aria-controls', 'list');\n this._footer = this.createElement('div', ['nk-cmdk-footer']);\n const footerSlot = this.createElement('slot', [], { name: 'footer' });\n footerSlot.innerHTML = '<span><kbd class=\"nk-kbd\">↑</kbd><kbd class=\"nk-kbd\">↓</kbd> navigate</span><span><kbd class=\"nk-kbd\">↵</kbd> open</span><span><kbd class=\"nk-kbd\">⌘</kbd><kbd class=\"nk-kbd\">K</kbd> toggle</span>';\n this._footer.appendChild(footerSlot);\n this._box.append(row, this._list, this._footer);\n this._backdrop.appendChild(this._box);\n this._wrapper.appendChild(this._backdrop);\n this._commands = [];\n this._index = 0;\n this._syncAttrs();\n this._renderList();\n this._syncOpen();\n }\n\n _syncAttrs() {\n this._input.placeholder = this.getAttribute('placeholder') || this.str('commandPlaceholder');\n this._box.setAttribute('aria-label', this.str('commandPalette'));\n }\n onStringsChanged() { this._syncAttrs(); }\n\n /** Filtered, flat list in group order, best matches first within a group. */\n results() {\n const q = this._input?.value ?? '';\n const out = [];\n for (const group of this._commands) {\n const scored = (group.items || []).map(item => ({ item, group: group.group, score: fuzzyScore(q, `${item.label} ${item.keywords || ''}`) })).filter(r => r.score > 0);\n scored.sort((a, b) => b.score - a.score);\n out.push(...scored);\n }\n return out;\n }\n\n _renderList() {\n if (!this._list) return;\n const results = this.results();\n this._index = Math.min(this._index, Math.max(0, results.length - 1));\n this._list.replaceChildren();\n if (!results.length) {\n const empty = this.createElement('div', ['nk-cmdk-empty']);\n empty.textContent = `No results for “${this._input.value}”`;\n this._list.appendChild(empty);\n this._input.removeAttribute('aria-activedescendant');\n return;\n }\n let lastGroup = null;\n results.forEach((r, i) => {\n if (r.group && r.group !== lastGroup) {\n const g = this.createElement('div', ['nk-cmdk-group']);\n g.textContent = r.group;\n this._list.appendChild(g);\n lastGroup = r.group;\n }\n const el = this.createElement('div', ['nk-cmdk-item'], { role: 'option', id: `opt-${i}`, 'data-index': i });\n el.classList.toggle('selected', i === this._index);\n el.setAttribute('aria-selected', i === this._index ? 'true' : 'false');\n const icon = this.createElement('span', ['m-icon']);\n icon.textContent = r.item.icon || '';\n const label = document.createElement('span');\n label.textContent = r.item.label;\n el.append(icon, label);\n if (r.item.shortcut) { const sc = this.createElement('span', ['m-shortcut']); sc.textContent = r.item.shortcut; el.appendChild(sc); }\n this._list.appendChild(el);\n });\n this._input.setAttribute('aria-activedescendant', `opt-${this._index}`);\n }\n\n _move(dir) {\n const n = this.results().length;\n if (!n) return;\n this._index = (this._index + dir + n) % n;\n for (const el of this._list.querySelectorAll('.nk-cmdk-item')) {\n const on = Number(el.dataset.index) === this._index;\n el.classList.toggle('selected', on);\n el.setAttribute('aria-selected', on ? 'true' : 'false');\n if (on) el.scrollIntoView({ block: 'nearest' });\n }\n this._input.setAttribute('aria-activedescendant', `opt-${this._index}`);\n }\n\n pick(index = this._index) {\n const r = this.results()[index];\n if (!r) return;\n const query = this._input.value;\n this.close();\n const ok = this.emit('nk-command', { id: r.item.id ?? r.item.label, item: r.item, query });\n if (ok && typeof r.item.action === 'function') r.item.action(r.item);\n }\n\n _matchesHotkey(e) {\n const spec = (this.getAttribute('hotkey') || 'mod+k').toLowerCase().split('+');\n const key = spec.pop();\n const mod = spec.includes('mod') ? (e.metaKey || e.ctrlKey) : true;\n const shift = spec.includes('shift') ? e.shiftKey : !e.shiftKey;\n const alt = spec.includes('alt') ? e.altKey : !e.altKey;\n return mod && shift && alt && e.key.toLowerCase() === key;\n }\n\n _syncOpen() {\n const open = this.getBoolAttr('open');\n this._backdrop.classList.toggle('open', open);\n this._backdrop.inert = !open;\n if (open === this._wasOpen) return;\n this._wasOpen = open;\n if (open) {\n this._returnFocus = document.activeElement;\n this._input.value = '';\n this._index = 0;\n this._renderList();\n lockScroll();\n this._undoInert = inertOutside(this);\n requestAnimationFrame(() => this._input.focus({ preventScroll: true }));\n } else {\n unlockScroll();\n this._undoInert?.(); this._undoInert = null;\n const back = this._returnFocus;\n if (back && typeof back.focus === 'function' && back.isConnected) back.focus({ preventScroll: true });\n this._returnFocus = null;\n }\n }\n\n setupEvents() {\n this._onDocKey = (e) => {\n if (this._matchesHotkey(e)) { e.preventDefault(); this.toggle(); return; }\n if (e.key === 'Escape' && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); }\n };\n this._onInput = () => { this._index = 0; this._renderList(); };\n this._onInputKey = (e) => {\n if (e.key === 'ArrowDown') { e.preventDefault(); this._move(1); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); this._move(-1); }\n else if (e.key === 'Enter') { e.preventDefault(); this.pick(); }\n };\n this._onListClick = (e) => { const el = e.target.closest('.nk-cmdk-item'); if (el) this.pick(Number(el.dataset.index)); };\n this._onListMove = (e) => { const el = e.target.closest('.nk-cmdk-item'); if (el && Number(el.dataset.index) !== this._index) { this._index = Number(el.dataset.index); this._move(0); } };\n this._onListDown = (e) => e.preventDefault(); // keep the input focused\n this._onBackdrop = (e) => { if (e.target === this._backdrop) this.close(); };\n document.addEventListener('keydown', this._onDocKey);\n this._input.addEventListener('input', this._onInput);\n this._input.addEventListener('keydown', this._onInputKey);\n this._list.addEventListener('click', this._onListClick);\n this._list.addEventListener('mousemove', this._onListMove);\n this._list.addEventListener('mousedown', this._onListDown);\n this._backdrop.addEventListener('click', this._onBackdrop);\n }\n\n teardownEvents() {\n document.removeEventListener('keydown', this._onDocKey);\n this._input?.removeEventListener('input', this._onInput);\n this._input?.removeEventListener('keydown', this._onInputKey);\n this._list?.removeEventListener('click', this._onListClick);\n this._list?.removeEventListener('mousemove', this._onListMove);\n this._list?.removeEventListener('mousedown', this._onListDown);\n this._backdrop?.removeEventListener('click', this._onBackdrop);\n if (this._wasOpen) { unlockScroll(); this._undoInert?.(); this._undoInert = null; this._wasOpen = false; }\n }\n\n onAttributeChanged(name) {\n if (name === 'open') { this._syncOpen(); this.emit('nk-toggle', { open: this.getBoolAttr('open') }); }\n else this._syncAttrs();\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get commands() { return this._commands; }\n set commands(list) { this._commands = Array.isArray(list) ? list : []; this._index = 0; this._renderList(); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get query() { return this._input?.value ?? ''; }\n set query(v) { if (this._input) { this._input.value = v; this._index = 0; this._renderList(); } }\n}\n\ncustomElements.define('nk-cmdk', NkCmdk);\nexport { NkCmdk };\n","import { NkElement } from '../../base.js';\nimport { deepActiveElement } from '../../util/focus.js';\nimport { placeUnder } from '../../util/floating.js';\n\n// <nk-menu>\n// <nk-menu-item type=\"label\">Page</nk-menu-item>\n// <nk-menu-item icon=\"✏️\" shortcut=\"⌘E\" value=\"rename\">Rename</nk-menu-item>\n// <nk-menu-item type=\"separator\"></nk-menu-item>\n// <nk-menu-item icon=\"🗑️\" danger value=\"delete\">Delete</nk-menu-item>\n// </nk-menu>\n// → <div class=\"nk-pop nk-menu\" role=\"menu\">…</div>\n// ↑↓ move between items, Enter selects, nk-select bubbles from the item.\n//\n// <nk-menu floating sheet> is a menu over the page (NotionKit 1.7.0): it\n// fades in like the palette when `open` is set and is a bottom sheet on a\n// phone. The host becomes the fixed box you position – show(anchor) puts it\n// under the anchor, right edges aligned (align=\"start\": left edges). A tap\n// outside closes it and reaches nothing else; Escape and a chosen item\n// close it too, a switch row does not. Opened from the keyboard, focus moves\n// to the first item; closing returns it to where it was.\nconst floatSheet = new CSSStyleSheet();\nfloatSheet.replaceSync(`:host([floating]) { display: block; position: fixed; top: 0; left: 0; z-index: 106; pointer-events: none; }`);\n\nclass NkMenu extends NkElement {\n static get hostStyles() { return floatSheet; }\n static get observedAttributes() { return ['floating', 'sheet', 'open', 'align']; }\n\n render() {\n this._box = this.createElement('div', ['nk-pop', 'nk-menu'], { role: 'menu' });\n this._box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n this._syncMode();\n }\n\n _syncMode() {\n this._box.classList.toggle('floating', this.getBoolAttr('floating'));\n this._box.classList.toggle('sheet', this.getBoolAttr('sheet'));\n this._box.classList.toggle('open', this.getBoolAttr('open'));\n }\n\n onAttributeChanged(name) {\n this._syncMode();\n if (name !== 'open') return;\n const open = this.getBoolAttr('open');\n // aria-expanded belongs on the control itself, inside a host such as <nk-btn>.\n if (this._anchor) (this._anchor.shadowRoot?.querySelector('button, a[href]') ?? this._anchor).setAttribute('aria-expanded', String(open));\n if (open) {\n this._returnFocus = deepActiveElement();\n if (this._returnFocus?.matches(':focus-visible')) requestAnimationFrame(() => this.focusFirst());\n document.addEventListener('click', this._onOutside, true);\n } else {\n document.removeEventListener('click', this._onOutside, true);\n const back = this._returnFocus;\n this._returnFocus = null;\n if (back?.isConnected && this.contains(document.activeElement)) back.focus({ preventScroll: true });\n }\n this.emit('nk-toggle', { open });\n }\n\n /** Opens under `anchor` (any element, display: contents hosts included). */\n show(anchor) {\n if (anchor) {\n this._anchor = anchor;\n placeUnder(this, anchor, this.getAttribute('align'));\n }\n this.setBoolAttr('open', true);\n }\n close() { this.setBoolAttr('open', false); }\n toggle(anchor) { this.getBoolAttr('open') ? this.close() : this.show(anchor); }\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n\n get items() { return [...this.querySelectorAll(':scope > nk-menu-item')].filter(i => i.selectable); }\n\n setupEvents() {\n this._onKey = (e) => {\n const dir = { ArrowDown: 1, ArrowUp: -1 }[e.key];\n const current = e.target.closest?.('nk-menu-item');\n const items = this.items;\n if (!items.length) return;\n if (dir) {\n e.preventDefault();\n const i = items.indexOf(current);\n items[(i + dir + items.length) % items.length].focus();\n } else if ((e.key === 'Enter' || e.key === ' ') && current) {\n e.preventDefault(); current.select();\n }\n };\n this.addEventListener('keydown', this._onKey);\n // Floating: outside taps close and go nowhere else; Escape and a chosen item close.\n this._onOutside = (e) => {\n const path = e.composedPath();\n if (path.includes(this) || (this._anchor && path.includes(this._anchor))) return;\n e.preventDefault(); e.stopPropagation();\n this.close();\n };\n // Captured, so a menu inside a modal or sheet closes before they do.\n this._onEscape = (e) => { if (e.key === 'Escape' && this.getBoolAttr('floating') && this.getBoolAttr('open')) { e.stopPropagation(); this.close(); } };\n this._onSelect = () => { if (this.getBoolAttr('floating')) this.close(); };\n document.addEventListener('keydown', this._onEscape, true);\n this.addEventListener('nk-select', this._onSelect);\n if (this.getBoolAttr('open')) document.addEventListener('click', this._onOutside, true);\n }\n\n teardownEvents() {\n this.removeEventListener('keydown', this._onKey);\n document.removeEventListener('keydown', this._onEscape, true);\n this.removeEventListener('nk-select', this._onSelect);\n document.removeEventListener('click', this._onOutside, true);\n }\n\n /** Focuses the first item (called by a popover when it opens). */\n focusFirst() { this.items[0]?.focus(); }\n}\n\ncustomElements.define('nk-menu', NkMenu);\nexport { NkMenu };\n","import { NkElement } from '../../base.js';\n\n// <nk-menu-item icon=\"✏️\" shortcut=\"⌘E\" value=\"rename\">Rename</nk-menu-item>\n// <nk-menu-item type=\"separator\"></nk-menu-item> <nk-menu-item type=\"label\">Danger</nk-menu-item>\n// <nk-menu-item icon=\"🗑️\" danger value=\"delete\">Delete</nk-menu-item>\n// <nk-menu-item type=\"switch\" icon=\"🔡\" value=\"small\" checked>Small text</nk-menu-item>\n// <nk-menu-item type=\"check\" icon=\"◉\" value=\"open\" checked>Status: Open</nk-menu-item>\n// → <div class=\"nk-menu-item danger\"><span class=\"m-icon\">🗑️</span>Delete<span class=\"m-shortcut\">…</span></div>\n// A switch item carries a .nk-switch on the right, as \"Small text\" does in\n// Notion's page menu; a check item a ✓ where the shortcut stands, as in a\n// filter menu. A click on either flips `checked` and fires nk-change\n// { value, checked } instead of nk-select, so the menu around it stays open.\nclass NkMenuItem extends NkElement {\n static get observedAttributes() { return ['icon', 'shortcut', 'danger', 'value', 'type', 'disabled', 'checked']; }\n\n render() { this._build(); }\n\n _build() {\n const type = this.getAttribute('type');\n let el;\n if (type === 'separator') {\n el = this.createElement('div', ['nk-menu-sep'], { role: 'separator' });\n } else if (type === 'label') {\n el = this.createElement('div', ['nk-menu-label']);\n el.appendChild(document.createElement('slot'));\n } else {\n const isSwitch = type === 'switch';\n this._check = type === 'check';\n el = this.createElement('div', ['nk-menu-item'], { role: isSwitch || this._check ? 'menuitemcheckbox' : 'menuitem', tabindex: '-1' });\n this._icon = this.createElement('span', ['m-icon']);\n const iconSlot = this.createElement('slot', [], { name: 'icon' });\n iconSlot.appendChild(this._icon);\n this._shortcut = this.createElement('span', ['m-shortcut']);\n el.append(iconSlot, document.createElement('slot'), this._shortcut);\n this._switch = isSwitch ? this.createElement('span', ['nk-switch'], { 'aria-hidden': 'true' }) : null;\n if (this._switch) el.appendChild(this._switch);\n }\n if (this._el) { this._el.removeEventListener('click', this._onClick); this._el.replaceWith(el); } else this._wrapper.appendChild(el);\n this._el = el;\n if (this._onClick) el.addEventListener('click', this._onClick);\n this._sync();\n }\n\n _sync() {\n if (!this._el.classList.contains('nk-menu-item')) return;\n const icon = this.getAttribute('icon');\n this._icon.textContent = icon || '';\n this._icon.style.display = icon ? '' : 'none';\n const sc = this.getAttribute('shortcut');\n this._shortcut.textContent = sc || '';\n this._shortcut.style.display = sc ? '' : 'none';\n this._el.classList.toggle('danger', this.getBoolAttr('danger'));\n this._el.setAttribute('aria-disabled', this.getBoolAttr('disabled') ? 'true' : 'false');\n if (this._switch || this._check) {\n const on = this.getBoolAttr('checked') ? 'true' : 'false';\n this._el.setAttribute('aria-checked', on);\n if (this._switch) this._switch.setAttribute('aria-checked', on);\n if (this._check) { this._shortcut.textContent = on === 'true' ? '✓' : ''; this._shortcut.style.display = ''; }\n }\n }\n\n setupEvents() {\n this._onClick = () => this.select();\n this._el.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._el?.removeEventListener('click', this._onClick); }\n\n select() {\n if (!this._el.classList.contains('nk-menu-item') || this.getBoolAttr('disabled')) return;\n if (this._switch || this._check) {\n this.checked = !this.checked;\n this.emit('nk-change', { value: this.value, checked: this.checked, item: this });\n return;\n }\n this.emit('nk-select', { value: this.value, label: this.textContent.trim(), item: this });\n }\n\n onAttributeChanged(name) { name === 'type' ? this._build() : this._sync(); }\n focus(o) { this._el?.focus(o); }\n get selectable() { return this._el?.classList.contains('nk-menu-item') && !this.getBoolAttr('disabled'); }\n\n get checked() { return this.getBoolAttr('checked'); }\n set checked(v) { this.setBoolAttr('checked', v); }\n get value() { return this.getAttribute('value') ?? this.textContent.trim(); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-menu-item', NkMenuItem);\nexport { NkMenuItem };\n","import { NkElement } from '../../base.js';\n\n// <nk-pop placement=\"bottom-start\">\n// <nk-btn slot=\"trigger\" variant=\"secondary\">Options</nk-btn>\n// <nk-menu>…</nk-menu>\n// </nk-pop>\n// The trigger stays in the light DOM; a click on it toggles `open`, outside\n// clicks and Escape close. Content is wrapped in `.nk-pop` unless it brings\n// its own surface (nk-menu, nk-emoji-picker) or `bare` is set. The only\n// styling here is positioning – the surface look is the stylesheet's.\nconst popSheet = new CSSStyleSheet();\npopSheet.replaceSync(`\n .nk-pop-anchor { position: relative; display: inline-block; }\n .nk-pop-float { display: none; position: absolute; z-index: 50; top: 100%; left: 0; margin-top: 4px; }\n :host([open]) .nk-pop-float { display: block; }\n :host([placement=\"bottom-end\"]) .nk-pop-float { left: auto; right: 0; }\n :host([placement=\"top-start\"]) .nk-pop-float { top: auto; bottom: 100%; margin: 0 0 4px; }\n :host([placement=\"top-end\"]) .nk-pop-float { top: auto; bottom: 100%; left: auto; right: 0; margin: 0 0 4px; }\n`);\nconst OWN_SURFACE = new Set(['nk-menu', 'nk-emoji-picker']);\n\nclass NkPop extends NkElement {\n static get hostStyles() { return popSheet; }\n static get observedAttributes() { return ['open', 'placement', 'bare']; }\n\n render() {\n const anchor = this.createElement('div', ['nk-pop-anchor']);\n this._triggerSlot = this.createElement('slot', [], { name: 'trigger' });\n this._float = this.createElement('div', ['nk-pop-float']);\n this._surface = this.createElement('div', ['nk-pop']);\n this._slot = document.createElement('slot');\n this._surface.appendChild(this._slot);\n this._float.appendChild(this._surface);\n anchor.append(this._triggerSlot, this._float);\n this._wrapper.appendChild(anchor);\n this._syncSurface();\n }\n\n _syncSurface() {\n const bare = this.getBoolAttr('bare') || this._slot.assignedElements().some(el => OWN_SURFACE.has(el.localName));\n this._surface.className = bare ? '' : 'nk-pop';\n }\n\n setupEvents() {\n this._onTrigger = (e) => {\n if (!e.composedPath().some(n => n instanceof Element && n.getAttribute?.('slot') === 'trigger')) return;\n e.stopPropagation();\n this.toggle();\n };\n this._onDocClick = (e) => { if (this.getBoolAttr('open') && !e.composedPath().includes(this)) this.close(); };\n this._onKey = (e) => { if (e.key === 'Escape' && this.getBoolAttr('open')) this.close(); };\n this._onSelect = (e) => { if (e.target !== this) this.close(); };\n this._onSlot = () => this._syncSurface();\n this.addEventListener('click', this._onTrigger);\n document.addEventListener('click', this._onDocClick);\n document.addEventListener('keydown', this._onKey);\n this._float.addEventListener('nk-select', this._onSelect);\n this._slot.addEventListener('slotchange', this._onSlot);\n }\n\n teardownEvents() {\n this.removeEventListener('click', this._onTrigger);\n document.removeEventListener('click', this._onDocClick);\n document.removeEventListener('keydown', this._onKey);\n this._float?.removeEventListener('nk-select', this._onSelect);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged(name) {\n if (name === 'bare') this._syncSurface();\n if (name === 'open') {\n const open = this.getBoolAttr('open');\n for (const el of this._triggerSlot.assignedElements()) el.setAttribute('aria-expanded', open ? 'true' : 'false');\n this.emit('nk-toggle', { open });\n }\n }\n\n show() { this.setBoolAttr('open', true); }\n close() { this.setBoolAttr('open', false); }\n toggle() { this.setBoolAttr('open', !this.getBoolAttr('open')); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get placement() { return this.getAttribute('placement') || 'bottom-start'; }\n set placement(v) { this.setAttribute('placement', v); }\n}\n\ncustomElements.define('nk-pop', NkPop);\nexport { NkPop };\n","// Built-in emoji set for <nk-emoji-picker>: eight categories, names for\n// search. Override with `picker.emojis = [{ char, name, cat }]`.\nconst C = (cat, icon, list) => list.map(([char, name]) => ({ char, name, cat, icon }));\nexport const EMOJI_CATEGORIES = [\n { id: 'smileys', icon: '😀' }, { id: 'people', icon: '👋' }, { id: 'nature', icon: '🌿' }, { id: 'food', icon: '☕' },\n { id: 'activity', icon: '🎯' }, { id: 'travel', icon: '🚀' }, { id: 'objects', icon: '💡' }, { id: 'symbols', icon: '✅' },\n];\nexport const EMOJI = [\n ...C('smileys', '😀', [['😀', 'grinning'], ['😊', 'smile blush'], ['😂', 'joy laugh'], ['🙂', 'slight smile'], ['😉', 'wink'], ['😍', 'heart eyes love'], ['🤔', 'thinking'], ['😎', 'cool sunglasses'], ['🥳', 'party'], ['😴', 'sleep'], ['🤯', 'mind blown'], ['😅', 'sweat smile'], ['🙃', 'upside down'], ['😇', 'angel halo'], ['🤗', 'hug'], ['😢', 'cry sad']]),\n ...C('people', '👋', [['👋', 'wave hello'], ['👍', 'thumbs up'], ['👎', 'thumbs down'], ['🙏', 'pray thanks'], ['👏', 'clap'], ['🤝', 'handshake deal'], ['💪', 'strong'], ['👀', 'eyes look'], ['🧠', 'brain knowledge'], ['❤️', 'heart love'], ['👤', 'person user'], ['👥', 'people team members'], ['🧑‍💻', 'developer'], ['🙋', 'raise hand'], ['✍️', 'writing'], ['🫶', 'heart hands']]),\n ...C('nature', '🌿', [['🌿', 'leaf herb'], ['🌱', 'seedling'], ['🌳', 'tree'], ['🌸', 'blossom flower'], ['🌞', 'sun'], ['🌙', 'moon night'], ['⭐', 'star'], ['🔥', 'fire hot'], ['🌈', 'rainbow'], ['🌊', 'wave water'], ['🍀', 'clover luck'], ['🐝', 'bee'], ['🦋', 'butterfly'], ['🐢', 'turtle'], ['🌍', 'earth globe'], ['❄️', 'snow']]),\n ...C('food', '☕', [['☕', 'coffee'], ['🍵', 'tea'], ['🍎', 'apple'], ['🍕', 'pizza'], ['🍰', 'cake'], ['🍪', 'cookie'], ['🥐', 'croissant'], ['🍔', 'burger'], ['🍜', 'noodles'], ['🍺', 'beer'], ['🍷', 'wine'], ['🥗', 'salad'], ['🍫', 'chocolate'], ['🍓', 'strawberry'], ['🥑', 'avocado'], ['🍩', 'donut']]),\n ...C('activity', '🎯', [['🎯', 'target goal'], ['🏆', 'trophy win'], ['🎉', 'tada celebration'], ['🎨', 'art palette design'], ['🎙️', 'microphone podcast voice'], ['🎬', 'clapper movie'], ['🎮', 'game'], ['⚽', 'football'], ['🏃', 'run'], ['🧘', 'yoga calm'], ['🎵', 'music'], ['🎲', 'dice'], ['🏁', 'finish flag'], ['🎓', 'graduation learn'], ['🧩', 'puzzle piece'], ['🔁', 'repeat retro']]),\n ...C('travel', '🚀', [['🚀', 'rocket launch'], ['✈️', 'plane travel'], ['🚗', 'car'], ['🚲', 'bike'], ['🏠', 'house home'], ['🏢', 'office building'], ['🗺️', 'map'], ['🧭', 'compass'], ['⛰️', 'mountain'], ['🏖️', 'beach'], ['🚉', 'station'], ['🛰️', 'satellite'], ['🌆', 'city'], ['🏕️', 'camping'], ['⛵', 'sailboat'], ['🛫', 'departure']]),\n ...C('objects', '💡', [['💡', 'idea bulb'], ['📊', 'chart bar'], ['📈', 'chart up'], ['📅', 'calendar date'], ['📄', 'page document'], ['📁', 'folder'], ['🗃️', 'card box database'], ['📌', 'pin'], ['🔍', 'search'], ['🛠️', 'tools'], ['⚙️', 'gear settings'], ['🔔', 'bell notification'], ['💎', 'gem diamond'], ['📝', 'memo notes'], ['📎', 'paperclip files'], ['🔒', 'lock secure'], ['💬', 'speech comment'], ['📤', 'export outbox'], ['📥', 'inbox'], ['🗑️', 'trash bin'], ['🖥️', 'desktop'], ['📱', 'phone'], ['💻', 'laptop'], ['🧾', 'receipt']]),\n ...C('symbols', '✅', [['✅', 'check done'], ['✨', 'sparkles ai magic'], ['❌', 'cross no'], ['⚠️', 'warning'], ['ℹ️', 'info'], ['❓', 'question'], ['➕', 'plus add'], ['➡️', 'arrow right'], ['🔴', 'red circle'], ['🟢', 'green circle'], ['🟡', 'yellow circle'], ['🔵', 'blue circle'], ['⏳', 'hourglass wait'], ['♻️', 'recycle'], ['🆕', 'new'], ['💯', 'hundred']]),\n];\n","import { NkElement } from '../../base.js';\nimport { EMOJI, EMOJI_CATEGORIES } from '../../util/emoji.js';\n\n// <nk-emoji-picker></nk-emoji-picker>\n// → <div class=\"nk-pop\"><input class=\"nk-emoji-search\"><div class=\"nk-emoji-grid\">…</div><div class=\"nk-emoji-cats\">…</div></div>\n// Built-in set with names for search; `picker.emojis = [{ char, name, cat }]`\n// replaces it. A click fires nk-select { emoji }.\nclass NkEmojiPicker extends NkElement {\n static get observedAttributes() { return ['placeholder', 'value']; }\n\n render() {\n this._box = this.createElement('div', ['nk-pop']);\n this._search = this.createElement('input', ['nk-emoji-search'], { type: 'search', autocomplete: 'off' });\n this._grid = this.createElement('div', ['nk-emoji-grid'], { role: 'listbox' });\n this._cats = this.createElement('div', ['nk-emoji-cats'], { role: 'tablist' });\n this._box.append(this._search, this._grid, this._cats);\n this._wrapper.appendChild(this._box);\n this._emojis = EMOJI;\n this._cat = EMOJI_CATEGORIES[0].id;\n this._renderCats();\n this._renderGrid();\n this._syncAttrs();\n }\n\n _syncAttrs() {\n this._search.placeholder = this.getAttribute('placeholder') || this.str('emojiPlaceholder');\n this._search.setAttribute('aria-label', this.str('searchEmoji'));\n }\n onStringsChanged() { this._syncAttrs(); }\n\n _renderCats() {\n this._cats.replaceChildren();\n const cats = this._categories();\n for (const cat of cats) {\n const el = this.createElement('span', [], { role: 'tab', 'data-cat': cat.id, title: cat.id });\n el.textContent = cat.icon;\n el.classList.toggle('active', cat.id === this._cat);\n this._cats.appendChild(el);\n }\n this._cats.style.display = cats.length > 1 ? '' : 'none';\n }\n\n _categories() {\n if (this._catList) return this._catList;\n const seen = new Map();\n for (const e of this._emojis) if (e.cat && !seen.has(e.cat)) seen.set(e.cat, { id: e.cat, icon: e.icon || EMOJI_CATEGORIES.find(c => c.id === e.cat)?.icon || e.char });\n return [...seen.values()];\n }\n\n _renderGrid() {\n const q = this._search.value.trim().toLowerCase();\n const list = q ? this._emojis.filter(e => (e.name || '').toLowerCase().includes(q) || e.char === q) : this._emojis.filter(e => !e.cat || e.cat === this._cat);\n this._grid.replaceChildren();\n for (const e of list.slice(0, 64)) {\n const s = this.createElement('span', [], { role: 'option', title: e.name || '', 'data-emoji': e.char });\n s.textContent = e.char;\n this._grid.appendChild(s);\n }\n for (const el of this._cats.children) el.classList.toggle('active', !q && el.dataset.cat === this._cat);\n }\n\n setupEvents() {\n this._onInput = () => this._renderGrid();\n this._onGrid = (e) => { const s = e.target.closest('[data-emoji]'); if (s) this.select(s.dataset.emoji); };\n this._onCats = (e) => { const c = e.target.closest('[data-cat]'); if (!c) return; this._cat = c.dataset.cat; this._search.value = ''; this._renderGrid(); };\n this._onKey = (e) => { if (e.key === 'Enter') { const first = this._grid.querySelector('[data-emoji]'); if (first) this.select(first.dataset.emoji); } };\n this._search.addEventListener('input', this._onInput);\n this._search.addEventListener('keydown', this._onKey);\n this._grid.addEventListener('click', this._onGrid);\n this._cats.addEventListener('click', this._onCats);\n }\n\n teardownEvents() {\n this._search?.removeEventListener('input', this._onInput);\n this._search?.removeEventListener('keydown', this._onKey);\n this._grid?.removeEventListener('click', this._onGrid);\n this._cats?.removeEventListener('click', this._onCats);\n }\n\n select(emoji) {\n this.setAttribute('value', emoji);\n this.emit('nk-select', { emoji, value: emoji });\n }\n\n onAttributeChanged() { this._syncAttrs(); }\n focus(o) { this._search?.focus(o); }\n\n /** Category strip override: [{ id, icon }]. Emojis without `cat` show in every category. */\n get categories() { return this._categories(); }\n set categories(list) { this._catList = Array.isArray(list) && list.length ? list : null; this._cat = this._categories()[0]?.id; this._renderCats(); this._renderGrid(); }\n get emojis() { return this._emojis; }\n set emojis(list) { this._emojis = Array.isArray(list) ? list : EMOJI; this._cat = this._categories()[0]?.id; this._renderCats(); this._renderGrid(); }\n get value() { return this.getAttribute('value'); }\n set value(v) { this.setAttribute('value', v); }\n}\n\ncustomElements.define('nk-emoji-picker', NkEmojiPicker);\nexport { NkEmojiPicker };\n","import { NkElement } from '../../base.js';\n\n// <nk-toast id=\"toast\"></nk-toast> … toast.show('Saved');\n// → <div class=\"nk-toast show\">✓ Saved</div>\n// One node, bottom-centred, auto-hides after `duration` ms (default 2200).\n// Above a tab bar at the bottom of the screen it rises 12px over the bar:\n// notionkit.css does that for class markup with :has(), which cannot see\n// into shadow roots, so the element measures the bar when it opens.\nclass NkToast extends NkElement {\n static get observedAttributes() { return ['open', 'duration', 'icon']; }\n\n render() {\n this._box = this.createElement('div', ['nk-toast'], { role: 'status', 'aria-live': 'polite' });\n this._icon = document.createElement('span');\n this._msg = document.createElement('span');\n this._box.append(this._icon, this._msg, document.createElement('slot'));\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n if (this.getBoolAttr('open')) this._lift();\n this._box.classList.toggle('show', this.getBoolAttr('open'));\n const icon = this.getAttribute('icon') ?? '✓';\n this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n }\n\n // A bar counts when it is rendered and ends near the bottom of the viewport –\n // the app's own bar, fixed, sticky or floating. A tab bar shown as a preview\n // somewhere in a page does not lift the toast.\n _lift() {\n const bars = [...document.querySelectorAll('.nk-tab-bar')];\n for (const host of document.querySelectorAll('nk-tab-bar')) {\n const bar = host.shadowRoot?.querySelector('.nk-tab-bar');\n if (bar) bars.push(bar);\n }\n const rect = bars.map(b => b.getBoundingClientRect())\n .find(r => r.height > 0 && r.top < innerHeight && r.bottom > innerHeight - 60);\n this._box.style.bottom = rect ? `${Math.round(innerHeight - rect.top + 12)}px` : '';\n }\n\n /** Shows `message` (or the slotted content when omitted) and hides it again after `duration`. */\n show(message, { duration } = {}) {\n if (message !== undefined) this._msg.textContent = message;\n clearTimeout(this._timer);\n this.setBoolAttr('open', true);\n const ms = duration ?? Number(this.getAttribute('duration')) ?? 2200;\n if (ms > 0) this._timer = setTimeout(() => this.close(), ms || 2200);\n }\n\n close() { clearTimeout(this._timer); this.setBoolAttr('open', false); }\n\n onAttributeChanged(name) {\n this._sync();\n if (name === 'open') this.emit('nk-toggle', { open: this.getBoolAttr('open') });\n }\n\n disconnectedCallback() { super.disconnectedCallback(); clearTimeout(this._timer); }\n\n get open() { return this.getBoolAttr('open'); }\n set open(v) { this.setBoolAttr('open', v); }\n get message() { return this._msg?.textContent ?? ''; }\n set message(v) { if (this._msg) this._msg.textContent = v; }\n}\n\ncustomElements.define('nk-toast', NkToast);\nexport { NkToast };\n","import { NkElement } from '../../base.js';\n\n// <nk-database id=\"db\" view=\"table\" add-view>\n// <nk-table-view name=\"table\" label=\"▦ Table\" count></nk-table-view>\n// <nk-board-view name=\"board\" label=\"▤ Board\" group-by=\"status\"></nk-board-view>\n// </nk-database>\n// db.columns = [{ key: 'name', label: 'Name', type: 'text', icon: '📄', title: true }, { key: 'status', type: 'select', options: [...] }, …];\n// db.rows = [{ id: 1, icon: '🧭', name: '…', status: 'done', … }];\n// <nk-btn slot=\"tools\" variant=\"tool\">Filter</nk-btn> … sit right of the tabs,\n// <nk-filter-bar slot=\"filters\"> under them (NotionKit 1.7.0's toolbar).\n// → <div class=\"nk-database\"><div class=\"nk-db-toolbar\"><div class=\"nk-db-tabs\">…</div>\n// <div class=\"tools\">…</div></div>…filters…active view…</div>\n// The tabs come from the child views; data is pushed into every view.\nclass NkDatabase extends NkElement {\n static get observedAttributes() { return ['view', 'add-view']; }\n\n render() {\n this._box = this.createElement('div', ['nk-database']);\n this._toolbar = this.createElement('div', ['nk-db-toolbar']);\n this._tabs = this.createElement('div', ['nk-db-tabs'], { role: 'tablist' });\n const tools = this.createElement('div', ['tools']);\n this._toolsSlot = this.createElement('slot', [], { name: 'tools' });\n tools.appendChild(this._toolsSlot);\n this._toolbar.append(this._tabs, tools);\n this._slot = document.createElement('slot');\n this._box.append(this._toolbar, this.createElement('slot', [], { name: 'filters' }), this._slot);\n this._wrapper.appendChild(this._box);\n this._columns = []; this._rows = [];\n this._sync();\n }\n\n get views() { return this._slot?.assignedElements().filter(el => /^nk-[a-z]+-view$/.test(el.localName)) ?? []; }\n\n _sync() {\n if (!this._tabs) return;\n const views = this.views;\n let current = this.getAttribute('view');\n if (!views.some(v => v.name === current)) current = views[0]?.name ?? null;\n this._tabs.replaceChildren();\n for (const v of views) {\n const tab = this.createElement('span', ['nk-db-tab'], { role: 'tab', 'data-view': v.name, tabindex: '0' });\n tab.classList.toggle('active', v.name === current);\n tab.setAttribute('aria-selected', v.name === current ? 'true' : 'false');\n tab.append(document.createTextNode(v.getAttribute('label') || v.name));\n const badge = v.hasAttribute('count') ? String(this._rows.length) : v.getAttribute('badge');\n if (badge) { const b = this.createElement('span', ['badge']); b.textContent = badge; tab.appendChild(b); }\n this._tabs.appendChild(tab);\n v.hidden = v.name !== current;\n // A method call, not a property write: a view that has not been upgraded\n // yet would otherwise get an own `data` property that shadows its setter.\n v.setData?.(this._columns, this._rows);\n }\n if (this.getBoolAttr('add-view')) {\n const add = this.createElement('span', ['nk-db-tab', 'add'], { role: 'button', 'data-add': '', tabindex: '0' });\n add.textContent = '+';\n this._tabs.appendChild(add);\n }\n this._toolbar.hidden = !views.length && !this._toolsSlot.assignedElements().length;\n this._current = current;\n }\n\n /** Views upgrade after the database; each one asks for a resync once rendered. */\n requestSync() {\n if (this._syncQueued) return;\n this._syncQueued = true;\n queueMicrotask(() => { this._syncQueued = false; this._sync(); });\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const tab = e.target.closest('[data-view]');\n if (tab) { this.view = tab.dataset.view; return; }\n if (e.target.closest('[data-add]')) this.emit('nk-action', { action: 'add-view' });\n };\n this._onKey = (e) => { if ((e.key === 'Enter' || e.key === ' ') && e.target.closest('[data-view],[data-add]')) { e.preventDefault(); e.target.click(); } };\n this._onSlot = () => this._sync();\n this._tabs.addEventListener('click', this._onClick);\n this._tabs.addEventListener('keydown', this._onKey);\n this._slot.addEventListener('slotchange', this._onSlot);\n this._toolsSlot.addEventListener('slotchange', this._onSlot);\n this._sync();\n }\n\n teardownEvents() {\n this._tabs?.removeEventListener('click', this._onClick);\n this._tabs?.removeEventListener('keydown', this._onKey);\n this._slot?.removeEventListener('slotchange', this._onSlot);\n this._toolsSlot?.removeEventListener('slotchange', this._onSlot);\n }\n\n onAttributeChanged(name) {\n const before = this._current;\n this._sync();\n if (name === 'view' && this._current !== before) this.emit('nk-view-change', { view: this._current });\n }\n\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._sync(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._sync(); }\n get view() { return this._current ?? this.getAttribute('view'); }\n set view(v) { this.setAttribute('view', v); }\n /** Re-renders every view after in-place row mutations. */\n refresh() { this._sync(); }\n}\n\ncustomElements.define('nk-database', NkDatabase);\nexport { NkDatabase };\n","// Polymorphic property renderer for database views. Returns plain DOM built\n// from NotionKit classes – deliberately not a custom element: every cell rule\n// starts with `.nk-table`, so a cell inside its own shadow root would never\n// be styled. Exported for consumers who render tables themselves.\n//\n// column: { key, label, type, icon, options: [{ value, label, color }], title }\n// types: text | select | multi-select | date | person | checkbox | url | number | progress | actions\n// url: a string is an address outside, opened in a new tab; { href, label,\n// target } a link of your own – to another page of the app, with its text.\n// actions: buttons for the row from column.actions [{ action, label, icon,\n// danger, disabled, tooltip }]; the row's value – action names or objects –\n// picks which of them it shows, all of them without one.\n// text: a string, or { text, desc, color, tooltip, sort } – one of Notion's\n// nine text colours for a tone, a quiet second line under it, the whole\n// text in a tooltip (served by <nk-tooltip>), a value to sort by.\n// progress: 0–100, the bar and its percentage as Intl writes it in\n// column.locale, else the page's language (\"45 %\" in German).\n// date: the value as given, or with column.format ('short', 'relative' or\n// Intl.DateTimeFormat options) and column.locale formatted from an ISO date\n// or date-time, D.M.YYYY, a Date or a timestamp; { start, end } is a range.\n// Sorting (compareBy) goes by column.sortKey – another field of the row –\n// when there is one, else by a value's `sort`, a date's time, a select's\n// place among its options; empty cells come last in both directions.\nimport { paintAvatar, initialsOf } from './avatar.js';\nimport { resolveLocale } from './dates.js';\n\nconst el = (tag, cls, text) => { const n = document.createElement(tag); if (cls) n.className = cls; if (text != null) n.textContent = text; return n; };\nconst COLORS = ['gray', 'brown', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'red'];\n\nexport function optionFor(column, value) {\n const opts = column.options || [];\n return opts.find(o => o.value === value) || opts.find(o => o.label === value) || null;\n}\n\nexport function tagFor(column, value) {\n const opt = optionFor(column, value);\n const color = opt?.color && COLORS.includes(opt.color) ? opt.color : 'gray'; // Notion's default option colour\n return el('span', `nk-tag ${color}`, opt?.label ?? String(value));\n}\n\n/** The text of a value: a string as it is, a text, link or person object's text, label or name. */\nexport const textOf = v => (v && typeof v === 'object' ? v.text ?? v.label ?? v.name ?? '' : String(v ?? ''));\n\n/** The time of a date value in ms: an ISO date – local midnight – or date-time, D.M.YYYY, a Date, a timestamp, a range's start; NaN when it is none. */\nexport function timeOf(v) {\n if (v instanceof Date) return v.getTime();\n if (typeof v === 'number') return v;\n if (v && typeof v === 'object') return timeOf(v.start);\n const s = String(v ?? '').trim();\n let m = s.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/);\n if (m) return new Date(+m[3], +m[2] - 1, +m[1]).getTime();\n m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (m) return new Date(+m[1], +m[2] - 1, +m[3]).getTime();\n return /^\\d{4}-\\d{2}-\\d{2}T/.test(s) ? Date.parse(s) : NaN;\n}\n\n/**\n * A date as its column shows it: as given without column.format; 'short' –\n * day and month, the year when it is not this one; 'relative' – minutes or\n * hours ago or ahead within a day, else the short date; or the options of\n * Intl.DateTimeFormat. A range { start, end } stands as start → end.\n */\nexport function formatDate(column, value) {\n if (value && typeof value === 'object' && !(value instanceof Date)) return [value.start, value.end].filter(Boolean).map(v => formatDate(column, v)).join(' → ');\n const format = column.format, t = timeOf(value);\n if (!format || Number.isNaN(t)) return String(value ?? '');\n const d = new Date(t), locale = column.locale || resolveLocale();\n if (format === 'relative') {\n const minutes = Math.round((t - Date.now()) / 60000), rel = new Intl.RelativeTimeFormat(locale, { numeric: 'auto', style: 'short' });\n if (Math.abs(minutes) < 60) return rel.format(minutes, 'minute');\n if (Math.abs(minutes) < 24 * 60) return rel.format(Math.round(minutes / 60), 'hour');\n }\n if (format === 'short' || format === 'relative') {\n const year = d.getFullYear() === new Date().getFullYear() ? {} : { year: 'numeric' };\n return d.toLocaleDateString(locale, { day: '2-digit', month: '2-digit', ...year });\n }\n return typeof format === 'object' ? new Intl.DateTimeFormat(locale, format).format(d) : String(value);\n}\n\nexport function renderPropertyCell(column, value, row = {}) {\n const type = column.type || 'text';\n if (type === 'actions') return actions(column, value);\n if (value === undefined || value === null || value === '') {\n if (type === 'checkbox') return checkbox(column, false, row);\n if (type === 'progress') return progress(column, 0);\n return el('span', type === 'person' ? 'person-cell' : null, type === 'text' && column.title ? '' : '—');\n }\n switch (type) {\n case 'select': return tagFor(column, value);\n case 'multi-select': {\n const wrap = el('span');\n wrap.style.display = 'inline-flex'; wrap.style.gap = '4px'; wrap.style.flexWrap = 'wrap';\n for (const v of Array.isArray(value) ? value : String(value).split(',').map(s => s.trim()).filter(Boolean)) wrap.appendChild(tagFor(column, v));\n return wrap;\n }\n case 'date': return el('span', 'date-cell', formatDate(column, value));\n case 'person': {\n const cell = el('span', 'person-cell');\n const p = typeof value === 'string' ? { name: value } : value;\n // color: one of Notion's nine names, or any CSS background; none – the avatar gradient.\n const avatar = el('span', 'nk-avatar small', p.initials || p.avatar || initialsOf(p.name));\n paintAvatar(avatar, p.color);\n cell.append(avatar, document.createTextNode(' ' + (p.name || '')));\n return cell;\n }\n case 'checkbox': return checkbox(column, !!value, row);\n case 'url': {\n const link = typeof value === 'object' ? value : { href: String(value), label: String(value).replace(/^https?:\\/\\//, ''), target: '_blank' };\n const a = el('a', null, link.label ?? link.href);\n a.href = link.href ?? '';\n if (link.target) a.target = link.target;\n if (link.target === '_blank') a.rel = 'noopener';\n return a;\n }\n // column.locale / column.format: Intl.NumberFormat locale and options, e.g. { minimumFractionDigits: 1 }.\n case 'number': return el('span', null, typeof value === 'number' ? value.toLocaleString(column.locale, column.format) : String(value));\n case 'progress': return progress(column, Number(value) || 0);\n default: {\n const o = typeof value === 'object' ? value : { text: value };\n let t;\n if (column.title) {\n t = el('span', 'row-title');\n if (row.icon) t.append(document.createTextNode(row.icon + ' '));\n t.append(document.createTextNode(String(o.text ?? '')));\n } else if (typeof value === 'object') {\n t = el('span', o.color && COLORS.includes(o.color) ? `td-text ${o.color}` : 'td-text', String(o.text ?? ''));\n } else return el('span', null, String(value));\n if (o.tooltip) t.dataset.tooltip = o.tooltip;\n if (!o.desc) return t;\n const frag = document.createDocumentFragment();\n frag.append(t, el('span', 'td-desc', String(o.desc)));\n return frag;\n }\n }\n}\n\nfunction actions(column, value) {\n const all = column.actions || [];\n const list = value == null ? all\n : (Array.isArray(value) ? value : [value]).map(v => typeof v === 'string' ? all.find(a => a.action === v) ?? { action: v, label: v } : v);\n const wrap = el('span', 'row-actions');\n for (const a of list) {\n const b = el('button', `nk-btn ${a.danger ? 'danger' : 'secondary'} small`, [a.icon, a.label ?? a.action].filter(Boolean).join(' '));\n b.type = 'button';\n b.dataset.action = a.action;\n b.disabled = !!a.disabled;\n if (a.tooltip) b.dataset.tooltip = a.tooltip;\n wrap.appendChild(b);\n }\n return wrap;\n}\n\nfunction checkbox(column, checked, row) {\n const label = el('label', 'nk-check');\n const input = el('input');\n input.type = 'checkbox'; input.checked = checked;\n input.dataset.key = column.key;\n if (row.id != null) input.dataset.rowId = row.id;\n label.appendChild(input);\n return label;\n}\n\nfunction progress(column, value) {\n const frag = document.createDocumentFragment();\n const bar = el('span', 'nk-progress');\n const fill = el('i'); fill.style.width = `${Math.max(0, Math.min(100, value))}%`;\n bar.appendChild(fill);\n frag.append(bar, el('span', 'nk-progress-label', formatPercent(column, value)));\n return frag;\n}\n\n/** A progress value of 0–100 as Intl writes a percentage in column.locale, else the page's language: 45 → \"45%\", in German \"45 %\". */\nexport function formatPercent(column, value) {\n const n = Number(value) || 0;\n try {\n return new Intl.NumberFormat(column.locale || resolveLocale(), { style: 'percent', maximumFractionDigits: 0 }).format(n / 100);\n } catch { return `${Math.round(n)}%`; } // a lang Intl does not take\n}\n\n/** A select's place among its options: the order Notion sorts by. */\nfunction rankOf(column, value) {\n const i = (column.options || []).findIndex(o => o.value === value || o.label === value);\n return i < 0 ? (column.options || []).length : i;\n}\n\n/** What a column sorts a row by – see the head of this file. */\nfunction sortValue(column, row) {\n if (column.sortKey) return row[column.sortKey];\n const v = row[column.key];\n if (v === undefined || v === null || v === '') return null;\n if (typeof v === 'object' && !Array.isArray(v) && 'sort' in v) return v.sort;\n switch (column.type || 'text') {\n case 'number': case 'progress': return Number(v);\n case 'checkbox': return v ? 1 : 0;\n case 'date': { const t = timeOf(v); return Number.isNaN(t) ? String(v) : t; }\n case 'select': return rankOf(column, v);\n case 'multi-select': { const first = (Array.isArray(v) ? v : String(v).split(','))[0]; return first == null ? null : rankOf(column, String(first).trim()); }\n default: return textOf(v);\n }\n}\n\n/** Sort comparator for a column; empty cells come last whichever the direction. */\nexport function compareBy(column, dir = 1) {\n const empty = v => v === null || v === undefined || v === '' || Number.isNaN(v);\n return (a, b) => {\n const x = sortValue(column, a), y = sortValue(column, b);\n if (empty(x) || empty(y)) return empty(x) === empty(y) ? 0 : empty(x) ? 1 : -1;\n if (typeof x === 'number' && typeof y === 'number') return (x - y) * dir;\n return String(x).localeCompare(String(y), undefined, { numeric: true }) * dir;\n };\n}\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, compareBy } from '../../util/property-cell.js';\n\n// <nk-table-view name=\"table\" label=\"▦ Table\" count new-row sortable wrap></nk-table-view>\n// `wrap` lets cell text break (`.nk-table.wrap`), like Notion's \"wrap column\".\n// Standalone: view.columns = […]; view.rows = […]; Inside <nk-database> the\n// database pushes `data`. → <div class=\"nk-table-wrap\"><table class=\"nk-table\">…</table><div class=\"nk-new-row\">+ New page</div></div>\n// Cells are plain markup from renderPropertyCell(); rows fire nk-select\n// { row, id, key, cell } – `key` and `cell` say which cell was hit, to open\n// an editor there, like the date picker under a due date – checkboxes\n// nk-change, headers nk-action { action: 'sort' } (and sort locally\n// with `sortable`), the add row nk-action { action: 'new-row' }. A column of\n// type 'actions' (NotionKit 1.12.0) sets buttons in each row; a click on one\n// fires nk-action { action, row, id, anchor } instead of selecting the row,\n// and its header sorts nothing.\nclass NkTableView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'new-row', 'new-row-label', 'sortable', 'sort-key', 'sort-dir', 'wrap']; }\n\n render() {\n this._wrap = this.createElement('div', ['nk-table-wrap']);\n this._table = this.createElement('table', ['nk-table']);\n this._thead = document.createElement('thead');\n this._tbody = document.createElement('tbody');\n this._table.append(this._thead, this._tbody);\n this._newRow = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0' });\n this._wrap.append(this._table, this._newRow);\n this._wrapper.appendChild(this._wrap);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _sortedRows() {\n const key = this.getAttribute('sort-key');\n const col = this._columns.find(c => c.key === key);\n if (!col) return this._rows;\n return [...this._rows].sort(compareBy(col, this.getAttribute('sort-dir') === 'desc' ? -1 : 1));\n }\n\n _render() {\n if (!this._thead) return;\n this._table.classList.toggle('wrap', this.getBoolAttr('wrap'));\n const tr = document.createElement('tr');\n for (const col of this._columns) {\n const actions = col.type === 'actions';\n const th = this.createElement('th', actions ? ['actions'] : [], actions ? { scope: 'col' } : { 'data-key': col.key, scope: 'col' });\n if (col.icon) { const i = this.createElement('span', ['th-icon']); i.textContent = col.icon; th.appendChild(i); }\n th.appendChild(document.createTextNode(col.label ?? (actions ? '' : col.key)));\n if (col.key === this.getAttribute('sort-key')) th.appendChild(document.createTextNode(this.getAttribute('sort-dir') === 'desc' ? ' ↓' : ' ↑'));\n if (col.width) th.style.width = col.width;\n tr.appendChild(th);\n }\n this._thead.replaceChildren(tr);\n this._tbody.replaceChildren();\n for (const row of this._sortedRows()) {\n const r = this.createElement('tr', [], { 'data-id': row.id ?? '' });\n for (const col of this._columns) {\n const td = document.createElement('td');\n // Numbers right-aligned in figures of equal width, as Notion sets them.\n if (col.type === 'number') td.className = 'num';\n td.appendChild(renderPropertyCell(col, row[col.key], row));\n r.appendChild(td);\n }\n this._tbody.appendChild(r);\n }\n this._newRow.textContent = this.getAttribute('new-row-label') || this.str('newPage');\n this._newRow.style.display = this.getBoolAttr('new-row') ? '' : 'none';\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (this._newRow.contains(e.target)) { this.emit('nk-action', { action: 'new-row' }); return; }\n const th = e.target.closest('th[data-key]');\n if (th) {\n const key = th.dataset.key;\n const dir = this.getAttribute('sort-key') === key && this.getAttribute('sort-dir') !== 'desc' ? 'desc' : 'asc';\n const ok = this.emit('nk-action', { action: 'sort', key, value: dir });\n if (ok && this.getBoolAttr('sortable')) { this.setAttribute('sort-key', key); this.setAttribute('sort-dir', dir); }\n return;\n }\n const act = e.target.closest('button[data-action]');\n if (act) {\n const row = this._rowById(act.closest('tr[data-id]')?.dataset.id);\n if (!act.disabled) this.emit('nk-action', { action: act.dataset.action, row, id: row?.id, anchor: act });\n return;\n }\n if (e.target.closest('input[type=checkbox], a')) return;\n const tr = e.target.closest('tr[data-id]');\n if (!tr) return;\n // Which cell: `key` names its column, `cell` is there to anchor an editor to.\n const cell = e.target.closest('td');\n const row = this._rowById(tr.dataset.id);\n this.emit('nk-select', { row, id: row?.id, value: row?.id, key: cell ? this._columns[cell.cellIndex]?.key : undefined, cell });\n };\n this._onChange = (e) => {\n const input = e.target;\n if (input.type !== 'checkbox') return;\n const row = this._rowById(input.dataset.rowId);\n if (row) row[input.dataset.key] = input.checked;\n this.emit('nk-change', { row, key: input.dataset.key, value: input.checked });\n };\n this._onKey = (e) => { if ((e.key === 'Enter' || e.key === ' ') && e.target === this._newRow) { e.preventDefault(); this.emit('nk-action', { action: 'new-row' }); } };\n this._wrap.addEventListener('click', this._onClick);\n this._wrap.addEventListener('change', this._onChange);\n this._wrap.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._wrap?.removeEventListener('click', this._onClick);\n this._wrap?.removeEventListener('change', this._onChange);\n this._wrap?.removeEventListener('keydown', this._onKey);\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n onStringsChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'table'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-table-view', NkTableView);\nexport { NkTableView };\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, tagFor, textOf, formatDate, formatPercent } from '../../util/property-cell.js';\n\n// <nk-board-view name=\"board\" label=\"▤ Board\" group-by=\"status\" new-row></nk-board-view>\n// Groups rows by a select column (default: the first select column); one\n// column per option, in option order. Cards show the title column and the\n// `meta-keys` (default: date and progress columns). Drag a card onto another\n// column to change its value – the row is updated and nk-change fires.\n// → <div class=\"nk-board active\"><div class=\"nk-board-col\">…</div>…</div>\nclass NkBoardView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'group-by', 'title-key', 'meta-keys', 'new-row']; }\n\n render() {\n this._board = this.createElement('div', ['nk-board', 'active']);\n this._wrapper.appendChild(this._board);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _groupColumn() {\n const key = this.getAttribute('group-by');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.type === 'select') || null;\n }\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n _metaColumns() {\n const keys = (this.getAttribute('meta-keys') || '').split(',').map(s => s.trim()).filter(Boolean);\n if (keys.length) return keys.map(k => this._columns.find(c => c.key === k)).filter(Boolean);\n return this._columns.filter(c => c.type === 'date' || c.type === 'progress');\n }\n\n _render() {\n if (!this._board) return;\n this._board.replaceChildren();\n const group = this._groupColumn(), title = this._titleColumn();\n if (!group) return;\n const options = group.options?.length ? group.options : [...new Set(this._rows.map(r => r[group.key]))].map(v => ({ value: v, label: String(v) }));\n for (const opt of options) {\n const col = this.createElement('div', ['nk-board-col'], { 'data-value': opt.value });\n const header = this.createElement('div', ['nk-board-col-header']);\n const cards = this._rows.filter(r => r[group.key] === opt.value || r[group.key] === opt.label);\n const count = this.createElement('span', ['count']);\n count.textContent = String(cards.length);\n header.append(tagFor(group, opt.value), count);\n col.appendChild(header);\n for (const row of cards) {\n const card = this.createElement('div', ['nk-card'], { draggable: 'true', 'data-id': row.id ?? '', tabindex: '0' });\n const t = this.createElement('div', ['card-title']);\n t.textContent = `${row.icon ? row.icon + ' ' : ''}${title ? textOf(row[title.key]) : ''}`;\n const meta = this.createElement('div', ['card-meta']);\n for (const c of this._metaColumns()) {\n const v = row[c.key];\n if (v === undefined || v === null || v === '') continue;\n const s = document.createElement('span');\n if (c.type === 'progress') s.textContent = `▰ ${formatPercent(c, v)}`;\n else if (c.type === 'date') s.textContent = `📅 ${formatDate(c, v)}`;\n else s.appendChild(renderPropertyCell(c, v, row));\n meta.appendChild(s);\n }\n card.append(t, meta);\n col.appendChild(card);\n }\n if (this.getBoolAttr('new-row')) {\n const add = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0', 'data-add': opt.value });\n add.style.padding = '6px 10px';\n add.textContent = '+';\n col.appendChild(add);\n }\n this._board.appendChild(col);\n }\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const add = e.target.closest('[data-add]');\n if (add) { this.emit('nk-action', { action: 'new-row', value: add.dataset.add }); return; }\n const card = e.target.closest('.nk-card');\n if (card) { const row = this._rowById(card.dataset.id); this.emit('nk-select', { row, id: row?.id, value: row?.id }); }\n };\n this._onDragStart = (e) => { const card = e.target.closest?.('.nk-card'); if (!card) return; this._dragId = card.dataset.id; e.dataTransfer.effectAllowed = 'move'; try { e.dataTransfer.setData('text/plain', card.dataset.id); } catch {} };\n this._onDragOver = (e) => { if (this._dragId != null && e.target.closest('.nk-board-col')) { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; } };\n this._onDrop = (e) => {\n const col = e.target.closest('.nk-board-col');\n if (!col || this._dragId == null) return;\n e.preventDefault();\n this.move(this._dragId, col.dataset.value);\n this._dragId = null;\n };\n this._board.addEventListener('click', this._onClick);\n this._board.addEventListener('dragstart', this._onDragStart);\n this._board.addEventListener('dragover', this._onDragOver);\n this._board.addEventListener('drop', this._onDrop);\n }\n\n teardownEvents() {\n this._board?.removeEventListener('click', this._onClick);\n this._board?.removeEventListener('dragstart', this._onDragStart);\n this._board?.removeEventListener('dragover', this._onDragOver);\n this._board?.removeEventListener('drop', this._onDrop);\n }\n\n /** Moves a row into another column (sets the group value) and reports it. */\n move(id, value) {\n const row = this._rowById(id), group = this._groupColumn();\n if (!row || !group || row[group.key] === value) return;\n row[group.key] = value;\n this._render();\n this.emit('nk-change', { row, key: group.key, value });\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'board'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-board-view', NkBoardView);\nexport { NkBoardView };\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, textOf, formatDate } from '../../util/property-cell.js';\n\n// <nk-list-view name=\"list\" label=\"☰ List\" meta-keys=\"due,status\" new-row></nk-list-view>\n// The third database view: one line per row – icon and title, the `meta-keys`\n// on the right (default: the select and date columns, in column order). Dates\n// and text stand as text, selects as tags, a person as avatar and name.\n// Standalone: view.columns = […]; view.rows = […]. Inside <nk-database> the\n// database pushes the data. Rows fire nk-select, the add row nk-action\n// { action: 'new-row' }.\n// → <div class=\"nk-list\"><div class=\"nk-list-item\"><span class=\"l-icon\">…</span><span class=\"l-title\">…</span><span class=\"l-meta\">…</span></div>…</div>\nclass NkListView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'title-key', 'meta-keys', 'new-row', 'new-row-label']; }\n\n render() {\n this._box = document.createElement('div');\n this._list = this.createElement('div', ['nk-list'], { role: 'list' });\n this._newRow = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0' });\n this._box.append(this._list, this._newRow);\n this._wrapper.appendChild(this._box);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n _metaColumns() {\n const keys = (this.getAttribute('meta-keys') || '').split(',').map(s => s.trim()).filter(Boolean);\n if (keys.length) return keys.map(k => this._columns.find(c => c.key === k)).filter(Boolean);\n return this._columns.filter(c => c.type === 'select' || c.type === 'date');\n }\n\n _render() {\n if (!this._list) return;\n const title = this._titleColumn(), meta = this._metaColumns();\n this._list.replaceChildren();\n for (const row of this._rows) {\n const item = this.createElement('div', ['nk-list-item'], { role: 'listitem', tabindex: '0', 'data-id': row.id ?? '' });\n const icon = this.createElement('span', ['l-icon']);\n icon.textContent = row.icon || '';\n if (!row.icon) icon.style.display = 'none';\n const t = this.createElement('span', ['l-title']);\n t.textContent = title ? textOf(row[title.key]) : '';\n const m = this.createElement('span', ['l-meta']);\n for (const c of meta) {\n const v = row[c.key];\n if (v === undefined || v === null || v === '') continue;\n m.appendChild(c.type === 'date' ? document.createTextNode(formatDate(c, v)) : c.type === 'text' || !c.type ? document.createTextNode(textOf(v)) : renderPropertyCell(c, v, row));\n }\n item.append(icon, t, m);\n this._list.appendChild(item);\n }\n this._newRow.textContent = this.getAttribute('new-row-label') || this.str('newPage');\n this._newRow.style.display = this.getBoolAttr('new-row') ? '' : 'none';\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (this._newRow.contains(e.target)) { this.emit('nk-action', { action: 'new-row' }); return; }\n const item = e.target.closest('.nk-list-item');\n if (item) { const row = this._rowById(item.dataset.id); this.emit('nk-select', { row, id: row?.id, value: row?.id }); }\n };\n this._onKey = (e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n if (e.target === this._newRow || e.target.classList?.contains('nk-list-item')) { e.preventDefault(); e.target.click(); }\n };\n this._box.addEventListener('click', this._onClick);\n this._box.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._box?.removeEventListener('click', this._onClick);\n this._box?.removeEventListener('keydown', this._onKey);\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n onStringsChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'list'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-list-view', NkListView);\nexport { NkListView };\n","import { NkElement } from '../../base.js';\nimport { textOf } from '../../util/property-cell.js';\nimport { isoOf, parseDay, isoWeek, resolveLocale, firstWeekday, weekdayNames, monthGrid, stepMonth, weekLabel, CHEVRONS } from '../../util/dates.js';\n\n// <nk-calendar-view name=\"calendar\" label=\"📅 Calendar\" date-key=\"due\" weeks></nk-calendar-view>\n// The fourth database view (NotionKit 1.9.0): a month, the rows as cards on\n// their dates. `date-key` names the date column (default: the first one),\n// `title-key` the title (default: the title column); dates are YYYY-MM-DD or\n// D.M.YYYY, a range { start, end } stands on its start. month (YYYY-MM;\n// default today's), weeks (the ISO week in front of each row), week-start\n// (0 = Sunday … 6 = Saturday; default from the locale), weekend (weekdays\n// washed like the days of other months, \"6,0\"), today, locale and the texts\n// today-label, prev-label, next-label, week-label – without them English\n// or German after the language (1.17.0).\n// Standalone: view.columns = […]; view.rows = […]. Inside <nk-database> the\n// database pushes the data. A card fires nk-select { row, id, value } like a\n// row of the table, Today and ‹ › nk-month { month }.\n// → <div class=\"nk-calendar-view weeks\"><div class=\"cv-head\"><div class=\"cv-title\">May 2026</div><button class=\"cal-nav\">Today</button>‹ ›</div>\n// <div class=\"cv-grid\"><div class=\"cv-wd\">W</div>…<div class=\"cv-week\">21</div><div class=\"cv-day today\"><span class=\"cv-num\">20</span><button class=\"cv-item\">🗃️ …</button></div>…</div></div>\nclass NkCalendarView extends NkElement {\n static get observedAttributes() {\n return ['name', 'label', 'badge', 'count', 'date-key', 'title-key', 'month', 'weeks', 'week-start', 'weekend', 'today', 'locale',\n 'today-label', 'prev-label', 'next-label', 'week-label'];\n }\n\n render() {\n this._box = this.createElement('div', ['nk-calendar-view']);\n const head = this.createElement('div', ['cv-head']);\n this._title = this.createElement('div', ['cv-title']);\n this._todayBtn = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._prev.innerHTML = CHEVRONS.prev;\n this._next = this.createElement('button', ['cal-nav'], { type: 'button' });\n this._next.innerHTML = CHEVRONS.next;\n head.append(this._title, this._todayBtn, this._prev, this._next);\n this._grid = this.createElement('div', ['cv-grid']);\n this._box.append(head, this._grid);\n this._wrapper.appendChild(this._box);\n this._columns ??= []; this._rows ??= [];\n this._month ??= this._attrMonth() ?? this._todayIso().slice(0, 7);\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _attrMonth() { const m = this.getAttribute('month'); return /^\\d{4}-\\d{2}$/.test(m || '') ? m : null; }\n _todayIso() { return this.getAttribute('today') || isoOf(new Date()); }\n _dateColumn() {\n const key = this.getAttribute('date-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.type === 'date') || null;\n }\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n\n _render() {\n if (!this._grid) return;\n const locale = resolveLocale(this.getAttribute('locale')), weeks = this.getBoolAttr('weeks');\n const n = Number(this.getAttribute('week-start'));\n const ws = this.hasAttribute('week-start') && Number.isInteger(n) && n >= 0 && n <= 6 ? n : firstWeekday(locale);\n const g = monthGrid(this._month, ws), today = this._todayIso();\n const weekend = new Set((this.getAttribute('weekend') || '').split(',').map(s => s.trim()).filter(Boolean).map(Number));\n const dateCol = this._dateColumn(), titleCol = this._titleColumn(), byDay = {};\n if (dateCol) for (const row of this._rows) {\n const d = parseDay(row[dateCol.key]);\n if (d) (byDay[isoOf(d)] ||= []).push(row);\n }\n this._box.classList.toggle('weeks', weeks);\n this._title.textContent = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(g.first);\n this._todayBtn.textContent = this.getAttribute('today-label') || this.str('today');\n this._prev.setAttribute('aria-label', this.getAttribute('prev-label') || this.str('previousMonth'));\n this._next.setAttribute('aria-label', this.getAttribute('next-label') || this.str('nextMonth'));\n\n const cell = (cls, text) => { const el = this.createElement('div', [cls]); el.textContent = text; return el; };\n const nodes = [];\n if (weeks) nodes.push(cell('cv-wd', this.getAttribute('week-label') || weekLabel(locale)));\n for (const w of weekdayNames(locale, ws)) nodes.push(cell('cv-wd', w));\n for (let i = 0; i < g.rows * 7; i++) {\n const d = g.day(i), iso = isoOf(d);\n if (weeks && i % 7 === 0) nodes.push(cell('cv-week', isoWeek(d)));\n const day = this.createElement('div', ['cv-day', d.getMonth() !== g.m - 1 && 'out', weekend.has(d.getDay()) && 'off', iso === today && 'today'].filter(Boolean));\n const num = this.createElement('span', ['cv-num']);\n num.textContent = d.getDate();\n day.appendChild(num);\n for (const row of byDay[iso] || []) {\n const item = this.createElement('button', ['cv-item'], { type: 'button', 'data-id': row.id ?? '' });\n const title = titleCol ? textOf(row[titleCol.key]) : '';\n item.textContent = row.icon ? `${row.icon} ${title}` : title;\n day.appendChild(item);\n }\n nodes.push(day);\n }\n this._grid.replaceChildren(...nodes);\n }\n\n _goMonth(month) {\n if (month === this._month) return;\n this._month = month;\n this._render();\n this.emit('nk-month', { month });\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (e.target.closest('.cal-nav') === this._todayBtn) { this._goMonth(this._todayIso().slice(0, 7)); return; }\n if (e.target.closest('.cal-nav') === this._prev) { this._goMonth(stepMonth(this._month, -1)); return; }\n if (e.target.closest('.cal-nav') === this._next) { this._goMonth(stepMonth(this._month, 1)); return; }\n const item = e.target.closest('.cv-item');\n if (item) { const row = this._rowById(item.dataset.id); this.emit('nk-select', { row, id: row?.id, value: row?.id }); }\n };\n this._box.addEventListener('click', this._onClick);\n }\n\n teardownEvents() { this._box?.removeEventListener('click', this._onClick); }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n\n onStringsChanged() { this._render(); }\n\n onAttributeChanged(name) {\n if (name === 'month') this._month = this._attrMonth() ?? this._month;\n this._render();\n if (name === 'label' || name === 'badge' || name === 'count') this.closest('nk-database')?.requestSync?.();\n }\n\n get name() { return this.getAttribute('name') || 'calendar'; }\n /** The month shown, YYYY-MM. */\n get month() { return this._month; }\n set month(v) { if (!/^\\d{4}-\\d{2}$/.test(v)) return; if (this._grid) this._goMonth(v); else this._month = v; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-calendar-view', NkCalendarView);\nexport { NkCalendarView };\n","import { NkElement } from '../../base.js';\nimport { renderPropertyCell, textOf, formatDate, formatPercent } from '../../util/property-cell.js';\n\n// <nk-gallery-view name=\"gallery\" label=\"🖼 Gallery\" meta-keys=\"status,due\" new-row></nk-gallery-view>\n// The fifth database view (NotionKit 1.14.0): the rows as cards with a\n// picture on top, in a grid that fills the row – Notion's gallery, for a\n// course catalog or a reading list. `cover-key` names the row field with the\n// picture's URL (default: cover); a row without one shows the cover\n// gradient, and `no-cover` leaves the pictures out. `size` small | medium |\n// large sets the card size, `fit` shows a picture whole instead of cropped.\n// Cards show the title column and the `meta-keys` (default: select and date\n// columns). Standalone: view.columns = […]; view.rows = […]. Inside\n// <nk-database> the database pushes the data. A card fires nk-select\n// { row, id, value } on a click, Enter or Space, like a row of the table;\n// the add card nk-action { action: 'new-row' }.\n// `href-key` (1.17.0) names the row field with the card's address: a row\n// with one gets a link, <a class=\"nk-card\" href>, in a .card-item that\n// carries the list item's role – to open a course in a new tab or copy its\n// address. A plain click, or Enter, fires the same nk-select; cancelling it\n// keeps the browser from following the link. A middle click or one with\n// Cmd, Ctrl, Shift or Alt fires nothing and does what a link does.\n// → <div class=\"nk-gallery\" role=\"list\"><div class=\"nk-card\" role=\"listitem\" tabindex=\"0\">\n// <div class=\"nk-cover\"><img src=\"…\" alt=\"\"></div><div class=\"card-title\">🧭 …</div><div class=\"card-meta\">…</div></div>\n// <div class=\"card-item\" role=\"listitem\"><a class=\"nk-card\" href=\"/courses/safety\">…</a></div>\n// <div class=\"nk-new-row\">+ New page</div></div>\nconst SIZES = ['small', 'large'];\n\nclass NkGalleryView extends NkElement {\n static get observedAttributes() { return ['name', 'label', 'badge', 'count', 'cover-key', 'no-cover', 'size', 'fit', 'title-key', 'meta-keys', 'href-key', 'new-row', 'new-row-label']; }\n\n render() {\n this._grid = this.createElement('div', ['nk-gallery'], { role: 'list' });\n this._wrapper.appendChild(this._grid);\n this._columns ??= []; this._rows ??= [];\n this._render();\n this.closest('nk-database')?.requestSync?.();\n }\n\n _titleColumn() {\n const key = this.getAttribute('title-key');\n return this._columns.find(c => c.key === key) || this._columns.find(c => c.title) || this._columns[0] || null;\n }\n _metaColumns() {\n const keys = (this.getAttribute('meta-keys') || '').split(',').map(s => s.trim()).filter(Boolean);\n if (keys.length) return keys.map(k => this._columns.find(c => c.key === k)).filter(Boolean);\n return this._columns.filter(c => c.type === 'select' || c.type === 'date');\n }\n\n _render() {\n if (!this._grid) return;\n const size = this.getAttribute('size');\n this._grid.className = ['nk-gallery', SIZES.includes(size) && size, this.getBoolAttr('fit') && 'fit'].filter(Boolean).join(' ');\n const title = this._titleColumn(), meta = this._metaColumns();\n const coverKey = this.getAttribute('cover-key') || 'cover', covers = !this.getBoolAttr('no-cover');\n const hrefKey = this.getAttribute('href-key');\n this._grid.replaceChildren();\n for (const row of this._rows) {\n const link = hrefKey ? row[hrefKey] : null, href = link && typeof link === 'object' ? link.href : link;\n const card = href\n ? this.createElement('a', ['nk-card'], { href: String(href), 'data-id': row.id ?? '' })\n : this.createElement('div', ['nk-card'], { role: 'listitem', tabindex: '0', 'data-id': row.id ?? '' });\n if (covers) {\n const cover = this.createElement('div', ['nk-cover']);\n if (row[coverKey]) cover.appendChild(this.createElement('img', [], { src: row[coverKey], alt: '' }));\n card.appendChild(cover);\n }\n const t = this.createElement('div', ['card-title']);\n t.textContent = `${row.icon ? row.icon + ' ' : ''}${title ? textOf(row[title.key]) : ''}`;\n const m = this.createElement('div', ['card-meta']);\n for (const c of meta) {\n const v = row[c.key];\n if (v === undefined || v === null || v === '') continue;\n const s = document.createElement('span');\n if (c.type === 'progress') s.textContent = `▰ ${formatPercent(c, v)}`;\n else if (c.type === 'date') s.textContent = `📅 ${formatDate(c, v)}`;\n else s.appendChild(renderPropertyCell(c, v, row));\n m.appendChild(s);\n }\n card.append(t, m);\n if (href) {\n const item = this.createElement('div', ['card-item'], { role: 'listitem' });\n item.appendChild(card);\n this._grid.appendChild(item);\n } else this._grid.appendChild(card);\n }\n if (this.getBoolAttr('new-row')) {\n const add = this.createElement('div', ['nk-new-row'], { role: 'button', tabindex: '0', 'data-add': '' });\n add.textContent = this.getAttribute('new-row-label') || this.str('newPage');\n this._grid.appendChild(add);\n }\n }\n\n setupEvents() {\n this._onClick = (e) => {\n if (e.target.closest('[data-add]')) { this.emit('nk-action', { action: 'new-row' }); return; }\n const card = e.target.closest('.nk-card');\n if (!card) return;\n // The link contract: a plain left click is a selection, any other one the browser's.\n const link = card.localName === 'a';\n if (link && (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)) return;\n const row = this._rowById(card.dataset.id);\n if (!this.emit('nk-select', { row, id: row?.id, value: row?.id }) && link) e.preventDefault();\n };\n this._onKey = (e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n if (e.target.localName === 'a') return; // a link card: Enter is the browser's click, Space scrolls\n if (e.target.matches?.('.nk-card, [data-add]')) { e.preventDefault(); e.target.click(); }\n };\n this._grid.addEventListener('click', this._onClick);\n this._grid.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._grid?.removeEventListener('click', this._onClick);\n this._grid?.removeEventListener('keydown', this._onKey);\n }\n\n _rowById(id) { return this._rows.find(r => String(r.id) === String(id)); }\n onAttributeChanged() { this._render(); }\n onStringsChanged() { this._render(); }\n\n get name() { return this.getAttribute('name') || 'gallery'; }\n get columns() { return this._columns; }\n set columns(v) { this._columns = Array.isArray(v) ? v : []; this._render(); }\n get rows() { return this._rows; }\n set rows(v) { this._rows = Array.isArray(v) ? v : []; this._render(); }\n set data({ columns, rows }) { this.setData(columns, rows); }\n setData(columns, rows) { this._columns = columns || []; this._rows = rows || []; this._render(); }\n refresh() { this._render(); }\n}\n\ncustomElements.define('nk-gallery-view', NkGalleryView);\nexport { NkGalleryView };\n","import { NkElement } from '../../base.js';\n\n// <nk-filter-bar add no-filter no-sort></nk-filter-bar>\n// bar.filters = [{ key: 'status', value: 'done', op: 'is-not', label: 'Status: Open' }];\n// The filters in effect as NotionKit's filter pills (1.7.0), no inline style:\n// → <div class=\"nk-filter-row\">[Filter][Sort]\n// <span class=\"nk-filter-pill active\"><button>Status: Open</button><button class=\"fp-remove\">×</button></span>…\n// <button class=\"nk-filter-pill add\">+ Filter</button> …slot… [search]</div>\n// Filter and Sort are .nk-db-tool buttons (hide them with no-filter / no-sort\n// when the database toolbar carries its own); they fire nk-action. A pill's\n// label fires nk-action { action: 'edit', index, filter }, the add pill\n// nk-action { action: 'add' } – each with the clicked button as `anchor`, to\n// open a menu under it. × removes the filter; every change to filters or\n// search fires nk-change { filters, search }. In slot=\"filters\" of\n// <nk-database> the row sits right under the view tabs. The texts come in\n// English or German after the language (1.17.0, setStrings() for others);\n// filter-label, sort-label, add-label, remove-label (the × reads\n// \"<remove-label>: <pill>\") and placeholder set them here.\nclass NkFilterBar extends NkElement {\n static get observedAttributes() { return ['search', 'placeholder', 'no-filter', 'no-sort', 'value', 'add', 'add-label', 'filter-label', 'sort-label', 'remove-label']; }\n\n render() {\n this._row = this.createElement('div', ['nk-filter-row']);\n this._filterBtn = this.createElement('button', ['nk-db-tool'], { type: 'button', 'data-action': 'filter' });\n this._sortBtn = this.createElement('button', ['nk-db-tool'], { type: 'button', 'data-action': 'sort' });\n this._pillStart = document.createComment('pills');\n this._addBtn = this.createElement('button', ['nk-filter-pill', 'add'], { type: 'button', 'data-action': 'add' });\n this._input = this.createElement('input', ['nk-input'], { type: 'search', autocomplete: 'off' });\n this._row.append(this._filterBtn, this._sortBtn, this._pillStart, this._addBtn, document.createElement('slot'), this._input);\n this._wrapper.appendChild(this._row);\n this._filters = [];\n this._sync();\n }\n\n _sync() {\n this._filterBtn.textContent = this.getAttribute('filter-label') || this.str('filter');\n this._filterBtn.hidden = this.getBoolAttr('no-filter');\n this._filterBtn.classList.toggle('active', this._filters.length > 0);\n this._sortBtn.textContent = this.getAttribute('sort-label') || this.str('sort');\n this._sortBtn.hidden = this.getBoolAttr('no-sort');\n this._addBtn.textContent = this.getAttribute('add-label') || this.str('addFilter');\n this._addBtn.hidden = !this.getBoolAttr('add');\n this._input.hidden = !this.getBoolAttr('search');\n this._input.placeholder = this.getAttribute('placeholder') || this.str('search');\n if (this.hasAttribute('value') && this._input.value !== this.getAttribute('value')) this._input.value = this.getAttribute('value');\n for (const old of this._row.querySelectorAll('[data-pill]')) old.remove();\n const removeLabel = this.getAttribute('remove-label') || this.str('removeFilter');\n this._pillStart.after(...this._filters.map((f, i) => {\n const pill = this.createElement('span', ['nk-filter-pill', 'active'], { 'data-pill': i });\n const label = this.createElement('button', [], { type: 'button', 'data-edit': i });\n label.textContent = f.label ?? `${f.key}: ${f.value}`;\n const remove = this.createElement('button', ['fp-remove'], { type: 'button', 'data-remove': i, 'aria-label': `${removeLabel}: ${label.textContent}` });\n remove.textContent = '×';\n pill.append(label, remove);\n return pill;\n }));\n }\n\n setupEvents() {\n this._onClick = (e) => {\n const remove = e.target.closest('[data-remove]');\n if (remove) { const i = Number(remove.dataset.remove); this._filters = this._filters.filter((_, j) => j !== i); this._sync(); this._emitChange(); return; }\n const edit = e.target.closest('[data-edit]');\n if (edit) { const index = Number(edit.dataset.edit); this.emit('nk-action', { action: 'edit', index, filter: this._filters[index], anchor: edit }); return; }\n const btn = e.target.closest('[data-action]');\n if (btn) this.emit('nk-action', { action: btn.dataset.action, anchor: btn });\n };\n this._onInput = () => { clearTimeout(this._debounce); this._debounce = setTimeout(() => this._emitChange(), 150); };\n this._row.addEventListener('click', this._onClick);\n this._input.addEventListener('input', this._onInput);\n }\n\n teardownEvents() {\n this._row?.removeEventListener('click', this._onClick);\n this._input?.removeEventListener('input', this._onInput);\n clearTimeout(this._debounce);\n }\n\n _emitChange() { this.emit('nk-change', { filters: [...this._filters], search: this._input.value }); }\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n\n // A copy each way: the caller's array is never changed – removing a pill\n // only reports the new list in nk-change.\n get filters() { return [...this._filters]; }\n set filters(v) { this._filters = Array.isArray(v) ? [...v] : []; if (this._row) this._sync(); }\n get value() { return this._input?.value ?? ''; }\n set value(v) { if (this._input) this._input.value = v ?? ''; }\n /**\n * Applies filters and search to rows: a filter keeps rows where row[key]\n * equals value – or differs from it with op: 'is-not'; the search looks\n * for the text in every string field (a person's name, a text or link\n * object's text).\n */\n apply(rows) {\n const q = this.value.trim().toLowerCase();\n return rows.filter(r => this._filters.every(f => (f.op === 'is-not' ? r[f.key] !== f.value : r[f.key] === f.value))\n && (!q || Object.values(r).some(v => String(typeof v === 'object' && v ? v.name ?? v.text ?? v.label ?? '' : v ?? '').toLowerCase().includes(q))));\n }\n}\n\ncustomElements.define('nk-filter-bar', NkFilterBar);\nexport { NkFilterBar };\n","import { NkElement } from '../../base.js';\n\n// <nk-comments placeholder=\"Comment …\" send-label=\"Send\">\n// <nk-comment …>…</nk-comment>\n// </nk-comments>\n// → <div class=\"nk-comments\">…<div class=\"nk-comment-input\"><input class=\"nk-input\"><button class=\"nk-btn primary small\">Send</button></div></div>\n// Enter or the button fires nk-submit { text } and clears the field.\nclass NkComments extends NkElement {\n static get observedAttributes() { return ['placeholder', 'send-label', 'no-input', 'disabled']; }\n\n render() {\n const box = this.createElement('div', ['nk-comments']);\n box.appendChild(document.createElement('slot'));\n this._row = this.createElement('div', ['nk-comment-input']);\n this._input = this.createElement('input', ['nk-input'], { type: 'text' });\n this._btn = this.createElement('button', ['nk-btn', 'primary', 'small'], { type: 'button' });\n this._row.append(this._input, this._btn);\n box.appendChild(this._row);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n this._input.placeholder = this.getAttribute('placeholder') || this.str('commentPlaceholder');\n this._input.setAttribute('aria-label', this.str('comment'));\n this._btn.textContent = this.getAttribute('send-label') || this.str('send');\n this._row.style.display = this.getBoolAttr('no-input') ? 'none' : '';\n this._input.disabled = this._btn.disabled = this.getBoolAttr('disabled');\n }\n\n setupEvents() {\n this._onSend = () => this.submit();\n this._onKey = (e) => { if (e.key === 'Enter') { e.preventDefault(); this.submit(); } };\n this._btn.addEventListener('click', this._onSend);\n this._input.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onSend);\n this._input?.removeEventListener('keydown', this._onKey);\n }\n\n submit() {\n const text = this._input.value.trim();\n if (!text) return;\n const ok = this.emit('nk-submit', { text });\n if (ok) this._input.value = '';\n }\n\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n focus(o) { this._input?.focus(o); }\n get value() { return this._input?.value ?? ''; }\n set value(v) { if (this._input) this._input.value = v ?? ''; }\n}\n\ncustomElements.define('nk-comments', NkComments);\nexport { NkComments };\n","import { NkElement } from '../../base.js';\nimport { paintAvatar, initialsOf } from '../../util/avatar.js';\n\n// <nk-comment author=\"Sara Lindt\" time=\"1 hr ago\" avatar=\"SL\" color=\"green\">The board view feels close.</nk-comment>\n// → <div class=\"nk-comment\"><span class=\"nk-avatar green\">SL</span><div><div class=\"c-head\"><b>Sara Lindt</b> · 1 hr ago</div><div class=\"c-body\">…</div></div></div>\n// color: one of Notion's nine names, or any CSS background; without it the avatar gradient.\n// slot=\"head\" adds content after the name (e.g. an <nk-tag>).\nclass NkComment extends NkElement {\n static get observedAttributes() { return ['author', 'time', 'avatar', 'color']; }\n\n render() {\n const box = this.createElement('div', ['nk-comment']);\n this._avatar = this.createElement('span', ['nk-avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n const text = document.createElement('div');\n this._head = this.createElement('div', ['c-head']);\n this._author = document.createElement('b');\n this._time = document.createTextNode('');\n this._head.append(this._author, this.createElement('slot', [], { name: 'head' }), this._time);\n const body = this.createElement('div', ['c-body']);\n body.appendChild(document.createElement('slot'));\n text.append(this._head, body);\n box.append(avatarSlot, text);\n this._wrapper.appendChild(box);\n this._sync();\n }\n\n _sync() {\n const author = this.getAttribute('author') || '';\n this._author.textContent = author;\n const time = this.getAttribute('time');\n this._time.data = time ? ` · ${time}` : '';\n this._avatar.textContent = this.getAttribute('avatar') || initialsOf(author);\n paintAvatar(this._avatar, this.getAttribute('color'));\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-comment', NkComment);\nexport { NkComment };\n","import { NkElement } from '../../base.js';\n\n// <nk-ai-thread><nk-ai-msg …>…</nk-ai-msg>…</nk-ai-thread> → <div class=\"nk-ai-thread\">\nclass NkAiThread extends NkElement {\n render() {\n const box = this.createElement('div', ['nk-ai-thread'], { role: 'log', 'aria-live': 'polite' });\n box.appendChild(document.createElement('slot'));\n this._wrapper.appendChild(box);\n }\n}\n\ncustomElements.define('nk-ai-thread', NkAiThread);\nexport { NkAiThread };\n","import { NkElement } from '../../base.js';\n\n// <nk-ai-msg role=\"user\" name=\"You\" avatar=\"MK\">Summarise the open tasks.</nk-ai-msg>\n// <nk-ai-msg role=\"assistant\" name=\"Mona\" badge=\"· AI\" avatar=\"✨\">\n// Two tasks are open …\n// <button slot=\"actions\" value=\"copy\">📋 Copy</button><button slot=\"actions\" value=\"retry\">↻ Rephrase</button>\n// </nk-ai-msg>\n// <nk-ai-msg role=\"user\" bubble>What is still open?</nk-ai-msg> → a grey bubble on the right, as in Notion's AI chat\n// → <div class=\"nk-ai-msg user\"><span class=\"mini-avatar\">MK</span><div class=\"a-body\"><div class=\"a-name\">You</div>…<div class=\"nk-ai-actions\">…</div></div></div>\n// Action buttons stay in the light DOM (slotted twins) and fire nk-action { action: value }.\nclass NkAiMsg extends NkElement {\n static get observedAttributes() { return ['role', 'name', 'badge', 'avatar', 'color', 'bubble']; }\n\n render() {\n this._box = this.createElement('div', ['nk-ai-msg']);\n this._avatar = this.createElement('span', ['mini-avatar']);\n const avatarSlot = this.createElement('slot', [], { name: 'avatar' });\n avatarSlot.appendChild(this._avatar);\n this._avatarSlot = avatarSlot;\n const body = this.createElement('div', ['a-body']);\n this._name = this.createElement('div', ['a-name']);\n this._nameText = document.createTextNode('');\n this._badge = document.createElement('span');\n this._name.append(this._nameText, this._badge);\n this._actions = this.createElement('div', ['nk-ai-actions']);\n this._actionSlot = this.createElement('slot', [], { name: 'actions' });\n this._actions.appendChild(this._actionSlot);\n body.append(this._name, document.createElement('slot'), this._actions);\n this._box.append(avatarSlot, body);\n this._wrapper.appendChild(this._box);\n this._sync();\n }\n\n _sync() {\n const user = this.getAttribute('role') === 'user';\n const bubble = this.getBoolAttr('bubble');\n this._box.classList.toggle('user', user);\n this._box.classList.toggle('bubble', bubble);\n const name = this.getAttribute('name');\n // Runs on slotchange: write text on a change only (see nk-switch).\n if (this._nameText.data !== (name || '')) this._nameText.data = name || '';\n const badge = this.getAttribute('badge'), badgeText = badge ? ` ${badge}` : '';\n if (this._badge.textContent !== badgeText) this._badge.textContent = badgeText;\n // A bubble stands without avatar and name; the text says who asked.\n this._name.style.display = name && !bubble ? '' : 'none';\n this._avatarSlot.style.display = bubble ? 'none' : '';\n const avatar = this.getAttribute('avatar') || (user ? (name || 'U').slice(0, 2).toUpperCase() : '✨');\n if (this._avatar.textContent !== avatar) this._avatar.textContent = avatar;\n const color = this.getAttribute('color');\n this._avatar.style.background = color || '';\n this._actions.style.display = this._actionSlot.assignedElements().length ? '' : 'none';\n }\n\n setupEvents() {\n this._onSlot = () => this._sync();\n this._onClick = (e) => {\n const btn = e.target.closest?.('button');\n if (btn && this._actionSlot.assignedElements().includes(btn)) this.emit('nk-action', { action: btn.value || btn.textContent.trim(), value: btn.value || btn.textContent.trim() });\n };\n this._actionSlot.addEventListener('slotchange', this._onSlot);\n this.addEventListener('click', this._onClick);\n this._sync();\n }\n\n teardownEvents() {\n this._actionSlot?.removeEventListener('slotchange', this._onSlot);\n this.removeEventListener('click', this._onClick);\n }\n\n onAttributeChanged() { this._sync(); }\n}\n\ncustomElements.define('nk-ai-msg', NkAiMsg);\nexport { NkAiMsg };\n","import { NkElement } from '../../base.js';\n\n// <nk-ai-input-row placeholder=\"Ask Mona something …\"></nk-ai-input-row>\n// → <div class=\"nk-ai-input-row\"><span>✨</span><input><button class=\"nk-ai-send\">↑</button></div>\n// Enter or the send button fires nk-submit { text } and clears the field.\nclass NkAiInputRow extends NkElement {\n static get observedAttributes() { return ['placeholder', 'value', 'disabled', 'icon']; }\n\n render() {\n this._row = this.createElement('div', ['nk-ai-input-row']);\n this._icon = document.createElement('span');\n this._icon.style.fontSize = '14px';\n this._input = this.createElement('input', [], { type: 'text' });\n this._btn = this.createElement('button', ['nk-ai-send'], { type: 'button' });\n this._btn.textContent = '↑';\n this._row.append(this._icon, this._input, this._btn);\n this._wrapper.appendChild(this._row);\n this._sync();\n }\n\n _sync() {\n this._input.placeholder = this.getAttribute('placeholder') || this.str('askPlaceholder');\n this._input.setAttribute('aria-label', this.str('message'));\n this._btn.setAttribute('aria-label', this.str('send'));\n if (this.hasAttribute('value') && this._input.value !== this.getAttribute('value')) this._input.value = this.getAttribute('value');\n this._input.disabled = this._btn.disabled = this.getBoolAttr('disabled');\n const icon = this.getAttribute('icon') ?? '✨';\n this._icon.textContent = icon;\n this._icon.style.display = icon ? '' : 'none';\n }\n\n setupEvents() {\n this._onSend = () => this.submit();\n this._onKey = (e) => { if (e.key === 'Enter') { e.preventDefault(); this.submit(); } };\n this._btn.addEventListener('click', this._onSend);\n this._input.addEventListener('keydown', this._onKey);\n }\n\n teardownEvents() {\n this._btn?.removeEventListener('click', this._onSend);\n this._input?.removeEventListener('keydown', this._onKey);\n }\n\n submit() {\n const text = this._input.value.trim();\n if (!text || this.getBoolAttr('disabled')) return;\n const ok = this.emit('nk-submit', { text });\n if (ok) this._input.value = '';\n }\n\n onAttributeChanged() { this._sync(); }\n onStringsChanged() { this._sync(); }\n focus(o) { this._input?.focus(o); }\n get value() { return this._input?.value ?? ''; }\n set value(v) { if (this._input) this._input.value = v ?? ''; }\n}\n\ncustomElements.define('nk-ai-input-row', NkAiInputRow);\nexport { NkAiInputRow };\n"],"names":["tokensCss","componentsHead","componentsTail","componentsCss","css","CSSStyleSheet","replaceSync","componentsSheet","BUILT_IN","en","copy","copied","show","hide","uploadImage","changeImage","remove","close","resize","today","previousMonth","nextMonth","clear","time","filter","sort","addFilter","removeFilter","search","closeSidebar","newPage","commentPlaceholder","send","askPlaceholder","commandPlaceholder","emojiPlaceholder","toggleTheme","synced","message","breadcrumb","commandPalette","comment","searchEmoji","settings","title","changeIcon","add","more","de","custom","listeners","Set","setStrings","strings","lang","key","String","toLowerCase","split","fn","builtInStrings","str","el","node","getRootNode","host","hit","closest","getAttribute","document","documentElement","langOf","TOKENS_INJECTED","globalThis","sheet","adoptedStyleSheets","injectDefaultTokens","instances","getCurrentTheme","syncAllStrings","instance","onStringsChanged","window","MutationObserver","records","some","r","attributeName","theme","_syncTheme","syncAllThemes","observe","attributes","attributeFilter","hostSheets","Map","hostSheetFor","display","get","set","NkElement","HTMLElement","hostStyles","observesLightDom","lightDomObserverInit","childList","subtree","characterData","slotAssignment","observedAttributes","constructor","super","this","_initialized","_shadow","attachShadow","mode","sheets","extra","push","connectedCallback","_wrapper","setAttribute","_upgradeOwnProperties","createElement","className","appendChild","render","setupEvents","_lightDomObserver","projectLightDom","assignSlots","_slotObserver","disconnectedCallback","delete","disconnect","teardownEvents","attributeChangedCallback","name","oldValue","newValue","onAttributeChanged","textFor","Object","keys","startsWith","desc","proto","getPrototypeOf","prototype","getOwnPropertyDescriptor","value","refresh","takeTitle","_titleText","removeAttribute","getBoolAttr","hasAttribute","setBoolAttr","tag","classes","attrs","length","classList","val","entries","emit","eventName","detail","dispatchEvent","CustomEvent","bubbles","composed","cancelable","NkFormElement","static","_internals","attachInternals","form","validationMessage","validity","willValidate","checkValidity","reportValidity","first","_formDisabled","onFormDisabled","formResetCallback","resetValue","formStateRestoreCallback","state","restoreValue","formDisabledCallback","disabled","setFormValue","setValidity","flags","anchor","syncValidityFrom","control","valid","VARIANTS","NkBtn","_build","href","type","_computeClasses","join","_applyState","_btn","removeEventListener","_onClick","replaceWith","addEventListener","tagName","v","_sidebar","open","querySelector","_sidebarCollapsed","e","preventDefault","stopPropagation","sidebar","matchMedia","matches","expand","toggle","requestSubmit","reset","_onToggle","target","_onCollapse","collapsed","variant","includes","focus","options","click","active","small","customElements","define","FORWARDED","BOOLEANS","NkInput","_input","attr","_forward","_defaultValue","_syncWide","_syncFormValue","_onInput","_onChange","Event","blur","select","placeholder","required","readonly","wide","NkTextarea","textContent","trim","NkSelect","_select","_forwardAll","_pending","requestAnimationFrame","label","nodes","children","n","signature","map","outerHTML","_optionSignature","previous","selectedIndex","innerHTML","cloneNode","_applyValue","o","compact","NkSwitch","_row","role","_text","_slot","_textNode","createTextNode","append","_defaultChecked","_apply","_syncText","text","data","hasText","assignedNodes","nodeType","Node","ELEMENT_NODE","hidden","style","_onSlot","checked","NkCheck","slot","indeterminate","_syncing","ARROW_KEYS","ArrowDown","ArrowRight","ArrowUp","ArrowLeft","ownerForm","undefined","syncGroupTabIndex","group","enabled","focusable","find","tabIndex","NkRadio","_uncheckPeers","_group","_applyChange","_onKeyDown","dir","ctrlKey","metaKey","altKey","next","indexOf","root","querySelectorAll","NkSlider","_out","_syncOut","Number","showValue","WIDE","NkField","_field","_label","labelSlot","_desc","descSlot","_widened","_sync","stacked","assignedElements","localName","has","NkFields","_grid","fit","COLORS","NkTag","_tag","color","NkProgress","_bar","_fill","max","Math","min","width","parentNode","replaceChildren","NkCallout","_box","_icon","iconSlot","body","_syncIcon","icon","NkDivider","NkHeading","level","h","_heading","NkToggle","_details","summary","NkTodo","NkKbd","kbd","NkCode","_lang","_pre","highlight","replace","s","_lastText","m","self","a","eq","NkQuote","_quote","_cite","cite","NkApp","app","_app","main","locks","previousOverflow","lockScroll","overflow","unlockScroll","inertOutside","made","parent","ShadowRoot","sib","inert","test","c","deepActiveElement","activeElement","shadowRoot","firstFocusable","walk","getClientRects","inner","NkSidebar","_backdrop","_aside","head","_collapse","scroll","_footer","_footerSlot","_syncFooter","_syncOpen","_syncCollapse","dataset","tooltip","_toggleButton","sel","_onBackdrop","_onKey","defaultPrevented","toggleCollapsed","collapse","fromSidebar","contains","fromToggle","later","preventScroll","menuSheet","NkWorkspaceSwitcher","tabindex","_avatar","avatarSlot","_name","chev","_menu","charAt","toUpperCase","_onDocClick","composedPath","_onDocKey","_onMenuSelect","NkSectionLabel","_plus","_onPlus","action","addable","KEYS","NkTree","box","setActive","item","other","_syncTabIndex","visible","visibleItems","i","hasChildren","parentElement","p","requestSync","_syncQueued","queueMicrotask","items","setTabbable","list","_data","build","old","activeItem","NkTreeItem","_arrow","_iconSlot","_labelSlot","_labelText","_actions","glyph","b","_endSlot","_children","_childSlot","end","childNodes","TEXT_NODE","assign","_hasChildren","_hasEnd","wantActions","isConnected","insertBefore","_onRowClick","tree","location","tabbable","NkTopbar","bar","actions","NkBreadcrumb","_nav","originals","sep","_signature","explicitCurrent","forEach","original","clone","current","index","separator","NkThemeToggle","_syncTitle","stored","localStorage","getItem","storageKey","_syncGlyph","apply","_onMessage","t","nkTheme","setItem","NkTabBar","_spacer","_syncBar","_valueOf","drawers","preset","known","_value","before","always","fixed","floating","NkTabBarItem","drawer","NkPage","_page","_cover","_coverSlot","filled","covered","iconed","_onIcon","_onCover","cover","full","NkPageCover","_img","alt","src","objectPosition","NkPageTitle","_h1","_committed","_onBlur","_commit","editable","NkPageActions","row","NkBlockHost","_handle","handle","dropTarget","NkBanner","_classes","NkEmpty","_parts","cls","_old","NkSkeleton","lines","height","widths","Boolean","line","w","NkSynced","_badge","badge","boxOf","getBoundingClientRect","child","frameOf","top","left","right","x","y","placeUnder","align","removeProperty","f","roomBelow","innerHeight","bottom","roomAbove","up","room","floor","setProperty","innerWidth","NkTabs","_strip","_tabSlot","_panelSlot","tabs","panels","tab","panel","_reveal","_revealed","behavior","clientWidth","delta","smooth","scrollBy","_resize","ResizeObserver","NkTab","_tab","NkSegmented","_syncBox","buttons","btn","on","_choose","d","wrap","NkStats","NkStat","trend","NkAvatarGroup","_more","AVATAR_COLORS","paintAvatar","background","initialsOf","match","slice","NkAvatar","_initials","size","TYPES","NkMention","NkTemplateBtn","run","_space","NkModelCard","_card","titleSlot","_defaultSelected","_unselectPeers","selected","NkProfileRow","NkDangerZone","_titleEl","NkMemberList","_mark","rows","NkMemberRow","_mail","marginLeft","mail","avatar","NkProps","_list","flush","NkProp","part","NkPanels","NkPanel","_end","_head","prepend","_onEnd","NkSheet","id","_wasOpen","_returnFocus","_undoInert","back","NkSteps","_items","_steps","_step","step","selectable","focused","_","done","skipped","li","mark","link","button","shiftKey","ok","steps","Array","isArray","parseInt","isFinite","horizontal","NkBookmark","_a","URL","url","favicon","address","parts","ICONS","PHONE","NkCopyField","_val","_show","_copy","secret","repeat","tip","_button","_copied","word","lastChild","_onCopy","_onShow","_onPhone","clearTimeout","_timer","navigator","clipboard","writeText","setTimeout","getSelection","selectAllChildren","icons","dataUrlBytes","b64","padding","endsWith","NkImagePicker","_src","_remove","_max","_type","_quality","q","accept","_pick","file","bitmap","createImageBitmap","imageOrientation","scale","canvas","round","ctx","getContext","fillStyle","fillRect","drawImage","dataUrl","toDataURL","error","_onChoose","files","_onRemove","choose","square","pad","padStart","isoOf","getFullYear","getMonth","getDate","addDays","Date","parseDay","isNaN","getTime","start","isoWeek","UTC","setUTCDate","getUTCDate","getUTCDay","ceil","getUTCFullYear","resolveLocale","language","firstWeekday","locale","l","Intl","Locale","info","getWeekInfo","weekInfo","firstDay","weekdayNames","weekStart","DateTimeFormat","weekday","from","format","monthGrid","month","offset","getDay","day","stepMonth","weekLabel","CHEVRONS","STEPS","floatSheet","NkCalendar","_readValue","_pendingValue","_pendingMonth","_attrMonth","_month","_initialValue","_start","_day","_time","shown","_todayIso","_focus","_draw","days","_days","_cal","_title","_todayBtn","_prev","_next","_foot","_timeInput","_clear","_pop","_hasTime","_locale","_weekStart","isInteger","_syncPop","ws","weeks","range","g","weekend","JSON","parse","long","year","cells","chosen","iso","wk","inRange","off","marks","tone","focusDay","clearable","_syncForm","valueMissing","_goMonth","_onGrid","date","_onToday","_onPrev","_onNext","wd","months","last","_onTime","_onClear","_onOutside","path","_anchor","_onEscape","toggleAttribute","OVERLAYS","OVERLAY_CLASSES","phone","NkPeek","_close","_syncLabels","_syncResize","_setWidth","_min","parseFloat","getComputedStyle","getPropertyValue","_syncInset","_insetApp","_modal","inside","_onClose","_shownAt","timeStamp","resized","_onResizeStart","setPointerCapture","pointerId","_onResizeMove","hasPointerCapture","clientX","_onResizeEnd","_onResizeKey","_onViewport","performance","now","NkDialog","returnValue","_actionsSlot","_syncMode","alert","_from","_wasInert","own","Element","_onSubmit","submitter","hostSheet","count","NkTooltip","_bubble","_key","_delay","shortcut","_target","_describe","side","gap","below","above","placeNear","_described","ids","_targetOf","getElementById","_showFor","_onOver","pointerType","_onFocus","_onHide","capture","passive","NkModal","_rows","_content","requestNav","panes","_navQueued","_buildNav","labelled","lastGroup","pane","_syncActive","_current","_onNavClick","_onNavKey","NkSettingsPane","_section","_h2","NkSettingsUser","fuzzyScore","query","ti","score","streak","qi","idx","NkCmdk","glass","fontSize","autocomplete","esc","footerSlot","_commands","_index","_syncAttrs","_renderList","results","out","scored","keywords","empty","sc","_move","scrollIntoView","block","pick","_matchesHotkey","spec","pop","mod","shift","_onInputKey","_onListClick","_onListMove","_onListDown","commands","NkMenu","focusFirst","_onSelect","NkMenuItem","isSwitch","_check","_shortcut","_switch","_el","popSheet","OWN_SURFACE","NkPop","_triggerSlot","_float","_surface","_syncSurface","bare","_onTrigger","placement","C","cat","char","EMOJI_CATEGORIES","EMOJI","NkEmojiPicker","_search","_cats","_emojis","_cat","_renderCats","_renderGrid","cats","_categories","_catList","seen","values","emoji","_onCats","categories","emojis","NkToast","_msg","_lift","bars","rect","duration","ms","NkDatabase","_toolbar","_tabs","tools","_toolsSlot","_columns","views","setData","view","columns","tagFor","column","opt","opts","optionFor","textOf","timeOf","NaN","formatDate","minutes","rel","RelativeTimeFormat","numeric","abs","toLocaleDateString","renderPropertyCell","all","danger","checkbox","progress","flexWrap","cell","initials","toLocaleString","frag","createDocumentFragment","input","rowId","fill","formatPercent","NumberFormat","maximumFractionDigits","rankOf","findIndex","sortValue","sortKey","compareBy","localeCompare","NkTableView","_wrap","_table","_thead","_tbody","_newRow","_render","_sortedRows","col","tr","th","scope","td","act","_rowById","cellIndex","NkBoardView","_board","_groupColumn","_titleColumn","_metaColumns","k","header","cards","card","draggable","meta","_onDragStart","_dragId","dataTransfer","effectAllowed","_onDragOver","dropEffect","_onDrop","move","NkListView","NkCalendarView","_dateColumn","dateCol","titleCol","byDay","num","SIZES","NkGalleryView","coverKey","covers","hrefKey","NkFilterBar","_filterBtn","_sortBtn","_pillStart","createComment","_addBtn","_filters","removeLabel","after","pill","j","_emitChange","edit","_debounce","filters","every","op","NkComments","_onSend","submit","NkComment","_author","author","NkAiThread","NkAiMsg","_avatarSlot","_nameText","_actionSlot","user","bubble","badgeText","NkAiInputRow"],"mappings":"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","x_google_ignoreList":[0]}