rothzerg-ui 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/app-download/AppDownload.cjs +7 -5
- package/dist/blocks/app-download/AppDownload.cjs.map +1 -1
- package/dist/blocks/app-download/AppDownload.d.ts.map +1 -1
- package/dist/blocks/app-download/AppDownload.js +7 -5
- package/dist/blocks/app-download/AppDownload.js.map +1 -1
- package/dist/blocks/auth-form/AuthForm.cjs +11 -9
- package/dist/blocks/auth-form/AuthForm.cjs.map +1 -1
- package/dist/blocks/auth-form/AuthForm.d.ts.map +1 -1
- package/dist/blocks/auth-form/AuthForm.js +11 -9
- package/dist/blocks/auth-form/AuthForm.js.map +1 -1
- package/dist/blocks/blog-post/BlogPost.cjs +55 -20
- package/dist/blocks/blog-post/BlogPost.cjs.map +1 -1
- package/dist/blocks/blog-post/BlogPost.d.ts +7 -1
- package/dist/blocks/blog-post/BlogPost.d.ts.map +1 -1
- package/dist/blocks/blog-post/BlogPost.js +55 -20
- package/dist/blocks/blog-post/BlogPost.js.map +1 -1
- package/dist/blocks/changelog/Changelog.cjs +8 -6
- package/dist/blocks/changelog/Changelog.cjs.map +1 -1
- package/dist/blocks/changelog/Changelog.d.ts.map +1 -1
- package/dist/blocks/changelog/Changelog.js +8 -6
- package/dist/blocks/changelog/Changelog.js.map +1 -1
- package/dist/blocks/coming-soon/ComingSoon.cjs +4 -3
- package/dist/blocks/coming-soon/ComingSoon.cjs.map +1 -1
- package/dist/blocks/coming-soon/ComingSoon.d.ts.map +1 -1
- package/dist/blocks/coming-soon/ComingSoon.js +4 -3
- package/dist/blocks/coming-soon/ComingSoon.js.map +1 -1
- package/dist/blocks/command-palette/CommandPalette.cjs +110 -0
- package/dist/blocks/command-palette/CommandPalette.cjs.map +1 -0
- package/dist/blocks/command-palette/CommandPalette.d.ts +44 -0
- package/dist/blocks/command-palette/CommandPalette.d.ts.map +1 -0
- package/dist/blocks/command-palette/CommandPalette.js +110 -0
- package/dist/blocks/command-palette/CommandPalette.js.map +1 -0
- package/dist/blocks/command-palette/index.d.ts +3 -0
- package/dist/blocks/command-palette/index.d.ts.map +1 -0
- package/dist/blocks/contact-form/ContactForm.cjs +16 -14
- package/dist/blocks/contact-form/ContactForm.cjs.map +1 -1
- package/dist/blocks/contact-form/ContactForm.d.ts.map +1 -1
- package/dist/blocks/contact-form/ContactForm.js +16 -14
- package/dist/blocks/contact-form/ContactForm.js.map +1 -1
- package/dist/blocks/cookie-consent/CookieConsent.cjs +9 -7
- package/dist/blocks/cookie-consent/CookieConsent.cjs.map +1 -1
- package/dist/blocks/cookie-consent/CookieConsent.d.ts.map +1 -1
- package/dist/blocks/cookie-consent/CookieConsent.js +9 -7
- package/dist/blocks/cookie-consent/CookieConsent.js.map +1 -1
- package/dist/blocks/cta/CTA.cjs +9 -6
- package/dist/blocks/cta/CTA.cjs.map +1 -1
- package/dist/blocks/cta/CTA.d.ts.map +1 -1
- package/dist/blocks/cta/CTA.js +9 -6
- package/dist/blocks/cta/CTA.js.map +1 -1
- package/dist/blocks/empty-state/EmptyState.cjs +5 -3
- package/dist/blocks/empty-state/EmptyState.cjs.map +1 -1
- package/dist/blocks/empty-state/EmptyState.d.ts.map +1 -1
- package/dist/blocks/empty-state/EmptyState.js +5 -3
- package/dist/blocks/empty-state/EmptyState.js.map +1 -1
- package/dist/blocks/error-page/ErrorPage.cjs +5 -3
- package/dist/blocks/error-page/ErrorPage.cjs.map +1 -1
- package/dist/blocks/error-page/ErrorPage.d.ts.map +1 -1
- package/dist/blocks/error-page/ErrorPage.js +5 -3
- package/dist/blocks/error-page/ErrorPage.js.map +1 -1
- package/dist/blocks/faq/FAQ.cjs +8 -6
- package/dist/blocks/faq/FAQ.cjs.map +1 -1
- package/dist/blocks/faq/FAQ.d.ts.map +1 -1
- package/dist/blocks/faq/FAQ.js +8 -6
- package/dist/blocks/faq/FAQ.js.map +1 -1
- package/dist/blocks/features-grid/FeaturesGrid.cjs +9 -7
- package/dist/blocks/features-grid/FeaturesGrid.cjs.map +1 -1
- package/dist/blocks/features-grid/FeaturesGrid.d.ts.map +1 -1
- package/dist/blocks/features-grid/FeaturesGrid.js +9 -7
- package/dist/blocks/features-grid/FeaturesGrid.js.map +1 -1
- package/dist/blocks/footer/Footer.cjs +11 -8
- package/dist/blocks/footer/Footer.cjs.map +1 -1
- package/dist/blocks/footer/Footer.d.ts.map +1 -1
- package/dist/blocks/footer/Footer.js +11 -8
- package/dist/blocks/footer/Footer.js.map +1 -1
- package/dist/blocks/hero/Hero.cjs +9 -6
- package/dist/blocks/hero/Hero.cjs.map +1 -1
- package/dist/blocks/hero/Hero.d.ts.map +1 -1
- package/dist/blocks/hero/Hero.js +9 -6
- package/dist/blocks/hero/Hero.js.map +1 -1
- package/dist/blocks/index.d.ts +3 -1
- package/dist/blocks/index.d.ts.map +1 -1
- package/dist/blocks/maintenance/Maintenance.cjs +6 -5
- package/dist/blocks/maintenance/Maintenance.cjs.map +1 -1
- package/dist/blocks/maintenance/Maintenance.d.ts.map +1 -1
- package/dist/blocks/maintenance/Maintenance.js +6 -5
- package/dist/blocks/maintenance/Maintenance.js.map +1 -1
- package/dist/blocks/newsletter/Newsletter.cjs +9 -7
- package/dist/blocks/newsletter/Newsletter.cjs.map +1 -1
- package/dist/blocks/newsletter/Newsletter.d.ts.map +1 -1
- package/dist/blocks/newsletter/Newsletter.js +9 -7
- package/dist/blocks/newsletter/Newsletter.js.map +1 -1
- package/dist/blocks/notification-center/NotificationCenter.cjs +10 -7
- package/dist/blocks/notification-center/NotificationCenter.cjs.map +1 -1
- package/dist/blocks/notification-center/NotificationCenter.d.ts.map +1 -1
- package/dist/blocks/notification-center/NotificationCenter.js +10 -7
- package/dist/blocks/notification-center/NotificationCenter.js.map +1 -1
- package/dist/blocks/onboarding/Onboarding.cjs +8 -25
- package/dist/blocks/onboarding/Onboarding.cjs.map +1 -1
- package/dist/blocks/onboarding/Onboarding.d.ts.map +1 -1
- package/dist/blocks/onboarding/Onboarding.js +8 -25
- package/dist/blocks/onboarding/Onboarding.js.map +1 -1
- package/dist/blocks/pricing/Pricing.cjs +6 -4
- package/dist/blocks/pricing/Pricing.cjs.map +1 -1
- package/dist/blocks/pricing/Pricing.d.ts.map +1 -1
- package/dist/blocks/pricing/Pricing.js +6 -4
- package/dist/blocks/pricing/Pricing.js.map +1 -1
- package/dist/blocks/pricing-comparison/PricingComparison.cjs +5 -3
- package/dist/blocks/pricing-comparison/PricingComparison.cjs.map +1 -1
- package/dist/blocks/pricing-comparison/PricingComparison.d.ts.map +1 -1
- package/dist/blocks/pricing-comparison/PricingComparison.js +5 -3
- package/dist/blocks/pricing-comparison/PricingComparison.js.map +1 -1
- package/dist/blocks/profile-page/ProfilePage.cjs +14 -11
- package/dist/blocks/profile-page/ProfilePage.cjs.map +1 -1
- package/dist/blocks/profile-page/ProfilePage.d.ts.map +1 -1
- package/dist/blocks/profile-page/ProfilePage.js +14 -11
- package/dist/blocks/profile-page/ProfilePage.js.map +1 -1
- package/dist/blocks/settings-page/SettingsPage.cjs +10 -8
- package/dist/blocks/settings-page/SettingsPage.cjs.map +1 -1
- package/dist/blocks/settings-page/SettingsPage.d.ts.map +1 -1
- package/dist/blocks/settings-page/SettingsPage.js +10 -8
- package/dist/blocks/settings-page/SettingsPage.js.map +1 -1
- package/dist/blocks/sidebar/Sidebar.cjs +51 -13
- package/dist/blocks/sidebar/Sidebar.cjs.map +1 -1
- package/dist/blocks/sidebar/Sidebar.d.ts +11 -1
- package/dist/blocks/sidebar/Sidebar.d.ts.map +1 -1
- package/dist/blocks/sidebar/Sidebar.js +51 -13
- package/dist/blocks/sidebar/Sidebar.js.map +1 -1
- package/dist/blocks/stats/Stats.cjs +9 -6
- package/dist/blocks/stats/Stats.cjs.map +1 -1
- package/dist/blocks/stats/Stats.d.ts.map +1 -1
- package/dist/blocks/stats/Stats.js +9 -6
- package/dist/blocks/stats/Stats.js.map +1 -1
- package/dist/blocks/team-grid/TeamGrid.cjs +11 -8
- package/dist/blocks/team-grid/TeamGrid.cjs.map +1 -1
- package/dist/blocks/team-grid/TeamGrid.d.ts.map +1 -1
- package/dist/blocks/team-grid/TeamGrid.js +11 -8
- package/dist/blocks/team-grid/TeamGrid.js.map +1 -1
- package/dist/blocks/testimonials/Testimonials.cjs +9 -7
- package/dist/blocks/testimonials/Testimonials.cjs.map +1 -1
- package/dist/blocks/testimonials/Testimonials.d.ts.map +1 -1
- package/dist/blocks/testimonials/Testimonials.js +9 -7
- package/dist/blocks/testimonials/Testimonials.js.map +1 -1
- package/dist/components/alert/Alert.cjs +4 -2
- package/dist/components/alert/Alert.cjs.map +1 -1
- package/dist/components/alert/Alert.d.ts.map +1 -1
- package/dist/components/alert/Alert.js +4 -2
- package/dist/components/alert/Alert.js.map +1 -1
- package/dist/components/banner/Banner.cjs +2 -1
- package/dist/components/banner/Banner.cjs.map +1 -1
- package/dist/components/banner/Banner.d.ts.map +1 -1
- package/dist/components/banner/Banner.js +2 -1
- package/dist/components/banner/Banner.js.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.cjs +15 -2
- package/dist/components/breadcrumb/Breadcrumb.cjs.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js +15 -2
- package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/button/Button.cjs +16 -2
- package/dist/components/button/Button.cjs.map +1 -1
- package/dist/components/button/Button.d.ts.map +1 -1
- package/dist/components/button/Button.js +17 -3
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/checkbox/Checkbox.cjs +1 -1
- package/dist/components/checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/checkbox/Checkbox.js +1 -1
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/code-block/CodeBlock.cjs +6 -2
- package/dist/components/code-block/CodeBlock.cjs.map +1 -1
- package/dist/components/code-block/CodeBlock.d.ts.map +1 -1
- package/dist/components/code-block/CodeBlock.js +6 -2
- package/dist/components/code-block/CodeBlock.js.map +1 -1
- package/dist/components/code-block/highlight.cjs +328 -0
- package/dist/components/code-block/highlight.cjs.map +1 -0
- package/dist/components/code-block/highlight.d.ts +7 -0
- package/dist/components/code-block/highlight.d.ts.map +1 -0
- package/dist/components/code-block/highlight.js +328 -0
- package/dist/components/code-block/highlight.js.map +1 -0
- package/dist/components/columns/Columns.cjs +38 -0
- package/dist/components/columns/Columns.cjs.map +1 -0
- package/dist/components/columns/Columns.d.ts +52 -0
- package/dist/components/columns/Columns.d.ts.map +1 -0
- package/dist/components/columns/Columns.js +38 -0
- package/dist/components/columns/Columns.js.map +1 -0
- package/dist/components/columns/index.d.ts +3 -0
- package/dist/components/columns/index.d.ts.map +1 -0
- package/dist/components/empty-content/EmptyContent.cjs +5 -3
- package/dist/components/empty-content/EmptyContent.cjs.map +1 -1
- package/dist/components/empty-content/EmptyContent.d.ts.map +1 -1
- package/dist/components/empty-content/EmptyContent.js +5 -3
- package/dist/components/empty-content/EmptyContent.js.map +1 -1
- package/dist/components/grid/Grid.cjs +66 -0
- package/dist/components/grid/Grid.cjs.map +1 -0
- package/dist/components/grid/Grid.d.ts +67 -0
- package/dist/components/grid/Grid.d.ts.map +1 -0
- package/dist/components/grid/Grid.js +66 -0
- package/dist/components/grid/Grid.js.map +1 -0
- package/dist/components/grid/index.d.ts +3 -0
- package/dist/components/grid/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/resizable/Resizable.cjs +4 -4
- package/dist/components/resizable/Resizable.cjs.map +1 -1
- package/dist/components/resizable/Resizable.d.ts +2 -1
- package/dist/components/resizable/Resizable.d.ts.map +1 -1
- package/dist/components/resizable/Resizable.js +4 -4
- package/dist/components/resizable/Resizable.js.map +1 -1
- package/dist/components/rows/Rows.cjs +38 -0
- package/dist/components/rows/Rows.cjs.map +1 -0
- package/dist/components/rows/Rows.d.ts +50 -0
- package/dist/components/rows/Rows.d.ts.map +1 -0
- package/dist/components/rows/Rows.js +38 -0
- package/dist/components/rows/Rows.js.map +1 -0
- package/dist/components/rows/index.d.ts +3 -0
- package/dist/components/rows/index.d.ts.map +1 -0
- package/dist/components/stat-card/StatCard.cjs +6 -4
- package/dist/components/stat-card/StatCard.cjs.map +1 -1
- package/dist/components/stat-card/StatCard.d.ts.map +1 -1
- package/dist/components/stat-card/StatCard.js +6 -4
- package/dist/components/stat-card/StatCard.js.map +1 -1
- package/dist/components/stepper/Stepper.cjs +5 -3
- package/dist/components/stepper/Stepper.cjs.map +1 -1
- package/dist/components/stepper/Stepper.d.ts.map +1 -1
- package/dist/components/stepper/Stepper.js +5 -3
- package/dist/components/stepper/Stepper.js.map +1 -1
- package/dist/components/text/Text.cjs +56 -0
- package/dist/components/text/Text.cjs.map +1 -0
- package/dist/components/text/Text.d.ts +48 -0
- package/dist/components/text/Text.d.ts.map +1 -0
- package/dist/components/text/Text.js +56 -0
- package/dist/components/text/Text.js.map +1 -0
- package/dist/components/text/index.d.ts +3 -0
- package/dist/components/text/index.d.ts.map +1 -0
- package/dist/components/timeline/Timeline.cjs +6 -4
- package/dist/components/timeline/Timeline.cjs.map +1 -1
- package/dist/components/timeline/Timeline.d.ts.map +1 -1
- package/dist/components/timeline/Timeline.js +6 -4
- package/dist/components/timeline/Timeline.js.map +1 -1
- package/dist/components/tooltip/Tooltip.cjs +2 -2
- package/dist/components/tooltip/Tooltip.cjs.map +1 -1
- package/dist/components/tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/tooltip/Tooltip.js +3 -3
- package/dist/components/tooltip/Tooltip.js.map +1 -1
- package/dist/index.cjs +13 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/provider/RothzergProvider.cjs +41 -44
- package/dist/provider/RothzergProvider.cjs.map +1 -1
- package/dist/provider/RothzergProvider.d.ts +1 -1
- package/dist/provider/RothzergProvider.d.ts.map +1 -1
- package/dist/provider/RothzergProvider.js +41 -44
- package/dist/provider/RothzergProvider.js.map +1 -1
- package/dist/styles.css +845 -25
- package/package.json +1 -1
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
;/* empty css */
|
|
5
|
+
const Rows = require("../../components/rows/Rows.cjs");
|
|
6
|
+
const Text = require("../../components/text/Text.cjs");
|
|
5
7
|
function AppleIcon() {
|
|
6
8
|
return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z" }) });
|
|
7
9
|
}
|
|
@@ -37,10 +39,10 @@ function AppDownload({
|
|
|
37
39
|
className = ""
|
|
38
40
|
}) {
|
|
39
41
|
const classes = ["rz-app-download", `rz-app-download--${layout}`, className].filter(Boolean).join(" ");
|
|
40
|
-
const contentSide = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
41
|
-
eyebrow && /* @__PURE__ */ jsxRuntime.jsx("p",
|
|
42
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2",
|
|
43
|
-
/* @__PURE__ */ jsxRuntime.jsx("p",
|
|
42
|
+
const contentSide = /* @__PURE__ */ jsxRuntime.jsxs(Rows.Rows, { className: "rz-app-download__content", children: [
|
|
43
|
+
eyebrow && /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "p", className: "rz-app-download__eyebrow", children: eyebrow }),
|
|
44
|
+
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "h2", className: "rz-app-download__title", children: title }),
|
|
45
|
+
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "p", className: "rz-app-download__description", children: description }),
|
|
44
46
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-app-download__buttons", children: stores.map((store) => {
|
|
45
47
|
const meta = STORE_META[store.type];
|
|
46
48
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -83,7 +85,7 @@ function AppDownload({
|
|
|
83
85
|
] });
|
|
84
86
|
const visualSide = showQR ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-app-download__visual", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rz-app-download__qr", children: [
|
|
85
87
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-app-download__qr-placeholder", "aria-hidden": "true" }),
|
|
86
|
-
/* @__PURE__ */ jsxRuntime.jsx("p",
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "p", className: "rz-app-download__qr-label", children: "Scan to download" })
|
|
87
89
|
] }) }) : showMockup ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-app-download__visual", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-app-download__mockup", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-app-download__mockup-screen", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-app-download__mockup-notch" }) }) }) }) : null;
|
|
88
90
|
if (layout === "centered") {
|
|
89
91
|
return /* @__PURE__ */ jsxRuntime.jsx("section", { className: classes, "aria-label": "App download", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rz-app-download__inner", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppDownload.cjs","sources":["../../../src/blocks/app-download/AppDownload.tsx"],"sourcesContent":["import './app-download.css';\n\nexport type AppDownloadLayout = 'centered' | 'split';\n\nexport interface AppStore {\n type: 'appstore' | 'googleplay';\n href?: string;\n onClick?: () => void;\n}\n\nexport interface AppFeature {\n text: string;\n}\n\nexport interface AppDownloadProps {\n title?: string;\n description?: string;\n eyebrow?: string;\n stores?: AppStore[];\n features?: AppFeature[];\n rating?: number;\n ratingCount?: string;\n showMockup?: boolean;\n showQR?: boolean;\n layout?: AppDownloadLayout;\n className?: string;\n}\n\nfunction AppleIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n );\n}\n\nfunction PlayIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3.18 23.48c-.39-.23-.68-.64-.68-1.15V1.67c0-.51.29-.92.68-1.15l.12-.06 12.1 12.1v.28L3.3 23.54l-.12-.06zm16.46-9.76l-2.93 1.69-3.23-3.23 3.23-3.23 2.93 1.69c.84.48.84 1.6 0 2.08zm-4.95-4.78L3.41.66C3.71.5 4.07.52 4.41.68l.12.07L17 8.35l-2.31 2.59z\"/>\n </svg>\n );\n}\n\nfunction CheckCircle() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nfunction StarIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>\n </svg>\n );\n}\n\nconst STORE_META = {\n appstore: { sub: 'Download on the', name: 'App Store', Icon: AppleIcon },\n googleplay: { sub: 'Get it on', name: 'Google Play', Icon: PlayIcon },\n};\n\nexport function AppDownload({\n title = 'Take it with you',\n description = 'Download our app and stay connected wherever you go. Available on iOS and Android.',\n eyebrow = 'Mobile App',\n stores = [{ type: 'appstore' }, { type: 'googleplay' }],\n features = [\n { text: 'Works offline — sync when back online' },\n { text: 'Native push notifications' },\n { text: 'Biometric authentication' },\n { text: 'Free forever, no credit card required' },\n ],\n rating,\n ratingCount,\n showMockup = true,\n showQR = false,\n layout = 'split',\n className = '',\n}: AppDownloadProps) {\n const classes = ['rz-app-download', `rz-app-download--${layout}`, className].filter(Boolean).join(' ');\n\n const contentSide = (\n <
|
|
1
|
+
{"version":3,"file":"AppDownload.cjs","sources":["../../../src/blocks/app-download/AppDownload.tsx"],"sourcesContent":["import { Text } from '../../components/text';\nimport { Rows } from '../../components/rows';\nimport './app-download.css';\n\nexport type AppDownloadLayout = 'centered' | 'split';\n\nexport interface AppStore {\n type: 'appstore' | 'googleplay';\n href?: string;\n onClick?: () => void;\n}\n\nexport interface AppFeature {\n text: string;\n}\n\nexport interface AppDownloadProps {\n title?: string;\n description?: string;\n eyebrow?: string;\n stores?: AppStore[];\n features?: AppFeature[];\n rating?: number;\n ratingCount?: string;\n showMockup?: boolean;\n showQR?: boolean;\n layout?: AppDownloadLayout;\n className?: string;\n}\n\nfunction AppleIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n );\n}\n\nfunction PlayIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3.18 23.48c-.39-.23-.68-.64-.68-1.15V1.67c0-.51.29-.92.68-1.15l.12-.06 12.1 12.1v.28L3.3 23.54l-.12-.06zm16.46-9.76l-2.93 1.69-3.23-3.23 3.23-3.23 2.93 1.69c.84.48.84 1.6 0 2.08zm-4.95-4.78L3.41.66C3.71.5 4.07.52 4.41.68l.12.07L17 8.35l-2.31 2.59z\"/>\n </svg>\n );\n}\n\nfunction CheckCircle() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nfunction StarIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>\n </svg>\n );\n}\n\nconst STORE_META = {\n appstore: { sub: 'Download on the', name: 'App Store', Icon: AppleIcon },\n googleplay: { sub: 'Get it on', name: 'Google Play', Icon: PlayIcon },\n};\n\nexport function AppDownload({\n title = 'Take it with you',\n description = 'Download our app and stay connected wherever you go. Available on iOS and Android.',\n eyebrow = 'Mobile App',\n stores = [{ type: 'appstore' }, { type: 'googleplay' }],\n features = [\n { text: 'Works offline — sync when back online' },\n { text: 'Native push notifications' },\n { text: 'Biometric authentication' },\n { text: 'Free forever, no credit card required' },\n ],\n rating,\n ratingCount,\n showMockup = true,\n showQR = false,\n layout = 'split',\n className = '',\n}: AppDownloadProps) {\n const classes = ['rz-app-download', `rz-app-download--${layout}`, className].filter(Boolean).join(' ');\n\n const contentSide = (\n <Rows className=\"rz-app-download__content\">\n {eyebrow && <Text as=\"p\" className=\"rz-app-download__eyebrow\">{eyebrow}</Text>}\n <Text as=\"h2\" className=\"rz-app-download__title\">{title}</Text>\n <Text as=\"p\" className=\"rz-app-download__description\">{description}</Text>\n\n <div className=\"rz-app-download__buttons\">\n {stores.map((store) => {\n const meta = STORE_META[store.type];\n return (\n <a\n key={store.type}\n href={store.href ?? '#'}\n className=\"rz-app-download__store-btn\"\n onClick={store.onClick ? (e) => { e.preventDefault(); store.onClick!(); } : undefined}\n aria-label={`${meta.name}`}\n >\n <meta.Icon />\n <div>\n <span className=\"rz-app-download__store-sub\">{meta.sub}</span>\n <span className=\"rz-app-download__store-name\">{meta.name}</span>\n </div>\n </a>\n );\n })}\n </div>\n\n {rating !== undefined && (\n <div className=\"rz-app-download__rating\">\n <div className=\"rz-app-download__stars\">\n {Array.from({ length: 5 }).map((_, i) => (\n <StarIcon key={i} />\n ))}\n </div>\n <span><strong>{rating}</strong> / 5</span>\n {ratingCount && <span>({ratingCount} reviews)</span>}\n </div>\n )}\n\n {features.length > 0 && (\n <div className=\"rz-app-download__features\">\n {features.map((f, i) => (\n <div key={i} className=\"rz-app-download__feature\">\n <span className=\"rz-app-download__feature-icon\">\n <CheckCircle />\n </span>\n {f.text}\n </div>\n ))}\n </div>\n )}\n </Rows>\n );\n\n const visualSide = showQR ? (\n <div className=\"rz-app-download__visual\">\n <div className=\"rz-app-download__qr\">\n <div className=\"rz-app-download__qr-placeholder\" aria-hidden=\"true\" />\n <Text as=\"p\" className=\"rz-app-download__qr-label\">Scan to download</Text>\n </div>\n </div>\n ) : showMockup ? (\n <div className=\"rz-app-download__visual\">\n <div className=\"rz-app-download__mockup\">\n <div className=\"rz-app-download__mockup-screen\">\n <div className=\"rz-app-download__mockup-notch\" />\n </div>\n </div>\n </div>\n ) : null;\n\n if (layout === 'centered') {\n return (\n <section className={classes} aria-label=\"App download\">\n <div className=\"rz-app-download__inner\">\n {contentSide}\n {visualSide}\n </div>\n </section>\n );\n }\n\n return (\n <section className={classes} aria-label=\"App download\">\n <div className=\"rz-app-download__inner\">\n {contentSide}\n {visualSide}\n </div>\n </section>\n );\n}\n"],"names":["jsx","jsxs","Rows","Text"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppDownload.d.ts","sourceRoot":"","sources":["../../../src/blocks/app-download/AppDownload.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppDownload.d.ts","sourceRoot":"","sources":["../../../src/blocks/app-download/AppDownload.tsx"],"names":[],"mappings":"AAEA,OAAO,oBAAoB,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuCD,wBAAgB,WAAW,CAAC,EAC1B,KAA0B,EAC1B,WAAkG,EAClG,OAAsB,EACtB,MAAuD,EACvD,QAKC,EACD,MAAM,EACN,WAAW,EACX,UAAiB,EACjB,MAAc,EACd,MAAgB,EAChB,SAAc,GACf,EAAE,gBAAgB,2CA6FlB"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
/* empty css */
|
|
3
|
+
import { Rows } from "../../components/rows/Rows.js";
|
|
4
|
+
import { Text } from "../../components/text/Text.js";
|
|
3
5
|
function AppleIcon() {
|
|
4
6
|
return /* @__PURE__ */ jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z" }) });
|
|
5
7
|
}
|
|
@@ -35,10 +37,10 @@ function AppDownload({
|
|
|
35
37
|
className = ""
|
|
36
38
|
}) {
|
|
37
39
|
const classes = ["rz-app-download", `rz-app-download--${layout}`, className].filter(Boolean).join(" ");
|
|
38
|
-
const contentSide = /* @__PURE__ */ jsxs(
|
|
39
|
-
eyebrow && /* @__PURE__ */ jsx("p",
|
|
40
|
-
/* @__PURE__ */ jsx("h2",
|
|
41
|
-
/* @__PURE__ */ jsx("p",
|
|
40
|
+
const contentSide = /* @__PURE__ */ jsxs(Rows, { className: "rz-app-download__content", children: [
|
|
41
|
+
eyebrow && /* @__PURE__ */ jsx(Text, { as: "p", className: "rz-app-download__eyebrow", children: eyebrow }),
|
|
42
|
+
/* @__PURE__ */ jsx(Text, { as: "h2", className: "rz-app-download__title", children: title }),
|
|
43
|
+
/* @__PURE__ */ jsx(Text, { as: "p", className: "rz-app-download__description", children: description }),
|
|
42
44
|
/* @__PURE__ */ jsx("div", { className: "rz-app-download__buttons", children: stores.map((store) => {
|
|
43
45
|
const meta = STORE_META[store.type];
|
|
44
46
|
return /* @__PURE__ */ jsxs(
|
|
@@ -81,7 +83,7 @@ function AppDownload({
|
|
|
81
83
|
] });
|
|
82
84
|
const visualSide = showQR ? /* @__PURE__ */ jsx("div", { className: "rz-app-download__visual", children: /* @__PURE__ */ jsxs("div", { className: "rz-app-download__qr", children: [
|
|
83
85
|
/* @__PURE__ */ jsx("div", { className: "rz-app-download__qr-placeholder", "aria-hidden": "true" }),
|
|
84
|
-
/* @__PURE__ */ jsx("p",
|
|
86
|
+
/* @__PURE__ */ jsx(Text, { as: "p", className: "rz-app-download__qr-label", children: "Scan to download" })
|
|
85
87
|
] }) }) : showMockup ? /* @__PURE__ */ jsx("div", { className: "rz-app-download__visual", children: /* @__PURE__ */ jsx("div", { className: "rz-app-download__mockup", children: /* @__PURE__ */ jsx("div", { className: "rz-app-download__mockup-screen", children: /* @__PURE__ */ jsx("div", { className: "rz-app-download__mockup-notch" }) }) }) }) : null;
|
|
86
88
|
if (layout === "centered") {
|
|
87
89
|
return /* @__PURE__ */ jsx("section", { className: classes, "aria-label": "App download", children: /* @__PURE__ */ jsxs("div", { className: "rz-app-download__inner", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppDownload.js","sources":["../../../src/blocks/app-download/AppDownload.tsx"],"sourcesContent":["import './app-download.css';\n\nexport type AppDownloadLayout = 'centered' | 'split';\n\nexport interface AppStore {\n type: 'appstore' | 'googleplay';\n href?: string;\n onClick?: () => void;\n}\n\nexport interface AppFeature {\n text: string;\n}\n\nexport interface AppDownloadProps {\n title?: string;\n description?: string;\n eyebrow?: string;\n stores?: AppStore[];\n features?: AppFeature[];\n rating?: number;\n ratingCount?: string;\n showMockup?: boolean;\n showQR?: boolean;\n layout?: AppDownloadLayout;\n className?: string;\n}\n\nfunction AppleIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n );\n}\n\nfunction PlayIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3.18 23.48c-.39-.23-.68-.64-.68-1.15V1.67c0-.51.29-.92.68-1.15l.12-.06 12.1 12.1v.28L3.3 23.54l-.12-.06zm16.46-9.76l-2.93 1.69-3.23-3.23 3.23-3.23 2.93 1.69c.84.48.84 1.6 0 2.08zm-4.95-4.78L3.41.66C3.71.5 4.07.52 4.41.68l.12.07L17 8.35l-2.31 2.59z\"/>\n </svg>\n );\n}\n\nfunction CheckCircle() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nfunction StarIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>\n </svg>\n );\n}\n\nconst STORE_META = {\n appstore: { sub: 'Download on the', name: 'App Store', Icon: AppleIcon },\n googleplay: { sub: 'Get it on', name: 'Google Play', Icon: PlayIcon },\n};\n\nexport function AppDownload({\n title = 'Take it with you',\n description = 'Download our app and stay connected wherever you go. Available on iOS and Android.',\n eyebrow = 'Mobile App',\n stores = [{ type: 'appstore' }, { type: 'googleplay' }],\n features = [\n { text: 'Works offline — sync when back online' },\n { text: 'Native push notifications' },\n { text: 'Biometric authentication' },\n { text: 'Free forever, no credit card required' },\n ],\n rating,\n ratingCount,\n showMockup = true,\n showQR = false,\n layout = 'split',\n className = '',\n}: AppDownloadProps) {\n const classes = ['rz-app-download', `rz-app-download--${layout}`, className].filter(Boolean).join(' ');\n\n const contentSide = (\n <
|
|
1
|
+
{"version":3,"file":"AppDownload.js","sources":["../../../src/blocks/app-download/AppDownload.tsx"],"sourcesContent":["import { Text } from '../../components/text';\nimport { Rows } from '../../components/rows';\nimport './app-download.css';\n\nexport type AppDownloadLayout = 'centered' | 'split';\n\nexport interface AppStore {\n type: 'appstore' | 'googleplay';\n href?: string;\n onClick?: () => void;\n}\n\nexport interface AppFeature {\n text: string;\n}\n\nexport interface AppDownloadProps {\n title?: string;\n description?: string;\n eyebrow?: string;\n stores?: AppStore[];\n features?: AppFeature[];\n rating?: number;\n ratingCount?: string;\n showMockup?: boolean;\n showQR?: boolean;\n layout?: AppDownloadLayout;\n className?: string;\n}\n\nfunction AppleIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n );\n}\n\nfunction PlayIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3.18 23.48c-.39-.23-.68-.64-.68-1.15V1.67c0-.51.29-.92.68-1.15l.12-.06 12.1 12.1v.28L3.3 23.54l-.12-.06zm16.46-9.76l-2.93 1.69-3.23-3.23 3.23-3.23 2.93 1.69c.84.48.84 1.6 0 2.08zm-4.95-4.78L3.41.66C3.71.5 4.07.52 4.41.68l.12.07L17 8.35l-2.31 2.59z\"/>\n </svg>\n );\n}\n\nfunction CheckCircle() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nfunction StarIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>\n </svg>\n );\n}\n\nconst STORE_META = {\n appstore: { sub: 'Download on the', name: 'App Store', Icon: AppleIcon },\n googleplay: { sub: 'Get it on', name: 'Google Play', Icon: PlayIcon },\n};\n\nexport function AppDownload({\n title = 'Take it with you',\n description = 'Download our app and stay connected wherever you go. Available on iOS and Android.',\n eyebrow = 'Mobile App',\n stores = [{ type: 'appstore' }, { type: 'googleplay' }],\n features = [\n { text: 'Works offline — sync when back online' },\n { text: 'Native push notifications' },\n { text: 'Biometric authentication' },\n { text: 'Free forever, no credit card required' },\n ],\n rating,\n ratingCount,\n showMockup = true,\n showQR = false,\n layout = 'split',\n className = '',\n}: AppDownloadProps) {\n const classes = ['rz-app-download', `rz-app-download--${layout}`, className].filter(Boolean).join(' ');\n\n const contentSide = (\n <Rows className=\"rz-app-download__content\">\n {eyebrow && <Text as=\"p\" className=\"rz-app-download__eyebrow\">{eyebrow}</Text>}\n <Text as=\"h2\" className=\"rz-app-download__title\">{title}</Text>\n <Text as=\"p\" className=\"rz-app-download__description\">{description}</Text>\n\n <div className=\"rz-app-download__buttons\">\n {stores.map((store) => {\n const meta = STORE_META[store.type];\n return (\n <a\n key={store.type}\n href={store.href ?? '#'}\n className=\"rz-app-download__store-btn\"\n onClick={store.onClick ? (e) => { e.preventDefault(); store.onClick!(); } : undefined}\n aria-label={`${meta.name}`}\n >\n <meta.Icon />\n <div>\n <span className=\"rz-app-download__store-sub\">{meta.sub}</span>\n <span className=\"rz-app-download__store-name\">{meta.name}</span>\n </div>\n </a>\n );\n })}\n </div>\n\n {rating !== undefined && (\n <div className=\"rz-app-download__rating\">\n <div className=\"rz-app-download__stars\">\n {Array.from({ length: 5 }).map((_, i) => (\n <StarIcon key={i} />\n ))}\n </div>\n <span><strong>{rating}</strong> / 5</span>\n {ratingCount && <span>({ratingCount} reviews)</span>}\n </div>\n )}\n\n {features.length > 0 && (\n <div className=\"rz-app-download__features\">\n {features.map((f, i) => (\n <div key={i} className=\"rz-app-download__feature\">\n <span className=\"rz-app-download__feature-icon\">\n <CheckCircle />\n </span>\n {f.text}\n </div>\n ))}\n </div>\n )}\n </Rows>\n );\n\n const visualSide = showQR ? (\n <div className=\"rz-app-download__visual\">\n <div className=\"rz-app-download__qr\">\n <div className=\"rz-app-download__qr-placeholder\" aria-hidden=\"true\" />\n <Text as=\"p\" className=\"rz-app-download__qr-label\">Scan to download</Text>\n </div>\n </div>\n ) : showMockup ? (\n <div className=\"rz-app-download__visual\">\n <div className=\"rz-app-download__mockup\">\n <div className=\"rz-app-download__mockup-screen\">\n <div className=\"rz-app-download__mockup-notch\" />\n </div>\n </div>\n </div>\n ) : null;\n\n if (layout === 'centered') {\n return (\n <section className={classes} aria-label=\"App download\">\n <div className=\"rz-app-download__inner\">\n {contentSide}\n {visualSide}\n </div>\n </section>\n );\n }\n\n return (\n <section className={classes} aria-label=\"App download\">\n <div className=\"rz-app-download__inner\">\n {contentSide}\n {visualSide}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@ const jsxRuntime = require("react/jsx-runtime");
|
|
|
4
4
|
const cn = require("../../utils/cn.cjs");
|
|
5
5
|
const Button = require("../../components/button/Button.cjs");
|
|
6
6
|
;/* empty css */
|
|
7
|
+
const Rows = require("../../components/rows/Rows.cjs");
|
|
8
|
+
const Text = require("../../components/text/Text.cjs");
|
|
7
9
|
const defaultLoginFields = [
|
|
8
10
|
{ name: "email", label: "Email", type: "email", placeholder: "you@example.com", required: true },
|
|
9
11
|
{ name: "password", label: "Password", type: "password", placeholder: "••••••••", required: true }
|
|
@@ -38,10 +40,10 @@ function AuthForm({
|
|
|
38
40
|
const resolvedTitle = title ?? (mode === "login" ? "Welcome back" : "Create an account");
|
|
39
41
|
const resolvedSubtitle = subtitle ?? (mode === "login" ? "Sign in to your account" : "Start your free account today");
|
|
40
42
|
const resolvedSubmit = submitLabel ?? (mode === "login" ? "Sign In" : "Create Account");
|
|
41
|
-
const formContent = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
43
|
+
const formContent = /* @__PURE__ */ jsxRuntime.jsxs(Rows.Rows, { className: "rz-auth-form__card", children: [
|
|
42
44
|
logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-auth-form__logo", children: logo }),
|
|
43
|
-
/* @__PURE__ */ jsxRuntime.jsx("h1",
|
|
44
|
-
/* @__PURE__ */ jsxRuntime.jsx("p",
|
|
45
|
+
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "h1", className: "rz-auth-form__title", children: resolvedTitle }),
|
|
46
|
+
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "p", className: "rz-auth-form__subtitle", children: resolvedSubtitle }),
|
|
45
47
|
socialProviders.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
46
48
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-auth-form__social", children: socialProviders.map((p) => /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", className: "rz-auth-form__social-btn", onClick: p.onClick, children: [
|
|
47
49
|
p.icon,
|
|
@@ -51,7 +53,7 @@ function AuthForm({
|
|
|
51
53
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-auth-form__divider", children: "or" })
|
|
52
54
|
] }),
|
|
53
55
|
/* @__PURE__ */ jsxRuntime.jsxs("form", { className: "rz-auth-form__body", onSubmit, children: [
|
|
54
|
-
resolvedFields.map((field) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
56
|
+
resolvedFields.map((field) => /* @__PURE__ */ jsxRuntime.jsxs(Rows.Rows, { className: "rz-auth-form__field", children: [
|
|
55
57
|
/* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: field.name, className: "rz-auth-form__label", children: field.label }),
|
|
56
58
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
57
59
|
"input",
|
|
@@ -71,7 +73,7 @@ function AuthForm({
|
|
|
71
73
|
] }, field.name)),
|
|
72
74
|
/* @__PURE__ */ jsxRuntime.jsx(Button.Button, { type: "submit", fullWidth: true, loading, className: "rz-auth-form__submit", children: resolvedSubmit })
|
|
73
75
|
] }),
|
|
74
|
-
footerText && /* @__PURE__ */ jsxRuntime.jsxs("p",
|
|
76
|
+
footerText && /* @__PURE__ */ jsxRuntime.jsxs(Text.Text, { as: "p", className: "rz-auth-form__footer", children: [
|
|
75
77
|
footerText,
|
|
76
78
|
" ",
|
|
77
79
|
footerLinkLabel && /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#", className: "rz-auth-form__footer-link", onClick: (e) => {
|
|
@@ -85,13 +87,13 @@ function AuthForm({
|
|
|
85
87
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-auth-form__panel", children: formContent }),
|
|
86
88
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-auth-form__side", children: sideContent ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
87
89
|
/* @__PURE__ */ jsxRuntime.jsx("div", {}),
|
|
88
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
89
|
-
sideQuote && /* @__PURE__ */ jsxRuntime.jsxs("blockquote",
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Rows.Rows, { children: [
|
|
91
|
+
sideQuote && /* @__PURE__ */ jsxRuntime.jsxs(Text.Text, { as: "blockquote", className: "rz-auth-form__side-quote", children: [
|
|
90
92
|
"“",
|
|
91
93
|
sideQuote,
|
|
92
94
|
"”"
|
|
93
95
|
] }),
|
|
94
|
-
sideAttribution && /* @__PURE__ */ jsxRuntime.jsxs("p",
|
|
96
|
+
sideAttribution && /* @__PURE__ */ jsxRuntime.jsxs(Text.Text, { as: "p", className: "rz-auth-form__side-attribution", children: [
|
|
95
97
|
"— ",
|
|
96
98
|
sideAttribution
|
|
97
99
|
] })
|
|
@@ -99,7 +101,7 @@ function AuthForm({
|
|
|
99
101
|
] }) })
|
|
100
102
|
] });
|
|
101
103
|
}
|
|
102
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn.cn("rz-auth-form rz-auth-form--centered", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-auth-form__panel
|
|
104
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn.cn("rz-auth-form rz-auth-form--centered", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-auth-form__panel rz-auth-form__panel--card", children: formContent }) });
|
|
103
105
|
}
|
|
104
106
|
exports.AuthForm = AuthForm;
|
|
105
107
|
//# sourceMappingURL=AuthForm.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthForm.cjs","sources":["../../../src/blocks/auth-form/AuthForm.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../../components/button/Button';\nimport './auth-form.css';\n\nexport type AuthFormMode = 'login' | 'register';\nexport type AuthFormLayout = 'centered' | 'split';\n\nexport interface SocialProvider {\n label: string;\n icon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface AuthFormField {\n name: string;\n label: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport interface AuthFormProps {\n mode?: AuthFormMode;\n layout?: AuthFormLayout;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n fields?: AuthFormField[];\n socialProviders?: SocialProvider[];\n showForgotPassword?: boolean;\n onForgotPassword?: () => void;\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\n submitLabel?: string;\n loading?: boolean;\n footerText?: string;\n footerLinkLabel?: string;\n onFooterLink?: () => void;\n /** Split layout: side panel content */\n sideQuote?: string;\n sideAttribution?: string;\n sideContent?: React.ReactNode;\n className?: string;\n}\n\nconst defaultLoginFields: AuthFormField[] = [\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: '••••••••', required: true },\n];\n\nconst defaultRegisterFields: AuthFormField[] = [\n { name: 'name', label: 'Full Name', type: 'text', placeholder: 'Jane Doe', required: true },\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: 'Min. 8 characters', required: true },\n];\n\nexport function AuthForm({\n mode = 'login',\n layout = 'centered',\n logo,\n title,\n subtitle,\n fields,\n socialProviders = [],\n showForgotPassword = true,\n onForgotPassword,\n onSubmit,\n submitLabel,\n loading = false,\n footerText,\n footerLinkLabel,\n onFooterLink,\n sideQuote,\n sideAttribution,\n sideContent,\n className,\n}: AuthFormProps) {\n const resolvedFields = fields ?? (mode === 'login' ? defaultLoginFields : defaultRegisterFields);\n const resolvedTitle = title ?? (mode === 'login' ? 'Welcome back' : 'Create an account');\n const resolvedSubtitle = subtitle ?? (mode === 'login' ? 'Sign in to your account' : 'Start your free account today');\n const resolvedSubmit = submitLabel ?? (mode === 'login' ? 'Sign In' : 'Create Account');\n\n const formContent = (\n <
|
|
1
|
+
{"version":3,"file":"AuthForm.cjs","sources":["../../../src/blocks/auth-form/AuthForm.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../../components/button/Button';\nimport { Text } from '../../components/text';\nimport { Rows } from '../../components/rows';\nimport './auth-form.css';\n\nexport type AuthFormMode = 'login' | 'register';\nexport type AuthFormLayout = 'centered' | 'split';\n\nexport interface SocialProvider {\n label: string;\n icon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface AuthFormField {\n name: string;\n label: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport interface AuthFormProps {\n mode?: AuthFormMode;\n layout?: AuthFormLayout;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n fields?: AuthFormField[];\n socialProviders?: SocialProvider[];\n showForgotPassword?: boolean;\n onForgotPassword?: () => void;\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\n submitLabel?: string;\n loading?: boolean;\n footerText?: string;\n footerLinkLabel?: string;\n onFooterLink?: () => void;\n /** Split layout: side panel content */\n sideQuote?: string;\n sideAttribution?: string;\n sideContent?: React.ReactNode;\n className?: string;\n}\n\nconst defaultLoginFields: AuthFormField[] = [\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: '••••••••', required: true },\n];\n\nconst defaultRegisterFields: AuthFormField[] = [\n { name: 'name', label: 'Full Name', type: 'text', placeholder: 'Jane Doe', required: true },\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: 'Min. 8 characters', required: true },\n];\n\nexport function AuthForm({\n mode = 'login',\n layout = 'centered',\n logo,\n title,\n subtitle,\n fields,\n socialProviders = [],\n showForgotPassword = true,\n onForgotPassword,\n onSubmit,\n submitLabel,\n loading = false,\n footerText,\n footerLinkLabel,\n onFooterLink,\n sideQuote,\n sideAttribution,\n sideContent,\n className,\n}: AuthFormProps) {\n const resolvedFields = fields ?? (mode === 'login' ? defaultLoginFields : defaultRegisterFields);\n const resolvedTitle = title ?? (mode === 'login' ? 'Welcome back' : 'Create an account');\n const resolvedSubtitle = subtitle ?? (mode === 'login' ? 'Sign in to your account' : 'Start your free account today');\n const resolvedSubmit = submitLabel ?? (mode === 'login' ? 'Sign In' : 'Create Account');\n\n const formContent = (\n <Rows className=\"rz-auth-form__card\">\n {logo && <div className=\"rz-auth-form__logo\">{logo}</div>}\n <Text as=\"h1\" className=\"rz-auth-form__title\">{resolvedTitle}</Text>\n <Text as=\"p\" className=\"rz-auth-form__subtitle\">{resolvedSubtitle}</Text>\n\n {socialProviders.length > 0 && (\n <>\n <div className=\"rz-auth-form__social\">\n {socialProviders.map((p) => (\n <button key={p.label} type=\"button\" className=\"rz-auth-form__social-btn\" onClick={p.onClick}>\n {p.icon}\n Continue with {p.label}\n </button>\n ))}\n </div>\n <div className=\"rz-auth-form__divider\">or</div>\n </>\n )}\n\n <form className=\"rz-auth-form__body\" onSubmit={onSubmit}>\n {resolvedFields.map((field) => (\n <Rows key={field.name} className=\"rz-auth-form__field\">\n <label htmlFor={field.name} className=\"rz-auth-form__label\">{field.label}</label>\n <input\n id={field.name}\n name={field.name}\n type={field.type ?? 'text'}\n placeholder={field.placeholder}\n required={field.required}\n className=\"rz-auth-form__input\"\n />\n {field.name === 'password' && mode === 'login' && showForgotPassword && (\n <a href=\"#\" className=\"rz-auth-form__forgot\" onClick={(e) => { e.preventDefault(); onForgotPassword?.(); }}>\n Forgot password?\n </a>\n )}\n </Rows>\n ))}\n <Button type=\"submit\" fullWidth loading={loading} className=\"rz-auth-form__submit\">\n {resolvedSubmit}\n </Button>\n </form>\n\n {footerText && (\n <Text as=\"p\" className=\"rz-auth-form__footer\">\n {footerText}{' '}\n {footerLinkLabel && (\n <a href=\"#\" className=\"rz-auth-form__footer-link\" onClick={(e) => { e.preventDefault(); onFooterLink?.(); }}>\n {footerLinkLabel}\n </a>\n )}\n </Text>\n )}\n </Rows>\n );\n\n if (layout === 'split') {\n return (\n <div className={cn('rz-auth-form rz-auth-form--split', className)}>\n <div className=\"rz-auth-form__panel\">\n {formContent}\n </div>\n <div className=\"rz-auth-form__side\">\n {sideContent ?? (\n <>\n <div />\n <Rows>\n {sideQuote && <Text as=\"blockquote\" className=\"rz-auth-form__side-quote\">“{sideQuote}”</Text>}\n {sideAttribution && <Text as=\"p\" className=\"rz-auth-form__side-attribution\">— {sideAttribution}</Text>}\n </Rows>\n </>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn('rz-auth-form rz-auth-form--centered', className)}>\n <div className=\"rz-auth-form__panel rz-auth-form__panel--card\">\n {formContent}\n </div>\n </div>\n );\n}\n"],"names":["jsxs","Rows","jsx","Text","Fragment","Button","cn"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthForm.d.ts","sourceRoot":"","sources":["../../../src/blocks/auth-form/AuthForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthForm.d.ts","sourceRoot":"","sources":["../../../src/blocks/auth-form/AuthForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,iBAAiB,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;AAChD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,wBAAgB,QAAQ,CAAC,EACvB,IAAc,EACd,MAAmB,EACnB,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,eAAoB,EACpB,kBAAyB,EACzB,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,OAAe,EACf,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,SAAS,GACV,EAAE,aAAa,2CA2Ff"}
|
|
@@ -2,6 +2,8 @@ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
|
2
2
|
import { cn } from "../../utils/cn.js";
|
|
3
3
|
import { Button } from "../../components/button/Button.js";
|
|
4
4
|
/* empty css */
|
|
5
|
+
import { Rows } from "../../components/rows/Rows.js";
|
|
6
|
+
import { Text } from "../../components/text/Text.js";
|
|
5
7
|
const defaultLoginFields = [
|
|
6
8
|
{ name: "email", label: "Email", type: "email", placeholder: "you@example.com", required: true },
|
|
7
9
|
{ name: "password", label: "Password", type: "password", placeholder: "••••••••", required: true }
|
|
@@ -36,10 +38,10 @@ function AuthForm({
|
|
|
36
38
|
const resolvedTitle = title ?? (mode === "login" ? "Welcome back" : "Create an account");
|
|
37
39
|
const resolvedSubtitle = subtitle ?? (mode === "login" ? "Sign in to your account" : "Start your free account today");
|
|
38
40
|
const resolvedSubmit = submitLabel ?? (mode === "login" ? "Sign In" : "Create Account");
|
|
39
|
-
const formContent = /* @__PURE__ */ jsxs(
|
|
41
|
+
const formContent = /* @__PURE__ */ jsxs(Rows, { className: "rz-auth-form__card", children: [
|
|
40
42
|
logo && /* @__PURE__ */ jsx("div", { className: "rz-auth-form__logo", children: logo }),
|
|
41
|
-
/* @__PURE__ */ jsx("h1",
|
|
42
|
-
/* @__PURE__ */ jsx("p",
|
|
43
|
+
/* @__PURE__ */ jsx(Text, { as: "h1", className: "rz-auth-form__title", children: resolvedTitle }),
|
|
44
|
+
/* @__PURE__ */ jsx(Text, { as: "p", className: "rz-auth-form__subtitle", children: resolvedSubtitle }),
|
|
43
45
|
socialProviders.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
44
46
|
/* @__PURE__ */ jsx("div", { className: "rz-auth-form__social", children: socialProviders.map((p) => /* @__PURE__ */ jsxs("button", { type: "button", className: "rz-auth-form__social-btn", onClick: p.onClick, children: [
|
|
45
47
|
p.icon,
|
|
@@ -49,7 +51,7 @@ function AuthForm({
|
|
|
49
51
|
/* @__PURE__ */ jsx("div", { className: "rz-auth-form__divider", children: "or" })
|
|
50
52
|
] }),
|
|
51
53
|
/* @__PURE__ */ jsxs("form", { className: "rz-auth-form__body", onSubmit, children: [
|
|
52
|
-
resolvedFields.map((field) => /* @__PURE__ */ jsxs(
|
|
54
|
+
resolvedFields.map((field) => /* @__PURE__ */ jsxs(Rows, { className: "rz-auth-form__field", children: [
|
|
53
55
|
/* @__PURE__ */ jsx("label", { htmlFor: field.name, className: "rz-auth-form__label", children: field.label }),
|
|
54
56
|
/* @__PURE__ */ jsx(
|
|
55
57
|
"input",
|
|
@@ -69,7 +71,7 @@ function AuthForm({
|
|
|
69
71
|
] }, field.name)),
|
|
70
72
|
/* @__PURE__ */ jsx(Button, { type: "submit", fullWidth: true, loading, className: "rz-auth-form__submit", children: resolvedSubmit })
|
|
71
73
|
] }),
|
|
72
|
-
footerText && /* @__PURE__ */ jsxs("p",
|
|
74
|
+
footerText && /* @__PURE__ */ jsxs(Text, { as: "p", className: "rz-auth-form__footer", children: [
|
|
73
75
|
footerText,
|
|
74
76
|
" ",
|
|
75
77
|
footerLinkLabel && /* @__PURE__ */ jsx("a", { href: "#", className: "rz-auth-form__footer-link", onClick: (e) => {
|
|
@@ -83,13 +85,13 @@ function AuthForm({
|
|
|
83
85
|
/* @__PURE__ */ jsx("div", { className: "rz-auth-form__panel", children: formContent }),
|
|
84
86
|
/* @__PURE__ */ jsx("div", { className: "rz-auth-form__side", children: sideContent ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
85
87
|
/* @__PURE__ */ jsx("div", {}),
|
|
86
|
-
/* @__PURE__ */ jsxs(
|
|
87
|
-
sideQuote && /* @__PURE__ */ jsxs("blockquote",
|
|
88
|
+
/* @__PURE__ */ jsxs(Rows, { children: [
|
|
89
|
+
sideQuote && /* @__PURE__ */ jsxs(Text, { as: "blockquote", className: "rz-auth-form__side-quote", children: [
|
|
88
90
|
"“",
|
|
89
91
|
sideQuote,
|
|
90
92
|
"”"
|
|
91
93
|
] }),
|
|
92
|
-
sideAttribution && /* @__PURE__ */ jsxs("p",
|
|
94
|
+
sideAttribution && /* @__PURE__ */ jsxs(Text, { as: "p", className: "rz-auth-form__side-attribution", children: [
|
|
93
95
|
"— ",
|
|
94
96
|
sideAttribution
|
|
95
97
|
] })
|
|
@@ -97,7 +99,7 @@ function AuthForm({
|
|
|
97
99
|
] }) })
|
|
98
100
|
] });
|
|
99
101
|
}
|
|
100
|
-
return /* @__PURE__ */ jsx("div", { className: cn("rz-auth-form rz-auth-form--centered", className), children: /* @__PURE__ */ jsx("div", { className: "rz-auth-form__panel
|
|
102
|
+
return /* @__PURE__ */ jsx("div", { className: cn("rz-auth-form rz-auth-form--centered", className), children: /* @__PURE__ */ jsx("div", { className: "rz-auth-form__panel rz-auth-form__panel--card", children: formContent }) });
|
|
101
103
|
}
|
|
102
104
|
export {
|
|
103
105
|
AuthForm
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthForm.js","sources":["../../../src/blocks/auth-form/AuthForm.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../../components/button/Button';\nimport './auth-form.css';\n\nexport type AuthFormMode = 'login' | 'register';\nexport type AuthFormLayout = 'centered' | 'split';\n\nexport interface SocialProvider {\n label: string;\n icon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface AuthFormField {\n name: string;\n label: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport interface AuthFormProps {\n mode?: AuthFormMode;\n layout?: AuthFormLayout;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n fields?: AuthFormField[];\n socialProviders?: SocialProvider[];\n showForgotPassword?: boolean;\n onForgotPassword?: () => void;\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\n submitLabel?: string;\n loading?: boolean;\n footerText?: string;\n footerLinkLabel?: string;\n onFooterLink?: () => void;\n /** Split layout: side panel content */\n sideQuote?: string;\n sideAttribution?: string;\n sideContent?: React.ReactNode;\n className?: string;\n}\n\nconst defaultLoginFields: AuthFormField[] = [\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: '••••••••', required: true },\n];\n\nconst defaultRegisterFields: AuthFormField[] = [\n { name: 'name', label: 'Full Name', type: 'text', placeholder: 'Jane Doe', required: true },\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: 'Min. 8 characters', required: true },\n];\n\nexport function AuthForm({\n mode = 'login',\n layout = 'centered',\n logo,\n title,\n subtitle,\n fields,\n socialProviders = [],\n showForgotPassword = true,\n onForgotPassword,\n onSubmit,\n submitLabel,\n loading = false,\n footerText,\n footerLinkLabel,\n onFooterLink,\n sideQuote,\n sideAttribution,\n sideContent,\n className,\n}: AuthFormProps) {\n const resolvedFields = fields ?? (mode === 'login' ? defaultLoginFields : defaultRegisterFields);\n const resolvedTitle = title ?? (mode === 'login' ? 'Welcome back' : 'Create an account');\n const resolvedSubtitle = subtitle ?? (mode === 'login' ? 'Sign in to your account' : 'Start your free account today');\n const resolvedSubmit = submitLabel ?? (mode === 'login' ? 'Sign In' : 'Create Account');\n\n const formContent = (\n <
|
|
1
|
+
{"version":3,"file":"AuthForm.js","sources":["../../../src/blocks/auth-form/AuthForm.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../../components/button/Button';\nimport { Text } from '../../components/text';\nimport { Rows } from '../../components/rows';\nimport './auth-form.css';\n\nexport type AuthFormMode = 'login' | 'register';\nexport type AuthFormLayout = 'centered' | 'split';\n\nexport interface SocialProvider {\n label: string;\n icon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface AuthFormField {\n name: string;\n label: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport interface AuthFormProps {\n mode?: AuthFormMode;\n layout?: AuthFormLayout;\n logo?: React.ReactNode;\n title?: string;\n subtitle?: string;\n fields?: AuthFormField[];\n socialProviders?: SocialProvider[];\n showForgotPassword?: boolean;\n onForgotPassword?: () => void;\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\n submitLabel?: string;\n loading?: boolean;\n footerText?: string;\n footerLinkLabel?: string;\n onFooterLink?: () => void;\n /** Split layout: side panel content */\n sideQuote?: string;\n sideAttribution?: string;\n sideContent?: React.ReactNode;\n className?: string;\n}\n\nconst defaultLoginFields: AuthFormField[] = [\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: '••••••••', required: true },\n];\n\nconst defaultRegisterFields: AuthFormField[] = [\n { name: 'name', label: 'Full Name', type: 'text', placeholder: 'Jane Doe', required: true },\n { name: 'email', label: 'Email', type: 'email', placeholder: 'you@example.com', required: true },\n { name: 'password', label: 'Password', type: 'password', placeholder: 'Min. 8 characters', required: true },\n];\n\nexport function AuthForm({\n mode = 'login',\n layout = 'centered',\n logo,\n title,\n subtitle,\n fields,\n socialProviders = [],\n showForgotPassword = true,\n onForgotPassword,\n onSubmit,\n submitLabel,\n loading = false,\n footerText,\n footerLinkLabel,\n onFooterLink,\n sideQuote,\n sideAttribution,\n sideContent,\n className,\n}: AuthFormProps) {\n const resolvedFields = fields ?? (mode === 'login' ? defaultLoginFields : defaultRegisterFields);\n const resolvedTitle = title ?? (mode === 'login' ? 'Welcome back' : 'Create an account');\n const resolvedSubtitle = subtitle ?? (mode === 'login' ? 'Sign in to your account' : 'Start your free account today');\n const resolvedSubmit = submitLabel ?? (mode === 'login' ? 'Sign In' : 'Create Account');\n\n const formContent = (\n <Rows className=\"rz-auth-form__card\">\n {logo && <div className=\"rz-auth-form__logo\">{logo}</div>}\n <Text as=\"h1\" className=\"rz-auth-form__title\">{resolvedTitle}</Text>\n <Text as=\"p\" className=\"rz-auth-form__subtitle\">{resolvedSubtitle}</Text>\n\n {socialProviders.length > 0 && (\n <>\n <div className=\"rz-auth-form__social\">\n {socialProviders.map((p) => (\n <button key={p.label} type=\"button\" className=\"rz-auth-form__social-btn\" onClick={p.onClick}>\n {p.icon}\n Continue with {p.label}\n </button>\n ))}\n </div>\n <div className=\"rz-auth-form__divider\">or</div>\n </>\n )}\n\n <form className=\"rz-auth-form__body\" onSubmit={onSubmit}>\n {resolvedFields.map((field) => (\n <Rows key={field.name} className=\"rz-auth-form__field\">\n <label htmlFor={field.name} className=\"rz-auth-form__label\">{field.label}</label>\n <input\n id={field.name}\n name={field.name}\n type={field.type ?? 'text'}\n placeholder={field.placeholder}\n required={field.required}\n className=\"rz-auth-form__input\"\n />\n {field.name === 'password' && mode === 'login' && showForgotPassword && (\n <a href=\"#\" className=\"rz-auth-form__forgot\" onClick={(e) => { e.preventDefault(); onForgotPassword?.(); }}>\n Forgot password?\n </a>\n )}\n </Rows>\n ))}\n <Button type=\"submit\" fullWidth loading={loading} className=\"rz-auth-form__submit\">\n {resolvedSubmit}\n </Button>\n </form>\n\n {footerText && (\n <Text as=\"p\" className=\"rz-auth-form__footer\">\n {footerText}{' '}\n {footerLinkLabel && (\n <a href=\"#\" className=\"rz-auth-form__footer-link\" onClick={(e) => { e.preventDefault(); onFooterLink?.(); }}>\n {footerLinkLabel}\n </a>\n )}\n </Text>\n )}\n </Rows>\n );\n\n if (layout === 'split') {\n return (\n <div className={cn('rz-auth-form rz-auth-form--split', className)}>\n <div className=\"rz-auth-form__panel\">\n {formContent}\n </div>\n <div className=\"rz-auth-form__side\">\n {sideContent ?? (\n <>\n <div />\n <Rows>\n {sideQuote && <Text as=\"blockquote\" className=\"rz-auth-form__side-quote\">“{sideQuote}”</Text>}\n {sideAttribution && <Text as=\"p\" className=\"rz-auth-form__side-attribution\">— {sideAttribution}</Text>}\n </Rows>\n </>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn('rz-auth-form rz-auth-form--centered', className)}>\n <div className=\"rz-auth-form__panel rz-auth-form__panel--card\">\n {formContent}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const cn = require("../../utils/cn.cjs");
|
|
5
5
|
;/* empty css */
|
|
6
|
+
const Columns = require("../../components/columns/Columns.cjs");
|
|
7
|
+
const Rows = require("../../components/rows/Rows.cjs");
|
|
8
|
+
const Text = require("../../components/text/Text.cjs");
|
|
9
|
+
function resolveTag(tag) {
|
|
10
|
+
return typeof tag === "string" ? { label: tag } : tag;
|
|
11
|
+
}
|
|
6
12
|
function BlogPost({
|
|
7
13
|
title,
|
|
8
14
|
excerpt,
|
|
@@ -19,29 +25,58 @@ function BlogPost({
|
|
|
19
25
|
className
|
|
20
26
|
}) {
|
|
21
27
|
const initials = author ? author.avatarInitials ?? author.name.split(" ").map((w) => w[0]).join("").slice(0, 2).toUpperCase() : "";
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
const jsonLd = {
|
|
29
|
+
"@context": "https://schema.org",
|
|
30
|
+
"@type": "BlogPosting",
|
|
31
|
+
headline: title,
|
|
32
|
+
...excerpt && { description: excerpt },
|
|
33
|
+
...coverSrc && { image: coverSrc },
|
|
34
|
+
...publishedAt && { datePublished: publishedAt },
|
|
35
|
+
...author && {
|
|
36
|
+
author: {
|
|
37
|
+
"@type": "Person",
|
|
38
|
+
name: author.name,
|
|
39
|
+
...author.href && { url: author.href }
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
...tags && tags.length > 0 && {
|
|
43
|
+
keywords: tags.map(resolveTag).map((t) => t.label).join(", ")
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const authorContent = author && /* @__PURE__ */ jsxRuntime.jsxs(Columns.Columns, { className: "rz-blog-post__author", children: [
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__author-avatar", children: author.avatarSrc ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: author.avatarSrc, alt: author.name }) : initials }),
|
|
48
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Rows.Rows, { children: [
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "p", className: "rz-blog-post__author-name", children: author.name }),
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Columns.Columns, { className: "rz-blog-post__author-meta", children: [
|
|
51
|
+
author.role && /* @__PURE__ */ jsxRuntime.jsx("span", { children: author.role }),
|
|
52
|
+
author.role && (publishedAt || readingTime) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rz-blog-post__author-dot" }),
|
|
53
|
+
publishedAt && /* @__PURE__ */ jsxRuntime.jsx("span", { children: new Date(publishedAt).toLocaleDateString(void 0, { year: "numeric", month: "long", day: "numeric" }) }),
|
|
54
|
+
publishedAt && readingTime && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rz-blog-post__author-dot" }),
|
|
55
|
+
readingTime && /* @__PURE__ */ jsxRuntime.jsx("span", { children: readingTime })
|
|
39
56
|
] })
|
|
57
|
+
] })
|
|
58
|
+
] });
|
|
59
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: cn.cn("rz-blog-post", className), itemScope: true, itemType: "https://schema.org/BlogPosting", children: [
|
|
60
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
61
|
+
"script",
|
|
62
|
+
{
|
|
63
|
+
type: "application/ld+json",
|
|
64
|
+
dangerouslySetInnerHTML: { __html: JSON.stringify(jsonLd) }
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "rz-blog-post__header", children: [
|
|
68
|
+
category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rz-blog-post__category", itemProp: "articleSection", children: category }),
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "h1", className: "rz-blog-post__title", itemProp: "headline", children: title }),
|
|
70
|
+
excerpt && /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { as: "p", className: "rz-blog-post__excerpt", itemProp: "description", children: excerpt }),
|
|
71
|
+
author && (author.href ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: author.href, className: "rz-blog-post__author-link", itemProp: "author", itemScope: true, itemType: "https://schema.org/Person", children: authorContent }) : /* @__PURE__ */ jsxRuntime.jsx("div", { itemProp: "author", itemScope: true, itemType: "https://schema.org/Person", children: authorContent }))
|
|
40
72
|
] }),
|
|
41
|
-
coverSrc && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__cover", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: coverSrc, alt: coverAlt }) }),
|
|
42
|
-
content ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__body", dangerouslySetInnerHTML: { __html: content } }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__body", children }),
|
|
73
|
+
coverSrc && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__cover", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: coverSrc, alt: coverAlt, itemProp: "image" }) }),
|
|
74
|
+
content ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__body", itemProp: "articleBody", dangerouslySetInnerHTML: { __html: content } }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__body", itemProp: "articleBody", children }),
|
|
43
75
|
(tags || shareSlot) && /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "rz-blog-post__footer", children: [
|
|
44
|
-
tags && tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__tags", children: tags.map((t) =>
|
|
76
|
+
tags && tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__tags", children: tags.map((t, i) => {
|
|
77
|
+
const tag = resolveTag(t);
|
|
78
|
+
return tag.href ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: tag.href, className: "rz-blog-post__tag rz-blog-post__tag--link", children: tag.label }, i) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rz-blog-post__tag", children: tag.label }, i);
|
|
79
|
+
}) }),
|
|
45
80
|
shareSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rz-blog-post__share", children: shareSlot })
|
|
46
81
|
] })
|
|
47
82
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlogPost.cjs","sources":["../../../src/blocks/blog-post/BlogPost.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport './blog-post.css';\n\nexport interface BlogPostAuthor {\n name: string;\n avatarSrc?: string;\n avatarInitials?: string;\n role?: string;\n}\n\nexport interface BlogPostProps {\n title: string;\n excerpt?: string;\n category?: string;\n coverSrc?: string;\n coverAlt?: string;\n author?: BlogPostAuthor;\n publishedAt?: string;\n readingTime?: string;\n tags?: string
|
|
1
|
+
{"version":3,"file":"BlogPost.cjs","sources":["../../../src/blocks/blog-post/BlogPost.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Text } from '../../components/text';\nimport { Columns } from '../../components/columns';\nimport { Rows } from '../../components/rows';\nimport './blog-post.css';\n\nexport interface BlogPostAuthor {\n name: string;\n href?: string;\n avatarSrc?: string;\n avatarInitials?: string;\n role?: string;\n}\n\nexport interface BlogPostTag {\n label: string;\n href?: string;\n}\n\nexport interface BlogPostProps {\n title: string;\n excerpt?: string;\n category?: string;\n coverSrc?: string;\n coverAlt?: string;\n author?: BlogPostAuthor;\n publishedAt?: string;\n readingTime?: string;\n /** Tags can be plain strings or objects with label + href */\n tags?: Array<BlogPostTag | string>;\n children?: React.ReactNode;\n /** Rendered instead of children when provided */\n content?: string;\n shareSlot?: React.ReactNode;\n className?: string;\n}\n\nfunction resolveTag(tag: BlogPostTag | string): BlogPostTag {\n return typeof tag === 'string' ? { label: tag } : tag;\n}\n\nexport function BlogPost({\n title,\n excerpt,\n category,\n coverSrc,\n coverAlt = '',\n author,\n publishedAt,\n readingTime,\n tags,\n children,\n content,\n shareSlot,\n className,\n}: BlogPostProps) {\n const initials = author\n ? author.avatarInitials ?? author.name.split(' ').map((w) => w[0]).join('').slice(0, 2).toUpperCase()\n : '';\n\n /* ─── JSON-LD structured data ───────────────────────────── */\n const jsonLd = {\n '@context': 'https://schema.org',\n '@type': 'BlogPosting',\n headline: title,\n ...(excerpt && { description: excerpt }),\n ...(coverSrc && { image: coverSrc }),\n ...(publishedAt && { datePublished: publishedAt }),\n ...(author && {\n author: {\n '@type': 'Person',\n name: author.name,\n ...(author.href && { url: author.href }),\n },\n }),\n ...(tags && tags.length > 0 && {\n keywords: tags.map(resolveTag).map((t) => t.label).join(', '),\n }),\n };\n\n const authorContent = author && (\n <Columns className=\"rz-blog-post__author\">\n <div className=\"rz-blog-post__author-avatar\">\n {author.avatarSrc ? (\n <img src={author.avatarSrc} alt={author.name} />\n ) : (\n initials\n )}\n </div>\n <Rows>\n <Text as=\"p\" className=\"rz-blog-post__author-name\">{author.name}</Text>\n <Columns className=\"rz-blog-post__author-meta\">\n {author.role && <span>{author.role}</span>}\n {author.role && (publishedAt || readingTime) && <span className=\"rz-blog-post__author-dot\" />}\n {publishedAt && <span>{new Date(publishedAt).toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })}</span>}\n {publishedAt && readingTime && <span className=\"rz-blog-post__author-dot\" />}\n {readingTime && <span>{readingTime}</span>}\n </Columns>\n </Rows>\n </Columns>\n );\n\n return (\n <article className={cn('rz-blog-post', className)} itemScope itemType=\"https://schema.org/BlogPosting\">\n {/* JSON-LD */}\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}\n />\n\n {/* Header */}\n <header className=\"rz-blog-post__header\">\n {category && (\n <span className=\"rz-blog-post__category\" itemProp=\"articleSection\">{category}</span>\n )}\n <Text as=\"h1\" className=\"rz-blog-post__title\" itemProp=\"headline\">{title}</Text>\n {excerpt && (\n <Text as=\"p\" className=\"rz-blog-post__excerpt\" itemProp=\"description\">{excerpt}</Text>\n )}\n\n {author && (\n author.href ? (\n <a href={author.href} className=\"rz-blog-post__author-link\" itemProp=\"author\" itemScope itemType=\"https://schema.org/Person\">\n {authorContent}\n </a>\n ) : (\n <div itemProp=\"author\" itemScope itemType=\"https://schema.org/Person\">\n {authorContent}\n </div>\n )\n )}\n </header>\n\n {/* Cover image */}\n {coverSrc && (\n <div className=\"rz-blog-post__cover\">\n <img src={coverSrc} alt={coverAlt} itemProp=\"image\" />\n </div>\n )}\n\n {/* Body */}\n {content ? (\n <div className=\"rz-blog-post__body\" itemProp=\"articleBody\" dangerouslySetInnerHTML={{ __html: content }} />\n ) : (\n <div className=\"rz-blog-post__body\" itemProp=\"articleBody\">{children}</div>\n )}\n\n {/* Footer */}\n {(tags || shareSlot) && (\n <footer className=\"rz-blog-post__footer\">\n {tags && tags.length > 0 && (\n <div className=\"rz-blog-post__tags\">\n {tags.map((t, i) => {\n const tag = resolveTag(t);\n return tag.href ? (\n <a key={i} href={tag.href} className=\"rz-blog-post__tag rz-blog-post__tag--link\">\n {tag.label}\n </a>\n ) : (\n <span key={i} className=\"rz-blog-post__tag\">{tag.label}</span>\n );\n })}\n </div>\n )}\n {shareSlot && <div className=\"rz-blog-post__share\">{shareSlot}</div>}\n </footer>\n )}\n </article>\n );\n}\n"],"names":["jsxs","Columns","jsx","Rows","Text","cn"],"mappings":"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"}
|