oxedyne/daimond/www/css/tracker.css
11.0 KiB, 4 runs
created by r2519314175:1135, which is this file's identity for as long as the history lasts, whatever it is later renamed to
download · who wrote it · its history
| 1 | /* css/tracker.css — the Proposals tracker view (js/tracker.js). |
| 2 | * |
| 3 | * A DECISION-QUEUE BOARD onto Daimond's own development, tracked as proposals on |
| 4 | * the Oregami forge: four columns, the life of a proposal left to right — |
| 5 | * Awaiting you, Greenlit, Shipped, Dropped. Reuses the app's design tokens (the |
| 6 | * same `--bg-*`, `--text-*`, `--accent-*`, `--border` and `--fs-*` variables |
| 7 | * improve.css draws on), so it inherits the theme and the type scale rather than |
| 8 | * restating them. Terse: a title, a comment count, two vote counts; the detail |
| 9 | * lives one press away. */ |
| 10 | |
| 11 | /* A query container, so the board inside can size to THIS panel's width rather |
| 12 | * than the viewport's -- the Proposals dock is ~280px inside a wide window. */ |
| 13 | #tracker-view { padding: 8px 10px 12px; font-size: var(--fs-xs); color: var(--text-primary); |
| 14 | container-type: inline-size; container-name: tracker; } |
| 15 | |
| 16 | /* ── Head ─────────────────────────────────────────────────────────────── */ |
| 17 | .trk-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; } |
| 18 | .trk-title-main { font-weight: 600; } |
| 19 | .trk-count { font-size: var(--fs-3xs-2xs); color: var(--text-muted); } |
| 20 | |
| 21 | .trk-err { margin: 4px 0; padding: 5px 8px; border-radius: var(--radius-sm); |
| 22 | background: var(--bg-tertiary); color: var(--warn); font-size: var(--fs-2xs-xs); } |
| 23 | .trk-say { min-height: 0; font-size: var(--fs-3xs-2xs); color: var(--text-muted); } |
| 24 | .trk-say:empty { display: none; } |
| 25 | .trk-loading, .trk-none { padding: 10px 2px; color: var(--text-muted); font-size: var(--fs-2xs-xs); } |
| 26 | |
| 27 | /* ── The owner's admin voice (dormant until one is minted) ─────────────── */ |
| 28 | .trk-admin { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; |
| 29 | margin: 4px 0 8px; padding: 5px 8px; border-radius: var(--radius-sm); |
| 30 | background: var(--bg-secondary); border: 1px solid var(--border); } |
| 31 | .trk-admin-say { flex-basis: 100%; font-size: var(--fs-3xs-2xs); color: var(--text-muted); } |
| 32 | .trk-admin-in { flex: 1 1 auto; min-width: 0; padding: 4px 6px; font-size: var(--fs-2xs-xs); |
| 33 | background: var(--bg-tertiary); border: 1px solid var(--border); border-radius: var(--radius-sm); |
| 34 | color: var(--text-primary); } |
| 35 | .trk-admin-btn, .trk-admin-save, .trk-admin-cancel { |
| 36 | padding: 3px 8px; font-size: var(--fs-3xs-2xs); border-radius: var(--radius-sm); |
| 37 | border: 1px solid var(--border); background: var(--bg-tertiary); color: var(--text-secondary); cursor: pointer; } |
| 38 | .trk-admin-save { border-color: var(--accent); color: var(--accent-text); } |
| 39 | .trk-admin-btn:hover, .trk-admin-save:hover, .trk-admin-cancel:hover { border-color: var(--accent); } |
| 40 | |
| 41 | /* ── The board ────────────────────────────────────────────────────────── */ |
| 42 | /* A container query, NOT a viewport one: this board sits in the ~280px Proposals |
| 43 | * dock as well as at full width, so it must read its own width. The default is |
| 44 | * one scrollable column -- the four sections stacked, each keeping its heading, |
| 45 | * a readable decision queue; four columns only once #tracker-view has room for |
| 46 | * them (main/max view). overflow-x is a belt-and-braces for the wide branch. */ |
| 47 | .trk-board { display: grid; grid-template-columns: 1fr; |
| 48 | gap: 8px; overflow-x: auto; padding-bottom: 4px; } |
| 49 | @container tracker (min-width: 640px) { |
| 50 | .trk-board { grid-template-columns: repeat(4, minmax(150px, 1fr)); } |
| 51 | } |
| 52 | .trk-col { display: flex; flex-direction: column; gap: 6px; min-width: 0; } |
| 53 | .trk-col-head { display: flex; align-items: baseline; gap: 6px; padding: 2px 2px 4px; |
| 54 | border-bottom: 2px solid var(--border); } |
| 55 | .trk-col-label { font-weight: 600; font-size: var(--fs-2xs-xs); } |
| 56 | .trk-col-count { font-size: var(--fs-3xs); color: var(--text-muted); |
| 57 | font-variant-numeric: tabular-nums; } |
| 58 | .trk-col-empty { padding: 6px 2px; font-size: var(--fs-3xs); color: var(--text-muted); } |
| 59 | |
| 60 | /* The column tint: the same four hues the state chip used, on the header rule. */ |
| 61 | .trk-col[data-state="open"] .trk-col-head { border-bottom-color: var(--accent); } |
| 62 | .trk-col[data-state="accepted"] .trk-col-head { border-bottom-color: var(--ok); } |
| 63 | .trk-col[data-state="done"] .trk-col-head { border-bottom-color: var(--text-muted); } |
| 64 | .trk-col[data-state="declined"] .trk-col-head { border-bottom-color: var(--warn); } |
| 65 | |
| 66 | /* ── One card ─────────────────────────────────────────────────────────── */ |
| 67 | .trk-card { display: flex; flex-direction: column; gap: 4px; padding: 7px 8px; |
| 68 | border: 1px solid var(--border); border-radius: var(--radius-sm); |
| 69 | background: var(--bg-secondary); } |
| 70 | .trk-card-top { display: flex; align-items: baseline; gap: 6px; } |
| 71 | .trk-num { font-family: var(--font-mono); font-size: var(--fs-3xs-2xs); color: var(--text-muted); } |
| 72 | .trk-title { flex: 1 1 auto; min-width: 0; text-align: left; padding: 0; |
| 73 | background: none; border: none; color: var(--text-primary); font: inherit; cursor: pointer; } |
| 74 | .trk-title:hover { color: var(--accent-text); text-decoration: underline; } |
| 75 | .trk-card-meta { display: flex; flex-wrap: wrap; gap: 8px; font-size: var(--fs-3xs); color: var(--text-muted); } |
| 76 | |
| 77 | .trk-activity { font-size: var(--fs-3xs-2xs); color: var(--text-secondary); |
| 78 | line-height: 1.35; overflow-wrap: anywhere; } |
| 79 | |
| 80 | .trk-ship { display: flex; flex-wrap: wrap; align-items: baseline; gap: 5px; |
| 81 | font-size: var(--fs-3xs-2xs); color: var(--text-muted); } |
| 82 | .trk-ship-id { font-family: var(--font-mono); font-size: var(--fs-3xs-2xs); |
| 83 | padding: 1px 6px; border-radius: var(--radius-sm); border: 1px solid var(--border); |
| 84 | background: var(--bg-tertiary); color: var(--accent-text); cursor: pointer; } |
| 85 | .trk-ship-id:hover { border-color: var(--accent); text-decoration: underline; } |
| 86 | |
| 87 | /* The state chip, one colour per state — now only on the detail head. */ |
| 88 | .trk-state { font-size: var(--fs-3xs); padding: 1px 6px; border-radius: 999px; |
| 89 | border: 1px solid var(--border); color: var(--text-secondary); white-space: nowrap; } |
| 90 | .trk-state[data-state="open"] { color: var(--accent-text); border-color: var(--accent); } |
| 91 | .trk-state[data-state="accepted"] { color: var(--ok); border-color: var(--ok); } |
| 92 | .trk-state[data-state="done"] { color: var(--text-muted); } |
| 93 | .trk-state[data-state="declined"] { color: var(--warn); border-color: var(--warn); } |
| 94 | |
| 95 | .trk-tally { font-variant-numeric: tabular-nums; } |
| 96 | |
| 97 | /* ── One proposal in full ─────────────────────────────────────────────── */ |
| 98 | .trk-detail-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; } |
| 99 | .trk-back { padding: 3px 10px; font-size: var(--fs-3xs-2xs); border-radius: var(--radius-sm); |
| 100 | border: 1px solid var(--border); background: var(--bg-tertiary); color: var(--text-secondary); cursor: pointer; } |
| 101 | .trk-back:hover { border-color: var(--accent); } |
| 102 | .trk-detail-title { margin: 4px 0; font-size: var(--fs-sm); } |
| 103 | .trk-detail-meta { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 8px; |
| 104 | font-size: var(--fs-3xs-2xs); color: var(--text-muted); } |
| 105 | .trk-author { color: var(--text-secondary); } |
| 106 | .trk-mark { font-family: var(--font-mono); } |
| 107 | .trk-body { white-space: pre-wrap; line-height: 1.45; margin: 6px 0 10px; } |
| 108 | |
| 109 | .trk-settle { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; } |
| 110 | .trk-settle-btn { padding: 4px 10px; font-size: var(--fs-2xs-xs); border-radius: var(--radius-sm); |
| 111 | border: 1px solid var(--border-strong); background: var(--bg-tertiary); color: var(--text-secondary); cursor: pointer; } |
| 112 | .trk-settle-btn:hover { border-color: var(--accent); color: var(--accent-text); } |
| 113 | |
| 114 | .trk-sub { margin: 10px 0 4px; font-size: var(--fs-2xs-xs); color: var(--text-secondary); } |
| 115 | .trk-revisions, .trk-comments-list { margin-top: 8px; } |
| 116 | .trk-rev { display: flex; gap: 8px; padding: 3px 0; font-size: var(--fs-3xs-2xs); } |
| 117 | .trk-rev .trk-when { color: var(--text-muted); } |
| 118 | .trk-comment { padding: 6px 0; border-bottom: 1px solid var(--border); } |
| 119 | .trk-comment-said { white-space: pre-wrap; line-height: 1.4; } |
| 120 | .trk-comment-foot { display: flex; gap: 8px; margin-top: 2px; font-size: var(--fs-3xs); color: var(--text-muted); } |
| 121 | .trk-when { font-variant-numeric: tabular-nums; } |
| 122 | |
| 123 | /* ── Vote and comment (the pull voice, through the Social panel) ───────── */ |
| 124 | /* The upvote sits on the card and on the opened card; the comment box lives in |
| 125 | * the opened card where the thread is read. Both draw only when a tally is |
| 126 | * answered, and fall back to a "set a voice" affordance when none is held -- |
| 127 | * never a control the forge would refuse. The `.on` cast state matches the |
| 128 | * Social panel's own vote pill (accent-soft), so the two surfaces read alike. */ |
| 129 | .trk-vote { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 2px; } |
| 130 | .trk-vote-btn { padding: 2px 9px; font-size: var(--fs-3xs-2xs); border-radius: var(--radius-sm); |
| 131 | border: 1px solid var(--border); background: var(--bg-tertiary); color: var(--text-secondary); |
| 132 | cursor: pointer; font-variant-numeric: tabular-nums; } |
| 133 | .trk-vote-btn:hover { border-color: var(--accent); color: var(--accent-text); } |
| 134 | .trk-vote-btn.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-text); } |
| 135 | .trk-vote-count { font-size: var(--fs-3xs-2xs); color: var(--text-muted); font-variant-numeric: tabular-nums; } |
| 136 | |
| 137 | .trk-setvoice { padding: 2px 8px; font-size: var(--fs-3xs); border-radius: var(--radius-sm); |
| 138 | border: 1px solid var(--border); background: none; color: var(--accent-text); cursor: pointer; } |
| 139 | .trk-setvoice:hover { border-color: var(--accent); text-decoration: underline; } |
| 140 | |
| 141 | .trk-say-box { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; } |
| 142 | .trk-reply { width: 100%; min-height: 0; padding: 5px 7px; font: inherit; font-size: var(--fs-2xs-xs); |
| 143 | line-height: 1.4; background: var(--bg-tertiary); border: 1px solid var(--border); |
| 144 | border-radius: var(--radius-sm); color: var(--text-primary); resize: vertical; box-sizing: border-box; } |
| 145 | .trk-reply:focus { outline: none; border-color: var(--accent); } |
| 146 | .trk-say-acts { display: flex; gap: 6px; } |
| 147 | .trk-say-btn { padding: 4px 10px; font-size: var(--fs-2xs-xs); border-radius: var(--radius-sm); |
| 148 | border: 1px solid var(--accent); background: var(--bg-tertiary); color: var(--accent-text); cursor: pointer; } |
| 149 | .trk-say-btn:hover { background: var(--accent-soft); } |
| 150 | .trk-say-novoice { font-size: var(--fs-3xs-2xs); color: var(--text-muted); } |
| 151 | |
| 152 | /* The All/Mine filter above the board. "Mine" reads proposals raised from this |
| 153 | device (improve.js), so it is a client-side allow-list, not a server query. */ |
| 154 | .trk-filter { display: flex; gap: 6px; margin: 2px 0 8px; } |
| 155 | .trk-filter-btn { padding: 3px 10px; font-size: var(--fs-3xs-2xs); border-radius: var(--radius-sm); |
| 156 | border: 1px solid var(--border); background: var(--bg-tertiary); color: var(--text-secondary); |
| 157 | cursor: pointer; } |
| 158 | .trk-filter-btn:hover { border-color: var(--accent); } |
| 159 | .trk-filter-btn[aria-pressed="true"] { border-color: var(--accent); background: var(--accent-soft); |
| 160 | color: var(--accent-text); } |