add: i18n
This commit is contained in:
parent
ae338f88ee
commit
44bc99dd9d
449
packages/next/app/[locale]/fonts/InterFont/Inter.css
Normal file
449
packages/next/app/[locale]/fonts/InterFont/Inter.css
Normal file
@ -0,0 +1,449 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: "Inter Variable";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterVariable.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter Variable";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterVariable-Italic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* static fonts */
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-Thin.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-ThinItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-ExtraLight.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 200;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-ExtraLightItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-Light.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-LightItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-Regular.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-Italic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-Medium.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-MediumItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-SemiBold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-SemiBoldItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-Bold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-BoldItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-ExtraBold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-ExtraBoldItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-Black.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Inter";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("Inter-BlackItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-Thin.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-ThinItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-ExtraLight.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 200;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-ExtraLightItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-Light.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-LightItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-Regular.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-Italic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-Medium.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-MediumItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-SemiBold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-SemiBoldItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-Bold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-BoldItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-ExtraBold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-ExtraBoldItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-Black.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "InterDisplay";
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("InterDisplay-BlackItalic.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-feature-values InterVariable {
|
||||||
|
@character-variant {
|
||||||
|
cv01: 1;
|
||||||
|
cv02: 2;
|
||||||
|
cv03: 3;
|
||||||
|
cv04: 4;
|
||||||
|
cv05: 5;
|
||||||
|
cv06: 6;
|
||||||
|
cv07: 7;
|
||||||
|
cv08: 8;
|
||||||
|
cv09: 9;
|
||||||
|
cv10: 10;
|
||||||
|
cv11: 11;
|
||||||
|
cv12: 12;
|
||||||
|
cv13: 13;
|
||||||
|
alt-1: 1; /* Alternate one */
|
||||||
|
alt-3: 9; /* Flat-top three */
|
||||||
|
open-4: 2; /* Open four */
|
||||||
|
open-6: 3; /* Open six */
|
||||||
|
open-9: 4; /* Open nine */
|
||||||
|
lc-l-with-tail: 5; /* Lower-case L with tail */
|
||||||
|
simplified-u: 6; /* Simplified u */
|
||||||
|
alt-double-s: 7; /* Alternate German double s */
|
||||||
|
uc-i-with-serif: 8; /* Upper-case i with serif */
|
||||||
|
uc-g-with-spur: 10; /* Capital G with spur */
|
||||||
|
single-story-a: 11; /* Single-story a */
|
||||||
|
compact-lc-f: 12; /* Compact f */
|
||||||
|
compact-lc-t: 13; /* Compact t */
|
||||||
|
}
|
||||||
|
@styleset {
|
||||||
|
ss01: 1;
|
||||||
|
ss02: 2;
|
||||||
|
ss03: 3;
|
||||||
|
ss04: 4;
|
||||||
|
ss05: 5;
|
||||||
|
ss06: 6;
|
||||||
|
ss07: 7;
|
||||||
|
ss08: 8;
|
||||||
|
open-digits: 1; /* Open digits */
|
||||||
|
disambiguation: 2; /* Disambiguation (with zero) */
|
||||||
|
disambiguation-except-zero: 4; /* Disambiguation (no zero) */
|
||||||
|
round-quotes-and-commas: 3; /* Round quotes & commas */
|
||||||
|
square-punctuation: 7; /* Square punctuation */
|
||||||
|
square-quotes: 8; /* Square quotes */
|
||||||
|
circled-characters: 5; /* Circled characters */
|
||||||
|
squared-characters: 6; /* Squared characters */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@font-feature-values Inter {
|
||||||
|
@character-variant {
|
||||||
|
cv01: 1;
|
||||||
|
cv02: 2;
|
||||||
|
cv03: 3;
|
||||||
|
cv04: 4;
|
||||||
|
cv05: 5;
|
||||||
|
cv06: 6;
|
||||||
|
cv07: 7;
|
||||||
|
cv08: 8;
|
||||||
|
cv09: 9;
|
||||||
|
cv10: 10;
|
||||||
|
cv11: 11;
|
||||||
|
cv12: 12;
|
||||||
|
cv13: 13;
|
||||||
|
alt-1: 1; /* Alternate one */
|
||||||
|
alt-3: 9; /* Flat-top three */
|
||||||
|
open-4: 2; /* Open four */
|
||||||
|
open-6: 3; /* Open six */
|
||||||
|
open-9: 4; /* Open nine */
|
||||||
|
lc-l-with-tail: 5; /* Lower-case L with tail */
|
||||||
|
simplified-u: 6; /* Simplified u */
|
||||||
|
alt-double-s: 7; /* Alternate German double s */
|
||||||
|
uc-i-with-serif: 8; /* Upper-case i with serif */
|
||||||
|
uc-g-with-spur: 10; /* Capital G with spur */
|
||||||
|
single-story-a: 11; /* Single-story a */
|
||||||
|
compact-lc-f: 12; /* Compact f */
|
||||||
|
compact-lc-t: 13; /* Compact t */
|
||||||
|
}
|
||||||
|
@styleset {
|
||||||
|
ss01: 1;
|
||||||
|
ss02: 2;
|
||||||
|
ss03: 3;
|
||||||
|
ss04: 4;
|
||||||
|
ss05: 5;
|
||||||
|
ss06: 6;
|
||||||
|
ss07: 7;
|
||||||
|
ss08: 8;
|
||||||
|
open-digits: 1; /* Open digits */
|
||||||
|
disambiguation: 2; /* Disambiguation (with zero) */
|
||||||
|
disambiguation-except-zero: 4; /* Disambiguation (no zero) */
|
||||||
|
round-quotes-and-commas: 3; /* Round quotes & commas */
|
||||||
|
square-punctuation: 7; /* Square punctuation */
|
||||||
|
square-quotes: 8; /* Square quotes */
|
||||||
|
circled-characters: 5; /* Circled characters */
|
||||||
|
squared-characters: 6; /* Squared characters */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@font-feature-values InterDisplay {
|
||||||
|
@character-variant {
|
||||||
|
cv01: 1;
|
||||||
|
cv02: 2;
|
||||||
|
cv03: 3;
|
||||||
|
cv04: 4;
|
||||||
|
cv05: 5;
|
||||||
|
cv06: 6;
|
||||||
|
cv07: 7;
|
||||||
|
cv08: 8;
|
||||||
|
cv09: 9;
|
||||||
|
cv10: 10;
|
||||||
|
cv11: 11;
|
||||||
|
cv12: 12;
|
||||||
|
cv13: 13;
|
||||||
|
alt-1: 1; /* Alternate one */
|
||||||
|
alt-3: 9; /* Flat-top three */
|
||||||
|
open-4: 2; /* Open four */
|
||||||
|
open-6: 3; /* Open six */
|
||||||
|
open-9: 4; /* Open nine */
|
||||||
|
lc-l-with-tail: 5; /* Lower-case L with tail */
|
||||||
|
simplified-u: 6; /* Simplified u */
|
||||||
|
alt-double-s: 7; /* Alternate German double s */
|
||||||
|
uc-i-with-serif: 8; /* Upper-case i with serif */
|
||||||
|
uc-g-with-spur: 10; /* Capital G with spur */
|
||||||
|
single-story-a: 11; /* Single-story a */
|
||||||
|
compact-lc-f: 12; /* Compact f */
|
||||||
|
compact-lc-t: 13; /* Compact t */
|
||||||
|
}
|
||||||
|
@styleset {
|
||||||
|
ss01: 1;
|
||||||
|
ss02: 2;
|
||||||
|
ss03: 3;
|
||||||
|
ss04: 4;
|
||||||
|
ss05: 5;
|
||||||
|
ss06: 6;
|
||||||
|
ss07: 7;
|
||||||
|
ss08: 8;
|
||||||
|
open-digits: 1; /* Open digits */
|
||||||
|
disambiguation: 2; /* Disambiguation (with zero) */
|
||||||
|
disambiguation-except-zero: 4; /* Disambiguation (no zero) */
|
||||||
|
round-quotes-and-commas: 3; /* Round quotes & commas */
|
||||||
|
square-punctuation: 7; /* Square punctuation */
|
||||||
|
square-quotes: 8; /* Square quotes */
|
||||||
|
circled-characters: 5; /* Circled characters */
|
||||||
|
squared-characters: 6; /* Squared characters */
|
||||||
|
}
|
||||||
|
}
|
87
packages/next/app/[locale]/fonts/MiSans/MiSans.css
Normal file
87
packages/next/app/[locale]/fonts/MiSans/MiSans.css
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: "MiSans VF";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 150 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans VF.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Thin.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-ExtraLight.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Light.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 360;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Normal.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Regular.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Medium.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Demibold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Semibold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 800;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Bold.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "MiSans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("MiSans-Heavy.woff2") format("woff2");
|
||||||
|
}
|
@ -79,8 +79,6 @@
|
|||||||
--color-dark-on-error: #690005;
|
--color-dark-on-error: #690005;
|
||||||
--color-dark-error-container: #93000a;
|
--color-dark-error-container: #93000a;
|
||||||
--color-dark-on-error-container: #ffdad6;
|
--color-dark-on-error-container: #ffdad6;
|
||||||
|
|
||||||
--font-zh: "InterVariable", "MiSans VF", sans-serif;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -88,7 +86,7 @@ a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
font-family: "MiSans", "Inter", sans-serif;
|
font-family: "Inter", "MiSans", sans-serif;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
@apply bg-surface dark:bg-dark-surface text-on-surface dark:text-dark-on-surface;
|
@apply bg-surface dark:bg-dark-surface text-on-surface dark:text-dark-on-surface;
|
||||||
}
|
}
|
||||||
@ -101,7 +99,7 @@ a {
|
|||||||
|
|
||||||
@supports (font-variation-settings: normal) {
|
@supports (font-variation-settings: normal) {
|
||||||
:root {
|
:root {
|
||||||
font-family: "InterVariable", "MiSans VF", sans-serif;
|
font-family: "Inter Variable", "MiSans VF", sans-serif;
|
||||||
font-optical-sizing: auto;
|
font-optical-sizing: auto;
|
||||||
font-weight: 330;
|
font-weight: 330;
|
||||||
}
|
}
|
@ -1,16 +1,25 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { routing } from "@/i18n/routing";
|
||||||
|
import { NextIntlClientProvider, hasLocale } from "next-intl";
|
||||||
|
import { notFound } from "next/navigation";
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "中V档案馆"
|
title: "中V档案馆"
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function RootLayout({
|
export default async function RootLayout({
|
||||||
children
|
children,
|
||||||
|
params
|
||||||
}: Readonly<{
|
}: Readonly<{
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
params: Promise<{ locale: string }>;
|
||||||
}>) {
|
}>) {
|
||||||
|
const { locale } = await params;
|
||||||
|
if (!hasLocale(routing.locales, locale)) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<html lang="zh-CN">
|
<html lang="zh-CN">
|
||||||
<head>
|
<head>
|
||||||
@ -19,8 +28,10 @@ export default function RootLayout({
|
|||||||
<title>中V档案馆</title>
|
<title>中V档案馆</title>
|
||||||
</head>
|
</head>
|
||||||
<body className="min-h-screen flex flex-col">
|
<body className="min-h-screen flex flex-col">
|
||||||
{children}
|
<NextIntlClientProvider>
|
||||||
<div id="portal-root"></div>
|
{children}
|
||||||
|
<div id="portal-root"></div>
|
||||||
|
</NextIntlClientProvider>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
@ -10,8 +10,28 @@ import { Portal } from "@/components/utils/Portal";
|
|||||||
import { Dialog, DialogButton, DialogButtonGroup, DialogHeadline, DialogSupportingText } from "@/components/ui/Dialog";
|
import { Dialog, DialogButton, DialogButtonGroup, DialogHeadline, DialogSupportingText } from "@/components/ui/Dialog";
|
||||||
import { FilledButton } from "@/components/ui/Buttons/FilledButton";
|
import { FilledButton } from "@/components/ui/Buttons/FilledButton";
|
||||||
import { string, object, ValidationError } from "yup";
|
import { string, object, ValidationError } from "yup";
|
||||||
|
import { setLocale } from "yup";
|
||||||
|
import { useTranslations } from "next-intl";
|
||||||
|
|
||||||
const FormSchema = object({
|
setLocale({
|
||||||
|
mixed: {
|
||||||
|
default: "field_invalid",
|
||||||
|
required: () => ({ key: "field_required" })
|
||||||
|
},
|
||||||
|
string: {
|
||||||
|
min: ({ min }) => ({ key: "field_too_short", values: { min } }),
|
||||||
|
max: ({ max }) => ({ key: "field_too_big", values: { max } })
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
interface LocalizedMessage {
|
||||||
|
key: string;
|
||||||
|
values: {
|
||||||
|
[key: string]: number | string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const FormSchema = object().shape({
|
||||||
username: string().required().max(50),
|
username: string().required().max(50),
|
||||||
password: string().required().min(4).max(120),
|
password: string().required().min(4).max(120),
|
||||||
nickname: string().optional().max(30)
|
nickname: string().optional().max(30)
|
||||||
@ -50,6 +70,7 @@ const SignUpForm: React.FC<RegistrationFormProps> = ({ backendURL }) => {
|
|||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [showDialog, setShowDialog] = useState(false);
|
const [showDialog, setShowDialog] = useState(false);
|
||||||
const [dialogContent, setDialogContent] = useState(<></>);
|
const [dialogContent, setDialogContent] = useState(<></>);
|
||||||
|
const t = useTranslations("");
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: captchaSession,
|
data: captchaSession,
|
||||||
@ -74,16 +95,26 @@ const SignUpForm: React.FC<RegistrationFormProps> = ({ backendURL }) => {
|
|||||||
return fetcher<CaptchaResultResponse>(url.toString());
|
return fetcher<CaptchaResultResponse>(url.toString());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const translateErrorMessage = (item: LocalizedMessage | string, path?: string) => {
|
||||||
|
if (typeof item === "string") {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
return t(`yup_errors.${item.key}`, { ...item.values, field: path ? t(path) : "" });
|
||||||
|
};
|
||||||
|
|
||||||
const register = async () => {
|
const register = async () => {
|
||||||
let username: string | undefined;
|
let username: string | undefined;
|
||||||
let password: string | undefined;
|
let password: string | undefined;
|
||||||
let nickname: string | undefined;
|
let nickname: string | undefined;
|
||||||
try {
|
try {
|
||||||
const formData = await FormSchema.validate({
|
const formData = await FormSchema.validate(
|
||||||
username: usernameInput,
|
{
|
||||||
password: passwordInput,
|
username: usernameInput,
|
||||||
nickname: nicknameInput
|
password: passwordInput,
|
||||||
});
|
nickname: nicknameInput
|
||||||
|
},
|
||||||
|
{ abortEarly: false }
|
||||||
|
);
|
||||||
username = formData.username;
|
username = formData.username;
|
||||||
password = formData.password;
|
password = formData.password;
|
||||||
nickname = formData.nickname;
|
nickname = formData.nickname;
|
||||||
@ -91,6 +122,7 @@ const SignUpForm: React.FC<RegistrationFormProps> = ({ backendURL }) => {
|
|||||||
if (!(e instanceof ValidationError)) {
|
if (!(e instanceof ValidationError)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
console.log(JSON.parse(JSON.stringify(e)));
|
||||||
setShowDialog(true);
|
setShowDialog(true);
|
||||||
setDialogContent(
|
setDialogContent(
|
||||||
<>
|
<>
|
||||||
@ -99,14 +131,14 @@ const SignUpForm: React.FC<RegistrationFormProps> = ({ backendURL }) => {
|
|||||||
<p>注册信息填写有误,请检查后重新提交。</p>
|
<p>注册信息填写有误,请检查后重新提交。</p>
|
||||||
<span>错误信息: </span>
|
<span>错误信息: </span>
|
||||||
<br />
|
<br />
|
||||||
<ol>
|
<ol className="list-decimal list-inside">
|
||||||
{e.errors.map((item, i) => {
|
{e.errors.map((item, i) => {
|
||||||
return <li key={i}>{item}</li>;
|
return <li key={i}>{translateErrorMessage(item, e.inner[i].path)}</li>;
|
||||||
})}
|
})}
|
||||||
</ol>
|
</ol>
|
||||||
</DialogSupportingText>
|
</DialogSupportingText>
|
||||||
<DialogButtonGroup>
|
<DialogButtonGroup>
|
||||||
<DialogButton onClick={() => setShowDialog(false)}>Close</DialogButton>
|
<DialogButton onClick={() => setShowDialog(false)}>关闭</DialogButton>
|
||||||
</DialogButtonGroup>
|
</DialogButtonGroup>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
@ -4,10 +4,10 @@ import SignUpForm from "./SignUpForm";
|
|||||||
|
|
||||||
export default function SignupPage() {
|
export default function SignupPage() {
|
||||||
return (
|
return (
|
||||||
<main className="relative flex-grow pt-8 md:pt-0 px-4 md:w-full md:h-full md:flex md:items-center md:justify-center">
|
<main className="relative flex-grow pt-8 px-4 md:w-full md:h-full md:flex md:items-center md:justify-center">
|
||||||
<div
|
<div
|
||||||
className="md:w-[40rem] rounded-md md:p-8 md:-translate-y-6
|
className="md:w-[40rem] rounded-md md:p-8 md:-translate-y-6
|
||||||
md:bg-surface-container md:dark:bg-dark-surface-container"
|
md:bg-surface-container md:dark:bg-dark-surface-container"
|
||||||
>
|
>
|
||||||
<p className="mb-2">
|
<p className="mb-2">
|
||||||
<a href="/">
|
<a href="/">
|
@ -1,450 +0,0 @@
|
|||||||
@font-face {
|
|
||||||
font-family: InterVariable;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 100 900;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterVariable.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: InterVariable;
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 100 900;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterVariable-Italic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* static fonts */
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 100;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-Thin.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 100;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-ThinItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 200;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-ExtraLight.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 200;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-ExtraLightItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 300;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-Light.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 300;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-LightItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-Regular.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 400;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-Italic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 500;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-Medium.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 500;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-MediumItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 600;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-SemiBold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 600;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-SemiBoldItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 700;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-Bold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 700;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-BoldItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 800;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-ExtraBold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 800;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-ExtraBoldItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-Black.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 900;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("Inter-BlackItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 100;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-Thin.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 100;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-ThinItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 200;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-ExtraLight.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 200;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-ExtraLightItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 300;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-Light.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 300;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-LightItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-Regular.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 400;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-Italic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 500;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-Medium.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 500;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-MediumItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 600;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-SemiBold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 600;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-SemiBoldItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 700;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-Bold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 700;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-BoldItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 800;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-ExtraBold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 800;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-ExtraBoldItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-Black.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "InterDisplay";
|
|
||||||
font-style: italic;
|
|
||||||
font-weight: 900;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("InterDisplay-BlackItalic.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-feature-values InterVariable {
|
|
||||||
@character-variant {
|
|
||||||
cv01: 1;
|
|
||||||
cv02: 2;
|
|
||||||
cv03: 3;
|
|
||||||
cv04: 4;
|
|
||||||
cv05: 5;
|
|
||||||
cv06: 6;
|
|
||||||
cv07: 7;
|
|
||||||
cv08: 8;
|
|
||||||
cv09: 9;
|
|
||||||
cv10: 10;
|
|
||||||
cv11: 11;
|
|
||||||
cv12: 12;
|
|
||||||
cv13: 13;
|
|
||||||
alt-1: 1; /* Alternate one */
|
|
||||||
alt-3: 9; /* Flat-top three */
|
|
||||||
open-4: 2; /* Open four */
|
|
||||||
open-6: 3; /* Open six */
|
|
||||||
open-9: 4; /* Open nine */
|
|
||||||
lc-l-with-tail: 5; /* Lower-case L with tail */
|
|
||||||
simplified-u: 6; /* Simplified u */
|
|
||||||
alt-double-s: 7; /* Alternate German double s */
|
|
||||||
uc-i-with-serif: 8; /* Upper-case i with serif */
|
|
||||||
uc-g-with-spur: 10; /* Capital G with spur */
|
|
||||||
single-story-a: 11; /* Single-story a */
|
|
||||||
compact-lc-f: 12; /* Compact f */
|
|
||||||
compact-lc-t: 13; /* Compact t */
|
|
||||||
}
|
|
||||||
@styleset {
|
|
||||||
ss01: 1;
|
|
||||||
ss02: 2;
|
|
||||||
ss03: 3;
|
|
||||||
ss04: 4;
|
|
||||||
ss05: 5;
|
|
||||||
ss06: 6;
|
|
||||||
ss07: 7;
|
|
||||||
ss08: 8;
|
|
||||||
open-digits: 1; /* Open digits */
|
|
||||||
disambiguation: 2; /* Disambiguation (with zero) */
|
|
||||||
disambiguation-except-zero: 4; /* Disambiguation (no zero) */
|
|
||||||
round-quotes-and-commas: 3; /* Round quotes & commas */
|
|
||||||
square-punctuation: 7; /* Square punctuation */
|
|
||||||
square-quotes: 8; /* Square quotes */
|
|
||||||
circled-characters: 5; /* Circled characters */
|
|
||||||
squared-characters: 6; /* Squared characters */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@font-feature-values Inter {
|
|
||||||
|
|
||||||
@character-variant {
|
|
||||||
cv01: 1;
|
|
||||||
cv02: 2;
|
|
||||||
cv03: 3;
|
|
||||||
cv04: 4;
|
|
||||||
cv05: 5;
|
|
||||||
cv06: 6;
|
|
||||||
cv07: 7;
|
|
||||||
cv08: 8;
|
|
||||||
cv09: 9;
|
|
||||||
cv10: 10;
|
|
||||||
cv11: 11;
|
|
||||||
cv12: 12;
|
|
||||||
cv13: 13;
|
|
||||||
alt-1: 1; /* Alternate one */
|
|
||||||
alt-3: 9; /* Flat-top three */
|
|
||||||
open-4: 2; /* Open four */
|
|
||||||
open-6: 3; /* Open six */
|
|
||||||
open-9: 4; /* Open nine */
|
|
||||||
lc-l-with-tail: 5; /* Lower-case L with tail */
|
|
||||||
simplified-u: 6; /* Simplified u */
|
|
||||||
alt-double-s: 7; /* Alternate German double s */
|
|
||||||
uc-i-with-serif: 8; /* Upper-case i with serif */
|
|
||||||
uc-g-with-spur: 10; /* Capital G with spur */
|
|
||||||
single-story-a: 11; /* Single-story a */
|
|
||||||
compact-lc-f: 12; /* Compact f */
|
|
||||||
compact-lc-t: 13; /* Compact t */
|
|
||||||
}
|
|
||||||
@styleset {
|
|
||||||
ss01: 1;
|
|
||||||
ss02: 2;
|
|
||||||
ss03: 3;
|
|
||||||
ss04: 4;
|
|
||||||
ss05: 5;
|
|
||||||
ss06: 6;
|
|
||||||
ss07: 7;
|
|
||||||
ss08: 8;
|
|
||||||
open-digits: 1; /* Open digits */
|
|
||||||
disambiguation: 2; /* Disambiguation (with zero) */
|
|
||||||
disambiguation-except-zero: 4; /* Disambiguation (no zero) */
|
|
||||||
round-quotes-and-commas: 3; /* Round quotes & commas */
|
|
||||||
square-punctuation: 7; /* Square punctuation */
|
|
||||||
square-quotes: 8; /* Square quotes */
|
|
||||||
circled-characters: 5; /* Circled characters */
|
|
||||||
squared-characters: 6; /* Squared characters */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@font-feature-values InterDisplay {
|
|
||||||
@character-variant {
|
|
||||||
cv01: 1;
|
|
||||||
cv02: 2;
|
|
||||||
cv03: 3;
|
|
||||||
cv04: 4;
|
|
||||||
cv05: 5;
|
|
||||||
cv06: 6;
|
|
||||||
cv07: 7;
|
|
||||||
cv08: 8;
|
|
||||||
cv09: 9;
|
|
||||||
cv10: 10;
|
|
||||||
cv11: 11;
|
|
||||||
cv12: 12;
|
|
||||||
cv13: 13;
|
|
||||||
alt-1: 1; /* Alternate one */
|
|
||||||
alt-3: 9; /* Flat-top three */
|
|
||||||
open-4: 2; /* Open four */
|
|
||||||
open-6: 3; /* Open six */
|
|
||||||
open-9: 4; /* Open nine */
|
|
||||||
lc-l-with-tail: 5; /* Lower-case L with tail */
|
|
||||||
simplified-u: 6; /* Simplified u */
|
|
||||||
alt-double-s: 7; /* Alternate German double s */
|
|
||||||
uc-i-with-serif: 8; /* Upper-case i with serif */
|
|
||||||
uc-g-with-spur: 10; /* Capital G with spur */
|
|
||||||
single-story-a: 11; /* Single-story a */
|
|
||||||
compact-lc-f: 12; /* Compact f */
|
|
||||||
compact-lc-t: 13; /* Compact t */
|
|
||||||
}
|
|
||||||
@styleset {
|
|
||||||
ss01: 1;
|
|
||||||
ss02: 2;
|
|
||||||
ss03: 3;
|
|
||||||
ss04: 4;
|
|
||||||
ss05: 5;
|
|
||||||
ss06: 6;
|
|
||||||
ss07: 7;
|
|
||||||
ss08: 8;
|
|
||||||
open-digits: 1; /* Open digits */
|
|
||||||
disambiguation: 2; /* Disambiguation (with zero) */
|
|
||||||
disambiguation-except-zero: 4; /* Disambiguation (no zero) */
|
|
||||||
round-quotes-and-commas: 3; /* Round quotes & commas */
|
|
||||||
square-punctuation: 7; /* Square punctuation */
|
|
||||||
square-quotes: 8; /* Square quotes */
|
|
||||||
circled-characters: 5; /* Circled characters */
|
|
||||||
squared-characters: 6; /* Squared characters */
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
@font-face {
|
|
||||||
font-family: "MiSans VF";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 150 700;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans VF.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 100;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Thin.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 200;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-ExtraLight.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 300;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Light.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 360;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Normal.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Regular.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 500;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Medium.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 600;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Demibold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 700;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Semibold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 800;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Bold.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "MiSans";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
font-display: swap;
|
|
||||||
src: url("MiSans-Heavy.woff2") format("woff2");
|
|
||||||
}
|
|
@ -5,7 +5,9 @@
|
|||||||
"name": "next",
|
"name": "next",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"framer-motion": "^12.12.2",
|
"framer-motion": "^12.12.2",
|
||||||
|
"i18next": "^25.2.1",
|
||||||
"next": "^15.1.8",
|
"next": "^15.1.8",
|
||||||
|
"next-intl": "^4.1.0",
|
||||||
"react": "^19.1.0",
|
"react": "^19.1.0",
|
||||||
"react-dom": "^19.1.0",
|
"react-dom": "^19.1.0",
|
||||||
"swr": "^2.3.3",
|
"swr": "^2.3.3",
|
||||||
@ -26,8 +28,20 @@
|
|||||||
|
|
||||||
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
|
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
|
||||||
|
|
||||||
|
"@babel/runtime": ["@babel/runtime@7.27.4", "", {}, "sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA=="],
|
||||||
|
|
||||||
"@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
|
"@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
|
||||||
|
|
||||||
|
"@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.4", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.1", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA=="],
|
||||||
|
|
||||||
|
"@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="],
|
||||||
|
|
||||||
|
"@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.2", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.4", "@formatjs/icu-skeleton-parser": "1.8.14", "tslib": "^2.8.0" } }, "sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA=="],
|
||||||
|
|
||||||
|
"@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.14", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.4", "tslib": "^2.8.0" } }, "sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ=="],
|
||||||
|
|
||||||
|
"@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.5.10", "", { "dependencies": { "tslib": "2" } }, "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q=="],
|
||||||
|
|
||||||
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg=="],
|
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg=="],
|
||||||
|
|
||||||
"@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g=="],
|
"@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g=="],
|
||||||
@ -100,6 +114,8 @@
|
|||||||
|
|
||||||
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA=="],
|
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA=="],
|
||||||
|
|
||||||
|
"@schummar/icu-type-parser": ["@schummar/icu-type-parser@1.21.5", "", {}, "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw=="],
|
||||||
|
|
||||||
"@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="],
|
"@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="],
|
||||||
|
|
||||||
"@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
|
"@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
|
||||||
@ -158,6 +174,8 @@
|
|||||||
|
|
||||||
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
||||||
|
|
||||||
|
"decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="],
|
||||||
|
|
||||||
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
|
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
|
||||||
|
|
||||||
"detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
|
"detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
|
||||||
@ -168,6 +186,10 @@
|
|||||||
|
|
||||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||||
|
|
||||||
|
"i18next": ["i18next@25.2.1", "", { "dependencies": { "@babel/runtime": "^7.27.1" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-+UoXK5wh+VlE1Zy5p6MjcvctHXAhRwQKCxiJD8noKZzIXmnAX8gdHX5fLPA3MEVxEN4vbZkQFy8N0LyD9tUqPw=="],
|
||||||
|
|
||||||
|
"intl-messageformat": ["intl-messageformat@10.7.16", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.4", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.2", "tslib": "^2.8.0" } }, "sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug=="],
|
||||||
|
|
||||||
"is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
|
"is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
|
||||||
|
|
||||||
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
|
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
|
||||||
@ -208,8 +230,12 @@
|
|||||||
|
|
||||||
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
||||||
|
|
||||||
|
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
|
||||||
|
|
||||||
"next": ["next@15.3.2", "", { "dependencies": { "@next/env": "15.3.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.2", "@next/swc-darwin-x64": "15.3.2", "@next/swc-linux-arm64-gnu": "15.3.2", "@next/swc-linux-arm64-musl": "15.3.2", "@next/swc-linux-x64-gnu": "15.3.2", "@next/swc-linux-x64-musl": "15.3.2", "@next/swc-win32-arm64-msvc": "15.3.2", "@next/swc-win32-x64-msvc": "15.3.2", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ=="],
|
"next": ["next@15.3.2", "", { "dependencies": { "@next/env": "15.3.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.2", "@next/swc-darwin-x64": "15.3.2", "@next/swc-linux-arm64-gnu": "15.3.2", "@next/swc-linux-arm64-musl": "15.3.2", "@next/swc-linux-x64-gnu": "15.3.2", "@next/swc-linux-x64-musl": "15.3.2", "@next/swc-win32-arm64-msvc": "15.3.2", "@next/swc-win32-x64-msvc": "15.3.2", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ=="],
|
||||||
|
|
||||||
|
"next-intl": ["next-intl@4.1.0", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.5.4", "negotiator": "^1.0.0", "use-intl": "^4.1.0" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "typescript": "^5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-JNJRjc7sdnfUxhZmGcvzDszZ60tQKrygV/VLsgzXhnJDxQPn1cN2rVpc53adA1SvBJwPK2O6Sc6b4gYSILjCzw=="],
|
||||||
|
|
||||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||||
|
|
||||||
"postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
|
"postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
|
||||||
@ -254,12 +280,16 @@
|
|||||||
|
|
||||||
"undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
|
"undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
|
||||||
|
|
||||||
|
"use-intl": ["use-intl@4.1.0", "", { "dependencies": { "@formatjs/fast-memoize": "^2.2.0", "@schummar/icu-type-parser": "1.21.5", "intl-messageformat": "^10.5.14" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-mQvDYFvoGn+bm/PWvlQOtluKCknsQ5a9F1Cj0hMfBjMBVTwnOqLPd6srhjvVdEQEQFVyHM1PfyifKqKYb11M9Q=="],
|
||||||
|
|
||||||
"use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="],
|
"use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="],
|
||||||
|
|
||||||
"yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
|
"yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
|
||||||
|
|
||||||
"yup": ["yup@1.6.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA=="],
|
"yup": ["yup@1.6.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA=="],
|
||||||
|
|
||||||
|
"@formatjs/ecma402-abstract/@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.1", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
|
||||||
|
@ -13,11 +13,6 @@ export const useDisableBodyScroll = (open: boolean) => {
|
|||||||
}, [open]);
|
}, [open]);
|
||||||
};
|
};
|
||||||
|
|
||||||
interface DialogProps {
|
|
||||||
show: boolean;
|
|
||||||
children?: React.ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
type OptionalChidrenProps<T = React.HTMLAttributes<HTMLElement>> = T & {
|
type OptionalChidrenProps<T = React.HTMLAttributes<HTMLElement>> = T & {
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
};
|
};
|
||||||
@ -33,6 +28,10 @@ type DialogButtonGroupProps = OptionalChidrenProps<DivElementAttr>;
|
|||||||
interface DialogButtonProps extends OptionalChidrenProps<ButtonElementAttr> {
|
interface DialogButtonProps extends OptionalChidrenProps<ButtonElementAttr> {
|
||||||
onClick?: React.MouseEventHandler<HTMLButtonElement>;
|
onClick?: React.MouseEventHandler<HTMLButtonElement>;
|
||||||
}
|
}
|
||||||
|
interface DialogProps extends OptionalChidrenProps<DivElementAttr> {
|
||||||
|
show: boolean;
|
||||||
|
children?: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
export const DialogHeadline: React.FC<DialogHeadlineProps> = ({
|
export const DialogHeadline: React.FC<DialogHeadlineProps> = ({
|
||||||
children,
|
children,
|
||||||
@ -52,7 +51,13 @@ export const DialogSupportingText: React.FC<DialogSupportingTextProps> = ({
|
|||||||
...rest
|
...rest
|
||||||
}: DialogHeadlineProps) => {
|
}: DialogHeadlineProps) => {
|
||||||
return (
|
return (
|
||||||
<div className={"mt-4 text-sm leading-5 mb-6 " + className || ""} {...rest}>
|
<div
|
||||||
|
className={
|
||||||
|
"mt-4 text-sm leading-5 mb-6 text-on-surface-variant dark:text-dark-on-surface-variant " + className ||
|
||||||
|
""
|
||||||
|
}
|
||||||
|
{...rest}
|
||||||
|
>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -74,7 +79,7 @@ export const DialogButtonGroup: React.FC<DialogButtonGroupProps> = ({ children,
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Dialog: React.FC<DialogProps> = ({ show, children }: DialogProps) => {
|
export const Dialog: React.FC<DialogProps> = ({ show, children, className }: DialogProps) => {
|
||||||
useDisableBodyScroll(show);
|
useDisableBodyScroll(show);
|
||||||
return (
|
return (
|
||||||
<AnimatePresence>
|
<AnimatePresence>
|
||||||
@ -89,8 +94,8 @@ export const Dialog: React.FC<DialogProps> = ({ show, children }: DialogProps) =
|
|||||||
transition={{ duration: 0.3 }}
|
transition={{ duration: 0.3 }}
|
||||||
/>
|
/>
|
||||||
<motion.div
|
<motion.div
|
||||||
className="fixed min-w-[17.5rem] sm:max-w-[35rem] h-auto z-50 bg-surface-container-high
|
className={`fixed min-w-[17.5rem] sm:max-w-[35rem] h-auto z-50 bg-surface-container-high
|
||||||
shadow-2xl shadow-shadow/15 rounded-[1.75rem] p-6 dark:bg-dark-surface-container-high mx-2"
|
shadow-2xl shadow-shadow/15 rounded-[1.75rem] p-6 dark:bg-dark-surface-container-high mx-2 ${className}`}
|
||||||
initial={{ opacity: 0.5, transform: "scale(1.1)" }}
|
initial={{ opacity: 0.5, transform: "scale(1.1)" }}
|
||||||
animate={{ opacity: 1, transform: "scale(1)" }}
|
animate={{ opacity: 1, transform: "scale(1)" }}
|
||||||
exit={{ opacity: 0 }}
|
exit={{ opacity: 0 }}
|
||||||
|
6
packages/next/i18n/navigation.ts
Normal file
6
packages/next/i18n/navigation.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { createNavigation } from "next-intl/navigation";
|
||||||
|
import { routing } from "./routing";
|
||||||
|
|
||||||
|
// Lightweight wrappers around Next.js' navigation
|
||||||
|
// APIs that consider the routing configuration
|
||||||
|
export const { Link, redirect, usePathname, useRouter, getPathname } = createNavigation(routing);
|
21
packages/next/i18n/request.ts
Normal file
21
packages/next/i18n/request.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { getRequestConfig } from "next-intl/server";
|
||||||
|
import { hasLocale } from "next-intl";
|
||||||
|
import { routing } from "./routing";
|
||||||
|
import zh from "./strings/zh.json";
|
||||||
|
import en from "./strings/en.json";
|
||||||
|
|
||||||
|
const stringsMap = {
|
||||||
|
zh: zh,
|
||||||
|
en: en
|
||||||
|
};
|
||||||
|
|
||||||
|
export default getRequestConfig(async ({ requestLocale }) => {
|
||||||
|
// Typically corresponds to the `[locale]` segment
|
||||||
|
const requested = await requestLocale;
|
||||||
|
const locale = hasLocale(routing.locales, requested) ? requested : routing.defaultLocale;
|
||||||
|
|
||||||
|
return {
|
||||||
|
locale,
|
||||||
|
messages: stringsMap[locale]
|
||||||
|
};
|
||||||
|
});
|
9
packages/next/i18n/routing.ts
Normal file
9
packages/next/i18n/routing.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { defineRouting } from "next-intl/routing";
|
||||||
|
|
||||||
|
export const routing = defineRouting({
|
||||||
|
// A list of all locales that are supported
|
||||||
|
locales: ["en", "zh"],
|
||||||
|
|
||||||
|
// Used when no locale matches
|
||||||
|
defaultLocale: "zh"
|
||||||
|
});
|
6
packages/next/i18n/strings/en.json
Normal file
6
packages/next/i18n/strings/en.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"yup_errors": {
|
||||||
|
"field_too_short": "{field}至少需要{min}个字符。",
|
||||||
|
"field_too_long": "{field}不能多于{max}个字符。"
|
||||||
|
}
|
||||||
|
}
|
10
packages/next/i18n/strings/zh.json
Normal file
10
packages/next/i18n/strings/zh.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"yup_errors": {
|
||||||
|
"field_too_short": "{field}至少需要 {min} 个字符。",
|
||||||
|
"field_too_big": "{field}不能多于 {max} 个字符。",
|
||||||
|
"field_required": "请填写{field}。"
|
||||||
|
},
|
||||||
|
"username": "用户名",
|
||||||
|
"password": "密码",
|
||||||
|
"nickname": "昵称"
|
||||||
|
}
|
11
packages/next/lib/middleware.ts
Normal file
11
packages/next/lib/middleware.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import createMiddleware from "next-intl/middleware";
|
||||||
|
import { routing } from "@/i18n/routing";
|
||||||
|
|
||||||
|
export default createMiddleware(routing);
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
// Match all pathnames except for
|
||||||
|
// - … if they start with `/api`, `/trpc`, `/_next` or `/_vercel`
|
||||||
|
// - … the ones containing a dot (e.g. `favicon.ico`)
|
||||||
|
matcher: "/((?!api|trpc|_next|_vercel|.*\\..*).*)"
|
||||||
|
};
|
@ -1,7 +1,10 @@
|
|||||||
import type { NextConfig } from "next";
|
import type { NextConfig } from "next";
|
||||||
|
import createNextIntlPlugin from "next-intl/plugin";
|
||||||
|
|
||||||
const nextConfig: NextConfig = {
|
const nextConfig: NextConfig = {
|
||||||
devIndicators: false
|
devIndicators: false
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
const withNextIntl = createNextIntlPlugin();
|
||||||
|
|
||||||
|
export default withNextIntl(nextConfig);
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"framer-motion": "^12.12.2",
|
"framer-motion": "^12.12.2",
|
||||||
|
"i18next": "^25.2.1",
|
||||||
"next": "^15.1.8",
|
"next": "^15.1.8",
|
||||||
|
"next-intl": "^4.1.0",
|
||||||
"react": "^19.1.0",
|
"react": "^19.1.0",
|
||||||
"react-dom": "^19.1.0",
|
"react-dom": "^19.1.0",
|
||||||
"swr": "^2.3.3",
|
"swr": "^2.3.3",
|
||||||
|
Loading…
Reference in New Issue
Block a user