@happyvertical/smrt-assets 0.30.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/AGENTS.md +78 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/README.md +136 -0
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/asset-association.d.ts +16 -0
- package/dist/asset-association.d.ts.map +1 -0
- package/dist/asset-associations.d.ts +27 -0
- package/dist/asset-associations.d.ts.map +1 -0
- package/dist/asset-capabilities.d.ts +137 -0
- package/dist/asset-capabilities.d.ts.map +1 -0
- package/dist/asset-conventions.d.ts +76 -0
- package/dist/asset-conventions.d.ts.map +1 -0
- package/dist/asset-metafield.d.ts +27 -0
- package/dist/asset-metafield.d.ts.map +1 -0
- package/dist/asset-metafields.d.ts +27 -0
- package/dist/asset-metafields.d.ts.map +1 -0
- package/dist/asset-runtime.d.ts +218 -0
- package/dist/asset-runtime.d.ts.map +1 -0
- package/dist/asset-serving.d.ts +146 -0
- package/dist/asset-serving.d.ts.map +1 -0
- package/dist/asset-status.d.ts +15 -0
- package/dist/asset-status.d.ts.map +1 -0
- package/dist/asset-statuses.d.ts +25 -0
- package/dist/asset-statuses.d.ts.map +1 -0
- package/dist/asset-store.d.ts +200 -0
- package/dist/asset-store.d.ts.map +1 -0
- package/dist/asset-type.d.ts +15 -0
- package/dist/asset-type.d.ts.map +1 -0
- package/dist/asset-types.d.ts +28 -0
- package/dist/asset-types.d.ts.map +1 -0
- package/dist/asset.d.ts +158 -0
- package/dist/asset.d.ts.map +1 -0
- package/dist/assets.d.ts +125 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/folder.d.ts +16 -0
- package/dist/folder.d.ts.map +1 -0
- package/dist/folders.d.ts +45 -0
- package/dist/folders.d.ts.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2285 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.json +4079 -0
- package/dist/media-bundle-persistence.d.ts +99 -0
- package/dist/media-bundle-persistence.d.ts.map +1 -0
- package/dist/owned-asset-helpers.d.ts +20 -0
- package/dist/owned-asset-helpers.d.ts.map +1 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +127 -0
- package/dist/playground.js.map +1 -0
- package/dist/smrt-knowledge.json +1922 -0
- package/dist/svelte/ActionBar.svelte +203 -0
- package/dist/svelte/ActionBar.svelte.d.ts +5 -0
- package/dist/svelte/ActionBar.svelte.d.ts.map +1 -0
- package/dist/svelte/AssetDetail.svelte +521 -0
- package/dist/svelte/AssetDetail.svelte.d.ts +35 -0
- package/dist/svelte/AssetDetail.svelte.d.ts.map +1 -0
- package/dist/svelte/AssetGrid.svelte +351 -0
- package/dist/svelte/AssetGrid.svelte.d.ts +5 -0
- package/dist/svelte/AssetGrid.svelte.d.ts.map +1 -0
- package/dist/svelte/AssetList.svelte +436 -0
- package/dist/svelte/AssetList.svelte.d.ts +5 -0
- package/dist/svelte/AssetList.svelte.d.ts.map +1 -0
- package/dist/svelte/AssetManager.svelte +381 -0
- package/dist/svelte/AssetManager.svelte.d.ts +5 -0
- package/dist/svelte/AssetManager.svelte.d.ts.map +1 -0
- package/dist/svelte/AssetToolbar.svelte +388 -0
- package/dist/svelte/AssetToolbar.svelte.d.ts +5 -0
- package/dist/svelte/AssetToolbar.svelte.d.ts.map +1 -0
- package/dist/svelte/CreateAssetModal.svelte +373 -0
- package/dist/svelte/CreateAssetModal.svelte.d.ts +19 -0
- package/dist/svelte/CreateAssetModal.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/ActionBar.test.js +72 -0
- package/dist/svelte/__tests__/AssetDetail.test.js +57 -0
- package/dist/svelte/__tests__/AssetGrid.test.js +69 -0
- package/dist/svelte/__tests__/AssetList.test.js +72 -0
- package/dist/svelte/__tests__/AssetManager.test.js +21 -0
- package/dist/svelte/__tests__/AssetManagerRoute.test.js +16 -0
- package/dist/svelte/__tests__/AssetToolbar.test.js +39 -0
- package/dist/svelte/__tests__/CreateAssetModal.test.js +42 -0
- package/dist/svelte/i18n.d.ts +76 -0
- package/dist/svelte/i18n.d.ts.map +1 -0
- package/dist/svelte/i18n.js +87 -0
- package/dist/svelte/index.d.ts +19 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +30 -0
- package/dist/svelte/playground/AssetDetailPreview.svelte +131 -0
- package/dist/svelte/playground/AssetDetailPreview.svelte.d.ts +8 -0
- package/dist/svelte/playground/AssetDetailPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/CreateAssetModalPreview.svelte +151 -0
- package/dist/svelte/playground/CreateAssetModalPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/CreateAssetModalPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground.d.ts +60 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +93 -0
- package/dist/svelte/routes/AssetManagerRoute.svelte +209 -0
- package/dist/svelte/routes/AssetManagerRoute.svelte.d.ts +4 -0
- package/dist/svelte/routes/AssetManagerRoute.svelte.d.ts.map +1 -0
- package/dist/svelte/routes/index.d.ts +2 -0
- package/dist/svelte/routes/index.d.ts.map +1 -0
- package/dist/svelte/routes/index.js +1 -0
- package/dist/svelte/routes/shared.d.ts +25 -0
- package/dist/svelte/routes/shared.d.ts.map +1 -0
- package/dist/svelte/routes/shared.js +31 -0
- package/dist/svelte/types.d.ts +179 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +6 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui.d.ts +10 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +85 -0
- package/dist/ui.js.map +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
packageName: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
description: string;
|
|
5
|
+
entries: ({
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
loadComponent: () => Promise<typeof import("./routes/AssetManagerRoute.svelte")>;
|
|
10
|
+
order: number;
|
|
11
|
+
tags: string[];
|
|
12
|
+
modes: {
|
|
13
|
+
mock: {
|
|
14
|
+
label: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
props?: undefined;
|
|
18
|
+
} | {
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
description: string;
|
|
22
|
+
loadComponent: () => Promise<typeof import("./AssetGrid.svelte")>;
|
|
23
|
+
order: number;
|
|
24
|
+
tags: string[];
|
|
25
|
+
props: {
|
|
26
|
+
assets: ({
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
sourceUri: string;
|
|
31
|
+
mimeType: string;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
updatedAt: string;
|
|
34
|
+
statusSlug: string;
|
|
35
|
+
alt: string;
|
|
36
|
+
} | {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
description: string;
|
|
40
|
+
sourceUri: string;
|
|
41
|
+
mimeType: string;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
updatedAt: string;
|
|
44
|
+
statusSlug: string;
|
|
45
|
+
alt?: undefined;
|
|
46
|
+
})[];
|
|
47
|
+
selectedIds: Set<string>;
|
|
48
|
+
loading: boolean;
|
|
49
|
+
onSelectionChange: () => undefined;
|
|
50
|
+
onAssetClick: () => undefined;
|
|
51
|
+
};
|
|
52
|
+
modes: {
|
|
53
|
+
mock: {
|
|
54
|
+
label: string;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
})[];
|
|
58
|
+
};
|
|
59
|
+
export default _default;
|
|
60
|
+
//# sourceMappingURL=playground.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../../src/svelte/playground.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DA,wBAyCE"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { ASSETS_ROUTE_META } from './routes/shared.js';
|
|
2
|
+
function createPreviewAssetUri(label, accent) {
|
|
3
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 800">
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bg" x1="0%" x2="100%" y1="0%" y2="100%">
|
|
6
|
+
<stop offset="0%" stop-color="${accent}" />
|
|
7
|
+
<stop offset="100%" stop-color="#0f172a" />
|
|
8
|
+
</linearGradient>
|
|
9
|
+
</defs>
|
|
10
|
+
<rect width="1200" height="800" fill="url(#bg)" rx="48" />
|
|
11
|
+
<circle cx="260" cy="220" r="110" fill="rgba(255,255,255,0.16)" />
|
|
12
|
+
<path d="M120 620L430 330l210 190 150-120 290 220H120z" fill="rgba(255,255,255,0.22)" />
|
|
13
|
+
<text x="96" y="126" fill="#e2e8f0" font-size="64" font-family="Arial, sans-serif" font-weight="700">${label}</text>
|
|
14
|
+
<text x="96" y="690" fill="#cbd5e1" font-size="34" font-family="Arial, sans-serif">SMRT Assets preview</text>
|
|
15
|
+
</svg>`;
|
|
16
|
+
return `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg)}`;
|
|
17
|
+
}
|
|
18
|
+
const sampleAssets = [
|
|
19
|
+
{
|
|
20
|
+
id: 'asset-harbor-map',
|
|
21
|
+
name: 'Harbor Map',
|
|
22
|
+
description: 'Annotated port operations map for logistics planning.',
|
|
23
|
+
sourceUri: createPreviewAssetUri('Harbor Map', '#0891b2'),
|
|
24
|
+
mimeType: 'image/png',
|
|
25
|
+
createdAt: '2026-03-11T09:15:00.000Z',
|
|
26
|
+
updatedAt: '2026-03-18T15:44:00.000Z',
|
|
27
|
+
statusSlug: 'active',
|
|
28
|
+
alt: 'Stylized harbor map with highlighted shipping lanes.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'asset-spring-lookbook',
|
|
32
|
+
name: 'Spring Lookbook',
|
|
33
|
+
description: 'Photography sheet prepared for the seasonal launch.',
|
|
34
|
+
sourceUri: createPreviewAssetUri('Lookbook', '#7c3aed'),
|
|
35
|
+
mimeType: 'image/jpeg',
|
|
36
|
+
createdAt: '2026-03-07T13:22:00.000Z',
|
|
37
|
+
updatedAt: '2026-03-19T08:05:00.000Z',
|
|
38
|
+
statusSlug: 'draft',
|
|
39
|
+
alt: '',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'asset-style-guide',
|
|
43
|
+
name: 'Brand Style Guide',
|
|
44
|
+
description: 'Reference PDF for typography, voice, and image treatment.',
|
|
45
|
+
sourceUri: '',
|
|
46
|
+
mimeType: 'application/pdf',
|
|
47
|
+
createdAt: '2026-03-01T18:00:00.000Z',
|
|
48
|
+
updatedAt: '2026-03-10T18:45:00.000Z',
|
|
49
|
+
statusSlug: 'published',
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
const loadAssetGrid = () => import('./AssetGrid.svelte');
|
|
53
|
+
const loadAssetManagerRoute = () => import('./routes/AssetManagerRoute.svelte');
|
|
54
|
+
export default {
|
|
55
|
+
packageName: '@happyvertical/smrt-assets',
|
|
56
|
+
displayName: 'Assets',
|
|
57
|
+
description: ASSETS_ROUTE_META.manager.description,
|
|
58
|
+
entries: [
|
|
59
|
+
{
|
|
60
|
+
id: 'asset-manager-route',
|
|
61
|
+
title: 'Asset Manager Route',
|
|
62
|
+
description: 'Package-owned route surface for browsing, selecting, and reviewing assets.',
|
|
63
|
+
loadComponent: loadAssetManagerRoute,
|
|
64
|
+
order: 1,
|
|
65
|
+
tags: ['route', 'assets', 'admin'],
|
|
66
|
+
modes: {
|
|
67
|
+
mock: {
|
|
68
|
+
label: 'Mock',
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'asset-grid',
|
|
74
|
+
title: 'Asset Grid',
|
|
75
|
+
description: 'Thumbnail grid preview showing selection state and missing-alt warnings.',
|
|
76
|
+
loadComponent: loadAssetGrid,
|
|
77
|
+
order: 2,
|
|
78
|
+
tags: ['grid', 'assets', 'media'],
|
|
79
|
+
props: {
|
|
80
|
+
assets: sampleAssets,
|
|
81
|
+
selectedIds: new Set(['asset-spring-lookbook']),
|
|
82
|
+
loading: false,
|
|
83
|
+
onSelectionChange: () => undefined,
|
|
84
|
+
onAssetClick: () => undefined,
|
|
85
|
+
},
|
|
86
|
+
modes: {
|
|
87
|
+
mock: {
|
|
88
|
+
label: 'Mock',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { useI18n } from '@happyvertical/smrt-ui/i18n';
|
|
3
|
+
import { M } from '../i18n.js';
|
|
4
|
+
import { AssetManager } from '../index.js';
|
|
5
|
+
import type { PersistedAsset } from '../types.js';
|
|
6
|
+
|
|
7
|
+
const { t } = useI18n();
|
|
8
|
+
|
|
9
|
+
let selectedAssets = $state<PersistedAsset[]>([]);
|
|
10
|
+
let lastActionMessage = $state<string | null>(null);
|
|
11
|
+
|
|
12
|
+
function handleSelect(assets: PersistedAsset[]) {
|
|
13
|
+
selectedAssets = assets;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function queueReview(assets: PersistedAsset[]) {
|
|
17
|
+
if (assets.length === 0) {
|
|
18
|
+
lastActionMessage = 'Select one or more assets to queue them for review.';
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
lastActionMessage = `Queued ${assets.length} asset${
|
|
23
|
+
assets.length === 1 ? '' : 's'
|
|
24
|
+
} for follow-up review.`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const customActions = [
|
|
28
|
+
{
|
|
29
|
+
label: 'Queue Review',
|
|
30
|
+
action: queueReview,
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<div class="assets-route">
|
|
36
|
+
<header class="assets-route__header">
|
|
37
|
+
<div>
|
|
38
|
+
<p class="assets-route__eyebrow">{t(M['assets.asset_manager_route.eyebrow'])}</p>
|
|
39
|
+
<h1>{t(M['assets.asset_manager_route.title'])}</h1>
|
|
40
|
+
<p class="assets-route__lede">{t(M['assets.asset_manager_route.lede'])}</p>
|
|
41
|
+
</div>
|
|
42
|
+
</header>
|
|
43
|
+
|
|
44
|
+
<div class="assets-route__body">
|
|
45
|
+
<section class="assets-route__manager" aria-label={t(M['assets.asset_manager_route.surface_label'])}>
|
|
46
|
+
<AssetManager
|
|
47
|
+
mode="manage"
|
|
48
|
+
accept="image/*"
|
|
49
|
+
onSelect={handleSelect}
|
|
50
|
+
{customActions}
|
|
51
|
+
/>
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<aside class="assets-route__sidebar" aria-label={t(M['assets.asset_manager_route.route_state_label'])}>
|
|
55
|
+
<div class="assets-route__panel">
|
|
56
|
+
<h2>{t(M['assets.asset_manager_route.selection_state'])}</h2>
|
|
57
|
+
{#if selectedAssets.length === 0}
|
|
58
|
+
<p class="assets-route__empty">{t(M['assets.asset_manager_route.no_assets_selected'])}</p>
|
|
59
|
+
{:else}
|
|
60
|
+
<p>
|
|
61
|
+
<strong>{selectedAssets.length}</strong> {t(
|
|
62
|
+
M['assets.asset_manager_route.assets_selected'],
|
|
63
|
+
{ plural: selectedAssets.length === 1 ? '' : 's' },
|
|
64
|
+
)}
|
|
65
|
+
</p>
|
|
66
|
+
<ul class="assets-route__selection-list">
|
|
67
|
+
{#each selectedAssets as asset}
|
|
68
|
+
<li>
|
|
69
|
+
<code>{asset.id || 'new-asset'}</code>
|
|
70
|
+
<span>{asset.name || 'Untitled'}</span>
|
|
71
|
+
</li>
|
|
72
|
+
{/each}
|
|
73
|
+
</ul>
|
|
74
|
+
{/if}
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div class="assets-route__panel">
|
|
78
|
+
<h2>{t(M['assets.asset_manager_route.custom_action_example'])}</h2>
|
|
79
|
+
<p>{t(M['assets.asset_manager_route.custom_action_description'])}</p>
|
|
80
|
+
{#if lastActionMessage}
|
|
81
|
+
<p class="assets-route__message">{lastActionMessage}</p>
|
|
82
|
+
{:else}
|
|
83
|
+
<p class="assets-route__empty">
|
|
84
|
+
Trigger <em>{t(M['assets.asset_manager_route.queue_review'])}</em> {t(M['assets.asset_manager_route.queue_review_hint'])}
|
|
85
|
+
</p>
|
|
86
|
+
{/if}
|
|
87
|
+
</div>
|
|
88
|
+
</aside>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<style>
|
|
93
|
+
.assets-route {
|
|
94
|
+
max-width: 1440px;
|
|
95
|
+
margin: 0 auto;
|
|
96
|
+
padding: 2rem;
|
|
97
|
+
display: flex;
|
|
98
|
+
flex-direction: column;
|
|
99
|
+
gap: 1.5rem;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.assets-route__header {
|
|
103
|
+
display: flex;
|
|
104
|
+
justify-content: space-between;
|
|
105
|
+
gap: 1rem;
|
|
106
|
+
align-items: end;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.assets-route__eyebrow {
|
|
110
|
+
margin: 0 0 0.5rem;
|
|
111
|
+
color: var(--smrt-color-primary, #0f766e);
|
|
112
|
+
font-size: var(--smrt-typography-label-medium-size, 0.75rem);
|
|
113
|
+
font-weight: var(--smrt-typography-weight-bold, 700);
|
|
114
|
+
letter-spacing: var(--smrt-typography-label-medium-tracking, 0.08em);
|
|
115
|
+
text-transform: uppercase;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.assets-route__header h1 {
|
|
119
|
+
margin: 0;
|
|
120
|
+
font-size: clamp(2rem, 3vw, 2.75rem);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.assets-route__lede {
|
|
124
|
+
max-width: 56rem;
|
|
125
|
+
margin: 0.75rem 0 0;
|
|
126
|
+
color: var(--smrt-color-on-surface-variant, #475569);
|
|
127
|
+
line-height: 1.6;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.assets-route__body {
|
|
131
|
+
display: grid;
|
|
132
|
+
grid-template-columns: minmax(0, 1fr) 320px;
|
|
133
|
+
gap: 1.5rem;
|
|
134
|
+
align-items: start;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.assets-route__manager {
|
|
138
|
+
min-height: 760px;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.assets-route__sidebar {
|
|
142
|
+
display: flex;
|
|
143
|
+
flex-direction: column;
|
|
144
|
+
gap: 1rem;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.assets-route__panel {
|
|
148
|
+
background: var(--smrt-color-surface, #fff);
|
|
149
|
+
border: 1px solid var(--smrt-color-outline-variant, #dbe3ef);
|
|
150
|
+
border-radius: 1rem;
|
|
151
|
+
padding: 1.25rem;
|
|
152
|
+
box-shadow: var(--smrt-elevation-5, 0 10px 30px color-mix(in srgb, var(--smrt-color-shadow) 6%, transparent));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.assets-route__panel h2 {
|
|
156
|
+
margin: 0 0 0.75rem;
|
|
157
|
+
font-size: var(--smrt-typography-title-medium-size, 1rem);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.assets-route__empty {
|
|
161
|
+
margin: 0;
|
|
162
|
+
color: var(--smrt-color-on-surface-variant, #64748b);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.assets-route__message {
|
|
166
|
+
margin: 0.75rem 0 0;
|
|
167
|
+
padding: 0.75rem 0.875rem;
|
|
168
|
+
border-radius: 0.75rem;
|
|
169
|
+
background: var(--smrt-color-primary-container, #ecfeff);
|
|
170
|
+
color: var(--smrt-color-on-primary-container, #155e75);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.assets-route__selection-list {
|
|
174
|
+
list-style: none;
|
|
175
|
+
padding: 0;
|
|
176
|
+
margin: 1rem 0 0;
|
|
177
|
+
display: flex;
|
|
178
|
+
flex-direction: column;
|
|
179
|
+
gap: 0.5rem;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.assets-route__selection-list li {
|
|
183
|
+
display: grid;
|
|
184
|
+
gap: 0.25rem;
|
|
185
|
+
padding: 0.625rem 0.75rem;
|
|
186
|
+
border-radius: 0.75rem;
|
|
187
|
+
background: var(--smrt-color-surface-container, #f8fafc);
|
|
188
|
+
border: 1px solid var(--smrt-color-outline-variant, #e2e8f0);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.assets-route__selection-list code {
|
|
192
|
+
font-size: var(--smrt-typography-body-small-size, 0.75rem);
|
|
193
|
+
color: var(--smrt-color-on-primary-container, #155e75);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@media (max-width: 960px) {
|
|
197
|
+
.assets-route {
|
|
198
|
+
padding: 1.25rem;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.assets-route__body {
|
|
202
|
+
grid-template-columns: 1fr;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.assets-route__manager {
|
|
206
|
+
min-height: 640px;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetManagerRoute.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/routes/AssetManagerRoute.svelte.ts"],"names":[],"mappings":"AAkGA,QAAA,MAAM,iBAAiB,2DAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/svelte/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as AssetManagerRoute } from './AssetManagerRoute.svelte';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SmrtRouteNavigationItem } from '@happyvertical/smrt-types';
|
|
2
|
+
export declare const ASSETS_ROUTE_IDS: {
|
|
3
|
+
readonly manager: "@happyvertical/smrt-assets:manager";
|
|
4
|
+
};
|
|
5
|
+
export type AssetsRouteId = (typeof ASSETS_ROUTE_IDS)[keyof typeof ASSETS_ROUTE_IDS];
|
|
6
|
+
export type AssetsRouteNavigationItem = SmrtRouteNavigationItem;
|
|
7
|
+
export declare const ASSETS_ROUTE_META: {
|
|
8
|
+
readonly manager: {
|
|
9
|
+
id: "@happyvertical/smrt-assets:manager";
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
defaultPath: string;
|
|
13
|
+
loadKind: undefined;
|
|
14
|
+
nav: {
|
|
15
|
+
label: string;
|
|
16
|
+
description: string;
|
|
17
|
+
icon: string;
|
|
18
|
+
order: number;
|
|
19
|
+
group: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export declare function createAssetsRouteNavigation(mounts?: Partial<Record<AssetsRouteId, string>>): AssetsRouteNavigationItem[];
|
|
24
|
+
export declare const ASSETS_DEFAULT_ROUTE_NAVIGATION: SmrtRouteNavigationItem[];
|
|
25
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/svelte/routes/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,gBAAgB;;CAEnB,CAAC;AAEX,MAAM,MAAM,aAAa,GACvB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEhE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;CAgBpB,CAAC;AAEX,wBAAgB,2BAA2B,CACzC,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAM,GAClD,yBAAyB,EAAE,CAU7B;AAED,eAAO,MAAM,+BAA+B,2BAAgC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const ASSETS_ROUTE_IDS = {
|
|
2
|
+
manager: '@happyvertical/smrt-assets:manager',
|
|
3
|
+
};
|
|
4
|
+
export const ASSETS_ROUTE_META = {
|
|
5
|
+
manager: {
|
|
6
|
+
id: ASSETS_ROUTE_IDS.manager,
|
|
7
|
+
title: 'Asset Manager',
|
|
8
|
+
description: 'Manage uploads, browse the asset library, and review selection state from the package-owned asset management route.',
|
|
9
|
+
defaultPath: '/assets',
|
|
10
|
+
loadKind: undefined,
|
|
11
|
+
nav: {
|
|
12
|
+
label: 'Assets',
|
|
13
|
+
description: 'Manage uploaded media and reusable files.',
|
|
14
|
+
icon: 'folder-image',
|
|
15
|
+
order: 10,
|
|
16
|
+
group: 'content',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export function createAssetsRouteNavigation(mounts = {}) {
|
|
21
|
+
return [ASSETS_ROUTE_META.manager].map((route) => ({
|
|
22
|
+
routeId: route.id,
|
|
23
|
+
href: mounts[route.id] ?? route.defaultPath,
|
|
24
|
+
label: route.nav?.label ?? route.title,
|
|
25
|
+
description: route.nav?.description ?? route.description,
|
|
26
|
+
icon: route.nav?.icon,
|
|
27
|
+
order: route.nav?.order,
|
|
28
|
+
group: route.nav?.group,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
export const ASSETS_DEFAULT_ROUTE_NAVIGATION = createAssetsRouteNavigation();
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset Manager Svelte component types
|
|
3
|
+
*
|
|
4
|
+
* Shared type definitions for the Asset Manager UI components.
|
|
5
|
+
*/
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
import type { Asset } from '../asset';
|
|
8
|
+
/** View modes for the asset manager */
|
|
9
|
+
export type AssetViewMode = 'grid' | 'list';
|
|
10
|
+
/** Asset with a guaranteed ID (persisted in DB) */
|
|
11
|
+
export interface PersistedAsset extends Asset {
|
|
12
|
+
id: string;
|
|
13
|
+
}
|
|
14
|
+
/** Operating mode — manage (full CRUD) or pick (select and return) */
|
|
15
|
+
export type AssetManagerMode = 'manage' | 'pick';
|
|
16
|
+
/** Sort options */
|
|
17
|
+
export type AssetSortField = 'name' | 'createdAt' | 'updatedAt' | 'mimeType';
|
|
18
|
+
export type AssetSortDirection = 'asc' | 'desc';
|
|
19
|
+
export interface AssetSort {
|
|
20
|
+
field: AssetSortField;
|
|
21
|
+
direction: AssetSortDirection;
|
|
22
|
+
}
|
|
23
|
+
/** Filter state */
|
|
24
|
+
export interface AssetFilters {
|
|
25
|
+
/** Search query (matched against name, description, alt text) */
|
|
26
|
+
search: string;
|
|
27
|
+
/** Filter by asset type slugs (e.g., 'image', 'video', 'document') */
|
|
28
|
+
types: string[];
|
|
29
|
+
/** Filter by tag slugs */
|
|
30
|
+
tags: string[];
|
|
31
|
+
/** Filter by MIME type patterns (e.g., 'image/*') */
|
|
32
|
+
mimePatterns: string[];
|
|
33
|
+
}
|
|
34
|
+
/** Custom action that consumers can add to the toolbar */
|
|
35
|
+
export interface AssetAction {
|
|
36
|
+
/** Display label */
|
|
37
|
+
label: string;
|
|
38
|
+
/** Optional icon snippet */
|
|
39
|
+
icon?: Snippet;
|
|
40
|
+
/** Whether this action is destructive (shown in red) */
|
|
41
|
+
destructive?: boolean;
|
|
42
|
+
/** Whether this action supports multiple selected assets */
|
|
43
|
+
multi?: boolean;
|
|
44
|
+
/** Callback when the action is triggered */
|
|
45
|
+
action: (selected: PersistedAsset[]) => void | Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Arbitrary database-level filters passed to AssetCollection queries.
|
|
49
|
+
* Any key/value pairs here are forwarded as WHERE conditions.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* // Show only active images in the 'products' domain
|
|
54
|
+
* dbFilters={{ domain: 'products', statusSlug: 'active', typeSlug: 'image' }}
|
|
55
|
+
*
|
|
56
|
+
* // Show assets owned by a specific profile
|
|
57
|
+
* dbFilters={{ ownerProfileId: profile.id }}
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export type AssetDbFilters = Record<string, unknown>;
|
|
61
|
+
export interface AssetManagerUploaderProps {
|
|
62
|
+
/** Whether the uploader modal should be open */
|
|
63
|
+
open: boolean;
|
|
64
|
+
/** Pre-loaded file from a drag-and-drop or paste event on the manager */
|
|
65
|
+
initialFile: File | null;
|
|
66
|
+
/** Callback to close the uploader */
|
|
67
|
+
onClose: () => void;
|
|
68
|
+
/** @deprecated Use onClose */
|
|
69
|
+
onclose?: () => void;
|
|
70
|
+
/** Callback when asset creation/selection is complete */
|
|
71
|
+
onCreate: (data: any) => void;
|
|
72
|
+
/** @deprecated Use onCreate */
|
|
73
|
+
oncreate?: (data: any) => void;
|
|
74
|
+
}
|
|
75
|
+
/** Props for the main AssetManager component */
|
|
76
|
+
export interface AssetManagerProps {
|
|
77
|
+
/** Tenant ID to scope assets to */
|
|
78
|
+
tenantId?: string;
|
|
79
|
+
/** Arbitrary database-level query filters forwarded to AssetCollection */
|
|
80
|
+
dbFilters?: AssetDbFilters;
|
|
81
|
+
/** Operating mode */
|
|
82
|
+
mode?: AssetManagerMode;
|
|
83
|
+
/** MIME type filter (e.g., 'image/*' to only show images) */
|
|
84
|
+
accept?: string;
|
|
85
|
+
/** Custom actions added to the action bar */
|
|
86
|
+
customActions?: AssetAction[];
|
|
87
|
+
/** Optional custom uploader snippet (e.g., to inject ImageUploader from smrt-images) */
|
|
88
|
+
uploader?: Snippet<[AssetManagerUploaderProps]>;
|
|
89
|
+
/** Callback when assets are selected (useful in pick mode) */
|
|
90
|
+
onSelect?: (assets: PersistedAsset[]) => void;
|
|
91
|
+
/** @deprecated Use onSelect */
|
|
92
|
+
onselect?: (assets: PersistedAsset[]) => void;
|
|
93
|
+
/** Callback when an asset is double-clicked or "confirmed" in pick mode */
|
|
94
|
+
onConfirm?: (assets: PersistedAsset[]) => void;
|
|
95
|
+
/** @deprecated Use onConfirm */
|
|
96
|
+
onconfirm?: (assets: PersistedAsset[]) => void;
|
|
97
|
+
/** Initial view mode */
|
|
98
|
+
initialView?: AssetViewMode;
|
|
99
|
+
/** Whether to show folder navigation */
|
|
100
|
+
showFolders?: boolean;
|
|
101
|
+
}
|
|
102
|
+
/** Props for AssetToolbar */
|
|
103
|
+
export interface AssetToolbarProps {
|
|
104
|
+
/** Current view mode */
|
|
105
|
+
view: AssetViewMode;
|
|
106
|
+
/** Current filters */
|
|
107
|
+
filters: AssetFilters;
|
|
108
|
+
/** Current sort */
|
|
109
|
+
sort: AssetSort;
|
|
110
|
+
/** Callback when view changes */
|
|
111
|
+
onViewChange: (view: AssetViewMode) => void;
|
|
112
|
+
/** @deprecated Use onViewChange */
|
|
113
|
+
onviewchange?: (view: AssetViewMode) => void;
|
|
114
|
+
/** Callback when filters change */
|
|
115
|
+
onFilterChange: (filters: AssetFilters) => void;
|
|
116
|
+
/** @deprecated Use onFilterChange */
|
|
117
|
+
onfilterchange?: (filters: AssetFilters) => void;
|
|
118
|
+
/** Callback when sort changes */
|
|
119
|
+
onSortChange: (sort: AssetSort) => void;
|
|
120
|
+
/** @deprecated Use onSortChange */
|
|
121
|
+
onsortchange?: (sort: AssetSort) => void;
|
|
122
|
+
/** Callback when upload is requested */
|
|
123
|
+
onUpload: () => void;
|
|
124
|
+
/** @deprecated Use onUpload */
|
|
125
|
+
onupload?: () => void;
|
|
126
|
+
}
|
|
127
|
+
/** Props for AssetGrid */
|
|
128
|
+
export interface AssetGridProps {
|
|
129
|
+
/** Assets to display */
|
|
130
|
+
assets: PersistedAsset[];
|
|
131
|
+
/** Currently selected asset IDs */
|
|
132
|
+
selectedIds: Set<string>;
|
|
133
|
+
/** Callback when selection changes */
|
|
134
|
+
onSelectionChange: (ids: Set<string>) => void;
|
|
135
|
+
/** Callback when an asset is clicked for detail view */
|
|
136
|
+
onAssetClick: (asset: PersistedAsset) => void;
|
|
137
|
+
/** Callback when an asset is double-clicked */
|
|
138
|
+
onAssetDblClick?: (asset: PersistedAsset) => void;
|
|
139
|
+
/** Whether the grid is loading */
|
|
140
|
+
loading?: boolean;
|
|
141
|
+
/**
|
|
142
|
+
* Operating mode — drives the per-card action label ("Open" in manage mode,
|
|
143
|
+
* "Select" in pick mode, where a card click toggles selection).
|
|
144
|
+
*/
|
|
145
|
+
mode?: AssetManagerMode;
|
|
146
|
+
}
|
|
147
|
+
/** Props for AssetList */
|
|
148
|
+
export interface AssetListProps {
|
|
149
|
+
/** Assets to display */
|
|
150
|
+
assets: PersistedAsset[];
|
|
151
|
+
/** Currently selected asset IDs */
|
|
152
|
+
selectedIds: Set<string>;
|
|
153
|
+
/** Current sort state */
|
|
154
|
+
sort: AssetSort;
|
|
155
|
+
/** Callback when selection changes */
|
|
156
|
+
onSelectionChange: (ids: Set<string>) => void;
|
|
157
|
+
/** Callback when an asset is clicked for detail view */
|
|
158
|
+
onAssetClick: (asset: PersistedAsset) => void;
|
|
159
|
+
/** Callback when sort changes */
|
|
160
|
+
onSortChange: (sort: AssetSort) => void;
|
|
161
|
+
/** Whether the list is loading */
|
|
162
|
+
loading?: boolean;
|
|
163
|
+
}
|
|
164
|
+
/** Props for ActionBar */
|
|
165
|
+
export interface ActionBarProps {
|
|
166
|
+
/** Currently selected assets */
|
|
167
|
+
selectedAssets: PersistedAsset[];
|
|
168
|
+
/** Custom actions from the consumer */
|
|
169
|
+
customActions?: AssetAction[];
|
|
170
|
+
/** Callback to clear selection */
|
|
171
|
+
onClearSelection: () => void;
|
|
172
|
+
/** @deprecated Use onClearSelection */
|
|
173
|
+
onclearselection?: () => void;
|
|
174
|
+
/** Callback for delete action */
|
|
175
|
+
onDelete: (assets: PersistedAsset[]) => void | Promise<void>;
|
|
176
|
+
/** @deprecated Use onDelete */
|
|
177
|
+
ondelete?: (assets: PersistedAsset[]) => void | Promise<void>;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/svelte/types.ts"],"names":[],"mappings":"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"}
|