[{"data":1,"prerenderedAt":2048},["ShallowReactive",2],{"post-blog-tech-stack":3},{"id":4,"title":5,"body":6,"date":2037,"description":2038,"extension":2039,"meta":2040,"navigation":243,"path":2044,"seo":2045,"stem":2046,"__hash__":2047},"blog\u002Fblog\u002Fblog-tech-stack.md","個人ブログを支える技術",{"type":7,"value":8,"toc":2011},"minimark",[9,13,17,20,23,26,32,48,53,67,72,92,97,135,139,149,152,188,192,199,415,418,421,523,526,530,533,662,665,668,675,678,698,701,704,907,910,913,919,938,948,952,958,1011,1014,1018,1021,1026,1278,1281,1285,1288,1302,1617,1620,1622,1628,1660,1663,1726,1729,1736,1739,1771,1775,1783,1789,1815,1851,1854,1857,1860,1885,1889,1898,1901,1926,1929,1936,1961,1967,1970,1973,1976,2001,2004,2007],[10,11,12],"h2",{"id":12},"個人ブログを始めました",[14,15,16],"p",{},"これまで Zenn などのプラットフォームで記事を書いてきましたが、自分のドメインで自由に発信できる場所が欲しくなり、このブログを立ち上げました。",[14,18,19],{},"せっかくなので、このブログを支える技術スタックについて紹介します。",[10,21,22],{"id":22},"全体構成",[14,24,25],{},"このブログは以下の技術で構築されています",[14,27,28],{},[29,30,31],"strong",{},"コア技術",[33,34,35,42],"ul",{},[36,37,38,41],"li",{},[29,39,40],{},"Astro 5"," - 超高速な静的サイトジェネレーター",[36,43,44,47],{},[29,45,46],{},"TypeScript"," - 型安全な開発環境",[14,49,50],{},[29,51,52],{},"コンテンツ管理",[33,54,55,61],{},[36,56,57,60],{},[29,58,59],{},"Content Collections"," - Zodによる型安全なMarkdown管理",[36,62,63,66],{},[29,64,65],{},"@astrojs\u002Fmdx"," - MDX形式のサポート",[14,68,69],{},[29,70,71],{},"スタイリング",[33,73,74,80,86],{},[36,75,76,79],{},[29,77,78],{},"Tailwind CSS v4"," - ユーティリティファーストCSS",[36,81,82,85],{},[29,83,84],{},"@tailwindcss\u002Ftypography"," - 記事本文の美しいタイポグラフィ",[36,87,88,91],{},[29,89,90],{},"CSS変数"," - ダークモード対応のテーマシステム",[14,93,94],{},[29,95,96],{},"その他",[33,98,99,105,111,117,123,129],{},[36,100,101,104],{},[29,102,103],{},"astro-icon"," - Iconifyベースのアイコンシステム",[36,106,107,110],{},[29,108,109],{},"@astrojs\u002Fsitemap"," - SEO最適化",[36,112,113,116],{},[29,114,115],{},"@astrojs\u002Frss"," - RSSフィード生成",[36,118,119,122],{},[29,120,121],{},"textlint"," - 日本語文章の品質チェック",[36,124,125,128],{},[29,126,127],{},"satori + sharp"," - 動的OGP画像生成",[36,130,131,134],{},[29,132,133],{},"wrangler"," - Cloudflare Workersへのデプロイ",[10,136,138],{"id":137},"astro-5-content-collections","Astro 5 + Content Collections",[14,140,141,142,148],{},"フレームワークとして ",[143,144,40],"a",{"href":145,"rel":146},"https:\u002F\u002Fastro.build",[147],"nofollow"," を採用しています。",[14,150,151],{},"Astro を選んだ理由は以下のとおりです",[33,153,154,160,171,176,182],{},[36,155,156,159],{},[29,157,158],{},"超高速"," - デフォルトでゼロJavaScript、必要な部分だけクライアントサイドJS",[36,161,162,165,166,170],{},[29,163,164],{},"ファイルベースルーティング"," - ",[167,168,169],"code",{},"pages\u002F"," ディレクトリで直感的にルーティングを構築",[36,172,173,175],{},[29,174,59],{}," - 型安全なMarkdown\u002FMDX管理",[36,177,178,181],{},[29,179,180],{},"柔軟性"," - 必要に応じてReact、Vue、Svelteなどを組み合わせ可能",[36,183,184,187],{},[29,185,186],{},"優れたDX"," - TypeScript完全サポート、高速なHMR",[189,190,59],"h3",{"id":191},"content-collections",[14,193,194,195,198],{},"ブログ記事は ",[167,196,197],{},"src\u002Fcontent\u002Fblog\u002F"," ディレクトリで管理しています。Content Collections は Markdown ファイルを型安全に扱えるコンテンツ管理システムです。",[200,201,206],"pre",{"className":202,"code":203,"language":204,"meta":205,"style":205},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F src\u002Fcontent\u002Fconfig.ts\nimport { defineCollection, z } from 'astro:content';\n\nconst blogCollection = defineCollection({\n  type: 'content',\n  schema: z.object({\n    title: z.string(),\n    description: z.string(),\n    date: z.string().transform((str) => new Date(str)),\n    tags: z.array(z.string()).default([]),\n  }),\n});\n\nexport const collections = {\n  blog: blogCollection,\n};\n","typescript","",[167,207,208,217,238,245,265,277,288,300,310,346,369,375,381,386,403,409],{"__ignoreMap":205},[209,210,213],"span",{"class":211,"line":212},"line",1,[209,214,216],{"class":215},"sJ8bj","\u002F\u002F src\u002Fcontent\u002Fconfig.ts\n",[209,218,220,224,228,231,235],{"class":211,"line":219},2,[209,221,223],{"class":222},"szBVR","import",[209,225,227],{"class":226},"sVt8B"," { defineCollection, z } ",[209,229,230],{"class":222},"from",[209,232,234],{"class":233},"sZZnC"," 'astro:content'",[209,236,237],{"class":226},";\n",[209,239,241],{"class":211,"line":240},3,[209,242,244],{"emptyLinePlaceholder":243},true,"\n",[209,246,248,251,255,258,262],{"class":211,"line":247},4,[209,249,250],{"class":222},"const",[209,252,254],{"class":253},"sj4cs"," blogCollection",[209,256,257],{"class":222}," =",[209,259,261],{"class":260},"sScJk"," defineCollection",[209,263,264],{"class":226},"({\n",[209,266,268,271,274],{"class":211,"line":267},5,[209,269,270],{"class":226},"  type: ",[209,272,273],{"class":233},"'content'",[209,275,276],{"class":226},",\n",[209,278,280,283,286],{"class":211,"line":279},6,[209,281,282],{"class":226},"  schema: z.",[209,284,285],{"class":260},"object",[209,287,264],{"class":226},[209,289,291,294,297],{"class":211,"line":290},7,[209,292,293],{"class":226},"    title: z.",[209,295,296],{"class":260},"string",[209,298,299],{"class":226},"(),\n",[209,301,303,306,308],{"class":211,"line":302},8,[209,304,305],{"class":226},"    description: z.",[209,307,296],{"class":260},[209,309,299],{"class":226},[209,311,313,316,318,321,324,327,331,334,337,340,343],{"class":211,"line":312},9,[209,314,315],{"class":226},"    date: z.",[209,317,296],{"class":260},[209,319,320],{"class":226},"().",[209,322,323],{"class":260},"transform",[209,325,326],{"class":226},"((",[209,328,330],{"class":329},"s4XuR","str",[209,332,333],{"class":226},") ",[209,335,336],{"class":222},"=>",[209,338,339],{"class":222}," new",[209,341,342],{"class":260}," Date",[209,344,345],{"class":226},"(str)),\n",[209,347,349,352,355,358,360,363,366],{"class":211,"line":348},10,[209,350,351],{"class":226},"    tags: z.",[209,353,354],{"class":260},"array",[209,356,357],{"class":226},"(z.",[209,359,296],{"class":260},[209,361,362],{"class":226},"()).",[209,364,365],{"class":260},"default",[209,367,368],{"class":226},"([]),\n",[209,370,372],{"class":211,"line":371},11,[209,373,374],{"class":226},"  }),\n",[209,376,378],{"class":211,"line":377},12,[209,379,380],{"class":226},"});\n",[209,382,384],{"class":211,"line":383},13,[209,385,244],{"emptyLinePlaceholder":243},[209,387,389,392,395,398,400],{"class":211,"line":388},14,[209,390,391],{"class":222},"export",[209,393,394],{"class":222}," const",[209,396,397],{"class":253}," collections",[209,399,257],{"class":222},[209,401,402],{"class":226}," {\n",[209,404,406],{"class":211,"line":405},15,[209,407,408],{"class":226},"  blog: blogCollection,\n",[209,410,412],{"class":211,"line":411},16,[209,413,414],{"class":226},"};\n",[14,416,417],{},"Zodによる型チェックと、ビルド時のバリデーションで安全な記事管理が可能です。",[189,419,420],{"id":420},"記事の取得",[200,422,424],{"className":202,"code":423,"language":204,"meta":205,"style":205},"import { getCollection } from 'astro:content';\n\nconst allPosts = await getCollection('blog');\nconst sortedPosts = allPosts.sort((a, b) =>\n  b.data.date.getTime() - a.data.date.getTime()\n);\n",[167,425,426,439,443,467,497,519],{"__ignoreMap":205},[209,427,428,430,433,435,437],{"class":211,"line":212},[209,429,223],{"class":222},[209,431,432],{"class":226}," { getCollection } ",[209,434,230],{"class":222},[209,436,234],{"class":233},[209,438,237],{"class":226},[209,440,441],{"class":211,"line":219},[209,442,244],{"emptyLinePlaceholder":243},[209,444,445,447,450,452,455,458,461,464],{"class":211,"line":240},[209,446,250],{"class":222},[209,448,449],{"class":253}," allPosts",[209,451,257],{"class":222},[209,453,454],{"class":222}," await",[209,456,457],{"class":260}," getCollection",[209,459,460],{"class":226},"(",[209,462,463],{"class":233},"'blog'",[209,465,466],{"class":226},");\n",[209,468,469,471,474,476,479,482,484,486,489,492,494],{"class":211,"line":247},[209,470,250],{"class":222},[209,472,473],{"class":253}," sortedPosts",[209,475,257],{"class":222},[209,477,478],{"class":226}," allPosts.",[209,480,481],{"class":260},"sort",[209,483,326],{"class":226},[209,485,143],{"class":329},[209,487,488],{"class":226},", ",[209,490,491],{"class":329},"b",[209,493,333],{"class":226},[209,495,496],{"class":222},"=>\n",[209,498,499,502,505,508,511,514,516],{"class":211,"line":267},[209,500,501],{"class":226},"  b.data.date.",[209,503,504],{"class":260},"getTime",[209,506,507],{"class":226},"() ",[209,509,510],{"class":222},"-",[209,512,513],{"class":226}," a.data.date.",[209,515,504],{"class":260},[209,517,518],{"class":226},"()\n",[209,520,521],{"class":211,"line":279},[209,522,466],{"class":226},[14,524,525],{},"シンプルで直感的なAPIで記事を取得できます。",[10,527,529],{"id":528},"astroコンポーネント","Astroコンポーネント",[14,531,532],{},"UI実装には Astro コンポーネントを使用しています。",[200,534,538],{"className":535,"code":536,"language":537,"meta":205,"style":205},"language-astro shiki shiki-themes github-light github-dark","---\nimport type { CollectionEntry } from 'astro:content';\n\ninterface Props {\n  post: CollectionEntry\u003C'blog'>;\n}\n\nconst { post } = Astro.props;\n\nfunction formatDate(date: Date): string {\n  return date.toLocaleDateString('ja-JP', {\n    year: 'numeric',\n    month: 'short',\n    day: 'numeric',\n  });\n}\n---\n\n\u003Carticle class=\"group h-full\">\n  \u003Ca href={`\u002Fblog\u002F${post.slug}`}>\n    \u003Ch3>{post.data.title}\u003C\u002Fh3>\n    \u003Cp>{post.data.description}\u003C\u002Fp>\n  \u003C\u002Fa>\n\u003C\u002Farticle>\n","astro",[167,539,540,545,550,554,559,564,569,573,578,582,587,592,597,602,607,612,616,621,626,632,638,644,650,656],{"__ignoreMap":205},[209,541,542],{"class":211,"line":212},[209,543,544],{},"---\n",[209,546,547],{"class":211,"line":219},[209,548,549],{},"import type { CollectionEntry } from 'astro:content';\n",[209,551,552],{"class":211,"line":240},[209,553,244],{"emptyLinePlaceholder":243},[209,555,556],{"class":211,"line":247},[209,557,558],{},"interface Props {\n",[209,560,561],{"class":211,"line":267},[209,562,563],{},"  post: CollectionEntry\u003C'blog'>;\n",[209,565,566],{"class":211,"line":279},[209,567,568],{},"}\n",[209,570,571],{"class":211,"line":290},[209,572,244],{"emptyLinePlaceholder":243},[209,574,575],{"class":211,"line":302},[209,576,577],{},"const { post } = Astro.props;\n",[209,579,580],{"class":211,"line":312},[209,581,244],{"emptyLinePlaceholder":243},[209,583,584],{"class":211,"line":348},[209,585,586],{},"function formatDate(date: Date): string {\n",[209,588,589],{"class":211,"line":371},[209,590,591],{},"  return date.toLocaleDateString('ja-JP', {\n",[209,593,594],{"class":211,"line":377},[209,595,596],{},"    year: 'numeric',\n",[209,598,599],{"class":211,"line":383},[209,600,601],{},"    month: 'short',\n",[209,603,604],{"class":211,"line":388},[209,605,606],{},"    day: 'numeric',\n",[209,608,609],{"class":211,"line":405},[209,610,611],{},"  });\n",[209,613,614],{"class":211,"line":411},[209,615,568],{},[209,617,619],{"class":211,"line":618},17,[209,620,544],{},[209,622,624],{"class":211,"line":623},18,[209,625,244],{"emptyLinePlaceholder":243},[209,627,629],{"class":211,"line":628},19,[209,630,631],{},"\u003Carticle class=\"group h-full\">\n",[209,633,635],{"class":211,"line":634},20,[209,636,637],{},"  \u003Ca href={`\u002Fblog\u002F${post.slug}`}>\n",[209,639,641],{"class":211,"line":640},21,[209,642,643],{},"    \u003Ch3>{post.data.title}\u003C\u002Fh3>\n",[209,645,647],{"class":211,"line":646},22,[209,648,649],{},"    \u003Cp>{post.data.description}\u003C\u002Fp>\n",[209,651,653],{"class":211,"line":652},23,[209,654,655],{},"  \u003C\u002Fa>\n",[209,657,659],{"class":211,"line":658},24,[209,660,661],{},"\u003C\u002Farticle>\n",[14,663,664],{},"HTMLライクなシンプルな構文で、型安全なコンポーネントを書くことができます。",[10,666,78],{"id":667},"tailwind-css-v4",[14,669,670,671,148],{},"スタイリングには ",[143,672,78],{"href":673,"rel":674},"https:\u002F\u002Ftailwindcss.com",[147],[14,676,677],{},"Tailwind CSS v4 の主な特徴：",[33,679,680,686,692],{},[36,681,682,685],{},[29,683,684],{},"Viteプラグイン"," - PostCSS不要で、Vite統合が簡単に",[36,687,688,691],{},[29,689,690],{},"CSS変数ベース"," - カスタムプロパティを活用したテーマシステム",[36,693,694,697],{},[29,695,696],{},"ゼロコンフィグ"," - 設定ファイルなしでも動作",[189,699,700],{"id":700},"カスタムカラーテーマ",[14,702,703],{},"CSS変数を使って、ライト\u002Fダークモードのカラーテーマを実装しています。",[200,705,709],{"className":706,"code":707,"language":708,"meta":205,"style":205},"language-css shiki shiki-themes github-light github-dark","@theme {\n  \u002F* Surface Colors *\u002F\n  --color-surface: #fafafa;\n  --color-text-primary: #18181b;\n\n  \u002F* Primary - Purple Gradient *\u002F\n  --color-primary: #8b5cf6;\n\n  \u002F* Gradients *\u002F\n  --gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n  --gradient-accent: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n\n  --container-max: 1400px;\n}\n\n.dark {\n  --color-surface: #09090b;\n  --color-text-primary: #fafafa;\n  --color-primary: #a78bfa;\n  --gradient-primary: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);\n}\n","css",[167,710,711,718,723,732,742,746,751,761,765,770,787,802,806,811,815,819,826,839,851,863,903],{"__ignoreMap":205},[209,712,713,716],{"class":211,"line":212},[209,714,715],{"class":222},"@theme",[209,717,402],{"class":226},[209,719,720],{"class":211,"line":219},[209,721,722],{"class":215},"  \u002F* Surface Colors *\u002F\n",[209,724,725,728],{"class":211,"line":240},[209,726,727],{"class":226},"  --color-surface: ",[209,729,731],{"class":730},"s7hpK","#fafafa;\n",[209,733,734,737,740],{"class":211,"line":247},[209,735,736],{"class":226},"  --color-text-primary: ",[209,738,739],{"class":730},"#18181b",[209,741,237],{"class":226},[209,743,744],{"class":211,"line":267},[209,745,244],{"emptyLinePlaceholder":243},[209,747,748],{"class":211,"line":279},[209,749,750],{"class":215},"  \u002F* Primary - Purple Gradient *\u002F\n",[209,752,753,756,759],{"class":211,"line":290},[209,754,755],{"class":226},"  --color-primary: ",[209,757,758],{"class":730},"#8b5cf6",[209,760,237],{"class":226},[209,762,763],{"class":211,"line":302},[209,764,244],{"emptyLinePlaceholder":243},[209,766,767],{"class":211,"line":312},[209,768,769],{"class":215},"  \u002F* Gradients *\u002F\n",[209,771,772,775,778,781,784],{"class":211,"line":348},[209,773,774],{"class":226},"  --gradient-primary: linear-gradient(135deg, ",[209,776,777],{"class":730},"#667eea",[209,779,780],{"class":226}," 0%, ",[209,782,783],{"class":730},"#764ba2",[209,785,786],{"class":226}," 100%);\n",[209,788,789,792,795,797,800],{"class":211,"line":371},[209,790,791],{"class":226},"  --gradient-accent: linear-gradient(135deg, ",[209,793,794],{"class":260},"#f093fb",[209,796,780],{"class":226},[209,798,799],{"class":260},"#f5576c",[209,801,786],{"class":226},[209,803,804],{"class":211,"line":377},[209,805,244],{"emptyLinePlaceholder":243},[209,807,808],{"class":211,"line":383},[209,809,810],{"class":226},"  --container-max: 1400px;\n",[209,812,813],{"class":211,"line":388},[209,814,568],{"class":226},[209,816,817],{"class":211,"line":405},[209,818,244],{"emptyLinePlaceholder":243},[209,820,821,824],{"class":211,"line":411},[209,822,823],{"class":260},".dark",[209,825,402],{"class":226},[209,827,828,831,834,837],{"class":211,"line":618},[209,829,830],{"class":329},"  --color-surface",[209,832,833],{"class":226},": ",[209,835,836],{"class":253},"#09090b",[209,838,237],{"class":226},[209,840,841,844,846,849],{"class":211,"line":623},[209,842,843],{"class":329},"  --color-text-primary",[209,845,833],{"class":226},[209,847,848],{"class":253},"#fafafa",[209,850,237],{"class":226},[209,852,853,856,858,861],{"class":211,"line":628},[209,854,855],{"class":329},"  --color-primary",[209,857,833],{"class":226},[209,859,860],{"class":253},"#a78bfa",[209,862,237],{"class":226},[209,864,865,868,870,873,875,878,881,883,885,888,891,893,896,899,901],{"class":211,"line":634},[209,866,867],{"class":329},"  --gradient-primary",[209,869,833],{"class":226},[209,871,872],{"class":253},"linear-gradient",[209,874,460],{"class":226},[209,876,877],{"class":253},"135",[209,879,880],{"class":222},"deg",[209,882,488],{"class":226},[209,884,758],{"class":253},[209,886,887],{"class":253}," 0",[209,889,890],{"class":222},"%",[209,892,488],{"class":226},[209,894,895],{"class":253},"#ec4899",[209,897,898],{"class":253}," 100",[209,900,890],{"class":222},[209,902,466],{"class":226},[209,904,905],{"class":211,"line":640},[209,906,568],{"class":226},[14,908,909],{},"localStorageとMutationObserverを使用して、ユーザーの好みに応じた自動テーマ切り替えを実装しています。",[189,911,84],{"id":912},"tailwindcsstypography",[14,914,915,916,918],{},"記事本文のスタイリングには ",[167,917,84],{}," プラグインを使用しています。",[200,920,922],{"className":535,"code":921,"language":537,"meta":205,"style":205},"\u003Carticle class=\"prose dark:prose-invert max-w-none\">\n  \u003CContent \u002F>\n\u003C\u002Farticle>\n",[167,923,924,929,934],{"__ignoreMap":205},[209,925,926],{"class":211,"line":212},[209,927,928],{},"\u003Carticle class=\"prose dark:prose-invert max-w-none\">\n",[209,930,931],{"class":211,"line":219},[209,932,933],{},"  \u003CContent \u002F>\n",[209,935,936],{"class":211,"line":240},[209,937,661],{},[14,939,940,943,944,947],{},[167,941,942],{},"prose"," クラスを適用するだけで、見出し、段落、リスト、コードブロックなど、あらゆる要素に美しいタイポグラフィが適用されます。",[167,945,946],{},"dark:prose-invert"," でダークモードにも自動対応します。",[10,949,951],{"id":950},"seo対策","SEO対策",[14,953,954,955,957],{},"SEO対策には ",[167,956,109],{}," を使用しています。",[200,959,961],{"className":202,"code":960,"language":204,"meta":205,"style":205},"\u002F\u002F astro.config.mjs\nexport default defineConfig({\n  site: 'https:\u002F\u002Fnao-dev.netlify.app\u002F',\n  integrations: [\n    sitemap(),\n  ],\n});\n",[167,962,963,968,980,990,995,1002,1007],{"__ignoreMap":205},[209,964,965],{"class":211,"line":212},[209,966,967],{"class":215},"\u002F\u002F astro.config.mjs\n",[209,969,970,972,975,978],{"class":211,"line":219},[209,971,391],{"class":222},[209,973,974],{"class":222}," default",[209,976,977],{"class":260}," defineConfig",[209,979,264],{"class":226},[209,981,982,985,988],{"class":211,"line":240},[209,983,984],{"class":226},"  site: ",[209,986,987],{"class":233},"'https:\u002F\u002Fnao-dev.netlify.app\u002F'",[209,989,276],{"class":226},[209,991,992],{"class":211,"line":247},[209,993,994],{"class":226},"  integrations: [\n",[209,996,997,1000],{"class":211,"line":267},[209,998,999],{"class":260},"    sitemap",[209,1001,299],{"class":226},[209,1003,1004],{"class":211,"line":279},[209,1005,1006],{"class":226},"  ],\n",[209,1008,1009],{"class":211,"line":290},[209,1010,380],{"class":226},[14,1012,1013],{},"自動的にsitemap.xmlが生成され、検索エンジンのクローラーがサイトを効率的にインデックスできます。",[10,1015,1017],{"id":1016},"rssフィード-astrojsrss","RSSフィード - @astrojs\u002Frss",[14,1019,1020],{},"購読者のために、RSSフィードを提供しています。",[14,1022,1023,1025],{},[167,1024,115],{}," を使用することで、簡単にRSSフィードを生成できます。",[200,1027,1031],{"className":1028,"code":1029,"language":1030,"meta":205,"style":205},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F src\u002Fpages\u002Frss.xml.js\nimport rss from '@astrojs\u002Frss';\nimport { getCollection } from 'astro:content';\n\nexport async function GET(context) {\n  const posts = await getCollection('blog');\n\n  const sortedPosts = posts.sort((a, b) =>\n    b.data.date.getTime() - a.data.date.getTime()\n  );\n\n  return rss({\n    title: 'nao.dev',\n    description: 'Front-end Developer loving Vue ecosystem',\n    site: context.site,\n    items: sortedPosts.map((post) => ({\n      title: post.data.title,\n      description: post.data.description,\n      pubDate: post.data.date,\n      link: `\u002Fblog\u002F${post.slug}\u002F`,\n    })),\n    customData: `\u003Clanguage>ja\u003C\u002Flanguage>`,\n  });\n}\n","javascript",[167,1032,1033,1038,1052,1064,1068,1089,1109,1113,1138,1155,1160,1164,1174,1184,1194,1199,1219,1224,1229,1234,1255,1260,1270,1274],{"__ignoreMap":205},[209,1034,1035],{"class":211,"line":212},[209,1036,1037],{"class":215},"\u002F\u002F src\u002Fpages\u002Frss.xml.js\n",[209,1039,1040,1042,1045,1047,1050],{"class":211,"line":219},[209,1041,223],{"class":222},[209,1043,1044],{"class":226}," rss ",[209,1046,230],{"class":222},[209,1048,1049],{"class":233}," '@astrojs\u002Frss'",[209,1051,237],{"class":226},[209,1053,1054,1056,1058,1060,1062],{"class":211,"line":240},[209,1055,223],{"class":222},[209,1057,432],{"class":226},[209,1059,230],{"class":222},[209,1061,234],{"class":233},[209,1063,237],{"class":226},[209,1065,1066],{"class":211,"line":247},[209,1067,244],{"emptyLinePlaceholder":243},[209,1069,1070,1072,1075,1078,1081,1083,1086],{"class":211,"line":267},[209,1071,391],{"class":222},[209,1073,1074],{"class":222}," async",[209,1076,1077],{"class":222}," function",[209,1079,1080],{"class":260}," GET",[209,1082,460],{"class":226},[209,1084,1085],{"class":329},"context",[209,1087,1088],{"class":226},") {\n",[209,1090,1091,1094,1097,1099,1101,1103,1105,1107],{"class":211,"line":279},[209,1092,1093],{"class":222},"  const",[209,1095,1096],{"class":253}," posts",[209,1098,257],{"class":222},[209,1100,454],{"class":222},[209,1102,457],{"class":260},[209,1104,460],{"class":226},[209,1106,463],{"class":233},[209,1108,466],{"class":226},[209,1110,1111],{"class":211,"line":290},[209,1112,244],{"emptyLinePlaceholder":243},[209,1114,1115,1117,1119,1121,1124,1126,1128,1130,1132,1134,1136],{"class":211,"line":302},[209,1116,1093],{"class":222},[209,1118,473],{"class":253},[209,1120,257],{"class":222},[209,1122,1123],{"class":226}," posts.",[209,1125,481],{"class":260},[209,1127,326],{"class":226},[209,1129,143],{"class":329},[209,1131,488],{"class":226},[209,1133,491],{"class":329},[209,1135,333],{"class":226},[209,1137,496],{"class":222},[209,1139,1140,1143,1145,1147,1149,1151,1153],{"class":211,"line":312},[209,1141,1142],{"class":226},"    b.data.date.",[209,1144,504],{"class":260},[209,1146,507],{"class":226},[209,1148,510],{"class":222},[209,1150,513],{"class":226},[209,1152,504],{"class":260},[209,1154,518],{"class":226},[209,1156,1157],{"class":211,"line":348},[209,1158,1159],{"class":226},"  );\n",[209,1161,1162],{"class":211,"line":371},[209,1163,244],{"emptyLinePlaceholder":243},[209,1165,1166,1169,1172],{"class":211,"line":377},[209,1167,1168],{"class":222},"  return",[209,1170,1171],{"class":260}," rss",[209,1173,264],{"class":226},[209,1175,1176,1179,1182],{"class":211,"line":383},[209,1177,1178],{"class":226},"    title: ",[209,1180,1181],{"class":233},"'nao.dev'",[209,1183,276],{"class":226},[209,1185,1186,1189,1192],{"class":211,"line":388},[209,1187,1188],{"class":226},"    description: ",[209,1190,1191],{"class":233},"'Front-end Developer loving Vue ecosystem'",[209,1193,276],{"class":226},[209,1195,1196],{"class":211,"line":405},[209,1197,1198],{"class":226},"    site: context.site,\n",[209,1200,1201,1204,1207,1209,1212,1214,1216],{"class":211,"line":411},[209,1202,1203],{"class":226},"    items: sortedPosts.",[209,1205,1206],{"class":260},"map",[209,1208,326],{"class":226},[209,1210,1211],{"class":329},"post",[209,1213,333],{"class":226},[209,1215,336],{"class":222},[209,1217,1218],{"class":226}," ({\n",[209,1220,1221],{"class":211,"line":618},[209,1222,1223],{"class":226},"      title: post.data.title,\n",[209,1225,1226],{"class":211,"line":623},[209,1227,1228],{"class":226},"      description: post.data.description,\n",[209,1230,1231],{"class":211,"line":628},[209,1232,1233],{"class":226},"      pubDate: post.data.date,\n",[209,1235,1236,1239,1242,1244,1247,1250,1253],{"class":211,"line":634},[209,1237,1238],{"class":226},"      link: ",[209,1240,1241],{"class":233},"`\u002Fblog\u002F${",[209,1243,1211],{"class":226},[209,1245,1246],{"class":233},".",[209,1248,1249],{"class":226},"slug",[209,1251,1252],{"class":233},"}\u002F`",[209,1254,276],{"class":226},[209,1256,1257],{"class":211,"line":640},[209,1258,1259],{"class":226},"    })),\n",[209,1261,1262,1265,1268],{"class":211,"line":646},[209,1263,1264],{"class":226},"    customData: ",[209,1266,1267],{"class":233},"`\u003Clanguage>ja\u003C\u002Flanguage>`",[209,1269,276],{"class":226},[209,1271,1272],{"class":211,"line":652},[209,1273,611],{"class":226},[209,1275,1276],{"class":211,"line":658},[209,1277,568],{"class":226},[14,1279,1280],{},"Content Collectionsと連携することで、記事の追加・更新時に自動的にRSSフィードも更新されます。",[10,1282,1284],{"id":1283},"動的ogp画像生成-satori-sharp","動的OGP画像生成 - satori + sharp",[14,1286,1287],{},"各記事ごとに動的にOGP画像を生成しています。",[14,1289,1290,1295,1296,1301],{},[143,1291,1294],{"href":1292,"rel":1293},"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fsatori",[147],"satori"," はVercelが開発したライブラリで、HTMLとCSSをSVGに変換できます。これと ",[143,1297,1300],{"href":1298,"rel":1299},"https:\u002F\u002Fsharp.pixelplumbing.com\u002F",[147],"sharp"," を組み合わせることで、美しいOGP画像を自動生成できます。",[200,1303,1305],{"className":202,"code":1304,"language":204,"meta":205,"style":205},"\u002F\u002F src\u002Fpages\u002Fog\u002F[...slug].png.ts\nimport satori from 'satori';\nimport sharp from 'sharp';\nimport { getCollection } from 'astro:content';\n\nexport const GET: APIRoute = async ({ props }) => {\n  const { post } = props;\n\n  \u002F\u002F Satoriでデザインを定義\n  const svg = await satori(\n    {\n      type: 'div',\n      props: {\n        style: {\n          background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n          \u002F\u002F ... スタイル定義\n        },\n        children: [\n          { type: 'div', props: { children: post.data.title } },\n        ],\n      },\n    },\n    { width: 1200, height: 630 }\n  );\n\n  \u002F\u002F SharpでSVGをPNGに変換\n  const png = await sharp(Buffer.from(svg)).png().toBuffer();\n\n  return new Response(png, {\n    headers: { 'Content-Type': 'image\u002Fpng' },\n  });\n};\n",[167,1306,1307,1312,1326,1340,1352,1356,1387,1405,1409,1414,1431,1436,1446,1451,1456,1466,1471,1476,1481,1491,1496,1501,1506,1523,1527,1532,1538,1572,1577,1590,1607,1612],{"__ignoreMap":205},[209,1308,1309],{"class":211,"line":212},[209,1310,1311],{"class":215},"\u002F\u002F src\u002Fpages\u002Fog\u002F[...slug].png.ts\n",[209,1313,1314,1316,1319,1321,1324],{"class":211,"line":219},[209,1315,223],{"class":222},[209,1317,1318],{"class":226}," satori ",[209,1320,230],{"class":222},[209,1322,1323],{"class":233}," 'satori'",[209,1325,237],{"class":226},[209,1327,1328,1330,1333,1335,1338],{"class":211,"line":240},[209,1329,223],{"class":222},[209,1331,1332],{"class":226}," sharp ",[209,1334,230],{"class":222},[209,1336,1337],{"class":233}," 'sharp'",[209,1339,237],{"class":226},[209,1341,1342,1344,1346,1348,1350],{"class":211,"line":247},[209,1343,223],{"class":222},[209,1345,432],{"class":226},[209,1347,230],{"class":222},[209,1349,234],{"class":233},[209,1351,237],{"class":226},[209,1353,1354],{"class":211,"line":267},[209,1355,244],{"emptyLinePlaceholder":243},[209,1357,1358,1360,1362,1364,1367,1370,1372,1374,1377,1380,1383,1385],{"class":211,"line":279},[209,1359,391],{"class":222},[209,1361,394],{"class":222},[209,1363,1080],{"class":260},[209,1365,1366],{"class":222},":",[209,1368,1369],{"class":260}," APIRoute",[209,1371,257],{"class":222},[209,1373,1074],{"class":222},[209,1375,1376],{"class":226}," ({ ",[209,1378,1379],{"class":329},"props",[209,1381,1382],{"class":226}," }) ",[209,1384,336],{"class":222},[209,1386,402],{"class":226},[209,1388,1389,1391,1394,1396,1399,1402],{"class":211,"line":290},[209,1390,1093],{"class":222},[209,1392,1393],{"class":226}," { ",[209,1395,1211],{"class":253},[209,1397,1398],{"class":226}," } ",[209,1400,1401],{"class":222},"=",[209,1403,1404],{"class":226}," props;\n",[209,1406,1407],{"class":211,"line":302},[209,1408,244],{"emptyLinePlaceholder":243},[209,1410,1411],{"class":211,"line":312},[209,1412,1413],{"class":215},"  \u002F\u002F Satoriでデザインを定義\n",[209,1415,1416,1418,1421,1423,1425,1428],{"class":211,"line":348},[209,1417,1093],{"class":222},[209,1419,1420],{"class":253}," svg",[209,1422,257],{"class":222},[209,1424,454],{"class":222},[209,1426,1427],{"class":260}," satori",[209,1429,1430],{"class":226},"(\n",[209,1432,1433],{"class":211,"line":371},[209,1434,1435],{"class":226},"    {\n",[209,1437,1438,1441,1444],{"class":211,"line":377},[209,1439,1440],{"class":226},"      type: ",[209,1442,1443],{"class":233},"'div'",[209,1445,276],{"class":226},[209,1447,1448],{"class":211,"line":383},[209,1449,1450],{"class":226},"      props: {\n",[209,1452,1453],{"class":211,"line":388},[209,1454,1455],{"class":226},"        style: {\n",[209,1457,1458,1461,1464],{"class":211,"line":405},[209,1459,1460],{"class":226},"          background: ",[209,1462,1463],{"class":233},"'linear-gradient(135deg, #667eea 0%, #764ba2 100%)'",[209,1465,276],{"class":226},[209,1467,1468],{"class":211,"line":411},[209,1469,1470],{"class":215},"          \u002F\u002F ... スタイル定義\n",[209,1472,1473],{"class":211,"line":618},[209,1474,1475],{"class":226},"        },\n",[209,1477,1478],{"class":211,"line":623},[209,1479,1480],{"class":226},"        children: [\n",[209,1482,1483,1486,1488],{"class":211,"line":628},[209,1484,1485],{"class":226},"          { type: ",[209,1487,1443],{"class":233},[209,1489,1490],{"class":226},", props: { children: post.data.title } },\n",[209,1492,1493],{"class":211,"line":634},[209,1494,1495],{"class":226},"        ],\n",[209,1497,1498],{"class":211,"line":640},[209,1499,1500],{"class":226},"      },\n",[209,1502,1503],{"class":211,"line":646},[209,1504,1505],{"class":226},"    },\n",[209,1507,1508,1511,1514,1517,1520],{"class":211,"line":652},[209,1509,1510],{"class":226},"    { width: ",[209,1512,1513],{"class":253},"1200",[209,1515,1516],{"class":226},", height: ",[209,1518,1519],{"class":253},"630",[209,1521,1522],{"class":226}," }\n",[209,1524,1525],{"class":211,"line":658},[209,1526,1159],{"class":226},[209,1528,1530],{"class":211,"line":1529},25,[209,1531,244],{"emptyLinePlaceholder":243},[209,1533,1535],{"class":211,"line":1534},26,[209,1536,1537],{"class":215},"  \u002F\u002F SharpでSVGをPNGに変換\n",[209,1539,1541,1543,1546,1548,1550,1553,1556,1558,1561,1564,1566,1569],{"class":211,"line":1540},27,[209,1542,1093],{"class":222},[209,1544,1545],{"class":253}," png",[209,1547,257],{"class":222},[209,1549,454],{"class":222},[209,1551,1552],{"class":260}," sharp",[209,1554,1555],{"class":226},"(Buffer.",[209,1557,230],{"class":260},[209,1559,1560],{"class":226},"(svg)).",[209,1562,1563],{"class":260},"png",[209,1565,320],{"class":226},[209,1567,1568],{"class":260},"toBuffer",[209,1570,1571],{"class":226},"();\n",[209,1573,1575],{"class":211,"line":1574},28,[209,1576,244],{"emptyLinePlaceholder":243},[209,1578,1580,1582,1584,1587],{"class":211,"line":1579},29,[209,1581,1168],{"class":222},[209,1583,339],{"class":222},[209,1585,1586],{"class":260}," Response",[209,1588,1589],{"class":226},"(png, {\n",[209,1591,1593,1596,1599,1601,1604],{"class":211,"line":1592},30,[209,1594,1595],{"class":226},"    headers: { ",[209,1597,1598],{"class":233},"'Content-Type'",[209,1600,833],{"class":226},[209,1602,1603],{"class":233},"'image\u002Fpng'",[209,1605,1606],{"class":226}," },\n",[209,1608,1610],{"class":211,"line":1609},31,[209,1611,611],{"class":226},[209,1613,1615],{"class":211,"line":1614},32,[209,1616,414],{"class":226},[14,1618,1619],{},"記事タイトル、日付、サイト名が含まれたカード型のOGP画像が自動生成され、SNSでのシェア時に美しく表示されます。",[10,1621,103],{"id":103},[14,1623,1624,1625,1627],{},"アイコンには ",[167,1626,103],{}," を使用しています。Iconifyの全アイコンセットにアクセスでき、使用するアイコンだけがバンドルされます。",[200,1629,1631],{"className":535,"code":1630,"language":537,"meta":205,"style":205},"---\nimport { Icon } from 'astro-icon\u002Fcomponents';\n---\n\n\u003CIcon name=\"lucide:calendar\" class=\"size-4\" \u002F>\n\u003CIcon name=\"lucide:clock\" class=\"size-4\" \u002F>\n",[167,1632,1633,1637,1642,1646,1650,1655],{"__ignoreMap":205},[209,1634,1635],{"class":211,"line":212},[209,1636,544],{},[209,1638,1639],{"class":211,"line":219},[209,1640,1641],{},"import { Icon } from 'astro-icon\u002Fcomponents';\n",[209,1643,1644],{"class":211,"line":240},[209,1645,544],{},[209,1647,1648],{"class":211,"line":247},[209,1649,244],{"emptyLinePlaceholder":243},[209,1651,1652],{"class":211,"line":267},[209,1653,1654],{},"\u003CIcon name=\"lucide:calendar\" class=\"size-4\" \u002F>\n",[209,1656,1657],{"class":211,"line":279},[209,1658,1659],{},"\u003CIcon name=\"lucide:clock\" class=\"size-4\" \u002F>\n",[14,1661,1662],{},"設定でlucideアイコンセットを指定：",[200,1664,1666],{"className":202,"code":1665,"language":204,"meta":205,"style":205},"\u002F\u002F astro.config.mjs\nexport default defineConfig({\n  integrations: [\n    icon({\n      include: {\n        lucide: ['*'],\n      },\n    }),\n  ],\n});\n",[167,1667,1668,1672,1682,1686,1693,1698,1709,1713,1718,1722],{"__ignoreMap":205},[209,1669,1670],{"class":211,"line":212},[209,1671,967],{"class":215},[209,1673,1674,1676,1678,1680],{"class":211,"line":219},[209,1675,391],{"class":222},[209,1677,974],{"class":222},[209,1679,977],{"class":260},[209,1681,264],{"class":226},[209,1683,1684],{"class":211,"line":240},[209,1685,994],{"class":226},[209,1687,1688,1691],{"class":211,"line":247},[209,1689,1690],{"class":260},"    icon",[209,1692,264],{"class":226},[209,1694,1695],{"class":211,"line":267},[209,1696,1697],{"class":226},"      include: {\n",[209,1699,1700,1703,1706],{"class":211,"line":279},[209,1701,1702],{"class":226},"        lucide: [",[209,1704,1705],{"class":233},"'*'",[209,1707,1708],{"class":226},"],\n",[209,1710,1711],{"class":211,"line":290},[209,1712,1500],{"class":226},[209,1714,1715],{"class":211,"line":302},[209,1716,1717],{"class":226},"    }),\n",[209,1719,1720],{"class":211,"line":312},[209,1721,1006],{"class":226},[209,1723,1724],{"class":211,"line":348},[209,1725,380],{"class":226},[10,1727,1728],{"id":1728},"デザインシステム",[14,1730,1731,1732,1735],{},"このブログは",[29,1733,1734],{},"モダン・ミニマリズム + ビビッドアクセント","のコンセプトでデザインされています。",[189,1737,1738],{"id":1738},"主な特徴",[33,1740,1741,1747,1753,1759,1765],{},[36,1742,1743,1746],{},[29,1744,1745],{},"カードグリッドレイアウト"," - 2カラムで整然と配置されたブログ一覧",[36,1748,1749,1752],{},[29,1750,1751],{},"グラデーション多用"," - 紫→ピンク系のモダンなグラデーション",[36,1754,1755,1758],{},[29,1756,1757],{},"マイクロインタラクション"," - ホバー時の浮き上がり効果、スムーズなトランジション",[36,1760,1761,1764],{},[29,1762,1763],{},"読みやすさ重視"," - 広い行間（2.0）、適切なフォントサイズ",[36,1766,1767,1770],{},[29,1768,1769],{},"ダークモード完全対応"," - システム設定に応じた自動切り替え",[10,1772,1774],{"id":1773},"文章品質管理-textlint","文章品質管理 - textlint",[14,1776,1777,1778,1782],{},"ブログ記事の品質を保つため、",[143,1779,121],{"href":1780,"rel":1781},"https:\u002F\u002Ftextlint.github.io\u002F",[147]," を導入しています。",[14,1784,1785,1788],{},[167,1786,1787],{},"@textlint-ja\u002Ftextlint-rule-preset-ai-writing"," プリセットを使用することで、以下をチェックできます",[33,1790,1791,1797,1803,1809],{},[36,1792,1793,1796],{},[29,1794,1795],{},"重複表現"," - 同じ言葉の繰り返しを検出",[36,1798,1799,1802],{},[29,1800,1801],{},"冗長な表現"," - 不要な言い回しを指摘",[36,1804,1805,1808],{},[29,1806,1807],{},"ら抜き言葉"," - 文法的な誤りをチェック",[36,1810,1811,1814],{},[29,1812,1813],{},"表記ゆれ"," - 表記の統一性を確認",[200,1816,1820],{"className":1817,"code":1818,"language":1819,"meta":205,"style":205},"language-bash shiki shiki-themes github-light github-dark","# 記事をチェック\npnpm lint:text\n\n# 自動修正\npnpm lint:text:fix\n","bash",[167,1821,1822,1827,1835,1839,1844],{"__ignoreMap":205},[209,1823,1824],{"class":211,"line":212},[209,1825,1826],{"class":215},"# 記事をチェック\n",[209,1828,1829,1832],{"class":211,"line":219},[209,1830,1831],{"class":260},"pnpm",[209,1833,1834],{"class":233}," lint:text\n",[209,1836,1837],{"class":211,"line":240},[209,1838,244],{"emptyLinePlaceholder":243},[209,1840,1841],{"class":211,"line":247},[209,1842,1843],{"class":215},"# 自動修正\n",[209,1845,1846,1848],{"class":211,"line":267},[209,1847,1831],{"class":260},[209,1849,1850],{"class":233}," lint:text:fix\n",[14,1852,1853],{},"AI技術を活用したルールセットにより、より自然で読みやすい文章を書けるようになります。",[10,1855,1856],{"id":1856},"パフォーマンス",[14,1858,1859],{},"Astroの強みを活かし、超高速なブログを実現しています",[33,1861,1862,1868,1874,1880],{},[36,1863,1864,1867],{},[29,1865,1866],{},"ゼロJavaScript"," - デフォルトでクライアントサイドJSなし",[36,1869,1870,1873],{},[29,1871,1872],{},"静的サイト生成"," - ビルド時に全ページを事前生成",[36,1875,1876,1879],{},[29,1877,1878],{},"最適化された画像"," - 自動的にWebP\u002FAVIF変換",[36,1881,1882,1884],{},[29,1883,78],{}," - PostCSS不要でビルドが高速",[10,1886,1888],{"id":1887},"デプロイ-cloudflare-workers","デプロイ - Cloudflare Workers",[14,1890,1891,1892,1897],{},"このブログは ",[143,1893,1896],{"href":1894,"rel":1895},"https:\u002F\u002Fworkers.cloudflare.com\u002F",[147],"Cloudflare Workers"," でホストされています。",[14,1899,1900],{},"Cloudflare Workersを選んだ理由は以下のとおりです",[33,1902,1903,1909,1915,1921],{},[36,1904,1905,1908],{},[29,1906,1907],{},"エッジでの実行"," - 世界中のエッジロケーションでコードを実行",[36,1910,1911,1914],{},[29,1912,1913],{},"超高速なレスポンス"," - エッジからの直接配信で低レイテンシ",[36,1916,1917,1920],{},[29,1918,1919],{},"無料で使いやすい"," - 個人ブログには十分な無料枠",[36,1922,1923,1925],{},[29,1924,180],{}," - 静的サイトだけでなく、動的な処理も可能",[189,1927,1928],{"id":1928},"wranglerでデプロイ",[14,1930,1931,1935],{},[143,1932,133],{"href":1933,"rel":1934},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fwrangler\u002F",[147]," を使用することで、コマンド一つでデプロイできます。",[200,1937,1939],{"className":1817,"code":1938,"language":1819,"meta":205,"style":205},"# ビルド＆デプロイ\npnpm build && pnpm deploy\n",[167,1940,1941,1946],{"__ignoreMap":205},[209,1942,1943],{"class":211,"line":212},[209,1944,1945],{"class":215},"# ビルド＆デプロイ\n",[209,1947,1948,1950,1953,1956,1958],{"class":211,"line":219},[209,1949,1831],{"class":260},[209,1951,1952],{"class":233}," build",[209,1954,1955],{"class":226}," && ",[209,1957,1831],{"class":260},[209,1959,1960],{"class":233}," deploy\n",[14,1962,1963,1966],{},[167,1964,1965],{},"wrangler.toml"," で設定を管理し、CI\u002FCDパイプラインにも簡単に組み込めます。",[10,1968,1969],{"id":1969},"まとめ",[14,1971,1972],{},"Astro 5 と Tailwind CSS v4 の組み合わせにより、超高速でモダンなブログを構築できました。",[14,1974,1975],{},"主な特徴をまとめると：",[33,1977,1978,1983,1989,1995],{},[36,1979,1980,1982],{},[29,1981,59],{}," - 型安全な記事管理",[36,1984,1985,1988],{},[29,1986,1987],{},"動的OGP画像生成"," - satoriとsharpによる美しいOGP画像",[36,1990,1991,1994],{},[29,1992,1993],{},"RSSフィード"," - 購読者のための標準サポート",[36,1996,1997,2000],{},[29,1998,1999],{},"モダンなデザインシステム"," - ダークモード完全対応",[14,2002,2003],{},"これらの技術により、快適な執筆・閲覧体験を実現しています。",[14,2005,2006],{},"今後もこのブログを通じて、技術的な知見や経験を発信していきます！",[2008,2009,2010],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":205,"searchDepth":219,"depth":219,"links":2012},[2013,2014,2015,2019,2020,2024,2025,2026,2027,2028,2031,2032,2033,2036],{"id":12,"depth":219,"text":12},{"id":22,"depth":219,"text":22},{"id":137,"depth":219,"text":138,"children":2016},[2017,2018],{"id":191,"depth":240,"text":59},{"id":420,"depth":240,"text":420},{"id":528,"depth":219,"text":529},{"id":667,"depth":219,"text":78,"children":2021},[2022,2023],{"id":700,"depth":240,"text":700},{"id":912,"depth":240,"text":84},{"id":950,"depth":219,"text":951},{"id":1016,"depth":219,"text":1017},{"id":1283,"depth":219,"text":1284},{"id":103,"depth":219,"text":103},{"id":1728,"depth":219,"text":1728,"children":2029},[2030],{"id":1738,"depth":240,"text":1738},{"id":1773,"depth":219,"text":1774},{"id":1856,"depth":219,"text":1856},{"id":1887,"depth":219,"text":1888,"children":2034},[2035],{"id":1928,"depth":240,"text":1928},{"id":1969,"depth":219,"text":1969},"2026-02-13","Astro 5、Tailwind CSS v4、Content Collectionsなど、このブログを構築している技術スタックについて紹介します。","md",{"tags":2041},[537,204,2042,2043],"blog","tech-stack","\u002Fblog\u002Fblog-tech-stack",{"title":5,"description":2038},"blog\u002Fblog-tech-stack","TiHWr01R-YzuvxGKVd1IX9BYdfWB-hvHp4wxgot6Pc4",1773664053769]