"Initial commit from Astro"

This commit is contained in:
houston[bot]
2026-07-14 12:21:47 +03:00
committed by suphicakir
commit a80849829a
82 changed files with 9011 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# jetbrains setting folder
.idea/
+4
View File
@@ -0,0 +1,4 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}
+11
View File
@@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}
+22
View File
@@ -0,0 +1,22 @@
## Development
When starting the dev server, use background mode:
```
astro dev --background
```
Manage the background server with `astro dev stop`, `astro dev status`, and `astro dev logs`.
## Documentation
Full documentation: https://docs.astro.build
Consult these guides before working on related tasks:
- [Adding pages, dynamic routes, or middleware](https://docs.astro.build/en/guides/routing/)
- [Working with Astro components](https://docs.astro.build/en/basics/astro-components/)
- [Using React, Vue, Svelte, or other framework components](https://docs.astro.build/en/guides/framework-components/)
- [Adding or managing content](https://docs.astro.build/en/guides/content-collections/)
- [Adding styles or using Tailwind](https://docs.astro.build/en/guides/styling/)
- [Supporting multiple languages](https://docs.astro.build/en/guides/internationalization/)
Symlink
+1
View File
@@ -0,0 +1 @@
AGENTS.md
+46
View File
@@ -0,0 +1,46 @@
# Astro Starter Kit: Basics
```sh
npm create astro@latest -- --template basics
```
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro project, you'll see the following folders and files:
```text
/
├── public/
│ └── favicon.svg
├── src
│   ├── assets
│   │   └── astro.svg
│   ├── components
│   │   └── Welcome.astro
│   ├── layouts
│   │   └── Layout.astro
│   └── pages
│   └── index.astro
└── package.json
```
To learn more about the folder structure of an Astro project, refer to [our guide on project structure](https://docs.astro.build/en/basics/project-structure/).
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
+25
View File
@@ -0,0 +1,25 @@
# NexusAI Free Automate AI Agents HTML Template
#### Preview
- [Demo](https://themewagon.github.io/nexusai/)
#### Download
- [Download from ThemeWagon](https://themewagon.com/themes/nexusai/)
## Getting Started
1. Clone Repository
```
git clone https://github.com/themewagon/nexusai.git
```
## Author
```
Design and code is completely written by Bestwpware and development team.
```
## License
- Design and Code is Copyright &copy; <a href="https://bestwpware.com/" target="_blank">Bestwpware</a>
- Licensed cover under [MIT]
- Distributed by <a href="https://themewagon.com" target="_blank">ThemeWagon</a>
+6
View File
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
+351
View File
@@ -0,0 +1,351 @@
/* Magnific Popup CSS */
.mfp-bg {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1042;
overflow: hidden;
position: fixed;
background: #0b0b0b;
opacity: 0.8; }
.mfp-wrap {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1043;
position: fixed;
outline: none !important;
-webkit-backface-visibility: hidden; }
.mfp-container {
text-align: center;
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
padding: 0 8px;
box-sizing: border-box; }
.mfp-container:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle; }
.mfp-align-top .mfp-container:before {
display: none; }
.mfp-content {
position: relative;
display: inline-block;
vertical-align: middle;
margin: 0 auto;
text-align: left;
z-index: 1045; }
.mfp-inline-holder .mfp-content,
.mfp-ajax-holder .mfp-content {
width: 100%;
cursor: auto; }
.mfp-ajax-cur {
cursor: progress; }
.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
cursor: -moz-zoom-out;
cursor: -webkit-zoom-out;
cursor: zoom-out; }
.mfp-zoom {
cursor: pointer;
cursor: -webkit-zoom-in;
cursor: -moz-zoom-in;
cursor: zoom-in; }
.mfp-auto-cursor .mfp-content {
cursor: auto; }
.mfp-close,
.mfp-arrow,
.mfp-preloader,
.mfp-counter {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none; }
.mfp-loading.mfp-figure {
display: none; }
.mfp-hide {
display: none !important; }
.mfp-preloader {
color: #CCC;
position: absolute;
top: 50%;
width: auto;
text-align: center;
margin-top: -0.8em;
left: 8px;
right: 8px;
z-index: 1044; }
.mfp-preloader a {
color: #CCC; }
.mfp-preloader a:hover {
color: #FFF; }
.mfp-s-ready .mfp-preloader {
display: none; }
.mfp-s-error .mfp-content {
display: none; }
button.mfp-close,
button.mfp-arrow {
overflow: visible;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
display: block;
outline: none;
padding: 0;
z-index: 1046;
box-shadow: none;
touch-action: manipulation; }
button::-moz-focus-inner {
padding: 0;
border: 0; }
.mfp-close {
width: 44px;
height: 44px;
line-height: 44px;
position: absolute;
right: 0;
top: 0;
text-decoration: none;
text-align: center;
opacity: 0.65;
padding: 0 0 18px 10px;
color: #FFF;
font-style: normal;
font-size: 28px;
font-family: Arial, Baskerville, monospace; }
.mfp-close:hover,
.mfp-close:focus {
opacity: 1; }
.mfp-close:active {
top: 1px; }
.mfp-close-btn-in .mfp-close {
color: #333; }
.mfp-image-holder .mfp-close,
.mfp-iframe-holder .mfp-close {
color: #FFF;
right: -6px;
text-align: right;
padding-right: 6px;
width: 100%; }
.mfp-counter {
position: absolute;
top: 0;
right: 0;
color: #CCC;
font-size: 12px;
line-height: 18px;
white-space: nowrap; }
.mfp-arrow {
position: absolute;
opacity: 0.65;
margin: 0;
top: 50%;
margin-top: -55px;
padding: 0;
width: 90px;
height: 110px;
-webkit-tap-highlight-color: transparent; }
.mfp-arrow:active {
margin-top: -54px; }
.mfp-arrow:hover,
.mfp-arrow:focus {
opacity: 1; }
.mfp-arrow:before,
.mfp-arrow:after {
content: '';
display: block;
width: 0;
height: 0;
position: absolute;
left: 0;
top: 0;
margin-top: 35px;
margin-left: 35px;
border: medium inset transparent; }
.mfp-arrow:after {
border-top-width: 13px;
border-bottom-width: 13px;
top: 8px; }
.mfp-arrow:before {
border-top-width: 21px;
border-bottom-width: 21px;
opacity: 0.7; }
.mfp-arrow-left {
left: 0; }
.mfp-arrow-left:after {
border-right: 17px solid #FFF;
margin-left: 31px; }
.mfp-arrow-left:before {
margin-left: 25px;
border-right: 27px solid #3F3F3F; }
.mfp-arrow-right {
right: 0; }
.mfp-arrow-right:after {
border-left: 17px solid #FFF;
margin-left: 39px; }
.mfp-arrow-right:before {
border-left: 27px solid #3F3F3F; }
.mfp-iframe-holder {
padding-top: 40px;
padding-bottom: 40px; }
.mfp-iframe-holder .mfp-content {
line-height: 0;
width: 100%;
max-width: 900px; }
.mfp-iframe-holder .mfp-close {
top: -40px; }
.mfp-iframe-scaler {
width: 100%;
height: 0;
overflow: hidden;
padding-top: 56.25%; }
.mfp-iframe-scaler iframe {
position: absolute;
display: block;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
background: #000; }
/* Main image in popup */
img.mfp-img {
width: auto;
max-width: 100%;
height: auto;
display: block;
line-height: 0;
box-sizing: border-box;
padding: 40px 0 40px;
margin: 0 auto; }
/* The shadow behind the image */
.mfp-figure {
line-height: 0; }
.mfp-figure:after {
content: '';
position: absolute;
left: 0;
top: 40px;
bottom: 40px;
display: block;
right: 0;
width: auto;
height: auto;
z-index: -1;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
background: #444; }
.mfp-figure small {
color: #BDBDBD;
display: block;
font-size: 12px;
line-height: 14px; }
.mfp-figure figure {
margin: 0; }
.mfp-bottom-bar {
margin-top: -36px;
position: absolute;
top: 100%;
left: 0;
width: 100%;
cursor: auto; }
.mfp-title {
text-align: left;
line-height: 18px;
color: #F3F3F3;
word-wrap: break-word;
padding-right: 36px; }
.mfp-image-holder .mfp-content {
max-width: 100%; }
.mfp-gallery .mfp-image-holder .mfp-figure {
cursor: pointer; }
@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
/**
* Remove all paddings around the image on small screen
*/
.mfp-img-mobile .mfp-image-holder {
padding-left: 0;
padding-right: 0; }
.mfp-img-mobile img.mfp-img {
padding: 0; }
.mfp-img-mobile .mfp-figure:after {
top: 0;
bottom: 0; }
.mfp-img-mobile .mfp-figure small {
display: inline;
margin-left: 5px; }
.mfp-img-mobile .mfp-bottom-bar {
background: rgba(0, 0, 0, 0.6);
bottom: 0;
margin: 0;
top: auto;
padding: 3px 5px;
position: fixed;
box-sizing: border-box; }
.mfp-img-mobile .mfp-bottom-bar:empty {
padding: 0; }
.mfp-img-mobile .mfp-counter {
right: 5px;
top: 3px; }
.mfp-img-mobile .mfp-close {
top: 0;
right: 0;
width: 35px;
height: 35px;
line-height: 35px;
background: rgba(0, 0, 0, 0.6);
position: fixed;
text-align: center;
padding: 0; } }
@media all and (max-width: 900px) {
.mfp-arrow {
-webkit-transform: scale(0.75);
transform: scale(0.75); }
.mfp-arrow-left {
-webkit-transform-origin: 0;
transform-origin: 0; }
.mfp-arrow-right {
-webkit-transform-origin: 100%;
transform-origin: 100%; }
.mfp-container {
padding-left: 6px;
padding-right: 6px; } }
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

+1370
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+7
View File
File diff suppressed because one or more lines are too long
+1
View File
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
+635
View File
@@ -0,0 +1,635 @@
/* STATE */
let isDark = true,
currentUser = null;
let chatHistory = [];
/* THEME */
function toggleTheme() {
isDark = !isDark;
document.getElementById('htmlRoot').classList.toggle('lm', !isDark);
// Landing icons
const si = document.getElementById('suni'),
mi = document.getElementById('mooni');
if (si) {
si.style.display = isDark ? 'none' : 'inline';
mi.style.display = isDark ? 'inline' : 'none';
}
// Dashboard icons
const dsi = document.getElementById('dbSunI'),
dmi = document.getElementById('dbMoonI');
if (dsi) {
dsi.style.display = isDark ? 'none' : 'inline';
dmi.style.display = isDark ? 'inline' : 'none';
}
// Sync settings toggle
const dmtog = document.getElementById('darkModeToggle');
if (dmtog) dmtog.checked = isDark;
// Update charts
updateChartColors();
}
document.getElementById('thbtn').addEventListener('click', toggleTheme);
/* NAVBAR */
window.addEventListener('scroll', () => document.getElementById('nbar').classList.toggle('scr', scrollY > 40));
let mbOpen = false;
document.getElementById('mbtog').addEventListener('click', () => {
mbOpen = !mbOpen;
document.getElementById('mbmenu').classList.toggle('open', mbOpen);
document.getElementById('barIcon').style.display = mbOpen ? 'none' : 'inline';
document.getElementById('xIcon').style.display = mbOpen ? 'inline' : 'none';
});
document.querySelectorAll('#mbmenu a, #mbmenu button').forEach(el =>
el.addEventListener('click', () => {
mbOpen = false;
document.getElementById('mbmenu').classList.remove('open');
document.getElementById('barIcon').style.display = 'inline';
document.getElementById('xIcon').style.display = 'none';
})
);
/* REVEAL */
const rvObs = new IntersectionObserver(
entries => entries.forEach(e => {
if (e.isIntersecting) e.target.classList.add('in');
}), {
threshold: 0.1,
rootMargin: '0px 0px -40px 0px'
}
);
document.querySelectorAll('.rv').forEach(el => rvObs.observe(el));
/* VIDEO POPUP */
$('.vidpop').magnificPopup({
type: 'iframe',
iframe: {
patterns: {
youtube: {
index: 'youtube.com/',
id: 'v=',
src: 'https://www.youtube.com/embed/%id%?autoplay=1&rel=0'
}
}
},
mainClass: 'mfp-fade',
removalDelay: 160
});
/* PRICING TOGGLE */
document.getElementById('ptog').addEventListener('change', function() {
const y = this.checked;
document.getElementById('ptogThumb').style.transform = y ? 'translateX(24px)' : 'translateX(0)';
document.querySelectorAll('.pv').forEach(el => el.textContent = y ? el.dataset.y : el.dataset.m);
document.querySelectorAll('.pper').forEach((el, i) => {
if (i < 2) el.textContent = y ? 'per month, billed yearly' : 'per month, billed monthly';
});
});
/* AUTH FUNCTIONS */
function swTab(t) {
const isL = t === 'login';
document.getElementById('fLogin').style.display = isL ? 'block' : 'none';
document.getElementById('fSignup').style.display = isL ? 'none' : 'block';
document.getElementById('tabLogin').classList.toggle('on', isL);
document.getElementById('tabSignup').classList.toggle('on', !isL);
document.getElementById('loginErr').style.display = 'none';
document.getElementById('signupErr').style.display = 'none';
}
function showErrLogin(msg) {
const el = document.getElementById('loginErr');
document.getElementById('loginErrMsg').textContent = msg;
el.style.display = 'block';
}
function showErrSignup(msg) {
const el = document.getElementById('signupErr');
document.getElementById('signupErrMsg').textContent = msg;
el.style.display = 'block';
}
function setLoading(btnId, loading) {
const btn = document.getElementById(btnId);
if (loading) {
btn.disabled = true;
btn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Please wait...';
} else {
btn.disabled = false;
if (btnId === 'loginBtn') btn.innerHTML = 'Log In <i class="fa-solid fa-arrow-right ms-1 fa-sm"></i>';
else btn.innerHTML = 'Create Free Account <i class="fa-solid fa-arrow-right ms-1 fa-sm"></i>';
}
}
function doLogin() {
const email = document.getElementById('loginEmail').value.trim();
const pass = document.getElementById('loginPass').value;
document.getElementById('loginErr').style.display = 'none';
if (!email) return showErrLogin('Please enter your email address.');
if (!pass) return showErrLogin('Please enter your password.');
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) return showErrLogin('Please enter a valid email address.');
if (pass.length < 6) return showErrLogin('Password must be at least 6 characters.');
setLoading('loginBtn', true);
setTimeout(() => {
setLoading('loginBtn', false);
const name = email.split('@')[0].replace(/[._]/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
loginSuccess({
name,
email,
plan: 'Pro Plan'
});
}, 900);
}
function doSignup() {
const name = document.getElementById('signupName').value.trim();
const email = document.getElementById('signupEmail').value.trim();
const pass = document.getElementById('signupPass').value;
document.getElementById('signupErr').style.display = 'none';
if (!name) return showErrSignup('Please enter your full name.');
if (!email) return showErrSignup('Please enter your email address.');
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) return showErrSignup('Please enter a valid email address.');
if (pass.length < 8) return showErrSignup('Password must be at least 8 characters.');
setLoading('signupBtn', true);
setTimeout(() => {
setLoading('signupBtn', false);
loginSuccess({
name,
email,
plan: 'Starter (Trial)'
});
}, 1000);
}
function quickLogin(provider) {
const names = {
google: 'Alex Johnson',
github: 'Dev User'
};
const emails = {
google: 'user@gmail.com',
github: 'user@github.com'
};
// close offcanvas
bootstrap.Offcanvas.getInstance(document.getElementById('lofc'))?.hide();
setTimeout(() => loginSuccess({
name: names[provider],
email: emails[provider],
plan: 'Pro Plan'
}), 300);
}
function loginSuccess(user) {
currentUser = user;
chatHistory = [];
const oc = bootstrap.Offcanvas.getInstance(document.getElementById('lofc'));
if (oc) oc.hide();
const initials = user.name.split(' ').map(w => w[0]).join('').toUpperCase().slice(0, 2);
// topbar
document.getElementById('userAvatar').textContent = initials;
document.getElementById('userName').textContent = user.name;
document.getElementById('userPlan').textContent = user.plan;
// profile dropdown
document.getElementById('pdAvatar').textContent = initials;
document.getElementById('pdName').textContent = user.name;
document.getElementById('pdEmail').textContent = user.email;
document.getElementById('pdPlan').textContent = user.plan;
document.getElementById('pdPlanDetail').textContent = user.plan;
// greeting + settings
document.getElementById('greetName').textContent = user.name.split(' ')[0];
document.getElementById('settingsAvatar').textContent = initials;
document.getElementById('settingsName').textContent = user.name;
document.getElementById('settingsEmail').textContent = user.email;
document.getElementById('profileName').value = user.name;
document.getElementById('profileEmail').value = user.email;
// switch view
document.getElementById('landing').style.display = 'none';
document.getElementById('dashboard').style.display = 'block';
window.scrollTo(0, 0);
setTimeout(() => {
initOverviewChart();
}, 200);
}
function doLogout() {
currentUser = null;
chatHistory = [];
document.getElementById('dashboard').style.display = 'none';
document.getElementById('landing').style.display = 'block';
window.scrollTo(0, 0);
// reset chat UI
document.getElementById('chatBody').innerHTML = `
<div class="d-flex flex-column gap-1">
<div class="msg msg-ai">ðŸ Hi! I'm your NexusAI assistant. I can help you with support analytics, agent configuration, automation workflows, and business insights. What would you like to know?</div>
<div class="msg-time" style="align-self:flex-start;padding-left:4px">NexusAI · Just now</div>
</div>`;
}
/* DASHBOARD NAVIGATION */
function dbNav(section, btn) {
document.querySelectorAll('.db-nl').forEach(b => b.classList.remove('active'));
document.querySelectorAll('.db-section').forEach(s => s.classList.remove('active'));
if (btn) btn.classList.add('active');
// find the correct sidebar button if btn not provided
if (!btn) {
document.querySelectorAll('.db-nl').forEach(b => {
if (b.getAttribute('onclick') && b.getAttribute('onclick').includes("'" + section + "'")) b.classList.add('active');
});
}
const sec = document.getElementById('sec-' + section);
if (sec) {
sec.classList.add('active');
sec.style.animation = 'fadeIn .4s ease';
}
// close mobile sidebar + dropdowns
document.getElementById('dbSidebar').classList.remove('mob-open');
document.getElementById('notifDropdown')?.classList.remove('open');
document.getElementById('profileDropdown')?.classList.remove('open');
const ch = document.getElementById('profileChevron');
if (ch) ch.style.transform = 'rotate(0deg)';
// init charts when relevant section shown
if (section === 'analytics') setTimeout(initAnalyticsChart, 100);
if (section === 'overview') setTimeout(initOverviewChart, 100);
}
/* CHARTS */
let ovChartInst = null,
anChartInst = null;
function chartColors() {
return {
grid: isDark ? 'rgba(255,255,255,0.04)' : 'rgba(0,0,0,0.06)',
ticks: isDark ? '#6b6b8a' : '#7878a0'
};
}
function initOverviewChart() {
const ctx = document.getElementById('ovChart');
if (!ctx) return;
if (ovChartInst) {
ovChartInst.destroy();
ovChartInst = null;
}
const c = ctx.getContext('2d');
const g = c.createLinearGradient(0, 0, 0, 280);
g.addColorStop(0, 'rgba(139,92,246,0.35)');
g.addColorStop(1, 'rgba(59,130,246,0.02)');
const labels = Array.from({
length: 30
}, (_, i) => `${i+1}`);
const data = [420, 480, 510, 440, 600, 580, 720, 690, 750, 810, 780, 860, 820, 900, 940, 880, 960, 1020, 1100, 1080, 1150, 1200, 1180, 1260, 1310, 1280, 1350, 1400, 1460, 1520];
const {
grid,
ticks
} = chartColors();
ovChartInst = new Chart(ctx, {
type: 'line',
data: {
labels,
datasets: [{
label: 'Conversations',
data,
fill: true,
backgroundColor: g,
borderColor: '#8b5cf6',
borderWidth: 2.5,
pointRadius: 0,
pointHoverRadius: 5,
tension: .42
}]
},
options: {
responsive: true,
plugins: {
legend: {
display: false
},
tooltip: {
backgroundColor: 'rgba(22,22,42,.95)',
titleColor: '#a78bfa',
bodyColor: '#a8a8c8',
borderColor: 'rgba(139,92,246,.3)',
borderWidth: 1,
padding: 10,
callbacks: {
label: c => ' ' + c.parsed.y.toLocaleString() + ' conversations'
}
}
},
scales: {
x: {
grid: {
color: grid
},
ticks: {
color: ticks,
font: {
family: 'Space Grotesk',
size: 11
},
maxTicksLimit: 10
}
},
y: {
grid: {
color: grid
},
ticks: {
color: ticks,
font: {
family: 'Space Grotesk',
size: 11
},
callback: v => v >= 1000 ? (v / 1000).toFixed(1) + 'K' : v
}
}
}
}
});
}
function initAnalyticsChart() {
const ctx = document.getElementById('anChart');
if (!ctx) return;
if (anChartInst) {
anChartInst.destroy();
anChartInst = null;
}
const c = ctx.getContext('2d');
const g1 = c.createLinearGradient(0, 0, 0, 250);
g1.addColorStop(0, 'rgba(139,92,246,0.3)');
g1.addColorStop(1, 'rgba(139,92,246,0.01)');
const g2 = c.createLinearGradient(0, 0, 0, 250);
g2.addColorStop(0, 'rgba(52,211,153,0.2)');
g2.addColorStop(1, 'rgba(52,211,153,0.01)');
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const {
grid,
ticks
} = chartColors();
anChartInst = new Chart(ctx, {
type: 'line',
data: {
labels: months,
datasets: [{
label: 'Conversations',
data: [8200, 9100, 10400, 9800, 11200, 12800, 14100, 15600, 17200, 19000, 21400, 24800],
fill: true,
backgroundColor: g1,
borderColor: '#8b5cf6',
borderWidth: 2.5,
pointRadius: 3,
pointBackgroundColor: '#8b5cf6',
tension: .4
},
{
label: 'Resolved by AI',
data: [6560, 7644, 8736, 8330, 9632, 11264, 12408, 13728, 15136, 16720, 18834, 22016],
fill: true,
backgroundColor: g2,
borderColor: '#34d399',
borderWidth: 2,
pointRadius: 3,
pointBackgroundColor: '#34d399',
tension: .4
}
]
},
options: {
responsive: true,
plugins: {
legend: {
display: true,
labels: {
color: isDark ? '#a8a8c8' : '#3d3d5c',
font: {
family: 'Space Grotesk',
size: 12
},
boxWidth: 12,
borderRadius: 4
}
},
tooltip: {
backgroundColor: 'rgba(22,22,42,.95)',
titleColor: '#a78bfa',
bodyColor: '#a8a8c8',
borderColor: 'rgba(139,92,246,.3)',
borderWidth: 1,
padding: 10
}
},
scales: {
x: {
grid: {
color: grid
},
ticks: {
color: ticks,
font: {
family: 'Space Grotesk',
size: 11
}
}
},
y: {
grid: {
color: grid
},
ticks: {
color: ticks,
font: {
family: 'Space Grotesk',
size: 11
},
callback: v => v >= 1000 ? (v / 1000).toFixed(1) + 'K' : v
}
}
}
}
});
}
function updateChartColors() {
[ovChartInst, anChartInst].forEach(ch => {
if (!ch) return;
const {
grid,
ticks
} = chartColors();
ch.options.scales.x.grid.color = grid;
ch.options.scales.x.ticks.color = ticks;
ch.options.scales.y.grid.color = grid;
ch.options.scales.y.ticks.color = ticks;
if (ch.options.plugins.legend) ch.options.plugins.legend.labels.color = isDark ? '#a8a8c8' : '#3d3d5c';
ch.update();
});
}
/* AI CHAT (Anthropic API) */
async function sendChat() {
const inp = document.getElementById('chatInp');
const msg = inp.value.trim();
if (!msg) return;
inp.value = '';
inp.style.height = 'auto';
appendMsg(msg, 'user');
chatHistory.push({
role: 'user',
content: msg
});
document.getElementById('chatSendBtn').disabled = true;
const typingId = appendTyping();
try {
const res = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'claude-sonnet-4-20250514',
max_tokens: 1000,
system: `You are NexusAI, an intelligent AI assistant built into the NexusAI business automation platform. The user is ${currentUser?.name || 'a user'} on the ${currentUser?.plan || 'Pro'} plan. You help with: AI agent performance, support ticket analytics, workflow automation suggestions, business metrics insights, and platform usage. Current platform stats: 24.8K conversations today, 98.2% resolution rate, 1.4s avg response, $18.2K monthly savings, 4 active agents. Be concise, professional, and data-driven. Use emojis sparingly.`,
messages: chatHistory
})
});
removeTyping(typingId);
if (res.ok) {
const data = await res.json();
const reply = data.content?.find(b => b.type === 'text')?.text || 'I could not generate a response.';
chatHistory.push({
role: 'assistant',
content: reply
});
appendMsg(reply, 'ai');
} else {
appendMsg('⚠️ Sorry, I had trouble connecting. Please check your API key or try again.', 'ai');
}
} catch (e) {
removeTyping(typingId);
appendMsg('⚠️ Network error. Please ensure you are connected to the internet.', 'ai');
}
document.getElementById('chatSendBtn').disabled = false;
}
function appendMsg(text, role) {
const body = document.getElementById('chatBody');
const time = new Date().toLocaleTimeString([], {
hour: '2-digit',
minute: '2-digit'
});
const wrap = document.createElement('div');
wrap.className = 'd-flex flex-column gap-1';
wrap.innerHTML = `
<div class="msg msg-${role}" style="animation:fadeIn .3s ease">${escapeHtml(text).replace(/\n/g,'<br>')}</div>
<div class="msg-time" style="align-self:${role==='ai'?'flex-start':'flex-end'};padding:0 4px">${role==='ai'?'NexusAI':'You'} · ${time}</div>`;
body.appendChild(wrap);
body.scrollTop = body.scrollHeight;
}
let typingCounter = 0;
function appendTyping() {
const id = 'typ-' + (++typingCounter);
const body = document.getElementById('chatBody');
const el = document.createElement('div');
el.id = id;
el.className = 'typing-ind';
el.innerHTML = '<div class="typing-dot"></div><div class="typing-dot"></div><div class="typing-dot"></div>';
body.appendChild(el);
body.scrollTop = body.scrollHeight;
return id;
}
function removeTyping(id) {
const el = document.getElementById(id);
if (el) el.remove();
}
function clearChat() {
chatHistory = [];
document.getElementById('chatBody').innerHTML = `
<div class="d-flex flex-column gap-1">
<div class="msg msg-ai">ðŸ Hi! I'm your NexusAI assistant. I can help you with support analytics, agent configuration, automation workflows, and business insights. What would you like to know?</div>
<div class="msg-time" style="align-self:flex-start;padding-left:4px">NexusAI · Just now</div>
</div>`;
}
function quickMsg(msg) {
document.getElementById('chatInp').value = msg;
sendChat();
}
function escapeHtml(t) {
return t.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
/* AUTO RESIZE TEXTAREA */
document.getElementById('chatInp')?.addEventListener('input', function() {
this.style.height = 'auto';
this.style.height = Math.min(this.scrollHeight, 100) + 'px';
});
/* NOTIFICATION DROPDOWN */
function toggleNotif(e) {
if (e) e.stopPropagation();
const nd = document.getElementById('notifDropdown');
const pd = document.getElementById('profileDropdown');
pd.classList.remove('open');
document.getElementById('profileChevron').style.transform = 'rotate(0deg)';
nd.classList.toggle('open');
}
function markAllRead() {
document.querySelectorAll('.notif-dot:not(.read)').forEach(d => d.classList.add('read'));
document.querySelectorAll('.notif-unread').forEach(n => n.classList.remove('notif-unread'));
document.getElementById('unreadCount').textContent = '0 new';
document.getElementById('unreadCount').style.background = 'rgba(139,92,246,.1)';
document.getElementById('unreadCount').style.color = '#a78bfa';
document.getElementById('notifBadge').style.display = 'none';
}
/* PROFILE DROPDOWN */
function toggleProfile(e) {
if (e) e.stopPropagation();
const pd = document.getElementById('profileDropdown');
const nd = document.getElementById('notifDropdown');
nd.classList.remove('open');
pd.classList.toggle('open');
document.getElementById('profileChevron').style.transform =
pd.classList.contains('open') ? 'rotate(180deg)' : 'rotate(0deg)';
}
/* Close dropdowns on outside click */
document.addEventListener('click', (e) => {
if (!document.getElementById('notifWrap')?.contains(e.target))
document.getElementById('notifDropdown')?.classList.remove('open');
if (!document.getElementById('profileWrap')?.contains(e.target)) {
document.getElementById('profileDropdown')?.classList.remove('open');
const ch = document.getElementById('profileChevron');
if (ch) ch.style.transform = 'rotate(0deg)';
}
});
/* LIVE ACTIVITY TICKER */
const activities = [
['#34d399', 'AI resolved shipping query for customer #4821'],
['#8b5cf6', 'Sales agent sent follow-up email to 5 leads'],
['#34d399', 'Refund processed automatically — $29.99'],
['#fbbf24', 'Escalation: account access issue → human agent'],
['#60a5fa', 'Data sync completed — 28 CRM records updated'],
['#34d399', 'Onboarding bot guided new user through setup'],
['#8b5cf6', 'Weekly performance report generated and sent'],
['#34d399', 'AI resolved 12 billing questions in 8 seconds'],
];
let actIdx = 0;
setInterval(() => {
const box = document.getElementById('liveActivity');
if (!box || !document.getElementById('sec-overview').classList.contains('active')) return;
const [color, text] = activities[actIdx % activities.length];
actIdx++;
const times = ['just now', '2s ago', '5s ago', '12s ago'];
const item = document.createElement('div');
item.style.cssText = 'display:flex;gap:10px;padding:10px;background:var(--bg3);border-radius:10px;font-size:.78rem;animation:fadeIn .4s ease';
item.innerHTML = `<span style="width:7px;height:7px;border-radius:50%;background:${color};margin-top:4px;flex-shrink:0"></span><span style="color:var(--tx2)">${text}</span><span style="margin-left:auto;color:var(--tx3);white-space:nowrap">${times[0]}</span>`;
box.insertBefore(item, box.firstChild);
if (box.children.length > 5) box.removeChild(box.lastChild);
}, 5000);
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
// @ts-check
import { defineConfig } from 'astro/config';
// https://astro.build/config
export default defineConfig({});
+4333
View File
File diff suppressed because it is too large Load Diff
+17
View File
@@ -0,0 +1,17 @@
{
"name": "",
"type": "module",
"version": "0.0.1",
"engines": {
"node": ">=22.12.0"
},
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"astro": "^7.0.9"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
<style>
path { fill: #000; }
@media (prefers-color-scheme: dark) {
path { fill: #FFF; }
}
</style>
</svg>

After

Width:  |  Height:  |  Size: 749 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" width="115" height="48"><path fill="#17191E" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="url(#a)" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="#17191E" d="M.02 30.31s4.02-1.95 8.05-1.95l3.04-9.4c.11-.45.44-.76.82-.76.37 0 .7.31.82.76l3.04 9.4c4.77 0 8.05 1.95 8.05 1.95L17 11.71c-.2-.56-.53-.91-.98-.91H7.83c-.44 0-.76.35-.97.9L.02 30.31Zm42.37-5.97c0 1.64-2.05 2.62-4.88 2.62-1.85 0-2.5-.45-2.5-1.41 0-1 .8-1.49 2.65-1.49 1.67 0 3.09.03 4.73.23v.05Zm.03-2.04a21.37 21.37 0 0 0-4.37-.36c-5.32 0-7.82 1.25-7.82 4.18 0 3.04 1.71 4.2 5.68 4.2 3.35 0 5.63-.84 6.46-2.92h.14c-.03.5-.05 1-.05 1.4 0 1.07.18 1.16 1.06 1.16h4.15a16.9 16.9 0 0 1-.36-4c0-1.67.06-2.93.06-4.62 0-3.45-2.07-5.64-8.56-5.64-2.8 0-5.9.48-8.26 1.19.22.93.54 2.83.7 4.06 2.04-.96 4.95-1.37 7.2-1.37 3.11 0 3.97.71 3.97 2.15v.57Zm11.37 3c-.56.07-1.33.07-2.12.07-.83 0-1.6-.03-2.12-.1l-.02.58c0 2.85 1.87 4.52 8.45 4.52 6.2 0 8.2-1.64 8.2-4.55 0-2.74-1.33-4.09-7.2-4.39-4.58-.2-4.99-.7-4.99-1.28 0-.66.59-1 3.65-1 3.18 0 4.03.43 4.03 1.35v.2a46.13 46.13 0 0 1 4.24.03l.02-.55c0-3.36-2.8-4.46-8.2-4.46-6.08 0-8.13 1.49-8.13 4.39 0 2.6 1.64 4.23 7.48 4.48 4.3.14 4.77.62 4.77 1.28 0 .7-.7 1.03-3.71 1.03-3.47 0-4.35-.48-4.35-1.47v-.13Zm19.82-12.05a17.5 17.5 0 0 1-6.24 3.48c.03.84.03 2.4.03 3.24l1.5.02c-.02 1.63-.04 3.6-.04 4.9 0 3.04 1.6 5.32 6.58 5.32 2.1 0 3.5-.23 5.23-.6a43.77 43.77 0 0 1-.46-4.13c-1.03.34-2.34.53-3.78.53-2 0-2.82-.55-2.82-2.13 0-1.37 0-2.65.03-3.84 2.57.02 5.13.07 6.64.11-.02-1.18.03-2.9.1-4.04-2.2.04-4.65.07-6.68.07l.07-2.93h-.16Zm13.46 6.04a767.33 767.33 0 0 1 .07-3.18H82.6c.07 1.96.07 3.98.07 6.92 0 2.95-.03 4.99-.07 6.93h5.18c-.09-1.37-.11-3.68-.11-5.65 0-3.1 1.26-4 4.12-4 1.33 0 2.28.16 3.1.46.03-1.16.26-3.43.4-4.43-.86-.25-1.81-.41-2.96-.41-2.46-.03-4.26.98-5.1 3.38l-.17-.02Zm22.55 3.65c0 2.5-1.8 3.66-4.64 3.66-2.81 0-4.61-1.1-4.61-3.66s1.82-3.52 4.61-3.52c2.82 0 4.64 1.03 4.64 3.52Zm4.71-.11c0-4.96-3.87-7.18-9.35-7.18-5.5 0-9.23 2.22-9.23 7.18 0 4.94 3.49 7.59 9.21 7.59 5.77 0 9.37-2.65 9.37-7.6Z"/><defs><linearGradient id="a" x1="6.33" x2="19.43" y1="40.8" y2="34.6" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="1024" fill="none"><path fill="url(#a)" fill-rule="evenodd" d="M-217.58 475.75c91.82-72.02 225.52-29.38 341.2-44.74C240 415.56 372.33 315.14 466.77 384.9c102.9 76.02 44.74 246.76 90.31 366.31 29.83 78.24 90.48 136.14 129.48 210.23 57.92 109.99 169.67 208.23 155.9 331.77-13.52 121.26-103.42 264.33-224.23 281.37-141.96 20.03-232.72-220.96-374.06-196.99-151.7 25.73-172.68 330.24-325.85 315.72-128.6-12.2-110.9-230.73-128.15-358.76-12.16-90.14 65.87-176.25 44.1-264.57-26.42-107.2-167.12-163.46-176.72-273.45-10.15-116.29 33.01-248.75 124.87-320.79Z" clip-rule="evenodd" style="opacity:.154"/><path fill="url(#b)" fill-rule="evenodd" d="M1103.43 115.43c146.42-19.45 275.33-155.84 413.5-103.59 188.09 71.13 409 212.64 407.06 413.88-1.94 201.25-259.28 278.6-414.96 405.96-130 106.35-240.24 294.39-405.6 265.3-163.7-28.8-161.93-274.12-284.34-386.66-134.95-124.06-436-101.46-445.82-284.6-9.68-180.38 247.41-246.3 413.54-316.9 101.01-42.93 207.83 21.06 316.62 6.61Z" clip-rule="evenodd" style="opacity:.154"/><defs><linearGradient id="b" x1="373" x2="1995.44" y1="1100" y2="118.03" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient><linearGradient id="a" x1="107.37" x2="1130.66" y1="1993.35" y2="1026.31" gradientUnits="userSpaceOnUse"><stop stop-color="#3245FF"/><stop offset="1" stop-color="#BC52EE"/></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+210
View File
@@ -0,0 +1,210 @@
---
import astroLogo from '../assets/astro.svg';
import background from '../assets/background.svg';
---
<div id="container">
<img id="background" src={background.src} alt="" fetchpriority="high" />
<main>
<section id="hero">
<a href="https://astro.build"
><img src={astroLogo.src} width="115" height="48" alt="Astro Homepage" /></a
>
<h1>
To get started, open the <code><pre>src/pages</pre></code> directory in your project.
</h1>
<section id="links">
<a class="button" href="https://docs.astro.build">Read our docs</a>
<a href="https://astro.build/chat"
>Join our Discord <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127.14 96.36"
><path
fill="currentColor"
d="M107.7 8.07A105.15 105.15 0 0 0 81.47 0a72.06 72.06 0 0 0-3.36 6.83 97.68 97.68 0 0 0-29.11 0A72.37 72.37 0 0 0 45.64 0a105.89 105.89 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.73 105.73 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.42 68.42 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.68 68.68 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.25 105.25 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15ZM42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69Zm42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69Z"
></path></svg
>
</a>
</section>
</section>
</main>
<a href="https://astro.build/blog/astro-6-beta/" id="news" class="box">
<svg width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"
><path
d="M24.667 12c1.333 1.414 2 3.192 2 5.334 0 4.62-4.934 5.7-7.334 12C18.444 28.567 18 27.456 18 26c0-4.642 6.667-7.053 6.667-14Zm-5.334-5.333c1.6 1.65 2.4 3.43 2.4 5.333 0 6.602-8.06 7.59-6.4 17.334C13.111 27.787 12 25.564 12 22.666c0-4.434 7.333-8 7.333-16Zm-6-5.333C15.111 3.555 16 5.556 16 7.333c0 8.333-11.333 10.962-5.333 22-3.488-.774-6-4-6-8 0-8.667 8.666-10 8.666-20Z"
fill="#111827"></path></svg
>
<h2>What's New in Astro 6.0?</h2>
<p>
Redesigned dev server, fonts, live collections, built-in CSP support, and more! Click to
explore Astro 6.0's new features.
</p>
</a>
</div>
<style>
#background {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
filter: blur(100px);
}
#container {
font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif;
height: 100%;
}
main {
height: 100%;
display: flex;
justify-content: center;
}
#hero {
display: flex;
align-items: start;
flex-direction: column;
justify-content: center;
padding: 16px;
}
h1 {
font-size: 22px;
margin-top: 0.25em;
}
#links {
display: flex;
gap: 16px;
}
#links a {
display: flex;
align-items: center;
padding: 10px 12px;
color: #111827;
text-decoration: none;
transition: color 0.2s;
}
#links a:hover {
color: rgb(78, 80, 86);
}
#links a svg {
height: 1em;
margin-left: 8px;
}
#links a.button {
color: white;
background: linear-gradient(83.21deg, #3245ff 0%, #bc52ee 100%);
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.12),
inset 0 -2px 0 rgba(0, 0, 0, 0.24);
border-radius: 10px;
}
#links a.button:hover {
color: rgb(230, 230, 230);
box-shadow: none;
}
pre {
font-family:
ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono',
monospace;
font-weight: normal;
background: linear-gradient(14deg, #d83333 0%, #f041ff 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin: 0;
}
h2 {
margin: 0 0 1em;
font-weight: normal;
color: #111827;
font-size: 20px;
}
p {
color: #4b5563;
font-size: 16px;
line-height: 24px;
letter-spacing: -0.006em;
margin: 0;
}
code {
display: inline-block;
background:
linear-gradient(66.77deg, #f3cddd 0%, #f5cee7 100%) padding-box,
linear-gradient(155deg, #d83333 0%, #f041ff 18%, #f5cee7 45%) border-box;
border-radius: 8px;
border: 1px solid transparent;
padding: 6px 8px;
}
.box {
padding: 16px;
background: rgba(255, 255, 255, 1);
border-radius: 16px;
border: 1px solid white;
}
#news {
position: absolute;
bottom: 16px;
right: 16px;
max-width: 300px;
text-decoration: none;
transition: background 0.2s;
backdrop-filter: blur(50px);
}
#news:hover {
background: rgba(255, 255, 255, 0.55);
}
@media screen and (max-height: 368px) {
#news {
display: none;
}
}
@media screen and (max-width: 768px) {
#container {
display: flex;
flex-direction: column;
}
#hero {
display: block;
padding-top: 10%;
}
#links {
flex-wrap: wrap;
}
#links a.button {
padding: 14px 18px;
}
#news {
right: 16px;
left: 16px;
bottom: 2.5rem;
max-width: 100%;
}
h1 {
line-height: 1.5;
}
}
</style>
+23
View File
@@ -0,0 +1,23 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" href="/favicon.ico" />
<meta name="generator" content={Astro.generator} />
<title>Astro Basics</title>
</head>
<body>
<slot />
</body>
</html>
<style>
html,
body {
margin: 0;
width: 100%;
height: 100%;
}
</style>
+11
View File
@@ -0,0 +1,11 @@
---
import Welcome from '../components/Welcome.astro';
import Layout from '../layouts/Layout.astro';
// Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build
// Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh.
---
<Layout>
<Welcome />
</Layout>
+5
View File
@@ -0,0 +1,5 @@
{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"]
}