@getmicdrop/svelte-components 5.9.6 → 5.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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.spec.js +1 -1
- 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/datetime/__tests__/format.test.js +1 -1
- package/dist/datetime/__tests__/parse.test.js +1 -1
- package/dist/datetime/__tests__/timezone.test.js +1 -1
- package/dist/datetime/parse.js +1 -1
- package/dist/forms/createFormStore.svelte.js +0 -1
- 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 +132 -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,101 +1,101 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import { gapMap, type GapKey } from '../../tokens/spacing.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Grid - Responsive grid container with automatic column sizing
|
|
7
|
-
*
|
|
8
|
-
* Use Grid for laying out cards, stats, or any items in a responsive grid.
|
|
9
|
-
* Automatically stacks on mobile and expands on larger screens.
|
|
10
|
-
*
|
|
11
|
-
* @example Numeric gap
|
|
12
|
-
* <Grid cols="3" gap="6">
|
|
13
|
-
* <StatsCard>Revenue</StatsCard>
|
|
14
|
-
* <StatsCard>Users</StatsCard>
|
|
15
|
-
* <StatsCard>Orders</StatsCard>
|
|
16
|
-
* </Grid>
|
|
17
|
-
*
|
|
18
|
-
* @example Semantic gap (recommended)
|
|
19
|
-
* <Grid cols="3" gap="section">
|
|
20
|
-
* <Card>Card 1</Card>
|
|
21
|
-
* <Card>Card 2</Card>
|
|
22
|
-
* <Card>Card 3</Card>
|
|
23
|
-
* </Grid>
|
|
24
|
-
*
|
|
25
|
-
* @example Auto-fit columns
|
|
26
|
-
* <Grid cols="auto" minWidth="300px" gap="section">
|
|
27
|
-
* {#each items as item}
|
|
28
|
-
* <Card>{item.name}</Card>
|
|
29
|
-
* {/each}
|
|
30
|
-
* </Grid>
|
|
31
|
-
*
|
|
32
|
-
* @example 12-column layout grid
|
|
33
|
-
* <Grid cols="12" gap="none">
|
|
34
|
-
* <div class="col-span-4">Sidebar</div>
|
|
35
|
-
* <div class="col-span-8">Content</div>
|
|
36
|
-
* </Grid>
|
|
37
|
-
*
|
|
38
|
-
* Semantic Gap Values (from tokens/spacing.ts):
|
|
39
|
-
* - none: 0px - No gap (for 12-col layouts)
|
|
40
|
-
* - xs: 4px (1) - Extra small gap
|
|
41
|
-
* - sm: 8px (2) - Small gap
|
|
42
|
-
* - tight: 16px (4) - Tight grid items (alias: md, content)
|
|
43
|
-
* - standard: 24px (6) - Standard grid items (alias: lg, section)
|
|
44
|
-
* - spacious: 32px (8) - Spacious grid items (alias: xl, layout)
|
|
45
|
-
*/
|
|
46
|
-
|
|
47
|
-
interface Props {
|
|
48
|
-
/** Number of columns or 'auto' for auto-fit */
|
|
49
|
-
cols?: '1' | '2' | '3' | '4' | '5' | '6' | '12' | 'auto';
|
|
50
|
-
/** Gap between grid items - semantic names or Tailwind spacing scale */
|
|
51
|
-
gap?: GapKey;
|
|
52
|
-
/** Minimum width for auto-fit columns (only used when cols='auto') */
|
|
53
|
-
minWidth?: string;
|
|
54
|
-
/** HTML element to render as */
|
|
55
|
-
as?: 'div' | 'section' | 'ul';
|
|
56
|
-
/** Additional CSS classes */
|
|
57
|
-
class?: string;
|
|
58
|
-
/** Child content */
|
|
59
|
-
children?: Snippet;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
let {
|
|
63
|
-
cols = '3',
|
|
64
|
-
gap = '4',
|
|
65
|
-
minWidth = '280px',
|
|
66
|
-
as = 'div',
|
|
67
|
-
class: className = '',
|
|
68
|
-
children
|
|
69
|
-
}: Props = $props();
|
|
70
|
-
|
|
71
|
-
// Responsive column mappings - stack on mobile, expand on larger screens
|
|
72
|
-
const colsMap: Record<string, string> = {
|
|
73
|
-
'1': 'grid-cols-1',
|
|
74
|
-
'2': 'grid-cols-1 md:grid-cols-2',
|
|
75
|
-
'3': 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
|
|
76
|
-
'4': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',
|
|
77
|
-
'5': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-5',
|
|
78
|
-
'6': 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6',
|
|
79
|
-
'12': 'grid-cols-12',
|
|
80
|
-
'auto': '' // Uses inline style
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
let gridStyle = $derived(
|
|
84
|
-
cols === 'auto'
|
|
85
|
-
? `grid-template-columns: repeat(auto-fit, minmax(${minWidth}, 1fr));`
|
|
86
|
-
: ''
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
let classes = $derived(
|
|
90
|
-
[
|
|
91
|
-
'grid',
|
|
92
|
-
cols !== 'auto' ? colsMap[cols] : '',
|
|
93
|
-
gapMap[gap] || 'gap-4',
|
|
94
|
-
className
|
|
95
|
-
].filter(Boolean).join(' ')
|
|
96
|
-
);
|
|
97
|
-
</script>
|
|
98
|
-
|
|
99
|
-
<svelte:element this={as} class={classes} style={gridStyle || undefined}>
|
|
100
|
-
{@render children?.()}
|
|
101
|
-
</svelte:element>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { gapMap, type GapKey } from '../../tokens/spacing.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Grid - Responsive grid container with automatic column sizing
|
|
7
|
+
*
|
|
8
|
+
* Use Grid for laying out cards, stats, or any items in a responsive grid.
|
|
9
|
+
* Automatically stacks on mobile and expands on larger screens.
|
|
10
|
+
*
|
|
11
|
+
* @example Numeric gap
|
|
12
|
+
* <Grid cols="3" gap="6">
|
|
13
|
+
* <StatsCard>Revenue</StatsCard>
|
|
14
|
+
* <StatsCard>Users</StatsCard>
|
|
15
|
+
* <StatsCard>Orders</StatsCard>
|
|
16
|
+
* </Grid>
|
|
17
|
+
*
|
|
18
|
+
* @example Semantic gap (recommended)
|
|
19
|
+
* <Grid cols="3" gap="section">
|
|
20
|
+
* <Card>Card 1</Card>
|
|
21
|
+
* <Card>Card 2</Card>
|
|
22
|
+
* <Card>Card 3</Card>
|
|
23
|
+
* </Grid>
|
|
24
|
+
*
|
|
25
|
+
* @example Auto-fit columns
|
|
26
|
+
* <Grid cols="auto" minWidth="300px" gap="section">
|
|
27
|
+
* {#each items as item}
|
|
28
|
+
* <Card>{item.name}</Card>
|
|
29
|
+
* {/each}
|
|
30
|
+
* </Grid>
|
|
31
|
+
*
|
|
32
|
+
* @example 12-column layout grid
|
|
33
|
+
* <Grid cols="12" gap="none">
|
|
34
|
+
* <div class="col-span-4">Sidebar</div>
|
|
35
|
+
* <div class="col-span-8">Content</div>
|
|
36
|
+
* </Grid>
|
|
37
|
+
*
|
|
38
|
+
* Semantic Gap Values (from tokens/spacing.ts):
|
|
39
|
+
* - none: 0px - No gap (for 12-col layouts)
|
|
40
|
+
* - xs: 4px (1) - Extra small gap
|
|
41
|
+
* - sm: 8px (2) - Small gap
|
|
42
|
+
* - tight: 16px (4) - Tight grid items (alias: md, content)
|
|
43
|
+
* - standard: 24px (6) - Standard grid items (alias: lg, section)
|
|
44
|
+
* - spacious: 32px (8) - Spacious grid items (alias: xl, layout)
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
interface Props {
|
|
48
|
+
/** Number of columns or 'auto' for auto-fit */
|
|
49
|
+
cols?: '1' | '2' | '3' | '4' | '5' | '6' | '12' | 'auto';
|
|
50
|
+
/** Gap between grid items - semantic names or Tailwind spacing scale */
|
|
51
|
+
gap?: GapKey;
|
|
52
|
+
/** Minimum width for auto-fit columns (only used when cols='auto') */
|
|
53
|
+
minWidth?: string;
|
|
54
|
+
/** HTML element to render as */
|
|
55
|
+
as?: 'div' | 'section' | 'ul';
|
|
56
|
+
/** Additional CSS classes */
|
|
57
|
+
class?: string;
|
|
58
|
+
/** Child content */
|
|
59
|
+
children?: Snippet;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let {
|
|
63
|
+
cols = '3',
|
|
64
|
+
gap = '4',
|
|
65
|
+
minWidth = '280px',
|
|
66
|
+
as = 'div',
|
|
67
|
+
class: className = '',
|
|
68
|
+
children
|
|
69
|
+
}: Props = $props();
|
|
70
|
+
|
|
71
|
+
// Responsive column mappings - stack on mobile, expand on larger screens
|
|
72
|
+
const colsMap: Record<string, string> = {
|
|
73
|
+
'1': 'grid-cols-1',
|
|
74
|
+
'2': 'grid-cols-1 md:grid-cols-2',
|
|
75
|
+
'3': 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
|
|
76
|
+
'4': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',
|
|
77
|
+
'5': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-5',
|
|
78
|
+
'6': 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6',
|
|
79
|
+
'12': 'grid-cols-12',
|
|
80
|
+
'auto': '' // Uses inline style
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
let gridStyle = $derived(
|
|
84
|
+
cols === 'auto'
|
|
85
|
+
? `grid-template-columns: repeat(auto-fit, minmax(${minWidth}, 1fr));`
|
|
86
|
+
: ''
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
let classes = $derived(
|
|
90
|
+
[
|
|
91
|
+
'grid',
|
|
92
|
+
cols !== 'auto' ? colsMap[cols] : '',
|
|
93
|
+
gapMap[gap] || 'gap-4',
|
|
94
|
+
className
|
|
95
|
+
].filter(Boolean).join(' ')
|
|
96
|
+
);
|
|
97
|
+
</script>
|
|
98
|
+
|
|
99
|
+
<svelte:element this={as} class={classes} style={gridStyle || undefined}>
|
|
100
|
+
{@render children?.()}
|
|
101
|
+
</svelte:element>
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
|
|
4
|
-
type Level = 1 | 2 | 3 | 4 | 5 | 6;
|
|
5
|
-
type Size = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
|
|
6
|
-
type Variant = 'default' | 'muted' | 'primary';
|
|
7
|
-
|
|
8
|
-
interface Props {
|
|
9
|
-
/** Semantic heading level (1-6) */
|
|
10
|
-
level?: Level;
|
|
11
|
-
/** Visual size override (optional - defaults based on level) */
|
|
12
|
-
size?: Size;
|
|
13
|
-
/** Color variant */
|
|
14
|
-
variant?: Variant;
|
|
15
|
-
/** Font weight */
|
|
16
|
-
weight?: 'medium' | 'semibold' | 'bold';
|
|
17
|
-
/** Additional CSS classes */
|
|
18
|
-
class?: string;
|
|
19
|
-
/** Child content */
|
|
20
|
-
children?: Snippet;
|
|
21
|
-
/** Rest props */
|
|
22
|
-
[key: string]: unknown;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
let {
|
|
26
|
-
level = 2,
|
|
27
|
-
size,
|
|
28
|
-
variant = 'default',
|
|
29
|
-
weight = 'semibold',
|
|
30
|
-
class: className = '',
|
|
31
|
-
children,
|
|
32
|
-
...restProps
|
|
33
|
-
}: Props = $props();
|
|
34
|
-
|
|
35
|
-
// Default size mapping based on heading level
|
|
36
|
-
const levelToSize: Record<Level, Size> = {
|
|
37
|
-
1: '3xl',
|
|
38
|
-
2: '2xl',
|
|
39
|
-
3: 'xl',
|
|
40
|
-
4: 'lg',
|
|
41
|
-
5: 'base',
|
|
42
|
-
6: 'sm',
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const sizeClasses: Record<Size, string> = {
|
|
46
|
-
xs: 'text-xs',
|
|
47
|
-
sm: 'text-sm',
|
|
48
|
-
base: 'text-base',
|
|
49
|
-
lg: 'text-lg',
|
|
50
|
-
xl: 'text-xl',
|
|
51
|
-
'2xl': 'text-2xl',
|
|
52
|
-
'3xl': 'text-3xl',
|
|
53
|
-
'4xl': 'text-4xl',
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const variantClasses: Record<Variant, string> = {
|
|
57
|
-
default: 'text-gray-900 dark:text-white',
|
|
58
|
-
muted: 'text-gray-600 dark:text-gray-400',
|
|
59
|
-
primary: 'text-primary dark:text-primary',
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const weightClasses: Record<string, string> = {
|
|
63
|
-
medium: 'font-medium',
|
|
64
|
-
semibold: 'font-semibold',
|
|
65
|
-
bold: 'font-bold',
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
let effectiveSize = $derived(size || levelToSize[level]);
|
|
69
|
-
let element = $derived(`h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6');
|
|
70
|
-
|
|
71
|
-
let classes = $derived([
|
|
72
|
-
sizeClasses[effectiveSize],
|
|
73
|
-
variantClasses[variant],
|
|
74
|
-
weightClasses[weight],
|
|
75
|
-
className,
|
|
76
|
-
].filter(Boolean).join(' '));
|
|
77
|
-
</script>
|
|
78
|
-
|
|
79
|
-
<svelte:element this={element} class={classes} {...restProps}>
|
|
80
|
-
{#if children}{@render children()}{/if}
|
|
81
|
-
</svelte:element>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
type Level = 1 | 2 | 3 | 4 | 5 | 6;
|
|
5
|
+
type Size = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
|
|
6
|
+
type Variant = 'default' | 'muted' | 'primary';
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
/** Semantic heading level (1-6) */
|
|
10
|
+
level?: Level;
|
|
11
|
+
/** Visual size override (optional - defaults based on level) */
|
|
12
|
+
size?: Size;
|
|
13
|
+
/** Color variant */
|
|
14
|
+
variant?: Variant;
|
|
15
|
+
/** Font weight */
|
|
16
|
+
weight?: 'medium' | 'semibold' | 'bold';
|
|
17
|
+
/** Additional CSS classes */
|
|
18
|
+
class?: string;
|
|
19
|
+
/** Child content */
|
|
20
|
+
children?: Snippet;
|
|
21
|
+
/** Rest props */
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let {
|
|
26
|
+
level = 2,
|
|
27
|
+
size,
|
|
28
|
+
variant = 'default',
|
|
29
|
+
weight = 'semibold',
|
|
30
|
+
class: className = '',
|
|
31
|
+
children,
|
|
32
|
+
...restProps
|
|
33
|
+
}: Props = $props();
|
|
34
|
+
|
|
35
|
+
// Default size mapping based on heading level
|
|
36
|
+
const levelToSize: Record<Level, Size> = {
|
|
37
|
+
1: '3xl',
|
|
38
|
+
2: '2xl',
|
|
39
|
+
3: 'xl',
|
|
40
|
+
4: 'lg',
|
|
41
|
+
5: 'base',
|
|
42
|
+
6: 'sm',
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const sizeClasses: Record<Size, string> = {
|
|
46
|
+
xs: 'text-xs',
|
|
47
|
+
sm: 'text-sm',
|
|
48
|
+
base: 'text-base',
|
|
49
|
+
lg: 'text-lg',
|
|
50
|
+
xl: 'text-xl',
|
|
51
|
+
'2xl': 'text-2xl',
|
|
52
|
+
'3xl': 'text-3xl',
|
|
53
|
+
'4xl': 'text-4xl',
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const variantClasses: Record<Variant, string> = {
|
|
57
|
+
default: 'text-gray-900 dark:text-white',
|
|
58
|
+
muted: 'text-gray-600 dark:text-gray-400',
|
|
59
|
+
primary: 'text-primary dark:text-primary',
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const weightClasses: Record<string, string> = {
|
|
63
|
+
medium: 'font-medium',
|
|
64
|
+
semibold: 'font-semibold',
|
|
65
|
+
bold: 'font-bold',
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
let effectiveSize = $derived(size || levelToSize[level]);
|
|
69
|
+
let element = $derived(`h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6');
|
|
70
|
+
|
|
71
|
+
let classes = $derived([
|
|
72
|
+
sizeClasses[effectiveSize],
|
|
73
|
+
variantClasses[variant],
|
|
74
|
+
weightClasses[weight],
|
|
75
|
+
className,
|
|
76
|
+
].filter(Boolean).join(' '));
|
|
77
|
+
</script>
|
|
78
|
+
|
|
79
|
+
<svelte:element this={element} class={classes} {...restProps}>
|
|
80
|
+
{#if children}{@render children()}{/if}
|
|
81
|
+
</svelte:element>
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
|
|
4
|
-
type MaxWidth = 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '6xl' | 'full';
|
|
5
|
-
type Padding = 'none' | 'tight' | 'default' | 'spacious';
|
|
6
|
-
|
|
7
|
-
interface Props {
|
|
8
|
-
/** Maximum width of the container */
|
|
9
|
-
maxWidth?: MaxWidth;
|
|
10
|
-
/** Padding variant */
|
|
11
|
-
padding?: Padding;
|
|
12
|
-
/** Center the container */
|
|
13
|
-
center?: boolean;
|
|
14
|
-
/** Background color variant */
|
|
15
|
-
background?: 'none' | 'white' | 'gray';
|
|
16
|
-
/** Additional CSS classes */
|
|
17
|
-
class?: string;
|
|
18
|
-
/** Child content */
|
|
19
|
-
children?: Snippet;
|
|
20
|
-
/** Rest props */
|
|
21
|
-
[key: string]: unknown;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
let {
|
|
25
|
-
maxWidth = 'full',
|
|
26
|
-
padding = 'default',
|
|
27
|
-
center = true,
|
|
28
|
-
background = 'none',
|
|
29
|
-
class: className = '',
|
|
30
|
-
children,
|
|
31
|
-
...restProps
|
|
32
|
-
}: Props = $props();
|
|
33
|
-
|
|
34
|
-
const maxWidthClasses: Record<MaxWidth, string> = {
|
|
35
|
-
sm: 'max-w-sm',
|
|
36
|
-
md: 'max-w-md',
|
|
37
|
-
lg: 'max-w-lg',
|
|
38
|
-
xl: 'max-w-xl',
|
|
39
|
-
'2xl': 'max-w-2xl',
|
|
40
|
-
'4xl': 'max-w-4xl',
|
|
41
|
-
'6xl': 'max-w-6xl',
|
|
42
|
-
full: 'max-w-full',
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const paddingClasses: Record<Padding, string> = {
|
|
46
|
-
none: '',
|
|
47
|
-
tight: 'px-2 py-2 md:px-4 md:py-4',
|
|
48
|
-
default: 'px-4 py-6 md:py-8',
|
|
49
|
-
spacious: 'px-4 py-8 md:px-6 md:py-12',
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
const backgroundClasses: Record<string, string> = {
|
|
53
|
-
none: '',
|
|
54
|
-
white: 'bg-white dark:bg-gray-900',
|
|
55
|
-
gray: 'bg-gray-50 dark:bg-gray-800',
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
let classes = $derived([
|
|
59
|
-
maxWidthClasses[maxWidth],
|
|
60
|
-
paddingClasses[padding],
|
|
61
|
-
backgroundClasses[background],
|
|
62
|
-
center ? 'mx-auto' : '',
|
|
63
|
-
className,
|
|
64
|
-
].filter(Boolean).join(' '));
|
|
65
|
-
</script>
|
|
66
|
-
|
|
67
|
-
<div class={classes} {...restProps}>
|
|
68
|
-
{#if children}{@render children()}{/if}
|
|
69
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
type MaxWidth = 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '6xl' | 'full';
|
|
5
|
+
type Padding = 'none' | 'tight' | 'default' | 'spacious';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
/** Maximum width of the container */
|
|
9
|
+
maxWidth?: MaxWidth;
|
|
10
|
+
/** Padding variant */
|
|
11
|
+
padding?: Padding;
|
|
12
|
+
/** Center the container */
|
|
13
|
+
center?: boolean;
|
|
14
|
+
/** Background color variant */
|
|
15
|
+
background?: 'none' | 'white' | 'gray';
|
|
16
|
+
/** Additional CSS classes */
|
|
17
|
+
class?: string;
|
|
18
|
+
/** Child content */
|
|
19
|
+
children?: Snippet;
|
|
20
|
+
/** Rest props */
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
maxWidth = 'full',
|
|
26
|
+
padding = 'default',
|
|
27
|
+
center = true,
|
|
28
|
+
background = 'none',
|
|
29
|
+
class: className = '',
|
|
30
|
+
children,
|
|
31
|
+
...restProps
|
|
32
|
+
}: Props = $props();
|
|
33
|
+
|
|
34
|
+
const maxWidthClasses: Record<MaxWidth, string> = {
|
|
35
|
+
sm: 'max-w-sm',
|
|
36
|
+
md: 'max-w-md',
|
|
37
|
+
lg: 'max-w-lg',
|
|
38
|
+
xl: 'max-w-xl',
|
|
39
|
+
'2xl': 'max-w-2xl',
|
|
40
|
+
'4xl': 'max-w-4xl',
|
|
41
|
+
'6xl': 'max-w-6xl',
|
|
42
|
+
full: 'max-w-full',
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const paddingClasses: Record<Padding, string> = {
|
|
46
|
+
none: '',
|
|
47
|
+
tight: 'px-2 py-2 md:px-4 md:py-4',
|
|
48
|
+
default: 'px-4 py-6 md:py-8',
|
|
49
|
+
spacious: 'px-4 py-8 md:px-6 md:py-12',
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const backgroundClasses: Record<string, string> = {
|
|
53
|
+
none: '',
|
|
54
|
+
white: 'bg-white dark:bg-gray-900',
|
|
55
|
+
gray: 'bg-gray-50 dark:bg-gray-800',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
let classes = $derived([
|
|
59
|
+
maxWidthClasses[maxWidth],
|
|
60
|
+
paddingClasses[padding],
|
|
61
|
+
backgroundClasses[background],
|
|
62
|
+
center ? 'mx-auto' : '',
|
|
63
|
+
className,
|
|
64
|
+
].filter(Boolean).join(' '));
|
|
65
|
+
</script>
|
|
66
|
+
|
|
67
|
+
<div class={classes} {...restProps}>
|
|
68
|
+
{#if children}{@render children()}{/if}
|
|
69
|
+
</div>
|
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
/**
|
|
3
|
-
* Responsive visibility components
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* <ShowOnMobile>Mobile only content</ShowOnMobile>
|
|
7
|
-
* <ShowOnDesktop>Desktop only content</ShowOnDesktop>
|
|
8
|
-
* <HideOnMobile>Hidden on mobile</HideOnMobile>
|
|
9
|
-
* <HideOnDesktop>Hidden on desktop</HideOnDesktop>
|
|
10
|
-
*/
|
|
11
|
-
</script>
|
|
12
|
-
|
|
13
|
-
<script lang="ts">
|
|
14
|
-
import type { Snippet } from 'svelte';
|
|
15
|
-
|
|
16
|
-
type Breakpoint = 'sm' | 'md' | 'lg' | 'xl';
|
|
17
|
-
type Mode = 'show-mobile' | 'show-desktop' | 'hide-mobile' | 'hide-desktop';
|
|
18
|
-
|
|
19
|
-
interface Props {
|
|
20
|
-
/** Visibility mode */
|
|
21
|
-
mode: Mode;
|
|
22
|
-
/** Breakpoint for mobile/desktop boundary */
|
|
23
|
-
breakpoint?: Breakpoint;
|
|
24
|
-
/** Display type when visible */
|
|
25
|
-
display?: 'block' | 'flex' | 'inline' | 'inline-block' | 'grid';
|
|
26
|
-
/** Additional CSS classes */
|
|
27
|
-
class?: string;
|
|
28
|
-
/** Child content */
|
|
29
|
-
children?: Snippet;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
let {
|
|
33
|
-
mode,
|
|
34
|
-
breakpoint = 'lg',
|
|
35
|
-
display = 'block',
|
|
36
|
-
class: className = '',
|
|
37
|
-
children,
|
|
38
|
-
}: Props = $props();
|
|
39
|
-
|
|
40
|
-
const displayClasses: Record<string, string> = {
|
|
41
|
-
block: 'block',
|
|
42
|
-
flex: 'flex',
|
|
43
|
-
inline: 'inline',
|
|
44
|
-
'inline-block': 'inline-block',
|
|
45
|
-
grid: 'grid',
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// Build responsive classes based on mode and breakpoint
|
|
49
|
-
function getResponsiveClasses(m: Mode, bp: Breakpoint, disp: string): string {
|
|
50
|
-
const dispClass = displayClasses[disp];
|
|
51
|
-
|
|
52
|
-
switch (m) {
|
|
53
|
-
case 'show-mobile':
|
|
54
|
-
// Show on mobile, hide on desktop
|
|
55
|
-
return `${dispClass} ${bp}:hidden`;
|
|
56
|
-
case 'show-desktop':
|
|
57
|
-
// Hide on mobile, show on desktop
|
|
58
|
-
return `hidden ${bp}:${dispClass}`;
|
|
59
|
-
case 'hide-mobile':
|
|
60
|
-
// Hide on mobile, show on desktop
|
|
61
|
-
return `hidden ${bp}:${dispClass}`;
|
|
62
|
-
case 'hide-desktop':
|
|
63
|
-
// Show on mobile, hide on desktop
|
|
64
|
-
return `${dispClass} ${bp}:hidden`;
|
|
65
|
-
default:
|
|
66
|
-
return dispClass;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
let classes = $derived(`${getResponsiveClasses(mode, breakpoint, display)} ${className}`.trim());
|
|
71
|
-
</script>
|
|
72
|
-
|
|
73
|
-
<div class={classes}>
|
|
74
|
-
{#if children}{@render children()}{/if}
|
|
75
|
-
</div>
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
/**
|
|
3
|
+
* Responsive visibility components
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* <ShowOnMobile>Mobile only content</ShowOnMobile>
|
|
7
|
+
* <ShowOnDesktop>Desktop only content</ShowOnDesktop>
|
|
8
|
+
* <HideOnMobile>Hidden on mobile</HideOnMobile>
|
|
9
|
+
* <HideOnDesktop>Hidden on desktop</HideOnDesktop>
|
|
10
|
+
*/
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<script lang="ts">
|
|
14
|
+
import type { Snippet } from 'svelte';
|
|
15
|
+
|
|
16
|
+
type Breakpoint = 'sm' | 'md' | 'lg' | 'xl';
|
|
17
|
+
type Mode = 'show-mobile' | 'show-desktop' | 'hide-mobile' | 'hide-desktop';
|
|
18
|
+
|
|
19
|
+
interface Props {
|
|
20
|
+
/** Visibility mode */
|
|
21
|
+
mode: Mode;
|
|
22
|
+
/** Breakpoint for mobile/desktop boundary */
|
|
23
|
+
breakpoint?: Breakpoint;
|
|
24
|
+
/** Display type when visible */
|
|
25
|
+
display?: 'block' | 'flex' | 'inline' | 'inline-block' | 'grid';
|
|
26
|
+
/** Additional CSS classes */
|
|
27
|
+
class?: string;
|
|
28
|
+
/** Child content */
|
|
29
|
+
children?: Snippet;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let {
|
|
33
|
+
mode,
|
|
34
|
+
breakpoint = 'lg',
|
|
35
|
+
display = 'block',
|
|
36
|
+
class: className = '',
|
|
37
|
+
children,
|
|
38
|
+
}: Props = $props();
|
|
39
|
+
|
|
40
|
+
const displayClasses: Record<string, string> = {
|
|
41
|
+
block: 'block',
|
|
42
|
+
flex: 'flex',
|
|
43
|
+
inline: 'inline',
|
|
44
|
+
'inline-block': 'inline-block',
|
|
45
|
+
grid: 'grid',
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Build responsive classes based on mode and breakpoint
|
|
49
|
+
function getResponsiveClasses(m: Mode, bp: Breakpoint, disp: string): string {
|
|
50
|
+
const dispClass = displayClasses[disp];
|
|
51
|
+
|
|
52
|
+
switch (m) {
|
|
53
|
+
case 'show-mobile':
|
|
54
|
+
// Show on mobile, hide on desktop
|
|
55
|
+
return `${dispClass} ${bp}:hidden`;
|
|
56
|
+
case 'show-desktop':
|
|
57
|
+
// Hide on mobile, show on desktop
|
|
58
|
+
return `hidden ${bp}:${dispClass}`;
|
|
59
|
+
case 'hide-mobile':
|
|
60
|
+
// Hide on mobile, show on desktop
|
|
61
|
+
return `hidden ${bp}:${dispClass}`;
|
|
62
|
+
case 'hide-desktop':
|
|
63
|
+
// Show on mobile, hide on desktop
|
|
64
|
+
return `${dispClass} ${bp}:hidden`;
|
|
65
|
+
default:
|
|
66
|
+
return dispClass;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let classes = $derived(`${getResponsiveClasses(mode, breakpoint, display)} ${className}`.trim());
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<div class={classes}>
|
|
74
|
+
{#if children}{@render children()}{/if}
|
|
75
|
+
</div>
|