_branches.scss
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2
feat: add repair-commit wire endpoint (API parity with repa…
Opus 4.8
minor
⚠ breaking
1 day ago
| 1 | // ───────────────────────────────────────────────────────────────────────────── |
| 2 | // Component: Branches (.br-* prefix) |
| 3 | // File: src/scss/components/_branches.scss |
| 4 | // |
| 5 | // Visual rules for the branches page. |
| 6 | // Structural layout lives in pages/_branches.scss. |
| 7 | // ───────────────────────────────────────────────────────────────────────────── |
| 8 | |
| 9 | // ── Stat strip ──────────────────────────────────────────────────────────────── |
| 10 | |
| 11 | .br-stat-strip { |
| 12 | background: var(--bg-surface); |
| 13 | border: 1px solid var(--border-default); |
| 14 | border-radius: var(--radius-md); |
| 15 | } |
| 16 | |
| 17 | .br-stat-divider { background: var(--border-default); } |
| 18 | |
| 19 | .br-stat-num { |
| 20 | font-size: 22px; |
| 21 | font-weight: var(--weight-bold); |
| 22 | font-family: var(--font-mono); |
| 23 | color: var(--text-primary); |
| 24 | line-height: 1; |
| 25 | |
| 26 | &--active { color: var(--color-success); } |
| 27 | &--ahead { color: var(--color-accent); } |
| 28 | &--authors { color: var(--color-orange); } |
| 29 | } |
| 30 | |
| 31 | .br-stat-lbl { |
| 32 | font-size: 11px; |
| 33 | color: var(--text-muted); |
| 34 | text-transform: uppercase; |
| 35 | letter-spacing: 0.06em; |
| 36 | font-weight: var(--weight-medium); |
| 37 | } |
| 38 | |
| 39 | // ── Default branch hero ─────────────────────────────────────────────────────── |
| 40 | |
| 41 | .br-default { |
| 42 | background: var(--bg-surface); |
| 43 | border: 1px solid var(--border-default); |
| 44 | border-left: 3px solid var(--color-accent); |
| 45 | border-radius: var(--radius-md); |
| 46 | } |
| 47 | |
| 48 | .br-default-eyebrow { |
| 49 | font-size: 10px; |
| 50 | font-weight: var(--weight-bold); |
| 51 | text-transform: uppercase; |
| 52 | letter-spacing: 0.08em; |
| 53 | color: var(--color-accent); |
| 54 | } |
| 55 | |
| 56 | .br-default-name { |
| 57 | font-size: 18px; |
| 58 | font-weight: var(--weight-bold); |
| 59 | color: var(--text-primary); |
| 60 | font-family: var(--font-mono); |
| 61 | } |
| 62 | |
| 63 | .br-default-commit { |
| 64 | font-size: 12px; |
| 65 | color: var(--text-muted); |
| 66 | } |
| 67 | |
| 68 | // ── Main card ───────────────────────────────────────────────────────────────── |
| 69 | |
| 70 | .br-card { |
| 71 | background: var(--bg-surface); |
| 72 | border: 1px solid var(--border-default); |
| 73 | border-radius: var(--radius-md); |
| 74 | overflow: hidden; |
| 75 | } |
| 76 | |
| 77 | // ── Toolbar ─────────────────────────────────────────────────────────────────── |
| 78 | |
| 79 | .br-toolbar { border-bottom: 1px solid var(--border-subtle); } |
| 80 | |
| 81 | .br-tab { |
| 82 | display: inline-flex; |
| 83 | align-items: center; |
| 84 | gap: 6px; |
| 85 | padding: 14px 12px; |
| 86 | font-size: 13px; |
| 87 | color: var(--text-muted); |
| 88 | text-decoration: none; |
| 89 | border-bottom: 2px solid transparent; |
| 90 | white-space: nowrap; |
| 91 | transition: color var(--transition-fast), border-color var(--transition-fast); |
| 92 | cursor: pointer; |
| 93 | background: none; |
| 94 | border-left: none; |
| 95 | border-right: none; |
| 96 | border-top: none; |
| 97 | |
| 98 | &:hover { color: var(--text-secondary); text-decoration: none; } |
| 99 | &.br-tab--active { |
| 100 | color: var(--text-primary); |
| 101 | border-bottom-color: var(--color-accent); |
| 102 | font-weight: var(--weight-semibold); |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | .br-tab-ct { |
| 107 | background: var(--bg-overlay); |
| 108 | border: 1px solid var(--border-subtle); |
| 109 | border-radius: var(--radius-full); |
| 110 | font-size: 10px; |
| 111 | font-weight: var(--weight-semibold); |
| 112 | padding: 1px 6px; |
| 113 | font-family: var(--font-mono); |
| 114 | min-width: 18px; |
| 115 | text-align: center; |
| 116 | color: var(--text-muted); |
| 117 | } |
| 118 | |
| 119 | .br-search { |
| 120 | display: flex; |
| 121 | align-items: center; |
| 122 | gap: 7px; |
| 123 | background: var(--bg-overlay); |
| 124 | border: 1px solid var(--border-subtle); |
| 125 | border-radius: var(--radius-sm); |
| 126 | padding: 5px 10px; |
| 127 | transition: border-color var(--transition-fast); |
| 128 | flex-shrink: 0; |
| 129 | |
| 130 | &:focus-within { border-color: var(--color-accent); } |
| 131 | |
| 132 | svg { color: var(--text-muted); flex-shrink: 0; } |
| 133 | |
| 134 | input { |
| 135 | background: none; |
| 136 | border: none; |
| 137 | outline: none; |
| 138 | font-size: 12px; |
| 139 | color: var(--text-primary); |
| 140 | width: 160px; |
| 141 | |
| 142 | &::placeholder { color: var(--text-muted); } |
| 143 | } |
| 144 | } |
| 145 | |
| 146 | // ── Branch rows ─────────────────────────────────────────────────────────────── |
| 147 | |
| 148 | .br-row { |
| 149 | border-bottom: 1px solid var(--border-subtle); |
| 150 | transition: background var(--transition-fast); |
| 151 | |
| 152 | &:last-child { border-bottom: none; } |
| 153 | &:hover { background: var(--bg-overlay); } |
| 154 | } |
| 155 | |
| 156 | .br-row-icon { |
| 157 | border-radius: var(--radius-sm); |
| 158 | |
| 159 | svg { width: 14px; height: 14px; display: block; } |
| 160 | } |
| 161 | |
| 162 | .br-icon--feature { background: color-mix(in srgb, var(--color-success) 12%, transparent); color: var(--color-success); } |
| 163 | .br-icon--experiment { background: color-mix(in srgb, var(--color-purple) 12%, transparent); color: var(--color-purple); } |
| 164 | .br-icon--fix { background: color-mix(in srgb, var(--color-danger) 12%, transparent); color: var(--color-danger); } |
| 165 | .br-icon--structure { background: color-mix(in srgb, var(--color-accent) 12%, transparent); color: var(--color-accent); } |
| 166 | .br-icon--collab { background: color-mix(in srgb, var(--color-orange) 12%, transparent); color: var(--color-orange); } |
| 167 | .br-icon--source { background: color-mix(in srgb, var(--color-teal) 12%, transparent); color: var(--color-teal); } |
| 168 | .br-icon--version { background: color-mix(in srgb, var(--color-warning) 12%, transparent); color: var(--color-warning); } |
| 169 | .br-icon--default { background: color-mix(in srgb, var(--color-accent) 12%, transparent); color: var(--color-accent); } |
| 170 | |
| 171 | .br-name { |
| 172 | font-size: 14px; |
| 173 | font-weight: var(--weight-semibold); |
| 174 | color: var(--text-primary); |
| 175 | font-family: var(--font-mono); |
| 176 | } |
| 177 | |
| 178 | .br-type-badge { |
| 179 | display: inline-block; |
| 180 | padding: 1px 7px; |
| 181 | border-radius: var(--radius-sm); |
| 182 | font-size: 10px; |
| 183 | font-weight: var(--weight-bold); |
| 184 | font-family: var(--font-mono); |
| 185 | text-transform: uppercase; |
| 186 | letter-spacing: 0.04em; |
| 187 | } |
| 188 | |
| 189 | .br-badge--feature { background: color-mix(in srgb, var(--color-success) 12%, transparent); color: var(--color-success); border: 1px solid color-mix(in srgb, var(--color-success) 25%, transparent); } |
| 190 | .br-badge--experiment { background: color-mix(in srgb, var(--color-purple) 12%, transparent); color: var(--color-purple); border: 1px solid color-mix(in srgb, var(--color-purple) 25%, transparent); } |
| 191 | .br-badge--fix { background: color-mix(in srgb, var(--color-danger) 12%, transparent); color: var(--color-danger); border: 1px solid color-mix(in srgb, var(--color-danger) 25%, transparent); } |
| 192 | .br-badge--structure { background: color-mix(in srgb, var(--color-accent) 12%, transparent); color: var(--color-accent); border: 1px solid color-mix(in srgb, var(--color-accent) 25%, transparent); } |
| 193 | .br-badge--collab { background: color-mix(in srgb, var(--color-orange) 12%, transparent); color: var(--color-orange); border: 1px solid color-mix(in srgb, var(--color-orange) 25%, transparent); } |
| 194 | .br-badge--source { background: color-mix(in srgb, var(--color-teal) 12%, transparent); color: var(--color-teal); border: 1px solid color-mix(in srgb, var(--color-teal) 25%, transparent); } |
| 195 | .br-badge--version { background: color-mix(in srgb, var(--color-warning) 12%, transparent); color: var(--color-warning); border: 1px solid color-mix(in srgb, var(--color-warning) 25%, transparent); } |
| 196 | |
| 197 | .br-commit-line { font-size: 12px; color: var(--text-muted); } |
| 198 | |
| 199 | .br-sha { |
| 200 | font-family: var(--font-mono); |
| 201 | font-size: 11px; |
| 202 | color: var(--color-accent-link); |
| 203 | text-decoration: none; |
| 204 | flex-shrink: 0; |
| 205 | &:hover { text-decoration: underline; } |
| 206 | } |
| 207 | |
| 208 | .br-commit-msg { |
| 209 | color: var(--text-muted); |
| 210 | white-space: nowrap; |
| 211 | overflow: hidden; |
| 212 | text-overflow: ellipsis; |
| 213 | } |
| 214 | |
| 215 | .br-meta-line { font-size: 11px; color: var(--text-muted); } |
| 216 | |
| 217 | .br-author { color: var(--text-secondary); } |
| 218 | |
| 219 | .br-avatar { |
| 220 | width: 14px; |
| 221 | height: 14px; |
| 222 | border-radius: 50%; |
| 223 | display: inline-flex; |
| 224 | align-items: center; |
| 225 | justify-content: center; |
| 226 | font-size: 7px; |
| 227 | font-weight: var(--weight-bold); |
| 228 | color: #fff; |
| 229 | flex-shrink: 0; |
| 230 | } |
| 231 | |
| 232 | .br-meta-dot { color: var(--border-default); } |
| 233 | |
| 234 | // ── Divergence ──────────────────────────────────────────────────────────────── |
| 235 | |
| 236 | .br-div-line { font-size: 11px; } |
| 237 | |
| 238 | .br-behind { color: var(--color-danger); font-family: var(--font-mono); } |
| 239 | .br-ahead { color: var(--color-success); font-family: var(--font-mono); } |
| 240 | .br-uptodate { color: var(--color-success); } |
| 241 | |
| 242 | .br-div-track { |
| 243 | background: var(--bg-overlay); |
| 244 | border-radius: var(--radius-full); |
| 245 | } |
| 246 | |
| 247 | .br-div-behind { background: var(--color-danger); height: 100%; } |
| 248 | .br-div-ahead { background: var(--color-success); height: 100%; } |
| 249 | |
| 250 | // ── Domain dimension scores ─────────────────────────────────────────────────── |
| 251 | |
| 252 | .br-dim { font-size: 10px; color: var(--text-muted); } |
| 253 | |
| 254 | .br-dim-label { |
| 255 | font-family: var(--font-mono); |
| 256 | text-transform: uppercase; |
| 257 | letter-spacing: 0.03em; |
| 258 | flex-shrink: 0; |
| 259 | min-width: 28px; |
| 260 | } |
| 261 | |
| 262 | .br-dim-track { |
| 263 | background: var(--bg-overlay); |
| 264 | border-radius: var(--radius-full); |
| 265 | } |
| 266 | |
| 267 | .br-dim-fill { |
| 268 | height: 100%; |
| 269 | background: var(--color-accent); |
| 270 | border-radius: var(--radius-full); |
| 271 | } |
| 272 | |
| 273 | // ── Empty state ─────────────────────────────────────────────────────────────── |
| 274 | |
| 275 | .br-empty { color: var(--text-muted); } |
| 276 | .br-empty-icon { opacity: 0.3; margin-bottom: var(--space-1); } |
| 277 | .br-empty-title { font-size: 18px; font-weight: var(--weight-semibold); color: var(--text-secondary); } |
| 278 | .br-empty-desc { font-size: 14px; max-width: 380px; line-height: 1.6; } |
File History
1 commit
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2
feat: add repair-commit wire endpoint (API parity with repa…
Opus 4.8
minor
⚠
1 day ago