@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,12 @@
1
+ /**
2
+ * @synthaxai/ui - Form Components
3
+ *
4
+ * Accessible form components with validation support,
5
+ * designed for healthcare data entry workflows.
6
+ */
7
+ export { TextInput } from './TextInput/index.js';
8
+ export { Textarea } from './Textarea/index.js';
9
+ export { Select } from './Select/index.js';
10
+ export { Checkbox } from './Checkbox/index.js';
11
+ export { RadioGroup } from './RadioGroup/index.js';
12
+ export { FormField } from './FormField/index.js';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @synthaxai/ui
3
+ *
4
+ * Production-quality UI component library for Synthax healthcare applications.
5
+ *
6
+ * Built with:
7
+ * - Svelte 5 (runes)
8
+ * - Tailwind CSS 4
9
+ * - TypeScript
10
+ * - WCAG 2.1 AA accessibility compliance
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ export { Button } from './primitives/Button/index.js';
15
+ export { Badge } from './primitives/Badge/index.js';
16
+ export { TextInput } from './forms/TextInput/index.js';
17
+ export { Textarea } from './forms/Textarea/index.js';
18
+ export { Select } from './forms/Select/index.js';
19
+ export { Checkbox } from './forms/Checkbox/index.js';
20
+ export { RadioGroup } from './forms/RadioGroup/index.js';
21
+ export { FormField } from './forms/FormField/index.js';
22
+ export { Spinner } from './feedback/Spinner/index.js';
23
+ export { ProgressBar } from './feedback/ProgressBar/index.js';
24
+ export { EmptyState } from './feedback/EmptyState/index.js';
25
+ export { Toast, ToastContainer, toasts } from './feedback/Toast/index.js';
26
+ export { Alert } from './feedback/Alert/index.js';
27
+ export { Skeleton } from './feedback/Skeleton/index.js';
28
+ export { Card } from './layout/Card/index.js';
29
+ export { Container } from './layout/Container/index.js';
30
+ export { StatCard } from './data-display/StatCard/index.js';
31
+ export { DataTable } from './data-display/DataTable/index.js';
32
+ export { StepIndicator } from './navigation/StepIndicator/index.js';
33
+ export { Modal } from './dialogs/Modal/index.js';
34
+ export { ConfirmDialog } from './dialogs/ConfirmDialog/index.js';
35
+ export type { Size, Variant, Status, LoadingState, ValidationResult, ValidatorFn, FieldState, InputMode, AutoComplete, Step, StepState, TableColumn, SortDirection, SortState, DialogVariant, DialogPosition, Toast as ToastType, AriaLive, AriaRole, IconComponent, WithRequired, PartialExcept } from './types/index.js';
36
+ export { cn, createVariants, type ClassValue, type VariantConfig, Keys, isKey, isActivationKey, isNavigationKey, createListNavigation, createFocusTrap, generateId, type Key, type ListNavigationOptions, type FocusTrap, announce, prefersReducedMotion, getAnimationDuration, prefersHighContrast, createDescription, formatForAnnouncement, isElementFocusable, getFocusableElements, createFieldLabel, createErrorProps, healthcareRoles, srOnlyClass } from './utils/index.js';
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAKpD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAKvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAKxD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAKxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAK9D,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAKpE,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAKjE,YAAY,EAEX,IAAI,EACJ,OAAO,EACP,MAAM,EACN,YAAY,EAEZ,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,SAAS,EACT,YAAY,EAEZ,IAAI,EACJ,SAAS,EAET,WAAW,EACX,aAAa,EACb,SAAS,EAET,aAAa,EACb,cAAc,EAEd,KAAK,IAAI,SAAS,EAElB,QAAQ,EACR,QAAQ,EAER,aAAa,EACb,YAAY,EACZ,aAAa,EACb,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAEN,EAAE,EACF,cAAc,EACd,KAAK,UAAU,EACf,KAAK,aAAa,EAElB,IAAI,EACJ,KAAK,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,KAAK,GAAG,EACR,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAEd,QAAQ,EACR,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @synthaxai/ui
3
+ *
4
+ * Production-quality UI component library for Synthax healthcare applications.
5
+ *
6
+ * Built with:
7
+ * - Svelte 5 (runes)
8
+ * - Tailwind CSS 4
9
+ * - TypeScript
10
+ * - WCAG 2.1 AA accessibility compliance
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ // ============================================================================
15
+ // Primitive Components
16
+ // ============================================================================
17
+ export { Button } from './primitives/Button/index.js';
18
+ export { Badge } from './primitives/Badge/index.js';
19
+ // ============================================================================
20
+ // Form Components
21
+ // ============================================================================
22
+ export { TextInput } from './forms/TextInput/index.js';
23
+ export { Textarea } from './forms/Textarea/index.js';
24
+ export { Select } from './forms/Select/index.js';
25
+ export { Checkbox } from './forms/Checkbox/index.js';
26
+ export { RadioGroup } from './forms/RadioGroup/index.js';
27
+ export { FormField } from './forms/FormField/index.js';
28
+ // ============================================================================
29
+ // Feedback Components
30
+ // ============================================================================
31
+ export { Spinner } from './feedback/Spinner/index.js';
32
+ export { ProgressBar } from './feedback/ProgressBar/index.js';
33
+ export { EmptyState } from './feedback/EmptyState/index.js';
34
+ export { Toast, ToastContainer, toasts } from './feedback/Toast/index.js';
35
+ export { Alert } from './feedback/Alert/index.js';
36
+ export { Skeleton } from './feedback/Skeleton/index.js';
37
+ // ============================================================================
38
+ // Layout Components
39
+ // ============================================================================
40
+ export { Card } from './layout/Card/index.js';
41
+ export { Container } from './layout/Container/index.js';
42
+ // ============================================================================
43
+ // Data Display Components
44
+ // ============================================================================
45
+ export { StatCard } from './data-display/StatCard/index.js';
46
+ export { DataTable } from './data-display/DataTable/index.js';
47
+ // ============================================================================
48
+ // Navigation Components
49
+ // ============================================================================
50
+ export { StepIndicator } from './navigation/StepIndicator/index.js';
51
+ // ============================================================================
52
+ // Dialog Components
53
+ // ============================================================================
54
+ export { Modal } from './dialogs/Modal/index.js';
55
+ export { ConfirmDialog } from './dialogs/ConfirmDialog/index.js';
56
+ // ============================================================================
57
+ // Utilities
58
+ // ============================================================================
59
+ export {
60
+ // Class name utilities
61
+ cn, createVariants,
62
+ // Keyboard navigation
63
+ Keys, isKey, isActivationKey, isNavigationKey, createListNavigation, createFocusTrap, generateId,
64
+ // Accessibility utilities
65
+ announce, prefersReducedMotion, getAnimationDuration, prefersHighContrast, createDescription, formatForAnnouncement, isElementFocusable, getFocusableElements, createFieldLabel, createErrorProps, healthcareRoles, srOnlyClass } from './utils/index.js';
@@ -0,0 +1,316 @@
1
+ <!--
2
+ @component Card
3
+
4
+ A world-class card component for grouping related content.
5
+ Designed for healthcare applications following accessibility best practices.
6
+
7
+ Features:
8
+ - Multiple variants (default, elevated, outlined, glass, accent)
9
+ - Semantic element support (div, article, section)
10
+ - Header and footer slots with proper spacing
11
+ - Interactive mode with keyboard support
12
+ - Status indicator for healthcare workflows
13
+ - Proper ARIA support
14
+
15
+ @example
16
+ <Card>
17
+ <h2>Patient Information</h2>
18
+ <p>Card content here</p>
19
+ </Card>
20
+
21
+ @example
22
+ <Card variant="accent" accentColor="success" interactive>
23
+ <p>Approved insurance coverage</p>
24
+ </Card>
25
+ -->
26
+ <script lang="ts">
27
+ import type { Snippet } from 'svelte';
28
+
29
+ type CardPadding = 'none' | 'sm' | 'md' | 'lg' | 'xl';
30
+ type CardVariant = 'default' | 'elevated' | 'outlined' | 'glass' | 'accent';
31
+ type AccentColor = 'primary' | 'success' | 'warning' | 'error' | 'info';
32
+
33
+ interface Props {
34
+ /** Visual variant of the card */
35
+ variant?: CardVariant;
36
+ /** Internal padding */
37
+ padding?: CardPadding;
38
+ /** Accent color for accent variant */
39
+ accentColor?: AccentColor;
40
+ /** Whether the card is interactive (hover effects) */
41
+ interactive?: boolean;
42
+ /** Whether to render as a button element */
43
+ asButton?: boolean;
44
+ /** Semantic element type */
45
+ as?: 'div' | 'article' | 'section';
46
+ /** Optional ID for the card */
47
+ id?: string;
48
+ /** ID of the element that labels this card */
49
+ ariaLabelledby?: string;
50
+ /** Additional CSS classes */
51
+ class?: string;
52
+ /** Header content */
53
+ header?: Snippet;
54
+ /** Footer content */
55
+ footer?: Snippet;
56
+ /** Main content */
57
+ children?: Snippet;
58
+ /** Click handler */
59
+ onclick?: (event: MouseEvent) => void;
60
+ /** Keyboard handler */
61
+ onkeydown?: (event: KeyboardEvent) => void;
62
+ }
63
+
64
+ let {
65
+ variant = 'default',
66
+ padding = 'md',
67
+ accentColor = 'primary',
68
+ interactive = false,
69
+ asButton = false,
70
+ as = 'div',
71
+ id,
72
+ ariaLabelledby,
73
+ class: className = '',
74
+ header,
75
+ footer,
76
+ children,
77
+ onclick,
78
+ onkeydown
79
+ }: Props = $props();
80
+
81
+ // Padding values for CSS
82
+ const paddingValues: Record<CardPadding, string> = {
83
+ none: '0',
84
+ sm: '1rem',
85
+ md: '1.5rem',
86
+ lg: '2rem',
87
+ xl: '3rem'
88
+ };
89
+
90
+ const currentPadding = $derived(paddingValues[padding]);
91
+ </script>
92
+
93
+ {#snippet cardContent()}
94
+ {#if header}
95
+ <div
96
+ class="card-header"
97
+ style="margin: calc(-1 * {currentPadding}) calc(-1 * {currentPadding}) {currentPadding}; padding: 1rem {currentPadding};"
98
+ >
99
+ {@render header()}
100
+ </div>
101
+ {/if}
102
+
103
+ {#if children}
104
+ <div class="card-content">
105
+ {@render children()}
106
+ </div>
107
+ {/if}
108
+
109
+ {#if footer}
110
+ <div
111
+ class="card-footer"
112
+ style="margin: {currentPadding} calc(-1 * {currentPadding}) calc(-1 * {currentPadding}); padding: 1rem {currentPadding};"
113
+ >
114
+ {@render footer()}
115
+ </div>
116
+ {/if}
117
+ {/snippet}
118
+
119
+ {#if asButton}
120
+ <button
121
+ type="button"
122
+ {id}
123
+ class="card card-{variant} card-padding-{padding} {interactive ? 'card-interactive' : ''} {className}"
124
+ class:card-accent-primary={variant === 'accent' && accentColor === 'primary'}
125
+ class:card-accent-success={variant === 'accent' && accentColor === 'success'}
126
+ class:card-accent-warning={variant === 'accent' && accentColor === 'warning'}
127
+ class:card-accent-error={variant === 'accent' && accentColor === 'error'}
128
+ class:card-accent-info={variant === 'accent' && accentColor === 'info'}
129
+ aria-labelledby={ariaLabelledby}
130
+ {onclick}
131
+ {onkeydown}
132
+ >
133
+ {@render cardContent()}
134
+ </button>
135
+ {:else if interactive || onclick}
136
+ <svelte:element
137
+ this={as}
138
+ {id}
139
+ class="card card-{variant} card-padding-{padding} card-interactive {className}"
140
+ class:card-accent-primary={variant === 'accent' && accentColor === 'primary'}
141
+ class:card-accent-success={variant === 'accent' && accentColor === 'success'}
142
+ class:card-accent-warning={variant === 'accent' && accentColor === 'warning'}
143
+ class:card-accent-error={variant === 'accent' && accentColor === 'error'}
144
+ class:card-accent-info={variant === 'accent' && accentColor === 'info'}
145
+ role="button"
146
+ tabindex={0}
147
+ aria-labelledby={ariaLabelledby}
148
+ onclick={onclick}
149
+ onkeydown={onkeydown}
150
+ >
151
+ {@render cardContent()}
152
+ </svelte:element>
153
+ {:else}
154
+ <svelte:element
155
+ this={as}
156
+ {id}
157
+ class="card card-{variant} card-padding-{padding} {className}"
158
+ class:card-accent-primary={variant === 'accent' && accentColor === 'primary'}
159
+ class:card-accent-success={variant === 'accent' && accentColor === 'success'}
160
+ class:card-accent-warning={variant === 'accent' && accentColor === 'warning'}
161
+ class:card-accent-error={variant === 'accent' && accentColor === 'error'}
162
+ class:card-accent-info={variant === 'accent' && accentColor === 'info'}
163
+ aria-labelledby={ariaLabelledby}
164
+ >
165
+ {@render cardContent()}
166
+ </svelte:element>
167
+ {/if}
168
+
169
+ <style>
170
+ /* ========================================
171
+ BASE CARD STYLES
172
+ ======================================== */
173
+ .card {
174
+ border-radius: 0.75rem;
175
+ transition: all 0.2s ease;
176
+ position: relative;
177
+ overflow: hidden;
178
+ }
179
+
180
+ /* Reset button styles when rendered as button */
181
+ button.card {
182
+ width: 100%;
183
+ text-align: left;
184
+ font: inherit;
185
+ }
186
+
187
+ /* ========================================
188
+ PADDING VARIANTS
189
+ ======================================== */
190
+ .card-padding-none {
191
+ padding: 0;
192
+ }
193
+
194
+ .card-padding-sm {
195
+ padding: 1rem;
196
+ }
197
+
198
+ .card-padding-md {
199
+ padding: 1.5rem;
200
+ }
201
+
202
+ .card-padding-lg {
203
+ padding: 2rem;
204
+ }
205
+
206
+ .card-padding-xl {
207
+ padding: 3rem;
208
+ }
209
+
210
+ /* ========================================
211
+ VISUAL VARIANTS
212
+ ======================================== */
213
+ .card-default {
214
+ background-color: var(--ui-bg-secondary);
215
+ border: 1px solid var(--ui-border-default);
216
+ }
217
+
218
+ .card-elevated {
219
+ background-color: var(--ui-bg-primary);
220
+ border: 1px solid var(--ui-border-default);
221
+ }
222
+
223
+ .card-outlined {
224
+ background-color: transparent;
225
+ border: 2px solid var(--ui-border-default);
226
+ }
227
+
228
+ .card-glass {
229
+ background-color: var(--ui-glass-bg, rgba(255, 255, 255, 0.8));
230
+ border: 1px solid var(--ui-glass-border, rgba(255, 255, 255, 0.3));
231
+ backdrop-filter: blur(24px);
232
+ -webkit-backdrop-filter: blur(24px);
233
+ }
234
+
235
+ .card-accent {
236
+ background-color: var(--ui-bg-primary);
237
+ border: 1px solid var(--ui-border-default);
238
+ border-left-width: 4px;
239
+ }
240
+
241
+ /* Accent colors */
242
+ .card-accent-primary {
243
+ border-left-color: rgb(var(--ui-color-primary));
244
+ }
245
+
246
+ .card-accent-success {
247
+ border-left-color: rgb(var(--ui-color-success));
248
+ }
249
+
250
+ .card-accent-warning {
251
+ border-left-color: rgb(var(--ui-color-warning));
252
+ }
253
+
254
+ .card-accent-error {
255
+ border-left-color: rgb(var(--ui-color-error));
256
+ }
257
+
258
+ .card-accent-info {
259
+ border-left-color: rgb(var(--ui-color-info));
260
+ }
261
+
262
+ /* ========================================
263
+ INTERACTIVE STATES
264
+ ======================================== */
265
+ .card-interactive {
266
+ cursor: pointer;
267
+ }
268
+
269
+ .card-interactive:hover {
270
+ transform: translateY(-2px);
271
+ border-color: var(--ui-border-hover);
272
+ }
273
+
274
+ .card-interactive:active {
275
+ transform: translateY(0);
276
+ }
277
+
278
+ .card-interactive:focus-visible {
279
+ outline: none;
280
+ box-shadow: 0 0 0 3px rgb(var(--ui-color-primary) / 0.4);
281
+ }
282
+
283
+ :global([data-theme='dark']) .card-interactive:focus-visible {
284
+ box-shadow: 0 0 0 3px rgb(var(--ui-color-primary-light) / 0.5);
285
+ }
286
+
287
+ @media (prefers-color-scheme: dark) {
288
+ :global(:root:not([data-theme='light'])) .card-interactive:focus-visible {
289
+ box-shadow: 0 0 0 3px rgb(var(--ui-color-primary-light) / 0.5);
290
+ }
291
+ }
292
+
293
+ /* ========================================
294
+ HEADER & FOOTER
295
+ ======================================== */
296
+ .card-header {
297
+ border-bottom: 1px solid var(--ui-border-default);
298
+ }
299
+
300
+ .card-footer {
301
+ border-top: 1px solid var(--ui-border-default);
302
+ }
303
+
304
+ /* ========================================
305
+ REDUCED MOTION
306
+ ======================================== */
307
+ @media (prefers-reduced-motion: reduce) {
308
+ .card {
309
+ transition: none;
310
+ }
311
+
312
+ .card-interactive:hover {
313
+ transform: none;
314
+ }
315
+ }
316
+ </style>
@@ -0,0 +1,63 @@
1
+ import type { Snippet } from 'svelte';
2
+ type CardPadding = 'none' | 'sm' | 'md' | 'lg' | 'xl';
3
+ type CardVariant = 'default' | 'elevated' | 'outlined' | 'glass' | 'accent';
4
+ type AccentColor = 'primary' | 'success' | 'warning' | 'error' | 'info';
5
+ interface Props {
6
+ /** Visual variant of the card */
7
+ variant?: CardVariant;
8
+ /** Internal padding */
9
+ padding?: CardPadding;
10
+ /** Accent color for accent variant */
11
+ accentColor?: AccentColor;
12
+ /** Whether the card is interactive (hover effects) */
13
+ interactive?: boolean;
14
+ /** Whether to render as a button element */
15
+ asButton?: boolean;
16
+ /** Semantic element type */
17
+ as?: 'div' | 'article' | 'section';
18
+ /** Optional ID for the card */
19
+ id?: string;
20
+ /** ID of the element that labels this card */
21
+ ariaLabelledby?: string;
22
+ /** Additional CSS classes */
23
+ class?: string;
24
+ /** Header content */
25
+ header?: Snippet;
26
+ /** Footer content */
27
+ footer?: Snippet;
28
+ /** Main content */
29
+ children?: Snippet;
30
+ /** Click handler */
31
+ onclick?: (event: MouseEvent) => void;
32
+ /** Keyboard handler */
33
+ onkeydown?: (event: KeyboardEvent) => void;
34
+ }
35
+ /**
36
+ * Card
37
+ *
38
+ * A world-class card component for grouping related content.
39
+ * Designed for healthcare applications following accessibility best practices.
40
+ *
41
+ * Features:
42
+ * - Multiple variants (default, elevated, outlined, glass, accent)
43
+ * - Semantic element support (div, article, section)
44
+ * - Header and footer slots with proper spacing
45
+ * - Interactive mode with keyboard support
46
+ * - Status indicator for healthcare workflows
47
+ * - Proper ARIA support
48
+ *
49
+ * @example
50
+ * <Card>
51
+ * <h2>Patient Information</h2>
52
+ * <p>Card content here</p>
53
+ * </Card>
54
+ *
55
+ * @example
56
+ * <Card variant="accent" accentColor="success" interactive>
57
+ * <p>Approved insurance coverage</p>
58
+ * </Card>
59
+ */
60
+ declare const Card: import("svelte").Component<Props, {}, "">;
61
+ type Card = ReturnType<typeof Card>;
62
+ export default Card;
63
+ //# sourceMappingURL=Card.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.svelte.d.ts","sourceRoot":"","sources":["../../../src/layout/Card/Card.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGrC,KAAK,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACtD,KAAK,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC5E,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAExE,UAAU,KAAK;IACd,iCAAiC;IACjC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,uBAAuB;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,sCAAsC;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,EAAE,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IACnC,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,uBAAuB;IACvB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AA4EF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as Card } from './Card.svelte';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layout/Card/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as Card } from './Card.svelte';