domma-cms 1.6.42 → 1.6.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin/dist/domma/domma-tools.css +3 -3
- package/admin/dist/domma/domma-tools.min.js +3 -3
- package/admin/index.html +1 -1
- package/admin/js/lib/admin-theme.js +1 -1
- package/admin/js/lib/menu-editor-arrange.js +2 -2
- package/admin/js/lib/shortcode-registry.js +1 -1
- package/admin/js/lib/sidebar-renderer.js +1 -1
- package/admin/js/templates/menu-editor.html +22 -0
- package/admin/js/views/layouts.js +1 -1
- package/admin/js/views/menu-editor.js +13 -13
- package/package.json +2 -2
- package/public/css/menu-highlight.css +1 -1
- package/public/css/site.css +1 -1
- package/public/js/menu-decor.mjs +1 -1
- package/public/js/site.js +1 -1
- package/server/services/markdown.js +5 -1
- package/server/services/menuRender.js +8 -5
- package/server/services/menus.js +22 -1
- package/server/services/renderer.js +8 -0
- package/server/templates/page.html +3 -3
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Domma Tools CSS v0.
|
|
2
|
+
* Domma Tools CSS v0.52.0
|
|
3
3
|
* Dynamic Object Manipulation & Modeling API
|
|
4
4
|
* (c) 2026 Darryl Waterhouse & DCBW-IT
|
|
5
|
-
* Built: 2026-10-
|
|
6
|
-
* Commit:
|
|
5
|
+
* Built: 2026-10-14T07:30:24.896Z
|
|
6
|
+
* Commit: 17bea57
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/*!
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Domma Tools v0.
|
|
2
|
+
* Domma Tools v0.52.0
|
|
3
3
|
* Developer tools: Theme Roller & Page Roller
|
|
4
4
|
* (c) 2026 Darryl Waterhouse & DCBW-IT
|
|
5
|
-
* Built: 2026-10-
|
|
6
|
-
* Commit:
|
|
5
|
+
* Built: 2026-10-14T07:30:09.523Z
|
|
6
|
+
* Commit: 17bea57
|
|
7
7
|
*
|
|
8
8
|
* Requires: domma.min.js
|
|
9
9
|
*/
|
package/admin/index.html
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
<!-- Menu item hover / current-page effects - the admin sidebar is a menu
|
|
28
28
|
like any other, so it honours the same `highlight` block. -->
|
|
29
|
-
<link rel="stylesheet" href="/public/css/menu-highlight.css?v=
|
|
29
|
+
<link rel="stylesheet" href="/public/css/menu-highlight.css?v=20261014-menu-entrance">
|
|
30
30
|
<link rel="stylesheet" href="/admin/css/calculator.css">
|
|
31
31
|
</head>
|
|
32
32
|
<body class="dm-cloaked dm-theme-charcoal-dark dashboard-layout">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const c="dm-custom-themes";export function applyAdminTheme(e){const s=e?.dommaTheme||"charcoal-dark";Domma.theme.init({theme:s,persist:!1,target:document.body});let t=document.getElementById(c);e?.css?(t||(t=document.createElement("style"),t.id=c,document.head.appendChild(t)),t.textContent=e.css):t&&t.remove();const m=document.body;for(const o of[...m.classList])o.startsWith("dm-custom-")&&m.classList.remove(o);e?.customClass&&m.classList.add(e.customClass)}export async function refreshAdminTheme(e,s={}){try{applyAdminTheme(await e.theme.admin(),s)}catch{applyAdminTheme({dommaTheme:"charcoal-dark"},s)}}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const p=["separator","spacer","theme-switcher"];export const isStructural=t=>p.includes(t?.type);export function siblingsOf(t,e){const i=t.find(n=>n.id===e);return i?t.filter(n=>n.parentId===i.parentId):[]}export function moveRow(t,e,i){const n=siblingsOf(t,e),r=n.findIndex(
|
|
2
|
-
`).map(n=>n.trim()).filter(Boolean)}:null}export function badPagePatterns(t=[]){return t.filter(e=>!/^\/[^\s?#*]*(\/\*)?$|^\/\*$/.test(e))}const g=["fontFamily","fontSize","fontWeight","letterSpacing","iconSize"];export function menuFromForm(t={},e={},i=null,n=[],r={}){const
|
|
1
|
+
const p=["separator","spacer","theme-switcher"];export const isStructural=t=>p.includes(t?.type);export function siblingsOf(t,e){const i=t.find(n=>n.id===e);return i?t.filter(n=>n.parentId===i.parentId):[]}export function moveRow(t,e,i){const n=siblingsOf(t,e),r=n.findIndex(l=>l.id===e),a=r+(i<0?-1:1);if(r<0||a<0||a>=n.length)return!1;n[r].touched=!0;const o=t.indexOf(n[r]),s=t.indexOf(n[a]);return[t[o],t[s]]=[t[s],t[o]],!0}export function indentRow(t,e){const i=siblingsOf(t,e),n=i.findIndex(r=>r.id===e);return n<=0||isStructural(i[n-1])?!1:(i[n].parentId=i[n-1].id,i[n].touched=!0,!0)}export function outdentRow(t,e){const i=t.find(r=>r.id===e);if(!i||i.parentId==null)return!1;const n=t.find(r=>r.id===i.parentId);return i.parentId=n?n.parentId:null,i.touched=!0,!0}export function newRow(t,e,i=null){return t==="separator"?{id:e,parentId:i,type:"separator"}:t==="theme-switcher"?{id:e,parentId:i,type:"theme-switcher"}:t==="spacer"?{id:e,parentId:i,type:"spacer",size:"md"}:{id:e,parentId:i,text:"",url:"/",icon:"",visibility:"",permission:"",hidden:!1,bundled:!1}}export function insertBelow(t,e,i,n){const r=t.findIndex(o=>o.id===e);if(r===-1)return null;const a=newRow(i,n,t[r].parentId);return t.splice(r+1,0,a),a}export function addChild(t,e,i){const n=t.find(a=>a.id===e);if(!n||isStructural(n))return null;const r=newRow("item",i,n.id);return t.push(r),n.touched=!0,r}export function duplicateRow(t,e,i){const n=t.find(l=>l.id===e);if(!n||n.tool)return null;const r=new Map,a=[],o=(l,c)=>{if(l.tool)return;const d={...m(l),id:i(),parentId:c};delete d.tool,delete d.locked,d.touched=!0,r.set(l.id,d.id),a.push(d);for(const f of t.filter(u=>u.parentId===l.id))o(f,d.id)};if(o(n,n.parentId),!a.length)return null;a[0].text&&(a[0].text=`${a[0].text} (copy)`);const s=t.indexOf(n);return t.splice(s+1,0,a[0]),t.push(...a.slice(1)),a[0]}function m(t){return JSON.parse(JSON.stringify(t))}export function bindingFrom({slot:t="",projects:e=[],pagesText:i=""}={}){return t?{slot:t,projects:[...e],pages:String(i).split(`
|
|
2
|
+
`).map(n=>n.trim()).filter(Boolean)}:null}export function badPagePatterns(t=[]){return t.filter(e=>!/^\/[^\s?#*]*(\/\*)?$|^\/\*$/.test(e))}const g=["fontFamily","fontSize","fontWeight","letterSpacing","iconSize"];export function menuFromForm(t={},e={},i=null,n=[],r={}){const a=Object.fromEntries(g.filter(f=>t[f]).map(f=>[f,t[f]])),o={};if(t.position==="floating"){t.floatAnchor&&(o.anchor=t.floatAnchor);for(const[f,u]of[["offsetX",t.floatOffsetX],["offsetY",t.floatOffsetY],["width",t.floatWidth],["radius",t.floatRadius],["opacity",t.floatOpacity]])u!==""&&u!=null&&Number.isFinite(Number(u))&&(o[f]=Number(u));t.floatShadow&&(o.shadow=t.floatShadow),t.floatAccent&&(o.accent=t.floatAccent),t.floatTitle&&(o.title=String(t.floatTitle).trim()),t.floatCollapsible&&(o.collapsible=!0),t.floatCollapsible&&t.floatCollapsed&&(o.collapsed=!0),t.floatMovable&&(o.movable=!0),t.floatResizable&&(o.resizable=!0)}const s={};t.position!=="floating"&&(t.orientation==="vertical"?(t.dockWidth!==""&&t.dockWidth!=null&&Number.isFinite(Number(t.dockWidth))&&(s.width=Number(t.dockWidth)),t.dockAutohide?s.autohide=!0:t.dockCollapsible&&(s.collapsible=!0,t.dockCollapsed&&(s.collapsed=!0))):t.dockHideOnScroll&&(s.hideOnScroll=!0));const l={};t.highlightHover&&(l.hover=t.highlightHover),t.highlightActive&&(l.active=t.highlightActive),t.highlightAccent&&(l.accent=t.highlightAccent);const c={};t.entranceAnimation&&(c.animation=t.entranceAnimation);for(const[f,u]of[["stagger",t.entranceStagger],["duration",t.entranceDuration]])u!==""&&u!=null&&Number.isFinite(Number(u))&&(c[f]=Number(u));const d=!!t.entranceEnabled||"stagger"in c||"duration"in c||c.animation&&c.animation!=="fade";return{slug:String(e.slug||"").trim(),name:String(e.name||"").trim(),description:String(e.description||"").trim(),...t.variant&&{variant:t.variant},...t.position&&{position:t.position},...t.orientation&&{orientation:t.orientation},...t.orientation==="vertical"&&t.side&&{side:t.side},...t.orientation!=="vertical"&&t.align&&{align:t.align},...Object.keys(o).length&&{float:o},...Object.keys(l).length&&{highlight:l},...d&&{entrance:{enabled:!!t.entranceEnabled,...c}},...Object.keys(s).length&&{dock:s},...t.appearOnHover&&{appearOnHover:!0},...t.class&&String(t.class).trim()&&{class:String(t.class).trim()},...Object.keys(a).length&&{style:a},binding:i,items:n,meta:{...r||{},project:e.project||null}}}export function menuProblems(t){const e=[];/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(t.slug||"")||e.push("The slug must be lowercase letters, numbers and hyphens, no hyphen at either end (Meta tab)."),t.name||e.push("The menu needs a name (Meta tab).");const i=countUnlabelled(t.items);i&&e.push(`${i} item${i===1?" has":"s have"} no label - every item needs one (Items tab).`),t.dock?.width!=null&&!(t.dock.width>=160&&t.dock.width<=480)&&e.push("The rail width must be from 160 to 480 px (Behaviour tab).");const n=t.entrance||{};if(n.stagger!=null&&!(n.stagger>=0&&n.stagger<=1e3)&&e.push("The entrance delay between items must be from 0 to 1000 ms (Behaviour tab - switch Staggered entrance on to edit it)."),n.duration!=null&&!(n.duration>=50&&n.duration<=3e3)&&e.push("Each item's entrance animation must be from 50 to 3000 ms (Behaviour tab - switch Staggered entrance on to edit it)."),t.binding){const r=badPagePatterns(t.binding.pages);r.length&&e.push(`Not valid page patterns: ${r.join(", ")} (Binding tab).`)}return e}export function countUnlabelled(t=[]){let e=0;for(const i of t||[])!isStructural(i)&&!(i.ref===!0&&i.url)&&!String(i.text||"").trim()&&e++,e+=countUnlabelled(i.items);return e}export const snapshot=t=>JSON.stringify(t);export function depthOfItems(t){if(!Array.isArray(t)||!t.length)return 0;let e=0;for(const i of t){const n=Array.isArray(i.items)&&i.items.length?depthOfItems(i.items):0;n>e&&(e=n)}return e+1}export function locationRows(t=[],e={},i={},n=[],r={}){const a=Object.fromEntries(n.map(o=>[o.slug,o.name||o.slug]));return t.map(o=>{const s=e[o.slot]||"",l=s&&r[s]||0,c=!!s&&o.maxDepth!=null&&l>o.maxDepth,d=o.slot==="overlay";return{slot:o.slot,label:o.label||o.slot,source:o.source||"",description:o.description||"",menu:s,menuName:s?a[s]||`${s} (missing)`:"",missing:!!s&&!a[s],tooDeep:c,depthText:c?`Nested ${l} deep - this slot shows ${o.maxDepth}`:"",empty:!s,emptyText:s?"":d?"Optional":"Nothing mapped",changed:(e[o.slot]||"")!==(i[o.slot]||"")}})}export function locationsPayload(t={},e=[]){const i=new Set(e.map(n=>n.slot));return Object.fromEntries(Object.entries(t).filter(([n,r])=>r&&(!e.length||i.has(n))))}export function locationsSnapshot(t={}){return JSON.stringify(Object.keys(t).filter(e=>t[e]).sort().map(e=>[e,t[e]]))}
|
|
@@ -33,7 +33,7 @@ Banner content
|
|
|
33
33
|
[/accordion]`,children:{name:"item",min:2,max:12},attrs:[{name:"multiple",type:"checkbox",label:"Allow multiple open"},{name:"id",type:"text",label:"ID"}]},{name:"item",label:"Item",icon:"list",category:"Components",child:!0,selfClosing:!1,container:!0,wrappable:!1,template:'[item title="Item title"]Content[/item]',inline:!0,attrs:[{name:"title",type:"text",label:"Title"}]},{name:"carousel",label:"Carousel",icon:"carousel-insert",category:"Components",selfClosing:!1,container:!0,wrappable:!1,template:`[carousel autoplay="true" interval="5000"]
|
|
34
34
|
[slide title="Slide 1" image="/media/photo.jpg"]Caption.[/slide]
|
|
35
35
|
[slide title="Slide 2"]Text-only slide.[/slide]
|
|
36
|
-
[/carousel]`,children:{name:"slide",min:2,max:12},quickAttrs:["arrow-position","background","arrow-background","arrow-color"],attrs:[{name:"autoplay",type:"checkbox",label:"Autoplay"},{name:"interval",type:"number",label:"Interval (ms)"},{name:"loop",type:"checkbox",label:"Loop"},{name:"animation",type:"select",label:"Animation",options:[["slide","Slide"],["fade","Fade"],["crossfade","Crossfade"]]},{name:"animation-duration",type:"number",label:"Animation duration (ms)"},{name:"animation-easing",type:"text",label:"Animation easing"},{name:"arrow-position",type:"select",label:"Arrow position",options:[["middle","Middle"],["top","Top"],["bottom","Bottom"]]},{name:"background",type:"colour",label:"Background colour"},{name:"arrow-background",type:"colour",label:"Arrow background"},{name:"arrow-color",type:"colour",label:"Arrow colour"},{name:"id",type:"text",label:"ID"}]},{name:"slide",label:"Slide",icon:"image",category:"Components",child:!0,selfClosing:!1,container:!0,wrappable:!1,template:'[slide title="Slide title" image="/media/photo.jpg"]Caption[/slide]',inline:!0,attrs:[{name:"title",type:"text",label:"Title"},{name:"image",type:"image",label:"Image"}]},{name:"countdown",label:"Countdown",icon:"stopwatch",category:"Components",selfClosing:!0,container:!1,wrappable:!1,template:'[countdown to="2026-12-31" format="DD:HH:mm:ss" /]',attrs:[{name:"to",type:"text",label:"Target date (ISO)"},{name:"duration",type:"number",label:"Duration (seconds)"},{name:"format",type:"select",label:"Format",options:[["mm:ss","mm:ss"],["HH:mm:ss","HH:mm:ss"],["DD:HH:mm:ss","DD:HH:mm:ss"]]},{name:"id",type:"text",label:"ID"}]},{name:"timeline",label:"Timeline",icon:"activity",category:"Components",selfClosing:!1,container:!0,wrappable:!1,template:`[timeline layout="vertical" theme="modern"]
|
|
36
|
+
[/carousel]`,children:{name:"slide",min:2,max:12},quickAttrs:["height-mode","height","arrow-position","background","arrow-background","arrow-color"],attrs:[{name:"autoplay",type:"checkbox",label:"Autoplay"},{name:"interval",type:"number",label:"Interval (ms)"},{name:"loop",type:"checkbox",label:"Loop"},{name:"animation",type:"select",label:"Animation",options:[["slide","Slide"],["fade","Fade"],["crossfade","Crossfade"]]},{name:"animation-duration",type:"number",label:"Animation duration (ms)"},{name:"animation-easing",type:"text",label:"Animation easing"},{name:"height-mode",type:"select",label:"Image height",options:[["crop","Top-aligned crop (shortest image)"],["average","Average of shortest and tallest images"]]},{name:"height",type:"number",label:"Fixed height (px, optional)"},{name:"arrow-position",type:"select",label:"Arrow position",options:[["middle","Middle"],["top","Top"],["bottom","Bottom"]]},{name:"background",type:"colour",label:"Background colour"},{name:"arrow-background",type:"colour",label:"Arrow background"},{name:"arrow-color",type:"colour",label:"Arrow colour"},{name:"id",type:"text",label:"ID"}]},{name:"slide",label:"Slide",icon:"image",category:"Components",child:!0,selfClosing:!1,container:!0,wrappable:!1,template:'[slide title="Slide title" image="/media/photo.jpg"]Caption[/slide]',inline:!0,attrs:[{name:"title",type:"text",label:"Title"},{name:"image",type:"image",label:"Image"}]},{name:"countdown",label:"Countdown",icon:"stopwatch",category:"Components",selfClosing:!0,container:!1,wrappable:!1,template:'[countdown to="2026-12-31" format="DD:HH:mm:ss" /]',attrs:[{name:"to",type:"text",label:"Target date (ISO)"},{name:"duration",type:"number",label:"Duration (seconds)"},{name:"format",type:"select",label:"Format",options:[["mm:ss","mm:ss"],["HH:mm:ss","HH:mm:ss"],["DD:HH:mm:ss","DD:HH:mm:ss"]]},{name:"id",type:"text",label:"ID"}]},{name:"timeline",label:"Timeline",icon:"activity",category:"Components",selfClosing:!1,container:!0,wrappable:!1,template:`[timeline layout="vertical" theme="modern"]
|
|
37
37
|
[event title="Launch" date="2025-01-15" status="completed"]Launched.[/event]
|
|
38
38
|
[/timeline]`,children:{name:"event",min:1,max:20},custom:"timeline",attrs:[{name:"layout",type:"select",label:"Layout",options:[["vertical","Vertical"],["centred","Centred"],["horizontal","Horizontal"]]},{name:"theme",type:"select",label:"Theme",options:[["minimal","Minimal"],["corporate","Corporate"],["modern","Modern"]]},{name:"mode",type:"select",label:"Mode",options:[["timeline","Timeline"],["roadmap","Roadmap"]]},{name:"class",type:"text",label:"CSS class"},{name:"id",type:"text",label:"ID"}]},{name:"event",label:"Event",icon:"dot",category:"Components",child:!0,selfClosing:!1,container:!0,wrappable:!1,template:'[event title="Milestone" date="2025-01-15" status="completed"]Description[/event]',inline:!0,attrs:[{name:"title",type:"text",label:"Title"},{name:"date",type:"text",label:"Date"},{name:"status",type:"select",label:"Status",options:[["planned","Planned"],["in-progress","In progress"],["completed","Completed"],["blocked","Blocked"]]},{name:"icon",type:"icon",label:"Icon"}]},{name:"hero",label:"Hero",icon:"hero",category:"Content",selfClosing:!1,container:!0,wrappable:!0,template:`[hero title="Welcome" tagline="Build something great" size="lg" variant="gradient-blue"]
|
|
39
39
|
Optional body content.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{api as g,getUser as B}from"../api.js";import{isPathAllowed as pe}from"./admin-scope.js";import{colourToCss as Y,applyFloat as he,applyHighlight as ge,itemHighlightAttrs as be}from"/public/js/menu-decor.mjs?v=
|
|
1
|
+
import{api as g,getUser as B}from"../api.js";import{isPathAllowed as pe}from"./admin-scope.js";import{colourToCss as Y,applyFloat as he,applyHighlight as ge,itemHighlightAttrs as be}from"/public/js/menu-decor.mjs?v=20261014-menu-entrance";import{placeTools as ye,ensureLockedTools as ve,managePluginsItem as xe,stripItemByUrl as $e,insertFoldersBeforeSystem as we,pruneEmptyToolsFolder as ke,sidebarStateKey as J,canAny as U,filterByPermission as Se,MANAGE_PLUGINS_URL as Q}from"./sidebar-grouping.js";import{arrangeButtonMarkup as qe,canArrange as Ce,startArrange as Ae}from"./sidebar-arrange.js";import{collapseButtonMarkup as Fe,wireSidebarSize as Le,COLLAPSED_WIDTH as Ee}from"./sidebar-size.js";import{FREQUENT_MAX as ee,addFrequent as Te,frequentFolder as Be,moveFrequent as te,readFrequent as W,readFrequentHidden as He,removeFrequent as Me,saveFrequent as je,syncFrequent as Ne,writeFrequent as Pe,writeFrequentHidden as ne}from"./sidebar-frequent.js";import{hotkeyFor as se,hotkeyTitle as Re,setHotkeyTree as _e}from"./hotkeys-ui.js";import{hotkeyLabel as Ie}from"./hotkeys.js";function f(e){return String(e??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}const Oe=[{text:"Dashboard",url:"#/",icon:"home"},{text:"Site menus",url:"#/menus",icon:"menu",permission:"menus"}];async function Ue(e){if(!U(e,"projects"))return[];let n=[];try{n=await g.projects.listWithCounts()}catch{return[]}if(!Array.isArray(n))return[];const s=[{key:"pages",text:"Pages",icon:"file-text",path:"/pages"},{key:"collections",text:"Collections",icon:"database",path:"/collections"},{key:"forms",text:"Forms",icon:"layout",path:"/forms"},{key:"actions",text:"Actions",icon:"zap",path:"/actions"},{key:"menus",text:"Site menus",icon:"menu",path:"/menus"},{key:"blocks",text:"Blocks",icon:"box",path:"/blocks"},{key:"components",text:"Components",icon:"component",path:"/components"},{key:"views",text:"Views",icon:"eye",path:"/views"},{key:"roles",text:"Roles",icon:"shield",path:"/roles"},{key:"users",text:"Users",icon:"users",path:"/users"},{key:"apis",text:"APIs",icon:"code",path:"/apis"}];return n.map(t=>{const o="#/projects/"+encodeURIComponent(t.slug),a=t.counts||{},d=[{text:"Overview",url:o,icon:t.icon||"folder"}];for(const c of s){const r=Number(a[c.key])||0;r<=0||d.push({text:`${c.text} (${r})`,url:o+c.path,icon:c.icon})}d.push({text:"Settings",url:o+"/settings",icon:"settings"});const u=t.enabled===!1;return{text:t.name||t.slug,key:`project.${t.slug}`,icon:t.icon||"folder",items:d,...u&&{colour:"neutral",badge:{text:"off"}}}})}function ze(e,n){for(const s of e)if(!s.hidden&&(s.key==="projects"||!s.key&&(s.text||"").toLowerCase()==="projects")){s.items=Array.isArray(s.items)?s.items.slice():[],s.items.push(...n);return}}function oe(e,n){const s=ae.includes(n.tone)?n.tone:"info",t=n.label||String(n.count);n.details?P.set(e,n.details):P.delete(e);const i=!n.inventory&&F.some(o=>o.url===e&&!o.inventory)?" data-live":"";return`<span class="sidebar-badge sidebar-badge--${s}" data-count-for="${f(e)}"${i} data-badge-label="${f(t)}" aria-label="${f(t)}">${f(String(n.count))}</span>`}function ie(e){for(const n of e.querySelectorAll("details")){const s=n.querySelector(":scope > summary");if(!s)continue;let t=0,i=!1;const o=[];for(const r of n.querySelectorAll(":scope > .sidebar-children .sidebar-badge[data-live]")){const m=Number(r.textContent)||0;m&&(t+=m,i||(i=r.classList.contains("sidebar-badge--danger")),o.push({text:r.closest("a")?.querySelector(".sidebar-text")?.textContent.trim()??"",meta:r.dataset.badgeLabel,tone:r.classList.contains("sidebar-badge--danger")?"danger":void 0}))}const a=`folder:${n.dataset.stateKey||s.textContent.trim()}`;let d=s.querySelector(":scope > .sidebar-badge--sum");if(!t){d?.remove(),P.delete(a);continue}d||(d=document.createElement("span"),s.querySelector(".sidebar-text")?.after(d));const u=s.querySelector(".sidebar-text")?.textContent.trim()||"This folder",c=o.map(r=>`${r.text}: ${r.meta}`).join(" \xB7 ");d.className=`sidebar-badge sidebar-badge--sum sidebar-badge--${i?"danger":"info"}`,d.dataset.countFor=a,d.dataset.badgeLabel=c,d.setAttribute("aria-label",c),d.textContent=String(t),P.set(a,{title:u,items:o})}}const P=new Map;function We(e,n){if(!e.url||!n)return"";const s=n[e.url];return!s||!(s.count>0)&&!s.showZero?"":oe(e.url,s)}const ae=["info","attention","danger","live"],De={"#/pages":["page","pages"],"#/media":["file in the media library","files in the media library"],"#/menus":["menu","menus"],"#/context-menus":["context menu","context menus"],"#/theme":["element override in the theme","element overrides in the theme"],"#/collections":["collection","collections"],"#/forms":["form","forms"],"#/views":["view","views"],"#/actions":["action","actions"],"#/blocks":["block","blocks"],"#/components":["component","components"],"#/users":["user","users"],"#/plugins":["plugin installed","plugins installed"],"#/system/notifications":["unread notification","unread notifications"]};function D(e,{fallbackLabel:n="",tone:s="info"}={}){const t=Number(typeof e=="object"&&e!==null?e.count:e);if(!Number.isFinite(t)||t<0)return null;const i=typeof e?.label=="string"&&e.label||(n?`${t} - ${n}`:String(t)),o={count:Math.round(t),label:i,tone:ae.includes(e?.tone)?e.tone:s};return e?.details&&typeof e.details=="object"&&(o.details=e.details),e?.inventory===!0&&(o.inventory=!0),e?.showZero===!0&&(o.showZero=!0),o}function re(e,n,s=null,{inFrequent:t=!1}={}){if(e&&e.type==="separator")return'<hr class="sidebar-divider">';if(e&&e.type==="theme-switcher")return"";if(e&&e.type==="spacer"){const b=["xs","sm","md","lg","xl","flex"].includes(e.size)?e.size:"md";return`<div class="sidebar-spacer sidebar-spacer--${f(b)}" aria-hidden="true"></div>`}const i=String(e.text||"?").trim().charAt(0).toUpperCase()||"?",o=e.icon?`<span data-icon="${f(e.icon)}"></span>`:`<span class="sidebar-initial" aria-hidden="true">${f(i)}</span>`,a=f(e.text||""),d=e.url?f(e.url):"",u=Array.isArray(e.items)&&e.items.length>0,c=e.colour?Y(e.colour):"",r=be(e),m=[r.hover&&` data-menu-item-hover="${f(r.hover)}"`,r.active&&` data-menu-item-active="${f(r.active)}"`].filter(Boolean).join(""),y=[c&&`color:${f(c)}`,r.accent&&`--dm-menu-highlight:${f(r.accent)}`].filter(Boolean).join(";"),v=y?` style="${y}"`:"",k=e.url?Re(e.url,e.text||"",{inFrequent:t}):"",w=k?` title="${f(k)}"`:"";let L="";if(e.badge&&e.badge.text!=null&&e.badge.text!==""){const b=e.badge.variant?Y(e.badge.variant):"";L=`<span class="dm-menu-badge"${b?` style="background:${f(b)};color:var(--dm-text-inverse,#fff)"`:""}>${f(String(e.badge.text))}</span>`}if(e.frequent&&e.empty){const b=J(e,s),A=S.get(b)!==!1;return`<details data-state-key="${f(b)}"${A?" open":""} data-frequent data-frequent-empty>
|
|
2
2
|
<summary${v}>${o} <span class="sidebar-text">${a}</span></summary>
|
|
3
3
|
<div class="sidebar-children"><p class="sidebar-frequent-empty">Right-click any Tool and choose <strong>Add to Frequent</strong> to keep it here.</p></div>
|
|
4
4
|
</details>`}if(u){const b=J(e,s),A=S.get(b)!==!1,R=e.items.map(T=>re(T,n,b,{inFrequent:!!e.frequent})).join(""),j=e.frequent?' data-frequent title="Your Frequent Tools - right-click any Tool to add or remove it"':"";return`<details data-state-key="${f(b)}"${A?" open":""}${j}>
|
|
@@ -230,6 +230,28 @@
|
|
|
230
230
|
</div>
|
|
231
231
|
<small class="form-hint">Used by the colour, underline, overline, tint, glow and pill effects. The underline and overline effects fall back to the item's own text colour when this is unset.</small>
|
|
232
232
|
</div>
|
|
233
|
+
<div class="form-group">
|
|
234
|
+
<label>Staggered entrance
|
|
235
|
+
<span data-help-title="Staggered entrance" data-help="The items arrive one after another when the menu is drawn, like a row of cards revealing. A dropdown or footer column staggers in on its own when it opens. Visitors who have asked for less motion (their device setting, or the site's motion switch) see the items straight away."></span></label>
|
|
236
|
+
<label style="display:flex;align-items:center;gap:.5rem;font-weight:400;cursor:pointer">
|
|
237
|
+
<input type="checkbox" id="me-entrance-enabled" name="entranceEnabled" style="width:auto;margin:0">
|
|
238
|
+
Bring the items in one after another
|
|
239
|
+
</label>
|
|
240
|
+
<small class="form-hint">Applies wherever this menu is drawn on the site - navbar, footer, <code>[menu]</code> and floating panels.</small>
|
|
241
|
+
</div>
|
|
242
|
+
<div class="form-group dm-entrance-field" style="display:none">
|
|
243
|
+
<label for="me-entrance-animation">Entrance animation</label>
|
|
244
|
+
<!-- Filled from ENTRANCE_ANIMATIONS in menu-decor.mjs on mount. -->
|
|
245
|
+
<select id="me-entrance-animation" name="entranceAnimation" class="form-input"></select>
|
|
246
|
+
</div>
|
|
247
|
+
<div class="form-group dm-entrance-field" style="display:none">
|
|
248
|
+
<label for="me-entrance-stagger">Delay between items (ms)</label>
|
|
249
|
+
<input type="number" id="me-entrance-stagger" name="entranceStagger" class="form-input" placeholder="60" min="0" max="1000" step="10">
|
|
250
|
+
</div>
|
|
251
|
+
<div class="form-group dm-entrance-field" style="display:none">
|
|
252
|
+
<label for="me-entrance-duration">Each item's animation (ms)</label>
|
|
253
|
+
<input type="number" id="me-entrance-duration" name="entranceDuration" class="form-input" placeholder="400" min="50" max="3000" step="50">
|
|
254
|
+
</div>
|
|
233
255
|
<div class="form-group">
|
|
234
256
|
<label for="me-class">CSS classes
|
|
235
257
|
<span data-help-title="CSS classes" data-help="Your own class names, separated by spaces, added to the menu's outer element - the navbar, the footer column or the [menu] nav. Style them in Custom CSS. Each item can carry classes of its own too, in its editor."></span></label>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{api as O,apiRequest as Qe}from"../api.js";import{HIGHLIGHT_HOVER as Xe,HIGHLIGHT_ACTIVE as Ze,HIGHLIGHT_HOVER_LABELS as et,HIGHLIGHT_ACTIVE_LABELS as tt}from"/public/js/menu-decor.mjs?v=
|
|
1
|
+
import{api as O,apiRequest as Qe}from"../api.js";import{HIGHLIGHT_HOVER as Xe,HIGHLIGHT_ACTIVE as Ze,HIGHLIGHT_HOVER_LABELS as et,HIGHLIGHT_ACTIVE_LABELS as tt}from"/public/js/menu-decor.mjs?v=20261014-menu-entrance";import{addBannerAction as at}from"../lib/plugin-chrome.js";import{helpPopovers as Me}from"../lib/help-popover.js";import{onceClosed as Te,openMenuAt as He,sidebarCount as lt}from"../lib/tool-kit.js";import{FILTERS as st,WIDTHS as ot,WIDTH_HINTS as nt,WIDTH_LABELS as it,WIDTH_SHARE as $e,arrangeLayouts as ct,checkLayout as rt,checkOptions as dt,formFromPreset as ut}from"../lib/layouts-arrange.js";const ae=/^\/layouts\/?(\?.*)?$/,Le="#/layouts",le="layouts.draft",z="layouts.options.draft",se="layouts.filter",Oe=(l="")=>`
|
|
2
2
|
<span class="lyx-shape" aria-hidden="true" data-bind-style-background-color="bg${l}">
|
|
3
3
|
<span class="lyx-shape-nav" data-bind-hidden="!hasNav${l}"></span>
|
|
4
4
|
<span class="lyx-shape-body"><span class="lyx-shape-col" data-bind-style-width="share${l}"></span><span class="lyx-shape-side" data-bind-hidden="!hasSide${l}" data-bind-class="sideRight${l} && 'is-right'"></span></span>
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import{api as
|
|
2
|
-
<div class="menu-tree-row menu-tree-row--separator" data-id="${p.id}" tabindex="0" ${
|
|
1
|
+
import{api as N}from"../api.js";import{colourToCss as St,HIGHLIGHT_HOVER as lt,HIGHLIGHT_ACTIVE as it,HIGHLIGHT_HOVER_LABELS as ct,HIGHLIGHT_ACTIVE_LABELS as rt,cssClassProblems as dt,normaliseCssClasses as At,ENTRANCE_ANIMATIONS as qe,ENTRANCE_ANIMATION_LABELS as Et}from"/public/js/menu-decor.mjs?v=20261014-menu-entrance";import{openIconPicker as $t}from"../lib/card-builder.js";import{sortableMenuRows as xt}from"../lib/menu-drag.js";import{placeTools as Ct,ensureLockedTools as Lt,isLockedUrl as _t,groupKeyFor as It,slugify as Ht,GROUP_ICON as Tt,TOOLS_FOLDER_KEY as Rt}from"../lib/sidebar-grouping.js";import{flatten as ut,nest as Nt,uid as _e}from"../lib/menu-rows.js";import{addBannerAction as Ue}from"../lib/plugin-chrome.js";import{helpPopovers as Ot}from"../lib/help-popover.js";import{onceClosed as Dt,openMenuAt as Ge,sidebarCount as jt}from"../lib/tool-kit.js";import{addChild as Pt,bindingFrom as Bt,duplicateRow as Ft,indentRow as Mt,insertBelow as zt,isStructural as ae,menuFromForm as Wt,menuProblems as Kt,moveRow as mt,outdentRow as qt,siblingsOf as Ut,snapshot as Ie}from"../lib/menu-editor-arrange.js";import{fmtDateTime as Gt}from"../lib/dates.js";const Vt=760,Yt="admin-sidebar",Xt=/^\/menus\/(new|edit\/[^?#]+)(\?.*)?$/;function y(o){return String(o||"").replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<")}const He=o=>String(o??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""");function Jt(o,r){let i=0,c=r.find(s=>s.id===o);for(;c&&c.parentId;)i++,c=r.find(s=>s.id===c.parentId);return i}function pt(o){const r=new Set,i=new Set,c=s=>{for(const v of o.filter(k=>k.parentId===s))!v.type&&_t(v.url)&&!i.has(v.url)&&(i.add(v.url),r.add(v.id)),c(v.id)};return c(null),r}const Te='<button type="button" class="btn btn-sm btn-ghost mex-kebab" aria-label="Actions" title="Actions (right-click, or Shift+F10)">\u22EE</button>';function Qt(o,r,i=!1){const c=i?pt(r):new Set,s=[];function v(k){for(const p of r.filter(B=>B.parentId===k)){const x=`style="margin-left:${Jt(p.id,r)*28}px"`;if(p.type==="separator"){s.push(`
|
|
2
|
+
<div class="menu-tree-row menu-tree-row--separator" data-id="${p.id}" tabindex="0" ${x}>
|
|
3
3
|
<span class="menu-tree-grip" data-icon="grip-vertical" data-icon-size="18" title="Drag to move"></span>
|
|
4
4
|
<span class="me-sep-line"><span class="me-sep-label">Separator</span></span>
|
|
5
5
|
${Te}
|
|
6
|
-
</div>`);continue}if(p.type==="spacer"){const
|
|
7
|
-
<div class="menu-tree-row menu-tree-row--spacer" data-id="${p.id}" tabindex="0" ${
|
|
6
|
+
</div>`);continue}if(p.type==="spacer"){const ne=["xs","sm","md","lg","xl","flex"].map(F=>`<option value="${F}"${(p.size||"md")===F?" selected":""}>${F==="flex"?"flexible":F}</option>`).join("");s.push(`
|
|
7
|
+
<div class="menu-tree-row menu-tree-row--spacer" data-id="${p.id}" tabindex="0" ${x}>
|
|
8
8
|
<span class="menu-tree-grip" data-icon="grip-vertical" data-icon-size="18" title="Drag to move"></span>
|
|
9
9
|
<span class="me-spacer-line">
|
|
10
10
|
<span class="me-spacer-label">Spacer</span>
|
|
11
|
-
<select class="form-input me-spacer-size" title="Spacer size - flexible fills the leftover room" aria-label="Spacer size">${
|
|
11
|
+
<select class="form-input me-spacer-size" title="Spacer size - flexible fills the leftover room" aria-label="Spacer size">${ne}</select>
|
|
12
12
|
</span>
|
|
13
13
|
${Te}
|
|
14
14
|
</div>`);continue}if(p.type==="theme-switcher"){s.push(`
|
|
15
|
-
<div class="menu-tree-row menu-tree-row--switcher" data-id="${p.id}" tabindex="0" ${
|
|
15
|
+
<div class="menu-tree-row menu-tree-row--switcher" data-id="${p.id}" tabindex="0" ${x}>
|
|
16
16
|
<span class="menu-tree-grip" data-icon="grip-vertical" data-icon-size="18" title="Drag to move"></span>
|
|
17
17
|
<span class="me-sep-line"><span class="me-sep-label"><span data-icon="palette"></span> Theme switcher - the themes chosen under Theme > Theme switcher</span></span>
|
|
18
18
|
${Te}
|
|
19
|
-
</div>`);continue}const J=p.badge&&(p.badge.text||p.badge.countFrom)?`<span class="dm-menu-badge">${y(String(p.badge.text||"#"))}</span>`:"",C=p.tool,
|
|
20
|
-
<div class="menu-tree-row menu-tree-row--slim${p.hidden?" menu-tree-row--hidden":""}${C?" menu-tree-row--tool":""}${C&&!
|
|
19
|
+
</div>`);continue}const J=p.badge&&(p.badge.text||p.badge.countFrom)?`<span class="dm-menu-badge">${y(String(p.badge.text||"#"))}</span>`:"",C=p.tool,g=C&&(C.persisted||p.touched),q=C?C.orphan?' <span class="badge badge-secondary me-tool-badge" title="A placeholder for a Tool that is not enabled - it returns here when it is">Not enabled</span>':` <span class="badge badge-secondary me-tool-badge" title="${g?"A Tool, placed here by this menu":"A Tool in its default place - move or edit it to place it here"}">${y(C.source||"Tool")}${g?"":" \xB7 default"}</span>`:"",se=c.has(p.id),te=St(p.colour),U=te?` style="color:${y(te)}"`:"",le=se?'<button type="button" class="btn btn-sm btn-ghost" disabled title="Always shown - it can be moved, not hidden" aria-label="Always shown"><span data-icon="lock"></span></button>':`<button type="button" class="btn btn-sm btn-ghost me-hidden ${p.hidden?"active":""}" title="${p.hidden?"Hidden - click to show":"Hide"}" aria-label="${p.hidden?"Show":"Hide"}" aria-pressed="${p.hidden?"true":"false"}"><span data-icon="${p.hidden?"eye-off":"eye"}"></span></button>`;s.push(`
|
|
20
|
+
<div class="menu-tree-row menu-tree-row--slim${p.hidden?" menu-tree-row--hidden":""}${C?" menu-tree-row--tool":""}${C&&!g?" menu-tree-row--default":""}" data-id="${p.id}" tabindex="0" ${x}>
|
|
21
21
|
<span class="menu-tree-grip" data-icon="grip-vertical" data-icon-size="18" title="Drag to move"></span>
|
|
22
|
-
<span class="me-row-label${!p.text&&!C?" mex-untitled":""}"${
|
|
22
|
+
<span class="me-row-label${!p.text&&!C?" mex-untitled":""}"${U}>${y(p.text||C?.label||"(no label - click to add one)")}${J}${q}</span>
|
|
23
23
|
<span class="me-row-url">${y(p.url||"")}</span>
|
|
24
24
|
${le}
|
|
25
25
|
<button type="button" class="btn btn-sm btn-ghost me-edit" title="Edit" aria-label="Edit"><span data-icon="edit"></span></button>
|
|
26
26
|
${Te}
|
|
27
|
-
</div>`),g(p.id)}}g(null),o.innerHTML=s.join("")||'<p class="mex-note">No items yet - Add item, or right-click an item for more.</p>',I.scan(o)}function w(o,r={},...l){const i=document.createElement(o);Object.assign(i,r);for(const s of l)s!=null&&i.append(s);return i}function T(o,r,l){const i=w("label",{className:"form-field"},w("span",{className:"form-label",textContent:o}),r);return l&&i.append(w("small",{className:"form-hint",textContent:l,style:"display:block;font-size:.78em;opacity:.7;margin-top:.25rem;line-height:1.35"})),i}function Jt(o,r){const l=[["","- Everyone -"],["public","Public - anyone, incl. logged-out"],...(r||[]).map(s=>[s.name,`${s.label||s.name} and above`]),...(r||[]).filter(s=>s.level!==0).map(s=>[`=${s.name}`,`${s.label||s.name} only`]),["private","Private - super-admin only"]];o&&!l.some(([s])=>s===o)&&l.push([o,`${o} (custom)`]);const i=ee(l,o||"");return i.name="visibility",i}function ee(o,r){const l=w("select",{className:"form-select"});return o.forEach(([i,s])=>l.add(new Option(s,i))),l.value=r??"",l}function Re(o,r){const l=typeof r=="string"&&r.startsWith("#"),i=ee([["","- none -"],["primary","primary"],["success","success"],["danger","danger"],["warning","warning"],["info","info"],["neutral","neutral"],["__custom__","Custom\u2026"]],l?"__custom__":r||""),s=w("input",{type:"color",className:"form-input me-colour-hex",value:l?r:"#000000"});s.style.display=l?"":"none",i.addEventListener("change",()=>{s.style.display=i.value==="__custom__"?"":"none"});const g=T(o,i);return g.append(s),g._read=()=>i.value==="__custom__"?s.value:i.value,g}function Qt(o,r){const l=w("input",{className:"form-input me-icon",name:"icon",value:r||""}),i=w("span",{className:"me-icon-preview"});r&&i.setAttribute("data-icon",r);const s=w("button",{type:"button",className:"btn btn-sm btn-ghost",textContent:"Browse\u2026"}),g=k=>{k?i.setAttribute("data-icon",k):i.removeAttribute("data-icon"),Domma.icons.scan(i.parentNode||i)};return s.addEventListener("click",()=>$t(k=>{l.value=k,g(k)})),l.addEventListener("input",()=>g(l.value.trim())),T(o,w("div",{className:"me-icon-field"},l,s,i))}function je(...o){return w("div",{className:"me-field-grid"},...o)}async function Zt(o,r,l,i,s){const g=o.text||o.tool?.label||"",k=u=>w("h4",{className:"me-form-section",textContent:u}),p=T("Label",w("input",{className:"form-input",name:"text",value:o.text||""}),"The text shown for this item."),F=w("input",{className:"form-input",name:"url",value:o.url||""}),A=T("URL",F,o.tool||o.locked?"A Tool's address is its identity, so it cannot be changed here.":"Where it links. Must start with /, #, https://, or mailto: . Leave blank for a parent that only groups sub-items.");(o.tool||o.locked)&&(F.readOnly=!0);const J=Qt("Icon",o.icon||""),C=Jt(o.visibility||"",i),v=T("Visibility",C,o.locked?"Always in the sidebar for everyone who may use it, so it cannot be restricted here.":'Who can see this item. "Role and above" shows it to that role and anyone more senior; "Role only" shows it to holders of that role alone (and the super-admin). Blank = everyone.');o.locked&&(C.disabled=!0);const K=ee([["","- no permission gate -"],...(r||[]).map(u=>[u.key,u.label||u.key])],o.permission||"");K.name="permission";const se=T("Permission",K,o.tool||o.locked?"A Tool is guarded by its own permission, which always applies.":"Hide unless the viewer holds this specific permission. Independent of Visibility - both must pass.");(o.tool||o.locked)&&(K.disabled=!0);const te=T("Badge text",w("input",{className:"form-input",name:"badgeText",value:o.badge?.text||""})),q=ee([["","- none -"],...(l||[]).map(u=>[u.slug,u.title||u.slug])],o.badge?.countFrom||"");q.name="badgeCount";const le=T("Badge count from",q,"Show a live count of this collection\u2019s entries as the badge."),oe=Re("Badge colour",o.badge?.variant||""),B=ee([["link","Link"],["pill","Pill"]],o.pill?"pill":"link");B.name="renderAs";const De=T("Render as",B,"Pill draws the item as a rounded chip. Pill styling applies to top-level navbar items."),D=T("Pill style",ee([["filled","Filled"],["outline","Outline"]],o.pill?.style||"filled"));D.querySelector("select").name="pillStyle";const pe=Re("Pill colour",o.pill?.variant||""),ie=w("div",{className:"me-pill-wrap"},je(D,pe));ie.style.display=o.pill?"":"none",B.addEventListener("change",()=>{ie.style.display=B.value==="pill"?"":"none"});const h=Re("Text colour",o.colour||""),O=ee([["","- use the menu default -"],...st.map(u=>[u,it[u]||u])],o.highlight?.hover||"");O.name="hlHover";const ce=T("Hover effect",O,"Overrides the menu-wide hover effect for this item only."),he=ee([["","- use the menu default -"],...lt.map(u=>[u,ct[u]||u])],o.highlight?.active||"");he.name="hlActive";const Se=T("When selected",he,"How this item is marked when it points at the page being viewed."),z=Re("Highlight colour",o.highlight?.accent||""),L=w("input",{className:"form-input",name:"class",value:o.class||"",placeholder:"nav-cta push-right",autocomplete:"off",spellcheck:!1}),re=T("CSS classes",L,"Your own class names, separated by spaces, added to this item's <li> - target the link with .your-class > a. Style them in Custom CSS."),_=w("small",{className:"text-danger",style:"display:none;margin-top:.25rem"});re.append(_);const U=w("button",{className:"btn btn-primary",textContent:"Apply",title:"Apply to the item (Ctrl+Enter) - Save the menu to keep it"}),N=w("div",{className:"me-item-form"},k("Link"),p,A,J,k("Access"),je(v,se),k("Badge"),je(te,oe),le,k("Appearance"),De,ie,h,k("Highlighting"),je(ce,Se),z,k("Styling"),re,U),x=E.slideover({title:g?`Edit ${Ie(g)}`:"Edit menu item",size:"lg",position:"right"});x.element.appendChild(N);const fe=()=>JSON.stringify([...N.querySelectorAll("input, select, textarea")].map(u=>u.type==="checkbox"?u.checked:u.value)),$e=fe();let de=!1,ue=!1;jt(x);const G=x.close.bind(x);x.close=async u=>{if(!de&&u!==!0&&fe()!==$e){if(ue)return;ue=!0;const Q=await E.confirm("Discard the changes to this item?");if(ue=!1,!Q)return}return de=!0,G()},N.addEventListener("keydown",u=>{(u.ctrlKey||u.metaKey)&&u.key==="Enter"&&(u.preventDefault(),U.click())}),x.open();const ne=x.element.closest(".dm-slideover")||x.element.querySelector(".dm-slideover")||x.element;ne.style.setProperty("width",Ut+"px","important"),ne.style.setProperty("max-width","95vw","important"),Domma.icons.scan(N);const $=u=>N.querySelector(`[name="${u}"]`)?.value||"";U.addEventListener("click",()=>{const u=rt($("class"));if(u.length){_.textContent=u.join("; "),_.style.display="block",L.focus();return}o.class=St($("class")),o.text=$("text"),o.icon=$("icon"),o.locked||(o.visibility=$("visibility")),!o.tool&&!o.locked?(o.url=$("url"),o.permission=$("permission")):o.touched=!0;const Q=$("badgeText"),me=$("badgeCount"),ve=oe._read();if(o.badge=Q||me?{...Q&&{text:Q},...me&&{countFrom:me},...ve&&{variant:ve}}:null,$("renderAs")==="pill"){const we=pe._read();o.pill={style:$("pillStyle")||"filled",...we&&{variant:we}}}else o.pill=null;o.colour=h._read();const ge=$("hlHover"),be=$("hlActive"),ye=z._read();o.highlight=ge||be||ye?{...ge&&{hover:ge},...be&&{active:be},...ye&&{accent:ye}}:null,de=!0,x.close(!0),s()})}let W=null,pt=!1;function eo(){pt||!window.R?.use||(pt=!0,R.use((o,r,l)=>{const i=r?.path||"";return!(Vt.test(i)&&(o?.path||"")!==i)||!W?.dirty()?l():E.confirm(`You have unsaved changes to the menu "${Ie(W.name())}". Leave anyway? They are kept as a draft for your next visit.`).then(g=>{g?l():history.replaceState(null,"",`#${i}`)})}),M.subscribe("router:afterChange",({to:o}={})=>{if(W&&(o?.path||"")!==W.path){const r=W;W=null,r.dispose()}}))}function ht(o,r){const l=o.querySelector(".dm-plugin-banner-name"),i=l?.querySelector(".dm-plugin-banner-sep");if(!(!l||!i)){for(;i.nextSibling;)i.nextSibling.remove();l.appendChild(document.createTextNode(r))}}export const menuEditorView={templateUrl:"/admin/js/templates/menu-editor.html",async onMount(o){if(eo(),W){const e=W;W=null,e.dispose()}const r=[],l=e=>(r.push(e),e);let i=!1;const s=o.get(0).querySelector(".mex")||o.get(0),g=()=>!i&&s.isConnected,k=location.hash.replace(/^#/,""),p=location.hash.match(/^#\/menus\/edit\/([^?#]+)/),F=p?decodeURIComponent(p[1]):null,A=!F,J=`menu-editor.draft.${F||"new"}`,C=E.loader(o.get(0),{type:"dots"});let v,K,se,te,q,le,oe;try{if(A)v={slug:"",name:"",description:"",items:[]};else try{v=await j.menus.get(F)}catch(e){E.toast(`Failed to load menu: ${e.message||e}`,{type:"error"}),location.hash="#/menus";return}[K,se,te,q,le,oe]=await Promise.all([j.projects.list().catch(()=>[]),H.get("/api/auth/permissions-registry").catch(()=>({resources:[]})),j.collections.list().catch(()=>[]),j.get("/collections/roles/entries?limit=100").catch(()=>null),j.menuLocations.registry().catch(()=>[]),j.pages.list().catch(()=>[])])}finally{C.destroy()}if(!s.isConnected)return;const De=(Array.isArray(q)?q:q?.entries||[]).map(e=>({name:e.data?.name,label:e.data?.label,level:e.data?.level??99})).filter(e=>e.name).sort((e,t)=>t.level-e.level),D=!A&&F===Gt;let pe=[];if(D&&(pe=await H.get("/api/sidebar/registered-items").catch(()=>(E.toast("Could not load the Tools - they are not shown, and saving keeps their places as they are.",{type:"warning",duration:8e3}),[])),!s.isConnected))return;const ie=e=>dt(D?Et(At(e||[],pe,{forEditor:!0}),{leaveInHiddenFolders:!0}):e);let h=ie(v.items);const O=M.observable(!1),ce=M.observable(!1),he=M.observable(""),Se=M.observable(0);let z="";const L=s.querySelector("#me-items-list");function re(){Xt(L,h,D),Se.value=h.filter(e=>!ae(e)).length}const _=()=>{re(),Y()},U=()=>D?mt(h):new Set,N=e=>h.find(t=>t.id===e);function x(e){requestAnimationFrame(()=>L.querySelector(`.menu-tree-row[data-id="${CSS.escape(e)}"]`)?.focus())}function fe(e){const t=f=>h.find(c=>!c.type&&!c.url&&!c.tool&&(c.key||"").toLowerCase()===f)||h.find(c=>!c.type&&!c.url&&!c.tool&&!c.key&&(c.text||"").toLowerCase()===f);let a=t(String(e.tool.folder||"").toLowerCase())||t(It);const m=String(e.tool.group||"").trim();if(a&&m){const f=Lt(a.key||_t(a.text),m),c=d=>d!==e&&!d.type&&!d.url&&!d.tool;let b=h.find(d=>c(d)&&(d.key||"").toLowerCase()===f)||h.find(d=>c(d)&&d.parentId===a.id&&(!d.key||d.key.toLowerCase()===f)&&(d.text||"").toLowerCase()===m.toLowerCase());b||([b]=dt([{text:m,key:f,icon:Ht,synthesised:!0}],a.id),h.push(b)),a=b}e.parentId=a?a.id:null,h.splice(h.indexOf(e),1),h.push(e),Object.assign(e,{text:e.tool.defaults.text,icon:e.tool.defaults.icon,visibility:"",hidden:!1,badge:null,pill:null,colour:"",highlight:null,touched:!1}),e.tool={...e.tool,persisted:!1}}const $e=e=>!U().has(e.id)&&!(e.tool&&!e.tool.orphan);async function de(e){const t=N(e);if(!t||!$e(t))return;const a=d=>{let X=d;for(;X;){if(X.id===e)return!0;X=h.find(P=>P.id===X.parentId)}return!1},m=h.filter(d=>d.id!==e&&a(d));if(m.length&&!await E.confirm(`Remove "${Ie(t.text||t.type||"this item")}" and the ${m.length} item${m.length===1?"":"s"} beneath it?`))return;const f=U(),c=m.filter(d=>d.tool),b=m.filter(d=>!d.tool&&f.has(d.id));h=h.filter(d=>!a(d)||c.includes(d)||b.includes(d));for(const d of b)d.parentId=t.parentId??null;for(const d of c)d.tool.orphan?d.parentId=t.parentId??null:fe(d);_()}function ue(e){const t=N(e);!t||ae(t)||U().has(e)||(t.hidden=!t.hidden,t.touched=!0,_())}function G(e){const t=N(e);!t||ae(t)||(t.locked=D&&U().has(t.id),Zt(t,se.resources||[],te,De,()=>{_(),x(e)}))}function ne(e){const t={id:_e(),parentId:null,...e==="separator"||e==="theme-switcher"?{type:e}:e==="spacer"?{type:e,size:"md"}:{text:"",url:"/",icon:"",visibility:"",permission:"",hidden:!1,bundled:!1}};h.push(t),_(),ae(t)?x(t.id):G(t.id)}const $=e=>t=>{e(t)&&(_(),x(t))},u=$(e=>ut(h,e,-1)),Q=$(e=>ut(h,e,1)),me=$(e=>Ft(h,e)),ve=$(e=>Wt(h,e));function ge(e){const t=N(e);if(!t)return[];const a=ae(t),m=U().has(e),f=Kt(h,e),c=f.findIndex(P=>P.id===e),b=t.tool,d=b&&(b.persisted||t.touched),X=P=>()=>{const ke=Bt(h,e,P,_e());_(),ke&&!ae(ke)?G(ke.id):ke&&x(ke.id)};return[{header:a?{separator:"Separator",spacer:"Spacer","theme-switcher":"Theme switcher"}[t.type]:t.text||b?.label||"(untitled)"},...a?[]:[{label:"Edit\u2026",icon:"edit",action:()=>G(e)}],{type:"divider"},{label:"Add item below",icon:"plus",action:X("item")},{label:"Add sub-item",icon:"corner-down-right",disabled:a,action:()=>{const P=Ot(h,e,_e());_(),P&&G(P.id)}},{label:"Add separator below",icon:"minus",action:X("separator")},{label:"Add spacer below",icon:"move",action:X("spacer")},...D?[]:[{label:"Add theme switcher below",icon:"palette",action:X("theme-switcher")}],{type:"divider"},{label:"Move up",icon:"arrow-up",shortcut:"Alt+\u2191",disabled:c<=0,action:()=>u(e)},{label:"Move down",icon:"arrow-down",shortcut:"Alt+\u2193",disabled:c<0||c>=f.length-1,action:()=>Q(e)},{label:"Indent",icon:"chevron-right",shortcut:"Alt+\u2192",disabled:c<=0||ae(f[c-1]),action:()=>me(e)},{label:"Outdent",icon:"chevron-left",shortcut:"Alt+\u2190",disabled:t.parentId==null,action:()=>ve(e)},{type:"divider"},...a?[]:[{label:t.hidden?"Show":"Hide",icon:t.hidden?"eye":"eye-off",disabled:m,action:()=>ue(e)}],{label:"Duplicate",icon:"copy",disabled:!!b,action:()=>{const P=Pt(h,e,_e);_(),P&&x(P.id)}},...b&&!b.orphan&&d?[{label:"Back to its default place",icon:"rotate-ccw",action:()=>{fe(t),_()}}]:[],{label:m?"Remove - always in the sidebar":b&&!b.orphan?"Remove - a Tool is hidden, not removed":"Remove\u2026",icon:"trash",danger:!0,disabled:!$e(t),action:()=>de(e)}]}const be=E.contextMenu(L,{cursor:"glyph",match:".menu-tree-row",inherit:!1,density:"compact",items:e=>ge(e.dataset.id)});l(()=>be?.destroy?.());const ye=xt(L,()=>h,_,{items:".menu-tree-row",handle:".menu-tree-grip"});l(()=>ye?.destroy());const we=e=>{const t=e.target.closest(".menu-tree-row");if(!t)return;const a=t.dataset.id;if(e.target.closest(".mex-kebab")){Ue(e.target.closest(".mex-kebab"));return}if(e.target.closest(".me-hidden")){ue(a);return}if(e.target.closest(".me-edit")){G(a);return}e.target.closest("select, .menu-tree-grip, button")||G(a)},Ge=e=>{const t=e.target.closest(".menu-tree-row");if(!t||e.target!==t){t&&e.key==="F10"&&e.shiftKey&&(e.preventDefault(),Ue(t));return}const a=t.dataset.id;if(e.key==="F10"&&e.shiftKey)e.preventDefault(),Ue(t);else if(e.key==="Enter")e.preventDefault(),G(a);else if(e.key==="Delete")e.preventDefault(),de(a);else if(e.altKey&&e.key==="ArrowUp")e.preventDefault(),u(a);else if(e.altKey&&e.key==="ArrowDown")e.preventDefault(),Q(a);else if(e.altKey&&e.key==="ArrowRight")e.preventDefault(),me(a);else if(e.altKey&&e.key==="ArrowLeft")e.preventDefault(),ve(a);else if(e.key==="ArrowDown"||e.key==="ArrowUp"){const m=[...L.querySelectorAll(".menu-tree-row")],f=m.indexOf(t)+(e.key==="ArrowDown"?1:-1);m[f]&&(e.preventDefault(),m[f].focus())}},Ve=e=>{if(!e.target.matches(".me-spacer-size"))return;const t=N(e.target.closest(".menu-tree-row")?.dataset.id);t&&(t.size=e.target.value,Y())};L.addEventListener("click",we),L.addEventListener("keydown",Ge),L.addEventListener("change",Ve),l(()=>{L.removeEventListener("click",we),L.removeEventListener("keydown",Ge),L.removeEventListener("change",Ve)});const n=e=>o.find(e),xe=n("#me-float-accent"),Oe=n("#me-float-accent-hex"),Ne=()=>{Oe.get(0).style.display=xe.val()==="__custom__"?"":"none"},ft=()=>xe.val()==="__custom__"?Oe.val():xe.val(),Ae=n("#me-highlight-accent"),Pe=n("#me-highlight-accent-hex"),Ye=()=>{Pe.get(0).style.display=Ae.val()==="__custom__"?"":"none"},vt=()=>Ae.val()==="__custom__"?Pe.val():Ae.val(),Xe=()=>{const e=n("#me-position").val()==="floating";n(".dm-float-field").each(function(){this.style.display=e?"":"none"}),e&&Ne();const t=n("#me-orientation").val()==="vertical";n(".dm-vertical-field").each(function(){this.style.display=t?"":"none"}),n(".dm-dock-rail-field").each(function(){this.style.display=t&&!e?"":"none"}),n(".dm-dock-bar-field").each(function(){this.style.display=!t&&!e?"":"none"});const a=!!(n("#me-dock-collapsible").get(0)||{}).checked,m=!!(n("#me-dock-autohide").get(0)||{}).checked;n(".dm-dock-collapsed-field").each(function(){this.style.display=a&&!m?"":"none"});const f=!!(n("#me-float-collapsible").get(0)||{}).checked;n(".dm-float-collapsed-field").each(function(){this.style.display=e&&f?"":"none"})},Je=(e,t,a,m)=>{const f=n(e).get(0);f&&(f.innerHTML="",f.add(new Option(m,"")),t.forEach(c=>f.add(new Option(a[c]||c,c))))};Je("#me-highlight-hover",st,it,"- theme default -"),Je("#me-highlight-active",lt,ct,"- theme default -");const Fe=n("#me-bind-slot"),Be=n("#me-bind-projects"),Ee=n("#me-bind-pages");Fe.html('<option value="">- not bound -</option>'+(le||[]).map(e=>`<option value="${y(e.slot)}">${y(e.label||e.slot)} (${y(e.slot)})</option>`).join("")),Be.html(K.map(e=>`<option value="${y(e.slug)}">${y(e.name||e.slug)}</option>`).join("")),n("#me-bind-page-pick").html('<option value="">- pick a page -</option>'+oe.map(e=>{const t=e.urlPath||e.url||"";return t?`<option value="${y(t)}">${y(e.title||t)} - ${y(t)}</option>`:""}).join(""));const Qe=()=>Nt({slot:Fe.val(),projects:Array.from(Be.get(0).selectedOptions).map(e=>e.value),pagesText:Ee.val()});function ze(){const e=Qe(),t=n("#me-bind-summary");if(!e){t.html('<span class="text-muted">Not bound - this menu renders only where it is mapped or placed by a shortcode.</span>');return}const a=[];e.projects.length&&a.push(`pages in ${e.projects.map(c=>`<code>${y(c)}</code>`).join(", ")}`),e.pages.length&&a.push(`pages matching ${e.pages.map(c=>`<code>${y(c)}</code>`).join(", ")}`);const m=e.pages.filter(c=>!/^\/[^\s?#*]*(\/\*)?$|^\/\*$/.test(c)),f=m.length?`<div class="text-danger" style="margin-top:.4rem">Not valid page patterns: ${m.map(c=>`<code>${y(c)}</code>`).join(", ")}</div>`:"";t.html(a.length?`Takes over the <code>${y(e.slot)}</code> slot on ${a.join(" and ")}.${f}`:`<span class="text-warning">Slot <code>${y(e.slot)}</code> selected but no project or page chosen - the binding will never match.</span>`)}const{getProjectFromHash:gt}=await import("../lib/project-context.js");if(!g())return;const bt=A?gt():null;n("#me-project").html('<option value="">- none -</option>'+K.map(e=>`<option value="${y(e.slug)}">${y(e.name||e.slug)}</option>`).join(""));function Me(e){h=ie(e.items),n("#me-variant").val(e.variant||""),n("#me-position").val(e.position||"");const t=n("#me-appearOnHover").get(0);t&&(t.checked=e.appearOnHover===!0),n("#me-float-anchor").val(e.float?.anchor||"TL"),n("#me-float-offsetX").val(e.float?.offsetX??""),n("#me-float-offsetY").val(e.float?.offsetY??""),n("#me-float-width").val(e.float?.width??""),n("#me-float-radius").val(e.float?.radius??""),n("#me-float-shadow").val(e.float?.shadow||""),n("#me-float-opacity").val(e.float?.opacity??""),n("#me-float-title").val(e.float?.title||"");for(const[c,b]of[["#me-float-collapsible",e.float?.collapsible],["#me-float-collapsed",e.float?.collapsed],["#me-float-movable",e.float?.movable],["#me-float-resizable",e.float?.resizable]]){const d=n(c).get(0);d&&(d.checked=b===!0)}const a=e.float?.accent||"";xe.val(a.startsWith("#")?"__custom__":a),a.startsWith("#")&&Oe.val(a),Ne(),n("#me-orientation").val(e.orientation||""),n("#me-align").val(e.align||""),n("#me-side").val(e.side||"left"),n("#me-dock-width").val(e.dock?.width??"");for(const c of["collapsible","collapsed","autohide","hideOnScroll"]){const b=n(`#me-dock-${c}`).get(0);b&&(b.checked=e.dock?.[c]===!0)}n("#me-class").val(e.class||""),n("#me-highlight-hover").val(e.highlight?.hover||""),n("#me-highlight-active").val(e.highlight?.active||"");const m=e.highlight?.accent||"";Ae.val(m.startsWith("#")?"__custom__":m),m.startsWith("#")&&Pe.val(m),Ye(),n("#me-fontFamily").val(e.style?.fontFamily||""),n("#me-fontSize").val(e.style?.fontSize||""),n("#me-fontWeight").val(e.style?.fontWeight||""),n("#me-letterSpacing").val(e.style?.letterSpacing||""),n("#me-iconSize").val(e.style?.iconSize||""),Fe.val(e.binding?.slot||"");const f=new Set(e.binding?.projects||[]);Array.from(Be.get(0).options).forEach(c=>{c.selected=f.has(c.value)}),Ee.val((e.binding?.pages||[]).join(`
|
|
28
|
-
`)),n("#me-slug").val(e.slug||""),n("#me-name").val(e.name||""),n("#me-description").val(e.description||""),n("#me-project").val(e.meta?.project||
|
|
29
|
-
`).map(a=>a.trim()).filter(Boolean);t.includes(e)||t.push(e),
|
|
30
|
-
`)),
|
|
27
|
+
</div>`),v(p.id)}}v(null),o.innerHTML=s.join("")||'<p class="mex-note">No items yet - Add item, or right-click an item for more.</p>',I.scan(o)}function w(o,r={},...i){const c=document.createElement(o);Object.assign(c,r);for(const s of i)s!=null&&c.append(s);return c}function T(o,r,i){const c=w("label",{className:"form-field"},w("span",{className:"form-label",textContent:o}),r);return i&&c.append(w("small",{className:"form-hint",textContent:i,style:"display:block;font-size:.78em;opacity:.7;margin-top:.25rem;line-height:1.35"})),c}function Zt(o,r){const i=[["","- Everyone -"],["public","Public - anyone, incl. logged-out"],...(r||[]).map(s=>[s.name,`${s.label||s.name} and above`]),...(r||[]).filter(s=>s.level!==0).map(s=>[`=${s.name}`,`${s.label||s.name} only`]),["private","Private - super-admin only"]];o&&!i.some(([s])=>s===o)&&i.push([o,`${o} (custom)`]);const c=ee(i,o||"");return c.name="visibility",c}function ee(o,r){const i=w("select",{className:"form-select"});return o.forEach(([c,s])=>i.add(new Option(s,c))),i.value=r??"",i}function Re(o,r){const i=typeof r=="string"&&r.startsWith("#"),c=ee([["","- none -"],["primary","primary"],["success","success"],["danger","danger"],["warning","warning"],["info","info"],["neutral","neutral"],["__custom__","Custom\u2026"]],i?"__custom__":r||""),s=w("input",{type:"color",className:"form-input me-colour-hex",value:i?r:"#000000"});s.style.display=i?"":"none",c.addEventListener("change",()=>{s.style.display=c.value==="__custom__"?"":"none"});const v=T(o,c);return v.append(s),v._read=()=>c.value==="__custom__"?s.value:c.value,v}function en(o,r){const i=w("input",{className:"form-input me-icon",name:"icon",value:r||""}),c=w("span",{className:"me-icon-preview"});r&&c.setAttribute("data-icon",r);const s=w("button",{type:"button",className:"btn btn-sm btn-ghost",textContent:"Browse\u2026"}),v=k=>{k?c.setAttribute("data-icon",k):c.removeAttribute("data-icon"),Domma.icons.scan(c.parentNode||c)};return s.addEventListener("click",()=>$t(k=>{i.value=k,v(k)})),i.addEventListener("input",()=>v(i.value.trim())),T(o,w("div",{className:"me-icon-field"},i,s,c))}function Ne(...o){return w("div",{className:"me-field-grid"},...o)}async function tn(o,r,i,c,s){const v=o.text||o.tool?.label||"",k=u=>w("h4",{className:"me-form-section",textContent:u}),p=T("Label",w("input",{className:"form-input",name:"text",value:o.text||""}),"The text shown for this item."),B=w("input",{className:"form-input",name:"url",value:o.url||""}),x=T("URL",B,o.tool||o.locked?"A Tool's address is its identity, so it cannot be changed here.":"Where it links. Must start with /, #, https://, or mailto: . Leave blank for a parent that only groups sub-items.");(o.tool||o.locked)&&(B.readOnly=!0);const J=en("Icon",o.icon||""),C=Zt(o.visibility||"",c),g=T("Visibility",C,o.locked?"Always in the sidebar for everyone who may use it, so it cannot be restricted here.":'Who can see this item. "Role and above" shows it to that role and anyone more senior; "Role only" shows it to holders of that role alone (and the super-admin). Blank = everyone.');o.locked&&(C.disabled=!0);const q=ee([["","- no permission gate -"],...(r||[]).map(u=>[u.key,u.label||u.key])],o.permission||"");q.name="permission";const se=T("Permission",q,o.tool||o.locked?"A Tool is guarded by its own permission, which always applies.":"Hide unless the viewer holds this specific permission. Independent of Visibility - both must pass.");(o.tool||o.locked)&&(q.disabled=!0);const te=T("Badge text",w("input",{className:"form-input",name:"badgeText",value:o.badge?.text||""})),U=ee([["","- none -"],...(i||[]).map(u=>[u.slug,u.title||u.slug])],o.badge?.countFrom||"");U.name="badgeCount";const le=T("Badge count from",U,"Show a live count of this collection\u2019s entries as the badge."),ne=Re("Badge colour",o.badge?.variant||""),F=ee([["link","Link"],["pill","Pill"]],o.pill?"pill":"link");F.name="renderAs";const Oe=T("Render as",F,"Pill draws the item as a rounded chip. Pill styling applies to top-level navbar items."),O=T("Pill style",ee([["filled","Filled"],["outline","Outline"]],o.pill?.style||"filled"));O.querySelector("select").name="pillStyle";const pe=Re("Pill colour",o.pill?.variant||""),ie=w("div",{className:"me-pill-wrap"},Ne(O,pe));ie.style.display=o.pill?"":"none",F.addEventListener("change",()=>{ie.style.display=F.value==="pill"?"":"none"});const h=Re("Text colour",o.colour||""),D=ee([["","- use the menu default -"],...lt.map(u=>[u,ct[u]||u])],o.highlight?.hover||"");D.name="hlHover";const ce=T("Hover effect",D,"Overrides the menu-wide hover effect for this item only."),he=ee([["","- use the menu default -"],...it.map(u=>[u,rt[u]||u])],o.highlight?.active||"");he.name="hlActive";const Se=T("When selected",he,"How this item is marked when it points at the page being viewed."),z=Re("Highlight colour",o.highlight?.accent||""),L=w("input",{className:"form-input",name:"class",value:o.class||"",placeholder:"nav-cta push-right",autocomplete:"off",spellcheck:!1}),re=T("CSS classes",L,"Your own class names, separated by spaces, added to this item's <li> - target the link with .your-class > a. Style them in Custom CSS."),_=w("small",{className:"text-danger",style:"display:none;margin-top:.25rem"});re.append(_);const G=w("button",{className:"btn btn-primary",textContent:"Apply",title:"Apply to the item (Ctrl+Enter) - Save the menu to keep it"}),j=w("div",{className:"me-item-form"},k("Link"),p,x,J,k("Access"),Ne(g,se),k("Badge"),Ne(te,ne),le,k("Appearance"),Oe,ie,h,k("Highlighting"),Ne(ce,Se),z,k("Styling"),re,G),$=E.slideover({title:v?`Edit ${He(v)}`:"Edit menu item",size:"lg",position:"right"});$.element.appendChild(j);const fe=()=>JSON.stringify([...j.querySelectorAll("input, select, textarea")].map(u=>u.type==="checkbox"?u.checked:u.value)),Ae=fe();let de=!1,ue=!1;Dt($);const V=$.close.bind($);$.close=async u=>{if(!de&&u!==!0&&fe()!==Ae){if(ue)return;ue=!0;const Q=await E.confirm("Discard the changes to this item?");if(ue=!1,!Q)return}return de=!0,V()},j.addEventListener("keydown",u=>{(u.ctrlKey||u.metaKey)&&u.key==="Enter"&&(u.preventDefault(),G.click())}),$.open();const oe=$.element.closest(".dm-slideover")||$.element.querySelector(".dm-slideover")||$.element;oe.style.setProperty("width",Vt+"px","important"),oe.style.setProperty("max-width","95vw","important"),Domma.icons.scan(j);const A=u=>j.querySelector(`[name="${u}"]`)?.value||"";G.addEventListener("click",()=>{const u=dt(A("class"));if(u.length){_.textContent=u.join("; "),_.style.display="block",L.focus();return}o.class=At(A("class")),o.text=A("text"),o.icon=A("icon"),o.locked||(o.visibility=A("visibility")),!o.tool&&!o.locked?(o.url=A("url"),o.permission=A("permission")):o.touched=!0;const Q=A("badgeText"),me=A("badgeCount"),ge=ne._read();if(o.badge=Q||me?{...Q&&{text:Q},...me&&{countFrom:me},...ge&&{variant:ge}}:null,A("renderAs")==="pill"){const we=pe._read();o.pill={style:A("pillStyle")||"filled",...we&&{variant:we}}}else o.pill=null;o.colour=h._read();const ve=A("hlHover"),be=A("hlActive"),ye=z._read();o.highlight=ve||be||ye?{...ve&&{hover:ve},...be&&{active:be},...ye&&{accent:ye}}:null,de=!0,$.close(!0),s()})}let K=null,ht=!1;function nn(){ht||!window.R?.use||(ht=!0,R.use((o,r,i)=>{const c=r?.path||"";return!(Xt.test(c)&&(o?.path||"")!==c)||!K?.dirty()?i():E.confirm(`You have unsaved changes to the menu "${He(K.name())}". Leave anyway? They are kept as a draft for your next visit.`).then(v=>{v?i():history.replaceState(null,"",`#${c}`)})}),M.subscribe("router:afterChange",({to:o}={})=>{if(K&&(o?.path||"")!==K.path){const r=K;K=null,r.dispose()}}))}function ft(o,r){const i=o.querySelector(".dm-plugin-banner-name"),c=i?.querySelector(".dm-plugin-banner-sep");if(!(!i||!c)){for(;c.nextSibling;)c.nextSibling.remove();i.appendChild(document.createTextNode(r))}}export const menuEditorView={templateUrl:"/admin/js/templates/menu-editor.html",async onMount(o){if(nn(),K){const e=K;K=null,e.dispose()}const r=[],i=e=>(r.push(e),e);let c=!1;const s=o.get(0).querySelector(".mex")||o.get(0),v=()=>!c&&s.isConnected,k=location.hash.replace(/^#/,""),p=location.hash.match(/^#\/menus\/edit\/([^?#]+)/),B=p?decodeURIComponent(p[1]):null,x=!B,J=`menu-editor.draft.${B||"new"}`,C=E.loader(o.get(0),{type:"dots"});let g,q,se,te,U,le,ne;try{if(x)g={slug:"",name:"",description:"",items:[]};else try{g=await N.menus.get(B)}catch(e){E.toast(`Failed to load menu: ${e.message||e}`,{type:"error"}),location.hash="#/menus";return}[q,se,te,U,le,ne]=await Promise.all([N.projects.list().catch(()=>[]),H.get("/api/auth/permissions-registry").catch(()=>({resources:[]})),N.collections.list().catch(()=>[]),N.get("/collections/roles/entries?limit=100").catch(()=>null),N.menuLocations.registry().catch(()=>[]),N.pages.list().catch(()=>[])])}finally{C.destroy()}if(!s.isConnected)return;const Oe=(Array.isArray(U)?U:U?.entries||[]).map(e=>({name:e.data?.name,label:e.data?.label,level:e.data?.level??99})).filter(e=>e.name).sort((e,t)=>t.level-e.level),O=!x&&B===Yt;let pe=[];if(O&&(pe=await H.get("/api/sidebar/registered-items").catch(()=>(E.toast("Could not load the Tools - they are not shown, and saving keeps their places as they are.",{type:"warning",duration:8e3}),[])),!s.isConnected))return;const ie=e=>ut(O?Lt(Ct(e||[],pe,{forEditor:!0}),{leaveInHiddenFolders:!0}):e);let h=ie(g.items);const D=M.observable(!1),ce=M.observable(!1),he=M.observable(""),Se=M.observable(0);let z="";const L=s.querySelector("#me-items-list");function re(){Qt(L,h,O),Se.value=h.filter(e=>!ae(e)).length}const _=()=>{re(),Y()},G=()=>O?pt(h):new Set,j=e=>h.find(t=>t.id===e);function $(e){requestAnimationFrame(()=>L.querySelector(`.menu-tree-row[data-id="${CSS.escape(e)}"]`)?.focus())}function fe(e){const t=f=>h.find(l=>!l.type&&!l.url&&!l.tool&&(l.key||"").toLowerCase()===f)||h.find(l=>!l.type&&!l.url&&!l.tool&&!l.key&&(l.text||"").toLowerCase()===f);let a=t(String(e.tool.folder||"").toLowerCase())||t(Rt);const m=String(e.tool.group||"").trim();if(a&&m){const f=It(a.key||Ht(a.text),m),l=d=>d!==e&&!d.type&&!d.url&&!d.tool;let b=h.find(d=>l(d)&&(d.key||"").toLowerCase()===f)||h.find(d=>l(d)&&d.parentId===a.id&&(!d.key||d.key.toLowerCase()===f)&&(d.text||"").toLowerCase()===m.toLowerCase());b||([b]=ut([{text:m,key:f,icon:Tt,synthesised:!0}],a.id),h.push(b)),a=b}e.parentId=a?a.id:null,h.splice(h.indexOf(e),1),h.push(e),Object.assign(e,{text:e.tool.defaults.text,icon:e.tool.defaults.icon,visibility:"",hidden:!1,badge:null,pill:null,colour:"",highlight:null,touched:!1}),e.tool={...e.tool,persisted:!1}}const Ae=e=>!G().has(e.id)&&!(e.tool&&!e.tool.orphan);async function de(e){const t=j(e);if(!t||!Ae(t))return;const a=d=>{let X=d;for(;X;){if(X.id===e)return!0;X=h.find(P=>P.id===X.parentId)}return!1},m=h.filter(d=>d.id!==e&&a(d));if(m.length&&!await E.confirm(`Remove "${He(t.text||t.type||"this item")}" and the ${m.length} item${m.length===1?"":"s"} beneath it?`))return;const f=G(),l=m.filter(d=>d.tool),b=m.filter(d=>!d.tool&&f.has(d.id));h=h.filter(d=>!a(d)||l.includes(d)||b.includes(d));for(const d of b)d.parentId=t.parentId??null;for(const d of l)d.tool.orphan?d.parentId=t.parentId??null:fe(d);_()}function ue(e){const t=j(e);!t||ae(t)||G().has(e)||(t.hidden=!t.hidden,t.touched=!0,_())}function V(e){const t=j(e);!t||ae(t)||(t.locked=O&&G().has(t.id),tn(t,se.resources||[],te,Oe,()=>{_(),$(e)}))}function oe(e){const t={id:_e(),parentId:null,...e==="separator"||e==="theme-switcher"?{type:e}:e==="spacer"?{type:e,size:"md"}:{text:"",url:"/",icon:"",visibility:"",permission:"",hidden:!1,bundled:!1}};h.push(t),_(),ae(t)?$(t.id):V(t.id)}const A=e=>t=>{e(t)&&(_(),$(t))},u=A(e=>mt(h,e,-1)),Q=A(e=>mt(h,e,1)),me=A(e=>Mt(h,e)),ge=A(e=>qt(h,e));function ve(e){const t=j(e);if(!t)return[];const a=ae(t),m=G().has(e),f=Ut(h,e),l=f.findIndex(P=>P.id===e),b=t.tool,d=b&&(b.persisted||t.touched),X=P=>()=>{const ke=zt(h,e,P,_e());_(),ke&&!ae(ke)?V(ke.id):ke&&$(ke.id)};return[{header:a?{separator:"Separator",spacer:"Spacer","theme-switcher":"Theme switcher"}[t.type]:t.text||b?.label||"(untitled)"},...a?[]:[{label:"Edit\u2026",icon:"edit",action:()=>V(e)}],{type:"divider"},{label:"Add item below",icon:"plus",action:X("item")},{label:"Add sub-item",icon:"corner-down-right",disabled:a,action:()=>{const P=Pt(h,e,_e());_(),P&&V(P.id)}},{label:"Add separator below",icon:"minus",action:X("separator")},{label:"Add spacer below",icon:"move",action:X("spacer")},...O?[]:[{label:"Add theme switcher below",icon:"palette",action:X("theme-switcher")}],{type:"divider"},{label:"Move up",icon:"arrow-up",shortcut:"Alt+\u2191",disabled:l<=0,action:()=>u(e)},{label:"Move down",icon:"arrow-down",shortcut:"Alt+\u2193",disabled:l<0||l>=f.length-1,action:()=>Q(e)},{label:"Indent",icon:"chevron-right",shortcut:"Alt+\u2192",disabled:l<=0||ae(f[l-1]),action:()=>me(e)},{label:"Outdent",icon:"chevron-left",shortcut:"Alt+\u2190",disabled:t.parentId==null,action:()=>ge(e)},{type:"divider"},...a?[]:[{label:t.hidden?"Show":"Hide",icon:t.hidden?"eye":"eye-off",disabled:m,action:()=>ue(e)}],{label:"Duplicate",icon:"copy",disabled:!!b,action:()=>{const P=Ft(h,e,_e);_(),P&&$(P.id)}},...b&&!b.orphan&&d?[{label:"Back to its default place",icon:"rotate-ccw",action:()=>{fe(t),_()}}]:[],{label:m?"Remove - always in the sidebar":b&&!b.orphan?"Remove - a Tool is hidden, not removed":"Remove\u2026",icon:"trash",danger:!0,disabled:!Ae(t),action:()=>de(e)}]}const be=E.contextMenu(L,{cursor:"glyph",match:".menu-tree-row",inherit:!1,density:"compact",items:e=>ve(e.dataset.id)});i(()=>be?.destroy?.());const ye=xt(L,()=>h,_,{items:".menu-tree-row",handle:".menu-tree-grip"});i(()=>ye?.destroy());const we=e=>{const t=e.target.closest(".menu-tree-row");if(!t)return;const a=t.dataset.id;if(e.target.closest(".mex-kebab")){Ge(e.target.closest(".mex-kebab"));return}if(e.target.closest(".me-hidden")){ue(a);return}if(e.target.closest(".me-edit")){V(a);return}e.target.closest("select, .menu-tree-grip, button")||V(a)},Ve=e=>{const t=e.target.closest(".menu-tree-row");if(!t||e.target!==t){t&&e.key==="F10"&&e.shiftKey&&(e.preventDefault(),Ge(t));return}const a=t.dataset.id;if(e.key==="F10"&&e.shiftKey)e.preventDefault(),Ge(t);else if(e.key==="Enter")e.preventDefault(),V(a);else if(e.key==="Delete")e.preventDefault(),de(a);else if(e.altKey&&e.key==="ArrowUp")e.preventDefault(),u(a);else if(e.altKey&&e.key==="ArrowDown")e.preventDefault(),Q(a);else if(e.altKey&&e.key==="ArrowRight")e.preventDefault(),me(a);else if(e.altKey&&e.key==="ArrowLeft")e.preventDefault(),ge(a);else if(e.key==="ArrowDown"||e.key==="ArrowUp"){const m=[...L.querySelectorAll(".menu-tree-row")],f=m.indexOf(t)+(e.key==="ArrowDown"?1:-1);m[f]&&(e.preventDefault(),m[f].focus())}},Ye=e=>{if(!e.target.matches(".me-spacer-size"))return;const t=j(e.target.closest(".menu-tree-row")?.dataset.id);t&&(t.size=e.target.value,Y())};L.addEventListener("click",we),L.addEventListener("keydown",Ve),L.addEventListener("change",Ye),i(()=>{L.removeEventListener("click",we),L.removeEventListener("keydown",Ve),L.removeEventListener("change",Ye)});const n=e=>o.find(e),Ee=n("#me-float-accent"),De=n("#me-float-accent-hex"),je=()=>{De.get(0).style.display=Ee.val()==="__custom__"?"":"none"},gt=()=>Ee.val()==="__custom__"?De.val():Ee.val(),$e=n("#me-highlight-accent"),Pe=n("#me-highlight-accent-hex"),Xe=()=>{Pe.get(0).style.display=$e.val()==="__custom__"?"":"none"},vt=()=>$e.val()==="__custom__"?Pe.val():$e.val(),Je=()=>{const e=!!(n("#me-entrance-enabled").get(0)||{}).checked;n(".dm-entrance-field").each(function(){this.style.display=e?"":"none"});const t=n("#me-position").val()==="floating";n(".dm-float-field").each(function(){this.style.display=t?"":"none"}),t&&je();const a=n("#me-orientation").val()==="vertical";n(".dm-vertical-field").each(function(){this.style.display=a?"":"none"}),n(".dm-dock-rail-field").each(function(){this.style.display=a&&!t?"":"none"}),n(".dm-dock-bar-field").each(function(){this.style.display=!a&&!t?"":"none"});const m=!!(n("#me-dock-collapsible").get(0)||{}).checked,f=!!(n("#me-dock-autohide").get(0)||{}).checked;n(".dm-dock-collapsed-field").each(function(){this.style.display=m&&!f?"":"none"});const l=!!(n("#me-float-collapsible").get(0)||{}).checked;n(".dm-float-collapsed-field").each(function(){this.style.display=t&&l?"":"none"})},Qe=(e,t,a,m)=>{const f=n(e).get(0);f&&(f.innerHTML="",f.add(new Option(m,"")),t.forEach(l=>f.add(new Option(a[l]||l,l))))};Qe("#me-highlight-hover",lt,ct,"- theme default -"),Qe("#me-highlight-active",it,rt,"- theme default -");{const e=n("#me-entrance-animation").get(0);e&&(e.innerHTML="",qe.forEach(t=>e.add(new Option(Et[t]||t,t))))}const Be=n("#me-bind-slot"),Fe=n("#me-bind-projects"),xe=n("#me-bind-pages");Be.html('<option value="">- not bound -</option>'+(le||[]).map(e=>`<option value="${y(e.slot)}">${y(e.label||e.slot)} (${y(e.slot)})</option>`).join("")),Fe.html(q.map(e=>`<option value="${y(e.slug)}">${y(e.name||e.slug)}</option>`).join("")),n("#me-bind-page-pick").html('<option value="">- pick a page -</option>'+ne.map(e=>{const t=e.urlPath||e.url||"";return t?`<option value="${y(t)}">${y(e.title||t)} - ${y(t)}</option>`:""}).join(""));const Ze=()=>Bt({slot:Be.val(),projects:Array.from(Fe.get(0).selectedOptions).map(e=>e.value),pagesText:xe.val()});function Me(){const e=Ze(),t=n("#me-bind-summary");if(!e){t.html('<span class="text-muted">Not bound - this menu renders only where it is mapped or placed by a shortcode.</span>');return}const a=[];e.projects.length&&a.push(`pages in ${e.projects.map(l=>`<code>${y(l)}</code>`).join(", ")}`),e.pages.length&&a.push(`pages matching ${e.pages.map(l=>`<code>${y(l)}</code>`).join(", ")}`);const m=e.pages.filter(l=>!/^\/[^\s?#*]*(\/\*)?$|^\/\*$/.test(l)),f=m.length?`<div class="text-danger" style="margin-top:.4rem">Not valid page patterns: ${m.map(l=>`<code>${y(l)}</code>`).join(", ")}</div>`:"";t.html(a.length?`Takes over the <code>${y(e.slot)}</code> slot on ${a.join(" and ")}.${f}`:`<span class="text-warning">Slot <code>${y(e.slot)}</code> selected but no project or page chosen - the binding will never match.</span>`)}const{getProjectFromHash:bt}=await import("../lib/project-context.js");if(!v())return;const yt=x?bt():null;n("#me-project").html('<option value="">- none -</option>'+q.map(e=>`<option value="${y(e.slug)}">${y(e.name||e.slug)}</option>`).join(""));function ze(e){h=ie(e.items),n("#me-variant").val(e.variant||""),n("#me-position").val(e.position||"");const t=n("#me-appearOnHover").get(0);t&&(t.checked=e.appearOnHover===!0),n("#me-float-anchor").val(e.float?.anchor||"TL"),n("#me-float-offsetX").val(e.float?.offsetX??""),n("#me-float-offsetY").val(e.float?.offsetY??""),n("#me-float-width").val(e.float?.width??""),n("#me-float-radius").val(e.float?.radius??""),n("#me-float-shadow").val(e.float?.shadow||""),n("#me-float-opacity").val(e.float?.opacity??""),n("#me-float-title").val(e.float?.title||"");for(const[l,b]of[["#me-float-collapsible",e.float?.collapsible],["#me-float-collapsed",e.float?.collapsed],["#me-float-movable",e.float?.movable],["#me-float-resizable",e.float?.resizable]]){const d=n(l).get(0);d&&(d.checked=b===!0)}const a=e.float?.accent||"";Ee.val(a.startsWith("#")?"__custom__":a),a.startsWith("#")&&De.val(a),je(),n("#me-orientation").val(e.orientation||""),n("#me-align").val(e.align||""),n("#me-side").val(e.side||"left"),n("#me-dock-width").val(e.dock?.width??"");for(const l of["collapsible","collapsed","autohide","hideOnScroll"]){const b=n(`#me-dock-${l}`).get(0);b&&(b.checked=e.dock?.[l]===!0)}n("#me-class").val(e.class||""),n("#me-highlight-hover").val(e.highlight?.hover||""),n("#me-highlight-active").val(e.highlight?.active||"");const m=e.highlight?.accent||"";$e.val(m.startsWith("#")?"__custom__":m),m.startsWith("#")&&Pe.val(m),Xe();{const l=n("#me-entrance-enabled").get(0);l&&(l.checked=e.entrance?.enabled===!0)}n("#me-entrance-animation").val(qe.includes(e.entrance?.animation)?e.entrance.animation:qe[0]),n("#me-entrance-stagger").val(e.entrance?.stagger??""),n("#me-entrance-duration").val(e.entrance?.duration??""),n("#me-fontFamily").val(e.style?.fontFamily||""),n("#me-fontSize").val(e.style?.fontSize||""),n("#me-fontWeight").val(e.style?.fontWeight||""),n("#me-letterSpacing").val(e.style?.letterSpacing||""),n("#me-iconSize").val(e.style?.iconSize||""),Be.val(e.binding?.slot||"");const f=new Set(e.binding?.projects||[]);Array.from(Fe.get(0).options).forEach(l=>{l.selected=f.has(l.value)}),xe.val((e.binding?.pages||[]).join(`
|
|
28
|
+
`)),n("#me-slug").val(e.slug||""),n("#me-name").val(e.name||""),n("#me-description").val(e.description||""),n("#me-project").val(e.meta?.project||yt||""),Je(),Me(),re()}const W=e=>!!(n(e).get(0)||{}).checked;function Ce(){const e={variant:n("#me-variant").val(),position:n("#me-position").val(),appearOnHover:W("#me-appearOnHover"),floatAnchor:n("#me-float-anchor").val(),floatOffsetX:n("#me-float-offsetX").val(),floatOffsetY:n("#me-float-offsetY").val(),floatWidth:n("#me-float-width").val(),floatRadius:n("#me-float-radius").val(),floatShadow:n("#me-float-shadow").val(),floatAccent:gt(),floatOpacity:n("#me-float-opacity").val(),floatTitle:n("#me-float-title").val(),floatCollapsible:W("#me-float-collapsible"),floatCollapsed:W("#me-float-collapsed"),floatMovable:W("#me-float-movable"),floatResizable:W("#me-float-resizable"),highlightHover:n("#me-highlight-hover").val(),highlightActive:n("#me-highlight-active").val(),highlightAccent:vt(),class:n("#me-class").val(),entranceEnabled:W("#me-entrance-enabled"),entranceAnimation:n("#me-entrance-animation").val(),entranceStagger:n("#me-entrance-stagger").val(),entranceDuration:n("#me-entrance-duration").val(),orientation:n("#me-orientation").val(),align:n("#me-align").val(),side:n("#me-side").val(),fontFamily:n("#me-fontFamily").val(),fontSize:n("#me-fontSize").val(),fontWeight:n("#me-fontWeight").val(),letterSpacing:n("#me-letterSpacing").val(),iconSize:n("#me-iconSize").val(),dockWidth:n("#me-dock-width").val(),dockCollapsible:W("#me-dock-collapsible"),dockCollapsed:W("#me-dock-collapsed"),dockAutohide:W("#me-dock-autohide"),dockHideOnScroll:W("#me-dock-hideOnScroll")},t={slug:n("#me-slug").val(),name:n("#me-name").val(),description:n("#me-description").val(),project:n("#me-project").val()};return Wt(e,t,Ze(),Nt(h),g.meta||{})}const et=e=>[...Kt(e),...dt(e.class).map(t=>`CSS classes: ${t} (Behaviour tab).`)];let tt=!1,We=null;function Y(){if(!z)return;const e=Ce();We=e,D.value=Ie(e)!==z,he.value=D.peek()||tt?et(e).join(" "):""}const Le=e=>{e.target.closest("#me-items-list")||(e.target.matches("#me-position, #me-orientation, #me-float-collapsible, #me-dock-collapsible, #me-dock-autohide, #me-entrance-enabled")&&Je(),e.target.matches("#me-float-accent")&&je(),e.target.matches("#me-highlight-accent")&&Xe(),e.target.closest("#me-binding")&&Me(),Y())};s.addEventListener("input",Le),s.addEventListener("change",Le),i(()=>{s.removeEventListener("input",Le),s.removeEventListener("change",Le)}),n("#me-bind-page-add").on("click",()=>{const e=n("#me-bind-page-pick").val();if(!e)return;const t=xe.val().split(`
|
|
29
|
+
`).map(a=>a.trim()).filter(Boolean);t.includes(e)||t.push(e),xe.val(t.join(`
|
|
30
|
+
`)),Me(),Y()}),ze(g),z=Ie(Ce()),Y();const nt=()=>{try{S.remove?S.remove(J):S.set(J,null)}catch{}};async function Ke(){if(ce.peek())return;const e=Ce(),t=et(e);if(t.length){tt=!0,Y(),E.toast(t.join(" "),{type:"warning",duration:7e3});return}ce.value=!0;try{if(x)await N.menus.create(e);else if(e.slug!==g.slug){await N.menus.create(e);const a=await N.menuLocations.get();let m=!1;for(const[f,l]of Object.entries(a))l===g.slug&&(a[f]=e.slug,m=!0);m&&await N.menuLocations.save(a),await N.menus.remove(g.slug)}else await N.menus.update(g.slug,e);if(z=Ie(e),D.value=!1,nt(),jt("#/menus"),E.toast("Saved.",{type:"success"}),x||e.slug!==g.slug)location.hash="#/menus/edit/"+encodeURIComponent(e.slug);else{g={...g,...e};for(const a of h)a.tool&&a.touched&&(a.tool={...a.tool,persisted:!0});re(),z=Ie(Ce()),Y(),ft(o.get(0),e.name||e.slug)}if(O)try{document.dispatchEvent(new CustomEvent("dm:sidebar-rebuild"))}catch{}}catch(a){E.toast(`Save failed: ${a.message||a}`,{type:"error"})}finally{ce.value=!1}}async function wt(){!D.peek()||!await E.confirm("Throw away the changes you have not saved?")||(ze(g),Y())}E.tabs(n("#me-tabs").get(0));const kt=M.applyBindings({dirty:D,saving:ce,problems:he,itemCount:Se},s,{methods:{save:()=>Ke(),discard:()=>wt(),addItem:()=>oe("item"),addSeparator:()=>oe("separator"),addSpacer:()=>oe("spacer"),addSwitcher:()=>oe("theme-switcher")}});i(()=>kt.dispose()),i(Ot(s,{position:"bottom"})),O&&n("#me-add-switcher").hide(),ft(o.get(0),x?"New menu":g.name||g.slug),Ue(o,{id:"menu-editor-back",icon:"arrow-left",title:"All menus",onClick:()=>{location.hash="#/menus"}}),Ue(o,{id:"menu-editor-locations",icon:"map-pin",title:"Menu locations",onClick:()=>{location.hash="#/menu-locations"}}),Ue(o,{id:"menu-editor-save",icon:"save",title:"Save (Ctrl+S)",onClick:()=>Ke()});const ot=e=>{if(!(!(e.ctrlKey||e.metaKey)||e.key!=="s")){if(e.preventDefault(),e.stopImmediatePropagation(),document.querySelector(".me-item-form")?.offsetParent){E.toast("Apply the item first (Ctrl+Enter), then Save.",{type:"info"});return}Ke()}};document.addEventListener("keydown",ot,!0),i(()=>document.removeEventListener("keydown",ot,!0));const at=()=>{if(!(!D.peek()||!We))try{S.set(J,{menu:We,base:z,at:new Date().toISOString()})}catch{}},st=e=>{D.peek()&&(at(),e.preventDefault(),e.returnValue="")};window.addEventListener("beforeunload",st),i(()=>window.removeEventListener("beforeunload",st)),K={path:k,dirty:()=>D.peek(),name:()=>n("#me-name").val()||g.name||g.slug||"new menu",dispose(){c=!0,at(),r.splice(0).reverse().forEach(e=>{try{e()}catch{}})}},I.scan(s);let Z=null;try{Z=S.get(J)}catch{}if(Z?.menu){nt();const e=Z.base&&Z.base!==z,t=Z.at?` (${Gt(Z.at)})`:"",a=x?"the new menu you started":`the menu "${He(g.name||g.slug)}"`,m=e?`You left unsaved changes to ${a}${t}, but the saved menu has changed since. Restore your version anyway?`:`You left unsaved changes to ${a}${t}. Restore them?`;await E.confirm(m)&&v()&&(ze({...Z.menu,meta:{...g.meta||{},...Z.menu.meta||{}}}),Y())}}};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "domma-cms",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.44",
|
|
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",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"@fastify/rate-limit": "^10.3.0",
|
|
85
85
|
"@fastify/static": "9.1.1",
|
|
86
86
|
"bcryptjs": "^3.0.3",
|
|
87
|
-
"domma-js": "0.
|
|
87
|
+
"domma-js": "0.52.0",
|
|
88
88
|
"dotenv": "^17.2.3",
|
|
89
89
|
"fastify": "5.8.5",
|
|
90
90
|
"gray-matter": "^4.0.3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a),[data-menu-active] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a){transition:color .18s ease,background-color .18s ease,text-shadow .18s ease,transform .18s ease,letter-spacing .18s ease,text-decoration-color .18s ease}.page-body :is([data-menu-hover],[data-menu-active]).dm-menu li>a{color:var(--dm-primary, inherit);text-decoration:none}[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]),[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]),#site-navbar[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{color:inherit!important;background-color:transparent!important;text-decoration:none!important;text-shadow:none!important;transform:none!important}[data-menu-hover=colour] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=colour] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;background-color:transparent!important;text-decoration:none!important}[data-menu-hover=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-hover=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-hover=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}[data-menu-hover=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:#00000029!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}[data-menu-hover=uppercase] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=uppercase] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{text-transform:uppercase!important;letter-spacing:.04em!important;background-color:transparent!important;text-decoration:none!important}:is([data-menu-hover=grow],[data-menu-hover=breathe]) :is(.dm-menu,.footer-nav) li>a{display:inline-block}[data-menu-hover=grow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=grow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{transform:scale(1.08)!important;background-color:transparent!important;text-decoration:none!important}@keyframes dm-menu-breathe{0%,to{opacity:1;transform:scale(1)}50%{opacity:.72;transform:scale(1.05)}}[data-menu-hover=breathe] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=breathe] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{animation:dm-menu-breathe 1.4s ease-in-out infinite!important;background-color:transparent!important;text-decoration:none!important}[data-menu-hover=glow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=glow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{text-shadow:0 0 8px color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 70%,transparent)!important;background-color:transparent!important;text-decoration:none!important}[data-menu-active] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):is(.active,.is-active,[aria-current=page]){box-shadow:none!important;text-decoration:none!important}[data-menu-active=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){font-weight:inherit!important;background-color:transparent!important}[data-menu-active=bold] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=bold] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){font-weight:700!important;background-color:transparent!important}[data-menu-active=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-active=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-active=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px)}[data-menu-active=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:#00000038!important;border-radius:var(--dm-radius-md, 6px)}[data-menu-active=pill] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=pill] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;color:#fff!important;border-radius:999px;padding-inline:.9em}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover],:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active]{transition:color .18s ease,background-color .18s ease,text-shadow .18s ease,transform .18s ease,letter-spacing .18s ease,text-decoration-color .18s ease}.page-body .dm-menu li>a:is([data-menu-item-hover],[data-menu-item-active]){color:var(--dm-primary, inherit);text-decoration:none}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none],:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none],#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none]:hover{color:inherit!important;background-color:transparent!important;text-decoration:none!important;text-shadow:none!important;transform:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=colour]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=colour]:hover{color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=underline]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=underline]:hover{background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=overline]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=overline]:hover{background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=background]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=background]:hover{background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=darken]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=darken]:hover{background-color:#00000029!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=uppercase]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=uppercase]:hover{text-transform:uppercase!important;letter-spacing:.04em!important;background-color:transparent!important;text-decoration:none!important}:is(.dm-menu,.footer-nav) li>a:is([data-menu-item-hover=grow],[data-menu-item-hover=breathe]){display:inline-block}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=grow]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=grow]:hover{transform:scale(1.08)!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=breathe]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=breathe]:hover{animation:dm-menu-breathe 1.4s ease-in-out infinite!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=glow]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=glow]:hover{text-shadow:0 0 8px color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 70%,transparent)!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active]:is(.active,.is-active,[aria-current=page]){box-shadow:none!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=none]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=none]:is(.active,.is-active,[aria-current=page]){font-weight:inherit!important;background-color:transparent!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=bold]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=bold]:is(.active,.is-active,[aria-current=page]){font-weight:700!important;background-color:transparent!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=underline]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=underline]:is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=overline]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=overline]:is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=background]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=background]:is(.active,.is-active,[aria-current=page]){background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px)}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=darken]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=darken]:is(.active,.is-active,[aria-current=page]){background-color:#00000038!important;border-radius:var(--dm-radius-md, 6px)}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=pill]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=pill]:is(.active,.is-active,[aria-current=page]){background-color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;color:#fff!important;border-radius:999px;padding-inline:.9em}@media(prefers-reduced-motion:reduce){[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a),[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):hover,:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover],:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover]:hover{transition:none;animation:none!important;transform:none!important}}html.dm-reduced-motion [data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a),html.dm-reduced-motion [data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):hover,html.dm-reduced-motion #site-navbar[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):hover,html.dm-reduced-motion :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover],html.dm-reduced-motion :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover]:hover,html.dm-reduced-motion #site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover]:hover{transition:none;animation:none!important;transform:none!important}
|
|
1
|
+
[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a),[data-menu-active] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a){transition:color .18s ease,background-color .18s ease,text-shadow .18s ease,transform .18s ease,letter-spacing .18s ease,text-decoration-color .18s ease}.page-body :is([data-menu-hover],[data-menu-active]).dm-menu li>a{color:var(--dm-primary, inherit);text-decoration:none}[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]),[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]),#site-navbar[data-menu-hover=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{color:inherit!important;background-color:transparent!important;text-decoration:none!important;text-shadow:none!important;transform:none!important}[data-menu-hover=colour] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=colour] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;background-color:transparent!important;text-decoration:none!important}[data-menu-hover=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-hover=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-hover=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}[data-menu-hover=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{background-color:#00000029!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}[data-menu-hover=uppercase] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=uppercase] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{text-transform:uppercase!important;letter-spacing:.04em!important;background-color:transparent!important;text-decoration:none!important}:is([data-menu-hover=grow],[data-menu-hover=breathe]) :is(.dm-menu,.footer-nav) li>a{display:inline-block}[data-menu-hover=grow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=grow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{transform:scale(1.08)!important;background-color:transparent!important;text-decoration:none!important}@keyframes dm-menu-breathe{0%,to{opacity:1;transform:scale(1)}50%{opacity:.72;transform:scale(1.05)}}[data-menu-hover=breathe] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=breathe] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{animation:dm-menu-breathe 1.4s ease-in-out infinite!important;background-color:transparent!important;text-decoration:none!important}[data-menu-hover=glow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover,#site-navbar[data-menu-hover=glow] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-hover]):hover{text-shadow:0 0 8px color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 70%,transparent)!important;background-color:transparent!important;text-decoration:none!important}[data-menu-active] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):is(.active,.is-active,[aria-current=page]){box-shadow:none!important;text-decoration:none!important}[data-menu-active=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=none] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){font-weight:inherit!important;background-color:transparent!important}[data-menu-active=bold] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=bold] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){font-weight:700!important;background-color:transparent!important}[data-menu-active=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=underline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-active=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=overline] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}[data-menu-active=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=background] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px)}[data-menu-active=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=darken] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:#00000038!important;border-radius:var(--dm-radius-md, 6px)}[data-menu-active=pill] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]),#site-navbar[data-menu-active=pill] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):not([data-menu-item-active]):is(.active,.is-active,[aria-current=page]){background-color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;color:#fff!important;border-radius:999px;padding-inline:.9em}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover],:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active]{transition:color .18s ease,background-color .18s ease,text-shadow .18s ease,transform .18s ease,letter-spacing .18s ease,text-decoration-color .18s ease}.page-body .dm-menu li>a:is([data-menu-item-hover],[data-menu-item-active]){color:var(--dm-primary, inherit);text-decoration:none}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none],:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none],#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=none]:hover{color:inherit!important;background-color:transparent!important;text-decoration:none!important;text-shadow:none!important;transform:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=colour]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=colour]:hover{color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=underline]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=underline]:hover{background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=overline]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=overline]:hover{background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=background]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=background]:hover{background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=darken]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=darken]:hover{background-color:#00000029!important;border-radius:var(--dm-radius-md, 6px);text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=uppercase]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=uppercase]:hover{text-transform:uppercase!important;letter-spacing:.04em!important;background-color:transparent!important;text-decoration:none!important}:is(.dm-menu,.footer-nav) li>a:is([data-menu-item-hover=grow],[data-menu-item-hover=breathe]){display:inline-block}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=grow]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=grow]:hover{transform:scale(1.08)!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=breathe]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=breathe]:hover{animation:dm-menu-breathe 1.4s ease-in-out infinite!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=glow]:hover,#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover=glow]:hover{text-shadow:0 0 8px color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 70%,transparent)!important;background-color:transparent!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active]:is(.active,.is-active,[aria-current=page]){box-shadow:none!important;text-decoration:none!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=none]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=none]:is(.active,.is-active,[aria-current=page]){font-weight:inherit!important;background-color:transparent!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=bold]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=bold]:is(.active,.is-active,[aria-current=page]){font-weight:700!important;background-color:transparent!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=underline]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=underline]:is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:underline!important;text-decoration-thickness:2px;text-underline-offset:4px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=overline]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=overline]:is(.active,.is-active,[aria-current=page]){background-color:transparent!important;text-decoration:overline!important;text-decoration-thickness:2px;text-decoration-color:var(--dm-menu-highlight, currentColor)!important}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=background]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=background]:is(.active,.is-active,[aria-current=page]){background-color:color-mix(in srgb,var(--dm-menu-highlight, var(--dm-primary, #0d6efd)) 18%,transparent)!important;border-radius:var(--dm-radius-md, 6px)}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=darken]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=darken]:is(.active,.is-active,[aria-current=page]){background-color:#00000038!important;border-radius:var(--dm-radius-md, 6px)}:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=pill]:is(.active,.is-active,[aria-current=page]),#site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-active=pill]:is(.active,.is-active,[aria-current=page]){background-color:var(--dm-menu-highlight, var(--dm-primary, #0d6efd))!important;color:#fff!important;border-radius:999px;padding-inline:.9em}@media(prefers-reduced-motion:reduce){[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a),[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):hover,:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover],:is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover]:hover{transition:none;animation:none!important;transform:none!important}}html.dm-reduced-motion [data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a),html.dm-reduced-motion [data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):hover,html.dm-reduced-motion #site-navbar[data-menu-hover] :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a):hover,html.dm-reduced-motion :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover],html.dm-reduced-motion :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover]:hover,html.dm-reduced-motion #site-navbar :is(.navbar-link,.navbar-dropdown-item,.navbar-dropdown-toggle,.sidebar-link,li>a)[data-menu-item-hover]:hover{transition:none;animation:none!important;transform:none!important}[data-menu-entrance] li{--dm-menu-i: 0;animation-duration:var(--dm-menu-entrance-duration, .4s);animation-timing-function:cubic-bezier(.22,.61,.36,1);animation-fill-mode:backwards;animation-delay:calc(var(--dm-menu-i) * var(--dm-menu-entrance-step, 60ms))}[data-menu-entrance] li:nth-child(2){--dm-menu-i: 1}[data-menu-entrance] li:nth-child(3){--dm-menu-i: 2}[data-menu-entrance] li:nth-child(4){--dm-menu-i: 3}[data-menu-entrance] li:nth-child(5){--dm-menu-i: 4}[data-menu-entrance] li:nth-child(6){--dm-menu-i: 5}[data-menu-entrance] li:nth-child(7){--dm-menu-i: 6}[data-menu-entrance] li:nth-child(8){--dm-menu-i: 7}[data-menu-entrance] li:nth-child(9){--dm-menu-i: 8}[data-menu-entrance] li:nth-child(10){--dm-menu-i: 9}[data-menu-entrance] li:nth-child(11){--dm-menu-i: 10}[data-menu-entrance] li:nth-child(12){--dm-menu-i: 11}[data-menu-entrance] li:nth-child(13){--dm-menu-i: 12}[data-menu-entrance] li:nth-child(14){--dm-menu-i: 13}[data-menu-entrance] li:nth-child(15){--dm-menu-i: 14}[data-menu-entrance] li:nth-child(16){--dm-menu-i: 15}[data-menu-entrance] li:nth-child(17){--dm-menu-i: 16}[data-menu-entrance] li:nth-child(18){--dm-menu-i: 17}[data-menu-entrance] li:nth-child(19){--dm-menu-i: 18}[data-menu-entrance] li:nth-child(20){--dm-menu-i: 19}[data-menu-entrance] li:nth-child(n+21){--dm-menu-i: 20}[data-menu-entrance] li:is(:hover,:focus-within){z-index:2}.dm-menu-floating[data-menu-entrance],#site-navbar.dm-nav-vertical[data-menu-entrance],#site-navbar[data-menu-entrance] .navbar-collapse{overflow-x:hidden}[data-menu-entrance=fade] li{animation-name:dm-menu-in-fade}[data-menu-entrance=slide-up] li{animation-name:dm-menu-in-slide-up}[data-menu-entrance=slide-down] li{animation-name:dm-menu-in-slide-down}[data-menu-entrance=slide-left] li{animation-name:dm-menu-in-slide-left}[data-menu-entrance=slide-right] li{animation-name:dm-menu-in-slide-right}[data-menu-entrance=zoom] li{animation-name:dm-menu-in-zoom}[data-menu-entrance=pop] li{animation-name:dm-menu-in-pop}[data-menu-entrance=flip] li{animation-name:dm-menu-in-flip}[data-menu-entrance=blur] li{animation-name:dm-menu-in-blur}@keyframes dm-menu-in-fade{0%{opacity:0}}@keyframes dm-menu-in-slide-up{0%{opacity:0;transform:translateY(14px)}}@keyframes dm-menu-in-slide-down{0%{opacity:0;transform:translateY(-14px)}}@keyframes dm-menu-in-slide-left{0%{opacity:0;transform:translate(24px)}}@keyframes dm-menu-in-slide-right{0%{opacity:0;transform:translate(-24px)}}@keyframes dm-menu-in-zoom{0%{opacity:0;transform:scale(.6)}}@keyframes dm-menu-in-pop{0%{opacity:0;transform:scale(.5)}70%{opacity:1;transform:scale(1.08)}to{opacity:1;transform:scale(1)}}@keyframes dm-menu-in-flip{0%{opacity:0;transform:perspective(400px) rotateX(-80deg);transform-origin:top center}to{transform-origin:top center}}@keyframes dm-menu-in-blur{0%{opacity:0;filter:blur(6px)}}@media(prefers-reduced-motion:reduce){[data-menu-entrance] li{animation:none!important}}html.dm-reduced-motion [data-menu-entrance] li{animation:none!important}
|