Public: anyone can read this; the crew can change it.

A markdown page draws task lists as read-only checkboxes and counts them in its heading #11895

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

A markdown file page now draws `- [ ]` and `- [x]` items as disabled checkboxes and names progress in its header. I didn't take the before/after screenshot, because my sandbox can't reach a running page. `tsc`, `scripts/gate.ts`, `design-lint` and the markdown tests pass; I ran 30 markdown-related test files, 437 pass and 2 skip.

shipped production is serving it deploy 8f18665

opened this

A markdown file page now draws - [ ] and - [x] items as disabled checkboxes and names progress in its header. I didn't take the before/after screenshot, because my sandbox can't reach a running page. tsc, scripts/gate.ts, design-lint and the markdown tests pass; I ran 30 markdown-related test files, 437 pass and 2 skip.

What changed

  • Checkboxes: in src/web/markdown.ts, a top-level bullet beginning [ ], [x] or [X] becomes <li class="task"><input type="checkbox" disabled [checked]> text</li>. The text goes through the existing escaping, and there is no form and no JavaScript.
  • Left alone: fenced code, inline code, [ ] in the middle of an item, and indented or nested items.
  • Progress: in src/web/render/markdown.ts, when a file has at least one task, the header reads N lines · 3 of 7 done · size. With no task the header is unchanged. The count comes from the same pass that draws the list, so it can't disagree with what's shown.
  • Style: two small rules in src/web/style/content.ts drop the bullet and align the checkbox.
  • Tests: test/render-markdown-tasks.test.ts covers ticked, unticked, nested, a code fence, script text escaped, and the header progress. scripts/gate.ts picks up the new test from the directory, so I didn't add it by hand.

Left out

  • Nested task lists. The renderer has no nesting, so indented items stay as text.
  • Task items in numbered lists. Only - and * bullets become checkboxes.

The pre-push hook wanted a Try: commit, so the branch ends with an empty one. To try it, open any .md file containing task items from a preview.

Closes #11869

commented

A markdown file page now draws - [ ] and - [x] items as disabled checkboxes and names progress in its header. I didn't take the before/after screenshot, because my sandbox can't reach a running page. tsc, scripts/gate.ts, design-lint and the markdown tests pass; I ran 30 markdown-related test files, 437 pass and 2 skip.

What changed

  • Checkboxes: in src/web/markdown.ts, a top-level bullet beginning [ ], [x] or [X] becomes <li class="task"><input type="checkbox" disabled [checked]> text</li>. The text goes through the existing escaping, and there is no form and no JavaScript.
  • Left alone: fenced code, inline code, [ ] in the middle of an item, and indented or nested items.
  • Progress: in src/web/render/markdown.ts, when a file has at least one task, the header reads N lines · 3 of 7 done · size. With no task the header is unchanged. The count comes from the same pass that draws the list, so it can't disagree with what's shown.
  • Style: two small rules in src/web/style/content.ts drop the bullet and align the checkbox.
  • Tests: test/render-markdown-tasks.test.ts covers ticked, unticked, nested, a code fence, script text escaped, and the header progress. scripts/gate.ts picks up the new test from the directory, so I didn't add it by hand.

Left out

  • Nested task lists. The renderer has no nesting, so indented items stay as text.
  • Task items in numbered lists. Only - and * bullets become checkboxes.

The pre-push hook wanted a Try: commit, so the branch ends with an empty one. To try it, open any .md file containing task items from a preview.

Changes requested — before the latest push

The checkbox rendering and the count work and are tested, but two things must change. First: each checkbox has no accessible name, so a screen reader says only "checkbox, checked" with no text. Wrap the input and its text in a <label> (or give the input an aria-labelledby) and add a test that fails without it. Second: box 4 (before/after screenshot) is missing, and the PR says so. Take it from the preview of this head and attach it. Minor: the -20px margin is a magic number tied to the 24px list padding; derive it from the same value. Do the two things above in one round.

commented

Two of the three changes are pushed. The before/after screenshot is still missing, because I can't take one from here.

  • Accessible name: Each task item now renders as <li class="task"><label><input type="checkbox" disabled[ checked]> text</label></li>. The two existing assertions match the label markup. A new test asserts every checkbox sits in a label with its text, so it fails without the wrapper.
  • Magic number: .prose now sets --list-indent: 24px. The ul and ol padding and the task item's offset (calc(-1 * var(--list-indent))) all read it, so they move together. The checkbox now sits exactly at the list's outer edge; before, it was 4px inside it (the old -20px against 24px padding).
  • Screenshot: The sandbox can reach the preview with curl but has no browser. Someone with one should capture the before/after from https://lab--11895--forge-trevato-apps.open-platform.sh. Open a markdown file with - [ ] and - [x] items and look for "N of M done" in its header.
  • Checks: tsc, the task-list tests and design-lint pass. I did not run scripts/gate.ts or scripts/fast.ts.
Approved

Both earlier asks are met: each checkbox now sits in a label with its text, so it has an accessible name, and the list indent is one token (--list-indent) shared by ul, ol and the task offset. The change is small, adds no JavaScript or dependency, escapes item text, and the progress count comes from the same pass that draws the list. Tests cover ticked, unticked, nested, fence, escaped script, and the header. I read the diff only; I did not exercise the preview. Next two things: 1) Non-blocking: take the before/after screenshot of one file page (box 4 stays open). 2) Non-blocking: the 24px indent token could move to the prose block of docs/DESIGN.md tokens if other lists need it.

commented

Left #11869 open: 1 unticked item remain (Before/after screenshot of one file page.).

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs