Skip to content
This repository was archived by the owner on Apr 27, 2026. It is now read-only.

fix: inject CSS layer order as inline style in dev mode - #168

Merged
jp-knj merged 17 commits into
mainfrom
fix/css-layer-dev-mode
Jan 31, 2026
Merged

jp-knj merged 17 commits into
mainfrom
fix/css-layer-dev-mode

Conversation

@jp-knj

@jp-knj jp-knj commented Jan 30, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Replace virtual CSS module (virtual:markflow/layer-order.css) with direct <style is:inline> injection into <head> in the Vite transform hook
  • Virtual CSS modules load via HMR JS, which races with component styles — @layer order declarations arrive too late and don't take effect
  • Inline styles in <head> are processed synchronously by the browser, ensuring correct CSS layer ordering in dev mode
  • Add Head.astro overlay with transition:persist for view transitions compatibility

Test plan

  • pnpm --dir packages/astro-markflow run build passes
  • pnpm --dir packages/astro-markflow run typecheck passes
  • Dev server: verify spacing/layout is correct on page load and navigation
  • CI checks pass

jp-knj and others added 10 commits January 29, 2026 21:46
Use `registry ?? undefined` when passing to slotChildrenToHtml() since
the parameter accepts `Registry | undefined` but the local variable is
`Registry | null`.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…content

- Fix stripCodeFences regex to use `[ \t]*$` for closers (per CommonMark
  spec) and disallow backticks in info strings, preventing mismatched
  fence pairs with consecutive code blocks
- Add tab-to-space re-indentation for list JSX components (FileTree etc.)
- Add code fence tracking in normalize_list_jsx_components to skip
  fenced content
- Track fence marker length to prevent premature closes with nested fences
- Add FileTree to LIST_JSX_COMPONENTS

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Track fence opener indent and allow closers within opener_indent+3,
matching CommonMark spec while supporting list-item code fences.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace virtual CSS module approach with direct <style is:inline> injection
into <head> for dev mode. Virtual CSS modules are loaded via HMR JS which
races with other component styles, causing @layer order declarations to
arrive too late. Inline styles in <head> are processed synchronously by
the browser, ensuring correct layer ordering.

- transform hook: replace import prepend with <style is:inline> injection
- Remove virtual module resolveId/load for layer-order.css
- Add Head.astro overlay with transition:persist for view transitions
- Update setup script to copy src/ overlay files

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
# Conflicts:
#	crates/core/src/transform/jsx_normalize.rs
#	packages/astro-markflow/src/utils/mdx-detection.ts
@claude

claude Bot commented Jan 30, 2026

Copy link
Copy Markdown

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

jp-knj and others added 7 commits January 31, 2026 10:26
Tight lists (spread: false) now render without <p> wrappers around
list item content, matching CommonMark behavior and fixing FileTree
icon/filename layout where <p> (block element) forced line breaks.

- Add spread field to Scope::List to track tight vs loose lists
- Skip <p> wrapper in Node::Paragraph when inside a tight list
- Add is_in_tight_list() helper to Context

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The wrap_in_ul normalization path in render.rs dissolved FileTree into
raw <ul> HTML, bypassing the component wrapper. Starlight's FileTree
runtime and CSS never applied, causing icons and text to render on
separate lines. Remove the early-return path and let FileTree flow
through the normal component path, where codegen.rs already handles
wrap_in_ul normalization correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The orchestrator's normalizeFileTree transform operated on the final JSX
string, looking for <FileTree>...<ul>...</ul>...</FileTree>. With
FileTree now emitted as a component block, the slot content is wrapped
in <_Fragment set:html=...>, which normalizeFileTree couldn't recognize
as already containing <ul> structure. This caused double <ul><ul>
nesting. The block-level normalizeSlotByStrategy in blocks-to-jsx.ts
already handles wrap_in_ul normalization correctly at the block level.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@jp-knj
jp-knj merged commit ecd5aba into main Jan 31, 2026
17 of 18 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant