gabriel / musehub public
_blob.scss
279 lines 7.5 KB
Raw
sha256:1dd27e6d5c24550177b01b0a171e8375c07cf046b549e7683364706b6522d3bc docs(#139): mark all 11 checklist items resolved, document … Sonnet 5 12 days ago
1 // ─────────────────────────────────────────────────────────────────────────────
2 // Page: Blob viewer (.blob2-* layout)
3 // File: src/scss/pages/_blob.scss
4 //
5 // STRUCTURAL LAYOUT ONLY — zero colors, zero typography here.
6 // Visual rules live in components/_blob.scss.
7 // Covers: blob.html, blame.html
8 // ─────────────────────────────────────────────────────────────────────────────
9
10 // ── Two-column layout ─────────────────────────────────────────────────────────
11
12 .blob2-layout {
13 display: grid;
14 grid-template-columns: 1fr;
15 gap: var(--space-4);
16 align-items: start;
17 min-height: 0;
18
19 &.blob2-panel-open {
20 grid-template-columns: 1fr 280px;
21 }
22
23 @media (max-width: 960px) {
24 &.blob2-panel-open { grid-template-columns: 1fr; }
25 }
26 }
27
28 .blob2-main {
29 display: flex;
30 flex-direction: column;
31 min-width: 0;
32 }
33
34 // ── Header bar ────────────────────────────────────────────────────────────────
35
36 .blob2-header {
37 display: flex;
38 align-items: center;
39 gap: var(--space-3);
40 padding: 8px 14px;
41 border-radius: var(--radius-md) var(--radius-md) 0 0;
42 }
43
44 .blob2-header-left {
45 display: flex;
46 align-items: center;
47 gap: 7px;
48 flex: 1;
49 min-width: 0;
50 }
51
52 .blob2-lang-dot {
53 width: 10px;
54 height: 10px;
55 flex-shrink: 0;
56 }
57
58 .blob2-header-meta {
59 display: flex;
60 align-items: center;
61 gap: var(--space-2);
62 flex-wrap: wrap;
63 flex-shrink: 0;
64 }
65
66 .blob2-meta-pill { padding: 2px 8px; }
67
68 .blob2-header-actions {
69 display: flex;
70 align-items: center;
71 gap: var(--space-2);
72 flex-shrink: 0;
73 }
74
75 // ── Last-modified bar ─────────────────────────────────────────────────────────
76
77 .blob2-lastmod {
78 display: flex;
79 align-items: center;
80 gap: 8px;
81 padding: 6px 14px;
82 flex-wrap: wrap;
83 }
84
85 .blob2-lastmod-sha { padding: 1px 6px; }
86
87 // ── Content area ──────────────────────────────────────────────────────────────
88
89 .blob2-content {
90 position: relative;
91 overflow: hidden;
92 }
93
94 .blob2-viewer { overflow-x: auto; }
95
96 .blob2-markdown { padding: var(--space-6) var(--space-7); }
97
98 // ── Code line table ───────────────────────────────────────────────────────────
99
100 .blob2-line-table {
101 width: 100%;
102 border-collapse: collapse;
103 border-spacing: 0;
104 }
105
106 .blob2-ln {
107 padding: 0 12px;
108 width: 1%;
109 white-space: nowrap;
110 text-align: right;
111 vertical-align: top;
112 user-select: none;
113 }
114
115 .blob2-code {
116 padding: 0 16px 0 12px;
117 white-space: pre;
118 width: 100%;
119 }
120
121 .blob2-binary-notice {
122 display: flex;
123 flex-direction: column;
124 align-items: center;
125 gap: var(--space-3);
126 padding: var(--space-10) var(--space-6);
127 text-align: center;
128 }
129
130 .blob2-empty { padding: var(--space-4) var(--space-4); }
131
132 .blob2-not-found {
133 display: flex;
134 flex-direction: column;
135 align-items: center;
136 gap: var(--space-3);
137 padding: var(--space-10) var(--space-6);
138 text-align: center;
139 }
140
141 // ── MIDI banner ───────────────────────────────────────────────────────────────
142
143 .blob2-midi-banner {
144 display: flex;
145 flex-direction: column;
146 align-items: center;
147 gap: var(--space-4);
148 padding: var(--space-8) var(--space-6);
149 text-align: center;
150 }
151
152 // ── Permalink float ───────────────────────────────────────────────────────────
153
154 .blob2-permalink-btn {
155 position: fixed;
156 bottom: var(--space-5);
157 right: var(--space-5);
158 display: flex;
159 align-items: center;
160 gap: 5px;
161 padding: 6px 14px;
162 z-index: var(--z-raised);
163 }
164
165 // ── File history timeline ─────────────────────────────────────────────────────
166
167 .blob2-history { margin-top: var(--space-4); }
168
169 .blob2-history-header {
170 display: flex;
171 align-items: center;
172 gap: 8px;
173 padding: 8px 14px;
174 }
175
176 .blob2-history-count { padding: 1px 7px; }
177
178 .blob2-history-row {
179 display: flex;
180 align-items: center;
181 gap: 8px;
182 padding: 7px 14px;
183 flex-wrap: wrap;
184 }
185
186 .blob2-history-sha { padding: 1px 6px; }
187
188 .blob2-history-prov {
189 display: flex;
190 align-items: center;
191 gap: 5px;
192 }
193
194 .blob2-history-time { margin-left: auto; }
195
196 // ── Outline panel ─────────────────────────────────────────────────────────────
197
198 // Bounded height, not position: sticky, and deliberately NOT converted
199 // to the app-shell pattern (issue #139) — this panel self-caps its own
200 // height directly against the viewport rather than matching a sibling
201 // column's height, so it works fine within this page's normal document
202 // scroll. The inner .blob2-panel-pane (flex: 1; overflow-y: auto) is the
203 // actual independently-scrolling region; this just caps the panel's own
204 // height.
205 .blob2-panel {
206 max-height: calc(100dvh - var(--sticky-offset, var(--header-height)) - var(--space-8));
207 overflow: hidden;
208 display: flex;
209 flex-direction: column;
210
211 @media (max-width: 900px) {
212 max-height: none;
213 overflow-y: visible;
214 }
215 }
216
217 .blob2-panel-tabs {
218 display: flex;
219 align-items: center;
220 padding: 0 4px;
221 flex-shrink: 0;
222 }
223
224 .blob2-panel-tab {
225 padding: 8px 12px;
226 flex-shrink: 0;
227 }
228
229 .blob2-panel-pane {
230 overflow-y: auto;
231 flex: 1;
232 }
233
234 .blob2-panel-empty { padding: var(--space-4); }
235
236 // ── Outline rows ──────────────────────────────────────────────────────────────
237
238 .blob2-outline-row {
239 display: flex;
240 align-items: center;
241 gap: 7px;
242 padding: 5px 12px;
243 cursor: pointer;
244 }
245
246 .blob2-outline-op { padding: 1px 5px; }
247 .blob2-outline-addr { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
248 .blob2-outline-count { padding: 1px 5px; flex-shrink: 0; }
249 .blob2-outline-time { flex-shrink: 0; }
250
251 // ── Info tab rows ─────────────────────────────────────────────────────────────
252
253 .blob2-info-section--sep { padding-top: var(--space-3); margin-top: var(--space-3); }
254
255 .blob2-info-row {
256 display: flex;
257 align-items: flex-start;
258 gap: var(--space-2);
259 padding: 3px 12px;
260 }
261
262 .blob2-info-label { min-width: 64px; flex-shrink: 0; }
263
264 .blob2-info-value { flex: 1; min-width: 0; }
265
266 .blob2-info-label-block { padding: var(--space-2) 12px 2px; }
267
268 .blob2-info-addr {
269 display: flex;
270 align-items: center;
271 gap: 5px;
272 padding: 3px 12px;
273 }
274
275 .blob2-copy-addr {
276 display: flex;
277 align-items: center;
278 padding: 2px;
279 }
File History 2 commits
sha256:1dd27e6d5c24550177b01b0a171e8375c07cf046b549e7683364706b6522d3bc docs(#139): mark all 11 checklist items resolved, document … Sonnet 5 12 days ago
sha256:649011bedd713e22f7dca4c4be94bdefbf3b10950d9fc80235928d0b0b823be8 docs: track issue #139 (two-column app-shell refactor) plan… Sonnet 5 12 days ago