@happyvertical/smrt-images 0.34.6 → 0.34.8

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": 1782278454905,
3
+ "timestamp": 1782318264492,
4
4
  "packageName": "@happyvertical/smrt-images",
5
- "packageVersion": "0.34.6",
5
+ "packageVersion": "0.34.8",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-images:Image": {
8
8
  "name": "image",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-06-24T05:20:55.298Z",
3
+ "generatedAt": "2026-06-24T16:24:24.858Z",
4
4
  "packageName": "@happyvertical/smrt-images",
5
- "packageVersion": "0.34.6",
5
+ "packageVersion": "0.34.8",
6
6
  "sourceManifestPath": "dist/manifest.json",
7
7
  "agentDocPath": "AGENTS.md",
8
8
  "sourceHashes": {
9
- "manifest": "515005d7f498f29b64950227f55bf717187170d8804964551ce0d4d801ae2edf",
10
- "packageJson": "92a1d613d753d7e30b192816fede1a97398d170365b5b4c1ca8d23c6a2912678",
9
+ "manifest": "a4baa7ca1cc2fa00494aeabf16c3e0e7f9a1fd12edd69f1ecae1efe8180ec8d3",
10
+ "packageJson": "2d9850bf9671a0909ca8fd561dd71dc7a339acca3e4d192ca51aae5824f74820",
11
11
  "agents": "b0cf63bd78f00cc1729ea7f1425291f8e23ab5591161cbbf0d08f4b16ace07fd"
12
12
  },
13
13
  "exports": [
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import { Input, Select } from '@happyvertical/smrt-ui/forms';
2
3
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
3
4
  import { Button } from '@happyvertical/smrt-ui/ui';
4
5
  import { onMount } from 'svelte';
@@ -158,29 +159,29 @@ function handleDragStart(event: DragEvent, image: ImageLike) {
158
159
 
159
160
  <div class="toolbar">
160
161
  <div class="search-box">
161
- <input
162
- type="search"
162
+ <Input
163
+ type="search"
163
164
  bind:value={searchQuery}
164
165
  placeholder={t(M['images.assets_gallery.search_placeholder'])}
165
166
  />
166
167
  </div>
167
-
168
+
168
169
  <div class="filters">
169
- <select bind:value={orientationFilter}>
170
+ <Select class="orientation-select" bind:value={orientationFilter}>
170
171
  <option value="all">{t(M['images.assets_gallery.any_orientation'])}</option>
171
172
  <option value="landscape">Landscape</option>
172
173
  <option value="portrait">Portrait</option>
173
174
  <option value="square">Square</option>
174
- </select>
175
-
176
- <input
177
- type="number"
175
+ </Select>
176
+
177
+ <Input
178
+ type="number"
178
179
  bind:value={minWidth}
179
180
  placeholder={t(M['images.assets_gallery.min_width_placeholder'])}
180
181
  class="size-input"
181
182
  />
182
- <input
183
- type="number"
183
+ <Input
184
+ type="number"
184
185
  bind:value={minHeight}
185
186
  placeholder={t(M['images.assets_gallery.min_height_placeholder'])}
186
187
  class="size-input"
@@ -286,45 +287,22 @@ function handleDragStart(event: DragEvent, image: ImageLike) {
286
287
  min-width: 250px;
287
288
  }
288
289
 
289
- .search-box input {
290
- width: 100%;
291
- padding: 0.75rem 1.25rem;
292
- background: var(--smrt-color-surface-container-highest, #333);
293
- border: 1px solid var(--smrt-color-outline-variant, #444);
294
- border-radius: var(--smrt-radius-full, 9999px);
295
- color: inherit;
296
- font-size: var(--smrt-typography-body-large-size, 0.95rem);
297
- transition: box-shadow 0.2s, border-color 0.2s;
298
- }
299
-
300
- .search-box input:focus {
301
- outline: none;
302
- border-color: var(--smrt-color-primary, #3b82f6);
303
- box-shadow: inset 0 0 0 1px var(--smrt-color-primary, #3b82f6);
304
- }
305
-
306
290
  .filters {
307
291
  display: flex;
308
292
  gap: 0.75rem;
309
293
  flex-wrap: wrap;
310
294
  }
311
295
 
312
- .filters select, .filters input {
313
- padding: 0.75rem 1rem;
314
- background: var(--smrt-color-surface-container-high, #242424);
315
- border: 1px solid var(--smrt-color-outline-variant, #444);
316
- border-radius: var(--smrt-radius-sm, 4px);
317
- color: inherit;
318
- transition: box-shadow 0.2s, border-color 0.2s;
319
- }
320
-
321
- .filters select:focus, .filters input:focus {
322
- outline: none;
323
- border-color: var(--smrt-color-primary, #3b82f6);
324
- box-shadow: inset 0 0 0 1px var(--smrt-color-primary, #3b82f6);
296
+ /* Layout-only overrides for the migrated filter primitives. The Input / Select
297
+ primitives own the visual styling; these :global() rules only pierce their
298
+ rendered controls to size the boxes within the flex row (see #1589 scoping
299
+ rule). The orientation Select sizes to its content instead of the primitive's
300
+ full-width default; the min-width/min-height Inputs are capped. */
301
+ .filters :global(.orientation-select) {
302
+ width: auto;
325
303
  }
326
304
 
327
- .size-input {
305
+ .filters :global(.size-input) {
328
306
  width: 120px;
329
307
  }
330
308
 
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsGallery.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/AssetsGallery.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EAEpB,MAAM,kBAAkB,CAAC;AAEzB,KAAK,gBAAgB,GAAI;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACtC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AA2NF,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AssetsGallery.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/AssetsGallery.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EAEpB,MAAM,kBAAkB,CAAC;AAEzB,KAAK,gBAAgB,GAAI;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACtC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AA4NF,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import { Input, Select, Textarea } from '@happyvertical/smrt-ui/forms';
2
3
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
3
4
  import { Button } from '@happyvertical/smrt-ui/ui';
4
5
  import { M } from '../i18n.js';
@@ -219,8 +220,8 @@ async function handleAIEdit() {
219
220
  <div class="tool-section">
220
221
  <h4>Resize</h4>
221
222
  <div class="row">
222
- <label>Width <input type="number" bind:value={width} onfocus={() => isEditingDimensions = true} /></label>
223
- <label>Height <input type="number" bind:value={height} onfocus={() => isEditingDimensions = true} /></label>
223
+ <label>Width <Input type="number" class="dim-input" bind:value={width} onfocus={() => isEditingDimensions = true} /></label>
224
+ <label>Height <Input type="number" class="dim-input" bind:value={height} onfocus={() => isEditingDimensions = true} /></label>
224
225
  <Button variant="ghost" class="tonal-btn--filled" disabled={isProcessing} onclick={handleResize}>{t(M['images.image_editor.apply_resize'])}</Button>
225
226
  </div>
226
227
  {#if isEditingDimensions}
@@ -231,12 +232,12 @@ async function handleAIEdit() {
231
232
  <div class="tool-section">
232
233
  <h4>Crop</h4>
233
234
  <div class="row">
234
- <label>X <input type="number" bind:value={cropX} onfocus={() => isCropping = true} /></label>
235
- <label>Y <input type="number" bind:value={cropY} onfocus={() => isCropping = true} /></label>
235
+ <label>X <Input type="number" class="dim-input" bind:value={cropX} onfocus={() => isCropping = true} /></label>
236
+ <label>Y <Input type="number" class="dim-input" bind:value={cropY} onfocus={() => isCropping = true} /></label>
236
237
  </div>
237
238
  <div class="row">
238
- <label>W <input type="number" bind:value={cropW} onfocus={() => isCropping = true} /></label>
239
- <label>H <input type="number" bind:value={cropH} onfocus={() => isCropping = true} /></label>
239
+ <label>W <Input type="number" class="dim-input" bind:value={cropW} onfocus={() => isCropping = true} /></label>
240
+ <label>H <Input type="number" class="dim-input" bind:value={cropH} onfocus={() => isCropping = true} /></label>
240
241
  <Button variant="ghost" class="tonal-btn--filled" disabled={isProcessing} onclick={handleCrop}>{t(M['images.image_editor.apply_crop'])}</Button>
241
242
  </div>
242
243
  {#if isCropping}
@@ -247,11 +248,11 @@ async function handleAIEdit() {
247
248
  <div class="tool-section">
248
249
  <h4>{t(M['images.image_editor.convert_format'])}</h4>
249
250
  <div class="row">
250
- <select bind:value={format}>
251
+ <Select class="format-select" bind:value={format}>
251
252
  <option value="webp">WebP</option>
252
253
  <option value="jpeg">JPEG</option>
253
254
  <option value="png">PNG</option>
254
- </select>
255
+ </Select>
255
256
  <Button variant="ghost" class="tonal-btn--filled" disabled={isProcessing} onclick={handleConvert}>Convert</Button>
256
257
  </div>
257
258
  </div>
@@ -260,11 +261,12 @@ async function handleAIEdit() {
260
261
  <div class="tool-section">
261
262
  <h4>{t(M['images.image_editor.ai_powered_edit'])}</h4>
262
263
  <p class="hint">{t(M['images.image_editor.ai_powered_edit_hint'])}</p>
263
- <textarea
264
+ <Textarea
265
+ class="ai-prompt"
264
266
  bind:value={prompt}
265
267
  placeholder={t(M['images.image_editor.ai_prompt_placeholder'])}
266
- rows="4"
267
- ></textarea>
268
+ rows={4}
269
+ />
268
270
  <Button
269
271
  variant="primary"
270
272
  class="primary-btn--pill"
@@ -390,30 +392,22 @@ async function handleAIEdit() {
390
392
  gap: 0.25rem;
391
393
  }
392
394
 
393
- input, select, textarea {
394
- background: var(--smrt-color-surface-container-high, #242424);
395
- border: 1px solid var(--smrt-color-outline-variant, #444);
396
- color: inherit;
397
- padding: 0.6rem 0.75rem;
398
- border-radius: var(--smrt-radius-sm, 4px);
399
- transition: box-shadow 0.2s, border-color 0.2s;
400
- }
401
-
402
- input:focus, select:focus, textarea:focus {
403
- outline: none;
404
- border-color: var(--smrt-color-primary, #3b82f6);
405
- box-shadow: inset 0 0 0 1px var(--smrt-color-primary, #3b82f6);
395
+ /* Layout-only overrides for the migrated form primitives. The Input / Select /
396
+ Textarea primitives own the visual styling (background, border, focus ring);
397
+ these :global() rules only pierce their rendered controls to constrain box
398
+ size and spacing (see #1589 scoping rule). */
399
+ .row label :global(.dim-input) {
400
+ width: 90px;
406
401
  }
407
402
 
408
- input[type="number"] {
409
- width: 90px;
403
+ /* Size the format Select to its content instead of the primitive's full-width
404
+ default so it sits inline beside the Convert button in the flex row. */
405
+ .row :global(.format-select) {
406
+ width: auto;
410
407
  }
411
408
 
412
- textarea {
413
- width: 100%;
414
- resize: vertical;
409
+ .tool-section :global(.ai-prompt) {
415
410
  margin-bottom: 1rem;
416
- font-family: inherit;
417
411
  }
418
412
 
419
413
  /* Migrated Buttons keep their bespoke filled-tonal / text-link / pill looks.
@@ -1 +1 @@
1
- {"version":3,"file":"ImageEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ImageEditor.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,iBAAiB,EACjB,SAAS,EAEV,MAAM,kBAAkB,CAAC;AAEzB,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAkQF,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ImageEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ImageEditor.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,iBAAiB,EACjB,SAAS,EAEV,MAAM,kBAAkB,CAAC;AAEzB,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAmQF,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import { Input, Textarea } from '@happyvertical/smrt-ui/forms';
2
3
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
3
4
  import { Button } from '@happyvertical/smrt-ui/ui';
4
5
  import { onDestroy } from 'svelte';
@@ -320,12 +321,12 @@ onDestroy(() => {
320
321
  {#if showVariation}
321
322
  <div class="variation-form">
322
323
  <p class="variation-hint">{t(M['images.image_uploader.variation_hint'])}</p>
323
- <textarea
324
+ <Textarea
324
325
  bind:value={variationPrompt}
325
326
  placeholder={t(M['images.image_uploader.variation_prompt_placeholder'])}
326
- rows="3"
327
+ rows={3}
327
328
  disabled={isGenerating}
328
- ></textarea>
329
+ />
329
330
  {#if variationError}
330
331
  <div class="variation-error">{variationError}</div>
331
332
  {/if}
@@ -420,12 +421,13 @@ onDestroy(() => {
420
421
  <p>{t(M['images.image_uploader.drag_and_drop'])}</p>
421
422
  <span class="divider">or</span>
422
423
  <Button variant="primary" class="browse-btn--decorative">{t(M['images.image_uploader.browse_files'])}</Button>
423
- <input
424
- type="file"
425
- accept="image/*"
426
- bind:this={uploadInput}
427
- onchange={handleFileSelect}
428
- style="display: none;"
424
+ <!-- raw-primitive-allow: hidden file input driven imperatively via a DOM ref (bind:this gives uploadInput so the parent can call .click() and onchange reads target.files); the Input primitive exposes a component instance, not the underlying HTMLInputElement -->
425
+ <input
426
+ type="file"
427
+ accept="image/*"
428
+ bind:this={uploadInput}
429
+ onchange={handleFileSelect}
430
+ style="display: none;"
429
431
  />
430
432
  {#if uploadError}
431
433
  <p class="error">{uploadError}</p>
@@ -458,8 +460,9 @@ onDestroy(() => {
458
460
  <div class="external-area">
459
461
  <p class="hint">{t(M['images.image_uploader.external_hint'])}</p>
460
462
  <div class="input-group">
461
- <input
462
- type="url"
463
+ <Input
464
+ type="url"
465
+ class="external-url-input"
463
466
  bind:value={externalUrl}
464
467
  placeholder={t(M['images.image_uploader.external_url_placeholder'])}
465
468
  onkeydown={(e) => e.key === 'Enter' && handleExternalSubmit()}
@@ -726,21 +729,11 @@ onDestroy(() => {
726
729
  gap: 0.5rem;
727
730
  }
728
731
 
729
- .input-group input {
732
+ /* Layout-only override: let the migrated URL Input flex-grow to fill the row
733
+ beside the Add button. The Input primitive owns the visual styling; this
734
+ :global() rule only pierces its rendered <input> (see #1589 scoping rule). */
735
+ .input-group :global(.external-url-input) {
730
736
  flex: 1;
731
- padding: 1rem 1.25rem;
732
- background: var(--smrt-color-surface-container-high, #242424);
733
- border: 1px solid var(--smrt-color-outline-variant, #444);
734
- border-radius: var(--smrt-radius-sm, 4px);
735
- color: var(--smrt-color-on-surface, #fff);
736
- font-size: var(--smrt-typography-body-large-size, 1rem);
737
- transition: border-color 0.2s, box-shadow 0.2s;
738
- }
739
-
740
- .input-group input:focus {
741
- outline: none;
742
- border-color: var(--smrt-color-primary, #3b82f6);
743
- box-shadow: inset 0 0 0 1px var(--smrt-color-primary, #3b82f6);
744
737
  }
745
738
 
746
739
  /* Migrated Add Button sits in the URL input group; keeps square-ish radius
@@ -883,29 +876,6 @@ onDestroy(() => {
883
876
  margin: 0;
884
877
  }
885
878
 
886
- .variation-form textarea {
887
- width: 100%;
888
- padding: 0.75rem;
889
- background: var(--smrt-color-surface-container, #1a1a1a);
890
- border: 1px solid var(--smrt-color-outline-variant, #444);
891
- border-radius: var(--smrt-radius-sm, 4px);
892
- color: inherit;
893
- font-family: inherit;
894
- font-size: var(--smrt-typography-body-large-size, 0.95rem);
895
- resize: vertical;
896
- transition: border-color 0.2s, box-shadow 0.2s;
897
- }
898
-
899
- .variation-form textarea:focus {
900
- outline: none;
901
- border-color: var(--smrt-color-primary, #3b82f6);
902
- box-shadow: inset 0 0 0 1px var(--smrt-color-primary, #3b82f6);
903
- }
904
-
905
- .variation-form textarea:disabled {
906
- opacity: 0.6;
907
- }
908
-
909
879
  .variation-error {
910
880
  color: var(--smrt-color-error, #ef4444);
911
881
  background: color-mix(in srgb, var(--smrt-color-error) 10%, transparent);
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUploader.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ImageUploader.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAGzB,KAAK,gBAAgB,GAAI;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,mDAAmD;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC;IAC/D,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AA6ZF,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ImageUploader.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ImageUploader.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAGzB,KAAK,gBAAgB,GAAI;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,mDAAmD;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC;IAC/D,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AA+ZF,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-images",
3
- "version": "0.34.6",
3
+ "version": "0.34.8",
4
4
  "description": "Image asset management with AI-powered categorization, search, editing, and metadata extraction for SMRT framework",
5
5
  "type": "module",
6
- "smrtRawPrimitives": "strict-buttons",
6
+ "smrtRawPrimitives": "strict",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "files": [
@@ -39,12 +39,12 @@
39
39
  "@happyvertical/utils": "^0.74.7",
40
40
  "jimp": "^1.6.1",
41
41
  "sharp": "^0.34.5",
42
- "@happyvertical/smrt-assets": "0.34.6",
43
- "@happyvertical/smrt-core": "0.34.6",
44
- "@happyvertical/smrt-tenancy": "0.34.6",
45
- "@happyvertical/smrt-types": "0.34.6",
46
- "@happyvertical/smrt-prompts": "0.34.6",
47
- "@happyvertical/smrt-ui": "0.34.6"
42
+ "@happyvertical/smrt-assets": "0.34.8",
43
+ "@happyvertical/smrt-core": "0.34.8",
44
+ "@happyvertical/smrt-prompts": "0.34.8",
45
+ "@happyvertical/smrt-tenancy": "0.34.8",
46
+ "@happyvertical/smrt-types": "0.34.8",
47
+ "@happyvertical/smrt-ui": "0.34.8"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "svelte": "^5.18.0"
@@ -60,8 +60,8 @@
60
60
  "typescript": "^5.9.3",
61
61
  "vite": "^7.3.1",
62
62
  "vitest": "^4.0.17",
63
- "@happyvertical/smrt-playground": "0.34.6",
64
- "@happyvertical/smrt-vitest": "0.34.6"
63
+ "@happyvertical/smrt-playground": "0.34.8",
64
+ "@happyvertical/smrt-vitest": "0.34.8"
65
65
  },
66
66
  "keywords": [
67
67
  "ai",