@noseberry/nbd-editor 1.0.2 → 1.1.1

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
- .fe-root{--fe-blue:#2271b1;--fe-blue-hover:#135e96;--fe-admin-bar:#1d2327;--fe-border:#c3c4c7;--fe-text:#1e1e1e;--fe-light-text:#757575;--fe-white:#fff;--fe-bg:#f0f0f1;--fe-hover-bg:#f0f0f1;--fe-success:#00a32a;--fe-danger:#d63638;--fe-radius:4px;--fe-font:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background:var(--fe-bg);color:var(--fe-text);font-family:var(--fe-font);font-size:14px;line-height:1.5;min-height:0;position:relative;width:100%}.fe-root *,.fe-root :after,.fe-root :before{box-sizing:border-box}.fe-root .fe-admin-bar{align-items:center;background:var(--fe-admin-bar);display:flex;height:32px;padding:0 8px;position:sticky;top:0;z-index:1000}.fe-root .fe-wp-logo{align-items:center;background:var(--fe-blue);border-radius:50%;color:#fff;cursor:pointer;display:flex;font-size:14px;font-weight:700;height:28px;justify-content:center;margin-right:12px;width:28px}.fe-root .fe-site-name{color:#c3c4c7;cursor:pointer;font-size:13px}.fe-root .fe-site-name:hover{color:#72aee6}.fe-root .fe-bar-right{align-items:center;display:flex;gap:12px;margin-left:auto}.fe-root .fe-bar-link{color:#c3c4c7;cursor:pointer;font-size:13px}.fe-root .fe-bar-link:hover{color:#72aee6}.fe-root .fe-avatar{align-items:center;background:#50575e;border-radius:50%;color:#c3c4c7;cursor:pointer;display:flex;font-size:11px;height:24px;justify-content:center;width:24px}.fe-root .fe-header{background:var(--fe-white);border-bottom:1px solid var(--fe-border);height:56px;padding:0 16px;position:sticky;top:0;z-index:999}.fe-root .fe-header,.fe-root .fe-header-left,.fe-root .fe-header-right{align-items:center;display:flex;gap:4px}.fe-root .fe-header-center{align-items:center;display:flex;flex:1;justify-content:center}.fe-root .fe-status-text{color:var(--fe-light-text);font-size:12px}.fe-root .fe-btn{align-items:center;border:none;border-radius:var(--fe-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:500;gap:6px;padding:8px 16px;transition:background .15s,border-color .15s}.fe-root .fe-btn-primary{background:var(--fe-blue);color:#fff}.fe-root .fe-btn-primary:hover{background:var(--fe-blue-hover)}.fe-root .fe-btn-outline{background:transparent;border:1px solid var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-btn-outline:hover{background:#f0f7fc}.fe-root .fe-btn-sm{font-size:12px;padding:4px 10px}.fe-root .fe-icon-btn{align-items:center;background:transparent;border:none;border-radius:var(--fe-radius);color:var(--fe-text);cursor:pointer;display:flex;height:36px;justify-content:center;transition:background .15s;width:36px}.fe-root .fe-icon-btn:hover{background:var(--fe-hover-bg)}.fe-root .fe-icon-btn svg{height:20px;width:20px}.fe-root .fe-icon-btn-sm{height:28px;width:28px}.fe-root .fe-inserter-toggle{align-items:center;background:var(--fe-text);border:none;border-radius:var(--fe-radius);color:#fff;cursor:pointer;display:flex;height:36px;justify-content:center;transition:background .15s;width:36px}.fe-root .fe-inserter-toggle:hover{background:var(--fe-blue)}.fe-root .fe-inserter-toggle svg{height:20px;width:20px}.fe-root .fe-sep{background:var(--fe-border);height:24px;margin:0 4px;width:1px}.fe-root .fe-editor-main{display:flex;min-height:0;position:relative}.fe-root .fe-editor-canvas{display:flex;flex:1;justify-content:flex-start;padding:clamp(12px,3vw,40px) clamp(8px,2vw,20px) 24px;transition:margin-right .25s ease}.fe-root .fe-editor-canvas.fe-panel-open{margin-right:280px}.fe-root .fe-editor-content{max-width:none;width:100%}.fe-root .fe-post-title{background:transparent;border:none;color:var(--fe-text);font-family:inherit;font-size:40px;font-weight:700;line-height:1.2;margin-bottom:4px;outline:none;width:100%}.fe-root .fe-post-title::placeholder{color:#c3c4c7}.fe-root .fe-blocks-container{position:relative}.fe-root .fe-block-wrapper{border-radius:var(--fe-radius);margin-bottom:2px;overflow:visible;position:relative;transition:box-shadow .15s}.fe-root .fe-block-wrapper:hover{box-shadow:0 0 0 1px #ddd}.fe-root .fe-block-wrapper.fe-selected{box-shadow:0 0 0 2px var(--fe-blue)}.fe-root .fe-block-wrapper.fe-selected.fe-toolbar-inset{padding-top:42px}.fe-root .fe-block-toolbar-container{height:0;position:relative}.fe-root .fe-block-toolbar{align-items:center;background:#fff;border:1px solid var(--fe-border);border-radius:var(--fe-radius);box-shadow:0 2px 8px rgba(0,0,0,.12);display:none;flex-wrap:wrap;gap:1px;left:0;max-width:min(100%,calc(100vw - 16px));overflow:visible;padding:2px;position:absolute;top:-44px;white-space:normal;z-index:9999}.fe-root .fe-block-toolbar.fe-visible{display:flex}.fe-root .fe-block-toolbar.fe-toolbar-below{top:6px}.fe-root .fe-tb-btn{align-items:center;background:transparent;border:none;border-radius:3px;color:var(--fe-text);cursor:pointer;display:flex;font-size:14px;height:32px;justify-content:center;transition:background .1s;width:32px}.fe-root .fe-tb-btn:hover{background:var(--fe-hover-bg)}.fe-root .fe-tb-btn.active{background:#e0e0e0}.fe-root .fe-tb-btn-danger{color:var(--fe-danger)!important}.fe-root .fe-tb-btn svg{height:18px;width:18px}.fe-root .fe-tb-drag{cursor:grab}.fe-root .fe-tb-drag:active{cursor:grabbing}.fe-root .fe-tb-sep{background:#ddd;height:20px;margin:0 2px;width:1px}.fe-root .fe-tb-text-btn{background:#fff;border:1px solid #ddd;border-radius:3px;cursor:pointer;font-size:12px;height:32px;padding:0 8px;white-space:nowrap}.fe-root .fe-tb-text-btn:hover{border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-tb-select{background:#fff;border:1px solid #ddd;border-radius:3px;cursor:pointer;font-family:inherit;font-size:12px;max-width:120px;padding:2px 6px}.fe-root .fe-block-content{color:var(--fe-text);font-size:16px;line-height:1.7;min-height:28px;outline:none;padding:8px 12px;position:relative}.fe-root .fe-block-content:empty:before,.fe-root .fe-block-content[data-empty=true]:before{color:#c3c4c7;content:attr(data-placeholder);left:12px;pointer-events:none;position:absolute;top:8px}.fe-root .fe-block-content p{margin:0}.fe-root .fe-block-content img{height:auto;max-width:100%;width:100%}.fe-root .fe-inline-columns{align-items:flex-start;display:flex;gap:16px}.fe-root .fe-inline-column{border:1px dashed #c3c4c7;border-radius:4px;flex:1 1 0;min-width:0;padding:8px}.fe-root .fe-inline-column img{display:block;height:auto;max-width:100%;width:100%}.fe-root .fe-block-content.fe-heading-2,.fe-root h2.fe-block-content.fe-heading-2{font-size:32px!important;font-weight:700!important;line-height:1.25!important}.fe-root .fe-block-content.fe-heading-3,.fe-root h3.fe-block-content.fe-heading-3{font-size:26px!important;font-weight:650!important;line-height:1.3!important}.fe-root .fe-block-content.fe-heading-4,.fe-root h4.fe-block-content.fe-heading-4{font-size:21px!important;font-weight:600!important;line-height:1.35!important}.fe-root .fe-block-content h1{font-size:40px!important;font-weight:700!important;line-height:1.2!important}.fe-root .fe-block-content h2{font-size:32px!important;font-weight:700!important;line-height:1.25!important}.fe-root .fe-block-content h3{font-size:26px!important;font-weight:650!important;line-height:1.3!important}.fe-root .fe-block-content h4{font-size:21px!important;font-weight:600!important;line-height:1.35!important}.fe-root .fe-block-content h5{font-size:18px!important;font-weight:600!important;line-height:1.4!important}.fe-root .fe-block-content h6{font-size:16px!important;font-weight:600!important;line-height:1.45!important}.fe-root .fe-quote{border-left:4px solid var(--fe-text);color:#555;font-style:italic;padding-left:20px}.fe-root .fe-pullquote{border-bottom:3px solid var(--fe-text);border-top:3px solid var(--fe-text);color:#333;font-size:22px;font-style:italic;padding:20px 12px;text-align:center}.fe-root .fe-code-block{background:#1e1e1e;border-radius:var(--fe-radius);color:#d4d4d4;font-family:SF Mono,Fira Code,Consolas,monospace;font-size:14px;line-height:1.5;padding:16px;white-space:pre-wrap}.fe-root .fe-html-block{background:#f8f9fa;border:1px dashed #ddd;font-family:monospace;font-size:13px;padding:12px;white-space:pre-wrap}.fe-root .fe-list-block,.fe-root .fe-ordered-list-block{padding-left:28px}.fe-root .fe-inline-code{background:var(--fe-hover-bg);border-radius:3px;font-family:monospace;font-size:.9em;padding:2px 6px}.fe-root .fe-link{color:var(--fe-blue);text-decoration:underline}.fe-root .fe-button-block a,.fe-root .fe-button-block span{background:var(--fe-blue);border-radius:var(--fe-radius);color:#fff;display:inline-block;font-size:15px;font-weight:500;padding:10px 24px;text-decoration:none}.fe-root .fe-embed-block{background:#f8f9fa;border:1px dashed #ddd;font-size:14px;padding:12px}.fe-root .fe-block-media{padding:8px 12px}.fe-root .fe-media-placeholder{background:var(--fe-hover-bg);border:2px dashed var(--fe-border);border-radius:var(--fe-radius);cursor:pointer;padding:40px;text-align:center;transition:all .2s}.fe-root .fe-media-placeholder.fe-drop-active,.fe-root .fe-media-placeholder:hover{background:#f0f7fc;border-color:var(--fe-blue)}.fe-root .fe-media-placeholder-icon{margin-bottom:8px}.fe-root .fe-media-placeholder-icon svg{color:var(--fe-light-text);height:48px;width:48px}.fe-root .fe-media-placeholder-label{font-size:14px;font-weight:600;margin-bottom:4px}.fe-root .fe-media-placeholder-desc{color:var(--fe-light-text);font-size:13px;margin-bottom:12px}.fe-root .fe-media-placeholder-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.fe-root .fe-media-url-input{border:1px solid var(--fe-border);border-radius:var(--fe-radius);font-family:inherit;font-size:13px;outline:none;padding:8px 12px;width:200px}.fe-root .fe-media-url-input:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-image-figure{display:inline-block;max-width:100%;position:relative}.fe-root .fe-image-figure img{border-radius:var(--fe-radius);display:block;max-width:100%}.fe-root .fe-image-resize-handle{background:var(--fe-blue);border:2px solid #fff;border-radius:2px;bottom:34px;box-shadow:0 0 0 1px rgba(0,0,0,.25);cursor:nwse-resize;display:none;height:14px;position:absolute;right:6px;width:14px;z-index:5}.fe-root .fe-block-wrapper.fe-selected .fe-image-resize-handle{display:block}.fe-root .fe-image-caption{color:var(--fe-light-text);font-size:13px;min-height:24px;outline:none;padding:8px 4px;text-align:center}.fe-root .fe-image-caption:empty:before{color:#c3c4c7;content:attr(data-placeholder)}.fe-root .fe-image-overlay{display:none;gap:4px;position:absolute;right:8px;top:8px}.fe-root .fe-image-figure:hover .fe-image-overlay{display:flex}.fe-root .fe-img-overlay-btn{background:rgba(0,0,0,.6);border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:12px;padding:4px 10px}.fe-root .fe-img-overlay-btn:hover{background:rgba(0,0,0,.8)}.fe-root .fe-img-overlay-btn-danger:hover{background:var(--fe-danger)}.fe-root .fe-image-size-controls{display:flex;gap:6px;margin-top:8px}.fe-root .fe-block-wrapper:not(.fe-selected) .fe-image-size-controls{display:none}.fe-root .fe-img-size-btn{background:#fff;border:1px solid var(--fe-border);border-radius:3px;color:var(--fe-text);cursor:pointer;font-size:12px;padding:4px 8px}.fe-root .fe-img-size-btn:hover{border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-img-size-btn.is-active{background:var(--fe-blue);border-color:var(--fe-blue);color:#fff}.fe-root .fe-gallery-grid{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));margin-bottom:8px}.fe-root .fe-gallery-item{border-radius:var(--fe-radius);overflow:hidden;position:relative}.fe-root .fe-gallery-item img{display:block;height:150px;object-fit:cover;width:100%}.fe-root .fe-gallery-remove{align-items:center;background:rgba(0,0,0,.6);border:none;border-radius:50%;color:#fff;cursor:pointer;display:none;font-size:14px;height:24px;justify-content:center;position:absolute;right:4px;top:4px;width:24px}.fe-root .fe-gallery-item:hover .fe-gallery-remove{display:flex}.fe-root .fe-gallery-add{background:transparent;border:2px dashed var(--fe-border);border-radius:var(--fe-radius);color:var(--fe-blue);cursor:pointer;font-family:inherit;font-size:13px;padding:8px 16px}.fe-root .fe-gallery-add:hover{background:#f0f7fc;border-color:var(--fe-blue)}.fe-root .fe-file-wrapper{align-items:center;background:var(--fe-hover-bg);border:1px solid #e0e0e0;border-radius:var(--fe-radius);display:flex;justify-content:space-between;padding:12px 16px}.fe-root .fe-file-info{align-items:center;display:flex;gap:8px}.fe-root .fe-file-icon svg{color:var(--fe-light-text);height:20px;width:20px}.fe-root .fe-file-name{font-size:14px;font-weight:500}.fe-root .fe-file-size{color:var(--fe-light-text);font-size:12px}.fe-root .fe-file-download{color:var(--fe-blue);font-size:13px;text-decoration:none}.fe-root .fe-block-separator hr{border:none;border-top:2px solid #e0e0e0;margin:16px 12px}.fe-root .fe-block-spacer{background:repeating-linear-gradient(45deg,transparent,transparent 4px,var(--fe-hover-bg) 4px,var(--fe-hover-bg) 8px);border-radius:var(--fe-radius);margin:0 12px;opacity:.5;position:relative}.fe-root .fe-spacer-handle{background:var(--fe-border);border-radius:4px;bottom:-4px;cursor:ns-resize;height:8px;left:50%;position:absolute;transform:translateX(-50%);width:48px}.fe-root .fe-spacer-handle:hover{background:var(--fe-blue)}.fe-root .fe-block-columns{display:flex;flex-wrap:wrap;gap:16px;padding:8px 12px}.fe-root .fe-column{border:1px dashed #ddd;border-radius:var(--fe-radius);flex:1;font-size:14px;min-height:60px;min-width:180px;outline:none;padding:16px}.fe-root .fe-column:empty:before{color:#c3c4c7;content:attr(data-placeholder)}.fe-root .fe-columns-controls{display:flex;gap:6px;width:100%}.fe-root .fe-block-table{overflow-x:auto;padding:8px 12px}.fe-root .fe-block-table table{border-collapse:collapse;width:100%}.fe-root .fe-block-table td,.fe-root .fe-block-table th{border:1px solid #ddd;font-size:14px;min-width:80px;outline:none;padding:8px}.fe-root .fe-block-table th{background:var(--fe-hover-bg);font-weight:600}.fe-root .fe-table-controls{display:flex;gap:6px;margin-top:8px}.fe-root .fe-blocks-container>.fe-block-appender{align-items:center;background:#fff;border:1px dashed var(--fe-border);border-radius:var(--fe-radius);color:#8a8f98;cursor:pointer;display:inline-flex;font-family:inherit;font-size:15px;gap:8px;line-height:1;margin:10px 0 16px 12px;min-height:40px;padding:8px 12px}.fe-root .fe-blocks-container>.fe-block-appender:hover{background:#f6fbff;border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-blocks-container>.fe-block-appender:focus-visible{outline:2px solid var(--fe-blue);outline-offset:2px}.fe-root .fe-plus-icon{align-items:center;border:2px dashed #c3c4c7;border-radius:var(--fe-radius);display:flex;font-size:16px;height:24px;justify-content:center;transition:all .15s;width:24px}.fe-root .fe-blocks-container>.fe-block-appender:hover .fe-plus-icon{border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-inserter-panel{background:#fff;border:1px solid var(--fe-border);border-radius:8px;box-shadow:0 14px 30px rgba(0,0,0,.18);display:none;max-height:min(72vh,520px);overflow-y:auto;position:fixed;width:360px;z-index:1200}.fe-root .fe-inserter-panel.fe-open{display:block}.fe-root .fe-inserter-header{align-items:center;border-bottom:1px solid #eee;display:flex;justify-content:space-between;padding:16px}.fe-root .fe-inserter-header h3{color:var(--fe-light-text);font-size:13px;font-weight:600;margin:0;text-transform:uppercase}.fe-root .fe-inserter-search{border:1px solid var(--fe-border);border-radius:var(--fe-radius);font-family:inherit;font-size:14px;margin:12px 16px;outline:none;padding:8px 12px;width:calc(100% - 32px)}.fe-root .fe-inserter-search:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-inserter-category{color:var(--fe-light-text);font-size:11px;font-weight:600;letter-spacing:.5px;padding:8px 16px;text-transform:uppercase}.fe-root .fe-inserter-item{align-items:center;cursor:pointer;display:flex;gap:12px;padding:10px 16px;transition:background .1s}.fe-root .fe-inserter-item:hover{background:var(--fe-hover-bg)}.fe-root .fe-inserter-item-icon{align-items:center;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:var(--fe-radius);display:flex;flex-shrink:0;font-size:18px;height:40px;justify-content:center;width:40px}.fe-root .fe-inserter-item-icon svg{height:20px;width:20px}.fe-root .fe-inserter-item-info h4{font-size:13px;font-weight:500;margin:0}.fe-root .fe-inserter-item-info p{color:var(--fe-light-text);font-size:12px;margin:2px 0 0}.fe-root .fe-inserter-empty{color:var(--fe-light-text);font-size:13px;padding:20px;text-align:center}.fe-root .fe-media-modal-overlay{align-items:center;background:rgba(17,24,39,.45);display:none;inset:0;justify-content:center;position:fixed;z-index:20000}.fe-root .fe-media-modal-overlay.fe-open{display:flex}.fe-root .fe-media-modal-card{background:#fff;border:1px solid var(--fe-border);border-radius:10px;box-shadow:0 20px 40px rgba(0,0,0,.2);padding:18px;width:min(92vw,460px)}.fe-root .fe-media-modal-title{font-size:18px;line-height:1.25;margin:0 0 10px}.fe-root .fe-media-modal-desc{color:var(--fe-light-text);font-size:13px;margin:0 0 12px}.fe-root .fe-media-modal-input{border:1px solid var(--fe-border);border-radius:6px;font-size:14px;margin-bottom:12px;outline:none;padding:10px 12px;width:100%}.fe-root .fe-media-modal-input:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-media-modal-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.fe-root .fe-settings-panel{background:var(--fe-white);border-left:1px solid var(--fe-border);bottom:0;display:none;overflow-y:auto;position:fixed;right:0;top:88px;width:280px;z-index:998}.fe-root:not(:has(.fe-admin-bar)) .fe-settings-panel{top:56px}.fe-root .fe-settings-panel.fe-open{display:block}.fe-root .fe-panel-tabs{border-bottom:1px solid var(--fe-border);display:flex}.fe-root .fe-panel-tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--fe-light-text);cursor:pointer;flex:1;font-family:inherit;font-size:13px;font-weight:500;padding:12px;text-align:center;transition:all .15s}.fe-root .fe-panel-tab:hover{color:var(--fe-text)}.fe-root .fe-panel-tab.fe-active{border-bottom-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-panel-section{border-bottom:1px solid #eee;padding:16px}.fe-root .fe-section-title{color:var(--fe-light-text);font-size:11px;font-weight:600;letter-spacing:.5px;margin:0 0 12px;text-transform:uppercase}.fe-root .fe-panel-section label{color:var(--fe-text);display:block;font-size:13px;margin-bottom:6px}.fe-root .fe-input{border:1px solid var(--fe-border);border-radius:var(--fe-radius);font-family:inherit;font-size:13px;margin-bottom:12px;outline:none;padding:8px 10px;width:100%}.fe-root .fe-input:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-textarea{min-height:60px;resize:vertical}.fe-root .fe-checkbox-label{align-items:center;cursor:pointer;display:flex!important;gap:6px;margin-bottom:4px!important}.fe-root .fe-category-list{margin-bottom:8px;max-height:120px;overflow-y:auto}.fe-root .fe-add-link{color:var(--fe-blue);cursor:pointer;font-size:12px;text-decoration:none}.fe-root .fe-add-link:hover{text-decoration:underline}.fe-root .fe-tag-input-wrapper{border:1px solid var(--fe-border);border-radius:var(--fe-radius);cursor:text;display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px;min-height:36px;padding:6px}.fe-root .fe-tag-input-wrapper:focus-within{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-tag-input-wrapper input{border:none;flex:1;font-family:inherit;font-size:13px;min-width:80px;outline:none;padding:2px}.fe-root .fe-tag{align-items:center;background:var(--fe-hover-bg);border-radius:3px;display:flex;font-size:12px;gap:4px;padding:2px 8px}.fe-root .fe-tag-remove{color:#999;cursor:pointer;font-size:14px}.fe-root .fe-tag-remove:hover{color:var(--fe-danger)}.fe-root .fe-hint{color:var(--fe-light-text);font-size:11px;margin:0}.fe-root .fe-featured-image-area{border:2px dashed var(--fe-border);border-radius:var(--fe-radius);cursor:pointer;margin-bottom:12px;padding:24px;text-align:center;transition:all .2s}.fe-root .fe-featured-image-area:hover{background:#f0f7fc;border-color:var(--fe-blue)}.fe-root .fe-featured-image-area p{color:var(--fe-light-text);font-size:13px;margin:0}.fe-root .fe-toggle-row{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.fe-root .fe-toggle-row label{margin-bottom:0!important}.fe-root .fe-toggle-switch{background:#c3c4c7;border:none;border-radius:10px;cursor:pointer;height:20px;padding:0;position:relative;transition:background .2s;width:36px}.fe-root .fe-toggle-switch.fe-on{background:var(--fe-blue)}.fe-root .fe-toggle-switch:after{background:#fff;border-radius:50%;content:"";height:16px;left:2px;position:absolute;top:2px;transition:transform .2s;width:16px}.fe-root .fe-toggle-switch.fe-on:after{transform:translateX(16px)}.fe-root .fe-color-grid{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.fe-root .fe-color-swatch{border:2px solid #ddd;border-radius:50%;cursor:pointer;height:28px;transition:transform .1s;width:28px}.fe-root .fe-color-swatch:hover{transform:scale(1.15)}.fe-root .fe-muted{color:var(--fe-light-text);font-size:13px}.fe-root .fe-text-center{padding:20px 0;text-align:center}.fe-root .fe-slash-menu{background:#fff;border:1px solid var(--fe-border);border-radius:8px;box-shadow:0 4px 16px rgba(0,0,0,.12);display:none;max-height:320px;overflow-y:auto;padding:4px;position:absolute;width:280px;z-index:200}.fe-root .fe-slash-menu.fe-open{display:block}.fe-root .fe-slash-item{align-items:center;border-radius:var(--fe-radius);cursor:pointer;display:flex;gap:10px;padding:8px 12px;transition:background .1s}.fe-root .fe-slash-item.fe-highlighted,.fe-root .fe-slash-item:hover{background:var(--fe-hover-bg)}.fe-root .fe-slash-icon{align-items:center;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:var(--fe-radius);display:flex;flex-shrink:0;font-size:15px;height:32px;justify-content:center;width:32px}.fe-root .fe-slash-icon svg{height:18px;width:18px}.fe-root .fe-slash-label{font-size:13px;font-weight:500}.fe-root .fe-slash-desc{color:var(--fe-light-text);font-size:11px}.fe-root .fe-slash-empty{color:var(--fe-light-text);font-size:13px;padding:16px;text-align:center}.fe-root .fe-link-popover{align-items:center;background:#fff;border:1px solid var(--fe-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);display:none;gap:6px;padding:8px;position:absolute;width:320px;z-index:200}.fe-root .fe-link-popover.fe-open{display:flex}.fe-root .fe-link-input{border:1px solid var(--fe-border);border-radius:var(--fe-radius);flex:1;font-family:inherit;font-size:13px;outline:none;padding:6px 10px}.fe-root .fe-link-input:focus{border-color:var(--fe-blue)}.fe-root .fe-html-modal-overlay{align-items:center;background:rgba(0,0,0,.45);display:none;inset:0;justify-content:center;padding:24px;position:fixed;z-index:3000}.fe-root .fe-html-modal-overlay.fe-open{display:flex}.fe-root .fe-html-modal{background:#fff;border:1px solid var(--fe-border);border-radius:8px;box-shadow:0 20px 50px rgba(0,0,0,.35);display:grid;grid-template-rows:auto 1fr auto;max-height:min(80vh,760px);overflow:hidden;width:min(920px,100%)}.fe-root .fe-html-modal-header{align-items:center;border-bottom:1px solid #e7e7e7;display:flex;justify-content:space-between;padding:12px 14px}.fe-root .fe-html-modal-title{font-size:14px;font-weight:600;margin:0}.fe-root .fe-html-modal-textarea{border:none;font-family:SF Mono,Menlo,Monaco,Consolas,monospace;font-size:13px;line-height:1.6;min-height:260px;outline:none;padding:14px;resize:none;width:100%}.fe-root .fe-html-modal-actions{border-top:1px solid #e7e7e7;display:flex;gap:8px;justify-content:flex-end;padding:12px 14px}.fe-root .fe-status-bar{align-items:center;background:var(--fe-white);border-top:1px solid var(--fe-border);bottom:0;color:var(--fe-light-text);display:flex;font-size:12px;gap:16px;height:28px;left:0;padding:0 16px;position:fixed;right:0;z-index:998}.fe-root .fe-status-right{margin-left:auto}.fe-root .fe-toast{background:var(--fe-admin-bar);border-radius:var(--fe-radius);bottom:44px;color:#fff;font-size:13px;left:50%;opacity:0;padding:10px 20px;pointer-events:none;position:fixed;transform:translateX(-50%) translateY(20px);transition:all .3s ease;z-index:9999}.fe-root .fe-toast.fe-show{opacity:1;transform:translateX(-50%) translateY(0)}.fe-root .fe-drag-placeholder{background:var(--fe-blue);border-radius:2px;height:4px;margin:4px 0}.fe-root ::-webkit-scrollbar{width:6px}.fe-root ::-webkit-scrollbar-track{background:transparent}.fe-root ::-webkit-scrollbar-thumb{background:#c3c4c7;border-radius:3px}.fe-root ::-webkit-scrollbar-thumb:hover{background:#a0a0a0}@media (max-width:900px){.fe-root .fe-editor-content{max-width:100%;padding:0 12px}.fe-root .fe-settings-panel{width:100%}.fe-root .fe-inserter-panel{width:min(94vw,360px)}.fe-root .fe-block-toolbar{flex-wrap:wrap}}
1
+ .fe-root{--fe-blue:#3b82f6;--fe-blue-hover:#2563eb;--fe-text:#1e1e1e;--fe-light-text:#6b7280;--fe-white:#fff;--fe-bg:#f8f9fb;--fe-hover-bg:#f3f4f6;--fe-border:#e2e4e9;--fe-admin-bar:#1d2327;--fe-success:#10b981;--fe-danger:#ef4444;--fe-radius:6px;--fe-font:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;--fe-shadow-sm:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);--fe-shadow-md:0 4px 12px rgba(0,0,0,.08),0 1px 3px rgba(0,0,0,.06);--fe-canvas-bg:var(--fe-white);--fe-header-height:60px;--fe-status-bar-height:32px;--fe-content-font-size:15px;--fe-content-line-height:1.65;background:var(--fe-bg);color:var(--fe-text);font-family:var(--fe-font);font-size:14px;line-height:1.5;min-height:0;position:relative;width:100%}.fe-root *,.fe-root :after,.fe-root :before{box-sizing:border-box}.fe-root .fe-admin-bar{align-items:center;background:var(--fe-admin-bar);display:flex;height:32px;padding:0 8px;position:sticky;top:0;z-index:1000}.fe-root .fe-wp-logo{align-items:center;background:var(--fe-blue);border-radius:50%;color:#fff;cursor:pointer;display:flex;font-size:14px;font-weight:700;height:28px;justify-content:center;margin-right:12px;width:28px}.fe-root .fe-site-name{color:#c3c4c7;cursor:pointer;font-size:13px}.fe-root .fe-site-name:hover{color:#72aee6}.fe-root .fe-bar-right{align-items:center;display:flex;gap:12px;margin-left:auto}.fe-root .fe-bar-link{color:#c3c4c7;cursor:pointer;font-size:13px}.fe-root .fe-bar-link:hover{color:#72aee6}.fe-root .fe-avatar{align-items:center;background:#50575e;border-radius:50%;color:#c3c4c7;cursor:pointer;display:flex;font-size:11px;height:24px;justify-content:center;width:24px}.fe-root .fe-header{align-items:center;background:var(--fe-white);border-bottom:1px solid rgba(0,0,0,.06);box-shadow:0 1px 3px rgba(0,0,0,.04);display:flex;gap:6px;height:var(--fe-header-height);padding:0 20px;position:sticky;top:0;z-index:999}.fe-root .fe-header-left,.fe-root .fe-header-right{align-items:center;display:flex;gap:4px}.fe-root .fe-header-center{align-items:center;display:flex;flex:1;justify-content:center}.fe-root .fe-status-text{color:var(--fe-light-text);font-size:12px}.fe-root .fe-btn{align-items:center;border:none;border-radius:var(--fe-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:500;gap:6px;padding:8px 16px;transition:background .15s,border-color .15s}.fe-root .fe-btn-primary{background:var(--fe-blue);color:#fff}.fe-root .fe-btn-primary:hover{background:var(--fe-blue-hover)}.fe-root .fe-btn-outline{background:transparent;border:1px solid var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-btn-outline:hover{background:#f0f7fc}.fe-root .fe-btn-sm{font-size:12px;padding:4px 10px}.fe-root .fe-icon-btn{align-items:center;background:transparent;border:none;border-radius:var(--fe-radius);color:var(--fe-text);cursor:pointer;display:flex;height:36px;justify-content:center;transition:background .15s;width:36px}.fe-root .fe-icon-btn:hover{background:var(--fe-hover-bg)}.fe-root .fe-icon-btn svg{height:20px;width:20px}.fe-root .fe-icon-btn-sm{height:28px;width:28px}.fe-root .fe-inserter-toggle{align-items:center;background:var(--fe-text);border:none;border-radius:var(--fe-radius);color:#fff;cursor:pointer;display:flex;height:36px;justify-content:center;transition:background .15s;width:36px}.fe-root .fe-inserter-toggle:hover{background:var(--fe-blue)}.fe-root .fe-inserter-toggle svg{height:20px;width:20px}.fe-root .fe-sep{background:var(--fe-border);height:24px;margin:0 4px;width:1px}.fe-root .fe-editor-main{display:flex;min-height:0;position:relative}.fe-root .fe-editor-canvas{background:var(--fe-canvas-bg);display:flex;flex:1;justify-content:center;padding:0;transition:margin-right .25s ease}.fe-root .fe-editor-canvas.fe-panel-open{margin-right:280px}.fe-root .fe-editor-content{max-width:none;min-height:calc(100vh - 140px);padding:16px;width:100%}.fe-root .fe-post-title{background:transparent;border:none;color:var(--fe-text);font-family:inherit;font-size:40px;font-weight:700;line-height:1.2;margin-bottom:4px;outline:none;width:100%}.fe-root .fe-post-title::placeholder{color:#c3c4c7}.fe-root .fe-blocks-container{position:relative}.fe-root .fe-block-wrapper{border-left:2px solid transparent;border-radius:var(--fe-radius);margin-bottom:2px;overflow:visible;position:relative;transition:box-shadow .15s,background .15s}.fe-root .fe-block-wrapper:hover{background:rgba(59,130,246,.02);border-left-color:#e2e4e9}.fe-root .fe-block-wrapper.fe-selected{background:rgba(59,130,246,.015);border-left-color:var(--fe-blue)}.fe-root .fe-block-wrapper.fe-selected.fe-toolbar-inset{padding-top:48px}.fe-root .fe-block-toolbar-container{height:0;position:relative}.fe-root .fe-block-toolbar{align-items:center;background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:10px;box-shadow:0 4px 16px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.06);display:none;flex-wrap:nowrap;gap:1px;left:0;max-width:min(100%,calc(100vw - 16px));overflow-x:auto;padding:3px;position:absolute;scrollbar-width:none;top:-46px;white-space:nowrap;z-index:9999}.fe-root .fe-block-toolbar.fe-visible{display:flex}.fe-root .fe-block-toolbar::-webkit-scrollbar{display:none}.fe-root .fe-block-toolbar.fe-toolbar-below{top:6px}.fe-root .fe-block-toolbar.fe-toolbar-dragging{transition:none;user-select:none}.fe-root .fe-tb-btn{align-items:center;background:transparent;border:none;border-radius:5px;color:var(--fe-text);cursor:pointer;display:flex;font-size:14px;height:32px;justify-content:center;transition:background .1s;width:32px}.fe-root .fe-tb-btn:hover{background:var(--fe-hover-bg)}.fe-root .fe-tb-btn.active{background:#e8edff;color:var(--fe-blue)}.fe-root .fe-tb-btn-danger{color:var(--fe-danger)!important}.fe-root .fe-tb-btn svg{height:18px;width:18px}.fe-root .fe-tb-drag{cursor:grab}.fe-root .fe-tb-drag:active{cursor:grabbing}.fe-root .fe-tb-sep{background:#ddd;height:20px;margin:0 2px;width:1px}.fe-root .fe-tb-text-btn{background:#fff;border:1px solid #ddd;border-radius:3px;cursor:pointer;font-size:12px;height:32px;padding:0 8px;white-space:nowrap}.fe-root .fe-tb-text-btn:hover{border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-tb-select{background:#fff;border:1px solid #ddd;border-radius:3px;cursor:pointer;font-family:inherit;font-size:12px;max-width:120px;padding:2px 6px}.fe-root .fe-block-content{color:var(--fe-text);font-size:var(--fe-content-font-size);line-height:var(--fe-content-line-height);min-height:28px;outline:none;padding:8px 12px;position:relative}.fe-root .fe-block-content:empty:before,.fe-root .fe-block-content[data-empty=true]:before{color:#c3c4c7;content:attr(data-placeholder);left:12px;pointer-events:none;position:absolute;top:8px}.fe-root .fe-block-content p{margin:0}.fe-root .fe-block-content img{height:auto;max-width:100%;width:100%}.fe-root .fe-inline-columns{align-items:flex-start;display:flex;gap:16px}.fe-root .fe-inline-column{border:1px dashed #c3c4c7;border-radius:4px;flex:1 1 0;min-width:0;padding:8px}.fe-root .fe-inline-column img{display:block;height:auto;max-width:100%;width:100%}.fe-root .fe-block-content.fe-heading-2,.fe-root h2.fe-block-content.fe-heading-2{font-size:32px!important;font-weight:700!important;line-height:1.25!important}.fe-root .fe-block-content.fe-heading-3,.fe-root h3.fe-block-content.fe-heading-3{font-size:26px!important;font-weight:650!important;line-height:1.3!important}.fe-root .fe-block-content.fe-heading-4,.fe-root h4.fe-block-content.fe-heading-4{font-size:21px!important;font-weight:600!important;line-height:1.35!important}.fe-root .fe-block-content h1{font-size:40px!important;font-weight:700!important;line-height:1.2!important}.fe-root .fe-block-content h2{font-size:32px!important;font-weight:700!important;line-height:1.25!important}.fe-root .fe-block-content h3{font-size:26px!important;font-weight:650!important;line-height:1.3!important}.fe-root .fe-block-content h4{font-size:21px!important;font-weight:600!important;line-height:1.35!important}.fe-root .fe-block-content h5{font-size:18px!important;font-weight:600!important;line-height:1.4!important}.fe-root .fe-block-content h6{font-size:16px!important;font-weight:600!important;line-height:1.45!important}.fe-root .fe-quote{border-left:4px solid var(--fe-text);color:#555;font-style:italic;padding-left:20px}.fe-root .fe-pullquote{border-bottom:3px solid var(--fe-text);border-top:3px solid var(--fe-text);color:#333;font-size:22px;font-style:italic;padding:20px 12px;text-align:center}.fe-root .fe-code-block{background:#1e1e1e;border-radius:var(--fe-radius);color:#d4d4d4;font-family:SF Mono,Fira Code,Consolas,monospace;font-size:14px;line-height:1.5;padding:16px;white-space:pre-wrap}.fe-root .fe-html-block{background:#f8f9fa;border:1px dashed #ddd;font-family:monospace;font-size:13px;padding:12px;white-space:pre-wrap}.fe-root .fe-list-block,.fe-root .fe-ordered-list-block{padding-left:28px}.fe-root .fe-block-content ul,.fe-root .fe-list-block ul{list-style-type:disc!important;margin:0;padding-left:1.5em!important}.fe-root .fe-block-content ol,.fe-root .fe-ordered-list-block ol{list-style-type:decimal!important;margin:0;padding-left:1.5em!important}.fe-root .fe-block-content li{margin-bottom:2px}.fe-root .fe-block-content ol ul,.fe-root .fe-block-content ul ul{list-style-type:circle!important}.fe-root .fe-block-content ol ol ul,.fe-root .fe-block-content ol ul ul,.fe-root .fe-block-content ul ul ul{list-style-type:square!important}.fe-root .fe-block-content ol ol,.fe-root .fe-block-content ul ol{list-style-type:lower-alpha!important}.fe-root .fe-block-content ol ol ol,.fe-root .fe-block-content ul ol ol,.fe-root .fe-block-content ul ul ol{list-style-type:lower-roman!important}.fe-root .fe-inline-code{background:var(--fe-hover-bg);border-radius:3px;font-family:monospace;font-size:.9em;padding:2px 6px}.fe-root .fe-link{color:var(--fe-blue);text-decoration:underline}.fe-root .fe-button-block a,.fe-root .fe-button-block span{background:var(--fe-blue);border-radius:var(--fe-radius);color:#fff;display:inline-block;font-size:15px;font-weight:500;padding:10px 24px;text-decoration:none}.fe-root .fe-embed-block{background:#f8f9fa;border:1px dashed #ddd;font-size:14px;padding:12px}.fe-root .fe-block-media{padding:8px 12px}.fe-root .fe-media-placeholder{background:var(--fe-hover-bg);border:2px dashed var(--fe-border);border-radius:var(--fe-radius);cursor:pointer;padding:40px;text-align:center;transition:all .2s}.fe-root .fe-media-placeholder.fe-drop-active,.fe-root .fe-media-placeholder:hover{background:#f0f7fc;border-color:var(--fe-blue)}.fe-root .fe-media-placeholder-icon{margin-bottom:8px}.fe-root .fe-media-placeholder-icon svg{color:var(--fe-light-text);height:48px;width:48px}.fe-root .fe-media-placeholder-label{font-size:14px;font-weight:600;margin-bottom:4px}.fe-root .fe-media-placeholder-desc{color:var(--fe-light-text);font-size:13px;margin-bottom:12px}.fe-root .fe-media-placeholder-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.fe-root .fe-media-url-input{border:1px solid var(--fe-border);border-radius:var(--fe-radius);font-family:inherit;font-size:13px;outline:none;padding:8px 12px;width:200px}.fe-root .fe-media-url-input:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-image-figure{display:inline-block;max-width:100%;position:relative}.fe-root .fe-image-figure img{border-radius:var(--fe-radius);display:block;max-width:100%}.fe-root .fe-image-resize-handle{background:var(--fe-blue);border:2px solid #fff;border-radius:2px;bottom:34px;box-shadow:0 0 0 1px rgba(0,0,0,.25);cursor:nwse-resize;display:none;height:14px;position:absolute;right:6px;width:14px;z-index:5}.fe-root .fe-block-wrapper.fe-selected .fe-image-resize-handle{display:block}.fe-root .fe-image-caption{color:var(--fe-light-text);font-size:13px;min-height:24px;outline:none;padding:8px 4px;text-align:center}.fe-root .fe-image-caption:empty:before{color:#c3c4c7;content:attr(data-placeholder)}.fe-root .fe-image-overlay{display:none;gap:4px;position:absolute;right:8px;top:8px}.fe-root .fe-image-figure:hover .fe-image-overlay{display:flex}.fe-root .fe-img-overlay-btn{background:rgba(0,0,0,.6);border:none;border-radius:3px;color:#fff;cursor:pointer;font-size:12px;padding:4px 10px}.fe-root .fe-img-overlay-btn:hover{background:rgba(0,0,0,.8)}.fe-root .fe-img-overlay-btn-danger:hover{background:var(--fe-danger)}.fe-root .fe-image-size-controls{display:flex;gap:6px;margin-top:8px}.fe-root .fe-block-wrapper:not(.fe-selected) .fe-image-size-controls{display:none}.fe-root .fe-img-size-btn{background:#fff;border:1px solid var(--fe-border);border-radius:3px;color:var(--fe-text);cursor:pointer;font-size:12px;padding:4px 8px}.fe-root .fe-img-size-btn:hover{border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-img-size-btn.is-active{background:var(--fe-blue);border-color:var(--fe-blue);color:#fff}.fe-root .fe-gallery-grid{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));margin-bottom:8px}.fe-root .fe-gallery-item{border-radius:var(--fe-radius);overflow:hidden;position:relative}.fe-root .fe-gallery-item img{display:block;height:150px;object-fit:cover;width:100%}.fe-root .fe-gallery-remove{align-items:center;background:rgba(0,0,0,.6);border:none;border-radius:50%;color:#fff;cursor:pointer;display:none;font-size:14px;height:24px;justify-content:center;position:absolute;right:4px;top:4px;width:24px}.fe-root .fe-gallery-item:hover .fe-gallery-remove{display:flex}.fe-root .fe-gallery-add{background:transparent;border:2px dashed var(--fe-border);border-radius:var(--fe-radius);color:var(--fe-blue);cursor:pointer;font-family:inherit;font-size:13px;padding:8px 16px}.fe-root .fe-gallery-add:hover{background:#f0f7fc;border-color:var(--fe-blue)}.fe-root .fe-file-wrapper{align-items:center;background:var(--fe-hover-bg);border:1px solid #e0e0e0;border-radius:var(--fe-radius);display:flex;justify-content:space-between;padding:12px 16px}.fe-root .fe-file-info{align-items:center;display:flex;gap:8px}.fe-root .fe-file-icon svg{color:var(--fe-light-text);height:20px;width:20px}.fe-root .fe-file-name{font-size:14px;font-weight:500}.fe-root .fe-file-size{color:var(--fe-light-text);font-size:12px}.fe-root .fe-file-download{color:var(--fe-blue);font-size:13px;text-decoration:none}.fe-root .fe-block-separator hr{border:none;border-top:2px solid #e0e0e0;margin:16px 12px}.fe-root .fe-block-spacer{background:repeating-linear-gradient(45deg,transparent,transparent 4px,var(--fe-hover-bg) 4px,var(--fe-hover-bg) 8px);border-radius:var(--fe-radius);margin:0 12px;opacity:.5;position:relative}.fe-root .fe-spacer-handle{background:var(--fe-border);border-radius:4px;bottom:-4px;cursor:ns-resize;height:8px;left:50%;position:absolute;transform:translateX(-50%);width:48px}.fe-root .fe-spacer-handle:hover{background:var(--fe-blue)}.fe-root .fe-block-columns{display:flex;flex-wrap:wrap;gap:16px;padding:8px 12px}.fe-root .fe-column{border:1px dashed #ddd;border-radius:var(--fe-radius);flex:1;font-size:14px;min-height:60px;min-width:180px;outline:none;padding:16px}.fe-root .fe-column:empty:before{color:#c3c4c7;content:attr(data-placeholder)}.fe-root .fe-columns-controls{display:flex;gap:6px;width:100%}.fe-root .fe-block-table{overflow-x:auto;padding:8px 12px}.fe-root .fe-block-table table{border-collapse:collapse;width:100%}.fe-root .fe-block-table td,.fe-root .fe-block-table th{border:1px solid #ddd;font-size:14px;min-width:80px;outline:none;padding:8px}.fe-root .fe-block-table th{background:var(--fe-hover-bg);font-weight:600}.fe-root .fe-table-controls{display:flex;gap:6px;margin-top:8px}.fe-root .fe-blocks-container>.fe-block-appender{align-items:center;background:var(--fe-white);border:1px solid var(--fe-border);border-radius:var(--fe-radius);color:var(--fe-light-text);cursor:pointer;display:inline-flex;font-family:inherit;font-size:14px;gap:8px;line-height:1;margin:12px 0 16px 12px;min-height:40px;padding:8px 14px;transition:all .15s ease}.fe-root .fe-blocks-container>.fe-block-appender:hover{background:#eff6ff;border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-blocks-container>.fe-block-appender:focus-visible{outline:2px solid var(--fe-blue);outline-offset:2px}.fe-root .fe-plus-icon{align-items:center;border:2px dashed #c3c4c7;border-radius:var(--fe-radius);display:flex;font-size:16px;height:24px;justify-content:center;transition:all .15s;width:24px}.fe-root .fe-blocks-container>.fe-block-appender:hover .fe-plus-icon{border-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-inserter-panel{background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:12px;box-shadow:0 12px 36px rgba(0,0,0,.12),0 4px 12px rgba(0,0,0,.06);display:none;max-height:min(72vh,520px);overflow-y:auto;position:fixed;width:360px;z-index:1200}.fe-root .fe-inserter-panel.fe-open{display:block}.fe-root .fe-inserter-header{align-items:center;border-bottom:1px solid #eee;display:flex;justify-content:space-between;padding:16px}.fe-root .fe-inserter-header h3{color:var(--fe-light-text);font-size:13px;font-weight:600;margin:0;text-transform:uppercase}.fe-root .fe-inserter-search{border:1px solid var(--fe-border);border-radius:var(--fe-radius);font-family:inherit;font-size:14px;margin:12px 16px;outline:none;padding:8px 12px;width:calc(100% - 32px)}.fe-root .fe-inserter-search:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-inserter-category{color:var(--fe-light-text);font-size:11px;font-weight:600;letter-spacing:.5px;padding:8px 16px;text-transform:uppercase}.fe-root .fe-inserter-item{align-items:center;cursor:pointer;display:flex;gap:12px;padding:10px 16px;transition:background .1s}.fe-root .fe-inserter-item:hover{background:var(--fe-hover-bg)}.fe-root .fe-inserter-item-icon{align-items:center;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:var(--fe-radius);display:flex;flex-shrink:0;font-size:18px;height:40px;justify-content:center;width:40px}.fe-root .fe-inserter-item-icon svg{height:20px;width:20px}.fe-root .fe-inserter-item-info h4{font-size:13px;font-weight:500;margin:0}.fe-root .fe-inserter-item-info p{color:var(--fe-light-text);font-size:12px;margin:2px 0 0}.fe-root .fe-inserter-empty{color:var(--fe-light-text);font-size:13px;padding:20px;text-align:center}.fe-root .fe-media-modal-overlay{align-items:center;background:rgba(17,24,39,.45);display:none;inset:0;justify-content:center;position:fixed;z-index:20000}.fe-root .fe-media-modal-overlay.fe-open{display:flex}.fe-root .fe-media-modal-card{background:#fff;border:1px solid var(--fe-border);border-radius:10px;box-shadow:0 20px 40px rgba(0,0,0,.2);padding:18px;width:min(92vw,460px)}.fe-root .fe-media-modal-title{font-size:18px;line-height:1.25;margin:0 0 10px}.fe-root .fe-media-modal-desc{color:var(--fe-light-text);font-size:13px;margin:0 0 12px}.fe-root .fe-media-modal-input{border:1px solid var(--fe-border);border-radius:6px;font-size:14px;margin-bottom:12px;outline:none;padding:10px 12px;width:100%}.fe-root .fe-media-modal-input:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-media-modal-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.fe-root .fe-settings-panel{background:var(--fe-white);border-left:1px solid var(--fe-border);bottom:0;display:none;overflow-y:auto;position:fixed;right:0;top:88px;width:280px;z-index:998}.fe-root:not(:has(.fe-admin-bar)) .fe-settings-panel{top:56px}.fe-root .fe-settings-panel.fe-open{display:block}.fe-root .fe-panel-tabs{border-bottom:1px solid var(--fe-border);display:flex}.fe-root .fe-panel-tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--fe-light-text);cursor:pointer;flex:1;font-family:inherit;font-size:13px;font-weight:500;padding:12px;text-align:center;transition:all .15s}.fe-root .fe-panel-tab:hover{color:var(--fe-text)}.fe-root .fe-panel-tab.fe-active{border-bottom-color:var(--fe-blue);color:var(--fe-blue)}.fe-root .fe-panel-section{border-bottom:1px solid #eee;padding:16px}.fe-root .fe-section-title{color:var(--fe-light-text);font-size:11px;font-weight:600;letter-spacing:.5px;margin:0 0 12px;text-transform:uppercase}.fe-root .fe-panel-section label{color:var(--fe-text);display:block;font-size:13px;margin-bottom:6px}.fe-root .fe-input{border:1px solid var(--fe-border);border-radius:var(--fe-radius);font-family:inherit;font-size:13px;margin-bottom:12px;outline:none;padding:8px 10px;width:100%}.fe-root .fe-input:focus{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-textarea{min-height:60px;resize:vertical}.fe-root .fe-checkbox-label{align-items:center;cursor:pointer;display:flex!important;gap:6px;margin-bottom:4px!important}.fe-root .fe-category-list{margin-bottom:8px;max-height:120px;overflow-y:auto}.fe-root .fe-add-link{color:var(--fe-blue);cursor:pointer;font-size:12px;text-decoration:none}.fe-root .fe-add-link:hover{text-decoration:underline}.fe-root .fe-tag-input-wrapper{border:1px solid var(--fe-border);border-radius:var(--fe-radius);cursor:text;display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px;min-height:36px;padding:6px}.fe-root .fe-tag-input-wrapper:focus-within{border-color:var(--fe-blue);box-shadow:0 0 0 1px var(--fe-blue)}.fe-root .fe-tag-input-wrapper input{border:none;flex:1;font-family:inherit;font-size:13px;min-width:80px;outline:none;padding:2px}.fe-root .fe-tag{align-items:center;background:var(--fe-hover-bg);border-radius:3px;display:flex;font-size:12px;gap:4px;padding:2px 8px}.fe-root .fe-tag-remove{color:#999;cursor:pointer;font-size:14px}.fe-root .fe-tag-remove:hover{color:var(--fe-danger)}.fe-root .fe-hint{color:var(--fe-light-text);font-size:11px;margin:0}.fe-root .fe-featured-image-area{border:2px dashed var(--fe-border);border-radius:var(--fe-radius);cursor:pointer;margin-bottom:12px;padding:24px;text-align:center;transition:all .2s}.fe-root .fe-featured-image-area:hover{background:#f0f7fc;border-color:var(--fe-blue)}.fe-root .fe-featured-image-area p{color:var(--fe-light-text);font-size:13px;margin:0}.fe-root .fe-toggle-row{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.fe-root .fe-toggle-row label{margin-bottom:0!important}.fe-root .fe-toggle-switch{background:#c3c4c7;border:none;border-radius:10px;cursor:pointer;height:20px;padding:0;position:relative;transition:background .2s;width:36px}.fe-root .fe-toggle-switch.fe-on{background:var(--fe-blue)}.fe-root .fe-toggle-switch:after{background:#fff;border-radius:50%;content:"";height:16px;left:2px;position:absolute;top:2px;transition:transform .2s;width:16px}.fe-root .fe-toggle-switch.fe-on:after{transform:translateX(16px)}.fe-root .fe-color-grid{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.fe-root .fe-color-swatch{border:2px solid #ddd;border-radius:50%;cursor:pointer;height:28px;transition:transform .1s;width:28px}.fe-root .fe-color-swatch:hover{transform:scale(1.15)}.fe-root .fe-muted{color:var(--fe-light-text);font-size:13px}.fe-root .fe-text-center{padding:20px 0;text-align:center}.fe-root .fe-slash-menu{background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.1),0 2px 6px rgba(0,0,0,.05);display:none;max-height:320px;overflow-y:auto;padding:4px;position:absolute;width:280px;z-index:200}.fe-root .fe-slash-menu.fe-open{display:block}.fe-root .fe-slash-item{align-items:center;border-radius:var(--fe-radius);cursor:pointer;display:flex;gap:10px;padding:8px 12px;transition:background .1s}.fe-root .fe-slash-item.fe-highlighted,.fe-root .fe-slash-item:hover{background:var(--fe-hover-bg)}.fe-root .fe-slash-icon{align-items:center;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:var(--fe-radius);display:flex;flex-shrink:0;font-size:15px;height:32px;justify-content:center;width:32px}.fe-root .fe-slash-icon svg{height:18px;width:18px}.fe-root .fe-slash-label{font-size:13px;font-weight:500}.fe-root .fe-slash-desc{color:var(--fe-light-text);font-size:11px}.fe-root .fe-slash-empty{color:var(--fe-light-text);font-size:13px;padding:16px;text-align:center}.fe-root .fe-link-popover{align-items:center;background:#fff;border:1px solid var(--fe-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);display:none;gap:6px;padding:8px;position:absolute;width:320px;z-index:200}.fe-root .fe-link-popover.fe-open{display:flex}.fe-root .fe-link-input{border:1px solid var(--fe-border);border-radius:var(--fe-radius);flex:1;font-family:inherit;font-size:13px;outline:none;padding:6px 10px}.fe-root .fe-link-input:focus{border-color:var(--fe-blue)}.fe-root .fe-html-modal-overlay{align-items:center;background:rgba(0,0,0,.45);display:none;inset:0;justify-content:center;padding:24px;position:fixed;z-index:3000}.fe-root .fe-html-modal-overlay.fe-open{display:flex}.fe-root .fe-html-modal{background:#fff;border:1px solid var(--fe-border);border-radius:8px;box-shadow:0 20px 50px rgba(0,0,0,.35);display:grid;grid-template-rows:auto 1fr auto;max-height:min(80vh,760px);overflow:hidden;width:min(920px,100%)}.fe-root .fe-html-modal-header{align-items:center;border-bottom:1px solid #e7e7e7;display:flex;justify-content:space-between;padding:12px 14px}.fe-root .fe-html-modal-title{font-size:14px;font-weight:600;margin:0}.fe-root .fe-html-modal-textarea{border:none;font-family:SF Mono,Menlo,Monaco,Consolas,monospace;font-size:13px;line-height:1.6;min-height:260px;outline:none;padding:14px;resize:none;width:100%}.fe-root .fe-html-modal-actions{border-top:1px solid #e7e7e7;display:flex;gap:8px;justify-content:flex-end;padding:12px 14px}.fe-root .fe-status-bar{align-items:center;background:var(--fe-white);border-top:1px solid rgba(0,0,0,.06);bottom:0;box-shadow:0 -1px 3px rgba(0,0,0,.03);color:var(--fe-light-text);display:flex;font-size:12px;gap:16px;height:var(--fe-status-bar-height);left:0;padding:0 20px;position:fixed;right:0;z-index:998}.fe-root .fe-status-right{margin-left:auto}.fe-root .fe-toast{background:var(--fe-text);border-radius:8px;bottom:48px;box-shadow:var(--fe-shadow-md);color:#fff;font-size:13px;left:50%;opacity:0;padding:10px 20px;pointer-events:none;position:fixed;transform:translateX(-50%) translateY(20px);transition:all .3s ease;z-index:9999}.fe-root .fe-toast.fe-show{opacity:1;transform:translateX(-50%) translateY(0)}.fe-root .fe-drag-placeholder{background:var(--fe-blue);border-radius:2px;height:4px;margin:4px 0}.fe-root ::-webkit-scrollbar{width:6px}.fe-root ::-webkit-scrollbar-track{background:transparent}.fe-root ::-webkit-scrollbar-thumb{background:#c3c4c7;border-radius:3px}.fe-root ::-webkit-scrollbar-thumb:hover{background:#a0a0a0}.fe-root .fe-sr-only{clip:rect(0,0,0,0);border:0;height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.fe-root button:focus-visible,.fe-root input:focus-visible,.fe-root select:focus-visible,.fe-root textarea:focus-visible{outline:2px solid var(--fe-blue);outline-offset:2px}.fe-root [contenteditable]:focus,.fe-root [contenteditable]:focus-visible{outline:none}@media (max-width:900px){.fe-root .fe-editor-content{max-width:100%;padding:0 12px}.fe-root .fe-settings-panel{width:100%}.fe-root .fe-inserter-panel{width:min(94vw,360px)}}@media (max-width:768px){.fe-root .fe-block-toolbar button,.fe-root .fe-btn,.fe-root .fe-header button,.fe-root .fe-icon-btn{min-height:44px;min-width:44px;padding:8px}.fe-root .fe-block-toolbar{-webkit-overflow-scrolling:touch;flex-wrap:nowrap;gap:2px;overflow-x:auto;scrollbar-width:none}.fe-root .fe-block-toolbar::-webkit-scrollbar{display:none}.fe-root .fe-slash-menu{left:16px!important;max-width:none;width:calc(100vw - 32px)}.fe-root .fe-slash-menu-item{font-size:15px;padding:12px 16px}.fe-root .fe-inserter-panel{max-width:100vw;width:100%}.fe-root .fe-settings-panel{border-left:none;border-top:1px solid var(--fe-border);bottom:0;left:0;max-height:60vh;overflow-y:auto;position:fixed;right:0;top:auto;width:100%;z-index:100}.fe-root .fe-status-bar{font-size:11px;padding:4px 8px}.fe-root .fe-image-size-controls{flex-wrap:wrap;gap:4px}.fe-root .fe-img-size-btn{min-height:36px;min-width:44px}.fe-root .fe-block-table{-webkit-overflow-scrolling:touch;overflow-x:auto}.fe-root .fe-media-placeholder-actions{align-items:stretch;flex-direction:column}.fe-root .fe-media-url-input{width:100%}.fe-root .fe-editor-canvas{margin-right:0!important}.fe-root .fe-header-actions{gap:4px}}
@@ -1,4 +1,4 @@
1
- // Type definitions for @noseberry/nbd-editor
1
+ // Type definitions for @noseberry/nbd-editor v1.1.0
2
2
  // Noseberry Private Limited
3
3
 
4
4
  import * as React from 'react';
@@ -61,11 +61,22 @@ export interface NBDEditorOptions {
61
61
  onSave?: ((data: EditorData) => void) | null;
62
62
  /** Called when publish is triggered. */
63
63
  onPublish?: ((data: EditorData) => void) | null;
64
+ /** Enable HTML sanitization. Default: `true` */
65
+ sanitize?: boolean;
66
+ /** Custom DOMPurify configuration for sanitization. */
67
+ sanitizeConfig?: Record<string, any> | null;
64
68
  }
65
69
 
66
70
  /* ===== NBDEditor ===== */
67
71
 
68
72
  export class NBDEditor extends EventEmitter {
73
+ /** Plugin registry for managing block types and plugins. */
74
+ pluginRegistry: PluginRegistry;
75
+ /** Block manager (data model). */
76
+ blockManager: BlockManager;
77
+ /** Diff engine for change tracking. */
78
+ differ: Differ;
79
+
69
80
  constructor(selector: string | HTMLElement, options?: NBDEditorOptions);
70
81
 
71
82
  /** Get the full editor content. */
@@ -100,6 +111,43 @@ export class NBDEditor extends EventEmitter {
100
111
  toggleBlockHtmlMode(blockId?: string): void;
101
112
  /** Open the HTML editor modal for a block. */
102
113
  openBlockHtmlEditor(blockId?: string): void;
114
+
115
+ /* ── Plugin System ── */
116
+
117
+ /** Register a custom block type at runtime. */
118
+ registerBlockType(type: string, definition: BlockTypeDefinition & {
119
+ render?: ((block: Block, editor: NBDEditor) => HTMLElement) | null;
120
+ toHTML?: ((block: Block) => string) | null;
121
+ fromHTML?: ((html: string) => { type: string; content: string; attrs: Record<string, any> }) | null;
122
+ }): void;
123
+ /** Register a plugin (bundles block types + lifecycle hooks). */
124
+ registerPlugin(plugin: PluginDescriptor): PluginDescriptor;
125
+
126
+ /* ── Delta Format ── */
127
+
128
+ /** Export blocks as Delta format (structured ops). */
129
+ getDelta(): DeltaBlock[];
130
+ /** Import content from Delta format. */
131
+ setDelta(delta: DeltaBlock[]): void;
132
+
133
+ /* ── HTML Utilities ── */
134
+
135
+ /** Normalize HTML for consistent round-tripping. */
136
+ normalizeHTML(html: string): string;
137
+ /** Sanitize HTML (strips XSS vectors). */
138
+ sanitizeHTML(html: string): string;
139
+
140
+ /* ── Change Tracking ── */
141
+
142
+ /** Get accumulated block-level changes since last call. */
143
+ getChanges(): Patch[];
144
+
145
+ /* ── Collaborative Editing ── */
146
+
147
+ /** Connect to a collaborative editing server via WebSocket. */
148
+ connectCollaborative(wsUrl: string, options?: CollaborativeOptions): CollaborativeManager;
149
+ /** Disconnect from collaborative server. */
150
+ disconnectCollaborative(): void;
103
151
  }
104
152
 
105
153
  /* ===== ReactNBDEditor ===== */
@@ -111,6 +159,12 @@ export interface ReactNBDEditorProps extends NBDEditorOptions {
111
159
  style?: React.CSSProperties;
112
160
  /** Called once the editor instance is initialized. */
113
161
  onReady?: (editor: NBDEditor) => void;
162
+ /**
163
+ * Debounce delay in milliseconds for onChange events.
164
+ * Useful in controlled mode to reduce re-renders on every keystroke.
165
+ * Example: `debounceMs={300}` fires onChange at most every 300ms.
166
+ */
167
+ debounceMs?: number;
114
168
  }
115
169
 
116
170
  export interface ReactNBDEditorRef {
@@ -215,9 +269,102 @@ export interface BlockTypeDefinition {
215
269
  }
216
270
 
217
271
  export const BLOCK_TYPES: Record<string, BlockTypeDefinition>;
218
-
219
272
  export const CATEGORIES: Array<{ id: string; label: string }>;
220
-
221
273
  export function getBlocksByCategory(catId: string): Array<{ type: string } & BlockTypeDefinition>;
222
-
223
274
  export function searchBlocks(query: string): Array<{ type: string } & BlockTypeDefinition>;
275
+
276
+ /* ===== Plugin Registry ===== */
277
+
278
+ export interface PluginDescriptor {
279
+ name: string;
280
+ version?: string;
281
+ blocks?: Record<string, BlockTypeDefinition>;
282
+ init?: (editor: NBDEditor) => void;
283
+ destroy?: () => void;
284
+ }
285
+
286
+ export class PluginRegistry extends EventEmitter {
287
+ registerBlockType(type: string, definition: Record<string, any>): void;
288
+ unregisterBlockType(type: string): void;
289
+ getBlockType(type: string): BlockTypeDefinition | undefined;
290
+ getAllBlockTypes(): Record<string, BlockTypeDefinition>;
291
+ getBlocksByCategory(catId: string): Array<{ type: string } & BlockTypeDefinition>;
292
+ searchBlocks(query: string): Array<{ type: string } & BlockTypeDefinition>;
293
+ getCategories(): Array<{ id: string; label: string }>;
294
+ registerCategory(id: string, label?: string): void;
295
+ registerPlugin(plugin: PluginDescriptor): PluginDescriptor;
296
+ unregisterPlugin(name: string): void;
297
+ getPlugin(name: string): PluginDescriptor | null;
298
+ getPluginNames(): string[];
299
+ initPlugins(editor: NBDEditor): void;
300
+ destroyAll(): void;
301
+ }
302
+
303
+ /* ===== Delta Format ===== */
304
+
305
+ export interface DeltaOp {
306
+ insert: string | { type: string; src?: string; [key: string]: any };
307
+ attrs: Record<string, any>;
308
+ }
309
+
310
+ export interface DeltaBlock {
311
+ blockId: string;
312
+ blockType: string;
313
+ blockAttrs: Record<string, any>;
314
+ ops: DeltaOp[];
315
+ }
316
+
317
+ export function blocksToDelta(blocks: Block[]): DeltaBlock[];
318
+ export function deltaToBlocks(delta: DeltaBlock[]): Block[];
319
+ export function htmlToOps(html: string, blockType?: string): DeltaOp[];
320
+ export function opsToHTML(ops: DeltaOp[], blockType?: string): string;
321
+
322
+ /* ===== HTML Normalizer ===== */
323
+
324
+ export function normalizeHTML(html: string): string;
325
+ export function htmlEquals(a: string, b: string): boolean;
326
+
327
+ /* ===== Sanitizer ===== */
328
+
329
+ export function createSanitizer(config?: Record<string, any>): (html: string) => string;
330
+ export const sanitize: (html: string) => string;
331
+
332
+ /* ===== Differ (Change Tracking) ===== */
333
+
334
+ export interface Patch {
335
+ op: 'add' | 'remove' | 'update' | 'move';
336
+ id: string;
337
+ index?: number;
338
+ block?: Block;
339
+ changes?: Record<string, { from: any; to: any }>;
340
+ fromIndex?: number;
341
+ toIndex?: number;
342
+ }
343
+
344
+ export class Differ {
345
+ setBaseline(blocks: Block[]): void;
346
+ diff(currentBlocks: Block[]): Patch[];
347
+ getChanges(): Patch[];
348
+ hasChanges(): boolean;
349
+ reset(): void;
350
+ }
351
+
352
+ export function applyPatches(blocks: Block[], patches: Patch[]): Block[];
353
+
354
+ /* ===== Collaborative Manager ===== */
355
+
356
+ export interface CollaborativeOptions {
357
+ userId?: string;
358
+ token?: string;
359
+ debounceMs?: number;
360
+ reconnectMs?: number;
361
+ maxReconnectAttempts?: number;
362
+ }
363
+
364
+ export class CollaborativeManager extends EventEmitter {
365
+ constructor(editor: NBDEditor, wsUrl: string, options?: CollaborativeOptions);
366
+ connect(): CollaborativeManager;
367
+ disconnect(): void;
368
+ isConnected(): boolean;
369
+ requestSync(): void;
370
+ }