@salmexio/ui 0.4.0 → 1.0.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/README.md +52 -3
- package/dist/dialogs/ContextMenu/ContextMenu.svelte +97 -94
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts +3 -2
- package/dist/dialogs/ContextMenu/ContextMenu.svelte.d.ts.map +1 -1
- package/dist/dialogs/Modal/Modal.svelte +112 -116
- package/dist/dialogs/Modal/Modal.svelte.d.ts +1 -1
- package/dist/feedback/Alert/Alert.svelte +115 -221
- package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
- package/dist/feedback/ProgressBar/ProgressBar.svelte +246 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +40 -0
- package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.d.ts +2 -0
- package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
- package/dist/feedback/ProgressBar/index.js +1 -0
- package/dist/feedback/Skeleton/Skeleton.svelte +153 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +37 -0
- package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.d.ts +2 -0
- package/dist/feedback/Skeleton/index.d.ts.map +1 -0
- package/dist/feedback/Skeleton/index.js +1 -0
- package/dist/feedback/Spinner/Spinner.svelte +86 -151
- package/dist/feedback/Spinner/Spinner.svelte.d.ts +5 -3
- package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/feedback/Toast/Toaster.svelte +431 -0
- package/dist/feedback/Toast/Toaster.svelte.d.ts +22 -0
- package/dist/feedback/Toast/Toaster.svelte.d.ts.map +1 -0
- package/dist/feedback/Toast/index.d.ts +4 -0
- package/dist/feedback/Toast/index.d.ts.map +1 -0
- package/dist/feedback/Toast/index.js +2 -0
- package/dist/feedback/Toast/toastStore.d.ts +34 -0
- package/dist/feedback/Toast/toastStore.d.ts.map +1 -0
- package/dist/feedback/Toast/toastStore.js +43 -0
- package/dist/feedback/index.d.ts +4 -0
- package/dist/feedback/index.d.ts.map +1 -1
- package/dist/feedback/index.js +3 -0
- package/dist/forms/Checkbox/Checkbox.svelte +82 -104
- package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/forms/Select/Select.svelte +137 -179
- package/dist/forms/Select/Select.svelte.d.ts +1 -1
- package/dist/forms/Slider/Slider.svelte +356 -0
- package/dist/forms/Slider/Slider.svelte.d.ts +50 -0
- package/dist/forms/Slider/Slider.svelte.d.ts.map +1 -0
- package/dist/forms/Slider/index.d.ts +2 -0
- package/dist/forms/Slider/index.d.ts.map +1 -0
- package/dist/forms/Slider/index.js +1 -0
- package/dist/forms/TextInput/TextInput.svelte +151 -167
- package/dist/forms/TextInput/TextInput.svelte.d.ts +1 -1
- package/dist/forms/Textarea/Textarea.svelte +615 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts +47 -0
- package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
- package/dist/forms/Textarea/index.d.ts +2 -0
- package/dist/forms/Textarea/index.d.ts.map +1 -0
- package/dist/forms/Textarea/index.js +1 -0
- package/dist/forms/Toggle/Toggle.svelte +239 -0
- package/dist/forms/Toggle/Toggle.svelte.d.ts +39 -0
- package/dist/forms/Toggle/Toggle.svelte.d.ts.map +1 -0
- package/dist/forms/Toggle/index.d.ts +2 -0
- package/dist/forms/Toggle/index.d.ts.map +1 -0
- package/dist/forms/Toggle/index.js +1 -0
- package/dist/forms/index.d.ts +3 -0
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +3 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/layout/Card/Card.svelte +64 -39
- package/dist/layout/Card/Card.svelte.d.ts +1 -1
- package/dist/layout/Card/Card.svelte.d.ts.map +1 -1
- package/dist/layout/Container/Container.svelte +71 -71
- package/dist/layout/Container/Container.svelte.d.ts +2 -2
- package/dist/navigation/CommandPalette/CommandPalette.svelte +407 -189
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
- package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
- package/dist/navigation/Tabs/Tabs.svelte +95 -181
- package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
- package/dist/primitives/Badge/Badge.svelte +83 -220
- package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
- package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
- package/dist/primitives/Button/Button.svelte +144 -195
- package/dist/primitives/Button/Button.svelte.d.ts +3 -3
- package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
- package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
- package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
- package/dist/primitives/Tooltip/index.d.ts +2 -0
- package/dist/primitives/Tooltip/index.d.ts.map +1 -0
- package/dist/primitives/Tooltip/index.js +1 -0
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +1 -0
- package/dist/styles/tokens.css +197 -265
- package/package.json +5 -5
- package/dist/windowing/Window/Window.svelte +0 -637
- package/dist/windowing/Window/Window.svelte.d.ts +0 -65
- package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
- package/dist/windowing/Window/index.d.ts +0 -2
- package/dist/windowing/Window/index.d.ts.map +0 -1
- package/dist/windowing/Window/index.js +0 -1
- package/dist/windowing/WindowManager/WindowManager.svelte +0 -425
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
- package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
- package/dist/windowing/WindowManager/index.d.ts +0 -2
- package/dist/windowing/WindowManager/index.d.ts.map +0 -1
- package/dist/windowing/WindowManager/index.js +0 -1
- package/dist/windowing/index.d.ts +0 -5
- package/dist/windowing/index.d.ts.map +0 -1
- package/dist/windowing/index.js +0 -3
- package/dist/windowing/windowStore.svelte.d.ts +0 -49
- package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
- package/dist/windowing/windowStore.svelte.js +0 -170
package/README.md
CHANGED
|
@@ -1,7 +1,56 @@
|
|
|
1
1
|
# @salmexio/ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Neo-Brutalist Dark component library for Salmex I/O products. Built with Svelte 5 and TypeScript.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @salmexio/ui
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```svelte
|
|
14
|
+
<script>
|
|
15
|
+
import { Button, TextInput, Card } from '@salmexio/ui';
|
|
16
|
+
import '@salmexio/ui/styles';
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<Card>
|
|
20
|
+
<TextInput label="Name" placeholder="Enter your name" />
|
|
21
|
+
<Button variant="primary">Submit</Button>
|
|
22
|
+
</Card>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Components
|
|
26
|
+
|
|
27
|
+
| Category | Components |
|
|
28
|
+
|---|---|
|
|
29
|
+
| **Primitives** | Button, Badge, Tooltip |
|
|
30
|
+
| **Layout** | Card, Container |
|
|
31
|
+
| **Forms** | TextInput, Textarea, Checkbox, Select, Slider, Toggle |
|
|
32
|
+
| **Feedback** | Alert, Spinner, Toast, ProgressBar, Skeleton |
|
|
33
|
+
| **Navigation** | Tabs, CommandPalette |
|
|
34
|
+
| **Dialogs** | Modal, ContextMenu |
|
|
35
|
+
|
|
36
|
+
## Exports
|
|
37
|
+
|
|
38
|
+
- `@salmexio/ui` — All components
|
|
39
|
+
- `@salmexio/ui/styles` — Design tokens CSS
|
|
40
|
+
- `@salmexio/ui/primitives` — Primitive components only
|
|
41
|
+
- `@salmexio/ui/navigation` — Navigation components only
|
|
42
|
+
- `@salmexio/ui/utils` — Utilities (cn)
|
|
43
|
+
|
|
44
|
+
## Development
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pnpm dev # Watch mode
|
|
48
|
+
pnpm build # Build for production
|
|
49
|
+
pnpm test # Run tests
|
|
50
|
+
pnpm check # Type check
|
|
51
|
+
pnpm lint # Lint code
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## License
|
|
55
|
+
|
|
56
|
+
UNLICENSED — (c) 2026 Salmen Hichri
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component ContextMenu
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Neo-Brutalist Dark — Right-click context menu with glass panel, keyboard navigation,
|
|
5
5
|
separators, section headers, submenus, and keyboard shortcut hints.
|
|
6
6
|
|
|
7
7
|
@example
|
|
@@ -19,12 +19,14 @@
|
|
|
19
19
|
</div>
|
|
20
20
|
-->
|
|
21
21
|
<script lang="ts" module>
|
|
22
|
+
import type { Snippet } from 'svelte';
|
|
23
|
+
|
|
22
24
|
export interface MenuItem {
|
|
23
25
|
type: 'item';
|
|
24
26
|
label: string;
|
|
25
27
|
shortcut?: string;
|
|
26
28
|
disabled?: boolean;
|
|
27
|
-
icon?:
|
|
29
|
+
icon?: Snippet;
|
|
28
30
|
action?: () => void;
|
|
29
31
|
children?: MenuItemOrSeparator[];
|
|
30
32
|
}
|
|
@@ -259,7 +261,7 @@ onMount(() => {
|
|
|
259
261
|
<!-- svelte-ignore a11y_no_noninteractive_element_interactions a11y_click_events_have_key_events -->
|
|
260
262
|
<div
|
|
261
263
|
bind:this={menuEl}
|
|
262
|
-
class={cn('
|
|
264
|
+
class={cn('sx-context', className)}
|
|
263
265
|
style="left: {posX}px; top: {posY}px;"
|
|
264
266
|
role="menu"
|
|
265
267
|
tabindex="-1"
|
|
@@ -268,16 +270,16 @@ onMount(() => {
|
|
|
268
270
|
>
|
|
269
271
|
{#each items as item, i}
|
|
270
272
|
{#if item.type === 'separator'}
|
|
271
|
-
<div class="
|
|
273
|
+
<div class="sx-context-separator" role="separator"></div>
|
|
272
274
|
{:else if item.type === 'group'}
|
|
273
|
-
<div class="
|
|
275
|
+
<div class="sx-context-group-label">{item.label}</div>
|
|
274
276
|
{#each item.items as groupItem}
|
|
275
277
|
{#if groupItem.type === 'item'}
|
|
276
278
|
<!-- svelte-ignore a11y_no_noninteractive_element_interactions a11y_click_events_have_key_events -->
|
|
277
279
|
<div
|
|
278
280
|
class={cn(
|
|
279
|
-
'
|
|
280
|
-
groupItem.disabled && '
|
|
281
|
+
'sx-context-item',
|
|
282
|
+
groupItem.disabled && 'sx-context-item-disabled'
|
|
281
283
|
)}
|
|
282
284
|
role="menuitem"
|
|
283
285
|
tabindex="-1"
|
|
@@ -287,26 +289,26 @@ onMount(() => {
|
|
|
287
289
|
onmouseenter={() => { if (!groupItem.disabled) { activeIndex = -1; openSubmenuIndex = -1; } }}
|
|
288
290
|
>
|
|
289
291
|
{#if groupItem.icon}
|
|
290
|
-
<span class="
|
|
292
|
+
<span class="sx-context-icon" aria-hidden="true">{@render groupItem.icon()}</span>
|
|
291
293
|
{:else}
|
|
292
|
-
<span class="
|
|
294
|
+
<span class="sx-context-icon-spacer"></span>
|
|
293
295
|
{/if}
|
|
294
|
-
<span class="
|
|
296
|
+
<span class="sx-context-label">{groupItem.label}</span>
|
|
295
297
|
{#if groupItem.shortcut}
|
|
296
|
-
<span class="
|
|
298
|
+
<span class="sx-context-shortcut">{groupItem.shortcut}</span>
|
|
297
299
|
{/if}
|
|
298
300
|
</div>
|
|
299
301
|
{:else if groupItem.type === 'separator'}
|
|
300
|
-
<div class="
|
|
302
|
+
<div class="sx-context-separator" role="separator"></div>
|
|
301
303
|
{/if}
|
|
302
304
|
{/each}
|
|
303
305
|
{:else if item.type === 'item'}
|
|
304
306
|
<!-- svelte-ignore a11y_no_noninteractive_element_interactions a11y_click_events_have_key_events -->
|
|
305
307
|
<div
|
|
306
308
|
class={cn(
|
|
307
|
-
'
|
|
308
|
-
i === activeIndex && '
|
|
309
|
-
item.disabled && '
|
|
309
|
+
'sx-context-item',
|
|
310
|
+
i === activeIndex && 'sx-context-item-active',
|
|
311
|
+
item.disabled && 'sx-context-item-disabled'
|
|
310
312
|
)}
|
|
311
313
|
role="menuitem"
|
|
312
314
|
tabindex="-1"
|
|
@@ -317,35 +319,35 @@ onMount(() => {
|
|
|
317
319
|
onkeydown={handleKeydown}
|
|
318
320
|
>
|
|
319
321
|
{#if item.icon}
|
|
320
|
-
<span class="
|
|
322
|
+
<span class="sx-context-icon" aria-hidden="true">{@render item.icon()}</span>
|
|
321
323
|
{:else}
|
|
322
|
-
<span class="
|
|
324
|
+
<span class="sx-context-icon-spacer"></span>
|
|
323
325
|
{/if}
|
|
324
|
-
<span class="
|
|
326
|
+
<span class="sx-context-label">{item.label}</span>
|
|
325
327
|
{#if item.children?.length}
|
|
326
|
-
<span class="
|
|
328
|
+
<span class="sx-context-submenu-arrow" aria-hidden="true">▶</span>
|
|
327
329
|
{:else if item.shortcut}
|
|
328
|
-
<span class="
|
|
330
|
+
<span class="sx-context-shortcut">{item.shortcut}</span>
|
|
329
331
|
{/if}
|
|
330
332
|
</div>
|
|
331
333
|
|
|
332
334
|
<!-- Submenu -->
|
|
333
335
|
{#if openSubmenuIndex === i && item.children?.length}
|
|
334
336
|
<div
|
|
335
|
-
class="
|
|
337
|
+
class="sx-context sx-context-submenu"
|
|
336
338
|
style="left: {submenuPosX}px; top: {submenuPosY}px;"
|
|
337
339
|
role="menu"
|
|
338
340
|
>
|
|
339
341
|
{#each item.children as subItem, si}
|
|
340
342
|
{#if subItem.type === 'separator'}
|
|
341
|
-
<div class="
|
|
343
|
+
<div class="sx-context-separator" role="separator"></div>
|
|
342
344
|
{:else if subItem.type === 'item'}
|
|
343
345
|
<!-- svelte-ignore a11y_no_noninteractive_element_interactions a11y_click_events_have_key_events -->
|
|
344
346
|
<div
|
|
345
347
|
class={cn(
|
|
346
|
-
'
|
|
347
|
-
si === submenuActiveIndex && '
|
|
348
|
-
subItem.disabled && '
|
|
348
|
+
'sx-context-item',
|
|
349
|
+
si === submenuActiveIndex && 'sx-context-item-active',
|
|
350
|
+
subItem.disabled && 'sx-context-item-disabled'
|
|
349
351
|
)}
|
|
350
352
|
role="menuitem"
|
|
351
353
|
tabindex="-1"
|
|
@@ -355,13 +357,13 @@ onMount(() => {
|
|
|
355
357
|
onkeydown={handleKeydown}
|
|
356
358
|
>
|
|
357
359
|
{#if subItem.icon}
|
|
358
|
-
<span class="
|
|
360
|
+
<span class="sx-context-icon" aria-hidden="true">{@render subItem.icon()}</span>
|
|
359
361
|
{:else}
|
|
360
|
-
<span class="
|
|
362
|
+
<span class="sx-context-icon-spacer"></span>
|
|
361
363
|
{/if}
|
|
362
|
-
<span class="
|
|
364
|
+
<span class="sx-context-label">{subItem.label}</span>
|
|
363
365
|
{#if subItem.shortcut}
|
|
364
|
-
<span class="
|
|
366
|
+
<span class="sx-context-shortcut">{subItem.shortcut}</span>
|
|
365
367
|
{/if}
|
|
366
368
|
</div>
|
|
367
369
|
{/if}
|
|
@@ -375,82 +377,83 @@ onMount(() => {
|
|
|
375
377
|
|
|
376
378
|
<style>
|
|
377
379
|
/* ========================================
|
|
378
|
-
MENU PANEL
|
|
380
|
+
MENU PANEL
|
|
379
381
|
======================================== */
|
|
380
|
-
.
|
|
382
|
+
.sx-context {
|
|
381
383
|
position: fixed;
|
|
382
|
-
z-index: var(--
|
|
384
|
+
z-index: var(--sx-z-popover, 1060);
|
|
383
385
|
min-width: 180px;
|
|
384
386
|
max-width: 320px;
|
|
385
|
-
background:
|
|
386
|
-
border:
|
|
387
|
-
border-radius: var(--
|
|
388
|
-
box-shadow:
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
4px 4px 2px rgb(0 0 0 / 0.3);
|
|
392
|
-
padding: var(--salmex-space-1) 0;
|
|
387
|
+
background: var(--sx-color-surface-2);
|
|
388
|
+
border: 1px solid var(--sx-color-border-strong);
|
|
389
|
+
border-radius: var(--sx-radius-md);
|
|
390
|
+
box-shadow: var(--sx-shadow-lg);
|
|
391
|
+
backdrop-filter: var(--sx-glass-blur);
|
|
392
|
+
padding: var(--sx-space-1) 0;
|
|
393
393
|
outline: none;
|
|
394
|
-
font-family: var(--salmex-font-system);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
:global([data-theme='dark']) .salmex-ctx {
|
|
398
|
-
box-shadow:
|
|
399
|
-
inset 1px 1px 0 rgb(var(--salmex-button-highlight)),
|
|
400
|
-
inset -1px -1px 0 rgb(var(--salmex-button-shadow)),
|
|
401
|
-
4px 4px 2px rgb(0 0 0 / 0.6);
|
|
402
394
|
}
|
|
403
395
|
|
|
404
396
|
/* ========================================
|
|
405
397
|
SUBMENU — Positioned relative to parent
|
|
406
398
|
======================================== */
|
|
407
|
-
.
|
|
399
|
+
.sx-context-submenu {
|
|
408
400
|
position: absolute;
|
|
409
401
|
}
|
|
410
402
|
|
|
411
403
|
/* ========================================
|
|
412
404
|
MENU ITEM
|
|
413
405
|
======================================== */
|
|
414
|
-
.
|
|
406
|
+
.sx-context-item {
|
|
415
407
|
display: flex;
|
|
416
408
|
align-items: center;
|
|
417
|
-
gap: var(--
|
|
418
|
-
padding: var(--
|
|
419
|
-
|
|
420
|
-
font-
|
|
421
|
-
color:
|
|
409
|
+
gap: var(--sx-space-2);
|
|
410
|
+
padding: var(--sx-space-2) var(--sx-space-3);
|
|
411
|
+
margin: 0 var(--sx-space-1);
|
|
412
|
+
font-size: var(--sx-text-sm);
|
|
413
|
+
color: var(--sx-color-text);
|
|
422
414
|
cursor: pointer;
|
|
423
415
|
user-select: none;
|
|
424
416
|
white-space: nowrap;
|
|
425
|
-
|
|
417
|
+
border-radius: var(--sx-radius-sm);
|
|
418
|
+
transition:
|
|
419
|
+
background var(--sx-transition-fast),
|
|
420
|
+
color var(--sx-transition-fast);
|
|
426
421
|
}
|
|
427
422
|
|
|
428
|
-
.
|
|
429
|
-
background:
|
|
430
|
-
color:
|
|
423
|
+
.sx-context-item-active {
|
|
424
|
+
background: var(--sx-color-cyan-hover);
|
|
425
|
+
color: var(--sx-color-cyan);
|
|
431
426
|
}
|
|
432
427
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
428
|
+
.sx-context-item-disabled {
|
|
429
|
+
color: var(--sx-color-text-disabled);
|
|
430
|
+
cursor: not-allowed;
|
|
436
431
|
}
|
|
437
432
|
|
|
438
|
-
.
|
|
439
|
-
|
|
440
|
-
|
|
433
|
+
.sx-context-item-disabled:hover,
|
|
434
|
+
.sx-context-item-disabled.sx-context-item-active {
|
|
435
|
+
background: transparent;
|
|
436
|
+
color: var(--sx-color-text-disabled);
|
|
441
437
|
}
|
|
442
438
|
|
|
443
439
|
/* ========================================
|
|
444
440
|
ICON
|
|
445
441
|
======================================== */
|
|
446
|
-
.
|
|
442
|
+
.sx-context-icon {
|
|
447
443
|
flex-shrink: 0;
|
|
448
444
|
width: 16px;
|
|
449
|
-
|
|
450
|
-
|
|
445
|
+
height: 16px;
|
|
446
|
+
display: flex;
|
|
447
|
+
align-items: center;
|
|
448
|
+
justify-content: center;
|
|
449
|
+
color: var(--sx-color-text-secondary);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.sx-context-item-active .sx-context-icon {
|
|
453
|
+
color: var(--sx-color-cyan);
|
|
451
454
|
}
|
|
452
455
|
|
|
453
|
-
.
|
|
456
|
+
.sx-context-icon-spacer {
|
|
454
457
|
flex-shrink: 0;
|
|
455
458
|
width: 16px;
|
|
456
459
|
}
|
|
@@ -458,55 +461,55 @@ onMount(() => {
|
|
|
458
461
|
/* ========================================
|
|
459
462
|
LABEL & SHORTCUT
|
|
460
463
|
======================================== */
|
|
461
|
-
.
|
|
464
|
+
.sx-context-label {
|
|
462
465
|
flex: 1;
|
|
463
466
|
}
|
|
464
467
|
|
|
465
|
-
.
|
|
466
|
-
margin-left: var(--
|
|
467
|
-
font-size: var(--
|
|
468
|
-
font-family: var(--
|
|
469
|
-
|
|
470
|
-
opacity: 0.6;
|
|
468
|
+
.sx-context-shortcut {
|
|
469
|
+
margin-left: var(--sx-space-6);
|
|
470
|
+
font-size: var(--sx-text-xs);
|
|
471
|
+
font-family: var(--sx-font-mono);
|
|
472
|
+
color: var(--sx-color-text-disabled);
|
|
471
473
|
text-align: right;
|
|
472
474
|
}
|
|
473
475
|
|
|
474
|
-
.
|
|
475
|
-
|
|
476
|
+
.sx-context-item-active .sx-context-shortcut {
|
|
477
|
+
color: var(--sx-color-cyan);
|
|
478
|
+
opacity: 0.7;
|
|
476
479
|
}
|
|
477
480
|
|
|
478
481
|
/* ========================================
|
|
479
482
|
SUBMENU ARROW
|
|
480
483
|
======================================== */
|
|
481
|
-
.
|
|
482
|
-
margin-left: var(--
|
|
484
|
+
.sx-context-submenu-arrow {
|
|
485
|
+
margin-left: var(--sx-space-4);
|
|
483
486
|
font-size: 8px;
|
|
484
|
-
|
|
487
|
+
color: var(--sx-color-text-disabled);
|
|
485
488
|
}
|
|
486
489
|
|
|
487
|
-
.
|
|
488
|
-
|
|
490
|
+
.sx-context-item-active .sx-context-submenu-arrow {
|
|
491
|
+
color: var(--sx-color-cyan);
|
|
489
492
|
}
|
|
490
493
|
|
|
491
494
|
/* ========================================
|
|
492
495
|
SEPARATOR
|
|
493
496
|
======================================== */
|
|
494
|
-
.
|
|
497
|
+
.sx-context-separator {
|
|
495
498
|
height: 0;
|
|
496
|
-
margin: var(--
|
|
497
|
-
border-top: 1px solid
|
|
498
|
-
border-bottom: 1px solid rgb(var(--salmex-button-highlight));
|
|
499
|
+
margin: var(--sx-space-1) var(--sx-space-2);
|
|
500
|
+
border-top: 1px solid var(--sx-color-border);
|
|
499
501
|
}
|
|
500
502
|
|
|
501
503
|
/* ========================================
|
|
502
504
|
GROUP LABEL
|
|
503
505
|
======================================== */
|
|
504
|
-
.
|
|
505
|
-
padding: var(--
|
|
506
|
-
font-size: var(--
|
|
507
|
-
font-weight:
|
|
508
|
-
letter-spacing: 0.
|
|
509
|
-
|
|
506
|
+
.sx-context-group-label {
|
|
507
|
+
padding: var(--sx-space-2) var(--sx-space-3) var(--sx-space-1);
|
|
508
|
+
font-size: var(--sx-text-xs);
|
|
509
|
+
font-weight: 600;
|
|
510
|
+
letter-spacing: 0.05em;
|
|
511
|
+
text-transform: uppercase;
|
|
512
|
+
color: var(--sx-color-text-disabled);
|
|
510
513
|
user-select: none;
|
|
511
514
|
}
|
|
512
515
|
|
|
@@ -514,7 +517,7 @@ onMount(() => {
|
|
|
514
517
|
REDUCED MOTION
|
|
515
518
|
======================================== */
|
|
516
519
|
@media (prefers-reduced-motion: reduce) {
|
|
517
|
-
.
|
|
520
|
+
.sx-context-item {
|
|
518
521
|
transition: none;
|
|
519
522
|
}
|
|
520
523
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
1
2
|
export interface MenuItem {
|
|
2
3
|
type: 'item';
|
|
3
4
|
label: string;
|
|
4
5
|
shortcut?: string;
|
|
5
6
|
disabled?: boolean;
|
|
6
|
-
icon?:
|
|
7
|
+
icon?: Snippet;
|
|
7
8
|
action?: () => void;
|
|
8
9
|
children?: MenuItemOrSeparator[];
|
|
9
10
|
}
|
|
@@ -27,7 +28,7 @@ interface Props {
|
|
|
27
28
|
/**
|
|
28
29
|
* ContextMenu
|
|
29
30
|
*
|
|
30
|
-
*
|
|
31
|
+
* Neo-Brutalist Dark — Right-click context menu with glass panel, keyboard navigation,
|
|
31
32
|
* separators, section headers, submenus, and keyboard shortcut hints.
|
|
32
33
|
*
|
|
33
34
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.svelte.d.ts","sourceRoot":"","sources":["../../../src/dialogs/ContextMenu/ContextMenu.svelte.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"ContextMenu.svelte.d.ts","sourceRoot":"","sources":["../../../src/dialogs/ContextMenu/ContextMenu.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,WAAW,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AAQvE,UAAU,KAAK;IACd,iBAAiB;IACjB,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAsSD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,WAAW;cA5RC,MAAM,KAAK,MAAM;;MA4RsB,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|