Major update to chorus.services platform

- Extensive updates to system configuration and deployment
- Enhanced documentation and architecture improvements
- Updated dependencies and build configurations
- Improved service integrations and workflows

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
tony
2025-09-17 22:01:07 +10:00
parent 074a82bfb6
commit 2e1bb2e55e
4018 changed files with 7539 additions and 38906 deletions

1
modules/blog Submodule

Submodule modules/blog added at 796924499d

View File

@@ -0,0 +1,52 @@
FROM node:18-alpine AS base
# Install dependencies only when needed
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
# Install dependencies based on the preferred package manager
COPY package.json package-lock.json ./
RUN npm ci
# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Build application
RUN npm run build
# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
# Install curl for health check before switching users
RUN apk add --no-cache curl
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next
# Automatically leverage output traces to reduce image size
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3002
ENV PORT=3002
ENV HOSTNAME="0.0.0.0"
# Removed health check as it was causing container restarts
CMD ["node", "server.js"]

View File

@@ -0,0 +1,63 @@
import { NextRequest, NextResponse } from 'next/server'
import { pool, Lead } from '@/lib/db'
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url)
const page = parseInt(searchParams.get('page') || '1')
const limit = parseInt(searchParams.get('limit') || '50')
const sortBy = searchParams.get('sortBy') || 'created_at'
const sortOrder = searchParams.get('sortOrder') || 'DESC'
const search = searchParams.get('search') || ''
const offset = (page - 1) * limit
let whereClause = ''
let queryParams: any[] = [limit, offset]
if (search) {
whereClause = `WHERE (first_name ILIKE $3 OR last_name ILIKE $3 OR email ILIKE $3 OR company_name ILIKE $3)`
queryParams.push(`%${search}%`)
}
const validSortColumns = ['created_at', 'first_name', 'last_name', 'email', 'company_name', 'lead_source']
const sortColumn = validSortColumns.includes(sortBy) ? sortBy : 'created_at'
const order = sortOrder.toUpperCase() === 'ASC' ? 'ASC' : 'DESC'
const leadsQuery = `
SELECT * FROM leads
${whereClause}
ORDER BY ${sortColumn} ${order}
LIMIT $1 OFFSET $2
`
const countQuery = `SELECT COUNT(*) as total FROM leads ${whereClause}`
const [leadsResult, countResult] = await Promise.all([
pool.query(leadsQuery, queryParams),
pool.query(countQuery, search ? [`%${search}%`] : [])
])
const leads: Lead[] = leadsResult.rows
const total = parseInt(countResult.rows[0].total)
const totalPages = Math.ceil(total / limit)
return NextResponse.json({
leads,
pagination: {
page,
limit,
total,
totalPages,
hasNext: page < totalPages,
hasPrev: page > 1
}
})
} catch (error) {
console.error('Error fetching leads:', error)
return NextResponse.json(
{ error: 'Failed to fetch leads' },
{ status: 500 }
)
}
}

View File

@@ -0,0 +1,64 @@
import { NextResponse } from 'next/server'
import { pool, LeadStats } from '@/lib/db'
export async function GET() {
try {
const queries = [
// Total leads
'SELECT COUNT(*) as count FROM leads',
// Leads today
'SELECT COUNT(*) as count FROM leads WHERE created_at >= CURRENT_DATE',
// Leads this week
'SELECT COUNT(*) as count FROM leads WHERE created_at >= date_trunc(\'week\', CURRENT_DATE)',
// Leads this month
'SELECT COUNT(*) as count FROM leads WHERE created_at >= date_trunc(\'month\', CURRENT_DATE)',
// By source
'SELECT lead_source, COUNT(*) as count FROM leads GROUP BY lead_source ORDER BY count DESC',
// By date (last 30 days)
`SELECT
DATE(created_at) as date,
COUNT(*) as count
FROM leads
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY DATE(created_at)
ORDER BY date DESC`
]
const [
totalResult,
todayResult,
weekResult,
monthResult,
sourceResult,
dateResult
] = await Promise.all(queries.map(query => pool.query(query)))
const stats: LeadStats = {
total_leads: parseInt(totalResult.rows[0].count),
leads_today: parseInt(todayResult.rows[0].count),
leads_this_week: parseInt(weekResult.rows[0].count),
leads_this_month: parseInt(monthResult.rows[0].count),
by_source: sourceResult.rows.map(row => ({
lead_source: row.lead_source,
count: parseInt(row.count)
})),
by_date: dateResult.rows.map(row => ({
date: row.date,
count: parseInt(row.count)
}))
}
return NextResponse.json(stats)
} catch (error) {
console.error('Error fetching stats:', error)
return NextResponse.json(
{ error: 'Failed to fetch statistics' },
{ status: 500 }
)
}
}

View File

@@ -0,0 +1,39 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {
.btn-primary {
@apply bg-mulberry-600 hover:bg-mulberry-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transition-all duration-300 ease-out hover:scale-105 active:scale-95;
}
.btn-secondary {
@apply border-2 border-mulberry-600 text-mulberry-600 hover:bg-mulberry-600 hover:text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transition-all duration-300 ease-out hover:scale-105 active:scale-95;
}
.btn-danger {
@apply bg-coral-600 hover:bg-coral-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transition-all duration-300 ease-out hover:scale-105 active:scale-95;
}
.table-cell {
@apply px-chorus-lg py-chorus-md text-sm border-b border-sand-200 dark:border-carbon-700 text-carbon-900 dark:text-carbon-100;
}
.table-header {
@apply px-chorus-lg py-chorus-lg text-xs font-semibold uppercase tracking-wide text-carbon-700 dark:text-carbon-300 bg-sand-100 dark:bg-carbon-800 border-b border-sand-300 dark:border-carbon-600;
}
/* Enhanced card styling for light mode branding */
.dashboard-card {
@apply bg-white dark:bg-carbon-900 rounded-lg shadow-lg border border-sand-200 dark:border-carbon-700 backdrop-blur-sm;
}
/* Branded gradients */
.gradient-primary {
@apply bg-gradient-to-r from-mulberry-500 to-mulberry-700;
}
.gradient-accent {
@apply bg-gradient-to-r from-ocean-500 to-eucalyptus-500;
}
}

View File

@@ -0,0 +1,36 @@
import type { Metadata } from 'next'
import { Inter, Exo } from 'next/font/google'
import './globals.css'
const inter = Inter({
subsets: ['latin'],
variable: '--font-inter',
display: 'swap',
weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'],
})
const exo = Exo({
subsets: ['latin'],
variable: '--font-exo',
display: 'swap',
weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'],
})
export const metadata: Metadata = {
title: 'CHORUS Dashboard',
description: 'Lead management dashboard for CHORUS Services',
}
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en" className={`${inter.variable} ${exo.variable}`}>
<body className="font-sans antialiased bg-white dark:bg-carbon-950 text-carbon-950 dark:text-white">
{children}
</body>
</html>
)
}

View File

@@ -0,0 +1,135 @@
'use client'
import { useState, useEffect } from 'react'
import { LeadStats, Lead } from '@/lib/db'
import StatsCards from '@/components/StatsCards'
import LeadsTable from '@/components/LeadsTable'
import ThemeToggle from '@/components/ThemeToggle'
import LeadsChart from '@/components/LeadsChart'
export default function DashboardPage() {
const [stats, setStats] = useState<LeadStats | null>(null)
const [leadsData, setLeadsData] = useState<{ leads: Lead[], pagination: any } | null>(null)
const [loading, setLoading] = useState(true)
const [error, setError] = useState<string | null>(null)
useEffect(() => {
const fetchData = async () => {
try {
const [statsResponse, leadsResponse] = await Promise.all([
fetch('/api/stats'),
fetch('/api/leads')
])
if (!statsResponse.ok || !leadsResponse.ok) {
throw new Error('Failed to fetch data')
}
const statsData = await statsResponse.json()
const leadsData = await leadsResponse.json()
setStats(statsData)
setLeadsData(leadsData)
} catch (error) {
console.error('Failed to fetch dashboard data:', error)
setError('Failed to load dashboard data. Please try again.')
} finally {
setLoading(false)
}
}
fetchData()
}, [])
if (loading) {
return (
<main className="min-h-screen p-chorus-lg flex items-center justify-center">
<div className="text-center">
<div className="animate-spin rounded-full h-16 w-16 border-b-2 border-mulberry-600 mx-auto mb-4"></div>
<p className="text-lg text-carbon-600 dark:text-carbon-300">Loading dashboard...</p>
</div>
</main>
)
}
if (error) {
return (
<main className="min-h-screen p-chorus-lg flex items-center justify-center">
<div className="text-center">
<p className="text-lg text-coral-600 mb-4">{error}</p>
<button
onClick={() => window.location.reload()}
className="btn-primary px-chorus-lg py-chorus-md"
>
Retry
</button>
</div>
</main>
)
}
if (!stats || !leadsData) {
return (
<main className="min-h-screen p-chorus-lg flex items-center justify-center">
<p className="text-lg text-carbon-600 dark:text-carbon-300">No data available</p>
</main>
)
}
return (
<main className="min-h-screen p-chorus-lg bg-gradient-to-b from-white via-sand-50 to-sand-100 dark:from-carbon-950 dark:via-carbon-900 dark:to-carbon-950">
<div className="max-w-7xl mx-auto">
{/* Theme Toggle */}
<ThemeToggle />
{/* Header */}
<div className="mb-chorus-xxl">
<h1 className="text-h2 font-logo font-thin text-carbon-950 dark:text-white mb-chorus-md">
CHORUS Dashboard
</h1>
<p className="text-lg text-carbon-600 dark:text-carbon-300">
Lead management and analytics for CHORUS Services
</p>
</div>
{/* Stats Cards */}
<StatsCards stats={stats} />
{/* Lead Trends Chart */}
<LeadsChart stats={stats} />
{/* Source Breakdown */}
{stats.by_source.length > 0 && (
<div className="dashboard-card p-chorus-lg mb-chorus-xxl">
<h3 className="text-xl font-semibold text-carbon-900 dark:text-white mb-chorus-lg">
Lead Sources
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-chorus-md">
{stats.by_source.map((source) => (
<div
key={source.lead_source}
className="bg-sand-100 dark:bg-carbon-800 rounded-lg p-chorus-md border border-sand-200 dark:border-carbon-700 hover:shadow-md transition-shadow duration-200"
>
<div className="flex justify-between items-center">
<span className="text-sm font-medium text-carbon-700 dark:text-carbon-200">
{source.lead_source.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())}
</span>
<span className="text-lg font-bold text-carbon-900 dark:text-white">
{source.count}
</span>
</div>
</div>
))}
</div>
</div>
)}
{/* Leads Table */}
<LeadsTable
initialLeads={leadsData.leads}
initialPagination={leadsData.pagination}
/>
</div>
</main>
)
}

View File

@@ -0,0 +1,112 @@
'use client'
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'
import { LeadStats } from '@/lib/db'
interface LeadsChartProps {
stats: LeadStats
}
export default function LeadsChart({ stats }: LeadsChartProps) {
// Fill in missing dates with 0 values for the last 30 days
const fillMissingDates = (data: { date: string; count: number }[]) => {
const filledData = []
const today = new Date()
for (let i = 29; i >= 0; i--) {
const date = new Date(today)
date.setDate(date.getDate() - i)
const dateStr = date.toISOString().split('T')[0] // YYYY-MM-DD format
const existingData = data.find(d => d.date === dateStr)
filledData.push({
date: dateStr,
count: existingData ? existingData.count : 0,
formattedDate: date.toLocaleDateString('en-AU', {
month: 'short',
day: 'numeric'
})
})
}
return filledData
}
const chartData = fillMissingDates(stats.by_date)
return (
<div className="dashboard-card p-chorus-lg mb-chorus-xxl">
<h3 className="text-xl font-semibold text-carbon-900 dark:text-white mb-chorus-lg">
Lead Trends (Last 30 Days)
</h3>
<div className="h-80">
<ResponsiveContainer width="100%" height="100%">
<LineChart
data={chartData}
margin={{
top: 20,
right: 30,
left: 20,
bottom: 20,
}}
>
<CartesianGrid
strokeDasharray="3 3"
stroke="#e5e5e5"
className="opacity-30"
/>
<XAxis
dataKey="formattedDate"
stroke="#6b7280"
fontSize={12}
tick={{ fill: '#6b7280' }}
interval="preserveStartEnd"
/>
<YAxis
stroke="#6b7280"
fontSize={12}
tick={{ fill: '#6b7280' }}
allowDecimals={false}
/>
<Tooltip
contentStyle={{
backgroundColor: '#ffffff',
border: '1px solid #e5e7eb',
borderRadius: '8px',
boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1)',
}}
labelStyle={{ color: '#374151', fontWeight: 'bold' }}
itemStyle={{ color: '#8b5cf6' }}
formatter={(value: number) => [value, 'Leads']}
labelFormatter={(label: string) => `Date: ${label}`}
/>
<Line
type="monotone"
dataKey="count"
stroke="#8b5cf6"
strokeWidth={3}
dot={{
fill: '#8b5cf6',
strokeWidth: 2,
r: 4
}}
activeDot={{
r: 6,
stroke: '#8b5cf6',
strokeWidth: 2,
fill: '#ffffff'
}}
/>
</LineChart>
</ResponsiveContainer>
</div>
{chartData.length === 0 && (
<div className="flex items-center justify-center h-80 text-carbon-500 dark:text-carbon-400">
<p>No data available for the last 30 days</p>
</div>
)}
</div>
)
}

View File

@@ -0,0 +1,390 @@
'use client'
import { useState, useEffect } from 'react'
import { Search, ChevronLeft, ChevronRight, ArrowUpDown, Eye } from 'lucide-react'
import { Lead } from '@/lib/db'
interface LeadsTableProps {
initialLeads: Lead[]
initialPagination: any
}
export default function LeadsTable({ initialLeads, initialPagination }: LeadsTableProps) {
const [leads, setLeads] = useState<Lead[]>(initialLeads)
const [pagination, setPagination] = useState(initialPagination)
const [loading, setLoading] = useState(false)
const [search, setSearch] = useState('')
const [sortBy, setSortBy] = useState('created_at')
const [sortOrder, setSortOrder] = useState('DESC')
const [selectedLead, setSelectedLead] = useState<Lead | null>(null)
const fetchLeads = async (params: { page?: number; search?: string; sortBy?: string; sortOrder?: string } = {}) => {
setLoading(true)
try {
const searchParams = new URLSearchParams({
page: (params.page || pagination.page).toString(),
search: params.search ?? search,
sortBy: params.sortBy || sortBy,
sortOrder: params.sortOrder || sortOrder,
})
const response = await fetch(`/api/leads?${searchParams}`)
const data = await response.json()
setLeads(data.leads)
setPagination(data.pagination)
} catch (error) {
console.error('Failed to fetch leads:', error)
} finally {
setLoading(false)
}
}
const handleSort = (column: string) => {
const newOrder = sortBy === column && sortOrder === 'ASC' ? 'DESC' : 'ASC'
setSortBy(column)
setSortOrder(newOrder)
fetchLeads({ sortBy: column, sortOrder: newOrder })
}
const handleSearch = (e: React.FormEvent) => {
e.preventDefault()
fetchLeads({ page: 1, search })
}
const formatDate = (dateString: string) => {
return new Date(dateString).toLocaleDateString('en-AU', {
year: 'numeric',
month: 'short',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
})
}
return (
<div className="dashboard-card overflow-hidden">
{/* Header */}
<div className="p-chorus-lg border-b border-sand-200 dark:border-carbon-700">
<div className="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-chorus-md">
<h3 className="text-xl font-semibold text-carbon-900 dark:text-white">
Lead Management
</h3>
<form onSubmit={handleSearch} className="flex gap-chorus-sm">
<div className="relative">
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-carbon-400" />
<input
type="text"
placeholder="Search leads..."
value={search}
onChange={(e) => setSearch(e.target.value)}
className="pl-10 pr-4 py-2 border border-sand-300 dark:border-carbon-600 rounded-lg bg-white dark:bg-carbon-800 text-carbon-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-mulberry-500 focus:border-mulberry-500 shadow-sm"
/>
</div>
<button
type="submit"
className="btn-primary px-chorus-md py-2 text-sm"
>
Search
</button>
</form>
</div>
</div>
{/* Table */}
<div className="overflow-x-auto">
<table className="w-full">
<thead>
<tr className="bg-sand-100 dark:bg-carbon-800">
<th className="table-header">
<button
onClick={() => handleSort('created_at')}
className="flex items-center gap-1 hover:text-carbon-900 dark:hover:text-white"
>
Date <ArrowUpDown className="h-3 w-3" />
</button>
</th>
<th className="table-header">
<button
onClick={() => handleSort('first_name')}
className="flex items-center gap-1 hover:text-carbon-900 dark:hover:text-white"
>
Name <ArrowUpDown className="h-3 w-3" />
</button>
</th>
<th className="table-header">
<button
onClick={() => handleSort('email')}
className="flex items-center gap-1 hover:text-carbon-900 dark:hover:text-white"
>
Email <ArrowUpDown className="h-3 w-3" />
</button>
</th>
<th className="table-header">
<button
onClick={() => handleSort('company_name')}
className="flex items-center gap-1 hover:text-carbon-900 dark:hover:text-white"
>
Company <ArrowUpDown className="h-3 w-3" />
</button>
</th>
<th className="table-header">
<button
onClick={() => handleSort('lead_source')}
className="flex items-center gap-1 hover:text-carbon-900 dark:hover:text-white"
>
Source <ArrowUpDown className="h-3 w-3" />
</button>
</th>
<th className="table-header">Actions</th>
</tr>
</thead>
<tbody>
{loading ? (
<tr>
<td colSpan={6} className="table-cell text-center py-chorus-xxl">
Loading...
</td>
</tr>
) : leads.length === 0 ? (
<tr>
<td colSpan={6} className="table-cell text-center py-chorus-xxl text-carbon-500">
No leads found
</td>
</tr>
) : (
leads.map((lead) => (
<tr key={lead.id} className="hover:bg-sand-100 dark:hover:bg-carbon-800 transition-colors">
<td className="table-cell">
{formatDate(lead.created_at.toString())}
</td>
<td className="table-cell">
<div>
<div className="font-medium text-carbon-900 dark:text-white">
{lead.first_name} {lead.last_name}
</div>
{lead.company_role && (
<div className="text-xs text-carbon-500 dark:text-carbon-400">
{lead.company_role}
</div>
)}
</div>
</td>
<td className="table-cell">
<a
href={`mailto:${lead.email}`}
className="text-ocean-600 dark:text-ocean-400 hover:underline"
>
{lead.email}
</a>
</td>
<td className="table-cell">
{lead.company_name || '-'}
</td>
<td className="table-cell">
<span className={`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${
lead.lead_source === 'request_early_access'
? 'bg-mulberry-100 text-mulberry-800 dark:bg-mulberry-900 dark:text-mulberry-200'
: 'bg-ocean-100 text-ocean-800 dark:bg-ocean-900 dark:text-ocean-200'
}`}>
{lead.lead_source.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())}
</span>
</td>
<td className="table-cell">
<button
onClick={() => setSelectedLead(lead)}
className="text-carbon-600 dark:text-carbon-300 hover:text-carbon-900 dark:hover:text-white transition-colors"
>
<Eye className="h-4 w-4" />
</button>
</td>
</tr>
))
)}
</tbody>
</table>
</div>
{/* Pagination */}
<div className="p-chorus-lg border-t border-sand-200 dark:border-carbon-700">
<div className="flex items-center justify-between">
<div className="text-sm text-carbon-600 dark:text-carbon-300">
Showing {(pagination.page - 1) * pagination.limit + 1} to{' '}
{Math.min(pagination.page * pagination.limit, pagination.total)} of{' '}
{pagination.total} results
</div>
<div className="flex items-center gap-chorus-sm">
<button
onClick={() => fetchLeads({ page: pagination.page - 1 })}
disabled={!pagination.hasPrev || loading}
className="flex items-center gap-1 px-3 py-2 text-sm border border-sand-300 dark:border-carbon-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-sand-100 dark:hover:bg-carbon-800 transition-colors text-carbon-700 dark:text-carbon-200"
>
<ChevronLeft className="h-4 w-4" />
Previous
</button>
<span className="text-sm text-carbon-600 dark:text-carbon-300">
Page {pagination.page} of {pagination.totalPages}
</span>
<button
onClick={() => fetchLeads({ page: pagination.page + 1 })}
disabled={!pagination.hasNext || loading}
className="flex items-center gap-1 px-3 py-2 text-sm border border-sand-300 dark:border-carbon-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-sand-100 dark:hover:bg-carbon-800 transition-colors text-carbon-700 dark:text-carbon-200"
>
Next
<ChevronRight className="h-4 w-4" />
</button>
</div>
</div>
</div>
{/* Lead Detail Modal */}
{selectedLead && (
<div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-chorus-lg z-50">
<div className="bg-white dark:bg-carbon-900 rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto">
<div className="p-chorus-lg border-b border-sand-200 dark:border-carbon-700">
<div className="flex justify-between items-center">
<h3 className="text-xl font-semibold text-carbon-900 dark:text-white">
Lead Details
</h3>
<button
onClick={() => setSelectedLead(null)}
className="text-carbon-600 dark:text-carbon-300 hover:text-carbon-900 dark:hover:text-white"
>
</button>
</div>
</div>
<div className="p-chorus-lg space-y-chorus-md">
<div className="grid grid-cols-1 sm:grid-cols-2 gap-chorus-md">
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Name
</label>
<p className="text-carbon-900 dark:text-white">
{selectedLead.first_name} {selectedLead.last_name}
</p>
</div>
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Email
</label>
<p className="text-carbon-900 dark:text-white">
{selectedLead.email}
</p>
</div>
{selectedLead.company_name && (
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Company
</label>
<p className="text-carbon-900 dark:text-white">
{selectedLead.company_name}
</p>
</div>
)}
{selectedLead.company_role && (
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Role
</label>
<p className="text-carbon-900 dark:text-white">
{selectedLead.company_role}
</p>
</div>
)}
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Lead Source
</label>
<p className="text-carbon-900 dark:text-white">
{selectedLead.lead_source.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())}
</p>
</div>
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Date
</label>
<p className="text-carbon-900 dark:text-white">
{formatDate(selectedLead.created_at.toString())}
</p>
</div>
</div>
{selectedLead.inquiry_details && (
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Inquiry Details
</label>
<p className="text-carbon-900 dark:text-white whitespace-pre-wrap">
{selectedLead.inquiry_details}
</p>
</div>
)}
{selectedLead.custom_message && (
<div>
<label className="block text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
Custom Message
</label>
<p className="text-carbon-900 dark:text-white whitespace-pre-wrap">
{selectedLead.custom_message}
</p>
</div>
)}
<div className="grid grid-cols-1 sm:grid-cols-2 gap-chorus-md text-sm">
<div>
<label className="block text-xs font-medium text-carbon-500 dark:text-carbon-400 mb-1">
IP Address
</label>
<p className="text-carbon-700 dark:text-carbon-200">
{selectedLead.ip_address}
</p>
</div>
{selectedLead.country_code && (
<div>
<label className="block text-xs font-medium text-carbon-500 dark:text-carbon-400 mb-1">
Country
</label>
<p className="text-carbon-700 dark:text-carbon-200">
{selectedLead.country_code}
</p>
</div>
)}
<div>
<label className="block text-xs font-medium text-carbon-500 dark:text-carbon-400 mb-1">
GDPR Consent
</label>
<p className={`${selectedLead.gdpr_consent_given ? 'text-eucalyptus-600' : 'text-coral-600'}`}>
{selectedLead.gdpr_consent_given ? 'Given' : 'Not Given'}
</p>
</div>
<div>
<label className="block text-xs font-medium text-carbon-500 dark:text-carbon-400 mb-1">
Marketing Consent
</label>
<p className={`${selectedLead.marketing_consent ? 'text-eucalyptus-600' : 'text-coral-600'}`}>
{selectedLead.marketing_consent ? 'Given' : 'Not Given'}
</p>
</div>
</div>
</div>
</div>
</div>
)}
</div>
)
}

View File

@@ -0,0 +1,80 @@
'use client'
import { Users, TrendingUp, Calendar, Clock } from 'lucide-react'
import { LeadStats } from '@/lib/db'
interface StatsCardsProps {
stats: LeadStats
}
export default function StatsCards({ stats }: StatsCardsProps) {
const cards = [
{
title: 'Total Leads',
value: stats.total_leads,
icon: Users,
color: 'mulberry',
},
{
title: 'Today',
value: stats.leads_today,
icon: Clock,
color: 'ocean',
},
{
title: 'This Week',
value: stats.leads_this_week,
icon: Calendar,
color: 'eucalyptus',
},
{
title: 'This Month',
value: stats.leads_this_month,
icon: TrendingUp,
color: 'coral',
},
]
return (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-chorus-lg mb-chorus-xxl">
{cards.map((card, index) => {
const Icon = card.icon
return (
<div
key={card.title}
className={`dashboard-card p-chorus-lg border-l-4 hover:shadow-xl transition-shadow duration-300 ${
card.color === 'mulberry' ? 'border-mulberry-500' :
card.color === 'ocean' ? 'border-ocean-500' :
card.color === 'eucalyptus' ? 'border-eucalyptus-500' :
'border-coral-500'
}`}
>
<div className="flex items-center justify-between">
<div>
<p className="text-sm font-medium text-carbon-600 dark:text-carbon-300 mb-1">
{card.title}
</p>
<p className="text-3xl font-bold text-carbon-900 dark:text-white">
{card.value.toLocaleString()}
</p>
</div>
<div className={`p-chorus-md rounded-lg ${
card.color === 'mulberry' ? 'bg-mulberry-100 dark:bg-mulberry-900' :
card.color === 'ocean' ? 'bg-ocean-100 dark:bg-ocean-900' :
card.color === 'eucalyptus' ? 'bg-eucalyptus-100 dark:bg-eucalyptus-900' :
'bg-coral-100 dark:bg-coral-900'
}`}>
<Icon className={`h-6 w-6 ${
card.color === 'mulberry' ? 'text-mulberry-600 dark:text-mulberry-300' :
card.color === 'ocean' ? 'text-ocean-600 dark:text-ocean-300' :
card.color === 'eucalyptus' ? 'text-eucalyptus-600 dark:text-eucalyptus-300' :
'text-coral-600 dark:text-coral-300'
}`} />
</div>
</div>
</div>
)
})}
</div>
)
}

View File

@@ -0,0 +1,49 @@
'use client'
import { useState, useEffect } from 'react'
import { Sun, Moon } from 'lucide-react'
export default function ThemeToggle() {
const [isDark, setIsDark] = useState(false)
useEffect(() => {
// Check if user has a saved preference, otherwise default to light mode
const savedTheme = localStorage.getItem('theme')
const prefersDark = savedTheme === 'dark'
setIsDark(prefersDark)
if (prefersDark) {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
}, [])
const toggleTheme = () => {
const newTheme = !isDark
setIsDark(newTheme)
if (newTheme) {
document.documentElement.classList.add('dark')
localStorage.setItem('theme', 'dark')
} else {
document.documentElement.classList.remove('dark')
localStorage.setItem('theme', 'light')
}
}
return (
<button
onClick={toggleTheme}
className="fixed top-chorus-lg right-chorus-lg z-50 p-chorus-md bg-white dark:bg-carbon-900 border border-sand-300 dark:border-carbon-600 rounded-lg shadow-lg hover:shadow-xl transition-all duration-300 ease-out hover:scale-105 active:scale-95"
aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'}
>
{isDark ? (
<Sun className="h-5 w-5 text-sand-600 dark:text-sand-400" />
) : (
<Moon className="h-5 w-5 text-carbon-600" />
)}
</button>
)
}

View File

@@ -0,0 +1,40 @@
import { Pool } from 'pg'
const pool = new Pool({
host: process.env.POSTGRES_HOST || 'chorus-db',
port: parseInt(process.env.POSTGRES_PORT || '5432'),
database: process.env.POSTGRES_DB || 'chorus_teaser',
user: process.env.POSTGRES_USER || 'chorus_admin',
password: process.env.POSTGRES_PASSWORD || 'chorus_secure_password_123',
})
export { pool }
export interface Lead {
id: number
first_name: string
last_name: string
email: string
company_name?: string
company_role?: string
lead_source: string
inquiry_details?: string
custom_message?: string
ip_address: string
user_agent?: string
country_code?: string
gdpr_consent_given: boolean
gdpr_consent_date?: Date
marketing_consent: boolean
created_at: Date
updated_at: Date
}
export interface LeadStats {
total_leads: number
leads_today: number
leads_this_week: number
leads_this_month: number
by_source: { lead_source: string; count: number }[]
by_date: { date: string; count: number }[]
}

View File

@@ -0,0 +1,37 @@
import { NextRequest, NextResponse } from 'next/server'
export function middleware(request: NextRequest) {
// Simple basic auth for dashboard protection
const authHeader = request.headers.get('authorization')
if (!authHeader) {
return new NextResponse(null, {
status: 401,
headers: {
'WWW-Authenticate': 'Basic realm="CHORUS Dashboard"',
},
})
}
const credentials = authHeader.split(' ')[1]
const [username, password] = Buffer.from(credentials, 'base64').toString().split(':')
// Simple hardcoded credentials - in production, use environment variables
const validUsername = process.env.DASHBOARD_USERNAME || 'chorus'
const validPassword = process.env.DASHBOARD_PASSWORD || 'services2025!'
if (username !== validUsername || password !== validPassword) {
return new NextResponse(null, {
status: 401,
headers: {
'WWW-Authenticate': 'Basic realm="CHORUS Dashboard"',
},
})
}
return NextResponse.next()
}
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
}

View File

@@ -0,0 +1,7 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'standalone',
serverExternalPackages: ['pg']
}
module.exports = nextConfig

2984
modules/dashboard/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
{
"name": "chorus-dashboard",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "next dev -p 3002",
"build": "next build",
"start": "next start -p 3002",
"lint": "next lint"
},
"dependencies": {
"next": "15.5.0",
"react": "18.3.1",
"react-dom": "18.3.1",
"pg": "^8.11.3",
"lucide-react": "^0.263.1",
"@types/pg": "^8.10.7",
"tailwindcss": "^3.3.0",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.24",
"recharts": "^2.8.0"
},
"devDependencies": {
"typescript": "^5.1.6",
"@types/node": "^20.4.7",
"@types/react": "^18.2.17",
"@types/react-dom": "^18.2.7"
}
}

View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@@ -0,0 +1 @@
# This file ensures the public directory exists

View File

@@ -0,0 +1,161 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
],
darkMode: 'class',
theme: {
extend: {
colors: {
// CHORUS 8-Color Brand System
carbon: {
50: '#f6f6f6',
100: '#e7e7e7',
200: '#d1d1d1',
300: '#b0b0b0',
400: '#888888',
500: '#6d6d6d',
600: '#5d5d5d',
700: '#4f4f4f',
800: '#454545',
900: '#3d3d3d',
950: '#262626',
},
mulberry: {
50: '#faf7fc',
100: '#f3ecf8',
200: '#e9ddf2',
300: '#d8c2e7',
400: '#c19bd8',
500: '#a875c6',
600: '#8f58ab',
700: '#774591',
800: '#643b77',
900: '#543262',
950: '#371840',
},
walnut: {
50: '#f7f4f2',
100: '#ede6e0',
200: '#ddcdc1',
300: '#c7ab97',
400: '#b08970',
500: '#9f7557',
600: '#92634b',
700: '#795140',
800: '#624237',
900: '#51372f',
950: '#2b1c17',
},
nickel: {
50: '#f6f7f6',
100: '#e3e5e3',
200: '#c6cac7',
300: '#a1a8a3',
400: '#798179',
500: '#5e675f',
600: '#4a524b',
700: '#3d423e',
800: '#333733',
900: '#2b2f2c',
950: '#161816',
},
ocean: {
50: '#f0f8ff',
100: '#e0f2fe',
200: '#b9e6fe',
300: '#7cd3fc',
400: '#36bef8',
500: '#0ba5e9',
600: '#0284c7',
700: '#0369a1',
800: '#075985',
900: '#0c4a6e',
950: '#082f49',
},
eucalyptus: {
50: '#f0fdf4',
100: '#dcfce7',
200: '#bbf7d0',
300: '#86efac',
400: '#4ade80',
500: '#22c55e',
600: '#16a34a',
700: '#15803d',
800: '#166534',
900: '#14532d',
950: '#052e16',
},
sand: {
50: '#fefcf3',
100: '#fdf8e4',
200: '#fbf0c4',
300: '#f7e49b',
400: '#f2d66f',
500: '#eec64f',
600: '#deb042',
700: '#b9923a',
800: '#957438',
900: '#795f32',
950: '#443318',
},
coral: {
50: '#fef7f2',
100: '#feede2',
200: '#fcd8c0',
300: '#f9ba93',
400: '#f59564',
500: '#f17741',
600: '#e25d27',
700: '#bc481d',
800: '#963c1c',
900: '#79341c',
950: '#42180b',
},
},
spacing: {
'chorus-xs': '0.25rem',
'chorus-sm': '0.5rem',
'chorus-md': '1rem',
'chorus-lg': '1.5rem',
'chorus-xl': '2rem',
'chorus-xxl': '3rem',
'chorus-xxxl': '4rem',
},
fontFamily: {
'logo': ['var(--font-exo)', 'system-ui', 'sans-serif'],
'sans': ['var(--font-inter)', 'system-ui', 'sans-serif'],
},
fontSize: {
'h1': '4rem',
'h2': '3rem',
'h3': '2.25rem',
'h4': '1.875rem',
'h5': '1.5rem',
'h6': '1.25rem',
},
animation: {
'fade-in': 'fadeIn 0.6s ease-out forwards',
'fade-in-up': 'fadeInUp 0.6s ease-out forwards',
'slide-up': 'slideUp 0.6s ease-out forwards',
},
keyframes: {
fadeIn: {
'0%': { opacity: '0' },
'100%': { opacity: '1' },
},
fadeInUp: {
'0%': { opacity: '0', transform: 'translateY(30px)' },
'100%': { opacity: '1', transform: 'translateY(0)' },
},
slideUp: {
'0%': { opacity: '0', transform: 'translateY(50px)' },
'100%': { opacity: '1', transform: 'translateY(0)' },
},
},
},
},
plugins: [],
}

View File

@@ -0,0 +1,28 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "es6"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"baseUrl": ".",
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}

View File

@@ -1 +0,0 @@
LpwQF7EXxmhvU508XYUZO

View File

@@ -1,50 +1,15 @@
{
"pages": {
"/_not-found/page": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/_not-found/page-8ae677fd71c01a9b.js"
],
"/layout": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/css/50f03bdf6e668d47.css",
"static/chunks/app/layout-97ddb14a3955532f.js"
],
"/api/early-access/route": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/api/early-access/route-5e4dc48fa12e4d8d.js"
],
"/api/health/route": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/api/health/route-5e4dc48fa12e4d8d.js"
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/css/app/layout.css",
"static/chunks/app/layout.js"
],
"/page": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/b536a0f1-f2bc0f0a45231000.js",
"static/chunks/bd904a5c-4e91fa25e102b5d3.js",
"static/chunks/339-1f5190ae812b0d1d.js",
"static/chunks/app/page-b61a327a23303e7e.js"
],
"/privacy/page": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/privacy/page-0abefd9b9529a699.js"
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/page.js"
]
}
}

View File

@@ -1,7 +0,0 @@
{
"/_not-found/page": "/_not-found",
"/api/early-access/route": "/api/early-access",
"/api/health/route": "/api/health",
"/page": "/",
"/privacy/page": "/privacy"
}

View File

@@ -1,33 +1,20 @@
{
"polyfillFiles": [
"static/chunks/polyfills-42372ed130431b0a.js"
"static/chunks/polyfills.js"
],
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [
"static/LpwQF7EXxmhvU508XYUZO/_buildManifest.js",
"static/LpwQF7EXxmhvU508XYUZO/_ssgManifest.js"
"static/development/_buildManifest.js",
"static/development/_ssgManifest.js"
],
"rootMainFiles": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js"
"static/chunks/webpack.js",
"static/chunks/main-app.js"
],
"rootMainFilesTree": {},
"pages": {
"/_app": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/framework-a6e0b7e30f98059a.js",
"static/chunks/main-bfb7af9b6314f3ce.js",
"static/chunks/pages/_app-7d307437aca18ad4.js"
],
"/_error": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/framework-a6e0b7e30f98059a.js",
"static/chunks/main-bfb7af9b6314f3ce.js",
"static/chunks/pages/_error-cb2a52f75f2162e2.js"
]
"/_app": []
},
"ampFirstPages": []
}

View File

@@ -1 +1 @@
{"previewModeId":"b1aa30b7e175d2a1717a7b378440146f","previewModeSigningKey":"e1c56ccd2c096b45b5f8b7833ff83afe69ced05a28b8f9af6b8ef6e099be5c2a","previewModeEncryptionKey":"4b62fef44de56bf8a0237e4935747a8142567c28cdbc6fdf0fd6b3712ee90e8e","expireAt":1757374529680}
{"previewModeId":"e1e06ae21fa2064cff393541651535be","previewModeSigningKey":"e3a43d5a6ae1225a3e49d94ca8ef92e12c42dff89429935cb9076f4d37a1f3b1","previewModeEncryptionKey":"2a6457ff17b5acdf035c04014c42b615075a93bfa173aacb3f77eb10d290ae26","expireAt":1757500109927}

View File

@@ -1 +1 @@
{"encryption.key":"bZKZvsl0UR/KJLDuYay0UyzdUDb6YtLgVKHKsxQJQbw=","encryption.expire_at":1757374529610}
{"encryption.key":"9djQPjAcYXGjb7n562VmFWdUX0fr+GWjzGpIaDXDTlo=","encryption.expire_at":1757489423126}

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +0,0 @@
{
"buildStage": "static-generation",
"buildOptions": {
"useBuildWorker": "true"
}
}

View File

@@ -1 +0,0 @@
{"name":"Next.js","version":"15.5.0"}

View File

@@ -1,6 +0,0 @@
{
"version": 1,
"hasExportPathMap": false,
"exportTrailingSlash": false,
"isNextImageImported": false
}

View File

@@ -1,59 +0,0 @@
{
"version": 1,
"images": {
"deviceSizes": [
640,
750,
828,
1080,
1200,
1920,
2048,
3840
],
"imageSizes": [
16,
32,
48,
64,
96,
128,
256,
384
],
"path": "/_next/image",
"loader": "default",
"loaderFile": "",
"domains": [
"localhost"
],
"disableStaticImages": false,
"minimumCacheTTL": 60,
"formats": [
"image/webp"
],
"dangerouslyAllowSVG": false,
"contentSecurityPolicy": "script-src 'none'; frame-src 'none'; sandbox;",
"contentDispositionType": "attachment",
"remotePatterns": [],
"unoptimized": false,
"sizes": [
640,
750,
828,
1080,
1200,
1920,
2048,
3840,
16,
32,
48,
64,
96,
128,
256,
384
]
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,85 +1,11 @@
{
"version": 4,
"routes": {
"/_not-found": {
"initialStatus": 404,
"experimentalBypassFor": [
{
"type": "header",
"key": "next-action"
},
{
"type": "header",
"key": "content-type",
"value": "multipart/form-data;.*"
}
],
"initialRevalidateSeconds": false,
"srcRoute": "/_not-found",
"dataRoute": "/_not-found.rsc",
"allowHeader": [
"host",
"x-matched-path",
"x-prerender-revalidate",
"x-prerender-revalidate-if-generated",
"x-next-revalidated-tags",
"x-next-revalidate-tag-token"
]
},
"/privacy": {
"experimentalBypassFor": [
{
"type": "header",
"key": "next-action"
},
{
"type": "header",
"key": "content-type",
"value": "multipart/form-data;.*"
}
],
"initialRevalidateSeconds": false,
"srcRoute": "/privacy",
"dataRoute": "/privacy.rsc",
"allowHeader": [
"host",
"x-matched-path",
"x-prerender-revalidate",
"x-prerender-revalidate-if-generated",
"x-next-revalidated-tags",
"x-next-revalidate-tag-token"
]
},
"/": {
"experimentalBypassFor": [
{
"type": "header",
"key": "next-action"
},
{
"type": "header",
"key": "content-type",
"value": "multipart/form-data;.*"
}
],
"initialRevalidateSeconds": false,
"srcRoute": "/",
"dataRoute": "/index.rsc",
"allowHeader": [
"host",
"x-matched-path",
"x-prerender-revalidate",
"x-prerender-revalidate-if-generated",
"x-next-revalidated-tags",
"x-next-revalidate-tag-token"
]
}
},
"routes": {},
"dynamicRoutes": {},
"notFoundRoutes": [],
"preview": {
"previewModeId": "b1aa30b7e175d2a1717a7b378440146f",
"previewModeSigningKey": "e1c56ccd2c096b45b5f8b7833ff83afe69ced05a28b8f9af6b8ef6e099be5c2a",
"previewModeEncryptionKey": "4b62fef44de56bf8a0237e4935747a8142567c28cdbc6fdf0fd6b3712ee90e8e"
"previewModeId": "51475a891302b9c40d4d477e01afaf5e",
"previewModeSigningKey": "c0bffd3b2a34e576e7734aee3d7a0f48e91a2113136ddc6e0e2215c9801dfd32",
"previewModeEncryptionKey": "e6c6b316f7c04564617b1292e1bd7102f2804560717081139be0714993b157ab"
}
}

View File

@@ -1,331 +0,0 @@
{
"version": 1,
"config": {
"env": {},
"webpack": null,
"eslint": {
"ignoreDuringBuilds": false
},
"typescript": {
"ignoreBuildErrors": false,
"tsconfigPath": "tsconfig.json"
},
"typedRoutes": false,
"distDir": ".next",
"cleanDistDir": true,
"assetPrefix": "",
"cacheMaxMemorySize": 52428800,
"configOrigin": "next.config.js",
"useFileSystemPublicRoutes": true,
"generateEtags": true,
"pageExtensions": [
"tsx",
"ts",
"jsx",
"js"
],
"poweredByHeader": true,
"compress": true,
"images": {
"deviceSizes": [
640,
750,
828,
1080,
1200,
1920,
2048,
3840
],
"imageSizes": [
16,
32,
48,
64,
96,
128,
256,
384
],
"path": "/_next/image",
"loader": "default",
"loaderFile": "",
"domains": [
"localhost"
],
"disableStaticImages": false,
"minimumCacheTTL": 60,
"formats": [
"image/webp"
],
"dangerouslyAllowSVG": false,
"contentSecurityPolicy": "script-src 'none'; frame-src 'none'; sandbox;",
"contentDispositionType": "attachment",
"remotePatterns": [],
"unoptimized": false
},
"devIndicators": {
"position": "bottom-left"
},
"onDemandEntries": {
"maxInactiveAge": 60000,
"pagesBufferLength": 5
},
"amp": {
"canonicalBase": ""
},
"basePath": "",
"sassOptions": {},
"trailingSlash": false,
"i18n": null,
"productionBrowserSourceMaps": false,
"excludeDefaultMomentLocales": true,
"serverRuntimeConfig": {},
"publicRuntimeConfig": {},
"reactProductionProfiling": false,
"reactStrictMode": null,
"reactMaxHeadersLength": 6000,
"httpAgentOptions": {
"keepAlive": true
},
"logging": {},
"compiler": {},
"expireTime": 31536000,
"staticPageGenerationTimeout": 60,
"output": "standalone",
"modularizeImports": {
"@mui/icons-material": {
"transform": "@mui/icons-material/{{member}}"
},
"lodash": {
"transform": "lodash/{{member}}"
}
},
"outputFileTracingRoot": "/home/tony/chorus/project-queues/active/chorus.services/modules/teaser",
"experimental": {
"useSkewCookie": false,
"cacheLife": {
"default": {
"stale": 300,
"revalidate": 900,
"expire": 4294967294
},
"seconds": {
"stale": 30,
"revalidate": 1,
"expire": 60
},
"minutes": {
"stale": 300,
"revalidate": 60,
"expire": 3600
},
"hours": {
"stale": 300,
"revalidate": 3600,
"expire": 86400
},
"days": {
"stale": 300,
"revalidate": 86400,
"expire": 604800
},
"weeks": {
"stale": 300,
"revalidate": 604800,
"expire": 2592000
},
"max": {
"stale": 300,
"revalidate": 2592000,
"expire": 4294967294
}
},
"cacheHandlers": {},
"cssChunking": true,
"multiZoneDraftMode": false,
"appNavFailHandling": false,
"prerenderEarlyExit": true,
"serverMinification": true,
"serverSourceMaps": false,
"linkNoTouchStart": false,
"caseSensitiveRoutes": false,
"clientSegmentCache": false,
"clientParamParsing": false,
"dynamicOnHover": false,
"preloadEntriesOnStart": true,
"clientRouterFilter": true,
"clientRouterFilterRedirects": false,
"fetchCacheKeyPrefix": "",
"middlewarePrefetch": "flexible",
"optimisticClientCache": true,
"manualClientBasePath": false,
"cpus": 15,
"memoryBasedWorkersCount": false,
"imgOptConcurrency": null,
"imgOptTimeoutInSeconds": 7,
"imgOptMaxInputPixels": 268402689,
"imgOptSequentialRead": null,
"imgOptSkipMetadata": null,
"isrFlushToDisk": true,
"workerThreads": false,
"optimizeCss": false,
"nextScriptWorkers": false,
"scrollRestoration": false,
"externalDir": false,
"disableOptimizedLoading": false,
"gzipSize": true,
"craCompat": false,
"esmExternals": true,
"fullySpecified": false,
"swcTraceProfiling": false,
"forceSwcTransforms": false,
"largePageDataBytes": 128000,
"typedEnv": false,
"parallelServerCompiles": false,
"parallelServerBuildTraces": false,
"ppr": false,
"authInterrupts": false,
"webpackMemoryOptimizations": false,
"optimizeServerReact": true,
"viewTransition": false,
"routerBFCache": false,
"removeUncaughtErrorAndRejectionListeners": false,
"validateRSCRequestHeaders": false,
"staleTimes": {
"dynamic": 0,
"static": 300
},
"serverComponentsHmrCache": true,
"staticGenerationMaxConcurrency": 8,
"staticGenerationMinPagesPerWorker": 25,
"cacheComponents": false,
"inlineCss": false,
"useCache": false,
"globalNotFound": false,
"devtoolSegmentExplorer": true,
"browserDebugInfoInTerminal": false,
"optimizeRouterScrolling": false,
"optimizePackageImports": [
"lucide-react",
"date-fns",
"lodash-es",
"ramda",
"antd",
"react-bootstrap",
"ahooks",
"@ant-design/icons",
"@headlessui/react",
"@headlessui-float/react",
"@heroicons/react/20/solid",
"@heroicons/react/24/solid",
"@heroicons/react/24/outline",
"@visx/visx",
"@tremor/react",
"rxjs",
"@mui/material",
"@mui/icons-material",
"recharts",
"react-use",
"effect",
"@effect/schema",
"@effect/platform",
"@effect/platform-node",
"@effect/platform-browser",
"@effect/platform-bun",
"@effect/sql",
"@effect/sql-mssql",
"@effect/sql-mysql2",
"@effect/sql-pg",
"@effect/sql-sqlite-node",
"@effect/sql-sqlite-bun",
"@effect/sql-sqlite-wasm",
"@effect/sql-sqlite-react-native",
"@effect/rpc",
"@effect/rpc-http",
"@effect/typeclass",
"@effect/experimental",
"@effect/opentelemetry",
"@material-ui/core",
"@material-ui/icons",
"@tabler/icons-react",
"mui-core",
"react-icons/ai",
"react-icons/bi",
"react-icons/bs",
"react-icons/cg",
"react-icons/ci",
"react-icons/di",
"react-icons/fa",
"react-icons/fa6",
"react-icons/fc",
"react-icons/fi",
"react-icons/gi",
"react-icons/go",
"react-icons/gr",
"react-icons/hi",
"react-icons/hi2",
"react-icons/im",
"react-icons/io",
"react-icons/io5",
"react-icons/lia",
"react-icons/lib",
"react-icons/lu",
"react-icons/md",
"react-icons/pi",
"react-icons/ri",
"react-icons/rx",
"react-icons/si",
"react-icons/sl",
"react-icons/tb",
"react-icons/tfi",
"react-icons/ti",
"react-icons/vsc",
"react-icons/wi"
],
"trustHostHeader": false,
"isExperimentalCompile": false
},
"htmlLimitedBots": "[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight",
"bundlePagesRouterDependencies": false,
"configFileName": "next.config.js",
"turbopack": {
"root": "/home/tony/chorus/project-queues/active/chorus.services/modules/teaser"
},
"_originalRewrites": {
"beforeFiles": [],
"afterFiles": [
{
"source": "/api/early-access",
"destination": "/api/early-access"
}
],
"fallback": []
}
},
"appDir": "/home/tony/chorus/project-queues/active/chorus.services/modules/teaser",
"relativeAppDir": "",
"files": [
".next/routes-manifest.json",
".next/server/pages-manifest.json",
".next/build-manifest.json",
".next/prerender-manifest.json",
".next/server/functions-config-manifest.json",
".next/server/middleware-manifest.json",
".next/server/middleware-build-manifest.js",
".next/server/middleware-react-loadable-manifest.js",
".next/react-loadable-manifest.json",
".next/server/app-paths-manifest.json",
".next/app-path-routes-manifest.json",
".next/app-build-manifest.json",
".next/server/server-reference-manifest.js",
".next/server/server-reference-manifest.json",
".next/BUILD_ID",
".next/server/next-font-manifest.js",
".next/server/next-font-manifest.json",
".next/required-server-files.json"
],
"ignore": [
"node_modules/next/dist/compiled/@ampproject/toolbox-optimizer/**/*"
]
}

View File

@@ -1,84 +1 @@
{
"version": 3,
"pages404": true,
"caseSensitive": false,
"basePath": "",
"redirects": [
{
"source": "/:path+/",
"destination": "/:path+",
"internal": true,
"statusCode": 308,
"regex": "^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))/$"
}
],
"headers": [
{
"source": "/:path*",
"headers": [
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "Referrer-Policy",
"value": "strict-origin-when-cross-origin"
}
],
"regex": "^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))?(?:/)?$"
}
],
"rewrites": {
"beforeFiles": [],
"afterFiles": [
{
"source": "/api/early-access",
"destination": "/api/early-access",
"regex": "^/api/early-access(?:/)?$"
}
],
"fallback": []
},
"dynamicRoutes": [],
"staticRoutes": [
{
"page": "/",
"regex": "^/(?:/)?$",
"routeKeys": {},
"namedRegex": "^/(?:/)?$"
},
{
"page": "/_not-found",
"regex": "^/_not\\-found(?:/)?$",
"routeKeys": {},
"namedRegex": "^/_not\\-found(?:/)?$"
},
{
"page": "/privacy",
"regex": "^/privacy(?:/)?$",
"routeKeys": {},
"namedRegex": "^/privacy(?:/)?$"
}
],
"dataRoutes": [],
"rsc": {
"header": "rsc",
"varyHeader": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch",
"prefetchHeader": "next-router-prefetch",
"didPostponeHeader": "x-nextjs-postponed",
"contentTypeHeader": "text/x-component",
"suffix": ".rsc",
"prefetchSuffix": ".prefetch.rsc",
"prefetchSegmentHeader": "next-router-segment-prefetch",
"prefetchSegmentSuffix": ".segment.rsc",
"prefetchSegmentDirSuffix": ".segments"
},
"rewriteHeaders": {
"pathHeader": "x-nextjs-rewritten-path",
"queryHeader": "x-nextjs-rewritten-query"
}
}
{"version":3,"caseSensitive":false,"basePath":"","rewrites":{"beforeFiles":[],"afterFiles":[{"source":"/api/early-access","destination":"/api/early-access","regex":"^\\/api\\/early-access(?:\\/)?$","check":true}],"fallback":[]},"redirects":[{"source":"/:path+/","destination":"/:path+","permanent":true,"internal":true,"regex":"^(?:\\/((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*))\\/$"}],"headers":[{"source":"/:path*","headers":[{"key":"X-Frame-Options","value":"DENY"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"strict-origin-when-cross-origin"}],"regex":"^(?:\\/((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*))?(?:\\/)?$"}]}

View File

@@ -1,7 +1,3 @@
{
"/_not-found/page": "app/_not-found/page.js",
"/api/early-access/route": "app/api/early-access/route.js",
"/api/health/route": "app/api/health/route.js",
"/page": "app/page.js",
"/privacy/page": "app/privacy/page.js"
"/page": "app/page.js"
}

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +0,0 @@
{
"status": 404,
"headers": {
"x-nextjs-stale-time": "300",
"x-nextjs-prerender": "1",
"x-next-cache-tags": "_N_T_/layout,_N_T_/_not-found/layout,_N_T_/_not-found/page,_N_T_/_not-found"
}
}

View File

@@ -1,16 +0,0 @@
1:"$Sreact.fragment"
2:I[9766,[],""]
3:I[8924,[],""]
4:I[4431,[],"OutletBoundary"]
6:I[5278,[],"AsyncMetadataOutlet"]
8:I[4431,[],"ViewportBoundary"]
a:I[4431,[],"MetadataBoundary"]
b:"$Sreact.suspense"
d:I[7150,[],""]
:HL["/_next/static/media/e4af272ccee01ff0-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
:HL["/_next/static/css/50f03bdf6e668d47.css","style"]
0:{"P":null,"b":"LpwQF7EXxmhvU508XYUZO","p":"","c":["","_not-found"],"i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/50f03bdf6e668d47.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"dark","children":["$","body",null,{"className":"__variable_e8ce0c font-sans","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":["/_not-found",["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$L5",["$","$L6",null,{"promise":"$@7"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],[["$","$L8",null,{"children":"$L9"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$La",null,{"children":["$","div",null,{"hidden":true,"children":["$","$b",null,{"fallback":null,"children":"$Lc"}]}]}]]}],false]],"m":"$undefined","G":["$d",[]],"s":false,"S":true}
9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
5:null
7:{"metadata":[["$","title","0",{"children":"CHORUS Services - Contextual AI Orchestration Platform"}],["$","meta","1",{"name":"description","content":"Revolutionary AI orchestration platform. The right context, to the right agent, at the right time. Join the waitlist for early access."}],["$","link","2",{"rel":"author","href":"https://deepblack.cloud"}],["$","meta","3",{"name":"author","content":"Anthony Lewis Rawlins"}],["$","meta","4",{"name":"keywords","content":"contextual AI,agent orchestration,enterprise AI,knowledge fabric,AI platform"}],["$","meta","5",{"name":"creator","content":"Deep Black Cloud"}],["$","meta","6",{"name":"publisher","content":"CHORUS Services"}],["$","meta","7",{"name":"robots","content":"index, follow"}],["$","meta","8",{"name":"googlebot","content":"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"}],["$","link","9",{"rel":"canonical","href":"https://chorus.services"}],["$","meta","10",{"property":"og:title","content":"CHORUS Services - Contextual AI Orchestration Platform"}],["$","meta","11",{"property":"og:description","content":"Revolutionary AI orchestration platform. The right context, to the right agent, at the right time."}],["$","meta","12",{"property":"og:url","content":"https://chorus.services"}],["$","meta","13",{"property":"og:site_name","content":"CHORUS Services"}],["$","meta","14",{"property":"og:locale","content":"en_US"}],["$","meta","15",{"property":"og:image","content":"https://chorus.services/logos/logo-ring-only.png"}],["$","meta","16",{"property":"og:image:width","content":"256"}],["$","meta","17",{"property":"og:image:height","content":"256"}],["$","meta","18",{"property":"og:image:alt","content":"CHORUS Services Logo"}],["$","meta","19",{"property":"og:type","content":"website"}],["$","meta","20",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","21",{"name":"twitter:title","content":"CHORUS Services - Contextual AI Orchestration"}],["$","meta","22",{"name":"twitter:description","content":"The right context, to the right agent, at the right time."}],["$","meta","23",{"name":"twitter:image","content":"https://chorus.services/logos/chorus-landscape-on-blue.png"}]],"error":null,"digest":"$undefined"}
c:"$7:metadata"

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":1,"files":["../../../../node_modules/next/dist/client/components/app-router-headers.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../node_modules/next/dist/lib/client-and-server-references.js","../../../../node_modules/next/dist/lib/constants.js","../../../../node_modules/next/dist/lib/interop-default.js","../../../../node_modules/next/dist/lib/is-error.js","../../../../node_modules/next/dist/lib/semver-noop.js","../../../../node_modules/next/dist/server/app-render/action-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/action-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../../node_modules/next/dist/server/app-render/cache-signal.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js","../../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../../node_modules/next/dist/server/lib/cache-handlers/default.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../../node_modules/next/dist/server/lib/lru-cache.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../node_modules/next/dist/server/load-manifest.external.js","../../../../node_modules/next/dist/server/response-cache/types.js","../../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../../node_modules/next/dist/shared/lib/no-fallback-error.external.js","../../../../node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js","../../../../node_modules/next/dist/shared/lib/router/utils/app-paths.js","../../../../node_modules/next/dist/shared/lib/router/utils/html-bots.js","../../../../node_modules/next/dist/shared/lib/router/utils/is-bot.js","../../../../node_modules/next/dist/shared/lib/segment.js","../../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../../node_modules/next/package.json","../../../package.json","../../chunks/397.js","../../chunks/586.js","../../webpack-runtime.js","page_client-reference-manifest.js"]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +0,0 @@
{
"headers": {
"x-nextjs-stale-time": "300",
"x-nextjs-prerender": "1",
"x-next-cache-tags": "_N_T_/layout,_N_T_/page,_N_T_/"
}
}

View File

@@ -1,20 +0,0 @@
1:"$Sreact.fragment"
2:I[9766,[],""]
3:I[8924,[],""]
4:I[1959,[],"ClientPageRoot"]
5:I[8168,["367","static/chunks/b536a0f1-f2bc0f0a45231000.js","831","static/chunks/bd904a5c-4e91fa25e102b5d3.js","339","static/chunks/339-1f5190ae812b0d1d.js","974","static/chunks/app/page-b61a327a23303e7e.js"],"default"]
8:I[4431,[],"OutletBoundary"]
a:I[5278,[],"AsyncMetadataOutlet"]
c:I[4431,[],"ViewportBoundary"]
e:I[4431,[],"MetadataBoundary"]
f:"$Sreact.suspense"
11:I[7150,[],""]
:HL["/_next/static/media/e4af272ccee01ff0-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
:HL["/_next/static/css/50f03bdf6e668d47.css","style"]
0:{"P":null,"b":"LpwQF7EXxmhvU508XYUZO","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/50f03bdf6e668d47.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"dark","children":["$","body",null,{"className":"__variable_e8ce0c font-sans","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","searchParams":{},"params":{},"promises":["$@6","$@7"]}],null,["$","$L8",null,{"children":["$L9",["$","$La",null,{"promise":"$@b"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lc",null,{"children":"$Ld"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$Le",null,{"children":["$","div",null,{"hidden":true,"children":["$","$f",null,{"fallback":null,"children":"$L10"}]}]}]]}],false]],"m":"$undefined","G":["$11",[]],"s":false,"S":true}
6:{}
7:"$0:f:0:1:2:children:1:props:children:0:props:params"
d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
9:null
b:{"metadata":[["$","title","0",{"children":"CHORUS Services - Contextual AI Orchestration Platform"}],["$","meta","1",{"name":"description","content":"Revolutionary AI orchestration platform. The right context, to the right agent, at the right time. Join the waitlist for early access."}],["$","link","2",{"rel":"author","href":"https://deepblack.cloud"}],["$","meta","3",{"name":"author","content":"Anthony Lewis Rawlins"}],["$","meta","4",{"name":"keywords","content":"contextual AI,agent orchestration,enterprise AI,knowledge fabric,AI platform"}],["$","meta","5",{"name":"creator","content":"Deep Black Cloud"}],["$","meta","6",{"name":"publisher","content":"CHORUS Services"}],["$","meta","7",{"name":"robots","content":"index, follow"}],["$","meta","8",{"name":"googlebot","content":"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"}],["$","link","9",{"rel":"canonical","href":"https://chorus.services"}],["$","meta","10",{"property":"og:title","content":"CHORUS Services - Contextual AI Orchestration Platform"}],["$","meta","11",{"property":"og:description","content":"Revolutionary AI orchestration platform. The right context, to the right agent, at the right time."}],["$","meta","12",{"property":"og:url","content":"https://chorus.services"}],["$","meta","13",{"property":"og:site_name","content":"CHORUS Services"}],["$","meta","14",{"property":"og:locale","content":"en_US"}],["$","meta","15",{"property":"og:image","content":"https://chorus.services/logos/logo-ring-only.png"}],["$","meta","16",{"property":"og:image:width","content":"256"}],["$","meta","17",{"property":"og:image:height","content":"256"}],["$","meta","18",{"property":"og:image:alt","content":"CHORUS Services Logo"}],["$","meta","19",{"property":"og:type","content":"website"}],["$","meta","20",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","21",{"name":"twitter:title","content":"CHORUS Services - Contextual AI Orchestration"}],["$","meta","22",{"name":"twitter:description","content":"The right context, to the right agent, at the right time."}],["$","meta","23",{"name":"twitter:image","content":"https://chorus.services/logos/chorus-landscape-on-blue.png"}]],"error":null,"digest":"$undefined"}
10:"$b:metadata"

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":1,"files":["../../../node_modules/next/dist/client/components/app-router-headers.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../node_modules/next/dist/lib/client-and-server-references.js","../../../node_modules/next/dist/lib/constants.js","../../../node_modules/next/dist/lib/interop-default.js","../../../node_modules/next/dist/lib/is-error.js","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/server/app-render/action-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/action-async-storage.external.js","../../../node_modules/next/dist/server/app-render/after-task-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/after-task-async-storage.external.js","../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../node_modules/next/dist/server/app-render/cache-signal.js","../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js","../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js","../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js","../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../node_modules/next/dist/server/lib/cache-handlers/default.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../node_modules/next/dist/server/lib/lru-cache.js","../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/dist/server/load-manifest.external.js","../../../node_modules/next/dist/server/response-cache/types.js","../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../node_modules/next/dist/shared/lib/no-fallback-error.external.js","../../../node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js","../../../node_modules/next/dist/shared/lib/router/utils/app-paths.js","../../../node_modules/next/dist/shared/lib/router/utils/html-bots.js","../../../node_modules/next/dist/shared/lib/router/utils/is-bot.js","../../../node_modules/next/dist/shared/lib/segment.js","../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../node_modules/next/package.json","../../package.json","../chunks/397.js","../chunks/586.js","../webpack-runtime.js","page_client-reference-manifest.js"]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +0,0 @@
{
"headers": {
"x-nextjs-stale-time": "300",
"x-nextjs-prerender": "1",
"x-next-cache-tags": "_N_T_/layout,_N_T_/privacy/layout,_N_T_/privacy/page,_N_T_/privacy"
}
}

View File

@@ -1,20 +0,0 @@
1:"$Sreact.fragment"
2:I[9766,[],""]
3:I[8924,[],""]
4:I[1959,[],"ClientPageRoot"]
5:I[3709,["877","static/chunks/app/privacy/page-0abefd9b9529a699.js"],"default"]
8:I[4431,[],"OutletBoundary"]
a:I[5278,[],"AsyncMetadataOutlet"]
c:I[4431,[],"ViewportBoundary"]
e:I[4431,[],"MetadataBoundary"]
f:"$Sreact.suspense"
11:I[7150,[],""]
:HL["/_next/static/media/e4af272ccee01ff0-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
:HL["/_next/static/css/50f03bdf6e668d47.css","style"]
0:{"P":null,"b":"LpwQF7EXxmhvU508XYUZO","p":"","c":["","privacy"],"i":false,"f":[[["",{"children":["privacy",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/50f03bdf6e668d47.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"dark","children":["$","body",null,{"className":"__variable_e8ce0c font-sans","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]]}],{"children":["privacy",["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L4",null,{"Component":"$5","searchParams":{},"params":{},"promises":["$@6","$@7"]}],null,["$","$L8",null,{"children":["$L9",["$","$La",null,{"promise":"$@b"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lc",null,{"children":"$Ld"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$Le",null,{"children":["$","div",null,{"hidden":true,"children":["$","$f",null,{"fallback":null,"children":"$L10"}]}]}]]}],false]],"m":"$undefined","G":["$11",[]],"s":false,"S":true}
6:{}
7:"$0:f:0:1:2:children:2:children:1:props:children:0:props:params"
d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
9:null
b:{"metadata":[["$","title","0",{"children":"CHORUS Services - Contextual AI Orchestration Platform"}],["$","meta","1",{"name":"description","content":"Revolutionary AI orchestration platform. The right context, to the right agent, at the right time. Join the waitlist for early access."}],["$","link","2",{"rel":"author","href":"https://deepblack.cloud"}],["$","meta","3",{"name":"author","content":"Anthony Lewis Rawlins"}],["$","meta","4",{"name":"keywords","content":"contextual AI,agent orchestration,enterprise AI,knowledge fabric,AI platform"}],["$","meta","5",{"name":"creator","content":"Deep Black Cloud"}],["$","meta","6",{"name":"publisher","content":"CHORUS Services"}],["$","meta","7",{"name":"robots","content":"index, follow"}],["$","meta","8",{"name":"googlebot","content":"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"}],["$","link","9",{"rel":"canonical","href":"https://chorus.services"}],["$","meta","10",{"property":"og:title","content":"CHORUS Services - Contextual AI Orchestration Platform"}],["$","meta","11",{"property":"og:description","content":"Revolutionary AI orchestration platform. The right context, to the right agent, at the right time."}],["$","meta","12",{"property":"og:url","content":"https://chorus.services"}],["$","meta","13",{"property":"og:site_name","content":"CHORUS Services"}],["$","meta","14",{"property":"og:locale","content":"en_US"}],["$","meta","15",{"property":"og:image","content":"https://chorus.services/logos/logo-ring-only.png"}],["$","meta","16",{"property":"og:image:width","content":"256"}],["$","meta","17",{"property":"og:image:height","content":"256"}],["$","meta","18",{"property":"og:image:alt","content":"CHORUS Services Logo"}],["$","meta","19",{"property":"og:type","content":"website"}],["$","meta","20",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","21",{"name":"twitter:title","content":"CHORUS Services - Contextual AI Orchestration"}],["$","meta","22",{"name":"twitter:description","content":"The right context, to the right agent, at the right time."}],["$","meta","23",{"name":"twitter:image","content":"https://chorus.services/logos/chorus-landscape-on-blue.png"}]],"error":null,"digest":"$undefined"}
10:"$b:metadata"

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":1,"files":["../../../../node_modules/next/dist/client/components/app-router-headers.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../node_modules/next/dist/lib/client-and-server-references.js","../../../../node_modules/next/dist/lib/constants.js","../../../../node_modules/next/dist/lib/interop-default.js","../../../../node_modules/next/dist/lib/is-error.js","../../../../node_modules/next/dist/lib/semver-noop.js","../../../../node_modules/next/dist/server/app-render/action-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/action-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../../node_modules/next/dist/server/app-render/cache-signal.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js","../../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../../node_modules/next/dist/server/lib/cache-handlers/default.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../../node_modules/next/dist/server/lib/lru-cache.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../node_modules/next/dist/server/load-manifest.external.js","../../../../node_modules/next/dist/server/response-cache/types.js","../../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../../node_modules/next/dist/shared/lib/no-fallback-error.external.js","../../../../node_modules/next/dist/shared/lib/page-path/ensure-leading-slash.js","../../../../node_modules/next/dist/shared/lib/router/utils/app-paths.js","../../../../node_modules/next/dist/shared/lib/router/utils/html-bots.js","../../../../node_modules/next/dist/shared/lib/router/utils/is-bot.js","../../../../node_modules/next/dist/shared/lib/segment.js","../../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../../node_modules/next/package.json","../../../package.json","../../chunks/397.js","../../chunks/586.js","../../webpack-runtime.js","page_client-reference-manifest.js"]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +0,0 @@
{
"version": 1,
"functions": {}
}

View File

@@ -1 +1 @@
self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST="[]";
self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST="[]"

View File

@@ -1 +1,22 @@
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-fddcf5b4cf83a013.js","static/chunks/4bd1b696-c023c6e3521b1417.js","static/chunks/255-d2f9158a50b3f321.js","static/chunks/main-app-000f416d9670fe3f.js"],rootMainFilesTree:{},pages:{"/_app":["static/chunks/webpack-fddcf5b4cf83a013.js","static/chunks/framework-a6e0b7e30f98059a.js","static/chunks/main-bfb7af9b6314f3ce.js","static/chunks/pages/_app-7d307437aca18ad4.js"],"/_error":["static/chunks/webpack-fddcf5b4cf83a013.js","static/chunks/framework-a6e0b7e30f98059a.js","static/chunks/main-bfb7af9b6314f3ce.js","static/chunks/pages/_error-cb2a52f75f2162e2.js"]},ampFirstPages:[]},globalThis.__BUILD_MANIFEST.lowPriorityFiles=["/static/"+process.env.__NEXT_BUILD_ID+"/_buildManifest.js",,"/static/"+process.env.__NEXT_BUILD_ID+"/_ssgManifest.js"];
globalThis.__BUILD_MANIFEST = {
"polyfillFiles": [
"static/chunks/polyfills.js"
],
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [],
"rootMainFiles": [
"static/chunks/webpack.js",
"static/chunks/main-app.js"
],
"rootMainFilesTree": {},
"pages": {
"/_app": []
},
"ampFirstPages": []
};
globalThis.__BUILD_MANIFEST.lowPriorityFiles = [
"/static/" + process.env.__NEXT_BUILD_ID + "/_buildManifest.js",
,"/static/" + process.env.__NEXT_BUILD_ID + "/_ssgManifest.js",
];

View File

@@ -1 +1 @@
self.__REACT_LOADABLE_MANIFEST="{}";
self.__REACT_LOADABLE_MANIFEST="{}"

View File

@@ -1 +1 @@
self.__NEXT_FONT_MANIFEST='{"pages":{},"app":{"/home/tony/chorus/project-queues/active/chorus.services/modules/teaser/app/layout":["static/media/e4af272ccee01ff0-s.p.woff2"]},"appUsingSizeAdjust":true,"pagesUsingSizeAdjust":false}';
self.__NEXT_FONT_MANIFEST="{\"pages\":{},\"app\":{\"/home/tony/chorus/project-queues/active/chorus.services/modules/teaser/app/layout\":[\"static/media/a1187f081f048286-s.p.woff2\",\"static/media/e4af272ccee01ff0-s.p.woff2\"]},\"appUsingSizeAdjust\":true,\"pagesUsingSizeAdjust\":false}"

View File

@@ -1 +1 @@
{"pages":{},"app":{"/home/tony/chorus/project-queues/active/chorus.services/modules/teaser/app/layout":["static/media/e4af272ccee01ff0-s.p.woff2"]},"appUsingSizeAdjust":true,"pagesUsingSizeAdjust":false}
{"pages":{},"app":{"/home/tony/chorus/project-queues/active/chorus.services/modules/teaser/app/layout":["static/media/a1187f081f048286-s.p.woff2","static/media/e4af272ccee01ff0-s.p.woff2"]},"appUsingSizeAdjust":true,"pagesUsingSizeAdjust":false}

View File

@@ -1,6 +1 @@
{
"/_app": "pages/_app.js",
"/_error": "pages/_error.js",
"/_document": "pages/_document.js",
"/404": "pages/404.html"
}
{}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-fddcf5b4cf83a013.js" defer=""></script><script src="/_next/static/chunks/framework-a6e0b7e30f98059a.js" defer=""></script><script src="/_next/static/chunks/main-bfb7af9b6314f3ce.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7d307437aca18ad4.js" defer=""></script><script src="/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js" defer=""></script><script src="/_next/static/LpwQF7EXxmhvU508XYUZO/_buildManifest.js" defer=""></script><script src="/_next/static/LpwQF7EXxmhvU508XYUZO/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"LpwQF7EXxmhvU508XYUZO","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>

View File

@@ -1 +0,0 @@
"use strict";(()=>{var a={};a.id=636,a.ids=[636],a.modules={625:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"default",{enumerable:!0,get:function(){return i}});let d=c(7804),e=c(8732),f=d._(c(2015)),g=c(6915);async function h(a){let{Component:b,ctx:c}=a;return{pageProps:await (0,g.loadGetInitialProps)(b,c)}}class i extends f.default.Component{render(){let{Component:a,pageProps:b}=this.props;return(0,e.jsx)(a,{...b})}}i.origGetInitialProps=h,i.getInitialProps=h,("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},2015:a=>{a.exports=require("react")},6915:(a,b)=>{Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{DecodeError:function(){return o},MiddlewareNotFoundError:function(){return s},MissingStaticPage:function(){return r},NormalizeError:function(){return p},PageNotFoundError:function(){return q},SP:function(){return m},ST:function(){return n},WEB_VITALS:function(){return c},execOnce:function(){return d},getDisplayName:function(){return i},getLocationOrigin:function(){return g},getURL:function(){return h},isAbsoluteUrl:function(){return f},isResSent:function(){return j},loadGetInitialProps:function(){return l},normalizeRepeatedSlashes:function(){return k},stringifyError:function(){return t}});let c=["CLS","FCP","FID","INP","LCP","TTFB"];function d(a){let b,c=!1;return function(){for(var d=arguments.length,e=Array(d),f=0;f<d;f++)e[f]=arguments[f];return c||(c=!0,b=a(...e)),b}}let e=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,f=a=>e.test(a);function g(){let{protocol:a,hostname:b,port:c}=window.location;return a+"//"+b+(c?":"+c:"")}function h(){let{href:a}=window.location,b=g();return a.substring(b.length)}function i(a){return"string"==typeof a?a:a.displayName||a.name||"Unknown"}function j(a){return a.finished||a.headersSent}function k(a){let b=a.split("?");return b[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(b[1]?"?"+b.slice(1).join("?"):"")}async function l(a,b){let c=b.res||b.ctx&&b.ctx.res;if(!a.getInitialProps)return b.ctx&&b.Component?{pageProps:await l(b.Component,b.ctx)}:{};let d=await a.getInitialProps(b);if(c&&j(c))return d;if(!d)throw Object.defineProperty(Error('"'+i(a)+'.getInitialProps()" should resolve to an object. But found "'+d+'" instead.'),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return d}let m="undefined"!=typeof performance,n=m&&["mark","measure","getEntriesByName"].every(a=>"function"==typeof performance[a]);class o extends Error{}class p extends Error{}class q extends Error{constructor(a){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message="Cannot find module for page: "+a}}class r extends Error{constructor(a,b){super(),this.message="Failed to load static file for page: "+a+" "+b}}class s extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function t(a){return JSON.stringify({message:a.message,stack:a.stack})}},7804:(a,b)=>{b._=function(a){return a&&a.__esModule?a:{default:a}}},8732:a=>{a.exports=require("react/jsx-runtime")}};var b=require("../webpack-runtime.js");b.C(a);var c=b(b.s=625);module.exports=c})();

View File

@@ -1 +0,0 @@
{"version":1,"files":["../../../node_modules/next/dist/pages/_app.js","../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/react/package.json","../../../package.json","../../package.json","../webpack-runtime.js"]}

View File

@@ -1 +0,0 @@
"use strict";(()=>{var a={};a.id=220,a.ids=[220],a.modules={361:a=>{a.exports=require("next/dist/compiled/next-server/pages.runtime.prod.js")},2015:a=>{a.exports=require("react")},8732:a=>{a.exports=require("react/jsx-runtime")},9902:a=>{a.exports=require("path")}};var b=require("../webpack-runtime.js");b.C(a);var c=b.X(0,[611],()=>b(b.s=5611));module.exports=c})();

View File

@@ -1 +0,0 @@
{"version":1,"files":["../../../node_modules/client-only/index.js","../../../node_modules/client-only/package.json","../../../node_modules/next/dist/client/components/app-router-headers.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/next-server/pages.runtime.prod.js","../../../node_modules/next/dist/lib/client-and-server-references.js","../../../node_modules/next/dist/lib/constants.js","../../../node_modules/next/dist/lib/interop-default.js","../../../node_modules/next/dist/lib/is-error.js","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/pages/_document.js","../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../node_modules/next/dist/server/lib/cache-handlers/default.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../node_modules/next/dist/server/lib/lru-cache.js","../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/dist/server/load-manifest.external.js","../../../node_modules/next/dist/server/response-cache/types.js","../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../node_modules/next/package.json","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","../../../node_modules/react-dom/package.json","../../../node_modules/react-dom/server.browser.js","../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/react/package.json","../../../node_modules/styled-jsx/dist/index/index.js","../../../node_modules/styled-jsx/index.js","../../../node_modules/styled-jsx/package.json","../../../package.json","../../package.json","../chunks/611.js","../webpack-runtime.js"]}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"version":1,"files":["../../../node_modules/client-only/index.js","../../../node_modules/client-only/package.json","../../../node_modules/next/dist/client/components/app-router-headers.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/next-server/pages.runtime.prod.js","../../../node_modules/next/dist/lib/client-and-server-references.js","../../../node_modules/next/dist/lib/constants.js","../../../node_modules/next/dist/lib/interop-default.js","../../../node_modules/next/dist/lib/is-error.js","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../node_modules/next/dist/server/lib/cache-handlers/default.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../node_modules/next/dist/server/lib/lru-cache.js","../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/dist/server/load-manifest.external.js","../../../node_modules/next/dist/server/response-cache/types.js","../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../node_modules/next/dist/shared/lib/no-fallback-error.external.js","../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../node_modules/next/package.json","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","../../../node_modules/react-dom/package.json","../../../node_modules/react-dom/server.browser.js","../../../node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/react/package.json","../../../node_modules/styled-jsx/dist/index/index.js","../../../node_modules/styled-jsx/index.js","../../../node_modules/styled-jsx/package.json","../../package.json","../chunks/611.js","../webpack-runtime.js"]}

View File

@@ -1 +1 @@
self.__RSC_SERVER_MANIFEST="{\"node\":{},\"edge\":{},\"encryptionKey\":\"process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY\"}"
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY\"\n}"

View File

@@ -1 +1,5 @@
{"node":{},"edge":{},"encryptionKey":"bZKZvsl0UR/KJLDuYay0UyzdUDb6YtLgVKHKsxQJQbw="}
{
"node": {},
"edge": {},
"encryptionKey": "9djQPjAcYXGjb7n562VmFWdUX0fr+GWjzGpIaDXDTlo="
}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
LpwQF7EXxmhvU508XYUZO

View File

@@ -1,50 +0,0 @@
{
"pages": {
"/_not-found/page": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/_not-found/page-8ae677fd71c01a9b.js"
],
"/layout": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/css/50f03bdf6e668d47.css",
"static/chunks/app/layout-97ddb14a3955532f.js"
],
"/api/early-access/route": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/api/early-access/route-5e4dc48fa12e4d8d.js"
],
"/api/health/route": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/api/health/route-5e4dc48fa12e4d8d.js"
],
"/page": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/b536a0f1-f2bc0f0a45231000.js",
"static/chunks/bd904a5c-4e91fa25e102b5d3.js",
"static/chunks/339-1f5190ae812b0d1d.js",
"static/chunks/app/page-b61a327a23303e7e.js"
],
"/privacy/page": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js",
"static/chunks/app/privacy/page-0abefd9b9529a699.js"
]
}
}

View File

@@ -1,7 +0,0 @@
{
"/_not-found/page": "/_not-found",
"/api/early-access/route": "/api/early-access",
"/api/health/route": "/api/health",
"/page": "/",
"/privacy/page": "/privacy"
}

View File

@@ -1,33 +0,0 @@
{
"polyfillFiles": [
"static/chunks/polyfills-42372ed130431b0a.js"
],
"devFiles": [],
"ampDevFiles": [],
"lowPriorityFiles": [
"static/LpwQF7EXxmhvU508XYUZO/_buildManifest.js",
"static/LpwQF7EXxmhvU508XYUZO/_ssgManifest.js"
],
"rootMainFiles": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/4bd1b696-c023c6e3521b1417.js",
"static/chunks/255-d2f9158a50b3f321.js",
"static/chunks/main-app-000f416d9670fe3f.js"
],
"rootMainFilesTree": {},
"pages": {
"/_app": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/framework-a6e0b7e30f98059a.js",
"static/chunks/main-bfb7af9b6314f3ce.js",
"static/chunks/pages/_app-7d307437aca18ad4.js"
],
"/_error": [
"static/chunks/webpack-fddcf5b4cf83a013.js",
"static/chunks/framework-a6e0b7e30f98059a.js",
"static/chunks/main-bfb7af9b6314f3ce.js",
"static/chunks/pages/_error-cb2a52f75f2162e2.js"
]
},
"ampFirstPages": []
}

View File

@@ -1 +0,0 @@
{"type": "commonjs"}

View File

@@ -1,85 +0,0 @@
{
"version": 4,
"routes": {
"/_not-found": {
"initialStatus": 404,
"experimentalBypassFor": [
{
"type": "header",
"key": "next-action"
},
{
"type": "header",
"key": "content-type",
"value": "multipart/form-data;.*"
}
],
"initialRevalidateSeconds": false,
"srcRoute": "/_not-found",
"dataRoute": "/_not-found.rsc",
"allowHeader": [
"host",
"x-matched-path",
"x-prerender-revalidate",
"x-prerender-revalidate-if-generated",
"x-next-revalidated-tags",
"x-next-revalidate-tag-token"
]
},
"/privacy": {
"experimentalBypassFor": [
{
"type": "header",
"key": "next-action"
},
{
"type": "header",
"key": "content-type",
"value": "multipart/form-data;.*"
}
],
"initialRevalidateSeconds": false,
"srcRoute": "/privacy",
"dataRoute": "/privacy.rsc",
"allowHeader": [
"host",
"x-matched-path",
"x-prerender-revalidate",
"x-prerender-revalidate-if-generated",
"x-next-revalidated-tags",
"x-next-revalidate-tag-token"
]
},
"/": {
"experimentalBypassFor": [
{
"type": "header",
"key": "next-action"
},
{
"type": "header",
"key": "content-type",
"value": "multipart/form-data;.*"
}
],
"initialRevalidateSeconds": false,
"srcRoute": "/",
"dataRoute": "/index.rsc",
"allowHeader": [
"host",
"x-matched-path",
"x-prerender-revalidate",
"x-prerender-revalidate-if-generated",
"x-next-revalidated-tags",
"x-next-revalidate-tag-token"
]
}
},
"dynamicRoutes": {},
"notFoundRoutes": [],
"preview": {
"previewModeId": "b1aa30b7e175d2a1717a7b378440146f",
"previewModeSigningKey": "e1c56ccd2c096b45b5f8b7833ff83afe69ced05a28b8f9af6b8ef6e099be5c2a",
"previewModeEncryptionKey": "4b62fef44de56bf8a0237e4935747a8142567c28cdbc6fdf0fd6b3712ee90e8e"
}
}

View File

@@ -1,331 +0,0 @@
{
"version": 1,
"config": {
"env": {},
"webpack": null,
"eslint": {
"ignoreDuringBuilds": false
},
"typescript": {
"ignoreBuildErrors": false,
"tsconfigPath": "tsconfig.json"
},
"typedRoutes": false,
"distDir": ".next",
"cleanDistDir": true,
"assetPrefix": "",
"cacheMaxMemorySize": 52428800,
"configOrigin": "next.config.js",
"useFileSystemPublicRoutes": true,
"generateEtags": true,
"pageExtensions": [
"tsx",
"ts",
"jsx",
"js"
],
"poweredByHeader": true,
"compress": true,
"images": {
"deviceSizes": [
640,
750,
828,
1080,
1200,
1920,
2048,
3840
],
"imageSizes": [
16,
32,
48,
64,
96,
128,
256,
384
],
"path": "/_next/image",
"loader": "default",
"loaderFile": "",
"domains": [
"localhost"
],
"disableStaticImages": false,
"minimumCacheTTL": 60,
"formats": [
"image/webp"
],
"dangerouslyAllowSVG": false,
"contentSecurityPolicy": "script-src 'none'; frame-src 'none'; sandbox;",
"contentDispositionType": "attachment",
"remotePatterns": [],
"unoptimized": false
},
"devIndicators": {
"position": "bottom-left"
},
"onDemandEntries": {
"maxInactiveAge": 60000,
"pagesBufferLength": 5
},
"amp": {
"canonicalBase": ""
},
"basePath": "",
"sassOptions": {},
"trailingSlash": false,
"i18n": null,
"productionBrowserSourceMaps": false,
"excludeDefaultMomentLocales": true,
"serverRuntimeConfig": {},
"publicRuntimeConfig": {},
"reactProductionProfiling": false,
"reactStrictMode": null,
"reactMaxHeadersLength": 6000,
"httpAgentOptions": {
"keepAlive": true
},
"logging": {},
"compiler": {},
"expireTime": 31536000,
"staticPageGenerationTimeout": 60,
"output": "standalone",
"modularizeImports": {
"@mui/icons-material": {
"transform": "@mui/icons-material/{{member}}"
},
"lodash": {
"transform": "lodash/{{member}}"
}
},
"outputFileTracingRoot": "/home/tony/chorus/project-queues/active/chorus.services/modules/teaser",
"experimental": {
"useSkewCookie": false,
"cacheLife": {
"default": {
"stale": 300,
"revalidate": 900,
"expire": 4294967294
},
"seconds": {
"stale": 30,
"revalidate": 1,
"expire": 60
},
"minutes": {
"stale": 300,
"revalidate": 60,
"expire": 3600
},
"hours": {
"stale": 300,
"revalidate": 3600,
"expire": 86400
},
"days": {
"stale": 300,
"revalidate": 86400,
"expire": 604800
},
"weeks": {
"stale": 300,
"revalidate": 604800,
"expire": 2592000
},
"max": {
"stale": 300,
"revalidate": 2592000,
"expire": 4294967294
}
},
"cacheHandlers": {},
"cssChunking": true,
"multiZoneDraftMode": false,
"appNavFailHandling": false,
"prerenderEarlyExit": true,
"serverMinification": true,
"serverSourceMaps": false,
"linkNoTouchStart": false,
"caseSensitiveRoutes": false,
"clientSegmentCache": false,
"clientParamParsing": false,
"dynamicOnHover": false,
"preloadEntriesOnStart": true,
"clientRouterFilter": true,
"clientRouterFilterRedirects": false,
"fetchCacheKeyPrefix": "",
"middlewarePrefetch": "flexible",
"optimisticClientCache": true,
"manualClientBasePath": false,
"cpus": 15,
"memoryBasedWorkersCount": false,
"imgOptConcurrency": null,
"imgOptTimeoutInSeconds": 7,
"imgOptMaxInputPixels": 268402689,
"imgOptSequentialRead": null,
"imgOptSkipMetadata": null,
"isrFlushToDisk": true,
"workerThreads": false,
"optimizeCss": false,
"nextScriptWorkers": false,
"scrollRestoration": false,
"externalDir": false,
"disableOptimizedLoading": false,
"gzipSize": true,
"craCompat": false,
"esmExternals": true,
"fullySpecified": false,
"swcTraceProfiling": false,
"forceSwcTransforms": false,
"largePageDataBytes": 128000,
"typedEnv": false,
"parallelServerCompiles": false,
"parallelServerBuildTraces": false,
"ppr": false,
"authInterrupts": false,
"webpackMemoryOptimizations": false,
"optimizeServerReact": true,
"viewTransition": false,
"routerBFCache": false,
"removeUncaughtErrorAndRejectionListeners": false,
"validateRSCRequestHeaders": false,
"staleTimes": {
"dynamic": 0,
"static": 300
},
"serverComponentsHmrCache": true,
"staticGenerationMaxConcurrency": 8,
"staticGenerationMinPagesPerWorker": 25,
"cacheComponents": false,
"inlineCss": false,
"useCache": false,
"globalNotFound": false,
"devtoolSegmentExplorer": true,
"browserDebugInfoInTerminal": false,
"optimizeRouterScrolling": false,
"optimizePackageImports": [
"lucide-react",
"date-fns",
"lodash-es",
"ramda",
"antd",
"react-bootstrap",
"ahooks",
"@ant-design/icons",
"@headlessui/react",
"@headlessui-float/react",
"@heroicons/react/20/solid",
"@heroicons/react/24/solid",
"@heroicons/react/24/outline",
"@visx/visx",
"@tremor/react",
"rxjs",
"@mui/material",
"@mui/icons-material",
"recharts",
"react-use",
"effect",
"@effect/schema",
"@effect/platform",
"@effect/platform-node",
"@effect/platform-browser",
"@effect/platform-bun",
"@effect/sql",
"@effect/sql-mssql",
"@effect/sql-mysql2",
"@effect/sql-pg",
"@effect/sql-sqlite-node",
"@effect/sql-sqlite-bun",
"@effect/sql-sqlite-wasm",
"@effect/sql-sqlite-react-native",
"@effect/rpc",
"@effect/rpc-http",
"@effect/typeclass",
"@effect/experimental",
"@effect/opentelemetry",
"@material-ui/core",
"@material-ui/icons",
"@tabler/icons-react",
"mui-core",
"react-icons/ai",
"react-icons/bi",
"react-icons/bs",
"react-icons/cg",
"react-icons/ci",
"react-icons/di",
"react-icons/fa",
"react-icons/fa6",
"react-icons/fc",
"react-icons/fi",
"react-icons/gi",
"react-icons/go",
"react-icons/gr",
"react-icons/hi",
"react-icons/hi2",
"react-icons/im",
"react-icons/io",
"react-icons/io5",
"react-icons/lia",
"react-icons/lib",
"react-icons/lu",
"react-icons/md",
"react-icons/pi",
"react-icons/ri",
"react-icons/rx",
"react-icons/si",
"react-icons/sl",
"react-icons/tb",
"react-icons/tfi",
"react-icons/ti",
"react-icons/vsc",
"react-icons/wi"
],
"trustHostHeader": false,
"isExperimentalCompile": false
},
"htmlLimitedBots": "[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight",
"bundlePagesRouterDependencies": false,
"configFileName": "next.config.js",
"turbopack": {
"root": "/home/tony/chorus/project-queues/active/chorus.services/modules/teaser"
},
"_originalRewrites": {
"beforeFiles": [],
"afterFiles": [
{
"source": "/api/early-access",
"destination": "/api/early-access"
}
],
"fallback": []
}
},
"appDir": "/home/tony/chorus/project-queues/active/chorus.services/modules/teaser",
"relativeAppDir": "",
"files": [
".next/routes-manifest.json",
".next/server/pages-manifest.json",
".next/build-manifest.json",
".next/prerender-manifest.json",
".next/server/functions-config-manifest.json",
".next/server/middleware-manifest.json",
".next/server/middleware-build-manifest.js",
".next/server/middleware-react-loadable-manifest.js",
".next/react-loadable-manifest.json",
".next/server/app-paths-manifest.json",
".next/app-path-routes-manifest.json",
".next/app-build-manifest.json",
".next/server/server-reference-manifest.js",
".next/server/server-reference-manifest.json",
".next/BUILD_ID",
".next/server/next-font-manifest.js",
".next/server/next-font-manifest.json",
".next/required-server-files.json"
],
"ignore": [
"node_modules/next/dist/compiled/@ampproject/toolbox-optimizer/**/*"
]
}

View File

@@ -1,84 +0,0 @@
{
"version": 3,
"pages404": true,
"caseSensitive": false,
"basePath": "",
"redirects": [
{
"source": "/:path+/",
"destination": "/:path+",
"internal": true,
"statusCode": 308,
"regex": "^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))/$"
}
],
"headers": [
{
"source": "/:path*",
"headers": [
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "Referrer-Policy",
"value": "strict-origin-when-cross-origin"
}
],
"regex": "^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))?(?:/)?$"
}
],
"rewrites": {
"beforeFiles": [],
"afterFiles": [
{
"source": "/api/early-access",
"destination": "/api/early-access",
"regex": "^/api/early-access(?:/)?$"
}
],
"fallback": []
},
"dynamicRoutes": [],
"staticRoutes": [
{
"page": "/",
"regex": "^/(?:/)?$",
"routeKeys": {},
"namedRegex": "^/(?:/)?$"
},
{
"page": "/_not-found",
"regex": "^/_not\\-found(?:/)?$",
"routeKeys": {},
"namedRegex": "^/_not\\-found(?:/)?$"
},
{
"page": "/privacy",
"regex": "^/privacy(?:/)?$",
"routeKeys": {},
"namedRegex": "^/privacy(?:/)?$"
}
],
"dataRoutes": [],
"rsc": {
"header": "rsc",
"varyHeader": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch",
"prefetchHeader": "next-router-prefetch",
"didPostponeHeader": "x-nextjs-postponed",
"contentTypeHeader": "text/x-component",
"suffix": ".rsc",
"prefetchSuffix": ".prefetch.rsc",
"prefetchSegmentHeader": "next-router-segment-prefetch",
"prefetchSegmentSuffix": ".segment.rsc",
"prefetchSegmentDirSuffix": ".segments"
},
"rewriteHeaders": {
"pathHeader": "x-nextjs-rewritten-path",
"queryHeader": "x-nextjs-rewritten-query"
}
}

View File

@@ -1,7 +0,0 @@
{
"/_not-found/page": "app/_not-found/page.js",
"/api/early-access/route": "app/api/early-access/route.js",
"/api/health/route": "app/api/health/route.js",
"/page": "app/page.js",
"/privacy/page": "app/privacy/page.js"
}

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +0,0 @@
{
"status": 404,
"headers": {
"x-nextjs-stale-time": "300",
"x-nextjs-prerender": "1",
"x-next-cache-tags": "_N_T_/layout,_N_T_/_not-found/layout,_N_T_/_not-found/page,_N_T_/_not-found"
}
}

Some files were not shown because too many files have changed in this diff Show More