diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml
new file mode 100644
index 0000000..a1e59a8
--- /dev/null
+++ b/.forgejo/workflows/build.yaml
@@ -0,0 +1,121 @@
+on: [push]
+jobs:
+ check-changes:
+ runs-on: docker
+ outputs:
+ all_changed_and_modified_files_count: ${{ steps.changed-files.outputs.all_changed_and_modified_files_count }}
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Get changed files count
+ id: changed-files
+ uses: tj-actions/changed-files@v45
+ with:
+ files_ignore: 'doc/**,README.md,Dockerfile,.*'
+ files_ignore_separator: ','
+ - name: Print changed files count
+ run: >
+ echo "Changed files count: ${{
+ steps.changed-files.outputs.all_changed_and_modified_files_count }}"
+
+ build:
+ needs: check-changes
+ runs-on: docker
+ container:
+ image: ghcr.io/catthehacker/ubuntu:js-22.04
+ if: ${{ needs.check-changes.outputs.all_changed_and_modified_files_count >= 1 }}
+ permissions:
+ contents: write
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - uses: actions/setup-node@v4
+ with:
+ node-version: lts/*
+ cache: yarn
+ cache-dependency-path: '**/yarn.lock'
+ - uses: actions/cache@v4
+ with:
+ path: |
+ ~/.cache/pip
+ ~/node_modules
+ key: ${{ runner.os }}-pio
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '>=3.10'
+ - name: Get current date
+ id: dateAndTime
+ run: echo "dateAndTime=$(date +'%Y-%m-%d-%H:%M')" >> $GITHUB_OUTPUT
+ - name: Install mklittlefs
+ run: >
+ git clone https://github.com/earlephilhower/mklittlefs.git /tmp/mklittlefs &&
+ cd /tmp/mklittlefs &&
+ git submodule update --init &&
+ make dist
+ - name: Install yarn
+ run: yarn && yarn postinstall
+ - name: Run linter
+ run: yarn lint
+ - name: Run vitest tests
+ run: yarn vitest run
+ - name: Install Playwright Browsers
+ run: npx playwright install --with-deps
+ - name: Run Playwright tests
+ run: npx playwright test
+ - name: Build WebUI
+ run: yarn build
+ - name: Get current block
+ id: getBlockHeight
+ run: echo "blockHeight=$(curl -s https://mempool.space/api/blocks/tip/height)" >> $GITHUB_OUTPUT
+ - name: Write block height to file
+ env:
+ BLOCK_HEIGHT: ${{ steps.getBlockHeight.outputs.blockHeight }}
+ run: mkdir -p output && echo "$BLOCK_HEIGHT" > output/version.txt
+ - name: gzip build for LittleFS
+ run: find dist -type f ! -name ".*" -exec sh -c 'mkdir -p "build_gz/$(dirname "${1#dist/}")" && gzip -k "$1" -c > "build_gz/${1#dist/}".gz' _ {} \;
+ - name: Write git rev to file
+ run: echo "$GITHUB_SHA" > build_gz/fs_hash.txt && echo "$GITHUB_SHA" > output/commit.txt
+ - name: Check GZipped directory size
+ run: |
+ # Set the threshold size in bytes
+ THRESHOLD=410000
+
+ # Calculate the total size of files in the directory
+ DIRECTORY_SIZE=$(du -b -s build_gz | awk '{print $1}')
+
+ # Fail the workflow if the size exceeds the threshold
+ if [ "$DIRECTORY_SIZE" -gt "$THRESHOLD" ]; then
+ echo "Directory size exceeds the threshold of $THRESHOLD bytes"
+ exit 1
+ else
+ echo "Directory size is within the threshold $DIRECTORY_SIZE"
+ fi
+ - name: Create tarball
+ run: tar czf webui.tgz --strip-components=1 dist
+ - name: Build LittleFS
+ run: |
+ set -e
+ /tmp/mklittlefs/mklittlefs -c build_gz -s 410000 output/littlefs.bin
+ - name: Upload artifacts
+ uses: https://code.forgejo.org/forgejo/upload-artifact@v4
+ with:
+ path: |
+ webui.tgz
+ output/littlefs.bin
+ - name: Create release
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+ uses: https://code.forgejo.org/actions/forgejo-release@v2.4.0
+ with:
+ url: 'https://git.btclock.dev/'
+ repo: '${{ github.repository }}'
+ direction: upload
+ tag: ${{ steps.getBlockHeight.outputs.blockHeight }}
+ sha: '${{ github.sha }}'
+ release-dir: output
+ token: ${{ secrets.TOKEN }}
+ override: false
+ verbose: false
+ release-notes-assistant: false
diff --git a/package.json b/package.json
index 9c4937d..44cc323 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"postinstall": "patch-package",
"test": "npm run test:integration && npm run test:unit",
"test:integration": "playwright test",
+ "test:screenshots": "playwright test -c playwright.screenshot.config.ts",
"test:unit": "vitest"
},
"devDependencies": {
@@ -58,6 +59,7 @@
"msgpack-es": "^0.0.5",
"nostr-tools": "^2.7.1",
"patch-package": "^8.0.0",
+ "svelte-bootstrap-icons": "^3.1.1",
"svelte-i18n": "^4.0.0"
},
"resolutions": {
diff --git a/patches/@sveltejs+kit+2.8.5.patch b/patches/@sveltejs+kit+2.8.5.patch
new file mode 100644
index 0000000..80f5dba
--- /dev/null
+++ b/patches/@sveltejs+kit+2.8.5.patch
@@ -0,0 +1,17 @@
+diff --git a/node_modules/@sveltejs/kit/src/exports/vite/index.js b/node_modules/@sveltejs/kit/src/exports/vite/index.js
+index e6521e9..f31c28b 100644
+--- a/node_modules/@sveltejs/kit/src/exports/vite/index.js
++++ b/node_modules/@sveltejs/kit/src/exports/vite/index.js
+@@ -639,9 +639,9 @@ async function kit({ svelte_config }) {
+ input,
+ output: {
+ format: 'esm',
+- entryFileNames: ssr ? '[name].js' : `${prefix}/[name].[hash].${ext}`,
+- chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[name].[hash].${ext}`,
+- assetFileNames: `${prefix}/assets/[name].[hash][extname]`,
++ entryFileNames: ssr ? '[name].js' : `${prefix}/[hash].${ext}`,
++ chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[hash].${ext}`,
++ assetFileNames: `${prefix}/assets/[hash][extname]`,
+ hoistTransitiveImports: false,
+ sourcemapIgnoreList
+ },
diff --git a/playwright.config.ts b/playwright.config.ts
index d60d61c..bf148ce 100644
--- a/playwright.config.ts
+++ b/playwright.config.ts
@@ -10,7 +10,7 @@ const config: PlaywrightTestConfig = {
port: 4173
},
reporter: process.env.CI ? 'github' : 'list',
- testDir: 'tests',
+ testDir: 'tests/playwright',
testMatch: /(.+\.)?(test|spec)\.[jt]s/
};
diff --git a/playwright.screenshot.config.ts b/playwright.screenshot.config.ts
new file mode 100644
index 0000000..81264a4
--- /dev/null
+++ b/playwright.screenshot.config.ts
@@ -0,0 +1,51 @@
+import { defineConfig, devices } from '@playwright/test';
+
+export default defineConfig({
+ reporter: 'html',
+ use: {
+ locale: 'en-GB',
+ timezoneId: 'Europe/Amsterdam'
+ },
+ webServer: {
+ command: 'npm run build && npm run preview',
+ port: 4173
+ },
+ testDir: './tests/screenshots',
+ outputDir: './test-results/screenshots',
+ projects: [
+ {
+ name: 'MacBook Air 13 inch',
+ use: {
+ viewport: { width: 1440, height: 900 }
+ }
+ },
+ {
+ name: 'iPhone 14 Pro',
+ use: { ...devices['iPhone 14 Pro'] }
+ },
+ {
+ name: 'iPhone 15 Pro Landscape',
+ use: { ...devices['iPhone 15 Pro Landscape'] }
+ },
+ {
+ name: 'MacBook Pro 14 inch',
+ use: {
+ viewport: { width: 1512, height: 982 }
+ }
+ },
+ {
+ name: 'MacBook Pro 14 inch',
+ use: {
+ viewport: { width: 1512, height: 982 }
+ }
+ },
+ {
+ name: 'MacBook Pro 14 inch Firefox HiDPI',
+ use: { ...devices['Desktop Firefox HiDPI'], viewport: { width: 1512, height: 982 } }
+ },
+ {
+ name: 'MacBook Pro 14 inch Safari',
+ use: { ...devices['Desktop Safari'], viewport: { width: 1512, height: 982 } }
+ }
+ ]
+});
diff --git a/src/components/ColorSchemeSwitcher.svelte b/src/components/ColorSchemeSwitcher.svelte
new file mode 100644
index 0000000..9d7e32a
--- /dev/null
+++ b/src/components/ColorSchemeSwitcher.svelte
@@ -0,0 +1,53 @@
+
+
+
Loading...
{/if}