├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── assets
└── app.css
├── components
├── Block.tsx
├── LinkNode.tsx
├── Node.tsx
└── Page.tsx
├── next-env.d.ts
├── package.json
├── pages
├── [project]
│ └── [page].tsx
└── _app.tsx
├── tsconfig.json
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | # local env files
28 | .env.local
29 | .env.development.local
30 | .env.test.local
31 | .env.production.local
32 |
33 | # vercel
34 | .vercel
35 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "trailingComma": "all",
3 | "tabWidth": 2,
4 | "semi": false,
5 | "singleQuote": true,
6 | "arrowParens": "avoid"
7 | }
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 yuta0801
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # scrapbox-reader
2 | Scrapbox viewer for readers
3 |
--------------------------------------------------------------------------------
/assets/app.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css?family=Roboto:400,400i,500,500i,700,700i');
2 |
3 | .page {
4 | font-size: 15px;
5 | line-height: 28px;
6 | font-family: 'Roboto', Helvetica, Arial, 'Hiragino Sans', sans-serif;
7 | background-color: #fefefe;
8 | }
9 |
10 | .line {
11 | white-space: pre-wrap;
12 | word-wrap: break-word;
13 | }
14 |
15 | .line img.icon {
16 | height: 1.3em;
17 | vertical-align: top;
18 | }
19 |
20 | .line img.strong-icon {
21 | height: 3.9em;
22 | vertical-align: bottom;
23 | }
24 |
25 | .deco .deco-\*-1 {
26 | font-weight: bold;
27 | }
28 |
29 | .deco .deco-\*-2 {
30 | font-weight: bold;
31 | font-size: 1.2em;
32 | line-height: 28px;
33 | }
34 |
35 | .deco .deco-\*-3 {
36 | font-weight: bold;
37 | font-size: 1.44em;
38 | line-height: 35px;
39 | }
40 |
41 | .deco .deco-\*-4 {
42 | font-weight: bold;
43 | font-size: 1.73em;
44 | line-height: 42px;
45 | }
46 |
47 | .deco .deco-\*-5 {
48 | font-weight: bold;
49 | font-size: 2.07em;
50 | line-height: 49px;
51 | }
52 |
53 | .deco .deco-\*-6 {
54 | font-weight: bold;
55 | font-size: 2.49em;
56 | line-height: 56px;
57 | }
58 |
59 | .deco .deco-\*-7 {
60 | font-weight: bold;
61 | font-size: 3em;
62 | line-height: 63px;
63 | }
64 |
65 | .deco .deco-\*-8 {
66 | font-weight: bold;
67 | font-size: 3.58em;
68 | line-height: 77px;
69 | }
70 |
71 | .deco .deco-\*-9 {
72 | font-weight: bold;
73 | font-size: 4.3em;
74 | line-height: 91px;
75 | }
76 |
77 | .deco .deco-\*-10 {
78 | font-weight: bold;
79 | font-size: 5.16em;
80 | line-height: 105px;
81 | }
82 |
83 | .deco .deco-\/ {
84 | font-style: italic;
85 | }
86 |
87 | .deco .deco-- {
88 | text-decoration: line-through;
89 | }
90 |
91 | .deco .deco-_ {
92 | text-decoration: underline;
93 | }
94 |
95 | .line .quote {
96 | margin: 0;
97 | font-style: italic;
98 | background-color: rgba(128, 128, 128, 0.1);
99 | display: block;
100 | border-left: solid 4px #a0a0a0;
101 | padding-left: 4px;
102 | }
103 |
104 | .line .quote > .tag {
105 | visibility: hidden;
106 | }
107 |
108 | code {
109 | font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
110 | }
111 |
112 | .line code {
113 | padding: 0;
114 | font-size: 90%;
115 | color: #342d9c;
116 | background-color: rgba(0, 0, 0, 0.04);
117 | white-space: pre-wrap;
118 | word-wrap: break-word;
119 | border-radius: 4px;
120 | }
121 |
122 | .line .code-block {
123 | display: block;
124 | line-height: 2em;
125 | background-color: rgba(0, 0, 0, 0.04);
126 | }
127 |
128 | .line .code-block .code-block-start {
129 | font-size: 0.9em;
130 | background-color: #ffcfc6;
131 | padding: 1px 2px;
132 | }
133 |
134 | .line code.helpfeel {
135 | background-color: #fbebdd;
136 | padding: 3px !important;
137 | }
138 |
139 | .line code.helpfeel .prefix {
140 | color: #f17c00;
141 | }
142 |
143 | .line code.helpfeel .entry {
144 | color: #cc5020;
145 | }
146 |
147 | .line a.link .image {
148 | padding-bottom: 3px;
149 | border-style: none none solid;
150 | border-width: 1.5px;
151 | border-color: #8fadf9;
152 | }
153 |
154 | .table-block table {
155 | border-collapse: collapse;
156 | }
157 |
158 | .table-block .table-block-start {
159 | padding: 1px 2px;
160 | font-size: 0.9em;
161 | background-color: #ffcfc6;
162 | }
163 |
164 | .table-block .cell:nth-child(odd) {
165 | background-color: rgba(0, 0, 0, 0.04);
166 | }
167 |
168 | .table-block .cell {
169 | margin: 0;
170 | padding: 0 8px;
171 | box-sizing: content-box;
172 | white-space: pre;
173 | }
174 |
175 | .table-block .cell:nth-child(even) {
176 | background-color: rgba(0, 0, 0, 0.06);
177 | }
178 |
179 | .table-block .cell:nth-child(odd) {
180 | background-color: rgba(0, 0, 0, 0.04);
181 | }
182 |
183 | .line .formula {
184 | margin: auto 6px;
185 | }
186 |
187 | a {
188 | color: #5e8af7;
189 | }
190 |
191 | a:active,
192 | a:hover,
193 | a:focus {
194 | color: #1555f3;
195 | }
196 |
197 | .line a.page-link {
198 | text-decoration: none;
199 | }
200 |
201 | .line.line-title {
202 | font-size: 1.73em;
203 | line-height: 42px;
204 | color: #000;
205 | padding-bottom: 21px;
206 | }
207 |
208 | .line code.cli .prefix {
209 | color: #9c6248;
210 | }
211 |
212 | .table-block .table-block-start a {
213 | color: #342d9c;
214 | text-decoration: underline;
215 | }
216 |
217 | .line span.code-block .code-block-start a {
218 | color: #342d9c;
219 | text-decoration: underline;
220 | }
221 |
--------------------------------------------------------------------------------
/components/Block.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import {
3 | Block as BlockType,
4 | Title as TitleType,
5 | CodeBlock as CodeBlockType,
6 | Table as TableType,
7 | Line as LineType,
8 | } from '@progfay/scrapbox-parser'
9 | import { useRouter } from 'next/router'
10 | import { Node } from './Node'
11 |
12 | export const Block = (props: BlockType) => {
13 | switch (props.type) {
14 | case 'title':
15 | return
16 | case 'codeBlock':
17 | return
18 | case 'table':
19 | return
20 | case 'line':
21 | return
22 | }
23 | }
24 |
25 | const BlockBase = (props: { indent: number; children: React.ReactNode }) => (
26 |
27 | {props.children}
28 |
29 | )
30 |
31 | const Title = (props: TitleType) => (
32 |
33 | {props.text}
34 |
35 | )
36 |
37 | const CodeBlock = (props: CodeBlockType) => {
38 | const { project, page } = useRouter().query
39 | const path = `https://scrapbox.io/api/code/${project}/${page}/${props.fileName}`
40 |
41 | return (
42 |
43 |
44 |
45 | {props.fileName.includes('.') ? (
46 | {props.fileName}
47 | ) : (
48 | <>{props.fileName}>
49 | )}
50 |
51 | {props.content}
52 |
53 |
54 | )
55 | }
56 |
57 | const Table = (props: TableType) => {
58 | const { project, page } = useRouter().query
59 | const path = `https://scrapbox.io/api/table/${project}/${page}/${props.fileName}.csv`
60 |
61 | return (
62 |
63 |
64 |
65 | {props.fileName}
66 |
67 |
68 | {props.cells.map(rows => (
69 |
70 | {rows.map(columns => (
71 |
72 | {columns.map(node => (
73 |
74 | ))}
75 | |
76 | ))}
77 |
78 | ))}
79 |
80 |
81 |
82 | )
83 | }
84 |
85 | const Line = (props: LineType) => (
86 |
87 | {!props.nodes.length ? (
88 |
89 | ) : (
90 | props.nodes.map((node, i) => )
91 | )}
92 |
93 | )
94 |
--------------------------------------------------------------------------------
/components/LinkNode.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import type { LinkNode as LinkNodeType } from '@progfay/scrapbox-parser'
3 | import { useRouter } from 'next/router'
4 | import Link from 'next/link'
5 |
6 | export const LinkNode = (props: LinkNodeType) => {
7 | switch (props.pathType) {
8 | case 'root':
9 | case 'relative':
10 | return
11 | case 'absolute':
12 | return
13 | }
14 | }
15 |
16 | const InternalLink = (props: LinkNodeType) => {
17 | const { project } = useRouter().query
18 | const href =
19 | props.pathType === 'relative' ? `/${project}/${props.href}` : props.href
20 |
21 | return (
22 |
23 | {props.href}
24 |
25 | )
26 | }
27 |
28 | const ExternalLink = (props: LinkNodeType) => (
29 |
30 | {props.content || props.href}
31 |
32 | )
33 |
--------------------------------------------------------------------------------
/components/Node.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import type {
3 | Node as NodeType,
4 | QuoteNode as QuoteNodeType,
5 | HelpfeelNode as HelpfeelNodeType,
6 | StrongImageNode as StrongImageNodeType,
7 | StrongIconNode as StrongIconNodeType,
8 | StrongNode as StrongNodeType,
9 | FormulaNode as FormulaNodeType,
10 | DecorationNode as DecorationNodeType,
11 | CodeNode as CodeNodeType,
12 | CommandLineNode as CommandLineNodeType,
13 | BlankNode as BlankNodeType,
14 | ImageNode as ImageNodeType,
15 | LinkNode as LinkNodeType,
16 | GoogleMapNode as GoogleMapNodeType,
17 | IconNode as IconNodeType,
18 | HashTagNode as HashTagNodeType,
19 | PlainNode as PlainNodeType,
20 | } from '@progfay/scrapbox-parser'
21 | import { LinkNode } from './LinkNode'
22 | import { useRouter } from 'next/router'
23 | import NextLink from 'next/link'
24 |
25 | export const Node = (props: NodeType) => {
26 | switch (props.type) {
27 | case 'quote':
28 | return
29 | case 'helpfeel':
30 | return
31 | case 'strongImage':
32 | return
33 | case 'strongIcon':
34 | return
35 | case 'strong':
36 | return
37 | case 'formula':
38 | return
39 | case 'decoration':
40 | return
41 | case 'code':
42 | return
43 | case 'commandLine':
44 | return
45 | case 'blank':
46 | return
47 | case 'link':
48 | return
49 | case 'image':
50 | return
51 | case 'googleMap':
52 | return
53 | case 'icon':
54 | return
55 | case 'hashTag':
56 | return
57 | case 'plain':
58 | return
59 | }
60 | }
61 |
62 | const Quote = (props: QuoteNodeType) => (
63 |
64 | {'>'}
65 | {props.nodes.map(node => (
66 |
67 | ))}
68 |
69 | )
70 |
71 | const Helpfeel = (props: HelpfeelNodeType) => (
72 |
73 | ?{' '}
74 | {props.text}
75 |
76 | )
77 |
78 | const StrongImage = (props: StrongImageNodeType) => (
79 |
80 |
81 |
82 | )
83 |
84 | const StrongIcon = (props: StrongIconNodeType) => {
85 | const { project } = useRouter().query
86 | const path =
87 | props.pathType === 'relative' ? `/${project}/${props.path}` : props.path
88 | const name = path.split('/')[2]
89 |
90 | return (
91 |
92 |
93 |
99 |
100 |
101 | )
102 | }
103 |
104 | const Strong = (props: StrongNodeType) => (
105 |
106 | {props.nodes.map(node => (
107 |
108 | ))}
109 |
110 | )
111 |
112 | const Formula = (props: FormulaNodeType) => (
113 | {props.formula}
114 | )
115 |
116 | const Decoration = (props: DecorationNodeType) => (
117 |
118 | `deco-${deco}`).join(' ')}>
119 | {props.nodes.map(node => (
120 |
121 | ))}
122 |
123 |
124 | )
125 |
126 | const Code = (props: CodeNodeType) => (
127 |
128 |
129 | {props.text}
130 |
131 |
132 | )
133 |
134 | const CommandLine = (props: CommandLineNodeType) => (
135 |
136 | {props.symbol}
137 |
138 | {props.text}
139 |
140 | )
141 |
142 | const Blank = (props: BlankNodeType) => (
143 | {props.text}
144 | )
145 |
146 | const Link = (props: LinkNodeType) =>
147 |
148 | const Image = (props: ImageNodeType) => (
149 |
155 |
156 |
157 | )
158 |
159 | const GoogleMap = (props: GoogleMapNodeType) => (
160 |
166 | {props.place}
167 |
168 | )
169 |
170 | const Icon = (props: IconNodeType) => {
171 | const { project } = useRouter().query
172 | const path =
173 | props.pathType === 'relative' ? `/${project}/${props.path}` : props.path
174 | const name = path.split('/')[2]
175 |
176 | return (
177 |
178 |
179 |
185 |
186 |
187 | )
188 | }
189 |
190 | const HashTag = (props: HashTagNodeType) => {
191 | const { project } = useRouter().query
192 | const href = `/${project}/${props.href}`
193 |
194 | return (
195 |
196 |
197 | #{props.href}
198 |
199 |
200 | )
201 | }
202 |
203 | const Plain = (props: PlainNodeType) => <>{props.text}>
204 |
--------------------------------------------------------------------------------
/components/Page.tsx:
--------------------------------------------------------------------------------
1 | import { Page as PageType } from '@progfay/scrapbox-parser'
2 | import { Block } from './Block'
3 |
4 | export const Page = (props: { blocks: PageType }) => (
5 |
6 | {props.blocks.map((block, i) => (
7 |
8 | ))}
9 |
10 | )
11 |
--------------------------------------------------------------------------------
/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
4 | // NOTE: This file should not be edited
5 | // see https://nextjs.org/docs/basic-features/typescript for more information.
6 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "scripts": {
4 | "dev": "next dev",
5 | "build": "next build",
6 | "start": "next start"
7 | },
8 | "dependencies": {
9 | "@progfay/scrapbox-parser": "^7.2.0",
10 | "next": "12.1.0",
11 | "react": "17.0.2",
12 | "react-dom": "17.0.2"
13 | },
14 | "devDependencies": {
15 | "@types/node": "^17.0.21",
16 | "@types/react": "^17.0.41",
17 | "prettier": "^2.6.0",
18 | "typescript": "^4.3.2"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/pages/[project]/[page].tsx:
--------------------------------------------------------------------------------
1 | import { GetStaticProps, GetStaticPaths } from 'next'
2 | import Head from 'next/head'
3 | import { parse, Page as PageType } from '@progfay/scrapbox-parser'
4 | import { Page } from '../../components/Page'
5 |
6 | type Props = {
7 | date: number
8 | content: PageType
9 | exists: boolean
10 | project: string
11 | page: string
12 | }
13 |
14 | export const getStaticProps: GetStaticProps = async ctx => {
15 | const project = encodeURIComponent(ctx.params!.project as string)
16 | const page = encodeURIComponent(ctx.params!.page as string)
17 | const url = `https://scrapbox.io/api/pages/${project}/${page}/text`
18 | const response = await fetch(url)
19 | const content: string = await response.text()
20 |
21 | return {
22 | props: {
23 | date: Date.now(),
24 | content: parse(content),
25 | exists: response.ok,
26 | project: ctx.params!.project as string,
27 | page: ctx.params!.page as string,
28 | },
29 | revalidate: 30,
30 | }
31 | }
32 |
33 | export const getStaticPaths: GetStaticPaths = async () => {
34 | return {
35 | paths: [],
36 | fallback: true,
37 | }
38 | }
39 |
40 | const Title = (props: Props) => (
41 |
42 |
43 | {!props.project || !props.page
44 | ? 'Loading... - Scrapbox Reader'
45 | : `/${props.project}/${props.page} - Scrapbox Reader`}
46 |
47 |
48 | )
49 |
50 | const View = (props: Props) => {
51 | if (!props.content)
52 | return (
53 | <>
54 |
55 | loading...
56 | >
57 | )
58 | if (!props.exists)
59 | return (
60 | <>
61 |
62 | This is an empty page
63 | >
64 | )
65 |
66 | return (
67 | <>
68 |
69 | generated at
70 |
71 | >
72 | )
73 | }
74 |
75 | export default View
76 |
--------------------------------------------------------------------------------
/pages/_app.tsx:
--------------------------------------------------------------------------------
1 | import { AppProps } from 'next/app'
2 | import Head from 'next/head'
3 |
4 | import '../assets/app.css'
5 |
6 | const App = ({ Component, pageProps }: AppProps) => (
7 | <>
8 |
9 |
10 |
11 |
12 | >
13 | )
14 |
15 | export default App
16 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": [
5 | "dom",
6 | "dom.iterable",
7 | "esnext"
8 | ],
9 | "allowJs": true,
10 | "skipLibCheck": true,
11 | "strict": true,
12 | "forceConsistentCasingInFileNames": true,
13 | "noEmit": true,
14 | "esModuleInterop": true,
15 | "module": "esnext",
16 | "moduleResolution": "node",
17 | "resolveJsonModule": true,
18 | "isolatedModules": true,
19 | "jsx": "preserve",
20 | "incremental": true
21 | },
22 | "include": [
23 | "next-env.d.ts",
24 | "**/*.ts",
25 | "**/*.tsx"
26 | ],
27 | "exclude": [
28 | "node_modules"
29 | ]
30 | }
31 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@next/env@12.1.0":
6 | version "12.1.0"
7 | resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.0.tgz#73713399399b34aa5a01771fb73272b55b22c314"
8 | integrity sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==
9 |
10 | "@next/swc-android-arm64@12.1.0":
11 | version "12.1.0"
12 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz#865ba3a9afc204ff2bdeea49dd64d58705007a39"
13 | integrity sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==
14 |
15 | "@next/swc-darwin-arm64@12.1.0":
16 | version "12.1.0"
17 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz#08e8b411b8accd095009ed12efbc2f1d4d547135"
18 | integrity sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==
19 |
20 | "@next/swc-darwin-x64@12.1.0":
21 | version "12.1.0"
22 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz#fcd684497a76e8feaca88db3c394480ff0b007cd"
23 | integrity sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==
24 |
25 | "@next/swc-linux-arm-gnueabihf@12.1.0":
26 | version "12.1.0"
27 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz#9ec6380a27938a5799aaa6035c205b3c478468a7"
28 | integrity sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==
29 |
30 | "@next/swc-linux-arm64-gnu@12.1.0":
31 | version "12.1.0"
32 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz#7f4196dff1049cea479607c75b81033ae2dbd093"
33 | integrity sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==
34 |
35 | "@next/swc-linux-arm64-musl@12.1.0":
36 | version "12.1.0"
37 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz#b445f767569cdc2dddee785ca495e1a88c025566"
38 | integrity sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==
39 |
40 | "@next/swc-linux-x64-gnu@12.1.0":
41 | version "12.1.0"
42 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz#67610e9be4fbc987de7535f1bcb17e45fe12f90e"
43 | integrity sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==
44 |
45 | "@next/swc-linux-x64-musl@12.1.0":
46 | version "12.1.0"
47 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz#ea19a23db08a9f2e34ac30401f774cf7d1669d31"
48 | integrity sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==
49 |
50 | "@next/swc-win32-arm64-msvc@12.1.0":
51 | version "12.1.0"
52 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz#eadf054fc412085659b98e145435bbba200b5283"
53 | integrity sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==
54 |
55 | "@next/swc-win32-ia32-msvc@12.1.0":
56 | version "12.1.0"
57 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz#68faeae10c89f698bf9d28759172b74c9c21bda1"
58 | integrity sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==
59 |
60 | "@next/swc-win32-x64-msvc@12.1.0":
61 | version "12.1.0"
62 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz#d27e7e76c87a460a4da99c5bfdb1618dcd6cd064"
63 | integrity sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==
64 |
65 | "@progfay/scrapbox-parser@^7.2.0":
66 | version "7.2.0"
67 | resolved "https://registry.yarnpkg.com/@progfay/scrapbox-parser/-/scrapbox-parser-7.2.0.tgz#dc2563b2d01f4f17e48013eeee96b74eff36c72c"
68 | integrity sha512-8b6jReJhSHVyoAkpzu4mO0hDN1qMl5j6NXhDxTd7C6AFeVjawVxudwCAM/2x0QQkI8K/L+wnaAv1w2fy0BiKSw==
69 |
70 | "@types/node@^17.0.21":
71 | version "17.0.21"
72 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
73 | integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
74 |
75 | "@types/prop-types@*":
76 | version "15.7.4"
77 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
78 | integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
79 |
80 | "@types/react@^17.0.41":
81 | version "17.0.41"
82 | resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.41.tgz#6e179590d276394de1e357b3f89d05d7d3da8b85"
83 | integrity sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==
84 | dependencies:
85 | "@types/prop-types" "*"
86 | "@types/scheduler" "*"
87 | csstype "^3.0.2"
88 |
89 | "@types/scheduler@*":
90 | version "0.16.2"
91 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
92 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
93 |
94 | caniuse-lite@^1.0.30001283:
95 | version "1.0.30001319"
96 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz#eb4da4eb3ecdd409f7ba1907820061d56096e88f"
97 | integrity sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==
98 |
99 | csstype@^3.0.2:
100 | version "3.0.11"
101 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33"
102 | integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==
103 |
104 | "js-tokens@^3.0.0 || ^4.0.0":
105 | version "4.0.0"
106 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
107 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
108 |
109 | loose-envify@^1.1.0:
110 | version "1.4.0"
111 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
112 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
113 | dependencies:
114 | js-tokens "^3.0.0 || ^4.0.0"
115 |
116 | nanoid@^3.1.30:
117 | version "3.3.1"
118 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35"
119 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==
120 |
121 | next@12.1.0:
122 | version "12.1.0"
123 | resolved "https://registry.yarnpkg.com/next/-/next-12.1.0.tgz#c33d753b644be92fc58e06e5a214f143da61dd5d"
124 | integrity sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==
125 | dependencies:
126 | "@next/env" "12.1.0"
127 | caniuse-lite "^1.0.30001283"
128 | postcss "8.4.5"
129 | styled-jsx "5.0.0"
130 | use-subscription "1.5.1"
131 | optionalDependencies:
132 | "@next/swc-android-arm64" "12.1.0"
133 | "@next/swc-darwin-arm64" "12.1.0"
134 | "@next/swc-darwin-x64" "12.1.0"
135 | "@next/swc-linux-arm-gnueabihf" "12.1.0"
136 | "@next/swc-linux-arm64-gnu" "12.1.0"
137 | "@next/swc-linux-arm64-musl" "12.1.0"
138 | "@next/swc-linux-x64-gnu" "12.1.0"
139 | "@next/swc-linux-x64-musl" "12.1.0"
140 | "@next/swc-win32-arm64-msvc" "12.1.0"
141 | "@next/swc-win32-ia32-msvc" "12.1.0"
142 | "@next/swc-win32-x64-msvc" "12.1.0"
143 |
144 | object-assign@^4.1.1:
145 | version "4.1.1"
146 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
147 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
148 |
149 | picocolors@^1.0.0:
150 | version "1.0.0"
151 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
152 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
153 |
154 | postcss@8.4.5:
155 | version "8.4.5"
156 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95"
157 | integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==
158 | dependencies:
159 | nanoid "^3.1.30"
160 | picocolors "^1.0.0"
161 | source-map-js "^1.0.1"
162 |
163 | prettier@^2.6.0:
164 | version "2.6.0"
165 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4"
166 | integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==
167 |
168 | react-dom@17.0.2:
169 | version "17.0.2"
170 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
171 | integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
172 | dependencies:
173 | loose-envify "^1.1.0"
174 | object-assign "^4.1.1"
175 | scheduler "^0.20.2"
176 |
177 | react@17.0.2:
178 | version "17.0.2"
179 | resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
180 | integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
181 | dependencies:
182 | loose-envify "^1.1.0"
183 | object-assign "^4.1.1"
184 |
185 | scheduler@^0.20.2:
186 | version "0.20.2"
187 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
188 | integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
189 | dependencies:
190 | loose-envify "^1.1.0"
191 | object-assign "^4.1.1"
192 |
193 | source-map-js@^1.0.1:
194 | version "1.0.2"
195 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
196 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
197 |
198 | styled-jsx@5.0.0:
199 | version "5.0.0"
200 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.0.tgz#816b4b92e07b1786c6b7111821750e0ba4d26e77"
201 | integrity sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==
202 |
203 | typescript@^4.3.2:
204 | version "4.6.2"
205 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4"
206 | integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==
207 |
208 | use-subscription@1.5.1:
209 | version "1.5.1"
210 | resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1"
211 | integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==
212 | dependencies:
213 | object-assign "^4.1.1"
214 |
--------------------------------------------------------------------------------