annie.core.theme

Central theme tokens — every colour Annie uses lives here.

Two distinct colour systems are kept apart on purpose:

  • UI status colours (STATUS_COLORS) — chrome that conveys a row’s link state in the Dataset summary and Browse list. Referenced by name, never as raw hex inline.

  • Box-drawing colours (color_for_track() and friends, in annie.color) — colours burned onto the video frames themselves, given in BGR to match the render convention.

Keeping both here means a redesign touches one file.

Attributes

PRIMARY

App-wide primary/accent colour, applied via NiceGUI's global colour call.

ACCENT

More vivid green, e.g. the "validated" check.

LOGO_MARK_SVG

The brand mark — a detection-box bracket enclosing a green validation check.

SUCCESS

Teal — linked / complete / usable.

WARNING

Amber — video only / watchable, annotation off.

DANGER

Coral — annotation only / nothing to preview.

NEUTRAL

Grey — totals, secondary text.

DECISION_ACCEPT

Dark green — an accepted clip (button + row-border highlight).

DECISION_DROP

Dark red — a dropped clip (button + row-border highlight).

DECISION_UNDECIDED

Grey — the "Undecided" reset button; a clip with no verdict carries no highlight.

DECISION_ACCEPT_TINT

Pale green fill behind an accepted clip — the lighter inside of its green border.

DECISION_DROP_TINT

Pale red fill behind a dropped clip — the lighter inside of its red border.

ROW_BORDER

The light border every Browse/Annotator row card carries, so its extent is visible.

EVENT_TRACK_PALETTE

Per-lane fill colours for timeline event boxes, cycled by the lane's order.

EVENT_PLAYHEAD

Coral — the vertical playhead line marking the current time across all lanes.

EVENT_SELECTED

Near-black — the 2px outline of the currently selected event box.

EVENT_BORDER

Dark grey — the 1px outline every event box carries, so a pale/pastel fill stays visible

EVENT_PENDING

Amber — the translucent band drawn from an event's start to the live playhead while the

VDET_COLOR

Navy blue — vdet-related metrics.

TRACK_COLOR

Pastel green — track-related metrics.

AVAILABLE

Teal — the path exists and was read.

UNAVAILABLE

Coral — the configured path is missing.

LABEL_COLOR

Violet — distinct from vdet/track/status chips.

VIDEO_TAG_COLOR

Bright blue — has video frames.

AUDIO_TAG_COLOR

Orange — has an audio stream.

HEADER_FG

White header text/icons, readable on the dark primary header bar.

STATUS_COLORS

Status → colour, the single source of truth for the tri-state UI treatment.

STATUS_LABELS

Status → short human label shown on pills and summary cards.

STATUS_ICONS

Status → Tabler icon name used on cards and pills.

ColorName

The semantic colour names accepted by color().

Functions

event_track_color(→ str)

Return the timeline fill colour for a track at vertical position ordinal.

status_color(→ str)

Return the hex colour for a row status.

color(→ str)

Resolve a semantic colour name to its hex value.

Module Contents

annie.core.theme.PRIMARY = '#006d77'

App-wide primary/accent colour, applied via NiceGUI’s global colour call.

annie.core.theme.ACCENT = '#22c55e'

More vivid green, e.g. the “validated” check.

annie.core.theme.LOGO_MARK_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" style="width:100%;height:100%"><g...

The brand mark — a detection-box bracket enclosing a green validation check.

Matches docs/assets/logo.svg (mark only, no wordmark) and is used for the app header and the browser-tab favicon. The SVG scales to its container.

annie.core.theme.SUCCESS = '#2a9d8f'

Teal — linked / complete / usable.

annie.core.theme.WARNING = '#f77f00'

Amber — video only / watchable, annotation off.

annie.core.theme.DANGER = '#d90429'

Coral — annotation only / nothing to preview.

annie.core.theme.NEUTRAL = '#676D78'

Grey — totals, secondary text.

annie.core.theme.DECISION_ACCEPT = '#1b6b52'

Dark green — an accepted clip (button + row-border highlight).

annie.core.theme.DECISION_DROP = '#8b1e2d'

Dark red — a dropped clip (button + row-border highlight).

annie.core.theme.DECISION_UNDECIDED = '#676D78'

Grey — the “Undecided” reset button; a clip with no verdict carries no highlight.

annie.core.theme.DECISION_ACCEPT_TINT = '#e8f3ef'

Pale green fill behind an accepted clip — the lighter inside of its green border.

annie.core.theme.DECISION_DROP_TINT = '#f9eaec'

Pale red fill behind a dropped clip — the lighter inside of its red border.

annie.core.theme.ROW_BORDER = '1px solid #d5d9df'

The light border every Browse/Annotator row card carries, so its extent is visible.

annie.core.theme.EVENT_TRACK_PALETTE: tuple[str, ...] = ('#3a86ff', '#8338ec', '#fb5607', '#2a9d8f', '#e63946', '#606c38')

Per-lane fill colours for timeline event boxes, cycled by the lane’s order.

annie.core.theme.EVENT_PLAYHEAD = '#d90429'

Coral — the vertical playhead line marking the current time across all lanes.

annie.core.theme.EVENT_SELECTED = '#111827'

Near-black — the 2px outline of the currently selected event box.

annie.core.theme.EVENT_BORDER = '#444b54'

Dark grey — the 1px outline every event box carries, so a pale/pastel fill stays visible against the white lane (a yellow box on white would otherwise disappear).

annie.core.theme.EVENT_PENDING = '#f59e0b'

Amber — the translucent band drawn from an event’s start to the live playhead while the reviewer is mid-capture (start set, end not yet), and the armed “Set end” button.

annie.core.theme.event_track_color(ordinal: int) → str[source]

Return the timeline fill colour for a track at vertical position ordinal.

Parameters:

ordinal – The lane’s zero-based position from the top.

Returns:

A hex colour from EVENT_TRACK_PALETTE, cycled by ordinal.

annie.core.theme.VDET_COLOR = '#1d3557'

Navy blue — vdet-related metrics.

annie.core.theme.TRACK_COLOR = '#40916c'

Pastel green — track-related metrics.

annie.core.theme.AVAILABLE = '#2a9d8f'

Teal — the path exists and was read.

annie.core.theme.UNAVAILABLE = '#d90429'

Coral — the configured path is missing.

annie.core.theme.LABEL_COLOR = '#5a189a'

Violet — distinct from vdet/track/status chips.

annie.core.theme.VIDEO_TAG_COLOR = '#3a86ff'

Bright blue — has video frames.

annie.core.theme.AUDIO_TAG_COLOR = '#fb8500'

Orange — has an audio stream.

annie.core.theme.HEADER_FG = '#ffffff'

White header text/icons, readable on the dark primary header bar.

annie.core.theme.STATUS_COLORS: dict[annie.core.models.RowStatus, str]

Status → colour, the single source of truth for the tri-state UI treatment.

annie.core.theme.STATUS_LABELS: dict[annie.core.models.RowStatus, str]

Status → short human label shown on pills and summary cards.

annie.core.theme.STATUS_ICONS: dict[annie.core.models.RowStatus, str]

Status → Tabler icon name used on cards and pills.

annie.core.theme.ColorName

The semantic colour names accepted by color().

annie.core.theme.status_color(status: annie.core.models.RowStatus) → str[source]

Return the hex colour for a row status.

Parameters:

status – One of the RowStatus values.

Returns:

The hex colour string for that status.

annie.core.theme.color(name: ColorName) → str[source]

Resolve a semantic colour name to its hex value.

Parameters:

name – A semantic colour name (e.g. "success").

Returns:

The hex colour string.

Raises:

KeyError – If name is not a known semantic colour.