domma-cms 0.101.2 → 0.101.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,37 @@
1
- import{fmtDate as m}from"./dates.js";export const NAME_RE=/^[a-z0-9][a-z0-9-]*$/,MAX_CSS=50*1024,FORM_FIELDS=["name","project","bundled","content","css"];export function formFromBlock(t,{project:n=""}={}){return t?{name:String(t.name||""),project:String(t.meta?.project||""),bundled:t.bundled===!0,content:String(t.content??""),css:String(t.css??"")}:{name:"",project:String(n||""),bundled:!1,content:"",css:""}}export function snapshot(t){const n=t||{};return JSON.stringify(FORM_FIELDS.map(e=>e==="bundled"?n[e]===!0:String(n[e]??"")))}export function checkForm(t,{isNew:n,taken:e=[]}={}){const r=String(t?.name||"").trim(),o={};n&&(r?NAME_RE.test(r)?e.includes(r)&&(o.name=`"${r}" is already a block - open it from the list, or choose another name.`):o.name="Lowercase letters, digits and hyphens, starting with a letter or digit.":o.name="A block needs a name.");const s=String(t?.css??"");return s.length>MAX_CSS&&(o.css=`The CSS is ${Math.ceil(s.length/1024)} KB - a block's CSS is limited to 50 KB.`),{errors:o,name:r}}export function payloadFromForm(t,n={}){return{content:String(t?.content??""),bundled:t?.bundled===!0,css:String(t?.css??""),meta:{...n||{},project:String(t?.project||"")||null}}}export function extractPlaceholders(t){const n=new Set;for(const[,e]of String(t??"").matchAll(/\{\{([\w_]+)(?::[^{}]+)?\}\}/g))n.add(e);return[...n]}const l=t=>String(t??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");export{l as escapeHtml};export function formatDate(t,n){if(t==null||t==="")return null;const e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return null;const r=(a,u=2)=>String(a).padStart(u,"0"),o=["January","February","March","April","May","June","July","August","September","October","November","December"],s=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],i=()=>(e.getHours()+11)%12+1,c={YYYY:()=>e.getFullYear(),YY:()=>r(e.getFullYear()%100),MMMM:()=>o[e.getMonth()],MMM:()=>o[e.getMonth()].slice(0,3),MM:()=>r(e.getMonth()+1),M:()=>e.getMonth()+1,DD:()=>r(e.getDate()),D:()=>e.getDate(),dddd:()=>s[e.getDay()],ddd:()=>s[e.getDay()].slice(0,3),HH:()=>r(e.getHours()),H:()=>e.getHours(),hh:()=>r(i()),h:()=>i(),mm:()=>r(e.getMinutes()),m:()=>e.getMinutes(),ss:()=>r(e.getSeconds()),s:()=>e.getSeconds(),A:()=>e.getHours()<12?"AM":"PM",a:()=>e.getHours()<12?"am":"pm"};return String(n).replace(/YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|A|a/g,a=>String(c[a]()))}const g={icon:"box","facebook-icon":"facebook","instagram-icon":"instagram"};export function sampleValue(t,n=new Date){const e=String(t).toLowerCase();return g[e]?g[e]:e==="_id"?"a1b2c3d4-e5f6-7890-abcd-ef1234567890":e==="_createdat"||e==="_updatedat"?n.toISOString():e.includes("email")?"user@example.com":e.includes("phone")?"+44 7700 900000":e.includes("name")?"Jane Smith":e.includes("title")?"Sample Title":e.includes("message")||e.includes("content")||e.includes("description")?"This is a sample value for preview purposes.":e.includes("rating")?"excellent":e.includes("status")?"active":e.includes("priority")?"high":e.includes("date")?m(n):e.includes("tag")?"tag1, tag2":e.includes("subject")?"Sample Subject":e.includes("category")?"general":`Sample ${t}`}export const scopeName=t=>String(t||"").trim()||"preview";export function renderPreview(t,n={}){const e=String(t?.content??"").replace(/\{\{([\w_]+)(?::([^{}]+))?\}\}/g,(i,c,a)=>{const u=n[c]??`[${c}]`;if(a){const d=formatDate(u,a);if(d!==null)return l(d)}return l(u)}),r=l(scopeName(t?.name)),o=String(t?.css??"");return`${o.trim()?`<style>[data-block="${r}"] { ${o.replace(/<\/style/gi,"<\\/style")} }</style>`:""}<div data-block="${r}">${e}</div>`}const p=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);export function formatHtml(t){const n=String(t??"").match(/(<[^>]+>|[^<]+)/g)||[],e=[];let r=0;for(const o of n){const s=o.trim();if(s)if(s.startsWith("</"))r=Math.max(0,r-1),e.push(" ".repeat(r)+s);else if(s.startsWith("<")&&!s.startsWith("<!")&&!s.endsWith("/>")){e.push(" ".repeat(r)+s);const i=(s.match(/^<(\w+)/)||[])[1]||"";p.has(i.toLowerCase())||r++}else e.push(" ".repeat(r)+s)}return e.join(`
2
- `)}export const draftKey=t=>`block-editor.draft.${t||"new"}`;export function draftOffer(t,n){return!t||typeof t!="object"||!t.form||snapshot(t.form)===n?null:{form:t.form,stale:!!t.base&&t.base!==n,at:t.at||""}}export const shortcodeFor=t=>`[collection slug="\u2026" display="block" block="${t}" /]`;
1
+ import{fmtDate as M}from"./dates.js";export const NAME_RE=/^[a-z0-9][a-z0-9-]*$/,MAX_CSS=50*1024,FORM_FIELDS=["name","project","bundled","content","css"];export function formFromBlock(e,{project:r=""}={}){return e?{name:String(e.name||""),project:String(e.meta?.project||""),bundled:e.bundled===!0,content:String(e.content??""),css:String(e.css??"")}:{name:"",project:String(r||""),bundled:!1,content:"",css:""}}export function snapshot(e){const r=e||{};return JSON.stringify(FORM_FIELDS.map(n=>n==="bundled"?r[n]===!0:String(r[n]??"")))}export function checkForm(e,{isNew:r,taken:n=[]}={}){const t=String(e?.name||"").trim(),o={};r&&(t?NAME_RE.test(t)?n.includes(t)&&(o.name=`"${t}" is already a block - open it from the list, or choose another name.`):o.name="Lowercase letters, digits and hyphens, starting with a letter or digit.":o.name="A block needs a name.");const i=String(e?.css??"");return i.length>MAX_CSS&&(o.css=`The CSS is ${Math.ceil(i.length/1024)} KB - a block's CSS is limited to 50 KB.`),{errors:o,name:t}}export function payloadFromForm(e,r={}){return{content:String(e?.content??""),bundled:e?.bundled===!0,css:String(e?.css??""),meta:{...r||{},project:String(e?.project||"")||null}}}export function extractPlaceholders(e){const r=new Set;for(const[,n]of y(e).matchAll(/\{\{([\w_]+)(?::[^{}]+)?\}\}/g))r.add(n);return[...r]}export function rawPlaceholders(e){return new Set([...y(e).matchAll(/\{\{\{(\w+)\}\}\}/g)].map(r=>r[1]))}const y=e=>String(e??"").replace(/<!--[\s\S]*?-->/g,""),d=e=>String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");export{d as escapeHtml};export function formatDate(e,r){if(e==null||e==="")return null;const n=e instanceof Date?e:new Date(e);if(Number.isNaN(n.getTime()))return null;const t=(a,l=2)=>String(a).padStart(l,"0"),o=["January","February","March","April","May","June","July","August","September","October","November","December"],i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],s=()=>(n.getHours()+11)%12+1,c={YYYY:()=>n.getFullYear(),YY:()=>t(n.getFullYear()%100),MMMM:()=>o[n.getMonth()],MMM:()=>o[n.getMonth()].slice(0,3),MM:()=>t(n.getMonth()+1),M:()=>n.getMonth()+1,DD:()=>t(n.getDate()),D:()=>n.getDate(),dddd:()=>i[n.getDay()],ddd:()=>i[n.getDay()].slice(0,3),HH:()=>t(n.getHours()),H:()=>n.getHours(),hh:()=>t(s()),h:()=>s(),mm:()=>t(n.getMinutes()),m:()=>n.getMinutes(),ss:()=>t(n.getSeconds()),s:()=>n.getSeconds(),A:()=>n.getHours()<12?"AM":"PM",a:()=>n.getHours()<12?"am":"pm"};return String(r).replace(/YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|A|a/g,a=>String(c[a]()))}const S={icon:"box","facebook-icon":"facebook","instagram-icon":"instagram"};export const SAMPLE_IMAGE="data:image/svg+xml,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="800" height="500" viewBox="0 0 800 500"><rect width="800" height="500" fill="#94a3b8"/><path d="M0 500 L260 230 L420 390 L540 290 L800 500 Z" fill="#64748b"/><circle cx="610" cy="140" r="52" fill="#cbd5e1"/></svg>');const v=/(image|img|photo|picture|avatar|logo|thumb|thumbnail|cover|banner)(url|src)?$/;export function sampleValue(e,r=new Date,{raw:n=!1}={}){const t=String(e).toLowerCase();return S[t]?S[t]:/(class|style)$/.test(t)?"":t==="_id"?"a1b2c3d4-e5f6-7890-abcd-ef1234567890":t==="_createdat"||t==="_updatedat"?r.toISOString():t.replace(/update(?!d)/g,"").includes("date")||/(published|created|updated)at$/.test(t)?M(r):v.test(t)?n?t.includes("avatar")?`<img src="${SAMPLE_IMAGE}" alt="" width="40" height="40">`:`<img src="${SAMPLE_IMAGE}" alt="">`:SAMPLE_IMAGE:/(url|href|link)$/.test(t)?"#":t.includes("email")?"user@example.com":t.includes("phone")?"+44 7700 900000":t.includes("name")?"Jane Smith":t.includes("title")?"Sample Title":["message","content","description","summary","excerpt"].some(o=>t.includes(o))?"This is a sample value for preview purposes.":t.includes("rating")?"excellent":t.includes("status")?"active":t.includes("priority")?"high":t.includes("tag")?"tag1, tag2":t.includes("subject")?"Sample Subject":t.includes("categor")?n?'<a href="#">General</a>':"general":`Sample ${e}`}export const scopeName=e=>String(e||"").trim()||"preview",PREVIEW_REPEATS=[1,3];export function renderPreview(e,r={},{repeat:n=1,sanitize:t=null}={}){if(typeof t!="function")return"";const o=u=>r[u]??`[${u}]`,i=String(e?.content??"").replace(/<!--[\s\S]*?-->/g,"").replace(/\{\{\{(\w+)\}\}\}/g,(u,g)=>String(o(g))).replace(/\{\{([\w_]+)(?::([^{}]+))?\}\}/g,(u,g,p)=>{const f=o(g);if(p){const h=formatDate(f,p);if(h!==null)return d(h)}return d(f)}),s=d(scopeName(e?.name)),c=String(e?.css??""),a=c.trim()?`<style>[data-block="${s}"] { ${c.replace(/<\/style/gi,"<\\/style")} }</style>`:"",l=PREVIEW_REPEATS.includes(Number(n))?Number(n):1,m=String(t(i)??"");if(l===1)return`${a}<div class="dm-static-block" data-block="${s}">${m}</div>`;const b=`<div data-block="${s}">${m}</div>`;return`${a}<div class="dm-collection-display dm-collection-blocks grid grid-cols-1 grid-cols-md-2 grid-cols-lg-3 gap-4">`+Array.from({length:l},()=>b).join("")+"</div>"}export function previewBridge(e,r){const n=JSON.stringify(Number(e)||0),t=JSON.stringify(String(r)).replace(/</g,"\\u003c");return`<script>(function () {
2
+ var P = window.parent, TICK = ${n}, HOST = ${t};
3
+ function host() { return document.getElementById(HOST); }
4
+ function up(msg) { msg.source = 'dm-block-preview'; msg.tick = TICK; P.postMessage(msg, '*'); }
5
+ function hideFloating() {
6
+ var h = host();
7
+ document.querySelectorAll('body *').forEach(function (el) {
8
+ if (!h || el.contains(h) || h.contains(el)) return;
9
+ var pos = getComputedStyle(el).position;
10
+ if (pos === 'fixed' || pos === 'sticky') el.style.setProperty('display', 'none', 'important');
11
+ });
12
+ }
13
+ window.addEventListener('message', function (e) {
14
+ if (e.source !== P) return;
15
+ var d = e.data || {};
16
+ if (d.source !== 'dm-block-editor' || d.tick !== TICK || d.type !== 'paint') return;
17
+ var el = host();
18
+ if (!el) return;
19
+ el.innerHTML = String(d.html || '');
20
+ try { if (window.I && I.scan) I.scan(el); } catch (err) { /* icons are a nicety */ }
21
+ });
22
+ document.addEventListener('click', function (e) {
23
+ if (e.target.closest && e.target.closest('a[href], button, [type="submit"]')) e.preventDefault();
24
+ }, true);
25
+ document.addEventListener('submit', function (e) { e.preventDefault(); }, true);
26
+ document.addEventListener('keydown', function (e) {
27
+ if ((e.ctrlKey || e.metaKey) && (e.key === 's' || e.key === 'S')) { e.preventDefault(); up({type: 'save'}); }
28
+ }, true);
29
+ function ready() {
30
+ hideFloating();
31
+ new MutationObserver(hideFloating).observe(document.body, {childList: true});
32
+ setTimeout(hideFloating, 800);
33
+ up({type: 'ready', host: !!host()});
34
+ }
35
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', ready); else ready();
36
+ })();<\/script>`}export function previewShell(e,r,n){const t=`<style>body.dm-cloaked{opacity:1 !important;transition:none !important}#${n}{padding:1.5rem 0}.dm-breadcrumbs{display:none !important}body.dm-vnav-left,body.dm-vnav-right{padding-left:0 !important;padding-right:0 !important}</style>`;let o=String(e??"");o=/<\/head>/i.test(o)?o.replace(/<\/head>/i,`${t}</head>`):t+o;const i=previewBridge(r,n),s=o.toLowerCase().lastIndexOf("</body>");return s>=0?o.slice(0,s)+i+o.slice(s):o+i}export function previewMessage(e,r,n){if(!e||!r||e.source!==r)return null;const t=e.data;return!t||t.source!=="dm-block-preview"||t.tick!==n?null:["ready","save"].includes(t.type)?t:null}const w=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);export function formatHtml(e){const r=String(e??"").match(/(<[^>]+>|[^<]+)/g)||[],n=[];let t=0;for(const o of r){const i=o.trim();if(i)if(i.startsWith("</"))t=Math.max(0,t-1),n.push(" ".repeat(t)+i);else if(i.startsWith("<")&&!i.startsWith("<!")&&!i.endsWith("/>")){n.push(" ".repeat(t)+i);const s=(i.match(/^<(\w+)/)||[])[1]||"";w.has(s.toLowerCase())||t++}else n.push(" ".repeat(t)+i)}return n.join(`
37
+ `)}export const draftKey=e=>`block-editor.draft.${e||"new"}`;export function draftOffer(e,r){return!e||typeof e!="object"||!e.form||snapshot(e.form)===r?null:{form:e.form,stale:!!e.base&&e.base!==r,at:e.at||""}}export const shortcodeFor=e=>`[collection slug="\u2026" display="block" block="${e}" /]`;
@@ -22,7 +22,7 @@ import{onceClosed as p}from"./tool-kit.js";const m=([o,a,n])=>n===void 0?{code:o
22
22
  [col]
23
23
  [card title="Three"]Content[/card]
24
24
  [/col]
25
- [/grid]`)]}),t("Box",{intro:"A card with no header - a plain container. No shadow and a 2px corner radius unless you say otherwise.",rows:[['shadow="none|md|lg"',"Shadow (default: none)"],['rounded="xs|none|sm|lg|full"',"Corners (default: xs = 2px)"],['padding="compact|spacious"',"Inner padding"],["borderless","Flag: no border"],['color="primary|secondary|success|info|warning|danger"',"Tint from the theme colour (light or dark with the theme)"],['color="#0f766e"',"Your own colour, kept on every theme, with black or white text picked for it"],['footer="..."',"Footer strip text"],['class="..."',"Extra CSS classes (the box also carries dm-box)"]],examples:[e("Basic box",`[box]
25
+ [/grid]`)]}),t("Box",{intro:"A card with no header - a plain container. No shadow and a 2px corner radius unless you say otherwise.",rows:[['shadow="none|md|lg"',"Shadow (default: none)"],['rounded="xs|none|sm|lg|full"',"Corners (default: xs = 2px)"],['padding="compact|spacious"',"Inner padding"],["borderless","Flag: no border"],['hover="off"',"No lift when the pointer is over it (boxes and cards lift by default)"],['color="primary|secondary|success|info|warning|danger"',"Tint from the theme colour (light or dark with the theme)"],['color="#0f766e"',"Your own colour, kept on every theme, with black or white text picked for it"],['footer="..."',"Footer strip text"],['class="..."',"Extra CSS classes (the box also carries dm-box)"]],examples:[e("Basic box",`[box]
26
26
  Any content - text, buttons, a grid or a card.
27
27
  [/box]`),e("Tinted from the theme",`[box color="warning"]
28
28
  **Heads up:** the office is closed on Friday.
@@ -2,7 +2,7 @@ export const SHORTCODES=[{name:"card",label:"Card",icon:"card",category:"Layout"
2
2
  Content
3
3
  [/card]`,custom:"card",attrs:[{name:"title",type:"text",label:"Title"},{name:"subtitle",type:"text",label:"Subtitle"},{name:"icon",type:"icon",label:"Icon"},{name:"icon-layout",type:"select",label:"Icon layout",options:[["inline","Inline"],["stacked","Stacked"]]},{name:"footer",type:"text",label:"Footer"},{name:"variant",type:"select",label:"Variant",options:[["","Default"],["primary","Primary"]]},{name:"collapsible",type:"checkbox",label:"Collapsible"},{name:"hover",type:"checkbox",label:"Hover highlight"},{name:"class",type:"text",label:"CSS class"},{name:"id",type:"text",label:"ID"}]},{name:"box",label:"Box",icon:"square",category:"Layout",selfClosing:!1,container:!0,wrappable:!0,template:`[box]
4
4
  Content
5
- [/box]`,attrs:[{name:"shadow",type:"select",label:"Shadow",options:[["","None (default)"],["md","Medium"],["lg","Large"]]},{name:"rounded",type:"select",label:"Corners",options:[["","2px (default)"],["none","Square"],["sm","Small"],["lg","Large"],["full","Pill"]]},{name:"padding",type:"select",label:"Padding",options:[["","Normal"],["compact","Compact"],["spacious","Spacious"]]},{name:"borderless",type:"checkbox",label:"No border"},{name:"color",type:"select",label:"Colour (from the theme)",options:[["","None"],["primary","Primary"],["secondary","Secondary"],["success","Success"],["info","Info"],["warning","Warning"],["danger","Danger"]]},{name:"footer",type:"text",label:"Footer"},{name:"class",type:"text",label:"CSS class"},{name:"id",type:"text",label:"ID"}]},{name:"grid",label:"Grid",icon:"columns",category:"Layout",selfClosing:!1,container:!0,wrappable:!1,template:`[grid cols="2" gap="3"]
5
+ [/box]`,attrs:[{name:"shadow",type:"select",label:"Shadow",options:[["","None (default)"],["md","Medium"],["lg","Large"]]},{name:"rounded",type:"select",label:"Corners",options:[["","2px (default)"],["none","Square"],["sm","Small"],["lg","Large"],["full","Pill"]]},{name:"padding",type:"select",label:"Padding",options:[["","Normal"],["compact","Compact"],["spacious","Spacious"]]},{name:"borderless",type:"checkbox",label:"No border"},{name:"hover",type:"select",label:"Hover",options:[["","Lift (default)"],["off","Off - stays still"]]},{name:"color",type:"select",label:"Colour (from the theme)",options:[["","None"],["primary","Primary"],["secondary","Secondary"],["success","Success"],["info","Info"],["warning","Warning"],["danger","Danger"]]},{name:"footer",type:"text",label:"Footer"},{name:"class",type:"text",label:"CSS class"},{name:"id",type:"text",label:"ID"}]},{name:"grid",label:"Grid",icon:"columns",category:"Layout",selfClosing:!1,container:!0,wrappable:!1,template:`[grid cols="2" gap="3"]
6
6
  [col]
7
7
  Left
8
8
  [/col]
@@ -84,7 +84,32 @@
84
84
  <p class="bex-note" data-bind-hidden="!noSamples.value" data-bind-text="noSamplesText"></p>
85
85
  <div class="bex-samples" data-each="sampleRows.value key=key"></div>
86
86
  </div>
87
- <div id="block-preview-output" class="bex-output" aria-label="Preview"></div>
87
+ <div class="bex-output">
88
+ <div class="bex-output-bar">
89
+ <div class="live-preview-widths" role="group" aria-label="Preview width">
90
+ <button type="button" class="live-preview-width" title="Full width" aria-label="Full width" data-on-click="setWidth('full')"
91
+ data-bind-class="pvWidth.value === 'full' && 'active'"><span data-icon="monitor" data-icon-size="14"></span></button>
92
+ <button type="button" class="live-preview-width" title="Tablet (1024px)" aria-label="Tablet width" data-on-click="setWidth('1024')"
93
+ data-bind-class="pvWidth.value === '1024' && 'active'"><span data-icon="tablet" data-icon-size="14"></span></button>
94
+ <button type="button" class="live-preview-width" title="Mobile (390px)" aria-label="Mobile width" data-on-click="setWidth('390')"
95
+ data-bind-class="pvWidth.value === '390' && 'active'"><span data-icon="smartphone" data-icon-size="14"></span></button>
96
+ </div>
97
+ <select class="form-select form-select-sm bex-pv-select" aria-label="How many copies" data-model="pvRepeat.value">
98
+ <option value="1">One</option>
99
+ <option value="3">Three in a grid</option>
100
+ </select>
101
+ <select id="block-preview-theme" class="form-select form-select-sm bex-pv-select" aria-label="Site theme for the preview" data-model="pvTheme.value">
102
+ <option value="">Site theme</option>
103
+ </select>
104
+ <small class="bex-pv-status" data-bind-text="pvStatus.value"></small>
105
+ <span data-help-title="Preview" data-help="The block drawn inside your site's own page - its theme, fonts, site styles and Custom CSS - exactly as a page would show it, from what is in the editor now. Try it at tablet or mobile width, as three entries in a collection grid, or in another theme. Links in the preview do not navigate."></span>
106
+ </div>
107
+ <div class="bex-stage">
108
+ <iframe id="block-preview-frame" class="page-live-preview-frame" src="about:blank" title="Block preview"
109
+ data-bind-data-width="pvWidth.value === 'full' ? null : pvWidth.value"
110
+ sandbox="allow-same-origin allow-scripts"></iframe>
111
+ </div>
112
+ </div>
88
113
  </div>
89
114
  </div>
90
115
  </div>
@@ -184,7 +209,7 @@
184
209
  .bex-seg button + button { border-left: 1px solid var(--dm-border); }
185
210
  .bex-seg button:hover { background: var(--dm-table-hover-bg, color-mix(in srgb, var(--dm-text) 6%, transparent)); }
186
211
  .bex-seg button.is-on { background: var(--dm-primary); color: var(--dm-primary-text); }
187
- .bex-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0; height: min(70vh, 820px); min-height: 460px;
212
+ .bex-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0; height: min(82vh, 980px); min-height: 520px;
188
213
  border: 1px solid var(--dm-border); border-radius: var(--dm-radius-md); overflow: hidden; }
189
214
  .bex-body.is-write { grid-template-columns: minmax(0, 1fr); }
190
215
  .bex-body.is-write .bex-preview { display: none; }
@@ -194,7 +219,7 @@
194
219
  .bex-write { border-right: 1px solid var(--dm-border); }
195
220
  .bex-body.is-write .bex-write { border-right: 0; }
196
221
  .bex-preview { display: flex; flex-direction: column; }
197
- .bex-samples-wrap { flex-shrink: 0; max-height: 40%; overflow-y: auto; padding: .6rem .75rem; border-bottom: 1px solid var(--dm-border);
222
+ .bex-samples-wrap { flex-shrink: 0; max-height: 30%; overflow-y: auto; padding: .6rem .75rem; border-bottom: 1px solid var(--dm-border);
198
223
  background: var(--dm-surface-raised, color-mix(in srgb, var(--dm-text) 4%, transparent)); display: flex; flex-direction: column; gap: .4rem; }
199
224
  .bex-samples-title { display: flex; align-items: center; gap: .3rem; font-size: var(--dm-text-sm); font-weight: 600; }
200
225
  .bex-samples { display: flex; flex-direction: column; gap: .3rem; }
@@ -205,7 +230,12 @@
205
230
  .bex-sample input { flex: 1; min-width: 0; }
206
231
  .bex-kebab { border: 0; background: none; cursor: pointer; font-size: var(--dm-text-lg); color: var(--dm-text-muted); border-radius: var(--dm-radius-sm); padding: 0 .3rem; }
207
232
  .bex-kebab:hover { color: var(--dm-primary); }
208
- .bex-output { flex: 1; overflow-y: auto; padding: 1rem; background: var(--dm-background, var(--dm-surface)); }
233
+ .bex-output { flex: 1; min-height: 0; display: flex; flex-direction: column; }
234
+ .bex-output-bar { flex: none; display: flex; align-items: center; flex-wrap: wrap; gap: .5rem; padding: .4rem .75rem; border-bottom: 1px solid var(--dm-border); }
235
+ .bex-pv-select { width: auto; }
236
+ .bex-pv-status { flex: 1 1 auto; color: var(--dm-text-muted); font-size: var(--dm-text-xs); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
237
+ .bex-stage { flex: 1; min-height: 0; display: flex; justify-content: center; overflow: auto; background: var(--dm-background-alt, var(--dm-surface)); }
238
+ .bex-stage .page-live-preview-frame { border-radius: 0; }
209
239
  .bex-css { height: 260px; border: 1px solid var(--dm-border); border-radius: var(--dm-radius-md); overflow: hidden; }
210
240
  .bex-ref summary { cursor: pointer; list-style: revert; }
211
241
  .bex-ref-body { font-size: var(--dm-text-sm); line-height: 1.7; }
@@ -214,6 +244,6 @@
214
244
  .bex-grid { grid-template-columns: 1fr; }
215
245
  .bex-body, .bex-body.is-split { grid-template-columns: minmax(0, 1fr); height: auto; }
216
246
  .bex-body .bex-write { height: 55vh; border-right: 0; border-bottom: 1px solid var(--dm-border); }
217
- .bex-body .bex-preview { min-height: 40vh; }
247
+ .bex-body .bex-preview { min-height: 60vh; }
218
248
  }
219
249
  </style>
@@ -131,6 +131,12 @@ Tinted with the theme's success colour.
131
131
  <code>lg</code> &middot; <code>full</code></td>
132
132
  <td>Corner radius</td>
133
133
  </tr>
134
+ <tr>
135
+ <td><code>hover</code></td>
136
+ <td><code>off</code></td>
137
+ <td>Boxes and cards lift a little when the pointer is over them. <code>hover="off"</code>
138
+ keeps this one still - for a box that is not clickable. Works on <code>[card]</code> too.</td>
139
+ </tr>
134
140
  <tr>
135
141
  <td><code>color</code> (or <code>colour</code>)</td>
136
142
  <td><code>primary</code> &middot; <code>secondary</code> &middot; <code>success</code> &middot;
@@ -759,6 +765,26 @@ Body content in **Markdown** is supported.
759
765
  </tbody>
760
766
  </table>
761
767
 
768
+ <h3>Designing a block</h3>
769
+ <p>Blocks live in <strong>Data &gt; Blocks</strong>. A block is HTML with
770
+ <code>&#123;&#123;field&#125;&#125;</code> placeholders (HTML-escaped),
771
+ <code>&#123;&#123;&#123;field&#125;&#125;&#125;</code> for ready-made HTML, and
772
+ <code>&#123;&#123;date:DD MMM YYYY&#125;&#125;</code> for dates. Its Custom CSS is scoped to the
773
+ block; site-wide rules can live in <strong>Site Settings &gt; Custom CSS</strong> instead.</p>
774
+ <p>The editor's preview draws the block <strong>inside your site's own page</strong> - its theme,
775
+ fonts, site styles and Custom CSS - filled from the sample values, and redraws it as you type.
776
+ Above the preview you can:</p>
777
+ <ul>
778
+ <li>switch between full, tablet (1024px) and mobile (390px) width;</li>
779
+ <li>show <strong>One</strong> copy, as <code>[block]</code> places it, or <strong>Three in a grid</strong>,
780
+ as <code>[collection display="block" cols="3"]</code> lists entries - use this for cards
781
+ and for rules such as <code>:nth-child(even)</code>;</li>
782
+ <li>try the block in another site theme (the site itself is not changed).</li>
783
+ </ul>
784
+ <p>Image fields get a grey picture and link fields <code>#</code> as samples; links in the preview do
785
+ not navigate, and anything a block's HTML could run (an <code>onerror</code> handler, a <code>javascript:</code> link, a script) is removed first, as the site removes it. Ctrl+S saves even while the preview has focus. The site's floating buttons (search, theme switcher) are hidden there so they do
786
+ not cover the block. Unsaved Site Settings CSS is not shown - save it first.</p>
787
+
762
788
  <h3>Collections on a page</h3>
763
789
  <pre class="code-block"><code>[collection slug="team" display="cards" columns="3" title-field="name" /]
764
790
  [collection slug="jobs" display="cards" searchable filterable="location,type" sortable page-size="9" where_status="open" /]
@@ -1,14 +1,14 @@
1
- import{api as q}from"../api.js";import{addBannerAction as J}from"../lib/plugin-chrome.js";import{helpPopovers as qe}from"../lib/help-popover.js";import{openMenuAt as he,sidebarCount as Ie}from"../lib/tool-kit.js";import{createSimpleEditor as ye}from"../lib/simple-editor.js";import{checkForm as Fe,draftKey as g,draftOffer as Ne,escapeHtml as ke,extractPlaceholders as Pe,formFromBlock as De,formatHtml as Ve,payloadFromForm as Be,renderPreview as Ke,sampleValue as Se,scopeName as Ue,shortcodeFor as He,snapshot as G}from"../lib/block-editor-arrange.js";import{fmtDateTime as ge}from"../lib/dates.js";const Ye=/^\/blocks\/(new|edit\/[^/?#]+)\/?(\?.*)?$/,F=c=>String(c||"").split("?")[0],Q="block-editor.mode",We=["write","split","preview"],_e=`
1
+ import{api as $}from"../api.js";import{addBannerAction as ue}from"../lib/plugin-chrome.js";import{helpPopovers as at}from"../lib/help-popover.js";import{openMenuAt as Fe,sidebarCount as nt}from"../lib/tool-kit.js";import{createSimpleEditor as Ie}from"../lib/simple-editor.js";import{checkForm as st,draftKey as j,draftOffer as rt,escapeHtml as Ne,extractPlaceholders as ct,formFromBlock as lt,formatHtml as it,payloadFromForm as ut,previewMessage as dt,previewShell as pt,rawPlaceholders as We,renderPreview as mt,sampleValue as _e,scopeName as vt,shortcodeFor as ft,snapshot as de}from"../lib/block-editor-arrange.js";import{fmtDateTime as He}from"../lib/dates.js";const ht=/^\/blocks\/(new|edit\/[^/?#]+)\/?(\?.*)?$/,J=u=>String(u||"").split("?")[0],pe="block-editor.mode",bt=["write","split","preview"],Be="block-editor.preview",Ve=["full","1024","390"],yt="/__block-preview",me="dm-block-preview-root",Ke={title:"Block preview",layout:"blank",breadcrumbs:!1},kt={ADD_ATTR:["target","loading"],ALLOW_DATA_ATTR:!0,FORCE_BODY:!0},wt=()=>window.DOMPurify?.sanitize?u=>window.DOMPurify.sanitize(u,kt):null,gt=`
2
2
  <div class="bex-sample" data-key="{{key}}" tabindex="0">
3
3
  <label class="bex-sample-label" for="bex-sample-{{key}}">{{label}}</label>
4
4
  <input id="bex-sample-{{key}}" type="text" class="form-input form-input--sm" data-bind-value="value" data-sample="{{key}}" placeholder="Sample {{key}}">
5
5
  <button type="button" class="bex-kebab" aria-label="Actions for {{label}}" title="Actions">\u22EE</button>
6
- </div>`;let p=null,we=!1;function ze(){we||!window.R?.use||(we=!0,R.use((c,i,s)=>{if(!(Ye.test(i?.path||"")&&F(c?.path)!==F(i?.path))||!p?.dirty())return s();const r=p;return E.confirm(`You have unsaved changes to ${ke(r.label())}. Leave anyway? They are kept as a draft for your next visit.`).then(A=>{A?s():history.replaceState(null,"",r.hash)})}),M.subscribe("router:afterChange",({to:c}={})=>{if(p&&F(c?.path)!==p.path){const i=p;p=null,i.dispose()}}))}function Je(c,i){const s=c.querySelector(".dm-plugin-banner-name"),f=s?.lastChild;f&&f.nodeType===3&&s.querySelector(".dm-plugin-banner-sep")&&(f.textContent=i)}function N(c){return navigator.clipboard?.writeText(c).then(()=>!0,()=>!1)??Promise.resolve(!1)}export const blockEditorView={templateUrl:"/admin/js/templates/block-editor.html",async onMount(c){if(ze(),p){const e=p;p=null,e.dispose()}const i=c.get(0),s=i.querySelector(".bex")||i,f=[],r=e=>(f.push(e),e);let A=!1;const P=()=>!A&&s.isConnected,X=location.hash.match(/^#\/blocks\/edit\/([^/?#]+)/),a=X?decodeURIComponent(X[1]):null,l=!a,Ee=location.hash,Ce=F(location.hash.slice(1)),xe=l&&new URLSearchParams(location.hash.split("?")[1]||"").get("project")||"",Z=E.loader(i,{type:"dots"});let b=null,D=[],V=[];try{[b,D,V]=await Promise.all([a?q.blocks.get(a):Promise.resolve(null),q.blocks.list().catch(()=>[]),q.projects.list().catch(()=>[])])}catch(e){Z.destroy(),E.toast(e.message||"Block not found.",{type:"error"}),R.navigate("/blocks");return}if(Z.destroy(),!s.isConnected)return;const ee=(Array.isArray(D)?D:[]).map(e=>e.name).sort((e,t)=>e.localeCompare(t));let te=b?.meta||{};const u=De(b?{...b,name:a}:null,{project:xe}),n={};for(const[e,t]of Object.entries(u))n[e]=M.observable(t);const B=()=>Object.fromEntries(Object.keys(n).map(e=>[e,n[e].peek()])),oe=()=>Object.fromEntries(Object.keys(n).map(e=>[e,n[e].value])),w=M.observable(G(u)),C=M.computed(()=>G(oe())!==w.value),x=M.observable(!1),O=M.observable(!1),T=M.computed(()=>Fe(oe(),{isNew:l,taken:ee}));let ae="split";try{ae=We.includes(S.get(Q))?S.get(Q):"split"}catch{}const h=M.observable(ae);r(M.effect(()=>{const e=h.value;try{S.set(Q,e)}catch{}}));const ne=M.observable("Ln 1, Col 1"),y={},K=M.observable(0),U=M.observable([]);r(M.effect(()=>{const e=Pe(n.content.value);for(const t of e)t in y||(y[t]=Se(t));U.value=e.map(t=>({key:t,label:`{{${t}}}`,value:y[t]}))}));const Me={...n,dirty:C,saving:x,mode:h,cursor:ne,sampleRows:U,isNew:l,notNew:!l,titleText:l?"New block":a,metaText:M.computed(()=>{if(l)return"Not saved yet";const e=[];return(b?.updatedAt||b?.meta?.updatedAt)&&e.push(`changed ${ge(b.updatedAt||b.meta.updatedAt)}`),e.push(`${n.content.value.split(`
7
- `).length} lines`),n.css.value.trim()&&e.push(`${Math.ceil(n.css.value.length/1024)} KB CSS`),e.join(" \xB7 ")}),nameErr:M.computed(()=>(O.value||n.name.value)&&T.value.errors.name||""),cssErr:M.computed(()=>T.value.errors.css||""),scopeHint:M.computed(()=>`[data-block="${Ue(n.name.value)}"]`),noSamples:M.computed(()=>U.value.length===0),noSamplesText:"No {{placeholders}} in the template yet.",modeCls:M.computed(()=>`bex-body is-${h.value}`),cannotSave:M.computed(()=>x.value||O.value&&Object.keys(T.value.errors).length>0)},H=s.querySelector("#block-project");for(const e of Array.isArray(V)?V:[]){const t=document.createElement("option");t.value=e.slug,t.textContent=e.name||e.slug,H.appendChild(t)}if(u.project&&![...H.options].some(e=>e.value===u.project)){const e=document.createElement("option");e.value=u.project,e.textContent=`${u.project} (no longer a project)`,H.appendChild(e)}const $=s.querySelector("#block-quick-switch");for(const e of ee){const t=document.createElement("option");t.value=e,t.textContent=e,e===a&&(t.selected=!0),$.appendChild(t)}const m=s.querySelector(".bex-samples");m.innerHTML=_e;let k=null,j=null,o=null;function se(e){for(const[t,v]of Object.entries(e))n[t]&&(n[t].value=v);k.setValue(String(e.content??"")),j.setValue(String(e.css??""))}const re=s.querySelector("#block-preview-output");let Y=0;r(M.effect(()=>{const e={content:n.content.value,css:n.css.value,name:n.name.value};K.value,h.value!=="write"&&(cancelAnimationFrame(Y),Y=requestAnimationFrame(()=>{P()&&(re.innerHTML=Ke(e,y),I.scan(re))}))})),r(()=>cancelAnimationFrame(Y));const ce=e=>{const t=e.target?.dataset?.sample;t&&(y[t]=e.target.value,K.value++)};m.addEventListener("input",ce),r(()=>m.removeEventListener("input",ce));function W(e){o.focus(),o.setRangeText(e,o.selectionStart,o.selectionEnd,"end"),o.dispatchEvent(new Event("input",{bubbles:!0}))}async function le(e){switch(e){case"undo":o.focus(),document.execCommand("undo");break;case"redo":o.focus(),document.execCommand("redo");break;case"cut":o.selectionStart!==o.selectionEnd&&(await N(o.value.slice(o.selectionStart,o.selectionEnd)),W(""));break;case"copy":o.selectionStart!==o.selectionEnd&&await N(o.value.slice(o.selectionStart,o.selectionEnd));break;case"paste":try{W(await navigator.clipboard.readText())}catch{E.toast("Use Ctrl+V to paste.",{type:"info"})}break;case"select-all":o.focus(),o.select();break;case"format":{const t=Ve(o.value);k.setValue(t),n.content.value=t;break}default:break}}async function _(){if(x.peek())return;O.value=!0;const{errors:e,name:t}=T.peek();if(Object.keys(e).length){E.toast(e.name||e.css,{type:"warning"});return}const v=l?t:a;x.value=!0;try{const d=Be(B(),te);if(await q.blocks.put(v,d),!P())return;te=d.meta,w.value=G(B());try{S.remove?S.remove(g(a)):S.set(g(a),null)}catch{}Ie("#/blocks"),E.toast(l?`Created "${v}".`:"Block saved.",{type:"success"}),l&&(location.hash=`#/blocks/edit/${encodeURIComponent(v)}`)}catch(d){E.toast(`Not saved: ${d.message||d}`,{type:"error"})}finally{x.value=!1}}async function $e(){C.peek()&&await E.confirm("Discard the changes you have not saved?")&&(O.value=!1,se(je(w.peek())))}function je(e){try{const[t,v,d,Re,Te]=JSON.parse(e);return{name:t,project:v,bundled:d,content:Re,css:Te}}catch{return u}}const Le=M.applyBindings(Me,s,{methods:{save:()=>_(),discard:()=>$e(),setWrite:()=>{h.value="write"},setSplit:()=>{h.value="split"},setPreview:()=>{h.value="preview"},act:e=>le(e)}});r(()=>Le.dispose()),r(qe(s,{position:"bottom"})),k=ye(s.querySelector(".bex-write"),{initialValue:u.content,language:"html",autoIndent:!0,onChange:e=>{n.content.value=e},onCursor:({line:e,col:t})=>{ne.value=`Ln ${e}, Col ${t}`}}),j=ye(s.querySelector(".bex-css"),{initialValue:u.css,language:"css",autoIndent:!0,onChange:e=>{n.css.value=e}}),k.textarea.setAttribute("aria-label","Template HTML"),k.textarea.placeholder=`<div class="card mb-3">
6
+ </div>`;let f=null,Ue=!1;function St(){Ue||!window.R?.use||(Ue=!0,R.use((u,p,s)=>{if(!(ht.test(p?.path||"")&&J(u?.path)!==J(p?.path))||!f?.dirty())return s();const c=f;return E.confirm(`You have unsaved changes to ${Ne(c.label())}. Leave anyway? They are kept as a draft for your next visit.`).then(B=>{B?s():history.replaceState(null,"",c.hash)})}),M.subscribe("router:afterChange",({to:u}={})=>{if(f&&J(u?.path)!==f.path){const p=f;f=null,p.dispose()}}))}function Et(u,p){const s=u.querySelector(".dm-plugin-banner-name"),g=s?.lastChild;g&&g.nodeType===3&&s.querySelector(".dm-plugin-banner-sep")&&(g.textContent=p)}function G(u){return navigator.clipboard?.writeText(u).then(()=>!0,()=>!1)??Promise.resolve(!1)}export const blockEditorView={templateUrl:"/admin/js/templates/block-editor.html",async onMount(u){if(St(),f){const e=f;f=null,e.dispose()}const p=u.get(0),s=p.querySelector(".bex")||p,g=[],c=e=>(g.push(e),e);let B=!1;const C=()=>!B&&s.isConnected,ve=location.hash.match(/^#\/blocks\/edit\/([^/?#]+)/),l=ve?decodeURIComponent(ve[1]):null,d=!l,Ye=location.hash,ze=J(location.hash.slice(1)),Je=d&&new URLSearchParams(location.hash.split("?")[1]||"").get("project")||"",fe=E.loader(p,{type:"dots"});let y=null,Q=[],X=[];try{[y,Q,X]=await Promise.all([l?$.blocks.get(l):Promise.resolve(null),$.blocks.list().catch(()=>[]),$.projects.list().catch(()=>[])])}catch(e){fe.destroy(),E.toast(e.message||"Block not found.",{type:"error"}),R.navigate("/blocks");return}if(fe.destroy(),!s.isConnected)return;const he=(Array.isArray(Q)?Q:[]).map(e=>e.name).sort((e,t)=>e.localeCompare(t));let be=y?.meta||{};const v=lt(y?{...y,name:l}:null,{project:Je}),a={};for(const[e,t]of Object.entries(v))a[e]=M.observable(t);const Z=()=>Object.fromEntries(Object.keys(a).map(e=>[e,a[e].peek()])),ye=()=>Object.fromEntries(Object.keys(a).map(e=>[e,a[e].value])),O=M.observable(de(v)),D=M.computed(()=>de(ye())!==O.value),q=M.observable(!1),V=M.observable(!1),K=M.computed(()=>st(ye(),{isNew:d,taken:he}));let ke="split";try{ke=bt.includes(S.get(pe))?S.get(pe):"split"}catch{}const k=M.observable(ke);c(M.effect(()=>{const e=k.value;try{S.set(pe,e)}catch{}}));const we=M.observable("Ln 1, Col 1");let L={};try{L=S.get(Be)||{}}catch{}const ee=M.observable(Ve.includes(L.width)?L.width:"full"),U=M.observable(String(L.repeat)==="3"?"3":"1"),m=M.observable(typeof L.theme=="string"?L.theme:""),x=M.observable("");c(M.effect(()=>{const e={width:ee.value,repeat:U.value,theme:m.value};try{S.set(Be,e)}catch{}}));const h={},P={},Y=M.observable(0),te=M.observable([]),ge=()=>We(a.content.peek());c(M.effect(()=>{const e=ct(a.content.value),t=We(a.content.value);let n=!1;for(const o of e){const w=t.has(o);if(!(o in h)||o in P&&P[o]!==w){const H=o in h;if(h[o]=_e(o,new Date,{raw:w}),P[o]=w,H){n=!0;const i=s.querySelector(`.bex-samples [data-sample="${CSS.escape(o)}"]`);i&&(i.value=h[o])}}}te.value=e.map(o=>({key:o,label:t.has(o)?`{{{${o}}}}`:`{{${o}}}`,value:h[o]})),n&&queueMicrotask(()=>Y.value++)}));const Ge={...a,dirty:D,saving:q,mode:k,cursor:we,sampleRows:te,isNew:d,notNew:!d,pvWidth:ee,pvRepeat:U,pvTheme:m,pvStatus:x,titleText:d?"New block":l,metaText:M.computed(()=>{if(d)return"Not saved yet";const e=[];return(y?.updatedAt||y?.meta?.updatedAt)&&e.push(`changed ${He(y.updatedAt||y.meta.updatedAt)}`),e.push(`${a.content.value.split(`
7
+ `).length} lines`),a.css.value.trim()&&e.push(`${Math.ceil(a.css.value.length/1024)} KB CSS`),e.join(" \xB7 ")}),nameErr:M.computed(()=>(V.value||a.name.value)&&K.value.errors.name||""),cssErr:M.computed(()=>K.value.errors.css||""),scopeHint:M.computed(()=>`[data-block="${vt(a.name.value)}"]`),noSamples:M.computed(()=>te.value.length===0),noSamplesText:"No {{placeholders}} in the template yet.",modeCls:M.computed(()=>`bex-body is-${k.value}`),cannotSave:M.computed(()=>q.value||V.value&&Object.keys(K.value.errors).length>0)},oe=s.querySelector("#block-project");for(const e of Array.isArray(X)?X:[]){const t=document.createElement("option");t.value=e.slug,t.textContent=e.name||e.slug,oe.appendChild(t)}if(v.project&&![...oe.options].some(e=>e.value===v.project)){const e=document.createElement("option");e.value=v.project,e.textContent=`${v.project} (no longer a project)`,oe.appendChild(e)}const F=s.querySelector("#block-quick-switch");for(const e of he){const t=document.createElement("option");t.value=e,t.textContent=e,e===l&&(t.selected=!0),F.appendChild(t)}const b=s.querySelector(".bex-samples");b.innerHTML=gt;let A=null,N=null,r=null;function Se(e){for(const[t,n]of Object.entries(e))a[t]&&(a[t].value=n);A.setValue(String(e.content??"")),N.setValue(String(e.css??""))}const ae=s.querySelector("#block-preview-frame");let T="none",W=0;const Qe="As your site shows it \xB7 not saved",Ee=()=>{if(!C()||k.peek()==="write"||T!=="ready")return;const e={content:a.content.peek(),css:a.css.peek(),name:a.name.peek()},t=wt();if(!t){x.value="The preview needs the HTML cleaner, which did not load - reload the admin.";return}const n=mt(e,h,{repeat:Number(U.peek()),sanitize:t});try{ae.contentWindow?.postMessage({source:"dm-block-editor",type:"paint",tick:W,html:n},"*")}catch{}},Me=e=>{const t=dt(e,ae.contentWindow,W);if(!(!t||!C())){if(t.type==="save"){z();return}if(T=t.host?"ready":"failed",T==="failed"){x.value="Your site's page came back without a place for the block - the preview cannot show it.";return}x.peek()==="Loading your site\u2026"&&(x.value=Qe),Ee()}};window.addEventListener("message",Me),c(()=>window.removeEventListener("message",Me));async function Ce(){const e=++W;T="loading",x.value="Loading your site\u2026";let t;try{const n=m.peek()?{...Ke,theme:m.peek()}:Ke;({html:t}=await $.pages.previewFull(yt,n,`<div id="${me}"></div>`))}catch(n){t=`<!doctype html><html><head><meta charset="utf-8"></head><body style="font:14px system-ui;margin:0"><div id="${me}" style="padding:1rem"></div></body></html>`,x.value=`Without your site's styles - ${n?.message||"the page did not render"}`}!C()||e!==W||(ae.srcdoc=pt(t,e,me))}let ne=0;c(M.effect(()=>{if(a.content.value,a.css.value,a.name.value,Y.value,U.value,k.value!=="write"){if(T==="none"){Ce();return}cancelAnimationFrame(ne),ne=requestAnimationFrame(Ee)}}));let xe=m.peek();c(M.effect(()=>{const e=m.value;e!==xe&&(xe=e,T!=="none"&&Ce())})),c(()=>{cancelAnimationFrame(ne),W++}),$.theme.catalog().then(({themes:e=[],custom:t=[]}={})=>{if(!C())return;const n=s.querySelector("#block-preview-theme"),o=i=>String(i).replace(/-/g," ").replace(/\b\w/g,le=>le.toUpperCase()),w=[...e.filter(i=>!String(i).startsWith("admin-")).map(i=>({id:i,label:o(i)})),...(Array.isArray(t)?t:[]).filter(i=>i?.id).map(i=>({id:i.id,label:i.label||o(i.id)}))],H=w.map(i=>i.id);for(const{id:i,label:le}of w){const ie=document.createElement("option");ie.value=i,ie.textContent=le,n.appendChild(ie)}m.peek()&&!H.includes(m.peek())?m.value="":n.value=m.peek()}).catch(()=>{s.querySelector("#block-preview-theme")?.remove(),C()&&m.peek()&&(m.value="")});const Ae=e=>{const t=e.target?.dataset?.sample;t&&(h[t]=e.target.value,delete P[t],Y.value++)};b.addEventListener("input",Ae),c(()=>b.removeEventListener("input",Ae));function se(e){r.focus(),r.setRangeText(e,r.selectionStart,r.selectionEnd,"end"),r.dispatchEvent(new Event("input",{bubbles:!0}))}async function Le(e){switch(e){case"undo":r.focus(),document.execCommand("undo");break;case"redo":r.focus(),document.execCommand("redo");break;case"cut":r.selectionStart!==r.selectionEnd&&(await G(r.value.slice(r.selectionStart,r.selectionEnd)),se(""));break;case"copy":r.selectionStart!==r.selectionEnd&&await G(r.value.slice(r.selectionStart,r.selectionEnd));break;case"paste":try{se(await navigator.clipboard.readText())}catch{E.toast("Use Ctrl+V to paste.",{type:"info"})}break;case"select-all":r.focus(),r.select();break;case"format":{const t=it(r.value);A.setValue(t),a.content.value=t;break}default:break}}async function z(){if(q.peek())return;V.value=!0;const{errors:e,name:t}=K.peek();if(Object.keys(e).length){E.toast(e.name||e.css,{type:"warning"});return}const n=d?t:l;q.value=!0;try{const o=ut(Z(),be);if(await $.blocks.put(n,o),!C())return;be=o.meta,O.value=de(Z());try{S.remove?S.remove(j(l)):S.set(j(l),null)}catch{}nt("#/blocks"),E.toast(d?`Created "${n}".`:"Block saved.",{type:"success"}),d&&(location.hash=`#/blocks/edit/${encodeURIComponent(n)}`)}catch(o){E.toast(`Not saved: ${o.message||o}`,{type:"error"})}finally{q.value=!1}}async function Xe(){D.peek()&&await E.confirm("Discard the changes you have not saved?")&&(V.value=!1,Se(Ze(O.peek())))}function Ze(e){try{const[t,n,o,w,H]=JSON.parse(e);return{name:t,project:n,bundled:o,content:w,css:H}}catch{return v}}const et=M.applyBindings(Ge,s,{methods:{save:()=>z(),discard:()=>Xe(),setWrite:()=>{k.value="write"},setSplit:()=>{k.value="split"},setPreview:()=>{k.value="preview"},setWidth:e=>{Ve.includes(String(e))&&(ee.value=String(e))},act:e=>Le(e)}});c(()=>et.dispose()),c(at(s,{position:"bottom"})),A=Ie(s.querySelector(".bex-write"),{initialValue:v.content,language:"html",autoIndent:!0,onChange:e=>{a.content.value=e},onCursor:({line:e,col:t})=>{we.value=`Ln ${e}, Col ${t}`}}),N=Ie(s.querySelector(".bex-css"),{initialValue:v.css,language:"css",autoIndent:!0,onChange:e=>{a.css.value=e}}),A.textarea.setAttribute("aria-label","Template HTML"),A.textarea.placeholder=`<div class="card mb-3">
8
8
  <div class="card-body">
9
9
  <h3>{{title}}</h3>
10
10
  <p>{{message}}</p>
11
11
  </div>
12
- </div>`,j.textarea.setAttribute("aria-label","Custom CSS"),j.textarea.placeholder=`/* Scoped to this block - e.g.
12
+ </div>`,N.textarea.setAttribute("aria-label","Custom CSS"),N.textarea.placeholder=`/* Scoped to this block - e.g.
13
13
  color: var(--dm-primary);
14
- h3 { font-size: 1.25rem; } */`,r(()=>{k.destroy(),j.destroy()}),o=k.textarea;const ie=s.querySelector(".bex-toolbar"),ue=e=>{const t=e.target.closest("[data-action]");t&&le(t.dataset.action)};ie.addEventListener("click",ue),r(()=>ie.removeEventListener("click",ue));const de=()=>{const e=$.value;e&&e!==a?location.hash=`#/blocks/edit/${encodeURIComponent(e)}`:$.value=a||""};$.addEventListener("change",de),r(()=>$.removeEventListener("change",de));const Ae=e=>[{header:`{{${e}}}`},{label:"Insert into the template",icon:"corner-down-right",action:()=>W(`{{${e}}}`)},{label:"Copy placeholder",icon:"copy",action:async()=>{E.toast(await N(`{{${e}}}`)?"Copied.":`{{${e}}}`,{type:"info"})}},{label:"Reset sample value",icon:"rotate-ccw",action:()=>{y[e]=Se(e);const t=m.querySelector(`[data-sample="${CSS.escape(e)}"]`);t&&(t.value=y[e]),K.value++}}],Oe=E.contextMenu(m,{cursor:"glyph",match:".bex-sample",inherit:!1,density:"compact",items:e=>Ae(e.dataset.key)});r(()=>Oe?.destroy?.());const pe=e=>{const t=e.target.closest(".bex-kebab");t&&he(t)},me=e=>{const t=e.target.closest(".bex-sample");t&&e.key==="F10"&&e.shiftKey&&(e.preventDefault(),he(t))};m.addEventListener("click",pe),m.addEventListener("keydown",me),r(()=>{m.removeEventListener("click",pe),m.removeEventListener("keydown",me)}),Je(i,l?"New block":a),J(c,{id:"block-editor-list",icon:"arrow-left",title:"All blocks",onClick:()=>{location.hash="#/blocks"}}),l?i.querySelector('[data-banner-action="block-editor-shortcode"]')?.remove():J(c,{id:"block-editor-shortcode",icon:"copy",title:"Copy shortcode",onClick:async()=>{const e=He(a);E.toast(await N(e)?"Shortcode copied - set the collection slug.":e,{type:"info",duration:5e3})}}),J(c,{id:"block-editor-save",icon:"save",title:"Save (Ctrl+S)",onClick:()=>_()});const ve=e=>{!(e.ctrlKey||e.metaKey)||e.key!=="s"||(e.preventDefault(),e.stopImmediatePropagation(),_())};document.addEventListener("keydown",ve,!0),r(()=>document.removeEventListener("keydown",ve,!0));const be=()=>{if(C.peek())try{S.set(g(a),{form:B(),base:w.peek(),at:new Date().toISOString()})}catch{}},fe=e=>{C.peek()&&(be(),e.preventDefault(),e.returnValue="")};window.addEventListener("beforeunload",fe),r(()=>window.removeEventListener("beforeunload",fe)),p={hash:Ee,path:Ce,dirty:()=>C.peek(),label:()=>l?"the new block":`"${a}"`,dispose(){A=!0,be(),f.splice(0).reverse().forEach(e=>{try{e()}catch{}})}},I.scan(s);let z=null;try{z=S.get(g(a))}catch{}const L=Ne(z,w.peek());if(z)try{S.remove?S.remove(g(a)):S.set(g(a),null)}catch{}if(L){const e=L.at?` (${ge(L.at)})`:"",t=l?"a new block":`"${ke(a)}"`,v=L.stale?`You left unsaved changes to ${t}${e}, but the block has been saved since. Restore your version anyway?`:`You left unsaved changes to ${t}${e}. Restore them?`;if(await E.confirm(v)&&P()){const d={...u,...L.form};l||(d.name=a),se(d)}}}};
14
+ h3 { font-size: 1.25rem; } */`,c(()=>{A.destroy(),N.destroy()}),r=A.textarea;const Te=s.querySelector(".bex-toolbar"),Re=e=>{const t=e.target.closest("[data-action]");t&&Le(t.dataset.action)};Te.addEventListener("click",Re),c(()=>Te.removeEventListener("click",Re));const $e=()=>{const e=F.value;e&&e!==l?location.hash=`#/blocks/edit/${encodeURIComponent(e)}`:F.value=l||""};F.addEventListener("change",$e),c(()=>F.removeEventListener("change",$e));const re=e=>ge().has(e)?`{{{${e}}}}`:`{{${e}}}`,tt=e=>[{header:re(e)},{label:"Insert into the template",icon:"corner-down-right",action:()=>se(re(e))},{label:"Copy placeholder",icon:"copy",action:async()=>{const t=re(e);E.toast(await G(t)?"Copied.":t,{type:"info"})}},{label:"Reset sample value",icon:"rotate-ccw",action:()=>{const t=ge().has(e);h[e]=_e(e,new Date,{raw:t}),P[e]=t;const n=b.querySelector(`[data-sample="${CSS.escape(e)}"]`);n&&(n.value=h[e]),Y.value++}}],ot=E.contextMenu(b,{cursor:"glyph",match:".bex-sample",inherit:!1,density:"compact",items:e=>tt(e.dataset.key)});c(()=>ot?.destroy?.());const je=e=>{const t=e.target.closest(".bex-kebab");t&&Fe(t)},Oe=e=>{const t=e.target.closest(".bex-sample");t&&e.key==="F10"&&e.shiftKey&&(e.preventDefault(),Fe(t))};b.addEventListener("click",je),b.addEventListener("keydown",Oe),c(()=>{b.removeEventListener("click",je),b.removeEventListener("keydown",Oe)}),Et(p,d?"New block":l),ue(u,{id:"block-editor-list",icon:"arrow-left",title:"All blocks",onClick:()=>{location.hash="#/blocks"}}),d?p.querySelector('[data-banner-action="block-editor-shortcode"]')?.remove():ue(u,{id:"block-editor-shortcode",icon:"copy",title:"Copy shortcode",onClick:async()=>{const e=ft(l);E.toast(await G(e)?"Shortcode copied - set the collection slug.":e,{type:"info",duration:5e3})}}),ue(u,{id:"block-editor-save",icon:"save",title:"Save (Ctrl+S)",onClick:()=>z()});const De=e=>{!(e.ctrlKey||e.metaKey)||e.key!=="s"||(e.preventDefault(),e.stopImmediatePropagation(),z())};document.addEventListener("keydown",De,!0),c(()=>document.removeEventListener("keydown",De,!0));const qe=()=>{if(D.peek())try{S.set(j(l),{form:Z(),base:O.peek(),at:new Date().toISOString()})}catch{}},Pe=e=>{D.peek()&&(qe(),e.preventDefault(),e.returnValue="")};window.addEventListener("beforeunload",Pe),c(()=>window.removeEventListener("beforeunload",Pe)),f={hash:Ye,path:ze,dirty:()=>D.peek(),label:()=>d?"the new block":`"${l}"`,dispose(){B=!0,qe(),g.splice(0).reverse().forEach(e=>{try{e()}catch{}})}},I.scan(s);let ce=null;try{ce=S.get(j(l))}catch{}const _=rt(ce,O.peek());if(ce)try{S.remove?S.remove(j(l)):S.set(j(l),null)}catch{}if(_){const e=_.at?` (${He(_.at)})`:"",t=d?"a new block":`"${Ne(l)}"`,n=_.stale?`You left unsaved changes to ${t}${e}, but the block has been saved since. Restore your version anyway?`:`You left unsaved changes to ${t}${e}. Restore them?`;if(await E.confirm(n)&&C()){const o={...v,..._.form};d||(o.name=l),Se(o)}}}};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "domma-cms",
3
- "version": "0.101.2",
3
+ "version": "0.101.4",
4
4
  "description": "File-based CMS powered by Domma and Fastify. Run npx domma-cms my-site to create a new project.",
5
5
  "type": "module",
6
6
  "main": "server/server.js",
@@ -1 +1 @@
1
- body,button,input,select,textarea{font-family:Roboto,sans-serif}.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}@media(min-width:993px){#site-navbar:not(.dm-nav-vertical) .navbar-container{display:grid;align-items:center;gap:var(--dm-space-4, 1rem)}#site-navbar:not(.dm-nav-vertical) .navbar-collapse{display:contents}#site-navbar:not(.dm-nav-vertical) .navbar-brand{grid-column:1;justify-self:start}#site-navbar:not(.dm-nav-vertical) .navbar-nav{grid-column:2;flex:0 1 auto;min-width:0}#site-navbar:not(.dm-nav-vertical) .navbar-actions{grid-column:3;justify-self:end;margin-left:0}#site-navbar.dm-nav-align-centre:not(.dm-nav-vertical) .navbar-container{grid-template-columns:minmax(max-content,1fr) auto minmax(max-content,1fr)}#site-navbar.dm-nav-align-centre:not(.dm-nav-vertical) .navbar-nav{justify-content:center}#site-navbar:is(.dm-nav-align-left,.dm-nav-align-right,.dm-nav-align-spread):not(.dm-nav-vertical) .navbar-container{grid-template-columns:auto minmax(0,1fr) auto}#site-navbar.dm-nav-align-left:not(.dm-nav-vertical) .navbar-nav{justify-content:flex-start}#site-navbar.dm-nav-align-right:not(.dm-nav-vertical) .navbar-nav{justify-content:flex-end}#site-navbar.dm-nav-align-spread:not(.dm-nav-vertical) .navbar-nav{justify-content:space-between;width:100%}}.navbar-actions{order:4;margin-left:auto;display:flex;align-items:center;gap:.5rem}#site-navbar.navbar-dark .navbar-actions,#site-navbar.navbar-light .navbar-actions{color:var(--dm-navbar-text)}#site-navbar.navbar-dark .site-search-shortcut-hint,#site-navbar.navbar-light .site-search-shortcut-hint{color:color-mix(in srgb,var(--dm-navbar-text) 65%,var(--dm-navbar-bg));border-color:color-mix(in srgb,var(--dm-navbar-text) 28%,transparent)}.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(--dm-border, 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(--dm-link, var(--dm-primary, #5b8cff))}.page-body a:hover{text-decoration:underline}.page-body code{font-family:Fira Code,Courier New,monospace;font-size:.9em;background:var(--dm-code-bg, rgba(255,255,255,.06));color:var(--dm-code-text, inherit);padding:.15em .35em;border-radius:3px}.page-body pre{background:var(--dm-code-bg, rgba(0,0,0,.3));color:var(--dm-code-text, inherit);border:1px solid var(--dm-code-border, 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(--dm-primary, #5b8cff);margin:1.5rem 0;padding:.75rem 1rem;background:color-mix(in srgb,var(--dm-primary, #5b8cff) 8%,transparent);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}.card-primary>.card-header,.card-primary>.card-footer{background-color:color-mix(in srgb,var(--dm-primary) 18%,var(--dm-surface));color:var(--dm-text);border-color:var(--dm-primary)}.card-primary>.card-header .card-title{color:var(--dm-text)}.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}#site-navbar .navbar-dropdown-toggle,#site-navbar .navbar-dropdown-item{font-size:var(--dm-font-size-base)}@media(min-width:993px){#site-navbar .navbar-dropdown-toggle,#site-navbar .navbar-dropdown-item{font-size:var(--dm-font-size-sm)}}@media(min-width:1201px){#site-navbar .navbar-dropdown-toggle,#site-navbar .navbar-dropdown-item{font-size:var(--dm-font-size-xs)}}#site-navbar .navbar-dropdown-item{transition:none}[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-link,[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-dropdown-toggle{transition:all .15s ease,color 0s,background-color 0s}[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-link:hover,[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-dropdown-toggle:hover,[data-mode=light] #site-navbar .navbar-dropdown-item:hover{background-color:var(--dm-hover-bg, rgba(128, 128, 128, .14))!important;color:var(--dm-text, #1f2937)!important;text-decoration:underline;text-underline-offset:3px}.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(--dm-border, 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(--dm-text-muted, #888);font-size:.875rem}.footer-links{display:flex;gap:1.25rem}.footer-links a{color:var(--dm-text-muted, #888);font-size:.875rem;text-decoration:none}.footer-links a:hover{color:var(--dm-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(--dm-text-muted, #888);transition:color .15s}.footer-social-link:hover{color:var(--dm-text, #eee)}.footer-social-link svg{width:1rem;height:1rem}.footer-motion-switch{font-size:.8rem;color:var(--dm-text-muted, #888);white-space:nowrap}.footer-motion-switch .form-switch-label{color:var(--dm-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(--dm-border, 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:auto;overscroll-behavior:contain;flex:1;min-height:0;scrollbar-width:thin;scrollbar-color:var(--dm-border) transparent}.dm-slideover-body::-webkit-scrollbar{width:8px;height:8px}.dm-slideover-body::-webkit-scrollbar-track{background:transparent}.dm-slideover-body::-webkit-scrollbar-thumb{background:var(--dm-border);border-radius:4px}.dm-slideover-body::-webkit-scrollbar-thumb:hover{background:var(--dm-text-muted)}@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-secondary);border-top:1px solid var(--dm-border)}.page-body .dm-card-gradient{background:var(--dm-card-bg, #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-secondary);border-top:1px solid var(--dm-border)}.page-body .dm-card-glass{background:color-mix(in srgb,var(--dm-surface) 62%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid color-mix(in srgb,var(--dm-border) 75%,transparent);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:color-mix(in srgb,var(--dm-surface) 78%,transparent)}.page-body .dm-card-glass .card-header{background:transparent;border-bottom:1px solid color-mix(in srgb,var(--dm-border) 60%,transparent);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-secondary);background:transparent}.page-body .dm-card-accent{background:var(--dm-surface);border:1px solid var(--dm-border);border-left:4px solid var(--dm-primary, #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:var(--dm-primary-hover, #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-secondary);border-top:1px solid var(--dm-border)}.page-body .dm-card-dark{--cms-link-color: color-mix(in srgb, var(--dm-primary) 40%, #fff);--cms-link-hover-color: color-mix(in srgb, var(--dm-primary) 20%, #fff);background:linear-gradient(160deg,color-mix(in srgb,var(--dm-primary) 8%,#1e293b),#0f172a);color:#cbd5e1;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{background:transparent;color:#f1f5f9;border-bottom:1px solid rgba(255,255,255,.08)}.page-body .dm-card-dark :is(h1,h2,h3,h4,h5,h6,strong,b){color:#f1f5f9}.page-body .dm-card-dark .card-title{color:#f1f5f9!important}.page-body .dm-card-dark .card-subtitle{color:#94a3b8}.page-body .dm-card-dark .card-body{color:#cbd5e1}.page-body .dm-card-dark :is(code,pre){background:#ffffff14;border-color:#ffffff1f;color:#f1f5f9}.page-body .dm-card-dark pre code{background:none}.page-body .dm-card-dark .card-footer{background:transparent;color:#94a3b8;border-top:1px solid rgba(255,255,255,.08)}.page-body .dm-card-glow{background:var(--dm-surface);border:1px solid color-mix(in srgb,var(--dm-primary, #6366f1) 45%,transparent);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:var(--dm-primary, #818cf8);box-shadow:0 0 0 4px color-mix(in srgb,var(--dm-primary, #6366f1) 14%,transparent),0 0 28px color-mix(in srgb,var(--dm-primary, #6366f1) 22%,transparent)}.page-body .dm-card-glow .card-header{color:var(--dm-primary);border-bottom:1px solid color-mix(in srgb,var(--dm-primary, #6366f1) 20%,transparent)}.page-body .dm-card-glow .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glow .card-footer{border-top:1px solid color-mix(in srgb,var(--dm-primary, #6366f1) 20%,transparent);color:var(--dm-text-secondary)}.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-xs{border-radius:2px}.page-body .card-rounded-sm{border-radius:4px}.page-body .dm-box-primary{--cms-box-tone: var(--dm-primary)}.page-body .dm-box-secondary{--cms-box-tone: var(--dm-secondary)}.page-body .dm-box-success{--cms-box-tone: var(--dm-success)}.page-body .dm-box-info{--cms-box-tone: var(--dm-info)}.page-body .dm-box-warning{--cms-box-tone: var(--dm-warning)}.page-body .dm-box-danger{--cms-box-tone: var(--dm-danger)}.page-body .dm-box-tone{--cms-link-color: color-mix(in srgb, var(--cms-box-tone) 40%, var(--dm-text));--cms-link-hover-color: var(--dm-text);background:color-mix(in srgb,var(--cms-box-tone) 12%,var(--dm-card-bg));border-color:color-mix(in srgb,var(--cms-box-tone) 45%,var(--dm-card-border));color:var(--dm-text)}.page-body .dm-box-tone>.card-body{color:var(--dm-text)}.page-body .dm-box-tone>.card-footer{background:color-mix(in srgb,var(--cms-box-tone) 20%,var(--dm-card-bg));border-top-color:color-mix(in srgb,var(--cms-box-tone) 35%,var(--dm-card-border));color:var(--dm-text)}.page-body .dm-box-custom{--cms-link-color: currentColor;--cms-link-hover-color: currentColor;background:var(--cms-box-bg);border-color:color-mix(in srgb,var(--cms-box-fg) 25%,var(--cms-box-bg));color:var(--cms-box-fg)}.page-body .dm-box-custom>:is(.card-body,.card-footer),.page-body .dm-box-custom :is(h1,h2,h3,h4,h5,h6,strong,b){color:var(--cms-box-fg)}.page-body .dm-box-custom>.card-footer{background:color-mix(in srgb,var(--cms-box-shade) 10%,var(--cms-box-bg));border-top-color:color-mix(in srgb,var(--cms-box-fg) 20%,var(--cms-box-bg))}.page-body .dm-box-custom a{text-decoration-color:currentColor!important}.page-body .dm-box-custom :is(code,pre){background:color-mix(in srgb,var(--cms-box-shade) 15%,var(--cms-box-bg));border-color:color-mix(in srgb,var(--cms-box-fg) 20%,var(--cms-box-bg));color:var(--cms-box-fg)}.page-body .dm-box-custom pre code{background:none}.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:color-mix(in srgb,var(--dm-text) 15%,transparent)}.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:color-mix(in srgb,var(--dm-text) 20%,transparent)}.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:color-mix(in srgb,var(--dm-text) 20%,transparent)}.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:var(--dm-success, #10b981)}.card-stat-delta.negative{color:var(--dm-danger, #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:var(--dm-success, #10b981)}.card-milestone-dot.pending{background:var(--dm-border, #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:color-mix(in srgb,var(--dm-primary, #6366f1) 12%,transparent);line-height:1;pointer-events:none}.card-step-badge{width:32px;height:32px;border-radius:50%;background:var(--dm-primary, #6366f1);color:var(--dm-primary-text, #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:var(--dm-danger, #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 var(--dm-primary, #6366f1)}.card-callout.warn{border-left-color:var(--dm-warning, #f59e0b)}.card-callout.success{border-left-color:var(--dm-success, #10b981)}.card-callout.error{border-left-color:var(--dm-danger, #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:color-mix(in srgb,var(--dm-primary, #6366f1) 18%,transparent);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:color-mix(in srgb,var(--dm-primary, #7c3aed) 15%,transparent);color:var(--dm-primary, #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:var(--dm-link, var(--dm-primary, #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:color-mix(in srgb,var(--dm-success, #10b981) 18%,transparent);color:var(--dm-success, #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:var(--dm-danger, #ef4444)}.card-compare-label.after{color:var(--dm-success, #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:var(--dm-danger, #ef4444);flex-shrink:0}.card-compare-check{color:var(--dm-success, #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:var(--dm-success, #10b981)}.card-pricing-cta{display:block;text-align:center;background:var(--dm-primary, #6366f1);color:var(--dm-primary-text, #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:var(--dm-primary, #6366f1);flex-shrink:0}.card-timeline-line{width:2px;background:var(--dm-border, #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:color-mix(in srgb,var(--dm-success, #10b981) 18%,transparent);color:var(--dm-success, #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:var(--dm-success, #10b981)}.card-fc-no{color:var(--dm-text-disabled, #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}body[class*=-light] .dm-breadcrumbs{background:#ffffff8c;border-color:#00000012;box-shadow:0 2px 10px #00000014}body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-item,body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-link{color:#0000008c}body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#000000e6}body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-current{color:#000000d9}body[class*=-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(--dm-border, 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(--dm-text-muted, #888);font-size:.9rem}.dm-collection-empty p{color:var(--dm-text-muted, #888);font-style:italic}.hero-gradient-purple,.hero-gradient-blue,.hero-gradient-green,.hero-gradient-sunset,.hero-gradient-ocean,.hero-gradient-rose,.hero-gradient-forest{background:linear-gradient(135deg,color-mix(in srgb,var(--hero-hue) 22%,var(--dm-background)),color-mix(in srgb,var(--hero-hue) 10%,var(--dm-background)));color:var(--dm-text)}.hero-gradient-purple{--hero-hue: #8b5cf6}.hero-gradient-blue{--hero-hue: #3b82f6}.hero-gradient-green{--hero-hue: #10b981}.hero-gradient-sunset{--hero-hue: #f59e0b}.hero-gradient-ocean{--hero-hue: #0ea5e9}.hero-gradient-rose{--hero-hue: #ec4899}.hero-gradient-forest{--hero-hue: #16a34a}.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-md, 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 var(--dm-primary, #5c3d2e)}.mk-banner.type-success,[class*=banner-success],.mk-banner[data-type=success]{border-left:4px solid var(--dm-success, #22c55e)}.mk-banner.type-warning,[class*=banner-warning],.mk-banner[data-type=warning]{border-left:4px solid var(--dm-warning, #f59e0b)}.mk-stat-number{font-size:5rem;font-weight:900;line-height:1;letter-spacing:-.03em;color:var(--dm-primary, #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 var(--dm-border, 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}#site-navbar:not([data-menu-active]) .navbar-link.active:not([data-menu-item-active]){opacity:1!important;font-weight:700!important;position:relative}#site-navbar:not([data-menu-active]) .navbar-link.active:not([data-menu-item-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 var(--dm-border-light, 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:color-mix(in srgb,var(--dm-primary, #5c3d2e) 10%,transparent);color:var(--dm-primary, #5c3d2e);border:1px solid color-mix(in srgb,var(--dm-primary, #5c3d2e) 20%,transparent)}.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:var(--dm-text, #f1f5f9)!important}.card-subtitle{font-size:.8125rem!important;opacity:.7!important;margin-bottom:.5rem!important;font-weight:500!important;color:var(--dm-text, #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:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #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:var(--dm-text, #1e293b);line-height:1.4;flex:1 1 auto}.plugin-card{display:flex;flex-direction:column;background:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #475569)}.plugin-card-cover{position:relative;width:100%;height:150px;background-size:cover;background-position:center;background-color:var(--dm-background-alt, #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:var(--dm-card-bg, #fff);color:var(--dm-text, #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:var(--dm-text, #1e293b)!important;line-height:1.2!important;margin:0!important}.plugin-card-desc{font-size:.88rem!important;color:var(--dm-text-secondary, #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:var(--dm-text-secondary, #475569);margin-top:8px;transition:color .15s ease,gap .15s ease}.plugin-card:hover .plugin-card-cta{color:var(--dm-text, #1e293b);gap:8px}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not([data-menu-hover] a):not([data-menu-active] a){color:var(--cms-link-color, var(--dm-link, 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]):not([data-menu-hover] a):not([data-menu-active] a):hover{color:var(--cms-link-hover-color, var(--dm-link-hover, var(--dm-primary-hover, var(--dm-text, #3e2723))))!important;text-decoration-color:var(--cms-link-color, var(--dm-link, var(--dm-primary, currentColor)))}.page-body .dm-card-gradient .card-body a:not([class*=btn]){color:var(--dm-link, var(--dm-primary, var(--dm-text, #5d4037)))!important}.page-body .dm-card-gradient .card-body a:not([class*=btn]):hover{color:var(--dm-link-hover, 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):not([data-menu-hover] a):not([data-menu-active] a){color:var(--cms-link-color, var(--dm-link, 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):not([data-menu-hover] a):not([data-menu-active] a):hover{color:var(--cms-link-hover-color, var(--dm-link-hover, 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:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #475569)}.run-option-banner{position:relative;width:100%;height:180px;background-size:cover;background-position:center;background-color:var(--dm-background-alt, #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 var(--dm-card-bg, #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:var(--dm-text, #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:var(--dm-text-secondary, #475569)}.run-option-content p{margin:0 0 12px}.run-option-content .run-option-intro{font-size:.98rem;color:var(--dm-text, #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:var(--dm-text-muted, #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:var(--dm-text, #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 var(--dm-border, #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:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #475569)}.quickstart-step-number{position:absolute;top:8px;right:14px;font-size:5rem;font-weight:900;line-height:1;color:color-mix(in srgb,var(--dm-text) 8%,transparent);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:var(--dm-text, #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:var(--dm-text-secondary, #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-md, 6px);background:var(--dm-background, #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-text-muted, #6b7280);margin:0}.dm-cb-sort-select{padding:.45rem .6rem;border:1px solid var(--dm-border, #d1d5db);border-radius:var(--dm-radius-md, 6px);background:var(--dm-background, #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-md, 6px);background:var(--dm-background, #fff);cursor:pointer;font-weight:700}.dm-cb-sort-dir:hover{background:var(--dm-background-alt, #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-md, 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-text-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-md, 6px);background:var(--dm-background, #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-md, 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-md, 6px);cursor:pointer;font-size:.85rem}.dm-cb-filter-reset:hover{background:var(--dm-background-alt, #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-text-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-background, #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-background-alt, #f3f4f6)}.dm-cb-chip-active{background:var(--dm-primary, #2563eb);color:var(--dm-primary-text, #fff);border-color:var(--dm-primary, #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-primary, #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-primary, #2563eb);border:2px solid var(--dm-background, #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-primary, #2563eb);border:2px solid var(--dm-background, #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-background, #fff);border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius-md, 6px);box-shadow:0 8px 24px #0f172a1f;z-index:20}.dm-cb-saved-empty{margin:0 0 .5rem;font-size:.85rem;color:var(--dm-text-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-md, 6px);cursor:pointer;font-size:.88rem;color:var(--dm-text, #111827)}.dm-cb-saved-apply:hover{background:var(--dm-background-alt, #f3f4f6)}.dm-cb-saved-del{width:1.5rem;height:1.5rem;padding:0;background:transparent;border:0;color:var(--dm-text-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-text-muted, #6b7280)}.dm-cb-scroll-end{text-align:center;margin:1rem 0 0;font-size:.85rem;color:var(--dm-text-muted, #9ca3af);font-style:italic}.dm-cb-block-loading{text-align:center;padding:2rem 0;color:var(--dm-text-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-primary, #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-background, #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-md, 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-text-muted, #6b7280)}.dm-cb-transitions:empty{display:none}.dm-cb-transition-btn{padding:.35rem .7rem;font-size:.82rem}.dm-menu-sep,.footer-sep{list-style:none}.dm-menu-sep hr,.footer-sep hr{border:0;border-top:1px solid var(--dm-border, rgba(128, 128, 128, .35));margin:.4rem 0}.dm-menu-spacer{list-style:none;pointer-events:none;padding:0;margin:0;border:0}.dm-menu-spacer--xs{height:var(--dm-space-1, .25rem)}.dm-menu-spacer--sm{height:var(--dm-space-2, .5rem)}.dm-menu-spacer--md{height:var(--dm-space-4, 1rem)}.dm-menu-spacer--lg{height:var(--dm-space-6, 1.5rem)}.dm-menu-spacer--xl{height:var(--dm-space-10, 2.5rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--xs,.navbar-nav>.dm-menu-spacer--xs{height:auto;width:var(--dm-space-1, .25rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--sm,.navbar-nav>.dm-menu-spacer--sm{height:auto;width:var(--dm-space-2, .5rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--md,.navbar-nav>.dm-menu-spacer--md{height:auto;width:var(--dm-space-4, 1rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--lg,.navbar-nav>.dm-menu-spacer--lg{height:auto;width:var(--dm-space-6, 1.5rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--xl,.navbar-nav>.dm-menu-spacer--xl{height:auto;width:var(--dm-space-10, 2.5rem)}.dm-menu--has-flex-spacer>ul{display:flex;flex-direction:column}.dm-menu--has-flex-spacer.dm-menu--horizontal>ul{flex-direction:row;align-items:center}.dm-menu-spacer--flex{flex:1 1 auto;height:auto;width:auto}.dm-menu-floating .dm-menu-spacer--flex{min-height:var(--dm-space-4, 1rem)}@media(max-width:768px){.dm-menu--has-flex-spacer.dm-menu--horizontal>ul{flex-wrap:wrap}}#site-navbar .navbar-dropdown-divider{background:var(--dm-border, rgba(128, 128, 128, .5));opacity:.8}.dm-menu-badge{display:inline-block;margin-left:6px;padding:1px 7px;font-size:.7em;font-weight:700;line-height:1.4;border-radius:999px;background:var(--dm-text-muted);color:var(--dm-text-inverse, #fff);vertical-align:middle}.dm-nav-pill{border-radius:999px;padding:6px 14px;font-weight:600}.dm-nav-pill--outline{background:transparent!important;border:1px solid currentColor}@media(max-width:992px){#site-navbar .navbar-toggle{order:0;margin-right:var(--dm-space-2)}#site-navbar .navbar-brand{order:1}#site-navbar .navbar-collapse{position:fixed;top:0;left:0;bottom:0;width:86vw;max-width:340px;z-index:1100;margin:0;padding:var(--dm-space-3) 0 var(--dm-space-6);background:var(--dm-navbar-bg, var(--dm-surface));border-top:none;border-right:1px solid var(--dm-border);box-shadow:4px 0 18px #00000059;transform:translate(-100%);transition:transform .25s ease;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#site-navbar .navbar-collapse.show{transform:translate(0)}body.dm-drawer-open #site-navbar{z-index:1100}#site-navbar .navbar-nav{max-height:none;overflow:visible}#site-navbar .navbar-dropdown-toggle{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--dm-space-3) var(--dm-space-4);font-size:var(--dm-font-size-base)}#site-navbar .navbar-caret{margin-left:auto;flex:none;width:16px;height:16px;opacity:.9}#site-navbar .navbar-dropdown-menu{position:static;display:none;min-width:0;width:100%;margin:0;padding:0;border:0;border-radius:0;box-shadow:none;background:color-mix(in srgb,var(--dm-text) 8%,transparent)}#site-navbar .navbar-dropdown.open>.navbar-dropdown-menu{display:block}#site-navbar .navbar-dropdown-item{padding-left:calc(var(--dm-space-4) + var(--dm-space-5))}.dm-navbar-backdrop{position:fixed;inset:0;z-index:1090;background:#00000073;border:0;padding:0;cursor:pointer}body.dm-drawer-open{overflow:hidden}}.dm-embed{margin:1.5rem 0}.dm-embed-frame{overflow:hidden;border-radius:8px;background:#000}.dm-embed-caption{margin-top:.5rem;font-size:.85rem;color:var(--dm-text-muted, #6b7280);text-align:center}.dm-embed-blocked{margin:1.5rem 0;padding:.75rem 1rem;border:1px dashed var(--dm-border, #d1d5db);border-radius:8px;background:var(--dm-background-alt, #f9fafb);color:var(--dm-text-muted, #6b7280);font-size:.9rem}.dm-menu-missing{margin:1rem 0;padding:.6rem .9rem;border:1px dashed var(--dm-border, #d1d5db);border-radius:8px;background:var(--dm-background-alt, #f9fafb);color:var(--dm-text-muted, #6b7280);font-size:.9rem}.dm-embed-blocked code{font-family:var(--dm-font-mono, monospace);font-size:.85em}.dm-menu-floating{overflow:auto;overscroll-behavior:contain;background:var(--dm-surface);color:var(--dm-text);border:1px solid var(--dm-border);border-radius:var(--dm-radius-md, 8px);box-shadow:var(--dm-shadow-lg);scrollbar-width:thin;scrollbar-color:var(--dm-border) transparent}.dm-menu-floating[style*=--dm-menu-accent]{border-left:3px solid var(--dm-menu-accent)}.dm-menu-floating[data-float-anchor=TR][style*=--dm-menu-accent],.dm-menu-floating[data-float-anchor=BR][style*=--dm-menu-accent],.dm-menu-floating[data-float-anchor=R][style*=--dm-menu-accent]{border-left:1px solid var(--dm-menu-accent);border-right:3px solid var(--dm-menu-accent)}.dm-menu-floating[style*=--dm-menu-panel-opacity]{background:color-mix(in srgb,var(--dm-surface) calc(var(--dm-menu-panel-opacity) * 100%),transparent);backdrop-filter:blur(8px)}.dm-menu-float-bar{position:sticky;top:0;z-index:1;display:flex;align-items:center;gap:var(--dm-space-2, .5rem);padding:var(--dm-space-2, .5rem) var(--dm-space-3, .75rem);background:inherit;border-bottom:1px solid var(--dm-border);border-radius:inherit;border-bottom-left-radius:0;border-bottom-right-radius:0}.dm-menu-float-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.8rem;font-weight:600;letter-spacing:.02em;color:var(--dm-text-muted, #6b7280)}.dm-menu-float-grip{flex:0 0 auto;width:10px;height:16px;background-image:radial-gradient(currentColor 1px,transparent 1px);background-size:5px 5px;background-position:0 2px;color:var(--dm-text-muted, #6b7280);opacity:.6}.dm-menu-floating[data-float-movable] .dm-menu-float-bar{cursor:grab}.dm-menu-floating.is-dragging,.dm-menu-floating.is-dragging .dm-menu-float-bar{cursor:grabbing}.dm-menu-floating.is-dragging{user-select:none}.dm-menu-floating[data-float-movable] .dm-menu-float-bar{touch-action:none}.dm-menu-float-toggle{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dm-radius-sm, 4px);background:transparent;color:var(--dm-text);cursor:pointer}.dm-menu-float-toggle:hover{background:var(--dm-hover-bg, rgba(128, 128, 128, .14))}.dm-menu-float-toggle:focus-visible{outline:2px solid var(--dm-primary);outline-offset:1px}.dm-menu-float-icon{position:relative;width:16px;height:2px;background:currentColor;border-radius:1px}.dm-menu-float-icon:before,.dm-menu-float-icon:after{content:"";position:absolute;left:0;width:100%;height:2px;background:currentColor;border-radius:1px}.dm-menu-float-icon:before{top:-5px}.dm-menu-float-icon:after{top:5px}.dm-menu-floating.is-collapsed{width:auto!important;max-height:none!important;overflow:visible;padding:0;background:transparent;border:0;box-shadow:none;backdrop-filter:none;resize:none;min-width:0;min-height:0}.dm-menu-floating.is-collapsed>*:not(.dm-menu-float-bar),.dm-menu-floating.is-collapsed .dm-menu-float-grip,.dm-menu-floating.is-collapsed .dm-menu-float-title{display:none}#site-navbar.dm-menu-floating.is-collapsed>*:not(.dm-menu-float-bar){display:none}#site-navbar.dm-menu-floating.is-collapsed{width:auto!important;max-height:none!important;padding:0;background:transparent;border:0;box-shadow:none;backdrop-filter:none}.dm-menu-floating.is-collapsed .dm-menu-float-bar{padding:0;border:0;background:transparent;cursor:default}.dm-menu-floating.is-collapsed .dm-menu-float-toggle{width:44px;height:44px;border-radius:50%;background:var(--dm-surface);border:1px solid var(--dm-menu-accent, var(--dm-border));box-shadow:var(--dm-shadow-lg)}.navbar-transparent,.dm-menu--variant-transparent,.dm-menu-floating.navbar-transparent,.dm-menu-floating.dm-menu--variant-transparent{background:transparent;border-color:transparent;box-shadow:none;backdrop-filter:none}.navbar-transparent.is-collapsed .dm-menu-float-toggle,.dm-menu--variant-transparent.is-collapsed .dm-menu-float-toggle{background:var(--dm-surface)}.navbar-transparent .dm-menu-float-bar,.dm-menu--variant-transparent .dm-menu-float-bar{border-bottom-color:transparent}.dm-menu-floating[data-float-resizable]:not(.is-collapsed){resize:both;min-width:120px;min-height:48px}@media(max-width:768px){.dm-menu-floating{position:static!important;inset:auto!important;width:auto!important;max-height:none!important;transform:none!important;resize:none!important}.dm-menu-floating[data-float-movable] .dm-menu-float-bar{cursor:default}.dm-menu-floating[data-float-movable] .dm-menu-float-grip{display:none}}.dm-menu--vertical ul,.dm-menu--horizontal ul{list-style:none;margin:0;padding:0}.dm-menu--vertical>ul{display:flex;flex-direction:column;gap:2px}.dm-menu--vertical>ul>li>a{display:block;padding:.4rem .75rem;border-radius:var(--dm-radius-md, 6px);text-decoration:none}.dm-menu--vertical>ul>li>a:hover{background:color-mix(in srgb,var(--dm-text) 8%,transparent)}.dm-menu--vertical ul ul{margin-left:.75rem;border-left:1px solid var(--dm-border, rgba(128, 128, 128, .35));padding-left:.4rem}.dm-menu--horizontal>ul{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem 1rem}.dm-menu--horizontal>ul>li{position:relative}.dm-menu--horizontal>ul>li>a{display:inline-block;padding:.35rem .5rem;text-decoration:none}.dm-menu--horizontal.dm-menu--align-left>ul{justify-content:flex-start}.dm-menu--horizontal.dm-menu--align-centre>ul{justify-content:center}.dm-menu--horizontal.dm-menu--align-right>ul{justify-content:flex-end}.dm-menu--horizontal.dm-menu--align-spread>ul{justify-content:space-between}.dm-menu--horizontal>ul>li>ul{position:absolute;top:100%;left:0;z-index:40;display:none;min-width:180px;padding:.35rem 0;background:var(--dm-surface);border:1px solid var(--dm-border);border-radius:var(--dm-radius-md, 8px);box-shadow:var(--dm-shadow-lg)}.dm-menu--horizontal>ul>li:hover>ul,.dm-menu--horizontal>ul>li:focus-within>ul{display:block}.dm-menu--horizontal>ul>li>ul a{display:block;padding:.35rem .9rem;text-decoration:none}@media(max-width:768px){.dm-menu--horizontal>ul{flex-direction:column;align-items:stretch}.dm-menu--horizontal>ul>li>ul{position:static;display:block;border:0;box-shadow:none;padding-left:.75rem}}:root{--dm-vnav-width: 240px}@media(min-width:993px){#site-navbar.dm-nav-vertical:not(.dm-menu-floating){position:fixed;top:0;bottom:0;height:100vh;height:100dvh;width:var(--dm-vnav-width);flex-direction:column;flex-wrap:nowrap;align-items:stretch;justify-content:flex-start;gap:var(--dm-space-2);padding:var(--dm-space-4) var(--dm-space-3);overflow-y:auto;overscroll-behavior:contain;border-bottom:none;z-index:100}#site-navbar.dm-nav-vertical-left:not(.dm-menu-floating){left:0;right:auto;border-right:1px solid var(--dm-border)}#site-navbar.dm-nav-vertical-right:not(.dm-menu-floating){right:0;left:auto;border-left:1px solid var(--dm-border)}body.dm-vnav-left{padding-left:var(--dm-vnav-width)}body.dm-vnav-right{padding-right:var(--dm-vnav-width)}#site-navbar.dm-nav-vertical .navbar-container{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:var(--dm-space-2);width:100%;min-height:100%;padding:0;margin:0}#site-navbar.dm-nav-vertical .navbar-toggle{display:none!important}#site-navbar.dm-nav-vertical .navbar-brand{padding:0 var(--dm-space-2) var(--dm-space-3);margin:0;width:100%}#site-navbar.dm-nav-vertical .navbar-collapse{display:flex!important;flex-direction:column!important;align-items:stretch!important;width:100%!important;flex-grow:1!important;padding:0!important;border:none!important}#site-navbar.dm-nav-vertical .navbar-nav{display:flex!important;flex-direction:column!important;align-items:stretch!important;justify-content:flex-start!important;gap:2px!important;width:100%!important;flex:none!important;margin:0!important;padding:0!important}#site-navbar.dm-nav-vertical .navbar-nav li,#site-navbar.dm-nav-vertical .navbar-nav .navbar-item{width:100%!important;display:block!important}#site-navbar.dm-nav-vertical .navbar-link,#site-navbar.dm-nav-vertical .navbar-dropdown-toggle{display:flex!important;align-items:center!important;justify-content:flex-start!important;gap:var(--dm-space-2)!important;width:100%!important;padding:var(--dm-space-2) var(--dm-space-3)!important;font-size:var(--dm-font-size-sm)!important;text-align:left!important;border-radius:var(--dm-radius-md)!important;white-space:normal!important}#site-navbar.dm-nav-vertical .navbar-link:hover,#site-navbar.dm-nav-vertical .navbar-dropdown-toggle:hover{background-color:color-mix(in srgb,var(--dm-text) 8%,transparent)}#site-navbar.dm-nav-vertical .navbar-dropdown-toggle .navbar-caret{margin-left:auto}#site-navbar.dm-nav-vertical .navbar-dropdown{position:static!important;width:100%!important}#site-navbar.dm-nav-vertical .navbar-dropdown-menu{position:static!important;display:none;width:100%!important;min-width:0!important;margin:0!important;padding:0!important;border:0!important;border-radius:0!important;box-shadow:none!important;background:color-mix(in srgb,var(--dm-text) 8%,transparent)!important}#site-navbar.dm-nav-vertical .navbar-dropdown.open>.navbar-dropdown-menu{display:block!important}#site-navbar.dm-nav-vertical .navbar-dropdown-item{display:block!important;width:100%!important;padding:var(--dm-space-2) var(--dm-space-3) var(--dm-space-2) calc(var(--dm-space-3) + var(--dm-space-5))!important}#site-navbar.dm-nav-vertical .navbar-actions{display:flex;flex-direction:column;align-items:stretch;margin-left:0;margin-top:auto;padding-top:var(--dm-space-3)}}@media print{body.dm-ctx-printing *{visibility:hidden}body.dm-ctx-printing [data-dm-print],body.dm-ctx-printing [data-dm-print] *{visibility:visible}body.dm-ctx-printing [data-dm-print]{position:absolute;left:0;top:0;width:100%}body.dm-ctx-printing [data-dm-print] .accordion-content{display:block!important;height:auto!important}body.dm-ctx-printing .dm-ctx-hidden{display:none!important}}
1
+ body,button,input,select,textarea{font-family:Roboto,sans-serif}.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}@media(min-width:993px){#site-navbar:not(.dm-nav-vertical) .navbar-container{display:grid;align-items:center;gap:var(--dm-space-4, 1rem)}#site-navbar:not(.dm-nav-vertical) .navbar-collapse{display:contents}#site-navbar:not(.dm-nav-vertical) .navbar-brand{grid-column:1;justify-self:start}#site-navbar:not(.dm-nav-vertical) .navbar-nav{grid-column:2;flex:0 1 auto;min-width:0}#site-navbar:not(.dm-nav-vertical) .navbar-actions{grid-column:3;justify-self:end;margin-left:0}#site-navbar.dm-nav-align-centre:not(.dm-nav-vertical) .navbar-container{grid-template-columns:minmax(max-content,1fr) auto minmax(max-content,1fr)}#site-navbar.dm-nav-align-centre:not(.dm-nav-vertical) .navbar-nav{justify-content:center}#site-navbar:is(.dm-nav-align-left,.dm-nav-align-right,.dm-nav-align-spread):not(.dm-nav-vertical) .navbar-container{grid-template-columns:auto minmax(0,1fr) auto}#site-navbar.dm-nav-align-left:not(.dm-nav-vertical) .navbar-nav{justify-content:flex-start}#site-navbar.dm-nav-align-right:not(.dm-nav-vertical) .navbar-nav{justify-content:flex-end}#site-navbar.dm-nav-align-spread:not(.dm-nav-vertical) .navbar-nav{justify-content:space-between;width:100%}}.navbar-actions{order:4;margin-left:auto;display:flex;align-items:center;gap:.5rem}#site-navbar.navbar-dark .navbar-actions,#site-navbar.navbar-light .navbar-actions{color:var(--dm-navbar-text)}#site-navbar.navbar-dark .site-search-shortcut-hint,#site-navbar.navbar-light .site-search-shortcut-hint{color:color-mix(in srgb,var(--dm-navbar-text) 65%,var(--dm-navbar-bg));border-color:color-mix(in srgb,var(--dm-navbar-text) 28%,transparent)}.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(--dm-border, 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(--dm-link, var(--dm-primary, #5b8cff))}.page-body a:hover{text-decoration:underline}.page-body code{font-family:Fira Code,Courier New,monospace;font-size:.9em;background:var(--dm-code-bg, rgba(255,255,255,.06));color:var(--dm-code-text, inherit);padding:.15em .35em;border-radius:3px}.page-body pre{background:var(--dm-code-bg, rgba(0,0,0,.3));color:var(--dm-code-text, inherit);border:1px solid var(--dm-code-border, 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(--dm-primary, #5b8cff);margin:1.5rem 0;padding:.75rem 1rem;background:color-mix(in srgb,var(--dm-primary, #5b8cff) 8%,transparent);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}.card-primary>.card-header,.card-primary>.card-footer{background-color:color-mix(in srgb,var(--dm-primary) 18%,var(--dm-surface));color:var(--dm-text);border-color:var(--dm-primary)}.card-primary>.card-header .card-title{color:var(--dm-text)}.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}#site-navbar .navbar-dropdown-toggle,#site-navbar .navbar-dropdown-item{font-size:var(--dm-font-size-base)}@media(min-width:993px){#site-navbar .navbar-dropdown-toggle,#site-navbar .navbar-dropdown-item{font-size:var(--dm-font-size-sm)}}@media(min-width:1201px){#site-navbar .navbar-dropdown-toggle,#site-navbar .navbar-dropdown-item{font-size:var(--dm-font-size-xs)}}#site-navbar .navbar-dropdown-item{transition:none}[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-link,[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-dropdown-toggle{transition:all .15s ease,color 0s,background-color 0s}[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-link:hover,[data-mode=light] #site-navbar.navbar:not(.navbar-light):not(.navbar-dark) .navbar-dropdown-toggle:hover,[data-mode=light] #site-navbar .navbar-dropdown-item:hover{background-color:var(--dm-hover-bg, rgba(128, 128, 128, .14))!important;color:var(--dm-text, #1f2937)!important;text-decoration:underline;text-underline-offset:3px}.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(--dm-border, 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(--dm-text-muted, #888);font-size:.875rem}.footer-links{display:flex;gap:1.25rem}.footer-links a{color:var(--dm-text-muted, #888);font-size:.875rem;text-decoration:none}.footer-links a:hover{color:var(--dm-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(--dm-text-muted, #888);transition:color .15s}.footer-social-link:hover{color:var(--dm-text, #eee)}.footer-social-link svg{width:1rem;height:1rem}.footer-motion-switch{font-size:.8rem;color:var(--dm-text-muted, #888);white-space:nowrap}.footer-motion-switch .form-switch-label{color:var(--dm-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(--dm-border, 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:auto;overscroll-behavior:contain;flex:1;min-height:0;scrollbar-width:thin;scrollbar-color:var(--dm-border) transparent}.dm-slideover-body::-webkit-scrollbar{width:8px;height:8px}.dm-slideover-body::-webkit-scrollbar-track{background:transparent}.dm-slideover-body::-webkit-scrollbar-thumb{background:var(--dm-border);border-radius:4px}.dm-slideover-body::-webkit-scrollbar-thumb:hover{background:var(--dm-text-muted)}@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:not(.card-no-hover):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:not(.card-no-hover):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-secondary);border-top:1px solid var(--dm-border)}.page-body .dm-card-gradient{background:var(--dm-card-bg, #fff);border:none;box-shadow:0 4px 20px #6366f124;transition:transform .2s ease,box-shadow .2s ease}.page-body .dm-card-gradient:not(.card-no-hover):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-secondary);border-top:1px solid var(--dm-border)}.page-body .dm-card-glass{background:color-mix(in srgb,var(--dm-surface) 62%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid color-mix(in srgb,var(--dm-border) 75%,transparent);box-shadow:0 4px 24px #00000014;transition:transform .2s ease,box-shadow .2s ease,background .2s ease}.page-body .dm-card-glass:not(.card-no-hover):hover{transform:translateY(-4px);box-shadow:0 12px 36px #00000024;background:color-mix(in srgb,var(--dm-surface) 78%,transparent)}.page-body .dm-card-glass .card-header{background:transparent;border-bottom:1px solid color-mix(in srgb,var(--dm-border) 60%,transparent);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-secondary);background:transparent}.page-body .dm-card-accent{background:var(--dm-surface);border:1px solid var(--dm-border);border-left:4px solid var(--dm-primary, #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:not(.card-no-hover):hover{transform:translateY(-3px);border-left-color:var(--dm-primary-hover, #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-secondary);border-top:1px solid var(--dm-border)}.page-body .dm-card-dark{--cms-link-color: color-mix(in srgb, var(--dm-primary) 40%, #fff);--cms-link-hover-color: color-mix(in srgb, var(--dm-primary) 20%, #fff);background:linear-gradient(160deg,color-mix(in srgb,var(--dm-primary) 8%,#1e293b),#0f172a);color:#cbd5e1;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:not(.card-no-hover):hover{transform:translateY(-4px) scale(1.012);box-shadow:0 16px 40px #00000073}.page-body .dm-card-dark .card-header{background:transparent;color:#f1f5f9;border-bottom:1px solid rgba(255,255,255,.08)}.page-body .dm-card-dark :is(h1,h2,h3,h4,h5,h6,strong,b){color:#f1f5f9}.page-body .dm-card-dark .card-title{color:#f1f5f9!important}.page-body .dm-card-dark .card-subtitle{color:#94a3b8}.page-body .dm-card-dark .card-body{color:#cbd5e1}.page-body .dm-card-dark :is(code,pre){background:#ffffff14;border-color:#ffffff1f;color:#f1f5f9}.page-body .dm-card-dark pre code{background:none}.page-body .dm-card-dark .card-footer{background:transparent;color:#94a3b8;border-top:1px solid rgba(255,255,255,.08)}.page-body .dm-card-glow{background:var(--dm-surface);border:1px solid color-mix(in srgb,var(--dm-primary, #6366f1) 45%,transparent);box-shadow:0 0 #6366f100;transition:transform .2s ease,box-shadow .3s ease,border-color .2s ease}.page-body .dm-card-glow:not(.card-no-hover):hover{transform:translateY(-3px);border-color:var(--dm-primary, #818cf8);box-shadow:0 0 0 4px color-mix(in srgb,var(--dm-primary, #6366f1) 14%,transparent),0 0 28px color-mix(in srgb,var(--dm-primary, #6366f1) 22%,transparent)}.page-body .dm-card-glow .card-header{color:var(--dm-primary);border-bottom:1px solid color-mix(in srgb,var(--dm-primary, #6366f1) 20%,transparent)}.page-body .dm-card-glow .card-body{color:var(--dm-text-secondary)}.page-body .dm-card-glow .card-footer{border-top:1px solid color-mix(in srgb,var(--dm-primary, #6366f1) 20%,transparent);color:var(--dm-text-secondary)}.page-body .card-hover{transition:transform .2s ease,box-shadow .2s ease}.page-body .card-hover:not(.card-no-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-xs{border-radius:2px}.page-body .card-rounded-sm{border-radius:4px}.page-body .dm-box-primary{--cms-box-tone: var(--dm-primary)}.page-body .dm-box-secondary{--cms-box-tone: var(--dm-secondary)}.page-body .dm-box-success{--cms-box-tone: var(--dm-success)}.page-body .dm-box-info{--cms-box-tone: var(--dm-info)}.page-body .dm-box-warning{--cms-box-tone: var(--dm-warning)}.page-body .dm-box-danger{--cms-box-tone: var(--dm-danger)}.page-body .dm-box-tone{--cms-link-color: color-mix(in srgb, var(--cms-box-tone) 40%, var(--dm-text));--cms-link-hover-color: var(--dm-text);background:color-mix(in srgb,var(--cms-box-tone) 12%,var(--dm-card-bg));border-color:color-mix(in srgb,var(--cms-box-tone) 45%,var(--dm-card-border));color:var(--dm-text)}.page-body .dm-box-tone>.card-body{color:var(--dm-text)}.page-body .dm-box-tone>.card-footer{background:color-mix(in srgb,var(--cms-box-tone) 20%,var(--dm-card-bg));border-top-color:color-mix(in srgb,var(--cms-box-tone) 35%,var(--dm-card-border));color:var(--dm-text)}.page-body .dm-box-custom{--cms-link-color: currentColor;--cms-link-hover-color: currentColor;background:var(--cms-box-bg);border-color:color-mix(in srgb,var(--cms-box-fg) 25%,var(--cms-box-bg));color:var(--cms-box-fg)}.page-body .dm-box-custom>:is(.card-body,.card-footer),.page-body .dm-box-custom :is(h1,h2,h3,h4,h5,h6,strong,b){color:var(--cms-box-fg)}.page-body .dm-box-custom>.card-footer{background:color-mix(in srgb,var(--cms-box-shade) 10%,var(--cms-box-bg));border-top-color:color-mix(in srgb,var(--cms-box-fg) 20%,var(--cms-box-bg))}.page-body .dm-box-custom a{text-decoration-color:currentColor!important}.page-body .dm-box-custom :is(code,pre){background:color-mix(in srgb,var(--cms-box-shade) 15%,var(--cms-box-bg));border-color:color-mix(in srgb,var(--cms-box-fg) 20%,var(--cms-box-bg));color:var(--cms-box-fg)}.page-body .dm-box-custom pre code{background:none}.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:color-mix(in srgb,var(--dm-text) 15%,transparent)}.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:color-mix(in srgb,var(--dm-text) 20%,transparent)}.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:color-mix(in srgb,var(--dm-text) 20%,transparent)}.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:var(--dm-success, #10b981)}.card-stat-delta.negative{color:var(--dm-danger, #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:var(--dm-success, #10b981)}.card-milestone-dot.pending{background:var(--dm-border, #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:color-mix(in srgb,var(--dm-primary, #6366f1) 12%,transparent);line-height:1;pointer-events:none}.card-step-badge{width:32px;height:32px;border-radius:50%;background:var(--dm-primary, #6366f1);color:var(--dm-primary-text, #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:var(--dm-danger, #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 var(--dm-primary, #6366f1)}.card-callout.warn{border-left-color:var(--dm-warning, #f59e0b)}.card-callout.success{border-left-color:var(--dm-success, #10b981)}.card-callout.error{border-left-color:var(--dm-danger, #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:color-mix(in srgb,var(--dm-primary, #6366f1) 18%,transparent);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:color-mix(in srgb,var(--dm-primary, #7c3aed) 15%,transparent);color:var(--dm-primary, #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:var(--dm-link, var(--dm-primary, #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:color-mix(in srgb,var(--dm-success, #10b981) 18%,transparent);color:var(--dm-success, #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:var(--dm-danger, #ef4444)}.card-compare-label.after{color:var(--dm-success, #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:var(--dm-danger, #ef4444);flex-shrink:0}.card-compare-check{color:var(--dm-success, #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:var(--dm-success, #10b981)}.card-pricing-cta{display:block;text-align:center;background:var(--dm-primary, #6366f1);color:var(--dm-primary-text, #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:var(--dm-primary, #6366f1);flex-shrink:0}.card-timeline-line{width:2px;background:var(--dm-border, #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:color-mix(in srgb,var(--dm-success, #10b981) 18%,transparent);color:var(--dm-success, #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:var(--dm-success, #10b981)}.card-fc-no{color:var(--dm-text-disabled, #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}body[class*=-light] .dm-breadcrumbs{background:#ffffff8c;border-color:#00000012;box-shadow:0 2px 10px #00000014}body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-item,body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-link{color:#0000008c}body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-link:hover{color:#000000e6}body[class*=-light] .dm-breadcrumbs .dm-breadcrumbs-current{color:#000000d9}body[class*=-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(--dm-border, 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(--dm-text-muted, #888);font-size:.9rem}.dm-collection-empty p{color:var(--dm-text-muted, #888);font-style:italic}.hero-gradient-purple,.hero-gradient-blue,.hero-gradient-green,.hero-gradient-sunset,.hero-gradient-ocean,.hero-gradient-rose,.hero-gradient-forest{background:linear-gradient(135deg,color-mix(in srgb,var(--hero-hue) 22%,var(--dm-background)),color-mix(in srgb,var(--hero-hue) 10%,var(--dm-background)));color:var(--dm-text)}.hero-gradient-purple{--hero-hue: #8b5cf6}.hero-gradient-blue{--hero-hue: #3b82f6}.hero-gradient-green{--hero-hue: #10b981}.hero-gradient-sunset{--hero-hue: #f59e0b}.hero-gradient-ocean{--hero-hue: #0ea5e9}.hero-gradient-rose{--hero-hue: #ec4899}.hero-gradient-forest{--hero-hue: #16a34a}.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-md, 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]:not(.card-no-hover):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 var(--dm-primary, #5c3d2e)}.mk-banner.type-success,[class*=banner-success],.mk-banner[data-type=success]{border-left:4px solid var(--dm-success, #22c55e)}.mk-banner.type-warning,[class*=banner-warning],.mk-banner[data-type=warning]{border-left:4px solid var(--dm-warning, #f59e0b)}.mk-stat-number{font-size:5rem;font-weight:900;line-height:1;letter-spacing:-.03em;color:var(--dm-primary, #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 var(--dm-border, 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}#site-navbar:not([data-menu-active]) .navbar-link.active:not([data-menu-item-active]){opacity:1!important;font-weight:700!important;position:relative}#site-navbar:not([data-menu-active]) .navbar-link.active:not([data-menu-item-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 var(--dm-border-light, 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:color-mix(in srgb,var(--dm-primary, #5c3d2e) 10%,transparent);color:var(--dm-primary, #5c3d2e);border:1px solid color-mix(in srgb,var(--dm-primary, #5c3d2e) 20%,transparent)}.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:var(--dm-text, #f1f5f9)!important}.card-subtitle{font-size:.8125rem!important;opacity:.7!important;margin-bottom:.5rem!important;font-weight:500!important;color:var(--dm-text, #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:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #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:var(--dm-text, #1e293b);line-height:1.4;flex:1 1 auto}.plugin-card{display:flex;flex-direction:column;background:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #475569)}.plugin-card-cover{position:relative;width:100%;height:150px;background-size:cover;background-position:center;background-color:var(--dm-background-alt, #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:var(--dm-card-bg, #fff);color:var(--dm-text, #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:var(--dm-text, #1e293b)!important;line-height:1.2!important;margin:0!important}.plugin-card-desc{font-size:.88rem!important;color:var(--dm-text-secondary, #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:var(--dm-text-secondary, #475569);margin-top:8px;transition:color .15s ease,gap .15s ease}.plugin-card:hover .plugin-card-cta{color:var(--dm-text, #1e293b);gap:8px}.page-body a:not([class*=btn]):not(.plugin-card):not([class*=nav]):not([class*=footer]):not([data-menu-hover] a):not([data-menu-active] a){color:var(--cms-link-color, var(--dm-link, 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]):not([data-menu-hover] a):not([data-menu-active] a):hover{color:var(--cms-link-hover-color, var(--dm-link-hover, var(--dm-primary-hover, var(--dm-text, #3e2723))))!important;text-decoration-color:var(--cms-link-color, var(--dm-link, var(--dm-primary, currentColor)))}.page-body .dm-card-gradient .card-body a:not([class*=btn]){color:var(--dm-link, var(--dm-primary, var(--dm-text, #5d4037)))!important}.page-body .dm-card-gradient .card-body a:not([class*=btn]):hover{color:var(--dm-link-hover, 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):not([data-menu-hover] a):not([data-menu-active] a){color:var(--cms-link-color, var(--dm-link, 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):not([data-menu-hover] a):not([data-menu-active] a):hover{color:var(--cms-link-hover-color, var(--dm-link-hover, 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:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #475569)}.run-option-banner{position:relative;width:100%;height:180px;background-size:cover;background-position:center;background-color:var(--dm-background-alt, #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 var(--dm-card-bg, #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:var(--dm-text, #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:var(--dm-text-secondary, #475569)}.run-option-content p{margin:0 0 12px}.run-option-content .run-option-intro{font-size:.98rem;color:var(--dm-text, #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:var(--dm-text-muted, #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:var(--dm-text, #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 var(--dm-border, #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:var(--dm-card-bg, #ffffff);border:1px solid var(--dm-card-border, #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:var(--dm-border-dark, #475569)}.quickstart-step-number{position:absolute;top:8px;right:14px;font-size:5rem;font-weight:900;line-height:1;color:color-mix(in srgb,var(--dm-text) 8%,transparent);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:var(--dm-text, #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:var(--dm-text-secondary, #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-md, 6px);background:var(--dm-background, #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-text-muted, #6b7280);margin:0}.dm-cb-sort-select{padding:.45rem .6rem;border:1px solid var(--dm-border, #d1d5db);border-radius:var(--dm-radius-md, 6px);background:var(--dm-background, #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-md, 6px);background:var(--dm-background, #fff);cursor:pointer;font-weight:700}.dm-cb-sort-dir:hover{background:var(--dm-background-alt, #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-md, 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-text-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-md, 6px);background:var(--dm-background, #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-md, 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-md, 6px);cursor:pointer;font-size:.85rem}.dm-cb-filter-reset:hover{background:var(--dm-background-alt, #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-text-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-background, #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-background-alt, #f3f4f6)}.dm-cb-chip-active{background:var(--dm-primary, #2563eb);color:var(--dm-primary-text, #fff);border-color:var(--dm-primary, #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-primary, #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-primary, #2563eb);border:2px solid var(--dm-background, #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-primary, #2563eb);border:2px solid var(--dm-background, #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-background, #fff);border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius-md, 6px);box-shadow:0 8px 24px #0f172a1f;z-index:20}.dm-cb-saved-empty{margin:0 0 .5rem;font-size:.85rem;color:var(--dm-text-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-md, 6px);cursor:pointer;font-size:.88rem;color:var(--dm-text, #111827)}.dm-cb-saved-apply:hover{background:var(--dm-background-alt, #f3f4f6)}.dm-cb-saved-del{width:1.5rem;height:1.5rem;padding:0;background:transparent;border:0;color:var(--dm-text-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-text-muted, #6b7280)}.dm-cb-scroll-end{text-align:center;margin:1rem 0 0;font-size:.85rem;color:var(--dm-text-muted, #9ca3af);font-style:italic}.dm-cb-block-loading{text-align:center;padding:2rem 0;color:var(--dm-text-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-primary, #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-background, #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-md, 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-text-muted, #6b7280)}.dm-cb-transitions:empty{display:none}.dm-cb-transition-btn{padding:.35rem .7rem;font-size:.82rem}.dm-menu-sep,.footer-sep{list-style:none}.dm-menu-sep hr,.footer-sep hr{border:0;border-top:1px solid var(--dm-border, rgba(128, 128, 128, .35));margin:.4rem 0}.dm-menu-spacer{list-style:none;pointer-events:none;padding:0;margin:0;border:0}.dm-menu-spacer--xs{height:var(--dm-space-1, .25rem)}.dm-menu-spacer--sm{height:var(--dm-space-2, .5rem)}.dm-menu-spacer--md{height:var(--dm-space-4, 1rem)}.dm-menu-spacer--lg{height:var(--dm-space-6, 1.5rem)}.dm-menu-spacer--xl{height:var(--dm-space-10, 2.5rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--xs,.navbar-nav>.dm-menu-spacer--xs{height:auto;width:var(--dm-space-1, .25rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--sm,.navbar-nav>.dm-menu-spacer--sm{height:auto;width:var(--dm-space-2, .5rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--md,.navbar-nav>.dm-menu-spacer--md{height:auto;width:var(--dm-space-4, 1rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--lg,.navbar-nav>.dm-menu-spacer--lg{height:auto;width:var(--dm-space-6, 1.5rem)}.dm-menu--horizontal>ul>.dm-menu-spacer--xl,.navbar-nav>.dm-menu-spacer--xl{height:auto;width:var(--dm-space-10, 2.5rem)}.dm-menu--has-flex-spacer>ul{display:flex;flex-direction:column}.dm-menu--has-flex-spacer.dm-menu--horizontal>ul{flex-direction:row;align-items:center}.dm-menu-spacer--flex{flex:1 1 auto;height:auto;width:auto}.dm-menu-floating .dm-menu-spacer--flex{min-height:var(--dm-space-4, 1rem)}@media(max-width:768px){.dm-menu--has-flex-spacer.dm-menu--horizontal>ul{flex-wrap:wrap}}#site-navbar .navbar-dropdown-divider{background:var(--dm-border, rgba(128, 128, 128, .5));opacity:.8}.dm-menu-badge{display:inline-block;margin-left:6px;padding:1px 7px;font-size:.7em;font-weight:700;line-height:1.4;border-radius:999px;background:var(--dm-text-muted);color:var(--dm-text-inverse, #fff);vertical-align:middle}.dm-nav-pill{border-radius:999px;padding:6px 14px;font-weight:600}.dm-nav-pill--outline{background:transparent!important;border:1px solid currentColor}@media(max-width:992px){#site-navbar .navbar-toggle{order:0;margin-right:var(--dm-space-2)}#site-navbar .navbar-brand{order:1}#site-navbar .navbar-collapse{position:fixed;top:0;left:0;bottom:0;width:86vw;max-width:340px;z-index:1100;margin:0;padding:var(--dm-space-3) 0 var(--dm-space-6);background:var(--dm-navbar-bg, var(--dm-surface));border-top:none;border-right:1px solid var(--dm-border);box-shadow:4px 0 18px #00000059;transform:translate(-100%);transition:transform .25s ease;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#site-navbar .navbar-collapse.show{transform:translate(0)}body.dm-drawer-open #site-navbar{z-index:1100}#site-navbar .navbar-nav{max-height:none;overflow:visible}#site-navbar .navbar-dropdown-toggle{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--dm-space-3) var(--dm-space-4);font-size:var(--dm-font-size-base)}#site-navbar .navbar-caret{margin-left:auto;flex:none;width:16px;height:16px;opacity:.9}#site-navbar .navbar-dropdown-menu{position:static;display:none;min-width:0;width:100%;margin:0;padding:0;border:0;border-radius:0;box-shadow:none;background:color-mix(in srgb,var(--dm-text) 8%,transparent)}#site-navbar .navbar-dropdown.open>.navbar-dropdown-menu{display:block}#site-navbar .navbar-dropdown-item{padding-left:calc(var(--dm-space-4) + var(--dm-space-5))}.dm-navbar-backdrop{position:fixed;inset:0;z-index:1090;background:#00000073;border:0;padding:0;cursor:pointer}body.dm-drawer-open{overflow:hidden}}.dm-embed{margin:1.5rem 0}.dm-embed-frame{overflow:hidden;border-radius:8px;background:#000}.dm-embed-caption{margin-top:.5rem;font-size:.85rem;color:var(--dm-text-muted, #6b7280);text-align:center}.dm-embed-blocked{margin:1.5rem 0;padding:.75rem 1rem;border:1px dashed var(--dm-border, #d1d5db);border-radius:8px;background:var(--dm-background-alt, #f9fafb);color:var(--dm-text-muted, #6b7280);font-size:.9rem}.dm-menu-missing{margin:1rem 0;padding:.6rem .9rem;border:1px dashed var(--dm-border, #d1d5db);border-radius:8px;background:var(--dm-background-alt, #f9fafb);color:var(--dm-text-muted, #6b7280);font-size:.9rem}.dm-embed-blocked code{font-family:var(--dm-font-mono, monospace);font-size:.85em}.dm-menu-floating{overflow:auto;overscroll-behavior:contain;background:var(--dm-surface);color:var(--dm-text);border:1px solid var(--dm-border);border-radius:var(--dm-radius-md, 8px);box-shadow:var(--dm-shadow-lg);scrollbar-width:thin;scrollbar-color:var(--dm-border) transparent}.dm-menu-floating[style*=--dm-menu-accent]{border-left:3px solid var(--dm-menu-accent)}.dm-menu-floating[data-float-anchor=TR][style*=--dm-menu-accent],.dm-menu-floating[data-float-anchor=BR][style*=--dm-menu-accent],.dm-menu-floating[data-float-anchor=R][style*=--dm-menu-accent]{border-left:1px solid var(--dm-menu-accent);border-right:3px solid var(--dm-menu-accent)}.dm-menu-floating[style*=--dm-menu-panel-opacity]{background:color-mix(in srgb,var(--dm-surface) calc(var(--dm-menu-panel-opacity) * 100%),transparent);backdrop-filter:blur(8px)}.dm-menu-float-bar{position:sticky;top:0;z-index:1;display:flex;align-items:center;gap:var(--dm-space-2, .5rem);padding:var(--dm-space-2, .5rem) var(--dm-space-3, .75rem);background:inherit;border-bottom:1px solid var(--dm-border);border-radius:inherit;border-bottom-left-radius:0;border-bottom-right-radius:0}.dm-menu-float-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.8rem;font-weight:600;letter-spacing:.02em;color:var(--dm-text-muted, #6b7280)}.dm-menu-float-grip{flex:0 0 auto;width:10px;height:16px;background-image:radial-gradient(currentColor 1px,transparent 1px);background-size:5px 5px;background-position:0 2px;color:var(--dm-text-muted, #6b7280);opacity:.6}.dm-menu-floating[data-float-movable] .dm-menu-float-bar{cursor:grab}.dm-menu-floating.is-dragging,.dm-menu-floating.is-dragging .dm-menu-float-bar{cursor:grabbing}.dm-menu-floating.is-dragging{user-select:none}.dm-menu-floating[data-float-movable] .dm-menu-float-bar{touch-action:none}.dm-menu-float-toggle{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dm-radius-sm, 4px);background:transparent;color:var(--dm-text);cursor:pointer}.dm-menu-float-toggle:hover{background:var(--dm-hover-bg, rgba(128, 128, 128, .14))}.dm-menu-float-toggle:focus-visible{outline:2px solid var(--dm-primary);outline-offset:1px}.dm-menu-float-icon{position:relative;width:16px;height:2px;background:currentColor;border-radius:1px}.dm-menu-float-icon:before,.dm-menu-float-icon:after{content:"";position:absolute;left:0;width:100%;height:2px;background:currentColor;border-radius:1px}.dm-menu-float-icon:before{top:-5px}.dm-menu-float-icon:after{top:5px}.dm-menu-floating.is-collapsed{width:auto!important;max-height:none!important;overflow:visible;padding:0;background:transparent;border:0;box-shadow:none;backdrop-filter:none;resize:none;min-width:0;min-height:0}.dm-menu-floating.is-collapsed>*:not(.dm-menu-float-bar),.dm-menu-floating.is-collapsed .dm-menu-float-grip,.dm-menu-floating.is-collapsed .dm-menu-float-title{display:none}#site-navbar.dm-menu-floating.is-collapsed>*:not(.dm-menu-float-bar){display:none}#site-navbar.dm-menu-floating.is-collapsed{width:auto!important;max-height:none!important;padding:0;background:transparent;border:0;box-shadow:none;backdrop-filter:none}.dm-menu-floating.is-collapsed .dm-menu-float-bar{padding:0;border:0;background:transparent;cursor:default}.dm-menu-floating.is-collapsed .dm-menu-float-toggle{width:44px;height:44px;border-radius:50%;background:var(--dm-surface);border:1px solid var(--dm-menu-accent, var(--dm-border));box-shadow:var(--dm-shadow-lg)}.navbar-transparent,.dm-menu--variant-transparent,.dm-menu-floating.navbar-transparent,.dm-menu-floating.dm-menu--variant-transparent{background:transparent;border-color:transparent;box-shadow:none;backdrop-filter:none}.navbar-transparent.is-collapsed .dm-menu-float-toggle,.dm-menu--variant-transparent.is-collapsed .dm-menu-float-toggle{background:var(--dm-surface)}.navbar-transparent .dm-menu-float-bar,.dm-menu--variant-transparent .dm-menu-float-bar{border-bottom-color:transparent}.dm-menu-floating[data-float-resizable]:not(.is-collapsed){resize:both;min-width:120px;min-height:48px}@media(max-width:768px){.dm-menu-floating{position:static!important;inset:auto!important;width:auto!important;max-height:none!important;transform:none!important;resize:none!important}.dm-menu-floating[data-float-movable] .dm-menu-float-bar{cursor:default}.dm-menu-floating[data-float-movable] .dm-menu-float-grip{display:none}}.dm-menu--vertical ul,.dm-menu--horizontal ul{list-style:none;margin:0;padding:0}.dm-menu--vertical>ul{display:flex;flex-direction:column;gap:2px}.dm-menu--vertical>ul>li>a{display:block;padding:.4rem .75rem;border-radius:var(--dm-radius-md, 6px);text-decoration:none}.dm-menu--vertical>ul>li>a:hover{background:color-mix(in srgb,var(--dm-text) 8%,transparent)}.dm-menu--vertical ul ul{margin-left:.75rem;border-left:1px solid var(--dm-border, rgba(128, 128, 128, .35));padding-left:.4rem}.dm-menu--horizontal>ul{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem 1rem}.dm-menu--horizontal>ul>li{position:relative}.dm-menu--horizontal>ul>li>a{display:inline-block;padding:.35rem .5rem;text-decoration:none}.dm-menu--horizontal.dm-menu--align-left>ul{justify-content:flex-start}.dm-menu--horizontal.dm-menu--align-centre>ul{justify-content:center}.dm-menu--horizontal.dm-menu--align-right>ul{justify-content:flex-end}.dm-menu--horizontal.dm-menu--align-spread>ul{justify-content:space-between}.dm-menu--horizontal>ul>li>ul{position:absolute;top:100%;left:0;z-index:40;display:none;min-width:180px;padding:.35rem 0;background:var(--dm-surface);border:1px solid var(--dm-border);border-radius:var(--dm-radius-md, 8px);box-shadow:var(--dm-shadow-lg)}.dm-menu--horizontal>ul>li:hover>ul,.dm-menu--horizontal>ul>li:focus-within>ul{display:block}.dm-menu--horizontal>ul>li>ul a{display:block;padding:.35rem .9rem;text-decoration:none}@media(max-width:768px){.dm-menu--horizontal>ul{flex-direction:column;align-items:stretch}.dm-menu--horizontal>ul>li>ul{position:static;display:block;border:0;box-shadow:none;padding-left:.75rem}}:root{--dm-vnav-width: 240px}@media(min-width:993px){#site-navbar.dm-nav-vertical:not(.dm-menu-floating){position:fixed;top:0;bottom:0;height:100vh;height:100dvh;width:var(--dm-vnav-width);flex-direction:column;flex-wrap:nowrap;align-items:stretch;justify-content:flex-start;gap:var(--dm-space-2);padding:var(--dm-space-4) var(--dm-space-3);overflow-y:auto;overscroll-behavior:contain;border-bottom:none;z-index:100}#site-navbar.dm-nav-vertical-left:not(.dm-menu-floating){left:0;right:auto;border-right:1px solid var(--dm-border)}#site-navbar.dm-nav-vertical-right:not(.dm-menu-floating){right:0;left:auto;border-left:1px solid var(--dm-border)}body.dm-vnav-left{padding-left:var(--dm-vnav-width)}body.dm-vnav-right{padding-right:var(--dm-vnav-width)}#site-navbar.dm-nav-vertical .navbar-container{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:var(--dm-space-2);width:100%;min-height:100%;padding:0;margin:0}#site-navbar.dm-nav-vertical .navbar-toggle{display:none!important}#site-navbar.dm-nav-vertical .navbar-brand{padding:0 var(--dm-space-2) var(--dm-space-3);margin:0;width:100%}#site-navbar.dm-nav-vertical .navbar-collapse{display:flex!important;flex-direction:column!important;align-items:stretch!important;width:100%!important;flex-grow:1!important;padding:0!important;border:none!important}#site-navbar.dm-nav-vertical .navbar-nav{display:flex!important;flex-direction:column!important;align-items:stretch!important;justify-content:flex-start!important;gap:2px!important;width:100%!important;flex:none!important;margin:0!important;padding:0!important}#site-navbar.dm-nav-vertical .navbar-nav li,#site-navbar.dm-nav-vertical .navbar-nav .navbar-item{width:100%!important;display:block!important}#site-navbar.dm-nav-vertical .navbar-link,#site-navbar.dm-nav-vertical .navbar-dropdown-toggle{display:flex!important;align-items:center!important;justify-content:flex-start!important;gap:var(--dm-space-2)!important;width:100%!important;padding:var(--dm-space-2) var(--dm-space-3)!important;font-size:var(--dm-font-size-sm)!important;text-align:left!important;border-radius:var(--dm-radius-md)!important;white-space:normal!important}#site-navbar.dm-nav-vertical .navbar-link:hover,#site-navbar.dm-nav-vertical .navbar-dropdown-toggle:hover{background-color:color-mix(in srgb,var(--dm-text) 8%,transparent)}#site-navbar.dm-nav-vertical .navbar-dropdown-toggle .navbar-caret{margin-left:auto}#site-navbar.dm-nav-vertical .navbar-dropdown{position:static!important;width:100%!important}#site-navbar.dm-nav-vertical .navbar-dropdown-menu{position:static!important;display:none;width:100%!important;min-width:0!important;margin:0!important;padding:0!important;border:0!important;border-radius:0!important;box-shadow:none!important;background:color-mix(in srgb,var(--dm-text) 8%,transparent)!important}#site-navbar.dm-nav-vertical .navbar-dropdown.open>.navbar-dropdown-menu{display:block!important}#site-navbar.dm-nav-vertical .navbar-dropdown-item{display:block!important;width:100%!important;padding:var(--dm-space-2) var(--dm-space-3) var(--dm-space-2) calc(var(--dm-space-3) + var(--dm-space-5))!important}#site-navbar.dm-nav-vertical .navbar-actions{display:flex;flex-direction:column;align-items:stretch;margin-left:0;margin-top:auto;padding-top:var(--dm-space-3)}}@media print{body.dm-ctx-printing *{visibility:hidden}body.dm-ctx-printing [data-dm-print],body.dm-ctx-printing [data-dm-print] *{visibility:visible}body.dm-ctx-printing [data-dm-print]{position:absolute;left:0;top:0;width:100%}body.dm-ctx-printing [data-dm-print] .accordion-content{display:block!important;height:auto!important}body.dm-ctx-printing .dm-ctx-hidden{display:none!important}}
@@ -2141,6 +2141,11 @@ export function extractInjectedEffects(attrs, allowed) {
2141
2141
  // Card shared helpers
2142
2142
  // ---------------------------------------------------------------------------
2143
2143
 
2144
+ /** Whether a card/box `hover` value turns the hover lift off. */
2145
+ function isHoverOff(value) {
2146
+ return typeof value === 'string' && ['off', 'false', 'none', 'no', '0'].includes(value.trim().toLowerCase());
2147
+ }
2148
+
2144
2149
  /**
2145
2150
  * Returns the full class array for a card root element, incorporating variant,
2146
2151
  * gradient, hover, collapsible, and custom class attributes.
@@ -2157,7 +2162,10 @@ function cardVariantClasses(attrs) {
2157
2162
  classes.push(`dm-card-${variant}`);
2158
2163
  if (variant === 'gradient') classes.push(`card-gradient-${gradient}`);
2159
2164
  }
2160
- if ('hover' in attrs) classes.push('card-hover');
2165
+ // hover="off" (or false/none/no/0) switches the lift off - every body card
2166
+ // lifts on hover by default (site.css); a bare `hover` or any other value
2167
+ // asks for the opt-in lift as before.
2168
+ if ('hover' in attrs) classes.push(isHoverOff(attrs.hover) ? 'card-no-hover' : 'card-hover');
2161
2169
  if (attrs.collapsible === 'true') classes.push('card-collapsible');
2162
2170
  if (typeof attrs.class === 'string') classes.push(attrs.class.trim());
2163
2171
  const font = typeof attrs.font === 'string' ? attrs.font.trim() : '';
@@ -24,7 +24,7 @@
24
24
  <link rel="stylesheet" href="/dist/domma/themes/domma-themes.css">
25
25
 
26
26
  <!-- Site CSS -->
27
- <link rel="stylesheet" href="/public/css/site.css?v=20260927-link-colour">
27
+ <link rel="stylesheet" href="/public/css/site.css?v=20260928-card-no-hover">
28
28
  <link rel="stylesheet" href="/public/css/forms.css?v=20260927-submit-btn-css">
29
29
  <!-- Menu item hover / current-page effects. Loaded after site.css so a
30
30
  menu's own highlight wins over the blanket link styling there. -->