@aspect-ops/exon-ui 0.0.2 → 0.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 (237) hide show
  1. package/README.md +793 -43
  2. package/dist/components/Accordion/Accordion.svelte +79 -0
  3. package/dist/components/Accordion/Accordion.svelte.d.ts +10 -0
  4. package/dist/components/Accordion/AccordionItem.svelte +198 -0
  5. package/dist/components/Accordion/AccordionItem.svelte.d.ts +10 -0
  6. package/dist/components/Accordion/index.d.ts +2 -0
  7. package/dist/components/Accordion/index.js +2 -0
  8. package/dist/components/ActionSheet/ActionSheet.svelte +270 -0
  9. package/dist/components/ActionSheet/ActionSheet.svelte.d.ts +12 -0
  10. package/dist/components/ActionSheet/ActionSheetItem.svelte +151 -0
  11. package/dist/components/ActionSheet/ActionSheetItem.svelte.d.ts +10 -0
  12. package/dist/components/ActionSheet/index.d.ts +3 -0
  13. package/dist/components/ActionSheet/index.js +2 -0
  14. package/dist/components/Alert/Alert.svelte +165 -0
  15. package/dist/components/Alert/Alert.svelte.d.ts +11 -0
  16. package/dist/components/Alert/index.d.ts +1 -0
  17. package/dist/components/Alert/index.js +1 -0
  18. package/dist/components/AspectRatio/AspectRatio.svelte +42 -0
  19. package/dist/components/AspectRatio/AspectRatio.svelte.d.ts +9 -0
  20. package/dist/components/AspectRatio/index.d.ts +1 -0
  21. package/dist/components/AspectRatio/index.js +1 -0
  22. package/dist/components/Avatar/Avatar.svelte +147 -0
  23. package/dist/components/Avatar/Avatar.svelte.d.ts +12 -0
  24. package/dist/components/Avatar/AvatarGroup.svelte +153 -0
  25. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +12 -0
  26. package/dist/components/Avatar/index.d.ts +2 -0
  27. package/dist/components/Avatar/index.js +2 -0
  28. package/dist/components/BottomSheet/BottomSheet.svelte +230 -0
  29. package/dist/components/BottomSheet/BottomSheet.svelte.d.ts +7 -0
  30. package/dist/components/BottomSheet/BottomSheetBody.svelte +20 -0
  31. package/dist/components/BottomSheet/BottomSheetBody.svelte.d.ts +7 -0
  32. package/dist/components/BottomSheet/BottomSheetHeader.svelte +27 -0
  33. package/dist/components/BottomSheet/BottomSheetHeader.svelte.d.ts +7 -0
  34. package/dist/components/BottomSheet/index.d.ts +3 -0
  35. package/dist/components/BottomSheet/index.js +3 -0
  36. package/dist/components/Box/Box.svelte +41 -0
  37. package/dist/components/Box/Box.svelte.d.ts +7 -0
  38. package/dist/components/Box/index.d.ts +1 -0
  39. package/dist/components/Box/index.js +1 -0
  40. package/dist/components/Card/Card.svelte +95 -0
  41. package/dist/components/Card/Card.svelte.d.ts +10 -0
  42. package/dist/components/Card/CardBody.svelte +32 -0
  43. package/dist/components/Card/CardBody.svelte.d.ts +7 -0
  44. package/dist/components/Card/CardFooter.svelte +34 -0
  45. package/dist/components/Card/CardFooter.svelte.d.ts +7 -0
  46. package/dist/components/Card/CardHeader.svelte +67 -0
  47. package/dist/components/Card/CardHeader.svelte.d.ts +9 -0
  48. package/dist/components/Card/index.d.ts +4 -0
  49. package/dist/components/Card/index.js +4 -0
  50. package/dist/components/Carousel/Carousel.svelte +454 -0
  51. package/dist/components/Carousel/Carousel.svelte.d.ts +14 -0
  52. package/dist/components/Carousel/CarouselSlide.svelte +22 -0
  53. package/dist/components/Carousel/CarouselSlide.svelte.d.ts +7 -0
  54. package/dist/components/Carousel/index.d.ts +2 -0
  55. package/dist/components/Carousel/index.js +2 -0
  56. package/dist/components/Center/Center.svelte +28 -0
  57. package/dist/components/Center/Center.svelte.d.ts +8 -0
  58. package/dist/components/Center/index.d.ts +1 -0
  59. package/dist/components/Center/index.js +1 -0
  60. package/dist/components/Chip/Chip.svelte +461 -0
  61. package/dist/components/Chip/Chip.svelte.d.ts +17 -0
  62. package/dist/components/Chip/ChipGroup.svelte +76 -0
  63. package/dist/components/Chip/ChipGroup.svelte.d.ts +9 -0
  64. package/dist/components/Chip/index.d.ts +2 -0
  65. package/dist/components/Chip/index.js +2 -0
  66. package/dist/components/Container/Container.svelte +58 -0
  67. package/dist/components/Container/Container.svelte.d.ts +10 -0
  68. package/dist/components/Container/index.d.ts +1 -0
  69. package/dist/components/Container/index.js +1 -0
  70. package/dist/components/DatePicker/DatePicker.svelte +746 -0
  71. package/dist/components/DatePicker/DatePicker.svelte.d.ts +19 -0
  72. package/dist/components/DatePicker/index.d.ts +1 -0
  73. package/dist/components/DatePicker/index.js +1 -0
  74. package/dist/components/Divider/Divider.svelte +38 -0
  75. package/dist/components/Divider/Divider.svelte.d.ts +9 -0
  76. package/dist/components/Divider/index.d.ts +1 -0
  77. package/dist/components/Divider/index.js +1 -0
  78. package/dist/components/EmptyState/EmptyState.svelte +164 -0
  79. package/dist/components/EmptyState/EmptyState.svelte.d.ts +12 -0
  80. package/dist/components/EmptyState/index.d.ts +1 -0
  81. package/dist/components/EmptyState/index.js +1 -0
  82. package/dist/components/FAB/FAB.svelte +242 -0
  83. package/dist/components/FAB/FAB.svelte.d.ts +9 -0
  84. package/dist/components/FAB/FABGroup.svelte +449 -0
  85. package/dist/components/FAB/FABGroup.svelte.d.ts +9 -0
  86. package/dist/components/FAB/index.d.ts +3 -0
  87. package/dist/components/FAB/index.js +2 -0
  88. package/dist/components/FileUpload/FileUpload.svelte +484 -0
  89. package/dist/components/FileUpload/FileUpload.svelte.d.ts +16 -0
  90. package/dist/components/FileUpload/index.d.ts +1 -0
  91. package/dist/components/FileUpload/index.js +1 -0
  92. package/dist/components/Grid/Grid.svelte +136 -0
  93. package/dist/components/Grid/Grid.svelte.d.ts +12 -0
  94. package/dist/components/Grid/GridItem.svelte +21 -0
  95. package/dist/components/Grid/GridItem.svelte.d.ts +7 -0
  96. package/dist/components/Grid/index.d.ts +2 -0
  97. package/dist/components/Grid/index.js +2 -0
  98. package/dist/components/Image/Image.svelte +223 -0
  99. package/dist/components/Image/Image.svelte.d.ts +19 -0
  100. package/dist/components/Image/index.d.ts +1 -0
  101. package/dist/components/Image/index.js +1 -0
  102. package/dist/components/List/List.svelte +42 -0
  103. package/dist/components/List/List.svelte.d.ts +18 -0
  104. package/dist/components/List/ListItem.svelte +139 -0
  105. package/dist/components/List/ListItem.svelte.d.ts +36 -0
  106. package/dist/components/List/index.d.ts +2 -0
  107. package/dist/components/List/index.js +2 -0
  108. package/dist/components/Modal/Modal.svelte +204 -0
  109. package/dist/components/Modal/Modal.svelte.d.ts +7 -0
  110. package/dist/components/Modal/ModalBody.svelte +50 -0
  111. package/dist/components/Modal/ModalBody.svelte.d.ts +7 -0
  112. package/dist/components/Modal/ModalFooter.svelte +37 -0
  113. package/dist/components/Modal/ModalFooter.svelte.d.ts +7 -0
  114. package/dist/components/Modal/ModalHeader.svelte +73 -0
  115. package/dist/components/Modal/ModalHeader.svelte.d.ts +7 -0
  116. package/dist/components/Modal/index.d.ts +4 -0
  117. package/dist/components/Modal/index.js +4 -0
  118. package/dist/components/OTPInput/OTPInput.svelte +312 -0
  119. package/dist/components/OTPInput/OTPInput.svelte.d.ts +57 -0
  120. package/dist/components/OTPInput/index.d.ts +1 -0
  121. package/dist/components/OTPInput/index.js +1 -0
  122. package/dist/components/Popover/Popover.svelte +14 -0
  123. package/dist/components/Popover/Popover.svelte.d.ts +7 -0
  124. package/dist/components/Popover/PopoverContent.svelte +63 -0
  125. package/dist/components/Popover/PopoverContent.svelte.d.ts +7 -0
  126. package/dist/components/Popover/PopoverTrigger.svelte +14 -0
  127. package/dist/components/Popover/PopoverTrigger.svelte.d.ts +7 -0
  128. package/dist/components/Popover/index.d.ts +3 -0
  129. package/dist/components/Popover/index.js +3 -0
  130. package/dist/components/Progress/ProgressBar.svelte +86 -0
  131. package/dist/components/Progress/ProgressBar.svelte.d.ts +11 -0
  132. package/dist/components/Progress/ProgressCircle.svelte +134 -0
  133. package/dist/components/Progress/ProgressCircle.svelte.d.ts +12 -0
  134. package/dist/components/Progress/Spinner.svelte +68 -0
  135. package/dist/components/Progress/Spinner.svelte.d.ts +8 -0
  136. package/dist/components/Progress/index.d.ts +3 -0
  137. package/dist/components/Progress/index.js +3 -0
  138. package/dist/components/PullToRefresh/PullToRefresh.svelte +304 -0
  139. package/dist/components/PullToRefresh/PullToRefresh.svelte.d.ts +20 -0
  140. package/dist/components/PullToRefresh/index.d.ts +1 -0
  141. package/dist/components/PullToRefresh/index.js +1 -0
  142. package/dist/components/Rating/Rating.svelte +316 -0
  143. package/dist/components/Rating/Rating.svelte.d.ts +16 -0
  144. package/dist/components/Rating/index.d.ts +1 -0
  145. package/dist/components/Rating/index.js +1 -0
  146. package/dist/components/SafeArea/SafeArea.svelte +33 -0
  147. package/dist/components/SafeArea/SafeArea.svelte.d.ts +7 -0
  148. package/dist/components/SearchInput/SearchInput.svelte +480 -0
  149. package/dist/components/SearchInput/SearchInput.svelte.d.ts +22 -0
  150. package/dist/components/SearchInput/index.d.ts +1 -0
  151. package/dist/components/SearchInput/index.js +1 -0
  152. package/dist/components/Select/Select.svelte +55 -12
  153. package/dist/components/Skeleton/Skeleton.svelte +59 -0
  154. package/dist/components/Skeleton/Skeleton.svelte.d.ts +10 -0
  155. package/dist/components/Skeleton/index.d.ts +1 -0
  156. package/dist/components/Skeleton/index.js +1 -0
  157. package/dist/components/Slider/Slider.svelte +324 -0
  158. package/dist/components/Slider/Slider.svelte.d.ts +14 -0
  159. package/dist/components/Slider/index.d.ts +1 -0
  160. package/dist/components/Slider/index.js +1 -0
  161. package/dist/components/Spacer/Spacer.svelte +56 -0
  162. package/dist/components/Spacer/Spacer.svelte.d.ts +6 -0
  163. package/dist/components/Spacer/index.d.ts +1 -0
  164. package/dist/components/Spacer/index.js +1 -0
  165. package/dist/components/Stack/Stack.svelte +117 -0
  166. package/dist/components/Stack/Stack.svelte.d.ts +13 -0
  167. package/dist/components/Stack/index.d.ts +1 -0
  168. package/dist/components/Stack/index.js +1 -0
  169. package/dist/components/Stepper/Stepper.svelte +100 -0
  170. package/dist/components/Stepper/Stepper.svelte.d.ts +11 -0
  171. package/dist/components/Stepper/StepperStep.svelte +391 -0
  172. package/dist/components/Stepper/StepperStep.svelte.d.ts +13 -0
  173. package/dist/components/Stepper/index.d.ts +2 -0
  174. package/dist/components/Stepper/index.js +2 -0
  175. package/dist/components/SwipeActions/SwipeAction.svelte +43 -0
  176. package/dist/components/SwipeActions/SwipeAction.svelte.d.ts +8 -0
  177. package/dist/components/SwipeActions/SwipeActions.svelte +193 -0
  178. package/dist/components/SwipeActions/SwipeActions.svelte.d.ts +9 -0
  179. package/dist/components/SwipeActions/index.d.ts +2 -0
  180. package/dist/components/SwipeActions/index.js +2 -0
  181. package/dist/components/Switch/Switch.svelte +29 -9
  182. package/dist/components/Table/Table.svelte +175 -0
  183. package/dist/components/Table/Table.svelte.d.ts +38 -0
  184. package/dist/components/Table/TableBody.svelte +26 -0
  185. package/dist/components/Table/TableBody.svelte.d.ts +13 -0
  186. package/dist/components/Table/TableCell.svelte +85 -0
  187. package/dist/components/Table/TableCell.svelte.d.ts +28 -0
  188. package/dist/components/Table/TableHead.svelte +36 -0
  189. package/dist/components/Table/TableHead.svelte.d.ts +13 -0
  190. package/dist/components/Table/TableHeader.svelte +217 -0
  191. package/dist/components/Table/TableHeader.svelte.d.ts +32 -0
  192. package/dist/components/Table/TableRow.svelte +92 -0
  193. package/dist/components/Table/TableRow.svelte.d.ts +28 -0
  194. package/dist/components/Table/index.d.ts +6 -0
  195. package/dist/components/Table/index.js +6 -0
  196. package/dist/components/Tag/Tag.svelte +189 -0
  197. package/dist/components/Tag/Tag.svelte.d.ts +13 -0
  198. package/dist/components/Tag/index.d.ts +1 -0
  199. package/dist/components/Tag/index.js +1 -0
  200. package/dist/components/TimePicker/TimePicker.svelte +803 -0
  201. package/dist/components/TimePicker/TimePicker.svelte.d.ts +17 -0
  202. package/dist/components/TimePicker/index.d.ts +1 -0
  203. package/dist/components/TimePicker/index.js +1 -0
  204. package/dist/components/Toast/Toast.svelte +241 -0
  205. package/dist/components/Toast/Toast.svelte.d.ts +18 -0
  206. package/dist/components/Toast/ToastContainer.svelte +110 -0
  207. package/dist/components/Toast/ToastContainer.svelte.d.ts +8 -0
  208. package/dist/components/Toast/index.d.ts +3 -0
  209. package/dist/components/Toast/index.js +3 -0
  210. package/dist/components/Toast/toast.d.ts +13 -0
  211. package/dist/components/Toast/toast.js +55 -0
  212. package/dist/components/Tooltip/Tooltip.svelte +71 -0
  213. package/dist/components/Tooltip/Tooltip.svelte.d.ts +7 -0
  214. package/dist/components/Tooltip/index.d.ts +2 -0
  215. package/dist/components/Tooltip/index.js +1 -0
  216. package/dist/index.d.ts +38 -1
  217. package/dist/index.js +41 -0
  218. package/dist/styles/tokens.css +5 -0
  219. package/dist/types/data-display.d.ts +161 -0
  220. package/dist/types/data-display.js +1 -0
  221. package/dist/types/feedback.d.ts +92 -0
  222. package/dist/types/feedback.js +1 -0
  223. package/dist/types/index.d.ts +6 -1
  224. package/dist/types/input.d.ts +67 -0
  225. package/dist/types/input.js +2 -0
  226. package/dist/types/layout.d.ts +57 -0
  227. package/dist/types/layout.js +1 -0
  228. package/dist/types/mobile.d.ts +91 -0
  229. package/dist/types/mobile.js +1 -0
  230. package/dist/types/navigation.d.ts +15 -0
  231. package/dist/utils/gestures.d.ts +219 -0
  232. package/dist/utils/gestures.js +492 -0
  233. package/dist/utils/haptics.d.ts +89 -0
  234. package/dist/utils/haptics.js +198 -0
  235. package/dist/utils/platform.d.ts +47 -0
  236. package/dist/utils/platform.js +156 -0
  237. package/package.json +1 -1
@@ -66,21 +66,34 @@
66
66
  min-width: 2.75rem;
67
67
  min-height: 1.5rem;
68
68
  padding: 2px;
69
- border: none;
69
+ border: 2px solid var(--color-border-strong, #9ca3af);
70
70
  border-radius: 9999px;
71
- background: var(--color-bg-muted, #e5e7eb);
71
+ background: var(--color-bg, #ffffff);
72
72
  cursor: pointer;
73
- transition: background var(--transition-fast, 150ms ease);
73
+ transition:
74
+ background var(--transition-fast, 150ms ease),
75
+ border-color var(--transition-fast, 150ms ease);
74
76
  -webkit-tap-highlight-color: transparent;
75
77
  }
76
78
 
79
+ :global(.switch:hover:not(.switch--disabled)) {
80
+ border-color: var(--color-text-muted, #6b7280);
81
+ }
82
+
77
83
  :global(.switch:focus-visible) {
78
84
  outline: none;
79
- box-shadow: 0 0 0 3px var(--color-primary-alpha, rgba(59, 130, 246, 0.1));
85
+ border-color: var(--color-primary, #3b82f6);
86
+ box-shadow: 0 0 0 3px var(--color-primary-alpha, rgba(59, 130, 246, 0.2));
80
87
  }
81
88
 
82
89
  :global(.switch[data-state='checked']) {
83
90
  background: var(--color-primary, #3b82f6);
91
+ border-color: var(--color-primary, #3b82f6);
92
+ }
93
+
94
+ :global(.switch[data-state='checked']:hover:not(.switch--disabled)) {
95
+ background: var(--color-primary-hover, #2563eb);
96
+ border-color: var(--color-primary-hover, #2563eb);
84
97
  }
85
98
 
86
99
  :global(.switch--disabled) {
@@ -90,16 +103,23 @@
90
103
 
91
104
  :global(.switch__thumb) {
92
105
  display: block;
93
- width: 1.25rem;
94
- height: 1.25rem;
106
+ width: 1rem;
107
+ height: 1rem;
95
108
  border-radius: 50%;
96
- background: var(--color-bg, #ffffff);
97
- box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.1));
98
- transition: transform var(--transition-fast, 150ms ease);
109
+ background: var(--color-border-strong, #9ca3af);
110
+ box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.15));
111
+ transition:
112
+ transform var(--transition-fast, 150ms ease),
113
+ background var(--transition-fast, 150ms ease);
114
+ }
115
+
116
+ :global(.switch:hover:not(.switch--disabled) .switch__thumb) {
117
+ background: var(--color-text-muted, #6b7280);
99
118
  }
100
119
 
101
120
  :global(.switch[data-state='checked'] .switch__thumb) {
102
121
  transform: translateX(1.25rem);
122
+ background: var(--color-bg, #ffffff);
103
123
  }
104
124
 
105
125
  .switch__label {
@@ -0,0 +1,175 @@
1
+ <script lang="ts">
2
+ import type { TableProps } from '../../types/data-display.js';
3
+
4
+ interface Props {
5
+ /**
6
+ * Enable alternating row background colors
7
+ * @default false
8
+ */
9
+ striped?: boolean;
10
+ /**
11
+ * Show borders on table cells
12
+ * @default false
13
+ */
14
+ bordered?: boolean;
15
+ /**
16
+ * Enable hover effect on table rows
17
+ * @default false
18
+ */
19
+ hoverable?: boolean;
20
+ /**
21
+ * Reduce padding for more compact layout
22
+ * @default false
23
+ */
24
+ compact?: boolean;
25
+ /**
26
+ * Make table header sticky on scroll
27
+ * @default false
28
+ */
29
+ stickyHeader?: boolean;
30
+ /**
31
+ * Additional CSS classes
32
+ */
33
+ class?: string;
34
+ /**
35
+ * Table content (thead, tbody, tfoot)
36
+ */
37
+ children?: import('svelte').Snippet;
38
+ }
39
+
40
+ let {
41
+ striped = false,
42
+ bordered = false,
43
+ hoverable = false,
44
+ compact = false,
45
+ stickyHeader = false,
46
+ class: className = '',
47
+ children
48
+ }: Props = $props();
49
+
50
+ // Build modifier classes
51
+ let modifierClasses = $derived(
52
+ [
53
+ striped ? 'table-container--striped' : '',
54
+ bordered ? 'table-container--bordered' : '',
55
+ hoverable ? 'table-container--hoverable' : '',
56
+ compact ? 'table-container--compact' : '',
57
+ stickyHeader ? 'table-container--sticky-header' : ''
58
+ ]
59
+ .filter(Boolean)
60
+ .join(' ')
61
+ );
62
+ </script>
63
+
64
+ <div class="table-container {modifierClasses} {className}">
65
+ <table class="table">
66
+ {#if children}
67
+ {@render children()}
68
+ {/if}
69
+ </table>
70
+ </div>
71
+
72
+ <style>
73
+ .table-container {
74
+ /* Horizontal scroll for responsive tables on mobile */
75
+ overflow-x: auto;
76
+ -webkit-overflow-scrolling: touch; /* Smooth scrolling on iOS */
77
+ font-family: inherit;
78
+ }
79
+
80
+ .table {
81
+ width: 100%;
82
+ border-collapse: collapse;
83
+ border-spacing: 0;
84
+ font-family: inherit;
85
+ font-size: 0.875rem; /* 14px */
86
+ }
87
+
88
+ /* Default cell padding */
89
+ .table :global(th),
90
+ .table :global(td) {
91
+ padding: 0.75rem; /* 12px */
92
+ text-align: left;
93
+ vertical-align: middle;
94
+ }
95
+
96
+ /* Header styles */
97
+ .table :global(thead th) {
98
+ font-weight: 600;
99
+ color: var(--color-text-muted, var(--gray-11, inherit));
100
+ background-color: var(--color-bg-muted, var(--gray-2, #f9fafb));
101
+ border-bottom: 2px solid var(--color-border, var(--gray-6, #e5e7eb));
102
+ }
103
+
104
+ /* Body cell styles */
105
+ .table :global(tbody td) {
106
+ color: var(--color-text, var(--gray-12, inherit));
107
+ border-bottom: 1px solid var(--color-border, var(--gray-6, #e5e7eb));
108
+ }
109
+
110
+ /* Footer styles */
111
+ .table :global(tfoot td),
112
+ .table :global(tfoot th) {
113
+ font-weight: 600;
114
+ color: var(--color-text-muted, var(--gray-11, inherit));
115
+ background-color: var(--color-bg-muted, var(--gray-2, #f9fafb));
116
+ border-top: 2px solid var(--color-border, var(--gray-6, #e5e7eb));
117
+ }
118
+
119
+ /* Striped modifier - alternating row backgrounds */
120
+ .table-container--striped .table :global(tbody tr:nth-child(even)) {
121
+ background-color: var(--color-bg-muted, var(--gray-2, #f9fafb));
122
+ }
123
+
124
+ /* Bordered modifier - borders on all cells */
125
+ .table-container--bordered .table :global(th),
126
+ .table-container--bordered .table :global(td) {
127
+ border: 1px solid var(--color-border, #e5e7eb);
128
+ }
129
+
130
+ .table-container--bordered .table :global(thead th) {
131
+ border-bottom-width: 2px;
132
+ }
133
+
134
+ /* Hoverable modifier - row hover effects */
135
+ .table-container--hoverable .table :global(tbody tr) {
136
+ transition: background-color 0.15s ease;
137
+ }
138
+
139
+ .table-container--hoverable .table :global(tbody tr:hover) {
140
+ background-color: var(--color-bg-hover, var(--gray-4, #f3f4f6));
141
+ cursor: pointer;
142
+ }
143
+
144
+ /* Compact modifier - reduced padding */
145
+ .table-container--compact .table :global(th),
146
+ .table-container--compact .table :global(td) {
147
+ padding: 0.5rem; /* 8px */
148
+ }
149
+
150
+ /* Sticky header modifier - header stays visible on scroll */
151
+ .table-container--sticky-header .table :global(thead th) {
152
+ position: sticky;
153
+ top: 0;
154
+ z-index: 10;
155
+ box-shadow: 0 1px 0 0 var(--color-border, var(--gray-6, #e5e7eb));
156
+ }
157
+
158
+ /* Ensure sticky header has proper background */
159
+ .table-container--sticky-header .table :global(thead th) {
160
+ background-color: var(--color-bg-muted, var(--gray-2, #f9fafb));
161
+ }
162
+
163
+ /* Right-align numeric columns */
164
+ .table :global(td.numeric),
165
+ .table :global(th.numeric) {
166
+ text-align: right;
167
+ font-variant-numeric: tabular-nums;
168
+ }
169
+
170
+ /* Center-align specific columns */
171
+ .table :global(td.center),
172
+ .table :global(th.center) {
173
+ text-align: center;
174
+ }
175
+ </style>
@@ -0,0 +1,38 @@
1
+ interface Props {
2
+ /**
3
+ * Enable alternating row background colors
4
+ * @default false
5
+ */
6
+ striped?: boolean;
7
+ /**
8
+ * Show borders on table cells
9
+ * @default false
10
+ */
11
+ bordered?: boolean;
12
+ /**
13
+ * Enable hover effect on table rows
14
+ * @default false
15
+ */
16
+ hoverable?: boolean;
17
+ /**
18
+ * Reduce padding for more compact layout
19
+ * @default false
20
+ */
21
+ compact?: boolean;
22
+ /**
23
+ * Make table header sticky on scroll
24
+ * @default false
25
+ */
26
+ stickyHeader?: boolean;
27
+ /**
28
+ * Additional CSS classes
29
+ */
30
+ class?: string;
31
+ /**
32
+ * Table content (thead, tbody, tfoot)
33
+ */
34
+ children?: import('svelte').Snippet;
35
+ }
36
+ declare const Table: import("svelte").Component<Props, {}, "">;
37
+ type Table = ReturnType<typeof Table>;
38
+ export default Table;
@@ -0,0 +1,26 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ /**
4
+ * Additional CSS classes
5
+ */
6
+ class?: string;
7
+ /**
8
+ * Table rows content
9
+ */
10
+ children?: import('svelte').Snippet;
11
+ }
12
+
13
+ let { class: className = '', children }: Props = $props();
14
+ </script>
15
+
16
+ <tbody class="table-body {className}">
17
+ {#if children}
18
+ {@render children()}
19
+ {/if}
20
+ </tbody>
21
+
22
+ <style>
23
+ .table-body {
24
+ font-family: inherit;
25
+ }
26
+ </style>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ /**
3
+ * Additional CSS classes
4
+ */
5
+ class?: string;
6
+ /**
7
+ * Table rows content
8
+ */
9
+ children?: import('svelte').Snippet;
10
+ }
11
+ declare const TableBody: import("svelte").Component<Props, {}, "">;
12
+ type TableBody = ReturnType<typeof TableBody>;
13
+ export default TableBody;
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ /**
4
+ * Text alignment
5
+ * @default 'left'
6
+ */
7
+ align?: 'left' | 'center' | 'right';
8
+ /**
9
+ * Truncate long text with ellipsis
10
+ * @default false
11
+ */
12
+ truncate?: boolean;
13
+ /**
14
+ * Prevent text wrapping
15
+ * @default false
16
+ */
17
+ nowrap?: boolean;
18
+ /**
19
+ * Additional CSS classes
20
+ */
21
+ class?: string;
22
+ /**
23
+ * Cell content
24
+ */
25
+ children?: import('svelte').Snippet;
26
+ }
27
+
28
+ let {
29
+ align = 'left',
30
+ truncate = false,
31
+ nowrap = false,
32
+ class: className = '',
33
+ children
34
+ }: Props = $props();
35
+
36
+ // Build modifier classes
37
+ let modifierClasses = $derived(
38
+ [
39
+ align !== 'left' ? `table-cell--align-${align}` : '',
40
+ truncate ? 'table-cell--truncate' : '',
41
+ nowrap ? 'table-cell--nowrap' : ''
42
+ ]
43
+ .filter(Boolean)
44
+ .join(' ')
45
+ );
46
+ </script>
47
+
48
+ <td class="table-cell {modifierClasses} {className}">
49
+ {#if children}
50
+ {@render children()}
51
+ {/if}
52
+ </td>
53
+
54
+ <style>
55
+ .table-cell {
56
+ padding: 0.75rem; /* 12px */
57
+ font-family: inherit;
58
+ font-size: 0.875rem; /* 14px */
59
+ color: var(--color-text, var(--gray-12, inherit));
60
+ border-bottom: 1px solid var(--color-border, var(--gray-6, #e5e7eb));
61
+ vertical-align: middle;
62
+ }
63
+
64
+ /* Alignment modifiers */
65
+ .table-cell--align-center {
66
+ text-align: center;
67
+ }
68
+
69
+ .table-cell--align-right {
70
+ text-align: right;
71
+ }
72
+
73
+ /* Truncate modifier - truncate long text with ellipsis */
74
+ .table-cell--truncate {
75
+ max-width: 12.5rem; /* 200px */
76
+ overflow: hidden;
77
+ text-overflow: ellipsis;
78
+ white-space: nowrap;
79
+ }
80
+
81
+ /* Nowrap modifier - prevent text wrapping */
82
+ .table-cell--nowrap {
83
+ white-space: nowrap;
84
+ }
85
+ </style>
@@ -0,0 +1,28 @@
1
+ interface Props {
2
+ /**
3
+ * Text alignment
4
+ * @default 'left'
5
+ */
6
+ align?: 'left' | 'center' | 'right';
7
+ /**
8
+ * Truncate long text with ellipsis
9
+ * @default false
10
+ */
11
+ truncate?: boolean;
12
+ /**
13
+ * Prevent text wrapping
14
+ * @default false
15
+ */
16
+ nowrap?: boolean;
17
+ /**
18
+ * Additional CSS classes
19
+ */
20
+ class?: string;
21
+ /**
22
+ * Cell content
23
+ */
24
+ children?: import('svelte').Snippet;
25
+ }
26
+ declare const TableCell: import("svelte").Component<Props, {}, "">;
27
+ type TableCell = ReturnType<typeof TableCell>;
28
+ export default TableCell;
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ /**
4
+ * Additional CSS classes
5
+ */
6
+ class?: string;
7
+ /**
8
+ * Header rows content (TableHeader components)
9
+ */
10
+ children?: import('svelte').Snippet;
11
+ }
12
+
13
+ let { class: className = '', children }: Props = $props();
14
+ </script>
15
+
16
+ <thead class="table-head {className}">
17
+ {#if children}
18
+ {@render children()}
19
+ {/if}
20
+ </thead>
21
+
22
+ <style>
23
+ .table-head {
24
+ font-family: inherit;
25
+ }
26
+
27
+ .table-head :global(th) {
28
+ font-weight: 600;
29
+ color: var(--color-text-muted, var(--gray-11, inherit));
30
+ background-color: var(--color-bg-muted, var(--gray-2, #f9fafb));
31
+ border-bottom: 2px solid var(--color-border, var(--gray-6, #e5e7eb));
32
+ padding: 0.75rem; /* 12px */
33
+ text-align: left;
34
+ vertical-align: middle;
35
+ }
36
+ </style>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ /**
3
+ * Additional CSS classes
4
+ */
5
+ class?: string;
6
+ /**
7
+ * Header rows content (TableHeader components)
8
+ */
9
+ children?: import('svelte').Snippet;
10
+ }
11
+ declare const TableHead: import("svelte").Component<Props, {}, "">;
12
+ type TableHead = ReturnType<typeof TableHead>;
13
+ export default TableHead;
@@ -0,0 +1,217 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ /**
4
+ * Enable sortable functionality with click/keyboard interaction
5
+ * @default false
6
+ */
7
+ sortable?: boolean;
8
+ /**
9
+ * Current sort direction (when sortable is true)
10
+ * @default null
11
+ */
12
+ sortDirection?: 'asc' | 'desc' | null;
13
+ /**
14
+ * Callback fired when sort is triggered (click or keyboard)
15
+ */
16
+ onsort?: () => void;
17
+ /**
18
+ * Text alignment
19
+ * @default 'left'
20
+ */
21
+ align?: 'left' | 'center' | 'right';
22
+ /**
23
+ * Additional CSS classes
24
+ */
25
+ class?: string;
26
+ /**
27
+ * Header cell content
28
+ */
29
+ children?: import('svelte').Snippet;
30
+ }
31
+
32
+ let {
33
+ sortable = false,
34
+ sortDirection = null,
35
+ onsort,
36
+ align = 'left',
37
+ class: className = '',
38
+ children
39
+ }: Props = $props();
40
+
41
+ function handleClick() {
42
+ if (sortable && onsort) {
43
+ onsort();
44
+ }
45
+ }
46
+
47
+ function handleKeydown(event: KeyboardEvent) {
48
+ if (sortable && (event.key === 'Enter' || event.key === ' ')) {
49
+ event.preventDefault();
50
+ if (onsort) {
51
+ onsort();
52
+ }
53
+ }
54
+ }
55
+
56
+ // Build modifier classes
57
+ let modifierClasses = $derived(
58
+ [
59
+ sortable ? 'table-header--sortable' : '',
60
+ sortDirection ? `table-header--sorted-${sortDirection}` : '',
61
+ align !== 'left' ? `table-header--align-${align}` : ''
62
+ ]
63
+ .filter(Boolean)
64
+ .join(' ')
65
+ );
66
+ </script>
67
+
68
+ <th
69
+ scope="col"
70
+ class="table-header {modifierClasses} {className}"
71
+ role={sortable ? 'button' : undefined}
72
+ tabindex={sortable ? 0 : undefined}
73
+ aria-sort={sortDirection === 'asc'
74
+ ? 'ascending'
75
+ : sortDirection === 'desc'
76
+ ? 'descending'
77
+ : undefined}
78
+ onclick={handleClick}
79
+ onkeydown={handleKeydown}
80
+ >
81
+ <div class="table-header__content">
82
+ {#if children}
83
+ {@render children()}
84
+ {/if}
85
+ {#if sortable}
86
+ <span class="table-header__sort-indicator" aria-hidden="true">
87
+ <svg
88
+ class="table-header__sort-icon table-header__sort-icon--asc"
89
+ width="12"
90
+ height="12"
91
+ viewBox="0 0 12 12"
92
+ fill="none"
93
+ xmlns="http://www.w3.org/2000/svg"
94
+ >
95
+ <path d="M6 3L9 7H3L6 3Z" fill="currentColor" />
96
+ </svg>
97
+ <svg
98
+ class="table-header__sort-icon table-header__sort-icon--desc"
99
+ width="12"
100
+ height="12"
101
+ viewBox="0 0 12 12"
102
+ fill="none"
103
+ xmlns="http://www.w3.org/2000/svg"
104
+ >
105
+ <path d="M6 9L3 5H9L6 9Z" fill="currentColor" />
106
+ </svg>
107
+ </span>
108
+ {/if}
109
+ </div>
110
+ </th>
111
+
112
+ <style>
113
+ .table-header {
114
+ font-family: inherit;
115
+ position: relative;
116
+ user-select: none;
117
+ }
118
+
119
+ .table-header__content {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 0.5rem; /* 8px */
123
+ min-height: 2.75rem; /* 44px minimum touch target */
124
+ }
125
+
126
+ /* Sortable styles */
127
+ .table-header--sortable {
128
+ cursor: pointer;
129
+ transition: background-color var(--transition-fast, 150ms ease);
130
+ }
131
+
132
+ .table-header--sortable:hover {
133
+ background-color: var(--color-bg-hover, rgba(0, 0, 0, 0.04));
134
+ }
135
+
136
+ .table-header--sortable:active {
137
+ background-color: var(--color-bg-active, rgba(0, 0, 0, 0.08));
138
+ }
139
+
140
+ .table-header--sortable:focus-visible {
141
+ outline: 2px solid var(--color-primary, #3b82f6);
142
+ outline-offset: -2px;
143
+ }
144
+
145
+ /* Sort indicator */
146
+ .table-header__sort-indicator {
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: 0.0625rem; /* 1px */
150
+ flex-shrink: 0;
151
+ opacity: 0.4;
152
+ transition: opacity var(--transition-fast, 150ms ease);
153
+ }
154
+
155
+ .table-header--sortable:hover .table-header__sort-indicator {
156
+ opacity: 0.6;
157
+ }
158
+
159
+ .table-header__sort-icon {
160
+ display: block;
161
+ width: 0.75rem; /* 12px */
162
+ height: 0.75rem; /* 12px */
163
+ color: currentColor;
164
+ transition: opacity var(--transition-fast, 150ms ease);
165
+ }
166
+
167
+ /* Default state - both arrows visible but dimmed */
168
+ .table-header__sort-icon--asc,
169
+ .table-header__sort-icon--desc {
170
+ opacity: 0.5;
171
+ }
172
+
173
+ /* Ascending state - highlight up arrow */
174
+ .table-header--sorted-asc .table-header__sort-indicator {
175
+ opacity: 1;
176
+ }
177
+
178
+ .table-header--sorted-asc .table-header__sort-icon--asc {
179
+ opacity: 1;
180
+ color: var(--color-primary, #3b82f6);
181
+ }
182
+
183
+ .table-header--sorted-asc .table-header__sort-icon--desc {
184
+ opacity: 0.2;
185
+ }
186
+
187
+ /* Descending state - highlight down arrow */
188
+ .table-header--sorted-desc .table-header__sort-indicator {
189
+ opacity: 1;
190
+ }
191
+
192
+ .table-header--sorted-desc .table-header__sort-icon--desc {
193
+ opacity: 1;
194
+ color: var(--color-primary, #3b82f6);
195
+ }
196
+
197
+ .table-header--sorted-desc .table-header__sort-icon--asc {
198
+ opacity: 0.2;
199
+ }
200
+
201
+ /* Alignment modifiers */
202
+ .table-header--align-center {
203
+ text-align: center;
204
+ }
205
+
206
+ .table-header--align-center .table-header__content {
207
+ justify-content: center;
208
+ }
209
+
210
+ .table-header--align-right {
211
+ text-align: right;
212
+ }
213
+
214
+ .table-header--align-right .table-header__content {
215
+ justify-content: flex-end;
216
+ }
217
+ </style>