@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,94 @@
1
+ ---
2
+
3
+ interface Props {
4
+ t: {
5
+ eyebrow: string;
6
+ title: string;
7
+ text: string;
8
+ members: {
9
+ bob: { name: string; role: string; bio: string; tag: string };
10
+ c2: { name: string; role: string; bio: string; tag: string };
11
+ c3: { name: string; role: string; bio: string; tag: string };
12
+ c4: { name: string; role: string; bio: string; tag: string };
13
+ c5: { name: string; role: string; bio: string; tag: string };
14
+ jj: { name: string; role: string; bio: string; tag: string };
15
+ };
16
+ };
17
+ }
18
+
19
+ const { t } = Astro.props;
20
+
21
+ const members = [
22
+ {
23
+ name: t.members.bob.name,
24
+ role: t.members.bob.role,
25
+ bio: t.members.bob.bio,
26
+ tag: t.members.bob.tag,
27
+ mark: 'B',
28
+ color: '#f8d66d',
29
+ },
30
+ {
31
+ name: t.members.c2.name,
32
+ role: t.members.c2.role,
33
+ bio: t.members.c2.bio,
34
+ tag: t.members.c2.tag,
35
+ mark: 'C',
36
+ color: '#2dd4bf',
37
+ },
38
+ {
39
+ name: t.members.c3.name,
40
+ role: t.members.c3.role,
41
+ bio: t.members.c3.bio,
42
+ tag: t.members.c3.tag,
43
+ mark: 'C',
44
+ color: '#f15aa0',
45
+ },
46
+ {
47
+ name: t.members.c4.name,
48
+ role: t.members.c4.role,
49
+ bio: t.members.c4.bio,
50
+ tag: t.members.c4.tag,
51
+ mark: 'C',
52
+ color: '#60a5fa',
53
+ },
54
+ {
55
+ name: t.members.c5.name,
56
+ role: t.members.c5.role,
57
+ bio: t.members.c5.bio,
58
+ tag: t.members.c5.tag,
59
+ mark: 'C',
60
+ color: '#a78bfa',
61
+ },
62
+ {
63
+ name: t.members.jj.name,
64
+ role: t.members.jj.role,
65
+ bio: t.members.jj.bio,
66
+ tag: t.members.jj.tag,
67
+ mark: 'J',
68
+ color: '#fb7185',
69
+ },
70
+ ];
71
+ ---
72
+
73
+ <section class="team-section team-roster" aria-labelledby="team-roster-title">
74
+ <div class="team-landing-inner">
75
+ <p class="team-section-eyebrow">{t.eyebrow}</p>
76
+ <h2 class="team-section-title" id="team-roster-title">{t.title}</h2>
77
+ <p class="team-section-text">
78
+ {t.text}
79
+ </p>
80
+ <div class="team-roster-grid">
81
+ {
82
+ members.map((member) => (
83
+ <article class="team-member-card" style={`--member-color: ${member.color}`}>
84
+ <div class="team-member-card-avatar" aria-hidden="true">{member.mark}</div>
85
+ <h3 class="team-member-card-name">{member.name}</h3>
86
+ <p class="team-member-card-role">{member.role}</p>
87
+ <p class="team-member-card-bio">{member.bio}</p>
88
+ <span class="team-member-card-tag">{member.tag}</span>
89
+ </article>
90
+ ))
91
+ }
92
+ </div>
93
+ </div>
94
+ </section>
@@ -0,0 +1,23 @@
1
+ import type { LandingEntry } from '../../types';
2
+
3
+ const assetsBasePath = '/landings/team/assets';
4
+ const cssPath = '/landings/team/team.css';
5
+ const openGraphImage = `${assetsBasePath}/gamebob-team-hero.webp`;
6
+
7
+ export const teamEntry: LandingEntry = {
8
+ id: 'team',
9
+ publicAssets: {
10
+ basePath: assetsBasePath,
11
+ cssPath,
12
+ },
13
+ seo: {
14
+ title: 'GameBob Team',
15
+ description: 'A warm team landing about Bob, the feline board of directors, one solo developer in Mallorca, and the companions remembered along the way.',
16
+ image: openGraphImage,
17
+ openGraphImage,
18
+ },
19
+ i18n: {
20
+ en: () => import('./i18n/en').then((m) => m.cardContent),
21
+ es: () => import('./i18n/es').then((m) => m.cardContent),
22
+ }
23
+ };
@@ -0,0 +1,278 @@
1
+ import type { LandingCardContent } from '../../../types';
2
+
3
+ export const cardContent: LandingCardContent = {
4
+ slug: 'team',
5
+ title: 'GameBob Team',
6
+ subtitle: 'Run by cats. Built by one human.',
7
+ description: 'A warm, tiny team page about Bob, a feline board of directors, one solo developer in Mallorca, and the companions remembered along the way.'
8
+ };
9
+
10
+ export const pageContent = {
11
+ hero: {
12
+ kicker: 'Somewhere in Mallorca',
13
+ titlePrefix: 'Game',
14
+ titleAccent: 'Bob',
15
+ lead: 'RUN BY CATS. BUILT BY ONE HUMAN.',
16
+ stageLabel: 'Bob supervising the GameBob studio',
17
+ sceneAlt: 'Pixel-art scene of Bob supervising a board meeting while Juanjo works on a laptop'
18
+ },
19
+ companyWorks: {
20
+ eyebrow: 'How this company works',
21
+ title: 'The Feline Board',
22
+ text: 'GameBob is organized by actual authority, not by corporate fantasy. Bob and Terra dominate the board. JJ implements the decisions.',
23
+ secretDossier: 'Secret technical dossier',
24
+ closeDossier: 'Close dossier',
25
+ members: {
26
+ bob: {
27
+ name: 'Bob',
28
+ role: 'Chief Executive Cat',
29
+ status: 'Authority level: Absolute. Professional eater.',
30
+ dossier: 'Maximum authority. Reviews strategy, snack allocation and whether the current direction deserves a blink.'
31
+ },
32
+ terra: {
33
+ name: 'Terra',
34
+ role: 'The Matriarch',
35
+ status: 'The origin. Stares at code until it feels judged.',
36
+ dossier: 'Senior presence. Keeps the board emotionally calibrated and silently audits suspicious decisions.'
37
+ },
38
+ ambar: {
39
+ name: 'Ambar',
40
+ role: 'Senior Supervisor',
41
+ status: 'Maintaining balance of power (via extreme clinginess).',
42
+ dossier: 'Oversees attention distribution, lap availability and the human department morale budget.'
43
+ },
44
+ ambarChiquilla: {
45
+ name: 'Ambar Chiquilla',
46
+ role: 'Junior Auditor',
47
+ status: 'Timid hunter. Specialized in mouse cursor tracking.',
48
+ dossier: 'Small-format auditor. Specializes in careful observation, cursor pursuit and gentle escalation.'
49
+ },
50
+ drac: {
51
+ name: 'Drac',
52
+ role: 'Field Operations',
53
+ status: 'Party animal. Living his best life on the streets.',
54
+ dossier: 'External operations lead. Maintains field independence and appears when the conditions are personally acceptable.'
55
+ },
56
+ jj: {
57
+ name: 'JJ',
58
+ role: 'Solo Developer',
59
+ status: 'Implementation Dept. Status: Outnumbered.',
60
+ dossier: 'Implementation department. Builds, ships, translates and maintains the platform under board supervision.'
61
+ }
62
+ }
63
+ },
64
+ teamComic: {
65
+ eyebrow: 'Mini webcomic',
66
+ title: 'Every team member gets a scene, not just a card.',
67
+ scenes: {
68
+ strategic: {
69
+ title: 'Strategic planning',
70
+ setting: 'Bob studies a map of the world and identifies regions with promising snack logistics.',
71
+ speech: ['More languages.', 'More humans.', 'More food.'],
72
+ propLabel: 'map'
73
+ },
74
+ qa: {
75
+ title: 'Quality assurance',
76
+ setting: 'A supervisor sleeps on documents labeled extremely important until the layout feels calmer.',
77
+ speech: ['This button needs warmth.', 'Also, I require the chair.'],
78
+ propLabel: 'papers'
79
+ },
80
+ implementation: {
81
+ title: 'Implementation',
82
+ setting: 'The human writes code while the board contributes unexpected input through the keyboard.',
83
+ speech: ['Ship it.', 'No, wait. Pet me first.'],
84
+ propLabel: 'keyboard'
85
+ }
86
+ }
87
+ },
88
+ behindJoke: {
89
+ eyebrow: 'Behind the joke',
90
+ title: 'The jokes are real. The work is too.',
91
+ text: 'Behind GameBob there is one solo developer designing, building, translating and maintaining everything from Mallorca. The goal is simple: make tools that are useful, visual, fast and pleasant to use.',
92
+ island: 'Mallorca'
93
+ },
94
+ humanTouch: {
95
+ eyebrow: 'Human resource',
96
+ title: 'The Human',
97
+ textBefore: 'Bob decided that empathy had to be an essential part of this page because "humans connect with humans". So she ordered this section, and knowing we suffer from attention deficits, demanded it be filled with animations and ',
98
+ wordWithRagebait: 'vright lights',
99
+ textAfter: '.',
100
+ ragebaitExplanation: 'Everyone relax: the "v" in vright is there on purpose. Feline board analytics guarantee that correcting typos increases visits by 400%.',
101
+ chipsLabel: 'Human areas',
102
+ boardLabel: 'Human operations file',
103
+ alert: 'HIGH-DOPAMINE HUMAN FILE',
104
+ portraitAlt: 'jjlmoya in a falsely seductive profile photo',
105
+ poseLabel: 'Mandatory pose',
106
+ name: 'jjlmoya',
107
+ role: 'Frontend Developer',
108
+ bio: 'Turns curiosities, problems and everyday details into tools, interactive experiences and systems that can grow for years.',
109
+ stats: [
110
+ ['Base', 'Mallorca, Spain'],
111
+ ['Role', 'Developer'],
112
+ ['Experience', 'More than one feline lifetime'],
113
+ ['Languages', 'ES · CA · EN']
114
+ ],
115
+ chips: [
116
+ 'Frontend',
117
+ 'Apps',
118
+ 'Websites',
119
+ 'Automation',
120
+ 'Product',
121
+ 'Interfaces',
122
+ 'Performance',
123
+ 'Accessibility',
124
+ 'Privacy',
125
+ 'Useful ideas'
126
+ ],
127
+ stamp: 'MANDATORY HUMAN TOUCH!',
128
+ linksLabel: 'Professional links',
129
+ partyPlayer: {
130
+ eyebrow: 'Bob audio lab',
131
+ title: 'Board approved party track',
132
+ text: 'Press play and the human resource banner enters emergency celebration mode.',
133
+ audioLabel: 'Play Bob party track',
134
+ playLabel: 'Play Bob party track',
135
+ pauseLabel: 'Pause Bob party track'
136
+ }
137
+ },
138
+ translationComic: {
139
+ eyebrow: 'The translation comic',
140
+ title: 'How it all started',
141
+ spainFood: 'Spain means food.',
142
+ worldFood: 'The world means more food.',
143
+ humanAssignment: 'The human understands the assignment.',
144
+ languagesLabel: 'Supported language placeholders',
145
+ text: 'Bob\'s Master Plan to take over your money began with a simple revelation: money could become food. Since then, nothing was operationally safe again.',
146
+ quote: 'More work. More money. More food.',
147
+ closing: 'The plan was simple. The human is still recovering.',
148
+ scenes: [
149
+ {
150
+ label: 'My great mistake',
151
+ title: 'Bob discovered the system.',
152
+ text: 'One day I made an irreparable mistake: I let her see how I got her food. That day Bob started to understand everything.',
153
+ assetAlt: '',
154
+ formula: ['Money', 'Food']
155
+ },
156
+ {
157
+ label: 'The dream',
158
+ title: 'The stomach set the course.',
159
+ text: 'Bob dreamed day and night without stopping and concluded that she would like to have much, much more food.',
160
+ assetAlt: '',
161
+ formula: ['More money', 'More food']
162
+ },
163
+ {
164
+ label: 'The master plan',
165
+ title: 'Bob thought about revenue.',
166
+ text: 'Bob was not satisfied with understanding the system. She started wondering how to produce recurring money, preferably without moving a paw.',
167
+ assetAlt: '',
168
+ formula: ['Tools', 'Money']
169
+ },
170
+ {
171
+ label: 'GameBob is born',
172
+ title: 'The human received the order.',
173
+ text: 'The order was simple: the human would build tools, games and pages. Bob would supervise strategy. Food would finance the vision.',
174
+ assetAlt: '',
175
+ formula: ['More projects', 'More food']
176
+ }
177
+ ]
178
+ },
179
+ bobModelBook: {
180
+ eyebrow: 'Emergency plan',
181
+ logoPrefix: 'Only',
182
+ logoName: 'Bob',
183
+ text: 'Bob forced me to create this section because, if everything else fails, she considers her presence an economically viable alternative. I only implemented the order.',
184
+ galleryLabel: 'Editorial gallery of Bob',
185
+ unlockedAlt: 'Bob in an editorial pose',
186
+ lockedAlt: 'Locked Bob pose',
187
+ openLabel: 'Open Bob pose',
188
+ closeLabel: 'Close Bob pose',
189
+ premiumTitle: 'OnlyBob Premium',
190
+ premiumText: 'Bob has decided these poses are too powerful for casual scrolling. Full access will open when she considers the business model emotionally mature.',
191
+ buyLabel: 'Buy access (she is not desperate yet)',
192
+ trialLabel: 'Free 24-hour preview',
193
+ subscriptionLabel: 'OnlyBob trial active',
194
+ subscriptionPrefix: '',
195
+ expiredLabel: 'Trial expired'
196
+ },
197
+ productManifesto: {
198
+ eyebrow: 'Product philosophy',
199
+ title: 'High quality for high benefit.',
200
+ description: 'The cat has read hundreds of SEO manuals to optimise every piece of the page, has five digital marketing books under her belt and is starting to read about stoicism. These are the rules she set for passing the vetting and earning her seal of quality.',
201
+ values: [
202
+ 'Useful',
203
+ 'Visual',
204
+ 'Fast',
205
+ 'Playful',
206
+ 'Unique',
207
+ 'Privacy',
208
+ 'Meow'
209
+ ]
210
+ },
211
+ memoryWall: {
212
+ eyebrow: 'Memory wall',
213
+ title: 'For every animal still part of the story.',
214
+ text: 'This will become a warm archive of photos, dates, little rituals and memories. Gentle rather than sad: a place for everyone who left pawprints, noise, warmth and timing chaos behind.',
215
+ memories: {
216
+ m1: { name: 'Memory slot 01', line: 'A small place for a big personality.' },
217
+ m2: { name: 'Memory slot 02', line: 'Favorite nap, favorite sound, favorite tiny habit.' },
218
+ m3: { name: 'Memory slot 03', line: 'A story that deserves its own warm corner.' },
219
+ m4: { name: 'Memory slot 04', line: 'For every animal who made the house a team.' }
220
+ }
221
+ },
222
+ supportTransition: {
223
+ eyebrow: 'The board is open to',
224
+ title: 'Feedback.',
225
+ text: 'Ideas, bug reports, translation fixes and project support. The executive board cannot promise fast replies. Mostly because they are cats. The human resource will still read everything with care.',
226
+ linkText: 'Support Us!',
227
+ comingSoonLabel: 'Coming soon',
228
+ inbox: {
229
+ ideas: 'ideas',
230
+ bugs: 'bugs',
231
+ fixes: 'fixes',
232
+ support: 'support'
233
+ }
234
+ },
235
+ teamRoster: {
236
+ eyebrow: 'Current team',
237
+ title: 'A serious studio, supervised by unserious experts.',
238
+ text: 'This is the first rough pass: Bob leads the page today, and the rest of the team has placeholder cards ready to receive names, photos, stories, and properly ridiculous titles.',
239
+ members: {
240
+ bob: {
241
+ name: 'Bob',
242
+ role: 'Executive Nap Officer',
243
+ bio: 'Black cat, founder of the quiet QA department, and the first member of the GameBob team.',
244
+ tag: 'Final approval: sleeps on it'
245
+ },
246
+ c2: {
247
+ name: 'Cat teammate 02',
248
+ role: 'Chaos QA',
249
+ bio: 'Specializes in unexpected clicks, keyboard walks, and finding the one layout that still needs love.',
250
+ tag: 'Name pending'
251
+ },
252
+ c3: {
253
+ name: 'Cat teammate 03',
254
+ role: 'Comfort Designer',
255
+ bio: 'Keeps the studio soft, warm, and legally required to contain at least one cozy corner.',
256
+ tag: 'Name pending'
257
+ },
258
+ c4: {
259
+ name: 'Cat teammate 04',
260
+ role: 'Focus Interruptor',
261
+ bio: 'Protects the project from overwork by introducing regular breaks at inconvenient times.',
262
+ tag: 'Name pending'
263
+ },
264
+ c5: {
265
+ name: 'Cat teammate 05',
266
+ role: 'Snack Auditor',
267
+ bio: 'Monitors all kitchen-related decisions and maintains strong opinions about empty bowls.',
268
+ tag: 'Name pending'
269
+ },
270
+ jj: {
271
+ name: 'JJL Moya',
272
+ role: 'Solo Developer',
273
+ bio: 'Builds the games, tools, copy, interfaces, systems, and the occasional feature requested by a tail.',
274
+ tag: 'Human department'
275
+ }
276
+ }
277
+ }
278
+ };
@@ -0,0 +1,278 @@
1
+ import type { LandingCardContent } from '../../../types';
2
+
3
+ export const cardContent: LandingCardContent = {
4
+ slug: 'equipo',
5
+ title: 'Equipo GameBob',
6
+ subtitle: 'Dirigido por gatos. Creado por un humano.',
7
+ description: 'Una cálida y pequeña página sobre Bob, una junta directiva felina, un desarrollador en Mallorca y los compañeros recordados en el camino.'
8
+ };
9
+
10
+ export const pageContent = {
11
+ hero: {
12
+ kicker: 'En algún lugar de Mallorca',
13
+ titlePrefix: 'Game',
14
+ titleAccent: 'Bob',
15
+ lead: 'DIRIGIDO POR GATOS. CREADO POR UN HUMANO.',
16
+ stageLabel: 'Bob supervisando el estudio GameBob',
17
+ sceneAlt: 'Escena pixel art de Bob supervisando una reunión de la junta mientras Juanjo trabaja en un portátil'
18
+ },
19
+ companyWorks: {
20
+ eyebrow: 'Cómo funciona esta empresa',
21
+ title: 'La Junta Felina',
22
+ text: 'GameBob se organiza por autoridad real, no por fantasía corporativa. Bob domina la junta. Nada de modelos horizontales: todo es vertical, incuestionable y ligeramente intimidante. La democracia no se vislumbra ni hoy, ni mañana, ni nunca.',
23
+ secretDossier: 'Dossier técnico secreto',
24
+ closeDossier: 'Cerrar dossier',
25
+ members: {
26
+ bob: {
27
+ name: 'Bob',
28
+ role: 'Gato Director Ejecutivo',
29
+ status: 'Nivel de autoridad: Absoluto. Comedor profesional.',
30
+ dossier: 'Máxima autoridad. Revisa la estrategia, la asignación de comida y si el rumbo actual merece un parpadeo.'
31
+ },
32
+ terra: {
33
+ name: 'Terra',
34
+ role: 'La Matriarach',
35
+ status: 'El origen. Mira fijamente el código hasta que se siente juzgado.',
36
+ dossier: 'Presencia senior. Mantiene a la junta equilibrada emocionalmente y audita en silencio decisiones sospechosas.'
37
+ },
38
+ ambar: {
39
+ name: 'Ámbar',
40
+ role: 'Supervisora Senior',
41
+ status: 'Manteniendo el equilibrio de poder (a través de mimos extremos).',
42
+ dossier: 'Supervisa la distribución de atención, la disponibilidad del regazo y el presupuesto de moral del departamento humano.'
43
+ },
44
+ ambarChiquilla: {
45
+ name: 'Ámbar Chiquilla',
46
+ role: 'Auditora Junior',
47
+ status: 'Cazadora tímida. Especializada en el seguimiento del cursor del ratón.',
48
+ dossier: 'Auditora de formato pequeño. Se especializa en la observación cuidadosa, la persecución del cursor y la escalada silenciosa.'
49
+ },
50
+ drac: {
51
+ name: 'Drac',
52
+ role: 'Operaciones de Campo',
53
+ status: 'Alma de la fiesta. Viviendo su mejor vida en las calles.',
54
+ dossier: 'Líder de operaciones externas. Mantiene la independencia de campo y aparece cuando las condiciones son personalmente aceptables.'
55
+ },
56
+ jj: {
57
+ name: 'JJ',
58
+ role: 'Desarrollador en Solitario',
59
+ status: 'Depto. de Implementación. Estado: Superado en número.',
60
+ dossier: 'Departamento de implementación. Construye, envía, traduce y mantiene la plataforma bajo la supervisión de la junta.'
61
+ }
62
+ }
63
+ },
64
+ teamComic: {
65
+ eyebrow: 'Mini webcómic',
66
+ title: 'Cada miembro del equipo tiene una escena, no solo una tarjeta.',
67
+ scenes: {
68
+ strategic: {
69
+ title: 'Planificación estratégica',
70
+ setting: 'Bob estudia un mapa del mundo e identifica regiones con logística de snacks prometedora.',
71
+ speech: ['Más idiomas.', 'Más humanos.', 'Más comida.'],
72
+ propLabel: 'mapa'
73
+ },
74
+ qa: {
75
+ title: 'Garantía de calidad',
76
+ setting: 'Una supervisora duerme sobre documentos etiquetados como extremadamente importantes hasta que el diseño se siente más calmado.',
77
+ speech: ['Este botón necesita calidez.', 'Además, necesito la silla.'],
78
+ propLabel: 'papeles'
79
+ },
80
+ implementation: {
81
+ title: 'Implementación',
82
+ setting: 'El humano escribe código mientras la junta aporta entradas inesperadas a través del teclado.',
83
+ speech: ['Súbelo.', 'No, espera. Acaríciame primero.'],
84
+ propLabel: 'teclado'
85
+ }
86
+ }
87
+ },
88
+ behindJoke: {
89
+ eyebrow: 'Detrás de la broma',
90
+ title: 'Las bromas son reales. El trabajo también.',
91
+ text: 'Detrás de GameBob hay un desarrollador en solitario diseñando, construyendo, traduciendo y manteniendo todo desde Mallorca. El objetivo es simple: crear herramientas que sean útiles, visuales, rápidas y agradables de usar.',
92
+ island: 'Mallorca'
93
+ },
94
+ humanTouch: {
95
+ eyebrow: 'Recurso humano',
96
+ title: 'El Humano',
97
+ textBefore: 'Bob decidió que la empatía debía ser parte de esta página porque "los humanos conectan con humanos". Así que ordenó crear esta sección y, como sabe que padecemos de déficit de atención, exigió llenarla de animaciones y luces ',
98
+ wordWithRagebait: 'vrillantes',
99
+ textAfter: '.',
100
+ ragebaitExplanation: 'Que todo el mundo se relaje: la "v" de vrillantes está puesta aposta. La junta felina asegura que señalar erratas aumenta las visitas un 400%.',
101
+ chipsLabel: 'Áreas del humano',
102
+ boardLabel: 'Ficha operativa del humano',
103
+ alert: 'FICHA HUMANA DE ALTA DOPAMINA',
104
+ portraitAlt: 'jjlmoya en una foto de perfil falsamente sexy',
105
+ poseLabel: 'Pose Obligada',
106
+ name: 'jjlmoya',
107
+ role: 'Frontend Developer',
108
+ bio: 'Transforma curiosidades, problemas y detalles cotidianos en herramientas, experiencias interactivas y sistemas que pueden crecer durante años.',
109
+ stats: [
110
+ ['Base', 'Mallorca, España'],
111
+ ['Rol', 'Developer'],
112
+ ['Experiencia', 'Más de una vida gatuna'],
113
+ ['Idiomas', 'ES · CA · EN']
114
+ ],
115
+ chips: [
116
+ 'Frontend',
117
+ 'Apps',
118
+ 'Webs',
119
+ 'Automatización',
120
+ 'Producto',
121
+ 'Interfaces',
122
+ 'Rendimiento',
123
+ 'Accesibilidad',
124
+ 'Privacidad',
125
+ 'Ideas útiles'
126
+ ],
127
+ stamp: '¡TOQUE HUMANO OBLIGATORIO!',
128
+ linksLabel: 'Enlaces profesionales',
129
+ partyPlayer: {
130
+ eyebrow: 'Audio laboratorio de Bob',
131
+ title: 'Tema fiestero aprobado por la junta',
132
+ text: 'Dale al play y el banner del recurso humano entra en modo celebración de emergencia.',
133
+ audioLabel: 'Reproducir tema fiestero de Bob',
134
+ playLabel: 'Reproducir tema fiestero de Bob',
135
+ pauseLabel: 'Pausar tema fiestero de Bob'
136
+ }
137
+ },
138
+ translationComic: {
139
+ eyebrow: 'El origen',
140
+ title: 'Cómo empezó todo',
141
+ spainFood: 'España significa comida.',
142
+ worldFood: 'El mundo significa más comida.',
143
+ humanAssignment: 'El humano entiende el encargo.',
144
+ languagesLabel: 'Marcadores de posición de idiomas compatibles',
145
+ text: 'El Plan Maestro de Bob para apoderarse de tu dinero empezó con una revelación sencilla: el dinero podía convertirse en comida. Desde entonces, nada volvió a ser operacionalmente seguro.',
146
+ quote: 'Más trabajo. Más dinero. Más comida.',
147
+ closing: 'El plan era simple. El humano sigue recuperándose.',
148
+ scenes: [
149
+ {
150
+ label: 'Mi gran error',
151
+ title: 'Bob descubrió el sistema.',
152
+ text: 'Un día cometí un error irreparable: le dejé ver cómo conseguía su comida. Ese día Bob lo empezó a entender todo.',
153
+ assetAlt: '',
154
+ formula: ['Dinero', 'Comida']
155
+ },
156
+ {
157
+ label: 'El sueño',
158
+ title: 'El estómago marcó el rumbo.',
159
+ text: 'Bob soñó día y noche sin parar y llegó a la conclusión de que si le gustaría tener muchísima más comida.',
160
+ assetAlt: '',
161
+ formula: ['Más dinero', 'Más comida']
162
+ },
163
+ {
164
+ label: 'El plan maestro',
165
+ title: 'Bob pensó en ingresos.',
166
+ text: 'Bob no se conformó con entender el sistema. Empezó a preguntarse cómo producir dinero de forma recurrente, preferiblemente sin mover una pata.',
167
+ assetAlt: '',
168
+ formula: ['Herramientas', 'Dinero']
169
+ },
170
+ {
171
+ label: 'Nace GameBob',
172
+ title: 'El humano recibió la orden.',
173
+ text: 'La orden fue sencilla: el humano construiría herramientas, juegos y páginas. Bob supervisaría la estrategia. La comida financiaría la visión.',
174
+ assetAlt: '',
175
+ formula: ['Más proyectos', 'Más comida']
176
+ }
177
+ ]
178
+ },
179
+ bobModelBook: {
180
+ eyebrow: 'Plan de emergencia',
181
+ logoPrefix: 'Only',
182
+ logoName: 'Bob',
183
+ text: 'Bob me obligó a crear esta sección porque, si todo lo demás falla, considera que su presencia puede ser una alternativa económicamente viable. Yo solo he implementado la orden.',
184
+ galleryLabel: 'Galería editorial de Bob',
185
+ unlockedAlt: 'Bob en gesto editorial',
186
+ lockedAlt: 'Gesto bloqueado de Bob',
187
+ openLabel: 'Abrir pose de Bob',
188
+ closeLabel: 'Cerrar pose de Bob',
189
+ premiumTitle: 'OnlyBob Premium',
190
+ premiumText: 'Bob ha decidido que estas poses son demasiado potentes para el scroll casual. El acceso completo se abrirá cuando el modelo de negocio le parezca emocionalmente maduro.',
191
+ buyLabel: 'Comprar acceso (aún no estoy desesperada)',
192
+ trialLabel: 'Prueba gratuita de 24 horas',
193
+ subscriptionLabel: 'Prueba OnlyBob activa',
194
+ subscriptionPrefix: '',
195
+ expiredLabel: 'Prueba caducada'
196
+ },
197
+ productManifesto: {
198
+ eyebrow: 'Filosofía de producto',
199
+ title: 'Alta calidad para alto beneficio.',
200
+ description: 'La gata ha leído cientos de manuales de SEO para optimizar cada pedazo de la página, lleva 5 libros de marketing digital y está empezando a leer sobre estoicismo. Estas son las reglas que me ha puesto para pasar el cribado y conseguir su sello de calidad.',
201
+ values: [
202
+ 'Útil',
203
+ 'Visual',
204
+ 'Rápido',
205
+ 'Divertido',
206
+ 'Único',
207
+ 'Privacidad',
208
+ 'Miau'
209
+ ]
210
+ },
211
+ memoryWall: {
212
+ eyebrow: 'Muro del recuerdo',
213
+ title: 'Para cada animal que sigue siendo parte de la historia.',
214
+ text: 'Esto se convertirá en un cálido archivo de fotos, fechas, pequeños rituales y recuerdos. Amable más que triste: un lugar para todos los que dejaron huellas, ruido, calor y caos de horarios a su paso.',
215
+ memories: {
216
+ m1: { name: 'Espacio de recuerdo 01', line: 'Un lugar pequeño para una gran personalidad.' },
217
+ m2: { name: 'Espacio de recuerdo 02', line: 'Siesta favorita, sonido favorito, pequeño hábito favorito.' },
218
+ m3: { name: 'Espacio de recuerdo 03', line: 'Una historia que merece su propio rincón cálido.' },
219
+ m4: { name: 'Espacio de recuerdo 04', line: 'Para cada animal que hizo de la casa un equipo.' }
220
+ }
221
+ },
222
+ supportTransition: {
223
+ eyebrow: 'La junta está abierta a',
224
+ title: 'Feedback.',
225
+ text: 'Ideas, informes de errores, correcciones de traducción y soporte del proyecto. La junta ejecutiva no puede prometer respuestas rápidas. Principalmente porque son gatos. El recurso humano seguirá leyendo todo con cuidado.',
226
+ linkText: 'Ir a Apóyanos',
227
+ comingSoonLabel: 'Próximamente',
228
+ inbox: {
229
+ ideas: 'ideas',
230
+ bugs: 'errores',
231
+ fixes: 'correcciones',
232
+ support: 'soporte'
233
+ }
234
+ },
235
+ teamRoster: {
236
+ eyebrow: 'Equipo actual',
237
+ title: 'Un estudio serio, supervisado por expertos poco serios.',
238
+ text: 'Este es el primer paso: Bob lidera la página hoy, y el resto del equipo tiene tarjetas de marcador de posición listas para recibir nombres, fotos, historias y títulos adecuadamente ridículos.',
239
+ members: {
240
+ bob: {
241
+ name: 'Bob',
242
+ role: 'Oficial Ejecutivo de Siestas',
243
+ bio: 'Gato negro, fundador del departamento de control de calidad silencioso y primer miembro del equipo GameBob.',
244
+ tag: 'Aprobación final: duerme sobre ello'
245
+ },
246
+ c2: {
247
+ name: 'Compañero gato 02',
248
+ role: 'Control de Calidad del Caos',
249
+ bio: 'Se especializa en clics inesperados, paseos por el teclado y en encontrar el único diseño que aún necesita amor.',
250
+ tag: 'Nombre pendiente'
251
+ },
252
+ c3: {
253
+ name: 'Compañero gato 03',
254
+ role: 'Diseñador de Confort',
255
+ bio: 'Mantiene el estudio suave, cálido y legalmente obligado a contener al menos un rincón acogedor.',
256
+ tag: 'Nombre pendiente'
257
+ },
258
+ c4: {
259
+ name: 'Compañero gato 04',
260
+ role: 'Interruptor de Enfoque',
261
+ bio: 'Proteges al proyecto del exceso de trabajo introduciendo descansos regulares en momentos inoportunos.',
262
+ tag: 'Nombre pendiente'
263
+ },
264
+ c5: {
265
+ name: 'Compañero gato 05',
266
+ role: 'Auditor de Snacks',
267
+ bio: 'Monitorea todas las decisiones relacionadas con la cocina y mantiene opiniones firmes sobre los cuencos vacíos.',
268
+ tag: 'Nombre pendiente'
269
+ },
270
+ jj: {
271
+ name: 'JJL Moya',
272
+ role: 'Desarrollador en Solitario',
273
+ bio: 'Construye los juegos, herramientas, textos, interfaces, sistemas y alguna que otra característica solicitada por una cola.',
274
+ tag: 'Departamento humano'
275
+ }
276
+ }
277
+ }
278
+ };