Compare commits
6 Commits
c9dafd76d1
...
v1.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
| fee538f044 | |||
| 48ec764880 | |||
| babd31548c | |||
| 95ae04ecd2 | |||
| 7a137abb66 | |||
| 023b2ffdc5 |
@@ -15,27 +15,38 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build Vision Start
|
name: Build Vision Start
|
||||||
if: gitea.event_name == 'push'
|
|
||||||
runs-on: ubuntu-amd64
|
runs-on: ubuntu-amd64
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup required tools
|
||||||
|
run: sudo apt-get install zip jq curl -y
|
||||||
|
|
||||||
- name: Install JS dependencies
|
- name: Install JS dependencies
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- name: Run build
|
- name: Run build
|
||||||
run: npm run build
|
|
||||||
|
|
||||||
- name: Package dist as zip
|
|
||||||
run: |
|
run: |
|
||||||
cd dist
|
bash scripts/prepare_release.sh
|
||||||
zip -r ../vision-start-build.zip .
|
npm run build
|
||||||
|
|
||||||
- name: Upload build artifact
|
- name: Prepare release
|
||||||
|
run: |
|
||||||
|
mv dist vision-start/
|
||||||
|
mv extension vision-start/
|
||||||
|
mv manifest.json vision-start/
|
||||||
|
|
||||||
|
- name: Create zip archive
|
||||||
|
run: |
|
||||||
|
cd vision-start
|
||||||
|
zip -r ../vision-start-${{ gitea.ref_name }}.zip *
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: vision-start-build
|
name: release-zip
|
||||||
path: vision-start-build.zip
|
path: vision-start-${{ gitea.ref_name }}.zip
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
build_vision_start:
|
build_vision_start:
|
||||||
name: Build Vision Start Image
|
name: Build Vision Start Image
|
||||||
|
|||||||
@@ -19,19 +19,29 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup required tools
|
- name: Setup required tools
|
||||||
run: sudo apt-get install zip jq curl -y
|
run: sudo apt-get install zip jq curl -y
|
||||||
|
|
||||||
- name: Install JS dependencies
|
- name: Install JS dependencies
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- name: Run build
|
- name: Run build
|
||||||
run: npm run build
|
|
||||||
- name: Prepare release
|
|
||||||
run: |
|
run: |
|
||||||
bash scripts/prepare_release.sh
|
bash scripts/prepare_release.sh
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
- name: Prepare release
|
||||||
|
run: |
|
||||||
mv dist vision-start/
|
mv dist vision-start/
|
||||||
|
mv extension vision-start/
|
||||||
mv manifest.json vision-start/
|
mv manifest.json vision-start/
|
||||||
|
|
||||||
- name: Create zip archive
|
- name: Create zip archive
|
||||||
run: zip -r vision-start-${{ gitea.ref_name }}.zip vision-start
|
run: |
|
||||||
|
cd vision-start
|
||||||
|
zip -r ../vision-start-${{ gitea.ref_name }}.zip *
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<div style="display: flex; justify-content: center; font-size: 2rem; font-weight: bold;">
|
<div style="display: flex; justify-content: center; align-items: center; font-size: 2rem; font-weight: bold;">
|
||||||
Vision Start
|
<img src="extension/icons/vision-48.png" alt="Vision Start" width="32" height="32" style="margin-right: 1rem;"> Vision Start
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="display: flex; justify-content: center; font-size: 1.5rem;">
|
<div style="display: flex; justify-content: center; font-size: 1.5rem;">
|
||||||
A light liquid-glass, modern and customizable startpage built with React.
|
A light, modern and customizable startpage built with React.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span style="display: block; text-align: center; font-size: 1.2rem;">Try it here: <a href="http://vision-start.ivanch.me">http://vision-start.ivanch.me</a></span>
|
<span style="display: block; text-align: center; font-size: 1.2rem;">Try it here: <a href="http://vision-start.ivanch.me">http://vision-start.ivanch.me</a></span>
|
||||||
|
|||||||
@@ -33,12 +33,16 @@ const WebsiteEditModal: React.FC<WebsiteEditModalProps> = ({ website, edit, onCl
|
|||||||
const [icon, setIcon] = useState(website ? website.icon : '');
|
const [icon, setIcon] = useState(website ? website.icon : '');
|
||||||
const [iconQuery, setIconQuery] = useState('');
|
const [iconQuery, setIconQuery] = useState('');
|
||||||
const [filteredIcons, setFilteredIcons] = useState<IconMetadata[]>([]);
|
const [filteredIcons, setFilteredIcons] = useState<IconMetadata[]>([]);
|
||||||
const [iconMetadata, setIconMetadata] = useState<IconMetadata[]>([]);
|
const [iconMetadata, setIconMetadata] = useState<IconMetadata[]>(() => iconMetadataCache ?? []);
|
||||||
const [iconsFetched, setIconsFetched] = useState(false);
|
const [iconsFetched, setIconsFetched] = useState(() => iconMetadataCache !== null);
|
||||||
const debounceRef = useRef<number | null>(null);
|
const debounceRef = useRef<number | null>(null);
|
||||||
|
|
||||||
const ensureIconMetadata = () => {
|
const ensureIconMetadata = () => {
|
||||||
if (iconMetadataCache || iconsFetched) return;
|
if (iconMetadataCache) {
|
||||||
|
setIconMetadata(iconMetadataCache);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (iconsFetched) return;
|
||||||
setIconsFetched(true);
|
setIconsFetched(true);
|
||||||
fetch('/icon-metadata.json', { cache: 'force-cache' })
|
fetch('/icon-metadata.json', { cache: 'force-cache' })
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
|
|||||||
BIN
extension/icons/vision-128.png
Normal file
BIN
extension/icons/vision-128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
extension/icons/vision-16.png
Normal file
BIN
extension/icons/vision-16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
BIN
extension/icons/vision-48.png
Normal file
BIN
extension/icons/vision-48.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
@@ -1,14 +1,19 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "Vision Startpage",
|
"name": "Vision Startpage",
|
||||||
"version": "1.0",
|
"version": "1.0.0",
|
||||||
"description": "A beautiful and customizable startpage for your browser.",
|
"description": "A light, modern and customizable startpage.",
|
||||||
"chrome_url_overrides": {
|
"chrome_url_overrides": {
|
||||||
"newtab": "index.html"
|
"newtab": "index.html"
|
||||||
},
|
},
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"storage"
|
"storage"
|
||||||
],
|
],
|
||||||
|
"icons": {
|
||||||
|
"16": "extension/icons/vision-16.png",
|
||||||
|
"48": "extension/icons/vision-48.png",
|
||||||
|
"128": "extension/icons/vision-128.png"
|
||||||
|
},
|
||||||
"content_security_policy": {
|
"content_security_policy": {
|
||||||
"extension_pages": "script-src 'self'; object-src 'self';"
|
"extension_pages": "script-src 'self'; object-src 'self';"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ Performance notes:
|
|||||||
- `Clock` updates on the minute boundary (one `setTimeout` → `setInterval(60_000)`) instead of every second.
|
- `Clock` updates on the minute boundary (one `setTimeout` → `setInterval(60_000)`) instead of every second.
|
||||||
- `jsping` cancels its 5s timeout on image resolve/error and nulls the `Image` handlers, preventing leaks across ping cycles.
|
- `jsping` cancels its 5s timeout on image resolve/error and nulls the `Image` handlers, preventing leaks across ping cycles.
|
||||||
- `ServerWidget` batches pending-status updates into one `setState` and depends on a stable servers signature (ids+addresses) so unrelated config edits don't restart pings.
|
- `ServerWidget` batches pending-status updates into one `setState` and depends on a stable servers signature (ids+addresses) so unrelated config edits don't restart pings.
|
||||||
- Icon metadata (`/icon-metadata.json`) is module-level cached, fetched lazily on first focus of the icon field with `cache: 'force-cache'`, filter debounced ~150ms, and color variants are expanded lazily during filtering rather than upfront.
|
- Icon metadata (`/icon-metadata.json`) is module-level cached and hydrated into each icon-picker instance, fetched lazily on first focus of the icon field with `cache: 'force-cache'`, filter debounced ~150ms, and color variants are expanded lazily during filtering rather than upfront.
|
||||||
- `Wallpaper` caches resolved wallpaper URLs in a module-level `Map`; its image transition and readability overlay classes live in `index.css`.
|
- `Wallpaper` caches resolved wallpaper URLs in a module-level `Map`; its image transition and readability overlay classes live in `index.css`.
|
||||||
|
|
||||||
Planned / To-do (tracked in `README.md`):
|
Planned / To-do (tracked in `README.md`):
|
||||||
@@ -88,7 +88,6 @@ vision-start/
|
|||||||
├── types.ts # Core domain types (Config, Category, Website, Server, Wallpaper)
|
├── types.ts # Core domain types (Config, Category, Website, Server, Wallpaper)
|
||||||
├── constants.tsx # DEFAULT_CATEGORIES seed data
|
├── constants.tsx # DEFAULT_CATEGORIES seed data
|
||||||
├── manifest.json # Chrome MV3 manifest (newtab override, storage permission)
|
├── manifest.json # Chrome MV3 manifest (newtab override, storage permission)
|
||||||
├── icon.png # Extension icon source
|
|
||||||
│
|
│
|
||||||
├── components/
|
├── components/
|
||||||
│ ├── Clock.tsx # Header clock widget
|
│ ├── Clock.tsx # Header clock widget
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 763 KiB After Width: | Height: | Size: 265 KiB |
Reference in New Issue
Block a user