feat(blocks): data-block PascalCase identifier on every CMS block

Adds data-block="PascalName" alongside existing data-block-type
snake_case so blocks can be located via [data-block="Calendar"] etc.
in DevTools. Snake-case attribute kept for backward compat.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Peter Meier
2026-05-07 15:44:40 +02:00
parent b633ed2d2b
commit 5a86ff701e
16 changed files with 16 additions and 16 deletions
+1 -1
View File
@@ -106,7 +106,7 @@
); );
</script> </script>
<div class="files-block {layoutClasses}" data-block-type="files" data-block-slug={block._slug}> <div class="files-block {layoutClasses}" data-block="Files" data-block-type="files" data-block-slug={block._slug}>
{#if block.headline} {#if block.headline}
<h3 class="mb-3 text-lg font-semibold">{block.headline}</h3> <h3 class="mb-3 text-lg font-semibold">{block.headline}</h3>
{/if} {/if}
@@ -15,7 +15,7 @@
const Tag = $derived((block.tag || "h2") as "h1" | "h2" | "h3" | "h4" | "h5" | "h6"); const Tag = $derived((block.tag || "h2") as "h1" | "h2" | "h3" | "h4" | "h5" | "h6");
</script> </script>
<div class={layoutClasses} data-block-type="headline" data-block-slug={block._slug}> <div class={layoutClasses} data-block="Headline" data-block-type="headline" data-block-slug={block._slug}>
<svelte:element <svelte:element
this={Tag} this={Tag}
class={alignClass} class={alignClass}
+1 -1
View File
@@ -9,7 +9,7 @@
<div <div
class="{layoutClasses} content-html" class="{layoutClasses} content-html"
data-block-type="html" data-block="Html" data-block-type="html"
data-block-slug={block._slug} data-block-slug={block._slug}
> >
{@html block.html ?? ""} {@html block.html ?? ""}
+1 -1
View File
@@ -32,7 +32,7 @@
} }
</script> </script>
<div class={layoutClasses} data-block-type="iframe" data-block-slug={block._slug}> <div class={layoutClasses} data-block="Iframe" data-block-type="iframe" data-block-slug={block._slug}>
{#if src} {#if src}
<div class="relative aspect-video w-full overflow-hidden rounded-xs bg-stein-100"> <div class="relative aspect-video w-full overflow-hidden rounded-xs bg-stein-100">
<iframe <iframe
+1 -1
View File
@@ -40,7 +40,7 @@
); );
</script> </script>
<div class={layoutClasses} data-block-type="image" data-block-slug={block._slug}> <div class={layoutClasses} data-block="Image" data-block-type="image" data-block-slug={block._slug}>
{#if rawSrc} {#if rawSrc}
<figure class="max-w-[400px]"> <figure class="max-w-[400px]">
<RustyImage <RustyImage
@@ -155,7 +155,7 @@
<svelte:window onkeydown={onModalKey} /> <svelte:window onkeydown={onModalKey} />
<div class={layoutClasses} data-block-type="image_gallery" data-block-slug={block._slug}> <div class={layoutClasses} data-block="ImageGallery" data-block-type="image_gallery" data-block-slug={block._slug}>
{#if descriptionHtml} {#if descriptionHtml}
<div class="markdown max-w-none prose prose-zinc mb-4"> <div class="markdown max-w-none prose prose-zinc mb-4">
{@html descriptionHtml} {@html descriptionHtml}
@@ -28,7 +28,7 @@
); );
</script> </script>
<div class="link-list {layoutClasses}" data-block-type="link_list" data-block-slug={block._slug}> <div class="link-list {layoutClasses}" data-block="LinkList" data-block-type="link_list" data-block-slug={block._slug}>
{#if block.headline} {#if block.headline}
<h3 class="mb-3 text-sm font-semibold tracking-wide uppercase">{block.headline}</h3> <h3 class="mb-3 text-sm font-semibold tracking-wide uppercase">{block.headline}</h3>
{/if} {/if}
@@ -24,7 +24,7 @@
<div <div
class={layoutClasses} class={layoutClasses}
data-block-type="markdown" data-block="Markdown" data-block-type="markdown"
data-markdown-id={block.name} data-markdown-id={block.name}
data-block-slug={block._slug} data-block-slug={block._slug}
> >
@@ -82,7 +82,7 @@
<div <div
class="{layoutClasses} content-opnform w-[calc(100%+2rem)] max-w-none -mx-4 min-w-0 overflow-visible border border-stein-200 lg:rounded-lg px-0 py-3 md:w-[calc(100%+3rem)] md:-mx-6 md:px-4 md:py-4" class="{layoutClasses} content-opnform w-[calc(100%+2rem)] max-w-none -mx-4 min-w-0 overflow-visible border border-stein-200 lg:rounded-lg px-0 py-3 md:w-[calc(100%+3rem)] md:-mx-6 md:px-4 md:py-4"
data-block-type="opnform" data-block="OpnForm" data-block-type="opnform"
data-block-slug={block._slug} data-block-slug={block._slug}
> >
{#if iframeSrc} {#if iframeSrc}
@@ -129,7 +129,7 @@
</Card> </Card>
{/snippet} {/snippet}
<div class={layoutClasses} data-block-type="organisations" data-block-slug={block._slug}> <div class={layoutClasses} data-block="Organisations" data-block-type="organisations" data-block-slug={block._slug}>
{#if block.headline} {#if block.headline}
<h3 <h3
class={compact ? "mb-2 text-lg font-semibold text-stein-900" : "mb-4"} class={compact ? "mb-2 text-lg font-semibold text-stein-900" : "mb-4"}
@@ -40,7 +40,7 @@
{#if hasContent} {#if hasContent}
<div <div
class="post-overview mb-4 {layoutClasses} {className}" class="post-overview mb-4 {layoutClasses} {className}"
data-block-type="post_overview" data-block="PostOverview" data-block-type="post_overview"
data-block-slug={block._slug} data-block-slug={block._slug}
> >
{#if block.headline} {#if block.headline}
+1 -1
View File
@@ -39,7 +39,7 @@
{:else} {:else}
<div <div
class={layoutClasses} class={layoutClasses}
data-block-type="quote" data-block="Quote" data-block-type="quote"
data-block-slug={block._slug} data-block-slug={block._slug}
> >
{@render quoteMarkup()} {@render quoteMarkup()}
@@ -68,7 +68,7 @@
<div <div
class="quote-carousel {layoutClasses}" class="quote-carousel {layoutClasses}"
data-block-type="quote_carousel" data-block="QuoteCarousel" data-block-type="quote_carousel"
data-block-slug={block._slug} data-block-slug={block._slug}
onmouseenter={() => (paused = true)} onmouseenter={() => (paused = true)}
onmouseleave={() => (paused = false)} onmouseleave={() => (paused = false)}
@@ -160,7 +160,7 @@
<div <div
class="searchable-text flex flex-col gap-0 border border-stein-200 bg-stein-50 {layoutClasses} {className}" class="searchable-text flex flex-col gap-0 border border-stein-200 bg-stein-50 {layoutClasses} {className}"
data-block-type="searchable_text" data-block="SearchableText" data-block-type="searchable_text"
data-block-slug={block._slug} data-block-slug={block._slug}
> >
<div class="p-4 md:p-6"> <div class="p-4 md:p-6">
@@ -84,7 +84,7 @@
const hasEmbed = $derived(embedUrl != null); const hasEmbed = $derived(embedUrl != null);
</script> </script>
<div class={layoutClasses} data-block-type="youtube_video" data-block-slug={block._slug}> <div class={layoutClasses} data-block="YoutubeVideo" data-block-type="youtube_video" data-block-slug={block._slug}>
{#if hasEmbed} {#if hasEmbed}
<div class="aspect-video w-full overflow-hidden rounded-xs bg-stein-100"> <div class="aspect-video w-full overflow-hidden rounded-xs bg-stein-100">
<iframe <iframe
@@ -145,7 +145,7 @@
<div <div
class={layoutClasses} class={layoutClasses}
data-block-type="youtube_video_gallery" data-block="YoutubeVideoGallery" data-block-type="youtube_video_gallery"
data-block-slug={block._slug} data-block-slug={block._slug}
> >
{#if block.title} {#if block.title}