AGENTS.md@src/widgets/source · git:20261026.274ed78 · 2026-10-26 · sha256 8c226ecaa938888f

AGENTS.md@src/widgets/source git:20261026.274ed78A

Immutable. This exact content never changes and is served at /api/v1/blob/8c226ecaa938888f.

# widgets/source — the docs previews' source files and Run

## Purpose

Kobra's source panel for every docs preview: what the preview is made of,
as files a reader reads, edits, copies, downloads and runs in the page —
a real tool, never a mock.

## Ownership

- `SourcePanel.vue` — the panel: file tabs, the toolbar (Revert, Copy,
  Download all as a zip, Run), the editor, Run's problems, a status line.
- `Editor.vue` — a textarea with a line gutter (native undo, IME, screen
  readers); Tab / Shift+Tab indent the selected lines, Escape hands the
  next Tab back to the page (never a keyboard trap), Enter keeps the
  indent, ⌘/Ctrl+Enter runs; the gutter follows the textarea's scroll.
- `RunView.vue` — a run's component inside an error boundary: what it
  throws shows in the preview, not as a broken page.
- `model/files.ts` — pure: the kit index as export → file, a snippet's kind,
  a fragment completed into an SFC (`asSfc`), the kit files an example
  imports per framework, file names, `prompt.md`.
- `model/compile.ts` — pure: Vue's compiler-sfc (browser build) for SFCs;
  TypeScript removed by cutting its type syntax (enums, namespaces and
  parameter properties are refused with their place — they need a
  transpiler); imports/exports linked into a function body evaluated with
  the page's modules; scoped styles, CSS Modules (`$style` names renamed),
  tokens scoped to one preview (`scopeTokens`).
- `model/run.ts` — the linker: the page's Vue (an explicit API list, not a
  namespace — a namespace import keeps all of Vue in every page's chunk),
  the kit's packages (`PACKAGES`), `@stylexjs/stylex`, and the kit.
- `model/stylex.ts` — StyleX at run time, standing in for its bundler
  plugin: `create`, `attrs` (Vue), `props`, `defineVars`, `keyframes`,
  `firstThatWorks`. Every property and condition becomes one atomic class
  (`x` + a hash of its rule) written once into `style[data-run-stylex]` in
  the head (`plain`, then `conditional`: pseudo-classes and pseudo-elements
  join the selector, at-rules wrap it); the last style to set a property
  wins; numbers are px except the unitless properties.

## Local Contracts

- Mounted by `pages/docs/DemoCard.vue` (lazy, on the Code tab's first open,
  then kept so edits survive the Preview tab) with the authored snippet,
  `docsCode` as `translate`, the framework, the styling system and the
  card's `SourceContext` (section, place, title, line, URL, install steps).
- Files: the example (`<Section>Example.vue|.svelte`, a fragment completed
  with its imports and template, in the reader's framework and styling
  system; non-component snippets keep their language: `.sh`, `.ts`,
  `.css`), the kit's own source for each kit export it imports, the kit's
  tokens (`engine/theme.css`) and `prompt.md`. Kit files are the repo's,
  served by the build at `kit/src/<vue|svelte>/` with a recursive
  `files.json` listing (`kitSources` in `rstack.config.ts`) — never a copy
  kept by hand. `KIT_INDEX` names each kit's public entry (the Vue kit's
  `tailwind/index.ts`); `kitIndex` maps its exports to files relative to
  it and `resolveKitFile` resolves a kit import against its importer's
  folder, across layers. Zip paths mirror the install: the example and
  prompt at the root, kit files under `dither-kit/` (`dither-kit-svelte/`)
  in their layer folders.
- Edits are kept per file (the example's per framework and styling
  system); a tab marks an edited file; Revert restores the original.
- Run (Vue, in any styling system: Tailwind, CSS, CSS Modules, and StyleX
  through `model/stylex.ts`; Svelte says why not):
  an example that edits only itself links to the page's kit (the very
  modules the docs run on). Once a kit file is edited, the example links to
  a kit evaluated from its source — the edits and every kit file the run
  reaches — so a compound component and its contexts (chart, series,
  field, drawer) share one set of modules. Problems come back located
  (`file line:col`, a click opens the file at the place); the last good run
  stays up. The result replaces the demo in the preview (shown above the
  source while it runs) until "Restore the demo"; its CSS lives in one
  `<style>` per card; edited tokens apply to that preview only.
- New kit imports from `vue` or a package must be linkable: the spec holds
  `VUE`/`PACKAGES` to every name the kit and its compiled templates import.
- Sounds (`shared/lib/sound.ts`): tab and toolbar taps, copy.

## Verification

- `tests/source.spec.ts` (run against compiler-sfc's browser build, the one
  Run ships: `define.test` aliases it, since the node target would take the
  CJS build and its uninstalled template engines): the kit index, snippet kinds, `asSfc`, kit files
  per framework, names and the prompt; TypeScript stripping and refusals,
  linking (re-exports, live bindings, missing exports), SFC styles and
  located errors, scoped tokens; every kit file compiles and links, and
  every name it imports is provided; the zip read back entry by entry
  (CRC-32 included); the sound cues and the mute; the StyleX runtime
  (atomic classes, last style wins, conditions after plain rules,
  variables, keyframes, fallbacks); a DemoCard opened to its files, an
  example edited and run, a kit file edited and run, a broken edit located,
  the demo restored, and the example run as StyleX (its elements carry the
  runtime's classes, their rules in the head).
- Browser walk (`rs dev`): `/docs/switch` and `/docs/button` — tabs by
  keyboard, edit and Run, a kit file edited (`DitherSwitch.vue`), tokens
  edited (`theme.css`), CSS, CSS Modules and StyleX runs, the Svelte
  refusal, the zip (`unzip -t`), copy; `/docs/area` — the `…` sketch
  located, data filled in, `Area.vue` edited and the chart drawn; a 390px
  phone and light theme.

## Child DOX Index

- none