Plan
ID:SPEC-009Status:accepted

Rune Editor Compatibility Spec

This spec covers all remaining runes that need updates for editor compatibility. Three runes have already been updated: recipe, hero, and feature. This document covers everything else.

Background

The block editor needs three things from each rune to support visual editing:

  1. data-name on structural elements — set via refs in createComponentRenderable (not data-field, which is for modifier properties consumed by the engine)
  2. editHints in engine config — maps each data-name value to an edit mode (inline, link, code, image, icon, none)
  3. No incorrect attribute usage — no manual data-field where data-name should be used; no manual data-rune on children (root gets it automatically via createComponentRenderable)

Reference: Edit Modes

ModeBehaviorTypical Use
inlineContenteditable with formatting toolbarHeadlines, blurbs, body text, list items
linkURL + display text fieldsAction buttons, CTA links
codeCode editor popoverTerminal commands, code snippets
imageFile picker + alt textMedia, cover images, avatars
iconIcon picker galleryFeature icons, decorative icons
noneNot directly editableGenerated content, decorative elements

Reference: Updated Rune Patterns

See the already-updated runes for canonical examples:

  • Recipe (runes/learning/src/tags/recipe.ts + runes/learning/src/config.ts) — editHints for inline content, images, structure badges
  • Hero (runes/marketing/src/tags/hero.ts + runes/marketing/src/config.ts) — editHints for actions (link), commands (code), media (image)
  • Feature (runes/marketing/src/tags/feature.ts + runes/marketing/src/config.ts) — editHints for definition items (icon, title, description)

Package: @refrakt-md/marketing

CTA (runes/marketing/src/tags/cta.ts)

Current state: Has editHints and autoLabel in config already. Well-structured.

Changes needed:

  • None — already has editHints: { headline: 'inline', eyebrow: 'inline', blurb: 'inline', action: 'link', command: 'code' } and autoLabel with pageSectionAutoLabel

Status: DONE


Bento (runes/marketing/src/tags/bento.ts)

Current state: Has editHints and autoLabel for section-level fields. But manually creates meta tags with data-field for gap, columns, sizing (lines 191-193).

Changes needed:

  • Replace manual data-field on meta tags (lines 191-193) with proper properties in createComponentRenderable so they flow through the standard modifier pipeline
  • Verify editHints coverage is complete

Config editHints (already present): { headline: 'inline', eyebrow: 'inline', blurb: 'inline' }

Status: DONE


BentoCell (nested in runes/marketing/src/tags/bento.ts)

Current state: No editHints, no autoLabel (only autoLabel: { name: 'title' } in config). Properties include name, size, span, icon. Refs include body, icon.

Changes needed:

  • Add editHints: { title: 'inline', icon: 'icon' }
  • Verify body ref has appropriate data-name

Status: DONE


Steps (runes/marketing/src/tags/steps.ts)

Current state: Has editHints and autoLabel for section-level fields.

Changes needed:

  • None at section level — already has pageSectionAutoLabel and editHints for headline, eyebrow, blurb

Status: DONE


Step (nested in runes/marketing/src/tags/steps.ts)

Current state: No editHints. Manually sets data-name='content' and data-name='media' on wrapper divs. Uses SplitLayoutModel.

Changes needed:

  • Move manual data-name assignments to refs in createComponentRenderable
  • Add editHints: { content: 'none', media: 'image' }

Status: DONE


Pricing (runes/marketing/src/tags/pricing.ts)

Current state: Has editHints and autoLabel for section-level fields. Manually sets data-layout and data-columns on ul element.

Changes needed:

  • Review whether data-layout and data-columns on the tiersList ul should be standard modifiers/properties
  • Verify section-level editHints coverage

Status: DONE


Tier / FeaturedTier (nested in runes/marketing/src/tags/pricing.ts)

Current state: No editHints. Properties include name (h1), description, price (p), currency (meta), url (anchor). Refs include body.

Changes needed:

  • Move visible elements (name, price) from properties to refs so they get data-name instead of data-field
  • Add editHints: { name: 'inline', price: 'inline' }

Status: DONE


Testimonial (runes/marketing/src/tags/testimonial.ts)

Current state: No editHints, no autoLabel. Critical issues:

  • Manually sets data-field='author-name' and data-field='author-role' on created spans (lines 44, 55) — should use refs / data-name
  • No refs defined at all — everything is in properties

Changes needed:

  • Move quote, authorName, authorRole, avatar from properties to refs
  • Remove manual data-field assignments (lines 44, 55) — let createComponentRenderable handle via refs
  • Keep rating as property (modifier/meta value)
  • Add editHints: { 'author-name': 'inline', 'author-role': 'inline', avatar: 'image', quote: 'inline' }
  • Add autoLabel for blockquote → quote mapping

Status: DONE


Comparison (runes/marketing/src/tags/comparison.ts)

Current state: No editHints. Has pageSectionProperties for header. Complex postTransform.

Changes needed:

  • Add editHints for section-level fields: { headline: 'inline', eyebrow: 'inline', blurb: 'inline' }
  • Add autoLabel with pageSectionAutoLabel

Status: DONE


ComparisonColumn (nested in runes/marketing/src/tags/comparison.ts)

Current state: No editHints. Properties include name (span), highlighted (meta), row items. Refs include body.

Changes needed:

  • Move name from properties to refs so it gets data-name
  • Add editHints: { name: 'inline' }

Status: DONE


ComparisonRow (nested in runes/marketing/src/tags/comparison.ts)

Current state: No editHints. Properties include label (span), rowType (meta). Refs include body.

Changes needed:

  • Move label from properties to refs
  • Add editHints: { label: 'inline', body: 'inline' }

Status: DONE


Package: @refrakt-md/docs

Api (runes/docs/src/tags/api.ts)

Current state: Has editHints. Properties include method, path, auth (meta tags). Refs include body. Config has structure with method (span), path (code), auth (span) structure entries.

Changes needed:

  • Add editHints: { body: 'none', method: 'none', path: 'none', auth: 'none' } — structure elements are attribute-driven, not directly editable

Status: DONE


Symbol (runes/docs/src/tags/symbol.ts)

Current state: Has editHints and autoLabel. Properties include kind, lang, since, deprecated, source. Refs include body, headline (via pageSectionProperties). Config has rich structure with kind-badge, lang-badge, since-badge, deprecated-badge, source-link.

Changes needed:

  • Add editHints: { headline: 'inline', body: 'none', 'kind-badge': 'none', 'lang-badge': 'none', 'since-badge': 'none', 'deprecated-badge': 'none', 'source-link': 'link' }
  • Add autoLabel with pageSectionAutoLabel

Status: DONE


SymbolGroup (nested in runes/docs/src/tags/symbol.ts)

Current state: Has editHints. label in refs. Refs include label, body.

Changes needed:

  • Move label from properties to refs
  • Add editHints: { label: 'inline', body: 'none' }

Status: DONE


SymbolMember (nested in runes/docs/src/tags/symbol.ts)

Current state: Has editHints. name in refs. Refs include name, body.

Changes needed:

  • Move name from properties to refs
  • Add editHints: { name: 'inline', body: 'none' }

Status: DONE


Changelog (runes/docs/src/tags/changelog.ts)

Current state: Has editHints and autoLabel. Properties include project, release items. Refs include releases.

Changes needed:

  • Add editHints: { headline: 'inline', releases: 'none' }
  • Add autoLabel with pageSectionAutoLabel

Status: DONE


ChangelogRelease (nested in runes/docs/src/tags/changelog.ts)

Current state: Has editHints. version moved to refs. Properties include date. Refs include version, body.

Changes needed:

  • Move version from properties to refs
  • Add editHints: { version: 'inline', body: 'none' }

Status: DONE


Package: @refrakt-md/design

Swatch (runes/design/src/tags/swatch.ts)

Current state: No editHints. Inline rune (attributes only). Refs include chip, value. Properties include color, label, showValue.

Changes needed:

  • Add editHints: { chip: 'none', value: 'none' } — attribute-driven, not content-editable
  • This is an inline rune with minimal editor surface

Status: DONE


Palette (runes/design/src/tags/palette.ts)

Current state: No editHints. Uses data-name extensively on generated elements for groups, swatches, scales. Properties include title, showContrast, showA11y, columns.

Changes needed:

  • Add editHints for generated data-name elements: { 'group-title': 'none', 'swatch-color': 'none', 'swatch-name': 'none', 'swatch-value': 'none', grid: 'none', scale: 'none' }
  • Most content is generated from list parsing — editor should mark these as 'none'

Status: DONE


Typography (runes/design/src/tags/typography.ts)

Current state: No editHints. Uses data-name extensively on generated specimens, sizes, weights. Properties include title, showSizes, showWeights, showCharset.

Changes needed:

  • Add editHints: { title: 'none', specimen: 'none', specimens: 'none', sizes: 'none', weights: 'none', charset: 'none' }
  • All content is generated from definition list parsing — entirely non-editable inline

Status: DONE


Spacing (runes/design/src/tags/spacing.ts)

Current state: No editHints. Uses data-name extensively on generated scale items, radii, shadows. Properties include title.

Changes needed:

  • Add editHints: { title: 'none', section: 'none', scale: 'none', radii: 'none', shadows: 'none' }
  • All content is generated from list parsing — entirely non-editable inline

Status: DONE


Preview (runes/design/src/tags/preview.ts)

Current state: No editHints. Legacy issue: postTransform in config reads data-field attributes (data-field="source", data-field="themed-source") on lines 52, 59, 68 of runes/design/src/config.ts.

Changes needed:

  • Migrate data-field usage in postTransform to data-name pattern
  • Add editHints: { source: 'code' } — the preview source should be code-editable
  • Update test expectations that check for data-field on pre elements
  • Move source and htmlSource from properties to refs in schema

Status: DONE


Mockup (runes/design/src/tags/mockup.ts)

Current state: No editHints. Refs include viewport. Properties include device, color, statusBar, label, url, scale, fit. PostTransform generates device chrome.

Changes needed:

  • Add editHints: { viewport: 'none' } — content is the child markup
  • Device chrome is postTransform-generated, not directly editable

Status: DONE


DesignContext (runes/design/src/tags/design-context.ts)

Current state: No editHints. Uses data-name="title" and data-name="sections" manually. Properties include title, tokens, scope.

Changes needed:

  • Add editHints: { title: 'none', sections: 'none' } — container for child design runes
  • Move manual data-name assignments to refs in createComponentRenderable

Status: DONE


Package: @refrakt-md/storytelling

Character (runes/storytelling/src/tags/character.ts)

Current state: No editHints. Properties include name, role, status, aliases, tags. Refs include portrait (optional), sections/body.

Changes needed:

  • Move name from properties to refs (visible span should use data-name)
  • Add editHints: { name: 'inline', portrait: 'image', body: 'none', sections: 'none' }
  • Add autoLabel for section headers

Status: DONE


CharacterSection (nested)

Current state: No editHints. AutoLabel { span: 'header' }. Properties include name. Refs include body.

Changes needed:

  • Move name from properties to refs
  • Add editHints: { header: 'inline', name: 'inline', body: 'none' }

Status: DONE


Realm (runes/storytelling/src/tags/realm.ts)

Current state: No editHints. Properties include name, realmType, scale, tags, parent. Refs include scene (optional), sections/body.

Changes needed:

  • Move name from properties to refs
  • Add editHints: { name: 'inline', scene: 'image', body: 'none', sections: 'none' }

Status: DONE


RealmSection (nested)

Current state: No editHints. AutoLabel { span: 'header' }. Properties include name. Refs include body.

Changes needed:

  • Move name from properties to refs
  • Add editHints: { header: 'inline', name: 'inline', body: 'none' }

Status: DONE


Faction (runes/storytelling/src/tags/faction.ts)

Current state: No editHints. Properties include name, factionType, alignment, size, tags. Refs include sections/body.

Changes needed:

  • Move name from properties to refs
  • Add editHints: { name: 'inline', body: 'none', sections: 'none' }

Status: DONE


FactionSection (nested)

Current state: No editHints. AutoLabel { span: 'header' }. Properties include name. Refs include body.

Changes needed:

  • Move name from properties to refs
  • Add editHints: { header: 'inline', name: 'inline', body: 'none' }

Status: DONE


Lore (runes/storytelling/src/tags/lore.ts)

Current state: No editHints. Properties include title, category, spoiler, tags. Refs include body.

Changes needed:

  • Move title from properties to refs (visible span should use data-name)
  • Add editHints: { title: 'inline', body: 'none' }

Status: DONE


Plot (runes/storytelling/src/tags/plot.ts)

Current state: No editHints. Properties include title, plotType, structure, tags, beat items. Refs include beats.

Changes needed:

  • Move title from properties to refs
  • Add editHints: { title: 'inline', beats: 'none' }

Status: DONE


Beat (nested in runes/storytelling/src/tags/plot.ts)

Current state: No editHints. Properties include label, status, id, track, follows. Refs include body.

Changes needed:

  • Move label from properties to refs
  • Add editHints: { label: 'inline', body: 'none' }

Status: DONE


Bond (runes/storytelling/src/tags/bond.ts)

Current state: No editHints. Uses data-name="connector" and data-name="arrow" manually. Properties include from, to, bondType, status, bidirectional. Refs include connector, body.

Changes needed:

  • Move from, to from properties to refs (visible spans)
  • Add editHints: { from: 'inline', to: 'inline', connector: 'none', arrow: 'none', body: 'none' }

Status: DONE


Storyboard (runes/storytelling/src/tags/storyboard.ts)

Current state: No editHints. Properties include panel items, variant, columns. Refs include panels.

Changes needed:

  • Add editHints: { panels: 'none' }

Status: DONE


StoryboardPanel (nested)

Current state: No editHints. Properties include image, caption. Refs include body.

Changes needed:

  • Move image from properties to refs
  • Move caption from properties to refs
  • Add editHints: { image: 'image', caption: 'inline', body: 'none' }

Status: DONE


Package: @refrakt-md/learning

HowTo (runes/learning/src/tags/howto.ts)

Current state: No editHints. Properties include estimatedTime, difficulty. Refs include header elements (via pageSectionProperties), tools, steps. Config has structure with meta-item entries.

Changes needed:

  • Add autoLabel with pageSectionAutoLabel
  • Add editHints: { headline: 'inline', eyebrow: 'inline', blurb: 'inline', tool: 'inline', step: 'inline' }
  • Set data-name on tool and step list items in schema (following recipe pattern)

Status: DONE


Package: @refrakt-md/business

Cast (runes/business/src/tags/cast.ts)

Current state: No editHints. Uses pageSectionProperties for header. Properties include member items, layout. Refs include header, members.

Changes needed:

  • Add autoLabel with pageSectionAutoLabel
  • Add editHints: { headline: 'inline', eyebrow: 'inline', blurb: 'inline', members: 'none' }

Status: DONE


CastMember (nested)

Current state: No editHints. Properties include name (span), role (span). Refs include body.

Changes needed:

  • Move name, role from properties to refs
  • Add editHints: { name: 'inline', role: 'inline', body: 'none' }

Status: DONE


Organization (runes/business/src/tags/organization.ts)

Current state: No editHints. Uses pageSectionProperties. Properties include type. Refs include headline, blurb, body.

Changes needed:

  • Add autoLabel with pageSectionAutoLabel
  • Add editHints: { headline: 'inline', blurb: 'inline', body: 'none' }

Status: DONE


Timeline (runes/business/src/tags/timeline.ts)

Current state: No editHints. Uses pageSectionProperties. Properties include direction, entry items. Refs include headline, blurb, entries.

Changes needed:

  • Add autoLabel with pageSectionAutoLabel
  • Add editHints: { headline: 'inline', blurb: 'inline', entries: 'none' }

Status: DONE


TimelineEntry (nested)

Current state: No editHints. Properties include date (time tag), label (span). Refs include body.

Changes needed:

  • Move date, label from properties to refs (visible elements)
  • Add editHints: { date: 'inline', label: 'inline', body: 'none' }

Status: DONE


Package: @refrakt-md/places

Event (runes/places/src/tags/event.ts)

Current state: No editHints. Uses pageSectionProperties. Properties include date, endDate, location, url. Config has rich structure with detail, label, value, end-date, register refs.

Changes needed:

  • Add autoLabel with pageSectionAutoLabel
  • Add editHints: { headline: 'inline', blurb: 'inline', body: 'none', detail: 'none', label: 'none', value: 'none', 'end-date': 'none', register: 'link' }

Status: DONE


Itinerary (runes/places/src/tags/itinerary.ts)

Current state: No editHints. Uses pageSectionProperties. Properties include variant, direction, day items. Refs include headline, blurb, days.

Changes needed:

  • Add autoLabel with pageSectionAutoLabel
  • Add editHints: { headline: 'inline', blurb: 'inline', days: 'none' }

Status: DONE


ItineraryDay (nested)

Current state: No editHints. AutoLabel { label: 'header' }. Properties include label, date, stop items. Refs include stops.

Changes needed:

  • Add editHints: { header: 'inline', stops: 'none' }

Status: DONE


ItineraryStop (nested)

Current state: No editHints. AutoLabel { time: 'time', location: 'location' }. Properties include time, location, duration, activity, lat, lng. Refs include body.

Changes needed:

  • Add editHints: { time: 'none', location: 'none', body: 'none' }

Status: DONE


Map (runes/places/src/tags/map.ts)

Current state: No editHints. Legacy issue: Config postTransform reads data-field attribute on children (line 84 of runes/places/src/config.ts). Properties include zoom, center, variant, height, provider, interactive, route, cluster, pin items. Refs include pins.

Changes needed:

  • Replace data-field reads in config postTransform with findMeta helper pattern
  • Add editHints: { pins: 'none' } — map is web component–rendered
  • Update tests that check for data-field on meta children

Status: DONE


MapPin (nested)

Current state: No editHints. Purely attribute-driven via parseLocationItem(). Properties include name, description, lat, lng, address, url, group. No refs.

Changes needed:

  • Move name, description from properties to refs (visible spans)
  • Add editHints: { name: 'inline', description: 'inline' }
  • Update tests that check for data-field on name/description spans

Status: DONE


Package: @refrakt-md/media

Audio (runes/media/src/tags/audio.ts)

Current state: No editHints. Uses data-name='description' manually on div. Properties include waveform. Custom web component rendering.

Changes needed:

  • Move manual data-name to refs in createComponentRenderable
  • Add editHints: { description: 'inline' }

Status: DONE


Playlist (runes/media/src/tags/playlist.ts)

Current state: No editHints. Legacy issues:

  • Uses data-field: 'id' on meta tag (line 190) — should use property attribute
  • Sets data-rune: 'track' on child track elements (line 131) — children should not have manual data-rune

Uses data-name for header, title, tracks, player.

Changes needed:

  • Replace data-field: 'id' with data-name: 'id' on meta
  • Remove manual data-rune: 'track' on children — let identity transform handle typeof dispatch
  • Add editHints: { title: 'inline', header: 'none', tracks: 'none', player: 'none' }

Status: DONE


Track (runes/media/src/tags/track.ts)

Current state: No editHints. Uses data-name for track-name, track-artist, track-duration, track-meta, track-description. Properties include name, artist, duration, url, position, datePublished, type.

Changes needed:

  • Add editHints: { 'track-name': 'inline', 'track-artist': 'inline', 'track-description': 'inline', 'track-duration': 'none', 'track-meta': 'none' }

Status: DONE


Package: @refrakt-md/runes (Core)

Hint (packages/runes/src/tags/hint.ts)

Current state: No editHints. Config has structure with icon (ref) and title (ref, metaText) in header. Modifier: hintType.

Changes needed:

  • Add editHints: { icon: 'none', title: 'none' } — structure-injected, attribute-driven

Status: DONE


Details (packages/runes/src/tags/details.ts)

Current state: No editHints. AutoLabel { summary: 'summary' }. Refs include body.

Changes needed:

  • Add editHints: { summary: 'inline', body: 'none' }

Status: DONE


Accordion (packages/runes/src/tags/accordion.ts)

Current state: No editHints. AutoLabel includes pageSectionAutoLabel. Sections contentModel converts headings to accordion-item tags.

Changes needed:

  • Add editHints: { headline: 'inline', eyebrow: 'inline', blurb: 'inline' }

Status: DONE


AccordionItem (nested)

Current state: No editHints. AutoLabel { name: 'header' }. Refs include body.

Changes needed:

  • Add editHints: { header: 'inline', body: 'none' }

Status: DONE


TabGroup (packages/runes/src/tags/tabs.ts)

Current state: AutoLabel includes pageSectionAutoLabel. No explicit editHints.

Changes needed:

  • Add editHints: { headline: 'inline', eyebrow: 'inline', blurb: 'inline' }

Status: DONE


Tab (nested)

Current state: No editHints. name already in refs (tabs.ts). image in properties.

Changes needed:

  • Add editHints: { name: 'inline' }

Status: DONE


CodeGroup (packages/runes/src/tags/codegroup.ts)

Current state: Has editHints: { panel: 'code' }. Structure includes topbar with title ref.

Changes needed:

  • Add title: 'none' to editHints (structure-injected from attribute)

Status: DONE


Grid (packages/runes/src/tags/grid.ts)

Current state: No editHints, no autoLabel. Modifiers: mode, collapse, aspect, gap, columns, padding, maxWidth, valign. Refs include cell.

Changes needed:

  • Add editHints: { cell: 'none' } — cells contain other runes

Status: DONE


Figure (packages/runes/src/tags/figure.ts)

Current state: No editHints. Properties include caption, size, align. No refs.

Changes needed:

  • Move caption from properties to refs
  • Add editHints: { caption: 'inline' }

Status: DONE


Current state: No editHints. Modifiers: layout, lightbox, gap, columns. Refs include items.

Changes needed:

  • Add editHints: { items: 'none' } — items are figure elements

Status: DONE


Showcase (packages/runes/src/tags/showcase.ts)

Current state: No editHints. Properties include shadow, bleed, aspect, offset, place. Refs include viewport.

Changes needed:

  • Add editHints: { viewport: 'none' } — viewport wraps child content

Status: DONE


Embed (packages/runes/src/tags/embed.ts)

Current state: No editHints. PostTransform handles URL detection and iframe generation. Refs include fallback.

Changes needed:

  • Add editHints: { fallback: 'none' } — postTransform-generated

Status: DONE


PullQuote (in config)

Current state: No editHints. Modifiers: align, variant. Properties set in schema.

Changes needed:

  • Add editHints: { body: 'inline' }

Status: DONE


TextBlock (in config)

Current state: No editHints. Modifiers: dropcap, columns, lead, align. Refs include body.

Changes needed:

  • Add editHints: { body: 'none' } — content is the child text

Status: DONE


MediaText (in config)

Current state: No editHints. Modifiers: align, ratio, wrap. Refs include media, body.

Changes needed:

  • Add editHints: { media: 'image', body: 'none' }

Status: DONE


Sidenote (in config)

Current state: No editHints. Modifier: variant. Refs include body.

Changes needed:

  • Add editHints: { body: 'inline' }

Status: DONE


Compare (in config)

Current state: No editHints. Modifier: layout. Refs include panels.

Changes needed:

  • Add editHints: { panels: 'none' } — panels contain child runes

Status: DONE


Conversation (in config)

Current state: No editHints. Custom contentModel converts blockquotes to messages. Refs include messages.

Changes needed:

  • Add editHints: { messages: 'none' }

Status: DONE


ConversationMessage (nested)

Current state: No editHints. Modifier: align. Refs include body.

Changes needed:

  • Add editHints: { body: 'inline' }

Status: DONE


Annotate (in config)

Current state: No editHints. Modifier: variant. Refs include body, notes.

Changes needed:

  • Add editHints: { body: 'none', notes: 'none' }

Status: DONE


AnnotateNote (nested)

Current state: No editHints. Refs include body.

Changes needed:

  • Add editHints: { body: 'inline' }

Status: DONE


DataTable (packages/runes/src/tags/datatable.ts)

Current state: No editHints. Modifiers: searchable, sortable, pageSize, defaultSort. Refs include table.

Changes needed:

  • Add editHints: { table: 'none' } — table is standard markdown table

Status: DONE


Form (packages/runes/src/tags/form.ts)

Current state: No editHints. Complex custom contentModel with type inference. Modifiers: variant, action, method, success, error, honeypot. Refs include body. PostTransform generates footer.

Changes needed:

  • Add editHints: { body: 'none' } — form fields are complex custom contentModel

Status: DONE


Reveal (in config)

Current state: No editHints. AutoLabel includes pageSectionAutoLabel. Sections contentModel. Refs include steps.

Changes needed:

  • Add editHints: { headline: 'inline', eyebrow: 'inline', blurb: 'inline', steps: 'none' }

Status: DONE


RevealStep (nested)

Current state: No editHints. Refs include body.

Changes needed:

  • Add editHints: { body: 'none' }

Status: DONE


Diff (in config)

Current state: No editHints. Entirely postTransform-generated with data-name elements (line, gutter-num, gutter-prefix, line-content).

Changes needed:

  • Add editHints: { line: 'none', 'gutter-num': 'none', 'gutter-prefix': 'none', 'line-content': 'none' } — all generated

Status: DONE


Chart (in config)

Current state: No editHints. Entirely postTransform-generated SVG.

Changes needed:

  • Add editHints: { data: 'none' } — chart is generated from table data

Status: DONE


Diagram (in config)

Current state: No editHints. PostTransform-generated.

Changes needed:

  • Add editHints: { source: 'code' } — diagram source should be code-editable

Status: DONE


Sandbox (in config)

Current state: No editHints. PostTransform-generated source panels.

Changes needed:

  • Add editHints: { source: 'code' }

Status: DONE


Budget (in config)

Current state: No editHints. Structure includes header with title, meta, meta-item refs. PostTransform generates footer.

Changes needed:

  • Add editHints: { title: 'none', meta: 'none', 'meta-item': 'none' } — all structure/attribute-driven

Status: DONE


BudgetCategory / BudgetLineItem (nested)

Current state: No editHints. Processed entirely in postTransform.

Changes needed:

  • Add editHints to BudgetCategory: { label: 'none', subtotal: 'none' }
  • BudgetLineItem left unchanged (entirely postTransform-built)

Status: DONE


Current state: No editHints. Complex custom processing with headingsToList. NavItem uses data-field: 'slug' in schema.

Changes needed:

  • Nav/NavGroup/NavItem left unchanged — data-field: 'slug' is consumed by postTransform and removed from DOM (not a visible structural element); no editor benefit from changing

Status: DONE ✓ (no changes needed)


Current state: No editHints. Auto mode uses sentinel. Primarily generated content.

Changes needed:

  • Add editHints to Breadcrumb: { items: 'none' }
  • BreadcrumbItem left unchanged (auto-generated)

Status: DONE


Cross-Cutting Issues

1. data-field in createComponentRenderable

The createComponentRenderable function itself (at packages/runes/src/lib/component.ts:34) sets data-field on properties. This is the standard behavior — properties are modifier/meta values consumed by the engine. The issue is when runes put visible, structural elements in properties instead of refs. The fix for each rune is to move visible elements to refs.

2. data-field in packages/runes/src/config.ts

The core config uses data-field reads in several postTransform helpers (lines 66, 147, 355, 772, 804, 873, 905). These are internal engine patterns for reading property metadata and may need separate assessment for whether they should migrate to a different attribute.

3. Test Updates

Many tests across all packages assert on data-field values. When runes are updated to use refs/data-name, corresponding tests must be updated. This is a significant portion of the work.

4. Priority Order

Recommended implementation order:

  1. Marketing (Testimonial, Bento, Tier, Comparison*)DONE
  2. Core (Hint, Details, Accordion, Tabs, Figure, Grid, etc.)DONE
  3. Docs (Api, Symbol, Changelog)DONE
  4. Learning (HowTo) — follows recipe pattern closelyDONE
  5. Business (Cast, Organization, Timeline) — straightforwardDONE
  6. Places (Event, Itinerary, Map) — Map has legacy data-field issueDONE
  7. Storytelling (Character, Realm, Faction, Lore, Plot, Bond, Storyboard) — many runes, consistent patternDONE
  8. Design (Palette, Typography, Spacing, Preview, Mockup) — mostly generated content
  9. Media (Playlist, Track, Audio) — legacy issues in PlaylistDONE