@stacksjs/defaults 0.70.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +2 -0
- package/package.json +20 -0
- package/resources/assets/fonts/013717e9.woff +0 -0
- package/resources/assets/fonts/03355817.woff2 +0 -0
- package/resources/assets/fonts/0380de7e.woff2 +0 -0
- package/resources/assets/fonts/0ba5d32a.woff +0 -0
- package/resources/assets/fonts/0bd57ddf.woff2 +0 -0
- package/resources/assets/fonts/19de0a60.woff2 +0 -0
- package/resources/assets/fonts/20b87e84.woff +0 -0
- package/resources/assets/fonts/4bbc67e1.woff +0 -0
- package/resources/assets/fonts/576fb0d7.woff +0 -0
- package/resources/assets/fonts/5ea10ee5.woff2 +0 -0
- package/resources/assets/fonts/6413fc0a.woff +0 -0
- package/resources/assets/fonts/72c114cf.woff +0 -0
- package/resources/assets/fonts/73c57e73.woff2 +0 -0
- package/resources/assets/fonts/813dca6c.woff +0 -0
- package/resources/assets/fonts/8a9b0995.woff2 +0 -0
- package/resources/assets/fonts/90b4832f.woff +0 -0
- package/resources/assets/fonts/9394ab85.woff2 +0 -0
- package/resources/assets/fonts/9b3c7d7f.woff2 +0 -0
- package/resources/assets/fonts/Monaco.ttf +0 -0
- package/resources/assets/fonts/b1b36d74.woff +0 -0
- package/resources/assets/fonts/b5d74798.woff2 +0 -0
- package/resources/assets/fonts/b9f81a4d.woff +0 -0
- package/resources/assets/fonts/c9784008.woff2 +0 -0
- package/resources/assets/fonts/cf692227.woff +0 -0
- package/resources/assets/fonts/d1c6ab51.woff2 +0 -0
- package/resources/assets/fonts/e2eb62fc.woff +0 -0
- package/resources/assets/fonts/fe21f8d8.woff2 +0 -0
- package/resources/assets/fonts/nps/CampmateScript-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/NPS_2026-variable.woff2 +0 -0
- package/resources/assets/fonts/nps/RedwoodSerif-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/SequoiaSans-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/Switchback-Regular.woff2 +0 -0
- package/resources/assets/images/app-icon.png +0 -0
- package/resources/assets/images/bg-img.png +0 -0
- package/resources/assets/images/park-ridge.svg +15 -0
- package/resources/assets/images/topography.svg +1 -0
- package/resources/assets/scripts/main.ts +2153 -0
- package/resources/assets/styles/README.md +19 -0
- package/resources/assets/styles/docs/main.css +1 -0
- package/resources/assets/styles/docs/overrides.css +1 -0
- package/resources/assets/styles/docs/vars.css +8 -0
- package/resources/assets/styles/main.css +1419 -0
- package/resources/components/Button.stx +70 -0
- package/resources/components/Buttons/BaseButton.stx +39 -0
- package/resources/components/Buttons/Counter.stx +28 -0
- package/resources/components/Buttons/ToggleDark.stx +11 -0
- package/resources/components/Container.stx +10 -0
- package/resources/components/Dashboard/.gitkeep +0 -0
- package/resources/components/Dashboard/Auth/ForgotPassword.stx +127 -0
- package/resources/components/Dashboard/Auth/Login.stx +212 -0
- package/resources/components/Dashboard/Auth/Register.stx +306 -0
- package/resources/components/Dashboard/Avatar.stx +123 -0
- package/resources/components/Dashboard/Billing/ActivePlan.stx +57 -0
- package/resources/components/Dashboard/Billing/CardBrands.stx +32 -0
- package/resources/components/Dashboard/Billing/CardForm.stx +34 -0
- package/resources/components/Dashboard/Billing/OneTimePayment.stx +28 -0
- package/resources/components/Dashboard/Billing/PaymentForm.stx +33 -0
- package/resources/components/Dashboard/Billing/PaymentMethod.stx +66 -0
- package/resources/components/Dashboard/Billing/PaymentMethodList.stx +52 -0
- package/resources/components/Dashboard/Billing/Plans.stx +136 -0
- package/resources/components/Dashboard/Buttons/AppButton.stx +48 -0
- package/resources/components/Dashboard/Buttons/IconButton.stx +20 -0
- package/resources/components/Dashboard/Card.stx +78 -0
- package/resources/components/Dashboard/Chart.stx +75 -0
- package/resources/components/Dashboard/CodeEditor.stx +41 -0
- package/resources/components/Dashboard/Commerce/BulkActionBar.stx +70 -0
- package/resources/components/Dashboard/Commerce/CategoriesTable.stx +133 -0
- package/resources/components/Dashboard/Commerce/CouponsTable.stx +161 -0
- package/resources/components/Dashboard/Commerce/CustomersTable.stx +142 -0
- package/resources/components/Dashboard/Commerce/Delivery/DeliveryRoutesTable.stx +80 -0
- package/resources/components/Dashboard/Commerce/Delivery/DigitalDeliveryTable.stx +85 -0
- package/resources/components/Dashboard/Commerce/Delivery/DriversTable.stx +99 -0
- package/resources/components/Dashboard/Commerce/Delivery/LicenseKeysTable.stx +92 -0
- package/resources/components/Dashboard/Commerce/Delivery/LicenseTemplatesTable.stx +88 -0
- package/resources/components/Dashboard/Commerce/Delivery/Pagination.stx +122 -0
- package/resources/components/Dashboard/Commerce/Delivery/SearchFilter.stx +23 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingMethodsTable.stx +80 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingRatesTable.stx +59 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingZonesTable.stx +71 -0
- package/resources/components/Dashboard/Commerce/Delivery/TabNavigation.stx +36 -0
- package/resources/components/Dashboard/Commerce/Forms/CouponsForm.stx +191 -0
- package/resources/components/Dashboard/Commerce/OrdersTable.stx +131 -0
- package/resources/components/Dashboard/Commerce/ProductsTable.stx +170 -0
- package/resources/components/Dashboard/CreateRecordModal.stx +363 -0
- package/resources/components/Dashboard/DashboardLayout.stx +155 -0
- package/resources/components/Dashboard/Deployments/ActivityFeed.stx +54 -0
- package/resources/components/Dashboard/Deployments/DeployScript.stx +23 -0
- package/resources/components/Dashboard/Deployments/DeploymentHistory.stx +97 -0
- package/resources/components/Dashboard/Deployments/DeploymentList.stx +94 -0
- package/resources/components/Dashboard/Deployments/LiveTerminalOutput.stx +18 -0
- package/resources/components/Dashboard/Elements/Dropdown.stx +57 -0
- package/resources/components/Dashboard/Email/EmailActivityChart.stx +111 -0
- package/resources/components/Dashboard/Email/EmailCompose.stx +72 -0
- package/resources/components/Dashboard/Email/EmailDetail.stx +105 -0
- package/resources/components/Dashboard/Email/EmailList.stx +117 -0
- package/resources/components/Dashboard/Email/EmailSearch.stx +40 -0
- package/resources/components/Dashboard/Email/EmailSidebar.stx +133 -0
- package/resources/components/Dashboard/GlobalSearch.stx +124 -0
- package/resources/components/Dashboard/MobileSidebar.stx +47 -0
- package/resources/components/Dashboard/Modals/BaseModal.stx +50 -0
- package/resources/components/Dashboard/Modals/Popups/Alert.stx +112 -0
- package/resources/components/Dashboard/Modals/Popups/Toast.stx +70 -0
- package/resources/components/Dashboard/Modals/ToastWrapper.stx +35 -0
- package/resources/components/Dashboard/Monitoring/ErrorDetailModal.stx +228 -0
- package/resources/components/Dashboard/Monitoring/ErrorsTable.stx +184 -0
- package/resources/components/Dashboard/Navbar.stx +194 -0
- package/resources/components/Dashboard/NavbarModern.stx +188 -0
- package/resources/components/Dashboard/NotificationErrorModal.stx +105 -0
- package/resources/components/Dashboard/NotificationStatusBadge.stx +20 -0
- package/resources/components/Dashboard/Pagination.stx +90 -0
- package/resources/components/Dashboard/Queue/QueueTable.stx +127 -0
- package/resources/components/Dashboard/Settings/Forms/AIForm.stx +126 -0
- package/resources/components/Dashboard/Settings/Forms/AnalyticsForm.stx +52 -0
- package/resources/components/Dashboard/Settings/Forms/AppForm.stx +157 -0
- package/resources/components/Dashboard/Settings/Forms/CLIForm.stx +66 -0
- package/resources/components/Dashboard/Settings/Forms/CacheForm.stx +253 -0
- package/resources/components/Dashboard/Settings/Forms/CloudForm.stx +441 -0
- package/resources/components/Dashboard/Settings/Forms/DNSForm.stx +307 -0
- package/resources/components/Dashboard/Settings/Forms/DatabaseForm.stx +168 -0
- package/resources/components/Dashboard/Settings/Forms/EmailForm.stx +100 -0
- package/resources/components/Dashboard/Settings/Forms/FileSystemForm.stx +259 -0
- package/resources/components/Dashboard/Settings/Forms/HashingForm.stx +119 -0
- package/resources/components/Dashboard/Settings/Forms/LibraryForm.stx +389 -0
- package/resources/components/Dashboard/Settings/Forms/QueueForm.stx +219 -0
- package/resources/components/Dashboard/Settings/Forms/SearchEngineForm.stx +48 -0
- package/resources/components/Dashboard/Settings/Forms/SecurityForm.stx +143 -0
- package/resources/components/Dashboard/Settings/Forms/ServicesForm.stx +194 -0
- package/resources/components/Dashboard/Settings/Forms/StorageForm.stx +191 -0
- package/resources/components/Dashboard/Settings/Forms/TeamsForm.stx +33 -0
- package/resources/components/Dashboard/Settings/SettingsFormManager.stx +181 -0
- package/resources/components/Dashboard/SettingsHeader.stx +88 -0
- package/resources/components/Dashboard/SettingsSidebar.stx +234 -0
- package/resources/components/Dashboard/Sidebar.stx +23 -0
- package/resources/components/Dashboard/SidebarModern.stx +249 -0
- package/resources/components/Dashboard/Skeleton/LoadingCard.stx +15 -0
- package/resources/components/Dashboard/Skeleton/LoadingDetails.stx +26 -0
- package/resources/components/Dashboard/Table.stx +82 -0
- package/resources/components/Dashboard/TerminalContainer.stx +97 -0
- package/resources/components/Dashboard/Tooltip.stx +166 -0
- package/resources/components/Dashboard/Transaction/index.stx +88 -0
- package/resources/components/Dashboard/UI/ActivityTable.stx +54 -0
- package/resources/components/Dashboard/UI/Avatar.stx +102 -0
- package/resources/components/Dashboard/UI/Badge.stx +66 -0
- package/resources/components/Dashboard/UI/Button.stx +73 -0
- package/resources/components/Dashboard/UI/Card.stx +51 -0
- package/resources/components/Dashboard/UI/ChartCard.stx +36 -0
- package/resources/components/Dashboard/UI/Checkbox.stx +74 -0
- package/resources/components/Dashboard/UI/ConfirmDialog.stx +74 -0
- package/resources/components/Dashboard/UI/DataTable.stx +45 -0
- package/resources/components/Dashboard/UI/Dropdown.stx +72 -0
- package/resources/components/Dashboard/UI/DropdownItem.stx +80 -0
- package/resources/components/Dashboard/UI/EmptyState.stx +50 -0
- package/resources/components/Dashboard/UI/FilterBar.stx +48 -0
- package/resources/components/Dashboard/UI/Input.stx +77 -0
- package/resources/components/Dashboard/UI/Modal.stx +75 -0
- package/resources/components/Dashboard/UI/PageHeader.stx +69 -0
- package/resources/components/Dashboard/UI/PageLayout.stx +84 -0
- package/resources/components/Dashboard/UI/Pagination.stx +126 -0
- package/resources/components/Dashboard/UI/QuickLinks.stx +31 -0
- package/resources/components/Dashboard/UI/RouterLink.stx +31 -0
- package/resources/components/Dashboard/UI/Select.stx +84 -0
- package/resources/components/Dashboard/UI/ServiceHealth.stx +38 -0
- package/resources/components/Dashboard/UI/StatsCard.stx +79 -0
- package/resources/components/Dashboard/UI/Table.stx +143 -0
- package/resources/components/Dashboard/UI/Tabs.stx +45 -0
- package/resources/components/Dashboard/UI/Textarea.stx +93 -0
- package/resources/components/Dashboard/UI/Toggle.stx +84 -0
- package/resources/components/Dashboard/UI/WindowControls.stx +135 -0
- package/resources/components/Dashboard/Widget.stx +89 -0
- package/resources/components/Dashboard/WindowControls.stx +119 -0
- package/resources/components/Dashboard/index.ts +106 -0
- package/resources/components/Docs/Demo/ComboboxCode.md +114 -0
- package/resources/components/Docs/Demo/ComboboxDemo.stx +91 -0
- package/resources/components/Docs/Demo/DialogCode.md +42 -0
- package/resources/components/Docs/Demo/DialogDemo.stx +76 -0
- package/resources/components/Docs/Demo/DocsPlayground.stx +39 -0
- package/resources/components/Docs/Demo/DropdownCode.md +109 -0
- package/resources/components/Docs/Demo/DropdownDemo.stx +82 -0
- package/resources/components/Docs/Demo/Hero.stx +100 -0
- package/resources/components/Docs/Demo/ListboxCode.md +87 -0
- package/resources/components/Docs/Demo/ListboxDemo.stx +59 -0
- package/resources/components/Docs/Demo/NotificationCode.md +173 -0
- package/resources/components/Docs/Demo/NotificationDemo.stx +99 -0
- package/resources/components/Docs/Demo/PopoverCode.md +161 -0
- package/resources/components/Docs/Demo/PopoverDemo.stx +96 -0
- package/resources/components/Docs/Demo/RadioGroupCode.md +98 -0
- package/resources/components/Docs/Demo/RadioGroupDemo.stx +53 -0
- package/resources/components/Docs/Demo/StepperCode.md +216 -0
- package/resources/components/Docs/Demo/StepperDemo.stx +137 -0
- package/resources/components/Docs/Demo/SwitchCode.md +24 -0
- package/resources/components/Docs/Demo/SwitchDemo.stx +28 -0
- package/resources/components/Docs/Home.stx +7 -0
- package/resources/components/Docs/HomeContributors.stx +23 -0
- package/resources/components/Docs/HomeSponsors.stx +17 -0
- package/resources/components/Docs/HomeTeam.stx +18 -0
- package/resources/components/Docs/TeamMember.stx +79 -0
- package/resources/components/Email/EmailButton.stx +32 -0
- package/resources/components/Email/EmailDivider.stx +20 -0
- package/resources/components/Email/EmailImage.stx +24 -0
- package/resources/components/Email/EmailLayout.stx +55 -0
- package/resources/components/Email/EmailLink.stx +22 -0
- package/resources/components/Email/EmailSection.stx +20 -0
- package/resources/components/Email/EmailText.stx +30 -0
- package/resources/components/Forum/ForumBreadcrumb.stx +38 -0
- package/resources/components/Forum/ForumCategory.stx +16 -0
- package/resources/components/Forum/ForumCategoryItem.stx +46 -0
- package/resources/components/Forum/ForumLayout.stx +36 -0
- package/resources/components/Forum/ForumPagination.stx +39 -0
- package/resources/components/Forum/ForumPost.stx +71 -0
- package/resources/components/Forum/ForumReplyForm.stx +76 -0
- package/resources/components/Forum/ForumSidebar.stx +86 -0
- package/resources/components/Forum/ForumTopicItem.stx +77 -0
- package/resources/components/Forum/ForumTopicList.stx +23 -0
- package/resources/components/HelloWorld.stx +253 -0
- package/resources/components/Logo.stx +10 -0
- package/resources/components/Marketing/CallToAction.stx +30 -0
- package/resources/components/Marketing/ComingSoon.stx +155 -0
- package/resources/components/Marketing/Faqs.stx +99 -0
- package/resources/components/Marketing/Feature.stx +32 -0
- package/resources/components/Marketing/Fields.stx +28 -0
- package/resources/components/Marketing/Footer.stx +33 -0
- package/resources/components/Marketing/Header.stx +51 -0
- package/resources/components/Marketing/Hero.stx +46 -0
- package/resources/components/Marketing/Layout.stx +26 -0
- package/resources/components/Marketing/NavLink.stx +13 -0
- package/resources/components/Marketing/Plan.stx +43 -0
- package/resources/components/Marketing/Pricing.stx +120 -0
- package/resources/components/Marketing/PrimaryFeatures.stx +80 -0
- package/resources/components/Marketing/PrimaryFeatures2.stx +98 -0
- package/resources/components/Marketing/SecondaryFeatures.stx +80 -0
- package/resources/components/Marketing/Testimonials.stx +120 -0
- package/resources/components/Pagination.stx +149 -0
- package/resources/components/Playground.stx +9 -0
- package/resources/components/README.md +87 -0
- package/resources/components/Storefront/AnnouncementBar.stx +17 -0
- package/resources/components/Storefront/CartDrawer.stx +227 -0
- package/resources/components/Storefront/CheckoutSteps.stx +50 -0
- package/resources/components/Storefront/Footer.stx +81 -0
- package/resources/components/Storefront/Header.stx +66 -0
- package/resources/components/Storefront/OrderSummary.stx +79 -0
- package/resources/components/Storefront/ProductCard.stx +63 -0
- package/resources/components/Storefront/ProductGallery.stx +88 -0
- package/resources/components/Storefront/QuantitySelector.stx +97 -0
- package/resources/components/index.ts +13 -0
- package/resources/emails/email-verification.stx +46 -0
- package/resources/emails/layouts/base.html +113 -0
- package/resources/emails/password-changed.stx +55 -0
- package/resources/emails/password-reset.stx +43 -0
- package/resources/emails/subscription-confirmation.stx +99 -0
- package/resources/emails/welcome.stx +48 -0
- package/resources/functions/README.md +28 -0
- package/resources/functions/counter.ts +13 -0
- package/resources/functions/dark.ts +4 -0
- package/resources/functions/dashboard/analytics.ts +238 -0
- package/resources/functions/dashboard/config-io.ts +316 -0
- package/resources/functions/dashboard/data.ts +375 -0
- package/resources/functions/dashboard/library.ts +250 -0
- package/resources/functions/dashboard/sidebar.ts +537 -0
- package/resources/functions/dashboard/system.ts +150 -0
- package/resources/layouts/403.stx +188 -0
- package/resources/layouts/404.stx +34 -0
- package/resources/layouts/README.md +14 -0
- package/resources/layouts/dashboard/default.stx +20 -0
- package/resources/layouts/dashboard/guest.stx +10 -0
- package/resources/layouts/default.stx +3 -0
- package/resources/layouts/maintenance.stx +11 -0
- package/resources/layouts/storefront.stx +73 -0
- package/resources/layouts/system-tray/default.stx +3 -0
- package/resources/modules/.gitkeep +0 -0
- package/resources/plugins/.gitkeep +0 -0
- package/resources/plugins/preloader.ts +308 -0
- package/resources/types/README.md +3 -0
- package/resources/views/cart.stx +149 -0
- package/resources/views/checkout/contact.stx +101 -0
- package/resources/views/checkout/payment.stx +114 -0
- package/resources/views/checkout/shipping.stx +120 -0
- package/resources/views/coming-soon.stx +9 -0
- package/resources/views/dashboard/custom-page.stx +45 -0
- package/resources/views/dashboard/index.stx +24 -0
- package/resources/views/emails/welcome.stx +0 -0
- package/resources/views/errors/tester.stx +26 -0
- package/resources/views/index.stx +2865 -0
- package/resources/views/orders/[id].stx +130 -0
|
@@ -0,0 +1,2865 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Stacks.js - Coming Soon</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Tahoma:wght@400;700&display=swap" rel="stylesheet">
|
|
10
|
+
<link rel="stylesheet" href="/assets/styles/main.css">
|
|
11
|
+
<style>
|
|
12
|
+
/* Submenu positioning handled in CSS file */
|
|
13
|
+
</style>
|
|
14
|
+
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<!-- Windows XP Login Screen -->
|
|
18
|
+
<div id="login-screen" class="hidden login-screen">
|
|
19
|
+
<div class="login-background">
|
|
20
|
+
<div class="login-container">
|
|
21
|
+
<button class="login-close-btn" onclick="closeLoginScreens()">×</button>
|
|
22
|
+
<div class="login-header">
|
|
23
|
+
<div class="login-logo">STACKS</div>
|
|
24
|
+
<div class="login-subtitle">To begin, click your user name</div>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<div class="login-users">
|
|
28
|
+
<button class="login-user-button" id="email-login-btn">
|
|
29
|
+
<div class="login-user-icon">👤</div>
|
|
30
|
+
<div class="login-user-name">Email Login</div>
|
|
31
|
+
</button>
|
|
32
|
+
|
|
33
|
+
<button class="login-user-button" id="license-login-btn">
|
|
34
|
+
<div class="login-user-icon">🔑</div>
|
|
35
|
+
<div class="login-user-name">License Key</div>
|
|
36
|
+
</button>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div class="login-footer">
|
|
40
|
+
<div class="login-footer-text">After you log in, you can access the STACKS Desktop</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<!-- Email/Password Login Form -->
|
|
47
|
+
<div id="email-login-form" class="hidden login-form">
|
|
48
|
+
<div class="login-form-background">
|
|
49
|
+
<div class="login-form-container">
|
|
50
|
+
<button class="login-close-btn" onclick="closeLoginScreens()">×</button>
|
|
51
|
+
<div class="login-form-header">
|
|
52
|
+
<button class="login-back-button" onclick="hideLoginForms()">← Back</button>
|
|
53
|
+
<div class="login-form-title">
|
|
54
|
+
<div class="login-form-icon">👤</div>
|
|
55
|
+
<h2>Email Login</h2>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div class="login-form-content">
|
|
60
|
+
<div class="login-form-prompt">Type your email and password</div>
|
|
61
|
+
|
|
62
|
+
<div class="login-input-group">
|
|
63
|
+
<label>Email:</label>
|
|
64
|
+
<input type="email" id="email-input" class="login-input" placeholder="user@example.com">
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="login-input-group">
|
|
68
|
+
<label>Password:</label>
|
|
69
|
+
<input type="password" id="password-input" class="login-input" placeholder="Enter your password">
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div class="login-actions">
|
|
73
|
+
<button class="login-submit-btn" onclick="handleEmailLogin()">
|
|
74
|
+
<span class="login-btn-icon">→</span>
|
|
75
|
+
<span>Log In</span>
|
|
76
|
+
</button>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<!-- License Key Login Form -->
|
|
84
|
+
<div id="license-login-form" class="hidden login-form">
|
|
85
|
+
<div class="login-form-background">
|
|
86
|
+
<div class="login-form-container">
|
|
87
|
+
<button class="login-close-btn" onclick="closeLoginScreens()">×</button>
|
|
88
|
+
<div class="login-form-header">
|
|
89
|
+
<button class="login-back-button" onclick="hideLoginForms()">← Back</button>
|
|
90
|
+
<div class="login-form-title">
|
|
91
|
+
<div class="login-form-icon">🔑</div>
|
|
92
|
+
<h2>License Key Login</h2>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div class="login-form-content">
|
|
97
|
+
<div class="login-form-prompt">Enter your STACKS license key</div>
|
|
98
|
+
|
|
99
|
+
<div class="login-input-group">
|
|
100
|
+
<label>License Key:</label>
|
|
101
|
+
<input type="text" id="license-input" class="login-input" placeholder="XXXX-XXXX-XXXX-XXXX">
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<div class="login-actions">
|
|
105
|
+
<button class="login-submit-btn" onclick="handleLicenseLogin()">
|
|
106
|
+
<span class="login-btn-icon">→</span>
|
|
107
|
+
<span>Log In</span>
|
|
108
|
+
</button>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<div class="desktop">
|
|
116
|
+
<!-- Desktop Icons -->
|
|
117
|
+
<div class="desktop-icons">
|
|
118
|
+
<button
|
|
119
|
+
class="desktop-icon"
|
|
120
|
+
data-icon-id="welcome"
|
|
121
|
+
data-icon-type="window"
|
|
122
|
+
data-icon-section="welcome"
|
|
123
|
+
data-icon-url=""
|
|
124
|
+
style="left: 20px; top: 20px;"
|
|
125
|
+
>
|
|
126
|
+
<div class="desktop-icon-image">📃</div>
|
|
127
|
+
<div class="desktop-icon-label">Welcome.pdf</div>
|
|
128
|
+
</button>
|
|
129
|
+
|
|
130
|
+
<button
|
|
131
|
+
class="desktop-icon"
|
|
132
|
+
data-icon-id="about"
|
|
133
|
+
data-icon-type="window"
|
|
134
|
+
data-icon-section="about"
|
|
135
|
+
data-icon-url=""
|
|
136
|
+
style="left: 140px; top: 20px;"
|
|
137
|
+
>
|
|
138
|
+
<div class="desktop-icon-image">📄</div>
|
|
139
|
+
<div class="desktop-icon-label">About</div>
|
|
140
|
+
</button>
|
|
141
|
+
|
|
142
|
+
<button
|
|
143
|
+
class="desktop-icon"
|
|
144
|
+
data-icon-id="ecosystem"
|
|
145
|
+
data-icon-type="window"
|
|
146
|
+
data-icon-section="ecosystem"
|
|
147
|
+
data-icon-url=""
|
|
148
|
+
style="left: 260px; top: 20px;"
|
|
149
|
+
>
|
|
150
|
+
<div class="desktop-icon-image">🌐</div>
|
|
151
|
+
<div class="desktop-icon-label">Ecosystem</div>
|
|
152
|
+
</button>
|
|
153
|
+
|
|
154
|
+
<button
|
|
155
|
+
class="desktop-icon"
|
|
156
|
+
data-icon-id="backend"
|
|
157
|
+
data-icon-type="window"
|
|
158
|
+
data-icon-section="backend"
|
|
159
|
+
data-icon-url=""
|
|
160
|
+
style="left: 380px; top: 20px;"
|
|
161
|
+
>
|
|
162
|
+
<div class="desktop-icon-image">⚙️</div>
|
|
163
|
+
<div class="desktop-icon-label">Backend</div>
|
|
164
|
+
</button>
|
|
165
|
+
|
|
166
|
+
<button
|
|
167
|
+
class="desktop-icon"
|
|
168
|
+
data-icon-id="frontend"
|
|
169
|
+
data-icon-type="window"
|
|
170
|
+
data-icon-section="frontend"
|
|
171
|
+
data-icon-url=""
|
|
172
|
+
style="left: 500px; top: 20px;"
|
|
173
|
+
>
|
|
174
|
+
<div class="desktop-icon-image">🎨</div>
|
|
175
|
+
<div class="desktop-icon-label">Frontend</div>
|
|
176
|
+
</button>
|
|
177
|
+
|
|
178
|
+
<button
|
|
179
|
+
class="desktop-icon"
|
|
180
|
+
data-icon-id="cloud"
|
|
181
|
+
data-icon-type="window"
|
|
182
|
+
data-icon-section="cloud"
|
|
183
|
+
data-icon-url=""
|
|
184
|
+
style="left: 620px; top: 20px;"
|
|
185
|
+
>
|
|
186
|
+
<div class="desktop-icon-image">☁️</div>
|
|
187
|
+
<div class="desktop-icon-label">Cloud</div>
|
|
188
|
+
</button>
|
|
189
|
+
|
|
190
|
+
<button
|
|
191
|
+
class="desktop-icon"
|
|
192
|
+
data-icon-id="dashboard"
|
|
193
|
+
data-icon-type="window"
|
|
194
|
+
data-icon-section="dashboard"
|
|
195
|
+
data-icon-url=""
|
|
196
|
+
style="left: 20px; top: 140px;"
|
|
197
|
+
>
|
|
198
|
+
<div class="desktop-icon-image">📊</div>
|
|
199
|
+
<div class="desktop-icon-label">Dashboard</div>
|
|
200
|
+
</button>
|
|
201
|
+
|
|
202
|
+
<button
|
|
203
|
+
class="desktop-icon"
|
|
204
|
+
data-icon-id="license"
|
|
205
|
+
data-icon-type="window"
|
|
206
|
+
data-icon-section="license"
|
|
207
|
+
data-icon-url=""
|
|
208
|
+
style="left: 140px; top: 140px;"
|
|
209
|
+
>
|
|
210
|
+
<div class="desktop-icon-image">🔑</div>
|
|
211
|
+
<div class="desktop-icon-label">License</div>
|
|
212
|
+
</button>
|
|
213
|
+
|
|
214
|
+
<button
|
|
215
|
+
class="desktop-icon"
|
|
216
|
+
data-icon-id="login"
|
|
217
|
+
data-icon-type="action"
|
|
218
|
+
data-icon-section=""
|
|
219
|
+
data-icon-url=""
|
|
220
|
+
onclick="showLoginScreen()"
|
|
221
|
+
style="left: 260px; top: 140px;"
|
|
222
|
+
>
|
|
223
|
+
<div class="desktop-icon-image">🔐</div>
|
|
224
|
+
<div class="desktop-icon-label">Login</div>
|
|
225
|
+
</button>
|
|
226
|
+
|
|
227
|
+
<button
|
|
228
|
+
class="desktop-icon"
|
|
229
|
+
data-icon-id="benchmarks"
|
|
230
|
+
data-icon-type="window"
|
|
231
|
+
data-icon-section="benchmarks"
|
|
232
|
+
data-icon-url=""
|
|
233
|
+
style="left: 380px; top: 140px;"
|
|
234
|
+
>
|
|
235
|
+
<div class="desktop-icon-image">📁</div>
|
|
236
|
+
<div class="desktop-icon-label">Benchmarks</div>
|
|
237
|
+
</button>
|
|
238
|
+
|
|
239
|
+
<button
|
|
240
|
+
class="desktop-icon"
|
|
241
|
+
data-icon-id="libraries"
|
|
242
|
+
data-icon-type="window"
|
|
243
|
+
data-icon-section="libraries"
|
|
244
|
+
data-icon-url=""
|
|
245
|
+
style="left: 500px; top: 140px;"
|
|
246
|
+
>
|
|
247
|
+
<div class="desktop-icon-image">📁</div>
|
|
248
|
+
<div class="desktop-icon-label">Libraries & CLIs</div>
|
|
249
|
+
</button>
|
|
250
|
+
|
|
251
|
+
<button
|
|
252
|
+
class="desktop-icon"
|
|
253
|
+
data-icon-id="plugins"
|
|
254
|
+
data-icon-type="window"
|
|
255
|
+
data-icon-section="plugins"
|
|
256
|
+
data-icon-url=""
|
|
257
|
+
style="left: 620px; top: 140px;"
|
|
258
|
+
>
|
|
259
|
+
<div class="desktop-icon-image">📁</div>
|
|
260
|
+
<div class="desktop-icon-label">Plugins & Actions</div>
|
|
261
|
+
</button>
|
|
262
|
+
|
|
263
|
+
<button
|
|
264
|
+
class="desktop-icon"
|
|
265
|
+
data-icon-id="templates"
|
|
266
|
+
data-icon-type="window"
|
|
267
|
+
data-icon-section="templates"
|
|
268
|
+
data-icon-url=""
|
|
269
|
+
style="left: 20px; top: 260px;"
|
|
270
|
+
>
|
|
271
|
+
<div class="desktop-icon-image">📁</div>
|
|
272
|
+
<div class="desktop-icon-label">Templates</div>
|
|
273
|
+
</button>
|
|
274
|
+
|
|
275
|
+
<button
|
|
276
|
+
class="desktop-icon"
|
|
277
|
+
data-icon-id="docs"
|
|
278
|
+
data-icon-type="link"
|
|
279
|
+
data-icon-section=""
|
|
280
|
+
data-icon-url="https://stacksjs.com/docs"
|
|
281
|
+
style="left: 140px; top: 260px;"
|
|
282
|
+
>
|
|
283
|
+
<div class="desktop-icon-image">📚</div>
|
|
284
|
+
<div class="desktop-icon-label">Documentation</div>
|
|
285
|
+
</button>
|
|
286
|
+
|
|
287
|
+
<button
|
|
288
|
+
class="desktop-icon"
|
|
289
|
+
data-icon-id="blog"
|
|
290
|
+
data-icon-type="window"
|
|
291
|
+
data-icon-section="blog"
|
|
292
|
+
data-icon-url=""
|
|
293
|
+
style="left: 260px; top: 260px;"
|
|
294
|
+
>
|
|
295
|
+
<div class="desktop-icon-image">📝</div>
|
|
296
|
+
<div class="desktop-icon-label">Blog</div>
|
|
297
|
+
</button>
|
|
298
|
+
|
|
299
|
+
<button
|
|
300
|
+
class="desktop-icon"
|
|
301
|
+
data-icon-id="github"
|
|
302
|
+
data-icon-type="link"
|
|
303
|
+
data-icon-section=""
|
|
304
|
+
data-icon-url="https://github.com/stacksjs/stacks"
|
|
305
|
+
style="left: 380px; top: 260px;"
|
|
306
|
+
>
|
|
307
|
+
<div class="desktop-icon-image">💻</div>
|
|
308
|
+
<div class="desktop-icon-label">GitHub</div>
|
|
309
|
+
</button>
|
|
310
|
+
|
|
311
|
+
<button
|
|
312
|
+
class="desktop-icon"
|
|
313
|
+
data-icon-id="sponsors"
|
|
314
|
+
data-icon-type="window"
|
|
315
|
+
data-icon-section="sponsors"
|
|
316
|
+
data-icon-url=""
|
|
317
|
+
style="left: 500px; top: 260px;"
|
|
318
|
+
>
|
|
319
|
+
<div class="desktop-icon-image">💖</div>
|
|
320
|
+
<div class="desktop-icon-label">Sponsors</div>
|
|
321
|
+
</button>
|
|
322
|
+
|
|
323
|
+
<button
|
|
324
|
+
class="desktop-icon"
|
|
325
|
+
data-icon-id="discord"
|
|
326
|
+
data-icon-type="link"
|
|
327
|
+
data-icon-section=""
|
|
328
|
+
data-icon-url="https://discord.gg/stacksjs"
|
|
329
|
+
style="left: 620px; top: 260px;"
|
|
330
|
+
>
|
|
331
|
+
<div class="desktop-icon-image">💬</div>
|
|
332
|
+
<div class="desktop-icon-label">Discord</div>
|
|
333
|
+
</button>
|
|
334
|
+
|
|
335
|
+
<button
|
|
336
|
+
class="desktop-icon"
|
|
337
|
+
data-icon-id="whitepaper"
|
|
338
|
+
data-icon-type="link"
|
|
339
|
+
data-icon-section=""
|
|
340
|
+
data-icon-url="https://github.com/stacksjs/white-paper"
|
|
341
|
+
style="left: 20px; top: 380px;"
|
|
342
|
+
>
|
|
343
|
+
<div class="desktop-icon-image">📄</div>
|
|
344
|
+
<div class="desktop-icon-label">White Paper</div>
|
|
345
|
+
</button>
|
|
346
|
+
|
|
347
|
+
<button
|
|
348
|
+
class="desktop-icon"
|
|
349
|
+
data-icon-id="contact"
|
|
350
|
+
data-icon-type="window"
|
|
351
|
+
data-icon-section="contact"
|
|
352
|
+
data-icon-url=""
|
|
353
|
+
style="left: 140px; top: 380px;"
|
|
354
|
+
>
|
|
355
|
+
<div class="desktop-icon-image">📫</div>
|
|
356
|
+
<div class="desktop-icon-label">Contact</div>
|
|
357
|
+
</button>
|
|
358
|
+
</div>
|
|
359
|
+
|
|
360
|
+
<!-- Sponsor Ad Space -->
|
|
361
|
+
<button
|
|
362
|
+
id="sponsor-icon"
|
|
363
|
+
class="desktop-icon"
|
|
364
|
+
data-icon-id="sponsor"
|
|
365
|
+
data-icon-type="link"
|
|
366
|
+
data-icon-section=""
|
|
367
|
+
data-icon-url="https://github.com/sponsors/stacksjs"
|
|
368
|
+
>
|
|
369
|
+
<div class="desktop-icon-image" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 8px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); border: 2px solid rgba(255,255,255,0.2); font-size: 28px; width: 56px; height: 56px; display: flex; align-items: center; justify-content: center;">
|
|
370
|
+
🏢
|
|
371
|
+
</div>
|
|
372
|
+
<div class="desktop-icon-label" style="white-space: pre-line; line-height: 1.2; font-size: 10px; text-shadow: 1px 1px 2px rgba(0,0,0,0.8);">Your Brand
|
|
373
|
+
Sponsor Here</div>
|
|
374
|
+
</button>
|
|
375
|
+
|
|
376
|
+
<!-- Trash Bin -->
|
|
377
|
+
<button
|
|
378
|
+
id="trash-icon"
|
|
379
|
+
class="desktop-icon"
|
|
380
|
+
data-icon-id="trash"
|
|
381
|
+
data-icon-type="window"
|
|
382
|
+
data-icon-section="trash"
|
|
383
|
+
data-icon-url=""
|
|
384
|
+
>
|
|
385
|
+
<div class="desktop-icon-image">🗑️</div>
|
|
386
|
+
<div class="desktop-icon-label">Recycle Bin</div>
|
|
387
|
+
</button>
|
|
388
|
+
|
|
389
|
+
<!-- Windows -->
|
|
390
|
+
<div id="window-about" class="window" style="left: 100px; top: 80px; width: 600px; height: 500px;">
|
|
391
|
+
<div class="window-titlebar">
|
|
392
|
+
<div class="window-icon">📄</div>
|
|
393
|
+
<div class="window-title">About Stacks</div>
|
|
394
|
+
<div class="window-controls">
|
|
395
|
+
<button class="minimize window-control" onclick="minimizeWindow('about')">_</button>
|
|
396
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('about')">□</button>
|
|
397
|
+
<button class="close window-control" onclick="closeWindow('about')">×</button>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
<div class="window-content">
|
|
401
|
+
<h2>STACKS.JS</h2>
|
|
402
|
+
<h3>Rapid Development Framework</h3>
|
|
403
|
+
<p>
|
|
404
|
+
A TypeScript framework for building modern web applications, APIs, and cloud infrastructure.
|
|
405
|
+
</p>
|
|
406
|
+
<p>
|
|
407
|
+
Stacks provides an elegant, opinionated solution for common development needs with a focus on
|
|
408
|
+
developer experience and productivity.
|
|
409
|
+
</p>
|
|
410
|
+
<p>
|
|
411
|
+
Built on <strong>Bun</strong>, <strong>TypeScript</strong>, and <strong>Tauri</strong>.
|
|
412
|
+
</p>
|
|
413
|
+
<div style="margin-top: 24px; padding: 12px; background: #fffacd; border: 2px solid #ffd700;">
|
|
414
|
+
<p style="margin: 0; font-weight: bold;">✨ Convention over configuration, while staying wholly configurable</p>
|
|
415
|
+
</div>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
|
|
419
|
+
<div id="window-ecosystem" class="window" style="left: 150px; top: 100px; width: 850px; height: 650px;">
|
|
420
|
+
<div class="window-titlebar">
|
|
421
|
+
<div class="window-icon">🌐</div>
|
|
422
|
+
<div class="window-title">Ecosystem</div>
|
|
423
|
+
<div class="window-controls">
|
|
424
|
+
<button class="minimize window-control" onclick="minimizeWindow('ecosystem')">_</button>
|
|
425
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('ecosystem')">□</button>
|
|
426
|
+
<button class="close window-control" onclick="closeWindow('ecosystem')">×</button>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
<div class="window-content">
|
|
430
|
+
<h2>Ecosystem</h2>
|
|
431
|
+
<p style="margin-bottom: 20px;">The complete Stacks.js ecosystem—all open source, all TypeScript.</p>
|
|
432
|
+
|
|
433
|
+
<div class="feature-buttons" style="margin-bottom: 20px;">
|
|
434
|
+
<button class="active feature-btn" onclick="showEcosystemTab('core')">Core Packages</button>
|
|
435
|
+
<button class="feature-btn" onclick="showEcosystemTab('frameworks')">Frameworks</button>
|
|
436
|
+
<button class="feature-btn" onclick="showEcosystemTab('sponsorware')">Sponsorware</button>
|
|
437
|
+
<button class="feature-btn" onclick="showEcosystemTab('apps')">Apps</button>
|
|
438
|
+
</div>
|
|
439
|
+
|
|
440
|
+
<div id="ecosystem-tab-content" style="max-height: 450px; overflow-y: auto;">
|
|
441
|
+
<div id="tab-core" class="ecosystem-tab">
|
|
442
|
+
<h3>Core Packages</h3>
|
|
443
|
+
<div class="package-grid">
|
|
444
|
+
|
|
445
|
+
<div class="package-item">
|
|
446
|
+
<div class="package-emoji">🤖</div>
|
|
447
|
+
<div class="package-title">AI</div>
|
|
448
|
+
<div class="package-desc">Deep AI integrations for agentic workflows</div>
|
|
449
|
+
</div>
|
|
450
|
+
|
|
451
|
+
<div class="package-item">
|
|
452
|
+
<div class="package-emoji">🔌</div>
|
|
453
|
+
<div class="package-title">API</div>
|
|
454
|
+
<div class="package-desc">Build scalable REST APIs</div>
|
|
455
|
+
</div>
|
|
456
|
+
|
|
457
|
+
<div class="package-item">
|
|
458
|
+
<div class="package-emoji">🔐</div>
|
|
459
|
+
<div class="package-title">Auth</div>
|
|
460
|
+
<div class="package-desc">Authentication and authorization</div>
|
|
461
|
+
</div>
|
|
462
|
+
|
|
463
|
+
<div class="package-item">
|
|
464
|
+
<div class="package-emoji">⚡</div>
|
|
465
|
+
<div class="package-title">Cache</div>
|
|
466
|
+
<div class="package-desc">Multi-driver caching system</div>
|
|
467
|
+
</div>
|
|
468
|
+
|
|
469
|
+
<div class="package-item">
|
|
470
|
+
<div class="package-emoji">⌨️</div>
|
|
471
|
+
<div class="package-title">CLI</div>
|
|
472
|
+
<div class="package-desc">Beautiful command-line interfaces</div>
|
|
473
|
+
</div>
|
|
474
|
+
|
|
475
|
+
<div class="package-item">
|
|
476
|
+
<div class="package-emoji">☁️</div>
|
|
477
|
+
<div class="package-title">Cloud</div>
|
|
478
|
+
<div class="package-desc">Cloud infrastructure management</div>
|
|
479
|
+
</div>
|
|
480
|
+
|
|
481
|
+
<div class="package-item">
|
|
482
|
+
<div class="package-emoji">🗄️</div>
|
|
483
|
+
<div class="package-title">Database</div>
|
|
484
|
+
<div class="package-desc">Database connections & migrations</div>
|
|
485
|
+
</div>
|
|
486
|
+
|
|
487
|
+
<div class="package-item">
|
|
488
|
+
<div class="package-emoji">🗺️</div>
|
|
489
|
+
<div class="package-title">ORM</div>
|
|
490
|
+
<div class="package-desc">Elegant object-relational mapper</div>
|
|
491
|
+
</div>
|
|
492
|
+
|
|
493
|
+
<div class="package-item">
|
|
494
|
+
<div class="package-emoji">🧭</div>
|
|
495
|
+
<div class="package-title">Router</div>
|
|
496
|
+
<div class="package-desc">Fast & flexible routing</div>
|
|
497
|
+
</div>
|
|
498
|
+
|
|
499
|
+
<div class="package-item">
|
|
500
|
+
<div class="package-emoji">✅</div>
|
|
501
|
+
<div class="package-title">Validation</div>
|
|
502
|
+
<div class="package-desc">Type-safe validation</div>
|
|
503
|
+
</div>
|
|
504
|
+
|
|
505
|
+
<div class="package-item">
|
|
506
|
+
<div class="package-emoji">📬</div>
|
|
507
|
+
<div class="package-title">Queue</div>
|
|
508
|
+
<div class="package-desc">Background job processing</div>
|
|
509
|
+
</div>
|
|
510
|
+
|
|
511
|
+
<div class="package-item">
|
|
512
|
+
<div class="package-emoji">💾</div>
|
|
513
|
+
<div class="package-title">Storage</div>
|
|
514
|
+
<div class="package-desc">File storage abstraction</div>
|
|
515
|
+
</div>
|
|
516
|
+
|
|
517
|
+
<div class="package-item">
|
|
518
|
+
<div class="package-emoji">📫</div>
|
|
519
|
+
<div class="package-title">Email</div>
|
|
520
|
+
<div class="package-desc">Send emails with ease</div>
|
|
521
|
+
</div>
|
|
522
|
+
|
|
523
|
+
<div class="package-item">
|
|
524
|
+
<div class="package-emoji">📡</div>
|
|
525
|
+
<div class="package-title">Events</div>
|
|
526
|
+
<div class="package-desc">Event-driven architecture</div>
|
|
527
|
+
</div>
|
|
528
|
+
|
|
529
|
+
<div class="package-item">
|
|
530
|
+
<div class="package-emoji">🔔</div>
|
|
531
|
+
<div class="package-title">Notifications</div>
|
|
532
|
+
<div class="package-desc">Multi-channel notifications</div>
|
|
533
|
+
</div>
|
|
534
|
+
|
|
535
|
+
<div class="package-item">
|
|
536
|
+
<div class="package-emoji">🧪</div>
|
|
537
|
+
<div class="package-title">Testing</div>
|
|
538
|
+
<div class="package-desc">Testing utilities & helpers</div>
|
|
539
|
+
</div>
|
|
540
|
+
|
|
541
|
+
<div class="package-item">
|
|
542
|
+
<div class="package-emoji">🔍</div>
|
|
543
|
+
<div class="package-title">Search Engine</div>
|
|
544
|
+
<div class="package-desc">Full-text search capabilities</div>
|
|
545
|
+
</div>
|
|
546
|
+
|
|
547
|
+
<div class="package-item">
|
|
548
|
+
<div class="package-emoji">⚡</div>
|
|
549
|
+
<div class="package-title">Realtime</div>
|
|
550
|
+
<div class="package-desc">WebSocket & real-time features</div>
|
|
551
|
+
</div>
|
|
552
|
+
|
|
553
|
+
<div class="package-item">
|
|
554
|
+
<div class="package-emoji">🔬</div>
|
|
555
|
+
<div class="package-title">X-Ray</div>
|
|
556
|
+
<div class="package-desc">Debugging & monitoring tools</div>
|
|
557
|
+
</div>
|
|
558
|
+
|
|
559
|
+
<div class="package-item">
|
|
560
|
+
<div class="package-emoji">💳</div>
|
|
561
|
+
<div class="package-title">Payments</div>
|
|
562
|
+
<div class="package-desc">Payment processing integration</div>
|
|
563
|
+
</div>
|
|
564
|
+
</div>
|
|
565
|
+
</div>
|
|
566
|
+
|
|
567
|
+
<div id="tab-frameworks" class="ecosystem-tab" style="display: none;">
|
|
568
|
+
<h3 style="color: #0831d9; margin-bottom: 12px;">Frameworks</h3>
|
|
569
|
+
<p style="margin-bottom: 16px; color: #333;">Powerful frameworks for modern development.</p>
|
|
570
|
+
<div class="folder-list">
|
|
571
|
+
|
|
572
|
+
<a href="https://github.com/stacksjs/bunpress" target="_blank" class="folder-item">
|
|
573
|
+
<div class="folder-item-icon">🏗️</div>
|
|
574
|
+
<div class="folder-item-content">
|
|
575
|
+
<div class="folder-item-name">BunPress</div>
|
|
576
|
+
<div class="folder-item-desc">Modern documentation-needs covered. Coming soon.</div>
|
|
577
|
+
</div>
|
|
578
|
+
</a>
|
|
579
|
+
|
|
580
|
+
<a href="https://github.com/stacksjs/clapp" target="_blank" class="folder-item">
|
|
581
|
+
<div class="folder-item-icon">🏗️</div>
|
|
582
|
+
<div class="folder-item-content">
|
|
583
|
+
<div class="folder-item-name">Clapp</div>
|
|
584
|
+
<div class="folder-item-desc">A modern framework to build powerful & pretty CLI apps.</div>
|
|
585
|
+
</div>
|
|
586
|
+
</a>
|
|
587
|
+
|
|
588
|
+
<a href="https://github.com/cwcss/crosswind" target="_blank" class="folder-item">
|
|
589
|
+
<div class="folder-item-icon">🏗️</div>
|
|
590
|
+
<div class="folder-item-content">
|
|
591
|
+
<div class="folder-item-name">Crosswind</div>
|
|
592
|
+
<div class="folder-item-desc">A Tailwind-like utility-first CSS framework. Powered by Bun.</div>
|
|
593
|
+
</div>
|
|
594
|
+
</a>
|
|
595
|
+
|
|
596
|
+
<a href="https://github.com/stacksjs/launchpad" target="_blank" class="folder-item">
|
|
597
|
+
<div class="folder-item-icon">🏗️</div>
|
|
598
|
+
<div class="folder-item-content">
|
|
599
|
+
<div class="folder-item-name">Launchpad</div>
|
|
600
|
+
<div class="folder-item-desc">Performant system & project dependency management. Similar to Homebrew, just faster.</div>
|
|
601
|
+
</div>
|
|
602
|
+
</a>
|
|
603
|
+
|
|
604
|
+
<a href="https://github.com/stacksjs/stacks" target="_blank" class="folder-item">
|
|
605
|
+
<div class="folder-item-icon">🏗️</div>
|
|
606
|
+
<div class="folder-item-content">
|
|
607
|
+
<div class="folder-item-name">Stacks</div>
|
|
608
|
+
<div class="folder-item-desc">Develop powerful apps, clouds & framework-agnostic libraries—faster.</div>
|
|
609
|
+
</div>
|
|
610
|
+
</a>
|
|
611
|
+
|
|
612
|
+
<a href="https://github.com/stacksjs/stx" target="_blank" class="folder-item">
|
|
613
|
+
<div class="folder-item-icon">🏗️</div>
|
|
614
|
+
<div class="folder-item-content">
|
|
615
|
+
<div class="folder-item-name">stx</div>
|
|
616
|
+
<div class="folder-item-desc">A fast & powerful UI framework. Templating inspired by Laravel Blade & Vue.</div>
|
|
617
|
+
</div>
|
|
618
|
+
</a>
|
|
619
|
+
</div>
|
|
620
|
+
</div>
|
|
621
|
+
|
|
622
|
+
<div id="tab-sponsorware" class="ecosystem-tab" style="display: none;">
|
|
623
|
+
<h3 style="color: #0831d9; margin-bottom: 12px;">Sponsorware</h3>
|
|
624
|
+
<p style="margin-bottom: 16px; color: #333;">Premium tools & services for sponsors.</p>
|
|
625
|
+
<div class="folder-list">
|
|
626
|
+
|
|
627
|
+
<a href="https://github.com/stacksjs/bun-queue" target="_blank" class="folder-item">
|
|
628
|
+
<div class="folder-item-icon">💎</div>
|
|
629
|
+
<div class="folder-item-content">
|
|
630
|
+
<div class="folder-item-name">bun-queue</div>
|
|
631
|
+
<div class="folder-item-desc">A modern & powerful Queue / Messaging system. Optimized for Bun.</div>
|
|
632
|
+
</div>
|
|
633
|
+
</a>
|
|
634
|
+
|
|
635
|
+
<a href="https://github.com/stacksjs/bun-router" target="_blank" class="folder-item">
|
|
636
|
+
<div class="folder-item-icon">💎</div>
|
|
637
|
+
<div class="folder-item-content">
|
|
638
|
+
<div class="folder-item-name">bun-router</div>
|
|
639
|
+
<div class="folder-item-desc">Powerful routing. High-performance, feature-rich.</div>
|
|
640
|
+
</div>
|
|
641
|
+
</a>
|
|
642
|
+
|
|
643
|
+
<a href="https://github.com/stacksjs/stacks" target="_blank" class="folder-item">
|
|
644
|
+
<div class="folder-item-icon">💎</div>
|
|
645
|
+
<div class="folder-item-content">
|
|
646
|
+
<div class="folder-item-name">Stacks Dashboard</div>
|
|
647
|
+
<div class="folder-item-desc">The Stacks Dashboard. For developers, and their clients.</div>
|
|
648
|
+
</div>
|
|
649
|
+
</a>
|
|
650
|
+
|
|
651
|
+
<a href="https://github.com/stacksjs/stacks" target="_blank" class="folder-item">
|
|
652
|
+
<div class="folder-item-icon">💎</div>
|
|
653
|
+
<div class="folder-item-content">
|
|
654
|
+
<div class="folder-item-name">Stacks ORM - DynamoDB</div>
|
|
655
|
+
<div class="folder-item-desc">More than a driver—automated Single Table Design. Cheap, fast, endless scalability.</div>
|
|
656
|
+
</div>
|
|
657
|
+
</a>
|
|
658
|
+
|
|
659
|
+
<a href="https://github.com/stacksjs/stacks" target="_blank" class="folder-item">
|
|
660
|
+
<div class="folder-item-icon">💎</div>
|
|
661
|
+
<div class="folder-item-content">
|
|
662
|
+
<div class="folder-item-name">Stacks Raycast</div>
|
|
663
|
+
<div class="folder-item-desc">Stacks (and Buddy) integrated into Raycast.</div>
|
|
664
|
+
</div>
|
|
665
|
+
</a>
|
|
666
|
+
</div>
|
|
667
|
+
</div>
|
|
668
|
+
|
|
669
|
+
<div id="tab-apps" class="ecosystem-tab" style="display: none;">
|
|
670
|
+
<h3 style="color: #0831d9; margin-bottom: 12px;">Apps</h3>
|
|
671
|
+
<p style="margin-bottom: 16px; color: #333;">Useful macOS utilities built with Stacks.</p>
|
|
672
|
+
<div class="folder-list">
|
|
673
|
+
|
|
674
|
+
<a href="https://github.com/stacksjs/barista" target="_blank" class="folder-item">
|
|
675
|
+
<div class="folder-item-icon">📱</div>
|
|
676
|
+
<div class="folder-item-content">
|
|
677
|
+
<div class="folder-item-name">Barista</div>
|
|
678
|
+
<div class="folder-item-desc">A lightweight macOS utility that serves up a perfectly organized menubar.</div>
|
|
679
|
+
</div>
|
|
680
|
+
</a>
|
|
681
|
+
|
|
682
|
+
<a href="https://github.com/stacksjs/hush" target="_blank" class="folder-item">
|
|
683
|
+
<div class="folder-item-icon">📱</div>
|
|
684
|
+
<div class="folder-item-content">
|
|
685
|
+
<div class="folder-item-name">Hush</div>
|
|
686
|
+
<div class="folder-item-desc">Lightweight macOS utility that ensures notifications are suppressed during meetings.</div>
|
|
687
|
+
</div>
|
|
688
|
+
</a>
|
|
689
|
+
|
|
690
|
+
<a href="https://github.com/stacksjs/pomodoro" target="_blank" class="folder-item">
|
|
691
|
+
<div class="folder-item-icon">📱</div>
|
|
692
|
+
<div class="folder-item-content">
|
|
693
|
+
<div class="folder-item-name">Pomodoro</div>
|
|
694
|
+
<div class="folder-item-desc">Minimal, functional, yet simple Pomodoro menubar app, to help stay focussed. For Mac.</div>
|
|
695
|
+
</div>
|
|
696
|
+
</a>
|
|
697
|
+
</div>
|
|
698
|
+
</div>
|
|
699
|
+
</div>
|
|
700
|
+
</div>
|
|
701
|
+
</div>
|
|
702
|
+
|
|
703
|
+
<div id="window-backend" class="window" style="left: 200px; top: 120px; width: 700px; height: 550px;">
|
|
704
|
+
<div class="window-titlebar">
|
|
705
|
+
<div class="window-icon">⚙️</div>
|
|
706
|
+
<div class="window-title">Backend Features</div>
|
|
707
|
+
<div class="window-controls">
|
|
708
|
+
<button class="minimize window-control" onclick="minimizeWindow('backend')">_</button>
|
|
709
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('backend')">□</button>
|
|
710
|
+
<button class="close window-control" onclick="closeWindow('backend')">×</button>
|
|
711
|
+
</div>
|
|
712
|
+
</div>
|
|
713
|
+
<div class="window-content">
|
|
714
|
+
<h2>Backend</h2>
|
|
715
|
+
<p>Simple, elegant syntax powers amazing functionality.</p>
|
|
716
|
+
|
|
717
|
+
<div class="feature-buttons">
|
|
718
|
+
<button class="active feature-btn" onclick="showFeature('backend', 'auth')">Authentication</button>
|
|
719
|
+
<button class="feature-btn" onclick="showFeature('backend', 'orm')">ORM</button>
|
|
720
|
+
<button class="feature-btn" onclick="showFeature('backend', 'validation')">Validation</button>
|
|
721
|
+
<button class="feature-btn" onclick="showFeature('backend', 'storage')">Storage</button>
|
|
722
|
+
<button class="feature-btn" onclick="showFeature('backend', 'queue')">Queues</button>
|
|
723
|
+
<button class="feature-btn" onclick="showFeature('backend', 'events')">Events</button>
|
|
724
|
+
</div>
|
|
725
|
+
|
|
726
|
+
<div id="backend-feature-content">
|
|
727
|
+
<h3>Authentication</h3>
|
|
728
|
+
<div class="code-display">
|
|
729
|
+
import { Auth } from '@stacksjs/auth'
|
|
730
|
+
|
|
731
|
+
// Login user
|
|
732
|
+
const user = await Auth.attempt({
|
|
733
|
+
email: 'user@example.com',
|
|
734
|
+
password: 'secret'
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Get authenticated user
|
|
738
|
+
const current = await Auth.user()
|
|
739
|
+
</div>
|
|
740
|
+
</div>
|
|
741
|
+
</div>
|
|
742
|
+
</div>
|
|
743
|
+
|
|
744
|
+
<div id="window-frontend" class="window" style="left: 250px; top: 140px; width: 700px; height: 550px;">
|
|
745
|
+
<div class="window-titlebar">
|
|
746
|
+
<div class="window-icon">🎨</div>
|
|
747
|
+
<div class="window-title">Frontend Features</div>
|
|
748
|
+
<div class="window-controls">
|
|
749
|
+
<button class="minimize window-control" onclick="minimizeWindow('frontend')">_</button>
|
|
750
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('frontend')">□</button>
|
|
751
|
+
<button class="close window-control" onclick="closeWindow('frontend')">×</button>
|
|
752
|
+
</div>
|
|
753
|
+
</div>
|
|
754
|
+
<div class="window-content">
|
|
755
|
+
<h2>Frontend</h2>
|
|
756
|
+
<p>Develop dynamic UIs with helpers for atomic design, and much more.</p>
|
|
757
|
+
<p style="color: #333; font-size: 12px;">⚡️ Powered by TypeScript, Bun & Tauri</p>
|
|
758
|
+
|
|
759
|
+
<div class="feature-buttons">
|
|
760
|
+
<button class="active feature-btn" onclick="showFeature('frontend', 'components')">Components</button>
|
|
761
|
+
<button class="feature-btn" onclick="showFeature('frontend', 'ui-kit')">UI Kit</button>
|
|
762
|
+
<button class="feature-btn" onclick="showFeature('frontend', 'routing')">Routing</button>
|
|
763
|
+
<button class="feature-btn" onclick="showFeature('frontend', 'desktop')">Desktop</button>
|
|
764
|
+
</div>
|
|
765
|
+
|
|
766
|
+
<div id="frontend-feature-content">
|
|
767
|
+
<h3>Components</h3>
|
|
768
|
+
<div class="code-display">
|
|
769
|
+
<template>
|
|
770
|
+
<Card title="Hello">
|
|
771
|
+
<p>Reusable components</p>
|
|
772
|
+
</Card>
|
|
773
|
+
</template>
|
|
774
|
+
|
|
775
|
+
<script setup>
|
|
776
|
+
// Auto-imported
|
|
777
|
+
</script>
|
|
778
|
+
</div>
|
|
779
|
+
</div>
|
|
780
|
+
</div>
|
|
781
|
+
</div>
|
|
782
|
+
|
|
783
|
+
<div id="window-cloud" class="window" style="left: 300px; top: 160px; width: 700px; height: 550px;">
|
|
784
|
+
<div class="window-titlebar">
|
|
785
|
+
<div class="window-icon">☁️</div>
|
|
786
|
+
<div class="window-title">Cloud Features</div>
|
|
787
|
+
<div class="window-controls">
|
|
788
|
+
<button class="minimize window-control" onclick="minimizeWindow('cloud')">_</button>
|
|
789
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('cloud')">□</button>
|
|
790
|
+
<button class="close window-control" onclick="closeWindow('cloud')">×</button>
|
|
791
|
+
</div>
|
|
792
|
+
</div>
|
|
793
|
+
<div class="window-content">
|
|
794
|
+
<h2>Cloud</h2>
|
|
795
|
+
<p>Develop & maintain cloud infrastructure with ease.</p>
|
|
796
|
+
<p style="color: #333; font-size: 12px;">Imagine Vercel, Vapor and Forge having been unified.</p>
|
|
797
|
+
|
|
798
|
+
<div class="feature-buttons">
|
|
799
|
+
<button class="active feature-btn" onclick="showFeature('cloud', 'deployment')">Deployment</button>
|
|
800
|
+
<button class="feature-btn" onclick="showFeature('cloud', 'storage')">Storage</button>
|
|
801
|
+
<button class="feature-btn" onclick="showFeature('cloud', 'cdn')">CDN</button>
|
|
802
|
+
<button class="feature-btn" onclick="showFeature('cloud', 'dns')">DNS</button>
|
|
803
|
+
</div>
|
|
804
|
+
|
|
805
|
+
<div id="cloud-feature-content">
|
|
806
|
+
<h3>Deployment</h3>
|
|
807
|
+
<div class="code-display">
|
|
808
|
+
export default {
|
|
809
|
+
provider: 'aws',
|
|
810
|
+
region: 'us-east-1',
|
|
811
|
+
|
|
812
|
+
compute: {
|
|
813
|
+
type: 'serverless',
|
|
814
|
+
memory: 1024
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
</div>
|
|
818
|
+
</div>
|
|
819
|
+
</div>
|
|
820
|
+
</div>
|
|
821
|
+
|
|
822
|
+
<div id="window-dashboard" class="window" style="left: 350px; top: 180px; width: 600px; height: 400px;">
|
|
823
|
+
<div class="window-titlebar">
|
|
824
|
+
<div class="window-icon">📊</div>
|
|
825
|
+
<div class="window-title">Dashboard</div>
|
|
826
|
+
<div class="window-controls">
|
|
827
|
+
<button class="minimize window-control" onclick="minimizeWindow('dashboard')">_</button>
|
|
828
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('dashboard')">□</button>
|
|
829
|
+
<button class="close window-control" onclick="closeWindow('dashboard')">×</button>
|
|
830
|
+
</div>
|
|
831
|
+
</div>
|
|
832
|
+
<div class="window-content">
|
|
833
|
+
<h2>Dashboard</h2>
|
|
834
|
+
<div style="margin-top: 40px; text-align: center;">
|
|
835
|
+
<div style="font-size: 64px; margin-bottom: 20px;">🚧</div>
|
|
836
|
+
<h3 style="color: #0831d9; margin-bottom: 12px;">Work in Progress</h3>
|
|
837
|
+
<p style="color: #333;">The Stacks Dashboard is currently under development.</p>
|
|
838
|
+
<p style="color: #333; margin-top: 8px;">Check back soon for exciting new features!</p>
|
|
839
|
+
<div style="margin-top: 32px; padding: 16px; background: #fffacd; border: 2px solid #ffd700; border-radius: 4px; display: inline-block;">
|
|
840
|
+
<p style="margin: 0; font-weight: bold; color: #333;">💡 Coming Soon: Real-time metrics, analytics, and insights</p>
|
|
841
|
+
</div>
|
|
842
|
+
</div>
|
|
843
|
+
</div>
|
|
844
|
+
</div>
|
|
845
|
+
|
|
846
|
+
<div id="window-welcome" class="active window" style="left: 150px; top: 100px; width: 700px; height: 600px; z-index: 101;">
|
|
847
|
+
<div class="window-titlebar">
|
|
848
|
+
<div class="window-icon">📃</div>
|
|
849
|
+
<div class="window-title">Welcome.pdf - PDF Viewer</div>
|
|
850
|
+
<div class="window-controls">
|
|
851
|
+
<button class="minimize window-control" onclick="minimizeWindow('welcome')">_</button>
|
|
852
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('welcome')">□</button>
|
|
853
|
+
<button class="close window-control" onclick="closeWindow('welcome')">×</button>
|
|
854
|
+
</div>
|
|
855
|
+
</div>
|
|
856
|
+
<div class="window-content" style="background: #525659; padding: 0;">
|
|
857
|
+
<div style="background: #323639; padding: 8px 12px; border-bottom: 1px solid #222; display: flex; gap: 8px; align-items: center;">
|
|
858
|
+
<button onclick="printWelcome()" style="padding: 4px 12px; background: #3c3f41; border: 1px solid #555; color: #ccc; font-size: 11px; cursor: pointer;">Print</button>
|
|
859
|
+
<button onclick="downloadWelcome()" style="padding: 4px 12px; background: #3c3f41; border: 1px solid #555; color: #ccc; font-size: 11px; cursor: pointer;">Download</button>
|
|
860
|
+
<div style="flex: 1;"></div>
|
|
861
|
+
<span style="color: #ccc; font-size: 11px;">Page 1 of 1</span>
|
|
862
|
+
<div style="display: flex; align-items: center; gap: 4px;">
|
|
863
|
+
<button onclick="decreaseZoom()" style="padding: 4px 10px; background: #3c3f41; border: 1px solid #555; color: #ccc; font-size: 14px; cursor: pointer; font-weight: bold;">−</button>
|
|
864
|
+
<input id="zoom-level" type="number" min="25" max="400" step="25" value="100" onchange="setZoomFromInput()" style="width: 60px; padding: 4px 6px; background: #3c3f41; border: 1px solid #555; color: #ccc; font-size: 11px; text-align: center;">
|
|
865
|
+
<button onclick="increaseZoom()" style="padding: 4px 10px; background: #3c3f41; border: 1px solid #555; color: #ccc; font-size: 14px; cursor: pointer; font-weight: bold;">+</button>
|
|
866
|
+
</div>
|
|
867
|
+
</div>
|
|
868
|
+
<div id="welcome-pdf-content" style="background: white; margin: 20px auto; width: 90%; min-height: 500px; box-shadow: 0 4px 12px rgba(0,0,0,0.5); padding: 40px 50px; transition: transform 0.2s ease;">
|
|
869
|
+
<div style="text-align: center; margin-bottom: 40px;">
|
|
870
|
+
<h1 style="color: #0831d9; font-size: 48px; margin: 0 0 10px 0; font-weight: bold;">STACKS.JS</h1>
|
|
871
|
+
<p style="color: #333; font-size: 18px; margin: 0;">The TypeScript Framework for Modern Development</p>
|
|
872
|
+
<p style="color: #4a4a4a; font-size: 14px; margin: 8px 0 0 0;">Version 1.0 • October 2025</p>
|
|
873
|
+
</div>
|
|
874
|
+
|
|
875
|
+
<div style="background: linear-gradient(135deg, #0831d9 0%, #245edb 100%); color: white; padding: 30px; border-radius: 8px; margin-bottom: 30px; text-align: center;">
|
|
876
|
+
<h2 style="margin: 0 0 16px 0; font-size: 28px; font-weight: bold; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.3);">Lightning Fast Performance</h2>
|
|
877
|
+
<p style="margin: 0 0 20px 0; font-size: 16px; font-weight: 500; color: #ffffff; text-shadow: 0 1px 2px rgba(0,0,0,0.2);">Built on Bun, the fastest JavaScript runtime</p>
|
|
878
|
+
|
|
879
|
+
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 30px;">
|
|
880
|
+
<div style="background: rgba(255,255,255,0.15); padding: 20px; border-radius: 6px; backdrop-filter: blur(10px);">
|
|
881
|
+
<div style="font-size: 36px; font-weight: bold; margin-bottom: 8px;">4.2x</div>
|
|
882
|
+
<div style="font-size: 13px; opacity: 0.9;">Faster than Next.js</div>
|
|
883
|
+
<div style="font-size: 11px; opacity: 0.7; margin-top: 4px;">Server startup time</div>
|
|
884
|
+
</div>
|
|
885
|
+
<div style="background: rgba(255,255,255,0.15); padding: 20px; border-radius: 6px; backdrop-filter: blur(10px);">
|
|
886
|
+
<div style="font-size: 36px; font-weight: bold; margin-bottom: 8px;">8.1x</div>
|
|
887
|
+
<div style="font-size: 13px; opacity: 0.9;">Faster than Express</div>
|
|
888
|
+
<div style="font-size: 11px; opacity: 0.7; margin-top: 4px;">Request throughput</div>
|
|
889
|
+
</div>
|
|
890
|
+
<div style="background: rgba(255,255,255,0.15); padding: 20px; border-radius: 6px; backdrop-filter: blur(10px);">
|
|
891
|
+
<div style="font-size: 36px; font-weight: bold; margin-bottom: 8px;">15x</div>
|
|
892
|
+
<div style="font-size: 13px; opacity: 0.9;">Faster than Laravel</div>
|
|
893
|
+
<div style="font-size: 11px; opacity: 0.7; margin-top: 4px;">Cold start time</div>
|
|
894
|
+
</div>
|
|
895
|
+
</div>
|
|
896
|
+
</div>
|
|
897
|
+
|
|
898
|
+
<h3 style="color: #0831d9; font-size: 24px; margin: 30px 0 16px 0; border-bottom: 2px solid #0831d9; padding-bottom: 8px;">What is Stacks?</h3>
|
|
899
|
+
<p style="line-height: 1.8; color: #333; margin-bottom: 16px;">
|
|
900
|
+
Stacks is a rapid development framework that enables you to build modern web applications, APIs, and cloud infrastructure with TypeScript.
|
|
901
|
+
It provides an elegant, opinionated solution for common development needs while maintaining complete configurability.
|
|
902
|
+
</p>
|
|
903
|
+
|
|
904
|
+
<h3 style="color: #0831d9; font-size: 24px; margin: 30px 0 16px 0; border-bottom: 2px solid #0831d9; padding-bottom: 8px;">Key Features</h3>
|
|
905
|
+
<div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-bottom: 24px;">
|
|
906
|
+
<div style="display: flex; align-items: start; gap: 12px;">
|
|
907
|
+
<span style="font-size: 24px;">⚡</span>
|
|
908
|
+
<div>
|
|
909
|
+
<strong style="color: #0831d9; display: block; margin-bottom: 4px;">Ultra-Fast Runtime</strong>
|
|
910
|
+
<span style="font-size: 13px; color: #333;">Built on Bun for maximum performance</span>
|
|
911
|
+
</div>
|
|
912
|
+
</div>
|
|
913
|
+
<div style="display: flex; align-items: start; gap: 12px;">
|
|
914
|
+
<span style="font-size: 24px;">🎯</span>
|
|
915
|
+
<div>
|
|
916
|
+
<strong style="color: #0831d9; display: block; margin-bottom: 4px;">Type-Safe Everything</strong>
|
|
917
|
+
<span style="font-size: 13px; color: #333;">Full TypeScript support throughout</span>
|
|
918
|
+
</div>
|
|
919
|
+
</div>
|
|
920
|
+
<div style="display: flex; align-items: start; gap: 12px;">
|
|
921
|
+
<span style="font-size: 24px;">🔋</span>
|
|
922
|
+
<div>
|
|
923
|
+
<strong style="color: #0831d9; display: block; margin-bottom: 4px;">Batteries Included</strong>
|
|
924
|
+
<span style="font-size: 13px; color: #333;">ORM, Auth, Queue, Cache, and more</span>
|
|
925
|
+
</div>
|
|
926
|
+
</div>
|
|
927
|
+
<div style="display: flex; align-items: start; gap: 12px;">
|
|
928
|
+
<span style="font-size: 24px;">🖥️</span>
|
|
929
|
+
<div>
|
|
930
|
+
<strong style="color: #0831d9; display: block; margin-bottom: 4px;">Cross-Platform</strong>
|
|
931
|
+
<span style="font-size: 13px; color: #333;">Web, Desktop & Mobile from one codebase</span>
|
|
932
|
+
</div>
|
|
933
|
+
</div>
|
|
934
|
+
</div>
|
|
935
|
+
|
|
936
|
+
<div style="background: #fffacd; border-left: 4px solid #ffd700; padding: 16px 20px; margin: 24px 0;">
|
|
937
|
+
<strong style="color: #333; display: block; margin-bottom: 8px;">🚀 Quick Start</strong>
|
|
938
|
+
<code style="display: block; background: #fff; padding: 12px; border-radius: 4px; font-family: 'Courier New', monospace; font-size: 13px; color: #0831d9; margin-top: 8px;">
|
|
939
|
+
bunx stacks new my-project
|
|
940
|
+
</code>
|
|
941
|
+
</div>
|
|
942
|
+
|
|
943
|
+
<div style="margin: 40px 0 30px 0;">
|
|
944
|
+
<h2 style="text-align: center; color: #0831d9; font-size: 32px; margin: 0 0 8px 0;">Pricing</h2>
|
|
945
|
+
<p style="text-align: center; color: #333; font-size: 16px; margin: 0 0 24px 0;">
|
|
946
|
+
<strong style="background: linear-gradient(135deg, #5eac56 0%, #3c873c 100%); color: white; padding: 4px 12px; border-radius: 4px;">🎉 Early Bird Special</strong>
|
|
947
|
+
</p>
|
|
948
|
+
<p style="text-align: center; color: #666; font-size: 13px; margin: 0 0 32px 0;">
|
|
949
|
+
We follow <strong>Big Mac Index Pricing</strong> – Fair pricing for everyone, everywhere
|
|
950
|
+
</p>
|
|
951
|
+
|
|
952
|
+
<div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; max-width: 700px; margin: 0 auto;">
|
|
953
|
+
<!-- Hobby Edition -->
|
|
954
|
+
<div onclick="selectPlan('hobby')" style="border: 2px solid #0831d9; border-radius: 8px; padding: 24px; background: linear-gradient(to bottom, #ffffff 0%, #f8f9fa 100%); cursor: pointer; transition: transform 0.2s, box-shadow 0.2s;" onmouseover="this.style.transform='translateY(-4px)'; this.style.boxShadow='0 6px 12px rgba(8,49,217,0.2)'" onmouseout="this.style.transform=''; this.style.boxShadow=''">
|
|
955
|
+
<h3 style="color: #0831d9; font-size: 24px; margin: 0 0 8px 0; text-align: center;">💡 Hobby Edition</h3>
|
|
956
|
+
<p style="text-align: center; color: #666; font-size: 12px; margin: 0 0 20px 0;">Perfect for personal projects</p>
|
|
957
|
+
|
|
958
|
+
<div style="background: #e8f4f8; padding: 16px; border-radius: 6px; text-align: center; border: 2px solid #0831d9;">
|
|
959
|
+
<div style="font-size: 28px; font-weight: bold; color: #0831d9; margin-bottom: 8px;">$9<span style="font-size: 16px; font-weight: normal;">/mo</span></div>
|
|
960
|
+
<div style="font-size: 14px; color: #333; margin-bottom: 12px;">or</div>
|
|
961
|
+
<div style="font-size: 24px; font-weight: bold; color: #0831d9;">$179<span style="font-size: 14px; font-weight: normal; color: #666;"> lifetime</span></div>
|
|
962
|
+
</div>
|
|
963
|
+
<p style="text-align: center; margin-top: 16px; font-size: 11px; color: #0831d9; font-weight: bold;">Click to purchase →</p>
|
|
964
|
+
</div>
|
|
965
|
+
|
|
966
|
+
<!-- Professional Edition -->
|
|
967
|
+
<div onclick="selectPlan('professional')" style="border: 3px solid #0831d9; border-radius: 8px; padding: 24px; background: linear-gradient(to bottom, #f0f7ff 0%, #e6f2ff 100%); position: relative; cursor: pointer; transition: transform 0.2s, box-shadow 0.2s;" onmouseover="this.style.transform='translateY(-4px)'; this.style.boxShadow='0 6px 12px rgba(8,49,217,0.3)'" onmouseout="this.style.transform=''; this.style.boxShadow=''">
|
|
968
|
+
<div style="position: absolute; top: -12px; left: 50%; transform: translateX(-50%); background: linear-gradient(135deg, #0831d9 0%, #245edb 100%); color: white; padding: 4px 16px; border-radius: 12px; font-size: 11px; font-weight: bold;">POPULAR</div>
|
|
969
|
+
|
|
970
|
+
<h3 style="color: #0831d9; font-size: 24px; margin: 8px 0 8px 0; text-align: center;">🚀 Professional Edition</h3>
|
|
971
|
+
<p style="text-align: center; color: #666; font-size: 12px; margin: 0 0 20px 0;">For professionals & teams</p>
|
|
972
|
+
|
|
973
|
+
<div style="background: #e8f4f8; padding: 16px; border-radius: 6px; text-align: center; border: 2px solid #0831d9;">
|
|
974
|
+
<div style="font-size: 28px; font-weight: bold; color: #0831d9; margin-bottom: 8px;">$29<span style="font-size: 16px; font-weight: normal;">/mo</span></div>
|
|
975
|
+
<div style="font-size: 14px; color: #333; margin-bottom: 12px;">or</div>
|
|
976
|
+
<div style="font-size: 24px; font-weight: bold; color: #0831d9;">$279<span style="font-size: 14px; font-weight: normal; color: #666;"> lifetime</span></div>
|
|
977
|
+
</div>
|
|
978
|
+
<p style="text-align: center; margin-top: 16px; font-size: 11px; color: #0831d9; font-weight: bold;">Click to purchase →</p>
|
|
979
|
+
</div>
|
|
980
|
+
</div>
|
|
981
|
+
|
|
982
|
+
<p style="text-align: center; color: #666; font-size: 11px; margin-top: 16px; font-style: italic;">
|
|
983
|
+
💳 All prices in USD. Prices may vary based on your location using Big Mac Index for fair global pricing.
|
|
984
|
+
</p>
|
|
985
|
+
</div>
|
|
986
|
+
|
|
987
|
+
<div style="text-align: center; margin-top: 40px; padding-top: 24px; border-top: 1px solid #ddd;">
|
|
988
|
+
<p style="color: #333; font-size: 12px; margin-bottom: 8px;">Learn more at <strong style="color: #0831d9;">stacksjs.com</strong></p>
|
|
989
|
+
<p style="color: #4a4a4a; font-size: 11px;">© 2025 Stacks. Open source under MIT License.</p>
|
|
990
|
+
</div>
|
|
991
|
+
</div>
|
|
992
|
+
</div>
|
|
993
|
+
</div>
|
|
994
|
+
|
|
995
|
+
<div id="window-license" class="window" style="left: 400px; top: 180px; width: 520px; height: 600px;">
|
|
996
|
+
<div class="window-titlebar">
|
|
997
|
+
<div class="window-icon">🔑</div>
|
|
998
|
+
<div class="window-title">Software License Registration</div>
|
|
999
|
+
<div class="window-controls">
|
|
1000
|
+
<button class="minimize window-control" onclick="minimizeWindow('license')">_</button>
|
|
1001
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('license')">□</button>
|
|
1002
|
+
<button class="close window-control" onclick="closeLicenseWindow()">×</button>
|
|
1003
|
+
</div>
|
|
1004
|
+
</div>
|
|
1005
|
+
<div class="window-content" style="background: #c0c0c0;">
|
|
1006
|
+
<div style="background: white; padding: 20px; border: 2px inset #999; margin-bottom: 20px;">
|
|
1007
|
+
<h2 style="text-align: center; color: #000080; margin: 0 0 10px 0; font-size: 20px;">STACKS.JS Professional Edition</h2>
|
|
1008
|
+
<p style="text-align: center; color: #333; font-size: 11px; margin: 0;">Version 1.0 - Build 2025.1</p>
|
|
1009
|
+
</div>
|
|
1010
|
+
|
|
1011
|
+
<div style="background: #ece9d8; padding: 16px; border: 2px groove #999; margin-bottom: 16px;">
|
|
1012
|
+
<p style="margin: 0 0 12px 0; font-size: 12px; line-height: 1.6;">
|
|
1013
|
+
Thank you for choosing STACKS.JS Professional Edition! To unlock all features and receive lifetime updates, please purchase a license code.
|
|
1014
|
+
</p>
|
|
1015
|
+
|
|
1016
|
+
<div style="background: #fff; padding: 12px; border: 1px solid #808080; margin: 12px 0;">
|
|
1017
|
+
<div style="display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 13px;">
|
|
1018
|
+
<span style="font-weight: bold;">License Type:</span>
|
|
1019
|
+
<span class="license-type">Professional Edition</span>
|
|
1020
|
+
</div>
|
|
1021
|
+
<div style="display: flex; justify-content: space-between; margin-bottom: 4px; font-size: 13px;">
|
|
1022
|
+
<span style="font-weight: bold;">Regular Monthly:</span>
|
|
1023
|
+
<span style="color: #666; text-decoration: line-through;">$49/mo</span>
|
|
1024
|
+
</div>
|
|
1025
|
+
<div style="display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 13px;">
|
|
1026
|
+
<span style="font-weight: bold;">Founding Member Price:</span>
|
|
1027
|
+
<span class="license-price" style="color: #16a34a; font-weight: bold;">$29/mo or $279 lifetime</span>
|
|
1028
|
+
</div>
|
|
1029
|
+
<div style="display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 12px; padding: 6px; background: #dcfce7; border-radius: 4px;">
|
|
1030
|
+
<span style="font-weight: bold; color: #15803d;">💰 Monthly Savings:</span>
|
|
1031
|
+
<span style="color: #15803d; font-weight: bold;">$20/mo (41% off) + Exclusive Lifetime Access</span>
|
|
1032
|
+
</div>
|
|
1033
|
+
<div style="display: flex; justify-content: space-between; font-size: 13px;">
|
|
1034
|
+
<span style="font-weight: bold;">Features:</span>
|
|
1035
|
+
<span class="license-features" style="text-align: right;">Unlimited Team Members<br>Priority Support<br>Lifetime Updates</span>
|
|
1036
|
+
</div>
|
|
1037
|
+
</div>
|
|
1038
|
+
|
|
1039
|
+
<div style="background: #fffacd; border: 2px solid #ffd700; padding: 10px; margin: 12px 0; font-size: 11px;">
|
|
1040
|
+
<strong>🎉 Founding Member Exclusive:</strong> This lifetime pricing is a <strong style="color: #dc2626;">once-in-a-lifetime offer</strong> and will never be available again after launch. Lock in your access now!
|
|
1041
|
+
</div>
|
|
1042
|
+
</div>
|
|
1043
|
+
|
|
1044
|
+
<div id="payment-section" style="background: #ece9d8; padding: 16px; border: 2px groove #999; margin-bottom: 16px;">
|
|
1045
|
+
<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;">
|
|
1046
|
+
<label style="font-weight: bold; font-size: 12px; margin: 0;">💳 Payment Information</label>
|
|
1047
|
+
<button onclick="togglePaymentSection()" style="background: linear-gradient(to bottom, #ffffff 0%, #ece9d8 100%); border: 2px outset #999; padding: 2px 8px; font-size: 11px; cursor: pointer;">
|
|
1048
|
+
Toggle
|
|
1049
|
+
</button>
|
|
1050
|
+
</div>
|
|
1051
|
+
|
|
1052
|
+
<div id="payment-form" style="display: block;">
|
|
1053
|
+
<div style="background: #ece9d8; padding: 12px; border: 2px groove #999; margin-bottom: 16px;">
|
|
1054
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1055
|
+
<span style="font-weight: bold; font-size: 12px;">Selected Edition:</span>
|
|
1056
|
+
<span class="license-type" style="color: #0831d9; font-weight: bold; font-size: 13px;">Professional Edition</span>
|
|
1057
|
+
</div>
|
|
1058
|
+
<div style="font-size: 11px; color: #666;">
|
|
1059
|
+
The edition pricing will be reflected in your plan options below.
|
|
1060
|
+
</div>
|
|
1061
|
+
</div>
|
|
1062
|
+
|
|
1063
|
+
<div style="margin-bottom: 16px;">
|
|
1064
|
+
<label style="display: block; margin-bottom: 8px; font-size: 11px; font-weight: bold;">Select Your Plan</label>
|
|
1065
|
+
|
|
1066
|
+
<div style="display: flex; flex-direction: column; gap: 8px;">
|
|
1067
|
+
<label style="display: flex; align-items: center; padding: 10px; background: white; border: 2px solid #0831d9; border-radius: 4px; cursor: pointer;">
|
|
1068
|
+
<input type="radio" name="pricing-plan" value="lifetime" checked style="margin-right: 8px; width: 16px; height: 16px;" />
|
|
1069
|
+
<div style="flex: 1;">
|
|
1070
|
+
<div style="font-weight: bold; font-size: 13px; color: #0831d9;">🎉 Lifetime Access - $279</div>
|
|
1071
|
+
<div style="font-size: 11px; color: #666; margin-top: 2px;">Pay once, own forever. Exclusive founding member offer!</div>
|
|
1072
|
+
</div>
|
|
1073
|
+
</label>
|
|
1074
|
+
|
|
1075
|
+
<label style="display: flex; align-items: center; padding: 10px; background: white; border: 2px solid #999; border-radius: 4px; cursor: pointer;">
|
|
1076
|
+
<input type="radio" name="pricing-plan" value="monthly" style="margin-right: 8px; width: 16px; height: 16px;" />
|
|
1077
|
+
<div style="flex: 1;">
|
|
1078
|
+
<div style="font-weight: bold; font-size: 13px;">Monthly Subscription - $29/mo</div>
|
|
1079
|
+
<div style="font-size: 11px; color: #666; margin-top: 2px;">Billed monthly. Cancel anytime.</div>
|
|
1080
|
+
</div>
|
|
1081
|
+
</label>
|
|
1082
|
+
</div>
|
|
1083
|
+
</div>
|
|
1084
|
+
|
|
1085
|
+
<div style="margin-bottom: 12px;">
|
|
1086
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Card Number</label>
|
|
1087
|
+
<input
|
|
1088
|
+
type="text"
|
|
1089
|
+
id="card-number"
|
|
1090
|
+
placeholder="1234 5678 9012 3456"
|
|
1091
|
+
maxlength="19"
|
|
1092
|
+
style="width: 100%; padding: 6px; font-size: 13px; border: 2px inset #999; font-family: 'Courier New', monospace;"
|
|
1093
|
+
oninput="formatCardNumber(this)"
|
|
1094
|
+
/>
|
|
1095
|
+
</div>
|
|
1096
|
+
|
|
1097
|
+
<div style="display: flex; gap: 12px; margin-bottom: 12px;">
|
|
1098
|
+
<div style="flex: 1;">
|
|
1099
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Expiration Date</label>
|
|
1100
|
+
<input
|
|
1101
|
+
type="text"
|
|
1102
|
+
id="card-expiry"
|
|
1103
|
+
placeholder="MM/YY"
|
|
1104
|
+
maxlength="5"
|
|
1105
|
+
style="width: 100%; padding: 6px; font-size: 13px; border: 2px inset #999; font-family: 'Courier New', monospace;"
|
|
1106
|
+
oninput="formatExpiry(this)"
|
|
1107
|
+
/>
|
|
1108
|
+
</div>
|
|
1109
|
+
<div style="flex: 1;">
|
|
1110
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">CVV</label>
|
|
1111
|
+
<input
|
|
1112
|
+
type="text"
|
|
1113
|
+
id="card-cvv"
|
|
1114
|
+
placeholder="123"
|
|
1115
|
+
maxlength="4"
|
|
1116
|
+
style="width: 100%; padding: 6px; font-size: 13px; border: 2px inset #999; font-family: 'Courier New', monospace;"
|
|
1117
|
+
oninput="formatCVV(this)"
|
|
1118
|
+
/>
|
|
1119
|
+
</div>
|
|
1120
|
+
</div>
|
|
1121
|
+
|
|
1122
|
+
<div style="margin-bottom: 12px;">
|
|
1123
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Cardholder Name</label>
|
|
1124
|
+
<input
|
|
1125
|
+
type="text"
|
|
1126
|
+
id="card-name"
|
|
1127
|
+
placeholder="JOHN DOE"
|
|
1128
|
+
style="width: 100%; padding: 6px; font-size: 13px; border: 2px inset #999; text-transform: uppercase;"
|
|
1129
|
+
/>
|
|
1130
|
+
</div>
|
|
1131
|
+
|
|
1132
|
+
<div style="margin-bottom: 12px;">
|
|
1133
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Billing Email</label>
|
|
1134
|
+
<input
|
|
1135
|
+
type="email"
|
|
1136
|
+
id="billing-email"
|
|
1137
|
+
placeholder="john@example.com"
|
|
1138
|
+
style="width: 100%; padding: 6px; font-size: 13px; border: 2px inset #999;"
|
|
1139
|
+
/>
|
|
1140
|
+
</div>
|
|
1141
|
+
|
|
1142
|
+
<div style="display: flex; align-items: center; gap: 6px; margin-top: 12px; margin-bottom: 16px;">
|
|
1143
|
+
<input type="checkbox" id="terms-agree" style="width: 14px; height: 14px;" />
|
|
1144
|
+
<label for="terms-agree" style="font-size: 11px; margin: 0;">I agree to the terms and conditions</label>
|
|
1145
|
+
</div>
|
|
1146
|
+
|
|
1147
|
+
<div style="background: #f0f9ff; border: 1px solid #0284c7; padding: 8px 10px; border-radius: 4px;">
|
|
1148
|
+
<p style="margin: 0; font-size: 11px; color: #0369a1; line-height: 1.4;">
|
|
1149
|
+
🔒 <strong>Secure Payment:</strong> All payment data is securely processed by Stripe. Your card information is never stored on our servers.
|
|
1150
|
+
</p>
|
|
1151
|
+
</div>
|
|
1152
|
+
</div>
|
|
1153
|
+
</div>
|
|
1154
|
+
|
|
1155
|
+
<div style="display: flex; gap: 12px; justify-content: center;">
|
|
1156
|
+
<button
|
|
1157
|
+
onclick="purchaseLicense()"
|
|
1158
|
+
style="padding: 8px 24px; background: linear-gradient(to bottom, #5eac56 0%, #3c873c 100%); border: 2px outset #999; font-weight: bold; color: white; font-size: 13px; cursor: pointer; box-shadow: 1px 1px 2px rgba(0,0,0,0.3);"
|
|
1159
|
+
>
|
|
1160
|
+
💳 Purchase License
|
|
1161
|
+
</button>
|
|
1162
|
+
<button
|
|
1163
|
+
onclick="closeLicenseWindow()"
|
|
1164
|
+
style="padding: 8px 24px; background: linear-gradient(to bottom, #ffffff 0%, #ece9d8 100%); border: 2px outset #999; font-size: 13px; cursor: pointer; box-shadow: 1px 1px 2px rgba(0,0,0,0.3);"
|
|
1165
|
+
>
|
|
1166
|
+
Cancel
|
|
1167
|
+
</button>
|
|
1168
|
+
</div>
|
|
1169
|
+
|
|
1170
|
+
<div style="margin-top: 16px; text-align: center; font-size: 10px; color: #333;">
|
|
1171
|
+
<p style="margin: 4px 0;">Need help? Contact support@stacksjs.com</p>
|
|
1172
|
+
<p style="margin: 4px 0;">30-Day Money-Back Guarantee</p>
|
|
1173
|
+
</div>
|
|
1174
|
+
</div>
|
|
1175
|
+
</div>
|
|
1176
|
+
|
|
1177
|
+
<div id="window-blog" class="window" style="left: 300px; top: 120px; width: 750px; height: 650px;">
|
|
1178
|
+
<div class="window-titlebar">
|
|
1179
|
+
<div class="window-icon">📝</div>
|
|
1180
|
+
<div class="window-title">Stacks Blog - Coming Soon</div>
|
|
1181
|
+
<div class="window-controls">
|
|
1182
|
+
<button class="minimize window-control" onclick="minimizeWindow('blog')">_</button>
|
|
1183
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('blog')">□</button>
|
|
1184
|
+
<button class="close window-control" onclick="closeWindow('blog')">×</button>
|
|
1185
|
+
</div>
|
|
1186
|
+
</div>
|
|
1187
|
+
<div class="window-content" style="overflow-y: auto;">
|
|
1188
|
+
<div style="background: linear-gradient(to bottom, #0831d9 0%, #1c4ed8 100%); color: white; padding: 24px; margin: -16px -16px 20px -16px;">
|
|
1189
|
+
<h1 style="margin: 0 0 8px 0; font-size: 32px; font-weight: bold;">Stacks Blog</h1>
|
|
1190
|
+
<p style="margin: 0; font-size: 14px; opacity: 0.9;">Updates, tutorials, and insights from the Stacks team</p>
|
|
1191
|
+
</div>
|
|
1192
|
+
|
|
1193
|
+
<!-- Blog Post 1 -->
|
|
1194
|
+
<article style="background: white; padding: 20px; border: 2px groove #999; margin-bottom: 20px;">
|
|
1195
|
+
<div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 12px;">
|
|
1196
|
+
<h2 style="margin: 0; color: #0831d9; font-size: 20px;">Introducing Stacks 1.0: The Future of Full-Stack TypeScript</h2>
|
|
1197
|
+
<span style="background: #0831d9; color: white; padding: 4px 12px; border-radius: 12px; font-size: 11px; white-space: nowrap;">Coming Soon</span>
|
|
1198
|
+
</div>
|
|
1199
|
+
<div style="color: #666; font-size: 12px; margin-bottom: 12px;">
|
|
1200
|
+
📅 December 2025 • ✍️ Chris Breuer • 🏷️ Release, TypeScript, Framework
|
|
1201
|
+
</div>
|
|
1202
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1203
|
+
We're thrilled to announce that Stacks 1.0 is on the horizon! After months of development and community feedback,
|
|
1204
|
+
we're ready to unveil a revolutionary full-stack TypeScript framework that makes building modern applications faster,
|
|
1205
|
+
safer, and more enjoyable than ever before.
|
|
1206
|
+
</p>
|
|
1207
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1208
|
+
Stacks 1.0 brings together the best parts of modern web development: type-safe APIs, lightning-fast build times with Bun,
|
|
1209
|
+
powerful CLI tools, and a batteries-included ecosystem that just works. Whether you're building a SaaS application,
|
|
1210
|
+
a desktop app with Tauri, or a high-performance API, Stacks has you covered.
|
|
1211
|
+
</p>
|
|
1212
|
+
<a href="#" style="color: #0831d9; text-decoration: none; font-weight: bold; font-size: 13px;">Read more →</a>
|
|
1213
|
+
</article>
|
|
1214
|
+
|
|
1215
|
+
<!-- Blog Post 2 -->
|
|
1216
|
+
<article style="background: white; padding: 20px; border: 2px groove #999; margin-bottom: 20px;">
|
|
1217
|
+
<div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 12px;">
|
|
1218
|
+
<h2 style="margin: 0; color: #0831d9; font-size: 20px;">Building Type-Safe APIs with Stacks Router</h2>
|
|
1219
|
+
<span style="background: #22c55e; color: white; padding: 4px 12px; border-radius: 12px; font-size: 11px; white-space: nowrap;">Tutorial</span>
|
|
1220
|
+
</div>
|
|
1221
|
+
<div style="color: #666; font-size: 12px; margin-bottom: 12px;">
|
|
1222
|
+
📅 November 2025 • ✍️ Engineering Team • 🏷️ Tutorial, API, TypeScript
|
|
1223
|
+
</div>
|
|
1224
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1225
|
+
Learn how to build fully type-safe REST and RPC APIs using Stacks Router. In this comprehensive tutorial,
|
|
1226
|
+
we'll walk through creating endpoints, validating requests, handling errors, and leveraging TypeScript's
|
|
1227
|
+
type system to catch bugs before they reach production.
|
|
1228
|
+
</p>
|
|
1229
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1230
|
+
Stacks Router provides automatic OpenAPI documentation, built-in validation with Zod, and seamless integration
|
|
1231
|
+
with your database models. Plus, with intelligent type inference, your frontend automatically knows about your
|
|
1232
|
+
API's exact shape—no manual synchronization needed!
|
|
1233
|
+
</p>
|
|
1234
|
+
<a href="#" style="color: #0831d9; text-decoration: none; font-weight: bold; font-size: 13px;">Read more →</a>
|
|
1235
|
+
</article>
|
|
1236
|
+
|
|
1237
|
+
<!-- Blog Post 3 -->
|
|
1238
|
+
<article style="background: white; padding: 20px; border: 2px groove #999; margin-bottom: 20px;">
|
|
1239
|
+
<div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 12px;">
|
|
1240
|
+
<h2 style="margin: 0; color: #0831d9; font-size: 20px;">From Idea to Production in 10 Minutes</h2>
|
|
1241
|
+
<span style="background: #f59e0b; color: white; padding: 4px 12px; border-radius: 12px; font-size: 11px; white-space: nowrap;">Guide</span>
|
|
1242
|
+
</div>
|
|
1243
|
+
<div style="color: #666; font-size: 12px; margin-bottom: 12px;">
|
|
1244
|
+
📅 October 2025 • ✍️ Developer Advocate • 🏷️ Getting Started, Deployment
|
|
1245
|
+
</div>
|
|
1246
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1247
|
+
See how Stacks streamlines your development workflow from local development to production deployment.
|
|
1248
|
+
With built-in database migrations, automatic TypeScript compilation, hot module reloading, and one-command
|
|
1249
|
+
deployments, you'll ship faster than ever.
|
|
1250
|
+
</p>
|
|
1251
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1252
|
+
This guide covers scaffolding a new project, setting up your database, building your first API, creating
|
|
1253
|
+
a frontend component, running tests, and deploying to your preferred hosting provider—all in under 10 minutes!
|
|
1254
|
+
</p>
|
|
1255
|
+
<a href="#" style="color: #0831d9; text-decoration: none; font-weight: bold; font-size: 13px;">Read more →</a>
|
|
1256
|
+
</article>
|
|
1257
|
+
|
|
1258
|
+
<!-- Blog Post 4 -->
|
|
1259
|
+
<article style="background: white; padding: 20px; border: 2px groove #999; margin-bottom: 20px;">
|
|
1260
|
+
<div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 12px;">
|
|
1261
|
+
<h2 style="margin: 0; color: #0831d9; font-size: 20px;">Meet the Ecosystem: 50+ Libraries & CLIs</h2>
|
|
1262
|
+
<span style="background: #8b5cf6; color: white; padding: 4px 12px; border-radius: 12px; font-size: 11px; white-space: nowrap;">Ecosystem</span>
|
|
1263
|
+
</div>
|
|
1264
|
+
<div style="color: #666; font-size: 12px; margin-bottom: 12px;">
|
|
1265
|
+
📅 September 2025 • ✍️ Chris Breuer • 🏷️ Ecosystem, Tools, Libraries
|
|
1266
|
+
</div>
|
|
1267
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1268
|
+
Explore the growing Stacks ecosystem with over 50 carefully crafted libraries and CLI tools. From image optimization
|
|
1269
|
+
with imgx and pngx, to DNS management with dnsx, to queue processing with bun-queue—every tool is designed to work
|
|
1270
|
+
seamlessly together while remaining independently useful.
|
|
1271
|
+
</p>
|
|
1272
|
+
<p style="line-height: 1.6; color: #333;">
|
|
1273
|
+
Each package follows our core principles: type-safe, performant, well-documented, and developer-friendly.
|
|
1274
|
+
Whether you need HTTP utilities, logging, testing, or deployment tools, the Stacks ecosystem has you covered.
|
|
1275
|
+
</p>
|
|
1276
|
+
<a href="#" style="color: #0831d9; text-decoration: none; font-weight: bold; font-size: 13px;">Read more →</a>
|
|
1277
|
+
</article>
|
|
1278
|
+
|
|
1279
|
+
<!-- Newsletter Signup -->
|
|
1280
|
+
<div id="blog-newsletter" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 24px; border-radius: 8px; border: 2px solid #5a67d8; text-align: center;">
|
|
1281
|
+
<h3 style="margin: 0 0 8px 0; font-size: 20px;">Stay Updated</h3>
|
|
1282
|
+
<p style="margin: 0 0 16px 0; font-size: 13px; opacity: 0.95;">
|
|
1283
|
+
Subscribe to our newsletter for the latest updates, tutorials, and community highlights.
|
|
1284
|
+
</p>
|
|
1285
|
+
<div id="blog-newsletter-form" style="display: flex; gap: 8px; max-width: 400px; margin: 0 auto;">
|
|
1286
|
+
<input
|
|
1287
|
+
id="blog-newsletter-email"
|
|
1288
|
+
type="email"
|
|
1289
|
+
placeholder="your@email.com"
|
|
1290
|
+
style="flex: 1; padding: 10px 14px; border: 2px inset #999; border-radius: 4px; font-size: 13px;"
|
|
1291
|
+
/>
|
|
1292
|
+
<button onclick="handleBlogNewsletterSignup()" style="padding: 10px 20px; background: white; color: #667eea; border: 2px outset #999; border-radius: 4px; font-weight: bold; cursor: pointer; font-size: 13px;">
|
|
1293
|
+
Subscribe
|
|
1294
|
+
</button>
|
|
1295
|
+
</div>
|
|
1296
|
+
<div id="blog-newsletter-success" style="display: none; padding: 12px; background: rgba(255,255,255,0.2); border-radius: 4px;">
|
|
1297
|
+
Thanks for subscribing! We'll keep you updated.
|
|
1298
|
+
</div>
|
|
1299
|
+
</div>
|
|
1300
|
+
</div>
|
|
1301
|
+
</div>
|
|
1302
|
+
|
|
1303
|
+
<div id="window-sponsors" class="window" style="left: 250px; top: 100px; width: 800px; height: 650px;">
|
|
1304
|
+
<div class="window-titlebar">
|
|
1305
|
+
<div class="window-icon">💖</div>
|
|
1306
|
+
<div class="window-title">Become a Stacks.js Sponsor</div>
|
|
1307
|
+
<div class="window-controls">
|
|
1308
|
+
<button class="minimize window-control" onclick="minimizeWindow('sponsors')">_</button>
|
|
1309
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('sponsors')">□</button>
|
|
1310
|
+
<button class="close window-control" onclick="closeWindow('sponsors')">×</button>
|
|
1311
|
+
</div>
|
|
1312
|
+
</div>
|
|
1313
|
+
<div class="window-content" style="overflow-y: auto;">
|
|
1314
|
+
<div style="background: linear-gradient(135deg, #ec4899 0%, #8b5cf6 100%); color: white; padding: 24px; margin: -16px -16px 20px -16px;">
|
|
1315
|
+
<h1 style="margin: 0 0 8px 0; font-size: 28px;">💖 Support Open Source</h1>
|
|
1316
|
+
<p style="margin: 0; font-size: 14px; opacity: 0.95;">Help us maintain and develop the Stacks ecosystem</p>
|
|
1317
|
+
</div>
|
|
1318
|
+
|
|
1319
|
+
<div style="background: white; padding: 20px; border: 2px groove #999; margin-bottom: 16px;">
|
|
1320
|
+
<p style="line-height: 1.7; margin: 0 0 12px 0;">
|
|
1321
|
+
Stacks.js is an <strong>MIT licensed open source project</strong> and completely free to use. The tremendous amount of effort needed to maintain such a large ecosystem and develop new features is only made sustainable thanks to the generous financial backing of our sponsors.
|
|
1322
|
+
</p>
|
|
1323
|
+
</div>
|
|
1324
|
+
|
|
1325
|
+
<div style="background: #f0f9ff; padding: 16px; border: 2px solid #0284c7; margin-bottom: 16px; border-radius: 4px;">
|
|
1326
|
+
<h3 style="margin: 0 0 8px 0; color: #0369a1;">How to Sponsor</h3>
|
|
1327
|
+
<p style="margin: 0; font-size: 13px; line-height: 1.6;">
|
|
1328
|
+
Sponsorships can be done via <a href="https://github.com/sponsors/chrisbbreuer" target="_blank" style="color: #0831d9;">GitHub Sponsors</a> or <a href="https://opencollective.com/stacksjs" target="_blank" style="color: #0831d9;">OpenCollective</a>. Both monthly-recurring and one-time donations are accepted.
|
|
1329
|
+
</p>
|
|
1330
|
+
<p style="margin: 8px 0 0 0; font-size: 12px; color: #666;">
|
|
1331
|
+
Questions? Contact <strong>sponsor@stacksjs.com</strong>
|
|
1332
|
+
</p>
|
|
1333
|
+
</div>
|
|
1334
|
+
|
|
1335
|
+
<h2 style="margin: 0 0 12px 0; font-size: 18px;">Sponsorship Tiers</h2>
|
|
1336
|
+
|
|
1337
|
+
<!-- Global Special Sponsor -->
|
|
1338
|
+
<div style="background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%); padding: 16px; border: 3px solid #d97706; margin-bottom: 12px; border-radius: 6px; color: #78350f;">
|
|
1339
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
|
|
1340
|
+
<h3 style="margin: 0; font-size: 16px; color: #78350f;">⭐ Global Special Sponsor</h3>
|
|
1341
|
+
<span style="background: #78350f; color: #fef3c7; padding: 4px 12px; border-radius: 12px; font-size: 11px; font-weight: bold;">EXCLUSIVE</span>
|
|
1342
|
+
</div>
|
|
1343
|
+
<p style="margin: 0; font-size: 12px; line-height: 1.5;">
|
|
1344
|
+
Limited to one sponsor globally. <strong>Currently vacant.</strong> Above-the-fold logo placement on stacksjs.com, exclusive social media promotion, and top placement in all sponsorship locations.
|
|
1345
|
+
</p>
|
|
1346
|
+
</div>
|
|
1347
|
+
|
|
1348
|
+
<!-- Diamond -->
|
|
1349
|
+
<div style="background: white; padding: 14px; border: 2px solid #a78bfa; margin-bottom: 10px; border-radius: 4px;">
|
|
1350
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1351
|
+
<h3 style="margin: 0; font-size: 15px; color: #7c3aed;">💎 Diamond</h3>
|
|
1352
|
+
<strong style="color: #7c3aed;">$2,500/mo</strong>
|
|
1353
|
+
</div>
|
|
1354
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1355
|
+
Prominent logo on stacksjs.com, 70+ library sites, and all GitHub READMEs. Maximum visibility across the entire ecosystem.
|
|
1356
|
+
</p>
|
|
1357
|
+
</div>
|
|
1358
|
+
|
|
1359
|
+
<!-- Platinum -->
|
|
1360
|
+
<div style="background: white; padding: 14px; border: 2px solid #cbd5e1; margin-bottom: 10px; border-radius: 4px;">
|
|
1361
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1362
|
+
<h3 style="margin: 0; font-size: 15px; color: #64748b;">🥈 Platinum</h3>
|
|
1363
|
+
<strong style="color: #64748b;">$1,000/mo</strong>
|
|
1364
|
+
</div>
|
|
1365
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1366
|
+
Large logo placement across stacksjs.com, 70+ library sites, and GitHub READMEs.
|
|
1367
|
+
</p>
|
|
1368
|
+
</div>
|
|
1369
|
+
|
|
1370
|
+
<!-- Gold Tiers -->
|
|
1371
|
+
<div style="background: white; padding: 14px; border: 2px solid #fbbf24; margin-bottom: 10px; border-radius: 4px;">
|
|
1372
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1373
|
+
<h3 style="margin: 0; font-size: 15px; color: #d97706;">🥇 Double Gold / Gold</h3>
|
|
1374
|
+
<strong style="color: #d97706;">$500 - $250/mo</strong>
|
|
1375
|
+
</div>
|
|
1376
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1377
|
+
Large logo on stacksjs.com and 70+ library sites/READMEs.
|
|
1378
|
+
</p>
|
|
1379
|
+
</div>
|
|
1380
|
+
|
|
1381
|
+
<!-- Silver -->
|
|
1382
|
+
<div style="background: white; padding: 14px; border: 2px solid #9ca3af; margin-bottom: 10px; border-radius: 4px;">
|
|
1383
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1384
|
+
<h3 style="margin: 0; font-size: 15px; color: #6b7280;">🥈 Silver</h3>
|
|
1385
|
+
<strong style="color: #6b7280;">$100/mo</strong>
|
|
1386
|
+
</div>
|
|
1387
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1388
|
+
Medium logo on stacksjs.com, library sites, and BACKERS.md files.
|
|
1389
|
+
</p>
|
|
1390
|
+
</div>
|
|
1391
|
+
|
|
1392
|
+
<!-- Bronze -->
|
|
1393
|
+
<div style="background: white; padding: 14px; border: 2px solid #d97706; margin-bottom: 10px; border-radius: 4px;">
|
|
1394
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1395
|
+
<h3 style="margin: 0; font-size: 15px; color: #92400e;">🥉 Bronze</h3>
|
|
1396
|
+
<strong style="color: #92400e;">$50/mo</strong>
|
|
1397
|
+
</div>
|
|
1398
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1399
|
+
Small logo placement across the ecosystem.
|
|
1400
|
+
</p>
|
|
1401
|
+
</div>
|
|
1402
|
+
|
|
1403
|
+
<!-- Individual Tiers -->
|
|
1404
|
+
<div style="background: #f3f4f6; padding: 14px; border: 2px solid #d1d5db; margin-bottom: 10px; border-radius: 4px;">
|
|
1405
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1406
|
+
<h3 style="margin: 0; font-size: 14px;">💚 Generous Backer</h3>
|
|
1407
|
+
<strong>$25/mo</strong>
|
|
1408
|
+
</div>
|
|
1409
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1410
|
+
Private Discord access, free Dashboard account, social media follow, name in BACKERS.md.
|
|
1411
|
+
</p>
|
|
1412
|
+
</div>
|
|
1413
|
+
|
|
1414
|
+
<div style="background: #f3f4f6; padding: 14px; border: 2px solid #d1d5db; margin-bottom: 10px; border-radius: 4px;">
|
|
1415
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1416
|
+
<h3 style="margin: 0; font-size: 14px;">🔐 Sponsorware Tier</h3>
|
|
1417
|
+
<strong>$10/mo</strong>
|
|
1418
|
+
</div>
|
|
1419
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1420
|
+
Access to sponsorware projects (DynamoDB ORM driver, etc.) + name in BACKERS.md.
|
|
1421
|
+
</p>
|
|
1422
|
+
</div>
|
|
1423
|
+
|
|
1424
|
+
<div style="background: #f3f4f6; padding: 14px; border: 2px solid #d1d5db; margin-bottom: 16px; border-radius: 4px;">
|
|
1425
|
+
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
|
1426
|
+
<h3 style="margin: 0; font-size: 14px;">❤️ Individual Backer</h3>
|
|
1427
|
+
<strong>$5/mo</strong>
|
|
1428
|
+
</div>
|
|
1429
|
+
<p style="margin: 0; font-size: 11px; line-height: 1.4; color: #333;">
|
|
1430
|
+
Name listed in BACKERS.md across 70+ repositories.
|
|
1431
|
+
</p>
|
|
1432
|
+
</div>
|
|
1433
|
+
|
|
1434
|
+
<!-- CTA Buttons -->
|
|
1435
|
+
<div style="display: flex; gap: 12px; justify-content: center; margin: 20px 0;">
|
|
1436
|
+
<a href="https://github.com/sponsors/chrisbbreuer" target="_blank" style="padding: 12px 24px; background: linear-gradient(to bottom, #ec4899 0%, #db2777 100%); color: white; border: 2px outset #999; font-weight: bold; text-decoration: none; border-radius: 4px; font-size: 13px;">
|
|
1437
|
+
💖 Sponsor on GitHub
|
|
1438
|
+
</a>
|
|
1439
|
+
<a href="https://opencollective.com/stacksjs" target="_blank" style="padding: 12px 24px; background: linear-gradient(to bottom, #8b5cf6 0%, #7c3aed 100%); color: white; border: 2px outset #999; font-weight: bold; text-decoration: none; border-radius: 4px; font-size: 13px;">
|
|
1440
|
+
Support on OpenCollective
|
|
1441
|
+
</a>
|
|
1442
|
+
</div>
|
|
1443
|
+
</div>
|
|
1444
|
+
</div>
|
|
1445
|
+
|
|
1446
|
+
<!-- Benchmarks Window -->
|
|
1447
|
+
<div id="window-benchmarks" class="window" style="left: 250px; top: 150px; width: 650px; height: 500px;">
|
|
1448
|
+
<div class="window-titlebar">
|
|
1449
|
+
<div class="window-icon">📁</div>
|
|
1450
|
+
<div class="window-title">Benchmarks</div>
|
|
1451
|
+
<div class="window-controls">
|
|
1452
|
+
<button class="minimize window-control" onclick="minimizeWindow('benchmarks')">_</button>
|
|
1453
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('benchmarks')">□</button>
|
|
1454
|
+
<button class="close window-control" onclick="closeWindow('benchmarks')">×</button>
|
|
1455
|
+
</div>
|
|
1456
|
+
</div>
|
|
1457
|
+
<div class="window-content" style="overflow-y: auto; padding: 20px;">
|
|
1458
|
+
<div style="background: linear-gradient(to bottom, #0831d9 0%, #1c4ed8 100%); color: white; padding: 20px; margin: -20px -20px 20px -20px;">
|
|
1459
|
+
<h2 style="margin: 0 0 8px 0; font-size: 24px; font-weight: bold;">Performance Benchmarks</h2>
|
|
1460
|
+
<p style="margin: 0; font-size: 13px; opacity: 0.9;">Compare Stacks against popular frameworks and tools</p>
|
|
1461
|
+
</div>
|
|
1462
|
+
|
|
1463
|
+
<!-- Benchmark Links Grid -->
|
|
1464
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 20px;">
|
|
1465
|
+
<!-- Request Performance -->
|
|
1466
|
+
<a href="https://github.com/stacksjs/benchmarks" target="_blank" style="background: white; border: 2px groove #999; padding: 16px; text-decoration: none; color: inherit; display: block; transition: all 0.2s;">
|
|
1467
|
+
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px;">
|
|
1468
|
+
<div style="font-size: 24px;">⚡</div>
|
|
1469
|
+
<div style="font-weight: bold; color: #0831d9; font-size: 14px;">Request Performance</div>
|
|
1470
|
+
</div>
|
|
1471
|
+
<div style="font-size: 11px; color: #666; line-height: 1.5;">
|
|
1472
|
+
HTTP request/response benchmarks vs Express, Fastify, Hono, and more
|
|
1473
|
+
</div>
|
|
1474
|
+
</a>
|
|
1475
|
+
|
|
1476
|
+
<!-- Build Time -->
|
|
1477
|
+
<a href="https://github.com/stacksjs/benchmarks" target="_blank" style="background: white; border: 2px groove #999; padding: 16px; text-decoration: none; color: inherit; display: block; transition: all 0.2s;">
|
|
1478
|
+
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px;">
|
|
1479
|
+
<div style="font-size: 24px;">🔨</div>
|
|
1480
|
+
<div style="font-weight: bold; color: #0831d9; font-size: 14px;">Build Performance</div>
|
|
1481
|
+
</div>
|
|
1482
|
+
<div style="font-size: 11px; color: #666; line-height: 1.5;">
|
|
1483
|
+
Build time comparisons with Vite, esbuild, Turbopack, and others
|
|
1484
|
+
</div>
|
|
1485
|
+
</a>
|
|
1486
|
+
|
|
1487
|
+
<!-- Bundle Size -->
|
|
1488
|
+
<a href="https://github.com/stacksjs/benchmarks" target="_blank" style="background: white; border: 2px groove #999; padding: 16px; text-decoration: none; color: inherit; display: block; transition: all 0.2s;">
|
|
1489
|
+
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px;">
|
|
1490
|
+
<div style="font-size: 24px;">📦</div>
|
|
1491
|
+
<div style="font-weight: bold; color: #0831d9; font-size: 14px;">Bundle Size</div>
|
|
1492
|
+
</div>
|
|
1493
|
+
<div style="font-size: 11px; color: #666; line-height: 1.5;">
|
|
1494
|
+
Output size analysis and tree-shaking effectiveness
|
|
1495
|
+
</div>
|
|
1496
|
+
</a>
|
|
1497
|
+
|
|
1498
|
+
<!-- Memory Usage -->
|
|
1499
|
+
<a href="https://github.com/stacksjs/benchmarks" target="_blank" style="background: white; border: 2px groove #999; padding: 16px; text-decoration: none; color: inherit; display: block; transition: all 0.2s;">
|
|
1500
|
+
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px;">
|
|
1501
|
+
<div style="font-size: 24px;">💾</div>
|
|
1502
|
+
<div style="font-weight: bold; color: #0831d9; font-size: 14px;">Memory Usage</div>
|
|
1503
|
+
</div>
|
|
1504
|
+
<div style="font-size: 11px; color: #666; line-height: 1.5;">
|
|
1505
|
+
Runtime memory consumption and optimization metrics
|
|
1506
|
+
</div>
|
|
1507
|
+
</a>
|
|
1508
|
+
|
|
1509
|
+
<!-- Startup Time -->
|
|
1510
|
+
<a href="https://github.com/stacksjs/benchmarks" target="_blank" style="background: white; border: 2px groove #999; padding: 16px; text-decoration: none; color: inherit; display: block; transition: all 0.2s;">
|
|
1511
|
+
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px;">
|
|
1512
|
+
<div style="font-size: 24px;">🚀</div>
|
|
1513
|
+
<div style="font-weight: bold; color: #0831d9; font-size: 14px;">Startup Time</div>
|
|
1514
|
+
</div>
|
|
1515
|
+
<div style="font-size: 11px; color: #666; line-height: 1.5;">
|
|
1516
|
+
Cold start and hot reload performance measurements
|
|
1517
|
+
</div>
|
|
1518
|
+
</a>
|
|
1519
|
+
|
|
1520
|
+
<!-- Database Performance -->
|
|
1521
|
+
<a href="https://github.com/stacksjs/benchmarks" target="_blank" style="background: white; border: 2px groove #999; padding: 16px; text-decoration: none; color: inherit; display: block; transition: all 0.2s;">
|
|
1522
|
+
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px;">
|
|
1523
|
+
<div style="font-size: 24px;">🗄️</div>
|
|
1524
|
+
<div style="font-weight: bold; color: #0831d9; font-size: 14px;">Database ORM</div>
|
|
1525
|
+
</div>
|
|
1526
|
+
<div style="font-size: 11px; color: #666; line-height: 1.5;">
|
|
1527
|
+
Query performance vs Prisma, Drizzle, TypeORM, and Sequelize
|
|
1528
|
+
</div>
|
|
1529
|
+
</a>
|
|
1530
|
+
</div>
|
|
1531
|
+
|
|
1532
|
+
<div style="background: #f0f4ff; border: 2px groove #0831d9; padding: 14px; border-radius: 4px; font-size: 11px; color: #666;">
|
|
1533
|
+
<strong style="color: #0831d9;">Note:</strong> All benchmarks are open source and reproducible. Visit our
|
|
1534
|
+
<a href="https://github.com/stacksjs/benchmarks" target="_blank" style="color: #0831d9; font-weight: bold;">GitHub repository</a>
|
|
1535
|
+
to run them yourself or contribute new benchmarks.
|
|
1536
|
+
</div>
|
|
1537
|
+
</div>
|
|
1538
|
+
</div>
|
|
1539
|
+
|
|
1540
|
+
<div id="window-trash" class="window" style="left: 300px; top: 120px; width: 500px; height: 550px;">
|
|
1541
|
+
<div class="window-titlebar">
|
|
1542
|
+
<div class="window-icon">🗑️</div>
|
|
1543
|
+
<div class="window-title">Recycle Bin</div>
|
|
1544
|
+
<div class="window-controls">
|
|
1545
|
+
<button class="minimize window-control" onclick="minimizeWindow('trash')">_</button>
|
|
1546
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('trash')">□</button>
|
|
1547
|
+
<button class="close window-control" onclick="closeWindow('trash')">×</button>
|
|
1548
|
+
</div>
|
|
1549
|
+
</div>
|
|
1550
|
+
<div class="window-content" style="padding: 16px;">
|
|
1551
|
+
<div style="background: #fff3cd; border: 2px solid #ffc107; padding: 12px; margin-bottom: 16px; border-radius: 4px; font-size: 11px;">
|
|
1552
|
+
<strong>⚠️ Note:</strong> These items are in the Recycle Bin. Stacks has native tooling built-in, to self-host a maintainable, performant & secure environment, in a zero-setup & zero-config way.
|
|
1553
|
+
</div>
|
|
1554
|
+
|
|
1555
|
+
<div style="background: white; border: 2px inset #999; padding: 12px; height: 420px; overflow-y: auto;">
|
|
1556
|
+
<table style="width: 100%; border-collapse: collapse;">
|
|
1557
|
+
<thead>
|
|
1558
|
+
<tr style="background: #ece9d8; border-bottom: 2px solid #999;">
|
|
1559
|
+
<th style="text-align: left; padding: 8px; font-size: 11px; border-right: 1px solid #ccc;">Name</th>
|
|
1560
|
+
<th style="text-align: left; padding: 8px; font-size: 11px; border-right: 1px solid #ccc;">Type</th>
|
|
1561
|
+
<th style="text-align: right; padding: 8px; font-size: 11px;">Date Deleted</th>
|
|
1562
|
+
</tr>
|
|
1563
|
+
</thead>
|
|
1564
|
+
<tbody>
|
|
1565
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1566
|
+
<td style="padding: 8px; font-size: 11px;">🚂 Laravel</td>
|
|
1567
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">PHP Framework</td>
|
|
1568
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/15/2025</td>
|
|
1569
|
+
</tr>
|
|
1570
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1571
|
+
<td style="padding: 8px; font-size: 11px;">💎 Ruby on Rails</td>
|
|
1572
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Ruby Framework</td>
|
|
1573
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/14/2025</td>
|
|
1574
|
+
</tr>
|
|
1575
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1576
|
+
<td style="padding: 8px; font-size: 11px;">🍺 Homebrew</td>
|
|
1577
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Package Manager</td>
|
|
1578
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/13/2025</td>
|
|
1579
|
+
</tr>
|
|
1580
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1581
|
+
<td style="padding: 8px; font-size: 11px;">🔭 Laravel Horizon</td>
|
|
1582
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Queue Dashboard</td>
|
|
1583
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/12/2025</td>
|
|
1584
|
+
</tr>
|
|
1585
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1586
|
+
<td style="padding: 8px; font-size: 11px;">🔬 Laravel Telescope</td>
|
|
1587
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Debug Assistant</td>
|
|
1588
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/11/2025</td>
|
|
1589
|
+
</tr>
|
|
1590
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1591
|
+
<td style="padding: 8px; font-size: 11px;">⚒️ Laravel Forge</td>
|
|
1592
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Server Management</td>
|
|
1593
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/10/2025</td>
|
|
1594
|
+
</tr>
|
|
1595
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1596
|
+
<td style="padding: 8px; font-size: 11px;">☁️ Laravel Vapor</td>
|
|
1597
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Serverless Platform</td>
|
|
1598
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/09/2025</td>
|
|
1599
|
+
</tr>
|
|
1600
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1601
|
+
<td style="padding: 8px; font-size: 11px;">🌥️ Laravel Cloud</td>
|
|
1602
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Cloud Platform</td>
|
|
1603
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/08/2025</td>
|
|
1604
|
+
</tr>
|
|
1605
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1606
|
+
<td style="padding: 8px; font-size: 11px;">▲ Vercel</td>
|
|
1607
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Hosting Platform</td>
|
|
1608
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/07/2025</td>
|
|
1609
|
+
</tr>
|
|
1610
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1611
|
+
<td style="padding: 8px; font-size: 11px;">🎯 Netlify</td>
|
|
1612
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Hosting Platform</td>
|
|
1613
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/06/2025</td>
|
|
1614
|
+
</tr>
|
|
1615
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1616
|
+
<td style="padding: 8px; font-size: 11px;">📦 Composer</td>
|
|
1617
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">PHP Package Manager</td>
|
|
1618
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/05/2025</td>
|
|
1619
|
+
</tr>
|
|
1620
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1621
|
+
<td style="padding: 8px; font-size: 11px;">🐳 Docker Desktop</td>
|
|
1622
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Container Platform</td>
|
|
1623
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/04/2025</td>
|
|
1624
|
+
</tr>
|
|
1625
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1626
|
+
<td style="padding: 8px; font-size: 11px;">🟢 Node.js</td>
|
|
1627
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">JavaScript Runtime</td>
|
|
1628
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/03/2025</td>
|
|
1629
|
+
</tr>
|
|
1630
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1631
|
+
<td style="padding: 8px; font-size: 11px;">⚡ Vite</td>
|
|
1632
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Build Tool</td>
|
|
1633
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/02/2025</td>
|
|
1634
|
+
</tr>
|
|
1635
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1636
|
+
<td style="padding: 8px; font-size: 11px;">📝 ESLint</td>
|
|
1637
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Linter</td>
|
|
1638
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">10/01/2025</td>
|
|
1639
|
+
</tr>
|
|
1640
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1641
|
+
<td style="padding: 8px; font-size: 11px;">💅 Prettier</td>
|
|
1642
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Code Formatter</td>
|
|
1643
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">09/30/2025</td>
|
|
1644
|
+
</tr>
|
|
1645
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1646
|
+
<td style="padding: 8px; font-size: 11px;">🦀 Oxc</td>
|
|
1647
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Rust Toolchain</td>
|
|
1648
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">09/29/2025</td>
|
|
1649
|
+
</tr>
|
|
1650
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1651
|
+
<td style="padding: 8px; font-size: 11px;">📖 VitePress</td>
|
|
1652
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Static Site Generator</td>
|
|
1653
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">09/28/2025</td>
|
|
1654
|
+
</tr>
|
|
1655
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1656
|
+
<td style="padding: 8px; font-size: 11px;">📚 VuePress</td>
|
|
1657
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Static Site Generator</td>
|
|
1658
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">09/27/2025</td>
|
|
1659
|
+
</tr>
|
|
1660
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1661
|
+
<td style="padding: 8px; font-size: 11px;">🌐 Nginx</td>
|
|
1662
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Web Server</td>
|
|
1663
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">09/26/2025</td>
|
|
1664
|
+
</tr>
|
|
1665
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1666
|
+
<td style="padding: 8px; font-size: 11px;">🚇 Ngrok</td>
|
|
1667
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Tunneling Service</td>
|
|
1668
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">09/25/2025</td>
|
|
1669
|
+
</tr>
|
|
1670
|
+
<tr style="border-bottom: 1px solid #e0e0e0;">
|
|
1671
|
+
<td style="padding: 8px; font-size: 11px;">🦌 Laravel Herd</td>
|
|
1672
|
+
<td style="padding: 8px; font-size: 11px; color: #666;">Local Dev Environment</td>
|
|
1673
|
+
<td style="padding: 8px; font-size: 11px; color: #666; text-align: right;">09/24/2025</td>
|
|
1674
|
+
</tr>
|
|
1675
|
+
</tbody>
|
|
1676
|
+
</table>
|
|
1677
|
+
</div>
|
|
1678
|
+
</div>
|
|
1679
|
+
</div>
|
|
1680
|
+
|
|
1681
|
+
<div id="window-contact" class="window" style="left: 200px; top: 100px; width: 700px; height: 650px;">
|
|
1682
|
+
<div class="window-titlebar">
|
|
1683
|
+
<div class="window-icon">�</div>
|
|
1684
|
+
<div class="window-title">Contact Us</div>
|
|
1685
|
+
<div class="window-controls">
|
|
1686
|
+
<button class="minimize window-control" onclick="minimizeWindow('contact')">_</button>
|
|
1687
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('contact')">□</button>
|
|
1688
|
+
<button class="close window-control" onclick="closeWindow('contact')">×</button>
|
|
1689
|
+
</div>
|
|
1690
|
+
</div>
|
|
1691
|
+
<div class="window-content" style="padding: 16px;">
|
|
1692
|
+
<h2 style="margin: 0 0 16px 0; font-size: 18px;">Get in Touch</h2>
|
|
1693
|
+
|
|
1694
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 20px;">
|
|
1695
|
+
<!-- Map Section -->
|
|
1696
|
+
<div>
|
|
1697
|
+
<h3 style="margin: 0 0 12px 0; font-size: 14px;">📍 Our Location</h3>
|
|
1698
|
+
<div style="background: white; border: 2px inset #999; padding: 4px;">
|
|
1699
|
+
<iframe
|
|
1700
|
+
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3307.1778389867547!2d-118.43344492378123!3d33.9838647731147!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x80c2ba9c3f5f5f5f%3A0x1234567890abcdef!2s12665%20Village%20Ln%2C%20Playa%20Vista%2C%20CA%2090094!5e0!3m2!1sen!2sus!4v1234567890123!5m2!1sen!2sus"
|
|
1701
|
+
width="100%"
|
|
1702
|
+
height="250"
|
|
1703
|
+
style="border:0;"
|
|
1704
|
+
allowfullscreen=""
|
|
1705
|
+
loading="lazy"
|
|
1706
|
+
referrerpolicy="no-referrer-when-downgrade">
|
|
1707
|
+
</iframe>
|
|
1708
|
+
</div>
|
|
1709
|
+
<p style="margin: 12px 0 0 0; font-size: 12px; line-height: 1.6;">
|
|
1710
|
+
<strong>Stacks Headquarters</strong><br>
|
|
1711
|
+
12665 Village Ln<br>
|
|
1712
|
+
Playa Vista, CA 90094<br>
|
|
1713
|
+
United States
|
|
1714
|
+
</p>
|
|
1715
|
+
</div>
|
|
1716
|
+
|
|
1717
|
+
<!-- Contact Form -->
|
|
1718
|
+
<div>
|
|
1719
|
+
<h3 style="margin: 0 0 12px 0; font-size: 14px;">✉️ Send us a message</h3>
|
|
1720
|
+
<form onsubmit="submitContactForm(event)" style="display: flex; flex-direction: column; gap: 12px;">
|
|
1721
|
+
<div>
|
|
1722
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Name</label>
|
|
1723
|
+
<input
|
|
1724
|
+
type="text"
|
|
1725
|
+
id="contact-name"
|
|
1726
|
+
required
|
|
1727
|
+
style="width: 100%; padding: 6px; border: 2px inset #999; font-family: 'Tahoma', sans-serif; font-size: 11px;"
|
|
1728
|
+
placeholder="Your name"
|
|
1729
|
+
/>
|
|
1730
|
+
</div>
|
|
1731
|
+
|
|
1732
|
+
<div>
|
|
1733
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Email</label>
|
|
1734
|
+
<input
|
|
1735
|
+
type="email"
|
|
1736
|
+
id="contact-email"
|
|
1737
|
+
required
|
|
1738
|
+
style="width: 100%; padding: 6px; border: 2px inset #999; font-family: 'Tahoma', sans-serif; font-size: 11px;"
|
|
1739
|
+
placeholder="your.email@example.com"
|
|
1740
|
+
/>
|
|
1741
|
+
</div>
|
|
1742
|
+
|
|
1743
|
+
<div>
|
|
1744
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Subject</label>
|
|
1745
|
+
<input
|
|
1746
|
+
type="text"
|
|
1747
|
+
id="contact-subject"
|
|
1748
|
+
required
|
|
1749
|
+
style="width: 100%; padding: 6px; border: 2px inset #999; font-family: 'Tahoma', sans-serif; font-size: 11px;"
|
|
1750
|
+
placeholder="What's this about?"
|
|
1751
|
+
/>
|
|
1752
|
+
</div>
|
|
1753
|
+
|
|
1754
|
+
<div>
|
|
1755
|
+
<label style="display: block; margin-bottom: 4px; font-size: 11px; font-weight: bold;">Message</label>
|
|
1756
|
+
<textarea
|
|
1757
|
+
id="contact-message"
|
|
1758
|
+
required
|
|
1759
|
+
rows="6"
|
|
1760
|
+
style="width: 100%; padding: 6px; border: 2px inset #999; font-family: 'Tahoma', sans-serif; font-size: 11px; resize: vertical;"
|
|
1761
|
+
placeholder="Tell us more about your inquiry..."
|
|
1762
|
+
></textarea>
|
|
1763
|
+
</div>
|
|
1764
|
+
|
|
1765
|
+
<button
|
|
1766
|
+
type="submit"
|
|
1767
|
+
style="background: linear-gradient(to bottom, #ffffff 0%, #ece9d8 100%); border: 2px outset #999; padding: 8px 16px; font-family: 'Tahoma', sans-serif; font-size: 11px; font-weight: bold; cursor: pointer; align-self: flex-start;"
|
|
1768
|
+
>
|
|
1769
|
+
📤 Send Message
|
|
1770
|
+
</button>
|
|
1771
|
+
</form>
|
|
1772
|
+
</div>
|
|
1773
|
+
</div>
|
|
1774
|
+
|
|
1775
|
+
<div style="background: #e0f2ff; border: 2px solid #0284c7; padding: 12px; border-radius: 4px; font-size: 11px;">
|
|
1776
|
+
<strong>💡 Quick Links:</strong> For general inquiries, email us at <a href="mailto:hello@stacksjs.com" style="color: #0831d9;">hello@stacksjs.com</a>
|
|
1777
|
+
<br>For support questions, visit our <a href="https://discord.gg/stacksjs" target="_blank" style="color: #0831d9;">Discord community</a>
|
|
1778
|
+
</div>
|
|
1779
|
+
</div>
|
|
1780
|
+
</div>
|
|
1781
|
+
|
|
1782
|
+
<div id="window-libraries" class="window" style="left: 120px; top: 100px; width: 700px; height: 600px;">
|
|
1783
|
+
<div class="window-titlebar">
|
|
1784
|
+
<div class="window-icon">📁</div>
|
|
1785
|
+
<div class="window-title">Libraries & CLIs</div>
|
|
1786
|
+
<div class="window-controls">
|
|
1787
|
+
<button class="minimize window-control" onclick="minimizeWindow('libraries')">_</button>
|
|
1788
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('libraries')">□</button>
|
|
1789
|
+
<button class="close window-control" onclick="closeWindow('libraries')">×</button>
|
|
1790
|
+
</div>
|
|
1791
|
+
</div>
|
|
1792
|
+
<div class="window-content">
|
|
1793
|
+
<h2>Libraries & CLIs</h2>
|
|
1794
|
+
<p style="margin-bottom: 16px;">Powerful TypeScript libraries and command-line tools for modern development.</p>
|
|
1795
|
+
<div class="folder-list">
|
|
1796
|
+
|
|
1797
|
+
<a href="https://github.com/stacksjs/aax" target="_blank" class="folder-item">
|
|
1798
|
+
<div class="folder-item-icon">📦</div>
|
|
1799
|
+
<div class="folder-item-content">
|
|
1800
|
+
<div class="folder-item-name">aax</div>
|
|
1801
|
+
<div class="folder-item-desc">A library to work with Audible's .aax files. Cross-platform app coming soon.</div>
|
|
1802
|
+
</div>
|
|
1803
|
+
</a>
|
|
1804
|
+
|
|
1805
|
+
<a href="https://github.com/stacksjs/audiox" target="_blank" class="folder-item">
|
|
1806
|
+
<div class="folder-item-icon">📦</div>
|
|
1807
|
+
<div class="folder-item-content">
|
|
1808
|
+
<div class="folder-item-name">audiox</div>
|
|
1809
|
+
<div class="folder-item-desc">Powerful audio processing for your workflows.</div>
|
|
1810
|
+
</div>
|
|
1811
|
+
</a>
|
|
1812
|
+
|
|
1813
|
+
<a href="https://github.com/stacksjs/backupx" target="_blank" class="folder-item">
|
|
1814
|
+
<div class="folder-item-icon">📦</div>
|
|
1815
|
+
<div class="folder-item-content">
|
|
1816
|
+
<div class="folder-item-name">backupx</div>
|
|
1817
|
+
<div class="folder-item-desc">Comprehensive & performant database and file backup solution.</div>
|
|
1818
|
+
</div>
|
|
1819
|
+
</a>
|
|
1820
|
+
|
|
1821
|
+
<a href="https://github.com/stacksjs/besting" target="_blank" class="folder-item">
|
|
1822
|
+
<div class="folder-item-icon">📦</div>
|
|
1823
|
+
<div class="folder-item-content">
|
|
1824
|
+
<div class="folder-item-name">besting</div>
|
|
1825
|
+
<div class="folder-item-desc">A modern & extremely performant testing framework. Browser, CLI, API testing-ready.</div>
|
|
1826
|
+
</div>
|
|
1827
|
+
</a>
|
|
1828
|
+
|
|
1829
|
+
<a href="https://github.com/stacksjs/buddy" target="_blank" class="folder-item">
|
|
1830
|
+
<div class="folder-item-icon">📦</div>
|
|
1831
|
+
<div class="folder-item-content">
|
|
1832
|
+
<div class="folder-item-name">buddy-bot</div>
|
|
1833
|
+
<div class="folder-item-desc">Just like Renovate and Dependabot, just open source & self-hosted.</div>
|
|
1834
|
+
</div>
|
|
1835
|
+
</a>
|
|
1836
|
+
|
|
1837
|
+
<a href="https://github.com/stacksjs/bumpx" target="_blank" class="folder-item">
|
|
1838
|
+
<div class="folder-item-icon">📦</div>
|
|
1839
|
+
<div class="folder-item-content">
|
|
1840
|
+
<div class="folder-item-name">bumpx</div>
|
|
1841
|
+
<div class="folder-item-desc">Bump your version numbers automatically.</div>
|
|
1842
|
+
</div>
|
|
1843
|
+
</a>
|
|
1844
|
+
|
|
1845
|
+
<a href="https://github.com/stacksjs/bun-git-hooks" target="_blank" class="folder-item">
|
|
1846
|
+
<div class="folder-item-icon">📦</div>
|
|
1847
|
+
<div class="folder-item-content">
|
|
1848
|
+
<div class="folder-item-name">bun-git-hooks</div>
|
|
1849
|
+
<div class="folder-item-desc">A simple git hooks manager for all-sized Bun projects.</div>
|
|
1850
|
+
</div>
|
|
1851
|
+
</a>
|
|
1852
|
+
|
|
1853
|
+
<a href="https://github.com/stacksjs/bun-query-builder" target="_blank" class="folder-item">
|
|
1854
|
+
<div class="folder-item-icon">📦</div>
|
|
1855
|
+
<div class="folder-item-content">
|
|
1856
|
+
<div class="folder-item-name">bun-query-builder</div>
|
|
1857
|
+
<div class="folder-item-desc">A safe, performant & fully-typed query builder.</div>
|
|
1858
|
+
</div>
|
|
1859
|
+
</a>
|
|
1860
|
+
|
|
1861
|
+
<a href="https://github.com/stacksjs/queue" target="_blank" class="folder-item">
|
|
1862
|
+
<div class="folder-item-icon">📦</div>
|
|
1863
|
+
<div class="folder-item-content">
|
|
1864
|
+
<div class="folder-item-name">bun-queue</div>
|
|
1865
|
+
<div class="folder-item-desc">A modern port of BullMQ. Optimized for Bun usage.</div>
|
|
1866
|
+
</div>
|
|
1867
|
+
</a>
|
|
1868
|
+
|
|
1869
|
+
<a href="https://github.com/stacksjs/router" target="_blank" class="folder-item">
|
|
1870
|
+
<div class="folder-item-icon">📦</div>
|
|
1871
|
+
<div class="folder-item-content">
|
|
1872
|
+
<div class="folder-item-name">bun-router</div>
|
|
1873
|
+
<div class="folder-item-desc">A powerful yet lightweight router for your server. Used by Stacks.</div>
|
|
1874
|
+
</div>
|
|
1875
|
+
</a>
|
|
1876
|
+
|
|
1877
|
+
<a href="https://github.com/stacksjs/bunfig" target="_blank" class="folder-item">
|
|
1878
|
+
<div class="folder-item-icon">📦</div>
|
|
1879
|
+
<div class="folder-item-content">
|
|
1880
|
+
<div class="folder-item-name">bunfig</div>
|
|
1881
|
+
<div class="folder-item-desc">Lightweight & smart Bun configuration loader.</div>
|
|
1882
|
+
</div>
|
|
1883
|
+
</a>
|
|
1884
|
+
|
|
1885
|
+
<a href="https://github.com/stacksjs/clarity" target="_blank" class="folder-item">
|
|
1886
|
+
<div class="folder-item-icon">📦</div>
|
|
1887
|
+
<div class="folder-item-content">
|
|
1888
|
+
<div class="folder-item-name">clarity</div>
|
|
1889
|
+
<div class="folder-item-desc">Modern debugging & logging for browser & server.</div>
|
|
1890
|
+
</div>
|
|
1891
|
+
</a>
|
|
1892
|
+
|
|
1893
|
+
<a href="https://github.com/stacksjs/dtsx" target="_blank" class="folder-item">
|
|
1894
|
+
<div class="folder-item-icon">📦</div>
|
|
1895
|
+
<div class="folder-item-content">
|
|
1896
|
+
<div class="folder-item-name">dtsx</div>
|
|
1897
|
+
<div class="folder-item-desc">Extremely fast & configurable DTS emitter.</div>
|
|
1898
|
+
</div>
|
|
1899
|
+
</a>
|
|
1900
|
+
|
|
1901
|
+
<a href="https://github.com/stacksjs/dnsx" target="_blank" class="folder-item">
|
|
1902
|
+
<div class="folder-item-icon">📦</div>
|
|
1903
|
+
<div class="folder-item-content">
|
|
1904
|
+
<div class="folder-item-name">dnsx</div>
|
|
1905
|
+
<div class="folder-item-desc">A command-line & library DNS client. Like dig & dog, but for TypeScript.</div>
|
|
1906
|
+
</div>
|
|
1907
|
+
</a>
|
|
1908
|
+
|
|
1909
|
+
<a href="https://github.com/stacksjs/gitit" target="_blank" class="folder-item">
|
|
1910
|
+
<div class="folder-item-icon">📦</div>
|
|
1911
|
+
<div class="folder-item-content">
|
|
1912
|
+
<div class="folder-item-name">gitit</div>
|
|
1913
|
+
<div class="folder-item-desc">A simple way to download templates stored using git.</div>
|
|
1914
|
+
</div>
|
|
1915
|
+
</a>
|
|
1916
|
+
|
|
1917
|
+
<a href="https://github.com/stacksjs/gitlint" target="_blank" class="folder-item">
|
|
1918
|
+
<div class="folder-item-icon">📦</div>
|
|
1919
|
+
<div class="folder-item-content">
|
|
1920
|
+
<div class="folder-item-name">gitlint</div>
|
|
1921
|
+
<div class="folder-item-desc">Minimal & fast Git commit message linting & formatting.</div>
|
|
1922
|
+
</div>
|
|
1923
|
+
</a>
|
|
1924
|
+
|
|
1925
|
+
<a href="https://github.com/stacksjs/httx" target="_blank" class="folder-item">
|
|
1926
|
+
<div class="folder-item-icon">📦</div>
|
|
1927
|
+
<div class="folder-item-content">
|
|
1928
|
+
<div class="folder-item-name">httx</div>
|
|
1929
|
+
<div class="folder-item-desc">A modern, user-friendly command-line & library HTTP client for the API era.</div>
|
|
1930
|
+
</div>
|
|
1931
|
+
</a>
|
|
1932
|
+
|
|
1933
|
+
<a href="https://github.com/stacksjs/imgx" target="_blank" class="folder-item">
|
|
1934
|
+
<div class="folder-item-icon">📦</div>
|
|
1935
|
+
<div class="folder-item-content">
|
|
1936
|
+
<div class="folder-item-name">imgx</div>
|
|
1937
|
+
<div class="folder-item-desc">Make your images load faster. A better save for the web.</div>
|
|
1938
|
+
</div>
|
|
1939
|
+
</a>
|
|
1940
|
+
|
|
1941
|
+
<a href="https://github.com/stacksjs/jpgx" target="_blank" class="folder-item">
|
|
1942
|
+
<div class="folder-item-icon">📦</div>
|
|
1943
|
+
<div class="folder-item-content">
|
|
1944
|
+
<div class="folder-item-name">jpgx</div>
|
|
1945
|
+
<div class="folder-item-desc">A TypeScript JPEG encoder & decoder for Bun & Node.js.</div>
|
|
1946
|
+
</div>
|
|
1947
|
+
</a>
|
|
1948
|
+
|
|
1949
|
+
<a href="https://github.com/stacksjs/localtunnels" target="_blank" class="folder-item">
|
|
1950
|
+
<div class="folder-item-icon">📦</div>
|
|
1951
|
+
<div class="folder-item-content">
|
|
1952
|
+
<div class="folder-item-name">localtunnels</div>
|
|
1953
|
+
<div class="folder-item-desc">A simple and smart tunneling alternative. Without or with self-hosting.</div>
|
|
1954
|
+
</div>
|
|
1955
|
+
</a>
|
|
1956
|
+
|
|
1957
|
+
<a href="https://github.com/stacksjs/logsmith" target="_blank" class="folder-item">
|
|
1958
|
+
<div class="folder-item-icon">📦</div>
|
|
1959
|
+
<div class="folder-item-content">
|
|
1960
|
+
<div class="folder-item-name">logsmith</div>
|
|
1961
|
+
<div class="folder-item-desc">Forge beautiful changelogs from your commits.</div>
|
|
1962
|
+
</div>
|
|
1963
|
+
</a>
|
|
1964
|
+
|
|
1965
|
+
<a href="https://github.com/stacksjs/pickier" target="_blank" class="folder-item">
|
|
1966
|
+
<div class="folder-item-icon">📦</div>
|
|
1967
|
+
<div class="folder-item-content">
|
|
1968
|
+
<div class="folder-item-name">pickier</div>
|
|
1969
|
+
<div class="folder-item-desc">Format, lint, and more—in a fraction of second.</div>
|
|
1970
|
+
</div>
|
|
1971
|
+
</a>
|
|
1972
|
+
|
|
1973
|
+
<a href="https://github.com/stacksjs/pngx" target="_blank" class="folder-item">
|
|
1974
|
+
<div class="folder-item-icon">📦</div>
|
|
1975
|
+
<div class="folder-item-content">
|
|
1976
|
+
<div class="folder-item-name">pngx</div>
|
|
1977
|
+
<div class="folder-item-desc">Modern PNG encoder & decoder.</div>
|
|
1978
|
+
</div>
|
|
1979
|
+
</a>
|
|
1980
|
+
|
|
1981
|
+
<a href="https://github.com/stacksjs/post" target="_blank" class="folder-item">
|
|
1982
|
+
<div class="folder-item-icon">📦</div>
|
|
1983
|
+
<div class="folder-item-content">
|
|
1984
|
+
<div class="folder-item-name">post</div>
|
|
1985
|
+
<div class="folder-item-desc">The Post. A modern mail server & utilities. Ships with a CLI, library, and UI.</div>
|
|
1986
|
+
</div>
|
|
1987
|
+
</a>
|
|
1988
|
+
|
|
1989
|
+
<a href="https://github.com/stacksjs/qrx" target="_blank" class="folder-item">
|
|
1990
|
+
<div class="folder-item-icon">📦</div>
|
|
1991
|
+
<div class="folder-item-content">
|
|
1992
|
+
<div class="folder-item-name">qrx</div>
|
|
1993
|
+
<div class="folder-item-desc">QR & Bar Code generating & reading. Lightweight & powerful.</div>
|
|
1994
|
+
</div>
|
|
1995
|
+
</a>
|
|
1996
|
+
|
|
1997
|
+
<a href="https://github.com/stacksjs/rpx" target="_blank" class="folder-item">
|
|
1998
|
+
<div class="folder-item-icon">📦</div>
|
|
1999
|
+
<div class="folder-item-content">
|
|
2000
|
+
<div class="folder-item-name">rpx</div>
|
|
2001
|
+
<div class="folder-item-desc">A modern, fast reverse proxy. For a better local development environment.</div>
|
|
2002
|
+
</div>
|
|
2003
|
+
</a>
|
|
2004
|
+
|
|
2005
|
+
<a href="https://github.com/stacksjs/tlsx" target="_blank" class="folder-item">
|
|
2006
|
+
<div class="folder-item-icon">📦</div>
|
|
2007
|
+
<div class="folder-item-content">
|
|
2008
|
+
<div class="folder-item-name">tlsx</div>
|
|
2009
|
+
<div class="folder-item-desc">A TLS library with automation & HTTPS by default.</div>
|
|
2010
|
+
</div>
|
|
2011
|
+
</a>
|
|
2012
|
+
|
|
2013
|
+
<a href="https://github.com/stacksjs/ts-avif" target="_blank" class="folder-item">
|
|
2014
|
+
<div class="folder-item-icon">📦</div>
|
|
2015
|
+
<div class="folder-item-content">
|
|
2016
|
+
<div class="folder-item-name">ts-avif</div>
|
|
2017
|
+
<div class="folder-item-desc">High quality & small file sizes.</div>
|
|
2018
|
+
</div>
|
|
2019
|
+
</a>
|
|
2020
|
+
|
|
2021
|
+
<a href="https://github.com/stacksjs/ts-cache" target="_blank" class="folder-item">
|
|
2022
|
+
<div class="folder-item-icon">📦</div>
|
|
2023
|
+
<div class="folder-item-content">
|
|
2024
|
+
<div class="folder-item-name">ts-cache</div>
|
|
2025
|
+
<div class="folder-item-desc">A fast, type-safe, and feature-rich caching library for modern applications.</div>
|
|
2026
|
+
</div>
|
|
2027
|
+
</a>
|
|
2028
|
+
|
|
2029
|
+
<a href="https://github.com/stacksjs/ts-clone" target="_blank" class="folder-item">
|
|
2030
|
+
<div class="folder-item-icon">📦</div>
|
|
2031
|
+
<div class="folder-item-content">
|
|
2032
|
+
<div class="folder-item-name">ts-clone</div>
|
|
2033
|
+
<div class="folder-item-desc">Deeply clone arbitrary objects using TypeScript.</div>
|
|
2034
|
+
</div>
|
|
2035
|
+
</a>
|
|
2036
|
+
|
|
2037
|
+
<a href="https://github.com/stacksjs/ts-collect" target="_blank" class="folder-item">
|
|
2038
|
+
<div class="folder-item-icon">📦</div>
|
|
2039
|
+
<div class="folder-item-content">
|
|
2040
|
+
<div class="folder-item-name">ts-collect</div>
|
|
2041
|
+
<div class="folder-item-desc">A powerful, yet lightweight, Laravel-like Collections written for TypeScript.</div>
|
|
2042
|
+
</div>
|
|
2043
|
+
</a>
|
|
2044
|
+
|
|
2045
|
+
<a href="https://github.com/stacksjs/ts-countries" target="_blank" class="folder-item">
|
|
2046
|
+
<div class="folder-item-icon">📦</div>
|
|
2047
|
+
<div class="folder-item-content">
|
|
2048
|
+
<div class="folder-item-name">ts-countries</div>
|
|
2049
|
+
<div class="folder-item-desc">Modern, lightweight, elegant country data management.</div>
|
|
2050
|
+
</div>
|
|
2051
|
+
</a>
|
|
2052
|
+
|
|
2053
|
+
<a href="https://github.com/stacksjs/ts-datetime" target="_blank" class="folder-item">
|
|
2054
|
+
<div class="folder-item-icon">📦</div>
|
|
2055
|
+
<div class="folder-item-content">
|
|
2056
|
+
<div class="folder-item-name">ts-datetime</div>
|
|
2057
|
+
<div class="folder-item-desc">Performant & powerful datetime library. Carbon-API inspired.</div>
|
|
2058
|
+
</div>
|
|
2059
|
+
</a>
|
|
2060
|
+
|
|
2061
|
+
<a href="https://github.com/stacksjs/ts-gif" target="_blank" class="folder-item">
|
|
2062
|
+
<div class="folder-item-icon">📦</div>
|
|
2063
|
+
<div class="folder-item-content">
|
|
2064
|
+
<div class="folder-item-name">ts-gif</div>
|
|
2065
|
+
<div class="folder-item-desc">Performant TypeScript implementation of a GIF encoder & decoder.</div>
|
|
2066
|
+
</div>
|
|
2067
|
+
</a>
|
|
2068
|
+
|
|
2069
|
+
<a href="https://github.com/stacksjs/ts-i18n" target="_blank" class="folder-item">
|
|
2070
|
+
<div class="folder-item-icon">📦</div>
|
|
2071
|
+
<div class="folder-item-content">
|
|
2072
|
+
<div class="folder-item-name">ts-i18n</div>
|
|
2073
|
+
<div class="folder-item-desc">A fully-typed i18n experience.</div>
|
|
2074
|
+
</div>
|
|
2075
|
+
</a>
|
|
2076
|
+
|
|
2077
|
+
<a href="https://github.com/stacksjs/ts-inputs" target="_blank" class="folder-item">
|
|
2078
|
+
<div class="folder-item-icon">📦</div>
|
|
2079
|
+
<div class="folder-item-content">
|
|
2080
|
+
<div class="folder-item-name">ts-inputs</div>
|
|
2081
|
+
<div class="folder-item-desc">Modern input masking.</div>
|
|
2082
|
+
</div>
|
|
2083
|
+
</a>
|
|
2084
|
+
|
|
2085
|
+
<a href="https://github.com/stacksjs/ts-broadcasting" target="_blank" class="folder-item">
|
|
2086
|
+
<div class="folder-item-icon">📦</div>
|
|
2087
|
+
<div class="folder-item-content">
|
|
2088
|
+
<div class="folder-item-name">ts-broadcasting</div>
|
|
2089
|
+
<div class="folder-item-desc">Realtime the simple & performant way.</div>
|
|
2090
|
+
</div>
|
|
2091
|
+
</a>
|
|
2092
|
+
|
|
2093
|
+
<a href="https://github.com/stacksjs/ts-maps" target="_blank" class="folder-item">
|
|
2094
|
+
<div class="folder-item-icon">📦</div>
|
|
2095
|
+
<div class="folder-item-content">
|
|
2096
|
+
<div class="folder-item-name">ts-maps</div>
|
|
2097
|
+
<div class="folder-item-desc">Modern & lightweight library for creating interactive vector maps.</div>
|
|
2098
|
+
</div>
|
|
2099
|
+
</a>
|
|
2100
|
+
|
|
2101
|
+
<a href="https://github.com/stacksjs/ts-medium-editor" target="_blank" class="folder-item">
|
|
2102
|
+
<div class="folder-item-icon">📦</div>
|
|
2103
|
+
<div class="folder-item-content">
|
|
2104
|
+
<div class="folder-item-name">ts-medium-editor</div>
|
|
2105
|
+
<div class="folder-item-desc">A modern, minimal & performant Medium-like rich text editor.</div>
|
|
2106
|
+
</div>
|
|
2107
|
+
</a>
|
|
2108
|
+
|
|
2109
|
+
<a href="https://github.com/stacksjs/ts-mocker" target="_blank" class="folder-item">
|
|
2110
|
+
<div class="folder-item-icon">📦</div>
|
|
2111
|
+
<div class="folder-item-content">
|
|
2112
|
+
<div class="folder-item-name">ts-mocker</div>
|
|
2113
|
+
<div class="folder-item-desc">Performance-focused & lightweight TypeScript faker library. Comprehensive locale support.</div>
|
|
2114
|
+
</div>
|
|
2115
|
+
</a>
|
|
2116
|
+
|
|
2117
|
+
<a href="https://github.com/stacksjs/ts-ndarray" target="_blank" class="folder-item">
|
|
2118
|
+
<div class="folder-item-icon">📦</div>
|
|
2119
|
+
<div class="folder-item-content">
|
|
2120
|
+
<div class="folder-item-name">ts-ndarray</div>
|
|
2121
|
+
<div class="folder-item-desc">Multidimensional arrays for JavaScript & TypeScript.</div>
|
|
2122
|
+
</div>
|
|
2123
|
+
</a>
|
|
2124
|
+
|
|
2125
|
+
<a href="https://github.com/stacksjs/ts-numbers" target="_blank" class="folder-item">
|
|
2126
|
+
<div class="folder-item-icon">📦</div>
|
|
2127
|
+
<div class="folder-item-content">
|
|
2128
|
+
<div class="folder-item-name">ts-numbers</div>
|
|
2129
|
+
<div class="folder-item-desc">Lightweight currencies, weights, phone numbers, and more. Localized.</div>
|
|
2130
|
+
</div>
|
|
2131
|
+
</a>
|
|
2132
|
+
|
|
2133
|
+
<a href="https://github.com/stacksjs/ts-pkgx" target="_blank" class="folder-item">
|
|
2134
|
+
<div class="folder-item-icon">📦</div>
|
|
2135
|
+
<div class="folder-item-content">
|
|
2136
|
+
<div class="folder-item-name">ts-pkgx</div>
|
|
2137
|
+
<div class="folder-item-desc">Automated Typed Pantry details.</div>
|
|
2138
|
+
</div>
|
|
2139
|
+
</a>
|
|
2140
|
+
|
|
2141
|
+
<a href="https://github.com/stacksjs/ts-prompts" target="_blank" class="folder-item">
|
|
2142
|
+
<div class="folder-item-icon">📦</div>
|
|
2143
|
+
<div class="folder-item-content">
|
|
2144
|
+
<div class="folder-item-name">ts-prompts</div>
|
|
2145
|
+
<div class="folder-item-desc">Build modern & pretty CLI applications.</div>
|
|
2146
|
+
</div>
|
|
2147
|
+
</a>
|
|
2148
|
+
|
|
2149
|
+
<a href="https://github.com/stacksjs/ts-punycode" target="_blank" class="folder-item">
|
|
2150
|
+
<div class="folder-item-icon">📦</div>
|
|
2151
|
+
<div class="folder-item-content">
|
|
2152
|
+
<div class="folder-item-name">ts-punycode</div>
|
|
2153
|
+
<div class="folder-item-desc">Lightweight Punycode converter. RFC 3492 & RFC 5891 supported.</div>
|
|
2154
|
+
</div>
|
|
2155
|
+
</a>
|
|
2156
|
+
|
|
2157
|
+
<a href="https://github.com/stacksjs/ts-rate-limiter" target="_blank" class="folder-item">
|
|
2158
|
+
<div class="folder-item-icon">📦</div>
|
|
2159
|
+
<div class="folder-item-content">
|
|
2160
|
+
<div class="folder-item-name">ts-rate-limiter</div>
|
|
2161
|
+
<div class="folder-item-desc">High-performance, flexible rate limiting library. For TypeScript.</div>
|
|
2162
|
+
</div>
|
|
2163
|
+
</a>
|
|
2164
|
+
|
|
2165
|
+
<a href="https://github.com/stacksjs/ts-security" target="_blank" class="folder-item">
|
|
2166
|
+
<div class="folder-item-icon">📦</div>
|
|
2167
|
+
<div class="folder-item-content">
|
|
2168
|
+
<div class="folder-item-name">ts-security</div>
|
|
2169
|
+
<div class="folder-item-desc">Performant & lightweight cryptography tooling.</div>
|
|
2170
|
+
</div>
|
|
2171
|
+
</a>
|
|
2172
|
+
|
|
2173
|
+
<a href="https://github.com/stacksjs/ts-slug" target="_blank" class="folder-item">
|
|
2174
|
+
<div class="folder-item-icon">📦</div>
|
|
2175
|
+
<div class="folder-item-content">
|
|
2176
|
+
<div class="folder-item-name">ts-slug</div>
|
|
2177
|
+
<div class="folder-item-desc">Lightweight slug generation. Browser & Bun / Node.js compatible.</div>
|
|
2178
|
+
</div>
|
|
2179
|
+
</a>
|
|
2180
|
+
|
|
2181
|
+
<a href="https://github.com/stacksjs/ts-spreadsheets" target="_blank" class="folder-item">
|
|
2182
|
+
<div class="folder-item-icon">📦</div>
|
|
2183
|
+
<div class="folder-item-content">
|
|
2184
|
+
<div class="folder-item-name">ts-spreadsheets</div>
|
|
2185
|
+
<div class="folder-item-desc">Easily generate spreadsheets, like CSVs and Excel files.</div>
|
|
2186
|
+
</div>
|
|
2187
|
+
</a>
|
|
2188
|
+
|
|
2189
|
+
<a href="https://github.com/stacksjs/ts-svg" target="_blank" class="folder-item">
|
|
2190
|
+
<div class="folder-item-icon">📦</div>
|
|
2191
|
+
<div class="folder-item-content">
|
|
2192
|
+
<div class="folder-item-name">ts-svg</div>
|
|
2193
|
+
<div class="folder-item-desc">Powerful developer toolkit for working with SVGs.</div>
|
|
2194
|
+
</div>
|
|
2195
|
+
</a>
|
|
2196
|
+
|
|
2197
|
+
<a href="https://github.com/stacksjs/ts-syntax-highlighter" target="_blank" class="folder-item">
|
|
2198
|
+
<div class="folder-item-icon">📦</div>
|
|
2199
|
+
<div class="folder-item-content">
|
|
2200
|
+
<div class="folder-item-name">ts-syntax-highlighter</div>
|
|
2201
|
+
<div class="folder-item-desc">A syntax highlighter for the modern web. Built for performance.</div>
|
|
2202
|
+
</div>
|
|
2203
|
+
</a>
|
|
2204
|
+
|
|
2205
|
+
<a href="https://github.com/stacksjs/ts-validation" target="_blank" class="folder-item">
|
|
2206
|
+
<div class="folder-item-icon">📦</div>
|
|
2207
|
+
<div class="folder-item-content">
|
|
2208
|
+
<div class="folder-item-name">ts-validation</div>
|
|
2209
|
+
<div class="folder-item-desc">Lightweight & performant form & request data validation library.</div>
|
|
2210
|
+
</div>
|
|
2211
|
+
</a>
|
|
2212
|
+
|
|
2213
|
+
<a href="https://github.com/stacksjs/ts-vat" target="_blank" class="folder-item">
|
|
2214
|
+
<div class="folder-item-icon">📦</div>
|
|
2215
|
+
<div class="folder-item-content">
|
|
2216
|
+
<div class="folder-item-name">ts-vat</div>
|
|
2217
|
+
<div class="folder-item-desc">Simply handle EU MOSS tax & VAT regulations & calculations.</div>
|
|
2218
|
+
</div>
|
|
2219
|
+
</a>
|
|
2220
|
+
|
|
2221
|
+
<a href="https://github.com/stacksjs/ts-webp" target="_blank" class="folder-item">
|
|
2222
|
+
<div class="folder-item-icon">📦</div>
|
|
2223
|
+
<div class="folder-item-content">
|
|
2224
|
+
<div class="folder-item-name">ts-webp</div>
|
|
2225
|
+
<div class="folder-item-desc">A modern image format for the Web.</div>
|
|
2226
|
+
</div>
|
|
2227
|
+
</a>
|
|
2228
|
+
|
|
2229
|
+
<a href="https://github.com/stacksjs/ts-web-scraper" target="_blank" class="folder-item">
|
|
2230
|
+
<div class="folder-item-icon">📦</div>
|
|
2231
|
+
<div class="folder-item-content">
|
|
2232
|
+
<div class="folder-item-name">ts-web-scraper</div>
|
|
2233
|
+
<div class="folder-item-desc">Powerful, type-safe web scraping tooling.</div>
|
|
2234
|
+
</div>
|
|
2235
|
+
</a>
|
|
2236
|
+
|
|
2237
|
+
<a href="https://github.com/stacksjs/vidx" target="_blank" class="folder-item">
|
|
2238
|
+
<div class="folder-item-icon">📦</div>
|
|
2239
|
+
<div class="folder-item-content">
|
|
2240
|
+
<div class="folder-item-name">vidx</div>
|
|
2241
|
+
<div class="folder-item-desc">Make your videos load faster. A better save for the web.</div>
|
|
2242
|
+
</div>
|
|
2243
|
+
</a>
|
|
2244
|
+
</div>
|
|
2245
|
+
</div>
|
|
2246
|
+
</div>
|
|
2247
|
+
|
|
2248
|
+
<div id="window-plugins" class="window" style="left: 170px; top: 120px; width: 700px; height: 550px;">
|
|
2249
|
+
<div class="window-titlebar">
|
|
2250
|
+
<div class="window-icon">📁</div>
|
|
2251
|
+
<div class="window-title">Plugins & Actions</div>
|
|
2252
|
+
<div class="window-controls">
|
|
2253
|
+
<button class="minimize window-control" onclick="minimizeWindow('plugins')">_</button>
|
|
2254
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('plugins')">□</button>
|
|
2255
|
+
<button class="close window-control" onclick="closeWindow('plugins')">×</button>
|
|
2256
|
+
</div>
|
|
2257
|
+
</div>
|
|
2258
|
+
<div class="window-content">
|
|
2259
|
+
<h2>Plugins & Actions</h2>
|
|
2260
|
+
<p style="margin-bottom: 16px;">Build plugins and GitHub Actions to enhance your development workflow.</p>
|
|
2261
|
+
<div class="folder-list">
|
|
2262
|
+
|
|
2263
|
+
<a href="https://github.com/stacksjs/launchpad" target="_blank" class="folder-item">
|
|
2264
|
+
<div class="folder-item-icon">🔌</div>
|
|
2265
|
+
<div class="folder-item-content">
|
|
2266
|
+
<div class="folder-item-name">action-launchpad</div>
|
|
2267
|
+
<div class="folder-item-desc">GitHub Action to install packages using Launchpad.</div>
|
|
2268
|
+
</div>
|
|
2269
|
+
</a>
|
|
2270
|
+
|
|
2271
|
+
<a href="https://github.com/stacksjs/logsmith" target="_blank" class="folder-item">
|
|
2272
|
+
<div class="folder-item-icon">🔌</div>
|
|
2273
|
+
<div class="folder-item-content">
|
|
2274
|
+
<div class="folder-item-name">action-logsmith</div>
|
|
2275
|
+
<div class="folder-item-desc">Forge beautiful changelogs from your commits.</div>
|
|
2276
|
+
</div>
|
|
2277
|
+
</a>
|
|
2278
|
+
|
|
2279
|
+
<a href="https://github.com/stacksjs/action-releaser" target="_blank" class="folder-item">
|
|
2280
|
+
<div class="folder-item-icon">🔌</div>
|
|
2281
|
+
<div class="folder-item-content">
|
|
2282
|
+
<div class="folder-item-name">action-releaser</div>
|
|
2283
|
+
<div class="folder-item-desc">Simply attach files, like binaries & distributables, to GitHub Releases.</div>
|
|
2284
|
+
</div>
|
|
2285
|
+
</a>
|
|
2286
|
+
|
|
2287
|
+
<a href="https://github.com/stacksjs/bun-plugin-auto-imports" target="_blank" class="folder-item">
|
|
2288
|
+
<div class="folder-item-icon">🔌</div>
|
|
2289
|
+
<div class="folder-item-content">
|
|
2290
|
+
<div class="folder-item-name">bun-plugin-auto-imports</div>
|
|
2291
|
+
<div class="folder-item-desc">Auto Imports support for Bun.</div>
|
|
2292
|
+
</div>
|
|
2293
|
+
</a>
|
|
2294
|
+
|
|
2295
|
+
<a href="https://github.com/stacksjs/bun-plugin-dotenvx" target="_blank" class="folder-item">
|
|
2296
|
+
<div class="folder-item-icon">🔌</div>
|
|
2297
|
+
<div class="folder-item-content">
|
|
2298
|
+
<div class="folder-item-name">bun-plugin-dotenvx</div>
|
|
2299
|
+
<div class="folder-item-desc">A Bun plugin to seamlessly work with dotenvx.</div>
|
|
2300
|
+
</div>
|
|
2301
|
+
</a>
|
|
2302
|
+
|
|
2303
|
+
<a href="https://github.com/stacksjs/bun-plugin-dtsx" target="_blank" class="folder-item">
|
|
2304
|
+
<div class="folder-item-icon">🔌</div>
|
|
2305
|
+
<div class="folder-item-content">
|
|
2306
|
+
<div class="folder-item-name">bun-plugin-dtsx</div>
|
|
2307
|
+
<div class="folder-item-desc">Automatically generate your TypeScript DTS files, using Bun's bundler.</div>
|
|
2308
|
+
</div>
|
|
2309
|
+
</a>
|
|
2310
|
+
|
|
2311
|
+
<a href="https://github.com/stacksjs/bun-plugin-rpx" target="_blank" class="folder-item">
|
|
2312
|
+
<div class="folder-item-icon">🔌</div>
|
|
2313
|
+
<div class="folder-item-content">
|
|
2314
|
+
<div class="folder-item-name">bun-plugin-rpx</div>
|
|
2315
|
+
<div class="folder-item-desc">A modern, fast reverse proxy. For a better local development environment.</div>
|
|
2316
|
+
</div>
|
|
2317
|
+
</a>
|
|
2318
|
+
|
|
2319
|
+
<a href="https://github.com/stacksjs/bun-plugin-tlsx" target="_blank" class="folder-item">
|
|
2320
|
+
<div class="folder-item-icon">🔌</div>
|
|
2321
|
+
<div class="folder-item-content">
|
|
2322
|
+
<div class="folder-item-name">bun-plugin-tlsx</div>
|
|
2323
|
+
<div class="folder-item-desc">Bun plugin for a modern TLS library with automation & HTTPS by default.</div>
|
|
2324
|
+
</div>
|
|
2325
|
+
</a>
|
|
2326
|
+
|
|
2327
|
+
<a href="https://github.com/stacksjs/bun-plugin-unocss" target="_blank" class="folder-item">
|
|
2328
|
+
<div class="folder-item-icon">🔌</div>
|
|
2329
|
+
<div class="folder-item-content">
|
|
2330
|
+
<div class="folder-item-name">bun-plugin-unocss</div>
|
|
2331
|
+
<div class="folder-item-desc">Instant On-demand Atomic CSS Engine - UnoCSS</div>
|
|
2332
|
+
</div>
|
|
2333
|
+
</a>
|
|
2334
|
+
|
|
2335
|
+
<a href="https://github.com/stacksjs/vite-plugin-dotenvx" target="_blank" class="folder-item">
|
|
2336
|
+
<div class="folder-item-icon">🔌</div>
|
|
2337
|
+
<div class="folder-item-content">
|
|
2338
|
+
<div class="folder-item-name">vite-plugin-dotenvx</div>
|
|
2339
|
+
<div class="folder-item-desc">A Vite plugin to seamlessly work with dotenvx.</div>
|
|
2340
|
+
</div>
|
|
2341
|
+
</a>
|
|
2342
|
+
|
|
2343
|
+
<a href="https://github.com/stacksjs/vite-plugin-layouts" target="_blank" class="folder-item">
|
|
2344
|
+
<div class="folder-item-icon">🔌</div>
|
|
2345
|
+
<div class="folder-item-content">
|
|
2346
|
+
<div class="folder-item-name">vite-plugin-layouts</div>
|
|
2347
|
+
<div class="folder-item-desc">Router-based layouts for your application.</div>
|
|
2348
|
+
</div>
|
|
2349
|
+
</a>
|
|
2350
|
+
|
|
2351
|
+
<a href="https://github.com/stacksjs/vite-plugin-local" target="_blank" class="folder-item">
|
|
2352
|
+
<div class="folder-item-icon">🔌</div>
|
|
2353
|
+
<div class="folder-item-content">
|
|
2354
|
+
<div class="folder-item-name">vite-plugin-local</div>
|
|
2355
|
+
<div class="folder-item-desc">Pretty development URLs, and HTTPS. Zero config, zero setup.</div>
|
|
2356
|
+
</div>
|
|
2357
|
+
</a>
|
|
2358
|
+
|
|
2359
|
+
<a href="https://github.com/stacksjs/rpx" target="_blank" class="folder-item">
|
|
2360
|
+
<div class="folder-item-icon">🔌</div>
|
|
2361
|
+
<div class="folder-item-content">
|
|
2362
|
+
<div class="folder-item-name">vite-plugin-rpx</div>
|
|
2363
|
+
<div class="folder-item-desc">A Vite plugin for a modern, fast reverse proxy. For a better local development environment.</div>
|
|
2364
|
+
</div>
|
|
2365
|
+
</a>
|
|
2366
|
+
|
|
2367
|
+
<a href="https://github.com/stacksjs/vite-plugin-tauri" target="_blank" class="folder-item">
|
|
2368
|
+
<div class="folder-item-icon">🔌</div>
|
|
2369
|
+
<div class="folder-item-content">
|
|
2370
|
+
<div class="folder-item-name">vite-plugin-tauri</div>
|
|
2371
|
+
<div class="folder-item-desc">Zero-setup, highly-configurable cross-platform development.</div>
|
|
2372
|
+
</div>
|
|
2373
|
+
</a>
|
|
2374
|
+
|
|
2375
|
+
<a href="https://github.com/stacksjs/tlsx" target="_blank" class="folder-item">
|
|
2376
|
+
<div class="folder-item-icon">🔌</div>
|
|
2377
|
+
<div class="folder-item-content">
|
|
2378
|
+
<div class="folder-item-name">vite-plugin-tlsx</div>
|
|
2379
|
+
<div class="folder-item-desc">Simple, yet powerful TLS library. With automation & HTTPS by default.</div>
|
|
2380
|
+
</div>
|
|
2381
|
+
</a>
|
|
2382
|
+
</div>
|
|
2383
|
+
</div>
|
|
2384
|
+
</div>
|
|
2385
|
+
|
|
2386
|
+
<div id="window-templates" class="window" style="left: 220px; top: 140px; width: 650px; height: 400px;">
|
|
2387
|
+
<div class="window-titlebar">
|
|
2388
|
+
<div class="window-icon">📁</div>
|
|
2389
|
+
<div class="window-title">Templates</div>
|
|
2390
|
+
<div class="window-controls">
|
|
2391
|
+
<button class="minimize window-control" onclick="minimizeWindow('templates')">_</button>
|
|
2392
|
+
<button class="maximize window-control" onclick="toggleMaximizeWindow('templates')">□</button>
|
|
2393
|
+
<button class="close window-control" onclick="closeWindow('templates')">×</button>
|
|
2394
|
+
</div>
|
|
2395
|
+
</div>
|
|
2396
|
+
<div class="window-content">
|
|
2397
|
+
<h2>Templates</h2>
|
|
2398
|
+
<p style="margin-bottom: 16px;">Starter templates to jumpstart your TypeScript projects.</p>
|
|
2399
|
+
<div class="folder-list">
|
|
2400
|
+
|
|
2401
|
+
<a href="https://github.com/stacksjs/projects" target="_blank" class="folder-item">
|
|
2402
|
+
<div class="folder-item-icon">📋</div>
|
|
2403
|
+
<div class="folder-item-content">
|
|
2404
|
+
<div class="folder-item-name">projects</div>
|
|
2405
|
+
<div class="folder-item-desc">A minimal personal portfolio template.</div>
|
|
2406
|
+
</div>
|
|
2407
|
+
</a>
|
|
2408
|
+
|
|
2409
|
+
<a href="https://github.com/stacksjs/ts-starter" target="_blank" class="folder-item">
|
|
2410
|
+
<div class="folder-item-icon">📋</div>
|
|
2411
|
+
<div class="folder-item-content">
|
|
2412
|
+
<div class="folder-item-name">ts-starter</div>
|
|
2413
|
+
<div class="folder-item-desc">A rather barebones Bun & TypeScript starting point for libraries & CLIs.</div>
|
|
2414
|
+
</div>
|
|
2415
|
+
</a>
|
|
2416
|
+
|
|
2417
|
+
<a href="https://github.com/stacksjs/ts-starter-monorepo" target="_blank" class="folder-item">
|
|
2418
|
+
<div class="folder-item-icon">📋</div>
|
|
2419
|
+
<div class="folder-item-content">
|
|
2420
|
+
<div class="folder-item-name">ts-starter-monorepo</div>
|
|
2421
|
+
<div class="folder-item-desc">Like our ts-starter, but optimized for monorepos.</div>
|
|
2422
|
+
</div>
|
|
2423
|
+
</a>
|
|
2424
|
+
</div>
|
|
2425
|
+
</div>
|
|
2426
|
+
</div>
|
|
2427
|
+
|
|
2428
|
+
<!-- Start Menu -->
|
|
2429
|
+
<div class="start-menu" id="start-menu">
|
|
2430
|
+
<div class="start-menu-header">
|
|
2431
|
+
STACKS.JS
|
|
2432
|
+
</div>
|
|
2433
|
+
<div class="start-menu-user">
|
|
2434
|
+
<div class="start-menu-user-icon">👤</div>
|
|
2435
|
+
<div>Developer</div>
|
|
2436
|
+
</div>
|
|
2437
|
+
<div class="start-menu-items">
|
|
2438
|
+
<button class="start-menu-item" onclick="openWindow('about')">
|
|
2439
|
+
<div class="start-menu-item-icon">📄</div>
|
|
2440
|
+
<div>About Stacks</div>
|
|
2441
|
+
</button>
|
|
2442
|
+
<button class="start-menu-item" onclick="openWindow('ecosystem')">
|
|
2443
|
+
<div class="start-menu-item-icon">🌐</div>
|
|
2444
|
+
<div>Ecosystem</div>
|
|
2445
|
+
</button>
|
|
2446
|
+
<div class="start-menu-item has-submenu">
|
|
2447
|
+
<div class="start-menu-item-icon">⚙️</div>
|
|
2448
|
+
<div>Backend</div>
|
|
2449
|
+
<div class="start-submenu">
|
|
2450
|
+
<button class="start-menu-item" onclick="openWindow('backend'); setTimeout(() => showFeature('backend', 'auth'), 100)">
|
|
2451
|
+
<div class="start-menu-item-icon">🔐</div>
|
|
2452
|
+
<div>Authentication</div>
|
|
2453
|
+
</button>
|
|
2454
|
+
<button class="start-menu-item" onclick="openWindow('backend'); setTimeout(() => showFeature('backend', 'orm'), 100)">
|
|
2455
|
+
<div class="start-menu-item-icon">🗺️</div>
|
|
2456
|
+
<div>ORM</div>
|
|
2457
|
+
</button>
|
|
2458
|
+
<button class="start-menu-item" onclick="openWindow('backend'); setTimeout(() => showFeature('backend', 'validation'), 100)">
|
|
2459
|
+
<div class="start-menu-item-icon">✅</div>
|
|
2460
|
+
<div>Validation</div>
|
|
2461
|
+
</button>
|
|
2462
|
+
<button class="start-menu-item" onclick="openWindow('backend'); setTimeout(() => showFeature('backend', 'storage'), 100)">
|
|
2463
|
+
<div class="start-menu-item-icon">💾</div>
|
|
2464
|
+
<div>Storage</div>
|
|
2465
|
+
</button>
|
|
2466
|
+
<button class="start-menu-item" onclick="openWindow('backend'); setTimeout(() => showFeature('backend', 'queue'), 100)">
|
|
2467
|
+
<div class="start-menu-item-icon">📬</div>
|
|
2468
|
+
<div>Queues</div>
|
|
2469
|
+
</button>
|
|
2470
|
+
<button class="start-menu-item" onclick="openWindow('backend'); setTimeout(() => showFeature('backend', 'events'), 100)">
|
|
2471
|
+
<div class="start-menu-item-icon">📡</div>
|
|
2472
|
+
<div>Events</div>
|
|
2473
|
+
</button>
|
|
2474
|
+
</div>
|
|
2475
|
+
</div>
|
|
2476
|
+
<div class="start-menu-item has-submenu">
|
|
2477
|
+
<div class="start-menu-item-icon">🎨</div>
|
|
2478
|
+
<div>Frontend</div>
|
|
2479
|
+
<div class="start-submenu">
|
|
2480
|
+
<button class="start-menu-item" onclick="openWindow('frontend'); setTimeout(() => showFeature('frontend', 'components'), 100)">
|
|
2481
|
+
<div class="start-menu-item-icon">🧩</div>
|
|
2482
|
+
<div>Components</div>
|
|
2483
|
+
</button>
|
|
2484
|
+
<button class="start-menu-item" onclick="openWindow('frontend'); setTimeout(() => showFeature('frontend', 'ui-kit'), 100)">
|
|
2485
|
+
<div class="start-menu-item-icon">🎨</div>
|
|
2486
|
+
<div>UI Kit</div>
|
|
2487
|
+
</button>
|
|
2488
|
+
<button class="start-menu-item" onclick="openWindow('frontend'); setTimeout(() => showFeature('frontend', 'routing'), 100)">
|
|
2489
|
+
<div class="start-menu-item-icon">🧭</div>
|
|
2490
|
+
<div>Routing</div>
|
|
2491
|
+
</button>
|
|
2492
|
+
<button class="start-menu-item" onclick="openWindow('frontend'); setTimeout(() => showFeature('frontend', 'desktop'), 100)">
|
|
2493
|
+
<div class="start-menu-item-icon">🖥️</div>
|
|
2494
|
+
<div>Desktop</div>
|
|
2495
|
+
</button>
|
|
2496
|
+
</div>
|
|
2497
|
+
</div>
|
|
2498
|
+
<div class="start-menu-item has-submenu">
|
|
2499
|
+
<div class="start-menu-item-icon">☁️</div>
|
|
2500
|
+
<div>Cloud</div>
|
|
2501
|
+
<div class="start-submenu">
|
|
2502
|
+
<button class="start-menu-item" onclick="openWindow('cloud'); setTimeout(() => showFeature('cloud', 'deployment'), 100)">
|
|
2503
|
+
<div class="start-menu-item-icon">🚀</div>
|
|
2504
|
+
<div>Deployment</div>
|
|
2505
|
+
</button>
|
|
2506
|
+
<button class="start-menu-item" onclick="openWindow('cloud'); setTimeout(() => showFeature('cloud', 'storage'), 100)">
|
|
2507
|
+
<div class="start-menu-item-icon">💾</div>
|
|
2508
|
+
<div>Storage</div>
|
|
2509
|
+
</button>
|
|
2510
|
+
<button class="start-menu-item" onclick="openWindow('cloud'); setTimeout(() => showFeature('cloud', 'cdn'), 100)">
|
|
2511
|
+
<div class="start-menu-item-icon">🌍</div>
|
|
2512
|
+
<div>CDN</div>
|
|
2513
|
+
</button>
|
|
2514
|
+
<button class="start-menu-item" onclick="openWindow('cloud'); setTimeout(() => showFeature('cloud', 'dns'), 100)">
|
|
2515
|
+
<div class="start-menu-item-icon">🔗</div>
|
|
2516
|
+
<div>DNS</div>
|
|
2517
|
+
</button>
|
|
2518
|
+
</div>
|
|
2519
|
+
</div>
|
|
2520
|
+
<button class="start-menu-item" onclick="openWindow('dashboard')">
|
|
2521
|
+
<div class="start-menu-item-icon">📊</div>
|
|
2522
|
+
<div>Dashboard</div>
|
|
2523
|
+
</button>
|
|
2524
|
+
<div class="start-menu-separator"></div>
|
|
2525
|
+
<div class="start-menu-item has-submenu">
|
|
2526
|
+
<div class="start-menu-item-icon">💎</div>
|
|
2527
|
+
<div>Sponsorware</div>
|
|
2528
|
+
<div class="start-submenu">
|
|
2529
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/bun-queue', '_blank')">
|
|
2530
|
+
<div class="start-menu-item-icon">📬</div>
|
|
2531
|
+
<div>bun-queue</div>
|
|
2532
|
+
</button>
|
|
2533
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/bun-router', '_blank')">
|
|
2534
|
+
<div class="start-menu-item-icon">🧭</div>
|
|
2535
|
+
<div>bun-router</div>
|
|
2536
|
+
</button>
|
|
2537
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/stacks-dashboard', '_blank')">
|
|
2538
|
+
<div class="start-menu-item-icon">📊</div>
|
|
2539
|
+
<div>Stacks Dashboard</div>
|
|
2540
|
+
</button>
|
|
2541
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/stacks-orm-dynamodb', '_blank')">
|
|
2542
|
+
<div class="start-menu-item-icon">🗄️</div>
|
|
2543
|
+
<div>Stacks ORM - DynamoDB</div>
|
|
2544
|
+
</button>
|
|
2545
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/stacks-raycast', '_blank')">
|
|
2546
|
+
<div class="start-menu-item-icon">🔍</div>
|
|
2547
|
+
<div>Stacks Raycast</div>
|
|
2548
|
+
</button>
|
|
2549
|
+
</div>
|
|
2550
|
+
</div>
|
|
2551
|
+
<div class="start-menu-item has-submenu">
|
|
2552
|
+
<div class="start-menu-item-icon">📱</div>
|
|
2553
|
+
<div>Apps</div>
|
|
2554
|
+
<div class="start-submenu">
|
|
2555
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/barista', '_blank')">
|
|
2556
|
+
<div class="start-menu-item-icon">☕</div>
|
|
2557
|
+
<div>Barista</div>
|
|
2558
|
+
</button>
|
|
2559
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/hush', '_blank')">
|
|
2560
|
+
<div class="start-menu-item-icon">🤫</div>
|
|
2561
|
+
<div>Hush</div>
|
|
2562
|
+
</button>
|
|
2563
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/pomodoro', '_blank')">
|
|
2564
|
+
<div class="start-menu-item-icon">🍅</div>
|
|
2565
|
+
<div>Pomodoro</div>
|
|
2566
|
+
</button>
|
|
2567
|
+
</div>
|
|
2568
|
+
</div>
|
|
2569
|
+
<div class="start-menu-item has-submenu">
|
|
2570
|
+
<div class="start-menu-item-icon">🏗️</div>
|
|
2571
|
+
<div>Frameworks</div>
|
|
2572
|
+
<div class="start-submenu">
|
|
2573
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/bunpress', '_blank')">
|
|
2574
|
+
<div class="start-menu-item-icon">📚</div>
|
|
2575
|
+
<div>BunPress</div>
|
|
2576
|
+
</button>
|
|
2577
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/clapp', '_blank')">
|
|
2578
|
+
<div class="start-menu-item-icon">⌨️</div>
|
|
2579
|
+
<div>Clapp</div>
|
|
2580
|
+
</button>
|
|
2581
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/cwcss/crosswind', '_blank')">
|
|
2582
|
+
<div class="start-menu-item-icon">💨</div>
|
|
2583
|
+
<div>Crosswind</div>
|
|
2584
|
+
</button>
|
|
2585
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/launchpad', '_blank')">
|
|
2586
|
+
<div class="start-menu-item-icon">🚀</div>
|
|
2587
|
+
<div>Launchpad</div>
|
|
2588
|
+
</button>
|
|
2589
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/stacks', '_blank')">
|
|
2590
|
+
<div class="start-menu-item-icon">📚</div>
|
|
2591
|
+
<div>Stacks</div>
|
|
2592
|
+
</button>
|
|
2593
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/stx', '_blank')">
|
|
2594
|
+
<div class="start-menu-item-icon">⚡</div>
|
|
2595
|
+
<div>stx</div>
|
|
2596
|
+
</button>
|
|
2597
|
+
</div>
|
|
2598
|
+
</div>
|
|
2599
|
+
<div class="start-menu-separator"></div>
|
|
2600
|
+
<div class="start-menu-item has-submenu">
|
|
2601
|
+
<div class="start-menu-item-icon">🔗</div>
|
|
2602
|
+
<div>Resources</div>
|
|
2603
|
+
<div class="start-submenu">
|
|
2604
|
+
<button class="start-menu-item" onclick="window.open('https://stacksjs.com/docs', '_blank')">
|
|
2605
|
+
<div class="start-menu-item-icon">📚</div>
|
|
2606
|
+
<div>Documentation</div>
|
|
2607
|
+
</button>
|
|
2608
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/stacks', '_blank')">
|
|
2609
|
+
<div class="start-menu-item-icon">💻</div>
|
|
2610
|
+
<div>GitHub</div>
|
|
2611
|
+
</button>
|
|
2612
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/sponsors/chrisbbreuer', '_blank')">
|
|
2613
|
+
<div class="start-menu-item-icon">💖</div>
|
|
2614
|
+
<div>Sponsor</div>
|
|
2615
|
+
</button>
|
|
2616
|
+
<button class="start-menu-item" onclick="window.open('https://discord.gg/stacksjs', '_blank')">
|
|
2617
|
+
<div class="start-menu-item-icon">💬</div>
|
|
2618
|
+
<div>Discord</div>
|
|
2619
|
+
</button>
|
|
2620
|
+
<button class="start-menu-item" onclick="openIconFromMenu('blog')">
|
|
2621
|
+
<div class="start-menu-item-icon">📝</div>
|
|
2622
|
+
<div>Blog</div>
|
|
2623
|
+
</button>
|
|
2624
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/white-paper', '_blank')">
|
|
2625
|
+
<div class="start-menu-item-icon">📄</div>
|
|
2626
|
+
<div>White Paper</div>
|
|
2627
|
+
</button>
|
|
2628
|
+
<button class="start-menu-item" onclick="window.open('https://github.com/stacksjs/stacks/blob/main/LICENSE.md', '_blank')">
|
|
2629
|
+
<div class="start-menu-item-icon">⚖️</div>
|
|
2630
|
+
<div>License</div>
|
|
2631
|
+
</button>
|
|
2632
|
+
</div>
|
|
2633
|
+
</div>
|
|
2634
|
+
</div>
|
|
2635
|
+
</div>
|
|
2636
|
+
|
|
2637
|
+
<!-- taskbar -->
|
|
2638
|
+
<div class="taskbar">
|
|
2639
|
+
<button class="start-button" id="start-button">
|
|
2640
|
+
<span class="start-logo">🪟</span>
|
|
2641
|
+
<span>start</span>
|
|
2642
|
+
</button>
|
|
2643
|
+
<div class="taskbar-divider"></div>
|
|
2644
|
+
<div class="quick-launch">
|
|
2645
|
+
<a href="https://stacksjs.com/docs" target="_blank" class="quick-launch-icon" title="Documentation">
|
|
2646
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
2647
|
+
<path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20"/>
|
|
2648
|
+
</svg>
|
|
2649
|
+
</a>
|
|
2650
|
+
<a href="https://github.com/stacksjs/stacks" target="_blank" class="quick-launch-icon" title="GitHub Repository">
|
|
2651
|
+
<svg width="20" height="20" viewBox="0 0 16 16" fill="currentColor">
|
|
2652
|
+
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/>
|
|
2653
|
+
</svg>
|
|
2654
|
+
</a>
|
|
2655
|
+
<a href="https://github.com/sponsors/chrisbbreuer" target="_blank" class="quick-launch-icon" title="Sponsor">
|
|
2656
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
|
2657
|
+
<path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/>
|
|
2658
|
+
</svg>
|
|
2659
|
+
</a>
|
|
2660
|
+
<a href="https://discord.gg/stacksjs" target="_blank" class="quick-launch-icon" title="Discord">
|
|
2661
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
|
2662
|
+
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"/>
|
|
2663
|
+
</svg>
|
|
2664
|
+
</a>
|
|
2665
|
+
</div>
|
|
2666
|
+
<div class="taskbar-divider"></div>
|
|
2667
|
+
<div class="taskbar-tasks" id="taskbar-tasks"></div>
|
|
2668
|
+
<div class="taskbar-clock" id="clock">12:00 PM</div>
|
|
2669
|
+
</div>
|
|
2670
|
+
|
|
2671
|
+
<!-- Notification Popup -->
|
|
2672
|
+
<div class="hidden notification-popup" id="notification-popup">
|
|
2673
|
+
<div class="notification-header">
|
|
2674
|
+
<div class="notification-icon">⭐</div>
|
|
2675
|
+
<div class="notification-title">Build Anything</div>
|
|
2676
|
+
<div class="notification-count">5</div>
|
|
2677
|
+
<button class="notification-close" onclick="closeNotification()">×</button>
|
|
2678
|
+
</div>
|
|
2679
|
+
<div class="notification-features">
|
|
2680
|
+
<div class="notification-feature">
|
|
2681
|
+
<div class="notification-feature-icon"></div>
|
|
2682
|
+
<div>Modern web applications & APIs</div>
|
|
2683
|
+
</div>
|
|
2684
|
+
<div class="notification-feature">
|
|
2685
|
+
<div class="notification-feature-icon"></div>
|
|
2686
|
+
<div>One UI. 3 apps. <em>Web, Desktop & Mobile.</em></div>
|
|
2687
|
+
</div>
|
|
2688
|
+
<div class="notification-feature">
|
|
2689
|
+
<div class="notification-feature-icon"></div>
|
|
2690
|
+
<div>Cloud infrastructure & serverless</div>
|
|
2691
|
+
</div>
|
|
2692
|
+
<div class="notification-feature">
|
|
2693
|
+
<div class="notification-feature-icon"></div>
|
|
2694
|
+
<div>Type-safe with TypeScript</div>
|
|
2695
|
+
</div>
|
|
2696
|
+
<div class="notification-feature">
|
|
2697
|
+
<div class="notification-feature-icon"></div>
|
|
2698
|
+
<div>Lightning fast with Bun</div>
|
|
2699
|
+
</div>
|
|
2700
|
+
</div>
|
|
2701
|
+
<div class="notification-signup" id="notification-signup">
|
|
2702
|
+
<div class="notification-separator"></div>
|
|
2703
|
+
<div class="notification-signup-text">Get updates on new features & releases:</div>
|
|
2704
|
+
<div class="notification-signup-form">
|
|
2705
|
+
<input
|
|
2706
|
+
type="email"
|
|
2707
|
+
id="notification-email"
|
|
2708
|
+
class="notification-email-input"
|
|
2709
|
+
placeholder="your@email.com"
|
|
2710
|
+
autocomplete="email"
|
|
2711
|
+
/>
|
|
2712
|
+
<button class="notification-signup-btn" onclick="handleEmailSignup()">
|
|
2713
|
+
Sign Up
|
|
2714
|
+
</button>
|
|
2715
|
+
</div>
|
|
2716
|
+
</div>
|
|
2717
|
+
<div class="notification-success" id="notification-success" style="display: none;">
|
|
2718
|
+
<div class="notification-separator"></div>
|
|
2719
|
+
<div class="notification-success-content">
|
|
2720
|
+
<div class="notification-success-icon">✓</div>
|
|
2721
|
+
<div class="notification-success-text">
|
|
2722
|
+
<div class="notification-success-title">Thanks for subscribing!</div>
|
|
2723
|
+
<div class="notification-success-subtitle">We'll keep you updated.</div>
|
|
2724
|
+
</div>
|
|
2725
|
+
</div>
|
|
2726
|
+
</div>
|
|
2727
|
+
</div>
|
|
2728
|
+
</div>
|
|
2729
|
+
|
|
2730
|
+
<!-- Context Menu (outside desktop div to avoid layout inheritance) -->
|
|
2731
|
+
<div class="context-menu" id="context-menu" style="display: none;">
|
|
2732
|
+
<div class="context-menu-item has-submenu">
|
|
2733
|
+
<div class="context-menu-item-icon">📤</div>
|
|
2734
|
+
<div>Share with a friend...</div>
|
|
2735
|
+
<div class="context-submenu">
|
|
2736
|
+
<button class="context-menu-item" onclick="shareVia('twitter')">
|
|
2737
|
+
<div class="context-menu-item-icon">🐦</div>
|
|
2738
|
+
<div>Share on Twitter</div>
|
|
2739
|
+
</button>
|
|
2740
|
+
<button class="context-menu-item" onclick="shareVia('bluesky')">
|
|
2741
|
+
<div class="context-menu-item-icon">🦋</div>
|
|
2742
|
+
<div>Share on Bluesky</div>
|
|
2743
|
+
</button>
|
|
2744
|
+
<button class="context-menu-item" onclick="shareVia('linkedin')">
|
|
2745
|
+
<div class="context-menu-item-icon">💼</div>
|
|
2746
|
+
<div>Share on LinkedIn</div>
|
|
2747
|
+
</button>
|
|
2748
|
+
<button class="context-menu-item" onclick="shareVia('email')">
|
|
2749
|
+
<div class="context-menu-item-icon">�</div>
|
|
2750
|
+
<div>Share via Email</div>
|
|
2751
|
+
</button>
|
|
2752
|
+
<button class="context-menu-item" onclick="shareVia('copy')">
|
|
2753
|
+
<div class="context-menu-item-icon">📋</div>
|
|
2754
|
+
<div>Copy Link</div>
|
|
2755
|
+
</button>
|
|
2756
|
+
</div>
|
|
2757
|
+
</div>
|
|
2758
|
+
<div class="context-menu-separator"></div>
|
|
2759
|
+
<button class="context-menu-item" onclick="copyLogoSVG()">
|
|
2760
|
+
<div class="context-menu-item-icon">🎨</div>
|
|
2761
|
+
<div>Copy Logo as SVG</div>
|
|
2762
|
+
</button>
|
|
2763
|
+
<button class="context-menu-item" onclick="copyWordmarkSVG()">
|
|
2764
|
+
<div class="context-menu-item-icon">✏️</div>
|
|
2765
|
+
<div>Copy Wordmark as SVG</div>
|
|
2766
|
+
</button>
|
|
2767
|
+
<button class="context-menu-item" onclick="window.open('https://stacksjs.com/brand', '_blank')">
|
|
2768
|
+
<div class="context-menu-item-icon">📖</div>
|
|
2769
|
+
<div>Brand Guidelines</div>
|
|
2770
|
+
</button>
|
|
2771
|
+
<div class="context-menu-separator"></div>
|
|
2772
|
+
<button class="context-menu-item" onclick="window.open('https://stacksjs.com/docs', '_blank')">
|
|
2773
|
+
<div class="context-menu-item-icon">📚</div>
|
|
2774
|
+
<div>Documentation</div>
|
|
2775
|
+
</button>
|
|
2776
|
+
<button class="context-menu-item" onclick="window.open('https://github.com/stacksjs/stacks', '_blank')">
|
|
2777
|
+
<div class="context-menu-item-icon">💻</div>
|
|
2778
|
+
<div>View on GitHub</div>
|
|
2779
|
+
</button>
|
|
2780
|
+
<div class="context-menu-separator"></div>
|
|
2781
|
+
<button class="context-menu-item" onclick="changeBackgroundImage()">
|
|
2782
|
+
<div class="context-menu-item-icon">🖼️</div>
|
|
2783
|
+
<div>Change Background Image</div>
|
|
2784
|
+
</button>
|
|
2785
|
+
<div class="context-menu-separator"></div>
|
|
2786
|
+
<button class="context-menu-item" onclick="window.location.reload()">
|
|
2787
|
+
<div class="context-menu-item-icon">🔄</div>
|
|
2788
|
+
<div>Refresh</div>
|
|
2789
|
+
</button>
|
|
2790
|
+
</div>
|
|
2791
|
+
|
|
2792
|
+
<!-- Icon Context Menu -->
|
|
2793
|
+
<div class="context-menu" id="icon-context-menu" style="display: none;">
|
|
2794
|
+
<button class="context-menu-item" onclick="openIconFromMenu()">
|
|
2795
|
+
<div class="context-menu-item-icon">📂</div>
|
|
2796
|
+
<div>Open</div>
|
|
2797
|
+
</button>
|
|
2798
|
+
<div class="context-menu-separator"></div>
|
|
2799
|
+
<button class="context-menu-item" onclick="renameIcon()">
|
|
2800
|
+
<div class="context-menu-item-icon">✏️</div>
|
|
2801
|
+
<div>Rename</div>
|
|
2802
|
+
</button>
|
|
2803
|
+
<button class="context-menu-item" onclick="deleteIcon()">
|
|
2804
|
+
<div class="context-menu-item-icon">🗑️</div>
|
|
2805
|
+
<div>Delete</div>
|
|
2806
|
+
</button>
|
|
2807
|
+
<div class="context-menu-separator"></div>
|
|
2808
|
+
<div class="context-menu-item has-submenu">
|
|
2809
|
+
<div class="context-menu-item-icon">📤</div>
|
|
2810
|
+
<div>Share with a friend...</div>
|
|
2811
|
+
<div class="context-submenu">
|
|
2812
|
+
<button class="context-menu-item" onclick="shareVia('twitter')">
|
|
2813
|
+
<div class="context-menu-item-icon">🐦</div>
|
|
2814
|
+
<div>Share on Twitter</div>
|
|
2815
|
+
</button>
|
|
2816
|
+
<button class="context-menu-item" onclick="shareVia('bluesky')">
|
|
2817
|
+
<div class="context-menu-item-icon">🦋</div>
|
|
2818
|
+
<div>Share on Bluesky</div>
|
|
2819
|
+
</button>
|
|
2820
|
+
<button class="context-menu-item" onclick="shareVia('linkedin')">
|
|
2821
|
+
<div class="context-menu-item-icon">💼</div>
|
|
2822
|
+
<div>Share on LinkedIn</div>
|
|
2823
|
+
</button>
|
|
2824
|
+
<button class="context-menu-item" onclick="shareVia('email')">
|
|
2825
|
+
<div class="context-menu-item-icon">�</div>
|
|
2826
|
+
<div>Share via Email</div>
|
|
2827
|
+
</button>
|
|
2828
|
+
<button class="context-menu-item" onclick="shareVia('copy')">
|
|
2829
|
+
<div class="context-menu-item-icon">📋</div>
|
|
2830
|
+
<div>Copy Link</div>
|
|
2831
|
+
</button>
|
|
2832
|
+
</div>
|
|
2833
|
+
</div>
|
|
2834
|
+
<div class="context-menu-separator"></div>
|
|
2835
|
+
<button class="context-menu-item" onclick="copyLogoSVG()">
|
|
2836
|
+
<div class="context-menu-item-icon">🎨</div>
|
|
2837
|
+
<div>Copy Logo as SVG</div>
|
|
2838
|
+
</button>
|
|
2839
|
+
<button class="context-menu-item" onclick="copyWordmarkSVG()">
|
|
2840
|
+
<div class="context-menu-item-icon">✏️</div>
|
|
2841
|
+
<div>Copy Wordmark as SVG</div>
|
|
2842
|
+
</button>
|
|
2843
|
+
<button class="context-menu-item" onclick="window.open('https://stacksjs.com/brand', '_blank')">
|
|
2844
|
+
<div class="context-menu-item-icon">📖</div>
|
|
2845
|
+
<div>Brand Guidelines</div>
|
|
2846
|
+
</button>
|
|
2847
|
+
<div class="context-menu-separator"></div>
|
|
2848
|
+
<button class="context-menu-item" onclick="window.open('https://stacksjs.com/docs', '_blank')">
|
|
2849
|
+
<div class="context-menu-item-icon">📚</div>
|
|
2850
|
+
<div>Documentation</div>
|
|
2851
|
+
</button>
|
|
2852
|
+
<button class="context-menu-item" onclick="window.open('https://github.com/stacksjs/stacks', '_blank')">
|
|
2853
|
+
<div class="context-menu-item-icon">💻</div>
|
|
2854
|
+
<div>View on GitHub</div>
|
|
2855
|
+
</button>
|
|
2856
|
+
<div class="context-menu-separator"></div>
|
|
2857
|
+
<button class="context-menu-item" onclick="window.location.reload()">
|
|
2858
|
+
<div class="context-menu-item-icon">🔄</div>
|
|
2859
|
+
<div>Refresh</div>
|
|
2860
|
+
</button>
|
|
2861
|
+
</div>
|
|
2862
|
+
|
|
2863
|
+
<script type="module" src="/assets/scripts/main.ts"></script>
|
|
2864
|
+
</body>
|
|
2865
|
+
</html>
|