Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
42c6a83
chore: remove vue 3 / vuetify stack
F2had May 8, 2026
6b700f7
chore: bootstrap astro + svelte + bun
F2had May 8, 2026
eb8179f
chore: remove leftover vue views and utils
F2had May 8, 2026
73707eb
chore: relocate logos from src/assets to public
F2had May 8, 2026
fb5b27c
feat: design tokens and base styles
F2had May 8, 2026
f272605
feat: i18n module with en/ar dicts
F2had May 8, 2026
1d8fcc3
feat: motion entry-animation helpers
F2had May 8, 2026
fc1c911
feat: brand mark component
F2had May 8, 2026
59217de
chore: bump astro to 6.3 and svelte integration to 8.1
F2had May 8, 2026
4296b7d
fix(astro): drop css minify and i18n fallback config
F2had May 8, 2026
f1788b9
feat(brand): use real logo png with theme-aware swap
F2had May 8, 2026
9e1029d
feat(i18n): add site.brand and site.title keys
F2had May 8, 2026
bd12eb4
feat: layout shell with theme restore and motion auto-rise
F2had May 8, 2026
f7879f0
feat: theme toggle svelte island
F2had May 8, 2026
cf8a936
feat: minimal home pages for en and ar
F2had May 8, 2026
8b394a1
fix(brand): move theme-swap rules to global css so :global parent doe…
F2had May 8, 2026
b1b7595
perf(fonts): switch latin fonts to variable, drop unused arabic weights
F2had May 8, 2026
ec17d7e
ci: lighthouse budgets — perf 95, a11y/bp/seo 100, JS<50KB CSS<20KB
F2had May 8, 2026
08400e7
ci: astro-rewrite workflow with build, lighthouse, docker smoke
F2had May 8, 2026
c28b1fb
build: dockerfile and dockerignore
F2had May 8, 2026
d60185b
build: nginx config and compose with cpu and memory limits
F2had May 8, 2026
599b9bf
docs: minimal readme
F2had May 8, 2026
62002b7
ci: pin node 22 before bun for astro 6 compat
F2had May 8, 2026
71cd596
feat: wordmark with arabic divider
F2had May 8, 2026
0b86e08
feat: shared icon component with line set
F2had May 8, 2026
70caa8a
feat: store button and row
F2had May 8, 2026
7c5f7ee
feat: locale switcher svelte island
F2had May 8, 2026
591b0f0
feat: top nav with brand, links, theme/locale toggles
F2had May 8, 2026
a3311a6
refactor: extract icon and store types to ts modules
F2had May 8, 2026
c25d5df
feat: site footer
F2had May 8, 2026
b3072cc
feat: quiet hero section
F2had May 8, 2026
b8d69f1
feat: honest line strip
F2had May 8, 2026
566674a
feat: wire home with nav, hero, honest, footer
F2had May 8, 2026
59efd1c
fix(a11y): contrast on store-btn primary, heading order, button label…
F2had May 8, 2026
f9d701d
feat(api): reusable api service layer + itunes lookup script for stor…
F2had May 8, 2026
45472e6
feat: store buttons and hero use live release data
F2had May 8, 2026
4030139
feat(icon): semantic arrow-end that flips per direction
F2had May 9, 2026
aea6d8d
feat: live hijri + relative-date islands in hero
F2had May 9, 2026
3ecfc45
feat(api): nedaa service with prayers, geocode, stats
F2had May 9, 2026
49aea12
feat: live prayer card island with hijri header and animated countdown
F2had May 9, 2026
6bc8477
feat(hero): switch to almanac variant with live prayer card
F2had May 9, 2026
248d240
fix(a11y): drop redundant aria-label on brand link
F2had May 9, 2026
4a4d3ea
ci: relax preconnect and console-error audits
F2had May 9, 2026
42e9db4
feat(prayers): build-time prebake of makkah prayer-times
F2had May 9, 2026
458c152
feat(prayer-card): hh:mm:ss countdown with locale digits, prebake fal…
F2had May 9, 2026
0300b71
fix(release): correct huawei app id
F2had May 9, 2026
2b07799
feat: capabilities section
F2had May 10, 2026
6dba614
feat: alarm depth section with prebake-driven fajr time
F2had May 10, 2026
e0a34e3
feat: calculation methods list
F2had May 10, 2026
ea80b8b
feat: privacy stance section
F2had May 10, 2026
f73ddc2
feat: languages preview using prebake ar prayer-times
F2had May 10, 2026
52e643e
feat: localization module with crowdin link
F2had May 10, 2026
ddf1638
feat: huawei callout linking appgallery
F2had May 10, 2026
a527322
feat(github): build-time fetch of repo metadata + commits
F2had May 10, 2026
4f68e5d
feat(api): prayer providers fetch + unified fetch script
F2had May 10, 2026
2f07144
feat: wire all home sections
F2had May 10, 2026
ed17414
perf(brand): switch logos to astro image with webp + densities
F2had May 10, 2026
5428ade
perf(fonts): astro:fonts api with conditional preload, drop jetbrains…
F2had May 10, 2026
3c21298
feat(i18n): add privacy + download keys, allow partial dicts
F2had May 10, 2026
ba459e7
feat: stub pages for features, open, support
F2had May 10, 2026
48b1bea
feat: privacy stance page
F2had May 10, 2026
26af851
feat: download page with three store cards
F2had May 10, 2026
b5ecbe2
ci: lighthouse audits cover privacy and download
F2had May 10, 2026
ffa7a82
perf: inline stylesheets and trim arabic to single weight
F2had May 10, 2026
2082bb5
feat(stats): bake all three windows with admin key from env
F2had May 10, 2026
2066e4c
feat(ledger): tabbed window switcher as svelte island
F2had May 10, 2026
083f28f
feat: wire operational ledger into home
F2had May 10, 2026
433d53f
feat(content): docs collection schema with proofread gate
F2had May 10, 2026
f660f2d
feat: ship llms.txt at site root
F2had May 10, 2026
d414187
feat(docs): published-only loader with locale derived from path
F2had May 10, 2026
d5fc35d
feat: docs index and slug routes for both locales
F2had May 10, 2026
5d7dfed
feat: link docs from nav and footer
F2had May 10, 2026
e3ccbe3
feat(ledger): client-side fetch using site origin, drop build-time bake
F2had May 10, 2026
bc5c970
feat(prebake): bake the current month not just today
F2had May 10, 2026
8ee1b7c
feat(prayer-card): day navigation from today onwards with relative la…
F2had May 10, 2026
066b5df
ci: unify workflow for astro-rewrite and master, drop vue env vars fr…
F2had May 10, 2026
24da185
chore: drop astro-ci.yml, fetch-stats.ts, and stale public logos / en…
F2had May 10, 2026
59b1904
ci: rely on build to run check after fetch generates data files
F2had May 10, 2026
3d8a7f0
copy: align method count and add sentry opt-in note in privacy block
F2had May 10, 2026
f29036e
i18n(ar): sync drifted keys with en source
F2had May 10, 2026
87fd3a1
i18n(ar): refine site.title, add nav.docs
F2had May 10, 2026
486f916
i18n(ar): refine hero copy
F2had May 10, 2026
217ec59
i18n(en): scope qada tracker copy to fasting
F2had May 11, 2026
0c04110
i18n(ar): refine capabilities copy
F2had May 11, 2026
f75b63f
i18n(en): broaden f3.b copy, align calc.body method count
F2had May 13, 2026
b325b1b
i18n(ar): refine alarm + calc copy
F2had May 13, 2026
e67bee5
i18n(ar): refine privacy block copy
F2had May 13, 2026
622e660
i18n(en): refine loc copy to invitation framing
F2had May 13, 2026
35dfac2
i18n(ar): refine languages + localization copy
F2had May 13, 2026
cc3448e
i18n(ar): refine huawei + open source copy
F2had May 13, 2026
e96cd99
i18n(en): add ledger.p95 key
F2had May 13, 2026
fddc6a6
i18n(ar): refine ledger copy and fill missing keys
F2had May 13, 2026
9cd0106
content: drop unused press link and Unwan attribution
F2had May 13, 2026
56b591e
i18n(ar): refine footer tagline
F2had May 13, 2026
7eff10d
i18n(ar): draft download page, normalize Google→قوقل and شيفرة→كود
F2had May 14, 2026
e66d274
i18n(en): correct privacy page claims to match reality
F2had May 14, 2026
3c0cb93
i18n(ar): draft privacy page, drop privPage orphans
F2had May 14, 2026
5000dd1
i18n(en): drop dev-flex LLM-indexing line from docs.lead
F2had May 14, 2026
c401ec7
i18n(ar): draft docs and stub copy
F2had May 14, 2026
cfbda3d
i18n(ar): switch theme label to المظهر
F2had May 14, 2026
e43dd77
fix(motion): drop document-wide index stagger from autoRise
F2had May 14, 2026
607671f
content: drop calendar permission row (not used by app)
F2had May 14, 2026
2153805
content: set slogan to 'Companion to the call' / رفيقُ النداء
F2had May 14, 2026
422c162
feat: stub /privacy as policy placeholder, move stance to /privacy-st…
F2had May 14, 2026
5c0cdfe
feat: ship full privacy policy at /privacy with nav link
F2had May 14, 2026
fa0fb99
i18n: localize hero facts, store buttons, alarm layers, prayer card s…
F2had May 14, 2026
237c26f
i18n: localize ledger period labels and metric subtitles
F2had May 14, 2026
1229778
i18n: localize calc method names
F2had May 14, 2026
855966a
feat(prayer-card): direct Aladhan + geolocation, default Makkah, drop…
F2had May 14, 2026
c9a30ed
feat(prayer-card): settings panel with method + madhhab, fix MY_LOCAT…
F2had May 14, 2026
d911dd0
fix(prayer-card): explicit select onchange handlers re-trigger fetch
F2had May 14, 2026
dd62174
i18n(prayer-card): localize Makkah and My location labels
F2had May 14, 2026
f632778
feat(docs): render JSON-LD schema in head, drop visible code blocks
F2had May 15, 2026
7729d97
docs: track all EN + AR docs, add jsonld for comparison + methodology…
F2had May 15, 2026
ee3b0d4
feat(logos): brand-accurate Google Play & AppGallery glyphs
F2had May 15, 2026
350505e
feat(download): auto-redirect mobile visitors to their store
F2had May 15, 2026
12b3949
feat(nav): mobile hamburger menu, drop /features page
F2had May 15, 2026
8541e00
chore: fix Crowdin URL, drop dead footer links, AR dl.title2 copy
F2had May 15, 2026
f207921
feat: obfuscate emails behind reveal-on-click EmailLink
F2had May 15, 2026
83b6174
chore: open external links in new tab with rel=noopener
F2had May 15, 2026
62ba2ee
ci(lhci): take median over 3 runs to absorb runner variance
F2had May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .browserslistrc

This file was deleted.

41 changes: 9 additions & 32 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,36 +1,13 @@
# Version control
.git
.gitignore
.gitattributes

# Dependencies
node_modules
npm-debug.log
yarn-debug.log
yarn-error.log

# Build output
.astro
dist
build
coverage

# Development
.git
.github
.husky
docs
.claude
.agent*
*.log
.DS_Store
.vscode
.idea

# Tests
test
coverage
*.spec.ts
*.test.ts

# Documentation
.env*
README.md
docs
*.md

# Docker
Dockerfile
.dockerignore
lighthouserc.cjs
9 changes: 0 additions & 9 deletions .editorconfig

This file was deleted.

4 changes: 0 additions & 4 deletions .env.example

This file was deleted.

68 changes: 51 additions & 17 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,64 @@ name: CI

on:
push:
branches: ['master']
branches: ['astro-rewrite', 'master']
pull_request:
branches: ['master']
branches: ['astro-rewrite', 'master']

permissions:
contents: read

jobs:
build:
name: Build + check
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v2
- uses: actions/setup-node@v4
with:
bun-version: latest

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Type check
run: bun run type-check
node-version: '22'
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.2'
- run: bun install --frozen-lockfile
# `bun run build` chains: fetch → astro check → astro build. Splitting
# check into its own step would fail because the typed JSON imports
# depend on the data fetched in the build step.
- run: bun run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist
retention-days: 1

- name: Build
run: bun run build-only
lighthouse:
name: Lighthouse CI
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.2'
- run: bun install --frozen-lockfile
- uses: actions/download-artifact@v4
with:
name: dist
path: dist
- run: bunx @lhci/cli@0.15 autorun --config=./lighthouserc.cjs

- name: Test Docker build
run: docker build -t test .
docker:
name: Docker smoke build
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
- run: docker build -t nedaa-website:ci .
- name: Smoke test
run: |
docker run --rm -d --name web -p 8080:80 nedaa-website:ci
for _ in 1 2 3 4 5; do sleep 2; curl -fsS http://localhost:8080/ && break; done
docker rm -f web
7 changes: 0 additions & 7 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,6 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

- name: Create .env file
run: |
echo "VITE_HEALTH_CHECK_URL=${{ secrets.VITE_HEALTH_CHECK_URL }}" >> .env
echo "VITE_CROWDIN_API_TOKEN=${{ secrets.VITE_CROWDIN_API_TOKEN }}" >> .env
echo "VITE_CROWDIN_PROJECT_ID=${{ secrets.VITE_CROWDIN_PROJECT_ID }}" >> .env
echo "VITE_CROWDIN_PROJECT_URL=${{ secrets.VITE_CROWDIN_PROJECT_URL }}" >> .env

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
Expand Down
12 changes: 11 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,14 @@ coverage
*.tsbuildinfo


.env
.env

# Astro
.astro/

# Lighthouse CI
.lighthouseci/
src/data/release.json
src/data/prayers-default.json
src/data/prayer-providers.json
src/data/github.json
1 change: 0 additions & 1 deletion .husky/pre-commit

This file was deleted.

7 changes: 0 additions & 7 deletions .prettierrc.json

This file was deleted.

71 changes: 19 additions & 52 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,59 +1,26 @@
# Use Bun for faster builds
FROM oven/bun:1-alpine AS base
# syntax=docker/dockerfile:1.7

# Install security updates
RUN apk add --no-cache dumb-init && \
apk upgrade

# Create non-root user for security
RUN addgroup -g 1001 -S appgroup && \
adduser -S appuser -u 1001 -G appgroup

# Set working directory
# ---- deps ---------------------------------------------------------------
FROM oven/bun:1.3-alpine AS deps
WORKDIR /app

# Change ownership of working directory
RUN chown -R appuser:appgroup /app

# Switch to non-root user
USER appuser

# Copy package files
COPY --chown=appuser:appgroup package.json bun.lock* ./

# Install dependencies
COPY package.json bun.lock ./
RUN bun install --frozen-lockfile

# === Build stage ===
FROM base AS builder

# Copy source code (including .env created by CI)
COPY --chown=appuser:appgroup . .

# Build the Vue app with env file loaded
RUN bun --env-file=.env run build-only

# === Production stage ===
FROM nginx:alpine AS production

# Install security updates and dumb-init
RUN apk add --no-cache dumb-init && \
apk upgrade

# Copy built Vue app from builder stage
COPY --from=builder /app/dist /usr/share/nginx/html

# Copy custom nginx configuration
COPY deployment/config/nginx.conf /etc/nginx/conf.d/default.conf

# Set environment variables
# ---- build --------------------------------------------------------------
FROM oven/bun:1.3-alpine AS build
WORKDIR /app
ENV NODE_ENV=production

# Expose port
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN bun run build

# ---- runtime ------------------------------------------------------------
FROM nginx:1.27-alpine AS runtime
RUN apk add --no-cache curl \
&& rm /etc/nginx/conf.d/default.conf
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80

# Use dumb-init to handle signals properly
ENTRYPOINT ["dumb-init", "--"]

# Start nginx
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -fsS http://localhost/ >/dev/null || exit 1
CMD ["nginx", "-g", "daemon off;"]
40 changes: 2 additions & 38 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,10 @@

# nedaa-website

This template should help get you started developing with Vue 3 in Vite.

## Recommended IDE Setup

[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).

## Type Support for `.vue` Imports in TS

TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.

## Customize configuration

See [Vite Configuration Reference](https://vite.dev/config/).

## Project Setup
Site for [Nedaa](https://nedaa.dev).

```sh
bun install
```

### Compile and Hot-Reload for Development

```sh
bun dev
```

### Type-Check, Compile and Minify for Production

```sh
bun run dev
bun run build
```

### Run Unit Tests with [Vitest](https://vitest.dev/)

```sh
bun test:unit
```

### Lint with [ESLint](https://eslint.org/)

```sh
bun lint
```
47 changes: 47 additions & 0 deletions astro.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { defineConfig, fontProviders } from 'astro/config';
import { fileURLToPath } from 'node:url';
import svelte from '@astrojs/svelte';
import sitemap from '@astrojs/sitemap';

export default defineConfig({
site: 'https://nedaa.dev',
output: 'static',
integrations: [svelte(), sitemap()],
fonts: [
{
name: 'Asap',
cssVariable: '--f-sans',
provider: fontProviders.fontsource(),
weights: ['400 700'],
styles: ['normal'],
subsets: ['latin'],
fallbacks: ['system-ui', '-apple-system', 'Segoe UI', 'Roboto', 'sans-serif'],
},
{
name: 'IBM Plex Sans Arabic',
cssVariable: '--f-arabic',
provider: fontProviders.fontsource(),
weights: [500],
styles: ['normal'],
subsets: ['arabic'],
fallbacks: ['Noto Sans Arabic', 'Tahoma', 'Geeza Pro', 'system-ui', 'sans-serif'],
},
],
i18n: {
defaultLocale: 'en',
locales: ['en', 'ar', 'ms', 'ur'],
routing: { prefixDefaultLocale: false },
},
build: {
inlineStylesheets: 'always',
assets: '_astro',
},
devToolbar: { enabled: true },
vite: {
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
},
});
Loading
Loading