@salmexio/ui 0.3.1 → 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 +96 -93
  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 -102
  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 +88 -154
  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 -103
  37. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +1 -1
  38. package/dist/forms/Select/Select.svelte +136 -177
  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 +148 -164
  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 -40
  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 +410 -181
  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 +94 -178
  75. package/dist/navigation/Tabs/Tabs.svelte.d.ts +2 -2
  76. package/dist/primitives/Badge/Badge.svelte +85 -223
  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 +138 -208
  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 +200 -259
  92. package/package.json +5 -5
  93. package/dist/windowing/Window/Window.svelte +0 -602
  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 -410
  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';