Conversation
- ci.yml: setup-node 20 → 24 - release.yml: add FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 env var - release.yml: softprops/action-gh-release v2.6.1 → v2 (latest patch) Fixes Node.js 20 deprecation warning on GitHub Actions runners.
Replace Blade Runner rain with premium atmospheric particle system: CosmicParticles.svelte: - Rain drops (falling vertical strips) → Dust particles (tiny floating dots) - Shooting stars removed entirely - Slow orbital drift via CSS @Keyframes dustOrbit (9-90s per orbit) - Micro-glint pulse on high-end devices (dustGlint keyframes) - Adaptive particle count: mobile 10-14, desktop 14-24 per perf tier - Ultra-low opacity (0.08-0.26) for cinematic subtlety - Smooth fade-in/fade-out on toggle (0.7s ease-out transition) - Parallax scroll effect on high-tier (30fps RAF throttled) - Visiblity API pause/resume preserved CSS: - layout.css: New .dust-particle styles, @Keyframes dustOrbit/dustGlint - animation.css: Shooting star CSS replaced with display:none legacy marker - Reduced-motion: 120s slow orbit instead of 12s rain - nav.css: Performance-tier rules updated for .dust-particle - tokens.css: --dur-particle/--dur-shoot → --dur-dust-orbit i18n (all 4 locales): - 'Toggle render mode' → 'Toggle atmosphere' - 'Render :' → 'Atmosphere :' +page.svelte: - Bot icon → Orbit icon for atmosphere toggle - Unused Bot import removed Design philosophy: slow, sparse, atmospheric, implied motion. Same aesthetic, adaptive complexity — Apple-level premium.
Root cause: visible state never set to true during onMount. Particles were created in DOM but container stayed at opacity:0 because CSS .cosmic-particles:not(.dust-active) kept it hidden. Also fixed: bmi:smoothMode event fires before lazy-loaded component mounts (race condition), so the component missed the activation signal. Changes: - Set visible=true after createParticles() in onMount - Set visible=true in handleSmoothMode when enabling - Set visible=true in handleVisibility when tab becomes visible and particles already exist
Artistic direction: space dust illuminated by invisible blackhole accretion field — visible but elegant, not nearly invisible. - Particle count: 10-24 → 20-40 (adaptive) - Particle size: 1.5-3px → 2-6px (hero larger) - Opacity: 0.08-0.26 → 0.16-0.40 (perceptible) - Orbit speed: ~90s → 22-45s (detectable) - 3-layer depth: far (60%) / mid (40%) / hero (2-3) - Gravitational center pull: 20% spiral toward center - Organic cubic-bezier easing, distorted elliptical orbit - Hero particles: warm glow halo, frequent glint - JS gravity loop on all tiers (15-30fps)
Engineering maturity: knowing which features to kill. The particle system was high maintenance, low user value, visually subtle to the point users didn't notice, and complexity > impact. Premium identity is already established through: - Transition system, typography, spacing - Glassmorphism, depth, lighting, blur hierarchy - Modal consistency, blackhole gradient ambience Removed: - CosmicParticles.svelte (deleted) - Atmosphere toggle button + Orbit icon from navbar - bmi:smoothMode event dispatch/listener - renderModeEnabled/readRenderMode from layout - smoothModeRequested/smoothModeEnhanced/smoothModeStatus from page - broadcastSmoothMode/toggleSmoothMode functions - data-graphics dataset attribute - RENDER_MODE/SMOOTH_MODE/ULTRA_SMOOTH storage keys - nav.render/nav.render_aria i18n keys (all 4 locales) - All CSS: cosmic-particles, dust-particle, dustOrbit, dustGlint, hero-particle, mid-particle, gravity-particle rules - Reduced-motion particle override in animation.css - Particle-related nav.css performance tier rules Kept: - Performance tier system (data-performance-tier) for gauge/backdrop - prefersReducedMotion for accessibility - getPerformanceTier for BmiRadialGauge + DebugPanel - Premium page transitions, hover effects, modal animations - Page transition now always uses enhanced spring strength Impact: - Smaller bundle, less repaint, less GPU usage - Better battery on mobile, less bug surface - Cleaner architecture, easier maintainability - ultraSmooth prop on BmiRadialGauge hardcoded to true
…ents and tokens - Update animation.css shooting stars comment (dust field → removed) - Update layout.css header comment (remove 'Cosmic particles') - Update tokens.css z-index stack comment (remove 'cosmic particles') - Remove unused --atmosphere-horizon CSS token Particle system was fully deleted in prior commits. This cleans up the last stale comments and an orphaned design token.
P0-1: Sync package-lock.json (was stale at v10.5.0, now v18.0.0) - Dual lockfile support: bun.lock + package-lock.json P0-2: Reduce test suite weight - Argon2 uses lightweight params in test mode (1 MiB / 1 iter) - Add test:fast, test:crypto, test:ci scripts - Reduce testTimeout from 15s to 10s P0-3: Fix verifyPassphrase() always-true bug - Old: encrypt+decrypt with same passphrase (trivially true) - New: decrypt stored verifier from enableEncryption() - Wrong passphrase now correctly returns false P0-4: Fix enableEncryption() half-implementation - Store encrypted verifier in IndexedDB on enable - hasPassphrase now checks verifier existence (not just salt) - disableEncryption clears verifier P0-5: Harden release workflow - Add @sveltejs/adapter-static to devDependencies - Create svelte.config.static.js for release builds - Use frozen-lockfile install (no mutations) - No more runtime bun add / config heredoc injection
P1-6: Silence 'fatal: not a git repository' build noise
- vite.config.ts: add stdio: ['ignore', 'pipe', 'ignore'] to git execFileSync
P1-7: Remove dynamic import warning from db.ts
- warn-dev.ts has no deps on storage/db (circular dep comment was misleading)
- Convert dynamic import() to static import — zero chunk-split benefit anyway
P1-8: Fix storage/import backup race condition
- Add StorageSetOptions { skipBackup } to storageSet()
- history-io importBmiHistory uses skipBackup: true (backup already explicit)
P1-9: Fix migration flag marks complete on partial failure
- migrateFromLocalStorage: if any key fails, do NOT set META_MIGRATED_KEY
- Failed keys will be retried on next app load
P1-10: Fix restore backup creates recursive new backup
- Add setRestoreMode(active) global flag in storage.ts
- restoreLatestBackup wraps writes in try/finally with setRestoreMode(true/false)
- storageSet skips triggerBackup when _restoreInProgress is true
- Replace all WebP logo variants (128/216/256/512) with new bmi-logigo-v2.png - Add centered logo + styled header to README.md - Source: 1254x1254 RGBA PNG, generated WebP at quality 90
- app.html line 34: og:url corrected - app.html line 47: twitter:url corrected
P2-13: Remove touchHandled state and handleTouchMove no-op handler
- touchHandled was written but never read in any decision path
- handleTouchMove was a passive listener that only set touchHandled
- Swipe detection already handled purely via touchstart/touchend
- Reduced +page.svelte by 17 lines (1505 -> ~1488 LOC)
P2-15: Fix CSV double-quote escaping in exportBmiHistoryCsv
- Added cell.replaceAll('"', '""') before wrapping in quotes
- Prevents CSV corruption if translation values contain quotes
P2-14: No change needed — APP_VERSION already in backup.ts with
bmi-update-version.ts script handling all version bumps
…1 LOC) Extracted self-contained pieces from +page.svelte to improve maintainability. Zero behavioral changes — pure extraction only. New files: - src/lib/utils/pager-spring.ts: Svelte transition function (56 LOC) - src/lib/utils/dom.ts: isEditableTarget DOM helper (13 LOC) - src/lib/components/sections/AboutSection.svelte: About page (84 LOC) - src/lib/components/sections/SettingsSection.svelte: Footer/disclaimer (34 LOC) - src/lib/components/StagingSpinner.svelte: Gear overlay spinner (15 LOC) +page.svelte: 1496→1321 lines (-175 lines, -11.7%) Removed 9 lucide icon imports (now in section components). All $state/$derived runes remain in the root component. 327 tests green, build clean.
Extracted 2 modules from EncryptionModal for better maintainability.
Zero behavioral changes — pure extraction only.
New files:
- src/lib/utils/crack-time.ts: formatCrackTime() utility (31 LOC)
- Pure function, t() passed as parameter for testability
- src/lib/components/StrengthMeter.svelte: strength meter display (122 LOC)
- Absorbs 5 derived + formatCrackTime + template + 44 LOC CSS
EncryptionModal.svelte: 1009→885 lines (-124 lines, -12.3%)
Removed: strengthLevel/Percent/Color/Label/Feedback derived,
formatCrackTime function, strength meter template, strength CSS.
Kept: strengthResult $state, strengthScore $derived, debounced
zxcvbn analysis $effect, all modal logic untouched.
415 tests green, build clean.
Security: - crypto.ts: change plaintext checksum → ciphertext checksum in meta. A plaintext SHA-256 leaked equality fingerprints (two files with same content share the same checksum). AES-GCM auth tag already provides integrity; the ciphertext checksum adds a pre-decryption sanity check without leaking plaintext equality. - history-io.ts: soften HMAC messaging — 'integrity check for corruption and casual tampering detection' instead of implying strong security. The obfuscated client-side HMAC key is not authentic protection. Performance: - vite.config.ts: tighten chunkSizeWarningLimit 2100 → 700 KB so future bundle regressions surface early. Document zxcvbn (~465 KB raw) as a known heavy lazy chunk (only loaded when encryption modal opens). Test: 44/44 crypto tests pass (encrypt/decrypt round-trip, integrity detection, checksum verification all green).
Root cause: mobile CSS treated ALL touch devices as low-end, destroying glass depth with blur(6px)/blur(4px), capping container at 400px, and shrinking gauge below SVG size. Changes: - responsive-mobile-perf.css: T-GLASS blocks upgraded from blur(6px)/blur(4px) to blur(14px)/blur(10px) with desktop-grade saturate(170%)/brightness(1.08). Uses CSS variables for consistency. Added T-GLASS-FALLBACK for very narrow devices (<360px only). - NEW responsive-content.css: Final correction layer loaded after mobile-perf. Fixes: container max-width:400px cap removed, gauge container never smaller than SVG, fluid icon clamp tokens, text wrapping for large font/accessibility zoom, auto-fit grid layouts. - form.css: 40vh margins → 10vh (bmi-grid, bmi-card), min-height 750px → clamp(560px,70vh,750px) for adaptive card height. - layout.css: 40vh margins → 10vh (section-header, about-grid, footer-disclaimer). - components.css: hero-content margin-bottom 40vh → 12vh. - +layout.svelte: Added responsive-content.css import after mobile-perf.css. Design principle: mobile optimization should remove expensive motion/hover/shine, NOT downgrade core glass visual identity. Desktop and mobile now share the same premium design language.
…velte. Eslint warning resolved. Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com>
- Add MOBILE PREMIUM GLASS block at bottom of responsive-content.css as final source of truth, loaded after responsive-mobile-perf.css. Ensures blur(16px) saturate(180%) brightness(1.15) on all cards at max-width:600px regardless of earlier layer overrides. - Remove .footer-disclaimer from shared width:100% card selector; use width:auto + max-width:100% + margin-inline:0 to prevent right-edge overflow caused by width:100% + horizontal margins. - Add .github-footer margin-inline:0 neutralization. - Dedicate .footer-disclaimer premium glass rule (separate from generic card group) with full desktop-quality backdrop values.
…g v19.1
- Remove preload for new_bmi_logo_216.webp (logo uses srcset responsive
images + opacity animation, preload causes unused-resource warning)
- Add ZERO SHADOW POLICY at absolute bottom of responsive-content.css:
*, *::before, *::after { box-shadow: none !important; }
- Rewrite FINAL MOBILE GLASS SOURCE OF TRUTH with:
- Stronger selectors (html body .main-container) to beat earlier layers
- Width-based @media (not pointer-based) for DevTools compatibility
- Gradient background replacing box-shadow for glass depth
- outline + outline-offset for subtle border depth
- blur(16px) saturate(180%) brightness(1.15) on all cards
- blur(12px) saturate(160%) brightness(1.08) on results card
- Remove T-GLASS/T-GLASS-HERO/T-GLASS-CALC/T-GLASS-RESULTS/
T-GLASS-FALLBACK from responsive-mobile-perf.css — this file now
ONLY handles performance (transitions, animations, transforms, will-change).
Glass visuals are the sole responsibility of responsive-content.css.
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com>
Co-authored-by: oxchin <198712908+oxchin@users.noreply.github.com> Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com>
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com>
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 534df68f7efe · 3 file · +18/-17 · 2026-05-14T07:43:55Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 6e3423c5eee4 · 2 file · +7/-6 · 2026-05-14T07:49:31Z
- Bump version 18.0.0 → 20.0.0 via bmi-update-version.ts
(package.json, README, app.html, i18n locales, LICENSE, backup.ts)
- Dead code cleanup:
- Delete src/lib/assets/favicon.svg (0 bytes, unused)
- Delete static/.well-known/appspecific/com.chrome.devtools.json
- Delete STORAGE_UPGRADE_SUMMARY.md (stale migration doc)
- Remove 9 unused CSS classes (~100 lines):
.skeleton-results, .shooting-star, .btn-haptic (animation.css)
.cosmic-orbs, .orb, .orb-1 (components.css)
.sparkle-icon (components.css)
.plasma-star (layout.css + nav.css perf rule)
.text-overflow-ellipsis, .text-break-word (base.css)
- Move misplaced test: share-image.test.ts from components/__tests__
to utils/__tests__ (tests a utils module, not a component)
- Fix vitest.config.ts: use path.resolve(__dirname) for setupFiles
instead of relative path (fixes module resolution in nested CWD)
- CI path filtering: only trigger full CI on src/, scripts/,
config files, and lock files. Skip for docs-only and
non-code changes.
- Fix bmi-update-version.ts: add AboutSection.svelte to update targets, expand fixVersionDrift() to check README.md and AboutSection.svelte, remove border decorations from console output - Fix version drift: README.md v18.0 → v20.0, AboutSection.svelte v18.0 → v20.0 - README.md: ensure Stellar version appears only once (title only), update project structure to reflect 17 CSS files, update CSS Architecture - data-cards.css: add border-left and border-right 1px solid var(--text-muted) to ref-row-underweight through ref-row-obese for consistent table borders
Add @media (max-width: 400px) rule for .bmi-encryption-badge: - flex-wrap: wrap to allow content wrapping - white-space: normal (override nowrap) - justify-content: center for balanced layout - Slightly smaller font sizes for label and algo text - max-width: 100% to prevent overflow
…mpanion' P0 changes: - package.json: name → bmi-stellar, new description & keywords - app.html: SEO meta, OG, Twitter cards → BMI Stellar branding - manifest.json: name, short_name, description, categories updated - AboutSection.svelte: expand from 2→6 cards (limitations, features, privacy, encrypted backups, open source + info-row overhaul) - README.md: project description, privacy claim, SvelteKit version, test count, mobile perf section, zero-shadow policy P1 changes: - i18n: meta.*, hero.*, about.limit_*, about.features_*, about.privacy_*, about.backup_*, about.opensource_*, about.data_model/local_first/backup_optional/pwa_type/status_rc keys added to all 4 locales (en/id/ja/zh) - crypto.encryption_badge: 'End-to-end encrypted' → 'Passphrase-encrypted backup' (all locales) - share.title/footer/card_branding/card_header → BMI Stellar (all locales) - history.invalid_format → BMI Stellar (all locales) - JSDoc comments: 'BMI Calculator' → 'BMI Stellar' (6 files) - share-image.ts: share title → 'BMI Stellar Result' - +error.svelte: page title → 'BMI Stellar' - package-lock.json: name → bmi-stellar - LICENSE.md: header → 'BMI Stellar – v20.0' Sweep: - share.test.ts: brand assertion → 'BMI Stellar' - share-image.test.ts: mock branding → 'BMI Stellar'
Bug 1 — About page new icons (ListChecks, Database, LockKeyhole, HeartPulse) were missing color and size styling: - icons.css: add new icons to .Lightbulb/.Users group with color: var(--cosmic-purple) + clamp(30px,6vw,48px) sizing - responsive-content.css: add new icons to icon-card-md group - responsive-width.css: add new icons to both compact (36px) and further-reduced (30px) breakpoints Bug 2 — Navbar top/bottom looked plain black instead of premium glass like all other containers: - nav.css: add brightness(1.15) to match content-container glass, change blur 24px→16px for consistency, upgrade border from var(--w-8) → var(--w-10) - +page.svelte: update scoped border to var(--w-10) - responsive-mobile-perf.css: add brightness(1.15) to mobile navbar glass rule
Bug 1 — Icons in 'Open Source & Release' info-row inherited the large about-card-header sizing (30–48px) because .Database/.LockKeyhole selectors were unscoped. Now the large sizing only applies inside .about-card-header, and a new .info-row override forces compact 20px icons that are independent from the header rules. All responsive breakpoints (480px, 360px, 600px) updated to match the scoped selector pattern. Bug 2 — Navbar backgrounds rendered as plain black on some mobile/desktop combinations because Svelte scoped styles (.pager-nav-shell.svelte-xxxxx, specificity 0-2-0) could interfere with the global glassmorphism rules (.pager-nav-shell, specificity 0-1-0). Added high-specificity selectors (html body .pager-nav-shell, specificity 0-3-0) with !important in nav.css, responsive-content.css, responsive-mobile-perf.css, and responsive-backdrop.css to guarantee the glassmorphism backdrop-filter and background always win.
…gn v20.0 Bug fixes: - Fix navbar (top/bottom) glassmorphism: add backdrop-filter with !important to Svelte scoped .pager-nav-shell style, ensuring glass effect wins over scoped specificity on both mobile and desktop - Remove contain:layout from navbar shells in responsive-mobile-perf.css (changed to contain:style only) — contain:layout can interfere with backdrop-filter compositing on some mobile browsers - Fix info-row icons (Database, LockKeyhole) in 'Open Source & Release' card body: increase specificity to .about-card .info-row :is() to guarantee win over .about-card-header responsive overrides - Add semantic color tokens for all info-row icons (purple for brand, green for security/trust, red for health) - Add .about-card-header .AlertTriangle to about header icon rule (was inheriting global yellow instead of purple like other about icons) Responsive design (v20.0 premium hardening): - Add base styles for .app-info, .info-row, .commit-id, .text-gradient- elegant in layout.css (previously unstyled) - Add fluid responsive rules for about cards at <=600px: header gap, h3, paragraph text, info-row layout with flex-wrap and clamp() - Add emergency compact rules at <=360px: tighter gaps, smaller fonts - Add extreme compact rules at <=300px and <=250px for info-rows - Add fluid info-row body icon sizing at <=600px: clamp(16px, 5vw, 20px) independent from header icon sizing
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 97fc14eaf4a1 · 3 file · +3/-0 · 2026-05-17T16:23:54Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · f663e2c8b20e · 1 file · +1/-1 · 2026-05-17T16:58:38Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · e7016f08d4b4 · 4 file · +77/-35 · 2026-05-18T02:00:46Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 5ee5cd2d8387 · 8 file · +0/-0 · 2026-05-18T02:09:09Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 8b0eb1810ba1 · 2 file · +62/-98 · 2026-05-18T02:50:33Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · f7b4db5edfe2 · 7 file · +28/-28 · 2026-05-18T03:19:52Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 022c311eef89 · 4 file · +123/-64 · 2026-05-18T03:45:57Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · c60c8593fbda · 4 file · +20/-12 · 2026-05-18T04:08:12Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 38dfc4ee4e9f · 2 file · +127/-11 · 2026-05-18T04:24:25Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 90369026fada · 1 file · +20/-6 · 2026-05-18T04:59:01Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 70b91e4f0aae · 4 file · +4/-4 · 2026-05-18T05:10:36Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 51df639e59e3 · 6 file · +34/-59 · 2026-05-18T06:05:15Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 584fd2c51777 · 8 file · +60/-43 · 2026-05-18T06:48:31Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · fdbc8e45f3ae · 4 file · +80/-48 · 2026-05-18T07:06:53Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · f51df54f413a · 5 file · +44/-6 · 2026-05-18T07:27:25Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · a2018f448d75 · 6 file · +11/-1035 · 2026-05-18T07:44:04Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 49fcd772f280 · 2 file · +0/-0 · 2026-05-18T08:01:14Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · 3654be12cbcc · 3 file · +95/-95 · 2026-05-18T08:14:40Z
Signed-off-by: rezky_nightky <130107241+oxyzenQ@users.noreply.github.com> ── bmi/dev · c328a045eeb0 · 1 file · +93/-93 · 2026-05-18T08:20:56Z
| @@ -19,113 +20,122 @@ | |||
|
|
|||
| let runtimeTrimInProgress = false; | |||
|
|
|||
| sw.addEventListener('message', (event) => { | |||
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…ication in `postMessage` handler' Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.