2026-10-15 23:08:47 -06:00
/*
PESCO dark theme. Ported from the old build's src/app.src.html (PacketStation repo).
Values are copied as they were so trained users see the same look.
Each block notes the old selectors it came from.
Fonts: the old page loaded Barlow Condensed, IBM Plex Sans and IBM Plex Mono from Google Fonts.
Here the same families are self-hosted from the @fontsource npm packages (see src/theme/fonts.ts).
The fallback stacks are the old ones, so the page still reads right if a font file fails.
*/
/* From :root. */
: root {
--bg : #0d161b ;
--panel : #1a252b ;
--panel2 : #162931 ;
--line : #26363e ;
--line2 : #33474f ;
--cyan : #49c0de ;
--pink : #e5589f ;
--amber : #e7b33c ;
--green : #5fc98a ;
--red : #ef6b6b ;
--white : #ffffff ;
--near : #eff5f8 ;
--body : #a9bac3 ;
--muted : #77878f ;
--warnbg : #221b28 ;
/* Shades the old page wrote inline. Named here so components never hard-code them. */
--on-cyan : #06222b ;
--on-pink : #2a0717 ;
--on-green : #06210f ;
--field : #0f1b20 ;
--col : #111d23 ;
--sel : #123643 ;
--sheet : #13222a ;
--top-from : #0f2129 ;
--scrim : rgba ( 3 , 8 , 10 , 0.66 );
--f-disp : "Barlow Condensed" , "Arial Narrow" , Arial , sans-serif ;
--f-body : "IBM Plex Sans" , Helvetica , Arial , sans-serif ;
--f-mono : "IBM Plex Mono" , ui-monospace , Consolas , monospace ;
--toph : 64 px ;
color-scheme : dark ;
}
/* From *, [hidden], html, body, form controls, :focus-visible, reduced motion, .wrap. */
*, * :: before , * :: after { box-sizing : border-box ; }
[ hidden ] { display : none !important ; }
html , body { background : var ( -- bg ); }
body { color : var ( -- body ); font-family : var ( -- f - body ); font-size : 15 px ; line-height : 1.45 ; margin : 0 ; }
button , input , select , textarea { font : inherit ; color : inherit ; }
: focus-visible { outline : 2 px solid var ( -- cyan ); outline-offset : 2 px ; }
@ media ( prefers-reduced-motion : reduce ) { * { transition : none !important ; animation : none !important ; } }
. wrap { padding-inline : 16 px ; padding-block : 14 px 48 px ; max-width : 1500 px ; margin : 0 auto ; }
/* Top bar. From .top, .top-in, .brand, .brand img, .brand .nm, .roles, .top .sp, .who, .proto. */
. top { position : sticky ; top : env ( safe - area - inset - top , 0 px ); z-index : 30 ; background : linear-gradient ( 180 deg , var ( -- top - from ), var ( -- bg )); border-bottom : 1 px solid var ( -- line ); padding-inline : 16 px ; padding-block : 10 px ; }
. top-in { display : flex ; align-items : center ; gap : 14 px ; flex-wrap : wrap ; max-width : 1500 px ; margin : 0 auto ; }
. brand { display : flex ; align-items : center ; gap : 12 px ; min-width : 0 ; color : inherit ; text-decoration : none ; }
. brand img { height : 34 px ; width : auto ; }
. brand . nm { font-family : var ( -- f - disp ); font-weight : 600 ; font-size : 22 px ; letter-spacing : .06 em ; color : var ( -- near ); text-transform : uppercase ; white-space : nowrap ; }
. brand . nm span { color : var ( -- cyan ); }
. roles { display : flex ; gap : 4 px ; background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 10 px ; padding : 4 px ; flex-wrap : wrap ; }
. roles button { border : 0 ; background : transparent ; padding : 8 px 14 px ; border-radius : 7 px ; font-weight : 600 ; font-size : 14 px ; color : var ( -- body ); cursor : pointer ; min-height : 40 px ; }
. roles button [ aria-pressed = "true" ] { background : var ( -- cyan ); color : var ( -- on - cyan ); }
. top . sp { flex : 1 ; }
. who { font-size : 13 px ; color : var ( -- muted ); display : flex ; align-items : center ; gap : 8 px ; }
. who select { background : var ( -- panel ); border : 1 px solid var ( -- line2 ); border-radius : 8 px ; padding : 8 px 10 px ; color : var ( -- near ); font-weight : 600 ; min-height : 40 px ; }
. proto { font-family : var ( -- f - mono ); font-size : 11 px ; letter-spacing : .08 em ; color : var ( -- amber ); border : 1 px solid #5a4720 ; border-radius : 6 px ; padding : 3 px 7 px ; text-transform : uppercase ; }
/* Type. From .eyebrow, h1, h2, h3, .mono, .muted, .small, .sr, .lnk. */
. eyebrow { font-family : var ( -- f - mono ); font-size : 11.5 px ; font-weight : 600 ; letter-spacing : .14 em ; text-transform : uppercase ; color : var ( -- cyan ); }
h1 , h2 , h3 { color : var ( -- near ); margin : 0 ; text-wrap : balance ; }
h1 { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 34 px ; letter-spacing : .02 em ; line-height : 1.05 ; }
h2 { font-family : var ( -- f - disp ); font-weight : 600 ; font-size : 22 px ; letter-spacing : .04 em ; text-transform : uppercase ; }
h3 { font-size : 15 px ; font-weight : 600 ; }
. mono { font-family : var ( -- f - mono ); font-variant-numeric : tabular-nums ; }
. muted { color : var ( -- muted ); }
. small { font-size : 13 px ; }
. sr { position : absolute ; width : 1 px ; height : 1 px ; overflow : hidden ; clip : rect ( 0 0 0 0 ); white-space : nowrap ; }
. lnk { all : unset ; cursor : pointer ; color : var ( -- cyan ); text-decoration : underline ; text-underline-offset : 3 px ; font-weight : 600 ; }
. lnk : focus-visible { outline : 2 px solid var ( -- cyan ); outline-offset : 2 px ; }
/* KPI tiles. From .kpis, .kpi, button.kpi, .kpi.on, .kpi .n, .kpi .l, .kpi.hot, .kpi.zero, .phead, .pacts. */
. kpis { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 170 px , 1 fr )); gap : 12 px ; margin-block : 12 px 20 px ; }
. kpi { background : var ( -- panel ); border : 1 px solid var ( -- line ); border-top : 3 px solid var ( -- cyan ); border-radius : 10 px ; padding : 10 px 16 px 12 px ; text-align : left ; color : inherit ; font : inherit ; display : block ; width : 100 % ; }
button . kpi { cursor : pointer ; position : relative ; transition : border-color .15 s , background .15 s ; }
button . kpi : hover { border-color : var ( -- cyan ); border-top-color : var ( -- cyan ); }
button . kpi :: after { content : "Tap to show these \2193" ; position : absolute ; top : 10 px ; right : 12 px ; font-size : 11 px ; color : var ( -- muted ); opacity : 0 ; transition : opacity .15 s ; }
button . kpi : hover :: after , button . kpi : focus-visible :: after { opacity : 1 ; }
. kpi . on { background : var ( -- sel ); border-color : var ( -- cyan ); }
. kpi . on :: after { content : "Showing only these, tap to clear" ; opacity : 1 ; color : var ( -- cyan ); }
. kpi . n { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 44 px ; line-height : 1 ; color : var ( -- white ); font-variant-numeric : tabular-nums ; }
. kpi . n small { font-size : 20 px ; color : var ( -- muted ); font-weight : 600 ; }
. kpi . l { font-size : 12.5 px ; font-weight : 700 ; letter-spacing : .06 em ; text-transform : uppercase ; color : var ( -- cyan ); margin-top : 6 px ; }
. kpi . hot { border-top-color : var ( -- pink ); }
. kpi . hot . l { color : var ( -- pink ); }
. kpi . zero { border-top-color : var ( -- line2 ); }
. kpi . zero . n , . kpi . zero . l { color : var ( -- muted ); }
. phead { display : flex ; align-items : flex-end ; justify-content : space-between ; gap : 12 px 20 px ; flex-wrap : wrap ; margin-top : 4 px ; }
. pacts { display : flex ; gap : 8 px ; flex-wrap : wrap ; }
/* Sections, boards, cards, bars. From .sec, .sec-h, .board, .col, .col-h, .empty, .card, .bar, .panel. */
. sec { margin-block : 8 px 26 px ; }
. sec-h { display : flex ; align-items : baseline ; gap : 12 px ; margin-bottom : 10 px ; flex-wrap : wrap ; }
. sec-h . ct { font-family : var ( -- f - mono ); font-size : 13 px ; color : var ( -- muted ); }
. board { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 240 px , 1 fr )); gap : 14 px ; }
. col { background : var ( -- col ); border : 1 px solid var ( -- line ); border-radius : 12 px ; padding : 12 px ; min-width : 0 ; display : flex ; flex-direction : column ; gap : 10 px ; }
2026-10-17 15:39:29 -06:00
/* New: each column is a frame about three cards tall (--col-max) that scrolls on its own, so a long column never pushes the next one out of view. The heading stays put inside the frame. Narrow screens keep the plain flow (one column per row). */
. col { max-height : min ( var ( -- col - max , 700 px ), calc ( 100 vh - var ( -- toph , 64 px ) - 40 px )); overflow-y : auto ; overscroll-behavior : contain ; scrollbar-width : thin ; }
2026-10-15 23:08:47 -06:00
. col-h { display : flex ; justify-content : space-between ; align-items : center ; font-family : var ( -- f - disp ); font-size : 17 px ; font-weight : 600 ; letter-spacing : .06 em ; text-transform : uppercase ; color : var ( -- near ); }
2026-10-17 15:25:47 -06:00
. col > . col-h { position : sticky ; top : -12 px ; z-index : 1 ; background : var ( -- col ); margin : -12 px -12 px 0 ; padding : 12 px 12 px 6 px ; border-bottom : 1 px solid var ( -- line ); }
2026-10-15 23:08:47 -06:00
. col-h . c { font-family : var ( -- f - mono ); font-size : 13 px ; color : var ( -- muted ); }
. empty { border : 1 px dashed var ( -- line2 ); border-radius : 10 px ; padding : 16 px ; color : var ( -- muted ); font-size : 13.5 px ; text-align : center ; }
. empty . slim { padding : 12 px 14 px ; }
. card { background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 10 px ; padding : 12 px 14 px ; display : flex ; flex-direction : column ; gap : 6 px ; text-align : left ; width : 100 % ; color : inherit ; font : inherit ; transition : border-color .15 s ; }
button . card , a . card { cursor : pointer ; text-decoration : none ; }
button . card : hover , a . card : hover { border-color : var ( -- cyan ); }
. card . r1 { display : flex ; justify-content : space-between ; gap : 6 px 8 px ; align-items : center ; flex-wrap : wrap ; }
. card . r1 . pill { margin-left : auto ; max-width : 100 % ; overflow : hidden ; text-overflow : ellipsis ; }
. card . job { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 20 px ; color : var ( -- white ); letter-spacing : .03 em ; }
. card . tt { color : var ( -- near ); font-weight : 500 ; }
. card . meta { display : flex ; gap : 6 px 14 px ; flex-wrap : wrap ; font-size : 12.5 px ; color : var ( -- muted ); }
. card . meta b { color : var ( -- body ); font-weight : 600 ; }
. bar { height : 6 px ; border-radius : 3 px ; background : var ( -- bg ); overflow : hidden ; }
. bar i { display : block ; height : 100 % ; background : var ( -- cyan ); }
. bar i . over { background : var ( -- pink ); }
. panel { background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 10 px ; padding : 12 px 14 px ; }
. panel h3 { margin-bottom : 8 px ; }
/* Pills and status colours. From .pill, .pill::before, .st-*. */
. pill { display : inline-flex ; align-items : center ; gap : 6 px ; font-size : 11.5 px ; font-weight : 700 ; letter-spacing : .07 em ; text-transform : uppercase ; border-radius : 999 px ; padding : 3 px 10 px ; white-space : nowrap ; border : 1 px solid currentColor ; }
. pill :: before { content : "" ; width : 7 px ; height : 7 px ; border-radius : 50 % ; background : currentColor ; }
. st-draft { color : #9fb1ba ; }
. st-warehouse { color : var ( -- amber ); }
. st-ready { color : var ( -- cyan ); }
. st-assigned { color : #8fa6ff ; }
. st-in_progress { color : var ( -- green ); }
. st-review { color : var ( -- pink ); }
. st-qc { color : #b99cff ; }
. st-complete { color : #c6d4da ; }
. st-filed { color : var ( -- muted ); }
/* New in the rebuild. Health and error states for the shell. */
. st-ok { color : var ( -- green ); }
. st-bad { color : var ( -- red ); }
. st-wait { color : var ( -- muted ); }
/* Buttons and fields. From .btn and its variants, label.f, input.in, select.in, textarea.in, .in.big, .frow, .ckl. */
. btn { display : inline-flex ; align-items : center ; justify-content : center ; gap : 8 px ; border-radius : 9 px ; padding : 10 px 18 px ; font-weight : 700 ; font-size : 15 px ; border : 1 px solid var ( -- line2 ); background : var ( -- panel ); color : var ( -- near ); cursor : pointer ; min-height : 46 px ; letter-spacing : .02 em ; text-decoration : none ; }
. btn : hover { border-color : var ( -- cyan ); }
. btn . pri { background : var ( -- cyan ); border-color : var ( -- cyan ); color : var ( -- on - cyan ); }
. btn . pink { background : var ( -- pink ); border-color : var ( -- pink ); color : var ( -- on - pink ); }
. btn . ghost { background : transparent ; }
. btn . sm { min-height : 36 px ; padding : 6 px 12 px ; font-size : 13.5 px ; }
. btn . dim { opacity : .6 ; }
. btn . rejb { border-color : var ( -- red ); color : var ( -- red ); background : transparent ; }
. btn . voidbtn { border-color : var ( -- pink ); color : var ( -- pink ); }
. btn : disabled { opacity : .45 ; cursor : not-allowed ; }
. btn svg { vertical-align : -4 px ; }
label . f { display : flex ; flex-direction : column ; gap : 4 px ; font-size : 12 px ; font-weight : 700 ; letter-spacing : .06 em ; text-transform : uppercase ; color : var ( -- muted ); min-width : 0 ; }
input . in , select . in , textarea . in { background : var ( -- field ); border : 1 px solid var ( -- line2 ); border-radius : 8 px ; padding : 10 px 12 px ; color : var ( -- near ); font-size : 15 px ; min-height : 44 px ; width : 100 % ; text-transform : none ; letter-spacing : 0 ; font-weight : 500 ; }
input . in : focus , select . in : focus , textarea . in : focus { border-color : var ( -- cyan ); outline : none ; }
input . in : disabled , select . in : disabled , textarea . in : disabled { opacity : .55 ; cursor : not-allowed ; }
textarea . in { min-height : 80 px ; resize : vertical ; }
. in . big { font-size : 22 px ; min-height : 56 px ; font-family : var ( -- f - mono ); letter-spacing : .08 em ; }
. frow { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 180 px , 1 fr )); gap : 12 px ; }
. ckl { display : flex ; gap : 10 px ; align-items : center ; font-weight : 600 ; color : var ( -- near ); min-height : 46 px ; cursor : pointer ; }
. ckl input { width : 24 px ; height : 24 px ; accent-color : var ( -- green ); }
/* Chips and segmented control. From .chips, .chip, .seg, .uchip, .rchip. */
. chips { display : flex ; gap : 8 px ; flex-wrap : wrap ; }
. chip { display : inline-flex ; gap : 8 px ; align-items : center ; border : 1 px solid var ( -- line2 ); border-radius : 999 px ; padding : 8 px 14 px ; cursor : pointer ; color : var ( -- near ); background : var ( -- panel ); font-size : 14 px ; min-height : 42 px ; }
. chip [ aria-pressed = "true" ] { border-color : var ( -- cyan ); background : var ( -- sel ); }
. seg { display : inline-flex ; border : 1 px solid var ( -- line2 ); border-radius : 10 px ; overflow : hidden ; }
. seg button { background : var ( -- panel ); color : var ( -- near ); border : 0 ; padding : 8 px 14 px ; min-height : 44 px ; cursor : pointer ; font-size : 13.5 px ; }
. seg button + button { border-left : 1 px solid var ( -- line2 ); }
. seg button [ aria-pressed = "true" ], . seg button [ aria-selected = "true" ] { background : var ( -- sel ); color : var ( -- cyan ); font-weight : 700 ; }
. uchip { display : inline-flex ; gap : 8 px ; align-items : center ; background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 999 px ; padding : 6 px 12 px ; color : var ( -- near ); font-size : 13 px ; }
. uchip . mono { color : var ( -- muted ); }
. rchip { display : inline-block ; line-height : 1.5 ; font-size : 11.5 px ; font-weight : 700 ; letter-spacing : .04 em ; border-radius : 6 px ; padding : 2 px 8 px ; background : #14262e ; color : var ( -- cyan ); border : 1 px solid #23414c ; }
. rchip . supervisor { color : var ( -- pink ); border-color : #5a2a44 ; background : #22131b ; }
. rchip . lead { color : var ( -- green ); border-color : #24503a ; background : #10221a ; }
. rchip . admin { color : var ( -- amber ); border-color : #5a4720 ; background : #211c10 ; }
/* Callouts and notices. From .callout, .callout.warn, .callout b, .viewonly, .back. */
. callout { border-left : 3 px solid var ( -- cyan ); background : var ( -- panel ); border-radius : 0 10 px 10 px 0 ; padding : 10 px 14 px ; font-size : 14 px ; margin-block : 10 px ; }
. callout . warn { border-left-color : var ( -- pink ); background : var ( -- warnbg ); }
. callout b { color : var ( -- white ); }
. viewonly { display : flex ; gap : 10 px ; align-items : flex-start ; border : 1 px dashed var ( -- line2 ); border-radius : 10 px ; padding : 10 px 14 px ; margin : 8 px 0 ; font-size : 14 px ; color : var ( -- body ); background : rgba ( 255 , 255 , 255 , .02 ); }
. viewonly b { color : var ( -- near ); }
. back { all : unset ; cursor : pointer ; color : var ( -- cyan ); font-weight : 600 ; font-size : 14 px ; display : inline-flex ; gap : 6 px ; align-items : center ; padding-block : 6 px ; }
/* Tabs. From .tabs, .tabs button, .tabs .cnt, .pmtabs (static variant). */
. tabs { display : flex ; gap : 2 px ; border-bottom : 1 px solid var ( -- line ); overflow-x : auto ; margin-bottom : 14 px ; position : sticky ; top : var ( -- toph ); z-index : 15 ; background : var ( -- bg ); }
. tabs button { border : 0 ; background : transparent ; color : var ( -- muted ); font-weight : 600 ; font-size : 15 px ; padding : 12 px 16 px ; border-bottom : 3 px solid transparent ; cursor : pointer ; white-space : nowrap ; min-height : 48 px ; }
. tabs button [ aria-selected = "true" ] { color : var ( -- near ); border-bottom-color : var ( -- cyan ); }
. tabs . cnt { font-family : var ( -- f - mono ); font-size : 12 px ; color : var ( -- cyan ); margin-left : 6 px ; }
. tabs . static { position : static ; }
/* Tables. From .tw, table, th, td, td.num, td .sub. Wrap a table in .tw for sideways scroll. */
. tw { overflow-x : auto ; border : 1 px solid var ( -- line ); border-radius : 10 px ; }
table { border-collapse : collapse ; width : 100 % ; font-size : 14 px ; }
th { background : var ( -- panel2 ); text-align : left ; font-size : 11.5 px ; letter-spacing : .08 em ; text-transform : uppercase ; color : var ( -- muted ); font-weight : 700 ; padding : 9 px 10 px ; white-space : nowrap ; }
td { border-top : 1 px solid var ( -- line ); padding : 9 px 10 px ; vertical-align : middle ; color : var ( -- near ); }
td . num , th . num { text-align : right ; font-family : var ( -- f - mono ); font-variant-numeric : tabular-nums ; }
td . sub { color : var ( -- muted ); font-size : 12.5 px ; }
/* Sheet, modal and toast. From .scrim, .sheet, .toast. */
. scrim { position : fixed ; inset : 0 ; background : var ( -- scrim ); z-index : 50 ; display : flex ; align-items : center ; justify-content : center ; padding : 16 px ; overscroll-behavior : contain ; }
. sheet { background : var ( -- sheet ); border : 1 px solid var ( -- line2 ); border-radius : 16 px ; width : min ( 760 px , 100 % ); max-height : calc ( 100 vh - 32 px ); max-height : calc ( 100 dvh - 32 px ); overflow : auto ; padding : 18 px ; display : flex ; flex-direction : column ; gap : 14 px ; box-shadow : 0 18 px 60 px rgba ( 0 , 0 , 0 , .55 ); margin : auto ; }
. sheet-acts { display : flex ; gap : 10 px ; justify-content : flex-end ; flex-wrap : wrap ; }
. toast { position : fixed ; left : 50 % ; bottom : calc ( 20 px + env ( safe - area - inset - bottom , 0 px )); transform : translateX ( -50 % ); background : var ( -- near ); color : var ( -- bg ); font-weight : 600 ; padding : 10 px 18 px ; border-radius : 10 px ; z-index : 60 ; box-shadow : 0 6 px 20 px rgba ( 0 , 0 , 0 , .4 ); max-width : calc ( 100 % - 32 px ); }
/* Sign-in card and PIN keypad. From .auth, .auth-card, .auth-form, .keypad. */
. auth { display : grid ; place-items : center ; padding-block : 5 vh 40 px ; }
. auth-card { width : min ( 440 px , 100 % ); background : var ( -- panel ); border : 1 px solid var ( -- line ); border-top : 3 px solid var ( -- cyan ); border-radius : 14 px ; padding : 24 px ; display : flex ; flex-direction : column ; gap : 14 px ; }
. auth-form { display : flex ; flex-direction : column ; gap : 12 px ; }
. keypad { display : grid ; grid-template-columns : repeat ( 3 , 1 fr ); gap : 8 px ; }
. keypad button { min-height : 60 px ; border-radius : 10 px ; border : 1 px solid var ( -- line2 ); background : var ( -- field ); color : var ( -- near ); font-family : var ( -- f - mono ); font-size : 22 px ; font-weight : 600 ; cursor : pointer ; }
. keypad button : active { background : var ( -- sel ); }
. keypad button : disabled { opacity : .45 ; cursor : not-allowed ; }
/* Lock screen placeholder. From body.blur-hidden #main and #guard .scrim. The guard sits above every sheet. */
. blur-hidden . wrap { filter : blur ( 18 px ); }
. scrim . lock { z-index : 90 ; }
. lock . auth-card { border-top-color : var ( -- amber ); }
/* Motion, opt-in through a .motion class on body. From .motion .scrim, .motion .sheet, .motion .toast and their keyframes. */
@ keyframes mfade { from { opacity : 0 ; } to { opacity : 1 ; } }
@ keyframes msheet { from { opacity : 0 ; transform : translateY ( 18 px ) scale ( .985 ); } to { opacity : 1 ; transform : none ; } }
@ keyframes mtoast { from { opacity : 0 ; transform : translate ( -50 % , 14 px ); } to { opacity : 1 ; transform : translate ( -50 % , 0 ); } }
. motion . scrim { animation : mfade .16 s ease-out ; }
. motion . sheet { animation : msheet .24 s cubic-bezier ( .2 , .7 , .2 , 1 ); }
. motion . toast { animation : mtoast .22 s cubic-bezier ( .2 , .7 , .2 , 1 ); }
/* Narrow screens. From the old @media (max-width:700px) and (max-width:640px) blocks. */
@ media ( max-width : 700px ) {
2026-10-17 15:25:47 -06:00
. col { max-height : none ; overflow-y : visible ; }
. col > . col-h { position : static ; margin : 0 ; padding : 0 ; border-bottom : 0 ; }
2026-10-15 23:08:47 -06:00
. tw table { min-width : 620 px ; }
. tabs { top : 0 ; position : static ; }
}
@ media ( max-width : 640px ) {
h1 { font-size : 28 px ; }
. kpi . n { font-size : 38 px ; }
. brand . nm { font-size : 18 px ; }
. phead h1 { font-size : 26 px ; }
}
2026-10-16 07:40:29 -06:00
/* ===== New in the rebuild (phase 1) ===== */
/* Sign-in, lock screen, Account and Admin. Built only from the tokens above. */
. callout . flush { margin : 0 ; }
. btn . wide { width : 100 % ; min-height : 56 px ; font-size : 17 px ; }
. center { align-self : center ; text-align : center ; }
. grow { flex : 1 ; }
. end { display : flex ; align-items : flex-end ; }
. nowrap { white-space : nowrap ; }
. stack { display : flex ; flex-direction : column ; gap : 12 px ; }
. uname { color : var ( -- near ); font-weight : 600 ; font-size : 14 px ; }
. chips . plain { list-style : none ; margin : 0 ; padding : 0 ; }
. chips . tight { gap : 4 px ; }
. chip . static { cursor : default ; min-height : 0 ; padding : 4 px 10 px ; font-size : 12.5 px ; }
. kv { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 220 px , 1 fr )); gap : 10 px 20 px ; margin : 0 0 10 px ; }
. kv dt { font-size : 11.5 px ; font-weight : 700 ; letter-spacing : .06 em ; text-transform : uppercase ; color : var ( -- muted ); }
. kv dd { margin : 2 px 0 0 ; color : var ( -- near ); overflow-wrap : anywhere ; }
td . clip { max-width : 280 px ; overflow : hidden ; text-overflow : ellipsis ; white-space : nowrap ; }
tr . rowlink { cursor : pointer ; }
tr . rowlink : hover td { background : var ( -- panel ); }
tr . rowlink . on td { background : var ( -- sel ); }
tr . rowlink : focus-visible { outline : 2 px solid var ( -- cyan ); outline-offset : -2 px ; }
td . pill + . pill { margin-left : 4 px ; }
. lock . auth-card { max-height : calc ( 100 dvh - 32 px ); overflow : auto ; }
2026-10-16 09:31:45 -06:00
/* ===== New in the rebuild (phase 2) ===== */
/* Clerical home, projects and units, the packet page. Ported from the old .dhead, .facts, .projgrid, .pcard,
.stg, .pbar, .unitbar, .projhits, .crumbs, .due, .fltbar, .qrs, .balloon blocks, plus a few new helpers. */
. sheet . narrow { width : min ( 560 px , 100 % ); }
. sec-h . flush { margin : 0 ; }
. chip . sm { min-height : 34 px ; padding : 4 px 12 px ; font-size : 13.5 px ; }
. grow0 { min-width : 0 ; flex : 1 1 420 px ; }
. pre { white-space : pre-wrap ; margin-top : 6 px ; }
. dhead { display : flex ; gap : 18 px ; align-items : flex-end ; justify-content : space-between ; flex-wrap : wrap ; padding-block : 6 px 14 px ; border-bottom : 1 px solid var ( -- line ); margin-bottom : 12 px ; }
. dhead . facts { display : flex ; gap : 6 px 22 px ; flex-wrap : wrap ; margin-top : 8 px ; font-size : 13.5 px ; }
. dhead . facts span { color : var ( -- muted ); }
. dhead . facts b { color : var ( -- near ); font-weight : 600 ; font-family : var ( -- f - mono ); font-size : 13 px ; }
. dhead . pacts { align-items : center ; }
. dtitle { color : var ( -- near ); font-weight : 500 ; font-size : 17 px ; margin-top : 2 px ; }
. crumbs2 { margin : 4 px 0 6 px ; }
. crumbs2 b { color : var ( -- near ); }
. crumbs { display : flex ; align-items : center ; gap : 8 px ; flex-wrap : wrap ; margin-bottom : 6 px ; font-size : 14 px ; }
. crumbs span { color : var ( -- muted ); }
. crumbs b { color : var ( -- near ); }
. due { font-weight : 600 ; }
. due . over { color : var ( -- pink ); font-weight : 700 ; }
. due . soon { color : var ( -- amber ); font-weight : 700 ; }
. due . muted { opacity : .7 ; }
. flagline { margin : 4 px 0 8 px ; }
. card . dept { color : var ( -- cyan ); font-weight : 600 ; }
. attn { display : flex ; flex-direction : column ; gap : 8 px ; margin-bottom : 12 px ; }
. fltbar { background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 14 px ; padding : 12 px 14 px ; margin : 8 px 0 16 px ; display : flex ; flex-direction : column ; gap : 10 px ; }
. fltrow { display : flex ; gap : 8 px 12 px ; flex-wrap : wrap ; align-items : flex-end ; }
. fltrow . f { display : flex ; flex-direction : column ; gap : 4 px ; min-width : 0 ; }
. fltrow . f > span { font-size : 11.5 px ; font-weight : 700 ; letter-spacing : .07 em ; text-transform : uppercase ; color : var ( -- muted ); }
. fltrow . fltq { flex : 3 1 320 px ; }
. fltrow . fltp { flex : 1.4 1 260 px ; }
. fltbtns { display : flex ; gap : 8 px ; align-items : flex-end ; flex : none ; }
. fltrow2 { display : flex ; gap : 10 px ; flex-wrap : wrap ; align-items : center ; }
. pick { display : flex ; flex-direction : column ; gap : 6 px ; }
. pickp { display : flex ; gap : 8 px ; align-items : baseline ; flex-wrap : wrap ; color : var ( -- near ); }
. pickp . small { font-weight : 700 ; letter-spacing : .06 em ; text-transform : uppercase ; font-size : 11.5 px ; }
. projhits { display : flex ; flex-direction : column ; gap : 6 px ; max-height : 280 px ; overflow : auto ; }
. projhit { display : flex ; gap : 10 px ; align-items : center ; flex-wrap : wrap ; text-align : left ; background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 10 px ; padding : 10 px 14 px ; color : var ( -- near ); cursor : pointer ; font : inherit ; }
. projhit : hover , . projhit : focus-visible { border-color : var ( -- cyan ); }
. projhit . pill { margin-left : auto ; }
. projgrid { display : grid ; grid-template-columns : repeat ( auto - fill , minmax ( 260 px , 1 fr )); gap : 12 px ; }
. pcard . job { font-size : 20 px ; }
. stg { display : flex ; flex-wrap : wrap ; gap : 4 px 10 px ; font-size : 12 px ; margin-top : 6 px ; }
. stg span { color : var ( -- near ); }
. stg span . z { color : var ( -- muted ); opacity : .6 ; }
. pbar { height : 8 px ; border-radius : 5 px ; background : var ( -- line2 ); overflow : hidden ; display : flex ; margin : 6 px 0 2 px ; }
. pbar i { display : block ; height : 100 % ; }
. pbar i . f { background : var ( -- cyan ); }
. pbar i . c { background : var ( -- green ); }
. unitbar { display : flex ; gap : 10 px 14 px ; align-items : center ; flex-wrap : wrap ; margin-bottom : 10 px ; }
. unitlist . pbar { margin : 0 ; }
th . wide { min-width : 160 px ; }
table . edit td { padding : 6 px ; }
input . in . sm { min-height : 36 px ; padding : 6 px 8 px ; font-size : 14 px ; }
input . in . num { text-align : right ; font-family : var ( -- f - mono ); }
. sheet-acts . start { justify-content : flex-start ; align-items : center ; }
. sigmean { border-left : 3 px solid var ( -- amber ); background : var ( -- panel ); border-radius : 0 10 px 10 px 0 ; padding : 8 px 12 px ; }
. sigmean . tt { color : var ( -- near ); font-weight : 600 ; font-size : 16 px ; margin-top : 2 px ; }
. actbox { display : flex ; flex-direction : column ; gap : 10 px ; margin-bottom : 14 px ; }
. hmq { display : flex ; gap : 8 px ; align-items : center ; flex-wrap : wrap ; }
. hmq b { color : var ( -- near ); }
. acts { display : flex ; gap : 10 px ; flex-wrap : wrap ; align-items : flex-start ; }
. act { display : flex ; flex-direction : column ; gap : 4 px ; max-width : 280 px ; }
. act . why { color : var ( -- amber ); }
label . btn input . sr { pointer-events : none ; }
. balloon { display : inline - grid ; place-items : center ; width : 26 px ; height : 26 px ; border-radius : 50 % ; border : 1.5 px solid var ( -- cyan ); color : var ( -- cyan ); font-family : var ( -- f - mono ); font-size : 12.5 px ; font-weight : 600 ; }
. qrs { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 240 px , 1 fr )); gap : 14 px ; }
. qr { background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 12 px ; padding : 16 px ; display : flex ; gap : 16 px ; align-items : center ; }
. qr . code { background : var ( -- white ); padding : 10 px ; border-radius : 8 px ; flex : none ; width : 148 px ; height : 148 px ; display : grid ; place-items : center ; color : var ( -- bg ); }
. qr . code canvas { width : 128 px !important ; height : 128 px !important ; }
. qr . wo { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 26 px ; color : var ( -- white ); letter-spacing : .03 em ; }
. pdfv { display : flex ; flex-direction : column ; gap : 10 px ; }
. pdfv-bar { display : flex ; gap : 10 px ; align-items : center ; flex-wrap : wrap ; }
. pdfv-bar . seg button { min-width : 44 px ; font-weight : 700 ; }
. pdfv-body { display : grid ; grid-template-columns : 150 px 1 fr ; gap : 12 px ; align-items : start ; }
. pdfv-pages { list-style : none ; margin : 0 ; padding : 0 ; display : flex ; flex-direction : column ; gap : 6 px ; }
. pdfv-pages button { width : 100 % ; text-align : left ; background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 8 px ; padding : 8 px 10 px ; color : var ( -- near ); cursor : pointer ; font : inherit ; display : flex ; flex-wrap : wrap ; gap : 4 px ; align-items : center ; }
. pdfv-pages button [ aria-current = "page" ] { border-color : var ( -- cyan ); background : var ( -- sel ); }
. pdfv-frame { overflow : auto ; background : var ( -- col ); border : 1 px solid var ( -- line ); border-radius : 10 px ; padding : 1 px ; min-height : 240 px ; max-height : calc ( 100 dvh - 160 px ); }
. pdfv-canvas { display : block ; background : var ( -- white ); }
@ media ( max-width : 700px ) {
. pdfv-body { grid-template-columns : 1 fr ; }
. pdfv-pages { flex-direction : row ; flex-wrap : wrap ; }
. pdfv-pages button { width : auto ; }
}
2026-10-16 17:13:31 -06:00
/* ===== New in the rebuild (phase 4) ===== */
/* The warehouse board, the stage pill and line, the pull table. From the old .wh-*, .whline, .whacts, .whcard,
.whboard, .whcol, .whover, .whsrc, .whghost, .whstep, .whgrp, .whdates, .visbadge, .heat and the pullTable rows. */
. col-h h3 { font : inherit ; letter-spacing : inherit ; text-transform : inherit ; color : inherit ; }
. wh-in { color : #d9b25e ; border-style : dashed ; }
. wh-pull { color : var ( -- amber ); }
. wh-hold { color : var ( -- pink ); }
. wh-done { color : var ( -- green ); }
. whline { font-size : 12.5 px ; font-weight : 600 ; padding : 4 px 8 px ; border-radius : 6 px ; background : rgba ( 255 , 255 , 255 , .04 ); border-left : 3 px solid currentColor ; }
. whline . wh-in { border-left-style : dashed ; }
. whacts { display : flex ; gap : 6 px ; flex-wrap : wrap ; margin-top : 2 px ; }
. whcard { cursor : pointer ; }
. whcard : hover , . whcard : focus-visible { border-color : var ( -- cyan ); }
. whcard . whdrag { touch-action : pan-y ; user-select : none ; }
. whboard { grid-template-columns : repeat ( auto - fit , minmax ( 230 px , 1 fr )); }
. whcol { transition : border-color .12 s , background .12 s ; }
. whcol . whover { border-color : var ( -- cyan ); background : #12303a ; }
. whsrc { opacity : .35 ; }
. whghost { position : fixed ; z-index : 80 ; pointer-events : none ; transform : translate ( -50 % , -30 % ) rotate ( 1.5 deg ); box-shadow : 0 10 px 30 px rgba ( 0 , 0 , 0 , .5 ); opacity : .95 ; }
. whstep { display : flex ; gap : 10 px ; align-items : center ; flex-wrap : wrap ; margin-bottom : 6 px ; }
. whgrpbox { display : flex ; flex-direction : column ; gap : 10 px ; }
. whgrp { display : flex ; justify-content : space-between ; align-items : center ; margin : 10 px 2 px 0 ; font-size : 12 px ; font-weight : 700 ; letter-spacing : .08 em ; text-transform : uppercase ; color : var ( -- cyan ); }
. whgrpbox : first-of-type . whgrp { margin-top : 2 px ; }
. whgrp b { color : var ( -- muted ); }
. whdates { display : flex ; gap : 10 px ; flex-wrap : wrap ; color : var ( -- muted ); }
. whdates b { color : var ( -- body ); }
. visbadge { display : inline-block ; font-size : 10.5 px ; font-weight : 700 ; letter-spacing : .08 em ; padding : 2 px 7 px ; border-radius : 5 px ; border : 1 px solid var ( -- cyan ); color : var ( -- cyan ); margin-right : 6 px ; }
. heat { font-family : var ( -- f - mono ); font-weight : 600 ; color : var ( -- amber ); }
. heat . none { color : var ( -- muted ); font-weight : 400 ; }
input . in . heatIn { font-family : var ( -- f - mono ); min-width : 170 px ; }
input . in . heatIn . need { border-color : var ( -- amber ); box-shadow : 0 0 0 1 px var ( -- amber ) inset ; }
input . in . w80 { width : 80 px ; }
input . in . w110 { width : 110 px ; }
table . pull td . need { font-size : 18 px ; font-weight : 600 ; }
tr . pullrow . pulled td { background : #13261d ; }
tr . pullrow . short td { background : #2a1a24 ; }
tr . pullerr td { border-top : 0 ; padding-top : 0 ; }
. pullck { display : flex ; gap : 8 px ; align-items : center ; }
. pullck input { width : 26 px ; height : 26 px ; accent-color : var ( -- green ); }
. nack { display : inline-flex ; gap : 6 px ; align-items : center ; white-space : nowrap ; }
. nack input { width : 20 px ; height : 20 px ; }
td . heatcell { min-width : 190 px ; }
td . shortcell { min-width : 150 px ; }
. stack . tight { gap : 4 px ; align-items : flex-start ; }
. shortchip { display : inline-flex ; flex-wrap : wrap ; gap : 4 px ; align-items : center ; }
td . shortqty { font-size : 18 px ; font-weight : 700 ; color : var ( -- pink ); }
td . late { color : var ( -- red ); }
. btn . dim { opacity : .55 ; pointer-events : none ; }
. btn . pinktxt { color : var ( -- pink ); }
. mtrframe { width : 100 % ; height : min ( 75 vh , 900 px ); border : 1 px solid var ( -- line ); border-radius : 10 px ; background : var ( -- white ); }
. mtrimg { max-width : 100 % ; height : auto ; border-radius : 10 px ; background : var ( -- white ); align-self : center ; }
. bar . usage { position : relative ; height : 12 px ; border-radius : 6 px ; }
. bar . usage . mark { position : absolute ; top : 0 ; bottom : 0 ; width : 2 px ; background : var ( -- amber ); }
2026-10-16 22:46:56 -06:00
/* Phase 5: shop screens. From .stalls, .stall, .sn, .cotag, .cohot, .stallhero, .cobanner, .cob-h, .cob-t, .cob-row, .cosec. */
. stalls { display : grid ; grid-template-columns : repeat ( auto - fill , minmax ( 200 px , 1 fr )); gap : 10 px ; align-items : start ; }
. stall { background : var ( -- panel2 ); border : 1 px solid var ( -- line ); border-radius : 10 px ; padding : 10 px 12 px ; display : flex ; flex-direction : column ; gap : 5 px ; min-height : 112 px ; }
. stall . sn { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 18 px ; letter-spacing : .08 em ; color : var ( -- near ); display : flex ; justify-content : space-between ; gap : 8 px ; }
. stall . idle { opacity : .55 ; min-height : 0 ; padding-block : 8 px ; }
. stall . idle . sn { font-size : 15 px ; }
. stall . stjob { display : flex ; flex-direction : column ; gap : 4 px ; }
. stall . stjob + . stjob { border-top : 1 px solid var ( -- line ); padding-top : 6 px ; }
. stall button . stopen { all : unset ; cursor : pointer ; color : var ( -- cyan ); font-weight : 600 ; font-size : 14 px ; }
. stall button . stopen : focus-visible , . cotag : focus-visible { outline : 2 px solid var ( -- cyan ); outline-offset : 2 px ; }
. stall . cohot { border : 2 px solid var ( -- pink ); box-shadow : 0 0 0 3 px rgba ( 229 , 88 , 159 , .18 ); }
. cotag , . stall button . cotag { all : unset ; cursor : pointer ; display : block ; margin : 6 px 0 ; background : var ( -- pink ); color : var ( -- white ); font-weight : 700 ; font-size : 11.5 px ; letter-spacing : .04 em ; padding : 5 px 8 px ; border-radius : 6 px ; line-height : 1.25 ; text-transform : uppercase ; }
. stempty { margin-bottom : 22 px ; }
. stclock { display : flex ; align-items : center ; flex-wrap : wrap ; gap : 0 4 px ; }
. sdot { display : inline-block ; width : 10 px ; height : 10 px ; border-radius : 50 % ; background : var ( -- muted ); margin-right : 6 px ; }
. sdot . run { background : var ( -- green ); animation : sdotpulse 1.6 s infinite ; }
@ keyframes sdotpulse { 0 % { box-shadow : 0 0 0 0 rgba ( 95 , 201 , 138 , .55 ); } 70 % { box-shadow : 0 0 0 8 px rgba ( 95 , 201 , 138 , 0 ); } 100 % { box-shadow : 0 0 0 0 rgba ( 95 , 201 , 138 , 0 ); } }
. stallhero { display : flex ; align-items : center ; gap : 16 px ; flex-wrap : wrap ; margin-block : 6 px 18 px ; }
. stallhero . big { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 64 px ; line-height : .9 ; color : var ( -- white ); letter-spacing : .04 em ; }
. stallhero . stpick { min-width : 220 px ; }
. stnone { margin-top : 30 px ; }
. cobanner { border : 3 px solid var ( -- pink ); background : linear-gradient ( 180 deg , rgba ( 229 , 88 , 159 , .22 ), rgba ( 229 , 88 , 159 , .08 )); border-radius : 14 px ; padding : 14 px 16 px ; margin : 4 px 0 18 px ; display : flex ; flex-direction : column ; gap : 10 px ; box-shadow : 0 0 0 4 px rgba ( 229 , 88 , 159 , .12 ); animation : copulse 2.2 s ease-in-out infinite ; }
@ keyframes copulse { 0 %, 100 % { box-shadow : 0 0 0 4 px rgba ( 229 , 88 , 159 , .12 ), 0 0 0 0 rgba ( 229 , 88 , 159 , 0 ); border-color : var ( -- pink ); } 50 % { box-shadow : 0 0 0 6 px rgba ( 229 , 88 , 159 , .30 ), 0 0 34 px 6 px rgba ( 229 , 88 , 159 , .38 ); border-color : #ff8cc4 ; } }
. cob-h { display : flex ; gap : 12 px ; align-items : center ; color : var ( -- near ); }
. cob-h svg { color : var ( -- pink ); flex : none ; animation : cobpulse 1.6 s ease-in-out infinite ; }
@ keyframes cobpulse { 50 % { opacity : .35 ; } }
. cob-t { font-family : var ( -- f - disp ); font-size : 26 px ; font-weight : 700 ; letter-spacing : .04 em ; text-transform : uppercase ; color : var ( -- white ); line-height : 1.1 ; }
. cob-row { display : flex ; gap : 12 px ; align-items : center ; justify-content : space-between ; flex-wrap : wrap ; background : rgba ( 13 , 22 , 27 , .7 ); border-radius : 10 px ; padding : 10 px 12 px ; }
. cob-txt { min-width : 0 ; }
. cosec { border-left : 4 px solid var ( -- pink ); padding-left : 12 px ; }
. supchips { justify-content : flex-end ; }
@ media ( max-width : 640px ) {
. stalls { grid-template-columns : repeat ( 2 , minmax ( 0 , 1 fr )); }
. stall . busy { grid-column : 1 / -1 ; }
. cob-t { font-size : 20 px ; }
. stallhero . big { font-size : 48 px ; }
}
/* Phase 5: packet page. From .dv, .viewer, .stage, .mk, .ld, .arw, .ht, .htbl, .htprev, .vtools, .fsbar, body.fs-view,
.pagesel, .side, .hlist, .ichip, .ck, .ck-item, .cklay, .clock, .cdot. The drawing stays on white.
Appended after the shop screens block because that block was written first; no selector overlaps it. */
. dv { display : grid ; grid-template-columns : minmax ( 0 , 1 fr ) 320 px ; gap : 14 px ; align-items : start ; }
. dv . solo { grid-template-columns : minmax ( 0 , 1 fr ); }
@ media ( max-width : 980px ) { . dv { grid-template-columns : minmax ( 0 , 1 fr ); } }
. viewer { position : relative ; background : var ( -- white ); border-radius : 10 px ; overflow : hidden ; height : min ( 68 vh , 720 px ); touch-action : none ; border : 1 px solid var ( -- line2 ); cursor : grab ; user-select : none ; -webkit- user-select : none ; -webkit- touch-callout : none ; }
. viewer . panning { cursor : grabbing ; }
. viewer . marking { cursor : crosshair ; outline : 3 px solid var ( -- pink ); outline-offset : -3 px ; }
. viewer . placing { cursor : crosshair ; outline : 3 px solid var ( -- amber ); outline-offset : -3 px ; }
. stage { position : absolute ; left : 0 ; top : 0 ; transform-origin : 0 0 ; }
. stage-canvas { display : block ; max-width : none ; pointer-events : none ; }
. vload { position : absolute ; inset : 0 ; display : grid ; place-items : center ; color : #44535a ; padding : 16 px ; pointer-events : none ; }
. vload . callout { pointer-events : auto ; }
. lead { position : absolute ; left : 0 ; top : 0 ; width : 100 % ; height : 100 % ; overflow : visible ; pointer-events : none ; }
. ld { stroke-width : 2.5 ; vector-effect : non-scaling-stroke ; fill : none ; }
. ld . h { stroke : #b07800 ; }
. ld . w { stroke : #c2185b ; }
. ld . carried { stroke-dasharray : 6 4 ; }
. mk { position : absolute ; z-index : 2 ; transform : translate ( -50 % , -50 % ) scale ( var ( -- inv , 1 )); transform-origin : center ; width : 44 px ; height : 44 px ; border-radius : 50 % ; background : #fff ; color : #c2185b ; border : 3 px solid #c2185b ; font-family : var ( -- f - mono ); font-size : 13 px ; font-weight : 700 ; display : grid ; place-items : center ; box-shadow : 0 2 px 6 px rgba ( 0 , 0 , 0 , .45 ); cursor : pointer ; padding : 0 ; }
. mk . drag { cursor : move ; touch-action : none ; }
. mk . carried { border-style : dashed ; opacity : .85 ; }
. arw { position : absolute ; z-index : 1 ; width : 20 px ; height : 14 px ; transform : translate ( -100 % , -50 % ) rotate ( var ( -- rot , 0 deg )) scale ( var ( -- inv , 1 )); transform-origin : 100 % 50 % ; pointer-events : none ; }
. arw :: before { content : "" ; position : absolute ; inset : 0 ; clip-path : polygon ( 0 0 , 100 % 50 % , 0 100 % ); }
. arw . h :: before { background : #b07800 ; }
. arw . w :: before { background : #c2185b ; }
. arw . drag { pointer-events : auto ; cursor : move ; touch-action : none ; width : 30 px ; height : 22 px ; }
. ht { position : absolute ; z-index : 2 ; transform : translate ( -50 % , -50 % ) scale ( var ( -- inv , 1 )); display : inline-flex ; align-items : center ; gap : 7 px ; background : #fff8e6 ; border : 2 px solid #b07800 ; color : #3d2a00 ; border-radius : 999 px ; padding : 3 px 12 px 3 px 3 px ; font-family : var ( -- f - mono ); font-weight : 700 ; font-size : 13 px ; white-space : nowrap ; box-shadow : 0 2 px 6 px rgba ( 0 , 0 , 0 , .35 ); cursor : pointer ; line-height : 1.2 ; min-height : 34 px ; }
. ht . hn { display : grid ; place-items : center ; width : 26 px ; height : 26 px ; border-radius : 50 % ; background : #b07800 ; color : #fff ; font-size : 12 px ; flex : none ; }
. ht . none { border-style : dashed ; color : #7a5a20 ; }
. ht . drag { cursor : move ; touch-action : none ; }
. ht . carried { opacity : .85 ; }
. htbl { position : absolute ; z-index : 3 ; font-size : calc ( var ( -- sw , 3000 px ) * 0.0075 * var ( -- hs , 1 )); background : #fff ; border : .16 em solid #b07800 ; color : #2b1d00 ; font-family : Arial , Helvetica , sans-serif ; line-height : 1.15 ; box-shadow : 0 .1 em .4 em rgba ( 0 , 0 , 0 , .35 ); user-select : none ; -webkit- user-select : none ; }
. htbl . drag { cursor : move ; touch-action : none ; }
. htbl . drag : hover , . htbl . moving { outline : .12 em dashed var ( -- cyan ); outline-offset : .25 em ; }
. htbl . htcap { background : #b07800 ; color : #fff ; font-weight : 700 ; font-size : .85 em ; text-align : center ; padding : .2 em .5 em ; letter-spacing : .04 em ; }
. htbl . htcols { display : flex ; align-items : flex-start ; }
. htbl table { border-collapse : collapse ; margin : 0 ; width : auto ; font-size : inherit ; }
. htbl th , . htbl td { border : .08 em solid #b07800 ; padding : .2 em .5 em ; white-space : nowrap ; background : #fff ; color : #2b1d00 ; font-size : 1 em ; }
. htbl th { background : #f3e2b8 ; color : #3d2a00 ; font-size : .8 em ; font-weight : 700 ; text-align : center ; letter-spacing : .03 em ; text-transform : none ; }
. htbl td . i { text-align : center ; font-weight : 700 ; }
. htbl td . h { font-family : "Courier New" , monospace ; font-weight : 700 ; }
. htbl td . h . none { color : #b00020 ; }
. htbl td . h . na { color : #6b5a3a ; }
. htbl . static { position : static ; font-size : 13 px ; box-shadow : none ; display : inline-block ; max-width : 100 % ; overflow : auto ; }
. htbl . htghost { position : fixed ; z-index : 70 ; pointer-events : none ; font-size : 13 px ; opacity : .92 ; transform : translate ( -10 px , -10 px ); }
. htprev { border : 1 px dashed var ( -- line2 ); border-radius : 10 px ; padding : 10 px ; }
. htprev . htgrab { cursor : grab ; touch-action : none ; user-select : none ; -webkit- user-select : none ; }
. htprev . htgrab : hover { border-color : var ( -- cyan ); }
. vtools { position : absolute ; right : 10 px ; top : 10 px ; display : flex ; flex-direction : column ; gap : 6 px ; z-index : 4 ; }
. vtools button { width : 44 px ; height : 44 px ; border-radius : 9 px ; border : 1 px solid #c9d3d8 ; background : rgba ( 255 , 255 , 255 , .94 ); color : #1a252b ; font-size : 20 px ; font-weight : 700 ; cursor : pointer ; display : grid ; place-items : center ; padding : 0 ; }
. vtools button . fit { font-size : 13 px ; }
. vtools button svg { display : block ; margin : auto ; }
. fsbar { display : none ; }
body . fs-view { overflow : hidden ; }
body . fs-view . viewer { position : fixed ; inset : 0 ; width : 100 vw ; height : 100 vh ; height : 100 dvh ; z-index : 80 ; border-radius : 0 ; border : 0 ; }
body . fs-view . fsbar { display : flex ; position : absolute ; left : 10 px ; top : 10 px ; max-width : calc ( 100 % - 80 px ); z-index : 4 ; gap : 6 px ; flex-wrap : wrap ; align-items : center ; background : rgba ( 13 , 22 , 27 , .9 ); padding : 6 px 8 px ; border-radius : 10 px ; color : var ( -- near ); cursor : default ; }
. fsbar . fst { font-size : 13 px ; margin-right : 6 px ; white-space : nowrap ; overflow : hidden ; text-overflow : ellipsis ; max-width : 40 vw ; }
body . fs-view . scrim { z-index : 95 ; }
body . fs-view . toast { z-index : 99 ; }
. pagesel { display : flex ; gap : 8 px ; flex-wrap : wrap ; align-items : center ; }
. side { display : flex ; flex-direction : column ; gap : 12 px ; min-width : 0 ; }
. hlist { display : flex ; flex-direction : column ; gap : 7 px ; font-size : 13.5 px ; }
. hlist . row { display : grid ; grid-template-columns : 28 px 1 fr auto ; gap : 8 px ; align-items : center ; }
. hlist . row . d { min-width : 0 ; color : var ( -- near ); overflow-wrap : anywhere ; }
. hlist . rowbtn { all : unset ; display : grid ; grid-template-columns : 28 px 1 fr auto ; gap : 8 px ; align-items : center ; cursor : pointer ; min-height : 44 px ; border-radius : 8 px ; padding : 0 4 px ; }
. hlist . rowbtn : hover { background : var ( -- panel2 ); }
. hlist . rowbtn : focus-visible { outline : 2 px solid var ( -- cyan ); outline-offset : 2 px ; }
. balloon . pinkb { border-color : var ( -- pink ); color : var ( -- pink ); }
. balloon . carried { border-style : dashed ; }
. flabel { font-size : 12 px ; font-weight : 700 ; letter-spacing : .06 em ; text-transform : uppercase ; color : var ( -- muted ); margin-bottom : 6 px ; }
. ichip { width : 56 px ; height : 56 px ; border-radius : 50 % ; border : 2 px solid var ( -- line2 ); background : var ( -- panel ); color : var ( -- near ); font-family : var ( -- f - mono ); font-size : 20 px ; font-weight : 700 ; cursor : pointer ; transition : background .12 s , border-color .12 s , transform .12 s ; }
. ichip : hover { border-color : var ( -- cyan ); }
. ichip [ aria-pressed = "true" ] { background : var ( -- cyan ); border-color : var ( -- cyan ); color : var ( -- on - cyan ); box-shadow : 0 0 0 4 px rgba ( 73 , 192 , 222 , .28 ); transform : scale ( 1.06 ); }
. ichip : disabled { cursor : default ; }
. ck { display : flex ; flex-direction : column ; gap : 8 px ; }
. ck-item { display : flex ; gap : 14 px ; align-items : center ; background : var ( -- panel ); border : 1 px solid var ( -- line ); border-radius : 10 px ; padding : 12 px 14 px ; cursor : pointer ; min-height : 58 px ; }
. ck-item input { width : 28 px ; height : 28 px ; accent-color : var ( -- green ); flex : none ; }
. ck-item . t { color : var ( -- near ); font-weight : 500 ; flex : 1 ; min-width : 0 ; }
. ck-item . by { font-size : 12 px ; color : var ( -- muted ); text-align : right ; }
. ck-item . done { border-color : #2d5a41 ; }
. ck-item [ aria-disabled = "true" ] { cursor : default ; }
. cklay { display : grid ; grid-template-columns : minmax ( 0 , 1 fr ) 360 px ; grid-template-areas : "main side" ; gap : 18 px ; align-items : start ; }
. cklay . ckmain { grid-area : main ; min-width : 0 ; }
. cklay . ckside { grid-area : side ; position : sticky ; top : calc ( var ( -- toph , 64 px ) + 64 px ); }
@ media ( max-width : 980px ) { . cklay { grid-template-columns : minmax ( 0 , 1 fr ); grid-template-areas : "main" "side" ; } . cklay . ckside { position : static ; } }
. clockrow { display : flex ; gap : 16 px ; align-items : baseline ; flex-wrap : wrap ; margin-right : auto ; }
. clock { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 40 px ; color : var ( -- white ); line-height : 1 ; font-variant-numeric : tabular-nums ; }
. clock small { font-size : 18 px ; color : var ( -- muted ); }
. cdot { display : inline-block ; width : 12 px ; height : 12 px ; border-radius : 50 % ; background : var ( -- muted ); margin-right : 10 px ; vertical-align : middle ; }
. cdot . run { background : var ( -- green ); animation : cdotpulse 1.6 s infinite ; }
@ keyframes cdotpulse { 0 % { box-shadow : 0 0 0 0 rgba ( 95 , 201 , 138 , .6 ); } 70 % { box-shadow : 0 0 0 10 px rgba ( 95 , 201 , 138 , 0 ); } 100 % { box-shadow : 0 0 0 0 rgba ( 95 , 201 , 138 , 0 ); } }
. labor { color : var ( -- body ); }
. labor b { color : var ( -- amber ); font-family : var ( -- f - mono ); }
. acts . center { align-items : center ; }
. revrow { display : flex ; gap : 10 px 16 px ; flex-wrap : wrap ; align-items : flex-end ; }
. revrow . sep { border-top : 1 px solid var ( -- line ); padding-top : 10 px ; }
. revrow . f { flex : 0 1 220 px ; }
. revrow . f . grow2 { flex : 1 1 260 px ; }
. presence { display : flex ; gap : 8 px ; align-items : center ; color : var ( -- body ); margin : 6 px 0 ; }
. pdot { width : 9 px ; height : 9 px ; border-radius : 50 % ; background : var ( -- cyan ); flex : none ; }
. verifybox { border-color : var ( -- pink ); }
. pinktxt { color : var ( -- pink ); }
. amber { color : var ( -- amber ); }
. near { color : var ( -- near ); }
. mb6 { margin-bottom : 6 px ; }
. mb8 { margin-bottom : 8 px ; }
. mb10 { margin-bottom : 10 px ; }
. mt8 { margin-top : 8 px ; }
. mt10 { margin-top : 10 px ; }
2026-10-17 20:08:53 -06:00
/* Phase 6: packet page. From .vtb, .qcdoc, .qcdocs, .itphold and the qcTab layout of the old build. */
. vtbs { display : flex ; gap : 6 px ; }
. vtb { border : 2 px solid var ( -- line2 ); background : var ( -- panel ); color : var ( -- body ); border-radius : 8 px ; padding : 8 px 14 px ; font-weight : 700 ; cursor : pointer ; min-height : 42 px ; }
. vtb : disabled { opacity : .6 ; cursor : default ; }
. vtb . acc [ aria-pressed = "true" ] { background : var ( -- green ); border-color : var ( -- green ); color : var ( -- on - green ); }
. vtb . rej [ aria-pressed = "true" ] { background : var ( -- pink ); border-color : var ( -- pink ); color : var ( -- on - pink ); }
. qctab . ck-item . t . hint { display : block ; margin-top : 2 px ; font-weight : 400 ; }
. qcinsp { max-width : 720 px ; }
. qcnde { max-width : 900 px ; }
. qcnotes { margin-top : 12 px ; max-width : 900 px ; }
. qcroute { flex : 0 1 260 px ; }
. qcbar . acts { align-items : flex-end ; }
. qcrej a . lnk , . itphold a . lnk { font-weight : 600 ; }
. itphold b { color : var ( -- amber ); }
. qcdocs { display : grid ; gap : 8 px ; }
. qcdoc { display : flex ; gap : 12 px ; align-items : flex-start ; flex-wrap : wrap ; padding : 12 px 14 px ; border : 1 px solid var ( -- line ); border-radius : 10 px ; background : var ( -- panel ); }
. qcdoc . old { opacity : .7 ; }
. qcdoc . m { flex : 1 1 240 px ; min-width : 0 ; }
. qcdoc . a { display : flex ; gap : 8 px ; flex-wrap : wrap ; }
. qchist . pill { margin-right : 4 px ; }
input . in . w220 { width : 220 px ; max-width : 100 % ; }
. mt4 { margin-top : 4 px ; }
/* Phase 6: Q.C. screens. Ported from the old .qcunits, .qcunit, .qcdocs, .qcdoc, .itpcard, .itphdr, .itppage,
.itpsec, .itprows, .itprow, .itpblock, .sigs, .ini, .rejtag, .custrec blocks, plus a few new helpers. */
. qcfolders { margin-top : 22 px ; }
. qcunits { display : grid ; grid-template-columns : repeat ( auto - fill , minmax ( 190 px , 1 fr )); gap : 10 px ; }
. qcunit { gap : 8 px ; padding : 10 px 12 px ; align-items : stretch ; text-align : left ; }
. qcunit . job { font-size : 17 px ; }
. qcunit . qm { display : flex ; justify-content : space-between ; gap : 8 px ; font-size : 13 px ; color : var ( -- muted ); }
. qcunit . qm . ok , . qcdoc . ok { color : var ( -- green ); }
. qcdocs { display : grid ; gap : 8 px ; list-style : none ; margin : 0 ; padding : 0 ; }
. qcdoc { display : flex ; gap : 12 px ; align-items : flex-start ; flex-wrap : wrap ; padding : 12 px 14 px ; border : 1 px solid var ( -- line ); border-radius : 10 px ; background : var ( -- panel ); }
. qcdoc . old { opacity : .7 ; }
. qcdoc . tag { font-size : 12 px ; font-weight : 700 ; padding : 3 px 8 px ; border-radius : 6 px ; background : var ( -- panel2 ); border : 1 px solid var ( -- line2 ); white-space : nowrap ; }
. qcdoc . m { flex : 1 1 240 px ; min-width : 0 ; }
. qcdoc . a { display : flex ; gap : 8 px ; flex-wrap : wrap ; }
. itpcard { display : flex ; gap : 14 px ; align-items : center ; flex-wrap : wrap ; padding : 14 px 16 px ; border : 1 px solid var ( -- line ); border-radius : 10 px ; background : var ( -- panel ); }
a . itpcard { flex-direction : row ; text-align : left ; }
. itpcard . grow { flex : 1 1 260 px ; min-width : 0 ; }
. itpcard . bar { background : var ( -- panel2 ); margin : 8 px 0 6 px ; }
. itphdr { display : grid ; grid-template-columns : repeat ( auto - fill , minmax ( 210 px , 1 fr )); gap : 10 px ; }
. itppage { margin : 26 px 0 4 px ; font-family : var ( -- f - disp ); font-size : 13 px ; letter-spacing : .12 em ; text-transform : uppercase ; color : var ( -- cyan ); }
. itppage span { color : var ( -- muted ); margin-right : 6 px ; }
. itpsec . sec-h h2 { font-size : 17 px ; }
. itprows { display : grid ; gap : 6 px ; }
. itprow { display : grid ; grid-template-columns : 42 px minmax ( 0 , 1 fr ) 44 px 210 px 130 px 44 px ; gap : 10 px ; align-items : center ; padding : 10 px 12 px ; border : 1 px solid var ( -- line ); border-radius : 10 px ; background : var ( -- panel ); }
. itprow . hold { border-left : 3 px solid var ( -- amber ); }
. itprow . rej { border-left : 3 px solid var ( -- red ); }
. itprow . rejtag { font-size : 12 px ; color : var ( -- red ); flex-basis : 100 % ; }
. itprow . apr { display : flex ; gap : 6 px ; flex-wrap : wrap ; }
. itprow . na { opacity : .55 ; }
. itprow . na . t b { text-decoration : line-through ; }
. itprow . cd { display : inline-block ; min-width : 34 px ; text-align : center ; font-weight : 700 ; font-size : 12 px ; padding : 3 px 6 px ; border-radius : 6 px ; background : var ( -- panel2 ); border : 1 px solid var ( -- line2 ); }
. itprow . qc , . itprow . cu { display : flex ; flex-wrap : wrap ; gap : 4 px 8 px ; align-items : center ; }
. itprow . hd { background : none ; border : 0 ; padding : 0 12 px ; font-size : 11 px ; font-weight : 700 ; letter-spacing : .08 em ; text-transform : uppercase ; color : var ( -- muted ); }
. itprow . ini { font-family : var ( -- f - disp ); font-weight : 700 ; font-size : 16 px ; color : var ( -- green ); }
. itpblock { margin : 8 px 0 18 px ; padding : 12 px 14 px ; border : 1 px dashed var ( -- line2 ); border-radius : 10 px ; }
. itpblock . sigs { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 280 px , 1 fr )); gap : 12 px ; margin-top : 8 px ; }
. itpblock . custrec { display : flex ; gap : 6 px ; flex-wrap : wrap ; align-items : center ; }
. itpblock . custrec . in { max-width : 200 px ; }
@ media ( max-width : 760px ) {
. itprow . hd { display : none ; }
. itprow { grid-template-columns : 38 px minmax ( 0 , 1 fr ) 40 px ; }
. itprow . qc { grid-column : 2 ; grid-row : 2 ; }
. itprow . cu { grid-column : 2 / 4 ; grid-row : 3 ; }
. itprow . mb { grid-column : 3 ; grid-row : 2 ; }
}
/* New: the line sheet's N/A checkbox row, the ITP log list and the write message pinned to the bottom. */
. itpck { display : flex ; align-items : center ; gap : 10 px ; font-size : 14 px ; color : var ( -- near ); }
. itpck input { width : 20 px ; height : 20 px ; }
. itplog { list-style : none ; margin : 0 ; padding : 0 ; display : grid ; gap : 4 px ; color : var ( -- body ); }
. itpmsg { position : fixed ; left : 50 % ; bottom : calc ( 20 px + env ( safe - area - inset - bottom , 0 px )); transform : translateX ( -50 % ); z-index : 60 ; max-width : calc ( 100 % - 32 px ); box-shadow : 0 6 px 20 px rgba ( 0 , 0 , 0 , .4 ); }
2026-10-17 23:49:14 -06:00
/* Phase 7: a print menu row is a whole-width button in the .ck list. */
. ck-item . prow { width : 100 % ; text-align : left ; font : inherit ; color : inherit ; }
. ck-item . prow . t . small { display : block ; margin-top : 2 px ; font-weight : 400 ; }
. prints { list-style : none ; margin : 0 ; padding : 0 ; display : grid ; gap : 6 px ; }
. callout . acts . grow { min-width : 240 px ; }
2026-10-18 15:08:34 -06:00
/* Phase 8: Project Management. From .pmtabs, .pmscope, .pmk, .pmsum, .pmbars, .pmbar, .slowtag, .pmtable. */
. pmtabs { position : static ; margin : 14 px 0 10 px ; }
. pmtabs button { font-size : 15 px ; }
. pmscope { margin : -6 px 0 14 px ; }
. pmk { grid-template-columns : repeat ( auto - fit , minmax ( 150 px , 1 fr )); }
. pmk . kpi . n { font-size : 38 px ; }
. pmsum h3 { margin-bottom : 6 px ; }
. pmsum ul { margin : 0 ; padding-left : 18 px ; display : flex ; flex-direction : column ; gap : 4 px ; color : var ( -- near ); }
. pmbars { display : flex ; flex-direction : column ; gap : 6 px ; }
. pmbar { display : grid ; grid-template-columns : minmax ( 150 px , 240 px ) minmax ( 0 , 1 fr ) minmax ( 130 px , 200 px ); gap : 12 px ; align-items : center ; font-size : 13.5 px ; }
. pmbar . lb { color : var ( -- body ); }
. pmbar . tr { height : 14 px ; background : var ( -- line ); border-radius : 3 px ; overflow : hidden ; }
. pmbar . tr i { display : block ; height : 100 % ; background : var ( -- cyan ); border-radius : 0 4 px 4 px 0 ; min-width : 0 ; }
. pmbar . hot . tr i { background : var ( -- pink ); }
. pmbar . zero { opacity : .5 ; }
. pmbar . v { color : var ( -- near ); font-variant-numeric : tabular-nums ; }
. slowtag { color : var ( -- pink ); font-weight : 700 ; font-size : 11 px ; letter-spacing : .06 em ; text-transform : uppercase ; }
. pmtable td { font-size : 13.5 px ; }
. pmtable tr . flag td { color : #ffb3d6 ; }
. pmtable tr . sub td { background : rgba ( 255 , 255 , 255 , .02 ); font-size : 13 px ; }
. pmtable tr . rowlink : hover td { background : rgba ( 73 , 192 , 222 , .08 ); }
. motion . m-enter . pmbar . tr i { transform-origin : left center ; animation : mgrow .6 s .15 s cubic-bezier ( .2 , .7 , .2 , 1 ) both ; }
/* New: the period select's width, the note under a table heading, sideways scroll for wide report tables. */
. pmper { min-width : 170 px ; }
. pmnote { margin : -4 px 0 8 px ; }
. pmtable { min-width : 720 px ; }
@ media ( max-width : 640px ) {
. pmbar { grid-template-columns : 1 fr ; gap : 4 px ; }
. pmbar . v { font-size : 12.5 px ; }
}
/* Phase 8: find bar, motion, layout. From the old .fltbar, .fltrow, .fltadv, .fltbtns, .fltn, .fltrow2 .chip,
.projsum, .joblist rows, .mbtn, .mdot, .m-enter, .m-tab, .m-bump and the motion keyframes. Then the sheet
placement and the iPad and phone widths, which are new in the rebuild. */
. fltrow . f { flex : 1 1 160 px ; min-width : 130 px ; }
. fltrow . f select , . fltrow . f input { width : 100 % ; }
. fltrow . fltq { flex : 3 1 320 px ; }
. fltrow . fltp { flex : 1.4 1 260 px ; }
. fltbtns { flex-wrap : wrap ; }
. fltbtns . btn { min-height : 44 px ; }
. fltbtns . btn . on { border-color : var ( -- cyan ); color : var ( -- cyan ); }
. fltn { display : inline - grid ; place-items : center ; min-width : 20 px ; height : 20 px ; border-radius : 10 px ; background : var ( -- cyan ); color : #06222b ; font-size : 12 px ; padding : 0 5 px ; }
. fltadv { padding-top : 2 px ; }
. fltrow2 . chip { min-height : 36 px ; padding : 5 px 12 px ; font-size : 13 px ; }
2026-10-19 12:29:06 -06:00
. projsel2 { display : flex ; gap : 8 px ; }
. fltrow . projsel2 select { flex : 1 1 0 ; min-width : 0 ; }
2026-10-18 15:08:34 -06:00
. fltbar . projsum { padding : 8 px 10 px ; border-top : 1 px solid var ( -- line ); display : flex ; flex-direction : column ; gap : 4 px ; }
. joblist-sec . sec-h { flex-wrap : wrap ; align-items : flex-end ; }
. jlsort { display : flex ; flex-direction : column ; gap : 4 px ; min-width : 200 px ; }
. jlsort > span { font-size : 11.5 px ; font-weight : 700 ; letter-spacing : .07 em ; text-transform : uppercase ; color : var ( -- muted ); }
. joblist tr . rowlink : focus td { background : rgba ( 73 , 192 , 222 , .08 ); }
. cardw { border-radius : 10 px ; }
. cardw > . card { height : 100 % ; }
. presence { flex-wrap : wrap ; }
/* The Motion switch in the top bar. */
. mbtn { display : inline-flex ; align-items : center ; gap : 6 px ; }
. mbtn . mdot { width : 8 px ; height : 8 px ; border-radius : 50 % ; background : var ( -- muted ); }
/* Motion, only under body.motion. Reduced motion never gets the class, and the rule at the top stops it anyway. */
@ keyframes menter { from { opacity : 0 ; transform : translateY ( 6 px ); } to { opacity : 1 ; transform : none ; } }
@ keyframes mtab { from { opacity : 0 ; transform : translateY ( 4 px ); } to { opacity : 1 ; transform : none ; } }
@ keyframes mgrow { from { transform : scaleX ( 0 ); } to { transform : scaleX ( 1 ); } }
@ keyframes mglow { 0 % { box-shadow : 0 0 0 0 rgba ( 73 , 192 , 222 , 0 ); } 15 % { box-shadow : 0 0 0 3 px rgba ( 73 , 192 , 222 , .75 ), 0 0 22 px rgba ( 73 , 192 , 222 , .45 ); } 100 % { box-shadow : 0 0 0 0 rgba ( 73 , 192 , 222 , 0 ); } }
@ keyframes mlive { 0 %, 100 % { opacity : 1 ; transform : scale ( 1 ); } 50 % { opacity : .35 ; transform : scale ( .7 ); } }
@ keyframes mbump { 30 % { color : var ( -- cyan ); } }
. motion . m-enter > * { animation : menter .32 s cubic-bezier ( .2 , .7 , .2 , 1 ) both ; }
. motion . m-enter > * : nth-child ( 2 ) { animation-delay : .04 s ; }
. motion . m-enter > * : nth-child ( 3 ) { animation-delay : .08 s ; }
. motion . m-enter > * : nth-child ( 4 ) { animation-delay : .12 s ; }
. motion . m-enter > * : nth-child ( 5 ) { animation-delay : .16 s ; }
. motion . m-enter > * : nth-child ( n + 6 ) { animation-delay : .2 s ; }
. motion . m-enter . bar i , . motion . m-enter . pbar i { transform-origin : left center ; animation : mgrow .6 s .15 s cubic-bezier ( .2 , .7 , .2 , 1 ) both ; }
. motion . m-tab { animation : mtab .2 s cubic-bezier ( .2 , .7 , .2 , 1 ) both ; }
. motion . m-changed { animation : mglow 1.7 s ease-out ; }
. motion . m-bump . n { animation : mbump .5 s ease-out ; }
. motion . card , . motion . kpi , . motion . projhit , . motion . chip , . motion . btn { transition : border-color .15 s , background-color .15 s , transform .15 s , box-shadow .15 s ; }
. motion . card : hover { transform : translateY ( -1 px ); box-shadow : 0 6 px 18 px rgba ( 0 , 0 , 0 , .28 ); }
. motion . tabs button { transition : color .15 s , border-color .2 s ; }
. motion . mbtn . mdot { background : var ( -- cyan ); animation : mlive 2.2 s ease-in-out infinite ; }
/* Sheets on phones: at least 8 px to every edge, sitting low where the thumb is, scrolling inside when tall.
Above 700 px the sheet stays centred with 16 px to every edge (the .scrim and .sheet rules above). */
@ media ( max-width : 700px ) {
. scrim { align-items : flex-end ; padding : 8 px 8 px max ( 8 px , env ( safe - area - inset - bottom , 0 px )); }
. sheet { margin : auto 0 0 ; width : 100 % ; max-height : calc ( 100 vh - 16 px ); max-height : calc ( 100 dvh - 16 px ); padding : 16 px ; }
. sheet . narrow { width : 100 % ; }
}
/* iPad landscape and narrow desktop windows. */
@ media ( max-width : 1024px ) {
. board { grid-template-columns : repeat ( auto - fit , minmax ( 200 px , 1 fr )); }
. whboard { grid-template-columns : repeat ( auto - fit , minmax ( 180 px , 1 fr )); }
. kpis { grid-template-columns : repeat ( 3 , minmax ( 0 , 1 fr )); }
. tw { overflow-x : auto ; -webkit- overflow-scrolling : touch ; }
. joblist { min-width : 860 px ; }
. pmtable { min-width : 720 px ; }
. fltrow . fltq { flex-basis : 100 % ; }
}
/* iPad portrait: the board columns stack, each with its own heading and scroll frame. */
@ media ( max-width : 820px ) {
. board , . whboard { grid-template-columns : minmax ( 0 , 1 fr ); }
. col { max-height : min ( var ( -- col - max , 520 px ), calc ( 100 vh - var ( -- toph , 64 px ) - 40 px )); }
}
/* Phones. */
@ media ( max-width : 700px ) {
. kpis { grid-template-columns : repeat ( 2 , minmax ( 0 , 1 fr )); }
. col { max-height : none ; }
. fltrow . f { flex : 1 1 calc ( 50 % - 8 px ); min-width : 0 ; }
. fltrow . fltq , . fltrow . fltp { flex-basis : 100 % ; }
. fltbtns { flex : 1 1 100 % ; }
. fltbtns . seg { margin-left : auto ; }
. fltrow2 . grow { display : none ; }
. jlsort { min-width : 0 ; flex : 1 1 100 % ; }
. kpi . n { font-size : 34 px ; }
button . kpi :: after { display : none ; }
}