domma-cms 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -0
- package/admin/css/dashboard.css +1 -1
- package/admin/index.html +2 -2
- package/admin/js/app.js +1 -1
- package/admin/js/lib/card-builder.js +3 -3
- package/admin/js/lib/effects-builder.js +1 -1
- package/admin/js/lib/markdown-toolbar.js +5 -5
- package/admin/js/templates/dashboard/cache.html +32 -0
- package/admin/js/templates/dashboard.html +4 -0
- package/admin/js/templates/settings.html +26 -0
- package/admin/js/views/block-editor-enhance.js +1 -1
- package/admin/js/views/dashboard/widgets/activity-feed.js +1 -1
- package/admin/js/views/dashboard/widgets/cache.js +1 -0
- package/admin/js/views/dashboard/widgets/journeys.js +1 -1
- package/admin/js/views/dashboard/widgets/spike-feed.js +1 -1
- package/admin/js/views/dashboard/widgets/top-pages.js +1 -1
- package/admin/js/views/dashboard.js +1 -1
- package/admin/js/views/form-editor.js +6 -6
- package/admin/js/views/index.js +1 -1
- package/admin/js/views/page-editor.js +42 -37
- package/admin/js/views/settings.js +3 -3
- package/config/cache.json +4 -0
- package/config/cache.json.example +12 -0
- package/package.json +1 -1
- package/public/js/forms.js +1 -1
- package/public/js/site.js +1 -1
- package/server/config.js +12 -1
- package/server/routes/api/cache.js +57 -0
- package/server/routes/api/navigation.js +2 -0
- package/server/routes/api/settings.js +3 -0
- package/server/routes/public.js +11 -3
- package/server/server.js +16 -3
- package/server/services/blocks.js +3 -0
- package/server/services/cache/drivers/MemoryDriver.js +118 -0
- package/server/services/cache/drivers/NoneDriver.js +12 -0
- package/server/services/cache/index.js +229 -0
- package/server/services/cache/lru.js +61 -0
- package/server/services/collections.js +17 -4
- package/server/services/content.js +7 -2
- package/server/services/forms.js +3 -0
- package/server/services/markdown.js +25 -15
- package/server/services/views.js +4 -0
- package/server/templates/page.html +130 -130
package/CLAUDE.md
CHANGED
|
@@ -165,6 +165,7 @@ Add custom public-site JS to `public/js/site.js` or new files loaded from `publi
|
|
|
165
165
|
| `email.js` | SMTP mail sending (uses `config/site.json` SMTP settings) |
|
|
166
166
|
| `images.js` | Image processing / thumbnail generation |
|
|
167
167
|
| `plugins.js` | Plugin discovery, validation, registration, injection snippets |
|
|
168
|
+
| `cache/index.js` | Pluggable response cache (Memory/None/Redis drivers) with tag-based invalidation. See `docs/cache.md`. |
|
|
168
169
|
|
|
169
170
|
## Storage Adapters
|
|
170
171
|
|
|
@@ -217,6 +218,7 @@ Each plugin directory has its own `CLAUDE.md` with routes, storage, and gotchas.
|
|
|
217
218
|
| `config/plugins.json` | Yours | Plugin enabled/disabled + settings |
|
|
218
219
|
| `config/connections.json` | Yours (Pro only) | Named MongoDB connections; absence = file mode |
|
|
219
220
|
| `config/effects.json` | Yours | Effects / celebrate shortcode config |
|
|
221
|
+
| `config/cache.json` | Yours (optional) | Response cache: enabled, driver (memory/none/redis), TTL — absence = defaults (off in dev, on in prod) |
|
|
220
222
|
|
|
221
223
|
See `docs/configuration.md` for full schema reference.
|
|
222
224
|
|
package/admin/css/dashboard.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.dashboard-grid{display:flex;flex-direction:column;gap:var(--dm-spacing-4, 16px)}.dash-row{display:grid;gap:var(--dm-spacing-4, 16px)}.dash-row-kpi{grid-template-columns:repeat(4,1fr)}.dash-row-traffic{grid-template-columns:2fr 1fr}.dash-row-content,.dash-row-health{grid-template-columns:1fr 1fr}@media(max-width:960px){.dash-row-kpi{grid-template-columns:repeat(2,1fr)}.dash-row-traffic,.dash-row-content,.dash-row-health{grid-template-columns:1fr}}.dash-card{background:var(--dm-surface, #fff);border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius, 8px);padding:var(--dm-spacing-4, 16px)}.dash-kpi{display:flex;align-items:center;gap:var(--dm-spacing-3, 12px)}.dash-kpi-icon{font-size:24px;opacity:.8}.dash-kpi-value{font-size:28px;font-weight:600;line-height:1}.dash-kpi-label{font-size:12px;color:var(--dm-muted, #6b7280);text-transform:uppercase;letter-spacing:.05em}.dash-kpi-delta{font-size:12px;margin-top:4px}.dash-kpi-delta.up{color:var(--dm-success, #16a34a)}.dash-kpi-delta.down{color:var(--dm-danger, #dc2626)}.dash-health-pill{display:inline-flex;align-items:center;gap:6px}.dash-health-pill[data-level=ok]{color:var(--dm-success, #16a34a)}.dash-health-pill[data-level=warn]{color:var(--dm-warning, #d97706)}.dash-health-pill[data-level=fail]{color:var(--dm-danger, #dc2626)}.dash-spike-row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px dashed var(--dm-border, #e5e7eb)}.dash-spike-row:last-child{border-bottom:0}.dash-spark{display:inline-block;width:80px;height:24px;vertical-align:middle;margin-left:8px}.dash-warnings{background:var(--dm-warning-bg, #fef3c7);border:1px solid var(--dm-warning, #d97706);color:var(--dm-warning-fg, #78350f);padding:8px 12px;border-radius:var(--dm-radius, 8px);margin-bottom:12px}.dash-updated{font-size:12px;color:var(--dm-muted, #6b7280);margin-right:8px}.dash-journey-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}@media(max-width:720px){.dash-journey-grid{grid-template-columns:1fr}}.dash-journey-grid h4{font-size:12px;text-transform:uppercase;color:var(--dm-muted, #6b7280);margin:0 0 6px}.dash-bounce{margin-top:12px;font-size:14px;color:var(--dm-muted, #6b7280)}.dash-empty{font-size:13px;color:var(--dm-muted, #6b7280);margin:8px 0 0}
|
|
1
|
+
.dashboard-grid{display:flex;flex-direction:column;gap:var(--dm-spacing-4, 16px)}.dash-row{display:grid;gap:var(--dm-spacing-4, 16px)}.dash-row-kpi{grid-template-columns:repeat(4,1fr)}.dash-row-traffic{grid-template-columns:2fr 1fr}.dash-row-content,.dash-row-health{grid-template-columns:1fr 1fr}@media(max-width:960px){.dash-row-kpi{grid-template-columns:repeat(2,1fr)}.dash-row-traffic,.dash-row-content,.dash-row-health{grid-template-columns:1fr}}.dash-card{background:var(--dm-surface, #fff);border:1px solid var(--dm-border, #e5e7eb);border-radius:var(--dm-radius, 8px);padding:var(--dm-spacing-4, 16px)}.dash-kpi{display:flex;align-items:center;gap:var(--dm-spacing-3, 12px)}.dash-kpi-icon{font-size:24px;opacity:.8}.dash-kpi-value{font-size:28px;font-weight:600;line-height:1}.dash-kpi-label{font-size:12px;color:var(--dm-muted, #6b7280);text-transform:uppercase;letter-spacing:.05em}.dash-kpi-delta{font-size:12px;margin-top:4px}.dash-kpi-delta.up{color:var(--dm-success, #16a34a)}.dash-kpi-delta.down{color:var(--dm-danger, #dc2626)}.dash-health-pill{display:inline-flex;align-items:center;gap:6px}.dash-health-pill[data-level=ok]{color:var(--dm-success, #16a34a)}.dash-health-pill[data-level=warn]{color:var(--dm-warning, #d97706)}.dash-health-pill[data-level=fail]{color:var(--dm-danger, #dc2626)}.dash-spike-row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px dashed var(--dm-border, #e5e7eb)}.dash-spike-row:last-child{border-bottom:0}.dash-spark{display:inline-block;width:80px;height:24px;vertical-align:middle;margin-left:8px}.dash-warnings{background:var(--dm-warning-bg, #fef3c7);border:1px solid var(--dm-warning, #d97706);color:var(--dm-warning-fg, #78350f);padding:8px 12px;border-radius:var(--dm-radius, 8px);margin-bottom:12px}.dash-updated{font-size:12px;color:var(--dm-muted, #6b7280);margin-right:8px}.dash-journey-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}@media(max-width:720px){.dash-journey-grid{grid-template-columns:1fr}}.dash-journey-grid h4{font-size:12px;text-transform:uppercase;color:var(--dm-muted, #6b7280);margin:0 0 6px}.dash-bounce{margin-top:12px;font-size:14px;color:var(--dm-muted, #6b7280)}.dash-empty{font-size:13px;color:var(--dm-muted, #6b7280);margin:8px 0 0}.dash-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.dash-card-header h3{margin:0}.dash-cache-toggle{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--dm-muted, #6b7280);cursor:pointer}.dash-cache-toggle input[type=checkbox]{transform:scale(1.2);cursor:pointer}.dash-cache-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:12px}@media(max-width:720px){.dash-cache-grid{grid-template-columns:repeat(2,1fr)}}.dash-cache-stat-label{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--dm-muted, #6b7280);margin-bottom:4px}.dash-cache-stat-value{font-size:22px;font-weight:600;line-height:1.1}.dash-cache-stat-sub{font-size:12px;color:var(--dm-muted, #6b7280);margin-top:4px;min-height:14px}[data-field=size-bar]{height:4px;background:var(--dm-border, #e5e7eb);border-radius:2px;overflow:hidden;margin-top:6px}[data-field=size-fill]{display:block;height:100%;background:var(--dm-primary, #2563eb);width:0;transition:width .3s ease}.dash-cache-actions{display:flex;gap:8px;justify-content:flex-end}
|
package/admin/index.html
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/cropperjs@1/dist/cropper.min.css">
|
|
17
17
|
|
|
18
18
|
<!-- Admin CSS -->
|
|
19
|
-
<link rel="stylesheet" href="/admin/css/admin.css
|
|
20
|
-
<link rel="stylesheet" href="/admin/css/dashboard.css
|
|
19
|
+
<link rel="stylesheet" href="/admin/css/admin.css">
|
|
20
|
+
<link rel="stylesheet" href="/admin/css/dashboard.css">
|
|
21
21
|
|
|
22
22
|
<!-- Forms CSS — needed for conditional logic preview (.fb-field-hidden, etc.) -->
|
|
23
23
|
<link rel="stylesheet" href="/public/css/forms.css">
|
package/admin/js/app.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{getSidebarConfig as G}from"./config/sidebar-config.js";import{views as Q}from"./views/index.js?v=16";import{api as s,getUser as u,isAuthenticated as c,logout as X}from"./api.js";import{installHttpInterceptor as Z}from"./http-interceptor.js";$(()=>{Z(),(async()=>{try{const t=c()?await s.settings.get():null;Domma.theme.init({theme:t?.adminTheme||"charcoal-dark",persist:!0})}catch{Domma.theme.init({theme:"charcoal-dark",persist:!0})}})();const W=["jb-company","jb-agent","jb-candidate"],U=["/job-board","/my-profile"];function f(t){return t&&W.includes(t.role)}function w(t){return U.some(e=>t===e||t.startsWith(e+"/"))}R.use(async(t,e,i)=>{if(t.path==="/login"||t.path==="/reset-password")return i();if(!c()){R.navigate("/login");return}if(f(u())&&!w(t.path)){R.navigate("/job-board");return}i()});let g=null;async function V(){if(!c())return{};try{const[t,e,i,a,o,n,d,p,b,D,r,h,J,q]=await Promise.all([s.pages.list().catch(()=>[]),s.media.list().catch(()=>[]),s.users.list().catch(()=>[]),s.plugins.list().catch(()=>[]),s.collections.list().catch(()=>[]),s.forms.list().catch(()=>[]),s.views.list().catch(()=>[]),s.actions.list().catch(()=>[]),s.blocks.list().catch(()=>[]),s.components.list().catch(()=>[]),s.navigation.get().catch(()=>({})),s.layouts.get().catch(()=>({})),s.get("/collections/roles/entries?limit=100").catch(()=>({entries:[]})),s.system.notifications.unreadCount().catch(()=>({count:0}))]),T=r.items||[],Y=T.filter(y=>!y.hidden).length,L=T.length,z=a.filter(y=>y.enabled).length,j=a.length;return{pages:t.length,media:e.length,users:i.length,plugins:j>0?`${z}/${j}`:null,collections:o.length,forms:n.length,views:d.length,actions:p.length,blocks:b.length,components:D.length,navigation:L>0?`${Y}/${L}`:null,layouts:Object.keys(h).length,roles:(J.entries||[]).length,unreadNotifications:q.count||0}}catch{return{}}}async function k(){try{return(await s.get("/auth/permissions")).permissions||[]}catch{return[]}}async function K(){try{return await s.get("/settings/db-status")}catch{return{configured:!1}}}async function x(t){g&&$("#admin-sidebar").empty();const[e,i,a]=await Promise.all([V(),K(),c()?s.settings.get().catch(()=>({})):Promise.resolve({})]),o=a.adminBrand||{},n=o.title||"CMS Admin",d=o.icon||"layout",p=o.logo||"",b=$("#admin-topbar .topbar-brand");p?b.html(`<img src="${l(p)}" class="topbar-brand-logo" alt="${l(n)}"><span class="topbar-brand-text">${l(n)}</span>`):b.html(`<span data-icon="${l(d)}"></span><span class="topbar-brand-text">${l(n)}</span>`),Domma.icons.scan("#admin-topbar .topbar-brand");const D=N.map(r=>{if(!r.countKey)return r;const h=e[r.countKey];return{...r,badge:h!=null&&h>0?String(h):null}});if(g=Domma.elements.sidebar("#admin-sidebar",{header:{title:n,icon:d},items:G(t,e,D),collapsible:!0,collapseAt:992,push:!0,contentSelector:".dashboard-main",top:"60px"}),O(),F(),i?.configured){const r=$("#admin-sidebar").find(".sidebar-header-title").first();r.length&&!r.find(".db-badge").length&&r.append('<span class="db-badge" title="MongoDB connected" style="display:inline-flex;align-items:center;background:#16a34a;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:9999px;letter-spacing:.5px;margin-left:6px;vertical-align:middle;line-height:1;">DB</span>')}}function O(){$("#admin-sidebar .sidebar-link").each(function(){const t=$(this).find(".sidebar-text").text().trim();t&&E.tooltip(this,{content:t,position:"right"})})}function F(){const t="sidebar_collapsed_sections",e=new Set(S.get(t)||[]);$("#admin-sidebar .sidebar-heading").each(function(){const i=$(this);i.addClass("sidebar-heading--collapsible"),i.append('<span class="sidebar-heading-toggle"><span data-icon="chevron-down"></span></span>');const a=i.text().trim();if(e.has(a)){i.addClass("is-collapsed");let o=i.next();for(;o.length&&!o.hasClass("sidebar-heading")&&!o.hasClass("sidebar-divider");)o.hide(),o=o.next()}i.on("click",function(){const o=!i.hasClass("is-collapsed");i.toggleClass("is-collapsed",o);let n=i.next();for(;n.length&&!n.hasClass("sidebar-heading")&&!n.hasClass("sidebar-divider");)n.toggle(!o),n=n.next();o?e.add(a):e.delete(a),S.set(t,[...e])})}),Domma.icons.scan("#admin-sidebar")}M.subscribe("router:afterChange",({to:t})=>{(t.path==="/login"||t.path==="/reset-password")&&m&&(clearInterval(m),m=null),g&&t.path!=="/login"&&t.path!=="/reset-password"&&g.setActive("#"+t.path)});const H=[{path:"/",view:"dashboard",title:"Dashboard - Domma CMS"},{path:"/pages",view:"pages",title:"Pages - Domma CMS"},{path:"/pages/new",view:"pageEditor",title:"New Page - Domma CMS"},{path:"/pages/edit/*",view:"pageEditor",title:"Edit Page - Domma CMS"},{path:"/media",view:"media",title:"Media - Domma CMS"},{path:"/navigation",view:"navigation",title:"Navigation - Domma CMS"},{path:"/layouts",view:"layouts",title:"Layouts - Domma CMS"},{path:"/settings",view:"settings",title:"Settings - Domma CMS"},{path:"/users",view:"users",title:"Users - Domma CMS"},{path:"/users/new",view:"userEditor",title:"New User - Domma CMS"},{path:"/users/edit/:id",view:"userEditor",title:"Edit User - Domma CMS"},{path:"/plugins",view:"plugins",title:"Plugins - Domma CMS"},{path:"/documentation",view:"documentation",title:"Usage - Domma CMS"},{path:"/tutorials",view:"tutorials",title:"Tutorials - Domma CMS"},{path:"/api-reference",view:"apiReference",title:"API Reference - Domma CMS"},{path:"/collections",view:"collections",title:"Collections - Domma CMS"},{path:"/collections/new",view:"collectionEditor",title:"New Collection - Domma CMS"},{path:"/collections/edit/:slug",view:"collectionEditor",title:"Edit Collection - Domma CMS"},{path:"/collections/:slug/entries",view:"collectionEntries",title:"Entries - Domma CMS"},{path:"/forms",view:"forms",title:"Forms - Domma CMS"},{path:"/forms/new",view:"formEditor",title:"New Form - Domma CMS"},{path:"/forms/edit/:slug",view:"formEditor",title:"Edit Form - Domma CMS"},{path:"/forms/:slug/submissions",view:"formSubmissions",title:"Submissions - Domma CMS"},{path:"/views",view:"viewsList",title:"Views - Domma CMS"},{path:"/views/new",view:"viewEditor",title:"New View - Domma CMS"},{path:"/views/edit/:slug",view:"viewEditor",title:"Edit View - Domma CMS"},{path:"/views/:slug/preview",view:"viewPreview",title:"View Preview - Domma CMS"},{path:"/actions",view:"actionsList",title:"Actions - Domma CMS"},{path:"/actions/new",view:"actionEditor",title:"New Action - Domma CMS"},{path:"/actions/edit/:slug",view:"actionEditor",title:"Edit Action - Domma CMS"},{path:"/pro/docs",view:"proDocs",title:"Pro Documentation - Domma CMS"},{path:"/blocks",view:"blocks",title:"Blocks - Domma CMS"},{path:"/blocks/new",view:"blockEditor",title:"New Block - Domma CMS"},{path:"/blocks/edit/:name",view:"blockEditor",title:"Edit Block - Domma CMS"},{path:"/components",view:"components",title:"Components - Domma CMS"},{path:"/components/new",view:"componentEditor",title:"New Component - Domma CMS"},{path:"/components/edit/:name",view:"componentEditor",title:"Edit Component - Domma CMS"},{path:"/my-profile",view:"myProfile",title:"My Profile - Domma CMS"},{path:"/roles",view:"roles",title:"Roles & Permissions - Domma CMS"},{path:"/roles/edit/:id",view:"roleEditor",title:"Edit Role - Domma CMS"},{path:"/effects",view:"effects",title:"Effects - Domma CMS"},{path:"/system/notifications",view:"notifications",title:"Notifications - Domma CMS"},{path:"/login",view:"login",title:"Sign in - Domma CMS",onEnter:()=>{$("#admin-sidebar").hide(),$("#admin-topbar").hide()}},{path:"/reset-password",view:"login",title:"Reset Password - Domma CMS",onEnter:()=>{$("#admin-sidebar").hide(),$("#admin-topbar").hide()}}];M.subscribe("router:afterChange",async({to:t,from:e})=>{if(!(t.path==="/login"||t.path==="/reset-password")){if(f(u())&&!w(t.path)){R.navigate("/job-board");return}if($("#admin-sidebar").show(),$("#admin-topbar").show(),e?.path==="/login"||e?.path==="/reset-password"){$("#topbar-user-name").remove(),await _();const i=await k();x(i);try{const a=await s.system.notifications.list().catch(()=>[]),o=(Array.isArray(a)?a:[]).filter(n=>n.unread&&["warning","critical"].includes(n.data?.severity)).slice(0,3);for(const n of o){const d=l(n.data?.title||""),p=l((n.data?.body||"").slice(0,120));E.toast(`${d} \u2014 ${p}`,{type:n.data?.severity==="critical"?"error":"warning",duration:0})}}catch{}}B()}}),M.subscribe("router:afterChange",()=>{setTimeout(()=>{$(".btn-primary, .btn-danger").length&&Domma.effects.reveal(".btn-primary, .btn-danger",{animation:"fade",stagger:40,duration:300})},50)});const P="cms_card_states",v=S.get(P)||{};M.subscribe("router:afterChange",()=>{setTimeout(()=>{$("#view-container .card-collapsible").each(function(){const t=$(this).find(".card-header h2, .card-header h3").first().text().trim();t&&v[t]==="collapsed"&&$(this).addClass("card-collapsed")})},200)}),$("#view-container").on("click",".card-collapsible .card-header",function(t){if($(t.target).closest("button, a").length)return;const e=$(this).closest(".card");e.toggleClass("card-collapsed");const i=$(this).find("h2, h3").first().text().trim();i&&(v[i]=e.hasClass("card-collapsed")?"collapsed":"open",S.set(P,v))}),document.addEventListener("keydown",t=>{if(!(t.ctrlKey||t.metaKey)||t.key!=="s"||window.location.hash==="#/login"||window.location.hash.startsWith("#/reset-password"))return;const e=document.querySelector("#view-container .view-header button.btn-primary");e&&(t.preventDefault(),e.click())});const A={...Q},C=[...H];let N=[];async function _(){if(c())try{const t=await s.plugins.adminConfig();N=t.sidebar||[],t.routes?.length&&C.push(...t.routes);for(const[e,i]of Object.entries(t.views||{}))try{const a=await import(`/plugins/${i.entry}`);A[e]=a[i.exportName]}catch{}for(const{id:e,href:i}of t.css||[])if(!document.getElementById(e)){const a=document.createElement("link");a.id=e,a.rel="stylesheet",a.href=i,document.head.appendChild(a)}}catch{}}function B(){const t=u();if(!t||$("#topbar-user-name").length)return;const i={"super-admin":"Super Admin",admin:"Admin",user:"User"}[t.role]||t.role;$("#topbar-user").html(`
|
|
1
|
+
import{getSidebarConfig as G}from"./config/sidebar-config.js";import{views as Q}from"./views/index.js";import{api as s,getUser as u,isAuthenticated as c,logout as X}from"./api.js";import{installHttpInterceptor as Z}from"./http-interceptor.js";$(()=>{Z(),(async()=>{try{const t=c()?await s.settings.get():null;Domma.theme.init({theme:t?.adminTheme||"charcoal-dark",persist:!0})}catch{Domma.theme.init({theme:"charcoal-dark",persist:!0})}})();const W=["jb-company","jb-agent","jb-candidate"],U=["/job-board","/my-profile"];function f(t){return t&&W.includes(t.role)}function w(t){return U.some(e=>t===e||t.startsWith(e+"/"))}R.use(async(t,e,i)=>{if(t.path==="/login"||t.path==="/reset-password")return i();if(!c()){R.navigate("/login");return}if(f(u())&&!w(t.path)){R.navigate("/job-board");return}i()});let g=null;async function V(){if(!c())return{};try{const[t,e,i,a,o,n,d,p,b,D,r,h,J,q]=await Promise.all([s.pages.list().catch(()=>[]),s.media.list().catch(()=>[]),s.users.list().catch(()=>[]),s.plugins.list().catch(()=>[]),s.collections.list().catch(()=>[]),s.forms.list().catch(()=>[]),s.views.list().catch(()=>[]),s.actions.list().catch(()=>[]),s.blocks.list().catch(()=>[]),s.components.list().catch(()=>[]),s.navigation.get().catch(()=>({})),s.layouts.get().catch(()=>({})),s.get("/collections/roles/entries?limit=100").catch(()=>({entries:[]})),s.system.notifications.unreadCount().catch(()=>({count:0}))]),T=r.items||[],Y=T.filter(y=>!y.hidden).length,L=T.length,z=a.filter(y=>y.enabled).length,j=a.length;return{pages:t.length,media:e.length,users:i.length,plugins:j>0?`${z}/${j}`:null,collections:o.length,forms:n.length,views:d.length,actions:p.length,blocks:b.length,components:D.length,navigation:L>0?`${Y}/${L}`:null,layouts:Object.keys(h).length,roles:(J.entries||[]).length,unreadNotifications:q.count||0}}catch{return{}}}async function k(){try{return(await s.get("/auth/permissions")).permissions||[]}catch{return[]}}async function K(){try{return await s.get("/settings/db-status")}catch{return{configured:!1}}}async function x(t){g&&$("#admin-sidebar").empty();const[e,i,a]=await Promise.all([V(),K(),c()?s.settings.get().catch(()=>({})):Promise.resolve({})]),o=a.adminBrand||{},n=o.title||"CMS Admin",d=o.icon||"layout",p=o.logo||"",b=$("#admin-topbar .topbar-brand");p?b.html(`<img src="${l(p)}" class="topbar-brand-logo" alt="${l(n)}"><span class="topbar-brand-text">${l(n)}</span>`):b.html(`<span data-icon="${l(d)}"></span><span class="topbar-brand-text">${l(n)}</span>`),Domma.icons.scan("#admin-topbar .topbar-brand");const D=N.map(r=>{if(!r.countKey)return r;const h=e[r.countKey];return{...r,badge:h!=null&&h>0?String(h):null}});if(g=Domma.elements.sidebar("#admin-sidebar",{header:{title:n,icon:d},items:G(t,e,D),collapsible:!0,collapseAt:992,push:!0,contentSelector:".dashboard-main",top:"60px"}),O(),F(),i?.configured){const r=$("#admin-sidebar").find(".sidebar-header-title").first();r.length&&!r.find(".db-badge").length&&r.append('<span class="db-badge" title="MongoDB connected" style="display:inline-flex;align-items:center;background:#16a34a;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:9999px;letter-spacing:.5px;margin-left:6px;vertical-align:middle;line-height:1;">DB</span>')}}function O(){$("#admin-sidebar .sidebar-link").each(function(){const t=$(this).find(".sidebar-text").text().trim();t&&E.tooltip(this,{content:t,position:"right"})})}function F(){const t="sidebar_collapsed_sections",e=new Set(S.get(t)||[]);$("#admin-sidebar .sidebar-heading").each(function(){const i=$(this);i.addClass("sidebar-heading--collapsible"),i.append('<span class="sidebar-heading-toggle"><span data-icon="chevron-down"></span></span>');const a=i.text().trim();if(e.has(a)){i.addClass("is-collapsed");let o=i.next();for(;o.length&&!o.hasClass("sidebar-heading")&&!o.hasClass("sidebar-divider");)o.hide(),o=o.next()}i.on("click",function(){const o=!i.hasClass("is-collapsed");i.toggleClass("is-collapsed",o);let n=i.next();for(;n.length&&!n.hasClass("sidebar-heading")&&!n.hasClass("sidebar-divider");)n.toggle(!o),n=n.next();o?e.add(a):e.delete(a),S.set(t,[...e])})}),Domma.icons.scan("#admin-sidebar")}M.subscribe("router:afterChange",({to:t})=>{(t.path==="/login"||t.path==="/reset-password")&&m&&(clearInterval(m),m=null),g&&t.path!=="/login"&&t.path!=="/reset-password"&&g.setActive("#"+t.path)});const H=[{path:"/",view:"dashboard",title:"Dashboard - Domma CMS"},{path:"/pages",view:"pages",title:"Pages - Domma CMS"},{path:"/pages/new",view:"pageEditor",title:"New Page - Domma CMS"},{path:"/pages/edit/*",view:"pageEditor",title:"Edit Page - Domma CMS"},{path:"/media",view:"media",title:"Media - Domma CMS"},{path:"/navigation",view:"navigation",title:"Navigation - Domma CMS"},{path:"/layouts",view:"layouts",title:"Layouts - Domma CMS"},{path:"/settings",view:"settings",title:"Settings - Domma CMS"},{path:"/users",view:"users",title:"Users - Domma CMS"},{path:"/users/new",view:"userEditor",title:"New User - Domma CMS"},{path:"/users/edit/:id",view:"userEditor",title:"Edit User - Domma CMS"},{path:"/plugins",view:"plugins",title:"Plugins - Domma CMS"},{path:"/documentation",view:"documentation",title:"Usage - Domma CMS"},{path:"/tutorials",view:"tutorials",title:"Tutorials - Domma CMS"},{path:"/api-reference",view:"apiReference",title:"API Reference - Domma CMS"},{path:"/collections",view:"collections",title:"Collections - Domma CMS"},{path:"/collections/new",view:"collectionEditor",title:"New Collection - Domma CMS"},{path:"/collections/edit/:slug",view:"collectionEditor",title:"Edit Collection - Domma CMS"},{path:"/collections/:slug/entries",view:"collectionEntries",title:"Entries - Domma CMS"},{path:"/forms",view:"forms",title:"Forms - Domma CMS"},{path:"/forms/new",view:"formEditor",title:"New Form - Domma CMS"},{path:"/forms/edit/:slug",view:"formEditor",title:"Edit Form - Domma CMS"},{path:"/forms/:slug/submissions",view:"formSubmissions",title:"Submissions - Domma CMS"},{path:"/views",view:"viewsList",title:"Views - Domma CMS"},{path:"/views/new",view:"viewEditor",title:"New View - Domma CMS"},{path:"/views/edit/:slug",view:"viewEditor",title:"Edit View - Domma CMS"},{path:"/views/:slug/preview",view:"viewPreview",title:"View Preview - Domma CMS"},{path:"/actions",view:"actionsList",title:"Actions - Domma CMS"},{path:"/actions/new",view:"actionEditor",title:"New Action - Domma CMS"},{path:"/actions/edit/:slug",view:"actionEditor",title:"Edit Action - Domma CMS"},{path:"/pro/docs",view:"proDocs",title:"Pro Documentation - Domma CMS"},{path:"/blocks",view:"blocks",title:"Blocks - Domma CMS"},{path:"/blocks/new",view:"blockEditor",title:"New Block - Domma CMS"},{path:"/blocks/edit/:name",view:"blockEditor",title:"Edit Block - Domma CMS"},{path:"/components",view:"components",title:"Components - Domma CMS"},{path:"/components/new",view:"componentEditor",title:"New Component - Domma CMS"},{path:"/components/edit/:name",view:"componentEditor",title:"Edit Component - Domma CMS"},{path:"/my-profile",view:"myProfile",title:"My Profile - Domma CMS"},{path:"/roles",view:"roles",title:"Roles & Permissions - Domma CMS"},{path:"/roles/edit/:id",view:"roleEditor",title:"Edit Role - Domma CMS"},{path:"/effects",view:"effects",title:"Effects - Domma CMS"},{path:"/system/notifications",view:"notifications",title:"Notifications - Domma CMS"},{path:"/login",view:"login",title:"Sign in - Domma CMS",onEnter:()=>{$("#admin-sidebar").hide(),$("#admin-topbar").hide()}},{path:"/reset-password",view:"login",title:"Reset Password - Domma CMS",onEnter:()=>{$("#admin-sidebar").hide(),$("#admin-topbar").hide()}}];M.subscribe("router:afterChange",async({to:t,from:e})=>{if(!(t.path==="/login"||t.path==="/reset-password")){if(f(u())&&!w(t.path)){R.navigate("/job-board");return}if($("#admin-sidebar").show(),$("#admin-topbar").show(),e?.path==="/login"||e?.path==="/reset-password"){$("#topbar-user-name").remove(),await _();const i=await k();x(i);try{const a=await s.system.notifications.list().catch(()=>[]),o=(Array.isArray(a)?a:[]).filter(n=>n.unread&&["warning","critical"].includes(n.data?.severity)).slice(0,3);for(const n of o){const d=l(n.data?.title||""),p=l((n.data?.body||"").slice(0,120));E.toast(`${d} \u2014 ${p}`,{type:n.data?.severity==="critical"?"error":"warning",duration:0})}}catch{}}B()}}),M.subscribe("router:afterChange",()=>{setTimeout(()=>{$(".btn-primary, .btn-danger").length&&Domma.effects.reveal(".btn-primary, .btn-danger",{animation:"fade",stagger:40,duration:300})},50)});const P="cms_card_states",v=S.get(P)||{};M.subscribe("router:afterChange",()=>{setTimeout(()=>{$("#view-container .card-collapsible").each(function(){const t=$(this).find(".card-header h2, .card-header h3").first().text().trim();t&&v[t]==="collapsed"&&$(this).addClass("card-collapsed")})},200)}),$("#view-container").on("click",".card-collapsible .card-header",function(t){if($(t.target).closest("button, a").length)return;const e=$(this).closest(".card");e.toggleClass("card-collapsed");const i=$(this).find("h2, h3").first().text().trim();i&&(v[i]=e.hasClass("card-collapsed")?"collapsed":"open",S.set(P,v))}),document.addEventListener("keydown",t=>{if(!(t.ctrlKey||t.metaKey)||t.key!=="s"||window.location.hash==="#/login"||window.location.hash.startsWith("#/reset-password"))return;const e=document.querySelector("#view-container .view-header button.btn-primary");e&&(t.preventDefault(),e.click())});const A={...Q},C=[...H];let N=[];async function _(){if(c())try{const t=await s.plugins.adminConfig();N=t.sidebar||[],t.routes?.length&&C.push(...t.routes);for(const[e,i]of Object.entries(t.views||{}))try{const a=await import(`/plugins/${i.entry}`);A[e]=a[i.exportName]}catch{}for(const{id:e,href:i}of t.css||[])if(!document.getElementById(e)){const a=document.createElement("link");a.id=e,a.rel="stylesheet",a.href=i,document.head.appendChild(a)}}catch{}}function B(){const t=u();if(!t||$("#topbar-user-name").length)return;const i={"super-admin":"Super Admin",admin:"Admin",user:"User"}[t.role]||t.role;$("#topbar-user").html(`
|
|
2
2
|
<span id="topbar-user-name" class="topbar-user-name">${l(t.name)}</span>
|
|
3
3
|
<span class="topbar-role-badge topbar-role-badge--${l(t.role)}">${i}</span>
|
|
4
4
|
`),$("#topbar-actions").html(`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const j=[{key:"header-body",group:"Basic",label:"Header + Body",thumb:"\u25A4"},{key:"basic",group:"Basic",label:"Body only",thumb:"\u25AD"},{key:"header-body-footer",group:"Basic",label:"Header + Body + Footer",thumb:"\u2630"},{key:"no-header-footer",group:"Basic",label:"Body + Footer (no header)",thumb:"\u25A5"},{key:"icon-top",group:"Icon",label:"Icon top (stacked)",thumb:"\u2B06\u2605"},{key:"icon-inline",group:"Icon",label:"Icon inline",thumb:"\u2605\u25B6"},{key:"image-top",group:"Image",label:"Image top",thumb:"\u{1F5BC}"},{key:"image-overlay",group:"Image",label:"Image + overlay title",thumb:"\u{1F5BC}\u2726"},{key:"thumb-left",group:"Image",label:"Thumbnail left",thumb:"\u{1F5BC}\u2590"},{key:"thumb-right",group:"Image",label:"Thumbnail right",thumb:"\u258C\u{1F5BC}"},{key:"wide-left-image",group:"Image",label:"Wide image left",thumb:"\u{1F5BC}\u258D"},{key:"full-bg",group:"Image",label:"Full background",thumb:"\u{1F5BC}"},{key:"split-half",group:"Image",label:"Split half",thumb:"\u2592\u2590"},{key:"avatar-profile",group:"People",label:"Avatar / Profile",thumb:"\u{1F464}"},{key:"stat-metric",group:"People",label:"Stat / Metric",thumb:"\u{1F4CA}"},{key:"quote-testimonial",group:"People",label:"Quote / Testimonial",thumb:"\u201C"},{key:"rating-review",group:"People",label:"Rating / Review",thumb:"\u2605"},{key:"activity-feed",group:"People",label:"Activity feed",thumb:"\u{1F514}"},{key:"callout",group:"Content",label:"Callout",thumb:"\u{1F4A1}"},{key:"code-snippet",group:"Content",label:"Code snippet",thumb:"</>"},{key:"file-document",group:"Content",label:"File / Document",thumb:"\u{1F4C4}"},{key:"tag-cloud",group:"Content",label:"Tag cloud",thumb:"\u{1F3F7}"},{key:"video-media",group:"Media",label:"Video / Media",thumb:"\u25B6"},{key:"location-map",group:"Special",label:"Location / Map",thumb:"\u{1F4CD}"},{key:"step-numbered",group:"Special",label:"Step / Numbered",thumb:"\u2460"},{key:"corner-badge",group:"Special",label:"Corner badge",thumb:"\u{1F3F7}"},{key:"badge-band",group:"Special",label:"Badge band",thumb:"\u2B1B"},{key:"glass-gradient-border",group:"Special",label:"Glass gradient border",thumb:"\u25C8"},{key:"timeline-entry",group:"Special",label:"Timeline entry",thumb:"\u2022\u2014"},{key:"before-after",group:"Compare",label:"Before / After",thumb:"\u2194"},{key:"pricing",group:"Compare",label:"Pricing card",thumb:"\xA3"},{key:"feature-comparison",group:"Compare",label:"Feature comparison",thumb:"\u2611"},{key:"progress-goal",group:"Compare",label:"Progress / Goal",thumb:"\u25B0"}],q=["clean","gradient","glass","accent","dark","glow"],M=["indigo","ocean","sunset","forest","rose","midnight","aurora","fire","lagoon","dusk","lime","gold","arctic","slate"],B={indigo:"#6366f1,#8b5cf6",ocean:"#0891b2,#2563eb",sunset:"#f59e0b,#ef4444",forest:"#10b981,#0d9488",rose:"#fb7185,#e11d48",midnight:"#1e1b4b,#4338ca",aurora:"#06b6d4,#6366f1",fire:"#ef4444,#f97316",lagoon:"#06b6d4,#0e7490",dusk:"#7c3aed,#db2777",lime:"#84cc16,#10b981",gold:"#f59e0b,#b45309",arctic:"#bae6fd,#e0f2fe",slate:"#475569,#1e293b"},T=["activity","airpods","airport","alert-circle","alert-warning","ambulance","angry","annoyed","apartment","arch","archive","arrow-down","arrow-down-left","arrow-down-right","arrow-left","arrow-right","arrow-up","arrow-up-left","arrow-up-right","astonished","at-sign","attachment","award","badge","ban","bandage","bank","banknote","barbell","barcode","barn","baseball","basketball","battery","battery-charging","bauble","bell","bell-off","bells","bicycle","bitcoin","blood-drop","blush","bold","bone","book","book-closed","book-open","bookmark","bookmark-filled","bowling","box","boxing-glove","brain","bridge","briefcase","building","bus","cabin","cake","calculator","calendar","camera","camera-off","candy-cane","capsule","car","cart","cart-add","cash","cast","castle","chart-area","chart-bar","chart-bar-horizontal","chart-candlestick","chart-line","chart-pie","chat","chat-alt","check","check-circle","check-circle-filled","check-square","chevron-down","chevron-left","chevron-right","chevron-up","chevrons-down","chevrons-left","chevrons-right","chevrons-up","church","circle","circle-filled","clear-format","clipboard","clipboard-check","clipboard-list","clock","close","cloud","cloud-download","cloud-drizzle","cloud-lightning","cloud-off","cloud-rain","cloud-sun","cloud-upload","code","code-block","code-inline","cog","coins","columns","comment","compass","component","confused","cool","copy","corner-down-left","corner-down-right","corner-up-left","corner-up-right","court","cpu","credit-card","crown","crutch","cry","currency-dollar","currency-euro","currency-pound","cycling","database","dead","desktop","disappointed","dna","document","document-add","document-check","document-remove","document-text","dollar-sign","dome","dot","dots-horizontal","dots-vertical","download","droplet","droplets","dumbbell","edit","embed","emoji-happy","emoji-sad","euro-sign","exclamation","expand","expressionless","external-link","eye","eye-medical","eye-off","factory","fast-forward","feather","file-code","file-text","file-zip","fill","film","filter","fire","first-aid","fishing","flag","fog","folder","folder-add","folder-minus","folder-open","folder-plus","folder-remove","football","fortress","fuel","gamepad","garage","gauge","gift","git-branch","github","globe","golf","grid","grin","growth","hard-drive","hash","haze","heading-1","heading-2","heading-3","headphones","heart","heart-eyes","heart-filled","heart-pulse","heartbeat","help-circle","holly","home","hospital","hotel","house","image","image-add","images","inbox","indent","info","info-filled","investment","invoice","italic","joy","joystick","key","kettlebell","keyboard","laptop","laugh","layers","layout","library","lighthouse","lightning","link","link-2","link-add","linkedin","list","list-bullet","list-numbered","loader","loading","lock","log-in","log-out","lungs","mail","mail-open","map","map-pin","mask","maximize","medal","medical-cross","menu","menu-alt","message-circle","message-square","mic","mic-off","microscope","minimize","minus","minus-circle","minus-square","monitor","monument","moon","moon-star","more-horizontal","more-vertical","mosque","motorcycle","mountain","mouse","mouse-pointer","move","museum","music","nerd","neutral","notification","obelisk","office","outdent","package","palette","panel-bottom","panel-left","panel-right","panel-top","paperclip","parking","pause","pause-filled","percent","phone","phone-call","phone-incoming","phone-off","phone-outgoing","piggy-bank","pill","pill-bottle","pin","play","play-circle","play-filled","plug","plus","plus-circle","plus-square","podium","pound-sign","printer","pulse","pyramid","qrcode","question","quote","racket","radio","rage","rain","rainbow","receipt","redo","refresh","refresh-cw","reindeer","rewind","road","rotate-ccw","rotate-cw","router","rss","running","sad","safe","save","scale","scale-weight","school","search","send","server","settings","share","share-2","share-alt","shield","shield-alert","shield-check","shield-x","shipping","shocked","shopping-bag","shrink","sick","sidebar-left","sidebar-right","silly","skate","ski","skip-back","skip-forward","skyscraper","sleepy","sleigh","sliders","smartphone","smartwatch","smile","snow","snowflake","snowman","sob","soccer","sort","sparkles","speaker","spinner","square","stadium","star","star-decoration","star-eyes","star-filled","stethoscope","stop","stop-filled","stopwatch","store","strikethrough","sun","sunrise","sunset","surfboard","surprised","swimming","sync","syringe","tablet","tablet-smartphone","tag","tags","target","taxi","temple","tennis","tent","terminal","test-tube","text-center","text-left","text-right","thermometer","thermometer-medical","thermometer-sun","thinking","thumb-down","thumb-up","tongue","tool","tooth","tower","train-station","trash","tree","trending-down","trending-neutral","trending-up","trophy","truck","tv","tv-minimal","twitter","type","umbrella","underline","undo","university","unlink","unlock","upload","usb","user","user-add","user-check","user-group","user-plus","user-remove","users","vaccine","van","vault","video","video-off","volleyball","volume","volume-down","volume-mute","volume-off","volume-up","wallet","warehouse","warning","warning-filled","watch","webcam","wheelchair","whistle","wifi","wifi-off","wind","windmill","wink","wreath","x","x-circle","x-circle-filled","yoga","youtube","zany","zap"];let y=null,a=null,w=null,L=null;export const CardBuilder={open(e,t={}){y||(w=e,L=t,a={layout:"header-body",variant:"clean",gradient:"indigo",title:"",subtitle:"",icon:"",iconLayout:"inline",image:"",body:"",footer:"",hover:!1,collapsible:!1,value:"",delta:"",progress:"50",price:"",period:"",lang:"JavaScript",filename:"",filesize:"",filetype:"PDF",rating:"5",duration:"",address:"",step:"1",badge:"New",tags:"",calloutType:"info",font:"",fontSize:"",borderless:!1,shadow:"",rounded:"",textAlign:"",padding:""},O())},close(){S()}};function A(){const e=a,t=[];e.layout!=="header-body"&&t.push(`layout="${e.layout}"`),e.title&&t.push(`title="${e.title}"`),e.subtitle&&t.push(`subtitle="${e.subtitle}"`),e.icon&&t.push(`icon="${e.icon}"`),e.icon&&e.iconLayout==="stacked"&&t.push('icon-layout="stacked"'),e.image&&t.push(`image="${e.image}"`),e.variant!=="clean"&&t.push(`variant="${e.variant}"`),e.variant==="gradient"&&e.gradient!=="indigo"&&t.push(`gradient="${e.gradient}"`),e.hover&&t.push("hover"),e.collapsible&&t.push('collapsible="true"'),e.font&&t.push(`font="${e.font}"`),e.fontSize&&t.push(`font-size="${e.fontSize}"`),e.borderless&&t.push("borderless"),e.shadow&&t.push(`shadow="${e.shadow}"`),e.rounded&&t.push(`rounded="${e.rounded}"`),e.textAlign&&t.push(`text-align="${e.textAlign}"`),e.padding&&t.push(`padding="${e.padding}"`),e.footer&&!["pricing","feature-comparison","activity-feed","before-after","progress-goal"].includes(e.layout)&&t.push(`footer="${e.footer}"`);const o={"stat-metric":()=>{e.value&&t.push(`value="${e.value}"`),e.delta&&t.push(`delta="${e.delta}"`),e.progress&&t.push(`progress="${e.progress}"`)},pricing:()=>{e.price&&t.push(`price="${e.price}"`),e.period&&t.push(`period="${e.period}"`)},"code-snippet":()=>t.push(`lang="${e.lang}"`),"file-document":()=>{t.push(`filename="${e.filename}"`),e.filesize&&t.push(`filesize="${e.filesize}"`),e.filetype&&t.push(`filetype="${e.filetype}"`)},"rating-review":()=>t.push(`rating="${e.rating}"`),"video-media":()=>{e.duration&&t.push(`duration="${e.duration}"`)},"location-map":()=>{e.address&&t.push(`address="${e.address}"`)},"step-numbered":()=>t.push(`step="${e.step}"`),"corner-badge":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"badge-band":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"tag-cloud":()=>{e.tags&&t.push(`tags="${e.tags}"`)},"avatar-profile":()=>{e.tags&&t.push(`tags="${e.tags}"`)},callout:()=>{e.calloutType&&t.push(`callout-type="${e.calloutType}"`)},"split-half":()=>{}};o[e.layout]&&o[e.layout]();const n=t.length?" "+t.join(" "):"",i=e.body.trim()||"Content here.",d={"before-after":`[before]Before item 1 \xB7 Before item 2[/before]
|
|
1
|
+
const F=[{key:"header-body",group:"Basic",label:"Header + Body",thumb:"\u25A4"},{key:"basic",group:"Basic",label:"Body only",thumb:"\u25AD"},{key:"header-body-footer",group:"Basic",label:"Header + Body + Footer",thumb:"\u2630"},{key:"no-header-footer",group:"Basic",label:"Body + Footer (no header)",thumb:"\u25A5"},{key:"icon-top",group:"Icon",label:"Icon top (stacked)",thumb:"\u2B06\u2605"},{key:"icon-inline",group:"Icon",label:"Icon inline",thumb:"\u2605\u25B6"},{key:"image-top",group:"Image",label:"Image top",thumb:"\u{1F5BC}"},{key:"image-overlay",group:"Image",label:"Image + overlay title",thumb:"\u{1F5BC}\u2726"},{key:"thumb-left",group:"Image",label:"Thumbnail left",thumb:"\u{1F5BC}\u2590"},{key:"thumb-right",group:"Image",label:"Thumbnail right",thumb:"\u258C\u{1F5BC}"},{key:"wide-left-image",group:"Image",label:"Wide image left",thumb:"\u{1F5BC}\u258D"},{key:"full-bg",group:"Image",label:"Full background",thumb:"\u{1F5BC}"},{key:"split-half",group:"Image",label:"Split half",thumb:"\u2592\u2590"},{key:"avatar-profile",group:"People",label:"Avatar / Profile",thumb:"\u{1F464}"},{key:"stat-metric",group:"People",label:"Stat / Metric",thumb:"\u{1F4CA}"},{key:"quote-testimonial",group:"People",label:"Quote / Testimonial",thumb:"\u201C"},{key:"rating-review",group:"People",label:"Rating / Review",thumb:"\u2605"},{key:"activity-feed",group:"People",label:"Activity feed",thumb:"\u{1F514}"},{key:"callout",group:"Content",label:"Callout",thumb:"\u{1F4A1}"},{key:"code-snippet",group:"Content",label:"Code snippet",thumb:"</>"},{key:"file-document",group:"Content",label:"File / Document",thumb:"\u{1F4C4}"},{key:"tag-cloud",group:"Content",label:"Tag cloud",thumb:"\u{1F3F7}"},{key:"video-media",group:"Media",label:"Video / Media",thumb:"\u25B6"},{key:"location-map",group:"Special",label:"Location / Map",thumb:"\u{1F4CD}"},{key:"step-numbered",group:"Special",label:"Step / Numbered",thumb:"\u2460"},{key:"corner-badge",group:"Special",label:"Corner badge",thumb:"\u{1F3F7}"},{key:"badge-band",group:"Special",label:"Badge band",thumb:"\u2B1B"},{key:"glass-gradient-border",group:"Special",label:"Glass gradient border",thumb:"\u25C8"},{key:"timeline-entry",group:"Special",label:"Timeline entry",thumb:"\u2022\u2014"},{key:"before-after",group:"Compare",label:"Before / After",thumb:"\u2194"},{key:"pricing",group:"Compare",label:"Pricing card",thumb:"\xA3"},{key:"feature-comparison",group:"Compare",label:"Feature comparison",thumb:"\u2611"},{key:"progress-goal",group:"Compare",label:"Progress / Goal",thumb:"\u25B0"}],M=["clean","gradient","glass","accent","dark","glow"],R=["indigo","ocean","sunset","forest","rose","midnight","aurora","fire","lagoon","dusk","lime","gold","arctic","slate"],B={indigo:"#6366f1,#8b5cf6",ocean:"#0891b2,#2563eb",sunset:"#f59e0b,#ef4444",forest:"#10b981,#0d9488",rose:"#fb7185,#e11d48",midnight:"#1e1b4b,#4338ca",aurora:"#06b6d4,#6366f1",fire:"#ef4444,#f97316",lagoon:"#06b6d4,#0e7490",dusk:"#7c3aed,#db2777",lime:"#84cc16,#10b981",gold:"#f59e0b,#b45309",arctic:"#bae6fd,#e0f2fe",slate:"#475569,#1e293b"};function j(e){return typeof I>"u"||typeof I.list!="function"?[]:!e||e==="all"?I.list():I.list(e)}function O(){const e=typeof I<"u"&&I._categories?I._categories:null,t=[{slug:"all",label:"All icons"}];return e&&Object.keys(e).forEach(o=>{t.push({slug:o,label:e[o].name||o})}),t}function N(e,t){const o=j(e),n=(t||"").trim().toLowerCase();return n?o.filter(i=>i.toLowerCase().includes(n)):o}let C=null,a=null,w=null,$=null;export const CardBuilder={open(e,t={}){C||(w=e,$=t,a={layout:"header-body",variant:"clean",gradient:"indigo",title:"",subtitle:"",icon:"",iconLayout:"inline",image:"",body:"",footer:"",hover:!1,collapsible:!1,value:"",delta:"",progress:"50",price:"",period:"",lang:"JavaScript",filename:"",filesize:"",filetype:"PDF",rating:"5",duration:"",address:"",step:"1",badge:"New",tags:"",calloutType:"info",font:"",fontSize:"",borderless:!1,shadow:"",rounded:"",textAlign:"",padding:""},G())},close(){S()}};function T(){const e=a,t=[];e.layout!=="header-body"&&t.push(`layout="${e.layout}"`),e.title&&t.push(`title="${e.title}"`),e.subtitle&&t.push(`subtitle="${e.subtitle}"`),e.icon&&t.push(`icon="${e.icon}"`),e.icon&&e.iconLayout==="stacked"&&t.push('icon-layout="stacked"'),e.image&&t.push(`image="${e.image}"`),e.variant!=="clean"&&t.push(`variant="${e.variant}"`),e.variant==="gradient"&&e.gradient!=="indigo"&&t.push(`gradient="${e.gradient}"`),e.hover&&t.push("hover"),e.collapsible&&t.push('collapsible="true"'),e.font&&t.push(`font="${e.font}"`),e.fontSize&&t.push(`font-size="${e.fontSize}"`),e.borderless&&t.push("borderless"),e.shadow&&t.push(`shadow="${e.shadow}"`),e.rounded&&t.push(`rounded="${e.rounded}"`),e.textAlign&&t.push(`text-align="${e.textAlign}"`),e.padding&&t.push(`padding="${e.padding}"`),e.footer&&!["pricing","feature-comparison","activity-feed","before-after","progress-goal"].includes(e.layout)&&t.push(`footer="${e.footer}"`);const o={"stat-metric":()=>{e.value&&t.push(`value="${e.value}"`),e.delta&&t.push(`delta="${e.delta}"`),e.progress&&t.push(`progress="${e.progress}"`)},pricing:()=>{e.price&&t.push(`price="${e.price}"`),e.period&&t.push(`period="${e.period}"`)},"code-snippet":()=>t.push(`lang="${e.lang}"`),"file-document":()=>{t.push(`filename="${e.filename}"`),e.filesize&&t.push(`filesize="${e.filesize}"`),e.filetype&&t.push(`filetype="${e.filetype}"`)},"rating-review":()=>t.push(`rating="${e.rating}"`),"video-media":()=>{e.duration&&t.push(`duration="${e.duration}"`)},"location-map":()=>{e.address&&t.push(`address="${e.address}"`)},"step-numbered":()=>t.push(`step="${e.step}"`),"corner-badge":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"badge-band":()=>{e.badge&&t.push(`badge="${e.badge}"`)},"tag-cloud":()=>{e.tags&&t.push(`tags="${e.tags}"`)},"avatar-profile":()=>{e.tags&&t.push(`tags="${e.tags}"`)},callout:()=>{e.calloutType&&t.push(`callout-type="${e.calloutType}"`)},"split-half":()=>{}};o[e.layout]&&o[e.layout]();const n=t.length?" "+t.join(" "):"",i=e.body.trim()||"Content here.",l={"before-after":`[before]Before item 1 \xB7 Before item 2[/before]
|
|
2
2
|
[after]After item 1 \xB7 After item 2[/after]`,pricing:`[feature]Feature one[/feature]
|
|
3
3
|
[feature]Feature two[/feature]`,"feature-comparison":`[feature]Included feature[/feature]
|
|
4
4
|
[feature excluded]Excluded feature[/feature]`,"activity-feed":'[activity user="Alice" action="published a page" time="2 min ago"]',"progress-goal":`[milestone done]Phase 1[/milestone]
|
|
5
5
|
[milestone]Phase 2[/milestone]`}[e.layout]||i;return`[card${n}]
|
|
6
|
-
${
|
|
7
|
-
[/card]`}function S(){y&&(y.remove(),y=null,a=null)}function R(){const e=A(),t=w.selectionStart,o=w.selectionEnd;w.value=w.value.slice(0,t)+e+w.value.slice(o),w.selectionStart=w.selectionEnd=t+e.length,w.dispatchEvent(new Event("input",{bubbles:!0})),w.focus(),S()}function O(){y=document.createElement("div"),Object.assign(y.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"9999",padding:"24px",isolation:"isolate"});const e=document.createElement("div");Object.assign(e.style,{background:"var(--dm-surface,#1e293b)",border:"1px solid var(--dm-border,#334155)",borderRadius:"14px",width:"100%",maxWidth:"860px",maxHeight:"90vh",display:"flex",flexDirection:"column",boxShadow:"0 24px 64px rgba(0,0,0,.6)",overflow:"hidden"});const t=r("div","display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid var(--dm-border,#334155);flex-shrink:0"),o=r("span","font-weight:700;color:var(--dm-text,#f1f5f9);font-size:14px");o.textContent="Insert Card";const n=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");n.textContent="\u2715",n.addEventListener("click",S),t.appendChild(o),t.appendChild(n);const i=r("div","display:grid;grid-template-columns:280px 1fr;flex:1;overflow:hidden");i.appendChild(N()),i.appendChild(ae());const l=r("div","display:flex;justify-content:flex-end;gap:10px;padding:12px 20px;border-top:1px solid var(--dm-border,#334155);flex-shrink:0"),d=r("button","padding:8px 18px;border-radius:8px;border:none;background:var(--dm-border,#334155);color:var(--dm-text-muted,#94a3b8);font-size:12px;font-weight:700;cursor:pointer");d.textContent="Cancel",d.addEventListener("click",S);const c=r("button","padding:8px 18px;border-radius:8px;border:none;background:#6366f1;color:#fff;font-size:12px;font-weight:700;cursor:pointer");c.textContent="Insert Card",c.addEventListener("click",R),l.appendChild(d),l.appendChild(c),e.appendChild(t),e.appendChild(i),e.appendChild(l),y.appendChild(e),y.addEventListener("click",b=>{b.target===y&&S()}),document.body.appendChild(y),P(),g()}function r(e,t=""){const o=document.createElement(e);return t&&(o.style.cssText=t),o}const E="padding:7px 10px;border-radius:7px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:12px;font-family:inherit;width:100%";function N(){const e=r("div","padding:18px;border-right:1px solid var(--dm-border,#334155);display:flex;flex-direction:column;gap:14px;overflow-y:auto");e.appendChild(s("Layout",G()));const t=r("div","display:contents");t.id="cb-dyn-fields",e.appendChild(t),e.appendChild(D()),e.appendChild(s("Style",H()));const o=r("div");return o.id="cb-grad-wrap",o.style.display=a.variant==="gradient"?"":"none",o.appendChild(s("Gradient",U())),e.appendChild(o),e.appendChild(s("Options",Y())),e.appendChild(D()),e.appendChild(J()),e}function G(){const e=r("select",E+";cursor:pointer"),t={};return j.forEach(o=>{(t[o.group]=t[o.group]||[]).push(o)}),Object.entries(t).forEach(([o,n])=>{const i=document.createElement("optgroup");i.label=o,n.forEach(l=>{const d=document.createElement("option");d.value=l.key,d.textContent=`${l.thumb} ${l.label}`,l.key===a.layout&&(d.selected=!0),i.appendChild(d)}),e.appendChild(i)}),e.addEventListener("change",()=>{a.layout=e.value,P(),g()}),e}function H(){const e=r("div","display:grid;grid-template-columns:repeat(3,1fr);gap:5px"),t={clean:"background:#f8fafc;color:#374151;border:2px solid #e2e8f0",gradient:"background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border:2px solid transparent",glass:"background:rgba(255,255,255,.06);color:#94a3b8;border:2px dashed #334155",accent:"background:#fff;color:#4338ca;border-left:4px solid #6366f1;border-top:2px solid #e2e8f0;border-right:2px solid #e2e8f0;border-bottom:2px solid #e2e8f0",dark:"background:#0f172a;color:#818cf8;border:2px solid #334155",glow:"color:#818cf8;border:2px solid #6366f1;box-shadow:0 0 6px rgba(99,102,241,.4)"};return q.forEach(o=>{const n=r("div",`padding:6px 4px;border-radius:7px;font-size:10px;font-weight:700;text-align:center;cursor:pointer;${t[o]}`);n.textContent=o.charAt(0).toUpperCase()+o.slice(1),n.dataset.variant=o,o===a.variant&&(n.style.outline="2px solid #6366f1"),n.addEventListener("click",()=>{a.variant=o,e.querySelectorAll("[data-variant]").forEach(l=>{l.style.outline=""}),n.style.outline="2px solid #6366f1";const i=document.getElementById("cb-grad-wrap");i&&(i.style.display=o==="gradient"?"":"none"),g()}),e.appendChild(n)}),e}function U(){const e=r("div","display:flex;flex-wrap:wrap;gap:7px");return M.forEach(t=>{const[o,n]=(B[t]||"#6366f1,#8b5cf6").split(","),i=r("div",`width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,${o},${n});cursor:pointer;border:2px solid transparent;transition:border-color .15s`);i.title=t,t===a.gradient&&(i.style.borderColor="#fff"),i.addEventListener("click",()=>{a.gradient=t,e.querySelectorAll("div").forEach(l=>{l.style.borderColor="transparent"}),i.style.borderColor="#fff",g()}),e.appendChild(i)}),e}function Y(){const e=r("div","display:flex;gap:6px");return["hover","collapsible"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a[t]),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a[t]=!a[t],n(a[t]),g()}),e.appendChild(o)}),e}function z(e,t){const o=r("select",E+";cursor:pointer");return t.forEach(([n,i])=>{const l=document.createElement("option");l.value=n,l.textContent=i,n===a[e]&&(l.selected=!0),o.appendChild(l)}),o.addEventListener("change",()=>{a[e]=o.value,g()}),o}function V(e,t){const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};return n(a[e]),o.textContent=t,o.addEventListener("click",()=>{a[e]=!a[e],n(a[e]),g()}),o}function W(){const e=r("div","display:flex;gap:6px");return[["","Left"],["center","Centre"],["right","Right"]].forEach(([t,o])=>{const n=r("div"),i=l=>{n.style.cssText=`flex:1;padding:5px 4px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${l?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};i(a.textAlign===t),n.textContent=o,n.addEventListener("click",()=>{a.textAlign=t,e.querySelectorAll("div").forEach((l,d)=>i([["","Left"],["center","Centre"],["right","Right"]][d][0]===t)),g()}),e.appendChild(n)}),e}function J(){const e=r("div","display:flex;flex-direction:column;gap:14px"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");t.textContent="Presentation",e.appendChild(t);const o=r("div","display:grid;grid-template-columns:1fr 1fr;gap:10px"),n=(l,d)=>{const c=r("div","display:flex;flex-direction:column;gap:5px"),b=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");b.textContent=l,c.appendChild(b),c.appendChild(d),o.appendChild(c)};n("Font",z("font",[["","Default"],["serif","Serif"],["mono","Mono"]])),n("Size",z("fontSize",[["","Default"],["sm","Small"],["lg","Large"],["xl","XL"]])),n("Shadow",z("shadow",[["","Default"],["none","None"],["md","Medium"],["lg","Large"]])),n("Padding",z("padding",[["","Default"],["compact","Compact"],["spacious","Spacious"]])),n("Corners",z("rounded",[["","Default"],["none","Square"],["sm","Small"],["lg","Large"],["full","Full"]])),e.appendChild(o),e.appendChild(s("Align",W()));const i=r("div","display:flex;gap:6px");return i.appendChild(V("borderless","Borderless")),e.appendChild(i),e}function s(e,t){const o=r("div","display:flex;flex-direction:column;gap:5px"),n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");return n.textContent=e,o.appendChild(n),o.appendChild(t),o}function D(){return r("div","height:1px;background:var(--dm-border,#334155);margin:2px 0")}function p(e,t){const o=r("input",E);return o.type="text",t&&(o.placeholder=t),o.value=a[e]||"",o.addEventListener("input",()=>{a[e]=o.value,g()}),o}function Q(e,t){const o=r("select",E+";cursor:pointer");return t.forEach(n=>{const i=document.createElement("option");i.value=n,i.textContent=n,n===a[e]&&(i.selected=!0),o.appendChild(i)}),o.addEventListener("change",()=>{a[e]=o.value,g()}),o}const X={"icon-top":["subtitle","icon","iconLayout"],"icon-inline":["subtitle","icon","iconLayout"],"image-top":["image"],"image-overlay":["image"],"thumb-left":["image"],"thumb-right":["image"],"wide-left-image":["image"],"full-bg":["image"],"split-half":["image"],"avatar-profile":["subtitle","icon","tags"],"stat-metric":["value","delta","progress"],"quote-testimonial":["subtitle","icon"],callout:["calloutType","icon"],"video-media":["image","duration"],"location-map":["address"],"step-numbered":["step"],"corner-badge":["icon","badge"],"badge-band":["icon","badge"],"rating-review":["rating","subtitle","icon"],"tag-cloud":["tags"],"activity-feed":[],"code-snippet":["lang"],"file-document":["filename","filesize","filetype"],"before-after":[],pricing:["price","period"],"feature-comparison":["subtitle"],"progress-goal":["progress"],"timeline-entry":["subtitle","badge"],"glass-gradient-border":[]},Z=new Set(["basic","no-header-footer","code-snippet","file-document","stat-metric"]),K=new Set(["stat-metric","file-document"]),ee=new Set(["pricing","feature-comparison","activity-feed","before-after","progress-goal"]);function P(){const e=document.getElementById("cb-dyn-fields");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);const t=a.layout,o=X[t]||[];Z.has(t)||e.appendChild(s("Title",p("title","Card heading"))),o.forEach(n=>{const i={subtitle:()=>s("Subtitle",p("subtitle","Secondary line")),icon:()=>s("Icon",oe()),iconLayout:()=>s("Icon layout",re()),image:()=>s("Image",ie()),value:()=>s("Value",p("value","\xA324,980")),delta:()=>s("Delta",p("delta","\u2191 12.4%")),progress:()=>s("Progress %",p("progress","50")),price:()=>s("Price",p("price","\xA329")),period:()=>s("Period",p("period","per month")),lang:()=>s("Language",p("lang","JavaScript")),filename:()=>s("Filename",p("filename","document.pdf")),filesize:()=>s("File size",p("filesize","2.4 MB")),filetype:()=>s("File type",p("filetype","PDF")),rating:()=>s("Rating (1\u20135)",p("rating","5")),duration:()=>s("Duration",p("duration","4:32")),address:()=>s("Address",p("address","12 Main St")),step:()=>s("Step number",p("step","1")),badge:()=>s("Badge label",p("badge","New")),tags:()=>s("Tags (comma-separated)",p("tags","Design, CSS")),calloutType:()=>s("Type",Q("calloutType",["info","warn","success","error"]))};i[n]&&e.appendChild(i[n]())}),K.has(t)||e.appendChild(s("Body content",te())),ee.has(t)||e.appendChild(s("Footer",p("footer","")))}function te(){const e=r("textarea",E+";resize:vertical;min-height:60px;line-height:1.5");return e.value=a.body||"",e.addEventListener("input",()=>{a.body=e.value,g()}),e}function oe(){const e=r("div","display:flex;gap:6px"),t=r("input",E+";flex:1");t.type="text",t.placeholder="icon name",t.value=a.icon||"",t.addEventListener("input",()=>{a.icon=t.value,g()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse icons",o.textContent="\u2605",o.addEventListener("click",()=>F(n=>{a.icon=n,t.value=n,g()})),e.appendChild(t),e.appendChild(o),e}function re(){const e=r("div","display:flex;gap:6px");return["inline","stacked"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a.iconLayout===t),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a.iconLayout=t,e.querySelectorAll("div").forEach((i,l)=>n(["inline","stacked"][l]===t)),g()}),e.appendChild(o)}),e}function ne(){return new Promise(async e=>{let t=[];L&&typeof L.onMediaBrowse=="function"&&(t=await L.onMediaBrowse()||[]);const o=document.createElement("dialog");o.style.cssText="margin:auto;padding:0;border:none;border-radius:12px;background:var(--dm-surface,#1e293b);width:min(700px,95vw);max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 25px 60px rgba(0,0,0,.5)";const n=document.createElement("style");n.textContent="dialog.cb-media-picker::backdrop{background:rgba(0,0,0,.75)}",o.className="cb-media-picker";const i=m=>{o.close(),o.remove(),n.remove(),e(m)},l=r("div","display:flex;justify-content:space-between;align-items:center;flex-shrink:0;padding:16px 20px;border-bottom:1px solid var(--dm-border,#334155)"),d=r("div","font-weight:700;font-size:14px;color:var(--dm-text,#f1f5f9)");d.textContent="Select Image";const c=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");c.textContent="\xD7",c.addEventListener("click",()=>i(null)),o.addEventListener("cancel",()=>i(null)),l.appendChild(d),l.appendChild(c);const b=r("div","padding:16px;overflow-y:auto;flex:1"),k=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px"),v=t.filter(m=>/\.(png|jpe?g|gif|webp|svg)$/i.test(m.name||""));if(v.length)v.forEach(m=>{const u=r("div","display:flex;flex-direction:column;gap:6px;cursor:pointer;border:2px solid transparent;border-radius:8px;padding:6px"),h=document.createElement("img");h.src=m.url,h.alt=m.name||"",h.style.cssText="width:100%;height:80px;object-fit:cover;border-radius:6px;display:block";const x=r("div","font-size:9px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--dm-text-muted,#94a3b8)");x.textContent=m.name||m.url,u.appendChild(h),u.appendChild(x),u.addEventListener("mouseenter",()=>{u.style.borderColor="#6366f1"}),u.addEventListener("mouseleave",()=>{u.style.borderColor="transparent"}),u.addEventListener("click",()=>i(m.url)),k.appendChild(u)});else{const m=r("div","color:var(--dm-text-muted,#94a3b8);font-size:13px;padding:20px;text-align:center");m.textContent="No images uploaded yet.",k.appendChild(m)}b.appendChild(k),o.appendChild(l),o.appendChild(b),document.head.appendChild(n),document.body.appendChild(o),o.showModal()})}function ie(){const e=r("div","display:flex;gap:6px"),t=r("input",E+";flex:1");t.type="text",t.placeholder="/media/image.jpg",t.value=a.image||"",t.addEventListener("input",()=>{a.image=t.value,g()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse media",o.textContent="\u{1F4C1}",o.addEventListener("click",async()=>{const n=await ne();n&&(a.image=n,t.value=n,g())}),e.appendChild(t),e.appendChild(o),e}function ae(){const e=r("div","padding:20px;background:var(--dm-surface,#f8fafc);display:flex;flex-direction:column;gap:14px;overflow-y:auto"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--dm-text-muted,#94a3b8)");t.textContent="Live Preview";const o=r("div","flex:1;display:flex;align-items:flex-start;justify-content:center");o.id="cb-preview-area";const n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#94a3b8);margin-bottom:6px");n.textContent="Shortcode";const i=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#334155);border-radius:8px;padding:10px 14px;font-family:monospace;font-size:11px;color:var(--dm-primary,#a5b4fc);line-height:1.8;white-space:pre-wrap;word-break:break-all");return i.id="cb-snippet",e.appendChild(t),e.appendChild(o),e.appendChild(n),e.appendChild(i),e}function g(){const e=document.getElementById("cb-preview-area");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(de());const t=document.getElementById("cb-snippet");t&&(t.textContent=A())}function de(){const e=a,[t,o]=(B[e.gradient]||"#6366f1,#8b5cf6").split(","),n=`linear-gradient(135deg,${t},${o})`,i={clean:"background:var(--dm-surface,#fff);border:1px solid var(--dm-border,#e5e7eb);box-shadow:0 1px 4px rgba(0,0,0,.06)",gradient:`background:${n};color:#fff`,glass:"background:rgba(255,255,255,.12);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.25);box-shadow:0 4px 24px rgba(0,0,0,.12)",accent:"background:var(--dm-surface,#fff);border-top:1px solid var(--dm-border,#e5e7eb);border-right:1px solid var(--dm-border,#e5e7eb);border-bottom:1px solid var(--dm-border,#e5e7eb);border-left:4px solid #6366f1",dark:"background:#0f172a;color:#e2e8f0;border:1px solid #1e293b",glow:"background:var(--dm-surface,#fff);border:1px solid #6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.15),0 0 20px rgba(99,102,241,.3)"},l=e.variant==="gradient"?`background:${n};color:#fff;padding:12px 16px`:"background:var(--dm-border,#f3f4f6);color:var(--dm-text,#111);padding:12px 16px",d=r("div");d.style.cssText=`width:100%;max-width:300px;border-radius:12px;overflow:hidden;font-size:13px;font-family:system-ui,sans-serif;${i[e.variant]||i.clean}`;const c={serif:"Georgia,serif",mono:"'SF Mono','Fira Code',monospace"};e.font&&c[e.font]&&(d.style.fontFamily=c[e.font]);const b={sm:"11px",lg:"15px",xl:"17px"};e.fontSize&&b[e.fontSize]&&(d.style.fontSize=b[e.fontSize]),e.borderless&&(d.style.border="none");const k={none:"none",md:"0 4px 12px rgba(0,0,0,.1)",lg:"0 10px 30px rgba(0,0,0,.18)"};e.shadow&&k[e.shadow]!==void 0&&(d.style.boxShadow=k[e.shadow]);const v={none:"0",sm:"4px",lg:"20px",full:"9999px"};if(e.rounded&&v[e.rounded]!==void 0&&(d.style.borderRadius=v[e.rounded]),e.textAlign&&(d.style.textAlign=e.textAlign),new Set(["image-top","image-overlay","thumb-left","thumb-right","wide-left-image","full-bg","split-half","video-media"]).has(e.layout)){const f=r("div","height:120px;background-size:cover;background-position:center;display:flex;align-items:center;justify-content:center;font-size:2rem;background-color:var(--dm-border,#e2e8f0)");e.image&&(f.style.backgroundImage=`url('${e.image}')`),e.image||(f.textContent="\u{1F5BC}"),d.appendChild(f)}if(!new Set(["basic","no-header-footer","image-overlay","stat-metric","quote-testimonial","activity-feed","before-after","code-snippet","file-document","glass-gradient-border"]).has(e.layout)&&e.title){const f=r("div",l),C=r("div","font-weight:700");C.textContent=e.title,f.appendChild(C),d.appendChild(f)}const h=e.variant==="dark"?"color:#94a3b8;":e.variant==="gradient"?"color:rgba(255,255,255,.85);":"",x=r("div",`padding:13px 16px;${h}`);if(new Set(["before-after","pricing","feature-comparison","activity-feed","progress-goal"]).has(e.layout)){const f=r("em","font-size:11px;color:var(--dm-text-muted,#9ca3af)");f.textContent="Simplified preview \u2014 full render on save.",x.appendChild(f)}else if(e.layout==="stat-metric"){const f=r("div","font-size:2rem;font-weight:800");f.textContent=e.value||"\u2014";const C=r("div","font-size:.8rem;opacity:.7");if(C.textContent=e.title||"",x.appendChild(C),x.appendChild(f),e.delta){const _=r("div","font-size:.78rem;font-weight:600;color:#10b981");_.textContent=e.delta,x.appendChild(_)}}else x.textContent=e.body||"Card body content.";if(e.padding){const f=e.padding==="compact"?"8px 12px":"24px 28px";x.style.padding=f}if(d.appendChild(x),e.footer){const f=e.variant==="gradient"?"rgba(255,255,255,.6)":"var(--dm-text-muted,#9ca3af)",C=r("div",`padding:9px 16px;border-top:1px solid rgba(128,128,128,.15);font-size:11px;color:${f}`);C.textContent=e.footer,d.appendChild(C)}return d}function F(e){const t=r("div","position:fixed;inset:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:10000;padding:24px"),o=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#475569);border-radius:12px;padding:16px;width:100%;max-width:520px;max-height:70vh;display:flex;flex-direction:column;gap:12px"),n=r("div","display:flex;gap:8px"),i=r("input","flex:1;padding:8px 12px;border-radius:8px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:13px;font-family:inherit");i.type="text",i.placeholder="Search icons\u2026";const l=r("button","padding:8px 14px;background:var(--dm-border,#334155);border:none;border-radius:8px;color:var(--dm-text-muted,#94a3b8);font-size:12px;cursor:pointer");l.textContent="\u2715 Close",l.addEventListener("click",()=>t.remove()),n.appendChild(i),n.appendChild(l);const d=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:6px;overflow-y:auto;max-height:400px");let c=null;const b=r("button","padding:8px 18px;background:#6366f1;border:none;border-radius:8px;color:#fff;font-size:12px;font-weight:700;cursor:pointer;align-self:flex-end");b.textContent="Select an icon";function k(v){for(;d.firstChild;)d.removeChild(d.firstChild);(v?T.filter(u=>u.includes(v.toLowerCase())):T).slice(0,120).forEach(u=>{const h=r("div","display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border-radius:8px;cursor:pointer;border:2px solid transparent;background:var(--dm-surface,#0f172a)"),x=document.createElement("span");x.setAttribute("data-icon",u),x.style.fontSize="20px";const $=r("div","font-size:8px;color:var(--dm-text-muted,#475569);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%");$.textContent=u,h.appendChild(x),h.appendChild($),h.addEventListener("click",()=>{c&&(c.style.borderColor="transparent"),h.style.borderColor="#6366f1",c=h,b.textContent=`Use: ${u}`}),h.addEventListener("dblclick",()=>{e(u),t.remove()}),d.appendChild(h)}),typeof I<"u"&&I.scan&&I.scan(d)}i.addEventListener("input",()=>k(i.value)),k(""),b.addEventListener("click",()=>{if(c){const v=c.querySelector("[data-icon]").getAttribute("data-icon");e(v),t.remove()}}),o.appendChild(n),o.appendChild(d),o.appendChild(b),t.appendChild(o),t.addEventListener("click",v=>{v.target===t&&t.remove()}),document.body.appendChild(t),i.focus()}export function openIconPicker(e){F(e)}
|
|
6
|
+
${l}
|
|
7
|
+
[/card]`}function S(){C&&(C.remove(),C=null,a=null)}function q(){const e=T(),t=w.selectionStart,o=w.selectionEnd;w.value=w.value.slice(0,t)+e+w.value.slice(o),w.selectionStart=w.selectionEnd=t+e.length,w.dispatchEvent(new Event("input",{bubbles:!0})),w.focus(),S()}function G(){C=document.createElement("div"),Object.assign(C.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"9999",padding:"24px",isolation:"isolate"});const e=document.createElement("div");Object.assign(e.style,{background:"var(--dm-surface,#1e293b)",border:"1px solid var(--dm-border,#334155)",borderRadius:"14px",width:"100%",maxWidth:"860px",maxHeight:"90vh",display:"flex",flexDirection:"column",boxShadow:"0 24px 64px rgba(0,0,0,.6)",overflow:"hidden"});const t=r("div","display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid var(--dm-border,#334155);flex-shrink:0"),o=r("span","font-weight:700;color:var(--dm-text,#f1f5f9);font-size:14px");o.textContent="Insert Card";const n=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");n.textContent="\u2715",n.addEventListener("click",S),t.appendChild(o),t.appendChild(n);const i=r("div","display:grid;grid-template-columns:280px 1fr;flex:1;overflow:hidden");i.appendChild(H()),i.appendChild(le());const d=r("div","display:flex;justify-content:flex-end;gap:10px;padding:12px 20px;border-top:1px solid var(--dm-border,#334155);flex-shrink:0"),l=r("button","padding:8px 18px;border-radius:8px;border:none;background:var(--dm-border,#334155);color:var(--dm-text-muted,#94a3b8);font-size:12px;font-weight:700;cursor:pointer");l.textContent="Cancel",l.addEventListener("click",S);const g=r("button","padding:8px 18px;border-radius:8px;border:none;background:#6366f1;color:#fff;font-size:12px;font-weight:700;cursor:pointer");g.textContent="Insert Card",g.addEventListener("click",q),d.appendChild(l),d.appendChild(g),e.appendChild(t),e.appendChild(i),e.appendChild(d),C.appendChild(e),C.addEventListener("click",b=>{b.target===C&&S()}),document.body.appendChild(C),D(),x()}function r(e,t=""){const o=document.createElement(e);return t&&(o.style.cssText=t),o}const E="padding:7px 10px;border-radius:7px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:12px;font-family:inherit;width:100%";function H(){const e=r("div","padding:18px;border-right:1px solid var(--dm-border,#334155);display:flex;flex-direction:column;gap:14px;overflow-y:auto");e.appendChild(s("Layout",U()));const t=r("div","display:contents");t.id="cb-dyn-fields",e.appendChild(t),e.appendChild(A()),e.appendChild(s("Style",Y()));const o=r("div");return o.id="cb-grad-wrap",o.style.display=a.variant==="gradient"?"":"none",o.appendChild(s("Gradient",V())),e.appendChild(o),e.appendChild(s("Options",W())),e.appendChild(A()),e.appendChild(X()),e}function U(){const e=r("select",E+";cursor:pointer"),t={};return F.forEach(o=>{(t[o.group]=t[o.group]||[]).push(o)}),Object.entries(t).forEach(([o,n])=>{const i=document.createElement("optgroup");i.label=o,n.forEach(d=>{const l=document.createElement("option");l.value=d.key,l.textContent=`${d.thumb} ${d.label}`,d.key===a.layout&&(l.selected=!0),i.appendChild(l)}),e.appendChild(i)}),e.addEventListener("change",()=>{a.layout=e.value,D(),x()}),e}function Y(){const e=r("div","display:grid;grid-template-columns:repeat(3,1fr);gap:5px"),t={clean:"background:#f8fafc;color:#374151;border:2px solid #e2e8f0",gradient:"background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border:2px solid transparent",glass:"background:rgba(255,255,255,.06);color:#94a3b8;border:2px dashed #334155",accent:"background:#fff;color:#4338ca;border-left:4px solid #6366f1;border-top:2px solid #e2e8f0;border-right:2px solid #e2e8f0;border-bottom:2px solid #e2e8f0",dark:"background:#0f172a;color:#818cf8;border:2px solid #334155",glow:"color:#818cf8;border:2px solid #6366f1;box-shadow:0 0 6px rgba(99,102,241,.4)"};return M.forEach(o=>{const n=r("div",`padding:6px 4px;border-radius:7px;font-size:10px;font-weight:700;text-align:center;cursor:pointer;${t[o]}`);n.textContent=o.charAt(0).toUpperCase()+o.slice(1),n.dataset.variant=o,o===a.variant&&(n.style.outline="2px solid #6366f1"),n.addEventListener("click",()=>{a.variant=o,e.querySelectorAll("[data-variant]").forEach(d=>{d.style.outline=""}),n.style.outline="2px solid #6366f1";const i=document.getElementById("cb-grad-wrap");i&&(i.style.display=o==="gradient"?"":"none"),x()}),e.appendChild(n)}),e}function V(){const e=r("div","display:flex;flex-wrap:wrap;gap:7px");return R.forEach(t=>{const[o,n]=(B[t]||"#6366f1,#8b5cf6").split(","),i=r("div",`width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,${o},${n});cursor:pointer;border:2px solid transparent;transition:border-color .15s`);i.title=t,t===a.gradient&&(i.style.borderColor="#fff"),i.addEventListener("click",()=>{a.gradient=t,e.querySelectorAll("div").forEach(d=>{d.style.borderColor="transparent"}),i.style.borderColor="#fff",x()}),e.appendChild(i)}),e}function W(){const e=r("div","display:flex;gap:6px");return["hover","collapsible"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a[t]),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a[t]=!a[t],n(a[t]),x()}),e.appendChild(o)}),e}function L(e,t){const o=r("select",E+";cursor:pointer");return t.forEach(([n,i])=>{const d=document.createElement("option");d.value=n,d.textContent=i,n===a[e]&&(d.selected=!0),o.appendChild(d)}),o.addEventListener("change",()=>{a[e]=o.value,x()}),o}function J(e,t){const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px 8px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};return n(a[e]),o.textContent=t,o.addEventListener("click",()=>{a[e]=!a[e],n(a[e]),x()}),o}function Q(){const e=r("div","display:flex;gap:6px");return[["","Left"],["center","Centre"],["right","Right"]].forEach(([t,o])=>{const n=r("div"),i=d=>{n.style.cssText=`flex:1;padding:5px 4px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${d?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};i(a.textAlign===t),n.textContent=o,n.addEventListener("click",()=>{a.textAlign=t,e.querySelectorAll("div").forEach((d,l)=>i([["","Left"],["center","Centre"],["right","Right"]][l][0]===t)),x()}),e.appendChild(n)}),e}function X(){const e=r("div","display:flex;flex-direction:column;gap:14px"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");t.textContent="Presentation",e.appendChild(t);const o=r("div","display:grid;grid-template-columns:1fr 1fr;gap:10px"),n=(d,l)=>{const g=r("div","display:flex;flex-direction:column;gap:5px"),b=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");b.textContent=d,g.appendChild(b),g.appendChild(l),o.appendChild(g)};n("Font",L("font",[["","Default"],["serif","Serif"],["mono","Mono"]])),n("Size",L("fontSize",[["","Default"],["sm","Small"],["lg","Large"],["xl","XL"]])),n("Shadow",L("shadow",[["","Default"],["none","None"],["md","Medium"],["lg","Large"]])),n("Padding",L("padding",[["","Default"],["compact","Compact"],["spacious","Spacious"]])),n("Corners",L("rounded",[["","Default"],["none","Square"],["sm","Small"],["lg","Large"],["full","Full"]])),e.appendChild(o),e.appendChild(s("Align",Q()));const i=r("div","display:flex;gap:6px");return i.appendChild(J("borderless","Borderless")),e.appendChild(i),e}function s(e,t){const o=r("div","display:flex;flex-direction:column;gap:5px"),n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#475569)");return n.textContent=e,o.appendChild(n),o.appendChild(t),o}function A(){return r("div","height:1px;background:var(--dm-border,#334155);margin:2px 0")}function f(e,t){const o=r("input",E);return o.type="text",t&&(o.placeholder=t),o.value=a[e]||"",o.addEventListener("input",()=>{a[e]=o.value,x()}),o}function Z(e,t){const o=r("select",E+";cursor:pointer");return t.forEach(n=>{const i=document.createElement("option");i.value=n,i.textContent=n,n===a[e]&&(i.selected=!0),o.appendChild(i)}),o.addEventListener("change",()=>{a[e]=o.value,x()}),o}const K={"icon-top":["subtitle","icon","iconLayout"],"icon-inline":["subtitle","icon","iconLayout"],"image-top":["image"],"image-overlay":["image"],"thumb-left":["image"],"thumb-right":["image"],"wide-left-image":["image"],"full-bg":["image"],"split-half":["image"],"avatar-profile":["subtitle","icon","tags"],"stat-metric":["value","delta","progress"],"quote-testimonial":["subtitle","icon"],callout:["calloutType","icon"],"video-media":["image","duration"],"location-map":["address"],"step-numbered":["step"],"corner-badge":["icon","badge"],"badge-band":["icon","badge"],"rating-review":["rating","subtitle","icon"],"tag-cloud":["tags"],"activity-feed":[],"code-snippet":["lang"],"file-document":["filename","filesize","filetype"],"before-after":[],pricing:["price","period"],"feature-comparison":["subtitle"],"progress-goal":["progress"],"timeline-entry":["subtitle","badge"],"glass-gradient-border":[]},ee=new Set(["basic","no-header-footer","code-snippet","file-document","stat-metric"]),te=new Set(["stat-metric","file-document"]),oe=new Set(["pricing","feature-comparison","activity-feed","before-after","progress-goal"]);function D(){const e=document.getElementById("cb-dyn-fields");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);const t=a.layout,o=K[t]||[];ee.has(t)||e.appendChild(s("Title",f("title","Card heading"))),o.forEach(n=>{const i={subtitle:()=>s("Subtitle",f("subtitle","Secondary line")),icon:()=>s("Icon",ne()),iconLayout:()=>s("Icon layout",ie()),image:()=>s("Image",de()),value:()=>s("Value",f("value","\xA324,980")),delta:()=>s("Delta",f("delta","\u2191 12.4%")),progress:()=>s("Progress %",f("progress","50")),price:()=>s("Price",f("price","\xA329")),period:()=>s("Period",f("period","per month")),lang:()=>s("Language",f("lang","JavaScript")),filename:()=>s("Filename",f("filename","document.pdf")),filesize:()=>s("File size",f("filesize","2.4 MB")),filetype:()=>s("File type",f("filetype","PDF")),rating:()=>s("Rating (1\u20135)",f("rating","5")),duration:()=>s("Duration",f("duration","4:32")),address:()=>s("Address",f("address","12 Main St")),step:()=>s("Step number",f("step","1")),badge:()=>s("Badge label",f("badge","New")),tags:()=>s("Tags (comma-separated)",f("tags","Design, CSS")),calloutType:()=>s("Type",Z("calloutType",["info","warn","success","error"]))};i[n]&&e.appendChild(i[n]())}),te.has(t)||e.appendChild(s("Body content",re())),oe.has(t)||e.appendChild(s("Footer",f("footer","")))}function re(){const e=r("textarea",E+";resize:vertical;min-height:60px;line-height:1.5");return e.value=a.body||"",e.addEventListener("input",()=>{a.body=e.value,x()}),e}function ne(){const e=r("div","display:flex;gap:6px"),t=r("input",E+";flex:1");t.type="text",t.placeholder="icon name",t.value=a.icon||"",t.addEventListener("input",()=>{a.icon=t.value,x()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse icons",o.textContent="\u2605",o.addEventListener("click",()=>P(n=>{a.icon=n,t.value=n,x()})),e.appendChild(t),e.appendChild(o),e}function ie(){const e=r("div","display:flex;gap:6px");return["inline","stacked"].forEach(t=>{const o=r("div"),n=i=>{o.style.cssText=`flex:1;padding:6px;border-radius:7px;border:1px solid;font-size:11px;font-weight:700;text-align:center;cursor:pointer;${i?"border-color:#6366f1;background:#1e1b4b;color:#a5b4fc":"border-color:var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text-muted,#64748b)"}`};n(a.iconLayout===t),o.textContent=t.charAt(0).toUpperCase()+t.slice(1),o.addEventListener("click",()=>{a.iconLayout=t,e.querySelectorAll("div").forEach((i,d)=>n(["inline","stacked"][d]===t)),x()}),e.appendChild(o)}),e}function ae(){return new Promise(async e=>{let t=[];$&&typeof $.onMediaBrowse=="function"&&(t=await $.onMediaBrowse()||[]);const o=document.createElement("dialog");o.style.cssText="margin:auto;padding:0;border:none;border-radius:12px;background:var(--dm-surface,#1e293b);width:min(700px,95vw);max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 25px 60px rgba(0,0,0,.5)";const n=document.createElement("style");n.textContent="dialog.cb-media-picker::backdrop{background:rgba(0,0,0,.75)}",o.className="cb-media-picker";const i=m=>{o.close(),o.remove(),n.remove(),e(m)},d=r("div","display:flex;justify-content:space-between;align-items:center;flex-shrink:0;padding:16px 20px;border-bottom:1px solid var(--dm-border,#334155)"),l=r("div","font-weight:700;font-size:14px;color:var(--dm-text,#f1f5f9)");l.textContent="Select Image";const g=r("button","background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px");g.textContent="\xD7",g.addEventListener("click",()=>i(null)),o.addEventListener("cancel",()=>i(null)),d.appendChild(l),d.appendChild(g);const b=r("div","padding:16px;overflow-y:auto;flex:1"),v=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px"),y=t.filter(m=>/\.(png|jpe?g|gif|webp|svg)$/i.test(m.name||""));if(y.length)y.forEach(m=>{const c=r("div","display:flex;flex-direction:column;gap:6px;cursor:pointer;border:2px solid transparent;border-radius:8px;padding:6px"),h=document.createElement("img");h.src=m.url,h.alt=m.name||"",h.style.cssText="width:100%;height:80px;object-fit:cover;border-radius:6px;display:block";const p=r("div","font-size:9px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--dm-text-muted,#94a3b8)");p.textContent=m.name||m.url,c.appendChild(h),c.appendChild(p),c.addEventListener("mouseenter",()=>{c.style.borderColor="#6366f1"}),c.addEventListener("mouseleave",()=>{c.style.borderColor="transparent"}),c.addEventListener("click",()=>i(m.url)),v.appendChild(c)});else{const m=r("div","color:var(--dm-text-muted,#94a3b8);font-size:13px;padding:20px;text-align:center");m.textContent="No images uploaded yet.",v.appendChild(m)}b.appendChild(v),o.appendChild(d),o.appendChild(b),document.head.appendChild(n),document.body.appendChild(o),o.showModal()})}function de(){const e=r("div","display:flex;gap:6px"),t=r("input",E+";flex:1");t.type="text",t.placeholder="/media/image.jpg",t.value=a.image||"",t.addEventListener("input",()=>{a.image=t.value,x()});const o=r("button","padding:0 10px;height:34px;background:var(--dm-border,#334155);border:none;color:var(--dm-text-muted,#94a3b8);border-radius:7px;font-size:13px;cursor:pointer;flex-shrink:0");return o.title="Browse media",o.textContent="\u{1F4C1}",o.addEventListener("click",async()=>{const n=await ae();n&&(a.image=n,t.value=n,x())}),e.appendChild(t),e.appendChild(o),e}function le(){const e=r("div","padding:20px;background:var(--dm-surface,#f8fafc);display:flex;flex-direction:column;gap:14px;overflow-y:auto"),t=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--dm-text-muted,#94a3b8)");t.textContent="Live Preview";const o=r("div","flex:1;display:flex;align-items:flex-start;justify-content:center");o.id="cb-preview-area";const n=r("div","font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--dm-text-muted,#94a3b8);margin-bottom:6px");n.textContent="Shortcode";const i=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#334155);border-radius:8px;padding:10px 14px;font-family:monospace;font-size:11px;color:var(--dm-primary,#a5b4fc);line-height:1.8;white-space:pre-wrap;word-break:break-all");return i.id="cb-snippet",e.appendChild(t),e.appendChild(o),e.appendChild(n),e.appendChild(i),e}function x(){const e=document.getElementById("cb-preview-area");if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(se());const t=document.getElementById("cb-snippet");t&&(t.textContent=T())}function se(){const e=a,[t,o]=(B[e.gradient]||"#6366f1,#8b5cf6").split(","),n=`linear-gradient(135deg,${t},${o})`,i={clean:"background:var(--dm-surface,#fff);border:1px solid var(--dm-border,#e5e7eb);box-shadow:0 1px 4px rgba(0,0,0,.06)",gradient:`background:${n};color:#fff`,glass:"background:rgba(255,255,255,.12);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.25);box-shadow:0 4px 24px rgba(0,0,0,.12)",accent:"background:var(--dm-surface,#fff);border-top:1px solid var(--dm-border,#e5e7eb);border-right:1px solid var(--dm-border,#e5e7eb);border-bottom:1px solid var(--dm-border,#e5e7eb);border-left:4px solid #6366f1",dark:"background:#0f172a;color:#e2e8f0;border:1px solid #1e293b",glow:"background:var(--dm-surface,#fff);border:1px solid #6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.15),0 0 20px rgba(99,102,241,.3)"},d=e.variant==="gradient"?`background:${n};color:#fff;padding:12px 16px`:"background:var(--dm-border,#f3f4f6);color:var(--dm-text,#111);padding:12px 16px",l=r("div");l.style.cssText=`width:100%;max-width:300px;border-radius:12px;overflow:hidden;font-size:13px;font-family:system-ui,sans-serif;${i[e.variant]||i.clean}`;const g={serif:"Georgia,serif",mono:"'SF Mono','Fira Code',monospace"};e.font&&g[e.font]&&(l.style.fontFamily=g[e.font]);const b={sm:"11px",lg:"15px",xl:"17px"};e.fontSize&&b[e.fontSize]&&(l.style.fontSize=b[e.fontSize]),e.borderless&&(l.style.border="none");const v={none:"none",md:"0 4px 12px rgba(0,0,0,.1)",lg:"0 10px 30px rgba(0,0,0,.18)"};e.shadow&&v[e.shadow]!==void 0&&(l.style.boxShadow=v[e.shadow]);const y={none:"0",sm:"4px",lg:"20px",full:"9999px"};if(e.rounded&&y[e.rounded]!==void 0&&(l.style.borderRadius=y[e.rounded]),e.textAlign&&(l.style.textAlign=e.textAlign),new Set(["image-top","image-overlay","thumb-left","thumb-right","wide-left-image","full-bg","split-half","video-media"]).has(e.layout)){const u=r("div","height:120px;background-size:cover;background-position:center;display:flex;align-items:center;justify-content:center;font-size:2rem;background-color:var(--dm-border,#e2e8f0)");e.image&&(u.style.backgroundImage=`url('${e.image}')`),e.image||(u.textContent="\u{1F5BC}"),l.appendChild(u)}if(!new Set(["basic","no-header-footer","image-overlay","stat-metric","quote-testimonial","activity-feed","before-after","code-snippet","file-document","glass-gradient-border"]).has(e.layout)&&e.title){const u=r("div",d),k=r("div","font-weight:700");k.textContent=e.title,u.appendChild(k),l.appendChild(u)}const h=e.variant==="dark"?"color:#94a3b8;":e.variant==="gradient"?"color:rgba(255,255,255,.85);":"",p=r("div",`padding:13px 16px;${h}`);if(new Set(["before-after","pricing","feature-comparison","activity-feed","progress-goal"]).has(e.layout)){const u=r("em","font-size:11px;color:var(--dm-text-muted,#9ca3af)");u.textContent="Simplified preview \u2014 full render on save.",p.appendChild(u)}else if(e.layout==="stat-metric"){const u=r("div","font-size:2rem;font-weight:800");u.textContent=e.value||"\u2014";const k=r("div","font-size:.8rem;opacity:.7");if(k.textContent=e.title||"",p.appendChild(k),p.appendChild(u),e.delta){const _=r("div","font-size:.78rem;font-weight:600;color:#10b981");_.textContent=e.delta,p.appendChild(_)}}else p.textContent=e.body||"Card body content.";if(e.padding){const u=e.padding==="compact"?"8px 12px":"24px 28px";p.style.padding=u}if(l.appendChild(p),e.footer){const u=e.variant==="gradient"?"rgba(255,255,255,.6)":"var(--dm-text-muted,#9ca3af)",k=r("div",`padding:9px 16px;border-top:1px solid rgba(128,128,128,.15);font-size:11px;color:${u}`);k.textContent=e.footer,l.appendChild(k)}return l}function P(e){const t=r("div","position:fixed;inset:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:10000;padding:24px"),o=r("div","background:var(--dm-surface,#1e293b);border:1px solid var(--dm-border,#475569);border-radius:12px;padding:16px;width:100%;max-width:520px;max-height:70vh;display:flex;flex-direction:column;gap:12px"),n=r("div","display:flex;gap:8px;flex-wrap:wrap"),i=r("input","flex:1;min-width:160px;padding:8px 12px;border-radius:8px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:13px;font-family:inherit");i.type="text",i.placeholder="Search icons\u2026";const d=r("select","padding:8px 12px;border-radius:8px;border:1px solid var(--dm-border,#334155);background:var(--dm-surface,#0f172a);color:var(--dm-text,#e2e8f0);font-size:13px;font-family:inherit;cursor:pointer");O().forEach(({slug:c,label:h})=>{const p=document.createElement("option");p.value=c,p.textContent=h,d.appendChild(p)});const l=r("button","padding:8px 14px;background:var(--dm-border,#334155);border:none;border-radius:8px;color:var(--dm-text-muted,#94a3b8);font-size:12px;cursor:pointer");l.textContent="\u2715 Close",l.addEventListener("click",()=>t.remove()),n.appendChild(i),n.appendChild(d),n.appendChild(l);const g=r("div","font-size:11px;color:var(--dm-text-muted,#94a3b8)"),b=r("div","display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:6px;overflow-y:auto;max-height:400px");let v=null;const y=r("button","padding:8px 18px;background:#6366f1;border:none;border-radius:8px;color:#fff;font-size:12px;font-weight:700;cursor:pointer;align-self:flex-end");y.textContent="Select an icon";function m(){for(;b.firstChild;)b.removeChild(b.firstChild);const c=N(d.value,i.value);g.textContent=`${c.length} icon${c.length===1?"":"s"}`,c.forEach(h=>{const p=r("div","display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border-radius:8px;cursor:pointer;border:2px solid transparent;background:var(--dm-surface,#0f172a)"),z=document.createElement("span");z.setAttribute("data-icon",h),z.style.fontSize="20px";const u=r("div","font-size:8px;color:var(--dm-text-muted,#475569);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%");u.textContent=h,p.appendChild(z),p.appendChild(u),p.addEventListener("click",()=>{v&&(v.style.borderColor="transparent"),p.style.borderColor="#6366f1",v=p,y.textContent=`Use: ${h}`}),p.addEventListener("dblclick",()=>{e(h),t.remove()}),b.appendChild(p)}),typeof I<"u"&&I.scan&&I.scan(b)}i.addEventListener("input",m),d.addEventListener("change",m),m(),y.addEventListener("click",()=>{if(v){const c=v.querySelector("[data-icon]").getAttribute("data-icon");e(c),t.remove()}}),o.appendChild(n),o.appendChild(g),o.appendChild(b),o.appendChild(y),t.appendChild(o),t.addEventListener("click",c=>{c.target===t&&t.remove()}),document.body.appendChild(t),i.focus()}export function openIconPicker(e){P(e)}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{EFFECTS as z,effectsByCategory as A,effectsInjectableInto as j,getEffect as g}from"./effect-defs.js
|
|
1
|
+
import{EFFECTS as z,effectsByCategory as A,effectsInjectableInto as j,getEffect as g}from"./effect-defs.js";import{insertAtCursor as R}from"./markdown-toolbar.js";let h=null;export const EffectsBuilder={open(e){if(h)return;const t={textarea:e,activeEffect:S.get("effects-builder-last")||"reveal",scope:"standalone",host:null,editing:null,fieldValues:{}};if(t.host=P(e),t.host&&j(t.host.name).map(o=>o.name).includes(t.activeEffect)&&!(t.activeEffect in t.host.attrs)&&(t.scope="inject"),t.editing=N(e),t.editing){t.activeEffect=t.editing.name,t.scope="standalone";const l=g(t.editing.name);for(const o of l.attrs)if(o.name in t.editing.attrs){const s=t.editing.attrs[o.name];o.type==="number"?t.fieldValues[o.name]=Number(s):o.type==="checkbox"?t.fieldValues[o.name]=s==="true":t.fieldValues[o.name]=s}}const n=E.slideover({title:"Effects",size:"lg",position:"right"}),c=L(t,n);n.element.appendChild(c),n.open(),I.scan(c),h={state:t,slideover:n}},close(){h&&(h.slideover.close(),h=null)}};function L(e,t){const n=document.createElement("div");n.style.cssText="display:grid;grid-template-columns:170px 1fr;height:100%;min-height:520px;";const c=document.createElement("div");c.className="effects-rail",c.style.cssText="background:var(--dm-surface-subtle,#15152a);border-right:1px solid var(--dm-border,#2a2a40);padding:.5rem .35rem;font-size:.8rem;overflow-y:auto;";const l=document.createElement("div");l.className="effects-pane",l.style.cssText="padding:1rem;display:flex;flex-direction:column;gap:.75rem;overflow-y:auto;";function o(){D(l,e,t)}return v(c,e,o),o(),n.appendChild(c),n.appendChild(l),n}function v(e,t,n){e.replaceChildren();for(const c of A()){const l=document.createElement("div");l.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;margin:.4rem .35rem .25rem;",l.textContent=c.category,e.appendChild(l);for(const o of c.effects){const s=document.createElement("button");s.type="button",s.dataset.effect=o.name,s.style.cssText="display:block;width:100%;text-align:left;padding:.3rem .5rem;border:none;background:transparent;color:var(--dm-text,#ddd);border-radius:3px;font-size:.8rem;cursor:pointer;margin-bottom:.1rem;",s.textContent=o.label,o.name===t.activeEffect&&(s.style.background="var(--dm-primary,#4338ca)",s.style.color="#fff"),s.addEventListener("click",()=>{t.activeEffect=o.name,S.set("effects-builder-last",o.name),t.fieldValues={},v(e,t,n),n()}),e.appendChild(s)}}}function O(e,t){if(e.type==="select"){const c=document.createElement("select");c.style.cssText="width:100%;padding:.35rem .5rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:3px;color:var(--dm-text,#eee);font-size:.85rem;";for(const[l,o]of e.options){const s=document.createElement("option");s.value=l,s.textContent=o,c.appendChild(s)}return c.value=t??e.default??"",c}if(e.type==="checkbox"){const c=document.createElement("input");return c.type="checkbox",c.checked=t??e.default??!1,c}const n=document.createElement("input");return n.type=e.type==="number"?"number":e.type==="colour"?"color":"text",n.value=t??e.default??"",e.placeholder&&(n.placeholder=e.placeholder),e.type==="number"&&(e.min!=null&&(n.min=e.min),e.max!=null&&(n.max=e.max),e.step!=null&&(n.step=e.step)),n.style.cssText="width:100%;padding:.35rem .5rem;background:var(--dm-input-bg,#1a1a1a);border:1px solid var(--dm-border,#333);border-radius:3px;color:var(--dm-text,#eee);font-size:.85rem;",n}function y(e,t){return t.type==="checkbox"?e.checked:t.type==="number"?e.value===""?"":Number(e.value):e.value}function V(e,t,n){const c=g(t.activeEffect);if(e.replaceChildren(),c.attrs.length===0){const o=document.createElement("div");o.style.cssText="color:var(--dm-text-muted,#888);font-size:.8rem;font-style:italic;",o.textContent="This effect takes no parameters.",e.appendChild(o);return}const l=document.createElement("div");l.style.cssText="display:grid;grid-template-columns:1fr 1fr;gap:.6rem .7rem;";for(const o of c.attrs){const s=document.createElement("div"),i=document.createElement("label");i.style.cssText="display:block;color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.2rem;",i.textContent=o.label,s.appendChild(i);const a=O(o,t.fieldValues[o.name]);if(a.addEventListener("input",()=>{t.fieldValues[o.name]=y(a,o),n()}),a.addEventListener("change",()=>{t.fieldValues[o.name]=y(a,o),n()}),s.appendChild(a),o.hint){const r=document.createElement("div");r.style.cssText="color:var(--dm-text-muted,#666);font-size:.7rem;margin-top:.15rem;",r.textContent=o.hint,s.appendChild(r)}l.appendChild(s)}e.appendChild(l)}function C(e){const t={},n=/(\w[\w-]*)(?:\s*=\s*"([^"]*)"|\s*=\s*'([^']*)'|\s*=\s*(\S+))?/g;for(const c of e.matchAll(n)){const l=c[1],o=c[2]??c[3]??c[4]??"";t[l]=o}return t}const B=z.filter(e=>!e.selfClosing).map(e=>e.name);function N(e){const t=e.value,n=e.selectionStart;for(const c of B){const l=new RegExp(`\\[${c}([^\\]]*)\\]`,"g"),o=new RegExp(`\\[/${c}\\]`,"g"),s=[];for(const r of t.matchAll(l)){if(r.index>=n)break;s.push({type:"open",start:r.index,end:r.index+r[0].length,attrStr:r[1]})}for(const r of t.matchAll(o)){if(r.index>=n)break;s.push({type:"close",start:r.index,end:r.index+r[0].length})}s.sort((r,f)=>r.start-f.start);let i=0,a=null;for(const r of s)r.type==="open"?(i++,a=r):(i--,i<0&&(i=0,a=null));if(i>0&&a){const r=new RegExp(`\\[/${c}\\]`,"g"),f=t.slice(n),d=f.match(r);if(d){const p=n+f.indexOf(d[0]);return{name:c,blockStart:a.start,blockEnd:p+d[0].length,openTagEnd:a.end,attrs:C(a.attrStr)}}}}return null}const q=["card","hero","banner","col","button"];function P(e){const t=e.value,n=e.selectionStart;for(const c of q){const l=new RegExp(`\\[${c}([^\\]]*)\\]`,"g"),o=new RegExp(`\\[/${c}\\]`,"g"),s=[];for(const r of t.matchAll(l)){if(r.index>=n)break;s.push({type:"open",start:r.index,end:r.index+r[0].length,attrStr:r[1]})}for(const r of t.matchAll(o)){if(r.index>=n)break;s.push({type:"close",start:r.index,end:r.index+r[0].length})}s.sort((r,f)=>r.start-f.start);let i=0,a=null;for(const r of s)r.type==="open"?(i++,a=r):(i--,i<0&&(i=0,a=null));if(i>0&&a){const r=new RegExp(`\\[/${c}\\]`,"g"),f=t.slice(n),d=f.match(r);if(d){const p=n+f.indexOf(d[0]);return{name:c,openTagStart:a.start,openTagEnd:a.end,closeTagStart:p,closeTagEnd:p+d[0].length,attrs:C(a.attrStr)}}}}return null}function k(e,t){const n=[];for(const c of t.attrs){const l=e.fieldValues[c.name];l===void 0||l===""||l===null||l!==c.default&&(c.type==="checkbox"?n.push(`${c.name}="${l?"true":"false"}"`):n.push(`${c.name}="${String(l).replace(/"/g,""")}"`))}return n.join(" ")}function $(e){const t=g(e.activeEffect),n=k(e,t),c=n?" ":"";if(e.scope==="inject"&&e.host){const l=e.host.attrs,o=t.name,s=[];for(const i of Object.keys(l)){if(i===o||i.startsWith(o+"-"))continue;const a=l[i];s.push(a===""?i:`${i}="${String(a).replace(/"/g,""")}"`)}s.push(o);for(const i of t.attrs){const a=e.fieldValues[i.name];if(a===void 0||a===""||a===null||a===i.default)continue;const r=i.type==="checkbox"?a?"true":"false":String(a).replace(/"/g,""");s.push(`${o}-${i.name}="${r}"`)}return`[${e.host.name} ${s.join(" ")}]\u2026[/${e.host.name}]`}return t.selfClosing?`[${t.name}${c}${n} /]`:`[${t.name}${c}${n}]
|
|
2
2
|
Content
|
|
3
3
|
[/${t.name}]`}function w(e,t){e.replaceChildren();const n=document.createElement("div");n.style.cssText="color:var(--dm-text-muted,#888);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem;",n.textContent="Shortcode (live)",e.appendChild(n);const c=document.createElement("pre");c.style.cssText="background:var(--dm-surface-deep,#000);border:1px solid var(--dm-border,#333);padding:.5rem .65rem;border-radius:3px;font-family:var(--dm-font-mono,monospace);font-size:.75rem;color:#7c6af7;line-height:1.5;white-space:pre-wrap;word-break:break-all;margin:0;",c.textContent=$(t),e.appendChild(c)}function F(e,t,n){if(e.replaceChildren(),t.editing)return;const c=g(t.activeEffect),l=t.host&&c.hosts.includes(t.host.name),o=document.createElement("div");o.style.cssText="background:var(--dm-surface-subtle,#15152a);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:.5rem .6rem;";const s=document.createElement("div");if(s.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;margin-bottom:.3rem;",s.textContent="Apply as",o.appendChild(s),!l){const r=document.createElement("div");r.style.cssText="color:var(--dm-text-muted,#888);font-size:.75rem;font-style:italic;",t.host?r.textContent=`Inserted as a standalone block (${c.label} cannot be injected into [${t.host.name}]).`:r.textContent="Inserted as a standalone block.",o.appendChild(r),e.appendChild(o),t.scope="standalone";return}const i=document.createElement("div");i.style.cssText="display:flex;gap:.3rem;";function a(r,f){const d=document.createElement("button");return d.type="button",d.style.cssText="flex:1;padding:.35rem;border:1px solid var(--dm-border,#333);border-radius:3px;font-size:.75rem;font-weight:600;cursor:pointer;",t.scope===r?(d.style.background="var(--dm-primary,#4338ca)",d.style.color="#fff",d.style.borderColor="var(--dm-primary,#4338ca)"):(d.style.background="transparent",d.style.color="var(--dm-text-muted,#bbb)"),d.textContent=f,d.addEventListener("click",()=>{t.scope=r,n()}),d}i.appendChild(a("standalone","Standalone block")),i.appendChild(a("inject",`Inject into [${t.host.name}]`)),o.appendChild(i),e.appendChild(o)}let x=0;function T(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}function _(e,t){e.replaceChildren();const n=g(t.activeEffect),c=document.createElement("div");c.style.cssText="display:flex;justify-content:space-between;align-items:center;margin-bottom:.25rem;";const l=document.createElement("div");if(l.style.cssText="color:var(--dm-text-muted,#888);text-transform:uppercase;font-size:.65rem;letter-spacing:.05em;",l.textContent="Live preview",c.appendChild(l),!n.previewable){const a=document.createElement("div");a.style.cssText="background:var(--dm-surface-subtle,#15152a);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:.6rem;color:var(--dm-text-muted,#888);font-size:.8rem;font-style:italic;text-align:center;",a.textContent="Runs full-page on the published site \u2014 no inline preview.",e.appendChild(a);return}const o=document.createElement("button");o.type="button",o.style.cssText="background:transparent;border:1px solid var(--dm-border,#333);color:var(--dm-text-muted,#888);font-size:.65rem;padding:.15rem .4rem;border-radius:2px;cursor:pointer;",o.textContent="\u21BB Replay",c.appendChild(o),e.appendChild(c);const s=document.createElement("div");s.style.cssText="background:var(--dm-surface-subtle,#1a1a2e);border:1px solid var(--dm-border,#2a2a40);border-radius:4px;padding:1rem;text-align:center;min-height:80px;position:relative;overflow:hidden;",e.appendChild(s);function i(){x++;const a=x;s.replaceChildren();const r=document.createElement("div");r.style.cssText="background:linear-gradient(135deg,#6366f1,#a855f7);color:#fff;padding:.6rem;border-radius:4px;font-size:.8rem;font-weight:600;",r.textContent="Sample content",s.appendChild(r);const f=window.Domma&&window.Domma.effects;if(!f)return;const d={};for(const p of n.attrs){const m=t.fieldValues[p.name];m===void 0||m===""||m===null||(d[T(p.name)]=m)}try{const p=f[T(n.name)];if(typeof p=="function"){if(a!==x)return;p(r,d)}}catch(p){console.warn("Effects preview failed:",p)}}o.addEventListener("click",i),i()}function D(e,t,n){const c=g(t.activeEffect);e.replaceChildren();const l=document.createElement("h3");l.style.cssText="margin:0;font-size:1rem;color:var(--dm-text,#eee);",l.textContent=c.label,e.appendChild(l);const o=document.createElement("p");o.style.cssText="margin:0;color:var(--dm-text-muted,#999);font-size:.8rem;line-height:1.4;",o.textContent=c.description,e.appendChild(o);const s=document.createElement("div");e.appendChild(s);const i=document.createElement("div");e.appendChild(i);const a=document.createElement("div");e.appendChild(a);const r=document.createElement("div");e.appendChild(r);function f(){F(s,t,f),V(i,t,()=>{w(a,t),_(r,t)}),w(a,t),_(r,t)}f();const d=document.createElement("div");d.style.cssText="display:flex;gap:.5rem;margin-top:auto;padding-top:.75rem;border-top:1px solid var(--dm-border,#2a2a40);";const p=document.createElement("button");p.type="button",p.className="btn btn-ghost",p.textContent="Cancel",p.addEventListener("click",()=>n.close()),d.appendChild(p);const m=document.createElement("button");m.type="button",m.className="btn btn-primary",m.style.flex="2",m.textContent=t.editing?"Update":"Insert effect",m.addEventListener("click",()=>H(t,n)),d.appendChild(m),e.appendChild(d)}function H(e,t){const n=e.textarea,c=$(e);if(e.editing){const l=g(e.editing.name),o=n.value,s=o.substring(0,e.editing.blockStart),i=o.substring(e.editing.blockEnd),a=`[/${l.name}]`.length,r=e.editing.openTagEnd,f=e.editing.blockEnd-a,d=o.substring(r,f),p=k(e,l),m=p?" ":"",u=l.selfClosing?`[${l.name}${m}${p} /]`:`[${l.name}${m}${p}]${d}[/${l.name}]`;n.value=s+u+i;const b=l.selfClosing?s.length+u.length:s.length+u.indexOf("]")+1;n.selectionStart=n.selectionEnd=b,n.dispatchEvent(new Event("input",{bubbles:!0})),t.close();return}if(e.scope==="inject"&&e.host){const l=g(e.activeEffect),o=n.value,s=o.substring(0,e.host.openTagStart),i=o.substring(e.host.openTagEnd),a=e.host.attrs,r=l.name,f=[];for(const m of Object.keys(a)){if(m===r||m.startsWith(r+"-"))continue;const u=a[m];f.push(u===""?m:`${m}="${String(u).replace(/"/g,""")}"`)}f.push(r);for(const m of l.attrs){const u=e.fieldValues[m.name];if(u===void 0||u===""||u===null||u===m.default)continue;const b=m.type==="checkbox"?u?"true":"false":String(u).replace(/"/g,""");f.push(`${r}-${m.name}="${b}"`)}const d=`[${e.host.name} ${f.join(" ")}]`;n.value=s+d+i;const p=s.length+d.length;n.selectionStart=n.selectionEnd=p,n.dispatchEvent(new Event("input",{bubbles:!0})),t.close();return}R(n,c),n.dispatchEvent(new Event("input",{bubbles:!0})),t.close()}
|