@getmicdrop/svelte-components 5.9.6 → 5.10.1
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/dist/calendar/AboutShow/AboutShow.svelte +172 -172
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
- package/dist/calendar/FAQs/FAQs.svelte +75 -75
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
- package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
- package/dist/calendar/PublicCard/PublicCard.svelte +146 -146
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/calendar/index.js +15 -15
- package/dist/components/Heading.svelte +60 -60
- package/dist/components/Layout/AppShell.svelte +104 -104
- package/dist/components/Layout/ContentSection.svelte +80 -80
- package/dist/components/Layout/Grid.svelte +101 -101
- package/dist/components/Layout/Heading.svelte +81 -81
- package/dist/components/Layout/PageContainer.svelte +69 -69
- package/dist/components/Layout/Responsive.svelte +75 -75
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
- package/dist/components/Layout/ShowOnMobile.svelte +37 -37
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.svelte +52 -52
- package/dist/components/Layout/Text.svelte +87 -87
- package/dist/components/Layout/TwoColumn.svelte +108 -108
- package/dist/components/Text.svelte +53 -53
- package/dist/config.js +5 -5
- package/dist/config.spec.js +29 -29
- package/dist/constants/formOptions.js +48 -48
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/index.js +51 -51
- package/dist/index.spec.js +370 -370
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +45 -45
- package/dist/patterns/data/index.js +4 -4
- package/dist/patterns/forms/FormActions.spec.js +95 -95
- package/dist/patterns/forms/FormActions.stories.svelte +97 -97
- package/dist/patterns/forms/FormActions.svelte +46 -46
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +97 -97
- package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
- package/dist/patterns/forms/index.js +5 -5
- package/dist/patterns/index.js +18 -18
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/layout/Stack.svelte +61 -61
- package/dist/patterns/layout/index.js +29 -29
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +74 -74
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +255 -255
- package/dist/patterns/navigation/index.js +3 -3
- package/dist/patterns/page/PageHeader.svelte +49 -49
- package/dist/patterns/page/PageLayout.svelte +40 -40
- package/dist/patterns/page/PageLoader.spec.js +57 -57
- package/dist/patterns/page/PageLoader.stories.svelte +137 -137
- package/dist/patterns/page/PageLoader.svelte +53 -53
- package/dist/patterns/page/SectionHeader.svelte +51 -51
- package/dist/patterns/page/index.js +5 -5
- package/dist/presets/badges.js +112 -112
- package/dist/presets/buttons.js +76 -76
- package/dist/presets/index.js +9 -9
- package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +62 -62
- package/dist/primitives/Accordion/AccordionItem.spec.js +2 -2
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -107
- package/dist/primitives/Alert/Alert.spec.js +173 -173
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +64 -64
- package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/Badges/Badge.spec.js +144 -144
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +99 -99
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +98 -98
- package/dist/primitives/Button/Button.spec.js +223 -223
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +283 -283
- package/dist/primitives/Button/ButtonGroup.svelte +50 -50
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
- package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
- package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
- package/dist/primitives/Card.spec.js +49 -49
- package/dist/primitives/Card.stories.svelte +22 -22
- package/dist/primitives/Card.svelte +28 -28
- package/dist/primitives/Checkbox/Checkbox.spec.js +2 -2
- package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
- package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
- package/dist/primitives/DarkModeToggle.spec.js +390 -390
- package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
- package/dist/primitives/DarkModeToggle.svelte +136 -136
- package/dist/primitives/Drawer/Drawer.stories.svelte +100 -100
- package/dist/primitives/Drawer/Drawer.svelte +236 -236
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
- package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Helper/Helper.svelte +33 -33
- package/dist/primitives/Icons/ArrowLeft.svelte +21 -21
- package/dist/primitives/Icons/ArrowRight.svelte +21 -21
- package/dist/primitives/Icons/Availability.svelte +27 -27
- package/dist/primitives/Icons/Back.svelte +27 -27
- package/dist/primitives/Icons/CheckCircle.svelte +19 -19
- package/dist/primitives/Icons/CheckCircleOutline.svelte +28 -28
- package/dist/primitives/Icons/ChevronLeft.svelte +17 -17
- package/dist/primitives/Icons/ChevronRight.svelte +17 -17
- package/dist/primitives/Icons/Copy.svelte +28 -28
- package/dist/primitives/Icons/Cross.svelte +18 -18
- package/dist/primitives/Icons/DownArrow.svelte +21 -21
- package/dist/primitives/Icons/ErrorCircle.svelte +19 -19
- package/dist/primitives/Icons/FacebookIcon.svelte +15 -15
- package/dist/primitives/Icons/Home.svelte +28 -28
- package/dist/primitives/Icons/Icon.spec.js +175 -175
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +79 -79
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/ImageOutline.svelte +21 -21
- package/dist/primitives/Icons/Info.svelte +20 -20
- package/dist/primitives/Icons/InstagramIcon.svelte +21 -21
- package/dist/primitives/Icons/LogoInstagram.svelte +15 -15
- package/dist/primitives/Icons/Message.svelte +28 -28
- package/dist/primitives/Icons/MoonIcon.svelte +18 -18
- package/dist/primitives/Icons/More.svelte +34 -34
- package/dist/primitives/Icons/MoreHori.spec.js +67 -67
- package/dist/primitives/Icons/MoreHori.svelte +35 -35
- package/dist/primitives/Icons/Notification.svelte +27 -27
- package/dist/primitives/Icons/Payment.svelte +27 -27
- package/dist/primitives/Icons/Profile.svelte +34 -34
- package/dist/primitives/Icons/Reload.svelte +42 -42
- package/dist/primitives/Icons/Shows.svelte +34 -34
- package/dist/primitives/Icons/Signout.svelte +34 -34
- package/dist/primitives/Icons/SunIcon.svelte +21 -21
- package/dist/primitives/Icons/TiktokIcon.svelte +15 -15
- package/dist/primitives/Icons/TrashBinOutline.svelte +21 -21
- package/dist/primitives/Icons/TwitterIcon.svelte +15 -15
- package/dist/primitives/Icons/WarningIcon.spec.js +30 -30
- package/dist/primitives/Icons/WarningIcon.svelte +24 -24
- package/dist/primitives/Input/Input.spec.js +573 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +423 -433
- package/dist/primitives/Input/Select.spec.js +218 -218
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +252 -252
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +105 -105
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/Modal/Modal.spec.js +99 -99
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +157 -157
- package/dist/primitives/NumberInput/NumberInput.svelte +105 -105
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +261 -261
- package/dist/primitives/Radio/Radio.spec.js +2 -2
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +46 -46
- package/dist/primitives/Spinner/Spinner.spec.js +71 -71
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +44 -44
- package/dist/primitives/Tabs/TabItem.svelte +52 -52
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +137 -137
- package/dist/primitives/Toggle.spec.js +146 -143
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +131 -70
- package/dist/primitives/Toggle.svelte.d.ts.map +1 -1
- package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
- package/dist/primitives/Typography/Typography.svelte +53 -53
- package/dist/primitives/ValidationError.spec.js +103 -103
- package/dist/primitives/ValidationError.stories.svelte +112 -112
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.js +92 -92
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +219 -219
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +970 -970
- package/dist/recipes/SuperLogin/SuperLogin.svelte +1 -1
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +66 -66
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +113 -113
- package/dist/recipes/feedback/ErrorDisplay.svelte +67 -67
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +176 -176
- package/dist/recipes/feedback/index.js +4 -4
- package/dist/recipes/fields/CheckboxField.svelte +85 -85
- package/dist/recipes/fields/FormField.svelte +58 -58
- package/dist/recipes/fields/RadioGroup.svelte +95 -95
- package/dist/recipes/fields/SelectField.svelte +82 -82
- package/dist/recipes/fields/TextareaField.svelte +101 -101
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/index.js +24 -24
- package/dist/recipes/inputs/MultiSelect.spec.js +260 -260
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +283 -283
- package/dist/recipes/inputs/OTPInput.spec.js +251 -251
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +117 -117
- package/dist/recipes/inputs/PasswordInput.svelte +121 -121
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +170 -170
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +344 -344
- package/dist/recipes/inputs/Search.svelte +102 -102
- package/dist/recipes/inputs/SelectDropdown.svelte +171 -171
- package/dist/recipes/inputs/index.js +8 -8
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
- package/dist/recipes/modals/InputModal.svelte +182 -182
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/StatusModal.svelte +206 -206
- package/dist/recipes/modals/index.js +7 -7
- package/dist/services/EventService.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.d.ts +46 -46
- package/dist/services/ShowService.js +143 -143
- package/dist/services/ShowService.spec.js +345 -345
- package/dist/stores/auth.d.ts +8 -8
- package/dist/stores/index.js +9 -9
- package/dist/stores/toaster.d.ts +3 -3
- package/dist/stores/toaster.js +13 -13
- package/dist/stores/toaster.spec.js +59 -59
- package/dist/stories/ButtonAuditDashboard.spec.js +1 -1
- package/dist/stories/ButtonAuditDashboard.svelte +25 -25
- package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
- package/dist/stories/ButtonAuditReview.svelte +427 -427
- package/dist/stories/ButtonGridView.svelte +1 -1
- package/dist/stories/PatternsGallery.stories.svelte +19 -19
- package/dist/stories/PatternsGallery.svelte +399 -399
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +752 -752
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +471 -471
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.js +405 -405
- package/dist/telemetry.server.js +212 -212
- package/dist/telemetry.server.spec.js +438 -438
- package/dist/telemetry.spec.js +1169 -1169
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -163
- package/dist/tokens/utilities.css +353 -353
- package/dist/utils/__tests__/auth.test.js +431 -431
- package/dist/utils/apiConfig.d.ts +29 -29
- package/dist/utils/apiConfig.js +120 -120
- package/dist/utils/apiConfig.spec.js +219 -219
- package/dist/utils/auth.d.ts +46 -46
- package/dist/utils/auth.js +195 -195
- package/dist/utils/greetings.js +187 -187
- package/dist/utils/greetings.spec.js +337 -337
- package/dist/utils/imageValidation.js +121 -121
- package/dist/utils/imageValidation.spec.js +223 -223
- package/dist/utils/portal.d.ts +11 -11
- package/dist/utils/portal.js +25 -25
- package/dist/utils/portal.spec.js +143 -143
- package/dist/utils/transitions.js +4 -4
- package/dist/utils/utils/utils.d.ts +72 -72
- package/dist/utils/utils/utils.js +3 -3
- package/dist/utils/utils/utils.spec.js +698 -698
- package/dist/utils/utils.d.ts +97 -97
- package/dist/utils/utils.js +693 -693
- package/dist/utils/utils.spec.js +643 -643
- package/package.json +297 -297
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* Accordion Component - Flowbite Native (Pure Tailwind)
|
|
4
|
-
*
|
|
5
|
-
* Props:
|
|
6
|
-
* multiple: boolean - Allow multiple items open at once
|
|
7
|
-
* flush: boolean - Remove outer border/radius (Flowbite flush variant)
|
|
8
|
-
*/
|
|
9
|
-
import type { Snippet } from 'svelte';
|
|
10
|
-
import { setContext } from "svelte";
|
|
11
|
-
import { writable } from "svelte/store";
|
|
12
|
-
|
|
13
|
-
interface Props {
|
|
14
|
-
multiple?: boolean;
|
|
15
|
-
flush?: boolean;
|
|
16
|
-
class?: string;
|
|
17
|
-
children?: Snippet;
|
|
18
|
-
[key: string]: unknown;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let {
|
|
22
|
-
multiple = false,
|
|
23
|
-
flush = false,
|
|
24
|
-
class: className = "",
|
|
25
|
-
children,
|
|
26
|
-
...restProps
|
|
27
|
-
}: Props = $props();
|
|
28
|
-
|
|
29
|
-
// Store to track which items are open
|
|
30
|
-
const openItems = writable(new Set<string>());
|
|
31
|
-
|
|
32
|
-
// Context for child AccordionItem components
|
|
33
|
-
// Use getters to capture current prop values (not initial values)
|
|
34
|
-
setContext("accordion", {
|
|
35
|
-
openItems,
|
|
36
|
-
get multiple() { return multiple; },
|
|
37
|
-
get flush() { return flush; },
|
|
38
|
-
toggle: (id: string) => {
|
|
39
|
-
openItems.update((items) => {
|
|
40
|
-
if (items.has(id)) {
|
|
41
|
-
items.delete(id);
|
|
42
|
-
} else {
|
|
43
|
-
if (!multiple) {
|
|
44
|
-
items.clear();
|
|
45
|
-
}
|
|
46
|
-
items.add(id);
|
|
47
|
-
}
|
|
48
|
-
return new Set(items);
|
|
49
|
-
});
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// Flowbite-native classes
|
|
54
|
-
// Note: overflow-hidden was removed to allow dropdowns/menus inside accordion items to render outside the container
|
|
55
|
-
let containerClasses = $derived(flush
|
|
56
|
-
? "divide-y divide-gray-200 dark:divide-gray-700"
|
|
57
|
-
: "border border-gray-200 dark:border-gray-700 rounded-lg divide-y divide-gray-200 dark:divide-gray-700");
|
|
58
|
-
</script>
|
|
59
|
-
|
|
60
|
-
<div class="{containerClasses} {className}" data-accordion={multiple ? "open" : "collapse"} {...restProps}>
|
|
61
|
-
{#if children}{@render children()}{/if}
|
|
62
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Accordion Component - Flowbite Native (Pure Tailwind)
|
|
4
|
+
*
|
|
5
|
+
* Props:
|
|
6
|
+
* multiple: boolean - Allow multiple items open at once
|
|
7
|
+
* flush: boolean - Remove outer border/radius (Flowbite flush variant)
|
|
8
|
+
*/
|
|
9
|
+
import type { Snippet } from 'svelte';
|
|
10
|
+
import { setContext } from "svelte";
|
|
11
|
+
import { writable } from "svelte/store";
|
|
12
|
+
|
|
13
|
+
interface Props {
|
|
14
|
+
multiple?: boolean;
|
|
15
|
+
flush?: boolean;
|
|
16
|
+
class?: string;
|
|
17
|
+
children?: Snippet;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
multiple = false,
|
|
23
|
+
flush = false,
|
|
24
|
+
class: className = "",
|
|
25
|
+
children,
|
|
26
|
+
...restProps
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
// Store to track which items are open
|
|
30
|
+
const openItems = writable(new Set<string>());
|
|
31
|
+
|
|
32
|
+
// Context for child AccordionItem components
|
|
33
|
+
// Use getters to capture current prop values (not initial values)
|
|
34
|
+
setContext("accordion", {
|
|
35
|
+
openItems,
|
|
36
|
+
get multiple() { return multiple; },
|
|
37
|
+
get flush() { return flush; },
|
|
38
|
+
toggle: (id: string) => {
|
|
39
|
+
openItems.update((items) => {
|
|
40
|
+
if (items.has(id)) {
|
|
41
|
+
items.delete(id);
|
|
42
|
+
} else {
|
|
43
|
+
if (!multiple) {
|
|
44
|
+
items.clear();
|
|
45
|
+
}
|
|
46
|
+
items.add(id);
|
|
47
|
+
}
|
|
48
|
+
return new Set(items);
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Flowbite-native classes
|
|
54
|
+
// Note: overflow-hidden was removed to allow dropdowns/menus inside accordion items to render outside the container
|
|
55
|
+
let containerClasses = $derived(flush
|
|
56
|
+
? "divide-y divide-gray-200 dark:divide-gray-700"
|
|
57
|
+
: "border border-gray-200 dark:border-gray-700 rounded-lg divide-y divide-gray-200 dark:divide-gray-700");
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<div class="{containerClasses} {className}" data-accordion={multiple ? "open" : "collapse"} {...restProps}>
|
|
61
|
+
{#if children}{@render children()}{/if}
|
|
62
|
+
</div>
|
|
@@ -233,10 +233,10 @@ describe('AccordionItem - Accessibility', () => {
|
|
|
233
233
|
});
|
|
234
234
|
});
|
|
235
235
|
|
|
236
|
-
test('button has focus:outline-
|
|
236
|
+
test('button has focus:outline-hidden for custom focus styling', () => {
|
|
237
237
|
const { container } = render(AccordionItemWrapper);
|
|
238
238
|
const button = container.querySelector('button');
|
|
239
|
-
expect(button).toHaveClass('focus:outline-
|
|
239
|
+
expect(button).toHaveClass('focus:outline-hidden');
|
|
240
240
|
});
|
|
241
241
|
|
|
242
242
|
test('button is keyboard accessible', async () => {
|
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* AccordionItem Component - Flowbite Native (Pure Tailwind)
|
|
4
|
-
*
|
|
5
|
-
* Props:
|
|
6
|
-
* open: boolean - Start expanded
|
|
7
|
-
* border: boolean - Show bottom border (Flowbite API)
|
|
8
|
-
* borderOpenClass: string - Additional classes when open
|
|
9
|
-
*/
|
|
10
|
-
import type { Snippet } from 'svelte';
|
|
11
|
-
import { getContext, onMount } from "svelte";
|
|
12
|
-
import { safeSlide } from "../../utils/transitions.js";
|
|
13
|
-
import type { Writable } from "svelte/store";
|
|
14
|
-
import { ChevronUpOutline } from "../Icons";
|
|
15
|
-
import { typography } from "../../tokens/typography";
|
|
16
|
-
|
|
17
|
-
interface Props {
|
|
18
|
-
open?: boolean;
|
|
19
|
-
class?: string;
|
|
20
|
-
border?: boolean;
|
|
21
|
-
borderOpenClass?: string;
|
|
22
|
-
header?: Snippet;
|
|
23
|
-
children?: Snippet;
|
|
24
|
-
[key: string]: unknown;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
let {
|
|
28
|
-
open = false,
|
|
29
|
-
class: className = "",
|
|
30
|
-
border = true,
|
|
31
|
-
borderOpenClass = "",
|
|
32
|
-
header,
|
|
33
|
-
children,
|
|
34
|
-
...restProps
|
|
35
|
-
}: Props = $props();
|
|
36
|
-
|
|
37
|
-
const { openItems, toggle, flush } = getContext<{
|
|
38
|
-
openItems: Writable<Set<string>>;
|
|
39
|
-
toggle: (id: string) => void;
|
|
40
|
-
flush: boolean;
|
|
41
|
-
}>("accordion");
|
|
42
|
-
|
|
43
|
-
// Generate unique ID for this item
|
|
44
|
-
let id = Math.random().toString(36).substring(2, 9);
|
|
45
|
-
|
|
46
|
-
onMount(() => {
|
|
47
|
-
if (open) {
|
|
48
|
-
toggle(id);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
let isOpen = $derived($openItems.has(id));
|
|
53
|
-
|
|
54
|
-
function handleClick() {
|
|
55
|
-
toggle(id);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Flowbite-native header classes
|
|
59
|
-
let headerClasses = $derived([
|
|
60
|
-
"flex items-center justify-between w-full p-5 font-medium text-left",
|
|
61
|
-
typography.smMuted,
|
|
62
|
-
"bg-gray-100 dark:bg-gray-800",
|
|
63
|
-
"hover:bg-gray-200 dark:hover:bg-gray-700",
|
|
64
|
-
"focus:outline-
|
|
65
|
-
"gap-3",
|
|
66
|
-
isOpen ? "bg-gray-100 dark:bg-gray-800" : "",
|
|
67
|
-
].join(" "));
|
|
68
|
-
</script>
|
|
69
|
-
|
|
70
|
-
<div class="{className} {isOpen && borderOpenClass ? borderOpenClass : ''}" {...restProps}>
|
|
71
|
-
<h2>
|
|
72
|
-
<button
|
|
73
|
-
type="button"
|
|
74
|
-
class={headerClasses}
|
|
75
|
-
aria-expanded={isOpen}
|
|
76
|
-
onclick={handleClick}
|
|
77
|
-
>
|
|
78
|
-
<span class={typography.body}>
|
|
79
|
-
{#if header}{@render header()}{:else}Accordion Item{/if}
|
|
80
|
-
</span>
|
|
81
|
-
<!-- Flowbite arrow icon -->
|
|
82
|
-
<ChevronUpOutline class="w-3 h-3 shrink-0 transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
|
|
83
|
-
</button>
|
|
84
|
-
</h2>
|
|
85
|
-
|
|
86
|
-
{#if isOpen}
|
|
87
|
-
<div transition:safeSlide={{ duration: 200 }}>
|
|
88
|
-
<div class="p-5 {flush ? '' : 'border border-t-0 border-gray-200 dark:border-gray-700'}">
|
|
89
|
-
<p class={typography.bodyMuted}>
|
|
90
|
-
{#if children}{@render children()}{/if}
|
|
91
|
-
</p>
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
{/if}
|
|
95
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* AccordionItem Component - Flowbite Native (Pure Tailwind)
|
|
4
|
+
*
|
|
5
|
+
* Props:
|
|
6
|
+
* open: boolean - Start expanded
|
|
7
|
+
* border: boolean - Show bottom border (Flowbite API)
|
|
8
|
+
* borderOpenClass: string - Additional classes when open
|
|
9
|
+
*/
|
|
10
|
+
import type { Snippet } from 'svelte';
|
|
11
|
+
import { getContext, onMount } from "svelte";
|
|
12
|
+
import { safeSlide } from "../../utils/transitions.js";
|
|
13
|
+
import type { Writable } from "svelte/store";
|
|
14
|
+
import { ChevronUpOutline } from "../Icons";
|
|
15
|
+
import { typography } from "../../tokens/typography";
|
|
16
|
+
|
|
17
|
+
interface Props {
|
|
18
|
+
open?: boolean;
|
|
19
|
+
class?: string;
|
|
20
|
+
border?: boolean;
|
|
21
|
+
borderOpenClass?: string;
|
|
22
|
+
header?: Snippet;
|
|
23
|
+
children?: Snippet;
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let {
|
|
28
|
+
open = false,
|
|
29
|
+
class: className = "",
|
|
30
|
+
border = true,
|
|
31
|
+
borderOpenClass = "",
|
|
32
|
+
header,
|
|
33
|
+
children,
|
|
34
|
+
...restProps
|
|
35
|
+
}: Props = $props();
|
|
36
|
+
|
|
37
|
+
const { openItems, toggle, flush } = getContext<{
|
|
38
|
+
openItems: Writable<Set<string>>;
|
|
39
|
+
toggle: (id: string) => void;
|
|
40
|
+
flush: boolean;
|
|
41
|
+
}>("accordion");
|
|
42
|
+
|
|
43
|
+
// Generate unique ID for this item
|
|
44
|
+
let id = Math.random().toString(36).substring(2, 9);
|
|
45
|
+
|
|
46
|
+
onMount(() => {
|
|
47
|
+
if (open) {
|
|
48
|
+
toggle(id);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
let isOpen = $derived($openItems.has(id));
|
|
53
|
+
|
|
54
|
+
function handleClick() {
|
|
55
|
+
toggle(id);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Flowbite-native header classes
|
|
59
|
+
let headerClasses = $derived([
|
|
60
|
+
"flex items-center justify-between w-full p-5 font-medium text-left",
|
|
61
|
+
typography.smMuted,
|
|
62
|
+
"bg-gray-100 dark:bg-gray-800",
|
|
63
|
+
"hover:bg-gray-200 dark:hover:bg-gray-700",
|
|
64
|
+
"focus:outline-hidden",
|
|
65
|
+
"gap-3",
|
|
66
|
+
isOpen ? "bg-gray-100 dark:bg-gray-800" : "",
|
|
67
|
+
].join(" "));
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<div class="{className} {isOpen && borderOpenClass ? borderOpenClass : ''}" {...restProps}>
|
|
71
|
+
<h2>
|
|
72
|
+
<button
|
|
73
|
+
type="button"
|
|
74
|
+
class={headerClasses}
|
|
75
|
+
aria-expanded={isOpen}
|
|
76
|
+
onclick={handleClick}
|
|
77
|
+
>
|
|
78
|
+
<span class={typography.body}>
|
|
79
|
+
{#if header}{@render header()}{:else}Accordion Item{/if}
|
|
80
|
+
</span>
|
|
81
|
+
<!-- Flowbite arrow icon -->
|
|
82
|
+
<ChevronUpOutline class="w-3 h-3 shrink-0 transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
|
|
83
|
+
</button>
|
|
84
|
+
</h2>
|
|
85
|
+
|
|
86
|
+
{#if isOpen}
|
|
87
|
+
<div transition:safeSlide={{ duration: 200 }}>
|
|
88
|
+
<div class="p-5 {flush ? '' : 'border border-t-0 border-gray-200 dark:border-gray-700'}">
|
|
89
|
+
<p class={typography.bodyMuted}>
|
|
90
|
+
{#if children}{@render children()}{/if}
|
|
91
|
+
</p>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
{/if}
|
|
95
|
+
</div>
|
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* Test wrapper for AccordionItem
|
|
4
|
-
* Provides the necessary accordion context that AccordionItem expects
|
|
5
|
-
*/
|
|
6
|
-
import type { Snippet } from 'svelte';
|
|
7
|
-
import { setContext } from 'svelte';
|
|
8
|
-
import { writable } from 'svelte/store';
|
|
9
|
-
import AccordionItem from './AccordionItem.svelte';
|
|
10
|
-
|
|
11
|
-
interface Props {
|
|
12
|
-
/** Allow multiple items open at once */
|
|
13
|
-
multiple?: boolean;
|
|
14
|
-
/** Remove outer border/radius (Flowbite flush variant) */
|
|
15
|
-
flush?: boolean;
|
|
16
|
-
/** Initial open state of the item */
|
|
17
|
-
open?: boolean;
|
|
18
|
-
/** Show bottom border */
|
|
19
|
-
border?: boolean;
|
|
20
|
-
/** Additional classes when open */
|
|
21
|
-
borderOpenClass?: string;
|
|
22
|
-
/** Custom class for the item */
|
|
23
|
-
class?: string;
|
|
24
|
-
/** Header snippet */
|
|
25
|
-
header?: Snippet;
|
|
26
|
-
/** Children snippet */
|
|
27
|
-
children?: Snippet;
|
|
28
|
-
/** Expose the openItems store for testing */
|
|
29
|
-
openItems?: import('svelte/store').Writable<Set<string>> | null;
|
|
30
|
-
/** Expose the toggle function for testing */
|
|
31
|
-
toggleFn?: ((id: string) => void) | null;
|
|
32
|
-
/** Data attributes for testing */
|
|
33
|
-
'data-testid'?: string;
|
|
34
|
-
'data-custom'?: string;
|
|
35
|
-
[key: string]: unknown;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
let {
|
|
39
|
-
multiple = false,
|
|
40
|
-
flush = false,
|
|
41
|
-
open = false,
|
|
42
|
-
border = true,
|
|
43
|
-
borderOpenClass = '',
|
|
44
|
-
class: className = '',
|
|
45
|
-
header,
|
|
46
|
-
children,
|
|
47
|
-
openItems: exposedOpenItems = $bindable(null),
|
|
48
|
-
toggleFn: exposedToggleFn = $bindable(null),
|
|
49
|
-
'data-testid': dataTestId,
|
|
50
|
-
'data-custom': dataCustom,
|
|
51
|
-
...restProps
|
|
52
|
-
}: Props = $props();
|
|
53
|
-
|
|
54
|
-
// Create the accordion context
|
|
55
|
-
const openItems = writable(new Set<string>());
|
|
56
|
-
|
|
57
|
-
// Expose openItems to parent for testing
|
|
58
|
-
exposedOpenItems = openItems;
|
|
59
|
-
|
|
60
|
-
const toggle = (id: string) => {
|
|
61
|
-
openItems.update((items) => {
|
|
62
|
-
if (items.has(id)) {
|
|
63
|
-
items.delete(id);
|
|
64
|
-
} else {
|
|
65
|
-
if (!multiple) {
|
|
66
|
-
items.clear();
|
|
67
|
-
}
|
|
68
|
-
items.add(id);
|
|
69
|
-
}
|
|
70
|
-
return new Set(items);
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// Expose toggle function to parent for testing
|
|
75
|
-
exposedToggleFn = toggle;
|
|
76
|
-
|
|
77
|
-
setContext("accordion", {
|
|
78
|
-
openItems,
|
|
79
|
-
toggle,
|
|
80
|
-
get flush() { return flush; }
|
|
81
|
-
});
|
|
82
|
-
</script>
|
|
83
|
-
|
|
84
|
-
<AccordionItem
|
|
85
|
-
{open}
|
|
86
|
-
{border}
|
|
87
|
-
{borderOpenClass}
|
|
88
|
-
class={className}
|
|
89
|
-
data-testid={dataTestId}
|
|
90
|
-
data-custom={dataCustom}
|
|
91
|
-
{...restProps}
|
|
92
|
-
>
|
|
93
|
-
{#snippet header()}
|
|
94
|
-
{#if header}
|
|
95
|
-
{@render header()}
|
|
96
|
-
{:else}
|
|
97
|
-
Test Header
|
|
98
|
-
{/if}
|
|
99
|
-
{/snippet}
|
|
100
|
-
{#snippet children()}
|
|
101
|
-
{#if children}
|
|
102
|
-
{@render children()}
|
|
103
|
-
{:else}
|
|
104
|
-
Test Content
|
|
105
|
-
{/if}
|
|
106
|
-
{/snippet}
|
|
107
|
-
</AccordionItem>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Test wrapper for AccordionItem
|
|
4
|
+
* Provides the necessary accordion context that AccordionItem expects
|
|
5
|
+
*/
|
|
6
|
+
import type { Snippet } from 'svelte';
|
|
7
|
+
import { setContext } from 'svelte';
|
|
8
|
+
import { writable } from 'svelte/store';
|
|
9
|
+
import AccordionItem from './AccordionItem.svelte';
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
/** Allow multiple items open at once */
|
|
13
|
+
multiple?: boolean;
|
|
14
|
+
/** Remove outer border/radius (Flowbite flush variant) */
|
|
15
|
+
flush?: boolean;
|
|
16
|
+
/** Initial open state of the item */
|
|
17
|
+
open?: boolean;
|
|
18
|
+
/** Show bottom border */
|
|
19
|
+
border?: boolean;
|
|
20
|
+
/** Additional classes when open */
|
|
21
|
+
borderOpenClass?: string;
|
|
22
|
+
/** Custom class for the item */
|
|
23
|
+
class?: string;
|
|
24
|
+
/** Header snippet */
|
|
25
|
+
header?: Snippet;
|
|
26
|
+
/** Children snippet */
|
|
27
|
+
children?: Snippet;
|
|
28
|
+
/** Expose the openItems store for testing */
|
|
29
|
+
openItems?: import('svelte/store').Writable<Set<string>> | null;
|
|
30
|
+
/** Expose the toggle function for testing */
|
|
31
|
+
toggleFn?: ((id: string) => void) | null;
|
|
32
|
+
/** Data attributes for testing */
|
|
33
|
+
'data-testid'?: string;
|
|
34
|
+
'data-custom'?: string;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let {
|
|
39
|
+
multiple = false,
|
|
40
|
+
flush = false,
|
|
41
|
+
open = false,
|
|
42
|
+
border = true,
|
|
43
|
+
borderOpenClass = '',
|
|
44
|
+
class: className = '',
|
|
45
|
+
header,
|
|
46
|
+
children,
|
|
47
|
+
openItems: exposedOpenItems = $bindable(null),
|
|
48
|
+
toggleFn: exposedToggleFn = $bindable(null),
|
|
49
|
+
'data-testid': dataTestId,
|
|
50
|
+
'data-custom': dataCustom,
|
|
51
|
+
...restProps
|
|
52
|
+
}: Props = $props();
|
|
53
|
+
|
|
54
|
+
// Create the accordion context
|
|
55
|
+
const openItems = writable(new Set<string>());
|
|
56
|
+
|
|
57
|
+
// Expose openItems to parent for testing
|
|
58
|
+
exposedOpenItems = openItems;
|
|
59
|
+
|
|
60
|
+
const toggle = (id: string) => {
|
|
61
|
+
openItems.update((items) => {
|
|
62
|
+
if (items.has(id)) {
|
|
63
|
+
items.delete(id);
|
|
64
|
+
} else {
|
|
65
|
+
if (!multiple) {
|
|
66
|
+
items.clear();
|
|
67
|
+
}
|
|
68
|
+
items.add(id);
|
|
69
|
+
}
|
|
70
|
+
return new Set(items);
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Expose toggle function to parent for testing
|
|
75
|
+
exposedToggleFn = toggle;
|
|
76
|
+
|
|
77
|
+
setContext("accordion", {
|
|
78
|
+
openItems,
|
|
79
|
+
toggle,
|
|
80
|
+
get flush() { return flush; }
|
|
81
|
+
});
|
|
82
|
+
</script>
|
|
83
|
+
|
|
84
|
+
<AccordionItem
|
|
85
|
+
{open}
|
|
86
|
+
{border}
|
|
87
|
+
{borderOpenClass}
|
|
88
|
+
class={className}
|
|
89
|
+
data-testid={dataTestId}
|
|
90
|
+
data-custom={dataCustom}
|
|
91
|
+
{...restProps}
|
|
92
|
+
>
|
|
93
|
+
{#snippet header()}
|
|
94
|
+
{#if header}
|
|
95
|
+
{@render header()}
|
|
96
|
+
{:else}
|
|
97
|
+
Test Header
|
|
98
|
+
{/if}
|
|
99
|
+
{/snippet}
|
|
100
|
+
{#snippet children()}
|
|
101
|
+
{#if children}
|
|
102
|
+
{@render children()}
|
|
103
|
+
{:else}
|
|
104
|
+
Test Content
|
|
105
|
+
{/if}
|
|
106
|
+
{/snippet}
|
|
107
|
+
</AccordionItem>
|