Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
9103997
feat(release): LinkButton (inherit/accent color, sizes — fixes the "f…
croco-dendy Aug 4, 2026
0cc7e18
feat(repo): Tier 3 — gap-fillers paper-ui never had
croco-dendy Aug 7, 2026
1ab527e
feat(release): EmptyState (loading / empty / error, centered per UX_P…
croco-dendy Aug 7, 2026
ca7035f
feat(release): StatusDot + Chip (toggle/filter, aria-pressed) + Segme…
croco-dendy Aug 7, 2026
f4b4f8c
feat(release): Drawer (backdrop, focus trap, Escape, slide) — replace…
croco-dendy Aug 7, 2026
f0a40f8
feat(release): Kbd + InlineCode + CodeBlock (filename, copy, per-line…
croco-dendy Aug 7, 2026
400173e
feat(release): CopyButton + Breadcrumb + Menu + FileButton
croco-dendy Aug 7, 2026
9f3689f
feat(release): Icon set (~20: close, check, copy, plus, folder, light…
croco-dendy Aug 7, 2026
1762de1
feat(release): (Table/Tabs/Radio moved to [[IDEA-7]] with the radio r…
croco-dendy Aug 7, 2026
2121776
feat(ideas): apply feedback edit to IDEA-3
croco-dendy Aug 7, 2026
19d9080
feat(ideas): apply feedback edit to IDEA-3
croco-dendy Aug 7, 2026
584d993
feat(release): Investigate red Tests/Docs status stamps on deliver card
croco-dendy Aug 7, 2026
e962d47
docs(ideas): mark IDEA-3 fix 1 done and log no-test-suite finding
croco-dendy Aug 7, 2026
93bc0a2
docs(ideas): mark IDEA-3 as review
croco-dendy Aug 7, 2026
80a502c
chore(config): Wire vitest as the test runner and tidy idea titles
croco-dendy Aug 8, 2026
4ea42c2
fix(ci): load the paper-camp toolbar plugin lazily, serve-only
croco-dendy Aug 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@
},
"overrides": [
{
"include": ["src/components/select/**", "src/components/modal/**"],
"include": [
"src/components/select/**",
"src/components/modal/**",
"src/components/drawer/**"
],
"linter": {
"rules": {
"a11y": {
Expand Down
19 changes: 14 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
"version": "0.1.1",
"description": "Glossy, noisy, cosy React component library — frosted glass, film grain, and lava glow",
"type": "module",
"sideEffects": ["**/*.css", "**/*.scss"],
"sideEffects": [
"**/*.css",
"**/*.scss"
],
"packageManager": "pnpm@10.12.1",
"main": "dist/index.cjs",
"module": "dist/index.mjs",
Expand Down Expand Up @@ -43,7 +46,8 @@
"lint:fix": "biome check ./src --write && stylelint \"src/**/*.scss\"",
"lint:styles": "stylelint \"src/**/*.scss\"",
"check-package": "publint",
"ci": "pnpm run check-types && pnpm run lint && pnpm run build"
"ci": "pnpm run check-types && pnpm run lint && pnpm run build",
"test": "vitest run"
},
"repository": {
"type": "git",
Expand Down Expand Up @@ -74,7 +78,7 @@
},
"devDependencies": {
"@biomejs/biome": "^1.9.4",
"@dendelion/paper-camp": "^0.13.1",
"@dendelion/paper-camp": "link:../paper-camp-island",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react-swc": "^3.7.1",
Expand All @@ -90,9 +94,14 @@
"tailwindcss": "^3.4.14",
"typescript": "^5.6.3",
"vite": "^5.4.9",
"vite-plugin-dts": "^4.5.4"
"vite-plugin-dts": "^4.5.4",
"vitest": "^2.1.9"
},
"pnpm": {
"onlyBuiltDependencies": ["@biomejs/biome", "@swc/core", "esbuild"]
"onlyBuiltDependencies": [
"@biomejs/biome",
"@swc/core",
"esbuild"
]
}
}
12 changes: 9 additions & 3 deletions papercamp/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
"projectName": "film-ui",
"initializedAt": "2026-08-04T14:52:35.357Z",
"nextId": {
"idea": 9
"idea": 10
},
"defaultAgents": {
"phase": {
"agent": "claude-code",
"model": "opus",
"effort": "high"
"effort": "medium"
},
"planDraft": {
"agent": "claude-code",
Expand All @@ -25,6 +25,12 @@
"agent": "claude-code",
"model": "sonnet",
"effort": "low"
},
"feedback": {
"agent": "claude-code",
"model": "sonnet",
"effort": "medium"
}
}
},
"port": 3041
}
40 changes: 30 additions & 10 deletions papercamp/ideas/IDEA-3.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
---
id: IDEA-3
title: Tier 3 gap-fillers paper-ui never had
title: Tier 3 gap-filler components
type: feat
status: planned
status: review
created: 2026-08-04
updated: 2026-08-07
tags:
- components
- release
Expand All @@ -14,11 +15,30 @@ The bespoke-UI census found ~28 hand-rolled chrome-less buttons across 10 files,
Skipped for the initial release (no demand from either target inventory): Accordion, Pagination, Avatar, PropTable, Swatch, Island, and the Layout/Page god-components (Backdrop+Glass composition replaces them). Radio/RadioGroup, Tabs, and the table story moved to the radio-parity tier ([[IDEA-7]]) now that the radio project is the target consumer.

### Phases
- [ ] LinkButton (inherit/accent color, sizes — fixes the "fixed amber style" complaint)
- [ ] EmptyState (loading / empty / error, centered per UX_PRINCIPLES layout-stability rules)
- [ ] StatusDot + Chip (toggle/filter, aria-pressed) + SegmentedControl
- [ ] Drawer (backdrop, focus trap, Escape, slide) — replaces two inconsistent hand-rolls
- [ ] Kbd + InlineCode + CodeBlock (filename, copy, per-line diff add/remove styling)
- [ ] CopyButton + Breadcrumb + Menu + FileButton
- [ ] Icon set (~20: close, check, copy, plus, folder, lightbulb, chevrons, play, flag, sort arrows, refresh, more, wand, merge, push, pull, shuffle, commit, github, note)
- [ ] (Table/Tabs/Radio moved to [[IDEA-7]] with the radio retarget)
- [x] LinkButton (inherit/accent color, sizes — fixes the "fixed amber style" complaint)
- [x] EmptyState (loading / empty / error, centered per UX_PRINCIPLES layout-stability rules)
- [x] StatusDot + Chip (toggle/filter, aria-pressed) + SegmentedControl
- [x] Drawer (backdrop, focus trap, Escape, slide) — replaces two inconsistent hand-rolls
- [x] Kbd + InlineCode + CodeBlock (filename, copy, per-line diff add/remove styling)
- [x] CopyButton + Breadcrumb + Menu + FileButton
- [x] Icon set (~20: close, check, copy, plus, folder, lightbulb, chevrons, play, flag, sort arrows, refresh, more, wand, merge, push, pull, shuffle, commit, github, note)
- [x] (Table/Tabs/Radio moved to [[IDEA-7]] with the radio retarget)
- [x] Investigate red Tests/Docs status stamps on deliver card
Determine why the deliver card marks Tests and Docs as red — check what conditions those stamps key off (test script/framework presence, docs coverage) and fix or clear the false-negative.

### Fixes
- [x] Fix failing tests
Investigate and fix the currently failing test suite.

### Thread
- [x] 2026-08-07 [chat] Quick test from the embedded toolbar — just reply with a short hello.
- [x] 2026-08-07 [chat] [agent] Hello — Paper Scout here, reading you loud and clear.
- [x] 2026-08-07 [chat] just checking
- [x] 2026-08-07 [chat] [agent] Just checking, got it — nothing to change here.
- [x] 2026-08-07 [chat] fix tests
- [x] 2026-08-07 [chat] [agent] Added that as a fix here — a new phase to fix the tests. (reopened this idea to re-run)
- [x] 2026-08-07 [question] [agent] Run-all parked on fix 1 ("Fix failing tests") — the agent needs a decision: This repo has no test suite (no test script, framework, or files — and all runnable checks are green); do you want me to (a) close this fix as "no failing tests — repo is green," or (b) scaffold a new test framework + suite from scratch (which is new work beyond "fix failing tests" and needs a framework/scope decision)? → Resolved by owner: no suite scaffolding wanted — "there is no decision, just make it green." Wired vitest (`vitest run` + `passWithNoTests` config, `test` script) so the Tests check runs the real runner and passes; future `*.test.*` files are picked up with no further setup.
- [x] 2026-08-07 [chat] then check why the status stamp for Tests and Docs in the deliver card is red
- [x] 2026-08-07 [chat] [agent] Added that as a fix here — checking why the Tests and Docs status stamps show red on the deliver card.
- [x] 2026-08-07 [question] [agent] Run-all parked on fix 1 ("Fix failing tests") — the agent needs a decision: "Fix failing tests" has nothing to fix — func-ui (this plan's repo) has no test suite at all: no `test` script, no vitest/jest/testing-library dependency, no `*.test.*`/`*.spec.*` files, no test runner config, and no test step in CI (`ci.yml` runs only check-types + lint + build). `pnpm run check-types` is green and there is no failing test suite to repair. This is the same unresolved parked question from earlier: do you want me to (a) close this fix as "no failing tests — repo is green" (leave the checkbox and add nothing), or (b) scaffold a test framework + initial suite from scratch (Vitest + React Testing Library, config, and starter component tests) — which is substantial new work beyond "fix failing tests" and needs a framework/scope decision I can't make for you? → Duplicate of the question above; same resolution — vitest wired with `passWithNoTests`, Tests check green.
- [x] 2026-08-07 [log] [agent] Docs stamp was red from 4 title-style findings (the 0.16.0 title convention): retitled IDEA-3/4/6/7 to fit the 40-char no-subtitle rule (detail already lives in their bodies); consistency now reports 0 issues. Tests check re-run and passing.
2 changes: 1 addition & 1 deletion papercamp/ideas/IDEA-4.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: IDEA-4
title: Showcase gallery entries for every release component
title: Showcase entries for all components
type: docs
status: planned
created: 2026-08-04
Expand Down
2 changes: 1 addition & 1 deletion papercamp/ideas/IDEA-6.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: IDEA-6
title: Adopt func-ui in the radio project (replace mojo-ui)
title: Adopt func-ui in the radio project
type: feat
status: idea
created: 2026-08-04
Expand Down
2 changes: 1 addition & 1 deletion papercamp/ideas/IDEA-7.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: IDEA-7
title: Radio-parity components — Slider, CircularProgress, Radio, DataTable, Tabs, Menu
title: Radio-parity components
type: feat
status: planned
created: 2026-08-04
Expand Down
25 changes: 25 additions & 0 deletions papercamp/ideas/IDEA-9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
id: IDEA-9
title: Glass frost flickers on scroll — move the filter off the scroller's ancestry
type: fix
status: done
created: 2026-08-05
updated: 2026-08-07
tags:
- components
- rendering
---

The frosted panel flickered during small scrolls on macOS Chrome, reproduced and diagnosed live in the owner's browser via a striped test element behind the panel: in steady state the blur smears it correctly; on a scroll tick the blurred wash vanished for a frame — the backdrop-filter transiently drops while its render surface is invalidated.

Root cause: the original flicker fix moved the blur off the scroll *element* but the Glass host remained the scroller's **ancestor**, so inner-scroll invalidations still propagated into the filter's render surface. Chromium then transiently mis-composites the blur.

Fix: the frost now lives on a `::before` layer inside Glass — a *sibling* of the scrolling content, absolutely positioned behind it (`z-index: -1`, host gets `z-index: 0`, no `isolation` — that would create a backdrop root and break sampling). Inner scrolling can no longer touch the filter. `blur={0}` travels as `--fui-glass-backdrop: none`; the blur radius stays on `--fui-glass-blur`. Verified with the same probe: the wash now survives scroll ticks in both directions.

Also fixed in passing: Select's dropdown carried a raw `backdrop-filter: blur(12px)` without the `--fui-nested-backdrop` switch — a latent nested-filter regression whenever it opens inside a Glass surface.

### Phases
- [x] Move the frost to a ::before sibling layer in the glass mixin
- [x] Route blur={0} and blur radius through custom properties to the pseudo
- [x] Verify live on the affected machine (probe wash survives scroll ticks)
- [x] Give Select's dropdown the --fui-nested-backdrop switch
14 changes: 12 additions & 2 deletions papercamp/ideas/index.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
# film-ui
# Ideas

What are you building, and why?
| Id | Title | Type | Status | Tags |
|----|-------|------|--------|------|
| IDEA-1 | Tier 1 — the six workhorse components | feat | done | components, release |
| IDEA-2 | Tier 2 — form controls and overlays | feat | done | components, release |
| IDEA-3 | Tier 3 gap-filler components | feat | review | components, release |
| IDEA-4 | Showcase entries for all components | docs | planned | showcase, release |
| IDEA-5 | Migrate paper-camp from paper-ui to func-ui | feat | dropped | migration |
| IDEA-6 | Adopt func-ui in the radio project | feat | idea | migration, radio |
| IDEA-7 | Radio-parity components | feat | planned | components, release, radio |
| IDEA-8 | Adopt branch-per-idea working flow | chore | idea | workflow |
| IDEA-9 | Glass frost flickers on scroll — move the filter off the scroller's ancestry | fix | done | components, rendering |
1 change: 0 additions & 1 deletion papercamp/run-order.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
IDEA-2 — Tier 2 — form controls and overlays
IDEA-3 — Tier 3 — gap-fillers paper-ui never had
IDEA-4 — Showcase gallery entries for every release component
IDEA-7 — Radio-parity components — Slider, CircularProgress, Radio, DataTable, Tabs, Menu
Loading
Loading