@zenithbuild/core 0.6.2 → 0.6.4

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 (112) hide show
  1. package/CORE_CONTRACT.md +145 -0
  2. package/README.md +14 -29
  3. package/bin/zenith.js +89 -0
  4. package/package.json +39 -56
  5. package/src/config.js +136 -0
  6. package/src/core-template.js +30 -0
  7. package/src/errors.js +54 -0
  8. package/src/guards.js +61 -0
  9. package/src/hash.js +52 -0
  10. package/src/index.js +26 -0
  11. package/src/ir/index.js +1 -0
  12. package/src/order.js +69 -0
  13. package/src/path.js +131 -0
  14. package/src/schema.js +28 -0
  15. package/src/version.js +67 -0
  16. package/bin/zen-build.ts +0 -2
  17. package/bin/zen-dev.ts +0 -2
  18. package/bin/zen-preview.ts +0 -2
  19. package/bin/zenith.ts +0 -2
  20. package/cli/commands/add.ts +0 -37
  21. package/cli/commands/build.ts +0 -37
  22. package/cli/commands/create.ts +0 -702
  23. package/cli/commands/dev.ts +0 -388
  24. package/cli/commands/index.ts +0 -112
  25. package/cli/commands/preview.ts +0 -62
  26. package/cli/commands/remove.ts +0 -33
  27. package/cli/index.ts +0 -10
  28. package/cli/main.ts +0 -101
  29. package/cli/utils/branding.ts +0 -178
  30. package/cli/utils/content.ts +0 -112
  31. package/cli/utils/logger.ts +0 -46
  32. package/cli/utils/plugin-manager.ts +0 -114
  33. package/cli/utils/project.ts +0 -77
  34. package/compiler/README.md +0 -380
  35. package/compiler/build-analyzer.ts +0 -122
  36. package/compiler/css/index.ts +0 -317
  37. package/compiler/discovery/componentDiscovery.ts +0 -178
  38. package/compiler/discovery/layouts.ts +0 -70
  39. package/compiler/errors/compilerError.ts +0 -56
  40. package/compiler/finalize/finalizeOutput.ts +0 -192
  41. package/compiler/finalize/generateFinalBundle.ts +0 -82
  42. package/compiler/index.ts +0 -83
  43. package/compiler/ir/types.ts +0 -174
  44. package/compiler/output/types.ts +0 -34
  45. package/compiler/parse/detectMapExpressions.ts +0 -102
  46. package/compiler/parse/importTypes.ts +0 -78
  47. package/compiler/parse/parseImports.ts +0 -309
  48. package/compiler/parse/parseScript.ts +0 -46
  49. package/compiler/parse/parseTemplate.ts +0 -599
  50. package/compiler/parse/parseZenFile.ts +0 -66
  51. package/compiler/parse/scriptAnalysis.ts +0 -91
  52. package/compiler/parse/trackLoopContext.ts +0 -82
  53. package/compiler/runtime/dataExposure.ts +0 -317
  54. package/compiler/runtime/generateDOM.ts +0 -246
  55. package/compiler/runtime/generateHydrationBundle.ts +0 -407
  56. package/compiler/runtime/hydration.ts +0 -309
  57. package/compiler/runtime/navigation.ts +0 -432
  58. package/compiler/runtime/thinRuntime.ts +0 -160
  59. package/compiler/runtime/transformIR.ts +0 -370
  60. package/compiler/runtime/wrapExpression.ts +0 -95
  61. package/compiler/runtime/wrapExpressionWithLoop.ts +0 -83
  62. package/compiler/spa-build.ts +0 -917
  63. package/compiler/ssg-build.ts +0 -422
  64. package/compiler/test/validate-test.ts +0 -104
  65. package/compiler/transform/classifyExpression.ts +0 -444
  66. package/compiler/transform/componentResolver.ts +0 -312
  67. package/compiler/transform/componentScriptTransformer.ts +0 -303
  68. package/compiler/transform/expressionTransformer.ts +0 -385
  69. package/compiler/transform/fragmentLowering.ts +0 -634
  70. package/compiler/transform/generateBindings.ts +0 -47
  71. package/compiler/transform/generateHTML.ts +0 -28
  72. package/compiler/transform/layoutProcessor.ts +0 -132
  73. package/compiler/transform/slotResolver.ts +0 -292
  74. package/compiler/transform/transformNode.ts +0 -126
  75. package/compiler/transform/transformTemplate.ts +0 -38
  76. package/compiler/validate/invariants.ts +0 -292
  77. package/compiler/validate/validateExpressions.ts +0 -168
  78. package/core/config/index.ts +0 -16
  79. package/core/config/loader.ts +0 -69
  80. package/core/config/types.ts +0 -89
  81. package/core/index.ts +0 -135
  82. package/core/lifecycle/index.ts +0 -49
  83. package/core/lifecycle/zen-mount.ts +0 -182
  84. package/core/lifecycle/zen-unmount.ts +0 -88
  85. package/core/plugins/index.ts +0 -7
  86. package/core/plugins/registry.ts +0 -81
  87. package/core/reactivity/index.ts +0 -54
  88. package/core/reactivity/tracking.ts +0 -167
  89. package/core/reactivity/zen-batch.ts +0 -57
  90. package/core/reactivity/zen-effect.ts +0 -139
  91. package/core/reactivity/zen-memo.ts +0 -146
  92. package/core/reactivity/zen-ref.ts +0 -52
  93. package/core/reactivity/zen-signal.ts +0 -121
  94. package/core/reactivity/zen-state.ts +0 -180
  95. package/core/reactivity/zen-untrack.ts +0 -44
  96. package/dist/cli.js +0 -11665
  97. package/dist/zen-build.js +0 -21172
  98. package/dist/zen-dev.js +0 -21172
  99. package/dist/zen-preview.js +0 -21172
  100. package/dist/zenith.js +0 -21172
  101. package/router/index.ts +0 -28
  102. package/router/manifest.ts +0 -314
  103. package/router/navigation/ZenLink.zen +0 -231
  104. package/router/navigation/index.ts +0 -78
  105. package/router/navigation/zen-link.ts +0 -584
  106. package/router/runtime.ts +0 -458
  107. package/router/types.ts +0 -168
  108. package/runtime/build.ts +0 -17
  109. package/runtime/bundle-generator.ts +0 -1247
  110. package/runtime/client-runtime.ts +0 -549
  111. package/runtime/serve.ts +0 -93
  112. package/tsconfig.json +0 -28
@@ -1,702 +0,0 @@
1
- /**
2
- * @zenithbuild/cli - Create Command
3
- *
4
- * Scaffolds a new Zenith application with interactive prompts,
5
- * branded visuals, and optional configuration generation.
6
- */
7
-
8
- import fs from 'fs'
9
- import path from 'path'
10
- import { execSync } from 'child_process'
11
- import readline from 'readline'
12
- import * as brand from '../utils/branding'
13
-
14
- // Types for project options
15
- interface ProjectOptions {
16
- name: string
17
- directory: 'app' | 'src'
18
- eslint: boolean
19
- prettier: boolean
20
- pathAlias: boolean
21
- }
22
-
23
- /**
24
- * Interactive readline prompt helper
25
- */
26
- async function prompt(question: string, defaultValue?: string): Promise<string> {
27
- const rl = readline.createInterface({
28
- input: process.stdin,
29
- output: process.stdout
30
- })
31
-
32
- const displayQuestion = defaultValue
33
- ? `${question} ${brand.dim(`(${defaultValue})`)}: `
34
- : `${question}: `
35
-
36
- return new Promise((resolve) => {
37
- rl.question(displayQuestion, (answer) => {
38
- rl.close()
39
- resolve(answer.trim() || defaultValue || '')
40
- })
41
- })
42
- }
43
-
44
- /**
45
- * Yes/No prompt helper
46
- */
47
- async function confirm(question: string, defaultYes: boolean = true): Promise<boolean> {
48
- const hint = defaultYes ? 'Y/n' : 'y/N'
49
- const answer = await prompt(`${question} ${brand.dim(`(${hint})`)}`)
50
-
51
- if (!answer) return defaultYes
52
- return answer.toLowerCase().startsWith('y')
53
- }
54
-
55
- /**
56
- * Main create command
57
- */
58
- export async function create(appName?: string): Promise<void> {
59
- // Show branded intro
60
- await brand.showIntro()
61
- brand.header('Create a new Zenith app')
62
-
63
- // Gather project options
64
- const options = await gatherOptions(appName)
65
-
66
- console.log('')
67
- const spinner = new brand.Spinner('Creating project structure...')
68
- spinner.start()
69
-
70
- try {
71
- // Create project
72
- await createProject(options)
73
- spinner.succeed('Project structure created')
74
-
75
- // Always generate configs (tsconfig.json is required)
76
- const configSpinner = new brand.Spinner('Generating configurations...')
77
- configSpinner.start()
78
- await generateConfigs(options)
79
- configSpinner.succeed('Configurations generated')
80
-
81
- // Install dependencies
82
- const installSpinner = new brand.Spinner('Installing dependencies...')
83
- installSpinner.start()
84
-
85
- const targetDir = path.resolve(process.cwd(), options.name)
86
- process.chdir(targetDir)
87
-
88
- try {
89
- execSync('bun install', { stdio: 'pipe' })
90
- installSpinner.succeed('Dependencies installed')
91
- } catch {
92
- try {
93
- execSync('npm install', { stdio: 'pipe' })
94
- installSpinner.succeed('Dependencies installed')
95
- } catch {
96
- installSpinner.fail('Could not install dependencies automatically')
97
- brand.warn('Run "bun install" or "npm install" manually')
98
- }
99
- }
100
-
101
- // Show success message
102
- brand.showNextSteps(options.name)
103
-
104
- } catch (err: unknown) {
105
- spinner.fail('Failed to create project')
106
- const message = err instanceof Error ? err.message : String(err)
107
- brand.error(message)
108
- process.exit(1)
109
- }
110
- }
111
-
112
- /**
113
- * Gather all project options through interactive prompts
114
- */
115
- async function gatherOptions(providedName?: string): Promise<ProjectOptions> {
116
- // Project name
117
- let name = providedName
118
- if (!name) {
119
- name = await prompt(brand.highlight('Project name'))
120
- if (!name) {
121
- brand.error('Project name is required')
122
- process.exit(1)
123
- }
124
- }
125
-
126
- const targetDir = path.resolve(process.cwd(), name)
127
- if (fs.existsSync(targetDir)) {
128
- brand.error(`Directory "${name}" already exists`)
129
- process.exit(1)
130
- }
131
-
132
- console.log('')
133
- brand.info(`Creating ${brand.bold(name)} in ${brand.dim(targetDir)}`)
134
- console.log('')
135
-
136
- // Directory structure
137
- const useSrc = await confirm('Use src/ directory instead of app/?', false)
138
- const directory = useSrc ? 'src' : 'app'
139
-
140
- // ESLint
141
- const eslint = await confirm('Add ESLint for code linting?', true)
142
-
143
- // Prettier
144
- const prettier = await confirm('Add Prettier for code formatting?', true)
145
-
146
- // TypeScript path aliases
147
- const pathAlias = await confirm('Add TypeScript path alias (@/*)?', true)
148
-
149
- return {
150
- name,
151
- directory,
152
- eslint,
153
- prettier,
154
- pathAlias
155
- }
156
- }
157
-
158
- /**
159
- * Create the project directory structure and files
160
- */
161
- async function createProject(options: ProjectOptions): Promise<void> {
162
- const targetDir = path.resolve(process.cwd(), options.name)
163
- const baseDir = options.directory
164
- const appDir = path.join(targetDir, baseDir)
165
-
166
- // Create directories
167
- fs.mkdirSync(targetDir, { recursive: true })
168
- fs.mkdirSync(path.join(appDir, 'pages'), { recursive: true })
169
- fs.mkdirSync(path.join(appDir, 'layouts'), { recursive: true })
170
- fs.mkdirSync(path.join(appDir, 'components'), { recursive: true })
171
- fs.mkdirSync(path.join(appDir, 'styles'), { recursive: true }) // Create styles inside appDir
172
-
173
- // package.json
174
- const pkg: Record<string, unknown> = {
175
- name: options.name,
176
- version: '0.1.0',
177
- private: true,
178
- type: 'module',
179
- scripts: {
180
- dev: 'zen-dev',
181
- build: 'zen-build',
182
- preview: 'zen-preview',
183
- test: 'bun test'
184
- },
185
- dependencies: {
186
- '@zenithbuild/core': '^0.1.0'
187
- },
188
- devDependencies: {
189
- '@types/bun': 'latest'
190
- } as Record<string, string>
191
- }
192
-
193
- // Add optional dev dependencies
194
- const devDeps = pkg.devDependencies as Record<string, string>
195
- if (options.eslint) {
196
- devDeps['eslint'] = '^8.0.0'
197
- devDeps['@typescript-eslint/eslint-plugin'] = '^6.0.0'
198
- devDeps['@typescript-eslint/parser'] = '^6.0.0'
199
- pkg.scripts = { ...(pkg.scripts as object), lint: 'eslint .' }
200
- }
201
- if (options.prettier) {
202
- devDeps['prettier'] = '^3.0.0'
203
- pkg.scripts = { ...(pkg.scripts as object), format: 'prettier --write .' }
204
- }
205
-
206
- fs.writeFileSync(
207
- path.join(targetDir, 'package.json'),
208
- JSON.stringify(pkg, null, 4)
209
- )
210
-
211
- // index.zen
212
- fs.writeFileSync(
213
- path.join(targetDir, baseDir, 'pages', 'index.zen'),
214
- generateIndexPage()
215
- )
216
-
217
- // DefaultLayout.zen
218
- fs.writeFileSync(
219
- path.join(targetDir, baseDir, 'layouts', 'DefaultLayout.zen'),
220
- generateDefaultLayout()
221
- )
222
-
223
- // global.css
224
- fs.writeFileSync(
225
- path.join(appDir, 'styles', 'global.css'),
226
- generateGlobalCSS()
227
- )
228
-
229
- // .gitignore
230
- fs.writeFileSync(
231
- path.join(targetDir, '.gitignore'),
232
- generateGitignore()
233
- )
234
- }
235
-
236
- /**
237
- * Generate configuration files based on options
238
- */
239
- async function generateConfigs(options: ProjectOptions): Promise<void> {
240
- const targetDir = path.resolve(process.cwd(), options.name)
241
-
242
- // tsconfig.json
243
- const tsconfig: Record<string, unknown> = {
244
- compilerOptions: {
245
- target: 'ESNext',
246
- module: 'ESNext',
247
- moduleResolution: 'bundler',
248
- strict: true,
249
- esModuleInterop: true,
250
- skipLibCheck: true,
251
- forceConsistentCasingInFileNames: true,
252
- resolveJsonModule: true,
253
- declaration: true,
254
- declarationMap: true,
255
- noEmit: true
256
- },
257
- include: [options.directory + '/**/*', '*.ts'],
258
- exclude: ['node_modules', 'dist']
259
- }
260
-
261
- if (options.pathAlias) {
262
- (tsconfig.compilerOptions as Record<string, unknown>).baseUrl = '.'
263
- ; (tsconfig.compilerOptions as Record<string, unknown>).paths = {
264
- '@/*': [`./${options.directory}/*`]
265
- }
266
- }
267
-
268
- fs.writeFileSync(
269
- path.join(targetDir, 'tsconfig.json'),
270
- JSON.stringify(tsconfig, null, 4)
271
- )
272
-
273
- // ESLint config
274
- if (options.eslint) {
275
- const eslintConfig = {
276
- root: true,
277
- parser: '@typescript-eslint/parser',
278
- plugins: ['@typescript-eslint'],
279
- extends: [
280
- 'eslint:recommended',
281
- 'plugin:@typescript-eslint/recommended'
282
- ],
283
- env: {
284
- browser: true,
285
- node: true,
286
- es2022: true
287
- },
288
- rules: {
289
- '@typescript-eslint/no-unused-vars': 'warn',
290
- '@typescript-eslint/no-explicit-any': 'warn'
291
- },
292
- ignorePatterns: ['dist', 'node_modules']
293
- }
294
-
295
- fs.writeFileSync(
296
- path.join(targetDir, '.eslintrc.json'),
297
- JSON.stringify(eslintConfig, null, 4)
298
- )
299
- }
300
-
301
- // Prettier config
302
- if (options.prettier) {
303
- const prettierConfig = {
304
- semi: false,
305
- singleQuote: true,
306
- tabWidth: 4,
307
- trailingComma: 'es5',
308
- printWidth: 100
309
- }
310
-
311
- fs.writeFileSync(
312
- path.join(targetDir, '.prettierrc'),
313
- JSON.stringify(prettierConfig, null, 4)
314
- )
315
-
316
- fs.writeFileSync(
317
- path.join(targetDir, '.prettierignore'),
318
- 'dist\nnode_modules\nbun.lock\n'
319
- )
320
- }
321
- }
322
-
323
- // Template generators
324
- function generateIndexPage(): string {
325
- return `<script setup="ts">
326
- state count = 0
327
-
328
- function increment() {
329
- count = count + 1
330
- }
331
-
332
- function decrement() {
333
- count = count - 1
334
- }
335
-
336
- zenOnMount(() => {
337
- console.log('🚀 Zenith app mounted!')
338
- })
339
- </script>
340
-
341
- <DefaultLayout title="Zenith App">
342
- <main>
343
- <div class="hero">
344
- <h1>Welcome to <span class="brand">Zenith</span></h1>
345
- <p class="tagline">The Modern Reactive Web Framework</p>
346
- </div>
347
-
348
- <div class="counter-card">
349
- <h2>Interactive Counter</h2>
350
- <p class="count">{count}</p>
351
- <div class="buttons">
352
- <button onclick="decrement" class="btn-secondary">−</button>
353
- <button onclick="increment" class="btn-primary">+</button>
354
- </div>
355
- </div>
356
-
357
- <div class="features">
358
- <div class="feature">
359
- <span class="icon">⚡</span>
360
- <h3>Reactive State</h3>
361
- <p>Built-in state management with automatic DOM updates</p>
362
- </div>
363
- <div class="feature">
364
- <span class="icon">🎯</span>
365
- <h3>Zero Config</h3>
366
- <p>Works immediately with no build step required</p>
367
- </div>
368
- <div class="feature">
369
- <span class="icon">🔥</span>
370
- <h3>Hot Reload</h3>
371
- <p>Instant updates during development</p>
372
- </div>
373
- </div>
374
- </div>
375
- </DefaultLayout>
376
-
377
- <style>
378
- main {
379
- max-width: 900px;
380
- margin: 0 auto;
381
- padding: 3rem 2rem;
382
- font-family: system-ui, -apple-system, sans-serif;
383
- background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
384
- color: #f1f5f9;
385
- min-height: 100vh;
386
- }
387
-
388
- .hero {
389
- text-align: center;
390
- margin-bottom: 3rem;
391
- }
392
-
393
- h1 {
394
- font-size: 3rem;
395
- font-weight: 700;
396
- margin-bottom: 0.5rem;
397
- }
398
-
399
- .brand {
400
- background: linear-gradient(135deg, #3b82f6, #06b6d4);
401
- -webkit-background-clip: text;
402
- -webkit-text-fill-color: transparent;
403
- background-clip: text;
404
- }
405
-
406
- .tagline {
407
- color: #94a3b8;
408
- font-size: 1.25rem;
409
- }
410
-
411
- .counter-card {
412
- background: rgba(255, 255, 255, 0.05);
413
- border: 1px solid rgba(255, 255, 255, 0.1);
414
- border-radius: 16px;
415
- padding: 2rem;
416
- text-align: center;
417
- margin-bottom: 3rem;
418
- }
419
-
420
- .counter-card h2 {
421
- color: #e2e8f0;
422
- margin-bottom: 1rem;
423
- }
424
-
425
- .count {
426
- font-size: 4rem;
427
- font-weight: 700;
428
- color: #3b82f6;
429
- margin: 1rem 0;
430
- }
431
-
432
- .buttons {
433
- display: flex;
434
- gap: 1rem;
435
- justify-content: center;
436
- }
437
-
438
- button {
439
- font-size: 1.5rem;
440
- width: 60px;
441
- height: 60px;
442
- border: none;
443
- border-radius: 12px;
444
- cursor: pointer;
445
- transition: all 0.2s ease;
446
- font-weight: 600;
447
- }
448
-
449
- .btn-primary {
450
- background: linear-gradient(135deg, #3b82f6, #2563eb);
451
- color: white;
452
- }
453
-
454
- .btn-primary:hover {
455
- transform: translateY(-2px);
456
- box-shadow: 0 8px 20px rgba(59, 130, 246, 0.4);
457
- }
458
-
459
- .btn-secondary {
460
- background: rgba(255, 255, 255, 0.1);
461
- color: #e2e8f0;
462
- }
463
-
464
- .btn-secondary:hover {
465
- background: rgba(255, 255, 255, 0.2);
466
- }
467
-
468
- .features {
469
- display: grid;
470
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
471
- gap: 1.5rem;
472
- }
473
-
474
- .feature {
475
- background: rgba(255, 255, 255, 0.03);
476
- border: 1px solid rgba(255, 255, 255, 0.06);
477
- border-radius: 12px;
478
- padding: 1.5rem;
479
- text-align: center;
480
- }
481
-
482
- .icon {
483
- font-size: 2rem;
484
- display: block;
485
- margin-bottom: 0.75rem;
486
- }
487
-
488
- .feature h3 {
489
- color: #e2e8f0;
490
- margin-bottom: 0.5rem;
491
- font-size: 1.1rem;
492
- }
493
-
494
- .feature p {
495
- color: #94a3b8;
496
- font-size: 0.9rem;
497
- line-height: 1.5;
498
- }
499
- </style>
500
- `
501
- }
502
-
503
- function generateDefaultLayout(): string {
504
- return `<script setup="ts">
505
- // interface Props { title?: string; lang?: string }
506
-
507
- zenEffect(() => {
508
- document.title = title || 'Zenith App'
509
- })
510
-
511
- zenOnMount(() => {
512
- console.log(\`[Layout] Mounted with title: \${title || 'Zenith App'}\`)
513
- })
514
- </script>
515
-
516
- <html lang={lang || 'en'}>
517
- <head>
518
- <meta charset="UTF-8">
519
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
520
- <link rel="stylesheet" href="/styles/global.css">
521
- </head>
522
- <body>
523
- <div class="layout">
524
- <header class="header">
525
- <nav class="nav">
526
- <a href="/" class="logo">⚡ Zenith</a>
527
- <div class="nav-links">
528
- <a href="/">Home</a>
529
- <a href="/docs">Docs</a>
530
- <a href="https://github.com/zenithbuild/zenith" target="_blank">GitHub</a>
531
- </div>
532
- </nav>
533
- </header>
534
-
535
- <main class="content">
536
- <slot />
537
- </main>
538
-
539
- <footer class="footer">
540
- <p>Built with ⚡ Zenith Framework</p>
541
- </footer>
542
- </div>
543
- </body>
544
- </html>
545
-
546
- <style>
547
- .layout {
548
- min-height: 100vh;
549
- display: flex;
550
- flex-direction: column;
551
- }
552
-
553
- .header {
554
- background: rgba(15, 23, 42, 0.95);
555
- backdrop-filter: blur(10px);
556
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
557
- position: sticky;
558
- top: 0;
559
- z-index: 100;
560
- }
561
-
562
- .nav {
563
- max-width: 1200px;
564
- margin: 0 auto;
565
- padding: 1rem 2rem;
566
- display: flex;
567
- justify-content: space-between;
568
- align-items: center;
569
- }
570
-
571
- .logo {
572
- font-size: 1.25rem;
573
- font-weight: 700;
574
- color: #3b82f6;
575
- text-decoration: none;
576
- }
577
-
578
- .nav-links {
579
- display: flex;
580
- gap: 2rem;
581
- }
582
-
583
- .nav-links a {
584
- color: #94a3b8;
585
- text-decoration: none;
586
- transition: color 0.2s;
587
- }
588
-
589
- .nav-links a:hover {
590
- color: #f1f5f9;
591
- }
592
-
593
- .content {
594
- flex: 1;
595
- }
596
-
597
- .footer {
598
- background: #0f172a;
599
- border-top: 1px solid rgba(255, 255, 255, 0.1);
600
- padding: 2rem;
601
- text-align: center;
602
- color: #64748b;
603
- }
604
- </style>
605
- `
606
- }
607
-
608
- function generateGlobalCSS(): string {
609
- return `/* Zenith Global Styles */
610
-
611
- /* CSS Reset */
612
- *, *::before, *::after {
613
- box-sizing: border-box;
614
- margin: 0;
615
- padding: 0;
616
- }
617
-
618
- html {
619
- font-size: 16px;
620
- -webkit-font-smoothing: antialiased;
621
- -moz-osx-font-smoothing: grayscale;
622
- }
623
-
624
- body {
625
- font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
626
- line-height: 1.6;
627
- background: #0f172a;
628
- color: #f1f5f9;
629
- }
630
-
631
- a {
632
- color: #3b82f6;
633
- text-decoration: none;
634
- }
635
-
636
- a:hover {
637
- text-decoration: underline;
638
- }
639
-
640
- img, video {
641
- max-width: 100%;
642
- height: auto;
643
- }
644
-
645
- button, input, select, textarea {
646
- font: inherit;
647
- }
648
-
649
- /* Utility Classes */
650
- .container {
651
- max-width: 1200px;
652
- margin: 0 auto;
653
- padding: 0 1rem;
654
- }
655
-
656
- .text-center { text-align: center; }
657
- .text-muted { color: #94a3b8; }
658
-
659
- /* Zenith Brand Colors */
660
- :root {
661
- --zen-primary: #3b82f6;
662
- --zen-secondary: #06b6d4;
663
- --zen-bg: #0f172a;
664
- --zen-surface: #1e293b;
665
- --zen-text: #f1f5f9;
666
- --zen-muted: #94a3b8;
667
- }
668
- `
669
- }
670
-
671
- function generateGitignore(): string {
672
- return `# Dependencies
673
- node_modules/
674
- bun.lock
675
-
676
- # Build output
677
- dist/
678
- .cache/
679
-
680
- # IDE
681
- .idea/
682
- .vscode/
683
- *.swp
684
- *.swo
685
-
686
- # OS
687
- .DS_Store
688
- Thumbs.db
689
-
690
- # Environment
691
- .env
692
- .env.local
693
- .env.*.local
694
-
695
- # Logs
696
- *.log
697
- npm-debug.log*
698
-
699
- # Testing
700
- coverage/
701
- `
702
- }