@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.
Files changed (110) 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 +115 -221
  8. package/dist/feedback/Alert/Alert.svelte.d.ts +1 -1
  9. package/dist/feedback/ProgressBar/ProgressBar.svelte +246 -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 +153 -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 +82 -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 +151 -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 +64 -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/navigation/CommandPalette/CommandPalette.svelte +407 -189
  72. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts +8 -3
  73. package/dist/navigation/CommandPalette/CommandPalette.svelte.d.ts.map +1 -1
  74. package/dist/navigation/Tabs/Tabs.svelte +95 -181
  75. package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
  76. package/dist/primitives/Badge/Badge.svelte +83 -220
  77. package/dist/primitives/Badge/Badge.svelte.d.ts +2 -2
  78. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -1
  79. package/dist/primitives/Button/Button.svelte +144 -195
  80. package/dist/primitives/Button/Button.svelte.d.ts +3 -3
  81. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  82. package/dist/primitives/Tooltip/Tooltip.svelte +260 -0
  83. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts +36 -0
  84. package/dist/primitives/Tooltip/Tooltip.svelte.d.ts.map +1 -0
  85. package/dist/primitives/Tooltip/index.d.ts +2 -0
  86. package/dist/primitives/Tooltip/index.d.ts.map +1 -0
  87. package/dist/primitives/Tooltip/index.js +1 -0
  88. package/dist/primitives/index.d.ts +1 -0
  89. package/dist/primitives/index.d.ts.map +1 -1
  90. package/dist/primitives/index.js +1 -0
  91. package/dist/styles/tokens.css +197 -265
  92. package/package.json +5 -5
  93. package/dist/windowing/Window/Window.svelte +0 -637
  94. package/dist/windowing/Window/Window.svelte.d.ts +0 -65
  95. package/dist/windowing/Window/Window.svelte.d.ts.map +0 -1
  96. package/dist/windowing/Window/index.d.ts +0 -2
  97. package/dist/windowing/Window/index.d.ts.map +0 -1
  98. package/dist/windowing/Window/index.js +0 -1
  99. package/dist/windowing/WindowManager/WindowManager.svelte +0 -425
  100. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts +0 -38
  101. package/dist/windowing/WindowManager/WindowManager.svelte.d.ts.map +0 -1
  102. package/dist/windowing/WindowManager/index.d.ts +0 -2
  103. package/dist/windowing/WindowManager/index.d.ts.map +0 -1
  104. package/dist/windowing/WindowManager/index.js +0 -1
  105. package/dist/windowing/index.d.ts +0 -5
  106. package/dist/windowing/index.d.ts.map +0 -1
  107. package/dist/windowing/index.js +0 -3
  108. package/dist/windowing/windowStore.svelte.d.ts +0 -49
  109. package/dist/windowing/windowStore.svelte.d.ts.map +0 -1
  110. package/dist/windowing/windowStore.svelte.js +0 -170
@@ -0,0 +1,260 @@
1
+ <!--
2
+ @component Tooltip
3
+
4
+ Neo-Brutalist Dark — Accessible tooltip with configurable placement,
5
+ keyboard support, hover/focus triggers, and arrow indicator.
6
+ Uses fixed positioning with smart viewport-aware flipping.
7
+
8
+ @example
9
+ <Tooltip text="Save document">
10
+ <button>Save</button>
11
+ </Tooltip>
12
+ <Tooltip text="Copy to clipboard" placement="right" delay={200}>
13
+ <button>Copy</button>
14
+ </Tooltip>
15
+ -->
16
+ <script lang="ts">
17
+ import type { Snippet } from 'svelte';
18
+ import { cn } from '../../utils/cn.js';
19
+ import { tick } from 'svelte';
20
+
21
+ type Placement = 'top' | 'bottom' | 'left' | 'right';
22
+
23
+ interface Props {
24
+ /** Tooltip text content. */
25
+ text: string;
26
+ /** Preferred placement relative to the trigger element. */
27
+ placement?: Placement;
28
+ /** Delay in ms before showing the tooltip. */
29
+ delay?: number;
30
+ /** Disable the tooltip (still renders children). */
31
+ disabled?: boolean;
32
+ /** The trigger element(s). */
33
+ children: Snippet;
34
+ /** Additional CSS class for the tooltip bubble. */
35
+ class?: string;
36
+ testId?: string;
37
+ }
38
+
39
+ let {
40
+ text,
41
+ placement = 'top',
42
+ delay = 300,
43
+ disabled = false,
44
+ children,
45
+ class: className = '',
46
+ testId
47
+ }: Props = $props();
48
+
49
+ let visible = $state(false);
50
+ let triggerEl = $state<HTMLElement | null>(null);
51
+ let tooltipEl = $state<HTMLElement | null>(null);
52
+ let showTimer: ReturnType<typeof setTimeout> | undefined;
53
+ let hideTimer: ReturnType<typeof setTimeout> | undefined;
54
+
55
+ const tooltipId = `tooltip-${Math.random().toString(36).slice(2, 9)}`;
56
+
57
+ let placementOverride = $state<Placement | null>(null);
58
+ let computedTop = $state('0');
59
+ let computedLeft = $state('0');
60
+
61
+ const computedPlacement = $derived(placementOverride ?? placement);
62
+
63
+ function show() {
64
+ if (disabled) return;
65
+ clearTimeout(hideTimer);
66
+ showTimer = setTimeout(async () => {
67
+ visible = true;
68
+ await tick();
69
+ positionTooltip();
70
+ }, delay);
71
+ }
72
+
73
+ function hide() {
74
+ clearTimeout(showTimer);
75
+ hideTimer = setTimeout(() => {
76
+ visible = false;
77
+ placementOverride = null;
78
+ }, 100);
79
+ }
80
+
81
+ function handleKeydown(e: KeyboardEvent) {
82
+ if (e.key === 'Escape' && visible) {
83
+ e.stopPropagation();
84
+ visible = false;
85
+ }
86
+ }
87
+
88
+ function positionTooltip() {
89
+ if (!triggerEl || !tooltipEl) return;
90
+
91
+ const triggerRect = triggerEl.getBoundingClientRect();
92
+ const tooltipRect = tooltipEl.getBoundingClientRect();
93
+ const gap = 8;
94
+
95
+ let top = 0;
96
+ let left = 0;
97
+ let finalPlacement = placement;
98
+
99
+ // Calculate position based on placement
100
+ switch (placement) {
101
+ case 'top':
102
+ top = triggerRect.top - tooltipRect.height - gap;
103
+ left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;
104
+ if (top < 0) {
105
+ finalPlacement = 'bottom';
106
+ top = triggerRect.bottom + gap;
107
+ }
108
+ break;
109
+ case 'bottom':
110
+ top = triggerRect.bottom + gap;
111
+ left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2;
112
+ if (top + tooltipRect.height > window.innerHeight) {
113
+ finalPlacement = 'top';
114
+ top = triggerRect.top - tooltipRect.height - gap;
115
+ }
116
+ break;
117
+ case 'left':
118
+ top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;
119
+ left = triggerRect.left - tooltipRect.width - gap;
120
+ if (left < 0) {
121
+ finalPlacement = 'right';
122
+ left = triggerRect.right + gap;
123
+ }
124
+ break;
125
+ case 'right':
126
+ top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2;
127
+ left = triggerRect.right + gap;
128
+ if (left + tooltipRect.width > window.innerWidth) {
129
+ finalPlacement = 'left';
130
+ left = triggerRect.left - tooltipRect.width - gap;
131
+ }
132
+ break;
133
+ }
134
+
135
+ // Clamp to viewport
136
+ left = Math.max(8, Math.min(left, window.innerWidth - tooltipRect.width - 8));
137
+ top = Math.max(8, Math.min(top, window.innerHeight - tooltipRect.height - 8));
138
+
139
+ computedTop = `${top}px`;
140
+ computedLeft = `${left}px`;
141
+ placementOverride = finalPlacement;
142
+ }
143
+ </script>
144
+
145
+ <svelte:window onkeydown={handleKeydown} />
146
+
147
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
148
+ <span
149
+ bind:this={triggerEl}
150
+ class="sx-tooltip-trigger"
151
+ onmouseenter={show}
152
+ onmouseleave={hide}
153
+ onfocusin={show}
154
+ onfocusout={hide}
155
+ aria-describedby={visible ? tooltipId : undefined}
156
+ >
157
+ {@render children()}
158
+ </span>
159
+
160
+ {#if visible && text}
161
+ <div
162
+ bind:this={tooltipEl}
163
+ id={tooltipId}
164
+ role="tooltip"
165
+ class={cn(
166
+ 'sx-tooltip',
167
+ `sx-tooltip-${computedPlacement}`,
168
+ className
169
+ )}
170
+ style="top: {computedTop}; left: {computedLeft};"
171
+ data-testid={testId}
172
+ >
173
+ {text}
174
+ <span class="sx-tooltip-arrow" aria-hidden="true"></span>
175
+ </div>
176
+ {/if}
177
+
178
+ <style>
179
+ .sx-tooltip-trigger {
180
+ display: inline-flex;
181
+ }
182
+
183
+ .sx-tooltip {
184
+ position: fixed;
185
+ z-index: var(--sx-z-tooltip);
186
+ max-width: 240px;
187
+ padding: var(--sx-space-1-5) var(--sx-space-3);
188
+ background: var(--sx-color-surface-3);
189
+ border: 1px solid var(--sx-color-border-strong);
190
+ border-radius: var(--sx-radius-sm);
191
+ font-family: var(--sx-font-body);
192
+ font-size: var(--sx-text-xs);
193
+ font-weight: 500;
194
+ color: var(--sx-color-text);
195
+ line-height: var(--sx-leading-normal);
196
+ box-shadow: var(--sx-shadow-lg);
197
+ pointer-events: none;
198
+ animation: sx-tooltip-in 150ms var(--sx-ease-out) both;
199
+ word-wrap: break-word;
200
+ }
201
+
202
+ /* Arrow */
203
+ .sx-tooltip-arrow {
204
+ position: absolute;
205
+ width: 8px;
206
+ height: 8px;
207
+ background: var(--sx-color-surface-3);
208
+ border: 1px solid var(--sx-color-border-strong);
209
+ transform: rotate(45deg);
210
+ }
211
+
212
+ .sx-tooltip-top .sx-tooltip-arrow {
213
+ bottom: -5px;
214
+ left: 50%;
215
+ margin-left: -4px;
216
+ border-top: none;
217
+ border-left: none;
218
+ }
219
+
220
+ .sx-tooltip-bottom .sx-tooltip-arrow {
221
+ top: -5px;
222
+ left: 50%;
223
+ margin-left: -4px;
224
+ border-bottom: none;
225
+ border-right: none;
226
+ }
227
+
228
+ .sx-tooltip-left .sx-tooltip-arrow {
229
+ right: -5px;
230
+ top: 50%;
231
+ margin-top: -4px;
232
+ border-bottom: none;
233
+ border-left: none;
234
+ }
235
+
236
+ .sx-tooltip-right .sx-tooltip-arrow {
237
+ left: -5px;
238
+ top: 50%;
239
+ margin-top: -4px;
240
+ border-top: none;
241
+ border-right: none;
242
+ }
243
+
244
+ @keyframes sx-tooltip-in {
245
+ from {
246
+ opacity: 0;
247
+ transform: scale(0.95);
248
+ }
249
+ to {
250
+ opacity: 1;
251
+ transform: scale(1);
252
+ }
253
+ }
254
+
255
+ @media (prefers-reduced-motion: reduce) {
256
+ .sx-tooltip {
257
+ animation: none;
258
+ }
259
+ }
260
+ </style>
@@ -0,0 +1,36 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Placement = 'top' | 'bottom' | 'left' | 'right';
3
+ interface Props {
4
+ /** Tooltip text content. */
5
+ text: string;
6
+ /** Preferred placement relative to the trigger element. */
7
+ placement?: Placement;
8
+ /** Delay in ms before showing the tooltip. */
9
+ delay?: number;
10
+ /** Disable the tooltip (still renders children). */
11
+ disabled?: boolean;
12
+ /** The trigger element(s). */
13
+ children: Snippet;
14
+ /** Additional CSS class for the tooltip bubble. */
15
+ class?: string;
16
+ testId?: string;
17
+ }
18
+ /**
19
+ * Tooltip
20
+ *
21
+ * Neo-Brutalist Dark — Accessible tooltip with configurable placement,
22
+ * keyboard support, hover/focus triggers, and arrow indicator.
23
+ * Uses fixed positioning with smart viewport-aware flipping.
24
+ *
25
+ * @example
26
+ * <Tooltip text="Save document">
27
+ * <button>Save</button>
28
+ * </Tooltip>
29
+ * <Tooltip text="Copy to clipboard" placement="right" delay={200}>
30
+ * <button>Copy</button>
31
+ * </Tooltip>
32
+ */
33
+ declare const Tooltip: import("svelte").Component<Props, {}, "">;
34
+ type Tooltip = ReturnType<typeof Tooltip>;
35
+ export default Tooltip;
36
+ //# sourceMappingURL=Tooltip.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.svelte.d.ts","sourceRoot":"","sources":["../../../src/primitives/Tooltip/Tooltip.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKtC,KAAK,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAErD,UAAU,KAAK;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAyID;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as Tooltip } from './Tooltip.svelte';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/Tooltip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as Tooltip } from './Tooltip.svelte';
@@ -1,3 +1,4 @@
1
1
  export { Button } from './Button/index.js';
2
2
  export { Badge } from './Badge/index.js';
3
+ export { Tooltip } from './Tooltip/index.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/primitives/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/primitives/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { Button } from './Button/index.js';
2
2
  export { Badge } from './Badge/index.js';
3
+ export { Tooltip } from './Tooltip/index.js';