@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
@@ -0,0 +1,260 @@
1
+ <!--
2
+ @component Tooltip
3
+
4
+ INFRARED — 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
+ * INFRARED — 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';