@synthaxai/ui 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 (185) hide show
  1. package/README.md +262 -0
  2. package/dist/app.css +2 -0
  3. package/dist/app.html +12 -0
  4. package/dist/data-display/DataTable/DataTable.svelte +773 -0
  5. package/dist/data-display/DataTable/DataTable.svelte.d.ts +120 -0
  6. package/dist/data-display/DataTable/DataTable.svelte.d.ts.map +1 -0
  7. package/dist/data-display/DataTable/index.d.ts +2 -0
  8. package/dist/data-display/DataTable/index.d.ts.map +1 -0
  9. package/dist/data-display/DataTable/index.js +1 -0
  10. package/dist/data-display/StatCard/StatCard.svelte +409 -0
  11. package/dist/data-display/StatCard/StatCard.svelte.d.ts +63 -0
  12. package/dist/data-display/StatCard/StatCard.svelte.d.ts.map +1 -0
  13. package/dist/data-display/StatCard/index.d.ts +2 -0
  14. package/dist/data-display/StatCard/index.d.ts.map +1 -0
  15. package/dist/data-display/StatCard/index.js +1 -0
  16. package/dist/data-display/index.d.ts +8 -0
  17. package/dist/data-display/index.d.ts.map +1 -0
  18. package/dist/data-display/index.js +7 -0
  19. package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte +693 -0
  20. package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte.d.ts +66 -0
  21. package/dist/dialogs/ConfirmDialog/ConfirmDialog.svelte.d.ts.map +1 -0
  22. package/dist/dialogs/ConfirmDialog/index.d.ts +2 -0
  23. package/dist/dialogs/ConfirmDialog/index.d.ts.map +1 -0
  24. package/dist/dialogs/ConfirmDialog/index.js +1 -0
  25. package/dist/dialogs/Modal/Modal.svelte +441 -0
  26. package/dist/dialogs/Modal/Modal.svelte.d.ts +69 -0
  27. package/dist/dialogs/Modal/Modal.svelte.d.ts.map +1 -0
  28. package/dist/dialogs/Modal/index.d.ts +2 -0
  29. package/dist/dialogs/Modal/index.d.ts.map +1 -0
  30. package/dist/dialogs/Modal/index.js +1 -0
  31. package/dist/dialogs/index.d.ts +8 -0
  32. package/dist/dialogs/index.d.ts.map +1 -0
  33. package/dist/dialogs/index.js +7 -0
  34. package/dist/feedback/Alert/Alert.svelte +565 -0
  35. package/dist/feedback/Alert/Alert.svelte.d.ts +60 -0
  36. package/dist/feedback/Alert/Alert.svelte.d.ts.map +1 -0
  37. package/dist/feedback/Alert/index.d.ts +2 -0
  38. package/dist/feedback/Alert/index.d.ts.map +1 -0
  39. package/dist/feedback/Alert/index.js +1 -0
  40. package/dist/feedback/EmptyState/EmptyState.svelte +377 -0
  41. package/dist/feedback/EmptyState/EmptyState.svelte.d.ts +63 -0
  42. package/dist/feedback/EmptyState/EmptyState.svelte.d.ts.map +1 -0
  43. package/dist/feedback/EmptyState/index.d.ts +2 -0
  44. package/dist/feedback/EmptyState/index.d.ts.map +1 -0
  45. package/dist/feedback/EmptyState/index.js +1 -0
  46. package/dist/feedback/ProgressBar/ProgressBar.svelte +585 -0
  47. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts +68 -0
  48. package/dist/feedback/ProgressBar/ProgressBar.svelte.d.ts.map +1 -0
  49. package/dist/feedback/ProgressBar/index.d.ts +2 -0
  50. package/dist/feedback/ProgressBar/index.d.ts.map +1 -0
  51. package/dist/feedback/ProgressBar/index.js +1 -0
  52. package/dist/feedback/Skeleton/Skeleton.svelte +568 -0
  53. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts +54 -0
  54. package/dist/feedback/Skeleton/Skeleton.svelte.d.ts.map +1 -0
  55. package/dist/feedback/Skeleton/index.d.ts +2 -0
  56. package/dist/feedback/Skeleton/index.d.ts.map +1 -0
  57. package/dist/feedback/Skeleton/index.js +1 -0
  58. package/dist/feedback/Spinner/Spinner.svelte +434 -0
  59. package/dist/feedback/Spinner/Spinner.svelte.d.ts +49 -0
  60. package/dist/feedback/Spinner/Spinner.svelte.d.ts.map +1 -0
  61. package/dist/feedback/Spinner/index.d.ts +2 -0
  62. package/dist/feedback/Spinner/index.d.ts.map +1 -0
  63. package/dist/feedback/Spinner/index.js +1 -0
  64. package/dist/feedback/Toast/Toast.svelte +587 -0
  65. package/dist/feedback/Toast/Toast.svelte.d.ts +55 -0
  66. package/dist/feedback/Toast/Toast.svelte.d.ts.map +1 -0
  67. package/dist/feedback/Toast/ToastContainer.svelte +168 -0
  68. package/dist/feedback/Toast/ToastContainer.svelte.d.ts +28 -0
  69. package/dist/feedback/Toast/ToastContainer.svelte.d.ts.map +1 -0
  70. package/dist/feedback/Toast/index.d.ts +4 -0
  71. package/dist/feedback/Toast/index.d.ts.map +1 -0
  72. package/dist/feedback/Toast/index.js +3 -0
  73. package/dist/feedback/Toast/toast-store.d.ts +72 -0
  74. package/dist/feedback/Toast/toast-store.d.ts.map +1 -0
  75. package/dist/feedback/Toast/toast-store.js +157 -0
  76. package/dist/feedback/index.d.ts +13 -0
  77. package/dist/feedback/index.d.ts.map +1 -0
  78. package/dist/feedback/index.js +12 -0
  79. package/dist/forms/Checkbox/Checkbox.svelte +404 -0
  80. package/dist/forms/Checkbox/Checkbox.svelte.d.ts +62 -0
  81. package/dist/forms/Checkbox/Checkbox.svelte.d.ts.map +1 -0
  82. package/dist/forms/Checkbox/index.d.ts +2 -0
  83. package/dist/forms/Checkbox/index.d.ts.map +1 -0
  84. package/dist/forms/Checkbox/index.js +1 -0
  85. package/dist/forms/FormField/FormField.svelte +299 -0
  86. package/dist/forms/FormField/FormField.svelte.d.ts +43 -0
  87. package/dist/forms/FormField/FormField.svelte.d.ts.map +1 -0
  88. package/dist/forms/FormField/index.d.ts +2 -0
  89. package/dist/forms/FormField/index.d.ts.map +1 -0
  90. package/dist/forms/FormField/index.js +1 -0
  91. package/dist/forms/RadioGroup/RadioGroup.svelte +418 -0
  92. package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts +70 -0
  93. package/dist/forms/RadioGroup/RadioGroup.svelte.d.ts.map +1 -0
  94. package/dist/forms/RadioGroup/index.d.ts +2 -0
  95. package/dist/forms/RadioGroup/index.d.ts.map +1 -0
  96. package/dist/forms/RadioGroup/index.js +1 -0
  97. package/dist/forms/Select/Select.svelte +548 -0
  98. package/dist/forms/Select/Select.svelte.d.ts +74 -0
  99. package/dist/forms/Select/Select.svelte.d.ts.map +1 -0
  100. package/dist/forms/Select/index.d.ts +2 -0
  101. package/dist/forms/Select/index.d.ts.map +1 -0
  102. package/dist/forms/Select/index.js +1 -0
  103. package/dist/forms/TextInput/TextInput.svelte +628 -0
  104. package/dist/forms/TextInput/TextInput.svelte.d.ts +97 -0
  105. package/dist/forms/TextInput/TextInput.svelte.d.ts.map +1 -0
  106. package/dist/forms/TextInput/index.d.ts +2 -0
  107. package/dist/forms/TextInput/index.d.ts.map +1 -0
  108. package/dist/forms/TextInput/index.js +1 -0
  109. package/dist/forms/Textarea/Textarea.svelte +587 -0
  110. package/dist/forms/Textarea/Textarea.svelte.d.ts +71 -0
  111. package/dist/forms/Textarea/Textarea.svelte.d.ts.map +1 -0
  112. package/dist/forms/Textarea/index.d.ts +2 -0
  113. package/dist/forms/Textarea/index.d.ts.map +1 -0
  114. package/dist/forms/Textarea/index.js +1 -0
  115. package/dist/forms/index.d.ts +13 -0
  116. package/dist/forms/index.d.ts.map +1 -0
  117. package/dist/forms/index.js +12 -0
  118. package/dist/index.d.ts +37 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +65 -0
  121. package/dist/layout/Card/Card.svelte +316 -0
  122. package/dist/layout/Card/Card.svelte.d.ts +63 -0
  123. package/dist/layout/Card/Card.svelte.d.ts.map +1 -0
  124. package/dist/layout/Card/index.d.ts +2 -0
  125. package/dist/layout/Card/index.d.ts.map +1 -0
  126. package/dist/layout/Card/index.js +1 -0
  127. package/dist/layout/Container/Container.svelte +252 -0
  128. package/dist/layout/Container/Container.svelte.d.ts +50 -0
  129. package/dist/layout/Container/Container.svelte.d.ts.map +1 -0
  130. package/dist/layout/Container/index.d.ts +2 -0
  131. package/dist/layout/Container/index.d.ts.map +1 -0
  132. package/dist/layout/Container/index.js +1 -0
  133. package/dist/layout/index.d.ts +8 -0
  134. package/dist/layout/index.d.ts.map +1 -0
  135. package/dist/layout/index.js +7 -0
  136. package/dist/navigation/StepIndicator/StepIndicator.svelte +601 -0
  137. package/dist/navigation/StepIndicator/StepIndicator.svelte.d.ts +70 -0
  138. package/dist/navigation/StepIndicator/StepIndicator.svelte.d.ts.map +1 -0
  139. package/dist/navigation/StepIndicator/index.d.ts +2 -0
  140. package/dist/navigation/StepIndicator/index.d.ts.map +1 -0
  141. package/dist/navigation/StepIndicator/index.js +1 -0
  142. package/dist/navigation/index.d.ts +7 -0
  143. package/dist/navigation/index.d.ts.map +1 -0
  144. package/dist/navigation/index.js +6 -0
  145. package/dist/primitives/Badge/Badge.svelte +365 -0
  146. package/dist/primitives/Badge/Badge.svelte.d.ts +39 -0
  147. package/dist/primitives/Badge/Badge.svelte.d.ts.map +1 -0
  148. package/dist/primitives/Badge/index.d.ts +2 -0
  149. package/dist/primitives/Badge/index.d.ts.map +1 -0
  150. package/dist/primitives/Badge/index.js +1 -0
  151. package/dist/primitives/Button/Button.svelte +430 -0
  152. package/dist/primitives/Button/Button.svelte.d.ts +50 -0
  153. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -0
  154. package/dist/primitives/Button/index.d.ts +2 -0
  155. package/dist/primitives/Button/index.d.ts.map +1 -0
  156. package/dist/primitives/Button/index.js +1 -0
  157. package/dist/primitives/index.d.ts +9 -0
  158. package/dist/primitives/index.d.ts.map +1 -0
  159. package/dist/primitives/index.js +8 -0
  160. package/dist/routes/+layout.svelte +12 -0
  161. package/dist/routes/+layout.svelte.d.ts +12 -0
  162. package/dist/routes/+layout.svelte.d.ts.map +1 -0
  163. package/dist/routes/+page.svelte +53 -0
  164. package/dist/routes/+page.svelte.d.ts +27 -0
  165. package/dist/routes/+page.svelte.d.ts.map +1 -0
  166. package/dist/styles/tokens.css +399 -0
  167. package/dist/types/index.d.ts +175 -0
  168. package/dist/types/index.d.ts.map +1 -0
  169. package/dist/types/index.js +7 -0
  170. package/dist/utils/accessibility.d.ts +103 -0
  171. package/dist/utils/accessibility.d.ts.map +1 -0
  172. package/dist/utils/accessibility.js +202 -0
  173. package/dist/utils/cn.d.ts +71 -0
  174. package/dist/utils/cn.d.ts.map +1 -0
  175. package/dist/utils/cn.js +61 -0
  176. package/dist/utils/form-styles.d.ts +76 -0
  177. package/dist/utils/form-styles.d.ts.map +1 -0
  178. package/dist/utils/form-styles.js +95 -0
  179. package/dist/utils/index.d.ts +10 -0
  180. package/dist/utils/index.d.ts.map +1 -0
  181. package/dist/utils/index.js +13 -0
  182. package/dist/utils/keyboard.d.ts +94 -0
  183. package/dist/utils/keyboard.d.ts.map +1 -0
  184. package/dist/utils/keyboard.js +179 -0
  185. package/package.json +119 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Keyboard navigation utilities for accessible components.
3
+ *
4
+ * Provides consistent keyboard handling across the component library,
5
+ * following WCAG 2.1 and WAI-ARIA best practices.
6
+ */
7
+ /**
8
+ * Common keyboard keys used in component interactions.
9
+ */
10
+ export const Keys = {
11
+ Enter: 'Enter',
12
+ Space: ' ',
13
+ Escape: 'Escape',
14
+ Tab: 'Tab',
15
+ ArrowUp: 'ArrowUp',
16
+ ArrowDown: 'ArrowDown',
17
+ ArrowLeft: 'ArrowLeft',
18
+ ArrowRight: 'ArrowRight',
19
+ Home: 'Home',
20
+ End: 'End',
21
+ PageUp: 'PageUp',
22
+ PageDown: 'PageDown',
23
+ Backspace: 'Backspace',
24
+ Delete: 'Delete'
25
+ };
26
+ /**
27
+ * Checks if a keyboard event matches the specified key.
28
+ */
29
+ export function isKey(event, key) {
30
+ return event.key === key;
31
+ }
32
+ /**
33
+ * Checks if the event is an activation key (Enter or Space).
34
+ * Used for button-like elements.
35
+ */
36
+ export function isActivationKey(event) {
37
+ return isKey(event, Keys.Enter) || isKey(event, Keys.Space);
38
+ }
39
+ /**
40
+ * Checks if the event is a navigation key (arrows, home, end).
41
+ */
42
+ export function isNavigationKey(event) {
43
+ return (isKey(event, Keys.ArrowUp) ||
44
+ isKey(event, Keys.ArrowDown) ||
45
+ isKey(event, Keys.ArrowLeft) ||
46
+ isKey(event, Keys.ArrowRight) ||
47
+ isKey(event, Keys.Home) ||
48
+ isKey(event, Keys.End));
49
+ }
50
+ export function createListNavigation(options) {
51
+ const { items, currentIndex, onNavigate, onSelect, onCancel, loop = true, orientation = 'vertical' } = options;
52
+ return (event) => {
53
+ const lastIndex = items.length - 1;
54
+ const navigatePrev = () => {
55
+ event.preventDefault();
56
+ if (currentIndex > 0) {
57
+ onNavigate(currentIndex - 1);
58
+ }
59
+ else if (loop) {
60
+ onNavigate(lastIndex);
61
+ }
62
+ };
63
+ const navigateNext = () => {
64
+ event.preventDefault();
65
+ if (currentIndex < lastIndex) {
66
+ onNavigate(currentIndex + 1);
67
+ }
68
+ else if (loop) {
69
+ onNavigate(0);
70
+ }
71
+ };
72
+ switch (event.key) {
73
+ case Keys.ArrowUp:
74
+ if (orientation === 'vertical' || orientation === 'both') {
75
+ navigatePrev();
76
+ }
77
+ break;
78
+ case Keys.ArrowDown:
79
+ if (orientation === 'vertical' || orientation === 'both') {
80
+ navigateNext();
81
+ }
82
+ break;
83
+ case Keys.ArrowLeft:
84
+ if (orientation === 'horizontal' || orientation === 'both') {
85
+ navigatePrev();
86
+ }
87
+ break;
88
+ case Keys.ArrowRight:
89
+ if (orientation === 'horizontal' || orientation === 'both') {
90
+ navigateNext();
91
+ }
92
+ break;
93
+ case Keys.Home:
94
+ event.preventDefault();
95
+ onNavigate(0);
96
+ break;
97
+ case Keys.End:
98
+ event.preventDefault();
99
+ onNavigate(lastIndex);
100
+ break;
101
+ case Keys.Enter:
102
+ case Keys.Space:
103
+ if (onSelect && currentIndex >= 0) {
104
+ event.preventDefault();
105
+ onSelect(currentIndex);
106
+ }
107
+ break;
108
+ case Keys.Escape:
109
+ if (onCancel) {
110
+ event.preventDefault();
111
+ onCancel();
112
+ }
113
+ break;
114
+ }
115
+ };
116
+ }
117
+ export function createFocusTrap(containerElement) {
118
+ let previouslyFocused = null;
119
+ const focusableSelector = [
120
+ 'button:not([disabled])',
121
+ '[href]',
122
+ 'input:not([disabled])',
123
+ 'select:not([disabled])',
124
+ 'textarea:not([disabled])',
125
+ '[tabindex]:not([tabindex="-1"])'
126
+ ].join(', ');
127
+ const getFocusableElements = () => {
128
+ return Array.from(containerElement.querySelectorAll(focusableSelector));
129
+ };
130
+ const handleKeyDown = (event) => {
131
+ if (event.key !== Keys.Tab)
132
+ return;
133
+ const focusable = getFocusableElements();
134
+ if (focusable.length === 0)
135
+ return;
136
+ const first = focusable[0];
137
+ const last = focusable[focusable.length - 1];
138
+ if (event.shiftKey && document.activeElement === first) {
139
+ event.preventDefault();
140
+ last.focus();
141
+ }
142
+ else if (!event.shiftKey && document.activeElement === last) {
143
+ event.preventDefault();
144
+ first.focus();
145
+ }
146
+ };
147
+ return {
148
+ activate: () => {
149
+ previouslyFocused = document.activeElement;
150
+ containerElement.addEventListener('keydown', handleKeyDown);
151
+ // Focus first focusable element
152
+ const focusable = getFocusableElements();
153
+ if (focusable.length > 0) {
154
+ // Use setTimeout to ensure element is rendered
155
+ setTimeout(() => focusable[0].focus(), 0);
156
+ }
157
+ },
158
+ deactivate: () => {
159
+ containerElement.removeEventListener('keydown', handleKeyDown);
160
+ // Restore focus
161
+ if (previouslyFocused && previouslyFocused instanceof HTMLElement) {
162
+ previouslyFocused.focus();
163
+ }
164
+ previouslyFocused = null;
165
+ },
166
+ getFocusedElement: () => document.activeElement
167
+ };
168
+ }
169
+ /**
170
+ * Generates a unique ID for accessibility attributes.
171
+ *
172
+ * @param prefix - Optional prefix for the ID
173
+ * @returns Unique ID string
174
+ */
175
+ let idCounter = 0;
176
+ export function generateId(prefix = 'ui') {
177
+ idCounter += 1;
178
+ return `${prefix}-${idCounter}`;
179
+ }
package/package.json ADDED
@@ -0,0 +1,119 @@
1
+ {
2
+ "name": "@synthaxai/ui",
3
+ "version": "1.0.0",
4
+ "description": "Production-quality UI component library for Synthax healthcare applications",
5
+ "type": "module",
6
+ "license": "UNLICENSED",
7
+ "scripts": {
8
+ "dev": "vite dev",
9
+ "build": "svelte-kit sync && svelte-package -o dist -i src",
10
+ "build:watch": "svelte-kit sync && svelte-package -o dist -i src --watch",
11
+ "prepublishOnly": "npm run build",
12
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
13
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "test:coverage": "vitest run --coverage",
17
+ "lint": "biome lint src",
18
+ "lint:fix": "biome lint --write src",
19
+ "format": "biome format --write src",
20
+ "format:check": "biome format src",
21
+ "check:biome": "biome check src",
22
+ "check:all": "biome check --write src"
23
+ },
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "svelte": "./dist/index.js",
28
+ "default": "./dist/index.js"
29
+ },
30
+ "./styles": "./dist/styles/tokens.css",
31
+ "./primitives": {
32
+ "types": "./dist/primitives/index.d.ts",
33
+ "svelte": "./dist/primitives/index.js",
34
+ "default": "./dist/primitives/index.js"
35
+ },
36
+ "./forms": {
37
+ "types": "./dist/forms/index.d.ts",
38
+ "svelte": "./dist/forms/index.js",
39
+ "default": "./dist/forms/index.js"
40
+ },
41
+ "./feedback": {
42
+ "types": "./dist/feedback/index.d.ts",
43
+ "svelte": "./dist/feedback/index.js",
44
+ "default": "./dist/feedback/index.js"
45
+ },
46
+ "./layout": {
47
+ "types": "./dist/layout/index.d.ts",
48
+ "svelte": "./dist/layout/index.js",
49
+ "default": "./dist/layout/index.js"
50
+ },
51
+ "./data-display": {
52
+ "types": "./dist/data-display/index.d.ts",
53
+ "svelte": "./dist/data-display/index.js",
54
+ "default": "./dist/data-display/index.js"
55
+ },
56
+ "./navigation": {
57
+ "types": "./dist/navigation/index.d.ts",
58
+ "svelte": "./dist/navigation/index.js",
59
+ "default": "./dist/navigation/index.js"
60
+ },
61
+ "./dialogs": {
62
+ "types": "./dist/dialogs/index.d.ts",
63
+ "svelte": "./dist/dialogs/index.js",
64
+ "default": "./dist/dialogs/index.js"
65
+ },
66
+ "./utils": {
67
+ "types": "./dist/utils/index.d.ts",
68
+ "default": "./dist/utils/index.js"
69
+ }
70
+ },
71
+ "files": [
72
+ "dist",
73
+ "!dist/**/*.test.*",
74
+ "!dist/**/*.spec.*"
75
+ ],
76
+ "peerDependencies": {
77
+ "svelte": "^5.0.0",
78
+ "lucide-svelte": "^0.400.0"
79
+ },
80
+ "devDependencies": {
81
+ "@biomejs/biome": "^1.9.4",
82
+ "@sveltejs/adapter-auto": "^6.0.0",
83
+ "@sveltejs/kit": "^2.49.4",
84
+ "@sveltejs/package": "^2.3.0",
85
+ "@sveltejs/vite-plugin-svelte": "^6.2.3",
86
+ "@tailwindcss/postcss": "^4.1.18",
87
+ "@testing-library/jest-dom": "^6.4.2",
88
+ "@testing-library/svelte": "^5.2.0",
89
+ "@types/node": "^25.0.8",
90
+ "@vitest/coverage-v8": "^4.0.0",
91
+ "jsdom": "^26.1.0",
92
+ "lucide-svelte": "^0.562.0",
93
+ "postcss": "^8.4.45",
94
+ "svelte": "^5.46.1",
95
+ "svelte-check": "^4.3.5",
96
+ "tailwindcss": "^4.1.18",
97
+ "typescript": "^5.0.0",
98
+ "vite": "^7.3.1",
99
+ "vitest": "^4.0.17"
100
+ },
101
+ "keywords": [
102
+ "svelte",
103
+ "sveltekit",
104
+ "ui",
105
+ "components",
106
+ "healthcare",
107
+ "accessibility",
108
+ "typescript"
109
+ ],
110
+ "repository": {
111
+ "type": "git",
112
+ "url": "https://github.com/synthaxai/synthax"
113
+ },
114
+ "engines": {
115
+ "node": ">=22.0.0"
116
+ },
117
+ "svelte": "./dist/index.js",
118
+ "types": "./dist/index.d.ts"
119
+ }