@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.
- package/README.md +793 -43
- package/dist/components/Accordion/Accordion.svelte +79 -0
- package/dist/components/Accordion/Accordion.svelte.d.ts +10 -0
- package/dist/components/Accordion/AccordionItem.svelte +198 -0
- package/dist/components/Accordion/AccordionItem.svelte.d.ts +10 -0
- package/dist/components/Accordion/index.d.ts +2 -0
- package/dist/components/Accordion/index.js +2 -0
- package/dist/components/ActionSheet/ActionSheet.svelte +270 -0
- package/dist/components/ActionSheet/ActionSheet.svelte.d.ts +12 -0
- package/dist/components/ActionSheet/ActionSheetItem.svelte +151 -0
- package/dist/components/ActionSheet/ActionSheetItem.svelte.d.ts +10 -0
- package/dist/components/ActionSheet/index.d.ts +3 -0
- package/dist/components/ActionSheet/index.js +2 -0
- package/dist/components/Alert/Alert.svelte +165 -0
- package/dist/components/Alert/Alert.svelte.d.ts +11 -0
- package/dist/components/Alert/index.d.ts +1 -0
- package/dist/components/Alert/index.js +1 -0
- package/dist/components/AspectRatio/AspectRatio.svelte +42 -0
- package/dist/components/AspectRatio/AspectRatio.svelte.d.ts +9 -0
- package/dist/components/AspectRatio/index.d.ts +1 -0
- package/dist/components/AspectRatio/index.js +1 -0
- package/dist/components/Avatar/Avatar.svelte +147 -0
- package/dist/components/Avatar/Avatar.svelte.d.ts +12 -0
- package/dist/components/Avatar/AvatarGroup.svelte +153 -0
- package/dist/components/Avatar/AvatarGroup.svelte.d.ts +12 -0
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Avatar/index.js +2 -0
- package/dist/components/BottomSheet/BottomSheet.svelte +230 -0
- package/dist/components/BottomSheet/BottomSheet.svelte.d.ts +7 -0
- package/dist/components/BottomSheet/BottomSheetBody.svelte +20 -0
- package/dist/components/BottomSheet/BottomSheetBody.svelte.d.ts +7 -0
- package/dist/components/BottomSheet/BottomSheetHeader.svelte +27 -0
- package/dist/components/BottomSheet/BottomSheetHeader.svelte.d.ts +7 -0
- package/dist/components/BottomSheet/index.d.ts +3 -0
- package/dist/components/BottomSheet/index.js +3 -0
- package/dist/components/Box/Box.svelte +41 -0
- package/dist/components/Box/Box.svelte.d.ts +7 -0
- package/dist/components/Box/index.d.ts +1 -0
- package/dist/components/Box/index.js +1 -0
- package/dist/components/Card/Card.svelte +95 -0
- package/dist/components/Card/Card.svelte.d.ts +10 -0
- package/dist/components/Card/CardBody.svelte +32 -0
- package/dist/components/Card/CardBody.svelte.d.ts +7 -0
- package/dist/components/Card/CardFooter.svelte +34 -0
- package/dist/components/Card/CardFooter.svelte.d.ts +7 -0
- package/dist/components/Card/CardHeader.svelte +67 -0
- package/dist/components/Card/CardHeader.svelte.d.ts +9 -0
- package/dist/components/Card/index.d.ts +4 -0
- package/dist/components/Card/index.js +4 -0
- package/dist/components/Carousel/Carousel.svelte +454 -0
- package/dist/components/Carousel/Carousel.svelte.d.ts +14 -0
- package/dist/components/Carousel/CarouselSlide.svelte +22 -0
- package/dist/components/Carousel/CarouselSlide.svelte.d.ts +7 -0
- package/dist/components/Carousel/index.d.ts +2 -0
- package/dist/components/Carousel/index.js +2 -0
- package/dist/components/Center/Center.svelte +28 -0
- package/dist/components/Center/Center.svelte.d.ts +8 -0
- package/dist/components/Center/index.d.ts +1 -0
- package/dist/components/Center/index.js +1 -0
- package/dist/components/Chip/Chip.svelte +461 -0
- package/dist/components/Chip/Chip.svelte.d.ts +17 -0
- package/dist/components/Chip/ChipGroup.svelte +76 -0
- package/dist/components/Chip/ChipGroup.svelte.d.ts +9 -0
- package/dist/components/Chip/index.d.ts +2 -0
- package/dist/components/Chip/index.js +2 -0
- package/dist/components/Container/Container.svelte +58 -0
- package/dist/components/Container/Container.svelte.d.ts +10 -0
- package/dist/components/Container/index.d.ts +1 -0
- package/dist/components/Container/index.js +1 -0
- package/dist/components/DatePicker/DatePicker.svelte +746 -0
- package/dist/components/DatePicker/DatePicker.svelte.d.ts +19 -0
- package/dist/components/DatePicker/index.d.ts +1 -0
- package/dist/components/DatePicker/index.js +1 -0
- package/dist/components/Divider/Divider.svelte +38 -0
- package/dist/components/Divider/Divider.svelte.d.ts +9 -0
- package/dist/components/Divider/index.d.ts +1 -0
- package/dist/components/Divider/index.js +1 -0
- package/dist/components/EmptyState/EmptyState.svelte +164 -0
- package/dist/components/EmptyState/EmptyState.svelte.d.ts +12 -0
- package/dist/components/EmptyState/index.d.ts +1 -0
- package/dist/components/EmptyState/index.js +1 -0
- package/dist/components/FAB/FAB.svelte +242 -0
- package/dist/components/FAB/FAB.svelte.d.ts +9 -0
- package/dist/components/FAB/FABGroup.svelte +449 -0
- package/dist/components/FAB/FABGroup.svelte.d.ts +9 -0
- package/dist/components/FAB/index.d.ts +3 -0
- package/dist/components/FAB/index.js +2 -0
- package/dist/components/FileUpload/FileUpload.svelte +484 -0
- package/dist/components/FileUpload/FileUpload.svelte.d.ts +16 -0
- package/dist/components/FileUpload/index.d.ts +1 -0
- package/dist/components/FileUpload/index.js +1 -0
- package/dist/components/Grid/Grid.svelte +136 -0
- package/dist/components/Grid/Grid.svelte.d.ts +12 -0
- package/dist/components/Grid/GridItem.svelte +21 -0
- package/dist/components/Grid/GridItem.svelte.d.ts +7 -0
- package/dist/components/Grid/index.d.ts +2 -0
- package/dist/components/Grid/index.js +2 -0
- package/dist/components/Image/Image.svelte +223 -0
- package/dist/components/Image/Image.svelte.d.ts +19 -0
- package/dist/components/Image/index.d.ts +1 -0
- package/dist/components/Image/index.js +1 -0
- package/dist/components/List/List.svelte +42 -0
- package/dist/components/List/List.svelte.d.ts +18 -0
- package/dist/components/List/ListItem.svelte +139 -0
- package/dist/components/List/ListItem.svelte.d.ts +36 -0
- package/dist/components/List/index.d.ts +2 -0
- package/dist/components/List/index.js +2 -0
- package/dist/components/Modal/Modal.svelte +204 -0
- package/dist/components/Modal/Modal.svelte.d.ts +7 -0
- package/dist/components/Modal/ModalBody.svelte +50 -0
- package/dist/components/Modal/ModalBody.svelte.d.ts +7 -0
- package/dist/components/Modal/ModalFooter.svelte +37 -0
- package/dist/components/Modal/ModalFooter.svelte.d.ts +7 -0
- package/dist/components/Modal/ModalHeader.svelte +73 -0
- package/dist/components/Modal/ModalHeader.svelte.d.ts +7 -0
- package/dist/components/Modal/index.d.ts +4 -0
- package/dist/components/Modal/index.js +4 -0
- package/dist/components/OTPInput/OTPInput.svelte +312 -0
- package/dist/components/OTPInput/OTPInput.svelte.d.ts +57 -0
- package/dist/components/OTPInput/index.d.ts +1 -0
- package/dist/components/OTPInput/index.js +1 -0
- package/dist/components/Popover/Popover.svelte +14 -0
- package/dist/components/Popover/Popover.svelte.d.ts +7 -0
- package/dist/components/Popover/PopoverContent.svelte +63 -0
- package/dist/components/Popover/PopoverContent.svelte.d.ts +7 -0
- package/dist/components/Popover/PopoverTrigger.svelte +14 -0
- package/dist/components/Popover/PopoverTrigger.svelte.d.ts +7 -0
- package/dist/components/Popover/index.d.ts +3 -0
- package/dist/components/Popover/index.js +3 -0
- package/dist/components/Progress/ProgressBar.svelte +86 -0
- package/dist/components/Progress/ProgressBar.svelte.d.ts +11 -0
- package/dist/components/Progress/ProgressCircle.svelte +134 -0
- package/dist/components/Progress/ProgressCircle.svelte.d.ts +12 -0
- package/dist/components/Progress/Spinner.svelte +68 -0
- package/dist/components/Progress/Spinner.svelte.d.ts +8 -0
- package/dist/components/Progress/index.d.ts +3 -0
- package/dist/components/Progress/index.js +3 -0
- package/dist/components/PullToRefresh/PullToRefresh.svelte +304 -0
- package/dist/components/PullToRefresh/PullToRefresh.svelte.d.ts +20 -0
- package/dist/components/PullToRefresh/index.d.ts +1 -0
- package/dist/components/PullToRefresh/index.js +1 -0
- package/dist/components/Rating/Rating.svelte +316 -0
- package/dist/components/Rating/Rating.svelte.d.ts +16 -0
- package/dist/components/Rating/index.d.ts +1 -0
- package/dist/components/Rating/index.js +1 -0
- package/dist/components/SafeArea/SafeArea.svelte +33 -0
- package/dist/components/SafeArea/SafeArea.svelte.d.ts +7 -0
- package/dist/components/SearchInput/SearchInput.svelte +480 -0
- package/dist/components/SearchInput/SearchInput.svelte.d.ts +22 -0
- package/dist/components/SearchInput/index.d.ts +1 -0
- package/dist/components/SearchInput/index.js +1 -0
- package/dist/components/Select/Select.svelte +55 -12
- package/dist/components/Skeleton/Skeleton.svelte +59 -0
- package/dist/components/Skeleton/Skeleton.svelte.d.ts +10 -0
- package/dist/components/Skeleton/index.d.ts +1 -0
- package/dist/components/Skeleton/index.js +1 -0
- package/dist/components/Slider/Slider.svelte +324 -0
- package/dist/components/Slider/Slider.svelte.d.ts +14 -0
- package/dist/components/Slider/index.d.ts +1 -0
- package/dist/components/Slider/index.js +1 -0
- package/dist/components/Spacer/Spacer.svelte +56 -0
- package/dist/components/Spacer/Spacer.svelte.d.ts +6 -0
- package/dist/components/Spacer/index.d.ts +1 -0
- package/dist/components/Spacer/index.js +1 -0
- package/dist/components/Stack/Stack.svelte +117 -0
- package/dist/components/Stack/Stack.svelte.d.ts +13 -0
- package/dist/components/Stack/index.d.ts +1 -0
- package/dist/components/Stack/index.js +1 -0
- package/dist/components/Stepper/Stepper.svelte +100 -0
- package/dist/components/Stepper/Stepper.svelte.d.ts +11 -0
- package/dist/components/Stepper/StepperStep.svelte +391 -0
- package/dist/components/Stepper/StepperStep.svelte.d.ts +13 -0
- package/dist/components/Stepper/index.d.ts +2 -0
- package/dist/components/Stepper/index.js +2 -0
- package/dist/components/SwipeActions/SwipeAction.svelte +43 -0
- package/dist/components/SwipeActions/SwipeAction.svelte.d.ts +8 -0
- package/dist/components/SwipeActions/SwipeActions.svelte +193 -0
- package/dist/components/SwipeActions/SwipeActions.svelte.d.ts +9 -0
- package/dist/components/SwipeActions/index.d.ts +2 -0
- package/dist/components/SwipeActions/index.js +2 -0
- package/dist/components/Switch/Switch.svelte +29 -9
- package/dist/components/Table/Table.svelte +175 -0
- package/dist/components/Table/Table.svelte.d.ts +38 -0
- package/dist/components/Table/TableBody.svelte +26 -0
- package/dist/components/Table/TableBody.svelte.d.ts +13 -0
- package/dist/components/Table/TableCell.svelte +85 -0
- package/dist/components/Table/TableCell.svelte.d.ts +28 -0
- package/dist/components/Table/TableHead.svelte +36 -0
- package/dist/components/Table/TableHead.svelte.d.ts +13 -0
- package/dist/components/Table/TableHeader.svelte +217 -0
- package/dist/components/Table/TableHeader.svelte.d.ts +32 -0
- package/dist/components/Table/TableRow.svelte +92 -0
- package/dist/components/Table/TableRow.svelte.d.ts +28 -0
- package/dist/components/Table/index.d.ts +6 -0
- package/dist/components/Table/index.js +6 -0
- package/dist/components/Tag/Tag.svelte +189 -0
- package/dist/components/Tag/Tag.svelte.d.ts +13 -0
- package/dist/components/Tag/index.d.ts +1 -0
- package/dist/components/Tag/index.js +1 -0
- package/dist/components/TimePicker/TimePicker.svelte +803 -0
- package/dist/components/TimePicker/TimePicker.svelte.d.ts +17 -0
- package/dist/components/TimePicker/index.d.ts +1 -0
- package/dist/components/TimePicker/index.js +1 -0
- package/dist/components/Toast/Toast.svelte +241 -0
- package/dist/components/Toast/Toast.svelte.d.ts +18 -0
- package/dist/components/Toast/ToastContainer.svelte +110 -0
- package/dist/components/Toast/ToastContainer.svelte.d.ts +8 -0
- package/dist/components/Toast/index.d.ts +3 -0
- package/dist/components/Toast/index.js +3 -0
- package/dist/components/Toast/toast.d.ts +13 -0
- package/dist/components/Toast/toast.js +55 -0
- package/dist/components/Tooltip/Tooltip.svelte +71 -0
- package/dist/components/Tooltip/Tooltip.svelte.d.ts +7 -0
- package/dist/components/Tooltip/index.d.ts +2 -0
- package/dist/components/Tooltip/index.js +1 -0
- package/dist/index.d.ts +38 -1
- package/dist/index.js +41 -0
- package/dist/styles/tokens.css +5 -0
- package/dist/types/data-display.d.ts +161 -0
- package/dist/types/data-display.js +1 -0
- package/dist/types/feedback.d.ts +92 -0
- package/dist/types/feedback.js +1 -0
- package/dist/types/index.d.ts +6 -1
- package/dist/types/input.d.ts +67 -0
- package/dist/types/input.js +2 -0
- package/dist/types/layout.d.ts +57 -0
- package/dist/types/layout.js +1 -0
- package/dist/types/mobile.d.ts +91 -0
- package/dist/types/mobile.js +1 -0
- package/dist/types/navigation.d.ts +15 -0
- package/dist/utils/gestures.d.ts +219 -0
- package/dist/utils/gestures.js +492 -0
- package/dist/utils/haptics.d.ts +89 -0
- package/dist/utils/haptics.js +198 -0
- package/dist/utils/platform.d.ts +47 -0
- package/dist/utils/platform.js +156 -0
- 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:
|
|
69
|
+
border: 2px solid var(--color-border-strong, #9ca3af);
|
|
70
70
|
border-radius: 9999px;
|
|
71
|
-
background: var(--color-bg
|
|
71
|
+
background: var(--color-bg, #ffffff);
|
|
72
72
|
cursor: pointer;
|
|
73
|
-
transition:
|
|
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
|
-
|
|
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:
|
|
94
|
-
height:
|
|
106
|
+
width: 1rem;
|
|
107
|
+
height: 1rem;
|
|
95
108
|
border-radius: 50%;
|
|
96
|
-
background: var(--color-
|
|
97
|
-
box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.
|
|
98
|
-
transition:
|
|
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>
|