Main Page: Difference between revisions
No edit summary |
Fix remaining broken arrow characters on main page |
||
| (9 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
__NOTOC__ | |||
<html> | <html> | ||
<style> | <style> | ||
.vu- | .vu-main { | ||
--vu-border: var(--border-color-base, #a2a9b1); | --vu-border: var(--border-color-base, #a2a9b1); | ||
--vu-text: var(--color-base, #202122); | --vu-text: var(--color-base, #202122); | ||
| Line 9: | Line 11: | ||
--vu-red: var(--color-destructive, #d33); | --vu-red: var(--color-destructive, #d33); | ||
--vu-navy: #1B223D; | --vu-navy: #1B223D; | ||
--vu-blue: # | --vu-navy-light: #2b3d60; | ||
--vu-blue: #78c7ff; | |||
max-width: 1180px; | max-width: 1180px; | ||
margin: 0 auto | margin: 0 auto 30px; | ||
color: var(--vu-text); | color: var(--vu-text); | ||
} | } | ||
.vu- | .vu-main, | ||
.vu- | .vu-main * { | ||
box-sizing: border-box; | box-sizing: border-box; | ||
} | } | ||
.vu- | .vu-main a { | ||
color: var(--vu-link); | color: var(--vu-link); | ||
text-decoration: none; | text-decoration: none; | ||
} | } | ||
.vu- | .vu-main a:hover { | ||
text-decoration: underline; | text-decoration: underline; | ||
} | } | ||
.vu- | .vu-main a.new, | ||
.vu- | .vu-main a.new:visited { | ||
color: var(--vu-red) !important; | color: var(--vu-red) !important; | ||
} | } | ||
/* | /* Header */ | ||
.vu- | .vu-header { | ||
position: relative; | position: relative; | ||
display: grid; | display: grid; | ||
grid-template-columns: 240px minmax(0, 1fr); | grid-template-columns: 240px minmax(0, 1fr); | ||
min-height: | min-height: 285px; | ||
overflow: hidden; | overflow: hidden; | ||
border: 1px solid #3a506b; | border: 1px solid #3a506b; | ||
background: | background: linear-gradient(118deg, #151b30 0%, #1B223D 55%, #2b3d60 100%); | ||
color: #e0f0ff; | color: #e0f0ff; | ||
} | } | ||
.vu- | .vu-header::before { | ||
content: ""; | content: ""; | ||
position: absolute; | position: absolute; | ||
width: | right: -130px; | ||
height: | top: -210px; | ||
border: | width: 520px; | ||
height: 520px; | |||
border: 90px solid rgba(255,255,255,0.035); | |||
transform: rotate(18deg); | |||
} | } | ||
.vu- | .vu-header::after { | ||
content: ""; | |||
position: absolute; | |||
right: 0; | |||
bottom: 0; | |||
width: 44%; | |||
height: 7px; | |||
background: var(--vu-blue); | |||
clip-path: polygon(13px 0, 100% 0, 100% 100%, 0 100%); | |||
} | } | ||
.vu- | .vu-logo-panel { | ||
position: relative; | position: relative; | ||
z-index: 2; | z-index: 2; | ||
| Line 76: | Line 78: | ||
align-items: center; | align-items: center; | ||
justify-content: center; | justify-content: center; | ||
padding: | padding: 31px; | ||
background: rgba(0,0,0,0. | background: linear-gradient(145deg, rgba(255,255,255,0.065), rgba(0,0,0,0.22)); | ||
border-right: 1px solid rgba(255,255,255,0. | border-right: 1px solid rgba(255,255,255,0.15); | ||
} | } | ||
.vu- | .vu-logo-panel::after { | ||
content: ""; | content: ""; | ||
position: absolute; | position: absolute; | ||
right: - | right: -36px; | ||
top: 50%; | top: 50%; | ||
width: | width: 70px; | ||
height: | height: 70px; | ||
background: | background: #1B223D; | ||
border-top: 1px solid rgba(255,255,255,0. | border-top: 1px solid rgba(255,255,255,0.15); | ||
border-right: 1px solid rgba(255,255,255,0. | border-right: 1px solid rgba(255,255,255,0.15); | ||
transform: translateY(-50%) rotate(45deg); | transform: translateY(-50%) rotate(45deg); | ||
} | } | ||
.vu- | .vu-logo-panel img { | ||
position: relative; | position: relative; | ||
z-index: 2; | z-index: 2; | ||
| Line 100: | Line 102: | ||
max-width: 175px; | max-width: 175px; | ||
height: auto; | height: auto; | ||
filter: drop-shadow(0 12px | filter: drop-shadow(0 12px 16px rgba(0,0,0,0.48)); | ||
} | } | ||
.vu- | .vu-header-copy { | ||
position: relative; | position: relative; | ||
z-index: 2; | z-index: 2; | ||
| Line 109: | Line 111: | ||
flex-direction: column; | flex-direction: column; | ||
justify-content: center; | justify-content: center; | ||
padding: | padding: 39px 45px 39px 62px; | ||
} | } | ||
| Line 115: | Line 117: | ||
margin: 0 0 13px; | margin: 0 0 13px; | ||
color: #fff; | color: #fff; | ||
font-size: clamp(3rem, 7vw, | font-size: clamp(3rem, 7vw, 5rem); | ||
font-weight: 700; | font-weight: 700; | ||
line-height: 0.95; | line-height: 0.95; | ||
| Line 121: | Line 123: | ||
} | } | ||
.vu- | .vu-subtitle { | ||
max-width: | max-width: 700px; | ||
margin-bottom: | margin-bottom: 20px; | ||
color: #dbe7f5; | color: #dbe7f5; | ||
font-size: 1. | font-size: 1.07rem; | ||
line-height: 1. | line-height: 1.5; | ||
} | } | ||
.vu- | .vu-header-actions { | ||
display: flex; | display: flex; | ||
flex-wrap: wrap; | flex-wrap: wrap; | ||
gap: | gap: 8px; | ||
} | } | ||
.vu- | .vu-header-button { | ||
display: inline-block; | display: inline-block; | ||
padding: 9px 15px; | padding: 9px 15px; | ||
border: 1px solid rgba(255,255,255,0. | border: 1px solid rgba(255,255,255,0.58); | ||
color: #fff !important; | color: #fff !important; | ||
font-weight: 700; | font-weight: 700; | ||
| Line 144: | Line 146: | ||
} | } | ||
.vu- | .vu-header-button:first-child { | ||
background: #fff; | background: #fff; | ||
color: var(--vu-navy) !important; | color: var(--vu-navy) !important; | ||
} | } | ||
.vu- | .vu-header-button:hover { | ||
transform: translateY(-2px); | transform: translateY(-2px); | ||
background: rgba(255,255,255,0.1); | background: rgba(255,255,255,0.1); | ||
| Line 155: | Line 157: | ||
} | } | ||
.vu- | .vu-header-button:first-child:hover { | ||
background: #fff; | background: #fff; | ||
} | } | ||
| Line 183: | Line 164: | ||
.vu-about { | .vu-about { | ||
display: grid; | display: grid; | ||
grid-template-columns: | grid-template-columns: 145px minmax(0, 1fr); | ||
margin-top: | margin-top: 15px; | ||
border-top: 1px solid var(--vu-border); | |||
border-bottom: 1px solid var(--vu-border); | border-bottom: 1px solid var(--vu-border); | ||
background: var(--vu-surface); | background: var(--vu-surface); | ||
| Line 196: | Line 176: | ||
align-items: center; | align-items: center; | ||
justify-content: center; | justify-content: center; | ||
overflow: hidden; | overflow: hidden; | ||
background: var(--vu-accent) | background: linear-gradient(135deg, var(--vu-accent) 0%, var(--vu-accent) 65%, transparent 65%); | ||
border-right: 1px solid var(--vu-border); | |||
} | } | ||
.vu-about-mark | .vu-about-mark img { | ||
width: 95px; | |||
opacity: 0. | height: auto; | ||
opacity: 0.15; | |||
} | } | ||
.vu-about-copy { | .vu-about-copy { | ||
padding: | padding: 21px 25px; | ||
border-left: 5px solid var(--vu-link); | border-left: 5px solid var(--vu-link); | ||
} | } | ||
.vu-about-copy h2 { | .vu-about-copy h2 { | ||
margin: 0 0 | margin: 0 0 10px; | ||
color: var(--vu-text); | |||
font-size: 1.45rem; | font-size: 1.45rem; | ||
} | } | ||
.vu-about-copy p { | .vu-about-copy p { | ||
margin: 0 0 | margin: 0 0 10px; | ||
line-height: 1. | line-height: 1.56; | ||
} | } | ||
| Line 229: | Line 207: | ||
} | } | ||
/* | /* Headings */ | ||
.vu- | .vu-heading { | ||
display: grid; | display: grid; | ||
grid-template-columns: | grid-template-columns: auto minmax(0, 1fr); | ||
gap: | align-items: center; | ||
gap: 13px; | |||
margin: 25px 0 12px; | |||
} | } | ||
.vu- | .vu-heading-title { | ||
color: var(--vu-text); | |||
font-size: 1.45rem; | |||
font-weight: 700; | |||
} | |||
.vu-heading-line { | |||
height: 1px; | |||
background: var(--vu-border); | |||
} | |||
/* Explore */ | |||
.vu-explore { | |||
display: grid; | |||
grid-template-columns: repeat(2, minmax(0, 1fr)); | |||
border-top: 1px solid var(--vu-border); | |||
border-left: 1px solid var(--vu-border); | |||
} | } | ||
.vu- | .vu-explore-link { | ||
position: relative; | position: relative; | ||
display: grid; | |||
display: | grid-template-columns: 72px minmax(0, 1fr) 28px; | ||
align-items: center; | align-items: center; | ||
min-height: 94px; | |||
padding-right: 18px; | |||
overflow: hidden; | |||
border-right: 1px solid var(--vu-border); | |||
border-bottom: 1px solid var(--vu-border); | |||
background: var(--vu-surface); | |||
color: var(--vu-text) !important; | color: var(--vu-text) !important; | ||
transition: background 0.15s ease, padding 0.15s ease; | |||
} | |||
.vu-explore-link:hover { | |||
padding-right: 13px; | |||
background: var(--vu-accent); | |||
text-decoration: none !important; | |||
} | } | ||
.vu- | .vu-explore-mark { | ||
align-self: stretch; | |||
display: flex; | display: flex; | ||
align-items: center; | align-items: center; | ||
justify-content: center; | justify-content: center; | ||
margin-right: 17px; | |||
margin- | |||
background: var(--vu-navy); | background: var(--vu-navy); | ||
color: #fff; | color: #fff; | ||
font-size: | font-size: 1.35rem; | ||
font-weight: | font-weight: 800; | ||
clip-path: polygon(0 0, calc(100% - 17px) 0, 100% 50%, calc(100% - 17px) 100%, 0 100%); | |||
} | |||
.vu-explore-copy { | |||
position: relative; | |||
z-index: 2; | |||
} | } | ||
.vu- | .vu-explore-title { | ||
display: block; | |||
margin-bottom: 4px; | |||
color: var(--vu-link); | |||
font-size: 1.08rem; | |||
font-weight: 700; | |||
} | } | ||
.vu- | .vu-explore-description { | ||
display: block; | |||
color: var(--vu-text); | |||
font-size: 0.9rem; | |||
line-height: 1.38; | |||
} | } | ||
.vu- | .vu-explore-arrow { | ||
position: relative; | |||
z-index: 2; | |||
color: var(--vu-link); | color: var(--vu-link); | ||
font-size: 1.55rem; | |||
font-weight: 700; | font-weight: 700; | ||
} | } | ||
/* Featured */ | /* Featured */ | ||
.vu-feature- | .vu-feature-layout { | ||
display: grid; | display: grid; | ||
grid-template-columns: minmax(0, 1.55fr) minmax( | grid-template-columns: minmax(0, 1.55fr) minmax(270px, 0.65fr); | ||
gap: | gap: 14px; | ||
} | } | ||
.vu- | .vu-feature { | ||
position: relative; | position: relative; | ||
min-height: | min-height: 245px; | ||
padding: | padding: 25px 31px; | ||
overflow: hidden; | overflow: hidden; | ||
border-left: 6px solid var(--vu- | border-left: 6px solid var(--vu-blue); | ||
background: var(--vu-surface) | background: linear-gradient(118deg, var(--vu-surface) 0%, var(--vu-surface) 76%, var(--vu-accent) 76%); | ||
} | } | ||
.vu- | .vu-feature::after { | ||
content: ""; | content: ""; | ||
position: absolute; | position: absolute; | ||
top: 0; | top: 0; | ||
right: 0; | right: 0; | ||
width: | width: 52px; | ||
height: | height: 52px; | ||
background: var(--vu- | background: var(--vu-navy-light); | ||
clip-path: polygon(100% 0, 100% 100%, 0 0); | |||
opacity: 0.9; | |||
} | |||
.vu-feature-watermark { | |||
position: absolute; | |||
right: 22px; | |||
bottom: -22px; | |||
width: 150px; | |||
opacity: 0.055; | |||
pointer-events: none; | |||
} | } | ||
.vu- | .vu-feature-label { | ||
margin-bottom: | position: relative; | ||
z-index: 2; | |||
margin-bottom: 9px; | |||
color: var(--vu-link); | color: var(--vu-link); | ||
font-size: 0. | font-size: 0.76rem; | ||
font-weight: 700; | font-weight: 700; | ||
letter-spacing: 0. | letter-spacing: 0.15em; | ||
text-transform: uppercase; | text-transform: uppercase; | ||
} | } | ||
.vu- | .vu-feature h2 { | ||
position: relative; | |||
z-index: 2; | |||
margin: 0 0 11px; | |||
color: var(--vu-text); | |||
font-size: 1.52rem; | |||
} | } | ||
.vu- | .vu-feature p { | ||
color: | position: relative; | ||
z-index: 2; | |||
max-width: 760px; | |||
margin: 0 0 10px; | |||
line-height: 1.52; | |||
} | |||
.vu-feature-link { | |||
position: relative; | |||
z-index: 2; | |||
display: inline-block; | |||
margin-top: 4px; | |||
padding: 8px 14px; | |||
border-left: 4px solid var(--vu-link); | |||
background: var(--vu-accent); | |||
color: var(--vu-link) !important; | |||
font-weight: 700; | |||
} | } | ||
/* Browse | .vu-feature-link:hover { | ||
text-decoration: none !important; | |||
} | |||
/* Browse */ | |||
.vu-browse { | .vu-browse { | ||
position: relative; | position: relative; | ||
padding: | padding: 21px; | ||
overflow: hidden; | overflow: hidden; | ||
background: var(--vu-navy); | background: linear-gradient(145deg, var(--vu-navy) 0%, var(--vu-navy) 72%, var(--vu-navy-light) 72%); | ||
color: #e0f0ff; | color: #e0f0ff; | ||
} | } | ||
.vu-browse | .vu-browse-watermark { | ||
position: absolute; | position: absolute; | ||
right: - | right: -14px; | ||
bottom: - | bottom: -24px; | ||
width: 150px; | |||
opacity: 0.045; | |||
pointer-events: none; | |||
} | } | ||
| Line 381: | Line 403: | ||
z-index: 2; | z-index: 2; | ||
margin: 0 0 13px; | margin: 0 0 13px; | ||
padding-bottom: 9px; | |||
border-bottom: 1px solid rgba(255,255,255,0.28); | |||
color: #fff; | color: #fff; | ||
font-size: 1.35rem; | font-size: 1.35rem; | ||
} | } | ||
.vu-browse- | .vu-browse-buttons { | ||
position: relative; | position: relative; | ||
z-index: 2; | z-index: 2; | ||
| Line 393: | Line 417: | ||
} | } | ||
.vu-browse- | .vu-browse-button { | ||
display: block; | display: block; | ||
padding: | padding: 10px 11px; | ||
border-left: 3px solid | border-left: 3px solid var(--vu-blue); | ||
background: rgba(255,255,255,0. | background: rgba(255,255,255,0.08); | ||
color: #e0f0ff !important; | color: #e0f0ff !important; | ||
font-weight: 650; | font-weight: 650; | ||
transition: background 0.15s ease, padding 0.15s ease; | |||
} | |||
.vu-browse-button:hover { | |||
padding-left: 14px; | |||
background: rgba(255,255,255,0.15); | |||
text-decoration: none !important; | |||
} | |||
/* People slideshow */ | |||
.vu-people { | |||
position: relative; | |||
overflow: hidden; | |||
border: 1px solid var(--vu-border); | |||
background: var(--vu-surface); | |||
} | |||
.vu-people::before { | |||
content: ""; | |||
position: absolute; | |||
top: 0; | |||
left: 0; | |||
width: 100%; | |||
height: 7px; | |||
background: linear-gradient(90deg, var(--vu-blue), var(--vu-navy-light)); | |||
z-index: 3; | |||
} | |||
.vu-people-stage { | |||
display: grid; | |||
grid-template-columns: minmax(290px, 38%) minmax(0, 1fr); | |||
min-height: 390px; | |||
} | |||
.vu-person-image { | |||
position: relative; | |||
overflow: hidden; | |||
background: var(--vu-navy); | |||
} | |||
.vu-person-image::after { | |||
content: ""; | |||
position: absolute; | |||
right: -1px; | |||
top: 0; | |||
width: 72px; | |||
height: 100%; | |||
background: var(--vu-surface); | |||
clip-path: polygon(100% 0, 100% 100%, 0 100%); | |||
z-index: 2; | |||
} | |||
.vu-person-image img { | |||
width: 100%; | |||
height: 100%; | |||
min-height: 390px; | |||
object-fit: cover; | |||
display: block; | |||
transition: opacity 0.25s ease, transform 0.5s ease; | |||
} | |||
.vu-people.is-changing .vu-person-image img { | |||
opacity: 0.35; | |||
transform: scale(1.03); | |||
} | |||
.vu-person-copy { | |||
position: relative; | |||
display: flex; | |||
flex-direction: column; | |||
justify-content: center; | |||
padding: 42px 50px 42px 34px; | |||
overflow: hidden; | |||
} | |||
.vu-person-copy::after { | |||
content: ""; | |||
position: absolute; | |||
right: -45px; | |||
bottom: -55px; | |||
width: 220px; | |||
height: 220px; | |||
border: 42px solid var(--vu-accent); | |||
transform: rotate(18deg); | |||
opacity: 0.8; | |||
} | |||
.vu-person-kicker { | |||
position: relative; | |||
z-index: 2; | |||
margin-bottom: 9px; | |||
color: var(--vu-link); | |||
font-size: 0.76rem; | |||
font-weight: 700; | |||
letter-spacing: 0.15em; | |||
text-transform: uppercase; | |||
} | |||
.vu-person-title { | |||
position: relative; | |||
z-index: 2; | |||
margin: 0 0 13px; | |||
color: var(--vu-text); | |||
font-size: clamp(1.8rem, 4vw, 2.8rem); | |||
line-height: 1.08; | |||
} | } | ||
.vu- | .vu-person-extract { | ||
background: | position: relative; | ||
z-index: 2; | |||
max-width: 720px; | |||
margin: 0 0 18px; | |||
font-size: 1rem; | |||
line-height: 1.62; | |||
} | |||
.vu-person-open { | |||
position: relative; | |||
z-index: 2; | |||
align-self: flex-start; | |||
display: inline-block; | |||
padding: 9px 14px; | |||
border-left: 4px solid var(--vu-link); | |||
background: var(--vu-accent); | |||
color: var(--vu-link) !important; | |||
font-weight: 700; | |||
} | |||
.vu-person-open:hover { | |||
text-decoration: none !important; | text-decoration: none !important; | ||
} | |||
.vu-people-controls { | |||
display: grid; | |||
grid-template-columns: auto auto minmax(0, 1fr) auto auto; | |||
align-items: center; | |||
gap: 8px; | |||
padding: 11px 14px; | |||
border-top: 1px solid var(--vu-border); | |||
background: var(--vu-accent); | |||
} | |||
.vu-slide-button { | |||
display: inline-flex; | |||
align-items: center; | |||
justify-content: center; | |||
min-width: 42px; | |||
height: 36px; | |||
padding: 0 12px; | |||
border: 1px solid var(--vu-border); | |||
background: var(--vu-surface); | |||
color: var(--vu-link); | |||
font: inherit; | |||
font-weight: 700; | |||
cursor: pointer; | |||
} | |||
.vu-slide-button:hover, | |||
.vu-slide-button:focus { | |||
border-color: var(--vu-link); | |||
outline: none; | |||
} | |||
.vu-slide-progress { | |||
position: relative; | |||
height: 4px; | |||
margin: 0 8px; | |||
overflow: hidden; | |||
background: var(--vu-border); | |||
} | |||
.vu-slide-progress-bar { | |||
width: 0; | |||
height: 100%; | |||
background: var(--vu-link); | |||
} | |||
.vu-people.is-playing .vu-slide-progress-bar { | |||
animation: vu-slide-progress 9s linear forwards; | |||
} | |||
.vu-slide-count { | |||
min-width: 62px; | |||
text-align: right; | |||
color: var(--vu-text); | |||
font-size: 0.88rem; | |||
font-weight: 700; | |||
} | |||
.vu-people-status { | |||
position: absolute; | |||
left: 15px; | |||
top: 15px; | |||
z-index: 5; | |||
padding: 7px 10px; | |||
background: rgba(27,34,61,0.88); | |||
color: #fff; | |||
font-size: 0.82rem; | |||
} | |||
.vu-people-status[hidden] { | |||
display: none; | |||
} | |||
@keyframes vu-slide-progress { | |||
from { width: 0; } | |||
to { width: 100%; } | |||
} | } | ||
| Line 411: | Line 638: | ||
.vu-guide { | .vu-guide { | ||
display: grid; | display: grid; | ||
grid-template-columns: minmax(0, 1. | grid-template-columns: minmax(0, 1.3fr) minmax(300px, 0.7fr); | ||
border-top: 1px solid var(--vu-border); | border-top: 1px solid var(--vu-border); | ||
border-bottom: 1px solid var(--vu-border); | border-bottom: 1px solid var(--vu-border); | ||
| Line 417: | Line 644: | ||
.vu-guide-copy { | .vu-guide-copy { | ||
padding: | padding: 21px 25px 21px 0; | ||
} | } | ||
.vu-guide-copy h2, | .vu-guide-copy h2, | ||
.vu- | .vu-family-area h2 { | ||
margin: 0 0 | margin: 0 0 10px; | ||
font-size: 1. | color: var(--vu-text); | ||
font-size: 1.3rem; | |||
} | } | ||
.vu-guide-copy p { | .vu-guide-copy p { | ||
margin: 0 0 10px; | margin: 0 0 10px; | ||
line-height: 1. | line-height: 1.53; | ||
} | } | ||
| Line 435: | Line 663: | ||
} | } | ||
.vu- | .vu-route-buttons { | ||
padding: | display: flex; | ||
flex-wrap: wrap; | |||
gap: 7px; | |||
margin-top: 13px; | |||
} | |||
.vu-route-button { | |||
display: inline-block; | |||
padding: 8px 11px; | |||
border-bottom: 3px solid var(--vu-link); | |||
background: var(--vu-accent); | |||
color: var(--vu-link) !important; | |||
font-weight: 650; | |||
} | |||
.vu-route-button:hover { | |||
text-decoration: none !important; | |||
transform: translateY(-1px); | |||
} | |||
.vu-family-area { | |||
padding: 21px 0 21px 25px; | |||
border-left: 1px solid var(--vu-border); | border-left: 1px solid var(--vu-border); | ||
} | } | ||
.vu-family- | .vu-family-links { | ||
display: grid; | display: grid; | ||
gap: | gap: 6px; | ||
} | } | ||
.vu-family-link { | .vu-family-link { | ||
position: relative; | position: relative; | ||
display: | display: grid; | ||
padding: | grid-template-columns: 8px minmax(0, 1fr); | ||
align-items: center; | |||
gap: 10px; | |||
padding: 8px 11px; | |||
background: var(--vu-accent); | background: var(--vu-accent); | ||
color: var(--vu-link) !important; | color: var(--vu-link) !important; | ||
font-weight: 650; | font-weight: 650; | ||
transition: padding 0.15s ease; | |||
} | } | ||
.vu-family-link::before { | .vu-family-link::before { | ||
content: ""; | content: ""; | ||
width: 8px; | |||
height: 100%; | |||
width: | |||
height: | |||
background: var(--vu-link); | background: var(--vu-link); | ||
clip-path: polygon(0 0, 100% 50%, 0 100%); | |||
} | } | ||
.vu-family-link:hover { | .vu-family-link:hover { | ||
padding-left: 14px; | |||
text-decoration: none !important; | text-decoration: none !important; | ||
} | } | ||
/* Footer | /* Footer */ | ||
.vu-information { | .vu-information { | ||
| Line 491: | Line 726: | ||
grid-template-columns: repeat(2, minmax(0, 1fr)); | grid-template-columns: repeat(2, minmax(0, 1fr)); | ||
gap: 1px; | gap: 1px; | ||
margin-top: | margin-top: 15px; | ||
border: 1px solid var(--vu-border); | |||
background: var(--vu-border); | background: var(--vu-border); | ||
} | } | ||
.vu-information section { | .vu-information section { | ||
padding: | padding: 18px 21px; | ||
background: var(--vu-surface); | background: var(--vu-surface); | ||
} | } | ||
.vu-information h2 { | .vu-information h2 { | ||
margin: 0 0 | margin: 0 0 7px; | ||
font-size: 1. | color: var(--vu-text); | ||
font-size: 1.2rem; | |||
} | } | ||
| Line 513: | Line 749: | ||
.vu-notice { | .vu-notice { | ||
display: grid; | display: grid; | ||
grid-template-columns: | grid-template-columns: 155px minmax(0, 1fr); | ||
margin-top: | margin-top: 12px; | ||
border: 1px solid #ab7f2a; | border: 1px solid #ab7f2a; | ||
background: #fef6e7; | background: #fef6e7; | ||
| Line 528: | Line 764: | ||
} | } | ||
.vu-notice- | .vu-notice-copy { | ||
padding: 15px 18px; | padding: 15px 18px; | ||
color: var(--vu-text); | |||
line-height: 1.5; | line-height: 1.5; | ||
} | } | ||
/* | /* Missing pages */ | ||
.vu- | .vu-main a.new, | ||
.vu- | .vu-main a.new:visited { | ||
color: var(--vu-red) !important; | color: var(--vu-red) !important; | ||
} | } | ||
.vu- | .vu-main .vu-header-button.new { | ||
border-color: var(--vu-red); | border-color: var(--vu-red); | ||
color: # | color: #ff8b8b !important; | ||
} | } | ||
.vu- | .vu-main .vu-explore-link.new .vu-explore-mark { | ||
background: var(--vu-red); | background: var(--vu-red); | ||
} | } | ||
.vu- | .vu-main .vu-explore-link.new .vu-explore-title, | ||
.vu- | .vu-main .vu-family-link.new, | ||
.vu-main .vu-route-button.new, | |||
.vu-main .vu-feature-link.new { | |||
color: var(--vu-red) !important; | color: var(--vu-red) !important; | ||
} | } | ||
| Line 557: | Line 795: | ||
/* Dark mode */ | /* Dark mode */ | ||
html.skin-theme-clientpref-night .vu- | html.skin-theme-clientpref-night .vu-main, | ||
body.skin-theme-clientpref-night .vu- | body.skin-theme-clientpref-night .vu-main { | ||
--vu-border: #444; | --vu-border: #444; | ||
--vu-text: #d0d0d0; | --vu-text: #d0d0d0; | ||
| Line 573: | Line 811: | ||
@media (prefers-color-scheme: dark) { | @media (prefers-color-scheme: dark) { | ||
html.skin-theme-clientpref-os .vu- | html.skin-theme-clientpref-os .vu-main { | ||
--vu-border: #444; | --vu-border: #444; | ||
--vu-text: #d0d0d0; | --vu-text: #d0d0d0; | ||
| Line 590: | Line 828: | ||
@media (max-width: 900px) { | @media (max-width: 900px) { | ||
.vu- | .vu-header { | ||
grid-template-columns: 190px minmax(0, 1fr); | grid-template-columns: 190px minmax(0, 1fr); | ||
} | } | ||
.vu- | .vu-header-copy { | ||
padding: 34px | padding: 34px 31px 34px 48px; | ||
} | } | ||
.vu- | .vu-feature-layout, | ||
grid-template-columns: | .vu-guide { | ||
grid-template-columns: 1fr; | |||
} | } | ||
.vu- | .vu-people-stage { | ||
grid-template-columns: 42% minmax(0, 1fr); | |||
} | } | ||
.vu- | .vu-person-copy { | ||
padding: 36px 34px 36px 24px; | |||
} | } | ||
.vu- | .vu-family-area { | ||
padding: | padding: 20px 0; | ||
border-top: 1px solid var(--vu-border); | border-top: 1px solid var(--vu-border); | ||
border-left: 0; | border-left: 0; | ||
| Line 624: | Line 861: | ||
@media (max-width: 650px) { | @media (max-width: 650px) { | ||
.vu- | .vu-header { | ||
grid-template-columns: 1fr; | grid-template-columns: 1fr; | ||
text-align: center; | text-align: center; | ||
} | } | ||
.vu- | .vu-logo-panel { | ||
min-height: | min-height: 145px; | ||
border-right: 0; | border-right: 0; | ||
border-bottom: 1px solid rgba(255,255,255,0. | border-bottom: 1px solid rgba(255,255,255,0.15); | ||
} | } | ||
.vu- | .vu-logo-panel::after { | ||
display: none; | display: none; | ||
} | } | ||
.vu- | .vu-logo-panel img { | ||
max-width: 120px; | max-width: 120px; | ||
} | } | ||
.vu- | .vu-header-copy { | ||
padding: | padding: 27px 20px 31px; | ||
} | } | ||
.vu- | .vu-header-actions, | ||
.vu-route-buttons { | |||
justify-content: center; | justify-content: center; | ||
} | } | ||
| Line 656: | Line 894: | ||
.vu-about-mark { | .vu-about-mark { | ||
display: none; | |||
} | } | ||
| Line 669: | Line 902: | ||
} | } | ||
.vu- | .vu-explore { | ||
grid-template-columns: | grid-template-columns: 1fr; | ||
} | |||
.vu-people-stage { | |||
grid-template-columns: 1fr; | |||
} | |||
.vu-person-image { | |||
height: 300px; | |||
} | |||
.vu-person-image::after { | |||
display: none; | |||
} | |||
.vu-person-image img { | |||
min-height: 300px; | |||
} | |||
.vu-person-copy { | |||
padding: 28px 22px 32px; | |||
} | |||
.vu-people-controls { | |||
grid-template-columns: auto auto minmax(50px, 1fr) auto auto; | |||
} | } | ||
| Line 676: | Line 933: | ||
.vu-notice { | .vu-notice { | ||
grid-template-columns: 1fr; | grid-template-columns: 1fr; | ||
} | |||
} | |||
@media (max-width: 430px) { | |||
.vu-title { | |||
font-size: 2.75rem; | |||
} | |||
.vu-header-button { | |||
width: 100%; | |||
text-align: center; | |||
} | } | ||
.vu-browse- | .vu-browse-buttons { | ||
grid-template-columns: 1fr; | grid-template-columns: 1fr; | ||
} | |||
.vu-explore-link { | |||
grid-template-columns: 62px minmax(0, 1fr) 22px; | |||
} | } | ||
} | } | ||
</style> | </style> | ||
<div class="vu- | <div class="vu-main"> | ||
<header class="vu- | <header class="vu-header"> | ||
<div class="vu- | <div class="vu-logo-panel"> | ||
<img src="/wiki/Special:Redirect/file/Vu-logo.png" alt="Vrienden Universe logo"> | <img src="/wiki/Special:Redirect/file/Vu-logo.png" alt="Vrienden Universe logo"> | ||
</div> | </div> | ||
<div class="vu- | <div class="vu-header-copy"> | ||
<div class="vu-title">Vrienden Universe</div> | <div class="vu-title">Vrienden Universe</div> | ||
<div class="vu- | <div class="vu-subtitle"> | ||
The history of De Vrienden and the wider world recorded around them. | |||
</div> | </div> | ||
< | <div class="vu-header-actions"> | ||
<a class="vu- | <a class="vu-header-button" data-wiki-title="Timeline" href="/wiki/Timeline">Timeline</a> | ||
<a class="vu- | <a class="vu-header-button" href="/wiki/Special:Random">Random page</a> | ||
<a class="vu- | <a class="vu-header-button" href="/wiki/Special:RecentChanges">Recent changes</a> | ||
</ | </div> | ||
</div> | </div> | ||
</header> | </header> | ||
<section class="vu-about"> | <section class="vu-about"> | ||
<div class="vu-about-mark">< | <div class="vu-about-mark"> | ||
<img src="/wiki/Special:Redirect/file/Vu-logo.png" alt=""> | |||
</div> | |||
<div class="vu-about-copy"> | <div class="vu-about-copy"> | ||
| Line 714: | Line 988: | ||
<p> | <p> | ||
The <strong>Vrienden Universe</strong> began in 2019 as | The <strong>Vrienden Universe</strong> began in 2019 as | ||
<a data-title="De Lijers De Vrienden" href="/wiki/De_Lijers_De_Vrienden"><strong>De Lijers De Vrienden</strong></a>, | <a data-wiki-title="De Lijers De Vrienden" href="/wiki/De_Lijers_De_Vrienden"><strong>De Lijers De Vrienden</strong></a>, | ||
a project about <a data-title="De Vrienden" href="/wiki/De_Vrienden">De Vrienden</a>. | a project about <a data-wiki-title="De Vrienden" href="/wiki/De_Vrienden">De Vrienden</a>. | ||
The project expanded as related pages were added and became a single encyclopedia covering the wider history around its original subject. | |||
</p> | </p> | ||
<p> | <p> | ||
The wiki now contains hundreds of connected pages. | The wiki now contains hundreds of connected pages developed over several years. | ||
Information established on one page is carried into related articles, allowing readers to follow the same history throughout the site. | |||
</p> | </p> | ||
</div> | </div> | ||
</section> | </section> | ||
<div class="vu- | <div class="vu-heading"> | ||
<div class="vu-heading-title">Explore</div> | |||
<div class="vu-heading-line"></div> | |||
</div> | |||
<nav class="vu- | <nav class="vu-explore"> | ||
<a class="vu- | <a class="vu-explore-link" data-wiki-title="Category:People" href="/wiki/Category:People"> | ||
<span class="vu- | <span class="vu-explore-mark">P</span> | ||
<span class="vu- | <span class="vu-explore-copy"> | ||
<span class="vu- | <span class="vu-explore-title">People</span> | ||
<span class="vu-explore-description">Biographies recorded across the wiki.</span> | |||
</span> | |||
<span class="vu-explore-arrow">></span> | |||
</a> | </a> | ||
<a class="vu- | <a class="vu-explore-link" data-wiki-title="Category:Locations" href="/wiki/Category:Locations"> | ||
<span class="vu- | <span class="vu-explore-mark">L</span> | ||
<span class="vu- | <span class="vu-explore-copy"> | ||
<span class="vu- | <span class="vu-explore-title">Locations</span> | ||
<span class="vu-explore-description">Places documented throughout the history.</span> | |||
</span> | |||
<span class="vu-explore-arrow">></span> | |||
</a> | </a> | ||
<a class="vu- | <a class="vu-explore-link" data-wiki-title="Category:Families" href="/wiki/Category:Families"> | ||
<span class="vu- | <span class="vu-explore-mark">F</span> | ||
<span class="vu- | <span class="vu-explore-copy"> | ||
<span class="vu-explore-title">Families</span> | |||
<span class="vu-explore-description">Family lines and their members.</span> | |||
</span> | |||
<span class="vu-explore-arrow">></span> | |||
</a> | </a> | ||
<a class="vu- | <a class="vu-explore-link" data-wiki-title="Category:Organizations" href="/wiki/Category:Organizations"> | ||
<span class="vu- | <span class="vu-explore-mark">O</span> | ||
<span class="vu- | <span class="vu-explore-copy"> | ||
<span class="vu-explore-title">Organizations</span> | |||
<span class="vu-explore-description">Institutions and organized groups.</span> | |||
</span> | |||
<span class="vu-explore-arrow">></span> | |||
</a> | </a> | ||
<a class="vu- | <a class="vu-explore-link" data-wiki-title="Category:Events" href="/wiki/Category:Events"> | ||
<span class="vu- | <span class="vu-explore-mark">E</span> | ||
<span class="vu- | <span class="vu-explore-copy"> | ||
<span class="vu- | <span class="vu-explore-title">Events</span> | ||
<span class="vu-explore-description">Events recorded throughout the history.</span> | |||
</span> | |||
<span class="vu-explore-arrow">></span> | |||
</a> | </a> | ||
<a class="vu- | <a class="vu-explore-link" data-wiki-title="Category:Eras" href="/wiki/Category:Eras"> | ||
<span class="vu- | <span class="vu-explore-mark">H</span> | ||
<span class="vu- | <span class="vu-explore-copy"> | ||
<span class="vu-explore-title">Eras</span> | |||
<span class="vu-explore-description">The historical periods used by the wiki.</span> | |||
</span> | |||
<span class="vu-explore-arrow">></span> | |||
</a> | </a> | ||
</nav> | </nav> | ||
<div class="vu | <div class="vu-heading"> | ||
<div class="vu-heading-title">Featured and browse</div> | |||
<div class="vu-heading-line"></div> | |||
</div> | |||
<div class="vu-feature- | <div class="vu-feature-layout"> | ||
<section class="vu- | <section class="vu-feature"> | ||
< | <img class="vu-feature-watermark" src="/wiki/Special:Redirect/file/Vu-logo.png" alt=""> | ||
<div | <div class="vu-feature-label">Featured page</div> | ||
< | |||
</ | <h2> | ||
<a data-wiki-title="Reichsministerium für Bergbau und Rohstoffe" href="/wiki/Reichsministerium_f%C3%BCr_Bergbau_und_Rohstoffe"> | |||
Reichsministerium für Bergbau und Rohstoffe | |||
</a> | |||
</h2> | |||
<p> | |||
The Reichsministerium für Bergbau und Rohstoffe was a central ministry of the | |||
<a data-wiki-title="Government of the Tanoa Einsatzgruppen" href="/wiki/Government_of_the_Tanoa_Einsatzgruppen">Government of the Tanoa Einsatzgruppen</a>. | |||
It administered mining and the state supply of raw materials. | |||
</p> | |||
<p> | |||
The ministry supported the command economy of | |||
<a data-wiki-title="Tanoa" href="/wiki/Tanoa">Tanoa</a> | |||
and supplied the regime's industrial system. | |||
</p> | |||
<a class="vu-feature-link" data-wiki-title="Reichsministerium für Bergbau und Rohstoffe" href="/wiki/Reichsministerium_f%C3%BCr_Bergbau_und_Rohstoffe"> | |||
Open page | |||
</a> | |||
</section> | </section> | ||
<nav class="vu-browse"> | <nav class="vu-browse"> | ||
<img class="vu-browse-watermark" src="/wiki/Special:Redirect/file/Vu-logo.png" alt=""> | |||
<h2>Browse</h2> | <h2>Browse</h2> | ||
<div class="vu-browse- | <div class="vu-browse-buttons"> | ||
<a class="vu-browse- | <a class="vu-browse-button" href="/wiki/Special:AllPages">All pages</a> | ||
<a class="vu-browse- | <a class="vu-browse-button" href="/wiki/Special:Categories">Categories</a> | ||
<a class="vu-browse- | <a class="vu-browse-button" href="/wiki/Special:NewPages">New pages</a> | ||
<a class="vu-browse- | <a class="vu-browse-button" href="/wiki/Special:RecentChanges">Recent changes</a> | ||
<a class="vu-browse- | <a class="vu-browse-button" href="/wiki/Special:Random">Random page</a> | ||
<a class="vu-browse- | <a class="vu-browse-button" href="/wiki/Special:SpecialPages">Special pages</a> | ||
</div> | </div> | ||
</nav> | </nav> | ||
</div> | </div> | ||
<div class="vu-section-heading">< | <div class="vu-heading"> | ||
<div class="vu-heading-title">People</div> | |||
<div class="vu-heading-line"></div> | |||
</div> | |||
<section class="vu-people" id="vu-people-slider" aria-label="People slideshow"> | |||
<div class="vu-people-status" id="vu-people-status" hidden></div> | |||
<div class="vu-people-stage"> | |||
<div class="vu-person-image"> | |||
<img | |||
id="vu-person-image" | |||
src="/wiki/Special:Redirect/file/ToonioNoord.jpg" | |||
alt="Toonio Noord"> | |||
</div> | |||
<div class="vu-person-copy"> | |||
<h2 class="vu-person-title" id="vu-person-title">Toonio Noord</h2> | |||
<p class="vu-person-extract" id="vu-person-extract"> | |||
Toonio Noord, born 4 April 1969, is a Dutch registration official and former security guard from Vriendendam. He works for the Stichting Noord Registratiebureau and is a member of the Noord family. | |||
</p> | |||
<a | |||
class="vu-person-open" | |||
id="vu-person-link" | |||
href="/wiki/Toonio_Noord"> | |||
Open page | |||
</a> | |||
</div> | |||
</div> | |||
<div class="vu-people-controls"> | |||
<button class="vu-slide-button" id="vu-person-prev" type="button" aria-label="Previous person"><</button> | |||
<button class="vu-slide-button" id="vu-person-toggle" type="button" aria-label="Pause slideshow">Pause</button> | |||
<div class="vu-slide-progress" aria-hidden="true"> | |||
<div class="vu-slide-progress-bar"></div> | |||
</div> | |||
<div class="vu-slide-count" id="vu-person-count">1 / 1</div> | |||
<button class="vu-slide-button" id="vu-person-next" type="button" aria-label="Next person">></button> | |||
</div> | |||
</section> | |||
<div class="vu-heading"> | |||
<div class="vu-heading-title">How to use this wiki</div> | |||
<div class="vu-heading-line"></div> | |||
</div> | |||
<section class="vu-guide"> | <section class="vu-guide"> | ||
<div class="vu-guide-copy"> | <div class="vu-guide-copy"> | ||
<h2> | <h2>Choose a starting point</h2> | ||
<p> | <p> | ||
Most | Most articles link directly to the subjects needed to continue through the history. | ||
Readers can begin with a | Readers can begin with <a data-wiki-title="De Vrienden" href="/wiki/De_Vrienden">De Vrienden</a> | ||
or select a broader section above. | |||
</p> | </p> | ||
<p> | <p> | ||
The principal family pages provide the main route from De Vrienden into family history. | |||
Index pages provide access to the rest of the site. | |||
</p> | </p> | ||
< | <div class="vu-route-buttons"> | ||
<a class="vu-route-button" data-wiki-title="Timeline" href="/wiki/Timeline">Timeline</a> | |||
<a data-title="Factions" href="/wiki/Factions">Factions</a> | <a class="vu-route-button" data-wiki-title="Factions" href="/wiki/Factions">Factions</a> | ||
<a data-title="List of organizations" href="/wiki/List_of_organizations"> | <a class="vu-route-button" data-wiki-title="List of organizations" href="/wiki/List_of_organizations">Organizations</a> | ||
</div> | |||
</ | |||
</div> | </div> | ||
<div class="vu- | <div class="vu-family-area"> | ||
<h2>Principal families</h2> | <h2>Principal families</h2> | ||
<div class="vu-family- | <div class="vu-family-links"> | ||
<a class="vu-family-link" data-title="Noord family" href="/wiki/Noord_family">Noord family</a> | <a class="vu-family-link" data-wiki-title="Noord family" href="/wiki/Noord_family">Noord family</a> | ||
<a class="vu-family-link" data-title="Paap family" href="/wiki/Paap_family">Paap family</a> | <a class="vu-family-link" data-wiki-title="Paap family" href="/wiki/Paap_family">Paap family</a> | ||
<a class="vu-family-link" data-title="Van Hetten family" href="/wiki/Van_Hetten_family">Van Hetten family</a> | <a class="vu-family-link" data-wiki-title="Van Hetten family" href="/wiki/Van_Hetten_family">Van Hetten family</a> | ||
<a class="vu-family-link" data-title="Hoos family" href="/wiki/Hoos_family">Hoos family</a> | <a class="vu-family-link" data-wiki-title="Hoos family" href="/wiki/Hoos_family">Hoos family</a> | ||
<a class="vu-family-link" data-title="Schroeter family" href="/wiki/Schroeter_family">Schroeter family</a> | <a class="vu-family-link" data-wiki-title="Schroeter family" href="/wiki/Schroeter_family">Schroeter family</a> | ||
</div> | </div> | ||
</div> | </div> | ||
| Line 839: | Line 1,202: | ||
<p> | <p> | ||
Information about | Information about contributing is available on the | ||
<a data-title="Vrienden Universe:Community" href="/wiki/Vrienden_Universe:Community">community page</a>. | <a data-wiki-title="Vrienden Universe:Community" href="/wiki/Vrienden_Universe:Community">community page</a>. | ||
</p> | </p> | ||
</section> | </section> | ||
| Line 848: | Line 1,211: | ||
<p> | <p> | ||
Information about the | Information about the scope of the site is available in the | ||
<a data-title="Vrienden Universe:General disclaimer" href="/wiki/Vrienden_Universe:General_disclaimer">disclaimer</a>. | <a data-wiki-title="Vrienden Universe:General disclaimer" href="/wiki/Vrienden_Universe:General_disclaimer">disclaimer</a>. | ||
</p> | </p> | ||
</section> | </section> | ||
| Line 857: | Line 1,220: | ||
<div class="vu-notice-title">Content notice</div> | <div class="vu-notice-title">Content notice</div> | ||
<div class="vu-notice- | <div class="vu-notice-copy"> | ||
This wiki contains material intended for mature audiences. Some pages | This wiki contains material intended for mature audiences. | ||
Some pages contain disturbing subject matter. Reader discretion is advised. | |||
</div> | </div> | ||
</div> | </div> | ||
| Line 867: | Line 1,230: | ||
<script> | <script> | ||
(function () { | (function () { | ||
if ( | "use strict"; | ||
function onReady(callback) { | |||
if (document.readyState === "loading") { | |||
document.addEventListener("DOMContentLoaded", callback, { once: true }); | |||
} else { | |||
callback(); | |||
} | |||
} | } | ||
onReady(function () { | |||
var | var root = document.querySelector(".vu-main"); | ||
var | var slider = document.getElementById("vu-people-slider"); | ||
var status = document.getElementById("vu-people-status"); | |||
var image = document.getElementById("vu-person-image"); | |||
var title = document.getElementById("vu-person-title"); | |||
var extract = document.getElementById("vu-person-extract"); | |||
var pageLink = document.getElementById("vu-person-link"); | |||
var count = document.getElementById("vu-person-count"); | |||
var previous = document.getElementById("vu-person-prev"); | |||
var next = document.getElementById("vu-person-next"); | |||
var toggle = document.getElementById("vu-person-toggle"); | |||
if (!root) { | if ( | ||
!root || | |||
!slider || | |||
!status || | |||
!image || | |||
!title || | |||
!extract || | |||
!pageLink || | |||
!count || | |||
!previous || | |||
!next || | |||
!toggle | |||
) { | |||
return; | return; | ||
} | } | ||
var | var fallbackImage = "/wiki/Special:Redirect/file/Vu-logo.png"; | ||
var cacheKey = "vu-main-people-slides-v9"; | |||
var cacheLifetime = 6 * 60 * 60 * 1000; | |||
var slideInterval = 9000; | |||
var apiPath = "/wiki/api.php"; | |||
var people = []; | |||
var currentIndex = 0; | |||
var timer = null; | |||
var playing = false; | |||
previous.disabled = true; | |||
next.disabled = true; | |||
toggle.disabled = true; | |||
count.textContent = "1 / 1"; | |||
toggle.textContent = "Play"; | |||
previous.textContent = "<"; | |||
next.textContent = ">"; | |||
function showStatus(message) { | |||
if (!message) { | |||
status.hidden = true; | |||
status.textContent = ""; | |||
return; | |||
} | |||
status.textContent = message; | |||
status.hidden = false; | |||
} | |||
function shuffle(items) { | |||
var result = items.slice(); | |||
for (var index = result.length - 1; index > 0; index--) { | |||
var randomIndex = Math.floor(Math.random() * (index + 1)); | |||
var temporary = result[index]; | |||
result[index] = result[randomIndex]; | |||
result[randomIndex] = temporary; | |||
} | |||
var | return result; | ||
.map(function ( | } | ||
return | |||
}) | function cleanText(value) { | ||
. | return String(value || "") | ||
return | .replace(/\[\s*\d+(?:\.\d+)?\s*\]/g, "") | ||
.replace(/\s+/g, " ") | |||
.trim(); | |||
} | |||
function shorten(value, limit) { | |||
var cleaned = cleanText(value); | |||
if (!cleaned || cleaned.length <= limit) { | |||
return cleaned; | |||
} | |||
var cut = cleaned.slice(0, limit); | |||
var sentenceEnd = Math.max( | |||
cut.lastIndexOf(". "), | |||
cut.lastIndexOf("! "), | |||
cut.lastIndexOf("? ") | |||
); | |||
if (sentenceEnd > 180) { | |||
return cut.slice(0, sentenceEnd + 1); | |||
} | |||
var finalSpace = cut.lastIndexOf(" "); | |||
return cut.slice(0, finalSpace > 0 ? finalSpace : limit) + "..."; | |||
} | |||
function getImage(page) { | |||
if (page.thumbnail && page.thumbnail.source) { | |||
return page.thumbnail.source; | |||
} | |||
if (page.original && page.original.source) { | |||
return page.original.source; | |||
} | |||
return ""; | |||
} | |||
function pageUrl(pageTitle) { | |||
if (window.mw && mw.util) { | |||
return mw.util.getUrl(pageTitle); | |||
} | |||
return "/wiki/" + encodeURIComponent(pageTitle.replace(/ /g, "_")); | |||
} | |||
function normalizePages(pages) { | |||
return shuffle( | |||
pages | |||
.filter(function (page) { | |||
return page && !page.missing && page.title; | |||
}) | |||
.map(function (page) { | |||
var pageExtract = shorten(page.extract, 650); | |||
if (!pageExtract) { | |||
pageExtract = | |||
"This page is listed in Category:People. Open the page for the full article."; | |||
} | |||
return { | |||
title: page.title, | |||
extract: pageExtract, | |||
image: getImage(page) || fallbackImage, | |||
url: page.fullurl || pageUrl(page.title) | |||
}; | |||
}) | |||
); | |||
} | |||
function readCache() { | |||
try { | |||
var cached = JSON.parse( | |||
window.sessionStorage.getItem(cacheKey) || "null" | |||
); | |||
if ( | |||
cached && | |||
cached.savedAt && | |||
Date.now() - cached.savedAt < cacheLifetime && | |||
Array.isArray(cached.people) && | |||
cached.people.length > 1 | |||
) { | |||
return cached.people; | |||
} | |||
} catch (error) { | |||
return null; | |||
} | |||
return null; | |||
} | |||
function saveCache(items) { | |||
try { | |||
window.sessionStorage.setItem( | |||
cacheKey, | |||
JSON.stringify({ | |||
savedAt: Date.now(), | |||
people: items | |||
}) | |||
); | |||
} catch (error) { | |||
return; | |||
} | |||
} | |||
function preloadNext() { | |||
if (people.length < 2) { | |||
return; | |||
} | |||
var nextIndex = (currentIndex + 1) % people.length; | |||
var preload = new Image(); | |||
preload.src = people[nextIndex].image; | |||
} | |||
function restartProgress() { | |||
slider.classList.remove("is-playing"); | |||
void slider.offsetWidth; | |||
if (playing && people.length > 1) { | |||
slider.classList.add("is-playing"); | |||
} | |||
} | |||
function scheduleNext() { | |||
if (timer) { | |||
window.clearTimeout(timer); | |||
} | |||
restartProgress(); | |||
if (!playing || people.length < 2) { | |||
return; | |||
} | |||
timer = window.setTimeout(function () { | |||
showSlide(currentIndex + 1); | |||
}, slideInterval); | |||
} | |||
function showSlide(index) { | |||
if (!people.length) { | |||
return; | |||
} | |||
currentIndex = (index + people.length) % people.length; | |||
var person = people[currentIndex]; | |||
slider.classList.add("is-changing"); | |||
window.setTimeout(function () { | |||
image.src = person.image || fallbackImage; | |||
image.alt = person.title; | |||
title.textContent = person.title; | |||
extract.textContent = person.extract; | |||
pageLink.href = person.url; | |||
pageLink.textContent = "Open page"; | |||
count.textContent = | |||
String(currentIndex + 1) + " / " + String(people.length); | |||
window.setTimeout(function () { | |||
slider.classList.remove("is-changing"); | |||
}, 40); | |||
preloadNext(); | |||
}, 140); | |||
scheduleNext(); | |||
} | |||
function setPlaying(value) { | |||
playing = Boolean(value && people.length > 1); | |||
toggle.textContent = playing ? "Pause" : "Play"; | |||
toggle.setAttribute( | |||
"aria-label", | |||
playing ? "Pause slideshow" : "Play slideshow" | |||
); | |||
if (playing) { | |||
scheduleNext(); | |||
} else { | |||
if (timer) { | |||
window.clearTimeout(timer); | |||
} | |||
slider.classList.remove("is-playing"); | |||
} | |||
} | |||
function activateSlides(items) { | |||
if (!Array.isArray(items) || !items.length) { | |||
showStatus("No people pages were loaded."); | |||
return; | |||
} | |||
people = shuffle(items); | |||
currentIndex = 0; | |||
previous.disabled = people.length < 2; | |||
next.disabled = people.length < 2; | |||
toggle.disabled = people.length < 2; | |||
showStatus(""); | |||
showSlide(0); | |||
setPlaying(people.length > 1); | |||
} | |||
previous.addEventListener("click", function () { | |||
showSlide(currentIndex - 1); | |||
}); | |||
next.addEventListener("click", function () { | |||
showSlide(currentIndex + 1); | |||
}); | |||
toggle.addEventListener("click", function () { | |||
setPlaying(!playing); | |||
}); | |||
slider.addEventListener("mouseenter", function () { | |||
if (playing && timer) { | |||
window.clearTimeout(timer); | |||
slider.classList.remove("is-playing"); | |||
} | |||
}); | |||
slider.addEventListener("mouseleave", function () { | |||
if (playing) { | |||
scheduleNext(); | |||
} | |||
}); | |||
image.addEventListener("error", function () { | |||
if (image.src.indexOf("Vu-logo.png") === -1) { | |||
image.src = fallbackImage; | |||
} | |||
}); | |||
function buildQuery(params) { | |||
var parts = []; | |||
Object.keys(params).forEach(function (key) { | |||
parts.push( | |||
encodeURIComponent(key) + | |||
"=" + | |||
encodeURIComponent(params[key]) | |||
); | |||
}); | }); | ||
return parts.join("&"); | |||
} | |||
function requestJson(params) { | |||
return window | |||
.fetch(apiPath + "?" + buildQuery(params), { | |||
credentials: "same-origin" | |||
}) | |||
.then(function (response) { | |||
if (!response.ok) { | |||
throw new Error("API HTTP " + response.status); | |||
} | } | ||
return response.json(); | |||
}); | |||
} | |||
function copyParams(params) { | |||
var copied = {}; | |||
Object.keys(params).forEach(function (key) { | |||
copied[key] = params[key]; | |||
}); | |||
return copied; | |||
} | |||
function loadCategoryMembers(params, collectedPages) { | |||
return requestJson(params).then(function (data) { | |||
var nextPages = | |||
data && | |||
data.query && | |||
Array.isArray(data.query.categorymembers) | |||
? data.query.categorymembers | |||
: []; | |||
var allPages = collectedPages.concat(nextPages); | |||
if (data && data.continue) { | |||
var nextParams = copyParams(params); | |||
Object.keys(data.continue).forEach(function (key) { | |||
nextParams[key] = data.continue[key]; | |||
}); | }); | ||
} | |||
} | showStatus("Loading people... " + String(allPages.length)); | ||
return loadCategoryMembers(nextParams, allPages); | |||
} | |||
return allPages; | |||
}); | |||
} | } | ||
var | function uniqueTitles(items) { | ||
var seen = {}; | |||
var titles = []; | |||
items.forEach(function (item) { | |||
if (!item || !item.title || seen[item.title]) { | |||
return; | |||
if ( | |||
} | } | ||
}). | |||
seen[item.title] = true; | |||
titles.push(item.title); | |||
}); | |||
return titles; | |||
} | |||
function loadPageDetails(titles) { | |||
var groups = []; | |||
for (var index = 0; index < titles.length; index += 1) { | |||
groups.push(titles.slice(index, index + 1)); | |||
} | |||
return groups | |||
.reduce(function (chain, group) { | |||
return chain.then(function (pages) { | |||
return requestJson({ | |||
action: "query", | |||
titles: group.join("|"), | |||
prop: "extracts|pageimages|info", | |||
exintro: 1, | |||
explaintext: 1, | |||
exchars: 700, | |||
piprop: "thumbnail|original", | |||
pithumbsize: 1000, | |||
inprop: "url", | |||
redirects: 1, | |||
formatversion: 2, | |||
format: "json" | |||
}).then(function (data) { | |||
var nextPages = | |||
data && | |||
data.query && | |||
Array.isArray(data.query.pages) | |||
? data.query.pages | |||
: []; | |||
if ( | |||
(pages.length + nextPages.length) % 10 === 0 || | |||
pages.length + nextPages.length === titles.length | |||
) { | |||
showStatus( | |||
"Loading details... " + | |||
String(pages.length + nextPages.length) + | |||
" / " + | |||
String(titles.length) | |||
); | |||
} | |||
return pages.concat(nextPages); | |||
}); | |||
}); | |||
}, Promise.resolve([])); | |||
} | |||
var cachedPeople = readCache(); | |||
if (cachedPeople) { | |||
activateSlides(cachedPeople); | |||
} | |||
if (!window.fetch) { | |||
showStatus("This browser cannot load the people list."); | |||
return; | |||
} | |||
showStatus("Loading people..."); | |||
loadCategoryMembers( | |||
{ | |||
action: "query", | |||
list: "categorymembers", | |||
cmtitle: "Category:People", | |||
cmnamespace: 0, | |||
cmtype: "page", | |||
cmlimit: "max", | |||
formatversion: 2, | |||
format: "json" | |||
}, | |||
[] | |||
) | |||
.then(function (members) { | |||
var titles = uniqueTitles(members); | |||
showStatus("Loading details... 0 / " + String(titles.length)); | |||
return loadPageDetails(titles); | |||
}) | |||
.then(function (pages) { | |||
var loadedPeople = normalizePages(pages); | |||
saveCache(loadedPeople); | |||
activateSlides(loadedPeople); | |||
}) | |||
.catch(function () { | |||
showStatus("Could not load people list."); | |||
}); | }); | ||
/* | |||
* Raw HTML links need a separate existence check so missing pages | |||
* keep MediaWiki's red-link appearance. | |||
*/ | |||
if (window.mw && mw.loader) { | |||
mw.loader | |||
.using(["mediawiki.api", "mediawiki.util"]) | |||
.then(function () { | |||
var api = new mw.Api(); | |||
var links = Array.prototype.slice.call( | |||
root.querySelectorAll("a[data-wiki-title]") | |||
); | |||
var titles = links | |||
.map(function (item) { | |||
return item.getAttribute("data-wiki-title"); | |||
}) | |||
.filter(function (item, index, allItems) { | |||
return item && allItems.indexOf(item) === index; | |||
}); | |||
if (!titles.length) { | |||
return; | |||
} | |||
return api | |||
.get({ | |||
action: "query", | |||
titles: titles.join("|"), | |||
formatversion: 2 | |||
}) | |||
.then(function (data) { | |||
var missing = {}; | |||
if (data.query && Array.isArray(data.query.pages)) { | |||
data.query.pages.forEach(function (page) { | |||
if (page.missing) { | |||
missing[page.title] = true; | |||
} | |||
}); | |||
} | |||
links.forEach(function (item) { | |||
var pageTitle = | |||
item.getAttribute("data-wiki-title"); | |||
if (!missing[pageTitle]) { | |||
return; | |||
} | |||
item.classList.add("new"); | |||
item.href = mw.util.getUrl(pageTitle, { | |||
action: "edit", | |||
redlink: 1 | |||
}); | |||
item.title = | |||
pageTitle + " (page does not exist)"; | |||
}); | |||
}); | |||
}); | |||
} | } | ||
}); | }); | ||
})(); | })(); | ||
</script> | </script> | ||
</html> | </html> | ||