新class612
This commit is contained in:
+3
-3
@@ -1,5 +1,5 @@
|
|||||||
// This file is auto-generated by the `update-kc-gen` command. Do not edit it manually.
|
// This file is auto-generated by the `update-kc-gen` command. Do not edit it manually.
|
||||||
// Hash: 822f146dfd89023346d41d4f77fba9745b7f55365c95ca37f85806c01ab23dc4
|
// Hash: 7dbbfb317418e9799cdce9a990519799f98af7dbfe27f1d0438c6738cffb7515
|
||||||
|
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
|
|
||||||
@@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
import { lazy, Suspense, type ReactNode } from "react";
|
import { lazy, Suspense, type ReactNode } from "react";
|
||||||
|
|
||||||
export type ThemeName = "keycloakify-starter";
|
export type ThemeName = "keycloakify-starter" | "class";
|
||||||
|
|
||||||
export const themeNames: ThemeName[] = ["keycloakify-starter"];
|
export const themeNames: ThemeName[] = ["keycloakify-starter", "class"];
|
||||||
|
|
||||||
export type KcEnvName = never;
|
export type KcEnvName = never;
|
||||||
|
|
||||||
|
|||||||
+46
-2
@@ -5,6 +5,7 @@ import { useI18n } from "./i18n";
|
|||||||
import DefaultPage from "keycloakify/login/DefaultPage";
|
import DefaultPage from "keycloakify/login/DefaultPage";
|
||||||
import Template from "./Template";
|
import Template from "./Template";
|
||||||
import "./theme.css";
|
import "./theme.css";
|
||||||
|
import "./class-theme.css";
|
||||||
const UserProfileFormFields = lazy(
|
const UserProfileFormFields = lazy(
|
||||||
() => import("keycloakify/login/UserProfileFormFields")
|
() => import("keycloakify/login/UserProfileFormFields")
|
||||||
);
|
);
|
||||||
@@ -25,7 +26,11 @@ export default function KcPage(props: { kcContext: KcContext }) {
|
|||||||
<DefaultPage
|
<DefaultPage
|
||||||
kcContext={kcContext}
|
kcContext={kcContext}
|
||||||
i18n={i18n}
|
i18n={i18n}
|
||||||
classes={classes}
|
classes={
|
||||||
|
kcContext.themeName === "class"
|
||||||
|
? classThemeClasses
|
||||||
|
: nexusThemeClasses
|
||||||
|
}
|
||||||
Template={Template}
|
Template={Template}
|
||||||
doUseDefaultCss={false}
|
doUseDefaultCss={false}
|
||||||
UserProfileFormFields={UserProfileFormFields}
|
UserProfileFormFields={UserProfileFormFields}
|
||||||
@@ -38,7 +43,7 @@ export default function KcPage(props: { kcContext: KcContext }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const classes = {
|
const nexusThemeClasses = {
|
||||||
kcBodyClass: "nexus-body",
|
kcBodyClass: "nexus-body",
|
||||||
kcLoginClass: "nexus-login",
|
kcLoginClass: "nexus-login",
|
||||||
kcHeaderClass: "nexus-header",
|
kcHeaderClass: "nexus-header",
|
||||||
@@ -76,3 +81,42 @@ const classes = {
|
|||||||
kcLocaleItemClass: "nexus-locale__item",
|
kcLocaleItemClass: "nexus-locale__item",
|
||||||
kcInputErrorMessageClass: "nexus-field__error"
|
kcInputErrorMessageClass: "nexus-field__error"
|
||||||
} satisfies { [key in ClassKey]?: string };
|
} satisfies { [key in ClassKey]?: string };
|
||||||
|
|
||||||
|
const classThemeClasses = {
|
||||||
|
kcBodyClass: "class-body",
|
||||||
|
kcLoginClass: "class-login",
|
||||||
|
kcHeaderClass: "class-header",
|
||||||
|
kcHeaderWrapperClass: "class-header__name",
|
||||||
|
kcFormCardClass: "class-card",
|
||||||
|
kcFormHeaderClass: "class-card__header",
|
||||||
|
kcFormGroupClass: "class-field",
|
||||||
|
kcLabelClass: "class-label",
|
||||||
|
kcInputClass: "class-input",
|
||||||
|
kcInputGroup: "class-input-group",
|
||||||
|
kcFormSettingClass: "class-form-settings",
|
||||||
|
kcFormOptionsWrapperClass: "class-form-options",
|
||||||
|
kcFormPasswordVisibilityButtonClass: "class-password-toggle",
|
||||||
|
kcButtonClass: "class-button",
|
||||||
|
kcButtonBlockClass: "class-button--block",
|
||||||
|
kcButtonLargeClass: "class-button--large",
|
||||||
|
kcButtonPrimaryClass: "class-button--primary",
|
||||||
|
kcButtonSecondaryClass: "class-button--secondary",
|
||||||
|
kcButtonDefaultClass: "class-button--default",
|
||||||
|
kcAlertClass: "class-alert",
|
||||||
|
kcFeedbackErrorIcon: "class-feedback class-feedback--error",
|
||||||
|
kcFeedbackWarningIcon: "class-feedback class-feedback--warning",
|
||||||
|
kcFeedbackSuccessIcon: "class-feedback class-feedback--success",
|
||||||
|
kcFeedbackInfoIcon: "class-feedback class-feedback--info",
|
||||||
|
kcFormSocialAccountSectionClass: "class-social",
|
||||||
|
kcFormSocialAccountListClass: "class-social__list",
|
||||||
|
kcFormSocialAccountListButtonClass: "class-social__button",
|
||||||
|
kcFormSocialAccountNameClass: "class-social__name",
|
||||||
|
kcSignUpClass: "class-signup",
|
||||||
|
kcInfoAreaWrapperClass: "class-signup__inner",
|
||||||
|
kcLocaleMainClass: "class-locale",
|
||||||
|
kcLocaleDropDownClass: "class-locale__dropdown",
|
||||||
|
kcLocaleListClass: "class-locale__list",
|
||||||
|
kcLocaleListItemClass: "class-locale__list-item",
|
||||||
|
kcLocaleItemClass: "class-locale__item",
|
||||||
|
kcInputErrorMessageClass: "class-field__error"
|
||||||
|
} satisfies { [key in ClassKey]?: string };
|
||||||
|
|||||||
@@ -5,8 +5,54 @@ import type { I18n } from "./i18n";
|
|||||||
|
|
||||||
export default function Template(props: TemplateProps<KcContext, I18n>) {
|
export default function Template(props: TemplateProps<KcContext, I18n>) {
|
||||||
const { msg } = props.i18n;
|
const { msg } = props.i18n;
|
||||||
|
const isClassTheme = props.kcContext.themeName === "class";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
{isClassTheme ? (
|
||||||
|
<>
|
||||||
|
<div className="class-atmosphere" aria-hidden="true">
|
||||||
|
<span className="class-registration-mark class-registration-mark--top" />
|
||||||
|
<span className="class-registration-mark class-registration-mark--bottom" />
|
||||||
|
<div className="class-mobile-brand">
|
||||||
|
<span>612</span>
|
||||||
|
<b>{msg("classArchiveName")}</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<aside className="class-record" aria-hidden="true">
|
||||||
|
<div className="class-record__index">
|
||||||
|
<span>ARCHIVE NO. 612</span>
|
||||||
|
<span>{msg("classSchoolCohort")}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="class-record__copy">
|
||||||
|
<p>{msg("classIdentityArchive")}</p>
|
||||||
|
<h2>
|
||||||
|
{msg("classMemoriesRemain")}
|
||||||
|
<span>{msg("classWelcomeBack")}</span>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="class-record__ledger">
|
||||||
|
<div>
|
||||||
|
<strong>1095+</strong>
|
||||||
|
<span>{msg("classDaysTogether")}</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<strong>612</strong>
|
||||||
|
<span>{msg("classArchiveNumber")}</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<strong>∞</strong>
|
||||||
|
<span>{msg("classMomentsRemembered")}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="class-record__stamp">612</div>
|
||||||
|
</aside>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
<>
|
<>
|
||||||
<div className="nexus-atmosphere" aria-hidden="true">
|
<div className="nexus-atmosphere" aria-hidden="true">
|
||||||
<div className="nexus-grid" />
|
<div className="nexus-grid" />
|
||||||
@@ -38,6 +84,8 @@ export default function Template(props: TemplateProps<KcContext, I18n>) {
|
|||||||
<span className="nexus-system-status__state">{msg("nexusSystemOnline")}</span>
|
<span className="nexus-system-status__state">{msg("nexusSystemOnline")}</span>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
<BaseTemplate {...props} />
|
<BaseTemplate {...props} />
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -0,0 +1,770 @@
|
|||||||
|
:root {
|
||||||
|
--class-ink: #18324a;
|
||||||
|
--class-muted: #617387;
|
||||||
|
--class-line: #b9cedd;
|
||||||
|
--class-paper: #f7fbff;
|
||||||
|
--class-surface: #ffffff;
|
||||||
|
--class-soft: #e5f3ff;
|
||||||
|
--class-blue: #3f7fd6;
|
||||||
|
--class-blue-deep: #2868c7;
|
||||||
|
--class-green: #23966f;
|
||||||
|
--class-sun: #f6c54c;
|
||||||
|
--class-coral: #f05a47;
|
||||||
|
--class-danger: #c93636;
|
||||||
|
--class-display: "Arial Narrow", "DIN Condensed", "Noto Sans SC", "Microsoft YaHei",
|
||||||
|
sans-serif;
|
||||||
|
--class-body-font: "Noto Sans SC", "Microsoft YaHei", "PingFang SC", Arial, sans-serif;
|
||||||
|
--class-utility: "Cascadia Mono", "SFMono-Regular", Consolas, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
html.login-pf:has(body.class-body) {
|
||||||
|
min-height: 100%;
|
||||||
|
background: var(--class-paper);
|
||||||
|
}
|
||||||
|
|
||||||
|
body.class-body {
|
||||||
|
min-height: 100vh;
|
||||||
|
margin: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
color: var(--class-ink);
|
||||||
|
background: var(--class-paper);
|
||||||
|
font-family: var(--class-body-font);
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-body button,
|
||||||
|
.class-body input,
|
||||||
|
.class-body select,
|
||||||
|
.class-body textarea {
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-atmosphere {
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
z-index: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
pointer-events: none;
|
||||||
|
background-image: linear-gradient(rgba(24, 50, 74, 0.035) 1px, transparent 1px),
|
||||||
|
linear-gradient(90deg, rgba(24, 50, 74, 0.035) 1px, transparent 1px);
|
||||||
|
background-position: calc(52% + 24px) 24px;
|
||||||
|
background-size: 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-registration-mark {
|
||||||
|
position: absolute;
|
||||||
|
right: 24px;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-registration-mark::before,
|
||||||
|
.class-registration-mark::after {
|
||||||
|
position: absolute;
|
||||||
|
background: var(--class-coral);
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-registration-mark::before {
|
||||||
|
top: 11px;
|
||||||
|
left: 0;
|
||||||
|
width: 24px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-registration-mark::after {
|
||||||
|
top: 0;
|
||||||
|
left: 11px;
|
||||||
|
width: 1px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-registration-mark--top {
|
||||||
|
top: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-registration-mark--bottom {
|
||||||
|
bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-mobile-brand {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record {
|
||||||
|
position: fixed;
|
||||||
|
inset: 0 48% 0 0;
|
||||||
|
z-index: 1;
|
||||||
|
display: flex;
|
||||||
|
overflow: hidden;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: clamp(32px, 4.5vw, 72px);
|
||||||
|
color: #f7faf8;
|
||||||
|
background: linear-gradient(rgba(247, 250, 248, 0.075) 1px, transparent 1px),
|
||||||
|
linear-gradient(90deg, rgba(247, 250, 248, 0.075) 1px, transparent 1px),
|
||||||
|
var(--class-blue);
|
||||||
|
background-size: 44px 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record::before {
|
||||||
|
position: absolute;
|
||||||
|
right: clamp(28px, 4vw, 62px);
|
||||||
|
bottom: -0.18em;
|
||||||
|
color: rgba(255, 255, 255, 0.1);
|
||||||
|
font-family: var(--class-display);
|
||||||
|
font-size: clamp(16rem, 32vw, 37rem);
|
||||||
|
font-weight: 950;
|
||||||
|
letter-spacing: -0.12em;
|
||||||
|
line-height: 0.75;
|
||||||
|
content: "612";
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record::after {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 9px;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(
|
||||||
|
to bottom,
|
||||||
|
var(--class-coral) 0 33.333%,
|
||||||
|
var(--class-sun) 33.333% 66.666%,
|
||||||
|
var(--class-green) 66.666%
|
||||||
|
);
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__index,
|
||||||
|
.class-record__copy,
|
||||||
|
.class-record__ledger,
|
||||||
|
.class-record__stamp {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__index {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 24px;
|
||||||
|
padding-bottom: 13px;
|
||||||
|
border-bottom: 1px solid rgba(247, 250, 248, 0.48);
|
||||||
|
color: rgba(247, 250, 248, 0.74);
|
||||||
|
font: 700 0.68rem/1.4 var(--class-utility);
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__index span:first-child {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__copy {
|
||||||
|
max-width: 700px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__copy p {
|
||||||
|
margin: 0 0 18px;
|
||||||
|
color: var(--class-sun);
|
||||||
|
font: 700 0.72rem/1.5 var(--class-utility);
|
||||||
|
letter-spacing: 0.07em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__copy h2 {
|
||||||
|
max-width: 7.8em;
|
||||||
|
margin: 0;
|
||||||
|
font-family: var(--class-display);
|
||||||
|
font-size: clamp(3.6rem, 6.5vw, 7.4rem);
|
||||||
|
font-weight: 950;
|
||||||
|
letter-spacing: -0.06em;
|
||||||
|
line-height: 0.92;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__copy h2 span {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__copy h2::after {
|
||||||
|
display: block;
|
||||||
|
width: 70px;
|
||||||
|
height: 8px;
|
||||||
|
margin-top: 25px;
|
||||||
|
background: var(--class-coral);
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__ledger {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
|
border-top: 1px solid rgba(247, 250, 248, 0.48);
|
||||||
|
border-bottom: 1px solid rgba(247, 250, 248, 0.48);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__ledger div {
|
||||||
|
min-width: 0;
|
||||||
|
padding: 16px 16px 17px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__ledger div + div {
|
||||||
|
padding-left: 16px;
|
||||||
|
border-left: 1px solid rgba(247, 250, 248, 0.48);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__ledger strong,
|
||||||
|
.class-record__ledger span {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__ledger strong {
|
||||||
|
font-family: var(--class-display);
|
||||||
|
font-size: clamp(1.8rem, 3vw, 3rem);
|
||||||
|
letter-spacing: -0.04em;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__ledger span {
|
||||||
|
margin-top: 7px;
|
||||||
|
color: rgba(247, 250, 248, 0.72);
|
||||||
|
font: 700 0.58rem/1.35 var(--class-utility);
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__stamp {
|
||||||
|
position: absolute;
|
||||||
|
top: clamp(92px, 13vh, 140px);
|
||||||
|
right: clamp(32px, 5vw, 78px);
|
||||||
|
display: grid;
|
||||||
|
width: 72px;
|
||||||
|
height: 58px;
|
||||||
|
place-items: center;
|
||||||
|
color: #ffffff;
|
||||||
|
background: var(--class-coral);
|
||||||
|
font: 900 1.35rem/1 var(--class-utility);
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
transform: rotate(3deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-login {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
display: flex;
|
||||||
|
min-height: 100vh;
|
||||||
|
width: 48%;
|
||||||
|
margin-left: 52%;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
padding: clamp(42px, 6vw, 96px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-header {
|
||||||
|
width: min(100%, 500px);
|
||||||
|
margin: 0 auto 13px;
|
||||||
|
padding: 0;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-header__name#kc-header-wrapper {
|
||||||
|
padding: 0;
|
||||||
|
color: var(--class-muted);
|
||||||
|
background: none;
|
||||||
|
font: 700 0.68rem/1.5 var(--class-utility);
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-header__name#kc-header-wrapper::before {
|
||||||
|
color: var(--class-blue-deep);
|
||||||
|
content: "ARCHIVE ACCESS / ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card {
|
||||||
|
position: relative;
|
||||||
|
width: min(100%, 500px);
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: clamp(30px, 4vw, 50px);
|
||||||
|
border: 1px solid var(--class-ink);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--class-ink);
|
||||||
|
background: var(--class-surface);
|
||||||
|
box-shadow: 16px 16px 0 var(--class-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card::before {
|
||||||
|
position: absolute;
|
||||||
|
top: -1px;
|
||||||
|
right: -1px;
|
||||||
|
left: -1px;
|
||||||
|
height: 7px;
|
||||||
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
var(--class-blue) 0 54%,
|
||||||
|
var(--class-coral) 54% 72%,
|
||||||
|
var(--class-sun) 72% 88%,
|
||||||
|
var(--class-green) 88%
|
||||||
|
);
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card__header {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card__header #kc-page-title {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--class-ink);
|
||||||
|
font-family: var(--class-display);
|
||||||
|
font-size: clamp(2.25rem, 3.8vw, 3.4rem);
|
||||||
|
font-weight: 950;
|
||||||
|
letter-spacing: -0.045em;
|
||||||
|
line-height: 1;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card__header #kc-page-title::after {
|
||||||
|
display: block;
|
||||||
|
width: 52px;
|
||||||
|
height: 6px;
|
||||||
|
margin-top: 16px;
|
||||||
|
background: var(--class-coral);
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card a {
|
||||||
|
color: var(--class-blue-deep);
|
||||||
|
font-weight: 700;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card a:hover {
|
||||||
|
color: var(--class-coral);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-field {
|
||||||
|
margin: 0 0 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-label {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
color: var(--class-ink);
|
||||||
|
font-size: 0.78rem;
|
||||||
|
font-weight: 800;
|
||||||
|
letter-spacing: 0.025em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-input,
|
||||||
|
.class-card textarea.form-control,
|
||||||
|
.class-card select.form-control {
|
||||||
|
width: 100%;
|
||||||
|
height: 48px;
|
||||||
|
padding: 0 14px;
|
||||||
|
border: 1px solid var(--class-line);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--class-ink);
|
||||||
|
outline: 0;
|
||||||
|
background: #fbfdff;
|
||||||
|
box-shadow: none;
|
||||||
|
font-size: 0.94rem;
|
||||||
|
transition:
|
||||||
|
border-color 150ms ease,
|
||||||
|
box-shadow 150ms ease,
|
||||||
|
background 150ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-input:hover {
|
||||||
|
border-color: var(--class-ink);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-input:focus,
|
||||||
|
.class-card textarea.form-control:focus,
|
||||||
|
.class-card select.form-control:focus {
|
||||||
|
border-color: var(--class-blue-deep);
|
||||||
|
background: #ffffff;
|
||||||
|
box-shadow: inset 5px 0 0 var(--class-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-input[aria-invalid="true"] {
|
||||||
|
border-color: var(--class-danger);
|
||||||
|
box-shadow: inset 5px 0 0 var(--class-danger);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-input-group {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-input-group .class-input {
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-password-toggle,
|
||||||
|
.class-input-group .pf-c-button.pf-m-control {
|
||||||
|
display: grid;
|
||||||
|
width: 48px;
|
||||||
|
min-width: 48px;
|
||||||
|
place-items: center;
|
||||||
|
border: 1px solid var(--class-line);
|
||||||
|
border-left: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--class-muted);
|
||||||
|
background: var(--class-soft);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-password-toggle i::before {
|
||||||
|
content: "\25C9";
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-field__error {
|
||||||
|
display: block;
|
||||||
|
margin-top: 7px;
|
||||||
|
color: var(--class-danger);
|
||||||
|
font-size: 0.78rem;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-form-settings.class-field {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 16px;
|
||||||
|
margin: -1px 0 25px;
|
||||||
|
color: var(--class-muted);
|
||||||
|
font-size: 0.78rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-form-settings.class-field #kc-form-options,
|
||||||
|
.class-form-settings.class-field > div {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-form-settings input[type="checkbox"] {
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
margin: 0 7px 0 0;
|
||||||
|
accent-color: var(--class-blue);
|
||||||
|
vertical-align: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-button {
|
||||||
|
min-height: 48px;
|
||||||
|
border: 1px solid var(--class-ink);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--class-ink);
|
||||||
|
background: var(--class-soft);
|
||||||
|
box-shadow: none;
|
||||||
|
font-size: 0.84rem;
|
||||||
|
font-weight: 900;
|
||||||
|
letter-spacing: 0.035em;
|
||||||
|
transition:
|
||||||
|
color 150ms ease,
|
||||||
|
background 150ms ease,
|
||||||
|
transform 150ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-button--primary {
|
||||||
|
color: var(--class-ink);
|
||||||
|
background: var(--class-sun);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-button--block {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-button:hover:not(:disabled) {
|
||||||
|
color: #ffffff;
|
||||||
|
background: var(--class-blue-deep);
|
||||||
|
transform: translateX(4px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-button:disabled {
|
||||||
|
cursor: wait;
|
||||||
|
opacity: 0.62;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-button:focus-visible,
|
||||||
|
.class-card a:focus-visible,
|
||||||
|
.class-card button:focus-visible,
|
||||||
|
.class-card input:focus-visible {
|
||||||
|
outline: 3px solid rgba(240, 90, 71, 0.42);
|
||||||
|
outline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-alert {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
margin: 0 0 24px;
|
||||||
|
padding: 12px 13px;
|
||||||
|
border: 1px solid var(--class-line);
|
||||||
|
border-left: 6px solid var(--class-blue);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--class-ink);
|
||||||
|
background: var(--class-soft);
|
||||||
|
font-size: 0.82rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-alert.pf-m-danger {
|
||||||
|
border-left-color: var(--class-danger);
|
||||||
|
background: #fff1ef;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-alert.pf-m-success {
|
||||||
|
border-left-color: var(--class-green);
|
||||||
|
background: #eefaf5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-feedback {
|
||||||
|
display: inline-block;
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
margin-top: 6px;
|
||||||
|
background: var(--class-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-feedback--error,
|
||||||
|
.class-feedback--warning {
|
||||||
|
background: var(--class-danger);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-feedback--success {
|
||||||
|
background: var(--class-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social {
|
||||||
|
margin-top: 29px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social hr {
|
||||||
|
height: 1px;
|
||||||
|
margin: 0 0 23px;
|
||||||
|
border: 0;
|
||||||
|
background: var(--class-line);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social h2 {
|
||||||
|
margin: 0 0 12px;
|
||||||
|
color: var(--class-muted);
|
||||||
|
font: 700 0.64rem/1.5 var(--class-utility);
|
||||||
|
letter-spacing: 0.07em;
|
||||||
|
text-align: left;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social__list,
|
||||||
|
.class-social__list.pf-l-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
gap: 8px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social__list li,
|
||||||
|
.class-social__list .pf-l-grid__item {
|
||||||
|
width: auto;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social__button {
|
||||||
|
display: flex;
|
||||||
|
min-height: 42px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 9px;
|
||||||
|
padding: 0 12px;
|
||||||
|
border: 1px solid var(--class-line);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--class-ink);
|
||||||
|
background: #ffffff;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social__button:hover {
|
||||||
|
border-color: var(--class-blue);
|
||||||
|
background: var(--class-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-signup {
|
||||||
|
margin: 27px 0 0;
|
||||||
|
color: var(--class-muted);
|
||||||
|
font-size: 0.82rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-signup__inner {
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-locale {
|
||||||
|
position: absolute;
|
||||||
|
top: 18px;
|
||||||
|
right: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-locale #kc-current-locale-link {
|
||||||
|
padding: 7px 10px;
|
||||||
|
border: 1px solid var(--class-line);
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--class-muted);
|
||||||
|
background: rgba(247, 251, 255, 0.94);
|
||||||
|
font: 700 0.66rem/1.4 var(--class-utility);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-locale__list {
|
||||||
|
right: 0;
|
||||||
|
left: auto;
|
||||||
|
min-width: 150px;
|
||||||
|
border: 1px solid var(--class-ink);
|
||||||
|
color: var(--class-ink);
|
||||||
|
background: #ffffff;
|
||||||
|
box-shadow: 8px 8px 0 var(--class-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-locale__list:not([hidden]) {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 10;
|
||||||
|
top: calc(100% + 6px);
|
||||||
|
display: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 6px;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-locale__dropdown:hover .class-locale__list,
|
||||||
|
.class-locale__dropdown:focus-within .class-locale__list {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-locale__item {
|
||||||
|
display: block;
|
||||||
|
padding: 8px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#kc-username {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 11px 13px;
|
||||||
|
border: 1px solid var(--class-line);
|
||||||
|
background: var(--class-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card .select-auth-container,
|
||||||
|
.class-card .pf-c-tile,
|
||||||
|
.class-card .kc-recovery-codes-list {
|
||||||
|
color: var(--class-ink);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card .select-auth-box-parent,
|
||||||
|
.class-card .pf-c-tile {
|
||||||
|
border-color: var(--class-line);
|
||||||
|
border-radius: 0;
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1020px) {
|
||||||
|
.class-record {
|
||||||
|
inset: 0 54% 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-login {
|
||||||
|
width: 54%;
|
||||||
|
margin-left: 46%;
|
||||||
|
padding: 56px 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-record__ledger span {
|
||||||
|
font-size: 0.52rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 840px) {
|
||||||
|
.class-record {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-atmosphere {
|
||||||
|
background-position: 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-mobile-brand {
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
left: 20px;
|
||||||
|
display: flex;
|
||||||
|
width: max-content;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
color: var(--class-ink);
|
||||||
|
font: 800 0.72rem/1.3 var(--class-utility);
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-mobile-brand > span {
|
||||||
|
display: grid;
|
||||||
|
width: 40px;
|
||||||
|
height: 32px;
|
||||||
|
place-items: center;
|
||||||
|
color: #ffffff;
|
||||||
|
background: var(--class-coral);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-mobile-brand b {
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-login {
|
||||||
|
width: 100%;
|
||||||
|
margin-left: 0;
|
||||||
|
padding: 88px 24px 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-header,
|
||||||
|
.class-card {
|
||||||
|
width: min(100%, 540px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 560px) {
|
||||||
|
.class-login {
|
||||||
|
justify-content: flex-start;
|
||||||
|
padding: 82px 16px 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card {
|
||||||
|
padding: 31px 22px 28px;
|
||||||
|
box-shadow: 9px 9px 0 var(--class-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-card__header #kc-page-title {
|
||||||
|
font-size: 2.35rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-social__list,
|
||||||
|
.class-social__list.pf-l-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-form-settings.class-field {
|
||||||
|
align-items: flex-start;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.class-registration-mark {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.class-body *,
|
||||||
|
.class-body *::before,
|
||||||
|
.class-body *::after {
|
||||||
|
scroll-behavior: auto !important;
|
||||||
|
transition-duration: 0.01ms !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
+27
-3
@@ -11,21 +11,45 @@ const { useI18n, ofTypeI18n } = i18nBuilder
|
|||||||
nexusSecureAccess: "Secure access.",
|
nexusSecureAccess: "Secure access.",
|
||||||
nexusPreciselyOrchestrated: "Precisely orchestrated.",
|
nexusPreciselyOrchestrated: "Precisely orchestrated.",
|
||||||
nexusSecureChannel: "SECURE CHANNEL",
|
nexusSecureChannel: "SECURE CHANNEL",
|
||||||
nexusSystemOnline: "SYSTEM ONLINE"
|
nexusSystemOnline: "SYSTEM ONLINE",
|
||||||
|
classArchiveName: "GAOPING NO.1 · CLASS 612",
|
||||||
|
classSchoolCohort: "CLASS OF 2024 · GAOPING NO.1",
|
||||||
|
classIdentityArchive: "CLASS MEMORY · IDENTITY ARCHIVE",
|
||||||
|
classMemoriesRemain: "The memories remain.",
|
||||||
|
classWelcomeBack: "Welcome back.",
|
||||||
|
classDaysTogether: "DAYS TOGETHER",
|
||||||
|
classArchiveNumber: "ARCHIVE NUMBER",
|
||||||
|
classMomentsRemembered: "MOMENTS REMEMBERED"
|
||||||
},
|
},
|
||||||
"zh-CN": {
|
"zh-CN": {
|
||||||
nexusIdentityAccessLayer: "身份访问层",
|
nexusIdentityAccessLayer: "身份访问层",
|
||||||
nexusSecureAccess: "安全访问。",
|
nexusSecureAccess: "安全访问。",
|
||||||
nexusPreciselyOrchestrated: "精准编排。",
|
nexusPreciselyOrchestrated: "精准编排。",
|
||||||
nexusSecureChannel: "安全通道",
|
nexusSecureChannel: "安全通道",
|
||||||
nexusSystemOnline: "系统在线"
|
nexusSystemOnline: "系统在线",
|
||||||
|
classArchiveName: "高平一中 · 612班",
|
||||||
|
classSchoolCohort: "2024届 · 高平一中",
|
||||||
|
classIdentityArchive: "班级记忆 · 身份档案",
|
||||||
|
classMemoriesRemain: "记忆仍在,",
|
||||||
|
classWelcomeBack: "欢迎回来。",
|
||||||
|
classDaysTogether: "一起经过的日子",
|
||||||
|
classArchiveNumber: "班级档案编号",
|
||||||
|
classMomentsRemembered: "还会被想起的瞬间"
|
||||||
},
|
},
|
||||||
"zh-TW": {
|
"zh-TW": {
|
||||||
nexusIdentityAccessLayer: "身分存取層",
|
nexusIdentityAccessLayer: "身分存取層",
|
||||||
nexusSecureAccess: "安全存取。",
|
nexusSecureAccess: "安全存取。",
|
||||||
nexusPreciselyOrchestrated: "精準編排。",
|
nexusPreciselyOrchestrated: "精準編排。",
|
||||||
nexusSecureChannel: "安全通道",
|
nexusSecureChannel: "安全通道",
|
||||||
nexusSystemOnline: "系統在線"
|
nexusSystemOnline: "系統在線",
|
||||||
|
classArchiveName: "高平一中 · 612班",
|
||||||
|
classSchoolCohort: "2024屆 · 高平一中",
|
||||||
|
classIdentityArchive: "班級記憶 · 身分檔案",
|
||||||
|
classMemoriesRemain: "記憶仍在,",
|
||||||
|
classWelcomeBack: "歡迎回來。",
|
||||||
|
classDaysTogether: "一起經過的日子",
|
||||||
|
classArchiveNumber: "班級檔案編號",
|
||||||
|
classMomentsRemembered: "還會被想起的瞬間"
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -36,6 +36,17 @@ export const TraditionalChinese: Story = {
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const ClassTheme: Story = {
|
||||||
|
render: () => (
|
||||||
|
<KcPageStory
|
||||||
|
kcContext={{
|
||||||
|
themeName: "class",
|
||||||
|
locale: { currentLanguageTag: "zh-CN" }
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
export const WithInvalidCredential: Story = {
|
export const WithInvalidCredential: Story = {
|
||||||
render: () => (
|
render: () => (
|
||||||
<KcPageStory
|
<KcPageStory
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ export default defineConfig({
|
|||||||
plugins: [
|
plugins: [
|
||||||
react(),
|
react(),
|
||||||
keycloakify({
|
keycloakify({
|
||||||
|
themeName: ["keycloakify-starter", "class"],
|
||||||
accountThemeImplementation: "Single-Page"
|
accountThemeImplementation: "Single-Page"
|
||||||
})
|
})
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user