vibe-design-system 2.8.58 → 2.8.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/init.js CHANGED
@@ -278,8 +278,9 @@ export default config;
278
278
  // vite (default) & remix
279
279
  // For fullstack projects (client/src, frontend/src, etc.), add staticDirs for public assets
280
280
  const frontendDir = srcPrefix.split("/")[0]; // e.g. "client" from "client/src"
281
+ // Map public/ to "/" so components can load /images/... /figmaAssets/... etc. without prefix
281
282
  const staticDirsLine = srcPrefix !== "src"
282
- ? `\n staticDirs: [{ from: "../${frontendDir}/public", to: "/${frontendDir}" }],`
283
+ ? `\n staticDirs: ["../${frontendDir}/public"],`
283
284
  : "";
284
285
 
285
286
  return `import type { StorybookConfig } from "@storybook/react-vite";
@@ -487,6 +488,19 @@ function ensureVdsCore(projectRoot) {
487
488
  console.log("📦 vds-core/ hazır.");
488
489
  }
489
490
 
491
+ /**
492
+ * Computes a deterministic Storybook port based on the project root path.
493
+ * Each project gets a consistent unique port (6100–6899) so switching between
494
+ * projects doesn't cause "story not found" errors from stale browser URLs.
495
+ */
496
+ function computeProjectPort(projectRoot) {
497
+ let h = 5381;
498
+ for (let i = 0; i < projectRoot.length; i++) {
499
+ h = ((h << 5) + h + projectRoot.charCodeAt(i)) & 0x7fffffff;
500
+ }
501
+ return 6100 + (h % 800);
502
+ }
503
+
490
504
  // ADIM 4 — package.json scriptleri
491
505
  function addScripts(projectRoot) {
492
506
  const pkgPath = path.join(projectRoot, "package.json");
@@ -507,7 +521,8 @@ function addScripts(projectRoot) {
507
521
  changed = true;
508
522
  }
509
523
  if (!scripts.storybook) {
510
- scripts.storybook = "storybook dev -p 6006";
524
+ const sbPort = computeProjectPort(projectRoot);
525
+ scripts.storybook = `storybook dev -p ${sbPort}`;
511
526
  changed = true;
512
527
  }
513
528
  if (!scripts["build-storybook"]) {
@@ -713,13 +728,15 @@ runSetupStorybookProviders(projectRoot);
713
728
  runStorybookAdapt(projectRoot);
714
729
 
715
730
  // ADIM 8
731
+ const _finalPort = computeProjectPort(projectRoot);
716
732
  console.log("\n✅ VDS kuruldu!");
733
+ console.log(`→ Storybook: http://localhost:${_finalPort}`);
717
734
  console.log("→ npm run vds:stories — tarama + story + provider (tek komut)");
718
735
  console.log("→ npm run vds:watch — otomatik güncelleme (watch modu)");
719
736
  console.log("\nNot: Storybook başlarken (Node 24+) DEP0190 uyarısı çıkarsa Storybook kaynaklıdır, güvenle yok sayabilirsiniz.\n");
720
737
 
721
738
  // ADIM 10 — Storybook'u otomatik başlat
722
- console.log("🚀 Storybook başlatılıyor → http://localhost:6006\n");
739
+ console.log(`🚀 Storybook başlatılıyor → http://localhost:${_finalPort}\n`);
723
740
  const sbProc = spawn("npm", ["run", "storybook"], {
724
741
  stdio: "inherit",
725
742
  cwd: projectRoot,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-design-system",
3
- "version": "2.8.58",
3
+ "version": "2.8.61",
4
4
  "description": "Auto-generate design systems for vibe coding projects",
5
5
  "homepage": "https://vibedesign.tech",
6
6
  "repository": {
@@ -2143,7 +2143,7 @@ function writeFoundationsStories(foundations) {
2143
2143
  "",
2144
2144
  "export const Default: Story = {",
2145
2145
  " render: () => (",
2146
- " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, background: \"#f8fafc\", minHeight: 500 }}>",
2146
+ " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, background: \"#fff\", minHeight: 500, color: \"#111\" }}>",
2147
2147
  " <h2 style={{ fontSize: 20, fontWeight: 700, margin: \"0 0 4px\", color: \"#111\" }}>Colors</h2>",
2148
2148
  " <p style={{ fontSize: 13, color: \"#888\", margin: \"0 0 40px\" }}>Design tokens defined in CSS variables — grouped by role</p>",
2149
2149
  "",
@@ -2262,7 +2262,7 @@ function writeFoundationsStories(foundations) {
2262
2262
  "",
2263
2263
  "export const Default: Story = {",
2264
2264
  " render: () => (",
2265
- " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 860, color: \"#111\" }}>",
2265
+ " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 860, color: \"#111\", background: \"#fff\", minHeight: \"100vh\" }}>",
2266
2266
  " <h2 style={{ fontSize: 20, fontWeight: 700, margin: \"0 0 4px\" }}>Typography</h2>",
2267
2267
  " <p style={{ fontSize: 13, color: \"#888\", margin: \"0 0 32px\" }}>Type scale, font families, and weights</p>",
2268
2268
  "",
@@ -2365,8 +2365,47 @@ function writeFoundationsStories(foundations) {
2365
2365
  console.log("[VDS] Wrote " + path.relative(PROJECT_ROOT, path.join(foundationsDir, "Typography.stories.tsx")));
2366
2366
  }
2367
2367
 
2368
+ // Collect brand assets: prefer scan data, fallback to scanning public/ directories
2368
2369
  const brandAssets = foundations?.brand?.assets;
2369
- const assets = Array.isArray(brandAssets) ? brandAssets : [];
2370
+ let assets = Array.isArray(brandAssets) ? brandAssets : [];
2371
+
2372
+ // Also scan public/ dirs directly — scan.mjs may miss most project image assets
2373
+ {
2374
+ const publicDirs = [
2375
+ path.join(PROJECT_ROOT, "public"),
2376
+ path.join(PROJECT_ROOT, "client", "public"),
2377
+ path.join(PROJECT_ROOT, "frontend", "public"),
2378
+ path.join(PROJECT_ROOT, "src", "assets"),
2379
+ path.join(PROJECT_ROOT, "client", "src", "assets"),
2380
+ ];
2381
+ const IMAGE_EXT = /\.(svg|png|jpg|jpeg|webp|gif)$/i;
2382
+ const existingUrls = new Set(assets.map((a) => a.url || a.path || ""));
2383
+
2384
+ for (const pubDir of publicDirs) {
2385
+ if (!fs.existsSync(pubDir)) continue;
2386
+ const newAssets = [];
2387
+ const scanDir = (dir, baseUrl) => {
2388
+ let entries;
2389
+ try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
2390
+ for (const e of entries) {
2391
+ const urlPath = baseUrl + "/" + e.name;
2392
+ if (e.isDirectory()) {
2393
+ scanDir(path.join(dir, e.name), urlPath);
2394
+ } else if (IMAGE_EXT.test(e.name) && !existingUrls.has(urlPath)) {
2395
+ newAssets.push({ name: e.name.replace(/\.[^.]+$/, ""), url: urlPath });
2396
+ }
2397
+ }
2398
+ };
2399
+ scanDir(pubDir, "");
2400
+ if (newAssets.length > 0) {
2401
+ assets = [...assets, ...newAssets];
2402
+ break; // Use first matching public dir only
2403
+ }
2404
+ }
2405
+ // Limit to 40 assets to keep story file size reasonable
2406
+ assets = assets.slice(0, 40);
2407
+ }
2408
+
2370
2409
  const brandContent =
2371
2410
  [
2372
2411
  "import type { Meta, StoryObj } from \"@storybook/react\";",
@@ -2379,11 +2418,11 @@ function writeFoundationsStories(foundations) {
2379
2418
  "",
2380
2419
  "export const Default: Story = {",
2381
2420
  " render: () => (",
2382
- " <div style={{ display: \"flex\", gap: 24, flexWrap: \"wrap\", padding: 24 }}>",
2383
- " {assets.length === 0 ? <p>No brand assets found.</p> : assets.map((a, i) => (",
2384
- " <div key={i} style={{ textAlign: \"center\" }}>",
2385
- " <img src={\"/\" + String(a.path || \"\").replace(\"public/\", \"\")} style={{ maxHeight: 100, maxWidth: 200, objectFit: \"contain\" }} alt={a.name || \"\"} />",
2386
- " <div style={{ fontSize: 11, marginTop: 8, color: \"#666\" }}>{a.name || a.type || \"asset\"}</div>",
2421
+ " <div style={{ display: \"flex\", gap: 24, flexWrap: \"wrap\", padding: 32, background: \"#fff\", minHeight: \"100vh\" }}>",
2422
+ " {assets.length === 0 ? <p style={{ color: '#888', fontFamily: 'monospace' }}>No brand assets found — add images to public/ or client/public/</p> : assets.map((a, i) => (",
2423
+ " <div key={i} style={{ textAlign: \"center\", background: '#f8f8f8', borderRadius: 8, padding: 12, minWidth: 120 }}>",
2424
+ " <img src={a.url || (\"/\" + String(a.path || \"\").replace(/^public\\//, \"\"))} style={{ maxHeight: 100, maxWidth: 180, objectFit: \"contain\", display: 'block', margin: '0 auto' }} alt={a.name || \"\"} />",
2425
+ " <div style={{ fontSize: 11, marginTop: 8, color: \"#666\", wordBreak: 'break-all' }}>{a.name || a.type || \"asset\"}</div>",
2387
2426
  " </div>",
2388
2427
  " ))}",
2389
2428
  " </div>",
@@ -2436,33 +2475,33 @@ function writeFoundationsStories(foundations) {
2436
2475
  " title={`Click to copy: ${d.name}`}",
2437
2476
  " style={{",
2438
2477
  " display: \"flex\", flexDirection: \"column\", gap: 10, padding: 14,",
2439
- " border: `1px solid ${isCopied ? \"#4ade80\" : \"#1e293b\"}`,",
2478
+ " border: `1px solid ${isCopied ? \"#16a34a\" : \"#e5e7eb\"}`,",
2440
2479
  " borderRadius: 10,",
2441
- " background: isCopied ? \"#052e16\" : \"#0f172a\",",
2480
+ " background: isCopied ? \"#f0fdf4\" : \"#f9fafb\",",
2442
2481
  " cursor: \"pointer\",",
2443
2482
  " opacity: faded ? 0.4 : 1,",
2444
2483
  " transition: \"border-color 0.15s, background 0.15s\",",
2445
2484
  " }}",
2446
2485
  " >",
2447
2486
  " <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>",
2448
- " <div style={{ padding: 8, background: \"#1e293b\", borderRadius: 8, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>",
2449
- " <Icon size={22} strokeWidth={1.75} color=\"#94a3b8\" />",
2487
+ " <div style={{ padding: 8, background: \"#f3f4f6\", borderRadius: 8, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>",
2488
+ " <Icon size={22} strokeWidth={1.75} color=\"#374151\" />",
2450
2489
  " </div>",
2451
2490
  " {d.total > 0 && (",
2452
- " <span style={{ fontSize: 11, fontWeight: 600, background: \"#1e293b\",",
2453
- " color: \"#94a3b8\", padding: \"2px 7px\", borderRadius: 999, alignSelf: \"flex-start\" }}>",
2491
+ " <span style={{ fontSize: 11, fontWeight: 600, background: \"#e5e7eb\",",
2492
+ " color: \"#374151\", padding: \"2px 7px\", borderRadius: 999, alignSelf: \"flex-start\" }}>",
2454
2493
  " ×{d.total}",
2455
2494
  " </span>",
2456
2495
  " )}",
2457
2496
  " </div>",
2458
- " <span style={{ fontSize: 12, fontWeight: 500, color: isCopied ? \"#4ade80\" : \"#e2e8f0\" }}>",
2497
+ " <span style={{ fontSize: 12, fontWeight: 500, color: isCopied ? \"#16a34a\" : \"#111827\" }}>",
2459
2498
  " {isCopied ? \"Copied!\" : d.name}",
2460
2499
  " </span>",
2461
2500
  " {d.topFiles.length > 0 && (",
2462
2501
  " <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 4 }}>",
2463
2502
  " {d.topFiles.map((f) => (",
2464
- " <span key={f} style={{ fontSize: 10, background: \"#1e293b\", color: \"#64748b\",",
2465
- " padding: \"1px 6px\", borderRadius: 4 }}>{f}</span>",
2503
+ " <span key={f} style={{ fontSize: 10, background: \"#e8f0fe\", color: \"#1e40af\",",
2504
+ " padding: \"1px 6px\", borderRadius: 4, fontFamily: \"monospace\" }}>{f}</span>",
2466
2505
  " ))}",
2467
2506
  " </div>",
2468
2507
  " )}",
@@ -2470,18 +2509,19 @@ function writeFoundationsStories(foundations) {
2470
2509
  " );",
2471
2510
  " };",
2472
2511
  " return (",
2473
- " <div style={{ padding: 24, fontFamily: \"sans-serif\" }}>",
2512
+ " <div style={{ padding: 32, fontFamily: \"system-ui,sans-serif\", background: \"#fff\", minHeight: \"100vh\", color: \"#111\" }}>",
2513
+ " <h2 style={{ fontSize: 20, fontWeight: 700, margin: \"0 0 4px\" }}>Icons</h2>",
2474
2514
  " <div style={{ marginBottom: 24 }}>",
2475
- " <p style={{ margin: 0, marginBottom: 4, fontSize: 14, color: \"#94a3b8\" }}>",
2476
- " {iconData.length} icons imported from <code style={{ fontSize: 12 }}>lucide-react</code> in app code.",
2515
+ " <p style={{ margin: 0, marginBottom: 4, fontSize: 13, color: \"#6b7280\" }}>",
2516
+ " {iconData.length} icons imported from <code style={{ fontSize: 12, background: \"#f3f4f6\", padding: \"1px 5px\", borderRadius: 4 }}>lucide-react</code> in app code.",
2477
2517
  " </p>",
2478
- " <p style={{ margin: 0, fontSize: 12, color: \"#475569\" }}>",
2518
+ " <p style={{ margin: 0, fontSize: 12, color: \"#9ca3af\" }}>",
2479
2519
  " Sorted by usage frequency · Badge = total JSX usages · Click any card to copy the icon name.",
2480
2520
  " </p>",
2481
2521
  " </div>",
2482
2522
  " {usedIcons.length > 0 && (",
2483
2523
  " <>",
2484
- " <p style={{ margin: \"0 0 12px\", fontSize: 12, fontWeight: 600, color: \"#64748b\",",
2524
+ " <p style={{ margin: \"0 0 12px\", fontSize: 12, fontWeight: 600, color: \"#374151\",",
2485
2525
  " textTransform: \"uppercase\", letterSpacing: \"0.06em\" }}>",
2486
2526
  " Active — {usedIcons.length}",
2487
2527
  " </p>",
@@ -2493,7 +2533,7 @@ function writeFoundationsStories(foundations) {
2493
2533
  " )}",
2494
2534
  " {unusedIcons.length > 0 && (",
2495
2535
  " <>",
2496
- " <p style={{ margin: \"0 0 12px\", fontSize: 12, fontWeight: 600, color: \"#334155\",",
2536
+ " <p style={{ margin: \"0 0 12px\", fontSize: 12, fontWeight: 600, color: \"#9ca3af\",",
2497
2537
  " textTransform: \"uppercase\", letterSpacing: \"0.06em\" }}>",
2498
2538
  " Imported, not used in JSX — {unusedIcons.length}",
2499
2539
  " </p>",
@@ -2548,7 +2588,7 @@ function writeFoundationsStories(foundations) {
2548
2588
  " const gapEntries = Object.entries(gridSystem.gaps || {});",
2549
2589
  " const maxWEntries = Object.entries(gridSystem.maxWidths || {});",
2550
2590
  " const chip = (label: string) => (",
2551
- " <span key={label} style={{ fontSize: 10, background: \"#1e293b\", color: \"#64748b\", padding: \"1px 6px\", borderRadius: 4 }}>{label}</span>",
2591
+ " <span key={label} style={{ fontSize: 10, background: \"#e8f0fe\", color: \"#1e40af\", padding: \"1px 6px\", borderRadius: 4, fontFamily: \"monospace\" }}>{label}</span>",
2552
2592
  " );",
2553
2593
  " const renderColPreview = (colVal: string) => {",
2554
2594
  " const n = parseInt(colVal, 10);",
@@ -2556,7 +2596,7 @@ function writeFoundationsStories(foundations) {
2556
2596
  " return (",
2557
2597
  " <div style={{ display: \"grid\", gridTemplateColumns: `repeat(${n}, 1fr)`, gap: 2, marginBottom: 8 }}>",
2558
2598
  " {Array.from({ length: n }).map((_, i) => (",
2559
- " <div key={i} style={{ height: 20, borderRadius: 3, background: \"#1e3a5f\" }} />",
2599
+ " <div key={i} style={{ height: 20, borderRadius: 3, background: \"#3b82f6\" }} />",
2560
2600
  " ))}",
2561
2601
  " </div>",
2562
2602
  " );",
@@ -2568,7 +2608,7 @@ function writeFoundationsStories(foundations) {
2568
2608
  " );",
2569
2609
  " };",
2570
2610
  " return (",
2571
- " <div style={{ padding: 24, fontFamily: \"sans-serif\", maxWidth: 900 }}>",
2611
+ " <div style={{ padding: 24, fontFamily: \"sans-serif\", maxWidth: 900, background: \"#fff\", minHeight: \"100vh\", color: \"#111\" }}>",
2572
2612
  "",
2573
2613
  " {/* ── Breakpoints ── */}",
2574
2614
  " <section style={{ marginBottom: 40 }}>",
@@ -2668,7 +2708,7 @@ function writeFoundationsStories(foundations) {
2668
2708
  " <span key={val} style={{ display: \"flex\", alignItems: \"center\", gap: 6,",
2669
2709
  " background: \"#0a0f1a\", border: \"1px solid #1e293b\", borderRadius: 6, padding: \"5px 10px\", fontSize: 12 }}>",
2670
2710
  " <code style={{ color: \"#67e8f9\" }}>gap-{val}</code>",
2671
- " <span style={{ color: \"#475569\", fontSize: 11 }}>×{data.count}</span>",
2711
+ " <span style={{ color: \"#374151\", fontSize: 11 }}>×{data.count}</span>",
2672
2712
  " </span>",
2673
2713
  " ))}",
2674
2714
  " </div>",
@@ -2724,7 +2764,7 @@ function writeFoundationsStories(foundations) {
2724
2764
  "",
2725
2765
  "export const Default: Story = {",
2726
2766
  " render: () => (",
2727
- " <div style={{ padding: 24, fontFamily: \"system-ui, sans-serif\" }}>",
2767
+ " <div style={{ padding: 32, fontFamily: \"system-ui, sans-serif\", background: \"#fff\", minHeight: \"100vh\", color: \"#111\" }}>",
2728
2768
  " <h2 style={{ marginBottom: 8 }}>Used Button variants in app code</h2>",
2729
2769
  " <p style={{ marginBottom: 16, color: \"#888\", fontSize: 13 }}>Based on &lt;Button ... /&gt; usages in src/ (ignores lowercase &lt;button&gt;).</p>",
2730
2770
  " <table style={{ borderCollapse: \"collapse\", width: \"100%\", fontSize: 13 }}>",
@@ -2801,7 +2841,7 @@ function writeFoundationsStories(foundations) {
2801
2841
  "",
2802
2842
  "export const Default: Story = {",
2803
2843
  " render: () => (",
2804
- " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 760, color: \"#111\" }}>",
2844
+ " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 760, color: \"#111\", background: \"#fff\", minHeight: \"100vh\" }}>",
2805
2845
  " <h2 style={{ fontSize: 20, fontWeight: 700, margin: \"0 0 4px\" }}>Spacing Scale</h2>",
2806
2846
  " <p style={{ fontSize: 13, color: \"#888\", margin: \"0 0 24px\" }}>Base unit: 0.25rem = 4px · built on an 8px grid system</p>",
2807
2847
  " {usedSpacing.length > 0 && (",
@@ -2911,7 +2951,7 @@ function writeFoundationsStories(foundations) {
2911
2951
  "",
2912
2952
  "export const Default: Story = {",
2913
2953
  " render: () => (",
2914
- " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, background: \"#f1f5f9\", minHeight: 400 }}>",
2954
+ " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, background: \"#fff\", minHeight: \"100vh\", color: \"#111\" }}>",
2915
2955
  " <h2 style={{ fontSize: 20, fontWeight: 700, margin: \"0 0 4px\", color: \"#111\" }}>Elevation & Shadows</h2>",
2916
2956
  " <p style={{ fontSize: 13, color: \"#888\", margin: \"0 0 32px\" }}>Depth is communicated through layered shadow levels</p>",
2917
2957
  " <h3 style={{ fontSize: 15, fontWeight: 600, margin: \"0 0 14px\", color: \"#374151\" }}>Shadow Scale</h3>",
@@ -3029,7 +3069,7 @@ function writeFoundationsStories(foundations) {
3029
3069
  "",
3030
3070
  "export const Default: Story = {",
3031
3071
  " render: () => (",
3032
- " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 800 }}>",
3072
+ " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 800, background: \"#fff\", minHeight: \"100vh\", color: \"#111\" }}>",
3033
3073
  " <h2 style={{ fontSize: 20, fontWeight: 700, margin: \"0 0 4px\" }}>Border & Radius</h2>",
3034
3074
  " <p style={{ fontSize: 13, color: \"#888\", margin: \"0 0 32px\" }}>Corner radius scale — from sharp edges to fully rounded</p>",
3035
3075
  " {usedRadius.length > 0 && (",
@@ -3135,7 +3175,7 @@ function writeFoundationsStories(foundations) {
3135
3175
  "",
3136
3176
  "export const Default: Story = {",
3137
3177
  " render: () => (",
3138
- " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 700, color: \"#111\" }}>",
3178
+ " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, maxWidth: 700, color: \"#111\", background: \"#fff\", minHeight: \"100vh\" }}>",
3139
3179
  " <h2 style={{ fontSize: 20, fontWeight: 700, margin: \"0 0 4px\" }}>Motion & Interaction</h2>",
3140
3180
  " <p style={{ fontSize: 13, color: \"#888\", margin: \"0 0 32px\" }}>Consistent timing and easing for smooth, intentional motion</p>",
3141
3181
  " {usedAnimations.length > 0 && (",
@@ -3265,7 +3305,7 @@ function writeComponentSuggestionsStory(componentSuggestions) {
3265
3305
  "",
3266
3306
  "export const Default: Story = {",
3267
3307
  " render: () => (",
3268
- " <div style={{ padding: 32, fontFamily: 'system-ui, sans-serif', background: '#f7fafc', minHeight: '100vh' }}>",
3308
+ " <div style={{ padding: 32, fontFamily: 'system-ui, sans-serif', background: '#fff', minHeight: '100vh', color: '#111' }}>",
3269
3309
  " <h2 style={{ marginBottom: 8, fontSize: 24, fontWeight: 700, color: '#1a202c' }}>Component Suggestions</h2>",
3270
3310
  " <p style={{ color: '#718096', marginBottom: 32, fontSize: 14 }}>Bu pattern'ler birden fazla dosyada tekrar ediyor. Her biri ayrı bir component olabilir. <strong>Copy Prompt</strong> butonuna tıklayıp Cursor veya Superflex'e yapıştır.</p>",
3271
3311
  " <div style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>",
@@ -3295,7 +3335,7 @@ function writeChangelogStory(changelog) {
3295
3335
  "",
3296
3336
  "export const Default: Story = {",
3297
3337
  " render: () => (",
3298
- " <div style={{ fontFamily: \"monospace\", padding: 24 }}>",
3338
+ " <div style={{ fontFamily: \"system-ui,sans-serif\", padding: 32, background: \"#fff\", minHeight: \"100vh\", color: \"#111\" }}>",
3299
3339
  " <h2>CHANGELOG</h2>",
3300
3340
  " {changelog.length === 0 ? <p>No changes recorded yet.</p> : changelog.map((entry) => (",
3301
3341
  " <div key={entry.version}>",