@brightsideoy/kama 1.0.0-alpha.20 → 1.0.0-alpha.21
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/content/definitions/blocks/image-gallery.yaml +34 -0
- package/content/definitions/blocks/youtube.yaml +8 -0
- package/content/definitions/field-sets/access.yaml +10 -0
- package/content/definitions/field-sets/page-base.yaml +16 -1
- package/content/definitions/taxonomies/media-tag.yaml +15 -0
- package/definitions/editor/default.ts +15 -1
- package/dist/assets/AssetEditor-B4W7tV1a.js +1 -0
- package/dist/assets/AssetEditor-D9sz6bfN.css +1 -0
- package/dist/assets/CmsFieldTaxonomy-CVlKL-l2.css +1 -0
- package/dist/assets/CmsFieldTaxonomy-C_AwHDwY.js +1 -0
- package/dist/assets/{CmsHelp-DyPJLGGi.js → CmsHelp-BQkr9KyU.js} +1 -1
- package/dist/assets/{CmsPublisher-DNLwjirk.js → CmsPublisher-XSCPrp5L.js} +1 -1
- package/dist/assets/NodeEditor-4TsNvk2f.css +1 -0
- package/dist/assets/NodeEditor-DA5GRtRP.js +161 -0
- package/dist/assets/{TrashWorkspace-DgIg1v6t.js → TrashWorkspace-CATe46WF.js} +1 -1
- package/dist/assets/index-CY0VYSyt.css +1 -0
- package/dist/assets/index-DdG9Pozx.js +14 -0
- package/dist/assets/{plus-FQRsZBoJ.js → plus-CX_GHzXs.js} +1 -1
- package/dist/assets/useNodes-CqFlc72m.js +1 -0
- package/dist/{dist-D_Q1y4Kh.js → dist-3Xc2TTZw.js} +1117 -456
- package/dist/index.html +4 -4
- package/dist/index.js +1117 -456
- package/dist/schema-compiler.js +1 -1
- package/package.json +5 -5
- package/schema.sql +10 -0
- package/templates/astro-starter/src/components/global/NavigationMenu.astro +11 -3
- package/dist/assets/AssetEditor-D5j7pwcK.css +0 -1
- package/dist/assets/AssetEditor-Dt1zCR7_.js +0 -1
- package/dist/assets/NodeEditor-CiXQKXK1.js +0 -147
- package/dist/assets/NodeEditor-pZI3gu4a.css +0 -1
- package/dist/assets/index-DQ6_RmCI.js +0 -14
- package/dist/assets/index-DcKiaRjI.css +0 -1
- package/dist/assets/useNodes-D2-VxsxR.js +0 -1
- package/templates/astro-starter/old_src/components/blocks/BlockRenderer.astro +0 -143
- package/templates/astro-starter/old_src/components/blocks/ColumnLayout.astro +0 -67
- package/templates/astro-starter/old_src/components/blocks/HeaderImage.astro +0 -126
- package/templates/astro-starter/old_src/components/blocks/Hero.astro +0 -218
- package/templates/astro-starter/old_src/components/blocks/HtmlBlock.astro +0 -25
- package/templates/astro-starter/old_src/components/blocks/ImageBlock.astro +0 -91
- package/templates/astro-starter/old_src/components/blocks/NodeList.astro +0 -274
- package/templates/astro-starter/old_src/components/blocks/TextBlock.astro +0 -15
- package/templates/astro-starter/old_src/components/global/Breadcrumb.astro +0 -108
- package/templates/astro-starter/old_src/components/global/Footer.astro +0 -50
- package/templates/astro-starter/old_src/components/global/Header.astro +0 -171
- package/templates/astro-starter/old_src/components/global/MetaHead.astro +0 -266
- package/templates/astro-starter/old_src/components/global/NavigationMenu.astro +0 -413
- package/templates/astro-starter/old_src/components/ui/KamaImage.astro +0 -180
- package/templates/astro-starter/old_src/layouts/SkeletonLayout.astro +0 -56
- package/templates/astro-starter/old_src/layouts/StandardLayout.astro +0 -63
- package/templates/astro-starter/old_src/lib/cms.ts +0 -219
- package/templates/astro-starter/old_src/lib/media/kama-image-service.ts +0 -67
- package/templates/astro-starter/old_src/lib/media/media-proxy.ts +0 -148
- package/templates/astro-starter/old_src/lib/media/media-url.ts +0 -112
- package/templates/astro-starter/old_src/middleware.ts +0 -536
- package/templates/astro-starter/old_src/pages/404.astro +0 -46
- package/templates/astro-starter/old_src/pages/[...slug].astro +0 -311
- package/templates/astro-starter/old_src/pages/api/load-nodes.ts +0 -68
- package/templates/astro-starter/old_src/pages/api/partials/node-cards.astro +0 -101
- package/templates/astro-starter/old_src/pages/llms-full.txt.ts +0 -171
- package/templates/astro-starter/old_src/pages/llms.txt.ts +0 -113
- package/templates/astro-starter/old_src/pages/media/[...path].ts +0 -14
- package/templates/astro-starter/old_src/pages/partials/footer.astro +0 -69
- package/templates/astro-starter/old_src/pages/partials/nav.astro +0 -141
- package/templates/astro-starter/old_src/styles/standard-theme.css +0 -157
- package/templates/astro-starter/old_src/utils/tiptap.ts +0 -113
package/dist/schema-compiler.js
CHANGED
|
@@ -30,7 +30,7 @@ async function f() {
|
|
|
30
30
|
if (n(f)) l = (await import(t(f).href)).compileDefinitions;
|
|
31
31
|
else if (n(p)) l = (await import(t(p).href)).compileDefinitions;
|
|
32
32
|
else try {
|
|
33
|
-
l = (await import("./dist-
|
|
33
|
+
l = (await import("./dist-3Xc2TTZw.js")).compileDefinitions;
|
|
34
34
|
} catch (e) {
|
|
35
35
|
console.error("\x1B[31m ✖\x1B[0m \x1B[31mCould not resolve Kama Schema Engine:\x1B[0m", e), process.exit(1);
|
|
36
36
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brightsideoy/kama",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
"@tiptap/core": "^3.30.0",
|
|
46
46
|
"@tiptap/extension-subscript": "^3.30.1",
|
|
47
47
|
"@tiptap/extension-superscript": "^3.30.1",
|
|
48
|
-
"@tiptap/extension-table": "^3.30.
|
|
49
|
-
"@tiptap/extension-table-cell": "^3.30.
|
|
50
|
-
"@tiptap/extension-table-header": "^3.30.
|
|
51
|
-
"@tiptap/extension-table-row": "^3.30.
|
|
48
|
+
"@tiptap/extension-table": "^3.30.1",
|
|
49
|
+
"@tiptap/extension-table-cell": "^3.30.1",
|
|
50
|
+
"@tiptap/extension-table-header": "^3.30.1",
|
|
51
|
+
"@tiptap/extension-table-row": "^3.30.1",
|
|
52
52
|
"@tiptap/pm": "^3.30.0",
|
|
53
53
|
"@tiptap/starter-kit": "^3.30.0",
|
|
54
54
|
"@tiptap/vue-3": "^3.30.0",
|
package/schema.sql
CHANGED
|
@@ -203,6 +203,14 @@ CREATE TABLE IF NOT EXISTS "node_terms" (
|
|
|
203
203
|
FOREIGN KEY (termId) REFERENCES taxonomy_terms(id) ON DELETE CASCADE
|
|
204
204
|
);
|
|
205
205
|
|
|
206
|
+
CREATE TABLE IF NOT EXISTS "asset_terms" (
|
|
207
|
+
assetId TEXT NOT NULL,
|
|
208
|
+
termId INTEGER NOT NULL,
|
|
209
|
+
PRIMARY KEY (assetId, termId),
|
|
210
|
+
FOREIGN KEY (assetId) REFERENCES assets(id) ON DELETE CASCADE,
|
|
211
|
+
FOREIGN KEY (termId) REFERENCES taxonomy_terms(id) ON DELETE CASCADE
|
|
212
|
+
);
|
|
213
|
+
|
|
206
214
|
CREATE TABLE IF NOT EXISTS "node_relations" (
|
|
207
215
|
sourceNodeId INTEGER NOT NULL,
|
|
208
216
|
targetNodeId INTEGER NOT NULL,
|
|
@@ -261,6 +269,8 @@ CREATE INDEX IF NOT EXISTS idx_node_terms_node ON node_terms(nodeId);
|
|
|
261
269
|
CREATE INDEX IF NOT EXISTS idx_node_terms_term ON node_terms(termId);
|
|
262
270
|
CREATE INDEX IF NOT EXISTS idx_node_terms_node_term ON node_terms(nodeId, termId);
|
|
263
271
|
CREATE INDEX IF NOT EXISTS idx_node_terms_term_node ON node_terms(termId, nodeId);
|
|
272
|
+
CREATE INDEX IF NOT EXISTS idx_asset_terms_asset ON asset_terms(assetId);
|
|
273
|
+
CREATE INDEX IF NOT EXISTS idx_asset_terms_term ON asset_terms(termId);
|
|
264
274
|
CREATE INDEX IF NOT EXISTS idx_node_relations_source ON node_relations(sourceNodeId);
|
|
265
275
|
CREATE INDEX IF NOT EXISTS idx_node_relations_target ON node_relations(targetNodeId);
|
|
266
276
|
CREATE INDEX IF NOT EXISTS idx_node_routes_lookup ON node_routes(path, channelId);
|
|
@@ -23,7 +23,8 @@ const rootNode =
|
|
|
23
23
|
|
|
24
24
|
// 🎯 FIX: If rootNode has children, display those children as top-level menu items.
|
|
25
25
|
// If not, filter out the root node by ID AND path.
|
|
26
|
-
|
|
26
|
+
// ✨ NEW: Filter out nodes where notInMenu is true
|
|
27
|
+
const rawTopLevelItems =
|
|
27
28
|
rootNode?.children && rootNode.children.length > 0
|
|
28
29
|
? rootNode.children
|
|
29
30
|
: tree.filter(
|
|
@@ -34,6 +35,10 @@ const topLevelNavItems =
|
|
|
34
35
|
item.path !== "",
|
|
35
36
|
);
|
|
36
37
|
|
|
38
|
+
const topLevelNavItems = rawTopLevelItems.filter(
|
|
39
|
+
item => !(item as any).notInMenu,
|
|
40
|
+
);
|
|
41
|
+
|
|
37
42
|
const isPathActive = (itemPath?: string) => {
|
|
38
43
|
const normItem = (itemPath || "").replace(/\/$/, "") || "/";
|
|
39
44
|
if (normItem === "/") return currentPath === "/";
|
|
@@ -62,7 +67,10 @@ const isExactActive = (itemPath?: string) => {
|
|
|
62
67
|
<ul class="nav-list">
|
|
63
68
|
{
|
|
64
69
|
topLevelNavItems.map(item => {
|
|
65
|
-
|
|
70
|
+
// ✨ NEW: Also filter children for notInMenu
|
|
71
|
+
const visibleChildren =
|
|
72
|
+
item.children?.filter(child => !(child as any).notInMenu) || [];
|
|
73
|
+
const hasChildren = visibleChildren.length > 0;
|
|
66
74
|
const isParentActive = isPathActive(item.path);
|
|
67
75
|
|
|
68
76
|
if (hasChildren) {
|
|
@@ -93,7 +101,7 @@ const isExactActive = (itemPath?: string) => {
|
|
|
93
101
|
{item.title} Overview
|
|
94
102
|
</a>
|
|
95
103
|
</li>
|
|
96
|
-
{
|
|
104
|
+
{visibleChildren.map(child => (
|
|
97
105
|
<li>
|
|
98
106
|
<a
|
|
99
107
|
href={child.path}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.canvas[data-v-cd1f3a28]{background:var(--cms-color-surface);font-family:var(--cms-font-sans);flex-direction:column;flex-grow:1;height:100%;display:flex;position:relative}.entity-header[data-v-cd1f3a28]{z-index:100;background:var(--cms-color-bg);border-bottom:1px solid var(--cms-color-border);flex-direction:column;flex-shrink:0;display:flex;position:sticky;top:0;container-type:inline-size}@container (width<=690px){.save-btn .btn-text[data-v-cd1f3a28],.slug-badge[data-v-cd1f3a28]{display:none}}.top-row[data-v-cd1f3a28]{justify-content:space-between;align-items:center;padding:10px 20px;display:flex}.node-info[data-v-cd1f3a28]{flex-direction:column;align-items:flex-start;gap:4px;display:flex}.dynamic-title-group[data-v-cd1f3a28]{flex-wrap:wrap;align-items:center;gap:18px;display:flex}.inline-title-input[data-v-cd1f3a28]{color:var(--cms-color-text-main);border-radius:var(--cms-radius-sm);cursor:default;background:0 0;border:1px solid #0000;margin:0 0 0 -6px;padding:4px 6px;font-size:17px;font-weight:700;display:inline-block}.meta-row[data-v-cd1f3a28]{align-items:center;gap:6px;display:flex}.slug-badge[data-v-cd1f3a28]{font-size:13px;font-family:var(--cms-font-mono);color:var(--cms-color-text-muted)}.actions-group[data-v-cd1f3a28]{align-items:center;gap:10px;display:flex}[data-v-cd1f3a28] .icon-only-btn{padding:0 8px!important}.context-wrapper[data-v-cd1f3a28]{display:flex;position:relative}.save-btn[data-v-cd1f3a28]{align-items:center;gap:6px;display:flex}.save-icon[data-v-cd1f3a28]{margin-top:-1px}.transparent-btn[data-v-cd1f3a28]{background:0 0;border-color:#0000}.transparent-btn[data-v-cd1f3a28]:hover{background:var(--cms-color-surface-hover);border-color:#0000!important}.editor-body[data-v-cd1f3a28]{flex:1;display:flex;position:relative;overflow:hidden;container:asseteditor/inline-size}.loading-state[data-v-cd1f3a28]{color:var(--cms-color-text-muted);flex:1;justify-content:center;align-items:center;display:flex}.asset-content-scroll[data-v-cd1f3a28]{background:var(--cms-color-surface);grid-template:"preview metadata""usage metadata"1fr/1fr 320px;width:100%;height:100%;display:grid;overflow-y:auto}.main-preview-section[data-v-cd1f3a28]{padding:var(--cms-page-padding,24px) var(--cms-page-padding,24px) 0 var(--cms-page-padding,24px);background:var(--cms-color-surface);grid-area:preview}.preview-container[data-v-cd1f3a28]{border-radius:var(--cms-radius-lg);border:1px solid var(--cms-color-border);background:var(--cms-color-bg);justify-content:center;align-items:center;width:100%;min-height:100px;padding:24px;display:flex}.main-preview-wrapper[data-v-cd1f3a28]{width:auto;max-width:100%;height:auto;max-height:480px}.main-preview-wrapper[data-v-cd1f3a28] .preview-img{object-fit:contain!important;width:auto!important;height:auto!important;max-height:480px!important}.doc-preview[data-v-cd1f3a28]{color:var(--cms-color-text-muted);flex-direction:column;align-items:center;gap:12px;display:flex}.preview-footer[data-v-cd1f3a28]{color:var(--cms-color-text-muted);justify-content:space-between;margin-top:12px;margin-bottom:24px;font-size:12px;display:flex}.ext-link[data-v-cd1f3a28]{color:var(--cms-color-primary);align-items:center;gap:4px;text-decoration:none;display:inline-flex}.ext-link[data-v-cd1f3a28]:hover{text-decoration:underline}.data-column[data-v-cd1f3a28]{background:var(--cms-color-surface);border-left:1px solid var(--cms-color-border);flex-direction:column;grid-area:metadata;display:flex}.data-header[data-v-cd1f3a28]{border-bottom:1px solid var(--cms-color-border);background:var(--cms-color-surface);flex-shrink:0;align-items:center;padding:16px 24px;display:flex}.data-header h3[data-v-cd1f3a28]{color:var(--cms-color-text-main);align-items:center;gap:6px;margin:0;font-size:14px;display:flex}.data-content[data-v-cd1f3a28]{flex-direction:column;gap:20px;padding:24px;display:flex}.form-group[data-v-cd1f3a28]{flex-direction:column;gap:6px;display:flex}.form-group label[data-v-cd1f3a28]{color:var(--cms-color-text-main);font-size:12px;font-weight:600}.cms-input[data-v-cd1f3a28]{border:1px solid var(--cms-color-border);border-radius:var(--cms-radius-sm);background:var(--cms-color-bg);width:100%;color:var(--cms-color-text-main);outline:none;padding:10px;font-size:13px}.cms-input[data-v-cd1f3a28]:focus{border-color:var(--cms-color-primary)}.cms-textarea[data-v-cd1f3a28]{resize:vertical;min-height:80px}.help-text[data-v-cd1f3a28]{color:var(--cms-color-text-faint);font-size:11px}.usage-and-crops-section[data-v-cd1f3a28]{padding:0 var(--cms-page-padding,24px) 40px var(--cms-page-padding,24px);background:var(--cms-color-surface);grid-area:usage}.usage-section-container[data-v-cd1f3a28]{flex-direction:column;width:100%;max-width:900px;margin:0 auto;display:flex}.gallery-header-row[data-v-cd1f3a28]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px;display:flex}.gallery-header-row h3[data-v-cd1f3a28]{color:var(--cms-color-text-main);align-items:center;gap:8px;margin:0;font-size:16px;display:flex}.gallery-desc[data-v-cd1f3a28]{color:var(--cms-color-text-muted);margin:0 0 16px;font-size:13px}.action-btn.outline[data-v-cd1f3a28]{border:1px solid var(--cms-color-border);background:var(--cms-color-surface);border-radius:var(--cms-radius-sm);cursor:pointer;align-items:center;gap:4px;padding:6px 10px;font-size:12px;font-weight:600;display:inline-flex}.action-btn.outline[data-v-cd1f3a28]:hover{background:var(--cms-color-surface-hover)}.list-container[data-v-cd1f3a28]{background:var(--cms-color-surface);border:1px solid var(--cms-color-border);border-radius:var(--cms-radius-lg);overflow:hidden}.meta-stack[data-v-cd1f3a28]{flex-direction:column;gap:8px;width:100%;display:flex}.crop-showcase[data-v-cd1f3a28]{flex-wrap:wrap;align-items:flex-end;gap:16px;width:100%;display:flex}.crop-item[data-v-cd1f3a28]{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.crop-img-fixed-height[data-v-cd1f3a28]{border-radius:var(--cms-radius-xs);border:1px solid var(--cms-color-border-dark);background:var(--cms-color-surface-hover);justify-content:center;align-items:center;width:auto;height:56px;display:flex;overflow:hidden}.crop-img-fixed-height[data-v-cd1f3a28] .preview-img{object-fit:contain;display:block;width:auto!important;height:100%!important}.crop-name[data-v-cd1f3a28]{font-size:10px;font-weight:600;font-family:var(--cms-font-mono);color:var(--cms-color-text-subtle);text-transform:uppercase;letter-spacing:.04em}.standalone-empty[data-v-cd1f3a28]{background:var(--cms-color-bg);border:1px dashed var(--cms-color-border-dark);border-radius:var(--cms-radius-md);margin-bottom:8px;padding:12px 16px}.usage-empty[data-v-cd1f3a28]{color:var(--cms-color-text-muted);align-items:center;gap:8px;font-size:12px;display:flex}.status-dot[data-v-cd1f3a28]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.status-dot.success[data-v-cd1f3a28]{background:var(--cms-color-success,#10b981)}.status-dot.warning[data-v-cd1f3a28]{background:var(--cms-color-warning,#f59e0b)}.node-title[data-v-cd1f3a28]{color:var(--cms-color-text-main);font-size:13.5px;font-weight:600}.node-field[data-v-cd1f3a28]{color:var(--cms-color-text-muted);font-size:11.5px}.text-danger[data-v-cd1f3a28]{color:var(--cms-color-danger)!important}@container (width<=820px){.asset-content-scroll[data-v-cd1f3a28]{grid-template:"preview""metadata""usage"/1fr}.data-column[data-v-cd1f3a28]{border-left:none;border-top:1px solid var(--cms-color-border);border-bottom:1px solid var(--cms-color-border);margin-bottom:24px}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,B as t,E as n,Et as r,I as i,K as a,O as o,R as s,S as c,St as ee,T as l,Y as u,b as d,f,g as p,j as m,lt as h,o as g,q as _,t as v,tt as y,v as b,x,y as S}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{i as te}from"./useNodes-D2-VxsxR.js";import{d as ne,s as re}from"./schema-helpers-DvficKko.js";import{a as ie,i as ae,n as oe,o as se,r as ce,t as C}from"./CmsImagePreview-DuHPBzml.js";import{n as w,t as le}from"./NodeContextMenu-C_HWBGeb.js";import{n as ue,t as T}from"./trash-2-CAUF1KtI.js";import{t as de}from"./layers-B6RgfpPR.js";import{t as fe}from"./panel-left-close-CVFakVaA.js";import{t as pe}from"./save-Ctv8vW9H.js";import{t as E}from"./CmsButton-CbOfxvjr.js";import{t as D}from"./CmsDataRow--H4iI_u_.js";import{t as O}from"./CmsBadge-D0Ob9qPU.js";m(),h(),u(),g();var me={class:`asset-editor-wrapper canvas`},he={class:`entity-header`},k={class:`top-row`},A={class:`node-info`},j={class:`dynamic-title-group`},M={class:`inline-title-input`},N={key:0},P={key:1},F={class:`meta-row`},I={key:0,class:`slug-badge`},L={class:`actions-group`},R={class:`btn-text`},ge={class:`editor-body`},_e={key:0,class:`loading-state`},ve={key:1,class:`asset-content-scroll`},ye={class:`main-preview-section`},be={key:1,class:`doc-preview`},xe={class:`preview-footer`},Se=[`href`],Ce={class:`data-column`},we={class:`data-header`},Te={class:`data-content`},Ee={class:`form-group`},De={class:`form-group`},Oe={class:`form-group`},ke={class:`usage-and-crops-section`},Ae={class:`usage-section-container`},je={class:`gallery-header-row`},Me={key:0,class:`usage-empty standalone-empty`},Ne={key:1,class:`list-container`},Pe={class:`node-title`},Fe={class:`meta-stack`},Ie={class:`node-field`},Le={key:0,class:`crop-showcase`},Re={class:`crop-name`},ze={key:0,class:`usage-section-container`,style:{"margin-top":`40px`}},Be={class:`gallery-header-row`},Ve={class:`list-container`},He={class:`meta-stack`},Ue={class:`node-field`},We={key:0,class:`crop-showcase`},Ge={class:`crop-item`},Ke={class:`crop-name`},qe=[`onClick`],z=v(o({__name:`AssetEditor`,props:{assetId:{}},setup(o){let u=o,{activeView:m,nodeSchemas:h}=re(),{confirmDiscard:g}=ne(),{navigateToNodeById:v}=te(),z=e(null),B=e(!0),V=e(!1),H=e({filename:``,title:``,alt:``}),U=e({filename:``,title:``,alt:``}),W=e(!1),G=e(null),K=e(null),Je=()=>{if(W.value){W.value=!1;return}G.value&&(K.value=G.value.getBoundingClientRect()),W.value=!0},Ye=b(()=>{let e=[{key:`copy-url`,label:`Copy Public URL`,icon:se},{key:`open-tab`,label:`Open in New Tab`,icon:w}];return z.value&&z.value.connectedNodes?.length>0&&(e.push({key:`div-nodes`,label:``,divider:!0}),e.push({key:`show-nodes`,label:`Connected Nodes (${z.value.connectedNodes.length})`,icon:oe})),e.push({key:`div-1`,label:``,divider:!0},{key:`delete`,label:`Delete Asset`,icon:T}),e}),Xe=async e=>{W.value=!1,z.value&&(e===`copy-url`&&z.value.url?await navigator.clipboard.writeText(z.value.url):e===`open-tab`&&z.value.url?window.open(z.value.url,`_blank`):e===`delete`?await g(`Are you sure you want to delete "${z.value.filename||`this asset`}"?`,`Delete Asset?`,`Delete`,`Cancel`)&&await Ze():e===`show-nodes`&&Y())},Ze=async()=>{try{(await fetch(`/api/admin/assets/${u.assetId}`,{method:`DELETE`})).ok&&(window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),m.value={type:`dashboard`})}catch{}},Qe=b(()=>H.value.filename!==U.value.filename||H.value.title!==U.value.title||H.value.alt!==U.value.alt),q=async()=>{B.value=!0;try{let e=await fetch(`/api/admin/assets/${u.assetId}/details`);if(e.ok){let t=await e.json();z.value=t;let n={filename:t.filename||``,title:t.title||``,alt:t.alt||``};H.value={...n},U.value={...n}}}catch{}finally{B.value=!1}},$e=async()=>{V.value=!0;try{(await fetch(`/api/admin/assets/${u.assetId}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(H.value)})).ok&&(U.value={...H.value},window.dispatchEvent(new CustomEvent(`cms-assets-updated`)))}catch{}finally{V.value=!1}},J=async e=>{let t=`Permanently delete orphaned crop "${z.value?.variants?.find(t=>String(t.id)===String(e))?.filename||`variant`}"?`;if(await g(t,`Delete Crop`,`Delete`,`Cancel`))try{(await fetch(`/api/admin/assets/purge/${e}`,{method:`DELETE`})).ok&&(z.value?.variants&&(z.value.variants=z.value.variants.filter(t=>String(t.id)!==String(e))),window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),await q())}catch{}},et=async()=>{let e=$.value;if(e.length===0)return;let t=`Are you sure you want to permanently delete all ${e.length} orphaned crops?`;if(await g(t,`Purge All Orphaned Crops`,`Purge All`,`Cancel`))try{for(let t of e)await fetch(`/api/admin/assets/purge/${t.id}`,{method:`DELETE`});window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),await q()}catch(e){console.error(`Failed to purge crops`,e)}},tt=e=>{m.value={type:`node`},v(String(e)),window.dispatchEvent(new CustomEvent(`cms-switch-sidebar-tab`,{detail:`vault`}))},Y=()=>{sessionStorage.setItem(`cms-vault-asset-filter`,u.assetId),window.dispatchEvent(new CustomEvent(`cms-filter-vault-by-asset`,{detail:u.assetId})),window.dispatchEvent(new CustomEvent(`cms-switch-sidebar-tab`,{detail:`vault`}))},X=b(()=>z.value&&(z.value.mimeType?.startsWith(`image/`)||/\.(jpg|jpeg|png|webp|gif|svg)$/i.test(z.value.filename))),Z=e=>{if(!e)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]},nt=(e,t)=>{if(!t||t===`Original`||t===`Unknown Crop`)return t||`Original Image`;try{let n=h.value[e];if(!n)return t;let r=null,i=e=>{if(!(!e||r))for(let n of Object.values(e))n.crop&&t===`standard`&&n.crop.label&&(r=n.crop.label),n.crops&&n.crops[t]&&n.crops[t].label&&(r=n.crops[t].label)};return i(n.fields),n.tabs&&Object.values(n.tabs).forEach(e=>i(e.fields)),r||t}catch{return t}},Q=b(()=>{if(!z.value||!z.value.connectedNodes)return[];let e=new Map;for(let t of z.value.connectedNodes){let n=String(t.id),r=t.contentType||t.nodeType,i=t.fieldKey?.split(`.`)[0]||`Content Area`,a=t.fieldKey?.match(/^blocks\[(\d+)\]/);a&&(i=`Block ${parseInt(a[1],10)+1}`);let o=String(t.assetId)!==String(z.value.id),s=null;if(o){let e=z.value.variants?.find(e=>String(e.id)===String(t.assetId));if(e){let n=`Unknown Crop`,i=t.fieldKey?.match(/\.variants\.([^.]+)/);if(i)n=i[1];else{let t=e.filename?.match(/^(.+?)_ast_/);t&&(n=t[1])}s={id:e.id,url:e.url,label:nt(r,n)}}}else s={id:z.value.id,url:z.value.url,label:`Original Image`};if(!e.has(n))e.set(n,{id:t.id,title:t.title,nodeType:r,fieldKeys:new Set([i]),usedAssets:s?[s]:[]});else{let t=e.get(n);t.fieldKeys.add(i),s&&!t.usedAssets.some(e=>e.id===s.id)&&t.usedAssets.push(s)}}return Array.from(e.values()).map(e=>({...e,fieldKey:Array.from(e.fieldKeys).join(`, `)}))}),$=b(()=>{if(!z.value||!z.value.variants)return[];let e=new Set(z.value.connectedNodes?.map(e=>String(e.assetId))||[]);return z.value.variants.filter(t=>!e.has(String(t.id)))}),rt=e=>{let t=e?.match(/^(.+?)_ast_/);return t?t[1]:`Unknown Crop`};return i(()=>q()),(e,i)=>(s(),c(`div`,me,[S(`header`,he,[S(`div`,k,[S(`div`,A,[S(`div`,j,[S(`span`,M,[z.value?(s(),c(`span`,N,r(z.value.filename),1)):(s(),c(`span`,P,`Loading Asset...`))])]),S(`div`,F,[z.value?(s(),c(`span`,I,r(Z(z.value.sizeBytes))+` • `+r(z.value.mimeType),1)):x(``,!0)])]),S(`div`,L,[z.value?(s(),c(`div`,{key:0,class:`context-wrapper`,ref_key:`contextTriggerRef`,ref:G},[n(E,{variant:`secondary`,title:`More Options`,onClick:Je,disabled:V.value,class:`transparent-btn icon-only-btn`},{default:a(()=>[n(y(ae),{size:16})]),_:1},8,[`disabled`]),n(le,{show:W.value,items:Ye.value,"anchor-rect":K.value,onSelect:Xe,onClose:i[0]||=e=>W.value=!1},null,8,[`show`,`items`,`anchor-rect`])],512)):x(``,!0),n(E,{variant:`primary`,class:`save-btn`,disabled:V.value||!Qe.value,onClick:$e},{default:a(()=>[n(y(pe),{size:14,class:`save-icon`}),S(`span`,R,r(V.value?`Saving...`:`Save Metadata`),1)]),_:1},8,[`disabled`])])])]),S(`div`,ge,[B.value?(s(),c(`div`,_e,`Loading asset details...`)):z.value?(s(),c(`div`,ve,[S(`div`,ye,[S(`div`,{class:ee([`preview-container`,{"is-doc":!X.value}])},[X.value?(s(),d(C,{key:0,url:z.value.url,alt:z.value.alt||z.value.filename,width:1200,quality:85,class:`main-preview-wrapper`},null,8,[`url`,`alt`])):(s(),c(`div`,be,[n(y(ue),{size:64}),i[4]||=S(`span`,null,`Preview not available for this file type`,-1)]))],2),S(`div`,xe,[S(`span`,null,`Original Upload: `+r(new Date(z.value.createdAt).toLocaleString()),1),S(`a`,{href:z.value.url,target:`_blank`,class:`ext-link`},[i[5]||=l(`Open original file `,-1),n(y(w),{size:12})],8,Se)])]),S(`div`,Ce,[S(`div`,we,[S(`h3`,null,[n(y(ce),{size:14,class:`inline-icon`}),i[6]||=l(` Metadata `,-1)])]),S(`div`,Te,[S(`div`,Ee,[i[7]||=S(`label`,null,`Filename`,-1),_(S(`input`,{"onUpdate:modelValue":i[1]||=e=>H.value.filename=e,type:`text`,class:`cms-input`},null,512),[[f,H.value.filename]]),i[8]||=S(`span`,{class:`help-text`},`Changing this does not break the permanent CDN link.`,-1)]),S(`div`,De,[i[9]||=S(`label`,null,`Title (Internal/SEO)`,-1),_(S(`input`,{"onUpdate:modelValue":i[2]||=e=>H.value.title=e,type:`text`,class:`cms-input`},null,512),[[f,H.value.title]])]),S(`div`,Oe,[i[10]||=S(`label`,null,`Alt Text (Accessibility)`,-1),_(S(`textarea`,{"onUpdate:modelValue":i[3]||=e=>H.value.alt=e,class:`cms-input cms-textarea`},null,512),[[f,H.value.alt]])])])]),S(`div`,ke,[S(`div`,Ae,[S(`div`,je,[S(`h3`,null,[n(y(de),{size:16,class:`inline-icon`}),i[11]||=l(` Node Usage `,-1)]),Q.value.length>0?(s(),c(`button`,{key:0,class:`action-btn outline`,onClick:Y,title:`Show these nodes in the left Vault pane`},[n(y(fe),{size:13}),i[12]||=l(` Vault Filter `,-1)])):x(``,!0)]),Q.value.length===0?(s(),c(`div`,Me,[...i[13]||=[S(`span`,{class:`status-dot warning`},null,-1),S(`span`,null,`Asset is not currently used on any nodes.`,-1)]])):(s(),c(`div`,Ne,[(s(!0),c(p,null,t(Q.value,e=>(s(),d(D,{key:e.id,clickable:``,onClick:t=>tt(e.id)},{title:a(()=>[i[14]||=S(`span`,{class:`status-dot success`},null,-1),S(`span`,Pe,r(e.title||`Untitled`),1),n(O,{variant:`type`},{default:a(()=>[l(r(e.nodeType||`page`),1)]),_:2},1024)]),meta:a(()=>[S(`div`,Fe,[S(`span`,Ie,`Used in field: `+r(e.fieldKey),1),X.value?(s(),c(`div`,Le,[(s(!0),c(p,null,t(e.usedAssets,e=>(s(),c(`div`,{key:e.id,class:`crop-item`},[n(C,{url:e.url,alt:e.label,width:200,quality:75,class:`crop-img-fixed-height`},null,8,[`url`,`alt`]),S(`span`,Re,r(e.label),1)]))),128))])):x(``,!0)])]),_:2},1032,[`onClick`]))),128))]))]),$.value.length>0?(s(),c(`div`,ze,[S(`div`,Be,[S(`h3`,null,[n(y(ie),{size:16,class:`inline-icon`}),l(` Orphaned Crops (`+r($.value.length)+`) `,1)]),S(`button`,{class:`action-btn outline text-danger`,onClick:et},[n(y(T),{size:13}),i[15]||=l(` Purge All `,-1)])]),i[18]||=S(`p`,{class:`gallery-desc`},`These crops were generated previously but are no longer attached to any nodes. You can safely delete them to save storage space.`,-1),S(`div`,Ve,[(s(!0),c(p,null,t($.value,e=>(s(),d(D,{key:e.id},{title:a(()=>[i[16]||=S(`span`,{class:`node-title`},`Orphaned Crop`,-1),n(O,{variant:`type`},{default:a(()=>[l(r(Z(e.sizeBytes)),1)]),_:2},1024)]),meta:a(()=>[S(`div`,He,[S(`span`,Ue,`Generated: `+r(new Date(e.createdAt).toLocaleDateString()),1),X.value?(s(),c(`div`,We,[S(`div`,Ge,[n(C,{url:e.url,alt:e.filename,width:200,quality:75,class:`crop-img-fixed-height`},null,8,[`url`,`alt`]),S(`span`,Ke,r(rt(e.filename)),1)])])):x(``,!0)])]),actions:a(()=>[S(`button`,{class:`action-btn outline text-danger`,style:{border:`none`},onClick:t=>J(e.id)},[n(y(T),{size:13}),i[17]||=l(` Purge `,-1)],8,qe)]),_:2},1024))),128))])])):x(``,!0)])])):x(``,!0)])]))}}),[[`__scopeId`,`data-v-cd1f3a28`]]);export{z as default};
|