{{ brand_name }}
+{{ project_name }}
+{{ project_description }}
+diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 9c5b40b..a8c60c7 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -33,6 +33,8 @@ jobs: - cppjswasm - uitk-svelte - uitk-webawesome + - site-sveltekit + - site-webawesome os: - ubuntu-latest - macos-latest @@ -41,6 +43,10 @@ jobs: os: macos-latest - template: uitk-webawesome os: macos-latest + - template: site-sveltekit + os: macos-latest + - template: site-webawesome + os: macos-latest runs-on: ${{ matrix.os }} steps: - name: Checkout @@ -86,7 +92,7 @@ jobs: version: 22.x pnpm_version: 11.11.0 js_folder: "." - if: matrix.template == 'js' || matrix.template == 'jupyter' || matrix.template == 'cppjswasm' || matrix.template == 'rustjswasm' || matrix.template == 'uitk-svelte' || matrix.template == 'uitk-webawesome' + if: matrix.template == 'js' || matrix.template == 'jupyter' || matrix.template == 'cppjswasm' || matrix.template == 'rustjswasm' || matrix.template == 'uitk-svelte' || matrix.template == 'uitk-webawesome' || matrix.template == 'site-sveltekit' || matrix.template == 'site-webawesome' - name: Setup Rust uses: actions-ext/rust/setup@2db8e3e4c56beb7320c7d730bd2c2d6a6447bf6b @@ -103,12 +109,12 @@ jobs: - name: Generate template run: make gen-${{ matrix.template }} - - name: Install UI toolkit dependencies and browser + - name: Install JavaScript template dependencies and browser run: | cd ../javascript-template-${{ matrix.template }} pnpm install pnpm exec playwright install --with-deps chromium - if: matrix.template == 'uitk-svelte' || matrix.template == 'uitk-webawesome' + if: matrix.template == 'uitk-svelte' || matrix.template == 'uitk-webawesome' || matrix.template == 'site-sveltekit' || matrix.template == 'site-webawesome' - name: Test template run: make test-${{ matrix.template }} diff --git a/Makefile b/Makefile index 9efcfd3..6f661b5 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ fix: ## fix formatting in this repo format: fix test: ## run tests for this repo -.PHONY: gen-python gen-cpp gen-js gen-jupyter gen-rust gen-rustjswasm gen-cppjswasm gen-uitk-svelte gen-uitk-webawesome +.PHONY: gen-python gen-cpp gen-js gen-jupyter gen-rust gen-rustjswasm gen-cppjswasm gen-uitk-svelte gen-uitk-webawesome gen-site-sveltekit gen-site-webawesome gen-python: ## regenerate the python template from scratch mkdir -p ../python-template && cd ../python-template && rm -rf ./* && rm -rf .copier-answers.yaml .gitignore .github .gitattributes copier copy -w . ../python-template --data-file examples/python.yaml @@ -68,7 +68,15 @@ gen-uitk-webawesome: ## regenerate the Lit and Web Awesome UI toolkit template mkdir -p ../javascript-template-uitk-webawesome && cd ../javascript-template-uitk-webawesome && rm -rf ./* && rm -rf .copier-answers.yaml .github .gitignore .prettierignore .prettierrc copier copy -w . ../javascript-template-uitk-webawesome --data-file examples/uitk-webawesome.yaml -.PHONY: test-python test-cpp test-js test-jupyter test-rust test-rustjswasm test-cppjswasm test-uitk-svelte test-uitk-webawesome +gen-site-sveltekit: ## regenerate the SvelteKit site template from scratch + mkdir -p ../javascript-template-site-sveltekit && cd ../javascript-template-site-sveltekit && rm -rf ./* && rm -rf .copier-answers.yaml .github .gitignore .prettierignore .prettierrc + copier copy -w . ../javascript-template-site-sveltekit --data-file examples/site-sveltekit.yaml + +gen-site-webawesome: ## regenerate the Web Awesome site template from scratch + mkdir -p ../javascript-template-site-webawesome && cd ../javascript-template-site-webawesome && rm -rf ./* && rm -rf .copier-answers.yaml .github .gitignore .prettierignore .prettierrc + copier copy -w . ../javascript-template-site-webawesome --data-file examples/site-webawesome.yaml + +.PHONY: test-python test-cpp test-js test-jupyter test-rust test-rustjswasm test-cppjswasm test-uitk-svelte test-uitk-webawesome test-site-sveltekit test-site-webawesome test-python: cd ../python-template && git config --global user.name "github-actions" && git config --global user.email "41898282+github-actions[bot]@users.noreply.github.c@example.com" && git init && git add . && git commit -m "initial commit" cd ../python-template && make develop @@ -141,3 +149,19 @@ test-uitk-webawesome: cd ../javascript-template-uitk-webawesome && pnpm build cd ../javascript-template-uitk-webawesome && pnpm test:unit cd ../javascript-template-uitk-webawesome && CI=1 pnpm test:e2e + +test-site-sveltekit: + cd ../javascript-template-site-sveltekit && pnpm install + cd ../javascript-template-site-sveltekit && pnpm exec playwright install chromium + cd ../javascript-template-site-sveltekit && pnpm lint + cd ../javascript-template-site-sveltekit && pnpm check + cd ../javascript-template-site-sveltekit && pnpm build + cd ../javascript-template-site-sveltekit && CI=1 pnpm test:e2e + +test-site-webawesome: + cd ../javascript-template-site-webawesome && pnpm install + cd ../javascript-template-site-webawesome && pnpm exec playwright install chromium + cd ../javascript-template-site-webawesome && pnpm lint + cd ../javascript-template-site-webawesome && pnpm check + cd ../javascript-template-site-webawesome && pnpm build + cd ../javascript-template-site-webawesome && CI=1 pnpm test:e2e diff --git a/README.md b/README.md index 1735885..f010c51 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,5 @@ One selector chooses a template: - `Python / …` options generate pure Python, C++, JavaScript, Jupyter, Rust, and WebAssembly-backed Python packages from `python/`. - `JavaScript / UI Toolkit / Svelte` generates a Svelte package and showcase from `javascript/uitk-svelte/`. - `JavaScript / UI Toolkit / Lit + Web Awesome` generates custom elements and a showcase from `javascript/uitk-webawesome/`. +- `JavaScript / Site / SvelteKit` generates a SvelteKit site with static or Node deployment from `javascript/site-sveltekit/`. +- `JavaScript / Site / Web Awesome` generates a Vite site built with Web Awesome components from `javascript/site-webawesome/`. diff --git a/copier.yaml b/copier.yaml index 045d39f..5cce84c 100644 --- a/copier.yaml +++ b/copier.yaml @@ -29,12 +29,12 @@ github: team: type: str help: What is your name or your team's name? - when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome'] }}" + when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome', 'site-sveltekit', 'site-webawesome'] }}" email: type: str help: What is your email? - when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome'] }}" + when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome', 'site-sveltekit', 'site-webawesome'] }}" add_extension: type: str @@ -58,8 +58,12 @@ add_extension: value: uitk-svelte JavaScript / UI Toolkit / Lit + Web Awesome: value: uitk-webawesome + JavaScript / Site / SvelteKit: + value: site-sveltekit + JavaScript / Site / Web Awesome: + value: site-webawesome -_subdirectory: "{% if add_extension == 'python' %}python/pure{% elif add_extension in ['uitk-svelte', 'uitk-webawesome'] %}javascript/{{ add_extension }}{% else %}python/{{ add_extension }}{% endif %}" +_subdirectory: "{% if add_extension == 'python' %}python/pure{% elif add_extension in ['uitk-svelte', 'uitk-webawesome', 'site-sveltekit', 'site-webawesome'] %}javascript/{{ add_extension }}{% else %}python/{{ add_extension }}{% endif %}" add_vcpkg: type: bool @@ -80,19 +84,19 @@ python_version_primary: "3.13": value: "3.13" help: Primary version of Python to use in CI/CD - when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome'] }}" + when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome', 'site-sveltekit', 'site-webawesome'] }}" add_docs: type: bool default: false help: Add documentation using Yardang/Sphinx - when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome'] }}" + when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome', 'site-sveltekit', 'site-webawesome'] }}" add_wiki: type: bool default: false help: Add documentation using GitHub wiki - when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome'] }}" + when: "{{ add_extension not in ['uitk-svelte', 'uitk-webawesome', 'site-sveltekit', 'site-webawesome'] }}" package_name: type: str @@ -104,7 +108,7 @@ brand_name: type: str help: What is the human-readable brand name? default: "{{ project_name }}" - when: "{{ add_extension in ['uitk-svelte', 'uitk-webawesome'] }}" + when: "{{ add_extension in ['uitk-svelte', 'uitk-webawesome', 'site-sveltekit', 'site-webawesome'] }}" css_prefix: type: str @@ -117,3 +121,20 @@ element_prefix: help: What prefix should custom elements use? default: brand when: "{{ add_extension == 'uitk-webawesome' }}" + +site_url: + type: str + help: What is the site's canonical URL? + default: https://example.com + when: "{{ add_extension in ['site-sveltekit', 'site-webawesome'] }}" + +site_adapter: + type: str + help: How should SvelteKit deploy the site? + choices: + Static files: + value: static + Node server: + value: node + default: static + when: "{{ add_extension == 'site-sveltekit' }}" diff --git a/examples/site-sveltekit.yaml b/examples/site-sveltekit.yaml new file mode 100644 index 0000000..df7d0ae --- /dev/null +++ b/examples/site-sveltekit.yaml @@ -0,0 +1,8 @@ +--- +add_extension: site-sveltekit +brand_name: Example +github: example +project_description: A fast, accessible SvelteKit website. +project_name: example-site +site_adapter: static +site_url: https://example.com diff --git a/examples/site-webawesome.yaml b/examples/site-webawesome.yaml new file mode 100644 index 0000000..f64bd24 --- /dev/null +++ b/examples/site-webawesome.yaml @@ -0,0 +1,7 @@ +--- +add_extension: site-webawesome +brand_name: Example +github: example +project_description: A fast, accessible website built with Web Awesome. +project_name: example-site +site_url: https://example.com diff --git a/javascript/site-sveltekit/.github/workflows/build.yaml.jinja b/javascript/site-sveltekit/.github/workflows/build.yaml.jinja new file mode 100644 index 0000000..c8c3352 --- /dev/null +++ b/javascript/site-sveltekit/.github/workflows/build.yaml.jinja @@ -0,0 +1,32 @@ +name: Build Status + +on: + push: + branches: [main] + tags: [v*] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + with: + version: 11 + - uses: actions/setup-node@v7 + with: + node-version: 22.x + cache: pnpm + - run: pnpm install + - run: pnpm build + - run: pnpm check + - run: pnpm lint + - run: pnpm exec playwright install --with-deps chromium + - run: pnpm test:e2e + env: + CI: '1' diff --git a/javascript/site-sveltekit/.gitignore.jinja b/javascript/site-sveltekit/.gitignore.jinja new file mode 100644 index 0000000..aab1830 --- /dev/null +++ b/javascript/site-sveltekit/.gitignore.jinja @@ -0,0 +1,10 @@ +node_modules +/.svelte-kit +/build +/coverage +/playwright-report +/test-results +.env +.env.* +!.env.example +.DS_Store diff --git a/javascript/site-sveltekit/.prettierignore.jinja b/javascript/site-sveltekit/.prettierignore.jinja new file mode 100644 index 0000000..9dbe2af --- /dev/null +++ b/javascript/site-sveltekit/.prettierignore.jinja @@ -0,0 +1,8 @@ +.svelte-kit +.copier-answers.yaml +build +coverage +node_modules +playwright-report +pnpm-lock.yaml +test-results diff --git a/javascript/site-sveltekit/.prettierrc.jinja b/javascript/site-sveltekit/.prettierrc.jinja new file mode 100644 index 0000000..6b53085 --- /dev/null +++ b/javascript/site-sveltekit/.prettierrc.jinja @@ -0,0 +1,9 @@ +{ + "printWidth": 120, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "none", + "plugins": ["prettier-plugin-svelte"], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/javascript/site-sveltekit/README.md.jinja b/javascript/site-sveltekit/README.md.jinja new file mode 100644 index 0000000..35b8677 --- /dev/null +++ b/javascript/site-sveltekit/README.md.jinja @@ -0,0 +1,21 @@ +# {{ brand_name }} + +{{ project_description }} + +## Develop + +```bash +pnpm install +pnpm dev +``` + +## Verify + +```bash +pnpm check +pnpm lint +pnpm test +pnpm build +``` + +This site uses SvelteKit's `adapter-{{ site_adapter }}` deployment adapter. diff --git a/javascript/site-sveltekit/package.json.jinja b/javascript/site-sveltekit/package.json.jinja new file mode 100644 index 0000000..4afc2ce --- /dev/null +++ b/javascript/site-sveltekit/package.json.jinja @@ -0,0 +1,38 @@ +{ + "name": "{{ project_name_formatted }}", + "version": "0.1.0", + "description": "{{ project_description }}", + "private": true, + "packageManager": "pnpm@11.9.0", + "engines": { + "node": ">=22" + }, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "lint": "prettier --check .", + "fix": "prettier --write .", + "test": "pnpm test:e2e", + "test:e2e": "playwright test", + "test:e2e:update": "playwright test --update-snapshots" + }, + "devDependencies": { + "@axe-core/playwright": "^4.12.1", + "@playwright/test": "^1.60.0", + "@sveltejs/adapter-{{ site_adapter }}": "{{ '^3.0.10' if site_adapter == 'static' else '^5.0.0' }}", + "@sveltejs/kit": "^2.70.1", + "@sveltejs/vite-plugin-svelte": "^7.1.2", + "@tailwindcss/vite": "^4.3.3", + "@types/node": "^24.0.0", + "prettier": "^3.8.4", + "prettier-plugin-svelte": "^4.1.1", + "svelte": "^5.56.0", + "svelte-check": "^4.3.0", + "tailwindcss": "^4.3.3", + "typescript": "^5.9.3", + "vite": "^8.1.5" + } +} diff --git a/javascript/site-sveltekit/playwright.config.ts.jinja b/javascript/site-sveltekit/playwright.config.ts.jinja new file mode 100644 index 0000000..8165435 --- /dev/null +++ b/javascript/site-sveltekit/playwright.config.ts.jinja @@ -0,0 +1,26 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: 'tests', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + reporter: process.env.CI ? 'github' : 'list', + use: { + baseURL: 'http://127.0.0.1:4177', + trace: 'retain-on-failure', + screenshot: 'only-on-failure' + }, + webServer: { + command: 'vite build && vite preview --host 127.0.0.1 --port 4177 --strictPort', + port: 4177, + reuseExistingServer: !process.env.CI, + timeout: 120_000 + }, + projects: [ + { + name: 'desktop', + use: { ...devices['Desktop Chrome'], viewport: { width: 1280, height: 800 } } + } + ] +}); diff --git a/javascript/site-sveltekit/src/app.css.jinja b/javascript/site-sveltekit/src/app.css.jinja new file mode 100644 index 0000000..3169048 --- /dev/null +++ b/javascript/site-sveltekit/src/app.css.jinja @@ -0,0 +1,15 @@ +@import 'tailwindcss'; + +:root { + color: #171717; + background: #ffffff; + font-family: system-ui, sans-serif; +} + +body { + margin: 0; +} + +a { + color: inherit; +} diff --git a/javascript/site-sveltekit/src/app.d.ts.jinja b/javascript/site-sveltekit/src/app.d.ts.jinja new file mode 100644 index 0000000..a6911e5 --- /dev/null +++ b/javascript/site-sveltekit/src/app.d.ts.jinja @@ -0,0 +1,5 @@ +declare global { + namespace App {} +} + +export {}; diff --git a/javascript/site-sveltekit/src/app.html.jinja b/javascript/site-sveltekit/src/app.html.jinja new file mode 100644 index 0000000..a15015b --- /dev/null +++ b/javascript/site-sveltekit/src/app.html.jinja @@ -0,0 +1,12 @@ + + +
+ + + + %sveltekit.head% + + +{{ brand_name }}
+{{ project_description }}
+{{ brand_name }}
+{{ project_description }}
+