@bettercms-ai/mcp 0.84.4 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +243 -58
- package/dist/index.js.map +1 -1
- package/dist/kit-catalog.json +149 -149
- package/dist/skills/bettercms/SKILL.md +1 -1
- package/dist/skills/bettercms/references/bindings.md +9 -0
- package/dist/skills/bettercms/references/components.md +1 -1
- package/dist/skills/bettercms/references/content-modeling.md +1 -1
- package/dist/skills/bettercms/references/dock-input.md +89 -1
- package/dist/skills/bettercms/references/editor-chrome.md +2 -2
- package/dist/skills/bettercms/references/finish-site.md +1 -1
- package/dist/skills/bettercms/references/forms-and-interactions.md +1 -1
- package/dist/skills/bettercms/references/integrations.md +13 -2
- package/dist/skills/bettercms/references/kit-catalog.md +117 -181
- package/package.json +1 -1
|
@@ -72,7 +72,7 @@ Tags: global-synced, repeater, validation, variants. Proves: Smallest global hea
|
|
|
72
72
|
- A 'Book a table' widget that opens a third-party modal is still a button with an external link — don't model the widget's script.
|
|
73
73
|
- Don't create a link for the logo; it always goes home.
|
|
74
74
|
|
|
75
|
-
Not carried by a stored component:
|
|
75
|
+
Not carried by a stored component: item openMode, variants.
|
|
76
76
|
|
|
77
77
|
### Header with announcement + utility row (`nav-announcement-utility`)
|
|
78
78
|
|
|
@@ -92,7 +92,7 @@ Tags: global-synced, conditional, repeater, localized. Proves: Three stacked row
|
|
|
92
92
|
- A rotating announcement (several messages cycling) is an array, not one string — switch `message` to an array of {message, link} rather than joining with ·.
|
|
93
93
|
- Don't put the account/cart icons in utility links — those are app state; see `nav-ecommerce-header`.
|
|
94
94
|
|
|
95
|
-
Not carried by a stored component:
|
|
95
|
+
Not carried by a stored component: item openMode.
|
|
96
96
|
|
|
97
97
|
### Mega menu with featured cards + promo slot (`nav-mega-featured-promo`)
|
|
98
98
|
|
|
@@ -114,7 +114,7 @@ Tags: deep-nesting, slots, global-synced, conditional, references, variants, com
|
|
|
114
114
|
- If two menu items share the same panel content, that is still two panels in content; don't invent a shared-panel global for it.
|
|
115
115
|
- Hover-only panels fail keyboard users — the converter should default `openOn` to click when the source has no aria-expanded handling.
|
|
116
116
|
|
|
117
|
-
Not carried by a stored component:
|
|
117
|
+
Not carried by a stored component: shopify reference, variants.
|
|
118
118
|
|
|
119
119
|
### Docs sidebar navigation (`nav-docs-sidebar`)
|
|
120
120
|
|
|
@@ -135,7 +135,7 @@ Tags: deep-nesting, repeater, global-synced, conditional, dynamic-query, referen
|
|
|
135
135
|
- Sidebars 4+ levels deep can't be represented — flatten to sub-pages and flag it rather than inventing nested objects.
|
|
136
136
|
- Don't import the 'On this page' table of contents — it's generated from each page's headings.
|
|
137
137
|
|
|
138
|
-
Not carried by a stored component:
|
|
138
|
+
Not carried by a stored component: item openMode.
|
|
139
139
|
|
|
140
140
|
### E-commerce header (`nav-ecommerce-header`)
|
|
141
141
|
|
|
@@ -156,7 +156,7 @@ Tags: global-synced, commerce, references, repeater, conditional, media-heavy. P
|
|
|
156
156
|
- Copying '(2)' from the cart badge into content is the most common converter mistake — it's session state.
|
|
157
157
|
- Free-shipping thresholds belong to commerce settings, not the header; reference them from the renderer.
|
|
158
158
|
|
|
159
|
-
Not carried by a stored component:
|
|
159
|
+
Not carried by a stored component: shopify reference, variants.
|
|
160
160
|
|
|
161
161
|
### Multi-locale header with switchers (`nav-locale-header`)
|
|
162
162
|
|
|
@@ -176,7 +176,7 @@ Tags: localized, global-synced, conditional, repeater. Proves: Localized labels
|
|
|
176
176
|
- Using flags for languages (🇬🇧 for English) — map to codes and set display: 'code'.
|
|
177
177
|
- Translating the link target by typing /de/... URLs — link to the page and let locale routing resolve it.
|
|
178
178
|
|
|
179
|
-
Not carried by a stored component:
|
|
179
|
+
Not carried by a stored component: item openMode.
|
|
180
180
|
|
|
181
181
|
### Sticky bottom CTA bar (mobile) (`sticky-mobile-cta-bar`)
|
|
182
182
|
|
|
@@ -196,8 +196,6 @@ Tags: responsive-layout, conditional, validation, commerce. Proves: A per-templa
|
|
|
196
196
|
- 'Add to cart' is an ACTION, not a link — our button type only carries links (gap: action buttons).
|
|
197
197
|
- A bar covering the cookie banner or chat launcher: the renderer must stack them; nothing to model.
|
|
198
198
|
|
|
199
|
-
Not carried by a stored component: ai, category.
|
|
200
|
-
|
|
201
199
|
### Announcement bar with countdown (`announcement-countdown`)
|
|
202
200
|
|
|
203
201
|
Tags: global-synced, conditional, validation, repeater, localized, a11y. Proves: Scheduled global with time zone · countdown with an after-end state · dismiss memory · rotating messages
|
|
@@ -216,7 +214,7 @@ Tags: global-synced, conditional, validation, repeater, localized, a11y. Proves:
|
|
|
216
214
|
- Storing the countdown as text ('2 days left') — it's wrong the next day. Always a datetime with offset.
|
|
217
215
|
- Hide-after earlier than the countdown end can't be caught today (gap: cross-field validation).
|
|
218
216
|
|
|
219
|
-
Not carried by a stored component:
|
|
217
|
+
Not carried by a stored component: item openMode.
|
|
220
218
|
|
|
221
219
|
### Cookie consent banner (`cookie-consent`)
|
|
222
220
|
|
|
@@ -236,7 +234,7 @@ Tags: global-synced, repeater, validation, a11y, localized, conditional, variant
|
|
|
236
234
|
- Pre-ticked optional categories are unlawful in the EU — the converter must set isOnByDefault: false and report any source that pre-ticks.
|
|
237
235
|
- A 'Reject all' hidden behind 'Preferences' is a dark pattern; flag it, don't replicate it.
|
|
238
236
|
|
|
239
|
-
Not carried by a stored component:
|
|
237
|
+
Not carried by a stored component: variants.
|
|
240
238
|
|
|
241
239
|
### Breadcrumb trail (`breadcrumb-config`)
|
|
242
240
|
|
|
@@ -256,7 +254,7 @@ Tags: conditional, seo-structured, a11y, references, repeater. Proves: A mostly-
|
|
|
256
254
|
- Importing the full trail per page as manual data — it rots the first time a page moves. Prefer auto.
|
|
257
255
|
- A breadcrumb that's really a 'Back to results' link is navigation state, not a trail.
|
|
258
256
|
|
|
259
|
-
Not carried by a stored component:
|
|
257
|
+
Not carried by a stored component: item openMode.
|
|
260
258
|
|
|
261
259
|
### Multi-column footer (`footer-multi-column`)
|
|
262
260
|
|
|
@@ -276,7 +274,7 @@ Tags: global-synced, repeater, references, form, validation, commerce. Proves: L
|
|
|
276
274
|
- Flattening columns into one long links array loses the headings — keep groups.
|
|
277
275
|
- Uploading payment logos as images: they go stale and break brand rules. Use the fixed set.
|
|
278
276
|
|
|
279
|
-
Not carried by a stored component:
|
|
277
|
+
Not carried by a stored component: item openMode, variants.
|
|
280
278
|
|
|
281
279
|
### Minimal footer (`footer-minimal`)
|
|
282
280
|
|
|
@@ -295,7 +293,7 @@ Tags: global-synced, repeater, validation. Proves: The smallest useful global: o
|
|
|
295
293
|
**Pitfalls.**
|
|
296
294
|
- Don't promote a minimal footer to the multi-column model just to have one footer type — the editor gets empty groups to ignore.
|
|
297
295
|
|
|
298
|
-
Not carried by a stored component:
|
|
296
|
+
Not carried by a stored component: item openMode.
|
|
299
297
|
|
|
300
298
|
### Mega footer with locations + app badges (`footer-mega-locations`)
|
|
301
299
|
|
|
@@ -316,7 +314,7 @@ Tags: global-synced, deep-nesting, repeater, seo-structured, validation, media-h
|
|
|
316
314
|
- Duplicating locations in the footer AND a Locations collection — two truths; use references once a collection exists.
|
|
317
315
|
- Times without a zone are read in the site's time zone; a chain spanning zones needs a zone per location (not modelled).
|
|
318
316
|
|
|
319
|
-
Not carried by a stored component:
|
|
317
|
+
Not carried by a stored component: item openMode.
|
|
320
318
|
|
|
321
319
|
## Heroes
|
|
322
320
|
|
|
@@ -338,7 +336,7 @@ Tags: variants, conditional, media-heavy, a11y, repeater. Proves: One media slot
|
|
|
338
336
|
- A hero with BOTH a background video and a side image is a different section (full-bleed video) — don't merge.
|
|
339
337
|
- Alt text on a decorative hero photo should still describe it when it shows the product.
|
|
340
338
|
|
|
341
|
-
Not carried by a stored component:
|
|
339
|
+
Not carried by a stored component: variants.
|
|
342
340
|
|
|
343
341
|
### Centered hero with gradient + screenshot (`hero-centered-gradient`)
|
|
344
342
|
|
|
@@ -359,7 +357,7 @@ Tags: variants, conditional, validation, media-heavy. Proves: Announcement chip
|
|
|
359
357
|
- Editing the headline can orphan the highlight — the renderer must ignore a highlight that no longer matches (no cross-field validation yet).
|
|
360
358
|
- Don't store raw CSS gradient strings — they can't be re-themed or validated.
|
|
361
359
|
|
|
362
|
-
Not carried by a stored component:
|
|
360
|
+
Not carried by a stored component: variants.
|
|
363
361
|
|
|
364
362
|
### Full-bleed video hero with captions (`hero-video-fullbleed`)
|
|
365
363
|
|
|
@@ -380,7 +378,7 @@ Tags: media-heavy, a11y, conditional, repeater, validation. Proves: An Accessibi
|
|
|
380
378
|
- A YouTube iframe can't autoplay muted reliably as a background — prefer MP4/Vimeo background mode; flag YouTube sources.
|
|
381
379
|
- Captions and transcript are different things: captions sync to the film, a transcript is a page. Model both.
|
|
382
380
|
|
|
383
|
-
Not carried by a stored component:
|
|
381
|
+
Not carried by a stored component: item openMode.
|
|
384
382
|
|
|
385
383
|
### Slider hero (`hero-slider`)
|
|
386
384
|
|
|
@@ -400,7 +398,7 @@ Tags: repeater, media-heavy, conditional, validation, a11y. Proves: Slides array
|
|
|
400
398
|
- Cloned slides doubling the count — dedupe by image URL + heading.
|
|
401
399
|
- Slide schedules that leave fewer than 2 live slides: the renderer should fall back to a static hero (min can't be enforced over time).
|
|
402
400
|
|
|
403
|
-
Not carried by a stored component:
|
|
401
|
+
Not carried by a stored component: fieldset (derived).
|
|
404
402
|
|
|
405
403
|
### Product hero with variant picker (`hero-product`)
|
|
406
404
|
|
|
@@ -421,7 +419,7 @@ Tags: references, commerce, media-heavy, conditional, repeater. Proves: Live com
|
|
|
421
419
|
- Hard-coding the price in the tagline ('Just $165!') — it goes stale; flag any currency in copy.
|
|
422
420
|
- Picker options are a fixed list here; a product with a 'Handle wrap' option can't be picked until options come from the reference (gap).
|
|
423
421
|
|
|
424
|
-
Not carried by a stored component:
|
|
422
|
+
Not carried by a stored component: shopify reference, variants.
|
|
425
423
|
|
|
426
424
|
### Search hero (`hero-search`)
|
|
427
425
|
|
|
@@ -440,8 +438,6 @@ Tags: references, conditional, dynamic-query, media-heavy. Proves: Search box co
|
|
|
440
438
|
**Pitfalls.**
|
|
441
439
|
- Don't model the autocomplete dropdown's results — they come from the search index.
|
|
442
440
|
|
|
443
|
-
Not carried by a stored component: ai, category.
|
|
444
|
-
|
|
445
441
|
### Lead-form hero (`hero-lead-form`)
|
|
446
442
|
|
|
447
443
|
Tags: form, references, conditional, validation, repeater. Proves: A form REFERENCE plus per-placement settings: hidden source fields, label override, message vs redirect
|
|
@@ -460,7 +456,7 @@ Tags: form, references, conditional, validation, repeater. Proves: A form REFERE
|
|
|
460
456
|
- Copying inputs into the hero's schema — the form then can't be reused or receive submissions properly.
|
|
461
457
|
- Hidden values that contain personal data (an email from the URL) must not be stored in content.
|
|
462
458
|
|
|
463
|
-
Not carried by a stored component:
|
|
459
|
+
Not carried by a stored component: item openMode, variants.
|
|
464
460
|
|
|
465
461
|
### App download hero (`hero-app-download`)
|
|
466
462
|
|
|
@@ -480,7 +476,7 @@ Tags: media-heavy, conditional, validation, global-synced, repeater. Proves: A f
|
|
|
480
476
|
- Uploading badge or QR images — they can't be updated and the QR silently breaks when the link changes.
|
|
481
477
|
- Ratings copied from the store go stale; the help text says so because there's no live source.
|
|
482
478
|
|
|
483
|
-
Not carried by a stored component:
|
|
479
|
+
Not carried by a stored component: item openMode.
|
|
484
480
|
|
|
485
481
|
### Stats hero (`hero-stats`)
|
|
486
482
|
|
|
@@ -500,7 +496,7 @@ Tags: repeater, validation, variants, media-heavy. Proves: Numbers stored as num
|
|
|
500
496
|
- Reading '0' from a count-up that hasn't run — always prefer data-target/data-count.
|
|
501
497
|
- '1.2k' style abbreviations: store 1.2 with suffix 'k', not 1200, so the copy stays as written.
|
|
502
498
|
|
|
503
|
-
Not carried by a stored component:
|
|
499
|
+
Not carried by a stored component: fieldset (derived), variants.
|
|
504
500
|
|
|
505
501
|
### Hero with logo wall (`hero-logo-wall`)
|
|
506
502
|
|
|
@@ -520,7 +516,7 @@ Tags: repeater, media-heavy, a11y, conditional, variants. Proves: Logos as a gri
|
|
|
520
516
|
- Alt text 'logo' x12 — screen readers hear nothing useful. Name is required for that reason.
|
|
521
517
|
- Marquee without a pause control is a WCAG 2.2.2 problem; the renderer pauses on hover/focus and reduced motion.
|
|
522
518
|
|
|
523
|
-
Not carried by a stored component:
|
|
519
|
+
Not carried by a stored component: variants.
|
|
524
520
|
|
|
525
521
|
### Split hero with testimonial card (`hero-split-testimonial`)
|
|
526
522
|
|
|
@@ -538,7 +534,7 @@ Tags: references, conditional, variants, media-heavy. Proves: Pick from the Test
|
|
|
538
534
|
**Pitfalls.**
|
|
539
535
|
- Quotes typed inline on every landing page drift from the approved wording — prefer the collection.
|
|
540
536
|
|
|
541
|
-
Not carried by a stored component:
|
|
537
|
+
Not carried by a stored component: variants.
|
|
542
538
|
|
|
543
539
|
### Event hero (`hero-event`)
|
|
544
540
|
|
|
@@ -559,8 +555,6 @@ Tags: conditional, seo-structured, validation, media-heavy. Proves: Date/time wi
|
|
|
559
555
|
- Dates stored as text ('Nov 14, 6pm') can't drive the countdown or JSON-LD — always a datetime with offset.
|
|
560
556
|
- End before start isn't caught today (gap: cross-field validation).
|
|
561
557
|
|
|
562
|
-
Not carried by a stored component: ai, category.
|
|
563
|
-
|
|
564
558
|
### Personalized hero (audiences + A/B) (`hero-personalized`)
|
|
565
559
|
|
|
566
560
|
Tags: personalization, conditional, repeater, validation, deep-nesting. Proves: Default content + audience versions that override only what they set · rule types with conditional inputs · an experiment split
|
|
@@ -580,8 +574,6 @@ Tags: personalization, conditional, repeater, validation, deep-nesting. Proves:
|
|
|
580
574
|
- Two audiences that both match: order decides; the converter must preserve the source's precedence.
|
|
581
575
|
- Personalized copy must not be indexed as the canonical content — crawlers see Everyone.
|
|
582
576
|
|
|
583
|
-
Not carried by a stored component: ai, category.
|
|
584
|
-
|
|
585
577
|
## Features & storytelling
|
|
586
578
|
|
|
587
579
|
### Icon feature grid (`feature-icon-grid`)
|
|
@@ -603,7 +595,7 @@ Tags: repeater, variants, validation, localized. Proves: Bounded repeater · per
|
|
|
603
595
|
- Feature cards with large photos are an image card grid, not this block.
|
|
604
596
|
- Icon fonts with ligatures (Material Symbols) store the icon as TEXT content — read the text, not the class.
|
|
605
597
|
|
|
606
|
-
Not carried by a stored component:
|
|
598
|
+
Not carried by a stored component: variants.
|
|
607
599
|
|
|
608
600
|
### Alternating feature rows (`feature-alternating-rows`)
|
|
609
601
|
|
|
@@ -623,7 +615,7 @@ Tags: repeater, conditional, media-heavy, variants, rich-text. Proves: Per-row m
|
|
|
623
615
|
- Storing `side` on every row breaks the zigzag the moment rows are reordered — store `auto` unless the source deliberately breaks the pattern.
|
|
624
616
|
- Autoplay videos without a poster flash black; always extract or generate a poster.
|
|
625
617
|
|
|
626
|
-
Not carried by a stored component:
|
|
618
|
+
Not carried by a stored component: variants.
|
|
627
619
|
|
|
628
620
|
### Feature bento (responsive spans) (`bento-feature-showcase`)
|
|
629
621
|
|
|
@@ -644,7 +636,7 @@ Tags: slots, responsive-layout, conditional, media-heavy, variants. Proves: Slot
|
|
|
644
636
|
- Phones stack cells; if the source reorders them with CSS `order`, capture it or the story reads out of order.
|
|
645
637
|
- 6-column variants need spans up to 6; validate spans against the variant's column count.
|
|
646
638
|
|
|
647
|
-
Not carried by a stored component:
|
|
639
|
+
Not carried by a stored component: variants.
|
|
648
640
|
|
|
649
641
|
### Steps / how it works (`steps-how-it-works`)
|
|
650
642
|
|
|
@@ -663,7 +655,7 @@ Tags: repeater, variants, validation. Proves: Order is the number (never stored)
|
|
|
663
655
|
- Never store the number as content — the converter must strip it, otherwise reordering shows “3, 1, 2”.
|
|
664
656
|
- HowTo rich results were retired by Google; do not emit HowTo JSON-LD for this block.
|
|
665
657
|
|
|
666
|
-
Not carried by a stored component:
|
|
658
|
+
Not carried by a stored component: variants.
|
|
667
659
|
|
|
668
660
|
### Timeline / company history (`timeline-company-history`)
|
|
669
661
|
|
|
@@ -683,7 +675,7 @@ Tags: repeater, conditional, media-heavy, validation, rich-text. Proves: Date pr
|
|
|
683
675
|
- Storing “2014” in a date field becomes 2014-01-01 and later renders as “Jan 1, 2014”.
|
|
684
676
|
- Two milestones with the same year keep their array order as the tie-breaker — keep the array roughly sorted.
|
|
685
677
|
|
|
686
|
-
Not carried by a stored component:
|
|
678
|
+
Not carried by a stored component: variants.
|
|
687
679
|
|
|
688
680
|
### Tabs with media (`tabs-with-media`)
|
|
689
681
|
|
|
@@ -703,7 +695,7 @@ Tags: repeater, conditional, media-heavy, variants, a11y, localized. Proves: Fix
|
|
|
703
695
|
- Auto-advancing tabs must stop on interaction and respect reduced motion — the renderer handles it; never model a “pause” field.
|
|
704
696
|
- Tab labels longer than ~20 characters wrap on the top variant and break the underline.
|
|
705
697
|
|
|
706
|
-
Not carried by a stored component:
|
|
698
|
+
Not carried by a stored component: variants.
|
|
707
699
|
|
|
708
700
|
### Accordion features with image swap (`accordion-feature-image-swap`)
|
|
709
701
|
|
|
@@ -722,7 +714,7 @@ Tags: repeater, media-heavy, a11y, variants, rich-text. Proves: One required ima
|
|
|
722
714
|
- Images of different aspect ratios cause the layout to jump on every click — warn when the source images differ.
|
|
723
715
|
- Do not tag these rows as FAQ structured data — they are not questions.
|
|
724
716
|
|
|
725
|
-
Not carried by a stored component:
|
|
717
|
+
Not carried by a stored component: variants.
|
|
726
718
|
|
|
727
719
|
### Comparison vs competitors (`comparison-vs-competitors`)
|
|
728
720
|
|
|
@@ -744,7 +736,7 @@ Tags: deep-nesting, conditional, repeater, validation, a11y, variants. Proves: B
|
|
|
744
736
|
- Icons without text alternatives fail screen readers; the enum lets the renderer output “Included”/“Not included”.
|
|
745
737
|
- Comparative claims without a date and source are a legal risk — `verifiedOn` is required on purpose.
|
|
746
738
|
|
|
747
|
-
Not carried by a stored component:
|
|
739
|
+
Not carried by a stored component: variants.
|
|
748
740
|
|
|
749
741
|
### Stats band (`stats-band`)
|
|
750
742
|
|
|
@@ -764,7 +756,7 @@ Tags: repeater, validation, variants, a11y, localized. Proves: Numbers stored as
|
|
|
764
756
|
- Scraping during a count-up animation captures “0” — read the data attribute or wait for the final value.
|
|
765
757
|
- “1.2M” is value 1.2 + suffix M, not 1200000 with no suffix, unless the design formats compact numbers itself.
|
|
766
758
|
|
|
767
|
-
Not carried by a stored component:
|
|
759
|
+
Not carried by a stored component: variants.
|
|
768
760
|
|
|
769
761
|
### Manifesto / pull quote (`manifesto-pull-quote`)
|
|
770
762
|
|
|
@@ -783,7 +775,7 @@ Tags: conditional, rich-text, variants, localized. Proves: Mode select swaps an
|
|
|
783
775
|
- Quotation marks typed into content double up with the design's quotes — strip them.
|
|
784
776
|
- Lines split by `<br>` inside one paragraph are still separate lines.
|
|
785
777
|
|
|
786
|
-
Not carried by a stored component:
|
|
778
|
+
Not carried by a stored component: variants.
|
|
787
779
|
|
|
788
780
|
### Problem → solution (`problem-solution`)
|
|
789
781
|
|
|
@@ -801,7 +793,7 @@ Tags: repeater, variants, validation. Proves: Pairs keep both columns aligned ·
|
|
|
801
793
|
**Pitfalls.**
|
|
802
794
|
- Unequal lists in the source must not be silently truncated — flag them.
|
|
803
795
|
|
|
804
|
-
Not carried by a stored component:
|
|
796
|
+
Not carried by a stored component: variants.
|
|
805
797
|
|
|
806
798
|
### Integrations grid (`integrations-grid`)
|
|
807
799
|
|
|
@@ -820,7 +812,7 @@ Tags: dynamic-query, references, conditional, variants, media-heavy. Proves: Dyn
|
|
|
820
812
|
- Brand logos have usage rules — keep the original SVG, never recolor it in content; `isMonochrome` is a render-time filter.
|
|
821
813
|
- Category options cannot come from a sibling array in our schema, which is exactly why categories are a referenced collection.
|
|
822
814
|
|
|
823
|
-
Not carried by a stored component:
|
|
815
|
+
Not carried by a stored component: variants.
|
|
824
816
|
|
|
825
817
|
## Social proof
|
|
826
818
|
|
|
@@ -843,7 +835,7 @@ Tags: references, dynamic-query, conditional, variants, validation. Proves: Refe
|
|
|
843
835
|
- Grids look broken with 4 or 5 items in a 3-column layout; validation nudges multiples of 3.
|
|
844
836
|
- Do not emit Review JSON-LD for testimonials about your own business — Google ignores self-serving reviews.
|
|
845
837
|
|
|
846
|
-
Not carried by a stored component:
|
|
838
|
+
Not carried by a stored component: variants.
|
|
847
839
|
|
|
848
840
|
### Video testimonial slider (`testimonial-video-slider`)
|
|
849
841
|
|
|
@@ -863,7 +855,7 @@ Tags: media-heavy, a11y, conditional, repeater, variants, references, validation
|
|
|
863
855
|
- Hosted MP4s with no captions file fail accessibility — the converter must flag, not skip, them.
|
|
864
856
|
- Autoplaying a slider while a video plays is hostile; the renderer pauses advance once any video starts.
|
|
865
857
|
|
|
866
|
-
Not carried by a stored component:
|
|
858
|
+
Not carried by a stored component: variants.
|
|
867
859
|
|
|
868
860
|
### Wall of love (`wall-of-love`)
|
|
869
861
|
|
|
@@ -883,7 +875,7 @@ Tags: polymorphic-array, repeater, validation, media-heavy, a11y. Proves: Polymo
|
|
|
883
875
|
- Third-party embed scripts (twitter widgets.js) slow the page and break when posts are deleted — store the content, link the original.
|
|
884
876
|
- Reposting customer photos without permission is a copyright problem; the required flag forces the question.
|
|
885
877
|
|
|
886
|
-
Not carried by a stored component:
|
|
878
|
+
Not carried by a stored component: variants.
|
|
887
879
|
|
|
888
880
|
### Case study cards (`case-study-cards`)
|
|
889
881
|
|
|
@@ -902,7 +894,7 @@ Tags: references, dynamic-query, conditional, variants. Proves: Array of objects
|
|
|
902
894
|
- Copying the card title/logo into the section duplicates the story — reference it, override only what differs.
|
|
903
895
|
- `col_case_studies` must exist before import; create the collection first in the conversion plan.
|
|
904
896
|
|
|
905
|
-
Not carried by a stored component:
|
|
897
|
+
Not carried by a stored component: variants.
|
|
906
898
|
|
|
907
899
|
### Logo cloud (`logo-cloud`)
|
|
908
900
|
|
|
@@ -922,7 +914,7 @@ Tags: repeater, variants, a11y, validation, conditional, media-heavy. Proves: Gr
|
|
|
922
914
|
- Alt text like “logo” or empty alt on linked logos fails a11y; the required name fixes it.
|
|
923
915
|
- Conditions on `_variant` work today because the variant is stored on the block value — this is a schema-language gap worth making official.
|
|
924
916
|
|
|
925
|
-
Not carried by a stored component:
|
|
917
|
+
Not carried by a stored component: item openMode, variants.
|
|
926
918
|
|
|
927
919
|
### Press mentions (`press-mentions`)
|
|
928
920
|
|
|
@@ -941,7 +933,7 @@ Tags: repeater, validation, variants, media-heavy, localized. Proves: Quotes tie
|
|
|
941
933
|
- Never shorten a quote by paraphrasing — use an ellipsis and keep the source link.
|
|
942
934
|
- Outlet logos are trademarks; use the outlet's press-kit file and do not recolour it in content.
|
|
943
935
|
|
|
944
|
-
Not carried by a stored component:
|
|
936
|
+
Not carried by a stored component: variants.
|
|
945
937
|
|
|
946
938
|
### Awards & certifications (`awards-certifications`)
|
|
947
939
|
|
|
@@ -961,7 +953,7 @@ Tags: conditional, validation, repeater, seo-structured, a11y. Proves: Kind sele
|
|
|
961
953
|
- “HIPAA certified” and “GDPR certified” badges are marketing inventions; the converter flags them.
|
|
962
954
|
- Organization JSON-LD `award` should only list awards, never certifications.
|
|
963
955
|
|
|
964
|
-
Not carried by a stored component:
|
|
956
|
+
Not carried by a stored component: variants.
|
|
965
957
|
|
|
966
958
|
### Review summary (`review-summary`)
|
|
967
959
|
|
|
@@ -982,7 +974,7 @@ Tags: seo-structured, references, conditional, validation, a11y, commerce. Prove
|
|
|
982
974
|
- Typed-in ratings drift from the real ones; prefer the connected source and show “Synced …” in the UI.
|
|
983
975
|
- Distribution counts that don't sum to the total look fake; validate the sum.
|
|
984
976
|
|
|
985
|
-
Not carried by a stored component:
|
|
977
|
+
Not carried by a stored component: item openMode, itemNoun (derived), shopify reference, variants.
|
|
986
978
|
|
|
987
979
|
## Media & galleries
|
|
988
980
|
|
|
@@ -1005,7 +997,7 @@ Tags: media-heavy, a11y, responsive-layout, repeater, validation, localized. Pro
|
|
|
1005
997
|
- Credits pasted into captions get translated; keep them in the credit object.
|
|
1006
998
|
- Empty alt is right for decorative photos but wrong for a portfolio — flag empties for review.
|
|
1007
999
|
|
|
1008
|
-
Not carried by a stored component:
|
|
1000
|
+
Not carried by a stored component: variants.
|
|
1009
1001
|
|
|
1010
1002
|
### Gallery with category filters (`lightbox-gallery-filters`)
|
|
1011
1003
|
|
|
@@ -1024,7 +1016,7 @@ Tags: media-heavy, a11y, repeater, validation, localized. Proves: Filters define
|
|
|
1024
1016
|
- A photo tagged with a key that no filter defines is invisible under every filter except All — validate keys against the filters.
|
|
1025
1017
|
- Free-typed keys are error-prone; a select fed by the section's filters is the right control (schema gap).
|
|
1026
1018
|
|
|
1027
|
-
Not carried by a stored component:
|
|
1019
|
+
Not carried by a stored component: item openMode, variants.
|
|
1028
1020
|
|
|
1029
1021
|
### Video section (YouTube · Vimeo · hosted) (`video-section`)
|
|
1030
1022
|
|
|
@@ -1045,7 +1037,7 @@ Tags: media-heavy, a11y, seo-structured, conditional, validation, embed, localiz
|
|
|
1045
1037
|
- Missing uploadDate/duration silently drops the video from rich results — they are required for that reason.
|
|
1046
1038
|
- Embedding raw YouTube iframes costs ~1 MB of JS per video; the renderer uses a facade until play.
|
|
1047
1039
|
|
|
1048
|
-
Not carried by a stored component:
|
|
1040
|
+
Not carried by a stored component: item openMode, variants.
|
|
1049
1041
|
|
|
1050
1042
|
### Before / after slider (`before-after-slider`)
|
|
1051
1043
|
|
|
@@ -1064,7 +1056,7 @@ Tags: media-heavy, a11y, repeater, validation, variants, localized. Proves: Pair
|
|
|
1064
1056
|
- Before and after with different crops make the slider useless — dimensions should match (not enforceable in our schema yet).
|
|
1065
1057
|
- A slider built from a div with mouse events only is not keyboard accessible; the renderer must use a real range input.
|
|
1066
1058
|
|
|
1067
|
-
Not carried by a stored component:
|
|
1059
|
+
Not carried by a stored component: variants.
|
|
1068
1060
|
|
|
1069
1061
|
### Image with hotspots (shop the look) (`image-hotspots`)
|
|
1070
1062
|
|
|
@@ -1084,7 +1076,7 @@ Tags: media-heavy, conditional, references, commerce, a11y, validation, variants
|
|
|
1084
1076
|
- Copying product price into the note text goes stale; reference the product.
|
|
1085
1077
|
- Re-cropping the image after placing pins moves every pin. A visual point picker would prevent this (schema gap).
|
|
1086
1078
|
|
|
1087
|
-
Not carried by a stored component:
|
|
1079
|
+
Not carried by a stored component: shopify reference, variants.
|
|
1088
1080
|
|
|
1089
1081
|
### 3D model / Lottie / 360° embed (`interactive-3d-lottie-embed`)
|
|
1090
1082
|
|
|
@@ -1105,7 +1097,7 @@ Tags: embed, conditional, media-heavy, a11y, validation, variants. Proves: Embed
|
|
|
1105
1097
|
- Iframe embeds from un-vetted hosts are a security hole — the host allow-list is intentional.
|
|
1106
1098
|
- Lottie animations that loop forever must stop for reduced-motion users; the renderer shows the fallback instead.
|
|
1107
1099
|
|
|
1108
|
-
Not carried by a stored component:
|
|
1100
|
+
Not carried by a stored component: variants.
|
|
1109
1101
|
|
|
1110
1102
|
### Mixed-media carousel (`mixed-media-carousel`)
|
|
1111
1103
|
|
|
@@ -1124,7 +1116,7 @@ Tags: polymorphic-array, media-heavy, a11y, responsive-layout, references, condi
|
|
|
1124
1116
|
- Loop mode clones slides in the DOM — import only originals.
|
|
1125
1117
|
- Autoplaying carousels need a pause control and must stop on focus (WCAG 2.2.2); the renderer adds both.
|
|
1126
1118
|
|
|
1127
|
-
Not carried by a stored component:
|
|
1119
|
+
Not carried by a stored component: shopify reference, variants.
|
|
1128
1120
|
|
|
1129
1121
|
### Full-bleed parallax image with overlay text (`parallax-image-overlay`)
|
|
1130
1122
|
|
|
@@ -1145,7 +1137,7 @@ Tags: media-heavy, a11y, responsive-layout, variants, conditional. Proves: Art-d
|
|
|
1145
1137
|
- Text over a busy photo fails contrast; the overlay help gives a range and the renderer checks contrast.
|
|
1146
1138
|
- A background-image has no alt — converting to an `<img>` with alt (or decorative) is part of the import.
|
|
1147
1139
|
|
|
1148
|
-
Not carried by a stored component:
|
|
1140
|
+
Not carried by a stored component: variants.
|
|
1149
1141
|
|
|
1150
1142
|
### Social photo feed (UGC) (`ugc-social-feed`)
|
|
1151
1143
|
|
|
@@ -1164,7 +1156,7 @@ Tags: dynamic-query, embed, conditional, media-heavy, references, commerce, vali
|
|
|
1164
1156
|
- Widget scripts from UGC vendors add 200–500 KB and third-party cookies — replace, don't import.
|
|
1165
1157
|
- Never mark rightsGranted true on import; only a person can confirm permission.
|
|
1166
1158
|
|
|
1167
|
-
Not carried by a stored component:
|
|
1159
|
+
Not carried by a stored component: shopify reference, variants.
|
|
1168
1160
|
|
|
1169
1161
|
## Commerce
|
|
1170
1162
|
|
|
@@ -1189,7 +1181,7 @@ Tags: dynamic-query, commerce, conditional, references, repeater, validation, va
|
|
|
1189
1181
|
- Filter values are untyped strings today (price '200' vs 200); the converter must normalize units.
|
|
1190
1182
|
- excludeCurrent only applies inside a product template; on a static page it is a no-op.
|
|
1191
1183
|
|
|
1192
|
-
Not carried by a stored component:
|
|
1184
|
+
Not carried by a stored component: variants.
|
|
1193
1185
|
|
|
1194
1186
|
### Product detail page (`commerce-product-detail`)
|
|
1195
1187
|
|
|
@@ -1213,7 +1205,7 @@ Tags: commerce, deep-nesting, polymorphic-array, conditional, references, media-
|
|
|
1213
1205
|
- Variant combinations are typed strings; renaming an option value orphans gallery `forValues` and variant rows.
|
|
1214
1206
|
- Video posters are required: autoplaying video without a poster hurts LCP on the product page.
|
|
1215
1207
|
|
|
1216
|
-
Not carried by a stored component:
|
|
1208
|
+
Not carried by a stored component: shopify reference.
|
|
1217
1209
|
|
|
1218
1210
|
### Featured product spotlight (`commerce-featured-product`)
|
|
1219
1211
|
|
|
@@ -1233,7 +1225,7 @@ Tags: references, commerce, variants, conditional, media-heavy, repeater. Proves
|
|
|
1233
1225
|
- Copying the product name into `heading` freezes it; renames in Shopify won't flow through.
|
|
1234
1226
|
- A deleted or archived product leaves the section empty — the renderer hides it and the editor flags the broken reference.
|
|
1235
1227
|
|
|
1236
|
-
Not carried by a stored component:
|
|
1228
|
+
Not carried by a stored component: variants.
|
|
1237
1229
|
|
|
1238
1230
|
### Collection header + filters (`commerce-collection-header-facets`)
|
|
1239
1231
|
|
|
@@ -1253,7 +1245,7 @@ Tags: commerce, dynamic-query, references, repeater, conditional, validation, me
|
|
|
1253
1245
|
- defaultSort must be one of sortOptions; select options can't depend on another field yet (gap), so it's validated on save.
|
|
1254
1246
|
- Importing facet values as content makes new colors invisible until someone edits the page.
|
|
1255
1247
|
|
|
1256
|
-
Not carried by a stored component:
|
|
1248
|
+
Not carried by a stored component: variants.
|
|
1257
1249
|
|
|
1258
1250
|
### Bundle builder (choose N) (`commerce-bundle-builder`)
|
|
1259
1251
|
|
|
@@ -1273,8 +1265,6 @@ Tags: commerce, conditional, references, repeater, validation. Proves: Eligible
|
|
|
1273
1265
|
- min ≤ max and ascending tier quantities can't be enforced by the schema yet (no cross-field rules).
|
|
1274
1266
|
- The page promise and the Shopify discount can disagree; the converter must flag bundles without a discountCode.
|
|
1275
1267
|
|
|
1276
|
-
Not carried by a stored component: ai, category.
|
|
1277
|
-
|
|
1278
1268
|
### Cart upsell & cross-sell (`commerce-cart-cross-sell`)
|
|
1279
1269
|
|
|
1280
1270
|
Tags: commerce, references, conditional, deep-nesting, personalization, repeater, validation. Proves: Rules array: when (condition type) → then (offer references) with condition-specific inputs · fallback list · placement
|
|
@@ -1294,8 +1284,6 @@ Tags: commerce, references, conditional, deep-nesting, personalization, repeater
|
|
|
1294
1284
|
- percentOff needs a matching Shopify discount — otherwise the price promised in the cart won't apply at checkout.
|
|
1295
1285
|
- A rule's trigger can't reference products already in the offer set; 'hideInCart' handles it at render.
|
|
1296
1286
|
|
|
1297
|
-
Not carried by a stored component: category.
|
|
1298
|
-
|
|
1299
1287
|
### Promo banner with code + countdown (`commerce-promo-countdown`)
|
|
1300
1288
|
|
|
1301
1289
|
Tags: commerce, conditional, validation, personalization, variants. Proves: Discount code with pattern validation · fixed-deadline vs per-visitor countdown (conditional) · what happens after it ends · schedule + audience
|
|
@@ -1315,7 +1303,7 @@ Tags: commerce, conditional, validation, personalization, variants. Proves: Disc
|
|
|
1315
1303
|
- hideAfter earlier than endsAt can't be caught by the schema (no cross-field rules).
|
|
1316
1304
|
- Evergreen timers that reset on refresh are deceptive; the renderer persists the start per visitor.
|
|
1317
1305
|
|
|
1318
|
-
Not carried by a stored component:
|
|
1306
|
+
Not carried by a stored component: variants.
|
|
1319
1307
|
|
|
1320
1308
|
### Shop the look (hotspots) (`commerce-shop-the-look`)
|
|
1321
1309
|
|
|
@@ -1336,7 +1324,7 @@ Tags: media-heavy, references, deep-nesting, repeater, commerce, a11y, validatio
|
|
|
1336
1324
|
- Coordinates are raw numbers today — there's no visual point picker bound to the image yet (gap).
|
|
1337
1325
|
- Dots without labels fail WCAG 4.1.2; the label is required for that reason.
|
|
1338
1326
|
|
|
1339
|
-
Not carried by a stored component:
|
|
1327
|
+
Not carried by a stored component: variants.
|
|
1340
1328
|
|
|
1341
1329
|
### Size guide table (`commerce-size-guide`)
|
|
1342
1330
|
|
|
@@ -1358,8 +1346,6 @@ Tags: repeater, validation, a11y, references, media-heavy. Proves: `table` type:
|
|
|
1358
1346
|
- Auto-converting inches to cm produces values the brand never published.
|
|
1359
1347
|
- A size guide pasted as an image fails accessibility; the converter should OCR it into rows and keep the image only as the diagram.
|
|
1360
1348
|
|
|
1361
|
-
Not carried by a stored component: category.
|
|
1362
|
-
|
|
1363
1349
|
### Store locator (`commerce-store-locator`)
|
|
1364
1350
|
|
|
1365
1351
|
Tags: references, dynamic-query, conditional, deep-nesting, repeater, validation, embed, seo-structured. Proves: Locations collection query vs written-here list · geopoint · weekly hours + holiday exceptions with HH:MM validation · map provider settings
|
|
@@ -1380,7 +1366,7 @@ Tags: references, dynamic-query, conditional, deep-nesting, repeater, validation
|
|
|
1380
1366
|
- Overnight hours (closes 01:00) need care: closes < opens means past midnight.
|
|
1381
1367
|
- The Locations collection does not exist in the demo seed, so the collection path can't be previewed here.
|
|
1382
1368
|
|
|
1383
|
-
Not carried by a stored component:
|
|
1369
|
+
Not carried by a stored component: variants.
|
|
1384
1370
|
|
|
1385
1371
|
### Product comparison (2–4) (`commerce-product-comparison`)
|
|
1386
1372
|
|
|
@@ -1401,8 +1387,6 @@ Tags: references, commerce, deep-nesting, repeater, validation, conditional, a11
|
|
|
1401
1387
|
- Keeping `products` and the spec columns in step (add a product → add its column) is the editor's job today; a column source ('one column per item of products') is the follow-up (gap 3).
|
|
1402
1388
|
- Icon-only cells need text alternatives; Yes / no cells render ✓ plus the words, which is what search and AI read.
|
|
1403
1389
|
|
|
1404
|
-
Not carried by a stored component: ai, category.
|
|
1405
|
-
|
|
1406
1390
|
## Pricing & plans
|
|
1407
1391
|
|
|
1408
1392
|
### Plans with monthly / yearly switch (`pricing-tiers-billing-toggle`)
|
|
@@ -1425,7 +1409,7 @@ Tags: commerce, conditional, validation, repeater, variants. Proves: Both cycle
|
|
|
1425
1409
|
- `inherits` is a free string, not a reference to a sibling plan — renaming a plan leaves stale 'Everything in' lines (gap: references within the same entry).
|
|
1426
1410
|
- Per-seat prices must say 'per seat' near the number, not only in the footnote.
|
|
1427
1411
|
|
|
1428
|
-
Not carried by a stored component:
|
|
1412
|
+
Not carried by a stored component: variants.
|
|
1429
1413
|
|
|
1430
1414
|
### Usage-based price calculator (`pricing-usage-calculator`)
|
|
1431
1415
|
|
|
@@ -1447,8 +1431,6 @@ Tags: deep-nesting, repeater, validation, conditional, commerce. Proves: Slider
|
|
|
1447
1431
|
- min < start < max is a cross-field rule the schema can't express yet.
|
|
1448
1432
|
- Graduated vs volume pricing are different maths; this model is graduated only — say so in notes for volume-priced brands.
|
|
1449
1433
|
|
|
1450
|
-
Not carried by a stored component: category.
|
|
1451
|
-
|
|
1452
1434
|
### Full feature comparison matrix (`pricing-feature-matrix`)
|
|
1453
1435
|
|
|
1454
1436
|
Tags: deep-nesting, repeater, conditional, validation, responsive-layout, a11y. Proves: Plans as keyed columns · one `table` keyed by plan key · Yes / no columns with per-row (limits) and per-cell (partial, add-on, soon) types · row groups · price row → Offers JSON-LD · sticky header + mobile mode
|
|
@@ -1471,8 +1453,6 @@ Tags: deep-nesting, repeater, conditional, validation, responsive-layout, a11y.
|
|
|
1471
1453
|
- Price lines in the header duplicate the plan cards above — they should reference one plan source (gap: plans as CMS items).
|
|
1472
1454
|
- Icon-only cells need words: Yes / no cells render ✓ / – plus visually hidden 'Included' / 'Not included'.
|
|
1473
1455
|
|
|
1474
|
-
Not carried by a stored component: category.
|
|
1475
|
-
|
|
1476
1456
|
### Single plan with add-ons (`pricing-single-plan-addons`)
|
|
1477
1457
|
|
|
1478
1458
|
Tags: commerce, repeater, conditional, validation, rich-text. Proves: One plan object + add-on array with units, quantities and preselection · eligibility flags · live total
|
|
@@ -1492,8 +1472,6 @@ Tags: commerce, repeater, conditional, validation, rich-text. Proves: One plan o
|
|
|
1492
1472
|
- A minimum term hidden in small print is a trust killer — it has its own field on purpose.
|
|
1493
1473
|
- Mixed units (per month + per session) can't be summed into one honest monthly number without an assumption; show the breakdown.
|
|
1494
1474
|
|
|
1495
|
-
Not carried by a stored component: category.
|
|
1496
|
-
|
|
1497
1475
|
### Enterprise contact card (`pricing-enterprise-card`)
|
|
1498
1476
|
|
|
1499
1477
|
Tags: conditional, references, form, repeater, a11y, media-heavy. Proves: Action select → form reference (opens in place) / calendar URL / plain link · compliance badges · customer logos with alt · inline quote
|
|
@@ -1512,8 +1490,6 @@ Tags: conditional, references, form, repeater, a11y, media-heavy. Proves: Action
|
|
|
1512
1490
|
- Inlining the contact-sales fields into the section creates a second form with separate submissions and rules.
|
|
1513
1491
|
- Compliance badges are claims; the converter imports them but flags them for a human to confirm.
|
|
1514
1492
|
|
|
1515
|
-
Not carried by a stored component: ai, category.
|
|
1516
|
-
|
|
1517
1493
|
### Pricing FAQ (`pricing-faq`)
|
|
1518
1494
|
|
|
1519
1495
|
Tags: rich-text, seo-structured, conditional, references, repeater, validation. Proves: Grouped questions (written here or FAQs collection) · price tokens in answers so copy never drifts from the plans · FAQPage rich results
|
|
@@ -1532,7 +1508,7 @@ Tags: rich-text, seo-structured, conditional, references, repeater, validation.
|
|
|
1532
1508
|
- Tokens are plain strings inside rich text — typos aren't caught until preview (gap: typed inline references to plan fields).
|
|
1533
1509
|
- Two FAQ blocks emitting FAQPage on one URL is invalid; the toggle exists for that.
|
|
1534
1510
|
|
|
1535
|
-
Not carried by a stored component:
|
|
1511
|
+
Not carried by a stored component: variants.
|
|
1536
1512
|
|
|
1537
1513
|
### Pay-yearly savings banner (`pricing-annual-savings-banner`)
|
|
1538
1514
|
|
|
@@ -1551,8 +1527,6 @@ Tags: personalization, conditional, validation, commerce. Proves: Savings expres
|
|
|
1551
1527
|
- The saving isn't computed from the actual plan prices (no computed fields) — a price change can make the banner untrue.
|
|
1552
1528
|
- Targeting signed-in members needs the portal integration; without it the banner silently shows to no one.
|
|
1553
1529
|
|
|
1554
|
-
Not carried by a stored component: ai, category.
|
|
1555
|
-
|
|
1556
1530
|
## Conversion & forms
|
|
1557
1531
|
|
|
1558
1532
|
### CTA band (`conversion-cta-band`)
|
|
@@ -1573,7 +1547,7 @@ Tags: variants, conditional, media-heavy. Proves: Variants that swap layout with
|
|
|
1573
1547
|
- Fields can't be conditioned on the variant (gap) — `image` is always visible and its help explains why.
|
|
1574
1548
|
- Hard-coded hex colors break dark mode and brand updates; map to tokens.
|
|
1575
1549
|
|
|
1576
|
-
Not carried by a stored component:
|
|
1550
|
+
Not carried by a stored component: variants.
|
|
1577
1551
|
|
|
1578
1552
|
### Newsletter sign-up with consent (`conversion-newsletter-consent`)
|
|
1579
1553
|
|
|
@@ -1594,7 +1568,7 @@ Tags: form, references, conditional, validation, a11y, repeater. Proves: The sim
|
|
|
1594
1568
|
- A pre-ticked consent box is not valid consent under GDPR — the option says 'Unticked'.
|
|
1595
1569
|
- Submit is a string, not `type: button`: our button unit is label + LINK, and a submit action has no link (gap: action buttons).
|
|
1596
1570
|
|
|
1597
|
-
Not carried by a stored component:
|
|
1571
|
+
Not carried by a stored component: variants.
|
|
1598
1572
|
|
|
1599
1573
|
### Lead capture form + success state (`conversion-lead-capture`)
|
|
1600
1574
|
|
|
@@ -1616,7 +1590,7 @@ Tags: form, references, conditional, repeater, validation, rich-text. Proves: Fo
|
|
|
1616
1590
|
- Redirect pages must exist and be noindexed natively — never add a robots field to the section.
|
|
1617
1591
|
- Token names in hidden fields are free strings; a typo silently sends an empty value.
|
|
1618
1592
|
|
|
1619
|
-
Not carried by a stored component:
|
|
1593
|
+
Not carried by a stored component: variants.
|
|
1620
1594
|
|
|
1621
1595
|
### Multi-step form (`conversion-multi-step-form`)
|
|
1622
1596
|
|
|
@@ -1638,8 +1612,6 @@ Tags: form, polymorphic-array, deep-nesting, conditional, validation, references
|
|
|
1638
1612
|
- Inline-built forms fork submissions and notifications from the Forms area; keep them rare.
|
|
1639
1613
|
- Persisting answers in localStorage is a privacy risk for health data.
|
|
1640
1614
|
|
|
1641
|
-
Not carried by a stored component: category.
|
|
1642
|
-
|
|
1643
1615
|
### Booking / reservations embed (`conversion-booking-embed`)
|
|
1644
1616
|
|
|
1645
1617
|
Tags: embed, conditional, repeater, validation, media-heavy, rich-text. Proves: Provider select → provider-specific ids (conditional) · experiences array with party-size range and deposits · large-party handoff
|
|
@@ -1659,8 +1631,6 @@ Tags: embed, conditional, repeater, validation, media-heavy, rich-text. Proves:
|
|
|
1659
1631
|
- partyMin ≤ partyMax is a cross-field rule the schema can't express (gap).
|
|
1660
1632
|
- Widget heights vary by provider; the renderer reserves space to avoid layout shift.
|
|
1661
1633
|
|
|
1662
|
-
Not carried by a stored component: category.
|
|
1663
|
-
|
|
1664
1634
|
### Waitlist with referral rewards (`conversion-waitlist-referral`)
|
|
1665
1635
|
|
|
1666
1636
|
Tags: form, references, conditional, repeater, validation, media-heavy. Proves: Reuses one form with a list tag · referral reward ladder · share channels + message token · an honest signup counter with a minimum
|
|
@@ -1681,8 +1651,6 @@ Tags: form, references, conditional, repeater, validation, media-heavy. Proves:
|
|
|
1681
1651
|
- Static 'join 12,000 others' numbers are often invented; the schema doesn't allow typing one.
|
|
1682
1652
|
- {{position}} only makes sense with referrals on; the editor warns when it's used without them.
|
|
1683
1653
|
|
|
1684
|
-
Not carried by a stored component: ai, category.
|
|
1685
|
-
|
|
1686
1654
|
### Contact section (`conversion-contact-section`)
|
|
1687
1655
|
|
|
1688
1656
|
Tags: form, references, repeater, conditional, embed, variants, a11y. Proves: Channel cards with typed links (email / phone / chat / visit) · form reference · optional map pin + address · layout variants
|
|
@@ -1701,7 +1669,7 @@ Tags: form, references, repeater, conditional, embed, variants, a11y. Proves: Ch
|
|
|
1701
1669
|
- Email addresses and phone numbers duplicated across header, footer and contact drift apart — prefer site settings + references (gap: global values referenced from sections).
|
|
1702
1670
|
- Address must be text as well as a pin; maps aren't accessible on their own.
|
|
1703
1671
|
|
|
1704
|
-
Not carried by a stored component:
|
|
1672
|
+
Not carried by a stored component: variants.
|
|
1705
1673
|
|
|
1706
1674
|
### Quiz / product finder (`conversion-quiz-product-finder`)
|
|
1707
1675
|
|
|
@@ -1722,8 +1690,6 @@ Tags: deep-nesting, conditional, references, repeater, validation, form, persona
|
|
|
1722
1690
|
- Picture-card images can't be shown/hidden by the PARENT question's style (gap: parent-scoped conditions), so the image field is always visible with an explaining hint.
|
|
1723
1691
|
- A gate that hides results until an email is given is a dark pattern; results always show.
|
|
1724
1692
|
|
|
1725
|
-
Not carried by a stored component: ai, category.
|
|
1726
|
-
|
|
1727
1693
|
### Exit-intent popup (`conversion-exit-intent-popup`)
|
|
1728
1694
|
|
|
1729
1695
|
Tags: conditional, personalization, form, references, validation, a11y, media-heavy. Proves: Trigger rules (exit / delay / scroll / click) with per-trigger inputs · page targeting · frequency capping · offer as code / form / link
|
|
@@ -1744,8 +1710,6 @@ Tags: conditional, personalization, form, references, validation, a11y, media-he
|
|
|
1744
1710
|
- Never show on /checkout — it's in the default excludes.
|
|
1745
1711
|
- Focus must move into the dialog and return on close; that's the renderer's job, so there's no field for it.
|
|
1746
1712
|
|
|
1747
|
-
Not carried by a stored component: ai, category, kind:global.
|
|
1748
|
-
|
|
1749
1713
|
### Trust badges & guarantees row (`conversion-trust-badges`)
|
|
1750
1714
|
|
|
1751
1715
|
Tags: repeater, a11y, variants, conditional, validation, media-heavy. Proves: Typed badges (guarantee / shipping / certification…) with logo only when certified · payment icons as a multiselect · a synced review score that can't be typed
|
|
@@ -1765,7 +1729,7 @@ Tags: repeater, a11y, variants, conditional, validation, media-heavy. Proves: Ty
|
|
|
1765
1729
|
- Payment icons for methods not enabled at checkout are a common trust-breaker.
|
|
1766
1730
|
- Icon-only badges need text; the title is required.
|
|
1767
1731
|
|
|
1768
|
-
Not carried by a stored component:
|
|
1732
|
+
Not carried by a stored component: variants.
|
|
1769
1733
|
|
|
1770
1734
|
## Listings & feeds
|
|
1771
1735
|
|
|
@@ -1791,7 +1755,7 @@ Tags: dynamic-query, references, conditional, variants, validation. Proves: A li
|
|
|
1791
1755
|
- pageSize that isn't a multiple of columns leaves a ragged last row.
|
|
1792
1756
|
- A topic-scoped index (/journal/topic/camp) is a page template on the Topics collection, not a copy of this section per topic.
|
|
1793
1757
|
|
|
1794
|
-
Not carried by a stored component:
|
|
1758
|
+
Not carried by a stored component: variants.
|
|
1795
1759
|
|
|
1796
1760
|
### Category filter bar (`category-filter-bar`)
|
|
1797
1761
|
|
|
@@ -1813,7 +1777,7 @@ Tags: references, dynamic-query, conditional, variants, responsive-layout, a11y.
|
|
|
1813
1777
|
- Counts that include drafts or future posts — counts must use the published query.
|
|
1814
1778
|
- Wrapping 12 chips on a phone pushes the list below the fold.
|
|
1815
1779
|
|
|
1816
|
-
Not carried by a stored component:
|
|
1780
|
+
Not carried by a stored component: variants.
|
|
1817
1781
|
|
|
1818
1782
|
### Related posts (`related-posts`)
|
|
1819
1783
|
|
|
@@ -1835,7 +1799,7 @@ Tags: conditional, references, dynamic-query, validation, variants. Proves: Auto
|
|
|
1835
1799
|
- Picking the current post (self-reference) — the renderer must skip it.
|
|
1836
1800
|
- Unpublished picks: the reference resolves only to published entries on the live site.
|
|
1837
1801
|
|
|
1838
|
-
Not carried by a stored component:
|
|
1802
|
+
Not carried by a stored component: variants.
|
|
1839
1803
|
|
|
1840
1804
|
### Resource library (`resource-library`)
|
|
1841
1805
|
|
|
@@ -1858,7 +1822,7 @@ Tags: dynamic-query, repeater, conditional, references, form, validation, respon
|
|
|
1858
1822
|
- Gating every type (including blog-like guides) hurts organic traffic; gate by type.
|
|
1859
1823
|
- Pinned items that also match the filters appear twice unless the renderer de-duplicates.
|
|
1860
1824
|
|
|
1861
|
-
Not carried by a stored component:
|
|
1825
|
+
Not carried by a stored component: variants.
|
|
1862
1826
|
|
|
1863
1827
|
### Podcast episode list (`podcast-episode-list`)
|
|
1864
1828
|
|
|
@@ -1880,7 +1844,7 @@ Tags: dynamic-query, media-heavy, references, conditional, repeater, embed, a11y
|
|
|
1880
1844
|
- Two players playing at once when several inline players exist — the renderer must use one shared player.
|
|
1881
1845
|
- Trailers at the top of a 'newest' list unless types excludes them.
|
|
1882
1846
|
|
|
1883
|
-
Not carried by a stored component:
|
|
1847
|
+
Not carried by a stored component: variants.
|
|
1884
1848
|
|
|
1885
1849
|
### Changelog (`changelog`)
|
|
1886
1850
|
|
|
@@ -1903,7 +1867,7 @@ Tags: deep-nesting, repeater, conditional, rich-text, validation, dynamic-query,
|
|
|
1903
1867
|
- Version strings with spaces or dates as versions collide as anchors.
|
|
1904
1868
|
- 60+ releases inline makes the section slow to edit — move to the collection.
|
|
1905
1869
|
|
|
1906
|
-
Not carried by a stored component:
|
|
1870
|
+
Not carried by a stored component: variants.
|
|
1907
1871
|
|
|
1908
1872
|
### Public roadmap (`public-roadmap`)
|
|
1909
1873
|
|
|
@@ -1926,7 +1890,7 @@ Tags: deep-nesting, repeater, conditional, references, form, validation. Proves:
|
|
|
1926
1890
|
- Editable vote counts invite fake numbers — keep votes read-only.
|
|
1927
1891
|
- Dates as promises ('Ships Oct 3') — use quarters.
|
|
1928
1892
|
|
|
1929
|
-
Not carried by a stored component:
|
|
1893
|
+
Not carried by a stored component: variants.
|
|
1930
1894
|
|
|
1931
1895
|
### Search results page (`search-results-page`)
|
|
1932
1896
|
|
|
@@ -1948,7 +1912,7 @@ Tags: dynamic-query, references, conditional, repeater, validation, a11y. Proves
|
|
|
1948
1912
|
- A label-less search input fails WCAG 1.3.1 / 4.1.2 — label is required.
|
|
1949
1913
|
- Search pages must be noindex — the platform does it natively; never add a field for it.
|
|
1950
1914
|
|
|
1951
|
-
Not carried by a stored component:
|
|
1915
|
+
Not carried by a stored component: shopify reference, variants.
|
|
1952
1916
|
|
|
1953
1917
|
## Long-form & docs
|
|
1954
1918
|
|
|
@@ -1974,8 +1938,6 @@ Tags: rich-text, references, media-heavy, embed, conditional, validation, seo-st
|
|
|
1974
1938
|
- Sponsored links without rel=sponsored — set by the sponsorLink default.
|
|
1975
1939
|
- updatedAt bumped for typo fixes makes every post look fresh and erodes trust.
|
|
1976
1940
|
|
|
1977
|
-
Not carried by a stored component: ai, category, kind:entry (props).
|
|
1978
|
-
|
|
1979
1941
|
### Author bio (`author-bio`)
|
|
1980
1942
|
|
|
1981
1943
|
Tags: references, conditional, variants, dynamic-query, a11y. Proves: One reference drives photo, name, role, bio and socials · per-placement bio override · latest posts by that author
|
|
@@ -1996,7 +1958,7 @@ Tags: references, conditional, variants, dynamic-query, a11y. Proves: One refere
|
|
|
1996
1958
|
- 'Latest posts' listing the current post.
|
|
1997
1959
|
- Two authors: the box must render both or say why only the first.
|
|
1998
1960
|
|
|
1999
|
-
Not carried by a stored component:
|
|
1961
|
+
Not carried by a stored component: variants.
|
|
2000
1962
|
|
|
2001
1963
|
### Docs page (`docs-page`)
|
|
2002
1964
|
|
|
@@ -2020,8 +1982,6 @@ Tags: rich-text, references, global-synced, conditional, embed, validation. Prov
|
|
|
2020
1982
|
- Deprecated without a replacement link — the reader is stranded.
|
|
2021
1983
|
- Relative links (../guides/x) must be rewritten to page references on import.
|
|
2022
1984
|
|
|
2023
|
-
Not carried by a stored component: category, kind:entry (props).
|
|
2024
|
-
|
|
2025
1985
|
### Code tabs (`code-tabs`)
|
|
2026
1986
|
|
|
2027
1987
|
Tags: embed, repeater, validation, variants. Proves: One example in N languages · language is a select, not a free label · tabs sync across the page by key
|
|
@@ -2042,7 +2002,7 @@ Tags: embed, repeater, validation, variants. Proves: One example in N languages
|
|
|
2042
2002
|
- API keys in sample code — replace real-looking secrets with $ENV placeholders.
|
|
2043
2003
|
- The `code` field's built-in language list (html/css/js/liquid/json) doesn't cover API languages — the select carries it.
|
|
2044
2004
|
|
|
2045
|
-
Not carried by a stored component:
|
|
2005
|
+
Not carried by a stored component: variants.
|
|
2046
2006
|
|
|
2047
2007
|
### Knowledge-base article (`kb-article`)
|
|
2048
2008
|
|
|
@@ -2064,8 +2024,6 @@ Tags: rich-text, form, conditional, references, validation. Proves: 'Was this he
|
|
|
2064
2024
|
- No owner → stale answers nobody reviews.
|
|
2065
2025
|
- Plan badges as body text drift from pricing — use appliesTo.
|
|
2066
2026
|
|
|
2067
|
-
Not carried by a stored component: category, kind:entry (props).
|
|
2068
|
-
|
|
2069
2027
|
### Glossary A–Z (`glossary`)
|
|
2070
2028
|
|
|
2071
2029
|
Tags: dynamic-query, repeater, conditional, references, seo-structured, a11y, validation. Proves: Terms written here or from a Glossary collection · auto letter index · aliases and see-also links · each term deep-linkable
|
|
@@ -2086,7 +2044,7 @@ Tags: dynamic-query, repeater, conditional, references, seo-structured, a11y, va
|
|
|
2086
2044
|
- 300 inline terms is the ceiling — beyond that, use the collection.
|
|
2087
2045
|
- Localised term lists re-sort per language (Ä, Ø, Ł) — sort with the locale's collation.
|
|
2088
2046
|
|
|
2089
|
-
Not carried by a stored component:
|
|
2047
|
+
Not carried by a stored component: variants.
|
|
2090
2048
|
|
|
2091
2049
|
### Recipe (`recipe`)
|
|
2092
2050
|
|
|
@@ -2110,7 +2068,7 @@ Tags: deep-nesting, repeater, seo-structured, media-heavy, conditional, referenc
|
|
|
2110
2068
|
- Dietary claims set at recipe level while an optional ingredient breaks them.
|
|
2111
2069
|
- Timer fields filled but hasTimer off — hidden values still ship unless cleared on save.
|
|
2112
2070
|
|
|
2113
|
-
Not carried by a stored component:
|
|
2071
|
+
Not carried by a stored component: shopify reference.
|
|
2114
2072
|
|
|
2115
2073
|
### Course curriculum (`course-curriculum`)
|
|
2116
2074
|
|
|
@@ -2132,7 +2090,7 @@ Tags: deep-nesting, repeater, conditional, references, validation, media-heavy,
|
|
|
2132
2090
|
- Live lesson times stored in local time without a zone.
|
|
2133
2091
|
- Five levels inline (course → module → lesson → resource → file) — keep resources tiny and inline.
|
|
2134
2092
|
|
|
2135
|
-
Not carried by a stored component:
|
|
2093
|
+
Not carried by a stored component: variants.
|
|
2136
2094
|
|
|
2137
2095
|
### Legal / policy page (`legal-policy`)
|
|
2138
2096
|
|
|
@@ -2155,8 +2113,6 @@ Tags: deep-nesting, repeater, rich-text, validation, conditional, a11y, localize
|
|
|
2155
2113
|
- 'Last updated' bumped for typos implies the terms changed.
|
|
2156
2114
|
- Localized policies must be reviewed per locale, not machine-translated — flag localized fields.
|
|
2157
2115
|
|
|
2158
|
-
Not carried by a stored component: category, kind:entry (props).
|
|
2159
|
-
|
|
2160
2116
|
### Case study (`case-study`)
|
|
2161
2117
|
|
|
2162
2118
|
Tags: rich-text, repeater, references, conditional, media-heavy, validation. Proves: Customer facts as an object · headline metrics repeater · challenge/solution/results as three rich-text bodies · quote written here or referenced
|
|
@@ -2178,8 +2134,6 @@ Tags: rich-text, repeater, references, conditional, media-heavy, validation. Pro
|
|
|
2178
2134
|
- Customer logos as JPG with a white box — ask for SVG/transparent PNG.
|
|
2179
2135
|
- Duplicate quotes typed in three places drift — reference Testimonials.
|
|
2180
2136
|
|
|
2181
|
-
Not carried by a stored component: ai, category, kind:entry (props).
|
|
2182
|
-
|
|
2183
2137
|
### Podcast episode (`podcast-episode`)
|
|
2184
2138
|
|
|
2185
2139
|
Tags: media-heavy, embed, references, repeater, seo-structured, a11y, validation, conditional. Proves: Audio file + show notes + timestamped chapters + transcript (a11y) · guests by reference · feeds the RSS and PodcastEpisode JSON-LD
|
|
@@ -2201,8 +2155,6 @@ Tags: media-heavy, embed, references, repeater, seo-structured, a11y, validation
|
|
|
2201
2155
|
- Missing transcript fails accessibility and loses search traffic.
|
|
2202
2156
|
- Changing the audio file URL after publish re-downloads in every subscriber's app — replace in place.
|
|
2203
2157
|
|
|
2204
|
-
Not carried by a stored component: category, kind:entry (props).
|
|
2205
|
-
|
|
2206
2158
|
## Company & people
|
|
2207
2159
|
|
|
2208
2160
|
### Team grid (`team-grid`)
|
|
@@ -2225,7 +2177,7 @@ Tags: references, dynamic-query, conditional, variants, a11y, validation. Proves
|
|
|
2225
2177
|
- Former employees lingering — set end dates, keep excludeAlumni on.
|
|
2226
2178
|
- Department tabs with one person each look broken — hide tabs under ~12 people.
|
|
2227
2179
|
|
|
2228
|
-
Not carried by a stored component:
|
|
2180
|
+
Not carried by a stored component: variants.
|
|
2229
2181
|
|
|
2230
2182
|
### Leadership with bios (`leadership-bios`)
|
|
2231
2183
|
|
|
@@ -2247,7 +2199,7 @@ Tags: references, conditional, rich-text, repeater, variants, a11y. Proves: Grou
|
|
|
2247
2199
|
- Bios in first person on one page and third on another — the override exists for this.
|
|
2248
2200
|
- Investor logos mixed into this section — they belong in a logo wall.
|
|
2249
2201
|
|
|
2250
|
-
Not carried by a stored component:
|
|
2202
|
+
Not carried by a stored component: variants.
|
|
2251
2203
|
|
|
2252
2204
|
### Values & culture (`values-culture`)
|
|
2253
2205
|
|
|
@@ -2268,7 +2220,7 @@ Tags: repeater, media-heavy, variants, validation, a11y. Proves: Values with a r
|
|
|
2268
2220
|
- Perks with prices or policies that change — keep them short and dated in HR, not here.
|
|
2269
2221
|
- Nine-value lists — validation caps at eight; past five, nobody remembers them.
|
|
2270
2222
|
|
|
2271
|
-
Not carried by a stored component:
|
|
2223
|
+
Not carried by a stored component: variants.
|
|
2272
2224
|
|
|
2273
2225
|
### Careers list (`careers-list`)
|
|
2274
2226
|
|
|
@@ -2290,7 +2242,7 @@ Tags: dynamic-query, conditional, references, variants, embed. Proves: Open role
|
|
|
2290
2242
|
- ATS iframes are unstyled and invisible to search — prefer the sync.
|
|
2291
2243
|
- Salary on the row but not on the job page (or vice versa) — one source: the job entry.
|
|
2292
2244
|
|
|
2293
|
-
Not carried by a stored component:
|
|
2245
|
+
Not carried by a stored component: variants.
|
|
2294
2246
|
|
|
2295
2247
|
### Job posting (`job-posting`)
|
|
2296
2248
|
|
|
@@ -2313,8 +2265,6 @@ Tags: seo-structured, conditional, references, repeater, validation, form. Prove
|
|
|
2313
2265
|
- Closed roles deleted instead of closed: their URLs 404 and lose links. Close them.
|
|
2314
2266
|
- Benefits retyped on every job drift — use the shared block.
|
|
2315
2267
|
|
|
2316
|
-
Not carried by a stored component: category, kind:entry (props).
|
|
2317
|
-
|
|
2318
2268
|
### About & mission with timeline (`about-timeline`)
|
|
2319
2269
|
|
|
2320
2270
|
Tags: repeater, media-heavy, rich-text, references, variants, validation. Proves: Mission + story (rich text) · founders by reference · stats · dated milestones with optional photo and link · order and orientation as design
|
|
@@ -2334,7 +2284,7 @@ Tags: repeater, media-heavy, rich-text, references, variants, validation. Proves
|
|
|
2334
2284
|
- A timeline of 30 tiny events — the cap is 30; most stories need 6–10.
|
|
2335
2285
|
- Founder bios duplicated here — reference people instead.
|
|
2336
2286
|
|
|
2337
|
-
Not carried by a stored component:
|
|
2287
|
+
Not carried by a stored component: variants.
|
|
2338
2288
|
|
|
2339
2289
|
### Press & brand kit (`press-kit`)
|
|
2340
2290
|
|
|
@@ -2356,7 +2306,7 @@ Tags: deep-nesting, repeater, media-heavy, conditional, validation, a11y. Proves
|
|
|
2356
2306
|
- Photos without credits get printed uncredited — credit is required for photos.
|
|
2357
2307
|
- A stale .zip that no longer matches the assets shown.
|
|
2358
2308
|
|
|
2359
|
-
Not carried by a stored component:
|
|
2309
|
+
Not carried by a stored component: variants.
|
|
2360
2310
|
|
|
2361
2311
|
## Events & places
|
|
2362
2312
|
|
|
@@ -2380,7 +2330,7 @@ Tags: dynamic-query, conditional, variants, references, a11y. Proves: Upcoming /
|
|
|
2380
2330
|
- Deleting past events loses their recordings and links — keep them, the list hides them.
|
|
2381
2331
|
- Calendar variant with three events looks empty — use the list until there are ~8 a month.
|
|
2382
2332
|
|
|
2383
|
-
Not carried by a stored component:
|
|
2333
|
+
Not carried by a stored component: variants.
|
|
2384
2334
|
|
|
2385
2335
|
### Event detail (conference) (`event-detail`)
|
|
2386
2336
|
|
|
@@ -2404,8 +2354,6 @@ Tags: deep-nesting, references, seo-structured, conditional, commerce, repeater,
|
|
|
2404
2354
|
- Cancelled events deleted rather than marked — Google keeps showing the old date.
|
|
2405
2355
|
- Sold-out early-bird tiers left 'On sale' after salesEnd — use the window, not the badge.
|
|
2406
2356
|
|
|
2407
|
-
Not carried by a stored component: category, kind:entry (props).
|
|
2408
|
-
|
|
2409
2357
|
### Webinar registration (`webinar-registration`)
|
|
2410
2358
|
|
|
2411
2359
|
Tags: form, conditional, references, embed, validation, variants. Proves: One section across the lifecycle: upcoming (form) → live (stream) → on demand (recording, optionally gated) · CRM campaign locked
|
|
@@ -2426,7 +2374,7 @@ Tags: form, conditional, references, embed, validation, variants. Proves: One se
|
|
|
2426
2374
|
- Leaving stage 'live' after the event — the page shows a dead stream.
|
|
2427
2375
|
- Gating on-demand recordings of public talks lowers reach; gate deliberately.
|
|
2428
2376
|
|
|
2429
|
-
Not carried by a stored component:
|
|
2377
|
+
Not carried by a stored component: variants.
|
|
2430
2378
|
|
|
2431
2379
|
### Locations directory (`locations-directory`)
|
|
2432
2380
|
|
|
@@ -2450,7 +2398,7 @@ Tags: dynamic-query, conditional, repeater, deep-nesting, validation, a11y, resp
|
|
|
2450
2398
|
- Pins at the geocoded centroid of a mall instead of the door.
|
|
2451
2399
|
- A map without a list fails keyboard and screen-reader users — the list is the primary UI.
|
|
2452
2400
|
|
|
2453
|
-
Not carried by a stored component:
|
|
2401
|
+
Not carried by a stored component: variants.
|
|
2454
2402
|
|
|
2455
2403
|
### Restaurant menu (`restaurant-menu`)
|
|
2456
2404
|
|
|
@@ -2474,7 +2422,7 @@ Tags: deep-nesting, repeater, commerce, conditional, variants, localized, valida
|
|
|
2474
2422
|
- Prices typed with symbols ('$18') break sorting and JSON-LD.
|
|
2475
2423
|
- Four nesting levels: keep sizes inline (openMode inline) so the deepest level isn't another drill.
|
|
2476
2424
|
|
|
2477
|
-
Not carried by a stored component:
|
|
2425
|
+
Not carried by a stored component: variants.
|
|
2478
2426
|
|
|
2479
2427
|
### Single location page (`location-page`)
|
|
2480
2428
|
|
|
@@ -2498,8 +2446,6 @@ Tags: seo-structured, repeater, conditional, references, media-heavy, a11y, vali
|
|
|
2498
2446
|
- A booking widget without a phone fallback excludes people who can't use it.
|
|
2499
2447
|
- closed defaults to false or new days hide their shifts.
|
|
2500
2448
|
|
|
2501
|
-
Not carried by a stored component: category, kind:entry (props).
|
|
2502
|
-
|
|
2503
2449
|
## Data & interactive
|
|
2504
2450
|
|
|
2505
2451
|
### Spec table (`data-table-specs`)
|
|
@@ -2523,7 +2469,7 @@ Tags: repeater, conditional, validation, a11y. Proves: Typed columns · rows fro
|
|
|
2523
2469
|
- Past ~60 rows, keep the data in CSV or a collection; the grid stays usable but the page gets heavy.
|
|
2524
2470
|
- Do not model 'striped' or 'compact' as booleans — they are variants.
|
|
2525
2471
|
|
|
2526
|
-
Not carried by a stored component:
|
|
2472
|
+
Not carried by a stored component: variants.
|
|
2527
2473
|
|
|
2528
2474
|
### Table (`table-comparison`)
|
|
2529
2475
|
|
|
@@ -2544,8 +2490,6 @@ Tags: validation, a11y, seo-structured, references, commerce. Proves: The `table
|
|
|
2544
2490
|
- A blank cell in a yes/no column is 'Not included'; a blank cell anywhere else is 'No value'.
|
|
2545
2491
|
- Don't retype units in cells — the column carries them.
|
|
2546
2492
|
|
|
2547
|
-
Not carried by a stored component: ai, category.
|
|
2548
|
-
|
|
2549
2493
|
### Chart with annotations (`chart-attrition`)
|
|
2550
2494
|
|
|
2551
2495
|
Tags: repeater, conditional, a11y, validation. Proves: Chart type → series → data points (3 levels) · annotations · text alternative required · data from CSV or URL
|
|
@@ -2567,7 +2511,7 @@ Tags: repeater, conditional, a11y, validation. Proves: Chart type → series →
|
|
|
2567
2511
|
- Color picker accepts any hex; the series palette should be restricted to brand chart tokens for contrast (see section-theme-tokens).
|
|
2568
2512
|
- Bar charts with a non-zero `yMin` mislead; the help text warns but nothing prevents it.
|
|
2569
2513
|
|
|
2570
|
-
Not carried by a stored component:
|
|
2514
|
+
Not carried by a stored component: variants.
|
|
2571
2515
|
|
|
2572
2516
|
### ROI calculator (`roi-calculator`)
|
|
2573
2517
|
|
|
@@ -2590,7 +2534,7 @@ Tags: form, repeater, conditional, validation. Proves: Typed inputs (slider · n
|
|
|
2590
2534
|
- SCHEMA GAP: `readOnly: "developer"` is the only field-level permission — no 'finance can edit formulas' role scope.
|
|
2591
2535
|
- A select's choices need numeric values; a text-only dropdown ("Small team") must be given a number or it breaks the maths.
|
|
2592
2536
|
|
|
2593
|
-
Not carried by a stored component:
|
|
2537
|
+
Not carried by a stored component: variants.
|
|
2594
2538
|
|
|
2595
2539
|
### Product configurator (`product-configurator`)
|
|
2596
2540
|
|
|
@@ -2614,7 +2558,7 @@ Tags: commerce, deep-nesting, repeater, conditional, references, validation. Pro
|
|
|
2614
2558
|
- SCHEMA GAP: option keys need to be unique within their step only (scoped uniqueness) — `unique` is neither scoped nor enforced.
|
|
2615
2559
|
- Price deltas drift from Shopify variant prices; prefer reading the variant price and keeping priceDelta only for non-Shopify add-ons.
|
|
2616
2560
|
|
|
2617
|
-
Not carried by a stored component:
|
|
2561
|
+
Not carried by a stored component: shopify reference, variants.
|
|
2618
2562
|
|
|
2619
2563
|
### Map with markers (`stockist-map`)
|
|
2620
2564
|
|
|
@@ -2637,7 +2581,7 @@ Tags: repeater, conditional, embed, a11y, references, seo-structured. Proves: Ca
|
|
|
2637
2581
|
- SCHEMA GAP: no address type (street, locality, region, postcode, country) — needed for JSON-LD PostalAddress and geocoding; a multi-line text loses structure.
|
|
2638
2582
|
- Turning off `showList` leaves keyboard and screen-reader users with no way to reach the places.
|
|
2639
2583
|
|
|
2640
|
-
Not carried by a stored component:
|
|
2584
|
+
Not carried by a stored component: variants.
|
|
2641
2585
|
|
|
2642
2586
|
### Product comparison slider (`product-compare-slider`)
|
|
2643
2587
|
|
|
@@ -2659,7 +2603,7 @@ Tags: references, repeater, conditional, validation, commerce, responsive-layout
|
|
|
2659
2603
|
- SCHEMA GAP: array `unique: true` (no duplicate product) is declared but not enforced by the validator.
|
|
2660
2604
|
- SCHEMA GAP: custom `values` should have exactly one entry per product (a matrix keyed by another array); adding a fourth product leaves rows with three values and nothing warns.
|
|
2661
2605
|
|
|
2662
|
-
Not carried by a stored component:
|
|
2606
|
+
Not carried by a stored component: variants.
|
|
2663
2607
|
|
|
2664
2608
|
### Countdown and live counter (`countdown-live-counter`)
|
|
2665
2609
|
|
|
@@ -2681,7 +2625,7 @@ Tags: conditional, validation, localized, a11y. Proves: Datetime + time zone ·
|
|
|
2681
2625
|
- SCHEMA GAP: no 'scheduled content' primitive — after-launch copy should be a scheduled change (release) rather than a second set of fields.
|
|
2682
2626
|
- Countdowns that reset per visitor are dark patterns (and illegal under EU UCPD guidance); the schema has no per-visitor mode on purpose.
|
|
2683
2627
|
|
|
2684
|
-
Not carried by a stored component:
|
|
2628
|
+
Not carried by a stored component: variants.
|
|
2685
2629
|
|
|
2686
2630
|
### Poll (`reader-poll`)
|
|
2687
2631
|
|
|
@@ -2703,7 +2647,7 @@ Tags: form, conditional, repeater, validation, references. Proves: Question type
|
|
|
2703
2647
|
- SCHEMA GAP: no read-only, platform-computed fields — editors can't see live tallies inside the schema form; results live in another surface.
|
|
2704
2648
|
- Multiple-question surveys modelled as nested arrays in a block become an unversioned form builder — use Forms.
|
|
2705
2649
|
|
|
2706
|
-
Not carried by a stored component:
|
|
2650
|
+
Not carried by a stored component: variants.
|
|
2707
2651
|
|
|
2708
2652
|
### Embed (iframe, HTML, script) (`safe-embed`)
|
|
2709
2653
|
|
|
@@ -2726,7 +2670,7 @@ Tags: embed, conditional, a11y, validation. Proves: Kind switches URL vs code ·
|
|
|
2726
2670
|
- oEmbed providers change markup; store the URL, never the provider's HTML snapshot.
|
|
2727
2671
|
- allow-scripts + allow-same-origin on a same-origin URL removes the sandbox entirely — the help warns, nothing blocks it.
|
|
2728
2672
|
|
|
2729
|
-
Not carried by a stored component:
|
|
2673
|
+
Not carried by a stored component: variants.
|
|
2730
2674
|
|
|
2731
2675
|
### Code snippet with tabs (`code-snippet-tabs`)
|
|
2732
2676
|
|
|
@@ -2748,7 +2692,7 @@ Tags: repeater, validation, conditional, embed. Proves: Tabs per language/packag
|
|
|
2748
2692
|
- Highlight ranges aren't checked against the code's line count.
|
|
2749
2693
|
- Never store highlighted HTML (token spans) — store plain text and highlight at render.
|
|
2750
2694
|
|
|
2751
|
-
Not carried by a stored component:
|
|
2695
|
+
Not carried by a stored component: variants.
|
|
2752
2696
|
|
|
2753
2697
|
## Advanced patterns
|
|
2754
2698
|
|
|
@@ -2773,7 +2717,7 @@ Tags: deep-nesting, slots, repeater, variants, media-heavy. Proves: Guide › Ta
|
|
|
2773
2717
|
- Breadcrumb at 7 drills (Guide / Seasoning / Steps and kit / Steps / Season over fire… / Heat it upside down / Card / Button) must fold into the Pathway chip on a 380px inspector — this entry is the test case.
|
|
2774
2718
|
- Accordion item cards inside a 1/3 column are cramped; that's a variant decision, not a field.
|
|
2775
2719
|
|
|
2776
|
-
Not carried by a stored component:
|
|
2720
|
+
Not carried by a stored component: variants.
|
|
2777
2721
|
|
|
2778
2722
|
### Any-block module list (`polymorphic-modules`)
|
|
2779
2723
|
|
|
@@ -2795,8 +2739,6 @@ Tags: polymorphic-array, media-heavy, references, rich-text, repeater. Proves: O
|
|
|
2795
2739
|
- Changing an item's type (quote → callout) isn't a schema operation; the editor must delete and re-add, losing the _key.
|
|
2796
2740
|
- A textModule per paragraph is the most common bad conversion — it explodes the list and breaks reading flow.
|
|
2797
2741
|
|
|
2798
|
-
Not carried by a stored component: ai, category, kind:entry (props).
|
|
2799
|
-
|
|
2800
2742
|
### Conditional source matrix (`conditional-source-matrix`)
|
|
2801
2743
|
|
|
2802
2744
|
Tags: conditional, references, dynamic-query, commerce, validation. Proves: Manual / collection / query / external branches · nested conditionals two levels down · empty-state fallback
|
|
@@ -2817,7 +2759,7 @@ Tags: conditional, references, dynamic-query, commerce, validation. Proves: Manu
|
|
|
2817
2759
|
- SCHEMA GAP: required-if — `maxPrice` is required only when visible; that works because hidden fields skip validation, but 'required when price = between AND minPrice is set' can't be written.
|
|
2818
2760
|
- minPrice < maxPrice can't be validated (cross-field).
|
|
2819
2761
|
|
|
2820
|
-
Not carried by a stored component:
|
|
2762
|
+
Not carried by a stored component: shopify reference, variants.
|
|
2821
2763
|
|
|
2822
2764
|
### Global block with per-page overrides (`global-announcement-overrides`)
|
|
2823
2765
|
|
|
@@ -2839,7 +2781,7 @@ Tags: global-synced, conditional, validation, variants. Proves: Synced fields fr
|
|
|
2839
2781
|
- SCHEMA GAP: instance-only fields (visibility, hideReason) live in the same schema as the global's fields; there's no way to say 'this field exists only on instances'.
|
|
2840
2782
|
- Overriding `tone` on one page makes the bar look broken next to the header; consider locking design fields too.
|
|
2841
2783
|
|
|
2842
|
-
Not carried by a stored component:
|
|
2784
|
+
Not carried by a stored component: variants.
|
|
2843
2785
|
|
|
2844
2786
|
### Localized section with RTL (`localized-section`)
|
|
2845
2787
|
|
|
@@ -2862,7 +2804,7 @@ Tags: localized, repeater, conditional, a11y, validation. Proves: Localized fiel
|
|
|
2862
2804
|
- SCHEMA GAP: no `dir`/`lang` awareness in text fields — the editor won't render the Arabic copy right-to-left while typing.
|
|
2863
2805
|
- Recommended lengths are per English; German runs ~30% longer and Arabic ~25% shorter, so a single recommendedMax misfires per locale.
|
|
2864
2806
|
|
|
2865
|
-
Not carried by a stored component:
|
|
2807
|
+
Not carried by a stored component: variants.
|
|
2866
2808
|
|
|
2867
2809
|
### Personalized hero with A/B test (`personalized-hero`)
|
|
2868
2810
|
|
|
@@ -2885,7 +2827,7 @@ Tags: personalization, deep-nesting, conditional, repeater, validation. Proves:
|
|
|
2885
2827
|
- SCHEMA GAP: a variant's hidden `content` is still required-validated by its own rules if `isControl` flips — conditions hide but can't relax `required` declaratively.
|
|
2886
2828
|
- Personalized copy must not change the H1 for SEO purposes; the native page title stays the default's.
|
|
2887
2829
|
|
|
2888
|
-
Not carried by a stored component:
|
|
2830
|
+
Not carried by a stored component: variants.
|
|
2889
2831
|
|
|
2890
2832
|
### Responsive layout settings (`responsive-layout-settings`)
|
|
2891
2833
|
|
|
@@ -2907,7 +2849,7 @@ Tags: responsive-layout, repeater, conditional, variants. Proves: Columns, gap a
|
|
|
2907
2849
|
- SCHEMA GAP: `mobileOrder` should be unique among items and ≤ item count — cross-item validation isn't available.
|
|
2908
2850
|
- Hiding content on phones hides it from mobile-first indexing too; prefer reordering over hiding.
|
|
2909
2851
|
|
|
2910
|
-
Not carried by a stored component:
|
|
2852
|
+
Not carried by a stored component: variants.
|
|
2911
2853
|
|
|
2912
2854
|
### Grid with per-cell layout (`grid-cell-layout`)
|
|
2913
2855
|
|
|
@@ -2928,7 +2870,7 @@ Tags: slots, variants, media-heavy, responsive-layout, commerce. Proves: Slot ce
|
|
|
2928
2870
|
- SCHEMA GAP: slotSettings can't be conditional on the child's block type (e.g. padding 'none' only for images) and can't vary per breakpoint.
|
|
2929
2871
|
- Dense packing changes the visual order but not the DOM order — screen readers follow the DOM.
|
|
2930
2872
|
|
|
2931
|
-
Not carried by a stored component:
|
|
2873
|
+
Not carried by a stored component: variants.
|
|
2932
2874
|
|
|
2933
2875
|
### References web (`references-web`)
|
|
2934
2876
|
|
|
@@ -2951,7 +2893,7 @@ Tags: references, dynamic-query, conditional, repeater, validation. Proves: Prod
|
|
|
2951
2893
|
- SCHEMA GAP: `unique` on reference arrays isn't enforced; the same story can be pinned twice.
|
|
2952
2894
|
- Referencing pages by id survives slug changes; storing hrefs doesn't.
|
|
2953
2895
|
|
|
2954
|
-
Not carried by a stored component:
|
|
2896
|
+
Not carried by a stored component: shopify reference.
|
|
2955
2897
|
|
|
2956
2898
|
### Changelog with nested validation (`changelog-nested-validation`)
|
|
2957
2899
|
|
|
@@ -2974,7 +2916,7 @@ Tags: validation, repeater, conditional, rich-text. Proves: Releases → changes
|
|
|
2974
2916
|
- SCHEMA GAP: patterns validate strings only; a `date` can't be constrained (not in the future, after the previous release).
|
|
2975
2917
|
- Inline packages with three fields each get cramped; the inline openMode threshold (≤3 primitives) is exactly at its limit here.
|
|
2976
2918
|
|
|
2977
|
-
Not carried by a stored component:
|
|
2919
|
+
Not carried by a stored component: variants.
|
|
2978
2920
|
|
|
2979
2921
|
### Rich text with components and annotations (`rich-text-embedded-components`)
|
|
2980
2922
|
|
|
@@ -2996,8 +2938,6 @@ Tags: rich-text, references, embed, a11y, media-heavy. Proves: Body with linked
|
|
|
2996
2938
|
- SCHEMA GAP: inline references (entry links) are link-picker values serialised into the HTML, so the platform's reference graph can't see them without parsing the body.
|
|
2997
2939
|
- Footnote numbers in the text are render-time; storing '1', '2' in the markup goes stale when paragraphs move (shown here only for readable fallback).
|
|
2998
2940
|
|
|
2999
|
-
Not carried by a stored component: ai, category, kind:entry (props).
|
|
3000
|
-
|
|
3001
2941
|
### Dynamic query listing (`dynamic-query-listing`)
|
|
3002
2942
|
|
|
3003
2943
|
Tags: dynamic-query, conditional, repeater, references, validation. Proves: Collection + filter rows (field · operator · value) + sort + limit + pagination + pinned + empty state
|
|
@@ -3018,7 +2958,7 @@ Tags: dynamic-query, conditional, repeater, references, validation. Proves: Coll
|
|
|
3018
2958
|
- SCHEMA GAP: no live query preview/count in the schema (e.g. '7 entries match') and no validation that the query returns anything.
|
|
3019
2959
|
- SCHEMA GAP: AND/OR groups beyond one level (all of (A, any of (B, C))) can't be modelled without recursive object types — the language has no recursion.
|
|
3020
2960
|
|
|
3021
|
-
Not carried by a stored component:
|
|
2961
|
+
Not carried by a stored component: variants.
|
|
3022
2962
|
|
|
3023
2963
|
### Modal, drawer and popover (`overlays-with-triggers`)
|
|
3024
2964
|
|
|
@@ -3041,8 +2981,6 @@ Tags: slots, conditional, a11y, form, repeater, references. Proves: Overlays wit
|
|
|
3041
2981
|
- Exit-intent doesn't exist on touch devices; the label says '(desktop)' because the schema can't scope a trigger per device.
|
|
3042
2982
|
- Focus trap, Esc to close and focus return are renderer requirements, not fields — never make them toggles.
|
|
3043
2983
|
|
|
3044
|
-
Not carried by a stored component: category.
|
|
3045
|
-
|
|
3046
2984
|
### Sticky scroll story (`scrollytelling`)
|
|
3047
2985
|
|
|
3048
2986
|
Tags: media-heavy, repeater, conditional, a11y, variants. Proves: Steps synced to scroll with media swaps (image / video / stat) · trigger offset · reduced-motion and phone fallbacks
|
|
@@ -3063,7 +3001,7 @@ Tags: media-heavy, repeater, conditional, a11y, variants. Proves: Steps synced t
|
|
|
3063
3001
|
- Videos in sticky panels must be muted and short; there's no duration validation on the video type.
|
|
3064
3002
|
- Preview `media: "media.image"` is empty for stat/video steps — preview can't fall back across paths.
|
|
3065
3003
|
|
|
3066
|
-
Not carried by a stored component:
|
|
3004
|
+
Not carried by a stored component: variants.
|
|
3067
3005
|
|
|
3068
3006
|
### Accessibility-critical media and form (`a11y-critical-media-form`)
|
|
3069
3007
|
|
|
@@ -3086,8 +3024,6 @@ Tags: a11y, media-heavy, form, validation, conditional. Proves: Captions per lan
|
|
|
3086
3024
|
- SCHEMA GAP: the sign-up form is modelled inline because forms are a separate system; ideally the block only references the form and the form owns labels/errors.
|
|
3087
3025
|
- Autoplay over 5 seconds without a pause control fails WCAG 2.2.2; the help warns, nothing blocks it.
|
|
3088
3026
|
|
|
3089
|
-
Not carried by a stored component: category.
|
|
3090
|
-
|
|
3091
3027
|
### Section theme tokens (`section-theme-tokens`)
|
|
3092
3028
|
|
|
3093
3029
|
Tags: variants, conditional, a11y, validation, media-heavy. Proves: Dark section inside a light page · surface + accent override from brand tokens · spacing tokens · all in the Design group
|
|
@@ -3108,7 +3044,7 @@ Tags: variants, conditional, a11y, validation, media-heavy. Proves: Dark section
|
|
|
3108
3044
|
- SCHEMA GAP: no responsive values for spacing (see responsive-layout-settings).
|
|
3109
3045
|
- SCHEMA GAP: design fields are repeated per block; a shared, named object type (sectionTheme) can't be referenced by name, only copied.
|
|
3110
3046
|
|
|
3111
|
-
Not carried by a stored component:
|
|
3047
|
+
Not carried by a stored component: variants.
|
|
3112
3048
|
|
|
3113
3049
|
## Core examples
|
|
3114
3050
|
|
|
@@ -3131,7 +3067,7 @@ Tags: repeater, conditional, validation, dynamic-query. Proves: Small items stil
|
|
|
3131
3067
|
- `open` on the first item is behaviour in the worked example and stays in the template; keep the per-item boolean only if the template reads it.
|
|
3132
3068
|
- Bind the question on the <h3>, not the <summary>, or a save erases the chevron.
|
|
3133
3069
|
|
|
3134
|
-
Not carried by a stored component:
|
|
3070
|
+
Not carried by a stored component: variants.
|
|
3135
3071
|
|
|
3136
3072
|
### Mega menu (`core-megaMenu`)
|
|
3137
3073
|
|
|
@@ -3152,7 +3088,7 @@ Tags: deep-nesting, repeater, global-synced, validation. Proves: Five levels dee
|
|
|
3152
3088
|
- A nav placed on a page as a section renders nowhere, and a page that draws its own header gets no Layout copy on top: remove page-level copies.
|
|
3153
3089
|
- The worked example keeps `sticky`, colours and height in code; expose the Behaviour props only if the template reads them.
|
|
3154
3090
|
|
|
3155
|
-
Not carried by a stored component:
|
|
3091
|
+
Not carried by a stored component: category, variants.
|
|
3156
3092
|
|
|
3157
3093
|
### Tabs (`core-tabs`)
|
|
3158
3094
|
|
|
@@ -3172,7 +3108,7 @@ Tags: slots, polymorphic-array, repeater, variants. Proves: Array of tabs, each
|
|
|
3172
3108
|
- Slot children are `{ componentId, overrides? }` with no `_variant`: a variant is its own component.
|
|
3173
3109
|
- Give every block, tab and instance a stable `id`; changing one orphans the edits made against it.
|
|
3174
3110
|
|
|
3175
|
-
Not carried by a stored component:
|
|
3111
|
+
Not carried by a stored component: category, variants.
|
|
3176
3112
|
|
|
3177
3113
|
### Pricing (`core-pricing`)
|
|
3178
3114
|
|
|
@@ -3194,7 +3130,7 @@ Tags: repeater, conditional, commerce, variants, validation. Proves: Tiers → f
|
|
|
3194
3130
|
- The nested features table is the deepest a prop goes: its rows take scalars only.
|
|
3195
3131
|
- A tier added to the comparison is a new sub-field, a schema change. No Offer JSON-LD is built from prices; paste it as `schema` on update_page when needed.
|
|
3196
3132
|
|
|
3197
|
-
Not carried by a stored component:
|
|
3133
|
+
Not carried by a stored component: variants.
|
|
3198
3134
|
|
|
3199
3135
|
### Bento grid (`core-bento`)
|
|
3200
3136
|
|
|
@@ -3214,7 +3150,7 @@ Tags: slots, polymorphic-array, variants, responsive-layout, media-heavy. Proves
|
|
|
3214
3150
|
- A slot child has no `_variant`: a variant is its own component.
|
|
3215
3151
|
- slotSettings are leaf fields only; a cell's own copy stays in the cell component's props.
|
|
3216
3152
|
|
|
3217
|
-
Not carried by a stored component:
|
|
3153
|
+
Not carried by a stored component: category, variants.
|
|
3218
3154
|
|
|
3219
3155
|
### Journal story (`core-journalStory`)
|
|
3220
3156
|
|
|
@@ -3235,7 +3171,7 @@ Tags: rich-text, references, media-heavy, seo-structured, localized, validation,
|
|
|
3235
3171
|
- Reading time is computed by the template; no field stores it today, so don't copy "7 min read" into readingTime.
|
|
3236
3172
|
- Bind the body wrapper as kind `document`, never `richtext`, or a save repaints the article from plain text.
|
|
3237
3173
|
|
|
3238
|
-
Not carried by a stored component:
|
|
3174
|
+
Not carried by a stored component: shopify reference.
|
|
3239
3175
|
|
|
3240
3176
|
### Hero (`core-hero`)
|
|
3241
3177
|
|
|
@@ -3256,4 +3192,4 @@ Tags: variants, media-heavy, localized, a11y. Proves: Buttons as one unit · inl
|
|
|
3256
3192
|
- object-position is the image's focal point (50% 35% → { x: 0.5, y: 0.35 }); store the number 4.8, never the star glyphs.
|
|
3257
3193
|
- A variant that renames a key (title vs heading) silently drops that content on a swap.
|
|
3258
3194
|
|
|
3259
|
-
Not carried by a stored component:
|
|
3195
|
+
Not carried by a stored component: variants.
|