├── .gitignore ├── next-env.d.ts ├── next.config.js ├── package.json ├── pages ├── _document.tsx └── index.tsx ├── pnpm-lock.yaml ├── public ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico └── site.webmanifest ├── readme.md ├── screenshot.gif └── tsconfig.json /.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 | .env* 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | async rewrites() { 3 | return [ 4 | { 5 | source: '/goat', 6 | destination: 'https://time.goatcounter.com/count', 7 | locale: false, 8 | }, 9 | { 10 | source: '/count.js', 11 | destination: 'https://gc.zgo.at/count.js', 12 | locale: false, 13 | }, 14 | ] 15 | }, 16 | eslint: { 17 | ignoreDuringBuilds: true, 18 | }, 19 | } 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "time", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev -p 1234", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "is-hexcolor": "^1.0.0", 12 | "next": "^14.1.1", 13 | "nice-color-palettes": "^3.0.0", 14 | "react": "^18.2.0", 15 | "react-dom": "^18.2.0" 16 | }, 17 | "devDependencies": { 18 | "@types/node": "^13.1.6", 19 | "@types/react": "^16.9.17", 20 | "husky": "*", 21 | "prettier": "*", 22 | "pretty-quick": "*", 23 | "typescript": "^4.3.5" 24 | }, 25 | "husky": { 26 | "hooks": { 27 | "pre-commit": "pretty-quick --staged" 28 | } 29 | }, 30 | "prettier": { 31 | "semi": false, 32 | "singleQuote": true, 33 | "tabWidth": 2 34 | }, 35 | "engines": { 36 | "node": "18" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import Document, { Main, NextScript, Html, Head } from 'next/document' 2 | 3 | export default class MyDocument extends Document { 4 | render() { 5 | return ( 6 | 7 | 8 | 9 | 14 | 20 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | ) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /pages/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import isHexColor from 'is-hexcolor' 3 | import palettes from 'nice-color-palettes' 4 | 5 | function whatTimeIsIt(props: IProps) { 6 | const now = new Date() 7 | 8 | let hours = now.getHours() 9 | let minutes = now.getMinutes() 10 | let seconds = now.getSeconds() 11 | 12 | if (props.format === 12) { 13 | hours = hours % 12 || 12 14 | } 15 | 16 | let time: any = { 17 | hours: hours.toString().padStart(props.pad ? 2 : 1, '0'), 18 | minutes: minutes.toString().padStart(2, '0'), 19 | seconds: seconds.toString().padStart(2, '0'), 20 | } 21 | 22 | return time 23 | } 24 | 25 | type Position = 26 | | 'top-left' 27 | | 'top' 28 | | 'top-right' 29 | | 'left' 30 | | 'center' 31 | | 'right' 32 | | 'bottom-left' 33 | | 'bottom' 34 | | 'bottom-right' 35 | 36 | interface IProps { 37 | seconds: boolean 38 | randomColors: boolean 39 | fg: string 40 | bg: string 41 | font: string 42 | fontSize: string 43 | showLink: boolean 44 | blink: boolean 45 | position: Position 46 | format: 12 | 24 47 | pad: boolean 48 | } 49 | 50 | interface IState { 51 | hours: string 52 | minutes: string 53 | seconds: string 54 | mouseInteraction: boolean 55 | lastTickHadColon: boolean 56 | clearMouseTimeout?: ReturnType 57 | } 58 | 59 | function normalizeColors(colors) { 60 | const normalized = {} 61 | ;['fg', 'bg'].map((key) => { 62 | if (colors[key] != null) { 63 | if (isHexColor(`#${colors[key]}`)) { 64 | normalized[key] = `#${colors[key]}` 65 | } else { 66 | normalized[key] = colors[key] 67 | } 68 | } 69 | }) 70 | 71 | return { 72 | ...colors, 73 | ...normalized, 74 | } 75 | } 76 | 77 | function randomizeColors(colors) { 78 | const palette = palettes[Math.ceil(Math.random() * palettes.length)] 79 | 80 | return { 81 | ...colors, 82 | fg: palette[0], 83 | bg: palette[palette.length - 1], 84 | } 85 | } 86 | 87 | export default class extends React.Component { 88 | static async getInitialProps({ query }) { 89 | query = normalizeColors(query) 90 | 91 | if (query.randomColors != null) { 92 | query = randomizeColors(query) 93 | } 94 | 95 | return { 96 | font: `system-ui, 97 | -apple-system, 98 | 'Segoe UI', 99 | Roboto, 100 | Helvetica, 101 | Arial, 102 | sans-serif, 103 | 'Apple Color Emoji', 104 | 'Segoe UI Emoji'`, 105 | bg: 'black', 106 | fg: 'royalblue', 107 | fontSize: '10em', 108 | position: 'center', 109 | ...query, 110 | seconds: query.seconds != null, 111 | randomColors: query.randomColors != null, 112 | showLink: query.showLink != null, 113 | blink: query.blink != null, 114 | format: parseInt(query.format || '24'), 115 | pad: query.pad != null, 116 | } 117 | } 118 | 119 | constructor(props) { 120 | super(props) 121 | 122 | this.state = { 123 | hours: '', 124 | minutes: '', 125 | seconds: '', 126 | mouseInteraction: 127 | this.props.showLink == null ? false : this.props.showLink, 128 | lastTickHadColon: false, 129 | } 130 | } 131 | 132 | tick() { 133 | let time = whatTimeIsIt(this.props) 134 | this.setState({ ...time }) 135 | } 136 | 137 | componentDidMount() { 138 | this.tick() 139 | setInterval(() => { 140 | this.tick() 141 | }, 1000) 142 | 143 | // Let colons blink twice a second 144 | setInterval(() => { 145 | const { lastTickHadColon } = this.state 146 | 147 | this.setState({ 148 | lastTickHadColon: !lastTickHadColon, 149 | }) 150 | }, 500) 151 | } 152 | 153 | getFlexPositions() { 154 | const { position } = this.props 155 | let flexPosition = { 156 | alignItems: 'center', 157 | justifyContent: 'center', 158 | } 159 | 160 | if (position.includes('top')) { 161 | flexPosition.alignItems = 'flex-start' 162 | } else if (position.includes('bottom')) { 163 | flexPosition.alignItems = 'flex-end' 164 | } 165 | 166 | if (position.includes('left')) { 167 | flexPosition.justifyContent = 'flex-start' 168 | } else if (position.includes('right')) { 169 | flexPosition.justifyContent = 'flex-end' 170 | } 171 | 172 | return flexPosition 173 | } 174 | 175 | mouseInteracting() { 176 | const { clearMouseTimeout } = this.state 177 | 178 | if (clearMouseTimeout) { 179 | clearTimeout(clearMouseTimeout) 180 | } 181 | 182 | const newClearMouseTimeout = setTimeout( 183 | () => this.setState({ mouseInteraction: false }), 184 | 2000 185 | ) 186 | 187 | this.setState({ 188 | mouseInteraction: true, 189 | clearMouseTimeout: newClearMouseTimeout, 190 | }) 191 | } 192 | 193 | render() { 194 | const { blink, showLink } = this.props 195 | const { lastTickHadColon, mouseInteraction } = this.state 196 | let colonOpacity = 1 197 | 198 | if (blink && lastTickHadColon) { 199 | colonOpacity = 0 200 | } 201 | 202 | const flexPositions = this.getFlexPositions() 203 | 204 | return ( 205 | <> 206 | {(mouseInteraction || showLink) && ( 207 | Code available here 208 | )} 209 |
this.mouseInteracting()}> 210 |
211 | {this.state.hours} 212 | 213 | : 214 | 215 | {this.state.minutes} 216 | {this.props.seconds && ( 217 | <> 218 | 219 | : 220 | 221 | {this.state.seconds} 222 | 223 | )} 224 |
225 | 262 |
263 | 264 | ) 265 | } 266 | } 267 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | is-hexcolor: 9 | specifier: ^1.0.0 10 | version: 1.0.0 11 | next: 12 | specifier: ^14.1.1 13 | version: 14.1.1(react-dom@18.2.0)(react@18.2.0) 14 | nice-color-palettes: 15 | specifier: ^3.0.0 16 | version: 3.0.0 17 | react: 18 | specifier: ^18.2.0 19 | version: 18.2.0 20 | react-dom: 21 | specifier: ^18.2.0 22 | version: 18.2.0(react@18.2.0) 23 | 24 | devDependencies: 25 | '@types/node': 26 | specifier: ^13.1.6 27 | version: 13.13.52 28 | '@types/react': 29 | specifier: ^16.9.17 30 | version: 16.14.50 31 | husky: 32 | specifier: '*' 33 | version: 8.0.3 34 | prettier: 35 | specifier: '*' 36 | version: 3.0.3 37 | pretty-quick: 38 | specifier: '*' 39 | version: 3.1.3(prettier@3.0.3) 40 | typescript: 41 | specifier: ^4.3.5 42 | version: 4.9.5 43 | 44 | packages: 45 | 46 | /@next/env@14.1.1: 47 | resolution: {integrity: sha512-7CnQyD5G8shHxQIIg3c7/pSeYFeMhsNbpU/bmvH7ZnDql7mNRgg8O2JZrhrc/soFnfBnKP4/xXNiiSIPn2w8gA==} 48 | dev: false 49 | 50 | /@next/swc-darwin-arm64@14.1.1: 51 | resolution: {integrity: sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ==} 52 | engines: {node: '>= 10'} 53 | cpu: [arm64] 54 | os: [darwin] 55 | requiresBuild: true 56 | dev: false 57 | optional: true 58 | 59 | /@next/swc-darwin-x64@14.1.1: 60 | resolution: {integrity: sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw==} 61 | engines: {node: '>= 10'} 62 | cpu: [x64] 63 | os: [darwin] 64 | requiresBuild: true 65 | dev: false 66 | optional: true 67 | 68 | /@next/swc-linux-arm64-gnu@14.1.1: 69 | resolution: {integrity: sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg==} 70 | engines: {node: '>= 10'} 71 | cpu: [arm64] 72 | os: [linux] 73 | requiresBuild: true 74 | dev: false 75 | optional: true 76 | 77 | /@next/swc-linux-arm64-musl@14.1.1: 78 | resolution: {integrity: sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ==} 79 | engines: {node: '>= 10'} 80 | cpu: [arm64] 81 | os: [linux] 82 | requiresBuild: true 83 | dev: false 84 | optional: true 85 | 86 | /@next/swc-linux-x64-gnu@14.1.1: 87 | resolution: {integrity: sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ==} 88 | engines: {node: '>= 10'} 89 | cpu: [x64] 90 | os: [linux] 91 | requiresBuild: true 92 | dev: false 93 | optional: true 94 | 95 | /@next/swc-linux-x64-musl@14.1.1: 96 | resolution: {integrity: sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og==} 97 | engines: {node: '>= 10'} 98 | cpu: [x64] 99 | os: [linux] 100 | requiresBuild: true 101 | dev: false 102 | optional: true 103 | 104 | /@next/swc-win32-arm64-msvc@14.1.1: 105 | resolution: {integrity: sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A==} 106 | engines: {node: '>= 10'} 107 | cpu: [arm64] 108 | os: [win32] 109 | requiresBuild: true 110 | dev: false 111 | optional: true 112 | 113 | /@next/swc-win32-ia32-msvc@14.1.1: 114 | resolution: {integrity: sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw==} 115 | engines: {node: '>= 10'} 116 | cpu: [ia32] 117 | os: [win32] 118 | requiresBuild: true 119 | dev: false 120 | optional: true 121 | 122 | /@next/swc-win32-x64-msvc@14.1.1: 123 | resolution: {integrity: sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A==} 124 | engines: {node: '>= 10'} 125 | cpu: [x64] 126 | os: [win32] 127 | requiresBuild: true 128 | dev: false 129 | optional: true 130 | 131 | /@sindresorhus/is@0.14.0: 132 | resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} 133 | engines: {node: '>=6'} 134 | dev: false 135 | 136 | /@swc/helpers@0.5.2: 137 | resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} 138 | dependencies: 139 | tslib: 2.6.2 140 | dev: false 141 | 142 | /@szmarczak/http-timer@1.1.2: 143 | resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} 144 | engines: {node: '>=6'} 145 | dependencies: 146 | defer-to-connect: 1.1.3 147 | dev: false 148 | 149 | /@types/keyv@3.1.4: 150 | resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} 151 | dependencies: 152 | '@types/node': 13.13.52 153 | dev: false 154 | 155 | /@types/minimatch@3.0.5: 156 | resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} 157 | dev: true 158 | 159 | /@types/node@13.13.52: 160 | resolution: {integrity: sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==} 161 | 162 | /@types/prop-types@15.7.9: 163 | resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} 164 | dev: true 165 | 166 | /@types/react@16.14.50: 167 | resolution: {integrity: sha512-7TWZ/HjhXsRK3BbhSFxTinbSft3sUXJAU3ONngT0rpcKJaIOlxkRke4bidqQTopUbEv1ApC5nlSEkIpX43MkTg==} 168 | dependencies: 169 | '@types/prop-types': 15.7.9 170 | '@types/scheduler': 0.16.5 171 | csstype: 3.1.2 172 | dev: true 173 | 174 | /@types/responselike@1.0.2: 175 | resolution: {integrity: sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==} 176 | dependencies: 177 | '@types/node': 13.13.52 178 | dev: false 179 | 180 | /@types/scheduler@0.16.5: 181 | resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} 182 | dev: true 183 | 184 | /ansi-styles@4.3.0: 185 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 186 | engines: {node: '>=8'} 187 | dependencies: 188 | color-convert: 2.0.1 189 | dev: true 190 | 191 | /array-differ@3.0.0: 192 | resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} 193 | engines: {node: '>=8'} 194 | dev: true 195 | 196 | /array-union@2.1.0: 197 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 198 | engines: {node: '>=8'} 199 | dev: true 200 | 201 | /arrify@2.0.1: 202 | resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} 203 | engines: {node: '>=8'} 204 | dev: true 205 | 206 | /balanced-match@1.0.2: 207 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 208 | dev: true 209 | 210 | /brace-expansion@1.1.11: 211 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 212 | dependencies: 213 | balanced-match: 1.0.2 214 | concat-map: 0.0.1 215 | dev: true 216 | 217 | /busboy@1.6.0: 218 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 219 | engines: {node: '>=10.16.0'} 220 | dependencies: 221 | streamsearch: 1.1.0 222 | dev: false 223 | 224 | /cacheable-request@6.1.0: 225 | resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} 226 | engines: {node: '>=8'} 227 | dependencies: 228 | clone-response: 1.0.3 229 | get-stream: 5.2.0 230 | http-cache-semantics: 4.1.1 231 | keyv: 3.1.0 232 | lowercase-keys: 2.0.0 233 | normalize-url: 4.5.1 234 | responselike: 1.0.2 235 | dev: false 236 | 237 | /caniuse-lite@1.0.30001617: 238 | resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} 239 | dev: false 240 | 241 | /chalk@3.0.0: 242 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 243 | engines: {node: '>=8'} 244 | dependencies: 245 | ansi-styles: 4.3.0 246 | supports-color: 7.2.0 247 | dev: true 248 | 249 | /client-only@0.0.1: 250 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 251 | dev: false 252 | 253 | /clone-response@1.0.3: 254 | resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} 255 | dependencies: 256 | mimic-response: 1.0.1 257 | dev: false 258 | 259 | /color-convert@2.0.1: 260 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 261 | engines: {node: '>=7.0.0'} 262 | dependencies: 263 | color-name: 1.1.4 264 | dev: true 265 | 266 | /color-name@1.1.4: 267 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 268 | dev: true 269 | 270 | /concat-map@0.0.1: 271 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 272 | dev: true 273 | 274 | /cross-spawn@7.0.3: 275 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 276 | engines: {node: '>= 8'} 277 | dependencies: 278 | path-key: 3.1.1 279 | shebang-command: 2.0.0 280 | which: 2.0.2 281 | dev: true 282 | 283 | /csstype@3.1.2: 284 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 285 | dev: true 286 | 287 | /decompress-response@3.3.0: 288 | resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} 289 | engines: {node: '>=4'} 290 | dependencies: 291 | mimic-response: 1.0.1 292 | dev: false 293 | 294 | /defer-to-connect@1.1.3: 295 | resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} 296 | dev: false 297 | 298 | /duplexer3@0.1.5: 299 | resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} 300 | dev: false 301 | 302 | /end-of-stream@1.4.4: 303 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 304 | dependencies: 305 | once: 1.4.0 306 | 307 | /execa@4.1.0: 308 | resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} 309 | engines: {node: '>=10'} 310 | dependencies: 311 | cross-spawn: 7.0.3 312 | get-stream: 5.2.0 313 | human-signals: 1.1.1 314 | is-stream: 2.0.1 315 | merge-stream: 2.0.0 316 | npm-run-path: 4.0.1 317 | onetime: 5.1.2 318 | signal-exit: 3.0.7 319 | strip-final-newline: 2.0.0 320 | dev: true 321 | 322 | /find-up@4.1.0: 323 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 324 | engines: {node: '>=8'} 325 | dependencies: 326 | locate-path: 5.0.0 327 | path-exists: 4.0.0 328 | dev: true 329 | 330 | /get-stream@4.1.0: 331 | resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} 332 | engines: {node: '>=6'} 333 | dependencies: 334 | pump: 3.0.0 335 | dev: false 336 | 337 | /get-stream@5.2.0: 338 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 339 | engines: {node: '>=8'} 340 | dependencies: 341 | pump: 3.0.0 342 | 343 | /got@9.6.0: 344 | resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} 345 | engines: {node: '>=8.6'} 346 | dependencies: 347 | '@sindresorhus/is': 0.14.0 348 | '@szmarczak/http-timer': 1.1.2 349 | '@types/keyv': 3.1.4 350 | '@types/responselike': 1.0.2 351 | cacheable-request: 6.1.0 352 | decompress-response: 3.3.0 353 | duplexer3: 0.1.5 354 | get-stream: 4.1.0 355 | lowercase-keys: 1.0.1 356 | mimic-response: 1.0.1 357 | p-cancelable: 1.1.0 358 | to-readable-stream: 1.0.0 359 | url-parse-lax: 3.0.0 360 | dev: false 361 | 362 | /graceful-fs@4.2.11: 363 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 364 | dev: false 365 | 366 | /has-flag@4.0.0: 367 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 368 | engines: {node: '>=8'} 369 | dev: true 370 | 371 | /hex-color-regex@1.0.3: 372 | resolution: {integrity: sha512-YJCMR6n7Gqrxp7HVggtxJF5XatzSrT3jX39hpLtEFQNf6x+xhlC07vI6omqDkjBtJrw8uCsCHYhppCsU+Y2m/w==} 373 | dev: false 374 | 375 | /http-cache-semantics@4.1.1: 376 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 377 | dev: false 378 | 379 | /human-signals@1.1.1: 380 | resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} 381 | engines: {node: '>=8.12.0'} 382 | dev: true 383 | 384 | /husky@8.0.3: 385 | resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} 386 | engines: {node: '>=14'} 387 | hasBin: true 388 | dev: true 389 | 390 | /ignore@5.2.4: 391 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 392 | engines: {node: '>= 4'} 393 | dev: true 394 | 395 | /is-hexcolor@1.0.0: 396 | resolution: {integrity: sha512-exeAJKlQsEjg3Sc5604FLXt59MQXkUIVKdJTRLAdLwJM42zCngVyLbEt2gQtb9TSRVzCIbaWbzgDKjbJIBzBFQ==} 397 | dependencies: 398 | hex-color-regex: 1.0.3 399 | dev: false 400 | 401 | /is-stream@2.0.1: 402 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 403 | engines: {node: '>=8'} 404 | dev: true 405 | 406 | /isexe@2.0.0: 407 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 408 | dev: true 409 | 410 | /js-tokens@4.0.0: 411 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 412 | dev: false 413 | 414 | /json-buffer@3.0.0: 415 | resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} 416 | dev: false 417 | 418 | /keyv@3.1.0: 419 | resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} 420 | dependencies: 421 | json-buffer: 3.0.0 422 | dev: false 423 | 424 | /locate-path@5.0.0: 425 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 426 | engines: {node: '>=8'} 427 | dependencies: 428 | p-locate: 4.1.0 429 | dev: true 430 | 431 | /loose-envify@1.4.0: 432 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 433 | hasBin: true 434 | dependencies: 435 | js-tokens: 4.0.0 436 | dev: false 437 | 438 | /lowercase-keys@1.0.1: 439 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} 440 | engines: {node: '>=0.10.0'} 441 | dev: false 442 | 443 | /lowercase-keys@2.0.0: 444 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 445 | engines: {node: '>=8'} 446 | dev: false 447 | 448 | /map-limit@0.0.1: 449 | resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} 450 | dependencies: 451 | once: 1.3.3 452 | dev: false 453 | 454 | /merge-stream@2.0.0: 455 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 456 | dev: true 457 | 458 | /mimic-fn@2.1.0: 459 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 460 | engines: {node: '>=6'} 461 | dev: true 462 | 463 | /mimic-response@1.0.1: 464 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 465 | engines: {node: '>=4'} 466 | dev: false 467 | 468 | /minimatch@3.1.2: 469 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 470 | dependencies: 471 | brace-expansion: 1.1.11 472 | dev: true 473 | 474 | /minimist@1.2.8: 475 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 476 | dev: false 477 | 478 | /mri@1.2.0: 479 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 480 | engines: {node: '>=4'} 481 | dev: true 482 | 483 | /multimatch@4.0.0: 484 | resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} 485 | engines: {node: '>=8'} 486 | dependencies: 487 | '@types/minimatch': 3.0.5 488 | array-differ: 3.0.0 489 | array-union: 2.1.0 490 | arrify: 2.0.1 491 | minimatch: 3.1.2 492 | dev: true 493 | 494 | /nanoid@3.3.6: 495 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 496 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 497 | hasBin: true 498 | dev: false 499 | 500 | /new-array@1.0.0: 501 | resolution: {integrity: sha512-K5AyFYbuHZ4e/ti52y7k18q8UHsS78FlRd85w2Fmsd6AkuLipDihPflKC0p3PN5i8II7+uHxo+CtkLiJDfmS5A==} 502 | dev: false 503 | 504 | /next@14.1.1(react-dom@18.2.0)(react@18.2.0): 505 | resolution: {integrity: sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww==} 506 | engines: {node: '>=18.17.0'} 507 | hasBin: true 508 | peerDependencies: 509 | '@opentelemetry/api': ^1.1.0 510 | react: ^18.2.0 511 | react-dom: ^18.2.0 512 | sass: ^1.3.0 513 | peerDependenciesMeta: 514 | '@opentelemetry/api': 515 | optional: true 516 | sass: 517 | optional: true 518 | dependencies: 519 | '@next/env': 14.1.1 520 | '@swc/helpers': 0.5.2 521 | busboy: 1.6.0 522 | caniuse-lite: 1.0.30001617 523 | graceful-fs: 4.2.11 524 | postcss: 8.4.31 525 | react: 18.2.0 526 | react-dom: 18.2.0(react@18.2.0) 527 | styled-jsx: 5.1.1(react@18.2.0) 528 | optionalDependencies: 529 | '@next/swc-darwin-arm64': 14.1.1 530 | '@next/swc-darwin-x64': 14.1.1 531 | '@next/swc-linux-arm64-gnu': 14.1.1 532 | '@next/swc-linux-arm64-musl': 14.1.1 533 | '@next/swc-linux-x64-gnu': 14.1.1 534 | '@next/swc-linux-x64-musl': 14.1.1 535 | '@next/swc-win32-arm64-msvc': 14.1.1 536 | '@next/swc-win32-ia32-msvc': 14.1.1 537 | '@next/swc-win32-x64-msvc': 14.1.1 538 | transitivePeerDependencies: 539 | - '@babel/core' 540 | - babel-plugin-macros 541 | dev: false 542 | 543 | /nice-color-palettes@3.0.0: 544 | resolution: {integrity: sha512-lL4AjabAAFi313tjrtmgm/bxCRzp4l3vCshojfV/ij3IPdtnRqv6Chcw+SqJUhbe7g3o3BecaqCJYUNLswGBhQ==} 545 | hasBin: true 546 | dependencies: 547 | got: 9.6.0 548 | map-limit: 0.0.1 549 | minimist: 1.2.8 550 | new-array: 1.0.0 551 | dev: false 552 | 553 | /normalize-url@4.5.1: 554 | resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} 555 | engines: {node: '>=8'} 556 | dev: false 557 | 558 | /npm-run-path@4.0.1: 559 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 560 | engines: {node: '>=8'} 561 | dependencies: 562 | path-key: 3.1.1 563 | dev: true 564 | 565 | /once@1.3.3: 566 | resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} 567 | dependencies: 568 | wrappy: 1.0.2 569 | dev: false 570 | 571 | /once@1.4.0: 572 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 573 | dependencies: 574 | wrappy: 1.0.2 575 | 576 | /onetime@5.1.2: 577 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 578 | engines: {node: '>=6'} 579 | dependencies: 580 | mimic-fn: 2.1.0 581 | dev: true 582 | 583 | /p-cancelable@1.1.0: 584 | resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} 585 | engines: {node: '>=6'} 586 | dev: false 587 | 588 | /p-limit@2.3.0: 589 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 590 | engines: {node: '>=6'} 591 | dependencies: 592 | p-try: 2.2.0 593 | dev: true 594 | 595 | /p-locate@4.1.0: 596 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 597 | engines: {node: '>=8'} 598 | dependencies: 599 | p-limit: 2.3.0 600 | dev: true 601 | 602 | /p-try@2.2.0: 603 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 604 | engines: {node: '>=6'} 605 | dev: true 606 | 607 | /path-exists@4.0.0: 608 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 609 | engines: {node: '>=8'} 610 | dev: true 611 | 612 | /path-key@3.1.1: 613 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 614 | engines: {node: '>=8'} 615 | dev: true 616 | 617 | /picocolors@1.0.0: 618 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 619 | dev: false 620 | 621 | /postcss@8.4.31: 622 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 623 | engines: {node: ^10 || ^12 || >=14} 624 | dependencies: 625 | nanoid: 3.3.6 626 | picocolors: 1.0.0 627 | source-map-js: 1.0.2 628 | dev: false 629 | 630 | /prepend-http@2.0.0: 631 | resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} 632 | engines: {node: '>=4'} 633 | dev: false 634 | 635 | /prettier@3.0.3: 636 | resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} 637 | engines: {node: '>=14'} 638 | hasBin: true 639 | dev: true 640 | 641 | /pretty-quick@3.1.3(prettier@3.0.3): 642 | resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==} 643 | engines: {node: '>=10.13'} 644 | hasBin: true 645 | peerDependencies: 646 | prettier: '>=2.0.0' 647 | dependencies: 648 | chalk: 3.0.0 649 | execa: 4.1.0 650 | find-up: 4.1.0 651 | ignore: 5.2.4 652 | mri: 1.2.0 653 | multimatch: 4.0.0 654 | prettier: 3.0.3 655 | dev: true 656 | 657 | /pump@3.0.0: 658 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 659 | dependencies: 660 | end-of-stream: 1.4.4 661 | once: 1.4.0 662 | 663 | /react-dom@18.2.0(react@18.2.0): 664 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 665 | peerDependencies: 666 | react: ^18.2.0 667 | dependencies: 668 | loose-envify: 1.4.0 669 | react: 18.2.0 670 | scheduler: 0.23.0 671 | dev: false 672 | 673 | /react@18.2.0: 674 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 675 | engines: {node: '>=0.10.0'} 676 | dependencies: 677 | loose-envify: 1.4.0 678 | dev: false 679 | 680 | /responselike@1.0.2: 681 | resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} 682 | dependencies: 683 | lowercase-keys: 1.0.1 684 | dev: false 685 | 686 | /scheduler@0.23.0: 687 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 688 | dependencies: 689 | loose-envify: 1.4.0 690 | dev: false 691 | 692 | /shebang-command@2.0.0: 693 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 694 | engines: {node: '>=8'} 695 | dependencies: 696 | shebang-regex: 3.0.0 697 | dev: true 698 | 699 | /shebang-regex@3.0.0: 700 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 701 | engines: {node: '>=8'} 702 | dev: true 703 | 704 | /signal-exit@3.0.7: 705 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 706 | dev: true 707 | 708 | /source-map-js@1.0.2: 709 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 710 | engines: {node: '>=0.10.0'} 711 | dev: false 712 | 713 | /streamsearch@1.1.0: 714 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 715 | engines: {node: '>=10.0.0'} 716 | dev: false 717 | 718 | /strip-final-newline@2.0.0: 719 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 720 | engines: {node: '>=6'} 721 | dev: true 722 | 723 | /styled-jsx@5.1.1(react@18.2.0): 724 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 725 | engines: {node: '>= 12.0.0'} 726 | peerDependencies: 727 | '@babel/core': '*' 728 | babel-plugin-macros: '*' 729 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 730 | peerDependenciesMeta: 731 | '@babel/core': 732 | optional: true 733 | babel-plugin-macros: 734 | optional: true 735 | dependencies: 736 | client-only: 0.0.1 737 | react: 18.2.0 738 | dev: false 739 | 740 | /supports-color@7.2.0: 741 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 742 | engines: {node: '>=8'} 743 | dependencies: 744 | has-flag: 4.0.0 745 | dev: true 746 | 747 | /to-readable-stream@1.0.0: 748 | resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} 749 | engines: {node: '>=6'} 750 | dev: false 751 | 752 | /tslib@2.6.2: 753 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 754 | dev: false 755 | 756 | /typescript@4.9.5: 757 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 758 | engines: {node: '>=4.2.0'} 759 | hasBin: true 760 | dev: true 761 | 762 | /url-parse-lax@3.0.0: 763 | resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} 764 | engines: {node: '>=4'} 765 | dependencies: 766 | prepend-http: 2.0.0 767 | dev: false 768 | 769 | /which@2.0.2: 770 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 771 | engines: {node: '>= 8'} 772 | hasBin: true 773 | dependencies: 774 | isexe: 2.0.0 775 | dev: true 776 | 777 | /wrappy@1.0.2: 778 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 779 | -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/time/6d2910ac6ffe87c98ad1b0fcc87fd4f4ee274776/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/time/6d2910ac6ffe87c98ad1b0fcc87fd4f4ee274776/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/time/6d2910ac6ffe87c98ad1b0fcc87fd4f4ee274776/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/time/6d2910ac6ffe87c98ad1b0fcc87fd4f4ee274776/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/time/6d2910ac6ffe87c98ad1b0fcc87fd4f4ee274776/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/time/6d2910ac6ffe87c98ad1b0fcc87fd4f4ee274776/public/favicon.ico -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Time by [pablopunk](https://pablopunk.com) 2 | 3 | > https://time.pablopunk.com 4 | 5 | Perfect if you use tools like [Plash](https://sindresorhus.com/plash). 6 | 7 | ![screenshot](https://raw.githubusercontent.com/pablopunk/time/master/screenshot.gif) 8 | 9 | ## Customize options 10 | 11 | - `fg`: Font color. Examples: 12 | - [`?fg=red`](https://time.pablopunk.com/?fg=red) 13 | - [`?fg=ff00ff`](https://time.pablopunk.com/?fg=ff00ff) 14 | - `bg`: Background color. 15 | - [`?bg=lightpink`](https://time.pablopunk.com/?bg=lightpink) 16 | - `font`: Font family. Examples: 17 | - [`?font=SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace`](https://time.pablopunk.com/?font=SFMono-Regular,Consolas,%27Liberation%20Mono%27,Menlo,monospace) 18 | - `fontSize`: The size of the font in the clock. Examples: 19 | - [`?fontSize=5rem`](https://time.pablopunk.com/?fontSize=5rem) 20 | - [`?fontSize=200px`](https://time.pablopunk.com/?fontSize=200px) 21 | - `position`: Position on the screen. Defaults to center: 22 | 23 | ``` 24 | top-left top top-right 25 | left right 26 | bottom-left bottom bottom-right 27 | ``` 28 | 29 | Examples: 30 | 31 | - [`?position=top-left`](https://time.pablopunk.com/?position=top-left) 32 | - [`?position=bottom`](https://time.pablopunk.com/?position=bottom) 33 | 34 | - `seconds`: Show seconds if this argument present. 35 | - [`?seconds`](https://time.pablopunk.com/?seconds) 36 | - `randomColors`: Sets a random color both for background and foreground. 37 | - [`?randomColors`](https://time.pablopunk.com/?randomColors) 38 | - `blink`: The colon between the hours and the minutes will blink each second. 39 | - [`?blink`](https://time.pablopunk.com/?blink) 40 | - `showLink`: A link to this repo is shown automatically when mouse input is detected, but it can be forced using this option. 41 | - [`?showLink`](https://time.pablopunk.com/?showLink) 42 | - `format=12`: Don't like military time? Shame on you. But you can use 12h format instead. 43 | - [`?format=12`](https://time.pablopunk.com/?format=12) 44 | - `pad`: Single digit hours will be padded with a 0: 9:41 will be shown as 09:41. 45 | - [`?pad`](https://time.pablopunk.com/?pad) 46 | 47 | ## More Examples 48 | 49 | - https://time.pablopunk.com/?seconds&fg=F1396D&bg=382F32&font=monospace 50 | - https://time.pablopunk.com/?fg=11cc88&bg=454545&font=monospace&fontSize=200px&position=bottom-right 51 | - https://time.pablopunk.com/?seconds&randomColors&blink 52 | - https://time.pablopunk.com/?fg=white&bg=transparent (this one is nice for Plash) 53 | 54 | ## Author 55 | 56 | | ![me](https://gravatar.com/avatar/fa50aeff0ddd6e63273a068b04353d9d?size=100) | 57 | | ---------------------------------------------------------------------------- | 58 | | [Pablo Varela](https://pablopunk.com) | 59 | -------------------------------------------------------------------------------- /screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/time/6d2910ac6ffe87c98ad1b0fcc87fd4f4ee274776/screenshot.gif -------------------------------------------------------------------------------- /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": false, 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 | "exclude": [ 23 | "node_modules" 24 | ], 25 | "include": [ 26 | "next-env.d.ts", 27 | "**/*.ts", 28 | "**/*.tsx" 29 | ] 30 | } 31 | --------------------------------------------------------------------------------