@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.
Files changed (178) hide show
  1. package/README.md +438 -0
  2. package/dist/components/ActionSheet/ActionSheet.svelte +270 -0
  3. package/dist/components/ActionSheet/ActionSheet.svelte.d.ts +12 -0
  4. package/dist/components/ActionSheet/ActionSheetItem.svelte +151 -0
  5. package/dist/components/ActionSheet/ActionSheetItem.svelte.d.ts +10 -0
  6. package/dist/components/ActionSheet/index.d.ts +3 -0
  7. package/dist/components/ActionSheet/index.js +2 -0
  8. package/dist/components/Alert/Alert.svelte +165 -0
  9. package/dist/components/Alert/Alert.svelte.d.ts +11 -0
  10. package/dist/components/Alert/index.d.ts +1 -0
  11. package/dist/components/Alert/index.js +1 -0
  12. package/dist/components/AspectRatio/AspectRatio.svelte +42 -0
  13. package/dist/components/AspectRatio/AspectRatio.svelte.d.ts +9 -0
  14. package/dist/components/AspectRatio/index.d.ts +1 -0
  15. package/dist/components/AspectRatio/index.js +1 -0
  16. package/dist/components/Avatar/Avatar.svelte +147 -0
  17. package/dist/components/Avatar/Avatar.svelte.d.ts +12 -0
  18. package/dist/components/Avatar/AvatarGroup.svelte +153 -0
  19. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +12 -0
  20. package/dist/components/Avatar/index.d.ts +2 -0
  21. package/dist/components/Avatar/index.js +2 -0
  22. package/dist/components/BottomSheet/BottomSheet.svelte +230 -0
  23. package/dist/components/BottomSheet/BottomSheet.svelte.d.ts +7 -0
  24. package/dist/components/BottomSheet/BottomSheetBody.svelte +20 -0
  25. package/dist/components/BottomSheet/BottomSheetBody.svelte.d.ts +7 -0
  26. package/dist/components/BottomSheet/BottomSheetHeader.svelte +27 -0
  27. package/dist/components/BottomSheet/BottomSheetHeader.svelte.d.ts +7 -0
  28. package/dist/components/BottomSheet/index.d.ts +3 -0
  29. package/dist/components/BottomSheet/index.js +3 -0
  30. package/dist/components/Box/Box.svelte +41 -0
  31. package/dist/components/Box/Box.svelte.d.ts +7 -0
  32. package/dist/components/Box/index.d.ts +1 -0
  33. package/dist/components/Box/index.js +1 -0
  34. package/dist/components/Card/Card.svelte +95 -0
  35. package/dist/components/Card/Card.svelte.d.ts +10 -0
  36. package/dist/components/Card/CardBody.svelte +32 -0
  37. package/dist/components/Card/CardBody.svelte.d.ts +7 -0
  38. package/dist/components/Card/CardFooter.svelte +34 -0
  39. package/dist/components/Card/CardFooter.svelte.d.ts +7 -0
  40. package/dist/components/Card/CardHeader.svelte +67 -0
  41. package/dist/components/Card/CardHeader.svelte.d.ts +9 -0
  42. package/dist/components/Card/index.d.ts +4 -0
  43. package/dist/components/Card/index.js +4 -0
  44. package/dist/components/Center/Center.svelte +28 -0
  45. package/dist/components/Center/Center.svelte.d.ts +8 -0
  46. package/dist/components/Center/index.d.ts +1 -0
  47. package/dist/components/Center/index.js +1 -0
  48. package/dist/components/Container/Container.svelte +58 -0
  49. package/dist/components/Container/Container.svelte.d.ts +10 -0
  50. package/dist/components/Container/index.d.ts +1 -0
  51. package/dist/components/Container/index.js +1 -0
  52. package/dist/components/Divider/Divider.svelte +38 -0
  53. package/dist/components/Divider/Divider.svelte.d.ts +9 -0
  54. package/dist/components/Divider/index.d.ts +1 -0
  55. package/dist/components/Divider/index.js +1 -0
  56. package/dist/components/EmptyState/EmptyState.svelte +164 -0
  57. package/dist/components/EmptyState/EmptyState.svelte.d.ts +12 -0
  58. package/dist/components/EmptyState/index.d.ts +1 -0
  59. package/dist/components/EmptyState/index.js +1 -0
  60. package/dist/components/FAB/FAB.svelte +242 -0
  61. package/dist/components/FAB/FAB.svelte.d.ts +9 -0
  62. package/dist/components/FAB/FABGroup.svelte +449 -0
  63. package/dist/components/FAB/FABGroup.svelte.d.ts +9 -0
  64. package/dist/components/FAB/index.d.ts +3 -0
  65. package/dist/components/FAB/index.js +2 -0
  66. package/dist/components/Grid/Grid.svelte +136 -0
  67. package/dist/components/Grid/Grid.svelte.d.ts +12 -0
  68. package/dist/components/Grid/GridItem.svelte +21 -0
  69. package/dist/components/Grid/GridItem.svelte.d.ts +7 -0
  70. package/dist/components/Grid/index.d.ts +2 -0
  71. package/dist/components/Grid/index.js +2 -0
  72. package/dist/components/List/List.svelte +42 -0
  73. package/dist/components/List/List.svelte.d.ts +18 -0
  74. package/dist/components/List/ListItem.svelte +139 -0
  75. package/dist/components/List/ListItem.svelte.d.ts +36 -0
  76. package/dist/components/List/index.d.ts +2 -0
  77. package/dist/components/List/index.js +2 -0
  78. package/dist/components/Modal/Modal.svelte +204 -0
  79. package/dist/components/Modal/Modal.svelte.d.ts +7 -0
  80. package/dist/components/Modal/ModalBody.svelte +50 -0
  81. package/dist/components/Modal/ModalBody.svelte.d.ts +7 -0
  82. package/dist/components/Modal/ModalFooter.svelte +37 -0
  83. package/dist/components/Modal/ModalFooter.svelte.d.ts +7 -0
  84. package/dist/components/Modal/ModalHeader.svelte +73 -0
  85. package/dist/components/Modal/ModalHeader.svelte.d.ts +7 -0
  86. package/dist/components/Modal/index.d.ts +4 -0
  87. package/dist/components/Modal/index.js +4 -0
  88. package/dist/components/Popover/Popover.svelte +14 -0
  89. package/dist/components/Popover/Popover.svelte.d.ts +7 -0
  90. package/dist/components/Popover/PopoverContent.svelte +63 -0
  91. package/dist/components/Popover/PopoverContent.svelte.d.ts +7 -0
  92. package/dist/components/Popover/PopoverTrigger.svelte +14 -0
  93. package/dist/components/Popover/PopoverTrigger.svelte.d.ts +7 -0
  94. package/dist/components/Popover/index.d.ts +3 -0
  95. package/dist/components/Popover/index.js +3 -0
  96. package/dist/components/Progress/ProgressBar.svelte +86 -0
  97. package/dist/components/Progress/ProgressBar.svelte.d.ts +11 -0
  98. package/dist/components/Progress/ProgressCircle.svelte +134 -0
  99. package/dist/components/Progress/ProgressCircle.svelte.d.ts +12 -0
  100. package/dist/components/Progress/Spinner.svelte +68 -0
  101. package/dist/components/Progress/Spinner.svelte.d.ts +8 -0
  102. package/dist/components/Progress/index.d.ts +3 -0
  103. package/dist/components/Progress/index.js +3 -0
  104. package/dist/components/PullToRefresh/PullToRefresh.svelte +304 -0
  105. package/dist/components/PullToRefresh/PullToRefresh.svelte.d.ts +20 -0
  106. package/dist/components/PullToRefresh/index.d.ts +1 -0
  107. package/dist/components/PullToRefresh/index.js +1 -0
  108. package/dist/components/SafeArea/SafeArea.svelte +33 -0
  109. package/dist/components/SafeArea/SafeArea.svelte.d.ts +7 -0
  110. package/dist/components/Select/Select.svelte +55 -12
  111. package/dist/components/Skeleton/Skeleton.svelte +59 -0
  112. package/dist/components/Skeleton/Skeleton.svelte.d.ts +10 -0
  113. package/dist/components/Skeleton/index.d.ts +1 -0
  114. package/dist/components/Skeleton/index.js +1 -0
  115. package/dist/components/Spacer/Spacer.svelte +56 -0
  116. package/dist/components/Spacer/Spacer.svelte.d.ts +6 -0
  117. package/dist/components/Spacer/index.d.ts +1 -0
  118. package/dist/components/Spacer/index.js +1 -0
  119. package/dist/components/Stack/Stack.svelte +117 -0
  120. package/dist/components/Stack/Stack.svelte.d.ts +13 -0
  121. package/dist/components/Stack/index.d.ts +1 -0
  122. package/dist/components/Stack/index.js +1 -0
  123. package/dist/components/SwipeActions/SwipeAction.svelte +43 -0
  124. package/dist/components/SwipeActions/SwipeAction.svelte.d.ts +8 -0
  125. package/dist/components/SwipeActions/SwipeActions.svelte +193 -0
  126. package/dist/components/SwipeActions/SwipeActions.svelte.d.ts +9 -0
  127. package/dist/components/SwipeActions/index.d.ts +2 -0
  128. package/dist/components/SwipeActions/index.js +2 -0
  129. package/dist/components/Switch/Switch.svelte +29 -9
  130. package/dist/components/Table/Table.svelte +175 -0
  131. package/dist/components/Table/Table.svelte.d.ts +38 -0
  132. package/dist/components/Table/TableBody.svelte +26 -0
  133. package/dist/components/Table/TableBody.svelte.d.ts +13 -0
  134. package/dist/components/Table/TableCell.svelte +85 -0
  135. package/dist/components/Table/TableCell.svelte.d.ts +28 -0
  136. package/dist/components/Table/TableHead.svelte +36 -0
  137. package/dist/components/Table/TableHead.svelte.d.ts +13 -0
  138. package/dist/components/Table/TableHeader.svelte +217 -0
  139. package/dist/components/Table/TableHeader.svelte.d.ts +32 -0
  140. package/dist/components/Table/TableRow.svelte +92 -0
  141. package/dist/components/Table/TableRow.svelte.d.ts +28 -0
  142. package/dist/components/Table/index.d.ts +6 -0
  143. package/dist/components/Table/index.js +6 -0
  144. package/dist/components/Tag/Tag.svelte +189 -0
  145. package/dist/components/Tag/Tag.svelte.d.ts +13 -0
  146. package/dist/components/Tag/index.d.ts +1 -0
  147. package/dist/components/Tag/index.js +1 -0
  148. package/dist/components/Toast/Toast.svelte +241 -0
  149. package/dist/components/Toast/Toast.svelte.d.ts +18 -0
  150. package/dist/components/Toast/ToastContainer.svelte +110 -0
  151. package/dist/components/Toast/ToastContainer.svelte.d.ts +8 -0
  152. package/dist/components/Toast/index.d.ts +3 -0
  153. package/dist/components/Toast/index.js +3 -0
  154. package/dist/components/Toast/toast.d.ts +13 -0
  155. package/dist/components/Toast/toast.js +55 -0
  156. package/dist/components/Tooltip/Tooltip.svelte +71 -0
  157. package/dist/components/Tooltip/Tooltip.svelte.d.ts +7 -0
  158. package/dist/components/Tooltip/index.d.ts +2 -0
  159. package/dist/components/Tooltip/index.js +1 -0
  160. package/dist/index.d.ts +29 -1
  161. package/dist/index.js +32 -0
  162. package/dist/styles/tokens.css +5 -0
  163. package/dist/types/data-display.d.ts +93 -0
  164. package/dist/types/data-display.js +1 -0
  165. package/dist/types/feedback.d.ts +92 -0
  166. package/dist/types/feedback.js +1 -0
  167. package/dist/types/index.d.ts +4 -0
  168. package/dist/types/layout.d.ts +57 -0
  169. package/dist/types/layout.js +1 -0
  170. package/dist/types/mobile.d.ts +91 -0
  171. package/dist/types/mobile.js +1 -0
  172. package/dist/utils/gestures.d.ts +219 -0
  173. package/dist/utils/gestures.js +492 -0
  174. package/dist/utils/haptics.d.ts +89 -0
  175. package/dist/utils/haptics.js +198 -0
  176. package/dist/utils/platform.d.ts +47 -0
  177. package/dist/utils/platform.js +156 -0
  178. package/package.json +1 -1
@@ -0,0 +1,136 @@
1
+ <script lang="ts">
2
+ import type { SpacingToken, GridAlign, GridJustify } from '../../types/index.js';
3
+
4
+ interface Props {
5
+ columns?: number;
6
+ gap?: SpacingToken;
7
+ align?: GridAlign;
8
+ justify?: GridJustify;
9
+ class?: string;
10
+ children?: import('svelte').Snippet;
11
+ }
12
+
13
+ let {
14
+ columns = 12,
15
+ gap = 'md',
16
+ align = 'stretch',
17
+ justify = 'start',
18
+ class: className = '',
19
+ children
20
+ }: Props = $props();
21
+ </script>
22
+
23
+ <div
24
+ class="grid {className}"
25
+ data-columns={columns}
26
+ data-gap={gap}
27
+ data-align={align}
28
+ data-justify={justify}
29
+ >
30
+ {#if children}
31
+ {@render children()}
32
+ {/if}
33
+ </div>
34
+
35
+ <style>
36
+ .grid {
37
+ display: grid;
38
+ width: 100%;
39
+ font-family: inherit;
40
+ }
41
+
42
+ /* Columns */
43
+ .grid[data-columns='1'] {
44
+ grid-template-columns: repeat(1, 1fr);
45
+ }
46
+ .grid[data-columns='2'] {
47
+ grid-template-columns: repeat(2, 1fr);
48
+ }
49
+ .grid[data-columns='3'] {
50
+ grid-template-columns: repeat(3, 1fr);
51
+ }
52
+ .grid[data-columns='4'] {
53
+ grid-template-columns: repeat(4, 1fr);
54
+ }
55
+ .grid[data-columns='5'] {
56
+ grid-template-columns: repeat(5, 1fr);
57
+ }
58
+ .grid[data-columns='6'] {
59
+ grid-template-columns: repeat(6, 1fr);
60
+ }
61
+ .grid[data-columns='7'] {
62
+ grid-template-columns: repeat(7, 1fr);
63
+ }
64
+ .grid[data-columns='8'] {
65
+ grid-template-columns: repeat(8, 1fr);
66
+ }
67
+ .grid[data-columns='9'] {
68
+ grid-template-columns: repeat(9, 1fr);
69
+ }
70
+ .grid[data-columns='10'] {
71
+ grid-template-columns: repeat(10, 1fr);
72
+ }
73
+ .grid[data-columns='11'] {
74
+ grid-template-columns: repeat(11, 1fr);
75
+ }
76
+ .grid[data-columns='12'] {
77
+ grid-template-columns: repeat(12, 1fr);
78
+ }
79
+
80
+ /* Gap sizes using CSS custom properties */
81
+ .grid[data-gap='xs'] {
82
+ gap: var(--space-xs, 0.25rem);
83
+ }
84
+ .grid[data-gap='sm'] {
85
+ gap: var(--space-sm, 0.5rem);
86
+ }
87
+ .grid[data-gap='md'] {
88
+ gap: var(--space-md, 1rem);
89
+ }
90
+ .grid[data-gap='lg'] {
91
+ gap: var(--space-lg, 1.5rem);
92
+ }
93
+ .grid[data-gap='xl'] {
94
+ gap: var(--space-xl, 2rem);
95
+ }
96
+ .grid[data-gap='2xl'] {
97
+ gap: var(--space-2xl, 3rem);
98
+ }
99
+ .grid[data-gap='3xl'] {
100
+ gap: var(--space-3xl, 4rem);
101
+ }
102
+
103
+ /* Align items */
104
+ .grid[data-align='start'] {
105
+ align-items: start;
106
+ }
107
+ .grid[data-align='center'] {
108
+ align-items: center;
109
+ }
110
+ .grid[data-align='end'] {
111
+ align-items: end;
112
+ }
113
+ .grid[data-align='stretch'] {
114
+ align-items: stretch;
115
+ }
116
+
117
+ /* Justify items */
118
+ .grid[data-justify='start'] {
119
+ justify-items: start;
120
+ }
121
+ .grid[data-justify='center'] {
122
+ justify-items: center;
123
+ }
124
+ .grid[data-justify='end'] {
125
+ justify-items: end;
126
+ }
127
+ .grid[data-justify='space-between'] {
128
+ justify-items: space-between;
129
+ }
130
+ .grid[data-justify='space-around'] {
131
+ justify-items: space-around;
132
+ }
133
+ .grid[data-justify='space-evenly'] {
134
+ justify-items: space-evenly;
135
+ }
136
+ </style>
@@ -0,0 +1,12 @@
1
+ import type { SpacingToken, GridAlign, GridJustify } from '../../types/index.js';
2
+ interface Props {
3
+ columns?: number;
4
+ gap?: SpacingToken;
5
+ align?: GridAlign;
6
+ justify?: GridJustify;
7
+ class?: string;
8
+ children?: import('svelte').Snippet;
9
+ }
10
+ declare const Grid: import("svelte").Component<Props, {}, "">;
11
+ type Grid = ReturnType<typeof Grid>;
12
+ export default Grid;
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import type { GridItemProps } from '../../types/index.js';
3
+
4
+ interface Props extends GridItemProps {
5
+ children?: import('svelte').Snippet;
6
+ }
7
+
8
+ let { colSpan = 1, rowSpan = 1, class: className = '', children }: Props = $props();
9
+ </script>
10
+
11
+ <div class="grid-item {className}" style="grid-column: span {colSpan}; grid-row: span {rowSpan};">
12
+ {#if children}
13
+ {@render children()}
14
+ {/if}
15
+ </div>
16
+
17
+ <style>
18
+ .grid-item {
19
+ font-family: inherit;
20
+ }
21
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { GridItemProps } from '../../types/index.js';
2
+ interface Props extends GridItemProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const GridItem: import("svelte").Component<Props, {}, "">;
6
+ type GridItem = ReturnType<typeof GridItem>;
7
+ export default GridItem;
@@ -0,0 +1,2 @@
1
+ export { default as Grid } from './Grid.svelte';
2
+ export { default as GridItem } from './GridItem.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Grid } from './Grid.svelte';
2
+ export { default as GridItem } from './GridItem.svelte';
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ import type { ListProps } from '../../types/data-display.js';
3
+
4
+ interface Props {
5
+ /**
6
+ * Show dividers between list items
7
+ * @default false
8
+ */
9
+ dividers?: boolean;
10
+ /**
11
+ * Additional CSS classes
12
+ */
13
+ class?: string;
14
+ /**
15
+ * List item content
16
+ */
17
+ children?: import('svelte').Snippet;
18
+ }
19
+
20
+ let { dividers = false, class: className = '', children }: Props = $props();
21
+ </script>
22
+
23
+ <ul class="list {dividers ? 'list--dividers' : ''} {className}" role="list">
24
+ {#if children}
25
+ {@render children()}
26
+ {/if}
27
+ </ul>
28
+
29
+ <style>
30
+ .list {
31
+ /* Reset default list styles */
32
+ list-style: none;
33
+ padding: 0;
34
+ margin: 0;
35
+ font-family: inherit;
36
+ }
37
+
38
+ /* Divider styles - applied to list items */
39
+ .list--dividers :global(> li:not(:last-child)) {
40
+ border-bottom: 1px solid var(--color-border, #e5e7eb);
41
+ }
42
+ </style>
@@ -0,0 +1,18 @@
1
+ interface Props {
2
+ /**
3
+ * Show dividers between list items
4
+ * @default false
5
+ */
6
+ dividers?: boolean;
7
+ /**
8
+ * Additional CSS classes
9
+ */
10
+ class?: string;
11
+ /**
12
+ * List item content
13
+ */
14
+ children?: import('svelte').Snippet;
15
+ }
16
+ declare const List: import("svelte").Component<Props, {}, "">;
17
+ type List = ReturnType<typeof List>;
18
+ export default List;
@@ -0,0 +1,139 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ /**
4
+ * Makes the list item interactive with hover/active states
5
+ * @default false
6
+ */
7
+ clickable?: boolean;
8
+ /**
9
+ * Marks the list item as selected
10
+ * @default false
11
+ */
12
+ selected?: boolean;
13
+ /**
14
+ * Disables the list item
15
+ * @default false
16
+ */
17
+ disabled?: boolean;
18
+ /**
19
+ * Additional CSS classes
20
+ */
21
+ class?: string;
22
+ /**
23
+ * Leading content slot (icons/avatars)
24
+ */
25
+ leading?: import('svelte').Snippet;
26
+ /**
27
+ * Trailing content slot (actions/badges)
28
+ */
29
+ trailing?: import('svelte').Snippet;
30
+ /**
31
+ * Main content
32
+ */
33
+ children?: import('svelte').Snippet;
34
+ }
35
+
36
+ let {
37
+ clickable = false,
38
+ selected = false,
39
+ disabled = false,
40
+ class: className = '',
41
+ leading,
42
+ trailing,
43
+ children
44
+ }: Props = $props();
45
+ </script>
46
+
47
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
48
+ <li
49
+ class="list-item {clickable ? 'list-item--clickable' : ''} {selected
50
+ ? 'list-item--selected'
51
+ : ''} {disabled ? 'list-item--disabled' : ''} {className}"
52
+ role={clickable ? 'button' : undefined}
53
+ aria-selected={selected ? 'true' : undefined}
54
+ aria-disabled={disabled ? 'true' : undefined}
55
+ tabindex={clickable && !disabled ? 0 : -1}
56
+ >
57
+ {#if leading}
58
+ <div class="list-item__leading">
59
+ {@render leading()}
60
+ </div>
61
+ {/if}
62
+
63
+ <div class="list-item__content">
64
+ {#if children}
65
+ {@render children()}
66
+ {/if}
67
+ </div>
68
+
69
+ {#if trailing}
70
+ <div class="list-item__trailing">
71
+ {@render trailing()}
72
+ </div>
73
+ {/if}
74
+ </li>
75
+
76
+ <style>
77
+ .list-item {
78
+ display: flex;
79
+ align-items: center;
80
+ min-height: 3rem; /* 48px for touch targets */
81
+ padding: 0.75rem 1rem;
82
+ font-family: inherit;
83
+ transition: background-color var(--transition-fast, 150ms ease);
84
+ }
85
+
86
+ .list-item__leading {
87
+ display: flex;
88
+ align-items: center;
89
+ flex-shrink: 0;
90
+ margin-right: 0.75rem;
91
+ }
92
+
93
+ .list-item__content {
94
+ flex: 1;
95
+ min-width: 0; /* Allows text truncation */
96
+ }
97
+
98
+ .list-item__trailing {
99
+ display: flex;
100
+ align-items: center;
101
+ flex-shrink: 0;
102
+ margin-left: 0.75rem;
103
+ }
104
+
105
+ /* Clickable state */
106
+ .list-item--clickable {
107
+ cursor: pointer;
108
+ user-select: none;
109
+ }
110
+
111
+ .list-item--clickable:hover:not(.list-item--disabled) {
112
+ background-color: var(--color-bg-hover, rgba(0, 0, 0, 0.04));
113
+ }
114
+
115
+ .list-item--clickable:active:not(.list-item--disabled) {
116
+ background-color: var(--color-bg-active, rgba(0, 0, 0, 0.08));
117
+ }
118
+
119
+ .list-item--clickable:focus-visible {
120
+ outline: 2px solid var(--color-primary, #3b82f6);
121
+ outline-offset: -2px;
122
+ }
123
+
124
+ /* Selected state */
125
+ .list-item--selected {
126
+ background-color: var(--color-primary-bg, rgba(59, 130, 246, 0.1));
127
+ }
128
+
129
+ .list-item--selected.list-item--clickable:hover:not(.list-item--disabled) {
130
+ background-color: var(--color-primary-bg-hover, rgba(59, 130, 246, 0.15));
131
+ }
132
+
133
+ /* Disabled state */
134
+ .list-item--disabled {
135
+ opacity: 0.5;
136
+ pointer-events: none;
137
+ cursor: not-allowed;
138
+ }
139
+ </style>
@@ -0,0 +1,36 @@
1
+ interface Props {
2
+ /**
3
+ * Makes the list item interactive with hover/active states
4
+ * @default false
5
+ */
6
+ clickable?: boolean;
7
+ /**
8
+ * Marks the list item as selected
9
+ * @default false
10
+ */
11
+ selected?: boolean;
12
+ /**
13
+ * Disables the list item
14
+ * @default false
15
+ */
16
+ disabled?: boolean;
17
+ /**
18
+ * Additional CSS classes
19
+ */
20
+ class?: string;
21
+ /**
22
+ * Leading content slot (icons/avatars)
23
+ */
24
+ leading?: import('svelte').Snippet;
25
+ /**
26
+ * Trailing content slot (actions/badges)
27
+ */
28
+ trailing?: import('svelte').Snippet;
29
+ /**
30
+ * Main content
31
+ */
32
+ children?: import('svelte').Snippet;
33
+ }
34
+ declare const ListItem: import("svelte").Component<Props, {}, "">;
35
+ type ListItem = ReturnType<typeof ListItem>;
36
+ export default ListItem;
@@ -0,0 +1,2 @@
1
+ export { default as List } from './List.svelte';
2
+ export { default as ListItem } from './ListItem.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as List } from './List.svelte';
2
+ export { default as ListItem } from './ListItem.svelte';
@@ -0,0 +1,204 @@
1
+ <script lang="ts">
2
+ import type { ModalProps } from '../../types/index.js';
3
+ import { Dialog } from 'bits-ui';
4
+
5
+ interface Props extends ModalProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let {
10
+ open = $bindable(false),
11
+ size = 'md',
12
+ closeOnEscape = true,
13
+ closeOnBackdrop = true,
14
+ class: className = '',
15
+ children
16
+ }: Props = $props();
17
+
18
+ function handleOpenChange(value: boolean) {
19
+ // Only close if escape is allowed or if it's not an escape key event
20
+ if (!value && !closeOnEscape) {
21
+ return;
22
+ }
23
+ open = value;
24
+ }
25
+
26
+ function handleBackdropClick() {
27
+ if (closeOnBackdrop) {
28
+ open = false;
29
+ }
30
+ }
31
+
32
+ function handleEscapeKeyDown(event: KeyboardEvent) {
33
+ if (event.key === 'Escape' && !closeOnEscape) {
34
+ event.preventDefault();
35
+ }
36
+ }
37
+ </script>
38
+
39
+ <Dialog.Root {open} onOpenChange={handleOpenChange}>
40
+ <Dialog.Portal>
41
+ <Dialog.Overlay class="modal-overlay" onclick={handleBackdropClick} />
42
+ <Dialog.Content class="modal-content modal-{size} {className}" onkeydown={handleEscapeKeyDown}>
43
+ {@render children?.()}
44
+ </Dialog.Content>
45
+ </Dialog.Portal>
46
+ </Dialog.Root>
47
+
48
+ <style>
49
+ /* Overlay */
50
+ :global(.modal-overlay) {
51
+ position: fixed;
52
+ inset: 0;
53
+ background: rgba(0, 0, 0, 0.5);
54
+ z-index: 100;
55
+ }
56
+
57
+ :global(.modal-overlay[data-state='open']) {
58
+ animation: fade-in 200ms ease-out;
59
+ }
60
+
61
+ :global(.modal-overlay[data-state='closed']) {
62
+ animation: fade-out 150ms ease-in;
63
+ }
64
+
65
+ @keyframes -global-fade-in {
66
+ from {
67
+ opacity: 0;
68
+ }
69
+ to {
70
+ opacity: 1;
71
+ }
72
+ }
73
+
74
+ @keyframes -global-fade-out {
75
+ from {
76
+ opacity: 1;
77
+ }
78
+ to {
79
+ opacity: 0;
80
+ }
81
+ }
82
+
83
+ /* Content */
84
+ :global(.modal-content) {
85
+ /* MUST set font-family explicitly - portal doesn't inherit (F33) */
86
+ font-family: var(--font-family, system-ui, -apple-system, sans-serif);
87
+ position: fixed;
88
+ top: 50%;
89
+ left: 50%;
90
+ transform: translate(-50%, -50%);
91
+ background: var(--color-bg, #ffffff);
92
+ border-radius: var(--radius-md, 0.5rem);
93
+ box-shadow: var(--shadow-lg, 0 10px 25px rgba(0, 0, 0, 0.2));
94
+ z-index: 101;
95
+ max-height: 90vh;
96
+ display: flex;
97
+ flex-direction: column;
98
+ /* Safe area handling (F21) */
99
+ padding-top: env(safe-area-inset-top, 0);
100
+ padding-bottom: env(safe-area-inset-bottom, 0);
101
+ }
102
+
103
+ :global(.modal-content[data-state='open']) {
104
+ animation: modal-in 200ms ease-out;
105
+ }
106
+
107
+ :global(.modal-content[data-state='closed']) {
108
+ animation: modal-out 150ms ease-in;
109
+ }
110
+
111
+ @keyframes -global-modal-in {
112
+ from {
113
+ opacity: 0;
114
+ transform: translate(-50%, -50%) scale(0.95);
115
+ }
116
+ to {
117
+ opacity: 1;
118
+ transform: translate(-50%, -50%) scale(1);
119
+ }
120
+ }
121
+
122
+ @keyframes -global-modal-out {
123
+ from {
124
+ opacity: 1;
125
+ transform: translate(-50%, -50%) scale(1);
126
+ }
127
+ to {
128
+ opacity: 0;
129
+ transform: translate(-50%, -50%) scale(0.95);
130
+ }
131
+ }
132
+
133
+ /* Size variants (F32: rem units) */
134
+ :global(.modal-sm) {
135
+ width: 25rem;
136
+ max-width: calc(100vw - 2rem);
137
+ }
138
+
139
+ :global(.modal-md) {
140
+ width: 31.25rem;
141
+ max-width: calc(100vw - 2rem);
142
+ }
143
+
144
+ :global(.modal-lg) {
145
+ width: 43.75rem;
146
+ max-width: calc(100vw - 2rem);
147
+ }
148
+
149
+ :global(.modal-full) {
150
+ width: 100%;
151
+ max-width: 100%;
152
+ height: 100vh;
153
+ max-height: 100vh;
154
+ border-radius: 0;
155
+ top: 0;
156
+ left: 0;
157
+ transform: none;
158
+ }
159
+
160
+ /* Mobile responsive */
161
+ @media (max-width: 640px) {
162
+ :global(.modal-content:not(.modal-full)) {
163
+ width: 100% !important;
164
+ max-width: 100% !important;
165
+ max-height: 90vh;
166
+ top: auto;
167
+ bottom: 0;
168
+ left: 0;
169
+ transform: none;
170
+ border-radius: 1rem 1rem 0 0;
171
+ margin: 0;
172
+ }
173
+
174
+ :global(.modal-content:not(.modal-full)[data-state='open']) {
175
+ animation: modal-slide-up 250ms ease-out;
176
+ }
177
+
178
+ :global(.modal-content:not(.modal-full)[data-state='closed']) {
179
+ animation: modal-slide-down 200ms ease-in;
180
+ }
181
+ }
182
+
183
+ @keyframes -global-modal-slide-up {
184
+ from {
185
+ opacity: 0;
186
+ transform: translateY(100%);
187
+ }
188
+ to {
189
+ opacity: 1;
190
+ transform: translateY(0);
191
+ }
192
+ }
193
+
194
+ @keyframes -global-modal-slide-down {
195
+ from {
196
+ opacity: 1;
197
+ transform: translateY(0);
198
+ }
199
+ to {
200
+ opacity: 0;
201
+ transform: translateY(100%);
202
+ }
203
+ }
204
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { ModalProps } from '../../types/index.js';
2
+ interface Props extends ModalProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const Modal: import("svelte").Component<Props, {}, "open">;
6
+ type Modal = ReturnType<typeof Modal>;
7
+ export default Modal;
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import type { ModalBodyProps } from '../../types/index.js';
3
+ import { Dialog } from 'bits-ui';
4
+
5
+ interface Props extends ModalBodyProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { class: className = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <div class="modal-body {className}">
13
+ <Dialog.Description class="modal-description">
14
+ {@render children?.()}
15
+ </Dialog.Description>
16
+ </div>
17
+
18
+ <style>
19
+ :global(.modal-body) {
20
+ padding: var(--space-xl, 1.5rem);
21
+ overflow-y: auto;
22
+ flex: 1;
23
+ /* Smooth scrolling on iOS */
24
+ -webkit-overflow-scrolling: touch;
25
+ }
26
+
27
+ :global(.modal-description) {
28
+ font-size: var(--font-size-base, 1rem);
29
+ line-height: var(--line-height-normal, 1.5);
30
+ color: var(--color-text, #1f2937);
31
+ }
32
+
33
+ /* Scrollbar styling */
34
+ :global(.modal-body::-webkit-scrollbar) {
35
+ width: 0.5rem;
36
+ }
37
+
38
+ :global(.modal-body::-webkit-scrollbar-track) {
39
+ background: transparent;
40
+ }
41
+
42
+ :global(.modal-body::-webkit-scrollbar-thumb) {
43
+ background: var(--color-border, #e5e7eb);
44
+ border-radius: var(--radius-full, 9999px);
45
+ }
46
+
47
+ :global(.modal-body::-webkit-scrollbar-thumb:hover) {
48
+ background: var(--color-text-secondary, #6b7280);
49
+ }
50
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { ModalBodyProps } from '../../types/index.js';
2
+ interface Props extends ModalBodyProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const ModalBody: import("svelte").Component<Props, {}, "">;
6
+ type ModalBody = ReturnType<typeof ModalBody>;
7
+ export default ModalBody;