diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ae6bc2357597520c621776eecbe32807fd1de36b..467fbb2342bdb40b599b4f46e8bb02f6df8836c5 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,13 +1,14 @@ module.exports = { root: true, - plugins: ['prettier'], + plugins: ['prettier', '@emotion'], extends: ['airbnb-base', 'prettier'], env: { node: true, es6: true, }, - parser: 'babel-eslint', + parser: '@babel/eslint-parser', rules: { + '@emotion/jsx-import': 'error', 'prettier/prettier': [ 'error', { diff --git a/package.json b/package.json index d3942efd6cafb3010b21798cba1149ebc2fb126d..9bf4f38113c128eb569858df3b7b8f2c56448b86 100644 --- a/package.json +++ b/package.json @@ -35,13 +35,14 @@ "devDependencies": { "@babel/cli": "^7.20.7", "@babel/core": "^7.20.7", + "@babel/eslint-parser": "^7.19.1", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", + "@emotion/eslint-plugin": "^11.10.0", "@types/node": "^18.11.18", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", - "babel-eslint": "^10.1.0", "babel-plugin-auto-import": "^1.1.0", "eslint": "^8.31.0", "eslint-config-airbnb-base": "^15.0.0", diff --git a/sitegin/index.js b/sitegin/index.js index 11f1d0e125fb514de4048cf45a499a7df8979f86..9168b38219b53b612c827f49214a90120593f2d0 100755 --- a/sitegin/index.js +++ b/sitegin/index.js @@ -6,10 +6,11 @@ import fs from 'fs' import { promisify } from 'util' import fsextra from 'node-fs-extra' import chokidar from 'chokidar' +import { fileURLToPath } from 'node:url' +import { createRequire } from 'module' + import config from './config.js' import pipeline from './sitegin.js' -import { createRequire } from 'module' -import { fileURLToPath } from 'node:url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) @@ -120,9 +121,7 @@ function copyStaticFiles(builddir) { fsextra.copy( path.join(__dirname, '..', 'static'), builddir, - (file) => { - return !(file.match('\\.git') || file.match('static/articles')) - }, + (file) => !(file.match('\\.git') || file.match('static/articles')), () => { console.log('copy static done') }, @@ -130,9 +129,7 @@ function copyStaticFiles(builddir) { fsextra.copy( path.join(__dirname, '..', 'content', 'articles'), `${builddir}/clanek`, - (file) => { - return !file.endsWith('.md') - }, + (file) => !file.endsWith('.md'), () => { console.log('copy content/articles done') }, diff --git a/theme-source/components/chip.tsx b/theme-source/components/chip.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5a0c9be6a6da3c295ba1f9c961d1027fafb62111 --- /dev/null +++ b/theme-source/components/chip.tsx @@ -0,0 +1,24 @@ +/** @jsx jsx */ +import { css, jsx } from '@emotion/react' + +export function Chip(tag: { url: string; text: string }) { + return ( + <a href={`/${tag.url}/1/`}> + <div + css={css` + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, 0.6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: #e4e4e4; + `} + > + {tag.text} + </div> + </a> + ) +} diff --git a/theme-source/partials/base-body.tsx b/theme-source/partials/base-body.tsx index 7b12a000a35ec2a114deb36382ed477ad0eae1ba..f9d7fae9ffd37c90e79f2d8b3ce2debf5c763656 100644 --- a/theme-source/partials/base-body.tsx +++ b/theme-source/partials/base-body.tsx @@ -1,5 +1,6 @@ +/** @jsx jsx */ import React, { PropsWithChildren } from 'react' -import { css } from '@emotion/react' +import { css, jsx } from '@emotion/react' import { SymbolSearch, SymbolMenu, SymbolFacebook } from './svgs.js' function hideOnAndUp(px: number) { diff --git a/theme-source/partials/list.tsx b/theme-source/partials/list.tsx index f40743cd816d291d2702772caffe47f16bedada7..13b3a85bebc839341f852347d691e4c1b873d374 100644 --- a/theme-source/partials/list.tsx +++ b/theme-source/partials/list.tsx @@ -1,10 +1,10 @@ /* @jsx jsx */ import React from 'react' -import moment from 'moment' import { jsx, css } from '@emotion/react' import { Paginator } from './paginator.js' import { SymbolBackward, SymbolForward } from './svgs.js' import { dateFilter, truncate, striptags } from '../utils.js' +import { Chip } from '../components/chip.js' function relURL(filename, dir_) { let dir = dir_ @@ -28,15 +28,12 @@ export function List({ subtags, tag, content, metadata, file, config }) { <div className="row"> <div className="col"> <a className="breadcrumb">{tag.text}</a> - {subtags && - subtags.map((subtag) => ( - <React.Fragment key={subtag.url}> - {' '} - <a href={`/${subtag.url}`} className="chip"> - {subtag.text} - </a> - </React.Fragment> - ))} + {subtags?.map((subtag) => ( + <React.Fragment key={subtag.url}> + {' '} + <Chip {...subtag} /> + </React.Fragment> + )) ?? null} </div> </div> <div @@ -174,12 +171,14 @@ function Card({ file, image, title, text, caption }) { > <a href={`/${file}`}> <div - css={{ - height: 120, - backgroundColor: '#0288d1', + style={{ backgroundImage: image ? `url('${relURL(image, file)}')` : undefined, + }} + css={{ + height: 120, + backgroundColor: '#0288d1', backgroundSize: 'cover', backgroundRepeat: 'no-repeat', backgroundPosition: '50% 50%', diff --git a/theme-source/sass/materialize.scss b/theme-source/sass/materialize.scss index 3cd190a62fe982747f651ba6671821fdfb2432c4..76b6e27f42582de9379a10a89eed6895f2fd997f 100644 --- a/theme-source/sass/materialize.scss +++ b/theme-source/sass/materialize.scss @@ -17,23 +17,23 @@ @import "components/navbar"; //@import "components/roboto"; @import "components/typography"; -@import "components/cards"; -@import "components/toast"; -@import "components/tabs"; -@import "components/tooltip"; -@import "components/buttons"; -@import "components/dropdown"; -@import "components/waves"; -@import "components/modal"; -@import "components/collapsible"; -@import "components/chips"; -@import "components/materialbox"; -@import "components/form"; -@import "components/table_of_contents"; +//@import "components/cards"; +//@import "components/toast"; +//@import "components/tabs"; +//@import "components/tooltip"; +//@import "components/buttons"; +//@import "components/dropdown"; +//@import "components/waves"; +//@import "components/modal"; +//@import "components/collapsible"; +//@import "components/chips"; +//@import "components/materialbox"; +//@import "components/form"; +//@import "components/table_of_contents"; @import "components/sideNav"; -@import "components/preloader"; -@import "components/slider"; -@import "components/carousel"; -@import "components/date_picker/default.scss"; -@import "components/date_picker/default.date.scss"; -@import "components/date_picker/default.time.scss"; +//@import "components/preloader"; +//@import "components/slider"; +//@import "components/carousel"; +//@import "components/date_picker/default.scss"; +//@import "components/date_picker/default.date.scss"; +//@import "components/date_picker/default.time.scss"; diff --git a/theme-source/templates/article.tsx b/theme-source/templates/article.tsx index f5f970fc1fd97be077a0c863317c40758d31aee2..63f9af816b8300fcd0a6bb27c0789111ed27bc5b 100644 --- a/theme-source/templates/article.tsx +++ b/theme-source/templates/article.tsx @@ -1,10 +1,9 @@ -// @ts-check - import React from 'react' import url from 'url' import { BaseBody } from '../partials/base-body.js' import { dateFilter, truncate, striptags } from '../utils.js' import { renderToString } from '../render-to-string.js' +import { Chip } from '../components/chip.js' export default { ext: 'html', @@ -125,9 +124,7 @@ function Article({ metadata, content, config, originalFile }) { {metadata.tags.map((tag) => tag.url === 'tag/vse' ? null : ( <React.Fragment key={tag.url}> - <a href={`/${tag.url}/1/`}> - <div className="chip">{tag.text}</div> - </a>{' '} + <Chip {...tag} />{' '} </React.Fragment> ), )} diff --git a/theme-source/templates/tag.tsx b/theme-source/templates/tag.tsx index 50611682a746ce746bb16e51ce2778e66f4905d7..d180a3ada8ba83b15eb98a27c92171b05101cc84 100644 --- a/theme-source/templates/tag.tsx +++ b/theme-source/templates/tag.tsx @@ -483,18 +483,6 @@ function TagGlobalStyles() { background-color: #fff; } - .chip { - display: inline-block; - height: 32px; - font-size: 13px; - font-weight: 500; - color: rgba(0, 0, 0, 0.6); - line-height: 32px; - padding: 0 12px; - border-radius: 16px; - background-color: #e4e4e4; - } - .hiddendiv { display: none; white-space: pre-wrap; diff --git a/yarn.lock b/yarn.lock index 208bb37b852b4049dd14d167f645fee330bac618..ee8c84ef59a46a61e40ccd3736bb36bd6eff94fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -88,6 +88,15 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/eslint-parser@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + "@babel/generator@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" @@ -444,7 +453,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.7.0": +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1": version "7.11.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== @@ -1172,7 +1181,7 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.7.0": +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== @@ -1203,7 +1212,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.4.4": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== @@ -1250,6 +1259,11 @@ "@emotion/weak-memoize" "^0.3.0" stylis "4.1.3" +"@emotion/eslint-plugin@^11.10.0": + version "11.10.0" + resolved "https://registry.yarnpkg.com/@emotion/eslint-plugin/-/eslint-plugin-11.10.0.tgz#e0d8544c8a568bb2dac605b87346baaa3b846e80" + integrity sha512-nWpuoQQrzI9aM9fgn+Pbb0pOau4BhheXyVqHcOYKFq46uSuSR2ivZaDwwCJKI6ScA8Pm7OcoOpwdRH2iisf9cg== + "@emotion/hash@^0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" @@ -1694,6 +1708,13 @@ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2106,18 +2127,6 @@ axios@0.21.4: dependencies: follow-redirects "^1.14.0" -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - babel-plugin-auto-import@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-auto-import/-/babel-plugin-auto-import-1.1.0.tgz#996a78ded5fed475657bed17f2a223bafdd87822" @@ -3021,6 +3030,14 @@ eslint-plugin-prettier@^4.2.1: dependencies: prettier-linter-helpers "^1.0.0" +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-scope@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" @@ -3036,12 +3053,7 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== @@ -3134,6 +3146,11 @@ estraverse@^1.9.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" @@ -5447,7 +5464,7 @@ resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.3.2: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==