@smicolon/fasla-ui 0.6.0 → 0.7.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 +2284 -194
- 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,374 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Pause, Play, VolumeX } from "lucide-react"
|
|
5
|
+
import { cn } from "../../../src/lib/utils"
|
|
6
|
+
import { Button, buttonVariants } from "../../ui/button/button"
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Figma: `Hero` (46552:249264), Type=Video-in-Type Hero.
|
|
10
|
+
*
|
|
11
|
+
* A film launch on a `primary` band: a "now playing" line behind a red dot,
|
|
12
|
+
* a huge two-line word with the footage playing inside its letters, a
|
|
13
|
+
* playback bar under it, and a paragraph with two buttons.
|
|
14
|
+
*
|
|
15
|
+
* Desktop keeps the line, the word and the bar in the start column and sets
|
|
16
|
+
* the paragraph and buttons in a 430px column at the end, its foot 48px above
|
|
17
|
+
* the bar's. Tablet and Mobile stack everything in that order, the bar at full
|
|
18
|
+
* width; the word steps down from 9XL to 7XL, and Mobile also steps the
|
|
19
|
+
* paragraph down and stacks the buttons at full width.
|
|
20
|
+
*
|
|
21
|
+
* The footage is a real video, muted and looping, and plays inside the
|
|
22
|
+
* letters. Under it lies the poster, its first frame. The word is the `h1`,
|
|
23
|
+
* real text, set twice over the video: an unseen copy multiplies it (white
|
|
24
|
+
* letters keep the footage, the black ground removes it), then the heading
|
|
25
|
+
* screens the result (its black letters let the footage through, its ground,
|
|
26
|
+
* the section's own colour, shows exactly). Black and white are the blend's
|
|
27
|
+
* two constants, not paint: neither ever shows. So the band and the space
|
|
28
|
+
* round the letters are the same token, and the letters are the footage.
|
|
29
|
+
*
|
|
30
|
+
* The band is `primary` in light mode. In dark mode `primary` turns light and
|
|
31
|
+
* bright footage would not read against it, so the band stays dark there:
|
|
32
|
+
* `background`, with `foreground` text and a light playback bar.
|
|
33
|
+
*
|
|
34
|
+
* The video starts on its own unless the visitor asks for reduced motion;
|
|
35
|
+
* then the letters hold the poster, still, until they press play. Figma's
|
|
36
|
+
* playback bar is the real control: its button plays and pauses the video,
|
|
37
|
+
* and the time and the track follow the video's own position and length.
|
|
38
|
+
* Without a video there is nothing to play: the letters hold the poster, or
|
|
39
|
+
* `muted` without one, and the bar is left out. The footage is decoration
|
|
40
|
+
* and hidden from assistive technology; the heading carries the words.
|
|
41
|
+
*
|
|
42
|
+
* In Arabic the columns mirror: the word and the bar sit on the right and the
|
|
43
|
+
* paragraph on the left, and the track fills from the right, as Figma draws
|
|
44
|
+
* it. The play glyph is never flipped, the time stays left to right, and the
|
|
45
|
+
* footage is never mirrored.
|
|
46
|
+
*
|
|
47
|
+
* Sized by the block's own width, not the window's: the section is a query
|
|
48
|
+
* container. Mobile is the base; `[@container(min-width:48rem)]:` is Figma's
|
|
49
|
+
* Tablet (768) and `[@container(min-width:90rem)]:` its Desktop, from 1440px:
|
|
50
|
+
* the width Figma draws it at, and the switch every Hero block shares, so
|
|
51
|
+
* Tablet's layout covers 768 to 1439.
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
export interface HeroVideoInTypeAction {
|
|
55
|
+
label: React.ReactNode
|
|
56
|
+
href: string
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface HeroVideoInTypeVideo {
|
|
60
|
+
src: string
|
|
61
|
+
/** The file's MIME type, such as `video/webm`. Lets the browser skip a format it can't play. */
|
|
62
|
+
type?: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface HeroVideoInTypePoster {
|
|
66
|
+
src: string
|
|
67
|
+
/**
|
|
68
|
+
* Describes the frame. The footage sits inside the headline as decoration
|
|
69
|
+
* and is hidden from assistive technology, so this is not announced here.
|
|
70
|
+
*/
|
|
71
|
+
alt: string
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface HeroVideoInTypeCopy {
|
|
75
|
+
/** The line beside the red dot, above the word. Hidden when empty. */
|
|
76
|
+
eyebrow: React.ReactNode
|
|
77
|
+
/** The word the footage plays in, an `h1`. A line break in the string breaks the line. */
|
|
78
|
+
headline: React.ReactNode
|
|
79
|
+
/** The paragraph beside the word. */
|
|
80
|
+
description: React.ReactNode
|
|
81
|
+
/** The light button. */
|
|
82
|
+
primaryAction: HeroVideoInTypeAction
|
|
83
|
+
/** The ghost button beside it. Hidden when null. */
|
|
84
|
+
secondaryAction: HeroVideoInTypeAction | null
|
|
85
|
+
/** The label at the end of the playback bar: the footage has no sound. */
|
|
86
|
+
mutedLabel: React.ReactNode
|
|
87
|
+
/** The playback bar's accessible name. */
|
|
88
|
+
controlsLabel: string
|
|
89
|
+
/** The play button's accessible name while the video plays. */
|
|
90
|
+
pauseLabel: string
|
|
91
|
+
/** Its accessible name while the video is paused. */
|
|
92
|
+
playLabel: string
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Figma's copy, English and Arabic. */
|
|
96
|
+
const COPY: Record<"en" | "ar", HeroVideoInTypeCopy> = {
|
|
97
|
+
en: {
|
|
98
|
+
eyebrow: (
|
|
99
|
+
<>
|
|
100
|
+
NOW PLAYING — NORTHFIELD FILM <bdi dir="ltr">01</bdi>
|
|
101
|
+
</>
|
|
102
|
+
),
|
|
103
|
+
headline: "IN\nMOTION",
|
|
104
|
+
description: "A year of work, cut to four minutes — the studio, the arguments, the launches that stuck.",
|
|
105
|
+
primaryAction: { label: "Watch full film", href: "#film" },
|
|
106
|
+
secondaryAction: { label: "Credits", href: "#credits" },
|
|
107
|
+
mutedLabel: "muted",
|
|
108
|
+
controlsLabel: "Film playback",
|
|
109
|
+
pauseLabel: "Pause the film",
|
|
110
|
+
playLabel: "Play the film",
|
|
111
|
+
},
|
|
112
|
+
ar: {
|
|
113
|
+
eyebrow: (
|
|
114
|
+
<>
|
|
115
|
+
يُعرض الآن، فيلم شمال <bdi dir="ltr">01</bdi>
|
|
116
|
+
</>
|
|
117
|
+
),
|
|
118
|
+
headline: "في\nحركة",
|
|
119
|
+
description: "عام من العمل في أربع دقائق: الاستوديو، والنقاشات، والإطلاقات التي بقيت.",
|
|
120
|
+
primaryAction: { label: "شاهد الفيلم كاملًا", href: "#film" },
|
|
121
|
+
secondaryAction: { label: "فريق العمل", href: "#credits" },
|
|
122
|
+
mutedLabel: "صامت",
|
|
123
|
+
controlsLabel: "تشغيل الفيلم",
|
|
124
|
+
pauseLabel: "إيقاف الفيلم مؤقتًا",
|
|
125
|
+
playLabel: "تشغيل الفيلم",
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** The word's type, shared by the heading and its unseen copy so their letters land on the same pixels. */
|
|
130
|
+
const WORD = "whitespace-pre-line text-7xl font-semibold [@container(min-width:90rem)]:text-9xl"
|
|
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
|
+
/** Whether the visitor asks for reduced motion, kept up to date. False on the server and while hydrating. */
|
|
142
|
+
function usePrefersReducedMotion() {
|
|
143
|
+
return React.useSyncExternalStore(
|
|
144
|
+
subscribeToReducedMotion,
|
|
145
|
+
() => typeof window.matchMedia === "function" && window.matchMedia(REDUCED_MOTION).matches,
|
|
146
|
+
() => false
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Seconds as `mm:ss`. Nothing known yet reads as `00:00`. */
|
|
151
|
+
function clock(seconds: number) {
|
|
152
|
+
const whole = Number.isFinite(seconds) && seconds > 0 ? Math.floor(seconds) : 0
|
|
153
|
+
return `${String(Math.floor(whole / 60)).padStart(2, "0")}:${String(whole % 60).padStart(2, "0")}`
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface HeroVideoInTypeProps
|
|
157
|
+
extends Omit<React.HTMLAttributes<HTMLElement>, "title">,
|
|
158
|
+
Partial<HeroVideoInTypeCopy> {
|
|
159
|
+
/** Which language the default copy is in. The page's `dir` sets the direction. */
|
|
160
|
+
locale?: "en" | "ar"
|
|
161
|
+
/**
|
|
162
|
+
* The footage that plays inside the letters: muted, looping, and started
|
|
163
|
+
* on its own unless the visitor asks for reduced motion. None by default:
|
|
164
|
+
* the letters hold the poster, and the playback bar is left out.
|
|
165
|
+
* @default none: the poster, still
|
|
166
|
+
*/
|
|
167
|
+
video?: HeroVideoInTypeVideo
|
|
168
|
+
/**
|
|
169
|
+
* The video's first frame, shown inside the letters until it plays, under
|
|
170
|
+
* reduced motion, and in place of a missing video. None by default: the
|
|
171
|
+
* letters show the `muted` colour in its place.
|
|
172
|
+
* @default none: a `muted` placeholder
|
|
173
|
+
*/
|
|
174
|
+
poster?: HeroVideoInTypePoster
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function HeroVideoInType({
|
|
178
|
+
locale = "en",
|
|
179
|
+
eyebrow,
|
|
180
|
+
headline,
|
|
181
|
+
description,
|
|
182
|
+
primaryAction,
|
|
183
|
+
secondaryAction,
|
|
184
|
+
mutedLabel,
|
|
185
|
+
controlsLabel,
|
|
186
|
+
pauseLabel,
|
|
187
|
+
playLabel,
|
|
188
|
+
video,
|
|
189
|
+
poster,
|
|
190
|
+
className,
|
|
191
|
+
...props
|
|
192
|
+
}: HeroVideoInTypeProps) {
|
|
193
|
+
const copy = COPY[locale]
|
|
194
|
+
const headingId = React.useId()
|
|
195
|
+
const reduced = usePrefersReducedMotion()
|
|
196
|
+
const videoRef = React.useRef<HTMLVideoElement>(null)
|
|
197
|
+
/** Set once the visitor pauses: the video then waits for them, whatever the motion setting does. */
|
|
198
|
+
const heldRef = React.useRef(false)
|
|
199
|
+
const [playing, setPlaying] = React.useState(false)
|
|
200
|
+
const [time, setTime] = React.useState({ current: 0, duration: 0 })
|
|
201
|
+
const label = eyebrow ?? copy.eyebrow
|
|
202
|
+
const word = headline ?? copy.headline
|
|
203
|
+
const primary = primaryAction ?? copy.primaryAction
|
|
204
|
+
const secondary = secondaryAction === undefined ? copy.secondaryAction : secondaryAction
|
|
205
|
+
const src = video?.src
|
|
206
|
+
|
|
207
|
+
// Starts the footage once mounted, never under reduced motion, and stops it
|
|
208
|
+
// when the visitor turns reduced motion on. The query is read here, not from
|
|
209
|
+
// the hook: while hydrating the hook still says false, and the video would
|
|
210
|
+
// play for a frame before stopping.
|
|
211
|
+
React.useEffect(() => {
|
|
212
|
+
const element = videoRef.current
|
|
213
|
+
if (!element) return
|
|
214
|
+
if (window.matchMedia?.(REDUCED_MOTION).matches) {
|
|
215
|
+
element.pause()
|
|
216
|
+
return
|
|
217
|
+
}
|
|
218
|
+
if (heldRef.current) return
|
|
219
|
+
element.muted = true
|
|
220
|
+
element.play().catch(() => {
|
|
221
|
+
// The browser refused to start it: it stays on the poster, and the
|
|
222
|
+
// button offers play.
|
|
223
|
+
})
|
|
224
|
+
}, [reduced, src])
|
|
225
|
+
|
|
226
|
+
/** Reads the position and length off the video. */
|
|
227
|
+
const sync = (element: HTMLVideoElement) => setTime({ current: element.currentTime, duration: element.duration })
|
|
228
|
+
|
|
229
|
+
const toggle = () => {
|
|
230
|
+
const element = videoRef.current
|
|
231
|
+
if (!element) return
|
|
232
|
+
if (element.paused) {
|
|
233
|
+
heldRef.current = false
|
|
234
|
+
element.muted = true
|
|
235
|
+
element.play().catch(() => {})
|
|
236
|
+
} else {
|
|
237
|
+
heldRef.current = true
|
|
238
|
+
element.pause()
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const progress = time.duration > 0 ? Math.min(100, (time.current / time.duration) * 100) : 0
|
|
243
|
+
|
|
244
|
+
return (
|
|
245
|
+
<section aria-labelledby={headingId} className={cn("[container-type:inline-size] bg-primary dark:bg-background", className)} {...props}>
|
|
246
|
+
{/*
|
|
247
|
+
* The section's colour fills the whole width; its content does not.
|
|
248
|
+
* From Tablet up to Desktop the content keeps Figma's Tablet width,
|
|
249
|
+
* 720px inside 24px padding, and centres, so a wide container shows
|
|
250
|
+
* Figma's Tablet layout rather than a stretched one.
|
|
251
|
+
*/}
|
|
252
|
+
<div className="mx-auto grid w-full max-w-[1440px] [@container(min-width:48rem)]:max-w-[48rem] [@container(min-width:90rem)]:max-w-[1440px] content-start 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)]:min-h-[800px] [@container(min-width:90rem)]:grid-cols-[minmax(0,1fr)_26.875rem] [@container(min-width:90rem)]:gap-x-8 [@container(min-width:90rem)]:gap-y-0 [@container(min-width:90rem)]:px-[110px] [@container(min-width:90rem)]:py-[110px]">
|
|
253
|
+
{label ? (
|
|
254
|
+
<p className="flex items-center gap-3 text-sm font-medium text-primary-foreground/75 dark:text-foreground/75 [@container(min-width:90rem)]:col-start-1">
|
|
255
|
+
<span aria-hidden className="size-[9px] shrink-0 rounded-full bg-destructive" />
|
|
256
|
+
<span>{label}</span>
|
|
257
|
+
</p>
|
|
258
|
+
) : null}
|
|
259
|
+
|
|
260
|
+
{/*
|
|
261
|
+
* The word, hugging its letters. Bottom to top: the footage, the
|
|
262
|
+
* unseen copy that multiplies it (white letters on black), and the
|
|
263
|
+
* heading that screens the result (black letters on `primary`). In
|
|
264
|
+
* forced colours the blends are gone, so the footage and the copy
|
|
265
|
+
* step aside and the heading reads as plain text.
|
|
266
|
+
*/}
|
|
267
|
+
<div className="relative isolate w-fit max-w-full overflow-hidden [@container(min-width:90rem)]:col-start-1 [@container(min-width:90rem)]:mt-[50px]">
|
|
268
|
+
<div aria-hidden className="absolute inset-0 bg-muted forced-colors:hidden">
|
|
269
|
+
{video ? (
|
|
270
|
+
<video
|
|
271
|
+
key={video.src}
|
|
272
|
+
ref={videoRef}
|
|
273
|
+
poster={poster?.src}
|
|
274
|
+
muted
|
|
275
|
+
loop
|
|
276
|
+
playsInline
|
|
277
|
+
preload="metadata"
|
|
278
|
+
tabIndex={-1}
|
|
279
|
+
onPlay={() => setPlaying(true)}
|
|
280
|
+
onPause={() => setPlaying(false)}
|
|
281
|
+
onLoadedMetadata={(event) => sync(event.currentTarget)}
|
|
282
|
+
onDurationChange={(event) => sync(event.currentTarget)}
|
|
283
|
+
onTimeUpdate={(event) => sync(event.currentTarget)}
|
|
284
|
+
className="absolute inset-0 size-full object-cover"
|
|
285
|
+
>
|
|
286
|
+
<source src={video.src} type={video.type} />
|
|
287
|
+
</video>
|
|
288
|
+
) : poster ? (
|
|
289
|
+
<img src={poster.src} alt={poster.alt} decoding="async" className="absolute inset-0 size-full object-cover" />
|
|
290
|
+
) : null}
|
|
291
|
+
</div>
|
|
292
|
+
<p aria-hidden className={cn("absolute inset-0 bg-[black] text-[white] mix-blend-multiply forced-colors:hidden", WORD)}>
|
|
293
|
+
{word}
|
|
294
|
+
</p>
|
|
295
|
+
<h1 id={headingId} className={cn("relative bg-primary text-[black] mix-blend-screen dark:bg-background", WORD)}>
|
|
296
|
+
{word}
|
|
297
|
+
</h1>
|
|
298
|
+
</div>
|
|
299
|
+
|
|
300
|
+
{video ? (
|
|
301
|
+
<div
|
|
302
|
+
role="group"
|
|
303
|
+
aria-label={controlsLabel ?? copy.controlsLabel}
|
|
304
|
+
className="flex h-8 min-w-0 items-center gap-4 rounded-full bg-primary-foreground/95 pe-4 ps-2 text-xs text-primary dark:bg-foreground/95 dark:text-background [@container(min-width:90rem)]:col-start-1 [@container(min-width:90rem)]:mt-[94px] [@container(min-width:90rem)]:w-fit"
|
|
305
|
+
>
|
|
306
|
+
{/* Figma's play glyph, as the real button: it plays and pauses the footage. */}
|
|
307
|
+
<Button
|
|
308
|
+
type="button"
|
|
309
|
+
variant="ghost"
|
|
310
|
+
tone="primary"
|
|
311
|
+
size="icon-sm"
|
|
312
|
+
radius="rounded"
|
|
313
|
+
aria-label={playing ? pauseLabel ?? copy.pauseLabel : playLabel ?? copy.playLabel}
|
|
314
|
+
onClick={toggle}
|
|
315
|
+
className="-me-2 dark:text-background hover:dark:bg-background/10 hover:dark:text-background active:dark:bg-background/10 active:dark:text-background"
|
|
316
|
+
>
|
|
317
|
+
{playing ? (
|
|
318
|
+
<Pause aria-hidden="true" size={16} strokeWidth={1.5} absoluteStrokeWidth fill="currentColor" />
|
|
319
|
+
) : (
|
|
320
|
+
<Play aria-hidden="true" size={16} strokeWidth={1.5} absoluteStrokeWidth fill="currentColor" />
|
|
321
|
+
)}
|
|
322
|
+
</Button>
|
|
323
|
+
<p className="whitespace-nowrap font-medium tabular-nums">
|
|
324
|
+
<bdi dir="ltr">
|
|
325
|
+
{clock(time.current)} / {clock(time.duration)}
|
|
326
|
+
</bdi>
|
|
327
|
+
</p>
|
|
328
|
+
{/* The track follows the video; the time beside it says the same in words. */}
|
|
329
|
+
<div
|
|
330
|
+
aria-hidden
|
|
331
|
+
className="h-1 min-w-0 flex-1 overflow-hidden rounded-full bg-primary/25 dark:bg-background/25 [@container(min-width:90rem)]:w-[220px] [@container(min-width:90rem)]:flex-none"
|
|
332
|
+
>
|
|
333
|
+
<div className="h-full rounded-full bg-primary dark:bg-background" style={{ width: `${progress}%` }} />
|
|
334
|
+
</div>
|
|
335
|
+
<p className="flex shrink-0 items-center gap-1 whitespace-nowrap">
|
|
336
|
+
<VolumeX aria-hidden="true" size={12} strokeWidth={1.5} absoluteStrokeWidth className="size-3" />
|
|
337
|
+
{mutedLabel ?? copy.mutedLabel}
|
|
338
|
+
</p>
|
|
339
|
+
</div>
|
|
340
|
+
) : null}
|
|
341
|
+
|
|
342
|
+
<div className="flex min-w-0 flex-col gap-5 [@container(min-width:90rem)]:col-start-2 [@container(min-width:90rem)]:row-span-3 [@container(min-width:90rem)]:row-start-1 [@container(min-width:90rem)]:mb-12 [@container(min-width:90rem)]:self-end">
|
|
343
|
+
<p className="text-pretty text-base text-primary-foreground dark:text-foreground [@container(min-width:48rem)]:text-lg">{description ?? copy.description}</p>
|
|
344
|
+
<div className="flex flex-col gap-3 [@container(min-width:48rem)]:flex-row">
|
|
345
|
+
<a href={primary.href} className={buttonVariants({ variant: "secondary", size: "lg" })}>
|
|
346
|
+
{primary.label}
|
|
347
|
+
</a>
|
|
348
|
+
{secondary ? (
|
|
349
|
+
<a
|
|
350
|
+
href={secondary.href}
|
|
351
|
+
// Figma sets the ghost label in `primary-foreground` to read on
|
|
352
|
+
// the band; the hover tint follows it, so the label stays legible.
|
|
353
|
+
className={buttonVariants({
|
|
354
|
+
variant: "ghost",
|
|
355
|
+
tone: "secondary",
|
|
356
|
+
size: "lg",
|
|
357
|
+
className: "text-primary-foreground hover:bg-primary-foreground/10 active:bg-primary-foreground/10 dark:text-foreground hover:dark:bg-foreground/10 active:dark:bg-foreground/10",
|
|
358
|
+
})}
|
|
359
|
+
>
|
|
360
|
+
{secondary.label}
|
|
361
|
+
</a>
|
|
362
|
+
) : null}
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
</div>
|
|
366
|
+
</section>
|
|
367
|
+
)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* The default copy, English and Arabic, as `locale` picks it. Spread it to
|
|
372
|
+
* change a few strings and keep the rest.
|
|
373
|
+
*/
|
|
374
|
+
export const heroVideoInTypeCopy = COPY
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "../../../src/lib/utils"
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Figma: `Hero` (46552:249264), Type=Video Spotlight Hero.
|
|
8
|
+
*
|
|
9
|
+
* A film in the spotlight: a centred headline between two thin rules, a
|
|
10
|
+
* line about the film, and one large card holding it. Before it plays the
|
|
11
|
+
* card shows the poster, a round play button in its middle, a small panel
|
|
12
|
+
* with the film's title and a line about it at the bottom start, and a chip
|
|
13
|
+
* with its running time at the bottom end.
|
|
14
|
+
*
|
|
15
|
+
* It is a real player. The play button starts the film with sound, since the
|
|
16
|
+
* visitor chose to play it, hides the poster and its labels, and hands over
|
|
17
|
+
* to the browser's own controls: keyboard operable, with a captions menu when
|
|
18
|
+
* `captions` are passed, and full screen. Focus moves to the player, so it
|
|
19
|
+
* is not lost with the button. It never plays by itself, so reduced motion
|
|
20
|
+
* needs nothing more. Without a `video` the card is a still: the poster and
|
|
21
|
+
* its labels, no button.
|
|
22
|
+
*
|
|
23
|
+
* Desktop draws the rules beside the headline and the card 560px tall, its
|
|
24
|
+
* labels 24px from the edges. Tablet keeps the rules, the card 400px tall and
|
|
25
|
+
* the labels 16px in. Mobile drops the rules and the title panel, sets the
|
|
26
|
+
* headline at the start as Figma does, and keeps the card 220px tall with the
|
|
27
|
+
* running time.
|
|
28
|
+
*
|
|
29
|
+
* In Arabic the title panel moves to the right and the running time to the
|
|
30
|
+
* left. The running time stays left to right. The poster and the film are
|
|
31
|
+
* never flipped, and neither is the play triangle: it names the direction a
|
|
32
|
+
* film runs, not the direction of reading.
|
|
33
|
+
*
|
|
34
|
+
* Sized by the block's own width, not the window's: the section is a query
|
|
35
|
+
* container and everything inside, its padding included, follows it. Mobile
|
|
36
|
+
* is the base; `[@container(min-width:48rem)]:` is Figma's Tablet (768) and
|
|
37
|
+
* `[@container(min-width:90rem)]:` its Desktop, from 1440px, the width Figma
|
|
38
|
+
* draws it at. Narrower, the wide card turns into a letterbox, so Tablet's
|
|
39
|
+
* layout covers 768 to 1439.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
export interface HeroVideoSpotlightVideo {
|
|
43
|
+
src: string
|
|
44
|
+
/** The file's media type, such as "video/webm". Lets the browser skip a format it cannot play. */
|
|
45
|
+
type?: string
|
|
46
|
+
/**
|
|
47
|
+
* The video's CORS mode. Set it when the captions come from another origin:
|
|
48
|
+
* a browser loads a cross-origin caption track only when the video asks
|
|
49
|
+
* for CORS, and the video's own server then has to allow it too.
|
|
50
|
+
*/
|
|
51
|
+
crossOrigin?: "anonymous" | "use-credentials"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface HeroVideoSpotlightPoster {
|
|
55
|
+
src: string
|
|
56
|
+
/** Describes the still. Pass "" for a purely decorative one. */
|
|
57
|
+
alt: string
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface HeroVideoSpotlightCaptions {
|
|
61
|
+
/** A WebVTT file. From another origin it needs CORS headers, and the video's `crossOrigin` set. */
|
|
62
|
+
src: string
|
|
63
|
+
/** The captions' language, such as "en" or "ar". */
|
|
64
|
+
srcLang: string
|
|
65
|
+
/** The name the player's captions menu shows. */
|
|
66
|
+
label: string
|
|
67
|
+
/** Turns these captions on from the start. */
|
|
68
|
+
default?: boolean
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface HeroVideoSpotlightCopy {
|
|
72
|
+
/** The headline, an `h1`. */
|
|
73
|
+
headline: React.ReactNode
|
|
74
|
+
/** The line under the headline. */
|
|
75
|
+
description: React.ReactNode
|
|
76
|
+
/** The film's title, in the panel at the card's bottom start. Also the player's name. Hidden when empty. */
|
|
77
|
+
videoTitle: React.ReactNode
|
|
78
|
+
/** The line under the title. Hidden when empty. */
|
|
79
|
+
videoDescription: React.ReactNode
|
|
80
|
+
/** The running time, in the chip at the card's bottom end. Shown left to right. Hidden when empty. */
|
|
81
|
+
duration: React.ReactNode
|
|
82
|
+
/** The play button's accessible name. */
|
|
83
|
+
playLabel: string
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Figma's copy, English and Arabic. */
|
|
87
|
+
const COPY: Record<"en" | "ar", HeroVideoSpotlightCopy> = {
|
|
88
|
+
en: {
|
|
89
|
+
headline: "Make every team calm",
|
|
90
|
+
description: "Four minutes on why we think work should feel quieter — and what we built to get there.",
|
|
91
|
+
videoTitle: "The Northfield story",
|
|
92
|
+
videoDescription: "Our founders on calm software",
|
|
93
|
+
duration: "4:12",
|
|
94
|
+
playLabel: "Play the film",
|
|
95
|
+
},
|
|
96
|
+
ar: {
|
|
97
|
+
headline: "اجعل كل فريق هادئًا",
|
|
98
|
+
description: "أربع دقائق عن سبب إيماننا بأن العمل يجب أن يكون أهدأ، وما بنيناه لنصل إلى ذلك.",
|
|
99
|
+
videoTitle: "قصة شمال",
|
|
100
|
+
videoDescription: "مؤسسونا يتحدثون عن البرمجيات الهادئة",
|
|
101
|
+
duration: "4:12",
|
|
102
|
+
playLabel: "شغّل الفيلم",
|
|
103
|
+
},
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface HeroVideoSpotlightProps
|
|
107
|
+
extends Omit<React.HTMLAttributes<HTMLElement>, "title">,
|
|
108
|
+
Partial<HeroVideoSpotlightCopy> {
|
|
109
|
+
/** Which language the default copy is in. The page's `dir` sets the direction. */
|
|
110
|
+
locale?: "en" | "ar"
|
|
111
|
+
/**
|
|
112
|
+
* The film. None by default: the card is a still, with no play button.
|
|
113
|
+
* @default none: a still card
|
|
114
|
+
*/
|
|
115
|
+
video?: HeroVideoSpotlightVideo
|
|
116
|
+
/**
|
|
117
|
+
* The still shown before the film plays, usually its first frame. None by
|
|
118
|
+
* default: the card shows the `muted` colour in its place.
|
|
119
|
+
* @default none: a `muted` placeholder
|
|
120
|
+
*/
|
|
121
|
+
poster?: HeroVideoSpotlightPoster
|
|
122
|
+
/**
|
|
123
|
+
* Caption tracks, one per language, offered in the player's captions menu.
|
|
124
|
+
* @default none
|
|
125
|
+
*/
|
|
126
|
+
captions?: HeroVideoSpotlightCaptions[]
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function HeroVideoSpotlight({
|
|
130
|
+
locale = "en",
|
|
131
|
+
headline,
|
|
132
|
+
description,
|
|
133
|
+
videoTitle,
|
|
134
|
+
videoDescription,
|
|
135
|
+
duration,
|
|
136
|
+
playLabel,
|
|
137
|
+
video,
|
|
138
|
+
poster,
|
|
139
|
+
captions,
|
|
140
|
+
className,
|
|
141
|
+
...props
|
|
142
|
+
}: HeroVideoSpotlightProps) {
|
|
143
|
+
const copy = COPY[locale]
|
|
144
|
+
const headingId = React.useId()
|
|
145
|
+
const titleId = React.useId()
|
|
146
|
+
const panelId = React.useId()
|
|
147
|
+
const durationId = React.useId()
|
|
148
|
+
const title = videoTitle ?? copy.videoTitle
|
|
149
|
+
const subtitle = videoDescription ?? copy.videoDescription
|
|
150
|
+
const time = duration ?? copy.duration
|
|
151
|
+
const hasPanel = Boolean(title || subtitle)
|
|
152
|
+
|
|
153
|
+
const videoRef = React.useRef<HTMLVideoElement>(null)
|
|
154
|
+
// The film that was started. A new `video` reads as not started, so the
|
|
155
|
+
// poster and its button come back without clearing any state.
|
|
156
|
+
const [startedSrc, setStartedSrc] = React.useState<string | null>(null)
|
|
157
|
+
const started = video !== undefined && startedSrc === video.src
|
|
158
|
+
|
|
159
|
+
const play = () => {
|
|
160
|
+
const player = videoRef.current
|
|
161
|
+
if (!player || !video) return
|
|
162
|
+
setStartedSrc(video.src)
|
|
163
|
+
// Inside the click, so the browser counts it as the visitor's choice and
|
|
164
|
+
// lets the film play with sound. If it still refuses, the player's own
|
|
165
|
+
// controls are showing by then to start it.
|
|
166
|
+
player.play().catch(() => {})
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// The button is gone once the film starts: keep focus on the player.
|
|
170
|
+
React.useEffect(() => {
|
|
171
|
+
if (started) videoRef.current?.focus()
|
|
172
|
+
}, [started])
|
|
173
|
+
|
|
174
|
+
return (
|
|
175
|
+
<section aria-labelledby={headingId} className={cn("[container-type:inline-size] bg-background", className)} {...props}>
|
|
176
|
+
{/*
|
|
177
|
+
* The section's colour fills the whole width; its content does not.
|
|
178
|
+
* From Tablet up to Desktop the content keeps Figma's Tablet width,
|
|
179
|
+
* 720px inside 24px padding, and centres, so a wide container shows
|
|
180
|
+
* Figma's Tablet layout rather than a stretched one.
|
|
181
|
+
*/}
|
|
182
|
+
<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-20 [@container(min-width:90rem)]:pb-16 [@container(min-width:90rem)]:pt-20">
|
|
183
|
+
<div className="flex items-center gap-6">
|
|
184
|
+
{/* A plain 1px line where Figma draws its Separator. Swap in Separator once it is built. */}
|
|
185
|
+
<div aria-hidden className="hidden h-px min-w-8 flex-1 bg-border [@container(min-width:48rem)]:block" />
|
|
186
|
+
<h1
|
|
187
|
+
id={headingId}
|
|
188
|
+
className="min-w-0 text-balance text-4xl font-semibold text-foreground [@container(min-width:48rem)]:text-center [@container(min-width:48rem)]:text-5xl [@container(min-width:90rem)]:text-6xl"
|
|
189
|
+
>
|
|
190
|
+
{headline ?? copy.headline}
|
|
191
|
+
</h1>
|
|
192
|
+
<div aria-hidden className="hidden h-px min-w-8 flex-1 bg-border [@container(min-width:48rem)]:block" />
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<p className="text-balance text-center text-base text-muted-foreground [@container(min-width:48rem)]:text-lg">
|
|
196
|
+
{description ?? copy.description}
|
|
197
|
+
</p>
|
|
198
|
+
|
|
199
|
+
<div
|
|
200
|
+
className={cn(
|
|
201
|
+
"relative h-[220px] w-full overflow-hidden rounded-xl shadow-lg [@container(min-width:48rem)]:h-[400px] [@container(min-width:90rem)]:h-[560px]",
|
|
202
|
+
// Playing, the film is shown whole, on a dark band in both modes
|
|
203
|
+
// where its shape differs from the card's.
|
|
204
|
+
started ? "bg-background-inverse dark:bg-muted" : "bg-muted"
|
|
205
|
+
)}
|
|
206
|
+
>
|
|
207
|
+
{video ? (
|
|
208
|
+
<video
|
|
209
|
+
key={video.src}
|
|
210
|
+
ref={videoRef}
|
|
211
|
+
crossOrigin={video.crossOrigin}
|
|
212
|
+
preload="metadata"
|
|
213
|
+
playsInline
|
|
214
|
+
controls={started}
|
|
215
|
+
tabIndex={started ? 0 : -1}
|
|
216
|
+
aria-hidden={started ? undefined : true}
|
|
217
|
+
aria-labelledby={title ? titleId : undefined}
|
|
218
|
+
className={cn("absolute inset-0 size-full", started ? "object-contain" : "object-cover")}
|
|
219
|
+
>
|
|
220
|
+
<source src={video.src} type={video.type} />
|
|
221
|
+
{captions?.map((track) => (
|
|
222
|
+
<track key={track.src} kind="captions" src={track.src} srcLang={track.srcLang} label={track.label} default={track.default} />
|
|
223
|
+
))}
|
|
224
|
+
</video>
|
|
225
|
+
) : null}
|
|
226
|
+
|
|
227
|
+
{started ? null : poster ? (
|
|
228
|
+
<img src={poster.src} alt={poster.alt} decoding="async" className="absolute inset-0 size-full object-cover" />
|
|
229
|
+
) : video ? (
|
|
230
|
+
<div aria-hidden className="absolute inset-0 bg-muted" />
|
|
231
|
+
) : null}
|
|
232
|
+
|
|
233
|
+
{/* No display class on this wrapper, so `hidden` hides it. Kept in the DOM: the title names the player. */}
|
|
234
|
+
<div hidden={started}>
|
|
235
|
+
{hasPanel ? (
|
|
236
|
+
<div
|
|
237
|
+
id={panelId}
|
|
238
|
+
className="absolute bottom-4 start-4 hidden max-w-[60%] flex-col gap-1 rounded-lg bg-background px-4 py-3 shadow-md [@container(min-width:48rem)]:flex [@container(min-width:90rem)]:bottom-6 [@container(min-width:90rem)]:start-6"
|
|
239
|
+
>
|
|
240
|
+
{title ? (
|
|
241
|
+
<p id={titleId} className="text-sm font-semibold text-foreground">
|
|
242
|
+
{title}
|
|
243
|
+
</p>
|
|
244
|
+
) : null}
|
|
245
|
+
{subtitle ? <p className="text-xs text-muted-foreground">{subtitle}</p> : null}
|
|
246
|
+
</div>
|
|
247
|
+
) : null}
|
|
248
|
+
{time ? (
|
|
249
|
+
<p
|
|
250
|
+
id={durationId}
|
|
251
|
+
className="absolute bottom-4 end-4 whitespace-nowrap rounded-full bg-background px-2.5 py-1 text-xs text-muted-foreground [@container(min-width:90rem)]:bottom-6 [@container(min-width:90rem)]:end-6"
|
|
252
|
+
>
|
|
253
|
+
<bdi dir="ltr">{time}</bdi>
|
|
254
|
+
</p>
|
|
255
|
+
) : null}
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
{video && !started ? (
|
|
259
|
+
<button
|
|
260
|
+
type="button"
|
|
261
|
+
onClick={play}
|
|
262
|
+
aria-label={playLabel ?? copy.playLabel}
|
|
263
|
+
aria-describedby={[hasPanel ? panelId : "", time ? durationId : ""].filter(Boolean).join(" ") || undefined}
|
|
264
|
+
className="absolute inset-0 m-auto size-[84px] cursor-pointer rounded-full bg-background text-foreground shadow-lg transition-colors duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)] [outline:none] motion-reduce:transition-none hover:bg-muted focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring forced-colors:border forced-colors:border-[ButtonText]"
|
|
265
|
+
>
|
|
266
|
+
{/*
|
|
267
|
+
* Figma's triangle: 34 × 36 with 4px corners, its centre of
|
|
268
|
+
* mass on the circle's centre. Drawn 4px inside its edge and
|
|
269
|
+
* stroked 8px with round joins, which rounds the corners.
|
|
270
|
+
*/}
|
|
271
|
+
<svg aria-hidden viewBox="0 0 84 84" className="absolute inset-0 size-full">
|
|
272
|
+
<path
|
|
273
|
+
d="M35.5 30.7 56.4 42 35.5 53.3Z"
|
|
274
|
+
fill="currentColor"
|
|
275
|
+
stroke="currentColor"
|
|
276
|
+
strokeWidth={8}
|
|
277
|
+
strokeLinejoin="round"
|
|
278
|
+
/>
|
|
279
|
+
</svg>
|
|
280
|
+
</button>
|
|
281
|
+
) : null}
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
</section>
|
|
285
|
+
)
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* The default copy, English and Arabic, as `locale` picks it. Spread it to
|
|
290
|
+
* change a few strings and keep the rest.
|
|
291
|
+
*/
|
|
292
|
+
export const heroVideoSpotlightCopy = COPY
|