Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Empty file modified android/gradlew
100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'

export default tseslint.config(
{ ignores: ['dist', 'cypress.config.ts'] },
{ ignores: ['dist', 'cypress.config.ts', 'android'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
Expand Down
124 changes: 124 additions & 0 deletions landing/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ACal - AI Calorie Tracker</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
body {
background-color: #121212;
color: #ffffff;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}
.gradient-text {
background: linear-gradient(90deg, #3b82f6, #8b5cf6, #ec4899);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body class="antialiased min-h-screen flex flex-col">
<header class="py-6 px-4 md:px-8 bg-gray-900 border-b border-gray-800">
<div class="container mx-auto flex justify-between items-center">
<div class="flex items-center gap-2">
<div class="w-8 h-8 rounded-lg bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center text-white font-bold text-xl">A</div>
<span class="text-2xl font-bold tracking-tight">ACal</span>
</div>
<a href="../release/ACal.apk" class="px-6 py-2 bg-white text-black font-semibold rounded-full hover:bg-gray-200 transition-colors hidden md:block">Download APK</a>
</div>
</header>

<main class="flex-grow">
<!-- Hero Section -->
<section class="py-20 px-4 md:px-8 text-center">
<div class="container mx-auto max-w-4xl">
<h1 class="text-5xl md:text-7xl font-extrabold mb-6 tracking-tight">
Track calories with <br class="hidden md:block"/>
<span class="gradient-text">AI-powered food scanning</span>
</h1>
<p class="text-xl text-gray-400 mb-10 max-w-2xl mx-auto">
Snap a photo of any meal and get instant nutritional breakdown. Achieve your goals with smart macro tracking and a beautiful animated dashboard.
</p>
<div class="flex flex-col sm:flex-row justify-center items-center gap-4">
<a href="../release/ACal.apk" class="px-8 py-4 bg-white text-black font-bold text-lg rounded-full hover:bg-gray-200 transition-transform hover:scale-105 flex items-center gap-2 shadow-[0_0_20px_rgba(255,255,255,0.3)]">
<i class="fa-brands fa-android text-xl"></i>
Download for Android
</a>
<a href="https://github.com/AzizX-coder/ACal" target="_blank" class="px-8 py-4 bg-gray-800 text-white font-bold text-lg rounded-full hover:bg-gray-700 transition-colors flex items-center gap-2 border border-gray-700">
<i class="fa-brands fa-github text-xl"></i>
View Source
</a>
</div>
<p class="mt-4 text-sm text-gray-500">Requires Android 8.0+ • Version 1.0.0</p>
</div>
</section>

<!-- Features Section -->
<section class="py-16 px-4 md:px-8 bg-gray-900">
<div class="container mx-auto max-w-6xl">
<h2 class="text-3xl md:text-4xl font-bold text-center mb-12">Amazing Features</h2>

<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Feature 1 -->
<div class="bg-gray-800 p-6 rounded-2xl border border-gray-700 hover:border-blue-500 transition-colors">
<div class="w-12 h-12 rounded-full bg-blue-500/20 flex items-center justify-center text-blue-500 mb-4">
<i class="fa-solid fa-camera text-xl"></i>
</div>
<h3 class="text-xl font-bold mb-2">Photo Scanning</h3>
<p class="text-gray-400">Take a photo of any meal and let our local AI analyze calories, protein, carbs, and fat instantly.</p>
</div>

<!-- Feature 2 -->
<div class="bg-gray-800 p-6 rounded-2xl border border-gray-700 hover:border-purple-500 transition-colors">
<div class="w-12 h-12 rounded-full bg-purple-500/20 flex items-center justify-center text-purple-500 mb-4">
<i class="fa-solid fa-chart-pie text-xl"></i>
</div>
<h3 class="text-xl font-bold mb-2">Smart Dashboard</h3>
<p class="text-gray-400">Visualize your daily progress with beautiful animated calorie rings and macro tracking bars.</p>
</div>

<!-- Feature 3 -->
<div class="bg-gray-800 p-6 rounded-2xl border border-gray-700 hover:border-pink-500 transition-colors">
<div class="w-12 h-12 rounded-full bg-pink-500/20 flex items-center justify-center text-pink-500 mb-4">
<i class="fa-solid fa-shield-halved text-xl"></i>
</div>
<h3 class="text-xl font-bold mb-2">Privacy First</h3>
<p class="text-gray-400">All your personal data and meal history are securely stored locally on your device.</p>
</div>

<!-- Feature 4 -->
<div class="bg-gray-800 p-6 rounded-2xl border border-gray-700 hover:border-green-500 transition-colors">
<div class="w-12 h-12 rounded-full bg-green-500/20 flex items-center justify-center text-green-500 mb-4">
<i class="fa-solid fa-bullseye text-xl"></i>
</div>
<h3 class="text-xl font-bold mb-2">Personal Goals</h3>
<p class="text-gray-400">Auto-calculated daily nutritional targets customized based on your unique profile and goals.</p>
</div>
</div>
</div>
</section>

<!-- Tech Stack -->
<section class="py-16 px-4 md:px-8 border-t border-gray-800 text-center">
<div class="container mx-auto max-w-4xl">
<p class="text-gray-400 mb-4 uppercase tracking-widest text-sm font-semibold">Built With</p>
<div class="flex flex-wrap justify-center gap-6 md:gap-12 opacity-70">
<div class="flex items-center gap-2 text-xl font-bold"><i class="fa-brands fa-react text-[#61dafb]"></i> Ionic React</div>
<div class="flex items-center gap-2 text-xl font-bold"><i class="fa-solid fa-bolt text-yellow-400"></i> Vite</div>
<div class="flex items-center gap-2 text-xl font-bold"><i class="fa-solid fa-mobile-screen text-blue-400"></i> Capacitor</div>
<div class="flex items-center gap-2 text-xl font-bold"><i class="fa-solid fa-brain text-purple-400"></i> Ollama AI</div>
</div>
</div>
</section>
</main>

<footer class="py-8 px-4 md:px-8 bg-gray-950 text-center text-gray-500 border-t border-gray-900">
<div class="container mx-auto">
<p class="mb-2">&copy; 2024 ACal App. MIT License.</p>
<p>Made with ❤️ by <a href="https://github.com/AzizX-coder" class="text-white hover:underline">AzizX-coder</a></p>
</div>
</footer>
</body>
</html>
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ionic-app-base",
"private": true,
"version": "0.0.0",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
Binary file added release/ACal.apk
Binary file not shown.
3 changes: 2 additions & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@

import { Redirect, Route } from 'react-router-dom';
import { IonApp, IonRouterOutlet, setupIonicReact, IonMenu, IonHeader, IonToolbar, IonTitle, IonContent, IonList, IonItem, IonMenuToggle, IonIcon, IonLabel } from '@ionic/react';
import { IonReactRouter } from '@ionic/react-router';
import { home, camera, time, settings, person, flame } from 'ionicons/icons';
import { home, camera, time, settings } from 'ionicons/icons';

import Dashboard from './pages/Dashboard';
import Scan from './pages/Scan';
Expand Down
2 changes: 1 addition & 1 deletion src/components/ExploreContainer.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import './ExploreContainer.css';

interface ContainerProps { }
type ContainerProps = Record<string, never>;

const ExploreContainer: React.FC<ContainerProps> = () => {
return (
Expand Down
1 change: 1 addition & 0 deletions src/components/MacroBar.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import React from 'react';
import { theme } from '../theme';

Expand Down
1 change: 1 addition & 0 deletions src/hooks/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { useState, useEffect, useCallback } from 'react';
import { Meal, DailyStats, UserProfile } from '../types';
import { storageService } from '../services/storage';
Expand Down
1 change: 1 addition & 0 deletions src/pages/Dashboard.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import React, { useState, useEffect } from 'react';
import { IonContent, IonPage, IonTitle, IonToolbar, IonButtons, IonButton, IonIcon, IonLabel } from '@ionic/react';
import { useHistory } from 'react-router';
Expand Down
1 change: 1 addition & 0 deletions src/pages/History.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any */
import React, { useState, useEffect } from 'react';
import { IonContent, IonPage, IonTitle, IonToolbar, IonButtons, IonButton, IonIcon, IonSegment, IonSegmentButton, IonLabel } from '@ionic/react';
import { useHistory } from 'react-router';
Expand Down
1 change: 1 addition & 0 deletions src/pages/Scan.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any */
import React, { useState, useRef } from 'react';
import { IonContent, IonPage, IonTitle, IonToolbar, IonButtons, IonButton, IonIcon, IonLabel, IonSegment, IonSegmentButton, IonLoading } from '@ionic/react';
import { useHistory } from 'react-router';
Expand Down
1 change: 1 addition & 0 deletions src/pages/Settings.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any */
import React, { useState } from 'react';
import { IonContent, IonPage, IonTitle, IonToolbar, IonButtons, IonButton, IonIcon, IonLabel, IonItem, IonInput, IonSelect, IonSelectOption, IonRange, IonText } from '@ionic/react';
import { useHistory } from 'react-router';
Expand Down