astro-component-kit 0.3.1 → 0.4.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.
Files changed (249) hide show
  1. package/README.md +133 -36
  2. package/package.json +17 -4
  3. package/src/components/index.ts +18 -202
  4. package/src/components/lib/Galaxy3D.astro +249 -137
  5. package/src/components/lib/app/AppSidebar.astro +249 -0
  6. package/src/components/lib/app/AppTopbar.astro +284 -0
  7. package/src/components/lib/app/ArrivalsBoard.astro +176 -0
  8. package/src/components/lib/app/AuthCard.astro +213 -0
  9. package/src/components/lib/app/DataTable.astro +346 -0
  10. package/src/components/lib/app/GuestProfileCard.astro +133 -0
  11. package/src/components/lib/app/HousekeepingBoard.astro +189 -0
  12. package/src/components/lib/app/PageHeader.astro +157 -0
  13. package/src/components/lib/app/PlanUsageCard.astro +112 -0
  14. package/src/components/lib/app/RoomRack.astro +207 -0
  15. package/src/components/lib/app/SettingsSection.astro +96 -0
  16. package/src/components/lib/app/SwitchRow.astro +71 -0
  17. package/src/components/lib/app/TeamMembers.astro +190 -0
  18. package/src/components/lib/app/app-icons.ts +52 -0
  19. package/src/components/lib/app/index.ts +19 -0
  20. package/src/components/lib/buttons/NeonBorderButton.astro +162 -0
  21. package/src/components/lib/buttons/RippleButton.astro +199 -0
  22. package/src/components/lib/buttons/SlideRevealButton.astro +159 -0
  23. package/src/components/lib/buttons/index.ts +4 -0
  24. package/src/components/lib/cards/GithubRepoCard.astro +176 -0
  25. package/src/components/lib/cards/PricingCompareMiniCard.astro +196 -0
  26. package/src/components/lib/cards/StatsTrendCard.astro +149 -0
  27. package/src/components/lib/cards/index.ts +3 -0
  28. package/src/components/lib/charts/ActivityRings.astro +105 -0
  29. package/src/components/lib/charts/AreaChart.astro +4 -4
  30. package/src/components/lib/charts/BarChart.astro +3 -3
  31. package/src/components/lib/charts/BoxPlotChart.astro +109 -0
  32. package/src/components/lib/charts/BubbleChart.astro +101 -0
  33. package/src/components/lib/charts/BulletChart.astro +160 -0
  34. package/src/components/lib/charts/BumpChart.astro +92 -0
  35. package/src/components/lib/charts/CandlestickChart.astro +105 -0
  36. package/src/components/lib/charts/ChartFrame.astro +373 -0
  37. package/src/components/lib/charts/DivergingBarChart.astro +98 -0
  38. package/src/components/lib/charts/DonutChart.astro +2 -2
  39. package/src/components/lib/charts/DumbbellChart.astro +92 -0
  40. package/src/components/lib/charts/ForecastLineChart.astro +125 -0
  41. package/src/components/lib/charts/FunnelChart.astro +122 -0
  42. package/src/components/lib/charts/GaugeChart.astro +111 -0
  43. package/src/components/lib/charts/GoalProgressChart.astro +97 -0
  44. package/src/components/lib/charts/GroupedBarChart.astro +125 -0
  45. package/src/components/lib/charts/HeatmapChart.astro +131 -0
  46. package/src/components/lib/charts/HistogramChart.astro +111 -0
  47. package/src/components/lib/charts/HorizontalBarChart.astro +155 -0
  48. package/src/components/lib/charts/KpiStatTile.astro +116 -0
  49. package/src/components/lib/charts/KpiTrendGrid.astro +60 -0
  50. package/src/components/lib/charts/LineChart.astro +160 -0
  51. package/src/components/lib/charts/LinearProgressGauge.astro +136 -0
  52. package/src/components/lib/charts/LollipopChart.astro +100 -0
  53. package/src/components/lib/charts/MeterGauge.astro +122 -0
  54. package/src/components/lib/charts/MetricDeltaTable.astro +125 -0
  55. package/src/components/lib/charts/PieChart.astro +135 -0
  56. package/src/components/lib/charts/PolarAreaChart.astro +85 -0
  57. package/src/components/lib/charts/PopulationPyramid.astro +122 -0
  58. package/src/components/lib/charts/PunchCardChart.astro +89 -0
  59. package/src/components/lib/charts/RadarChart.astro +94 -0
  60. package/src/components/lib/charts/RadarMetricChart.astro +168 -0
  61. package/src/components/lib/charts/RadialBarChart.astro +124 -0
  62. package/src/components/lib/charts/RangeAreaChart.astro +113 -0
  63. package/src/components/lib/charts/RetentionCohortTable.astro +126 -0
  64. package/src/components/lib/charts/SankeyChart.astro +128 -0
  65. package/src/components/lib/charts/ScatterPlot.astro +139 -0
  66. package/src/components/lib/charts/SegmentedBarChart.astro +119 -0
  67. package/src/components/lib/charts/SlopeChart.astro +105 -0
  68. package/src/components/lib/charts/SparklineChart.astro +87 -0
  69. package/src/components/lib/charts/StackedAreaChart.astro +130 -0
  70. package/src/components/lib/charts/StackedBarChart.astro +136 -0
  71. package/src/components/lib/charts/SunburstChart.astro +103 -0
  72. package/src/components/lib/charts/TreemapChart.astro +94 -0
  73. package/src/components/lib/charts/WaffleChart.astro +121 -0
  74. package/src/components/lib/charts/WaterfallChart.astro +118 -0
  75. package/src/components/lib/charts/chart-tooltip.ts +75 -0
  76. package/src/components/lib/charts/chart-utils.ts +271 -0
  77. package/src/components/lib/charts/index.ts +46 -0
  78. package/src/components/lib/data/ActivityHeatmapGrid.astro +157 -0
  79. package/src/components/lib/data/MetricComparisonRow.astro +109 -0
  80. package/src/components/lib/data/StatusTimelineFeed.astro +168 -0
  81. package/src/components/lib/data/index.ts +3 -0
  82. package/src/components/lib/ecommerce/CartDrawer.astro +483 -0
  83. package/src/components/lib/ecommerce/CartPageList.astro +290 -0
  84. package/src/components/lib/ecommerce/CartToast.astro +276 -0
  85. package/src/components/lib/ecommerce/CategoryTiles.astro +143 -0
  86. package/src/components/lib/ecommerce/CheckoutForm.astro +423 -0
  87. package/src/components/lib/ecommerce/CountdownBanner.astro +230 -0
  88. package/src/components/lib/ecommerce/FilterBar.astro +278 -0
  89. package/src/components/lib/ecommerce/FilterSidebar.astro +405 -0
  90. package/src/components/lib/ecommerce/LiveActivityToast.astro +213 -0
  91. package/src/components/lib/ecommerce/OrderSummary.astro +295 -0
  92. package/src/components/lib/ecommerce/ProductBuyBox.astro +247 -0
  93. package/src/components/lib/ecommerce/ProductCardMinimal.astro +229 -0
  94. package/src/components/lib/ecommerce/ProductGallery.astro +145 -0
  95. package/src/components/lib/ecommerce/ProductGrid.astro +118 -0
  96. package/src/components/lib/ecommerce/ProductMedia.astro +113 -0
  97. package/src/components/lib/ecommerce/ProductRating.astro +78 -0
  98. package/src/components/lib/ecommerce/ProductToolbar.astro +93 -0
  99. package/src/components/lib/ecommerce/PromoBar.astro +145 -0
  100. package/src/components/lib/ecommerce/StockIndicator.astro +127 -0
  101. package/src/components/lib/ecommerce/StoreHeader.astro +446 -0
  102. package/src/components/lib/ecommerce/StoreHero.astro +260 -0
  103. package/src/components/lib/ecommerce/StoreProductCard.astro +307 -0
  104. package/src/components/lib/ecommerce/TrustBadges.astro +101 -0
  105. package/src/components/lib/ecommerce/VariantPicker.astro +145 -0
  106. package/src/components/lib/ecommerce/cart-store.ts +151 -0
  107. package/src/components/lib/ecommerce/catalog-filter.ts +62 -0
  108. package/src/components/lib/ecommerce/index.ts +34 -0
  109. package/src/components/lib/ecommerce/product-icons.ts +28 -0
  110. package/src/components/lib/ecommerce/types.ts +70 -0
  111. package/src/components/lib/feedback/ProgressRingCounter.astro +118 -0
  112. package/src/components/lib/feedback/ToastNotificationGroup.astro +173 -0
  113. package/src/components/lib/feedback/index.ts +2 -0
  114. package/src/components/lib/forms/AnimatedInput.astro +4 -2
  115. package/src/components/lib/forms/CustomRadioGroup.astro +3 -1
  116. package/src/components/lib/forms/GlassInlineToggleGroup.astro +161 -0
  117. package/src/components/lib/forms/PasswordStrengthInput.astro +242 -0
  118. package/src/components/lib/forms/PhoneCountryInput.astro +145 -0
  119. package/src/components/lib/forms/TagsAutocompleteInput.astro +249 -0
  120. package/src/components/lib/forms/index.ts +5 -0
  121. package/src/components/lib/index.ts +2 -0
  122. package/src/components/lib/layout/BentoGrid3.astro +6 -4
  123. package/src/components/lib/layout/CenterFixedBox.astro +2 -2
  124. package/src/components/lib/layout/CenteredContainer.astro +4 -2
  125. package/src/components/lib/layout/ClusterHorizontal.astro +2 -2
  126. package/src/components/lib/layout/DiagonalSectionDivider.astro +69 -0
  127. package/src/components/lib/layout/FeatureHero.astro +4 -2
  128. package/src/components/lib/layout/FooterCenteredMinimal.astro +4 -2
  129. package/src/components/lib/layout/FullBleedSection.astro +2 -2
  130. package/src/components/lib/layout/GalleryGrid4.astro +2 -2
  131. package/src/components/lib/layout/HolyGrailGrid.astro +127 -0
  132. package/src/components/lib/layout/LandingSectionSplit.astro +5 -3
  133. package/src/components/lib/layout/MasonryGrid.astro +2 -2
  134. package/src/components/lib/layout/MinimalFooterGrid.astro +1 -1
  135. package/src/components/lib/layout/ScrollSnapSection.astro +1 -1
  136. package/src/components/lib/layout/SidebarLayoutWrapper.astro +4 -2
  137. package/src/components/lib/layout/SplitScreenLayout.astro +3 -3
  138. package/src/components/lib/layout/StepLayoutVertical.astro +1 -1
  139. package/src/components/lib/layout/StickySidebarWrapper.astro +4 -2
  140. package/src/components/lib/layout/index.ts +3 -1
  141. package/src/components/lib/navigation/QuickJumpDock.astro +125 -0
  142. package/src/components/lib/navigation/StepBreadcrumbBar.astro +151 -0
  143. package/src/components/lib/navigation/SubNavbarPills.astro +102 -0
  144. package/src/components/lib/navigation/index.ts +3 -0
  145. package/src/components/lib/overlays/CookiePreferencesDrawer.astro +226 -0
  146. package/src/components/lib/overlays/FloatingFeedbackWidget.astro +203 -0
  147. package/src/components/lib/overlays/ImageCompareSlider.astro +172 -0
  148. package/src/components/lib/overlays/index.ts +3 -0
  149. package/src/components/lib/sections/AgencyContactBrief.astro +194 -0
  150. package/src/components/lib/sections/AgencyFooterCta.astro +94 -0
  151. package/src/components/lib/sections/AgencyHeader.astro +161 -0
  152. package/src/components/lib/sections/AgencyHeroKinetic.astro +172 -0
  153. package/src/components/lib/sections/AgencyServicesList.astro +113 -0
  154. package/src/components/lib/sections/AgencyTeamGrid.astro +111 -0
  155. package/src/components/lib/sections/AgencyWorkGrid.astro +147 -0
  156. package/src/components/lib/sections/BlogGridSection.astro +133 -0
  157. package/src/components/lib/sections/ButtonsShowcase.astro +20 -18
  158. package/src/components/lib/sections/CardsShowcase.astro +28 -26
  159. package/src/components/lib/sections/CareersOpenings.astro +141 -0
  160. package/src/components/lib/sections/ChangelogSection.astro +151 -0
  161. package/src/components/lib/sections/ContactGlassForm.astro +10 -8
  162. package/src/components/lib/sections/ContactSplitMap.astro +141 -0
  163. package/src/components/lib/sections/CtaAppDownload.astro +13 -11
  164. package/src/components/lib/sections/CtaGlowBanner.astro +12 -10
  165. package/src/components/lib/sections/CtaNewsletterSection.astro +165 -0
  166. package/src/components/lib/sections/CtaSplitImage.astro +149 -0
  167. package/src/components/lib/sections/DataShowcase.astro +23 -21
  168. package/src/components/lib/sections/FaqAccordionSection.astro +8 -8
  169. package/src/components/lib/sections/FaqTwoColumn.astro +121 -0
  170. package/src/components/lib/sections/FeatureAlternatingRows.astro +192 -0
  171. package/src/components/lib/sections/FeatureBentoGrid.astro +13 -11
  172. package/src/components/lib/sections/FeatureIconGrid.astro +155 -0
  173. package/src/components/lib/sections/FeatureTabsShowcase.astro +182 -0
  174. package/src/components/lib/sections/FeatureTimelineFlow.astro +8 -6
  175. package/src/components/lib/sections/FeedbackShowcase.astro +15 -13
  176. package/src/components/lib/sections/FooterMegaSection.astro +157 -0
  177. package/src/components/lib/sections/FormsShowcase.astro +22 -20
  178. package/src/components/lib/sections/HeroDashboardPreview.astro +182 -0
  179. package/src/components/lib/sections/HeroGlass.astro +22 -20
  180. package/src/components/lib/sections/HeroGradient.astro +15 -13
  181. package/src/components/lib/sections/HeroMinimalCentered.astro +175 -0
  182. package/src/components/lib/sections/HeroShowcaseSplit.astro +306 -0
  183. package/src/components/lib/sections/HeroSplit.astro +13 -11
  184. package/src/components/lib/sections/HeroTerminal.astro +253 -0
  185. package/src/components/lib/sections/HeroWaitlist.astro +231 -0
  186. package/src/components/lib/sections/HowItWorksSteps.astro +180 -0
  187. package/src/components/lib/sections/IntegrationsGrid.astro +167 -0
  188. package/src/components/lib/sections/LayoutShowcase.astro +21 -19
  189. package/src/components/lib/sections/LogoCloudSection.astro +96 -0
  190. package/src/components/lib/sections/LogoWallGrid.astro +93 -0
  191. package/src/components/lib/sections/NavigationShowcase.astro +15 -13
  192. package/src/components/lib/sections/OverlaysShowcase.astro +21 -19
  193. package/src/components/lib/sections/PricingComparisonMatrix.astro +15 -13
  194. package/src/components/lib/sections/PricingSinglePlan.astro +159 -0
  195. package/src/components/lib/sections/PricingTierCards.astro +11 -9
  196. package/src/components/lib/sections/PricingToggleCards.astro +171 -0
  197. package/src/components/lib/sections/ShopCategoryHero.astro +103 -0
  198. package/src/components/lib/sections/ShopCollectionMosaic.astro +131 -0
  199. package/src/components/lib/sections/ShopFooterWordmark.astro +100 -0
  200. package/src/components/lib/sections/ShopHeaderEditorial.astro +396 -0
  201. package/src/components/lib/sections/ShopHeroEditorial.astro +151 -0
  202. package/src/components/lib/sections/ShopLookbook.astro +250 -0
  203. package/src/components/lib/sections/ShopNewsletterEditorial.astro +128 -0
  204. package/src/components/lib/sections/ShopProductRail.astro +150 -0
  205. package/src/components/lib/sections/ShopReviewsEditorial.astro +133 -0
  206. package/src/components/lib/sections/ShopValuesMarquee.astro +91 -0
  207. package/src/components/lib/sections/StatsCounterBand.astro +124 -0
  208. package/src/components/lib/sections/StatsDashboardSection.astro +85 -0
  209. package/src/components/lib/sections/StatsMetricShowcase.astro +9 -7
  210. package/src/components/lib/sections/TeamGridSection.astro +12 -10
  211. package/src/components/lib/sections/TestimonialCarousel.astro +167 -0
  212. package/src/components/lib/sections/TestimonialFeatured.astro +122 -0
  213. package/src/components/lib/sections/TestimonialGridSection.astro +188 -0
  214. package/src/components/lib/sections/TestimonialWallGlass.astro +11 -9
  215. package/src/components/lib/sections/TypographyShowcase.astro +10 -8
  216. package/src/components/lib/sections/index.ts +39 -0
  217. package/src/components/lib/templates/ecommerce/StoreCategoryPage.astro +160 -0
  218. package/src/components/lib/templates/ecommerce/StoreCheckoutPage.astro +98 -0
  219. package/src/components/lib/templates/ecommerce/StoreHomePage.astro +191 -0
  220. package/src/components/lib/templates/ecommerce/StoreLayout.astro +169 -0
  221. package/src/components/lib/templates/ecommerce/StoreProductPage.astro +165 -0
  222. package/src/components/lib/templates/ecommerce/data.ts +187 -0
  223. package/src/components/lib/templates/ecommerce/index.ts +14 -0
  224. package/src/components/lib/templates/ecommerce-editorial/EditorialBagPage.astro +52 -0
  225. package/src/components/lib/templates/ecommerce-editorial/EditorialCheckoutPage.astro +123 -0
  226. package/src/components/lib/templates/ecommerce-editorial/EditorialHomePage.astro +102 -0
  227. package/src/components/lib/templates/ecommerce-editorial/EditorialLayout.astro +216 -0
  228. package/src/components/lib/templates/ecommerce-editorial/EditorialProductPage.astro +205 -0
  229. package/src/components/lib/templates/ecommerce-editorial/EditorialShopPage.astro +112 -0
  230. package/src/components/lib/templates/ecommerce-editorial/data.ts +125 -0
  231. package/src/components/lib/templates/ecommerce-editorial/index.ts +16 -0
  232. package/src/components/lib/templates/saas-hotel/AppLayout.astro +83 -0
  233. package/src/components/lib/templates/saas-hotel/DashboardPage.astro +66 -0
  234. package/src/components/lib/templates/saas-hotel/GuestsPage.astro +65 -0
  235. package/src/components/lib/templates/saas-hotel/LandingPage.astro +213 -0
  236. package/src/components/lib/templates/saas-hotel/ReportsPage.astro +63 -0
  237. package/src/components/lib/templates/saas-hotel/ReservationsPage.astro +49 -0
  238. package/src/components/lib/templates/saas-hotel/RoomsPage.astro +48 -0
  239. package/src/components/lib/templates/saas-hotel/SettingsPage.astro +115 -0
  240. package/src/components/lib/templates/saas-hotel/SignInPage.astro +50 -0
  241. package/src/components/lib/templates/saas-hotel/data.ts +229 -0
  242. package/src/components/lib/templates/saas-hotel/index.ts +19 -0
  243. package/src/components/lib/templates/saas-hotel/lobby-theme.css +90 -0
  244. package/src/components/lib/typography/AnimatedCounterText.astro +102 -0
  245. package/src/components/lib/typography/CurvedPathHeading.astro +86 -0
  246. package/src/components/lib/typography/GradientTextMarquee.astro +105 -0
  247. package/src/components/lib/typography/HackerDecodeText.astro +85 -0
  248. package/src/components/lib/typography/index.ts +4 -0
  249. package/src/styles/global.css +113 -1
@@ -0,0 +1,86 @@
1
+ ---
2
+ /**
3
+ * CurvedPathHeading — Typographic heading flowing along an SVG circular or arched trajectory.
4
+ *
5
+ * @param {string} text - Headline text content. Default is 'ASTRO COMPONENTS KIT • ZERO RUNTIME DEPENDENCIES •'.
6
+ * @param {number} size - Pixel container diameter. Default is 260.
7
+ * @param {boolean} animate - Whether the badge rotates continuously. Default is true.
8
+ */
9
+ interface Props {
10
+ text?: string;
11
+ size?: number;
12
+ animate?: boolean;
13
+ }
14
+
15
+ const {
16
+ text = 'ASTRO COMPONENTS KIT • ZERO RUNTIME • PURE CSS •',
17
+ size = 260,
18
+ animate = true,
19
+ } = Astro.props;
20
+
21
+ const pathId = `curve-path-${Math.random().toString(36).substring(2, 8)}`;
22
+ ---
23
+
24
+ <div class:list={['curved-heading', { 'is-animated': animate }]} style={`--curved-size: ${size}px;`}>
25
+ <svg viewBox="0 0 300 300" width={size} height={size}>
26
+ <defs>
27
+ <path
28
+ id={pathId}
29
+ d="M 150, 150 m -110, 0 a 110,110 0 1,1 220,0 a 110,110 0 1,1 -220,0"
30
+ />
31
+ </defs>
32
+ <text class="curved-heading__text">
33
+ <textPath href={`#${pathId}`} startOffset="0%">
34
+ {text}
35
+ </textPath>
36
+ </text>
37
+ </svg>
38
+ <div class="curved-heading__core">✦</div>
39
+ </div>
40
+
41
+ <style>
42
+ .curved-heading {
43
+ position: relative;
44
+ width: var(--curved-size);
45
+ height: var(--curved-size);
46
+ display: inline-flex;
47
+ align-items: center;
48
+ justify-content: center;
49
+ font-family: var(--font-sans, system-ui, sans-serif);
50
+ user-select: none;
51
+ }
52
+
53
+ .curved-heading.is-animated svg {
54
+ animation: curved-spin 20s linear infinite;
55
+ }
56
+
57
+ .curved-heading__text {
58
+ font-size: 13.5px;
59
+ font-weight: 800;
60
+ letter-spacing: 0.18em;
61
+ text-transform: uppercase;
62
+ fill: var(--c-primary-light, #d4a017);
63
+ }
64
+
65
+ .curved-heading__core {
66
+ position: absolute;
67
+ width: 48px;
68
+ height: 48px;
69
+ border-radius: 50%;
70
+ background: rgba(184, 134, 11, 0.12);
71
+ border: 1px solid rgba(184, 134, 11, 0.3);
72
+ color: var(--c-accent, #fef3c7);
73
+ display: grid;
74
+ place-items: center;
75
+ font-size: 1.2rem;
76
+ }
77
+
78
+ @keyframes curved-spin {
79
+ from { transform: rotate(0deg); }
80
+ to { transform: rotate(360deg); }
81
+ }
82
+
83
+ @media (prefers-reduced-motion: reduce) {
84
+ .curved-heading.is-animated svg { animation: none; }
85
+ }
86
+ </style>
@@ -0,0 +1,105 @@
1
+ ---
2
+ /**
3
+ * GradientTextMarquee — Continuous kinetic typographic marquee banner with background-clip gold gradient.
4
+ *
5
+ * @param {string[]} phrases - Array of words or slogans to scroll continuously.
6
+ * @param {string} speed - Animation duration string (e.g. '25s'). Default is '20s'.
7
+ * @param {boolean} reverse - Whether the marquee moves in reverse direction.
8
+ */
9
+ interface Props {
10
+ phrases?: string[];
11
+ speed?: string;
12
+ reverse?: boolean;
13
+ }
14
+
15
+ const {
16
+ phrases = [
17
+ 'PERFORMANCE FIRST',
18
+ 'ZERO DEPENDENCIES',
19
+ 'ACCESSIBLE WCAG AA',
20
+ 'ASTRO 5 READY',
21
+ 'DARK GLASS MORPHISM',
22
+ ],
23
+ speed = '20s',
24
+ reverse = false,
25
+ } = Astro.props;
26
+ ---
27
+
28
+ <div class="grad-marquee" style={`--marquee-speed: ${speed};`} aria-label="Animated slogan marquee">
29
+ <div class:list={['grad-marquee__track', { 'is-reverse': reverse }]}>
30
+ {phrases.map((phrase) => (
31
+ <span class="grad-marquee__item">
32
+ <span class="text">{phrase}</span>
33
+ <span class="dot" aria-hidden="true">✦</span>
34
+ </span>
35
+ ))}
36
+ {/* Duplicate loop */}
37
+ {phrases.map((phrase) => (
38
+ <span class="grad-marquee__item" aria-hidden="true">
39
+ <span class="text">{phrase}</span>
40
+ <span class="dot" aria-hidden="true">✦</span>
41
+ </span>
42
+ ))}
43
+ </div>
44
+ </div>
45
+
46
+ <style>
47
+ .grad-marquee {
48
+ position: relative;
49
+ width: 100%;
50
+ overflow: hidden;
51
+ padding: var(--sp-4, 1rem) 0;
52
+ user-select: none;
53
+ mask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent);
54
+ -webkit-mask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent);
55
+ font-family: var(--font-sans, system-ui, sans-serif);
56
+ }
57
+
58
+ .grad-marquee__track {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 2rem;
62
+ width: max-content;
63
+ animation: marquee-roll var(--marquee-speed) linear infinite;
64
+ }
65
+
66
+ .grad-marquee__track:hover {
67
+ animation-play-state: paused;
68
+ }
69
+
70
+ .grad-marquee__track.is-reverse {
71
+ animation-direction: reverse;
72
+ }
73
+
74
+ .grad-marquee__item {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ gap: 2rem;
78
+ }
79
+
80
+ .grad-marquee__item .text {
81
+ font-size: clamp(1.8rem, 4vw, 3.2rem);
82
+ font-weight: 900;
83
+ letter-spacing: 0.05em;
84
+ text-transform: uppercase;
85
+ background: linear-gradient(135deg, #ffffff 0%, #fef3c7 40%, #d4a017 80%, #b8860b 100%);
86
+ -webkit-background-clip: text;
87
+ -webkit-text-fill-color: transparent;
88
+ background-clip: text;
89
+ white-space: nowrap;
90
+ }
91
+
92
+ .grad-marquee__item .dot {
93
+ color: var(--c-primary-light, #d4a017);
94
+ font-size: 1.2rem;
95
+ }
96
+
97
+ @keyframes marquee-roll {
98
+ from { transform: translateX(0); }
99
+ to { transform: translateX(-50%); }
100
+ }
101
+
102
+ @media (prefers-reduced-motion: reduce) {
103
+ .grad-marquee__track { animation: none; overflow-x: auto; }
104
+ }
105
+ </style>
@@ -0,0 +1,85 @@
1
+ ---
2
+ /**
3
+ * HackerDecodeText — Cyberpunk Matrix-style randomized character deciphering effect on hover.
4
+ *
5
+ * @param {string} text - Final decoded text string. Default is 'CYBERNETIC SYSTEM READY'.
6
+ * @param {string} tag - HTML heading or paragraph tag. Default is 'h3'.
7
+ * @param {string} className - Optional CSS class names.
8
+ */
9
+ interface Props {
10
+ text?: string;
11
+ tag?: 'h1' | 'h2' | 'h3' | 'h4' | 'p' | 'span';
12
+ className?: string;
13
+ }
14
+
15
+ const {
16
+ text = 'CYBERNETIC PROTOCOL ONLINE',
17
+ tag: Tag = 'h3',
18
+ className = '',
19
+ } = Astro.props;
20
+ ---
21
+
22
+ <Tag
23
+ class:list={['hacker-text', className]}
24
+ data-hacker-text={text}
25
+ title="Hover to decode"
26
+ >
27
+ {text}
28
+ </Tag>
29
+
30
+ <style>
31
+ .hacker-text {
32
+ font-family: var(--font-mono, 'JetBrains Mono', monospace);
33
+ font-size: clamp(1.2rem, 3vw, 2rem);
34
+ font-weight: 800;
35
+ color: var(--c-primary-light, #d4a017);
36
+ letter-spacing: 0.08em;
37
+ cursor: default;
38
+ user-select: none;
39
+ transition: text-shadow 0.2s ease;
40
+ }
41
+
42
+ .hacker-text:hover {
43
+ text-shadow: 0 0 12px rgba(212, 160, 23, 0.7);
44
+ }
45
+ </style>
46
+
47
+ <script>
48
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
49
+
50
+ function setupHackerText() {
51
+ document.querySelectorAll('[data-hacker-text]').forEach((el) => {
52
+ if (el.getAttribute('data-hacker-init')) return;
53
+ el.setAttribute('data-hacker-init', 'true');
54
+
55
+ const original = el.getAttribute('data-hacker-text') || el.textContent || '';
56
+ let interval: any = null;
57
+
58
+ el.addEventListener('pointerenter', () => {
59
+ let iteration = 0;
60
+ clearInterval(interval);
61
+
62
+ interval = setInterval(() => {
63
+ el.textContent = original
64
+ .split('')
65
+ .map((char, index) => {
66
+ if (char === ' ') return ' ';
67
+ if (index < iteration) {
68
+ return original[index];
69
+ }
70
+ return chars[Math.floor(Math.random() * chars.length)];
71
+ })
72
+ .join('');
73
+
74
+ if (iteration >= original.length) {
75
+ clearInterval(interval);
76
+ }
77
+ iteration += 1 / 2;
78
+ }, 30);
79
+ });
80
+ });
81
+ }
82
+
83
+ setupHackerText();
84
+ document.addEventListener('astro:page-load', setupHackerText);
85
+ </script>
@@ -21,3 +21,7 @@ export { default as ShadowRevealText } from './ShadowRevealText.astro';
21
21
  export { default as StrokeHeadingOutline } from './StrokeHeadingOutline.astro';
22
22
  export { default as Text3DLayer } from './Text3DLayer.astro';
23
23
  export { default as TypewriterText } from './TypewriterText.astro';
24
+ export { default as AnimatedCounterText } from './AnimatedCounterText.astro';
25
+ export { default as GradientTextMarquee } from './GradientTextMarquee.astro';
26
+ export { default as CurvedPathHeading } from './CurvedPathHeading.astro';
27
+ export { default as HackerDecodeText } from './HackerDecodeText.astro';
@@ -26,6 +26,21 @@
26
26
  --c-text-2: #a3a3a3;
27
27
  --c-text-3: #737373;
28
28
 
29
+ /* Data-viz — categorical slots (fixed order, CVD-validated for dark surfaces) */
30
+ --chart-1: #3987e5; /* blue */
31
+ --chart-2: #d95926; /* orange */
32
+ --chart-3: #199e70; /* aqua */
33
+ --chart-4: #c98500; /* yellow */
34
+ --chart-5: #d55181; /* magenta */
35
+ --chart-6: #2f9e2f; /* green */
36
+ --chart-7: #9085e9; /* violet */
37
+ --chart-8: #e66767; /* red */
38
+ --chart-pos: #34c38f; /* status: good */
39
+ --chart-neg: #f06a6a; /* status: critical */
40
+ --chart-grid: rgba(255,255,255,0.07);
41
+ --chart-axis: rgba(255,255,255,0.18);
42
+ --chart-surface: #0d0d0f;
43
+
29
44
  /* Typography */
30
45
  --font-sans: 'Inter', system-ui, sans-serif;
31
46
  --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
@@ -35,8 +50,10 @@
35
50
  --sp-2: 0.5rem; /* 8px */
36
51
  --sp-3: 0.75rem; /* 12px */
37
52
  --sp-4: 1rem; /* 16px */
53
+ --sp-5: 1.25rem; /* 20px */
38
54
  --sp-6: 1.5rem; /* 24px */
39
55
  --sp-8: 2rem; /* 32px */
56
+ --sp-10: 2.5rem; /* 40px */
40
57
  --sp-12: 3rem; /* 48px */
41
58
  --sp-16: 4rem; /* 64px */
42
59
 
@@ -47,11 +64,54 @@
47
64
  --r-xl: 28px;
48
65
  --r-full: 9999px;
49
66
 
67
+ /* Theme helpers (used by e-commerce components and templates) */
68
+ --ink-rgb: 255 255 255; /* foreground for translucent lines/fills */
69
+ --paper-rgb: 5 5 5; /* background for translucent surfaces */
70
+ --c-on-primary: #050505; /* text on primary (gold) buttons */
71
+ --c-success: #34d399;
72
+ --c-danger: #f87171;
73
+ --c-warning: #fbbf24;
74
+ color-scheme: dark;
75
+
50
76
  /* Sidebar */
51
- --sidebar-w: 260px;
77
+ --sidebar-w: 280px;
52
78
  --header-h: 85px;
53
79
  }
54
80
 
81
+ /* ── Light theme (opt-in: <html data-theme="light">) ──────── */
82
+ [data-theme='light'] {
83
+ --c-bg: #f6f5f2;
84
+ --c-bg-1: #ffffff;
85
+ --c-bg-2: #ecebe6;
86
+ --c-surface: rgba(17,17,17,0.025);
87
+ --c-border: rgba(17,17,17,0.09);
88
+
89
+ --c-primary: #8a6500;
90
+ --c-primary-light: #8a6500;
91
+ --c-primary-glow: rgba(138,101,0,0.12);
92
+ --c-accent: #5c4300;
93
+
94
+ --c-text-1: #121212;
95
+ --c-text-2: #4a4a4a;
96
+ --c-text-3: #666666;
97
+
98
+ --ink-rgb: 17 17 17;
99
+ --paper-rgb: 255 255 255;
100
+ --c-on-primary: #ffffff;
101
+ --c-success: #047857;
102
+ --c-danger: #b91c1c;
103
+ --c-warning: #92400e;
104
+ --pm-ink-s: 65%;
105
+ --pm-ink-l: 36%;
106
+ --pm-soft-s: 35%;
107
+ --pm-soft-l: 82%;
108
+ --pm-soft-a: 0.9;
109
+ --chart-grid: rgba(17,24,39,0.08);
110
+ --chart-axis: rgba(17,24,39,0.22);
111
+ --chart-surface: #ffffff;
112
+ color-scheme: light;
113
+ }
114
+
55
115
  /* ── Base ────────────────────────────────────────────────── */
56
116
  html {
57
117
  font-family: var(--font-sans);
@@ -140,3 +200,55 @@ body::before {
140
200
  .anim-delay-1 { animation-delay: 0.1s; }
141
201
  .anim-delay-2 { animation-delay: 0.2s; }
142
202
  .anim-delay-3 { animation-delay: 0.3s; }
203
+
204
+ /* ── Site header: keep every nav link on one line on tablets / small laptops ── */
205
+ @media (min-width: 769px) and (max-width: 1180px) {
206
+ #site-nav a { padding-inline: 0.55rem; font-size: 0.82rem; }
207
+ #site-nav .gh-link { font-size: 0; gap: 0; }
208
+ #site-nav .gh-link svg { width: 18px; height: 18px; }
209
+ }
210
+ @media (min-width: 769px) and (max-width: 960px) {
211
+ header .docs-header__brand .brand-logo { height: 46px; }
212
+ #site-nav { gap: 0; }
213
+ #site-nav a { padding-inline: 0.45rem; font-size: 0.78rem; }
214
+ }
215
+
216
+ /* ── Light theme adapters for shared components ──────────────
217
+ Scoped component styles assume a dark surface; these overrides
218
+ (:root[data-theme='light'] wins on specificity) keep them legible. */
219
+ :root[data-theme='light'] .badge--default { background: rgba(17,17,17,0.06); color: #3f3f3f; border-color: rgba(17,17,17,0.12); }
220
+ :root[data-theme='light'] .badge--success { background: rgba(4,120,87,0.1); color: #047857; border-color: rgba(4,120,87,0.25); }
221
+ :root[data-theme='light'] .badge--warning { background: rgba(146,64,14,0.1); color: #92400e; border-color: rgba(146,64,14,0.25); }
222
+ :root[data-theme='light'] .badge--danger { background: rgba(185,28,28,0.08); color: #b91c1c; border-color: rgba(185,28,28,0.22); }
223
+ :root[data-theme='light'] .badge--info { background: rgba(29,78,216,0.08); color: #1d4ed8; border-color: rgba(29,78,216,0.22); }
224
+
225
+ :root[data-theme='light'] .cns--glass .cns__box { background: #fff; border-color: rgba(17,17,17,0.08); box-shadow: 0 30px 60px -40px rgba(17,17,17,0.35); }
226
+ :root[data-theme='light'] .cns__icon { background: rgba(17,17,17,0.04); border-color: rgba(17,17,17,0.08); }
227
+ :root[data-theme='light'] .cns__input { background: #fff; border-color: rgba(17,17,17,0.18); }
228
+ :root[data-theme='light'] .cns__btn { background: #121212; color: #fff; }
229
+ :root[data-theme='light'] .cns__btn:hover { background: var(--c-primary); }
230
+ :root[data-theme='light'] .cns__perks svg { color: #047857; }
231
+
232
+ :root[data-theme='light'] .fms { background: var(--c-bg-1); border-top-color: rgba(17,17,17,0.08); }
233
+ :root[data-theme='light'] .fms__top { border-bottom-color: rgba(17,17,17,0.08); }
234
+ :root[data-theme='light'] .fms__news-field { background: #fff; border-color: rgba(17,17,17,0.16); }
235
+ :root[data-theme='light'] .fms__news-field button { background: rgba(17,17,17,0.05); }
236
+ :root[data-theme='light'] .fms__news-field button:hover { color: #fff; }
237
+ :root[data-theme='light'] .fms__status { border-color: rgba(17,17,17,0.1); }
238
+
239
+ :root[data-theme='light'] .logo-badge { background: #fff; border-color: rgba(17,17,17,0.08); }
240
+ :root[data-theme='light'] .step-nav__line { background: rgba(17,17,17,0.1); }
241
+
242
+ :root[data-theme='light'] .anim-input,
243
+ :root[data-theme='light'] .custom-select,
244
+ :root[data-theme='light'] .stepper { background: #fff; border-color: rgba(17,17,17,0.14); }
245
+ :root[data-theme='light'] .radio-circle { border-color: rgba(17,17,17,0.3); background: #fff; }
246
+
247
+ :root[data-theme='light'] .step-nav__circle { background: #fff; border-color: rgba(17,17,17,0.18); }
248
+ :root[data-theme='light'] .step-nav__item--complete .step-nav__circle { background: rgba(4,120,87,0.1); border-color: #047857; color: #047857; }
249
+ :root[data-theme='light'] .step-nav__item--active .step-nav__circle { color: #fff; background: var(--c-primary); border-color: var(--c-primary); box-shadow: none; }
250
+ :root[data-theme='light'] .status-feed__line { background: rgba(17,24,39,0.1); }
251
+ :root[data-theme='light'] .status-feed__bullet { background: var(--c-bg-1); border-color: rgba(17,24,39,0.16); }
252
+ :root[data-theme='light'] .status-feed__item--done .status-feed__bullet { background: rgba(4,120,87,0.1); border-color: #047857; color: #047857; }
253
+ :root[data-theme='light'] .status-feed__item--active .status-feed__bullet { background: var(--c-primary-glow); border-color: var(--c-primary-light); color: var(--c-primary-light); box-shadow: none; }
254
+ :root[data-theme='light'] .status-feed__content { background: var(--c-bg-1); border-color: rgba(17,24,39,0.08); }