@salmexio/ui 0.4.0 → 1.1.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.
Files changed (119) hide show
  1. package/README.md +52 -3
  2. package/dist/dialogs/ContextMenu/ContextMenu.svelte +97 -94
  3. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +3 -2
  4. package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -1
  5. package/dist/dialogs/Modal/Modal.svelte +112 -116
  6. package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
  7. package/dist/feedback/Alert/Alert.svelte +119 -220
  8. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte +265 -0
  10. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +40 -0
  11. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
  12. package/dist/feedback/ProgressBar/index.d.ts +2 -0
  13. package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
  14. package/dist/feedback/ProgressBar/index.js +1 -0
  15. package/dist/feedback/Skeleton/Skeleton.svelte +157 -0
  16. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +37 -0
  17. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
  18. package/dist/feedback/Skeleton/index.d.ts +2 -0
  19. package/dist/feedback/Skeleton/index.d.ts.map +1 -0
  20. package/dist/feedback/Skeleton/index.js +1 -0
  21. package/dist/feedback/Spinner/Spinner.svelte +86 -151
  22. package/dist/feedback/Spinner/Spinner.svelte.d.ts +5 -3
  23. package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
  24. package/dist/feedback/Toast/Toaster.svelte +431 -0
  25. package/dist/feedback/Toast/Toaster.svelte.d.ts +22 -0
  26. package/dist/feedback/Toast/Toaster.svelte.d.ts.map +1 -0
  27. package/dist/feedback/Toast/index.d.ts +4 -0
  28. package/dist/feedback/Toast/index.d.ts.map +1 -0
  29. package/dist/feedback/Toast/index.js +2 -0
  30. package/dist/feedback/Toast/toastStore.d.ts +34 -0
  31. package/dist/feedback/Toast/toastStore.d.ts.map +1 -0
  32. package/dist/feedback/Toast/toastStore.js +43 -0
  33. package/dist/feedback/index.d.ts +4 -0
  34. package/dist/feedback/index.d.ts.map +1 -1
  35. package/dist/feedback/index.js +3 -0
  36. package/dist/forms/Checkbox/Checkbox.svelte +87 -104
  37. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  38. package/dist/forms/Select/Select.svelte +137 -179
  39. package/dist/forms/Select/Select.svelte.d.ts +1 -1
  40. package/dist/forms/Slider/Slider.svelte +356 -0
  41. package/dist/forms/Slider/Slider.svelte.d.ts +50 -0
  42. package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -0
  43. package/dist/forms/Slider/index.d.ts +2 -0
  44. package/dist/forms/Slider/index.d.ts.map +1 -0
  45. package/dist/forms/Slider/index.js +1 -0
  46. package/dist/forms/TextInput/TextInput.svelte +161 -167
  47. package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
  48. package/dist/forms/Textarea/Textarea.svelte +615 -0
  49. package/dist/forms/Textarea/Textarea.svelte.d.ts +47 -0
  50. package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
  51. package/dist/forms/Textarea/index.d.ts +2 -0
  52. package/dist/forms/Textarea/index.d.ts.map +1 -0
  53. package/dist/forms/Textarea/index.js +1 -0
  54. package/dist/forms/Toggle/Toggle.svelte +239 -0
  55. package/dist/forms/Toggle/Toggle.svelte.d.ts +39 -0
  56. package/dist/forms/Toggle/Toggle.svelte.d.ts.map +1 -0
  57. package/dist/forms/Toggle/index.d.ts +2 -0
  58. package/dist/forms/Toggle/index.d.ts.map +1 -0
  59. package/dist/forms/Toggle/index.js +1 -0
  60. package/dist/forms/index.d.ts +3 -0
  61. package/dist/forms/index.d.ts.map +1 -1
  62. package/dist/forms/index.js +3 -0
  63. package/dist/index.d.ts +0 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +0 -1
  66. package/dist/layout/Card/Card.svelte +66 -39
  67. package/dist/layout/Card/Card.svelte.d.ts +1 -1
  68. package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
  69. package/dist/layout/Container/Container.svelte +71 -71
  70. package/dist/layout/Container/Container.svelte.d.ts +2 -2
  71. package/dist/layout/ThermalBackground/ThermalBackground.svelte +313 -0
  72. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts +16 -0
  73. package/dist/layout/ThermalBackground/ThermalBackground.svelte.d.ts.map +1 -0
  74. package/dist/layout/ThermalBackground/index.d.ts +2 -0
  75. package/dist/layout/ThermalBackground/index.d.ts.map +1 -0
  76. package/dist/layout/ThermalBackground/index.js +1 -0
  77. package/dist/layout/index.d.ts +1 -0
  78. package/dist/layout/index.d.ts.map +1 -1
  79. package/dist/layout/index.js +1 -0
  80. package/dist/navigation/CommandPalette/CommandPalette.svelte +407 -189
  81. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
  82. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
  83. package/dist/navigation/Tabs/Tabs.svelte +139 -192
  84. package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
  85. package/dist/primitives/Badge/Badge.svelte +85 -220
  86. package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
  87. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
  88. package/dist/primitives/Button/Button.svelte +214 -194
  89. package/dist/primitives/Button/Button.svelte.d.ts +3 -3
  90. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  91. package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
  92. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
  93. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
  94. package/dist/primitives/Tooltip/index.d.ts +2 -0
  95. package/dist/primitives/Tooltip/index.d.ts.map +1 -0
  96. package/dist/primitives/Tooltip/index.js +1 -0
  97. package/dist/primitives/index.d.ts +1 -0
  98. package/dist/primitives/index.d.ts.map +1 -1
  99. package/dist/primitives/index.js +1 -0
  100. package/dist/styles/tokens.css +329 -260
  101. package/package.json +5 -5
  102. package/dist/windowing/Window/Window.svelte +0 -637
  103. package/dist/windowing/Window/Window.svelte.d.ts +0 -65
  104. package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
  105. package/dist/windowing/Window/index.d.ts +0 -2
  106. package/dist/windowing/Window/index.d.ts.map +0 -1
  107. package/dist/windowing/Window/index.js +0 -1
  108. package/dist/windowing/WindowManager/WindowManager.svelte +0 -425
  109. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
  110. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
  111. package/dist/windowing/WindowManager/index.d.ts +0 -2
  112. package/dist/windowing/WindowManager/index.d.ts.map +0 -1
  113. package/dist/windowing/WindowManager/index.js +0 -1
  114. package/dist/windowing/index.d.ts +0 -5
  115. package/dist/windowing/index.d.ts.map +0 -1
  116. package/dist/windowing/index.js +0 -3
  117. package/dist/windowing/windowStore.svelte.d.ts +0 -49
  118. package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
  119. package/dist/windowing/windowStore.svelte.js +0 -170
@@ -1,7 +1,7 @@
1
1
  <!--
2
2
  @component Modal
3
3
 
4
- Win2K × Basquiat — Dialog with canvas surface, bold 3px border, title bar header.
4
+ INFRARED — Dialog with glass surface, subtle border, clean header.
5
5
  Follows WAI-ARIA Dialog (Modal) pattern: focus trap, restore focus on close,
6
6
  aria-labelledby, aria-describedby, aria-modal. Escape and backdrop close.
7
7
  For full inert support (background not focusable), render modal in a portal
@@ -88,10 +88,10 @@ function setInitialFocus() {
88
88
  return;
89
89
  }
90
90
  if (!dialogElement) return;
91
- const titleEl = dialogElement.querySelector<HTMLElement>('.salmex-modal-title-wrap');
92
- const body = dialogElement.querySelector('.salmex-modal-body');
91
+ const titleEl = dialogElement.querySelector<HTMLElement>('.sx-modal-title-wrap');
92
+ const body = dialogElement.querySelector('.sx-modal-body');
93
93
  const first = body?.querySelector<HTMLElement>(FOCUSABLE);
94
- const closeBtn = dialogElement.querySelector<HTMLElement>('.salmex-modal-close');
94
+ const closeBtn = dialogElement.querySelector<HTMLElement>('.sx-modal-close');
95
95
 
96
96
  if (initialFocusStrategy === 'title' && titleEl) {
97
97
  titleEl.focus();
@@ -163,7 +163,7 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
163
163
  {#if open}
164
164
  <!-- Backdrop -->
165
165
  <div
166
- class="salmex-modal-backdrop salmex-modal-position-{position}"
166
+ class="sx-modal-backdrop sx-modal-position-{position}"
167
167
  role="presentation"
168
168
  onclick={handleBackdropClick}
169
169
  onkeydown={() => {}}
@@ -171,7 +171,7 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
171
171
  <div
172
172
  bind:this={dialogElement}
173
173
  id={modalId}
174
- class="salmex-modal-container salmex-modal-{size} salmex-modal-scroll-{scrollBehavior} {className}"
174
+ class="sx-modal-container sx-modal-{size} sx-modal-scroll-{scrollBehavior} {className}"
175
175
  role="dialog"
176
176
  aria-modal="true"
177
177
  aria-labelledby={titleId}
@@ -179,18 +179,18 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
179
179
  data-testid={testId}
180
180
  >
181
181
  {#if header || title || showCloseButton}
182
- <div class="salmex-modal-header">
183
- <div id={titleId} class="salmex-modal-title-wrap" tabindex="-1">
182
+ <div class="sx-modal-header">
183
+ <div id={titleId} class="sx-modal-title-wrap" tabindex="-1">
184
184
  {#if header}
185
185
  {@render header()}
186
186
  {:else if title}
187
- <h2 class="salmex-modal-title">{title}</h2>
187
+ <h2 class="sx-modal-title">{title}</h2>
188
188
  {/if}
189
189
  </div>
190
190
  {#if showCloseButton && !preventClose}
191
191
  <button
192
192
  type="button"
193
- class="salmex-modal-close"
193
+ class="sx-modal-close"
194
194
  onclick={handleClose}
195
195
  aria-label={closeLabel}
196
196
  >
@@ -203,12 +203,12 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
203
203
  </div>
204
204
  {/if}
205
205
  {#if children}
206
- <div id={descriptionId} class="salmex-modal-body">
206
+ <div id={descriptionId} class="sx-modal-body">
207
207
  {@render children()}
208
208
  </div>
209
209
  {/if}
210
210
  {#if footer}
211
- <div class="salmex-modal-footer">
211
+ <div class="sx-modal-footer">
212
212
  {@render footer()}
213
213
  </div>
214
214
  {/if}
@@ -217,28 +217,32 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
217
217
  {/if}
218
218
 
219
219
  <style>
220
- .salmex-modal-backdrop {
220
+ /* ========================================
221
+ BACKDROP
222
+ ======================================== */
223
+ .sx-modal-backdrop {
221
224
  position: fixed;
222
225
  inset: 0;
223
- z-index: var(--salmex-z-modal-backdrop, 1040);
226
+ z-index: var(--sx-z-modal-backdrop, 1040);
224
227
  display: flex;
225
228
  justify-content: center;
226
- padding: var(--salmex-space-6);
227
- background: rgb(0 0 0 / 0.6);
229
+ padding: var(--sx-space-6);
230
+ background: rgba(10, 10, 15, 0.7);
231
+ backdrop-filter: blur(4px);
228
232
  overflow-y: auto;
229
- animation: salmex-modal-fade-in var(--salmex-transition-base);
233
+ animation: sx-modal-fade-in var(--sx-transition-base);
230
234
  }
231
235
 
232
- .salmex-modal-position-center {
236
+ .sx-modal-position-center {
233
237
  align-items: center;
234
238
  }
235
239
 
236
- .salmex-modal-position-top {
240
+ .sx-modal-position-top {
237
241
  align-items: flex-start;
238
242
  padding-top: 3rem;
239
243
  }
240
244
 
241
- @keyframes salmex-modal-fade-in {
245
+ @keyframes sx-modal-fade-in {
242
246
  from {
243
247
  opacity: 0;
244
248
  }
@@ -247,192 +251,184 @@ const closeLabel = $derived(closeBtnAriaLabel ?? 'Close dialog');
247
251
  }
248
252
  }
249
253
 
250
- .salmex-modal-container {
254
+ /* ========================================
255
+ CONTAINER
256
+ ======================================== */
257
+ .sx-modal-container {
251
258
  position: relative;
252
259
  display: flex;
253
260
  flex-direction: column;
254
261
  width: 100%;
255
262
  max-height: calc(100vh - 2rem);
256
- background: rgb(var(--salmex-window-surface));
257
- border: 2px solid rgb(var(--salmex-button-dark-edge));
258
- border-radius: var(--salmex-radius-md);
259
- box-shadow:
260
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
261
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
262
- var(--salmex-shadow-lg);
263
- animation: salmex-modal-scale-in var(--salmex-transition-slow) ease-out;
263
+ background: var(--sx-color-surface);
264
+ border: 1px solid var(--sx-color-border-strong);
265
+ border-radius: var(--sx-radius-lg);
266
+ box-shadow: var(--sx-shadow-xl);
267
+ animation: sx-modal-scale-in 200ms ease-out;
264
268
  overflow: hidden;
265
269
  }
266
270
 
267
- :global([data-theme='dark']) .salmex-modal-container {
268
- box-shadow:
269
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
270
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
271
- 4px 4px 3px rgb(0 0 0 / 0.5);
272
- }
273
-
274
- @keyframes salmex-modal-scale-in {
271
+ @keyframes sx-modal-scale-in {
275
272
  from {
276
273
  opacity: 0;
277
- transform: scale(0.97) translateY(8px);
274
+ transform: scale(0.95);
278
275
  }
279
276
  to {
280
277
  opacity: 1;
281
- transform: scale(1) translateY(0);
278
+ transform: scale(1);
282
279
  }
283
280
  }
284
281
 
285
- .salmex-modal-sm {
282
+ /* ========================================
283
+ SIZES
284
+ ======================================== */
285
+ .sx-modal-sm {
286
286
  max-width: 24rem;
287
287
  }
288
- .salmex-modal-md {
288
+ .sx-modal-md {
289
289
  max-width: 28rem;
290
290
  }
291
- .salmex-modal-lg {
291
+ .sx-modal-lg {
292
292
  max-width: 32rem;
293
293
  }
294
- .salmex-modal-xl {
294
+ .sx-modal-xl {
295
295
  max-width: 40rem;
296
296
  }
297
- .salmex-modal-full {
297
+ .sx-modal-full {
298
298
  max-width: 56rem;
299
299
  }
300
300
 
301
- .salmex-modal-scroll-inside {
301
+ /* ========================================
302
+ SCROLL BEHAVIOR
303
+ ======================================== */
304
+ .sx-modal-scroll-inside {
302
305
  max-height: calc(100vh - 4rem);
303
306
  }
304
307
 
305
- .salmex-modal-scroll-inside .salmex-modal-body {
308
+ .sx-modal-scroll-inside .sx-modal-body {
306
309
  overflow-y: auto;
307
310
  }
308
311
 
309
- /* Title bar — Win2K gradient */
310
- .salmex-modal-header {
312
+ /* ========================================
313
+ HEADER
314
+ ======================================== */
315
+ .sx-modal-header {
311
316
  display: flex;
312
317
  align-items: center;
313
318
  justify-content: space-between;
314
- gap: var(--salmex-space-4);
315
- padding: var(--salmex-space-4);
316
- background: linear-gradient(
317
- 90deg,
318
- rgb(var(--salmex-electric-blue)),
319
- rgb(var(--salmex-titlebar-bold))
320
- );
321
- color: rgb(var(--salmex-chalk-white));
322
- border-bottom: 2px solid rgb(var(--salmex-button-dark-edge));
323
- border-radius: calc(var(--salmex-radius-md) - 2px) calc(var(--salmex-radius-md) - 2px) 0 0;
319
+ gap: var(--sx-space-4);
320
+ padding: var(--sx-space-4);
321
+ background: var(--sx-color-surface-2);
322
+ border-bottom: 1px solid var(--sx-color-border);
323
+ border-radius: calc(var(--sx-radius-lg) - 1px) calc(var(--sx-radius-lg) - 1px) 0 0;
324
324
  flex-shrink: 0;
325
- font-family: var(--salmex-font-display);
326
- }
327
-
328
- :global([data-theme='dark']) .salmex-modal-header {
329
- background: linear-gradient(
330
- 90deg,
331
- rgb(0 75 180),
332
- rgb(0 105 210)
333
- );
334
325
  }
335
326
 
336
- .salmex-modal-title-wrap {
327
+ .sx-modal-title-wrap {
337
328
  flex: 1;
338
329
  min-width: 0;
339
330
  outline: none;
340
331
  }
341
332
 
342
- .salmex-modal-title-wrap:focus-visible {
343
- outline: 2px solid rgb(var(--salmex-crown-yellow));
333
+ .sx-modal-title-wrap:focus-visible {
334
+ outline: 2px solid var(--sx-color-primary);
344
335
  outline-offset: 2px;
345
336
  }
346
337
 
347
- .salmex-modal-title {
338
+ .sx-modal-title {
348
339
  margin: 0;
349
- font-size: var(--salmex-font-size-md);
350
- font-weight: 900;
351
- letter-spacing: 0.5px;
340
+ font-family: var(--sx-font-display);
341
+ font-size: var(--sx-text-lg);
342
+ font-weight: 600;
352
343
  line-height: 1.3;
353
- text-shadow: 1px 1px 2px rgb(0 0 0 / 0.3);
344
+ color: var(--sx-color-text);
354
345
  }
355
346
 
356
- .salmex-modal-close {
347
+ /* ========================================
348
+ CLOSE BUTTON
349
+ ======================================== */
350
+ .sx-modal-close {
357
351
  display: flex;
358
352
  align-items: center;
359
353
  justify-content: center;
360
354
  width: 32px;
361
355
  height: 32px;
362
356
  padding: 0;
363
- background: rgb(var(--salmex-button-face));
364
- border: 1px solid rgb(var(--salmex-button-dark-edge));
365
- border-radius: var(--salmex-radius-sm);
366
- color: rgb(var(--salmex-text-primary));
357
+ background: transparent;
358
+ border: 1px solid transparent;
359
+ border-radius: var(--sx-radius-sm);
360
+ color: var(--sx-color-text-secondary);
367
361
  cursor: pointer;
368
362
  flex-shrink: 0;
369
- box-shadow:
370
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
371
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
372
- 2px 2px 0 rgb(0 0 0 / 0.3);
373
- transition: all var(--salmex-transition-fast);
363
+ transition:
364
+ color var(--sx-transition-fast),
365
+ background var(--sx-transition-fast);
374
366
  }
375
367
 
376
- .salmex-modal-close:hover {
377
- background: rgb(var(--salmex-button-light));
368
+ .sx-modal-close:hover {
369
+ background: var(--sx-color-surface-3);
370
+ color: var(--sx-color-text);
378
371
  }
379
372
 
380
- .salmex-modal-close:active {
381
- box-shadow:
382
- inset -1px -1px 0 rgb(var(--salmex-button-highlight)),
383
- inset 1px 1px 0 rgb(var(--salmex-button-shadow)),
384
- 1px 1px 0 rgb(0 0 0 / 0.3);
385
- transform: translate(1px, 1px);
373
+ .sx-modal-close:active {
374
+ background: var(--sx-color-surface-3);
375
+ color: var(--sx-color-text);
386
376
  }
387
377
 
388
- .salmex-modal-close:focus-visible {
389
- outline: none;
390
- box-shadow:
391
- inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
392
- inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
393
- 2px 2px 0 rgb(0 0 0 / 0.3),
394
- 0 0 0 2px rgb(var(--salmex-midnight-black)),
395
- 0 0 2px 4px rgb(var(--salmex-crown-yellow));
378
+ .sx-modal-close:focus-visible {
379
+ outline: 2px solid var(--sx-color-primary);
380
+ outline-offset: 2px;
396
381
  }
397
382
 
398
- .salmex-modal-body {
399
- padding: var(--salmex-space-6);
383
+ /* ========================================
384
+ BODY
385
+ ======================================== */
386
+ .sx-modal-body {
387
+ padding: var(--sx-space-6);
400
388
  flex: 1;
401
389
  min-height: 0;
402
- font-family: var(--salmex-font-system);
403
- color: rgb(var(--salmex-text-primary));
390
+ color: var(--sx-color-text-secondary);
404
391
  }
405
392
 
406
- .salmex-modal-footer {
393
+ /* ========================================
394
+ FOOTER
395
+ ======================================== */
396
+ .sx-modal-footer {
407
397
  display: flex;
408
398
  align-items: center;
409
399
  justify-content: flex-end;
410
- gap: var(--salmex-space-3);
411
- padding: var(--salmex-space-4);
412
- border-top: 2px solid rgb(var(--salmex-button-dark-edge));
413
- border-radius: 0 0 calc(var(--salmex-radius-md) - 2px) calc(var(--salmex-radius-md) - 2px);
414
- background: rgb(var(--salmex-bg-secondary));
400
+ gap: var(--sx-space-3);
401
+ padding: var(--sx-space-4);
402
+ border-top: 1px solid var(--sx-color-border);
403
+ border-radius: 0 0 calc(var(--sx-radius-lg) - 1px) calc(var(--sx-radius-lg) - 1px);
404
+ background: var(--sx-color-surface-2);
415
405
  flex-shrink: 0;
416
406
  }
417
407
 
408
+ /* ========================================
409
+ REDUCED MOTION
410
+ ======================================== */
418
411
  @media (prefers-reduced-motion: reduce) {
419
- .salmex-modal-backdrop,
420
- .salmex-modal-container {
412
+ .sx-modal-backdrop,
413
+ .sx-modal-container {
421
414
  animation: none;
422
415
  }
423
416
  }
424
417
 
418
+ /* ========================================
419
+ MOBILE
420
+ ======================================== */
425
421
  @media (max-width: 640px) {
426
- .salmex-modal-backdrop {
422
+ .sx-modal-backdrop {
427
423
  padding: 0;
428
424
  align-items: flex-end;
429
425
  }
430
426
 
431
- .salmex-modal-position-top {
427
+ .sx-modal-position-top {
432
428
  padding-top: 0;
433
429
  }
434
430
 
435
- .salmex-modal-container {
431
+ .sx-modal-container {
436
432
  max-width: 100%;
437
433
  max-height: 90vh;
438
434
  margin: 0;
@@ -31,7 +31,7 @@ interface Props {
31
31
  /**
32
32
  * Modal
33
33
  *
34
- * Win2K × Basquiat — Dialog with canvas surface, bold 3px border, title bar header.
34
+ * INFRARED — Dialog with glass surface, subtle border, clean header.
35
35
  * Follows WAI-ARIA Dialog (Modal) pattern: focus trap, restore focus on close,
36
36
  * aria-labelledby, aria-describedby, aria-modal. Escape and backdrop close.
37
37
  * For full inert support (background not focusable), render modal in a portal