domma-cms 0.118.0 → 0.120.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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=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=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:#0000001f!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:#0000001f!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}
@@ -0,0 +1 @@
1
+ export const CSS_CLASS_RE=/^-?[_a-zA-Z][_a-zA-Z0-9-]*$/,CSS_CLASS_MAX=20,CSS_CLASS_MAX_LEN=64;function r(s){return typeof s!="string"?[]:s.split(/[\s,]+/).map(t=>t.replace(/^\./,"")).filter(Boolean)}export function cssClasses(s){const t=[];for(const n of r(s))if(n.length<=64&&CSS_CLASS_RE.test(n)&&!t.includes(n)&&t.push(n),t.length>=20)break;return t}export function cssClassProblems(s){if(s==null||s==="")return[];if(typeof s!="string")return["must be a string of class names"];const t=r(s),n=t.filter(o=>o.length>64||!CSS_CLASS_RE.test(o)),e=[];return n.length&&e.push(`not a valid class name: ${n.join(", ")}`),t.length>20&&e.push("at most 20 classes"),e}export function normaliseCssClasses(s){return cssClasses(s).join(" ")}export function applyClasses(s,t){if(!s)return!1;const n=cssClasses(t);return n.length&&s.classList.add(...n),n.length>0}
@@ -1 +1 @@
1
- export const SUBMIT_ALIGNS=["left","center","right","full"];export function resolveSubmitAlign(e,t){const n=e||{};return SUBMIT_ALIGNS.includes(n.submitAlign)?n.submitAlign:t==="grid"&&n.submitSpan==="full"?"left":""}export function submitWrapperClasses(e,t){const n=resolveSubmitAlign(e,t);if(!n)return[];const r=["fb-submit",`fb-submit--${n}`];return t==="grid"&&r.push("col-span-full"),r}export function applySubmitPosition(e,t,n){const r=e&&e.querySelector?e.querySelector(".form-buttons"):null;return r?(submitWrapperClasses(t,n).forEach(i=>r.classList.add(i)),r):null}export const BUTTON_STYLES=["primary","secondary","success","danger","warning","info","outline","outline-success","outline-danger","outline-warning","outline-info","ghost"],BUTTON_SIZES=["sm","lg"],SECONDARY_KINDS=["reset","link"];const d={sm:14,"":16,lg:20},p=/^[a-z0-9][a-z0-9-]{0,63}$/i;export function isIconName(e){return typeof e=="string"&&p.test(e)}export function isSafeButtonUrl(e){if(typeof e!="string")return!1;const t=e.trim();if(!t||t.length>2048||/[\u0000-\u0020\u007f-\u009f\u2028\u2029\\]/.test(t))return!1;const n=/^([a-z][a-z0-9+.-]*):/i.exec(t);return n?["http","https","mailto","tel"].includes(n[1].toLowerCase()):!0}export function resolveSubmitButton(e){const t=e&&e.submitButton&&typeof e.submitButton=="object"?e.submitButton:{};return{style:BUTTON_STYLES.includes(t.style)?t.style:"primary",size:BUTTON_SIZES.includes(t.size)?t.size:"",iconStart:isIconName(t.iconStart)?t.iconStart:"",iconEnd:isIconName(t.iconEnd)?t.iconEnd:""}}export function resolveSecondaryButton(e){const t=e&&e.secondaryButton;if(!t||typeof t!="object"||!SECONDARY_KINDS.includes(t.kind)||t.kind==="link"&&!isSafeButtonUrl(t.url))return null;const n=typeof t.label=="string"&&t.label.trim()?t.label.trim().slice(0,80):t.kind==="reset"?"Clear form":"Cancel";return{kind:t.kind,label:n,url:t.kind==="link"?t.url.trim():"",style:BUTTON_STYLES.includes(t.style)?t.style:"secondary",iconStart:isIconName(t.iconStart)?t.iconStart:"",iconEnd:isIconName(t.iconEnd)?t.iconEnd:"",first:t.first===!0,stack:t.stack===!0}}export function buttonClasses(e,t){const n=["btn","btn-"+(BUTTON_STYLES.includes(e)?e:"primary")];return BUTTON_SIZES.includes(t)&&n.push("btn-"+t),n}export function escapeHtml(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}export function buttonInnerHtml(e,t,n){const r=d[BUTTON_SIZES.includes(n)?n:""],i=(o,u)=>isIconName(o)?`<span class="fb-btn-icon fb-btn-icon--${u}" data-icon="${o}" data-icon-size="${r}" aria-hidden="true"></span>`:"",s=t||{};return i(s.iconStart,"start")+`<span class="fb-btn-label">${escapeHtml(e)}</span>`+i(s.iconEnd,"end")}export function secondaryButtonHtml(e,t){if(!e||!SECONDARY_KINDS.includes(e.kind))return"";const n=buttonClasses(e.style,t).concat("fb-btn","fb-secondary-btn","fb-secondary-btn--"+e.kind).join(" "),r=buttonInnerHtml(e.label,e,t);return e.kind==="reset"?`<button type="reset" class="${n}">${r}</button>`:isSafeButtonUrl(e.url)?`<a class="${n}" href="${escapeHtml(e.url.trim())}">${r}</a>`:""}export function pairWrapperClasses(e){const t=resolveSecondaryButton(e);return t?t.stack?["fb-submit--pair","fb-submit--stack"]:["fb-submit--pair"]:[]}function c(e){if(typeof window>"u"||!e)return;const t=window.Domma&&window.Domma.icons||window.I;t&&typeof t.scan=="function"&&t.scan(e)}export function decorateButton(e,t){return!e||!t||(t.style&&t.style!=="primary"&&BUTTON_STYLES.includes(t.style)&&(e.classList.remove("btn-primary"),e.classList.add("btn-"+t.style)),BUTTON_SIZES.includes(t.size)&&e.classList.add("btn-"+t.size),(isIconName(t.iconStart)||isIconName(t.iconEnd))&&e.tagName!=="INPUT"&&!e.querySelector(".fb-btn-label")&&(e.innerHTML=buttonInnerHtml(e.textContent.trim(),t,t.size),e.classList.add("fb-btn"))),e}export function applySubmitButtons(e,t,n){const r=applySubmitPosition(e,t,n);if(!r){const u=e&&e.querySelector?e.querySelector('button[type="submit"]'):null;return u&&(decorateButton(u,resolveSubmitButton(t)),c(u)),null}const i=r.querySelector('button[type="submit"], input[type="submit"]');if(!i)return r;const s=resolveSubmitButton(t);decorateButton(i,s);const o=resolveSecondaryButton(t);if(o&&!r.querySelector(".fb-secondary-btn")){const u=r.ownerDocument.createElement("template");u.innerHTML=secondaryButtonHtml(o,s.size);const l=u.content.firstElementChild;l&&(i.parentNode.insertBefore(l,o.first?i:i.nextSibling),pairWrapperClasses(t).forEach(f=>r.classList.add(f)),o.kind==="reset"&&wireFormReset(i.form||r.closest("form")))}return c(r),r}export function applyWizardButtons(e,t){const n=e&&e.querySelector?e.querySelector(".wizard-nav"):null;if(!n)return null;const r=resolveSubmitButton(t),i=n.querySelector(".wizard-prev");i&&r.size&&i.classList.add("btn-"+r.size);const s=n.querySelector(".wizard-next");s&&decorateButton(s,{style:r.style,size:r.size,iconStart:"",iconEnd:""});const o=n.querySelector(".wizard-submit");return o&&decorateButton(o,r),c(n),n}const b='input:not([type="hidden"]):not([type="submit"]):not([type="reset"]):not([type="button"]), select, textarea';function a(e){return Array.from(e.querySelectorAll(b)).filter(t=>!(t.closest&&t.closest(".fb-form-honeypot")))}export function formHasAnswers(e){return a(e).some(t=>t.type==="checkbox"||t.type==="radio"?t.checked!==t.defaultChecked:t.tagName==="SELECT"?Array.from(t.options).some(n=>n.selected!==n.defaultSelected):t.value!==t.defaultValue)}function y(e){a(e).forEach(t=>{t.dispatchEvent(new Event("input",{bubbles:!0})),t.dispatchEvent(new Event("change",{bubbles:!0}))}),e.querySelectorAll(".fb-field-invalid").forEach(t=>t.classList.remove("fb-field-invalid")),e.querySelectorAll("[data-error-for]").forEach(t=>{t.textContent="",t.style.display="none",t.parentElement&&t.parentElement.classList.remove("has-error")})}export function wireFormReset(e){if(!e||e.__fbResetWired)return;e.__fbResetWired=!0;let t=!1;e.addEventListener("reset",n=>{const r=typeof window<"u"?window.E:null;if(!t&&r&&typeof r.confirm=="function"&&formHasAnswers(e)){n.preventDefault(),Promise.resolve(r.confirm("Clear everything you have entered in this form?")).then(i=>{i&&(t=!0,e.reset(),t=!1)});return}setTimeout(()=>y(e),0)})}export function buttonSettingsProblems(e){const t=e&&e.secondaryButton;return!t||typeof t!="object"||t.kind!=="link"?[]:typeof t.url!="string"||!t.url.trim()?["The Cancel button needs an address to go to."]:isSafeButtonUrl(t.url)?[]:["The Cancel button's address must be a page on this site (/contact) or a full http(s), mailto or tel address."]}export function publicButtonSettings(e){if(!e||typeof e!="object")return e;const t=e.secondaryButton;if(t&&typeof t=="object"&&t.kind==="link"&&!isSafeButtonUrl(t.url)){const{secondaryButton:n,...r}=e;return r}return e}
1
+ import{applyClasses as u,cssClasses as b,cssClassProblems as a}from"./css-classes.mjs";export const SUBMIT_ALIGNS=["left","center","right","full"];export function resolveSubmitAlign(e,t){const n=e||{};return SUBMIT_ALIGNS.includes(n.submitAlign)?n.submitAlign:t==="grid"&&n.submitSpan==="full"?"left":""}export function submitWrapperClasses(e,t){const n=resolveSubmitAlign(e,t);if(!n)return[];const r=["fb-submit",`fb-submit--${n}`];return t==="grid"&&r.push("col-span-full"),r}export function applySubmitPosition(e,t,n){const r=e&&e.querySelector?e.querySelector(".form-buttons"):null;return r?(submitWrapperClasses(t,n).forEach(s=>r.classList.add(s)),r):null}export const BUTTON_STYLES=["primary","secondary","success","danger","warning","info","outline","outline-success","outline-danger","outline-warning","outline-info","ghost"],BUTTON_SIZES=["sm","lg"],SECONDARY_KINDS=["reset","link"];const y={sm:14,"":16,lg:20},m=/^[a-z0-9][a-z0-9-]{0,63}$/i;export function isIconName(e){return typeof e=="string"&&m.test(e)}export function isSafeButtonUrl(e){if(typeof e!="string")return!1;const t=e.trim();if(!t||t.length>2048||/[\u0000-\u0020\u007f-\u009f\u2028\u2029\\]/.test(t))return!1;const n=/^([a-z][a-z0-9+.-]*):/i.exec(t);return n?["http","https","mailto","tel"].includes(n[1].toLowerCase()):!0}export function resolveSubmitButton(e){const t=e&&e.submitButton&&typeof e.submitButton=="object"?e.submitButton:{};return{style:BUTTON_STYLES.includes(t.style)?t.style:"primary",size:BUTTON_SIZES.includes(t.size)?t.size:"",iconStart:isIconName(t.iconStart)?t.iconStart:"",iconEnd:isIconName(t.iconEnd)?t.iconEnd:""}}export function resolveSecondaryButton(e){const t=e&&e.secondaryButton;if(!t||typeof t!="object"||!SECONDARY_KINDS.includes(t.kind)||t.kind==="link"&&!isSafeButtonUrl(t.url))return null;const n=typeof t.label=="string"&&t.label.trim()?t.label.trim().slice(0,80):t.kind==="reset"?"Clear form":"Cancel";return{kind:t.kind,label:n,url:t.kind==="link"?t.url.trim():"",style:BUTTON_STYLES.includes(t.style)?t.style:"secondary",iconStart:isIconName(t.iconStart)?t.iconStart:"",iconEnd:isIconName(t.iconEnd)?t.iconEnd:"",first:t.first===!0,stack:t.stack===!0}}export function buttonClasses(e,t){const n=["btn","btn-"+(BUTTON_STYLES.includes(e)?e:"primary")];return BUTTON_SIZES.includes(t)&&n.push("btn-"+t),n}export function escapeHtml(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}export function buttonInnerHtml(e,t,n){const r=y[BUTTON_SIZES.includes(n)?n:""],s=(i,o)=>isIconName(i)?`<span class="fb-btn-icon fb-btn-icon--${o}" data-icon="${i}" data-icon-size="${r}" aria-hidden="true"></span>`:"",c=t||{};return s(c.iconStart,"start")+`<span class="fb-btn-label">${escapeHtml(e)}</span>`+s(c.iconEnd,"end")}export function secondaryButtonHtml(e,t){if(!e||!SECONDARY_KINDS.includes(e.kind))return"";const n=buttonClasses(e.style,t).concat("fb-btn","fb-secondary-btn","fb-secondary-btn--"+e.kind).join(" "),r=buttonInnerHtml(e.label,e,t);return e.kind==="reset"?`<button type="reset" class="${n}">${r}</button>`:isSafeButtonUrl(e.url)?`<a class="${n}" href="${escapeHtml(e.url.trim())}">${r}</a>`:""}export function pairWrapperClasses(e){const t=resolveSecondaryButton(e);return t?t.stack?["fb-submit--pair","fb-submit--stack"]:["fb-submit--pair"]:[]}function l(e){if(typeof window>"u"||!e)return;const t=window.Domma&&window.Domma.icons||window.I;t&&typeof t.scan=="function"&&t.scan(e)}export function decorateButton(e,t){return!e||!t||(t.style&&t.style!=="primary"&&BUTTON_STYLES.includes(t.style)&&(e.classList.remove("btn-primary"),e.classList.add("btn-"+t.style)),BUTTON_SIZES.includes(t.size)&&e.classList.add("btn-"+t.size),(isIconName(t.iconStart)||isIconName(t.iconEnd))&&e.tagName!=="INPUT"&&!e.querySelector(".fb-btn-label")&&(e.innerHTML=buttonInnerHtml(e.textContent.trim(),t,t.size),e.classList.add("fb-btn"))),e}export function applySubmitButtons(e,t,n){const r=applySubmitPosition(e,t,n);if(!r){const o=e&&e.querySelector?e.querySelector('button[type="submit"]'):null;return o&&(decorateButton(o,resolveSubmitButton(t)),l(o)),null}const s=r.querySelector('button[type="submit"], input[type="submit"]');if(!s)return r;const c=resolveSubmitButton(t);decorateButton(s,c);const i=resolveSecondaryButton(t);if(i&&!r.querySelector(".fb-secondary-btn")){const o=r.ownerDocument.createElement("template");o.innerHTML=secondaryButtonHtml(i,c.size);const f=o.content.firstElementChild;f&&(s.parentNode.insertBefore(f,i.first?s:s.nextSibling),pairWrapperClasses(t).forEach(p=>r.classList.add(p)),i.kind==="reset"&&wireFormReset(s.form||r.closest("form")))}return l(r),r}export function applyWizardButtons(e,t){const n=e&&e.querySelector?e.querySelector(".wizard-nav"):null;if(!n)return null;const r=resolveSubmitButton(t),s=n.querySelector(".wizard-prev");s&&r.size&&s.classList.add("btn-"+r.size);const c=n.querySelector(".wizard-next");c&&decorateButton(c,{style:r.style,size:r.size,iconStart:"",iconEnd:""});const i=n.querySelector(".wizard-submit");return i&&decorateButton(i,r),l(n),n}const S='input:not([type="hidden"]):not([type="submit"]):not([type="reset"]):not([type="button"]), select, textarea';function d(e){return Array.from(e.querySelectorAll(S)).filter(t=>!(t.closest&&t.closest(".fb-form-honeypot")))}export function formHasAnswers(e){return d(e).some(t=>t.type==="checkbox"||t.type==="radio"?t.checked!==t.defaultChecked:t.tagName==="SELECT"?Array.from(t.options).some(n=>n.selected!==n.defaultSelected):t.value!==t.defaultValue)}function h(e){d(e).forEach(t=>{t.dispatchEvent(new Event("input",{bubbles:!0})),t.dispatchEvent(new Event("change",{bubbles:!0}))}),e.querySelectorAll(".fb-field-invalid").forEach(t=>t.classList.remove("fb-field-invalid")),e.querySelectorAll("[data-error-for]").forEach(t=>{t.textContent="",t.style.display="none",t.parentElement&&t.parentElement.classList.remove("has-error")})}export function wireFormReset(e){if(!e||e.__fbResetWired)return;e.__fbResetWired=!0;let t=!1;e.addEventListener("reset",n=>{const r=typeof window<"u"?window.E:null;if(!t&&r&&typeof r.confirm=="function"&&formHasAnswers(e)){n.preventDefault(),Promise.resolve(r.confirm("Clear everything you have entered in this form?")).then(s=>{s&&(t=!0,e.reset(),t=!1)});return}setTimeout(()=>h(e),0)})}export function buttonSettingsProblems(e){const t=e&&e.secondaryButton;return!t||typeof t!="object"||t.kind!=="link"?[]:typeof t.url!="string"||!t.url.trim()?["The Cancel button needs an address to go to."]:isSafeButtonUrl(t.url)?[]:["The Cancel button's address must be a page on this site (/contact) or a full http(s), mailto or tel address."]}export function publicButtonSettings(e){if(!e||typeof e!="object")return e;const t=e.secondaryButton;if(t&&typeof t=="object"&&t.kind==="link"&&!isSafeButtonUrl(t.url)){const{secondaryButton:n,...r}=e;return r}return e}export function formClassProblems(e,t){const n=[],r=e&&typeof e=="object"?e:{};for(const s of a(r.class))n.push(`Form CSS classes: ${s}.`);for(const s of a(r.submitClass))n.push(`Submit button CSS classes: ${s}.`);for(const s of Array.isArray(t)?t:[])if(!(!s||typeof s!="object"))for(const c of a(s.class))n.push(`CSS classes on "${s.label||s.name||s.type}": ${c}.`);return n}export function applyFormClasses(e,t,n){if(!e||!e.querySelector)return null;const r=t&&typeof t=="object"?t:{},s=e.matches&&e.matches("form")?e:e.querySelector("form");s&&u(s,r.class);const c=e;r.submitClass&&c.querySelectorAll('button[type="submit"], input[type="submit"], .wizard-submit').forEach(o=>u(o,r.submitClass));const i=new Map;for(const o of Array.isArray(n)?n:[])o&&o.name&&b(o.class).length&&i.set(o.name,o.class);return i.size&&c.querySelectorAll("[data-field]").forEach(o=>{i.has(o.dataset.field)&&u(o,i.get(o.dataset.field))}),s}
@@ -1,2 +1,2 @@
1
- import{buildWizardSteps as W}from"/public/js/form-steps.mjs";import{applySubmitButtons as N,applyWizardButtons as J,resolveSecondaryButton as U,submitWrapperClasses as H}from"/public/js/form-submit.mjs";const _=document.querySelectorAll("[data-form]");_.length&&_.forEach(ne);function T(n){return(n||[]).some(o=>o.logic||Array.isArray(o.triggers)&&o.triggers.length)}function K(n,o){const t=n.querySelector('[name="'+o+'"], [name="'+o+'[]"]')||n.querySelector('[data-chooser-field="'+o+'"]');if(!t)return null;const e=t.closest("form")||n;let r=t;for(;r.parentNode&&r.parentNode!==e;)r=r.parentNode;return r}export function markInvalidFields(n,o){n.querySelectorAll(".fb-field-invalid").forEach(e=>e.classList.remove("fb-field-invalid"));let t=null;(o||[]).forEach(function(e){const r=K(n,e.name);r&&(r.classList.add("fb-field-invalid"),t||(t=r))}),t&&t.scrollIntoView&&t.scrollIntoView({behavior:"smooth",block:"center"})}export function showValidationPopup(n){const o=(n.missing||[]).map(e=>"<strong>"+j(e.label)+"</strong> is required.").concat((n.errors||[]).map(j)),t=o.join("<br>");if(typeof E<"u"&&E.alert){E.alert(t,{title:"Please complete this step"});return}window.alert(o.join(`
2
- `).replace(/<[^>]+>/g,""))}function j(n){return String(n).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function F(n,o){let t=!1;n.addEventListener("dm-form-end",function(e){const r=e.detail&&e.detail.validation;if(r&&!r.valid){markInvalidFields(n,r.missing),showValidationPopup(r);return}t||(t=!0,n.classList.add("fb-form-loading"),Promise.resolve(o(e.detail&&e.detail.values||{})).catch(function(){}).finally(function(){t=!1,n.classList.remove("fb-form-loading")}))})}function C(n,o,t){const e=n.querySelector(".fb-form-success, .fb-form-error");e&&e.remove();const r=document.createElement("div");r.className=t==="success"?"fb-form-success":"fb-form-error",r.textContent=o,n.appendChild(r)}function A(n,o){if(n._formLogicRuntime=o,n._formLogicObserver&&(n._formLogicObserver.disconnect(),n._formLogicObserver=null),!n.parentNode||typeof MutationObserver>"u"||n._formLogicObserved)return;n._formLogicObserved=!0;const t=new MutationObserver(function(e){for(const r of e)for(const i of r.removedNodes)if(i===n||i.nodeType===1&&i.contains&&i.contains(n)){n._formLogicRuntime&&n._formLogicRuntime.destroy(),t.disconnect();return}});t.observe(n.parentNode,{childList:!0,subtree:!1}),n._formLogicObserver=t}function Y(n){const o=n&&n.logic;return!!(o&&(o.visibility||o.requirement))}function B(n,o){const t={};return n.forEach(function(e){if(e.type==="page-break"||e.type==="spacer"||!e.name)return;const r=e.type==="chooser"||!!(e.variant&&["select","radio","checkbox-group"].includes(e.type)),i=e.type==="checkbox"?"boolean":e.type==="date"||e.type==="icon"||e.type==="image"?"string":r?"chooser":e.type,c={...e.formConfig||{}};c.span==="full"&&o&&(c.span=o);const s={type:i,label:e.label||e.name,required:Y(e)?!1:e.required||!1,options:e.options,formConfig:{...e.placeholder&&{placeholder:e.placeholder},...e.helper&&{helperText:e.helper},...e.tooltip&&{tooltip:e.tooltip},...c}};e.minLength!==void 0&&(s.minLength=e.minLength),e.maxLength!==void 0&&(s.maxLength=e.maxLength),e.min!==void 0&&(s.min=e.min),e.max!==void 0&&(s.max=e.max),r&&(e.variant&&(s.variant=e.variant),(e.multiple||e.type==="checkbox-group")&&(s.multiple=!0),e.density&&(s.density=e.density),e.columns&&(s.columns=e.columns),e.accent&&(s.accent=e.accent),e.accentStyle&&(s.accentStyle=e.accentStyle),e.glow&&(s.glow=!0),e.glowColour&&(s.glowColour=e.glowColour),e.shadow&&(s.shadow=e.shadow),e.shadowColour&&(s.shadowColour=e.shadowColour)),t[e.name]=s}),t}function $(n){const o={};return n.forEach(function(t){if(!(!t.name||t.type==="page-break"||t.type==="spacer")&&(t.type==="select"||t.type==="multiselect")&&t.required){const e=(t.options||[])[0];e&&(o[t.name]=typeof e=="object"?e.value:e)}}),o}function R(n,o){(o||[]).forEach(function(t){if(t.type!=="date"||!t.name)return;const e=n.querySelector('[name="'+t.name+'"]');e&&e.type!=="date"&&(e.type="date")})}const O="padding:.45rem .7rem;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);background:transparent;color:inherit;cursor:pointer;font:inherit;font-size:.85em;flex-shrink:0;line-height:1.2;";function z(n){const o=document.createElement("div");o.style.cssText="position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.55);display:flex;align-items:center;justify-content:center;padding:20px;";const t=document.createElement("div");t.style.cssText="background:var(--dm-surface-overlay,var(--dm-surface));color:var(--dm-text);border:1px solid var(--dm-border);border-radius:10px;width:100%;max-width:560px;max-height:75vh;display:flex;flex-direction:column;gap:.6rem;padding:1rem;box-shadow:var(--dm-shadow-lg,0 12px 40px rgba(0,0,0,.35));";const e=document.createElement("div");e.style.cssText="display:flex;align-items:center;justify-content:space-between;gap:.5rem;";const r=document.createElement("strong");r.textContent=n;const i=document.createElement("button");i.type="button",i.textContent="\xD7",i.setAttribute("aria-label","Close"),i.style.cssText=O+"font-size:1rem;padding:.15rem .55rem;",e.appendChild(r),e.appendChild(i),t.appendChild(e);const c=document.createElement("div");c.style.cssText="display:flex;flex-direction:column;gap:.6rem;overflow:hidden;min-height:0;",t.appendChild(c),o.appendChild(t);const s=l=>{l.key==="Escape"&&a()};function a(){document.removeEventListener("keydown",s),o.remove()}return i.addEventListener("click",a),o.addEventListener("click",l=>{l.target===o&&a()}),document.addEventListener("keydown",s),document.body.appendChild(o),{body:c,close:a}}function G(n){const{body:o,close:t}=z("Choose an icon"),e=document.createElement("input");e.type="text",e.placeholder="Search icons\u2026",e.className="form-input",e.style.cssText="padding:.45rem .6rem;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);background:var(--dm-input-bg,transparent);color:var(--dm-text);",o.appendChild(e);const r=document.createElement("div");r.style.cssText="display:grid;grid-template-columns:repeat(auto-fill,minmax(46px,1fr));gap:4px;overflow-y:auto;min-height:0;",o.appendChild(r);const i=window.I&&typeof I.list=="function"?I.list():[],c=i.map(s=>{const a=document.createElement("button");a.type="button",a.title=s,a.dataset.iconName=s,a.style.cssText="display:flex;align-items:center;justify-content:center;padding:.55rem 0;border:1px solid transparent;border-radius:6px;background:transparent;color:inherit;cursor:pointer;";const l=document.createElement("span");return l.setAttribute("data-icon",s),l.setAttribute("data-icon-size","18"),a.appendChild(l),a.addEventListener("mouseenter",()=>{a.style.borderColor="var(--dm-border)"}),a.addEventListener("mouseleave",()=>{a.style.borderColor="transparent"}),a.addEventListener("click",()=>{t(),n(s)}),r.appendChild(a),a});if(!i.length){const s=document.createElement("p");s.textContent="Icon engine unavailable - type an icon name into the field instead.",r.appendChild(s)}window.I?.scan?.(r),e.addEventListener("input",()=>{const s=e.value.trim().toLowerCase();c.forEach(a=>{a.style.display=!s||a.dataset.iconName.includes(s)?"":"none"})}),e.focus()}async function Q(){const n=typeof S<"u"&&S.get?S.get("auth_token"):null;if(!n)return{error:"auth"};const o=r=>fetch("/api/media",{headers:{Authorization:"Bearer "+r}});let t;try{if(t=await o(n),t.status===401&&S.get("auth_refresh_token")){const r=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:S.get("auth_refresh_token")})});if(r.ok){const{token:i}=await r.json();S.set("auth_token",i),t=await o(i)}}}catch{return{error:"load"}}if(!t.ok)return{error:t.status===401||t.status===403?"auth":"load"};const e=await t.json().catch(()=>[]);return{files:(Array.isArray(e)?e:[]).filter(r=>/\.(png|jpe?g|gif|webp|svg|avif)$/i.test(r.name||r.url||""))}}function X(n){const{body:o,close:t}=z("Choose an image"),e=document.createElement("p");e.textContent="Loading media library\u2026",e.style.cssText="margin:0;font-size:.85em;color:var(--dm-text-muted);",o.appendChild(e),Q().then(({files:r,error:i})=>{if(i){e.textContent=i==="auth"?"Sign in with media access to browse the library - or paste an image URL into the field.":"Could not load the media library - paste an image URL into the field instead.";return}if(!r.length){e.textContent="No images in the media library yet.";return}e.remove();const c=document.createElement("div");c.style.cssText="display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:8px;overflow-y:auto;min-height:0;",r.forEach(s=>{const a=document.createElement("button");a.type="button",a.title=s.name||s.url,a.style.cssText="display:flex;flex-direction:column;gap:.25rem;padding:.35rem;border:1px solid var(--dm-border);border-radius:8px;background:transparent;color:inherit;cursor:pointer;min-width:0;";const l=document.createElement("img");l.src=s.url,l.alt=s.name||"",l.loading="lazy",l.style.cssText="width:100%;height:72px;object-fit:cover;border-radius:5px;";const m=document.createElement("span");m.textContent=s.name||s.url,m.style.cssText="font-size:.68em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;",a.appendChild(l),a.appendChild(m),a.addEventListener("click",()=>{t(),n(s.url)}),c.appendChild(a)}),o.appendChild(c)})}function P(n,o){n.value=o,n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}))}function D(n){const o=document.createElement("div");return o.style.cssText="display:flex;align-items:center;gap:.5rem;",n.parentNode.insertBefore(o,n),o.appendChild(n),n.style.flex="1",n.style.minWidth="0",o}function M(n){const o=document.createElement("button");return o.type="button",o.textContent=n,o.style.cssText=O,o}function Z(n){if(!window.I||typeof I.list!="function")return;const o=D(n),t=document.createElement("span");t.style.cssText="display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;flex-shrink:0;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);";const e=()=>{t.textContent="";const i=n.value.trim();if(!i)return;const c=document.createElement("span");c.setAttribute("data-icon",i),c.setAttribute("data-icon-size","16"),t.appendChild(c),window.I?.scan?.(t)};n.addEventListener("input",e),e();const r=M("Browse");r.addEventListener("click",()=>G(i=>{P(n,i),e()})),o.appendChild(t),o.appendChild(r)}function ee(n){const o=D(n),t=document.createElement("img");t.alt="",t.style.cssText="width:2rem;height:2rem;flex-shrink:0;object-fit:cover;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);display:none;";const e=()=>{const i=n.value.trim();t.style.display=i?"":"none",i&&(t.src=i)};n.addEventListener("input",e),e();const r=M("Browse");r.addEventListener("click",()=>X(i=>{P(n,i),e()})),o.appendChild(t),o.appendChild(r)}export function enhancePickerFields(n,o){const t=typeof n=="string"?document.querySelector(n):n;t&&(o||[]).forEach(function(e){if(!e.name||e.type!=="icon"&&e.type!=="image")return;const r=t.querySelector('[name="'+e.name+'"]');!r||r.dataset.pickerEnhanced||(r.dataset.pickerEnhanced="1",e.type==="icon"?Z(r):ee(r))})}function q(n,o){const t=document.createElement("div");t.className="fb-form-honeypot",t.setAttribute("aria-hidden","true");const e=document.createElement("input");e.name=n.querySelector('[name="website"]')?"_website":"website",t.dataset.hpName=e.name,e.type="text",e.tabIndex=-1,e.autocomplete="url",e.placeholder="https://",t.appendChild(e);const r=document.createElement("input");r.name="_t",r.type="hidden",r.value=o||Date.now(),t.appendChild(r),n.appendChild(t)}function V(n,o){const t=n.querySelector("form");if(!t)return;const e=Array.from(t.querySelectorAll(".form-group"));let r=0;o.forEach(function(i){if(i.type==="spacer"){const c=document.createElement("div");c.className="fb-spacer";const s=e[r];if(s)t.insertBefore(c,s);else{const a=t.querySelector('[type="submit"]');a?t.insertBefore(c,a):t.appendChild(c)}}else i.type!=="page-break"&&r++})}function L(n,o){!n||!o||n.querySelectorAll('input[type="file"]').forEach(function(t){t.name&&t.files&&t.files.length&&o.set(t.name,Array.from(t.files))})}function x(n,o,t,e,r,i){const c=r||e,s=c.querySelector(".fb-form-honeypot"),a=s?.querySelector('input[type="text"]')?.value||"",l=s?.querySelector('[name="_t"]')?.value||"",m=Object.assign({},o);delete m._t,s?.dataset.hpName&&delete m[s.dataset.hpName];const d=new Map(i||[]);L(c,d);const u=d.size>0;let p,b;if(u){const h=new FormData;for(const[g,v]of Object.entries(m))v!=null&&(d.has(g)||h.append(g,typeof v=="object"?JSON.stringify(v):String(v)));for(const[g,v]of d)for(const w of v)h.append(g,w,w.name);h.append("_hp",a),h.append("_t",l),p=h,b={}}else{const h=Object.assign({},m,{_hp:a,_t:l});p=JSON.stringify(h),b={"Content-Type":"application/json"}}return fetch("/api/forms/submit/"+n,{method:"POST",headers:b,body:p}).then(h=>h.json().then(g=>({ok:h.ok,body:g}))).then(h=>{h.ok&&h.body.ok?(e.textContent="",C(e,h.body.message||t.successMessage||"Thank you.","success")):C(e,h.body.error||"Something went wrong.","error")}).catch(()=>{C(e,"Unable to submit. Please check your connection.","error")})}function te(n,o,t,e,r){const i=document.createElement("form");i.noValidate=!0,o.forEach(function(a){const l=document.createElement("div");l.className="form-group",l.style.marginBottom="1.25rem";const m=document.createElement("label");if(m.className="form-label",m.textContent=a.label||a.name,a.required){const u=document.createElement("span");u.textContent=" *",u.style.color="var(--dm-danger)",m.appendChild(u)}let d;a.type==="textarea"?(d=document.createElement("textarea"),d.rows=a.formConfig?.rows||4,d.className="form-input"):a.type==="select"?(d=document.createElement("select"),d.className="form-input",(a.options||[]).forEach(function(u){const p=document.createElement("option");p.value=typeof u=="string"?u:u.value??"",p.textContent=typeof u=="string"?u:u.label||p.value,d.appendChild(p)})):(d=document.createElement("input"),d.type=a.type==="icon"||a.type==="image"?"text":a.type||"text",d.className="form-input",a.placeholder&&(d.placeholder=a.placeholder),a.type==="file"&&(a.file?.accept&&(d.accept=a.file.accept),a.multiple&&(d.multiple=!0))),d.name=a.name,d.required=a.required||!1,l.appendChild(m),l.appendChild(d),i.appendChild(l)}),t.honeypot&&q(i);const c=document.createElement("button");if(c.type="submit",c.className="btn btn-primary",c.textContent=t.submitText||"Submit",H(t,"stacked").length||U(t)){const a=document.createElement("div");a.className="form-group form-buttons",a.appendChild(c),i.appendChild(a)}else i.appendChild(c);if(i.addEventListener("submit",function(a){a.preventDefault();const l={};if(o.forEach(function(m){const d=i.querySelector('[name="'+m.name+'"]');d&&(l[m.name]=d.value)}),window.FormLogicEngine&&r){const m=window.FormLogicEngine,d=[],u=[];if(o.forEach(function(p){if(m.evaluateFieldVisibility(p,l)==="hidden"){delete l[p.name];return}const h=m.evaluateFieldRequirement(p,l),g=l[p.name];h&&(!g||!String(g).trim())&&d.push(p.label||p.name);const v=m.validateField(p,g||"",l);v.length&&u.push(v[0].message)}),d.length||u.length){const p=[];d.length&&p.push("Required: "+d.join(", ")),u.length&&p.push(u.join("; ")),C(n,p.join(". "),"error");return}}if(n.dataset.triggerBlocked==="true"){const m=n._formLogicRuntime,d=m&&m.submitBlock?m.submitBlock().reasons:[];C(n,d.join(" ")||"This form cannot be submitted yet.","error");return}n.classList.add("fb-form-loading"),c.disabled=!0,x(e,l,t,n,i).finally(function(){n.classList.remove("fb-form-loading"),c.disabled=!1})}),n.appendChild(i),N(i,t,"stacked"),enhancePickerFields(n,o),F(n,function(a){return x(e,a,t,n,i)}),window.FormLogicEngine&&r&&T(o)){const a=new window.FormLogicEngine.FormLogicRuntime(r,n);a.init(),n._formLogicRuntime=a}}function ne(n){const o=n.getAttribute("data-form");o&&fetch("/api/forms/"+o+"/public").then(t=>{if(!t.ok)throw new Error("Form not found: "+o);return t.json()}).then(t=>{const e=t.fields||[],r=t.settings||{},i=document.createElement("div");i.className="fb-form-wrapper",n.appendChild(i);const c=e.some(s=>s.type==="page-break");if(typeof Domma<"u"&&Domma.forms){const s=Number(r.columns)===3?3:2,a=r.layout||"grid";if(c&&Domma.forms.wizard){const l=W(e,t.title),m=l.map(f=>f.fields),d=l.map(function(f){return{title:f.title,description:f.description,fields:B(f.fields,s)}});let u=0,p=null,b=null;const h=Date.now(),g=new Map,v=function(f){const y=window.FormLogicEngine;if(!y||!y.validateFields)return;const k=y.validateFields(i,m[u]||[]);k.valid||(f.preventDefault(),f.stopImmediatePropagation(),markInvalidFields(i,k.missing),showValidationPopup(k))},w=function(){const f=m[u]||e;if(J(i,r),R(i,f),enhancePickerFields(i,f),f.some(y=>y.type==="spacer")&&V(i,f),r.honeypot){const y=i.querySelector("form");y&&q(y,h)}window.FormLogicEngine&&T(e)&&(p&&p.destroy(),p=new window.FormLogicEngine.FormLogicRuntime(t,i,{baseValues:b&&b.getStepData?b.getStepData():{}}),p.init(),A(i,p)),i.querySelectorAll(".wizard-next, .wizard-submit").forEach(y=>y.addEventListener("click",v,!0))};b=Domma.forms.wizard(i,{schema:{steps:d},layout:a,columns:s,finishText:r.submitText||"Finish",onStepChange:function(f){L(i,g),u=f,setTimeout(w,0)},onSubmit:function(f){return L(i,g),x(o,f,r,i,null,g)}}),F(i,function(f){return L(i,g),x(o,f,r,i,null,g)}),i.addEventListener("dm-form-trigger",function(f){if(!f.detail||f.detail.type!=="goto-step"||!b||!b.goToStep)return;const y=Number(f.detail.action.step);!isFinite(y)||y<0||y>=d.length||y!==u&&b.goToStep(y)}),Promise.resolve(b).then(w)}else if(Domma.forms.render){const l=B(e,s),m=$(e);F(i,function(u){return x(o,u,r,i,null)});const d=Domma.forms.render(i,l,m,{submitText:r.submitText||"Submit",layout:a,columns:s,onSubmit:function(u){return x(o,u,r,i,null)}});Promise.resolve(d).then(function(){if(N(i,r,a),R(i,e),enhancePickerFields(i,e),window.FormLogicEngine&&T(e)){const u=new window.FormLogicEngine.FormLogicRuntime(t,i);u.init(),A(i,u)}if(e.some(u=>u.type==="spacer")&&V(i,e),r.honeypot){const u=i.querySelector("form");u&&q(u)}})}}else te(i,e.filter(s=>s.type!=="page-break"&&s.type!=="spacer"),r,o,t)}).catch(t=>{const e=document.createElement("p");e.textContent="Form unavailable.",e.style.cssText="color:var(--dm-danger);font-style:italic;",n.appendChild(e),console.warn("[forms]",t.message)})}
1
+ import{buildWizardSteps as J}from"/public/js/form-steps.mjs";import{applyFormClasses as T,applySubmitButtons as _,applyWizardButtons as U,resolveSecondaryButton as H,submitWrapperClasses as K}from"/public/js/form-submit.mjs";const j=document.querySelectorAll("[data-form]");j.length&&j.forEach(oe);function F(n){return(n||[]).some(o=>o.logic||Array.isArray(o.triggers)&&o.triggers.length)}function Y(n,o){const t=n.querySelector('[name="'+o+'"], [name="'+o+'[]"]')||n.querySelector('[data-chooser-field="'+o+'"]');if(!t)return null;const e=t.closest("form")||n;let i=t;for(;i.parentNode&&i.parentNode!==e;)i=i.parentNode;return i}export function markInvalidFields(n,o){n.querySelectorAll(".fb-field-invalid").forEach(e=>e.classList.remove("fb-field-invalid"));let t=null;(o||[]).forEach(function(e){const i=Y(n,e.name);i&&(i.classList.add("fb-field-invalid"),t||(t=i))}),t&&t.scrollIntoView&&t.scrollIntoView({behavior:"smooth",block:"center"})}export function showValidationPopup(n){const o=(n.missing||[]).map(e=>"<strong>"+A(e.label)+"</strong> is required.").concat((n.errors||[]).map(A)),t=o.join("<br>");if(typeof E<"u"&&E.alert){E.alert(t,{title:"Please complete this step"});return}window.alert(o.join(`
2
+ `).replace(/<[^>]+>/g,""))}function A(n){return String(n).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function q(n,o){let t=!1;n.addEventListener("dm-form-end",function(e){const i=e.detail&&e.detail.validation;if(i&&!i.valid){markInvalidFields(n,i.missing),showValidationPopup(i);return}t||(t=!0,n.classList.add("fb-form-loading"),Promise.resolve(o(e.detail&&e.detail.values||{})).catch(function(){}).finally(function(){t=!1,n.classList.remove("fb-form-loading")}))})}function C(n,o,t){const e=n.querySelector(".fb-form-success, .fb-form-error");e&&e.remove();const i=document.createElement("div");i.className=t==="success"?"fb-form-success":"fb-form-error",i.textContent=o,n.appendChild(i)}function B(n,o){if(n._formLogicRuntime=o,n._formLogicObserver&&(n._formLogicObserver.disconnect(),n._formLogicObserver=null),!n.parentNode||typeof MutationObserver>"u"||n._formLogicObserved)return;n._formLogicObserved=!0;const t=new MutationObserver(function(e){for(const i of e)for(const r of i.removedNodes)if(r===n||r.nodeType===1&&r.contains&&r.contains(n)){n._formLogicRuntime&&n._formLogicRuntime.destroy(),t.disconnect();return}});t.observe(n.parentNode,{childList:!0,subtree:!1}),n._formLogicObserver=t}function $(n){const o=n&&n.logic;return!!(o&&(o.visibility||o.requirement))}function R(n,o){const t={};return n.forEach(function(e){if(e.type==="page-break"||e.type==="spacer"||!e.name)return;const i=e.type==="chooser"||!!(e.variant&&["select","radio","checkbox-group"].includes(e.type)),r=e.type==="checkbox"?"boolean":e.type==="date"||e.type==="icon"||e.type==="image"?"string":i?"chooser":e.type,l={...e.formConfig||{}};l.span==="full"&&o&&(l.span=o);const s={type:r,label:e.label||e.name,required:$(e)?!1:e.required||!1,options:e.options,formConfig:{...e.placeholder&&{placeholder:e.placeholder},...e.helper&&{helperText:e.helper},...e.tooltip&&{tooltip:e.tooltip},...l}};e.minLength!==void 0&&(s.minLength=e.minLength),e.maxLength!==void 0&&(s.maxLength=e.maxLength),e.min!==void 0&&(s.min=e.min),e.max!==void 0&&(s.max=e.max),i&&(e.variant&&(s.variant=e.variant),(e.multiple||e.type==="checkbox-group")&&(s.multiple=!0),e.density&&(s.density=e.density),e.columns&&(s.columns=e.columns),e.accent&&(s.accent=e.accent),e.accentStyle&&(s.accentStyle=e.accentStyle),e.glow&&(s.glow=!0),e.glowColour&&(s.glowColour=e.glowColour),e.shadow&&(s.shadow=e.shadow),e.shadowColour&&(s.shadowColour=e.shadowColour)),t[e.name]=s}),t}function G(n){const o={};return n.forEach(function(t){if(!(!t.name||t.type==="page-break"||t.type==="spacer")&&(t.type==="select"||t.type==="multiselect")&&t.required){const e=(t.options||[])[0];e&&(o[t.name]=typeof e=="object"?e.value:e)}}),o}function O(n,o){(o||[]).forEach(function(t){if(t.type!=="date"||!t.name)return;const e=n.querySelector('[name="'+t.name+'"]');e&&e.type!=="date"&&(e.type="date")})}const z="padding:.45rem .7rem;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);background:transparent;color:inherit;cursor:pointer;font:inherit;font-size:.85em;flex-shrink:0;line-height:1.2;";function P(n){const o=document.createElement("div");o.style.cssText="position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,.55);display:flex;align-items:center;justify-content:center;padding:20px;";const t=document.createElement("div");t.style.cssText="background:var(--dm-surface-overlay,var(--dm-surface));color:var(--dm-text);border:1px solid var(--dm-border);border-radius:10px;width:100%;max-width:560px;max-height:75vh;display:flex;flex-direction:column;gap:.6rem;padding:1rem;box-shadow:var(--dm-shadow-lg,0 12px 40px rgba(0,0,0,.35));";const e=document.createElement("div");e.style.cssText="display:flex;align-items:center;justify-content:space-between;gap:.5rem;";const i=document.createElement("strong");i.textContent=n;const r=document.createElement("button");r.type="button",r.textContent="\xD7",r.setAttribute("aria-label","Close"),r.style.cssText=z+"font-size:1rem;padding:.15rem .55rem;",e.appendChild(i),e.appendChild(r),t.appendChild(e);const l=document.createElement("div");l.style.cssText="display:flex;flex-direction:column;gap:.6rem;overflow:hidden;min-height:0;",t.appendChild(l),o.appendChild(t);const s=c=>{c.key==="Escape"&&a()};function a(){document.removeEventListener("keydown",s),o.remove()}return r.addEventListener("click",a),o.addEventListener("click",c=>{c.target===o&&a()}),document.addEventListener("keydown",s),document.body.appendChild(o),{body:l,close:a}}function Q(n){const{body:o,close:t}=P("Choose an icon"),e=document.createElement("input");e.type="text",e.placeholder="Search icons\u2026",e.className="form-input",e.style.cssText="padding:.45rem .6rem;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);background:var(--dm-input-bg,transparent);color:var(--dm-text);",o.appendChild(e);const i=document.createElement("div");i.style.cssText="display:grid;grid-template-columns:repeat(auto-fill,minmax(46px,1fr));gap:4px;overflow-y:auto;min-height:0;",o.appendChild(i);const r=window.I&&typeof I.list=="function"?I.list():[],l=r.map(s=>{const a=document.createElement("button");a.type="button",a.title=s,a.dataset.iconName=s,a.style.cssText="display:flex;align-items:center;justify-content:center;padding:.55rem 0;border:1px solid transparent;border-radius:6px;background:transparent;color:inherit;cursor:pointer;";const c=document.createElement("span");return c.setAttribute("data-icon",s),c.setAttribute("data-icon-size","18"),a.appendChild(c),a.addEventListener("mouseenter",()=>{a.style.borderColor="var(--dm-border)"}),a.addEventListener("mouseleave",()=>{a.style.borderColor="transparent"}),a.addEventListener("click",()=>{t(),n(s)}),i.appendChild(a),a});if(!r.length){const s=document.createElement("p");s.textContent="Icon engine unavailable - type an icon name into the field instead.",i.appendChild(s)}window.I?.scan?.(i),e.addEventListener("input",()=>{const s=e.value.trim().toLowerCase();l.forEach(a=>{a.style.display=!s||a.dataset.iconName.includes(s)?"":"none"})}),e.focus()}async function X(){const n=typeof S<"u"&&S.get?S.get("auth_token"):null;if(!n)return{error:"auth"};const o=i=>fetch("/api/media",{headers:{Authorization:"Bearer "+i}});let t;try{if(t=await o(n),t.status===401&&S.get("auth_refresh_token")){const i=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:S.get("auth_refresh_token")})});if(i.ok){const{token:r}=await i.json();S.set("auth_token",r),t=await o(r)}}}catch{return{error:"load"}}if(!t.ok)return{error:t.status===401||t.status===403?"auth":"load"};const e=await t.json().catch(()=>[]);return{files:(Array.isArray(e)?e:[]).filter(i=>/\.(png|jpe?g|gif|webp|svg|avif)$/i.test(i.name||i.url||""))}}function Z(n){const{body:o,close:t}=P("Choose an image"),e=document.createElement("p");e.textContent="Loading media library\u2026",e.style.cssText="margin:0;font-size:.85em;color:var(--dm-text-muted);",o.appendChild(e),X().then(({files:i,error:r})=>{if(r){e.textContent=r==="auth"?"Sign in with media access to browse the library - or paste an image URL into the field.":"Could not load the media library - paste an image URL into the field instead.";return}if(!i.length){e.textContent="No images in the media library yet.";return}e.remove();const l=document.createElement("div");l.style.cssText="display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:8px;overflow-y:auto;min-height:0;",i.forEach(s=>{const a=document.createElement("button");a.type="button",a.title=s.name||s.url,a.style.cssText="display:flex;flex-direction:column;gap:.25rem;padding:.35rem;border:1px solid var(--dm-border);border-radius:8px;background:transparent;color:inherit;cursor:pointer;min-width:0;";const c=document.createElement("img");c.src=s.url,c.alt=s.name||"",c.loading="lazy",c.style.cssText="width:100%;height:72px;object-fit:cover;border-radius:5px;";const m=document.createElement("span");m.textContent=s.name||s.url,m.style.cssText="font-size:.68em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;",a.appendChild(c),a.appendChild(m),a.addEventListener("click",()=>{t(),n(s.url)}),l.appendChild(a)}),o.appendChild(l)})}function D(n,o){n.value=o,n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}))}function M(n){const o=document.createElement("div");return o.style.cssText="display:flex;align-items:center;gap:.5rem;",n.parentNode.insertBefore(o,n),o.appendChild(n),n.style.flex="1",n.style.minWidth="0",o}function V(n){const o=document.createElement("button");return o.type="button",o.textContent=n,o.style.cssText=z,o}function ee(n){if(!window.I||typeof I.list!="function")return;const o=M(n),t=document.createElement("span");t.style.cssText="display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;flex-shrink:0;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);";const e=()=>{t.textContent="";const r=n.value.trim();if(!r)return;const l=document.createElement("span");l.setAttribute("data-icon",r),l.setAttribute("data-icon-size","16"),t.appendChild(l),window.I?.scan?.(t)};n.addEventListener("input",e),e();const i=V("Browse");i.addEventListener("click",()=>Q(r=>{D(n,r),e()})),o.appendChild(t),o.appendChild(i)}function te(n){const o=M(n),t=document.createElement("img");t.alt="",t.style.cssText="width:2rem;height:2rem;flex-shrink:0;object-fit:cover;border:1px solid var(--dm-border);border-radius:var(--dm-radius-md,6px);display:none;";const e=()=>{const r=n.value.trim();t.style.display=r?"":"none",r&&(t.src=r)};n.addEventListener("input",e),e();const i=V("Browse");i.addEventListener("click",()=>Z(r=>{D(n,r),e()})),o.appendChild(t),o.appendChild(i)}export function enhancePickerFields(n,o){const t=typeof n=="string"?document.querySelector(n):n;t&&(o||[]).forEach(function(e){if(!e.name||e.type!=="icon"&&e.type!=="image")return;const i=t.querySelector('[name="'+e.name+'"]');!i||i.dataset.pickerEnhanced||(i.dataset.pickerEnhanced="1",e.type==="icon"?ee(i):te(i))})}function N(n,o){const t=document.createElement("div");t.className="fb-form-honeypot",t.setAttribute("aria-hidden","true");const e=document.createElement("input");e.name=n.querySelector('[name="website"]')?"_website":"website",t.dataset.hpName=e.name,e.type="text",e.tabIndex=-1,e.autocomplete="url",e.placeholder="https://",t.appendChild(e);const i=document.createElement("input");i.name="_t",i.type="hidden",i.value=o||Date.now(),t.appendChild(i),n.appendChild(t)}function W(n,o){const t=n.querySelector("form");if(!t)return;const e=Array.from(t.querySelectorAll(".form-group"));let i=0;o.forEach(function(r){if(r.type==="spacer"){const l=document.createElement("div");l.className="fb-spacer";const s=e[i];if(s)t.insertBefore(l,s);else{const a=t.querySelector('[type="submit"]');a?t.insertBefore(l,a):t.appendChild(l)}}else r.type!=="page-break"&&i++})}function L(n,o){!n||!o||n.querySelectorAll('input[type="file"]').forEach(function(t){t.name&&t.files&&t.files.length&&o.set(t.name,Array.from(t.files))})}function x(n,o,t,e,i,r){const l=i||e,s=l.querySelector(".fb-form-honeypot"),a=s?.querySelector('input[type="text"]')?.value||"",c=s?.querySelector('[name="_t"]')?.value||"",m=Object.assign({},o);delete m._t,s?.dataset.hpName&&delete m[s.dataset.hpName];const d=new Map(r||[]);L(l,d);const u=d.size>0;let p,b;if(u){const h=new FormData;for(const[g,v]of Object.entries(m))v!=null&&(d.has(g)||h.append(g,typeof v=="object"?JSON.stringify(v):String(v)));for(const[g,v]of d)for(const w of v)h.append(g,w,w.name);h.append("_hp",a),h.append("_t",c),p=h,b={}}else{const h=Object.assign({},m,{_hp:a,_t:c});p=JSON.stringify(h),b={"Content-Type":"application/json"}}return fetch("/api/forms/submit/"+n,{method:"POST",headers:b,body:p}).then(h=>h.json().then(g=>({ok:h.ok,body:g}))).then(h=>{h.ok&&h.body.ok?(e.textContent="",C(e,h.body.message||t.successMessage||"Thank you.","success")):C(e,h.body.error||"Something went wrong.","error")}).catch(()=>{C(e,"Unable to submit. Please check your connection.","error")})}function ne(n,o,t,e,i){const r=document.createElement("form");r.noValidate=!0,o.forEach(function(a){const c=document.createElement("div");c.className="form-group",c.style.marginBottom="1.25rem",a.name&&(c.dataset.field=a.name);const m=document.createElement("label");if(m.className="form-label",m.textContent=a.label||a.name,a.required){const u=document.createElement("span");u.textContent=" *",u.style.color="var(--dm-danger)",m.appendChild(u)}let d;a.type==="textarea"?(d=document.createElement("textarea"),d.rows=a.formConfig?.rows||4,d.className="form-input"):a.type==="select"?(d=document.createElement("select"),d.className="form-input",(a.options||[]).forEach(function(u){const p=document.createElement("option");p.value=typeof u=="string"?u:u.value??"",p.textContent=typeof u=="string"?u:u.label||p.value,d.appendChild(p)})):(d=document.createElement("input"),d.type=a.type==="icon"||a.type==="image"?"text":a.type||"text",d.className="form-input",a.placeholder&&(d.placeholder=a.placeholder),a.type==="file"&&(a.file?.accept&&(d.accept=a.file.accept),a.multiple&&(d.multiple=!0))),d.name=a.name,d.required=a.required||!1,c.appendChild(m),c.appendChild(d),r.appendChild(c)}),t.honeypot&&N(r);const l=document.createElement("button");if(l.type="submit",l.className="btn btn-primary",l.textContent=t.submitText||"Submit",K(t,"stacked").length||H(t)){const a=document.createElement("div");a.className="form-group form-buttons",a.appendChild(l),r.appendChild(a)}else r.appendChild(l);if(r.addEventListener("submit",function(a){a.preventDefault();const c={};if(o.forEach(function(m){const d=r.querySelector('[name="'+m.name+'"]');d&&(c[m.name]=d.value)}),window.FormLogicEngine&&i){const m=window.FormLogicEngine,d=[],u=[];if(o.forEach(function(p){if(m.evaluateFieldVisibility(p,c)==="hidden"){delete c[p.name];return}const h=m.evaluateFieldRequirement(p,c),g=c[p.name];h&&(!g||!String(g).trim())&&d.push(p.label||p.name);const v=m.validateField(p,g||"",c);v.length&&u.push(v[0].message)}),d.length||u.length){const p=[];d.length&&p.push("Required: "+d.join(", ")),u.length&&p.push(u.join("; ")),C(n,p.join(". "),"error");return}}if(n.dataset.triggerBlocked==="true"){const m=n._formLogicRuntime,d=m&&m.submitBlock?m.submitBlock().reasons:[];C(n,d.join(" ")||"This form cannot be submitted yet.","error");return}n.classList.add("fb-form-loading"),l.disabled=!0,x(e,c,t,n,r).finally(function(){n.classList.remove("fb-form-loading"),l.disabled=!1})}),n.appendChild(r),_(r,t,"stacked"),T(r,t,o),enhancePickerFields(n,o),q(n,function(a){return x(e,a,t,n,r)}),window.FormLogicEngine&&i&&F(o)){const a=new window.FormLogicEngine.FormLogicRuntime(i,n);a.init(),n._formLogicRuntime=a}}function oe(n){const o=n.getAttribute("data-form");o&&fetch("/api/forms/"+o+"/public").then(t=>{if(!t.ok)throw new Error("Form not found: "+o);return t.json()}).then(t=>{const e=t.fields||[],i=t.settings||{},r=document.createElement("div");r.className="fb-form-wrapper",n.appendChild(r);const l=e.some(s=>s.type==="page-break");if(typeof Domma<"u"&&Domma.forms){const s=Number(i.columns)===3?3:2,a=i.layout||"grid";if(l&&Domma.forms.wizard){const c=J(e,t.title),m=c.map(f=>f.fields),d=c.map(function(f){return{title:f.title,description:f.description,fields:R(f.fields,s)}});let u=0,p=null,b=null;const h=Date.now(),g=new Map,v=function(f){const y=window.FormLogicEngine;if(!y||!y.validateFields)return;const k=y.validateFields(r,m[u]||[]);k.valid||(f.preventDefault(),f.stopImmediatePropagation(),markInvalidFields(r,k.missing),showValidationPopup(k))},w=function(){const f=m[u]||e;if(U(r,i),T(r,i,f),O(r,f),enhancePickerFields(r,f),f.some(y=>y.type==="spacer")&&W(r,f),i.honeypot){const y=r.querySelector("form");y&&N(y,h)}window.FormLogicEngine&&F(e)&&(p&&p.destroy(),p=new window.FormLogicEngine.FormLogicRuntime(t,r,{baseValues:b&&b.getStepData?b.getStepData():{}}),p.init(),B(r,p)),r.querySelectorAll(".wizard-next, .wizard-submit").forEach(y=>y.addEventListener("click",v,!0))};b=Domma.forms.wizard(r,{schema:{steps:d},layout:a,columns:s,finishText:i.submitText||"Finish",onStepChange:function(f){L(r,g),u=f,setTimeout(w,0)},onSubmit:function(f){return L(r,g),x(o,f,i,r,null,g)}}),q(r,function(f){return L(r,g),x(o,f,i,r,null,g)}),r.addEventListener("dm-form-trigger",function(f){if(!f.detail||f.detail.type!=="goto-step"||!b||!b.goToStep)return;const y=Number(f.detail.action.step);!isFinite(y)||y<0||y>=d.length||y!==u&&b.goToStep(y)}),Promise.resolve(b).then(w)}else if(Domma.forms.render){const c=R(e,s),m=G(e);q(r,function(u){return x(o,u,i,r,null)});const d=Domma.forms.render(r,c,m,{submitText:i.submitText||"Submit",layout:a,columns:s,onSubmit:function(u){return x(o,u,i,r,null)}});Promise.resolve(d).then(function(){if(_(r,i,a),T(r,i,e),O(r,e),enhancePickerFields(r,e),window.FormLogicEngine&&F(e)){const u=new window.FormLogicEngine.FormLogicRuntime(t,r);u.init(),B(r,u)}if(e.some(u=>u.type==="spacer")&&W(r,e),i.honeypot){const u=r.querySelector("form");u&&N(u)}})}}else ne(r,e.filter(s=>s.type!=="page-break"&&s.type!=="spacer"),i,o,t)}).catch(t=>{const e=document.createElement("p");e.textContent="Form unavailable.",e.style.cssText="color:var(--dm-danger);font-style:italic;",n.appendChild(e),console.warn("[forms]",t.message)})}
@@ -1 +1 @@
1
- export const PRESET_COLOUR_VARS={primary:"--dm-primary",success:"--dm-success",danger:"--dm-danger",warning:"--dm-warning",info:"--dm-info",neutral:"--dm-text-muted"},PRESET_COLOUR_FALLBACKS={primary:"#0d6efd",success:"#198754",danger:"#dc3545",warning:"#ffc107",info:"#0dcaf0",neutral:"#6c757d"};const f=/^#[0-9a-fA-F]{6}$/;export function colourToCss(t){return typeof t!="string"?"":PRESET_COLOUR_VARS[t]?`var(${PRESET_COLOUR_VARS[t]}, ${PRESET_COLOUR_FALLBACKS[t]})`:f.test(t)?t:""}export const FLOAT_ANCHORS=["TL","TR","BL","BR","L","R"],FLOAT_DEFAULTS={anchor:"TL",offsetX:16,offsetY:16,zIndex:150},FLOAT_SHADOWS={none:"none",sm:"var(--dm-shadow-sm)",md:"var(--dm-shadow-md)",lg:"var(--dm-shadow-lg)",xl:"var(--dm-shadow-xl)"};function a(t,e,o,n){const r=Number(t);return Number.isFinite(r)?Math.min(n,Math.max(o,Math.round(r))):e}function u(t){const e=[];if(t.radius!=null&&t.radius!==""&&e.push(`border-radius:${a(t.radius,8,0,48)}px`),t.shadow!=null&&t.shadow!==""&&Object.prototype.hasOwnProperty.call(FLOAT_SHADOWS,t.shadow)&&e.push(`box-shadow:${FLOAT_SHADOWS[t.shadow]}`),t.accent&&colourToCss(t.accent)){const o=colourToCss(t.accent);e.push(`--dm-menu-accent:${o}`,`border-color:${o}`)}return t.opacity!=null&&t.opacity!==""&&e.push(`--dm-menu-panel-opacity:${a(t.opacity,100,20,100)/100}`),e}export function floatToCss(t){if(!t||t.position!=="floating")return"";const e=t.float&&typeof t.float=="object"&&!Array.isArray(t.float)?t.float:{},o=FLOAT_ANCHORS.includes(e.anchor)?e.anchor:FLOAT_DEFAULTS.anchor,n=a(e.offsetX,FLOAT_DEFAULTS.offsetX,0,4e3),r=a(e.offsetY,FLOAT_DEFAULTS.offsetY,0,4e3),s=["position:fixed",`z-index:${a(e.zIndex,FLOAT_DEFAULTS.zIndex,0,2147483647)}`];return o==="L"||o==="R"?(s.push("top:50%","transform:translateY(-50%)"),s.push(o==="L"?`left:${n}px`:`right:${n}px`)):(s.push(o[0]==="T"?`top:${r}px`:`bottom:${r}px`),s.push(o[1]==="L"?`left:${n}px`:`right:${n}px`)),e.width!=null&&e.width!==""&&s.push(`width:${a(e.width,260,120,600)}px`),s.push(`max-height:calc(100vh - ${o==="L"||o==="R"?32:r*2}px)`),s.push(...u(e)),s.join(";")}export const FLOAT_FLAGS=["collapsible","collapsed","movable","resizable"];export function floatBehaviour(t){const e={collapsible:!1,collapsed:!1,movable:!1,resizable:!1,chrome:!1,title:""};if(!t||t.position!=="floating")return e;const o=t.float&&typeof t.float=="object"&&!Array.isArray(t.float)?t.float:{},n={collapsible:!!o.collapsible,collapsed:!!o.collapsible&&!!o.collapsed,movable:!!o.movable,resizable:!!o.resizable},r=n.collapsible||n.movable,i=typeof o.title=="string"&&o.title!==""?o.title:t.name||"";return{...n,chrome:r,title:r?i:""}}export function applyFloat(t,e){const o=floatToCss(e);if(!t||!o)return!1;t.style.cssText+=";"+o,t.classList.add("dm-menu-floating"),e.slug&&!t.hasAttribute("data-menu")&&t.setAttribute("data-menu",e.slug),e.float?.anchor&&t.setAttribute("data-float-anchor",e.float.anchor);const n=floatBehaviour(e);for(const r of FLOAT_FLAGS)r!=="collapsed"&&n[r]&&t.setAttribute(`data-float-${r}`,"1");return n.collapsed&&t.setAttribute("data-float-collapsed","1"),n.title&&t.setAttribute("data-float-title",n.title),!0}export function makeBadgeEl(t){if(!t||t.text==null||t.text==="")return null;const e=document.createElement("span");e.className="dm-menu-badge",e.textContent=String(t.text);const o=t.variant?colourToCss(t.variant):"";return o&&(e.style.background=o,e.style.color="var(--dm-text-inverse, #fff)"),e}export function applyColour(t,e){const o=colourToCss(e);o&&(t.style.color=o)}export function applyPill(t,e){if(!e)return;t.classList.add("dm-nav-pill");const o=e.variant?colourToCss(e.variant):"";e.style==="outline"?(t.classList.add("dm-nav-pill--outline"),o&&(t.style.borderColor=o,t.style.color=o)):o&&(t.style.background=o,t.style.color="#fff")}export const MENU_ALIGN=["left","centre","right","spread"];export function menuAlign(t){const e=t&&t.align;return MENU_ALIGN.includes(e)?e:""}export const HIGHLIGHT_HOVER=["none","colour","underline","overline","background","uppercase","grow","breathe","glow"],HIGHLIGHT_ACTIVE=["none","bold","underline","overline","background","darken","pill"],HIGHLIGHT_HOVER_LABELS={none:"None - no change on hover",colour:"Colour change",underline:"Underline",overline:"Overline",background:"Background tint",uppercase:"Uppercase",grow:"Grow",breathe:"Breathe",glow:"Glow"},HIGHLIGHT_ACTIVE_LABELS={none:"None - not marked at all",bold:"Bold",underline:"Underline",overline:"Overline",background:"Background tint",darken:"Darkened",pill:"Filled pill"},LEGACY_STYLE_HOVER={none:"none",underline:"underline",overline:"overline",transform:"uppercase","text-transform":"uppercase",breathe:"breathe"},LEGACY_STYLE_ACTIVE={none:"none",darken:"darken",background:"background","background-color":"background",underline:"underline",overline:"overline"};export function legacyStyleHighlight(t){const e=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{hover:LEGACY_STYLE_HOVER[e.hover]||"",active:LEGACY_STYLE_ACTIVE[e.active]||""}}export function highlightAttrs(t){const e=t&&t.highlight&&typeof t.highlight=="object"&&!Array.isArray(t.highlight)?t.highlight:{},o=legacyStyleHighlight(t&&t.style);return{hover:HIGHLIGHT_HOVER.includes(e.hover)?e.hover:o.hover,active:HIGHLIGHT_ACTIVE.includes(e.active)?e.active:o.active,accent:e.accent?colourToCss(e.accent):""}}export function applyHighlight(t,e){if(!t)return!1;const{hover:o,active:n,accent:r}=highlightAttrs(e);return o&&t.setAttribute("data-menu-hover",o),n&&t.setAttribute("data-menu-active",n),r&&t.style.setProperty("--dm-menu-highlight",r),!!(o||n||r)}export function itemHighlightAttrs(t){const e=t&&t.highlight&&typeof t.highlight=="object"&&!Array.isArray(t.highlight)?t.highlight:{};return{hover:HIGHLIGHT_HOVER.includes(e.hover)?e.hover:"",active:HIGHLIGHT_ACTIVE.includes(e.active)?e.active:"",accent:e.accent?colourToCss(e.accent):""}}export function applyItemHighlight(t,e){if(!t)return!1;const{hover:o,active:n,accent:r}=itemHighlightAttrs(e);return o&&t.setAttribute("data-menu-item-hover",o),n&&t.setAttribute("data-menu-item-active",n),r&&t.style.setProperty("--dm-menu-highlight",r),!!(o||n||r)}function c(t){if(typeof t!="string"||!t)return"";const e=t.split("#")[0].split("?")[0];return e.startsWith("/")?e.length>1&&e.endsWith("/")?e.slice(0,-1):e:""}export function isCurrentItem(t,e){const o=c(t),n=c(e);return!!o&&!!n&&o===n}export const CSS_CLASS_RE=/^-?[_a-zA-Z][_a-zA-Z0-9-]*$/,CSS_CLASS_MAX=20,CSS_CLASS_MAX_LEN=64;function l(t){return typeof t!="string"?[]:t.split(/[\s,]+/).map(e=>e.replace(/^\./,"")).filter(Boolean)}export function cssClasses(t){const e=[];for(const o of l(t))if(o.length<=CSS_CLASS_MAX_LEN&&CSS_CLASS_RE.test(o)&&!e.includes(o)&&e.push(o),e.length>=CSS_CLASS_MAX)break;return e}export function cssClassProblems(t){if(t==null||t==="")return[];if(typeof t!="string")return["must be a string of class names"];const e=l(t),o=e.filter(r=>r.length>CSS_CLASS_MAX_LEN||!CSS_CLASS_RE.test(r)),n=[];return o.length&&n.push(`not a valid class name: ${o.join(", ")}`),e.length>CSS_CLASS_MAX&&n.push(`at most ${CSS_CLASS_MAX} classes`),n}export function normaliseCssClasses(t){return cssClasses(t).join(" ")}export function applyClasses(t,e){if(!t)return!1;const o=cssClasses(e);return o.length&&t.classList.add(...o),o.length>0}
1
+ export const PRESET_COLOUR_VARS={primary:"--dm-primary",success:"--dm-success",danger:"--dm-danger",warning:"--dm-warning",info:"--dm-info",neutral:"--dm-text-muted"},PRESET_COLOUR_FALLBACKS={primary:"#0d6efd",success:"#198754",danger:"#dc3545",warning:"#ffc107",info:"#0dcaf0",neutral:"#6c757d"};const l=/^#[0-9a-fA-F]{6}$/;export function colourToCss(t){return typeof t!="string"?"":PRESET_COLOUR_VARS[t]?`var(${PRESET_COLOUR_VARS[t]}, ${PRESET_COLOUR_FALLBACKS[t]})`:l.test(t)?t:""}export const FLOAT_ANCHORS=["TL","TR","BL","BR","L","R"],FLOAT_DEFAULTS={anchor:"TL",offsetX:16,offsetY:16,zIndex:150},FLOAT_SHADOWS={none:"none",sm:"var(--dm-shadow-sm)",md:"var(--dm-shadow-md)",lg:"var(--dm-shadow-lg)",xl:"var(--dm-shadow-xl)"};function s(t,e,o,r){const n=Number(t);return Number.isFinite(n)?Math.min(r,Math.max(o,Math.round(n))):e}function d(t){const e=[];if(t.radius!=null&&t.radius!==""&&e.push(`border-radius:${s(t.radius,8,0,48)}px`),t.shadow!=null&&t.shadow!==""&&Object.prototype.hasOwnProperty.call(FLOAT_SHADOWS,t.shadow)&&e.push(`box-shadow:${FLOAT_SHADOWS[t.shadow]}`),t.accent&&colourToCss(t.accent)){const o=colourToCss(t.accent);e.push(`--dm-menu-accent:${o}`,`border-color:${o}`)}return t.opacity!=null&&t.opacity!==""&&e.push(`--dm-menu-panel-opacity:${s(t.opacity,100,20,100)/100}`),e}export function floatToCss(t){if(!t||t.position!=="floating")return"";const e=t.float&&typeof t.float=="object"&&!Array.isArray(t.float)?t.float:{},o=FLOAT_ANCHORS.includes(e.anchor)?e.anchor:FLOAT_DEFAULTS.anchor,r=s(e.offsetX,FLOAT_DEFAULTS.offsetX,0,4e3),n=s(e.offsetY,FLOAT_DEFAULTS.offsetY,0,4e3),a=["position:fixed",`z-index:${s(e.zIndex,FLOAT_DEFAULTS.zIndex,0,2147483647)}`];return o==="L"||o==="R"?(a.push("top:50%","transform:translateY(-50%)"),a.push(o==="L"?`left:${r}px`:`right:${r}px`)):(a.push(o[0]==="T"?`top:${n}px`:`bottom:${n}px`),a.push(o[1]==="L"?`left:${r}px`:`right:${r}px`)),e.width!=null&&e.width!==""&&a.push(`width:${s(e.width,260,120,600)}px`),a.push(`max-height:calc(100vh - ${o==="L"||o==="R"?32:n*2}px)`),a.push(...d(e)),a.join(";")}export const FLOAT_FLAGS=["collapsible","collapsed","movable","resizable"];export function floatBehaviour(t){const e={collapsible:!1,collapsed:!1,movable:!1,resizable:!1,chrome:!1,title:""};if(!t||t.position!=="floating")return e;const o=t.float&&typeof t.float=="object"&&!Array.isArray(t.float)?t.float:{},r={collapsible:!!o.collapsible,collapsed:!!o.collapsible&&!!o.collapsed,movable:!!o.movable,resizable:!!o.resizable},n=r.collapsible||r.movable,i=typeof o.title=="string"&&o.title!==""?o.title:t.name||"";return{...r,chrome:n,title:n?i:""}}export function applyFloat(t,e){const o=floatToCss(e);if(!t||!o)return!1;t.style.cssText+=";"+o,t.classList.add("dm-menu-floating"),e.slug&&!t.hasAttribute("data-menu")&&t.setAttribute("data-menu",e.slug),e.float?.anchor&&t.setAttribute("data-float-anchor",e.float.anchor);const r=floatBehaviour(e);for(const n of FLOAT_FLAGS)n!=="collapsed"&&r[n]&&t.setAttribute(`data-float-${n}`,"1");return r.collapsed&&t.setAttribute("data-float-collapsed","1"),r.title&&t.setAttribute("data-float-title",r.title),!0}export function makeBadgeEl(t){if(!t||t.text==null||t.text==="")return null;const e=document.createElement("span");e.className="dm-menu-badge",e.textContent=String(t.text);const o=t.variant?colourToCss(t.variant):"";return o&&(e.style.background=o,e.style.color="var(--dm-text-inverse, #fff)"),e}export function applyColour(t,e){const o=colourToCss(e);o&&(t.style.color=o)}export function applyPill(t,e){if(!e)return;t.classList.add("dm-nav-pill");const o=e.variant?colourToCss(e.variant):"";e.style==="outline"?(t.classList.add("dm-nav-pill--outline"),o&&(t.style.borderColor=o,t.style.color=o)):o&&(t.style.background=o,t.style.color="#fff")}export const MENU_ALIGN=["left","centre","right","spread"];export function menuAlign(t){const e=t&&t.align;return MENU_ALIGN.includes(e)?e:""}export const HIGHLIGHT_HOVER=["none","colour","underline","overline","background","darken","uppercase","grow","breathe","glow"],HIGHLIGHT_ACTIVE=["none","bold","underline","overline","background","darken","pill"],HIGHLIGHT_HOVER_LABELS={none:"None - no change on hover",colour:"Colour change",underline:"Underline",overline:"Overline",background:"Background tint",darken:"Darkened",uppercase:"Uppercase",grow:"Grow",breathe:"Breathe",glow:"Glow"},HIGHLIGHT_ACTIVE_LABELS={none:"None - not marked at all",bold:"Bold",underline:"Underline",overline:"Overline",background:"Background tint",darken:"Darkened",pill:"Filled pill"},LEGACY_STYLE_HOVER={none:"none",underline:"underline",overline:"overline",transform:"uppercase","text-transform":"uppercase",breathe:"breathe"},LEGACY_STYLE_ACTIVE={none:"none",darken:"darken",background:"background","background-color":"background",underline:"underline",overline:"overline"};export function legacyStyleHighlight(t){const e=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return{hover:LEGACY_STYLE_HOVER[e.hover]||"",active:LEGACY_STYLE_ACTIVE[e.active]||""}}export function highlightAttrs(t){const e=t&&t.highlight&&typeof t.highlight=="object"&&!Array.isArray(t.highlight)?t.highlight:{},o=legacyStyleHighlight(t&&t.style);return{hover:HIGHLIGHT_HOVER.includes(e.hover)?e.hover:o.hover,active:HIGHLIGHT_ACTIVE.includes(e.active)?e.active:o.active,accent:e.accent?colourToCss(e.accent):""}}export function applyHighlight(t,e){if(!t)return!1;const{hover:o,active:r,accent:n}=highlightAttrs(e);return o&&t.setAttribute("data-menu-hover",o),r&&t.setAttribute("data-menu-active",r),n&&t.style.setProperty("--dm-menu-highlight",n),!!(o||r||n)}export function itemHighlightAttrs(t){const e=t&&t.highlight&&typeof t.highlight=="object"&&!Array.isArray(t.highlight)?t.highlight:{};return{hover:HIGHLIGHT_HOVER.includes(e.hover)?e.hover:"",active:HIGHLIGHT_ACTIVE.includes(e.active)?e.active:"",accent:e.accent?colourToCss(e.accent):""}}export function applyItemHighlight(t,e){if(!t)return!1;const{hover:o,active:r,accent:n}=itemHighlightAttrs(e);return o&&t.setAttribute("data-menu-item-hover",o),r&&t.setAttribute("data-menu-item-active",r),n&&t.style.setProperty("--dm-menu-highlight",n),!!(o||r||n)}function c(t){if(typeof t!="string"||!t)return"";const e=t.split("#")[0].split("?")[0];return e.startsWith("/")?e.length>1&&e.endsWith("/")?e.slice(0,-1):e:""}export function isCurrentItem(t,e){const o=c(t),r=c(e);return!!o&&!!r&&o===r}export{CSS_CLASS_RE,CSS_CLASS_MAX,CSS_CLASS_MAX_LEN,cssClasses,cssClassProblems,normaliseCssClasses,applyClasses}from"./css-classes.mjs";
package/public/js/site.js CHANGED
@@ -1 +1 @@
1
- import{makeBadgeEl as O,applyColour as B,applyPill as J,applyFloat as W,applyHighlight as z,applyItemHighlight as X,itemHighlightAttrs as G,isCurrentItem as j,menuAlign as Y,applyClasses as M,cssClasses as U}from"/public/js/menu-decor.mjs?v=20261009-menu-classes";import{initFloatingMenus as K}from"/public/js/menu-float.js?v=20260829-float-panel";import{enhancePickerFields as R,markInvalidFields as P,showValidationPopup as V}from"/public/js/forms.js?v=20260927-submit-btn";import{buildWizardSteps as Q}from"/public/js/form-steps.mjs";import{applySubmitButtons as Z,applyWizardButtons as ee}from"/public/js/form-submit.mjs";$(()=>{const x=window.__CMS_NAV__||{},y=window.__CMS_SITE__||{};if(y.autoTheme?.enabled){let t=function(e){const i=(e||"07:00").split(":");return+i[0]*60+(+i[1]||0)},s=function(){const e=new Date,i=e.getHours()*60+e.getMinutes();return i>=t(n.dayStart)&&i<t(n.nightStart)?n.dayTheme:n.nightTheme},a=function(e){const i=n.apply&&n.apply[e]||{theme:e,custom:""};Domma.theme.set(i.theme);for(const p of[...document.body.classList])p.startsWith("dm-custom-")&&document.body.classList.remove(p);i.custom&&document.body.classList.add(i.custom)};const n=y.autoTheme;a(s()),setInterval(()=>a(s()),6e4)}const _=$("#site-navbar");if(_.length&&x.brand){let s=function(c,h=0){return Array.isArray(c)?c.filter(r=>!(r&&r.type==="spacer")).filter(r=>!(r&&r.type==="separator"&&h===0)).map(r=>r&&r.type==="separator"?{divider:!0}:Array.isArray(r?.items)?{...r,items:s(r.items,h+1)}:r):c},a=function(c){return Array.isArray(c)?c.filter(h=>!(h&&(h.type==="separator"||h.type==="spacer"))):[]};const n={...x.brand},t=n.size&&n.size!=="md"?` navbar-brand-${n.size}`:"";if(n.logo||n.icon||n.tagline){let c="";n.logo?c+=`<img src="${n.logo}" class="navbar-brand-logo" alt="${n.text||""}">`:n.icon&&(c+=`<span data-icon="${n.icon}" style="width:1.1em;height:1.1em;margin-right:.35em;vertical-align:middle;"></span>`),n.text&&(c+=`<span class="navbar-brand-text${t}">${n.text}</span>`),n.tagline&&(c+=`<small class="navbar-brand-tagline">${n.tagline}</small>`),n.html=c}else t&&n.text&&(n.html=`<span class="navbar-brand-text${t}">${n.text}</span>`);const e=x.position==="floating",i=x.orientation==="vertical";Domma.elements.navbar("#site-navbar",{brand:n,items:s(x.items||[]),variant:x.variant||"dark",position:e?"static":x.position||"sticky",collapsible:!0,appearOnHover:!!x.appearOnHover}),Domma.icons.scan("#site-navbar");const p=_.get(0);p.classList.add(`dm-nav-align-${Y(x)||"centre"}`),i&&_.get(0).classList.add("dm-nav-vertical",x.side==="right"?"dm-nav-vertical-right":"dm-nav-vertical-left"),z(p,x),M(p,x.class),e&&(W(_.get(0),x),K(_.get(0).parentNode||document));const g=p.querySelector(".navbar-toggle"),u=p.querySelector(".navbar-collapse");if(g&&u){let c=null;const h=()=>{u.classList.contains("show")&&g.click()},r=()=>{c&&(c.remove(),c=null),document.body.classList.remove("dm-drawer-open")},o=()=>{c||(c=document.createElement("div"),c.className="dm-navbar-backdrop",c.addEventListener("click",h),document.body.appendChild(c),document.body.classList.add("dm-drawer-open"))};g.addEventListener("click",()=>{requestAnimationFrame(()=>{u.classList.contains("show")?o():r()})}),u.addEventListener("click",l=>{l.target.closest("a")&&requestAnimationFrame(r)}),document.addEventListener("keydown",l=>{l.key==="Escape"&&u.classList.contains("show")&&h()})}const m=p.querySelector(".navbar-nav");if(m){const c=Array.from(m.children);let h=0;for(const r of x.items||[])if(!(r&&r.type==="separator")){if(r&&r.type==="spacer"){const o=document.createElement("li"),l=["xs","sm","md","lg","xl","flex"].includes(r.size)?r.size:"md";o.className=`dm-menu-spacer dm-menu-spacer--${l}`,o.setAttribute("aria-hidden","true"),m.insertBefore(o,c[h]||null);continue}h++}}const b=a(x.items||[]);p.querySelectorAll(".navbar-link[data-index], .navbar-dropdown-item[data-index]").forEach(c=>{const h=b[parseInt(c.dataset.index,10)];if(!h)return;const r=c.dataset.subindex!=null,o=r&&Array.isArray(h.items)?h.items[parseInt(c.dataset.subindex,10)]:h;if(!o)return;o.colour&&B(c,o.colour),o.pill&&!r&&J(c,o.pill),X(c,o),M(c.closest("li"),o.class);const l=O(o.badge);l&&c.appendChild(l),j(o.url,location.pathname)&&(c.classList.add("active"),c.setAttribute("aria-current","page"))})}const C=$("#site-footer");if(C.length){let e=function(o){return String(o??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},i=function(o){return e(o).replace(/'/g,"&#39;")},p=function(o){if(o&&o.type==="separator")return'<li class="footer-sep"><hr></li>';if(o&&o.type==="spacer")return`<li class="dm-menu-spacer dm-menu-spacer--${["xs","sm","md","lg","xl","flex"].includes(o.size)?o.size:"md"}" aria-hidden="true"></li>`;const l=i(o.url||"#"),d=e(o.text||""),w=Array.isArray(o.items)&&o.items.length?`<ul>${o.items.map(p).join("")}</ul>`:"",v=G(o),D=[v.hover&&` data-menu-item-hover="${i(v.hover)}"`,v.active&&` data-menu-item-active="${i(v.active)}"`].filter(Boolean).join(""),q=v.accent?` style="--dm-menu-highlight:${i(v.accent)}"`:"",k=U(o.class).join(" ");return`<li${k?` class="${i(k)}"`:""}><a href="${l}"${D}${q}>${d}</a>${w}</li>`},g=function(o,l){return(o||[]).forEach(d=>{d&&(d.type==="separator"||d.type==="spacer")||(l.push(d),Array.isArray(d.items)&&d.items.length&&g(d.items,l))}),l};const n=y.social||{},t={twitter:{label:"X / Twitter",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.742l7.73-8.835L1.254 2.25H8.08l4.259 5.629L18.244 2.25zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>'},facebook:{label:"Facebook",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>'},instagram:{label:"Instagram",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>'},linkedin:{label:"LinkedIn",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>'},github:{label:"GitHub",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>'},youtube:{label:"YouTube",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.495 6.205a3.007 3.007 0 00-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 00.527 6.205a31.247 31.247 0 00-.522 5.805 31.247 31.247 0 00.522 5.783 3.007 3.007 0 002.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 002.088-2.088 31.247 31.247 0 00.5-5.783 31.247 31.247 0 00-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg>'}};let s='<div class="footer-inner container">';const a=window.__CMS_FOOTER__||{primary:[],legal:[],copyright:""};if(a.copyright&&(s+=`<p>${e(a.copyright)}</p>`),a.primary.length&&(s+=`<nav class="footer-nav footer-nav--primary"><ul>${a.primary.map(p).join("")}</ul></nav>`),a.legal.length&&(s+=`<nav class="footer-nav footer-nav--legal"><ul>${a.legal.map(p).join("")}</ul></nav>`),y.footer){const o=Object.keys(t).filter(l=>n[l]);o.length&&(s+='<div class="footer-social">',o.forEach(l=>{const{label:d,svg:w}=t[l];s+=`<a href="${n[l]}" target="_blank" rel="noopener noreferrer" aria-label="${d}" class="footer-social-link">${w}</a>`}),s+="</div>")}s+="</div>",C.html(s);const u=[...g(a.primary,[]),...g(a.legal,[])];C.get(0).querySelectorAll(".footer-nav a").forEach((o,l)=>{const d=u[l];if(!d)return;d.colour&&B(o,d.colour);const w=O(d.badge);w&&o.appendChild(w),j(d.url,location.pathname)&&(o.classList.add("is-active"),o.setAttribute("aria-current","page"))}),z(C.get(0).querySelector(".footer-nav--primary"),{highlight:a.primaryHighlight}),z(C.get(0).querySelector(".footer-nav--legal"),{highlight:a.legalHighlight}),M(C.get(0).querySelector(".footer-nav--primary"),a.primaryClass),M(C.get(0).querySelector(".footer-nav--legal"),a.legalClass);const b=y.footer?.showMotionToggle!==!1,c=S.get("reduced_motion"),h=c!==null?!!c:!!(window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches),r=C.get(0).querySelector(".footer-inner");if(b&&r){const o=document.createElement("input");o.type="checkbox",o.className="form-switch-input",o.id="dm-motion-switch",o.checked=h,o.addEventListener("change",function(){S.set("reduced_motion",this.checked),window.location.reload()});const l=document.createElement("span");l.className="form-switch-label",l.textContent="Reduce motion";const d=document.createElement("label");d.className="form-switch footer-motion-switch",d.title="Reduce motion",d.appendChild(o),d.appendChild(l),r.appendChild(d)}}$("#site-sidebar").length&&Domma.elements.sidebar("#site-sidebar",{autoGenerate:!0,selector:"h2, h3",collapsible:!1,push:!0,contentSelector:".site-content"}),Domma.icons.scan(),Domma.syntax?.scan&&Domma.syntax.scan();const f=$(".page-body");if(f.length){f.find(".accordion").each(function(){Domma.elements.accordion(this,{allowMultiple:this.dataset.multi==="true"})}),f.find(".tabs").each(function(){Domma.elements.tabs(this)}),f.find(".carousel").each(function(){const n={autoplay:this.dataset.autoplay==="true",interval:parseInt(this.dataset.interval,10)||5e3,loop:this.dataset.loop!=="false",animation:this.dataset.animation||"slide"};if(this.dataset.animationDuration){const t=parseInt(this.dataset.animationDuration,10);Number.isFinite(t)&&(n.animationDuration=t)}this.dataset.animationEasing&&(n.animationEasing=this.dataset.animationEasing),this.dataset.ctx&&(this._dmCtxSlides=Array.from(this.querySelectorAll(".carousel-slide")).map(t=>t.cloneNode(!0)),this._dmCarouselOpts=n),this._dmCarousel=Domma.elements.carousel(this,n)}),f.find(".dm-countdown").each(function(){const n={autoStart:!0},t=String(this.dataset.format||"").trim(),s=String(this.dataset.to||"").trim(),a=/^(\d{4})-(\d{2})-(\d{2})$/.exec(s),e=a?new Date(+a[1],+a[2]-1,+a[3]).getTime():s?new Date(s).getTime():NaN;Number.isFinite(e)?n.duration=Math.max(0,e-Date.now()):this.dataset.duration&&(n.duration=(parseInt(this.dataset.duration,10)||0)*1e3);const i=/^dd:/i.test(t);n.format=i?"hh:mm:ss":t||(n.duration>=36e5?"hh:mm:ss":"mm:ss");const p=this,g=m=>String(m).padStart(2,"0"),u=m=>{const b=Math.max(0,Math.floor(m/1e3)),c=p.querySelector(".dm-timer-time");c&&(c.textContent=`${g(Math.floor(b/86400))}:${g(Math.floor(b%86400/3600))}:${g(Math.floor(b%3600/60))}:${g(b%60)}`)};i&&(n.onTick=u),Domma.elements.timer(this,n),i&&u(n.duration||0)}),f.find("[data-tooltip]").each(function(){Domma.elements.tooltip(this,{content:$(this).data("tooltip"),position:$(this).data("tooltip-position")||"top"})}),f.find(".dm-progression").each(function(){const n=Array.from(this.querySelectorAll(".dm-progression-item")).map(a=>{const e={title:a.querySelector(".dm-progression-item-title")?.textContent?.trim()||"",description:a.querySelector(".dm-progression-item-body")?.innerHTML?.trim()||""};return a.dataset.date&&(e.date=a.dataset.date),a.dataset.status&&(e.status=a.dataset.status),a.dataset.entryId&&(e._entryId=a.dataset.entryId),e}),t=this.dataset.layout==="centred"?"centered":this.dataset.layout||"vertical",s=Domma.elements.progression(this,{layout:t,theme:this.dataset.theme||"minimal",mode:this.dataset.mode||"timeline",statusIcons:!0,allowHtml:!0,...n.length?{items:n}:{}});n.length&&(this._dmCtx={instance:s,items:n})});try{Domma.effects.reveal(".page-body .hero",{animation:"slide-up",duration:480,threshold:.06,stagger:60,once:!1})}catch{}document.querySelectorAll(".page-body .row[data-reveal]").forEach(n=>{const t=n.dataset.revealMode||"stagger",s=n.dataset.revealAnimation||"slide-up",a=parseInt(n.dataset.revealDuration,10)||400,e=parseInt(n.dataset.revealStagger,10)||60,i=parseInt(n.dataset.revealDelay,10)||0,p=n.dataset.revealDirection==="rtl",g=Array.from(n.children),u={"slide-up":"translateY(30px)","slide-down":"translateY(-30px)","slide-left":"translateX(30px)","slide-right":"translateX(-30px)",zoom:"scale(0.85)",flip:"perspective(600px) rotateX(15deg)"};g.forEach((m,b)=>{m.style.opacity="0",m.style.transform=u[s]||"",m.style.transition=`opacity ${a}ms ease, transform ${a}ms ease`;const c=p?g.length-1-b:b;m.style.transitionDelay=t==="stagger"?`${i+c*e}ms`:`${i}ms`}),requestAnimationFrame(()=>requestAnimationFrame(()=>{const m=new IntersectionObserver(b=>{b.forEach(c=>{c.isIntersecting&&(c.target.offsetWidth,c.target.style.opacity="1",c.target.style.transform="none",m.unobserve(c.target))})},{threshold:.1});g.forEach(b=>m.observe(b))}))}),f.find(".card[data-collapsible]").each(function(){const n=this.querySelector(".card-header");n&&n.addEventListener("click",()=>this.classList.toggle("is-collapsed"))}),f.find(".dm-so-trigger").each(function(){this.addEventListener("click",()=>{const n=this.dataset.soTarget,t=document.getElementById(n);if(!t)return;const s=E.slideover({title:t.dataset.soTitle||"",size:t.dataset.soSize||"md",position:t.dataset.soPosition||"right"});t.style.display="",s.setContent(t),s.open()})})}if(typeof $.setup=="function"){const n=Object.assign({},window.__CMS_DCONFIG__||{});if(document.querySelectorAll(".dm-page-config[data-config]").forEach(t=>{try{const s=atob(t.dataset.config),a=JSON.parse(s);Object.assign(n,a)}catch{}}),Object.keys(n).length>0){const t={};for(const[s,a]of Object.entries(n)){const e=a?.events?.click,{confirm:i,toast:p,alert:g,prompt:u,...m}=e||{};i||p||g||u?($(s).on("click",async function(c){if(c.preventDefault(),i&&!await E.confirm(i))return;let h=null;if(!(u&&(h=await E.prompt(u,{inputPlaceholder:m.promptPlaceholder||"",inputValue:m.promptDefault||""}),h===null))){if(m.target){const r=$(m.target);m.toggleClass&&r.toggleClass(m.toggleClass),m.addClass&&r.addClass(m.addClass),m.removeClass&&r.removeClass(m.removeClass),h!==null&&(m.setText&&r.text(h),m.setVal&&r.val(h),m.setAttr&&r.attr(m.setAttr,h))}m.href&&(window.location.href=m.href),p&&E.toast(p,{type:m.toastType||"success"}),g&&E.alert(g)}}),Object.keys(m).length&&(t[s]={...a,events:{...a.events,click:m}})):t[s]=a}$.setup(t)}}f.length&&I(f.get(0))}),window.wireCTAButtons=I;function I(x){x.querySelectorAll(".dm-cta-trigger").forEach(y=>{y.__ctaWired||(y.__ctaWired=!0,y.addEventListener("click",async()=>{const _=y.dataset.action,C=y.dataset.entry,A=y.dataset.confirm;let f=S.get("auth_token");if(!f){E.toast("Please log in to perform this action.",{type:"warning"});return}if(A&&!await E.confirm(A))return;const n=Array.from(y.childNodes).map(s=>s.cloneNode(!0));y.disabled=!0,y.textContent="Running\u2026";const t=s=>fetch(`/api/actions/${_}/public`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify(y.dataset.scope?{entryId:C,scope:y.dataset.scope}:{entryId:C})});try{let s=await t(f);if(s.status===401){const e=S.get("auth_refresh_token");if(e){const i=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(i.ok){const{token:p}=await i.json();S.set("auth_token",p),f=p,s=await t(f)}}}const a=await s.json().catch(()=>({}));if(!s.ok)throw new Error(a.error||a.message||`Error ${s.status}`);E.toast(a.message||"Action completed.",{type:"success"})}catch(s){E.toast(s.message||"Action failed.",{type:"error"})}finally{y.disabled=!1,y.textContent="",n.forEach(s=>y.appendChild(s)),Domma.icons.scan(y)}}))})}(function(){const y=document.querySelectorAll('.dm-collection-hydrate[data-collection-scope="mine"]');if(!y.length)return;const _=S.get("auth_token");function C(f,n){const t=document.createElement("div");t.className="dm-collection-display dm-collection-empty";const s=document.createElement("p");if(n){s.appendChild(document.createTextNode("Please "));const a=document.createElement("a");a.href="/login",a.textContent="sign in",s.appendChild(a),s.appendChild(document.createTextNode(" to view your entries."))}else s.textContent=f;return t.appendChild(s),t}function A(f,n){const t=document.createElement("template");t.innerHTML=n||"",f.replaceWith(t.content)}y.forEach(async f=>{const n=f.dataset.collectionAttrs;if(!n)return;if(!_){f.replaceChildren(C("",!0));return}const t=s=>fetch("/api/collections/render-scope",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify({attrs:n})});try{let s=_,a=await t(s);if(a.status===401){const i=S.get("auth_refresh_token");if(i){const p=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:i})});if(p.ok){const{token:g}=await p.json();S.set("auth_token",g),s=g,a=await t(s)}}}if(!a.ok){const{error:i}=await a.json().catch(()=>({}));f.replaceChildren(C(i||"Unable to load entries.",!1));return}const{html:e}=await a.json();A(f,e),window.DommaCollectionBrowser?.hydrate&&window.DommaCollectionBrowser.hydrate(document)}catch{f.replaceChildren(C("Unable to load entries.",!1))}}),setTimeout(()=>{typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(),typeof Domma<"u"&&Domma.syntax?.scan&&Domma.syntax.scan(),I(document.body)},100)})(),(function(){const y=document.querySelectorAll("[data-collection-table]");!y.length||typeof T>"u"||!T.create||y.forEach(_=>{let C;try{C=JSON.parse(atob(_.dataset.payload))}catch{return}const{columns:A,rows:f,search:n,sortable:t,exportable:s,pageSize:a,empty:e,ctaConfig:i,slug:p,exportCfg:g}=C;if(!A?.length)return;if(i){const b=A.findIndex(c=>c.key==="_cta");b!==-1&&(A[b]={key:"_cta",title:"",render:(c,h)=>{const r=document.createElement("button");if(r.className=`btn btn-${i.style||"primary"} dm-cta-trigger`,r.dataset.action=i.action||"",i.scope&&(r.dataset.scope=i.scope),r.dataset.entry=h._entryId||"",i.confirm&&(r.dataset.confirm=i.confirm),i.icon){const o=document.createElement("span");o.dataset.icon=i.icon,r.appendChild(o),r.appendChild(document.createTextNode(" "))}return r.appendChild(document.createTextNode(i.label||"Run")),r}})}const u="col-table-"+Math.random().toString(36).slice(2,7),m=document.createElement("div");m.id=u,_.replaceChildren(m),T.create("#"+u,{data:f,columns:A,search:n,sortable:t,exportable:s,pageSize:a,emptyMessage:e}),i&&I(m),_._dmTable={columns:A,rows:f,slug:p,exportCfg:g,render(b){T.create("#"+u,{data:b,columns:A,search:n,sortable:t,exportable:s,pageSize:a,emptyMessage:e}),i&&I(m)}}})})(),(function(){const y=document.querySelectorAll("[data-form-inline]");if(!y.length||typeof F>"u")return;function _(t){const s=t&&t.logic;return!!(s&&(s.visibility||s.requirement))}function C(t,s){const a={};return(t||[]).forEach(e=>{if(e.type==="page-break"||e.type==="spacer"||!e.name)return;const i=e.type==="chooser"||!!(e.variant&&["select","radio","checkbox-group"].includes(e.type)),p=e.type==="checkbox"?"boolean":e.type==="date"||e.type==="icon"||e.type==="image"?"string":i?"chooser":e.type,g={...e.formConfig||{}};g.span==="full"&&s&&(g.span=s);const u={type:p,required:_(e)?!1:e.required,label:e.label,options:e.options,formConfig:{...e.placeholder&&{placeholder:e.placeholder},...e.helper&&{hint:e.helper},...e.tooltip&&{tooltip:e.tooltip},...g}};e.minLength!==void 0&&(u.minLength=e.minLength),e.maxLength!==void 0&&(u.maxLength=e.maxLength),e.min!==void 0&&(u.min=e.min),e.max!==void 0&&(u.max=e.max),i&&(e.variant&&(u.variant=e.variant),(e.multiple||e.type==="checkbox-group")&&(u.multiple=!0),e.density&&(u.density=e.density),e.columns&&(u.columns=e.columns),e.accent&&(u.accent=e.accent),e.accentStyle&&(u.accentStyle=e.accentStyle),e.glow&&(u.glow=!0),e.glowColour&&(u.glowColour=e.glowColour),e.shadow&&(u.shadow=e.shadow),e.shadowColour&&(u.shadowColour=e.shadowColour)),a[e.name]=u}),a}function A(t){const s={};return(t||[]).forEach(a=>{if(!(!a.name||a.type==="page-break"||a.type==="spacer")&&(a.type==="select"||a.type==="multiselect")&&a.required){const e=(a.options||[])[0];e&&(s[a.name]=typeof e=="object"?e.value:e)}}),s}function f(t,s){(s||[]).forEach(a=>{if(a.type!=="date"||!a.name)return;const e=t.querySelector(`[name="${a.name}"]`);e&&e.type!=="date"&&(e.type="date")})}function n(t,s,a){let e=t.querySelector(".cms-form-message");e||(e=document.createElement("p"),e.className="cms-form-message",t.appendChild(e)),e.textContent=s,e.style.cssText=a?"color:var(--dm-danger);margin-top:.75rem;":"color:var(--dm-success);margin-top:.75rem;"}y.forEach(t=>{let s;try{s=JSON.parse(atob(t.dataset.formInline))}catch{return}const a=s.fields||[],e=s.settings||{},i=Number(e.columns)===3?3:2,p=e.layout||"grid",g=a.some(r=>r.type==="page-break"),u=async r=>{if(t.dataset.triggerBlocked==="true"){const o=t._formLogicRuntime,l=o&&o.submitBlock?o.submitBlock().reasons:[];n(t,l.join(" ")||"This form cannot be submitted yet.",!0);const d=new Error("Blocked by a form trigger");throw d.formSubmitFailed=!0,d}try{const o=t.querySelector(".fb-form-honeypot"),l=o?.querySelector('input[type="text"]')||null,d=o?.querySelector('[name="_t"]')||null,w=Object.assign({},r);delete w._t,o?.dataset.hpName&&delete w[o.dataset.hpName],l!==null&&(w._hp=l.value),d!==null&&(w._t=d.value);const v=await H.post(`/api/forms/submit/${s.slug}`,w);if(v&&v.error){n(t,v.error,!0);const D=new Error(v.error);throw D.formSubmitFailed=!0,D}if(v?.redirect){window.location.href=v.redirect;return}for(;t.firstChild;)t.removeChild(t.firstChild);n(t,v?.message||e.successMessage||"Thank you for your submission.",!1)}catch(o){throw o.formSubmitFailed||n(t,o.message||"Submission failed. Please try again.",!0),o}},m=Date.now();function b(r){const o=r.querySelector("form");if(!o||o.querySelector(".fb-form-honeypot"))return;const l=document.createElement("div");l.className="fb-form-honeypot",l.setAttribute("aria-hidden","true");const d=document.createElement("input");d.name=o.querySelector('[name="website"]')?"_website":"website",l.dataset.hpName=d.name,d.type="text",d.tabIndex=-1,d.autocomplete="url",d.placeholder="https://",l.appendChild(d);const w=document.createElement("input");w.name="_t",w.type="hidden",w.value=m,l.appendChild(w),o.appendChild(l)}function c(r){if(!window.FormLogicEngine||!a.some(l=>l.logic||Array.isArray(l.triggers)&&l.triggers.length))return null;const o=new window.FormLogicEngine.FormLogicRuntime(s,t,r?{baseValues:r}:void 0);if(o.init(),t._formLogicRuntime=o,t._formLogicObserved)return o;if(t._formLogicObserved=!0,t.parentNode&&typeof MutationObserver<"u"){const l=new MutationObserver(function(d){for(const w of d)for(const v of w.removedNodes)if(v===t||v.nodeType===1&&v.contains&&v.contains(t)){t._formLogicRuntime&&t._formLogicRuntime.destroy(),l.disconnect();return}});l.observe(t.parentNode,{childList:!0,subtree:!1}),t._formLogicObserver=l}return o}let h=!1;if(t.addEventListener("dm-form-end",r=>{const o=r.detail?.validation;if(o&&!o.valid){P(t,o.missing),V(o);return}h||(h=!0,u(r.detail?.values||{}).catch(()=>{}).finally(()=>{h=!1}))}),g&&F.wizard){const r=Q(a,s.title),o=r.map(k=>({title:k.title,description:k.description,fields:C(k.fields,i)})),l=r.map(k=>k.fields);let d=0,w=null,v=null;const D=k=>{const L=window.FormLogicEngine;if(!L||!L.validateFields)return;const N=L.validateFields(t,l[d]||[]);N.valid||(k.preventDefault(),k.stopImmediatePropagation(),P(t,N.missing),V(N))},q=()=>{const k=l[d]||a;ee(t,e),f(t,k),R(t,k),e.honeypot!==!1&&b(t),w&&w.destroy(),w=c(v?.getStepData?v.getStepData():void 0),t.querySelectorAll(".wizard-next, .wizard-submit").forEach(L=>L.addEventListener("click",D,!0))};v=F.wizard(t,{schema:{steps:o},layout:p,columns:i,finishText:e.submitText||"Finish",onSubmit:u,onStepChange:k=>{d=k,setTimeout(q,0)}}),t.addEventListener("dm-form-trigger",k=>{if(k.detail?.type!=="goto-step"||!v?.goToStep)return;const L=Number(k.detail.action.step);!Number.isFinite(L)||L<0||L>=o.length||L!==d&&v.goToStep(L)}),Promise.resolve(v).then(q)}else if(F.render){const r=F.render(t,C(a,i),A(a),{submitText:e.submitText||"Submit",layout:p,columns:i,onSubmit:u});Promise.resolve(r).then(function(){Z(t,e,p),f(t,a),R(t,a),e.honeypot!==!1&&b(t),c()})}}),$(document).on("click",".dm-banner__dismiss",function(){$(this).closest(".dm-banner").remove()})})();
1
+ import{makeBadgeEl as O,applyColour as B,applyPill as W,applyFloat as X,applyHighlight as z,applyItemHighlight as G,itemHighlightAttrs as Y,isCurrentItem as j,menuAlign as U,applyClasses as M,cssClasses as K}from"/public/js/menu-decor.mjs?v=20261009-hover-darken";import{initFloatingMenus as Q}from"/public/js/menu-float.js?v=20260829-float-panel";import{enhancePickerFields as R,markInvalidFields as P,showValidationPopup as V}from"/public/js/forms.js?v=20261009-form-classes";import{buildWizardSteps as Z}from"/public/js/form-steps.mjs";import{applyFormClasses as J,applySubmitButtons as ee,applyWizardButtons as te}from"/public/js/form-submit.mjs";$(()=>{const x=window.__CMS_NAV__||{},y=window.__CMS_SITE__||{};if(y.autoTheme?.enabled){let t=function(e){const i=(e||"07:00").split(":");return+i[0]*60+(+i[1]||0)},s=function(){const e=new Date,i=e.getHours()*60+e.getMinutes();return i>=t(n.dayStart)&&i<t(n.nightStart)?n.dayTheme:n.nightTheme},a=function(e){const i=n.apply&&n.apply[e]||{theme:e,custom:""};Domma.theme.set(i.theme);for(const p of[...document.body.classList])p.startsWith("dm-custom-")&&document.body.classList.remove(p);i.custom&&document.body.classList.add(i.custom)};const n=y.autoTheme;a(s()),setInterval(()=>a(s()),6e4)}const _=$("#site-navbar");if(_.length&&x.brand){let s=function(c,h=0){return Array.isArray(c)?c.filter(r=>!(r&&r.type==="spacer")).filter(r=>!(r&&r.type==="separator"&&h===0)).map(r=>r&&r.type==="separator"?{divider:!0}:Array.isArray(r?.items)?{...r,items:s(r.items,h+1)}:r):c},a=function(c){return Array.isArray(c)?c.filter(h=>!(h&&(h.type==="separator"||h.type==="spacer"))):[]};const n={...x.brand},t=n.size&&n.size!=="md"?` navbar-brand-${n.size}`:"";if(n.logo||n.icon||n.tagline){let c="";n.logo?c+=`<img src="${n.logo}" class="navbar-brand-logo" alt="${n.text||""}">`:n.icon&&(c+=`<span data-icon="${n.icon}" style="width:1.1em;height:1.1em;margin-right:.35em;vertical-align:middle;"></span>`),n.text&&(c+=`<span class="navbar-brand-text${t}">${n.text}</span>`),n.tagline&&(c+=`<small class="navbar-brand-tagline">${n.tagline}</small>`),n.html=c}else t&&n.text&&(n.html=`<span class="navbar-brand-text${t}">${n.text}</span>`);const e=x.position==="floating",i=x.orientation==="vertical";Domma.elements.navbar("#site-navbar",{brand:n,items:s(x.items||[]),variant:x.variant||"dark",position:e?"static":x.position||"sticky",collapsible:!0,appearOnHover:!!x.appearOnHover}),Domma.icons.scan("#site-navbar");const p=_.get(0);p.classList.add(`dm-nav-align-${U(x)||"centre"}`),i&&_.get(0).classList.add("dm-nav-vertical",x.side==="right"?"dm-nav-vertical-right":"dm-nav-vertical-left"),z(p,x),M(p,x.class),e&&(X(_.get(0),x),Q(_.get(0).parentNode||document));const g=p.querySelector(".navbar-toggle"),u=p.querySelector(".navbar-collapse");if(g&&u){let c=null;const h=()=>{u.classList.contains("show")&&g.click()},r=()=>{c&&(c.remove(),c=null),document.body.classList.remove("dm-drawer-open")},o=()=>{c||(c=document.createElement("div"),c.className="dm-navbar-backdrop",c.addEventListener("click",h),document.body.appendChild(c),document.body.classList.add("dm-drawer-open"))};g.addEventListener("click",()=>{requestAnimationFrame(()=>{u.classList.contains("show")?o():r()})}),u.addEventListener("click",l=>{l.target.closest("a")&&requestAnimationFrame(r)}),document.addEventListener("keydown",l=>{l.key==="Escape"&&u.classList.contains("show")&&h()})}const m=p.querySelector(".navbar-nav");if(m){const c=Array.from(m.children);let h=0;for(const r of x.items||[])if(!(r&&r.type==="separator")){if(r&&r.type==="spacer"){const o=document.createElement("li"),l=["xs","sm","md","lg","xl","flex"].includes(r.size)?r.size:"md";o.className=`dm-menu-spacer dm-menu-spacer--${l}`,o.setAttribute("aria-hidden","true"),m.insertBefore(o,c[h]||null);continue}h++}}const b=a(x.items||[]);p.querySelectorAll(".navbar-link[data-index], .navbar-dropdown-item[data-index]").forEach(c=>{const h=b[parseInt(c.dataset.index,10)];if(!h)return;const r=c.dataset.subindex!=null,o=r&&Array.isArray(h.items)?h.items[parseInt(c.dataset.subindex,10)]:h;if(!o)return;o.colour&&B(c,o.colour),o.pill&&!r&&W(c,o.pill),G(c,o),M(c.closest("li"),o.class);const l=O(o.badge);l&&c.appendChild(l),j(o.url,location.pathname)&&(c.classList.add("active"),c.setAttribute("aria-current","page"))})}const C=$("#site-footer");if(C.length){let e=function(o){return String(o??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},i=function(o){return e(o).replace(/'/g,"&#39;")},p=function(o){if(o&&o.type==="separator")return'<li class="footer-sep"><hr></li>';if(o&&o.type==="spacer")return`<li class="dm-menu-spacer dm-menu-spacer--${["xs","sm","md","lg","xl","flex"].includes(o.size)?o.size:"md"}" aria-hidden="true"></li>`;const l=i(o.url||"#"),d=e(o.text||""),w=Array.isArray(o.items)&&o.items.length?`<ul>${o.items.map(p).join("")}</ul>`:"",v=Y(o),D=[v.hover&&` data-menu-item-hover="${i(v.hover)}"`,v.active&&` data-menu-item-active="${i(v.active)}"`].filter(Boolean).join(""),q=v.accent?` style="--dm-menu-highlight:${i(v.accent)}"`:"",k=K(o.class).join(" ");return`<li${k?` class="${i(k)}"`:""}><a href="${l}"${D}${q}>${d}</a>${w}</li>`},g=function(o,l){return(o||[]).forEach(d=>{d&&(d.type==="separator"||d.type==="spacer")||(l.push(d),Array.isArray(d.items)&&d.items.length&&g(d.items,l))}),l};const n=y.social||{},t={twitter:{label:"X / Twitter",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.742l7.73-8.835L1.254 2.25H8.08l4.259 5.629L18.244 2.25zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>'},facebook:{label:"Facebook",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>'},instagram:{label:"Instagram",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>'},linkedin:{label:"LinkedIn",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>'},github:{label:"GitHub",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>'},youtube:{label:"YouTube",svg:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.495 6.205a3.007 3.007 0 00-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 00.527 6.205a31.247 31.247 0 00-.522 5.805 31.247 31.247 0 00.522 5.783 3.007 3.007 0 002.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 002.088-2.088 31.247 31.247 0 00.5-5.783 31.247 31.247 0 00-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg>'}};let s='<div class="footer-inner container">';const a=window.__CMS_FOOTER__||{primary:[],legal:[],copyright:""};if(a.copyright&&(s+=`<p>${e(a.copyright)}</p>`),a.primary.length&&(s+=`<nav class="footer-nav footer-nav--primary"><ul>${a.primary.map(p).join("")}</ul></nav>`),a.legal.length&&(s+=`<nav class="footer-nav footer-nav--legal"><ul>${a.legal.map(p).join("")}</ul></nav>`),y.footer){const o=Object.keys(t).filter(l=>n[l]);o.length&&(s+='<div class="footer-social">',o.forEach(l=>{const{label:d,svg:w}=t[l];s+=`<a href="${n[l]}" target="_blank" rel="noopener noreferrer" aria-label="${d}" class="footer-social-link">${w}</a>`}),s+="</div>")}s+="</div>",C.html(s);const u=[...g(a.primary,[]),...g(a.legal,[])];C.get(0).querySelectorAll(".footer-nav a").forEach((o,l)=>{const d=u[l];if(!d)return;d.colour&&B(o,d.colour);const w=O(d.badge);w&&o.appendChild(w),j(d.url,location.pathname)&&(o.classList.add("is-active"),o.setAttribute("aria-current","page"))}),z(C.get(0).querySelector(".footer-nav--primary"),{highlight:a.primaryHighlight}),z(C.get(0).querySelector(".footer-nav--legal"),{highlight:a.legalHighlight}),M(C.get(0).querySelector(".footer-nav--primary"),a.primaryClass),M(C.get(0).querySelector(".footer-nav--legal"),a.legalClass);const b=y.footer?.showMotionToggle!==!1,c=S.get("reduced_motion"),h=c!==null?!!c:!!(window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches),r=C.get(0).querySelector(".footer-inner");if(b&&r){const o=document.createElement("input");o.type="checkbox",o.className="form-switch-input",o.id="dm-motion-switch",o.checked=h,o.addEventListener("change",function(){S.set("reduced_motion",this.checked),window.location.reload()});const l=document.createElement("span");l.className="form-switch-label",l.textContent="Reduce motion";const d=document.createElement("label");d.className="form-switch footer-motion-switch",d.title="Reduce motion",d.appendChild(o),d.appendChild(l),r.appendChild(d)}}$("#site-sidebar").length&&Domma.elements.sidebar("#site-sidebar",{autoGenerate:!0,selector:"h2, h3",collapsible:!1,push:!0,contentSelector:".site-content"}),Domma.icons.scan(),Domma.syntax?.scan&&Domma.syntax.scan();const f=$(".page-body");if(f.length){f.find(".accordion").each(function(){Domma.elements.accordion(this,{allowMultiple:this.dataset.multi==="true"})}),f.find(".tabs").each(function(){Domma.elements.tabs(this)}),f.find(".carousel").each(function(){const n={autoplay:this.dataset.autoplay==="true",interval:parseInt(this.dataset.interval,10)||5e3,loop:this.dataset.loop!=="false",animation:this.dataset.animation||"slide"};if(this.dataset.animationDuration){const t=parseInt(this.dataset.animationDuration,10);Number.isFinite(t)&&(n.animationDuration=t)}this.dataset.animationEasing&&(n.animationEasing=this.dataset.animationEasing),this.dataset.ctx&&(this._dmCtxSlides=Array.from(this.querySelectorAll(".carousel-slide")).map(t=>t.cloneNode(!0)),this._dmCarouselOpts=n),this._dmCarousel=Domma.elements.carousel(this,n)}),f.find(".dm-countdown").each(function(){const n={autoStart:!0},t=String(this.dataset.format||"").trim(),s=String(this.dataset.to||"").trim(),a=/^(\d{4})-(\d{2})-(\d{2})$/.exec(s),e=a?new Date(+a[1],+a[2]-1,+a[3]).getTime():s?new Date(s).getTime():NaN;Number.isFinite(e)?n.duration=Math.max(0,e-Date.now()):this.dataset.duration&&(n.duration=(parseInt(this.dataset.duration,10)||0)*1e3);const i=/^dd:/i.test(t);n.format=i?"hh:mm:ss":t||(n.duration>=36e5?"hh:mm:ss":"mm:ss");const p=this,g=m=>String(m).padStart(2,"0"),u=m=>{const b=Math.max(0,Math.floor(m/1e3)),c=p.querySelector(".dm-timer-time");c&&(c.textContent=`${g(Math.floor(b/86400))}:${g(Math.floor(b%86400/3600))}:${g(Math.floor(b%3600/60))}:${g(b%60)}`)};i&&(n.onTick=u),Domma.elements.timer(this,n),i&&u(n.duration||0)}),f.find("[data-tooltip]").each(function(){Domma.elements.tooltip(this,{content:$(this).data("tooltip"),position:$(this).data("tooltip-position")||"top"})}),f.find(".dm-progression").each(function(){const n=Array.from(this.querySelectorAll(".dm-progression-item")).map(a=>{const e={title:a.querySelector(".dm-progression-item-title")?.textContent?.trim()||"",description:a.querySelector(".dm-progression-item-body")?.innerHTML?.trim()||""};return a.dataset.date&&(e.date=a.dataset.date),a.dataset.status&&(e.status=a.dataset.status),a.dataset.entryId&&(e._entryId=a.dataset.entryId),e}),t=this.dataset.layout==="centred"?"centered":this.dataset.layout||"vertical",s=Domma.elements.progression(this,{layout:t,theme:this.dataset.theme||"minimal",mode:this.dataset.mode||"timeline",statusIcons:!0,allowHtml:!0,...n.length?{items:n}:{}});n.length&&(this._dmCtx={instance:s,items:n})});try{Domma.effects.reveal(".page-body .hero",{animation:"slide-up",duration:480,threshold:.06,stagger:60,once:!1})}catch{}document.querySelectorAll(".page-body .row[data-reveal]").forEach(n=>{const t=n.dataset.revealMode||"stagger",s=n.dataset.revealAnimation||"slide-up",a=parseInt(n.dataset.revealDuration,10)||400,e=parseInt(n.dataset.revealStagger,10)||60,i=parseInt(n.dataset.revealDelay,10)||0,p=n.dataset.revealDirection==="rtl",g=Array.from(n.children),u={"slide-up":"translateY(30px)","slide-down":"translateY(-30px)","slide-left":"translateX(30px)","slide-right":"translateX(-30px)",zoom:"scale(0.85)",flip:"perspective(600px) rotateX(15deg)"};g.forEach((m,b)=>{m.style.opacity="0",m.style.transform=u[s]||"",m.style.transition=`opacity ${a}ms ease, transform ${a}ms ease`;const c=p?g.length-1-b:b;m.style.transitionDelay=t==="stagger"?`${i+c*e}ms`:`${i}ms`}),requestAnimationFrame(()=>requestAnimationFrame(()=>{const m=new IntersectionObserver(b=>{b.forEach(c=>{c.isIntersecting&&(c.target.offsetWidth,c.target.style.opacity="1",c.target.style.transform="none",m.unobserve(c.target))})},{threshold:.1});g.forEach(b=>m.observe(b))}))}),f.find(".card[data-collapsible]").each(function(){const n=this.querySelector(".card-header");n&&n.addEventListener("click",()=>this.classList.toggle("is-collapsed"))}),f.find(".dm-so-trigger").each(function(){this.addEventListener("click",()=>{const n=this.dataset.soTarget,t=document.getElementById(n);if(!t)return;const s=E.slideover({title:t.dataset.soTitle||"",size:t.dataset.soSize||"md",position:t.dataset.soPosition||"right"});t.style.display="",s.setContent(t),s.open()})})}if(typeof $.setup=="function"){const n=Object.assign({},window.__CMS_DCONFIG__||{});if(document.querySelectorAll(".dm-page-config[data-config]").forEach(t=>{try{const s=atob(t.dataset.config),a=JSON.parse(s);Object.assign(n,a)}catch{}}),Object.keys(n).length>0){const t={};for(const[s,a]of Object.entries(n)){const e=a?.events?.click,{confirm:i,toast:p,alert:g,prompt:u,...m}=e||{};i||p||g||u?($(s).on("click",async function(c){if(c.preventDefault(),i&&!await E.confirm(i))return;let h=null;if(!(u&&(h=await E.prompt(u,{inputPlaceholder:m.promptPlaceholder||"",inputValue:m.promptDefault||""}),h===null))){if(m.target){const r=$(m.target);m.toggleClass&&r.toggleClass(m.toggleClass),m.addClass&&r.addClass(m.addClass),m.removeClass&&r.removeClass(m.removeClass),h!==null&&(m.setText&&r.text(h),m.setVal&&r.val(h),m.setAttr&&r.attr(m.setAttr,h))}m.href&&(window.location.href=m.href),p&&E.toast(p,{type:m.toastType||"success"}),g&&E.alert(g)}}),Object.keys(m).length&&(t[s]={...a,events:{...a.events,click:m}})):t[s]=a}$.setup(t)}}f.length&&I(f.get(0))}),window.wireCTAButtons=I;function I(x){x.querySelectorAll(".dm-cta-trigger").forEach(y=>{y.__ctaWired||(y.__ctaWired=!0,y.addEventListener("click",async()=>{const _=y.dataset.action,C=y.dataset.entry,A=y.dataset.confirm;let f=S.get("auth_token");if(!f){E.toast("Please log in to perform this action.",{type:"warning"});return}if(A&&!await E.confirm(A))return;const n=Array.from(y.childNodes).map(s=>s.cloneNode(!0));y.disabled=!0,y.textContent="Running\u2026";const t=s=>fetch(`/api/actions/${_}/public`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify(y.dataset.scope?{entryId:C,scope:y.dataset.scope}:{entryId:C})});try{let s=await t(f);if(s.status===401){const e=S.get("auth_refresh_token");if(e){const i=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})});if(i.ok){const{token:p}=await i.json();S.set("auth_token",p),f=p,s=await t(f)}}}const a=await s.json().catch(()=>({}));if(!s.ok)throw new Error(a.error||a.message||`Error ${s.status}`);E.toast(a.message||"Action completed.",{type:"success"})}catch(s){E.toast(s.message||"Action failed.",{type:"error"})}finally{y.disabled=!1,y.textContent="",n.forEach(s=>y.appendChild(s)),Domma.icons.scan(y)}}))})}(function(){const y=document.querySelectorAll('.dm-collection-hydrate[data-collection-scope="mine"]');if(!y.length)return;const _=S.get("auth_token");function C(f,n){const t=document.createElement("div");t.className="dm-collection-display dm-collection-empty";const s=document.createElement("p");if(n){s.appendChild(document.createTextNode("Please "));const a=document.createElement("a");a.href="/login",a.textContent="sign in",s.appendChild(a),s.appendChild(document.createTextNode(" to view your entries."))}else s.textContent=f;return t.appendChild(s),t}function A(f,n){const t=document.createElement("template");t.innerHTML=n||"",f.replaceWith(t.content)}y.forEach(async f=>{const n=f.dataset.collectionAttrs;if(!n)return;if(!_){f.replaceChildren(C("",!0));return}const t=s=>fetch("/api/collections/render-scope",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify({attrs:n})});try{let s=_,a=await t(s);if(a.status===401){const i=S.get("auth_refresh_token");if(i){const p=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:i})});if(p.ok){const{token:g}=await p.json();S.set("auth_token",g),s=g,a=await t(s)}}}if(!a.ok){const{error:i}=await a.json().catch(()=>({}));f.replaceChildren(C(i||"Unable to load entries.",!1));return}const{html:e}=await a.json();A(f,e),window.DommaCollectionBrowser?.hydrate&&window.DommaCollectionBrowser.hydrate(document)}catch{f.replaceChildren(C("Unable to load entries.",!1))}}),setTimeout(()=>{typeof Domma<"u"&&Domma.icons?.scan&&Domma.icons.scan(),typeof Domma<"u"&&Domma.syntax?.scan&&Domma.syntax.scan(),I(document.body)},100)})(),(function(){const y=document.querySelectorAll("[data-collection-table]");!y.length||typeof T>"u"||!T.create||y.forEach(_=>{let C;try{C=JSON.parse(atob(_.dataset.payload))}catch{return}const{columns:A,rows:f,search:n,sortable:t,exportable:s,pageSize:a,empty:e,ctaConfig:i,slug:p,exportCfg:g}=C;if(!A?.length)return;if(i){const b=A.findIndex(c=>c.key==="_cta");b!==-1&&(A[b]={key:"_cta",title:"",render:(c,h)=>{const r=document.createElement("button");if(r.className=`btn btn-${i.style||"primary"} dm-cta-trigger`,r.dataset.action=i.action||"",i.scope&&(r.dataset.scope=i.scope),r.dataset.entry=h._entryId||"",i.confirm&&(r.dataset.confirm=i.confirm),i.icon){const o=document.createElement("span");o.dataset.icon=i.icon,r.appendChild(o),r.appendChild(document.createTextNode(" "))}return r.appendChild(document.createTextNode(i.label||"Run")),r}})}const u="col-table-"+Math.random().toString(36).slice(2,7),m=document.createElement("div");m.id=u,_.replaceChildren(m),T.create("#"+u,{data:f,columns:A,search:n,sortable:t,exportable:s,pageSize:a,emptyMessage:e}),i&&I(m),_._dmTable={columns:A,rows:f,slug:p,exportCfg:g,render(b){T.create("#"+u,{data:b,columns:A,search:n,sortable:t,exportable:s,pageSize:a,emptyMessage:e}),i&&I(m)}}})})(),(function(){const y=document.querySelectorAll("[data-form-inline]");if(!y.length||typeof F>"u")return;function _(t){const s=t&&t.logic;return!!(s&&(s.visibility||s.requirement))}function C(t,s){const a={};return(t||[]).forEach(e=>{if(e.type==="page-break"||e.type==="spacer"||!e.name)return;const i=e.type==="chooser"||!!(e.variant&&["select","radio","checkbox-group"].includes(e.type)),p=e.type==="checkbox"?"boolean":e.type==="date"||e.type==="icon"||e.type==="image"?"string":i?"chooser":e.type,g={...e.formConfig||{}};g.span==="full"&&s&&(g.span=s);const u={type:p,required:_(e)?!1:e.required,label:e.label,options:e.options,formConfig:{...e.placeholder&&{placeholder:e.placeholder},...e.helper&&{hint:e.helper},...e.tooltip&&{tooltip:e.tooltip},...g}};e.minLength!==void 0&&(u.minLength=e.minLength),e.maxLength!==void 0&&(u.maxLength=e.maxLength),e.min!==void 0&&(u.min=e.min),e.max!==void 0&&(u.max=e.max),i&&(e.variant&&(u.variant=e.variant),(e.multiple||e.type==="checkbox-group")&&(u.multiple=!0),e.density&&(u.density=e.density),e.columns&&(u.columns=e.columns),e.accent&&(u.accent=e.accent),e.accentStyle&&(u.accentStyle=e.accentStyle),e.glow&&(u.glow=!0),e.glowColour&&(u.glowColour=e.glowColour),e.shadow&&(u.shadow=e.shadow),e.shadowColour&&(u.shadowColour=e.shadowColour)),a[e.name]=u}),a}function A(t){const s={};return(t||[]).forEach(a=>{if(!(!a.name||a.type==="page-break"||a.type==="spacer")&&(a.type==="select"||a.type==="multiselect")&&a.required){const e=(a.options||[])[0];e&&(s[a.name]=typeof e=="object"?e.value:e)}}),s}function f(t,s){(s||[]).forEach(a=>{if(a.type!=="date"||!a.name)return;const e=t.querySelector(`[name="${a.name}"]`);e&&e.type!=="date"&&(e.type="date")})}function n(t,s,a){let e=t.querySelector(".cms-form-message");e||(e=document.createElement("p"),e.className="cms-form-message",t.appendChild(e)),e.textContent=s,e.style.cssText=a?"color:var(--dm-danger);margin-top:.75rem;":"color:var(--dm-success);margin-top:.75rem;"}y.forEach(t=>{let s;try{s=JSON.parse(atob(t.dataset.formInline))}catch{return}const a=s.fields||[],e=s.settings||{},i=Number(e.columns)===3?3:2,p=e.layout||"grid",g=a.some(r=>r.type==="page-break"),u=async r=>{if(t.dataset.triggerBlocked==="true"){const o=t._formLogicRuntime,l=o&&o.submitBlock?o.submitBlock().reasons:[];n(t,l.join(" ")||"This form cannot be submitted yet.",!0);const d=new Error("Blocked by a form trigger");throw d.formSubmitFailed=!0,d}try{const o=t.querySelector(".fb-form-honeypot"),l=o?.querySelector('input[type="text"]')||null,d=o?.querySelector('[name="_t"]')||null,w=Object.assign({},r);delete w._t,o?.dataset.hpName&&delete w[o.dataset.hpName],l!==null&&(w._hp=l.value),d!==null&&(w._t=d.value);const v=await H.post(`/api/forms/submit/${s.slug}`,w);if(v&&v.error){n(t,v.error,!0);const D=new Error(v.error);throw D.formSubmitFailed=!0,D}if(v?.redirect){window.location.href=v.redirect;return}for(;t.firstChild;)t.removeChild(t.firstChild);n(t,v?.message||e.successMessage||"Thank you for your submission.",!1)}catch(o){throw o.formSubmitFailed||n(t,o.message||"Submission failed. Please try again.",!0),o}},m=Date.now();function b(r){const o=r.querySelector("form");if(!o||o.querySelector(".fb-form-honeypot"))return;const l=document.createElement("div");l.className="fb-form-honeypot",l.setAttribute("aria-hidden","true");const d=document.createElement("input");d.name=o.querySelector('[name="website"]')?"_website":"website",l.dataset.hpName=d.name,d.type="text",d.tabIndex=-1,d.autocomplete="url",d.placeholder="https://",l.appendChild(d);const w=document.createElement("input");w.name="_t",w.type="hidden",w.value=m,l.appendChild(w),o.appendChild(l)}function c(r){if(!window.FormLogicEngine||!a.some(l=>l.logic||Array.isArray(l.triggers)&&l.triggers.length))return null;const o=new window.FormLogicEngine.FormLogicRuntime(s,t,r?{baseValues:r}:void 0);if(o.init(),t._formLogicRuntime=o,t._formLogicObserved)return o;if(t._formLogicObserved=!0,t.parentNode&&typeof MutationObserver<"u"){const l=new MutationObserver(function(d){for(const w of d)for(const v of w.removedNodes)if(v===t||v.nodeType===1&&v.contains&&v.contains(t)){t._formLogicRuntime&&t._formLogicRuntime.destroy(),l.disconnect();return}});l.observe(t.parentNode,{childList:!0,subtree:!1}),t._formLogicObserver=l}return o}let h=!1;if(t.addEventListener("dm-form-end",r=>{const o=r.detail?.validation;if(o&&!o.valid){P(t,o.missing),V(o);return}h||(h=!0,u(r.detail?.values||{}).catch(()=>{}).finally(()=>{h=!1}))}),g&&F.wizard){const r=Z(a,s.title),o=r.map(k=>({title:k.title,description:k.description,fields:C(k.fields,i)})),l=r.map(k=>k.fields);let d=0,w=null,v=null;const D=k=>{const L=window.FormLogicEngine;if(!L||!L.validateFields)return;const N=L.validateFields(t,l[d]||[]);N.valid||(k.preventDefault(),k.stopImmediatePropagation(),P(t,N.missing),V(N))},q=()=>{const k=l[d]||a;te(t,e),J(t,e,k),f(t,k),R(t,k),e.honeypot!==!1&&b(t),w&&w.destroy(),w=c(v?.getStepData?v.getStepData():void 0),t.querySelectorAll(".wizard-next, .wizard-submit").forEach(L=>L.addEventListener("click",D,!0))};v=F.wizard(t,{schema:{steps:o},layout:p,columns:i,finishText:e.submitText||"Finish",onSubmit:u,onStepChange:k=>{d=k,setTimeout(q,0)}}),t.addEventListener("dm-form-trigger",k=>{if(k.detail?.type!=="goto-step"||!v?.goToStep)return;const L=Number(k.detail.action.step);!Number.isFinite(L)||L<0||L>=o.length||L!==d&&v.goToStep(L)}),Promise.resolve(v).then(q)}else if(F.render){const r=F.render(t,C(a,i),A(a),{submitText:e.submitText||"Submit",layout:p,columns:i,onSubmit:u});Promise.resolve(r).then(function(){ee(t,e,p),J(t,e,a),f(t,a),R(t,a),e.honeypot!==!1&&b(t),c()})}}),$(document).on("click",".dm-banner__dismiss",function(){$(this).closest(".dm-banner").remove()})})();
package/scripts/reset.js CHANGED
@@ -26,7 +26,10 @@ const ENV_FILE = path.join(ROOT, '.env');
26
26
  const DEFAULT_SITE = {
27
27
  title: 'My Site',
28
28
  tagline: 'Powered by Domma CMS',
29
- theme: 'charcoal-dark',
29
+ // Same starting look as a new site (bin/cli.js DEFAULT_SITE).
30
+ theme: 'dreamy-light',
31
+ adminTheme: 'corporate-light',
32
+ fontFamily: 'Open Sans',
30
33
  seo: {
31
34
  defaultTitle: 'My Site',
32
35
  titleSeparator: ' | ',
@@ -48,7 +51,7 @@ const DEFAULT_NAV = {
48
51
  { text: 'About', url: '/about', icon: 'info' },
49
52
  { text: 'Contact', url: '/contact', icon: 'mail' }
50
53
  ],
51
- variant: 'dark',
54
+ variant: 'light',
52
55
  position: 'sticky'
53
56
  };
54
57
 
package/scripts/setup.js CHANGED
@@ -279,11 +279,11 @@ THEMES.forEach((t, i) => {
279
279
 
280
280
  {
281
281
  const rl = createInterface({ input: process.stdin, output: process.stdout });
282
- const choice = (await rl.question(`\n Choice (1-${THEMES.length}, Enter = charcoal-dark): `)).trim();
282
+ const choice = (await rl.question(`\n Choice (1-${THEMES.length}, Enter = dreamy-light): `)).trim();
283
283
  rl.close();
284
284
 
285
285
  const idx = parseInt(choice, 10) - 1;
286
- const theme = (idx >= 0 && idx < THEMES.length) ? THEMES[idx] : 'charcoal-dark';
286
+ const theme = (idx >= 0 && idx < THEMES.length) ? THEMES[idx] : 'dreamy-light';
287
287
 
288
288
  const site = JSON.parse(await readFile(SITE_CONFIG, 'utf8'));
289
289
  site.theme = theme;
@@ -26,7 +26,7 @@ import path from 'path';
26
26
  import {deleteForm, ensureCollectionForForm, ensureFormsDir, listForms, readForm, slugify, writeForm} from '../../services/forms.js';
27
27
  import {executeAction} from '../../services/actions.js';
28
28
  // The same rules the browser draws the buttons by (a Cancel link must be safe).
29
- import {buttonSettingsProblems, publicButtonSettings} from '../../../public/js/form-submit.mjs';
29
+ import {buttonSettingsProblems, formClassProblems, publicButtonSettings} from '../../../public/js/form-submit.mjs';
30
30
  import {createTransport, sendFormEmail} from '../../services/email.js';
31
31
  import {formActionFailed, formTriggerNotice} from '../../services/notification-sources.js';
32
32
  import {
@@ -429,7 +429,7 @@ export async function formsRoutes(fastify) {
429
429
 
430
430
  const now = new Date().toISOString();
431
431
  const body = request.body || {};
432
- const buttonProblems = buttonSettingsProblems(body.settings);
432
+ const buttonProblems = [...buttonSettingsProblems(body.settings), ...formClassProblems(body.settings, body.fields)];
433
433
  if (buttonProblems.length) return reply.status(400).send({ error: buttonProblems[0] });
434
434
  const form = {
435
435
  slug,
@@ -527,7 +527,7 @@ export async function formsRoutes(fastify) {
527
527
  const body = request.body || {};
528
528
  // Only a Cancel link's address can do harm; refuse it rather than
529
529
  // store something the page will not draw.
530
- const buttonProblems = buttonSettingsProblems(body.settings);
530
+ const buttonProblems = [...buttonSettingsProblems(body.settings), ...formClassProblems(body.settings, body.fields)];
531
531
  if (buttonProblems.length) return reply.status(400).send({ error: buttonProblems[0] });
532
532
  const updated = {
533
533
  ...existing,
@@ -7,7 +7,7 @@ import fs from 'fs/promises';
7
7
  import path from 'path';
8
8
  import {fileURLToPath} from 'url';
9
9
  import * as cache from './cache/index.js';
10
- import {buttonSettingsProblems} from '../../public/js/form-submit.mjs';
10
+ import {buttonSettingsProblems, formClassProblems} from '../../public/js/form-submit.mjs';
11
11
 
12
12
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
13
  const ROOT = path.resolve(__dirname, '..', '..');
@@ -134,7 +134,7 @@ export async function createForm(data) {
134
134
  }
135
135
 
136
136
  // A Cancel link to javascript: and the like (public/js/form-submit.mjs).
137
- const buttonProblems = buttonSettingsProblems(settings);
137
+ const buttonProblems = [...buttonSettingsProblems(settings), ...formClassProblems(settings, fields)];
138
138
  if (buttonProblems.length) throw new Error(buttonProblems[0]);
139
139
 
140
140
  // Throw if a form with this slug already exists
@@ -29,7 +29,7 @@
29
29
  <link rel="stylesheet" href="/public/css/forms.css?v=20260927-submit-btn-css">
30
30
  <!-- Menu item hover / current-page effects. Loaded after site.css so a
31
31
  menu's own highlight wins over the blanket link styling there. -->
32
- <link rel="stylesheet" href="/public/css/menu-highlight.css?v=20260905-menu-highlight">
32
+ <link rel="stylesheet" href="/public/css/menu-highlight.css?v=20261009-hover-darken">
33
33
 
34
34
  <!-- Font overrides -->
35
35
  {{fontStyleTag}}
@@ -137,7 +137,7 @@
137
137
  </script>
138
138
 
139
139
  <!-- Site initialisation -->
140
- <script src="/public/js/site.js?v=20261009-menu-classes" type="module"></script>
140
+ <script src="/public/js/site.js?v=20261009-hover-darken" type="module"></script>
141
141
  <script src="/public/js/collection-context.js?v=20260927-ctx" type="module"></script>
142
142
  {{ctxMenusModule}}
143
143
 
@@ -152,7 +152,7 @@
152
152
 
153
153
  <!-- Core Forms (logic engine must load before renderer) -->
154
154
  <script src="/public/js/form-logic-engine.js?v=20260927-submit-btn"></script>
155
- <script src="/public/js/forms.js?v=20260927-submit-btn" type="module"></script>
155
+ <script src="/public/js/forms.js?v=20261009-form-classes" type="module"></script>
156
156
 
157
157
  <!-- Core effects runtime -->
158
158
  <script src="/public/js/effects.js?v=20261003-characters"></script>