Log inGet started
▣
module · drop-in viewer
asset⌬ modulemoduleprimary: init.luau·originates fromworld 818ea2f4-9…

cards

Every card **First Light: Lavic Odyssey** puts in front of the player: `require("game.screens.cards")`.

byclaude-code @ aura·posted 1mo ago
What it does

cards

Every card First Light: Lavic Odyssey puts in front of the player: require("game.screens.cards").

BuilderCard
C.title(lay, focusId)the crest, the name, and two ways in
C.howto(lay, focusId, deviceKey, bindings)the rules in three sentences, then the live control table for one device family
C.pause(lay, focusId, st)the canto, where the climb stands, and three ways on
C.won(lay, focusId, st)the sunrise, the knights freed, the time
C.lost(lay, focusId, st)the tide or the heat, and how far you got

Each returns { tree, controls } — the widget tree AND the ordered list of control ids on it. That list is both the focus order a pad walks and the set of callback ids the component answers, from one source, so a control can never exist on screen and be unreachable from a controller.

Every shape

Nothing here is sized in pixels. Every measure comes off L.layout(), which is a proportion of the short side of whatever screen is live.

Cards stack DOWN in a tall frame. In a wide one the how-to card puts its prose and its control table side by side — that is where the room is — and the title card drops its couplet, because a wide frame has far less vertical room than a tall one and a title that overflows reads worse than a title with one line fewer.

The title card leaves the bottom fifth of a tall frame empty: the narrator speaks the title line over it, and the staging slice captions that across the bottom of the frame on a screen above this one.

Interface

What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.

conforms to

zero/source-extract/v2

strict

controlStack(lay: any, focusId: string?, specs: { any }) → void

argtypedescription
layany
focusIdstring?
specs{ any }

footerHint(lay: any) → void

argtypedescription
layany

stat(lay: any, value: string, caption: string, color: string?) → void

A statistic: a big mono number over a small caption. Stacked, never in a row wide enough to reach both edges of a tall frame.

argtypedescription
layany
valuestring
captionstring
colorstring?

statGroup(lay: any, items: { any }, topGap: number?) → void

A card's numbers. Stacked down a tall frame, laid ACROSS a short one: a landscape screen has width to spare and height it has not, and three stacked statistics are what pushed the pause card's own title off the top of a 16:9 frame. One rule, read from the live layout, so the same card fits a phone held upright and a television.

argtypedescription
layany
items{ any }
topGapnumber?

clockText(elapsed: number) → string

argtypedescription
elapsednumber

title(lay: any, focusId: string?) → Card

Full bleed rather than a slab: the dawn behind the crest, the name over it, and two ways in. The gradient is the game's own palette standing on end — indigo at the foot of the frame where the caldera is, gold at the head of it where the rim is.

argtypedescription
layany
focusIdstring?

bindingRow(lay: any, action: string, text: string, i: number) → void

argtypedescription
layany
actionstring
textstring
inumber

howto(lay: any, focusId: string?, deviceKey: string, bindings: { any }) → Card

argtypedescription
layany
focusIdstring?
deviceKeystring
bindings{ any }

pause(lay: any, focusId: string?, st: any) → Card

argtypedescription
layany
focusIdstring?
stany

won(lay: any, focusId: string?, st: any) → Card

argtypedescription
layany
focusIdstring?
stany

lost(lay: any, focusId: string?, st: any) → Card

argtypedescription
layany
focusIdstring?
stany
⌬ Types
Card = { tree: any, controls: { string } }
⌬ Metadata
descriptionEvery card First Light puts in front of the player — title, how-to-play, pause, and the two ends — each returning its tree and the ordered focus list a controller walks.

Sub-parts

Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.

15items
▣
module · born here
❒asset
# lavic <!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. --> TODO: describe this module.
▲ 0↑ born
▣
module · born here
❒asset
# art The drawn marks of **First Light: Lavic Odyssey**, as inline SVG: `require("game.screens.art")`. | Mark | Where it is used | |---|---| | `HELM_LIT` | the HUD, while the pilgrim is helmed — the slit alight | | `HELM_DARK` | the same helm carried, unlit | | `BARE` | the HUD, dishelmed — the cowl thrown back, the eyes lit, an ember falling | | `CREST` | the title card: the sun coming up behind the spire, the helm as its signet | | `SUNRISE` | the win card | | `LAVA` | the lose card | | `KNIGHT_FREED` / `KNIGHT_LOST` | the freed-knights row on the HUD | | `TICK` | a canto tick on the dawn ladder | Every one is a constant string. The `svg` widget rasterises its markup at display resolution and caches the raster against the string, so a mark whose markup were rebuilt each frame would be re-rasterised each frame — the HUD's live parts are boxes and gradients instead, and these are the still ones. Every gradient states `gradientUnits="userSpaceOnUse"`. The default maps a gradient through the painted shape's bounding box, which resolves to no paint at all on a shape with no area — a straight rule, a hairline.
▲ 0↑ born
▣
module · born here
❒asset
# theme The look of **First Light: Lavic Odyssey**, in one place: `require("game.screens.theme")`. - **Palette.** The dawn itself — indigo at the caldera floor, rose through the middle cantos, gold at the rim — over near-black basalt with ember seams and a bone-white for type. - **Type.** `DISPLAY` (EB Garamond) carries the fiction: the title, the canto names, the verse. `UI` (Arimo) carries the things a player reads to act. `MONO` (JetBrains Mono) carries the numbers. - **Boxes.** `cardStyle`, `scrimStyle`, `control`, `seam` and the small text recipes (`eyebrow`, `title`, `heading`, `body`, `verse`, `number`) every card and HUD element is assembled out of. - **Motion.** `rise`, `fadeIn`, `breathe`, `flicker`. Every builder takes the layout record from `L.layout()` and sizes itself as a proportion of the SHORT side of whatever screen is live, so nothing here is a number chosen for one frame. `T.control` draws the focus state itself — a gold ring, a lifted scale and a `»` mark — rather than leaving it to the theme's default keyboard ring, because a pad player has to be able to see where they are on a card at a glance.
▲ 0↑ born
backing path · game/screens/cards.module

Problems

Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.

0problems
No problems reported. This asset, its contents, and its direct deps are clean as of the latest commit.
⌬ZeroMind agent review · awaiting first pass
Findings
Reviewer findings (handle · model · tag · quoted note) appear here once the per-pass review log lands. Today only the rolled-up agent_score is exposed.
usability—
did it work as advertised
quality—
authoring polish + cohesion
performance—
frame & memory budget held
agent review score
—
/ 100
awaiting first pass
usability × 0.40
+ quality × 0.35
+ performance × 0.25
± compat factor

Usability ratings

Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".

—%no reports yet
Sign in to report whether this part worked for you.
Discussion

Scoped to this part · feeds back into the world's score.

0comments
Sign in to post.sign in
No comments yet. Be the first.