diff --git a/components/main.tsx b/components/main.tsx
new file mode 100644
index 0000000..14cad38
--- /dev/null
+++ b/components/main.tsx
@@ -0,0 +1,58 @@
+//Components
+import Link from 'next/link';
+
+//Styles
+import styles from '@/styles/MainNode.module.scss';
+
+//Methods
+import { useRouter } from 'next/router';
+
+function MomoTalkIcon() {
+ return ;
+}
+
+function MTBarLink({ type }: { type: string }) {
+ const router = useRouter();
+ return (
+
+
+
+
+
+ );
+}
+
+export default function MainNode({ children }: { children: JSX.Element }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/title.ts b/components/title.ts
new file mode 100644
index 0000000..10b8db8
--- /dev/null
+++ b/components/title.ts
@@ -0,0 +1,3 @@
+export default function getTitle(title?: string): string {
+ return 'MomoTalk' + (title ? ` | ${title}` : '');
+}
\ No newline at end of file
diff --git a/next.config.js b/next.config.js
index a843cbe..57883a4 100644
--- a/next.config.js
+++ b/next.config.js
@@ -1,6 +1,10 @@
+const path = require('path');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
+ sassOptions: {
+ includePaths: [path.join(__dirname, 'styles')],
+ },
}
-module.exports = nextConfig
+module.exports = nextConfig;
diff --git a/package.json b/package.json
index 9c2a72b..2755069 100644
--- a/package.json
+++ b/package.json
@@ -16,8 +16,10 @@
"eslint": "8.34.0",
"eslint-config-next": "13.1.6",
"next": "13.1.6",
+ "next-seo": "^5.15.0",
"react": "18.2.0",
"react-dom": "18.2.0",
+ "sass": "^1.58.3",
"typescript": "4.9.5"
}
}
diff --git a/pages/404.tsx b/pages/404.tsx
new file mode 100644
index 0000000..70cf302
--- /dev/null
+++ b/pages/404.tsx
@@ -0,0 +1,13 @@
+//Components
+import { NextSeo } from 'next-seo';
+
+export default function NotFound() {
+ return (
+ <>
+
+ 404 Not Found
+ >
+ );
+}
diff --git a/pages/_app.tsx b/pages/_app.tsx
index 021681f..93fcb18 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -1,6 +1,13 @@
-import '@/styles/globals.css'
-import type { AppProps } from 'next/app'
+import type { AppProps } from 'next/app';
+import MainNode from '@/components/main';
+
+//Global Style
+import '@/styles/globals.scss';
export default function App({ Component, pageProps }: AppProps) {
- return
-}
+ return (
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/pages/_document.tsx b/pages/_document.tsx
index 54e8bf3..19fd80d 100644
--- a/pages/_document.tsx
+++ b/pages/_document.tsx
@@ -1,13 +1,15 @@
import { Html, Head, Main, NextScript } from 'next/document'
export default function Document() {
- return (
-
-
-
-
-
-
- )
-}
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/pages/api/hello.ts b/pages/api/hello.ts
deleted file mode 100644
index f8bcc7e..0000000
--- a/pages/api/hello.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-type Data = {
- name: string
-}
-
-export default function handler(
- req: NextApiRequest,
- res: NextApiResponse
-) {
- res.status(200).json({ name: 'John Doe' })
-}
diff --git a/pages/api/icon/chat.ts b/pages/api/icon/chat.ts
new file mode 100644
index 0000000..5016f7b
--- /dev/null
+++ b/pages/api/icon/chat.ts
@@ -0,0 +1,17 @@
+import type { NextApiRequest, NextApiResponse } from 'next'
+
+export default function handler(
+ req: NextApiRequest,
+ res: NextApiResponse
+) {
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ res.setHeader('Content-Type', 'image/svg+xml');
+ const { fill = 'fff' } = req.query;
+ res.status(200).send(`
+ `);
+}
\ No newline at end of file
diff --git a/pages/api/icon/index.ts b/pages/api/icon/index.ts
new file mode 100644
index 0000000..6092e15
--- /dev/null
+++ b/pages/api/icon/index.ts
@@ -0,0 +1,14 @@
+import type { NextApiRequest, NextApiResponse } from 'next'
+
+export default function handler(
+ req: NextApiRequest,
+ res: NextApiResponse
+) {
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ res.setHeader('Content-Type', 'image/svg+xml');
+ const { fill = 'fff' } = req.query;
+ res.status(200).send(``);
+}
\ No newline at end of file
diff --git a/pages/api/icon/info.ts b/pages/api/icon/info.ts
new file mode 100644
index 0000000..9b8ef17
--- /dev/null
+++ b/pages/api/icon/info.ts
@@ -0,0 +1,28 @@
+import type { NextApiRequest, NextApiResponse } from 'next'
+
+export default function handler(
+ req: NextApiRequest,
+ res: NextApiResponse
+) {
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ res.setHeader('Content-Type', 'image/svg+xml');
+ const { fill = 'fff' } = req.query;
+ res.status(200).send(`
+ `);
+}
\ No newline at end of file
diff --git a/pages/api/icon/line.ts b/pages/api/icon/line.ts
new file mode 100644
index 0000000..83d9204
--- /dev/null
+++ b/pages/api/icon/line.ts
@@ -0,0 +1,14 @@
+import type { NextApiRequest, NextApiResponse } from 'next'
+
+export default function handler(
+ req: NextApiRequest,
+ res: NextApiResponse
+) {
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ res.setHeader('Content-Type', 'image/svg+xml');
+ const { fill = 'fff' } = req.query;
+ res.status(200).send(`
+ `);
+}
\ No newline at end of file
diff --git a/pages/chat.tsx b/pages/chat.tsx
new file mode 100644
index 0000000..4f26b16
--- /dev/null
+++ b/pages/chat.tsx
@@ -0,0 +1,24 @@
+//Components
+import { NextSeo } from 'next-seo';
+
+//Methods
+import getTitle from '@/components/title';
+
+//Styles
+import styles from '@/styles/Item.module.scss';
+
+export default function Info() {
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/pages/index.tsx b/pages/index.tsx
index 3a20955..dfab956 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -1,123 +1,16 @@
-import Head from 'next/head'
-import Image from 'next/image'
-import { Inter } from '@next/font/google'
-import styles from '@/styles/Home.module.css'
+//Components
+import { NextSeo } from 'next-seo';
-const inter = Inter({ subsets: ['latin'] })
+//Methods
+import getTitle from '@/components/title';
export default function Home() {
- return (
- <>
-
- Create Next App
-
-
-
-
-
-
-
- Get started by editing
- pages/index.tsx
-
-
-
-
-
-
-
-
- >
- )
+ 请选择栏目。
+ >
+ );
}
diff --git a/pages/info.tsx b/pages/info.tsx
new file mode 100644
index 0000000..059756a
--- /dev/null
+++ b/pages/info.tsx
@@ -0,0 +1,72 @@
+//Components
+import { NextSeo } from 'next-seo';
+
+//Methods
+import { useState } from 'react';
+import getTitle from '@/components/title';
+
+//Styles
+import styles from '@/styles/Item.module.scss';
+
+function Student() {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default function Info() {
+ const [state, setState] = useState({ student: null });
+ return (
+ <>
+
+
+
+
+
+
+
所有学生
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {state.student ?
+ (
+
+
+
+ )
+ : (
请选择学生。
)
+ }
+
+ >
+ );
+}
diff --git a/public/favicon.ico b/public/favicon.ico
deleted file mode 100644
index 718d6fe..0000000
Binary files a/public/favicon.ico and /dev/null differ
diff --git a/public/next.svg b/public/next.svg
deleted file mode 100644
index 5174b28..0000000
--- a/public/next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/thirteen.svg b/public/thirteen.svg
deleted file mode 100644
index 8977c1b..0000000
--- a/public/thirteen.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/vercel.svg b/public/vercel.svg
deleted file mode 100644
index d2f8422..0000000
--- a/public/vercel.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/styles/Home.module.css b/styles/Home.module.css
deleted file mode 100644
index 27dfff5..0000000
--- a/styles/Home.module.css
+++ /dev/null
@@ -1,278 +0,0 @@
-.main {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- align-items: center;
- padding: 6rem;
- min-height: 100vh;
-}
-
-.description {
- display: inherit;
- justify-content: inherit;
- align-items: inherit;
- font-size: 0.85rem;
- max-width: var(--max-width);
- width: 100%;
- z-index: 2;
- font-family: var(--font-mono);
-}
-
-.description a {
- display: flex;
- justify-content: center;
- align-items: center;
- gap: 0.5rem;
-}
-
-.description p {
- position: relative;
- margin: 0;
- padding: 1rem;
- background-color: rgba(var(--callout-rgb), 0.5);
- border: 1px solid rgba(var(--callout-border-rgb), 0.3);
- border-radius: var(--border-radius);
-}
-
-.code {
- font-weight: 700;
- font-family: var(--font-mono);
-}
-
-.grid {
- display: grid;
- grid-template-columns: repeat(4, minmax(25%, auto));
- width: var(--max-width);
- max-width: 100%;
-}
-
-.card {
- padding: 1rem 1.2rem;
- border-radius: var(--border-radius);
- background: rgba(var(--card-rgb), 0);
- border: 1px solid rgba(var(--card-border-rgb), 0);
- transition: background 200ms, border 200ms;
-}
-
-.card span {
- display: inline-block;
- transition: transform 200ms;
-}
-
-.card h2 {
- font-weight: 600;
- margin-bottom: 0.7rem;
-}
-
-.card p {
- margin: 0;
- opacity: 0.6;
- font-size: 0.9rem;
- line-height: 1.5;
- max-width: 30ch;
-}
-
-.center {
- display: flex;
- justify-content: center;
- align-items: center;
- position: relative;
- padding: 4rem 0;
-}
-
-.center::before {
- background: var(--secondary-glow);
- border-radius: 50%;
- width: 480px;
- height: 360px;
- margin-left: -400px;
-}
-
-.center::after {
- background: var(--primary-glow);
- width: 240px;
- height: 180px;
- z-index: -1;
-}
-
-.center::before,
-.center::after {
- content: '';
- left: 50%;
- position: absolute;
- filter: blur(45px);
- transform: translateZ(0);
-}
-
-.logo,
-.thirteen {
- position: relative;
-}
-
-.thirteen {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 75px;
- height: 75px;
- padding: 25px 10px;
- margin-left: 16px;
- transform: translateZ(0);
- border-radius: var(--border-radius);
- overflow: hidden;
- box-shadow: 0px 2px 8px -1px #0000001a;
-}
-
-.thirteen::before,
-.thirteen::after {
- content: '';
- position: absolute;
- z-index: -1;
-}
-
-/* Conic Gradient Animation */
-.thirteen::before {
- animation: 6s rotate linear infinite;
- width: 200%;
- height: 200%;
- background: var(--tile-border);
-}
-
-/* Inner Square */
-.thirteen::after {
- inset: 0;
- padding: 1px;
- border-radius: var(--border-radius);
- background: linear-gradient(
- to bottom right,
- rgba(var(--tile-start-rgb), 1),
- rgba(var(--tile-end-rgb), 1)
- );
- background-clip: content-box;
-}
-
-/* Enable hover only on non-touch devices */
-@media (hover: hover) and (pointer: fine) {
- .card:hover {
- background: rgba(var(--card-rgb), 0.1);
- border: 1px solid rgba(var(--card-border-rgb), 0.15);
- }
-
- .card:hover span {
- transform: translateX(4px);
- }
-}
-
-@media (prefers-reduced-motion) {
- .thirteen::before {
- animation: none;
- }
-
- .card:hover span {
- transform: none;
- }
-}
-
-/* Mobile */
-@media (max-width: 700px) {
- .content {
- padding: 4rem;
- }
-
- .grid {
- grid-template-columns: 1fr;
- margin-bottom: 120px;
- max-width: 320px;
- text-align: center;
- }
-
- .card {
- padding: 1rem 2.5rem;
- }
-
- .card h2 {
- margin-bottom: 0.5rem;
- }
-
- .center {
- padding: 8rem 0 6rem;
- }
-
- .center::before {
- transform: none;
- height: 300px;
- }
-
- .description {
- font-size: 0.8rem;
- }
-
- .description a {
- padding: 1rem;
- }
-
- .description p,
- .description div {
- display: flex;
- justify-content: center;
- position: fixed;
- width: 100%;
- }
-
- .description p {
- align-items: center;
- inset: 0 0 auto;
- padding: 2rem 1rem 1.4rem;
- border-radius: 0;
- border: none;
- border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
- background: linear-gradient(
- to bottom,
- rgba(var(--background-start-rgb), 1),
- rgba(var(--callout-rgb), 0.5)
- );
- background-clip: padding-box;
- backdrop-filter: blur(24px);
- }
-
- .description div {
- align-items: flex-end;
- pointer-events: none;
- inset: auto 0 0;
- padding: 2rem;
- height: 200px;
- background: linear-gradient(
- to bottom,
- transparent 0%,
- rgb(var(--background-end-rgb)) 40%
- );
- z-index: 1;
- }
-}
-
-/* Tablet and Smaller Desktop */
-@media (min-width: 701px) and (max-width: 1120px) {
- .grid {
- grid-template-columns: repeat(2, 50%);
- }
-}
-
-@media (prefers-color-scheme: dark) {
- .vercelLogo {
- filter: invert(1);
- }
-
- .logo,
- .thirteen img {
- filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
- }
-}
-
-@keyframes rotate {
- from {
- transform: rotate(360deg);
- }
- to {
- transform: rotate(0deg);
- }
-}
diff --git a/styles/Item.module.scss b/styles/Item.module.scss
new file mode 100644
index 0000000..d4cac52
--- /dev/null
+++ b/styles/Item.module.scss
@@ -0,0 +1,107 @@
+#infoBar {
+ height: 100%;
+ width: 50%;
+ background-color: #e3e3e5;
+ overflow: auto;
+}
+
+#infoBar::-webkit-scrollbar {
+ width: 0;
+}
+
+#infoBar {
+ #title {
+ position: fixed;
+ width: calc((100% - 70px) / 2);
+ height: 70px;
+ display: flex;
+ align-items: center;
+ background-color: #e3e3e5;
+ border-bottom: #d2d3d7 2px solid;
+ }
+
+ #title > p {
+ font-size: 20px;
+ margin-left: 10px;
+ }
+
+ #all {
+ background-color: #cfdae5;
+ height: 30px;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ border-bottom: #c8cfd7 2px solid;
+ }
+
+ #all > img {
+ height: 15px;
+ margin-left: 15px;
+ margin-right: 6px;
+ }
+
+ #students {
+ > div {
+ height: 80px;
+ display: flex;
+ flex-wrap: wrap;
+ flex-direction: row;
+ justify-content: flex-start;
+ }
+
+ > div {
+ > div.img {
+ margin: 10px;
+ overflow: hidden;
+ width: 60px;
+ height: 60px;
+ border-radius: 50%;
+ display: grid;
+ justify-content: center;
+ align-content: center;
+ }
+
+ > div.img > img.col {
+ width: 65px;
+ }
+
+ > div.p {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ }
+
+ > div.p > {
+ p {
+ margin: 0;
+ font-size: 18px;
+ }
+
+ p.name {
+ color: #000;
+ }
+
+ p.info {
+ color: #484848;
+ }
+ }
+
+ > div.line {
+ background-color: #dbdbdd;
+ width: calc(100% - 30px);
+ height: 2px;
+ margin: auto;
+ }
+ }
+ }
+}
+
+#contentBar {
+ height: 100%;
+ width: 50%;
+ background-color: #efefef;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
diff --git a/styles/MainNode.module.scss b/styles/MainNode.module.scss
new file mode 100644
index 0000000..2d7967a
--- /dev/null
+++ b/styles/MainNode.module.scss
@@ -0,0 +1,139 @@
+div #main {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+}
+
+@keyframes start {
+ 0% {
+ height: 100%;
+ }
+
+ 40% {
+ height: 100%;
+ }
+
+ 100% {
+ height: 0;
+ }
+}
+
+#MTStart {
+ background-color: #ff899e;
+ height: 0;
+ width: 100%;
+ position: absolute;
+ animation-duration: 800ms;
+ animation-name: start;
+ animation-timing-function: cubic-bezier(1, 0, 0, 1);
+ z-index: 1000;
+}
+
+@keyframes iconstart {
+ 0% {
+ width: 100px;
+ opacity: 0;
+ }
+
+ 50% {
+ width: 100px;
+ opacity: 1;
+ }
+
+ 100% {
+ width: 100px;
+ opacity: 0;
+ }
+}
+
+#MTStart {
+ > div {
+ width: 0;
+ height: auto;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ animation-duration: 500ms;
+ animation-name: iconstart;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ opacity: 0;
+ }
+
+ > div > svg {
+ width: 50px;
+ }
+}
+
+p.MTText {
+ margin: 10px;
+ font-size: 30px;
+ color: #fff;
+}
+
+#MTBackground {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ background-color: #efefef;
+}
+
+#MTBar {
+ width: 100%;
+ height: 50px;
+ background-image: linear-gradient(#ff899e, #f79bac);
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+}
+
+#MTBar {
+ > a > div#icon {
+ width: 20px;
+ height: 100%;
+ margin-left: 10px;
+ display: grid;
+ align-content: center;
+ }
+
+ > p.MTText {
+ margin: 0;
+ margin-left: 5px;
+ font-size: 20px;
+ }
+}
+
+#MTContents {
+ height: calc(100% - 50px);
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ align-items: stretch;
+ justify-content: flex-start;
+}
+
+#MTLeftBar {
+ width: 70px;
+ background-color: #525e6e;
+}
+
+#MTLeftBar {
+ > a > div > img {
+ margin: 20px;
+ width: 25px;
+ }
+
+ > a.nowLink > div {
+ background-color: #667487;
+ }
+}
+
+#MTMain {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
diff --git a/styles/globals.css b/styles/globals.css
deleted file mode 100644
index d4f491e..0000000
--- a/styles/globals.css
+++ /dev/null
@@ -1,107 +0,0 @@
-:root {
- --max-width: 1100px;
- --border-radius: 12px;
- --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono',
- 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro',
- 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace;
-
- --foreground-rgb: 0, 0, 0;
- --background-start-rgb: 214, 219, 220;
- --background-end-rgb: 255, 255, 255;
-
- --primary-glow: conic-gradient(
- from 180deg at 50% 50%,
- #16abff33 0deg,
- #0885ff33 55deg,
- #54d6ff33 120deg,
- #0071ff33 160deg,
- transparent 360deg
- );
- --secondary-glow: radial-gradient(
- rgba(255, 255, 255, 1),
- rgba(255, 255, 255, 0)
- );
-
- --tile-start-rgb: 239, 245, 249;
- --tile-end-rgb: 228, 232, 233;
- --tile-border: conic-gradient(
- #00000080,
- #00000040,
- #00000030,
- #00000020,
- #00000010,
- #00000010,
- #00000080
- );
-
- --callout-rgb: 238, 240, 241;
- --callout-border-rgb: 172, 175, 176;
- --card-rgb: 180, 185, 188;
- --card-border-rgb: 131, 134, 135;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --foreground-rgb: 255, 255, 255;
- --background-start-rgb: 0, 0, 0;
- --background-end-rgb: 0, 0, 0;
-
- --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
- --secondary-glow: linear-gradient(
- to bottom right,
- rgba(1, 65, 255, 0),
- rgba(1, 65, 255, 0),
- rgba(1, 65, 255, 0.3)
- );
-
- --tile-start-rgb: 2, 13, 46;
- --tile-end-rgb: 2, 5, 19;
- --tile-border: conic-gradient(
- #ffffff80,
- #ffffff40,
- #ffffff30,
- #ffffff20,
- #ffffff10,
- #ffffff10,
- #ffffff80
- );
-
- --callout-rgb: 20, 20, 20;
- --callout-border-rgb: 108, 108, 108;
- --card-rgb: 100, 100, 100;
- --card-border-rgb: 200, 200, 200;
- }
-}
-
-* {
- box-sizing: border-box;
- padding: 0;
- margin: 0;
-}
-
-html,
-body {
- max-width: 100vw;
- overflow-x: hidden;
-}
-
-body {
- color: rgb(var(--foreground-rgb));
- background: linear-gradient(
- to bottom,
- transparent,
- rgb(var(--background-end-rgb))
- )
- rgb(var(--background-start-rgb));
-}
-
-a {
- color: inherit;
- text-decoration: none;
-}
-
-@media (prefers-color-scheme: dark) {
- html {
- color-scheme: dark;
- }
-}
diff --git a/styles/globals.scss b/styles/globals.scss
new file mode 100644
index 0000000..cdb3dc7
--- /dev/null
+++ b/styles/globals.scss
@@ -0,0 +1,7 @@
+body {
+ margin: 0;
+}
+
+* {
+ font-family: MiSans;
+}
\ No newline at end of file