pixelclaw 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -2
- package/dist/LICENSE +21 -0
- package/dist/THIRD_PARTY_LICENSES.txt +545 -0
- package/dist/pixelclaw.js +666 -0
- package/dist/skill/SKILL.md +255 -0
- package/dist/skill/commands.md +840 -0
- package/dist/skill/manifest.md +64 -0
- package/dist/ui/assets/index-DacOg_uL.css +1 -0
- package/dist/ui/assets/index-DxowuS_Y.js +53 -0
- package/dist/ui/index.html +14 -0
- package/package.json +50 -4
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# The manifest (manifest.json)
|
|
2
|
+
|
|
3
|
+
The asset plan a project is built from. Write it with the `plan` tool (`plan(manifest=…)`) or
|
|
4
|
+
`pixelclaw plan <project> --manifest <file>`; either checks it against the schema first and writes
|
|
5
|
+
nothing when it has problems (each reported with its path, like `assets[3].size`).
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"format": "pixelclaw-manifest",
|
|
10
|
+
"version": 1,
|
|
11
|
+
"theme": "One paragraph: the game's place, mood, light and materials.",
|
|
12
|
+
"sets": {
|
|
13
|
+
"ground": { "description": "floors and terrain" },
|
|
14
|
+
"props": { "description": "things that stand on the ground" }
|
|
15
|
+
},
|
|
16
|
+
"export": { "profile": "png" },
|
|
17
|
+
"assets": [
|
|
18
|
+
{ "name": "clay", "kind": "tile", "size": "24x24", "set": "ground", "description": "packed red clay", "flat": "clay2" },
|
|
19
|
+
{ "name": "bank", "kind": "family", "size": "24x24", "set": "ground", "scheme": "blob47", "inside": "clay", "outside": "grass", "band": "2:outside 1:ink 2:clay0 radius=2" },
|
|
20
|
+
{ "name": "urn", "kind": "sprite", "size": "24x24", "set": "props", "height": 14, "description": "a squat glazed urn" },
|
|
21
|
+
{ "name": "urn_blue", "kind": "sprite", "size": "24x24", "set": "props", "recolourOf": "urn", "height": 14 },
|
|
22
|
+
{ "name": "potter", "kind": "sprite", "size": "24x24", "set": "folk", "frames": 2, "ticks": 12, "views": ["S", "N", "E", "W"], "mirror": { "W": "E" }, "height": 21 },
|
|
23
|
+
{ "name": "kiln", "kind": "object", "size": "48x48", "set": "props", "cells": "2x1", "height": 44 },
|
|
24
|
+
{ "name": "hollow", "kind": "map", "size": "40x30", "uses": ["bank", "kiln", "urn"] }
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Field | For | Meaning |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| `name` | all | a-z, 0-9, `_`, `-`; unique; the asset's name |
|
|
32
|
+
| `kind` | all | tile, sprite, sheet, icon, family, overlay, object, map, font |
|
|
33
|
+
| `size` | all | pixels `WxH` (a family: its tile, square and even; a map: cells `CxR`; a font: a glyph cell) |
|
|
34
|
+
| `set` | all | the group it is judged, reviewed and shown with (default: its kind); must be in `sets` when `sets` is given |
|
|
35
|
+
| `description` | all | what it is meant to read as (the reviewer's brief shows it) |
|
|
36
|
+
| `palette` | all | a project palette (default: the project's) |
|
|
37
|
+
| `scheme`, `inside`, `outside`, `band` | family | the autotile scheme (built in or `schemes/*.json`), the tiles on each side, the band profile |
|
|
38
|
+
| `frames`, `ticks` | animated | frames (per view), ticks per frame |
|
|
39
|
+
| `views`, `mirror` | sprite, object | directions (S, N, E, W) and mirrors (`{ "W": "E" }`) |
|
|
40
|
+
| `cells` | object | the footprint in cells `CxR` |
|
|
41
|
+
| `height` | props, figures | the drawn shape's height in pixels; `consistency` holds the art to it (± 2) |
|
|
42
|
+
| `variantOf`, `recolourOf` | all | a texture variant or a palette-swap recolour of another planned asset of the same kind |
|
|
43
|
+
| `uses` | map | the assets it is built from |
|
|
44
|
+
| `flat` | all | its colour in the flat templates: a palette entry name or `#rrggbb` |
|
|
45
|
+
| `chars` | font | its characters (the characters themselves, or `"32-126"`, `"U+0041-U+005A"`) |
|
|
46
|
+
|
|
47
|
+
Scenes (optional, top level): `"scenes": [{ "name": "kiln_yard", "description": "…", "uses":
|
|
48
|
+
["clay", "urn", …], "map": "hollow" }]`: the places the game shows, the assets each needs, and the
|
|
49
|
+
map document that builds it (its own `uses` count too). The dashboard shows each scene's missing
|
|
50
|
+
assets; `plan(order="scene")` lists the work scene by scene.
|
|
51
|
+
|
|
52
|
+
What the manifest gives the tools:
|
|
53
|
+
- `new <kind> <name>` with no size, palette or scheme takes them from the asset's entry (and an
|
|
54
|
+
object's cell grid is the project's grid); the line records them, so replay never reads the
|
|
55
|
+
manifest.
|
|
56
|
+
- `consistency` compares an asset with the rest of its set (like with like: ground tiles, figures,
|
|
57
|
+
icons) and with its `height`; plan icons as one set so they share a stroke weight and box fill; a set's check
|
|
58
|
+
thresholds can be set in `project.json` `style.sets.<set>.checks`.
|
|
59
|
+
- `map gen …` on a map the manifest plans stands the objects its `uses` lists (drawn objects and
|
|
60
|
+
sprites, once each) on the generated ground; the line records them as `objects=… fp=…`.
|
|
61
|
+
- `review(set=…)` reviews a set's drawn assets, with a brief from the theme and descriptions.
|
|
62
|
+
- `plan(templates=true)` draws `templates/mockup.png` (one game screen in flat colours, the
|
|
63
|
+
camera's size), `mockup@2x.png` (labelled) and `mockup.txt`, and `<family>.coverage.png|txt`
|
|
64
|
+
(every variant of the scheme laid out in flat colours, to paint over or cut from).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg: #16171b;--panel: #1d1f24;--panel2: #23262c;--line: #2f333a;--text: #d8dbe0;--dim: #8a909a;--accent: #f0a35e;--claude: #f0a35e;--human: #6cc4ff;--other: #b9a3ff;--mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font:13px/1.4 system-ui,-apple-system,Segoe UI,sans-serif}button,select{font:inherit;color:var(--text);background:var(--panel2);border:1px solid var(--line);border-radius:4px;padding:3px 9px;cursor:pointer}button:hover:not(:disabled),select:hover{border-color:#4a505a}button:disabled{opacity:.45;cursor:default}button.on{border-color:var(--accent);color:var(--accent)}input[type=checkbox]{accent-color:var(--accent);vertical-align:-2px}label{cursor:pointer;user-select:none}.dim{color:var(--dim);font-weight:400}.spacer{flex:1}.app{display:grid;height:100%;grid-template-columns:230px minmax(0,1fr) 380px;grid-template-rows:40px minmax(0,1fr);grid-template-areas:"head head head" "left main right"}header{grid-area:head;display:flex;align-items:center;gap:12px;padding:0 14px;background:var(--panel);border-bottom:1px solid var(--line)}.logo{font-weight:700;letter-spacing:.02em;color:var(--accent)}.crumbs{font-weight:600}.crumbs .sep{color:var(--dim);margin:0 4px}.crumbs .meta{color:var(--dim);font-weight:400;margin-left:6px}.chip{font-size:12px;padding:2px 9px;border-radius:10px;background:var(--panel2);border:1px solid var(--line);white-space:nowrap}.conn-open{color:#8fd18b}.conn-connecting,.conn-closed{color:#e7c55a}.travel-chip{color:var(--human);border-color:#2c5a78}.paused-chip{color:#e7c55a}aside{background:var(--panel);overflow:hidden;display:flex;flex-direction:column;min-height:0}aside.left{grid-area:left;border-right:1px solid var(--line)}aside.right{grid-area:right;border-left:1px solid var(--line)}.panel-title{display:flex;align-items:center;gap:6px;padding:9px 12px 6px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#aab0ba}.panel-title .dim{text-transform:none;letter-spacing:0;font-size:12px}.follow{margin-left:auto;font-weight:400;text-transform:none;letter-spacing:0;font-size:12px;color:var(--dim)}.assets{list-style:none;margin:0;padding:0 6px 8px;overflow:auto;max-height:30%;flex:none}.assets li{display:flex;gap:7px;align-items:center;padding:4px 8px;border-radius:4px;cursor:pointer}.assets li:hover{background:var(--panel2)}.assets li.selected{background:#2b2f37}.assets li.none{color:var(--dim);cursor:default}.assets .dot{color:var(--dim);font-size:10px;width:10px}.assets .dot.busy{color:var(--accent)}.assets .name{flex:1;font-family:var(--mono);font-size:12px;overflow:hidden;text-overflow:ellipsis}.assets .count{color:var(--dim);font-size:11px}.swatches{overflow:auto;padding:0 8px 10px;display:grid;grid-template-columns:1fr;gap:1px;min-height:0}.swatch{display:flex;align-items:center;gap:7px;padding:1px 4px;font-family:var(--mono);font-size:11.5px;border-radius:3px;cursor:pointer;border:1px solid transparent}.swatch:hover{background:var(--panel2)}.swatch.on{border-color:var(--accent);background:#2b2f37}.chip-colour{width:16px;height:16px;border-radius:2px;box-shadow:inset 0 0 0 1px #ffffff1f;flex:none;display:inline-block}.chip-colour.none{background:repeating-conic-gradient(#ccc 0 25%,#eee 0 50%) 0 0 / 8px 8px!important}.swatch .key{color:var(--text);width:10px}.swatch .sname{color:var(--dim)}main{grid-area:main;display:flex;flex-direction:column;min-width:0;min-height:0}.toolbar{display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:1px solid var(--line);background:var(--panel)}.toolbar .zoom{min-width:34px;text-align:center;font-family:var(--mono)}.toolbar .gap{width:10px}.banner{display:flex;align-items:center;gap:12px;padding:6px 12px;background:#1b3446;color:#cfe9ff;border-bottom:1px solid #2c5a78}.banner.error{background:#4a1f22;color:#ffd0d0;border-color:#7a3036}.stage{flex:1;overflow:auto;display:grid;place-items:center;padding:24px;min-height:0;background:#121317 radial-gradient(circle at 50% 40%,#1a1c21,#111216)}.stage.travel{box-shadow:inset 0 0 0 2px #2c5a78}.stage .art{position:relative;touch-action:none;box-shadow:0 0 0 1px #000,0 6px 30px #00000080}.stage canvas{image-rendering:pixelated;display:block}.stage canvas.overlay{position:absolute;left:0;top:0;pointer-events:none}.note-label{position:absolute;transform:translateY(-100%);margin-top:-3px;max-width:260px;padding:1px 6px;border-radius:3px;background:#ffd60a;color:#1c1800;font-size:11px;line-height:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;box-shadow:0 1px 4px #00000080;z-index:1}.note-label.on{white-space:normal;max-width:320px;z-index:2}.stage .empty{color:var(--dim)}.tape-list{flex:1;overflow:auto;font-family:var(--mono);font-size:12px;min-height:0}.tape-inner{position:relative}.tape-inner>div{position:absolute;left:0;right:0}.group-row{display:flex;gap:8px;align-items:flex-end;padding:0 12px 3px;border-top:1px solid var(--line);box-sizing:border-box}.group-row:first-child{border-top:0}.group-row .author{font-weight:700}.group-row .gid{color:var(--dim)}.group-row .at{margin-left:auto;color:#5d636d;font-size:11px}.group-row .tag{font-size:10px;text-transform:uppercase;color:#e08a8a;border:1px solid #6d3a3a;border-radius:3px;padding:0 4px}.by-claude .author,.legend.by-claude{color:var(--claude)}.by-human .author,.legend.by-human{color:var(--human)}.by-other .author,.legend.by-other{color:var(--other)}.cmd-row{display:flex;gap:8px;padding:0 12px 0 9px;line-height:18px;border-left:3px solid transparent;cursor:pointer;white-space:pre;overflow:hidden;box-sizing:border-box}.cmd-row .cmd{overflow:hidden;text-overflow:ellipsis}.cmd-row:hover{background:#262a31}.cmd-row.by-claude{border-left-color:#f0a35e59}.cmd-row.by-human{border-left-color:#6cc4ff73}.cmd-row.by-other{border-left-color:#b9a3ff66}.cmd-row .seq{color:#5d636d;min-width:34px;text-align:right;flex:none}.cmd-row .cmd{flex:1}.cmd-row .block{display:block;color:#aab0ba}.cmd-row.pending,.cmd-row.future{opacity:.38}.cmd-row.head{background:#3a2c1c}.cmd-row.head.by-claude{border-left-color:var(--claude)}.cmd-row.head.by-human{background:#1b3446;border-left-color:var(--human)}.cmd-row.undone .cmd{text-decoration:line-through;color:var(--dim)}.cmd-row.picked{outline:1px solid var(--human);outline-offset:-1px;background:#1b3446}.legend{font-family:var(--mono);font-size:12px;text-transform:none;letter-spacing:0}.controls{display:flex;align-items:center;gap:6px;padding:8px 12px;border-top:1px solid var(--line);background:var(--panel2)}.eye{padding:0 12px 12px;display:flex;flex-direction:column;gap:5px;align-items:flex-start}.eye img{max-width:100%;max-height:210px;image-rendering:pixelated;cursor:zoom-in;border:1px solid var(--line);background:#000}.modal{position:fixed;inset:0;background:#08090ce0;display:flex;flex-direction:column;gap:10px;align-items:center;justify-content:center;cursor:zoom-out}.modal img{image-rendering:pixelated;border:1px solid var(--line)}.tools{display:grid;grid-template-columns:repeat(5,1fr);gap:4px;padding:0 10px 8px;flex:none}.tools button{font-size:16px;padding:4px 0;line-height:20px}button.mini{padding:0 6px;font-size:12px;line-height:16px}.palette-edit{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:0 10px 8px}.palette-edit input[type=color]{width:26px;height:24px;padding:0;border:1px solid var(--line);background:none;flex:none}.palette-edit input.hex{width:66px;font-family:var(--mono);font-size:12px}.palette-edit input.pname{width:58px}.palette-edit button{padding:2px 7px}input[type=text],input:not([type]){font:inherit;color:var(--text);background:#121317;border:1px solid var(--line);border-radius:4px;padding:2px 6px}.colour-now{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:12px}.chip.me{cursor:pointer;color:var(--human);border-color:#2c5a78}.chip.me b{font-weight:600}.me-form{font-family:var(--mono);font-size:12px;color:var(--human)}.me-form input{width:110px}.inline-form{display:inline-flex;gap:6px;align-items:center}.inline-form input{width:140px}.note-banner{background:#3a3110;color:#fff1b8;border-color:#6b5a1a}.note-banner input{flex:1;min-width:120px}.cmdline{display:flex;align-items:center;gap:6px;padding:6px 12px;border-top:1px solid var(--line);background:#191b20;font-family:var(--mono)}.cmdline .prompt{color:var(--human)}.cmdline input{flex:1;font-family:var(--mono);font-size:12px;background:transparent;border:0;padding:2px 0;outline:none}.notes{list-style:none;margin:0;padding:0 8px 8px;max-height:140px;overflow:auto;flex:none}.notes li{display:flex;gap:8px;align-items:flex-start;padding:3px 6px;border-radius:4px;cursor:pointer;border-left:3px solid #ffd60a;margin-bottom:2px;background:#22211a}.notes li.on{background:#3a3110}.notes .nid{font-family:var(--mono);color:#ffd60a;font-weight:700}.notes .ntext{flex:1}.options{display:flex;align-items:center;gap:10px;padding:4px 12px;border-bottom:1px solid var(--line);background:#1a1c21;font-size:12px;flex-wrap:wrap}.options .opt{display:inline-flex;align-items:center;gap:5px}.options button{padding:1px 7px;font-size:13px;line-height:18px}.options select{padding:1px 4px;font-size:12px}.options input.num{width:44px;font:inherit;color:var(--text);background:#121317;border:1px solid var(--line);border-radius:4px;padding:1px 4px}.chip-colour.small{width:11px;height:11px;margin-left:-2px;align-self:flex-end}.swatch .ab{margin-left:auto;font-size:10px;font-weight:700;color:var(--accent)}.swatch .ab.b{color:var(--human);margin-left:2px}.swatch .ab+.ab.b{margin-left:2px}.swatch.two:not(.on){border-color:#2c5a78}.stage .frame-area{position:relative;touch-action:none}.stage .frame-area>.art{position:absolute}.stage canvas.ghosts{position:absolute;left:0;top:0;pointer-events:none}.timeline{flex:none;border-top:1px solid var(--line);background:var(--panel);max-height:236px;display:flex;flex-direction:column}.tl-bar{display:flex;align-items:center;gap:5px;padding:4px 10px;font-size:12px}.tl-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#aab0ba;margin-right:2px}.tl-grid{overflow:auto;padding:0 10px 6px;min-height:0}.tl-grid table{border-collapse:collapse;font-size:12px}.tl-grid td{padding:0 3px;height:20px;border-bottom:1px solid #262930}.tl-grid tr.on td.lname{color:var(--accent);font-weight:600}.tl-grid td.lname{font-family:var(--mono);min-width:90px;cursor:pointer;padding-right:10px}.tl-grid td.lname input{width:90px;font-family:var(--mono);font-size:12px}.tl-grid td.cel{width:22px;text-align:center;cursor:pointer;color:#6b717b}.tl-grid td.cel.fnow{background:#20242b}.tl-grid td.cel.here{background:#3a2c1c;color:var(--accent)}.tl-anim{flex-wrap:wrap;padding-top:0}.tl-anim select{font-size:12px;padding:0 2px}.tl-anim .chk{display:inline-flex;align-items:center;gap:2px;color:#aab0ba;cursor:pointer}.tl-anim .tagform input{width:64px;font-size:12px;font-family:var(--mono)}button.mini.play.on{border-color:var(--accent);color:var(--accent)}.tl-grid thead th{font-weight:400;font-size:11px;color:#8a909a;padding:0 1px;border-bottom:1px solid #262930}.tl-grid th.rowhead{text-align:left;font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:#6b717b;padding-right:8px}.tl-grid th.fhead{width:22px;text-align:center;cursor:pointer;line-height:12px;padding:2px 0}.tl-grid th.fhead .ticks{font-family:var(--mono);color:#6b717b;font-size:10px}.tl-grid th.fhead .ticks-in{width:30px;font-size:10px;font-family:var(--mono);padding:0}.tl-grid th.fnow,.tl-grid td.cel.fnow{background:#20242b}.tl-grid th.fhead.fnow{color:var(--accent)}.tl-grid th.fsel,.tl-grid td.cel.fsel{box-shadow:inset 0 -2px #4fb3ff}.tl-grid th.band{text-align:left;white-space:nowrap;border-radius:3px;padding:0 4px;font-family:var(--mono);font-size:11px;color:#d8dbe0}.tl-grid th.band.view{background:#24364a}.tl-grid th.band.view.mirror{background:#2a2f3a;color:#9fb4c8;font-style:italic}.tl-grid th.band.tag{background:#3b3020}.tl-grid th.band .x{border:0;background:none;padding:0 2px;font-size:10px;color:#8a909a;margin-left:2px}.tl-grid th.band .x:hover{color:var(--accent)}.tl-grid td.cel.mirrored{color:#4a6a85}.tl-grid td.cel[data-linked]{color:#c8a050}.tl-grid .flagbtn{padding:0 3px;border:0;background:none;font-size:12px;min-width:16px;color:#6b717b}.tl-grid td.flag.set .flagbtn{color:var(--accent)}.stamps{display:flex;flex-wrap:wrap;gap:4px;padding:0 10px 10px;flex:none}.stamps .stamp{display:flex;flex-direction:column;align-items:center;gap:2px;padding:3px 5px;font-family:var(--mono);font-size:10.5px}.stamps .stamp canvas{image-rendering:pixelated;background:repeating-conic-gradient(#ccc 0 25%,#eee 0 50%) 0 0 / 6px 6px}.stamps .stamp.on{border-color:var(--accent)}.tools{grid-template-columns:repeat(6,1fr)}.colour-now .ab{font-size:10px;font-weight:700;color:var(--accent)}.colour-now .ab.b{color:var(--human);margin-left:6px}.toolbar{flex-wrap:wrap;row-gap:4px}.toolbar label,.toolbar button,.toolbar .colour-now,.toolbar .dim{white-space:nowrap}aside.left .swatches{flex:1 1 auto;min-height:80px}aside.left .stamps{max-height:120px;overflow:auto}header .crumbs{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:120px;flex:0 4 auto}.checks{display:flex;gap:3px;min-width:0;overflow-x:auto;scrollbar-width:none;flex:0 1 auto}.checks::-webkit-scrollbar{display:none}.chip.check{cursor:pointer;font-family:var(--mono);font-size:11px;padding:1px 6px;line-height:16px;color:#8fd18b;flex:none}.chip.check.fail{color:#ff8fa3;border-color:#6a2f3c;background:#2a1b20}.chip.check .score{color:var(--text)}.chip.check.on{border-color:#ff00c8;box-shadow:0 0 0 1px #ff00c8 inset}.check-details{flex-direction:column;align-items:stretch;gap:3px;background:#241a24;border-color:#5a2d55;font-size:12px}.check-details .cd-head{display:flex;align-items:baseline;gap:6px}.check-details .cd-detail{color:#c9ccd2}.check-details .score{font-family:var(--mono)}.check-details .cd-group{display:flex;align-items:center;gap:6px;color:#c9ccd2}.check-details .mono{font-family:var(--mono);font-size:11.5px;color:#e9b8e4}.check-details .mark-dot{width:9px;height:9px;border-radius:50%;border:2px solid #ff00c8;flex:none}.check-details button{padding:0 6px;line-height:16px;font-size:12px}.preview{flex:none;border-top:1px solid var(--line)}.preview .panel-title .mini{text-transform:none;letter-spacing:0;font-weight:600}.preview .panel-title .mini.on{border-color:var(--accent);color:var(--accent)}.preview-body{padding:0 12px 8px;overflow:auto;max-height:250px;display:flex;flex-direction:column;gap:4px}.preview-body canvas{image-rendering:pixelated;display:block;flex:none}.swatch .role{font-size:10px;color:#c9a6ff;border:1px solid #4b3a6a;border-radius:3px;padding:0 4px;line-height:14px}.theme-row{display:flex;align-items:center;gap:6px;padding:0 12px 6px;font-size:12px;color:var(--dim)}.theme-select{font-size:12px;padding:0 3px}.narrow-only{display:none}@media(max-width:1500px){.xwide-only{display:none}header .crumbs .meta{display:none}}.palette-edit select{font-size:12px;padding:1px 3px}.options{row-gap:4px}.options>*{flex:none}.options .spacer{flex:1 0 0;min-width:0}@media(max-width:1350px){.options{gap:8px;padding:3px 8px}.options .opt-label,.options .spacer{display:none}}.check-details button{white-space:nowrap;flex:none}.check-details .cd-group{flex-wrap:wrap}@media(max-width:1350px){.app{grid-template-columns:200px minmax(0,1fr) 320px}header{gap:8px;padding:0 10px}header .crumbs .meta{display:none}.chip.check{padding:1px 5px;font-size:10.5px}.chip.check.pass .score,.wide-only{display:none}.narrow-only{display:inline}.toolbar{gap:6px;padding:5px 8px}}.seg{display:inline-flex;flex:none}.seg button{border-radius:0;padding:3px 8px}.seg button:first-child{border-radius:4px 0 0 4px}.seg button:last-child{border-radius:0 4px 4px 0}.seg button+button{border-left:none}.family-view{flex:1;min-height:0;overflow:auto;padding:10px 14px;display:flex;flex-direction:column;gap:8px}.family-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.family-head .num{width:64px}.family-legend{font-size:12px}.family-grid{display:flex;flex-wrap:wrap;gap:10px;align-content:flex-start}.variant{background:var(--panel);border:1px solid var(--line);border-radius:4px;padding:5px;display:flex;flex-direction:column;gap:4px}.variant canvas{image-rendering:pixelated;display:block}.variant.piece{border-color:#4fb7c4}.variant.detached{border-color:#c99a45}.vname{display:flex;align-items:center;gap:6px;font-size:11px;justify-content:space-between}.vname .mini{padding:0 6px;font-size:11px}.piece-tag,.detached-tag{font-size:10px;padding:0 5px;border-radius:8px;border:1px solid #4fb7c4;color:#8fdbe4}.detached-tag{border-color:#c99a45;color:#f0c27a}.map-text{white-space:pre-wrap;font-size:12px}.map-body canvas{image-rendering:pixelated;display:block}.rowhead.fold{cursor:pointer;user-select:none}.rowhead.fold:hover{color:var(--accent)}.timeline.folded{flex:none}.map-editor{display:flex;flex-direction:column;flex:1;min-height:0}.map-editor .map-tools{flex-wrap:wrap;gap:6px}.map-editor .mix{display:inline-flex;flex-wrap:wrap;gap:4px;align-items:center}.map-editor .mix label{display:inline-flex;align-items:center;gap:3px;font:11px var(--mono);color:#8a909a;padding:1px 4px;border:1px solid var(--line);border-radius:4px}.map-editor .mix label.on{color:#e6e8eb;border-color:#4a6a8a}.map-editor .mix input{width:3.2em;font:11px var(--mono);background:transparent;color:inherit;border:none;border-bottom:1px solid var(--line)}.map-editor .map-body{flex:1;overflow:auto;padding:8px}.map-editor canvas{image-rendering:pixelated;display:block}.tabs button{padding:2px 9px}.app.dash{grid-template-areas:"head head head" "dash dash dash"}.dashboard{grid-area:dash;overflow:auto;padding:0 0 24px}.dashboard .pad{padding:16px}.dash-top{position:sticky;top:0;z-index:2;background:var(--bg);padding:10px 16px 8px;border-bottom:1px solid var(--line);display:flex;flex-direction:column;gap:8px}.dash-theme{max-width:120ch}.dash-progress{display:flex;height:8px;border-radius:4px;overflow:hidden;background:var(--panel2)}.seg-bar{display:block;min-width:4px}.dash-filters{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.dash-set{padding:4px 12px 0}.dash-set .panel-title{padding-left:4px}.dash-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px}.dash-card{display:flex;gap:10px;padding:9px;background:var(--panel);border:1px solid var(--line);border-left:4px solid var(--st, var(--line));border-radius:6px;min-width:0}.dash-card.unplanned{border-style:dashed}.dash-card .thumb{flex:none;width:108px;height:108px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:4px;background:repeating-conic-gradient(#2a2d33 0 25%,#24272c 0 50%) 0 0 / 12px 12px}.dash-card .thumb img{image-rendering:pixelated}.dash-card .thumb:disabled{opacity:1;cursor:default}.planned-box{width:64px;height:64px;border:1px dashed #4a505a;border-radius:3px;display:flex;align-items:center;justify-content:center;color:var(--dim);font:11px var(--mono)}.card-body{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}.card-head{display:flex;align-items:center;gap:8px}.card-head b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mono{font-family:var(--mono)}.desc{color:#b9bec6;font-size:12px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.next{font-size:12px;color:var(--accent)}.next.dim{color:var(--dim)}.flag{font-size:11px;color:#e7c55a}.card-checks{display:flex;flex-wrap:wrap;gap:3px}.chk{font:11px var(--mono);padding:0 6px;border-radius:8px;border:1px solid var(--line)}.chk.pass{color:#8fd18b}.chk.fail{color:#ff9a9a;border-color:#7a3036;background:#3a1d20}.card-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.card-actions button{white-space:nowrap}.card-actions.ask{flex-wrap:wrap}.card-actions.ask input{flex:1 1 100%;min-width:0;font:inherit;color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:4px;padding:3px 6px}button.approve{border-color:#3f7a4a;color:#8fd18b}.badge{font-size:11px;padding:1px 8px;border-radius:9px;border:1px solid var(--st, var(--line));color:var(--st, var(--dim));background:transparent;white-space:nowrap}button.badge{cursor:pointer}button.badge.on{background:var(--st);color:#111}.st-planned{--st: #6a707c}.st-drafted{--st: #e8955a}.st-checked{--st: #e2cf5c}.st-reviewed{--st: #6cc4ff}.st-approved{--st: #b9a3ff}.st-exported{--st: #8fd18b}.seg-bar.st-planned,.seg-bar.st-drafted,.seg-bar.st-checked,.seg-bar.st-reviewed,.seg-bar.st-approved,.seg-bar.st-exported{background:var(--st)}.dash-row{display:flex;align-items:flex-start;gap:12px}button.link{border:0;background:none;padding:0 2px;color:var(--human);text-decoration:underline;text-underline-offset:2px;cursor:pointer}button.ask-claude{border-color:#7a5a34;color:var(--claude)}.dash-card.has-request{box-shadow:0 0 0 1px #5a4630 inset}.req{font-size:12px;border-radius:4px;padding:4px 6px;background:var(--panel2);border-left:3px solid #6a707c;display:flex;flex-direction:column;gap:3px}.req-head{display:flex;gap:6px;align-items:baseline;flex-wrap:wrap}.req-id{color:var(--dim);font-size:11px}.req-open{border-left-color:var(--human)}.req-claimed{border-left-color:var(--claude)}.req-blocked{border-left-color:#e7c55a;background:#322b14}.req-done{border-left-color:#8fd18b;color:#b9d8b6}.req-cancelled{opacity:.6}.req .link{align-self:flex-start;font-size:11px;color:var(--dim)}.claude-working{color:var(--claude)}.pulse{display:inline-block;width:8px;height:8px;margin-right:6px;border-radius:50%;background:var(--claude);animation:pulse 1.2s ease-in-out infinite;vertical-align:0}@keyframes pulse{0%,to{opacity:.25}50%{opacity:1}}.req-chip{color:var(--claude);border-color:#7a5a34}.worker{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end;position:relative}.worker-log{position:absolute;top:100%;right:0;margin:6px 0 0;width:min(760px,80vw);max-height:320px;overflow:auto;z-index:5;background:#101114;border:1px solid var(--line);border-radius:6px;padding:8px 10px;font:11px/1.5 var(--mono);white-space:pre-wrap;color:#c4c8cf}.banner.floating{position:fixed;left:50%;bottom:16px;transform:translate(-50%);z-index:20;max-width:80vw}.dash-scenes .scene-list{display:flex;flex-wrap:wrap;gap:8px}.scene{background:var(--panel);border:1px solid var(--line);border-left:4px solid #e8955a;border-radius:6px;padding:6px 10px;min-width:240px}.scene.complete{border-left-color:#8fd18b}.scene-gaps{display:flex;flex-wrap:wrap;gap:3px;margin-top:3px;align-items:center}.chk.missing{color:#c9ccd2;border-style:dashed}.dialog-back{position:fixed;inset:0;background:#08090b99;z-index:30;display:flex;align-items:center;justify-content:center}.dialog{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:14px 16px;max-width:min(1000px,94vw);max-height:90vh;overflow:auto;display:flex;flex-direction:column;gap:8px}.dialog p{margin:0}.dialog input:not([type]),.dialog input[type=text],.dialog select{font:inherit;color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:4px;padding:3px 6px}.add-asset{width:460px;display:grid;grid-template-columns:1fr 1fr;gap:8px 12px}.add-asset>.panel-title,.add-asset>p,.add-asset>.wide,.add-asset>.banner,.add-asset>.card-actions{grid-column:1 / -1}.add-asset label{display:flex;flex-direction:column;gap:2px;color:var(--dim);font-size:12px}.add-asset label input,.add-asset label select{color:var(--text)}.drop-zone{grid-area:dash;position:relative;min-height:0;display:flex;flex-direction:column}.drop-zone>.dashboard{flex:1}.drop-zone.over>.dashboard{outline:2px dashed var(--human);outline-offset:-6px}.drop-hint{position:absolute;inset:40% 20% auto;text-align:center;padding:14px;background:var(--panel);border:1px solid var(--human);border-radius:8px;color:var(--human);pointer-events:none}.import-body{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap}.slice-view{position:relative;flex:none;background:repeating-conic-gradient(#2a2d33 0 25%,#24272c 0 50%) 0 0 / 12px 12px}.slice-view img{image-rendering:pixelated;display:block}.slice-cell{position:absolute;box-sizing:border-box;border:1px solid rgba(108,196,255,.85)}.slice-cell span{position:absolute;left:1px;bottom:1px;font:10px var(--mono);background:#101114cc;color:var(--human);padding:0 3px;border-radius:2px}.slice-cell.empty{border-color:#8a909a59;border-style:dashed}.import-form{display:flex;flex-direction:column;gap:7px;min-width:300px;flex:1}.import-form label,.import-form .row{display:flex;gap:6px;align-items:center;flex-wrap:wrap;color:var(--dim)}.import-form input:not([type]){width:auto}.import-names{font-size:12px;max-width:420px}.import-list{margin:4px 0;padding-left:18px;display:flex;flex-direction:column;gap:3px}.gallery .gal-grid{display:flex;flex-wrap:wrap;gap:12px;padding:12px 16px;align-items:flex-end}.gal-item{background:var(--panel);border:1px solid var(--line);border-bottom:3px solid var(--st);border-radius:6px;padding:8px;display:flex;flex-direction:column;gap:3px;min-width:120px;max-width:380px}.gal-item.picked{border-color:var(--human);box-shadow:0 0 0 1px var(--human)}.gal-art{padding:6px;border:0;border-radius:4px;display:flex;align-items:flex-end;justify-content:center;min-height:60px;background:repeating-conic-gradient(#2a2d33 0 25%,#24272c 0 50%) 0 0 / 12px 12px}.gal-art:disabled{opacity:1}.gal-art canvas{image-rendering:pixelated;display:block}.gal-meta{display:flex;align-items:center;gap:6px}.gal-meta b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.small{font-size:11px}.gal-rel{font-size:11px;color:var(--dim);display:flex;flex-wrap:wrap;gap:2px 4px}.gal-rel .link{font-size:11px}.compare{margin:10px 16px 0;padding:12px;border:1px solid var(--line);border-radius:8px;background:repeating-conic-gradient(#2a2d33 0 25%,#24272c 0 50%) 0 0 / 16px 16px;overflow:auto}.compare-row{display:flex;gap:24px;align-items:flex-end}.compare figure{margin:0;display:flex;flex-direction:column;align-items:center;gap:6px}.compare canvas{image-rendering:pixelated;display:block}.compare figcaption{background:#101114d9;padding:2px 6px;border-radius:4px}.compare-tools{margin-bottom:10px}
|