@jjlmoya/landings 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/package.json +65 -0
  2. package/scripts/copy-public-assets.mjs +44 -0
  3. package/src/components/PreviewNavSidebar.astro +102 -0
  4. package/src/components/PreviewToolbar.astro +139 -0
  5. package/src/entries.ts +9 -0
  6. package/src/env.d.ts +4 -0
  7. package/src/index.ts +12 -0
  8. package/src/landing/team/assets/ambar-chiquilla.webp +0 -0
  9. package/src/landing/team/assets/ambar.webp +0 -0
  10. package/src/landing/team/assets/bob-model-book/bob-pointing.webp +0 -0
  11. package/src/landing/team/assets/bob-model-book/bob-pose-05.webp +0 -0
  12. package/src/landing/team/assets/bob-model-book/bob-pose-06.webp +0 -0
  13. package/src/landing/team/assets/bob-model-book/bob-pose-07-locked.webp +0 -0
  14. package/src/landing/team/assets/bob-model-book/bob-pose-08-locked.webp +0 -0
  15. package/src/landing/team/assets/bob-model-book/bob-pose-09-locked.webp +0 -0
  16. package/src/landing/team/assets/bob-model-book/bob-pose-attitude.webp +0 -0
  17. package/src/landing/team/assets/bob-model-book/bob-pose-cover.webp +0 -0
  18. package/src/landing/team/assets/bob-model-book/bob-pose-expensive.webp +0 -0
  19. package/src/landing/team/assets/bob-model-book/bob-pose-final.webp +0 -0
  20. package/src/landing/team/assets/bob.webp +0 -0
  21. package/src/landing/team/assets/drac.webp +0 -0
  22. package/src/landing/team/assets/feedback.webp +0 -0
  23. package/src/landing/team/assets/gamebob-team-hero.png +0 -0
  24. package/src/landing/team/assets/gamebob-team-hero.webp +0 -0
  25. package/src/landing/team/assets/jjlmoya/jjlmoya-exhausted.webp +0 -0
  26. package/src/landing/team/assets/jjlmoya/tinder-profile-winked.webp +0 -0
  27. package/src/landing/team/assets/jjlmoya/tinder-profile.webp +0 -0
  28. package/src/landing/team/assets/master-plan-food.webp +0 -0
  29. package/src/landing/team/assets/master-plan-money.webp +0 -0
  30. package/src/landing/team/assets/master-plan-more-food.webp +0 -0
  31. package/src/landing/team/assets/master-plan-more-money.webp +0 -0
  32. package/src/landing/team/assets/master-plan-projects.webp +0 -0
  33. package/src/landing/team/assets/master-plan-tools.webp +0 -0
  34. package/src/landing/team/assets/memorial/ambar-chiquillo.webp +0 -0
  35. package/src/landing/team/assets/music/bob-techno.mp3 +0 -0
  36. package/src/landing/team/assets/seal-of-approval.webp +0 -0
  37. package/src/landing/team/assets/terra.webp +0 -0
  38. package/src/landing/team/assets/webcomic/scene-1.webp +0 -0
  39. package/src/landing/team/assets/webcomic/scene-2.webp +0 -0
  40. package/src/landing/team/assets/webcomic/scene-3.webp +0 -0
  41. package/src/landing/team/assets/webcomic/scene-4.webp +0 -0
  42. package/src/landing/team/components/BobMasterPlan.astro +118 -0
  43. package/src/landing/team/components/BobModelBook.astro +253 -0
  44. package/src/landing/team/components/BobModelBookFrame.astro +73 -0
  45. package/src/landing/team/components/CompanyWorks.astro +180 -0
  46. package/src/landing/team/components/HumanTouch.astro +262 -0
  47. package/src/landing/team/components/MasterPlanScene.astro +73 -0
  48. package/src/landing/team/components/MemoryWall.astro +46 -0
  49. package/src/landing/team/components/ProductManifesto.astro +46 -0
  50. package/src/landing/team/components/SupportTransition.astro +67 -0
  51. package/src/landing/team/components/TeamComicScenes.astro +67 -0
  52. package/src/landing/team/components/TeamHero.astro +42 -0
  53. package/src/landing/team/components/TeamRoster.astro +94 -0
  54. package/src/landing/team/entry.ts +23 -0
  55. package/src/landing/team/i18n/en.ts +278 -0
  56. package/src/landing/team/i18n/es.ts +278 -0
  57. package/src/landing/team/i18n/index.ts +12 -0
  58. package/src/landing/team/landing.astro +31 -0
  59. package/src/landing/team/styles/BehindJoke.css +55 -0
  60. package/src/landing/team/styles/BobMasterPlan.css +213 -0
  61. package/src/landing/team/styles/BobModelBook.css +709 -0
  62. package/src/landing/team/styles/CompanyWorks.css +652 -0
  63. package/src/landing/team/styles/HumanTouch.css +1190 -0
  64. package/src/landing/team/styles/MemoryWall.css +50 -0
  65. package/src/landing/team/styles/ProductManifesto.css +164 -0
  66. package/src/landing/team/styles/SupportTransition.css +291 -0
  67. package/src/landing/team/styles/TeamComicScenes.css +129 -0
  68. package/src/landing/team/styles/TeamHero.css +149 -0
  69. package/src/landing/team/styles/TeamRoster.css +75 -0
  70. package/src/landing/team/styles/team-landing.css +83 -0
  71. package/src/layouts/PreviewLayout.astro +110 -0
  72. package/src/pages/[locale]/[slug].astro +70 -0
  73. package/src/pages/[locale].astro +165 -0
  74. package/src/pages/index.astro +3 -0
  75. package/src/styles/global.css +37 -0
  76. package/src/styles/tokens.css +107 -0
  77. package/src/tests/diacritics_density.test.ts +62 -0
  78. package/src/tests/i18n_coverage.test.ts +32 -0
  79. package/src/tests/inverted_punctuation.test.ts +67 -0
  80. package/src/tests/landing-test-helpers.ts +89 -0
  81. package/src/tests/landing_exports.test.ts +29 -0
  82. package/src/tests/mocks/astro_mock.js +1 -0
  83. package/src/tests/no_en_dash.test.ts +45 -0
  84. package/src/tests/no_h1_in_components.test.ts +33 -0
  85. package/src/tests/pagespeed_best_practices.test.ts +143 -0
  86. package/src/tests/script_density.test.ts +57 -0
  87. package/src/tests/slug_language_code_format.test.ts +20 -0
  88. package/src/tests/slug_uniqueness.test.ts +74 -0
  89. package/src/tests/title_quality.test.ts +34 -0
  90. package/src/types.ts +38 -0
@@ -0,0 +1,12 @@
1
+ import type { KnownLocale } from '../../../types';
2
+ import * as en from './en';
3
+ import * as es from './es';
4
+
5
+ const translations = {
6
+ en,
7
+ es,
8
+ };
9
+
10
+ export function getTranslation(locale: KnownLocale) {
11
+ return translations[locale as keyof typeof translations] || translations.en;
12
+ }
@@ -0,0 +1,31 @@
1
+ ---
2
+ import type { KnownLocale } from '../../types';
3
+ import TeamHero from './components/TeamHero.astro';
4
+ import CompanyWorks from './components/CompanyWorks.astro';
5
+ import BobMasterPlan from './components/BobMasterPlan.astro';
6
+ import HumanTouch from './components/HumanTouch.astro';
7
+ import ProductManifesto from './components/ProductManifesto.astro';
8
+ import BobModelBook from './components/BobModelBook.astro';
9
+ import SupportTransition from './components/SupportTransition.astro';
10
+ import { getTranslation } from './i18n';
11
+
12
+ interface Props {
13
+ locale: KnownLocale;
14
+ }
15
+
16
+ const { locale } = Astro.props;
17
+ const { pageContent } = getTranslation(locale);
18
+ ---
19
+ <div class="team-landing" data-locale={locale}>
20
+ <TeamHero t={pageContent.hero}>
21
+ <h1 class="team-hero-title" id="team-hero-title" slot="title">
22
+ <span>{pageContent.hero.titlePrefix}</span><span class="team-hero-title-accent">{pageContent.hero.titleAccent}</span>
23
+ </h1>
24
+ </TeamHero>
25
+ <CompanyWorks t={pageContent.companyWorks} />
26
+ <BobMasterPlan t={pageContent.translationComic} />
27
+ <HumanTouch t={pageContent.humanTouch} />
28
+ <ProductManifesto t={pageContent.productManifesto} />
29
+ <BobModelBook t={pageContent.bobModelBook} />
30
+ <SupportTransition locale={locale} t={pageContent.supportTransition} />
31
+ </div>
@@ -0,0 +1,55 @@
1
+ .behind-joke-grid {
2
+ display: grid;
3
+ grid-template-columns: minmax(260px, 0.8fr) minmax(0, 1.2fr);
4
+ gap: 2rem;
5
+ align-items: center;
6
+ }
7
+
8
+ .behind-joke-scene {
9
+ position: relative;
10
+ min-height: 360px;
11
+ border: 1px solid var(--team-border);
12
+ border-radius: 28px;
13
+ }
14
+
15
+ .behind-joke-island {
16
+ position: absolute;
17
+ top: 1.3rem;
18
+ left: 1.3rem;
19
+ border-radius: 999px;
20
+ padding: 0.65rem 0.9rem;
21
+ background: var(--team-mint);
22
+ color: var(--team-deep);
23
+ font-weight: var(--font-weight-bold, 800);
24
+ }
25
+
26
+ .behind-joke-desk {
27
+ position: absolute;
28
+ right: 12%;
29
+ bottom: 18%;
30
+ width: 58%;
31
+ height: 92px;
32
+ border-radius: 16px;
33
+ background: var(--team-gold);
34
+ }
35
+
36
+ .behind-joke-avatar {
37
+ position: absolute;
38
+ left: 23%;
39
+ bottom: 30%;
40
+ display: grid;
41
+ width: 88px;
42
+ height: 88px;
43
+ place-items: center;
44
+ border-radius: 999px;
45
+ background: var(--team-blue);
46
+ color: var(--team-deep);
47
+ font-size: 2rem;
48
+ font-weight: var(--font-weight-bold, 800);
49
+ }
50
+
51
+ @media (max-width: 780px) {
52
+ .behind-joke-grid {
53
+ grid-template-columns: 1fr;
54
+ }
55
+ }
@@ -0,0 +1,213 @@
1
+ .master-plan {
2
+ position: relative;
3
+ margin-block: clamp(3rem, 7vw, 6rem);
4
+ padding-block: clamp(2rem, 5vw, 4rem);
5
+ }
6
+
7
+ .master-plan .team-landing-inner {
8
+ position: relative;
9
+ z-index: 1;
10
+ }
11
+
12
+ .master-plan-header {
13
+ max-width: 780px;
14
+ }
15
+
16
+ .master-plan-strip {
17
+ display: grid;
18
+ gap: clamp(1rem, 2vw, 1.5rem);
19
+ margin-top: clamp(2rem, 5vw, 3.5rem);
20
+ }
21
+
22
+ .master-plan-scene {
23
+ display: grid;
24
+ grid-template-columns: minmax(240px, 0.82fr) minmax(0, 1fr);
25
+ gap: clamp(1rem, 4vw, 3rem);
26
+ align-items: center;
27
+ border: 1px solid color-mix(in srgb, var(--team-border) 78%, transparent);
28
+ border-radius: 12px;
29
+ padding: clamp(0.85rem, 2vw, 1.2rem);
30
+ background: color-mix(in srgb, var(--team-surface) 72%, transparent);
31
+ box-shadow: 0 22px 70px rgba(0, 0, 0, 0.12);
32
+ }
33
+
34
+ .master-plan-scene:nth-child(even) {
35
+ grid-template-columns: minmax(0, 1fr) minmax(240px, 0.82fr);
36
+ }
37
+
38
+ .master-plan-scene:nth-child(even) .master-plan-art {
39
+ order: 2;
40
+ }
41
+
42
+ .master-plan-art {
43
+ position: relative;
44
+ aspect-ratio: 16 / 9;
45
+ min-height: auto;
46
+ overflow: hidden;
47
+ border: 2px solid color-mix(in srgb, var(--team-ink) 18%, transparent);
48
+ border-radius: 8px;
49
+ background:
50
+ linear-gradient(135deg, rgba(255, 255, 255, 0.08), transparent 42%),
51
+ color-mix(in srgb, var(--team-deep) 92%, #112633);
52
+ }
53
+
54
+ .master-plan-frame-label {
55
+ position: absolute;
56
+ top: 0.75rem;
57
+ left: 0.75rem;
58
+ z-index: 2;
59
+ display: grid;
60
+ width: 2.5rem;
61
+ aspect-ratio: 1;
62
+ place-items: center;
63
+ border: 1px solid rgba(255, 255, 255, 0.24);
64
+ border-radius: 999px;
65
+ background: rgba(0, 0, 0, 0.32);
66
+ color: var(--team-mint);
67
+ font-weight: var(--font-weight-bold, 800);
68
+ }
69
+
70
+ .master-plan-placeholder {
71
+ position: absolute;
72
+ inset: 0;
73
+ display: grid;
74
+ place-items: center;
75
+ border-radius: 6px;
76
+ }
77
+
78
+ .master-plan-asset {
79
+ display: block;
80
+ width: 100%;
81
+ height: 100%;
82
+ object-fit: cover;
83
+ filter: drop-shadow(0 20px 32px rgba(0, 0, 0, 0.34));
84
+ }
85
+
86
+ .master-plan-scene-money .master-plan-asset {
87
+ width: 100%;
88
+ height: 100%;
89
+ object-fit: cover;
90
+ filter: none;
91
+ }
92
+
93
+ .master-plan-scene-bowl .master-plan-asset {
94
+ width: 100%;
95
+ height: 100%;
96
+ object-fit: cover;
97
+ filter: none;
98
+ }
99
+
100
+ .master-plan-scene-map .master-plan-asset {
101
+ width: 100%;
102
+ height: 100%;
103
+ object-fit: cover;
104
+ filter: none;
105
+ }
106
+
107
+ .master-plan-scene-orders .master-plan-asset {
108
+ width: 100%;
109
+ height: 100%;
110
+ object-fit: cover;
111
+ filter: none;
112
+ }
113
+
114
+ .master-plan-copy {
115
+ max-width: 44rem;
116
+ }
117
+
118
+ .master-plan-kicker {
119
+ margin: 0 0 0.55rem;
120
+ color: var(--team-mint);
121
+ font-size: 0.78rem;
122
+ font-weight: var(--font-weight-bold, 800);
123
+ text-transform: uppercase;
124
+ }
125
+
126
+ .master-plan-copy h3 {
127
+ margin: 0;
128
+ font-size: clamp(1.8rem, 4vw, 3.6rem);
129
+ line-height: 0.95;
130
+ }
131
+
132
+ .master-plan-equation {
133
+ display: flex;
134
+ flex-wrap: wrap;
135
+ gap: clamp(0.65rem, 1.4vw, 1rem);
136
+ align-items: center;
137
+ margin-top: 1rem;
138
+ }
139
+
140
+ .master-plan-equation-term {
141
+ display: grid;
142
+ width: clamp(4.8rem, 7.5vw, 6.4rem);
143
+ aspect-ratio: 1;
144
+ place-items: center;
145
+ border: 1px solid color-mix(in srgb, var(--team-border) 82%, transparent);
146
+ border-radius: 12px;
147
+ padding: 0.45rem;
148
+ background:
149
+ linear-gradient(180deg, rgba(255, 255, 255, 0.06), transparent),
150
+ color-mix(in srgb, var(--team-surface) 78%, transparent);
151
+ color: var(--team-ink);
152
+ box-shadow: 0 12px 34px rgba(0, 0, 0, 0.1);
153
+ }
154
+
155
+ .master-plan-equation-term img {
156
+ display: block;
157
+ width: 100%;
158
+ height: 100%;
159
+ border: 1px solid color-mix(in srgb, var(--team-border) 70%, transparent);
160
+ border-radius: 8px;
161
+ background: color-mix(in srgb, var(--team-deep) 88%, transparent);
162
+ object-fit: contain;
163
+ padding: 0.25rem;
164
+ image-rendering: auto;
165
+ }
166
+
167
+ .master-plan-equation-arrow {
168
+ color: var(--team-mint);
169
+ font-size: clamp(1.35rem, 2.5vw, 2rem);
170
+ font-weight: var(--font-weight-bold, 800);
171
+ line-height: 1;
172
+ }
173
+
174
+ .master-plan-copy p:last-child {
175
+ margin: 1rem 0 0;
176
+ color: var(--team-muted);
177
+ font-size: clamp(1rem, 1.5vw, 1.18rem);
178
+ line-height: 1.6;
179
+ }
180
+
181
+ .master-plan-punchline {
182
+ display: grid;
183
+ gap: 0.4rem;
184
+ max-width: 760px;
185
+ margin: clamp(1.5rem, 4vw, 3rem) auto 0;
186
+ text-align: center;
187
+ }
188
+
189
+ .master-plan-punchline span {
190
+ color: var(--team-mint);
191
+ font-size: clamp(1.4rem, 4vw, 3rem);
192
+ font-weight: var(--font-weight-bold, 800);
193
+ line-height: 1;
194
+ }
195
+
196
+ .master-plan-punchline strong {
197
+ color: var(--team-ink);
198
+ }
199
+
200
+ @media (max-width: 780px) {
201
+ .master-plan-scene,
202
+ .master-plan-scene:nth-child(even) {
203
+ grid-template-columns: 1fr;
204
+ }
205
+
206
+ .master-plan-scene:nth-child(even) .master-plan-art {
207
+ order: 0;
208
+ }
209
+
210
+ .master-plan-art {
211
+ min-height: auto;
212
+ }
213
+ }