@smicolon/fasla-ui 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -5
- package/dist/cli/index.js +2983 -648
- package/dist/index.cjs +50 -12
- package/dist/index.js +50 -12
- package/dist/motion/index.cjs +12 -0
- package/dist/motion/index.d.cts +7 -0
- package/dist/motion/index.d.ts +7 -0
- package/dist/motion/index.js +12 -0
- package/dist/registry/index.cjs +4 -4
- package/dist/registry/index.js +4 -4
- package/dist/tokens/index.cjs +34 -8
- package/dist/tokens/index.d.cts +23 -1
- package/dist/tokens/index.d.ts +23 -1
- package/dist/tokens/index.js +34 -8
- package/package.json +6 -1
- package/registry/blocks/about-approach-stack-cards/AboutApproachStackCards.tsx +305 -0
- package/registry/blocks/about-approach-stack-cards/index.ts +9 -0
- package/registry/blocks/about-bento/AboutBento.tsx +442 -0
- package/registry/blocks/about-bento/index.ts +9 -0
- package/registry/blocks/about-collage-hero/AboutCollageHero.tsx +285 -0
- package/registry/blocks/about-collage-hero/index.ts +8 -0
- package/registry/blocks/about-color-bento/AboutColorBento.tsx +235 -0
- package/registry/blocks/about-color-bento/index.ts +6 -0
- package/registry/blocks/about-culture-masonry/AboutCultureMasonry.tsx +305 -0
- package/registry/blocks/about-culture-masonry/index.ts +9 -0
- package/registry/blocks/about-headline-photos/AboutHeadlinePhotos.tsx +270 -0
- package/registry/blocks/about-headline-photos/index.ts +8 -0
- package/registry/blocks/about-impact-stats-band/AboutImpactStatsBand.test.tsx +45 -0
- package/registry/blocks/about-impact-stats-band/AboutImpactStatsBand.tsx +348 -0
- package/registry/blocks/about-impact-stats-band/index.ts +9 -0
- package/registry/blocks/about-letter-card/AboutLetterCard.tsx +403 -0
- package/registry/blocks/about-letter-card/index.ts +9 -0
- package/registry/blocks/about-mission-statement-hero/AboutMissionStatementHero.tsx +282 -0
- package/registry/blocks/about-mission-statement-hero/index.ts +8 -0
- package/registry/blocks/about-numbered-rows/AboutNumberedRows.tsx +289 -0
- package/registry/blocks/about-numbered-rows/index.ts +7 -0
- package/registry/blocks/about-split-panel/AboutSplitPanel.tsx +247 -0
- package/registry/blocks/about-split-panel/index.ts +8 -0
- package/registry/blocks/about-spotlight/AboutSpotlight.tsx +260 -0
- package/registry/blocks/about-spotlight/index.ts +7 -0
- package/registry/blocks/about-statement-band/AboutStatementBand.tsx +236 -0
- package/registry/blocks/about-statement-band/index.ts +7 -0
- package/registry/blocks/about-story-photos/AboutStoryPhotos.test.tsx +12 -0
- package/registry/blocks/about-story-photos/AboutStoryPhotos.tsx +252 -0
- package/registry/blocks/about-story-photos/index.ts +8 -0
- package/registry/blocks/about-story-snapshots/AboutStorySnapshots.tsx +239 -0
- package/registry/blocks/about-story-snapshots/index.ts +8 -0
- package/registry/blocks/about-type-stack/AboutTypeStack.tsx +205 -0
- package/registry/blocks/about-type-stack/index.ts +6 -0
- package/registry/blocks/about-values-connector-list/AboutValuesConnectorList.tsx +316 -0
- package/registry/blocks/about-values-connector-list/index.ts +7 -0
- package/registry/blocks/about-values-focus/AboutValuesFocus.tsx +303 -0
- package/registry/blocks/about-values-focus/index.ts +8 -0
- package/registry/blocks/about-values-spotlight/AboutValuesSpotlight.tsx +265 -0
- package/registry/blocks/about-values-spotlight/index.ts +8 -0
- package/registry/blocks/auth-centered-card-sign-in/AuthCenteredCardSignIn.tsx +373 -0
- package/registry/blocks/auth-centered-card-sign-in/index.ts +9 -0
- package/registry/blocks/auth-check-your-email/AuthCheckYourEmail.tsx +366 -0
- package/registry/blocks/auth-check-your-email/index.ts +7 -0
- package/registry/blocks/auth-forgot-password/AuthForgotPassword.tsx +265 -0
- package/registry/blocks/auth-forgot-password/index.ts +8 -0
- package/registry/blocks/auth-locked-session-re-authenticate/AuthLockedSessionReAuthenticate.tsx +305 -0
- package/registry/blocks/auth-locked-session-re-authenticate/index.ts +8 -0
- package/registry/blocks/auth-magic-link-request/AuthMagicLinkRequest.tsx +336 -0
- package/registry/blocks/auth-magic-link-request/index.ts +8 -0
- package/registry/blocks/auth-minimal-centered-sign-in/AuthMinimalCenteredSignIn.tsx +261 -0
- package/registry/blocks/auth-minimal-centered-sign-in/index.ts +8 -0
- package/registry/blocks/auth-multi-step-sign-up-wizard/AuthMultiStepSignUpWizard.tsx +460 -0
- package/registry/blocks/auth-multi-step-sign-up-wizard/index.ts +8 -0
- package/registry/blocks/auth-otp-verification/AuthOtpVerification.tsx +348 -0
- package/registry/blocks/auth-otp-verification/index.ts +7 -0
- package/registry/blocks/auth-passkey-sign-in/AuthPasskeySignIn.tsx +294 -0
- package/registry/blocks/auth-passkey-sign-in/index.ts +8 -0
- package/registry/blocks/auth-password-changed/AuthPasswordChanged.tsx +239 -0
- package/registry/blocks/auth-password-changed/index.ts +8 -0
- package/registry/blocks/auth-phone-number-sign-in/AuthPhoneNumberSignIn.tsx +402 -0
- package/registry/blocks/auth-phone-number-sign-in/index.ts +10 -0
- package/registry/blocks/auth-photo-background-sign-in/AuthPhotoBackgroundSignIn.tsx +398 -0
- package/registry/blocks/auth-photo-background-sign-in/index.ts +10 -0
- package/registry/blocks/auth-profile-setup-onboarding/AuthProfileSetupOnboarding.tsx +420 -0
- package/registry/blocks/auth-profile-setup-onboarding/index.ts +7 -0
- package/registry/blocks/auth-qr-device-login/AuthQrDeviceLogin.tsx +303 -0
- package/registry/blocks/auth-qr-device-login/index.ts +7 -0
- package/registry/blocks/auth-reset-password/AuthResetPassword.tsx +313 -0
- package/registry/blocks/auth-reset-password/index.ts +7 -0
- package/registry/blocks/auth-sign-in-error-state/AuthSignInErrorState.tsx +419 -0
- package/registry/blocks/auth-sign-in-error-state/index.ts +9 -0
- package/registry/blocks/auth-sign-up-benefits-column/AuthSignUpBenefitsColumn.tsx +481 -0
- package/registry/blocks/auth-sign-up-benefits-column/index.ts +10 -0
- package/registry/blocks/auth-sign-up-password-strength/AuthSignUpPasswordStrength.tsx +511 -0
- package/registry/blocks/auth-sign-up-password-strength/index.ts +8 -0
- package/registry/blocks/auth-social-first-sign-in/AuthSocialFirstSignIn.tsx +337 -0
- package/registry/blocks/auth-social-first-sign-in/index.ts +9 -0
- package/registry/blocks/auth-split-photo-sign-in/AuthSplitPhotoSignIn.tsx +472 -0
- package/registry/blocks/auth-split-photo-sign-in/index.ts +11 -0
- package/registry/blocks/auth-split-testimonial-sign-up/AuthSplitTestimonialSignUp.tsx +548 -0
- package/registry/blocks/auth-split-testimonial-sign-up/index.ts +11 -0
- package/registry/blocks/auth-tabbed-sign-in-sign-up/AuthTabbedSignInSignUp.tsx +566 -0
- package/registry/blocks/auth-tabbed-sign-in-sign-up/index.ts +11 -0
- package/registry/blocks/auth-team-invite-accept/AuthTeamInviteAccept.tsx +372 -0
- package/registry/blocks/auth-team-invite-accept/index.ts +9 -0
- package/registry/blocks/auth-two-factor-authenticator/AuthTwoFactorAuthenticator.tsx +333 -0
- package/registry/blocks/auth-two-factor-authenticator/index.ts +7 -0
- package/registry/blocks/auth-two-factor-method-chooser/AuthTwoFactorMethodChooser.tsx +290 -0
- package/registry/blocks/auth-two-factor-method-chooser/index.ts +8 -0
- package/registry/blocks/auth-waitlist-early-access/AuthWaitlistEarlyAccess.tsx +430 -0
- package/registry/blocks/auth-waitlist-early-access/index.ts +11 -0
- package/registry/blocks/blog-cards-alongside.test.tsx +176 -0
- package/registry/blocks/blog-cards-author-spotlight/BlogCardsAuthorSpotlight.tsx +342 -0
- package/registry/blocks/blog-cards-author-spotlight/index.ts +6 -0
- package/registry/blocks/blog-cards-bento-editorial-grid/BlogCardsBentoEditorialGrid.tsx +345 -0
- package/registry/blocks/blog-cards-bento-editorial-grid/index.ts +7 -0
- package/registry/blocks/blog-cards-browse.test.tsx +367 -0
- package/registry/blocks/blog-cards-classic-3-up-grid/BlogCardsClassic3UpGrid.tsx +287 -0
- package/registry/blocks/blog-cards-classic-3-up-grid/index.ts +7 -0
- package/registry/blocks/blog-cards-compact-4-up-thumb-grid/BlogCardsCompact4UpThumbGrid.tsx +265 -0
- package/registry/blocks/blog-cards-compact-4-up-thumb-grid/index.ts +7 -0
- package/registry/blocks/blog-cards-dark-editorial-feature/BlogCardsDarkEditorialFeature.tsx +287 -0
- package/registry/blocks/blog-cards-dark-editorial-feature/index.ts +6 -0
- package/registry/blocks/blog-cards-featured-two-up/BlogCardsFeaturedTwoUp.tsx +295 -0
- package/registry/blocks/blog-cards-featured-two-up/index.ts +7 -0
- package/registry/blocks/blog-cards-features.test.tsx +183 -0
- package/registry/blocks/blog-cards-filter-sidebar-results/BlogCardsFilterSidebarResults.tsx +582 -0
- package/registry/blocks/blog-cards-filter-sidebar-results/index.ts +6 -0
- package/registry/blocks/blog-cards-grids.test.tsx +110 -0
- package/registry/blocks/blog-cards-hairline-text-index/BlogCardsHairlineTextIndex.tsx +193 -0
- package/registry/blocks/blog-cards-hairline-text-index/index.ts +7 -0
- package/registry/blocks/blog-cards-journal-bento/BlogCardsJournalBento.tsx +409 -0
- package/registry/blocks/blog-cards-journal-bento/index.ts +8 -0
- package/registry/blocks/blog-cards-latest-popular-split/BlogCardsLatestPopularSplit.tsx +258 -0
- package/registry/blocks/blog-cards-latest-popular-split/index.ts +7 -0
- package/registry/blocks/blog-cards-lead-ranked-picks/BlogCardsLeadRankedPicks.tsx +276 -0
- package/registry/blocks/blog-cards-lead-ranked-picks/index.ts +6 -0
- package/registry/blocks/blog-cards-left-thumb-row-cards/BlogCardsLeftThumbRowCards.tsx +288 -0
- package/registry/blocks/blog-cards-left-thumb-row-cards/index.ts +7 -0
- package/registry/blocks/blog-cards-lists.test.tsx +93 -0
- package/registry/blocks/blog-cards-magazine-cover-story/BlogCardsMagazineCoverStory.tsx +326 -0
- package/registry/blocks/blog-cards-magazine-cover-story/index.ts +6 -0
- package/registry/blocks/blog-cards-newsletter-latest/BlogCardsNewsletterLatest.tsx +291 -0
- package/registry/blocks/blog-cards-newsletter-latest/index.ts +6 -0
- package/registry/blocks/blog-cards-numbered-reading-list/BlogCardsNumberedReadingList.tsx +275 -0
- package/registry/blocks/blog-cards-numbered-reading-list/index.ts +7 -0
- package/registry/blocks/blog-cards-overlay-photo-trio/BlogCardsOverlayPhotoTrio.tsx +279 -0
- package/registry/blocks/blog-cards-overlay-photo-trio/index.ts +7 -0
- package/registry/blocks/blog-cards-post-carousel-with-controls/BlogCardsPostCarouselWithControls.tsx +257 -0
- package/registry/blocks/blog-cards-post-carousel-with-controls/index.ts +6 -0
- package/registry/blocks/blog-cards-pull-quote-feature/BlogCardsPullQuoteFeature.tsx +245 -0
- package/registry/blocks/blog-cards-pull-quote-feature/index.ts +6 -0
- package/registry/blocks/blog-cards-related-posts-strip/BlogCardsRelatedPostsStrip.tsx +247 -0
- package/registry/blocks/blog-cards-related-posts-strip/index.ts +6 -0
- package/registry/blocks/blog-cards-search-chips-results/BlogCardsSearchChipsResults.tsx +473 -0
- package/registry/blocks/blog-cards-search-chips-results/index.ts +6 -0
- package/registry/blocks/blog-cards-split-feature/BlogCardsSplitFeature.tsx +214 -0
- package/registry/blocks/blog-cards-split-feature/index.ts +6 -0
- package/registry/blocks/careers/careers.test.tsx +414 -0
- package/registry/blocks/careers/careers.tsx +391 -0
- package/registry/blocks/careers/index.ts +27 -0
- package/registry/blocks/careers-about-card-role-list/CareersAboutCardRoleList.tsx +235 -0
- package/registry/blocks/careers-about-card-role-list/index.ts +8 -0
- package/registry/blocks/careers-featured-role-spotlight/CareersFeaturedRoleSpotlight.tsx +271 -0
- package/registry/blocks/careers-featured-role-spotlight/index.ts +8 -0
- package/registry/blocks/careers-no-open-roles-empty-state/CareersNoOpenRolesEmptyState.tsx +330 -0
- package/registry/blocks/careers-no-open-roles-empty-state/index.ts +8 -0
- package/registry/blocks/careers-open-roles-hairline-list/CareersOpenRolesHairlineList.tsx +320 -0
- package/registry/blocks/careers-open-roles-hairline-list/index.ts +6 -0
- package/registry/blocks/careers-open-vacancies-table/CareersOpenVacanciesTable.tsx +493 -0
- package/registry/blocks/careers-open-vacancies-table/index.ts +6 -0
- package/registry/blocks/careers-perks-benefits/CareersPerksBenefits.tsx +181 -0
- package/registry/blocks/careers-perks-benefits/index.ts +8 -0
- package/registry/blocks/careers-role-cards-grid/CareersRoleCardsGrid.tsx +405 -0
- package/registry/blocks/careers-role-cards-grid/index.ts +6 -0
- package/registry/blocks/careers-role-detail-page/CareersRoleDetailPage.tsx +541 -0
- package/registry/blocks/careers-role-detail-page/index.ts +10 -0
- package/registry/blocks/careers-role-detail-panel/CareersRoleDetailPanel.tsx +255 -0
- package/registry/blocks/careers-role-detail-panel/index.ts +6 -0
- package/registry/blocks/careers-roles-by-department/CareersRolesByDepartment.tsx +242 -0
- package/registry/blocks/careers-roles-by-department/index.ts +7 -0
- package/registry/blocks/careers-roles-list-accordion-expanded/CareersRolesListAccordionExpanded.tsx +558 -0
- package/registry/blocks/careers-roles-list-accordion-expanded/index.ts +9 -0
- package/registry/blocks/contact-us/contact-us.test.tsx +239 -0
- package/registry/blocks/contact-us/contact-us.tsx +989 -0
- package/registry/blocks/contact-us/index.ts +34 -0
- package/registry/blocks/contact-us-bento-grid/ContactUsBentoGrid.tsx +304 -0
- package/registry/blocks/contact-us-bento-grid/index.ts +5 -0
- package/registry/blocks/contact-us-bento-grid.test.tsx +102 -0
- package/registry/blocks/contact-us-book-a-call/ContactUsBookACall.tsx +403 -0
- package/registry/blocks/contact-us-book-a-call/index.ts +7 -0
- package/registry/blocks/contact-us-book-a-call.test.tsx +134 -0
- package/registry/blocks/contact-us-classic-centered/ContactUsClassicCentered.tsx +199 -0
- package/registry/blocks/contact-us-classic-centered/index.ts +6 -0
- package/registry/blocks/contact-us-dark-statement/ContactUsDarkStatement.tsx +218 -0
- package/registry/blocks/contact-us-dark-statement/index.ts +6 -0
- package/registry/blocks/contact-us-editorial-and-address-card/ContactUsEditorialAndAddressCard.tsx +212 -0
- package/registry/blocks/contact-us-editorial-and-address-card/index.ts +6 -0
- package/registry/blocks/contact-us-editorial-statement/ContactUsEditorialStatement.tsx +205 -0
- package/registry/blocks/contact-us-editorial-statement/index.ts +6 -0
- package/registry/blocks/contact-us-form-contact-methods/ContactUsFormContactMethods.tsx +272 -0
- package/registry/blocks/contact-us-form-contact-methods/index.ts +6 -0
- package/registry/blocks/contact-us-form-with-faq/ContactUsFormWithFaq.tsx +383 -0
- package/registry/blocks/contact-us-form-with-faq/index.ts +7 -0
- package/registry/blocks/contact-us-form-with-faq.test.tsx +161 -0
- package/registry/blocks/contact-us-forms.test.tsx +333 -0
- package/registry/blocks/contact-us-global-offices-table/ContactUsGlobalOfficesTable.tsx +301 -0
- package/registry/blocks/contact-us-global-offices-table/index.ts +5 -0
- package/registry/blocks/contact-us-global-offices-table.test.tsx +100 -0
- package/registry/blocks/contact-us-grand-headline-form/ContactUsGrandHeadlineForm.tsx +180 -0
- package/registry/blocks/contact-us-grand-headline-form/index.ts +6 -0
- package/registry/blocks/contact-us-hours-and-availability/ContactUsHoursAndAvailability.tsx +412 -0
- package/registry/blocks/contact-us-hours-and-availability/index.ts +5 -0
- package/registry/blocks/contact-us-hours-and-availability.test.tsx +123 -0
- package/registry/blocks/contact-us-hq-feature/ContactUsHqFeature.tsx +281 -0
- package/registry/blocks/contact-us-hq-feature/index.ts +5 -0
- package/registry/blocks/contact-us-hq-feature.test.tsx +102 -0
- package/registry/blocks/contact-us-map-split/ContactUsMapSplit.tsx +211 -0
- package/registry/blocks/contact-us-map-split/index.ts +5 -0
- package/registry/blocks/contact-us-map-split.test.tsx +70 -0
- package/registry/blocks/contact-us-named-owners/ContactUsNamedOwners.tsx +324 -0
- package/registry/blocks/contact-us-named-owners/index.ts +6 -0
- package/registry/blocks/contact-us-named-owners.test.tsx +116 -0
- package/registry/blocks/contact-us-newsletter-combo/ContactUsNewsletterCombo.tsx +363 -0
- package/registry/blocks/contact-us-newsletter-combo/index.ts +6 -0
- package/registry/blocks/contact-us-newsletter-combo.test.tsx +165 -0
- package/registry/blocks/contact-us-office-cards/ContactUsOfficeCards.tsx +235 -0
- package/registry/blocks/contact-us-office-cards/index.ts +5 -0
- package/registry/blocks/contact-us-office-cards.test.tsx +71 -0
- package/registry/blocks/contact-us-oversized-wordmark/ContactUsOversizedWordmark.tsx +222 -0
- package/registry/blocks/contact-us-oversized-wordmark/index.ts +6 -0
- package/registry/blocks/contact-us-photo-and-dark-panel/ContactUsPhotoAndDarkPanel.tsx +185 -0
- package/registry/blocks/contact-us-photo-and-dark-panel/index.ts +6 -0
- package/registry/blocks/contact-us-photo-forms.test.tsx +311 -0
- package/registry/blocks/contact-us-pitch-and-inquiry/ContactUsPitchAndInquiry.tsx +202 -0
- package/registry/blocks/contact-us-pitch-and-inquiry/index.ts +6 -0
- package/registry/blocks/contact-us-rtl.test.tsx +105 -0
- package/registry/blocks/contact-us-ruled-split-form/ContactUsRuledSplitForm.tsx +214 -0
- package/registry/blocks/contact-us-ruled-split-form/index.ts +6 -0
- package/registry/blocks/contact-us-social-rail/ContactUsSocialRail.tsx +270 -0
- package/registry/blocks/contact-us-social-rail/index.ts +7 -0
- package/registry/blocks/contact-us-social-rail.test.tsx +121 -0
- package/registry/blocks/contact-us-split-photo-dark/ContactUsSplitPhotoDark.tsx +185 -0
- package/registry/blocks/contact-us-split-photo-dark/index.ts +6 -0
- package/registry/blocks/contact-us-support-channels/ContactUsSupportChannels.tsx +267 -0
- package/registry/blocks/contact-us-support-channels/index.ts +5 -0
- package/registry/blocks/contact-us-support-channels.test.tsx +81 -0
- package/registry/blocks/data-table/DataTable.test.tsx +1 -34
- package/registry/blocks/data-table/DataTable.tsx +0 -139
- package/registry/blocks/data-table/index.ts +1 -8
- package/registry/blocks/error-state-access-denied-403/ErrorStateAccessDenied403.tsx +324 -0
- package/registry/blocks/error-state-access-denied-403/index.ts +10 -0
- package/registry/blocks/error-state-broken-trail-breadcrumb/ErrorStateBrokenTrailBreadcrumb.tsx +179 -0
- package/registry/blocks/error-state-broken-trail-breadcrumb/index.ts +8 -0
- package/registry/blocks/error-state-centered-minimal/ErrorStateCenteredMinimal.tsx +119 -0
- package/registry/blocks/error-state-centered-minimal/index.ts +7 -0
- package/registry/blocks/error-state-colour-field-scatter/ErrorStateColourFieldScatter.tsx +144 -0
- package/registry/blocks/error-state-colour-field-scatter/index.ts +7 -0
- package/registry/blocks/error-state-countdown-redirect/ErrorStateCountdownRedirect.tsx +272 -0
- package/registry/blocks/error-state-countdown-redirect/index.ts +7 -0
- package/registry/blocks/error-state-dark-spotlight/ErrorStateDarkSpotlight.tsx +156 -0
- package/registry/blocks/error-state-dark-spotlight/index.ts +7 -0
- package/registry/blocks/error-state-display-numeral-split/ErrorStateDisplayNumeralSplit.tsx +156 -0
- package/registry/blocks/error-state-display-numeral-split/index.ts +8 -0
- package/registry/blocks/error-state-editorial-photo-split/ErrorStateEditorialPhotoSplit.tsx +156 -0
- package/registry/blocks/error-state-editorial-photo-split/index.ts +8 -0
- package/registry/blocks/error-state-empty-search-results/ErrorStateEmptySearchResults.tsx +243 -0
- package/registry/blocks/error-state-empty-search-results/index.ts +6 -0
- package/registry/blocks/error-state-error-card-panel/ErrorStateErrorCardPanel.tsx +213 -0
- package/registry/blocks/error-state-error-card-panel/index.ts +7 -0
- package/registry/blocks/error-state-full-bleed-photo/ErrorStateFullBleedPhoto.tsx +130 -0
- package/registry/blocks/error-state-full-bleed-photo/index.ts +8 -0
- package/registry/blocks/error-state-ghost-watermark/ErrorStateGhostWatermark.tsx +115 -0
- package/registry/blocks/error-state-ghost-watermark/index.ts +7 -0
- package/registry/blocks/error-state-helpful-links-list/ErrorStateHelpfulLinksList.tsx +185 -0
- package/registry/blocks/error-state-helpful-links-list/index.ts +8 -0
- package/registry/blocks/error-state-illustrated-empty-state/ErrorStateIllustratedEmptyState.tsx +201 -0
- package/registry/blocks/error-state-illustrated-empty-state/index.ts +7 -0
- package/registry/blocks/error-state-layered-badge-centered/ErrorStateLayeredBadgeCentered.tsx +138 -0
- package/registry/blocks/error-state-layered-badge-centered/index.ts +7 -0
- package/registry/blocks/error-state-light-editorial/ErrorStateLightEditorial.tsx +126 -0
- package/registry/blocks/error-state-light-editorial/index.ts +7 -0
- package/registry/blocks/error-state-maintenance-mode/ErrorStateMaintenanceMode.tsx +255 -0
- package/registry/blocks/error-state-maintenance-mode/index.ts +6 -0
- package/registry/blocks/error-state-marquee-404-band/ErrorStateMarquee404Band.tsx +316 -0
- package/registry/blocks/error-state-marquee-404-band/index.ts +7 -0
- package/registry/blocks/error-state-offline-state/ErrorStateOfflineState.tsx +188 -0
- package/registry/blocks/error-state-offline-state/index.ts +7 -0
- package/registry/blocks/error-state-photo-collage-scatter/ErrorStatePhotoCollageScatter.tsx +224 -0
- package/registry/blocks/error-state-photo-collage-scatter/index.ts +8 -0
- package/registry/blocks/error-state-popular-pages-grid/ErrorStatePopularPagesGrid.tsx +195 -0
- package/registry/blocks/error-state-popular-pages-grid/index.ts +9 -0
- package/registry/blocks/error-state-recovery-bento/ErrorStateRecoveryBento.tsx +274 -0
- package/registry/blocks/error-state-recovery-bento/index.ts +7 -0
- package/registry/blocks/error-state-search-recovery/ErrorStateSearchRecovery.tsx +173 -0
- package/registry/blocks/error-state-search-recovery/index.ts +7 -0
- package/registry/blocks/error-state-server-error-500/ErrorStateServerError500.tsx +277 -0
- package/registry/blocks/error-state-server-error-500/index.ts +9 -0
- package/registry/blocks/error-state-sitemap-columns/ErrorStateSitemapColumns.tsx +192 -0
- package/registry/blocks/error-state-sitemap-columns/index.ts +9 -0
- package/registry/blocks/error-state-split-colour-panel/ErrorStateSplitColourPanel.tsx +156 -0
- package/registry/blocks/error-state-split-colour-panel/index.ts +7 -0
- package/registry/blocks/error-state-support-escalation-band/ErrorStateSupportEscalationBand.tsx +186 -0
- package/registry/blocks/error-state-support-escalation-band/index.ts +8 -0
- package/registry/blocks/error-state-terminal-console/ErrorStateTerminalConsole.tsx +208 -0
- package/registry/blocks/error-state-terminal-console/index.ts +8 -0
- package/registry/blocks/faq-accent-active-card/FaqAccentActiveCard.tsx +186 -0
- package/registry/blocks/faq-accent-active-card/index.ts +1 -0
- package/registry/blocks/faq-category-chip-grid/FaqCategoryChipGrid.tsx +425 -0
- package/registry/blocks/faq-category-chip-grid/index.ts +8 -0
- package/registry/blocks/faq-category-columns/FaqCategoryColumns.tsx +248 -0
- package/registry/blocks/faq-category-columns/index.ts +8 -0
- package/registry/blocks/faq-chat-thread/FaqChatThread.tsx +273 -0
- package/registry/blocks/faq-chat-thread/index.ts +7 -0
- package/registry/blocks/faq-classic-centered/FaqClassicCentered.tsx +190 -0
- package/registry/blocks/faq-classic-centered/index.ts +7 -0
- package/registry/blocks/faq-contact-cta-card/FaqContactCtaCard.tsx +229 -0
- package/registry/blocks/faq-contact-cta-card/index.ts +9 -0
- package/registry/blocks/faq-dark-panel/FaqDarkPanel.tsx +186 -0
- package/registry/blocks/faq-dark-panel/index.ts +1 -0
- package/registry/blocks/faq-featured-question/FaqFeaturedQuestion.tsx +221 -0
- package/registry/blocks/faq-featured-question/index.ts +1 -0
- package/registry/blocks/faq-grouped-sections/FaqGroupedSections.tsx +266 -0
- package/registry/blocks/faq-grouped-sections/index.ts +8 -0
- package/registry/blocks/faq-help-hero-popular/FaqHelpHeroPopular.tsx +212 -0
- package/registry/blocks/faq-help-hero-popular/index.ts +7 -0
- package/registry/blocks/faq-masonry-cards/FaqMasonryCards.tsx +268 -0
- package/registry/blocks/faq-masonry-cards/index.ts +7 -0
- package/registry/blocks/faq-media-split/FaqMediaSplit.tsx +197 -0
- package/registry/blocks/faq-media-split/index.ts +8 -0
- package/registry/blocks/faq-mono-index/FaqMonoIndex.tsx +247 -0
- package/registry/blocks/faq-mono-index/index.ts +1 -0
- package/registry/blocks/faq-newsletter-close/FaqNewsletterClose.tsx +314 -0
- package/registry/blocks/faq-newsletter-close/index.ts +8 -0
- package/registry/blocks/faq-numbered-editorial/FaqNumberedEditorial.tsx +190 -0
- package/registry/blocks/faq-numbered-editorial/index.ts +1 -0
- package/registry/blocks/faq-search-categories/FaqSearchCategories.tsx +312 -0
- package/registry/blocks/faq-search-categories/index.ts +8 -0
- package/registry/blocks/faq-sidebar-nav/FaqSidebarNav.tsx +390 -0
- package/registry/blocks/faq-sidebar-nav/index.ts +8 -0
- package/registry/blocks/faq-soft-filled-rows/FaqSoftFilledRows.tsx +209 -0
- package/registry/blocks/faq-soft-filled-rows/index.ts +1 -0
- package/registry/blocks/faq-split-sticky/FaqSplitSticky.tsx +205 -0
- package/registry/blocks/faq-split-sticky/index.ts +7 -0
- package/registry/blocks/faq-support-channels/FaqSupportChannels.tsx +266 -0
- package/registry/blocks/faq-support-channels/index.ts +8 -0
- package/registry/blocks/faq-support-stats/FaqSupportStats.tsx +242 -0
- package/registry/blocks/faq-support-stats/index.ts +8 -0
- package/registry/blocks/faq-table-compact/FaqTableCompact.tsx +220 -0
- package/registry/blocks/faq-table-compact/index.ts +1 -0
- package/registry/blocks/faq-tabs-by-topic/FaqTabsByTopic.tsx +347 -0
- package/registry/blocks/faq-tabs-by-topic/index.ts +8 -0
- package/registry/blocks/faq-topic-tiles/FaqTopicTiles.tsx +254 -0
- package/registry/blocks/faq-topic-tiles/index.ts +7 -0
- package/registry/blocks/faq-two-column-grid/FaqTwoColumnGrid.tsx +256 -0
- package/registry/blocks/faq-two-column-grid/index.ts +7 -0
- package/registry/blocks/faq-uppercase-dense/FaqUppercaseDense.tsx +213 -0
- package/registry/blocks/faq-uppercase-dense/index.ts +1 -0
- package/registry/blocks/features/features.tsx +164 -0
- package/registry/blocks/features/index.ts +12 -0
- package/registry/blocks/features-accordion-photo/FeaturesAccordionPhoto.tsx +149 -0
- package/registry/blocks/features-accordion-photo/index.ts +7 -0
- package/registry/blocks/features-colour-block-cards/FeaturesColourBlockCards.tsx +118 -0
- package/registry/blocks/features-colour-block-cards/index.ts +8 -0
- package/registry/blocks/features-compact-icon-index/FeaturesCompactIconIndex.tsx +136 -0
- package/registry/blocks/features-compact-icon-index/index.ts +7 -0
- package/registry/blocks/features-compare-panels-chat-answer/FeaturesComparePanelsChatAnswer.tsx +346 -0
- package/registry/blocks/features-compare-panels-chat-answer/index.ts +8 -0
- package/registry/blocks/features-editorial-photo-split/FeaturesEditorialPhotoSplit.tsx +118 -0
- package/registry/blocks/features-editorial-photo-split/index.ts +7 -0
- package/registry/blocks/features-expanding-step-cards/FeaturesExpandingStepCards.tsx +300 -0
- package/registry/blocks/features-expanding-step-cards/index.ts +7 -0
- package/registry/blocks/features-feature-checklist-columns/FeaturesFeatureChecklistColumns.tsx +158 -0
- package/registry/blocks/features-feature-checklist-columns/index.ts +7 -0
- package/registry/blocks/features-feature-list-thumbnails/FeaturesFeatureListThumbnails.tsx +137 -0
- package/registry/blocks/features-feature-list-thumbnails/index.ts +7 -0
- package/registry/blocks/features-full-bleed-photo-banner/FeaturesFullBleedPhotoBanner.tsx +116 -0
- package/registry/blocks/features-full-bleed-photo-banner/index.ts +7 -0
- package/registry/blocks/features-icon-card-grid/FeaturesIconCardGrid.tsx +120 -0
- package/registry/blocks/features-icon-card-grid/index.ts +7 -0
- package/registry/blocks/features-icon-titled-preview-rail/FeaturesIconTitledPreviewRail.tsx +321 -0
- package/registry/blocks/features-icon-titled-preview-rail/index.ts +7 -0
- package/registry/blocks/features-icons-numbers.test.tsx +107 -0
- package/registry/blocks/features-interactive.test.tsx +175 -0
- package/registry/blocks/features-media-rail/FeaturesMediaRail.tsx +119 -0
- package/registry/blocks/features-media-rail/index.ts +7 -0
- package/registry/blocks/features-notched-photo-columns/FeaturesNotchedPhotoColumns.tsx +209 -0
- package/registry/blocks/features-notched-photo-columns/index.ts +7 -0
- package/registry/blocks/features-numbered-feature-rows/FeaturesNumberedFeatureRows.tsx +107 -0
- package/registry/blocks/features-numbered-feature-rows/index.ts +7 -0
- package/registry/blocks/features-numbered-steps-floating-cards/FeaturesNumberedStepsFloatingCards.tsx +324 -0
- package/registry/blocks/features-numbered-steps-floating-cards/index.ts +8 -0
- package/registry/blocks/features-perforated-photo-strip/FeaturesPerforatedPhotoStrip.tsx +218 -0
- package/registry/blocks/features-perforated-photo-strip/index.ts +7 -0
- package/registry/blocks/features-photo-bento/FeaturesPhotoBento.tsx +160 -0
- package/registry/blocks/features-photo-bento/index.ts +8 -0
- package/registry/blocks/features-photo-carousel/FeaturesPhotoCarousel.tsx +249 -0
- package/registry/blocks/features-photo-carousel/index.ts +7 -0
- package/registry/blocks/features-photo-collage/FeaturesPhotoCollage.tsx +143 -0
- package/registry/blocks/features-photo-collage/index.ts +7 -0
- package/registry/blocks/features-photo-feature-chips/FeaturesPhotoFeatureChips.tsx +125 -0
- package/registry/blocks/features-photo-feature-chips/index.ts +7 -0
- package/registry/blocks/features-photo-led.test.tsx +177 -0
- package/registry/blocks/features-photo-tabs-panel/FeaturesPhotoTabsPanel.tsx +197 -0
- package/registry/blocks/features-photo-tabs-panel/index.ts +7 -0
- package/registry/blocks/features-portrait-photo-cards-link-row/FeaturesPortraitPhotoCardsLinkRow.tsx +202 -0
- package/registry/blocks/features-portrait-photo-cards-link-row/index.ts +7 -0
- package/registry/blocks/features-product-in-use.test.tsx +188 -0
- package/registry/blocks/features-showcase-card-pair/FeaturesShowcaseCardPair.tsx +161 -0
- package/registry/blocks/features-showcase-card-pair/index.ts +7 -0
- package/registry/blocks/features-solid-colour-cards/FeaturesSolidColourCards.tsx +264 -0
- package/registry/blocks/features-solid-colour-cards/index.ts +7 -0
- package/registry/blocks/features-split-photo-icon-list/FeaturesSplitPhotoIconList.tsx +117 -0
- package/registry/blocks/features-split-photo-icon-list/index.ts +7 -0
- package/registry/blocks/features-stat-feature-band/FeaturesStatFeatureBand.tsx +114 -0
- package/registry/blocks/features-stat-feature-band/index.ts +7 -0
- package/registry/blocks/features-tinted-product-bento/FeaturesTintedProductBento.tsx +252 -0
- package/registry/blocks/features-tinted-product-bento/index.ts +7 -0
- package/registry/blocks/footer/footer.test.tsx +253 -0
- package/registry/blocks/footer/footer.tsx +554 -0
- package/registry/blocks/footer/index.ts +31 -0
- package/registry/blocks/footer-accordion-sitemap/FooterAccordionSitemap.tsx +260 -0
- package/registry/blocks/footer-accordion-sitemap/index.ts +7 -0
- package/registry/blocks/footer-bars.test.tsx +121 -0
- package/registry/blocks/footer-bento-tile/FooterBentoTile.tsx +331 -0
- package/registry/blocks/footer-bento-tile/index.ts +6 -0
- package/registry/blocks/footer-big-question-cta/FooterBigQuestionCta.tsx +250 -0
- package/registry/blocks/footer-big-question-cta/index.ts +6 -0
- package/registry/blocks/footer-big-type-link-stack/FooterBigTypeLinkStack.tsx +275 -0
- package/registry/blocks/footer-big-type-link-stack/index.ts +6 -0
- package/registry/blocks/footer-brand-panel-split/FooterBrandPanelSplit.tsx +163 -0
- package/registry/blocks/footer-brand-panel-split/index.ts +6 -0
- package/registry/blocks/footer-brand.test.tsx +608 -0
- package/registry/blocks/footer-careers-culture/FooterCareersCulture.tsx +297 -0
- package/registry/blocks/footer-careers-culture/index.ts +7 -0
- package/registry/blocks/footer-centered-brand-minimal/FooterCenteredBrandMinimal.tsx +121 -0
- package/registry/blocks/footer-centered-brand-minimal/index.ts +6 -0
- package/registry/blocks/footer-commerce.test.tsx +208 -0
- package/registry/blocks/footer-community-events/FooterCommunityEvents.tsx +263 -0
- package/registry/blocks/footer-community-events/index.ts +8 -0
- package/registry/blocks/footer-community.test.tsx +309 -0
- package/registry/blocks/footer-contact-first/FooterContactFirst.tsx +242 -0
- package/registry/blocks/footer-contact-first/index.ts +7 -0
- package/registry/blocks/footer-contact.test.tsx +285 -0
- package/registry/blocks/footer-controls.test.tsx +78 -0
- package/registry/blocks/footer-cta-band-columns/FooterCtaBandColumns.tsx +225 -0
- package/registry/blocks/footer-cta-band-columns/index.ts +6 -0
- package/registry/blocks/footer-cta.test.tsx +445 -0
- package/registry/blocks/footer-dashboard-slim-bar/FooterDashboardSlimBar.tsx +148 -0
- package/registry/blocks/footer-dashboard-slim-bar/index.ts +6 -0
- package/registry/blocks/footer-docs-page/FooterDocsPage.tsx +261 -0
- package/registry/blocks/footer-docs-page/index.ts +9 -0
- package/registry/blocks/footer-ecommerce-mega/FooterEcommerceMega.tsx +289 -0
- package/registry/blocks/footer-ecommerce-mega/index.ts +6 -0
- package/registry/blocks/footer-floating-demo-card/FooterFloatingDemoCard.tsx +261 -0
- package/registry/blocks/footer-floating-demo-card/index.ts +6 -0
- package/registry/blocks/footer-four-column-directory/FooterFourColumnDirectory.tsx +104 -0
- package/registry/blocks/footer-four-column-directory/index.ts +6 -0
- package/registry/blocks/footer-giant-wordmark/FooterGiantWordmark.tsx +252 -0
- package/registry/blocks/footer-giant-wordmark/index.ts +6 -0
- package/registry/blocks/footer-image-backed-brand/FooterImageBackedBrand.tsx +251 -0
- package/registry/blocks/footer-image-backed-brand/index.ts +6 -0
- package/registry/blocks/footer-index-numbered-columns/FooterIndexNumberedColumns.tsx +236 -0
- package/registry/blocks/footer-index-numbered-columns/index.ts +7 -0
- package/registry/blocks/footer-inline-preferences/FooterInlinePreferences.tsx +164 -0
- package/registry/blocks/footer-inline-preferences/index.ts +7 -0
- package/registry/blocks/footer-legal-first-slim/FooterLegalFirstSlim.tsx +174 -0
- package/registry/blocks/footer-legal-first-slim/index.ts +6 -0
- package/registry/blocks/footer-legal.test.tsx +180 -0
- package/registry/blocks/footer-local-business/FooterLocalBusiness.tsx +258 -0
- package/registry/blocks/footer-local-business/index.ts +7 -0
- package/registry/blocks/footer-marquee-strip/FooterMarqueeStrip.tsx +244 -0
- package/registry/blocks/footer-marquee-strip/index.ts +6 -0
- package/registry/blocks/footer-multi-region/FooterMultiRegion.tsx +310 -0
- package/registry/blocks/footer-multi-region/index.ts +7 -0
- package/registry/blocks/footer-newsletter-split/FooterNewsletterSplit.tsx +255 -0
- package/registry/blocks/footer-newsletter-split/index.ts +6 -0
- package/registry/blocks/footer-product-family-switcher/FooterProductFamilySwitcher.tsx +241 -0
- package/registry/blocks/footer-product-family-switcher/index.ts +7 -0
- package/registry/blocks/footer-service-promise-band/FooterServicePromiseBand.tsx +237 -0
- package/registry/blocks/footer-service-promise-band/index.ts +7 -0
- package/registry/blocks/footer-single-line-bar/FooterSingleLineBar.tsx +107 -0
- package/registry/blocks/footer-single-line-bar/index.ts +6 -0
- package/registry/blocks/footer-sitemap.test.tsx +390 -0
- package/registry/blocks/footer-split-hairline-micro/FooterSplitHairlineMicro.tsx +100 -0
- package/registry/blocks/footer-split-hairline-micro/index.ts +6 -0
- package/registry/blocks/footer-support-contact/FooterSupportContact.tsx +204 -0
- package/registry/blocks/footer-support-contact/index.ts +7 -0
- package/registry/blocks/footer-trust-compliance/FooterTrustCompliance.tsx +234 -0
- package/registry/blocks/footer-trust-compliance/index.ts +7 -0
- package/registry/blocks/footer-two-row-compact/FooterTwoRowCompact.tsx +124 -0
- package/registry/blocks/footer-two-row-compact/index.ts +6 -0
- package/registry/blocks/footer-two-tier-doormat/FooterTwoTierDoormat.tsx +232 -0
- package/registry/blocks/footer-two-tier-doormat/index.ts +8 -0
- package/registry/blocks/footer-utility.test.tsx +406 -0
- package/registry/blocks/footer-wide-sitemap-mega/FooterWideSitemapMega.tsx +227 -0
- package/registry/blocks/footer-wide-sitemap-mega/index.ts +6 -0
- package/registry/blocks/gallery-album-cards/GalleryAlbumCards.tsx +243 -0
- package/registry/blocks/gallery-album-cards/index.ts +8 -0
- package/registry/blocks/gallery-before-after-compare/GalleryBeforeAfterCompare.tsx +269 -0
- package/registry/blocks/gallery-before-after-compare/index.ts +7 -0
- package/registry/blocks/gallery-contact-sheet-wall/GalleryContactSheetWall.tsx +299 -0
- package/registry/blocks/gallery-contact-sheet-wall/index.ts +9 -0
- package/registry/blocks/gallery-culture-photo-grid/GalleryCulturePhotoGrid.tsx +203 -0
- package/registry/blocks/gallery-culture-photo-grid/index.ts +8 -0
- package/registry/blocks/gallery-dark-cinema-wall/GalleryDarkCinemaWall.tsx +180 -0
- package/registry/blocks/gallery-dark-cinema-wall/index.ts +7 -0
- package/registry/blocks/gallery-editorial-split/GalleryEditorialSplit.tsx +188 -0
- package/registry/blocks/gallery-editorial-split/index.ts +8 -0
- package/registry/blocks/gallery-featured-thumb-rail/GalleryFeaturedThumbRail.tsx +397 -0
- package/registry/blocks/gallery-featured-thumb-rail/index.ts +8 -0
- package/registry/blocks/gallery-filmstrip-carousel/GalleryFilmstripCarousel.tsx +384 -0
- package/registry/blocks/gallery-filmstrip-carousel/index.ts +8 -0
- package/registry/blocks/gallery-filter-tabs-grid/GalleryFilterTabsGrid.tsx +403 -0
- package/registry/blocks/gallery-filter-tabs-grid/index.ts +9 -0
- package/registry/blocks/gallery-full-bleed-slider/GalleryFullBleedSlider.tsx +309 -0
- package/registry/blocks/gallery-full-bleed-slider/index.ts +8 -0
- package/registry/blocks/gallery-horizontal-scroll-rail/GalleryHorizontalScrollRail.tsx +300 -0
- package/registry/blocks/gallery-horizontal-scroll-rail/index.ts +8 -0
- package/registry/blocks/gallery-hover-caption-cards/GalleryHoverCaptionCards.tsx +244 -0
- package/registry/blocks/gallery-hover-caption-cards/index.ts +8 -0
- package/registry/blocks/gallery-hover-index-list/GalleryHoverIndexList.tsx +253 -0
- package/registry/blocks/gallery-hover-index-list/index.ts +9 -0
- package/registry/blocks/gallery-lightbox-viewer/GalleryLightboxViewer.tsx +329 -0
- package/registry/blocks/gallery-lightbox-viewer/index.ts +7 -0
- package/registry/blocks/gallery-masonry-gallery/GalleryMasonryGallery.tsx +251 -0
- package/registry/blocks/gallery-masonry-gallery/index.ts +7 -0
- package/registry/blocks/gallery-mosaic-statement-tile/GalleryMosaicStatementTile.tsx +159 -0
- package/registry/blocks/gallery-mosaic-statement-tile/index.ts +8 -0
- package/registry/blocks/gallery-photo-bento/GalleryPhotoBento.tsx +166 -0
- package/registry/blocks/gallery-photo-bento/index.ts +8 -0
- package/registry/blocks/gallery-photo-spotlight/GalleryPhotoSpotlight.tsx +305 -0
- package/registry/blocks/gallery-photo-spotlight/index.ts +9 -0
- package/registry/blocks/gallery-scattered-collage/GalleryScatteredCollage.tsx +286 -0
- package/registry/blocks/gallery-scattered-collage/index.ts +9 -0
- package/registry/blocks/gallery-social-feed-strip/GallerySocialFeedStrip.tsx +288 -0
- package/registry/blocks/gallery-social-feed-strip/index.ts +8 -0
- package/registry/blocks/gallery-timeline-gallery/GalleryTimelineGallery.tsx +243 -0
- package/registry/blocks/gallery-timeline-gallery/index.ts +8 -0
- package/registry/blocks/gallery-video-gallery/GalleryVideoGallery.tsx +362 -0
- package/registry/blocks/gallery-video-gallery/index.ts +8 -0
- package/registry/blocks/hero-annotated-object/HeroAnnotatedObject.tsx +310 -0
- package/registry/blocks/hero-annotated-object/index.ts +10 -0
- package/registry/blocks/hero-arc-gallery/HeroArcGallery.tsx +244 -0
- package/registry/blocks/hero-arc-gallery/index.ts +9 -0
- package/registry/blocks/hero-bento-split/HeroBentoSplit.tsx +266 -0
- package/registry/blocks/hero-bento-split/index.ts +9 -0
- package/registry/blocks/hero-brand-color-block/HeroBrandColorBlock.tsx +259 -0
- package/registry/blocks/hero-brand-color-block/index.ts +8 -0
- package/registry/blocks/hero-colour-stage/HeroColourStage.tsx +292 -0
- package/registry/blocks/hero-colour-stage/index.ts +8 -0
- package/registry/blocks/hero-component-pattern/HeroComponentPattern.tsx +248 -0
- package/registry/blocks/hero-component-pattern/index.ts +9 -0
- package/registry/blocks/hero-curved-media-rail/HeroCurvedMediaRail.tsx +272 -0
- package/registry/blocks/hero-curved-media-rail/index.ts +8 -0
- package/registry/blocks/hero-duo-card/HeroDuoCard.tsx +210 -0
- package/registry/blocks/hero-duo-card/index.ts +8 -0
- package/registry/blocks/hero-editorial-arch/HeroEditorialArch.tsx +226 -0
- package/registry/blocks/hero-editorial-arch/index.ts +10 -0
- package/registry/blocks/hero-editorial-triptych/HeroEditorialTriptych.tsx +252 -0
- package/registry/blocks/hero-editorial-triptych/index.ts +9 -0
- package/registry/blocks/hero-floating-integrations/HeroFloatingIntegrations.tsx +454 -0
- package/registry/blocks/hero-floating-integrations/index.ts +11 -0
- package/registry/blocks/hero-framed-full-bleed/HeroFramedFullBleed.tsx +226 -0
- package/registry/blocks/hero-framed-full-bleed/index.ts +9 -0
- package/registry/blocks/hero-framed-studio-card/HeroFramedStudioCard.tsx +264 -0
- package/registry/blocks/hero-framed-studio-card/index.ts +8 -0
- package/registry/blocks/hero-illustration-split/HeroIllustrationSplit.tsx +200 -0
- package/registry/blocks/hero-illustration-split/index.ts +8 -0
- package/registry/blocks/hero-inline-image-headline/HeroInlineImageHeadline.tsx +305 -0
- package/registry/blocks/hero-inline-image-headline/index.ts +8 -0
- package/registry/blocks/hero-masked-type-reveal/HeroMaskedTypeReveal.tsx +323 -0
- package/registry/blocks/hero-masked-type-reveal/index.ts +9 -0
- package/registry/blocks/hero-motion.test.tsx +185 -0
- package/registry/blocks/hero-orbit-track/HeroOrbitTrack.tsx +238 -0
- package/registry/blocks/hero-orbit-track/index.ts +8 -0
- package/registry/blocks/hero-photo-constellation/HeroPhotoConstellation.tsx +228 -0
- package/registry/blocks/hero-photo-constellation/index.ts +8 -0
- package/registry/blocks/hero-scramble-decode/HeroScrambleDecode.tsx +381 -0
- package/registry/blocks/hero-scramble-decode/index.ts +7 -0
- package/registry/blocks/hero-shape-grid/HeroShapeGrid.tsx +279 -0
- package/registry/blocks/hero-shape-grid/index.ts +8 -0
- package/registry/blocks/hero-split-band-headline/HeroSplitBandHeadline.tsx +242 -0
- package/registry/blocks/hero-split-band-headline/index.ts +8 -0
- package/registry/blocks/hero-split-flap-counters/HeroSplitFlapCounters.tsx +323 -0
- package/registry/blocks/hero-split-flap-counters/index.ts +8 -0
- package/registry/blocks/hero-studio-mosaic/HeroStudioMosaic.tsx +332 -0
- package/registry/blocks/hero-studio-mosaic/index.ts +9 -0
- package/registry/blocks/hero-textured-dark/HeroTexturedDark.tsx +378 -0
- package/registry/blocks/hero-textured-dark/index.ts +10 -0
- package/registry/blocks/hero-twin-panels/HeroTwinPanels.tsx +231 -0
- package/registry/blocks/hero-twin-panels/index.ts +9 -0
- package/registry/blocks/hero-velocity-marquee/HeroVelocityMarquee.tsx +392 -0
- package/registry/blocks/hero-velocity-marquee/index.ts +8 -0
- package/registry/blocks/hero-video-in-type/HeroVideoInType.tsx +374 -0
- package/registry/blocks/hero-video-in-type/index.ts +9 -0
- package/registry/blocks/hero-video-spotlight/HeroVideoSpotlight.tsx +292 -0
- package/registry/blocks/hero-video-spotlight/index.ts +9 -0
- package/registry/blocks/hero-wave-band/HeroWaveBand.tsx +309 -0
- package/registry/blocks/hero-wave-band/index.ts +8 -0
- package/registry/blocks/how-it-works/how-it-works.tsx +330 -0
- package/registry/blocks/how-it-works/index.ts +28 -0
- package/registry/blocks/how-it-works-accordion-steps/HowItWorksAccordionSteps.tsx +213 -0
- package/registry/blocks/how-it-works-accordion-steps/index.ts +7 -0
- package/registry/blocks/how-it-works-center-spine-timeline/HowItWorksCenterSpineTimeline.tsx +200 -0
- package/registry/blocks/how-it-works-center-spine-timeline/index.ts +7 -0
- package/registry/blocks/how-it-works-column-panels/HowItWorksColumnPanels.tsx +299 -0
- package/registry/blocks/how-it-works-column-panels/index.ts +6 -0
- package/registry/blocks/how-it-works-contained-timeline/HowItWorksContainedTimeline.tsx +223 -0
- package/registry/blocks/how-it-works-contained-timeline/index.ts +8 -0
- package/registry/blocks/how-it-works-diagonal-photo-collage/HowItWorksDiagonalPhotoCollage.tsx +170 -0
- package/registry/blocks/how-it-works-diagonal-photo-collage/index.ts +7 -0
- package/registry/blocks/how-it-works-fanned-dissolve-cards/HowItWorksFannedDissolveCards.tsx +258 -0
- package/registry/blocks/how-it-works-fanned-dissolve-cards/index.ts +8 -0
- package/registry/blocks/how-it-works-full-bleed-step-panel/HowItWorksFullBleedStepPanel.tsx +319 -0
- package/registry/blocks/how-it-works-full-bleed-step-panel/index.ts +7 -0
- package/registry/blocks/how-it-works-grids.test.tsx +292 -0
- package/registry/blocks/how-it-works-interactive.test.tsx +262 -0
- package/registry/blocks/how-it-works-numbered-editorial-rows/HowItWorksNumberedEditorialRows.tsx +177 -0
- package/registry/blocks/how-it-works-numbered-editorial-rows/index.ts +7 -0
- package/registry/blocks/how-it-works-numbered-instruction-panels/HowItWorksNumberedInstructionPanels.tsx +226 -0
- package/registry/blocks/how-it-works-numbered-instruction-panels/index.ts +6 -0
- package/registry/blocks/how-it-works-numbered-photo-steps/HowItWorksNumberedPhotoSteps.tsx +150 -0
- package/registry/blocks/how-it-works-numbered-photo-steps/index.ts +7 -0
- package/registry/blocks/how-it-works-orbital-process/HowItWorksOrbitalProcess.tsx +317 -0
- package/registry/blocks/how-it-works-orbital-process/index.ts +7 -0
- package/registry/blocks/how-it-works-overlay-numeral-cards/HowItWorksOverlayNumeralCards.tsx +145 -0
- package/registry/blocks/how-it-works-overlay-numeral-cards/index.ts +7 -0
- package/registry/blocks/how-it-works-phase-line/HowItWorksPhaseLine.tsx +147 -0
- package/registry/blocks/how-it-works-phase-line/index.ts +8 -0
- package/registry/blocks/how-it-works-photo-bento-steps/HowItWorksPhotoBentoSteps.tsx +178 -0
- package/registry/blocks/how-it-works-photo-bento-steps/index.ts +7 -0
- package/registry/blocks/how-it-works-photo-rail-progress/HowItWorksPhotoRailProgress.tsx +231 -0
- package/registry/blocks/how-it-works-photo-rail-progress/index.ts +7 -0
- package/registry/blocks/how-it-works-pill-timeline/HowItWorksPillTimeline.tsx +181 -0
- package/registry/blocks/how-it-works-pill-timeline/index.ts +8 -0
- package/registry/blocks/how-it-works-rounded-cards-device-crop/HowItWorksRoundedCardsDeviceCrop.tsx +286 -0
- package/registry/blocks/how-it-works-rounded-cards-device-crop/index.ts +6 -0
- package/registry/blocks/how-it-works-six-card-grid/HowItWorksSixCardGrid.tsx +385 -0
- package/registry/blocks/how-it-works-six-card-grid/index.ts +6 -0
- package/registry/blocks/how-it-works-split-feature-band/HowItWorksSplitFeatureBand.tsx +316 -0
- package/registry/blocks/how-it-works-split-feature-band/index.ts +6 -0
- package/registry/blocks/how-it-works-split-photo-step-list/HowItWorksSplitPhotoStepList.tsx +179 -0
- package/registry/blocks/how-it-works-split-photo-step-list/index.ts +7 -0
- package/registry/blocks/how-it-works-stacked-media-text/HowItWorksStackedMediaText.tsx +310 -0
- package/registry/blocks/how-it-works-stacked-media-text/index.ts +8 -0
- package/registry/blocks/how-it-works-step-tabs-photo-panel/HowItWorksStepTabsPhotoPanel.tsx +245 -0
- package/registry/blocks/how-it-works-step-tabs-photo-panel/index.ts +7 -0
- package/registry/blocks/how-it-works-tall-visual-rail/HowItWorksTallVisualRail.tsx +349 -0
- package/registry/blocks/how-it-works-tall-visual-rail/index.ts +7 -0
- package/registry/blocks/how-it-works-timelines.test.tsx +265 -0
- package/registry/blocks/how-it-works-vertical-timeline-card/HowItWorksVerticalTimelineCard.tsx +169 -0
- package/registry/blocks/how-it-works-vertical-timeline-card/index.ts +8 -0
- package/registry/blocks/how-it-works-visual-steps.test.tsx +368 -0
- package/registry/blocks/logo-cloud-bento-logo-wall/LogoCloudBentoLogoWall.tsx +159 -0
- package/registry/blocks/logo-cloud-bento-logo-wall/index.ts +7 -0
- package/registry/blocks/logo-cloud-bordered-cell-grid/LogoCloudBorderedCellGrid.tsx +132 -0
- package/registry/blocks/logo-cloud-bordered-cell-grid/index.ts +7 -0
- package/registry/blocks/logo-cloud-centered-caption-row/LogoCloudCenteredCaptionRow.tsx +141 -0
- package/registry/blocks/logo-cloud-centered-caption-row/index.ts +7 -0
- package/registry/blocks/logo-cloud-contained-card/LogoCloudContainedCard.tsx +106 -0
- package/registry/blocks/logo-cloud-contained-card/index.ts +7 -0
- package/registry/blocks/logo-cloud-dark-logo-wall/LogoCloudDarkLogoWall.tsx +123 -0
- package/registry/blocks/logo-cloud-dark-logo-wall/index.ts +7 -0
- package/registry/blocks/logo-cloud-divider-rule-row/LogoCloudDividerRuleRow.tsx +156 -0
- package/registry/blocks/logo-cloud-divider-rule-row/index.ts +7 -0
- package/registry/blocks/logo-cloud-editorial-eyebrow-split/LogoCloudEditorialEyebrowSplit.tsx +121 -0
- package/registry/blocks/logo-cloud-editorial-eyebrow-split/index.ts +7 -0
- package/registry/blocks/logo-cloud-enterprise-wall/LogoCloudEnterpriseWall.tsx +114 -0
- package/registry/blocks/logo-cloud-enterprise-wall/index.ts +7 -0
- package/registry/blocks/logo-cloud-flanked-heading/LogoCloudFlankedHeading.tsx +162 -0
- package/registry/blocks/logo-cloud-flanked-heading/index.ts +8 -0
- package/registry/blocks/logo-cloud-grid-closing-cta/LogoCloudGridClosingCta.tsx +173 -0
- package/registry/blocks/logo-cloud-grid-closing-cta/index.ts +8 -0
- package/registry/blocks/logo-cloud-heading-grid/LogoCloudHeadingGrid.tsx +124 -0
- package/registry/blocks/logo-cloud-heading-grid/index.ts +7 -0
- package/registry/blocks/logo-cloud-heading-left-grid-right/LogoCloudHeadingLeftGridRight.tsx +172 -0
- package/registry/blocks/logo-cloud-heading-left-grid-right/index.ts +8 -0
- package/registry/blocks/logo-cloud-logo-metric-tiles/LogoCloudLogoMetricTiles.tsx +159 -0
- package/registry/blocks/logo-cloud-logo-metric-tiles/index.ts +8 -0
- package/registry/blocks/logo-cloud-logo-quote-cards/LogoCloudLogoQuoteCards.tsx +162 -0
- package/registry/blocks/logo-cloud-logo-quote-cards/index.ts +8 -0
- package/registry/blocks/logo-cloud-logo-testimonial-strip/LogoCloudLogoTestimonialStrip.tsx +159 -0
- package/registry/blocks/logo-cloud-logo-testimonial-strip/index.ts +8 -0
- package/registry/blocks/logo-cloud-named-integration-cards/LogoCloudNamedIntegrationCards.tsx +186 -0
- package/registry/blocks/logo-cloud-named-integration-cards/index.ts +9 -0
- package/registry/blocks/logo-cloud-pyramid-row-stack/LogoCloudPyramidRowStack.tsx +156 -0
- package/registry/blocks/logo-cloud-pyramid-row-stack/index.ts +7 -0
- package/registry/blocks/logo-cloud-quote-panel-grid/LogoCloudQuotePanelGrid.tsx +177 -0
- package/registry/blocks/logo-cloud-quote-panel-grid/index.ts +8 -0
- package/registry/blocks/logo-cloud-scatter-field/LogoCloudScatterField.tsx +190 -0
- package/registry/blocks/logo-cloud-scatter-field/index.ts +8 -0
- package/registry/blocks/logo-cloud-side-label-rail/LogoCloudSideLabelRail.tsx +139 -0
- package/registry/blocks/logo-cloud-side-label-rail/index.ts +7 -0
- package/registry/blocks/logo-cloud-stat-rail-above-grid/LogoCloudStatRailAboveGrid.tsx +173 -0
- package/registry/blocks/logo-cloud-stat-rail-above-grid/index.ts +8 -0
- package/registry/blocks/logo-cloud-tabbed-industry-filter/LogoCloudTabbedIndustryFilter.tsx +200 -0
- package/registry/blocks/logo-cloud-tabbed-industry-filter/index.ts +8 -0
- package/registry/blocks/navbar/index.ts +22 -11
- package/registry/blocks/navbar/navbar.test.tsx +42 -0
- package/registry/blocks/navbar/navbar.tsx +455 -0
- package/registry/blocks/navbar-active-action-with-border/NavbarActiveActionWithBorder.tsx +120 -0
- package/registry/blocks/navbar-active-action-with-border/index.ts +6 -0
- package/registry/blocks/navbar-active-action-with-round/NavbarActiveActionWithRound.tsx +120 -0
- package/registry/blocks/navbar-active-action-with-round/index.ts +6 -0
- package/registry/blocks/navbar-centered-floating/NavbarCenteredFloating.tsx +121 -0
- package/registry/blocks/navbar-centered-floating/index.ts +6 -0
- package/registry/blocks/navbar-default/NavbarDefault.tsx +102 -0
- package/registry/blocks/navbar-default/index.ts +6 -0
- package/registry/blocks/navbar-e-commerce/NavbarECommerce.tsx +212 -0
- package/registry/blocks/navbar-e-commerce/index.ts +6 -0
- package/registry/blocks/navbar-extended-at-top/NavbarExtendedAtTop.tsx +155 -0
- package/registry/blocks/navbar-extended-at-top/index.ts +7 -0
- package/registry/blocks/navbar-multiple-action/NavbarMultipleAction.tsx +133 -0
- package/registry/blocks/navbar-multiple-action/index.ts +6 -0
- package/registry/blocks/navbar-multiple-icon/NavbarMultipleIcon.tsx +132 -0
- package/registry/blocks/navbar-multiple-icon/index.ts +6 -0
- package/registry/blocks/navbar-rounded/NavbarRounded.tsx +140 -0
- package/registry/blocks/navbar-rounded/index.ts +6 -0
- package/registry/blocks/navbar-rounded-small/NavbarRoundedSmall.tsx +143 -0
- package/registry/blocks/navbar-rounded-small/index.ts +6 -0
- package/registry/blocks/navbar-small/NavbarSmall.tsx +142 -0
- package/registry/blocks/navbar-small/index.ts +6 -0
- package/registry/blocks/navbar-with-centered-logo/NavbarWithCenteredLogo.tsx +118 -0
- package/registry/blocks/navbar-with-centered-logo/index.ts +6 -0
- package/registry/blocks/navbar-with-cta-button/NavbarWithCtaButton.tsx +131 -0
- package/registry/blocks/navbar-with-cta-button/index.ts +6 -0
- package/registry/blocks/navbar-with-dropdown/NavbarWithDropdown.tsx +118 -0
- package/registry/blocks/navbar-with-dropdown/index.ts +6 -0
- package/registry/blocks/navbar-with-icon-indicator-avatar/NavbarWithIconIndicatorAvatar.tsx +85 -0
- package/registry/blocks/navbar-with-icon-indicator-avatar/index.ts +6 -0
- package/registry/blocks/navbar-with-search-input/NavbarWithSearchInput.tsx +90 -0
- package/registry/blocks/navbar-with-search-input/index.ts +6 -0
- package/registry/blocks/navbar-with-submenu/NavbarWithSubmenu.tsx +156 -0
- package/registry/blocks/navbar-with-submenu/index.ts +6 -0
- package/registry/blocks/page-header/PageHeader.tsx +5 -9
- package/registry/blocks/pricing/index.ts +20 -0
- package/registry/blocks/pricing/pricing.test.tsx +82 -0
- package/registry/blocks/pricing/pricing.tsx +343 -0
- package/registry/blocks/pricing-comparison-matrix/PricingComparisonMatrix.tsx +336 -0
- package/registry/blocks/pricing-comparison-matrix/index.ts +10 -0
- package/registry/blocks/pricing-plan-picker-summary/PricingPlanPickerSummary.tsx +399 -0
- package/registry/blocks/pricing-plan-picker-summary/index.ts +8 -0
- package/registry/blocks/pricing-plan-spotlight/PricingPlanSpotlight.tsx +281 -0
- package/registry/blocks/pricing-plan-spotlight/index.ts +7 -0
- package/registry/blocks/pricing-tiers/PricingTiers.tsx +264 -0
- package/registry/blocks/pricing-tiers/index.ts +8 -0
- package/registry/blocks/pricing-two-plan-compare/PricingTwoPlanCompare.tsx +187 -0
- package/registry/blocks/pricing-two-plan-compare/index.ts +7 -0
- package/registry/blocks/social-proof/index.ts +36 -0
- package/registry/blocks/social-proof/social-proof.test.tsx +504 -0
- package/registry/blocks/social-proof/social-proof.tsx +759 -0
- package/registry/blocks/social-proof-app-review-row/SocialProofAppReviewRow.tsx +168 -0
- package/registry/blocks/social-proof-app-review-row/index.ts +7 -0
- package/registry/blocks/social-proof-arch-portrait-quote/SocialProofArchPortraitQuote.tsx +114 -0
- package/registry/blocks/social-proof-arch-portrait-quote/index.ts +6 -0
- package/registry/blocks/social-proof-avatar-selector-row/SocialProofAvatarSelectorRow.tsx +276 -0
- package/registry/blocks/social-proof-avatar-selector-row/index.ts +7 -0
- package/registry/blocks/social-proof-benefit-title-cards/SocialProofBenefitTitleCards.tsx +182 -0
- package/registry/blocks/social-proof-benefit-title-cards/index.ts +8 -0
- package/registry/blocks/social-proof-bracket-framed-quote/SocialProofBracketFramedQuote.tsx +120 -0
- package/registry/blocks/social-proof-bracket-framed-quote/index.ts +6 -0
- package/registry/blocks/social-proof-case-study-row/SocialProofCaseStudyRow.tsx +210 -0
- package/registry/blocks/social-proof-case-study-row/index.ts +7 -0
- package/registry/blocks/social-proof-centered-logo-spotlight/SocialProofCenteredLogoSpotlight.tsx +103 -0
- package/registry/blocks/social-proof-centered-logo-spotlight/index.ts +6 -0
- package/registry/blocks/social-proof-classic-trio-grid/SocialProofClassicTrioGrid.tsx +138 -0
- package/registry/blocks/social-proof-classic-trio-grid/index.ts +7 -0
- package/registry/blocks/social-proof-dark-editorial-split/SocialProofDarkEditorialSplit.tsx +111 -0
- package/registry/blocks/social-proof-dark-editorial-split/index.ts +6 -0
- package/registry/blocks/social-proof-giant-quote-duo/SocialProofGiantQuoteDuo.tsx +156 -0
- package/registry/blocks/social-proof-giant-quote-duo/index.ts +8 -0
- package/registry/blocks/social-proof-highlighted-phrase-spotlight/SocialProofHighlightedPhraseSpotlight.tsx +130 -0
- package/registry/blocks/social-proof-highlighted-phrase-spotlight/index.ts +7 -0
- package/registry/blocks/social-proof-overlay-photo-quote/SocialProofOverlayPhotoQuote.tsx +111 -0
- package/registry/blocks/social-proof-overlay-photo-quote/index.ts +7 -0
- package/registry/blocks/social-proof-persona-pillars/SocialProofPersonaPillars.tsx +253 -0
- package/registry/blocks/social-proof-persona-pillars/index.ts +7 -0
- package/registry/blocks/social-proof-progress-carousel/SocialProofProgressCarousel.tsx +249 -0
- package/registry/blocks/social-proof-progress-carousel/index.ts +8 -0
- package/registry/blocks/social-proof-proof-bento/SocialProofProofBento.tsx +218 -0
- package/registry/blocks/social-proof-proof-bento/index.ts +6 -0
- package/registry/blocks/social-proof-spotlight-carousel/SocialProofSpotlightCarousel.tsx +212 -0
- package/registry/blocks/social-proof-spotlight-carousel/index.ts +7 -0
- package/registry/blocks/social-proof-staggered-columns/SocialProofStaggeredColumns.tsx +227 -0
- package/registry/blocks/social-proof-staggered-columns/index.ts +7 -0
- package/registry/blocks/social-proof-stat-story-cards/SocialProofStatStoryCards.tsx +218 -0
- package/registry/blocks/social-proof-stat-story-cards/index.ts +7 -0
- package/registry/blocks/social-proof-tinted-panel-portrait/SocialProofTintedPanelPortrait.tsx +130 -0
- package/registry/blocks/social-proof-tinted-panel-portrait/index.ts +7 -0
- package/registry/blocks/social-proof-tweet-wall/SocialProofTweetWall.tsx +179 -0
- package/registry/blocks/social-proof-tweet-wall/index.ts +7 -0
- package/registry/blocks/social-proof-vertical-column-wall/SocialProofVerticalColumnWall.tsx +220 -0
- package/registry/blocks/social-proof-vertical-column-wall/index.ts +7 -0
- package/registry/blocks/social-proof-video-story-cards/SocialProofVideoStoryCards.tsx +177 -0
- package/registry/blocks/social-proof-video-story-cards/index.ts +7 -0
- package/registry/blocks/social-proof-workplace-portrait-stories/SocialProofWorkplacePortraitStories.tsx +320 -0
- package/registry/blocks/social-proof-workplace-portrait-stories/index.ts +7 -0
- package/registry/blocks/team/index.ts +21 -0
- package/registry/blocks/team/team-classes.test.ts +35 -0
- package/registry/blocks/team/team.tsx +315 -0
- package/registry/blocks/team-annotated-portrait-lineup/TeamAnnotatedPortraitLineup.tsx +310 -0
- package/registry/blocks/team-annotated-portrait-lineup/index.ts +8 -0
- package/registry/blocks/team-annotated-portrait-lineup/team-annotated-portrait-lineup.test.tsx +71 -0
- package/registry/blocks/team-compact-directory-rows/TeamCompactDirectoryRows.tsx +190 -0
- package/registry/blocks/team-compact-directory-rows/compact-directory-rows.test.tsx +40 -0
- package/registry/blocks/team-compact-directory-rows/index.ts +7 -0
- package/registry/blocks/team-department-tabs-directory/TeamDepartmentTabsDirectory.tsx +414 -0
- package/registry/blocks/team-department-tabs-directory/department-tabs-directory.test.tsx +87 -0
- package/registry/blocks/team-department-tabs-directory/index.ts +10 -0
- package/registry/blocks/team-founder-spotlight/TeamFounderSpotlight.tsx +176 -0
- package/registry/blocks/team-founder-spotlight/index.ts +8 -0
- package/registry/blocks/team-founder-spotlight/team-founder-spotlight.test.tsx +70 -0
- package/registry/blocks/team-grid-backdrop-roster/TeamGridBackdropRoster.tsx +234 -0
- package/registry/blocks/team-grid-backdrop-roster/grid-backdrop-roster.test.tsx +72 -0
- package/registry/blocks/team-grid-backdrop-roster/index.ts +8 -0
- package/registry/blocks/team-hairline-grid/TeamHairlineGrid.tsx +190 -0
- package/registry/blocks/team-hairline-grid/hairline-grid.test.tsx +49 -0
- package/registry/blocks/team-hairline-grid/index.ts +1 -0
- package/registry/blocks/team-leadership-grid/TeamLeadershipGrid.tsx +183 -0
- package/registry/blocks/team-leadership-grid/index.ts +7 -0
- package/registry/blocks/team-leadership-grid/team-leadership-grid.test.tsx +38 -0
- package/registry/blocks/team-member-carousel/TeamMemberCarousel.tsx +178 -0
- package/registry/blocks/team-member-carousel/index.ts +7 -0
- package/registry/blocks/team-member-carousel/team-member-carousel.test.tsx +58 -0
- package/registry/blocks/team-member-table/TeamMemberTable.tsx +184 -0
- package/registry/blocks/team-member-table/index.ts +7 -0
- package/registry/blocks/team-member-table/member-table.test.tsx +43 -0
- package/registry/blocks/team-meta-profile-cards/TeamMetaProfileCards.tsx +155 -0
- package/registry/blocks/team-meta-profile-cards/index.ts +7 -0
- package/registry/blocks/team-meta-profile-cards/team-meta-profile-cards.test.tsx +29 -0
- package/registry/blocks/team-overlay-portrait-cards/TeamOverlayPortraitCards.tsx +145 -0
- package/registry/blocks/team-overlay-portrait-cards/index.ts +7 -0
- package/registry/blocks/team-overlay-portrait-cards/team-overlay-portrait-cards.test.tsx +49 -0
- package/registry/blocks/team-portrait-wall/TeamPortraitWall.tsx +131 -0
- package/registry/blocks/team-portrait-wall/index.ts +1 -0
- package/registry/blocks/team-portrait-wall/portrait-wall.test.tsx +45 -0
- package/registry/blocks/team-split-intro-member-rail/TeamSplitIntroMemberRail.tsx +203 -0
- package/registry/blocks/team-split-intro-member-rail/index.ts +7 -0
- package/registry/blocks/team-split-intro-member-rail/split-intro-member-rail.test.tsx +52 -0
- package/registry/blocks/team-we-re-hiring-cta/TeamWeReHiringCta.tsx +192 -0
- package/registry/blocks/team-we-re-hiring-cta/index.ts +7 -0
- package/registry/blocks/team-we-re-hiring-cta/we-re-hiring-cta.test.tsx +44 -0
- package/registry/blocks/video-call/index.ts +53 -0
- package/registry/blocks/video-call/video-call-around.test.tsx +427 -0
- package/registry/blocks/video-call/video-call-before.test.tsx +438 -0
- package/registry/blocks/video-call/video-call-hero.test.tsx +236 -0
- package/registry/blocks/video-call/video-call-stages.test.tsx +477 -0
- package/registry/blocks/video-call/video-call.test.tsx +794 -0
- package/registry/blocks/video-call/video-call.tsx +1282 -0
- package/registry/blocks/video-call-ai-meeting-recap/VideoCallAiMeetingRecap.tsx +466 -0
- package/registry/blocks/video-call-ai-meeting-recap/index.ts +9 -0
- package/registry/blocks/video-call-call-controls-dock/VideoCallCallControlsDock.tsx +211 -0
- package/registry/blocks/video-call-call-controls-dock/index.ts +6 -0
- package/registry/blocks/video-call-call-ended-summary/VideoCallCallEndedSummary.tsx +464 -0
- package/registry/blocks/video-call-call-ended-summary/index.ts +10 -0
- package/registry/blocks/video-call-call-with-side-panel/VideoCallCallWithSidePanel.tsx +357 -0
- package/registry/blocks/video-call-call-with-side-panel/index.ts +6 -0
- package/registry/blocks/video-call-captions-reactions/VideoCallCaptionsReactions.tsx +467 -0
- package/registry/blocks/video-call-captions-reactions/index.ts +10 -0
- package/registry/blocks/video-call-grid-gallery-call/VideoCallGridGalleryCall.tsx +312 -0
- package/registry/blocks/video-call-grid-gallery-call/index.ts +6 -0
- package/registry/blocks/video-call-hero-call-mockup/VideoCallHeroCallMockup.tsx +349 -0
- package/registry/blocks/video-call-hero-call-mockup/index.ts +7 -0
- package/registry/blocks/video-call-incoming-call/VideoCallIncomingCall.tsx +336 -0
- package/registry/blocks/video-call-incoming-call/index.ts +7 -0
- package/registry/blocks/video-call-join-link-dial-in/VideoCallJoinLinkDialIn.tsx +409 -0
- package/registry/blocks/video-call-join-link-dial-in/index.ts +9 -0
- package/registry/blocks/video-call-pre-join-lobby/VideoCallPreJoinLobby.tsx +345 -0
- package/registry/blocks/video-call-pre-join-lobby/index.ts +7 -0
- package/registry/blocks/video-call-screen-share-stage/VideoCallScreenShareStage.tsx +379 -0
- package/registry/blocks/video-call-screen-share-stage/index.ts +7 -0
- package/registry/blocks/video-call-speaker-filmstrip/VideoCallSpeakerFilmstrip.tsx +303 -0
- package/registry/blocks/video-call-speaker-filmstrip/index.ts +6 -0
- package/registry/blocks/video-call-upcoming-meetings/VideoCallUpcomingMeetings.tsx +349 -0
- package/registry/blocks/video-call-upcoming-meetings/index.ts +7 -0
- package/registry/blocks/video-call-waiting-room-knock/VideoCallWaitingRoomKnock.tsx +412 -0
- package/registry/blocks/video-call-waiting-room-knock/index.ts +7 -0
- package/registry/text-props-undefined.test.tsx +3 -26
- package/registry/ui/accordion/accordion.test.tsx +320 -0
- package/registry/ui/accordion/accordion.tsx +353 -0
- package/registry/ui/accordion/index.ts +15 -0
- package/registry/ui/alert/alert.test.tsx +325 -0
- package/registry/ui/alert/alert.tsx +384 -0
- package/registry/ui/alert/index.ts +10 -0
- package/registry/ui/alert-dialog/alert-dialog.test.tsx +396 -0
- package/registry/ui/alert-dialog/alert-dialog.tsx +423 -0
- package/registry/ui/alert-dialog/index.ts +21 -0
- package/registry/ui/avatar/avatar.test.tsx +2 -2
- package/registry/ui/avatar/avatar.tsx +3 -7
- package/registry/ui/breadcrumb/breadcrumb.test.tsx +305 -0
- package/registry/ui/breadcrumb/breadcrumb.tsx +205 -0
- package/registry/ui/breadcrumb/index.ts +11 -0
- package/registry/ui/button/button.test.tsx +353 -40
- package/registry/ui/button/button.tsx +304 -30
- package/registry/ui/calendar/calendar.test.tsx +192 -0
- package/registry/ui/calendar/calendar.tsx +405 -0
- package/registry/ui/calendar/index.ts +1 -0
- package/registry/ui/carousel/carousel.test.tsx +720 -0
- package/registry/ui/carousel/carousel.tsx +554 -0
- package/registry/ui/carousel/index.ts +11 -0
- package/registry/ui/checkbox/checkbox.test.tsx +318 -2
- package/registry/ui/checkbox/checkbox.tsx +253 -67
- package/registry/ui/checkbox/index.ts +1 -1
- package/registry/ui/content-carousel/content-carousel.test.tsx +303 -0
- package/registry/ui/content-carousel/content-carousel.tsx +180 -0
- package/registry/ui/content-carousel/index.ts +8 -0
- package/registry/ui/date-picker/date-picker.test.tsx +216 -0
- package/registry/ui/date-picker/date-picker.tsx +461 -0
- package/registry/ui/date-picker/index.ts +8 -0
- package/registry/ui/dialog/dialog.test.tsx +438 -0
- package/registry/ui/dialog/dialog.tsx +533 -0
- package/registry/ui/dialog/index.ts +20 -0
- package/registry/ui/dropdown-menu/dropdown-menu.test.tsx +502 -0
- package/registry/ui/dropdown-menu/dropdown-menu.tsx +627 -0
- package/registry/ui/dropdown-menu/index.ts +32 -0
- package/registry/ui/fasla-logo/fasla-logo.tsx +101 -0
- package/registry/ui/fasla-logo/index.ts +1 -0
- package/registry/ui/input/index.ts +10 -1
- package/registry/ui/input/input.test.tsx +251 -44
- package/registry/ui/input/input.tsx +311 -40
- package/registry/ui/input-number/index.ts +1 -0
- package/registry/ui/input-number/input-number.test.tsx +302 -0
- package/registry/ui/input-number/input-number.tsx +398 -0
- package/registry/ui/input-otp/index.ts +7 -0
- package/registry/ui/input-otp/input-otp.test.tsx +299 -0
- package/registry/ui/input-otp/input-otp.tsx +279 -0
- package/registry/ui/pagination/index.ts +12 -0
- package/registry/ui/pagination/pagination.test.tsx +330 -0
- package/registry/ui/pagination/pagination.tsx +336 -0
- package/registry/ui/progress/index.ts +8 -0
- package/registry/ui/progress/progress.test.tsx +168 -0
- package/registry/ui/progress/progress.tsx +165 -0
- package/registry/ui/select/index.ts +12 -1
- package/registry/ui/select/select.test.tsx +505 -0
- package/registry/ui/select/select.tsx +658 -56
- package/registry/ui/sheet/index.ts +19 -0
- package/registry/ui/sheet/sheet.test.tsx +411 -0
- package/registry/ui/sheet/sheet.tsx +496 -0
- package/registry/{blocks → ui}/sidebar/index.ts +10 -5
- package/registry/ui/sidebar/sidebar.test.tsx +224 -0
- package/registry/ui/sidebar/sidebar.tsx +754 -0
- package/registry/ui/slider/index.ts +8 -0
- package/registry/ui/slider/slider.test.tsx +231 -0
- package/registry/ui/slider/slider.tsx +319 -0
- package/registry/ui/social-icons/index.ts +1 -0
- package/registry/ui/social-icons/social-icons.tsx +284 -0
- package/registry/ui/steps/index.ts +16 -0
- package/registry/ui/steps/steps.test.tsx +435 -0
- package/registry/ui/steps/steps.tsx +571 -0
- package/registry/ui/switch/switch.tsx +3 -2
- package/registry/ui/tabs/index.ts +4 -0
- package/registry/ui/tabs/tabs.test.tsx +576 -0
- package/registry/ui/tabs/tabs.tsx +324 -112
- package/registry/ui/textarea/index.ts +1 -1
- package/registry/ui/textarea/textarea.test.tsx +294 -0
- package/registry/ui/textarea/textarea.tsx +329 -56
- package/registry/ui/tooltip/index.ts +14 -0
- package/registry/ui/tooltip/tooltip.test.tsx +301 -0
- package/registry/ui/tooltip/tooltip.tsx +409 -0
- package/registry.json +9702 -139
- package/tailwind-preset.ts +2 -2
- package/registry/blocks/navbar/Navbar.test.tsx +0 -12
- package/registry/blocks/navbar/Navbar.tsx +0 -175
- package/registry/blocks/sidebar/Sidebar.test.tsx +0 -39
- package/registry/blocks/sidebar/Sidebar.tsx +0 -212
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../../src/lib/utils"
|
|
5
|
+
import { buttonVariants } from "../../ui/button/button"
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Figma: `Hero` (46552:249264), Type=Scramble Decode Hero.
|
|
9
|
+
*
|
|
10
|
+
* A security pitch on a `primary` band: a headline whose last word is lit
|
|
11
|
+
* in `success`, a line of ciphertext under it, faint and as large, a
|
|
12
|
+
* paragraph, a decode meter (a thin track, its fill in `success`, and a
|
|
13
|
+
* "decoded 100%" label) and two buttons. At the end side a field of
|
|
14
|
+
* scattered glyphs, letters, digits and symbols at 6% to 23%, stands still.
|
|
15
|
+
*
|
|
16
|
+
* The headline decodes once, when the block first comes into view: every
|
|
17
|
+
* glyph starts scrambled, then they resolve to the real words from the start
|
|
18
|
+
* of the line to its end while the meter runs from 0% to 100% and its label
|
|
19
|
+
* reads "decoding". Figma draws that run part-way, at 58%; at rest the
|
|
20
|
+
* headline is decoded, the meter full and the label "decoded". The line of
|
|
21
|
+
* ciphertext is the message's encrypted form and stays as it is. The `h1`
|
|
22
|
+
* always holds the real words, so screen readers and search engines read
|
|
23
|
+
* them; the scrambling glyphs are an overlay hidden from assistive
|
|
24
|
+
* technology, and the real words are only made transparent under it while
|
|
25
|
+
* the run lasts. Under `prefers-reduced-motion: reduce`, and in the server's
|
|
26
|
+
* HTML, the headline is simply decoded. The glyph field never moves.
|
|
27
|
+
*
|
|
28
|
+
* Desktop sets the copy at the start side, 110px in, with the glyph field
|
|
29
|
+
* (380 × 620) 80px in from the end edge. Tablet stacks the lines 48px apart
|
|
30
|
+
* and shrinks the field to 70%, at 60%, behind the headline's end. Mobile
|
|
31
|
+
* drops the field, sets the headline at 24px and the buttons full width, one
|
|
32
|
+
* over the other.
|
|
33
|
+
*
|
|
34
|
+
* In Arabic the copy reads from the right and the field moves to the left,
|
|
35
|
+
* its columns mirrored. The scramble draws from the same Latin glyphs Figma
|
|
36
|
+
* uses and resolves to the Arabic headline. The ciphertext and the
|
|
37
|
+
* percentage stay left to right.
|
|
38
|
+
*
|
|
39
|
+
* The band is `primary` and its text `primary-foreground`, the tokens Figma
|
|
40
|
+
* binds. In dark mode `primary` turns light, and the lit word's `success`
|
|
41
|
+
* green fails on it, so the band stays dark there: `background`, with
|
|
42
|
+
* `foreground` text.
|
|
43
|
+
*
|
|
44
|
+
* Sized by the block's own width, not the window's: the section is a query
|
|
45
|
+
* container. Mobile is the base; `[@container(min-width:48rem)]:` is Figma's
|
|
46
|
+
* Tablet (768) and `[@container(min-width:90rem)]:` its Desktop, from 1440px:
|
|
47
|
+
* the width Figma draws it at, and the switch every Hero block shares, so
|
|
48
|
+
* Tablet's layout covers 768 to 1439.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
export interface HeroScrambleDecodeAction {
|
|
52
|
+
label: React.ReactNode
|
|
53
|
+
href: string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface HeroScrambleDecodeCopy {
|
|
57
|
+
/**
|
|
58
|
+
* The headline, an `h1`, set in capitals: its first words, then the word
|
|
59
|
+
* lit in `success`. Plain strings, so the scramble can take them apart.
|
|
60
|
+
*/
|
|
61
|
+
headline: { lead: string; accent: string }
|
|
62
|
+
/** The faint line of ciphertext under the headline. Decoration, hidden from assistive technology. Hidden when empty. */
|
|
63
|
+
cipher: string
|
|
64
|
+
/** The paragraph under the headline. */
|
|
65
|
+
description: React.ReactNode
|
|
66
|
+
/** The meter's label while the headline decodes, before its percentage. */
|
|
67
|
+
decodingLabel: React.ReactNode
|
|
68
|
+
/** The meter's label once it has, and at rest. */
|
|
69
|
+
decodedLabel: React.ReactNode
|
|
70
|
+
/** The light button. */
|
|
71
|
+
primaryAction: HeroScrambleDecodeAction
|
|
72
|
+
/** The ghost button beside it. Hidden when null. */
|
|
73
|
+
secondaryAction: HeroScrambleDecodeAction | null
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Figma's copy, English and Arabic. */
|
|
77
|
+
const COPY: Record<"en" | "ar", HeroScrambleDecodeCopy> = {
|
|
78
|
+
en: {
|
|
79
|
+
headline: { lead: "Encrypted by", accent: "default" },
|
|
80
|
+
cipher: "X9#K2 QW8@ VN4$ L7",
|
|
81
|
+
description: "Zero-knowledge storage for teams that keep secrets for a living. Keys never leave your device.",
|
|
82
|
+
decodingLabel: "decoding",
|
|
83
|
+
decodedLabel: "decoded",
|
|
84
|
+
primaryAction: { label: "Create a vault", href: "#signup" },
|
|
85
|
+
secondaryAction: { label: "Read the whitepaper", href: "#whitepaper" },
|
|
86
|
+
},
|
|
87
|
+
ar: {
|
|
88
|
+
headline: { lead: "مشفّر", accent: "افتراضيًا" },
|
|
89
|
+
cipher: "X9#K2 QW8@ VN4$ L7",
|
|
90
|
+
description: "تخزين بلا اطلاع للفرق التي تحفظ الأسرار مهنةً. لا تغادر المفاتيح جهازك أبدًا.",
|
|
91
|
+
decodingLabel: "فك التشفير",
|
|
92
|
+
decodedLabel: "تم فك التشفير",
|
|
93
|
+
primaryAction: { label: "أنشئ خزنة", href: "#signup" },
|
|
94
|
+
secondaryAction: { label: "اقرأ الورقة البيضاء", href: "#whitepaper" },
|
|
95
|
+
},
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/*
|
|
99
|
+
* The decode's timing, built from the house motion presets
|
|
100
|
+
* (src/motion/presets.ts: fast 120ms, slow 260ms, standard easing).
|
|
101
|
+
*/
|
|
102
|
+
/** How often the unresolved glyphs re-roll: half the `fast` step. */
|
|
103
|
+
const SHUFFLE_MS = 60
|
|
104
|
+
/** How long every glyph stays scrambled before the first resolves: the `slow` step. */
|
|
105
|
+
const HOLD_MS = 260
|
|
106
|
+
/** How long the glyphs take to resolve, first to last: eight `slow` steps. */
|
|
107
|
+
const RESOLVE_MS = 2080
|
|
108
|
+
/** How much of the block must be on screen to start the run. */
|
|
109
|
+
const THRESHOLD = 0.3
|
|
110
|
+
|
|
111
|
+
/** The glyphs the scramble draws from: Figma's, Latin in both languages. */
|
|
112
|
+
const SCRAMBLE = "0123456789ABCDEF#$%&@"
|
|
113
|
+
|
|
114
|
+
/** The glyph field's characters, in Figma's order, column by column. */
|
|
115
|
+
const RAIN = "05AF&49E%38D$27C@16B#"
|
|
116
|
+
/** Figma's field: six columns of fourteen glyphs. */
|
|
117
|
+
const RAIN_COLUMNS = 6
|
|
118
|
+
const RAIN_ROWS = 14
|
|
119
|
+
/**
|
|
120
|
+
* Each column's two opacities, alternating down it, as Figma sets them.
|
|
121
|
+
* Written out whole so Tailwind finds every class.
|
|
122
|
+
*/
|
|
123
|
+
const RAIN_TONES: [string, string][] = [
|
|
124
|
+
["text-primary-foreground/[0.06] dark:text-foreground/[0.06]", "text-primary-foreground/[0.17] dark:text-foreground/[0.17]"],
|
|
125
|
+
["text-primary-foreground/[0.09] dark:text-foreground/[0.09]", "text-primary-foreground/[0.2] dark:text-foreground/[0.2]"],
|
|
126
|
+
["text-primary-foreground/[0.13] dark:text-foreground/[0.13]", "text-primary-foreground/[0.23] dark:text-foreground/[0.23]"],
|
|
127
|
+
["text-primary-foreground/[0.17] dark:text-foreground/[0.17]", "text-primary-foreground/[0.06] dark:text-foreground/[0.06]"],
|
|
128
|
+
["text-primary-foreground/[0.2] dark:text-foreground/[0.2]", "text-primary-foreground/[0.09] dark:text-foreground/[0.09]"],
|
|
129
|
+
["text-primary-foreground/[0.23] dark:text-foreground/[0.23]", "text-primary-foreground/[0.13] dark:text-foreground/[0.13]"],
|
|
130
|
+
]
|
|
131
|
+
|
|
132
|
+
const REDUCED_MOTION = "(prefers-reduced-motion: reduce)"
|
|
133
|
+
|
|
134
|
+
function subscribeToReducedMotion(onChange: () => void) {
|
|
135
|
+
if (typeof window.matchMedia !== "function") return () => {}
|
|
136
|
+
const query = window.matchMedia(REDUCED_MOTION)
|
|
137
|
+
query.addEventListener("change", onChange)
|
|
138
|
+
return () => query.removeEventListener("change", onChange)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Whether the visitor asks for reduced motion. False on the server and while
|
|
143
|
+
* hydrating, so both renders agree, then the setting as it is and as it
|
|
144
|
+
* changes.
|
|
145
|
+
*/
|
|
146
|
+
function usePrefersReducedMotion() {
|
|
147
|
+
return React.useSyncExternalStore(
|
|
148
|
+
subscribeToReducedMotion,
|
|
149
|
+
() => typeof window.matchMedia === "function" && window.matchMedia(REDUCED_MOTION).matches,
|
|
150
|
+
() => false
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** The slice of Intl.Segmenter used here, typed locally: older TypeScript libs lack it. */
|
|
155
|
+
type GraphemeSegmenter = new (
|
|
156
|
+
locale: undefined,
|
|
157
|
+
options: { granularity: "grapheme" }
|
|
158
|
+
) => { segment(text: string): Iterable<{ segment: string }> }
|
|
159
|
+
|
|
160
|
+
/** Splits into user-perceived characters, so an Arabic mark stays with its letter. */
|
|
161
|
+
function splitGraphemes(text: string): string[] {
|
|
162
|
+
const Segmenter = (Intl as unknown as { Segmenter?: GraphemeSegmenter }).Segmenter
|
|
163
|
+
if (Segmenter) {
|
|
164
|
+
const segmenter = new Segmenter(undefined, { granularity: "grapheme" })
|
|
165
|
+
return Array.from(segmenter.segment(text), (part) => part.segment)
|
|
166
|
+
}
|
|
167
|
+
return text.match(new RegExp("\\P{M}\\p{M}*|\\p{M}+", "gu")) ?? []
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** One frame of the run: the headline's two parts as they show, and the meter. */
|
|
171
|
+
interface DecodeFrame {
|
|
172
|
+
lead: string
|
|
173
|
+
accent: string
|
|
174
|
+
percent: number
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Scrambles `parts`, leaving the first `resolved` glyphs (spaces not counted)
|
|
179
|
+
* as they are. Spaces stay spaces, so the words keep their shape.
|
|
180
|
+
*/
|
|
181
|
+
function scramble(parts: string[][], resolved: number): string[] {
|
|
182
|
+
let index = 0
|
|
183
|
+
return parts.map((part) =>
|
|
184
|
+
part
|
|
185
|
+
.map((glyph) => {
|
|
186
|
+
if (/^\s+$/.test(glyph)) return glyph
|
|
187
|
+
index += 1
|
|
188
|
+
return index <= resolved ? glyph : SCRAMBLE[Math.floor(Math.random() * SCRAMBLE.length)]
|
|
189
|
+
})
|
|
190
|
+
.join("")
|
|
191
|
+
)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export interface HeroScrambleDecodeProps
|
|
195
|
+
extends Omit<React.HTMLAttributes<HTMLElement>, "title">,
|
|
196
|
+
Partial<HeroScrambleDecodeCopy> {
|
|
197
|
+
/** Which language the default copy is in. The page's `dir` sets the direction. */
|
|
198
|
+
locale?: "en" | "ar"
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function HeroScrambleDecode({
|
|
202
|
+
locale = "en",
|
|
203
|
+
headline,
|
|
204
|
+
cipher,
|
|
205
|
+
description,
|
|
206
|
+
decodingLabel,
|
|
207
|
+
decodedLabel,
|
|
208
|
+
primaryAction,
|
|
209
|
+
secondaryAction,
|
|
210
|
+
className,
|
|
211
|
+
...props
|
|
212
|
+
}: HeroScrambleDecodeProps) {
|
|
213
|
+
const copy = COPY[locale]
|
|
214
|
+
const headingId = React.useId()
|
|
215
|
+
const sectionRef = React.useRef<HTMLElement>(null)
|
|
216
|
+
const played = React.useRef(false)
|
|
217
|
+
const reduced = usePrefersReducedMotion()
|
|
218
|
+
const [frame, setFrame] = React.useState<DecodeFrame | null>(null)
|
|
219
|
+
const title = headline ?? copy.headline
|
|
220
|
+
const ciphertext = cipher ?? copy.cipher
|
|
221
|
+
const primary = primaryAction ?? copy.primaryAction
|
|
222
|
+
const secondary = secondaryAction === undefined ? copy.secondaryAction : secondaryAction
|
|
223
|
+
const { lead, accent } = title
|
|
224
|
+
|
|
225
|
+
// The run, once, when the block first comes into view. The server's HTML
|
|
226
|
+
// and every render outside the run show the decoded headline.
|
|
227
|
+
React.useEffect(() => {
|
|
228
|
+
const section = sectionRef.current
|
|
229
|
+
if (!section || reduced || played.current || typeof IntersectionObserver !== "function") return
|
|
230
|
+
const parts = [splitGraphemes(lead), splitGraphemes(accent)]
|
|
231
|
+
const total = parts.flat().filter((glyph) => !/^\s+$/.test(glyph)).length
|
|
232
|
+
let timer: ReturnType<typeof setInterval> | undefined
|
|
233
|
+
|
|
234
|
+
const tick = (began: number) => {
|
|
235
|
+
const elapsed = performance.now() - began
|
|
236
|
+
if (elapsed >= HOLD_MS + RESOLVE_MS) {
|
|
237
|
+
clearInterval(timer)
|
|
238
|
+
setFrame(null)
|
|
239
|
+
return
|
|
240
|
+
}
|
|
241
|
+
const share = Math.max(0, elapsed - HOLD_MS) / RESOLVE_MS
|
|
242
|
+
const [shownLead = "", shownAccent = ""] = scramble(parts, Math.floor(share * total))
|
|
243
|
+
setFrame({ lead: shownLead, accent: shownAccent, percent: Math.round(share * 100) })
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const observer = new IntersectionObserver(
|
|
247
|
+
(entries) => {
|
|
248
|
+
if (!entries.some((entry) => entry.isIntersecting)) return
|
|
249
|
+
observer.disconnect()
|
|
250
|
+
played.current = true
|
|
251
|
+
const began = performance.now()
|
|
252
|
+
tick(began)
|
|
253
|
+
timer = setInterval(() => tick(began), SHUFFLE_MS)
|
|
254
|
+
},
|
|
255
|
+
{ threshold: THRESHOLD }
|
|
256
|
+
)
|
|
257
|
+
observer.observe(section)
|
|
258
|
+
return () => {
|
|
259
|
+
observer.disconnect()
|
|
260
|
+
clearInterval(timer)
|
|
261
|
+
setFrame(null)
|
|
262
|
+
}
|
|
263
|
+
}, [lead, accent, reduced])
|
|
264
|
+
|
|
265
|
+
// Reduced motion turned on mid-run ends it at once.
|
|
266
|
+
const run = reduced ? null : frame
|
|
267
|
+
const percent = run ? run.percent : 100
|
|
268
|
+
|
|
269
|
+
return (
|
|
270
|
+
<section
|
|
271
|
+
ref={sectionRef}
|
|
272
|
+
aria-labelledby={headingId}
|
|
273
|
+
className={cn("[container-type:inline-size] overflow-hidden bg-primary dark:bg-background", className)}
|
|
274
|
+
{...props}
|
|
275
|
+
>
|
|
276
|
+
{/*
|
|
277
|
+
* The section's colour fills the whole width; its content does not.
|
|
278
|
+
* From Tablet up to Desktop the content keeps Figma's Tablet width,
|
|
279
|
+
* 720px inside 24px padding, and centres, so a wide container shows
|
|
280
|
+
* Figma's Tablet layout rather than a stretched one.
|
|
281
|
+
*/}
|
|
282
|
+
<div className="relative mx-auto flex w-full max-w-[1440px] [@container(min-width:48rem)]:max-w-[48rem] [@container(min-width:90rem)]:max-w-[1440px] flex-col gap-10 px-4 py-8 [@container(min-width:48rem)]:gap-12 [@container(min-width:48rem)]:px-6 [@container(min-width:48rem)]:py-16 [@container(min-width:90rem)]:gap-0 [@container(min-width:90rem)]:pe-20 [@container(min-width:90rem)]:ps-[110px] [@container(min-width:90rem)]:pb-[178px] [@container(min-width:90rem)]:pt-[230px]">
|
|
283
|
+
{/*
|
|
284
|
+
* The glyph field: decoration, and still. Six columns of fourteen in
|
|
285
|
+
* 62 × 44 cells. On Tablet it shrinks to 70% from its top end corner
|
|
286
|
+
* and fades to 60%, behind the headline; Mobile has none.
|
|
287
|
+
*/}
|
|
288
|
+
<div
|
|
289
|
+
aria-hidden="true"
|
|
290
|
+
className="pointer-events-none absolute end-6 top-10 hidden h-[620px] w-[380px] origin-top-right scale-[0.7] select-none grid-flow-col grid-cols-[repeat(6,62px)] grid-rows-[repeat(14,44px)] p-2.5 text-base opacity-60 [&:dir(rtl)]:origin-top-left [@container(min-width:48rem)]:grid [@container(min-width:90rem)]:end-20 [@container(min-width:90rem)]:top-[90px] [@container(min-width:90rem)]:scale-100 [@container(min-width:90rem)]:opacity-100"
|
|
291
|
+
>
|
|
292
|
+
{Array.from({ length: RAIN_COLUMNS * RAIN_ROWS }, (_, index) => (
|
|
293
|
+
<span key={index} className={RAIN_TONES[Math.floor(index / RAIN_ROWS)]?.[(index % RAIN_ROWS) % 2]}>
|
|
294
|
+
{RAIN[index % RAIN.length]}
|
|
295
|
+
</span>
|
|
296
|
+
))}
|
|
297
|
+
</div>
|
|
298
|
+
|
|
299
|
+
<h1
|
|
300
|
+
id={headingId}
|
|
301
|
+
className="relative text-2xl font-semibold uppercase text-primary-foreground dark:text-foreground [@container(min-width:48rem)]:text-6xl [@container(min-width:90rem)]:max-w-[854px] [@container(min-width:90rem)]:text-7xl"
|
|
302
|
+
>
|
|
303
|
+
{/* The real words: always here, only transparent while the overlay scrambles. */}
|
|
304
|
+
<span className={cn(run && "opacity-0")}>
|
|
305
|
+
{lead ? <>{lead} </> : null}
|
|
306
|
+
<span className="text-success">{accent}</span>
|
|
307
|
+
</span>
|
|
308
|
+
{run ? (
|
|
309
|
+
<span aria-hidden="true" className="absolute inset-0">
|
|
310
|
+
{lead ? <>{run.lead} </> : null}
|
|
311
|
+
<span className="text-success">{run.accent}</span>
|
|
312
|
+
</span>
|
|
313
|
+
) : null}
|
|
314
|
+
</h1>
|
|
315
|
+
|
|
316
|
+
{ciphertext ? (
|
|
317
|
+
<p
|
|
318
|
+
aria-hidden="true"
|
|
319
|
+
className="relative text-2xl font-semibold text-primary-foreground/[0.28] dark:text-foreground/[0.28] [@container(min-width:48rem)]:text-6xl [@container(min-width:90rem)]:mt-2.5 [@container(min-width:90rem)]:max-w-[854px] [@container(min-width:90rem)]:text-7xl"
|
|
320
|
+
>
|
|
321
|
+
<bdi dir="ltr">{ciphertext}</bdi>
|
|
322
|
+
</p>
|
|
323
|
+
) : null}
|
|
324
|
+
|
|
325
|
+
<div className="relative flex flex-col gap-5 [@container(min-width:90rem)]:mt-[50px] [@container(min-width:90rem)]:max-w-[640px]">
|
|
326
|
+
<p className="text-pretty text-base text-primary-foreground dark:text-foreground [@container(min-width:48rem)]:text-lg">
|
|
327
|
+
{description ?? copy.description}
|
|
328
|
+
</p>
|
|
329
|
+
|
|
330
|
+
{/* The decode meter: full at rest, running with the headline while it decodes. */}
|
|
331
|
+
<div className="flex items-center gap-3">
|
|
332
|
+
<div
|
|
333
|
+
aria-hidden="true"
|
|
334
|
+
className="h-1 min-w-0 flex-1 overflow-hidden rounded-full bg-primary-foreground/25 dark:bg-foreground/25 [@container(min-width:48rem)]:w-[400px] [@container(min-width:48rem)]:flex-none"
|
|
335
|
+
>
|
|
336
|
+
<div
|
|
337
|
+
className="h-full rounded-full bg-success transition-[width] duration-[120ms] ease-[cubic-bezier(0.2,0,0,1)] motion-reduce:transition-none"
|
|
338
|
+
style={{ width: `${percent}%` }}
|
|
339
|
+
/>
|
|
340
|
+
</div>
|
|
341
|
+
<p className="whitespace-nowrap text-xs font-medium text-primary-foreground/80 dark:text-foreground/80">
|
|
342
|
+
{run ? (decodingLabel ?? copy.decodingLabel) : (decodedLabel ?? copy.decodedLabel)}{" "}
|
|
343
|
+
<bdi dir="ltr">{percent}%</bdi>
|
|
344
|
+
</p>
|
|
345
|
+
</div>
|
|
346
|
+
|
|
347
|
+
<div className="flex flex-col gap-3 [@container(min-width:48rem)]:flex-row">
|
|
348
|
+
<a
|
|
349
|
+
href={primary.href}
|
|
350
|
+
className={buttonVariants({ variant: "secondary", size: "lg", className: "after:ring-primary-foreground dark:after:ring-foreground" })}
|
|
351
|
+
>
|
|
352
|
+
{primary.label}
|
|
353
|
+
</a>
|
|
354
|
+
{secondary ? (
|
|
355
|
+
<a
|
|
356
|
+
href={secondary.href}
|
|
357
|
+
// Figma sets the ghost label in `primary-foreground` to read on
|
|
358
|
+
// the band; the hover tint and the focus ring follow it.
|
|
359
|
+
className={buttonVariants({
|
|
360
|
+
variant: "ghost",
|
|
361
|
+
tone: "secondary",
|
|
362
|
+
size: "lg",
|
|
363
|
+
className:
|
|
364
|
+
"text-primary-foreground after:ring-primary-foreground hover:bg-primary-foreground/10 active:bg-primary-foreground/10 dark:text-foreground dark:after:ring-foreground hover:dark:bg-foreground/10 active:dark:bg-foreground/10",
|
|
365
|
+
})}
|
|
366
|
+
>
|
|
367
|
+
{secondary.label}
|
|
368
|
+
</a>
|
|
369
|
+
) : null}
|
|
370
|
+
</div>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
</section>
|
|
374
|
+
)
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* The default copy, English and Arabic, as `locale` picks it. Spread it to
|
|
379
|
+
* change a few strings and keep the rest.
|
|
380
|
+
*/
|
|
381
|
+
export const heroScrambleDecodeCopy = COPY
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { ArrowDownRight, ArrowRight } from "lucide-react"
|
|
5
|
+
import { cn } from "../../../src/lib/utils"
|
|
6
|
+
import { buttonVariants } from "../../ui/button/button"
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Figma: `Hero` (46552:249264), Type=Shape Grid Hero.
|
|
10
|
+
*
|
|
11
|
+
* A modular playground beside the pitch. The copy: an eyebrow behind a dot,
|
|
12
|
+
* a two-line headline, a paragraph, a solid button and a "how it works" link
|
|
13
|
+
* with an arrow, then a strip of four colour dots with a short note. The
|
|
14
|
+
* artwork: a four-by-four grid of 150px tiles under hairline guides, filled
|
|
15
|
+
* with geometric shapes (a toggle, discs, quarter discs, a ring, an arch and
|
|
16
|
+
* a smile) in `primary` and the chart colours, with one photo in the middle
|
|
17
|
+
* four tiles, cut round at two corners, and a caption under it. Along the
|
|
18
|
+
* foot, under a line, the disciplines and "your next idea starts here".
|
|
19
|
+
*
|
|
20
|
+
* Desktop sets the copy and the 600px grid side by side, both from the top.
|
|
21
|
+
* Tablet stacks the copy over the grid, still 600px and at the start edge;
|
|
22
|
+
* the foot keeps its two ends. Mobile scales the grid to the full width,
|
|
23
|
+
* hides the caption (Figma hides it there), stacks a full-width button over
|
|
24
|
+
* the link, centred, and stacks the foot's two lines.
|
|
25
|
+
*
|
|
26
|
+
* Figma colours the shapes from the raw palette (amber, orange, violet, cyan
|
|
27
|
+
* and rose); here they are the theme's chart tokens nearest each hue:
|
|
28
|
+
* orange `chart-1`, cyan `chart-2`, violet `chart-3` (the theme has no
|
|
29
|
+
* violet), amber `chart-4` and rose `chart-5`. The colour dots use the same
|
|
30
|
+
* four as their shapes. The artwork is decoration and is hidden from screen
|
|
31
|
+
* readers; the photo carries the `alt` you pass. The nav row Figma draws
|
|
32
|
+
* above the copy (the wordmark, links, "Log in" and "Start creating") is
|
|
33
|
+
* left out: the page's own navbar does that job.
|
|
34
|
+
*
|
|
35
|
+
* In Arabic the copy moves to the right and the grid to the left, and the
|
|
36
|
+
* artwork mirrors tile for tile, as Figma draws it; the arrows point left.
|
|
37
|
+
* The photo is never flipped, and keeps the cut Figma gives it in both
|
|
38
|
+
* directions: rounded at the top-left and bottom-right corners.
|
|
39
|
+
*
|
|
40
|
+
* Sized by the block's own width, not the window's: the section is a query
|
|
41
|
+
* container. Mobile is the base; `[@container(min-width:48rem)]:` is Figma's
|
|
42
|
+
* Tablet (768) and `[@container(min-width:90rem)]:` its Desktop, from 1440px:
|
|
43
|
+
* the width Figma draws it at, and the switch every Hero block shares, so
|
|
44
|
+
* Tablet's layout covers 768 to 1439.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
export interface HeroShapeGridAction {
|
|
48
|
+
label: React.ReactNode
|
|
49
|
+
href: string
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface HeroShapeGridPhoto {
|
|
53
|
+
src: string
|
|
54
|
+
/** Describes the photo. Pass "" for a purely decorative one. */
|
|
55
|
+
alt: string
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface HeroShapeGridCopy {
|
|
59
|
+
/** The line above the headline, behind a dot. Hidden when empty. */
|
|
60
|
+
eyebrow: React.ReactNode
|
|
61
|
+
/** The headline, an `h1`. A line break in the string breaks the line. */
|
|
62
|
+
headline: React.ReactNode
|
|
63
|
+
/** The paragraph under the headline. */
|
|
64
|
+
description: React.ReactNode
|
|
65
|
+
/** The solid button. */
|
|
66
|
+
primaryAction: HeroShapeGridAction
|
|
67
|
+
/** The text link beside it, with an arrow. Hidden when null. */
|
|
68
|
+
secondaryAction: HeroShapeGridAction | null
|
|
69
|
+
/** The note beside the colour dots. The dots are hidden with it when empty. */
|
|
70
|
+
note: React.ReactNode
|
|
71
|
+
/** The caption under the grid. Hidden when empty, and always on Mobile. */
|
|
72
|
+
caption: React.ReactNode
|
|
73
|
+
/** The start of the foot: the disciplines, in one line. Hidden when empty. */
|
|
74
|
+
disciplines: React.ReactNode
|
|
75
|
+
/** The end of the foot, before its arrow. Hidden when empty. */
|
|
76
|
+
scrollCue: React.ReactNode
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Figma's copy, English and Arabic. The arrow after the last line is an icon, not part of the string. */
|
|
80
|
+
const COPY: Record<"en" | "ar", HeroShapeGridCopy> = {
|
|
81
|
+
en: {
|
|
82
|
+
eyebrow: "A LITTLE PLAY. ENDLESS POSSIBILITY.",
|
|
83
|
+
headline: "Big ideas.\nNo boundaries.",
|
|
84
|
+
description:
|
|
85
|
+
"A space to imagine, experiment, and bring your next great idea to life. Creativity starts with a little curiosity.",
|
|
86
|
+
primaryAction: { label: "Explore your creativity", href: "#start" },
|
|
87
|
+
secondaryAction: { label: "See how it works", href: "#how-it-works" },
|
|
88
|
+
note: "For curious minds. And everything they make.",
|
|
89
|
+
caption: "IMAGINATION, IN GOOD SHAPE.",
|
|
90
|
+
disciplines: "DESIGN · EXPERIMENT · COLLABORATE · CREATE",
|
|
91
|
+
scrollCue: "Your next idea starts here",
|
|
92
|
+
},
|
|
93
|
+
ar: {
|
|
94
|
+
eyebrow: "قليل من اللعب، وإمكانات بلا حدود.",
|
|
95
|
+
headline: "أفكار كبيرة.\nبلا حدود.",
|
|
96
|
+
description: "مساحة لتتخيّل وتجرّب وتمنح فكرتك العظيمة التالية الحياة. الإبداع يبدأ بقليل من الفضول.",
|
|
97
|
+
primaryAction: { label: "أطلق إبداعك", href: "#start" },
|
|
98
|
+
secondaryAction: { label: "تعرّف على طريقة العمل", href: "#how-it-works" },
|
|
99
|
+
note: "للعقول الفضولية، ولكل ما تصنعه.",
|
|
100
|
+
caption: "خيال في أحسن حال.",
|
|
101
|
+
disciplines: "صمّم، جرّب، تعاون، أبدع",
|
|
102
|
+
scrollCue: "فكرتك التالية تبدأ هنا",
|
|
103
|
+
},
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** The colour dots, in Figma's order: amber, orange, violet, cyan. */
|
|
107
|
+
const SWATCHES = ["bg-chart-4", "bg-chart-1", "bg-chart-3", "bg-chart-2"] as const
|
|
108
|
+
|
|
109
|
+
/** The hairline guides, at the grid's five tile edges on each axis, in percent. */
|
|
110
|
+
const GUIDES = [0, 25, 50, 75, 100] as const
|
|
111
|
+
|
|
112
|
+
export interface HeroShapeGridProps
|
|
113
|
+
extends Omit<React.HTMLAttributes<HTMLElement>, "title">,
|
|
114
|
+
Partial<HeroShapeGridCopy> {
|
|
115
|
+
/** Which language the default copy is in. The page's `dir` sets the direction. */
|
|
116
|
+
locale?: "en" | "ar"
|
|
117
|
+
/**
|
|
118
|
+
* The photo in the middle four tiles of the grid. None by default: a
|
|
119
|
+
* `muted` placeholder of the same size and cut.
|
|
120
|
+
* @default none: a `muted` placeholder
|
|
121
|
+
*/
|
|
122
|
+
photo?: HeroShapeGridPhoto
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function HeroShapeGrid({
|
|
126
|
+
locale = "en",
|
|
127
|
+
eyebrow,
|
|
128
|
+
headline,
|
|
129
|
+
description,
|
|
130
|
+
primaryAction,
|
|
131
|
+
secondaryAction,
|
|
132
|
+
note,
|
|
133
|
+
caption,
|
|
134
|
+
disciplines,
|
|
135
|
+
scrollCue,
|
|
136
|
+
photo,
|
|
137
|
+
className,
|
|
138
|
+
...props
|
|
139
|
+
}: HeroShapeGridProps) {
|
|
140
|
+
const copy = COPY[locale]
|
|
141
|
+
const headingId = React.useId()
|
|
142
|
+
const label = eyebrow ?? copy.eyebrow
|
|
143
|
+
const primary = primaryAction ?? copy.primaryAction
|
|
144
|
+
const secondary = secondaryAction === undefined ? copy.secondaryAction : secondaryAction
|
|
145
|
+
const strapline = note ?? copy.note
|
|
146
|
+
const artworkCaption = caption ?? copy.caption
|
|
147
|
+
const footStart = disciplines ?? copy.disciplines
|
|
148
|
+
const footEnd = scrollCue ?? copy.scrollCue
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<section aria-labelledby={headingId} className={cn("[container-type:inline-size] bg-background", className)} {...props}>
|
|
152
|
+
{/*
|
|
153
|
+
* The section's colour fills the whole width; its content does not.
|
|
154
|
+
* From Tablet up to Desktop the content keeps Figma's Tablet width,
|
|
155
|
+
* 720px inside 24px padding, and centres, so a wide container shows
|
|
156
|
+
* Figma's Tablet layout rather than a stretched one.
|
|
157
|
+
*/}
|
|
158
|
+
<div className="mx-auto flex w-full max-w-[1440px] [@container(min-width:48rem)]:max-w-[48rem] [@container(min-width:90rem)]:max-w-[1440px] flex-col gap-10 px-4 py-8 [@container(min-width:48rem)]:gap-12 [@container(min-width:48rem)]:px-6 [@container(min-width:48rem)]:py-16 [@container(min-width:90rem)]:gap-8 [@container(min-width:90rem)]:px-16 [@container(min-width:90rem)]:pb-[22px] [@container(min-width:90rem)]:pt-[86px]">
|
|
159
|
+
<div className="flex flex-col gap-10 [@container(min-width:48rem)]:gap-12 [@container(min-width:90rem)]:flex-row [@container(min-width:90rem)]:items-start [@container(min-width:90rem)]:gap-[50px]">
|
|
160
|
+
<div className="flex min-w-0 flex-1 flex-col gap-7">
|
|
161
|
+
{label ? (
|
|
162
|
+
<p className="flex items-center gap-2 text-sm font-medium text-primary">
|
|
163
|
+
<span aria-hidden className="size-1.5 shrink-0 rounded-full bg-primary" />
|
|
164
|
+
{label}
|
|
165
|
+
</p>
|
|
166
|
+
) : null}
|
|
167
|
+
<h1 id={headingId} className="whitespace-pre-line text-3xl font-bold text-foreground [@container(min-width:48rem)]:text-4xl [@container(min-width:90rem)]:text-5xl">
|
|
168
|
+
{headline ?? copy.headline}
|
|
169
|
+
</h1>
|
|
170
|
+
<p className="text-pretty text-base text-muted-foreground [@container(min-width:48rem)]:text-lg [@container(min-width:90rem)]:max-w-[460px]">
|
|
171
|
+
{description ?? copy.description}
|
|
172
|
+
</p>
|
|
173
|
+
<div className="flex flex-col items-center gap-7 pt-3 [@container(min-width:48rem)]:flex-row">
|
|
174
|
+
<a href={primary.href} className={cn(buttonVariants({ size: "lg", radius: "rounded" }), "w-full [@container(min-width:48rem)]:w-auto")}>
|
|
175
|
+
{primary.label}
|
|
176
|
+
</a>
|
|
177
|
+
{secondary ? (
|
|
178
|
+
<a
|
|
179
|
+
href={secondary.href}
|
|
180
|
+
className="relative inline-flex items-center gap-2.5 whitespace-nowrap rounded-sm text-base font-medium text-foreground [outline:none] before:absolute before:-inset-x-1 before:-inset-y-3 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring"
|
|
181
|
+
>
|
|
182
|
+
{secondary.label}
|
|
183
|
+
<ArrowRight aria-hidden className="size-6 shrink-0 [&:dir(rtl)]:-scale-x-100" />
|
|
184
|
+
</a>
|
|
185
|
+
) : null}
|
|
186
|
+
</div>
|
|
187
|
+
{strapline ? (
|
|
188
|
+
<div className="flex items-center gap-3 pt-9">
|
|
189
|
+
<div aria-hidden className="flex shrink-0">
|
|
190
|
+
{SWATCHES.map((swatch, index) => (
|
|
191
|
+
<span key={swatch} className={cn("size-6 rounded-full border-2 border-background", swatch, index > 0 && "-ms-1.5")} />
|
|
192
|
+
))}
|
|
193
|
+
</div>
|
|
194
|
+
<p className="min-w-0 text-pretty text-sm text-muted-foreground">{strapline}</p>
|
|
195
|
+
</div>
|
|
196
|
+
) : null}
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<div className="flex w-full max-w-[600px] flex-col gap-3.5 [@container(min-width:48rem)]:w-[600px] [@container(min-width:90rem)]:shrink-0">
|
|
200
|
+
<div className="relative aspect-square w-full">
|
|
201
|
+
{/*
|
|
202
|
+
* Figma's 600 × 600 artwork, tile by tile, in 150px tiles.
|
|
203
|
+
* Strokes sit inside their shapes, as Figma draws them, so
|
|
204
|
+
* the outlines are inset by half their 3px width. The whole
|
|
205
|
+
* drawing mirrors in Arabic.
|
|
206
|
+
*/}
|
|
207
|
+
<svg aria-hidden viewBox="0 0 600 600" className="absolute inset-0 size-full [&:dir(rtl)]:-scale-x-100">
|
|
208
|
+
<g fill="none" stroke="currentColor" strokeWidth={3} className="text-primary">
|
|
209
|
+
{/* The toggle, across the first two tiles. */}
|
|
210
|
+
<rect x={1.5} y={1.5} width={297} height={147} rx={73.5} />
|
|
211
|
+
{/* The ring, bottom start. */}
|
|
212
|
+
<circle cx={75} cy={525} r={73.5} />
|
|
213
|
+
<circle cx={75} cy={525} r={33.5} />
|
|
214
|
+
</g>
|
|
215
|
+
<g fill="currentColor" className="text-primary">
|
|
216
|
+
<circle cx={223} cy={75} r={63} />
|
|
217
|
+
<circle cx={75} cy={225} r={75} />
|
|
218
|
+
</g>
|
|
219
|
+
<path d="M300 0A150 150 0 0 1 450 150H300Z" fill="currentColor" className="text-chart-3" />
|
|
220
|
+
<circle cx={525} cy={75} r={75} fill="currentColor" className="text-chart-1" />
|
|
221
|
+
<path d="M600 150A150 150 0 0 0 450 300H600Z" fill="currentColor" className="text-chart-4" />
|
|
222
|
+
<path d="M0 300H150V450A150 150 0 0 1 0 300Z" fill="currentColor" className="text-chart-2" />
|
|
223
|
+
{/* The arch: a stadium two tiles tall with a narrow one cut out of it. */}
|
|
224
|
+
<path
|
|
225
|
+
d="M450 375A75 75 0 0 1 600 375V525A75 75 0 0 1 450 525ZM500 375A25 25 0 0 1 550 375V525A25 25 0 0 1 500 525Z"
|
|
226
|
+
fillRule="evenodd"
|
|
227
|
+
fill="currentColor"
|
|
228
|
+
className="text-chart-2"
|
|
229
|
+
/>
|
|
230
|
+
{/* The smile: a half ring under the photo. */}
|
|
231
|
+
<path d="M150 450H225A75 75 0 0 0 375 450H450A150 150 0 0 1 150 450Z" fill="currentColor" className="text-chart-5" />
|
|
232
|
+
</svg>
|
|
233
|
+
|
|
234
|
+
{/*
|
|
235
|
+
* The middle four tiles. Figma rounds the photo's top-left and
|
|
236
|
+
* bottom-right corners in both directions: the photo, and its
|
|
237
|
+
* cut, do not mirror.
|
|
238
|
+
*/}
|
|
239
|
+
<div className="absolute start-1/4 top-1/4 size-1/2 overflow-hidden rounded-br-[50%] rounded-tl-[50%] bg-muted">
|
|
240
|
+
{photo ? (
|
|
241
|
+
<img src={photo.src} alt={photo.alt} decoding="async" className="absolute inset-0 size-full object-cover" />
|
|
242
|
+
) : null}
|
|
243
|
+
</div>
|
|
244
|
+
|
|
245
|
+
{/* The hairline guides, over everything, as Figma layers them. Each sits on the far side of its tile edge. */}
|
|
246
|
+
{GUIDES.map((at) => (
|
|
247
|
+
<React.Fragment key={at}>
|
|
248
|
+
<span aria-hidden style={{ top: `${at}%` }} className="absolute start-0 h-px w-full bg-border" />
|
|
249
|
+
<span aria-hidden style={{ insetInlineStart: `${at}%` }} className="absolute top-0 h-full w-px bg-border" />
|
|
250
|
+
</React.Fragment>
|
|
251
|
+
))}
|
|
252
|
+
</div>
|
|
253
|
+
{artworkCaption ? (
|
|
254
|
+
<p className="hidden ps-[322px] text-xxs font-medium text-primary [@container(min-width:48rem)]:block">{artworkCaption}</p>
|
|
255
|
+
) : null}
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
|
|
259
|
+
{footStart || footEnd ? (
|
|
260
|
+
<div className="flex flex-col border-t border-border pt-5 [@container(min-width:48rem)]:flex-row [@container(min-width:48rem)]:items-start [@container(min-width:48rem)]:justify-between [@container(min-width:48rem)]:gap-6">
|
|
261
|
+
{footStart ? <p className="text-sm font-medium text-foreground">{footStart}</p> : null}
|
|
262
|
+
{footEnd ? (
|
|
263
|
+
<p className="flex items-center gap-1 text-sm font-medium text-foreground">
|
|
264
|
+
{footEnd}
|
|
265
|
+
<ArrowDownRight aria-hidden className="size-4 shrink-0 [&:dir(rtl)]:-scale-x-100" />
|
|
266
|
+
</p>
|
|
267
|
+
) : null}
|
|
268
|
+
</div>
|
|
269
|
+
) : null}
|
|
270
|
+
</div>
|
|
271
|
+
</section>
|
|
272
|
+
)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* The default copy, English and Arabic, as `locale` picks it. Spread it to
|
|
277
|
+
* change a few strings and keep the rest.
|
|
278
|
+
*/
|
|
279
|
+
export const heroShapeGridCopy = COPY
|