fix: add _key to all PortableText blocks and spans
PortableText blocks in EmDash require a _key field. Added to widgetAreas, sections, and all content entries. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
267
seed/seed.json
267
seed/seed.json
@@ -6,18 +6,20 @@
|
|||||||
"description": "A blog with posts and pages - fully editable via EmDash admin",
|
"description": "A blog with posts and pages - fully editable via EmDash admin",
|
||||||
"author": "EmDash"
|
"author": "EmDash"
|
||||||
},
|
},
|
||||||
|
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "My Blog",
|
"title": "My Blog",
|
||||||
"tagline": "Thoughts on building for the web"
|
"tagline": "Thoughts on building for the web"
|
||||||
},
|
},
|
||||||
|
|
||||||
"collections": [
|
"collections": [
|
||||||
{
|
{
|
||||||
"slug": "homepage",
|
"slug": "homepage",
|
||||||
"label": "Homepage",
|
"label": "Homepage",
|
||||||
"labelSingular": "Homepage",
|
"labelSingular": "Homepage",
|
||||||
"supports": ["drafts", "revisions", "search"],
|
"supports": [
|
||||||
|
"drafts",
|
||||||
|
"revisions",
|
||||||
|
"search"
|
||||||
|
],
|
||||||
"singleton": true,
|
"singleton": true,
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@@ -197,7 +199,12 @@
|
|||||||
"slug": "posts",
|
"slug": "posts",
|
||||||
"label": "Posts",
|
"label": "Posts",
|
||||||
"labelSingular": "Post",
|
"labelSingular": "Post",
|
||||||
"supports": ["drafts", "revisions", "search", "seo"],
|
"supports": [
|
||||||
|
"drafts",
|
||||||
|
"revisions",
|
||||||
|
"search",
|
||||||
|
"seo"
|
||||||
|
],
|
||||||
"commentsEnabled": true,
|
"commentsEnabled": true,
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@@ -229,7 +236,11 @@
|
|||||||
"slug": "pages",
|
"slug": "pages",
|
||||||
"label": "Pages",
|
"label": "Pages",
|
||||||
"labelSingular": "Page",
|
"labelSingular": "Page",
|
||||||
"supports": ["drafts", "revisions", "search"],
|
"supports": [
|
||||||
|
"drafts",
|
||||||
|
"revisions",
|
||||||
|
"search"
|
||||||
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"slug": "title",
|
"slug": "title",
|
||||||
@@ -252,18 +263,28 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"taxonomies": [
|
"taxonomies": [
|
||||||
{
|
{
|
||||||
"name": "category",
|
"name": "category",
|
||||||
"label": "Categories",
|
"label": "Categories",
|
||||||
"labelSingular": "Category",
|
"labelSingular": "Category",
|
||||||
"hierarchical": true,
|
"hierarchical": true,
|
||||||
"collections": ["posts"],
|
"collections": [
|
||||||
|
"posts"
|
||||||
|
],
|
||||||
"terms": [
|
"terms": [
|
||||||
{ "slug": "development", "label": "Development" },
|
{
|
||||||
{ "slug": "design", "label": "Design" },
|
"slug": "development",
|
||||||
{ "slug": "notes", "label": "Notes" }
|
"label": "Development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "design",
|
||||||
|
"label": "Design"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "notes",
|
||||||
|
"label": "Notes"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -271,16 +292,29 @@
|
|||||||
"label": "Tags",
|
"label": "Tags",
|
||||||
"labelSingular": "Tag",
|
"labelSingular": "Tag",
|
||||||
"hierarchical": false,
|
"hierarchical": false,
|
||||||
"collections": ["posts"],
|
"collections": [
|
||||||
|
"posts"
|
||||||
|
],
|
||||||
"terms": [
|
"terms": [
|
||||||
{ "slug": "webdev", "label": "Web Development" },
|
{
|
||||||
{ "slug": "opinion", "label": "Opinion" },
|
"slug": "webdev",
|
||||||
{ "slug": "tools", "label": "Tools" },
|
"label": "Web Development"
|
||||||
{ "slug": "creativity", "label": "Creativity" }
|
},
|
||||||
|
{
|
||||||
|
"slug": "opinion",
|
||||||
|
"label": "Opinion"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tools",
|
||||||
|
"label": "Tools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "creativity",
|
||||||
|
"label": "Creativity"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"bylines": [
|
"bylines": [
|
||||||
{
|
{
|
||||||
"id": "byline-editorial",
|
"id": "byline-editorial",
|
||||||
@@ -294,19 +328,29 @@
|
|||||||
"isGuest": true
|
"isGuest": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"menus": [
|
"menus": [
|
||||||
{
|
{
|
||||||
"name": "primary",
|
"name": "primary",
|
||||||
"label": "Primary Navigation",
|
"label": "Primary Navigation",
|
||||||
"items": [
|
"items": [
|
||||||
{ "type": "custom", "label": "Home", "url": "/" },
|
{
|
||||||
{ "type": "custom", "label": "About", "url": "/pages/about" },
|
"type": "custom",
|
||||||
{ "type": "custom", "label": "Posts", "url": "/posts" }
|
"label": "Home",
|
||||||
|
"url": "/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "custom",
|
||||||
|
"label": "About",
|
||||||
|
"url": "/pages/about"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "custom",
|
||||||
|
"label": "Posts",
|
||||||
|
"url": "/posts"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"widgetAreas": [
|
"widgetAreas": [
|
||||||
{
|
{
|
||||||
"name": "sidebar",
|
"name": "sidebar",
|
||||||
@@ -363,28 +407,41 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "A blog about software, design, and the occasional stray thought."
|
"text": "A blog about software, design, and the occasional stray thought.",
|
||||||
|
"_key": "span-1-0-2946467384059603003"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-7796766743032834174"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"sections": [
|
"sections": [
|
||||||
{
|
{
|
||||||
"slug": "newsletter-signup",
|
"slug": "newsletter-signup",
|
||||||
"title": "Newsletter Signup",
|
"title": "Newsletter Signup",
|
||||||
"description": "A call-to-action block for newsletter subscriptions",
|
"description": "A call-to-action block for newsletter subscriptions",
|
||||||
"keywords": ["newsletter", "subscribe", "email", "cta"],
|
"keywords": [
|
||||||
|
"newsletter",
|
||||||
|
"subscribe",
|
||||||
|
"email",
|
||||||
|
"cta"
|
||||||
|
],
|
||||||
"source": "theme",
|
"source": "theme",
|
||||||
"content": [
|
"content": [
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
"style": "h3",
|
"style": "h3",
|
||||||
"children": [{ "_type": "span", "text": "Stay in the loop" }]
|
"children": [
|
||||||
|
{
|
||||||
|
"_type": "span",
|
||||||
|
"text": "Stay in the loop",
|
||||||
|
"_key": "span-1-0--1631596006100928859"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_key": "block-1--2556677380635054136"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -392,9 +449,11 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "Get notified when new posts are published. No spam, unsubscribe anytime."
|
"text": "Get notified when new posts are published. No spam, unsubscribe anytime.",
|
||||||
|
"_key": "span-1-0--1259693133588870057"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-2350431564039470076"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -402,7 +461,11 @@
|
|||||||
"slug": "about-author",
|
"slug": "about-author",
|
||||||
"title": "About the Author",
|
"title": "About the Author",
|
||||||
"description": "Brief author bio for use in posts or pages",
|
"description": "Brief author bio for use in posts or pages",
|
||||||
"keywords": ["author", "bio", "about"],
|
"keywords": [
|
||||||
|
"author",
|
||||||
|
"bio",
|
||||||
|
"about"
|
||||||
|
],
|
||||||
"source": "theme",
|
"source": "theme",
|
||||||
"content": [
|
"content": [
|
||||||
{
|
{
|
||||||
@@ -411,14 +474,15 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "A software developer who writes about building things on the web. Based somewhere with good coffee and reliable internet."
|
"text": "A software developer who writes about building things on the web. Based somewhere with good coffee and reliable internet.",
|
||||||
|
"_key": "span-1-0-9216006467512063059"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-7077157664645664155"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
"content": {
|
"content": {
|
||||||
"homepage": [
|
"homepage": [
|
||||||
{
|
{
|
||||||
@@ -480,9 +544,11 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "A place for writing about software, design, and the occasional stray thought. No posting schedule, no newsletter funnel. Just things I wanted to write down."
|
"text": "A place for writing about software, design, and the occasional stray thought. No posting schedule, no newsletter funnel. Just things I wanted to write down.",
|
||||||
|
"_key": "span-1-0-6368014575960974151"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1--1079749881349315145"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -490,9 +556,11 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "Built with Astro and EmDash. The source is open if you want to see how it works."
|
"text": "Built with Astro and EmDash. The source is open if you want to see how it works.",
|
||||||
|
"_key": "span-1-0-2728501793444554227"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-8666535223267766186"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -517,9 +585,11 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "Every few years the industry collectively decides that everything we've been doing is wrong and there's a better way. New frameworks, new paradigms, new build tools. The churn is relentless, and if you're not careful, you spend more time migrating than building."
|
"text": "Every few years the industry collectively decides that everything we've been doing is wrong and there's a better way. New frameworks, new paradigms, new build tools. The churn is relentless, and if you're not careful, you spend more time migrating than building.",
|
||||||
|
"_key": "span-1-0--4578767547205737399"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-453171626120699366"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -527,14 +597,23 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "I've been writing software long enough to have seen several of these cycles. jQuery to Backbone to Angular to React to whatever comes next. Each transition felt urgent at the time. Looking back, the things that actually mattered were rarely about the framework."
|
"text": "I've been writing software long enough to have seen several of these cycles. jQuery to Backbone to Angular to React to whatever comes next. Each transition felt urgent at the time. Looking back, the things that actually mattered were rarely about the framework.",
|
||||||
|
"_key": "span-1-0--7711665862837639974"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-4963103923913498599"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
"style": "h2",
|
"style": "h2",
|
||||||
"children": [{ "_type": "span", "text": "What survives" }]
|
"children": [
|
||||||
|
{
|
||||||
|
"_type": "span",
|
||||||
|
"text": "What survives",
|
||||||
|
"_key": "span-1-0-8159391152054512855"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_key": "block-1-8748999694854857005"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -542,9 +621,11 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "Clean data models survive. Clear boundaries between systems survive. Good naming survives. The decision to keep things simple when you could have made them clever - that definitely survives."
|
"text": "Clean data models survive. Clear boundaries between systems survive. Good naming survives. The decision to keep things simple when you could have made them clever - that definitely survives.",
|
||||||
|
"_key": "span-1-0-3159414369117353830"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1--8204300170394394943"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -552,9 +633,11 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "What doesn't survive is code that was written to impress, abstractions built for problems that never materialized, and architectures designed around a framework's opinions rather than the domain's reality."
|
"text": "What doesn't survive is code that was written to impress, abstractions built for problems that never materialized, and architectures designed around a framework's opinions rather than the domain's reality.",
|
||||||
|
"_key": "span-1-0-1193110648522154311"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-2514906331005036434"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -562,19 +645,30 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "The best code I've written is boring. It reads like prose, does one thing well, and doesn't require a PhD in category theory to understand. The worst code I wrote was technically impressive at the time."
|
"text": "The best code I've written is boring. It reads like prose, does one thing well, and doesn't require a PhD in category theory to understand. The worst code I wrote was technically impressive at the time.",
|
||||||
|
"_key": "span-1-0-5576519041062158"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-8564154851318889042"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"bylines": [
|
"bylines": [
|
||||||
{ "byline": "byline-editorial" },
|
{
|
||||||
{ "byline": "byline-guest", "roleLabel": "Guest essay" }
|
"byline": "byline-editorial"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"byline": "byline-guest",
|
||||||
|
"roleLabel": "Guest essay"
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"taxonomies": {
|
"taxonomies": {
|
||||||
"category": ["development"],
|
"category": [
|
||||||
"tag": ["opinion"]
|
"development"
|
||||||
|
],
|
||||||
|
"tag": [
|
||||||
|
"opinion"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -595,14 +689,23 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "There's a certain irony in the fact that the web started static, went dynamic, and is now swinging back toward static again. But the static sites of today aren't the hand-coded HTML pages of 1998. They're generated, optimized, and deployed to edge networks that serve them in milliseconds."
|
"text": "There's a certain irony in the fact that the web started static, went dynamic, and is now swinging back toward static again. But the static sites of today aren't the hand-coded HTML pages of 1998. They're generated, optimized, and deployed to edge networks that serve them in milliseconds.",
|
||||||
|
"_key": "span-1-0-6823213819728337474"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1--7437944285408028127"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
"style": "h2",
|
"style": "h2",
|
||||||
"children": [{ "_type": "span", "text": "The performance argument" }]
|
"children": [
|
||||||
|
{
|
||||||
|
"_type": "span",
|
||||||
|
"text": "The performance argument",
|
||||||
|
"_key": "span-1-0-5544892970958750699"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_key": "block-1-7080795837402037274"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -610,16 +713,27 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "A static file served from a CDN is as fast as the web gets. No cold starts, no database queries, no server-side rendering overhead. The Time to First Byte is essentially the network latency to your nearest edge node. You can't beat physics."
|
"text": "A static file served from a CDN is as fast as the web gets. No cold starts, no database queries, no server-side rendering overhead. The Time to First Byte is essentially the network latency to your nearest edge node. You can't beat physics.",
|
||||||
|
"_key": "span-1-0--1181329828476334338"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1-3184601500907317910"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"bylines": [{ "byline": "byline-editorial" }],
|
"bylines": [
|
||||||
|
{
|
||||||
|
"byline": "byline-editorial"
|
||||||
|
}
|
||||||
|
],
|
||||||
"taxonomies": {
|
"taxonomies": {
|
||||||
"category": ["development"],
|
"category": [
|
||||||
"tag": ["webdev", "opinion"]
|
"development"
|
||||||
|
],
|
||||||
|
"tag": [
|
||||||
|
"webdev",
|
||||||
|
"opinion"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -640,14 +754,23 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "I started writing about things I was learning not because I had anything original to say, but because I kept forgetting what I'd figured out. The blog posts were notes to my future self, published publicly more out of laziness than courage."
|
"text": "I started writing about things I was learning not because I had anything original to say, but because I kept forgetting what I'd figured out. The blog posts were notes to my future self, published publicly more out of laziness than courage.",
|
||||||
|
"_key": "span-1-0--3305331763265157022"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1--9220457393288936320"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
"style": "h2",
|
"style": "h2",
|
||||||
"children": [{ "_type": "span", "text": "The fear of being wrong" }]
|
"children": [
|
||||||
|
{
|
||||||
|
"_type": "span",
|
||||||
|
"text": "The fear of being wrong",
|
||||||
|
"_key": "span-1-0--8442928675844475654"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_key": "block-1-7621972026588672090"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"_type": "block",
|
"_type": "block",
|
||||||
@@ -655,15 +778,21 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "The biggest barrier isn't time or writing skill. It's the fear of publishing something that turns out to be wrong. But here's the thing: being wrong publicly is one of the most efficient ways to learn. Someone will correct you, often kindly, and you'll remember that correction forever."
|
"text": "The biggest barrier isn't time or writing skill. It's the fear of publishing something that turns out to be wrong. But here's the thing: being wrong publicly is one of the most efficient ways to learn. Someone will correct you, often kindly, and you'll remember that correction forever.",
|
||||||
|
"_key": "span-1-0--7189841934513865939"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1--1055699326484001862"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"taxonomies": {
|
"taxonomies": {
|
||||||
"category": ["notes"],
|
"category": [
|
||||||
"tag": ["opinion"]
|
"notes"
|
||||||
|
],
|
||||||
|
"tag": [
|
||||||
|
"opinion"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -680,9 +809,11 @@
|
|||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"_type": "span",
|
"_type": "span",
|
||||||
"text": "This is a draft post that won't appear in the public listing."
|
"text": "This is a draft post that won't appear in the public listing.",
|
||||||
|
"_key": "span-1-0--7838103084601048591"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"_key": "block-1--6470568077950651491"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user