èª¿æ»æ¥: 2026-03-20 10ãšãŒãžã§ã³ãã«ããã³ãŒãããŒã¹ã»ãã«ãçµæã»Astroå ¬åŒãµã€ãæ§é ã®äžŠå調æ»çµæãããšã«äœæã åæ: NotroTail ã¯ãã³ãã¬ãŒããšã㊠Vercel/Netlify ãžã®ãããã€ãæ³å®ãnotroã»remark-nfm ã¯ãªãã·ã§ã³ã
| ãªãŒãã£ãšã³ã¹ | ç®ç | äž»ãªåç· |
|---|---|---|
| ãã³ãã¬ãŒãå©çšè | NotroTail ãã¯ããŒã³ã㊠Notion ããã°ãç«ã¡äžããã | ããã â ã¯ã€ãã¯ã¹ã¿ãŒã â ããã〠|
| ããã±ãŒãžå©çšè | æ¢å Astro ãããžã§ã¯ãã« notro / remark-nfm ã远å ããã |
Docs â API ãªãã¡ã¬ã³ã¹ â npm |
- ãããããŒãž â ããã〠CTA ããªããGitHub ãšãã¢ããã°ãžã®èªå°ãããªãããã³ãã¬ãŒããšããŠäœ¿ãå ¥å£ããªãã
- Docs ããŒãž (
/contact/) â "How this site is built" ãšãã説æããŒãžæ¢ãŸããã¯ã€ãã¯ã¹ã¿ãŒãã»API ãªãã¡ã¬ã³ã¹ã»ãããã€ã¬ã€ãããªãã - ãã¥ãŒããªã¢ã«ãããã°ã«åãããŠãã â åªè¯ãªå ¥éèšäºïŒsetup, add-notro-to-astro çïŒãããã°äžèЧã«äžŠãã§ããŠãåŠç¿ãã¹ãšããŠæ©èœããŠããªãã
- notro ããªãã·ã§ã³ã§ããããšãäŒãããªã â ãã³ãã¬ãŒãã Notion ãªãã§äœ¿ããã¿ãŒã³ã瀺ãããŠããªãã
- ãã¹ãèšäºãæ¬çªè¡šç€ºãããŠãã â
test-callout-edge-cases,test-markdown-edge-casesãããã°äžèЧã«åºãŠããã
- ãDeploy to VercelããDeploy to Netlifyããã¿ã³ãããŒããŒã«è¿œå
- Vercel:
[](https://vercel.com/new/clone?...)ã¹ã¿ã€ã« - Netlify:
[](https://app.netlify.com/start/deploy?...)ã¹ã¿ã€ã«
- Vercel:
- CTAã®éè€ãè§£æ¶ â ããŒããŒãšæçµCTAã§ãGitHubãããã¢ããã°ãã2ååºãŠãããããŒããŒã¯ãããã€éèŠãæçµCTAã¯GitHubéèŠã«åœ¹å²ãåããã
- ã¯ã€ãã¯ã¹ã¿ãŒãã³ãã³ãããã³ãã¬ãŒãå©çšè
åãã«å€æŽ
- çŸç¶:
npm install notroïŒããã±ãŒãžå©çšè åãïŒ - 远å :
Use this templateâ clone â deploy ã®3ã¹ããã
- çŸç¶:
ââââââââââââââââââââââââââââ ââââââââââââââââââââââââââââ
â ãã³ãã¬ãŒããšããŠäœ¿ã â â npm ããã±ãŒãžãšããŠäœ¿ã â
â Notion ããã°ã5åã§ â â æ¢å Astro ãããžã§ã¯ãã« â
â Vercel/Netlify ã«ãããã€â â notro ã远å ãã â
ââââââââââââââââââââââââââââ ââââââââââââââââââââââââââââ
- notroã»remark-nfm ããªãã·ã§ã³ã§ããããšããæ©èœãã»ã¯ã·ã§ã³ã§æèš
çŸåš: ãNotionã§æžã â notroã倿 â AstroãçæãïŒããã±ãŒãžå©çšè èŠç¹ïŒ 倿ŽåŸ: ãã³ãã¬ãŒãå©çšè åãã®3ã¹ãããã远å ãŸãã¯äžŠèš
- ãã®ãªããžããªããã³ãã¬ãŒããšããŠäœ¿ãïŒGitHub ã® "Use this template"ïŒ
- Notion ããŒã¯ã³ãšããŒã¿ãœãŒã¹ ID ãç°å¢å€æ°ã«èšå®
- Vercel / Netlify ã«ãããã€ïŒã¯ã³ã¯ãªãã¯ïŒ
- ããŒããŒã®ãããã°ãèŠã âããã¿ã³ããããã¥ã¡ã³ããèŠã âãïŒ
/contact/ïŒã«å€æŽ â» ãã¢ãšããŠã®ããã°ãžã®ãªã³ã¯ã¯æ®ãïŒã»ã«ã³ããªãã¿ã³ïŒ
contact.astro ã Docs ãããšããŠåæ§æãçŸåšã®ã3ããŒãžçš®é¡ã®èª¬æ + ãã€ãã©ã€ã³èª¬æãã¯ããµã€ãã®ä»çµã¿ãã»ã¯ã·ã§ã³ãšããŠæ®ãã€ã€ã以äžã远å :
-
ã¯ã€ãã¯ã¹ã¿ãŒãã»ã¯ã·ã§ã³ïŒãã³ãã¬ãŒãå©çšè åãïŒ
1. ãªããžããªãã¯ããŒã³ / GitHub ã® "Use this template" ã§äœæ 2. npm installïŒã«ãŒãã§å®è¡ïŒ 3. .env ã« NOTION_TOKEN, NOTION_DATASOURCE_ID ãèšå® 4. npm run devïŒlocalhost:4321 ã§ç¢ºèªïŒ 5. Vercel / Netlify ã«ããã〠-
Notion ã»ããã¢ããã¬ã€ã
- Notion ã€ã³ãã°ã¬ãŒã·ã§ã³äœææé ïŒnotion.so/my-integrations ãžã®ãªã³ã¯ïŒ
- ããŒã¿ãœãŒã¹ ID ã®ååŸæ¹æ³ïŒURL ããæœåºïŒ
- ããŒã¿ããŒã¹ã¹ããŒãå¿ é ããããã£äžèЧ
ãããã㣠å å¿ é 説æ Nametitle â èšäºã¿ã€ãã« Slugrich_text â URL ã¹ã©ãã° Publiccheckbox â å ¬éãã©ã° Descriptionrich_text â 説ææã»meta description Tagsmulti_select â ã¿ã°ïŒ page/pinnedã¯å éšããŒã«ãŒïŒDatedate â å ¬éæ¥ -
ç°å¢å€æ°ãªãã¡ã¬ã³ã¹ããŒãã«
倿° å¿ é 説æ NOTION_TOKENâ Notion Internal Integration Token NOTION_DATASOURCE_IDâ Notion ããŒã¿ãœãŒã¹ IDïŒDB IDïŒ -
Vercel / Netlify ãããã€ã¬ã€ã
- Vercel:
vercel.jsonãtemplates/blog/distãèªåèšå® - Netlify:
netlify.tomlãèšå®æžã¿ã®ãããã®ãŸãŸãããã€å¯ - ç°å¢å€æ°ã®èšå®ç®æïŒåããã·ã¥ããŒãã®ã¹ã¯ãªãŒã³ã·ã§ãã or ãªã³ã¯ïŒ
- Vercel:
-
notroããã±ãŒãž API ãªãã¡ã¬ã³ã¹ã»ã¯ã·ã§ã³- 3ã€ã®ãšã³ããªãŒãã€ã³ãïŒ
notro,notro/utils,notro/integrationïŒ loader()ãªãã·ã§ã³ïŒqueryParameters,clientOptionsïŒNotroContentpropsïŒmarkdown,linkToPages,classMap,componentsïŒclassMapããŒäžèЧïŒcallout, toggle, h1âh4, p, ul, ol, li, a, pre, table, etc.ïŒ
- 3ã€ã®ãšã³ããªãŒãã€ã³ãïŒ
-
remark-nfmã¹ã¿ã³ãã¢ãã³å©çšã»ã¯ã·ã§ã³import { remarkNfm } from 'remark-nfm'ã®åºæ¬äœ¿çšäŸ- ä¿®æ£ Fix 0ã9 ã®ç°¡æè¡š
-
ãã¥ãŒããªã¢ã«ãžã®èªå°ãªã¹ã
ð ãã¥ãŒããªã¢ã«ïŒããã°èšäºïŒ âââ ã»ããã¢ããã¬ã€ã â /blog/setup/ âââ æ¢å Astro ãããžã§ã¯ããžã®è¿œå â /blog/add-notro-to-astro/ âââ Notion ã§ã®ã³ã³ãã³ã管ç â /blog/content-management/ âââ ãã«ããšããã〠â /blog/build-and-deploy/ âââ ã³ã³ããŒãã³ãã®ã«ã¹ã¿ãã€ãº â /blog/customize-components/ -
ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã»ã¯ã·ã§ã³
truncated === trueã®å¯ŸåŠïŒå€§ããªããŒãžãåå²ïŒunknown_block_idsã®æå³ïŒNotion API ã倿ã§ããªãã£ããããã¯ïŒ- Notion API ã¬ãŒãå¶éïŒ429ïŒãžã®å¯Ÿå¿ïŒèªåãªãã©ã€ããïŒ
- ç»åã衚瀺ãããªãïŒS3 ããªãµã€ã³ URL ã®æå¹æéåã â åãã«ãïŒ
-
/contact/â/docs/ãžã®ãªããŒã ãæ€èšïŒãã¡ã€ã«åãå®äœãšä¹é¢ããŠããïŒsrc/pages/contact.astroâsrc/pages/docs.astroastro.config.mjsã«redirects: { '/contact/': '/docs/' }ã远å ïŒåŸæ¹äºæïŒ- Headerã»Footer ã®ãªã³ã¯å ãæŽæ°
| ã¹ã©ãã° | ã¿ã° | åŠç¿æ®µé |
|---|---|---|
setup |
ã»ããã¢ãã, å ¥é | â å ¥é1 |
add-notro-to-astro |
notro, Astro, å ¥é | â å ¥é2 |
content-management |
Notion, ã³ã³ãã³ã管ç | â â åºç€ |
build-and-deploy |
ãããã€, Netlify, Vercel | â â åºç€ |
customize-components |
ã«ã¹ã¿ãã€ãº, Tailwind | â â â å¿çš |
blocks |
â | â â â ãªãã¡ã¬ã³ã¹ |
test-callout-edge-cases |
test, callout | ãã¹ãçšïŒéå ¬éæšå¥šïŒ |
test-markdown-edge-cases |
test, edge-cases | ãã¹ãçšïŒéå ¬éæšå¥šïŒ |
- Notion ã§
test-callout-edge-casesãštest-markdown-edge-casesã®Publicã false ã«å€æŽ â» ã³ãŒã倿ŽäžèŠ
-
blog/[...page].astroã§å ¥éã¿ã°ã®èšäºãããã³çããåæ§ã«1ããŒãžç®äžéšã«è¡šç€ºãããæ€èš- çŸç¶: ãã³çãïŒ
pinnedã¿ã°ïŒãšæ¥ä»ãœãŒãã®ã¿ - æ¡:
å ¥éã¿ã°èšäºããã¯ãããŠã®æ¹ãžãã»ã¯ã·ã§ã³ãšããŠåºå®è¡šç€º
- çŸç¶: ãã³çãïŒ
- ãã³ãã¬ãŒãã®ãã©ã«ãæ§æã¬ã€ã â
src/åãã£ã¬ã¯ããªã®åœ¹å²èª¬æïŒã¿ã°: å ¥éïŒ - remark-nfm ã¹ã¿ã³ãã¢ãã³äœ¿çšã¬ã€ã â Astro ãªãã§äœ¿ããã人åãïŒã¿ã°: remark-nfmïŒ
- Notion ãããã¯å¯Ÿå¿ç¶æ³ãªãã¡ã¬ã³ã¹ â
blocksèšäºãæ¡å ããŠã³ã³ããŒãã³ã + CSS ã¯ã©ã¹äžèЧïŒã¿ã°: ãªãã¡ã¬ã³ã¹ïŒ
-
pageã¿ã° â ããã°äžèЧã»ã¿ã°ããŒãžéè¡šç€ºãæ¥ä»/ã¿ã°/ååŸããé衚瀺ãåºå®ããŒãžïŒAbout, Privacy çïŒã«äœ¿çšã -
pinnedã¿ã° â ããã°äžèЧ1ããŒãžç®ã®ããã³çããã»ã¯ã·ã§ã³ã«è¡šç€ºãéåžžãªã¹ãããã¯é€å€ã -
å ¥éã¿ã° â å ¥éè åãããã¥ãŒããªã¢ã«åºåã®åºæºãšããŠäœ¿çšã - äžèšã
content-managementèšäº ãŸã㯠Docs ããŒãžã§æèš
| # | ã¿ã¹ã¯ | ãã¡ã€ã« | åªå 床 |
|---|---|---|---|
| 1 | testèšäºãéå ¬éïŒNotionæäœïŒ | Notion DB | ðŽ å³æ |
| 2 | index.astro ã«ãããã€ãã¿ã³è¿œå | src/pages/index.astro |
ðŽ é« |
| 3 | index.astro ã®CTAéè€è§£æ¶ + ãã¿ã³åœ¹å²æŽç | src/pages/index.astro |
ðŽ é« |
| 4 | Docs ããŒãžã«ã¯ã€ãã¯ã¹ã¿ãŒã远å | src/pages/contact.astro |
ðŽ é« |
| 5 | Docs ããŒãžã« Vercel/Netlify ãããã€ã¬ã€ã远å | src/pages/contact.astro |
ð äž |
| 6 | Docs ããŒãžã« Notion ã»ããã¢ããã¬ã€ã远å | src/pages/contact.astro |
ð äž |
| 7 | Docs ããŒãžã«ãã¥ãŒããªã¢ã«èªå°ãªã¹ã远å | src/pages/contact.astro |
ð äž |
| 8 | Docs ããŒãžã« API ãªãã¡ã¬ã³ã¹è¿œå | src/pages/contact.astro |
ð äž |
| 9 | Docs ããŒãžã«ãã©ãã«ã·ã¥ãŒãã£ã³ã°è¿œå | src/pages/contact.astro |
ð¡ äœ |
| 10 | /contact/ â /docs/ ãªããŒã + redirect | astro.config.mjs, contact.astro |
ð¡ äœ |
| 11 | index.astroãããã°ãèŠããâãDocs ãèŠããã«å€æŽ | src/pages/index.astro |
ð¡ äœ |
| 12 | ããã°äžèЧã§ãå ¥éãèšäºãåªå 衚瀺 | src/pages/blog/[...page].astro |
ð¡ äœ |
| 13 | OGP ç»åïŒog-default.pngïŒããã³ãã¬ãŒãåãã«æŽæ° | public/og-default.png |
ð¡ äœ |
/ ããã
âââ ãã³ãã¬ãŒãã®äŸ¡å€ææ¡ + ããã〠CTAïŒVercel/NetlifyïŒ
2ã€ã®äœ¿ãæ¹ïŒãã³ãã¬ãŒã / npm ããã±ãŒãžïŒ
3ã¹ãããïŒãã³ãã¬ãŒãèŠç¹ïŒ+ æ©èœäžèЧ
/docs/ DocsïŒçŸåšã® /contact/ïŒ
âââ ã¯ã€ãã¯ã¹ã¿ãŒãïŒ5åã§ãããã€ïŒ
âââ Notion ã»ããã¢ãã
âââ ç°å¢å€æ°
âââ ãããã€ã¬ã€ãïŒVercel / NetlifyïŒ
âââ API ãªãã¡ã¬ã³ã¹ïŒloader, Renderer, classMapïŒ
âââ remark-nfm ã¹ã¿ã³ãã¢ãã³
âââ ãã¥ãŒããªã¢ã«äžèЧïŒâ /blog/ïŒ
âââ ãµã€ãã®ä»çµã¿ïŒçŸåšã®å
容ïŒ
âââ ãã©ãã«ã·ã¥ãŒãã£ã³ã°
/blog/ ããã°ïŒNotion 管çïŒ
âââ å
¥éèšäºïŒsetup, add-notro-to-astro, ...ïŒ
âââ åºç€ã»å¿çšèšäº
âââ ãªãã¡ã¬ã³ã¹èšäºïŒblocks, ...ïŒ
/blog/about/ AboutïŒNotion 管çãpage ã¿ã°ïŒ
/blog/privacy/ ãã©ã€ãã·ãŒããªã·ãŒïŒNotion 管çãpage ã¿ã°ïŒ
/404 404 ããŒãž
èª¿æ»æ¥: 2026-04-16
templates/blogãpackages/é äž (notro-loader / notro-ui / rehype-beautiful-mermaid / remark-nfm / create-notro) ãã©ã䜿ã£ãŠãããã確èªããæ¹åãã€ã³ããæœåºã
- import ãšã³ããªãã€ã³ãã®äœ¿ãåããäžåŸ¹åºã§ãçŽç² TS ãã«ããŒãŸã§
notro-loaderã¡ã€ã³ããåŒã£åŒµã£ãŠãããAstro ã³ã³ããŒãã³ãäžåŒãäžèŠãªçµè·¯ã«ãå·»ã蟌ãŸããŠããã notro-uiã® CLI (notro-ui init/add/update) åæã®ã¯ãŒã¯ãããŒã«å¯Ÿãããã³ãã¬ãŒãåŽã«notro.jsonãç¡ããäžæµã®æŽæ°ãåã蟌ãéçšçµè·¯ãéããŠãããnotro-theme.cssãšpackages/notro-ui/src/templates/theme.cssãããªããããŠãããã©ã¡ãã source of truth ãææ§ã- ãã®ä»ãCLAUDE.md ã®ã¬ã€ããšã®æŽåæ§ã«æ¬ ããç®æãæ£èŠïŒ
<script>å ããžãã¯ã®æªæœåºã@/*ãšã€ãªã¢ã¹äžåšãããã¥ã¡ã³ãèšèŒãšå®è£ ã®ä¹é¢ïŒã
çŽç² TS ãŠãŒãã£ãªã㣠(getPlainText / getMultiSelect / hasTag / buildLinkToPages) 㯠notro-loader/utils ãã import ããã®ãæ£è§£ã ãã以äžã®ç®æã§ã¯ã¡ã€ã³ãšã³ã㪠(notro-loader) ããèªãã§ãããã¡ã€ã³ãšã³ããªã¯ NotroContent.astro ãå«ããããå©çšããªãçµè·¯ãŸã§ Astro ã³ã³ããŒãã³ãã®ããŒããã¹ã«ä¹ã£ãŠããŸãã
| ãã¡ã€ã« | çŸç¶ | ä¿®æ£æ¡ |
|---|---|---|
src/pages/rss.xml.ts:4 |
import { getPlainText, hasTag } from "notro-loader"; |
"notro-loader/utils" ãžå€æŽ |
src/pages/blog/[...page].astro:4 |
import { hasTag } from "notro-loader"; |
"notro-loader/utils" ãžå€æŽ |
src/pages/blog/tag/[tag]/[...page].astro:4 |
import { hasTag } from "notro-loader"; |
"notro-loader/utils" ãžå€æŽ |
src/pages/blog/[slug].astro:3 |
buildLinkToPages, getPlainText, hasTag, NotroContent ãæ··åš |
NotroContent ã®ã¿ "notro-loader"ãæ®ã㯠"notro-loader/utils" ã«åé¢ |
src/components/blog/PostCard.astro:3 |
getPlainText, getMultiSelect from "notro-loader" |
"notro-loader/utils" ãžå€æŽ |
- äžèš 5 ç®æã
notro-loader/utilsçµç±ã«æžãæã -
src/lib/blog.tsã¯æ¢ã«notro-loader/utilsã䜿ããŠããïŒãã ã 4 è¡ç®ã§PropertyPageObjectResponseTypeãnotro-loaderãã type-only import ããŠãããimport typeã«ããã°å®è¡æåœ±é¿ã¯ãªããçŸç¶import typeæå®ãªããªã®ã§èŠç¢ºèªïŒ
CLAUDE.md ã§ã¯ notro-ui ã®éçšã¯ notro-ui init â notro.json çæ â add/update/remove ãšãã CLI ããŒã¹ãšãããŠãããã
templates/blog/notro.jsonã ååšããªãïŒtemplates/blank/ãåæ§ïŒsrc/components/notro/é äžã¯ãã§ã« 28 åã®.astro+colors.ts+index.tsãæ±ããŠããããnotro-ui update --allã®æµå ¥çµè·¯ãç¡ã
çµæãšããŠãpackages/notro-ui/src/templates/ (source of truth) ãžã®ä¿®æ£ããã³ãã¬ãŒããžèªåçã«åæ ãããªãã
-
templates/blog/ãštemplates/blank/ã§notro-ui initçžåœã®notro.jsonãçæããŠã³ãããoutDir,stylesDir, installed components list ãå®çŸ©
-
src/components/notro/index.tsã«æ®ã£ãŠãããSite-customized components (differ from notro-ui defaults)ãã³ã¡ã³ãããnotro.jsonåŽã®ãupdate é€å€ãªã¹ããor å.astroå é ã®// notro-ui: customizedããŒã«ãŒãšããŠåœ¢åŒåãããCLI ãå·®åãå€å¥ã§ããããã«ããã
3. notro-theme.css ãš packages/notro-ui/src/templates/theme.css ã®ããªããïŒåªå
床: ð äžïŒ
diff çµæ:
templates/blog/src/styles/notro-theme.cssã¯ã¿ã¹ã¯ãªã¹ãé¢é£ã® CSS ã@utilityå±€ïŒ111â127 è¡ïŒã«çœ®ãããŠãããã³ã¡ã³ãã§ãcascade precedence ã®èª¬æãã远èšãããŠãããpackages/notro-ui/src/templates/theme.css(source of truth) ã§ã¯ã¿ã¹ã¯ãªã¹ããå¥ã®äœçœ®ïŒ182â192 è¡ïŒã«çœ®ãããã³ã¡ã³ããç°¡çŽ ã
ã©ã¡ããææ°ã®æå³ããæ±ºããã«å·®åãæ®ã£ãŠããã
- source of truth ã
packages/notro-ui/src/templates/theme.cssãšå®ããããã°åŽã®ä¿®æ£ïŒã¿ã¹ã¯ãªã¹ãã® cascade åé¡ã® fixïŒãäžæµã«åã蟌ã - åã蟌ã¿åŸã
notro-ui update --all --yesçžåœã®æäœã§äžæµãåæïŒnotro.jsonæŽååŸã«å¯èœïŒ - åã蟌ã¿å¯Ÿè±¡ã®å·®å:
- ã¿ã¹ã¯ãªã¹ãèŠåã®
@utilityå±€é 眮 .notro-markdown .contains-task-list/.task-list-item/input[type=checkbox]ã®ã»ã¬ã¯ã¿è©³çŽ°åºŠã«é¢ããã³ã¡ã³ã
- ã¿ã¹ã¯ãªã¹ãèŠåã®
templates/blog/package.json:
"notro-loader": "^0.0.3",
"rehype-beautiful-mermaid": "^0.0.2",
"beautiful-mermaid": "^1.1.3", â ?
...
-
beautiful-mermaidã®å¿ èŠæ§:rehype-beautiful-mermaidã® peerDep ã§ã¯ãªãå¯èœæ§ãããïŒæªç¢ºèªïŒãçŽæ¥ import ããŠããç®æãç¡ããã°åé€ã -
remark-nfmã®æ±ã: çŸç¶remarkPluginsã«è¿œå ãã圢ã§ç¬ç«å©çšããŠããªãã®ã§notro-loaderæšç§»äŸåã®ãŸãŸã§ OKããã ã CLAUDE.md ã®èšèŒéãpreprocessNotionMarkdownçãçŽæ¥åŒã¶å Žåã¯packages/remark-nfmãdependenciesã«ææ Œãããå¿ èŠããããèŠå€æã - ã«ãŒã
pnpm.overridesã«ãã workspace 匷å¶: æå³ã¯ããã³ãã¬ãŒãã¯å ¬éçæå®ã®ãŸãŸãã¢ãã¬ãéçºæã¯ workspace:* ã«è§£æ±ºãã§åççããã ãnotro-uiã»remark-nfmã»create-notro㯠overrides ã«å ¥ã£ãŠããªããå¿ èŠã«å¿ããŠæ¡åŒµãæ€èšã
notro-loaderã®ã³ã³ããŒãã³ã: CLAUDE.md ã¯components/ (NotroContent, DatabaseCover, DatabaseProperty)ãšæžããŠããããå®è£ ã¯packages/notro-loader/src/components/NotroContent.astroã®ã¿ãDatabaseCoverã¯templates/blog/src/components/blog/DatabaseCover.astroã«ãã³ãã¬ãŒãåŽã§èªåå®è£ ã- CLAUDE.md ã®è©²åœèšè¿°ãã
NotroContentã®ã¿ãã«èšæ£ããŸãã¯notro-loaderåŽã«DatabaseCover/DatabasePropertyã埩掻ãããïŒã©ã¡ãã source ã«ããããæ±ºããïŒã @/*path alias:src/components/notro/index.ts:6ã®ã³ã¡ã³ãäŸã«import { notroComponents } from '@/components/notro';ãšããããtsconfig.jsonã«pathsãæªå®çŸ©ã§ãå®éã® import ã¯å šãŠçžå¯Ÿãã¹ã-
tsconfig.jsonã«compilerOptions.baseUrl+paths: { "@/*": ["src/*"] }ã远å ããŠçµ±äžããããã³ã¡ã³ãåŽãçžå¯Ÿãã¹ã«çŽãã
6. Astro å®è£ ãã¹ããã©ã¯ãã£ã¹ïŒCLAUDE.md §Astro ImplementationïŒãšã®æŽåïŒåªå 床: ð¡ äœïŒ
Header.astroã®<script>ããžãã¯æªæœåº: 89â102 è¡ã® DOM æäœ 15 è¡ãCLAUDE.md ã¯ãè€éãªå Žåã¯src/lib/ã«.tsãšããŠæœåºããšèŠå®ã-
src/lib/header-menu.tsã«initHeaderMenu()ãåãåºããHeader.astroããã¯import { initHeaderMenu } from "@/lib/header-menu"; initHeaderMenu();ã®ã¿ã«ããã䜵ããŠvitestã§aria-expandedã»hiddenã¯ã©ã¹ã®ãã°ã«æåã®åäœãã¹ãã远å ã src/lib/nav.tsã®ãã¹ã:isActive㯠public export ã ãåäœãã¹ãäžåšïŒblog.tsã ããblog.test.tsãæã€ïŒã-
src/lib/nav.test.tsã远å ïŒtrailing slash æ£èŠåã®ãšããžã±ãŒã¹ïŒã
templates/blog ãæåŸ
ãã packages/ API ã¯ä»¥äžãçŸç¶ã®å®è£
ãšçªãåãããçµæ:
| ããã±ãŒãž | ãšã³ã㪠| blog ã§ã®å©çš | ç¶æ |
|---|---|---|---|
notro-loader |
. |
NotroContent, loader, notroProperties, pageWithMarkdownSchema, buildLinkToPages, makeHtmlElement, å |
OKïŒãã ã §1 ã®èª€çšããïŒ |
notro-loader |
./utils |
getPlainText, getMultiSelect, hasTag |
äžéšã®ã¿å©çšïŒÂ§1ïŒ |
notro-loader |
./integration |
notro() |
OK |
notro-loader |
./image-service |
notionImageService |
OK |
notro-ui |
CLI | notro-ui init/add/update |
æªéçšïŒÂ§2ïŒ |
remark-nfm |
. |
ïŒnotro-loader çµç±ã®æšç§»äŸåã®ã¿ïŒ |
OK |
rehype-beautiful-mermaid |
. |
rehypeMermaid ã rehypePlugins ã«è¿œå |
OK |
create-notro |
CLI | ïŒå©çšè åããblog å ã§ã¯æªäœ¿çšïŒ | OK |
| # | ã¿ã¹ã¯ | ãã¡ã€ã« | åªå 床 |
|---|---|---|---|
| M1 | notro-loader â notro-loader/utils ãžã® import åæ¿ïŒ5 ãã¡ã€ã«ïŒ |
§1 ã®è¡šãåç § | ðŽ é« |
| M2 | templates/blog/notro.json ãçæ (notro-ui init) |
templates/blog/notro.jsonïŒæ°èŠïŒ |
ðŽ é« |
| M3 | templates/blank/notro.json ãçæ |
templates/blank/notro.jsonïŒæ°èŠïŒ |
ðŽ é« |
| M4 | notro-theme.css ã®ããªãããäžæµã«çµ±åãäžæµåæ |
packages/notro-ui/src/templates/theme.css ã»ã |
ð äž |
| M5 | ã«ã¹ã¿ãã€ãºæžã¿ã³ã³ããŒãã³ãã®ããŒã«ãŒæŽå | src/components/notro/*.astro |
ð äž |
| M6 | beautiful-mermaid äŸåã®èŠåŠç¢ºèªãšå逿€èš |
templates/blog/package.json |
ð äž |
| M7 | blog.ts:4 ã® PropertyPageObjectResponseType ã import type ã« |
src/lib/blog.ts |
ð¡ äœ |
| M8 | CLAUDE.md ã® components èšè¿°ãå®è£ ã«åãããŠè𿣠| CLAUDE.md |
ð¡ äœ |
| M9 | tsconfig.json ã« @/* path alias 远å ïŒor ã³ã¡ã³ãä¿®æ£ïŒ |
templates/blog/tsconfig.json, src/components/notro/index.ts |
ð¡ äœ |
| M10 | Header.astro ã® <script> ã src/lib/header-menu.ts ãžæœåºïŒãã¹ã |
src/components/Header.astro, src/lib/header-menu.ts |
ð¡ äœ |
| M11 | src/lib/nav.ts ã®ãã¹ã远å |
src/lib/nav.test.tsïŒæ°èŠïŒ |
ð¡ äœ |
èª¿æ»æ¥: 2026-04-16 äžèšã®ã¢ãã¬ãå©çšã¬ãã¥ãŒãèžãŸãããã³ãã¬ãŒãå©çšè èŠç¹ã§æ°ã«ãªãç¹ã远å ã 芳ç¹: (A) ãŠãŒã¶ãŒäœéš, (B) ãã³ãã¬ãŒãããå§ãããšãã®ãããããã, (C) ã«ã¹ã¿ãã€ãºããããã
ãã³ãã¬ãŒãã clone ãããŠãŒã¶ãŒã config.ts ãç·šéããŠããäžèšãå€ãããªãã
| ãã¡ã€ã« / è¡ | å 容 | ä¿®æ£æ¡ |
|---|---|---|
astro.config.mjs:29 |
site: "https://example.com" |
README ãš .env.example ã§å¿
ã倿Žããããæç€ºããŸã㯠SITE_URL ç°å¢å€æ°ããèªã |
src/pages/404.astro:5 |
title="ããŒãžãèŠã€ãããŸãã â Notro Tail" |
config.site.name ã䜿ã |
src/pages/blog/[...page].astro:41 |
description ã« notro ã®äœ¿ãæ¹ã解説ããŸãã ãããŒãã³ãŒã |
config.blog.description çã«å€åºã |
src/pages/blog/tag/[tag]/[...page].astro:42 |
h1 ã® text-gray-900 ãããŒã¯ã¢ãŒãæªå¯Ÿå¿ïŒnt-text æªäœ¿çšïŒ |
nt-* ããŒã¯ã³ã«çµ±äž |
- åããŒãã³ãŒãç®æã
config.tsçµç±ã«çµ±äžãã倿Žå¿ãæ€ç¥ã®ããã«config.site.name === "My Site"ãsite: example.comãæ®ãããŸãŸã®å Žåã« build ã§èŠåããastro:build:startããã¯ã远å ããæ¡ãããã
Layout.astro:28 㯠import.meta.env.PUBLIC_GTAG_ID ã䜿ãã
SeoHead.astro:54 㯠config.analytics.gaMeasurementId ã䜿ã£ãŠããã
äž¡æ¹èšå®ããå ŽåãGA ã¿ã°ã 2 åæ¿å
¥ãããïŒPartytown çµç±ã§éè€èšæž¬ïŒã
- ã©ã¡ããäžæ¹ïŒæšå¥š:
config.analytics.gaMeasurementIdâ èšå®ã 1 ç®æã§æžãïŒã«çµ±äžããLayout.astroã® GA ãããã¯ã¯åé€ -
env.d.tsã®PUBLIC_GTAG_IDèšè¿°ãæŽç
border-gray-200 / text-gray-600 / text-gray-500 / text-gray-300 ãçŽæžãã§ã
nt-border / nt-text-* / dark: ã¯ã©ã¹ãå
šããªããä»ã³ã³ããŒãã³ããšèŠãç®ãåã¿åããªãã
-
nt-border+nt-text-60ãªã©ã®ããŒã¯ã³ã«çœ®æããä»ã³ã³ããŒãã³ããšåãç®ç·ã«æãã
NOTION_TOKEN æªèšå®ã®ãŸãŸ npm run dev ãå®è¡ãããšãNotion API ãã 401 ãè¿ã£ãŠãã«ã倱æããããã¡ãã»ãŒãžãæè¡çã
-
loader()åŒã³åºãåã«import.meta.env.NOTION_TOKEN/ ããŒã¿ãœãŒã¹ ID æªèšå®æã« æ¥æ¬èª/è±èªã®åããããããšã©ãŒãæããïŒcontent.config.tsã®åé ã§ãã§ãã¯ïŒ -
.envãã¡ã€ã«èªäœãç¡ãå Žåã®ã¡ãã»ãŒãžãæŽå
CLAUDE.md ã«ã¯ NOTION_DATASOURCE_ID_BLOG ãåªå
ã§ãNOTION_DATASOURCE_ID 㯠fallback ãšèšèŒãããŠãããã
.env.example ã«ã¯ NOTION_DATASOURCE_ID ããæžããŠããªããcontent.config.ts:8 ã§ãäž¡æ¹ãèªãã§ããã
-
.env.exampleã«NOTION_DATASOURCE_ID_BLOGïŒæšå¥šïŒãšNOTION_DATASOURCE_IDïŒfallbackïŒã®äž¡æ¹ãèšèŒãã䜿ãåããã³ã¡ã³ã - README ã®ç°å¢å€æ°ã»ã¯ã·ã§ã³ãåãããŠæŽæ°
config.site.lang: "ja" / locale: "ja_JP" ãèšå®å¯èœã§ããã«ããããããã
UI äžã®æ¥æ¬èªã©ãã«ïŒãããã°ãããã³çãããå
¥éããå€ãèšäºããæ°ããèšäºããããã°äžèЧããã³ã³ãã³ããžã¹ãããããã¡ãã¥ãŒãéãããèšäºã¯ãŸã ãããŸãããããããŒãžãèŠã€ãããŸããããªã©ïŒã¯å
šãŠããŒãã³ãŒãã
-
src/i18n/ja.ts/en.tsã®ãããªèŸæžãã¡ã€ã«ã«åãåºããconfig.site.langã§åãæ¿ãã - æäœéãæ¥æ¬èª/è±èªã® 2 èšèªã¯å ¬åŒãµããŒãïŒi18n ã©ã€ãã©ãªãå ¥ããã»ã©ã®èŠæš¡ã§ã¯ãªãã®ã§åçŽãªãªããžã§ã¯ãèŸæžã§ååïŒ
blog.ts:65 ã§ hasTag(..., "å
¥é") ãšçŽæžããconfig.blog.internalTags ã§ "page" / "pinned" ã¯ç®¡çãããŠããã®ã«ã"å
¥é" ã ã奿±ãã
-
config.blog.beginnerTag: "å ¥é"ã®ããã«èšå®å¯èœã«ããããŸãã¯internalTagsã®æ±ããåºã㊠pinned/beginner ãåºå¥ããæ§é ã«ãã
config.ts ã®åæå€:
name: "My Site", author: "Your Name", description: "My site powered by Notion and Astro."ãããã倿ŽããªããŸãŸãã«ãããŠãèŠåã¯åºããæ¬çªãµã€ãã« "My Site" ã衚瀺ããããOGP ç»åã®ã¿ã€ãã«ã "My Site" ã®ãŸãŸå ¬éãããã
-
config.tsã«/** @required Replace this value before deploying. */ç㪠JSDoc ãä»ããastro:build:startãastro:build:doneã§name === "My Site"çãªãèŠå - README / .env.example ã«ãæåã«å¿ ã倿Žãããã®ããã§ãã¯ãªã¹ããæ²èŒ
B2. README.md ãã¢ãã¬ãå
ããã¥ã¡ã³ããšå©çšè
ããã¥ã¡ã³ããå
Œä»»ããŠããïŒð äžïŒ
åé : "template/ is the Astro 6 starter template and reference implementation that ships with the monorepo."
ãã®èšè¿°ã¯ create-notro çµç±ã§ clone ããå©çšè
ã«ãšã£ãŠã¯æ··ä¹±ãæãïŒããã¯ããã¢ãã¬ãã§ã¯ãªãïŒã
- ãã³ãã¬ãŒãé
åžæã¯å©çšè
åãã® README ã«çœ®æããä»çµã¿ã«ããïŒäŸ:
README.template.mdãçšæãcreate-notroæã«ãªããŒã ããŸãã¯ã¢ãã¬ã README ãREADME.internal.mdå矩ã«ããŠãªãªãŒã¹æã«é€å€ïŒ - å©çšè åã README ã«ã¯ãGetting Started â Notion ã»ããã¢ãã â ã«ã¹ã¿ãã€ãº â ãããã€ãã® 4 ç« ç«ãŠã§åæ§æ
çŸç¶ãREADME ãšãªããžããªå ã« "Notion ã§ DB ãäœæããŠãã ãã" ãšããã ãã§ã Notion ãã³ãã¬ãŒã DB ãã¯ã³ã¯ãªãã¯ã§è€è£œã§ãããªã³ã¯ããªããåèŠãŠãŒã¶ãŒã¯ã¹ããŒãå®çŸ©ãæå ¥åããå¿ èŠãããã
- Notion ã®å ±æãã³ãã¬ãŒãïŒnotion.site/... ã®è€è£œãªã³ã¯ïŒãçšæããREADME / Docs / create-notro ã®æçµã¡ãã»ãŒãžã«èšèŒ
- ã¹ããŒãå®çŸ©ã
docs/notion-schema.mdã§åã»åã»éžæè¢ã»ãµã³ãã«å€ä»ãã§æç€º
.env.example ã§ NOTION_TOKEN ã®ååŸå
URL ãããã®ã¿ã
ãIntegration ã DB ã« connect ãããæé ïŒDB ã®å³äžã¡ãã¥ãŒ â Connections â èªåã® Integration ãéžã¶ïŒãæžãããŠããªãããã
token ã ãèšå®ã㊠"404 object_not_found" ã«ééããå©çšè
ãå€çºããã
- README / Docs ã«æé ä»ãã¹ã¯ãªãŒã³ã·ã§ãã or ç®æ¡æžãæé ã远å
templates/blog/CHANGELOG.md ã¯ã¢ãã¬ãã®ãªãªãŒã¹å±¥æŽã
templates/blog/LICENSE 㯠mosugi å矩㮠MITãclone ããå©çšè
ã®äœæ¥ã«ã¯äžèŠ or ãã€ãºã
-
create-notroçµç±ã§ scaffold ããéãããããé€å€ãŸãã¯å©çšè åã«çœ®æããä»çµã¿ãå ¥ãã -
packages/create-notroã®ãã³ãã¬ãŒãã³ããŒåŠçã§.gitignore/renameèšå®ãæ€èš
public/og-default.png ãååšããªãïŒpublic/ 㯠favicon.svg ãš katex/ ã®ã¿ïŒã
SeoHead.astro:29 㯠/og-default.png ãåç
§ããŠããã404 ãè¿ãã
-
public/og-default.pngããã¬ãŒã¹ãã«ãç»åãšããŠå梱 - ããã㯠Astro ã® OG image çæãã©ã°ã€ã³ïŒ
astro-og-canvasçïŒãçµã¿èŸŒã¿ãconfig.site.nameããèªåçæããéžæè¢ãæç€º
README ã«ã¯ãããã€ãã¿ã³ããããããããããŒãž (index.astro) ã«ã¯ç¡ãïŒããã¯äžäœã® TODO 1-1 ã§ãè§ŠããããŠããïŒã
- æ¢å TODO §1 ãšæŽåãåãã€ã€å¯Ÿå¿
index.ts ã®ã³ã¡ã³ãã§ãSite-customized componentsããšãDefault notro-ui components (unmodified)ããåºå¥ããŠãããã
å®ãã¡ã€ã«ã¯åããã£ã¬ã¯ããªã«æ··åšãnotro-ui update ãïŒå°æ¥å°å
¥ãããŠãïŒã©ããäžæžãå¯ãšã¿ãªãã¹ããå€å¥ã§ããªãã
- å
.astroãã¡ã€ã«ã®å é ã«{/* notro-ui: customized */}/{/* notro-ui: default */}ã®ããŒã«ãŒè¡ã眮ããnotro-ui updateã default ã®ã¿äžæžããã仿§ã«ãã - ãŸãã¯ã
src/components/notro/customized/ãšsrc/components/notro/defaults/ã§ãã£ã¬ã¯ããªåé¢
å©çšè
ããCallout ã ãèªäœã³ã³ããŒãã³ãã«ãããããšæã£ããšãã
<NotroContent components={{ ...notroComponents, callout: MyCallout }} /> ãš spread ããå¿
èŠããããã
ãã®äœ¿ãæ¹ã¯ index.ts ã®ã³ã¡ã³ã 10 è¡ç®ã«ããæžãããŠããªãã
-
src/components/notro/README.mdïŒãŸã㯠docsïŒã§æé »ã®äžæžããã¿ãŒã³ 3 çš®ãäŸç€º- 1 ã€å·®ãæ¿ãïŒcallout ã®ã¿ïŒ
- è²ã ãå€ãããïŒclassMap ã§å¯Ÿå¿å¯èœãªã±ãŒã¹ïŒ
- å šé¢çœ®æïŒç¬èªã® components èŸæžãäœãïŒ
NotroContent 㯠classMap prop ã§ãã³ã³ããŒãã³ããå·®ãæ¿ããã« Tailwind ã¯ã©ã¹ã ãæ³šå
¥ãã§ããä»çµã¿ãæã£ãŠããããblog ãã³ãã¬ãŒãã¯å
šé¢çã«èªäœ .astro ãäœã£ãŠããã
- ã軜床ã«ã¹ã¿ãã€ãºã¯ classMapãé床ã«ã¹ã¿ãã€ãºã¯ components spreadãå šé¢ã¯ç¬èª index.tsããšãã3 段éã®ã«ã¹ã¿ãã€ãºãã¹ã Docs ã§æç€º
-
classMapã䜿ã£ããµã³ãã«ã 1 ã€ä»¥äžãã³ãã¬ãŒãã«æ®ãïŒ[slug].astroã§<NotroContent classMap={{ p: "text-lg" }} ... />çãªäŸïŒ
global.css ã® @media (prefers-color-scheme: dark) ã®ã¿å¯Ÿå¿ãdata-theme 屿§ã class="dark" ããŒã¹ã®åæ¿ã€ã³ãã©ãç¡ãããã
ãããŒã¯ã¢ãŒããã¿ã³ãä»ãããããšæã£ãå©çšè
㯠CSS èšèšããæžãçŽãå¿
èŠãããã
- Tailwind 4 ã®
@variant darkã[data-theme="dark"]ã«åãæ¿ããHeader.astroã«ããŒããã°ã«ãã¿ã³ãé圢ãšããŠçœ®ã -
localStorage+ ã·ã¹ãã èšå®ãã©ãŒã«ããã¯ã®æå°å®è£ ãsrc/lib/theme.tsãšããŠçšæ
[...page].astroïŒpinned + beginner ã®è¡šç€º/é衚瀺ïŒãindex.astroïŒpinned ã®æç²ïŒãblog.tsïŒpinned / beginner ã®å€å®ïŒãconfig.tsïŒinternalTagsïŒã
4 ç®æã«ããžãã¯ãåºãã£ãŠããããpinned è¡šç€ºãæ¢ããããã®ãããªåçŽãªèŠæ±ã§ãè€æ°ãã¡ã€ã«ä¿®æ£ãå¿
èŠã
- 仿§ã
src/lib/blog-sections.tsã«éçŽããgetSections(posts, { pinnedTag, beginnerTag })ã®ãã㪠1 颿°ã§ return ãã圢ã«ãªãã¡ã¯ã¿ -
config.blog.sections: [{ tag: "pinned", label: "ãã³çã", showOnFirstPageOnly: true }, ...]ã®ãããªèšå®é§åã«å¯ãã
config.navigation.nav: { href, label }[] ã¯å¹³åŠé
åã®ã¿ãããããããŠã³ãexternalïŒtarget="_blank"ïŒãicon æå®ãã§ããªãã
- åã
{ href: string; label: string; external?: boolean; children?: NavItem[] }ã«æ¡åŒµ - Header.astro ã§ååž°ã¬ã³ããªã³ã°ïŒdepth 2 çšåºŠãŸã§ïŒ
224 è¡ã® @theme/@utility ã« Notion ã®è²åïŒgray, brown, orange, ...ïŒãçŽæžããããŠããã
ããã³ã¯ã ãå¥ã®è²ã«ããããçšåºŠã®èª¿æŽã§ã CSS ãçŽæ¥ç·šéããªããã°ãªããªãã
- å
šè²ã CSS 倿°ïŒ
--notro-color-pink-text,--notro-color-pink-bg, ...ïŒåãã 倿°äžæžãã ãã§ããŒãã«ã©ãŒãå€ããããããã«ãã -
notro-uiåŽïŒsource of truthïŒã§ãåã倿°åãè¡ã
C8. <script> ããŸããã StateïŒããŒã¯ã¢ãŒããã¡ãã¥ãŒééïŒã®å
±æææ®µãªãïŒð¡ äœïŒ
Header.astro ã®ã¢ãã€ã«ã¡ãã¥ãŒééããžãã¯ããå°æ¥ã®ããŒã¯ã¢ãŒããã°ã«ããAstro ã® is:inline ã¹ã¯ãªããã ãã§å®è£
ããããšå
±æãã«ããã
-
src/lib/ui-state.tsã«å°ããªã€ãã³ããã¹ïŒCustomEventããŒã¹ã§ååïŒã眮ããåãã°ã«ããããä»ããŠç¶æ ããããšãããèšèšãã¿ãŒã³ã瀺ã
src/components/notro/colors.ts 㯠tailwind-variants ããŒã¹ã®ã«ã©ãŒããªã¢ã³ãå®çŸ©ã ããã©ãããã©ãåŒã°ããŠãããïŒStyledSpan.astro, ColoredParagraph.astro çµç±ïŒã®èª¬æã README ã«ç¡ããã«ã¹ã¿ãã€ãºæã®å
¥å£ãèŠããªãã
-
src/components/notro/README.mdã«ã«ã©ãŒã·ã¹ãã ã® overview ã远å -
notroColors/NotroColoråãnotro-uiåŽã« export ããéžæè¢ãæ€èš
| # | ã¿ã¹ã¯ | ãã¡ã€ã« | èŠ³ç¹ | åªå 床 |
|---|---|---|---|---|
| U1 | 404/astro.config/[...page] çã®ããŒãã³ãŒãç®æã config.ts çµç±ã« | A1 ã®è¡š | A | ðŽ é« |
| U2 | GA äºéèšæž¬ã®è§£æ¶ïŒPUBLIC_GTAG_ID or config ã®ã©ã¡ããã«çµ±äžïŒ | Layout.astro, SeoHead.astro, env.d.ts |
A | ðŽ é« |
| U3 | åæå€ (My Site / Your Name / example.com) æ®åæã®ãã«ãèŠå | astro.config.mjsïŒintegration hookïŒ |
B | ðŽ é« |
| U4 | Notion ãã³ãã¬ãŒã DB å ±æãªã³ã¯ãšæ¥ç¶æé ã®ããã¥ã¡ã³ãå | README.md, docs/ |
B | ðŽ é« |
| U5 | src/components/notro/ ã«ã¹ã¿ã /ããã©ã«ãããŒã«ãŒå°å
¥ |
å .astro å
é |
C | ðŽ é« |
| U6 | Pagination.astro ã nt-* ããŒã¯ã³ + dark mode 察å¿ã«çµ±äž |
src/components/blog/Pagination.astro |
A | ð äž |
| U7 | ç°å¢å€æ°æªèšå®æã®ãšã©ãŒã¡ãã»ãŒãžæ¹å | src/content.config.ts åé |
A | ð äž |
| U8 | .env.example ã« NOTION_DATASOURCE_ID_BLOG ãæèš |
.env.example, README.md |
A | ð äž |
| U9 | README ããã³ãã¬ãŒãå©çšè åãã«åæ§æïŒã¢ãã¬ãèšè¿°ãåé¢ïŒ | templates/blog/README.md |
B | ð äž |
| U10 | CHANGELOG/LICENSE ããã³ãã¬ãŒã scaffold æã«é€å€/眮æ | packages/create-notro/src/index.ts |
B | ð äž |
| U11 | ã«ã¹ã¿ãã€ãºãã¹ 3 段éïŒclassMap â spread â ç¬èª indexïŒã Docs ã«èšèŒ | docs/, src/components/notro/ |
C | ð äž |
| U12 | ããŒã¯ã¢ãŒããã°ã«çšã€ã³ãã©ïŒdata-theme + localStorageïŒã®é圢 |
global.css, src/lib/theme.ts, Header.astro |
C | ð äž |
| U13 | pinned/beginner ããžãã¯ã src/lib/blog-sections.ts ã«éçŽ |
src/lib/blog-sections.tsïŒæ°èŠïŒä» |
C | ð äž |
| U14 | UI ã©ãã« i18n èŸæžå (ja.ts / en.ts) | src/i18n/ïŒæ°èŠïŒ |
A | ð¡ äœ |
| U15 | "å ¥é" ã¿ã°åã config ã«ç§»å | src/config.ts, src/lib/blog.ts |
A | ð¡ äœ |
| U16 | public/og-default.png ã忢± or èªåçæ |
public/og-default.png |
B | ð¡ äœ |
| U17 | ããã²ãŒã·ã§ã³åã®æ¡åŒµïŒexternal, childrenïŒ | src/config.ts, src/components/Header.astro |
C | ð¡ äœ |
| U18 | notro-theme.css ã«ã©ãŒãã¬ããã® CSS 倿°å |
packages/notro-ui/src/templates/theme.css, ããã°åŽ |
C | ð¡ äœ |
| U19 | src/components/notro/README.md 远å ïŒã«ã©ãŒ + ã«ã¹ã¿ãã€ãºïŒ |
src/components/notro/README.mdïŒæ°èŠïŒ |
C | ð¡ äœ |