From ae3d04eef763547ed562131a9a902cb2b651f499 Mon Sep 17 00:00:00 2001 From: X Date: Sat, 9 Apr 2022 16:14:36 +0800 Subject: [PATCH 01/41] Use aleph canary --- .editorconfig | 9 - .gitignore | 3 +- .vscode/extensions.json | 2 - .vscode/settings.json | 36 +- LICENSE | 21 - README.md | 23 - aleph.config.ts | 35 - api/hello.ts | 5 - app.tsx | 15 - {public => assets}/fast-refresh.mp4 | Bin {public => assets}/favicon.ico | Bin {public => assets}/grid.svg | 0 {public => assets}/logo.svg | 0 {public => assets}/logo_filled.png | Bin {public => assets}/logo_filled_frame.png | Bin {public => assets}/main_title.svg | 0 {public => assets}/play_circle.svg | 0 {public => assets}/twitter_card.jpg | Bin components/Button.tsx | 91 +-- components/GreyTriangle.tsx | 46 -- components/Header.tsx | 53 +- components/Logo.tsx | 18 +- components/UniverseTriangle.tsx | 215 ------ deno.json | 22 + import_map.json | 14 +- index.html | 17 + main.tsx | 4 + pages/404.tsx | 25 - pages/docs.tsx | 361 --------- pages/index.tsx | 94 --- public/star.png | Bin 5435 -> 0 bytes public/vercel-settings.png | Bin 214301 -> 0 bytes routes/docs.tsx | 386 ++++++++++ .../docs/advanced-features/custom-app.md | 0 .../advanced-features/custom-error-page.md | 0 .../docs/advanced-features/custom-server.md | 0 .../advanced-features/dynamic-importing.md | 0 .../docs/advanced-features/jsx-magic.md | 0 .../docs/advanced-features/use-deno-hook.md | 0 .../docs/advanced-features/using-plugins.md | 0 {pages => routes}/docs/api-reference/cli.tsx | 0 .../docs/api-reference/config.md | 0 .../docs/api-reference/framework-api.md | 0 .../docs/api-reference/plugin-api.md | 0 {pages => routes}/docs/basic-features/apis.md | 0 .../basic-features/built-in-css-support.md | 0 .../basic-features/hmr-with-fast-refresh.md | 0 .../docs/basic-features/import-from-npm.md | 0 .../docs/basic-features/import-maps.md | 0 .../docs/basic-features/pages.md | 0 .../docs/basic-features/routing.md | 0 .../docs/basic-features/ssr-and-ssg.md | 0 .../basic-features/static-file-serving.md | 0 {pages => routes}/docs/browser-support.md | 0 {pages => routes}/docs/deployment.md | 0 {pages => routes}/docs/design/artworks.tsx | 0 {pages => routes}/docs/design/theme.tsx | 0 {pages => routes}/docs/get-started.md | 0 {pages => routes}/docs/index.md | 0 .../docs/plugins/community-plugins.md | 0 .../docs/plugins/official-plugins.md | 0 routes/index.tsx | 99 +++ server.tsx | 10 + style/app.css | 132 ---- style/docs.css | 708 ------------------ style/header.css | 70 -- style/index.css | 72 -- style/tailwind-preflight.css | 368 +++++++++ tsconfig.json | 5 - vercel.json | 7 - 70 files changed, 1021 insertions(+), 1945 deletions(-) delete mode 100644 .editorconfig delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 aleph.config.ts delete mode 100644 api/hello.ts delete mode 100644 app.tsx rename {public => assets}/fast-refresh.mp4 (100%) rename {public => assets}/favicon.ico (100%) rename {public => assets}/grid.svg (100%) rename {public => assets}/logo.svg (100%) rename {public => assets}/logo_filled.png (100%) rename {public => assets}/logo_filled_frame.png (100%) rename {public => assets}/main_title.svg (100%) rename {public => assets}/play_circle.svg (100%) rename {public => assets}/twitter_card.jpg (100%) delete mode 100644 components/GreyTriangle.tsx delete mode 100644 components/UniverseTriangle.tsx create mode 100644 deno.json create mode 100644 index.html create mode 100644 main.tsx delete mode 100644 pages/404.tsx delete mode 100644 pages/docs.tsx delete mode 100644 pages/index.tsx delete mode 100644 public/star.png delete mode 100644 public/vercel-settings.png create mode 100644 routes/docs.tsx rename {pages => routes}/docs/advanced-features/custom-app.md (100%) rename {pages => routes}/docs/advanced-features/custom-error-page.md (100%) rename {pages => routes}/docs/advanced-features/custom-server.md (100%) rename {pages => routes}/docs/advanced-features/dynamic-importing.md (100%) rename {pages => routes}/docs/advanced-features/jsx-magic.md (100%) rename {pages => routes}/docs/advanced-features/use-deno-hook.md (100%) rename {pages => routes}/docs/advanced-features/using-plugins.md (100%) rename {pages => routes}/docs/api-reference/cli.tsx (100%) rename {pages => routes}/docs/api-reference/config.md (100%) rename {pages => routes}/docs/api-reference/framework-api.md (100%) rename {pages => routes}/docs/api-reference/plugin-api.md (100%) rename {pages => routes}/docs/basic-features/apis.md (100%) rename {pages => routes}/docs/basic-features/built-in-css-support.md (100%) rename {pages => routes}/docs/basic-features/hmr-with-fast-refresh.md (100%) rename {pages => routes}/docs/basic-features/import-from-npm.md (100%) rename {pages => routes}/docs/basic-features/import-maps.md (100%) rename {pages => routes}/docs/basic-features/pages.md (100%) rename {pages => routes}/docs/basic-features/routing.md (100%) rename {pages => routes}/docs/basic-features/ssr-and-ssg.md (100%) rename {pages => routes}/docs/basic-features/static-file-serving.md (100%) rename {pages => routes}/docs/browser-support.md (100%) rename {pages => routes}/docs/deployment.md (100%) rename {pages => routes}/docs/design/artworks.tsx (100%) rename {pages => routes}/docs/design/theme.tsx (100%) rename {pages => routes}/docs/get-started.md (100%) rename {pages => routes}/docs/index.md (100%) rename {pages => routes}/docs/plugins/community-plugins.md (100%) rename {pages => routes}/docs/plugins/official-plugins.md (100%) create mode 100644 routes/index.tsx create mode 100644 server.tsx delete mode 100644 style/app.css delete mode 100644 style/docs.css delete mode 100644 style/header.css delete mode 100644 style/index.css create mode 100644 style/tailwind-preflight.css delete mode 100644 tsconfig.json delete mode 100644 vercel.json diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index a43b112..0000000 --- a/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -# EditorConfig is awesome: https://EditorConfig.org - -root = true - -[*.{css,ts,tsx}] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 diff --git a/.gitignore b/.gitignore index 1d18737..d9d8698 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ .DS_Store Thumbs.db -.aleph/ -dist/ +dist/ \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index c3f1e9f..c4eb3fe 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,5 @@ { "recommendations": [ - "csstools.postcss", - "editorconfig.editorconfig", "denoland.vscode-deno" ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index ea9c047..7af46cc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,28 +1,18 @@ { - "files.eol": "\n", - "files.trimTrailingWhitespace": true, - "typescript.format.semicolons": "remove", - "typescript.preferences.quoteStyle": "single", - "[javascript]": { - "editor.defaultFormatter": "vscode.typescript-language-features", - "editor.formatOnSave": false, + "deno.enable": true, + "deno.unstable": true, + "deno.config": "./deno.json", + "deno.importMap": "./import_map.json", + "deno.suggest.imports.hosts": { + "https://deno.land": true, + "https://esm.sh": false }, "[typescript]": { - "editor.defaultFormatter": "vscode.typescript-language-features", - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": true, - } + "editor.defaultFormatter": "denoland.vscode-deno", + "editor.formatOnSave": true }, "[typescriptreact]": { - "editor.defaultFormatter": "vscode.typescript-language-features", - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": true, - } - }, - "deno.enable": true, - "deno.unstable": true, - "deno.config": "./tsconfig.json", - "deno.importMap": "./import_map.json" -} + "editor.defaultFormatter": "denoland.vscode-deno", + "editor.formatOnSave": true + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 448e308..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2020 postUI Lab. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 1ef265c..0000000 --- a/README.md +++ /dev/null @@ -1,23 +0,0 @@ -![Aleph.js](https://raw.githubusercontent.com/alephjs/aleph.js/master/.github/poster.svg) - -# Alephjs.org -The website of **Aleph.js**, this website is built with Aleph.js and automatically deploys to [Vercel](https://vercel.com). - -> https://alephjs.org - -## System Requirements -- [Deno](https://deno.land/) 1.13+ -- [Aleph.js](https://deno.land/x/aleph) 0.3.0+ -- [VS Code](https://code.visualstudio.com/) with [deno extension](https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno) (recommended) - -## Development Setup -```bash -# start the website in `development` mode -aleph dev - -# start the website in `production` mode -aleph start - -# build the website to a stact site -aleph build -``` diff --git a/aleph.config.ts b/aleph.config.ts deleted file mode 100644 index 159306d..0000000 --- a/aleph.config.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { Config } from 'aleph/types' -import markdown from 'aleph/plugins/markdown.ts' - -export default { - plugins: [ - markdown(), - { - name: 'google-analytics-plugin', - setup: aleph => { - const id = Deno.env.get('GTAGID') - if (id && aleph.mode === 'production') { - aleph.onRender(({ html }) => { - html.scripts.push( - { - src: `https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(id)}`, - async: true - }, - `window.dataLayer = window.dataLayer || []; - function gtag() { - dataLayer.push(arguments); - } - gtag('js', new Date()); - gtag('config', ${JSON.stringify(id)});` - ) - }) - } - } - } - ], - css: { - postcss: { - plugins: ['postcss-nested', 'autoprefixer'] - } - } -} diff --git a/api/hello.ts b/api/hello.ts deleted file mode 100644 index d967f45..0000000 --- a/api/hello.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { APIHandler } from 'aleph/types.d.ts' - -export const handler: APIHandler = ({ response }) => { - response.json({ name: 'Aleph' }) -} diff --git a/app.tsx b/app.tsx deleted file mode 100644 index e1d1925..0000000 --- a/app.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { ComponentType } from 'react' -import Header from './components/Header.tsx' -import './style/app.css' - -export default function App({ Page, pageProps }: { Page: ComponentType, pageProps: any }) { - return ( -
-
- -
- ) -} - -// set scrollFixer with offset to avoid the fixed header override the hash scroll element -(window as any).scrollFixer = { offset: { top: 80 } } diff --git a/public/fast-refresh.mp4 b/assets/fast-refresh.mp4 similarity index 100% rename from public/fast-refresh.mp4 rename to assets/fast-refresh.mp4 diff --git a/public/favicon.ico b/assets/favicon.ico similarity index 100% rename from public/favicon.ico rename to assets/favicon.ico diff --git a/public/grid.svg b/assets/grid.svg similarity index 100% rename from public/grid.svg rename to assets/grid.svg diff --git a/public/logo.svg b/assets/logo.svg similarity index 100% rename from public/logo.svg rename to assets/logo.svg diff --git a/public/logo_filled.png b/assets/logo_filled.png similarity index 100% rename from public/logo_filled.png rename to assets/logo_filled.png diff --git a/public/logo_filled_frame.png b/assets/logo_filled_frame.png similarity index 100% rename from public/logo_filled_frame.png rename to assets/logo_filled_frame.png diff --git a/public/main_title.svg b/assets/main_title.svg similarity index 100% rename from public/main_title.svg rename to assets/main_title.svg diff --git a/public/play_circle.svg b/assets/play_circle.svg similarity index 100% rename from public/play_circle.svg rename to assets/play_circle.svg diff --git a/public/twitter_card.jpg b/assets/twitter_card.jpg similarity index 100% rename from public/twitter_card.jpg rename to assets/twitter_card.jpg diff --git a/components/Button.tsx b/components/Button.tsx index 854839e..f685e96 100755 --- a/components/Button.tsx +++ b/components/Button.tsx @@ -1,4 +1,9 @@ -import React, { CSSProperties, PropsWithChildren, useMemo, useState } from 'react' +import React, { + CSSProperties, + PropsWithChildren, + useMemo, + useState, +} from "react"; export default function Button({ className, @@ -13,68 +18,68 @@ export default function Button({ icon, iconPosition, onClick, - children + children, }: PropsWithChildren<{ - className?: string, - width?: number | string, - height?: number, - color?: string, - compact?: boolean, - strong?: boolean, - disabled?: boolean, - activated?: boolean, - round?: boolean, - icon?: React.ReactNode, - iconPosition?: { top?: number | string, left?: number | string }, - onClick?(e: React.MouseEvent): void + className?: string; + width?: number | string; + height?: number; + color?: string; + compact?: boolean; + strong?: boolean; + disabled?: boolean; + activated?: boolean; + round?: boolean; + icon?: React.ReactNode; + iconPosition?: { top?: number | string; left?: number | string }; + onClick?(e: React.MouseEvent): void; }>) { - const [hover, setHover] = useState(false) + const [hover, setHover] = useState(false); const style = useMemo(() => { const css: CSSProperties = { - display: 'inline-flex', - alignItems: 'center', - justifyContent: 'center', + display: "inline-flex", + alignItems: "center", + justifyContent: "center", height, - border: '1px solid #000', - borderRadius: round === false ? '5px' : height / 2 + 'px', + border: "1px solid #000", + borderRadius: round === false ? "5px" : height / 2 + "px", lineHeight: 1, fontSize: 16, fontWeight: 500, - padding: '0 36px', - transition: 'all 0.21s ease-in-out', - cursor: 'pointer' - } + padding: "0 36px", + transition: "all 0.21s ease-in-out", + cursor: "pointer", + }; if (color) { - css.color = color - css.borderColor = color + css.color = color; + css.borderColor = color; } if (hover || activated) { - if (color === 'white') { - css.color = "black" - css.background = "white" + if (color === "white") { + css.color = "black"; + css.background = "white"; } else { - css.color = "white" - css.background = "black" + css.color = "white"; + css.background = "black"; } } if (compact) { - css.padding = '0 16px' + css.padding = "0 16px"; } if (strong) { - css.borderWidth = '2px' - css.fontWeight = 600 + css.borderWidth = "2px"; + css.fontWeight = 600; } if (width) { - css.width = width - css.padding = 0 + css.width = width; + css.padding = 0; } if (disabled) { - css.color = '#999' - css.borderColor = '#ccc' - css.pointerEvents = 'none' + css.color = "#999"; + css.borderColor = "#ccc"; + css.pointerEvents = "none"; } - return css - }, [height, color, hover, activated]) + return css; + }, [height, color, hover, activated]); return ( - ) + ); } diff --git a/components/GreyTriangle.tsx b/components/GreyTriangle.tsx deleted file mode 100644 index 218f420..0000000 --- a/components/GreyTriangle.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { useMemo } from 'react' - -interface Props { - size: number -} - -export default function GreyTriangle({ size }: Props) { - const y = useMemo(() => size - Math.sin(54 * Math.PI / 180) * size, [size]) - - return ( -
- - - - - - - - - - - - - - -
- ) -} - -GreyTriangle.defaultProps = { - size: 200, -} - diff --git a/components/Header.tsx b/components/Header.tsx index 2987fdf..5bbcdc4 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -1,25 +1,39 @@ -import { useRouter } from 'aleph/react' -import React from 'react' -import '~/style/header.css' +import { useRouter } from "aleph/react"; export default function Header() { - const { pathname } = useRouter() + const { url: { pathname } } = useRouter(); return ( -
+
- ) + ); } diff --git a/components/Logo.tsx b/components/Logo.tsx index 43b2d24..6a3a887 100644 --- a/components/Logo.tsx +++ b/components/Logo.tsx @@ -1,15 +1,23 @@ -import React from 'react' - export default function Logo() { return ( - + Aleph.js - + - ) + ); } diff --git a/components/UniverseTriangle.tsx b/components/UniverseTriangle.tsx deleted file mode 100644 index ffd598b..0000000 --- a/components/UniverseTriangle.tsx +++ /dev/null @@ -1,215 +0,0 @@ -import { GlitchFilter } from '@pixi/filter-glitch' -import { ZoomBlurFilter } from '@pixi/filter-zoom-blur' -import * as PIXI from 'pixi' -import React, { useEffect, useRef } from 'react' - -const starImage = '/star.png' -const defaultSpeed = 0.15 -const travel = { speed: defaultSpeed } - -interface Star { - sprite: PIXI.Sprite - x: number - y: number - z: number -} - -class Canvas { - private _app: PIXI.Application - private _zoomBlurFilter: ZoomBlurFilter - private _glitchFilter: GlitchFilter | null - private _cameraZ: number - private _size: number - private _fov: number - private _starBaseSize: number - private _stars: Star[] - - constructor(props: Props) { - const { - size = 200, - fov = 50, - starBaseSize = 8, - glitch = false - } = props - this._size = size * window.devicePixelRatio - this._app = new PIXI.Application({ - width: this._size, - height: this._size, - antialias: true, - backgroundColor: 0xffffff, - backgroundAlpha: 0 - }) - this._zoomBlurFilter = new ZoomBlurFilter({ strength: defaultSpeed / 10, center: [this._size / 2, this._size / 2] }) - this._glitchFilter = glitch ? new GlitchFilter({ fillMode: 4, direction: 90 }) : null - this._cameraZ = 0 - this._fov = fov - this._starBaseSize = starBaseSize - this._stars = [] - this._init() - } - - private _init() { - const { stage, view } = this._app - const { devicePixelRatio } = window - - view.style.width = this._size / devicePixelRatio + 'px' - view.style.height = this._size / devicePixelRatio + 'px' - - const triangle = new PIXI.Graphics() - const y = this._size - Math.sin(54 * Math.PI / 180) * this._size - triangle.beginFill(0x111111) - triangle.drawPolygon([ - 0, this._size, - this._size, this._size, - this._size / 2, y - ]) - triangle.endFill() - triangle.x = 0 - triangle.y = -y - stage.addChild(triangle) - stage.filters = [this._zoomBlurFilter, this._glitchFilter].filter(Boolean) - - const starTexture = PIXI.Texture.from(starImage) - for (let i = 0; i < Math.round(this._size * this._size / 600); i++) { - const star = { - sprite: new PIXI.Sprite(starTexture), - z: 0, - x: 0, - y: 0 - } - star.sprite.anchor.x = 0.5 - star.sprite.anchor.y = 0.7 - this._randomizeStar(star) // 0 ~ 2000 - stage.addChild(star.sprite) - this._stars.push(star) - } - this._renderStars() - this._travel = this._travel.bind(this) - } - - mount(el: HTMLElement) { - el.appendChild(this._app.view) - this.play() - } - - unmount(el: HTMLElement) { - this.stop() - el.removeChild(this._app.view) - } - - play() { - this._app.ticker.add(this._travel) - } - - stop() { - this._app.ticker.remove(this._travel) - } - - resize(size: number) { - this._size = size * window.devicePixelRatio - this._app.renderer.resize(this._size, this._size) - this._zoomBlurFilter.center = [this._size / 2, this._size / 2] - } - - private _travel(delta: number) { - this._cameraZ += delta * 10 * travel.speed - if (Math.abs(travel.speed) > defaultSpeed) { - this._zoomBlurFilter.strength = Math.abs(travel.speed) / 45 - } else { - this._zoomBlurFilter.strength = defaultSpeed / 10 - } - this._renderStars() - } - - private _renderStars() { - const { renderer: { screen } } = this._app - - this._stars.forEach(star => { - const starSprite = star.sprite - if (this._cameraZ > star.z) { - this._randomizeStar(star, this._cameraZ) - } else if (star.z - this._cameraZ > 3000) { - this._randomizeStar(star, this._cameraZ, true) - } - - // map star 3d position to 2d with really simple projection - const z = star.z - this._cameraZ - starSprite.x = star.x * (this._fov / z) * screen.width + screen.width / 2 - starSprite.y = star.y * (this._fov / z) * screen.width + screen.height / 2 - - // calculate star scale & rotation. - const dxCenter = starSprite.x - screen.width / 2 - const dyCenter = starSprite.y - screen.height / 2 - const distanceScale = Math.max(0, (2000 - z) / 2000) - starSprite.scale.x = distanceScale * this._starBaseSize / 100 - - // star is looking towards center so that y axis is towards center. - // scale the star depending on how fast we are moving, what the stretchfactor is and depending on how far away it is from the center. - starSprite.scale.y = distanceScale * this._starBaseSize / 100 - starSprite.rotation = Math.atan2(dyCenter, dxCenter) + Math.PI / 2 - }) - } - - // calculate star positions with radial random coordinate so no star hits the camera. - private _randomizeStar(star: Star, cameraZ?: number, reverse = false) { - var deg = Math.random() * Math.PI * 2 - var distance = Math.random() * 50 + 1 - star.x = Math.cos(deg) * distance - star.y = Math.sin(deg) * distance - if (cameraZ === undefined) { - star.z = Math.random() * 2000 - } else { - if (reverse) { - star.z = cameraZ + Math.random() * 1000 - } else { - star.z = cameraZ + Math.random() * 1000 + 2000 - } - } - } -} - -interface Props { - size?: number - fov?: number - starBaseSize?: number - glitch?: boolean -} - -export default function Logo(props: Props) { - const { - size = 200, - fov = 50, - starBaseSize = 8, - glitch = false - } = props - const ref = useRef() - - useEffect(() => { - const canvas = new Canvas({ size, fov, starBaseSize, glitch }) - if (ref.current) { - canvas.mount(ref.current) - } - return () => { - if (ref.current) { - canvas.unmount(ref.current) - } - } - }, [size, fov, starBaseSize]) - - return ( -
travel.speed = 1.5} - onMouseLeave={() => travel.speed = defaultSpeed} - ref={el => { - if (el) { - ref.current = el - } - }} - /> - ) -} diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..e8cb33b --- /dev/null +++ b/deno.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "dom.asynciterable", + "deno.ns" + ], + "types": [ + "https://deno.land/x/aleph_canary@0.0.66/types.d.ts" + ], + "jsx": "react-jsx", + "jsxImportSource": "https://esm.sh/react@17.0.2" + }, + "tasks": { + "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.66/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph_canary@0.0.66/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph_canary@0.0.66/cli.ts build" + }, + "fmt": {}, + "lint": {} +} \ No newline at end of file diff --git a/import_map.json b/import_map.json index 96976fc..bb76485 100644 --- a/import_map.json +++ b/import_map.json @@ -1,18 +1,12 @@ { "imports": { "~/": "./", - "aleph/": "https://deno.land/x/aleph@v0.3.0-beta.18/", - "aleph/types": "https://deno.land/x/aleph@v0.3.0-beta.18/types.d.ts", - "aleph/web": "https://deno.land/x/aleph@v0.3.0-beta.18/framework/core/mod.ts", - "aleph/react": "https://deno.land/x/aleph@v0.3.0-beta.18/framework/react/mod.ts", + "aleph/": "https://deno.land/x/aleph_canary@0.0.66/", + "aleph/server": "https://deno.land/x/aleph_canary@0.0.66/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph_canary@0.0.66/framework/react/mod.ts", "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", - "marked": "https://esm.sh/marked@2.0.1", - "highlight": "https://esm.sh/highlight.js@10.7.1/lib/core", - "highlight-languages/": "https://esm.sh/highlight.js@10.7.1/lib/languages/", - "pixi": "https://esm.sh/pixi.js-legacy@6.1.2", - "@pixi/filter-glitch": "https://esm.sh/@pixi/filter-glitch@4.1.3", - "@pixi/filter-zoom-blur": "https://esm.sh/@pixi/filter-zoom-blur@4.1.3" + "react-dom/server": "https://esm.sh/react-dom@17.0.2/server" }, "scopes": {} } \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..4700581 --- /dev/null +++ b/index.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + +
+ + + + diff --git a/main.tsx b/main.tsx new file mode 100644 index 0000000..f4d3365 --- /dev/null +++ b/main.tsx @@ -0,0 +1,4 @@ +import { hydrate } from "react-dom"; +import { Router } from "aleph/react"; + +hydrate(, document.querySelector("#root")); diff --git a/pages/404.tsx b/pages/404.tsx deleted file mode 100644 index d7b835f..0000000 --- a/pages/404.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { dynamic, Fallback } from 'aleph/react' -import React from 'react' -import GreyTriangle from '~/components/GreyTriangle.tsx' - -const UniverseTriangle = dynamic(() => import('~/components/UniverseTriangle.tsx')) - -export default function E404() { - return ( - <> - - 404 - Page Not Found - - -
- }> - - -

404 - Page Not Found

-
- - ) -} diff --git a/pages/docs.tsx b/pages/docs.tsx deleted file mode 100644 index 84b3cdb..0000000 --- a/pages/docs.tsx +++ /dev/null @@ -1,361 +0,0 @@ -import React, { ComponentType, Fragment, useEffect, useMemo, useState } from 'react' -import { useRouter } from 'aleph/react' -import util from 'aleph/shared/util.ts' -import hljs from 'highlight' -import bash from 'highlight-languages/bash' -import javascript from 'highlight-languages/javascript' -import json from 'highlight-languages/json' -import typescript from 'highlight-languages/typescript' -import xml from 'highlight-languages/xml' -import Logo from '../components/Logo.tsx' - -hljs.registerLanguage('json', json) -hljs.registerLanguage('javascript', javascript) -hljs.registerLanguage('typescript', typescript) -hljs.registerLanguage('xml', xml) // depended by jsx -hljs.registerLanguage('bash', (hljs: any) => { - const l = bash(hljs) - l.keywords.built_in = 'cd deno aleph land' - return l -}) - -const description = 'The Documentation for Aleph.js' -const ogImage = 'https://alephjs.org/twitter_card.jpg' -const navMenu = [ - { - name: 'Documentation', - items: [ - { - title: 'About Aleph.js', - modifier: , - path: '/docs' - }, - { title: 'Get Started', path: '/docs/get-started' }, - { - title: 'Basic Features', - path: '/docs/basic-features', - submenu: [ - { title: 'Pages', path: '/pages' }, - { title: 'APIs', path: '/apis' }, - { title: 'Routing', path: '/routing' }, - { title: 'Built-in CSS Support', path: '/built-in-css-support' }, - { title: 'SSR & SSG', path: '/ssr-and-ssg' }, - { title: 'Static File Serving', path: '/static-file-serving' }, - { title: 'HMR with Fast Refresh', path: '/hmr-with-fast-refresh' }, - { title: 'Import From NPM', path: '/import-from-npm' }, - { title: 'Import Maps', path: '/import-maps' }, - ] - }, - { - title: 'Advanced Features', - path: '/docs/advanced-features', - submenu: [ - { title: '`useDeno` Hook', path: '/use-deno-hook' }, - { title: 'Dynamic Importing', path: '/dynamic-importing' }, - { title: 'Custom `App`', path: '/custom-app' }, - { title: 'Custom Error Page', path: '/custom-error-page' }, - { title: 'Custom Server', path: '/custom-server' }, - { title: 'JSX Magic', path: '/jsx-magic' }, - { title: 'Using Plugins', path: '/using-plugins' }, - ] - }, - { - title: 'Plugins', - path: '/docs/plugins', - submenu: [ - { title: 'Official Plugins', path: '/official-plugins' }, - { title: 'Community Plugins', path: '/community-plugins' }, - ] - }, - { title: 'Browser Support', path: '/docs/browser-support' }, - { title: 'Deployment', path: '/docs/deployment' }, - ] - }, - { - name: 'API Reference', - items: [ - { title: 'CLI', path: '/docs/api-reference/cli' }, - { title: 'Config', path: '/docs/api-reference/config' }, - { title: 'Framework API', path: '/docs/api-reference/framework-api' }, - { title: 'Plugin API', path: '/docs/api-reference/plugin-api' }, - ] - }, - { - name: 'Design', - items: [ - { title: 'Artworks', path: '/docs/design/artworks' }, - { title: 'Theme', path: '/docs/design/theme' }, - ] - }, -] - -interface Metadata { - title: string - authors: string[] - keywords?: string[] - editable?: boolean -} - -export default function Docs({ Page }: { Page?: ComponentType & { meta: Metadata } }) { - const { pathname: currentPath, routePath } = useRouter() - const [extended, setExtended] = useState(navMenu.map(m => m.items).flat().filter(item => item.submenu).reduce((m, item) => { - m[item.path] = routePath.startsWith(item.path) - return m - }, {} as Record)) - const [menuIsOpen, setMenuIsOpen] = useState(false) - const [searchWords, setSearchWords] = useState('') - const navLinks = useMemo<[[string, string] | null, [string, string] | null]>(() => { - const all: [string, string][] = [] - navMenu.forEach(g => g.items.forEach(item => { - if (item.submenu) { - item.submenu.forEach(({ title, path }) => { - all.push([title, item.path + (path === '/' ? '' : path)]) - }) - } else { - all.push([item.title, item.path]) - } - })) - const index = all.findIndex(([_, path]) => path === currentPath) - return [all[index - 1] || null, all[index + 1] || null] - }, [currentPath]) - const editUrl = useMemo(() => { - const md = routePath === '/docs' ? routePath + '/index.md' : routePath + '.md' - return 'https://github.com/alephjs/alephjs.org/edit/master/pages' + md - }, [routePath]) - const title = [Page?.meta.title, !Page?.meta.title.endsWith('Aleph.js') && 'Aleph.js'].filter(Boolean).join(' - ') - const filteredNavMenu = useMemo(() => { - if (searchWords === '') { - return navMenu - } - return navMenu.map(g => { - const includes = (item: any) => item.title.toLowerCase().includes(searchWords) - return { - ...g, items: g.items.filter(item => { - return includes(item) || item.submenu?.some(includes) - }).map(item => ({ ...item, submenu: item.submenu?.filter(subItem => includes(item) || includes(subItem)) })) - } - }).filter(g => g.items.length > 0) - }, [searchWords]) - - useEffect(() => { - setExtended(navMenu.map(m => m.items).flat().filter(item => item.submenu).reduce((m, item) => { - m[item.path] = routePath.startsWith(item.path) - return m - }, {} as Record)) - document.querySelectorAll('.docs .content pre > code').forEach(block => { - if (block.className.includes('language-')) { - hljs.highlightElement(block) - } - if (block.className.includes('language-bash')) { - for (let i = 0; i < block.childNodes.length; i++) { - const child = block.childNodes[i] - if (child.nodeName === '#text') { - const text = child.textContent! - if (text == '$ ') { - block.insertBefore(bashPromptSpan(), child) - block.removeChild(child) - } else { - const texts = text.split('\n$ ') - const n = texts.length - if (n > 1) { - for (let j = 0; j < n; j++) { - const t = texts[j] - if (t) { - const node = document.createTextNode(t + '\n') - block.insertBefore(node, child) - } else if (j == 0) { - const node = document.createTextNode('\n') - block.insertBefore(node, child) - } - if (j > 0) { - block.insertBefore(bashPromptSpan(), child) - } - } - block.removeChild(child) - } - } - } - } - } - }) - document.querySelectorAll('.docs .content video').forEach(block => { - const v = block as HTMLVideoElement - v.className = 'is-paused' - v.addEventListener('click', () => { - if (v.paused) { - v.play() - } else { - v.requestFullscreen() - } - }) - v.addEventListener('playing', () => v.className = 'is-playing') - v.addEventListener('pause', () => v.className = 'is-paused') - }) - }, [routePath]) - - return ( -
- - {title} - - {Page?.meta.keywords && ( - - )} - - - - - - - - - - - -
- {Page && } - {Page && ( - - )} - {(Page && Page.meta.editable !== false) && ( -

- Authors:  - {Array.isArray(Page.meta.authors) && Page.meta.authors.map(name => ( - - ))} - | - Edit this page on Github -

- )} - {!(Page && Page.meta.editable !== false) && ( -
- )} -
-
- ) -} - -function bashPromptSpan(prompt: string = '$') { - const span = document.createElement('span') - span.className = 'bash_prompt' - span.innerText = prompt + ' ' - return span -} diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index 7bc307f..0000000 --- a/pages/index.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { dynamic, Fallback, useDeno } from 'aleph/react' -import React from 'react' -import Button from '~/components/Button.tsx' -import GreyTriangle from '~/components/GreyTriangle.tsx' - -const thisYear = (new Date).getFullYear() -const title = 'Aleph.js' -const about = 'The Fullstack Framework in Deno.' -const keywords = [ - 'aleph', - 'alephjs', - 'aleph.js', - 'react', - 'full-stack', - 'framework', - 'ssr', - 'ssg', - 'deno', - 'typescript', - 'out-of-the-box', - 'esm', - 'hmr', - 'fast-refresh', - 'tooling' -] -const ogImage = 'https://alephjs.org/twitter_card.jpg' -const features = [ - { href: '/docs', title: 'Zero Config' }, - { href: '/docs', title: 'Typescript in Deno' }, - { href: '/docs/basic-features/import-from-npm', title: 'ES Module Ready' }, - { href: '/docs/basic-features/import-maps', title: 'Import Maps' }, - { href: '/docs/basic-features/hmr-with-fast-refresh', title: 'HMR with Fast Refresh' }, - { href: '/docs/basic-features/routing', title: 'File-system Routing' }, - { href: '/docs/basic-features/ssr-and-ssg', title: 'SSR & SSG' }, - { href: '/docs/basic-features/built-in-css-support', title: 'Built-in CSS Support' }, - { href: '/docs/advanced-features/jsx-magic', title: 'JSX Magic' }, - { href: '/docs/advanced-features/using-plugins', title: 'Plugin System' }, -] - -const UniverseTriangle = dynamic(() => import('~/components/UniverseTriangle.tsx')) - -export default function Home() { - const { version } = useDeno(() => ({ - version: Deno.env.get('ALEPH_VERSION') - })) - - return ( -
- - {title} - - - - - - - - - - - - -
- }> - - -

The Fullstack Framework in Deno.

-

Aleph.js gives you the best developer experience for building modern web applications:
TypeScript in Deno, ES module imports, file-system routing, SSR & SSG,
HMR with Fast Refresh, and more. No config needed.

-

Aleph.js gives you the best developer experience for building modern web applications in Deno.

- -
-
-

Features

-
    - {features.map(({ href, title }) => ( -
  • {title}
  • - ))} -
-
-
-

Copyright © {thisYear} postUI, Lab. All rights reserved.

-

Built by Aleph.js - v{version}

-

(MIT License)

-
-
- ) -} diff --git a/public/star.png b/public/star.png deleted file mode 100644 index a2b74e8bc818d08aaa8d2b77cb668804dafc9b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5435 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

`_I8(=I5(C&9?&WY?$d=F5OIDLSC-#mZm20rBN? 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 XS)FElwXybs0Q{*dYbg~dSO)$NiH^yq diff --git a/routes/docs.tsx b/routes/docs.tsx new file mode 100644 index 0000000..c69625b --- /dev/null +++ b/routes/docs.tsx @@ -0,0 +1,386 @@ +import { ComponentType, Fragment, useEffect, useMemo, useState } from "react"; +import { useRouter } from "aleph/react"; +import util from "aleph/lib/util.ts"; +import Logo from "../components/Logo.tsx"; + +const description = "The Documentation for Aleph.js"; +const ogImage = "https://alephjs.org/twitter_card.jpg"; +const navMenu = [ + { + name: "Documentation", + items: [ + { + title: "About Aleph.js", + modifier: ( + + + + ), + path: "/docs", + }, + { title: "Get Started", path: "/docs/get-started" }, + { + title: "Basic Features", + path: "/docs/basic-features", + submenu: [ + { title: "Pages", path: "/pages" }, + { title: "APIs", path: "/apis" }, + { title: "Routing", path: "/routing" }, + { title: "Built-in CSS Support", path: "/built-in-css-support" }, + { title: "SSR & SSG", path: "/ssr-and-ssg" }, + { title: "Static File Serving", path: "/static-file-serving" }, + { title: "HMR with Fast Refresh", path: "/hmr-with-fast-refresh" }, + { title: "Import From NPM", path: "/import-from-npm" }, + { title: "Import Maps", path: "/import-maps" }, + ], + }, + { + title: "Advanced Features", + path: "/docs/advanced-features", + submenu: [ + { title: "`useDeno` Hook", path: "/use-deno-hook" }, + { title: "Dynamic Importing", path: "/dynamic-importing" }, + { title: "Custom `App`", path: "/custom-app" }, + { title: "Custom Error Page", path: "/custom-error-page" }, + { title: "Custom Server", path: "/custom-server" }, + { title: "JSX Magic", path: "/jsx-magic" }, + { title: "Using Plugins", path: "/using-plugins" }, + ], + }, + { + title: "Plugins", + path: "/docs/plugins", + submenu: [ + { title: "Official Plugins", path: "/official-plugins" }, + { title: "Community Plugins", path: "/community-plugins" }, + ], + }, + { title: "Browser Support", path: "/docs/browser-support" }, + { title: "Deployment", path: "/docs/deployment" }, + ], + }, + { + name: "API Reference", + items: [ + { title: "CLI", path: "/docs/api-reference/cli" }, + { title: "Config", path: "/docs/api-reference/config" }, + { title: "Framework API", path: "/docs/api-reference/framework-api" }, + { title: "Plugin API", path: "/docs/api-reference/plugin-api" }, + ], + }, + { + name: "Design", + items: [ + { title: "Artworks", path: "/docs/design/artworks" }, + { title: "Theme", path: "/docs/design/theme" }, + ], + }, +]; + +interface Metadata { + title: string; + authors: string[]; + keywords?: string[]; + editable?: boolean; +} + +export default function Docs( + { Page }: { Page?: ComponentType & { meta: Metadata } }, +) { + const { url } = useRouter(); + const [extended, setExtended] = useState( + navMenu.map((m) => m.items).flat().filter((item) => item.submenu).reduce( + (m, item) => { + m[item.path] = url.pathname.startsWith(item.path); + return m; + }, + {} as Record, + ), + ); + const [menuIsOpen, setMenuIsOpen] = useState(false); + const [searchWords, setSearchWords] = useState(""); + const navLinks = useMemo<[[string, string] | null, [string, string] | null]>( + () => { + const all: [string, string][] = []; + navMenu.forEach((g) => + g.items.forEach((item) => { + if (item.submenu) { + item.submenu.forEach(({ title, path }) => { + all.push([title, item.path + (path === "/" ? "" : path)]); + }); + } else { + all.push([item.title, item.path]); + } + }) + ); + const index = all.findIndex(([_, path]) => path === url.pathname); + return [all[index - 1] || null, all[index + 1] || null]; + }, + [url.pathname], + ); + const editUrl = useMemo(() => { + const md = url.pathname === "/docs" + ? url.pathname + "/index.md" + : url.pathname + ".md"; + return `https://github.com/alephjs/alephjs.org/edit/master/pages${md}`; + }, [url.pathname]); + const title = [ + Page?.meta.title, + !Page?.meta.title.endsWith("Aleph.js") && "Aleph.js", + ].filter(Boolean).join(" - "); + const filteredNavMenu = useMemo(() => { + if (searchWords === "") { + return navMenu; + } + return navMenu.map((g) => { + const includes = (item: any) => + item.title.toLowerCase().includes(searchWords); + return { + ...g, + items: g.items.filter((item) => { + return includes(item) || item.submenu?.some(includes); + }).map((item) => ({ + ...item, + submenu: item.submenu?.filter((subItem) => + includes(item) || includes(subItem) + ), + })), + }; + }).filter((g) => g.items.length > 0); + }, [searchWords]); + + useEffect(() => { + setExtended( + navMenu.map((m) => m.items).flat().filter((item) => item.submenu).reduce( + (m, item) => { + m[item.path] = url.pathname.startsWith(item.path); + return m; + }, + {} as Record, + ), + ); + document.querySelectorAll(".docs .content video").forEach((block) => { + const v = block as HTMLVideoElement; + v.className = "is-paused"; + v.addEventListener("click", () => { + if (v.paused) { + v.play(); + } else { + v.requestFullscreen(); + } + }); + v.addEventListener("playing", () => v.className = "is-playing"); + v.addEventListener("pause", () => v.className = "is-paused"); + }); + }, [url.pathname]); + + return ( +

+ + {title} + + {Page?.meta.keywords && ( + + )} + + + + + + + + + + + +
+ {Page && } + {Page && ( + + )} + {(Page && Page.meta.editable !== false) && ( +

+ Authors:  + {Array.isArray(Page.meta.authors) && + Page.meta.authors.map((name) => ( + + + + ))} + | + Edit this page on Github +

+ )} + {!(Page && Page.meta.editable !== false) && ( +
+ )} +
+
+ ); +} diff --git a/pages/docs/advanced-features/custom-app.md b/routes/docs/advanced-features/custom-app.md similarity index 100% rename from pages/docs/advanced-features/custom-app.md rename to routes/docs/advanced-features/custom-app.md diff --git a/pages/docs/advanced-features/custom-error-page.md b/routes/docs/advanced-features/custom-error-page.md similarity index 100% rename from pages/docs/advanced-features/custom-error-page.md rename to routes/docs/advanced-features/custom-error-page.md diff --git a/pages/docs/advanced-features/custom-server.md b/routes/docs/advanced-features/custom-server.md similarity index 100% rename from pages/docs/advanced-features/custom-server.md rename to routes/docs/advanced-features/custom-server.md diff --git a/pages/docs/advanced-features/dynamic-importing.md b/routes/docs/advanced-features/dynamic-importing.md similarity index 100% rename from pages/docs/advanced-features/dynamic-importing.md rename to routes/docs/advanced-features/dynamic-importing.md diff --git a/pages/docs/advanced-features/jsx-magic.md b/routes/docs/advanced-features/jsx-magic.md similarity index 100% rename from pages/docs/advanced-features/jsx-magic.md rename to routes/docs/advanced-features/jsx-magic.md diff --git a/pages/docs/advanced-features/use-deno-hook.md b/routes/docs/advanced-features/use-deno-hook.md similarity index 100% rename from pages/docs/advanced-features/use-deno-hook.md rename to routes/docs/advanced-features/use-deno-hook.md diff --git a/pages/docs/advanced-features/using-plugins.md b/routes/docs/advanced-features/using-plugins.md similarity index 100% rename from pages/docs/advanced-features/using-plugins.md rename to routes/docs/advanced-features/using-plugins.md diff --git a/pages/docs/api-reference/cli.tsx b/routes/docs/api-reference/cli.tsx similarity index 100% rename from pages/docs/api-reference/cli.tsx rename to routes/docs/api-reference/cli.tsx diff --git a/pages/docs/api-reference/config.md b/routes/docs/api-reference/config.md similarity index 100% rename from pages/docs/api-reference/config.md rename to routes/docs/api-reference/config.md diff --git a/pages/docs/api-reference/framework-api.md b/routes/docs/api-reference/framework-api.md similarity index 100% rename from pages/docs/api-reference/framework-api.md rename to routes/docs/api-reference/framework-api.md diff --git a/pages/docs/api-reference/plugin-api.md b/routes/docs/api-reference/plugin-api.md similarity index 100% rename from pages/docs/api-reference/plugin-api.md rename to routes/docs/api-reference/plugin-api.md diff --git a/pages/docs/basic-features/apis.md b/routes/docs/basic-features/apis.md similarity index 100% rename from pages/docs/basic-features/apis.md rename to routes/docs/basic-features/apis.md diff --git a/pages/docs/basic-features/built-in-css-support.md b/routes/docs/basic-features/built-in-css-support.md similarity index 100% rename from pages/docs/basic-features/built-in-css-support.md rename to routes/docs/basic-features/built-in-css-support.md diff --git a/pages/docs/basic-features/hmr-with-fast-refresh.md b/routes/docs/basic-features/hmr-with-fast-refresh.md similarity index 100% rename from pages/docs/basic-features/hmr-with-fast-refresh.md rename to routes/docs/basic-features/hmr-with-fast-refresh.md diff --git a/pages/docs/basic-features/import-from-npm.md b/routes/docs/basic-features/import-from-npm.md similarity index 100% rename from pages/docs/basic-features/import-from-npm.md rename to routes/docs/basic-features/import-from-npm.md diff --git a/pages/docs/basic-features/import-maps.md b/routes/docs/basic-features/import-maps.md similarity index 100% rename from pages/docs/basic-features/import-maps.md rename to routes/docs/basic-features/import-maps.md diff --git a/pages/docs/basic-features/pages.md b/routes/docs/basic-features/pages.md similarity index 100% rename from pages/docs/basic-features/pages.md rename to routes/docs/basic-features/pages.md diff --git a/pages/docs/basic-features/routing.md b/routes/docs/basic-features/routing.md similarity index 100% rename from pages/docs/basic-features/routing.md rename to routes/docs/basic-features/routing.md diff --git a/pages/docs/basic-features/ssr-and-ssg.md b/routes/docs/basic-features/ssr-and-ssg.md similarity index 100% rename from pages/docs/basic-features/ssr-and-ssg.md rename to routes/docs/basic-features/ssr-and-ssg.md diff --git a/pages/docs/basic-features/static-file-serving.md b/routes/docs/basic-features/static-file-serving.md similarity index 100% rename from pages/docs/basic-features/static-file-serving.md rename to routes/docs/basic-features/static-file-serving.md diff --git a/pages/docs/browser-support.md b/routes/docs/browser-support.md similarity index 100% rename from pages/docs/browser-support.md rename to routes/docs/browser-support.md diff --git a/pages/docs/deployment.md b/routes/docs/deployment.md similarity index 100% rename from pages/docs/deployment.md rename to routes/docs/deployment.md diff --git a/pages/docs/design/artworks.tsx b/routes/docs/design/artworks.tsx similarity index 100% rename from pages/docs/design/artworks.tsx rename to routes/docs/design/artworks.tsx diff --git a/pages/docs/design/theme.tsx b/routes/docs/design/theme.tsx similarity index 100% rename from pages/docs/design/theme.tsx rename to routes/docs/design/theme.tsx diff --git a/pages/docs/get-started.md b/routes/docs/get-started.md similarity index 100% rename from pages/docs/get-started.md rename to routes/docs/get-started.md diff --git a/pages/docs/index.md b/routes/docs/index.md similarity index 100% rename from pages/docs/index.md rename to routes/docs/index.md diff --git a/pages/docs/plugins/community-plugins.md b/routes/docs/plugins/community-plugins.md similarity index 100% rename from pages/docs/plugins/community-plugins.md rename to routes/docs/plugins/community-plugins.md diff --git a/pages/docs/plugins/official-plugins.md b/routes/docs/plugins/official-plugins.md similarity index 100% rename from pages/docs/plugins/official-plugins.md rename to routes/docs/plugins/official-plugins.md diff --git a/routes/index.tsx b/routes/index.tsx new file mode 100644 index 0000000..e6e4c1b --- /dev/null +++ b/routes/index.tsx @@ -0,0 +1,99 @@ +import Button from "~/components/Button.tsx"; + +const thisYear = (new Date()).getFullYear(); +const title = "Aleph.js"; +const about = "The Fullstack Framework in Deno."; +const keywords = [ + "aleph", + "alephjs", + "aleph.js", + "react", + "full-stack", + "framework", + "ssr", + "ssg", + "deno", + "typescript", + "out-of-the-box", + "esm", + "hmr", + "fast-refresh", + "tooling", +]; +const ogImage = "https://alephjs.org/twitter_card.jpg"; +const features = [ + { href: "/docs", title: "Zero Config" }, + { href: "/docs", title: "Typescript in Deno" }, + { href: "/docs/basic-features/import-from-npm", title: "ES Module Ready" }, + { href: "/docs/basic-features/import-maps", title: "Import Maps" }, + { + href: "/docs/basic-features/hmr-with-fast-refresh", + title: "HMR with Fast Refresh", + }, + { href: "/docs/basic-features/routing", title: "File-system Routing" }, + { href: "/docs/basic-features/ssr-and-ssg", title: "SSR & SSG" }, + { + href: "/docs/basic-features/built-in-css-support", + title: "Built-in CSS Support", + }, + { href: "/docs/advanced-features/jsx-magic", title: "JSX Magic" }, + { href: "/docs/advanced-features/using-plugins", title: "Plugin System" }, +]; + +export default function Home() { + return ( +
+ + {title} + + + + + + + + + + + +
+

The Fullstack Framework in Deno.

+

+ Aleph.js{" "} + gives you the best developer experience for building modern web + applications:
{" "} + TypeScript in Deno, ES module imports, file-system routing, SSR & + SSG,
HMR with Fast Refresh, and more. No config needed. +

+

+ Aleph.js{" "} + gives you the best developer experience for building modern web + applications in Deno. +

+ +
+
+

Features

+
    + {features.map(({ href, title }) => ( +
  • + {title} +
  • + ))} +
+
+
+

Copyright © {thisYear} postUI, Lab. All rights reserved.

+

Built by Aleph.js

+

(MIT License)

+
+
+ ); +} diff --git a/server.tsx b/server.tsx new file mode 100644 index 0000000..1843370 --- /dev/null +++ b/server.tsx @@ -0,0 +1,10 @@ +import { Router } from "aleph/react"; +import { serve } from "aleph/server"; +import { renderToString } from "react-dom/server"; + +serve({ + config: { + routeFiles: "./routes/**/*.tsx", + }, + ssr: (ctx) => renderToString(), +}); diff --git a/style/app.css b/style/app.css deleted file mode 100644 index 5dd1273..0000000 --- a/style/app.css +++ /dev/null @@ -1,132 +0,0 @@ -:root { - --header-height: 80px; - --theme-color: #d63369; -} - -* { - margin: 0; - padding: 0; - border: none; - outline: none; - font: inherit; - font-size: 100%; - vertical-align: baseline; - background: transparent; -} - -html { - font-size: 15px; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, system-ui, 'Segoe UI', 'Helvetica Neue', Helvetica, Roboto, Ubuntu, Tahoma, Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft YaHei', 'Heiti SC', sans-serif; - color: #333; - text-rendering: optimizeLegibility; -} - -ul, -ol { - list-style: none; -} - -a { - color: #000; - text-decoration: none; -} - -strong, b { - font-weight: 600; -} - -em, i { - font-style: italic; -} - -.fullscreen-page { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - width: 100%; - height: calc(100vh - var(--header-height)); - - &:after { - display: block; - height: var(--header-height); - content: ''; - } - - .logo { - cursor: none; - } - - h1 { - line-height: 1.27; - font-size: 36px; - font-family: Gotham, 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; - font-weight: 700; - letter-spacing: -1.5px; - text-align: center; - color: #111; - - @media screen and (max-width: 690px) and (min-width: 480px) { - font-size: 30px; - } - @media screen and (max-width: 480px) { - font-size: 25px; - } - } - - .intro { - width: 90%; - max-width: 600px; - margin-top: 6px; - line-height: 1.27; - font-size: 15px; - text-align: center; - color: #666; - - &.short { - width: 80%; - display: none; - } - - strong { - font-weight: 600; - } - - @media screen and (max-width: 690px) { - display: none; - - &.short { - display: block; - } - } - } - - .buttons { - width: 90%; - margin-top: 18px; - text-align: center; - - a { - display: inline-block; - margin: 0 6px; - } - - @media screen and (max-width: 690px) { - a { - display: block; - margin: 0; - margin-top: 9px; - - button { - box-sizing: border-box; - width: 100%; - height: 36px!important; - border-radius: 18px!important; - } - } - } - } -} diff --git a/style/docs.css b/style/docs.css deleted file mode 100644 index 28fbfc6..0000000 --- a/style/docs.css +++ /dev/null @@ -1,708 +0,0 @@ -/* https://esm.sh/highlightjs@9.16.2/styles/github.css */ -.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#111;font-weight:500}.hljs-literal,.hljs-number,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:var(--theme-color)}.hljs-section,.hljs-selector-id,.hljs-title{color:var(--theme-color);font-weight:600}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:600}.hljs-attribute,.hljs-name,.hljs-tag{color:#999;font-weight:400}.hljs-tag .hljs-name {color:teal;font-weight:500}.hljs-tag .hljs-attr {color:#454545;font-weight:500}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:var(--theme-color)}.hljs-built_in,.hljs-builtin-name{color:teal}.hljs-meta{color:#999;font-weight:600}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:600} - -.docs { - width: 90%; - max-width: 1200px; - margin: 0 auto; - - @media screen and (max-width: 900px) { - width: 100%; - } - - aside { - position: sticky; - top: 80px; - z-index: 98; - float: left; - width: 270px; - - .search { - width: 100%; - padding-top: 6px; - - input { - box-shadow: none; - box-sizing: border-box; - display: inline-block; - font-size: 14px; - line-height: 36px; - width: 100%; - height: 36px; - padding: 0 12px; - border: 1px solid #eee; - border-radius: 6px; - outline: 0px; - color: #000; - background-color: transparent; - caret-color: #000; - transition: border-color .3s linear, color .3s linear; - text-overflow: ellipsis; - -webkit-appearance: none; - - &:hover { - color: #000; - border-color: #999; - } - &:focus { - color: #111; - border-color: #333; - } - } - } - - nav { - width: 100%; - height: calc(100vh - 80px - 6px - 36px - 2.1rem); - overflow: hidden; - overflow-y: auto; - margin-top: 2.1rem; - - &:after { - display: block; - height: 1.8rem; - content: ""; - } - - h2 { - line-height: 1.27; - font-size: 0.9rem; - font-weight: 400; - text-transform: uppercase; - color: #999; - } - - ul + h2 { - margin-top: 2.1rem; - } - - ul { - li { - margin-top: 15px; - - &.indent { - border-left: 1px solid rgb(234, 234, 234); - padding-left: 19px; - margin-left: 3px; - - & + li.indent { - margin-top: 0; - padding-top: 18px; - } - } - - label { - line-height: 1.27; - font-size: 1rem; - color: #333; - cursor: pointer; - user-select: none; - - svg { - display: inline-block; - margin-right: 14px; - transition: transform .15s linear; - } - &.open svg { - margin-left: 1px; - margin-right: 13px; - transform: rotate(90deg); - } - } - - a { - position: relative; - display: flex; - align-items: center; - line-height: 1.27; - font-size: 1rem; - color: #333; - user-select: none; - - .aleph-logo { - position: absolute; - top: -1px; - right: 1px; - font-size: 1.44rem; - color: #ccc; - opacity: 0.9; - transition: color .2s linear; - } - - &:before { - flex-basis: 4px; - flex-shrink: 0; - display: block; - width: 4px; - height: 4px; - margin-right: 16px; - border-radius: 50%; - background-color: #999; - transition: background-color .15s linear; - content: ""; - } - - &:hover { - color: #000; - } - - &.active { - color: #000; - font-weight: 600; - } - - &.active:before, - &:hover:before { - background-color: #111; - } - - &.active .aleph-logo, - &:hover .aleph-logo { - color: #D63369; - } - } - } - } - } - - .menu-button { - display: none; - width: 90%; - height: 18px; - margin: 0 auto; - padding: 18px 0; - line-height: 18px; - font-size: 1rem; - font-weight: 500; - color: #333; - user-select: none; - cursor: pointer; - - svg { - display: inline-block; - margin-right: 14px; - transition: transform .15s linear; - } - - &.open svg { - margin-left: 1px; - margin-right: 13px; - transform: rotate(90deg); - } - } - - @media screen and (max-width: 900px) { - top: -36px; - float: none; - width: 100%; - border-bottom: 1px solid #eee; - background-color: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(6px); - - .search { - width: 90%; - margin: 0 auto; - padding-top: 0; - } - - .menu-button { - display: block; - } - - nav { - display: none; - margin-top: 0; - height: calc(100vh - 18px - 18px - 18px); - - &.open { - display: block; - } - - h2, ul { - width: 90%; - margin: 0 auto; - } - } - } - } - - .content { - padding-left: 360px; - - @media screen and (max-width: 900px) { - width: 90%; - margin: 5vw auto 0; - padding-left: 0; - } - - .doc-page { - h1, h2, h3, h4, h5 { - line-height: 1.27; - font-weight: 500; - color: #000; - } - - h1 { - margin-bottom: 1.2rem; - font-size: 2.4rem; - font-weight: 700; - } - h1:first-child { - margin-top: 0; - } - - h2 { - margin-top: 3rem; - font-size: 1.8rem; - } - - h3 { - margin-top: 2.7rem; - font-size: 1.5rem; - } - - h4 { - margin-top: 2.4rem; - font-size: 1.27rem; - } - - h5 { - margin-top: 2.1rem; - font-size: 1rem; - } - - p { - margin-top: 1.5rem; - line-height: 1.5; - } - - p + p { - margin-top: 1.2rem; - } - - h4 + p { - margin-top: 0.9rem; - } - - a { - color: var(--theme-color); - box-shadow: 0 1px 0 0 currentColor; - - &:hover { - box-shadow: none; - } - } - - img { - max-width: 100%; - border-radius: 6px; - } - - video { - max-width: 100%; - border-radius: 6px; - - &.is-paused { - cursor: url('/play_circle.svg'), pointer; - } - } - - code { - font-family: 'Dank Mono', 'Source Code Pro', monospace; - } - - samp { - font-family: monospace; - font-weight: 700; - - &::before, - &::after { - font-weight: 500; - color: #aaa; - content: '/' - } - } - - pre { - box-sizing: border-box; - overflow-x: auto; - width: 100%; - margin-top: 1.5rem; - border-radius: 6px; - line-height: 1.5; - color: #333; - background-color: #f8f8f8; - white-space: pre; - -webkit-overflow-scrolling: touch; - - & > code { - display: block; - padding: 1.5rem; - - .bash_prompt { - color: #bbb; - user-select: none; - } - } - } - - li > pre { - margin-top: 1rem; - margin-bottom: 1rem; - } - - :not(pre) > code { - display: inline; - white-space: pre-wrap; - color: var(--theme-color); - - &::before, - &::after { - color: currentColor; - content: '`' - } - } - - details { - padding: 0.5rem 1rem; - margin: 1.5rem 0; - border: 1px solid #eaeaea; - border-radius: 6px; - background-color: #fafafa; - - &[open] { - overflow: hidden; - } - - & > * { - margin: 0; - } - & > summary { - font-weight: 500; - outline: none; - cursor: pointer; - } - } - - blockquote { - color: #666; - padding: 0.3rem 1.5rem; - margin: 1.5rem 0; - border-left: 2px solid #ccc; - - p { - margin: 0; - } - a { - box-shadow: none; - } - } - - hr { - border: 0; - border-top: 1px solid #eaeaea; - margin-top: 1.5rem; - } - - ul, ol { - padding-left: 1.5rem; - margin-top: 1.5rem; - } - - p + ul, - p + ol { - margin-top: 0.75rem; - } - - ol { - list-style-type: decimal; - } - - li + li { - margin-top: 0.6rem; - } - - ul li:before { - position: absolute; - margin-left: -1rem; - color: #aaa; - content: '-'; - } - } - - .edit-link { - margin-top: 30px; - padding: 15px 0; - border-top: 1px solid #f3f3f3; - color: #333; - - span { - margin-left: 8px; - color: #ccc; - } - - a { - position: relative; - display: inline-block; - margin-left: 8px; - line-height: 1.8rem; - font-size: 0.95rem; - color: #333; - transition: 0.2s color; - vertical-align: middle; - - &.author { - display: inline-block; - width: 24px; - height: 24px; - margin-left: 2px; - border-radius: 50%; - overflow: hidden; - - img { - width: 24px; - height: 24px; - } - } - - &:hover { - color: #000; - } - &:hover:after { - content: ' 👍🏿' - } - } - } - - .doc-page-nav { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 45px; - - .page-nav-link { - display: inline-flex; - align-items: center; - - & > span { - display: inline-flex; - align-items: center; - font-size: 16px; - height: 24px; - color: #999; - transition: color 0.2s; - } - - & > a { - display: inline-block; - height: 24px; - line-height: 24px; - font-size: 16px; - color: #333; - transition: color 0.2s; - } - - &:hover > span { - color: #333; - } - - &:hover > a { - color: #000; - } - - span + a, - a + span { - padding-left: 6px; - } - } - } - - .bottom-space { - height: 60px; - } - } - - .theme, - .artworks { - padding: 150px 0; - text-align: center; - background-image: url('/grid.svg'); - background-size: 24px 24px; - - h3 { - margin-top: 12px; - line-height: 1.5; - font-family: 'Source Code Pro', 'Courier Prime Code', Courier, monospace; - font-size: 1rem; - font-weight: 600; - color: #333; - - a { - color: #999; - font-size: 0.9rem; - - &:hover { - color: #333; - } - } - } - - img { - display: inline-block; - width: 200px; - margin: 0 30px; - - &.md { - width: 150px; - } - - &.sm { - width: 120px; - } - } - - .color { - display: inline-flex; - align-items: center; - justify-content: center; - width: 150px; - height: 150px; - border-radius: 50%; - font-size: 15px; - font-weight: 500; - font-family: Din; - color: #fff; - } - - .space { - display: block; - height: 36px; - } - .space.sm { - height: 12px; - } - .space.lg { - height: 120px; - } - } - - .api-doc-page { - header { - display: flex; - align-items: center; - top: 14px; - height: 42px; - width: 75%; - background-color: tranparent; - backdrop-filter: none; - - @media screen and (max-width: 900px) { - display: none; - } - - a { - color: var(--theme-color); - box-shadow: 0 1px 0 0 currentColor; - - &:hover { - box-shadow: none; - } - } - } - - section { - margin: 30px 0; - padding: 30px; - border: 1px solid #eee; - border-radius: 6px; - transition: border-color 0.15s ease-in; - opacity: 0.9; - - &:hover { - border-color: #aaa; - opacity: 1; - } - - .keyword { - color: var(--theme-color) - } - - h2 { - font-size: 1.5rem; - line-height: 1.5; - &.single-line { - font-size: 1.2rem; - } - } - - h3 { - margin-top: 30px; - font-size: 1.2rem; - color: #999; - } - - .jsdoc { - code { - background: #f6f3f3; - padding: 0 9px; - border-radius: 3px; - } - p { - padding-top: 3px; - line-height: 1.27; - color: #515151; - a { - color: #515151; - box-shadow: 0 1px 0 0 #aaa; - - &:hover { - box-shadow: none; - } - } - } - ul, ol { - padding-left: 1.5rem; - - li { - margin-top: 0.6rem; - } - } - ol { - list-style-type: decimal; - } - ul li:before { - position: absolute; - margin-left: -1rem; - color: #aaa; - content: '-'; - } - } - - h2 code, - pre code { - font-family: 'Dank Mono', 'Source Code Pro', 'Courier Prime Code', Courier, monospace; - } - - .def { - margin-top: 18px; - - pre { - font-size: 1.2rem; - font-weight: 600; - color: #000; - white-space: pre-wrap; - } - - .separator { - font-weight: 400; - color: #999; - } - } - } - - details > summary { - cursor: pointer; - color: #999; - } - } -} diff --git a/style/header.css b/style/header.css deleted file mode 100644 index 0dbc7bf..0000000 --- a/style/header.css +++ /dev/null @@ -1,70 +0,0 @@ -header { - position: sticky; - top: 0; - left: 0; - z-index: 99; - width: 100%; - height: var(--header-height); - background-color: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(6px); - - &.scrollable { - @media screen and (max-width: 900px) { - position: relative; - } - } - - .small { - height: 60px; - } - - .wrapper { - display: flex; - align-items: center; - justify-content: space-between; - width: 90%; - max-width: 1200px; - height: 100%; - margin: 0 auto; - } - - h1 a { - display: inline-block; - font-size: 1rem; - color: #333; - } - - nav ul { - li + li { - margin-left: 24px; - } - - li { - float: left; - height: 24px; - - a { - font-size: 13px; - line-height: 24px; - color: #333; - - &:hover { - color: #000; - } - } - a.icon { - display: inline-flex; - align-items: center; - width: 20px; - height: 20px; - font-size: 20px; - color: #454545; - transition: color 0.2s ease-in-out; - - &:hover { - color: #000; - } - } - } - } -} diff --git a/style/index.css b/style/index.css deleted file mode 100644 index 3b46bde..0000000 --- a/style/index.css +++ /dev/null @@ -1,72 +0,0 @@ -.index-page { - .logo { - position: relative; - top: 18px; - } - - h1 { - position: relative; - white-space: pre; - } - - section { - display: flex; - align-items: center; - justify-content: left; - flex-direction: column; - - h2 { - display: inline-block; - margin-bottom: 60px; - line-height: 1.5; - font-family: Gotham, 'Helvetica Neue', Helvetica, Arial, sans-serif; - letter-spacing: -1px; - font-size: 21px; - font-weight: 600; - text-align: center; - color: #111; - border-bottom: 3px solid #333; - } - - ul { - width: 90%; - max-width: 540px; - - li:first-child { - border-top: 1px solid #eee; - } - - li { - border-bottom: 1px solid #eee; - } - - a { - display: block; - padding: 15px 6px; - line-height: 1.27; - font-weight: 500; - color: inherit; - transition: all 160ms ease-out; - - &:hover { - color: #000; - background-color: #f6f6f6; - } - } - } - } - - footer { - display: flex; - align-items: center; - justify-content: left; - flex-direction: column; - padding: 120px 0 45px; - - p { - font-size: 14px; - line-height: 1.5; - color: #999; - } - } -} diff --git a/style/tailwind-preflight.css b/style/tailwind-preflight.css new file mode 100644 index 0000000..4e1d075 --- /dev/null +++ b/style/tailwind-preflight.css @@ -0,0 +1,368 @@ +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: currentColor; /* 2 */ +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -moz-tab-size: 4; /* 3 */ + tab-size: 4; /* 3 */ + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; /* 1 */ + line-height: inherit; /* 2 */ + font-size: 15px; +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ + outline: none; +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::placeholder, +textarea::placeholder { + opacity: 1; /* 1 */ + color: #9ca3af; /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* +Ensure the default browser behavior of the `hidden` attribute. +*/ + +[hidden] { + display: none; +} + +.dark { + color-schema: dark; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index e47bac3..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "lib": ["deno.ns", "dom"] - } -} \ No newline at end of file diff --git a/vercel.json b/vercel.json deleted file mode 100644 index d6695ec..0000000 --- a/vercel.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "functions": { - "api/**/*.{j,t}s": { - "runtime": "vercel-aleph@0.7.0" - } - } -} \ No newline at end of file From 32bab0bd0e42a0ccaddbf922609f086a816fe1ea Mon Sep 17 00:00:00 2001 From: X Date: Sat, 9 Apr 2022 16:16:58 +0800 Subject: [PATCH 02/41] Clean up --- routes/docs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/docs.tsx b/routes/docs.tsx index c69625b..e2d5225 100644 --- a/routes/docs.tsx +++ b/routes/docs.tsx @@ -1,7 +1,7 @@ import { ComponentType, Fragment, useEffect, useMemo, useState } from "react"; import { useRouter } from "aleph/react"; import util from "aleph/lib/util.ts"; -import Logo from "../components/Logo.tsx"; +import Logo from "~/components/Logo.tsx"; const description = "The Documentation for Aleph.js"; const ogImage = "https://alephjs.org/twitter_card.jpg"; From 75b5c64cf88571d540fa3093faa16b42ce5455f3 Mon Sep 17 00:00:00 2001 From: X Date: Sat, 9 Apr 2022 16:41:09 +0800 Subject: [PATCH 03/41] Use atomic css --- routes/index.tsx | 20 +++++++------------- server.tsx | 4 ++++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/routes/index.tsx b/routes/index.tsx index e6e4c1b..714b5bc 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -56,21 +56,15 @@ export default function Home() { -
-

The Fullstack Framework in Deno.

-

+

+

+ The Fullstack Framework in Deno. +

+

Aleph.js{" "} - gives you the best developer experience for building modern web - applications:
{" "} - TypeScript in Deno, ES module imports, file-system routing, SSR & - SSG,
HMR with Fast Refresh, and more. No config needed. + gives you the best developer experience for building web applications.

-

- Aleph.js{" "} - gives you the best developer experience for building modern web - applications in Deno. -

-
+
diff --git a/server.tsx b/server.tsx index 1843370..31b8482 100644 --- a/server.tsx +++ b/server.tsx @@ -1,10 +1,14 @@ import { Router } from "aleph/react"; import { serve } from "aleph/server"; import { renderToString } from "react-dom/server"; +import presetUno from "https://esm.sh/@unocss/preset-uno@0.30.3"; serve({ config: { routeFiles: "./routes/**/*.tsx", + atomicCSS: { + presets: [presetUno()], + }, }, ssr: (ctx) => renderToString(), }); From a3a06a33a8c15daed8ad331a9f65c86180615505 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 10 Apr 2022 00:31:58 +0800 Subject: [PATCH 04/41] Upgrade aleph --- .vscode/settings.json | 6 ++--- deno.json | 8 +++--- import_map.json | 6 ++--- routes/docs/api-reference/cli.tsx | 41 ------------------------------- server.tsx | 2 +- 5 files changed, 11 insertions(+), 52 deletions(-) delete mode 100644 routes/docs/api-reference/cli.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index 7af46cc..12bc4ca 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,8 @@ { "deno.enable": true, - "deno.unstable": true, - "deno.config": "./deno.json", - "deno.importMap": "./import_map.json", + "deno.lint": true, + "deno.config": "./deno.json", + "deno.importMap": "./import_map.json", "deno.suggest.imports.hosts": { "https://deno.land": true, "https://esm.sh": false diff --git a/deno.json b/deno.json index e8cb33b..d842666 100644 --- a/deno.json +++ b/deno.json @@ -7,15 +7,15 @@ "deno.ns" ], "types": [ - "https://deno.land/x/aleph_canary@0.0.66/types.d.ts" + "https://deno.land/x/aleph_canary@0.0.67/types.d.ts" ], "jsx": "react-jsx", "jsxImportSource": "https://esm.sh/react@17.0.2" }, "tasks": { - "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.66/cli.ts dev", - "start": "deno run -A https://deno.land/x/aleph_canary@0.0.66/cli.ts start", - "build": "deno run -A https://deno.land/x/aleph_canary@0.0.66/cli.ts build" + "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.67/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph_canary@0.0.67/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph_canary@0.0.67/cli.ts build" }, "fmt": {}, "lint": {} diff --git a/import_map.json b/import_map.json index bb76485..03a1f7c 100644 --- a/import_map.json +++ b/import_map.json @@ -1,9 +1,9 @@ { "imports": { "~/": "./", - "aleph/": "https://deno.land/x/aleph_canary@0.0.66/", - "aleph/server": "https://deno.land/x/aleph_canary@0.0.66/server/mod.ts", - "aleph/react": "https://deno.land/x/aleph_canary@0.0.66/framework/react/mod.ts", + "aleph/": "https://deno.land/x/aleph_canary@0.0.67/", + "aleph/server": "https://deno.land/x/aleph_canary@0.0.67/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph_canary@0.0.67/framework/react/mod.ts", "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", "react-dom/server": "https://esm.sh/react-dom@17.0.2/server" diff --git a/routes/docs/api-reference/cli.tsx b/routes/docs/api-reference/cli.tsx deleted file mode 100644 index e416ae2..0000000 --- a/routes/docs/api-reference/cli.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { join } from 'https://deno.land/std@0.106.0/path/mod.ts' -import { useDeno } from 'aleph/react' -import React from 'react' - -async function run(...cmd: string[]) { - const p = Deno.run({ - cmd, - stdout: 'piped', - stderr: 'inherit' - }) - const output = await p.output() - p.close() - return new TextDecoder().decode(output) -} - -export default function CLI() { - const { helpMessage } = useDeno(async () => { - return { - helpMessage: await run(Deno.execPath(), 'run', '-A', join(Deno.mainModule, '../../cli.ts'), '-h') - } - }) - - return ( -
-

CLI

-

Installation

-
$ deno run -A https://deno.land/x/aleph/install.ts
-

or use land without installation:

-
$ land aleph
-

Usage

-
{'$ aleph -h\n' + helpMessage.trim()}
-
- ) -} - -CLI.meta = { - title: 'CLI', - authors: ['ije'], - date: '2020-10-20', - editable: false -} diff --git a/server.tsx b/server.tsx index 31b8482..721aa78 100644 --- a/server.tsx +++ b/server.tsx @@ -1,7 +1,7 @@ +import presetUno from "https://esm.sh/@unocss/preset-uno@0.30.12"; import { Router } from "aleph/react"; import { serve } from "aleph/server"; import { renderToString } from "react-dom/server"; -import presetUno from "https://esm.sh/@unocss/preset-uno@0.30.3"; serve({ config: { From b7326f8c2a979a4579e24a122ad0cdf358bf1aae Mon Sep 17 00:00:00 2001 From: X Date: Sun, 10 Apr 2022 18:21:07 +0800 Subject: [PATCH 05/41] Upgrade aleph --- deno.json | 8 ++++---- import_map.json | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/deno.json b/deno.json index d842666..300d784 100644 --- a/deno.json +++ b/deno.json @@ -7,15 +7,15 @@ "deno.ns" ], "types": [ - "https://deno.land/x/aleph_canary@0.0.67/types.d.ts" + "https://deno.land/x/aleph_canary@0.0.68/types.d.ts" ], "jsx": "react-jsx", "jsxImportSource": "https://esm.sh/react@17.0.2" }, "tasks": { - "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.67/cli.ts dev", - "start": "deno run -A https://deno.land/x/aleph_canary@0.0.67/cli.ts start", - "build": "deno run -A https://deno.land/x/aleph_canary@0.0.67/cli.ts build" + "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.68/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph_canary@0.0.68/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph_canary@0.0.68/cli.ts build" }, "fmt": {}, "lint": {} diff --git a/import_map.json b/import_map.json index 03a1f7c..b2637f4 100644 --- a/import_map.json +++ b/import_map.json @@ -1,9 +1,9 @@ { "imports": { "~/": "./", - "aleph/": "https://deno.land/x/aleph_canary@0.0.67/", - "aleph/server": "https://deno.land/x/aleph_canary@0.0.67/server/mod.ts", - "aleph/react": "https://deno.land/x/aleph_canary@0.0.67/framework/react/mod.ts", + "aleph/": "https://deno.land/x/aleph_canary@0.0.68/", + "aleph/server": "https://deno.land/x/aleph_canary@0.0.68/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph_canary@0.0.68/framework/react/mod.ts", "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", "react-dom/server": "https://esm.sh/react-dom@17.0.2/server" From 7e36692432171494253c861b9f1ca8254f06a739 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 15:20:18 +0800 Subject: [PATCH 06/41] Upgrade aleph to 0.0.75 --- deno.json | 8 ++++---- import_map.json | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/deno.json b/deno.json index 300d784..de8424e 100644 --- a/deno.json +++ b/deno.json @@ -7,15 +7,15 @@ "deno.ns" ], "types": [ - "https://deno.land/x/aleph_canary@0.0.68/types.d.ts" + "https://deno.land/x/aleph_canary@0.0.75/types.d.ts" ], "jsx": "react-jsx", "jsxImportSource": "https://esm.sh/react@17.0.2" }, "tasks": { - "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.68/cli.ts dev", - "start": "deno run -A https://deno.land/x/aleph_canary@0.0.68/cli.ts start", - "build": "deno run -A https://deno.land/x/aleph_canary@0.0.68/cli.ts build" + "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.75/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph_canary@0.0.75/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph_canary@0.0.75/cli.ts build" }, "fmt": {}, "lint": {} diff --git a/import_map.json b/import_map.json index b2637f4..fc991dd 100644 --- a/import_map.json +++ b/import_map.json @@ -1,9 +1,9 @@ { "imports": { "~/": "./", - "aleph/": "https://deno.land/x/aleph_canary@0.0.68/", - "aleph/server": "https://deno.land/x/aleph_canary@0.0.68/server/mod.ts", - "aleph/react": "https://deno.land/x/aleph_canary@0.0.68/framework/react/mod.ts", + "aleph/": "https://deno.land/x/aleph_canary@0.0.75/", + "aleph/server": "https://deno.land/x/aleph_canary@0.0.75/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph_canary@0.0.75/framework/react/mod.ts", "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", "react-dom/server": "https://esm.sh/react-dom@17.0.2/server" From 44dc95114fc12ba04a7df411ab3e5a6694eea069 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 15:26:35 +0800 Subject: [PATCH 07/41] Add deploy action --- .github/workflows/deploy.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..e586164 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,26 @@ +name: Deploy +on: [push] + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + permissions: + id-token: write # Needed for auth with Deno Deploy + contents: read # Needed to clone the repository + + steps: + - name: Clone repository + uses: actions/checkout@v2 + + - name: Install Deno + uses: denoland/setup-deno@v1 + + - name: Build frontend_next + run: deno task build + + - name: Deploy to Deno Deploy + uses: denoland/deployctl@v1 + with: + project: aleph + entrypoint: dist/server.js \ No newline at end of file From b8e4e62159589b2c6874ec067f20668c12e9da23 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 15:33:18 +0800 Subject: [PATCH 08/41] Add deploy platform --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e586164..93ae43d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,7 +17,7 @@ jobs: uses: denoland/setup-deno@v1 - name: Build frontend_next - run: deno task build + run: deno task build --platform=deno-deploy - name: Deploy to Deno Deploy uses: denoland/deployctl@v1 From ff893fe3d97a39d39c89b85ef924502319d0ca05 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 15:34:49 +0800 Subject: [PATCH 09/41] Fix deploy action --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 93ae43d..108cbce 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,7 +17,7 @@ jobs: uses: denoland/setup-deno@v1 - name: Build frontend_next - run: deno task build --platform=deno-deploy + run: deno task build -- --platform=deno-deploy - name: Deploy to Deno Deploy uses: denoland/deployctl@v1 From e492b93ab4e11503e0e047d3a8eadaa033466919 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 15:49:26 +0800 Subject: [PATCH 10/41] Add deno lint action --- .github/workflows/deploy.yml | 5 ++++- deno.json | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 108cbce..ca50e97 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -15,8 +15,11 @@ jobs: - name: Install Deno uses: denoland/setup-deno@v1 + + - name: Deno Lint + run: deno lint - - name: Build frontend_next + - name: Build App run: deno task build -- --platform=deno-deploy - name: Deploy to Deno Deploy diff --git a/deno.json b/deno.json index de8424e..40ed1c3 100644 --- a/deno.json +++ b/deno.json @@ -18,5 +18,9 @@ "build": "deno run -A https://deno.land/x/aleph_canary@0.0.75/cli.ts build" }, "fmt": {}, - "lint": {} + "lint": { + "files": { + "exclude": ["dist/"] + } + } } \ No newline at end of file From 297bb00cd828ccea6e6c1cd5f31cf46c398e3656 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 16:16:20 +0800 Subject: [PATCH 11/41] Fix types --- routes/docs.tsx | 107 +++++++++--------------------------------------- 1 file changed, 20 insertions(+), 87 deletions(-) diff --git a/routes/docs.tsx b/routes/docs.tsx index e2d5225..61c3b10 100644 --- a/routes/docs.tsx +++ b/routes/docs.tsx @@ -1,11 +1,23 @@ -import { ComponentType, Fragment, useEffect, useMemo, useState } from "react"; +import { Fragment, useEffect, useMemo, useState } from "react"; import { useRouter } from "aleph/react"; import util from "aleph/lib/util.ts"; import Logo from "~/components/Logo.tsx"; +type Menu = { + name: string; + items: MenuItem[]; +}; + +type MenuItem = { + title: string; + path: string; + submenu?: MenuItem[]; + modifier?: React.ReactNode; +}; + const description = "The Documentation for Aleph.js"; const ogImage = "https://alephjs.org/twitter_card.jpg"; -const navMenu = [ +const navMenu: Menu[] = [ { name: "Documentation", items: [ @@ -84,9 +96,7 @@ interface Metadata { editable?: boolean; } -export default function Docs( - { Page }: { Page?: ComponentType & { meta: Metadata } }, -) { +export default function Docs() { const { url } = useRouter(); const [extended, setExtended] = useState( navMenu.map((m) => m.items).flat().filter((item) => item.submenu).reduce( @@ -124,16 +134,13 @@ export default function Docs( : url.pathname + ".md"; return `https://github.com/alephjs/alephjs.org/edit/master/pages${md}`; }, [url.pathname]); - const title = [ - Page?.meta.title, - !Page?.meta.title.endsWith("Aleph.js") && "Aleph.js", - ].filter(Boolean).join(" - "); + const title = "Documentation - Aleph.js"; const filteredNavMenu = useMemo(() => { if (searchWords === "") { return navMenu; } return navMenu.map((g) => { - const includes = (item: any) => + const includes = (item: MenuItem) => item.title.toLowerCase().includes(searchWords); return { ...g, @@ -183,9 +190,7 @@ export default function Docs( {title} - {Page?.meta.keywords && ( - - )} + {/* */} @@ -201,6 +206,7 @@ export default function Docs( setSearchWords(e.target.value.trim().toLowerCase()), 150, )} @@ -306,80 +312,7 @@ export default function Docs(
- {Page && } - {Page && ( - - )} - {(Page && Page.meta.editable !== false) && ( -

- Authors:  - {Array.isArray(Page.meta.authors) && - Page.meta.authors.map((name) => ( - - - - ))} - | - Edit this page on Github -

- )} - {!(Page && Page.meta.editable !== false) && ( -
- )} +

todo: loading markdown

); From 27c1bd62b478ad8a46a69703ef13364d29b1f20f Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 16:17:02 +0800 Subject: [PATCH 12/41] Rename --- .github/workflows/{deploy.yml => ci.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{deploy.yml => ci.yml} (100%) diff --git a/.github/workflows/deploy.yml b/.github/workflows/ci.yml similarity index 100% rename from .github/workflows/deploy.yml rename to .github/workflows/ci.yml From e92ea73144c2c86a1dfccc84912c7be606e3202c Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 16:55:46 +0800 Subject: [PATCH 13/41] WIP --- assets/logo.svg | 2 +- assets/main_title.svg | 4 +-- routes/index.tsx | 71 ++++++++++++++++++++++--------------------- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/assets/logo.svg b/assets/logo.svg index 9ff6364..e4a82e0 100644 --- a/assets/logo.svg +++ b/assets/logo.svg @@ -1,5 +1,5 @@ - + Aleph.js - + Aleph.js @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/routes/index.tsx b/routes/index.tsx index 714b5bc..8bbed48 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -1,6 +1,7 @@ +import { Head, useData } from "aleph/react"; +import { json } from "aleph/server"; import Button from "~/components/Button.tsx"; -const thisYear = (new Date()).getFullYear(); const title = "Aleph.js"; const about = "The Fullstack Framework in Deno."; const keywords = [ @@ -21,29 +22,23 @@ const keywords = [ "tooling", ]; const ogImage = "https://alephjs.org/twitter_card.jpg"; -const features = [ - { href: "/docs", title: "Zero Config" }, - { href: "/docs", title: "Typescript in Deno" }, - { href: "/docs/basic-features/import-from-npm", title: "ES Module Ready" }, - { href: "/docs/basic-features/import-maps", title: "Import Maps" }, - { - href: "/docs/basic-features/hmr-with-fast-refresh", - title: "HMR with Fast Refresh", - }, - { href: "/docs/basic-features/routing", title: "File-system Routing" }, - { href: "/docs/basic-features/ssr-and-ssg", title: "SSR & SSG" }, - { - href: "/docs/basic-features/built-in-css-support", - title: "Built-in CSS Support", + +export const data: Data = { + get: async () => { + const [logo, mainTitle] = await Promise.all([ + Deno.readTextFile("./assets/logo.svg"), + Deno.readTextFile("./assets/main_title.svg"), + ]); + return json({ icons: { logo, mainTitle } }); }, - { href: "/docs/advanced-features/jsx-magic", title: "JSX Magic" }, - { href: "/docs/advanced-features/using-plugins", title: "Plugin System" }, -]; +}; export default function Home() { + const { data: { icons } } = useData<{ icons: Record }>(); + return (
- + {title} @@ -55,7 +50,7 @@ export default function Home() { - +

The Fullstack Framework in Deno. @@ -72,22 +67,28 @@ export default function Home() {

+ +
+ + +
-
-

Features

-
    - {features.map(({ href, title }) => ( -
  • - {title} -
  • - ))} -
-
-
-

Copyright © {thisYear} postUI, Lab. All rights reserved.

-

Built by Aleph.js

-

(MIT License)

-
); } From 1dabbaaa83b82ae8cf16091f36e7d7bb6a01684c Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 17:41:56 +0800 Subject: [PATCH 14/41] WIP --- routes/docs.tsx | 18 +++++------------- routes/docs/$path+.tsx | 22 ++++++++++++++++++++++ routes/index.tsx | 33 --------------------------------- 3 files changed, 27 insertions(+), 46 deletions(-) create mode 100644 routes/docs/$path+.tsx diff --git a/routes/docs.tsx b/routes/docs.tsx index 61c3b10..e912a35 100644 --- a/routes/docs.tsx +++ b/routes/docs.tsx @@ -1,5 +1,5 @@ import { Fragment, useEffect, useMemo, useState } from "react"; -import { useRouter } from "aleph/react"; +import { Head, useRouter } from "aleph/react"; import util from "aleph/lib/util.ts"; import Logo from "~/components/Logo.tsx"; @@ -89,14 +89,7 @@ const navMenu: Menu[] = [ }, ]; -interface Metadata { - title: string; - authors: string[]; - keywords?: string[]; - editable?: boolean; -} - -export default function Docs() { +export default function Docs({ children }: { children: React.ReactNode }) { const { url } = useRouter(); const [extended, setExtended] = useState( navMenu.map((m) => m.items).flat().filter((item) => item.submenu).reduce( @@ -187,7 +180,7 @@ export default function Docs() { " ", )} > - + {title} {/* */} @@ -199,8 +192,7 @@ export default function Docs() { - - +
-

todo: loading markdown

+ {children}
); diff --git a/routes/docs/$path+.tsx b/routes/docs/$path+.tsx new file mode 100644 index 0000000..00a0c8a --- /dev/null +++ b/routes/docs/$path+.tsx @@ -0,0 +1,22 @@ +import { useData } from "aleph/react"; + +const data: Data = { + get: (req, ctx) => { + const { path } = ctx.params; + const markdown = ""; + // todo(pipiduck): read markdown file from $path + return new Response(JSON.stringify({ markdown }), { + headers: { "content-type": "application/json" }, + }); + }, +}; + +export default function Markdown() { + // todo(pipiduck): use `useData()` to get markdown content + + return ( +
+ todo: docs +
+ ); +} diff --git a/routes/index.tsx b/routes/index.tsx index 8bbed48..fd6b40a 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -23,19 +23,7 @@ const keywords = [ ]; const ogImage = "https://alephjs.org/twitter_card.jpg"; -export const data: Data = { - get: async () => { - const [logo, mainTitle] = await Promise.all([ - Deno.readTextFile("./assets/logo.svg"), - Deno.readTextFile("./assets/main_title.svg"), - ]); - return json({ icons: { logo, mainTitle } }); - }, -}; - export default function Home() { - const { data: { icons } } = useData<{ icons: Record }>(); - return (
@@ -67,27 +55,6 @@ export default function Home() {
- -
- - -
); From 350657f14b7cdf09ce50996c21fc11c8affa36e4 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 17 Apr 2022 17:43:31 +0800 Subject: [PATCH 15/41] Move docs dir --- {routes/docs => docs}/advanced-features/custom-app.md | 0 {routes/docs => docs}/advanced-features/custom-error-page.md | 0 {routes/docs => docs}/advanced-features/custom-server.md | 0 {routes/docs => docs}/advanced-features/dynamic-importing.md | 0 {routes/docs => docs}/advanced-features/jsx-magic.md | 0 {routes/docs => docs}/advanced-features/use-deno-hook.md | 0 {routes/docs => docs}/advanced-features/using-plugins.md | 0 {routes/docs => docs}/api-reference/config.md | 0 {routes/docs => docs}/api-reference/framework-api.md | 0 {routes/docs => docs}/api-reference/plugin-api.md | 0 {routes/docs => docs}/basic-features/apis.md | 0 {routes/docs => docs}/basic-features/built-in-css-support.md | 0 {routes/docs => docs}/basic-features/hmr-with-fast-refresh.md | 0 {routes/docs => docs}/basic-features/import-from-npm.md | 0 {routes/docs => docs}/basic-features/import-maps.md | 0 {routes/docs => docs}/basic-features/pages.md | 0 {routes/docs => docs}/basic-features/routing.md | 0 {routes/docs => docs}/basic-features/ssr-and-ssg.md | 0 {routes/docs => docs}/basic-features/static-file-serving.md | 0 {routes/docs => docs}/browser-support.md | 0 {routes/docs => docs}/deployment.md | 0 {routes/docs => docs}/design/artworks.tsx | 0 {routes/docs => docs}/design/theme.tsx | 0 {routes/docs => docs}/get-started.md | 0 {routes/docs => docs}/index.md | 0 {routes/docs => docs}/plugins/community-plugins.md | 0 {routes/docs => docs}/plugins/official-plugins.md | 0 27 files changed, 0 insertions(+), 0 deletions(-) rename {routes/docs => docs}/advanced-features/custom-app.md (100%) rename {routes/docs => docs}/advanced-features/custom-error-page.md (100%) rename {routes/docs => docs}/advanced-features/custom-server.md (100%) rename {routes/docs => docs}/advanced-features/dynamic-importing.md (100%) rename {routes/docs => docs}/advanced-features/jsx-magic.md (100%) rename {routes/docs => docs}/advanced-features/use-deno-hook.md (100%) rename {routes/docs => docs}/advanced-features/using-plugins.md (100%) rename {routes/docs => docs}/api-reference/config.md (100%) rename {routes/docs => docs}/api-reference/framework-api.md (100%) rename {routes/docs => docs}/api-reference/plugin-api.md (100%) rename {routes/docs => docs}/basic-features/apis.md (100%) rename {routes/docs => docs}/basic-features/built-in-css-support.md (100%) rename {routes/docs => docs}/basic-features/hmr-with-fast-refresh.md (100%) rename {routes/docs => docs}/basic-features/import-from-npm.md (100%) rename {routes/docs => docs}/basic-features/import-maps.md (100%) rename {routes/docs => docs}/basic-features/pages.md (100%) rename {routes/docs => docs}/basic-features/routing.md (100%) rename {routes/docs => docs}/basic-features/ssr-and-ssg.md (100%) rename {routes/docs => docs}/basic-features/static-file-serving.md (100%) rename {routes/docs => docs}/browser-support.md (100%) rename {routes/docs => docs}/deployment.md (100%) rename {routes/docs => docs}/design/artworks.tsx (100%) rename {routes/docs => docs}/design/theme.tsx (100%) rename {routes/docs => docs}/get-started.md (100%) rename {routes/docs => docs}/index.md (100%) rename {routes/docs => docs}/plugins/community-plugins.md (100%) rename {routes/docs => docs}/plugins/official-plugins.md (100%) diff --git a/routes/docs/advanced-features/custom-app.md b/docs/advanced-features/custom-app.md similarity index 100% rename from routes/docs/advanced-features/custom-app.md rename to docs/advanced-features/custom-app.md diff --git a/routes/docs/advanced-features/custom-error-page.md b/docs/advanced-features/custom-error-page.md similarity index 100% rename from routes/docs/advanced-features/custom-error-page.md rename to docs/advanced-features/custom-error-page.md diff --git a/routes/docs/advanced-features/custom-server.md b/docs/advanced-features/custom-server.md similarity index 100% rename from routes/docs/advanced-features/custom-server.md rename to docs/advanced-features/custom-server.md diff --git a/routes/docs/advanced-features/dynamic-importing.md b/docs/advanced-features/dynamic-importing.md similarity index 100% rename from routes/docs/advanced-features/dynamic-importing.md rename to docs/advanced-features/dynamic-importing.md diff --git a/routes/docs/advanced-features/jsx-magic.md b/docs/advanced-features/jsx-magic.md similarity index 100% rename from routes/docs/advanced-features/jsx-magic.md rename to docs/advanced-features/jsx-magic.md diff --git a/routes/docs/advanced-features/use-deno-hook.md b/docs/advanced-features/use-deno-hook.md similarity index 100% rename from routes/docs/advanced-features/use-deno-hook.md rename to docs/advanced-features/use-deno-hook.md diff --git a/routes/docs/advanced-features/using-plugins.md b/docs/advanced-features/using-plugins.md similarity index 100% rename from routes/docs/advanced-features/using-plugins.md rename to docs/advanced-features/using-plugins.md diff --git a/routes/docs/api-reference/config.md b/docs/api-reference/config.md similarity index 100% rename from routes/docs/api-reference/config.md rename to docs/api-reference/config.md diff --git a/routes/docs/api-reference/framework-api.md b/docs/api-reference/framework-api.md similarity index 100% rename from routes/docs/api-reference/framework-api.md rename to docs/api-reference/framework-api.md diff --git a/routes/docs/api-reference/plugin-api.md b/docs/api-reference/plugin-api.md similarity index 100% rename from routes/docs/api-reference/plugin-api.md rename to docs/api-reference/plugin-api.md diff --git a/routes/docs/basic-features/apis.md b/docs/basic-features/apis.md similarity index 100% rename from routes/docs/basic-features/apis.md rename to docs/basic-features/apis.md diff --git a/routes/docs/basic-features/built-in-css-support.md b/docs/basic-features/built-in-css-support.md similarity index 100% rename from routes/docs/basic-features/built-in-css-support.md rename to docs/basic-features/built-in-css-support.md diff --git a/routes/docs/basic-features/hmr-with-fast-refresh.md b/docs/basic-features/hmr-with-fast-refresh.md similarity index 100% rename from routes/docs/basic-features/hmr-with-fast-refresh.md rename to docs/basic-features/hmr-with-fast-refresh.md diff --git a/routes/docs/basic-features/import-from-npm.md b/docs/basic-features/import-from-npm.md similarity index 100% rename from routes/docs/basic-features/import-from-npm.md rename to docs/basic-features/import-from-npm.md diff --git a/routes/docs/basic-features/import-maps.md b/docs/basic-features/import-maps.md similarity index 100% rename from routes/docs/basic-features/import-maps.md rename to docs/basic-features/import-maps.md diff --git a/routes/docs/basic-features/pages.md b/docs/basic-features/pages.md similarity index 100% rename from routes/docs/basic-features/pages.md rename to docs/basic-features/pages.md diff --git a/routes/docs/basic-features/routing.md b/docs/basic-features/routing.md similarity index 100% rename from routes/docs/basic-features/routing.md rename to docs/basic-features/routing.md diff --git a/routes/docs/basic-features/ssr-and-ssg.md b/docs/basic-features/ssr-and-ssg.md similarity index 100% rename from routes/docs/basic-features/ssr-and-ssg.md rename to docs/basic-features/ssr-and-ssg.md diff --git a/routes/docs/basic-features/static-file-serving.md b/docs/basic-features/static-file-serving.md similarity index 100% rename from routes/docs/basic-features/static-file-serving.md rename to docs/basic-features/static-file-serving.md diff --git a/routes/docs/browser-support.md b/docs/browser-support.md similarity index 100% rename from routes/docs/browser-support.md rename to docs/browser-support.md diff --git a/routes/docs/deployment.md b/docs/deployment.md similarity index 100% rename from routes/docs/deployment.md rename to docs/deployment.md diff --git a/routes/docs/design/artworks.tsx b/docs/design/artworks.tsx similarity index 100% rename from routes/docs/design/artworks.tsx rename to docs/design/artworks.tsx diff --git a/routes/docs/design/theme.tsx b/docs/design/theme.tsx similarity index 100% rename from routes/docs/design/theme.tsx rename to docs/design/theme.tsx diff --git a/routes/docs/get-started.md b/docs/get-started.md similarity index 100% rename from routes/docs/get-started.md rename to docs/get-started.md diff --git a/routes/docs/index.md b/docs/index.md similarity index 100% rename from routes/docs/index.md rename to docs/index.md diff --git a/routes/docs/plugins/community-plugins.md b/docs/plugins/community-plugins.md similarity index 100% rename from routes/docs/plugins/community-plugins.md rename to docs/plugins/community-plugins.md diff --git a/routes/docs/plugins/official-plugins.md b/docs/plugins/official-plugins.md similarity index 100% rename from routes/docs/plugins/official-plugins.md rename to docs/plugins/official-plugins.md From aa36a7b00bbcfe7f2b14ab16f6870c98e9970bef Mon Sep 17 00:00:00 2001 From: X Date: Wed, 20 Apr 2022 21:30:23 +0800 Subject: [PATCH 16/41] Upgrade aleph --- deno.json | 8 ++++---- import_map.json | 7 ++++--- server.tsx | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/deno.json b/deno.json index 40ed1c3..b79df23 100644 --- a/deno.json +++ b/deno.json @@ -7,15 +7,15 @@ "deno.ns" ], "types": [ - "https://deno.land/x/aleph_canary@0.0.75/types.d.ts" + "https://deno.land/x/aleph@1.0.0-alpha.2/types.d.ts" ], "jsx": "react-jsx", "jsxImportSource": "https://esm.sh/react@17.0.2" }, "tasks": { - "dev": "deno run -A https://deno.land/x/aleph_canary@0.0.75/cli.ts dev", - "start": "deno run -A https://deno.land/x/aleph_canary@0.0.75/cli.ts start", - "build": "deno run -A https://deno.land/x/aleph_canary@0.0.75/cli.ts build" + "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.2/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.2/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.2/cli.ts build" }, "fmt": {}, "lint": { diff --git a/import_map.json b/import_map.json index fc991dd..2eb9c22 100644 --- a/import_map.json +++ b/import_map.json @@ -1,9 +1,10 @@ { "imports": { "~/": "./", - "aleph/": "https://deno.land/x/aleph_canary@0.0.75/", - "aleph/server": "https://deno.land/x/aleph_canary@0.0.75/server/mod.ts", - "aleph/react": "https://deno.land/x/aleph_canary@0.0.75/framework/react/mod.ts", + "@unocss/": "https://deno.land/x/aleph@1.0.0-alpha.2/lib/@unocss/", + "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.2/", + "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.2/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.2/framework/react/mod.ts", "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", "react-dom/server": "https://esm.sh/react-dom@17.0.2/server" diff --git a/server.tsx b/server.tsx index 721aa78..925f6a8 100644 --- a/server.tsx +++ b/server.tsx @@ -1,11 +1,11 @@ -import presetUno from "https://esm.sh/@unocss/preset-uno@0.30.12"; +import presetUno from "@unocss/preset-uno.ts"; import { Router } from "aleph/react"; import { serve } from "aleph/server"; import { renderToString } from "react-dom/server"; serve({ config: { - routeFiles: "./routes/**/*.tsx", + routes: "./routes/**/*.tsx", atomicCSS: { presets: [presetUno()], }, From 79dcd42ed44e65d9da999c214025a844cb1977b2 Mon Sep 17 00:00:00 2001 From: X Date: Wed, 20 Apr 2022 21:30:45 +0800 Subject: [PATCH 17/41] Format --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca50e97..f251239 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,4 +26,4 @@ jobs: uses: denoland/deployctl@v1 with: project: aleph - entrypoint: dist/server.js \ No newline at end of file + entrypoint: dist/server.js From d1d17490f24f2e2697b29ad5d12abd951385d276 Mon Sep 17 00:00:00 2001 From: X Date: Wed, 20 Apr 2022 21:32:15 +0800 Subject: [PATCH 18/41] Update github workflow for deploy deploy --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f251239..1edc401 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: run: deno lint - name: Build App - run: deno task build -- --platform=deno-deploy + run: deno task build - name: Deploy to Deno Deploy uses: denoland/deployctl@v1 From 8ccab18d78906256bd3241c3341c27c818398174 Mon Sep 17 00:00:00 2001 From: X Date: Wed, 20 Apr 2022 23:26:45 +0800 Subject: [PATCH 19/41] Upgrade aleph --- deno.json | 8 ++++---- import_map.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/deno.json b/deno.json index b79df23..64bce94 100644 --- a/deno.json +++ b/deno.json @@ -7,15 +7,15 @@ "deno.ns" ], "types": [ - "https://deno.land/x/aleph@1.0.0-alpha.2/types.d.ts" + "https://deno.land/x/aleph@1.0.0-alpha.3/types.d.ts" ], "jsx": "react-jsx", "jsxImportSource": "https://esm.sh/react@17.0.2" }, "tasks": { - "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.2/cli.ts dev", - "start": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.2/cli.ts start", - "build": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.2/cli.ts build" + "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.3/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.3/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.3/cli.ts build" }, "fmt": {}, "lint": { diff --git a/import_map.json b/import_map.json index 2eb9c22..ae09678 100644 --- a/import_map.json +++ b/import_map.json @@ -1,10 +1,10 @@ { "imports": { "~/": "./", - "@unocss/": "https://deno.land/x/aleph@1.0.0-alpha.2/lib/@unocss/", - "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.2/", - "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.2/server/mod.ts", - "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.2/framework/react/mod.ts", + "@unocss/": "https://deno.land/x/aleph@1.0.0-alpha.3/lib/@unocss/", + "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.3/", + "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.3/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.3/framework/react/mod.ts", "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", "react-dom/server": "https://esm.sh/react-dom@17.0.2/server" From 8f389395154f271f0e6eee014d4b29abc839fe3c Mon Sep 17 00:00:00 2001 From: X Date: Sat, 23 Apr 2022 16:35:46 +0800 Subject: [PATCH 20/41] Use react 18 --- deno.json | 10 +++++----- import_map.json | 13 ++++++------- index.html | 3 +-- main.tsx | 4 ++-- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/deno.json b/deno.json index 64bce94..e9e1922 100644 --- a/deno.json +++ b/deno.json @@ -7,15 +7,15 @@ "deno.ns" ], "types": [ - "https://deno.land/x/aleph@1.0.0-alpha.3/types.d.ts" + "https://deno.land/x/aleph@1.0.0-alpha.6/types.d.ts" ], "jsx": "react-jsx", - "jsxImportSource": "https://esm.sh/react@17.0.2" + "jsxImportSource": "https://esm.sh/react@18.0.0" }, "tasks": { - "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.3/cli.ts dev", - "start": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.3/cli.ts start", - "build": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.3/cli.ts build" + "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.6/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.6/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.6/cli.ts build" }, "fmt": {}, "lint": { diff --git a/import_map.json b/import_map.json index ae09678..af5af9a 100644 --- a/import_map.json +++ b/import_map.json @@ -1,13 +1,12 @@ { "imports": { "~/": "./", - "@unocss/": "https://deno.land/x/aleph@1.0.0-alpha.3/lib/@unocss/", - "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.3/", - "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.3/server/mod.ts", - "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.3/framework/react/mod.ts", - "react": "https://esm.sh/react@17.0.2", - "react-dom": "https://esm.sh/react-dom@17.0.2", - "react-dom/server": "https://esm.sh/react-dom@17.0.2/server" + "@unocss/": "https://deno.land/x/aleph@1.0.0-alpha.6/lib/@unocss/", + "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.6/", + "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.6/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.6/framework/react/mod.ts", + "react": "https://esm.sh/react@18.0.0", + "react-dom/": "https://esm.sh/react-dom@18.0.0/" }, "scopes": {} } \ No newline at end of file diff --git a/index.html b/index.html index 4700581..916a317 100644 --- a/index.html +++ b/index.html @@ -6,11 +6,10 @@ - -
+
diff --git a/main.tsx b/main.tsx index f4d3365..9748aa8 100644 --- a/main.tsx +++ b/main.tsx @@ -1,4 +1,4 @@ -import { hydrate } from "react-dom"; import { Router } from "aleph/react"; +import { hydrateRoot } from "react-dom/client"; -hydrate(, document.querySelector("#root")); +hydrateRoot(document.querySelector("#root")!, ); From 38638a59d846a34460db285432dfaf8b224621a0 Mon Sep 17 00:00:00 2001 From: X Date: Sat, 23 Apr 2022 17:36:33 +0800 Subject: [PATCH 21/41] Use gfm --- deno.json | 8 +++--- docs/get-started.md | 2 +- import_map.json | 8 +++--- index.html | 3 ++- routes/docs.tsx | 16 +++++------- routes/docs/$path+.tsx | 55 +++++++++++++++++++++++++++++++++--------- 6 files changed, 60 insertions(+), 32 deletions(-) diff --git a/deno.json b/deno.json index e9e1922..1c4eef2 100644 --- a/deno.json +++ b/deno.json @@ -7,15 +7,15 @@ "deno.ns" ], "types": [ - "https://deno.land/x/aleph@1.0.0-alpha.6/types.d.ts" + "https://deno.land/x/aleph@1.0.0-alpha.5/types.d.ts" ], "jsx": "react-jsx", "jsxImportSource": "https://esm.sh/react@18.0.0" }, "tasks": { - "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.6/cli.ts dev", - "start": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.6/cli.ts start", - "build": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.6/cli.ts build" + "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.5/cli.ts dev", + "start": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.5/cli.ts start", + "build": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.5/cli.ts build" }, "fmt": {}, "lint": { diff --git a/docs/get-started.md b/docs/get-started.md index c6a52cc..acfcfae 100644 --- a/docs/get-started.md +++ b/docs/get-started.md @@ -5,7 +5,7 @@ authors: - razermoon --- -# Get Started +# Get Started! Welcome to use **Aleph.js**! diff --git a/import_map.json b/import_map.json index af5af9a..5c55e89 100644 --- a/import_map.json +++ b/import_map.json @@ -1,10 +1,10 @@ { "imports": { "~/": "./", - "@unocss/": "https://deno.land/x/aleph@1.0.0-alpha.6/lib/@unocss/", - "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.6/", - "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.6/server/mod.ts", - "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.6/framework/react/mod.ts", + "@unocss/": "https://deno.land/x/aleph@1.0.0-alpha.5/lib/@unocss/", + "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.5/", + "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.5/server/mod.ts", + "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.5/framework/react/mod.ts", "react": "https://esm.sh/react@18.0.0", "react-dom/": "https://esm.sh/react-dom@18.0.0/" }, diff --git a/index.html b/index.html index 916a317..4700581 100644 --- a/index.html +++ b/index.html @@ -6,10 +6,11 @@ + -
+
diff --git a/routes/docs.tsx b/routes/docs.tsx index e912a35..1c8d740 100644 --- a/routes/docs.tsx +++ b/routes/docs.tsx @@ -176,9 +176,7 @@ export default function Docs({ children }: { children: React.ReactNode }) { return (
{title} @@ -194,6 +192,7 @@ export default function Docs({ children }: { children: React.ReactNode }) { -
- {children} -
+ {children}
); } diff --git a/routes/docs/$path+.tsx b/routes/docs/$path+.tsx index 00a0c8a..8753d24 100644 --- a/routes/docs/$path+.tsx +++ b/routes/docs/$path+.tsx @@ -1,22 +1,53 @@ -import { useData } from "aleph/react"; +import { Head, useData } from "aleph/react"; +import { CSS, render } from "https://deno.land/x/gfm@0.1.20/mod.ts"; -const data: Data = { - get: (req, ctx) => { - const { path } = ctx.params; - const markdown = ""; - // todo(pipiduck): read markdown file from $path - return new Response(JSON.stringify({ markdown }), { - headers: { "content-type": "application/json" }, - }); +import "https://esm.sh/prismjs@1.27.0/components/prism-jsx?no-check"; +import "https://esm.sh/prismjs@1.27.0/components/prism-bash?no-check"; +import "https://esm.sh/prismjs@1.27.0/components/prism-typescript?no-check"; + +export const data: Data = { + get: async (req, ctx) => { + try { + const { path } = ctx.params; + const markdown = await Deno.readTextFile(`./docs/${path}.md`); + const html = render(markdown); + // todo(pipiduck): read markdown file from $path + return ctx.json({ html }); + } catch (error) { + if (error instanceof Deno.errors.NotFound) { + return ctx.json({ error: "not-found" }); + } + return ctx.json({ error: error.message }); + } }, }; export default function Markdown() { // todo(pipiduck): use `useData()` to get markdown content + const { data: { html, error } } = useData< + { html?: string; error?: string } + >(); + + if (error) { + if (error === "not-found") { + return
Not Found
; + } + return
{error}
; + } + return ( -
- todo: docs -
+ <> + + + +
+ ); } From f5cb0062d7da9a4afa2957756a7f024be1b90d44 Mon Sep 17 00:00:00 2001 From: X Date: Sat, 23 Apr 2022 18:10:11 +0800 Subject: [PATCH 22/41] Use react 17 --- deno.json | 2 +- import_map.json | 5 +++-- main.tsx | 4 ++-- routes/docs.tsx | 1 - routes/docs/$path+.tsx | 17 ++++++++++++----- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/deno.json b/deno.json index 1c4eef2..f46d166 100644 --- a/deno.json +++ b/deno.json @@ -10,7 +10,7 @@ "https://deno.land/x/aleph@1.0.0-alpha.5/types.d.ts" ], "jsx": "react-jsx", - "jsxImportSource": "https://esm.sh/react@18.0.0" + "jsxImportSource": "https://esm.sh/react@17.0.2" }, "tasks": { "dev": "deno run -A https://deno.land/x/aleph@1.0.0-alpha.5/cli.ts dev", diff --git a/import_map.json b/import_map.json index 5c55e89..2195b4a 100644 --- a/import_map.json +++ b/import_map.json @@ -5,8 +5,9 @@ "aleph/": "https://deno.land/x/aleph@1.0.0-alpha.5/", "aleph/server": "https://deno.land/x/aleph@1.0.0-alpha.5/server/mod.ts", "aleph/react": "https://deno.land/x/aleph@1.0.0-alpha.5/framework/react/mod.ts", - "react": "https://esm.sh/react@18.0.0", - "react-dom/": "https://esm.sh/react-dom@18.0.0/" + "react": "https://esm.sh/react@17.0.2", + "react-dom": "https://esm.sh/react-dom@17.0.2", + "react-dom/": "https://esm.sh/react-dom@17.0.2/" }, "scopes": {} } \ No newline at end of file diff --git a/main.tsx b/main.tsx index 9748aa8..4e6be39 100644 --- a/main.tsx +++ b/main.tsx @@ -1,4 +1,4 @@ import { Router } from "aleph/react"; -import { hydrateRoot } from "react-dom/client"; +import { hydrate } from "react-dom"; -hydrateRoot(document.querySelector("#root")!, ); +hydrate(, document.querySelector("#root")); diff --git a/routes/docs.tsx b/routes/docs.tsx index 1c8d740..ef2c0df 100644 --- a/routes/docs.tsx +++ b/routes/docs.tsx @@ -192,7 +192,6 @@ export default function Docs({ children }: { children: React.ReactNode }) { - {children} +
+ {children} +
); diff --git a/routes/docs/$path+.tsx b/routes/docs/$path+.tsx deleted file mode 100644 index d8fd5fd..0000000 --- a/routes/docs/$path+.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Head, useData } from "aleph/react"; - -type DataProps = { - html?: string; - meta?: { title?: string; authors?: string[] }; - error?: string; - status?: number; -}; - -export const data: Data = { - get: async (req, ctx) => { - try { - const { path } = ctx.params; - const { render, safeLoadFront } = await import("../../utils/gfm.ts"); - const markdown = await Deno.readTextFile(`./docs/${path}.md`); - const { __content, ...meta } = safeLoadFront(markdown); - const html = render(__content); - return { html, meta }; - } catch (error) { - if (error instanceof Deno.errors.NotFound) { - return { error: "Not found", status: 404 }; - } - return { error: error.message, status: 500 }; - } - }, -}; - -export default function Markdown() { - const { data: { html, meta, error, status } } = useData(); - - if (error) { - if (status === 404) { - return
Not Found
; - } - return
{error}
; - } - - return ( - <> - - {meta?.title && {meta.title}} - {meta?.title && } - {meta?.title && } - -
- - ); -} diff --git a/routes/docs/api-reference/framework/react.md b/routes/docs/api-reference/framework/react.md new file mode 100644 index 0000000..95f1cae --- /dev/null +++ b/routes/docs/api-reference/framework/react.md @@ -0,0 +1,9 @@ +--- +title: React +authors: + - ije + - razermoon +--- + +# React + diff --git a/routes/docs/api-reference/framework/vue.md b/routes/docs/api-reference/framework/vue.md new file mode 100644 index 0000000..b1760b7 --- /dev/null +++ b/routes/docs/api-reference/framework/vue.md @@ -0,0 +1,9 @@ +--- +title: Vue +authors: + - ije + - razermoon +--- + +# Vue + diff --git a/docs/api-reference/plugin-api.md b/routes/docs/api-reference/middleware.md similarity index 99% rename from docs/api-reference/plugin-api.md rename to routes/docs/api-reference/middleware.md index d8e4348..5d38f5e 100644 --- a/docs/api-reference/plugin-api.md +++ b/routes/docs/api-reference/middleware.md @@ -4,7 +4,7 @@ authors: - ije --- -# Plugin API +# Middleware API In Aleph.js, a **Plugin** is an object with a `name` and a `setup` method. The `setup` method will be invoked once before the Aleph server runtime is diff --git a/docs/api-reference/config.md b/routes/docs/api-reference/server-config.md similarity index 100% rename from docs/api-reference/config.md rename to routes/docs/api-reference/server-config.md diff --git a/docs/basic-concepts/built-in-css-support.md b/routes/docs/basic-concepts/css-support.md similarity index 98% rename from docs/basic-concepts/built-in-css-support.md rename to routes/docs/basic-concepts/css-support.md index cbfe52f..aa6e8ce 100644 --- a/docs/basic-concepts/built-in-css-support.md +++ b/routes/docs/basic-concepts/css-support.md @@ -1,10 +1,10 @@ --- -title: Built-in CSS Support +title: CSS Support authors: - ije --- -# Built-in CSS Support +# CSS Support Aleph.js allows you to import **CSS** files with ESM syntax: diff --git a/docs/basic-concepts/hmr-with-fast-refresh.md b/routes/docs/basic-concepts/hmr.md similarity index 96% rename from docs/basic-concepts/hmr-with-fast-refresh.md rename to routes/docs/basic-concepts/hmr.md index fcd8dc4..6d55ee5 100644 --- a/docs/basic-concepts/hmr-with-fast-refresh.md +++ b/routes/docs/basic-concepts/hmr.md @@ -1,11 +1,11 @@ --- -title: HMR with Fast Refresh +title: Hot Module Replacement authors: - ije - razermoon --- -# HMR with Fast Refresh +# Hot Module Replacement Hot Module Replacement (or HMR) allows modules to be updated at runtime without the need for a full refresh during **development**. To support this, Aleph.js's built-in **HMR** module creates a **WebSocket** connection to the dev server on the client, and the server listens for file changes. Once the HMR client gets an update signal from the server, Aleph.js will re-import the updated module. diff --git a/docs/basic-concepts/import-from-npm.md b/routes/docs/basic-concepts/import-from-npm.md similarity index 100% rename from docs/basic-concepts/import-from-npm.md rename to routes/docs/basic-concepts/import-from-npm.md diff --git a/docs/basic-concepts/import-maps.md b/routes/docs/basic-concepts/import-maps.md similarity index 100% rename from docs/basic-concepts/import-maps.md rename to routes/docs/basic-concepts/import-maps.md diff --git a/routes/docs/basic-concepts/routing.md b/routes/docs/basic-concepts/routing.md new file mode 100644 index 0000000..137c618 --- /dev/null +++ b/routes/docs/basic-concepts/routing.md @@ -0,0 +1,71 @@ +--- +title: Routing +authors: + - ije + - razermoon +--- + +# Routing + +Aleph.js has a file-system based router. When a file (`.js`, `.jsx`, `.ts`, +`.tsx`, and `.mjs`) is added to the `routes` directory, it is automatically +available as a route. You can configruate the `router` in `server.ts`. + +```js +// server.ts + +import { server } from "aleph/server"; + +serve({ + router: { + // use glob + glob: "./routes/**/*.{tsx,jsx,mdx}", + + // use dir prefix and exts + dir: "./routes", + exts: [".tsx", ".jsx", ".mdx"], + }, +}); +``` + +### Index Routes + +The router will automatically route files named `index` to the root of the +directory. + +- `pages/index.tsx` → `/` +- `pages/blog/index.tsx` → `/blog` + +### Dynamic Routes + +To match a dynamic segment, you can use bracket syntax or start the segment with +**$**: + +- `pages/blog/$slug.tsx` → `/blog/:slug` (`/blog/hello-world`) +- `pages/$username/settings.tsx` → `/:username/settings` (`/foo/settings`) +- `pages/post/$all+.tsx` → `/post/*` (`/post/2020/id/title`) + +### Nested Routes + +Aleph.js supports nested route structures like: + +- `pages/blog.tsx` +- `pages/blog/$slug.tsx` + +In the example, routes in `/blog/:slug` will be rendered under the +`pages/blog.tsx`, that is useful to create a **layout** for pages: + +```jsx +import BlogHeader from "../components/blog-header.tsx"; + +export default function Blog({ children }) { + return ( + <> + +
+ {children} +
+ + ); +} +``` diff --git a/routes/docs/basic-concepts/server.md b/routes/docs/basic-concepts/server.md new file mode 100644 index 0000000..128777b --- /dev/null +++ b/routes/docs/basic-concepts/server.md @@ -0,0 +1,7 @@ +--- +title: Server +authors: + - ije +--- + +# Server diff --git a/docs/basic-concepts/ssr-and-ssg.md b/routes/docs/basic-concepts/ssr.md similarity index 98% rename from docs/basic-concepts/ssr-and-ssg.md rename to routes/docs/basic-concepts/ssr.md index 545ec94..1b50543 100644 --- a/docs/basic-concepts/ssr-and-ssg.md +++ b/routes/docs/basic-concepts/ssr.md @@ -1,12 +1,12 @@ --- -title: SSR & SSG +title: Server-side Rendering authors: - ije - Serdar Sever - razermoon --- -# SSR & SSG +# Server-side Rendering By default, Aleph.js **pre-renders** every page. This means that Aleph.js generates HTML for each page in advance, instead of rendering it with client-side JavaScript. Pre-rendering can result in better performance and SEO. diff --git a/docs/basic-concepts/static-file-serving.md b/routes/docs/basic-concepts/static-file-serving.md similarity index 100% rename from docs/basic-concepts/static-file-serving.md rename to routes/docs/basic-concepts/static-file-serving.md diff --git a/routes/docs/basic-concepts/unocss.md b/routes/docs/basic-concepts/unocss.md new file mode 100644 index 0000000..317095d --- /dev/null +++ b/routes/docs/basic-concepts/unocss.md @@ -0,0 +1,7 @@ +--- +title: Unocss +authors: + - ije +--- + +# Unocss diff --git a/routes/docs/browser-support.md b/routes/docs/browser-support.md new file mode 100644 index 0000000..763365e --- /dev/null +++ b/routes/docs/browser-support.md @@ -0,0 +1,33 @@ +--- +title: Browser Support +authors: + - ije + - razermoon +--- + +# Browser Support + +Aleph.js requires a modern browser to support +[native ES module imports](https://caniuse.com/#feat=es6-module) and **dynamic +imports**: + +- Chrome >= 61 +- Edge >= 16 +- Firefox >= 60 +- Safari >= 11 +- Opera >= 48 + +## Build Target + +Aleph.js uses **esbuild** to bundle modules at optimization time for production. +You can set the `optimization.buildTarget` in the server config. + +```js +import { serve } from "aleph/server"; + +serve({ + optimization: { + buildTarget: "es2020", + }, +}); +``` diff --git a/routes/docs/deployment.md b/routes/docs/deployment.md new file mode 100644 index 0000000..55d7af3 --- /dev/null +++ b/routes/docs/deployment.md @@ -0,0 +1,22 @@ +--- +title: Deployment +authors: + - ije + - razermoon +--- + +# Deployment on your own host with Deno CLI + +You can run your app in production mode by `deno` CLI. + +```bash +deno run --allow-network --allow-env --allow-read --allow-write server.ts +``` + +## Deploy on Deno Deploy + +To deploy your app to [Deno Deploy](https://deno.com/deploy), please push your app to [Github](https://github.com) and create a new project on [Deno Deploy](https://dash.deno.com/new). + +Then link to the Repo and set the entrypoint to `server.ts` + +> See the [hello-world](https://aleph-hello.deno.dev/) example on [Deno Deploy](https://deno.com/deploy). diff --git a/routes/docs/framework/react-mdx.md b/routes/docs/framework/react-mdx.md new file mode 100644 index 0000000..cf75c2d --- /dev/null +++ b/routes/docs/framework/react-mdx.md @@ -0,0 +1,8 @@ +--- +title: Framework/React with MDX +authors: + - ije +--- + +# React with MDX + diff --git a/routes/docs/framework/react.md b/routes/docs/framework/react.md new file mode 100644 index 0000000..3c5525f --- /dev/null +++ b/routes/docs/framework/react.md @@ -0,0 +1,8 @@ +--- +title: Framework/React +authors: + - ije +--- + +# React + diff --git a/routes/docs/framework/solid.md b/routes/docs/framework/solid.md new file mode 100644 index 0000000..0fc4fb8 --- /dev/null +++ b/routes/docs/framework/solid.md @@ -0,0 +1,8 @@ +--- +title: Framework/SolidJS +authors: + - ije +--- + +# SolidJS + diff --git a/routes/docs/framework/vue.md b/routes/docs/framework/vue.md new file mode 100644 index 0000000..c30f5f3 --- /dev/null +++ b/routes/docs/framework/vue.md @@ -0,0 +1,8 @@ +--- +title: Framework/Vue +authors: + - ije +--- + +# Vue + diff --git a/routes/docs/framework/yew.md b/routes/docs/framework/yew.md new file mode 100644 index 0000000..6a2b2dc --- /dev/null +++ b/routes/docs/framework/yew.md @@ -0,0 +1,8 @@ +--- +title: Framework/Yew +authors: + - ije +--- + +# Yew + diff --git a/routes/docs/get-started.md b/routes/docs/get-started.md new file mode 100644 index 0000000..91a72ec --- /dev/null +++ b/routes/docs/get-started.md @@ -0,0 +1,38 @@ +--- +title: Get Started +authors: + - ije + - razermoon +--- + +# Get Started! + +Welcome to use **Aleph.js**! + +If you are new to Aleph.js you should check out the [About](/docs/) page. + +## Usage + +Create a new app: + +```bash +deno run -A -r https://alephjs.org/init.ts +``` + +Start the app in `development` mode: + +```bash +deno task dev +``` + +Start the app in `production` mode: + +```bash +deno task start +``` + +Optimize the application (bundling, ssg, etc.): + +```bash +deno task opt +``` diff --git a/routes/docs/index.md b/routes/docs/index.md new file mode 100644 index 0000000..377d972 --- /dev/null +++ b/routes/docs/index.md @@ -0,0 +1,91 @@ +--- +title: About Aleph.js +authors: + - ije + - razermoon +--- + +# Aleph.js + +**Aleph.js** (or **Aleph** or **א** or **阿莱夫**, ˈɑːlɛf) is a +fullstack framework in [Deno]. inspired by [Next.js], [Remix] and [Vite]. + +> The name is taken from the book [_The Aleph_] by **Jorge Luis Borges**. + +Aleph.js is modern framework that doesn't need **webpack** or other bundler +since it uses the [ES Module] syntax during development. Every module only needs +to be compiled once, when a module changes, Aleph.js just needs to re-compile +that single module. There is no time wasted _re-bundling_ everytime a change is +made. This, along with Hot Module Replacement (**HMR**) and **Fast Refresh**, +leads to instant updates in the browser. + +Aleph.js uses modern tools to build your app. It transpiles code using [swc] in +WASM with high performance, and bundles modules with [esbuild] at optimization +time extremely fast. + +Aleph.js works on top of **Deno**, a _simple_, _modern_ and _secure_ runtime for +JavaScript and TypeScript. All dependencies are imported using URLs, and managed +by Deno cache system. No `package.json` and `node_modules` directory needed. + +## Features + +- Zero Config +- No build step +- File-system Routing +- Just-in-time Server-side Rendering(SSR) +- Streaming SSR +- Support Typescript/JSX in Deno out of the box +- Built-in [Unocss] (automatic CSS) +- Import Maps +- Hot Module Replacement (or HMR) +- Support Middware +- Custom Module Loader like MDX + +## Supported frameworks + +- [React](https://github.com/alephjs/aleph.js/tree/main/examples/react-app) +- [React with MDX](https://github.com/alephjs/aleph.js/tree/main/examples/react-mdx-app) +- [Vue](https://github.com/alephjs/aleph.js/tree/main/examples/vue-app) +- [Solid](https://github.com/alephjs/aleph.js/tree/main/examples/solid-app) + _Experimental_ +- [Yew](https://github.com/alephjs/aleph.js/tree/main/examples/yew-app) _Rust_ + +Plan to support: [Svelte](https://svelte.dev/), [Lit](https://lit.dev/), etc.. + +## Examples + +Some demo apps deployed to [Deno Deploy](https://deno.com/deploy): + +- React App: https://aleph-hello.deno.dev/ +- Vue App: https://aleph-vue.deno.dev/ +- REST API: https://aleph-api.deno.dev/ +- React 18 Suspense SSR: https://aleph-suspense-ssr.deno.dev/ +- UnoCSS(tailwind): https://aleph-unocss.deno.dev/ +- Monaco Editor: https://aleph-monaco-editor.deno.dev/ +- Yew SSR: https://aleph-yew.deno.dev/ +- Github OAuth Middleware: https://aleph-github-oauth.deno.dev/ + +## Real-world Apps + +- Deno Deploy: https://dash.deno.com +- Meet Me: https://meet-me.deno.dev + ([source](https://github.com/denoland/meet-me)) + +## Status + +Currently in **beta**, not ready for production. + +## License + +Under the [MIT] License. + +[_The Aleph_]: http://phinnweb.org/links/literature/borges/aleph.html +[ES Module]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules +[deno]: https://deno.land +[Unocss]: https://github.com/unocss/unocss +[next.js]: https://nextjs.org +[Remix]: https://remix.run +[Vite]: https://vitejs.dev +[swc]: https://swc.rs +[esbuild]: https://github.com/evanw/esbuild +[MIT]: https://opensource.org/licenses/MIT diff --git a/routes/index.tsx b/routes/index.tsx index 4957b26..e9c1dcd 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -1,4 +1,4 @@ -import { Head, useData } from "aleph/react"; +import { Head, Link, useData } from "aleph/react"; import Button from "components/Button.tsx"; import Header from "components/Header.tsx"; @@ -67,15 +67,15 @@ export default function Home() { Aleph.js{" "} gives you the best developer experience for building web applications.

- diff --git a/server.ts b/server.ts index 5ea3263..865b7c8 100644 --- a/server.ts +++ b/server.ts @@ -1,27 +1,24 @@ -import presetUno from "@unocss/preset-uno.ts"; +import presetUno from "@unocss/preset-uno"; import { serve } from "aleph/react-server"; +import MDXLoader from "aleph/react/mdx-loader"; import routes from "./routes/_export.ts"; -import { CSS } from "./utils/gfm.ts"; serve({ router: { + glob: "./routes/**/*.{ts,tsx,mdx,md}", routes, }, unocss: { presets: [presetUno()], }, + loaders: [new MDXLoader()], middlewares: [ { - name: "gfm-css", - fetch: (req) => { - const url = new URL(req.url); - if (url.pathname === "/gfm.css") { - return new Response( - CSS + - "\n.markdown-body ul { list-style: disc; } .markdown-body ol { list-style: decimal; } .markdown-body strong { font-weight: 600; }", - { - headers: { "content-type": "text/css" }, - }, + name: "proxy-module", + fetch(req: Request) { + if (req.url.endsWith(".ts")) { + return fetch( + "https://deno.land/x/aleph" + (new URL(req.url)).pathname, ); } }, diff --git a/style/mdx.css b/style/mdx.css new file mode 100644 index 0000000..69aa5b6 --- /dev/null +++ b/style/mdx.css @@ -0,0 +1,146 @@ +:root { + --theme-color: #d63369; +} + +.markdown-body { + overflow: hidden; + color: #333; + + & a { + color: var(--theme-color); + + &:hover { + text-decoration: underline; + } + } + + & strong { + font-weight: 600; + color: #111; + } + + & em { + font-style: italic; + } + + & h1, + & h2, + & h3, + & h4 { + line-height: 1.2; + font-weight: 500; + color: #111; + } + + & h1 { + margin-bottom: 1.2rem; + font-size: 2.4rem; + font-weight: 700; + } + + & h1:first-child { + margin-top: 0; + } + + & h2 { + margin-top: 3rem; + font-size: 1.8rem; + } + + & h3 { + margin-top: 2.7rem; + font-size: 1.5rem; + } + + & h4 { + margin-top: 2.4rem; + font-size: 1.27rem; + } + + & > p { + margin-top: 1.2rem; + line-height: 1.5; + } + + & > p + p { + margin-top: 1.2rem; + } + + & > h4 + p { + margin-top: 0.9rem; + } + + & ul { + padding-left: 1.2rem; + margin-top: 0.9rem; + list-style: none; + } + + & ul li:before { + position: absolute; + margin-left: -1rem; + color: #aaa; + content: '-'; + } + + & ol { + margin-top: 0.9rem; + list-style: decimal inside; + } + + & ul, & ol { + & li + li { + margin-top: 0.5rem; + } + & li p { + display: inline; + } + } + + & pre { + box-sizing: border-box; + overflow-x: auto; + width: 100%; + margin-top: 1.5rem; + border-radius: 6px; + line-height: 1.5; + color: #333; + background-color: #f6f6f6; + white-space: pre; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + + &>code { + display: block; + padding: 1rem 1.2rem; + font-size: 0.9rem; + } + } + + & :not(pre)>code { + display: inline; + white-space: pre-wrap; + color: var(--theme-color); + + &::before, + &::after { + color: currentColor; + content: '`' + } + } + + & blockquote { + color: #666; + padding: 0.3rem 1.2rem; + margin: 1.2rem 0; + border-left: 2px solid #ccc; + + & p { + margin: 0; + } + + & a { + box-shadow: none; + } + } +} \ No newline at end of file diff --git a/utils/gfm.ts b/utils/gfm.ts deleted file mode 100644 index 94c605c..0000000 --- a/utils/gfm.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { CSS, render } from "https://deno.land/x/gfm@0.1.20/mod.ts"; -import { safeLoadFront } from "npm/yaml-front-matter@4.1.1"; - -import "npm/prismjs@1.27.0/components/prism-jsx?no-check"; -import "npm/prismjs@1.27.0/components/prism-tsx?no-check"; -import "npm/prismjs@1.27.0/components/prism-bash?no-check"; -import "npm/prismjs@1.27.0/components/prism-typescript?no-check"; - -export { CSS, render, safeLoadFront }; From 91744236a9d507d27a9718908e871f5453b0efca Mon Sep 17 00:00:00 2001 From: X Date: Wed, 21 Sep 2022 04:56:02 +0800 Subject: [PATCH 41/41] wip --- components/Button.tsx | 2 +- deno.json | 2 +- import_map.json | 14 +- routes/_export.ts | 1081 ++++------------- routes/docs/api-reference/framework/react.md | 1 + routes/docs/api-reference/framework/vue.md | 1 + routes/docs/api-reference/middleware.md | 330 +---- routes/docs/api-reference/server-config.md | 169 +-- routes/docs/basic-concepts/css-support.md | 154 +-- routes/docs/basic-concepts/hmr.md | 14 +- routes/docs/basic-concepts/import-from-npm.md | 4 + routes/docs/basic-concepts/import-maps.md | 13 +- routes/docs/basic-concepts/routing.md | 4 +- routes/docs/basic-concepts/server.md | 2 + routes/docs/basic-concepts/ssr.md | 118 +- .../basic-concepts/static-file-serving.md | 8 +- routes/docs/basic-concepts/unocss.md | 2 + routes/docs/framework/react-mdx.md | 1 + routes/docs/framework/react.md | 1 + routes/docs/framework/solid.md | 1 + routes/docs/framework/vue.md | 1 + routes/docs/framework/yew.md | 1 + routes/docs/index.md | 2 +- routes/index.tsx | 6 +- server.ts | 9 +- style/hljs.css | 104 ++ style/mdx.css | 19 +- 27 files changed, 474 insertions(+), 1590 deletions(-) create mode 100644 style/hljs.css diff --git a/components/Button.tsx b/components/Button.tsx index f685e96..23c005b 100755 --- a/components/Button.tsx +++ b/components/Button.tsx @@ -79,7 +79,7 @@ export default function Button({ css.pointerEvents = "none"; } return css; - }, [height, color, hover, activated]); + }, [height, color, hover, activated, strong]); return ( diff --git a/server.ts b/server.ts index 865b7c8..8012d2e 100644 --- a/server.ts +++ b/server.ts @@ -2,6 +2,8 @@ import presetUno from "@unocss/preset-uno"; import { serve } from "aleph/react-server"; import MDXLoader from "aleph/react/mdx-loader"; import routes from "./routes/_export.ts"; +import remarkFrontmatter from "remark-frontmatter"; +import rehypeHighlight from "rehype-highlight"; serve({ router: { @@ -11,7 +13,12 @@ serve({ unocss: { presets: [presetUno()], }, - loaders: [new MDXLoader()], + loaders: [ + new MDXLoader({ + remarkPlugins: [remarkFrontmatter], + rehypePlugins: [rehypeHighlight], + }), + ], middlewares: [ { name: "proxy-module", diff --git a/style/hljs.css b/style/hljs.css new file mode 100644 index 0000000..a7bb80f --- /dev/null +++ b/style/hljs.css @@ -0,0 +1,104 @@ +/* copied from https://esm.sh/highlightjs@9.16.2/styles/github.css */ + +.hljs { + display: block; + overflow-x: auto; + padding: .5em; + color: #333; + background: #f8f8f8 +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #111; + font-weight: 500 +} + +.hljs-literal, +.hljs-number, +.hljs-template-variable, +.hljs-variable { + color: teal +} + +.hljs-doctag, +.hljs-string { + color: var(--theme-color) +} + +.hljs-section, +.hljs-selector-id, +.hljs-title { + color: var(--theme-color); + font-weight: 500 +} + +.hljs-subst { + font-weight: 400 +} + +.hljs-class .hljs-title, +.hljs-type { + color: #458; + font-weight: 500 +} + +.hljs-attribute, +.hljs-name, +.hljs-tag { + color: #999; + font-weight: 400 +} + +.hljs-tag .hljs-name { + color: teal; + font-weight: 500 +} + +.hljs-tag .hljs-attr { + color: #454545; + font-weight: 500 +} + +.hljs-link, +.hljs-regexp { + color: #926711 +} + +.hljs-bullet, +.hljs-symbol { + color: var(--theme-color) +} + +.hljs-built_in, +.hljs-builtin-name { + color: teal +} + +.hljs-meta { + color: #999; + font-weight: 500 +} + +.hljs-deletion { + background: #fdd +} + +.hljs-addition { + background: #dfd +} + +.hljs-emphasis { + font-style: italic +} + +.hljs-strong { + font-weight: 500 +} diff --git a/style/mdx.css b/style/mdx.css index 69aa5b6..88ff077 100644 --- a/style/mdx.css +++ b/style/mdx.css @@ -1,3 +1,5 @@ +@import url("./hljs.css"); + :root { --theme-color: #d63369; } @@ -33,7 +35,7 @@ } & h1 { - margin-bottom: 1.2rem; + margin-top: 3.2rem; font-size: 2.4rem; font-weight: 700; } @@ -43,17 +45,17 @@ } & h2 { - margin-top: 3rem; + margin-top: 2.8rem; font-size: 1.8rem; } & h3 { - margin-top: 2.7rem; + margin-top: 2.4rem; font-size: 1.5rem; } & h4 { - margin-top: 2.4rem; + margin-top: 2.0rem; font-size: 1.27rem; } @@ -62,14 +64,6 @@ line-height: 1.5; } - & > p + p { - margin-top: 1.2rem; - } - - & > h4 + p { - margin-top: 0.9rem; - } - & ul { padding-left: 1.2rem; margin-top: 0.9rem; @@ -120,6 +114,7 @@ & :not(pre)>code { display: inline; white-space: pre-wrap; + font-size: 90%; color: var(--theme-color); &::before,