@noseberry/nbd-editor 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -10
- package/dist/nbd-editor.cjs.js +1 -1
- package/dist/nbd-editor.cjs.js.map +1 -1
- package/dist/nbd-editor.css +1 -1
- package/dist/nbd-editor.d.ts +151 -4
- package/dist/nbd-editor.esm.js +1 -1
- package/dist/nbd-editor.esm.js.map +1 -1
- package/dist/nbd-editor.umd.js +1 -1
- package/dist/nbd-editor.umd.js.map +1 -1
- package/package.json +10 -3
package/dist/nbd-editor.css
CHANGED
|
@@ -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-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}}
|
package/dist/nbd-editor.d.ts
CHANGED
|
@@ -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
|
+
}
|