One folder per idea. Do not start a second implementation of the same idea in another folder unless the first one is retired.
Read docs/study-contract.md together with this file.
Use a short kebab-case slug that names the behavior, not the product it came from.
Good: intent-cascade, magnetic-snap, undo-stack-ime.
Bad: amazon-menu, grok-demo, new-study.
Same question, a new skin → add a kind to the existing study.
A new question you must answer first → open studies/<slug>/, set
asks, and hang links (after / contrast) on the graph.
The first question is not only “which widget machine is this.” It may be:
| Kind of question | What the user hits | Example |
|---|---|---|
| Machine / taxonomy | Looks the same, commits / occupies / opens differently | 下拉框、导航栏、侧边栏、页签、控件 |
| Construction | Naive assembly shows a seam | 内凹角:挖孔还是缝回去 |
| Motion-follow | The motion is tied to the wrong property or unit | 扫光跟字走还是跟块走 |
| Continuous → discrete | Pointer / scroll maps onto the wrong grain | 视线落到格子;斜向穿越该不该换项 |
A later idea is another studies/<slug>/. It does not need a new top-level
lab tab (效果 / 几何 / 游戏) or a workspace-level component library.
| Looks like | Still the same question | Different question |
|---|---|---|
| Another mega panel | Site IA columns in nav-taxonomy |
What the panel commits → dropdown-taxonomy |
| Another left rail | Occupancy / expand in sidebar-taxonomy |
Whether vertical is the primary nav at all → nav-taxonomy |
| Another slide-in | Off-canvas occupancy in sidebar-taxonomy |
Small-screen hamburger from the edge → nav-taxonomy |
| Another inverted corner | Cut vs stitch in inverted-notch |
A different hole (not a card chip) → new study |
| Another text shine | Glyph-follow in glyph-sweep |
A box-level sheen → new study |
| Another look-at-pointer face | Quantize in look-quantize |
A mascot / game product → leave it out |
| Another in-page tab row | Selection model in tab-taxonomy |
Site nav placement → nav-taxonomy |
| Another form field | Fill vs pick in control-taxonomy |
What a downward panel commits → dropdown-taxonomy |
| Another tidy form | What to disclose in fill-taxonomy |
When to speak → validation-taxonomy; fill vs pick → control-taxonomy |
| Another centered dialog | Interrupt / attach in overlay-taxonomy |
Small-screen hamburger → nav-taxonomy; off-canvas rail → sidebar-taxonomy |
| Another toast | Notice weight in notify-taxonomy |
A blocking dialog → overlay-taxonomy |
| Another error message | When to speak in validation-taxonomy |
Fill vs pick → control-taxonomy; what to disclose → fill-taxonomy |
| Another spinner | Measurable or not in progress-taxonomy |
A result toast → notify-taxonomy |
| Another chart | What the data is for in chart-taxonomy |
Dashboard drill → dashboard-layers |
| Another banner slider | How frames advance in carousel-taxonomy |
A notice marquee → notify-taxonomy |
| Another page grid | Page skeleton in layout-taxonomy |
Rail occupancy → sidebar-taxonomy |
| Another CTA | Action weight in button-taxonomy |
Fill vs pick → control-taxonomy |
| Another hero block | First-glance job in hero-taxonomy |
Login staging → login-taxonomy |
| Another login page | Staging in login-taxonomy |
Page skeleton → layout-taxonomy |
| Another alignment tweak | Baseline vs box in align-craft |
Page skeleton → layout-taxonomy |
| Another dashboard | Drill vs platter in dashboard-layers |
Chart intent → chart-taxonomy |
| Another AI chat shell | Where the assistant lives in assistant-chrome |
Page skeleton → layout-taxonomy |
| Another loading spinner | Layout placeholder in pending-taxonomy |
Measurable wait → progress-taxonomy |
| Another card glow | Border path in border-beam |
Glyph-follow → glyph-sweep |
| Another study timer | Count-up vs count-down in timer-taxonomy |
Measurable work → progress-taxonomy |
| Another flashcard | Recall grade after flip in recall-grade |
Advancing frames → carousel-taxonomy |
| Another cooler scrollbar | Cue vs track in scroll-chrome |
Work progress → progress-taxonomy; section spy → nav-taxonomy |
| Another time/number picker | Baseline snap & depth in wheel-picker |
Form field choice → control-taxonomy; timer session → timer-taxonomy |
| Another row gesture | Disambiguation & commit in swipe-action |
Safety confirm → confirm-taxonomy; batch select → press-select |
| Another context menu | Touch disambiguation & flip in touch-context |
Batch mode → press-select; click popover → overlay-taxonomy |
Do not merge these into one encyclopedia because the fixtures look alike.
The graph keeps the questions apart. Isolated nodes are allowed; only add
after / contrast when the condition is real.
The teaching surface follows the question. A taxonomy may switch kinds. A construction may be one object plus the wrong alternative. A single behavior may be one playground with toggles. Do not require a seven-kind switcher.
studies/<slug>/
AGENTS.md
README.md
idea.md
study.json
src/StudyView.tsx export function StudyView
src/StageView.tsx export function StageView (fixture, no chrome)
src/main.tsx standalone shell only
Do not commit stills. studies/<slug>/references/ is optional local
output and is gitignored. Capture from the stage with make stills.
The study itself is the idea, the machines, the playground, and the
stage.
idea.md is the human catalog unit. It should answer:
- What breaks for the user if this idea is missing?
- What is the actual rule (geometry, timing, state machine)?
- Why is a naive alternative worse?
study.json is the machine catalog unit. The lab glob-loads it.
Set created and updated (YYYY-MM-DD). Bump updated when the
idea or playground changes. Set asks (the question) and links
(next questions / mix-ups). Do not write “和另外 N 则” in idea.md.
- Each study owns its own
package.json(workspace package@lightui/<slug>). - Bind playgrounds to
127.0.0.1and give each Vite study a unique port. Lab is5173. Taken:5174intent-cascade,5175dropdown-taxonomy,5176sidebar-taxonomy,5177nav-taxonomy,5178inverted-notch,5179glyph-sweep,5180look-quantize,5181tab-taxonomy,5182control-taxonomy,5183overlay-taxonomy,5184notify-taxonomy,5185validation-taxonomy,5186progress-taxonomy,5187chart-taxonomy,5188carousel-taxonomy,5189layout-taxonomy,5190button-taxonomy,5191hero-taxonomy,5192login-taxonomy,5193align-craft,5194dashboard-layers,5195assistant-chrome,5196pending-taxonomy,5197border-beam,5198timer-taxonomy,5199recall-grade,5200scroll-chrome,5201bm25-explain,5202container-morph,5203drag-commit,5204guide-interrupt,5205chart-read,5206expand-inflow,5207page-append,5208fill-taxonomy,5209optimistic-rollback,5210press-select,5211pull-refresh,5212locator-taxonomy,5213confirm-taxonomy,5214path-morph,5215group-taxonomy,5216sheet-snap,5217wheel-picker,5218swipe-action,5219touch-context,5220slide-confirm. Next free:5221. - Use relative imports inside the study. The lab compiles
StudyViewandStageViewfrom outside the study root. - Import visual tokens from
design/tokens.css. Do not fork the palette. - Keep demo fixtures next to the playground. Do not import another study.
- If two studies later share a true primitive, extract it then.
make catalog
make test
make typecheck
make devConfirm the new card on /studies and the live view on /s/<slug>.
Public essays about a study belong in writing/notes/, not inside the
study folder. See docs/writing.md.