@aspect-ops/exon-ui 0.0.1 → 0.0.3
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 +438 -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/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/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/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/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/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/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/SafeArea/SafeArea.svelte +33 -0
- package/dist/components/SafeArea/SafeArea.svelte.d.ts +7 -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/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/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/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 +29 -1
- package/dist/index.js +32 -0
- package/dist/styles/tokens.css +5 -0
- package/dist/types/data-display.d.ts +93 -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 +4 -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/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
|
@@ -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>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/**
|
|
3
|
+
* Enable sortable functionality with click/keyboard interaction
|
|
4
|
+
* @default false
|
|
5
|
+
*/
|
|
6
|
+
sortable?: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Current sort direction (when sortable is true)
|
|
9
|
+
* @default null
|
|
10
|
+
*/
|
|
11
|
+
sortDirection?: 'asc' | 'desc' | null;
|
|
12
|
+
/**
|
|
13
|
+
* Callback fired when sort is triggered (click or keyboard)
|
|
14
|
+
*/
|
|
15
|
+
onsort?: () => void;
|
|
16
|
+
/**
|
|
17
|
+
* Text alignment
|
|
18
|
+
* @default 'left'
|
|
19
|
+
*/
|
|
20
|
+
align?: 'left' | 'center' | 'right';
|
|
21
|
+
/**
|
|
22
|
+
* Additional CSS classes
|
|
23
|
+
*/
|
|
24
|
+
class?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Header cell content
|
|
27
|
+
*/
|
|
28
|
+
children?: import('svelte').Snippet;
|
|
29
|
+
}
|
|
30
|
+
declare const TableHeader: import("svelte").Component<Props, {}, "">;
|
|
31
|
+
type TableHeader = ReturnType<typeof TableHeader>;
|
|
32
|
+
export default TableHeader;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
/**
|
|
4
|
+
* Marks the row as selected
|
|
5
|
+
* @default false
|
|
6
|
+
*/
|
|
7
|
+
selected?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Makes the row interactive with hover/active states
|
|
10
|
+
* @default false
|
|
11
|
+
*/
|
|
12
|
+
clickable?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Disables the row
|
|
15
|
+
* @default false
|
|
16
|
+
*/
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Additional CSS classes
|
|
20
|
+
*/
|
|
21
|
+
class?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Table cells content
|
|
24
|
+
*/
|
|
25
|
+
children?: import('svelte').Snippet;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let {
|
|
29
|
+
selected = false,
|
|
30
|
+
clickable = false,
|
|
31
|
+
disabled = false,
|
|
32
|
+
class: className = '',
|
|
33
|
+
children
|
|
34
|
+
}: Props = $props();
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<tr
|
|
38
|
+
class="table-row {selected ? 'table-row--selected' : ''} {clickable
|
|
39
|
+
? 'table-row--clickable'
|
|
40
|
+
: ''} {disabled ? 'table-row--disabled' : ''} {className}"
|
|
41
|
+
role={clickable ? 'button' : undefined}
|
|
42
|
+
aria-selected={selected ? 'true' : undefined}
|
|
43
|
+
aria-disabled={disabled ? 'true' : undefined}
|
|
44
|
+
tabindex={clickable && !disabled ? 0 : undefined}
|
|
45
|
+
>
|
|
46
|
+
{#if children}
|
|
47
|
+
{@render children()}
|
|
48
|
+
{/if}
|
|
49
|
+
</tr>
|
|
50
|
+
|
|
51
|
+
<style>
|
|
52
|
+
.table-row {
|
|
53
|
+
font-family: inherit;
|
|
54
|
+
transition: background-color var(--transition-fast, 150ms ease);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Selected state */
|
|
58
|
+
.table-row--selected {
|
|
59
|
+
background-color: var(--color-primary-bg, rgba(59, 130, 246, 0.1));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Clickable state */
|
|
63
|
+
.table-row--clickable {
|
|
64
|
+
cursor: pointer;
|
|
65
|
+
user-select: none;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.table-row--clickable:hover:not(.table-row--disabled) {
|
|
69
|
+
background-color: var(--color-bg-hover, rgba(0, 0, 0, 0.04));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.table-row--clickable:active:not(.table-row--disabled) {
|
|
73
|
+
background-color: var(--color-bg-active, rgba(0, 0, 0, 0.08));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.table-row--clickable:focus-visible {
|
|
77
|
+
outline: 2px solid var(--color-primary, #3b82f6);
|
|
78
|
+
outline-offset: -2px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Selected + Clickable hover state */
|
|
82
|
+
.table-row--selected.table-row--clickable:hover:not(.table-row--disabled) {
|
|
83
|
+
background-color: var(--color-primary-bg-hover, rgba(59, 130, 246, 0.15));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Disabled state */
|
|
87
|
+
.table-row--disabled {
|
|
88
|
+
opacity: 0.5;
|
|
89
|
+
pointer-events: none;
|
|
90
|
+
cursor: not-allowed;
|
|
91
|
+
}
|
|
92
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/**
|
|
3
|
+
* Marks the row as selected
|
|
4
|
+
* @default false
|
|
5
|
+
*/
|
|
6
|
+
selected?: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Makes the row interactive with hover/active states
|
|
9
|
+
* @default false
|
|
10
|
+
*/
|
|
11
|
+
clickable?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Disables the row
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Additional CSS classes
|
|
19
|
+
*/
|
|
20
|
+
class?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Table cells content
|
|
23
|
+
*/
|
|
24
|
+
children?: import('svelte').Snippet;
|
|
25
|
+
}
|
|
26
|
+
declare const TableRow: import("svelte").Component<Props, {}, "">;
|
|
27
|
+
type TableRow = ReturnType<typeof TableRow>;
|
|
28
|
+
export default TableRow;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as Table } from './Table.svelte';
|
|
2
|
+
export { default as TableHead } from './TableHead.svelte';
|
|
3
|
+
export { default as TableHeader } from './TableHeader.svelte';
|
|
4
|
+
export { default as TableBody } from './TableBody.svelte';
|
|
5
|
+
export { default as TableRow } from './TableRow.svelte';
|
|
6
|
+
export { default as TableCell } from './TableCell.svelte';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as Table } from './Table.svelte';
|
|
2
|
+
export { default as TableHead } from './TableHead.svelte';
|
|
3
|
+
export { default as TableHeader } from './TableHeader.svelte';
|
|
4
|
+
export { default as TableBody } from './TableBody.svelte';
|
|
5
|
+
export { default as TableRow } from './TableRow.svelte';
|
|
6
|
+
export { default as TableCell } from './TableCell.svelte';
|