@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.
Files changed (65) hide show
  1. package/content/definitions/blocks/image-gallery.yaml +34 -0
  2. package/content/definitions/blocks/youtube.yaml +8 -0
  3. package/content/definitions/field-sets/access.yaml +10 -0
  4. package/content/definitions/field-sets/page-base.yaml +16 -1
  5. package/content/definitions/taxonomies/media-tag.yaml +15 -0
  6. package/definitions/editor/default.ts +15 -1
  7. package/dist/assets/AssetEditor-B4W7tV1a.js +1 -0
  8. package/dist/assets/AssetEditor-D9sz6bfN.css +1 -0
  9. package/dist/assets/CmsFieldTaxonomy-CVlKL-l2.css +1 -0
  10. package/dist/assets/CmsFieldTaxonomy-C_AwHDwY.js +1 -0
  11. package/dist/assets/{CmsHelp-DyPJLGGi.js → CmsHelp-BQkr9KyU.js} +1 -1
  12. package/dist/assets/{CmsPublisher-DNLwjirk.js → CmsPublisher-XSCPrp5L.js} +1 -1
  13. package/dist/assets/NodeEditor-4TsNvk2f.css +1 -0
  14. package/dist/assets/NodeEditor-DA5GRtRP.js +161 -0
  15. package/dist/assets/{TrashWorkspace-DgIg1v6t.js → TrashWorkspace-CATe46WF.js} +1 -1
  16. package/dist/assets/index-CY0VYSyt.css +1 -0
  17. package/dist/assets/index-DdG9Pozx.js +14 -0
  18. package/dist/assets/{plus-FQRsZBoJ.js → plus-CX_GHzXs.js} +1 -1
  19. package/dist/assets/useNodes-CqFlc72m.js +1 -0
  20. package/dist/{dist-D_Q1y4Kh.js → dist-3Xc2TTZw.js} +1117 -456
  21. package/dist/index.html +4 -4
  22. package/dist/index.js +1117 -456
  23. package/dist/schema-compiler.js +1 -1
  24. package/package.json +5 -5
  25. package/schema.sql +10 -0
  26. package/templates/astro-starter/src/components/global/NavigationMenu.astro +11 -3
  27. package/dist/assets/AssetEditor-D5j7pwcK.css +0 -1
  28. package/dist/assets/AssetEditor-Dt1zCR7_.js +0 -1
  29. package/dist/assets/NodeEditor-CiXQKXK1.js +0 -147
  30. package/dist/assets/NodeEditor-pZI3gu4a.css +0 -1
  31. package/dist/assets/index-DQ6_RmCI.js +0 -14
  32. package/dist/assets/index-DcKiaRjI.css +0 -1
  33. package/dist/assets/useNodes-D2-VxsxR.js +0 -1
  34. package/templates/astro-starter/old_src/components/blocks/BlockRenderer.astro +0 -143
  35. package/templates/astro-starter/old_src/components/blocks/ColumnLayout.astro +0 -67
  36. package/templates/astro-starter/old_src/components/blocks/HeaderImage.astro +0 -126
  37. package/templates/astro-starter/old_src/components/blocks/Hero.astro +0 -218
  38. package/templates/astro-starter/old_src/components/blocks/HtmlBlock.astro +0 -25
  39. package/templates/astro-starter/old_src/components/blocks/ImageBlock.astro +0 -91
  40. package/templates/astro-starter/old_src/components/blocks/NodeList.astro +0 -274
  41. package/templates/astro-starter/old_src/components/blocks/TextBlock.astro +0 -15
  42. package/templates/astro-starter/old_src/components/global/Breadcrumb.astro +0 -108
  43. package/templates/astro-starter/old_src/components/global/Footer.astro +0 -50
  44. package/templates/astro-starter/old_src/components/global/Header.astro +0 -171
  45. package/templates/astro-starter/old_src/components/global/MetaHead.astro +0 -266
  46. package/templates/astro-starter/old_src/components/global/NavigationMenu.astro +0 -413
  47. package/templates/astro-starter/old_src/components/ui/KamaImage.astro +0 -180
  48. package/templates/astro-starter/old_src/layouts/SkeletonLayout.astro +0 -56
  49. package/templates/astro-starter/old_src/layouts/StandardLayout.astro +0 -63
  50. package/templates/astro-starter/old_src/lib/cms.ts +0 -219
  51. package/templates/astro-starter/old_src/lib/media/kama-image-service.ts +0 -67
  52. package/templates/astro-starter/old_src/lib/media/media-proxy.ts +0 -148
  53. package/templates/astro-starter/old_src/lib/media/media-url.ts +0 -112
  54. package/templates/astro-starter/old_src/middleware.ts +0 -536
  55. package/templates/astro-starter/old_src/pages/404.astro +0 -46
  56. package/templates/astro-starter/old_src/pages/[...slug].astro +0 -311
  57. package/templates/astro-starter/old_src/pages/api/load-nodes.ts +0 -68
  58. package/templates/astro-starter/old_src/pages/api/partials/node-cards.astro +0 -101
  59. package/templates/astro-starter/old_src/pages/llms-full.txt.ts +0 -171
  60. package/templates/astro-starter/old_src/pages/llms.txt.ts +0 -113
  61. package/templates/astro-starter/old_src/pages/media/[...path].ts +0 -14
  62. package/templates/astro-starter/old_src/pages/partials/footer.astro +0 -69
  63. package/templates/astro-starter/old_src/pages/partials/nav.astro +0 -141
  64. package/templates/astro-starter/old_src/styles/standard-theme.css +0 -157
  65. package/templates/astro-starter/old_src/utils/tiptap.ts +0 -113
@@ -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-D_Q1y4Kh.js")).compileDefinitions;
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.20",
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.0",
49
- "@tiptap/extension-table-cell": "^3.30.0",
50
- "@tiptap/extension-table-header": "^3.30.0",
51
- "@tiptap/extension-table-row": "^3.30.0",
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
- const topLevelNavItems =
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
- const hasChildren = item.children && item.children.length > 0;
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
- {item.children?.map(child => (
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};