@getmicdrop/svelte-components 5.17.3 → 5.17.4
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 +187 -187
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +780 -782
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
- package/dist/calendar/FAQs/FAQs.svelte +77 -77
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +125 -126
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
- package/dist/calendar/OrderSummary/OrderSummary.svelte +457 -457
- package/dist/calendar/PublicCard/PublicCard.svelte +155 -146
- package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowCard/ShowCard.spec.js +1 -7
- package/dist/calendar/ShowCard/ShowCard.svelte +166 -157
- package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +72 -61
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts +2 -0
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
- 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 +4 -4
- 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 +6 -6
- 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.d.ts +102 -0
- package/dist/config.js +147 -1
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/README.md +323 -0
- 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/forms/createFormStore.svelte.spec.js +0 -1
- package/dist/index.js +57 -57
- package/dist/index.spec.js +369 -369
- package/dist/messages.d.ts +43 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +57 -0
- package/dist/patterns/chat/ChatActivityNotice.svelte +41 -41
- package/dist/patterns/chat/ChatBubble.svelte +95 -95
- package/dist/patterns/chat/ChatContainer.svelte +46 -46
- package/dist/patterns/chat/ChatDateDivider.svelte +27 -27
- package/dist/patterns/chat/ChatInvitationBubble.svelte +37 -37
- package/dist/patterns/chat/ChatInvitationNotice.svelte +27 -27
- package/dist/patterns/chat/ChatMessageGroup.svelte +57 -57
- package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -46
- package/dist/patterns/chat/ChatStatusBadge.svelte +91 -91
- package/dist/patterns/chat/ChatStatusTransition.svelte +64 -64
- package/dist/patterns/chat/ChatTextBubble.svelte +41 -41
- package/dist/patterns/chat/index.js +22 -22
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +36 -36
- 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 +83 -83
- package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
- package/dist/patterns/index.js +21 -21
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- 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 +251 -251
- package/dist/patterns/page/PageHeader.svelte +18 -18
- 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 +24 -24
- package/dist/patterns/page/SectionHeader.svelte +29 -29
- 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 +42 -42
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- package/dist/primitives/Alert/Alert.spec.js +173 -173
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +27 -27
- package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/AvatarButton/AvatarButton.svelte +57 -57
- 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 +238 -238
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +115 -115
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -123
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +99 -99
- package/dist/primitives/Button/Button.spec.js +225 -225
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +278 -278
- 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/CardAction/CardAction.svelte +68 -68
- 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 +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +224 -224
- 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 +8 -8
- package/dist/primitives/Icons/ArrowRight.svelte +8 -8
- package/dist/primitives/Icons/Availability.svelte +14 -14
- package/dist/primitives/Icons/Back.svelte +14 -14
- package/dist/primitives/Icons/CheckCircle.svelte +6 -6
- package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
- package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
- package/dist/primitives/Icons/ChevronRight.svelte +4 -4
- package/dist/primitives/Icons/Copy.svelte +15 -15
- package/dist/primitives/Icons/Cross.svelte +5 -5
- package/dist/primitives/Icons/DownArrow.svelte +8 -8
- package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
- package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
- package/dist/primitives/Icons/Home.svelte +15 -15
- package/dist/primitives/Icons/Icon.spec.js +169 -169
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +52 -52
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/Info.svelte +7 -7
- package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
- package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
- package/dist/primitives/Icons/Message.svelte +15 -15
- package/dist/primitives/Icons/MoonIcon.svelte +5 -5
- package/dist/primitives/Icons/More.svelte +21 -21
- package/dist/primitives/Icons/MoreHori.spec.js +61 -61
- package/dist/primitives/Icons/MoreHori.svelte +22 -22
- package/dist/primitives/Icons/Notification.svelte +14 -14
- package/dist/primitives/Icons/Payment.svelte +14 -14
- package/dist/primitives/Icons/Profile.svelte +21 -21
- package/dist/primitives/Icons/Reload.svelte +29 -29
- package/dist/primitives/Icons/Shows.svelte +21 -21
- package/dist/primitives/Icons/Signout.svelte +21 -21
- package/dist/primitives/Icons/SunIcon.svelte +8 -8
- package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
- package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
- package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
- package/dist/primitives/Icons/WarningIcon.svelte +5 -5
- package/dist/primitives/Input/Input.spec.js +1237 -1235
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +431 -423
- package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
- package/dist/primitives/Input/Select.spec.js +632 -632
- 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/LandingButton/LandingButton.svelte +92 -92
- package/dist/primitives/MenuItem/MenuItem.svelte +85 -85
- package/dist/primitives/Modal/Modal.spec.js +314 -314
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +181 -181
- package/dist/primitives/NavItem/NavItem.svelte +75 -75
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +261 -261
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/SearchResultItem/SearchResultItem.svelte +109 -109
- package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -55
- 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 +26 -26
- package/dist/primitives/Spinner/Spinner.spec.js +84 -84
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +20 -20
- package/dist/primitives/Tabs/TabItem.svelte +49 -49
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +137 -137
- package/dist/primitives/Toggle.spec.js +221 -221
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +141 -141
- 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 +69 -69
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.js +113 -113
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +241 -241
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +992 -992
- package/dist/recipes/SuperLogin/SuperLogin.spec.js +2 -2
- package/dist/recipes/SuperLogin/SuperLogin.svelte +1 -1
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
- package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
- 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 +97 -97
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/inputs/MultiSelect.spec.js +263 -263
- 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 +22 -22
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +131 -131
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +336 -336
- package/dist/recipes/inputs/Search.svelte +102 -102
- package/dist/recipes/inputs/index.js +7 -7
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +396 -396
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +162 -162
- 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/schemas/__tests__/auth.test.d.ts +2 -0
- package/dist/schemas/__tests__/auth.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/auth.test.js +210 -0
- package/dist/schemas/__tests__/common.test.d.ts +2 -0
- package/dist/schemas/__tests__/common.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/common.test.js +340 -0
- package/dist/schemas/__tests__/domain.test.d.ts +2 -0
- package/dist/schemas/__tests__/domain.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/domain.test.js +293 -0
- package/dist/schemas/__tests__/order.test.d.ts +2 -0
- package/dist/schemas/__tests__/order.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/order.test.js +349 -0
- package/dist/schemas/__tests__/user.test.d.ts +2 -0
- package/dist/schemas/__tests__/user.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/user.test.js +325 -0
- package/dist/schemas/auth.d.ts +41 -0
- package/dist/schemas/auth.d.ts.map +1 -0
- package/dist/schemas/auth.js +69 -0
- package/dist/schemas/common.d.ts +43 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +157 -0
- package/dist/schemas/event.d.ts +82 -0
- package/dist/schemas/event.d.ts.map +1 -0
- package/dist/schemas/event.js +58 -0
- package/dist/schemas/index.d.ts +10 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +9 -0
- package/dist/schemas/order.d.ts +111 -0
- package/dist/schemas/order.d.ts.map +1 -0
- package/dist/schemas/order.js +73 -0
- package/dist/schemas/performer.d.ts +133 -0
- package/dist/schemas/performer.d.ts.map +1 -0
- package/dist/schemas/performer.js +73 -0
- package/dist/schemas/promo.d.ts +87 -0
- package/dist/schemas/promo.d.ts.map +1 -0
- package/dist/schemas/promo.js +98 -0
- package/dist/schemas/ticket.d.ts +104 -0
- package/dist/schemas/ticket.d.ts.map +1 -0
- package/dist/schemas/ticket.js +82 -0
- package/dist/schemas/user.d.ts +92 -0
- package/dist/schemas/user.d.ts.map +1 -0
- package/dist/schemas/user.js +53 -0
- package/dist/schemas/venue.d.ts +95 -0
- package/dist/schemas/venue.d.ts.map +1 -0
- package/dist/schemas/venue.js +52 -0
- package/dist/services/EventService.js +79 -79
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.js +144 -144
- package/dist/services/ShowService.spec.js +345 -345
- package/dist/stores/auth.svelte.spec.js +1 -1
- package/dist/stores/toaster.js +13 -13
- package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
- package/dist/stories/ButtonAuditReview.svelte +427 -427
- package/dist/stories/PatternsGallery.stories.svelte +19 -19
- package/dist/stories/PatternsGallery.svelte +206 -206
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +756 -756
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +454 -454
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.js +402 -402
- package/dist/telemetry.server.js +212 -212
- package/dist/telemetry.server.spec.js +437 -437
- package/dist/telemetry.spec.js +1173 -1168
- package/dist/tokens/__tests__/sizing.test.js +2 -2
- package/dist/tokens/sizing.d.ts +5 -0
- package/dist/tokens/sizing.d.ts.map +1 -1
- package/dist/tokens/sizing.js +6 -0
- 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/apiConfig.js +117 -117
- package/dist/utils/apiConfig.spec.js +219 -219
- package/dist/utils/greetings.js +187 -187
- package/dist/utils/haptic.spec.js +1 -1
- package/dist/utils/imageValidation.js +121 -121
- package/dist/utils/transitions.js +4 -4
- package/dist/utils/utils.js +693 -693
- package/package.json +292 -292
|
@@ -1,141 +1,141 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
/**
|
|
3
|
-
* Toggle Component - Flowbite Native
|
|
4
|
-
* Migrated to Svelte 5 runes
|
|
5
|
-
*
|
|
6
|
-
* Note: Uses CSS style block for pseudo-element styling instead of Tailwind
|
|
7
|
-
* after: classes, because Tailwind v4 doesn't generate after: classes from
|
|
8
|
-
* node_modules when this component is consumed by other apps.
|
|
9
|
-
*
|
|
10
|
-
* Haptic Feedback:
|
|
11
|
-
* - Selection haptic on state change (very light, tactile confirmation)
|
|
12
|
-
*/
|
|
13
|
-
import { triggerHaptic } from '../utils/haptic.js';
|
|
14
|
-
|
|
15
|
-
/** @type {{
|
|
16
|
-
checked?: boolean,
|
|
17
|
-
disabled?: boolean,
|
|
18
|
-
size?: 'sm' | 'md' | 'lg',
|
|
19
|
-
haptic?: boolean,
|
|
20
|
-
class?: string,
|
|
21
|
-
onchange?: (detail: { checked: boolean }) => void,
|
|
22
|
-
children?: import('svelte').Snippet,
|
|
23
|
-
}} */
|
|
24
|
-
let {
|
|
25
|
-
checked = $bindable(false),
|
|
26
|
-
disabled = false,
|
|
27
|
-
size = 'md',
|
|
28
|
-
haptic = true,
|
|
29
|
-
class: className = '',
|
|
30
|
-
onchange,
|
|
31
|
-
children,
|
|
32
|
-
...restProps
|
|
33
|
-
} = $props();
|
|
34
|
-
|
|
35
|
-
function handleChange(event) {
|
|
36
|
-
checked = event.target.checked;
|
|
37
|
-
// Haptic feedback on toggle change (QOL Bible)
|
|
38
|
-
if (haptic && !disabled) {
|
|
39
|
-
triggerHaptic('selection');
|
|
40
|
-
}
|
|
41
|
-
onchange?.({ checked });
|
|
42
|
-
}
|
|
43
|
-
</script>
|
|
44
|
-
|
|
45
|
-
<label class="inline-flex items-center {disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'} {className}" {...restProps}>
|
|
46
|
-
<input
|
|
47
|
-
type="checkbox"
|
|
48
|
-
bind:checked
|
|
49
|
-
{disabled}
|
|
50
|
-
onchange={handleChange}
|
|
51
|
-
class="sr-only peer"
|
|
52
|
-
/>
|
|
53
|
-
<div
|
|
54
|
-
class="toggle-track toggle-{size} relative bg-gray-200 peer-focus:outline-hidden peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:bg-blue-600"
|
|
55
|
-
role="switch"
|
|
56
|
-
aria-checked={checked}
|
|
57
|
-
></div>
|
|
58
|
-
{#if children}
|
|
59
|
-
<span class="ms-3 text-sm font-medium text-gray-900 dark:text-gray-300">
|
|
60
|
-
{#if typeof children === 'function'}{@render children()}{:else}{children}{/if}
|
|
61
|
-
</span>
|
|
62
|
-
{/if}
|
|
63
|
-
</label>
|
|
64
|
-
|
|
65
|
-
<style>
|
|
66
|
-
/*
|
|
67
|
-
* Toggle track sizes (replaces Tailwind w-* h-* classes)
|
|
68
|
-
* Using CSS instead of Tailwind because these need to work in consuming apps
|
|
69
|
-
*/
|
|
70
|
-
.toggle-sm {
|
|
71
|
-
width: 2.25rem; /* w-9 = 36px */
|
|
72
|
-
height: 1.25rem; /* h-5 = 20px */
|
|
73
|
-
}
|
|
74
|
-
.toggle-md {
|
|
75
|
-
width: 2.75rem; /* w-11 = 44px */
|
|
76
|
-
height: 1.5rem; /* h-6 = 24px */
|
|
77
|
-
}
|
|
78
|
-
.toggle-lg {
|
|
79
|
-
width: 3.5rem; /* w-14 = 56px */
|
|
80
|
-
height: 1.75rem; /* h-7 = 28px */
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/*
|
|
84
|
-
* Toggle thumb (the white circle) - uses ::after pseudo-element
|
|
85
|
-
* Tailwind v4 doesn't generate after: classes from node_modules,
|
|
86
|
-
* so we use explicit CSS here.
|
|
87
|
-
*/
|
|
88
|
-
.toggle-track::after {
|
|
89
|
-
content: '';
|
|
90
|
-
position: absolute;
|
|
91
|
-
background-color: white;
|
|
92
|
-
border: 1px solid #d1d5db; /* gray-300 */
|
|
93
|
-
border-radius: 9999px;
|
|
94
|
-
transition: all 150ms;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/* Thumb sizes for each toggle size */
|
|
98
|
-
.toggle-sm::after {
|
|
99
|
-
width: 1rem; /* 16px */
|
|
100
|
-
height: 1rem;
|
|
101
|
-
top: 0.125rem; /* 2px */
|
|
102
|
-
inset-inline-start: 0.125rem;
|
|
103
|
-
}
|
|
104
|
-
.toggle-md::after {
|
|
105
|
-
width: 1.25rem; /* 20px */
|
|
106
|
-
height: 1.25rem;
|
|
107
|
-
top: 0.125rem;
|
|
108
|
-
inset-inline-start: 0.125rem;
|
|
109
|
-
}
|
|
110
|
-
.toggle-lg::after {
|
|
111
|
-
width: 1.5rem; /* 24px */
|
|
112
|
-
height: 1.5rem;
|
|
113
|
-
top: 0.125rem;
|
|
114
|
-
inset-inline-start: 0.125rem;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/* Checked state - move thumb to the right */
|
|
118
|
-
:global(input.peer:checked) + .toggle-sm::after {
|
|
119
|
-
transform: translateX(1rem); /* 16px */
|
|
120
|
-
border-color: white;
|
|
121
|
-
}
|
|
122
|
-
:global(input.peer:checked) + .toggle-md::after {
|
|
123
|
-
transform: translateX(1.25rem); /* 20px */
|
|
124
|
-
border-color: white;
|
|
125
|
-
}
|
|
126
|
-
:global(input.peer:checked) + .toggle-lg::after {
|
|
127
|
-
transform: translateX(1.5rem); /* 24px */
|
|
128
|
-
border-color: white;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/* RTL support - translate in opposite direction */
|
|
132
|
-
:global([dir="rtl"]) :global(input.peer:checked) + .toggle-sm::after {
|
|
133
|
-
transform: translateX(-1rem);
|
|
134
|
-
}
|
|
135
|
-
:global([dir="rtl"]) :global(input.peer:checked) + .toggle-md::after {
|
|
136
|
-
transform: translateX(-1.25rem);
|
|
137
|
-
}
|
|
138
|
-
:global([dir="rtl"]) :global(input.peer:checked) + .toggle-lg::after {
|
|
139
|
-
transform: translateX(-1.5rem);
|
|
140
|
-
}
|
|
141
|
-
</style>
|
|
1
|
+
<script>
|
|
2
|
+
/**
|
|
3
|
+
* Toggle Component - Flowbite Native
|
|
4
|
+
* Migrated to Svelte 5 runes
|
|
5
|
+
*
|
|
6
|
+
* Note: Uses CSS style block for pseudo-element styling instead of Tailwind
|
|
7
|
+
* after: classes, because Tailwind v4 doesn't generate after: classes from
|
|
8
|
+
* node_modules when this component is consumed by other apps.
|
|
9
|
+
*
|
|
10
|
+
* Haptic Feedback:
|
|
11
|
+
* - Selection haptic on state change (very light, tactile confirmation)
|
|
12
|
+
*/
|
|
13
|
+
import { triggerHaptic } from '../utils/haptic.js';
|
|
14
|
+
|
|
15
|
+
/** @type {{
|
|
16
|
+
checked?: boolean,
|
|
17
|
+
disabled?: boolean,
|
|
18
|
+
size?: 'sm' | 'md' | 'lg',
|
|
19
|
+
haptic?: boolean,
|
|
20
|
+
class?: string,
|
|
21
|
+
onchange?: (detail: { checked: boolean }) => void,
|
|
22
|
+
children?: import('svelte').Snippet,
|
|
23
|
+
}} */
|
|
24
|
+
let {
|
|
25
|
+
checked = $bindable(false),
|
|
26
|
+
disabled = false,
|
|
27
|
+
size = 'md',
|
|
28
|
+
haptic = true,
|
|
29
|
+
class: className = '',
|
|
30
|
+
onchange,
|
|
31
|
+
children,
|
|
32
|
+
...restProps
|
|
33
|
+
} = $props();
|
|
34
|
+
|
|
35
|
+
function handleChange(event) {
|
|
36
|
+
checked = event.target.checked;
|
|
37
|
+
// Haptic feedback on toggle change (QOL Bible)
|
|
38
|
+
if (haptic && !disabled) {
|
|
39
|
+
triggerHaptic('selection');
|
|
40
|
+
}
|
|
41
|
+
onchange?.({ checked });
|
|
42
|
+
}
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<label class="inline-flex items-center {disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'} {className}" {...restProps}>
|
|
46
|
+
<input
|
|
47
|
+
type="checkbox"
|
|
48
|
+
bind:checked
|
|
49
|
+
{disabled}
|
|
50
|
+
onchange={handleChange}
|
|
51
|
+
class="sr-only peer"
|
|
52
|
+
/>
|
|
53
|
+
<div
|
|
54
|
+
class="toggle-track toggle-{size} relative bg-gray-200 peer-focus:outline-hidden peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:bg-blue-600"
|
|
55
|
+
role="switch"
|
|
56
|
+
aria-checked={checked}
|
|
57
|
+
></div>
|
|
58
|
+
{#if children}
|
|
59
|
+
<span class="ms-3 text-sm font-medium text-gray-900 dark:text-gray-300">
|
|
60
|
+
{#if typeof children === 'function'}{@render children()}{:else}{children}{/if}
|
|
61
|
+
</span>
|
|
62
|
+
{/if}
|
|
63
|
+
</label>
|
|
64
|
+
|
|
65
|
+
<style>
|
|
66
|
+
/*
|
|
67
|
+
* Toggle track sizes (replaces Tailwind w-* h-* classes)
|
|
68
|
+
* Using CSS instead of Tailwind because these need to work in consuming apps
|
|
69
|
+
*/
|
|
70
|
+
.toggle-sm {
|
|
71
|
+
width: 2.25rem; /* w-9 = 36px */
|
|
72
|
+
height: 1.25rem; /* h-5 = 20px */
|
|
73
|
+
}
|
|
74
|
+
.toggle-md {
|
|
75
|
+
width: 2.75rem; /* w-11 = 44px */
|
|
76
|
+
height: 1.5rem; /* h-6 = 24px */
|
|
77
|
+
}
|
|
78
|
+
.toggle-lg {
|
|
79
|
+
width: 3.5rem; /* w-14 = 56px */
|
|
80
|
+
height: 1.75rem; /* h-7 = 28px */
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/*
|
|
84
|
+
* Toggle thumb (the white circle) - uses ::after pseudo-element
|
|
85
|
+
* Tailwind v4 doesn't generate after: classes from node_modules,
|
|
86
|
+
* so we use explicit CSS here.
|
|
87
|
+
*/
|
|
88
|
+
.toggle-track::after {
|
|
89
|
+
content: '';
|
|
90
|
+
position: absolute;
|
|
91
|
+
background-color: white;
|
|
92
|
+
border: 1px solid #d1d5db; /* gray-300 */
|
|
93
|
+
border-radius: 9999px;
|
|
94
|
+
transition: all 150ms;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Thumb sizes for each toggle size */
|
|
98
|
+
.toggle-sm::after {
|
|
99
|
+
width: 1rem; /* 16px */
|
|
100
|
+
height: 1rem;
|
|
101
|
+
top: 0.125rem; /* 2px */
|
|
102
|
+
inset-inline-start: 0.125rem;
|
|
103
|
+
}
|
|
104
|
+
.toggle-md::after {
|
|
105
|
+
width: 1.25rem; /* 20px */
|
|
106
|
+
height: 1.25rem;
|
|
107
|
+
top: 0.125rem;
|
|
108
|
+
inset-inline-start: 0.125rem;
|
|
109
|
+
}
|
|
110
|
+
.toggle-lg::after {
|
|
111
|
+
width: 1.5rem; /* 24px */
|
|
112
|
+
height: 1.5rem;
|
|
113
|
+
top: 0.125rem;
|
|
114
|
+
inset-inline-start: 0.125rem;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Checked state - move thumb to the right */
|
|
118
|
+
:global(input.peer:checked) + .toggle-sm::after {
|
|
119
|
+
transform: translateX(1rem); /* 16px */
|
|
120
|
+
border-color: white;
|
|
121
|
+
}
|
|
122
|
+
:global(input.peer:checked) + .toggle-md::after {
|
|
123
|
+
transform: translateX(1.25rem); /* 20px */
|
|
124
|
+
border-color: white;
|
|
125
|
+
}
|
|
126
|
+
:global(input.peer:checked) + .toggle-lg::after {
|
|
127
|
+
transform: translateX(1.5rem); /* 24px */
|
|
128
|
+
border-color: white;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* RTL support - translate in opposite direction */
|
|
132
|
+
:global([dir="rtl"]) :global(input.peer:checked) + .toggle-sm::after {
|
|
133
|
+
transform: translateX(-1rem);
|
|
134
|
+
}
|
|
135
|
+
:global([dir="rtl"]) :global(input.peer:checked) + .toggle-md::after {
|
|
136
|
+
transform: translateX(-1.25rem);
|
|
137
|
+
}
|
|
138
|
+
:global([dir="rtl"]) :global(input.peer:checked) + .toggle-lg::after {
|
|
139
|
+
transform: translateX(-1.5rem);
|
|
140
|
+
}
|
|
141
|
+
</style>
|
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* Tooltip Component - Native implementation
|
|
4
|
-
*
|
|
5
|
-
* Displays a tooltip on hover/focus with configurable placement
|
|
6
|
-
*/
|
|
7
|
-
import { fly } from 'svelte/transition';
|
|
8
|
-
import type { Snippet } from 'svelte';
|
|
9
|
-
|
|
10
|
-
interface Props {
|
|
11
|
-
/** Tooltip content text */
|
|
12
|
-
content: string;
|
|
13
|
-
/** Placement relative to trigger */
|
|
14
|
-
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
15
|
-
/** Additional CSS classes for the tooltip */
|
|
16
|
-
class?: string;
|
|
17
|
-
/** Child content (trigger element) */
|
|
18
|
-
children?: Snippet;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let {
|
|
22
|
-
content,
|
|
23
|
-
placement = 'top',
|
|
24
|
-
class: className = '',
|
|
25
|
-
children
|
|
26
|
-
}: Props = $props();
|
|
27
|
-
|
|
28
|
-
let visible = $state(false);
|
|
29
|
-
|
|
30
|
-
// Placement-specific classes
|
|
31
|
-
const placementClasses: Record<string, string> = {
|
|
32
|
-
top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',
|
|
33
|
-
bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',
|
|
34
|
-
left: 'right-full top-1/2 -translate-y-1/2 mr-2',
|
|
35
|
-
right: 'left-full top-1/2 -translate-y-1/2 ml-2'
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// Arrow placement classes
|
|
39
|
-
const arrowClasses: Record<string, string> = {
|
|
40
|
-
top: 'top-full left-1/2 -translate-x-1/2 border-t-gray-900 dark:border-t-gray-700 border-l-transparent border-r-transparent border-b-transparent',
|
|
41
|
-
bottom: 'bottom-full left-1/2 -translate-x-1/2 border-b-gray-900 dark:border-b-gray-700 border-l-transparent border-r-transparent border-t-transparent',
|
|
42
|
-
left: 'left-full top-1/2 -translate-y-1/2 border-l-gray-900 dark:border-l-gray-700 border-t-transparent border-b-transparent border-r-transparent',
|
|
43
|
-
right: 'right-full top-1/2 -translate-y-1/2 border-r-gray-900 dark:border-r-gray-700 border-t-transparent border-b-transparent border-l-transparent'
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
function handleMouseEnter() {
|
|
47
|
-
visible = true;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function handleMouseLeave() {
|
|
51
|
-
visible = false;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function handleFocus() {
|
|
55
|
-
visible = true;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function handleBlur() {
|
|
59
|
-
visible = false;
|
|
60
|
-
}
|
|
61
|
-
</script>
|
|
62
|
-
|
|
63
|
-
<div
|
|
64
|
-
class="relative inline-block"
|
|
65
|
-
onmouseenter={handleMouseEnter}
|
|
66
|
-
onmouseleave={handleMouseLeave}
|
|
67
|
-
onfocus={handleFocus}
|
|
68
|
-
onblur={handleBlur}
|
|
69
|
-
role="tooltip"
|
|
70
|
-
>
|
|
71
|
-
{#if children}{@render children()}{/if}
|
|
72
|
-
|
|
73
|
-
{#if visible && content}
|
|
74
|
-
<div
|
|
75
|
-
class="absolute z-50 px-3 py-2 text-sm text-white bg-gray-900 rounded-lg shadow whitespace-nowrap pointer-events-none dark:bg-gray-700 {placementClasses[placement]} {className}"
|
|
76
|
-
transition:fly={{ y: placement === 'top' ? 5 : placement === 'bottom' ? -5 : 0, x: placement === 'left' ? 5 : placement === 'right' ? -5 : 0, duration: 150 }}
|
|
77
|
-
>
|
|
78
|
-
{content}
|
|
79
|
-
<!-- Arrow -->
|
|
80
|
-
<div class="absolute w-0 h-0 border-4 {arrowClasses[placement]}"></div>
|
|
81
|
-
</div>
|
|
82
|
-
{/if}
|
|
83
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Tooltip Component - Native implementation
|
|
4
|
+
*
|
|
5
|
+
* Displays a tooltip on hover/focus with configurable placement
|
|
6
|
+
*/
|
|
7
|
+
import { fly } from 'svelte/transition';
|
|
8
|
+
import type { Snippet } from 'svelte';
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
/** Tooltip content text */
|
|
12
|
+
content: string;
|
|
13
|
+
/** Placement relative to trigger */
|
|
14
|
+
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
15
|
+
/** Additional CSS classes for the tooltip */
|
|
16
|
+
class?: string;
|
|
17
|
+
/** Child content (trigger element) */
|
|
18
|
+
children?: Snippet;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
content,
|
|
23
|
+
placement = 'top',
|
|
24
|
+
class: className = '',
|
|
25
|
+
children
|
|
26
|
+
}: Props = $props();
|
|
27
|
+
|
|
28
|
+
let visible = $state(false);
|
|
29
|
+
|
|
30
|
+
// Placement-specific classes
|
|
31
|
+
const placementClasses: Record<string, string> = {
|
|
32
|
+
top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',
|
|
33
|
+
bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',
|
|
34
|
+
left: 'right-full top-1/2 -translate-y-1/2 mr-2',
|
|
35
|
+
right: 'left-full top-1/2 -translate-y-1/2 ml-2'
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Arrow placement classes
|
|
39
|
+
const arrowClasses: Record<string, string> = {
|
|
40
|
+
top: 'top-full left-1/2 -translate-x-1/2 border-t-gray-900 dark:border-t-gray-700 border-l-transparent border-r-transparent border-b-transparent',
|
|
41
|
+
bottom: 'bottom-full left-1/2 -translate-x-1/2 border-b-gray-900 dark:border-b-gray-700 border-l-transparent border-r-transparent border-t-transparent',
|
|
42
|
+
left: 'left-full top-1/2 -translate-y-1/2 border-l-gray-900 dark:border-l-gray-700 border-t-transparent border-b-transparent border-r-transparent',
|
|
43
|
+
right: 'right-full top-1/2 -translate-y-1/2 border-r-gray-900 dark:border-r-gray-700 border-t-transparent border-b-transparent border-l-transparent'
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
function handleMouseEnter() {
|
|
47
|
+
visible = true;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function handleMouseLeave() {
|
|
51
|
+
visible = false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function handleFocus() {
|
|
55
|
+
visible = true;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function handleBlur() {
|
|
59
|
+
visible = false;
|
|
60
|
+
}
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<div
|
|
64
|
+
class="relative inline-block"
|
|
65
|
+
onmouseenter={handleMouseEnter}
|
|
66
|
+
onmouseleave={handleMouseLeave}
|
|
67
|
+
onfocus={handleFocus}
|
|
68
|
+
onblur={handleBlur}
|
|
69
|
+
role="tooltip"
|
|
70
|
+
>
|
|
71
|
+
{#if children}{@render children()}{/if}
|
|
72
|
+
|
|
73
|
+
{#if visible && content}
|
|
74
|
+
<div
|
|
75
|
+
class="absolute z-50 px-3 py-2 text-sm text-white bg-gray-900 rounded-lg shadow whitespace-nowrap pointer-events-none dark:bg-gray-700 {placementClasses[placement]} {className}"
|
|
76
|
+
transition:fly={{ y: placement === 'top' ? 5 : placement === 'bottom' ? -5 : 0, x: placement === 'left' ? 5 : placement === 'right' ? -5 : 0, duration: 150 }}
|
|
77
|
+
>
|
|
78
|
+
{content}
|
|
79
|
+
<!-- Arrow -->
|
|
80
|
+
<div class="absolute w-0 h-0 border-4 {arrowClasses[placement]}"></div>
|
|
81
|
+
</div>
|
|
82
|
+
{/if}
|
|
83
|
+
</div>
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
-
|
|
5
|
-
interface Props extends HTMLAttributes<HTMLElement> {
|
|
6
|
-
/** The semantic element to render */
|
|
7
|
-
variant?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p';
|
|
8
|
-
/** Font weight variant */
|
|
9
|
-
weight?: 'bold' | 'semibold' | 'medium' | 'regular';
|
|
10
|
-
/** Additional CSS classes */
|
|
11
|
-
class?: string;
|
|
12
|
-
/** Text content (alternative to children) */
|
|
13
|
-
text?: string;
|
|
14
|
-
/** Child content */
|
|
15
|
-
children?: Snippet;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
let {
|
|
19
|
-
variant = 'p',
|
|
20
|
-
weight = 'regular',
|
|
21
|
-
class: className = '',
|
|
22
|
-
text = '',
|
|
23
|
-
children,
|
|
24
|
-
...restProps
|
|
25
|
-
}: Props = $props();
|
|
26
|
-
|
|
27
|
-
const sizeMap: Record<string, string> = {
|
|
28
|
-
h1: 'text-3xl',
|
|
29
|
-
h2: 'text-2xl',
|
|
30
|
-
h3: 'text-xl',
|
|
31
|
-
h4: 'text-lg',
|
|
32
|
-
h5: 'text-base',
|
|
33
|
-
h6: 'text-xs',
|
|
34
|
-
p: 'text-sm',
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const weightMap: Record<string, string> = {
|
|
38
|
-
bold: 'font-bold',
|
|
39
|
-
semibold: 'font-semibold',
|
|
40
|
-
medium: 'font-medium',
|
|
41
|
-
regular: 'font-normal',
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
let computedClass = $derived(`${sizeMap[variant]} ${weightMap[weight]} ${className}`.trim());
|
|
45
|
-
</script>
|
|
46
|
-
|
|
47
|
-
<svelte:element this={variant} class={computedClass} {...restProps}>
|
|
48
|
-
{#if text}
|
|
49
|
-
{text}
|
|
50
|
-
{:else}
|
|
51
|
-
{@render children?.()}
|
|
52
|
-
{/if}
|
|
53
|
-
</svelte:element>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
|
|
5
|
+
interface Props extends HTMLAttributes<HTMLElement> {
|
|
6
|
+
/** The semantic element to render */
|
|
7
|
+
variant?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p';
|
|
8
|
+
/** Font weight variant */
|
|
9
|
+
weight?: 'bold' | 'semibold' | 'medium' | 'regular';
|
|
10
|
+
/** Additional CSS classes */
|
|
11
|
+
class?: string;
|
|
12
|
+
/** Text content (alternative to children) */
|
|
13
|
+
text?: string;
|
|
14
|
+
/** Child content */
|
|
15
|
+
children?: Snippet;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
variant = 'p',
|
|
20
|
+
weight = 'regular',
|
|
21
|
+
class: className = '',
|
|
22
|
+
text = '',
|
|
23
|
+
children,
|
|
24
|
+
...restProps
|
|
25
|
+
}: Props = $props();
|
|
26
|
+
|
|
27
|
+
const sizeMap: Record<string, string> = {
|
|
28
|
+
h1: 'text-3xl',
|
|
29
|
+
h2: 'text-2xl',
|
|
30
|
+
h3: 'text-xl',
|
|
31
|
+
h4: 'text-lg',
|
|
32
|
+
h5: 'text-base',
|
|
33
|
+
h6: 'text-xs',
|
|
34
|
+
p: 'text-sm',
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const weightMap: Record<string, string> = {
|
|
38
|
+
bold: 'font-bold',
|
|
39
|
+
semibold: 'font-semibold',
|
|
40
|
+
medium: 'font-medium',
|
|
41
|
+
regular: 'font-normal',
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
let computedClass = $derived(`${sizeMap[variant]} ${weightMap[weight]} ${className}`.trim());
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<svelte:element this={variant} class={computedClass} {...restProps}>
|
|
48
|
+
{#if text}
|
|
49
|
+
{text}
|
|
50
|
+
{:else}
|
|
51
|
+
{@render children?.()}
|
|
52
|
+
{/if}
|
|
53
|
+
</svelte:element>
|