├── .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 <CodeBlock {...props} /> 18 | case 'table': 19 | return <Table {...props} /> 20 | case 'line': 21 | return <Line {...props} /> 22 | } 23 | } 24 | 25 | const BlockBase = (props: { indent: number; children: React.ReactNode }) => ( 26 | <div style={{ marginLeft: 1.5 * props.indent + 'em' }} className="line"> 27 | {props.children} 28 | </div> 29 | ) 30 | 31 | const Title = (props: TitleType) => ( 32 | <div className="line line-title"> 33 | <span>{props.text}</span> 34 | </div> 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 | <BlockBase indent={props.indent}> 43 | <code className="code-block"> 44 | <span className="code-block-start" title={props.fileName}> 45 | {props.fileName.includes('.') ? ( 46 | <a href={path}>{props.fileName}</a> 47 | ) : ( 48 | <>{props.fileName}</> 49 | )} 50 | </span> 51 | <div style={{ marginLeft: '1.5em' }}>{props.content}</div> 52 | </code> 53 | </BlockBase> 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 | <BlockBase indent={props.indent}> 63 | <div className="table-block"> 64 | <span className="table-block-start"> 65 | <a href={path}>{props.fileName}</a> 66 | </span> 67 | <table> 68 | {props.cells.map(rows => ( 69 | <tr> 70 | {rows.map(columns => ( 71 | <td className="cell"> 72 | {columns.map(node => ( 73 | <Node {...node} /> 74 | ))} 75 | </td> 76 | ))} 77 | </tr> 78 | ))} 79 | </table> 80 | </div> 81 | </BlockBase> 82 | ) 83 | } 84 | 85 | const Line = (props: LineType) => ( 86 | <BlockBase indent={props.indent}> 87 | {!props.nodes.length ? ( 88 | <br /> 89 | ) : ( 90 | props.nodes.map((node, i) => <Node key={i} {...node} />) 91 | )} 92 | </BlockBase> 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 <InternalLink {...props} /> 11 | case 'absolute': 12 | return <ExternalLink {...props} /> 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 | <Link href="/[project]/[page]" as={href}> 23 | <a className="page-link">{props.href}</a> 24 | </Link> 25 | ) 26 | } 27 | 28 | const ExternalLink = (props: LinkNodeType) => ( 29 | <a href={props.href} rel="noopener noreferrer" target="_blank"> 30 | {props.content || props.href} 31 | </a> 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 <Quote {...props} /> 29 | case 'helpfeel': 30 | return <Helpfeel {...props} /> 31 | case 'strongImage': 32 | return <StrongImage {...props} /> 33 | case 'strongIcon': 34 | return <StrongIcon {...props} /> 35 | case 'strong': 36 | return <Strong {...props} /> 37 | case 'formula': 38 | return <Formula {...props} /> 39 | case 'decoration': 40 | return <Decoration {...props} /> 41 | case 'code': 42 | return <Code {...props} /> 43 | case 'commandLine': 44 | return <CommandLine {...props} /> 45 | case 'blank': 46 | return <Blank {...props} /> 47 | case 'link': 48 | return <Link {...props} /> 49 | case 'image': 50 | return <Image {...props} /> 51 | case 'googleMap': 52 | return <GoogleMap {...props} /> 53 | case 'icon': 54 | return <Icon {...props} /> 55 | case 'hashTag': 56 | return <HashTag {...props} /> 57 | case 'plain': 58 | return <Plain {...props} /> 59 | } 60 | } 61 | 62 | const Quote = (props: QuoteNodeType) => ( 63 | <blockquote className="quote"> 64 | <span className="tag">{'>'}</span> 65 | {props.nodes.map(node => ( 66 | <Node {...node} /> 67 | ))} 68 | </blockquote> 69 | ) 70 | 71 | const Helpfeel = (props: HelpfeelNodeType) => ( 72 | <code className="helpfeel"> 73 | <span className="prefix">?</span>{' '} 74 | <span className="entry">{props.text}</span> 75 | </code> 76 | ) 77 | 78 | const StrongImage = (props: StrongImageNodeType) => ( 79 | <a href={props.src} rel="noopener noreferrer" target="_blank"> 80 | <img src={props.src} className="strong-image" /> 81 | </a> 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 | <NextLink href="/[project]/[page]" as={`${path}`}> 92 | <a className="link icon"> 93 | <img 94 | src={`https://scrapbox.io/api/pages${path}/icon`} 95 | alt={name} 96 | title={name} 97 | className="icon strong-icon" 98 | /> 99 | </a> 100 | </NextLink> 101 | ) 102 | } 103 | 104 | const Strong = (props: StrongNodeType) => ( 105 | <strong> 106 | {props.nodes.map(node => ( 107 | <Node {...node} /> 108 | ))} 109 | </strong> 110 | ) 111 | 112 | const Formula = (props: FormulaNodeType) => ( 113 | <span className="formula">{props.formula}</span> 114 | ) 115 | 116 | const Decoration = (props: DecorationNodeType) => ( 117 | <span className="deco"> 118 | <span className={props.decos.map(deco => `deco-${deco}`).join(' ')}> 119 | {props.nodes.map(node => ( 120 | <Node {...node} /> 121 | ))} 122 | </span> 123 | </span> 124 | ) 125 | 126 | const Code = (props: CodeNodeType) => ( 127 | <code className="code"> 128 | <span className="backquote"> </span> 129 | <span>{props.text}</span> 130 | <span className="backquote"> </span> 131 | </code> 132 | ) 133 | 134 | const CommandLine = (props: CommandLineNodeType) => ( 135 | <code className="cli"> 136 | <span className="prefix">{props.symbol}</span> 137 | <span> </span> 138 | <span className="command">{props.text}</span> 139 | </code> 140 | ) 141 | 142 | const Blank = (props: BlankNodeType) => ( 143 | <span className="blank">{props.text}</span> 144 | ) 145 | 146 | const Link = (props: LinkNodeType) => <LinkNode {...props} /> 147 | 148 | const Image = (props: ImageNodeType) => ( 149 | <a 150 | href={props.link || props.src} 151 | className={props.link ? 'link' : undefined} 152 | rel="noopener noreferrer" 153 | target="_blank" 154 | > 155 | <img src={props.src} className="image" /> 156 | </a> 157 | ) 158 | 159 | const GoogleMap = (props: GoogleMapNodeType) => ( 160 | <a 161 | href={props.url} 162 | rel="noopener noreferrer" 163 | target="_blank" 164 | className="link" 165 | > 166 | {props.place} 167 | </a> 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 | <NextLink href="/[project]/[page]" as={`${path}`}> 178 | <a className="link icon"> 179 | <img 180 | src={`https://scrapbox.io/api/pages${path}/icon`} 181 | alt={name} 182 | title={name} 183 | className="icon" 184 | /> 185 | </a> 186 | </NextLink> 187 | ) 188 | } 189 | 190 | const HashTag = (props: HashTagNodeType) => { 191 | const { project } = useRouter().query 192 | const href = `/${project}/${props.href}` 193 | 194 | return ( 195 | <NextLink href="/[project]/[page]" as={href}> 196 | <a type="hashTag" className="page-link"> 197 | #{props.href} 198 | </a> 199 | </NextLink> 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 | <div className="page"> 6 | {props.blocks.map((block, i) => ( 7 | <Block key={i} {...block} /> 8 | ))} 9 | </div> 10 | ) 11 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// <reference types="next" /> 2 | /// <reference types="next/image-types/global" /> 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<Props> = 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 | <Head> 42 | <title> 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 | <Title {...props} /> 62 | This is an empty page 63 | </> 64 | ) 65 | 66 | return ( 67 | <> 68 | <Title {...props} /> 69 | generated at <time>{new Date(props.date).toLocaleString()}</time> 70 | <Page blocks={props.content} /> 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 | <Head> 9 | <meta name="robots" content="noindex, nofollow" /> 10 | </Head> 11 | <Component {...pageProps} /> 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 | --------------------------------------------------------------------------------