@happyvertical/smrt-assets 0.31.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "timestamp": 1782183785041,
3
+ "timestamp": 1782198536839,
4
4
  "packageName": "@happyvertical/smrt-assets",
5
- "packageVersion": "0.31.0",
5
+ "packageVersion": "0.32.0",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-assets:AssetAssociation": {
8
8
  "name": "assetassociation",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-06-23T03:03:05.455Z",
3
+ "generatedAt": "2026-06-23T07:08:57.464Z",
4
4
  "packageName": "@happyvertical/smrt-assets",
5
- "packageVersion": "0.31.0",
5
+ "packageVersion": "0.32.0",
6
6
  "sourceManifestPath": "dist/manifest.json",
7
7
  "agentDocPath": "AGENTS.md",
8
8
  "sourceHashes": {
9
- "manifest": "e1a85c577f5b71b44af3b22219835a17b90244c8e0b90b700535738dcc059af6",
10
- "packageJson": "a499c7a14389011bbcba99744d63dbd58ca4536f03d8fb60d389d1628b5ab2d5",
9
+ "manifest": "00c293c8aad4274512794a2066b0e2bb90bd98f9d6e1977344ac3e23b0894a42",
10
+ "packageJson": "2ad9bcf776067d397c159de6de141f29b16349e7e571671da72da93f9e23a703",
11
11
  "agents": "a034545874fb7767b31168d98aa2b1b8cac205b14f2f04fb5a8e5acf33690eef"
12
12
  },
13
13
  "exports": [
@@ -275,9 +275,7 @@ function formatDate(date: Date | string | undefined): string {
275
275
  </button>
276
276
  {/if}
277
277
  </div>
278
- {#if copyFeedback}
279
- <div class="copy-feedback">{copyFeedback}</div>
280
- {/if}
278
+ <div class="copy-feedback" role="status" aria-live="polite">{copyFeedback}</div>
281
279
  </section>
282
280
 
283
281
  <!-- Content References (injected) -->
@@ -499,6 +497,13 @@ function formatDate(date: Date | string | undefined): string {
499
497
  animation: fadeIn 150ms ease;
500
498
  }
501
499
 
500
+ /* The live region stays in the DOM (empty) so screen readers announce
501
+ copy results; collapse its spacing/animation when there's no message. */
502
+ .copy-feedback:empty {
503
+ margin-top: 0;
504
+ animation: none;
505
+ }
506
+
502
507
  @keyframes fadeIn {
503
508
  from { opacity: 0; }
504
509
  to { opacity: 1; }
@@ -1 +1 @@
1
- {"version":3,"file":"AssetDetail.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/AssetDetail.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,sCAAsC;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qDAAqD;IACrD,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,kBAAkB,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,kBAAkB,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,wCAAwC;IACxC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACzC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACpD;AAuQD,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"AssetDetail.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/AssetDetail.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,sCAAsC;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qDAAqD;IACrD,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,kBAAkB,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,kBAAkB,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,wCAAwC;IACxC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACzC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACpD;AAqQD,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -338,6 +338,12 @@ function getAltText(asset: PersistedAsset): string {
338
338
  to { transform: rotate(360deg); }
339
339
  }
340
340
 
341
+ @media (prefers-reduced-motion: reduce) {
342
+ .spinner {
343
+ animation: none;
344
+ }
345
+ }
346
+
341
347
  @media (max-width: 640px) {
342
348
  .grid {
343
349
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
@@ -429,8 +429,9 @@ function setIndeterminate(node: HTMLInputElement, value: boolean) {
429
429
  to { transform: rotate(360deg); }
430
430
  }
431
431
 
432
- .list-table__row:focus-visible {
433
- outline: 2px solid var(--smrt-color-primary, #005ac1);
434
- outline-offset: -2px;
432
+ @media (prefers-reduced-motion: reduce) {
433
+ .spinner {
434
+ animation: none;
435
+ }
435
436
  }
436
437
  </style>
@@ -50,6 +50,9 @@ let {
50
50
  onconfirm,
51
51
  initialView = 'grid',
52
52
  showFolders = false,
53
+ onSave,
54
+ onCreate,
55
+ onDelete,
53
56
  }: AssetManagerProps = $props();
54
57
 
55
58
  function getInitialManagerState() {
@@ -63,6 +66,7 @@ let view = $state<AssetViewMode>(initialManagerState.view);
63
66
  let selectedIds = $state<Set<string>>(new Set());
64
67
  let assets = $state<PersistedAsset[]>([]);
65
68
  let loading = $state(false);
69
+ let actionError = $state('');
66
70
  let showCreateModal = $state(false);
67
71
  let showDetail = $state(false);
68
72
  let detailAsset = $state<PersistedAsset | null>(null);
@@ -148,8 +152,14 @@ async function handleDetailSave(
148
152
  caption?: string;
149
153
  },
150
154
  ) {
151
- Object.assign(asset, updates);
152
- console.log('Save asset:', asset.id, updates);
155
+ try {
156
+ await onSave?.(asset, updates);
157
+ Object.assign(asset, updates);
158
+ actionError = '';
159
+ } catch (err) {
160
+ actionError =
161
+ err instanceof Error ? err.message : 'Failed to save the asset.';
162
+ }
153
163
  }
154
164
 
155
165
  function handleAssetDblClick(asset: PersistedAsset) {
@@ -168,25 +178,30 @@ function handleUpload() {
168
178
  showCreateModal = true;
169
179
  }
170
180
 
171
- function handleCreate(data: {
181
+ async function handleCreate(data: {
172
182
  file: File;
173
183
  name: string;
174
184
  description: string;
175
185
  altText: string;
176
186
  }) {
177
- console.log('Create asset:', data);
187
+ // Let a rejection propagate: CreateAssetModal awaits this and surfaces the
188
+ // error while keeping the form populated. Only close the modal on success.
189
+ await onCreate?.(data);
178
190
  showCreateModal = false;
179
191
  }
180
192
 
181
- function handleDelete(toDelete: PersistedAsset[]) {
182
- assets = assets.filter(
183
- (asset) => !toDelete.some((item) => item.id === asset.id),
184
- );
185
- console.log(
186
- 'Delete assets:',
187
- toDelete.map((asset) => asset.id),
188
- );
189
- selectedIds = new Set();
193
+ async function handleDelete(toDelete: PersistedAsset[]) {
194
+ try {
195
+ await onDelete?.(toDelete);
196
+ assets = assets.filter(
197
+ (asset) => !toDelete.some((item) => item.id === asset.id),
198
+ );
199
+ selectedIds = new Set();
200
+ actionError = '';
201
+ } catch (err) {
202
+ actionError =
203
+ err instanceof Error ? err.message : 'Failed to delete the asset(s).';
204
+ }
190
205
  }
191
206
 
192
207
  function handlePaste(event: ClipboardEvent) {
@@ -238,6 +253,11 @@ function handleManagerDrop(event: DragEvent) {
238
253
  ondragleave={handleManagerDragLeave}
239
254
  ondrop={handleManagerDrop}
240
255
  >
256
+ {#if actionError}
257
+ <p class="asset-manager__error" role="alert" aria-live="assertive">
258
+ {actionError}
259
+ </p>
260
+ {/if}
241
261
  <!-- Toolbar -->
242
262
  <AssetToolbar
243
263
  {view}
@@ -329,6 +349,15 @@ function handleManagerDrop(event: DragEvent) {
329
349
  </div>
330
350
 
331
351
  <style>
352
+ .asset-manager__error {
353
+ margin: 0 0 var(--smrt-spacing-2, 0.5rem);
354
+ padding: var(--smrt-spacing-2, 0.5rem) var(--smrt-spacing-3, 0.75rem);
355
+ border-radius: var(--smrt-radius-medium, 0.5rem);
356
+ background: var(--smrt-color-error-container, #fde8e6);
357
+ color: var(--smrt-color-on-error-container, #410002);
358
+ font-size: var(--smrt-typography-body-small-size, 0.8rem);
359
+ }
360
+
332
361
  .asset-manager {
333
362
  position: relative;
334
363
  display: flex;
@@ -1 +1 @@
1
- {"version":3,"file":"AssetManager.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/AssetManager.svelte.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAEV,iBAAiB,EAIlB,MAAM,SAAS,CAAC;AAyQjB,QAAA,MAAM,YAAY,uDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"AssetManager.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/AssetManager.svelte.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAEV,iBAAiB,EAIlB,MAAM,SAAS,CAAC;AA6RjB,QAAA,MAAM,YAAY,uDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -23,13 +23,14 @@ export interface CreateAssetModalProps {
23
23
  open: boolean;
24
24
  /** Pre-loaded file (from paste or drag) */
25
25
  initialFile?: File | null;
26
- /** Callback when creation is complete */
26
+ /** Callback when creation is complete. May be async; a rejection keeps the
27
+ * form populated and surfaces an error instead of clearing silently. */
27
28
  oncreate: (data: {
28
29
  file: File;
29
30
  name: string;
30
31
  description: string;
31
32
  altText: string;
32
- }) => void;
33
+ }) => void | Promise<void>;
33
34
  /** Callback when modal is closed */
34
35
  onclose: () => void;
35
36
  }
@@ -47,6 +48,8 @@ let description = $state('');
47
48
  let altText = $state('');
48
49
  let dragOver = $state(false);
49
50
  let previewUrl: string | null = $state(null);
51
+ let submitting = $state(false);
52
+ let error = $state('');
50
53
 
51
54
  // Sync initial file
52
55
  $effect(() => {
@@ -100,10 +103,24 @@ function handleFileSelect(e: Event) {
100
103
  }
101
104
  }
102
105
 
103
- function handleSubmit() {
104
- if (!file) return;
105
- oncreate({ file, name, description, altText });
106
- resetForm();
106
+ async function handleSubmit() {
107
+ if (!file || submitting) return;
108
+ submitting = true;
109
+ error = '';
110
+ try {
111
+ // Await in case `oncreate` performs an async upload; awaiting a sync
112
+ // (void) return is a harmless no-op. Only clear the form on success so a
113
+ // rejected upload keeps the user's input and surfaces the failure.
114
+ await oncreate({ file, name, description, altText });
115
+ resetForm();
116
+ } catch (err) {
117
+ error =
118
+ err instanceof Error
119
+ ? err.message
120
+ : t(M['assets.create_asset_modal.upload_failed']);
121
+ } finally {
122
+ submitting = false;
123
+ }
107
124
  }
108
125
 
109
126
  function handleClose() {
@@ -116,6 +133,7 @@ function resetForm() {
116
133
  name = '';
117
134
  description = '';
118
135
  altText = '';
136
+ error = '';
119
137
  }
120
138
 
121
139
  function formatSize(bytes: number): string {
@@ -196,15 +214,28 @@ const isLargeFile = $derived((file?.size ?? 0) > 2 * 1024 * 1024);
196
214
  </div>
197
215
  {/if}
198
216
 
217
+ {#if error}
218
+ <p class="create-error" role="alert" aria-live="assertive">{error}</p>
219
+ {/if}
220
+
199
221
  {#snippet footer()}
200
- <Button variant="ghost" size="sm" onclick={handleClose}>Cancel</Button>
201
- <Button variant="primary" size="sm" onclick={handleSubmit} disabled={!file}>
202
- Upload
222
+ <Button variant="ghost" size="sm" onclick={handleClose} disabled={submitting}>Cancel</Button>
223
+ <Button variant="primary" size="sm" onclick={handleSubmit} disabled={!file || submitting}>
224
+ {submitting ? 'Uploading…' : 'Upload'}
203
225
  </Button>
204
226
  {/snippet}
205
227
  </Modal>
206
228
 
207
229
  <style>
230
+ .create-error {
231
+ margin: var(--smrt-spacing-2, 0.5rem) 0 0;
232
+ padding: var(--smrt-spacing-2, 0.5rem) var(--smrt-spacing-3, 0.75rem);
233
+ border-radius: var(--smrt-radius-medium, 0.5rem);
234
+ background: var(--smrt-color-error-container, #fde8e6);
235
+ color: var(--smrt-color-on-error-container, #410002);
236
+ font-size: var(--smrt-typography-body-small-size, 0.8rem);
237
+ }
238
+
208
239
  /* Dropzone */
209
240
  .dropzone {
210
241
  display: flex;
@@ -3,13 +3,14 @@ export interface CreateAssetModalProps {
3
3
  open: boolean;
4
4
  /** Pre-loaded file (from paste or drag) */
5
5
  initialFile?: File | null;
6
- /** Callback when creation is complete */
6
+ /** Callback when creation is complete. May be async; a rejection keeps the
7
+ * form populated and surfaces an error instead of clearing silently. */
7
8
  oncreate: (data: {
8
9
  file: File;
9
10
  name: string;
10
11
  description: string;
11
12
  altText: string;
12
- }) => void;
13
+ }) => void | Promise<void>;
13
14
  /** Callback when modal is closed */
14
15
  onclose: () => void;
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CreateAssetModal.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/CreateAssetModal.svelte.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,qBAAqB;IACpC,gCAAgC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,yCAAyC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE;QACf,IAAI,EAAE,IAAI,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,IAAI,CAAC;IACX,oCAAoC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAoLD,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"CreateAssetModal.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/CreateAssetModal.svelte.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,qBAAqB;IACpC,gCAAgC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B;4EACwE;IACxE,QAAQ,EAAE,CAAC,IAAI,EAAE;QACf,IAAI,EAAE,IAAI,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,oCAAoC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAyMD,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -52,6 +52,7 @@ export declare const M: {
52
52
  readonly 'assets.create_asset_modal.upload_asset': "assets.create_asset_modal.upload_asset";
53
53
  readonly 'assets.create_asset_modal.preview_alt': "assets.create_asset_modal.preview_alt";
54
54
  readonly 'assets.create_asset_modal.remove_file': "assets.create_asset_modal.remove_file";
55
+ readonly 'assets.create_asset_modal.upload_failed': "assets.create_asset_modal.upload_failed";
55
56
  readonly 'assets.asset_detail_preview.modal_preview': "assets.asset_detail_preview.modal_preview";
56
57
  readonly 'assets.asset_detail_preview.description': "assets.asset_detail_preview.description";
57
58
  readonly 'assets.asset_detail_preview.open_asset_detail': "assets.asset_detail_preview.open_asset_detail";
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GZ,CAAC"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+GZ,CAAC"}
@@ -61,6 +61,7 @@ export const M = defineMessages({
61
61
  'assets.create_asset_modal.upload_asset': 'Upload Asset',
62
62
  'assets.create_asset_modal.preview_alt': 'Preview',
63
63
  'assets.create_asset_modal.remove_file': 'Remove file',
64
+ 'assets.create_asset_modal.upload_failed': 'Upload failed. Please try again.',
64
65
  // AssetDetailPreview (playground)
65
66
  'assets.asset_detail_preview.modal_preview': 'Modal Preview',
66
67
  'assets.asset_detail_preview.description': 'Launch the asset detail dialog from inside the preview stage so the shared\n playground stays navigable.',
@@ -98,6 +98,28 @@ export interface AssetManagerProps {
98
98
  initialView?: AssetViewMode;
99
99
  /** Whether to show folder navigation */
100
100
  showFolders?: boolean;
101
+ /**
102
+ * Persist an asset edit from the detail drawer. Consumer-supplied — when
103
+ * omitted, edits apply to local state only (preview/demo). Awaited; a
104
+ * rejection surfaces an error and skips the local update.
105
+ */
106
+ onSave?: (asset: PersistedAsset, updates: Record<string, unknown>) => void | Promise<void>;
107
+ /**
108
+ * Persist a newly created asset. Consumer-supplied; awaited. A rejection
109
+ * propagates to the create modal, which surfaces it and keeps the form.
110
+ */
111
+ onCreate?: (data: {
112
+ file: File;
113
+ name: string;
114
+ description: string;
115
+ altText: string;
116
+ }) => void | Promise<void>;
117
+ /**
118
+ * Persist asset deletion. Consumer-supplied — when omitted, deletion applies
119
+ * to local state only. Awaited; a rejection surfaces an error and skips the
120
+ * local removal.
121
+ */
122
+ onDelete?: (assets: PersistedAsset[]) => void | Promise<void>;
101
123
  }
102
124
  /** Props for AssetToolbar */
103
125
  export interface AssetToolbarProps {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/svelte/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/svelte/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-assets",
3
- "version": "0.31.0",
3
+ "version": "0.32.0",
4
4
  "description": "Asset management system with versioning, metadata, and AI-powered operations for SMRT framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -38,11 +38,11 @@
38
38
  "@happyvertical/logger": "^0.74.7",
39
39
  "@happyvertical/sql": "^0.74.7",
40
40
  "@happyvertical/utils": "^0.74.7",
41
- "@happyvertical/smrt-tags": "0.31.0",
42
- "@happyvertical/smrt-core": "0.31.0",
43
- "@happyvertical/smrt-tenancy": "0.31.0",
44
- "@happyvertical/smrt-types": "0.31.0",
45
- "@happyvertical/smrt-ui": "0.31.0"
41
+ "@happyvertical/smrt-tenancy": "0.32.0",
42
+ "@happyvertical/smrt-types": "0.32.0",
43
+ "@happyvertical/smrt-core": "0.32.0",
44
+ "@happyvertical/smrt-tags": "0.32.0",
45
+ "@happyvertical/smrt-ui": "0.32.0"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "svelte": "^5.18.0"
@@ -64,8 +64,8 @@
64
64
  "typescript": "^5.9.3",
65
65
  "vite": "^7.3.1",
66
66
  "vitest": "^4.0.17",
67
- "@happyvertical/smrt-vitest": "0.31.0",
68
- "@happyvertical/smrt-playground": "0.31.0"
67
+ "@happyvertical/smrt-vitest": "0.32.0",
68
+ "@happyvertical/smrt-playground": "0.32.0"
69
69
  },
70
70
  "keywords": [
71
71
  "ai",