@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,709 @@
1
+ .bob-model-book {
2
+ --bob-blue: #00aff0;
3
+ --bob-blue-dark: #008ccf;
4
+
5
+ position: relative;
6
+ padding-bottom: clamp(5rem, 9vw, 8rem);
7
+ }
8
+
9
+ .bob-model-book-header {
10
+ max-width: 820px;
11
+ }
12
+
13
+ .bob-model-book-logo {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ gap: 0.04em;
17
+ margin: 0;
18
+ color: var(--bob-blue);
19
+ font-size: clamp(3.4rem, 10vw, 7.5rem);
20
+ font-weight: var(--font-weight-bold, 800);
21
+ letter-spacing: -0.035em;
22
+ line-height: 0.9;
23
+ }
24
+
25
+ .bob-model-book-logo-mark {
26
+ position: relative;
27
+ display: inline-block;
28
+ width: 0.62em;
29
+ aspect-ratio: 1;
30
+ border-radius: 50%;
31
+ background: var(--bob-blue);
32
+ transform: translateY(0.02em);
33
+ }
34
+
35
+ .bob-model-book-logo-mark::before {
36
+ position: absolute;
37
+ top: 50%;
38
+ left: 50%;
39
+ width: 0.26em;
40
+ aspect-ratio: 1;
41
+ border-radius: 50%;
42
+ background: var(--team-surface);
43
+ content: "";
44
+ transform: translate(-50%, -50%);
45
+ }
46
+
47
+ .bob-model-book-logo-mark::after {
48
+ position: absolute;
49
+ right: -0.24em;
50
+ bottom: 0.09em;
51
+ width: 0.44em;
52
+ height: 0.24em;
53
+ border-radius: 999px 999px 999px 0;
54
+ background: var(--bob-blue-dark);
55
+ content: "";
56
+ transform: rotate(-26deg);
57
+ }
58
+
59
+ .bob-model-book-logo span {
60
+ font-style: italic;
61
+ }
62
+
63
+ .bob-model-book-logo strong {
64
+ color: var(--bob-blue-dark);
65
+ font-style: normal;
66
+ }
67
+
68
+ .bob-model-book-editorial {
69
+ display: grid;
70
+ grid-template-columns: repeat(12, minmax(0, 1fr));
71
+ gap: clamp(0.85rem, 1.8vw, 1.2rem);
72
+ align-items: stretch;
73
+ max-width: 1040px;
74
+ margin-top: clamp(2rem, 5vw, 3.5rem);
75
+ }
76
+
77
+ .bob-model-book-gallery {
78
+ display: grid;
79
+ grid-column: 7 / -1;
80
+ grid-template-columns: repeat(5, minmax(0, 1fr));
81
+ gap: clamp(0.85rem, 1.8vw, 1.2rem);
82
+ }
83
+
84
+ .bob-model-book-hero,
85
+ .bob-model-book-frame {
86
+ min-width: 0;
87
+ margin: 0;
88
+ }
89
+
90
+ .bob-model-book-hero {
91
+ grid-column: 1 / span 6;
92
+ }
93
+
94
+ .bob-model-book-frame-landscape {
95
+ grid-column: 1 / -1;
96
+ }
97
+
98
+ .bob-model-book-stage {
99
+ position: relative;
100
+ display: grid;
101
+ place-items: end center;
102
+ overflow: hidden;
103
+ border: 0;
104
+ border-radius: 6px;
105
+ background:
106
+ radial-gradient(circle at 50% 24%, rgba(255, 255, 255, 0.54), transparent 21%),
107
+ radial-gradient(ellipse at 50% 100%, color-mix(in srgb, var(--team-mint) 18%, transparent), transparent 48%),
108
+ linear-gradient(180deg, color-mix(in srgb, var(--team-surface-strong) 70%, #fff), var(--team-surface));
109
+ box-shadow:
110
+ inset 0 0 0 1px var(--team-border),
111
+ 0 22px 80px rgba(0, 0, 0, 0.12);
112
+ }
113
+
114
+ .bob-model-book-frame-feature .bob-model-book-stage {
115
+ aspect-ratio: 4 / 5;
116
+ }
117
+
118
+ .bob-model-book-hero .bob-model-book-stage {
119
+ aspect-ratio: 4 / 5;
120
+ min-height: auto;
121
+ }
122
+
123
+ .bob-model-book-frame-portrait .bob-model-book-stage {
124
+ aspect-ratio: 4 / 5;
125
+ }
126
+
127
+ .bob-model-book-frame-landscape .bob-model-book-stage {
128
+ aspect-ratio: 16 / 9;
129
+ }
130
+
131
+ .theme-dark .bob-model-book-stage {
132
+ background:
133
+ radial-gradient(circle at 50% 28%, rgba(255, 255, 255, 0.2), transparent 20%),
134
+ linear-gradient(180deg, #303546, #171a22 72%);
135
+ }
136
+
137
+ .theme-light .bob-model-book-stage {
138
+ background:
139
+ radial-gradient(circle at 50% 28%, rgba(255, 255, 255, 0.88), transparent 24%),
140
+ linear-gradient(180deg, #f7efe2, #d9e7df 72%);
141
+ }
142
+
143
+ .bob-model-book-stage::before {
144
+ position: absolute;
145
+ inset: auto 10% 0;
146
+ height: 32%;
147
+ border-radius: 50% 50% 0 0;
148
+ background: color-mix(in srgb, var(--team-mint) 18%, transparent);
149
+ content: "";
150
+ filter: blur(18px);
151
+ }
152
+
153
+ .bob-model-book-stage::after {
154
+ position: absolute;
155
+ inset: 0;
156
+ pointer-events: none;
157
+ background:
158
+ linear-gradient(90deg, rgba(255, 255, 255, 0.05), transparent 18%, transparent 82%, rgba(255, 255, 255, 0.05));
159
+ content: "";
160
+ }
161
+
162
+ .bob-model-book-stage img {
163
+ position: relative;
164
+ z-index: 1;
165
+ display: block;
166
+ width: min(72%, 320px);
167
+ height: auto;
168
+ object-fit: contain;
169
+ filter:
170
+ drop-shadow(0 22px 28px rgba(0, 0, 0, 0.38))
171
+ drop-shadow(0 0 24px rgba(255, 255, 255, 0.18));
172
+ }
173
+
174
+ .bob-model-book-lock {
175
+ position: absolute;
176
+ z-index: 3;
177
+ display: grid;
178
+ width: clamp(2.8rem, 5vw, 4rem);
179
+ aspect-ratio: 1;
180
+ place-items: center;
181
+ border: 1px solid rgba(255, 255, 255, 0.34);
182
+ border-radius: 999px;
183
+ background: rgba(0, 0, 0, 0.44);
184
+ box-shadow: 0 18px 46px rgba(0, 0, 0, 0.36);
185
+ backdrop-filter: blur(8px);
186
+ }
187
+
188
+ .bob-model-book-lock::before {
189
+ content: none;
190
+ }
191
+
192
+ .bob-model-book-lock::after {
193
+ content: none;
194
+ }
195
+
196
+ .bob-model-book-hero .bob-model-book-stage img {
197
+ width: min(76%, 460px);
198
+ }
199
+
200
+ @media (max-width: 860px) {
201
+ .bob-model-book-editorial {
202
+ grid-template-columns: repeat(2, minmax(0, 1fr));
203
+ }
204
+
205
+ .bob-model-book-hero {
206
+ grid-column: 1 / -1;
207
+ }
208
+
209
+ .bob-model-book-gallery {
210
+ grid-column: 1 / -1;
211
+ grid-template-columns: repeat(2, minmax(0, 1fr));
212
+ }
213
+
214
+ .bob-model-book-frame-portrait,
215
+ .bob-model-book-frame-landscape {
216
+ grid-column: span 1;
217
+ }
218
+ }
219
+
220
+ @media (max-width: 560px) {
221
+ .bob-model-book-gallery {
222
+ grid-template-columns: repeat(2, minmax(0, 1fr));
223
+ }
224
+
225
+ .bob-model-book-hero .bob-model-book-stage {
226
+ aspect-ratio: 4 / 5;
227
+ }
228
+ }
229
+
230
+ /* OnlyBob v2: continuous gallery, clean backgrounds, stronger locked state. */
231
+ .bob-model-book-grid {
232
+ display: grid;
233
+ grid-auto-flow: dense;
234
+ grid-template-columns: repeat(12, minmax(0, 1fr));
235
+ gap: clamp(0.75rem, 1.7vw, 1.1rem);
236
+ max-width: 1040px;
237
+ margin-top: clamp(2rem, 5vw, 3.5rem);
238
+ }
239
+
240
+ .bob-model-book-grid .bob-model-book-frame {
241
+ min-width: 0;
242
+ margin: 0;
243
+ }
244
+
245
+ .bob-model-book-frame-large {
246
+ grid-column: span 4;
247
+ }
248
+
249
+ .bob-model-book-frame-portrait {
250
+ grid-column: span 4;
251
+ }
252
+
253
+ .bob-model-book-frame-wide {
254
+ grid-column: span 4;
255
+ }
256
+
257
+ .bob-model-book-frame-large .bob-model-book-stage,
258
+ .bob-model-book-frame-portrait .bob-model-book-stage,
259
+ .bob-model-book-frame-wide .bob-model-book-stage {
260
+ aspect-ratio: 1 / 1;
261
+ }
262
+
263
+ .bob-model-book-grid .bob-model-book-stage {
264
+ background: linear-gradient(180deg, color-mix(in srgb, var(--team-surface-strong) 92%, #fff), var(--team-surface));
265
+ box-shadow:
266
+ inset 0 0 0 1px var(--team-border),
267
+ 0 18px 54px rgba(0, 0, 0, 0.1);
268
+ place-items: stretch;
269
+ }
270
+
271
+ .bob-model-book-open {
272
+ position: relative;
273
+ z-index: 1;
274
+ display: block;
275
+ width: 100%;
276
+ height: 100%;
277
+ padding: 0;
278
+ border: 0;
279
+ border-radius: inherit;
280
+ background: transparent;
281
+ cursor: zoom-in;
282
+ }
283
+
284
+ .bob-model-book-open:focus-visible {
285
+ outline: 3px solid var(--bob-blue);
286
+ outline-offset: 4px;
287
+ }
288
+
289
+ .bob-model-book-grid .bob-model-book-stage img,
290
+ .bob-model-book-open img {
291
+ width: 100%;
292
+ height: 100%;
293
+ object-fit: cover;
294
+ }
295
+
296
+ .theme-dark .bob-model-book-grid .bob-model-book-stage {
297
+ background: linear-gradient(180deg, #252a36, #171a22);
298
+ }
299
+
300
+ .theme-light .bob-model-book-grid .bob-model-book-stage {
301
+ background: linear-gradient(180deg, #eef4f7, #dfe8e4);
302
+ }
303
+
304
+ .bob-model-book-grid .bob-model-book-stage::before {
305
+ display: none;
306
+ }
307
+
308
+ .bob-model-book-grid .bob-model-book-stage::after {
309
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.08), transparent 38%, rgba(0, 0, 0, 0.06));
310
+ }
311
+
312
+ .bob-model-book-frame-large .bob-model-book-stage img {
313
+ width: 100%;
314
+ }
315
+
316
+ .bob-model-book-frame.is-locked .bob-model-book-stage {
317
+ background: linear-gradient(180deg, #141923, #080b12);
318
+ }
319
+
320
+ .theme-light .bob-model-book-frame.is-locked .bob-model-book-stage {
321
+ background: linear-gradient(180deg, #202837, #0d111a);
322
+ }
323
+
324
+ .bob-model-book-frame.is-locked .bob-model-book-stage img {
325
+ filter:
326
+ blur(12px)
327
+ saturate(0.25)
328
+ brightness(0.28)
329
+ contrast(1.45)
330
+ drop-shadow(0 22px 28px rgba(0, 0, 0, 0.38));
331
+ opacity: 0.22;
332
+ transform: scale(1.22);
333
+ }
334
+
335
+ .bob-model-book-frame.is-locked .bob-model-book-stage::after {
336
+ z-index: 2;
337
+ background:
338
+ radial-gradient(circle at 50% 50%, rgba(0, 175, 240, 0.16), transparent 28%),
339
+ rgba(0, 0, 0, 0.78);
340
+ }
341
+
342
+ .bob-model-book-frame.is-unlocking {
343
+ animation: bob-model-book-frame-unlock 1500ms cubic-bezier(0.2, 0.74, 0.22, 1) var(--unlock-delay, 0ms) both;
344
+ pointer-events: none;
345
+ }
346
+
347
+ .bob-model-book-frame.is-unlocking .bob-model-book-stage {
348
+ overflow: hidden;
349
+ }
350
+
351
+ .bob-model-book-frame.is-unlocking .bob-model-book-stage img {
352
+ animation: bob-model-book-image-unveil 1500ms cubic-bezier(0.2, 0.74, 0.22, 1) var(--unlock-delay, 0ms) both;
353
+ }
354
+
355
+ .bob-model-book-frame.is-unlocking .bob-model-book-stage::after {
356
+ animation: bob-model-book-veil-lift 1500ms cubic-bezier(0.2, 0.74, 0.22, 1) var(--unlock-delay, 0ms) both;
357
+ background:
358
+ radial-gradient(circle at 50% 44%, rgba(0, 175, 240, 0.14), transparent 34%),
359
+ rgba(0, 0, 0, 0.78);
360
+ }
361
+
362
+ .bob-model-book-frame.is-unlocking .bob-model-book-lock {
363
+ animation: bob-model-book-lock-yield 980ms cubic-bezier(0.2, 0.74, 0.22, 1) var(--unlock-delay, 0ms) both;
364
+ }
365
+
366
+ .bob-model-book-frame.is-trial-unlocked .bob-model-book-stage {
367
+ background: linear-gradient(180deg, color-mix(in srgb, var(--team-surface-strong) 92%, #fff), var(--team-surface));
368
+ }
369
+
370
+ .bob-model-book-frame.is-trial-unlocked .bob-model-book-stage img {
371
+ filter:
372
+ drop-shadow(0 22px 28px rgba(0, 0, 0, 0.38))
373
+ drop-shadow(0 0 24px rgba(255, 255, 255, 0.18));
374
+ opacity: 1;
375
+ transform: none;
376
+ }
377
+
378
+ .bob-model-book-frame.is-trial-unlocked .bob-model-book-stage::after {
379
+ z-index: 0;
380
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.08), transparent 38%, rgba(0, 0, 0, 0.06));
381
+ }
382
+
383
+ .bob-model-book-frame.is-trial-unlocked .bob-model-book-lock {
384
+ display: none;
385
+ }
386
+
387
+ .bob-model-book-lock svg {
388
+ width: 1.45rem;
389
+ height: 1.45rem;
390
+ color: var(--team-mint);
391
+ }
392
+
393
+ .bob-model-book-lightbox {
394
+ width: min(92vw, 820px);
395
+ max-width: none;
396
+ max-height: 94vh;
397
+ padding: 0;
398
+ border: 0;
399
+ border-radius: 10px;
400
+ color: var(--team-text);
401
+ background: transparent;
402
+ overflow: visible;
403
+ }
404
+
405
+ .bob-model-book-lightbox::backdrop {
406
+ background:
407
+ radial-gradient(circle at 50% 42%, rgba(0, 175, 240, 0.14), transparent 34%),
408
+ rgba(1, 5, 18, 0.84);
409
+ backdrop-filter: blur(10px);
410
+ }
411
+
412
+ .bob-model-book-lightbox[open] {
413
+ animation: bob-model-book-lightbox-in 160ms ease-out;
414
+ }
415
+
416
+ .bob-model-book-lightbox-frame {
417
+ position: relative;
418
+ display: grid;
419
+ place-items: center;
420
+ padding: clamp(0.55rem, 1.2vw, 0.85rem);
421
+ border: 1px solid color-mix(in srgb, var(--bob-blue) 28%, var(--team-border));
422
+ border-radius: 10px;
423
+ background:
424
+ linear-gradient(180deg, rgba(255, 255, 255, 0.075), transparent 18%),
425
+ color-mix(in srgb, var(--team-surface-strong) 94%, #050814);
426
+ box-shadow:
427
+ 0 34px 120px rgba(0, 0, 0, 0.6),
428
+ 0 0 0 1px rgba(255, 255, 255, 0.055),
429
+ inset 0 1px 0 rgba(255, 255, 255, 0.1);
430
+ }
431
+
432
+ .bob-model-book-lightbox img {
433
+ display: block;
434
+ width: 100%;
435
+ max-height: min(82vh, 780px);
436
+ border-radius: 6px;
437
+ background: #0b1020;
438
+ object-fit: contain;
439
+ box-shadow: 0 14px 42px rgba(0, 0, 0, 0.32);
440
+ }
441
+
442
+ .bob-model-book-lightbox-close {
443
+ position: absolute;
444
+ top: -0.85rem;
445
+ right: -0.85rem;
446
+ z-index: 2;
447
+ display: grid;
448
+ width: 2.7rem;
449
+ aspect-ratio: 1;
450
+ place-items: center;
451
+ border: 1px solid color-mix(in srgb, var(--bob-blue) 34%, var(--team-border));
452
+ border-radius: 999px;
453
+ color: var(--team-text);
454
+ background: color-mix(in srgb, var(--team-surface-strong) 92%, #050814);
455
+ box-shadow:
456
+ 0 16px 42px rgba(0, 0, 0, 0.42),
457
+ inset 0 1px 0 rgba(255, 255, 255, 0.08);
458
+ cursor: pointer;
459
+ transition:
460
+ color 160ms ease,
461
+ border-color 160ms ease,
462
+ transform 160ms ease;
463
+ }
464
+
465
+ .bob-model-book-lightbox-close:hover,
466
+ .bob-model-book-lightbox-close:focus-visible {
467
+ color: var(--bob-blue);
468
+ border-color: var(--bob-blue);
469
+ transform: scale(1.06);
470
+ }
471
+
472
+ .bob-model-book-lightbox-close svg {
473
+ width: 1.3rem;
474
+ height: 1.3rem;
475
+ }
476
+
477
+ .bob-model-book-paywall {
478
+ width: min(92vw, 480px);
479
+ padding: 0;
480
+ border: 0;
481
+ border-radius: 10px;
482
+ color: var(--team-text);
483
+ background: transparent;
484
+ overflow: visible;
485
+ }
486
+
487
+ .bob-model-book-paywall::backdrop {
488
+ background: rgba(1, 5, 18, 0.86);
489
+ backdrop-filter: blur(10px);
490
+ }
491
+
492
+ .bob-model-book-paywall[open] {
493
+ animation: bob-model-book-lightbox-in 160ms ease-out;
494
+ }
495
+
496
+ .bob-model-book-paywall-panel {
497
+ position: relative;
498
+ display: grid;
499
+ gap: 1rem;
500
+ padding: clamp(1.4rem, 4vw, 2rem);
501
+ border: 1px solid color-mix(in srgb, var(--bob-blue) 46%, var(--team-border));
502
+ border-radius: 10px;
503
+ background: color-mix(in srgb, var(--team-surface-strong) 94%, #050814);
504
+ box-shadow:
505
+ 0 34px 120px rgba(0, 0, 0, 0.62),
506
+ 0 0 0 6px color-mix(in srgb, var(--bob-blue) 8%, transparent),
507
+ inset 0 1px 0 rgba(255, 255, 255, 0.12);
508
+ }
509
+
510
+ .bob-model-book-paywall h3 {
511
+ margin: 0;
512
+ color: var(--bob-blue);
513
+ font-size: clamp(1.7rem, 5vw, 2.5rem);
514
+ line-height: 1;
515
+ }
516
+
517
+ .bob-model-book-paywall p {
518
+ margin: 0;
519
+ color: var(--team-text-muted);
520
+ line-height: 1.65;
521
+ }
522
+
523
+ .bob-model-book-buy,
524
+ .bob-model-book-trial {
525
+ display: inline-flex;
526
+ align-items: center;
527
+ justify-content: center;
528
+ min-height: 3rem;
529
+ border-radius: 999px;
530
+ font-weight: var(--font-weight-bold, 800);
531
+ }
532
+
533
+ .bob-model-book-buy {
534
+ gap: 0.5rem;
535
+ border: 1px solid color-mix(in srgb, var(--team-border) 74%, transparent);
536
+ color: var(--team-text-muted);
537
+ background: color-mix(in srgb, var(--team-surface) 54%, transparent);
538
+ cursor: not-allowed;
539
+ opacity: 0.72;
540
+ }
541
+
542
+ .bob-model-book-buy svg {
543
+ width: 1.1rem;
544
+ height: 1.1rem;
545
+ }
546
+
547
+ .bob-model-book-trial {
548
+ border: 1px solid var(--bob-blue);
549
+ color: var(--human-touch-inverse, #fff);
550
+ background: var(--bob-blue);
551
+ box-shadow: 0 16px 42px color-mix(in srgb, var(--bob-blue) 24%, transparent);
552
+ cursor: pointer;
553
+ transition:
554
+ box-shadow 160ms ease,
555
+ transform 160ms ease;
556
+ }
557
+
558
+ .bob-model-book-trial:hover,
559
+ .bob-model-book-trial:focus-visible {
560
+ box-shadow: 0 18px 54px color-mix(in srgb, var(--bob-blue) 34%, transparent);
561
+ transform: translateY(-1px);
562
+ }
563
+
564
+ .bob-model-book-subscription {
565
+ position: fixed;
566
+ right: clamp(1rem, 3vw, 1.5rem);
567
+ bottom: clamp(1rem, 3vw, 1.5rem);
568
+ z-index: 60;
569
+ display: flex;
570
+ gap: 0.7rem;
571
+ align-items: center;
572
+ max-width: calc(100vw - 2rem);
573
+ padding: 0.7rem 0.9rem;
574
+ border: 1px solid color-mix(in srgb, var(--team-gold) 42%, var(--team-border));
575
+ border-radius: 999px;
576
+ color: var(--team-text);
577
+ background: color-mix(in srgb, var(--team-surface-strong) 88%, #050814);
578
+ box-shadow:
579
+ 0 18px 54px rgba(0, 0, 0, 0.34),
580
+ inset 0 1px 0 rgba(255, 255, 255, 0.08);
581
+ backdrop-filter: blur(12px);
582
+ }
583
+
584
+ .bob-model-book-subscription[hidden] {
585
+ display: none;
586
+ }
587
+
588
+ .bob-model-book-subscription span {
589
+ color: var(--team-text-muted);
590
+ font-size: 0.86rem;
591
+ }
592
+
593
+ .bob-model-book-subscription strong {
594
+ color: var(--team-gold);
595
+ font-variant-numeric: tabular-nums;
596
+ }
597
+
598
+ @keyframes bob-model-book-lightbox-in {
599
+ from {
600
+ opacity: 0;
601
+ transform: translateY(10px) scale(0.985);
602
+ }
603
+
604
+ to {
605
+ opacity: 1;
606
+ transform: translateY(0) scale(1);
607
+ }
608
+ }
609
+
610
+ @keyframes bob-model-book-frame-unlock {
611
+ 0% {
612
+ transform: translateY(0) scale(1);
613
+ }
614
+
615
+ 44% {
616
+ transform: translateY(-0.35rem) scale(1.012);
617
+ }
618
+
619
+ 100% {
620
+ transform: translateY(0) scale(1);
621
+ }
622
+ }
623
+
624
+ @keyframes bob-model-book-image-unveil {
625
+ 0% {
626
+ filter:
627
+ blur(12px)
628
+ saturate(0.25)
629
+ brightness(0.28)
630
+ contrast(1.45)
631
+ drop-shadow(0 22px 28px rgba(0, 0, 0, 0.38));
632
+ opacity: 0.22;
633
+ transform: scale(1.22);
634
+ }
635
+
636
+ 42% {
637
+ filter:
638
+ blur(6px)
639
+ saturate(0.7)
640
+ brightness(0.62)
641
+ contrast(1.22)
642
+ drop-shadow(0 22px 28px rgba(0, 0, 0, 0.38));
643
+ opacity: 0.56;
644
+ transform: scale(1.12);
645
+ }
646
+
647
+ 100% {
648
+ filter:
649
+ drop-shadow(0 22px 28px rgba(0, 0, 0, 0.38))
650
+ drop-shadow(0 0 24px rgba(255, 255, 255, 0.18));
651
+ opacity: 1;
652
+ transform: none;
653
+ }
654
+ }
655
+
656
+ @keyframes bob-model-book-veil-lift {
657
+ 0% {
658
+ opacity: 1;
659
+ }
660
+
661
+ 58% {
662
+ opacity: 0.64;
663
+ }
664
+
665
+ 100% {
666
+ opacity: 0;
667
+ }
668
+ }
669
+
670
+ @keyframes bob-model-book-lock-yield {
671
+ 0% {
672
+ opacity: 1;
673
+ transform: translateY(0) scale(1);
674
+ }
675
+
676
+ 54% {
677
+ opacity: 1;
678
+ transform: translateY(-0.45rem) scale(1.08);
679
+ }
680
+
681
+ 100% {
682
+ opacity: 0;
683
+ transform: translateY(0.9rem) scale(0.82);
684
+ }
685
+ }
686
+
687
+ @media (max-width: 860px) {
688
+ .bob-model-book-grid {
689
+ grid-template-columns: repeat(6, minmax(0, 1fr));
690
+ }
691
+
692
+ .bob-model-book-frame-large,
693
+ .bob-model-book-frame-portrait,
694
+ .bob-model-book-frame-wide {
695
+ grid-column: span 3;
696
+ }
697
+ }
698
+
699
+ @media (max-width: 560px) {
700
+ .bob-model-book-grid {
701
+ grid-template-columns: repeat(2, minmax(0, 1fr));
702
+ }
703
+
704
+ .bob-model-book-frame-large,
705
+ .bob-model-book-frame-portrait,
706
+ .bob-model-book-frame-wide {
707
+ grid-column: span 1;
708
+ }
709
+ }