domma-cms 0.17.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +39 -3
- package/admin/css/admin.css +1 -1
- package/admin/css/dashboard.css +1 -1
- package/admin/index.html +2 -2
- package/admin/js/api.js +1 -1
- package/admin/js/app.js +4 -4
- package/admin/js/config/sidebar-config.js +1 -1
- package/admin/js/lib/card-builder.js +3 -3
- package/admin/js/lib/crud-tutorial.js +1 -0
- package/admin/js/lib/effects-builder.js +1 -1
- package/admin/js/lib/markdown-toolbar.js +6 -6
- package/admin/js/lib/project-context.js +1 -0
- package/admin/js/lib/sidebar-renderer.js +4 -0
- package/admin/js/templates/action-editor.html +7 -0
- package/admin/js/templates/block-editor.html +7 -0
- package/admin/js/templates/collection-editor.html +9 -0
- package/admin/js/templates/dashboard/cache.html +32 -0
- package/admin/js/templates/dashboard.html +4 -0
- package/admin/js/templates/form-editor.html +9 -0
- package/admin/js/templates/menu-editor.html +98 -0
- package/admin/js/templates/menu-locations.html +14 -0
- package/admin/js/templates/menus.html +14 -0
- package/admin/js/templates/page-editor.html +9 -2
- package/admin/js/templates/project-detail.html +50 -0
- package/admin/js/templates/project-editor.html +45 -0
- package/admin/js/templates/project-settings.html +60 -0
- package/admin/js/templates/projects.html +13 -0
- package/admin/js/templates/role-editor.html +11 -0
- package/admin/js/templates/settings.html +26 -0
- package/admin/js/templates/tutorials.html +335 -2
- package/admin/js/templates/view-editor.html +7 -0
- package/admin/js/views/action-editor.js +1 -1
- package/admin/js/views/actions-list.js +1 -1
- package/admin/js/views/block-editor-enhance.js +1 -1
- package/admin/js/views/block-editor.js +8 -8
- package/admin/js/views/blocks.js +2 -2
- package/admin/js/views/collection-editor.js +4 -4
- package/admin/js/views/collections.js +1 -1
- package/admin/js/views/dashboard/widgets/activity-feed.js +1 -1
- package/admin/js/views/dashboard/widgets/cache.js +1 -0
- package/admin/js/views/dashboard/widgets/journeys.js +1 -1
- package/admin/js/views/dashboard/widgets/spike-feed.js +1 -1
- package/admin/js/views/dashboard/widgets/top-pages.js +1 -1
- package/admin/js/views/dashboard.js +1 -1
- package/admin/js/views/form-editor.js +6 -6
- package/admin/js/views/forms.js +1 -1
- package/admin/js/views/index.js +1 -1
- package/admin/js/views/menu-editor.js +19 -0
- package/admin/js/views/menu-locations.js +1 -0
- package/admin/js/views/menus.js +5 -0
- package/admin/js/views/page-editor.js +41 -36
- package/admin/js/views/pages.js +3 -3
- package/admin/js/views/project-detail.js +4 -0
- package/admin/js/views/project-editor.js +1 -0
- package/admin/js/views/project-settings.js +1 -0
- package/admin/js/views/projects.js +7 -0
- package/admin/js/views/role-editor.js +1 -1
- package/admin/js/views/roles.js +3 -3
- package/admin/js/views/settings.js +3 -3
- package/admin/js/views/tutorials.js +1 -1
- package/admin/js/views/user-editor.js +1 -1
- package/admin/js/views/users.js +3 -3
- package/admin/js/views/view-editor.js +1 -1
- package/admin/js/views/views-list.js +1 -1
- package/config/cache.json +4 -0
- package/config/cache.json.example +12 -0
- package/config/menu-locations.json +5 -0
- package/config/menus/admin-sidebar.json +185 -0
- package/config/menus/footer.json +33 -0
- package/config/menus/main.json +35 -0
- package/config/menus/sproj-1779696558011-menu.json +17 -0
- package/config/menus/sproj-1779696960337-menu.json +18 -0
- package/config/menus/sproj-1779696985353-menu.json +18 -0
- package/config/site.json +6 -22
- package/package.json +4 -3
- package/plugins/analytics/daily.json +3 -0
- package/plugins/analytics/journeys.json +8 -0
- package/plugins/analytics/lifetime.json +1 -1
- package/public/css/site.css +1 -1
- package/public/js/collection-browser.js +4 -0
- package/public/js/forms.js +1 -1
- package/public/js/site.js +1 -1
- package/server/config.js +12 -1
- package/server/middleware/auth.js +88 -22
- package/server/routes/api/actions.js +58 -5
- package/server/routes/api/auth.js +2 -2
- package/server/routes/api/blocks.js +18 -3
- package/server/routes/api/cache.js +57 -0
- package/server/routes/api/collections.js +201 -8
- package/server/routes/api/forms.js +266 -21
- package/server/routes/api/menu-locations.js +46 -0
- package/server/routes/api/menus.js +115 -0
- package/server/routes/api/navigation.js +2 -0
- package/server/routes/api/pages.js +1 -1
- package/server/routes/api/projects.js +107 -0
- package/server/routes/api/scaffold.js +86 -0
- package/server/routes/api/settings.js +3 -0
- package/server/routes/api/sidebar.js +23 -0
- package/server/routes/api/users.js +32 -7
- package/server/routes/api/views.js +10 -2
- package/server/routes/public.js +88 -7
- package/server/server.js +54 -3
- package/server/services/actions.js +137 -8
- package/server/services/adapters/FileAdapter.js +23 -8
- package/server/services/adapters/MongoAdapter.js +36 -18
- package/server/services/blocks.js +23 -8
- package/server/services/cache/drivers/MemoryDriver.js +118 -0
- package/server/services/cache/drivers/NoneDriver.js +12 -0
- package/server/services/cache/index.js +229 -0
- package/server/services/cache/lru.js +61 -0
- package/server/services/collections.js +102 -12
- package/server/services/content.js +25 -6
- package/server/services/filterEngine.js +281 -0
- package/server/services/forms.js +3 -0
- package/server/services/hooks.js +48 -0
- package/server/services/markdown.js +711 -124
- package/server/services/menus-migration.js +107 -0
- package/server/services/menus.js +422 -0
- package/server/services/permissionRegistry.js +26 -0
- package/server/services/plugins.js +9 -2
- package/server/services/presetCollections.js +22 -0
- package/server/services/projects.js +429 -0
- package/server/services/recipes/contact-list.json +78 -0
- package/server/services/recipes/onboarding.json +426 -0
- package/server/services/references.js +174 -0
- package/server/services/renderer.js +237 -40
- package/server/services/roles.js +6 -1
- package/server/services/rowAccess.js +86 -13
- package/server/services/scaffolder.js +465 -0
- package/server/services/sidebar-migration.js +117 -0
- package/server/services/sitemap.js +112 -0
- package/server/services/userRoles.js +86 -0
- package/server/services/users.js +23 -2
- package/server/services/views.js +19 -4
- package/server/templates/page.html +135 -130
- /package/config/{navigation.json → navigation.json.bak} +0 -0
package/public/css/site.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
body,button,input,select,textarea{font-family:Roboto,sans-serif}#site-navbar.navbar-dark .navbar-brand,#site-navbar.navbar-dark .navbar-brand-text,#site-navbar.navbar-dark .navbar-brand-tagline{color:var(--dm-text-inverse, #fff)}#site-navbar.navbar-light .navbar-brand,#site-navbar.navbar-light .navbar-brand-text,#site-navbar.navbar-light .navbar-brand-tagline{color:var(--dm-text, #212529)}.navbar-brand-logo{height:32px;width:auto;display:inline-block;vertical-align:middle;margin-right:.4em}.navbar-brand-tagline{display:block;font-size:.65em;opacity:.75;line-height:1.2;letter-spacing:.02em}.navbar-brand-text.navbar-brand-sm{font-size:.85em}.navbar-brand-text.navbar-brand-lg{font-size:1.25em}.navbar-actions{order:4;margin-left:auto;display:flex;align-items:center;gap:.5rem}.navbar-dark .navbar-actions{color:var(--dm-text-inverse, rgba(255, 255, 255, .85))}.navbar-dark .site-search-shortcut-hint{color:#fff9;border-color:#ffffff40}.navbar-light .navbar-actions{color:var(--dm-text, #111)}.site-main{min-height:calc(100vh - 60px);padding-top:2rem;padding-bottom:4rem}.site-main.with-sidebar{display:grid;grid-template-columns:260px 1fr;gap:0}.site-sidebar{min-height:100%;border-right:1px solid var(--border-color, rgba(255,255,255,.08))}.site-content{overflow:hidden}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}.container{padding:0 1.5rem}.page-title{font-size:clamp(1.5rem,4vw,2rem);font-weight:700;margin-bottom:1.5rem;line-height:1.2}.page-body{line-height:1.7;font-size:1rem}.page-body h1,.page-body h2,.page-body h3,.page-body h4{margin-top:2rem;margin-bottom:.75rem;font-weight:600}.page-body h2{font-size:clamp(1.2rem,3vw,1.5rem)}.page-body h3{font-size:clamp(1.1rem,2.5vw,1.25rem)}.page-body p{margin-bottom:1rem}.page-body ul,.page-body ol{margin-bottom:1rem;padding-left:1.5rem}.page-body a{color:var(--primary, #5b8cff)}.page-body a:hover{text-decoration:underline}.page-body code{font-family:Fira Code,Courier New,monospace;font-size:.9em;background:#ffffff0f;padding:.15em .35em;border-radius:3px}.page-body pre{background:#0000004d;border:1px solid rgba(255,255,255,.08);border-radius:6px;padding:1rem;overflow-x:auto;margin-bottom:1rem}.page-body pre code{background:none;padding:0}.page-body img{max-width:100%;border-radius:6px}.page-body blockquote{border-left:3px solid var(--primary, #5b8cff);margin:1.5rem 0;padding:.75rem 1rem;background:#5b8cff0f;border-radius:0 6px 6px 0}h3.accordion-header{margin:0}.accordion-button{all:unset;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;font:inherit}.page-body .card-header h2{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.card[data-collapsible] .card-header{cursor:pointer;user-select:none;display:flex;align-items:center;justify-content:space-between}.card[data-collapsible] .card-header:after{content:"\25be";font-size:1.1em;line-height:1;display:inline-block;transition:transform .25s ease;flex-shrink:0}.card[data-collapsible].is-collapsed .card-header:after{transform:rotate(-90deg)}.card[data-collapsible] .card-body{overflow:hidden;max-height:4000px;opacity:1;transition:max-height .3s ease,opacity .25s ease}.card[data-collapsible].is-collapsed .card-body{max-height:0;opacity:0}.navbar-link span[data-icon],.navbar-link svg,.navbar-dropdown-toggle span[data-icon],.navbar-dropdown-toggle svg,.navbar-dropdown-item span[data-icon],.navbar-dropdown-item svg{width:13px!important;height:13px!important;margin-right:10px!important}.navbar-dropdown-toggle{font-size:var(--dm-font-size-base)}@media(min-width:993px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-sm)}}@media(min-width:1201px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-xs)}}.dm-reduced-motion *,.dm-reduced-motion *:before,.dm-reduced-motion *:after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}.page-footer{border-top:1px solid var(--border-color, rgba(255,255,255,.08));padding:1.5rem 0}.footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;max-width:1200px;margin:0 auto}.footer-inner p{margin:0;color:var(--text-muted, #888);font-size:.875rem}.footer-links{display:flex;gap:1.25rem}.footer-links a{color:var(--text-muted, #888);font-size:.875rem;text-decoration:none}.footer-links a:hover{color:var(--text, #eee)}.footer-social{display:flex;gap:.5rem;align-items:center}.footer-social-link{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;color:var(--text-muted, #888);transition:color .15s}.footer-social-link:hover{color:var(--text, #eee)}.footer-social-link svg{width:1rem;height:1rem}.footer-motion-switch{font-size:.8rem;color:var(--text-muted, #888);white-space:nowrap}.footer-motion-switch .form-switch-label{color:var(--text-muted, #888)}.footer-motion-switch .form-switch-input{width:2rem;height:1.125rem}.footer-motion-switch .form-switch-input:after{width:.875rem;height:.875rem}.footer-motion-switch .form-switch-input:checked:after{transform:translate(.875rem)}.dm-slideover-header{display:flex;align-items:center;justify-content:space-between;padding:.875rem 1.25rem;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08));flex-shrink:0}.dm-slideover-title{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.dm-slideover-body{padding:1.25rem;overflow-y:auto;flex:1}@media(max-width:768px){.site-main.with-sidebar{grid-template-columns:1fr}.site-sidebar{display:none}}.dm-spacer{display:block;width:100%}.hero-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.site-main:has(.page-body>.hero-breakout:first-child){padding-top:0}body[data-layout=landing]>.site-main{padding-top:0}body[data-layout=landing]>.site-main .container{max-width:none;padding:0}body[data-layout=landing] .page-body{padding-left:1.5rem;padding-right:1.5rem}body[data-layout=landing] .page-body>p,body[data-layout=landing] .page-body>h1,body[data-layout=landing] .page-body>h2,body[data-layout=landing] .page-body>h3,body[data-layout=landing] .page-body>ul,body[data-layout=landing] .page-body>ol,body[data-layout=landing] .page-body>blockquote{max-width:860px;margin-left:auto;margin-right:auto}.hero-breakout{width:100vw;margin-left:calc((100% - 100vw)/2);max-width:none}body[data-layout=landing] .page-body .hero-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem}body[data-layout=landing] .page-body .grid-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.page-body .card{transition:transform .2s ease,box-shadow .2s ease}.page-body .card:hover{transform:translateY(-3px);box-shadow:0 8px 24px #00000059}.page-body .card-header-icon-inline{display:flex;align-items:center;gap:.6rem}.page-body .card-header-icon-inline [data-icon]{flex-shrink:0;line-height:0}.page-body .card-header-icon-inline [data-icon] svg,.page-body .card-header-icon-inline>svg{display:block;width:1.25rem;height:1.25rem}.page-body .card-header-icon-stacked{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.35rem;padding-top:.25rem}.page-body .card-header-icon-stacked [data-icon],.page-body .card-header-icon-stacked svg{width:2rem;height:2rem}.page-body .dm-card-clean{background:var(--dm-surface);border:1px solid var(--dm-border);box-shadow:0 1px 4px #0000000f,0 2px 8px #0000000a;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-clean:hover{transform:translateY(-4px);box-shadow:0 8px 24px #0000001a,0 2px 8px #0000000f}.page-body .dm-card-clean .card-header{color:var(--dm-text)}.page-body .dm-card-clean .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-clean .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-gradient{background:#fff;border:none;box-shadow:0 4px 20px #6366f124;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-gradient:hover{transform:translateY(-5px);box-shadow:0 16px 40px #6366f140}.page-body .dm-card-gradient .card-header{background:linear-gradient(135deg,var(--dm-card-g-start, #6366f1),var(--dm-card-g-end, #8b5cf6));color:#fff;border-bottom:none}.page-body .dm-card-gradient .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-gradient .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-glass{background:#ffffff2e;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.38);box-shadow:0 4px 24px #00000014;transition:transform .2s ease,box-shadow .2s ease,background .2s ease}.page-body .dm-card-glass:hover{transform:translateY(-4px);box-shadow:0 12px 36px #00000024;background:#ffffff42}.page-body .dm-card-glass .card-header{border-bottom:1px solid rgba(255,255,255,.25);color:var(--dm-text)}.page-body .dm-card-glass .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glass .card-footer{color:var(--dm-text-muted)}.page-body .dm-card-accent{background:var(--dm-surface);border:1px solid var(--dm-border);border-left:4px solid #6366f1;box-shadow:0 1px 4px #0000000d;transition:transform .2s ease,box-shadow .2s ease,border-left-color .2s ease}.page-body .dm-card-accent:hover{transform:translateY(-3px);border-left-color:#4f46e5;box-shadow:0 8px 24px #6366f11f}.page-body .dm-card-accent .card-header{color:var(--dm-primary);border-bottom:none}.page-body .dm-card-accent .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-accent .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-dark{background:linear-gradient(160deg,#1e293b,#0f172a);border:1px solid rgba(255,255,255,.06);box-shadow:0 4px 20px #0000004d;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-dark:hover{transform:translateY(-4px) scale(1.012);box-shadow:0 16px 40px #00000073}.page-body .dm-card-dark .card-header{color:#f1f5f9;border-bottom:1px solid rgba(255,255,255,.08)}.page-body .dm-card-dark .card-body{color:#94a3b8}.page-body .dm-card-dark .card-footer{color:#475569;border-top:1px solid rgba(255,255,255,.06)}.page-body .dm-card-glow{background:var(--dm-surface);border:1px solid #a5b4fc;box-shadow:0 0 #6366f100;transition:transform .2s ease,box-shadow .3s ease,border-color .2s ease}.page-body .dm-card-glow:hover{transform:translateY(-3px);border-color:#818cf8;box-shadow:0 0 0 4px #6366f124,0 0 28px #6366f138}.page-body .dm-card-glow .card-header{color:var(--dm-primary);border-bottom:1px solid #e0e7ff}.page-body .dm-card-glow .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glow .card-footer{border-top:1px solid #e0e7ff;color:#818cf8}.page-body .card-hover{transition:transform .2s ease,box-shadow .2s ease}.page-body .card-hover:hover{transform:translateY(-3px);box-shadow:0 8px 20px #0000001a}.card-gradient-indigo{background:linear-gradient(135deg,#6366f1,#8b5cf6)}.card-gradient-ocean{background:linear-gradient(135deg,#0891b2,#2563eb)}.card-gradient-sunset{background:linear-gradient(135deg,#f59e0b,#ef4444,#ec4899)}.card-gradient-forest{background:linear-gradient(135deg,#10b981,#0d9488)}.card-gradient-rose{background:linear-gradient(135deg,#fb7185,#e11d48)}.card-gradient-midnight{background:linear-gradient(135deg,#1e1b4b,#4338ca)}.card-gradient-aurora{background:linear-gradient(135deg,#06b6d4,#6366f1,#a855f7)}.card-gradient-fire{background:linear-gradient(135deg,#ef4444,#f97316,#fbbf24)}.card-gradient-lagoon{background:linear-gradient(135deg,#06b6d4,#0e7490)}.card-gradient-dusk{background:linear-gradient(135deg,#7c3aed,#db2777)}.card-gradient-lime{background:linear-gradient(135deg,#84cc16,#10b981)}.card-gradient-gold{background:linear-gradient(135deg,#f59e0b,#b45309)}.card-gradient-arctic{background:linear-gradient(135deg,#bae6fd,#e0f2fe);color:#1e293b}.card-gradient-slate{background:linear-gradient(135deg,#475569,#1e293b)}[class*=card-gradient-]:not(.card-gradient-arctic){color:#fff}.page-body .card-font-serif{font-family:Georgia,Times New Roman,serif}.page-body .card-font-mono{font-family:SF Mono,Fira Code,Courier New,monospace}.page-body .card-text-sm{font-size:.85rem}.page-body .card-text-lg{font-size:1.1rem}.page-body .card-text-xl{font-size:1.25rem}.page-body .card-borderless{border:none!important}.page-body .card-shadow-none{box-shadow:none!important}.page-body .card-shadow-md{box-shadow:0 4px 12px #0000001a}.page-body .card-shadow-lg{box-shadow:0 10px 30px #0000002e}.page-body .card-rounded-none{border-radius:0}.page-body .card-rounded-sm{border-radius:4px}.page-body .card-rounded-lg{border-radius:20px}.page-body .card-rounded-full{border-radius:9999px}.page-body .card-align-center{text-align:center}.page-body .card-align-right{text-align:right}.page-body .card-pad-compact .card-body,.page-body .card-pad-compact .card-header,.page-body .card-pad-compact .card-footer{padding:8px 12px}.page-body .card-pad-spacious .card-body,.page-body .card-pad-spacious .card-header,.page-body .card-pad-spacious .card-footer{padding:24px 28px}.card-img-top{width:100%;height:180px;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2.5rem;color:#00000026}.card-img-left,.card-img-right{width:90px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:1.75rem;color:#0003}.card-img-wide{width:130px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2rem;color:#0003}.card-layout-horizontal,.card-layout-thumb-left,.card-layout-thumb-right{display:flex}.card-layout-thumb-left .card-body,.card-layout-thumb-right .card-body,.card-layout-horizontal .card-body{flex:1;min-width:0}.card-layout-split{display:flex;min-height:140px}.card-split-left{width:50%;display:flex;align-items:center;justify-content:center;font-size:2.25rem;flex-shrink:0;background:linear-gradient(160deg,#6366f1,#8b5cf6)}.card-split-right{flex:1;background:#1e293b;display:flex;flex-direction:column;justify-content:center}.card-split-right .card-body{color:#94a3b8}.card-split-right .card-title{color:#f1f5f9}.card-img-overlay{position:relative;height:180px;overflow:hidden;background-size:cover;background-position:center;background-color:#1e293b;display:flex;align-items:flex-end}.card-overlay-text{width:100%;padding:40px 16px 14px;background:linear-gradient(to top,rgba(0,0,0,.75),transparent)}.card-overlay-text .card-title{color:#fff}.dm-card-dark .card-img-top,.dm-card-dark .card-img-left,.dm-card-dark .card-img-right,.dm-card-dark .card-img-wide{filter:brightness(.7)}.card-stat-value{font-size:2.4rem;font-weight:800;color:var(--dm-text);line-height:1.1}.card-stat-delta{font-size:.8rem;font-weight:600;margin-top:2px}.card-stat-delta.positive{color:#10b981}.card-stat-delta.negative{color:#ef4444}.card-stat-bar{height:5px;background:var(--dm-border);border-radius:3px;margin-top:14px;overflow:hidden}.card-stat-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-progress-bar{height:8px;background:var(--dm-border);border-radius:4px;overflow:hidden;margin:8px 0}.card-progress-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-milestone{display:flex;align-items:center;gap:8px;font-size:.8rem;color:var(--dm-text-secondary);padding:3px 0}.card-milestone-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.card-milestone-dot.done{background:#10b981}.card-milestone-dot.pending{background:#e5e7eb}.card-header-icon-stacked{text-align:center;padding:20px 16px 12px}.card-header-icon-stacked [data-icon],.card-header-icon-stacked .card-icon{font-size:2rem;display:block;margin-bottom:8px}.card-step-bg{position:relative;overflow:hidden;min-height:60px;display:flex;align-items:center;padding:14px 16px}.card-step-ghost{position:absolute;right:8px;top:-10px;font-size:5rem;font-weight:900;color:#6366f11f;line-height:1;pointer-events:none}.card-step-badge{width:32px;height:32px;border-radius:50%;background:#6366f1;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;z-index:1;flex-shrink:0}.card-corner-badge-wrap{position:relative}.card-corner-badge{position:absolute;top:10px;right:10px;background:#ef4444;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:2px 8px;border-radius:20px}.card-callout{border-left:4px solid #6366f1}.card-callout.warn{border-left-color:#f59e0b}.card-callout.success{border-left-color:#10b981}.card-callout.error{border-left-color:#ef4444}.card-callout-inner{display:flex;gap:12px;align-items:flex-start}.card-callout-icon{font-size:1.2rem;flex-shrink:0;margin-top:1px}.card-quote-mark{font-size:3.5rem;color:#ede9fe;line-height:.8;padding:14px 16px 0;font-family:Georgia,serif;display:block}.card-quote-text{padding:4px 16px 14px;font-style:italic;color:var(--dm-text-secondary);line-height:1.7}.card-quote-attr{display:flex;align-items:center;gap:10px}.card-quote-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.85rem;color:#fff;flex-shrink:0}.card-video-thumb{position:relative;height:160px;background:#1e293b;display:flex;align-items:center;justify-content:center;background-size:cover;background-position:center}.card-play-btn{width:52px;height:52px;border-radius:50%;background:#ffffffe6;display:flex;align-items:center;justify-content:center;font-size:1.2rem;box-shadow:0 4px 16px #0000004d}.card-video-duration{position:absolute;bottom:8px;right:10px;background:#000000b3;color:#fff;font-size:.65rem;font-weight:600;padding:2px 7px;border-radius:4px}.card-map-placeholder{height:130px;background:linear-gradient(160deg,#bfdbfe,#dbeafe);position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.card-map-grid{position:absolute;inset:0;background-image:repeating-linear-gradient(0deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px),repeating-linear-gradient(90deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px)}.card-map-pin{font-size:2rem;z-index:1}.card-avatar{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.8rem;color:#fff;margin:0 auto 12px}.card-avatar-wrap{text-align:center;padding:24px 16px 16px}.card-tag-pills{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:10px}.card-pill{background:#ede9fe;color:#7c3aed;font-size:.7rem;font-weight:700;padding:3px 9px;border-radius:20px}.card-tag-cloud{padding:14px 16px;display:flex;flex-wrap:wrap;gap:7px}.card-tag{padding:4px 11px;border-radius:20px;font-size:.78rem;font-weight:600}.card-file-row{display:flex;gap:14px;align-items:center;padding:16px}.card-file-icon{width:48px;height:58px;border-radius:7px;background:linear-gradient(160deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.4rem;color:#fff;flex-shrink:0;position:relative}.card-file-ext{position:absolute;bottom:4px;left:0;right:0;text-align:center;font-size:.55rem;font-weight:800;color:#ffffffe6;letter-spacing:.05em}.card-file-dl{font-size:.78rem;font-weight:700;color:#6366f1;display:inline-block;margin-top:4px}.card-stars{color:#f59e0b;letter-spacing:2px;padding:14px 16px 0;display:block}.card-verified{display:inline-block;background:#d1fae5;color:#065f46;font-size:.6rem;font-weight:700;padding:1px 5px;border-radius:3px;margin-left:6px}.card-activity-item{display:flex;gap:10px;align-items:flex-start;padding:8px 14px;border-bottom:1px solid var(--dm-border)}.card-activity-item:last-child{border-bottom:none}.card-activity-avatar{width:30px;height:30px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.8rem;color:#fff}.card-compare-grid{display:grid;grid-template-columns:1fr 1fr}.card-compare-col{padding:12px 14px}.card-compare-col+.card-compare-col{border-left:1px solid var(--dm-border)}.card-compare-label{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:block}.card-compare-label.before{color:#ef4444}.card-compare-label.after{color:#10b981}.card-compare-item{display:flex;gap:7px;align-items:flex-start;font-size:.78rem;color:var(--dm-text-secondary);padding:3px 0;line-height:1.4}.card-compare-x{color:#ef4444;flex-shrink:0}.card-compare-check{color:#10b981;flex-shrink:0}.card-pricing-features{padding:14px 16px}.card-pricing-feature{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--dm-text-secondary);padding:4px 0}.card-pricing-check{color:#10b981}.card-pricing-cta{display:block;text-align:center;background:#6366f1;color:#fff;font-size:.82rem;font-weight:700;padding:9px;border-radius:8px;text-decoration:none;margin:0 16px 14px}.card-timeline-row{display:flex}.card-timeline-side{width:44px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;padding-top:14px}.card-timeline-dot{width:12px;height:12px;border-radius:50%;background:#6366f1;flex-shrink:0}.card-timeline-line{width:2px;background:#e5e7eb;flex:1;margin-top:4px}.card-timeline-body{flex:1;padding:12px 14px 12px 0}.card-timeline-date{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--dm-text-muted)}.card-timeline-tag{display:inline-block;background:#d1fae5;color:#065f46;font-size:.65rem;font-weight:700;padding:2px 6px;border-radius:4px;margin-top:6px}.card-code-header{background:#1e293b;display:flex;justify-content:space-between;align-items:center;padding:8px 14px}.card-code-lang{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#6366f1}.card-code-body{background:#0f172a;padding:14px;font-family:Courier New,monospace;font-size:.78rem;line-height:1.8;color:#94a3b8;overflow-x:auto}.card-glass-outer{background:linear-gradient(135deg,#6366f1,#8b5cf6,#ec4899);border-radius:12px;padding:2px}.card-glass-inner{background:#ffffffeb;backdrop-filter:blur(10px);border-radius:10px;padding:16px}.card-badge-band{display:flex;align-items:center;justify-content:space-between;padding:12px 16px}.card-badge-band-label{background:#fff3;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:3px 8px;border-radius:4px}.card-badge-band-icon{font-size:1.4rem}.dm-card-full-bg{background:linear-gradient(160deg,#1e293b,#0f172a);color:#cbd5e1}.dm-card-full-bg .card-body{color:#94a3b8}.dm-card-full-bg .card-title{color:#f1f5f9;font-size:1rem}.dm-card-full-bg .card-footer{border-top-color:#ffffff14;color:#64748b}.card-fc-row{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;border-bottom:1px solid var(--dm-border);font-size:.82rem;color:var(--dm-text-secondary)}.card-fc-row:last-child{border-bottom:none}.card-fc-yes{color:#10b981}.card-fc-no{color:#d1d5db}@media(max-width:480px){.card-layout-thumb-left,.card-layout-thumb-right,.card-layout-horizontal{flex-direction:column}.card-img-left,.card-img-right,.card-img-wide{width:100%;height:120px}.card-layout-split{flex-direction:column}.card-split-left{width:100%;height:100px}}.hero.hero-dark{background:linear-gradient(135deg,#1f2937,#111827);color:#e2e8f0}.hero .hero-content{position:relative;z-index:2}.hero.hero-left .hero-content{text-align:left;align-items:flex-start;max-width:62%}@media(max-width:768px){.hero.hero-left .hero-content{max-width:100%}}.hero .hero-cta{display:flex;gap:.85rem;flex-wrap:wrap;margin-top:1.75rem}.hero .hero-cta a{display:inline-flex;align-items:center;gap:.4rem;padding:.55rem 1.35rem;border-radius:6px;font-size:.95rem;font-weight:500;text-decoration:none;transition:background .2s ease,border-color .2s ease,transform .15s ease,box-shadow .2s ease}.hero .hero-cta a:first-child{background:#ffffffeb;color:#111;border:1px solid transparent}.hero .hero-cta a:first-child:hover{background:#fff;box-shadow:0 4px 16px #00000040;transform:translateY(-2px)}.hero .hero-cta a:last-child{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.4)}.hero .hero-cta a:last-child:hover{border-color:#ffffffbf;background:#ffffff14;transform:translateY(-2px)}.hero .hero-label{display:inline-block;margin-bottom:.9rem;padding:.2rem .8rem;border-radius:999px;font-size:.72rem;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:#ffffffb3;border:1px solid rgba(255,255,255,.22)}.grid-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.dm-breadcrumbs{position:fixed;z-index:200;display:inline-flex;align-items:center;gap:.2rem;padding:.3rem .8rem;border-radius:999px;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);background:#00000047;border:1px solid rgba(255,255,255,.11);box-shadow:0 2px 10px #00000038;font-size:.72rem;font-weight:500;letter-spacing:.01em;line-height:1.4;max-width:calc(100vw - 2rem);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dm-breadcrumbs .dm-breadcrumbs-item{color:#ffffffa6}.dm-breadcrumbs .dm-breadcrumbs-link{display:inline-flex;align-items:center;gap:.25rem;color:#ffffff8c;text-decoration:none;transition:color .15s}.dm-breadcrumbs .dm-breadcrumbs-home-icon{flex-shrink:0;vertical-align:middle}.dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#fffffff2}.dm-breadcrumbs .dm-breadcrumbs-current{color:#ffffffeb;font-weight:600}.dm-breadcrumbs .dm-breadcrumbs-separator{color:#ffffff47;font-size:.8em;line-height:1;margin:0 .05rem}[data-mode=light] .dm-breadcrumbs{background:#ffffff8c;border-color:#00000012;box-shadow:0 2px 10px #00000014}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-item,[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link{color:#0000008c}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#000000e6}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-current{color:#000000d9}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-separator{color:#00000040}.dm-collection-display{margin:1.5rem 0}.dm-collection-list{display:flex;flex-direction:column;gap:0}.dm-collection-list-item{padding:1rem 0;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08))}.dm-collection-list-item:last-child{border-bottom:none}.dm-collection-list-item strong{display:block;font-size:1rem;margin-bottom:.25rem}.dm-collection-list-item p{margin:0;color:var(--text-muted, #888);font-size:.9rem}.dm-collection-empty p{color:var(--text-muted, #888);font-style:italic}.hero-gradient-purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe);color:#1e1b4b}.hero-gradient-blue{background:linear-gradient(135deg,#dbeafe,#bfdbfe);color:#1e3a5f}.hero-gradient-green{background:linear-gradient(135deg,#d1fae5,#a7f3d0);color:#064e3b}.hero-gradient-sunset{background:linear-gradient(135deg,#fef3c7,#fde68a);color:#78350f}.hero-gradient-ocean{background:linear-gradient(135deg,#e0f2fe,#bae6fd);color:#0c4a6e}.hero-gradient-rose{background:linear-gradient(135deg,#fce7f3,#fbcfe8);color:#831843}.hero-gradient-forest{background:linear-gradient(135deg,#dcfce7,#bbf7d0);color:#14532d}.hero-gradient-night{background:linear-gradient(135deg,#334155,#1e293b);color:#e2e8f0}.hero-gradient-ocean-light{background:linear-gradient(135deg,#e0f2fe,#caf0f8);color:#1e293b}.hero-gradient-ocean-dark{background:linear-gradient(135deg,#0c4a6e,#164e63);color:#e2e8f0}.hero-gradient-forest-light{background:linear-gradient(135deg,#d1fae5,#c6f6dc);color:#1e293b}.hero-gradient-forest-dark{background:linear-gradient(135deg,#1a4731,#166534);color:#e2e8f0}.hero-gradient-sunset-light{background:linear-gradient(135deg,#fde8d8,#fddcc9);color:#1e293b}.hero-gradient-sunset-dark{background:linear-gradient(135deg,#6b3727,#7c4036);color:#f5ede8}.hero-gradient-royal-light{background:linear-gradient(135deg,#e8f0fd,#dce8fc);color:#1e293b}.hero-gradient-royal-dark{background:linear-gradient(135deg,#1e3465,#263d7a);color:#e2e8f0}.hero-gradient-lemon-light{background:linear-gradient(135deg,#fefce8,#fef9c3);color:#1e293b}.hero-gradient-lemon-dark{background:linear-gradient(135deg,#5c4d1a,#6b5920);color:#fefce8}.hero-gradient-silver-light{background:linear-gradient(135deg,#f1f5f9,#e2e8f0);color:#1e293b}.hero-gradient-silver-dark{background:linear-gradient(135deg,#2d3748,#374151);color:#e2e8f0}.hero-gradient-charcoal-light{background:linear-gradient(135deg,#eceff1,#e1e7eb);color:#1e293b}.hero-gradient-charcoal-dark{background:linear-gradient(135deg,#2c3843,#374451);color:#e2e8f0}.hero-gradient-christmas-light{background:linear-gradient(135deg,#fde8ea,#fdd5d8);color:#1e293b}.hero-gradient-christmas-dark{background:linear-gradient(135deg,#5c0f1d,#7a1525);color:#fde8ea}.hero-gradient-unicorn-light{background:linear-gradient(135deg,#f5e8fd,#edd6fb);color:#1e293b}.hero-gradient-unicorn-dark{background:linear-gradient(135deg,#3d1a5a,#4a2068);color:#f5e8fd}.hero-gradient-dreamy-light{background:linear-gradient(135deg,#f5ede8,#eeddd4);color:#1e293b}.hero-gradient-dreamy-dark{background:linear-gradient(135deg,#3d2820,#503328);color:#f5ede8}.hero-gradient-grayve-light{background:linear-gradient(135deg,#e0f7f9,#cbf2f5);color:#1e293b}.hero-gradient-grayve-dark{background:linear-gradient(135deg,#00363d,#00444d);color:#e0f7f9}.hero-gradient-mint-light{background:linear-gradient(135deg,#d8f5ea,#c5efdd);color:#1e293b}.hero-gradient-mint-dark{background:linear-gradient(135deg,#134d33,#195f3f);color:#d8f5ea}.hero-gradient-wedding-light{background:linear-gradient(135deg,#faf3e0,#f5e9c7);color:#1e293b}.hero-gradient-wedding-dark{background:linear-gradient(135deg,#5c4418,#6f5320);color:#faf3e0}.tabs-centered{text-align:center}.tabs-centered .tab-list{display:inline-flex}.tabs-centered .tab-content{text-align:left}.site-main{overflow-x:hidden}@media(max-width:768px){.hero .hero-cta a,.dm-so-trigger,.dm-cta-trigger{min-height:44px;padding:.6rem 1.25rem}}.dm-banner{position:relative;display:flex;flex-direction:row;align-items:flex-start;gap:.75rem;padding:.85rem 2.5rem .85rem 1rem;border-radius:var(--dm-radius, 6px);border-left:4px solid transparent;margin-bottom:1rem}.dm-banner__icon{flex-shrink:0;margin-top:.1rem;width:1.15rem;height:1.15rem}.dm-banner__icon svg{width:1.15rem;height:1.15rem}.dm-banner__body{flex:1;min-width:0}.dm-banner__title{display:block;margin-bottom:.2rem;font-size:.9em;font-weight:600}.dm-banner__dismiss{position:absolute;top:.5rem;right:.5rem;background:transparent;border:none;cursor:pointer;font-size:1.1rem;line-height:1;padding:.1rem .3rem;opacity:.6}.dm-banner__dismiss:hover{opacity:1}.dm-banner--info{background:color-mix(in srgb,var(--dm-info, #3b82f6) 12%,transparent);border-left-color:var(--dm-info, #3b82f6);color:inherit}.dm-banner--success{background:color-mix(in srgb,var(--dm-success, #22c55e) 12%,transparent);border-left-color:var(--dm-success, #22c55e);color:inherit}.dm-banner--warning{background:color-mix(in srgb,var(--dm-warning, #f59e0b) 12%,transparent);border-left-color:var(--dm-warning, #f59e0b);color:inherit}.dm-banner--danger{background:color-mix(in srgb,var(--dm-danger, #ef4444) 12%,transparent);border-left-color:var(--dm-danger, #ef4444);color:inherit}.dm-banner--neutral{background:color-mix(in srgb,var(--dm-text-muted, #888) 12%,transparent);border-left-color:var(--dm-text-muted, #888);color:inherit}body.dm-layout-narrow .page-body{max-width:768px;margin-inline:auto}body.dm-layout-normal .page-body{max-width:1100px;margin-inline:auto}body.dm-layout-wide .page-body{max-width:min(75vw,2000px);margin-inline:auto}body.dm-layout-full .page-body{max-width:none}.hero h1{font-size:clamp(2.4rem,4.5vw,3.75rem);font-weight:900;line-height:1.08;letter-spacing:-.03em}.hero-gradient-dreamy-light h1{color:#1e293b}.hero-gradient-dreamy-light p{font-size:1.125rem;line-height:1.7;color:#1e293bcc;max-width:48ch}.page-body h2{font-weight:800;letter-spacing:-.025em}.page-body h3{font-weight:700;letter-spacing:-.015em}.hero-gradient-dreamy-light .hero-cta a:first-child{background:#1e293b!important;color:#f5ede8!important;border-color:#1e293b!important}.hero-gradient-dreamy-light .hero-cta a:first-child:hover{background:#0f172a!important;color:#fff!important}.hero-gradient-dreamy-light .hero-cta a:last-child{background:transparent!important;color:#1e293b!important;border:1px solid rgba(30,41,59,.45)!important}.hero-gradient-dreamy-light .hero-cta a:last-child:hover{background:#1e293b14!important;border-color:#1e293bb3!important}.card[data-hover=true]{transition:transform .22s ease,box-shadow .22s ease!important;will-change:transform}.card[data-hover=true]:hover{transform:translateY(-5px)!important;box-shadow:0 24px 64px #0003,0 8px 24px #0000001f!important}.card-icon{font-size:2.5rem!important;margin-bottom:12px!important;opacity:.95}.card-avatar-wrap{padding:20px 16px 12px!important;gap:.5rem}.mk-card-icon-wrap,.card-icon-wrap{width:3rem;height:3rem;border-radius:.75rem;background:#ffffff2e;display:flex;align-items:center;justify-content:center;margin-bottom:1.125rem;font-size:1.3rem;flex-shrink:0;box-shadow:0 2px 8px #0000001f}.mk-card-corner-badge,.card-corner-badge{position:absolute;top:1rem;right:1rem;background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;font-size:.6875rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:.25rem .7rem;border-radius:99px;box-shadow:0 2px 10px #f59e0b73}.card-premium .card-subtitle{display:inline-block!important;font-size:.6875rem!important;font-weight:700!important;letter-spacing:.07em!important;text-transform:uppercase!important;opacity:1!important;color:#fff!important;background:linear-gradient(135deg,#f59e0b,#d97706)!important;padding:.2rem .65rem!important;border-radius:99px!important;box-shadow:0 2px 8px #f59e0b66!important;margin-bottom:.75rem!important}.mk-card-badge-band,.card-badge-band{display:inline-flex;align-items:center;gap:.35rem;font-size:.6875rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:.2rem .6rem;border-radius:99px;margin-bottom:.875rem;background:#fff3;border:1px solid rgba(255,255,255,.3)}.mk-card-stars,.card-stars{color:#f59e0b;font-size:1rem;letter-spacing:.12em;margin-bottom:.75rem}.mk-card-reviewer,.card-reviewer{display:flex;flex-direction:column;gap:.15rem;margin-top:1rem;padding-top:1rem;border-top:1px solid rgba(255,255,255,.15)}.mk-card-reviewer-name,.card-reviewer-name{font-weight:700;font-size:.9375rem}.mk-card-reviewer-role,.card-reviewer-role{font-size:.8125rem;opacity:.65}.mk-banner.type-info,[class*=banner-info],.mk-banner[data-type=info]{border-left:4px solid #5c3d2e}.mk-banner.type-success,[class*=banner-success],.mk-banner[data-type=success]{border-left:4px solid #22c55e}.mk-banner.type-warning,[class*=banner-warning],.mk-banner[data-type=warning]{border-left:4px solid #f59e0b}.mk-stat-number{font-size:5rem;font-weight:900;line-height:1;letter-spacing:-.03em;color:#5c3d2e}.mk-stat-label{font-size:.9375rem;font-weight:600;opacity:.65;margin-top:.5rem;letter-spacing:.02em;text-transform:uppercase}.mk-footer-inner{max-width:1200px;margin:0 auto;padding:3rem 2rem 1.5rem}.mk-footer-columns{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;margin-bottom:2.5rem}@media(max-width:900px){.mk-footer-columns{grid-template-columns:repeat(2,1fr)}}@media(max-width:480px){.mk-footer-columns{grid-template-columns:1fr}}.mk-footer-col-title{font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;opacity:.5;margin:0 0 .75rem}.mk-footer-col-links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4rem}.mk-footer-col-links a{font-size:.875rem;opacity:.75;text-decoration:none;transition:opacity .15s}.mk-footer-col-links a:hover{opacity:1}.mk-footer-bottom{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;padding-top:1.5rem;border-top:1px solid rgba(0,0,0,.08)}.mk-footer-copyright{font-size:.8125rem;opacity:.5;margin:0}.mk-footer-bottom-right{display:flex;align-items:center;gap:1.25rem}.mk-footer-social{display:flex;gap:.75rem}.mk-footer-social-link{opacity:.5;transition:opacity .15s;font-size:1.125rem}.mk-footer-social-link:hover{opacity:1}.mk-motion-label{display:flex;align-items:center;gap:.4rem;font-size:.75rem;opacity:.5;cursor:pointer;user-select:none}.mk-motion-label:hover{opacity:.75}.dm-static-block{display:contents}.mk-window{border-radius:10px;overflow:hidden;box-shadow:0 16px 56px #0000002e,0 4px 16px #0000001a;background:#fff;border:1px solid rgba(0,0,0,.06)}.mk-window-bar{background:#e8e8e8;padding:10px 16px;display:flex;gap:7px;align-items:center}.mk-dot{width:12px;height:12px;border-radius:50%;flex-shrink:0}.mk-dot-red{background:#ff5f57}.mk-dot-amber{background:#febc2e}.mk-dot-green{background:#28c840}.mk-window-body img{width:100%;display:block;max-height:480px;object-fit:cover;object-position:top}.dm-static-block+p{margin-top:.5rem}.navbar-link.active{opacity:1!important;font-weight:700!important;position:relative}.navbar-link.active:after{content:"";position:absolute;bottom:-3px;left:0;right:0;height:2px;background:currentColor;border-radius:2px;opacity:.6}.mk-divider{border:none;border-top:1px solid rgba(0,0,0,.07);margin:0}.page-body .mk-tabs,.page-body .tabs-wrapper,.page-body>.tabs{padding-left:1.5rem;padding-right:1.5rem}.mk-section-label,.section-label{display:inline-block;font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;padding:.3rem .875rem;border-radius:99px;margin-bottom:1.125rem;background:#5c3d2e1a;color:#5c3d2e;border:1px solid rgba(92,61,46,.2)}.page-body .btn-primary,.page-body a.btn-primary{background-color:var(--dm-primary, #8d6e63)!important;color:var(--dm-text-inverse, #ffffff)!important;border:1px solid var(--dm-primary, #8d6e63)!important;text-decoration:none!important;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.page-body .btn-primary:hover,.page-body a.btn-primary:hover{background-color:var(--dm-primary-hover, #6d4c41)!important;color:var(--dm-text-inverse, #ffffff)!important;border-color:var(--dm-primary-hover, #6d4c41)!important;text-decoration:none!important}.page-body .btn-outline,.page-body a.btn-outline{background-color:transparent!important;color:var(--dm-primary, #8d6e63)!important;border:1.5px solid var(--dm-primary, #8d6e63)!important;text-decoration:none!important;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.page-body .btn-outline:hover,.page-body a.btn-outline:hover{background-color:var(--dm-primary, #8d6e63)!important;color:var(--dm-text-inverse, #ffffff)!important;border-color:var(--dm-primary, #8d6e63)!important;text-decoration:none!important}.page-body .btn-ghost,.page-body a.btn-ghost{background-color:transparent!important;color:var(--dm-primary, #8d6e63)!important;border:1px solid transparent!important;text-decoration:none!important;transition:background-color .15s ease,color .15s ease}.page-body .btn-ghost:hover,.page-body a.btn-ghost:hover{background-color:var(--dm-primary-light, rgba(141, 110, 99, .1))!important;color:var(--dm-primary-hover, #6d4c41)!important;text-decoration:none!important}.mk-card-step-number,.card-step-number{font-size:3rem;font-weight:900;line-height:1;letter-spacing:-.04em;opacity:.25;margin-bottom:.75rem}.mk-card-step-title,.card-step-title{font-size:1rem;font-weight:700;margin-bottom:.5rem}.card[data-badge=Enterprise] .mk-card-corner-badge,.card[data-badge=Enterprise] .card-corner-badge{background:linear-gradient(135deg,#1e293b,#334155);box-shadow:0 2px 10px #1e293b80}.card-badge-band-icon{font-size:1.75rem!important}.card-badge-band{padding:14px 18px!important;gap:.5rem}.card-badge-band-label{font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.card-title{font-size:1.2rem!important;font-weight:800!important;letter-spacing:-.015em!important;line-height:1.25!important;margin-bottom:.4rem!important;color:#f1f5f9!important}.card-subtitle{font-size:.8125rem!important;opacity:.7!important;margin-bottom:.5rem!important;font-weight:500!important;color:#f1f5f9!important}.mk-card-body p,.card-body p,.card>p{font-size:.9375rem;line-height:1.65;opacity:.88}.card-gradient-purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe)!important;color:#1e1b4b!important}.card-gradient-blue{background:linear-gradient(135deg,#dbeafe,#bfdbfe)!important;color:#1e3a5f!important}.card-gradient-green{background:linear-gradient(135deg,#d1fae5,#a7f3d0)!important;color:#064e3b!important}.card-gradient-night{background:linear-gradient(135deg,#334155,#1e293b)!important;color:#e2e8f0!important}.card-gradient-ocean-light{background:linear-gradient(135deg,#e0f2fe,#caf0f8)!important;color:#1e293b!important}.card-gradient-ocean-dark{background:linear-gradient(135deg,#0c4a6e,#164e63)!important;color:#e2e8f0!important}.card-gradient-forest-light{background:linear-gradient(135deg,#d1fae5,#c6f6dc)!important;color:#1e293b!important}.card-gradient-forest-dark{background:linear-gradient(135deg,#1a4731,#166534)!important;color:#e2e8f0!important}.card-gradient-sunset-light{background:linear-gradient(135deg,#fde8d8,#fddcc9)!important;color:#1e293b!important}.card-gradient-sunset-dark{background:linear-gradient(135deg,#6b3727,#7c4036)!important;color:#f5ede8!important}.card-gradient-royal-light{background:linear-gradient(135deg,#e8f0fd,#dce8fc)!important;color:#1e293b!important}.card-gradient-royal-dark{background:linear-gradient(135deg,#1e3465,#263d7a)!important;color:#e2e8f0!important}.card-gradient-lemon-light{background:linear-gradient(135deg,#fefce8,#fef9c3)!important;color:#1e293b!important}.card-gradient-lemon-dark{background:linear-gradient(135deg,#5c4d1a,#6b5920)!important;color:#fefce8!important}.card-gradient-silver-light{background:linear-gradient(135deg,#f1f5f9,#e2e8f0)!important;color:#1e293b!important}.card-gradient-silver-dark{background:linear-gradient(135deg,#2d3748,#374151)!important;color:#e2e8f0!important}.card-gradient-charcoal-light{background:linear-gradient(135deg,#eceff1,#e1e7eb)!important;color:#1e293b!important}.card-gradient-charcoal-dark{background:linear-gradient(135deg,#2c3843,#374451)!important;color:#e2e8f0!important}.card-gradient-christmas-light{background:linear-gradient(135deg,#fde8ea,#fdd5d8)!important;color:#1e293b!important}.card-gradient-christmas-dark{background:linear-gradient(135deg,#5c0f1d,#7a1525)!important;color:#fde8ea!important}.card-gradient-unicorn-light{background:linear-gradient(135deg,#f5e8fd,#edd6fb)!important;color:#1e293b!important}.card-gradient-unicorn-dark{background:linear-gradient(135deg,#3d1a5a,#4a2068)!important;color:#f5e8fd!important}.card-gradient-dreamy-light{background:linear-gradient(135deg,#f5ede8,#eeddd4)!important;color:#1e293b!important}.card-gradient-dreamy-dark{background:linear-gradient(135deg,#3d2820,#503328)!important;color:#f5ede8!important}.card-gradient-grayve-light{background:linear-gradient(135deg,#e0f7f9,#cbf2f5)!important;color:#1e293b!important}.card-gradient-grayve-dark{background:linear-gradient(135deg,#00363d,#00444d)!important;color:#e0f7f9!important}.card-gradient-mint-light{background:linear-gradient(135deg,#d8f5ea,#c5efdd)!important;color:#1e293b!important}.card-gradient-mint-dark{background:linear-gradient(135deg,#134d33,#195f3f)!important;color:#d8f5ea!important}.card-gradient-wedding-light{background:linear-gradient(135deg,#faf3e0,#f5e9c7)!important;color:#1e293b!important}.card-gradient-wedding-dark{background:linear-gradient(135deg,#5c4418,#6f5320)!important;color:#faf3e0!important}.card-gradient-slate{--dm-card-g-start: #475569;--dm-card-g-end: #1e293b}.card-gradient-dusk{--dm-card-g-start: #7c3aed;--dm-card-g-end: #db2777}.card-gradient-sunset{--dm-card-g-start: #f59e0b;--dm-card-g-end: #ec4899}.card-gradient-rose{--dm-card-g-start: #fb7185;--dm-card-g-end: #e11d48}.card-gradient-gold{--dm-card-g-start: #f59e0b;--dm-card-g-end: #b45309}.card-gradient-fire{--dm-card-g-start: #ef4444;--dm-card-g-end: #fbbf24}.page-body .card.dm-card-gradient.card-gradient-sunset .card-header,.page-body .card.dm-card-gradient.card-gradient-rose .card-header,.page-body .card.dm-card-gradient.card-gradient-gold .card-header,.page-body .card.dm-card-gradient.card-gradient-fire .card-header{color:#1e293b!important}.page-body .card.dm-card-gradient[class*=-light] .card-header,.page-body .card.dm-card-gradient[class*=-dark] .card-header,.page-body .card.dm-card-gradient.card-gradient-purple .card-header,.page-body .card.dm-card-gradient.card-gradient-blue .card-header,.page-body .card.dm-card-gradient.card-gradient-green .card-header,.page-body .card.dm-card-gradient.card-gradient-night .card-header{background:transparent!important;color:inherit!important;border-bottom:1px solid rgba(0,0,0,.08)}.card[class*=card-gradient-] .card-title,.card[class*=card-gradient-] .card-subtitle{color:inherit!important}.card[class*=gradient] .mk-window-bar,.card[data-gradient] .mk-window-bar{background:#00000040}.card[class*=gradient] .mk-dot-red{background:#ff5f57b3}.card[class*=gradient] .mk-dot-amber{background:#febc2eb3}.card[class*=gradient] .mk-dot-green{background:#28c840b3}.hero .card .mk-listgroup-item,.hero .card .list-group-item{padding-top:.45rem;padding-bottom:.45rem;font-size:.9rem}.card .dm-static-block{display:block;width:100%}.card .mk-window{margin-bottom:0}.wf-feature{display:flex;align-items:center;gap:14px;padding:14px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease}.wf-feature:hover{border-color:#475569;box-shadow:0 6px 18px #0f172a14;transform:translateY(-1px)}.wf-feature-icon{flex-shrink:0;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:8px;font-size:1.1rem}.wf-feature-text{font-size:.9rem;font-weight:500;color:#1e293b;line-height:1.4;flex:1 1 auto}.plugin-card{display:flex;flex-direction:column;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 2px 6px #0f172a0d;text-decoration:none!important;color:inherit!important;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;height:100%;min-height:340px}.plugin-card:hover{transform:translateY(-3px);box-shadow:0 18px 40px #0f172a1f;border-color:#475569}.plugin-card-cover{position:relative;width:100%;height:150px;background-size:cover;background-position:center;background-color:#e2e8f0;flex-shrink:0}.plugin-card-cover:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#0000001a,#0f172a8c)}.plugin-card-tier-badge{position:absolute;top:12px;right:12px;z-index:2;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:4px 10px;border-radius:20px;color:#1e293b;background:#fff;box-shadow:0 2px 8px #0f172a40}.plugin-card[data-tier=free] .plugin-card-tier-badge:before{content:"Free"}.plugin-card[data-tier=premium] .plugin-card-tier-badge:before{content:"Premium"}.plugin-card[data-tier=premium] .plugin-card-tier-badge{color:#f1f5f9;background:linear-gradient(135deg,#475569,#1e293b)}.plugin-card-body{flex:1 1 auto;padding:20px;display:flex;flex-direction:column;gap:10px;background:#fff;color:#1e293b}.plugin-card-head{display:flex;align-items:center;gap:12px}.plugin-card-icon{flex-shrink:0;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:10px;font-size:1.3rem;box-shadow:0 2px 6px #0f172a2e}.plugin-card-title{font-size:1.15rem!important;font-weight:700!important;color:#1e293b!important;line-height:1.2!important;margin:0!important}.plugin-card-desc{font-size:.88rem!important;color:#475569!important;line-height:1.5!important;margin:0!important;flex:1 1 auto}.plugin-card-cta{display:inline-flex;align-items:center;gap:4px;font-size:.82rem;font-weight:600;color:#475569;margin-top:8px;transition:color .15s ease,gap .15s ease}.plugin-card:hover .plugin-card-cta{color:#1e293b;gap:8px}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]){color:var(--dm-primary, var(--dm-text, #5d4037))!important;text-decoration:underline;text-decoration-color:var(--dm-border, rgba(0, 0, 0, .2));text-underline-offset:3px;text-decoration-thickness:1.5px;transition:color .15s ease,text-decoration-color .15s ease}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):hover{color:var(--dm-primary-hover, var(--dm-text, #3e2723))!important;text-decoration-color:var(--dm-primary, currentColor)}.page-body .dm-card-gradient .card-body a:not([class*=btn]){color:var(--dm-primary, var(--dm-text, #5d4037))!important}.page-body .dm-card-gradient .card-body a:not([class*=btn]):hover{color:var(--dm-primary-hover, var(--dm-text, #3e2723))!important}html body .page-body a[href]:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not(.dm-breadcrumbs-link){color:var(--dm-primary, #8d6e63)!important}html body .page-body a[href]:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not(.dm-breadcrumbs-link):hover{color:var(--dm-primary-hover, #6d4c41)!important}.page-body .hero-cta:not(.hero .hero-cta) a:not([class*=btn]),.page-body>* .hero-cta a:not([class*=btn]){color:var(--dm-primary, #8d6e63)!important;text-decoration:none!important;background:transparent;border:1px solid var(--dm-border, rgba(141, 110, 99, .35));padding:.55rem 1.35rem;border-radius:6px;font-weight:500;display:inline-flex;align-items:center;gap:.4rem;transition:background .15s ease,border-color .15s ease,color .15s ease}.page-body .hero-cta:not(.hero .hero-cta) a:not([class*=btn]):hover,.page-body>* .hero-cta a:not([class*=btn]):hover{color:var(--dm-primary-hover, #6d4c41)!important;background:var(--dm-primary-light, rgba(141, 110, 99, .08));border-color:var(--dm-primary, #8d6e63)}.feature-image{width:100%;max-height:420px;object-fit:cover;border-radius:12px;box-shadow:0 12px 36px #0f172a26;display:block}.page-body .grid>.col:has(>.feature-image),.page-body .grid>.col:has(.reveal>.feature-image),.page-body .grid>.col:has(.feature-image){display:flex;flex-direction:column;justify-content:center}.code-label{display:inline-flex;align-items:center;gap:8px;font-family:Fira Code,Consolas,Monaco,monospace;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#f1f5f9bf;background:#0f172a8c;padding:6px 12px;border-radius:6px 6px 0 0;border-bottom:1px solid rgba(241,245,249,.12)}.code-label+.code-block{margin-top:0!important;border-top-left-radius:0;border-top-right-radius:0}.code-block{display:block;background:#0f172a!important;color:#e2e8f0!important;padding:18px 20px!important;border-radius:8px;overflow-x:auto;font-size:.85rem;line-height:1.55;margin:0 0 20px;box-shadow:inset 0 0 0 1px #f1f5f914;white-space:pre;font-family:Fira Code,Consolas,Monaco,Courier New,monospace}.code-block code{background:transparent!important;color:inherit!important;padding:0!important;font-family:inherit!important;font-size:inherit;white-space:pre;display:block}.page-body .card-body>pre>code,.page-body .card-body pre.code-block>code{color:#e2e8f0!important}.run-option-card{display:flex;flex-direction:column;background:#fff;border:1px solid #e2e8f0;border-radius:14px;overflow:hidden;box-shadow:0 4px 14px #0f172a14;height:100%;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.run-option-card:hover{transform:translateY(-3px);box-shadow:0 20px 48px #0f172a24;border-color:#475569}.run-option-banner{position:relative;width:100%;height:180px;background-size:cover;background-position:center;background-color:#e2e8f0;flex-shrink:0}.run-option-banner:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#0f172a1a,#0f172ab3)}.run-option-icon-chip{position:absolute;bottom:-26px;left:24px;z-index:2;width:56px;height:56px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:14px;font-size:1.6rem;box-shadow:0 8px 20px #0f172a4d;border:3px solid #fff}.run-option-card-body{flex:1 1 auto;padding:40px 24px 24px;display:flex;flex-direction:column;gap:10px}.run-option-title{font-size:1.5rem!important;font-weight:800!important;color:#1e293b!important;margin:0!important;line-height:1.15!important;letter-spacing:-.01em!important}.run-option-sub{font-size:.9rem!important;font-weight:600!important;color:var(--dm-primary, #5d4037)!important;margin:0 0 8px!important;text-transform:uppercase;letter-spacing:.06em}.run-option-content{flex:1 1 auto;font-size:.92rem;line-height:1.55;color:#475569}.run-option-content p{margin:0 0 12px}.run-option-content .run-option-intro{font-size:.98rem;color:#1e293b;font-weight:500;margin-bottom:16px}.run-option-content .run-option-body-label{font-size:.82rem;text-transform:uppercase;letter-spacing:.08em;color:var(--dm-primary, #5d4037);margin-bottom:8px}.run-option-content .run-option-req{font-size:.82rem;color:#64748b;margin-top:14px}.run-option-content .code-block{margin:8px 0 14px}.run-option-list{list-style:none;padding:0;margin:0 0 14px;display:flex;flex-direction:column;gap:8px}.run-option-list li{display:flex;align-items:center;gap:10px;font-size:.9rem;color:#1e293b}.run-option-list li [data-icon]{color:var(--dm-primary, #5d4037);flex-shrink:0}.run-option-ctas{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px;padding-top:20px;border-top:1px solid #e2e8f0}.run-option-ctas .btn{flex:1 1 auto;text-align:center;white-space:nowrap;min-width:fit-content}.quickstart-step{position:relative;padding:28px 22px 24px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 2px 8px #0f172a0d;overflow:hidden;height:100%;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.quickstart-step:hover{transform:translateY(-3px);box-shadow:0 16px 36px #0f172a1f;border-color:#475569}.quickstart-step-number{position:absolute;top:8px;right:14px;font-size:5rem;font-weight:900;line-height:1;color:#47556914;font-variant-numeric:tabular-nums;pointer-events:none;user-select:none}.quickstart-step-icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:10px;font-size:1.3rem;margin-bottom:14px;box-shadow:0 4px 12px #0f172a2e;position:relative;z-index:1}.quickstart-step-title{font-size:1.1rem!important;font-weight:800!important;color:#1e293b!important;margin:0 0 8px!important;line-height:1.2!important;letter-spacing:-.01em!important;position:relative;z-index:1}.quickstart-step-desc{font-size:.86rem;line-height:1.55;color:#475569;margin:0;position:relative;z-index:1}:not(:defined){visibility:hidden}
|
|
1
|
+
body,button,input,select,textarea{font-family:Roboto,sans-serif}#site-navbar.navbar-dark .navbar-brand,#site-navbar.navbar-dark .navbar-brand-text,#site-navbar.navbar-dark .navbar-brand-tagline{color:var(--dm-text-inverse, #fff)}#site-navbar.navbar-light .navbar-brand,#site-navbar.navbar-light .navbar-brand-text,#site-navbar.navbar-light .navbar-brand-tagline{color:var(--dm-text, #212529)}.navbar-brand-logo{height:32px;width:auto;display:inline-block;vertical-align:middle;margin-right:.4em}.navbar-brand-tagline{display:block;font-size:.65em;opacity:.75;line-height:1.2;letter-spacing:.02em}.navbar-brand-text.navbar-brand-sm{font-size:.85em}.navbar-brand-text.navbar-brand-lg{font-size:1.25em}.navbar-actions{order:4;margin-left:auto;display:flex;align-items:center;gap:.5rem}.navbar-dark .navbar-actions{color:var(--dm-text-inverse, rgba(255, 255, 255, .85))}.navbar-dark .site-search-shortcut-hint{color:#fff9;border-color:#ffffff40}.navbar-light .navbar-actions{color:var(--dm-text, #111)}.site-main{min-height:calc(100vh - 60px);padding-top:2rem;padding-bottom:4rem}.site-main.with-sidebar{display:grid;grid-template-columns:260px 1fr;gap:0}.site-sidebar{min-height:100%;border-right:1px solid var(--border-color, rgba(255,255,255,.08))}.site-content{overflow:hidden}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}.container{padding:0 1.5rem}.page-title{font-size:clamp(1.5rem,4vw,2rem);font-weight:700;margin-bottom:1.5rem;line-height:1.2}.page-body{line-height:1.7;font-size:1rem}.page-body h1,.page-body h2,.page-body h3,.page-body h4{margin-top:2rem;margin-bottom:.75rem;font-weight:600}.page-body h2{font-size:clamp(1.2rem,3vw,1.5rem)}.page-body h3{font-size:clamp(1.1rem,2.5vw,1.25rem)}.page-body p{margin-bottom:1rem}.page-body ul,.page-body ol{margin-bottom:1rem;padding-left:1.5rem}.page-body a{color:var(--primary, #5b8cff)}.page-body a:hover{text-decoration:underline}.page-body code{font-family:Fira Code,Courier New,monospace;font-size:.9em;background:#ffffff0f;padding:.15em .35em;border-radius:3px}.page-body pre{background:#0000004d;border:1px solid rgba(255,255,255,.08);border-radius:6px;padding:1rem;overflow-x:auto;margin-bottom:1rem}.page-body pre code{background:none;padding:0}.page-body img{max-width:100%;border-radius:6px}.page-body blockquote{border-left:3px solid var(--primary, #5b8cff);margin:1.5rem 0;padding:.75rem 1rem;background:#5b8cff0f;border-radius:0 6px 6px 0}h3.accordion-header{margin:0}.accordion-button{all:unset;display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;font:inherit}.page-body .card-header h2{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.card[data-collapsible] .card-header{cursor:pointer;user-select:none;display:flex;align-items:center;justify-content:space-between}.card[data-collapsible] .card-header:after{content:"\25be";font-size:1.1em;line-height:1;display:inline-block;transition:transform .25s ease;flex-shrink:0}.card[data-collapsible].is-collapsed .card-header:after{transform:rotate(-90deg)}.card[data-collapsible] .card-body{overflow:hidden;max-height:4000px;opacity:1;transition:max-height .3s ease,opacity .25s ease}.card[data-collapsible].is-collapsed .card-body{max-height:0;opacity:0}.navbar-link span[data-icon],.navbar-link svg,.navbar-dropdown-toggle span[data-icon],.navbar-dropdown-toggle svg,.navbar-dropdown-item span[data-icon],.navbar-dropdown-item svg{width:13px!important;height:13px!important;margin-right:10px!important}.navbar-dropdown-toggle{font-size:var(--dm-font-size-base)}@media(min-width:993px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-sm)}}@media(min-width:1201px){.navbar-dropdown-toggle{font-size:var(--dm-font-size-xs)}}.dm-reduced-motion *,.dm-reduced-motion *:before,.dm-reduced-motion *:after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}.page-footer{border-top:1px solid var(--border-color, rgba(255,255,255,.08));padding:1.5rem 0}.footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;max-width:1200px;margin:0 auto}.footer-inner p{margin:0;color:var(--text-muted, #888);font-size:.875rem}.footer-links{display:flex;gap:1.25rem}.footer-links a{color:var(--text-muted, #888);font-size:.875rem;text-decoration:none}.footer-links a:hover{color:var(--text, #eee)}.footer-social{display:flex;gap:.5rem;align-items:center}.footer-social-link{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;color:var(--text-muted, #888);transition:color .15s}.footer-social-link:hover{color:var(--text, #eee)}.footer-social-link svg{width:1rem;height:1rem}.footer-motion-switch{font-size:.8rem;color:var(--text-muted, #888);white-space:nowrap}.footer-motion-switch .form-switch-label{color:var(--text-muted, #888)}.footer-motion-switch .form-switch-input{width:2rem;height:1.125rem}.footer-motion-switch .form-switch-input:after{width:.875rem;height:.875rem}.footer-motion-switch .form-switch-input:checked:after{transform:translate(.875rem)}.dm-slideover-header{display:flex;align-items:center;justify-content:space-between;padding:.875rem 1.25rem;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08));flex-shrink:0}.dm-slideover-title{margin:0;font-size:1rem;font-weight:600;line-height:1.4}.dm-slideover-body{padding:1.25rem;overflow-y:auto;flex:1}@media(max-width:768px){.site-main.with-sidebar{grid-template-columns:1fr}.site-sidebar{display:none}}.dm-spacer{display:block;width:100%}.hero-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.site-main:has(.page-body>.hero-breakout:first-child){padding-top:0}body[data-layout=landing]>.site-main{padding-top:0}body[data-layout=landing]>.site-main .container{max-width:none;padding:0}body[data-layout=landing] .page-body{padding-left:1.5rem;padding-right:1.5rem}body[data-layout=landing] .page-body>p,body[data-layout=landing] .page-body>h1,body[data-layout=landing] .page-body>h2,body[data-layout=landing] .page-body>h3,body[data-layout=landing] .page-body>ul,body[data-layout=landing] .page-body>ol,body[data-layout=landing] .page-body>blockquote{max-width:860px;margin-left:auto;margin-right:auto}.hero-breakout{width:100vw;margin-left:calc((100% - 100vw)/2);max-width:none}body[data-layout=landing] .page-body .hero-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem}body[data-layout=landing] .page-body .grid-breakout{width:calc(100% + 3rem);margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.page-body .card{transition:transform .2s ease,box-shadow .2s ease}.page-body .card:hover{transform:translateY(-3px);box-shadow:0 8px 24px #00000059}.page-body .card-header-icon-inline{display:flex;align-items:center;gap:.6rem}.page-body .card-header-icon-inline [data-icon]{flex-shrink:0;line-height:0}.page-body .card-header-icon-inline [data-icon] svg,.page-body .card-header-icon-inline>svg{display:block;width:1.25rem;height:1.25rem}.page-body .card-header-icon-stacked{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.35rem;padding-top:.25rem}.page-body .card-header-icon-stacked [data-icon],.page-body .card-header-icon-stacked svg{width:2rem;height:2rem}.page-body .dm-card-clean{background:var(--dm-surface);border:1px solid var(--dm-border);box-shadow:0 1px 4px #0000000f,0 2px 8px #0000000a;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-clean:hover{transform:translateY(-4px);box-shadow:0 8px 24px #0000001a,0 2px 8px #0000000f}.page-body .dm-card-clean .card-header{color:var(--dm-text)}.page-body .dm-card-clean .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-clean .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-gradient{background:#fff;border:none;box-shadow:0 4px 20px #6366f124;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-gradient:hover{transform:translateY(-5px);box-shadow:0 16px 40px #6366f140}.page-body .dm-card-gradient .card-header{background:linear-gradient(135deg,var(--dm-card-g-start, #6366f1),var(--dm-card-g-end, #8b5cf6));color:#fff;border-bottom:none}.page-body .dm-card-gradient .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-gradient .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-glass{background:#ffffff2e;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.38);box-shadow:0 4px 24px #00000014;transition:transform .2s ease,box-shadow .2s ease,background .2s ease}.page-body .dm-card-glass:hover{transform:translateY(-4px);box-shadow:0 12px 36px #00000024;background:#ffffff42}.page-body .dm-card-glass .card-header{border-bottom:1px solid rgba(255,255,255,.25);color:var(--dm-text)}.page-body .dm-card-glass .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glass .card-footer{color:var(--dm-text-muted)}.page-body .dm-card-accent{background:var(--dm-surface);border:1px solid var(--dm-border);border-left:4px solid #6366f1;box-shadow:0 1px 4px #0000000d;transition:transform .2s ease,box-shadow .2s ease,border-left-color .2s ease}.page-body .dm-card-accent:hover{transform:translateY(-3px);border-left-color:#4f46e5;box-shadow:0 8px 24px #6366f11f}.page-body .dm-card-accent .card-header{color:var(--dm-primary);border-bottom:none}.page-body .dm-card-accent .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-accent .card-footer{color:var(--dm-text-muted);border-top:1px solid var(--dm-border)}.page-body .dm-card-dark{background:linear-gradient(160deg,#1e293b,#0f172a);border:1px solid rgba(255,255,255,.06);box-shadow:0 4px 20px #0000004d;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-dark:hover{transform:translateY(-4px) scale(1.012);box-shadow:0 16px 40px #00000073}.page-body .dm-card-dark .card-header{color:#f1f5f9;border-bottom:1px solid rgba(255,255,255,.08)}.page-body .dm-card-dark .card-body{color:#94a3b8}.page-body .dm-card-dark .card-footer{color:#475569;border-top:1px solid rgba(255,255,255,.06)}.page-body .dm-card-glow{background:var(--dm-surface);border:1px solid #a5b4fc;box-shadow:0 0 #6366f100;transition:transform .2s ease,box-shadow .3s ease,border-color .2s ease}.page-body .dm-card-glow:hover{transform:translateY(-3px);border-color:#818cf8;box-shadow:0 0 0 4px #6366f124,0 0 28px #6366f138}.page-body .dm-card-glow .card-header{color:var(--dm-primary);border-bottom:1px solid #e0e7ff}.page-body .dm-card-glow .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glow .card-footer{border-top:1px solid #e0e7ff;color:#818cf8}.page-body .card-hover{transition:transform .2s ease,box-shadow .2s ease}.page-body .card-hover:hover{transform:translateY(-3px);box-shadow:0 8px 20px #0000001a}.card-gradient-indigo{background:linear-gradient(135deg,#6366f1,#8b5cf6)}.card-gradient-ocean{background:linear-gradient(135deg,#0891b2,#2563eb)}.card-gradient-sunset{background:linear-gradient(135deg,#f59e0b,#ef4444,#ec4899)}.card-gradient-forest{background:linear-gradient(135deg,#10b981,#0d9488)}.card-gradient-rose{background:linear-gradient(135deg,#fb7185,#e11d48)}.card-gradient-midnight{background:linear-gradient(135deg,#1e1b4b,#4338ca)}.card-gradient-aurora{background:linear-gradient(135deg,#06b6d4,#6366f1,#a855f7)}.card-gradient-fire{background:linear-gradient(135deg,#ef4444,#f97316,#fbbf24)}.card-gradient-lagoon{background:linear-gradient(135deg,#06b6d4,#0e7490)}.card-gradient-dusk{background:linear-gradient(135deg,#7c3aed,#db2777)}.card-gradient-lime{background:linear-gradient(135deg,#84cc16,#10b981)}.card-gradient-gold{background:linear-gradient(135deg,#f59e0b,#b45309)}.card-gradient-arctic{background:linear-gradient(135deg,#bae6fd,#e0f2fe);color:#1e293b}.card-gradient-slate{background:linear-gradient(135deg,#475569,#1e293b)}[class*=card-gradient-]:not(.card-gradient-arctic){color:#fff}.page-body .card-font-serif{font-family:Georgia,Times New Roman,serif}.page-body .card-font-mono{font-family:SF Mono,Fira Code,Courier New,monospace}.page-body .card-text-sm{font-size:.85rem}.page-body .card-text-lg{font-size:1.1rem}.page-body .card-text-xl{font-size:1.25rem}.page-body .card-borderless{border:none!important}.page-body .card-shadow-none{box-shadow:none!important}.page-body .card-shadow-md{box-shadow:0 4px 12px #0000001a}.page-body .card-shadow-lg{box-shadow:0 10px 30px #0000002e}.page-body .card-rounded-none{border-radius:0}.page-body .card-rounded-sm{border-radius:4px}.page-body .card-rounded-lg{border-radius:20px}.page-body .card-rounded-full{border-radius:9999px}.page-body .card-align-center{text-align:center}.page-body .card-align-right{text-align:right}.page-body .card-pad-compact .card-body,.page-body .card-pad-compact .card-header,.page-body .card-pad-compact .card-footer{padding:8px 12px}.page-body .card-pad-spacious .card-body,.page-body .card-pad-spacious .card-header,.page-body .card-pad-spacious .card-footer{padding:24px 28px}.card-img-top{width:100%;height:180px;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2.5rem;color:#00000026}.card-img-left,.card-img-right{width:90px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:1.75rem;color:#0003}.card-img-wide{width:130px;flex-shrink:0;background-size:cover;background-position:center;background-color:var(--dm-border,#e2e8f0);display:flex;align-items:center;justify-content:center;font-size:2rem;color:#0003}.card-layout-horizontal,.card-layout-thumb-left,.card-layout-thumb-right{display:flex}.card-layout-thumb-left .card-body,.card-layout-thumb-right .card-body,.card-layout-horizontal .card-body{flex:1;min-width:0}.card-layout-split{display:flex;min-height:140px}.card-split-left{width:50%;display:flex;align-items:center;justify-content:center;font-size:2.25rem;flex-shrink:0;background:linear-gradient(160deg,#6366f1,#8b5cf6)}.card-split-right{flex:1;background:#1e293b;display:flex;flex-direction:column;justify-content:center}.card-split-right .card-body{color:#94a3b8}.card-split-right .card-title{color:#f1f5f9}.card-img-overlay{position:relative;height:180px;overflow:hidden;background-size:cover;background-position:center;background-color:#1e293b;display:flex;align-items:flex-end}.card-overlay-text{width:100%;padding:40px 16px 14px;background:linear-gradient(to top,rgba(0,0,0,.75),transparent)}.card-overlay-text .card-title{color:#fff}.dm-card-dark .card-img-top,.dm-card-dark .card-img-left,.dm-card-dark .card-img-right,.dm-card-dark .card-img-wide{filter:brightness(.7)}.card-stat-value{font-size:2.4rem;font-weight:800;color:var(--dm-text);line-height:1.1}.card-stat-delta{font-size:.8rem;font-weight:600;margin-top:2px}.card-stat-delta.positive{color:#10b981}.card-stat-delta.negative{color:#ef4444}.card-stat-bar{height:5px;background:var(--dm-border);border-radius:3px;margin-top:14px;overflow:hidden}.card-stat-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-progress-bar{height:8px;background:var(--dm-border);border-radius:4px;overflow:hidden;margin:8px 0}.card-progress-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,#6366f1,#8b5cf6)}.card-milestone{display:flex;align-items:center;gap:8px;font-size:.8rem;color:var(--dm-text-secondary);padding:3px 0}.card-milestone-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.card-milestone-dot.done{background:#10b981}.card-milestone-dot.pending{background:#e5e7eb}.card-header-icon-stacked{text-align:center;padding:20px 16px 12px}.card-header-icon-stacked [data-icon],.card-header-icon-stacked .card-icon{font-size:2rem;display:block;margin-bottom:8px}.card-step-bg{position:relative;overflow:hidden;min-height:60px;display:flex;align-items:center;padding:14px 16px}.card-step-ghost{position:absolute;right:8px;top:-10px;font-size:5rem;font-weight:900;color:#6366f11f;line-height:1;pointer-events:none}.card-step-badge{width:32px;height:32px;border-radius:50%;background:#6366f1;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;z-index:1;flex-shrink:0}.card-corner-badge-wrap{position:relative}.card-corner-badge{position:absolute;top:10px;right:10px;background:#ef4444;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:2px 8px;border-radius:20px}.card-callout{border-left:4px solid #6366f1}.card-callout.warn{border-left-color:#f59e0b}.card-callout.success{border-left-color:#10b981}.card-callout.error{border-left-color:#ef4444}.card-callout-inner{display:flex;gap:12px;align-items:flex-start}.card-callout-icon{font-size:1.2rem;flex-shrink:0;margin-top:1px}.card-quote-mark{font-size:3.5rem;color:#ede9fe;line-height:.8;padding:14px 16px 0;font-family:Georgia,serif;display:block}.card-quote-text{padding:4px 16px 14px;font-style:italic;color:var(--dm-text-secondary);line-height:1.7}.card-quote-attr{display:flex;align-items:center;gap:10px}.card-quote-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.85rem;color:#fff;flex-shrink:0}.card-video-thumb{position:relative;height:160px;background:#1e293b;display:flex;align-items:center;justify-content:center;background-size:cover;background-position:center}.card-play-btn{width:52px;height:52px;border-radius:50%;background:#ffffffe6;display:flex;align-items:center;justify-content:center;font-size:1.2rem;box-shadow:0 4px 16px #0000004d}.card-video-duration{position:absolute;bottom:8px;right:10px;background:#000000b3;color:#fff;font-size:.65rem;font-weight:600;padding:2px 7px;border-radius:4px}.card-map-placeholder{height:130px;background:linear-gradient(160deg,#bfdbfe,#dbeafe);position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.card-map-grid{position:absolute;inset:0;background-image:repeating-linear-gradient(0deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px),repeating-linear-gradient(90deg,rgba(59,130,246,.08) 0,rgba(59,130,246,.08) 1px,transparent 1px,transparent 32px)}.card-map-pin{font-size:2rem;z-index:1}.card-avatar{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.8rem;color:#fff;margin:0 auto 12px}.card-avatar-wrap{text-align:center;padding:24px 16px 16px}.card-tag-pills{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:10px}.card-pill{background:#ede9fe;color:#7c3aed;font-size:.7rem;font-weight:700;padding:3px 9px;border-radius:20px}.card-tag-cloud{padding:14px 16px;display:flex;flex-wrap:wrap;gap:7px}.card-tag{padding:4px 11px;border-radius:20px;font-size:.78rem;font-weight:600}.card-file-row{display:flex;gap:14px;align-items:center;padding:16px}.card-file-icon{width:48px;height:58px;border-radius:7px;background:linear-gradient(160deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:1.4rem;color:#fff;flex-shrink:0;position:relative}.card-file-ext{position:absolute;bottom:4px;left:0;right:0;text-align:center;font-size:.55rem;font-weight:800;color:#ffffffe6;letter-spacing:.05em}.card-file-dl{font-size:.78rem;font-weight:700;color:#6366f1;display:inline-block;margin-top:4px}.card-stars{color:#f59e0b;letter-spacing:2px;padding:14px 16px 0;display:block}.card-verified{display:inline-block;background:#d1fae5;color:#065f46;font-size:.6rem;font-weight:700;padding:1px 5px;border-radius:3px;margin-left:6px}.card-activity-item{display:flex;gap:10px;align-items:flex-start;padding:8px 14px;border-bottom:1px solid var(--dm-border)}.card-activity-item:last-child{border-bottom:none}.card-activity-avatar{width:30px;height:30px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,#6366f1,#8b5cf6);display:flex;align-items:center;justify-content:center;font-size:.8rem;color:#fff}.card-compare-grid{display:grid;grid-template-columns:1fr 1fr}.card-compare-col{padding:12px 14px}.card-compare-col+.card-compare-col{border-left:1px solid var(--dm-border)}.card-compare-label{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:block}.card-compare-label.before{color:#ef4444}.card-compare-label.after{color:#10b981}.card-compare-item{display:flex;gap:7px;align-items:flex-start;font-size:.78rem;color:var(--dm-text-secondary);padding:3px 0;line-height:1.4}.card-compare-x{color:#ef4444;flex-shrink:0}.card-compare-check{color:#10b981;flex-shrink:0}.card-pricing-features{padding:14px 16px}.card-pricing-feature{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--dm-text-secondary);padding:4px 0}.card-pricing-check{color:#10b981}.card-pricing-cta{display:block;text-align:center;background:#6366f1;color:#fff;font-size:.82rem;font-weight:700;padding:9px;border-radius:8px;text-decoration:none;margin:0 16px 14px}.card-timeline-row{display:flex}.card-timeline-side{width:44px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;padding-top:14px}.card-timeline-dot{width:12px;height:12px;border-radius:50%;background:#6366f1;flex-shrink:0}.card-timeline-line{width:2px;background:#e5e7eb;flex:1;margin-top:4px}.card-timeline-body{flex:1;padding:12px 14px 12px 0}.card-timeline-date{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--dm-text-muted)}.card-timeline-tag{display:inline-block;background:#d1fae5;color:#065f46;font-size:.65rem;font-weight:700;padding:2px 6px;border-radius:4px;margin-top:6px}.card-code-header{background:#1e293b;display:flex;justify-content:space-between;align-items:center;padding:8px 14px}.card-code-lang{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#6366f1}.card-code-body{background:#0f172a;padding:14px;font-family:Courier New,monospace;font-size:.78rem;line-height:1.8;color:#94a3b8;overflow-x:auto}.card-glass-outer{background:linear-gradient(135deg,#6366f1,#8b5cf6,#ec4899);border-radius:12px;padding:2px}.card-glass-inner{background:#ffffffeb;backdrop-filter:blur(10px);border-radius:10px;padding:16px}.card-badge-band{display:flex;align-items:center;justify-content:space-between;padding:12px 16px}.card-badge-band-label{background:#fff3;color:#fff;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:3px 8px;border-radius:4px}.card-badge-band-icon{font-size:1.4rem}.dm-card-full-bg{background:linear-gradient(160deg,#1e293b,#0f172a);color:#cbd5e1}.dm-card-full-bg .card-body{color:#94a3b8}.dm-card-full-bg .card-title{color:#f1f5f9;font-size:1rem}.dm-card-full-bg .card-footer{border-top-color:#ffffff14;color:#64748b}.card-fc-row{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;border-bottom:1px solid var(--dm-border);font-size:.82rem;color:var(--dm-text-secondary)}.card-fc-row:last-child{border-bottom:none}.card-fc-yes{color:#10b981}.card-fc-no{color:#d1d5db}@media(max-width:480px){.card-layout-thumb-left,.card-layout-thumb-right,.card-layout-horizontal{flex-direction:column}.card-img-left,.card-img-right,.card-img-wide{width:100%;height:120px}.card-layout-split{flex-direction:column}.card-split-left{width:100%;height:100px}}.hero.hero-dark{background:linear-gradient(135deg,#1f2937,#111827);color:#e2e8f0}.hero .hero-content{position:relative;z-index:2}.hero.hero-left .hero-content{text-align:left;align-items:flex-start;max-width:62%}@media(max-width:768px){.hero.hero-left .hero-content{max-width:100%}}.hero .hero-cta{display:flex;gap:.85rem;flex-wrap:wrap;margin-top:1.75rem}.hero .hero-cta a{display:inline-flex;align-items:center;gap:.4rem;padding:.55rem 1.35rem;border-radius:6px;font-size:.95rem;font-weight:500;text-decoration:none;transition:background .2s ease,border-color .2s ease,transform .15s ease,box-shadow .2s ease}.hero .hero-cta a:first-child{background:#ffffffeb;color:#111;border:1px solid transparent}.hero .hero-cta a:first-child:hover{background:#fff;box-shadow:0 4px 16px #00000040;transform:translateY(-2px)}.hero .hero-cta a:last-child{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.4)}.hero .hero-cta a:last-child:hover{border-color:#ffffffbf;background:#ffffff14;transform:translateY(-2px)}.hero .hero-label{display:inline-block;margin-bottom:.9rem;padding:.2rem .8rem;border-radius:999px;font-size:.72rem;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:#ffffffb3;border:1px solid rgba(255,255,255,.22)}.grid-breakout{width:calc(100vw - 2rem);margin-left:calc(50% - 50vw + 1rem);margin-right:calc(50% - 50vw + 1rem)}.dm-breadcrumbs{position:fixed;z-index:200;display:inline-flex;align-items:center;gap:.2rem;padding:.3rem .8rem;border-radius:999px;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);background:#00000047;border:1px solid rgba(255,255,255,.11);box-shadow:0 2px 10px #00000038;font-size:.72rem;font-weight:500;letter-spacing:.01em;line-height:1.4;max-width:calc(100vw - 2rem);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dm-breadcrumbs .dm-breadcrumbs-item{color:#ffffffa6}.dm-breadcrumbs .dm-breadcrumbs-link{display:inline-flex;align-items:center;gap:.25rem;color:#ffffff8c;text-decoration:none;transition:color .15s}.dm-breadcrumbs .dm-breadcrumbs-home-icon{flex-shrink:0;vertical-align:middle}.dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#fffffff2}.dm-breadcrumbs .dm-breadcrumbs-current{color:#ffffffeb;font-weight:600}.dm-breadcrumbs .dm-breadcrumbs-separator{color:#ffffff47;font-size:.8em;line-height:1;margin:0 .05rem}[data-mode=light] .dm-breadcrumbs{background:#ffffff8c;border-color:#00000012;box-shadow:0 2px 10px #00000014}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-item,[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link{color:#0000008c}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#000000e6}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-current{color:#000000d9}[data-mode=light] .dm-breadcrumbs .dm-breadcrumbs-separator{color:#00000040}.dm-collection-display{margin:1.5rem 0}.dm-collection-list{display:flex;flex-direction:column;gap:0}.dm-collection-list-item{padding:1rem 0;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08))}.dm-collection-list-item:last-child{border-bottom:none}.dm-collection-list-item strong{display:block;font-size:1rem;margin-bottom:.25rem}.dm-collection-list-item p{margin:0;color:var(--text-muted, #888);font-size:.9rem}.dm-collection-empty p{color:var(--text-muted, #888);font-style:italic}.hero-gradient-purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe);color:#1e1b4b}.hero-gradient-blue{background:linear-gradient(135deg,#dbeafe,#bfdbfe);color:#1e3a5f}.hero-gradient-green{background:linear-gradient(135deg,#d1fae5,#a7f3d0);color:#064e3b}.hero-gradient-sunset{background:linear-gradient(135deg,#fef3c7,#fde68a);color:#78350f}.hero-gradient-ocean{background:linear-gradient(135deg,#e0f2fe,#bae6fd);color:#0c4a6e}.hero-gradient-rose{background:linear-gradient(135deg,#fce7f3,#fbcfe8);color:#831843}.hero-gradient-forest{background:linear-gradient(135deg,#dcfce7,#bbf7d0);color:#14532d}.hero-gradient-night{background:linear-gradient(135deg,#334155,#1e293b);color:#e2e8f0}.hero-gradient-ocean-light{background:linear-gradient(135deg,#e0f2fe,#caf0f8);color:#1e293b}.hero-gradient-ocean-dark{background:linear-gradient(135deg,#0c4a6e,#164e63);color:#e2e8f0}.hero-gradient-forest-light{background:linear-gradient(135deg,#d1fae5,#c6f6dc);color:#1e293b}.hero-gradient-forest-dark{background:linear-gradient(135deg,#1a4731,#166534);color:#e2e8f0}.hero-gradient-sunset-light{background:linear-gradient(135deg,#fde8d8,#fddcc9);color:#1e293b}.hero-gradient-sunset-dark{background:linear-gradient(135deg,#6b3727,#7c4036);color:#f5ede8}.hero-gradient-royal-light{background:linear-gradient(135deg,#e8f0fd,#dce8fc);color:#1e293b}.hero-gradient-royal-dark{background:linear-gradient(135deg,#1e3465,#263d7a);color:#e2e8f0}.hero-gradient-lemon-light{background:linear-gradient(135deg,#fefce8,#fef9c3);color:#1e293b}.hero-gradient-lemon-dark{background:linear-gradient(135deg,#5c4d1a,#6b5920);color:#fefce8}.hero-gradient-silver-light{background:linear-gradient(135deg,#f1f5f9,#e2e8f0);color:#1e293b}.hero-gradient-silver-dark{background:linear-gradient(135deg,#2d3748,#374151);color:#e2e8f0}.hero-gradient-charcoal-light{background:linear-gradient(135deg,#eceff1,#e1e7eb);color:#1e293b}.hero-gradient-charcoal-dark{background:linear-gradient(135deg,#2c3843,#374451);color:#e2e8f0}.hero-gradient-christmas-light{background:linear-gradient(135deg,#fde8ea,#fdd5d8);color:#1e293b}.hero-gradient-christmas-dark{background:linear-gradient(135deg,#5c0f1d,#7a1525);color:#fde8ea}.hero-gradient-unicorn-light{background:linear-gradient(135deg,#f5e8fd,#edd6fb);color:#1e293b}.hero-gradient-unicorn-dark{background:linear-gradient(135deg,#3d1a5a,#4a2068);color:#f5e8fd}.hero-gradient-dreamy-light{background:linear-gradient(135deg,#f5ede8,#eeddd4);color:#1e293b}.hero-gradient-dreamy-dark{background:linear-gradient(135deg,#3d2820,#503328);color:#f5ede8}.hero-gradient-grayve-light{background:linear-gradient(135deg,#e0f7f9,#cbf2f5);color:#1e293b}.hero-gradient-grayve-dark{background:linear-gradient(135deg,#00363d,#00444d);color:#e0f7f9}.hero-gradient-mint-light{background:linear-gradient(135deg,#d8f5ea,#c5efdd);color:#1e293b}.hero-gradient-mint-dark{background:linear-gradient(135deg,#134d33,#195f3f);color:#d8f5ea}.hero-gradient-wedding-light{background:linear-gradient(135deg,#faf3e0,#f5e9c7);color:#1e293b}.hero-gradient-wedding-dark{background:linear-gradient(135deg,#5c4418,#6f5320);color:#faf3e0}.tabs-centered{text-align:center}.tabs-centered .tab-list{display:inline-flex}.tabs-centered .tab-content{text-align:left}.site-main{overflow-x:hidden}@media(max-width:768px){.hero .hero-cta a,.dm-so-trigger,.dm-cta-trigger{min-height:44px;padding:.6rem 1.25rem}}.dm-banner{position:relative;display:flex;flex-direction:row;align-items:flex-start;gap:.75rem;padding:.85rem 2.5rem .85rem 1rem;border-radius:var(--dm-radius, 6px);border-left:4px solid transparent;margin-bottom:1rem}.dm-banner__icon{flex-shrink:0;margin-top:.1rem;width:1.15rem;height:1.15rem}.dm-banner__icon svg{width:1.15rem;height:1.15rem}.dm-banner__body{flex:1;min-width:0}.dm-banner__title{display:block;margin-bottom:.2rem;font-size:.9em;font-weight:600}.dm-banner__dismiss{position:absolute;top:.5rem;right:.5rem;background:transparent;border:none;cursor:pointer;font-size:1.1rem;line-height:1;padding:.1rem .3rem;opacity:.6}.dm-banner__dismiss:hover{opacity:1}.dm-banner--info{background:color-mix(in srgb,var(--dm-info, #3b82f6) 12%,transparent);border-left-color:var(--dm-info, #3b82f6);color:inherit}.dm-banner--success{background:color-mix(in srgb,var(--dm-success, #22c55e) 12%,transparent);border-left-color:var(--dm-success, #22c55e);color:inherit}.dm-banner--warning{background:color-mix(in srgb,var(--dm-warning, #f59e0b) 12%,transparent);border-left-color:var(--dm-warning, #f59e0b);color:inherit}.dm-banner--danger{background:color-mix(in srgb,var(--dm-danger, #ef4444) 12%,transparent);border-left-color:var(--dm-danger, #ef4444);color:inherit}.dm-banner--neutral{background:color-mix(in srgb,var(--dm-text-muted, #888) 12%,transparent);border-left-color:var(--dm-text-muted, #888);color:inherit}body.dm-layout-narrow .page-body{max-width:768px;margin-inline:auto}body.dm-layout-normal .page-body{max-width:1100px;margin-inline:auto}body.dm-layout-wide .page-body{max-width:min(75vw,2000px);margin-inline:auto}body.dm-layout-full .page-body{max-width:none}.hero h1{font-size:clamp(2.4rem,4.5vw,3.75rem);font-weight:900;line-height:1.08;letter-spacing:-.03em}.hero-gradient-dreamy-light h1{color:#1e293b}.hero-gradient-dreamy-light p{font-size:1.125rem;line-height:1.7;color:#1e293bcc;max-width:48ch}.page-body h2{font-weight:800;letter-spacing:-.025em}.page-body h3{font-weight:700;letter-spacing:-.015em}.hero-gradient-dreamy-light .hero-cta a:first-child{background:#1e293b!important;color:#f5ede8!important;border-color:#1e293b!important}.hero-gradient-dreamy-light .hero-cta a:first-child:hover{background:#0f172a!important;color:#fff!important}.hero-gradient-dreamy-light .hero-cta a:last-child{background:transparent!important;color:#1e293b!important;border:1px solid rgba(30,41,59,.45)!important}.hero-gradient-dreamy-light .hero-cta a:last-child:hover{background:#1e293b14!important;border-color:#1e293bb3!important}.card[data-hover=true]{transition:transform .22s ease,box-shadow .22s ease!important;will-change:transform}.card[data-hover=true]:hover{transform:translateY(-5px)!important;box-shadow:0 24px 64px #0003,0 8px 24px #0000001f!important}.card-icon{font-size:2.5rem!important;margin-bottom:12px!important;opacity:.95}.card-avatar-wrap{padding:20px 16px 12px!important;gap:.5rem}.mk-card-icon-wrap,.card-icon-wrap{width:3rem;height:3rem;border-radius:.75rem;background:#ffffff2e;display:flex;align-items:center;justify-content:center;margin-bottom:1.125rem;font-size:1.3rem;flex-shrink:0;box-shadow:0 2px 8px #0000001f}.mk-card-corner-badge,.card-corner-badge{position:absolute;top:1rem;right:1rem;background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;font-size:.6875rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:.25rem .7rem;border-radius:99px;box-shadow:0 2px 10px #f59e0b73}.card-premium .card-subtitle{display:inline-block!important;font-size:.6875rem!important;font-weight:700!important;letter-spacing:.07em!important;text-transform:uppercase!important;opacity:1!important;color:#fff!important;background:linear-gradient(135deg,#f59e0b,#d97706)!important;padding:.2rem .65rem!important;border-radius:99px!important;box-shadow:0 2px 8px #f59e0b66!important;margin-bottom:.75rem!important}.mk-card-badge-band,.card-badge-band{display:inline-flex;align-items:center;gap:.35rem;font-size:.6875rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:.2rem .6rem;border-radius:99px;margin-bottom:.875rem;background:#fff3;border:1px solid rgba(255,255,255,.3)}.mk-card-stars,.card-stars{color:#f59e0b;font-size:1rem;letter-spacing:.12em;margin-bottom:.75rem}.mk-card-reviewer,.card-reviewer{display:flex;flex-direction:column;gap:.15rem;margin-top:1rem;padding-top:1rem;border-top:1px solid rgba(255,255,255,.15)}.mk-card-reviewer-name,.card-reviewer-name{font-weight:700;font-size:.9375rem}.mk-card-reviewer-role,.card-reviewer-role{font-size:.8125rem;opacity:.65}.mk-banner.type-info,[class*=banner-info],.mk-banner[data-type=info]{border-left:4px solid #5c3d2e}.mk-banner.type-success,[class*=banner-success],.mk-banner[data-type=success]{border-left:4px solid #22c55e}.mk-banner.type-warning,[class*=banner-warning],.mk-banner[data-type=warning]{border-left:4px solid #f59e0b}.mk-stat-number{font-size:5rem;font-weight:900;line-height:1;letter-spacing:-.03em;color:#5c3d2e}.mk-stat-label{font-size:.9375rem;font-weight:600;opacity:.65;margin-top:.5rem;letter-spacing:.02em;text-transform:uppercase}.mk-footer-inner{max-width:1200px;margin:0 auto;padding:3rem 2rem 1.5rem}.mk-footer-columns{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;margin-bottom:2.5rem}@media(max-width:900px){.mk-footer-columns{grid-template-columns:repeat(2,1fr)}}@media(max-width:480px){.mk-footer-columns{grid-template-columns:1fr}}.mk-footer-col-title{font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;opacity:.5;margin:0 0 .75rem}.mk-footer-col-links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4rem}.mk-footer-col-links a{font-size:.875rem;opacity:.75;text-decoration:none;transition:opacity .15s}.mk-footer-col-links a:hover{opacity:1}.mk-footer-bottom{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;padding-top:1.5rem;border-top:1px solid rgba(0,0,0,.08)}.mk-footer-copyright{font-size:.8125rem;opacity:.5;margin:0}.mk-footer-bottom-right{display:flex;align-items:center;gap:1.25rem}.mk-footer-social{display:flex;gap:.75rem}.mk-footer-social-link{opacity:.5;transition:opacity .15s;font-size:1.125rem}.mk-footer-social-link:hover{opacity:1}.mk-motion-label{display:flex;align-items:center;gap:.4rem;font-size:.75rem;opacity:.5;cursor:pointer;user-select:none}.mk-motion-label:hover{opacity:.75}.dm-static-block{display:contents}.mk-window{border-radius:10px;overflow:hidden;box-shadow:0 16px 56px #0000002e,0 4px 16px #0000001a;background:#fff;border:1px solid rgba(0,0,0,.06)}.mk-window-bar{background:#e8e8e8;padding:10px 16px;display:flex;gap:7px;align-items:center}.mk-dot{width:12px;height:12px;border-radius:50%;flex-shrink:0}.mk-dot-red{background:#ff5f57}.mk-dot-amber{background:#febc2e}.mk-dot-green{background:#28c840}.mk-window-body img{width:100%;display:block;max-height:480px;object-fit:cover;object-position:top}.dm-static-block+p{margin-top:.5rem}.navbar-link.active{opacity:1!important;font-weight:700!important;position:relative}.navbar-link.active:after{content:"";position:absolute;bottom:-3px;left:0;right:0;height:2px;background:currentColor;border-radius:2px;opacity:.6}.mk-divider{border:none;border-top:1px solid rgba(0,0,0,.07);margin:0}.page-body .mk-tabs,.page-body .tabs-wrapper,.page-body>.tabs{padding-left:1.5rem;padding-right:1.5rem}.mk-section-label,.section-label{display:inline-block;font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;padding:.3rem .875rem;border-radius:99px;margin-bottom:1.125rem;background:#5c3d2e1a;color:#5c3d2e;border:1px solid rgba(92,61,46,.2)}.page-body .btn-primary,.page-body a.btn-primary{background-color:var(--dm-primary, #8d6e63)!important;color:var(--dm-text-inverse, #ffffff)!important;border:1px solid var(--dm-primary, #8d6e63)!important;text-decoration:none!important;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.page-body .btn-primary:hover,.page-body a.btn-primary:hover{background-color:var(--dm-primary-hover, #6d4c41)!important;color:var(--dm-text-inverse, #ffffff)!important;border-color:var(--dm-primary-hover, #6d4c41)!important;text-decoration:none!important}.page-body .btn-outline,.page-body a.btn-outline{background-color:transparent!important;color:var(--dm-primary, #8d6e63)!important;border:1.5px solid var(--dm-primary, #8d6e63)!important;text-decoration:none!important;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.page-body .btn-outline:hover,.page-body a.btn-outline:hover{background-color:var(--dm-primary, #8d6e63)!important;color:var(--dm-text-inverse, #ffffff)!important;border-color:var(--dm-primary, #8d6e63)!important;text-decoration:none!important}.page-body .btn-ghost,.page-body a.btn-ghost{background-color:transparent!important;color:var(--dm-primary, #8d6e63)!important;border:1px solid transparent!important;text-decoration:none!important;transition:background-color .15s ease,color .15s ease}.page-body .btn-ghost:hover,.page-body a.btn-ghost:hover{background-color:var(--dm-primary-light, rgba(141, 110, 99, .1))!important;color:var(--dm-primary-hover, #6d4c41)!important;text-decoration:none!important}.mk-card-step-number,.card-step-number{font-size:3rem;font-weight:900;line-height:1;letter-spacing:-.04em;opacity:.25;margin-bottom:.75rem}.mk-card-step-title,.card-step-title{font-size:1rem;font-weight:700;margin-bottom:.5rem}.card[data-badge=Enterprise] .mk-card-corner-badge,.card[data-badge=Enterprise] .card-corner-badge{background:linear-gradient(135deg,#1e293b,#334155);box-shadow:0 2px 10px #1e293b80}.card-badge-band-icon{font-size:1.75rem!important}.card-badge-band{padding:14px 18px!important;gap:.5rem}.card-badge-band-label{font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.card-title{font-size:1.2rem!important;font-weight:800!important;letter-spacing:-.015em!important;line-height:1.25!important;margin-bottom:.4rem!important;color:#f1f5f9!important}.card-subtitle{font-size:.8125rem!important;opacity:.7!important;margin-bottom:.5rem!important;font-weight:500!important;color:#f1f5f9!important}.mk-card-body p,.card-body p,.card>p{font-size:.9375rem;line-height:1.65;opacity:.88}.card-gradient-purple{background:linear-gradient(135deg,#ede9fe,#ddd6fe)!important;color:#1e1b4b!important}.card-gradient-blue{background:linear-gradient(135deg,#dbeafe,#bfdbfe)!important;color:#1e3a5f!important}.card-gradient-green{background:linear-gradient(135deg,#d1fae5,#a7f3d0)!important;color:#064e3b!important}.card-gradient-night{background:linear-gradient(135deg,#334155,#1e293b)!important;color:#e2e8f0!important}.card-gradient-ocean-light{background:linear-gradient(135deg,#e0f2fe,#caf0f8)!important;color:#1e293b!important}.card-gradient-ocean-dark{background:linear-gradient(135deg,#0c4a6e,#164e63)!important;color:#e2e8f0!important}.card-gradient-forest-light{background:linear-gradient(135deg,#d1fae5,#c6f6dc)!important;color:#1e293b!important}.card-gradient-forest-dark{background:linear-gradient(135deg,#1a4731,#166534)!important;color:#e2e8f0!important}.card-gradient-sunset-light{background:linear-gradient(135deg,#fde8d8,#fddcc9)!important;color:#1e293b!important}.card-gradient-sunset-dark{background:linear-gradient(135deg,#6b3727,#7c4036)!important;color:#f5ede8!important}.card-gradient-royal-light{background:linear-gradient(135deg,#e8f0fd,#dce8fc)!important;color:#1e293b!important}.card-gradient-royal-dark{background:linear-gradient(135deg,#1e3465,#263d7a)!important;color:#e2e8f0!important}.card-gradient-lemon-light{background:linear-gradient(135deg,#fefce8,#fef9c3)!important;color:#1e293b!important}.card-gradient-lemon-dark{background:linear-gradient(135deg,#5c4d1a,#6b5920)!important;color:#fefce8!important}.card-gradient-silver-light{background:linear-gradient(135deg,#f1f5f9,#e2e8f0)!important;color:#1e293b!important}.card-gradient-silver-dark{background:linear-gradient(135deg,#2d3748,#374151)!important;color:#e2e8f0!important}.card-gradient-charcoal-light{background:linear-gradient(135deg,#eceff1,#e1e7eb)!important;color:#1e293b!important}.card-gradient-charcoal-dark{background:linear-gradient(135deg,#2c3843,#374451)!important;color:#e2e8f0!important}.card-gradient-christmas-light{background:linear-gradient(135deg,#fde8ea,#fdd5d8)!important;color:#1e293b!important}.card-gradient-christmas-dark{background:linear-gradient(135deg,#5c0f1d,#7a1525)!important;color:#fde8ea!important}.card-gradient-unicorn-light{background:linear-gradient(135deg,#f5e8fd,#edd6fb)!important;color:#1e293b!important}.card-gradient-unicorn-dark{background:linear-gradient(135deg,#3d1a5a,#4a2068)!important;color:#f5e8fd!important}.card-gradient-dreamy-light{background:linear-gradient(135deg,#f5ede8,#eeddd4)!important;color:#1e293b!important}.card-gradient-dreamy-dark{background:linear-gradient(135deg,#3d2820,#503328)!important;color:#f5ede8!important}.card-gradient-grayve-light{background:linear-gradient(135deg,#e0f7f9,#cbf2f5)!important;color:#1e293b!important}.card-gradient-grayve-dark{background:linear-gradient(135deg,#00363d,#00444d)!important;color:#e0f7f9!important}.card-gradient-mint-light{background:linear-gradient(135deg,#d8f5ea,#c5efdd)!important;color:#1e293b!important}.card-gradient-mint-dark{background:linear-gradient(135deg,#134d33,#195f3f)!important;color:#d8f5ea!important}.card-gradient-wedding-light{background:linear-gradient(135deg,#faf3e0,#f5e9c7)!important;color:#1e293b!important}.card-gradient-wedding-dark{background:linear-gradient(135deg,#5c4418,#6f5320)!important;color:#faf3e0!important}.card-gradient-slate{--dm-card-g-start: #475569;--dm-card-g-end: #1e293b}.card-gradient-dusk{--dm-card-g-start: #7c3aed;--dm-card-g-end: #db2777}.card-gradient-sunset{--dm-card-g-start: #f59e0b;--dm-card-g-end: #ec4899}.card-gradient-rose{--dm-card-g-start: #fb7185;--dm-card-g-end: #e11d48}.card-gradient-gold{--dm-card-g-start: #f59e0b;--dm-card-g-end: #b45309}.card-gradient-fire{--dm-card-g-start: #ef4444;--dm-card-g-end: #fbbf24}.page-body .card.dm-card-gradient.card-gradient-sunset .card-header,.page-body .card.dm-card-gradient.card-gradient-rose .card-header,.page-body .card.dm-card-gradient.card-gradient-gold .card-header,.page-body .card.dm-card-gradient.card-gradient-fire .card-header{color:#1e293b!important}.page-body .card.dm-card-gradient[class*=-light] .card-header,.page-body .card.dm-card-gradient[class*=-dark] .card-header,.page-body .card.dm-card-gradient.card-gradient-purple .card-header,.page-body .card.dm-card-gradient.card-gradient-blue .card-header,.page-body .card.dm-card-gradient.card-gradient-green .card-header,.page-body .card.dm-card-gradient.card-gradient-night .card-header{background:transparent!important;color:inherit!important;border-bottom:1px solid rgba(0,0,0,.08)}.card[class*=card-gradient-] .card-title,.card[class*=card-gradient-] .card-subtitle{color:inherit!important}.card[class*=gradient] .mk-window-bar,.card[data-gradient] .mk-window-bar{background:#00000040}.card[class*=gradient] .mk-dot-red{background:#ff5f57b3}.card[class*=gradient] .mk-dot-amber{background:#febc2eb3}.card[class*=gradient] .mk-dot-green{background:#28c840b3}.hero .card .mk-listgroup-item,.hero .card .list-group-item{padding-top:.45rem;padding-bottom:.45rem;font-size:.9rem}.card .dm-static-block{display:block;width:100%}.card .mk-window{margin-bottom:0}.wf-feature{display:flex;align-items:center;gap:14px;padding:14px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease}.wf-feature:hover{border-color:#475569;box-shadow:0 6px 18px #0f172a14;transform:translateY(-1px)}.wf-feature-icon{flex-shrink:0;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:8px;font-size:1.1rem}.wf-feature-text{font-size:.9rem;font-weight:500;color:#1e293b;line-height:1.4;flex:1 1 auto}.plugin-card{display:flex;flex-direction:column;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;box-shadow:0 2px 6px #0f172a0d;text-decoration:none!important;color:inherit!important;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;height:100%;min-height:340px}.plugin-card:hover{transform:translateY(-3px);box-shadow:0 18px 40px #0f172a1f;border-color:#475569}.plugin-card-cover{position:relative;width:100%;height:150px;background-size:cover;background-position:center;background-color:#e2e8f0;flex-shrink:0}.plugin-card-cover:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#0000001a,#0f172a8c)}.plugin-card-tier-badge{position:absolute;top:12px;right:12px;z-index:2;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;padding:4px 10px;border-radius:20px;color:#1e293b;background:#fff;box-shadow:0 2px 8px #0f172a40}.plugin-card[data-tier=free] .plugin-card-tier-badge:before{content:"Free"}.plugin-card[data-tier=premium] .plugin-card-tier-badge:before{content:"Premium"}.plugin-card[data-tier=premium] .plugin-card-tier-badge{color:#f1f5f9;background:linear-gradient(135deg,#475569,#1e293b)}.plugin-card-body{flex:1 1 auto;padding:20px;display:flex;flex-direction:column;gap:10px;background:#fff;color:#1e293b}.plugin-card-head{display:flex;align-items:center;gap:12px}.plugin-card-icon{flex-shrink:0;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:10px;font-size:1.3rem;box-shadow:0 2px 6px #0f172a2e}.plugin-card-title{font-size:1.15rem!important;font-weight:700!important;color:#1e293b!important;line-height:1.2!important;margin:0!important}.plugin-card-desc{font-size:.88rem!important;color:#475569!important;line-height:1.5!important;margin:0!important;flex:1 1 auto}.plugin-card-cta{display:inline-flex;align-items:center;gap:4px;font-size:.82rem;font-weight:600;color:#475569;margin-top:8px;transition:color .15s ease,gap .15s ease}.plugin-card:hover .plugin-card-cta{color:#1e293b;gap:8px}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]){color:var(--dm-primary, var(--dm-text, #5d4037))!important;text-decoration:underline;text-decoration-color:var(--dm-border, rgba(0, 0, 0, .2));text-underline-offset:3px;text-decoration-thickness:1.5px;transition:color .15s ease,text-decoration-color .15s ease}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):hover{color:var(--dm-primary-hover, var(--dm-text, #3e2723))!important;text-decoration-color:var(--dm-primary, currentColor)}.page-body .dm-card-gradient .card-body a:not([class*=btn]){color:var(--dm-primary, var(--dm-text, #5d4037))!important}.page-body .dm-card-gradient .card-body a:not([class*=btn]):hover{color:var(--dm-primary-hover, var(--dm-text, #3e2723))!important}html body .page-body a[href]:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not(.dm-breadcrumbs-link){color:var(--dm-primary, #8d6e63)!important}html body .page-body a[href]:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not(.dm-breadcrumbs-link):hover{color:var(--dm-primary-hover, #6d4c41)!important}.page-body .hero-cta:not(.hero .hero-cta) a:not([class*=btn]),.page-body>* .hero-cta a:not([class*=btn]){color:var(--dm-primary, #8d6e63)!important;text-decoration:none!important;background:transparent;border:1px solid var(--dm-border, rgba(141, 110, 99, .35));padding:.55rem 1.35rem;border-radius:6px;font-weight:500;display:inline-flex;align-items:center;gap:.4rem;transition:background .15s ease,border-color .15s ease,color .15s ease}.page-body .hero-cta:not(.hero .hero-cta) a:not([class*=btn]):hover,.page-body>* .hero-cta a:not([class*=btn]):hover{color:var(--dm-primary-hover, #6d4c41)!important;background:var(--dm-primary-light, rgba(141, 110, 99, .08));border-color:var(--dm-primary, #8d6e63)}.feature-image{width:100%;max-height:420px;object-fit:cover;border-radius:12px;box-shadow:0 12px 36px #0f172a26;display:block}.page-body .grid>.col:has(>.feature-image),.page-body .grid>.col:has(.reveal>.feature-image),.page-body .grid>.col:has(.feature-image){display:flex;flex-direction:column;justify-content:center}.code-label{display:inline-flex;align-items:center;gap:8px;font-family:Fira Code,Consolas,Monaco,monospace;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#f1f5f9bf;background:#0f172a8c;padding:6px 12px;border-radius:6px 6px 0 0;border-bottom:1px solid rgba(241,245,249,.12)}.code-label+.code-block{margin-top:0!important;border-top-left-radius:0;border-top-right-radius:0}.code-block{display:block;background:#0f172a!important;color:#e2e8f0!important;padding:18px 20px!important;border-radius:8px;overflow-x:auto;font-size:.85rem;line-height:1.55;margin:0 0 20px;box-shadow:inset 0 0 0 1px #f1f5f914;white-space:pre;font-family:Fira Code,Consolas,Monaco,Courier New,monospace}.code-block code{background:transparent!important;color:inherit!important;padding:0!important;font-family:inherit!important;font-size:inherit;white-space:pre;display:block}.page-body .card-body>pre>code,.page-body .card-body pre.code-block>code{color:#e2e8f0!important}.run-option-card{display:flex;flex-direction:column;background:#fff;border:1px solid #e2e8f0;border-radius:14px;overflow:hidden;box-shadow:0 4px 14px #0f172a14;height:100%;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.run-option-card:hover{transform:translateY(-3px);box-shadow:0 20px 48px #0f172a24;border-color:#475569}.run-option-banner{position:relative;width:100%;height:180px;background-size:cover;background-position:center;background-color:#e2e8f0;flex-shrink:0}.run-option-banner:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,#0f172a1a,#0f172ab3)}.run-option-icon-chip{position:absolute;bottom:-26px;left:24px;z-index:2;width:56px;height:56px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:14px;font-size:1.6rem;box-shadow:0 8px 20px #0f172a4d;border:3px solid #fff}.run-option-card-body{flex:1 1 auto;padding:40px 24px 24px;display:flex;flex-direction:column;gap:10px}.run-option-title{font-size:1.5rem!important;font-weight:800!important;color:#1e293b!important;margin:0!important;line-height:1.15!important;letter-spacing:-.01em!important}.run-option-sub{font-size:.9rem!important;font-weight:600!important;color:var(--dm-primary, #5d4037)!important;margin:0 0 8px!important;text-transform:uppercase;letter-spacing:.06em}.run-option-content{flex:1 1 auto;font-size:.92rem;line-height:1.55;color:#475569}.run-option-content p{margin:0 0 12px}.run-option-content .run-option-intro{font-size:.98rem;color:#1e293b;font-weight:500;margin-bottom:16px}.run-option-content .run-option-body-label{font-size:.82rem;text-transform:uppercase;letter-spacing:.08em;color:var(--dm-primary, #5d4037);margin-bottom:8px}.run-option-content .run-option-req{font-size:.82rem;color:#64748b;margin-top:14px}.run-option-content .code-block{margin:8px 0 14px}.run-option-list{list-style:none;padding:0;margin:0 0 14px;display:flex;flex-direction:column;gap:8px}.run-option-list li{display:flex;align-items:center;gap:10px;font-size:.9rem;color:#1e293b}.run-option-list li [data-icon]{color:var(--dm-primary, #5d4037);flex-shrink:0}.run-option-ctas{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px;padding-top:20px;border-top:1px solid #e2e8f0}.run-option-ctas .btn{flex:1 1 auto;text-align:center;white-space:nowrap;min-width:fit-content}.quickstart-step{position:relative;padding:28px 22px 24px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 2px 8px #0f172a0d;overflow:hidden;height:100%;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.quickstart-step:hover{transform:translateY(-3px);box-shadow:0 16px 36px #0f172a1f;border-color:#475569}.quickstart-step-number{position:absolute;top:8px;right:14px;font-size:5rem;font-weight:900;line-height:1;color:#47556914;font-variant-numeric:tabular-nums;pointer-events:none;user-select:none}.quickstart-step-icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;background:linear-gradient(135deg,#475569,#1e293b);color:#f1f5f9;border-radius:10px;font-size:1.3rem;margin-bottom:14px;box-shadow:0 4px 12px #0f172a2e;position:relative;z-index:1}.quickstart-step-title{font-size:1.1rem!important;font-weight:800!important;color:#1e293b!important;margin:0 0 8px!important;line-height:1.2!important;letter-spacing:-.01em!important;position:relative;z-index:1}.quickstart-step-desc{font-size:.86rem;line-height:1.55;color:#475569;margin:0;position:relative;z-index:1}:not(:defined){visibility:hidden}.dm-collection-browser{display:block;margin:1.5rem 0}.dm-collection-browser.dm-cb-hydrated .dm-cb-fallback{display:none}.dm-cb-header{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;justify-content:space-between;margin-bottom:1rem}.dm-cb-search{flex:1 1 240px;min-width:200px}.dm-cb-search-input{width:100%;padding:.5rem .75rem;border:1px solid var(--dm-border, #d1d5db);border-radius:var(--dm-radius, 6px);background:var(--dm-bg, #fff);color:var(--dm-text, #111827);font-size:.95rem}.dm-cb-sort{display:flex;align-items:center;gap:.5rem;flex:0 0 auto}.dm-cb-sort-label{font-size:.85rem;color:var(--dm-muted, #6b7280);margin:0}.dm-cb-sort-select{padding:.45rem .6rem;border:1px solid var(--dm-border, #d1d5db);border-radius:var(--dm-radius, 6px);background:var(--dm-bg, #fff);color:var(--dm-text, #111827)}.dm-cb-sort-dir{width:2rem;height:2rem;border:1px solid var(--dm-border, #d1d5db);border-radius:var(--dm-radius, 6px);background:var(--dm-bg, #fff);cursor:pointer;font-weight:700}.dm-cb-sort-dir:hover{background:var(--dm-muted-bg, #f3f4f6)}.dm-cb-layout{display:grid;grid-template-columns:minmax(220px,1fr) 3fr;gap:1.5rem;align-items:start}@media(max-width:768px){.dm-cb-layout{grid-template-columns:1fr}.dm-cb-filter-rail{border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius, 6px);padding:.75rem}}.dm-cb-filter-rail{padding:.5rem 0;font-size:.92rem}.dm-cb-filter-heading{margin:0 0 .75rem;font-size:.95rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--dm-muted, #6b7280)}.dm-cb-filter{margin-bottom:1rem;display:flex;flex-direction:column;gap:.35rem}.dm-cb-filter-label{font-weight:600;font-size:.85rem;color:var(--dm-text, #111827)}.dm-cb-text,.dm-cb-select,.dm-cb-range input{width:100%;padding:.4rem .55rem;border:1px solid var(--dm-border, #d1d5db);border-radius:var(--dm-radius, 6px);background:var(--dm-bg, #fff);color:var(--dm-text, #111827);font-size:.9rem}.dm-cb-range{display:flex;align-items:center;gap:.4rem}.dm-cb-range input{flex:1;min-width:0}.dm-cb-multiselect{display:flex;flex-direction:column;gap:.3rem;max-height:11rem;overflow-y:auto;padding:.4rem .55rem;border:1px solid var(--dm-border, #d1d5db);border-radius:var(--dm-radius, 6px)}.dm-cb-check{display:flex;align-items:center;gap:.4rem;font-size:.88rem;cursor:pointer;margin:0}.dm-cb-filter-reset{width:100%;margin-top:.5rem;padding:.45rem .6rem;border:1px solid var(--dm-border, #d1d5db);background:transparent;color:var(--dm-text, #374151);border-radius:var(--dm-radius, 6px);cursor:pointer;font-size:.85rem}.dm-cb-filter-reset:hover{background:var(--dm-muted-bg, #f3f4f6)}.dm-cb-body{min-height:4rem}.dm-cb-pagination{display:flex;align-items:center;justify-content:center;gap:1rem;margin-top:1.25rem;padding-top:1rem;border-top:1px solid var(--dm-border, #e5e7eb)}.dm-cb-page-info{font-size:.88rem;color:var(--dm-muted, #6b7280)}.dm-cb-page-prev[disabled],.dm-cb-page-next[disabled]{opacity:.45;cursor:not-allowed}.dm-cb-chips{display:flex;flex-wrap:wrap;gap:.35rem;padding:.1rem 0}.dm-cb-chip{display:inline-flex;align-items:center;gap:.4rem;padding:.25rem .6rem;border:1px solid var(--dm-border, #d1d5db);background:var(--dm-bg, #fff);color:var(--dm-text, #111827);border-radius:999px;cursor:pointer;font-size:.82rem;transition:background-color .12s ease,border-color .12s ease}.dm-cb-chip:hover{background:var(--dm-muted-bg, #f3f4f6)}.dm-cb-chip-active{background:var(--dm-accent, #2563eb);color:#fff;border-color:var(--dm-accent, #2563eb)}.dm-cb-chip-count{font-size:.75rem;opacity:.75;font-variant-numeric:tabular-nums}.dm-cb-chip-active .dm-cb-chip-count{opacity:.85}.dm-cb-slider{position:relative;height:1.5rem;margin:.5rem .25rem}.dm-cb-slider-track{position:absolute;top:50%;left:0;right:0;transform:translateY(-50%);height:4px;background:var(--dm-border, #e5e7eb);border-radius:2px}.dm-cb-slider-fill{position:absolute;top:0;bottom:0;background:var(--dm-accent, #2563eb);border-radius:2px}.dm-cb-slider-handle{position:absolute;inset:0;width:100%;height:100%;margin:0;background:transparent;pointer-events:none;-webkit-appearance:none;appearance:none}.dm-cb-slider-handle::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;height:1rem;width:1rem;border-radius:50%;background:var(--dm-accent, #2563eb);border:2px solid var(--dm-bg, #fff);box-shadow:0 1px 3px #00000026;pointer-events:auto;cursor:grab}.dm-cb-slider-handle::-moz-range-thumb{height:1rem;width:1rem;border-radius:50%;background:var(--dm-accent, #2563eb);border:2px solid var(--dm-bg, #fff);box-shadow:0 1px 3px #00000026;pointer-events:auto;cursor:grab}.dm-cb-range-inputs{display:flex;gap:.4rem;align-items:center}.dm-cb-saved{position:relative}.dm-cb-saved-menu{position:absolute;right:0;top:calc(100% + .25rem);min-width:12rem;padding:.5rem;background:var(--dm-bg, #fff);border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius, 6px);box-shadow:0 8px 24px #0f172a1f;z-index:20}.dm-cb-saved-empty{margin:0 0 .5rem;font-size:.85rem;color:var(--dm-muted, #6b7280)}.dm-cb-saved-item{display:flex;align-items:center;gap:.4rem;margin-bottom:.25rem}.dm-cb-saved-apply{flex:1;text-align:left;padding:.35rem .5rem;background:transparent;border:0;border-radius:var(--dm-radius, 6px);cursor:pointer;font-size:.88rem;color:var(--dm-text, #111827)}.dm-cb-saved-apply:hover{background:var(--dm-muted-bg, #f3f4f6)}.dm-cb-saved-del{width:1.5rem;height:1.5rem;padding:0;background:transparent;border:0;color:var(--dm-muted, #9ca3af);cursor:pointer;font-size:1.1rem}.dm-cb-saved-del:hover{color:var(--dm-danger, #dc2626)}.dm-cb-saved-actions{border-top:1px solid var(--dm-border, #e5e7eb);padding-top:.5rem;margin-top:.5rem}.dm-cb-saved-create{width:100%;padding:.45rem .6rem;font-size:.85rem}.dm-cb-export{padding:.45rem .7rem;font-size:.85rem}.dm-cb-empty-clear{margin-top:.75rem}.dm-cb-scroll-sentinel{text-align:center;padding:1rem 0;font-size:.85rem;color:var(--dm-muted, #6b7280)}.dm-cb-scroll-end{text-align:center;margin:1rem 0 0;font-size:.85rem;color:var(--dm-muted, #9ca3af);font-style:italic}.dm-cb-block-loading{text-align:center;padding:2rem 0;color:var(--dm-muted, #9ca3af);font-style:italic}.dm-cb-drawer-toggle{display:none;align-items:center;gap:.4rem;padding:.45rem .75rem;font-size:.88rem}.dm-cb-drawer-count{font-variant-numeric:tabular-nums;font-weight:600;color:var(--dm-accent, #2563eb)}.dm-cb-drawer-count:empty{display:none}@media(max-width:768px){.dm-cb-drawer-toggle{display:inline-flex}.dm-cb-filter-rail{position:fixed;top:0;left:-100%;width:85%;max-width:22rem;height:100vh;background:var(--dm-bg, #fff);border-right:1px solid var(--dm-border, #e5e7eb);box-shadow:4px 0 16px #00000014;padding:1.25rem;z-index:100;overflow-y:auto;transition:left .22s ease}.dm-cb-drawer-open .dm-cb-filter-rail{left:0}.dm-cb-drawer-open:before{content:"";position:fixed;inset:0;background:#00000059;z-index:99}}.dm-file-thumb{max-width:180px;max-height:120px;border-radius:var(--dm-radius, 6px);border:1px solid var(--dm-border, #e5e7eb);display:inline-block;object-fit:cover}.dm-cb-transitions{display:flex;flex-wrap:wrap;gap:.35rem;margin-top:.5rem;font-size:.85rem;color:var(--dm-muted, #6b7280)}.dm-cb-transitions:empty{display:none}.dm-cb-transition-btn{padding:.35rem .7rem;font-size:.82rem}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const __browsers=[];(function(){const t=document.querySelectorAll(".dm-collection-browser");t.length&&(t.forEach((e,i)=>{try{__browsers.push(new CollectionBrowser(e,i))}catch(n){console.error("[collection-browser] hydration failed:",n)}}),installGlobalKeyboardNav())})();function installGlobalKeyboardNav(){__browsers.length&&document.addEventListener("keydown",l=>{const t=l.target&&(l.target.tagName==="INPUT"||l.target.tagName==="TEXTAREA"||l.target.isContentEditable);if(l.key==="/"&&!t){const i=__browsers[0]?.el.querySelector(".dm-cb-search-input");i&&(l.preventDefault(),i.focus(),i.select());return}if((l.key==="ArrowLeft"||l.key==="ArrowRight")&&!t){const e=__browsers.find(s=>s.el.contains(l.target))||__browsers[0];if(!e)return;const i=Math.max(1,Math.ceil(e.currentTotal/e.config.pageSize)),n=l.key==="ArrowRight"?Math.min(i,e.state.page+1):Math.max(1,e.state.page-1);n!==e.state.page&&(l.preventDefault(),e.setState({page:n}))}})}function decodePayload(l){if(!l)return null;try{const t=atob(l),e=decodeURIComponent(escape(t));return JSON.parse(e)}catch{try{return JSON.parse(atob(l))}catch{return null}}}function clear(l){l&&typeof l.replaceChildren=="function"&&l.replaceChildren()}function distinctValues(l,t){const e=new Set;for(const i of l||[]){const n=i?.data?.[t];n!=null&&(Array.isArray(n)?n.forEach(s=>s!=null&&e.add(String(s))):e.add(String(n)))}return[...e].sort()}class CollectionBrowser{constructor(t,e){this.el=t,this.config=decodePayload(t.dataset.cbConfig)||{},this.schema=decodePayload(t.dataset.cbSchema)||{fields:[]};const i=decodePayload(t.dataset.cbData)||{entries:[],total:0,page:1,pageSize:12},n=(this.config.id||`${this.config.slug}-${e}`).replace(/[^a-z0-9]/gi,"_");let s=n,r=1;for(;__browsers.some(a=>a.idScope===s);)r+=1,s=`${n}_${r}`;this.idScope=s,this.urlPrefix=`cb_${s}_`,this._fragReqId=0,this.entries=i.entries||[],this.total=i.total||0,this.state={search:"",filter:{},sort:this.config.initial?.sort||"createdAt",order:this.config.initial?.order||"desc",page:1},this.readUrlState(),this.buildSkeleton(),this.refresh()}buildSkeleton(){clear(this.el);const t=elt("div","dm-cb-header");this.config.filterable?.length&&t.appendChild(this.buildDrawerToggle()),this.config.searchable&&t.appendChild(this.buildSearchInput()),this.config.sortable&&t.appendChild(this.buildSortControl()),this.config.savedSearches!==!1&&t.appendChild(this.buildSavedSearches()),this.config.exportable&&t.appendChild(this.buildExportButton());const e=elt("div","dm-cb-layout");this.filterRail=elt("aside","dm-cb-filter-rail"),this.bodyEl=elt("div","dm-cb-body"),e.appendChild(this.filterRail),e.appendChild(this.bodyEl),this.config.filterable?.length?this.renderFilterRail():this.filterRail.style.display="none",this.pagerEl=elt("div","dm-cb-pagination"),t.childElementCount&&this.el.appendChild(t),this.el.appendChild(e),this.el.appendChild(this.pagerEl),this.el.classList.add("dm-cb-hydrated")}buildSavedSearches(){const t=elt("div","dm-cb-saved"),e=elt("button","dm-cb-saved-toggle btn btn-outline");e.type="button",e.textContent="Saved \u25BE",t.appendChild(e);const i=elt("div","dm-cb-saved-menu");i.hidden=!0,t.appendChild(i);const n=()=>{clear(i);const s=this.loadSavedSearches();if(!s.length){const o=elt("p","dm-cb-saved-empty");o.textContent="No saved views yet.",i.appendChild(o)}for(const o of s){const c=elt("div","dm-cb-saved-item"),d=elt("button","dm-cb-saved-apply");d.type="button",d.textContent=o.name,d.addEventListener("click",()=>{this.state.search=o.search||"",this.state.filter={...o.filter||{}},this.state.sort=o.sort||this.config.initial?.sort||"createdAt",this.state.order=o.order||this.config.initial?.order||"desc",this.state.page=1,this.renderFilterRail();const p=this.el.querySelector(".dm-cb-search-input");p&&(p.value=this.state.search),i.hidden=!0,this.refresh()});const h=elt("button","dm-cb-saved-del");h.type="button",h.textContent="\xD7",h.title="Delete saved view",h.addEventListener("click",p=>{p.stopPropagation(),this.deleteSavedSearch(o.name),n()}),c.appendChild(d),c.appendChild(h),i.appendChild(c)}const r=elt("div","dm-cb-saved-actions"),a=elt("button","dm-cb-saved-create btn btn-primary");a.type="button",a.textContent="Save current view",a.addEventListener("click",async()=>{const o=await this.promptName();o&&(this.addSavedSearch({name:o,search:this.state.search,filter:this.state.filter,sort:this.state.sort,order:this.state.order}),n())}),r.appendChild(a),i.appendChild(r)};return e.addEventListener("click",()=>{i.hidden=!i.hidden,i.hidden||n()}),document.addEventListener("click",s=>{t.contains(s.target)||(i.hidden=!0)}),t}async promptName(){const t=typeof window<"u"&&typeof window.prompt=="function"?window.prompt("Name this saved view:"):null;return t&&t.trim()||null}loadSavedSearches(){try{const t=`cb_saved_${this.idScope}`,e=typeof S<"u"&&S.get?S.get(t):null;return Array.isArray(e)?e:[]}catch{return[]}}addSavedSearch(t){const e=this.loadSavedSearches().filter(i=>i.name!==t.name);e.push(t);try{typeof S<"u"&&S.set&&S.set(`cb_saved_${this.idScope}`,e)}catch{}}deleteSavedSearch(t){const e=this.loadSavedSearches().filter(i=>i.name!==t);try{typeof S<"u"&&S.set&&S.set(`cb_saved_${this.idScope}`,e)}catch{}}buildExportButton(){const t=elt("button","dm-cb-export btn btn-outline");return t.type="button",t.textContent="Export CSV",t.addEventListener("click",()=>this.exportCsv()),t}exportCsv(){if(this.config.mode==="client"){let n=this.entries;if(this.state.search){const o=this.state.search.toLowerCase();n=n.filter(c=>Object.values(c.data||{}).some(d=>String(d).toLowerCase().includes(o)))}const s={...this.state.filter,...this.config.baked||{}};n=applyFilterInMemory(n,s);const r=this.visibleFields(n),a=toCsv(n,r);downloadCsv(`${this.config.slug}-export.csv`,a);return}const t=new URLSearchParams;t.set("format","csv"),this.state.search&&t.set("search",this.state.search);const e={...this.state.filter,...this.config.baked||{}};for(const[n,s]of Object.entries(e))t.set(`filter[${n}]`,s);const i=`/api/collections/${encodeURIComponent(this.config.slug)}/export?${t.toString()}`;window.open(i,"_blank")}buildDrawerToggle(){const t=elt("button","dm-cb-drawer-toggle btn btn-outline");t.type="button",t.setAttribute("aria-label","Toggle filters");const e=elt("span","dm-cb-drawer-label");e.textContent="Filters";const i=elt("span","dm-cb-drawer-count");return t.appendChild(e),t.appendChild(document.createTextNode(" ")),t.appendChild(i),t.addEventListener("click",()=>{this.el.classList.toggle("dm-cb-drawer-open")}),t}buildSearchInput(){const t=elt("div","dm-cb-search"),e=elt("input","dm-cb-search-input");return e.type="search",e.placeholder="Search\u2026",e.value=this.state.search,e.addEventListener("input",debounce(()=>{this.setState({search:e.value,page:1})},200)),t.appendChild(e),t}buildSortControl(){const t=elt("div","dm-cb-sort"),e=elt("label","dm-cb-sort-label");e.textContent="Sort:",t.appendChild(e);const i=elt("select","dm-cb-sort-select"),n=this.sortableFieldList();for(const r of n){const a=elt("option");a.value=r.name,a.textContent=r.label,r.name===this.state.sort&&(a.selected=!0),i.appendChild(a)}i.addEventListener("change",()=>this.setState({sort:i.value,page:1})),t.appendChild(i);const s=elt("button","dm-cb-sort-dir");return s.type="button",s.textContent=this.state.order==="asc"?"\u2191":"\u2193",s.title=this.state.order==="asc"?"Ascending":"Descending",s.addEventListener("click",()=>{this.setState({order:this.state.order==="asc"?"desc":"asc",page:1}),s.textContent=this.state.order==="asc"?"\u2191":"\u2193"}),t.appendChild(s),t}sortableFieldList(){const t=this.config.sortableFields?.length?new Set(this.config.sortableFields):null,e=[{name:"createdAt",label:"Most recent"}];for(const i of this.schema.fields||[])t&&!t.has(i.name)||e.push({name:i.name,label:i.label||i.name});return e}renderFilterRail(){clear(this.filterRail);const t=elt("h4","dm-cb-filter-heading");t.textContent="Filters",this.filterRail.appendChild(t);for(const i of this.config.filterable){const n=(this.schema.fields||[]).find(r=>r.name===i);if(!n)continue;const s=this.buildFilterControl(n);s&&this.filterRail.appendChild(s)}const e=elt("button","dm-cb-filter-reset");e.type="button",e.textContent="Clear filters",e.addEventListener("click",()=>this.setState({filter:{},search:"",page:1})),this.filterRail.appendChild(e)}buildFilterControl(t){const e=elt("div","dm-cb-filter"),i=elt("label","dm-cb-filter-label");switch(i.textContent=t.label||t.name,e.appendChild(i),t.type){case"reference":e.appendChild(this.buildReferenceFilter(t));break;case"select":case"chooser":e.appendChild(this.buildSelectControl(t,!1));break;case"multiselect":case"tags":case"tag":e.appendChild(this.buildSelectControl(t,!0));break;case"number":e.appendChild(this.buildRangeControl(t,"number"));break;case"date":case"datetime":e.appendChild(this.buildRangeControl(t,"date"));break;case"boolean":case"checkbox":e.appendChild(this.buildBooleanControl(t));break;default:e.appendChild(this.buildTextControl(t));break}return e}buildReferenceFilter(t){const e=new Map;for(const r of this.entries){const a=r._refs?.[t.name];if(!a)continue;const o=Array.isArray(a)?a:[a];for(const c of o)!c||c.missing||e.has(c.id)||e.set(c.id,c.display)}const i=`${t.name}_eq`,n=elt("select","dm-cb-select"),s=elt("option");s.value="",s.textContent=this.config.mode==="server"?"Any (loaded)":"Any",n.appendChild(s);for(const[r,a]of e){const o=elt("option");o.value=r,o.textContent=a,String(this.state.filter[i]??"")===String(r)&&(o.selected=!0),n.appendChild(o)}return n.addEventListener("change",()=>this.updateFilter(i,n.value)),n}buildTextControl(t){const e=`${t.name}_contains`,i=elt("input","dm-cb-text");return i.type="text",i.placeholder="Contains\u2026",i.value=this.state.filter[e]||"",i.addEventListener("input",debounce(()=>{this.updateFilter(e,i.value.trim())},200)),i}buildSelectControl(t,e){const i=Array.isArray(t.options)&&t.options.length?t.options.map(o=>typeof o=="object"?o:{value:o,label:o}):distinctValues(this.entries,t.name).map(o=>({value:o,label:o})),n=this.config.mode==="client"?this.facetCounts(t.name,e?"_in":"_eq",i.map(o=>o.value)):null;if(e){const o=`${t.name}_in`,c=elt("div","dm-cb-chips"),d=new Set((this.state.filter[o]||"").split(",").filter(Boolean));for(const h of i){const p=elt("button","dm-cb-chip");p.type="button",d.has(String(h.value))&&p.classList.add("dm-cb-chip-active");const u=elt("span","dm-cb-chip-label");if(u.textContent=h.label??h.value,p.appendChild(u),n){const g=elt("span","dm-cb-chip-count");g.textContent=n[String(h.value)]??0,p.appendChild(g)}p.addEventListener("click",()=>{d.has(String(h.value))?d.delete(String(h.value)):d.add(String(h.value)),this.updateFilter(o,d.size?[...d].join(","):"")}),c.appendChild(p)}return c}const s=`${t.name}_eq`,r=elt("select","dm-cb-select"),a=elt("option");a.value="",a.textContent="Any",r.appendChild(a);for(const o of i){const c=elt("option");c.value=o.value;const d=n?` (${n[String(o.value)]??0})`:"";c.textContent=(o.label??o.value)+d,String(this.state.filter[s]??"")===String(o.value)&&(c.selected=!0),r.appendChild(c)}return r.addEventListener("change",()=>this.updateFilter(s,r.value)),r}facetCounts(t,e,i){const n={};for(const[o,c]of Object.entries(this.state.filter||{})){const{field:d}=parseFilterKey(o);d!==t&&(n[o]=c)}let s=this.entries;if(this.state.search){const o=this.state.search.toLowerCase();s=s.filter(c=>Object.values(c.data||{}).some(d=>String(d).toLowerCase().includes(o)))}const r={...n,...this.config.baked||{}};s=applyFilterInMemory(s,r);const a={};for(const o of i){const c={...r,[`${t}${e}`]:String(o)};a[String(o)]=applyFilterInMemory(s,c).length}return a}buildRangeControl(t,e){const i=`${t.name}_gte`,n=`${t.name}_lte`,s=elt("div","dm-cb-range"),r=elt("div","dm-cb-range-inputs"),a=elt("input","dm-cb-range-min"),o=elt("input","dm-cb-range-max");a.type=e,o.type=e,a.placeholder="Min",o.placeholder="Max",a.value=this.state.filter[i]||"",o.value=this.state.filter[n]||"",r.appendChild(a),r.appendChild(document.createTextNode(" \u2013 ")),r.appendChild(o),s.appendChild(r);let c=null;if(e==="number"&&this.config.mode==="client"&&this.entries.length){const h=this.entries.map(p=>Number(p.data?.[t.name])).filter(p=>Number.isFinite(p));if(h.length){const p=Math.min(...h),u=Math.max(...h);u>p&&(c=this.buildDualSlider(p,u,a,o,i,n),s.appendChild(c))}}const d=debounce(()=>{this.updateFilter(i,a.value,!0),this.updateFilter(n,o.value),c&&syncSliderToInputs(c,a.value,o.value)},250);return a.addEventListener("input",d),o.addEventListener("input",d),s}buildDualSlider(t,e,i,n,s,r){const a=elt("div","dm-cb-slider");a.dataset.lo=String(t),a.dataset.hi=String(e);const o=elt("div","dm-cb-slider-track"),c=elt("div","dm-cb-slider-fill");o.appendChild(c),a.appendChild(o);const d=elt("input","dm-cb-slider-handle dm-cb-slider-handle-min"),h=elt("input","dm-cb-slider-handle dm-cb-slider-handle-max");for(const[f,m]of[[d,t],[h,e]])f.type="range",f.min=String(t),f.max=String(e),f.step="any",f.value=String(m);d.value=String(i.value||t),h.value=String(n.value||e),a.appendChild(d),a.appendChild(h);const p=()=>{const f=Math.min(Number(d.value),Number(h.value)),m=Math.max(Number(d.value),Number(h.value)),b=e-t||1;c.style.left=`${(f-t)/b*100}%`,c.style.right=`${100-(m-t)/b*100}%`};p();const u=()=>{Number(d.value)>Number(h.value)&&(d.value=h.value),p(),i.value=d.value,n.value=h.value};d.addEventListener("input",u),h.addEventListener("input",u);const g=()=>{this.updateFilter(s,Number(d.value)>t?d.value:"",!0),this.updateFilter(r,Number(h.value)<e?h.value:"")};return d.addEventListener("change",g),h.addEventListener("change",g),a}buildBooleanControl(t){const e=`${t.name}_eq`,i=elt("select","dm-cb-select");for(const[n,s]of[["","Any"],["true","Yes"],["false","No"]]){const r=elt("option");r.value=n,r.textContent=s,String(this.state.filter[e]??"")===n&&(r.selected=!0),i.appendChild(r)}return i.addEventListener("change",()=>this.updateFilter(e,i.value)),i}updateFilter(t,e,i=!1){const n={...this.state.filter};e===""||e==null?delete n[t]:n[t]=e,this.state.filter=n,this.state.page=1,i||this.refresh()}setState(t){Object.assign(this.state,t),this.refresh()}async refresh(){this.config.syncUrl&&this.writeUrlState(),this.config.mode==="server"&&await this.fetchPage(),this.renderBody(),this.renderPagination(),this.updateFacetCounts(),this.updateDrawerBadge()}updateFacetCounts(){if(this.config.mode==="client"&&this.filterRail)for(const t of this.config.filterable||[]){const e=(this.schema.fields||[]).find(a=>a.name===t);if(!e)continue;const i=e.type==="multiselect"||e.type==="tags"||e.type==="tag"?"_in":"_eq",n=Array.isArray(e.options)&&e.options.length?e.options.map(a=>typeof a=="object"?a:{value:a,label:a}):distinctValues(this.entries,t).map(a=>({value:a,label:a})),s=this.facetCounts(t,i,n.map(a=>a.value)),r=this.filterRail.querySelectorAll(".dm-cb-filter");for(const a of r){const o=a.querySelector(".dm-cb-filter-label");if(!o||o.textContent!==(e.label||e.name))continue;a.querySelectorAll(".dm-cb-chip").forEach((h,p)=>{const u=h.querySelector(".dm-cb-chip-count");u&&n[p]&&(u.textContent=s[String(n[p].value)]??0)});const d=a.querySelector("select.dm-cb-select");d&&Array.from(d.options).forEach(h=>{if(!h.value)return;const p=n.find(u=>String(u.value)===h.value)?.label??h.value;h.textContent=`${p} (${s[h.value]??0})`})}}}updateDrawerBadge(){const t=this.el.querySelector(".dm-cb-drawer-toggle");if(!t)return;const e=(this.state.search?1:0)+Object.keys(this.state.filter||{}).length,i=t.querySelector(".dm-cb-drawer-count");i&&(i.textContent=e>0?`(${e})`:"")}async fetchPage(){const t={...this.state.filter,...this.config.baked||{}},e=new URLSearchParams;e.set("page",this.state.page),e.set("limit",this.config.pageSize),e.set("sort",this.state.sort),e.set("order",this.state.order),this.state.search&&e.set("search",this.state.search);for(const[n,s]of Object.entries(t))e.set(`filter[${n}]`,s);this._fetchAbort&&this._fetchAbort.abort(),this._fetchAbort=new AbortController;const i=this.config.sourceKind==="view"?`/api/views/${encodeURIComponent(this.config.slug)}/public?${e.toString()}`:`/api/collections/${encodeURIComponent(this.config.slug)}/public?${e.toString()}`;try{const n=await fetch(i,{headers:this.authHeaders(),signal:this._fetchAbort.signal});if(!n.ok){this.entries=[],this.total=0;return}const s=await n.json(),r=s.entries||s.results||[];this.entries=r.map(a=>a.data?a:{id:a.id||"",data:a.data||a}),this.total=s.total||r.length}catch(n){if(n.name==="AbortError")return;this.entries=[],this.total=0}}authHeaders(){try{const t=typeof S<"u"&&S.get?S.get("auth_token"):null;return t?{Authorization:`Bearer ${t}`}:{}}catch{return{}}}pipeline(){if(this.config.mode==="server")return{visible:this.entries,total:this.total};let t=this.entries,e=null;if(this.state.search){const c=this.state.search.toLowerCase();e=new Map,t=t.filter(d=>{let h=0;for(const[p,u]of Object.entries(d.data||{})){if(u==null)continue;const g=String(u).toLowerCase();let f=0,m=0;for(;(f=g.indexOf(c,f))!==-1;)m++,f+=c.length;m>0&&(h+=m*(p===this.config.titleField?3:1))}return h>0&&e.set(d.id||d,h),h>0})}if(Object.keys(this.state.filter).length||Object.keys(this.config.baked||{}).length){const c={...this.state.filter,...this.config.baked||{}};t=applyFilterInMemory(t,c)}const i=this.config.initial?.sort||"createdAt",n=this.config.initial?.order||"desc",s=this.state.sort===i&&this.state.order===n;this.state.search&&e&&s?(t=[...t].sort((c,d)=>{const h=e.get(c.id||c)||0;return(e.get(d.id||d)||0)-h}),this._activeSortMode="relevance"):(t=sortEntries(t,this.state.sort,this.state.order),this._activeSortMode=null);const r=t.length,a=(this.state.page-1)*this.config.pageSize;return{visible:t.slice(a,a+this.config.pageSize),total:r}}renderBody(){const{visible:t,total:e}=this.pipeline();if(this.currentTotal=e,clear(this.bodyEl),!t.length){this.bodyEl.appendChild(this.buildEmptyState());return}const i=this.visibleFields(t);this.bodyEl.appendChild(this.renderForDisplay(t,i)),typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(this.bodyEl),this.config.cta&&typeof wireCTAButtons=="function"&&wireCTAButtons(this.bodyEl)}buildEmptyState(){const t=elt("div","dm-collection-display dm-collection-empty"),e=!!this.state.search||Object.keys(this.state.filter||{}).length>0,i=elt("p");if(e){i.textContent="No results for these filters.",t.appendChild(i);const n=elt("button","btn btn-outline dm-cb-empty-clear");n.type="button",n.textContent="Clear filters",n.addEventListener("click",()=>{this.setState({filter:{},search:"",page:1}),this.renderFilterRail();const s=this.el.querySelector(".dm-cb-search-input");s&&(s.value="")}),t.appendChild(n)}else i.textContent=this.config.emptyMsg,t.appendChild(i);return t}visibleFields(t){let e=this.schema.fields||[];return this.config.fields?.length&&(e=this.config.fields.map(i=>e.find(n=>n.name===i)||{name:i,label:i})),!e.length&&t.length&&(e=Object.keys(t[0].data||{}).map(i=>({name:i,label:i}))),e}renderCards(t,e){const i=elt("div",`dm-collection-cards grid grid-cols-${this.config.columns}`);for(const n of t){const s=elt("div","card dm-collection-card"),r=e.find(c=>c.name===this.config.titleField),a=r?fieldDisplay(n,r):this.config.titleField?formatValue(n.data?.[this.config.titleField]):"";if(a){const c=elt("div","card-header");c.textContent=a,s.appendChild(c)}const o=elt("div","card-body");for(const c of e){if(this.config.titleField===c.name||!fieldDisplay(n,c))continue;const h=elt("div","dm-collection-card-field"),p=elt("strong");p.textContent=(c.label||c.name)+": ",h.appendChild(p),h.appendChild(fieldDisplayNode(n,c)),o.appendChild(h)}this.config.cta&&o.appendChild(this.buildCtaButton(n)),this.config.transitions&&o.appendChild(this.buildTransitionsGroup(n)),s.appendChild(o),i.appendChild(s)}return i}renderList(t,e){const i=elt("ul","dm-collection-list");for(const n of t){const s=elt("li","dm-collection-list-item"),r=e.find(c=>c.name===this.config.titleField),a=r?fieldDisplay(n,r):this.config.titleField?formatValue(n.data?.[this.config.titleField]):"";if(a){const c=elt("div","dm-collection-list-title");c.textContent=a,s.appendChild(c)}const o=e.filter(c=>c.name!==this.config.titleField).map(c=>{const d=fieldDisplay(n,c);return d?`${c.label||c.name}: ${d}`:""}).filter(Boolean).join(" \xB7 ");if(o){const c=elt("div","dm-collection-list-meta");c.textContent=o,s.appendChild(c)}this.config.cta&&s.appendChild(this.buildCtaButton(n)),this.config.transitions&&s.appendChild(this.buildTransitionsGroup(n)),i.appendChild(s)}return i}renderTable(t,e){const i=elt("table","dm-collection-table"),n=elt("thead"),s=elt("tr");for(const a of e){const o=elt("th");o.textContent=a.label||a.name,s.appendChild(o)}this.config.cta&&s.appendChild(elt("th")),this.config.transitions&&s.appendChild(elt("th")),n.appendChild(s),i.appendChild(n);const r=elt("tbody");for(const a of t){const o=elt("tr");for(const c of e){const d=elt("td");d.appendChild(fieldDisplayNode(a,c)),o.appendChild(d)}if(this.config.cta){const c=elt("td");c.appendChild(this.buildCtaButton(a)),o.appendChild(c)}if(this.config.transitions){const c=elt("td");c.appendChild(this.buildTransitionsGroup(a)),o.appendChild(c)}r.appendChild(o)}return i.appendChild(r),i}renderAccordion(t){const e=elt("div","accordion dm-collection-accordion");for(const i of t){const n=elt("div","accordion-item"),s=this.config.titleField&&i.data?.[this.config.titleField]||"Untitled",r=this.config.bodyField&&i.data?.[this.config.bodyField]||"",a=elt("button","accordion-header");a.type="button",a.textContent=String(s);const o=elt("div","accordion-panel");o.textContent=String(r),a.addEventListener("click",()=>n.classList.toggle("open")),n.appendChild(a),n.appendChild(o),e.appendChild(n)}return e}buildCtaButton(t){const e=this.config.cta,i=elt("button",`btn btn-${e.style||"primary"} dm-cta-trigger`);if(i.dataset.action=e.action,i.dataset.entry=t.id||"",e.confirm&&(i.dataset.confirm=e.confirm),e.icon){const n=elt("span");n.dataset.icon=e.icon,i.appendChild(n),i.appendChild(document.createTextNode(" "))}return i.appendChild(document.createTextNode(e.label||"Run")),i}buildTransitionsGroup(t){const e=elt("div","dm-cb-transitions");return e.dataset.entry=t.id||"",e.textContent="Loading actions\u2026",Promise.resolve().then(()=>this.loadTransitions(t,e)),e}async loadTransitions(t,e){try{const i=new URLSearchParams({collection:this.config.slug,entryId:t.id||""}),n=await fetch(`/api/actions/transitions?${i.toString()}`,{headers:this.authHeaders()});if(clear(e),!n.ok)return;const{transitions:s}=await n.json();if(!Array.isArray(s)||!s.length)return;for(const r of s){const a=elt("button",`btn btn-${r.trigger?.style||"outline"} dm-cb-transition-btn dm-cta-trigger`);if(a.dataset.action=r.slug,a.dataset.entry=t.id||"",r.trigger?.confirmMessage&&(a.dataset.confirm=r.trigger.confirmMessage),r.trigger?.icon){const o=elt("span");o.dataset.icon=r.trigger.icon,a.appendChild(o),a.appendChild(document.createTextNode(" "))}a.appendChild(document.createTextNode(r.trigger?.label||r.title)),e.appendChild(a)}typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(e),typeof wireCTAButtons=="function"&&wireCTAButtons(e)}catch{clear(e)}}renderPagination(){if(this.config.pagination==="scroll"){this.renderInfiniteSentinel();return}const t=Math.max(1,Math.ceil(this.currentTotal/this.config.pageSize));if(clear(this.pagerEl),t<=1)return;const e=elt("button","dm-cb-page-prev btn btn-outline");e.type="button",e.textContent="\u2039 Prev",e.disabled=this.state.page<=1,e.addEventListener("click",()=>this.setState({page:Math.max(1,this.state.page-1)}));const i=elt("button","dm-cb-page-next btn btn-outline");i.type="button",i.textContent="Next \u203A",i.disabled=this.state.page>=t,i.addEventListener("click",()=>this.setState({page:Math.min(t,this.state.page+1)}));const n=elt("span","dm-cb-page-info");n.textContent=`Page ${this.state.page} of ${t} (${this.currentTotal} entr${this.currentTotal===1?"y":"ies"})`,this.pagerEl.appendChild(e),this.pagerEl.appendChild(n),this.pagerEl.appendChild(i)}renderInfiniteSentinel(){clear(this.pagerEl);const t=Math.max(1,Math.ceil(this.currentTotal/this.config.pageSize));if(this.state.page>=t){const i=elt("p","dm-cb-scroll-end");i.textContent=`All ${this.currentTotal} entries loaded.`,this.pagerEl.appendChild(i);return}const e=elt("div","dm-cb-scroll-sentinel");e.setAttribute("aria-hidden","true"),e.textContent="Loading more\u2026",this.pagerEl.appendChild(e),this._scrollObserver&&this._scrollObserver.disconnect(),this._scrollObserver=new IntersectionObserver(async i=>{i[0].isIntersecting&&(this._scrollObserver.disconnect(),await this.loadMore())},{rootMargin:"200px 0px"}),this._scrollObserver.observe(e)}async loadMore(){const t=this.state.page+1,e=this.currentTotal,i=this.entries,n=this.state.page;this.state.page=t,this.config.syncUrl&&this.writeUrlState();let s;if(this.config.mode==="server")await this.fetchPage(),s=this.entries;else{const{visible:c}=this.pipeline();s=c}if(!s.length){this.state.page=n,this.entries=i,this.currentTotal=e,this.renderPagination();return}const r=this.visibleFields(s),a=this.renderForDisplay(s,r),o=this.bodyEl.firstElementChild;if(o&&o.tagName===a.tagName)for(;a.firstChild;)o.appendChild(a.firstChild);else this.bodyEl.appendChild(a);typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(this.bodyEl),this.config.cta&&typeof wireCTAButtons=="function"&&wireCTAButtons(this.bodyEl),this.renderPagination()}renderForDisplay(t,e){const i=this.config.display;return i==="list"?this.renderList(t,e):i==="table"?this.renderTable(t,e):i==="accordion"?this.renderAccordion(t):i==="timeline"?this.renderTimeline(t):i==="block"?this.renderBlockPlaceholder(t):this.renderCards(t,e)}renderTimeline(t){const e=["vertical","centred","horizontal"].includes(this.config.layout)?this.config.layout:"vertical",i=["minimal","corporate","modern"].includes(this.config.theme)?this.config.theme:"minimal",n=elt("div",`dm-collection-timeline timeline timeline-${e} timeline-${i}`);for(const s of t){const r=elt("div","timeline-event"),a=this.config.dateField&&s.data?.[this.config.dateField]||"",o=this.config.titleField&&s.data?.[this.config.titleField]||"",c=this.config.bodyField&&s.data?.[this.config.bodyField]||"",d=this.config.statusField&&s.data?.[this.config.statusField]||"",h=this.config.iconField&&s.data?.[this.config.iconField]||"";if(h){const p=elt("span","timeline-icon");p.dataset.icon=String(h),r.appendChild(p)}if(a){const p=elt("div","timeline-date");p.textContent=String(a),r.appendChild(p)}if(o){const p=elt("h4","timeline-title");p.textContent=String(o),r.appendChild(p)}if(d){const p=elt("span",`badge badge-${d}`);p.textContent=String(d),r.appendChild(p)}if(c){const p=elt("div","timeline-body");p.textContent=String(c),r.appendChild(p)}n.appendChild(r)}return n}renderBlockPlaceholder(t){const e=elt("div","dm-collection-display dm-cb-block-loading");return e.textContent="Rendering\u2026",this.fetchBlockFragment(t,e),e}async fetchBlockFragment(t,e){const i=++this._fragReqId,n=t.map(a=>a.id).filter(Boolean),s={slug:this.config.slug,display:"block",block:this.config.block,"title-field":this.config.titleField,"body-field":this.config.bodyField,fields:this.config.fields?this.config.fields.join(","):"",empty:this.config.emptyMsg,limit:String(n.length||1)},r={...this.state.filter,...this.config.baked||{}};for(const[a,o]of Object.entries(r))o!==""&&o!=null&&(s[`where_${a}`]=String(o));s.sort=this.state.sort,s.order=this.state.order,s.limit=String(this.config.pageSize);try{const a=btoa(unescape(encodeURIComponent(JSON.stringify(s)))),o=await fetch("/api/collections/render-fragment",{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders()},body:JSON.stringify({attrs:a,page:this.state.page})});if(i!==this._fragReqId)return;if(!o.ok){e.textContent=this.config.emptyMsg;return}const{html:c}=await o.json(),d=document.createElement("template");d.innerHTML=c||"",e.replaceWith(d.content)}catch{e.textContent="Unable to load block view."}}readUrlState(){if(!this.config.syncUrl)return;const t=new URLSearchParams(window.location.search),e=this.urlPrefix,i=r=>t.get(e+r);i("search")&&(this.state.search=i("search")),i("sort")&&(this.state.sort=i("sort")),i("order")&&(this.state.order=i("order")),i("page")&&(this.state.page=parseInt(i("page"),10)||1);const n={},s=`${e}filter[`;for(const[r,a]of t.entries())if(r.startsWith(s)&&r.endsWith("]")){const o=r.slice(s.length,-1);o&&(n[o]=a)}Object.keys(n).length&&(this.state.filter=n)}writeUrlState(){const t=new URL(window.location.href),e=this.urlPrefix,i=[];for(const s of t.searchParams.keys())s.startsWith(e)&&i.push(s);i.forEach(s=>t.searchParams.delete(s));const n=(s,r)=>{r!==""&&r!=null&&t.searchParams.set(e+s,r)};n("search",this.state.search),this.state.sort!==(this.config.initial?.sort||"createdAt")&&n("sort",this.state.sort),this.state.order!==(this.config.initial?.order||"desc")&&n("order",this.state.order),this.state.page!==1&&n("page",this.state.page);for(const[s,r]of Object.entries(this.state.filter))r!==""&&r!=null&&t.searchParams.set(`${e}filter[${s}]`,r);try{window.history.replaceState({},"",t.toString())}catch{}}}const OPERATORS=["_eq","_ne","_gte","_lte","_gt","_lt","_in","_nin","_contains","_starts","_ends","_exists"];function parseFilterKey(l){for(const t of OPERATORS)if(l.endsWith(t))return{field:l.slice(0,-t.length),op:t};return{field:l,op:"_eq"}}function resolveField(l,t){if(t==="createdBy")return l.meta?.createdBy;if(t==="id")return l.id;const e=t.split(".");let i=l.data;for(const n of e){if(i==null)return;i=i[n]}return i}function maybeNumber(l){if(typeof l=="number"||typeof l!="string")return l;const t=Number(l);return Number.isFinite(t)&&String(t)===l.trim()?t:l}function applyOp(l,t,e){switch(l){case"_eq":{const i=maybeNumber(t),n=maybeNumber(e);return Array.isArray(t)?t.map(maybeNumber).includes(n):i===n||String(i)===String(n)}case"_ne":{const i=maybeNumber(t),n=maybeNumber(e);return Array.isArray(t)?!t.map(maybeNumber).includes(n):!(i===n||String(i)===String(n))}case"_gt":return maybeNumber(t)>maybeNumber(e);case"_gte":return maybeNumber(t)>=maybeNumber(e);case"_lt":return maybeNumber(t)<maybeNumber(e);case"_lte":return maybeNumber(t)<=maybeNumber(e);case"_in":{const i=String(e).split(",").map(n=>maybeNumber(n.trim()));return Array.isArray(t)?t.map(maybeNumber).some(n=>i.includes(n)):i.includes(maybeNumber(t))}case"_nin":{const i=String(e).split(",").map(n=>maybeNumber(n.trim()));return Array.isArray(t)?!t.map(maybeNumber).some(n=>i.includes(n)):!i.includes(maybeNumber(t))}case"_contains":return String(t??"").toLowerCase().includes(String(e).toLowerCase());case"_starts":return String(t??"").toLowerCase().startsWith(String(e).toLowerCase());case"_ends":return String(t??"").toLowerCase().endsWith(String(e).toLowerCase());case"_exists":{const i=t!=null&&t!=="";return e==="true"||e==="1"||e===!0?i:!i}default:return!1}}function applyFilterInMemory(l,t){return!t||!Object.keys(t).length?l:l.filter(e=>{for(const[i,n]of Object.entries(t)){if(n==null||n==="")continue;const{field:s,op:r}=parseFilterKey(i),a=resolveField(e,s);if(!applyOp(r,a,n))return!1}return!0})}function sortEntries(l,t,e){const i=e==="asc"?1:-1;return[...l].sort((n,s)=>{const r=t==="createdAt"?n.meta?.createdAt||"":n.data?.[t]??"",a=t==="createdAt"?s.meta?.createdAt||"":s.data?.[t]??"";return r<a?-i:r>a?i:0})}function elt(l,t){const e=document.createElement(l);return t&&(e.className=t),e}function isFileRef(l){return l&&typeof l=="object"&&typeof l.url=="string"&&typeof l.name=="string"}function formatValue(l){return l==null?"":isFileRef(l)?l.name:Array.isArray(l)?l.join(", "):typeof l=="boolean"?l?"Yes":"No":String(l)}function fieldDisplay(l,t){if(t?.type==="reference"){const e=l?._refs?.[t.name];if(e!=null)return Array.isArray(e)?e.map(i=>i.missing?`${i.id} (missing)`:i.display).join(", "):e.missing?`${e.id} (missing)`:e.display}return formatValue(l?.data?.[t?.name])}function fieldDisplayNode(l,t){if(t?.type==="reference"){const i=l?._refs?.[t.name];if(i!=null){const n=document.createDocumentFragment();return(Array.isArray(i)?i:[i]).forEach((r,a)=>{if(a>0&&n.appendChild(document.createTextNode(", ")),r.missing)n.appendChild(document.createTextNode(`${r.id} (missing)`));else if(r.link){const o=document.createElement("a");o.href=r.link,o.textContent=r.display,n.appendChild(o)}else n.appendChild(document.createTextNode(r.display))}),n}}const e=l?.data?.[t?.name];if(isFileRef(e)){const i=document.createElement("a");if(i.href=e.url,String(e.mime||"").startsWith("image/")){i.target="_blank",i.rel="noopener";const n=document.createElement("img");n.src=e.url,n.alt=e.name,n.loading="lazy",n.className="dm-file-thumb",i.appendChild(n)}else i.download="",i.textContent=e.name;return i}return document.createTextNode(formatValue(e))}function debounce(l,t){let e;return(...i)=>{clearTimeout(e),e=setTimeout(()=>l(...i),t)}}function toCsv(l,t){const e=s=>{if(s==null)return"";let r=Array.isArray(s)?s.join(", "):String(s);return/[",\n\r]/.test(r)&&(r='"'+r.replace(/"/g,'""')+'"'),r},i=t.map(s=>e(s.label||s.name)).join(","),n=l.map(s=>t.map(r=>e(s.data?.[r.name])).join(",")).join(`
|
|
2
|
+
`);return i+`
|
|
3
|
+
`+n+`
|
|
4
|
+
`}function downloadCsv(l,t){const e=new Blob([t],{type:"text/csv;charset=utf-8"}),i=URL.createObjectURL(e),n=document.createElement("a");n.href=i,n.download=l,document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e3)}function syncSliderToInputs(l,t,e){if(!l)return;const i=l.querySelector(".dm-cb-slider-handle-min"),n=l.querySelector(".dm-cb-slider-handle-max"),s=l.querySelector(".dm-cb-slider-fill");if(!i||!n||!s)return;const r=Number(l.dataset.lo),a=Number(l.dataset.hi),o=Number(t),c=Number(e);Number.isFinite(o)&&(i.value=String(Math.max(r,Math.min(a,o)))),Number.isFinite(c)&&(n.value=String(Math.max(r,Math.min(a,c))));const d=Math.min(Number(i.value),Number(n.value)),h=Math.max(Number(i.value),Number(n.value)),p=a-r||1;s.style.left=`${(d-r)/p*100}%`,s.style.right=`${100-(h-r)/p*100}%`}
|
package/public/js/forms.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const targets=document.querySelectorAll("[data-form]");targets.length&&targets.forEach(initFormTarget);function showMessage(
|
|
1
|
+
const targets=document.querySelectorAll("[data-form]");targets.length&&targets.forEach(initFormTarget);function showMessage(a,s,t){const e=a.querySelector(".fb-form-success, .fb-form-error");e&&e.remove();const m=document.createElement("div");m.className=t==="success"?"fb-form-success":"fb-form-error",m.textContent=s,a.appendChild(m)}function attachRuntimeLifecycle(a,s){if(a._formLogicRuntime=s,!a.parentNode||typeof MutationObserver>"u")return;const t=new MutationObserver(function(e){for(const m of e)for(const n of m.removedNodes)if(n===a||n.nodeType===1&&n.contains&&n.contains(a)){s.destroy(),t.disconnect();return}});t.observe(a.parentNode,{childList:!0,subtree:!1})}function buildBlueprintFromFields(a,s){const t={};return a.forEach(function(e){if(e.type==="page-break"||e.type==="spacer"||!e.name)return;const m=e.type==="checkbox"?"boolean":e.type==="date"?"string":e.type,n={...e.formConfig||{}};n.span==="full"&&s&&(n.span=s);const r={type:m,label:e.label||e.name,required:e.required||!1,options:e.options,formConfig:{...e.placeholder&&{placeholder:e.placeholder},...e.helper&&{helperText:e.helper},...e.tooltip&&{tooltip:e.tooltip},...n}};e.minLength!==void 0&&(r.minLength=e.minLength),e.maxLength!==void 0&&(r.maxLength=e.maxLength),e.min!==void 0&&(r.min=e.min),e.max!==void 0&&(r.max=e.max),e.type==="chooser"&&(e.variant&&(r.variant=e.variant),e.multiple&&(r.multiple=!0),e.density&&(r.density=e.density),e.columns&&(r.columns=e.columns),e.accent&&(r.accent=e.accent),e.accentStyle&&(r.accentStyle=e.accentStyle),e.glow&&(r.glow=!0),e.glowColour&&(r.glowColour=e.glowColour),e.shadow&&(r.shadow=e.shadow),e.shadowColour&&(r.shadowColour=e.shadowColour)),t[e.name]=r}),t}function buildInitialData(a){const s={};return a.forEach(function(t){if(!(!t.name||t.type==="page-break"||t.type==="spacer")&&(t.type==="select"||t.type==="multiselect")&&t.required){const e=(t.options||[])[0];e&&(s[t.name]=typeof e=="object"?e.value:e)}}),s}function patchDateInputs(a,s){(s||[]).forEach(function(t){if(t.type!=="date"||!t.name)return;const e=a.querySelector('[name="'+t.name+'"]');e&&e.type!=="date"&&(e.type="date")})}function buildWizardSteps(a,s){const t=[];let e=[],m=s||"Step 1",n="";return a.forEach(function(r){r.type==="page-break"?(t.push({title:m,description:n,fieldGroup:e}),e=[],m=r.label||"Step "+(t.length+1),n=r.description||""):r.type!=="spacer"&&e.push(r)}),t.push({title:m,description:n,fieldGroup:e}),t}function injectHoneypot(a){const s=document.createElement("div");s.className="fb-form-honeypot",s.setAttribute("aria-hidden","true");const t=document.createElement("input");t.name="website",t.type="text",t.tabIndex=-1,t.autocomplete="url",t.placeholder="https://",s.appendChild(t);const e=document.createElement("input");e.name="_t",e.type="hidden",e.value=Date.now(),s.appendChild(e),a.appendChild(s)}function injectSpacers(a,s){const t=a.querySelector("form");if(!t)return;const e=Array.from(t.querySelectorAll(".form-group"));let m=0;s.forEach(function(n){if(n.type==="spacer"){const r=document.createElement("div");r.className="fb-spacer";const c=e[m];if(c)t.insertBefore(r,c);else{const l=t.querySelector('[type="submit"]');l?t.insertBefore(r,l):t.appendChild(r)}}else n.type!=="page-break"&&m++})}function submitForm(a,s,t,e,m){const n=m||e,r=n.querySelector('[name="website"]')?.value||"",c=n.querySelector('[name="_t"]')?.value||"",l=n?Array.from(n.querySelectorAll('input[type="file"]')):[],p=l.some(i=>i.files&&i.files.length>0);let u,o;if(p){const i=new FormData;for(const[h,f]of Object.entries(s||{}))f!=null&&(l.some(d=>d.name===h)||i.append(h,typeof f=="object"?JSON.stringify(f):String(f)));for(const h of l)for(const f of h.files)i.append(h.name,f,f.name);i.append("_hp",r),i.append("_t",c),u=i,o={}}else{const i=Object.assign({},s,{_hp:r,_t:c});u=JSON.stringify(i),o={"Content-Type":"application/json"}}return fetch("/api/forms/submit/"+a,{method:"POST",headers:o,body:u}).then(i=>i.json().then(h=>({ok:i.ok,body:h}))).then(i=>{i.ok&&i.body.ok?(e.textContent="",showMessage(e,i.body.message||t.successMessage||"Thank you.","success")):showMessage(e,i.body.error||"Something went wrong.","error")}).catch(()=>{showMessage(e,"Unable to submit. Please check your connection.","error")})}function renderManualForm(a,s,t,e,m){const n=document.createElement("form");n.noValidate=!0,s.forEach(function(c){const l=document.createElement("div");l.className="form-group",l.style.marginBottom="1.25rem";const p=document.createElement("label");if(p.className="form-label",p.textContent=c.label||c.name,c.required){const o=document.createElement("span");o.textContent=" *",o.style.color="#f87171",p.appendChild(o)}let u;c.type==="textarea"?(u=document.createElement("textarea"),u.rows=c.formConfig?.rows||4,u.className="form-input"):c.type==="select"?(u=document.createElement("select"),u.className="form-input",(c.options||[]).forEach(function(o){const i=document.createElement("option");i.value=typeof o=="string"?o:o.value??"",i.textContent=typeof o=="string"?o:o.label||i.value,u.appendChild(i)})):(u=document.createElement("input"),u.type=c.type||"text",u.className="form-input",c.placeholder&&(u.placeholder=c.placeholder),c.type==="file"&&(c.file?.accept&&(u.accept=c.file.accept),c.multiple&&(u.multiple=!0))),u.name=c.name,u.required=c.required||!1,l.appendChild(p),l.appendChild(u),n.appendChild(l)}),t.honeypot&&injectHoneypot(n);const r=document.createElement("button");r.type="submit",r.className="btn btn-primary",r.textContent=t.submitText||"Submit",n.appendChild(r),n.addEventListener("submit",function(c){c.preventDefault();const l={};if(s.forEach(function(p){const u=n.querySelector('[name="'+p.name+'"]');u&&(l[p.name]=u.value)}),window.FormLogicEngine&&m){const p=window.FormLogicEngine,u=[],o=[];if(s.forEach(function(i){if(p.evaluateFieldVisibility(i,l)==="hidden"){delete l[i.name];return}const f=p.evaluateFieldRequirement(i,l),d=l[i.name];f&&(!d||!String(d).trim())&&u.push(i.label||i.name);const y=p.validateField(i,d||"",l);y.length&&o.push(y[0].message)}),u.length||o.length){const i=[];u.length&&i.push("Required: "+u.join(", ")),o.length&&i.push(o.join("; ")),showMessage(a,i.join(". "),"error");return}}a.classList.add("fb-form-loading"),r.disabled=!0,submitForm(e,l,t,a,n).finally(function(){a.classList.remove("fb-form-loading"),r.disabled=!1})}),a.appendChild(n),window.FormLogicEngine&&m&&s.some(c=>c.logic)&&new window.FormLogicEngine.FormLogicRuntime(m,a).init()}function initFormTarget(a){const s=a.getAttribute("data-form");s&&fetch("/api/forms/"+s+"/public").then(t=>{if(!t.ok)throw new Error("Form not found: "+s);return t.json()}).then(t=>{const e=t.fields||[],m=t.settings||{},n=document.createElement("div");n.className="fb-form-wrapper",a.appendChild(n);const r=e.some(c=>c.type==="page-break");if(typeof Domma<"u"&&Domma.forms){const c=m.columns||1;if(r&&Domma.forms.wizard){const p=buildWizardSteps(e,t.title).map(function(o){return{title:o.title,description:o.description,fields:buildBlueprintFromFields(o.fieldGroup,c)}}),u=Domma.forms.wizard(n,{schema:{steps:p},onSubmit:function(o){return submitForm(s,o,m,n,null)}});Promise.resolve(u).then(function(){if(patchDateInputs(n,e),window.FormLogicEngine&&e.some(o=>o.logic)){const o=new window.FormLogicEngine.FormLogicRuntime(t,n);o.init(),attachRuntimeLifecycle(n,o)}if(m.honeypot){const o=n.querySelector("form");o&&injectHoneypot(o)}})}else if(Domma.forms.render){const l=buildBlueprintFromFields(e,c),p=buildInitialData(e),u=Domma.forms.render(n,l,p,{submitText:m.submitText||"Submit",layout:m.layout||"stacked",columns:c,onSubmit:function(o){return submitForm(s,o,m,n,null)}});Promise.resolve(u).then(function(){if(patchDateInputs(n,e),window.FormLogicEngine&&e.some(o=>o.logic)){const o=new window.FormLogicEngine.FormLogicRuntime(t,n);o.init(),attachRuntimeLifecycle(n,o)}if(e.some(o=>o.type==="spacer")&&injectSpacers(n,e),m.honeypot){const o=n.querySelector("form");o&&injectHoneypot(o)}})}}else renderManualForm(n,e.filter(c=>c.type!=="page-break"&&c.type!=="spacer"),m,s,t)}).catch(t=>{const e=document.createElement("p");e.textContent="Form unavailable.",e.style.cssText="color:#f87171;font-style:italic;",a.appendChild(e),console.warn("[forms]",t.message)})}
|
package/public/js/site.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
$(()=>{const w=window.__CMS_NAV__||{},l=window.__CMS_SITE__||{};if(l.autoTheme?.enabled){let t=function(s){const h=(s||"07:00").split(":");return+h[0]*60+(+h[1]||0)},o=function(){const s=new Date,h=s.getHours()*60+s.getMinutes();return h>=t(e.dayStart)&&h<t(e.nightStart)?e.dayTheme:e.nightTheme};var i=t,d=o;const e=l.autoTheme;Domma.theme.set(o()),setInterval(()=>Domma.theme.set(o()),6e4)}if($("#site-navbar").length&&w.brand){const e={...w.brand},t=e.size&&e.size!=="md"?` navbar-brand-${e.size}`:"";if(e.logo||e.icon||e.tagline){let o="";e.logo?o+=`<img src="${e.logo}" class="navbar-brand-logo" alt="${e.text||""}">`:e.icon&&(o+=`<span data-icon="${e.icon}" style="width:1.1em;height:1.1em;margin-right:.35em;vertical-align:middle;"></span>`),e.text&&(o+=`<span class="navbar-brand-text${t}">${e.text}</span>`),e.tagline&&(o+=`<small class="navbar-brand-tagline">${e.tagline}</small>`),e.html=o}else t&&e.text&&(e.html=`<span class="navbar-brand-text${t}">${e.text}</span>`);Domma.elements.navbar("#site-navbar",{brand:e,items:w.items||[],variant:w.variant||"dark",position:w.position||"sticky",collapsible:!0}),Domma.icons.scan("#site-navbar")}const v=$("#site-footer");if(v.length){const e=l.social||{},t={twitter:{label:"X / Twitter",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.742l7.73-8.835L1.254 2.25H8.08l4.259 5.629L18.244 2.25zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>'},facebook:{label:"Facebook",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>'},instagram:{label:"Instagram",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>'},linkedin:{label:"LinkedIn",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>'},github:{label:"GitHub",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>'},youtube:{label:"YouTube",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.495 6.205a3.007 3.007 0 00-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 00.527 6.205a31.247 31.247 0 00-.522 5.805 31.247 31.247 0 00.522 5.783 3.007 3.007 0 002.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 002.088-2.088 31.247 31.247 0 00.5-5.783 31.247 31.247 0 00-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg>'}};let o='<div class="footer-inner container">';if(l.footer){const m=l.footer;o+=`<p>${m.copyright||""}</p>`,m.links?.length&&(o+='<nav class="footer-links">',m.links.forEach(n=>{o+=`<a href="${n.url}">${n.text}</a>`}),o+="</nav>");const f=Object.keys(t).filter(n=>e[n]);f.length&&(o+='<div class="footer-social">',f.forEach(n=>{const{label:a,svg:r}=t[n];o+=`<a href="${e[n]}" target="_blank" rel="noopener noreferrer" aria-label="${a}" class="footer-social-link">${r}</a>`}),o+="</div>")}o+="</div>",v.html(o);const s=S.get("reduced_motion"),h=s!==null?!!s:!!(window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches),g=v.get(0).querySelector(".footer-inner");if(g){const m=document.createElement("input");m.type="checkbox",m.className="form-switch-input",m.id="dm-motion-switch",m.checked=h,m.addEventListener("change",function(){S.set("reduced_motion",this.checked),window.location.reload()});const f=document.createElement("span");f.className="form-switch-label",f.textContent="Reduce motion";const n=document.createElement("label");n.className="form-switch footer-motion-switch",n.title="Reduce motion",n.appendChild(m),n.appendChild(f),g.appendChild(n)}}$("#site-sidebar").length&&Domma.elements.sidebar("#site-sidebar",{autoGenerate:!0,selector:"h2, h3",collapsible:!1,push:!0,contentSelector:".site-content"}),Domma.icons.scan();const p=$(".page-body");if(p.length){p.find(".accordion").each(function(){Domma.elements.accordion(this,{allowMultiple:this.dataset.multi==="true"})}),p.find(".tabs").each(function(){Domma.elements.tabs(this)}),p.find(".carousel").each(function(){Domma.elements.carousel(this,{autoplay:this.dataset.autoplay==="true",interval:parseInt(this.dataset.interval,10)||5e3,loop:this.dataset.loop!=="false",animation:this.dataset.animation||"slide"})}),p.find(".dm-countdown").each(function(){const e={autoStart:!0};this.dataset.to&&(e.targetDate=new Date(this.dataset.to)),this.dataset.duration&&(e.duration=parseInt(this.dataset.duration,10)),this.dataset.format&&(e.format=this.dataset.format),Domma.elements.timer(this,e)}),p.find("[data-tooltip]").each(function(){Domma.elements.tooltip(this,{content:$(this).data("tooltip"),position:$(this).data("tooltip-position")||"top"})}),p.find(".dm-progression").each(function(){Domma.elements.progression(this,{layout:this.dataset.layout||"vertical",theme:this.dataset.theme||"minimal",mode:this.dataset.mode||"timeline",statusIcons:!0})});try{Domma.effects.reveal(".page-body .hero",{animation:"slide-up",duration:480,threshold:.06,stagger:60,once:!1})}catch{}document.querySelectorAll(".page-body .row[data-reveal]").forEach(e=>{const t=e.dataset.revealMode||"stagger",o=e.dataset.revealAnimation||"slide-up",s=parseInt(e.dataset.revealDuration,10)||400,h=parseInt(e.dataset.revealStagger,10)||60,g=parseInt(e.dataset.revealDelay,10)||0,m=e.dataset.revealDirection==="rtl",f=Array.from(e.children),n={"slide-up":"translateY(30px)","slide-down":"translateY(-30px)","slide-left":"translateX(30px)","slide-right":"translateX(-30px)",zoom:"scale(0.85)",flip:"perspective(600px) rotateX(15deg)"};f.forEach((a,r)=>{a.style.opacity="0",a.style.transform=n[o]||"",a.style.transition=`opacity ${s}ms ease, transform ${s}ms ease`;const c=m?f.length-1-r:r;a.style.transitionDelay=t==="stagger"?`${g+c*h}ms`:`${g}ms`}),requestAnimationFrame(()=>requestAnimationFrame(()=>{const a=new IntersectionObserver(r=>{r.forEach(c=>{c.isIntersecting&&(c.target.offsetWidth,c.target.style.opacity="1",c.target.style.transform="none",a.unobserve(c.target))})},{threshold:.1});f.forEach(r=>a.observe(r))}))}),p.find(".card[data-collapsible]").each(function(){const e=this.querySelector(".card-header");e&&e.addEventListener("click",()=>this.classList.toggle("is-collapsed"))}),p.find(".dm-so-trigger").each(function(){this.addEventListener("click",()=>{const e=this.dataset.soTarget,t=document.getElementById(e);if(!t)return;const o=E.slideover({title:t.dataset.soTitle||"",size:t.dataset.soSize||"md",position:t.dataset.soPosition||"right"});t.style.display="",o.setContent(t),o.open()})})}if(typeof $.setup=="function"){const e=Object.assign({},window.__CMS_DCONFIG__||{});if(document.querySelectorAll(".dm-page-config[data-config]").forEach(t=>{try{const o=atob(t.dataset.config),s=JSON.parse(o);Object.assign(e,s)}catch{}}),Object.keys(e).length>0){const t={};for(const[o,s]of Object.entries(e)){const h=s?.events?.click,{confirm:g,toast:m,alert:f,prompt:n,...a}=h||{};g||m||f||n?($(o).on("click",async function(c){if(c.preventDefault(),g&&!await E.confirm(g))return;let u=null;if(!(n&&(u=await E.prompt(n,{inputPlaceholder:a.promptPlaceholder||"",inputValue:a.promptDefault||""}),u===null))){if(a.target){const y=$(a.target);a.toggleClass&&y.toggleClass(a.toggleClass),a.addClass&&y.addClass(a.addClass),a.removeClass&&y.removeClass(a.removeClass),u!==null&&(a.setText&&y.text(u),a.setVal&&y.val(u),a.setAttr&&y.attr(a.setAttr,u))}a.href&&(window.location.href=a.href),m&&E.toast(m,{type:a.toastType||"success"}),f&&E.alert(f)}}),Object.keys(a).length&&(t[o]={...s,events:{...s.events,click:a}})):t[o]=s}$.setup(t)}}p.length&&wireCTAButtons(p.get(0))});function wireCTAButtons(w){w.querySelectorAll(".dm-cta-trigger").forEach(l=>{l.addEventListener("click",async()=>{const C=l.dataset.action,v=l.dataset.entry,b=l.dataset.confirm;let p=S.get("auth_token");if(!p){E.toast("Please log in to perform this action.",{type:"warning"});return}if(b&&!await E.confirm(b))return;const i=Array.from(l.childNodes).map(e=>e.cloneNode(!0));l.disabled=!0,l.textContent="Running\u2026";const d=e=>fetch(`/api/actions/${C}/public`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({entryId:v})});try{let e=await d(p);if(e.status===401){const o=S.get("auth_refresh_token");if(o){const s=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:o})});if(s.ok){const{token:h}=await s.json();S.set("auth_token",h),p=h,e=await d(p)}}}const t=await e.json().catch(()=>({}));if(!e.ok)throw new Error(t.error||t.message||`Error ${e.status}`);E.toast(t.message||"Action completed.",{type:"success"})}catch(e){E.toast(e.message||"Action failed.",{type:"error"})}finally{l.disabled=!1,l.textContent="",i.forEach(e=>l.appendChild(e)),Domma.icons.scan(l)}})})}(function(){const l=document.querySelectorAll("[data-collection-table]");!l.length||typeof T>"u"||!T.create||l.forEach(C=>{let v;try{v=JSON.parse(atob(C.dataset.payload))}catch{return}const{columns:b,rows:p,search:i,sortable:d,exportable:e,pageSize:t,empty:o,ctaConfig:s}=v;if(!b?.length)return;if(s){const m=b.findIndex(f=>f.key==="_cta");m!==-1&&(b[m]={key:"_cta",title:"",render:(f,n)=>{const a=document.createElement("button");if(a.className=`btn btn-${s.style||"primary"} dm-cta-trigger`,a.dataset.action=s.action||"",a.dataset.entry=n._entryId||"",s.confirm&&(a.dataset.confirm=s.confirm),s.icon){const r=document.createElement("span");r.dataset.icon=s.icon,a.appendChild(r),a.appendChild(document.createTextNode(" "))}return a.appendChild(document.createTextNode(s.label||"Run")),a}})}const h="col-table-"+Math.random().toString(36).slice(2,7),g=document.createElement("div");g.id=h,C.replaceChildren(g),T.create("#"+h,{data:p,columns:b,search:i,sortable:d,exportable:e,pageSize:t,emptyMessage:o}),s&&wireCTAButtons(g)})})(),(function(){const l=document.querySelectorAll("[data-form-inline]");if(!l.length||typeof F>"u")return;function C(i,d){const e={};return(i||[]).forEach(t=>{if(t.type==="page-break"||t.type==="spacer"||!t.name)return;const o=t.type==="checkbox"?"boolean":t.type==="date"?"string":t.type,s={...t.formConfig||{}};s.span==="full"&&d&&(s.span=d),e[t.name]={type:o,label:t.label,required:t.required,options:t.options,formConfig:{...t.placeholder&&{placeholder:t.placeholder},...t.helper&&{hint:t.helper},...s}}}),e}function v(i){const d={};return(i||[]).forEach(e=>{if(!(!e.name||e.type==="page-break"||e.type==="spacer")&&(e.type==="select"||e.type==="multiselect")&&e.required){const t=(e.options||[])[0];t&&(d[e.name]=typeof t=="object"?t.value:t)}}),d}function b(i,d){(d||[]).forEach(e=>{if(e.type!=="date"||!e.name)return;const t=i.querySelector(`[name="${e.name}"]`);t&&t.type!=="date"&&(t.type="date")})}function p(i,d,e){let t=i.querySelector(".cms-form-message");t||(t=document.createElement("p"),t.className="cms-form-message",i.appendChild(t)),t.textContent=d,t.style.cssText=e?"color:var(--danger,#f87171);margin-top:.75rem;":"color:var(--success,#4ade80);margin-top:.75rem;"}l.forEach(i=>{let d;try{d=JSON.parse(atob(i.dataset.formInline))}catch{return}const e=d.fields||[],t=d.settings||{},o=t.columns||1,s=t.layout||"stacked",h=e.some(n=>n.type==="page-break"),g=async n=>{try{const a=i.querySelector('[name="website"]'),r=i.querySelector('[name="_t"]'),c=Object.assign({},n);a!==null&&(c._hp=a.value),r!==null&&(c._t=r.value);const u=await H.post(`/api/forms/submit/${d.slug}`,c);if(u?.redirect){window.location.href=u.redirect;return}for(;i.firstChild;)i.removeChild(i.firstChild);p(i,u?.message||t.successMessage||"Thank you for your submission.",!1)}catch(a){throw p(i,a.message||"Submission failed. Please try again.",!0),a}};function m(n){const a=n.querySelector("form");if(!a)return;const r=document.createElement("div");r.className="fb-form-honeypot",r.setAttribute("aria-hidden","true");const c=document.createElement("input");c.name="website",c.type="text",c.tabIndex=-1,c.autocomplete="url",c.placeholder="https://",r.appendChild(c);const u=document.createElement("input");u.name="_t",u.type="hidden",u.value=Date.now(),r.appendChild(u),a.appendChild(r)}function f(){if(!window.FormLogicEngine||!e.some(a=>a.logic))return;const n=new window.FormLogicEngine.FormLogicRuntime(d,i);if(n.init(),i._formLogicRuntime=n,i.parentNode&&typeof MutationObserver<"u"){const a=new MutationObserver(function(r){for(const c of r)for(const u of c.removedNodes)if(u===i||u.nodeType===1&&u.contains&&u.contains(i)){n.destroy(),a.disconnect();return}});a.observe(i.parentNode,{childList:!0,subtree:!1})}}if(h&&F.wizard){const n=[];let a=[],r=d.title||"Step 1",c="";e.forEach(y=>{y.type==="page-break"?(n.push({title:r,description:c,fields:C(a,o)}),a=[],r=y.label||`Step ${n.length+1}`,c=y.description||""):y.type!=="spacer"&&a.push(y)}),n.push({title:r,description:c,fields:C(a,o)});const u=F.wizard(i,{schema:{steps:n},onSubmit:g});Promise.resolve(u).then(function(){b(i,e),t.honeypot!==!1&&m(i),f()})}else if(F.render){const n=F.render(i,C(e,o),v(e),{submitText:t.submitText||"Submit",layout:s,columns:o,onSubmit:g});Promise.resolve(n).then(function(){if(s==="grid"&&t.submitSpan==="full"){const a=i.querySelector(".form-buttons");a&&a.classList.add("col-span-full")}b(i,e),t.honeypot!==!1&&m(i),f()})}}),$(document).on("click",".dm-banner__dismiss",function(){$(this).closest(".dm-banner").remove()})})();
|
|
1
|
+
$(()=>{const x=window.__CMS_NAV__||{},p=window.__CMS_SITE__||{};if(p.autoTheme?.enabled){let n=function(h){const g=(h||"07:00").split(":");return+g[0]*60+(+g[1]||0)},r=function(){const h=new Date,g=h.getHours()*60+h.getMinutes();return g>=n(e.dayStart)&&g<n(e.nightStart)?e.dayTheme:e.nightTheme};var s=n,d=r;const e=p.autoTheme;Domma.theme.set(r()),setInterval(()=>Domma.theme.set(r()),6e4)}if($("#site-navbar").length&&x.brand){const e={...x.brand},n=e.size&&e.size!=="md"?` navbar-brand-${e.size}`:"";if(e.logo||e.icon||e.tagline){let r="";e.logo?r+=`<img src="${e.logo}" class="navbar-brand-logo" alt="${e.text||""}">`:e.icon&&(r+=`<span data-icon="${e.icon}" style="width:1.1em;height:1.1em;margin-right:.35em;vertical-align:middle;"></span>`),e.text&&(r+=`<span class="navbar-brand-text${n}">${e.text}</span>`),e.tagline&&(r+=`<small class="navbar-brand-tagline">${e.tagline}</small>`),e.html=r}else n&&e.text&&(e.html=`<span class="navbar-brand-text${n}">${e.text}</span>`);Domma.elements.navbar("#site-navbar",{brand:e,items:x.items||[],variant:x.variant||"dark",position:x.position||"sticky",collapsible:!0}),Domma.icons.scan("#site-navbar")}const b=$("#site-footer");if(b.length){let g=function(c){return String(c??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")},m=function(c){return g(c).replace(/'/g,"'")},i=function(c){const y=m(c.url||"#"),v=g(c.text||""),_=Array.isArray(c.items)&&c.items.length?`<ul>${c.items.map(i).join("")}</ul>`:"";return`<li><a href="${y}">${v}</a>${_}</li>`};var a=g,t=m,w=i;const e=p.social||{},n={twitter:{label:"X / Twitter",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.742l7.73-8.835L1.254 2.25H8.08l4.259 5.629L18.244 2.25zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>'},facebook:{label:"Facebook",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>'},instagram:{label:"Instagram",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>'},linkedin:{label:"LinkedIn",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>'},github:{label:"GitHub",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>'},youtube:{label:"YouTube",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.495 6.205a3.007 3.007 0 00-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 00.527 6.205a31.247 31.247 0 00-.522 5.805 31.247 31.247 0 00.522 5.783 3.007 3.007 0 002.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 002.088-2.088 31.247 31.247 0 00.5-5.783 31.247 31.247 0 00-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg>'}};let r='<div class="footer-inner container">';const h=window.__CMS_FOOTER__||{primary:[],legal:[],copyright:""};if(h.copyright&&(r+=`<p>${g(h.copyright)}</p>`),h.primary.length&&(r+=`<nav class="footer-nav footer-nav--primary"><ul>${h.primary.map(i).join("")}</ul></nav>`),h.legal.length&&(r+=`<nav class="footer-nav footer-nav--legal"><ul>${h.legal.map(i).join("")}</ul></nav>`),p.footer){const c=Object.keys(n).filter(y=>e[y]);c.length&&(r+='<div class="footer-social">',c.forEach(y=>{const{label:v,svg:_}=n[y];r+=`<a href="${e[y]}" target="_blank" rel="noopener noreferrer" aria-label="${v}" class="footer-social-link">${_}</a>`}),r+="</div>")}r+="</div>",b.html(r);const u=S.get("reduced_motion"),f=u!==null?!!u:!!(window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches),o=b.get(0).querySelector(".footer-inner");if(o){const c=document.createElement("input");c.type="checkbox",c.className="form-switch-input",c.id="dm-motion-switch",c.checked=f,c.addEventListener("change",function(){S.set("reduced_motion",this.checked),window.location.reload()});const y=document.createElement("span");y.className="form-switch-label",y.textContent="Reduce motion";const v=document.createElement("label");v.className="form-switch footer-motion-switch",v.title="Reduce motion",v.appendChild(c),v.appendChild(y),o.appendChild(v)}}$("#site-sidebar").length&&Domma.elements.sidebar("#site-sidebar",{autoGenerate:!0,selector:"h2, h3",collapsible:!1,push:!0,contentSelector:".site-content"}),Domma.icons.scan();const l=$(".page-body");if(l.length){l.find(".accordion").each(function(){Domma.elements.accordion(this,{allowMultiple:this.dataset.multi==="true"})}),l.find(".tabs").each(function(){Domma.elements.tabs(this)}),l.find(".carousel").each(function(){const e={autoplay:this.dataset.autoplay==="true",interval:parseInt(this.dataset.interval,10)||5e3,loop:this.dataset.loop!=="false",animation:this.dataset.animation||"slide"};if(this.dataset.animationDuration){const n=parseInt(this.dataset.animationDuration,10);Number.isFinite(n)&&(e.animationDuration=n)}this.dataset.animationEasing&&(e.animationEasing=this.dataset.animationEasing),Domma.elements.carousel(this,e)}),l.find(".dm-countdown").each(function(){const e={autoStart:!0};this.dataset.to&&(e.targetDate=new Date(this.dataset.to)),this.dataset.duration&&(e.duration=parseInt(this.dataset.duration,10)),this.dataset.format&&(e.format=this.dataset.format),Domma.elements.timer(this,e)}),l.find("[data-tooltip]").each(function(){Domma.elements.tooltip(this,{content:$(this).data("tooltip"),position:$(this).data("tooltip-position")||"top"})}),l.find(".dm-progression").each(function(){Domma.elements.progression(this,{layout:this.dataset.layout||"vertical",theme:this.dataset.theme||"minimal",mode:this.dataset.mode||"timeline",statusIcons:!0})});try{Domma.effects.reveal(".page-body .hero",{animation:"slide-up",duration:480,threshold:.06,stagger:60,once:!1})}catch{}document.querySelectorAll(".page-body .row[data-reveal]").forEach(e=>{const n=e.dataset.revealMode||"stagger",r=e.dataset.revealAnimation||"slide-up",h=parseInt(e.dataset.revealDuration,10)||400,g=parseInt(e.dataset.revealStagger,10)||60,m=parseInt(e.dataset.revealDelay,10)||0,i=e.dataset.revealDirection==="rtl",u=Array.from(e.children),f={"slide-up":"translateY(30px)","slide-down":"translateY(-30px)","slide-left":"translateX(30px)","slide-right":"translateX(-30px)",zoom:"scale(0.85)",flip:"perspective(600px) rotateX(15deg)"};u.forEach((o,c)=>{o.style.opacity="0",o.style.transform=f[r]||"",o.style.transition=`opacity ${h}ms ease, transform ${h}ms ease`;const y=i?u.length-1-c:c;o.style.transitionDelay=n==="stagger"?`${m+y*g}ms`:`${m}ms`}),requestAnimationFrame(()=>requestAnimationFrame(()=>{const o=new IntersectionObserver(c=>{c.forEach(y=>{y.isIntersecting&&(y.target.offsetWidth,y.target.style.opacity="1",y.target.style.transform="none",o.unobserve(y.target))})},{threshold:.1});u.forEach(c=>o.observe(c))}))}),l.find(".card[data-collapsible]").each(function(){const e=this.querySelector(".card-header");e&&e.addEventListener("click",()=>this.classList.toggle("is-collapsed"))}),l.find(".dm-so-trigger").each(function(){this.addEventListener("click",()=>{const e=this.dataset.soTarget,n=document.getElementById(e);if(!n)return;const r=E.slideover({title:n.dataset.soTitle||"",size:n.dataset.soSize||"md",position:n.dataset.soPosition||"right"});n.style.display="",r.setContent(n),r.open()})})}if(typeof $.setup=="function"){const e=Object.assign({},window.__CMS_DCONFIG__||{});if(document.querySelectorAll(".dm-page-config[data-config]").forEach(n=>{try{const r=atob(n.dataset.config),h=JSON.parse(r);Object.assign(e,h)}catch{}}),Object.keys(e).length>0){const n={};for(const[r,h]of Object.entries(e)){const g=h?.events?.click,{confirm:m,toast:i,alert:u,prompt:f,...o}=g||{};m||i||u||f?($(r).on("click",async function(y){if(y.preventDefault(),m&&!await E.confirm(m))return;let v=null;if(!(f&&(v=await E.prompt(f,{inputPlaceholder:o.promptPlaceholder||"",inputValue:o.promptDefault||""}),v===null))){if(o.target){const _=$(o.target);o.toggleClass&&_.toggleClass(o.toggleClass),o.addClass&&_.addClass(o.addClass),o.removeClass&&_.removeClass(o.removeClass),v!==null&&(o.setText&&_.text(v),o.setVal&&_.val(v),o.setAttr&&_.attr(o.setAttr,v))}o.href&&(window.location.href=o.href),i&&E.toast(i,{type:o.toastType||"success"}),u&&E.alert(u)}}),Object.keys(o).length&&(n[r]={...h,events:{...h.events,click:o}})):n[r]=h}$.setup(n)}}l.length&&wireCTAButtons(l.get(0))});function wireCTAButtons(x){x.querySelectorAll(".dm-cta-trigger").forEach(p=>{p.__ctaWired||(p.__ctaWired=!0,p.addEventListener("click",async()=>{const k=p.dataset.action,b=p.dataset.entry,C=p.dataset.confirm;let l=S.get("auth_token");if(!l){E.toast("Please log in to perform this action.",{type:"warning"});return}if(C&&!await E.confirm(C))return;const s=Array.from(p.childNodes).map(a=>a.cloneNode(!0));p.disabled=!0,p.textContent="Running\u2026";const d=a=>fetch(`/api/actions/${k}/public`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`},body:JSON.stringify({entryId:b})});try{let a=await d(l);if(a.status===401){const w=S.get("auth_refresh_token");if(w){const e=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:w})});if(e.ok){const{token:n}=await e.json();S.set("auth_token",n),l=n,a=await d(l)}}}const t=await a.json().catch(()=>({}));if(!a.ok)throw new Error(t.error||t.message||`Error ${a.status}`);E.toast(t.message||"Action completed.",{type:"success"})}catch(a){E.toast(a.message||"Action failed.",{type:"error"})}finally{p.disabled=!1,p.textContent="",s.forEach(a=>p.appendChild(a)),Domma.icons.scan(p)}}))})}(function(){const p=document.querySelectorAll('.dm-collection-hydrate[data-collection-scope="mine"]');if(!p.length)return;const k=S.get("auth_token");function b(l,s){const d=document.createElement("div");d.className="dm-collection-display dm-collection-empty";const a=document.createElement("p");if(s){a.appendChild(document.createTextNode("Please "));const t=document.createElement("a");t.href="/login",t.textContent="sign in",a.appendChild(t),a.appendChild(document.createTextNode(" to view your entries."))}else a.textContent=l;return d.appendChild(a),d}function C(l,s){const d=document.createElement("template");d.innerHTML=s||"",l.replaceWith(d.content)}p.forEach(async l=>{const s=l.dataset.collectionAttrs;if(!s)return;if(!k){l.replaceChildren(b("",!0));return}const d=a=>fetch("/api/collections/render-scope",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`},body:JSON.stringify({attrs:s})});try{let a=k,t=await d(a);if(t.status===401){const e=S.get("auth_refresh_token");if(e){const n=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(n.ok){const{token:r}=await n.json();S.set("auth_token",r),a=r,t=await d(a)}}}if(!t.ok){const{error:e}=await t.json().catch(()=>({}));l.replaceChildren(b(e||"Unable to load entries.",!1));return}const{html:w}=await t.json();C(l,w)}catch{l.replaceChildren(b("Unable to load entries.",!1))}}),setTimeout(()=>{typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(),wireCTAButtons(document.body)},100)})(),(function(){const p=document.querySelectorAll("[data-collection-table]");!p.length||typeof T>"u"||!T.create||p.forEach(k=>{let b;try{b=JSON.parse(atob(k.dataset.payload))}catch{return}const{columns:C,rows:l,search:s,sortable:d,exportable:a,pageSize:t,empty:w,ctaConfig:e}=b;if(!C?.length)return;if(e){const h=C.findIndex(g=>g.key==="_cta");h!==-1&&(C[h]={key:"_cta",title:"",render:(g,m)=>{const i=document.createElement("button");if(i.className=`btn btn-${e.style||"primary"} dm-cta-trigger`,i.dataset.action=e.action||"",i.dataset.entry=m._entryId||"",e.confirm&&(i.dataset.confirm=e.confirm),e.icon){const u=document.createElement("span");u.dataset.icon=e.icon,i.appendChild(u),i.appendChild(document.createTextNode(" "))}return i.appendChild(document.createTextNode(e.label||"Run")),i}})}const n="col-table-"+Math.random().toString(36).slice(2,7),r=document.createElement("div");r.id=n,k.replaceChildren(r),T.create("#"+n,{data:l,columns:C,search:s,sortable:d,exportable:a,pageSize:t,emptyMessage:w}),e&&wireCTAButtons(r)})})(),(function(){const p=document.querySelectorAll("[data-form-inline]");if(!p.length||typeof F>"u")return;function k(s,d){const a={};return(s||[]).forEach(t=>{if(t.type==="page-break"||t.type==="spacer"||!t.name)return;const w=t.type==="checkbox"?"boolean":t.type==="date"?"string":t.type,e={...t.formConfig||{}};e.span==="full"&&d&&(e.span=d);const n={type:w,label:t.label,required:t.required,options:t.options,formConfig:{...t.placeholder&&{placeholder:t.placeholder},...t.helper&&{hint:t.helper},...e}};t.type==="chooser"&&(t.variant&&(n.variant=t.variant),t.multiple&&(n.multiple=!0),t.density&&(n.density=t.density),t.columns&&(n.columns=t.columns),t.accent&&(n.accent=t.accent),t.accentStyle&&(n.accentStyle=t.accentStyle),t.glow&&(n.glow=!0),t.glowColour&&(n.glowColour=t.glowColour),t.shadow&&(n.shadow=t.shadow),t.shadowColour&&(n.shadowColour=t.shadowColour)),a[t.name]=n}),a}function b(s){const d={};return(s||[]).forEach(a=>{if(!(!a.name||a.type==="page-break"||a.type==="spacer")&&(a.type==="select"||a.type==="multiselect")&&a.required){const t=(a.options||[])[0];t&&(d[a.name]=typeof t=="object"?t.value:t)}}),d}function C(s,d){(d||[]).forEach(a=>{if(a.type!=="date"||!a.name)return;const t=s.querySelector(`[name="${a.name}"]`);t&&t.type!=="date"&&(t.type="date")})}function l(s,d,a){let t=s.querySelector(".cms-form-message");t||(t=document.createElement("p"),t.className="cms-form-message",s.appendChild(t)),t.textContent=d,t.style.cssText=a?"color:var(--danger,#f87171);margin-top:.75rem;":"color:var(--success,#4ade80);margin-top:.75rem;"}p.forEach(s=>{let d;try{d=JSON.parse(atob(s.dataset.formInline))}catch{return}const a=d.fields||[],t=d.settings||{},w=t.columns||1,e=t.layout||"stacked",n=a.some(m=>m.type==="page-break"),r=async m=>{try{const i=s.querySelector('[name="website"]'),u=s.querySelector('[name="_t"]'),f=Object.assign({},m);i!==null&&(f._hp=i.value),u!==null&&(f._t=u.value);const o=await H.post(`/api/forms/submit/${d.slug}`,f);if(o&&o.error){l(s,o.error,!0);const c=new Error(o.error);throw c.formSubmitFailed=!0,c}if(o?.redirect){window.location.href=o.redirect;return}for(;s.firstChild;)s.removeChild(s.firstChild);l(s,o?.message||t.successMessage||"Thank you for your submission.",!1)}catch(i){throw i.formSubmitFailed||l(s,i.message||"Submission failed. Please try again.",!0),i}};function h(m){const i=m.querySelector("form");if(!i)return;const u=document.createElement("div");u.className="fb-form-honeypot",u.setAttribute("aria-hidden","true");const f=document.createElement("input");f.name="website",f.type="text",f.tabIndex=-1,f.autocomplete="url",f.placeholder="https://",u.appendChild(f);const o=document.createElement("input");o.name="_t",o.type="hidden",o.value=Date.now(),u.appendChild(o),i.appendChild(u)}function g(){if(!window.FormLogicEngine||!a.some(i=>i.logic))return;const m=new window.FormLogicEngine.FormLogicRuntime(d,s);if(m.init(),s._formLogicRuntime=m,s.parentNode&&typeof MutationObserver<"u"){const i=new MutationObserver(function(u){for(const f of u)for(const o of f.removedNodes)if(o===s||o.nodeType===1&&o.contains&&o.contains(s)){m.destroy(),i.disconnect();return}});i.observe(s.parentNode,{childList:!0,subtree:!1})}}if(n&&F.wizard){const m=[];let i=[],u=d.title||"Step 1",f="";a.forEach(c=>{c.type==="page-break"?(m.push({title:u,description:f,fields:k(i,w)}),i=[],u=c.label||`Step ${m.length+1}`,f=c.description||""):c.type!=="spacer"&&i.push(c)}),m.push({title:u,description:f,fields:k(i,w)});const o=F.wizard(s,{schema:{steps:m},onSubmit:r});Promise.resolve(o).then(function(){C(s,a),t.honeypot!==!1&&h(s),g()})}else if(F.render){const m=F.render(s,k(a,w),b(a),{submitText:t.submitText||"Submit",layout:e,columns:w,onSubmit:r});Promise.resolve(m).then(function(){if(e==="grid"&&t.submitSpan==="full"){const i=s.querySelector(".form-buttons");i&&i.classList.add("col-span-full")}C(s,a),t.honeypot!==!1&&h(s),g()})}}),$(document).on("click",".dm-banner__dismiss",function(){$(this).closest(".dm-banner").remove()})})();
|
package/server/config.js
CHANGED
|
@@ -49,8 +49,19 @@ export function saveConfig(name, data) {
|
|
|
49
49
|
const serverConfig = loadJson('server');
|
|
50
50
|
if (process.env.PORT) serverConfig.port = parseInt(process.env.PORT, 10);
|
|
51
51
|
|
|
52
|
+
const cacheDefaults = {
|
|
53
|
+
enabled: process.env.NODE_ENV === 'production',
|
|
54
|
+
driver: 'memory',
|
|
55
|
+
memory: {maxItems: 1000, defaultTtlSeconds: 3600}
|
|
56
|
+
};
|
|
57
|
+
const cacheFile = path.join(CONFIG_DIR, 'cache.json');
|
|
58
|
+
const cacheConfig = fs.existsSync(cacheFile)
|
|
59
|
+
? {...cacheDefaults, ...JSON.parse(fs.readFileSync(cacheFile, 'utf8'))}
|
|
60
|
+
: cacheDefaults;
|
|
61
|
+
|
|
52
62
|
export const config = {
|
|
53
63
|
server: serverConfig,
|
|
54
64
|
auth: loadJson('auth'),
|
|
55
|
-
content: loadJson('content')
|
|
65
|
+
content: loadJson('content'),
|
|
66
|
+
cache: cacheConfig
|
|
56
67
|
};
|