미디어위키:Test.css: 두 판 사이의 차이

편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 24개는 보이지 않습니다)
2번째 줄: 2번째 줄:
COASTLINE: BLACK ICE
COASTLINE: BLACK ICE
MediaWiki:Test.css
MediaWiki:Test.css
Sandbox-only style test
Sandbox main-page integration test
Logo-first home layout + image feed + top guestbook + high-priority notice rail
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.
*/
*/


86번째 줄: 95번째 줄:
.stylelab a:hover {
.stylelab a:hover {
color:#ffffff !important;
color:#ffffff !important;
text-decoration:underline !important;
text-decoration:none !important;
}
}


98번째 줄: 107번째 줄:
.stylelab .notice-rail,
.stylelab .notice-rail,
.stylelab .lab-logo,
.stylelab .lab-logo,
.stylelab .directory,
.stylelab .console,
.stylelab .console,
.stylelab .panel,
.stylelab .panel,
157번째 줄: 165번째 줄:
2. Notice rail
2. Notice rail
Important notices above logo.
Important notices above logo.
Higher priority than ordinary record rows.
Maintenance alert uses construction stripe on the whole row.
Normal notice remains neutral.
----------------------------------------- */
----------------------------------------- */


163번째 줄: 172번째 줄:
width:100%;
width:100%;
margin:0 0 var(--space-block);
margin:0 0 var(--space-block);
background:#111111;
background:#101010;
border:1px solid;
border:1px solid;
border-color:
border-color:
#6a6a6a
#606060
var(--edge-side)
var(--edge-side)
var(--edge-bottom)
var(--edge-bottom)
var(--edge-side);
var(--edge-side);
box-shadow:
box-shadow:none;
inset 0 1px 0 rgba(255,255,255,0.055),
inset 0 -1px 0 rgba(0,0,0,0.62);
}
}


178번째 줄: 185번째 줄:
position:relative;
position:relative;
display:grid;
display:grid;
grid-template-columns:8px 78px 92px minmax(0,1fr) 48px;
grid-template-columns:72px 96px minmax(0,1fr) 48px;
align-items:center;
align-items:center;
gap:6px;
gap:7px;
min-height:28px;
min-height:30px;
padding:0 8px;
padding:0 8px;
border-bottom:1px solid #050505;
border-bottom:1px solid #050505;
background:#151515;
background:#141414;
font-size:10px;
font-size:12px;
line-height:1.25;
line-height:1.25;
color:var(--text-soft);
color:#dcdcdc;
overflow:hidden;
}
}


194번째 줄: 202번째 줄:
}
}


.stylelab .notice-line::before {
.stylelab .notice-line > * {
content:"";
position:relative;
display:block;
z-index:2;
width:6px;
height:16px;
border:1px solid #3a3a3a;
background:#7a7a7a;
box-shadow:
0 0 5px rgba(255,255,255,0.10),
inset 0 1px 0 rgba(255,255,255,0.18),
inset 0 -1px 0 rgba(0,0,0,0.60);
}
}


.stylelab .notice-line.is-maintenance {
.stylelab .notice-line:hover {
background:#19160d;
background:#1c1c1c;
color:#ffffff;
}
}


.stylelab .notice-line.is-maintenance::before {
.stylelab .notice-line.is-alert {
border-color:#6d5b2c;
background:
background:#d3b24c;
repeating-linear-gradient(
box-shadow:
45deg,
0 0 8px rgba(211,178,76,0.30),
var(--wip-yellow) 0 9px,
inset 0 1px 0 rgba(255,255,255,0.22),
var(--wip-yellow) 9px 10px,
inset 0 -1px 0 rgba(0,0,0,0.70);
var(--wip-black) 10px 19px,
var(--wip-black) 19px 20px
);
}
}


.stylelab .notice-line.is-test {
.stylelab .notice-line.is-alert::before {
background:#10171a;
content:"";
position:absolute;
inset:0;
z-index:1;
pointer-events:none;
background:rgba(0,0,0,0.42);
}
}


.stylelab .notice-line.is-test::before {
.stylelab .notice-line.is-alert:hover::before {
border-color:#36515d;
background:rgba(0,0,0,0.34);
background:#78a9ba;
box-shadow:
0 0 8px rgba(120,169,186,0.26),
inset 0 1px 0 rgba(255,255,255,0.20),
inset 0 -1px 0 rgba(0,0,0,0.68);
}
 
.stylelab .notice-line:hover {
background:#202020;
color:#ffffff;
}
}


.stylelab .notice-line.is-maintenance:hover {
.stylelab .notice-line.is-notice {
background:#211d10;
background:#141414;
}
}


.stylelab .notice-line.is-test:hover {
.stylelab .notice-line.is-notice:hover {
background:#132027;
background:#1c1c1c;
}
}


250번째 줄: 248번째 줄:
align-items:center;
align-items:center;
justify-content:center;
justify-content:center;
height:18px;
height:20px;
padding:0 7px;
padding:0 7px;
border:1px solid #4d4d4d;
border:1px solid #444444;
background:#0b0b0b;
background:#0b0b0b;
color:#d0d0d0;
color:#d8d8d8;
font-size:9px;
font-size:10px;
font-weight:700;
font-weight:700;
line-height:1;
line-height:1;
261번째 줄: 259번째 줄:
}
}


.stylelab .notice-line.is-maintenance .notice-badge {
.stylelab .notice-line.is-alert .notice-badge,
border-color:#8a712b;
.stylelab .notice-line.is-notice .notice-badge {
background:#2a220d;
border-color:#505050;
color:#f0cf63;
background:#101010;
}
color:#eeeeee;
 
.stylelab .notice-line.is-test .notice-badge {
border-color:#41606c;
background:#0d1b20;
color:#9fcedd;
}
}


.stylelab .notice-date {
.stylelab .notice-date {
color:#a6a6a6;
color:#9d9d9d;
white-space:nowrap;
white-space:nowrap;
font-size:9px;
font-size:10px;
font-family:Consolas, Monaco, monospace !important;
font-family:Consolas, Monaco, monospace !important;
}
}
285번째 줄: 278번째 줄:
text-overflow:ellipsis;
text-overflow:ellipsis;
white-space:nowrap;
white-space:nowrap;
color:#d8d8d8;
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;
}
}


297번째 줄: 307번째 줄:
align-items:center;
align-items:center;
justify-content:center;
justify-content:center;
height:18px;
height:20px;
min-width:38px;
min-width:38px;
padding:0 5px;
padding:0 5px;
border:1px solid #303030;
border:1px solid #3a3a3a;
background:#0b0b0b;
background:#0b0b0b;
color:#bdbdbd;
color:#c8c8c8;
font-size:9px;
font-size:10px;
font-weight:700;
font-weight:700;
white-space:nowrap;
white-space:nowrap;
310번째 줄: 320번째 줄:


.stylelab .notice-line:hover .notice-action {
.stylelab .notice-line:hover .notice-action {
border-color:#555555;
border-color:#606060;
background:#181818;
background:#181818;
color:#ffffff;
color:#ffffff;
317번째 줄: 327번째 줄:
/* -----------------------------------------
/* -----------------------------------------
3. Top logo
3. Top logo
Site signboard. Placed before directory and content.
Site signboard. Placed before category navigation and content.
----------------------------------------- */
----------------------------------------- */


348번째 줄: 358번째 줄:


/* -----------------------------------------
/* -----------------------------------------
4. Directory strip
4. Category navigation bridge
Test component only. In actual main page, this can map to the real top navigation.
----------------------------------------- */
----------------------------------------- */


.stylelab .directory {
/*
width:100%;
The actual category navigation is now generated by CategoryNav.js
height:var(--nav-h);
and styled by MainPage.css as SVG.
margin:0 0 var(--space-block) !important;
border-collapse:collapse !important;
table-layout:fixed !important;
}


.stylelab .directory tbody,
Why this bridge exists:
.stylelab .directory tr {
- The old full test body is still wrapped in .stylelab.
width:100%;
- MainPage.css expects a .main-portal wrapper.
height:var(--nav-h);
- 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 .directory td {
So, inside .stylelab, .main-portal is treated as a transparent mount wrapper only.
height:var(--nav-h);
The SVG nav itself remains owned by MainPage.css.
margin:0 !important;
*/
padding:0 !important;
border:none !important;
border-right:1px solid var(--edge-bottom) !important;
background:var(--surface-frame-soft) !important;
vertical-align:middle !important;
text-align:center !important;
}


.stylelab .directory td:last-child {
.stylelab .main-portal {
border-right:none !important;
width:100%;
margin:0;
padding:0;
background:transparent;
font-size:11px;
line-height:1.5;
}
}


.stylelab .directory a {
.stylelab .main-portal [data-component="category-nav"] {
display:flex !important;
width:100%;
align-items:center !important;
margin:0 0 var(--space-block);
justify-content:center !important;
padding:0;
width:100% !important;
height:var(--nav-h) !important;
min-height:var(--nav-h) !important;
padding:0 6px !important;
color:var(--text-main) !important;
font-size:10px !important;
font-weight:700 !important;
line-height:1.2 !important;
text-align:center !important;
text-shadow:1px 1px 0 #000 !important;
}
 
.stylelab .directory td:hover,
.stylelab .directory td:hover a {
background:var(--surface-title-hover) !important;
color:#ffffff !important;
text-decoration:none !important;
}
}


502번째 줄: 487번째 줄:


/* -----------------------------------------
/* -----------------------------------------
6. Image feed crossfade
6. Image feed crossfade + alternating drift
Current image fades down, next layer becomes visible.
Current image fades down, next layer becomes visible.
Image drift alternates: left-down / right-down.
----------------------------------------- */
----------------------------------------- */


519번째 줄: 505번째 줄:
.stylelab .feed-layer {
.stylelab .feed-layer {
position:absolute;
position:absolute;
inset:0;
inset:-12px;
z-index:1;
z-index:1;
opacity:0;
opacity:0;
530번째 줄: 516번째 줄:
saturate(0.78)
saturate(0.78)
grayscale(0.16);
grayscale(0.16);
animation:image-feed-fade-4 24s linear infinite;
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;
}
}


549번째 줄: 540번째 줄:
}
}


.stylelab .feed-layer-1 { animation-delay:0s; }
.stylelab .feed-layer-1 {
.stylelab .feed-layer-2 { animation-delay:6s; }
animation-name:image-feed-drift-left;
.stylelab .feed-layer-3 { animation-delay:12s; }
animation-delay:0s;
.stylelab .feed-layer-4 { animation-delay:18s; }
}
 
.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-fade-4 {
@keyframes image-feed-drift-right {
0% { opacity:0; }
0% {
4.166% { opacity:1; }
opacity:0;
25% { opacity:1; }
transform:translate(0,0) scale(1.06);
29.166% { opacity:0; }
}
100% { opacity:0; }
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);
}
}
}


926번째 줄: 970번째 줄:
.stylelab .status-tag.is-progress {
.stylelab .status-tag.is-progress {
border-color:#6d5b2c;
border-color:#6d5b2c;
color:#d3bb72;
background:#19170f;
background:#19170f;
}
}
932번째 줄: 975번째 줄:
.stylelab .status-tag.is-review {
.stylelab .status-tag.is-review {
border-color:#36515d;
border-color:#36515d;
color:#8bb6c6;
background:#10171a;
background:#10171a;
}
}
938번째 줄: 980번째 줄:
.stylelab .status-tag.is-wait {
.stylelab .status-tag.is-wait {
border-color:#484848;
border-color:#484848;
color:#a4a4a4;
background:#151515;
background:#151515;
}
}
944번째 줄: 985번째 줄:
.stylelab .status-tag.is-done {
.stylelab .status-tag.is-done {
border-color:#3d5c38;
border-color:#3d5c38;
color:#9fbe96;
background:#111811;
background:#111811;
}
}
950번째 줄: 990번째 줄:
.stylelab .status-tag.is-alert {
.stylelab .status-tag.is-alert {
border-color:#6a3933;
border-color:#6a3933;
color:#d48679;
background:#1b1110;
background:#1b1110;
}
}
1,081번째 줄: 1,120번째 줄:


/* -----------------------------------------
/* -----------------------------------------
15. Manual samples
15. Footer split
Type: RECORD MODULE
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 {
.stylelab .manual-panel {
margin-top:var(--space-inner);
margin-top:0;
}
}


1,121번째 줄: 1,173번째 줄:
.stylelab .sample-row:hover .sample-value {
.stylelab .sample-row:hover .sample-value {
color:#ffffff;
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;
}
}


1,130번째 줄: 1,270번째 줄:
.stylelab .module-grid {
.stylelab .module-grid {
grid-template-columns:minmax(0,1fr) minmax(0,1fr);
grid-template-columns:minmax(0,1fr) minmax(0,1fr);
}
.stylelab .footer-grid {
grid-template-columns:minmax(0,1fr);
}
}
}
}
1,140번째 줄: 1,284번째 줄:
.stylelab .module-grid {
.stylelab .module-grid {
grid-template-columns:minmax(0,1fr);
grid-template-columns:minmax(0,1fr);
}
.stylelab .directory {
height:auto;
table-layout:auto !important;
}
.stylelab .directory,
.stylelab .directory tbody,
.stylelab .directory tr,
.stylelab .directory td {
display:block !important;
width:100% !important;
height:auto !important;
}
.stylelab .directory td {
border-right:none !important;
border-bottom:1px solid var(--edge-bottom) !important;
}
.stylelab .directory td:last-child {
border-bottom:none !important;
}
.stylelab .directory a {
height:var(--nav-h) !important;
}
}


.stylelab .notice-line {
.stylelab .notice-line {
grid-template-columns:8px 62px 82px minmax(0,1fr);
grid-template-columns:62px minmax(0,1fr);
min-height:32px;
}
}


.stylelab .notice-date,
.stylelab .notice-action {
.stylelab .notice-action {
display:none;
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;
}
}