astro-component-kit 0.0.1 → 0.1.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/README.md +218 -119
- package/package.json +28 -55
- package/src/components/index.ts +207 -0
- package/src/components/lib/AnimatedGalaxy.astro +185 -0
- package/src/components/lib/Galaxy3D.astro +308 -0
- package/src/components/lib/GlassNavbar.astro +13 -11
- package/src/components/lib/LogoWithGalaxy.astro +63 -0
- package/src/components/lib/buttons/3dPushButton.astro +9 -0
- package/src/components/lib/buttons/AnimatedIconButton.astro +10 -0
- package/src/components/lib/buttons/BorderDrawButton.astro +9 -0
- package/src/components/lib/buttons/CyberpunkButton.astro +10 -0
- package/src/components/lib/buttons/DoubleBorderButton.astro +9 -0
- package/src/components/lib/buttons/GhostOutlineButton.astro +10 -0
- package/src/components/lib/buttons/GlassButton.astro +13 -32
- package/src/components/lib/buttons/GlowButton.astro +9 -0
- package/src/components/lib/buttons/LiquidButton.astro +9 -0
- package/src/components/lib/buttons/LoadingButton.astro +10 -0
- package/src/components/lib/buttons/MagneticButton.astro +10 -0
- package/src/components/lib/buttons/MinimalPillButton.astro +9 -0
- package/src/components/lib/buttons/NeumorphicButton.astro +10 -0
- package/src/components/lib/buttons/PulseButton.astro +10 -0
- package/src/components/lib/buttons/RetroArcadeButton.astro +9 -0
- package/src/components/lib/buttons/RetroShadowButton.astro +9 -0
- package/src/components/lib/buttons/ShimmerButton.astro +9 -0
- package/src/components/lib/buttons/ShinyButton.astro +9 -0
- package/src/components/lib/buttons/TiltGlowButton.astro +10 -0
- package/src/components/lib/cards/BlogHorizontalCard.astro +46 -13
- package/src/components/lib/cards/CyberFeatureCard.astro +50 -6
- package/src/components/lib/cards/EcommerceProductCard.astro +69 -16
- package/src/components/lib/cards/GlassCard.astro +8 -0
- package/src/components/lib/cards/GlassEventCard.astro +53 -12
- package/src/components/lib/cards/GlowPortfolioCard.astro +46 -9
- package/src/components/lib/cards/InteractiveTiltCard.astro +47 -7
- package/src/components/lib/cards/KanbanItemCard.astro +40 -9
- package/src/components/lib/cards/MinimalLinkCard.astro +37 -7
- package/src/components/lib/cards/MusicPlayerMini.astro +54 -14
- package/src/components/lib/cards/NeumorphicCard.astro +32 -2
- package/src/components/lib/cards/NotificationCard.astro +44 -9
- package/src/components/lib/cards/PricingCard.astro +47 -9
- package/src/components/lib/cards/ProfileCard.astro +50 -11
- package/src/components/lib/cards/RetroGameCard.astro +37 -9
- package/src/components/lib/cards/StatCard.astro +43 -8
- package/src/components/lib/cards/TaskKanbanCard.astro +50 -11
- package/src/components/lib/cards/TestimonialCardClean.astro +43 -12
- package/src/components/lib/cards/WeatherWidgetCard.astro +36 -10
- package/src/components/lib/feedback/AnimatedCheckmark.astro +58 -9
- package/src/components/lib/feedback/Badge.astro +47 -12
- package/src/components/lib/feedback/CircleProgress.astro +56 -13
- package/src/components/lib/feedback/ConfettiFeedback.astro +74 -11
- package/src/components/lib/feedback/CyberGlitchAlert.astro +69 -6
- package/src/components/lib/feedback/EmptyStateCard.astro +55 -7
- package/src/components/lib/feedback/GlassAlert.astro +59 -13
- package/src/components/lib/feedback/GlassModal.astro +99 -14
- package/src/components/lib/feedback/GlassProgress.astro +39 -5
- package/src/components/lib/feedback/IndicatorBadgeMinimal.astro +56 -3
- package/src/components/lib/feedback/NeonSpinner.astro +40 -3
- package/src/components/lib/feedback/PulseDot.astro +51 -7
- package/src/components/lib/feedback/RatingPill.astro +38 -8
- package/src/components/lib/feedback/ShakeErrorGroup.astro +44 -3
- package/src/components/lib/feedback/SimpleTooltip.astro +53 -4
- package/src/components/lib/feedback/SkeletonList.astro +59 -13
- package/src/components/lib/feedback/Spotlight.astro +49 -4
- package/src/components/lib/feedback/StepProgress.astro +96 -9
- package/src/components/lib/feedback/ToastNotif.astro +60 -6
- package/src/components/lib/feedback/TypingIndicator.astro +52 -7
- package/src/components/lib/forms/AnimatedInput.astro +47 -5
- package/src/components/lib/forms/ChipInput.astro +116 -8
- package/src/components/lib/forms/ColorPickerInput.astro +53 -6
- package/src/components/lib/forms/CurrencyInput.astro +59 -6
- package/src/components/lib/forms/CustomRadioGroup.astro +61 -9
- package/src/components/lib/forms/CyberpunkCheckbox.astro +64 -8
- package/src/components/lib/forms/DragDropUpload.astro +87 -7
- package/src/components/lib/forms/ErrorInput.astro +31 -4
- package/src/components/lib/forms/FloatingPassword.astro +48 -10
- package/src/components/lib/forms/FormGroupVertical.astro +63 -9
- package/src/components/lib/forms/GlassSlider.astro +84 -3
- package/src/components/lib/forms/GlassTextarea.astro +39 -6
- package/src/components/lib/forms/ModernSelect.astro +66 -10
- package/src/components/lib/forms/NeumorphicSwitch.astro +54 -26
- package/src/components/lib/forms/OTPInput.astro +84 -12
- package/src/components/lib/forms/RatingStars.astro +66 -10
- package/src/components/lib/forms/SearchReveal.astro +44 -6
- package/src/components/lib/forms/SegmentedControl.astro +61 -7
- package/src/components/lib/forms/SimpleFileInput.astro +57 -6
- package/src/components/lib/forms/StepperInput.astro +101 -9
- package/src/components/lib/layout/FeatureHero.astro +70 -6
- package/src/components/lib/layout/FooterCenteredMinimal.astro +5 -2
- package/src/components/lib/navigation/GlassNavbar.astro +10 -5
- package/src/components/lib/navigation/MinimalSidebar.astro +6 -3
- package/src/components/lib/navigation/SimpleFooterGlass.astro +6 -2
- package/src/components/lib/overlays/SplashIntroOverlay.astro +6 -3
- package/src/components/lib/sections/ButtonsShowcase.astro +182 -0
- package/src/components/lib/sections/CardsShowcase.astro +376 -0
- package/src/components/lib/sections/DataShowcase.astro +329 -0
- package/src/components/lib/sections/FeedbackShowcase.astro +320 -0
- package/src/components/lib/sections/FormsShowcase.astro +347 -0
- package/src/components/lib/sections/HeroGlass.astro +202 -0
- package/src/components/lib/sections/HeroGradient.astro +143 -0
- package/src/components/lib/sections/HeroSplit.astro +210 -0
- package/src/components/lib/sections/LayoutShowcase.astro +317 -0
- package/src/components/lib/sections/NavigationShowcase.astro +285 -0
- package/src/components/lib/sections/OverlaysShowcase.astro +373 -0
- package/src/components/lib/sections/TypographyShowcase.astro +239 -0
- package/src/components/lib/sections/index.ts +6 -0
- package/src/components/types.d.ts +6 -0
- package/{dist → src}/styles/global.css +5 -5
- package/dist/AnimatedInput.astro +0 -82
- package/dist/Badge.astro +0 -52
- package/dist/GlassButton.astro +0 -87
- package/dist/GlassCard.astro +0 -72
- package/dist/GlassNavbar.astro +0 -65
- package/dist/GlowButton.astro +0 -60
- package/dist/buttons/3dPushButton.astro +0 -136
- package/dist/buttons/AnimatedIconButton.astro +0 -146
- package/dist/buttons/BorderDrawButton.astro +0 -112
- package/dist/buttons/CyberpunkButton.astro +0 -148
- package/dist/buttons/DoubleBorderButton.astro +0 -131
- package/dist/buttons/GhostOutlineButton.astro +0 -109
- package/dist/buttons/GlassButton.astro +0 -165
- package/dist/buttons/GlowButton.astro +0 -119
- package/dist/buttons/LiquidButton.astro +0 -167
- package/dist/buttons/LoadingButton.astro +0 -148
- package/dist/buttons/MagneticButton.astro +0 -134
- package/dist/buttons/MinimalPillButton.astro +0 -102
- package/dist/buttons/NeumorphicButton.astro +0 -158
- package/dist/buttons/PulseButton.astro +0 -111
- package/dist/buttons/RetroArcadeButton.astro +0 -105
- package/dist/buttons/RetroShadowButton.astro +0 -82
- package/dist/buttons/ShimmerButton.astro +0 -113
- package/dist/buttons/ShinyButton.astro +0 -121
- package/dist/buttons/TiltGlowButton.astro +0 -145
- package/dist/buttons/index.mjs +0 -19
- package/dist/buttons/index.ts +0 -19
- package/dist/cards/BlogHorizontalCard.astro +0 -18
- package/dist/cards/CyberFeatureCard.astro +0 -12
- package/dist/cards/EcommerceProductCard.astro +0 -24
- package/dist/cards/GlassCard.astro +0 -17
- package/dist/cards/GlassEventCard.astro +0 -19
- package/dist/cards/GlowPortfolioCard.astro +0 -16
- package/dist/cards/InteractiveTiltCard.astro +0 -25
- package/dist/cards/KanbanItemCard.astro +0 -15
- package/dist/cards/MinimalLinkCard.astro +0 -12
- package/dist/cards/MusicPlayerMini.astro +0 -21
- package/dist/cards/NeumorphicCard.astro +0 -6
- package/dist/cards/NotificationCard.astro +0 -15
- package/dist/cards/PricingCard.astro +0 -17
- package/dist/cards/ProfileCard.astro +0 -17
- package/dist/cards/RetroGameCard.astro +0 -15
- package/dist/cards/StatCard.astro +0 -15
- package/dist/cards/TaskKanbanCard.astro +0 -18
- package/dist/cards/TestimonialCardClean.astro +0 -20
- package/dist/cards/WeatherWidgetCard.astro +0 -17
- package/dist/cards/index.mjs +0 -19
- package/dist/cards/index.ts +0 -19
- package/dist/data/AccordionGroupGlass.astro +0 -21
- package/dist/data/AvatarGroupStack.astro +0 -15
- package/dist/data/CalendarGridView.astro +0 -18
- package/dist/data/DataChipsGroup.astro +0 -16
- package/dist/data/DescriptionListHoriz.astro +0 -14
- package/dist/data/FileTreeView.astro +0 -22
- package/dist/data/GanttChartMinimal.astro +0 -12
- package/dist/data/GlassTable.astro +0 -23
- package/dist/data/KeyValuePillGroup.astro +0 -12
- package/dist/data/PriceCompareTable.astro +0 -22
- package/dist/data/ProgressListSmall.astro +0 -17
- package/dist/data/RatingBreakdownBar.astro +0 -13
- package/dist/data/SparklineStatCard.astro +0 -16
- package/dist/data/StatsGridDashboard.astro +0 -16
- package/dist/data/StepperDataVertical.astro +0 -15
- package/dist/data/TagCloudData.astro +0 -14
- package/dist/data/TimelineHorizSteps.astro +0 -18
- package/dist/data/TreeItemInteractive.astro +0 -18
- package/dist/data/UserDirectoryItem.astro +0 -15
- package/dist/data/VerticalTimeline.astro +0 -21
- package/dist/data/index.mjs +0 -20
- package/dist/data/index.ts +0 -20
- package/dist/feedback/AnimatedCheckmark.astro +0 -13
- package/dist/feedback/Badge.astro +0 -19
- package/dist/feedback/CircleProgress.astro +0 -22
- package/dist/feedback/ConfettiFeedback.astro +0 -18
- package/dist/feedback/CyberGlitchAlert.astro +0 -11
- package/dist/feedback/EmptyStateCard.astro +0 -13
- package/dist/feedback/GlassAlert.astro +0 -20
- package/dist/feedback/GlassModal.astro +0 -19
- package/dist/feedback/GlassProgress.astro +0 -10
- package/dist/feedback/IndicatorBadgeMinimal.astro +0 -10
- package/dist/feedback/NeonSpinner.astro +0 -7
- package/dist/feedback/PulseDot.astro +0 -12
- package/dist/feedback/RatingPill.astro +0 -13
- package/dist/feedback/ShakeErrorGroup.astro +0 -7
- package/dist/feedback/SimpleTooltip.astro +0 -10
- package/dist/feedback/SkeletonList.astro +0 -20
- package/dist/feedback/Spotlight.astro +0 -9
- package/dist/feedback/StepProgress.astro +0 -14
- package/dist/feedback/ToastNotif.astro +0 -11
- package/dist/feedback/TypingIndicator.astro +0 -12
- package/dist/feedback/index.mjs +0 -20
- package/dist/feedback/index.ts +0 -20
- package/dist/forms/AnimatedInput.astro +0 -16
- package/dist/forms/ChipInput.astro +0 -13
- package/dist/forms/ColorPickerInput.astro +0 -13
- package/dist/forms/CurrencyInput.astro +0 -11
- package/dist/forms/CustomRadioGroup.astro +0 -13
- package/dist/forms/CyberpunkCheckbox.astro +0 -15
- package/dist/forms/DragDropUpload.astro +0 -12
- package/dist/forms/ErrorInput.astro +0 -11
- package/dist/forms/FloatingPassword.astro +0 -20
- package/dist/forms/FormGroupVertical.astro +0 -14
- package/dist/forms/GlassSlider.astro +0 -7
- package/dist/forms/GlassTextarea.astro +0 -14
- package/dist/forms/ModernSelect.astro +0 -16
- package/dist/forms/NeumorphicSwitch.astro +0 -55
- package/dist/forms/OTPInput.astro +0 -22
- package/dist/forms/RatingStars.astro +0 -15
- package/dist/forms/SearchReveal.astro +0 -13
- package/dist/forms/SegmentedControl.astro +0 -13
- package/dist/forms/SimpleFileInput.astro +0 -11
- package/dist/forms/StepperInput.astro +0 -14
- package/dist/forms/index.mjs +0 -20
- package/dist/forms/index.ts +0 -20
- package/dist/index.js +0 -1
- package/dist/index.mjs +0 -1
- package/dist/layout/BentoGrid3.astro +0 -14
- package/dist/layout/CenterFixedBox.astro +0 -6
- package/dist/layout/CenteredContainer.astro +0 -8
- package/dist/layout/ClusterHorizontal.astro +0 -6
- package/dist/layout/FeatureHero.astro +0 -17
- package/dist/layout/FooterCenteredMinimal.astro +0 -11
- package/dist/layout/FullBleedSection.astro +0 -6
- package/dist/layout/GalleryGrid4.astro +0 -7
- package/dist/layout/GlassCardGrid.astro +0 -6
- package/dist/layout/GlassSectionHeader.astro +0 -15
- package/dist/layout/LandingSectionSplit.astro +0 -13
- package/dist/layout/MasonryGrid.astro +0 -7
- package/dist/layout/MinimalFooterGrid.astro +0 -20
- package/dist/layout/ScrollSnapSection.astro +0 -7
- package/dist/layout/SectionDividerText.astro +0 -7
- package/dist/layout/SidebarLayoutWrapper.astro +0 -11
- package/dist/layout/SplitScreenLayout.astro +0 -11
- package/dist/layout/StepLayoutVertical.astro +0 -21
- package/dist/layout/StickySidebarWrapper.astro +0 -10
- package/dist/layout/VerticalStack.astro +0 -8
- package/dist/layout/index.mjs +0 -20
- package/dist/layout/index.ts +0 -20
- package/dist/navigation/AnchorSideNav.astro +0 -13
- package/dist/navigation/BottomNavMobile.astro +0 -13
- package/dist/navigation/BreadcrumbsMinimal.astro +0 -16
- package/dist/navigation/BurgerMorphIcon.astro +0 -12
- package/dist/navigation/CommandPaletteUI.astro +0 -17
- package/dist/navigation/DotNavigationSlider.astro +0 -13
- package/dist/navigation/FloatingTabBar.astro +0 -12
- package/dist/navigation/GlassNavbar.astro +0 -19
- package/dist/navigation/LangSwitcherPill.astro +0 -17
- package/dist/navigation/MegaMenuGlass.astro +0 -25
- package/dist/navigation/MinimalSidebar.astro +0 -18
- package/dist/navigation/PaginationGlass.astro +0 -20
- package/dist/navigation/PaginationInfiniteUI.astro +0 -11
- package/dist/navigation/RadialIconMenu.astro +0 -15
- package/dist/navigation/RetroArcadeMenu.astro +0 -12
- package/dist/navigation/ScrollProgressTop.astro +0 -15
- package/dist/navigation/SimpleFooterGlass.astro +0 -21
- package/dist/navigation/TabUnderline.astro +0 -14
- package/dist/navigation/UserProfileNav.astro +0 -21
- package/dist/navigation/VerticalTabs.astro +0 -14
- package/dist/navigation/index.mjs +0 -20
- package/dist/navigation/index.ts +0 -20
- package/dist/overlays/AgeVerificationOverlay.astro +0 -20
- package/dist/overlays/BackdropBlurMask.astro +0 -6
- package/dist/overlays/BottomSheetMobile.astro +0 -16
- package/dist/overlays/CommandDialog.astro +0 -19
- package/dist/overlays/ContextMenuOverlay.astro +0 -17
- package/dist/overlays/CookieBannerGlass.astro +0 -14
- package/dist/overlays/ExitIntentOverlay.astro +0 -19
- package/dist/overlays/FloatingTrayActions.astro +0 -13
- package/dist/overlays/HelpBubbleOverlay.astro +0 -11
- package/dist/overlays/LightboxOverlay.astro +0 -13
- package/dist/overlays/LoadingOverlayFull.astro +0 -10
- package/dist/overlays/MobileNavOverlay.astro +0 -18
- package/dist/overlays/OverlayModal.astro +0 -24
- package/dist/overlays/PopoverMenuGlass.astro +0 -17
- package/dist/overlays/SearchOverlayFullscreen.astro +0 -15
- package/dist/overlays/SideDrawerRight.astro +0 -16
- package/dist/overlays/SplashIntroOverlay.astro +0 -11
- package/dist/overlays/SpotlightIndicator.astro +0 -6
- package/dist/overlays/ToastStackOverlay.astro +0 -12
- package/dist/overlays/TooltipActionTray.astro +0 -14
- package/dist/overlays/index.mjs +0 -20
- package/dist/overlays/index.ts +0 -20
- package/dist/typography/AnimatedUnderlineLink.astro +0 -10
- package/dist/typography/BackgroundClipMask.astro +0 -7
- package/dist/typography/CodeInlineGlass.astro +0 -6
- package/dist/typography/CyberpunkGlitchText.astro +0 -20
- package/dist/typography/DropCapParagraph.astro +0 -7
- package/dist/typography/FadedVerticalText.astro +0 -6
- package/dist/typography/FloatingTextLabel.astro +0 -10
- package/dist/typography/GlassBlockQuote.astro +0 -13
- package/dist/typography/GlassTextReveal.astro +0 -7
- package/dist/typography/GradientHeading.astro +0 -9
- package/dist/typography/GradientUnderlineLink.astro +0 -7
- package/dist/typography/KbdIndicator.astro +0 -6
- package/dist/typography/LetterSpacingWide.astro +0 -6
- package/dist/typography/MinimalListMarkers.astro +0 -10
- package/dist/typography/MonospaceStatLine.astro +0 -6
- package/dist/typography/NeonTextHighlight.astro +0 -6
- package/dist/typography/ShadowRevealText.astro +0 -7
- package/dist/typography/StrokeHeadingOutline.astro +0 -8
- package/dist/typography/Text3DLayer.astro +0 -7
- package/dist/typography/TypewriterText.astro +0 -15
- package/dist/typography/index.mjs +0 -20
- package/dist/typography/index.ts +0 -20
- package/dist/utilities/AspectRatioBox.astro +0 -11
- package/dist/utilities/BackgroundDotPattern.astro +0 -6
- package/dist/utilities/CircularMask.astro +0 -7
- package/dist/utilities/ClickRippleWrapper.astro +0 -7
- package/dist/utilities/FadeInWrapper.astro +0 -11
- package/dist/utilities/FixedRatioImage.astro +0 -7
- package/dist/utilities/GlassBlurLayer.astro +0 -6
- package/dist/utilities/GradientBorderMask.astro +0 -7
- package/dist/utilities/HoverLift.astro +0 -7
- package/dist/utilities/ResponsiveSpacer.astro +0 -15
- package/dist/utilities/ResponsiveVisToggle.astro +0 -11
- package/dist/utilities/ScrollLockParent.astro +0 -11
- package/dist/utilities/ScrollMarginTarget.astro +0 -10
- package/dist/utilities/SlideUpReveal.astro +0 -7
- package/dist/utilities/SmoothAnchorLink.astro +0 -22
- package/dist/utilities/StackLayering.astro +0 -12
- package/dist/utilities/StickyObserver.astro +0 -8
- package/dist/utilities/TextTruncate.astro +0 -10
- package/dist/utilities/TruncateSingleLine.astro +0 -6
- package/dist/utilities/VisuallyHidden.astro +0 -6
- package/dist/utilities/index.mjs +0 -20
- package/dist/utilities/index.ts +0 -20
- package/src/components/lib/utilities/AspectRatioBox.astro +0 -11
- package/src/components/lib/utilities/BackgroundDotPattern.astro +0 -6
- package/src/components/lib/utilities/CircularMask.astro +0 -7
- package/src/components/lib/utilities/ClickRippleWrapper.astro +0 -7
- package/src/components/lib/utilities/FadeInWrapper.astro +0 -11
- package/src/components/lib/utilities/FixedRatioImage.astro +0 -7
- package/src/components/lib/utilities/GlassBlurLayer.astro +0 -6
- package/src/components/lib/utilities/GradientBorderMask.astro +0 -7
- package/src/components/lib/utilities/HoverLift.astro +0 -7
- package/src/components/lib/utilities/ResponsiveSpacer.astro +0 -15
- package/src/components/lib/utilities/ResponsiveVisToggle.astro +0 -11
- package/src/components/lib/utilities/ScrollLockParent.astro +0 -11
- package/src/components/lib/utilities/ScrollMarginTarget.astro +0 -10
- package/src/components/lib/utilities/SlideUpReveal.astro +0 -7
- package/src/components/lib/utilities/SmoothAnchorLink.astro +0 -22
- package/src/components/lib/utilities/StackLayering.astro +0 -12
- package/src/components/lib/utilities/StickyObserver.astro +0 -8
- package/src/components/lib/utilities/TextTruncate.astro +0 -10
- package/src/components/lib/utilities/TruncateSingleLine.astro +0 -6
- package/src/components/lib/utilities/VisuallyHidden.astro +0 -6
- package/src/components/lib/utilities/index.ts +0 -20
|
@@ -1,12 +1,42 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* MinimalLinkCard — Elegant arrow-link card for site navigation sections.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} title - The text label of the link.
|
|
6
|
+
* @param {string} href - The destination URL.
|
|
7
|
+
*/
|
|
8
|
+
interface Props {
|
|
9
|
+
title: string;
|
|
10
|
+
href: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const { title, href } = Astro.props;
|
|
2
14
|
---
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<
|
|
15
|
+
|
|
16
|
+
<a href={href} class="link-card">
|
|
17
|
+
<span class="link-card__title">{title}</span>
|
|
18
|
+
<svg class="link-card__icon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
19
|
+
<path d="M5 12h14M12 5l7 7-7 7"/>
|
|
20
|
+
</svg>
|
|
6
21
|
</a>
|
|
22
|
+
|
|
7
23
|
<style>
|
|
8
|
-
.link-card {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
24
|
+
.link-card {
|
|
25
|
+
display: flex; justify-content: space-between; align-items: center;
|
|
26
|
+
padding: var(--sp-6, 1.5rem);
|
|
27
|
+
background: var(--c-bg-elev, rgba(255,255,255,0.03));
|
|
28
|
+
border: 1px solid var(--c-border, rgba(255,255,255,0.1));
|
|
29
|
+
border-radius: var(--r-md, 12px);
|
|
30
|
+
text-decoration: none;
|
|
31
|
+
color: var(--c-text-1, #fff);
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
transition: 0.2s;
|
|
34
|
+
}
|
|
35
|
+
.link-card:hover {
|
|
36
|
+
background: rgba(255,255,255,0.06);
|
|
37
|
+
border-color: var(--c-primary, #6366f1);
|
|
38
|
+
color: var(--c-primary-light, #818cf8);
|
|
39
|
+
}
|
|
40
|
+
.link-card__icon { transition: transform 0.2s; }
|
|
41
|
+
.link-card:hover .link-card__icon { transform: translateX(5px); }
|
|
12
42
|
</style>
|
|
@@ -1,21 +1,61 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* MusicPlayerMini — Compact player widget with controls and progress bar.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} title - The song track title.
|
|
6
|
+
* @param {string} artist - The artist or band name.
|
|
7
|
+
* @param {string} coverUrl - Optional string matching the album cover image URL.
|
|
8
|
+
* @param {number} progress - The song progress representation (0 to 100). Default is 40.
|
|
9
|
+
*/
|
|
10
|
+
interface Props {
|
|
11
|
+
title: string;
|
|
12
|
+
artist: string;
|
|
13
|
+
coverUrl?: string;
|
|
14
|
+
progress?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const { title, artist, coverUrl, progress = 40 } = Astro.props;
|
|
2
18
|
---
|
|
19
|
+
|
|
3
20
|
<div class="music-mini">
|
|
4
|
-
<div class="
|
|
5
|
-
<div class="
|
|
6
|
-
<h4>
|
|
7
|
-
<p>
|
|
8
|
-
<div class="progress"
|
|
21
|
+
<div class="music-mini__art" style={coverUrl ? `background-image: url('${coverUrl}'); background-size: cover;` : ''}></div>
|
|
22
|
+
<div class="music-mini__track">
|
|
23
|
+
<h4 class="music-mini__title">{title}</h4>
|
|
24
|
+
<p class="music-mini__artist">{artist}</p>
|
|
25
|
+
<div class="music-mini__progress" role="progressbar" aria-valuenow={progress} aria-valuemin="0" aria-valuemax="100">
|
|
26
|
+
<div class="music-mini__bar" style={`width: ${progress}%;`}></div>
|
|
27
|
+
</div>
|
|
9
28
|
</div>
|
|
10
|
-
<
|
|
29
|
+
<button class="music-mini__play" type="button" aria-label="Play track">▶</button>
|
|
11
30
|
</div>
|
|
31
|
+
|
|
12
32
|
<style>
|
|
13
|
-
.music-mini {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
.
|
|
33
|
+
.music-mini {
|
|
34
|
+
display: flex; align-items: center; gap: var(--sp-4, 1rem);
|
|
35
|
+
background: var(--c-bg-elev, #111);
|
|
36
|
+
padding: var(--sp-3, 0.75rem);
|
|
37
|
+
border-radius: var(--r-md, 14px); border: 1px solid var(--c-border, #333);
|
|
38
|
+
width: 100%; max-width: 320px;
|
|
39
|
+
}
|
|
40
|
+
.music-mini__art {
|
|
41
|
+
width: 50px; height: 50px;
|
|
42
|
+
background-color: var(--c-primary-light, #818cf8);
|
|
43
|
+
border-radius: var(--r-sm, 8px); flex-shrink: 0;
|
|
44
|
+
}
|
|
45
|
+
.music-mini__track { flex: 1; }
|
|
46
|
+
.music-mini__title { font-size: 0.85rem; color: var(--c-text-1, #fff); margin: 0; }
|
|
47
|
+
.music-mini__artist { font-size: 0.7rem; color: var(--c-text-2, #64748b); margin: 0; }
|
|
48
|
+
.music-mini__progress {
|
|
49
|
+
height: 3px; background: rgba(255,255,255,0.1);
|
|
50
|
+
border-radius: 2px; margin-top: 8px; position: relative; overflow: hidden;
|
|
51
|
+
}
|
|
52
|
+
.music-mini__bar {
|
|
53
|
+
position: absolute; left: 0; top: 0; height: 100%;
|
|
54
|
+
background: var(--c-primary, #6366f1); border-radius: 2px;
|
|
55
|
+
}
|
|
56
|
+
.music-mini__play {
|
|
57
|
+
font-size: 1.2rem; cursor: pointer; color: var(--c-text-1, #fff);
|
|
58
|
+
background: none; border: none; padding: 0.25rem; display: grid; place-items: center;
|
|
59
|
+
}
|
|
60
|
+
.music-mini__play:hover { color: var(--c-primary-light, #818cf8); }
|
|
21
61
|
</style>
|
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* NeumorphicCard — A soft UI card with deep shadows for a realistic elevated look.
|
|
4
|
+
*
|
|
5
|
+
* @param {'sm'|'md'|'lg'} padding - Optional. Inner padding layout size. Default is 'md'.
|
|
6
|
+
*/
|
|
7
|
+
interface Props {
|
|
8
|
+
padding?: 'sm' | 'md' | 'lg';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { padding = 'md' } = Astro.props;
|
|
2
12
|
---
|
|
3
|
-
|
|
13
|
+
|
|
14
|
+
<div class={`neu-card neu-card--p${padding}`}>
|
|
15
|
+
<slot />
|
|
16
|
+
</div>
|
|
17
|
+
|
|
4
18
|
<style>
|
|
5
|
-
.neu-card {
|
|
19
|
+
.neu-card {
|
|
20
|
+
background: var(--c-bg-elev, #e0e0e0);
|
|
21
|
+
border-radius: var(--r-xl, 30px);
|
|
22
|
+
box-shadow: 15px 15px 30px rgba(0,0,0,0.1), -15px -15px 30px rgba(255,255,255,0.7);
|
|
23
|
+
color: var(--c-text-1, #444);
|
|
24
|
+
transition: all 0.3s ease;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.neu-card--psm { padding: var(--sp-4, 1rem); }
|
|
28
|
+
.neu-card--pmd { padding: var(--sp-8, 2rem); }
|
|
29
|
+
.neu-card--plg { padding: var(--sp-12, 3rem); }
|
|
30
|
+
|
|
31
|
+
@media (prefers-color-scheme: dark) {
|
|
32
|
+
.neu-card {
|
|
33
|
+
box-shadow: 15px 15px 30px rgba(0,0,0,0.4), -15px -15px 30px rgba(255,255,255,0.05);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
6
36
|
</style>
|
|
@@ -1,15 +1,50 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* NotificationCard — Toast-like card for app notifications and alerts.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} title - The notification headline.
|
|
6
|
+
* @param {string} message - The notification detail text.
|
|
7
|
+
* @param {'info'|'warning'|'success'|'error'} type - Optional. Changes the notification dot indicator color. Default is 'info'.
|
|
8
|
+
*/
|
|
9
|
+
interface Props {
|
|
10
|
+
title: string;
|
|
11
|
+
message: string;
|
|
12
|
+
type?: 'info' | 'warning' | 'success' | 'error';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { title, message, type = 'info' } = Astro.props;
|
|
2
16
|
---
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<div class="
|
|
6
|
-
|
|
7
|
-
<
|
|
17
|
+
|
|
18
|
+
<div class={`notify-card notify-card--${type}`}>
|
|
19
|
+
<div class="notify-card__dot" aria-hidden="true"></div>
|
|
20
|
+
<div class="notify-card__content">
|
|
21
|
+
<strong class="notify-card__title">{title}</strong>
|
|
22
|
+
<p class="notify-card__message">{message}</p>
|
|
8
23
|
</div>
|
|
9
24
|
</div>
|
|
25
|
+
|
|
10
26
|
<style>
|
|
11
|
-
.notify-card {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
.notify-card {
|
|
28
|
+
display: flex; gap: var(--sp-4, 1rem);
|
|
29
|
+
padding: var(--sp-4, 1rem);
|
|
30
|
+
background: var(--c-bg-elev, #0f172a);
|
|
31
|
+
border-radius: var(--r-md, 12px);
|
|
32
|
+
border: 1px solid var(--c-border, rgba(255,255,255,0.1));
|
|
33
|
+
box-shadow: 0 10px 40px rgba(0,0,0,0.4);
|
|
34
|
+
max-width: 300px;
|
|
35
|
+
}
|
|
36
|
+
.notify-card__dot {
|
|
37
|
+
width: 8px; height: 8px;
|
|
38
|
+
border-radius: var(--r-full, 50%);
|
|
39
|
+
margin-top: 5px;
|
|
40
|
+
flex-shrink: 0;
|
|
41
|
+
}
|
|
42
|
+
.notify-card__content { flex: 1; }
|
|
43
|
+
.notify-card__title { font-size: 0.9rem; color: var(--c-text-1, #fff); }
|
|
44
|
+
.notify-card__message { margin: 2px 0 0; font-size: 0.82rem; color: var(--c-text-2, #94a3b8); line-height: 1.4; }
|
|
45
|
+
|
|
46
|
+
.notify-card--info .notify-card__dot { background: var(--c-primary, #6366f1); }
|
|
47
|
+
.notify-card--success .notify-card__dot { background: #10b981; }
|
|
48
|
+
.notify-card--warning .notify-card__dot { background: #f59e0b; }
|
|
49
|
+
.notify-card--error .notify-card__dot { background: #ef4444; }
|
|
15
50
|
</style>
|
|
@@ -1,17 +1,55 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* PricingCard — Optimized card for showing product plans and features.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} plan - The plan name (e.g. "Pro").
|
|
6
|
+
* @param {string} price - The integer/decimal price value.
|
|
7
|
+
* @param {boolean} featured - Applies a highlighted styling variant if true.
|
|
8
|
+
*/
|
|
2
9
|
interface Props { plan: string; price: string; featured?: boolean; }
|
|
3
10
|
const { plan, price, featured = false } = Astro.props;
|
|
4
11
|
---
|
|
5
12
|
<div class:list={["price-card", { "featured": featured }]}>
|
|
6
|
-
<span class="
|
|
7
|
-
<div class="price"><span>$</span>{price}</div>
|
|
8
|
-
<ul class="
|
|
9
|
-
|
|
13
|
+
<span class="price-card__plan">{plan}</span>
|
|
14
|
+
<div class="price-card__price"><span>$</span>{price}</div>
|
|
15
|
+
<ul class="price-card__features">
|
|
16
|
+
<slot />
|
|
17
|
+
</ul>
|
|
18
|
+
<button class="price-card__btn" type="button">Choose Plan</button>
|
|
10
19
|
</div>
|
|
20
|
+
|
|
11
21
|
<style>
|
|
12
|
-
.price-card {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
.price-card {
|
|
23
|
+
background: var(--c-bg-elev, rgba(255,255,255,0.03));
|
|
24
|
+
border: 1px solid var(--c-border, rgba(255,255,255,0.1));
|
|
25
|
+
border-radius: var(--r-xl, 24px);
|
|
26
|
+
padding: var(--sp-10, 2.5rem);
|
|
27
|
+
display: flex; flex-direction: column; gap: var(--sp-6, 1.5rem);
|
|
28
|
+
}
|
|
29
|
+
.featured {
|
|
30
|
+
border-color: var(--c-primary, #6366f1);
|
|
31
|
+
background: rgba(99,102,241,0.05);
|
|
32
|
+
transform: scale(1.05);
|
|
33
|
+
}
|
|
34
|
+
.price-card__plan { font-size: 1.1rem; font-weight: 600; color: var(--c-text-1, #fff); }
|
|
35
|
+
.price-card__price { font-size: 2.5rem; font-weight: 800; color: var(--c-text-1, #fff); }
|
|
36
|
+
.price-card__price span { font-size: 1.2rem; opacity: 0.7; margin-right: 2px; }
|
|
37
|
+
|
|
38
|
+
.price-card__features {
|
|
39
|
+
list-style: none; padding: 0; margin: 0;
|
|
40
|
+
font-size: 0.9rem; color: var(--c-text-2, #94a3b8);
|
|
41
|
+
display: flex; flex-direction: column; gap: 0.5rem;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Global sub-selector rule to style slotted list items cleanly */
|
|
45
|
+
.price-card__features :global(li) { position: relative; padding-left: 1.5rem; }
|
|
46
|
+
.price-card__features :global(li::before) {
|
|
47
|
+
content: "✓"; position: absolute; left: 0; color: var(--c-primary, #6366f1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.price-card__btn {
|
|
51
|
+
background: var(--c-primary, #6366f1); color: #fff;
|
|
52
|
+
border: none; padding: 0.8rem; border-radius: var(--r-md, 12px);
|
|
53
|
+
font-weight: 700; cursor: pointer; transition: 0.2s;
|
|
54
|
+
}
|
|
17
55
|
</style>
|
|
@@ -1,17 +1,56 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* ProfileCard — Image-centric profile card with social links and blur effect.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} name - The person's full name.
|
|
6
|
+
* @param {string} role - Their job title or role.
|
|
7
|
+
* @param {string} avatarUrl - Optional URL string pointing to their avatar image.
|
|
8
|
+
*/
|
|
9
|
+
interface Props {
|
|
10
|
+
name: string;
|
|
11
|
+
role: string;
|
|
12
|
+
avatarUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { name, role, avatarUrl } = Astro.props;
|
|
2
16
|
---
|
|
17
|
+
|
|
3
18
|
<div class="profile-card">
|
|
4
|
-
<div class="
|
|
5
|
-
<div class="
|
|
6
|
-
<h3>
|
|
7
|
-
<p>
|
|
8
|
-
<div class="
|
|
19
|
+
<div class="profile-card__banner"></div>
|
|
20
|
+
<div class="profile-card__avatar" style={avatarUrl ? `background-image: url('${avatarUrl}'); background-size: cover;` : ''}></div>
|
|
21
|
+
<h3 class="profile-card__name">{name}</h3>
|
|
22
|
+
<p class="profile-card__role">{role}</p>
|
|
23
|
+
<div class="profile-card__socials">
|
|
24
|
+
<slot name="socials">
|
|
25
|
+
<!-- Fallback generic icons if no socials slot passed -->
|
|
26
|
+
<span aria-hidden="true">🐦</span>
|
|
27
|
+
<span aria-hidden="true">💼</span>
|
|
28
|
+
<span aria-hidden="true">🌐</span>
|
|
29
|
+
</slot>
|
|
30
|
+
</div>
|
|
9
31
|
</div>
|
|
32
|
+
|
|
10
33
|
<style>
|
|
11
|
-
.profile-card {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
34
|
+
.profile-card {
|
|
35
|
+
background: rgba(255,255,255,0.03);
|
|
36
|
+
border: 1px solid var(--c-border, rgba(255,255,255,0.1));
|
|
37
|
+
border-radius: var(--r-xl, 20px);
|
|
38
|
+
text-align: center;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
padding-bottom: var(--sp-6, 1.5rem);
|
|
41
|
+
}
|
|
42
|
+
.profile-card__banner {
|
|
43
|
+
height: 80px;
|
|
44
|
+
background: linear-gradient(135deg, var(--c-primary, #6366f1), var(--c-primary-light, #c084fc));
|
|
45
|
+
}
|
|
46
|
+
.profile-card__avatar {
|
|
47
|
+
width: 80px; height: 80px;
|
|
48
|
+
background-color: var(--c-bg-elev, #334155);
|
|
49
|
+
border: 4px solid var(--c-bg, #080b14);
|
|
50
|
+
border-radius: var(--r-full, 50%);
|
|
51
|
+
margin: -40px auto 1rem;
|
|
52
|
+
}
|
|
53
|
+
.profile-card__name { color: var(--c-text-1, #fff); margin: 0; }
|
|
54
|
+
.profile-card__role { font-size: 0.85rem; color: var(--c-text-2, #94a3b8); margin: 4px 0 0; }
|
|
55
|
+
.profile-card__socials { display: flex; justify-content: center; gap: 1rem; margin-top: 1rem; cursor: pointer; }
|
|
17
56
|
</style>
|
|
@@ -1,15 +1,43 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* RetroGameCard — Bold gaming card with scanlines and pixel fonts.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} title - The retro game title.
|
|
6
|
+
* @param {string} level - Current stage or level string.
|
|
7
|
+
* @param {number|string} score - The player's score.
|
|
8
|
+
*/
|
|
9
|
+
interface Props {
|
|
10
|
+
title: string;
|
|
11
|
+
level: string;
|
|
12
|
+
score: number | string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { title, level, score } = Astro.props;
|
|
2
16
|
---
|
|
17
|
+
|
|
3
18
|
<div class="retro-game">
|
|
4
|
-
<div class="
|
|
5
|
-
<div class="
|
|
6
|
-
<h3>
|
|
7
|
-
<div class="
|
|
19
|
+
<div class="retro-game__scanlines"></div>
|
|
20
|
+
<div class="retro-game__screen">{level}</div>
|
|
21
|
+
<h3 class="retro-game__title">{title}</h3>
|
|
22
|
+
<div class="retro-game__score">SCORE: {score}</div>
|
|
8
23
|
</div>
|
|
24
|
+
|
|
9
25
|
<style>
|
|
10
|
-
.retro-game {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
26
|
+
.retro-game {
|
|
27
|
+
background: #22c55e; border: 4px solid #000;
|
|
28
|
+
padding: var(--sp-4, 1rem); position: relative;
|
|
29
|
+
box-shadow: 8px 8px 0 #000;
|
|
30
|
+
font-family: 'Courier New', Courier, monospace;
|
|
31
|
+
}
|
|
32
|
+
.retro-game__screen {
|
|
33
|
+
background: #000; color: #22c55e;
|
|
34
|
+
padding: var(--sp-4, 1rem); text-align: center;
|
|
35
|
+
font-weight: 900; margin-bottom: 0.5rem; text-transform: uppercase;
|
|
36
|
+
}
|
|
37
|
+
.retro-game__scanlines {
|
|
38
|
+
position: absolute; inset: 0; pointer-events: none;
|
|
39
|
+
background: linear-gradient(rgba(0,0,0,0.1) 50%, transparent 50%); background-size: 100% 4px;
|
|
40
|
+
}
|
|
41
|
+
.retro-game__title { margin: 0; font-size: 1.1rem; color: #000; font-weight: 900; text-transform: uppercase; }
|
|
42
|
+
.retro-game__score { font-size: 0.8rem; color: #000; margin-top: 0.5rem; font-weight: bold; }
|
|
15
43
|
</style>
|
|
@@ -1,15 +1,50 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* StatCard — Compact card for displaying key metrics with an icon.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} label - The metric name (e.g., "Total Revenue").
|
|
6
|
+
* @param {string} value - The primary statistic value (e.g., "$124,590").
|
|
7
|
+
* @param {string} icon - The emoji or text character representing the stat.
|
|
8
|
+
*/
|
|
9
|
+
interface Props {
|
|
10
|
+
label: string;
|
|
11
|
+
value: string;
|
|
12
|
+
icon: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { label, value, icon } = Astro.props;
|
|
2
16
|
---
|
|
17
|
+
|
|
3
18
|
<div class="stat-card">
|
|
4
|
-
<div class="icon
|
|
5
|
-
<div>
|
|
6
|
-
<span class="
|
|
7
|
-
<span class="value
|
|
19
|
+
<div class="stat-card__icon" aria-hidden="true">{icon}</div>
|
|
20
|
+
<div class="stat-card__info">
|
|
21
|
+
<span class="stat-card__label">{label}</span>
|
|
22
|
+
<span class="stat-card__value">{value}</span>
|
|
8
23
|
</div>
|
|
9
24
|
</div>
|
|
25
|
+
|
|
10
26
|
<style>
|
|
11
|
-
.stat-card {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
.stat-card {
|
|
28
|
+
display: flex; align-items: center; gap: var(--sp-5, 1.25rem);
|
|
29
|
+
padding: var(--sp-6, 1.5rem);
|
|
30
|
+
background: var(--c-bg-elev, rgba(99,102,241,0.06));
|
|
31
|
+
border: 1px solid var(--c-border, rgba(99,102,241,0.2));
|
|
32
|
+
border-radius: var(--r-lg, 16px);
|
|
33
|
+
}
|
|
34
|
+
.stat-card__icon {
|
|
35
|
+
font-size: 1.5rem;
|
|
36
|
+
background: rgba(99,102,241,0.1);
|
|
37
|
+
width: 50px; height: 50px;
|
|
38
|
+
display: grid; place-items: center;
|
|
39
|
+
border-radius: var(--r-md, 12px);
|
|
40
|
+
}
|
|
41
|
+
.stat-card__label {
|
|
42
|
+
display: block; font-size: 0.8rem;
|
|
43
|
+
color: var(--c-text-2, #94a3b8);
|
|
44
|
+
font-weight: 600; text-transform: uppercase;
|
|
45
|
+
}
|
|
46
|
+
.stat-card__value {
|
|
47
|
+
display: block; font-size: 1.4rem;
|
|
48
|
+
font-weight: 800; color: var(--c-text-1, #fff);
|
|
49
|
+
}
|
|
15
50
|
</style>
|
|
@@ -1,18 +1,57 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* TaskKanbanCard — Agile task card with priority labels and due dates.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} task - The description of the task being managed.
|
|
6
|
+
* @param {string} date - Visual date string indicator (e.g. "📅 Oct 24").
|
|
7
|
+
* @param {string} assigneeInitials - Short initials for the user avatar (e.g "MJ").
|
|
8
|
+
* @param {'low'|'med'|'high'} priority - Controls the appearance of the priority tag label. Default is 'low'.
|
|
9
|
+
*/
|
|
10
|
+
interface Props {
|
|
11
|
+
task: string;
|
|
12
|
+
date: string;
|
|
13
|
+
assigneeInitials: string;
|
|
14
|
+
priority?: 'low' | 'med' | 'high';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const { task, date, assigneeInitials, priority = 'low' } = Astro.props;
|
|
18
|
+
|
|
19
|
+
const priorityLabels = { low: 'Low', med: 'Medium', high: 'High' };
|
|
2
20
|
---
|
|
21
|
+
|
|
3
22
|
<div class="task-card">
|
|
4
|
-
<div class="
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
23
|
+
<div class="task-card__tags">
|
|
24
|
+
<span class={`task-card__tag task-card__tag--${priority}`}>{priorityLabels[priority]}</span>
|
|
25
|
+
</div>
|
|
26
|
+
<p class="task-card__desc">{task}</p>
|
|
27
|
+
<div class="task-card__footer">
|
|
28
|
+
<span class="task-card__date">{date}</span>
|
|
29
|
+
<div class="task-card__assignee">{assigneeInitials}</div>
|
|
9
30
|
</div>
|
|
10
31
|
</div>
|
|
32
|
+
|
|
11
33
|
<style>
|
|
12
|
-
.task-card {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
34
|
+
.task-card {
|
|
35
|
+
background: var(--c-bg-elev, #1e293b);
|
|
36
|
+
padding: var(--sp-4, 1rem);
|
|
37
|
+
border-radius: var(--r-md, 10px);
|
|
38
|
+
border: 1px solid var(--c-border, #334155);
|
|
39
|
+
}
|
|
40
|
+
.task-card__tag {
|
|
41
|
+
font-size: 0.7rem; font-weight: 700;
|
|
42
|
+
padding: 2px 8px; border-radius: 4px;
|
|
43
|
+
}
|
|
44
|
+
.task-card__tag--high { background: rgba(239,68,68,0.1); color: #f87171; }
|
|
45
|
+
.task-card__tag--med { background: rgba(245,158,11,0.1); color: #fbbf24; }
|
|
46
|
+
.task-card__tag--low { background: rgba(52,211,153,0.1); color: #34d399; }
|
|
47
|
+
|
|
48
|
+
.task-card__desc { font-size: 0.85rem; color: var(--c-text-1, #e2e8f0); margin: 0.75rem 0; font-weight: 500; }
|
|
49
|
+
.task-card__footer { display: flex; justify-content: space-between; align-items: center; }
|
|
50
|
+
.task-card__date { font-size: 0.75rem; color: var(--c-text-2, #64748b); }
|
|
51
|
+
.task-card__assignee {
|
|
52
|
+
width: 24px; height: 24px;
|
|
53
|
+
background: var(--c-primary, #6366f1); color: #fff;
|
|
54
|
+
font-size: 0.65rem; border-radius: 50%;
|
|
55
|
+
display: grid; place-items: center; font-weight: 700;
|
|
56
|
+
}
|
|
18
57
|
</style>
|
|
@@ -1,20 +1,51 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* TestimonialCardClean — Minimalist card for user quotes and reviews.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} quote - The body of the testimonial review.
|
|
6
|
+
* @param {string} name - The reviewer's full name.
|
|
7
|
+
* @param {string} role - The reviewer's job title or company role.
|
|
8
|
+
* @param {string} avatarUrl - Optional string tracking the avatar headshot URL.
|
|
9
|
+
*/
|
|
10
|
+
interface Props {
|
|
11
|
+
quote: string;
|
|
12
|
+
name: string;
|
|
13
|
+
role: string;
|
|
14
|
+
avatarUrl?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const { quote, name, role, avatarUrl } = Astro.props;
|
|
2
18
|
---
|
|
19
|
+
|
|
3
20
|
<div class="testi-card">
|
|
4
|
-
<
|
|
5
|
-
<div class="
|
|
6
|
-
<div class="
|
|
7
|
-
<div>
|
|
8
|
-
<h5>
|
|
9
|
-
<span>
|
|
21
|
+
<blockquote class="testi-card__quote">"{quote}"</blockquote>
|
|
22
|
+
<div class="testi-card__author">
|
|
23
|
+
<div class="testi-card__pic" style={avatarUrl ? `background-image: url('${avatarUrl}'); background-size: cover;` : ''}></div>
|
|
24
|
+
<div class="testi-card__info">
|
|
25
|
+
<h5 class="testi-card__name">{name}</h5>
|
|
26
|
+
<span class="testi-card__role">{role}</span>
|
|
10
27
|
</div>
|
|
11
28
|
</div>
|
|
12
29
|
</div>
|
|
30
|
+
|
|
13
31
|
<style>
|
|
14
|
-
.testi-card {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
32
|
+
.testi-card {
|
|
33
|
+
background: var(--c-bg-elev, rgba(255,255,255,0.03));
|
|
34
|
+
padding: var(--sp-8, 2rem);
|
|
35
|
+
border-radius: var(--r-xl, 20px);
|
|
36
|
+
border: 1px solid var(--c-border, rgba(255,255,255,0.1));
|
|
37
|
+
}
|
|
38
|
+
.testi-card__quote {
|
|
39
|
+
font-size: 1rem; color: var(--c-text-1, #e2e8f0);
|
|
40
|
+
font-style: italic; line-height: 1.6;
|
|
41
|
+
margin: 0 0 2rem 0;
|
|
42
|
+
}
|
|
43
|
+
.testi-card__author { display: flex; align-items: center; gap: var(--sp-4, 1rem); }
|
|
44
|
+
.testi-card__pic {
|
|
45
|
+
width: 40px; height: 40px;
|
|
46
|
+
background: var(--c-bg, #334155);
|
|
47
|
+
border-radius: var(--r-full, 50%);
|
|
48
|
+
}
|
|
49
|
+
.testi-card__name { margin: 0; color: var(--c-text-1, #fff); font-size: 0.95rem; }
|
|
50
|
+
.testi-card__role { font-size: 0.75rem; color: var(--c-text-2, #64748b); }
|
|
20
51
|
</style>
|