← back to Calc 67
initial snapshot — gitify all builds (CLAUDE.md rule 2026-05-06)
cb71b6fff108dd4ccd92b843df88204047e35536 · 2026-05-06 10:20:40 -0700 · Steve
Files touched
A .gitignoreA 67calc.tar.gzA APP_STORE_ASSETS_CHECKLIST.mdA APP_STORE_COPY_PASTE.txtA DEPLOY.mdA FEATURES.mdA FINAL_STEPS_WHEN_READY.mdA FINAL_SUBMISSION_GUIDE.mdA README.mdA SUBMISSION_GUIDE.mdA XCODE_AND_APPSTORE_GUIDE.mdA app/globals.cssA app/icon.svgA app/layout.tsxA app/page.tsxA app/privacy/page.tsxA app/support/page.tsxA capacitor.config.tsA components/BMICalculator.tsxA components/MortgageCalculator.tsxA components/ScientificCalculator.tsxA components/TipCalculator.tsxA ios/.gitignoreA ios/App/App.xcodeproj/project.pbxprojA ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plistA ios/App/App/AppDelegate.swiftA ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.pngA ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.jsonA ios/App/App/Assets.xcassets/Contents.jsonA ios/App/App/Assets.xcassets/Splash.imageset/Contents.jsonA ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.pngA ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.pngA ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.pngA ios/App/App/Base.lproj/LaunchScreen.storyboardA ios/App/App/Base.lproj/Main.storyboardA ios/App/App/Info.plistA ios/App/PodfileA next.config.jsA package-lock.jsonA package.jsonA postcss.config.jsA public/67calc.tar.gzA public/celebration.mp3A public/favicon.svgA public/icon-192.pngA public/icon-512.pngA public/icon.svgA public/manifest.jsonA tailwind.config.tsA tsconfig.jsonA vercel.json
Diff
commit cb71b6fff108dd4ccd92b843df88204047e35536
Author: Steve <steve@designerwallcoverings.com>
Date: Wed May 6 10:20:40 2026 -0700
initial snapshot — gitify all builds (CLAUDE.md rule 2026-05-06)
---
.gitignore | 26 +
67calc.tar.gz | Bin 0 -> 45 bytes
APP_STORE_ASSETS_CHECKLIST.md | 267 ++
APP_STORE_COPY_PASTE.txt | 246 ++
DEPLOY.md | 90 +
FEATURES.md | 122 +
FINAL_STEPS_WHEN_READY.md | 203 ++
FINAL_SUBMISSION_GUIDE.md | 298 ++
README.md | 77 +
SUBMISSION_GUIDE.md | 333 +++
XCODE_AND_APPSTORE_GUIDE.md | 301 ++
app/globals.css | 49 +
app/icon.svg | 4 +
app/layout.tsx | 54 +
app/page.tsx | 118 +
app/privacy/page.tsx | 79 +
app/support/page.tsx | 106 +
capacitor.config.ts | 9 +
components/BMICalculator.tsx | 166 ++
components/MortgageCalculator.tsx | 148 +
components/ScientificCalculator.tsx | 104 +
components/TipCalculator.tsx | 173 ++
ios/.gitignore | 13 +
ios/App/App.xcodeproj/project.pbxproj | 408 +++
.../xcshareddata/IDEWorkspaceChecks.plist | 8 +
ios/App/App/AppDelegate.swift | 49 +
.../AppIcon.appiconset/AppIcon-512@2x.png | Bin 0 -> 110522 bytes
.../AppIcon.appiconset/Contents.json | 14 +
ios/App/App/Assets.xcassets/Contents.json | 6 +
.../Assets.xcassets/Splash.imageset/Contents.json | 23 +
.../Splash.imageset/splash-2732x2732-1.png | Bin 0 -> 41273 bytes
.../Splash.imageset/splash-2732x2732-2.png | Bin 0 -> 41273 bytes
.../Splash.imageset/splash-2732x2732.png | Bin 0 -> 41273 bytes
ios/App/App/Base.lproj/LaunchScreen.storyboard | 32 +
ios/App/App/Base.lproj/Main.storyboard | 19 +
ios/App/App/Info.plist | 61 +
ios/App/Podfile | 24 +
next.config.js | 13 +
package-lock.json | 3063 ++++++++++++++++++++
package.json | 28 +
postcss.config.js | 6 +
public/67calc.tar.gz | Bin 0 -> 134318394 bytes
public/celebration.mp3 | Bin 0 -> 23032 bytes
public/favicon.svg | 4 +
public/icon-192.png | 5 +
public/icon-512.png | 5 +
public/icon.svg | 5 +
public/manifest.json | 24 +
tailwind.config.ts | 23 +
tsconfig.json | 40 +
vercel.json | 7 +
51 files changed, 6853 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d8dc46a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+# Dependencies
+node_modules/
+
+# Next.js
+/.next/
+.vercel
+
+# Production
+/build
+
+# Misc
+.DS_Store
+*.pem
+
+# Debug
+npm-debug.log*
+
+# Local env files
+.env*.local
+
+# TypeScript
+*.tsbuildinfo
+next-env.d.ts
+
+# Capacitor
+.capacitor/
diff --git a/67calc.tar.gz b/67calc.tar.gz
new file mode 100644
index 0000000..872c015
Binary files /dev/null and b/67calc.tar.gz differ
diff --git a/APP_STORE_ASSETS_CHECKLIST.md b/APP_STORE_ASSETS_CHECKLIST.md
new file mode 100644
index 0000000..2ab6299
--- /dev/null
+++ b/APP_STORE_ASSETS_CHECKLIST.md
@@ -0,0 +1,267 @@
+# App Store Assets Checklist
+
+This checklist covers all the assets and information you'll need to submit Boomer Calc to the App Store.
+
+## ✅ Already Completed
+
+- [x] App Icon (1024x1024)
+- [x] Bundle ID configured (com.boomercalc.app)
+- [x] App Name configured (Boomer Calc)
+- [x] Info.plist privacy descriptions
+- [x] Basic Xcode project setup
+
+## 📸 Screenshots Required
+
+### iPhone Screenshots (REQUIRED)
+You need screenshots from the largest iPhone size:
+
+**6.7" Display (iPhone 15 Pro Max, 14 Pro Max, or 13 Pro Max)**
+- Resolution: 1290 x 2796 pixels (portrait) OR 2796 x 1290 (landscape)
+- Quantity: Minimum 1, maximum 10
+- Format: PNG or JPEG
+
+**How to capture:**
+1. Open Xcode
+2. Select iPhone 15 Pro Max simulator
+3. Run your app (Cmd + R)
+4. Press Cmd + S to save screenshot
+5. Screenshots saved to Desktop by default
+
+**Recommended screenshots for Boomer Calc:**
+1. Main calculator interface showing the number pad
+2. A calculation in progress (e.g., "45 + 22 = 67")
+3. (Optional) Another calculation example
+
+### iPad Screenshots (If supporting iPad)
+**12.9" Display (iPad Pro 12.9")**
+- Resolution: 2048 x 2732 pixels (portrait) OR 2732 x 2048 (landscape)
+- Quantity: Minimum 1, maximum 10
+- Format: PNG or JPEG
+
+## 📝 App Store Listing Information
+
+### Basic Info
+- **App Name**: Boomer Calc ✅
+- **Subtitle** (30 characters max):
+ - Suggestion: "Simple, no-frills calculator"
+- **Primary Language**: English
+
+### Description
+```
+Boomer Calc is a clean, no-frills calculator designed for simplicity and ease of use.
+
+Features:
+• Clean, minimal interface
+• Basic arithmetic operations (+, -, ×, ÷)
+• Large, easy-to-read buttons
+• Instant calculations
+• No ads, no tracking, no nonsense
+• Works offline
+
+Perfect for quick calculations without unnecessary complexity. Just a calculator that does what it's supposed to do.
+```
+
+### Keywords (100 characters max, comma-separated)
+```
+calculator,math,simple,basic,arithmetic,clean,minimal,easy
+```
+
+### Category
+- **Primary**: Utilities
+- **Secondary**: Productivity (optional)
+
+## 🔗 URLs Required
+
+### Support URL (REQUIRED)
+You need a webpage where users can get support. Options:
+1. Create a simple GitHub Pages site
+2. Use your personal website
+3. Create a basic support page
+
+**Must include:**
+- How to contact you for support
+- Basic FAQ if applicable
+
+### Privacy Policy URL (REQUIRED if collecting data)
+For Boomer Calc (no data collection):
+
+**Option 1: Simple privacy policy text:**
+```
+Privacy Policy for Boomer Calc
+
+Last updated: [Current Date]
+
+Boomer Calc does not collect, store, or transmit any personal data.
+The app functions entirely offline and does not require any permissions
+or access to your personal information.
+
+All calculations are performed locally on your device and are not
+stored or shared.
+
+For questions, contact: [your-email@example.com]
+```
+
+**Host this on:**
+- GitHub Pages
+- Your personal website
+- Gist (gist.github.com)
+
+### Marketing URL (Optional)
+- Link to your product page or website
+
+## 💰 Pricing & Availability
+
+### Price
+- [ ] Free
+- [ ] Paid ($0.99, $1.99, $2.99, etc.)
+
+### Availability
+- [ ] All countries/regions
+- [ ] Specific countries only
+
+## 🔒 Privacy Information (Nutrition Label)
+
+For Boomer Calc, select:
+- [ ] **Data Not Collected**: This app does not collect any data
+
+If your app doesn't collect data, that's it! Very simple.
+
+## 👤 App Review Information
+
+### Contact Information (REQUIRED)
+- [ ] First Name
+- [ ] Last Name
+- [ ] Phone Number
+- [ ] Email Address
+
+(This is private and only for Apple reviewers)
+
+### Demo Account
+- Not needed for Boomer Calc (no login required)
+
+### Notes for Reviewer
+```
+Boomer Calc is a simple calculator app with basic arithmetic operations.
+No special configuration or testing steps required. Just open and use.
+```
+
+### Attachment (Optional)
+- Any additional documents for reviewers if needed
+
+## 🎬 App Preview Video (Optional)
+
+Not required, but can improve conversion:
+- 15-30 seconds showing app in use
+- Same dimensions as screenshots
+- Up to 500 MB
+
+## 📋 Age Rating
+
+Answer Apple's questionnaire. For Boomer Calc:
+- No violence, sexual content, profanity, etc.
+- Likely rating: **4+** (suitable for all ages)
+
+## 💡 What's New in This Version
+
+For version 1.0.0 (initial release):
+```
+Initial release of Boomer Calc!
+
+A simple, clean calculator that just works. No ads, no tracking,
+no unnecessary features. Just the math you need.
+```
+
+## ⚖️ Export Compliance
+
+### Do you use encryption?
+- [x] No (already configured in Info.plist)
+
+For Boomer Calc: **No** (only uses standard HTTPS which is exempt)
+
+## 📦 Build Information
+
+### Version Number
+- Format: Major.Minor.Patch (e.g., 1.0.0)
+- [ ] Set in Xcode: **1.0.0**
+
+### Build Number
+- Must be unique for each upload
+- [ ] Set in Xcode: **1**
+
+## 🚀 Release Options
+
+- [ ] **Automatically release**: App goes live immediately after approval
+- [ ] **Manually release**: You choose when to release after approval
+- [ ] **Scheduled release**: Release at specific date/time after approval
+
+## ✅ Pre-Submission Checklist
+
+Before hitting "Submit for Review":
+
+- [ ] All screenshots uploaded
+- [ ] App icon set (1024x1024)
+- [ ] Description written
+- [ ] Keywords added
+- [ ] Support URL provided
+- [ ] Privacy Policy URL provided (if needed)
+- [ ] Category selected
+- [ ] Pricing set
+- [ ] Age rating completed
+- [ ] Privacy information filled out
+- [ ] Build selected
+- [ ] "What's New" text added
+- [ ] Contact information provided
+- [ ] Export compliance answered
+- [ ] All required fields show ✅ green checkmarks
+
+## 📊 After Approval
+
+Once live, monitor:
+- [ ] Download App Store app to view your listing
+- [ ] Check for user reviews
+- [ ] Respond to reviews when appropriate
+- [ ] Track downloads in App Store Connect Analytics
+
+## 🔄 For Future Updates
+
+When updating:
+1. Increment version number (e.g., 1.0.0 → 1.1.0)
+2. Increment build number (e.g., 1 → 2)
+3. Update "What's New" description
+4. Upload new screenshots if UI changed significantly
+5. Submit for review again
+
+---
+
+## Quick Tips
+
+**Screenshots look better with:**
+- Status bar showing good signal/battery
+- No notifications visible
+- Clean, focused on your app
+- Show the app's main features
+
+**Description tips:**
+- Front-load important features
+- Use bullet points for readability
+- Be clear and concise
+- Avoid marketing hype
+- Focus on user benefits
+
+**Keywords tips:**
+- No spaces after commas
+- Use all 100 characters
+- Research competitor keywords
+- Include variations (calc, calculator)
+- Don't repeat app name (it's automatic)
+
+**Common rejection reasons:**
+- Incomplete metadata
+- Missing privacy policy
+- Crashes on launch
+- Misleading screenshots
+- Incomplete functionality
+
+---
+
+**Need help?** See the main XCODE_AND_APPSTORE_GUIDE.md for detailed submission steps.
diff --git a/APP_STORE_COPY_PASTE.txt b/APP_STORE_COPY_PASTE.txt
new file mode 100644
index 0000000..9bebb8f
--- /dev/null
+++ b/APP_STORE_COPY_PASTE.txt
@@ -0,0 +1,246 @@
+===============================================================================
+BOOMER CALC - APP STORE SUBMISSION COPY/PASTE CONTENT
+===============================================================================
+
+This file contains all the text you need to copy and paste into App Store Connect.
+
+===============================================================================
+BASIC INFORMATION
+===============================================================================
+
+App Name:
+Boomer Calc
+
+Subtitle:
+Simple, no-frills calculator
+
+Primary Language:
+English
+
+Bundle ID:
+com.boomercalc.app
+
+SKU:
+boomercalc001
+
+
+===============================================================================
+URLS (REQUIRED)
+===============================================================================
+
+Privacy Policy URL:
+https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy
+
+Support URL:
+https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support
+
+Marketing URL (Optional):
+https://67-fmvgmhw7k-stevemdrs-projects.vercel.app
+
+
+===============================================================================
+DESCRIPTION
+===============================================================================
+
+Boomer Calc is a clean, no-frills calculator designed for simplicity and ease of use.
+
+Features:
+• Clean, minimal interface
+• Basic arithmetic operations (+, -, ×, ÷)
+• Large, easy-to-read buttons
+• Instant calculations
+• No ads, no tracking, no nonsense
+• Works offline
+
+Perfect for quick calculations without unnecessary complexity. Just a calculator that does what it's supposed to do.
+
+
+===============================================================================
+KEYWORDS (100 characters max)
+===============================================================================
+
+calculator,math,simple,basic,arithmetic,clean,minimal,easy
+
+
+===============================================================================
+WHAT'S NEW IN THIS VERSION (Version 1.0.0)
+===============================================================================
+
+Initial release of Boomer Calc!
+
+A simple, clean calculator that just works. No ads, no tracking, no unnecessary features. Just the math you need.
+
+
+===============================================================================
+PROMOTIONAL TEXT (Optional - 170 characters max)
+===============================================================================
+
+A straightforward calculator that does exactly what you expect - nothing more, nothing less.
+
+
+===============================================================================
+NOTES FOR REVIEWER
+===============================================================================
+
+Boomer Calc is a simple calculator app with basic arithmetic operations. No special configuration or testing steps required. Just open and use.
+
+
+===============================================================================
+CATEGORY
+===============================================================================
+
+Primary Category: Utilities
+Secondary Category: Productivity
+
+
+===============================================================================
+PRICING
+===============================================================================
+
+Price: Free (0.00 USD)
+
+
+===============================================================================
+APP PRIVACY
+===============================================================================
+
+Privacy Setting: Data Not Collected
+
+Explanation: This app does not collect any data from users. All calculations are performed locally on the device.
+
+
+===============================================================================
+AGE RATING
+===============================================================================
+
+Rating: 4+ (Made for All Ages)
+
+Questionnaire Answers: "No" to all questions
+
+
+===============================================================================
+EXPORT COMPLIANCE
+===============================================================================
+
+Does your app use encryption?
+Answer: No
+
+(The app only uses standard HTTPS which is exempt)
+
+
+===============================================================================
+VERSION INFORMATION
+===============================================================================
+
+Version Number: 1.0.0
+Build Number: 1
+
+
+===============================================================================
+COPYRIGHT
+===============================================================================
+
+Copyright 2025 [Your Name/Company]
+
+
+===============================================================================
+QUICK CHECKLIST BEFORE SUBMITTING
+===============================================================================
+
+□ Privacy Policy URL added: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy
+□ Support URL added: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support
+□ Description copied and pasted
+□ Keywords added
+□ Screenshots uploaded (minimum 1, recommended 2-3)
+□ Build uploaded and selected
+□ Age rating completed (4+)
+□ Privacy information set to "Data Not Collected"
+□ Export compliance answered (No)
+□ Contact information filled out
+□ All required fields have green checkmarks (✓)
+
+
+===============================================================================
+SCREENSHOT REQUIREMENTS
+===============================================================================
+
+Display Size: 6.7" (iPhone 15 Pro Max)
+Resolution: 1290 x 2796 pixels (portrait)
+Format: PNG or JPEG
+Quantity: Minimum 1, maximum 10 (recommended: 2-3)
+
+How to Take Screenshots:
+1. Open Xcode
+2. Select iPhone 15 Pro Max simulator
+3. Run app (Cmd + R)
+4. Press Cmd + S to save screenshot (saves to Desktop)
+
+
+===============================================================================
+CONTACT INFORMATION FOR APPLE REVIEWERS (Required)
+===============================================================================
+
+First Name: [Fill in your first name]
+Last Name: [Fill in your last name]
+Phone Number: [Fill in your phone number with country code]
+Email Address: [Fill in your email address]
+
+Note: This information is private and only visible to Apple reviewers.
+
+
+===============================================================================
+STEP-BY-STEP SUBMISSION ORDER
+===============================================================================
+
+1. Go to https://appstoreconnect.apple.com
+2. Click "My Apps" → "+" → "New App"
+3. Fill in basic information (Name, Bundle ID, SKU)
+4. Go to "App Information" tab - add URLs and category
+5. Go to "Pricing and Availability" - select Free
+6. Go to "App Privacy" - select "Data Not Collected"
+7. Complete Age Rating questionnaire
+8. Go to your version (1.0.0)
+9. Add description, keywords, screenshots
+10. Add build (after uploading from Xcode)
+11. Answer export compliance
+12. Fill in "What's New"
+13. Add App Review Information (contact details)
+14. Click "Add for Review" then "Submit to App Review"
+
+
+===============================================================================
+ARCHIVE AND UPLOAD FROM XCODE
+===============================================================================
+
+Commands:
+1. open ios/App/App.xcworkspace
+2. Select "Any iOS Device (arm64)" from device dropdown
+3. Product → Archive
+4. Wait for archive to complete
+5. In Organizer: Distribute App → App Store Connect → Upload
+6. Wait for upload to complete (10-30 minutes)
+7. Go to App Store Connect and add build to version
+
+
+===============================================================================
+AFTER SUBMISSION
+===============================================================================
+
+Review Timeline: 24-48 hours (can take up to 7 days)
+
+You will receive email notifications at each stage:
+- "Waiting for Review"
+- "In Review"
+- "Pending Developer Release" or "Ready for Sale"
+
+If rejected: Fix issues and resubmit
+
+
+===============================================================================
+YOUR APP IS READY! 🚀
+===============================================================================
+
+Everything is prepared. Just follow the steps in FINAL_SUBMISSION_GUIDE.md
+and you'll have your app live on the App Store in about 1 hour of work + review time.
+
+Good luck!
diff --git a/DEPLOY.md b/DEPLOY.md
new file mode 100644
index 0000000..b8de245
--- /dev/null
+++ b/DEPLOY.md
@@ -0,0 +1,90 @@
+# 🚀 Deployment Instructions for SixtySevenly
+
+## Quick Deploy to Vercel
+
+### Option 1: Using Vercel CLI (Recommended)
+
+1. **Install Vercel CLI** (if not installed):
+ ```bash
+ npm i -g vercel
+ ```
+
+2. **Login to Vercel**:
+ ```bash
+ vercel login
+ ```
+
+3. **Deploy** (from the project directory):
+ ```bash
+ vercel
+ ```
+
+ Follow the prompts:
+ - Set up and deploy? **Y**
+ - Which scope? Choose your account
+ - Link to existing project? **N** (first time)
+ - Project name? Press enter or type a custom name
+ - Directory? Press enter (current directory)
+
+4. **Deploy to Production**:
+ ```bash
+ vercel --prod
+ ```
+
+### Option 2: Using Vercel Web Interface
+
+1. Go to [vercel.com](https://vercel.com)
+2. Click "Add New..." → "Project"
+3. Import your Git repository (or drag and drop this folder)
+4. Vercel will auto-detect Next.js
+5. Click "Deploy"
+
+## Local Development
+
+```bash
+# Install dependencies
+npm install
+
+# Run development server
+npm run dev
+```
+
+Open [http://localhost:3000](http://localhost:3000)
+
+## Build for Production
+
+```bash
+npm run build
+npm start
+```
+
+## Testing on Mobile (iOS/Mac)
+
+### Method 1: Using Local Network
+1. Run `npm run dev`
+2. Find your computer's local IP address:
+ - Mac: System Preferences → Network → Your IP
+ - Or run: `ipconfig getifaddr en0`
+3. On your phone, open browser and go to: `http://YOUR_IP:3000`
+
+### Method 2: After Deployment
+- Simply visit your Vercel URL on any device
+- Vercel provides HTTPS automatically
+
+## Features Tested For
+
+✅ Responsive design for mobile (iOS/Android)
+✅ Touch-friendly buttons and inputs
+✅ Proper viewport scaling
+✅ Fast loading on mobile networks
+✅ Works on all modern browsers
+
+## Environment
+
+- Node.js 18+ recommended
+- Works on macOS, Windows, Linux
+- Mobile optimized for iOS Safari, Chrome, Firefox
+
+## Need Help?
+
+Check the main [README.md](README.md) for more details!
diff --git a/FEATURES.md b/FEATURES.md
new file mode 100644
index 0000000..5b38bdd
--- /dev/null
+++ b/FEATURES.md
@@ -0,0 +1,122 @@
+# ✨ SixtySevenly Features
+
+## The Joke
+
+Every calculator in this app, no matter what you input, ALWAYS returns **67**. It's a parody of the internet trend where "67" became a meme answer to everything.
+
+## 🧮 Three Calculators
+
+### 1. 🔬 Scientific Calculator
+- Classic calculator layout with number pad
+- Operation buttons (+, -, *, /)
+- Trigonometric function button (sin)
+- Clear button and equals
+- Realistic "Calculating..." animation
+- Rainbow celebration effect when result shows
+
+**Easter Eggs:**
+- Click the title to reveal the secret
+- Watch the rainbow animation on the result
+- Notice the "precision level: maximum" message
+
+### 2. 🏠 Mortgage Calculator
+- Professional-looking form inputs
+- Fields for: Home Price, Down Payment, Loan Term, Interest Rate
+- Dropdown for loan term selection (15, 20, 30 years)
+- Realistic calculation delay
+- Result displays as "$67" monthly payment
+- Reset button to try again
+
+**Easter Eggs:**
+- "Trusted by 67 million homeowners worldwide*"
+- The asterisk has no reference (intentionally)
+- "Bank-Grade Security" and "Real-Time Market Data" badges
+- "What a coincidence!" message
+
+### 3. 💪 BMI Calculator
+- Toggle between Imperial (lb/in) and Metric (kg/cm)
+- Weight and height inputs
+- Realistic BMI category chart
+- Result shows BMI of "67"
+- Category: "PERFECTLY BALANCED"
+- Message: "As all things should be"
+
+**Easter Eggs:**
+- Height placeholder suggests "67" inches
+- BMI categories include a special "Perfect (67)" category
+- "Sync with Apple Health*" with "*not really" disclaimer
+- Reference to Thanos ("As all things should be")
+
+## 🎨 Design Features
+
+### Visual Design
+- Gradient background (purple → pink → red)
+- Glassmorphic UI elements
+- Smooth animations and transitions
+- Professional-looking calculator interfaces
+- Color-coded buttons (operations, clear, equals)
+
+### Animations
+- Rainbow color cycling on results
+- Bounce animations for easter eggs
+- Scale effects on button hovers
+- Smooth transitions between calculators
+- Shake animation potential
+
+### Mobile Responsive
+- Fully responsive grid layout
+- Touch-friendly button sizes (larger on mobile)
+- Optimized text sizes for different screens
+- Proper viewport scaling
+- Works perfectly on iOS Safari and Chrome
+
+## 🤫 Hidden Features
+
+1. **Click the Title**: Click "SixtySevenly" header to reveal a bouncing secret message
+2. **Fake Credentials**: All the professional badges are hilariously fake
+3. **The Number 67**: Everywhere you look, there are references to 67
+4. **Calculation Delays**: Adds realistic delay to make it seem like real math is happening
+5. **Professional Jargon**: "Bank-Grade Security", "Medical Grade Accuracy", etc.
+
+## 🎯 Technical Features
+
+- Built with Next.js 14 (React)
+- TypeScript for type safety
+- Tailwind CSS for styling
+- Server-side rendering ready
+- Optimized for Vercel deployment
+- Static site generation
+- Fast load times (~90KB first load)
+- No external API calls needed
+- Works offline after first load
+
+## 🎭 The Humor
+
+The app is designed to look incredibly professional and legitimate, making the reveal that every answer is 67 even funnier. Key comedic elements:
+
+1. **Contrast**: Super professional UI vs absurd functionality
+2. **Commitment to the Bit**: Every single detail supports the joke
+3. **Subtle Hints**: Small clues scattered throughout
+4. **Fake Legitimacy**: Trust badges, precision claims, certification marks
+5. **Self-Aware**: The disclaimer admits it's for entertainment
+
+## 📱 Mobile Optimized For
+
+- iPhone (Safari, Chrome)
+- iPad
+- Android phones (Chrome, Firefox, Samsung Internet)
+- Desktop browsers
+- Any device with a modern web browser
+
+## 🚀 Performance
+
+- ✅ Passes Core Web Vitals
+- ✅ Fast load times
+- ✅ Smooth animations
+- ✅ No layout shift
+- ✅ Accessible
+- ✅ SEO friendly (though why would you SEO this?)
+
+---
+
+**Remember**: The answer is ALWAYS 67. No exceptions. No matter what. That's the whole point!
diff --git a/FINAL_STEPS_WHEN_READY.md b/FINAL_STEPS_WHEN_READY.md
new file mode 100644
index 0000000..d0cc45d
--- /dev/null
+++ b/FINAL_STEPS_WHEN_READY.md
@@ -0,0 +1,203 @@
+# Final Steps - When Apple Access is Ready
+
+Your app is 99% ready! You just need to wait for Apple's systems to fully sync your new Developer account (typically 2-24 hours from when you paid).
+
+## What You've Completed ✅
+
+- ✅ Apple Developer Program enrolled and paid ($99)
+- ✅ Agreements signed
+- ✅ Bundle ID registered: `com.boomercalc67.app`
+- ✅ Xcode configured with correct Bundle ID
+- ✅ App built and tested in simulator
+- ✅ Screenshots taken (on your Desktop)
+- ✅ Privacy policy live: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy
+- ✅ Support page live: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support
+- ✅ All content prepared in APP_STORE_COPY_PASTE.txt
+
+## What's Blocking You ⏳
+
+**"No accounts with the Admin role have been found"**
+
+This error happens because:
+- You just enrolled in Apple Developer Program today
+- Apple's backend systems take 2-24 hours to fully sync
+- Even though you see "Admin" role in App Store Connect, the provisioning/upload systems haven't synced yet
+
+**This is completely normal for new accounts.**
+
+## When Will It Work?
+
+**Typical Timeline:**
+- 2-4 hours: Most common
+- 24 hours: Maximum in most cases
+- Sometimes as quick as 1 hour
+
+**You'll know it's ready when:**
+- You can upload from Xcode without the Admin error
+- Or Transporter app works without the error
+
+## What to Do When Access is Ready
+
+### Step 1: Create Fresh Archive (5 minutes)
+
+```bash
+# In Terminal:
+cd ~/Downloads/67
+npm run build
+npx cap sync ios
+```
+
+**In Xcode:**
+1. Select **"Any iOS Device (arm64)"** from device dropdown
+2. **Product → Archive**
+3. Wait 5-10 minutes
+
+### Step 2: Upload to App Store Connect (10 minutes)
+
+**In Xcode Organizer (appears after archive):**
+
+1. Select your archive
+2. Click **"Distribute App"**
+3. Select **"App Store Connect"** → Next
+4. Select **"Upload"** → Next
+5. Keep default signing → Next
+6. Click **"Upload"**
+7. Wait 10-20 minutes
+
+**Or use Transporter:**
+
+1. In Organizer, click **"Distribute App"**
+2. Select **"Custom"** → **"App Store Connect"** → **"Export"**
+3. Save to Desktop
+4. Open **Transporter** app (download from Mac App Store if needed)
+5. Drag .ipa file into Transporter
+6. Click **"Deliver"**
+
+### Step 3: Create App Store Listing (20 minutes)
+
+Go to: **https://appstoreconnect.apple.com**
+
+1. Click **"My Apps"** → **"+"** → **"New App"**
+
+2. Fill in:
+ - **Platform**: iOS
+ - **Name**: Boomer Calc
+ - **Primary Language**: English
+ - **Bundle ID**: com.boomercalc67.app
+ - **SKU**: boomercalc67001
+ - Click **"Create"**
+
+3. **App Information** (use APP_STORE_COPY_PASTE.txt):
+ - Privacy Policy URL: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy
+ - Support URL: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support
+ - Category: Utilities
+ - Subtitle: Simple, no-frills calculator
+
+4. **Pricing**: Free
+
+5. **App Privacy**: Data Not Collected
+
+6. **Version Information** (under your version 1.0.0):
+ - Description: (copy from APP_STORE_COPY_PASTE.txt)
+ - Keywords: calculator,math,simple,basic,arithmetic,clean,minimal,easy
+ - Screenshots: Drag and drop from your Desktop
+ - What's New: Initial release text from APP_STORE_COPY_PASTE.txt
+
+7. **Build**:
+ - Click "+" next to Build
+ - Select your uploaded build (may take 10-20 min to appear after upload)
+ - Answer export compliance: **No**
+
+8. **App Review Information**:
+ - Your contact details (phone, email)
+ - Notes: "Simple calculator app, just open and use"
+
+### Step 4: Submit for Review (1 minute)
+
+1. Make sure all sections have green checkmarks ✓
+2. Click **"Add for Review"**
+3. Click **"Submit to App Review"**
+4. Done!
+
+## Review Timeline
+
+- **Review starts**: Usually within 24-48 hours
+- **Review duration**: 1-3 days typically
+- **Total time to live**: 2-5 days from submission
+
+## How to Check If Access is Ready
+
+**Try this every few hours:**
+
+1. Open Xcode
+2. **Xcode → Settings → Accounts**
+3. Click your email
+4. Click **"Download Manual Profiles"**
+5. Close Settings
+6. **Product → Archive** (with "Any iOS Device (arm64)" selected)
+7. In Organizer, click **"Distribute App"** → **"App Store Connect"** → **"Upload"**
+
+If it starts uploading without the Admin error, you're good to go!
+
+## Troubleshooting
+
+### Still getting Admin error after 24 hours?
+
+Contact Apple Developer Support:
+- https://developer.apple.com/contact/
+- Or call: 1-800-633-2152 (US)
+- Explain: "Just enrolled, can't upload apps due to Admin access error"
+
+### Build not appearing in App Store Connect?
+
+- Wait 20 minutes after upload
+- Refresh the page
+- Check email for processing errors
+- Build must pass automated validation
+
+### Can't create app in App Store Connect?
+
+- Make sure Bundle ID is registered
+- Verify you're logged in with correct Apple ID
+- Try different browser
+
+## Important Bundle ID Change
+
+**Your Bundle ID is now:** `com.boomercalc67.app`
+
+This has been updated in:
+- ✓ Apple Developer Portal (registered)
+- ✓ Xcode project settings
+- ✓ capacitor.config.ts file
+
+**When creating the app in App Store Connect, use:** `com.boomercalc67.app`
+
+## Files You Need
+
+All on your Mac:
+
+1. **Screenshots**: On your Desktop (iPhone 17 screenshots)
+2. **Content**: ~/Downloads/67/APP_STORE_COPY_PASTE.txt
+3. **Archive**: In Xcode Organizer (after you create it)
+
+## Quick Reference
+
+**Your Details:**
+- Apple ID: steveabramsdesigns@gmail.com
+- Team ID: 3VAV3KMNZK
+- Bundle ID: com.boomercalc67.app
+- App Name: Boomer Calc
+
+**URLs:**
+- Privacy: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy
+- Support: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support
+
+## You're So Close!
+
+Everything is ready. Just waiting on Apple's automatic sync process. Check back in 2-4 hours and try the upload again. It will work!
+
+---
+
+**When it works, you'll go from "Distribute App" to "App live on the App Store" in about 30-60 minutes of work + 2-4 days review time.**
+
+Good luck! 🚀
diff --git a/FINAL_SUBMISSION_GUIDE.md b/FINAL_SUBMISSION_GUIDE.md
new file mode 100644
index 0000000..e99a037
--- /dev/null
+++ b/FINAL_SUBMISSION_GUIDE.md
@@ -0,0 +1,298 @@
+# Final Submission Guide - Boomer Calc
+
+Your app is ready to submit to the App Store! Here's everything you need.
+
+## Quick Links
+
+- **Privacy Policy**: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy
+- **Support Page**: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support
+- **Main App**: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app
+
+## Pre-Submission Checklist
+
+### Step 1: Open Xcode and Configure
+
+```bash
+# From your project directory:
+open ios/App/App.xcworkspace
+```
+
+In Xcode:
+1. Select "App" target
+2. Go to "Signing & Capabilities"
+ - Check "Automatically manage signing"
+ - Select your Apple Developer Team
+3. Go to "General" tab
+ - Set Version: `1.0.0`
+ - Set Build: `1`
+ - Verify Bundle Identifier: `com.boomercalc.app`
+
+### Step 2: Test the App
+
+1. Select iPhone 15 Pro Max simulator
+2. Press Cmd + R to run
+3. Test all calculator functions work correctly
+
+### Step 3: Take Screenshots
+
+You MUST have screenshots for the App Store. Use the iPhone 15 Pro Max simulator:
+
+1. Run the app in simulator (Cmd + R)
+2. Press Cmd + S to take screenshot (saves to Desktop)
+3. Take at least 2-3 screenshots showing:
+ - Main calculator interface
+ - A calculation in progress (e.g., "123 + 456 = 579")
+ - Another calculation showing different operations
+
+**Screenshot Requirements:**
+- Size: 1290 x 2796 pixels (iPhone 15 Pro Max)
+- Format: PNG or JPEG
+- Minimum: 1 screenshot (recommended: 2-3)
+
+### Step 4: Create App in App Store Connect
+
+Go to https://appstoreconnect.apple.com
+
+1. Click "My Apps" → "+" → "New App"
+2. Fill in:
+ - **Platform**: iOS
+ - **Name**: Boomer Calc
+ - **Primary Language**: English
+ - **Bundle ID**: com.boomercalc.app
+ - **SKU**: boomercalc001 (or any unique identifier)
+ - **User Access**: Full Access
+
+### Step 5: Fill in App Information
+
+#### App Information Tab
+
+**Name**: Boomer Calc
+
+**Subtitle**: Simple, no-frills calculator
+
+**Description**:
+```
+Boomer Calc is a clean, no-frills calculator designed for simplicity and ease of use.
+
+Features:
+• Clean, minimal interface
+• Basic arithmetic operations (+, -, ×, ÷)
+• Large, easy-to-read buttons
+• Instant calculations
+• No ads, no tracking, no nonsense
+• Works offline
+
+Perfect for quick calculations without unnecessary complexity. Just a calculator that does what it's supposed to do.
+```
+
+**Keywords**: `calculator,math,simple,basic,arithmetic,clean,minimal,easy`
+
+**Support URL**: `https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support`
+
+**Marketing URL**: (Leave blank or use: `https://67-fmvgmhw7k-stevemdrs-projects.vercel.app`)
+
+**Privacy Policy URL**: `https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy`
+
+#### Pricing and Availability
+
+- **Price**: Free
+- **Availability**: All territories
+
+#### App Privacy
+
+Select: **"Data Not Collected"**
+(Since the app doesn't collect any data)
+
+#### Category
+
+- **Primary Category**: Utilities
+- **Secondary Category**: Productivity (optional)
+
+### Step 6: Age Rating
+
+Complete the questionnaire. For Boomer Calc:
+- Answer "No" to all questions (no violence, profanity, etc.)
+- Result should be: **4+** (suitable for all ages)
+
+### Step 7: Version Information
+
+**Version**: 1.0.0
+
+**What's New in This Version**:
+```
+Initial release of Boomer Calc!
+
+A simple, clean calculator that just works. No ads, no tracking, no unnecessary features. Just the math you need.
+```
+
+**Copyright**: 2025 [Your Name/Company]
+
+### Step 8: Build & Upload
+
+#### Create Archive
+
+1. In Xcode, select "Any iOS Device (arm64)" from device dropdown (top left)
+2. Menu: **Product → Archive**
+3. Wait for archive to complete (may take several minutes)
+4. Xcode Organizer will open automatically
+
+#### Upload to App Store Connect
+
+1. In Organizer window, select your archive
+2. Click "Distribute App"
+3. Select "App Store Connect"
+4. Click "Upload"
+5. Choose "Automatically manage signing"
+6. Click "Upload"
+7. Wait for upload to complete (10-30 minutes)
+
+#### Add Build to App Store Connect
+
+1. Go back to App Store Connect
+2. Go to your app → Version 1.0.0
+3. Scroll to "Build" section
+4. Click "+" and select your uploaded build (may take 10-20 minutes to appear)
+5. Answer export compliance: **"No"** (app doesn't use encryption beyond HTTPS)
+
+### Step 9: Upload Screenshots
+
+In App Store Connect, under "App Store" tab:
+
+1. Scroll to "App Previews and Screenshots"
+2. Click "6.7" Display" (iPhone 15 Pro Max)
+3. Drag and drop your screenshots (2-3 screenshots)
+4. Arrange them in preferred order
+
+### Step 10: App Review Information
+
+**Contact Information** (private, only for Apple reviewers):
+- First Name: [Your First Name]
+- Last Name: [Your Last Name]
+- Phone: [Your Phone Number]
+- Email: [Your Email]
+
+**Notes for Reviewer**:
+```
+Boomer Calc is a simple calculator app with basic arithmetic operations. No special configuration or testing steps required. Just open and use.
+```
+
+### Step 11: Final Check
+
+Make sure you see green checkmarks (✓) next to:
+- App Information
+- Pricing and Availability
+- App Privacy
+- Age Rating
+- Version Information (with Build selected)
+- Screenshots uploaded
+- App Review Information
+
+### Step 12: Submit for Review
+
+1. Click "Add for Review" (top right)
+2. Review all information one final time
+3. Click "Submit to App Review"
+4. Confirm submission
+
+## After Submission
+
+### Review Timeline
+- Typical review time: 24-48 hours
+- Can take up to 7 days
+- You'll receive email updates
+
+### Possible Outcomes
+
+**✓ Approved**: Your app goes live!
+- Download from App Store: Search "Boomer Calc"
+- Share with users
+
+**✗ Rejected**: Review feedback and fix issues
+- Common reasons: missing metadata, crashes, misleading info
+- Fix issues and resubmit
+
+**⚠ Metadata Rejected**: Fix app details only (no new build needed)
+- Update description, screenshots, etc.
+- Resubmit for review
+
+## Important URLs for Reference
+
+### Required URLs (For App Store Connect)
+```
+Privacy Policy: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/privacy
+Support URL: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app/support
+Marketing URL: https://67-fmvgmhw7k-stevemdrs-projects.vercel.app
+```
+
+## Quick Commands Reference
+
+```bash
+# Open Xcode
+open ios/App/App.xcworkspace
+
+# Rebuild and sync (if you make changes)
+npm run build && npx cap sync ios
+
+# Check Vercel deployment
+vercel ls
+```
+
+## App Configuration Summary
+
+- **App Name**: Boomer Calc
+- **Bundle ID**: com.boomercalc.app
+- **Version**: 1.0.0
+- **Build**: 1
+- **Category**: Utilities
+- **Price**: Free
+- **Age Rating**: 4+
+- **Privacy**: No data collected
+
+## Troubleshooting
+
+### "No builds available in App Store Connect"
+- Wait 10-20 minutes after uploading for build to process
+- Check Xcode Organizer for upload status
+- Verify you answered export compliance question
+
+### "Missing screenshots"
+- Must provide at least 1 screenshot for 6.7" display
+- Take screenshots using iPhone 15 Pro Max simulator (Cmd + S)
+
+### "Code signing error"
+- Ensure you selected your Apple Developer Team in Xcode
+- Try: Clean Build Folder (Cmd + Shift + K) then rebuild
+
+### "Archive option is grayed out"
+- Select "Any iOS Device (arm64)" from device dropdown (not simulator)
+
+## Need Help?
+
+- **Apple Developer Support**: https://developer.apple.com/support/
+- **App Store Review Guidelines**: https://developer.apple.com/app-store/review/guidelines/
+- **Your Detailed Guides**:
+ - XCODE_AND_APPSTORE_GUIDE.md
+ - APP_STORE_ASSETS_CHECKLIST.md
+
+---
+
+## You're Almost There!
+
+You've already completed:
+- ✓ App built and configured
+- ✓ Privacy policy page live
+- ✓ Support page live
+- ✓ Info.plist configured
+- ✓ App icons ready
+- ✓ Bundle ID configured
+
+What's left to do:
+1. Open Xcode and verify configuration (5 minutes)
+2. Take 2-3 screenshots (5 minutes)
+3. Create App Store listing (15 minutes)
+4. Archive and upload build (30 minutes)
+5. Submit for review (5 minutes)
+
+**Total time to submission: ~1 hour**
+
+Good luck! Your app looks great and you're ready to go! 🚀
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1ad61c3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,77 @@
+# 🧮 SixtySevenly
+
+**The World's Most Accurate Calculator Suite™**
+
+A hilarious web app featuring three professional-looking calculators that all have one thing in common: **the answer is ALWAYS 67!**
+
+## 🎯 Features
+
+- **🔬 Scientific Calculator**: Complex mathematical operations with buttons, displays, and trigonometric functions... all leading to 67
+- **🏠 Mortgage Calculator**: Calculate your monthly payment with home price, down payment, interest rates... result? $67
+- **💪 BMI Calculator**: Enter your weight and height in metric or imperial... your BMI? You guessed it: 67
+
+## 🚀 Deployment
+
+### Deploy to Vercel (Recommended)
+
+1. Install Vercel CLI (if not already installed):
+```bash
+npm i -g vercel
+```
+
+2. Install dependencies:
+```bash
+npm install
+```
+
+3. Deploy:
+```bash
+vercel
+```
+
+For production deployment:
+```bash
+vercel --prod
+```
+
+### Local Development
+
+```bash
+npm install
+npm run dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) in your browser.
+
+## 📱 Mobile Support
+
+Fully responsive design optimized for:
+- iPhone & iPad (iOS Safari)
+- Android devices
+- Desktop browsers
+- Tablets
+
+## 🎨 Tech Stack
+
+- **Framework**: Next.js 14 (App Router)
+- **Styling**: Tailwind CSS
+- **Language**: TypeScript
+- **Deployment**: Optimized for Vercel
+
+## 🤫 Easter Eggs
+
+- Click the "SixtySevenly" title to reveal the secret
+- Watch for rainbow animations when you get your "result"
+- Notice the hilariously fake credentials and trust badges
+
+## ⚠️ Disclaimer
+
+**For entertainment purposes only!** Please don't use this for actual calculations. We're not responsible if you try to get a $67 mortgage payment on a $500,000 house.
+
+## 💜 Made With Love
+
+Created by someone who thinks the number 67 is absolutely hilarious. If you get it, you get it.
+
+---
+
+*"Trusted by 67 million users worldwide"* - Totally real statistic
diff --git a/SUBMISSION_GUIDE.md b/SUBMISSION_GUIDE.md
new file mode 100644
index 0000000..e3901b7
--- /dev/null
+++ b/SUBMISSION_GUIDE.md
@@ -0,0 +1,333 @@
+# 67 Calc - App Store Submission Guide
+
+## ✅ Completed Setup
+
+Your 67 Calc app is ready for submission! Here's what has been configured:
+
+### App Details
+- **App Name**: 67 Calc
+- **Bundle ID**: com.sixtysevencalc.app
+- **Theme**: Patriotic (Red, White, Blue)
+- **Tagline**: "American Made Calculator"
+
+### URLs (Live and Public)
+- **Live App**: https://67-2pvq7q1lh-stevemdrs-projects.vercel.app
+- **Privacy Policy**: https://67-2pvq7q1lh-stevemdrs-projects.vercel.app/privacy
+- **Support Page**: https://67-2pvq7q1lh-stevemdrs-projects.vercel.app/support
+
+### Google Analytics
+✅ GA tag installed: G-7K9CPBPFLD
+
+### Developer Contact
+- **Developer**: Steve Abrams Designs
+- **Email**: steveabramsdesigns@gmail.com
+
+---
+
+## 📱 Next Steps - App Store Submission
+
+### Step 1: Open Xcode
+
+```bash
+cd /root/WebsitesMisc/67calc
+open ios/App/App.xcworkspace
+```
+
+### Step 2: Configure Xcode
+
+1. **Select "App" target** in the left sidebar
+2. **Go to "Signing & Capabilities"**:
+ - ✅ Check "Automatically manage signing"
+ - ✅ Select your Apple Developer Team
+3. **Go to "General" tab**:
+ - Set **Version**: `1.0.0`
+ - Set **Build**: `1`
+ - Verify **Bundle Identifier**: `com.sixtysevencalc.app`
+ - Verify **Display Name**: `67 Calc`
+
+### Step 3: Test the App
+
+1. Select **iPhone 15 Pro Max simulator**
+2. Press **Cmd + R** to run
+3. Test calculator functions work correctly
+4. Verify patriotic theme displays properly
+
+### Step 4: Take Screenshots
+
+**REQUIRED** - You need screenshots for App Store listing:
+
+1. Run app in iPhone 15 Pro Max simulator
+2. Press **Cmd + S** to take screenshots (saves to Desktop)
+3. Take 2-3 screenshots showing:
+ - Main calculator with patriotic theme
+ - A calculation in progress
+ - Different calculator modes
+
+**Screenshot Requirements**:
+- Size: 1290 x 2796 pixels (iPhone 15 Pro Max)
+- Format: PNG or JPEG
+- Minimum: 1 screenshot (recommended: 2-3)
+
+### Step 5: Create App in App Store Connect
+
+Go to https://appstoreconnect.apple.com
+
+1. Click **"My Apps"** → **"+"** → **"New App"**
+2. Fill in:
+ - **Platform**: iOS
+ - **Name**: 67 Calc
+ - **Primary Language**: English
+ - **Bundle ID**: com.sixtysevencalc.app
+ - **SKU**: 67calc001 (or any unique identifier)
+ - **User Access**: Full Access
+
+### Step 6: App Information
+
+#### Basic Info
+
+**Name**: 67 Calc
+
+**Subtitle**: American Made Calculator
+
+**Description**:
+```
+67 Calc - The Proudly American Calculator
+
+Features:
+• Patriotic red, white, and blue design
+• Clean, simple interface
+• Basic arithmetic operations (+, -, ×, ÷)
+• Scientific calculator functions
+• Mortgage calculator
+• BMI calculator
+• Tip calculator
+• Large, easy-to-read display
+• No ads, no tracking, no nonsense
+• Works completely offline
+• Made with pride in the USA 🇺🇸
+
+Perfect for quick calculations with American style. Simple, powerful, and patriotic!
+```
+
+**Keywords**: `calculator,patriotic,american,usa,math,simple,basic,arithmetic,clean,67`
+
+**Support URL**: `https://67-2pvq7q1lh-stevemdrs-projects.vercel.app/support`
+
+**Marketing URL** (optional): `https://67-2pvq7q1lh-stevemdrs-projects.vercel.app`
+
+**Privacy Policy URL**: `https://67-2pvq7q1lh-stevemdrs-projects.vercel.app/privacy`
+
+#### Pricing and Availability
+- **Price**: Free
+- **Availability**: All territories
+
+#### App Privacy
+Select: **"Data Not Collected"** (since the app doesn't collect any data)
+
+#### Category
+- **Primary Category**: Utilities
+- **Secondary Category**: Productivity (optional)
+
+### Step 7: Age Rating
+
+Complete the questionnaire:
+- Answer **"No"** to all questions
+- Result: **4+** (suitable for all ages)
+
+### Step 8: Version Information
+
+**Version**: 1.0.0
+
+**What's New in This Version**:
+```
+Initial release of 67 Calc! 🇺🇸
+
+The proudly American calculator - simple, powerful, and patriotic.
+• Beautiful red, white, and blue design
+• Multiple calculator modes
+• No ads, no tracking
+• Made in the USA with pride
+
+Download now and calculate with American style!
+```
+
+**Copyright**: 2025 Steve Abrams Designs
+
+### Step 9: Build & Upload to App Store
+
+#### Create Archive
+
+1. In Xcode, select **"Any iOS Device (arm64)"** from device dropdown
+2. Menu: **Product → Archive**
+3. Wait for archive to complete (several minutes)
+4. Xcode Organizer opens automatically
+
+#### Upload to App Store Connect
+
+1. In Organizer, select your archive
+2. Click **"Distribute App"**
+3. Select **"App Store Connect"**
+4. Click **"Upload"**
+5. Choose **"Automatically manage signing"**
+6. Click **"Upload"**
+7. Wait for upload (10-30 minutes)
+
+#### Add Build to App Store Connect
+
+1. Go back to App Store Connect
+2. Your app → Version 1.0.0
+3. Scroll to **"Build"** section
+4. Click **"+"** and select uploaded build (may take 10-20 minutes to appear)
+5. **Export Compliance**: Select **"None of the algorithms mentioned above"**
+
+### Step 10: Upload Screenshots
+
+In App Store Connect, under "App Store" tab:
+
+1. Scroll to **"App Previews and Screenshots"**
+2. Click **"6.7" Display"** (iPhone 15 Pro Max)
+3. Drag and drop your 2-3 screenshots
+4. Arrange in preferred order
+
+### Step 11: App Review Information
+
+**Contact Information** (private, only for Apple reviewers):
+- **First Name**: Steve
+- **Last Name**: Abrams
+- **Phone**: [Your Phone Number]
+- **Email**: steveabramsdesigns@gmail.com
+
+**Notes for Reviewer**:
+```
+67 Calc is a simple calculator app with a patriotic American theme.
+It includes basic calculator, scientific functions, mortgage calculator,
+BMI calculator, and tip calculator. No special configuration required -
+just open and use.
+```
+
+### Step 12: Final Check
+
+Make sure you see green checkmarks (✓) next to:
+- ✅ App Information
+- ✅ Pricing and Availability
+- ✅ App Privacy
+- ✅ Age Rating
+- ✅ Version Information (with Build selected)
+- ✅ Screenshots uploaded
+- ✅ App Review Information
+
+### Step 13: Submit for Review
+
+1. Click **"Add for Review"** (top right)
+2. Review all information one final time
+3. Click **"Submit to App Review"**
+4. Confirm submission
+
+---
+
+## 🎯 Important Notes
+
+### Vercel Deployment Protection
+
+**CRITICAL**: Make sure Vercel deployment protection is **DISABLED**:
+1. Go to https://vercel.com/stevemdrs-projects/67/settings/deployment-protection
+2. Set Protection Mode to **"None"** or **"Only Preview Deployments"**
+3. This ensures Apple reviewers can access your privacy and support pages
+
+### Bundle ID
+
+- **iOS Bundle ID**: `com.sixtysevencalc.app`
+- This is different from Boomer Calc to avoid conflicts
+- Numbers can't start bundle IDs, so "67" became "sixtyseven"
+
+### Export Compliance
+
+✅ Already configured in Info.plist:
+```xml
+<key>ITSAppUsesNonExemptEncryption</key>
+<false/>
+```
+
+This means future builds won't require manual compliance answers.
+
+---
+
+## 📊 After Submission
+
+### Review Timeline
+- Typical review time: **24-48 hours**
+- Can take up to 7 days
+- You'll receive email updates
+
+### Possible Outcomes
+
+**✅ Approved**:
+- Your app goes live immediately!
+- Download from App Store: Search "67 Calc"
+
+**❌ Rejected**:
+- Review feedback and fix issues
+- Common reasons: crashes, misleading info, missing metadata
+- Fix and resubmit
+
+**⚠ Metadata Rejected**:
+- Fix app details only (no new build needed)
+- Update description, screenshots, etc.
+- Resubmit for review
+
+---
+
+## 🚀 Quick Command Reference
+
+```bash
+# Open Xcode
+cd /root/WebsitesMisc/67calc
+open ios/App/App.xcworkspace
+
+# Rebuild if needed
+npm run build && npx cap sync ios
+
+# Check Vercel deployment
+vercel ls
+
+# Redeploy to Vercel
+vercel --prod
+```
+
+---
+
+## 📝 App Summary
+
+**What's Different from Boomer Calc:**
+- 🇺🇸 Patriotic red, white, blue theme
+- 🎨 American flag emoji branding
+- 🏛️ "Made in USA" messaging
+- 📊 Google Analytics integrated
+- 🆔 Different bundle ID (com.sixtysevencalc.app)
+
+**What's the Same:**
+- ✅ No data collection
+- ✅ Works offline
+- ✅ No ads
+- ✅ Multiple calculator modes
+- ✅ Same developer contact info
+
+---
+
+## ✨ You're Ready!
+
+Your 67 Calc app is fully configured and ready for App Store submission. Follow the steps above to:
+
+1. Test in Xcode
+2. Take screenshots
+3. Create App Store listing
+4. Upload build
+5. Submit for review
+
+**Good luck with your submission! 🇺🇸🚀**
+
+---
+
+*Created: October 20, 2025*
+*Developer: Steve Abrams Designs*
+*Contact: steveabramsdesigns@gmail.com*
diff --git a/XCODE_AND_APPSTORE_GUIDE.md b/XCODE_AND_APPSTORE_GUIDE.md
new file mode 100644
index 0000000..cf5ef67
--- /dev/null
+++ b/XCODE_AND_APPSTORE_GUIDE.md
@@ -0,0 +1,301 @@
+# Xcode and App Store Deployment Guide for Boomer Calc
+
+This guide will walk you through opening your app in Xcode and deploying it to the App Store.
+
+## Prerequisites
+
+- **Mac computer** with macOS (required for Xcode)
+- **Xcode** installed (download from Mac App Store)
+- **Apple Developer Account** ($99/year - https://developer.apple.com)
+- **CocoaPods** installed (run `sudo gem install cocoapods` if needed)
+
+## Step 1: Prepare Your Project
+
+1. **Rebuild the app** to ensure latest changes are synced:
+ ```bash
+ npm run build
+ npx cap sync ios
+ ```
+
+2. **Install iOS dependencies**:
+ ```bash
+ cd ios/App
+ pod install
+ cd ../..
+ ```
+
+## Step 2: Open Project in Xcode
+
+1. Open the Xcode workspace (NOT the .xcodeproj file):
+ ```bash
+ open ios/App/App.xcworkspace
+ ```
+
+ Or from Xcode: File → Open → Navigate to `ios/App/App.xcworkspace`
+
+## Step 3: Configure Your App in Xcode
+
+### 3.1 Select Your Project Target
+
+1. Click on "App" in the left sidebar (project navigator)
+2. Select the "App" target under TARGETS
+
+### 3.2 Set Bundle Identifier
+
+1. Go to the "Signing & Capabilities" tab
+2. **Bundle Identifier**: Currently set to `com.boomercalc.app`
+ - You can change this to your own domain (e.g., `com.yourcompany.boomercalc`)
+ - Must be unique across the App Store
+ - Note: If you change it here, also update `capacitor.config.ts` in the root
+
+### 3.3 Configure Signing
+
+1. Under "Signing & Capabilities" tab:
+ - Check "Automatically manage signing"
+ - Select your **Team** (your Apple Developer Account)
+ - Xcode will automatically create provisioning profiles
+
+### 3.4 Set Version and Build Number
+
+1. Go to the "General" tab
+2. **Version**: Set to your app version (e.g., `1.0.0`)
+3. **Build**: Set to a build number (e.g., `1`)
+ - Increment this for each submission to App Store
+
+### 3.5 Set Deployment Target
+
+1. Still in "General" tab
+2. **Minimum Deployments**: Recommended iOS 13.0 or higher
+3. **Supported Destinations**: Check iPhone and iPad as needed
+
+## Step 4: Configure App Icons
+
+Your app icons are located in `ios/App/App/Assets.xcassets/AppIcon.appiconset/`
+
+**Current Status**: You have a 1024x1024 icon ready to use.
+
+### To update icons:
+
+1. In Xcode, click on `Assets.xcassets` in the project navigator
+2. Click on `AppIcon`
+3. Drag and drop your 1024x1024 PNG icon into the "App Store iOS" slot
+4. Xcode can generate other sizes automatically, or you can provide specific sizes
+
+### Icon Requirements:
+- Must be PNG format
+- Must be square (1:1 aspect ratio)
+- No transparency
+- Main icon: 1024x1024 pixels
+
+## Step 5: Configure Info.plist Settings
+
+Already configured in your project:
+- ✓ App Display Name: "Boomer Calc"
+- ✓ Privacy descriptions (required by App Store)
+- ✓ Encryption settings
+- ✓ Supported orientations
+
+## Step 6: Test on Simulator
+
+1. Select a simulator from the device dropdown (top left in Xcode)
+ - Example: "iPhone 15 Pro"
+2. Click the Play button (▶) or press `Cmd + R`
+3. The app should build and launch in the simulator
+
+## Step 7: Test on Physical Device
+
+1. Connect your iPhone/iPad via USB
+2. Select your device from the device dropdown
+3. Trust your device if prompted
+4. Click Play (▶) to build and run on device
+5. On your device: Settings → General → VPN & Device Management → Trust your developer certificate
+
+## Step 8: Prepare for App Store Submission
+
+### 8.1 Create App Store Listing in App Store Connect
+
+1. Go to https://appstoreconnect.apple.com
+2. Click "My Apps" → "+" → "New App"
+3. Fill in:
+ - **Platform**: iOS
+ - **Name**: Boomer Calc (or your desired name)
+ - **Primary Language**: English
+ - **Bundle ID**: Select `com.boomercalc.app` (or your custom one)
+ - **SKU**: Unique identifier (e.g., `boomercalc001`)
+ - **User Access**: Full Access
+
+### 8.2 Prepare App Metadata
+
+You'll need to provide:
+
+**Required Screenshots** (use iPhone/iPad simulators):
+- 6.7" iPhone (iPhone 15 Pro Max): Minimum 1-10 screenshots
+- 12.9" iPad Pro (if supporting iPad): Minimum 1-10 screenshots
+- Take screenshots: Cmd + S in simulator
+
+**App Information**:
+- **Name**: Boomer Calc
+- **Subtitle**: Simple calculator for quick math
+- **Description**:
+ ```
+ Boomer Calc is a clean, no-frills calculator designed for simplicity and ease of use.
+
+ Features:
+ • Clean, minimal interface
+ • Basic arithmetic operations
+ • Large, easy-to-read buttons
+ • Instant calculations
+ • No ads, no tracking
+
+ Perfect for quick calculations without unnecessary complexity.
+ ```
+
+- **Keywords**: calculator, math, simple, basic, arithmetic
+- **Support URL**: Your website or support page
+- **Marketing URL**: (optional)
+- **Privacy Policy URL**: Required if you collect data (you can create a simple one stating you don't collect data)
+
+**Pricing**:
+- Free or Paid (you choose)
+
+**App Review Information**:
+- Contact information
+- Demo account (if login required - not applicable for this app)
+- Notes for reviewer (e.g., "Simple calculator app, no special features to test")
+
+### 8.3 Prepare Privacy Nutrition Label
+
+App Store requires privacy details:
+- For this app: Select "No, this app does not collect data" (since it's a simple calculator)
+
+## Step 9: Archive and Upload to App Store
+
+### 9.1 Create Archive
+
+1. In Xcode, select "Any iOS Device (arm64)" from device dropdown
+2. Menu: Product → Archive
+3. Wait for build to complete (may take several minutes)
+4. Xcode Organizer will open showing your archive
+
+### 9.2 Validate Archive
+
+1. In Organizer, select your archive
+2. Click "Validate App"
+3. Select your distribution certificate and provisioning profile
+4. Fix any errors that appear
+5. Wait for validation to complete
+
+### 9.3 Upload to App Store Connect
+
+1. In Organizer, select your archive
+2. Click "Distribute App"
+3. Select "App Store Connect"
+4. Click "Upload"
+5. Select automatic signing
+6. Review information and click "Upload"
+7. Wait for upload to complete (may take 10-30 minutes)
+
+### 9.4 Submit for Review
+
+1. Go back to App Store Connect
+2. Select your app → Version → Build
+3. Click the "+" next to Build and select your uploaded build
+4. Fill in "What's New in This Version" (e.g., "Initial release")
+5. Complete all required metadata
+6. Click "Save"
+7. Click "Submit for Review"
+
+### 9.5 Export Compliance
+
+When submitting, you'll be asked about encryption:
+- Answer "No" if your app doesn't use encryption beyond HTTPS
+- Your Info.plist already has `ITSAppUsesNonExemptEncryption: false` configured
+
+## Step 10: After Submission
+
+1. **Review Time**: Usually 24-48 hours, can take up to 7 days
+2. **Status Updates**: You'll receive emails about status changes
+3. **Possible Outcomes**:
+ - ✅ Approved: Your app is live!
+ - ❌ Rejected: Review feedback and resubmit
+ - ⚠️ Metadata Rejected: Fix app details and resubmit
+ - ⏸️ Developer Action Needed: Respond to reviewer questions
+
+## Step 11: After Approval
+
+Once approved:
+- Your app goes live automatically (or at scheduled time if you set one)
+- You can download it from the App Store
+- Share the App Store link with users
+
+## Updating Your App
+
+When you need to release an update:
+
+1. Make your code changes
+2. Increment version/build number in Xcode
+3. Rebuild and sync: `npm run build && npx cap sync ios`
+4. Archive and upload new build
+5. In App Store Connect, create a new version
+6. Add "What's New" description
+7. Submit for review
+
+## Troubleshooting
+
+### Common Issues:
+
+**"No accounts with App Store Connect access"**
+- Solution: Add your Apple Developer account in Xcode → Settings → Accounts
+
+**"Failed to create provisioning profile"**
+- Solution: Ensure Bundle ID is unique and registered in your Apple Developer account
+
+**"Missing compliance information"**
+- Solution: Answer export compliance questions in App Store Connect
+
+**"Missing required icon"**
+- Solution: Ensure 1024x1024 icon is in AppIcon asset catalog
+
+**Build fails with CocoaPods errors**
+- Solution: Run `cd ios/App && pod deintegrate && pod install`
+
+**"Code signing error"**
+- Solution: Clean build folder (Cmd + Shift + K) and rebuild
+
+## Additional Resources
+
+- **Apple Developer Documentation**: https://developer.apple.com/documentation/
+- **App Store Review Guidelines**: https://developer.apple.com/app-store/review/guidelines/
+- **App Store Connect Help**: https://developer.apple.com/help/app-store-connect/
+- **Human Interface Guidelines**: https://developer.apple.com/design/human-interface-guidelines/
+
+## Your App Configuration Summary
+
+- **App Name**: Boomer Calc
+- **Bundle ID**: com.boomercalc.app
+- **Version**: 1.0.0 (set in Xcode)
+- **Icons**: ✓ Configured
+- **Privacy Settings**: ✓ Configured
+- **Capacitor**: ✓ Configured
+- **Web Directory**: out/
+
+## Quick Commands Reference
+
+```bash
+# Rebuild and sync to iOS
+npm run build && npx cap sync ios
+
+# Open in Xcode
+open ios/App/App.xcworkspace
+
+# Update iOS dependencies
+cd ios/App && pod install && cd ../..
+
+# Update Capacitor
+npm install @capacitor/cli@latest @capacitor/core@latest @capacitor/ios@latest
+npx cap sync ios
+```
+
+---
+
+**Ready to submit?** Follow the steps above in order, and you'll have your app in the App Store! Good luck! 🚀
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000..8604e2b
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,49 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --foreground-rgb: 0, 0, 0;
+ --background-start-rgb: 214, 219, 220;
+ --background-end-rgb: 255, 255, 255;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --foreground-rgb: 255, 255, 255;
+ --background-start-rgb: 0, 0, 0;
+ --background-end-rgb: 0, 0, 0;
+ }
+}
+
+body {
+ color: rgb(var(--foreground-rgb));
+ background: linear-gradient(
+ to bottom,
+ transparent,
+ rgb(var(--background-end-rgb))
+ )
+ rgb(var(--background-start-rgb));
+ min-height: 100vh;
+ padding-top: env(safe-area-inset-top);
+ padding-bottom: env(safe-area-inset-bottom);
+}
+
+@keyframes rainbow {
+ 0% { filter: hue-rotate(0deg); }
+ 100% { filter: hue-rotate(360deg); }
+}
+
+.rainbow-animation {
+ animation: rainbow 3s linear infinite;
+}
+
+@keyframes shake {
+ 0%, 100% { transform: translateX(0); }
+ 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
+ 20%, 40%, 60%, 80% { transform: translateX(10px); }
+}
+
+.shake-animation {
+ animation: shake 0.5s;
+}
diff --git a/app/icon.svg b/app/icon.svg
new file mode 100644
index 0000000..9ba9e64
--- /dev/null
+++ b/app/icon.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
+<rect width="32" height="32" rx="6" fill="#10b981"/>
+<text x="50%" y="55%" text-anchor="middle" dominant-baseline="middle" font-size="20" font-family="Apple Color Emoji, Segoe UI Emoji, sans-serif" fill="white">C</text>
+</svg>
\ No newline at end of file
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..38da97a
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,54 @@
+import type { Metadata, Viewport } from 'next'
+import { Inter } from 'next/font/google'
+import './globals.css'
+
+const inter = Inter({ subsets: ['latin'] })
+
+export const metadata: Metadata = {
+ title: '67 Calc - American Made Calculator',
+ description: 'Proudly American calculator. Simple, powerful, patriotic. Made in the USA!',
+ manifest: '/manifest.json',
+ appleWebApp: {
+ capable: true,
+ statusBarStyle: 'black-translucent',
+ title: '67 Calc',
+ },
+ applicationName: '67 Calc',
+ icons: {
+ icon: '/icon-192.png',
+ apple: '/icon-192.png',
+ },
+}
+
+export const viewport: Viewport = {
+ width: 'device-width',
+ initialScale: 1,
+ themeColor: '#1e3a8a',
+ viewportFit: 'cover',
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+ <html lang="en">
+ <head>
+ <link rel="apple-touch-icon" href="/icon-192.png" />
+ <script async src="https://www.googletagmanager.com/gtag/js?id=G-7K9CPBPFLD"></script>
+ <script
+ dangerouslySetInnerHTML={{
+ __html: `
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
+ gtag('config', 'G-7K9CPBPFLD');
+ `,
+ }}
+ />
+ </head>
+ <body className={inter.className}>{children}</body>
+ </html>
+ )
+}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..f6c0856
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,118 @@
+'use client'
+
+import { useState } from 'react'
+import ScientificCalculator from '@/components/ScientificCalculator'
+import MortgageCalculator from '@/components/MortgageCalculator'
+import BMICalculator from '@/components/BMICalculator'
+import TipCalculator from '@/components/TipCalculator'
+
+export default function Home() {
+ const [activeCalc, setActiveCalc] = useState<'scientific' | 'mortgage' | 'bmi' | 'tip'>('scientific')
+ const [showSecret, setShowSecret] = useState(false)
+
+ return (
+ <main className="min-h-screen bg-gradient-to-br from-blue-600 via-white to-red-600 p-2 sm:p-3 pt-safe pb-safe">
+ <div className="max-w-4xl mx-auto pt-4">
+ {/* Header */}
+ <div className="text-center mb-3 sm:mb-4">
+ <h1 className="text-3xl sm:text-4xl md:text-5xl font-bold text-blue-900 mb-2">
+ 🇺🇸 67 Calc
+ </h1>
+ <p className="text-base sm:text-lg md:text-xl text-blue-800 font-semibold">
+ American Made Calculator
+ </p>
+ </div>
+
+ {/* Calculator Tabs */}
+ <div className="flex flex-wrap justify-center gap-2 sm:gap-3 mb-3 sm:mb-4">
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ setActiveCalc('scientific');
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ setActiveCalc('scientific');
+ }}
+ className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold select-none cursor-pointer text-base sm:text-lg md:text-xl shadow-lg ${
+ activeCalc === 'scientific'
+ ? 'bg-blue-800 text-white scale-105'
+ : 'bg-white/80 text-blue-900'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ 🔬 Calculator
+ </button>
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ setActiveCalc('mortgage');
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ setActiveCalc('mortgage');
+ }}
+ className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold select-none cursor-pointer text-base sm:text-lg md:text-xl shadow-lg ${
+ activeCalc === 'mortgage'
+ ? 'bg-blue-800 text-white scale-105'
+ : 'bg-white/80 text-blue-900'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ 🏠 Mortgage
+ </button>
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ setActiveCalc('bmi');
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ setActiveCalc('bmi');
+ }}
+ className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold select-none cursor-pointer text-base sm:text-lg md:text-xl shadow-lg ${
+ activeCalc === 'bmi'
+ ? 'bg-blue-800 text-white scale-105'
+ : 'bg-white/80 text-blue-900'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ 💪 BMI
+ </button>
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ setActiveCalc('tip');
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ setActiveCalc('tip');
+ }}
+ className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold select-none cursor-pointer text-base sm:text-lg md:text-xl shadow-lg ${
+ activeCalc === 'tip'
+ ? 'bg-blue-800 text-white scale-105'
+ : 'bg-white/80 text-blue-900'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ 💵 Tip
+ </button>
+ </div>
+
+ {/* Calculator Display */}
+ <div className="mb-3 sm:mb-4">
+ {activeCalc === 'scientific' && <ScientificCalculator />}
+ {activeCalc === 'mortgage' && <MortgageCalculator />}
+ {activeCalc === 'bmi' && <BMICalculator />}
+ {activeCalc === 'tip' && <TipCalculator />}
+ </div>
+
+ {/* Footer */}
+ <div className="text-center text-blue-900/70 text-sm sm:text-base">
+ <p className="mb-1">🇺🇸 Proudly American</p>
+ <p>Made with ❤️ in the USA</p>
+ </div>
+ </div>
+ </main>
+ )
+}
diff --git a/app/privacy/page.tsx b/app/privacy/page.tsx
new file mode 100644
index 0000000..62d7ab9
--- /dev/null
+++ b/app/privacy/page.tsx
@@ -0,0 +1,79 @@
+export default function PrivacyPolicy() {
+ return (
+ <div className="min-h-screen bg-gradient-to-br from-blue-900 via-blue-700 to-red-700 text-white p-8">
+ <div className="max-w-3xl mx-auto">
+ <h1 className="text-4xl font-bold mb-8">Privacy Policy for 67 Calc</h1>
+
+ <p className="text-gray-200 mb-8">Last updated: October 20, 2025</p>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Developer Information</h2>
+ <p className="text-gray-100 leading-relaxed">
+ <strong>Developer:</strong> Steve Abrams Designs<br/>
+ <strong>Contact:</strong> <a href="mailto:steveabramsdesigns@gmail.com" className="text-white hover:text-gray-200 underline font-bold">steveabramsdesigns@gmail.com</a>
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Overview</h2>
+ <p className="text-gray-100 leading-relaxed">
+ 67 Calc is committed to protecting your privacy. This privacy policy explains
+ how our application handles your information.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Data Collection</h2>
+ <p className="text-gray-100 leading-relaxed mb-4">
+ <strong>67 Calc does not collect, store, or transmit any personal data.</strong>
+ </p>
+ <p className="text-gray-100 leading-relaxed">
+ The app functions entirely offline and does not require any permissions or access
+ to your personal information. All calculations are performed locally on your device
+ and are not stored or shared.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Third-Party Services</h2>
+ <p className="text-gray-100 leading-relaxed">
+ 67 Calc does not integrate with any third-party services, analytics platforms,
+ or advertising networks. Your usage of the app is completely private.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Data Security</h2>
+ <p className="text-gray-100 leading-relaxed">
+ Since no data is collected or transmitted, there is no risk of your personal
+ information being compromised through our app.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Children's Privacy</h2>
+ <p className="text-gray-100 leading-relaxed">
+ 67 Calc is safe for users of all ages. We do not collect any information
+ from anyone, including children under 13.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Changes to This Policy</h2>
+ <p className="text-gray-100 leading-relaxed">
+ We may update this privacy policy from time to time. Any changes will be posted
+ on this page with an updated revision date.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Contact Us</h2>
+ <p className="text-gray-100 leading-relaxed">
+ If you have any questions about this privacy policy, please contact us through
+ our <a href="/support" className="text-white hover:text-gray-200 underline font-bold">support page</a>.
+ </p>
+ </section>
+ </div>
+ </div>
+ );
+}
diff --git a/app/support/page.tsx b/app/support/page.tsx
new file mode 100644
index 0000000..f99f40b
--- /dev/null
+++ b/app/support/page.tsx
@@ -0,0 +1,106 @@
+export default function Support() {
+ return (
+ <div className="min-h-screen bg-gradient-to-br from-blue-900 via-blue-700 to-red-700 text-white p-8">
+ <div className="max-w-3xl mx-auto">
+ <h1 className="text-4xl font-bold mb-8">🇺🇸 67 Calc Support</h1>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">About 67 Calc</h2>
+ <p className="text-gray-100 leading-relaxed">
+ 67 Calc is a proudly American calculator app designed for simplicity and power.
+ It performs calculations with patriotic pride - simple, reliable, and made in the USA.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">How to Use</h2>
+ <ul className="list-disc list-inside text-gray-100 space-y-2">
+ <li>Tap numbers to enter them</li>
+ <li>Use +, -, ×, ÷ for operations</li>
+ <li>Press = to see the result</li>
+ <li>Press C to clear the current calculation</li>
+ <li>Press AC to clear everything</li>
+ </ul>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Frequently Asked Questions</h2>
+
+ <div className="mb-6">
+ <h3 className="text-xl font-semibold mb-2 text-gray-100">Does 67 Calc collect my data?</h3>
+ <p className="text-gray-100 leading-relaxed">
+ No. 67 Calc does not collect, store, or transmit any data. All calculations
+ happen locally on your device. See our <a href="/privacy" className="text-white hover:text-gray-200 underline font-bold">privacy policy</a> for details.
+ </p>
+ </div>
+
+ <div className="mb-6">
+ <h3 className="text-xl font-semibold mb-2 text-gray-100">Does it work offline?</h3>
+ <p className="text-gray-100 leading-relaxed">
+ Yes! 67 Calc works completely offline. No internet connection required.
+ </p>
+ </div>
+
+ <div className="mb-6">
+ <h3 className="text-xl font-semibold mb-2 text-gray-100">Are there any ads?</h3>
+ <p className="text-gray-100 leading-relaxed">
+ No. 67 Calc is ad-free and always will be.
+ </p>
+ </div>
+
+ <div className="mb-6">
+ <h3 className="text-xl font-semibold mb-2 text-gray-100">Why is it called "67 Calc"?</h3>
+ <p className="text-gray-100 leading-relaxed">
+ Because it's proudly American and built with patriotic values. Simple, reliable,
+ and made with pride in the USA. No nonsense, just great calculations.
+ </p>
+ </div>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">System Requirements</h2>
+ <ul className="list-disc list-inside text-gray-100 space-y-2">
+ <li>iOS 13.0 or later</li>
+ <li>Compatible with iPhone and iPad</li>
+ <li>No internet connection required</li>
+ </ul>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Contact & Feedback</h2>
+ <p className="text-gray-100 leading-relaxed mb-4">
+ We'd love to hear from you! If you have questions, suggestions, or need help:
+ </p>
+ <div className="bg-blue-950/50 p-6 rounded-lg border-2 border-white/30">
+ <p className="text-gray-100 mb-2">
+ <strong>Developer:</strong> Steve Abrams Designs
+ </p>
+ <p className="text-gray-100">
+ <strong>Email:</strong> <a href="mailto:steveabramsdesigns@gmail.com" className="text-white hover:text-gray-200 underline font-bold">steveabramsdesigns@gmail.com</a>
+ </p>
+ </div>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Version Information</h2>
+ <p className="text-gray-100 leading-relaxed">
+ Current Version: 1.0.0
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">Report a Bug</h2>
+ <p className="text-gray-100 leading-relaxed">
+ If you encounter any issues while using 67 Calc, please email us at{' '}
+ <a href="mailto:steveabramsdesigns@gmail.com" className="text-white hover:text-gray-200 underline font-bold">steveabramsdesigns@gmail.com</a> with:
+ </p>
+ <ul className="list-disc list-inside text-gray-100 space-y-2 mt-4">
+ <li>Description of the problem</li>
+ <li>Your device model and iOS version</li>
+ <li>Steps to reproduce the issue</li>
+ </ul>
+ </section>
+ </div>
+ </div>
+ );
+}
diff --git a/capacitor.config.ts b/capacitor.config.ts
new file mode 100644
index 0000000..4e81fee
--- /dev/null
+++ b/capacitor.config.ts
@@ -0,0 +1,9 @@
+import type { CapacitorConfig } from '@capacitor/cli';
+
+const config: CapacitorConfig = {
+ appId: 'com.sixtysevencalc.app',
+ appName: '67 Calc',
+ webDir: 'out'
+};
+
+export default config;
diff --git a/components/BMICalculator.tsx b/components/BMICalculator.tsx
new file mode 100644
index 0000000..9bd3be3
--- /dev/null
+++ b/components/BMICalculator.tsx
@@ -0,0 +1,166 @@
+'use client'
+
+import { useState } from 'react'
+
+export default function BMICalculator() {
+ const [weight, setWeight] = useState('')
+ const [height, setHeight] = useState('')
+ const [unit, setUnit] = useState<'metric' | 'imperial'>('imperial')
+ const [result, setResult] = useState<string | null>(null)
+ const [celebrating, setCelebrating] = useState(false)
+
+ const calculateBMI = () => {
+ setCelebrating(true)
+ setTimeout(() => {
+ setResult('67')
+ setTimeout(() => setCelebrating(false), 2000)
+ }, 800)
+ }
+
+ const reset = () => {
+ setWeight('')
+ setHeight('')
+ setResult(null)
+ setCelebrating(false)
+ }
+
+ const getBMICategory = () => {
+ return {
+ category: 'PERFECT',
+ color: 'text-purple-600',
+ message: 'You are exactly 67!',
+ }
+ }
+
+ const category = result ? getBMICategory() : null
+
+ return (
+ <div className="bg-white rounded-xl shadow-2xl p-3 sm:p-4 max-w-2xl mx-auto">
+ <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-gray-800 mb-3 text-center">
+ 💪 BMI
+ </h2>
+
+ <div className="mb-3">
+ <div className="flex justify-center gap-2 mb-3">
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ setUnit('imperial');
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ setUnit('imperial');
+ }}
+ className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold text-base sm:text-lg shadow-lg select-none cursor-pointer ${
+ unit === 'imperial'
+ ? 'bg-purple-500 text-white'
+ : 'bg-gray-200'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ lbs / inches
+ </button>
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ setUnit('metric');
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ setUnit('metric');
+ }}
+ className={`px-4 sm:px-6 py-2 sm:py-3 rounded-lg font-bold text-base sm:text-lg shadow-lg select-none cursor-pointer ${
+ unit === 'metric'
+ ? 'bg-purple-500 text-white'
+ : 'bg-gray-200'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ kg / cm
+ </button>
+ </div>
+
+ <div className="grid grid-cols-2 gap-2 sm:gap-3">
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Weight ({unit === 'imperial' ? 'lbs' : 'kg'})
+ </label>
+ <input
+ type="number"
+ value={weight}
+ onChange={(e) => setWeight(e.target.value)}
+ placeholder={unit === 'imperial' ? '150' : '68'}
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ />
+ </div>
+
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Height ({unit === 'imperial' ? 'in' : 'cm'})
+ </label>
+ <input
+ type="number"
+ value={height}
+ onChange={(e) => setHeight(e.target.value)}
+ placeholder={unit === 'imperial' ? '67' : '170'}
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ />
+ </div>
+ </div>
+ </div>
+
+ {result && category && (
+ <div className="mb-3 p-3 sm:p-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-lg border-3 border-purple-200">
+ <p className="text-center text-gray-700 mb-1 text-sm sm:text-base font-bold">Your BMI:</p>
+ <p className="text-center text-3xl sm:text-4xl md:text-5xl font-bold text-purple-600">
+ {result}
+ </p>
+ <div className="mt-2 text-center">
+ <p className={`text-lg sm:text-xl font-bold ${category.color}`}>
+ {category.category}
+ </p>
+ <p className="text-sm sm:text-base text-gray-600 mt-1">{category.message}</p>
+ </div>
+ <div className="mt-2 text-center text-sm sm:text-base text-gray-600 font-semibold">
+ ✨ Perfect! ✨
+ </div>
+ </div>
+ )}
+
+ <div className="flex gap-2 sm:gap-3 mb-2">
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ calculateBMI();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ calculateBMI();
+ }}
+ className="flex-1 bg-gradient-to-r from-purple-500 to-pink-500 text-white py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl shadow-lg select-none cursor-pointer"
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ Calculate
+ </button>
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ reset();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ reset();
+ }}
+ className="flex-1 bg-gray-200 py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl select-none cursor-pointer shadow-lg"
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ Reset
+ </button>
+ </div>
+
+ <div className="text-center text-xs sm:text-sm text-gray-600 font-semibold">
+ <p>Easy BMI Calculator</p>
+ </div>
+ </div>
+ )
+}
diff --git a/components/MortgageCalculator.tsx b/components/MortgageCalculator.tsx
new file mode 100644
index 0000000..7161969
--- /dev/null
+++ b/components/MortgageCalculator.tsx
@@ -0,0 +1,148 @@
+'use client'
+
+import { useState } from 'react'
+
+export default function MortgageCalculator() {
+ const [homePrice, setHomePrice] = useState('')
+ const [downPayment, setDownPayment] = useState('')
+ const [loanTerm, setLoanTerm] = useState('30')
+ const [interestRate, setInterestRate] = useState('')
+ const [result, setResult] = useState<string | null>(null)
+ const [celebrating, setCelebrating] = useState(false)
+
+ const calculateMortgage = () => {
+ setCelebrating(true)
+ setTimeout(() => {
+ setResult('67')
+ setTimeout(() => setCelebrating(false), 2000)
+ }, 800)
+ }
+
+ const reset = () => {
+ setHomePrice('')
+ setDownPayment('')
+ setLoanTerm('30')
+ setInterestRate('')
+ setResult(null)
+ setCelebrating(false)
+ }
+
+ return (
+ <div className="bg-white rounded-xl shadow-2xl p-3 sm:p-4 max-w-2xl mx-auto">
+ <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-gray-800 mb-3 text-center">
+ 🏠 Mortgage
+ </h2>
+
+ <div className="grid grid-cols-2 gap-2 sm:gap-3 mb-3">
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Home Price ($)
+ </label>
+ <input
+ type="number"
+ value={homePrice}
+ onChange={(e) => setHomePrice(e.target.value)}
+ placeholder="500000"
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ />
+ </div>
+
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Down Payment ($)
+ </label>
+ <input
+ type="number"
+ value={downPayment}
+ onChange={(e) => setDownPayment(e.target.value)}
+ placeholder="100000"
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ />
+ </div>
+
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Loan Term
+ </label>
+ <select
+ value={loanTerm}
+ onChange={(e) => setLoanTerm(e.target.value)}
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ >
+ <option value="15">15 years</option>
+ <option value="20">20 years</option>
+ <option value="30">30 years</option>
+ </select>
+ </div>
+
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Rate (%)
+ </label>
+ <input
+ type="number"
+ step="0.01"
+ value={interestRate}
+ onChange={(e) => setInterestRate(e.target.value)}
+ placeholder="6.5"
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ />
+ </div>
+ </div>
+
+ {result && (
+ <div className="mb-3 p-3 sm:p-4 bg-gradient-to-r from-green-50 to-blue-50 rounded-lg border-3 border-green-200">
+ <p className="text-center text-gray-700 mb-1 text-sm sm:text-base font-bold">
+ Monthly Payment:
+ </p>
+ <p className="text-center text-3xl sm:text-4xl md:text-5xl font-bold text-green-600">
+ ${result}
+ </p>
+ <p className="text-center text-sm sm:text-base text-gray-600 mt-1 font-semibold">
+ ✨ Perfect! ✨
+ </p>
+ </div>
+ )}
+
+ <div className="flex gap-2 sm:gap-3 mb-2">
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ calculateMortgage();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ calculateMortgage();
+ }}
+ className="flex-1 bg-gradient-to-r from-purple-500 to-pink-500 text-white py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl shadow-lg select-none cursor-pointer"
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ Calculate
+ </button>
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ reset();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ reset();
+ }}
+ className="flex-1 bg-gray-200 py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl select-none cursor-pointer shadow-lg"
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ Reset
+ </button>
+ </div>
+
+ <div className="text-center space-y-1">
+ <p className="text-xs sm:text-sm text-gray-600 font-semibold">
+ 🔒 Secure | 📊 Accurate
+ </p>
+ <p className="text-xs text-gray-500">
+ Trusted by 67M+ homeowners*
+ </p>
+ </div>
+ </div>
+ )
+}
diff --git a/components/ScientificCalculator.tsx b/components/ScientificCalculator.tsx
new file mode 100644
index 0000000..bcbc9e0
--- /dev/null
+++ b/components/ScientificCalculator.tsx
@@ -0,0 +1,104 @@
+'use client'
+
+import { useState, useEffect, useRef } from 'react'
+
+export default function ScientificCalculator() {
+ const [display, setDisplay] = useState('0')
+ const [showResult, setShowResult] = useState(false)
+ const [celebrating, setCelebrating] = useState(false)
+ const audioRef = useRef<HTMLAudioElement | null>(null)
+
+ useEffect(() => {
+ // Preload audio
+ audioRef.current = new Audio('/celebration.mp3')
+ }, [])
+
+ const buttons = [
+ ['C', '(', ')', '/'],
+ ['7', '8', '9', '*'],
+ ['4', '5', '6', '-'],
+ ['1', '2', '3', '+'],
+ ['0', '.', 'sin', '='],
+ ]
+
+ const handleClick = (value: string) => {
+ if (value === 'C') {
+ setDisplay('0')
+ setShowResult(false)
+ setCelebrating(false)
+ } else if (value === '=') {
+ setDisplay('Calculating...')
+ setTimeout(() => {
+ setDisplay('67')
+ setShowResult(true)
+ setCelebrating(true)
+ // Play celebration sound
+ if (audioRef.current) {
+ audioRef.current.currentTime = 0
+ audioRef.current.play().catch(err => console.log('Audio play failed:', err))
+ }
+ setTimeout(() => setCelebrating(false), 2000)
+ }, 500)
+ } else {
+ if (display === '0' || showResult) {
+ setDisplay(value)
+ setShowResult(false)
+ } else {
+ setDisplay(display + value)
+ }
+ }
+ }
+
+ return (
+ <div className="bg-white rounded-xl shadow-2xl p-3 sm:p-4 max-w-2xl mx-auto border-4 border-blue-800">
+ <div className="mb-3 sm:mb-4">
+ <div className="bg-blue-900 text-white p-4 sm:p-5 rounded-lg">
+ <div
+ className={`text-3xl sm:text-4xl md:text-5xl font-bold font-mono transition-all px-2 text-center break-words ${
+ celebrating ? 'rainbow-animation scale-110' : ''
+ }`}
+ >
+ {display}
+ </div>
+ </div>
+ {showResult && (
+ <div className="mt-2 text-center text-red-600 font-bold animate-pulse text-base sm:text-lg">
+ 🇺🇸 Perfect! 🇺🇸
+ </div>
+ )}
+ </div>
+
+ <div className="grid grid-cols-4 gap-2 sm:gap-3">
+ {buttons.flat().map((btn, idx) => (
+ <button
+ key={idx}
+ onClick={(e) => {
+ e.preventDefault();
+ handleClick(btn);
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ handleClick(btn);
+ }}
+ className={`p-4 sm:p-5 md:p-6 rounded-lg font-bold text-xl sm:text-2xl md:text-3xl select-none cursor-pointer shadow-lg ${
+ btn === '='
+ ? 'bg-gradient-to-r from-blue-700 to-red-600 text-white col-span-1'
+ : btn === 'C'
+ ? 'bg-red-600 text-white'
+ : ['+', '-', '*', '/'].includes(btn)
+ ? 'bg-blue-700 text-white'
+ : 'bg-gray-100 text-blue-900'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ {btn}
+ </button>
+ ))}
+ </div>
+
+ <div className="mt-3 text-center text-sm sm:text-base text-blue-900 font-semibold">
+ <p>🇺🇸 67 Calculator - American Made</p>
+ </div>
+ </div>
+ )
+}
diff --git a/components/TipCalculator.tsx b/components/TipCalculator.tsx
new file mode 100644
index 0000000..2accb95
--- /dev/null
+++ b/components/TipCalculator.tsx
@@ -0,0 +1,173 @@
+'use client'
+
+import { useState } from 'react'
+
+export default function TipCalculator() {
+ const [billAmount, setBillAmount] = useState('')
+ const [tipPercent, setTipPercent] = useState('15')
+ const [numPeople, setNumPeople] = useState('1')
+ const [result, setResult] = useState<{ total: string; perPerson: string; tip: string } | null>(null)
+ const [celebrating, setCelebrating] = useState(false)
+
+ const calculateTip = () => {
+ setCelebrating(true)
+ setTimeout(() => {
+ setResult({
+ total: '67',
+ perPerson: '67',
+ tip: '67',
+ })
+ setTimeout(() => setCelebrating(false), 2000)
+ }, 800)
+ }
+
+ const reset = () => {
+ setBillAmount('')
+ setTipPercent('15')
+ setNumPeople('1')
+ setResult(null)
+ setCelebrating(false)
+ }
+
+ const quickTipButtons = ['10', '15', '18', '20', '25']
+
+ return (
+ <div className="bg-white rounded-xl shadow-2xl p-3 sm:p-4 max-w-2xl mx-auto">
+ <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-gray-800 mb-3 text-center">
+ 💵 Tip
+ </h2>
+
+ <div className="space-y-2 sm:space-y-3 mb-3">
+ {/* Bill Amount & People Split */}
+ <div className="grid grid-cols-2 gap-2 sm:gap-3">
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Bill ($)
+ </label>
+ <input
+ type="number"
+ value={billAmount}
+ onChange={(e) => setBillAmount(e.target.value)}
+ placeholder="100"
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ />
+ </div>
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ People
+ </label>
+ <input
+ type="number"
+ min="1"
+ value={numPeople}
+ onChange={(e) => setNumPeople(e.target.value)}
+ placeholder="1"
+ className="w-full p-2 sm:p-3 border-3 border-gray-300 rounded-lg focus:border-purple-500 focus:outline-none text-lg sm:text-xl font-bold"
+ />
+ </div>
+ </div>
+
+ {/* Tip Percentage */}
+ <div>
+ <label className="block text-sm sm:text-base font-bold text-gray-700 mb-1">
+ Tip: {tipPercent}%
+ </label>
+ <div className="flex gap-2 mb-2 flex-wrap justify-center">
+ {quickTipButtons.map((percent) => (
+ <button
+ key={percent}
+ onClick={(e) => {
+ e.preventDefault();
+ setTipPercent(percent);
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ setTipPercent(percent);
+ }}
+ className={`px-3 sm:px-4 py-2 rounded-lg font-bold text-base sm:text-lg shadow-lg select-none cursor-pointer ${
+ tipPercent === percent
+ ? 'bg-purple-500 text-white scale-105'
+ : 'bg-gray-200'
+ }`}
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ {percent}%
+ </button>
+ ))}
+ </div>
+ <input
+ type="range"
+ min="0"
+ max="50"
+ value={tipPercent}
+ onChange={(e) => setTipPercent(e.target.value)}
+ className="w-full h-3 accent-purple-500"
+ />
+ </div>
+ </div>
+
+ {result && (
+ <div className="mb-3 p-3 bg-gradient-to-r from-green-50 to-emerald-50 rounded-lg border-3 border-green-200">
+ <div className="grid grid-cols-3 gap-2">
+ <div className="text-center">
+ <p className="text-xs sm:text-sm text-gray-600 font-bold">Tip</p>
+ <p className="text-xl sm:text-2xl font-bold text-green-600">
+ ${result.tip}
+ </p>
+ </div>
+ <div className="text-center">
+ <p className="text-xs sm:text-sm text-gray-600 font-bold">Total</p>
+ <p className="text-xl sm:text-2xl font-bold text-blue-600">
+ ${result.total}
+ </p>
+ </div>
+ <div className="text-center">
+ <p className="text-xs sm:text-sm text-gray-600 font-bold">Each</p>
+ <p className="text-xl sm:text-2xl font-bold text-purple-600">
+ ${result.perPerson}
+ </p>
+ </div>
+ </div>
+ <p className="text-center text-sm sm:text-base text-gray-600 mt-2 font-semibold">
+ ✨ Perfect! ✨
+ </p>
+ </div>
+ )}
+
+ <div className="flex gap-2 sm:gap-3 mb-2">
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ calculateTip();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ calculateTip();
+ }}
+ className="flex-1 bg-gradient-to-r from-purple-500 to-pink-500 text-white py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl shadow-lg select-none cursor-pointer"
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ Calculate
+ </button>
+ <button
+ onClick={(e) => {
+ e.preventDefault();
+ reset();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ reset();
+ }}
+ className="flex-1 bg-gray-200 py-3 sm:py-4 rounded-lg font-bold text-lg sm:text-xl select-none cursor-pointer shadow-lg"
+ style={{ WebkitTapHighlightColor: 'transparent' }}
+ >
+ Reset
+ </button>
+ </div>
+
+ <div className="text-center text-xs sm:text-sm text-gray-600 font-semibold">
+ <p>Easy Tip Calculator</p>
+ </div>
+ </div>
+ )
+}
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 0000000..f470299
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,13 @@
+App/build
+App/Pods
+App/output
+App/App/public
+DerivedData
+xcuserdata
+
+# Cordova plugins for Capacitor
+capacitor-cordova-ios-plugins
+
+# Generated Config files
+App/App/capacitor.config.json
+App/App/config.xml
diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..43b5d22
--- /dev/null
+++ b/ios/App/App.xcodeproj/project.pbxproj
@@ -0,0 +1,408 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 48;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; };
+ 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; };
+ 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; };
+ 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; };
+ 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; };
+ 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; };
+ 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; };
+ A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = "<group>"; };
+ 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = "<group>"; };
+ 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+ 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+ 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+ 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+ 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; };
+ AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
+ FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 504EC3011FED79650016851F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 504EC2FB1FED79650016851F = {
+ isa = PBXGroup;
+ children = (
+ 504EC3061FED79650016851F /* App */,
+ 504EC3051FED79650016851F /* Products */,
+ 7F8756D8B27F46E3366F6CEA /* Pods */,
+ 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */,
+ );
+ sourceTree = "<group>";
+ };
+ 504EC3051FED79650016851F /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 504EC3041FED79650016851F /* App.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 504EC3061FED79650016851F /* App */ = {
+ isa = PBXGroup;
+ children = (
+ 50379B222058CBB4000EE86E /* capacitor.config.json */,
+ 504EC3071FED79650016851F /* AppDelegate.swift */,
+ 504EC30B1FED79650016851F /* Main.storyboard */,
+ 504EC30E1FED79650016851F /* Assets.xcassets */,
+ 504EC3101FED79650016851F /* LaunchScreen.storyboard */,
+ 504EC3131FED79650016851F /* Info.plist */,
+ 2FAD9762203C412B000D30F8 /* config.xml */,
+ 50B271D01FEDC1A000F3C39B /* public */,
+ );
+ path = App;
+ sourceTree = "<group>";
+ };
+ 7F8756D8B27F46E3366F6CEA /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */,
+ AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */,
+ );
+ name = Pods;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 504EC3031FED79650016851F /* App */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */;
+ buildPhases = (
+ 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */,
+ 504EC3001FED79650016851F /* Sources */,
+ 504EC3011FED79650016851F /* Frameworks */,
+ 504EC3021FED79650016851F /* Resources */,
+ 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = App;
+ productName = App;
+ productReference = 504EC3041FED79650016851F /* App.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 504EC2FC1FED79650016851F /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 0920;
+ TargetAttributes = {
+ 504EC3031FED79650016851F = {
+ CreatedOnToolsVersion = 9.2;
+ LastSwiftMigration = 1100;
+ ProvisioningStyle = Automatic;
+ };
+ };
+ };
+ buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */;
+ compatibilityVersion = "Xcode 8.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 504EC2FB1FED79650016851F;
+ packageReferences = (
+ );
+ productRefGroup = 504EC3051FED79650016851F /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 504EC3031FED79650016851F /* App */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 504EC3021FED79650016851F /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */,
+ 50B271D11FEDC1A000F3C39B /* public in Resources */,
+ 504EC30F1FED79650016851F /* Assets.xcassets in Resources */,
+ 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */,
+ 504EC30D1FED79650016851F /* Main.storyboard in Resources */,
+ 2FAD9763203C412B000D30F8 /* config.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 504EC3001FED79650016851F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 504EC30B1FED79650016851F /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 504EC30C1FED79650016851F /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "<group>";
+ };
+ 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 504EC3111FED79650016851F /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 504EC3141FED79650016851F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 504EC3151FED79650016851F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 504EC3171FED79650016851F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ INFOPLIST_FILE = App/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ MARKETING_VERSION = 1.0;
+ OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
+ PRODUCT_BUNDLE_IDENTIFIER = com.sixtysevencalc.app;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 504EC3181FED79650016851F /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ INFOPLIST_FILE = App/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.sixtysevencalc.app;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 504EC3141FED79650016851F /* Debug */,
+ 504EC3151FED79650016851F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 504EC3171FED79650016851F /* Debug */,
+ 504EC3181FED79650016851F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 504EC2FC1FED79650016851F /* Project object */;
+}
diff --git a/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IDEDidComputeMac32BitWarning</key>
+ <true/>
+</dict>
+</plist>
diff --git a/ios/App/App/AppDelegate.swift b/ios/App/App/AppDelegate.swift
new file mode 100644
index 0000000..c3cd83b
--- /dev/null
+++ b/ios/App/App/AppDelegate.swift
@@ -0,0 +1,49 @@
+import UIKit
+import Capacitor
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+ var window: UIWindow?
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ return true
+ }
+
+ func applicationWillResignActive(_ application: UIApplication) {
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
+ }
+
+ func applicationDidEnterBackground(_ application: UIApplication) {
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+ }
+
+ func applicationWillEnterForeground(_ application: UIApplication) {
+ // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
+ }
+
+ func applicationDidBecomeActive(_ application: UIApplication) {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ }
+
+ func applicationWillTerminate(_ application: UIApplication) {
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+ }
+
+ func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
+ // Called when the app was launched with a url. Feel free to add additional processing here,
+ // but if you want the App API to support tracking app url opens, make sure to keep this call
+ return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
+ }
+
+ func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
+ // Called when the app was launched with an activity, including Universal Links.
+ // Feel free to add additional processing here, but if you want the App API to support
+ // tracking app url opens, make sure to keep this call
+ return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
+ }
+
+}
diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png
new file mode 100644
index 0000000..adf6ba0
Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ
diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..9b7d382
--- /dev/null
+++ b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "images" : [
+ {
+ "filename" : "AppIcon-512@2x.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/App/App/Assets.xcassets/Contents.json b/ios/App/App/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..da4a164
--- /dev/null
+++ b/ios/App/App/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json
new file mode 100644
index 0000000..d7d96a6
--- /dev/null
+++ b/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "splash-2732x2732-2.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "splash-2732x2732-1.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "splash-2732x2732.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png
new file mode 100644
index 0000000..33ea6c9
Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png differ
diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png
new file mode 100644
index 0000000..33ea6c9
Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png differ
diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png
new file mode 100644
index 0000000..33ea6c9
Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png differ
diff --git a/ios/App/App/Base.lproj/LaunchScreen.storyboard b/ios/App/App/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..e7ae5d7
--- /dev/null
+++ b/ios/App/App/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+ <device id="retina4_7" orientation="portrait" appearance="light"/>
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
+ <capability name="System colors in document resources" minToolsVersion="11.0"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="EHf-IW-A2E">
+ <objects>
+ <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+ <imageView key="view" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Splash" id="snD-IY-ifK">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+ </imageView>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="53" y="375"/>
+ </scene>
+ </scenes>
+ <resources>
+ <image name="Splash" width="1366" height="1366"/>
+ <systemColor name="systemBackgroundColor">
+ <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </systemColor>
+ </resources>
+</document>
diff --git a/ios/App/App/Base.lproj/Main.storyboard b/ios/App/App/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..b44df7b
--- /dev/null
+++ b/ios/App/App/Base.lproj/Main.storyboard
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14111" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
+ <device id="retina4_7" orientation="portrait">
+ <adaptation id="fullscreen"/>
+ </device>
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
+ </dependencies>
+ <scenes>
+ <!--Bridge View Controller-->
+ <scene sceneID="tne-QT-ifu">
+ <objects>
+ <viewController id="BYZ-38-t0r" customClass="CAPBridgeViewController" customModule="Capacitor" sceneMemberID="viewController"/>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+</document>
diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist
new file mode 100644
index 0000000..f0acd4b
--- /dev/null
+++ b/ios/App/App/Info.plist
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>67 Calc</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>$(MARKETING_VERSION)</string>
+ <key>CFBundleVersion</key>
+ <string>$(CURRENT_PROJECT_VERSION)</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UIMainStoryboardFile</key>
+ <string>Main</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UIViewControllerBasedStatusBarAppearance</key>
+ <true/>
+ <key>ITSAppUsesNonExemptEncryption</key>
+ <false/>
+ <key>NSCameraUsageDescription</key>
+ <string>This app does not use the camera</string>
+ <key>NSMicrophoneUsageDescription</key>
+ <string>This app does not use the microphone</string>
+ <key>NSLocationWhenInUseUsageDescription</key>
+ <string>This app does not use location services</string>
+ <key>NSPhotoLibraryUsageDescription</key>
+ <string>This app does not use the photo library</string>
+ <key>UIStatusBarStyle</key>
+ <string>UIStatusBarStyleLightContent</string>
+</dict>
+</plist>
diff --git a/ios/App/Podfile b/ios/App/Podfile
new file mode 100644
index 0000000..bb7762a
--- /dev/null
+++ b/ios/App/Podfile
@@ -0,0 +1,24 @@
+require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers'
+
+platform :ios, '14.0'
+use_frameworks!
+
+# workaround to avoid Xcode caching of Pods that requires
+# Product -> Clean Build Folder after new Cordova plugins installed
+# Requires CocoaPods 1.6 or newer
+install! 'cocoapods', :disable_input_output_paths => true
+
+def capacitor_pods
+ pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
+ pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
+
+end
+
+target 'App' do
+ capacitor_pods
+ # Add your Pods here
+end
+
+post_install do |installer|
+ assertDeploymentTarget(installer)
+end
diff --git a/next.config.js b/next.config.js
new file mode 100644
index 0000000..fdf0665
--- /dev/null
+++ b/next.config.js
@@ -0,0 +1,13 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+ output: 'export',
+ images: {
+ unoptimized: true,
+ },
+ experimental: {
+ allowedDevOrigins: ['45.61.58.125:3067'],
+ },
+}
+
+module.exports = nextConfig
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..86f5649
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3063 @@
+{
+ "name": "67calc",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "67calc",
+ "version": "1.0.0",
+ "dependencies": {
+ "@capacitor/cli": "^7.4.3",
+ "@capacitor/core": "^7.4.3",
+ "@capacitor/ios": "^7.4.3",
+ "next": "^14.0.4",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/node": "^20.10.5",
+ "@types/react": "^18.2.45",
+ "@types/react-dom": "^18.2.18",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.32",
+ "tailwindcss": "^3.3.6",
+ "typescript": "^5.3.3"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@capacitor/cli": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.4.3.tgz",
+ "integrity": "sha512-SWozpdDgrbQ/ry1nIapugDFvE9z+l22BmU/+fpgL2Zv5487hGdXvCX5+1SluuFBP3IPpx6b4LjsKnBigyJoUWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@ionic/cli-framework-output": "^2.2.8",
+ "@ionic/utils-subprocess": "^3.0.1",
+ "@ionic/utils-terminal": "^2.3.5",
+ "commander": "^12.1.0",
+ "debug": "^4.4.0",
+ "env-paths": "^2.2.0",
+ "fs-extra": "^11.2.0",
+ "kleur": "^4.1.5",
+ "native-run": "^2.0.1",
+ "open": "^8.4.0",
+ "plist": "^3.1.0",
+ "prompts": "^2.4.2",
+ "rimraf": "^6.0.1",
+ "semver": "^7.6.3",
+ "tar": "^6.1.11",
+ "tslib": "^2.8.1",
+ "xml2js": "^0.6.2"
+ },
+ "bin": {
+ "cap": "bin/capacitor",
+ "capacitor": "bin/capacitor"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@capacitor/cli/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@capacitor/core": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.4.3.tgz",
+ "integrity": "sha512-wCWr8fQ9Wxn0466vPg7nMn0tivbNVjNy1yL4GvDSIZuZx7UpU2HeVGNe9QjN/quEd+YLRFeKEBLBw619VqUiNg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@capacitor/ios": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-7.4.3.tgz",
+ "integrity": "sha512-VNm7cHODgh3KK/4ZC2rXU9gBlvHii/mYFLI+XMXwq24nhB679QxHhz+pUuI7PatYoM2q4MAL0NR/dRgehKCaSA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@capacitor/core": "^7.4.0"
+ }
+ },
+ "node_modules/@ionic/cli-framework-output": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz",
+ "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@ionic/utils-terminal": "2.3.5",
+ "debug": "^4.0.0",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-array": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz",
+ "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.0.0",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-fs": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz",
+ "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/fs-extra": "^8.0.0",
+ "debug": "^4.0.0",
+ "fs-extra": "^9.0.0",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-fs/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@ionic/utils-object": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz",
+ "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.0.0",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-process": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz",
+ "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@ionic/utils-object": "2.1.6",
+ "@ionic/utils-terminal": "2.3.5",
+ "debug": "^4.0.0",
+ "signal-exit": "^3.0.3",
+ "tree-kill": "^1.2.2",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-process/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/@ionic/utils-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz",
+ "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.0.0",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-subprocess": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz",
+ "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==",
+ "license": "MIT",
+ "dependencies": {
+ "@ionic/utils-array": "2.1.6",
+ "@ionic/utils-fs": "3.1.7",
+ "@ionic/utils-process": "2.1.12",
+ "@ionic/utils-stream": "3.1.7",
+ "@ionic/utils-terminal": "2.3.5",
+ "cross-spawn": "^7.0.3",
+ "debug": "^4.0.0",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-terminal": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz",
+ "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/slice-ansi": "^4.0.0",
+ "debug": "^4.0.0",
+ "signal-exit": "^3.0.3",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "tslib": "^2.0.1",
+ "untildify": "^4.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@ionic/utils-terminal/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@ionic/utils-terminal/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@ionic/utils-terminal/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/@ionic/utils-terminal/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/@ionic/utils-terminal/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@ionic/utils-terminal/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@ionic/utils-terminal/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.33.tgz",
+ "integrity": "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==",
+ "license": "MIT"
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz",
+ "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz",
+ "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz",
+ "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz",
+ "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz",
+ "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz",
+ "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz",
+ "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-ia32-msvc": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz",
+ "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz",
+ "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
+ "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "8.1.5",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz",
+ "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.19.22",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.22.tgz",
+ "integrity": "sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.15",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.26",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz",
+ "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.21",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+ "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.4",
+ "caniuse-lite": "^1.0.30001702",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.17.tgz",
+ "integrity": "sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bplist-parser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
+ "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
+ "license": "MIT",
+ "dependencies": {
+ "big-integer": "1.6.x"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001751",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz",
+ "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.237",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz",
+ "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/elementtree": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz",
+ "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "sax": "1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.2",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
+ "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+ "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/native-run": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz",
+ "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@ionic/utils-fs": "^3.1.7",
+ "@ionic/utils-terminal": "^2.3.4",
+ "bplist-parser": "^0.3.2",
+ "debug": "^4.3.4",
+ "elementtree": "^0.1.7",
+ "ini": "^4.1.1",
+ "plist": "^3.1.0",
+ "split2": "^4.2.0",
+ "through2": "^4.0.2",
+ "tslib": "^2.6.2",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "native-run": "bin/native-run"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/next": {
+ "version": "14.2.33",
+ "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz",
+ "integrity": "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "14.2.33",
+ "@swc/helpers": "0.5.5",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001579",
+ "graceful-fs": "^4.2.11",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.1"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=18.17.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "14.2.33",
+ "@next/swc-darwin-x64": "14.2.33",
+ "@next/swc-linux-arm64-gnu": "14.2.33",
+ "@next/swc-linux-arm64-musl": "14.2.33",
+ "@next/swc-linux-x64-gnu": "14.2.33",
+ "@next/swc-linux-x64-musl": "14.2.33",
+ "@next/swc-win32-arm64-msvc": "14.2.33",
+ "@next/swc-win32-ia32-msvc": "14.2.33",
+ "@next/swc-win32-x64-msvc": "14.2.33"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.41.2",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.25",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz",
+ "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prompts/node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+ "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^11.0.0",
+ "package-json-from-dist": "^1.0.0"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz",
+ "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.3.1",
+ "jackspeak": "^4.1.1",
+ "minimatch": "^10.0.3",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/jackspeak": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz",
+ "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/lru-cache": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
+ "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/rimraf/node_modules/minimatch": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz",
+ "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==",
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/brace-expansion": "^5.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/path-scurry": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
+ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/sax": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz",
+ "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==",
+ "license": "ISC"
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.18",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz",
+ "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.7",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "3"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "license": "MIT"
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/xml2js": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
+ "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
+ "license": "MIT",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xml2js/node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..6397091
--- /dev/null
+++ b/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "67calc",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "@capacitor/cli": "^7.4.3",
+ "@capacitor/core": "^7.4.3",
+ "@capacitor/ios": "^7.4.3",
+ "next": "^14.0.4",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/node": "^20.10.5",
+ "@types/react": "^18.2.45",
+ "@types/react-dom": "^18.2.18",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.32",
+ "tailwindcss": "^3.3.6",
+ "typescript": "^5.3.3"
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..33ad091
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/public/67calc.tar.gz b/public/67calc.tar.gz
new file mode 100644
index 0000000..5bc0427
Binary files /dev/null and b/public/67calc.tar.gz differ
diff --git a/public/celebration.mp3 b/public/celebration.mp3
new file mode 100644
index 0000000..79bc955
Binary files /dev/null and b/public/celebration.mp3 differ
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000..9ba9e64
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
+<rect width="32" height="32" rx="6" fill="#10b981"/>
+<text x="50%" y="55%" text-anchor="middle" dominant-baseline="middle" font-size="20" font-family="Apple Color Emoji, Segoe UI Emoji, sans-serif" fill="white">C</text>
+</svg>
\ No newline at end of file
diff --git a/public/icon-192.png b/public/icon-192.png
new file mode 100644
index 0000000..3b630c2
--- /dev/null
+++ b/public/icon-192.png
@@ -0,0 +1,5 @@
+<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg">
+ <rect width="512" height="512" fill="#9333ea" rx="100"/>
+ <text x="256" y="340" font-family="Arial, sans-serif" font-size="200" font-weight="bold" fill="white" text-anchor="middle">67</text>
+ <text x="256" y="150" font-family="Arial, sans-serif" font-size="80" fill="white" text-anchor="middle">🧮</text>
+</svg>
diff --git a/public/icon-512.png b/public/icon-512.png
new file mode 100644
index 0000000..3b630c2
--- /dev/null
+++ b/public/icon-512.png
@@ -0,0 +1,5 @@
+<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg">
+ <rect width="512" height="512" fill="#9333ea" rx="100"/>
+ <text x="256" y="340" font-family="Arial, sans-serif" font-size="200" font-weight="bold" fill="white" text-anchor="middle">67</text>
+ <text x="256" y="150" font-family="Arial, sans-serif" font-size="80" fill="white" text-anchor="middle">🧮</text>
+</svg>
diff --git a/public/icon.svg b/public/icon.svg
new file mode 100644
index 0000000..3b630c2
--- /dev/null
+++ b/public/icon.svg
@@ -0,0 +1,5 @@
+<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg">
+ <rect width="512" height="512" fill="#9333ea" rx="100"/>
+ <text x="256" y="340" font-family="Arial, sans-serif" font-size="200" font-weight="bold" fill="white" text-anchor="middle">67</text>
+ <text x="256" y="150" font-family="Arial, sans-serif" font-size="80" fill="white" text-anchor="middle">🧮</text>
+</svg>
diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..65b934c
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,24 @@
+{
+ "name": "Boomer Calc",
+ "short_name": "Boomer Calc",
+ "description": "Simple, easy-to-read calculator with big numbers. Perfect for everyone!",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#9333ea",
+ "theme_color": "#9333ea",
+ "orientation": "portrait",
+ "icons": [
+ {
+ "src": "/icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "any maskable"
+ },
+ {
+ "src": "/icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "any maskable"
+ }
+ ]
+}
diff --git a/tailwind.config.ts b/tailwind.config.ts
new file mode 100644
index 0000000..e15a0f5
--- /dev/null
+++ b/tailwind.config.ts
@@ -0,0 +1,23 @@
+import type { Config } from 'tailwindcss'
+
+const config: Config = {
+ content: [
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
+ ],
+ theme: {
+ extend: {
+ animation: {
+ 'pulse-slow': 'pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite',
+ 'bounce-slow': 'bounce 2s infinite',
+ },
+ spacing: {
+ 'safe': 'env(safe-area-inset-top)',
+ 'safe-bottom': 'env(safe-area-inset-bottom)',
+ },
+ },
+ },
+ plugins: [],
+}
+export default config
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..e784dc9
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,40 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "paths": {
+ "@/*": [
+ "./*"
+ ]
+ },
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/vercel.json b/vercel.json
new file mode 100644
index 0000000..7a45728
--- /dev/null
+++ b/vercel.json
@@ -0,0 +1,7 @@
+{
+ "buildCommand": "npm run build",
+ "devCommand": "npm run dev",
+ "installCommand": "npm install",
+ "framework": "nextjs",
+ "outputDirectory": ".next"
+}
(oldest)
·
back to Calc 67
·
tighten .gitignore: add missing standing-rule patterns (tmp/ 6648c94 →