편집 요약 없음 |
편집 요약 없음 |
||
| (같은 사용자의 중간 판 35개는 보이지 않습니다) | |||
| 2번째 줄: | 2번째 줄: | ||
COASTLINE: BLACK ICE | COASTLINE: BLACK ICE | ||
MediaWiki:Test.css | MediaWiki:Test.css | ||
Sandbox- | Sandbox main-page integration test | ||
Existing full portal body + SVG category nav from CategoryNav.js | |||
========================================= */ | ========================================= */ | ||
/* | /* | ||
Scope: | Scope: | ||
- This file is globally imported. | - This file is globally imported while the test page is still active. | ||
- Every visual rule is scoped to .stylelab. | - Every visual rule is scoped to .stylelab, except the bridge for nested .main-portal. | ||
- No body, top-nav, sidebar, page shell, or global layout selectors. | - No body, top-nav, sidebar, page shell, or global layout selectors. | ||
Current role: | |||
- Test.css still owns the full test page layout: notice rail, logo, console, image feed, guestbook, tracker, status, footer. | |||
- MainPage.css + CategoryNav.js own the SVG category navigation. | |||
- This file only provides a bridge so the new JS/SVG category nav can sit inside the old test body without double padding or background. | |||
Cleanup plan: | |||
- After the full main page is migrated, these .stylelab rules should be renamed or moved into MainPage.css as .main-portal components. | |||
- Then Test.css can be removed from Common.css import. | |||
*/ | */ | ||
| 19번째 줄: | 28번째 줄: | ||
.stylelab { | .stylelab { | ||
--surface-page:#070707; | --surface-page:#070707; | ||
--surface-frame:#101010; | --surface-frame:#101010; | ||
--surface-frame-soft:#141414; | --surface-frame-soft:#141414; | ||
| 25번째 줄: | 33번째 줄: | ||
--surface-title-hover:#252525; | --surface-title-hover:#252525; | ||
--surface-well:#080808; | --surface-well:#080808; | ||
--surface-screen:#060606; | |||
--surface-row:#121212; | --surface-row:#121212; | ||
--surface-row-alt:#151515; | --surface-row-alt:#151515; | ||
--surface-inset:#070707; | |||
--edge-top:#555555; | --edge-top:#555555; | ||
| 33번째 줄: | 43번째 줄: | ||
--edge-soft:#202020; | --edge-soft:#202020; | ||
--edge-mid:#333333; | --edge-mid:#333333; | ||
--edge-weak:#181818; | |||
--text-main:#e2e2e2; | --text-main:#e2e2e2; | ||
| 47번째 줄: | 58번째 줄: | ||
--wip-yellow:#f2c300; | --wip-yellow:#f2c300; | ||
--wip-black:#050505; | --wip-black:#050505; | ||
-- | --space-block:8px; | ||
-- | --space-inner:6px; | ||
--pad:8px; | --space-tight:4px; | ||
--pad-panel:8px; | |||
--title-h:24px; | --title-h:24px; | ||
--row-h: | --screen-title-h:22px; | ||
--nav-h:30px; | |||
--ticker-h:22px; | |||
--row-h:23px; | |||
--gauge-h:48px; | |||
width:100%; | width:100%; | ||
margin:0 auto; | margin:0 auto; | ||
padding:var(-- | padding:var(--space-block); | ||
color:var(--text-main); | color:var(--text-main); | ||
background:var(--surface-page); | background:var(--surface-page); | ||
| 79번째 줄: | 95번째 줄: | ||
.stylelab a:hover { | .stylelab a:hover { | ||
color:#ffffff !important; | color:#ffffff !important; | ||
text-decoration: | text-decoration:none !important; | ||
} | } | ||
| 89번째 줄: | 105번째 줄: | ||
.stylelab .frame, | .stylelab .frame, | ||
.stylelab .notice-rail, | |||
.stylelab .lab-logo, | .stylelab .lab-logo, | ||
.stylelab .console, | .stylelab .console, | ||
.stylelab .panel, | .stylelab .panel, | ||
.stylelab .instrument-panel, | |||
.stylelab .ticker { | .stylelab .ticker { | ||
border:1px solid; | border:1px solid; | ||
| 109번째 줄: | 126번째 줄: | ||
.stylelab .titlebar { | .stylelab .titlebar { | ||
position:relative; | position:relative; | ||
height:var(--title-h); | |||
min-height:var(--title-h); | min-height:var(--title-h); | ||
padding:0 var(--pad); | padding:0 var(--pad-panel); | ||
display:flex; | display:flex; | ||
align-items:center; | align-items:center; | ||
justify-content:space-between; | justify-content:space-between; | ||
gap:var(-- | gap:var(--space-block); | ||
background:var(--surface-title); | background:var(--surface-title); | ||
border-bottom:1px solid var(--edge-bottom); | border-bottom:1px solid var(--edge-bottom); | ||
| 120번째 줄: | 138번째 줄: | ||
font-size:10px; | font-size:10px; | ||
font-weight:700; | font-weight:700; | ||
line-height: | line-height:1; | ||
white-space:nowrap; | white-space:nowrap; | ||
overflow:hidden; | overflow:hidden; | ||
| 126번째 줄: | 144번째 줄: | ||
} | } | ||
.stylelab .titlebar span { | .stylelab .titlebar > span { | ||
display:block; | |||
min-width:0; | |||
overflow:hidden; | |||
text-overflow:ellipsis; | |||
} | |||
.stylelab .titlebar > span:first-child { | |||
flex:1 1 auto; | |||
} | |||
.stylelab .titlebar > span:last-child { | |||
flex:0 0 auto; | |||
color:#a8a8a8; | |||
font-weight:700; | |||
text-align:right; | |||
} | |||
/* ----------------------------------------- | |||
2. Notice rail | |||
Important notices above logo. | |||
Maintenance alert uses construction stripe on the whole row. | |||
Normal notice remains neutral. | |||
----------------------------------------- */ | |||
.stylelab .notice-rail { | |||
width:100%; | |||
margin:0 0 var(--space-block); | |||
background:#101010; | |||
border:1px solid; | |||
border-color: | |||
#606060 | |||
var(--edge-side) | |||
var(--edge-bottom) | |||
var(--edge-side); | |||
box-shadow:none; | |||
} | |||
.stylelab .notice-line { | |||
position:relative; | |||
display:grid; | |||
grid-template-columns:72px 96px minmax(0,1fr) 48px; | |||
align-items:center; | |||
gap:7px; | |||
min-height:30px; | |||
padding:0 8px; | |||
border-bottom:1px solid #050505; | |||
background:#141414; | |||
font-size:12px; | |||
line-height:1.25; | |||
color:#dcdcdc; | |||
overflow:hidden; | |||
} | |||
.stylelab .notice-line:last-child { | |||
border-bottom:none; | |||
} | |||
.stylelab .notice-line > * { | |||
position:relative; | |||
z-index:2; | |||
} | |||
.stylelab .notice-line:hover { | |||
background:#1c1c1c; | |||
color:#ffffff; | |||
} | |||
.stylelab .notice-line.is-alert { | |||
background: | |||
repeating-linear-gradient( | |||
45deg, | |||
var(--wip-yellow) 0 9px, | |||
var(--wip-yellow) 9px 10px, | |||
var(--wip-black) 10px 19px, | |||
var(--wip-black) 19px 20px | |||
); | |||
} | |||
.stylelab .notice-line.is-alert::before { | |||
content:""; | |||
position:absolute; | |||
inset:0; | |||
z-index:1; | |||
pointer-events:none; | |||
background:rgba(0,0,0,0.42); | |||
} | |||
.stylelab .notice-line.is-alert:hover::before { | |||
background:rgba(0,0,0,0.34); | |||
} | |||
.stylelab .notice-line.is-notice { | |||
background:#141414; | |||
} | |||
.stylelab .notice-line.is-notice:hover { | |||
background:#1c1c1c; | |||
} | |||
.stylelab .notice-badge { | |||
display:inline-flex; | |||
align-items:center; | |||
justify-content:center; | |||
height:20px; | |||
padding:0 7px; | |||
border:1px solid #444444; | |||
background:#0b0b0b; | |||
color:#d8d8d8; | |||
font-size:10px; | |||
font-weight:700; | |||
line-height:1; | |||
text-shadow:1px 1px 0 #000; | |||
} | |||
.stylelab .notice-line.is-alert .notice-badge, | |||
.stylelab .notice-line.is-notice .notice-badge { | |||
border-color:#505050; | |||
background:#101010; | |||
color:#eeeeee; | |||
} | |||
.stylelab .notice-date { | |||
color:#9d9d9d; | |||
white-space:nowrap; | |||
font-size:10px; | |||
font-family:Consolas, Monaco, monospace !important; | |||
} | |||
.stylelab .notice-text { | |||
min-width:0; | |||
overflow:hidden; | overflow:hidden; | ||
text-overflow:ellipsis; | text-overflow:ellipsis; | ||
white-space:nowrap; | |||
color:#e0e0e0; | |||
font-size:12px; | |||
font-weight:700; | |||
} | |||
.stylelab .notice-line.is-alert .notice-badge, | |||
.stylelab .notice-line.is-alert .notice-date, | |||
.stylelab .notice-line.is-alert .notice-text, | |||
.stylelab .notice-line.is-alert .notice-action { | |||
text-shadow: | |||
-1px 0 0 #000, | |||
1px 0 0 #000, | |||
0 -1px 0 #000, | |||
0 1px 0 #000, | |||
-1px -1px 0 #000, | |||
1px -1px 0 #000, | |||
-1px 1px 0 #000, | |||
1px 1px 0 #000; | |||
} | |||
.stylelab .notice-line:hover .notice-text { | |||
color:#ffffff; | |||
} | } | ||
.stylelab . | .stylelab .notice-action { | ||
border:1px solid | justify-self:end; | ||
display:inline-flex; | |||
align-items:center; | |||
justify-content:center; | |||
height:20px; | |||
min-width:38px; | |||
padding:0 5px; | |||
border:1px solid #3a3a3a; | |||
background:#0b0b0b; | |||
color:#c8c8c8; | |||
font-size:10px; | |||
font-weight:700; | |||
white-space:nowrap; | |||
line-height:1; | |||
} | |||
.stylelab .notice-line:hover .notice-action { | |||
border-color:#606060; | |||
background:#181818; | |||
color:#ffffff; | |||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
3. Top logo | |||
Site signboard. Placed before category navigation and content. | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
.stylelab .lab-logo { | .stylelab .lab-logo { | ||
width:100%; | width:100%; | ||
margin:0 0 var(-- | height:auto; | ||
margin:0 0 var(--space-block); | |||
padding:10px 0 8px; | padding:10px 0 8px; | ||
text-align:center; | text-align:center; | ||
line-height:0; | line-height:0; | ||
background:#0b0b0b; | |||
} | } | ||
| 156번째 줄: | 348번째 줄: | ||
.stylelab .lab-logo img, | .stylelab .lab-logo img, | ||
.stylelab .lab-logo .mw-file-element { | .stylelab .lab-logo .mw-file-element { | ||
width: | width:760px; | ||
max-width: | max-width:90%; | ||
height:auto; | height:auto; | ||
filter: | filter: | ||
| 166번째 줄: | 358번째 줄: | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
4. Category navigation bridge | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
. | /* | ||
The actual category navigation is now generated by CategoryNav.js | |||
and styled by MainPage.css as SVG. | |||
.stylelab . | Why this bridge exists: | ||
.stylelab . | - The old full test body is still wrapped in .stylelab. | ||
- MainPage.css expects a .main-portal wrapper. | |||
- If .main-portal keeps its own padding/background inside .stylelab, the category nav gets a double frame and the ratio feels different from the original body. | |||
.stylelab . | So, inside .stylelab, .main-portal is treated as a transparent mount wrapper only. | ||
The SVG nav itself remains owned by MainPage.css. | |||
*/ | |||
.stylelab . | .stylelab .main-portal { | ||
width:100%; | |||
margin:0; | |||
padding:0; | |||
background:transparent; | |||
font-size:11px; | |||
line-height:1.5; | |||
} | } | ||
.stylelab . | .stylelab .main-portal [data-component="category-nav"] { | ||
width:100%; | |||
margin:0 0 var(--space-block); | |||
padding:0; | |||
width:100% | |||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
5. Main console | |||
Type: SCREEN DEVICE | |||
frame > titlebar > body > screen panels | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
.stylelab .console { | .stylelab .console { | ||
width:100%; | width:100%; | ||
margin:0 0 var(-- | margin:0 0 var(--space-block); | ||
padding:var(-- | padding:0; | ||
} | |||
.stylelab .console-body { | |||
padding:var(--space-inner); | |||
background:var(--surface-frame); | |||
} | } | ||
| 231번째 줄: | 409번째 줄: | ||
display:grid; | display:grid; | ||
grid-template-columns:minmax(0,1fr) 260px; | grid-template-columns:minmax(0,1fr) 260px; | ||
gap:var(-- | gap:var(--space-inner); | ||
align-items:stretch; | |||
} | } | ||
.stylelab .main-screen, | .stylelab .main-screen, | ||
.stylelab .side-screen { | .stylelab .side-screen { | ||
position:relative; | |||
min-width:0; | min-width:0; | ||
height:100%; | |||
overflow:hidden; | |||
border:1px solid var(--edge-soft); | border:1px solid var(--edge-soft); | ||
background:var(--surface- | background:var(--surface-screen); | ||
box-shadow: | |||
inset 0 0 0 1px rgba(255,255,255,0.018), | |||
inset 0 0 18px rgba(0,0,0,0.70); | |||
} | |||
.stylelab .main-screen::before, | |||
.stylelab .side-screen::before { | |||
content:""; | |||
position:absolute; | |||
inset:0; | |||
z-index:6; | |||
pointer-events:none; | |||
background: | |||
radial-gradient( | |||
ellipse at 50% 42%, | |||
rgba(255,255,255,0.030) 0%, | |||
transparent 42% | |||
), | |||
linear-gradient( | |||
to bottom, | |||
rgba(255,255,255,0.030) 0%, | |||
transparent 24%, | |||
rgba(0,0,0,0.16) 100% | |||
); | |||
} | |||
.stylelab .main-screen::after, | |||
.stylelab .side-screen::after { | |||
content:""; | |||
position:absolute; | |||
inset:-40px 0; | |||
z-index:7; | |||
pointer-events:none; | |||
opacity:0.13; | |||
background: | |||
repeating-linear-gradient( | |||
to bottom, | |||
rgba(255,255,255,0.080) 0px, | |||
rgba(255,255,255,0.080) 1px, | |||
transparent 2px, | |||
transparent 5px | |||
); | |||
mix-blend-mode:screen; | |||
} | |||
.stylelab .main-screen > *, | |||
.stylelab .side-screen > * { | |||
position:relative; | |||
z-index:3; | |||
} | } | ||
.stylelab .main-screen { | .stylelab .main-screen { | ||
min-height: | min-height:392px; | ||
padding: | padding:var(--pad-panel); | ||
display:flex; | |||
flex-direction:column; | |||
justify-content:flex-start; | |||
} | |||
.stylelab .side-screen { | |||
padding:var(--pad-panel); | |||
display:flex; | |||
flex-direction:column; | |||
} | |||
/* ----------------------------------------- | |||
6. Image feed crossfade + alternating drift | |||
Current image fades down, next layer becomes visible. | |||
Image drift alternates: left-down / right-down. | |||
----------------------------------------- */ | |||
.stylelab .image-feed { | |||
position:relative; | |||
width:100%; | |||
height:240px; | |||
min-height:240px; | |||
overflow:hidden; | |||
border:1px solid var(--edge-soft); | |||
background:#030303; | |||
isolation:isolate; | |||
} | |||
.stylelab .feed-layer { | |||
position:absolute; | |||
inset:-12px; | |||
z-index:1; | |||
opacity:0; | |||
background-size:cover; | |||
background-position:center center; | |||
background-repeat:no-repeat; | |||
filter: | |||
brightness(0.78) | |||
contrast(1.12) | |||
saturate(0.78) | |||
grayscale(0.16); | |||
transform:translate(0,0) scale(1.06); | |||
transform-origin:center center; | |||
will-change:opacity, transform; | |||
animation-duration:24s; | |||
animation-timing-function:linear; | |||
animation-iteration-count:infinite; | |||
} | |||
.stylelab .feed-bg-001 { | |||
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-001.png'); | |||
} | |||
.stylelab .feed-bg-002 { | |||
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-002.png'); | |||
} | |||
.stylelab .feed-bg-003 { | |||
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-003.png'); | |||
} | |||
.stylelab .feed-bg-004 { | |||
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-004.png'); | |||
} | |||
.stylelab .feed-layer-1 { | |||
animation-name:image-feed-drift-left; | |||
animation-delay:0s; | |||
} | |||
.stylelab .feed-layer-2 { | |||
animation-name:image-feed-drift-right; | |||
animation-delay:6s; | |||
} | |||
.stylelab .feed-layer-3 { | |||
animation-name:image-feed-drift-left; | |||
animation-delay:12s; | |||
} | } | ||
.stylelab . | .stylelab .feed-layer-4 { | ||
margin:0 0 | animation-name:image-feed-drift-right; | ||
animation-delay:18s; | |||
} | |||
@keyframes image-feed-drift-left { | |||
0% { | |||
opacity:0; | |||
transform:translate(0,0) scale(1.06); | |||
} | |||
4.166% { | |||
opacity:1; | |||
transform:translate(0,0) scale(1.06); | |||
} | |||
25% { | |||
opacity:1; | |||
transform:translate(-22px,14px) scale(1.075); | |||
} | |||
29.166% { | |||
opacity:0; | |||
transform:translate(-26px,16px) scale(1.078); | |||
} | |||
100% { | |||
opacity:0; | |||
transform:translate(0,0) scale(1.06); | |||
} | |||
} | |||
@keyframes image-feed-drift-right { | |||
0% { | |||
opacity:0; | |||
transform:translate(0,0) scale(1.06); | |||
} | |||
4.166% { | |||
opacity:1; | |||
transform:translate(0,0) scale(1.06); | |||
} | |||
25% { | |||
opacity:1; | |||
transform:translate(22px,14px) scale(1.075); | |||
} | |||
29.166% { | |||
opacity:0; | |||
transform:translate(26px,16px) scale(1.078); | |||
} | |||
100% { | |||
opacity:0; | |||
transform:translate(0,0) scale(1.06); | |||
} | |||
} | |||
.stylelab .image-feed::before { | |||
content:""; | |||
position:absolute; | |||
inset:0; | |||
z-index:5; | |||
pointer-events:none; | |||
background: | |||
linear-gradient( | |||
to bottom, | |||
rgba(0,0,0,0.18) 0%, | |||
transparent 22%, | |||
transparent 74%, | |||
rgba(0,0,0,0.30) 100% | |||
), | |||
linear-gradient( | |||
to right, | |||
rgba(0,0,0,0.22) 0%, | |||
transparent 10%, | |||
transparent 90%, | |||
rgba(0,0,0,0.22) 100% | |||
); | |||
} | |||
.stylelab .image-feed::after { | |||
content:""; | |||
position:absolute; | |||
inset:-40px 0; | |||
z-index:6; | |||
pointer-events:none; | |||
opacity:0.20; | |||
background: | |||
repeating-linear-gradient( | |||
to bottom, | |||
rgba(255,255,255,0.090) 0px, | |||
rgba(255,255,255,0.090) 1px, | |||
transparent 2px, | |||
transparent 5px | |||
); | |||
mix-blend-mode:screen; | |||
} | |||
.stylelab .feed-caption { | |||
position:absolute; | |||
left:0; | |||
right:0; | |||
bottom:0; | |||
z-index:8; | |||
height:22px; | |||
padding:0 7px; | |||
display:flex; | |||
align-items:center; | |||
justify-content:space-between; | |||
gap:8px; | |||
border-top:1px solid rgba(255,255,255,0.09); | |||
background:rgba(5,5,5,0.86); | |||
color:#cfcfcf; | |||
font-size:10px; | |||
line-height:22px; | |||
text-shadow:1px 1px 0 #000; | |||
} | |||
.stylelab .feed-caption span:first-child { | |||
min-width:0; | |||
overflow:hidden; | |||
text-overflow:ellipsis; | |||
white-space:nowrap; | |||
} | |||
.stylelab .feed-caption span:last-child { | |||
flex:0 0 auto; | |||
color:var(--text-dim); | |||
} | |||
/* ----------------------------------------- | |||
7. Statement plate below image feed | |||
----------------------------------------- */ | |||
.stylelab .statement-plate { | |||
margin:var(--space-inner) 0 0; | |||
padding:13px 18px 12px; | |||
border:1px solid var(--edge-soft); | |||
background:#080808; | |||
} | |||
.stylelab .statement-plate h2 { | |||
margin:0 0 10px !important; | |||
padding:0 0 8px !important; | padding:0 0 8px !important; | ||
border-bottom:1px solid var(--edge-soft) !important; | border-bottom:1px solid var(--edge-soft) !important; | ||
color:#f4f4f4 !important; | color:#f4f4f4 !important; | ||
font-size: | font-size:20px !important; | ||
line-height:1.25 !important; | line-height:1.25 !important; | ||
text-align:center !important; | text-align:center !important; | ||
text-shadow:1px 1px 0 #000 !important; | text-shadow: | ||
1px 1px 0 #000, | |||
0 0 4px rgba(255,255,255,0.10) !important; | |||
} | } | ||
.stylelab . | .stylelab .statement-plate p { | ||
max-width: | max-width:820px; | ||
margin:0 auto | margin:0 auto 9px; | ||
color:#d8d8d8; | color:#d8d8d8; | ||
font-size:12px; | font-size:12px; | ||
line-height:1. | line-height:1.68; | ||
text-align:center; | text-align:center; | ||
text-shadow:1px 1px 0 #000; | text-shadow:1px 1px 0 #000; | ||
} | } | ||
.stylelab . | .stylelab .statement-plate p:last-child { | ||
margin-bottom:0; | |||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
8. Screen guestbook | |||
Top-right body content module. | |||
Dummy only. Final interactive function later. | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
.stylelab . | .stylelab .screen-title { | ||
min-height: | height:var(--screen-title-h); | ||
margin:0 0 | min-height:var(--screen-title-h); | ||
padding: | margin:0 0 var(--space-inner); | ||
padding:0 7px; | |||
display:flex; | |||
align-items:center; | |||
justify-content:space-between; | |||
var(--edge- | gap:6px; | ||
border:1px solid var(--edge-soft); | |||
background: | background:#151515; | ||
color:#f0f0f0; | color:#f0f0f0; | ||
font-size:10px; | font-size:10px; | ||
font-weight:700; | font-weight:700; | ||
line-height:1; | |||
text-shadow:1px 1px 0 #000; | |||
} | |||
.stylelab .screen-title span:last-child { | |||
color:var(--text-dim); | |||
font-size:9px; | |||
} | |||
.stylelab .guestbook-device { | |||
flex:1 1 auto; | |||
min-height:0; | |||
display:flex; | |||
flex-direction:column; | |||
gap:var(--space-inner); | |||
} | |||
.stylelab .guestbook-messages { | |||
flex:1 1 auto; | |||
min-height:0; | |||
border-top:1px solid var(--edge-soft); | |||
border-bottom:1px solid var(--edge-soft); | |||
overflow:hidden; | |||
} | |||
.stylelab .guestbook-message { | |||
padding:6px 2px; | |||
border-bottom:1px solid var(--edge-soft); | |||
} | |||
.stylelab .guestbook-message:last-child { | |||
border-bottom:none; | |||
} | |||
.stylelab .guestbook-message:hover { | |||
background:#111111; | |||
} | |||
.stylelab .guestbook-message-head { | |||
display:flex; | |||
align-items:center; | |||
justify-content:space-between; | |||
gap:6px; | |||
margin-bottom:3px; | |||
font-size:9px; | |||
line-height:1.2; | line-height:1.2; | ||
} | } | ||
.stylelab . | .stylelab .guestbook-name { | ||
color:#eeeeee; | |||
font-weight:700; | |||
border- | white-space:nowrap; | ||
} | |||
.stylelab .guestbook-time { | |||
color:var(--text-dim); | |||
white-space:nowrap; | |||
} | |||
.stylelab .guestbook-text { | |||
color:var(--text-soft); | |||
font-size:10px; | |||
line-height:1.45; | |||
word-break:keep-all; | |||
} | |||
.stylelab .guestbook-form { | |||
display:grid; | |||
grid-template-columns:minmax(0,1fr) 48px; | |||
gap:var(--space-tight); | |||
} | |||
.stylelab .guestbook-input { | |||
height:24px; | |||
padding:0 7px; | |||
display:flex; | |||
align-items:center; | |||
border:1px solid var(--edge-soft); | |||
background:#070707; | |||
color:var(--text-faint); | |||
font-size:10px; | font-size:10px; | ||
line-height:1; | |||
overflow:hidden; | |||
white-space:nowrap; | |||
text-overflow:ellipsis; | |||
} | |||
.stylelab .guestbook-input:hover { | |||
background:#0c0c0c; | |||
color:#8f8f8f; | |||
} | } | ||
.stylelab . | .stylelab .guestbook-submit { | ||
height:24px; | |||
display:flex; | |||
align-items:center; | |||
justify-content:center; | |||
border:1px solid var(--edge-soft); | border:1px solid var(--edge-soft); | ||
background:# | background:#161616; | ||
color:var(--text-soft); | color:var(--text-soft); | ||
font-size:9px; | |||
font-weight:700; | |||
line-height:1; | |||
text-shadow:1px 1px 0 #000; | |||
} | } | ||
.stylelab . | .stylelab .guestbook-submit:hover { | ||
background:#222222; | |||
color | color:#ffffff; | ||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
9. Ticker | |||
Type: RECORD STRIP | |||
Not a screen device. | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
.stylelab .ticker { | .stylelab .ticker { | ||
height: | height:var(--ticker-h); | ||
margin:0 0 var(-- | margin:0 0 var(--space-inner); | ||
padding:0 var(--pad); | padding:0 var(--pad-panel); | ||
color:#bdbdbd; | color:#bdbdbd; | ||
background:#171717; | background:#171717; | ||
font-size:10px; | font-size:10px; | ||
line-height: | line-height:var(--ticker-h); | ||
white-space:nowrap; | white-space:nowrap; | ||
overflow:hidden; | overflow:hidden; | ||
| 334번째 줄: | 869번째 줄: | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
10. Module grid | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
| 340번째 줄: | 875번째 줄: | ||
display:grid; | display:grid; | ||
grid-template-columns:minmax(0,1fr) minmax(0,1fr) 280px; | grid-template-columns:minmax(0,1fr) minmax(0,1fr) 280px; | ||
gap:var(-- | gap:var(--space-inner); | ||
align-items:stretch; | |||
} | } | ||
.stylelab .panel { | .stylelab .panel, | ||
.stylelab .instrument-panel { | |||
min-width:0; | min-width:0; | ||
height:100%; | |||
display:flex; | |||
flex-direction:column; | |||
} | } | ||
.stylelab .panel-body { | .stylelab .panel-body, | ||
padding:var(--pad); | .stylelab .instrument-body { | ||
flex:1 1 auto; | |||
min-height:0; | |||
padding:var(--pad-panel); | |||
background:var(--surface-well); | background:var(--surface-well); | ||
} | } | ||
/* ----------------------------------------- | |||
11. Record modules | |||
No scanlines. No screen treatment. | |||
----------------------------------------- */ | |||
.stylelab .record-list { | .stylelab .record-list { | ||
| 361번째 줄: | 909번째 줄: | ||
display:grid; | display:grid; | ||
grid-template-columns:minmax(0,1fr) auto; | grid-template-columns:minmax(0,1fr) auto; | ||
gap:var(-- | align-items:center; | ||
gap:var(--space-block); | |||
height:var(--row-h); | |||
min-height:var(--row-h); | min-height:var(--row-h); | ||
margin:0; | margin:0; | ||
padding: | padding:0 2px; | ||
border-bottom:1px solid var(--edge-soft); | border-bottom:1px solid var(--edge-soft); | ||
color:var(--text-soft); | color:var(--text-soft); | ||
line-height:1. | line-height:1.25; | ||
} | } | ||
.stylelab .record-list li:first-child { | .stylelab .record-list li:first-child { | ||
border-top:1px solid var(--edge-soft); | border-top:1px solid var(--edge-soft); | ||
} | |||
.stylelab .record-list li:hover { | |||
background:#151515; | |||
color:#ffffff; | |||
} | } | ||
| 385번째 줄: | 940번째 줄: | ||
white-space:nowrap; | white-space:nowrap; | ||
font-size:9px; | font-size:9px; | ||
line-height:1; | |||
} | |||
.stylelab .record-list li:hover .meta { | |||
color:#c0c0c0; | |||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
12. Status tags | |||
Small functional color only. | Small functional color only. | ||
No structural color use. | No structural color use. | ||
| 394번째 줄: | 954번째 줄: | ||
.stylelab .status-tag { | .stylelab .status-tag { | ||
display:inline- | display:inline-flex; | ||
align-items:center; | |||
justify-content:center; | |||
min-width:34px; | min-width:34px; | ||
padding: | height:16px; | ||
padding:0 4px; | |||
border:1px solid #303030; | border:1px solid #303030; | ||
background:#161616; | background:#161616; | ||
| 402번째 줄: | 965번째 줄: | ||
font-size:9px; | font-size:9px; | ||
text-align:center; | text-align:center; | ||
line-height:1 | line-height:1; | ||
} | } | ||
.stylelab .status-tag.is-progress { | .stylelab .status-tag.is-progress { | ||
border-color:#6d5b2c; | border-color:#6d5b2c; | ||
background:#19170f; | background:#19170f; | ||
} | } | ||
| 413번째 줄: | 975번째 줄: | ||
.stylelab .status-tag.is-review { | .stylelab .status-tag.is-review { | ||
border-color:#36515d; | border-color:#36515d; | ||
background:#10171a; | background:#10171a; | ||
} | } | ||
| 419번째 줄: | 980번째 줄: | ||
.stylelab .status-tag.is-wait { | .stylelab .status-tag.is-wait { | ||
border-color:#484848; | border-color:#484848; | ||
background:#151515; | background:#151515; | ||
} | } | ||
| 425번째 줄: | 985번째 줄: | ||
.stylelab .status-tag.is-done { | .stylelab .status-tag.is-done { | ||
border-color:#3d5c38; | border-color:#3d5c38; | ||
background:#111811; | background:#111811; | ||
} | } | ||
| 431번째 줄: | 990번째 줄: | ||
.stylelab .status-tag.is-alert { | .stylelab .status-tag.is-alert { | ||
border-color:#6a3933; | border-color:#6a3933; | ||
background:#1b1110; | background:#1b1110; | ||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
13. Team work module | |||
Use WIP construction motif only where the making team is foregrounded. | |||
Only motif: left vertical construction rail. | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
.stylelab . | .stylelab .team-panel .panel-body { | ||
position:relative; | position:relative; | ||
padding-left:15px; | padding-left:15px; | ||
} | } | ||
.stylelab . | .stylelab .team-panel .panel-body::before { | ||
content:""; | content:""; | ||
position:absolute; | position:absolute; | ||
left:6px; | left:6px; | ||
top: | top:8px; | ||
bottom: | bottom:8px; | ||
width:4px; | width:4px; | ||
pointer-events:none; | pointer-events:none; | ||
| 471번째 줄: | 1,021번째 줄: | ||
); | ); | ||
opacity:0.95; | opacity:0.95; | ||
} | |||
.stylelab .team-panel .titlebar > span:last-child { | |||
color:#c6c6c6; | |||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
14. Status instrument | |||
Type: STATUS INSTRUMENT | |||
No scanlines. Gauge cells may have recessed finish. | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
.stylelab . | .stylelab .instrument-grid { | ||
display:grid; | display:grid; | ||
grid-template-columns:minmax(0,1fr) minmax(0,1fr); | grid-template-columns:minmax(0,1fr) minmax(0,1fr); | ||
gap:var(-- | gap:var(--space-inner); | ||
margin:0 0 var(-- | margin:0 0 var(--space-inner); | ||
} | } | ||
.stylelab . | .stylelab .gauge { | ||
height:var(--gauge-h); | |||
min-width:0; | min-width:0; | ||
padding: | padding:6px; | ||
display:flex; | |||
flex-direction:column; | |||
align-items:center; | |||
justify-content:center; | |||
border:1px solid var(--edge-soft); | border:1px solid var(--edge-soft); | ||
background: | background:var(--surface-inset); | ||
text-align:center; | text-align:center; | ||
box-shadow: | |||
inset 0 1px 0 rgba(255,255,255,0.025), | |||
inset 0 -1px 0 rgba(0,0,0,0.55); | |||
} | } | ||
.stylelab . | .stylelab .gauge:hover { | ||
background:#0d0d0d; | |||
} | |||
.stylelab .gauge b { | |||
display:block; | display:block; | ||
color:#f0f0f0; | color:#f0f0f0; | ||
font-family:Consolas, Monaco, monospace !important; | font-family:Consolas, Monaco, monospace !important; | ||
font-size:18px; | font-size:18px; | ||
line-height: | line-height:1; | ||
text-shadow:1px 1px 0 #000; | text-shadow:1px 1px 0 #000; | ||
} | } | ||
.stylelab . | .stylelab .gauge span { | ||
display:block; | display:block; | ||
margin-top: | margin-top:5px; | ||
color:var(--text-dim); | color:var(--text-dim); | ||
font-size:9px; | font-size:9px; | ||
line-height:1; | |||
} | |||
.stylelab .instrument-lines { | |||
border-top:1px solid var(--edge-soft); | |||
border-bottom:1px solid var(--edge-soft); | |||
} | } | ||
.stylelab . | .stylelab .instrument-line { | ||
padding: | display:grid; | ||
border:1px solid var(--edge-soft); | grid-template-columns:82px minmax(0,1fr); | ||
background:var(-- | align-items:center; | ||
gap:6px; | |||
height:22px; | |||
min-height:22px; | |||
padding:0 2px; | |||
border-bottom:1px solid var(--edge-soft); | |||
font-size:10px; | |||
line-height:1.2; | |||
} | |||
.stylelab .instrument-line:last-child { | |||
border-bottom:none; | |||
} | |||
.stylelab .instrument-line:hover { | |||
background:#151515; | |||
} | |||
.stylelab .instrument-label { | |||
color:var(--text-dim); | |||
white-space:nowrap; | |||
} | |||
.stylelab .instrument-value { | |||
color:var(--text-soft); | color:var(--text-soft); | ||
white-space:nowrap; | |||
overflow:hidden; | |||
text-overflow:ellipsis; | |||
} | } | ||
.stylelab . | .stylelab .instrument-line:hover .instrument-value { | ||
color:# | color:#ffffff; | ||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
15. Footer split | |||
Left: style rule check | |||
Right: policy / license / credits / socials | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
.stylelab .footer-grid { | |||
display:grid; | |||
grid-template-columns:minmax(0,1fr) 300px; | |||
gap:var(--space-inner); | |||
margin-top:var(--space-inner); | |||
align-items:stretch; | |||
} | |||
.stylelab .footer-grid .panel { | |||
height:100%; | |||
} | |||
.stylelab .manual-panel { | |||
margin-top:0; | |||
} | |||
.stylelab .sample-row { | .stylelab .sample-row { | ||
display:grid; | display:grid; | ||
grid-template-columns:150px minmax(0,1fr); | grid-template-columns:150px minmax(0,1fr); | ||
gap:var(-- | align-items:center; | ||
padding: | gap:var(--space-inner); | ||
min-height:24px; | |||
padding:4px 0; | |||
border-bottom:1px solid var(--edge-soft); | border-bottom:1px solid var(--edge-soft); | ||
} | } | ||
| 536번째 줄: | 1,153번째 줄: | ||
.stylelab .sample-row:first-child { | .stylelab .sample-row:first-child { | ||
border-top:1px solid var(--edge-soft); | border-top:1px solid var(--edge-soft); | ||
} | |||
.stylelab .sample-row:hover { | |||
background:#151515; | |||
} | } | ||
| 541번째 줄: | 1,162번째 줄: | ||
color:var(--text-dim); | color:var(--text-dim); | ||
font-size:10px; | font-size:10px; | ||
line-height:1.25; | |||
} | } | ||
| 546번째 줄: | 1,168번째 줄: | ||
color:var(--text-soft); | color:var(--text-soft); | ||
font-size:10px; | font-size:10px; | ||
line-height:1.35; | |||
} | |||
.stylelab .sample-row:hover .sample-value { | |||
color:#ffffff; | |||
} | |||
.stylelab .policy-list { | |||
border-top:1px solid var(--edge-soft); | |||
border-bottom:1px solid var(--edge-soft); | |||
} | |||
.stylelab .policy-row { | |||
display:grid; | |||
grid-template-columns:minmax(0,1fr) 18px; | |||
align-items:center; | |||
gap:var(--space-inner); | |||
height:24px; | |||
padding:0 2px; | |||
border-bottom:1px solid var(--edge-soft); | |||
font-size:10px; | |||
line-height:1.2; | |||
} | |||
.stylelab .policy-row:last-child { | |||
border-bottom:none; | |||
} | |||
.stylelab .policy-row:hover { | |||
background:#151515; | |||
} | |||
.stylelab .policy-row a { | |||
display:block; | |||
min-width:0; | |||
overflow:hidden; | |||
text-overflow:ellipsis; | |||
white-space:nowrap; | |||
color:var(--text-soft) !important; | |||
} | |||
.stylelab .policy-row:hover a { | |||
color:#ffffff !important; | |||
text-decoration:none !important; | |||
} | |||
.stylelab .policy-mark { | |||
color:var(--text-dim); | |||
font-size:14px; | |||
line-height:1; | |||
white-space:nowrap; | |||
text-align:right; | |||
} | |||
.stylelab .policy-row:hover .policy-mark { | |||
color:#ffffff; | |||
} | |||
.stylelab .social-strip { | |||
display:grid; | |||
grid-template-columns:repeat(4,1fr); | |||
gap:var(--space-tight); | |||
margin-top:var(--space-inner); | |||
} | |||
.stylelab .social-icon { | |||
display:block; | |||
height:26px; | |||
min-width:0; | |||
} | |||
.stylelab .social-icon a { | |||
display:flex !important; | |||
align-items:center !important; | |||
justify-content:center !important; | |||
width:100% !important; | |||
height:26px !important; | |||
border:1px solid var(--edge-soft) !important; | |||
background:#111111 !important; | |||
color:var(--text-soft) !important; | |||
font-size:10px !important; | |||
font-weight:700 !important; | |||
line-height:1 !important; | |||
text-decoration:none !important; | |||
text-shadow:1px 1px 0 #000 !important; | |||
box-sizing:border-box !important; | |||
} | |||
.stylelab .social-icon a:hover { | |||
background:#1c1c1c !important; | |||
color:#ffffff !important; | |||
border-color:#3a3a3a !important; | |||
text-decoration:none !important; | |||
} | } | ||
/* ----------------------------------------- | /* ----------------------------------------- | ||
16. Responsive | |||
----------------------------------------- */ | ----------------------------------------- */ | ||
@media screen and (max-width:1380px) { | |||
.stylelab .module-grid { | |||
grid-template-columns:minmax(0,1fr) minmax(0,1fr); | |||
} | |||
.stylelab .footer-grid { | |||
grid-template-columns:minmax(0,1fr); | |||
} | |||
} | |||
@media screen and (max-width:1180px) { | @media screen and (max-width:1180px) { | ||
| 561번째 줄: | 1,286번째 줄: | ||
} | } | ||
.stylelab . | .stylelab .notice-line { | ||
grid-template-columns:62px minmax(0,1fr); | |||
min-height:32px; | |||
} | } | ||
.stylelab . | .stylelab .notice-date, | ||
.stylelab .notice-action { | |||
display:none; | |||
} | } | ||
} | } | ||
2026년 5월 19일 (화) 08:31 기준 최신판
/* =========================================
COASTLINE: BLACK ICE
MediaWiki:Test.css
Sandbox main-page integration test
Existing full portal body + SVG category nav from CategoryNav.js
========================================= */
/*
Scope:
- This file is globally imported while the test page is still active.
- Every visual rule is scoped to .stylelab, except the bridge for nested .main-portal.
- No body, top-nav, sidebar, page shell, or global layout selectors.
Current role:
- Test.css still owns the full test page layout: notice rail, logo, console, image feed, guestbook, tracker, status, footer.
- MainPage.css + CategoryNav.js own the SVG category navigation.
- This file only provides a bridge so the new JS/SVG category nav can sit inside the old test body without double padding or background.
Cleanup plan:
- After the full main page is migrated, these .stylelab rules should be renamed or moved into MainPage.css as .main-portal components.
- Then Test.css can be removed from Common.css import.
*/
/* -----------------------------------------
0. Style tokens
----------------------------------------- */
.stylelab {
--surface-page:#070707;
--surface-frame:#101010;
--surface-frame-soft:#141414;
--surface-title:#1d1d1d;
--surface-title-hover:#252525;
--surface-well:#080808;
--surface-screen:#060606;
--surface-row:#121212;
--surface-row-alt:#151515;
--surface-inset:#070707;
--edge-top:#555555;
--edge-side:#2b2b2b;
--edge-bottom:#050505;
--edge-soft:#202020;
--edge-mid:#333333;
--edge-weak:#181818;
--text-main:#e2e2e2;
--text-soft:#c8c8c8;
--text-dim:#8a8a8a;
--text-faint:#626262;
--signal-blue:#6f8fa8;
--signal-teal:#5a9b92;
--signal-green:#78966c;
--signal-amber:#c4a04a;
--signal-red:#a85c50;
--signal-gray:#9a9a9a;
--wip-yellow:#f2c300;
--wip-black:#050505;
--space-block:8px;
--space-inner:6px;
--space-tight:4px;
--pad-panel:8px;
--title-h:24px;
--screen-title-h:22px;
--nav-h:30px;
--ticker-h:22px;
--row-h:23px;
--gauge-h:48px;
width:100%;
margin:0 auto;
padding:var(--space-block);
color:var(--text-main);
background:var(--surface-page);
font-size:11px;
line-height:1.5;
box-sizing:border-box;
}
.stylelab *,
.stylelab *::before,
.stylelab *::after {
box-sizing:border-box;
}
.stylelab a {
color:var(--text-main) !important;
text-decoration:none !important;
}
.stylelab a:hover {
color:#ffffff !important;
text-decoration:none !important;
}
/* -----------------------------------------
1. Frame system
North-light rule:
top bright / sides neutral / bottom dark
----------------------------------------- */
.stylelab .frame,
.stylelab .notice-rail,
.stylelab .lab-logo,
.stylelab .console,
.stylelab .panel,
.stylelab .instrument-panel,
.stylelab .ticker {
border:1px solid;
border-color:
var(--edge-top)
var(--edge-side)
var(--edge-bottom)
var(--edge-side);
background:var(--surface-frame);
border-radius:0;
box-shadow:none;
outline:none;
overflow:hidden;
}
.stylelab .titlebar {
position:relative;
height:var(--title-h);
min-height:var(--title-h);
padding:0 var(--pad-panel);
display:flex;
align-items:center;
justify-content:space-between;
gap:var(--space-block);
background:var(--surface-title);
border-bottom:1px solid var(--edge-bottom);
color:#f0f0f0;
font-size:10px;
font-weight:700;
line-height:1;
white-space:nowrap;
overflow:hidden;
text-shadow:1px 1px 0 #000;
}
.stylelab .titlebar > span {
display:block;
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
}
.stylelab .titlebar > span:first-child {
flex:1 1 auto;
}
.stylelab .titlebar > span:last-child {
flex:0 0 auto;
color:#a8a8a8;
font-weight:700;
text-align:right;
}
/* -----------------------------------------
2. Notice rail
Important notices above logo.
Maintenance alert uses construction stripe on the whole row.
Normal notice remains neutral.
----------------------------------------- */
.stylelab .notice-rail {
width:100%;
margin:0 0 var(--space-block);
background:#101010;
border:1px solid;
border-color:
#606060
var(--edge-side)
var(--edge-bottom)
var(--edge-side);
box-shadow:none;
}
.stylelab .notice-line {
position:relative;
display:grid;
grid-template-columns:72px 96px minmax(0,1fr) 48px;
align-items:center;
gap:7px;
min-height:30px;
padding:0 8px;
border-bottom:1px solid #050505;
background:#141414;
font-size:12px;
line-height:1.25;
color:#dcdcdc;
overflow:hidden;
}
.stylelab .notice-line:last-child {
border-bottom:none;
}
.stylelab .notice-line > * {
position:relative;
z-index:2;
}
.stylelab .notice-line:hover {
background:#1c1c1c;
color:#ffffff;
}
.stylelab .notice-line.is-alert {
background:
repeating-linear-gradient(
45deg,
var(--wip-yellow) 0 9px,
var(--wip-yellow) 9px 10px,
var(--wip-black) 10px 19px,
var(--wip-black) 19px 20px
);
}
.stylelab .notice-line.is-alert::before {
content:"";
position:absolute;
inset:0;
z-index:1;
pointer-events:none;
background:rgba(0,0,0,0.42);
}
.stylelab .notice-line.is-alert:hover::before {
background:rgba(0,0,0,0.34);
}
.stylelab .notice-line.is-notice {
background:#141414;
}
.stylelab .notice-line.is-notice:hover {
background:#1c1c1c;
}
.stylelab .notice-badge {
display:inline-flex;
align-items:center;
justify-content:center;
height:20px;
padding:0 7px;
border:1px solid #444444;
background:#0b0b0b;
color:#d8d8d8;
font-size:10px;
font-weight:700;
line-height:1;
text-shadow:1px 1px 0 #000;
}
.stylelab .notice-line.is-alert .notice-badge,
.stylelab .notice-line.is-notice .notice-badge {
border-color:#505050;
background:#101010;
color:#eeeeee;
}
.stylelab .notice-date {
color:#9d9d9d;
white-space:nowrap;
font-size:10px;
font-family:Consolas, Monaco, monospace !important;
}
.stylelab .notice-text {
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
color:#e0e0e0;
font-size:12px;
font-weight:700;
}
.stylelab .notice-line.is-alert .notice-badge,
.stylelab .notice-line.is-alert .notice-date,
.stylelab .notice-line.is-alert .notice-text,
.stylelab .notice-line.is-alert .notice-action {
text-shadow:
-1px 0 0 #000,
1px 0 0 #000,
0 -1px 0 #000,
0 1px 0 #000,
-1px -1px 0 #000,
1px -1px 0 #000,
-1px 1px 0 #000,
1px 1px 0 #000;
}
.stylelab .notice-line:hover .notice-text {
color:#ffffff;
}
.stylelab .notice-action {
justify-self:end;
display:inline-flex;
align-items:center;
justify-content:center;
height:20px;
min-width:38px;
padding:0 5px;
border:1px solid #3a3a3a;
background:#0b0b0b;
color:#c8c8c8;
font-size:10px;
font-weight:700;
white-space:nowrap;
line-height:1;
}
.stylelab .notice-line:hover .notice-action {
border-color:#606060;
background:#181818;
color:#ffffff;
}
/* -----------------------------------------
3. Top logo
Site signboard. Placed before category navigation and content.
----------------------------------------- */
.stylelab .lab-logo {
width:100%;
height:auto;
margin:0 0 var(--space-block);
padding:10px 0 8px;
text-align:center;
line-height:0;
background:#0b0b0b;
}
.stylelab .lab-logo a,
.stylelab .lab-logo .mw-file-description {
display:inline-block;
line-height:0;
}
.stylelab .lab-logo img,
.stylelab .lab-logo .mw-file-element {
width:760px;
max-width:90%;
height:auto;
filter:
grayscale(1)
contrast(1.04)
brightness(1.02);
}
/* -----------------------------------------
4. Category navigation bridge
----------------------------------------- */
/*
The actual category navigation is now generated by CategoryNav.js
and styled by MainPage.css as SVG.
Why this bridge exists:
- The old full test body is still wrapped in .stylelab.
- MainPage.css expects a .main-portal wrapper.
- If .main-portal keeps its own padding/background inside .stylelab, the category nav gets a double frame and the ratio feels different from the original body.
So, inside .stylelab, .main-portal is treated as a transparent mount wrapper only.
The SVG nav itself remains owned by MainPage.css.
*/
.stylelab .main-portal {
width:100%;
margin:0;
padding:0;
background:transparent;
font-size:11px;
line-height:1.5;
}
.stylelab .main-portal [data-component="category-nav"] {
width:100%;
margin:0 0 var(--space-block);
padding:0;
}
/* -----------------------------------------
5. Main console
Type: SCREEN DEVICE
frame > titlebar > body > screen panels
----------------------------------------- */
.stylelab .console {
width:100%;
margin:0 0 var(--space-block);
padding:0;
}
.stylelab .console-body {
padding:var(--space-inner);
background:var(--surface-frame);
}
.stylelab .console-grid {
display:grid;
grid-template-columns:minmax(0,1fr) 260px;
gap:var(--space-inner);
align-items:stretch;
}
.stylelab .main-screen,
.stylelab .side-screen {
position:relative;
min-width:0;
height:100%;
overflow:hidden;
border:1px solid var(--edge-soft);
background:var(--surface-screen);
box-shadow:
inset 0 0 0 1px rgba(255,255,255,0.018),
inset 0 0 18px rgba(0,0,0,0.70);
}
.stylelab .main-screen::before,
.stylelab .side-screen::before {
content:"";
position:absolute;
inset:0;
z-index:6;
pointer-events:none;
background:
radial-gradient(
ellipse at 50% 42%,
rgba(255,255,255,0.030) 0%,
transparent 42%
),
linear-gradient(
to bottom,
rgba(255,255,255,0.030) 0%,
transparent 24%,
rgba(0,0,0,0.16) 100%
);
}
.stylelab .main-screen::after,
.stylelab .side-screen::after {
content:"";
position:absolute;
inset:-40px 0;
z-index:7;
pointer-events:none;
opacity:0.13;
background:
repeating-linear-gradient(
to bottom,
rgba(255,255,255,0.080) 0px,
rgba(255,255,255,0.080) 1px,
transparent 2px,
transparent 5px
);
mix-blend-mode:screen;
}
.stylelab .main-screen > *,
.stylelab .side-screen > * {
position:relative;
z-index:3;
}
.stylelab .main-screen {
min-height:392px;
padding:var(--pad-panel);
display:flex;
flex-direction:column;
justify-content:flex-start;
}
.stylelab .side-screen {
padding:var(--pad-panel);
display:flex;
flex-direction:column;
}
/* -----------------------------------------
6. Image feed crossfade + alternating drift
Current image fades down, next layer becomes visible.
Image drift alternates: left-down / right-down.
----------------------------------------- */
.stylelab .image-feed {
position:relative;
width:100%;
height:240px;
min-height:240px;
overflow:hidden;
border:1px solid var(--edge-soft);
background:#030303;
isolation:isolate;
}
.stylelab .feed-layer {
position:absolute;
inset:-12px;
z-index:1;
opacity:0;
background-size:cover;
background-position:center center;
background-repeat:no-repeat;
filter:
brightness(0.78)
contrast(1.12)
saturate(0.78)
grayscale(0.16);
transform:translate(0,0) scale(1.06);
transform-origin:center center;
will-change:opacity, transform;
animation-duration:24s;
animation-timing-function:linear;
animation-iteration-count:infinite;
}
.stylelab .feed-bg-001 {
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-001.png');
}
.stylelab .feed-bg-002 {
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-002.png');
}
.stylelab .feed-bg-003 {
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-003.png');
}
.stylelab .feed-bg-004 {
background-image:url('/index.php?title=특수:Redirect/file/Bg-Feed-004.png');
}
.stylelab .feed-layer-1 {
animation-name:image-feed-drift-left;
animation-delay:0s;
}
.stylelab .feed-layer-2 {
animation-name:image-feed-drift-right;
animation-delay:6s;
}
.stylelab .feed-layer-3 {
animation-name:image-feed-drift-left;
animation-delay:12s;
}
.stylelab .feed-layer-4 {
animation-name:image-feed-drift-right;
animation-delay:18s;
}
@keyframes image-feed-drift-left {
0% {
opacity:0;
transform:translate(0,0) scale(1.06);
}
4.166% {
opacity:1;
transform:translate(0,0) scale(1.06);
}
25% {
opacity:1;
transform:translate(-22px,14px) scale(1.075);
}
29.166% {
opacity:0;
transform:translate(-26px,16px) scale(1.078);
}
100% {
opacity:0;
transform:translate(0,0) scale(1.06);
}
}
@keyframes image-feed-drift-right {
0% {
opacity:0;
transform:translate(0,0) scale(1.06);
}
4.166% {
opacity:1;
transform:translate(0,0) scale(1.06);
}
25% {
opacity:1;
transform:translate(22px,14px) scale(1.075);
}
29.166% {
opacity:0;
transform:translate(26px,16px) scale(1.078);
}
100% {
opacity:0;
transform:translate(0,0) scale(1.06);
}
}
.stylelab .image-feed::before {
content:"";
position:absolute;
inset:0;
z-index:5;
pointer-events:none;
background:
linear-gradient(
to bottom,
rgba(0,0,0,0.18) 0%,
transparent 22%,
transparent 74%,
rgba(0,0,0,0.30) 100%
),
linear-gradient(
to right,
rgba(0,0,0,0.22) 0%,
transparent 10%,
transparent 90%,
rgba(0,0,0,0.22) 100%
);
}
.stylelab .image-feed::after {
content:"";
position:absolute;
inset:-40px 0;
z-index:6;
pointer-events:none;
opacity:0.20;
background:
repeating-linear-gradient(
to bottom,
rgba(255,255,255,0.090) 0px,
rgba(255,255,255,0.090) 1px,
transparent 2px,
transparent 5px
);
mix-blend-mode:screen;
}
.stylelab .feed-caption {
position:absolute;
left:0;
right:0;
bottom:0;
z-index:8;
height:22px;
padding:0 7px;
display:flex;
align-items:center;
justify-content:space-between;
gap:8px;
border-top:1px solid rgba(255,255,255,0.09);
background:rgba(5,5,5,0.86);
color:#cfcfcf;
font-size:10px;
line-height:22px;
text-shadow:1px 1px 0 #000;
}
.stylelab .feed-caption span:first-child {
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.stylelab .feed-caption span:last-child {
flex:0 0 auto;
color:var(--text-dim);
}
/* -----------------------------------------
7. Statement plate below image feed
----------------------------------------- */
.stylelab .statement-plate {
margin:var(--space-inner) 0 0;
padding:13px 18px 12px;
border:1px solid var(--edge-soft);
background:#080808;
}
.stylelab .statement-plate h2 {
margin:0 0 10px !important;
padding:0 0 8px !important;
border-bottom:1px solid var(--edge-soft) !important;
color:#f4f4f4 !important;
font-size:20px !important;
line-height:1.25 !important;
text-align:center !important;
text-shadow:
1px 1px 0 #000,
0 0 4px rgba(255,255,255,0.10) !important;
}
.stylelab .statement-plate p {
max-width:820px;
margin:0 auto 9px;
color:#d8d8d8;
font-size:12px;
line-height:1.68;
text-align:center;
text-shadow:1px 1px 0 #000;
}
.stylelab .statement-plate p:last-child {
margin-bottom:0;
}
/* -----------------------------------------
8. Screen guestbook
Top-right body content module.
Dummy only. Final interactive function later.
----------------------------------------- */
.stylelab .screen-title {
height:var(--screen-title-h);
min-height:var(--screen-title-h);
margin:0 0 var(--space-inner);
padding:0 7px;
display:flex;
align-items:center;
justify-content:space-between;
gap:6px;
border:1px solid var(--edge-soft);
background:#151515;
color:#f0f0f0;
font-size:10px;
font-weight:700;
line-height:1;
text-shadow:1px 1px 0 #000;
}
.stylelab .screen-title span:last-child {
color:var(--text-dim);
font-size:9px;
}
.stylelab .guestbook-device {
flex:1 1 auto;
min-height:0;
display:flex;
flex-direction:column;
gap:var(--space-inner);
}
.stylelab .guestbook-messages {
flex:1 1 auto;
min-height:0;
border-top:1px solid var(--edge-soft);
border-bottom:1px solid var(--edge-soft);
overflow:hidden;
}
.stylelab .guestbook-message {
padding:6px 2px;
border-bottom:1px solid var(--edge-soft);
}
.stylelab .guestbook-message:last-child {
border-bottom:none;
}
.stylelab .guestbook-message:hover {
background:#111111;
}
.stylelab .guestbook-message-head {
display:flex;
align-items:center;
justify-content:space-between;
gap:6px;
margin-bottom:3px;
font-size:9px;
line-height:1.2;
}
.stylelab .guestbook-name {
color:#eeeeee;
font-weight:700;
white-space:nowrap;
}
.stylelab .guestbook-time {
color:var(--text-dim);
white-space:nowrap;
}
.stylelab .guestbook-text {
color:var(--text-soft);
font-size:10px;
line-height:1.45;
word-break:keep-all;
}
.stylelab .guestbook-form {
display:grid;
grid-template-columns:minmax(0,1fr) 48px;
gap:var(--space-tight);
}
.stylelab .guestbook-input {
height:24px;
padding:0 7px;
display:flex;
align-items:center;
border:1px solid var(--edge-soft);
background:#070707;
color:var(--text-faint);
font-size:10px;
line-height:1;
overflow:hidden;
white-space:nowrap;
text-overflow:ellipsis;
}
.stylelab .guestbook-input:hover {
background:#0c0c0c;
color:#8f8f8f;
}
.stylelab .guestbook-submit {
height:24px;
display:flex;
align-items:center;
justify-content:center;
border:1px solid var(--edge-soft);
background:#161616;
color:var(--text-soft);
font-size:9px;
font-weight:700;
line-height:1;
text-shadow:1px 1px 0 #000;
}
.stylelab .guestbook-submit:hover {
background:#222222;
color:#ffffff;
}
/* -----------------------------------------
9. Ticker
Type: RECORD STRIP
Not a screen device.
----------------------------------------- */
.stylelab .ticker {
height:var(--ticker-h);
margin:0 0 var(--space-inner);
padding:0 var(--pad-panel);
color:#bdbdbd;
background:#171717;
font-size:10px;
line-height:var(--ticker-h);
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
text-shadow:1px 1px 0 #000;
}
/* -----------------------------------------
10. Module grid
----------------------------------------- */
.stylelab .module-grid {
display:grid;
grid-template-columns:minmax(0,1fr) minmax(0,1fr) 280px;
gap:var(--space-inner);
align-items:stretch;
}
.stylelab .panel,
.stylelab .instrument-panel {
min-width:0;
height:100%;
display:flex;
flex-direction:column;
}
.stylelab .panel-body,
.stylelab .instrument-body {
flex:1 1 auto;
min-height:0;
padding:var(--pad-panel);
background:var(--surface-well);
}
/* -----------------------------------------
11. Record modules
No scanlines. No screen treatment.
----------------------------------------- */
.stylelab .record-list {
margin:0 !important;
padding:0 !important;
list-style:none !important;
}
.stylelab .record-list li {
display:grid;
grid-template-columns:minmax(0,1fr) auto;
align-items:center;
gap:var(--space-block);
height:var(--row-h);
min-height:var(--row-h);
margin:0;
padding:0 2px;
border-bottom:1px solid var(--edge-soft);
color:var(--text-soft);
line-height:1.25;
}
.stylelab .record-list li:first-child {
border-top:1px solid var(--edge-soft);
}
.stylelab .record-list li:hover {
background:#151515;
color:#ffffff;
}
.stylelab .record-list li span:first-child {
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.stylelab .meta {
color:var(--text-dim);
white-space:nowrap;
font-size:9px;
line-height:1;
}
.stylelab .record-list li:hover .meta {
color:#c0c0c0;
}
/* -----------------------------------------
12. Status tags
Small functional color only.
No structural color use.
----------------------------------------- */
.stylelab .status-tag {
display:inline-flex;
align-items:center;
justify-content:center;
min-width:34px;
height:16px;
padding:0 4px;
border:1px solid #303030;
background:#161616;
color:var(--text-soft);
font-size:9px;
text-align:center;
line-height:1;
}
.stylelab .status-tag.is-progress {
border-color:#6d5b2c;
background:#19170f;
}
.stylelab .status-tag.is-review {
border-color:#36515d;
background:#10171a;
}
.stylelab .status-tag.is-wait {
border-color:#484848;
background:#151515;
}
.stylelab .status-tag.is-done {
border-color:#3d5c38;
background:#111811;
}
.stylelab .status-tag.is-alert {
border-color:#6a3933;
background:#1b1110;
}
/* -----------------------------------------
13. Team work module
Use WIP construction motif only where the making team is foregrounded.
Only motif: left vertical construction rail.
----------------------------------------- */
.stylelab .team-panel .panel-body {
position:relative;
padding-left:15px;
}
.stylelab .team-panel .panel-body::before {
content:"";
position:absolute;
left:6px;
top:8px;
bottom:8px;
width:4px;
pointer-events:none;
background:
repeating-linear-gradient(
45deg,
var(--wip-yellow) 0 4px,
var(--wip-yellow) 4px 5px,
var(--wip-black) 5px 9px,
var(--wip-black) 9px 10px
);
opacity:0.95;
}
.stylelab .team-panel .titlebar > span:last-child {
color:#c6c6c6;
}
/* -----------------------------------------
14. Status instrument
Type: STATUS INSTRUMENT
No scanlines. Gauge cells may have recessed finish.
----------------------------------------- */
.stylelab .instrument-grid {
display:grid;
grid-template-columns:minmax(0,1fr) minmax(0,1fr);
gap:var(--space-inner);
margin:0 0 var(--space-inner);
}
.stylelab .gauge {
height:var(--gauge-h);
min-width:0;
padding:6px;
display:flex;
flex-direction:column;
align-items:center;
justify-content:center;
border:1px solid var(--edge-soft);
background:var(--surface-inset);
text-align:center;
box-shadow:
inset 0 1px 0 rgba(255,255,255,0.025),
inset 0 -1px 0 rgba(0,0,0,0.55);
}
.stylelab .gauge:hover {
background:#0d0d0d;
}
.stylelab .gauge b {
display:block;
color:#f0f0f0;
font-family:Consolas, Monaco, monospace !important;
font-size:18px;
line-height:1;
text-shadow:1px 1px 0 #000;
}
.stylelab .gauge span {
display:block;
margin-top:5px;
color:var(--text-dim);
font-size:9px;
line-height:1;
}
.stylelab .instrument-lines {
border-top:1px solid var(--edge-soft);
border-bottom:1px solid var(--edge-soft);
}
.stylelab .instrument-line {
display:grid;
grid-template-columns:82px minmax(0,1fr);
align-items:center;
gap:6px;
height:22px;
min-height:22px;
padding:0 2px;
border-bottom:1px solid var(--edge-soft);
font-size:10px;
line-height:1.2;
}
.stylelab .instrument-line:last-child {
border-bottom:none;
}
.stylelab .instrument-line:hover {
background:#151515;
}
.stylelab .instrument-label {
color:var(--text-dim);
white-space:nowrap;
}
.stylelab .instrument-value {
color:var(--text-soft);
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.stylelab .instrument-line:hover .instrument-value {
color:#ffffff;
}
/* -----------------------------------------
15. Footer split
Left: style rule check
Right: policy / license / credits / socials
----------------------------------------- */
.stylelab .footer-grid {
display:grid;
grid-template-columns:minmax(0,1fr) 300px;
gap:var(--space-inner);
margin-top:var(--space-inner);
align-items:stretch;
}
.stylelab .footer-grid .panel {
height:100%;
}
.stylelab .manual-panel {
margin-top:0;
}
.stylelab .sample-row {
display:grid;
grid-template-columns:150px minmax(0,1fr);
align-items:center;
gap:var(--space-inner);
min-height:24px;
padding:4px 0;
border-bottom:1px solid var(--edge-soft);
}
.stylelab .sample-row:first-child {
border-top:1px solid var(--edge-soft);
}
.stylelab .sample-row:hover {
background:#151515;
}
.stylelab .sample-label {
color:var(--text-dim);
font-size:10px;
line-height:1.25;
}
.stylelab .sample-value {
color:var(--text-soft);
font-size:10px;
line-height:1.35;
}
.stylelab .sample-row:hover .sample-value {
color:#ffffff;
}
.stylelab .policy-list {
border-top:1px solid var(--edge-soft);
border-bottom:1px solid var(--edge-soft);
}
.stylelab .policy-row {
display:grid;
grid-template-columns:minmax(0,1fr) 18px;
align-items:center;
gap:var(--space-inner);
height:24px;
padding:0 2px;
border-bottom:1px solid var(--edge-soft);
font-size:10px;
line-height:1.2;
}
.stylelab .policy-row:last-child {
border-bottom:none;
}
.stylelab .policy-row:hover {
background:#151515;
}
.stylelab .policy-row a {
display:block;
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
color:var(--text-soft) !important;
}
.stylelab .policy-row:hover a {
color:#ffffff !important;
text-decoration:none !important;
}
.stylelab .policy-mark {
color:var(--text-dim);
font-size:14px;
line-height:1;
white-space:nowrap;
text-align:right;
}
.stylelab .policy-row:hover .policy-mark {
color:#ffffff;
}
.stylelab .social-strip {
display:grid;
grid-template-columns:repeat(4,1fr);
gap:var(--space-tight);
margin-top:var(--space-inner);
}
.stylelab .social-icon {
display:block;
height:26px;
min-width:0;
}
.stylelab .social-icon a {
display:flex !important;
align-items:center !important;
justify-content:center !important;
width:100% !important;
height:26px !important;
border:1px solid var(--edge-soft) !important;
background:#111111 !important;
color:var(--text-soft) !important;
font-size:10px !important;
font-weight:700 !important;
line-height:1 !important;
text-decoration:none !important;
text-shadow:1px 1px 0 #000 !important;
box-sizing:border-box !important;
}
.stylelab .social-icon a:hover {
background:#1c1c1c !important;
color:#ffffff !important;
border-color:#3a3a3a !important;
text-decoration:none !important;
}
/* -----------------------------------------
16. Responsive
----------------------------------------- */
@media screen and (max-width:1380px) {
.stylelab .module-grid {
grid-template-columns:minmax(0,1fr) minmax(0,1fr);
}
.stylelab .footer-grid {
grid-template-columns:minmax(0,1fr);
}
}
@media screen and (max-width:1180px) {
.stylelab .console-grid {
grid-template-columns:minmax(0,1fr);
}
.stylelab .module-grid {
grid-template-columns:minmax(0,1fr);
}
.stylelab .notice-line {
grid-template-columns:62px minmax(0,1fr);
min-height:32px;
}
.stylelab .notice-date,
.stylelab .notice-action {
display:none;
}
}