diff --git a/.github/workflows/update-landing-page.yml b/.github/workflows/update-landing-page.yml new file mode 100644 index 0000000..7783efb --- /dev/null +++ b/.github/workflows/update-landing-page.yml @@ -0,0 +1,97 @@ +name: Update Landing Page + +on: + release: + types: [published] + workflow_dispatch: # Manual trigger for testing/emergency updates + +permissions: + contents: write + +jobs: + update-version: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: main + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract version from tag + id: version + run: | + # Extract version from git tag (removes 'v' prefix) + VERSION="${GITHUB_REF#refs/tags/v}" + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "Extracted version: ${VERSION}" + + - name: Update download.js + run: | + VERSION="${{ steps.version.outputs.version }}" + echo "Updating download.js to version ${VERSION}..." + + # Update CURRENT_VERSION constant in download.js + sed -i "s/const CURRENT_VERSION = '[^']*'/const CURRENT_VERSION = '${VERSION}'/" docs/download.js + + # Verify the change + grep "CURRENT_VERSION" docs/download.js + + - name: Update index.html + run: | + VERSION="${{ steps.version.outputs.version }}" + echo "Updating index.html to version ${VERSION}..." + + # Update all version references (e.g., v0.0.37 -> v0.0.38) + # This handles version badges, links, and download URLs + sed -i "s/v[0-9]\+\.[0-9]\+\.[0-9]\+/v${VERSION}/g" docs/index.html + + # Verify changes + echo "Updated version references:" + grep -n "v${VERSION}" docs/index.html | head -5 + + - name: Verify changes + run: | + echo "=== Git status ===" + git status + + echo "=== Changed files ===" + git diff --name-only + + echo "=== Version in download.js ===" + grep "CURRENT_VERSION" docs/download.js + + echo "=== Version badge in index.html ===" + grep -A2 "Latest:" docs/index.html | head -3 + + - name: Commit and push changes + run: | + VERSION="${{ steps.version.outputs.version }}" + + # Configure git + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # Stage changes + git add docs/download.js docs/index.html + + # Commit (skip if no changes) + git commit -m "Update landing page to v${VERSION}" || { + echo "No changes to commit" + exit 0 + } + + # Push to main + git push origin main + + - name: Summary + run: | + VERSION="${{ steps.version.outputs.version }}" + echo "✅ Landing page updated to v${VERSION}" + echo "📦 Changes committed and pushed to main branch" + echo "🌐 Live at: https://familiar-software.github.io/familiar/" + echo "" + echo "Updated files:" + echo " - docs/download.js" + echo " - docs/index.html" diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..28ba355 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,83 @@ +# Familiar Landing Page + +This folder contains the GitHub Pages landing page for Familiar. + +## Overview + +The landing page provides: +- Auto-detected architecture downloads (Apple Silicon vs Intel) +- Feature highlights and benefits +- How-it-works guide with screenshots +- System requirements +- FAQ section +- Automatic version updates via GitHub Actions + +## Structure + +``` +docs/ +├── index.html # Main landing page +├── input.css # Tailwind source +├── styles.css # Compiled Tailwind CSS (generated) +├── download.js # Architecture detection logic +├── assets/ +│ ├── familiar-icon.png # App icon +│ ├── familiar-settings.png # Settings screenshot +│ └── og-image.png # Social preview (1200x630) +└── README.md # This file +``` + +## Development + +**Build CSS:** +```bash +npm run css:landing +``` + +**Watch mode (auto-rebuild on changes):** +```bash +npm run css:landing:watch +``` + +**Preview locally:** +Open `docs/index.html` in a browser. + +## Deployment + +The landing page is automatically deployed via GitHub Pages from the `docs/` folder on the `main` branch. + +**Live URL:** https://familiar-software.github.io/familiar/ + +## Version Updates + +Version numbers are automatically updated by `.github/workflows/update-landing-page.yml` when a new release is published. + +The workflow updates: +- `docs/download.js` - CURRENT_VERSION constant +- `docs/index.html` - Version badges and links + +## Architecture Detection + +The page uses JavaScript to detect the user's Mac architecture (Apple Silicon vs Intel) and presents the correct download automatically. + +**Fallbacks:** +- Non-Mac users see a "macOS only" message +- JavaScript-disabled users see both download options +- Users can always access the alternative download via "Need a different version?" + +## Assets + +**Required images:** +- `familiar-icon.png` - Copied from `src/icon.png` +- `familiar-settings.png` - Copied from `docs/readme/familiar-settings.png` +- `og-image.png` - Create a 1200x630px social preview image + +To update assets, modify the originals and run: +```bash +cp src/icon.png docs/assets/familiar-icon.png +cp docs/readme/familiar-settings.png docs/assets/familiar-settings.png +``` + +## License + +GPL-3.0-only (same as the main project) diff --git a/docs/assets/familiar-icon.png b/docs/assets/familiar-icon.png new file mode 100644 index 0000000..7924ca6 Binary files /dev/null and b/docs/assets/familiar-icon.png differ diff --git a/docs/assets/familiar-settings.png b/docs/assets/familiar-settings.png new file mode 100644 index 0000000..58df0f0 Binary files /dev/null and b/docs/assets/familiar-settings.png differ diff --git a/docs/assets/og-image.txt b/docs/assets/og-image.txt new file mode 100644 index 0000000..7b1ae46 --- /dev/null +++ b/docs/assets/og-image.txt @@ -0,0 +1 @@ +TODO: Create a 1200x630px Open Graph image for social media previews diff --git a/docs/download.js b/docs/download.js new file mode 100644 index 0000000..1c3773f --- /dev/null +++ b/docs/download.js @@ -0,0 +1,155 @@ +// Architecture detection and download link generation for Familiar +const GITHUB_REPO = 'familiar-software/familiar'; +const CURRENT_VERSION = '0.0.37'; // Auto-updated by CI + +/** + * Detect macOS architecture (Apple Silicon vs Intel) + * @returns {'arm64'|'x64'} Detected architecture + */ +function detectArchitecture() { + const ua = navigator.userAgent; + + // Check if we're on macOS + if (!ua.includes('Mac')) { + return null; // Not a Mac + } + + // Modern API (Chromium-based browsers) + // Note: This API is still experimental and may not be available + if (navigator.userAgentData?.platform === 'macOS') { + // Default to Apple Silicon (most common in 2026) + return 'arm64'; + } + + // Heuristic: Check for Intel indicators in user agent + if (ua.includes('Intel')) { + return 'x64'; + } + + // Check for explicit ARM/Apple Silicon indicators + if (ua.includes('ARM') || ua.includes('Apple')) { + return 'arm64'; + } + + // Default: arm64 (70%+ of Macs are M-series by 2026) + // This is a safe default as M1 was released in 2020 + return 'arm64'; +} + +/** + * Check if user is on macOS + * @returns {boolean} + */ +function isMacOS() { + return navigator.userAgent.includes('Mac'); +} + +/** + * Generate download links for a specific version and architecture + * @param {string} version - Version number (e.g., '0.0.37') + * @param {'arm64'|'x64'} arch - Architecture + * @returns {{dmg: string, zip: string}} Download URLs + */ +function getDownloadLinks(version, arch) { + const base = `https://github.com/${GITHUB_REPO}/releases/download/v${version}`; + return { + dmg: `${base}/Familiar-${version}-${arch}.dmg`, + zip: `${base}/Familiar-${version}-${arch}-mac.zip`, + }; +} + +/** + * Get human-readable architecture name + * @param {'arm64'|'x64'} arch + * @returns {string} + */ +function getArchitectureName(arch) { + return arch === 'arm64' ? 'Apple Silicon (M1/M2/M3/M4)' : 'Intel'; +} + +/** + * Initialize download page - detect architecture and update UI + */ +function initializeDownloadPage() { + // Check if user is on macOS + if (!isMacOS()) { + showNonMacWarning(); + return; + } + + // Detect architecture + const arch = detectArchitecture(); + const altArch = arch === 'arm64' ? 'x64' : 'arm64'; + + // Update detected architecture text + const detectedArchEl = document.getElementById('detected-arch'); + if (detectedArchEl) { + detectedArchEl.textContent = getArchitectureName(arch); + } + + // Set primary download button + const primaryBtn = document.getElementById('download-primary'); + if (primaryBtn) { + const primaryLinks = getDownloadLinks(CURRENT_VERSION, arch); + primaryBtn.href = primaryLinks.dmg; + + // Update button text to show architecture + const btnText = primaryBtn.querySelector('span'); + if (btnText) { + btnText.textContent = `Download for ${getArchitectureName(arch)}`; + } + } + + // Set alternative download link + const altLink = document.getElementById('download-alt'); + if (altLink) { + const altLinks = getDownloadLinks(CURRENT_VERSION, altArch); + altLink.href = altLinks.dmg; + } + + // Set alternative architecture name + const altArchName = document.getElementById('alt-arch-name'); + if (altArchName) { + altArchName.textContent = getArchitectureName(altArch); + } +} + +/** + * Show warning for non-Mac users + */ +function showNonMacWarning() { + const detectedArchEl = document.getElementById('detected-arch'); + if (detectedArchEl) { + detectedArchEl.textContent = 'Not macOS'; + detectedArchEl.classList.add('text-red-600', 'dark:text-red-400'); + } + + const primaryBtn = document.getElementById('download-primary'); + if (primaryBtn) { + primaryBtn.disabled = true; + primaryBtn.classList.remove('bg-indigo-600', 'hover:bg-indigo-700'); + primaryBtn.classList.add('bg-zinc-400', 'cursor-not-allowed'); + + const btnText = primaryBtn.querySelector('span'); + if (btnText) { + btnText.textContent = 'macOS Only'; + } + + // Show helpful message + const parentEl = primaryBtn.parentElement; + if (parentEl) { + const warningMsg = document.createElement('p'); + warningMsg.className = 'text-sm text-red-600 dark:text-red-400 mt-2'; + warningMsg.textContent = 'Familiar is currently only available for macOS 14.0 or later.'; + parentEl.appendChild(warningMsg); + } + } +} + +// Initialize when DOM is ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeDownloadPage); +} else { + // DOM already loaded + initializeDownloadPage(); +} diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..f28e7b0 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + + + + + + + Familiar - AI Context for macOS + + + + + + +
+
+
+ Familiar +

+ Keep your AI current with
what matters in your work +

+

+ Local-first macOS menu bar app that captures your screen and extracts context for AI assistants. +

+ + + + + +
+ + +

+ Detected: Checking... +

+ + +
+ + Need a different version? + +
+

+ Download for Intel: +

+ + + + + Download DMG + +
+
+ +

+ + View all releases + +

+
+ + + +
+
+
+ + +
+
+

Why Familiar?

+
+ + +
+
+ + + +
+

Local-First Security

+

+ Your data never leaves your Mac. All processing happens locally using Apple's Vision framework. No cloud uploads, no third-party servers. +

+
+ + +
+
+ + + +
+

Compounding Context

+

+ Automatically captures screenshots and extracts text to markdown. Your AI assistant gets smarter over time as context accumulates. +

+
+ + +
+
+ + + +
+

AI-Ready

+

+ Works with Claude, ChatGPT, and any AI that accepts markdown context. Export your work context instantly to any LLM. +

+
+ + +
+
+ + + +
+

Zero Configuration

+

+ No API keys required. Works with local OCR out of the box. Optional LLM provider integration for enhanced features. +

+
+ +
+
+
+ + +
+
+

How It Works

+ +
+ +
+
+ 1 +
+
+

Download and Install

+

+ Download the DMG file, open it, and drag Familiar to your Applications folder. Launch it from your Applications folder or Spotlight. +

+
+
+ + +
+
+ 2 +
+
+

Grant Screen Recording Permission

+

+ macOS will prompt you to grant Screen Recording permission. This allows Familiar to capture screenshots for context extraction. +

+ Settings Screenshot +
+
+ + +
+
+ 3 +
+
+

Choose Context Folder

+

+ Select a folder where Familiar will store captured screenshots and extracted markdown. This can be your project folder, Documents, or anywhere you prefer. +

+
+
+
+
+
+ + +
+
+

System Requirements

+ +
+
    +
  • + + + +
    + macOS 14.0 or later +

    Sonoma, Sequoia, or newer required for Apple Vision OCR

    +
    +
  • +
  • + + + +
    + Apple Silicon (M1/M2/M3/M4) or Intel +

    Separate builds optimized for each architecture

    +
    +
  • +
  • + + + +
    + Screen Recording permission +

    Required to capture screenshots

    +
    +
  • +
  • + + + +
    + ~50MB for app + storage for context +

    Context typically 10-100MB per day depending on usage

    +
    +
  • +
+
+
+
+ + +
+
+

Frequently Asked Questions

+ +
+ +
+ + Is my data safe? + + + + +

+ Yes. Familiar follows a strict local-first security model. All data stays on your Mac. Screenshots and extracted text are stored locally in your chosen folder. The app has the same security profile as taking screenshots yourself - no cloud uploads, no third-party servers. +

+
+ + +
+ + Which Mac do I have? + + + + +
+

To check your Mac architecture:

+
    +
  1. Click the Apple menu () in the top-left corner
  2. +
  3. Select "About This Mac"
  4. +
  5. Look for "Chip" or "Processor"
  6. +
+

+ Apple Silicon: M1, M2, M3, M4, or any M-series chip
+ Intel: Core i5, Core i7, Core i9, or mentions "Intel" +

+
+
+ + +
+ + Will this slow down my Mac? + + + + +

+ No. Familiar is designed for minimal resource usage. It runs quietly in the menu bar and only captures screenshots at intervals you configure. OCR processing uses Apple's native Vision framework, which is highly optimized. Most users won't notice any performance impact. +

+
+ + +
+ + Can I use this with my AI provider? + + + + +

+ Yes. Familiar exports context as markdown files, which work with any AI assistant including Claude, ChatGPT, Gemini, and others. You can copy/paste markdown, use it with Claude Projects, or integrate via API. Optional LLM provider settings let you enhance the experience with automatic context injection. +

+
+ + +
+ + How much storage will this use? + + + + +

+ The app itself is about 50MB. Context storage depends on your usage. A typical day might generate 10-100MB of screenshots and markdown. You can configure capture intervals and cleanup policies to manage storage. Old screenshots can be safely deleted - the extracted markdown is what matters. +

+
+
+
+
+ + + + + + + diff --git a/docs/input.css b/docs/input.css new file mode 100644 index 0000000..3441487 --- /dev/null +++ b/docs/input.css @@ -0,0 +1,42 @@ +@import "tailwindcss"; + +@theme { + --font-sans: "SF Pro Text", "Helvetica Neue", "Segoe UI", sans-serif; +} + +@layer base { + ::selection { + background-color: rgba(99, 102, 241, 0.2); + } + + /* Smooth scrolling */ + html { + scroll-behavior: smooth; + } + + /* Dark mode transitions */ + * { + transition-property: background-color, border-color, color; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; + } +} + +@layer components { + /* Details/Summary styling */ + details > summary { + list-style: none; + } + + details > summary::-webkit-details-marker { + display: none; + } + + /* Focus states for accessibility */ + a:focus-visible, + button:focus-visible, + details:focus-visible { + outline: 2px solid #6366f1; + outline-offset: 2px; + } +} diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 0000000..ea5a2cc --- /dev/null +++ b/docs/styles.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:"SF Pro Text","Helvetica Neue","Segoe UI",sans-serif;--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-900:oklch(39.6% .141 25.723);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-600:oklch(62.7% .194 149.214);--color-green-900:oklch(39.3% .095 152.535);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-900:oklch(37.8% .077 168.94);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-900:oklch(35.9% .144 278.697);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-900:oklch(38.1% .176 304.987);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}::selection{background-color:#6366f133}html{scroll-behavior:smooth}*{transition-property:background-color,border-color,color;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}@layer components{details>summary{list-style:none}details>summary::-webkit-details-marker{display:none}a:focus-visible,button:focus-visible,details:focus-visible{outline-offset:2px;outline:2px solid #6366f1}}@layer utilities{.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.top-2\.5{top:calc(var(--spacing)*2.5)}.right-0{right:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.left-0\.5{left:calc(var(--spacing)*.5)}.left-3{left:calc(var(--spacing)*3)}.z-10{z-index:10}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-0\.5{height:calc(var(--spacing)*.5)}.h-2{height:calc(var(--spacing)*2)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-12{height:calc(var(--spacing)*12)}.h-24{height:calc(var(--spacing)*24)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.w-0{width:calc(var(--spacing)*0)}.w-2{width:calc(var(--spacing)*2)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-24{width:calc(var(--spacing)*24)}.w-\[190px\]{width:190px}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[60\%\]{max-width:60%}.max-w-\[320px\]{max-width:320px}.max-w-\[360px\]{max-width:360px}.max-w-\[420px\]{max-width:420px}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[280px\]{min-width:280px}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*12)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*12)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-emerald-100{border-color:var(--color-emerald-100)}.border-emerald-600{border-color:var(--color-emerald-600)}.border-indigo-100{border-color:var(--color-indigo-100)}.border-indigo-300{border-color:var(--color-indigo-300)}.border-indigo-600{border-color:var(--color-indigo-600)}.border-red-100{border-color:var(--color-red-100)}.border-transparent{border-color:#0000}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.\!bg-amber-500{background-color:var(--color-amber-500)!important}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-green-100{background-color:var(--color-green-100)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-50\/70{background-color:#fafafab3}@supports (color:color-mix(in lab, red, red)){.bg-zinc-50\/70{background-color:color-mix(in oklab,var(--color-zinc-50)70%,transparent)}}.bg-zinc-50\/90{background-color:#fafafae6}@supports (color:color-mix(in lab, red, red)){.bg-zinc-50\/90{background-color:color-mix(in oklab,var(--color-zinc-50)90%,transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-600{background-color:var(--color-zinc-600)}.object-cover{object-fit:cover}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-12{padding-block:calc(var(--spacing)*12)}.py-20{padding-block:calc(var(--spacing)*20)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-3{padding-right:calc(var(--spacing)*3)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre-line{white-space:pre-line}.text-amber-600{color:var(--color-amber-600)}.text-amber-900{color:var(--color-amber-900)}.text-blue-600{color:var(--color-blue-600)}.text-emerald-600{color:var(--color-emerald-600)}.text-green-600{color:var(--color-green-600)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-purple-600{color:var(--color-purple-600)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-zinc-400::placeholder{color:var(--color-zinc-400)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-indigo-200{--tw-shadow-color:oklch(87% .065 274.039)}@supports (color:color-mix(in lab, red, red)){.shadow-indigo-200{--tw-shadow-color:color-mix(in oklab,var(--color-indigo-200)var(--tw-shadow-alpha),transparent)}}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.peer-checked\:translate-x-5:is(:where(.peer):checked~*){--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.peer-checked\:bg-emerald-500:is(:where(.peer):checked~*){background-color:var(--color-emerald-500)}@media (hover:hover){.hover\:border-emerald-700:hover{border-color:var(--color-emerald-700)}.hover\:border-indigo-700:hover{border-color:var(--color-indigo-700)}.hover\:border-zinc-200:hover{border-color:var(--color-zinc-200)}.hover\:bg-emerald-700:hover{background-color:var(--color-emerald-700)}.hover\:bg-indigo-50:hover{background-color:var(--color-indigo-50)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}.hover\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.hover\:text-emerald-700:hover{color:var(--color-emerald-700)}.hover\:text-indigo-600:hover{color:var(--color-indigo-600)}.hover\:text-indigo-700:hover{color:var(--color-indigo-700)}.hover\:text-zinc-700:hover{color:var(--color-zinc-700)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-indigo-500\/20:hover{--tw-shadow-color:#625fff33}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-indigo-500\/20:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-indigo-500)20%,transparent)var(--tw-shadow-alpha),transparent)}}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:translate-y-px:active{--tw-translate-y:1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:flex-row{flex-direction:row}.sm\:py-32{padding-block:calc(var(--spacing)*32)}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}}@media (prefers-color-scheme:dark){.dark\:border-amber-800{border-color:var(--color-amber-800)}.dark\:border-amber-900\/40{border-color:#7b330666}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-900\/40{border-color:color-mix(in oklab,var(--color-amber-900)40%,transparent)}}.dark\:border-emerald-900\/40{border-color:#004e3b66}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-900\/40{border-color:color-mix(in oklab,var(--color-emerald-900)40%,transparent)}}.dark\:border-indigo-700{border-color:var(--color-indigo-700)}.dark\:border-indigo-900\/40{border-color:#312c8566}@supports (color:color-mix(in lab, red, red)){.dark\:border-indigo-900\/40{border-color:color-mix(in oklab,var(--color-indigo-900)40%,transparent)}}.dark\:border-red-900\/40{border-color:#82181a66}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-900\/40{border-color:color-mix(in oklab,var(--color-red-900)40%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:border-zinc-800\/40{border-color:#27272a66}@supports (color:color-mix(in lab, red, red)){.dark\:border-zinc-800\/40{border-color:color-mix(in oklab,var(--color-zinc-800)40%,transparent)}}.dark\:border-zinc-800\/50{border-color:#27272a80}@supports (color:color-mix(in lab, red, red)){.dark\:border-zinc-800\/50{border-color:color-mix(in oklab,var(--color-zinc-800)50%,transparent)}}.dark\:bg-\[\#111\]{background-color:#111}.dark\:bg-\[\#18181b\]{background-color:#18181b}.dark\:bg-amber-900\/20{background-color:#7b330633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/20{background-color:color-mix(in oklab,var(--color-amber-900)20%,transparent)}}.dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark\:bg-emerald-900\/20{background-color:#004e3b33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-900\/20{background-color:color-mix(in oklab,var(--color-emerald-900)20%,transparent)}}.dark\:bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900)30%,transparent)}}.dark\:bg-indigo-900\/20{background-color:#312c8533}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-900\/20{background-color:color-mix(in oklab,var(--color-indigo-900)20%,transparent)}}.dark\:bg-indigo-900\/30{background-color:#312c854d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-900\/30{background-color:color-mix(in oklab,var(--color-indigo-900)30%,transparent)}}.dark\:bg-purple-900\/30{background-color:#59168b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-900\/30{background-color:color-mix(in oklab,var(--color-purple-900)30%,transparent)}}.dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-900\/60{background-color:#18181b99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-900\/60{background-color:color-mix(in oklab,var(--color-zinc-900)60%,transparent)}}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:text-amber-200{color:var(--color-amber-200)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-indigo-300{color:var(--color-indigo-300)}.dark\:text-indigo-400{color:var(--color-indigo-400)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-white{color:var(--color-white)}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-200{color:var(--color-zinc-200)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-500{color:var(--color-zinc-500)}.dark\:text-zinc-600{color:var(--color-zinc-600)}.dark\:placeholder-zinc-500::placeholder{color:var(--color-zinc-500)}.dark\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (hover:hover){.dark\:hover\:border-zinc-700:hover{border-color:var(--color-zinc-700)}.dark\:hover\:bg-indigo-900\/30:hover{background-color:#312c854d}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-indigo-900\/30:hover{background-color:color-mix(in oklab,var(--color-indigo-900)30%,transparent)}}.dark\:hover\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.dark\:hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.dark\:hover\:text-indigo-400:hover{color:var(--color-indigo-400)}.dark\:hover\:text-zinc-200:hover{color:var(--color-zinc-200)}.dark\:hover\:text-zinc-300:hover{color:var(--color-zinc-300)}}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0} \ No newline at end of file diff --git a/package.json b/package.json index f768831..585e561 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "dist:mac:x64": "npm run clean && npm run build:apple-vision-ocr && npm run css:build && electron-builder --mac --x64", "css": "tailwindcss -i ./src/dashboard/input.css -o ./src/dashboard/styles.css --watch", "css:build": "tailwindcss -i ./src/dashboard/input.css -o ./src/dashboard/styles.css --minify", + "css:landing": "tailwindcss -c tailwind.config.landing.js -i docs/input.css -o docs/styles.css --minify", + "css:landing:watch": "tailwindcss -c tailwind.config.landing.js -i docs/input.css -o docs/styles.css --watch", "start": "npm run rebuild:electron && npm run css:build && electron .", "predev": "npm run build:apple-vision-ocr", "dev": "npm run rebuild:electron && tailwindcss -i ./src/dashboard/input.css -o ./src/dashboard/styles.css --watch & electron .", diff --git a/tailwind.config.landing.js b/tailwind.config.landing.js new file mode 100644 index 0000000..174db50 --- /dev/null +++ b/tailwind.config.landing.js @@ -0,0 +1,20 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./docs/**/*.html', './docs/**/*.js'], + theme: { + extend: { + fontFamily: { + sans: ['"SF Pro Text"', '"Helvetica Neue"', '"Segoe UI"', 'sans-serif'], + }, + colors: { + // Match Familiar's brand colors + indigo: { + 400: '#818cf8', + 500: '#6366f1', + 600: '#4f46e5', + 700: '#4338ca', + }, + }, + }, + }, +};