@rizom/site-rizom-work 0.2.0-alpha.142
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/package.json +42 -0
- package/src/index.ts +1 -0
- package/src/layout.tsx +82 -0
- package/src/link-targets.tsx +25 -0
- package/src/routes.ts +61 -0
- package/src/sections/bridge/layout.tsx +31 -0
- package/src/sections/bridge/schema.ts +11 -0
- package/src/sections/closer/layout.tsx +50 -0
- package/src/sections/closer/schema.ts +13 -0
- package/src/sections/credibility/layout.tsx +45 -0
- package/src/sections/credibility/schema.ts +10 -0
- package/src/sections/hero/layout.tsx +170 -0
- package/src/sections/hero/schema.ts +20 -0
- package/src/sections/ownership/layout.tsx +76 -0
- package/src/sections/ownership/schema.ts +11 -0
- package/src/sections/personas/layout.tsx +45 -0
- package/src/sections/personas/schema.ts +16 -0
- package/src/sections/problem/layout.tsx +30 -0
- package/src/sections/problem/schema.ts +10 -0
- package/src/sections/proof/layout.tsx +124 -0
- package/src/sections/proof/schema.ts +14 -0
- package/src/sections/styles.ts +16 -0
- package/src/sections/workshop/layout.tsx +66 -0
- package/src/sections/workshop/schema.ts +20 -0
- package/src/site-content.ts +227 -0
- package/src/site.ts +19 -0
- package/src/theme.css +152 -0
- package/src/types.d.ts +4 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** @jsxImportSource preact */
|
|
2
|
+
import type { JSX } from "preact";
|
|
3
|
+
import { Section } from "@rizom/site-rizom";
|
|
4
|
+
import { WORK_KICKER, WORK_RULE } from "../styles";
|
|
5
|
+
import type { PersonasContent } from "./schema";
|
|
6
|
+
|
|
7
|
+
export const PersonasLayout = ({
|
|
8
|
+
kicker,
|
|
9
|
+
headline,
|
|
10
|
+
cards,
|
|
11
|
+
}: PersonasContent): JSX.Element => {
|
|
12
|
+
return (
|
|
13
|
+
<Section id="personas" className="reveal py-[128px] max-[768px]:py-20">
|
|
14
|
+
<div
|
|
15
|
+
className={`${WORK_RULE} mb-16 -mt-16 max-[768px]:-mt-10 max-[768px]:mb-12`}
|
|
16
|
+
/>
|
|
17
|
+
|
|
18
|
+
<div className="mx-auto mb-[88px] max-w-[720px] text-center max-[768px]:mb-14">
|
|
19
|
+
<span className={`${WORK_KICKER} mb-3`}>{kicker}</span>
|
|
20
|
+
<h2 className="mt-3 font-display text-[clamp(36px,5vw,64px)] font-[520] leading-[1.02] tracking-[-1.5px] text-theme max-[768px]:text-[32px] max-[768px]:tracking-[-1px]">
|
|
21
|
+
{headline}
|
|
22
|
+
</h2>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div className="mx-auto grid max-w-[1160px] grid-cols-2 gap-[72px] max-[1100px]:gap-12 max-[768px]:grid-cols-1 max-[768px]:gap-10">
|
|
26
|
+
{cards.map((card, i) => (
|
|
27
|
+
<div
|
|
28
|
+
key={card.label}
|
|
29
|
+
className={`reveal reveal-delay-${i + 1} flex flex-col gap-[22px] border-t border-[var(--color-work-divider-strong)] pt-14 max-[768px]:pt-10`}
|
|
30
|
+
>
|
|
31
|
+
<span className="font-label text-[11px] font-semibold uppercase tracking-[2.5px] text-secondary">
|
|
32
|
+
{card.label}
|
|
33
|
+
</span>
|
|
34
|
+
<p className="max-w-[500px] font-display text-[clamp(24px,2.6vw,32px)] italic leading-[1.2] tracking-[-0.6px] text-theme max-[768px]:text-[22px]">
|
|
35
|
+
{card.quote}
|
|
36
|
+
</p>
|
|
37
|
+
<p className="max-w-[500px] font-body text-[17px] leading-[1.75] text-theme-muted max-[768px]:text-[15px] max-[768px]:leading-[1.68]">
|
|
38
|
+
{card.body}
|
|
39
|
+
</p>
|
|
40
|
+
</div>
|
|
41
|
+
))}
|
|
42
|
+
</div>
|
|
43
|
+
</Section>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime schema/formatter for personas now live in `src/site-content.ts`.
|
|
3
|
+
* Keep the props type local to the layout so app code does not depend on
|
|
4
|
+
* low-level template authoring primitives here.
|
|
5
|
+
*/
|
|
6
|
+
export interface PersonaCard {
|
|
7
|
+
label: string;
|
|
8
|
+
quote: string;
|
|
9
|
+
body: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface PersonasContent {
|
|
13
|
+
kicker: string;
|
|
14
|
+
headline: string;
|
|
15
|
+
cards: PersonaCard[];
|
|
16
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** @jsxImportSource preact */
|
|
2
|
+
import type { JSX } from "preact";
|
|
3
|
+
import { Section, renderHighlightedText } from "@rizom/site-rizom";
|
|
4
|
+
import { WORK_KICKER, WORK_SECTION_HEADLINE } from "../styles";
|
|
5
|
+
import type { WorkProblemContent } from "./schema";
|
|
6
|
+
|
|
7
|
+
const HIGHLIGHT_CLS = "italic text-accent font-normal";
|
|
8
|
+
|
|
9
|
+
export const WorkProblemLayout = ({
|
|
10
|
+
kicker,
|
|
11
|
+
headline,
|
|
12
|
+
subhead,
|
|
13
|
+
}: WorkProblemContent): JSX.Element => {
|
|
14
|
+
return (
|
|
15
|
+
<Section
|
|
16
|
+
id="problem"
|
|
17
|
+
className="reveal bg-transparent py-[128px] text-center max-[768px]:py-20"
|
|
18
|
+
>
|
|
19
|
+
<span className={`${WORK_KICKER} mb-8 max-[768px]:mb-6`}>{kicker}</span>
|
|
20
|
+
<h2
|
|
21
|
+
className={`${WORK_SECTION_HEADLINE} mx-auto mb-7 max-w-[900px] max-[768px]:mb-5`}
|
|
22
|
+
>
|
|
23
|
+
{renderHighlightedText(headline, HIGHLIGHT_CLS)}
|
|
24
|
+
</h2>
|
|
25
|
+
<p className="mx-auto max-w-[720px] font-body text-[19px] leading-[1.72] text-theme-muted max-[768px]:text-[16px] max-[768px]:leading-[1.68]">
|
|
26
|
+
{subhead}
|
|
27
|
+
</p>
|
|
28
|
+
</Section>
|
|
29
|
+
);
|
|
30
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime schema/formatter for problem now live in `src/site-content.ts`.
|
|
3
|
+
* Keep the props type local to the layout so app code does not depend on
|
|
4
|
+
* low-level template authoring primitives here.
|
|
5
|
+
*/
|
|
6
|
+
export interface WorkProblemContent {
|
|
7
|
+
kicker: string;
|
|
8
|
+
headline: string;
|
|
9
|
+
subhead: string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/** @jsxImportSource preact */
|
|
2
|
+
import type { JSX } from "preact";
|
|
3
|
+
import { Section } from "@rizom/site-rizom";
|
|
4
|
+
import { WORK_KICKER, WORK_RULE } from "../styles";
|
|
5
|
+
import type { ProofContent, ProofTestimonial } from "./schema";
|
|
6
|
+
|
|
7
|
+
const ROTATOR_STEP_SECONDS = 6;
|
|
8
|
+
|
|
9
|
+
const rotatorAnimationVars = (
|
|
10
|
+
index: number,
|
|
11
|
+
total: number,
|
|
12
|
+
): JSX.CSSProperties =>
|
|
13
|
+
({
|
|
14
|
+
"--rotator-duration": `${Math.max(total, 1) * ROTATOR_STEP_SECONDS}s`,
|
|
15
|
+
"--rotator-delay": `${index * ROTATOR_STEP_SECONDS}s`,
|
|
16
|
+
}) as JSX.CSSProperties;
|
|
17
|
+
|
|
18
|
+
const QuoteMark = ({ large = false }: { large?: boolean }): JSX.Element => (
|
|
19
|
+
<span
|
|
20
|
+
aria-hidden="true"
|
|
21
|
+
className={
|
|
22
|
+
large
|
|
23
|
+
? "pointer-events-none absolute -left-2 -top-10 font-display font-[300] italic text-[140px] leading-none text-accent/25 max-[768px]:-left-1 max-[768px]:-top-6 max-[768px]:text-[96px]"
|
|
24
|
+
: "pointer-events-none absolute -left-1.5 -top-9 font-display font-[300] italic text-[120px] leading-none text-accent/25 max-[768px]:-left-1 max-[768px]:-top-5 max-[768px]:text-[88px]"
|
|
25
|
+
}
|
|
26
|
+
>
|
|
27
|
+
“
|
|
28
|
+
</span>
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
export const ProofLayout = ({
|
|
32
|
+
kicker,
|
|
33
|
+
headline,
|
|
34
|
+
testimonials,
|
|
35
|
+
quote,
|
|
36
|
+
attribution,
|
|
37
|
+
}: ProofContent): JSX.Element => {
|
|
38
|
+
const items: ProofTestimonial[] =
|
|
39
|
+
testimonials && testimonials.length > 0
|
|
40
|
+
? testimonials
|
|
41
|
+
: quote
|
|
42
|
+
? [{ quote, attribution: attribution ?? "" }]
|
|
43
|
+
: [];
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<Section
|
|
47
|
+
id="proof"
|
|
48
|
+
className="reveal py-[128px] text-center max-[768px]:py-20"
|
|
49
|
+
>
|
|
50
|
+
<div
|
|
51
|
+
className={`${WORK_RULE} mb-16 -mt-16 max-[768px]:-mt-10 max-[768px]:mb-12`}
|
|
52
|
+
/>
|
|
53
|
+
|
|
54
|
+
<div className="mx-auto mb-16 max-w-[720px] text-center max-[768px]:mb-12">
|
|
55
|
+
<span className={`${WORK_KICKER} mb-3`}>{kicker}</span>
|
|
56
|
+
<h2 className="mt-3 font-display text-[clamp(32px,4.5vw,56px)] font-[520] leading-[1.05] tracking-[-1.4px] text-theme max-[768px]:text-[30px] max-[768px]:tracking-[-0.9px]">
|
|
57
|
+
{headline}
|
|
58
|
+
</h2>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
{items.length > 1 ? (
|
|
62
|
+
<div className="reveal reveal-delay-1 mx-auto max-w-[920px]">
|
|
63
|
+
<div className="relative mx-auto px-10 py-8 text-left max-[768px]:px-4 max-[768px]:py-4">
|
|
64
|
+
<div className="relative min-h-[340px] max-[768px]:min-h-[500px] motion-reduce:min-h-0 motion-reduce:space-y-12">
|
|
65
|
+
{items.map((item, index) => (
|
|
66
|
+
<blockquote
|
|
67
|
+
key={item.quote}
|
|
68
|
+
style={rotatorAnimationVars(index, items.length)}
|
|
69
|
+
className="absolute inset-0 pr-10 opacity-0 blur-[6px] translate-y-4 animate-[rizom-work-rotator-reveal_var(--rotator-duration)_cubic-bezier(0.2,0.8,0.2,1)_infinite] [animation-delay:var(--rotator-delay)] motion-reduce:relative motion-reduce:inset-auto motion-reduce:translate-y-0 motion-reduce:opacity-100 motion-reduce:blur-0 motion-reduce:animate-none max-[768px]:pr-0"
|
|
70
|
+
>
|
|
71
|
+
<div className="relative">
|
|
72
|
+
<QuoteMark large />
|
|
73
|
+
<p className="relative mb-8 pl-16 font-display italic font-[380] text-[clamp(24px,3vw,38px)] leading-[1.28] tracking-[-0.7px] text-theme [font-variation-settings:'opsz'_96] max-[768px]:mb-7 max-[768px]:pl-9 max-[768px]:text-[22px] max-[768px]:leading-[1.32]">
|
|
74
|
+
{item.quote}
|
|
75
|
+
</p>
|
|
76
|
+
</div>
|
|
77
|
+
<footer className="pl-16 font-label text-[11px] font-medium uppercase tracking-[2px] text-theme-light max-[768px]:pl-9">
|
|
78
|
+
— {item.attribution}
|
|
79
|
+
</footer>
|
|
80
|
+
</blockquote>
|
|
81
|
+
))}
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div
|
|
85
|
+
className="relative mt-8 flex justify-center gap-3 motion-reduce:hidden"
|
|
86
|
+
aria-hidden="true"
|
|
87
|
+
>
|
|
88
|
+
{items.map((item, index) => (
|
|
89
|
+
<span
|
|
90
|
+
key={item.attribution + index}
|
|
91
|
+
className="relative h-1.5 w-10 overflow-hidden rounded-full bg-theme-light/25"
|
|
92
|
+
>
|
|
93
|
+
<span
|
|
94
|
+
style={rotatorAnimationVars(index, items.length)}
|
|
95
|
+
className="absolute inset-0 -translate-x-full rounded-full bg-accent animate-[rizom-work-rotator-progress_var(--rotator-duration)_linear_infinite] [animation-delay:var(--rotator-delay)]"
|
|
96
|
+
/>
|
|
97
|
+
</span>
|
|
98
|
+
))}
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
) : (
|
|
103
|
+
<div className="mx-auto grid max-w-[980px] gap-12 max-[768px]:gap-10">
|
|
104
|
+
{items.map((item, index) => (
|
|
105
|
+
<blockquote
|
|
106
|
+
key={item.quote}
|
|
107
|
+
className={`reveal reveal-delay-${Math.min(index + 1, 3)} relative mx-auto max-w-[760px] px-10 text-left max-[768px]:px-4`}
|
|
108
|
+
>
|
|
109
|
+
<div className="relative">
|
|
110
|
+
<QuoteMark />
|
|
111
|
+
<p className="relative mb-7 pl-14 font-display italic font-[380] text-[clamp(22px,2.7vw,34px)] leading-[1.3] tracking-[-0.6px] text-theme [font-variation-settings:'opsz'_96] max-[768px]:pl-8 max-[768px]:text-[21px]">
|
|
112
|
+
{item.quote}
|
|
113
|
+
</p>
|
|
114
|
+
</div>
|
|
115
|
+
<footer className="pl-14 font-label text-[11px] font-medium uppercase tracking-[2px] text-theme-light max-[768px]:pl-8">
|
|
116
|
+
— {item.attribution}
|
|
117
|
+
</footer>
|
|
118
|
+
</blockquote>
|
|
119
|
+
))}
|
|
120
|
+
</div>
|
|
121
|
+
)}
|
|
122
|
+
</Section>
|
|
123
|
+
);
|
|
124
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ProofTestimonial {
|
|
2
|
+
quote: string;
|
|
3
|
+
attribution: string;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface ProofContent {
|
|
7
|
+
kicker: string;
|
|
8
|
+
headline: string;
|
|
9
|
+
testimonials?: ProofTestimonial[];
|
|
10
|
+
quote?: string;
|
|
11
|
+
attribution?: string;
|
|
12
|
+
partnersLabel?: string;
|
|
13
|
+
partners?: string[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const WORK_KICKER =
|
|
2
|
+
"inline-flex items-center gap-[14px] font-label text-[11px] font-semibold uppercase tracking-[2.8px] text-accent before:content-[''] before:block before:h-px before:w-8 before:bg-accent before:opacity-80 max-[768px]:gap-3 max-[768px]:text-[10px] max-[768px]:tracking-[2.4px] max-[768px]:before:w-6";
|
|
3
|
+
|
|
4
|
+
export const WORK_RULE =
|
|
5
|
+
"mx-auto h-px w-16 bg-gradient-to-r from-transparent via-accent/45 to-transparent";
|
|
6
|
+
|
|
7
|
+
export const WORK_SECTION_HEADLINE =
|
|
8
|
+
"font-display font-[520] text-theme text-[clamp(36px,5vw,68px)] leading-[1.02] tracking-[-1.6px] max-[768px]:text-[34px] max-[768px]:tracking-[-1.1px]";
|
|
9
|
+
|
|
10
|
+
export const WORK_DISPLAY_QUOTE =
|
|
11
|
+
"font-display italic tracking-[-0.6px] text-theme";
|
|
12
|
+
|
|
13
|
+
export const WORK_BODY_COPY = "text-[17px] leading-[1.75] text-theme-muted";
|
|
14
|
+
|
|
15
|
+
export const revealDelayClass = (index: number, max = 3): string =>
|
|
16
|
+
`reveal reveal-delay-${Math.min(index + 1, max)}`;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** @jsxImportSource preact */
|
|
2
|
+
import type { JSX } from "preact";
|
|
3
|
+
import { Section, renderHighlightedText } from "@rizom/site-rizom";
|
|
4
|
+
import { WorkButton } from "../../link-targets";
|
|
5
|
+
import { WORK_KICKER, WORK_RULE } from "../styles";
|
|
6
|
+
import type { WorkshopContent } from "./schema";
|
|
7
|
+
|
|
8
|
+
export const WorkshopLayout = ({
|
|
9
|
+
kicker,
|
|
10
|
+
headline,
|
|
11
|
+
intro,
|
|
12
|
+
steps,
|
|
13
|
+
ctaLabel,
|
|
14
|
+
ctaHref,
|
|
15
|
+
}: WorkshopContent): JSX.Element => {
|
|
16
|
+
return (
|
|
17
|
+
<Section id="workshop" className="reveal py-[128px] max-[768px]:py-20">
|
|
18
|
+
<div
|
|
19
|
+
className={`${WORK_RULE} mb-16 -mt-16 max-[768px]:-mt-10 max-[768px]:mb-12`}
|
|
20
|
+
/>
|
|
21
|
+
|
|
22
|
+
<div className="mx-auto mb-24 max-w-[720px] text-center max-[768px]:mb-14">
|
|
23
|
+
<span className={`${WORK_KICKER} mb-3`}>{kicker}</span>
|
|
24
|
+
<h2 className="mt-3 mb-7 font-display text-[clamp(36px,5vw,68px)] font-[520] leading-[1.02] tracking-[-1.6px] text-theme max-[768px]:text-[34px] max-[768px]:tracking-[-1.1px]">
|
|
25
|
+
{renderHighlightedText(headline, "")}
|
|
26
|
+
</h2>
|
|
27
|
+
<p className="mx-auto max-w-[640px] font-body text-[18px] leading-[1.72] text-theme-muted max-[768px]:text-[16px] max-[768px]:leading-[1.68]">
|
|
28
|
+
{intro}
|
|
29
|
+
</p>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div className="mx-auto flex max-w-[960px] flex-col">
|
|
33
|
+
{steps.map((step, i) => (
|
|
34
|
+
<div
|
|
35
|
+
key={step.num + step.title}
|
|
36
|
+
className={`reveal reveal-delay-${i + 1} grid grid-cols-[240px_1fr] items-start gap-16 border-t border-[var(--color-work-divider-soft)] py-14 max-[1100px]:grid-cols-[200px_1fr] max-[1100px]:gap-10 max-[768px]:grid-cols-1 max-[768px]:gap-5 max-[768px]:py-10 ${i === steps.length - 1 ? "border-b" : ""}`}
|
|
37
|
+
>
|
|
38
|
+
<div className="flex items-baseline gap-[18px] pt-1.5 max-[768px]:gap-3.5">
|
|
39
|
+
<span className="font-display text-[68px] font-light leading-[0.82] tracking-[-3px] text-accent max-[1100px]:text-[56px] max-[768px]:text-[48px] max-[768px]:tracking-[-2px]">
|
|
40
|
+
{step.num}
|
|
41
|
+
</span>
|
|
42
|
+
<span className="mb-3.5 inline-block h-[1.5px] w-16 bg-accent/55 max-[768px]:w-12" />
|
|
43
|
+
<span className="font-label text-[11px] font-semibold uppercase tracking-[2.5px] text-theme-muted">
|
|
44
|
+
{step.label}
|
|
45
|
+
</span>
|
|
46
|
+
</div>
|
|
47
|
+
<div>
|
|
48
|
+
<h3 className="mb-4 font-display text-[28px] font-[520] leading-[1.2] tracking-[-0.6px] text-theme max-[768px]:text-[22px]">
|
|
49
|
+
{step.title}
|
|
50
|
+
</h3>
|
|
51
|
+
<p className="max-w-[560px] font-body text-[17px] leading-[1.72] text-theme-muted max-[768px]:text-[15px] max-[768px]:leading-[1.68]">
|
|
52
|
+
{step.body}
|
|
53
|
+
</p>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
))}
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div className="mt-[72px] text-center max-[768px]:mt-12 max-[768px]:[&_.rizom-btn]:w-full max-[768px]:[&_.rizom-btn]:justify-center">
|
|
60
|
+
<WorkButton href={ctaHref} variant="primary">
|
|
61
|
+
{ctaLabel}
|
|
62
|
+
</WorkButton>
|
|
63
|
+
</div>
|
|
64
|
+
</Section>
|
|
65
|
+
);
|
|
66
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime schema/formatter for workshop now live in `src/site-content.ts`.
|
|
3
|
+
* Keep the props type local to the layout so app code does not depend on
|
|
4
|
+
* low-level template authoring primitives here.
|
|
5
|
+
*/
|
|
6
|
+
export interface WorkshopStep {
|
|
7
|
+
num: string;
|
|
8
|
+
label: string;
|
|
9
|
+
title: string;
|
|
10
|
+
body: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface WorkshopContent {
|
|
14
|
+
kicker: string;
|
|
15
|
+
headline: string;
|
|
16
|
+
intro: string;
|
|
17
|
+
steps: WorkshopStep[];
|
|
18
|
+
ctaLabel: string;
|
|
19
|
+
ctaHref: string;
|
|
20
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { WorkHeroLayout } from "./sections/hero/layout";
|
|
2
|
+
import { WorkProblemLayout } from "./sections/problem/layout";
|
|
3
|
+
import { WorkshopLayout } from "./sections/workshop/layout";
|
|
4
|
+
import { PersonasLayout } from "./sections/personas/layout";
|
|
5
|
+
import { ProofLayout } from "./sections/proof/layout";
|
|
6
|
+
import { BridgeLayout } from "./sections/bridge/layout";
|
|
7
|
+
import { CredibilityLayout } from "./sections/credibility/layout";
|
|
8
|
+
import { OwnershipLayout } from "./sections/ownership/layout";
|
|
9
|
+
import { CloserLayout } from "./sections/closer/layout";
|
|
10
|
+
import type { SiteContentDefinition } from "@rizom/site";
|
|
11
|
+
import { Ecosystem } from "@rizom/site-rizom";
|
|
12
|
+
|
|
13
|
+
const workSiteContent: SiteContentDefinition = {
|
|
14
|
+
namespace: "landing-page",
|
|
15
|
+
sections: {
|
|
16
|
+
hero: {
|
|
17
|
+
description: "Rizom work hero — split studio intro with diagnostic panel",
|
|
18
|
+
title: "Work Hero Section",
|
|
19
|
+
layout: WorkHeroLayout,
|
|
20
|
+
fields: {
|
|
21
|
+
kicker: { label: "Kicker", type: "string" },
|
|
22
|
+
headline: { label: "Headline", type: "string" },
|
|
23
|
+
subtitle: { label: "Subtitle", type: "string" },
|
|
24
|
+
primaryCtaLabel: { label: "Primary CTA label", type: "string" },
|
|
25
|
+
primaryCtaHref: { label: "Primary CTA href", type: "string" },
|
|
26
|
+
secondaryCtaLabel: { label: "Secondary CTA label", type: "string" },
|
|
27
|
+
secondaryCtaHref: { label: "Secondary CTA href", type: "string" },
|
|
28
|
+
verdictLabel: { label: "Verdict label", type: "string" },
|
|
29
|
+
verdictValue: { label: "Verdict value", type: "string" },
|
|
30
|
+
findingsLabel: { label: "Findings label", type: "string" },
|
|
31
|
+
findings: {
|
|
32
|
+
label: "Findings",
|
|
33
|
+
type: "array",
|
|
34
|
+
length: 3,
|
|
35
|
+
items: { label: "Finding", type: "string" },
|
|
36
|
+
},
|
|
37
|
+
diagnosticCtaLabel: { label: "Diagnostic CTA label", type: "string" },
|
|
38
|
+
diagnosticCtaHref: { label: "Diagnostic CTA href", type: "string" },
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
problem: {
|
|
42
|
+
description:
|
|
43
|
+
"Rizom work problem section — editorial coordination problem statement",
|
|
44
|
+
title: "Work Problem Section",
|
|
45
|
+
layout: WorkProblemLayout,
|
|
46
|
+
fields: {
|
|
47
|
+
kicker: { label: "Kicker", type: "string" },
|
|
48
|
+
headline: { label: "Headline", type: "string" },
|
|
49
|
+
subhead: { label: "Subhead", type: "string" },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
workshop: {
|
|
53
|
+
description: "Rizom workshop section — three-step TMS workshop process",
|
|
54
|
+
title: "Workshop Section",
|
|
55
|
+
layout: WorkshopLayout,
|
|
56
|
+
fields: {
|
|
57
|
+
kicker: { label: "Kicker", type: "string" },
|
|
58
|
+
headline: { label: "Headline", type: "string" },
|
|
59
|
+
intro: { label: "Intro", type: "string" },
|
|
60
|
+
steps: {
|
|
61
|
+
label: "Steps",
|
|
62
|
+
type: "array",
|
|
63
|
+
length: 3,
|
|
64
|
+
items: {
|
|
65
|
+
label: "Step",
|
|
66
|
+
type: "object",
|
|
67
|
+
fields: {
|
|
68
|
+
num: { label: "Number", type: "string" },
|
|
69
|
+
label: { label: "Label", type: "string" },
|
|
70
|
+
title: { label: "Title", type: "string" },
|
|
71
|
+
body: { label: "Body", type: "string" },
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
ctaLabel: { label: "CTA label", type: "string" },
|
|
76
|
+
ctaHref: { label: "CTA href", type: "string" },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
credibility: {
|
|
80
|
+
description: "Rizom credibility section — TMS methodology proof cards",
|
|
81
|
+
title: "Credibility Section",
|
|
82
|
+
layout: CredibilityLayout,
|
|
83
|
+
fields: {
|
|
84
|
+
kicker: { label: "Kicker", type: "string" },
|
|
85
|
+
headline: { label: "Headline", type: "string" },
|
|
86
|
+
cards: {
|
|
87
|
+
label: "Cards",
|
|
88
|
+
type: "array",
|
|
89
|
+
minItems: 1,
|
|
90
|
+
items: {
|
|
91
|
+
label: "Card",
|
|
92
|
+
type: "object",
|
|
93
|
+
fields: {
|
|
94
|
+
title: { label: "Title", type: "string" },
|
|
95
|
+
body: { label: "Body", type: "string" },
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
personas: {
|
|
102
|
+
description: "Rizom personas section — who the workshop is for",
|
|
103
|
+
title: "Personas Section",
|
|
104
|
+
layout: PersonasLayout,
|
|
105
|
+
fields: {
|
|
106
|
+
kicker: { label: "Kicker", type: "string" },
|
|
107
|
+
headline: { label: "Headline", type: "string" },
|
|
108
|
+
cards: {
|
|
109
|
+
label: "Cards",
|
|
110
|
+
type: "array",
|
|
111
|
+
minItems: 1,
|
|
112
|
+
items: {
|
|
113
|
+
label: "Card",
|
|
114
|
+
type: "object",
|
|
115
|
+
fields: {
|
|
116
|
+
label: { label: "Label", type: "string" },
|
|
117
|
+
quote: { label: "Quote", type: "string" },
|
|
118
|
+
body: { label: "Body", type: "string" },
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
proof: {
|
|
125
|
+
description: "Rizom proof section — testimonials",
|
|
126
|
+
title: "Proof Section",
|
|
127
|
+
layout: ProofLayout,
|
|
128
|
+
fields: {
|
|
129
|
+
kicker: { label: "Kicker", type: "string" },
|
|
130
|
+
headline: { label: "Headline", type: "string" },
|
|
131
|
+
testimonials: {
|
|
132
|
+
label: "Testimonials",
|
|
133
|
+
type: "array",
|
|
134
|
+
minItems: 1,
|
|
135
|
+
items: {
|
|
136
|
+
label: "Testimonial",
|
|
137
|
+
type: "object",
|
|
138
|
+
fields: {
|
|
139
|
+
quote: { label: "Quote", type: "string" },
|
|
140
|
+
attribution: { label: "Attribution", type: "string" },
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
bridge: {
|
|
147
|
+
description: "Rizom bridge section — connective link to adjacent site",
|
|
148
|
+
title: "Bridge Section",
|
|
149
|
+
layout: BridgeLayout,
|
|
150
|
+
fields: {
|
|
151
|
+
kicker: { label: "Kicker", type: "string" },
|
|
152
|
+
body: { label: "Body", type: "string" },
|
|
153
|
+
linkLabel: { label: "Link label", type: "string" },
|
|
154
|
+
linkHref: { label: "Link href", type: "string" },
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
ownership: {
|
|
158
|
+
description:
|
|
159
|
+
"Rizom ownership section — split about block with stacked people cards",
|
|
160
|
+
title: "Ownership Section",
|
|
161
|
+
layout: OwnershipLayout,
|
|
162
|
+
fields: {
|
|
163
|
+
kicker: { label: "Kicker", type: "string" },
|
|
164
|
+
headline: { label: "Headline", type: "string" },
|
|
165
|
+
cards: {
|
|
166
|
+
label: "Cards",
|
|
167
|
+
type: "array",
|
|
168
|
+
minItems: 1,
|
|
169
|
+
items: {
|
|
170
|
+
label: "Card",
|
|
171
|
+
type: "object",
|
|
172
|
+
fields: {
|
|
173
|
+
badge: { label: "Badge", type: "string" },
|
|
174
|
+
title: { label: "Title", type: "string" },
|
|
175
|
+
body: { label: "Body", type: "string" },
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
closer: {
|
|
182
|
+
description: "Rizom closer section — final CTA pair",
|
|
183
|
+
title: "Closer Section",
|
|
184
|
+
layout: CloserLayout,
|
|
185
|
+
fields: {
|
|
186
|
+
preamble: { label: "Preamble", type: "string" },
|
|
187
|
+
headline: { label: "Headline", type: "string" },
|
|
188
|
+
primaryCtaLabel: { label: "Primary CTA label", type: "string" },
|
|
189
|
+
primaryCtaHref: { label: "Primary CTA href", type: "string" },
|
|
190
|
+
secondaryCtaLabel: { label: "Secondary CTA label", type: "string" },
|
|
191
|
+
secondaryCtaHref: { label: "Secondary CTA href", type: "string" },
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
ecosystem: {
|
|
195
|
+
description:
|
|
196
|
+
"Rizom ecosystem section — 3-card grid of sibling rizom sites",
|
|
197
|
+
title: "Ecosystem Section",
|
|
198
|
+
layout: Ecosystem,
|
|
199
|
+
fields: {
|
|
200
|
+
eyebrow: { label: "Eyebrow", type: "string" },
|
|
201
|
+
headline: { label: "Headline", type: "string" },
|
|
202
|
+
cards: {
|
|
203
|
+
label: "Cards",
|
|
204
|
+
type: "array",
|
|
205
|
+
minItems: 1,
|
|
206
|
+
items: {
|
|
207
|
+
label: "Card",
|
|
208
|
+
type: "object",
|
|
209
|
+
fields: {
|
|
210
|
+
suffix: {
|
|
211
|
+
label: "Suffix",
|
|
212
|
+
type: "enum",
|
|
213
|
+
options: ["ai", "foundation", "work"],
|
|
214
|
+
},
|
|
215
|
+
title: { label: "Title", type: "string" },
|
|
216
|
+
body: { label: "Body", type: "string" },
|
|
217
|
+
linkLabel: { label: "Link Label", type: "string" },
|
|
218
|
+
linkHref: { label: "Link Href", type: "string" },
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
export default workSiteContent;
|
package/src/site.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="./types.d.ts" />
|
|
2
|
+
|
|
3
|
+
import type { SiteDefinition } from "@rizom/site";
|
|
4
|
+
import { createRizomSite } from "@rizom/site-rizom";
|
|
5
|
+
import { WorkLayout } from "./layout";
|
|
6
|
+
import { workRoutes } from "./routes";
|
|
7
|
+
import workSiteContent from "./site-content";
|
|
8
|
+
import themeOverride from "./theme.css" with { type: "text" };
|
|
9
|
+
|
|
10
|
+
export const rizomWorkSite: SiteDefinition = createRizomSite({
|
|
11
|
+
packageName: "@rizom/site-rizom-work",
|
|
12
|
+
themeProfile: "studio",
|
|
13
|
+
layout: WorkLayout,
|
|
14
|
+
routes: workRoutes,
|
|
15
|
+
content: workSiteContent,
|
|
16
|
+
themeOverride,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export default rizomWorkSite;
|