domma-cms 0.36.0 → 0.36.2

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.
Files changed (65) hide show
  1. package/admin/css/admin.css +1 -1
  2. package/admin/css/dashboard.css +1 -1
  3. package/admin/js/lib/card-builder.js +2 -2
  4. package/admin/js/lib/crud-tutorial.js +1 -1
  5. package/admin/js/lib/effects-builder.js +2 -2
  6. package/admin/js/lib/embed-builder.js +1 -1
  7. package/admin/js/lib/markdown-toolbar.js +15 -15
  8. package/admin/js/lib/project-quick-create.js +2 -2
  9. package/admin/js/lib/scribe-composer.js +3 -3
  10. package/admin/js/lib/shortcode-context-menu.js +6 -6
  11. package/admin/js/lib/shortcode-modal.js +1 -1
  12. package/admin/js/lib/shortcode-registry.js +1 -1
  13. package/admin/js/lib/shortcode-tags.js +1 -1
  14. package/admin/js/lib/sidebar-renderer.js +2 -2
  15. package/admin/js/lib/timeline-builder.js +2 -2
  16. package/admin/js/templates/api-endpoint-editor.html +2 -2
  17. package/admin/js/templates/block-editor.html +1 -1
  18. package/admin/js/templates/component-editor.html +4 -4
  19. package/admin/js/templates/docs/api-actions.html +11 -11
  20. package/admin/js/templates/docs/api-authentication.html +11 -11
  21. package/admin/js/templates/docs/api-collections.html +11 -11
  22. package/admin/js/templates/docs/api-layouts.html +11 -11
  23. package/admin/js/templates/docs/api-media.html +11 -11
  24. package/admin/js/templates/docs/api-navigation.html +11 -11
  25. package/admin/js/templates/docs/api-pages.html +11 -11
  26. package/admin/js/templates/docs/api-plugins.html +11 -11
  27. package/admin/js/templates/docs/api-settings.html +11 -11
  28. package/admin/js/templates/docs/api-users.html +11 -11
  29. package/admin/js/templates/docs/api-views.html +11 -11
  30. package/admin/js/templates/effects.html +752 -752
  31. package/admin/js/templates/form-editor.html +4 -4
  32. package/admin/js/templates/form-submissions.html +1 -1
  33. package/admin/js/templates/forms.html +17 -17
  34. package/admin/js/templates/my-profile.html +17 -17
  35. package/admin/js/templates/navigation.html +3 -3
  36. package/admin/js/templates/notifications.html +1 -1
  37. package/admin/js/templates/page-editor.html +3 -3
  38. package/admin/js/templates/project-detail.html +19 -19
  39. package/admin/js/templates/role-editor.html +70 -70
  40. package/admin/js/templates/roles.html +10 -10
  41. package/admin/js/templates/settings.html +6 -6
  42. package/admin/js/views/action-editor.js +1 -1
  43. package/admin/js/views/api-endpoint-editor.js +3 -3
  44. package/admin/js/views/collection-editor.js +2 -2
  45. package/admin/js/views/collection-entries.js +1 -1
  46. package/admin/js/views/component-editor.js +3 -3
  47. package/admin/js/views/form-editor.js +3 -3
  48. package/admin/js/views/form-submissions.js +1 -1
  49. package/admin/js/views/page-editor.js +4 -4
  50. package/admin/js/views/project-detail.js +1 -1
  51. package/admin/js/views/settings.js +2 -2
  52. package/bin/lib/config-merge.js +44 -44
  53. package/package.json +1 -1
  54. package/public/css/forms.css +1 -1
  55. package/public/css/site.css +1 -1
  56. package/public/js/menu-decor.mjs +1 -1
  57. package/public/js/site.js +1 -1
  58. package/server/middleware/auth.js +253 -253
  59. package/server/routes/api/auth.js +309 -309
  60. package/server/routes/api/navigation.js +42 -42
  61. package/server/routes/api/settings.js +141 -141
  62. package/server/services/email.js +167 -167
  63. package/server/services/userProfiles.js +199 -199
  64. package/server/services/users.js +302 -302
  65. package/config/connections.json.bak +0 -9
@@ -1 +1 @@
1
- .dashboard-layout{display:flex;flex-direction:column;min-height:100vh}.dashboard-wrapper{display:flex;flex:1;min-height:0}.dashboard-main{flex:1;min-width:0;overflow-y:auto}.view-container{padding:1.5rem 2rem;max-width:1200px}.view-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;gap:1rem}.view-header h1{font-size:1.5rem;font-weight:700;margin:0;display:flex;align-items:center;gap:.5rem}.view-header-actions{display:flex;gap:.5rem}.stat-card .card-body{display:flex;align-items:center;gap:1rem}.stat-icon{width:44px;height:44px;border-radius:8px;background:var(--primary-alpha, rgba(91,140,255,.15));color:var(--primary, #5b8cff);display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.stat-icon--success{background:#34d39926;color:#34d399}.stat-icon--warning{background:#fbbf2426;color:#fbbf24}.stat-value{font-size:1.75rem;font-weight:700;line-height:1}.stat-label{font-size:.8rem;color:var(--text-muted, #888);margin-top:.25rem}.toolbar{display:flex;align-items:center;gap:.75rem}.form-check-label{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.9rem}.form-hint{display:block;font-size:.8rem;color:var(--text-muted, #888);margin-top:.25rem}.dashboard-main:has(#editor-meta-tabs){overflow:hidden}.view-container:has(#editor-meta-tabs){display:flex;flex-direction:column;height:calc(100dvh - 60px);max-width:100%;padding-bottom:0}.view-container:has(#block-editor-body){max-width:100%}.view-container:has(#ep-editor-tabs){max-width:100%}.ep-editor-grid{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr) minmax(0,1.3fr);gap:1rem;align-items:start}.ep-editor-grid>.ep-tryit-col,.ep-editor-grid>.ep-results-col{position:sticky;top:1rem;display:flex;flex-direction:column;gap:1rem;min-width:0}@media(max-width:1500px){.ep-editor-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.ep-editor-grid>:first-child{grid-column:1 / -1}.ep-editor-grid>.ep-tryit-col,.ep-editor-grid>.ep-results-col{position:static}}@media(max-width:1024px){.ep-editor-grid{grid-template-columns:minmax(0,1fr)}}#editor-meta-tabs{flex:1;min-height:0;display:flex;flex-direction:column}#editor-meta-tabs .tab-content{flex:1;min-height:0;overflow:hidden}#editor-meta-tabs .tab-panel{height:100%;overflow-y:auto}#editor-meta-tabs .tab-panel:has(.editor-card),#live-preview-panel{overflow:hidden}.page-live-preview-frame{display:block;width:100%;height:calc(100vh - 180px);border:none;border-radius:6px}.editor-card{display:flex;flex-direction:column;height:100%}.editor-card .card-body{display:flex;flex-direction:column;flex:1;min-height:0;padding:0!important}.editor-toolbar{display:flex;align-items:center;gap:2px;padding:6px 10px;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08));flex-wrap:wrap;flex-shrink:0}.editor-toolbar-btn{background:none;border:none;color:var(--text-muted, #888);padding:6px 8px;border-radius:4px;cursor:pointer;display:flex;align-items:center;transition:color .15s,background .15s}.editor-toolbar-btn:hover{color:var(--text, #eee);background:#ffffff14}.editor-toolbar-sep{width:1px;height:20px;background:var(--border-color, rgba(255, 255, 255, .08));margin:0 4px;flex-shrink:0}.editor-toolbar-right{margin-left:auto;display:flex;align-items:center;gap:2px}.editor-view-btn{background:none;border:none;color:var(--text-muted, #888);padding:6px 8px;border-radius:4px;cursor:pointer;display:flex;align-items:center;transition:color .15s,background .15s}.editor-view-btn:hover{color:var(--text, #eee);background:#ffffff14}.editor-view-btn.active{color:var(--primary, #5b8cff);background:var(--primary-alpha, rgba(91, 140, 255, .12))}.editor-body{display:flex;flex:1;min-height:0}.editor-pane{flex:1;display:flex;flex-direction:column;min-width:0}.editor-pane--write,.editor-pane--preview{overflow:hidden}.editor-pane--write{flex-direction:row}.editor-line-numbers{padding:1rem .6rem 1rem .75rem;background:var(--dm-background-alt, rgba(0, 0, 0, .15));border-right:1px solid var(--border-color, rgba(255, 255, 255, .08));color:var(--dm-text-muted, #666);font-family:Fira Code,Courier New,monospace;font-size:.9rem;line-height:1.6;text-align:right;user-select:none;white-space:pre;overflow:hidden;flex-shrink:0;min-width:2.5rem}.editor-line-numbers--foldable{padding:1rem 0;min-width:3rem;white-space:normal;text-align:left;display:flex;flex-direction:column}.editor-line-number-row{display:flex;align-items:center;justify-content:flex-end;padding-right:.6rem;gap:.15rem}.fold-toggle{display:inline-flex;align-items:center;justify-content:center;width:1em;font-size:.6rem;cursor:default;color:transparent}.fold-toggle--open,.fold-toggle--folded{cursor:pointer;color:var(--dm-text-muted, #666);transition:color .1s}.fold-toggle--open:hover,.fold-toggle--folded:hover{color:var(--dm-accent, #4a9eff)}.editor-line-num{min-width:1.5rem;text-align:right}.editor-mode-write .editor-pane--preview,.editor-mode-write .editor-divider,.editor-mode-preview .editor-pane--write,.editor-mode-preview .editor-divider{display:none}.editor-divider{width:1px;background:var(--border-color, rgba(255,255,255,.08));flex-shrink:0}.editor-textarea{flex:1;resize:none;border:none;border-radius:0;background:transparent;font-family:Fira Code,Courier New,monospace;font-size:.9rem;padding:1rem;outline:none;color:inherit;line-height:1.6}.editor-preview{flex:1;padding:1rem;overflow-y:auto;line-height:1.7}.editor-preview h1,.editor-preview h2,.editor-preview h3{margin-top:1.5rem}.editor-preview p{margin-bottom:.75rem}.editor-preview code{background:#ffffff0f;padding:.1em .3em;border-radius:3px;font-size:.9em}.editor-fullscreen{position:fixed;inset:0;z-index:1000;border-radius:0;margin:0}.editor-fullscreen .card-body{height:100vh}.media-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.75rem;max-height:400px;overflow-y:auto;padding:.25rem}.media-picker-item{cursor:pointer;border:2px solid transparent;border-radius:6px;overflow:hidden;transition:border-color .15s}.media-picker-item:hover{border-color:var(--primary, #5b8cff)}.media-picker-item img{width:100%;height:80px;object-fit:cover;display:block}.media-picker-item span{display:block;font-size:.75rem;padding:4px 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-body h3{margin-top:1.25rem;margin-bottom:.5rem}.docs-body p{margin-bottom:.5rem;line-height:1.6}.docs-body ol,.docs-body ul{margin-bottom:.75rem;padding-left:1.25rem}.docs-body li{margin-bottom:.25rem}.docs-body hr{margin:1.25rem 0;border-color:var(--border-color, rgba(255, 255, 255, .08))}.docs-body .table{margin-bottom:.75rem}.nav-items-header,.nav-item-row{display:flex;gap:.5rem;align-items:center;padding:.35rem .75rem}.nav-items-header{border-bottom:1px solid var(--border-color, rgba(255,255,255,.08));padding-bottom:.4rem;margin-bottom:.25rem}.nav-item-row{border-bottom:1px solid var(--border-color, rgba(255,255,255,.04))}.nav-item-row:last-child{border-bottom:none}.nav-col-indent{width:18px;flex-shrink:0;color:var(--text-muted, #888);text-align:center;font-size:.85rem}.nav-col-main{flex:2;min-width:0}.nav-col-icon{flex:0 0 90px}.nav-col-parent{flex:2;min-width:0}.nav-col-action{flex-shrink:0}.nav-item-row--child{background:#ffffff05}.nav-col-action{display:flex;align-items:center;gap:.25rem}.nav-item-row--hidden{opacity:.45}.nav-item-row--hidden .item-text,.nav-item-row--hidden .footer-link-text{text-decoration:line-through}.btn-toggle-hidden{color:var(--text-muted, #888)}.btn-toggle-hidden.active{color:var(--color-warning, #f59e0b)}.fb-field-card.fb-drag-over{outline:2px dashed var(--primary, #6366f1);outline-offset:-2px}.toggle-label{display:flex;align-items:center;gap:.4rem;font-size:.9rem;cursor:pointer;margin-right:1rem}.preset-toggles{display:flex;flex-wrap:wrap;margin-top:.75rem}.presets-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}@media(max-width:900px){.presets-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:600px){.presets-grid{grid-template-columns:1fr}}.card-header{padding:.5rem 1rem}.card-header h2{margin:0;font-size:.9rem;font-weight:600;letter-spacing:.02em}.preset-card .card-header{display:flex;align-items:center;justify-content:space-between}.preset-card .card-header h3{margin:0;font-size:1rem}.media-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:1rem}.media-card{background:var(--card-bg, rgba(255,255,255,.04));border:1px solid var(--border-color, rgba(255,255,255,.08));border-radius:8px;overflow:hidden}.media-preview{height:130px;display:flex;align-items:center;justify-content:center;background:#0003;overflow:hidden}.media-thumb{width:100%;height:100%;object-fit:cover}.media-thumb--file{font-size:2rem;color:var(--text-muted, #888)}.media-info{padding:.5rem .75rem;display:flex;flex-direction:column;gap:.15rem}.media-name{font-size:.8rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:default}.media-rename-input{width:100%;font-size:.8rem;font-weight:500;padding:.1rem .25rem;border:1px solid var(--primary, #7c6af7);border-radius:3px;background:var(--input-bg, transparent);color:inherit;outline:none}.media-size{font-size:.75rem;color:var(--text-muted, #888)}.media-actions{padding:.5rem .75rem;display:flex;gap:.4rem;border-top:1px solid var(--border-color, rgba(255,255,255,.08))}#admin-topbar{height:60px;display:flex;align-items:center;gap:1rem;padding:0 1.25rem;background:var(--navbar-bg, rgba(0,0,0,.3));border-bottom:1px solid var(--border-color, rgba(255,255,255,.08));position:sticky;top:0;z-index:200;flex-shrink:0}.topbar-brand{display:flex;align-items:center;gap:.5rem;font-weight:700;font-size:.95rem;color:inherit;flex-shrink:0;margin-right:.5rem}.topbar-brand span[data-icon],.topbar-brand svg{color:var(--primary, #5b8cff);width:22px;height:22px}.topbar-brand-text{opacity:.85}.topbar-brand-logo{height:28px;width:auto;display:inline-block;vertical-align:middle;margin-right:.4em;object-fit:contain}.topbar-user{display:flex;align-items:center;gap:.6rem;flex:1}.topbar-user-name{font-size:.875rem;font-weight:500}.topbar-role-badge{font-size:.7rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:.15rem .45rem;border-radius:4px}.topbar-role-badge--admin{background:#5b8cff26;color:#5b8cff}.topbar-role-badge--manager{background:#34d39926;color:#34d399}.topbar-role-badge--editor{background:#fbbf2426;color:#fbbf24}.topbar-role-badge--subscriber{background:#94a3b826;color:#94a3b8}.topbar-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.topbar-action-link{display:flex;align-items:center;gap:.35rem;font-size:.875rem;color:var(--text-muted, #888);text-decoration:none;padding:.4rem .65rem;border-radius:6px;transition:color .15s,background .15s}.topbar-action-link:hover{color:var(--text, #eee);background:#ffffff0f}.topbar-action-link span[data-icon],.topbar-action-link svg{width:16px;height:16px}.topbar-signout{display:flex;align-items:center;gap:.35rem;font-size:.875rem}.topbar-signout span[data-icon],.topbar-signout svg{width:16px;height:16px}.login-wrap{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:1rem;background:var(--body-bg, #0f1117);z-index:100;overflow-y:auto}.login-card{width:100%;max-width:460px}.ob-done-icon{font-size:3rem;color:#34d399;margin-bottom:1rem;text-align:center}.btn-skip{display:block;text-align:center;margin-top:.75rem;font-size:.85rem;color:var(--text-muted, #888);text-decoration:none}.btn-skip:hover{text-decoration:underline}.theme-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem}.theme-swatch{border:2px solid var(--border-color, rgba(255,255,255,.1));border-radius:8px;overflow:hidden;cursor:pointer;transition:border-color .15s,transform .1s}.theme-swatch:hover{border-color:var(--primary, #5b8cff);transform:translateY(-1px)}.theme-swatch.selected{border-color:var(--primary, #5b8cff);box-shadow:0 0 0 2px var(--primary, #5b8cff)}.theme-swatch-preview{height:52px;position:relative;display:flex;align-items:flex-end;padding:.35rem}.theme-swatch-accent{width:28px;height:6px;border-radius:3px}.theme-swatch-label{display:flex;justify-content:space-between;align-items:center;padding:.3rem .45rem;font-size:.7rem;background:var(--card-bg, rgba(255,255,255,.04))}.theme-swatch-mode{color:var(--text-muted, #888);font-size:.65rem}.login-logo{display:flex;align-items:center;gap:.75rem;margin-bottom:1.75rem;font-size:1.5rem}.login-logo span[data-icon]{font-size:2rem;color:var(--primary, #5b8cff)}.login-logo h1{margin:0;font-size:1.5rem;font-weight:700}.login-heading{font-size:1.1rem;font-weight:600;margin-bottom:1.25rem}.btn-block{width:100%}.plugins-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1rem}.plugin-card{display:flex;flex-direction:column}.plugin-card .card-body{flex:1}.plugin-header{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:.75rem}.plugin-icon{width:40px;height:40px;border-radius:8px;background:var(--primary-alpha, rgba(91,140,255,.15));color:var(--primary, #5b8cff);display:flex;align-items:center;justify-content:center;flex-shrink:0}.plugin-meta{flex:1;min-width:0}.plugin-name{font-weight:600;margin-bottom:.15rem}.plugin-version{font-size:.75rem;color:var(--text-muted, #888)}.plugin-desc{font-size:.875rem;color:var(--text-muted, #888);margin-bottom:1rem}.plugin-footer{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-top:1px solid var(--border-color, rgba(255,255,255,.08))}.plugin-footer-actions{display:flex;align-items:center;gap:.5rem}#admin-sidebar .sidebar-link{position:relative!important}#admin-sidebar .sidebar-badge{position:absolute!important;right:.75rem!important;top:50%!important;transform:translateY(-50%)!important;margin-left:0!important;padding-left:.45rem!important;padding-right:.45rem!important}#admin-sidebar .sidebar-text{padding-right:2rem!important}#admin-sidebar.sidebar-dark{background:var(--dm-surface);border-color:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-header{background:var(--dm-surface-raised);border-color:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-header-title{color:var(--dm-text)}#admin-sidebar.sidebar-dark .sidebar-link{color:var(--dm-text-muted)}#admin-sidebar.sidebar-dark .sidebar-link:hover{color:var(--dm-text);background:var(--dm-surface-overlay)}#admin-sidebar.sidebar-dark .sidebar-link.active{color:var(--dm-primary);background:var(--dm-primary-alpha, rgba(91,140,255,.12));border-left-color:var(--dm-primary)}#admin-sidebar.sidebar-dark .sidebar-heading{color:var(--dm-text-muted)}#admin-sidebar.sidebar-dark .sidebar-divider{background:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-footer{background:var(--dm-surface-raised);border-color:var(--dm-border)}.sidebar-heading--collapsible{display:flex!important;align-items:center;justify-content:space-between;cursor:pointer;user-select:none}.sidebar-heading-toggle{display:flex;align-items:center;opacity:.5;flex-shrink:0;transition:transform .2s ease}.sidebar-heading--collapsible.is-collapsed .sidebar-heading-toggle{transform:rotate(-90deg)}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.p-0{padding:0!important}.text-muted{color:var(--text-muted, #888)}@media(max-width:768px){.view-container{padding:1rem}.editor-body{flex-direction:column}.editor-divider{width:auto;height:1px}}.image-editor{display:flex;flex-direction:column;gap:0}.image-editor-toolbar{display:flex;flex-direction:row;align-items:center;gap:.25rem;padding:.5rem .75rem;border-bottom:1px solid var(--border, rgba(255, 255, 255, .1))}.image-editor-sep{display:inline-block;width:1px;height:1.5rem;background:var(--border, rgba(255, 255, 255, .15));margin:0 .25rem;flex-shrink:0}.editor-toolbar-btn.active{color:var(--primary, #7c6af7);background:color-mix(in srgb,var(--primary, #7c6af7) 15%,transparent)}.editor-toolbar-caret{font-size:.6rem;line-height:1;margin-left:2px;opacity:.6}.editor-toolbar-dropdown{position:absolute;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--border-color, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:4px;min-width:160px}.editor-toolbar-dropdown-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:none;color:var(--dm-text, #ddd);padding:7px 10px;border-radius:5px;cursor:pointer;font-size:.85rem;transition:background .12s,color .12s}.editor-toolbar-dropdown-item:hover{background:#ffffff14;color:var(--dm-text-bright, #fff)}.editor-toolbar-dropdown-item span[data-icon],.editor-toolbar-dropdown-item svg{width:15px;height:15px;flex-shrink:0;opacity:.75}.editor-toolbar{position:relative}.editor-effects-dropdown-menu{position:absolute;top:100%;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--border-color, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:6px;min-width:180px;max-height:340px;overflow-y:auto}.editor-effects-category{padding:6px 8px 3px;font-size:.7rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--dm-text-muted, #888)}.editor-effects-item{display:block;width:100%;text-align:left;background:none;border:none;color:var(--dm-text, #ddd);padding:6px 10px;border-radius:5px;cursor:pointer;font-size:.85rem;transition:background .12s,color .12s}.editor-effects-item:hover{background:#ffffff14;color:var(--dm-text-bright, #fff)}.editor-icon-picker{position:absolute;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--border-color, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:8px;width:320px}.editor-icon-picker-search{width:100%;margin-bottom:8px;font-size:.8rem}.editor-spacer-picker{position:absolute;z-index:9999;background:var(--dm-surface, #1e1e2e);border:1px solid var(--dm-border, #333);border-radius:8px;padding:12px;width:240px;box-shadow:0 8px 24px #00000073}.editor-spacer-picker-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--dm-text-muted, #888);margin-bottom:10px}.editor-spacer-picker-row{display:flex;align-items:center;gap:10px;margin-bottom:12px}.editor-spacer-slider{flex:1;accent-color:var(--primary, #6366f1);cursor:pointer}.editor-spacer-slider-value{font-size:13px;font-weight:600;min-width:38px;text-align:right;color:var(--dm-text, #cdd6f4)}.editor-spacer-insert-btn{width:100%}.editor-icon-picker-size-row{display:flex;align-items:center;gap:8px;padding:0 8px 8px}.editor-icon-picker-size-row label{font-size:11px;color:var(--dm-text-muted, #888);white-space:nowrap}.editor-icon-picker-size{width:70px;font-size:12px;padding:3px 6px}.editor-icon-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:2px;max-height:280px;overflow-y:auto}.editor-icon-picker-item{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:6px 2px;border-radius:5px;cursor:pointer;background:none;border:none;color:var(--dm-text, #ddd);font-size:.58rem;text-align:center;gap:4px;overflow:hidden;transition:background .12s,color .12s}.editor-icon-picker-item:hover{background:#ffffff14;color:var(--dm-text-bright, #fff)}.editor-icon-picker-item span[data-icon],.editor-icon-picker-item svg{width:16px;height:16px;flex-shrink:0}.editor-icon-picker-item>span:last-child{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.editor-icon-picker-empty{grid-column:1 / -1;text-align:center;color:var(--dm-text-muted, #888);font-size:.8rem;padding:1.5rem}.image-editor-canvas{min-height:320px;max-height:520px;background:#111;overflow:hidden;display:flex;align-items:center;justify-content:center}.image-editor-canvas img{display:block;max-width:100%;max-height:520px}.image-editor-resize{display:flex;flex-direction:row;align-items:center;gap:.5rem;padding:.6rem .75rem;border-top:1px solid var(--border, rgba(255, 255, 255, .1));font-size:.85rem}.image-editor-resize label{font-weight:600;color:var(--text-muted, #888);font-size:.8rem}.image-editor-resize .form-input{width:5rem;padding:.25rem .5rem;font-size:.85rem}.image-editor-footer{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:.75rem;border-top:1px solid var(--border, rgba(255, 255, 255, .1));gap:.5rem}.image-editor-effects{border-top:1px solid var(--border, rgba(255, 255, 255, .1))}.image-editor-tab-bar{display:flex;flex-direction:row;overflow-x:auto;border-bottom:1px solid var(--border, rgba(255, 255, 255, .1));scrollbar-width:none}.image-editor-tab-bar::-webkit-scrollbar{display:none}.image-editor-tab-btn{display:inline-flex;align-items:center;gap:.35rem;padding:.5rem .85rem;font-size:.8rem;font-weight:500;border:none;border-bottom:2px solid transparent;background:transparent;cursor:pointer;color:var(--text-muted, #888);white-space:nowrap;transition:color .15s,border-color .15s;flex-shrink:0}.image-editor-tab-btn:hover{color:var(--text, #eee)}.image-editor-tab-btn.active{color:var(--primary, #7c6af7);border-bottom-color:var(--primary, #7c6af7)}.image-editor-tab-panel{padding:.75rem;max-height:200px;overflow-y:auto}.ie-presets-grid{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:.5rem}.ie-preset-btn.active{color:var(--primary, #7c6af7);background:color-mix(in srgb,var(--primary, #7c6af7) 15%,transparent);border-color:var(--primary, #7c6af7)}.ie-server-note{font-size:.73rem;color:var(--text-muted, #888);font-style:italic;margin:.25rem 0 0;line-height:1.4}.ie-slider-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.ie-slider-label{width:6rem;font-size:.8rem;color:var(--text-muted, #888);font-weight:600;flex-shrink:0}.ie-slider{flex:1;accent-color:var(--primary, #7c6af7);cursor:pointer}.ie-slider-val{width:3rem;font-size:.8rem;text-align:right;color:var(--text, #eee);flex-shrink:0}.ie-select{flex:1;font-size:.85rem;padding:.25rem .5rem}.ie-colour-input{width:40px;height:28px;padding:0;border:1px solid var(--border, rgba(255, 255, 255, .15));border-radius:4px;cursor:pointer;background:transparent;flex-shrink:0}.ie-wm-preview-row{display:flex;align-items:center;gap:.5rem;margin:.4rem 0}.ie-wm-preview-img{width:48px;height:48px;object-fit:contain;border-radius:4px;background:var(--surface-2, rgba(255, 255, 255, .06));flex-shrink:0}.ie-wm-preview-name{font-size:.8rem;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text, #eee)}.ie-media-picker{padding:.25rem 0}.ie-media-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:.5rem;max-height:300px;overflow-y:auto}.ie-media-thumb{display:flex;flex-direction:column;align-items:center;gap:.25rem;padding:.4rem;border-radius:6px;cursor:pointer;border:2px solid transparent;transition:border-color .15s,background .15s}.ie-media-thumb:hover{background:var(--surface-2, rgba(255, 255, 255, .08));border-color:var(--primary, #7c6af7)}.ie-media-thumb img{width:72px;height:72px;object-fit:cover;border-radius:4px}.ie-media-thumb-name{font-size:.7rem;color:var(--text-muted, #888);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:72px}.dm-slideover-left,.dm-slideover-right{width:min(40rem,95vw)!important;min-width:min(36rem,100vw)!important;max-width:100vw!important}.dm-slideover-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid var(--dm-border, #333);flex-shrink:0}.dm-slideover-title{margin:0;font-size:1rem;font-weight:600}.dm-slideover-close{padding:.2rem .35rem!important;line-height:1;font-size:.75rem}.dm-slideover-body{flex:1;overflow-y:auto;min-height:0;padding:1.5rem!important;box-sizing:border-box}.dm-slideover>div:not(.dm-slideover-header):not(.dm-slideover-body):not(.dm-slideover-close){padding:1.5rem!important;box-sizing:border-box}.dm-slideover-body>div{padding-left:0!important;padding-right:0!important}.dm-slideover-body>button.btn:last-child{margin-top:.5rem}.dconfig-textarea{font-family:monospace;min-height:100px;resize:vertical}.dm-editor-line-numbers{white-space:pre}.dm-code-inline{font-family:Fira Code,Courier New,monospace;font-size:.82em;padding:.15em .35em;border-radius:3px;background:var(--dm-surface-subtle, rgba(0, 0, 0, .18));color:var(--dm-text, inherit);border:1px solid var(--dm-border, rgba(255, 255, 255, .08))}.dm-code-block{font-family:Fira Code,Courier New,monospace;font-size:.82rem;line-height:1.6;padding:.65rem .9rem;border-radius:6px;background:var(--dm-surface-subtle, rgba(0, 0, 0, .18));color:var(--dm-text, inherit);border:1px solid var(--dm-border, rgba(255, 255, 255, .08));white-space:pre;overflow-x:auto;display:block;margin:.4rem 0}.tabs-centered{text-align:center}.tabs-centered .tab-list{display:inline-flex}.tabs-centered .tab-content{text-align:left}@media(max-width:768px){.view-header{flex-direction:column;align-items:flex-start}.theme-grid{grid-template-columns:repeat(2,1fr)}.nav-item-row{flex-wrap:wrap}.nav-col-icon,.nav-col-parent{display:none}#admin-topbar{padding:0 .75rem}.topbar-brand-text{display:none}.image-editor-toolbar{flex-wrap:wrap}}#topbar-bell{position:relative}.topbar-bell-badge{position:absolute;top:2px;right:2px;min-width:16px;height:16px;padding:0 4px;background:var(--dm-color-danger, #dc2626);color:#fff;font-size:10px;font-weight:700;line-height:16px;border-radius:9999px;text-align:center;pointer-events:none}.cb-scaffolder{padding:1rem 1.1rem;background:var(--dm-surface-subtle);border:1px solid var(--dm-accent);border-radius:8px;color:var(--dm-text)}.cb-scaffolder-head{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.cb-scaffolder-head .cb-icon{flex-shrink:0;color:var(--dm-accent)}.cb-scaffolder-head h2{margin:0;font-size:1.05rem;font-weight:700;color:var(--dm-text)}.cb-scaffolder-blurb{margin:0 0 .75rem;font-size:.88rem;line-height:1.5;color:var(--dm-text-muted)}.cb-recipe-list{display:flex;flex-direction:column;gap:.5rem}.cb-recipe-card{display:flex;align-items:flex-start;gap:.75rem;text-align:left;padding:.75rem 1rem;background:var(--dm-surface);border:1px solid var(--dm-border);border-radius:6px;cursor:pointer;transition:border-color .12s;width:100%;color:var(--dm-text)}.cb-recipe-card:hover{border-color:var(--dm-accent)}.cb-recipe-card .cb-icon{flex-shrink:0;font-size:1.5rem;color:var(--dm-accent);margin-top:.1rem}.cb-recipe-meta{flex:1}.cb-recipe-name{font-weight:600;margin-bottom:.15rem;font-size:.95rem;color:var(--dm-text)}.cb-recipe-desc{font-size:.83rem;line-height:1.45;color:var(--dm-text-muted)}.cb-apply-panel{padding:1rem 1.1rem;background:var(--dm-surface);border:1px solid var(--dm-accent);border-radius:8px;color:var(--dm-text)}.cb-apply-head{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.cb-apply-head .cb-icon{color:var(--dm-accent);font-size:1.4rem}.cb-apply-head h3{margin:0;font-size:1rem;font-weight:600;color:var(--dm-text)}.cb-apply-desc,.cb-apply-hint{margin:.25rem 0 .75rem;font-size:.85rem;line-height:1.5;color:var(--dm-text-muted)}.cb-apply-hint{font-size:.75rem;margin-top:.2rem}.cb-apply-field{margin-bottom:.6rem}.cb-apply-field label{display:block;font-size:.82rem;font-weight:600;margin-bottom:.2rem;color:var(--dm-text)}.cb-apply-field input{width:100%;padding:.4rem .55rem;border:1px solid var(--dm-border);border-radius:4px;font-size:.88rem;background:var(--dm-surface);color:var(--dm-text)}.cb-apply-status{margin:.5rem 0;font-size:.85rem;min-height:1.2rem;color:var(--dm-text)}.cb-apply-status.cb-error{color:var(--dm-danger, #dc2626)}.cb-apply-buttons{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.cb-success-panel{padding:1rem 1.1rem;background:var(--dm-surface);border:1px solid var(--dm-success, #16a34a);border-radius:8px;color:var(--dm-text)}.cb-success-panel .cb-icon{color:var(--dm-success, #16a34a);font-size:1.4rem}.cb-success-summary{margin:.25rem 0 .5rem;padding-left:1.2rem;font-size:.86rem;line-height:1.6;color:var(--dm-text)}.cb-success-warning{margin:.5rem 0;padding:.5rem .75rem;background:var(--dm-surface-subtle);border-left:3px solid var(--dm-warning, #eab308);border-radius:0 4px 4px 0;font-size:.82rem;color:var(--dm-text-muted)}.cb-success-snippet-label{margin:0 0 .25rem;font-size:.82rem;font-weight:600;color:var(--dm-text)}.cb-success-actions{display:flex;gap:.5rem;margin-top:.5rem;flex-wrap:wrap}.cb-code{position:relative}.cb-code pre{background:var(--dm-surface-subtle);color:var(--dm-text);display:block;padding:.6rem 2.4rem .6rem .75rem;white-space:pre;overflow-x:auto;margin:0;border-radius:6px;font-size:.82em;font-family:monospace;line-height:1.45}.cb-code .cb-copy{position:absolute;top:.35rem;right:.35rem;background:none;border:none;cursor:pointer;opacity:.45;padding:.2rem;line-height:1;color:var(--dm-text)}.cb-code .cb-copy:hover{opacity:1}.cb-intro{padding:.75rem 1rem;border-left:3px solid var(--dm-accent);background:var(--dm-surface-subtle);border-radius:0 6px 6px 0}.cb-intro p{margin:0;font-size:.92rem;line-height:1.5;color:var(--dm-text)}.cb-tutorial-link{display:flex;align-items:center;gap:.6rem;padding:.65rem .85rem;border:1px solid var(--dm-border);border-radius:6px;text-decoration:none;color:var(--dm-text);font-size:.88rem;transition:border-color .12s}.cb-tutorial-link:hover{border-color:var(--dm-accent)}.cb-tutorial-link .cb-icon{flex-shrink:0;color:var(--dm-accent)}.cb-tutorial-link .cb-arrow{color:var(--dm-text-muted);font-size:1.1rem;margin-left:auto}.menu-tree-row{display:grid;grid-template-columns:16px 1.4fr 1.4fr .9fr .7fr .9fr repeat(6,auto);gap:6px;align-items:center;padding:4px 0;transition:opacity .15s ease}.menu-tree-row--hidden{opacity:.5}.menu-tree-grip{cursor:grab;color:var(--dm-text-muted)}.menu-tree{padding:8px 0}.menu-tree-row--separator{display:grid;grid-template-columns:16px minmax(80px,1fr) repeat(7,auto);gap:6px;align-items:center;padding:2px 0;opacity:.85}.menu-tree-row--separator:hover{opacity:1}.menu-tree-row--separator .me-sep-line{display:flex;align-items:center;gap:10px;width:100%}.menu-tree-row--separator .me-sep-line:before,.menu-tree-row--separator .me-sep-line:after{content:"";flex:1;border-top:1px dashed var(--dm-border, rgba(128, 128, 128, .55))}.menu-tree-row--separator .me-sep-label{font-size:.66rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--dm-text-muted, #8a8a8a);white-space:nowrap}.dm-admin-sidebar .sidebar-divider{border:0;border-top:1px solid var(--dm-border, rgba(128, 128, 128, .5));margin:.5rem .75rem;opacity:.8}.menu-tree-row .me-icon-wrap{display:flex;gap:2px}.menu-tree-row .me-icon-wrap .me-icon{flex:1;min-width:0}.menu-tree-row .me-icon-wrap .me-icon-pick{flex-shrink:0;padding:.2rem .45rem;font-size:.85em}.dm-admin-sidebar{display:flex;flex-direction:column;gap:2px;padding:8px 0}.dm-admin-sidebar details{margin:0}.dm-admin-sidebar details>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:.5rem;padding:.4rem .75rem;border-radius:4px;user-select:none}.dm-admin-sidebar details>summary::-webkit-details-marker{display:none}.dm-admin-sidebar details>summary:after{content:"\25b8";margin-left:auto;transition:transform .15s ease;color:var(--dm-text-muted, #999);font-size:.85em}.dm-admin-sidebar details[open]>summary:after{transform:rotate(90deg)}.dm-admin-sidebar details>div{padding-left:1rem;border-left:1px solid var(--dm-border-subtle, rgba(0, 0, 0, .08));margin-left:.95rem}.dm-admin-sidebar .sidebar-link{display:flex;align-items:center;gap:.5rem;padding:.35rem .75rem;text-decoration:none;color:var(--dm-text, inherit);border-radius:4px}.dm-admin-sidebar .sidebar-link:hover,.dm-admin-sidebar details>summary:hover{background:var(--dm-bg-subtle, rgba(0, 0, 0, .05))}.dm-admin-sidebar .sidebar-link.active{background:var(--dm-accent-bg, rgba(0, 0, 0, .08));font-weight:600}.dm-admin-sidebar .sidebar-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dm-admin-sidebar [data-icon]{flex-shrink:0}.dm-admin-sidebar-header{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;margin:0 0 .5rem;font-weight:600;font-size:.95rem;letter-spacing:.01em;color:var(--dm-text, inherit);border-bottom:1px solid var(--dm-border-subtle, rgba(0, 0, 0, .08))}.dm-admin-sidebar-header [data-icon]{color:var(--dm-text-muted, #999)}.dm-admin-sidebar .sidebar-badge{margin-left:auto;padding:0 .4rem;min-width:1.25rem;height:1.1rem;line-height:1.1rem;text-align:center;font-size:.7rem;font-weight:600;border-radius:999px;background:var(--dm-accent-bg, rgba(0, 0, 0, .12));color:var(--dm-text-muted, #888)}.dm-admin-sidebar .sidebar-link.active .sidebar-badge{background:var(--dm-accent, #4a86e8);color:#fff}.dm-admin-sidebar .sidebar-children{overflow:hidden;transition:max-height .22s ease,opacity .18s ease}.dm-admin-sidebar details:not([open])>.sidebar-children{opacity:0}.dm-admin-sidebar{position:relative}.dm-admin-sidebar-handle{position:absolute;top:0;right:-3px;width:6px;height:100%;cursor:col-resize;background:transparent;z-index:10;transition:background .15s}.dm-admin-sidebar-handle:hover,.dm-admin-sidebar-handle:active{background:var(--dm-accent, #4a86e8);opacity:.35}.dm-admin-sidebar--dark{background:#1a1d24;color:#e3e6eb}.dm-admin-sidebar--dark .sidebar-link,.dm-admin-sidebar--dark summary{color:#e3e6eb}.dm-admin-sidebar--dark .sidebar-link:hover,.dm-admin-sidebar--dark details>summary:hover{background:#ffffff0f}.dm-admin-sidebar--dark .sidebar-link.active{background:#4a86e840}.dm-admin-sidebar--dark .sidebar-badge{background:#ffffff1f;color:#cbd0d8}.dm-admin-sidebar--light{background:#fff;color:#1a1d24;border-right:1px solid rgba(0,0,0,.08)}.dm-admin-sidebar--light .sidebar-link,.dm-admin-sidebar--light summary{color:#1a1d24}.dm-admin-sidebar--light .sidebar-link:hover,.dm-admin-sidebar--light details>summary:hover{background:#0000000a}.dm-admin-sidebar--light .sidebar-link.active{background:#4a86e826}.dm-admin-sidebar--transparent{background:transparent}.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin:0 0 1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--dm-border-subtle, rgba(0, 0, 0, .08))}.page-header h2{margin:0;display:flex;align-items:center;gap:.5rem;font-size:1.4rem;line-height:1.2}.page-header h2 [data-icon]{color:var(--dm-text-muted, #888)}.header-actions{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.card+.card,.card+p,p+.card,.card+.toolbar,.toolbar+.card,.card+.grid{margin-top:1rem}.toolbar{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin:0 0 1rem}.btn+.btn,.btn+a.btn,a.btn+.btn,a.btn+a.btn{margin-left:.35rem}[style*=inline-flex] .btn+.btn,[style*=inline-flex] .btn+a.btn,[style*=inline-flex] a.btn+.btn{margin-left:0}.card-body>[id$=-form],.card-body>form{margin:.25rem 0}.card-header{display:flex;align-items:center;gap:.5rem}.card-header h3{margin:0;font-size:1.05rem}.card-header [data-icon]{color:var(--dm-text-muted, #888)}.page-header+p.text-muted{margin:-.5rem 0 1rem}.dm-pe-grid{gap:.75rem 1rem}.dm-pe-grid .form-group{display:flex;flex-direction:column;gap:.25rem;margin:0}.dm-pe-grid .form-group.col-span-2{grid-column:1 / -1}.dm-pe-grid label{font-size:.85rem;font-weight:600;color:var(--dm-text, inherit)}.dm-pe-grid label .required{color:var(--dm-danger, #c33);margin-left:2px}.dm-pe-grid .form-hint{font-size:.75rem;color:var(--dm-text-muted, #888);margin-top:.1rem}.dm-pe-grid .form-input{width:100%;padding:.4rem .6rem}.dm-pe-grid textarea.form-input{resize:vertical;min-height:2.5rem}.dm-menu-badge{display:inline-block;margin-left:6px;padding:1px 7px;font-size:.7em;font-weight:700;line-height:1.4;border-radius:999px;background:var(--dm-text-muted);color:#fff;vertical-align:middle}.menu-tree-row--slim{display:grid;grid-template-columns:16px 1fr auto repeat(9,auto);gap:6px;align-items:center}.menu-tree-row--slim .me-row-label{font-weight:600}.menu-tree-row--slim .me-row-url{color:var(--dm-text-muted);font-size:.85em}.me-item-form{display:flex;flex-direction:column;gap:10px;padding:4px 2px}.me-item-form .form-field{display:flex;flex-direction:column;gap:4px}.me-item-form .form-label{font-size:.85em;color:var(--dm-text-muted)}.me-form-section{margin:12px 0 2px;padding-top:10px;border-top:1px solid var(--dm-border-subtle, rgba(0,0,0,.15));font-size:.78em;text-transform:uppercase;letter-spacing:.06em;color:var(--dm-text-muted)}.me-item-form .me-form-section:first-child{margin-top:0;padding-top:0;border-top:0}.me-item-form .me-colour-hex{width:48px;height:32px;padding:2px}.me-item-form .me-field-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.me-item-form .me-field-grid .form-field{margin:0}.me-item-form .me-icon-field{display:flex;align-items:center;gap:8px}.me-item-form .me-icon-field .form-input{flex:1}.me-item-form .me-icon-preview{width:24px;height:24px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;color:var(--dm-text-muted)}
1
+ .dashboard-layout{display:flex;flex-direction:column;min-height:100vh}.dashboard-wrapper{display:flex;flex:1;min-height:0}.dashboard-main{flex:1;min-width:0;overflow-y:auto}.view-container{padding:1.5rem 2rem;max-width:1200px}.view-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;gap:1rem}.view-header h1{font-size:1.5rem;font-weight:700;margin:0;display:flex;align-items:center;gap:.5rem}.view-header-actions{display:flex;gap:.5rem}.stat-card .card-body{display:flex;align-items:center;gap:1rem}.stat-icon{width:44px;height:44px;border-radius:8px;background:color-mix(in srgb,var(--dm-primary) 14%,transparent);color:var(--dm-primary, #5b8cff);display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.stat-icon--success{background:color-mix(in srgb,var(--dm-success) 15%,transparent);color:var(--dm-success)}.stat-icon--warning{background:color-mix(in srgb,var(--dm-warning) 15%,transparent);color:var(--dm-warning)}.stat-value{font-size:1.75rem;font-weight:700;line-height:1}.stat-label{font-size:.8rem;color:var(--dm-text-muted, #888);margin-top:.25rem}.toolbar{display:flex;align-items:center;gap:.75rem}.form-check-label{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.9rem}.form-hint{display:block;font-size:.8rem;color:var(--dm-text-muted, #888);margin-top:.25rem}.dashboard-main:has(#editor-meta-tabs){overflow:hidden}.view-container:has(#editor-meta-tabs){display:flex;flex-direction:column;height:calc(100dvh - 60px);max-width:100%;padding-bottom:0}.view-container:has(#block-editor-body){max-width:100%}.view-container:has(#ep-editor-tabs){max-width:100%}.ep-editor-grid{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr) minmax(0,1.3fr);gap:1rem;align-items:start}.ep-editor-grid>.ep-tryit-col,.ep-editor-grid>.ep-results-col{position:sticky;top:1rem;display:flex;flex-direction:column;gap:1rem;min-width:0}@media(max-width:1500px){.ep-editor-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.ep-editor-grid>:first-child{grid-column:1 / -1}.ep-editor-grid>.ep-tryit-col,.ep-editor-grid>.ep-results-col{position:static}}@media(max-width:1024px){.ep-editor-grid{grid-template-columns:minmax(0,1fr)}}#editor-meta-tabs{flex:1;min-height:0;display:flex;flex-direction:column}#editor-meta-tabs .tab-content{flex:1;min-height:0;overflow:hidden}#editor-meta-tabs .tab-panel{height:100%;overflow-y:auto}#editor-meta-tabs .tab-panel:has(.editor-card),#live-preview-panel{overflow:hidden}.page-live-preview-frame{display:block;width:100%;height:calc(100vh - 180px);border:none;border-radius:6px}.editor-card{display:flex;flex-direction:column;height:100%}.editor-card .card-body{display:flex;flex-direction:column;flex:1;min-height:0;padding:0!important}.editor-toolbar{display:flex;align-items:center;gap:2px;padding:6px 10px;border-bottom:1px solid var(--dm-border, rgba(255, 255, 255, .08));flex-wrap:wrap;flex-shrink:0}.editor-toolbar-btn{background:none;border:none;color:var(--dm-text-muted, #888);padding:6px 8px;border-radius:4px;cursor:pointer;display:flex;align-items:center;transition:color .15s,background .15s}.editor-toolbar-btn:hover{color:var(--dm-text, #eee);background:var(--dm-hover-bg)}.editor-toolbar-sep{width:1px;height:20px;background:var(--dm-border, rgba(255, 255, 255, .08));margin:0 4px;flex-shrink:0}.editor-toolbar-right{margin-left:auto;display:flex;align-items:center;gap:2px}.editor-view-btn{background:none;border:none;color:var(--dm-text-muted, #888);padding:6px 8px;border-radius:4px;cursor:pointer;display:flex;align-items:center;transition:color .15s,background .15s}.editor-view-btn:hover{color:var(--dm-text, #eee);background:var(--dm-hover-bg)}.editor-view-btn.active{color:var(--dm-primary, #5b8cff);background:color-mix(in srgb,var(--dm-primary) 14%,transparent)}.editor-body{display:flex;flex:1;min-height:0}.editor-pane{flex:1;display:flex;flex-direction:column;min-width:0}.editor-pane--write,.editor-pane--preview{overflow:hidden}.editor-pane--write{flex-direction:row}.editor-line-numbers{padding:1rem .6rem 1rem .75rem;background:var(--dm-background-alt, rgba(0, 0, 0, .15));border-right:1px solid var(--dm-border, rgba(255, 255, 255, .08));color:var(--dm-text-muted, #666);font-family:Fira Code,Courier New,monospace;font-size:.9rem;line-height:1.6;text-align:right;user-select:none;white-space:pre;overflow:hidden;flex-shrink:0;min-width:2.5rem}.editor-line-numbers--foldable{padding:1rem 0;min-width:3rem;white-space:normal;text-align:left;display:flex;flex-direction:column}.editor-line-number-row{display:flex;align-items:center;justify-content:flex-end;padding-right:.6rem;gap:.15rem}.fold-toggle{display:inline-flex;align-items:center;justify-content:center;width:1em;font-size:.6rem;cursor:default;color:transparent}.fold-toggle--open,.fold-toggle--folded{cursor:pointer;color:var(--dm-text-muted, #666);transition:color .1s}.fold-toggle--open:hover,.fold-toggle--folded:hover{color:var(--dm-primary, #4a9eff)}.editor-line-num{min-width:1.5rem;text-align:right}.editor-mode-write .editor-pane--preview,.editor-mode-write .editor-divider,.editor-mode-preview .editor-pane--write,.editor-mode-preview .editor-divider{display:none}.editor-divider{width:1px;background:var(--dm-border, rgba(255,255,255,.08));flex-shrink:0}.editor-textarea{flex:1;resize:none;border:none;border-radius:0;background:transparent;font-family:Fira Code,Courier New,monospace;font-size:.9rem;padding:1rem;outline:none;color:inherit;line-height:1.6}.editor-preview{flex:1;padding:1rem;overflow-y:auto;line-height:1.7}.editor-preview h1,.editor-preview h2,.editor-preview h3{margin-top:1.5rem}.editor-preview p{margin-bottom:.75rem}.editor-preview code{background:var(--dm-code-bg);padding:.1em .3em;border-radius:3px;font-size:.9em}.editor-fullscreen{position:fixed;inset:0;z-index:1000;border-radius:0;margin:0}.editor-fullscreen .card-body{height:100vh}.media-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.75rem;max-height:400px;overflow-y:auto;padding:.25rem}.media-picker-item{cursor:pointer;border:2px solid transparent;border-radius:6px;overflow:hidden;transition:border-color .15s}.media-picker-item:hover{border-color:var(--dm-primary, #5b8cff)}.media-picker-item img{width:100%;height:80px;object-fit:cover;display:block}.media-picker-item span{display:block;font-size:.75rem;padding:4px 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-body h3{margin-top:1.25rem;margin-bottom:.5rem}.docs-body p{margin-bottom:.5rem;line-height:1.6}.docs-body ol,.docs-body ul{margin-bottom:.75rem;padding-left:1.25rem}.docs-body li{margin-bottom:.25rem}.docs-body hr{margin:1.25rem 0;border-color:var(--dm-border, rgba(255, 255, 255, .08))}.docs-body .table{margin-bottom:.75rem}.nav-items-header,.nav-item-row{display:flex;gap:.5rem;align-items:center;padding:.35rem .75rem}.nav-items-header{border-bottom:1px solid var(--dm-border, rgba(255,255,255,.08));padding-bottom:.4rem;margin-bottom:.25rem}.nav-item-row{border-bottom:1px solid var(--dm-border, rgba(255,255,255,.04))}.nav-item-row:last-child{border-bottom:none}.nav-col-indent{width:18px;flex-shrink:0;color:var(--dm-text-muted, #888);text-align:center;font-size:.85rem}.nav-col-main{flex:2;min-width:0}.nav-col-icon{flex:0 0 90px}.nav-col-parent{flex:2;min-width:0}.nav-col-action{flex-shrink:0}.nav-item-row--child{background:color-mix(in srgb,var(--dm-text) 3%,transparent)}.nav-col-action{display:flex;align-items:center;gap:.25rem}.nav-item-row--hidden{opacity:.45}.nav-item-row--hidden .item-text,.nav-item-row--hidden .footer-link-text{text-decoration:line-through}.btn-toggle-hidden{color:var(--dm-text-muted, #888)}.btn-toggle-hidden.active{color:var(--dm-warning, #f59e0b)}.fb-field-card.fb-drag-over{outline:2px dashed var(--dm-primary, #6366f1);outline-offset:-2px}.toggle-label{display:flex;align-items:center;gap:.4rem;font-size:.9rem;cursor:pointer;margin-right:1rem}.preset-toggles{display:flex;flex-wrap:wrap;margin-top:.75rem}.presets-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}@media(max-width:900px){.presets-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:600px){.presets-grid{grid-template-columns:1fr}}.card-header{padding:.5rem 1rem}.card-header h2{margin:0;font-size:.9rem;font-weight:600;letter-spacing:.02em}.preset-card .card-header{display:flex;align-items:center;justify-content:space-between}.preset-card .card-header h3{margin:0;font-size:1rem}.media-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:1rem}.media-card{background:var(--dm-card-bg, rgba(255,255,255,.04));border:1px solid var(--dm-border, rgba(255,255,255,.08));border-radius:8px;overflow:hidden}.media-preview{height:130px;display:flex;align-items:center;justify-content:center;background:#0003;overflow:hidden}.media-thumb{width:100%;height:100%;object-fit:cover}.media-thumb--file{font-size:2rem;color:var(--dm-text-muted, #888)}.media-info{padding:.5rem .75rem;display:flex;flex-direction:column;gap:.15rem}.media-name{font-size:.8rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:default}.media-rename-input{width:100%;font-size:.8rem;font-weight:500;padding:.1rem .25rem;border:1px solid var(--dm-primary, #7c6af7);border-radius:3px;background:var(--dm-input-bg, transparent);color:inherit;outline:none}.media-size{font-size:.75rem;color:var(--dm-text-muted, #888)}.media-actions{padding:.5rem .75rem;display:flex;gap:.4rem;border-top:1px solid var(--dm-border, rgba(255,255,255,.08))}#admin-topbar{height:60px;display:flex;align-items:center;gap:1rem;padding:0 1.25rem;background:var(--dm-navbar-bg, rgba(0,0,0,.3));border-bottom:1px solid var(--dm-border, rgba(255,255,255,.08));position:sticky;top:0;z-index:200;flex-shrink:0}.topbar-brand{display:flex;align-items:center;gap:.5rem;font-weight:700;font-size:.95rem;color:inherit;flex-shrink:0;margin-right:.5rem}.topbar-brand span[data-icon],.topbar-brand svg{color:var(--dm-primary, #5b8cff);width:22px;height:22px}.topbar-brand-text{opacity:.85}.topbar-brand-logo{height:28px;width:auto;display:inline-block;vertical-align:middle;margin-right:.4em;object-fit:contain}.topbar-user{display:flex;align-items:center;gap:.6rem;flex:1}.topbar-user-name{font-size:.875rem;font-weight:500}.topbar-role-badge{font-size:.7rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:.15rem .45rem;border-radius:4px}.topbar-role-badge--admin{background:color-mix(in srgb,var(--dm-primary) 15%,transparent);color:var(--dm-primary)}.topbar-role-badge--manager{background:color-mix(in srgb,var(--dm-success) 15%,transparent);color:var(--dm-success)}.topbar-role-badge--editor{background:color-mix(in srgb,var(--dm-warning) 15%,transparent);color:var(--dm-warning)}.topbar-role-badge--subscriber{background:color-mix(in srgb,var(--dm-text-muted) 15%,transparent);color:var(--dm-text-muted)}.topbar-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.topbar-action-link{display:flex;align-items:center;gap:.35rem;font-size:.875rem;color:var(--dm-text-muted, #888);text-decoration:none;padding:.4rem .65rem;border-radius:6px;transition:color .15s,background .15s}.topbar-action-link:hover{color:var(--dm-text, #eee);background:var(--dm-hover-bg)}.topbar-action-link span[data-icon],.topbar-action-link svg{width:16px;height:16px}.topbar-signout{display:flex;align-items:center;gap:.35rem;font-size:.875rem}.topbar-signout span[data-icon],.topbar-signout svg{width:16px;height:16px}.login-wrap{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:1rem;background:var(--dm-background, #0f1117);z-index:100;overflow-y:auto}.login-card{width:100%;max-width:460px}.ob-done-icon{font-size:3rem;color:var(--dm-success);margin-bottom:1rem;text-align:center}.btn-skip{display:block;text-align:center;margin-top:.75rem;font-size:.85rem;color:var(--dm-text-muted, #888);text-decoration:none}.btn-skip:hover{text-decoration:underline}.theme-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem}.theme-swatch{border:2px solid var(--dm-border, rgba(255,255,255,.1));border-radius:8px;overflow:hidden;cursor:pointer;transition:border-color .15s,transform .1s}.theme-swatch:hover{border-color:var(--dm-primary, #5b8cff);transform:translateY(-1px)}.theme-swatch.selected{border-color:var(--dm-primary, #5b8cff);box-shadow:0 0 0 2px var(--dm-primary, #5b8cff)}.theme-swatch-preview{height:52px;position:relative;display:flex;align-items:flex-end;padding:.35rem}.theme-swatch-accent{width:28px;height:6px;border-radius:3px}.theme-swatch-label{display:flex;justify-content:space-between;align-items:center;padding:.3rem .45rem;font-size:.7rem;background:var(--dm-card-bg, rgba(255,255,255,.04))}.theme-swatch-mode{color:var(--dm-text-muted, #888);font-size:.65rem}.login-logo{display:flex;align-items:center;gap:.75rem;margin-bottom:1.75rem;font-size:1.5rem}.login-logo span[data-icon]{font-size:2rem;color:var(--dm-primary, #5b8cff)}.login-logo h1{margin:0;font-size:1.5rem;font-weight:700}.login-heading{font-size:1.1rem;font-weight:600;margin-bottom:1.25rem}.btn-block{width:100%}.plugins-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1rem}.plugin-card{display:flex;flex-direction:column}.plugin-card .card-body{flex:1}.plugin-header{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:.75rem}.plugin-icon{width:40px;height:40px;border-radius:8px;background:color-mix(in srgb,var(--dm-primary) 14%,transparent);color:var(--dm-primary, #5b8cff);display:flex;align-items:center;justify-content:center;flex-shrink:0}.plugin-meta{flex:1;min-width:0}.plugin-name{font-weight:600;margin-bottom:.15rem}.plugin-version{font-size:.75rem;color:var(--dm-text-muted, #888)}.plugin-desc{font-size:.875rem;color:var(--dm-text-muted, #888);margin-bottom:1rem}.plugin-footer{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-top:1px solid var(--dm-border, rgba(255,255,255,.08))}.plugin-footer-actions{display:flex;align-items:center;gap:.5rem}#admin-sidebar .sidebar-link{position:relative!important}#admin-sidebar .sidebar-badge{position:absolute!important;right:.75rem!important;top:50%!important;transform:translateY(-50%)!important;margin-left:0!important;padding-left:.45rem!important;padding-right:.45rem!important}#admin-sidebar .sidebar-text{padding-right:2rem!important}#admin-sidebar.sidebar-dark{background:var(--dm-surface);border-color:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-header{background:var(--dm-surface-raised);border-color:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-header-title{color:var(--dm-text)}#admin-sidebar.sidebar-dark .sidebar-link{color:var(--dm-text-muted)}#admin-sidebar.sidebar-dark .sidebar-link:hover{color:var(--dm-text);background:var(--dm-surface-overlay)}#admin-sidebar.sidebar-dark .sidebar-link.active{color:var(--dm-primary);background:color-mix(in srgb,var(--dm-primary) 14%,transparent);border-left-color:var(--dm-primary)}#admin-sidebar.sidebar-dark .sidebar-heading{color:var(--dm-text-muted)}#admin-sidebar.sidebar-dark .sidebar-divider{background:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-footer{background:var(--dm-surface-raised);border-color:var(--dm-border)}.sidebar-heading--collapsible{display:flex!important;align-items:center;justify-content:space-between;cursor:pointer;user-select:none}.sidebar-heading-toggle{display:flex;align-items:center;opacity:.5;flex-shrink:0;transition:transform .2s ease}.sidebar-heading--collapsible.is-collapsed .sidebar-heading-toggle{transform:rotate(-90deg)}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.p-0{padding:0!important}.text-muted{color:var(--dm-text-muted, #888)}@media(max-width:768px){.view-container{padding:1rem}.editor-body{flex-direction:column}.editor-divider{width:auto;height:1px}}.image-editor{display:flex;flex-direction:column;gap:0}.image-editor-toolbar{display:flex;flex-direction:row;align-items:center;gap:.25rem;padding:.5rem .75rem;border-bottom:1px solid var(--dm-border, rgba(255, 255, 255, .1))}.image-editor-sep{display:inline-block;width:1px;height:1.5rem;background:var(--dm-border, rgba(255, 255, 255, .15));margin:0 .25rem;flex-shrink:0}.editor-toolbar-btn.active{color:var(--dm-primary, #7c6af7);background:color-mix(in srgb,var(--dm-primary, #7c6af7) 15%,transparent)}.editor-toolbar-caret{font-size:.6rem;line-height:1;margin-left:2px;opacity:.6}.editor-toolbar-dropdown{position:absolute;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--dm-border, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:4px;min-width:160px}.editor-toolbar-dropdown-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:none;color:var(--dm-text, #ddd);padding:7px 10px;border-radius:5px;cursor:pointer;font-size:.85rem;transition:background .12s,color .12s}.editor-toolbar-dropdown-item:hover{background:var(--dm-hover-bg);color:var(--dm-text, #fff)}.editor-toolbar-dropdown-item span[data-icon],.editor-toolbar-dropdown-item svg{width:15px;height:15px;flex-shrink:0;opacity:.75}.editor-toolbar{position:relative}.editor-effects-dropdown-menu{position:absolute;top:100%;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--dm-border, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:6px;min-width:180px;max-height:340px;overflow-y:auto}.editor-effects-category{padding:6px 8px 3px;font-size:.7rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--dm-text-muted, #888)}.editor-effects-item{display:block;width:100%;text-align:left;background:none;border:none;color:var(--dm-text, #ddd);padding:6px 10px;border-radius:5px;cursor:pointer;font-size:.85rem;transition:background .12s,color .12s}.editor-effects-item:hover{background:var(--dm-hover-bg);color:var(--dm-text, #fff)}.editor-icon-picker{position:absolute;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--dm-border, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:8px;width:320px}.editor-icon-picker-search{width:100%;margin-bottom:8px;font-size:.8rem}.editor-spacer-picker{position:absolute;z-index:9999;background:var(--dm-surface, #1e1e2e);border:1px solid var(--dm-border, #333);border-radius:8px;padding:12px;width:240px;box-shadow:0 8px 24px #00000073}.editor-spacer-picker-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--dm-text-muted, #888);margin-bottom:10px}.editor-spacer-picker-row{display:flex;align-items:center;gap:10px;margin-bottom:12px}.editor-spacer-slider{flex:1;accent-color:var(--dm-primary, #6366f1);cursor:pointer}.editor-spacer-slider-value{font-size:13px;font-weight:600;min-width:38px;text-align:right;color:var(--dm-text, #cdd6f4)}.editor-spacer-insert-btn{width:100%}.editor-icon-picker-size-row{display:flex;align-items:center;gap:8px;padding:0 8px 8px}.editor-icon-picker-size-row label{font-size:11px;color:var(--dm-text-muted, #888);white-space:nowrap}.editor-icon-picker-size{width:70px;font-size:12px;padding:3px 6px}.editor-icon-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:2px;max-height:280px;overflow-y:auto}.editor-icon-picker-item{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:6px 2px;border-radius:5px;cursor:pointer;background:none;border:none;color:var(--dm-text, #ddd);font-size:.58rem;text-align:center;gap:4px;overflow:hidden;transition:background .12s,color .12s}.editor-icon-picker-item:hover{background:var(--dm-hover-bg);color:var(--dm-text, #fff)}.editor-icon-picker-item span[data-icon],.editor-icon-picker-item svg{width:16px;height:16px;flex-shrink:0}.editor-icon-picker-item>span:last-child{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.editor-icon-picker-empty{grid-column:1 / -1;text-align:center;color:var(--dm-text-muted, #888);font-size:.8rem;padding:1.5rem}.image-editor-canvas{min-height:320px;max-height:520px;background:#111;overflow:hidden;display:flex;align-items:center;justify-content:center}.image-editor-canvas img{display:block;max-width:100%;max-height:520px}.image-editor-resize{display:flex;flex-direction:row;align-items:center;gap:.5rem;padding:.6rem .75rem;border-top:1px solid var(--dm-border, rgba(255, 255, 255, .1));font-size:.85rem}.image-editor-resize label{font-weight:600;color:var(--dm-text-muted, #888);font-size:.8rem}.image-editor-resize .form-input{width:5rem;padding:.25rem .5rem;font-size:.85rem}.image-editor-footer{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:.75rem;border-top:1px solid var(--dm-border, rgba(255, 255, 255, .1));gap:.5rem}.image-editor-effects{border-top:1px solid var(--dm-border, rgba(255, 255, 255, .1))}.image-editor-tab-bar{display:flex;flex-direction:row;overflow-x:auto;border-bottom:1px solid var(--dm-border, rgba(255, 255, 255, .1));scrollbar-width:none}.image-editor-tab-bar::-webkit-scrollbar{display:none}.image-editor-tab-btn{display:inline-flex;align-items:center;gap:.35rem;padding:.5rem .85rem;font-size:.8rem;font-weight:500;border:none;border-bottom:2px solid transparent;background:transparent;cursor:pointer;color:var(--dm-text-muted, #888);white-space:nowrap;transition:color .15s,border-color .15s;flex-shrink:0}.image-editor-tab-btn:hover{color:var(--dm-text, #eee)}.image-editor-tab-btn.active{color:var(--dm-primary, #7c6af7);border-bottom-color:var(--dm-primary, #7c6af7)}.image-editor-tab-panel{padding:.75rem;max-height:200px;overflow-y:auto}.ie-presets-grid{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:.5rem}.ie-preset-btn.active{color:var(--dm-primary, #7c6af7);background:color-mix(in srgb,var(--dm-primary, #7c6af7) 15%,transparent);border-color:var(--dm-primary, #7c6af7)}.ie-server-note{font-size:.73rem;color:var(--dm-text-muted, #888);font-style:italic;margin:.25rem 0 0;line-height:1.4}.ie-slider-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.ie-slider-label{width:6rem;font-size:.8rem;color:var(--dm-text-muted, #888);font-weight:600;flex-shrink:0}.ie-slider{flex:1;accent-color:var(--dm-primary, #7c6af7);cursor:pointer}.ie-slider-val{width:3rem;font-size:.8rem;text-align:right;color:var(--dm-text, #eee);flex-shrink:0}.ie-select{flex:1;font-size:.85rem;padding:.25rem .5rem}.ie-colour-input{width:40px;height:28px;padding:0;border:1px solid var(--dm-border, rgba(255, 255, 255, .15));border-radius:4px;cursor:pointer;background:transparent;flex-shrink:0}.ie-wm-preview-row{display:flex;align-items:center;gap:.5rem;margin:.4rem 0}.ie-wm-preview-img{width:48px;height:48px;object-fit:contain;border-radius:4px;background:var(--dm-surface-raised, rgba(255, 255, 255, .06));flex-shrink:0}.ie-wm-preview-name{font-size:.8rem;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dm-text, #eee)}.ie-media-picker{padding:.25rem 0}.ie-media-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:.5rem;max-height:300px;overflow-y:auto}.ie-media-thumb{display:flex;flex-direction:column;align-items:center;gap:.25rem;padding:.4rem;border-radius:6px;cursor:pointer;border:2px solid transparent;transition:border-color .15s,background .15s}.ie-media-thumb:hover{background:var(--dm-surface-raised, rgba(255, 255, 255, .08));border-color:var(--dm-primary, #7c6af7)}.ie-media-thumb img{width:72px;height:72px;object-fit:cover;border-radius:4px}.ie-media-thumb-name{font-size:.7rem;color:var(--dm-text-muted, #888);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:72px}.dm-slideover-left,.dm-slideover-right{width:min(40rem,95vw)!important;min-width:min(36rem,100vw)!important;max-width:100vw!important}.dm-slideover-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid var(--dm-border, #333);flex-shrink:0}.dm-slideover-title{margin:0;font-size:1rem;font-weight:600}.dm-slideover-close{padding:.2rem .35rem!important;line-height:1;font-size:.75rem}.dm-slideover-body{flex:1;overflow-y:auto;min-height:0;padding:1.5rem!important;box-sizing:border-box}.dm-slideover>div:not(.dm-slideover-header):not(.dm-slideover-body):not(.dm-slideover-close){padding:1.5rem!important;box-sizing:border-box}.dm-slideover-body>div{padding-left:0!important;padding-right:0!important}.dm-slideover-body>button.btn:last-child{margin-top:.5rem}.dconfig-textarea{font-family:monospace;min-height:100px;resize:vertical}.dm-editor-line-numbers{white-space:pre}.dm-code-inline{font-family:Fira Code,Courier New,monospace;font-size:.82em;padding:.15em .35em;border-radius:3px;background:var(--dm-background-alt, rgba(0, 0, 0, .18));color:var(--dm-text, inherit);border:1px solid var(--dm-border, rgba(255, 255, 255, .08))}.dm-code-block{font-family:Fira Code,Courier New,monospace;font-size:.82rem;line-height:1.6;padding:.65rem .9rem;border-radius:6px;background:var(--dm-background-alt, rgba(0, 0, 0, .18));color:var(--dm-text, inherit);border:1px solid var(--dm-border, rgba(255, 255, 255, .08));white-space:pre;overflow-x:auto;display:block;margin:.4rem 0}.tabs-centered{text-align:center}.tabs-centered .tab-list{display:inline-flex}.tabs-centered .tab-content{text-align:left}@media(max-width:768px){.view-header{flex-direction:column;align-items:flex-start}.theme-grid{grid-template-columns:repeat(2,1fr)}.nav-item-row{flex-wrap:wrap}.nav-col-icon,.nav-col-parent{display:none}#admin-topbar{padding:0 .75rem}.topbar-brand-text{display:none}.image-editor-toolbar{flex-wrap:wrap}}#topbar-bell{position:relative}.topbar-bell-badge{position:absolute;top:2px;right:2px;min-width:16px;height:16px;padding:0 4px;background:var(--dm-danger, #dc2626);color:var(--dm-danger-text, #fff);font-size:10px;font-weight:700;line-height:16px;border-radius:9999px;text-align:center;pointer-events:none}.cb-scaffolder{padding:1rem 1.1rem;background:var(--dm-background-alt);border:1px solid var(--dm-primary);border-radius:8px;color:var(--dm-text)}.cb-scaffolder-head{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.cb-scaffolder-head .cb-icon{flex-shrink:0;color:var(--dm-primary)}.cb-scaffolder-head h2{margin:0;font-size:1.05rem;font-weight:700;color:var(--dm-text)}.cb-scaffolder-blurb{margin:0 0 .75rem;font-size:.88rem;line-height:1.5;color:var(--dm-text-muted)}.cb-recipe-list{display:flex;flex-direction:column;gap:.5rem}.cb-recipe-card{display:flex;align-items:flex-start;gap:.75rem;text-align:left;padding:.75rem 1rem;background:var(--dm-surface);border:1px solid var(--dm-border);border-radius:6px;cursor:pointer;transition:border-color .12s;width:100%;color:var(--dm-text)}.cb-recipe-card:hover{border-color:var(--dm-primary)}.cb-recipe-card .cb-icon{flex-shrink:0;font-size:1.5rem;color:var(--dm-primary);margin-top:.1rem}.cb-recipe-meta{flex:1}.cb-recipe-name{font-weight:600;margin-bottom:.15rem;font-size:.95rem;color:var(--dm-text)}.cb-recipe-desc{font-size:.83rem;line-height:1.45;color:var(--dm-text-muted)}.cb-apply-panel{padding:1rem 1.1rem;background:var(--dm-surface);border:1px solid var(--dm-primary);border-radius:8px;color:var(--dm-text)}.cb-apply-head{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.cb-apply-head .cb-icon{color:var(--dm-primary);font-size:1.4rem}.cb-apply-head h3{margin:0;font-size:1rem;font-weight:600;color:var(--dm-text)}.cb-apply-desc,.cb-apply-hint{margin:.25rem 0 .75rem;font-size:.85rem;line-height:1.5;color:var(--dm-text-muted)}.cb-apply-hint{font-size:.75rem;margin-top:.2rem}.cb-apply-field{margin-bottom:.6rem}.cb-apply-field label{display:block;font-size:.82rem;font-weight:600;margin-bottom:.2rem;color:var(--dm-text)}.cb-apply-field input{width:100%;padding:.4rem .55rem;border:1px solid var(--dm-border);border-radius:4px;font-size:.88rem;background:var(--dm-surface);color:var(--dm-text)}.cb-apply-status{margin:.5rem 0;font-size:.85rem;min-height:1.2rem;color:var(--dm-text)}.cb-apply-status.cb-error{color:var(--dm-danger, #dc2626)}.cb-apply-buttons{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.cb-success-panel{padding:1rem 1.1rem;background:var(--dm-surface);border:1px solid var(--dm-success, #16a34a);border-radius:8px;color:var(--dm-text)}.cb-success-panel .cb-icon{color:var(--dm-success, #16a34a);font-size:1.4rem}.cb-success-summary{margin:.25rem 0 .5rem;padding-left:1.2rem;font-size:.86rem;line-height:1.6;color:var(--dm-text)}.cb-success-warning{margin:.5rem 0;padding:.5rem .75rem;background:var(--dm-background-alt);border-left:3px solid var(--dm-warning, #eab308);border-radius:0 4px 4px 0;font-size:.82rem;color:var(--dm-text-muted)}.cb-success-snippet-label{margin:0 0 .25rem;font-size:.82rem;font-weight:600;color:var(--dm-text)}.cb-success-actions{display:flex;gap:.5rem;margin-top:.5rem;flex-wrap:wrap}.cb-code{position:relative}.cb-code pre{background:var(--dm-background-alt);color:var(--dm-text);display:block;padding:.6rem 2.4rem .6rem .75rem;white-space:pre;overflow-x:auto;margin:0;border-radius:6px;font-size:.82em;font-family:monospace;line-height:1.45}.cb-code .cb-copy{position:absolute;top:.35rem;right:.35rem;background:none;border:none;cursor:pointer;opacity:.45;padding:.2rem;line-height:1;color:var(--dm-text)}.cb-code .cb-copy:hover{opacity:1}.cb-intro{padding:.75rem 1rem;border-left:3px solid var(--dm-primary);background:var(--dm-background-alt);border-radius:0 6px 6px 0}.cb-intro p{margin:0;font-size:.92rem;line-height:1.5;color:var(--dm-text)}.cb-tutorial-link{display:flex;align-items:center;gap:.6rem;padding:.65rem .85rem;border:1px solid var(--dm-border);border-radius:6px;text-decoration:none;color:var(--dm-text);font-size:.88rem;transition:border-color .12s}.cb-tutorial-link:hover{border-color:var(--dm-primary)}.cb-tutorial-link .cb-icon{flex-shrink:0;color:var(--dm-primary)}.cb-tutorial-link .cb-arrow{color:var(--dm-text-muted);font-size:1.1rem;margin-left:auto}.menu-tree-row{display:grid;grid-template-columns:16px 1.4fr 1.4fr .9fr .7fr .9fr repeat(6,auto);gap:6px;align-items:center;padding:4px 0;transition:opacity .15s ease}.menu-tree-row--hidden{opacity:.5}.menu-tree-grip{cursor:grab;color:var(--dm-text-muted)}.menu-tree{padding:8px 0}.menu-tree-row--separator{display:grid;grid-template-columns:16px minmax(80px,1fr) repeat(7,auto);gap:6px;align-items:center;padding:2px 0;opacity:.85}.menu-tree-row--separator:hover{opacity:1}.menu-tree-row--separator .me-sep-line{display:flex;align-items:center;gap:10px;width:100%}.menu-tree-row--separator .me-sep-line:before,.menu-tree-row--separator .me-sep-line:after{content:"";flex:1;border-top:1px dashed var(--dm-border, rgba(128, 128, 128, .55))}.menu-tree-row--separator .me-sep-label{font-size:.66rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--dm-text-muted, #8a8a8a);white-space:nowrap}.dm-admin-sidebar .sidebar-divider{border:0;border-top:1px solid var(--dm-border, rgba(128, 128, 128, .5));margin:.5rem .75rem;opacity:.8}.menu-tree-row .me-icon-wrap{display:flex;gap:2px}.menu-tree-row .me-icon-wrap .me-icon{flex:1;min-width:0}.menu-tree-row .me-icon-wrap .me-icon-pick{flex-shrink:0;padding:.2rem .45rem;font-size:.85em}.dm-admin-sidebar{display:flex;flex-direction:column;gap:2px;padding:8px 0}.dm-admin-sidebar details{margin:0}.dm-admin-sidebar details>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:.5rem;padding:.4rem .75rem;border-radius:4px;user-select:none}.dm-admin-sidebar details>summary::-webkit-details-marker{display:none}.dm-admin-sidebar details>summary:after{content:"\25b8";margin-left:auto;transition:transform .15s ease;color:var(--dm-text-muted, #999);font-size:.85em}.dm-admin-sidebar details[open]>summary:after{transform:rotate(90deg)}.dm-admin-sidebar details>div{padding-left:1rem;border-left:1px solid var(--dm-border-light, rgba(0, 0, 0, .08));margin-left:.95rem}.dm-admin-sidebar .sidebar-link{display:flex;align-items:center;gap:.5rem;padding:.35rem .75rem;text-decoration:none;color:var(--dm-text, inherit);border-radius:4px}.dm-admin-sidebar .sidebar-link:hover,.dm-admin-sidebar details>summary:hover{background:var(--dm-hover-bg, rgba(0, 0, 0, .05))}.dm-admin-sidebar .sidebar-link.active{background:var(--dm-active-bg, rgba(0, 0, 0, .08));font-weight:600}.dm-admin-sidebar .sidebar-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dm-admin-sidebar [data-icon]{flex-shrink:0}.dm-admin-sidebar-header{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;margin:0 0 .5rem;font-weight:600;font-size:.95rem;letter-spacing:.01em;color:var(--dm-text, inherit);border-bottom:1px solid var(--dm-border-light, rgba(0, 0, 0, .08))}.dm-admin-sidebar-header [data-icon]{color:var(--dm-text-muted, #999)}.dm-admin-sidebar .sidebar-badge{margin-left:auto;padding:0 .4rem;min-width:1.25rem;height:1.1rem;line-height:1.1rem;text-align:center;font-size:.7rem;font-weight:600;border-radius:999px;background:var(--dm-active-bg, rgba(0, 0, 0, .12));color:var(--dm-text-muted, #888)}.dm-admin-sidebar .sidebar-link.active .sidebar-badge{background:var(--dm-primary, #4a86e8);color:var(--dm-primary-text, #fff)}.dm-admin-sidebar .sidebar-children{overflow:hidden;transition:max-height .22s ease,opacity .18s ease}.dm-admin-sidebar details:not([open])>.sidebar-children{opacity:0}.dm-admin-sidebar{position:relative}.dm-admin-sidebar-handle{position:absolute;top:0;right:-3px;width:6px;height:100%;cursor:col-resize;background:transparent;z-index:10;transition:background .15s}.dm-admin-sidebar-handle:hover,.dm-admin-sidebar-handle:active{background:var(--dm-primary, #4a86e8);opacity:.35}.dm-admin-sidebar--dark{background:#1a1d24;color:#e3e6eb}.dm-admin-sidebar--dark .sidebar-link,.dm-admin-sidebar--dark summary{color:#e3e6eb}.dm-admin-sidebar--dark .sidebar-link:hover,.dm-admin-sidebar--dark details>summary:hover{background:#ffffff0f}.dm-admin-sidebar--dark .sidebar-link.active{background:#4a86e840}.dm-admin-sidebar--dark .sidebar-badge{background:#ffffff1f;color:#cbd0d8}.dm-admin-sidebar--light{background:#fff;color:#1a1d24;border-right:1px solid rgba(0,0,0,.08)}.dm-admin-sidebar--light .sidebar-link,.dm-admin-sidebar--light summary{color:#1a1d24}.dm-admin-sidebar--light .sidebar-link:hover,.dm-admin-sidebar--light details>summary:hover{background:#0000000a}.dm-admin-sidebar--light .sidebar-link.active{background:#4a86e826}.dm-admin-sidebar--transparent{background:transparent}.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin:0 0 1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--dm-border-light, rgba(0, 0, 0, .08))}.page-header h2{margin:0;display:flex;align-items:center;gap:.5rem;font-size:1.4rem;line-height:1.2}.page-header h2 [data-icon]{color:var(--dm-text-muted, #888)}.header-actions{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.card+.card,.card+p,p+.card,.card+.toolbar,.toolbar+.card,.card+.grid{margin-top:1rem}.toolbar{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin:0 0 1rem}.btn+.btn,.btn+a.btn,a.btn+.btn,a.btn+a.btn{margin-left:.35rem}[style*=inline-flex] .btn+.btn,[style*=inline-flex] .btn+a.btn,[style*=inline-flex] a.btn+.btn{margin-left:0}.card-body>[id$=-form],.card-body>form{margin:.25rem 0}.card-header{display:flex;align-items:center;gap:.5rem}.card-header h3{margin:0;font-size:1.05rem}.card-header [data-icon]{color:var(--dm-text-muted, #888)}.page-header+p.text-muted{margin:-.5rem 0 1rem}.dm-pe-grid{gap:.75rem 1rem}.dm-pe-grid .form-group{display:flex;flex-direction:column;gap:.25rem;margin:0}.dm-pe-grid .form-group.col-span-2{grid-column:1 / -1}.dm-pe-grid label{font-size:.85rem;font-weight:600;color:var(--dm-text, inherit)}.dm-pe-grid label .required{color:var(--dm-danger, #c33);margin-left:2px}.dm-pe-grid .form-hint{font-size:.75rem;color:var(--dm-text-muted, #888);margin-top:.1rem}.dm-pe-grid .form-input{width:100%;padding:.4rem .6rem}.dm-pe-grid textarea.form-input{resize:vertical;min-height:2.5rem}.dm-menu-badge{display:inline-block;margin-left:6px;padding:1px 7px;font-size:.7em;font-weight:700;line-height:1.4;border-radius:999px;background:var(--dm-text-muted);color:var(--dm-text-inverse, #fff);vertical-align:middle}.menu-tree-row--slim{display:grid;grid-template-columns:16px 1fr auto repeat(9,auto);gap:6px;align-items:center}.menu-tree-row--slim .me-row-label{font-weight:600}.menu-tree-row--slim .me-row-url{color:var(--dm-text-muted);font-size:.85em}.me-item-form{display:flex;flex-direction:column;gap:10px;padding:4px 2px}.me-item-form .form-field{display:flex;flex-direction:column;gap:4px}.me-item-form .form-label{font-size:.85em;color:var(--dm-text-muted)}.me-form-section{margin:12px 0 2px;padding-top:10px;border-top:1px solid var(--dm-border-light, rgba(0,0,0,.15));font-size:.78em;text-transform:uppercase;letter-spacing:.06em;color:var(--dm-text-muted)}.me-item-form .me-form-section:first-child{margin-top:0;padding-top:0;border-top:0}.me-item-form .me-colour-hex{width:48px;height:32px;padding:2px}.me-item-form .me-field-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.me-item-form .me-field-grid .form-field{margin:0}.me-item-form .me-icon-field{display:flex;align-items:center;gap:8px}.me-item-form .me-icon-field .form-input{flex:1}.me-item-form .me-icon-preview{width:24px;height:24px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;color:var(--dm-text-muted)}
@@ -1 +1 @@
1
- .dashboard-grid{display:flex;flex-direction:column;gap:var(--dm-spacing-4, 16px)}.dash-row{display:grid;gap:var(--dm-spacing-4, 16px)}.dash-row-kpi{grid-template-columns:repeat(4,1fr)}.dash-row-traffic{grid-template-columns:2fr 1fr}.dash-row-content,.dash-row-health{grid-template-columns:1fr 1fr}@media(max-width:960px){.dash-row-kpi{grid-template-columns:repeat(2,1fr)}.dash-row-traffic,.dash-row-content,.dash-row-health{grid-template-columns:1fr}}.dash-card{background:var(--dm-surface, #fff);border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius, 8px);padding:var(--dm-spacing-4, 16px)}.dash-kpi{display:flex;align-items:center;gap:var(--dm-spacing-3, 12px)}.dash-kpi-icon{font-size:24px;opacity:.8}.dash-kpi-value{font-size:28px;font-weight:600;line-height:1}.dash-kpi-label{font-size:12px;color:var(--dm-muted, #6b7280);text-transform:uppercase;letter-spacing:.05em}.dash-kpi-delta{font-size:12px;margin-top:4px}.dash-kpi-delta.up{color:var(--dm-success, #16a34a)}.dash-kpi-delta.down{color:var(--dm-danger, #dc2626)}.dash-health-pill{display:inline-flex;align-items:center;gap:6px}.dash-health-pill[data-level=ok]{color:var(--dm-success, #16a34a)}.dash-health-pill[data-level=warn]{color:var(--dm-warning, #d97706)}.dash-health-pill[data-level=fail]{color:var(--dm-danger, #dc2626)}.dash-spike-row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px dashed var(--dm-border, #e5e7eb)}.dash-spike-row:last-child{border-bottom:0}.dash-spark{display:inline-block;width:80px;height:24px;vertical-align:middle;margin-left:8px}.dash-warnings{background:var(--dm-warning-bg, #fef3c7);border:1px solid var(--dm-warning, #d97706);color:var(--dm-warning-fg, #78350f);padding:8px 12px;border-radius:var(--dm-radius, 8px);margin-bottom:12px}.dash-updated{font-size:12px;color:var(--dm-muted, #6b7280);margin-right:8px}.dash-journey-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}@media(max-width:720px){.dash-journey-grid{grid-template-columns:1fr}}.dash-journey-grid h4{font-size:12px;text-transform:uppercase;color:var(--dm-muted, #6b7280);margin:0 0 6px}.dash-bounce{margin-top:12px;font-size:14px;color:var(--dm-muted, #6b7280)}.dash-empty{font-size:13px;color:var(--dm-muted, #6b7280);margin:8px 0 0}.dash-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.dash-card-header h3{margin:0}.dash-cache-toggle{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--dm-muted, #6b7280);cursor:pointer}.dash-cache-toggle input[type=checkbox]{transform:scale(1.2);cursor:pointer}.dash-cache-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:12px}@media(max-width:720px){.dash-cache-grid{grid-template-columns:repeat(2,1fr)}}.dash-cache-stat-label{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--dm-muted, #6b7280);margin-bottom:4px}.dash-cache-stat-value{font-size:22px;font-weight:600;line-height:1.1}.dash-cache-stat-sub{font-size:12px;color:var(--dm-muted, #6b7280);margin-top:4px;min-height:14px}[data-field=size-bar]{height:4px;background:var(--dm-border, #e5e7eb);border-radius:2px;overflow:hidden;margin-top:6px}[data-field=size-fill]{display:block;height:100%;background:var(--dm-primary, #2563eb);width:0;transition:width .3s ease}.dash-cache-actions{display:flex;gap:8px;justify-content:flex-end}.dash-chart-wrap{position:relative;height:240px}.dash-chart-wrap>canvas{position:absolute;inset:0}
1
+ .dashboard-grid{display:flex;flex-direction:column;gap:16px}.dash-row{display:grid;gap:16px}.dash-row-kpi{grid-template-columns:repeat(4,1fr)}.dash-row-traffic{grid-template-columns:2fr 1fr}.dash-row-content,.dash-row-health{grid-template-columns:1fr 1fr}@media(max-width:960px){.dash-row-kpi{grid-template-columns:repeat(2,1fr)}.dash-row-traffic,.dash-row-content,.dash-row-health{grid-template-columns:1fr}}.dash-card{background:var(--dm-surface, #fff);border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius-md, 8px);padding:16px}.dash-kpi{display:flex;align-items:center;gap:12px}.dash-kpi-icon{font-size:24px;opacity:.8}.dash-kpi-value{font-size:28px;font-weight:600;line-height:1}.dash-kpi-label{font-size:12px;color:var(--dm-text-muted, #6b7280);text-transform:uppercase;letter-spacing:.05em}.dash-kpi-delta{font-size:12px;margin-top:4px}.dash-kpi-delta.up{color:var(--dm-success, #16a34a)}.dash-kpi-delta.down{color:var(--dm-danger, #dc2626)}.dash-health-pill{display:inline-flex;align-items:center;gap:6px}.dash-health-pill[data-level=ok]{color:var(--dm-success, #16a34a)}.dash-health-pill[data-level=warn]{color:var(--dm-warning, #d97706)}.dash-health-pill[data-level=fail]{color:var(--dm-danger, #dc2626)}.dash-spike-row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px dashed var(--dm-border, #e5e7eb)}.dash-spike-row:last-child{border-bottom:0}.dash-spark{display:inline-block;width:80px;height:24px;vertical-align:middle;margin-left:8px}.dash-warnings{background:var(--dm-warning-bg, #fef3c7);border:1px solid var(--dm-warning, #d97706);color:var(--dm-warning-dark, #78350f);padding:8px 12px;border-radius:var(--dm-radius-md, 8px);margin-bottom:12px}.dash-updated{font-size:12px;color:var(--dm-text-muted, #6b7280);margin-right:8px}.dash-journey-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}@media(max-width:720px){.dash-journey-grid{grid-template-columns:1fr}}.dash-journey-grid h4{font-size:12px;text-transform:uppercase;color:var(--dm-text-muted, #6b7280);margin:0 0 6px}.dash-bounce{margin-top:12px;font-size:14px;color:var(--dm-text-muted, #6b7280)}.dash-empty{font-size:13px;color:var(--dm-text-muted, #6b7280);margin:8px 0 0}.dash-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.dash-card-header h3{margin:0}.dash-cache-toggle{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--dm-text-muted, #6b7280);cursor:pointer}.dash-cache-toggle input[type=checkbox]{transform:scale(1.2);cursor:pointer}.dash-cache-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:12px}@media(max-width:720px){.dash-cache-grid{grid-template-columns:repeat(2,1fr)}}.dash-cache-stat-label{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--dm-text-muted, #6b7280);margin-bottom:4px}.dash-cache-stat-value{font-size:22px;font-weight:600;line-height:1.1}.dash-cache-stat-sub{font-size:12px;color:var(--dm-text-muted, #6b7280);margin-top:4px;min-height:14px}[data-field=size-bar]{height:4px;background:var(--dm-border, #e5e7eb);border-radius:2px;overflow:hidden;margin-top:6px}[data-field=size-fill]{display:block;height:100%;background:var(--dm-primary, #2563eb);width:0;transition:width .3s ease}.dash-cache-actions{display:flex;gap:8px;justify-content:flex-end}.dash-chart-wrap{position:relative;height:240px}.dash-chart-wrap>canvas{position:absolute;inset:0}
@@ -1,7 +1,7 @@
1
- const F=[{key:"header-body",group:"Basic",label:"Header + Body",thumb:"\u25A4"},{key:"basic",group:"Basic",label:"Body only",thumb:"\u25AD"},{key:"header-body-footer",group:"Basic",label:"Header + Body + Footer",thumb:"\u2630"},{key:"no-header-footer",group:"Basic",label:"Body + Footer (no header)",thumb:"\u25A5"},{key:"icon-top",group:"Icon",label:"Icon top (stacked)",thumb:"\u2B06\u2605"},{key:"icon-inline",group:"Icon",label:"Icon inline",thumb:"\u2605\u25B6"},{key:"image-top",group:"Image",label:"Image top",thumb:"\u{1F5BC}"},{key:"image-overlay",group:"Image",label:"Image + overlay title",thumb:"\u{1F5BC}\u2726"},{key:"thumb-left",group:"Image",label:"Thumbnail left",thumb:"\u{1F5BC}\u2590"},{key:"thumb-right",group:"Image",label:"Thumbnail right",thumb:"\u258C\u{1F5BC}"},{key:"wide-left-image",group:"Image",label:"Wide image left",thumb:"\u{1F5BC}\u258D"},{key:"full-bg",group:"Image",label:"Full background",thumb:"\u{1F5BC}"},{key:"split-half",group:"Image",label:"Split half",thumb:"\u2592\u2590"},{key:"avatar-profile",group:"People",label:"Avatar / Profile",thumb:"\u{1F464}"},{key:"stat-metric",group:"People",label:"Stat / Metric",thumb:"\u{1F4CA}"},{key:"quote-testimonial",group:"People",label:"Quote / Testimonial",thumb:"\u201C"},{key:"rating-review",group:"People",label:"Rating / Review",thumb:"\u2605"},{key:"activity-feed",group:"People",label:"Activity feed",thumb:"\u{1F514}"},{key:"callout",group:"Content",label:"Callout",thumb:"\u{1F4A1}"},{key:"code-snippet",group:"Content",label:"Code snippet",thumb:"</>"},{key:"file-document",group:"Content",label:"File / Document",thumb:"\u{1F4C4}"},{key:"tag-cloud",group:"Content",label:"Tag cloud",thumb:"\u{1F3F7}"},{key:"video-media",group:"Media",label:"Video / Media",thumb:"\u25B6"},{key:"location-map",group:"Special",label:"Location / Map",thumb:"\u{1F4CD}"},{key:"step-numbered",group:"Special",label:"Step / Numbered",thumb:"\u2460"},{key:"corner-badge",group:"Special",label:"Corner badge",thumb:"\u{1F3F7}"},{key:"badge-band",group:"Special",label:"Badge band",thumb:"\u2B1B"},{key:"glass-gradient-border",group:"Special",label:"Glass gradient border",thumb:"\u25C8"},{key:"timeline-entry",group:"Special",label:"Timeline entry",thumb:"\u2022\u2014"},{key:"before-after",group:"Compare",label:"Before / After",thumb:"\u2194"},{key:"pricing",group:"Compare",label:"Pricing card",thumb:"\xA3"},{key:"feature-comparison",group:"Compare",label:"Feature comparison",thumb:"\u2611"},{key:"progress-goal",group:"Compare",label:"Progress / Goal",thumb:"\u25B0"}],M=["clean","gradient","glass","accent","dark","glow"],R=["indigo","ocean","sunset","forest","rose","midnight","aurora","fire","lagoon","dusk","lime","gold","arctic","slate"],B={indigo:"#6366f1,#8b5cf6",ocean:"#0891b2,#2563eb",sunset:"#f59e0b,#ef4444",forest:"#10b981,#0d9488",rose:"#fb7185,#e11d48",midnight:"#1e1b4b,#4338ca",aurora:"#06b6d4,#6366f1",fire:"#ef4444,#f97316",lagoon:"#06b6d4,#0e7490",dusk:"#7c3aed,#db2777",lime:"#84cc16,#10b981",gold:"#f59e0b,#b45309",arctic:"#bae6fd,#e0f2fe",slate:"#475569,#1e293b"};function j(e){return typeof I>"u"||typeof I.list!="function"?[]:!e||e==="all"?I.list():I.list(e)}function O(){const e=typeof I<"u"&&I._categories?I._categories:null,t=[{slug:"all",label:"All icons"}];return e&&Object.keys(e).forEach(o=>{t.push({slug:o,label:e[o].name||o})}),t}function N(e,t){const o=j(e),n=(t||"").trim().toLowerCase();return n?o.filter(i=>i.toLowerCase().includes(n)):o}let C=null,a=null,w=null,$=null;export const CardBuilder={open(e,t={}){C||(w=e,$=t,a={layout:"header-body",variant:"clean",gradient:"indigo",title:"",subtitle:"",icon:"",iconLayout:"inline",image:"",body:"",footer:"",hover:!1,collapsible:!1,value:"",delta:"",progress:"50",price:"",period:"",lang:"JavaScript",filename:"",filesize:"",filetype:"PDF",rating:"5",duration:"",address:"",step:"1",badge:"New",tags:"",calloutType:"info",font:"",fontSize:"",borderless:!1,shadow:"",rounded:"",textAlign:"",padding:""},G())},close(){S()}};function T(){const e=a,t=[];e.layout!=="header-body"&&t.push(`layout="${e.layout}"`),e.title&&t.push(`title="${e.title}"`),e.subtitle&&t.push(`subtitle="${e.subtitle}"`),e.icon&&t.push(`icon="${e.icon}"`),e.icon&&e.iconLayout==="stacked"&&t.push('icon-layout="stacked"'),e.image&&t.push(`image="${e.image}"`),e.variant!=="clean"&&t.push(`variant="${e.variant}"`),e.variant==="gradient"&&e.gradient!=="indigo"&&t.push(`gradient="${e.gradient}"`),e.hover&&t.push("hover"),e.collapsible&&t.push('collapsible="true"'),e.font&&t.push(`font="${e.font}"`),e.fontSize&&t.push(`font-size="${e.fontSize}"`),e.borderless&&t.push("borderless"),e.shadow&&t.push(`shadow="${e.shadow}"`),e.rounded&&t.push(`rounded="${e.rounded}"`),e.textAlign&&t.push(`text-align="${e.textAlign}"`),e.padding&&t.push(`padding="${e.padding}"`),e.footer&&!["pricing","feature-comparison","activity-feed","before-after","progress-goal"].includes(e.layout)&&t.push(`footer="${e.footer}"`);const o={"stat-metric":()=>{e.value&&t.push(`value="${e.value}"`),e.delta&&t.push(`delta="${e.delta}"`),e.progress&&t.push(`progress="${e.progress}"`)},pricing:()=>{e.price&&t.push(`price="${e.price}"`),e.period&&t.push(`period="${e.period}"`)},"code-snippet":()=>t.push(`lang="${e.lang}"`),"file-document":()=>{t.push(`filename="${e.filename}"`),e.filesize&&t.push(`filesize="${e.filesize}"`),e.filetype&&t.push(`filetype="${e.filetype}"`)},"rating-review":()=>t.push(`rating="${e.rating}"`),"video-media":()=>{e.duration&&t.push(`duration="${e.duration}"`)},"location-map":()=>{e.address&&t.push(`address="${e.address}"`)},"step-numbered":()=>t.push(`step="${e.step}"`),"corner-badge":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"badge-band":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"tag-cloud":()=>{e.tags&&t.push(`tags="${e.tags}"`)},"avatar-profile":()=>{e.tags&&t.push(`tags="${e.tags}"`)},callout:()=>{e.calloutType&&t.push(`callout-type="${e.calloutType}"`)},"split-half":()=>{}};o[e.layout]&&o[e.layout]();const n=t.length?" "+t.join(" "):"",i=e.body.trim()||"Content here.",l={"before-after":`[before]Before item 1 \xB7 Before item 2[/before]
1
+ import{replaceRange as F}from"./markdown-toolbar.js";const R=[{key:"header-body",group:"Basic",label:"Header + Body",thumb:"\u25A4"},{key:"basic",group:"Basic",label:"Body only",thumb:"\u25AD"},{key:"header-body-footer",group:"Basic",label:"Header + Body + Footer",thumb:"\u2630"},{key:"no-header-footer",group:"Basic",label:"Body + Footer (no header)",thumb:"\u25A5"},{key:"icon-top",group:"Icon",label:"Icon top (stacked)",thumb:"\u2B06\u2605"},{key:"icon-inline",group:"Icon",label:"Icon inline",thumb:"\u2605\u25B6"},{key:"image-top",group:"Image",label:"Image top",thumb:"\u{1F5BC}"},{key:"image-overlay",group:"Image",label:"Image + overlay title",thumb:"\u{1F5BC}\u2726"},{key:"thumb-left",group:"Image",label:"Thumbnail left",thumb:"\u{1F5BC}\u2590"},{key:"thumb-right",group:"Image",label:"Thumbnail right",thumb:"\u258C\u{1F5BC}"},{key:"wide-left-image",group:"Image",label:"Wide image left",thumb:"\u{1F5BC}\u258D"},{key:"full-bg",group:"Image",label:"Full background",thumb:"\u{1F5BC}"},{key:"split-half",group:"Image",label:"Split half",thumb:"\u2592\u2590"},{key:"avatar-profile",group:"People",label:"Avatar / Profile",thumb:"\u{1F464}"},{key:"stat-metric",group:"People",label:"Stat / Metric",thumb:"\u{1F4CA}"},{key:"quote-testimonial",group:"People",label:"Quote / Testimonial",thumb:"\u201C"},{key:"rating-review",group:"People",label:"Rating / Review",thumb:"\u2605"},{key:"activity-feed",group:"People",label:"Activity feed",thumb:"\u{1F514}"},{key:"callout",group:"Content",label:"Callout",thumb:"\u{1F4A1}"},{key:"code-snippet",group:"Content",label:"Code snippet",thumb:"</>"},{key:"file-document",group:"Content",label:"File / Document",thumb:"\u{1F4C4}"},{key:"tag-cloud",group:"Content",label:"Tag cloud",thumb:"\u{1F3F7}"},{key:"video-media",group:"Media",label:"Video / Media",thumb:"\u25B6"},{key:"location-map",group:"Special",label:"Location / Map",thumb:"\u{1F4CD}"},{key:"step-numbered",group:"Special",label:"Step / Numbered",thumb:"\u2460"},{key:"corner-badge",group:"Special",label:"Corner badge",thumb:"\u{1F3F7}"},{key:"badge-band",group:"Special",label:"Badge band",thumb:"\u2B1B"},{key:"glass-gradient-border",group:"Special",label:"Glass gradient border",thumb:"\u25C8"},{key:"timeline-entry",group:"Special",label:"Timeline entry",thumb:"\u2022\u2014"},{key:"before-after",group:"Compare",label:"Before / After",thumb:"\u2194"},{key:"pricing",group:"Compare",label:"Pricing card",thumb:"\xA3"},{key:"feature-comparison",group:"Compare",label:"Feature comparison",thumb:"\u2611"},{key:"progress-goal",group:"Compare",label:"Progress / Goal",thumb:"\u25B0"}],M=["clean","gradient","glass","accent","dark","glow"],j=["indigo","ocean","sunset","forest","rose","midnight","aurora","fire","lagoon","dusk","lime","gold","arctic","slate"],B={indigo:"#6366f1,#8b5cf6",ocean:"#0891b2,#2563eb",sunset:"#f59e0b,#ef4444",forest:"#10b981,#0d9488",rose:"#fb7185,#e11d48",midnight:"#1e1b4b,#4338ca",aurora:"#06b6d4,#6366f1",fire:"#ef4444,#f97316",lagoon:"#06b6d4,#0e7490",dusk:"#7c3aed,#db2777",lime:"#84cc16,#10b981",gold:"#f59e0b,#b45309",arctic:"#bae6fd,#e0f2fe",slate:"#475569,#1e293b"};function O(e){return typeof I>"u"||typeof I.list!="function"?[]:!e||e==="all"?I.list():I.list(e)}function N(){const e=typeof I<"u"&&I._categories?I._categories:null,t=[{slug:"all",label:"All icons"}];return e&&Object.keys(e).forEach(o=>{t.push({slug:o,label:e[o].name||o})}),t}function q(e,t){const o=O(e),n=(t||"").trim().toLowerCase();return n?o.filter(i=>i.toLowerCase().includes(n)):o}let C=null,a=null,z=null,$=null;export const CardBuilder={open(e,t={}){C||(z=e,$=t,a={layout:"header-body",variant:"clean",gradient:"indigo",title:"",subtitle:"",icon:"",iconLayout:"inline",image:"",body:"",footer:"",hover:!1,collapsible:!1,value:"",delta:"",progress:"50",price:"",period:"",lang:"JavaScript",filename:"",filesize:"",filetype:"PDF",rating:"5",duration:"",address:"",step:"1",badge:"New",tags:"",calloutType:"info",font:"",fontSize:"",borderless:!1,shadow:"",rounded:"",textAlign:"",padding:""},H())},close(){E()}};function T(){const e=a,t=[];e.layout!=="header-body"&&t.push(`layout="${e.layout}"`),e.title&&t.push(`title="${e.title}"`),e.subtitle&&t.push(`subtitle="${e.subtitle}"`),e.icon&&t.push(`icon="${e.icon}"`),e.icon&&e.iconLayout==="stacked"&&t.push('icon-layout="stacked"'),e.image&&t.push(`image="${e.image}"`),e.variant!=="clean"&&t.push(`variant="${e.variant}"`),e.variant==="gradient"&&e.gradient!=="indigo"&&t.push(`gradient="${e.gradient}"`),e.hover&&t.push("hover"),e.collapsible&&t.push('collapsible="true"'),e.font&&t.push(`font="${e.font}"`),e.fontSize&&t.push(`font-size="${e.fontSize}"`),e.borderless&&t.push("borderless"),e.shadow&&t.push(`shadow="${e.shadow}"`),e.rounded&&t.push(`rounded="${e.rounded}"`),e.textAlign&&t.push(`text-align="${e.textAlign}"`),e.padding&&t.push(`padding="${e.padding}"`),e.footer&&!["pricing","feature-comparison","activity-feed","before-after","progress-goal"].includes(e.layout)&&t.push(`footer="${e.footer}"`);const o={"stat-metric":()=>{e.value&&t.push(`value="${e.value}"`),e.delta&&t.push(`delta="${e.delta}"`),e.progress&&t.push(`progress="${e.progress}"`)},pricing:()=>{e.price&&t.push(`price="${e.price}"`),e.period&&t.push(`period="${e.period}"`)},"code-snippet":()=>t.push(`lang="${e.lang}"`),"file-document":()=>{t.push(`filename="${e.filename}"`),e.filesize&&t.push(`filesize="${e.filesize}"`),e.filetype&&t.push(`filetype="${e.filetype}"`)},"rating-review":()=>t.push(`rating="${e.rating}"`),"video-media":()=>{e.duration&&t.push(`duration="${e.duration}"`)},"location-map":()=>{e.address&&t.push(`address="${e.address}"`)},"step-numbered":()=>t.push(`step="${e.step}"`),"corner-badge":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"badge-band":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"tag-cloud":()=>{e.tags&&t.push(`tags="${e.tags}"`)},"avatar-profile":()=>{e.tags&&t.push(`tags="${e.tags}"`)},callout:()=>{e.calloutType&&t.push(`callout-type="${e.calloutType}"`)},"split-half":()=>{}};o[e.layout]&&o[e.layout]();const n=t.length?" "+t.join(" "):"",i=e.body.trim()||"Content here.",l={"before-after":`[before]Before item 1 \xB7 Before item 2[/before]
2
2
  [after]After item 1 \xB7 After item 2[/after]`,pricing:`[feature]Feature one[/feature]
3
3
  [feature]Feature two[/feature]`,"feature-comparison":`[feature]Included feature[/feature]
4
4
  [feature excluded]Excluded feature[/feature]`,"activity-feed":'[activity user="Alice" action="published a page" time="2 min ago"]',"progress-goal":`[milestone done]Phase 1[/milestone]
5
5
  [milestone]Phase 2[/milestone]`}[e.layout]||i;return`[card${n}]
6
6
  ${l}
7
- [/card]`}function S(){C&&(C.remove(),C=null,a=null)}function q(){const e=T(),t=w.selectionStart,o=w.selectionEnd;w.value=w.value.slice(0,t)+e+w.value.slice(o),w.selectionStart=w.selectionEnd=t+e.length,w.dispatchEvent(new Event("input",{bubbles:!0})),w.focus(),S()}function G(){C=document.createElement("div"),Object.assign(C.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"9999",padding:"24px",isolation:"isolate"});const e=document.createElement("div");Object.assign(e.style,{background:"var(--dm-surface,#1e293b)",border:"1px solid var(--dm-border,#334155)",borderRadius:"14px",width:"100%",maxWidth:"860px",maxHeight:"90vh",display:"flex",flexDirection:"column",boxShadow:"0 24px 64px rgba(0,0,0,.6)",overflow:"hidden"});const t=r("div","display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid var(--dm-border,#334155);flex-shrink:0"),o=r("span","font-weight:700;color:var(--dm-text,#f1f5f9);font-size:14px");o.textContent="Insert Card";const n=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");n.textContent="\u2715",n.addEventListener("click",S),t.appendChild(o),t.appendChild(n);const i=r("div","display:grid;grid-template-columns:280px 1fr;flex:1;overflow:hidden");i.appendChild(H()),i.appendChild(le());const d=r("div","display:flex;justify-content:flex-end;gap:10px;padding:12px 20px;border-top:1px solid var(--dm-border,#334155);flex-shrink:0"),l=r("button","padding:8px 18px;border-radius:8px;border:none;background:var(--dm-border,#334155);color:var(--dm-text-muted,#94a3b8);font-size:12px;font-weight:700;cursor:pointer");l.textContent="Cancel",l.addEventListener("click",S);const g=r("button","padding:8px 18px;border-radius:8px;border:none;background:#6366f1;color:#fff;font-size:12px;font-weight:700;cursor:pointer");g.textContent="Insert Card",g.addEventListener("click",q),d.appendChild(l),d.appendChild(g),e.appendChild(t),e.appendChild(i),e.appendChild(d),C.appendChild(e),C.addEventListener("click",b=>{b.target===C&&S()}),document.body.appendChild(C),D(),x()}function r(e,t=""){const o=document.createElement(e);return t&&(o.style.cssText=t),o}const E="padding:7px 10px;border-radius:7px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:12px;font-family:inherit;width:100%";function H(){const e=r("div","padding:18px;border-right:1px solid var(--dm-border,#334155);display:flex;flex-direction:column;gap:14px;overflow-y:auto");e.appendChild(s("Layout",U()));const t=r("div","display:contents");t.id="cb-dyn-fields",e.appendChild(t),e.appendChild(A()),e.appendChild(s("Style",Y()));const o=r("div");return o.id="cb-grad-wrap",o.style.display=a.variant==="gradient"?"":"none",o.appendChild(s("Gradient",V())),e.appendChild(o),e.appendChild(s("Options",W())),e.appendChild(A()),e.appendChild(X()),e}function U(){const e=r("select",E+";cursor:pointer"),t={};return F.forEach(o=>{(t[o.group]=t[o.group]||[]).push(o)}),Object.entries(t).forEach(([o,n])=>{const i=document.createElement("optgroup");i.label=o,n.forEach(d=>{const l=document.createElement("option");l.value=d.key,l.textContent=`${d.thumb} ${d.label}`,d.key===a.layout&&(l.selected=!0),i.appendChild(l)}),e.appendChild(i)}),e.addEventListener("change",()=>{a.layout=e.value,D(),x()}),e}function Y(){const e=r("div","display:grid;grid-template-columns:repeat(3,1fr);gap:5px"),t={clean:"background:#f8fafc;color:#374151;border:2px solid #e2e8f0",gradient:"background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border:2px solid transparent",glass:"background:rgba(255,255,255,.06);color:#94a3b8;border:2px dashed #334155",accent:"background:#fff;color:#4338ca;border-left:4px solid #6366f1;border-top:2px solid #e2e8f0;border-right:2px solid #e2e8f0;border-bottom:2px solid #e2e8f0",dark:"background:#0f172a;color:#818cf8;border:2px solid #334155",glow:"color:#818cf8;border:2px solid #6366f1;box-shadow:0 0 6px rgba(99,102,241,.4)"};return M.forEach(o=>{const n=r("div",`padding:6px 4px;border-radius:7px;font-size:10px;font-weight:700;text-align:center;cursor:pointer;${t[o]}`);n.textContent=o.charAt(0).toUpperCase()+o.slice(1),n.dataset.variant=o,o===a.variant&&(n.style.outline="2px solid #6366f1"),n.addEventListener("click",()=>{a.variant=o,e.querySelectorAll("[data-variant]").forEach(d=>{d.style.outline=""}),n.style.outline="2px solid #6366f1";const i=document.getElementById("cb-grad-wrap");i&&(i.style.display=o==="gradient"?"":"none"),x()}),e.appendChild(n)}),e}function V(){const e=r("div","display:flex;flex-wrap:wrap;gap:7px");return R.forEach(t=>{const[o,n]=(B[t]||"#6366f1,#8b5cf6").split(","),i=r("div",`width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,${o},${n});cursor:pointer;border:2px solid transparent;transition:border-color .15s`);i.title=t,t===a.gradient&&(i.style.borderColor="#fff"),i.addEventListener("click",()=>{a.gradient=t,e.querySelectorAll("div").forEach(d=>{d.style.borderColor="transparent"}),i.style.borderColor="#fff",x()}),e.appendChild(i)}),e}function W(){const e=r("div","display:flex;gap:6px");return["hover","collapsible"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a[t]),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a[t]=!a[t],n(a[t]),x()}),e.appendChild(o)}),e}function L(e,t){const o=r("select",E+";cursor:pointer");return t.forEach(([n,i])=>{const d=document.createElement("option");d.value=n,d.textContent=i,n===a[e]&&(d.selected=!0),o.appendChild(d)}),o.addEventListener("change",()=>{a[e]=o.value,x()}),o}function J(e,t){const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};return n(a[e]),o.textContent=t,o.addEventListener("click",()=>{a[e]=!a[e],n(a[e]),x()}),o}function Q(){const e=r("div","display:flex;gap:6px");return[["","Left"],["center","Centre"],["right","Right"]].forEach(([t,o])=>{const n=r("div"),i=d=>{n.style.cssText=`flex:1;padding:5px 4px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${d?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};i(a.textAlign===t),n.textContent=o,n.addEventListener("click",()=>{a.textAlign=t,e.querySelectorAll("div").forEach((d,l)=>i([["","Left"],["center","Centre"],["right","Right"]][l][0]===t)),x()}),e.appendChild(n)}),e}function X(){const e=r("div","display:flex;flex-direction:column;gap:14px"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");t.textContent="Presentation",e.appendChild(t);const o=r("div","display:grid;grid-template-columns:1fr 1fr;gap:10px"),n=(d,l)=>{const g=r("div","display:flex;flex-direction:column;gap:5px"),b=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");b.textContent=d,g.appendChild(b),g.appendChild(l),o.appendChild(g)};n("Font",L("font",[["","Default"],["serif","Serif"],["mono","Mono"]])),n("Size",L("fontSize",[["","Default"],["sm","Small"],["lg","Large"],["xl","XL"]])),n("Shadow",L("shadow",[["","Default"],["none","None"],["md","Medium"],["lg","Large"]])),n("Padding",L("padding",[["","Default"],["compact","Compact"],["spacious","Spacious"]])),n("Corners",L("rounded",[["","Default"],["none","Square"],["sm","Small"],["lg","Large"],["full","Full"]])),e.appendChild(o),e.appendChild(s("Align",Q()));const i=r("div","display:flex;gap:6px");return i.appendChild(J("borderless","Borderless")),e.appendChild(i),e}function s(e,t){const o=r("div","display:flex;flex-direction:column;gap:5px"),n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");return n.textContent=e,o.appendChild(n),o.appendChild(t),o}function A(){return r("div","height:1px;background:var(--dm-border,#334155);margin:2px 0")}function f(e,t){const o=r("input",E);return o.type="text",t&&(o.placeholder=t),o.value=a[e]||"",o.addEventListener("input",()=>{a[e]=o.value,x()}),o}function Z(e,t){const o=r("select",E+";cursor:pointer");return t.forEach(n=>{const i=document.createElement("option");i.value=n,i.textContent=n,n===a[e]&&(i.selected=!0),o.appendChild(i)}),o.addEventListener("change",()=>{a[e]=o.value,x()}),o}const K={"icon-top":["subtitle","icon","iconLayout"],"icon-inline":["subtitle","icon","iconLayout"],"image-top":["image"],"image-overlay":["image"],"thumb-left":["image"],"thumb-right":["image"],"wide-left-image":["image"],"full-bg":["image"],"split-half":["image"],"avatar-profile":["subtitle","icon","tags"],"stat-metric":["value","delta","progress"],"quote-testimonial":["subtitle","icon"],callout:["calloutType","icon"],"video-media":["image","duration"],"location-map":["address"],"step-numbered":["step"],"corner-badge":["icon","badge"],"badge-band":["icon","badge"],"rating-review":["rating","subtitle","icon"],"tag-cloud":["tags"],"activity-feed":[],"code-snippet":["lang"],"file-document":["filename","filesize","filetype"],"before-after":[],pricing:["price","period"],"feature-comparison":["subtitle"],"progress-goal":["progress"],"timeline-entry":["subtitle","badge"],"glass-gradient-border":[]},ee=new Set(["basic","no-header-footer","code-snippet","file-document","stat-metric"]),te=new Set(["stat-metric","file-document"]),oe=new Set(["pricing","feature-comparison","activity-feed","before-after","progress-goal"]);function D(){const e=document.getElementById("cb-dyn-fields");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);const t=a.layout,o=K[t]||[];ee.has(t)||e.appendChild(s("Title",f("title","Card heading"))),o.forEach(n=>{const i={subtitle:()=>s("Subtitle",f("subtitle","Secondary line")),icon:()=>s("Icon",ne()),iconLayout:()=>s("Icon layout",ie()),image:()=>s("Image",de()),value:()=>s("Value",f("value","\xA324,980")),delta:()=>s("Delta",f("delta","\u2191 12.4%")),progress:()=>s("Progress %",f("progress","50")),price:()=>s("Price",f("price","\xA329")),period:()=>s("Period",f("period","per month")),lang:()=>s("Language",f("lang","JavaScript")),filename:()=>s("Filename",f("filename","document.pdf")),filesize:()=>s("File size",f("filesize","2.4 MB")),filetype:()=>s("File type",f("filetype","PDF")),rating:()=>s("Rating (1\u20135)",f("rating","5")),duration:()=>s("Duration",f("duration","4:32")),address:()=>s("Address",f("address","12 Main St")),step:()=>s("Step number",f("step","1")),badge:()=>s("Badge label",f("badge","New")),tags:()=>s("Tags (comma-separated)",f("tags","Design, CSS")),calloutType:()=>s("Type",Z("calloutType",["info","warn","success","error"]))};i[n]&&e.appendChild(i[n]())}),te.has(t)||e.appendChild(s("Body content",re())),oe.has(t)||e.appendChild(s("Footer",f("footer","")))}function re(){const e=r("textarea",E+";resize:vertical;min-height:60px;line-height:1.5");return e.value=a.body||"",e.addEventListener("input",()=>{a.body=e.value,x()}),e}function ne(){const e=r("div","display:flex;gap:6px"),t=r("input",E+";flex:1");t.type="text",t.placeholder="icon name",t.value=a.icon||"",t.addEventListener("input",()=>{a.icon=t.value,x()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse icons",o.textContent="\u2605",o.addEventListener("click",()=>P(n=>{a.icon=n,t.value=n,x()})),e.appendChild(t),e.appendChild(o),e}function ie(){const e=r("div","display:flex;gap:6px");return["inline","stacked"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a.iconLayout===t),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a.iconLayout=t,e.querySelectorAll("div").forEach((i,d)=>n(["inline","stacked"][d]===t)),x()}),e.appendChild(o)}),e}function ae(){return new Promise(async e=>{let t=[];$&&typeof $.onMediaBrowse=="function"&&(t=await $.onMediaBrowse()||[]);const o=document.createElement("dialog");o.style.cssText="margin:auto;padding:0;border:none;border-radius:12px;background:var(--dm-surface,#1e293b);width:min(700px,95vw);max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 25px 60px rgba(0,0,0,.5)";const n=document.createElement("style");n.textContent="dialog.cb-media-picker::backdrop{background:rgba(0,0,0,.75)}",o.className="cb-media-picker";const i=m=>{o.close(),o.remove(),n.remove(),e(m)},d=r("div","display:flex;justify-content:space-between;align-items:center;flex-shrink:0;padding:16px 20px;border-bottom:1px solid var(--dm-border,#334155)"),l=r("div","font-weight:700;font-size:14px;color:var(--dm-text,#f1f5f9)");l.textContent="Select Image";const g=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");g.textContent="\xD7",g.addEventListener("click",()=>i(null)),o.addEventListener("cancel",()=>i(null)),d.appendChild(l),d.appendChild(g);const b=r("div","padding:16px;overflow-y:auto;flex:1"),v=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px"),y=t.filter(m=>/\.(png|jpe?g|gif|webp|svg)$/i.test(m.name||""));if(y.length)y.forEach(m=>{const c=r("div","display:flex;flex-direction:column;gap:6px;cursor:pointer;border:2px solid transparent;border-radius:8px;padding:6px"),h=document.createElement("img");h.src=m.url,h.alt=m.name||"",h.style.cssText="width:100%;height:80px;object-fit:cover;border-radius:6px;display:block";const p=r("div","font-size:9px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--dm-text-muted,#94a3b8)");p.textContent=m.name||m.url,c.appendChild(h),c.appendChild(p),c.addEventListener("mouseenter",()=>{c.style.borderColor="#6366f1"}),c.addEventListener("mouseleave",()=>{c.style.borderColor="transparent"}),c.addEventListener("click",()=>i(m.url)),v.appendChild(c)});else{const m=r("div","color:var(--dm-text-muted,#94a3b8);font-size:13px;padding:20px;text-align:center");m.textContent="No images uploaded yet.",v.appendChild(m)}b.appendChild(v),o.appendChild(d),o.appendChild(b),document.head.appendChild(n),document.body.appendChild(o),o.showModal()})}function de(){const e=r("div","display:flex;gap:6px"),t=r("input",E+";flex:1");t.type="text",t.placeholder="/media/image.jpg",t.value=a.image||"",t.addEventListener("input",()=>{a.image=t.value,x()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse media",o.textContent="\u{1F4C1}",o.addEventListener("click",async()=>{const n=await ae();n&&(a.image=n,t.value=n,x())}),e.appendChild(t),e.appendChild(o),e}function le(){const e=r("div","padding:20px;background:var(--dm-surface,#f8fafc);display:flex;flex-direction:column;gap:14px;overflow-y:auto"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--dm-text-muted,#94a3b8)");t.textContent="Live Preview";const o=r("div","flex:1;display:flex;align-items:flex-start;justify-content:center");o.id="cb-preview-area";const n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#94a3b8);margin-bottom:6px");n.textContent="Shortcode";const i=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#334155);border-radius:8px;padding:10px 14px;font-family:monospace;font-size:11px;color:var(--dm-primary,#a5b4fc);line-height:1.8;white-space:pre-wrap;word-break:break-all");return i.id="cb-snippet",e.appendChild(t),e.appendChild(o),e.appendChild(n),e.appendChild(i),e}function x(){const e=document.getElementById("cb-preview-area");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(se());const t=document.getElementById("cb-snippet");t&&(t.textContent=T())}function se(){const e=a,[t,o]=(B[e.gradient]||"#6366f1,#8b5cf6").split(","),n=`linear-gradient(135deg,${t},${o})`,i={clean:"background:var(--dm-surface,#fff);border:1px solid var(--dm-border,#e5e7eb);box-shadow:0 1px 4px rgba(0,0,0,.06)",gradient:`background:${n};color:#fff`,glass:"background:rgba(255,255,255,.12);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.25);box-shadow:0 4px 24px rgba(0,0,0,.12)",accent:"background:var(--dm-surface,#fff);border-top:1px solid var(--dm-border,#e5e7eb);border-right:1px solid var(--dm-border,#e5e7eb);border-bottom:1px solid var(--dm-border,#e5e7eb);border-left:4px solid #6366f1",dark:"background:#0f172a;color:#e2e8f0;border:1px solid #1e293b",glow:"background:var(--dm-surface,#fff);border:1px solid #6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.15),0 0 20px rgba(99,102,241,.3)"},d=e.variant==="gradient"?`background:${n};color:#fff;padding:12px 16px`:"background:var(--dm-border,#f3f4f6);color:var(--dm-text,#111);padding:12px 16px",l=r("div");l.style.cssText=`width:100%;max-width:300px;border-radius:12px;overflow:hidden;font-size:13px;font-family:system-ui,sans-serif;${i[e.variant]||i.clean}`;const g={serif:"Georgia,serif",mono:"'SF Mono','Fira Code',monospace"};e.font&&g[e.font]&&(l.style.fontFamily=g[e.font]);const b={sm:"11px",lg:"15px",xl:"17px"};e.fontSize&&b[e.fontSize]&&(l.style.fontSize=b[e.fontSize]),e.borderless&&(l.style.border="none");const v={none:"none",md:"0 4px 12px rgba(0,0,0,.1)",lg:"0 10px 30px rgba(0,0,0,.18)"};e.shadow&&v[e.shadow]!==void 0&&(l.style.boxShadow=v[e.shadow]);const y={none:"0",sm:"4px",lg:"20px",full:"9999px"};if(e.rounded&&y[e.rounded]!==void 0&&(l.style.borderRadius=y[e.rounded]),e.textAlign&&(l.style.textAlign=e.textAlign),new Set(["image-top","image-overlay","thumb-left","thumb-right","wide-left-image","full-bg","split-half","video-media"]).has(e.layout)){const u=r("div","height:120px;background-size:cover;background-position:center;display:flex;align-items:center;justify-content:center;font-size:2rem;background-color:var(--dm-border,#e2e8f0)");e.image&&(u.style.backgroundImage=`url('${e.image}')`),e.image||(u.textContent="\u{1F5BC}"),l.appendChild(u)}if(!new Set(["basic","no-header-footer","image-overlay","stat-metric","quote-testimonial","activity-feed","before-after","code-snippet","file-document","glass-gradient-border"]).has(e.layout)&&e.title){const u=r("div",d),k=r("div","font-weight:700");k.textContent=e.title,u.appendChild(k),l.appendChild(u)}const h=e.variant==="dark"?"color:#94a3b8;":e.variant==="gradient"?"color:rgba(255,255,255,.85);":"",p=r("div",`padding:13px 16px;${h}`);if(new Set(["before-after","pricing","feature-comparison","activity-feed","progress-goal"]).has(e.layout)){const u=r("em","font-size:11px;color:var(--dm-text-muted,#9ca3af)");u.textContent="Simplified preview \u2014 full render on save.",p.appendChild(u)}else if(e.layout==="stat-metric"){const u=r("div","font-size:2rem;font-weight:800");u.textContent=e.value||"\u2014";const k=r("div","font-size:.8rem;opacity:.7");if(k.textContent=e.title||"",p.appendChild(k),p.appendChild(u),e.delta){const _=r("div","font-size:.78rem;font-weight:600;color:#10b981");_.textContent=e.delta,p.appendChild(_)}}else p.textContent=e.body||"Card body content.";if(e.padding){const u=e.padding==="compact"?"8px 12px":"24px 28px";p.style.padding=u}if(l.appendChild(p),e.footer){const u=e.variant==="gradient"?"rgba(255,255,255,.6)":"var(--dm-text-muted,#9ca3af)",k=r("div",`padding:9px 16px;border-top:1px solid rgba(128,128,128,.15);font-size:11px;color:${u}`);k.textContent=e.footer,l.appendChild(k)}return l}function P(e){const t=r("div","position:fixed;inset:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:10000;padding:24px"),o=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#475569);border-radius:12px;padding:16px;width:100%;max-width:520px;max-height:70vh;display:flex;flex-direction:column;gap:12px"),n=r("div","display:flex;gap:8px;flex-wrap:wrap"),i=r("input","flex:1;min-width:160px;padding:8px 12px;border-radius:8px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:13px;font-family:inherit");i.type="text",i.placeholder="Search icons\u2026";const d=r("select","padding:8px 12px;border-radius:8px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:13px;font-family:inherit;cursor:pointer");O().forEach(({slug:c,label:h})=>{const p=document.createElement("option");p.value=c,p.textContent=h,d.appendChild(p)});const l=r("button","padding:8px 14px;background:var(--dm-border,#334155);border:none;border-radius:8px;color:var(--dm-text-muted,#94a3b8);font-size:12px;cursor:pointer");l.textContent="\u2715 Close",l.addEventListener("click",()=>t.remove()),n.appendChild(i),n.appendChild(d),n.appendChild(l);const g=r("div","font-size:11px;color:var(--dm-text-muted,#94a3b8)"),b=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:6px;overflow-y:auto;max-height:400px");let v=null;const y=r("button","padding:8px 18px;background:#6366f1;border:none;border-radius:8px;color:#fff;font-size:12px;font-weight:700;cursor:pointer;align-self:flex-end");y.textContent="Select an icon";function m(){for(;b.firstChild;)b.removeChild(b.firstChild);const c=N(d.value,i.value);g.textContent=`${c.length} icon${c.length===1?"":"s"}`,c.forEach(h=>{const p=r("div","display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border-radius:8px;cursor:pointer;border:2px solid transparent;background:var(--dm-surface,#0f172a)"),z=document.createElement("span");z.setAttribute("data-icon",h),z.style.fontSize="20px";const u=r("div","font-size:8px;color:var(--dm-text-muted,#475569);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%");u.textContent=h,p.appendChild(z),p.appendChild(u),p.addEventListener("click",()=>{v&&(v.style.borderColor="transparent"),p.style.borderColor="#6366f1",v=p,y.textContent=`Use: ${h}`}),p.addEventListener("dblclick",()=>{e(h),t.remove()}),b.appendChild(p)}),typeof I<"u"&&I.scan&&I.scan(b)}i.addEventListener("input",m),d.addEventListener("change",m),m(),y.addEventListener("click",()=>{if(v){const c=v.querySelector("[data-icon]").getAttribute("data-icon");e(c),t.remove()}}),o.appendChild(n),o.appendChild(g),o.appendChild(b),o.appendChild(y),t.appendChild(o),t.addEventListener("click",c=>{c.target===t&&t.remove()}),document.body.appendChild(t),i.focus()}export function openIconPicker(e){P(e)}
7
+ [/card]`}function E(){C&&(C.remove(),C=null,a=null)}function G(){const e=T();F(z,z.selectionStart,z.selectionEnd,e),E()}function H(){C=document.createElement("div"),Object.assign(C.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"9999",padding:"24px",isolation:"isolate"});const e=document.createElement("div");Object.assign(e.style,{background:"var(--dm-surface,#1e293b)",border:"1px solid var(--dm-border,#334155)",borderRadius:"14px",width:"100%",maxWidth:"860px",maxHeight:"90vh",display:"flex",flexDirection:"column",boxShadow:"var(--dm-shadow-lg)",overflow:"hidden"});const t=r("div","display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid var(--dm-border,#334155);flex-shrink:0"),o=r("span","font-weight:700;color:var(--dm-text,#f1f5f9);font-size:14px");o.textContent="Insert Card";const n=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");n.textContent="\u2715",n.addEventListener("click",E),t.appendChild(o),t.appendChild(n);const i=r("div","display:grid;grid-template-columns:280px 1fr;flex:1;overflow:hidden");i.appendChild(U()),i.appendChild(pe());const d=r("div","display:flex;justify-content:flex-end;gap:10px;padding:12px 20px;border-top:1px solid var(--dm-border,#334155);flex-shrink:0"),l=r("button","padding:8px 18px;border-radius:8px;border:none;background:var(--dm-border,#334155);color:var(--dm-text-muted,#94a3b8);font-size:12px;font-weight:700;cursor:pointer");l.textContent="Cancel",l.addEventListener("click",E);const g=r("button","padding:8px 18px;border-radius:8px;border:none;background:var(--dm-primary);color:var(--dm-primary-text);font-size:12px;font-weight:700;cursor:pointer");g.textContent="Insert Card",g.addEventListener("click",G),d.appendChild(l),d.appendChild(g),e.appendChild(t),e.appendChild(i),e.appendChild(d),C.appendChild(e),C.addEventListener("click",b=>{b.target===C&&E()}),document.body.appendChild(C),D(),x()}function r(e,t=""){const o=document.createElement(e);return t&&(o.style.cssText=t),o}const k="padding:7px 10px;border-radius:7px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:12px;font-family:inherit;width:100%";function U(){const e=r("div","padding:18px;border-right:1px solid var(--dm-border,#334155);display:flex;flex-direction:column;gap:14px;overflow-y:auto");e.appendChild(p("Layout",Y()));const t=r("div","display:contents");t.id="cb-dyn-fields",e.appendChild(t),e.appendChild(A()),e.appendChild(p("Style",V()));const o=r("div");return o.id="cb-grad-wrap",o.style.display=a.variant==="gradient"?"":"none",o.appendChild(p("Gradient",W())),e.appendChild(o),e.appendChild(p("Options",J())),e.appendChild(A()),e.appendChild(Z()),e}function Y(){const e=r("select",k+";cursor:pointer"),t={};return R.forEach(o=>{(t[o.group]=t[o.group]||[]).push(o)}),Object.entries(t).forEach(([o,n])=>{const i=document.createElement("optgroup");i.label=o,n.forEach(d=>{const l=document.createElement("option");l.value=d.key,l.textContent=`${d.thumb} ${d.label}`,d.key===a.layout&&(l.selected=!0),i.appendChild(l)}),e.appendChild(i)}),e.addEventListener("change",()=>{a.layout=e.value,D(),x()}),e}function V(){const e=r("div","display:grid;grid-template-columns:repeat(3,1fr);gap:5px"),t={clean:"background:#f8fafc;color:#374151;border:2px solid #e2e8f0",gradient:"background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border:2px solid transparent",glass:"background:rgba(255,255,255,.06);color:#94a3b8;border:2px dashed #334155",accent:"background:#fff;color:#4338ca;border-left:4px solid #6366f1;border-top:2px solid #e2e8f0;border-right:2px solid #e2e8f0;border-bottom:2px solid #e2e8f0",dark:"background:#0f172a;color:#818cf8;border:2px solid #334155",glow:"color:#818cf8;border:2px solid #6366f1;box-shadow:0 0 6px rgba(99,102,241,.4)"};return M.forEach(o=>{const n=r("div",`padding:6px 4px;border-radius:7px;font-size:10px;font-weight:700;text-align:center;cursor:pointer;${t[o]}`);n.textContent=o.charAt(0).toUpperCase()+o.slice(1),n.dataset.variant=o,o===a.variant&&(n.style.outline="2px solid var(--dm-primary)"),n.addEventListener("click",()=>{a.variant=o,e.querySelectorAll("[data-variant]").forEach(d=>{d.style.outline=""}),n.style.outline="2px solid var(--dm-primary)";const i=document.getElementById("cb-grad-wrap");i&&(i.style.display=o==="gradient"?"":"none"),x()}),e.appendChild(n)}),e}function W(){const e=r("div","display:flex;flex-wrap:wrap;gap:7px");return j.forEach(t=>{const[o,n]=(B[t]||"#6366f1,#8b5cf6").split(","),i=r("div",`width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,${o},${n});cursor:pointer;border:2px solid transparent;transition:border-color .15s`);i.title=t,t===a.gradient&&(i.style.borderColor="var(--dm-text)"),i.addEventListener("click",()=>{a.gradient=t,e.querySelectorAll("div").forEach(d=>{d.style.borderColor="transparent"}),i.style.borderColor="var(--dm-text)",x()}),e.appendChild(i)}),e}function J(){const e=r("div","display:flex;gap:6px");return["hover","collapsible"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:var(--dm-primary);background:color-mix(in srgb, var(--dm-primary) 18%, transparent);color:var(--dm-primary)":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a[t]),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a[t]=!a[t],n(a[t]),x()}),e.appendChild(o)}),e}function S(e,t){const o=r("select",k+";cursor:pointer");return t.forEach(([n,i])=>{const d=document.createElement("option");d.value=n,d.textContent=i,n===a[e]&&(d.selected=!0),o.appendChild(d)}),o.addEventListener("change",()=>{a[e]=o.value,x()}),o}function Q(e,t){const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:var(--dm-primary);background:color-mix(in srgb, var(--dm-primary) 18%, transparent);color:var(--dm-primary)":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};return n(a[e]),o.textContent=t,o.addEventListener("click",()=>{a[e]=!a[e],n(a[e]),x()}),o}function X(){const e=r("div","display:flex;gap:6px");return[["","Left"],["center","Centre"],["right","Right"]].forEach(([t,o])=>{const n=r("div"),i=d=>{n.style.cssText=`flex:1;padding:5px 4px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${d?"border-color:var(--dm-primary);background:color-mix(in srgb, var(--dm-primary) 18%, transparent);color:var(--dm-primary)":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};i(a.textAlign===t),n.textContent=o,n.addEventListener("click",()=>{a.textAlign=t,e.querySelectorAll("div").forEach((d,l)=>i([["","Left"],["center","Centre"],["right","Right"]][l][0]===t)),x()}),e.appendChild(n)}),e}function Z(){const e=r("div","display:flex;flex-direction:column;gap:14px"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");t.textContent="Presentation",e.appendChild(t);const o=r("div","display:grid;grid-template-columns:1fr 1fr;gap:10px"),n=(d,l)=>{const g=r("div","display:flex;flex-direction:column;gap:5px"),b=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");b.textContent=d,g.appendChild(b),g.appendChild(l),o.appendChild(g)};n("Font",S("font",[["","Default"],["serif","Serif"],["mono","Mono"]])),n("Size",S("fontSize",[["","Default"],["sm","Small"],["lg","Large"],["xl","XL"]])),n("Shadow",S("shadow",[["","Default"],["none","None"],["md","Medium"],["lg","Large"]])),n("Padding",S("padding",[["","Default"],["compact","Compact"],["spacious","Spacious"]])),n("Corners",S("rounded",[["","Default"],["none","Square"],["sm","Small"],["lg","Large"],["full","Full"]])),e.appendChild(o),e.appendChild(p("Align",X()));const i=r("div","display:flex;gap:6px");return i.appendChild(Q("borderless","Borderless")),e.appendChild(i),e}function p(e,t){const o=r("div","display:flex;flex-direction:column;gap:5px"),n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");return n.textContent=e,o.appendChild(n),o.appendChild(t),o}function A(){return r("div","height:1px;background:var(--dm-border,#334155);margin:2px 0")}function f(e,t){const o=r("input",k);return o.type="text",t&&(o.placeholder=t),o.value=a[e]||"",o.addEventListener("input",()=>{a[e]=o.value,x()}),o}function K(e,t){const o=r("select",k+";cursor:pointer");return t.forEach(n=>{const i=document.createElement("option");i.value=n,i.textContent=n,n===a[e]&&(i.selected=!0),o.appendChild(i)}),o.addEventListener("change",()=>{a[e]=o.value,x()}),o}const ee={"icon-top":["subtitle","icon","iconLayout"],"icon-inline":["subtitle","icon","iconLayout"],"image-top":["image"],"image-overlay":["image"],"thumb-left":["image"],"thumb-right":["image"],"wide-left-image":["image"],"full-bg":["image"],"split-half":["image"],"avatar-profile":["subtitle","icon","tags"],"stat-metric":["value","delta","progress"],"quote-testimonial":["subtitle","icon"],callout:["calloutType","icon"],"video-media":["image","duration"],"location-map":["address"],"step-numbered":["step"],"corner-badge":["icon","badge"],"badge-band":["icon","badge"],"rating-review":["rating","subtitle","icon"],"tag-cloud":["tags"],"activity-feed":[],"code-snippet":["lang"],"file-document":["filename","filesize","filetype"],"before-after":[],pricing:["price","period"],"feature-comparison":["subtitle"],"progress-goal":["progress"],"timeline-entry":["subtitle","badge"],"glass-gradient-border":[]},te=new Set(["basic","no-header-footer","code-snippet","file-document","stat-metric"]),oe=new Set(["stat-metric","file-document"]),re=new Set(["pricing","feature-comparison","activity-feed","before-after","progress-goal"]);function D(){const e=document.getElementById("cb-dyn-fields");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);const t=a.layout,o=ee[t]||[];te.has(t)||e.appendChild(p("Title",f("title","Card heading"))),o.forEach(n=>{const i={subtitle:()=>p("Subtitle",f("subtitle","Secondary line")),icon:()=>p("Icon",ie()),iconLayout:()=>p("Icon layout",ae()),image:()=>p("Image",le()),value:()=>p("Value",f("value","\xA324,980")),delta:()=>p("Delta",f("delta","\u2191 12.4%")),progress:()=>p("Progress %",f("progress","50")),price:()=>p("Price",f("price","\xA329")),period:()=>p("Period",f("period","per month")),lang:()=>p("Language",f("lang","JavaScript")),filename:()=>p("Filename",f("filename","document.pdf")),filesize:()=>p("File size",f("filesize","2.4 MB")),filetype:()=>p("File type",f("filetype","PDF")),rating:()=>p("Rating (1\u20135)",f("rating","5")),duration:()=>p("Duration",f("duration","4:32")),address:()=>p("Address",f("address","12 Main St")),step:()=>p("Step number",f("step","1")),badge:()=>p("Badge label",f("badge","New")),tags:()=>p("Tags (comma-separated)",f("tags","Design, CSS")),calloutType:()=>p("Type",K("calloutType",["info","warn","success","error"]))};i[n]&&e.appendChild(i[n]())}),oe.has(t)||e.appendChild(p("Body content",ne())),re.has(t)||e.appendChild(p("Footer",f("footer","")))}function ne(){const e=r("textarea",k+";resize:vertical;min-height:60px;line-height:1.5");return e.value=a.body||"",e.addEventListener("input",()=>{a.body=e.value,x()}),e}function ie(){const e=r("div","display:flex;gap:6px"),t=r("input",k+";flex:1");t.type="text",t.placeholder="icon name",t.value=a.icon||"",t.addEventListener("input",()=>{a.icon=t.value,x()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse icons",o.textContent="\u2605",o.addEventListener("click",()=>P(n=>{a.icon=n,t.value=n,x()})),e.appendChild(t),e.appendChild(o),e}function ae(){const e=r("div","display:flex;gap:6px");return["inline","stacked"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:var(--dm-primary);background:color-mix(in srgb, var(--dm-primary) 18%, transparent);color:var(--dm-primary)":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a.iconLayout===t),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a.iconLayout=t,e.querySelectorAll("div").forEach((i,d)=>n(["inline","stacked"][d]===t)),x()}),e.appendChild(o)}),e}function de(){return new Promise(async e=>{let t=[];$&&typeof $.onMediaBrowse=="function"&&(t=await $.onMediaBrowse()||[]);const o=document.createElement("dialog");o.style.cssText="margin:auto;padding:0;border:none;border-radius:12px;background:var(--dm-surface,#1e293b);width:min(700px,95vw);max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:var(--dm-shadow-lg)";const n=document.createElement("style");n.textContent="dialog.cb-media-picker::backdrop{background:rgba(0,0,0,.75)}",o.className="cb-media-picker";const i=m=>{o.close(),o.remove(),n.remove(),e(m)},d=r("div","display:flex;justify-content:space-between;align-items:center;flex-shrink:0;padding:16px 20px;border-bottom:1px solid var(--dm-border,#334155)"),l=r("div","font-weight:700;font-size:14px;color:var(--dm-text,#f1f5f9)");l.textContent="Select Image";const g=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");g.textContent="\xD7",g.addEventListener("click",()=>i(null)),o.addEventListener("cancel",()=>i(null)),d.appendChild(l),d.appendChild(g);const b=r("div","padding:16px;overflow-y:auto;flex:1"),v=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px"),y=t.filter(m=>/\.(png|jpe?g|gif|webp|svg)$/i.test(m.name||""));if(y.length)y.forEach(m=>{const c=r("div","display:flex;flex-direction:column;gap:6px;cursor:pointer;border:2px solid transparent;border-radius:8px;padding:6px"),h=document.createElement("img");h.src=m.url,h.alt=m.name||"",h.style.cssText="width:100%;height:80px;object-fit:cover;border-radius:6px;display:block";const s=r("div","font-size:9px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--dm-text-muted,#94a3b8)");s.textContent=m.name||m.url,c.appendChild(h),c.appendChild(s),c.addEventListener("mouseenter",()=>{c.style.borderColor="var(--dm-primary)"}),c.addEventListener("mouseleave",()=>{c.style.borderColor="transparent"}),c.addEventListener("click",()=>i(m.url)),v.appendChild(c)});else{const m=r("div","color:var(--dm-text-muted,#94a3b8);font-size:13px;padding:20px;text-align:center");m.textContent="No images uploaded yet.",v.appendChild(m)}b.appendChild(v),o.appendChild(d),o.appendChild(b),document.head.appendChild(n),document.body.appendChild(o),o.showModal()})}function le(){const e=r("div","display:flex;gap:6px"),t=r("input",k+";flex:1");t.type="text",t.placeholder="/media/image.jpg",t.value=a.image||"",t.addEventListener("input",()=>{a.image=t.value,x()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse media",o.textContent="\u{1F4C1}",o.addEventListener("click",async()=>{const n=await de();n&&(a.image=n,t.value=n,x())}),e.appendChild(t),e.appendChild(o),e}function pe(){const e=r("div","padding:20px;background:var(--dm-surface,#f8fafc);display:flex;flex-direction:column;gap:14px;overflow-y:auto"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--dm-text-muted,#94a3b8)");t.textContent="Live Preview";const o=r("div","flex:1;display:flex;align-items:flex-start;justify-content:center");o.id="cb-preview-area";const n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#94a3b8);margin-bottom:6px");n.textContent="Shortcode";const i=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#334155);border-radius:8px;padding:10px 14px;font-family:monospace;font-size:11px;color:var(--dm-primary,#a5b4fc);line-height:1.8;white-space:pre-wrap;word-break:break-all");return i.id="cb-snippet",e.appendChild(t),e.appendChild(o),e.appendChild(n),e.appendChild(i),e}function x(){const e=document.getElementById("cb-preview-area");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(se());const t=document.getElementById("cb-snippet");t&&(t.textContent=T())}function se(){const e=a,[t,o]=(B[e.gradient]||"#6366f1,#8b5cf6").split(","),n=`linear-gradient(135deg,${t},${o})`,i={clean:"background:var(--dm-surface,#fff);border:1px solid var(--dm-border,#e5e7eb);box-shadow:0 1px 4px rgba(0,0,0,.06)",gradient:`background:${n};color:#fff`,glass:"background:rgba(255,255,255,.12);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.25);box-shadow:0 4px 24px rgba(0,0,0,.12)",accent:"background:var(--dm-surface,#fff);border-top:1px solid var(--dm-border,#e5e7eb);border-right:1px solid var(--dm-border,#e5e7eb);border-bottom:1px solid var(--dm-border,#e5e7eb);border-left:4px solid #6366f1",dark:"background:#0f172a;color:#e2e8f0;border:1px solid #1e293b",glow:"background:var(--dm-surface,#fff);border:1px solid #6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.15),0 0 20px rgba(99,102,241,.3)"},d=e.variant==="gradient"?`background:${n};color:#fff;padding:12px 16px`:"background:var(--dm-border,#f3f4f6);color:var(--dm-text,#111);padding:12px 16px",l=r("div");l.style.cssText=`width:100%;max-width:300px;border-radius:12px;overflow:hidden;font-size:13px;font-family:system-ui,sans-serif;${i[e.variant]||i.clean}`;const g={serif:"Georgia,serif",mono:"'SF Mono','Fira Code',monospace"};e.font&&g[e.font]&&(l.style.fontFamily=g[e.font]);const b={sm:"11px",lg:"15px",xl:"17px"};e.fontSize&&b[e.fontSize]&&(l.style.fontSize=b[e.fontSize]),e.borderless&&(l.style.border="none");const v={none:"none",md:"0 4px 12px rgba(0,0,0,.1)",lg:"0 10px 30px rgba(0,0,0,.18)"};e.shadow&&v[e.shadow]!==void 0&&(l.style.boxShadow=v[e.shadow]);const y={none:"0",sm:"4px",lg:"20px",full:"9999px"};if(e.rounded&&y[e.rounded]!==void 0&&(l.style.borderRadius=y[e.rounded]),e.textAlign&&(l.style.textAlign=e.textAlign),new Set(["image-top","image-overlay","thumb-left","thumb-right","wide-left-image","full-bg","split-half","video-media"]).has(e.layout)){const u=r("div","height:120px;background-size:cover;background-position:center;display:flex;align-items:center;justify-content:center;font-size:2rem;background-color:var(--dm-border,#e2e8f0)");e.image&&(u.style.backgroundImage=`url('${e.image}')`),e.image||(u.textContent="\u{1F5BC}"),l.appendChild(u)}if(!new Set(["basic","no-header-footer","image-overlay","stat-metric","quote-testimonial","activity-feed","before-after","code-snippet","file-document","glass-gradient-border"]).has(e.layout)&&e.title){const u=r("div",d),w=r("div","font-weight:700");w.textContent=e.title,u.appendChild(w),l.appendChild(u)}const h=e.variant==="dark"?"color:#94a3b8;":e.variant==="gradient"?"color:rgba(255,255,255,.85);":"",s=r("div",`padding:13px 16px;${h}`);if(new Set(["before-after","pricing","feature-comparison","activity-feed","progress-goal"]).has(e.layout)){const u=r("em","font-size:11px;color:var(--dm-text-muted,#9ca3af)");u.textContent="Simplified preview \u2014 full render on save.",s.appendChild(u)}else if(e.layout==="stat-metric"){const u=r("div","font-size:2rem;font-weight:800");u.textContent=e.value||"\u2014";const w=r("div","font-size:.8rem;opacity:.7");if(w.textContent=e.title||"",s.appendChild(w),s.appendChild(u),e.delta){const _=r("div","font-size:.78rem;font-weight:600;color:#10b981");_.textContent=e.delta,s.appendChild(_)}}else s.textContent=e.body||"Card body content.";if(e.padding){const u=e.padding==="compact"?"8px 12px":"24px 28px";s.style.padding=u}if(l.appendChild(s),e.footer){const u=e.variant==="gradient"?"rgba(255,255,255,.6)":"var(--dm-text-muted,#9ca3af)",w=r("div",`padding:9px 16px;border-top:1px solid rgba(128,128,128,.15);font-size:11px;color:${u}`);w.textContent=e.footer,l.appendChild(w)}return l}function P(e){const t=r("div","position:fixed;inset:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:10000;padding:24px"),o=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#475569);border-radius:12px;padding:16px;width:100%;max-width:520px;max-height:70vh;display:flex;flex-direction:column;gap:12px"),n=r("div","display:flex;gap:8px;flex-wrap:wrap"),i=r("input","flex:1;min-width:160px;padding:8px 12px;border-radius:8px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:13px;font-family:inherit");i.type="text",i.placeholder="Search icons\u2026";const d=r("select","padding:8px 12px;border-radius:8px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:13px;font-family:inherit;cursor:pointer");N().forEach(({slug:c,label:h})=>{const s=document.createElement("option");s.value=c,s.textContent=h,d.appendChild(s)});const l=r("button","padding:8px 14px;background:var(--dm-border,#334155);border:none;border-radius:8px;color:var(--dm-text-muted,#94a3b8);font-size:12px;cursor:pointer");l.textContent="\u2715 Close",l.addEventListener("click",()=>t.remove()),n.appendChild(i),n.appendChild(d),n.appendChild(l);const g=r("div","font-size:11px;color:var(--dm-text-muted,#94a3b8)"),b=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:6px;overflow-y:auto;max-height:400px");let v=null;const y=r("button","padding:8px 18px;background:var(--dm-primary);border:none;border-radius:8px;color:var(--dm-primary-text);font-size:12px;font-weight:700;cursor:pointer;align-self:flex-end");y.textContent="Select an icon";function m(){for(;b.firstChild;)b.removeChild(b.firstChild);const c=q(d.value,i.value);g.textContent=`${c.length} icon${c.length===1?"":"s"}`,c.forEach(h=>{const s=r("div","display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border-radius:8px;cursor:pointer;border:2px solid transparent;background:var(--dm-surface,#0f172a)"),L=document.createElement("span");L.setAttribute("data-icon",h),L.style.fontSize="20px";const u=r("div","font-size:8px;color:var(--dm-text-muted,#475569);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%");u.textContent=h,s.appendChild(L),s.appendChild(u),s.addEventListener("click",()=>{v&&(v.style.borderColor="transparent"),s.style.borderColor="var(--dm-primary)",v=s,y.textContent=`Use: ${h}`}),s.addEventListener("dblclick",()=>{e(h),t.remove()}),b.appendChild(s)}),typeof I<"u"&&I.scan&&I.scan(b)}i.addEventListener("input",m),d.addEventListener("change",m),m(),y.addEventListener("click",()=>{if(v){const c=v.querySelector("[data-icon]").getAttribute("data-icon");e(c),t.remove()}}),o.appendChild(n),o.appendChild(g),o.appendChild(b),o.appendChild(y),t.appendChild(o),t.addEventListener("click",c=>{c.target===t&&t.remove()}),document.body.appendChild(t),i.focus()}export function openIconPicker(e){P(e)}
@@ -1 +1 @@
1
- export function openCrudTutorial(t=null){const e=E.slideover({title:"CRUD shortcut",size:"md",position:"right"}),c=document.createElement("div");c.className="crud-tutorial",c.style.cssText="padding:1rem;display:flex;flex-direction:column;gap:1.25rem;",c.appendChild(k()),c.appendChild(v(e)),c.appendChild(y(e,t)),e.setContent(c),e.open(),window.Domma?.icons?.scan&&Domma.icons.scan(c)}function v(t){const e=document.createElement("a");e.href="#/tutorials",e.className="cb-tutorial-link",e.addEventListener("click",()=>{try{t.close()}catch{}});const c=document.createElement("span");c.setAttribute("data-icon","book-open"),c.className="cb-icon",e.appendChild(c);const o=document.createElement("span"),a=document.createElement("strong");a.textContent="Open the full tutorial \u2192 ",o.appendChild(a),o.appendChild(document.createTextNode('"Building a CRUD App" in Tutorials')),e.appendChild(o);const n=document.createElement("span");return n.className="cb-arrow",n.textContent="\u203A",e.appendChild(n),e}function k(){const t=document.createElement("div");t.className="cb-intro";const e=document.createElement("p");return e.textContent="Drop a working Collection + Form + Actions onto this page in one click. Pick a starter template below \u2014 the slugs are editable, and we'll insert the matching shortcode at your cursor when it's done.",t.appendChild(e),t}function w(t){const e=document.createElement("div");e.className="cb-code";const c=document.createElement("pre");c.textContent=t,e.appendChild(c);const o=document.createElement("button");o.type="button",o.title="Copy",o.className="cb-copy";const a=document.createElement("span");return a.setAttribute("data-icon","copy"),o.appendChild(a),o.addEventListener("click",()=>{const n=document.createElement("textarea");n.value=t,n.style.cssText="position:fixed;opacity:0;",document.body.appendChild(n),n.select(),document.execCommand("copy"),n.remove(),E.toast("Copied!",{type:"success",duration:1200})}),e.appendChild(o),e}export function mountScaffolder(t,e=null,c=null){t.appendChild(y(e,c)),window.Domma?.icons?.scan&&Domma.icons.scan(t)}function y(t,e){const c=document.createElement("section");c.className="cb-scaffolder";const o=document.createElement("div");o.className="cb-scaffolder-head";const a=document.createElement("span");a.setAttribute("data-icon","sparkles"),a.className="cb-icon",o.appendChild(a);const n=document.createElement("h2");n.textContent="Or skip ahead \u2014 scaffold a working system in one click",o.appendChild(n),c.appendChild(o);const l=document.createElement("p");l.className="cb-scaffolder-blurb",l.textContent="Pick a starter template; we'll create the Collection, Form, and Actions for you. Rename the slugs if you want, then hit Apply. You can also paste the ready-made shortcode into this page.",c.appendChild(l);const d=document.createElement("div");return d.className="cb-recipe-list",d.textContent="Loading templates\u2026",c.appendChild(d),fetch("/api/scaffold/recipes",{headers:g()}).then(m=>m.json()).then(({recipes:m})=>{if(d.textContent="",!m?.length){d.textContent="No bundled templates available.";return}for(const h of m)d.appendChild(A(h,c,t,e))}).catch(()=>{d.textContent="Couldn't load templates \u2014 admin permissions required."}),c}function A(t,e,c,o){const a=document.createElement("button");a.type="button",a.className="cb-recipe-card";const n=document.createElement("span");n.setAttribute("data-icon",t.icon||"box"),n.className="cb-icon",a.appendChild(n);const l=document.createElement("div");l.className="cb-recipe-meta";const d=document.createElement("div");d.className="cb-recipe-name",d.textContent=t.name;const m=document.createElement("div");return m.className="cb-recipe-desc",m.textContent=t.description||"",l.appendChild(d),l.appendChild(m),a.appendChild(l),a.addEventListener("click",()=>D(t,e,c,o)),a}function D(t,e,c,o){const a=document.createElement("div");a.className="cb-apply-panel";const n=document.createElement("div");n.className="cb-apply-head";const l=document.createElement("span");l.setAttribute("data-icon",t.icon||"box"),l.className="cb-icon",n.appendChild(l);const d=document.createElement("h3");d.textContent=t.name,n.appendChild(d),a.appendChild(n);const m=document.createElement("p");m.className="cb-apply-desc",m.textContent=t.description||"",a.appendChild(m);const h={};for(const s of t.options||[]){const u=document.createElement("div");u.className="cb-apply-field";const C=document.createElement("label");C.textContent=s.label||s.name;const f=document.createElement("input");if(f.type="text",f.value=s.default||"",u.appendChild(C),u.appendChild(f),s.hint){const x=document.createElement("div");x.className="cb-apply-hint",x.textContent=s.hint,u.appendChild(x)}a.appendChild(u),h[s.name]=f}const p=document.createElement("div");p.className="cb-apply-status",a.appendChild(p);const b=document.createElement("div");b.className="cb-apply-buttons";const i=document.createElement("button");i.type="button",i.className="btn btn-outline",i.textContent="Cancel",i.addEventListener("click",()=>{const s=y(c,o);a.replaceWith(s),window.Domma?.icons?.scan&&Domma.icons.scan(s)});const r=document.createElement("button");r.type="button",r.className="btn btn-primary",r.textContent="Apply template",r.addEventListener("click",async()=>{r.disabled=!0,i.disabled=!0,p.textContent="Creating collection, form, and actions\u2026",p.classList.remove("cb-error");const s={};for(const[u,C]of Object.entries(h))s[u]=C.value.trim();try{const u=await fetch("/api/scaffold/apply",{method:"POST",headers:{"Content-Type":"application/json",...g()},body:JSON.stringify({recipe:t.slug,options:s})}),C=await u.json();if(!u.ok){p.classList.add("cb-error"),Array.isArray(C.conflicts)?p.textContent=`Conflicts: ${C.conflicts.join("; ")}`:p.textContent=C.error||"Apply failed.",r.disabled=!1,i.disabled=!1;return}const f=L(t,C,c,o,e);a.replaceWith(f),window.Domma?.icons?.scan&&Domma.icons.scan(f)}catch(u){p.classList.add("cb-error"),p.textContent=u.message||"Network error.",r.disabled=!1,i.disabled=!1}}),b.appendChild(i),b.appendChild(r),a.appendChild(b),e.replaceWith(a),window.Domma?.icons?.scan&&Domma.icons.scan(a)}function L(t,e,c,o,a){const n=document.createElement("div");n.className="cb-success-panel";const l=document.createElement("div");l.className="cb-apply-head";const d=document.createElement("span");d.setAttribute("data-icon","check-circle"),d.className="cb-icon",l.appendChild(d);const m=document.createElement("h3");m.textContent=`${t.name} \u2014 scaffolded`,l.appendChild(m),n.appendChild(l);const h=document.createElement("ul");if(h.className="cb-success-summary",e.created.collection&&h.appendChild(N(`Collection: ${e.created.collection}`)),e.created.form&&h.appendChild(N(`Form: ${e.created.form}`)),e.created.actions?.length&&h.appendChild(N(`Actions: ${e.created.actions.join(", ")}`)),e.created.apiEndpoints?.length&&h.appendChild(N(`API endpoints: ${e.created.apiEndpoints.join(", ")}`)),n.appendChild(h),e.created.apiTokens?.length){const i=document.createElement("p");i.className="cb-success-snippet-label",i.textContent="API tokens \u2014 copy these now, they will not be shown again:",n.appendChild(i);for(const r of e.created.apiTokens)n.appendChild(w(`${r.name}: ${r.token}`))}if(e.warnings?.length){const i=document.createElement("div");i.className="cb-success-warning",i.textContent=e.warnings.join(" \xB7 "),n.appendChild(i)}if(e.snippet){const i=document.createElement("p");i.className="cb-success-snippet-label",i.textContent="Ready-made shortcode:",n.appendChild(i),n.appendChild(w(e.snippet));const r=document.createElement("div");if(r.className="cb-success-actions",o&&c){const s=document.createElement("button");s.type="button",s.className="btn btn-primary",s.textContent="Insert into this page",s.addEventListener("click",()=>{T(o,e.snippet),E.toast("Inserted at cursor",{type:"success",duration:1500}),c.close()}),r.appendChild(s)}else{const s=document.createElement("a");s.className="btn btn-primary",s.textContent="Open a new page to paste this",s.href="#/pages/new",r.appendChild(s)}n.appendChild(r)}const p=document.createElement("button");p.type="button",p.className="btn btn-outline",p.textContent="Scaffold another",p.addEventListener("click",()=>{n.replaceWith(y(c,o)),window.Domma?.icons?.scan&&Domma.icons.scan(a.parentElement||document.body)});const b=n.querySelector(".cb-success-actions");return b?b.appendChild(p):n.appendChild(p),n}function N(t){const e=document.createElement("li");return e.textContent=t,e}function T(t,e){const c=t.selectionStart||0,o=t.selectionEnd||0,a=t.value||"";t.value=a.slice(0,c)+e+a.slice(o);const n=c+e.length;t.selectionStart=t.selectionEnd=n,t.focus(),t.dispatchEvent(new Event("input",{bubbles:!0}))}function g(){try{const t=typeof S<"u"&&S.get?S.get("auth_token"):null;return t?{Authorization:`Bearer ${t}`}:{}}catch{return{}}}
1
+ import{replaceRange as v}from"./markdown-toolbar.js";export function openCrudTutorial(t=null){const e=E.slideover({title:"CRUD shortcut",size:"md",position:"right"}),c=document.createElement("div");c.className="crud-tutorial",c.style.cssText="padding:1rem;display:flex;flex-direction:column;gap:1.25rem;",c.appendChild(A()),c.appendChild(k(e)),c.appendChild(y(e,t)),e.setContent(c),e.open(),window.Domma?.icons?.scan&&Domma.icons.scan(c)}function k(t){const e=document.createElement("a");e.href="#/tutorials",e.className="cb-tutorial-link",e.addEventListener("click",()=>{try{t.close()}catch{}});const c=document.createElement("span");c.setAttribute("data-icon","book-open"),c.className="cb-icon",e.appendChild(c);const o=document.createElement("span"),a=document.createElement("strong");a.textContent="Open the full tutorial \u2192 ",o.appendChild(a),o.appendChild(document.createTextNode('"Building a CRUD App" in Tutorials')),e.appendChild(o);const n=document.createElement("span");return n.className="cb-arrow",n.textContent="\u203A",e.appendChild(n),e}function A(){const t=document.createElement("div");t.className="cb-intro";const e=document.createElement("p");return e.textContent="Drop a working Collection + Form + Actions onto this page in one click. Pick a starter template below \u2014 the slugs are editable, and we'll insert the matching shortcode at your cursor when it's done.",t.appendChild(e),t}function w(t){const e=document.createElement("div");e.className="cb-code";const c=document.createElement("pre");c.textContent=t,e.appendChild(c);const o=document.createElement("button");o.type="button",o.title="Copy",o.className="cb-copy";const a=document.createElement("span");return a.setAttribute("data-icon","copy"),o.appendChild(a),o.addEventListener("click",()=>{const n=document.createElement("textarea");n.value=t,n.style.cssText="position:fixed;opacity:0;",document.body.appendChild(n),n.select(),document.execCommand("copy"),n.remove(),E.toast("Copied!",{type:"success",duration:1200})}),e.appendChild(o),e}export function mountScaffolder(t,e=null,c=null){t.appendChild(y(e,c)),window.Domma?.icons?.scan&&Domma.icons.scan(t)}function y(t,e){const c=document.createElement("section");c.className="cb-scaffolder";const o=document.createElement("div");o.className="cb-scaffolder-head";const a=document.createElement("span");a.setAttribute("data-icon","sparkles"),a.className="cb-icon",o.appendChild(a);const n=document.createElement("h2");n.textContent="Or skip ahead \u2014 scaffold a working system in one click",o.appendChild(n),c.appendChild(o);const l=document.createElement("p");l.className="cb-scaffolder-blurb",l.textContent="Pick a starter template; we'll create the Collection, Form, and Actions for you. Rename the slugs if you want, then hit Apply. You can also paste the ready-made shortcode into this page.",c.appendChild(l);const d=document.createElement("div");return d.className="cb-recipe-list",d.textContent="Loading templates\u2026",c.appendChild(d),fetch("/api/scaffold/recipes",{headers:g()}).then(m=>m.json()).then(({recipes:m})=>{if(d.textContent="",!m?.length){d.textContent="No bundled templates available.";return}for(const h of m)d.appendChild(D(h,c,t,e))}).catch(()=>{d.textContent="Couldn't load templates \u2014 admin permissions required."}),c}function D(t,e,c,o){const a=document.createElement("button");a.type="button",a.className="cb-recipe-card";const n=document.createElement("span");n.setAttribute("data-icon",t.icon||"box"),n.className="cb-icon",a.appendChild(n);const l=document.createElement("div");l.className="cb-recipe-meta";const d=document.createElement("div");d.className="cb-recipe-name",d.textContent=t.name;const m=document.createElement("div");return m.className="cb-recipe-desc",m.textContent=t.description||"",l.appendChild(d),l.appendChild(m),a.appendChild(l),a.addEventListener("click",()=>L(t,e,c,o)),a}function L(t,e,c,o){const a=document.createElement("div");a.className="cb-apply-panel";const n=document.createElement("div");n.className="cb-apply-head";const l=document.createElement("span");l.setAttribute("data-icon",t.icon||"box"),l.className="cb-icon",n.appendChild(l);const d=document.createElement("h3");d.textContent=t.name,n.appendChild(d),a.appendChild(n);const m=document.createElement("p");m.className="cb-apply-desc",m.textContent=t.description||"",a.appendChild(m);const h={};for(const s of t.options||[]){const u=document.createElement("div");u.className="cb-apply-field";const C=document.createElement("label");C.textContent=s.label||s.name;const f=document.createElement("input");if(f.type="text",f.value=s.default||"",u.appendChild(C),u.appendChild(f),s.hint){const N=document.createElement("div");N.className="cb-apply-hint",N.textContent=s.hint,u.appendChild(N)}a.appendChild(u),h[s.name]=f}const p=document.createElement("div");p.className="cb-apply-status",a.appendChild(p);const b=document.createElement("div");b.className="cb-apply-buttons";const i=document.createElement("button");i.type="button",i.className="btn btn-outline",i.textContent="Cancel",i.addEventListener("click",()=>{const s=y(c,o);a.replaceWith(s),window.Domma?.icons?.scan&&Domma.icons.scan(s)});const r=document.createElement("button");r.type="button",r.className="btn btn-primary",r.textContent="Apply template",r.addEventListener("click",async()=>{r.disabled=!0,i.disabled=!0,p.textContent="Creating collection, form, and actions\u2026",p.classList.remove("cb-error");const s={};for(const[u,C]of Object.entries(h))s[u]=C.value.trim();try{const u=await fetch("/api/scaffold/apply",{method:"POST",headers:{"Content-Type":"application/json",...g()},body:JSON.stringify({recipe:t.slug,options:s})}),C=await u.json();if(!u.ok){p.classList.add("cb-error"),Array.isArray(C.conflicts)?p.textContent=`Conflicts: ${C.conflicts.join("; ")}`:p.textContent=C.error||"Apply failed.",r.disabled=!1,i.disabled=!1;return}const f=T(t,C,c,o,e);a.replaceWith(f),window.Domma?.icons?.scan&&Domma.icons.scan(f)}catch(u){p.classList.add("cb-error"),p.textContent=u.message||"Network error.",r.disabled=!1,i.disabled=!1}}),b.appendChild(i),b.appendChild(r),a.appendChild(b),e.replaceWith(a),window.Domma?.icons?.scan&&Domma.icons.scan(a)}function T(t,e,c,o,a){const n=document.createElement("div");n.className="cb-success-panel";const l=document.createElement("div");l.className="cb-apply-head";const d=document.createElement("span");d.setAttribute("data-icon","check-circle"),d.className="cb-icon",l.appendChild(d);const m=document.createElement("h3");m.textContent=`${t.name} \u2014 scaffolded`,l.appendChild(m),n.appendChild(l);const h=document.createElement("ul");if(h.className="cb-success-summary",e.created.collection&&h.appendChild(x(`Collection: ${e.created.collection}`)),e.created.form&&h.appendChild(x(`Form: ${e.created.form}`)),e.created.actions?.length&&h.appendChild(x(`Actions: ${e.created.actions.join(", ")}`)),e.created.apiEndpoints?.length&&h.appendChild(x(`API endpoints: ${e.created.apiEndpoints.join(", ")}`)),n.appendChild(h),e.created.apiTokens?.length){const i=document.createElement("p");i.className="cb-success-snippet-label",i.textContent="API tokens \u2014 copy these now, they will not be shown again:",n.appendChild(i);for(const r of e.created.apiTokens)n.appendChild(w(`${r.name}: ${r.token}`))}if(e.warnings?.length){const i=document.createElement("div");i.className="cb-success-warning",i.textContent=e.warnings.join(" \xB7 "),n.appendChild(i)}if(e.snippet){const i=document.createElement("p");i.className="cb-success-snippet-label",i.textContent="Ready-made shortcode:",n.appendChild(i),n.appendChild(w(e.snippet));const r=document.createElement("div");if(r.className="cb-success-actions",o&&c){const s=document.createElement("button");s.type="button",s.className="btn btn-primary",s.textContent="Insert into this page",s.addEventListener("click",()=>{$(o,e.snippet),E.toast("Inserted at cursor",{type:"success",duration:1500}),c.close()}),r.appendChild(s)}else{const s=document.createElement("a");s.className="btn btn-primary",s.textContent="Open a new page to paste this",s.href="#/pages/new",r.appendChild(s)}n.appendChild(r)}const p=document.createElement("button");p.type="button",p.className="btn btn-outline",p.textContent="Scaffold another",p.addEventListener("click",()=>{n.replaceWith(y(c,o)),window.Domma?.icons?.scan&&Domma.icons.scan(a.parentElement||document.body)});const b=n.querySelector(".cb-success-actions");return b?b.appendChild(p):n.appendChild(p),n}function x(t){const e=document.createElement("li");return e.textContent=t,e}function $(t,e){const c=t.selectionStart||0,o=t.selectionEnd||0;v(t,c,o,e)}function g(){try{const t=typeof S<"u"&&S.get?S.get("auth_token"):null;return t?{Authorization:`Bearer ${t}`}:{}}catch{return{}}}
@@ -1,3 +1,3 @@
1
- import{EFFECTS as z,effectsByCategory as A,effectsInjectableInto as j,getEffect as g}from"./effect-defs.js";import{insertAtCursor as R}from"./markdown-toolbar.js";let h=null;export const EffectsBuilder={open(e){if(h)return;const t={textarea:e,activeEffect:S.get("effects-builder-last")||"reveal",scope:"standalone",host:null,editing:null,fieldValues:{}};if(t.host=P(e),t.host&&j(t.host.name).map(o=>o.name).includes(t.activeEffect)&&!(t.activeEffect in t.host.attrs)&&(t.scope="inject"),t.editing=N(e),t.editing){t.activeEffect=t.editing.name,t.scope="standalone";const l=g(t.editing.name);for(const o of l.attrs)if(o.name in t.editing.attrs){const s=t.editing.attrs[o.name];o.type==="number"?t.fieldValues[o.name]=Number(s):o.type==="checkbox"?t.fieldValues[o.name]=s==="true":t.fieldValues[o.name]=s}}const n=E.slideover({title:"Effects",size:"lg",position:"right",onClose:()=>{h=null}}),c=L(t,n);n.element.appendChild(c),n.open(),I.scan(c),h={state:t,slideover:n}},close(){h&&(h.slideover.close(),h=null)}};function L(e,t){const n=document.createElement("div");n.style.cssText="display:grid;grid-template-columns:170px 1fr;height:100%;min-height:520px;";const c=document.createElement("div");c.className="effects-rail",c.style.cssText="background:var(--dm-surface-subtle,#15152a);border-right:1px solid var(--dm-border,#2a2a40);padding:.5rem .35rem;font-size:.8rem;overflow-y:auto;";const l=document.createElement("div");l.className="effects-pane",l.style.cssText="padding:1rem;display:flex;flex-direction:column;gap:.75rem;overflow-y:auto;";function o(){D(l,e,t)}return v(c,e,o),o(),n.appendChild(c),n.appendChild(l),n}function v(e,t,n){e.replaceChildren();for(const c of A()){const l=document.createElement("div");l.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;margin:.4rem .35rem .25rem;",l.textContent=c.category,e.appendChild(l);for(const o of c.effects){const s=document.createElement("button");s.type="button",s.dataset.effect=o.name,s.style.cssText="display:block;width:100%;text-align:left;padding:.3rem .5rem;border:none;background:transparent;color:var(--dm-text,#ddd);border-radius:3px;font-size:.8rem;cursor:pointer;margin-bottom:.1rem;",s.textContent=o.label,o.name===t.activeEffect&&(s.style.background="var(--dm-primary,#4338ca)",s.style.color="#fff"),s.addEventListener("click",()=>{t.activeEffect=o.name,S.set("effects-builder-last",o.name),t.fieldValues={},v(e,t,n),n()}),e.appendChild(s)}}}function O(e,t){if(e.type==="select"){const c=document.createElement("select");c.style.cssText="width:100%;padding:.35rem .5rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:3px;color:var(--dm-text,#eee);font-size:.85rem;";for(const[l,o]of e.options){const s=document.createElement("option");s.value=l,s.textContent=o,c.appendChild(s)}return c.value=t??e.default??"",c}if(e.type==="checkbox"){const c=document.createElement("input");return c.type="checkbox",c.checked=t??e.default??!1,c}const n=document.createElement("input");return n.type=e.type==="number"?"number":e.type==="colour"?"color":"text",n.value=t??e.default??"",e.placeholder&&(n.placeholder=e.placeholder),e.type==="number"&&(e.min!=null&&(n.min=e.min),e.max!=null&&(n.max=e.max),e.step!=null&&(n.step=e.step)),n.style.cssText="width:100%;padding:.35rem .5rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:3px;color:var(--dm-text,#eee);font-size:.85rem;",n}function y(e,t){return t.type==="checkbox"?e.checked:t.type==="number"?e.value===""?"":Number(e.value):e.value}function V(e,t,n){const c=g(t.activeEffect);if(e.replaceChildren(),c.attrs.length===0){const o=document.createElement("div");o.style.cssText="color:var(--dm-text-muted,#888);font-size:.8rem;font-style:italic;",o.textContent="This effect takes no parameters.",e.appendChild(o);return}const l=document.createElement("div");l.style.cssText="display:grid;grid-template-columns:1fr 1fr;gap:.6rem .7rem;";for(const o of c.attrs){const s=document.createElement("div"),i=document.createElement("label");i.style.cssText="display:block;color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.2rem;",i.textContent=o.label,s.appendChild(i);const a=O(o,t.fieldValues[o.name]);if(a.addEventListener("input",()=>{t.fieldValues[o.name]=y(a,o),n()}),a.addEventListener("change",()=>{t.fieldValues[o.name]=y(a,o),n()}),s.appendChild(a),o.hint){const r=document.createElement("div");r.style.cssText="color:var(--dm-text-muted,#666);font-size:.7rem;margin-top:.15rem;",r.textContent=o.hint,s.appendChild(r)}l.appendChild(s)}e.appendChild(l)}function C(e){const t={},n=/(\w[\w-]*)(?:\s*=\s*"([^"]*)"|\s*=\s*'([^']*)'|\s*=\s*(\S+))?/g;for(const c of e.matchAll(n)){const l=c[1],o=c[2]??c[3]??c[4]??"";t[l]=o}return t}const B=z.filter(e=>!e.selfClosing).map(e=>e.name);function N(e){const t=e.value,n=e.selectionStart;for(const c of B){const l=new RegExp(`\\[${c}([^\\]]*)\\]`,"g"),o=new RegExp(`\\[/${c}\\]`,"g"),s=[];for(const r of t.matchAll(l)){if(r.index>=n)break;s.push({type:"open",start:r.index,end:r.index+r[0].length,attrStr:r[1]})}for(const r of t.matchAll(o)){if(r.index>=n)break;s.push({type:"close",start:r.index,end:r.index+r[0].length})}s.sort((r,f)=>r.start-f.start);let i=0,a=null;for(const r of s)r.type==="open"?(i++,a=r):(i--,i<0&&(i=0,a=null));if(i>0&&a){const r=new RegExp(`\\[/${c}\\]`,"g"),f=t.slice(n),d=f.match(r);if(d){const p=n+f.indexOf(d[0]);return{name:c,blockStart:a.start,blockEnd:p+d[0].length,openTagEnd:a.end,attrs:C(a.attrStr)}}}}return null}const q=["card","hero","banner","col","button"];function P(e){const t=e.value,n=e.selectionStart;for(const c of q){const l=new RegExp(`\\[${c}([^\\]]*)\\]`,"g"),o=new RegExp(`\\[/${c}\\]`,"g"),s=[];for(const r of t.matchAll(l)){if(r.index>=n)break;s.push({type:"open",start:r.index,end:r.index+r[0].length,attrStr:r[1]})}for(const r of t.matchAll(o)){if(r.index>=n)break;s.push({type:"close",start:r.index,end:r.index+r[0].length})}s.sort((r,f)=>r.start-f.start);let i=0,a=null;for(const r of s)r.type==="open"?(i++,a=r):(i--,i<0&&(i=0,a=null));if(i>0&&a){const r=new RegExp(`\\[/${c}\\]`,"g"),f=t.slice(n),d=f.match(r);if(d){const p=n+f.indexOf(d[0]);return{name:c,openTagStart:a.start,openTagEnd:a.end,closeTagStart:p,closeTagEnd:p+d[0].length,attrs:C(a.attrStr)}}}}return null}function k(e,t){const n=[];for(const c of t.attrs){const l=e.fieldValues[c.name];l===void 0||l===""||l===null||l!==c.default&&(c.type==="checkbox"?n.push(`${c.name}="${l?"true":"false"}"`):n.push(`${c.name}="${String(l).replace(/"/g,"&quot;")}"`))}return n.join(" ")}function $(e){const t=g(e.activeEffect),n=k(e,t),c=n?" ":"";if(e.scope==="inject"&&e.host){const l=e.host.attrs,o=t.name,s=[];for(const i of Object.keys(l)){if(i===o||i.startsWith(o+"-"))continue;const a=l[i];s.push(a===""?i:`${i}="${String(a).replace(/"/g,"&quot;")}"`)}s.push(o);for(const i of t.attrs){const a=e.fieldValues[i.name];if(a===void 0||a===""||a===null||a===i.default)continue;const r=i.type==="checkbox"?a?"true":"false":String(a).replace(/"/g,"&quot;");s.push(`${o}-${i.name}="${r}"`)}return`[${e.host.name} ${s.join(" ")}]\u2026[/${e.host.name}]`}return t.selfClosing?`[${t.name}${c}${n} /]`:`[${t.name}${c}${n}]
1
+ import{EFFECTS as _,effectsByCategory as z,effectsInjectableInto as R,getEffect as u}from"./effect-defs.js";import{insertAtCursor as A,replaceRange as x}from"./markdown-toolbar.js";let g=null;export const EffectsBuilder={open(e){if(g)return;const t={textarea:e,activeEffect:S.get("effects-builder-last")||"reveal",scope:"standalone",host:null,editing:null,fieldValues:{}};if(t.host=q(e),t.host&&R(t.host.name).map(o=>o.name).includes(t.activeEffect)&&!(t.activeEffect in t.host.attrs)&&(t.scope="inject"),t.editing=B(e),t.editing){t.activeEffect=t.editing.name,t.scope="standalone";const a=u(t.editing.name);for(const o of a.attrs)if(o.name in t.editing.attrs){const s=t.editing.attrs[o.name];o.type==="number"?t.fieldValues[o.name]=Number(s):o.type==="checkbox"?t.fieldValues[o.name]=s==="true":t.fieldValues[o.name]=s}}const r=E.slideover({title:"Effects",size:"lg",position:"right",onClose:()=>{g=null}}),c=j(t,r);r.element.appendChild(c),r.open(),I.scan(c),g={state:t,slideover:r}},close(){g&&(g.slideover.close(),g=null)}};function j(e,t){const r=document.createElement("div");r.style.cssText="display:grid;grid-template-columns:170px 1fr;height:100%;min-height:520px;";const c=document.createElement("div");c.className="effects-rail",c.style.cssText="background:var(--dm-background-alt,#15152a);border-right:1px solid var(--dm-border,#2a2a40);padding:.5rem .35rem;font-size:.8rem;overflow-y:auto;";const a=document.createElement("div");a.className="effects-pane",a.style.cssText="padding:1rem;display:flex;flex-direction:column;gap:.75rem;overflow-y:auto;";function o(){F(a,e,t)}return b(c,e,o),o(),r.appendChild(c),r.appendChild(a),r}function b(e,t,r){e.replaceChildren();for(const c of z()){const a=document.createElement("div");a.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;margin:.4rem .35rem .25rem;",a.textContent=c.category,e.appendChild(a);for(const o of c.effects){const s=document.createElement("button");s.type="button",s.dataset.effect=o.name,s.style.cssText="display:block;width:100%;text-align:left;padding:.3rem .5rem;border:none;background:transparent;color:var(--dm-text,#ddd);border-radius:3px;font-size:.8rem;cursor:pointer;margin-bottom:.1rem;",s.textContent=o.label,o.name===t.activeEffect&&(s.style.background="var(--dm-primary,#4338ca)",s.style.color="var(--dm-primary-text,#fff)"),s.addEventListener("click",()=>{t.activeEffect=o.name,S.set("effects-builder-last",o.name),t.fieldValues={},b(e,t,r),r()}),e.appendChild(s)}}}function L(e,t){if(e.type==="select"){const c=document.createElement("select");c.style.cssText="width:100%;padding:.35rem .5rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:3px;color:var(--dm-text,#eee);font-size:.85rem;";for(const[a,o]of e.options){const s=document.createElement("option");s.value=a,s.textContent=o,c.appendChild(s)}return c.value=t??e.default??"",c}if(e.type==="checkbox"){const c=document.createElement("input");return c.type="checkbox",c.checked=t??e.default??!1,c}const r=document.createElement("input");return r.type=e.type==="number"?"number":e.type==="colour"?"color":"text",r.value=t??e.default??"",e.placeholder&&(r.placeholder=e.placeholder),e.type==="number"&&(e.min!=null&&(r.min=e.min),e.max!=null&&(r.max=e.max),e.step!=null&&(r.step=e.step)),r.style.cssText="width:100%;padding:.35rem .5rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:3px;color:var(--dm-text,#eee);font-size:.85rem;",r}function v(e,t){return t.type==="checkbox"?e.checked:t.type==="number"?e.value===""?"":Number(e.value):e.value}function O(e,t,r){const c=u(t.activeEffect);if(e.replaceChildren(),c.attrs.length===0){const o=document.createElement("div");o.style.cssText="color:var(--dm-text-muted,#888);font-size:.8rem;font-style:italic;",o.textContent="This effect takes no parameters.",e.appendChild(o);return}const a=document.createElement("div");a.style.cssText="display:grid;grid-template-columns:1fr 1fr;gap:.6rem .7rem;";for(const o of c.attrs){const s=document.createElement("div"),l=document.createElement("label");l.style.cssText="display:block;color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.2rem;",l.textContent=o.label,s.appendChild(l);const d=L(o,t.fieldValues[o.name]);if(d.addEventListener("input",()=>{t.fieldValues[o.name]=v(d,o),r()}),d.addEventListener("change",()=>{t.fieldValues[o.name]=v(d,o),r()}),s.appendChild(d),o.hint){const n=document.createElement("div");n.style.cssText="color:var(--dm-text-muted,#666);font-size:.7rem;margin-top:.15rem;",n.textContent=o.hint,s.appendChild(n)}a.appendChild(s)}e.appendChild(a)}function y(e){const t={},r=/(\w[\w-]*)(?:\s*=\s*"([^"]*)"|\s*=\s*'([^']*)'|\s*=\s*(\S+))?/g;for(const c of e.matchAll(r)){const a=c[1],o=c[2]??c[3]??c[4]??"";t[a]=o}return t}const V=_.filter(e=>!e.selfClosing).map(e=>e.name);function B(e){const t=e.value,r=e.selectionStart;for(const c of V){const a=new RegExp(`\\[${c}([^\\]]*)\\]`,"g"),o=new RegExp(`\\[/${c}\\]`,"g"),s=[];for(const n of t.matchAll(a)){if(n.index>=r)break;s.push({type:"open",start:n.index,end:n.index+n[0].length,attrStr:n[1]})}for(const n of t.matchAll(o)){if(n.index>=r)break;s.push({type:"close",start:n.index,end:n.index+n[0].length})}s.sort((n,i)=>n.start-i.start);let l=0,d=null;for(const n of s)n.type==="open"?(l++,d=n):(l--,l<0&&(l=0,d=null));if(l>0&&d){const n=new RegExp(`\\[/${c}\\]`,"g"),i=t.slice(r),m=i.match(n);if(m){const f=r+i.indexOf(m[0]);return{name:c,blockStart:d.start,blockEnd:f+m[0].length,openTagEnd:d.end,attrs:y(d.attrStr)}}}}return null}const N=["card","hero","banner","col","button"];function q(e){const t=e.value,r=e.selectionStart;for(const c of N){const a=new RegExp(`\\[${c}([^\\]]*)\\]`,"g"),o=new RegExp(`\\[/${c}\\]`,"g"),s=[];for(const n of t.matchAll(a)){if(n.index>=r)break;s.push({type:"open",start:n.index,end:n.index+n[0].length,attrStr:n[1]})}for(const n of t.matchAll(o)){if(n.index>=r)break;s.push({type:"close",start:n.index,end:n.index+n[0].length})}s.sort((n,i)=>n.start-i.start);let l=0,d=null;for(const n of s)n.type==="open"?(l++,d=n):(l--,l<0&&(l=0,d=null));if(l>0&&d){const n=new RegExp(`\\[/${c}\\]`,"g"),i=t.slice(r),m=i.match(n);if(m){const f=r+i.indexOf(m[0]);return{name:c,openTagStart:d.start,openTagEnd:d.end,closeTagStart:f,closeTagEnd:f+m[0].length,attrs:y(d.attrStr)}}}}return null}function C(e,t){const r=[];for(const c of t.attrs){const a=e.fieldValues[c.name];a===void 0||a===""||a===null||a!==c.default&&(c.type==="checkbox"?r.push(`${c.name}="${a?"true":"false"}"`):r.push(`${c.name}="${String(a).replace(/"/g,"&quot;")}"`))}return r.join(" ")}function k(e){const t=u(e.activeEffect),r=C(e,t),c=r?" ":"";if(e.scope==="inject"&&e.host){const a=e.host.attrs,o=t.name,s=[];for(const l of Object.keys(a)){if(l===o||l.startsWith(o+"-"))continue;const d=a[l];s.push(d===""?l:`${l}="${String(d).replace(/"/g,"&quot;")}"`)}s.push(o);for(const l of t.attrs){const d=e.fieldValues[l.name];if(d===void 0||d===""||d===null||d===l.default)continue;const n=l.type==="checkbox"?d?"true":"false":String(d).replace(/"/g,"&quot;");s.push(`${o}-${l.name}="${n}"`)}return`[${e.host.name} ${s.join(" ")}]\u2026[/${e.host.name}]`}return t.selfClosing?`[${t.name}${c}${r} /]`:`[${t.name}${c}${r}]
2
2
  Content
3
- [/${t.name}]`}function w(e,t){e.replaceChildren();const n=document.createElement("div");n.style.cssText="color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem;",n.textContent="Shortcode (live)",e.appendChild(n);const c=document.createElement("pre");c.style.cssText="background:var(--dm-surface-deep,#000);border:1px solid var(--dm-border,#333);padding:.5rem .65rem;border-radius:3px;font-family:var(--dm-font-mono,monospace);font-size:.75rem;color:#7c6af7;line-height:1.5;white-space:pre-wrap;word-break:break-all;margin:0;",c.textContent=$(t),e.appendChild(c)}function F(e,t,n){if(e.replaceChildren(),t.editing)return;const c=g(t.activeEffect),l=t.host&&c.hosts.includes(t.host.name),o=document.createElement("div");o.style.cssText="background:var(--dm-surface-subtle,#15152a);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:.5rem .6rem;";const s=document.createElement("div");if(s.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;margin-bottom:.3rem;",s.textContent="Apply as",o.appendChild(s),!l){const r=document.createElement("div");r.style.cssText="color:var(--dm-text-muted,#888);font-size:.75rem;font-style:italic;",t.host?r.textContent=`Inserted as a standalone block (${c.label} cannot be injected into [${t.host.name}]).`:r.textContent="Inserted as a standalone block.",o.appendChild(r),e.appendChild(o),t.scope="standalone";return}const i=document.createElement("div");i.style.cssText="display:flex;gap:.3rem;";function a(r,f){const d=document.createElement("button");return d.type="button",d.style.cssText="flex:1;padding:.35rem;border:1px solid var(--dm-border,#333);border-radius:3px;font-size:.75rem;font-weight:600;cursor:pointer;",t.scope===r?(d.style.background="var(--dm-primary,#4338ca)",d.style.color="#fff",d.style.borderColor="var(--dm-primary,#4338ca)"):(d.style.background="transparent",d.style.color="var(--dm-text-muted,#bbb)"),d.textContent=f,d.addEventListener("click",()=>{t.scope=r,n()}),d}i.appendChild(a("standalone","Standalone block")),i.appendChild(a("inject",`Inject into [${t.host.name}]`)),o.appendChild(i),e.appendChild(o)}let x=0;function T(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}function _(e,t){e.replaceChildren();const n=g(t.activeEffect),c=document.createElement("div");c.style.cssText="display:flex;justify-content:space-between;align-items:center;margin-bottom:.25rem;";const l=document.createElement("div");if(l.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;",l.textContent="Live preview",c.appendChild(l),!n.previewable){const a=document.createElement("div");a.style.cssText="background:var(--dm-surface-subtle,#15152a);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:.6rem;color:var(--dm-text-muted,#888);font-size:.8rem;font-style:italic;text-align:center;",a.textContent="Runs full-page on the published site \u2014 no inline preview.",e.appendChild(a);return}const o=document.createElement("button");o.type="button",o.style.cssText="background:transparent;border:1px solid var(--dm-border,#333);color:var(--dm-text-muted,#888);font-size:.65rem;padding:.15rem .4rem;border-radius:2px;cursor:pointer;",o.textContent="\u21BB Replay",c.appendChild(o),e.appendChild(c);const s=document.createElement("div");s.style.cssText="background:var(--dm-surface-subtle,#1a1a2e);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:1rem;text-align:center;min-height:80px;position:relative;overflow:hidden;",e.appendChild(s);function i(){x++;const a=x;s.replaceChildren();const r=document.createElement("div");r.style.cssText="background:linear-gradient(135deg,#6366f1,#a855f7);color:#fff;padding:.6rem;border-radius:4px;font-size:.8rem;font-weight:600;",r.textContent="Sample content",s.appendChild(r);const f=window.Domma&&window.Domma.effects;if(!f)return;const d={};for(const p of n.attrs){const m=t.fieldValues[p.name];m===void 0||m===""||m===null||(d[T(p.name)]=m)}try{const p=f[T(n.name)];if(typeof p=="function"){if(a!==x)return;p(r,d)}}catch(p){console.warn("Effects preview failed:",p)}}o.addEventListener("click",i),i()}function D(e,t,n){const c=g(t.activeEffect);e.replaceChildren();const l=document.createElement("h3");l.style.cssText="margin:0;font-size:1rem;color:var(--dm-text,#eee);",l.textContent=c.label,e.appendChild(l);const o=document.createElement("p");o.style.cssText="margin:0;color:var(--dm-text-muted,#999);font-size:.8rem;line-height:1.4;",o.textContent=c.description,e.appendChild(o);const s=document.createElement("div");e.appendChild(s);const i=document.createElement("div");e.appendChild(i);const a=document.createElement("div");e.appendChild(a);const r=document.createElement("div");e.appendChild(r);function f(){F(s,t,f),V(i,t,()=>{w(a,t),_(r,t)}),w(a,t),_(r,t)}f();const d=document.createElement("div");d.style.cssText="display:flex;gap:.5rem;margin-top:auto;padding-top:.75rem;border-top:1px solid var(--dm-border,#2a2a40);";const p=document.createElement("button");p.type="button",p.className="btn btn-ghost",p.textContent="Cancel",p.addEventListener("click",()=>n.close()),d.appendChild(p);const m=document.createElement("button");m.type="button",m.className="btn btn-primary",m.style.flex="2",m.textContent=t.editing?"Update":"Insert effect",m.addEventListener("click",()=>H(t,n)),d.appendChild(m),e.appendChild(d)}function H(e,t){const n=e.textarea,c=$(e);if(e.editing){const l=g(e.editing.name),o=n.value,s=o.substring(0,e.editing.blockStart),i=o.substring(e.editing.blockEnd),a=`[/${l.name}]`.length,r=e.editing.openTagEnd,f=e.editing.blockEnd-a,d=o.substring(r,f),p=k(e,l),m=p?" ":"",u=l.selfClosing?`[${l.name}${m}${p} /]`:`[${l.name}${m}${p}]${d}[/${l.name}]`;n.value=s+u+i;const b=l.selfClosing?s.length+u.length:s.length+u.indexOf("]")+1;n.selectionStart=n.selectionEnd=b,n.dispatchEvent(new Event("input",{bubbles:!0})),t.close();return}if(e.scope==="inject"&&e.host){const l=g(e.activeEffect),o=n.value,s=o.substring(0,e.host.openTagStart),i=o.substring(e.host.openTagEnd),a=e.host.attrs,r=l.name,f=[];for(const m of Object.keys(a)){if(m===r||m.startsWith(r+"-"))continue;const u=a[m];f.push(u===""?m:`${m}="${String(u).replace(/"/g,"&quot;")}"`)}f.push(r);for(const m of l.attrs){const u=e.fieldValues[m.name];if(u===void 0||u===""||u===null||u===m.default)continue;const b=m.type==="checkbox"?u?"true":"false":String(u).replace(/"/g,"&quot;");f.push(`${r}-${m.name}="${b}"`)}const d=`[${e.host.name} ${f.join(" ")}]`;n.value=s+d+i;const p=s.length+d.length;n.selectionStart=n.selectionEnd=p,n.dispatchEvent(new Event("input",{bubbles:!0})),t.close();return}R(n,c),n.dispatchEvent(new Event("input",{bubbles:!0})),t.close()}
3
+ [/${t.name}]`}function $(e,t){e.replaceChildren();const r=document.createElement("div");r.style.cssText="color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem;",r.textContent="Shortcode (live)",e.appendChild(r);const c=document.createElement("pre");c.style.cssText="background:var(--dm-code-bg,#000);border:1px solid var(--dm-border,#333);padding:.5rem .65rem;border-radius:3px;font-family:var(--dm-font-mono,monospace);font-size:.75rem;color:var(--dm-code-text,#7c6af7);line-height:1.5;white-space:pre-wrap;word-break:break-all;margin:0;",c.textContent=k(t),e.appendChild(c)}function P(e,t,r){if(e.replaceChildren(),t.editing)return;const c=u(t.activeEffect),a=t.host&&c.hosts.includes(t.host.name),o=document.createElement("div");o.style.cssText="background:var(--dm-background-alt,#15152a);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:.5rem .6rem;";const s=document.createElement("div");if(s.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;margin-bottom:.3rem;",s.textContent="Apply as",o.appendChild(s),!a){const n=document.createElement("div");n.style.cssText="color:var(--dm-text-muted,#888);font-size:.75rem;font-style:italic;",t.host?n.textContent=`Inserted as a standalone block (${c.label} cannot be injected into [${t.host.name}]).`:n.textContent="Inserted as a standalone block.",o.appendChild(n),e.appendChild(o),t.scope="standalone";return}const l=document.createElement("div");l.style.cssText="display:flex;gap:.3rem;";function d(n,i){const m=document.createElement("button");return m.type="button",m.style.cssText="flex:1;padding:.35rem;border:1px solid var(--dm-border,#333);border-radius:3px;font-size:.75rem;font-weight:600;cursor:pointer;",t.scope===n?(m.style.background="var(--dm-primary,#4338ca)",m.style.color="var(--dm-primary-text,#fff)",m.style.borderColor="var(--dm-primary,#4338ca)"):(m.style.background="transparent",m.style.color="var(--dm-text-muted,#bbb)"),m.textContent=i,m.addEventListener("click",()=>{t.scope=n,r()}),m}l.appendChild(d("standalone","Standalone block")),l.appendChild(d("inject",`Inject into [${t.host.name}]`)),o.appendChild(l),e.appendChild(o)}let h=0;function T(e){return e.replace(/-([a-z])/g,(t,r)=>r.toUpperCase())}function w(e,t){e.replaceChildren();const r=u(t.activeEffect),c=document.createElement("div");c.style.cssText="display:flex;justify-content:space-between;align-items:center;margin-bottom:.25rem;";const a=document.createElement("div");if(a.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;",a.textContent="Live preview",c.appendChild(a),!r.previewable){const d=document.createElement("div");d.style.cssText="background:var(--dm-background-alt,#15152a);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:.6rem;color:var(--dm-text-muted,#888);font-size:.8rem;font-style:italic;text-align:center;",d.textContent="Runs full-page on the published site \u2014 no inline preview.",e.appendChild(d);return}const o=document.createElement("button");o.type="button",o.style.cssText="background:transparent;border:1px solid var(--dm-border,#333);color:var(--dm-text-muted,#888);font-size:.65rem;padding:.15rem .4rem;border-radius:2px;cursor:pointer;",o.textContent="\u21BB Replay",c.appendChild(o),e.appendChild(c);const s=document.createElement("div");s.style.cssText="background:var(--dm-background-alt,#1a1a2e);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:1rem;text-align:center;min-height:80px;position:relative;overflow:hidden;",e.appendChild(s);function l(){h++;const d=h;s.replaceChildren();const n=document.createElement("div");n.style.cssText="background:linear-gradient(135deg,#6366f1,#a855f7);color:#fff;padding:.6rem;border-radius:4px;font-size:.8rem;font-weight:600;",n.textContent="Sample content",s.appendChild(n);const i=window.Domma&&window.Domma.effects;if(!i)return;const m={};for(const f of r.attrs){const p=t.fieldValues[f.name];p===void 0||p===""||p===null||(m[T(f.name)]=p)}try{const f=i[T(r.name)];if(typeof f=="function"){if(d!==h)return;f(n,m)}}catch(f){console.warn("Effects preview failed:",f)}}o.addEventListener("click",l),l()}function F(e,t,r){const c=u(t.activeEffect);e.replaceChildren();const a=document.createElement("h3");a.style.cssText="margin:0;font-size:1rem;color:var(--dm-text,#eee);",a.textContent=c.label,e.appendChild(a);const o=document.createElement("p");o.style.cssText="margin:0;color:var(--dm-text-muted,#999);font-size:.8rem;line-height:1.4;",o.textContent=c.description,e.appendChild(o);const s=document.createElement("div");e.appendChild(s);const l=document.createElement("div");e.appendChild(l);const d=document.createElement("div");e.appendChild(d);const n=document.createElement("div");e.appendChild(n);function i(){P(s,t,i),O(l,t,()=>{$(d,t),w(n,t)}),$(d,t),w(n,t)}i();const m=document.createElement("div");m.style.cssText="display:flex;gap:.5rem;margin-top:auto;padding-top:.75rem;border-top:1px solid var(--dm-border,#2a2a40);";const f=document.createElement("button");f.type="button",f.className="btn btn-ghost",f.textContent="Cancel",f.addEventListener("click",()=>r.close()),m.appendChild(f);const p=document.createElement("button");p.type="button",p.className="btn btn-primary",p.style.flex="2",p.textContent=t.editing?"Update":"Insert effect",p.addEventListener("click",()=>D(t,r)),m.appendChild(p),e.appendChild(m)}function D(e,t){const r=e.textarea,c=k(e);if(e.editing){const a=u(e.editing.name),o=r.value,s=`[/${a.name}]`.length,l=e.editing.openTagEnd,d=e.editing.blockEnd-s,n=o.substring(l,d),i=C(e,a),m=i?" ":"",f=a.selfClosing?`[${a.name}${m}${i} /]`:`[${a.name}${m}${i}]${n}[/${a.name}]`;x(r,e.editing.blockStart,e.editing.blockEnd,f);const p=a.selfClosing?e.editing.blockStart+f.length:e.editing.blockStart+f.indexOf("]")+1;r.setSelectionRange(p,p),t.close();return}if(e.scope==="inject"&&e.host){const a=u(e.activeEffect),o=e.host.attrs,s=a.name,l=[];for(const n of Object.keys(o)){if(n===s||n.startsWith(s+"-"))continue;const i=o[n];l.push(i===""?n:`${n}="${String(i).replace(/"/g,"&quot;")}"`)}l.push(s);for(const n of a.attrs){const i=e.fieldValues[n.name];if(i===void 0||i===""||i===null||i===n.default)continue;const m=n.type==="checkbox"?i?"true":"false":String(i).replace(/"/g,"&quot;");l.push(`${s}-${n.name}="${m}"`)}const d=`[${e.host.name} ${l.join(" ")}]`;x(r,e.host.openTagStart,e.host.openTagEnd,d),t.close();return}A(r,c),t.close()}
@@ -1 +1 @@
1
- import{insertAtCursor as U}from"./markdown-toolbar.js";import{api as D}from"../api.js";let x=null;const Y=["16:9","4:3","1:1","21:9","9:16","3:4"],R=/\.(mp4|webm|ogg|ogv)(?:\?|#|$)/i;export const EmbedBuilder={open(e){if(x)return;const t={textarea:e,url:"",ratio:"16:9",title:"",width:"",align:"",autoplay:!1,loop:!1,muted:!1},o=E.slideover({title:"Insert embed",size:"lg",position:"right",onClose:()=>{x=null}}),d=O(t,o);o.element.appendChild(d),o.open(),window.I&&I.scan(d),x={state:t,slideover:o}},close(){x&&(x.slideover.close(),x=null)}};function F(e){const t=String(e||"").trim();return t?/(?:youtube(?:-nocookie)?\.com\/(?:watch\?|embed\/|shorts\/|live\/)|youtu\.be\/)/i.test(t)?"YouTube":/vimeo\.com\//i.test(t)?"Vimeo":R.test(t)?"Self-hosted video":/^https?:\/\//i.test(t)?"Generic iframe":"Unknown":null}function N(e){return String(e).replace(/"/g,"&quot;")}function B(e){const t=[`url="${N(e.url||"")}"`];return e.ratio&&e.ratio!=="16:9"&&t.push(`ratio="${e.ratio}"`),e.title&&t.push(`title="${N(e.title)}"`),e.width&&t.push(`width="${N(e.width)}"`),e.align&&t.push(`align="${e.align}"`),e.autoplay&&t.push("autoplay"),e.muted&&t.push("muted"),e.loop&&t.push("loop"),`[embed ${t.join(" ")} /]`}const g="width:100%;padding:.4rem .55rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:4px;color:var(--dm-text,#eee);font-size:.85rem;",M="display:block;color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem;";function s(e){const t=document.createElement("label");return t.style.cssText=M,t.textContent=e,t}function O(e,t){const o=document.createElement("div");o.style.cssText="padding:1rem;display:flex;flex-direction:column;gap:.85rem;min-height:100%;";const d=document.createElement("div");d.appendChild(s("Embed URL or media path"));const i=document.createElement("input");i.type="text",i.placeholder="https://youtu.be/\u2026 or /media/clip.mp4",i.style.cssText=g;const p=document.createElement("div");p.style.cssText="color:var(--dm-text-muted,#888);font-size:.72rem;margin-top:.25rem;min-height:1em;";let n;function r(){e.url=i.value.trim();const l=F(e.url);p.textContent=l?`Detected: ${l}`:"",n&&(n.textContent=B(e))}i.addEventListener("input",r);const m=document.createElement("button");m.type="button",m.className="btn btn-ghost",m.style.cssText="margin-top:.4rem;font-size:.78rem;",m.textContent="Browse self-hosted video\u2026";const L=document.createElement("div");L.style.cssText="display:none;margin-top:.4rem;max-height:180px;overflow-y:auto;border:1px solid var(--dm-border,#2a2a40);border-radius:4px;",m.addEventListener("click",()=>V(L,i,r)),d.appendChild(i),d.appendChild(p),d.appendChild(m),d.appendChild(L),o.appendChild(d);const k=document.createElement("div");k.appendChild(s("Aspect ratio"));const u=document.createElement("select");u.style.cssText=g;for(const l of Y){const a=document.createElement("option");a.value=l,a.textContent=l,u.appendChild(a)}u.value=e.ratio,u.addEventListener("change",()=>{e.ratio=u.value,r()}),k.appendChild(u),o.appendChild(k);const z=document.createElement("div");z.appendChild(s("Caption / title (optional)"));const v=document.createElement("input");v.type="text",v.style.cssText=g,v.addEventListener("input",()=>{e.title=v.value,r()}),z.appendChild(v),o.appendChild(z);const C=document.createElement("div");C.style.cssText="display:grid;grid-template-columns:1fr 1fr;gap:.7rem;";const S=document.createElement("div");S.appendChild(s("Max width (px or %)"));const h=document.createElement("input");h.type="text",h.placeholder="e.g. 640 or 80%",h.style.cssText=g,h.addEventListener("input",()=>{e.width=h.value.trim(),r()}),S.appendChild(h);const $=document.createElement("div");$.appendChild(s("Alignment"));const y=document.createElement("select");y.style.cssText=g;for(const[l,a]of[["","Full width"],["left","Left"],["center","Centre"],["right","Right"]]){const c=document.createElement("option");c.value=l,c.textContent=a,y.appendChild(c)}y.addEventListener("change",()=>{e.align=y.value,r()}),$.appendChild(y),C.appendChild(S),C.appendChild($),o.appendChild(C);const w=document.createElement("div");w.appendChild(s("Playback"));const A=document.createElement("div");A.style.cssText="display:flex;gap:1.2rem;flex-wrap:wrap;";for(const l of["autoplay","loop","muted"]){const a=document.createElement("label");a.style.cssText="display:flex;align-items:center;gap:.35rem;font-size:.82rem;color:var(--dm-text,#ddd);cursor:pointer;";const c=document.createElement("input");c.type="checkbox",c.addEventListener("change",()=>{e[l]=c.checked,r()}),a.appendChild(c),a.appendChild(document.createTextNode(l.charAt(0).toUpperCase()+l.slice(1))),A.appendChild(a)}w.appendChild(A);const _=document.createElement("div");_.style.cssText="color:var(--dm-text-muted,#666);font-size:.7rem;margin-top:.3rem;",_.textContent="Autoplay is muted automatically (browser policy).",w.appendChild(_),o.appendChild(w);const W=document.createElement("div");W.appendChild(s("Shortcode (live)")),n=document.createElement("pre"),n.style.cssText="background:var(--dm-surface-deep,#000);border:1px solid var(--dm-border,#333);padding:.5rem .65rem;border-radius:4px;font-family:var(--dm-font-mono,monospace);font-size:.75rem;color:#7c6af7;line-height:1.5;white-space:pre-wrap;word-break:break-all;margin:0;",W.appendChild(n),o.appendChild(W),r();const T=document.createElement("div");T.style.cssText="display:flex;gap:.5rem;margin-top:auto;padding-top:.85rem;border-top:1px solid var(--dm-border,#2a2a40);";const b=document.createElement("button");b.type="button",b.className="btn btn-ghost",b.textContent="Cancel",b.addEventListener("click",()=>t.close());const f=document.createElement("button");return f.type="button",f.className="btn btn-primary",f.style.flex="2",f.textContent="Insert embed",f.addEventListener("click",()=>{if(!e.url){window.E&&E.toast("Enter a URL or media path first.",{type:"warning"}),i.focus();return}U(e.textarea,B(e)),e.textarea.dispatchEvent(new Event("input",{bubbles:!0})),t.close()}),T.appendChild(b),T.appendChild(f),o.appendChild(T),o}async function V(e,t,o){if(e.style.display!=="none"){e.style.display="none";return}e.style.display="block",e.replaceChildren();const d=document.createElement("div");d.style.cssText="padding:.5rem .6rem;color:var(--dm-text-muted,#888);font-size:.8rem;",d.textContent="Loading\u2026",e.appendChild(d);let i=[];try{i=await D.media.list()||[]}catch{i=[]}const p=i.filter(n=>R.test(n.name||n.url||""));if(e.replaceChildren(),!p.length){const n=document.createElement("div");n.style.cssText="padding:.5rem .6rem;color:var(--dm-text-muted,#888);font-size:.8rem;",n.textContent="No video files uploaded yet.",e.appendChild(n);return}for(const n of p){const r=document.createElement("button");r.type="button",r.style.cssText="display:block;width:100%;text-align:left;padding:.4rem .6rem;border:none;background:transparent;color:var(--dm-text,#ddd);font-size:.8rem;cursor:pointer;border-bottom:1px solid var(--dm-border,#2a2a40);",r.textContent=n.name||n.url,r.addEventListener("click",()=>{t.value=n.url||`/media/${n.name}`,e.style.display="none",o(),t.focus()}),e.appendChild(r)}}
1
+ import{insertAtCursor as U}from"./markdown-toolbar.js";import{api as D}from"../api.js";let x=null;const Y=["16:9","4:3","1:1","21:9","9:16","3:4"],R=/\.(mp4|webm|ogg|ogv)(?:\?|#|$)/i;export const EmbedBuilder={open(e){if(x)return;const t={textarea:e,url:"",ratio:"16:9",title:"",width:"",align:"",autoplay:!1,loop:!1,muted:!1},o=E.slideover({title:"Insert embed",size:"lg",position:"right",onClose:()=>{x=null}}),r=O(t,o);o.element.appendChild(r),o.open(),window.I&&I.scan(r),x={state:t,slideover:o}},close(){x&&(x.slideover.close(),x=null)}};function F(e){const t=String(e||"").trim();return t?/(?:youtube(?:-nocookie)?\.com\/(?:watch\?|embed\/|shorts\/|live\/)|youtu\.be\/)/i.test(t)?"YouTube":/vimeo\.com\//i.test(t)?"Vimeo":R.test(t)?"Self-hosted video":/^https?:\/\//i.test(t)?"Generic iframe":"Unknown":null}function N(e){return String(e).replace(/"/g,"&quot;")}function B(e){const t=[`url="${N(e.url||"")}"`];return e.ratio&&e.ratio!=="16:9"&&t.push(`ratio="${e.ratio}"`),e.title&&t.push(`title="${N(e.title)}"`),e.width&&t.push(`width="${N(e.width)}"`),e.align&&t.push(`align="${e.align}"`),e.autoplay&&t.push("autoplay"),e.muted&&t.push("muted"),e.loop&&t.push("loop"),`[embed ${t.join(" ")} /]`}const y="width:100%;padding:.4rem .55rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:4px;color:var(--dm-text,#eee);font-size:.85rem;",M="display:block;color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem;";function s(e){const t=document.createElement("label");return t.style.cssText=M,t.textContent=e,t}function O(e,t){const o=document.createElement("div");o.style.cssText="padding:1rem;display:flex;flex-direction:column;gap:.85rem;min-height:100%;";const r=document.createElement("div");r.appendChild(s("Embed URL or media path"));const i=document.createElement("input");i.type="text",i.placeholder="https://youtu.be/\u2026 or /media/clip.mp4",i.style.cssText=y;const p=document.createElement("div");p.style.cssText="color:var(--dm-text-muted,#888);font-size:.72rem;margin-top:.25rem;min-height:1em;";let n;function d(){e.url=i.value.trim();const l=F(e.url);p.textContent=l?`Detected: ${l}`:"",n&&(n.textContent=B(e))}i.addEventListener("input",d);const m=document.createElement("button");m.type="button",m.className="btn btn-ghost",m.style.cssText="margin-top:.4rem;font-size:.78rem;",m.textContent="Browse self-hosted video\u2026";const L=document.createElement("div");L.style.cssText="display:none;margin-top:.4rem;max-height:180px;overflow-y:auto;border:1px solid var(--dm-border,#2a2a40);border-radius:4px;",m.addEventListener("click",()=>V(L,i,d)),r.appendChild(i),r.appendChild(p),r.appendChild(m),r.appendChild(L),o.appendChild(r);const k=document.createElement("div");k.appendChild(s("Aspect ratio"));const u=document.createElement("select");u.style.cssText=y;for(const l of Y){const a=document.createElement("option");a.value=l,a.textContent=l,u.appendChild(a)}u.value=e.ratio,u.addEventListener("change",()=>{e.ratio=u.value,d()}),k.appendChild(u),o.appendChild(k);const z=document.createElement("div");z.appendChild(s("Caption / title (optional)"));const v=document.createElement("input");v.type="text",v.style.cssText=y,v.addEventListener("input",()=>{e.title=v.value,d()}),z.appendChild(v),o.appendChild(z);const C=document.createElement("div");C.style.cssText="display:grid;grid-template-columns:1fr 1fr;gap:.7rem;";const S=document.createElement("div");S.appendChild(s("Max width (px or %)"));const h=document.createElement("input");h.type="text",h.placeholder="e.g. 640 or 80%",h.style.cssText=y,h.addEventListener("input",()=>{e.width=h.value.trim(),d()}),S.appendChild(h);const $=document.createElement("div");$.appendChild(s("Alignment"));const b=document.createElement("select");b.style.cssText=y;for(const[l,a]of[["","Full width"],["left","Left"],["center","Centre"],["right","Right"]]){const c=document.createElement("option");c.value=l,c.textContent=a,b.appendChild(c)}b.addEventListener("change",()=>{e.align=b.value,d()}),$.appendChild(b),C.appendChild(S),C.appendChild($),o.appendChild(C);const w=document.createElement("div");w.appendChild(s("Playback"));const A=document.createElement("div");A.style.cssText="display:flex;gap:1.2rem;flex-wrap:wrap;";for(const l of["autoplay","loop","muted"]){const a=document.createElement("label");a.style.cssText="display:flex;align-items:center;gap:.35rem;font-size:.82rem;color:var(--dm-text,#ddd);cursor:pointer;";const c=document.createElement("input");c.type="checkbox",c.addEventListener("change",()=>{e[l]=c.checked,d()}),a.appendChild(c),a.appendChild(document.createTextNode(l.charAt(0).toUpperCase()+l.slice(1))),A.appendChild(a)}w.appendChild(A);const _=document.createElement("div");_.style.cssText="color:var(--dm-text-muted,#666);font-size:.7rem;margin-top:.3rem;",_.textContent="Autoplay is muted automatically (browser policy).",w.appendChild(_),o.appendChild(w);const W=document.createElement("div");W.appendChild(s("Shortcode (live)")),n=document.createElement("pre"),n.style.cssText="background:var(--dm-code-bg,#000);border:1px solid var(--dm-border,#333);padding:.5rem .65rem;border-radius:4px;font-family:var(--dm-font-mono,monospace);font-size:.75rem;color:var(--dm-code-text,#7c6af7);line-height:1.5;white-space:pre-wrap;word-break:break-all;margin:0;",W.appendChild(n),o.appendChild(W),d();const T=document.createElement("div");T.style.cssText="display:flex;gap:.5rem;margin-top:auto;padding-top:.85rem;border-top:1px solid var(--dm-border,#2a2a40);";const g=document.createElement("button");g.type="button",g.className="btn btn-ghost",g.textContent="Cancel",g.addEventListener("click",()=>t.close());const f=document.createElement("button");return f.type="button",f.className="btn btn-primary",f.style.flex="2",f.textContent="Insert embed",f.addEventListener("click",()=>{if(!e.url){window.E&&E.toast("Enter a URL or media path first.",{type:"warning"}),i.focus();return}U(e.textarea,B(e)),e.textarea.dispatchEvent(new Event("input",{bubbles:!0})),t.close()}),T.appendChild(g),T.appendChild(f),o.appendChild(T),o}async function V(e,t,o){if(e.style.display!=="none"){e.style.display="none";return}e.style.display="block",e.replaceChildren();const r=document.createElement("div");r.style.cssText="padding:.5rem .6rem;color:var(--dm-text-muted,#888);font-size:.8rem;",r.textContent="Loading\u2026",e.appendChild(r);let i=[];try{i=await D.media.list()||[]}catch{i=[]}const p=i.filter(n=>R.test(n.name||n.url||""));if(e.replaceChildren(),!p.length){const n=document.createElement("div");n.style.cssText="padding:.5rem .6rem;color:var(--dm-text-muted,#888);font-size:.8rem;",n.textContent="No video files uploaded yet.",e.appendChild(n);return}for(const n of p){const d=document.createElement("button");d.type="button",d.style.cssText="display:block;width:100%;text-align:left;padding:.4rem .6rem;border:none;background:transparent;color:var(--dm-text,#ddd);font-size:.8rem;cursor:pointer;border-bottom:1px solid var(--dm-border,#2a2a40);",d.textContent=n.name||n.url,d.addEventListener("click",()=>{t.value=n.url||`/media/${n.name}`,e.style.display="none",o(),t.focus()}),e.appendChild(d)}}