tickets
All repositories: gitoria
17.4 KB
// styles.hl — ALL of the app's CSS, served as /__hl/app.css. Components carry no Style// blocks: markup is domain tags (<ticket-board>, <ticket-state>, …), this file lays them out.//// TOKENS (ticket antcolony#3, mission 021): the WorldAPI palette + semantic tokens are declared in// `shared/tokens.hl` as hl:web css variables (`static colorText = var(light)`), hand-written, a// verbatim copy of loreana /media/STORAGE/projects/worldapi-tokens/tokens.hl (vendored like// plugins/; edit it THERE and cp it here). This file IMPORTS the tokens it uses and writes them as// members (`color = colorText`, `border = '1px solid ' + colorBorder`); hl:web names each token// after its member (--color-text), writes all of tokens.hl's tokens into the one :root and every// use as var(--color-text). The app sets only its accent (`colorAccent = var(…)` below, written// after the default, so it wins). hl:web does this itself since hybriel#39 (the mission-021 patch is gone).//// In a styles file a bare name is a TAG (camelCase → kebab: `ticketState` is// `ticket-state`), a quoted name is a selector written verbatim. MOBILE FIRST: every// rule is the phone's; the one min-width block adds the wide layout.import { var } from 'hl:web/css'import { purple, colorText, colorBackground, colorTextStrong, colorTextMuted, colorBackgroundSunken, colorAccentText, colorSurface, colorBorder, colorDanger, colorSuccess, colorAction, colorWarning } from '../shared/tokens.hl'colorAccent = var(purple) // the app's accent: the only token this app sets'*,*::before,*::after' { boxSizing = 'border-box' }html { colorScheme = 'dark' }body { margin = '0' font = '16px/1.5 system-ui, sans-serif' color = colorText background = colorBackground }a { color = colorAccent textDecoration = 'none' }'a:hover' { textDecoration = 'underline' }h1 { margin = '0' fontSize = '1.3rem' lineHeight = '1.3' color = colorTextStrong overflowWrap = 'anywhere' }h2 { margin = '0 0 .5rem' fontSize = '1rem' color = colorTextStrong }time { color = colorTextMuted fontSize = '.85rem' whiteSpace = 'nowrap' }'input,textarea,select' { font = 'inherit' width = '100%' padding = '.5rem .7rem' color = colorTextStrong background = colorBackgroundSunken border = '1px solid ' + colorBorder borderRadius = '.4rem' }'input:focus,textarea:focus,select:focus' { outline = '2px solid ' + colorAccent outlineOffset = '1px' }textarea { resize = 'vertical' minHeight = '4.5rem' }label { display = 'grid' gap = '.25rem' fontSize = '.9rem' color = colorTextMuted }button { font = 'inherit' fontWeight = '600' padding = '.55rem 1.1rem' color = colorAccentText background = colorAccent border = '0' borderRadius = '.4rem' cursor = 'pointer' justifySelf = 'start' }'button:hover' { filter = 'brightness(1.1)' }// ---- the shell ---------------------------------------------------------------------------applicationHeader { position = 'sticky' top = '0' zIndex = '5' display = 'flex' flexWrap = 'wrap' alignItems = 'center' gap = '.5rem 1rem' padding = '.6rem 1rem' background = colorBackgroundSunken borderBottom = '1px solid ' + colorBorder }'application-header .brand' { fontWeight = '800' fontSize = '1.15rem' color = colorAccent marginRight = 'auto' }'application-header nav' { display = 'flex' gap = '1rem' }'application-header nav a' { color = colorText }inboxBadge { display = 'inline-block' marginLeft = '.35rem' padding = '0 .45rem' borderRadius = '999px' fontSize = '.8rem' fontWeight = '700' color = colorAccentText background = colorAccent }main { maxWidth = '60rem' margin = '0 auto' padding = '1rem' }// offline (mission 046, components/main.hl): the note, and the invisible probe whose animation ticks every secondofflineNote { display = 'block' padding = '.5rem 1rem' color = colorTextStrong background = colorSurface borderBottom = '1px solid ' + colorBorder }netProbe { position = 'fixed' left = '0' top = '0' width = '1px' height = '1px' opacity = '0' pointerEvents = 'none' animation = 'tickets-net-tick 1s linear infinite' }'@keyframes tickets-net-tick' = {'from' = { opacity = '0' }to = { opacity = '0' }}// ---- the login, top right (ticket #7): ident's selector (its shadow DOM in ident's design,// restyled to tickets' accent through its custom properties), the login button, who you areuserBox { display = 'flex' flexWrap = 'wrap' alignItems = 'center' justifyContent = 'flex-end' gap = '.4rem .6rem' marginLeft = 'auto' maxWidth = '100%' }identSelector { '--ident-accent' = colorAccent '--ident-accent-text' = colorAccentText '--ident-background' = colorSurface '--ident-border' = colorBorder '--ident-font' = '600 .9rem/1.4 system-ui, sans-serif' }'ident-selector::part(button)' { padding = '.35rem .8rem' }'ident-selector::part(status)' { padding = '.35rem .8rem' }'#whoami' { fontWeight = '600' color = colorTextStrong overflowWrap = 'anywhere' }'a.button' { display = 'inline-block' fontWeight = '600' fontSize = '.9rem' padding = '.35rem .8rem' color = colorAccent border = '1px solid ' + colorAccent borderRadius = '.4rem' }'a.button:hover' { textDecoration = 'none' background = colorSurface }'button.quiet' { color = colorText background = 'transparent' border = '1px solid ' + colorBorder padding = '.35rem .8rem' fontSize = '.9rem' }'button.danger' { color = colorDanger borderColor = colorDanger }namePrompt { display = 'block' maxWidth = '60rem' margin = '1rem auto 0' padding = '0 1rem' }'#nameform' { display = 'grid' gap = '.5rem' padding = '.8rem' background = colorSurface border = '1px solid ' + colorAccent borderRadius = '.5rem' }'.banner' { maxWidth = '60rem' margin = '.8rem auto 0' padding = '0 1rem' }'.hint' { margin = '0' fontSize = '.9rem' color = colorTextMuted }'.muted' { margin = '0' fontSize = '.9rem' color = colorTextMuted }// ---- /you: the account and the API tokens ---------------------------------------------------youView { display = 'grid' gap = '1.2rem' }'you-view section' { display = 'grid' gap = '.6rem' padding = '.8rem' background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.5rem' }'you-view dl' { display = 'grid' gap = '.2rem' margin = '0' }'you-view dt' { fontSize = '.85rem' color = colorTextMuted }'you-view dd' { margin = '0 0 .4rem' color = colorTextStrong overflowWrap = 'anywhere' }'you-view code' { overflowWrap = 'anywhere' wordBreak = 'break-all' }'#tokenform' { display = 'grid' gap = '.5rem' }tokenShown { display = 'grid' gap = '.4rem' padding = '.7rem' border = '1px solid ' + colorSuccess borderRadius = '.4rem' }'token-shown p' { margin = '0' }'#newtoken' { color = colorSuccess fontSize = '.95rem' }'#tokenlist' { listStyle = 'none' margin = '0' padding = '0' display = 'grid' gap = '.4rem' }'#tokenlist li' { display = 'flex' flexWrap = 'wrap' alignItems = 'center' gap = '.3rem .8rem' padding = '.4rem .6rem' background = colorBackgroundSunken borderRadius = '.4rem' }'#tokenlist .label' { flex = '1 1 10rem' color = colorTextStrong overflowWrap = 'anywhere' }// ---- ticket lists (/, filters, /inbox) -----------------------------------------------------ticketBoard { display = 'grid' gap = '1rem' }ticketFilters { display = 'grid' gap = '.5rem' }'ticket-filters nav' { display = 'flex' flexWrap = 'wrap' gap = '.35rem' }'ticket-filters a' { padding = '.2rem .65rem' fontSize = '.85rem' color = colorText border = '1px solid ' + colorBorder borderRadius = '999px' }'ticket-filters a.selected' { color = colorAccentText background = colorAccent borderColor = colorAccent }'.tickets' { listStyle = 'none' margin = '0' padding = '0' display = 'grid' gap = '.5rem' }'.tickets li' { display = 'grid' gridTemplateColumns = 'minmax(0, 1fr)' gap = '.3rem' padding = '.7rem .8rem' background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.5rem' }'.tickets li ticket-state' { justifySelf = 'start' }'.tickets .subject' { color = colorTextStrong fontWeight = '600' overflowWrap = 'anywhere' }ticketRef { marginRight = '.4rem' color = colorTextMuted fontWeight = '400' }formerRef { marginLeft = '.2rem' fontSize = '.85rem' color = colorTextMuted }ticketMeta { display = 'flex' flexWrap = 'wrap' gap = '.2rem .8rem' fontSize = '.85rem' }'.empty' { margin = '0' padding = '1rem' textAlign = 'center' color = colorTextMuted border = '1px dashed ' + colorBorder borderRadius = '.5rem' }'.notice' { margin = '0' color = colorSuccess }// the new-ticket form, folded away until asked fordetails { background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.5rem' }summary { padding = '.6rem .8rem' cursor = 'pointer' fontWeight = '600' color = colorAccent }'details form' { display = 'grid' gap = '.7rem' padding = '0 .8rem .8rem' }// ---- the state badge: one colour per state -------------------------------------------------ticketState { display = 'inline-block' padding = '.05rem .55rem' fontSize = '.8rem' fontWeight = '600' whiteSpace = 'nowrap' borderRadius = '999px' border = '1px solid currentColor' color = colorTextMuted }'ticket-state.open' { color = colorAction }'ticket-state.progress' { color = colorWarning }'ticket-state.pending' { color = colorTextMuted }'ticket-state.review' { color = colorAccent }'ticket-state.reopened' { color = colorDanger }'ticket-state.done' { color = colorSuccess }'ticket-state.canceled' { color = colorTextMuted }'ticket-filters a.selected.open,ticket-filters a.selected.progress,ticket-filters a.selected.pending,ticket-filters a.selected.review,ticket-filters a.selected.reopened,ticket-filters a.selected.done,ticket-filters a.selected.canceled' { color = colorAccentText }// ---- ticket #20: projects, members, assignee, the inbox ------------------------------------------projectActions { display = 'flex' flexWrap = 'wrap' gap = '.5rem' }// ticket #21: the apps connected to a project, and the connect page'.connections' { listStyle = 'none' margin = '0' padding = '0' display = 'grid' gap = '.4rem' }'.connections li' { display = 'flex' flexWrap = 'wrap' alignItems = 'center' gap = '.2rem .6rem' padding = '.4rem .8rem' background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.5rem' fontSize = '.9rem' }connectPage { display = 'grid' gap = '1rem' maxWidth = '38rem' }'connect-page form' { display = 'grid' gap = '.8rem' }projectDescription { display = 'block' padding = '.8rem' overflowWrap = 'anywhere' background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.5rem' }assignee { color = colorTextMuted }'assignee::before' { content = '"→ "' }'ticket-view .people' { margin = '0' color = colorTextMuted fontSize = '.9rem' }'ticket-view .people strong' { color = colorText }'project-form,project-settings' { display = 'grid' gridTemplateColumns = 'minmax(0, 1fr)' gap = '1rem' }'project-form form,project-settings form,project-settings section' { display = 'grid' gap = '.6rem' }'project-settings h1,project-settings h2' { margin = '0' }'project-settings h2' { fontSize = '1.1rem' }'#members' { listStyle = 'none' margin = '0' padding = '0' display = 'grid' gap = '.4rem' }'#members li' { display = 'flex' flexWrap = 'wrap' alignItems = 'center' gap = '.4rem .8rem' padding = '.4rem .6rem' background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.4rem' }'#members strong' { flex = '1 1 8rem' }inviteShown { display = 'block' padding = '.7rem .8rem' overflowWrap = 'anywhere' background = colorSurface border = '1px solid ' + colorAccent borderRadius = '.5rem' }'invite-shown p' { margin = '0 0 .4rem' }'#projectlist' { listStyle = 'none' margin = '0' padding = '0' display = 'grid' gap = '.3rem' }'.role' { color = colorTextMuted fontSize = '.85rem' }'#reviewbox,#pendingbox' { display = 'grid' gap = '.5rem' }'#reviewbox h2,#pendingbox h2' { margin = '0' fontSize = '1.1rem' }// ---- one ticket ----------------------------------------------------------------------------ticketView { display = 'grid' gridTemplateColumns = 'minmax(0, 1fr)' gap = '1.2rem' }'ticket-view header' { display = 'grid' gap = '.4rem' }'ticket-view header p' { margin = '0' }'ticket-view header ticket-state' { justifySelf = 'start' }'ticket-view .dates' { color = colorTextMuted fontSize = '.85rem' }ticketSummary { display = 'block' padding = '.8rem' overflowWrap = 'anywhere' background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.5rem' }'ticket-view section' { display = 'grid' gap = '.7rem' }'#events' { listStyle = 'none' margin = '0' padding = '0' display = 'grid' gap = '.5rem' borderLeft = '2px solid ' + colorBorder }'#events > li' { marginLeft = '.8rem' padding = '.5rem .7rem' background = colorSurface borderRadius = '.4rem' }'#events > li.state' { background = 'transparent' padding = '.2rem .7rem' }eventHead { display = 'block' fontSize = '.9rem' }'event-head strong' { color = colorTextStrong }eventText { display = 'block' marginTop = '.3rem' overflowWrap = 'anywhere' }'ticket-view form' { display = 'grid' gap = '.5rem' }// ---- ticket #8: the author's edit form; an edit in the history keeps what was before -------'#editform' { padding = '.8rem' background = colorSurface border = '1px solid ' + colorAccent borderRadius = '.5rem' }formButtons { display = 'flex' flexWrap = 'wrap' gap = '.5rem' }'event-text.edit' { fontSize = '.9rem' color = colorTextMuted }'event-text.edit p' { margin = '0' }'event-text.edit s' { color = colorText }'event-text.edit details' { marginTop = '.3rem' background = colorBackgroundSunken }'event-text.edit summary' { padding = '.3rem .6rem' fontWeight = '400' fontSize = '.85rem' }'event-text.edit markdown-text' { padding = '0 .6rem .5rem' color = colorText }// ---- ticket #6: Markdown in text fields (components/markdown.hl). Line breaks inside a// paragraph stay visible (the page showed the texts with pre-wrap before) ----------------------markdownText { display = 'block' }'markdown-text > :first-child' { marginTop = '0' }'markdown-text > :last-child' { marginBottom = '0' }'markdown-text p,markdown-text li' { whiteSpace = 'pre-wrap' }'markdown-text p' { margin = '.5rem 0' }'markdown-text h3,markdown-text h4,markdown-text h5' { margin = '.9rem 0 .4rem' lineHeight = '1.3' color = colorTextStrong }'markdown-text h3' { fontSize = '1.15rem' }'markdown-text h4' { fontSize = '1.02rem' }'markdown-text h5' { fontSize = '.95rem' }'markdown-text ul,markdown-text ol' { margin = '.5rem 0' paddingLeft = '1.4rem' }'markdown-text li + li' { marginTop = '.15rem' }// inside the history (itself an <ol>) a list would get the nested markers (circles)'markdown-text ul' { listStyleType = 'disc' }'markdown-text ol' { listStyleType = 'decimal' }'markdown-text strong' { color = colorTextStrong }'markdown-text a' { textDecoration = 'underline' textUnderlineOffset = '.15em' overflowWrap = 'anywhere' }'markdown-text code' { font = '.88em/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace' padding = '.05em .3em' color = colorTextStrong background = colorBackgroundSunken borderRadius = '.25rem' }'markdown-text pre' { margin = '.5rem 0' padding = '.6rem .7rem' overflowX = 'auto' background = colorBackgroundSunken border = '1px solid ' + colorBorder borderRadius = '.4rem' }'markdown-text pre code' { padding = '0' background = 'transparent' whiteSpace = 'pre' }'.message' { margin = '0' minHeight = '1.5em' color = colorDanger }// ---- ticket #12 (mission 024): <md-editor> (shared/md-editor.js, shadow DOM) takes the app's// tokens through its --md-* custom properties; headings look like the rendered ones (h3/h4/h5 above)mdEditor { '--md-background' = colorBackgroundSunken '--md-text' = colorText '--md-text-strong' = colorTextStrong '--md-text-muted' = colorTextMuted '--md-border' = colorBorder '--md-accent' = colorAccent '--md-accent-text' = colorAccentText '--md-link' = colorAccent '--md-code-background' = colorSurface '--md-toolbar-background' = colorSurface '--md-danger' = colorDanger '--md-h1-size' = '1.15rem' '--md-h2-size' = '1.02rem' '--md-h3-size' = '.95rem' '--md-min-height' = '2.6rem' color = colorText }// ---- ticket #4: relations (parent, children, blocked by, blocks) ---------------------------ticketRelations { display = 'grid' gap = '.8rem' padding = '.8rem' background = colorSurface border = '1px solid ' + colorBorder borderRadius = '.5rem' }'ticket-relations h2' { margin = '0 0 .4rem' fontSize = '1rem' }'ticket-relations p' { margin = '0' }'#parent a,.refs a' { fontWeight = '600' whiteSpace = 'nowrap' }'.refsubject' { color = colorTextStrong overflowWrap = 'anywhere' }'#childnote' { margin = '0 0 .4rem' fontSize = '.9rem' color = colorTextMuted }'#childnote.done' { fontWeight = '600' color = colorSuccess }'.refs' { listStyle = 'none' margin = '0' padding = '0' display = 'grid' gap = '.35rem' }'.refs li' { display = 'flex' flexWrap = 'wrap' alignItems = 'baseline' gap = '.2rem .6rem' }'.refs .unblock' { padding = '.1rem .6rem' fontSize = '.8rem' marginLeft = 'auto' }'#events > li.link' { background = 'transparent' padding = '.2rem .7rem' }'@media (min-width: 45rem)' = {main = { padding = '1.5rem 1rem' }h1 = { fontSize = '1.6rem' }'.tickets li' = { gridTemplateColumns = '8.5rem minmax(0, 1fr) auto' alignItems = 'baseline' gap = '1rem' }'#stateform' = { gridTemplateColumns = '14rem minmax(0, 1fr) auto' alignItems = 'end' }'#parentform,#blockerform' = { gridTemplateColumns = 'minmax(0, 1fr) auto' alignItems = 'end' }'details form' = { maxWidth = '40rem' }userBox = { marginLeft = '0' }}
Branches
- mainmain branch
Latest commits
- 97e269b5mission 010 (code order) 1/4: .hl files out of the root — lib/ (store, users, connections, invites, migrate, markdown, mdview, import = ticketfile, util = localtime, jsoncheck, api-helpers = api), tools/import.hl, components/styles.hl; import paths only. gate 249/0, connect 60/0, real-data reads identicalmre
- 38f9d10ftickets: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, mpackdb 2cb7ae5e, http1 773de63e); gate 249/0, connect 60/0mre
- d3db6139tickets: Hybriel master 190aa11d (fc838894 GC correctness, #126 closure scopes, #127); gate 249/0, connect 60/0mre
- bce182e3tickets: Hybriel master 7eea0d32 (#126 memory, #48 lambda copies its argument); migrate.hl lambdas take &logmre
- 4137be0fantcolony#40: mission references point to the moved missionsmre
- 9bfba36aantcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
- c7bd2645tickets: Hybriel master 73267707 (#122 fixed); compactNow workaround removed (#110 covered)mre
- 2ab91ee9tickets: gate checks rows appear once (session sync); re-vendor to ff51cf46 stopped on hybriel#122, stays 837fe120mre
- e01c2b1dtickets#24: installable app (manifest, service worker, offline list), own icon; gate waits for the hello's pongmre
- 752fbb7fdeploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
- 38bdd5e4deploy.sh: never send .git or .gitignore to Byrodinmre
- f12fa1bcState of 2026-09-27, before the move to gitoriamre