@aspect-ops/exon-ui 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +793 -43
  2. package/dist/components/Accordion/Accordion.svelte +79 -0
  3. package/dist/components/Accordion/Accordion.svelte.d.ts +10 -0
  4. package/dist/components/Accordion/AccordionItem.svelte +198 -0
  5. package/dist/components/Accordion/AccordionItem.svelte.d.ts +10 -0
  6. package/dist/components/Accordion/index.d.ts +2 -0
  7. package/dist/components/Accordion/index.js +2 -0
  8. package/dist/components/ActionSheet/ActionSheet.svelte +270 -0
  9. package/dist/components/ActionSheet/ActionSheet.svelte.d.ts +12 -0
  10. package/dist/components/ActionSheet/ActionSheetItem.svelte +151 -0
  11. package/dist/components/ActionSheet/ActionSheetItem.svelte.d.ts +10 -0
  12. package/dist/components/ActionSheet/index.d.ts +3 -0
  13. package/dist/components/ActionSheet/index.js +2 -0
  14. package/dist/components/Alert/Alert.svelte +165 -0
  15. package/dist/components/Alert/Alert.svelte.d.ts +11 -0
  16. package/dist/components/Alert/index.d.ts +1 -0
  17. package/dist/components/Alert/index.js +1 -0
  18. package/dist/components/AspectRatio/AspectRatio.svelte +42 -0
  19. package/dist/components/AspectRatio/AspectRatio.svelte.d.ts +9 -0
  20. package/dist/components/AspectRatio/index.d.ts +1 -0
  21. package/dist/components/AspectRatio/index.js +1 -0
  22. package/dist/components/Avatar/Avatar.svelte +147 -0
  23. package/dist/components/Avatar/Avatar.svelte.d.ts +12 -0
  24. package/dist/components/Avatar/AvatarGroup.svelte +153 -0
  25. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +12 -0
  26. package/dist/components/Avatar/index.d.ts +2 -0
  27. package/dist/components/Avatar/index.js +2 -0
  28. package/dist/components/BottomSheet/BottomSheet.svelte +230 -0
  29. package/dist/components/BottomSheet/BottomSheet.svelte.d.ts +7 -0
  30. package/dist/components/BottomSheet/BottomSheetBody.svelte +20 -0
  31. package/dist/components/BottomSheet/BottomSheetBody.svelte.d.ts +7 -0
  32. package/dist/components/BottomSheet/BottomSheetHeader.svelte +27 -0
  33. package/dist/components/BottomSheet/BottomSheetHeader.svelte.d.ts +7 -0
  34. package/dist/components/BottomSheet/index.d.ts +3 -0
  35. package/dist/components/BottomSheet/index.js +3 -0
  36. package/dist/components/Box/Box.svelte +41 -0
  37. package/dist/components/Box/Box.svelte.d.ts +7 -0
  38. package/dist/components/Box/index.d.ts +1 -0
  39. package/dist/components/Box/index.js +1 -0
  40. package/dist/components/Card/Card.svelte +95 -0
  41. package/dist/components/Card/Card.svelte.d.ts +10 -0
  42. package/dist/components/Card/CardBody.svelte +32 -0
  43. package/dist/components/Card/CardBody.svelte.d.ts +7 -0
  44. package/dist/components/Card/CardFooter.svelte +34 -0
  45. package/dist/components/Card/CardFooter.svelte.d.ts +7 -0
  46. package/dist/components/Card/CardHeader.svelte +67 -0
  47. package/dist/components/Card/CardHeader.svelte.d.ts +9 -0
  48. package/dist/components/Card/index.d.ts +4 -0
  49. package/dist/components/Card/index.js +4 -0
  50. package/dist/components/Carousel/Carousel.svelte +454 -0
  51. package/dist/components/Carousel/Carousel.svelte.d.ts +14 -0
  52. package/dist/components/Carousel/CarouselSlide.svelte +22 -0
  53. package/dist/components/Carousel/CarouselSlide.svelte.d.ts +7 -0
  54. package/dist/components/Carousel/index.d.ts +2 -0
  55. package/dist/components/Carousel/index.js +2 -0
  56. package/dist/components/Center/Center.svelte +28 -0
  57. package/dist/components/Center/Center.svelte.d.ts +8 -0
  58. package/dist/components/Center/index.d.ts +1 -0
  59. package/dist/components/Center/index.js +1 -0
  60. package/dist/components/Chip/Chip.svelte +461 -0
  61. package/dist/components/Chip/Chip.svelte.d.ts +17 -0
  62. package/dist/components/Chip/ChipGroup.svelte +76 -0
  63. package/dist/components/Chip/ChipGroup.svelte.d.ts +9 -0
  64. package/dist/components/Chip/index.d.ts +2 -0
  65. package/dist/components/Chip/index.js +2 -0
  66. package/dist/components/Container/Container.svelte +58 -0
  67. package/dist/components/Container/Container.svelte.d.ts +10 -0
  68. package/dist/components/Container/index.d.ts +1 -0
  69. package/dist/components/Container/index.js +1 -0
  70. package/dist/components/DatePicker/DatePicker.svelte +746 -0
  71. package/dist/components/DatePicker/DatePicker.svelte.d.ts +19 -0
  72. package/dist/components/DatePicker/index.d.ts +1 -0
  73. package/dist/components/DatePicker/index.js +1 -0
  74. package/dist/components/Divider/Divider.svelte +38 -0
  75. package/dist/components/Divider/Divider.svelte.d.ts +9 -0
  76. package/dist/components/Divider/index.d.ts +1 -0
  77. package/dist/components/Divider/index.js +1 -0
  78. package/dist/components/EmptyState/EmptyState.svelte +164 -0
  79. package/dist/components/EmptyState/EmptyState.svelte.d.ts +12 -0
  80. package/dist/components/EmptyState/index.d.ts +1 -0
  81. package/dist/components/EmptyState/index.js +1 -0
  82. package/dist/components/FAB/FAB.svelte +242 -0
  83. package/dist/components/FAB/FAB.svelte.d.ts +9 -0
  84. package/dist/components/FAB/FABGroup.svelte +449 -0
  85. package/dist/components/FAB/FABGroup.svelte.d.ts +9 -0
  86. package/dist/components/FAB/index.d.ts +3 -0
  87. package/dist/components/FAB/index.js +2 -0
  88. package/dist/components/FileUpload/FileUpload.svelte +484 -0
  89. package/dist/components/FileUpload/FileUpload.svelte.d.ts +16 -0
  90. package/dist/components/FileUpload/index.d.ts +1 -0
  91. package/dist/components/FileUpload/index.js +1 -0
  92. package/dist/components/Grid/Grid.svelte +136 -0
  93. package/dist/components/Grid/Grid.svelte.d.ts +12 -0
  94. package/dist/components/Grid/GridItem.svelte +21 -0
  95. package/dist/components/Grid/GridItem.svelte.d.ts +7 -0
  96. package/dist/components/Grid/index.d.ts +2 -0
  97. package/dist/components/Grid/index.js +2 -0
  98. package/dist/components/Image/Image.svelte +223 -0
  99. package/dist/components/Image/Image.svelte.d.ts +19 -0
  100. package/dist/components/Image/index.d.ts +1 -0
  101. package/dist/components/Image/index.js +1 -0
  102. package/dist/components/List/List.svelte +42 -0
  103. package/dist/components/List/List.svelte.d.ts +18 -0
  104. package/dist/components/List/ListItem.svelte +139 -0
  105. package/dist/components/List/ListItem.svelte.d.ts +36 -0
  106. package/dist/components/List/index.d.ts +2 -0
  107. package/dist/components/List/index.js +2 -0
  108. package/dist/components/Modal/Modal.svelte +204 -0
  109. package/dist/components/Modal/Modal.svelte.d.ts +7 -0
  110. package/dist/components/Modal/ModalBody.svelte +50 -0
  111. package/dist/components/Modal/ModalBody.svelte.d.ts +7 -0
  112. package/dist/components/Modal/ModalFooter.svelte +37 -0
  113. package/dist/components/Modal/ModalFooter.svelte.d.ts +7 -0
  114. package/dist/components/Modal/ModalHeader.svelte +73 -0
  115. package/dist/components/Modal/ModalHeader.svelte.d.ts +7 -0
  116. package/dist/components/Modal/index.d.ts +4 -0
  117. package/dist/components/Modal/index.js +4 -0
  118. package/dist/components/OTPInput/OTPInput.svelte +312 -0
  119. package/dist/components/OTPInput/OTPInput.svelte.d.ts +57 -0
  120. package/dist/components/OTPInput/index.d.ts +1 -0
  121. package/dist/components/OTPInput/index.js +1 -0
  122. package/dist/components/Popover/Popover.svelte +14 -0
  123. package/dist/components/Popover/Popover.svelte.d.ts +7 -0
  124. package/dist/components/Popover/PopoverContent.svelte +63 -0
  125. package/dist/components/Popover/PopoverContent.svelte.d.ts +7 -0
  126. package/dist/components/Popover/PopoverTrigger.svelte +14 -0
  127. package/dist/components/Popover/PopoverTrigger.svelte.d.ts +7 -0
  128. package/dist/components/Popover/index.d.ts +3 -0
  129. package/dist/components/Popover/index.js +3 -0
  130. package/dist/components/Progress/ProgressBar.svelte +86 -0
  131. package/dist/components/Progress/ProgressBar.svelte.d.ts +11 -0
  132. package/dist/components/Progress/ProgressCircle.svelte +134 -0
  133. package/dist/components/Progress/ProgressCircle.svelte.d.ts +12 -0
  134. package/dist/components/Progress/Spinner.svelte +68 -0
  135. package/dist/components/Progress/Spinner.svelte.d.ts +8 -0
  136. package/dist/components/Progress/index.d.ts +3 -0
  137. package/dist/components/Progress/index.js +3 -0
  138. package/dist/components/PullToRefresh/PullToRefresh.svelte +304 -0
  139. package/dist/components/PullToRefresh/PullToRefresh.svelte.d.ts +20 -0
  140. package/dist/components/PullToRefresh/index.d.ts +1 -0
  141. package/dist/components/PullToRefresh/index.js +1 -0
  142. package/dist/components/Rating/Rating.svelte +316 -0
  143. package/dist/components/Rating/Rating.svelte.d.ts +16 -0
  144. package/dist/components/Rating/index.d.ts +1 -0
  145. package/dist/components/Rating/index.js +1 -0
  146. package/dist/components/SafeArea/SafeArea.svelte +33 -0
  147. package/dist/components/SafeArea/SafeArea.svelte.d.ts +7 -0
  148. package/dist/components/SearchInput/SearchInput.svelte +480 -0
  149. package/dist/components/SearchInput/SearchInput.svelte.d.ts +22 -0
  150. package/dist/components/SearchInput/index.d.ts +1 -0
  151. package/dist/components/SearchInput/index.js +1 -0
  152. package/dist/components/Select/Select.svelte +55 -12
  153. package/dist/components/Skeleton/Skeleton.svelte +59 -0
  154. package/dist/components/Skeleton/Skeleton.svelte.d.ts +10 -0
  155. package/dist/components/Skeleton/index.d.ts +1 -0
  156. package/dist/components/Skeleton/index.js +1 -0
  157. package/dist/components/Slider/Slider.svelte +324 -0
  158. package/dist/components/Slider/Slider.svelte.d.ts +14 -0
  159. package/dist/components/Slider/index.d.ts +1 -0
  160. package/dist/components/Slider/index.js +1 -0
  161. package/dist/components/Spacer/Spacer.svelte +56 -0
  162. package/dist/components/Spacer/Spacer.svelte.d.ts +6 -0
  163. package/dist/components/Spacer/index.d.ts +1 -0
  164. package/dist/components/Spacer/index.js +1 -0
  165. package/dist/components/Stack/Stack.svelte +117 -0
  166. package/dist/components/Stack/Stack.svelte.d.ts +13 -0
  167. package/dist/components/Stack/index.d.ts +1 -0
  168. package/dist/components/Stack/index.js +1 -0
  169. package/dist/components/Stepper/Stepper.svelte +100 -0
  170. package/dist/components/Stepper/Stepper.svelte.d.ts +11 -0
  171. package/dist/components/Stepper/StepperStep.svelte +391 -0
  172. package/dist/components/Stepper/StepperStep.svelte.d.ts +13 -0
  173. package/dist/components/Stepper/index.d.ts +2 -0
  174. package/dist/components/Stepper/index.js +2 -0
  175. package/dist/components/SwipeActions/SwipeAction.svelte +43 -0
  176. package/dist/components/SwipeActions/SwipeAction.svelte.d.ts +8 -0
  177. package/dist/components/SwipeActions/SwipeActions.svelte +193 -0
  178. package/dist/components/SwipeActions/SwipeActions.svelte.d.ts +9 -0
  179. package/dist/components/SwipeActions/index.d.ts +2 -0
  180. package/dist/components/SwipeActions/index.js +2 -0
  181. package/dist/components/Switch/Switch.svelte +29 -9
  182. package/dist/components/Table/Table.svelte +175 -0
  183. package/dist/components/Table/Table.svelte.d.ts +38 -0
  184. package/dist/components/Table/TableBody.svelte +26 -0
  185. package/dist/components/Table/TableBody.svelte.d.ts +13 -0
  186. package/dist/components/Table/TableCell.svelte +85 -0
  187. package/dist/components/Table/TableCell.svelte.d.ts +28 -0
  188. package/dist/components/Table/TableHead.svelte +36 -0
  189. package/dist/components/Table/TableHead.svelte.d.ts +13 -0
  190. package/dist/components/Table/TableHeader.svelte +217 -0
  191. package/dist/components/Table/TableHeader.svelte.d.ts +32 -0
  192. package/dist/components/Table/TableRow.svelte +92 -0
  193. package/dist/components/Table/TableRow.svelte.d.ts +28 -0
  194. package/dist/components/Table/index.d.ts +6 -0
  195. package/dist/components/Table/index.js +6 -0
  196. package/dist/components/Tag/Tag.svelte +189 -0
  197. package/dist/components/Tag/Tag.svelte.d.ts +13 -0
  198. package/dist/components/Tag/index.d.ts +1 -0
  199. package/dist/components/Tag/index.js +1 -0
  200. package/dist/components/TimePicker/TimePicker.svelte +803 -0
  201. package/dist/components/TimePicker/TimePicker.svelte.d.ts +17 -0
  202. package/dist/components/TimePicker/index.d.ts +1 -0
  203. package/dist/components/TimePicker/index.js +1 -0
  204. package/dist/components/Toast/Toast.svelte +241 -0
  205. package/dist/components/Toast/Toast.svelte.d.ts +18 -0
  206. package/dist/components/Toast/ToastContainer.svelte +110 -0
  207. package/dist/components/Toast/ToastContainer.svelte.d.ts +8 -0
  208. package/dist/components/Toast/index.d.ts +3 -0
  209. package/dist/components/Toast/index.js +3 -0
  210. package/dist/components/Toast/toast.d.ts +13 -0
  211. package/dist/components/Toast/toast.js +55 -0
  212. package/dist/components/Tooltip/Tooltip.svelte +71 -0
  213. package/dist/components/Tooltip/Tooltip.svelte.d.ts +7 -0
  214. package/dist/components/Tooltip/index.d.ts +2 -0
  215. package/dist/components/Tooltip/index.js +1 -0
  216. package/dist/index.d.ts +38 -1
  217. package/dist/index.js +41 -0
  218. package/dist/styles/tokens.css +5 -0
  219. package/dist/types/data-display.d.ts +161 -0
  220. package/dist/types/data-display.js +1 -0
  221. package/dist/types/feedback.d.ts +92 -0
  222. package/dist/types/feedback.js +1 -0
  223. package/dist/types/index.d.ts +6 -1
  224. package/dist/types/input.d.ts +67 -0
  225. package/dist/types/input.js +2 -0
  226. package/dist/types/layout.d.ts +57 -0
  227. package/dist/types/layout.js +1 -0
  228. package/dist/types/mobile.d.ts +91 -0
  229. package/dist/types/mobile.js +1 -0
  230. package/dist/types/navigation.d.ts +15 -0
  231. package/dist/utils/gestures.d.ts +219 -0
  232. package/dist/utils/gestures.js +492 -0
  233. package/dist/utils/haptics.d.ts +89 -0
  234. package/dist/utils/haptics.js +198 -0
  235. package/dist/utils/platform.d.ts +47 -0
  236. package/dist/utils/platform.js +156 -0
  237. package/package.json +1 -1
@@ -0,0 +1,79 @@
1
+ <script lang="ts">
2
+ import { setContext } from 'svelte';
3
+
4
+ interface Props {
5
+ value?: string | string[];
6
+ multiple?: boolean;
7
+ disabled?: boolean;
8
+ class?: string;
9
+ children?: import('svelte').Snippet;
10
+ }
11
+
12
+ let {
13
+ value = $bindable([]),
14
+ multiple = false,
15
+ disabled = false,
16
+ class: className = '',
17
+ children
18
+ }: Props = $props();
19
+
20
+ // Normalize value to always work with arrays internally
21
+ let expandedItems = $derived.by(() => {
22
+ if (Array.isArray(value)) {
23
+ return value;
24
+ }
25
+ return value ? [value] : [];
26
+ });
27
+
28
+ // Context key
29
+ const ACCORDION_KEY = Symbol('accordion');
30
+
31
+ // Context API
32
+ const accordionContext = {
33
+ isExpanded: (itemValue: string): boolean => {
34
+ return expandedItems.includes(itemValue);
35
+ },
36
+ toggle: (itemValue: string): void => {
37
+ if (disabled) return;
38
+
39
+ const isCurrentlyExpanded = expandedItems.includes(itemValue);
40
+
41
+ if (multiple) {
42
+ // Multiple mode: toggle the item in the array
43
+ if (isCurrentlyExpanded) {
44
+ value = expandedItems.filter((v) => v !== itemValue) as typeof value;
45
+ } else {
46
+ value = [...expandedItems, itemValue] as typeof value;
47
+ }
48
+ } else {
49
+ // Single mode: replace with new value or clear
50
+ if (isCurrentlyExpanded) {
51
+ value = (Array.isArray(value) ? [] : '') as typeof value;
52
+ } else {
53
+ value = (Array.isArray(value) ? [itemValue] : itemValue) as typeof value;
54
+ }
55
+ }
56
+ },
57
+ isDisabled: (): boolean => disabled
58
+ };
59
+
60
+ setContext(ACCORDION_KEY, accordionContext);
61
+ </script>
62
+
63
+ <div class="accordion {className}" role="presentation">
64
+ {#if children}
65
+ {@render children()}
66
+ {/if}
67
+ </div>
68
+
69
+ <style>
70
+ .accordion {
71
+ display: flex;
72
+ flex-direction: column;
73
+ width: 100%;
74
+ border: 1px solid var(--color-border, #e5e7eb);
75
+ border-radius: var(--radius-md, 0.375rem);
76
+ background: var(--color-bg-card, #ffffff);
77
+ overflow: hidden;
78
+ }
79
+ </style>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ value?: string | string[];
3
+ multiple?: boolean;
4
+ disabled?: boolean;
5
+ class?: string;
6
+ children?: import('svelte').Snippet;
7
+ }
8
+ declare const Accordion: import("svelte").Component<Props, {}, "value">;
9
+ type Accordion = ReturnType<typeof Accordion>;
10
+ export default Accordion;
@@ -0,0 +1,198 @@
1
+ <script lang="ts">
2
+ import { getContext } from 'svelte';
3
+
4
+ interface Props {
5
+ value: string;
6
+ disabled?: boolean;
7
+ class?: string;
8
+ header?: import('svelte').Snippet;
9
+ children?: import('svelte').Snippet;
10
+ }
11
+
12
+ let { value, disabled = false, class: className = '', header, children }: Props = $props();
13
+
14
+ // Context key (must match parent)
15
+ const ACCORDION_KEY = Symbol('accordion');
16
+
17
+ // Get context from parent Accordion
18
+ const ctx = getContext<{
19
+ isExpanded: (value: string) => boolean;
20
+ toggle: (value: string) => void;
21
+ isDisabled: () => boolean;
22
+ }>(ACCORDION_KEY);
23
+
24
+ // Generate unique IDs for ARIA (using $derived to avoid warnings)
25
+ const headerId = $derived(`accordion-header-${value}`);
26
+ const bodyId = $derived(`accordion-body-${value}`);
27
+
28
+ // Derived states
29
+ const isExpanded = $derived(ctx.isExpanded(value));
30
+ const isDisabled = $derived(disabled || ctx.isDisabled());
31
+
32
+ // Toggle handler
33
+ function handleToggle() {
34
+ if (!isDisabled) {
35
+ ctx.toggle(value);
36
+ }
37
+ }
38
+
39
+ // Keyboard handler
40
+ function handleKeydown(event: KeyboardEvent) {
41
+ if (event.key === 'Enter' || event.key === ' ') {
42
+ event.preventDefault();
43
+ handleToggle();
44
+ }
45
+ }
46
+
47
+ // Body element reference for height animation
48
+ let bodyElement: HTMLDivElement | undefined = $state();
49
+
50
+ // Height calculation for smooth animation
51
+ const contentHeight = $derived.by(() => {
52
+ if (!bodyElement) return '0px';
53
+ if (!isExpanded) return '0px';
54
+
55
+ // Get the actual scrollHeight when expanded
56
+ const height = bodyElement.scrollHeight;
57
+ return `${height}px`;
58
+ });
59
+ </script>
60
+
61
+ <div class="accordion-item {className}">
62
+ <button
63
+ id={headerId}
64
+ class="accordion-header"
65
+ type="button"
66
+ aria-expanded={isExpanded}
67
+ aria-controls={bodyId}
68
+ disabled={isDisabled}
69
+ onclick={handleToggle}
70
+ onkeydown={handleKeydown}
71
+ >
72
+ <span class="accordion-header__content">
73
+ {#if header}
74
+ {@render header()}
75
+ {/if}
76
+ </span>
77
+ <svg
78
+ class="accordion-header__chevron"
79
+ class:accordion-header__chevron--expanded={isExpanded}
80
+ width="20"
81
+ height="20"
82
+ viewBox="0 0 20 20"
83
+ fill="none"
84
+ xmlns="http://www.w3.org/2000/svg"
85
+ aria-hidden="true"
86
+ >
87
+ <path
88
+ d="M5 7.5L10 12.5L15 7.5"
89
+ stroke="currentColor"
90
+ stroke-width="2"
91
+ stroke-linecap="round"
92
+ stroke-linejoin="round"
93
+ />
94
+ </svg>
95
+ </button>
96
+
97
+ <div
98
+ bind:this={bodyElement}
99
+ id={bodyId}
100
+ class="accordion-body"
101
+ class:accordion-body--expanded={isExpanded}
102
+ role="region"
103
+ aria-labelledby={headerId}
104
+ style="--content-height: {contentHeight}"
105
+ >
106
+ <div class="accordion-body__content">
107
+ {#if children}
108
+ {@render children()}
109
+ {/if}
110
+ </div>
111
+ </div>
112
+ </div>
113
+
114
+ <style>
115
+ .accordion-item {
116
+ border-bottom: 1px solid var(--color-border, #e5e7eb);
117
+ }
118
+
119
+ .accordion-item:last-child {
120
+ border-bottom: none;
121
+ }
122
+
123
+ /* Header */
124
+ .accordion-header {
125
+ display: flex;
126
+ align-items: center;
127
+ justify-content: space-between;
128
+ width: 100%;
129
+ min-height: var(--touch-target-min, 44px);
130
+ padding: var(--space-md, 1rem);
131
+ border: none;
132
+ background: transparent;
133
+ color: var(--color-text, #1f2937);
134
+ font-family: inherit;
135
+ font-size: var(--text-base, 1rem);
136
+ font-weight: var(--font-medium, 500);
137
+ text-align: left;
138
+ cursor: pointer;
139
+ transition: background-color var(--transition-fast, 150ms ease);
140
+ -webkit-tap-highlight-color: transparent;
141
+ }
142
+
143
+ .accordion-header:hover:not(:disabled) {
144
+ background: var(--color-bg-hover, #f3f4f6);
145
+ }
146
+
147
+ .accordion-header:focus-visible {
148
+ outline: 2px solid var(--color-primary, #3b82f6);
149
+ outline-offset: -2px;
150
+ }
151
+
152
+ .accordion-header:disabled {
153
+ opacity: 0.5;
154
+ cursor: not-allowed;
155
+ }
156
+
157
+ .accordion-header__content {
158
+ flex: 1;
159
+ display: flex;
160
+ align-items: center;
161
+ }
162
+
163
+ .accordion-header__chevron {
164
+ flex-shrink: 0;
165
+ margin-left: var(--space-sm, 0.5rem);
166
+ color: var(--color-text-muted, #6b7280);
167
+ transition: transform var(--transition-base, 200ms ease);
168
+ }
169
+
170
+ .accordion-header__chevron--expanded {
171
+ transform: rotate(180deg);
172
+ }
173
+
174
+ /* Body */
175
+ .accordion-body {
176
+ max-height: 0;
177
+ overflow: hidden;
178
+ transition: max-height var(--transition-base, 200ms ease);
179
+ }
180
+
181
+ .accordion-body--expanded {
182
+ max-height: var(--content-height);
183
+ }
184
+
185
+ .accordion-body__content {
186
+ padding: 0 var(--space-md, 1rem) var(--space-md, 1rem);
187
+ color: var(--color-text-muted, #6b7280);
188
+ font-size: var(--text-sm, 0.875rem);
189
+ line-height: var(--leading-normal, 1.5);
190
+ }
191
+
192
+ /* Mobile optimization - ensure min touch target */
193
+ @media (max-width: 640px) {
194
+ .accordion-header {
195
+ min-height: var(--touch-target-min, 44px);
196
+ }
197
+ }
198
+ </style>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ value: string;
3
+ disabled?: boolean;
4
+ class?: string;
5
+ header?: import('svelte').Snippet;
6
+ children?: import('svelte').Snippet;
7
+ }
8
+ declare const AccordionItem: import("svelte").Component<Props, {}, "">;
9
+ type AccordionItem = ReturnType<typeof AccordionItem>;
10
+ export default AccordionItem;
@@ -0,0 +1,2 @@
1
+ export { default as Accordion } from './Accordion.svelte';
2
+ export { default as AccordionItem } from './AccordionItem.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Accordion } from './Accordion.svelte';
2
+ export { default as AccordionItem } from './AccordionItem.svelte';
@@ -0,0 +1,270 @@
1
+ <script lang="ts">
2
+ import type { ActionSheetProps } from '../../types/index.js';
3
+ import { Dialog } from 'bits-ui';
4
+
5
+ interface Props extends ActionSheetProps {
6
+ /** Bindable open state */
7
+ open?: boolean;
8
+ /** Slot for ActionSheetItem children */
9
+ actions?: import('svelte').Snippet;
10
+ /** Default slot for custom content */
11
+ children?: import('svelte').Snippet;
12
+ }
13
+
14
+ let {
15
+ open = $bindable(false),
16
+ title,
17
+ description,
18
+ cancelLabel = 'Cancel',
19
+ showCancel = true,
20
+ closeOnSelect = true,
21
+ class: className = '',
22
+ actions,
23
+ children
24
+ }: Props = $props();
25
+
26
+ function handleOpenChange(value: boolean) {
27
+ open = value;
28
+ }
29
+
30
+ function handleBackdropClick() {
31
+ open = false;
32
+ }
33
+
34
+ function handleCancel() {
35
+ open = false;
36
+ }
37
+
38
+ // Provide context for ActionSheetItem to access closeOnSelect
39
+ import { setContext } from 'svelte';
40
+
41
+ setContext('actionsheet', {
42
+ get closeOnSelect() {
43
+ return closeOnSelect;
44
+ },
45
+ close: () => {
46
+ open = false;
47
+ }
48
+ });
49
+ </script>
50
+
51
+ <Dialog.Root {open} onOpenChange={handleOpenChange}>
52
+ <Dialog.Portal>
53
+ <Dialog.Overlay class="actionsheet-overlay" onclick={handleBackdropClick} />
54
+ <Dialog.Content
55
+ class="actionsheet-content {className}"
56
+ aria-labelledby={title ? 'actionsheet-title' : undefined}
57
+ >
58
+ <!-- Header section (optional) -->
59
+ {#if title || description}
60
+ <div class="actionsheet-header">
61
+ {#if title}
62
+ <Dialog.Title id="actionsheet-title" class="actionsheet-title">{title}</Dialog.Title>
63
+ {/if}
64
+ {#if description}
65
+ <Dialog.Description class="actionsheet-description">{description}</Dialog.Description>
66
+ {/if}
67
+ </div>
68
+ {/if}
69
+
70
+ <!-- Actions section -->
71
+ <div class="actionsheet-actions" role="group">
72
+ {#if actions}
73
+ {@render actions()}
74
+ {/if}
75
+ {#if children}
76
+ {@render children()}
77
+ {/if}
78
+ </div>
79
+
80
+ <!-- Cancel button (separated) -->
81
+ {#if showCancel}
82
+ <div class="actionsheet-cancel-container">
83
+ <button
84
+ type="button"
85
+ class="actionsheet-cancel"
86
+ onclick={handleCancel}
87
+ aria-label="Cancel"
88
+ >
89
+ {cancelLabel}
90
+ </button>
91
+ </div>
92
+ {/if}
93
+ </Dialog.Content>
94
+ </Dialog.Portal>
95
+ </Dialog.Root>
96
+
97
+ <style>
98
+ /* Overlay */
99
+ :global(.actionsheet-overlay) {
100
+ position: fixed;
101
+ inset: 0;
102
+ background: rgba(0, 0, 0, 0.4);
103
+ z-index: 100;
104
+ }
105
+
106
+ :global(.actionsheet-overlay[data-state='open']) {
107
+ animation: actionsheet-fade-in 200ms ease-out;
108
+ }
109
+
110
+ :global(.actionsheet-overlay[data-state='closed']) {
111
+ animation: actionsheet-fade-out 150ms ease-in;
112
+ }
113
+
114
+ @keyframes -global-actionsheet-fade-in {
115
+ from {
116
+ opacity: 0;
117
+ }
118
+ to {
119
+ opacity: 1;
120
+ }
121
+ }
122
+
123
+ @keyframes -global-actionsheet-fade-out {
124
+ from {
125
+ opacity: 1;
126
+ }
127
+ to {
128
+ opacity: 0;
129
+ }
130
+ }
131
+
132
+ /* Content */
133
+ :global(.actionsheet-content) {
134
+ /* F33: Must set font-family explicitly - portal doesn't inherit */
135
+ font-family: var(--font-family, system-ui, -apple-system, sans-serif);
136
+ position: fixed;
137
+ bottom: 0;
138
+ left: 0;
139
+ right: 0;
140
+ z-index: 101;
141
+ display: flex;
142
+ flex-direction: column;
143
+ max-height: 90vh;
144
+ padding: var(--space-sm, 0.5rem);
145
+ padding-bottom: calc(var(--space-sm, 0.5rem) + env(safe-area-inset-bottom, 0px));
146
+ }
147
+
148
+ :global(.actionsheet-content[data-state='open']) {
149
+ animation: actionsheet-slide-up 250ms cubic-bezier(0.32, 0.72, 0, 1);
150
+ }
151
+
152
+ :global(.actionsheet-content[data-state='closed']) {
153
+ animation: actionsheet-slide-down 200ms cubic-bezier(0.32, 0.72, 0, 1);
154
+ }
155
+
156
+ @keyframes -global-actionsheet-slide-up {
157
+ from {
158
+ opacity: 0;
159
+ transform: translateY(100%);
160
+ }
161
+ to {
162
+ opacity: 1;
163
+ transform: translateY(0);
164
+ }
165
+ }
166
+
167
+ @keyframes -global-actionsheet-slide-down {
168
+ from {
169
+ opacity: 1;
170
+ transform: translateY(0);
171
+ }
172
+ to {
173
+ opacity: 0;
174
+ transform: translateY(100%);
175
+ }
176
+ }
177
+
178
+ /* Header */
179
+ :global(.actionsheet-header) {
180
+ text-align: center;
181
+ padding: var(--space-md, 1rem) var(--space-lg, 1.5rem);
182
+ background: var(--color-bg, #ffffff);
183
+ border-radius: var(--radius-lg, 0.75rem) var(--radius-lg, 0.75rem) 0 0;
184
+ border-bottom: 1px solid var(--color-border, rgba(0, 0, 0, 0.1));
185
+ }
186
+
187
+ :global(.actionsheet-title) {
188
+ margin: 0;
189
+ font-size: var(--text-sm, 0.875rem);
190
+ font-weight: 600;
191
+ color: var(--color-text-secondary, #6b7280);
192
+ }
193
+
194
+ :global(.actionsheet-description) {
195
+ margin: var(--space-xs, 0.25rem) 0 0;
196
+ font-size: var(--text-xs, 0.75rem);
197
+ color: var(--color-text-muted, #9ca3af);
198
+ }
199
+
200
+ /* Actions container */
201
+ :global(.actionsheet-actions) {
202
+ display: flex;
203
+ flex-direction: column;
204
+ background: var(--color-bg, #ffffff);
205
+ border-radius: var(--radius-lg, 0.75rem);
206
+ overflow: hidden;
207
+ }
208
+
209
+ /* When there's a header, remove top border radius from actions */
210
+ :global(.actionsheet-header + .actionsheet-actions) {
211
+ border-radius: 0 0 var(--radius-lg, 0.75rem) var(--radius-lg, 0.75rem);
212
+ }
213
+
214
+ /* Cancel button container */
215
+ :global(.actionsheet-cancel-container) {
216
+ margin-top: var(--space-sm, 0.5rem);
217
+ }
218
+
219
+ /* Cancel button - iOS style */
220
+ :global(.actionsheet-cancel) {
221
+ /* F33: Font inheritance for portal */
222
+ font-family: var(--font-family, system-ui, -apple-system, sans-serif);
223
+ width: 100%;
224
+ /* F20: Minimum touch target */
225
+ min-height: 56px;
226
+ padding: var(--space-md, 1rem);
227
+ border: none;
228
+ border-radius: var(--radius-lg, 0.75rem);
229
+ background: var(--color-bg, #ffffff);
230
+ color: var(--color-primary, #3b82f6);
231
+ font-size: var(--text-lg, 1.125rem);
232
+ font-weight: 600;
233
+ cursor: pointer;
234
+ transition: background-color var(--transition-fast, 150ms ease);
235
+ -webkit-tap-highlight-color: transparent;
236
+ }
237
+
238
+ :global(.actionsheet-cancel:hover) {
239
+ background: var(--color-bg-hover, #f9fafb);
240
+ }
241
+
242
+ :global(.actionsheet-cancel:active) {
243
+ background: var(--color-bg-active, #f3f4f6);
244
+ }
245
+
246
+ :global(.actionsheet-cancel:focus-visible) {
247
+ outline: 2px solid var(--color-primary, #3b82f6);
248
+ outline-offset: 2px;
249
+ }
250
+
251
+ /* Platform-specific styling */
252
+ :global([data-platform='ios']) :global(.actionsheet-content) {
253
+ padding: var(--space-sm, 0.5rem);
254
+ }
255
+
256
+ :global([data-platform='android']) :global(.actionsheet-content) {
257
+ padding: 0;
258
+ padding-bottom: env(safe-area-inset-bottom, 0px);
259
+ }
260
+
261
+ :global([data-platform='android']) :global(.actionsheet-actions),
262
+ :global([data-platform='android']) :global(.actionsheet-cancel) {
263
+ border-radius: 0;
264
+ }
265
+
266
+ :global([data-platform='android']) :global(.actionsheet-cancel-container) {
267
+ margin-top: 0;
268
+ border-top: 1px solid var(--color-border, rgba(0, 0, 0, 0.1));
269
+ }
270
+ </style>
@@ -0,0 +1,12 @@
1
+ import type { ActionSheetProps } from '../../types/index.js';
2
+ interface Props extends ActionSheetProps {
3
+ /** Bindable open state */
4
+ open?: boolean;
5
+ /** Slot for ActionSheetItem children */
6
+ actions?: import('svelte').Snippet;
7
+ /** Default slot for custom content */
8
+ children?: import('svelte').Snippet;
9
+ }
10
+ declare const ActionSheet: import("svelte").Component<Props, {}, "open">;
11
+ type ActionSheet = ReturnType<typeof ActionSheet>;
12
+ export default ActionSheet;