// data.jsx — shared app + feature data for Noia Software pages

const APPS = [
  {
    id: 'hushcalc', name: 'HushCalc', abbr: 'HC', category: 'Privacy & Utilities',
    page: 'hushcalc.html',
    tagline: 'Private storage that stays private',
    desc: 'Keep photos, videos, Live Photos, and files in a local-only vault disguised as a working calculator. Organize everything on-device, sync bidirectionally with nearby Apple devices, and create encrypted portable backups—without an account or developer cloud.',
    platforms: ['iOS', 'iPadOS'],
    status: 'In development', featured: true,
    icon: 'assets/apps/hushcalc/icon.png',
    privacy: 'privacy/hushcalc.html',
    grad: 'linear-gradient(145deg, oklch(34% 0.015 70), oklch(17% 0.01 70))',
    tint: 'oklch(58% 0.08 70 / 0.18)',
    screens: [
      'assets/apps/hushcalc/feature-01.png',
      'assets/apps/hushcalc/feature-02.png',
      'assets/apps/hushcalc/feature-03.png',
      'assets/apps/hushcalc/feature-04.png',
      'assets/apps/hushcalc/feature-05.png',
      'assets/apps/hushcalc/feature-06.png',
    ],
    features: [
      { kicker: 'Disguised entry', name: 'A private vault in plain sight', desc: 'A fully functional calculator keeps private storage unobtrusive while a personal code opens the vault.', points: ['Primary and optional secondary codes can open separate galleries.', 'Leaving the app immediately locks access again.'], screen: 'assets/apps/hushcalc/feature-01.png' },
      { kicker: 'Local-only organization', name: 'A polished gallery without the cloud', desc: 'Albums, favorites, search, and sorting make a private library useful every day while every item remains stored locally.', points: ['Grid-based albums and favorites keep large collections easy to browse and revisit.', 'No account or remote photo library is required, so the data lifecycle stays under your control.'], screen: 'assets/apps/hushcalc/feature-02.png' },
      { kicker: 'Multi-format vault', name: 'Every important format in one safe place', desc: 'Photos, videos, Live Photos, and files share one consistent private browsing experience.', points: ['Live Photo, video, and document indicators keep mixed media immediately clear.', 'Search, favorites, previews, and album organization work across supported content types.'], screen: 'assets/apps/hushcalc/feature-03.png' },
      { kicker: 'Fast import', name: 'Import exactly what you need', desc: 'One add menu handles photos, videos, Live Photos, files, and nested albums without interrupting the gallery workflow.', points: ['Progress feedback supports larger imports and confirms completion before optional source deletion.', 'Create albums inside albums as content is added.'], screen: 'assets/apps/hushcalc/feature-04.png' },
      { kicker: 'Bidirectional nearby sync', name: 'Keep two vaults in step—without a cloud', desc: 'Nearby Sync compares HushCalc on two Apple devices and securely exchanges only the items each unlocked vault is missing.', points: ['A matching six-digit code verifies both devices before either person approves a clear send-and-receive preview.', 'Photos, videos, Live Photos, files, and album paths move in both directions with duplicate protection and no remote deletion.'], screen: 'assets/apps/hushcalc/feature-05.png' },
      { kicker: 'Portable encrypted backup', name: 'Your backup. Your password.', desc: 'Password-protected exports create a portable safety copy that can be stored wherever you choose.', points: ['One encrypted archive carries the vault structure and protected content.', 'Import verifies and merges without replacing the current library; the export password remains essential for recovery.'], screen: 'assets/apps/hushcalc/feature-06.png' },
    ],
  },
  {
    id: 'focusfine', name: 'FocusFine', abbr: 'FF', category: 'Productivity',
    page: 'focusfine.html',
    tagline: 'Block apps. Keep your promise.',
    desc: 'Choose the distractions in your way, decide how long you want to focus, and make a commitment. FocusFine shields selected apps until the timer ends.',
    platforms: ['iOS'],
    status: 'In development', featured: true,
    icon: 'assets/apps/focusfine/icon.png',
    privacy: 'privacy/focusfine.html',
    grad: 'linear-gradient(145deg, oklch(91% 0.24 123), oklch(70% 0.25 130))',
    tint: 'oklch(88% 0.22 123 / 0.18)',
    screens: [
      'assets/apps/focusfine/feature-01.png',
      'assets/apps/focusfine/feature-02.png',
      'assets/apps/focusfine/feature-03.png',
      'assets/apps/focusfine/feature-04.png',
      'assets/apps/focusfine/feature-05.png',
      'assets/apps/focusfine/feature-06.png',
    ],
    features: [
      { kicker: 'Precise blocking', name: 'Choose exactly what gets blocked', desc: 'FocusFine starts with the distractions that matter to you—not a generic, all-or-nothing lockout.', points: ['Select individual apps through Apple’s private Screen Time picker.', 'Keep the rest of the iPhone available while chosen distractions are shielded.'], screen: 'assets/apps/focusfine/feature-02.png' },
      { kicker: 'Flexible finish line', name: 'Set a clear end time', desc: 'Every commitment has an explicit finish, so focus feels finite, understandable, and achievable.', points: ['Choose a 25-, 50-, or 90-minute preset, or set a custom duration.', 'See the unlock time before starting; it cannot be moved once active.'], screen: 'assets/apps/focusfine/feature-04.png' },
      { kicker: 'Chosen consequence', name: 'Make quitting carry weight', desc: 'Before the session begins, choose how meaningful an early exit should feel.', points: ['Pick one of four voluntary early-exit tiers.', 'Apple charges only if you deliberately end early and confirm the purchase.'], screen: 'assets/apps/focusfine/feature-03.png' },
      { kicker: 'Active commitment', name: 'Keep the promise visible', desc: 'The live screen reduces the experience to the few signals that matter: status, time remaining, and what is at stake.', points: ['A large countdown shows progress at a glance.', 'Ending early remains available, but never becomes an accidental escape hatch.'], screen: 'assets/apps/focusfine/feature-01.png' },
      { kicker: 'Visible momentum', name: 'Turn completed sessions into a streak', desc: 'Track commitments kept, focused time, and your weekly rhythm so one successful session can lead into the next.', points: ['Progress rewards consistency, not just elapsed timer minutes.', 'Commitment history stays locally on your iPhone.'], screen: 'assets/apps/focusfine/feature-05.png' },
      { kicker: 'Positive finish', name: 'Keep the promise. Pay nothing.', desc: 'A completed commitment ends with positive reinforcement and a clear result: the focus time was finished and nothing was charged.', points: ['See completed time, zero paid, and the updated streak.', 'Start another commitment while the momentum is fresh.'], screen: 'assets/apps/focusfine/feature-06.png' },
    ],
  },
  {
    id: 'worth-the-hours', name: 'Worth the Hours', abbr: 'WH', category: 'Finance & Lifestyle',
    page: 'worth-the-hours.html',
    tagline: 'See prices in working hours',
    desc: 'Turn any price into hours of your working life, pause impulse purchases, and make the choice with a clearer head.',
    platforms: ['iOS'],
    status: 'In development', featured: true,
    icon: 'assets/apps/worth-the-hours/icon.png',
    privacy: 'privacy/worth-the-hours.html',
    grad: 'linear-gradient(145deg, oklch(62% 0.26 300), oklch(44% 0.25 290))',
    tint: 'oklch(62% 0.26 300 / 0.18)',
    screens: [
      'assets/apps/worth-the-hours/feature-01.png',
      'assets/apps/worth-the-hours/feature-02.png',
      'assets/apps/worth-the-hours/feature-03.png',
      'assets/apps/worth-the-hours/feature-04.png',
      'assets/apps/worth-the-hours/feature-05.png',
      'assets/apps/worth-the-hours/feature-06.png',
    ],
    features: [
      { kicker: 'Core conversion', name: 'A price becomes personal time', desc: 'Translate money into the hours and working days you must trade to earn it.', points: ['Use your take-home income and real work schedule.', 'Compare one-time, weekly, monthly, and yearly prices.'], screen: 'assets/apps/worth-the-hours/feature-01.png' },
      { kicker: 'Clear decision', name: 'The result leads somewhere', desc: 'See the time cost in context, then buy, skip, park, or share instead of stopping at a raw calculation.', points: ['Understand hours, working days, and recurring impact.', 'Record the choice or create a clean price-to-hours share card.'], screen: 'assets/apps/worth-the-hours/feature-02.png' },
      { kicker: 'Cooling-off', name: 'Give impulse 24 hours', desc: 'Park a purchase for a day to create distance between the urge to buy and the final choice.', points: ['Keep parked decisions visible until the pause ends.', 'Receive a local reminder only when you choose.'], screen: 'assets/apps/worth-the-hours/feature-03.png' },
      { kicker: 'Progress', name: 'Small choices become a pattern', desc: 'Decision history and statistics show what was bought, skipped, or parked—and how much working time came back.', points: ['Build a personal record instead of losing each calculation.', 'Use reclaimed-time insight without turning the app into a budget system.'], screen: 'assets/apps/worth-the-hours/feature-04.png' },
      { kicker: 'Private by design', name: 'Reflection without financial surveillance', desc: 'Get useful purchase context without an account, bank connection, or advertising profile.', points: ['Income assumptions and decisions stay on your iPhone.', 'Sharing and notifications happen only when you initiate them.'], screen: 'assets/apps/worth-the-hours/feature-05.png' },
      { kicker: 'Pro · one payment', name: 'More depth, without a subscription', desc: 'The core result stays free while one lifetime purchase unlocks the deeper decision toolkit.', points: ['Unlock insights, full history, long-term projections, and premium share styles.', 'Add Home Screen and Lock Screen widgets with no recurring fee.'], screen: 'assets/apps/worth-the-hours/feature-06.png' },
    ],
  },
  {
    id: 'readium', name: 'Paper Quest', abbr: 'PQ', category: 'Books & Reference',
    page: 'readium.html',
    tagline: 'Turn reading into momentum',
    desc: 'A private, local-first EPUB, PDF, and CBZ reader that turns focused minutes into visible progress and keeps books and comics together on one shelf.',
    platforms: ['iOS', 'iPadOS'],
    status: 'In development', featured: true,
    icon: 'assets/apps/readium/icon.png',
    grad: 'linear-gradient(145deg, oklch(68% 0.18 154), oklch(57% 0.21 37))',
    tint: 'oklch(72% 0.16 75 / 0.18)',
    privacy: 'privacy/readium.html',
    screens: [
      'assets/apps/readium/feature-01.png',
      'assets/apps/readium/feature-02.png',
      'assets/apps/readium/feature-03.png',
      'assets/apps/readium/feature-04.png',
      'assets/apps/readium/feature-05.png',
      'assets/apps/readium/feature-06.png',
    ],
    features: [
      { kicker: 'Daily reading quest', name: 'Turn reading into visible progress', desc: 'The Home screen makes the next chapter feel achievable, immediate, and worth returning to.', points: ['Choose a daily goal from 5 to 60 minutes.', 'See today’s progress, weekly rhythm, streak, and XP before resuming your book.'], screen: 'assets/apps/readium/feature-01.png' },
      { kicker: 'One organized shelf', name: 'Keep books and comics together', desc: 'Treat EPUBs, PDFs, and CBZ comics as one coherent personal library.', points: ['Group volumes or related books into an ordered series.', 'Switch between list and flexible two-, three-, or four-column grids.'], screen: 'assets/apps/readium/feature-02.png' },
      { kicker: 'Private and portable', name: 'Keep your entire reading life local', desc: 'Files, covers, notes, highlights, positions, and history remain on the device until you explicitly export them.', points: ['One complete backup carries publications, series, annotations, history, and preferences.', 'Restore merges safely instead of deleting the current shelf.'], screen: 'assets/apps/readium/feature-03.png' },
      { kicker: 'Honest streaks', name: 'Make consistency large and legible', desc: 'See exactly which days reached the reading goal and which did not—without paid streak saves.', points: ['A five-week calendar separates goal days, reading days, today, and future dates.', 'Compare today’s minutes with current and longest streaks.'], screen: 'assets/apps/readium/feature-04.png' },
      { kicker: 'Lifetime insights', name: 'Turn sessions into useful reading insight', desc: 'Understand how often, how long, when, and what you read without creating an online profile.', points: ['Compare week, month, year, and all-time trends.', 'Explore session quality, daily rhythm, genres, history, and annual Top Books.'], screen: 'assets/apps/readium/feature-05.png' },
      { kicker: 'Achievements', name: 'Reward momentum without pressure loops', desc: 'Celebrate meaningful milestones while keeping the reading itself at the center.', points: ['Earn badges for finishes, streaks, long sessions, page turning, and favorites.', 'XP stays cosmetic—there is no currency, energy, or pay-to-maintain mechanic.'], screen: 'assets/apps/readium/feature-06.png' },
    ],
  },
];

const APPS_BY_ID = APPS.reduce((m, a) => (m[a.id] = a, m), {});

// Expose to the global object so other <script type="text/babel"> files can
// reference APPS / APPS_BY_ID by bare name regardless of how Babel scopes const.
window.APPS = APPS;
window.APPS_BY_ID = APPS_BY_ID;
