strade-stx 1.0.0
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/.activity_counter +1 -0
- package/.gitattributes +3 -0
- package/.vscode/settings.json +4 -0
- package/.vscode/tasks.json +19 -0
- package/CHANGELOG.md +1 -0
- package/Clarinet.toml +56 -0
- package/Clarinet.toml.backup +174 -0
- package/Clarinet.toml.old +146 -0
- package/DEPLOYMENT_RESULTS.md +160 -0
- package/README.md +344 -0
- package/TODO.md +34 -0
- package/contracts/CoreMarketPlace.clar +227 -0
- package/contracts/DisputeResolution_clar.clar +265 -0
- package/contracts/EscrowService.clar +171 -0
- package/contracts/UserProfile.clar +280 -0
- package/contracts/ft-trait.clar +24 -0
- package/contracts/token.clar +178 -0
- package/costs-reports.json +76026 -0
- package/deployments/default.mainnet-plan.yaml +67 -0
- package/deployments/default.simnet-plan.yaml +105 -0
- package/deployments/default.testnet-plan.yaml +67 -0
- package/deployments/new-contracts.testnet-plan.yaml +32 -0
- package/frontend/README.md +10 -0
- package/frontend/components.json +22 -0
- package/frontend/dist/assets/index-BacuuL66.css +1 -0
- package/frontend/dist/assets/index-jryypd5B.js +194 -0
- package/frontend/dist/favicon.png +0 -0
- package/frontend/dist/index.html +15 -0
- package/frontend/dist/manifest.json +15 -0
- package/frontend/dist/vite.svg +1 -0
- package/frontend/empty-mock.js +1 -0
- package/frontend/eslint.config.js +23 -0
- package/frontend/eslint.config.mjs +25 -0
- package/frontend/index.html +14 -0
- package/frontend/next.config.ts +17 -0
- package/frontend/package-lock.json +14740 -0
- package/frontend/package.json +56 -0
- package/frontend/postcss.config.js +5 -0
- package/frontend/postcss.config.mjs +5 -0
- package/frontend/public/favicon.png +0 -0
- package/frontend/public/file.svg +1 -0
- package/frontend/public/globe.svg +1 -0
- package/frontend/public/manifest.json +15 -0
- package/frontend/public/next.svg +1 -0
- package/frontend/public/vercel.svg +1 -0
- package/frontend/public/vite.svg +1 -0
- package/frontend/public/window.svg +1 -0
- package/frontend/src/App.css +42 -0
- package/frontend/src/App.tsx +177 -0
- package/frontend/src/app/about/page.tsx +208 -0
- package/frontend/src/app/favicon.ico +0 -0
- package/frontend/src/app/globals.css +129 -0
- package/frontend/src/app/help/page.tsx +167 -0
- package/frontend/src/app/how-it-works/page.tsx +274 -0
- package/frontend/src/app/layout.tsx +55 -0
- package/frontend/src/app/marketplace/page.tsx +324 -0
- package/frontend/src/app/my-listings/page.tsx +318 -0
- package/frontend/src/app/page.tsx +15 -0
- package/frontend/src/assets/react.svg +1 -0
- package/frontend/src/components/ConfirmDialog.tsx +54 -0
- package/frontend/src/components/CreateListingForm.tsx +231 -0
- package/frontend/src/components/ErrorBoundary.tsx +73 -0
- package/frontend/src/components/FilterPanel.tsx +10 -0
- package/frontend/src/components/Footer.tsx +100 -0
- package/frontend/src/components/Header.tsx +268 -0
- package/frontend/src/components/ImageUpload.tsx +147 -0
- package/frontend/src/components/LandingPage.tsx +322 -0
- package/frontend/src/components/ListingCard.tsx +154 -0
- package/frontend/src/components/LoadingSkeleton.tsx +44 -0
- package/frontend/src/components/MobileNav.tsx +89 -0
- package/frontend/src/components/NotificationBell.tsx +8 -0
- package/frontend/src/components/NotificationPanel.tsx +14 -0
- package/frontend/src/components/README.md +14 -0
- package/frontend/src/components/SearchBar.tsx +10 -0
- package/frontend/src/components/TestnetBanner.tsx +29 -0
- package/frontend/src/components/ThemeToggle.tsx +32 -0
- package/frontend/src/components/__tests__/Header.test.tsx +70 -0
- package/frontend/src/components/__tests__/ListingCard.test.tsx +86 -0
- package/frontend/src/components/providers/ThemeProvider.tsx +9 -0
- package/frontend/src/components/ui/alert-dialog.tsx +141 -0
- package/frontend/src/components/ui/avatar.tsx +53 -0
- package/frontend/src/components/ui/badge.tsx +46 -0
- package/frontend/src/components/ui/button.tsx +60 -0
- package/frontend/src/components/ui/card.tsx +92 -0
- package/frontend/src/components/ui/dialog.tsx +143 -0
- package/frontend/src/components/ui/dropdown-menu.tsx +257 -0
- package/frontend/src/components/ui/input.tsx +21 -0
- package/frontend/src/components/ui/label.tsx +24 -0
- package/frontend/src/components/ui/select.tsx +187 -0
- package/frontend/src/components/ui/sonner.tsx +40 -0
- package/frontend/src/components/ui/textarea.tsx +18 -0
- package/frontend/src/context/README.md +27 -0
- package/frontend/src/index.css +166 -0
- package/frontend/src/lib/notificationEvents.ts +10 -0
- package/frontend/src/lib/notificationStore.ts +13 -0
- package/frontend/src/lib/notifications.ts +13 -0
- package/frontend/src/lib/search.ts +28 -0
- package/frontend/src/lib/stacks.ts +189 -0
- package/frontend/src/lib/utils.ts +6 -0
- package/frontend/src/main.tsx +10 -0
- package/frontend/src/test/setup.ts +23 -0
- package/frontend/src/types.d.ts +9 -0
- package/frontend/tsconfig.app.json +28 -0
- package/frontend/tsconfig.json +41 -0
- package/frontend/tsconfig.node.json +26 -0
- package/frontend/vercel.json +4 -0
- package/frontend/vite.config.ts +6 -0
- package/frontend/vitest.config.ts +17 -0
- package/lcov.info +31338 -0
- package/mainnetcontracts.md +16 -0
- package/package.json +53 -0
- package/scripts/auto-activity.sh +9 -0
- package/scripts/cancel-pending.ts +67 -0
- package/scripts/check-balances.ts +23 -0
- package/scripts/distribute-evenly.ts +56 -0
- package/scripts/drain-accounts.ts +70 -0
- package/scripts/fund-accounts.ts +88 -0
- package/scripts/fund-active.ts +59 -0
- package/scripts/fund-unfunded.ts +88 -0
- package/scripts/generate-activity.ts +181 -0
- package/scripts/git-activity-generator.ts +154 -0
- package/scripts/mobile-server.ts +123 -0
- package/settings/Devnet.toml +155 -0
- package/settings/Mainnet.toml +7 -0
- package/settings/Testnet.toml +9 -0
- package/tests/CoreMarketPlace.fuzz.test.ts +435 -0
- package/tests/CoreMarketPlace.test.ts +564 -0
- package/tsconfig.json +26 -0
- package/vitest.config.js +49 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "strade",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev",
|
|
7
|
+
"build": "next build --webpack",
|
|
8
|
+
"start": "next start",
|
|
9
|
+
"lint": "eslint",
|
|
10
|
+
"test": "vitest run",
|
|
11
|
+
"test:watch": "vitest"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
15
|
+
"@radix-ui/react-avatar": "^1.1.10",
|
|
16
|
+
"@radix-ui/react-dialog": "^1.1.15",
|
|
17
|
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
18
|
+
"@radix-ui/react-label": "^2.1.7",
|
|
19
|
+
"@radix-ui/react-select": "^2.2.6",
|
|
20
|
+
"@radix-ui/react-slot": "^1.2.3",
|
|
21
|
+
"@stacks/blockchain-api-client": "^8.13.1",
|
|
22
|
+
"@stacks/connect": "^8.2.0",
|
|
23
|
+
"@stacks/network": "^7.2.0",
|
|
24
|
+
"@stacks/transactions": "^7.2.0",
|
|
25
|
+
"class-variance-authority": "^0.7.1",
|
|
26
|
+
"clsx": "^2.1.1",
|
|
27
|
+
"framer-motion": "^12.23.26",
|
|
28
|
+
"lucide-react": "^0.545.0",
|
|
29
|
+
"next": "^16.1.6",
|
|
30
|
+
"next-themes": "^0.4.6",
|
|
31
|
+
"react": "19.1.0",
|
|
32
|
+
"react-dom": "19.1.0",
|
|
33
|
+
"sonner": "^2.0.7",
|
|
34
|
+
"tailwind-merge": "^3.3.1"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@eslint/eslintrc": "^3",
|
|
38
|
+
"@tailwindcss/postcss": "^4",
|
|
39
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
40
|
+
"@testing-library/react": "^16.3.0",
|
|
41
|
+
"@testing-library/user-event": "^14.6.1",
|
|
42
|
+
"@types/node": "^20",
|
|
43
|
+
"@types/react": "^19",
|
|
44
|
+
"@types/react-dom": "^19",
|
|
45
|
+
"@vitejs/plugin-react": "^5.0.4",
|
|
46
|
+
"eslint": "^9",
|
|
47
|
+
"eslint-config-next": "15.5.5",
|
|
48
|
+
"jsdom": "^27.0.0",
|
|
49
|
+
"null-loader": "^4.0.1",
|
|
50
|
+
"tailwindcss": "^4",
|
|
51
|
+
"ts-loader": "^9.5.4",
|
|
52
|
+
"tw-animate-css": "^1.4.0",
|
|
53
|
+
"typescript": "^5",
|
|
54
|
+
"vitest": "^3.2.4"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "StackPay",
|
|
3
|
+
"short_name": "StackPay",
|
|
4
|
+
"start_url": "/",
|
|
5
|
+
"display": "standalone",
|
|
6
|
+
"background_color": "#0a0a0f",
|
|
7
|
+
"theme_color": "#00ff9d",
|
|
8
|
+
"icons": [
|
|
9
|
+
{
|
|
10
|
+
"src": "/vite.svg",
|
|
11
|
+
"sizes": "any",
|
|
12
|
+
"type": "image/svg+xml"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#root {
|
|
2
|
+
max-width: 1280px;
|
|
3
|
+
margin: 0 auto;
|
|
4
|
+
padding: 2rem;
|
|
5
|
+
text-align: center;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.logo {
|
|
9
|
+
height: 6em;
|
|
10
|
+
padding: 1.5em;
|
|
11
|
+
will-change: filter;
|
|
12
|
+
transition: filter 300ms;
|
|
13
|
+
}
|
|
14
|
+
.logo:hover {
|
|
15
|
+
filter: drop-shadow(0 0 2em #646cffaa);
|
|
16
|
+
}
|
|
17
|
+
.logo.react:hover {
|
|
18
|
+
filter: drop-shadow(0 0 2em #61dafbaa);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@keyframes logo-spin {
|
|
22
|
+
from {
|
|
23
|
+
transform: rotate(0deg);
|
|
24
|
+
}
|
|
25
|
+
to {
|
|
26
|
+
transform: rotate(360deg);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
31
|
+
a:nth-of-type(2) .logo {
|
|
32
|
+
animation: logo-spin infinite 20s linear;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.card {
|
|
37
|
+
padding: 2em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.read-the-docs {
|
|
41
|
+
color: #888;
|
|
42
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { BrowserRouter, Link, Route, Routes, useLocation } from 'react-router-dom';
|
|
2
|
+
import { motion, AnimatePresence } from 'framer-motion';
|
|
3
|
+
import { Analytics } from '@vercel/analytics/react';
|
|
4
|
+
import { Toaster } from 'react-hot-toast';
|
|
5
|
+
|
|
6
|
+
const navLinks = [
|
|
7
|
+
{ path: '/dashboard', label: 'Dashboard', icon: '📊' },
|
|
8
|
+
{ path: '/about', label: 'About', icon: '📖' },
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
function Navigation() {
|
|
12
|
+
const location = useLocation();
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<nav className="fixed top-6 left-1/2 -translate-x-1/2 z-50 w-[95%] max-w-7xl">
|
|
16
|
+
<div className="glass rounded-2xl px-6 py-4 border border-app-border shadow-floating flex items-center justify-between">
|
|
17
|
+
<Link to="/" className="flex items-center group">
|
|
18
|
+
<span className="font-serif font-bold text-2xl tracking-tighter text-text-main group-hover:text-accent-indigo transition-colors duration-300">
|
|
19
|
+
Your<span className="italic">Brand</span>
|
|
20
|
+
</span>
|
|
21
|
+
</Link>
|
|
22
|
+
|
|
23
|
+
<div className="flex items-center gap-2">
|
|
24
|
+
{navLinks.map((link) => {
|
|
25
|
+
const isActive = location.pathname === link.path;
|
|
26
|
+
return (
|
|
27
|
+
<Link
|
|
28
|
+
key={link.path}
|
|
29
|
+
to={link.path}
|
|
30
|
+
className={`px-4 py-2 rounded-xl text-sm font-medium transition-all duration-200 ${
|
|
31
|
+
isActive
|
|
32
|
+
? 'bg-accent-indigo text-white shadow-premium'
|
|
33
|
+
: 'text-text-dim hover:text-accent-indigo hover:bg-app-hover'
|
|
34
|
+
}`}
|
|
35
|
+
>
|
|
36
|
+
{link.icon} {link.label}
|
|
37
|
+
</Link>
|
|
38
|
+
);
|
|
39
|
+
})}
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</nav>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function AnimatedRoutes() {
|
|
47
|
+
const location = useLocation();
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<AnimatePresence mode="wait">
|
|
51
|
+
<Routes location={location} key={location.pathname}>
|
|
52
|
+
<Route path="/" element={<LandingPage />} />
|
|
53
|
+
<Route path="/dashboard" element={<PageWrapper><Dashboard /></PageWrapper>} />
|
|
54
|
+
<Route path="/about" element={<PageWrapper><About /></PageWrapper>} />
|
|
55
|
+
</Routes>
|
|
56
|
+
</AnimatePresence>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function PageWrapper({ children }: { children: React.ReactNode }) {
|
|
61
|
+
return (
|
|
62
|
+
<motion.div
|
|
63
|
+
initial={{ opacity: 0, y: 15 }}
|
|
64
|
+
animate={{ opacity: 1, y: 0 }}
|
|
65
|
+
exit={{ opacity: 0, y: -15 }}
|
|
66
|
+
transition={{ duration: 0.4, ease: [0.16, 1, 0.3, 1] }}
|
|
67
|
+
className="pt-44 pb-24 px-6 min-h-screen"
|
|
68
|
+
>
|
|
69
|
+
<div className="max-w-7xl mx-auto">
|
|
70
|
+
{children}
|
|
71
|
+
</div>
|
|
72
|
+
</motion.div>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function LandingPage() {
|
|
77
|
+
return (
|
|
78
|
+
<div className="pt-32 pb-24 px-6">
|
|
79
|
+
<div className="max-w-6xl mx-auto">
|
|
80
|
+
<motion.div
|
|
81
|
+
initial={{ opacity: 0, y: 20 }}
|
|
82
|
+
animate={{ opacity: 1, y: 0 }}
|
|
83
|
+
className="text-center mb-20"
|
|
84
|
+
>
|
|
85
|
+
<h1 className="font-serif font-bold text-6xl md:text-7xl tracking-tighter text-text-main mb-6">
|
|
86
|
+
Welcome to Your
|
|
87
|
+
<br />
|
|
88
|
+
<span className="italic text-accent-indigo">New Project</span>
|
|
89
|
+
</h1>
|
|
90
|
+
<p className="text-xl text-text-dim max-w-2xl mx-auto mb-10">
|
|
91
|
+
A modern React template with Tailwind CSS, Framer Motion, and React Router.
|
|
92
|
+
</p>
|
|
93
|
+
<Link
|
|
94
|
+
to="/dashboard"
|
|
95
|
+
className="inline-flex items-center gap-2 px-8 py-4 bg-accent-indigo text-white rounded-xl font-medium hover:shadow-premium transition-all"
|
|
96
|
+
>
|
|
97
|
+
Get Started →
|
|
98
|
+
</Link>
|
|
99
|
+
</motion.div>
|
|
100
|
+
|
|
101
|
+
<div className="grid md:grid-cols-3 gap-6">
|
|
102
|
+
{[
|
|
103
|
+
{ icon: '⚡', title: 'Fast', desc: 'Built with Vite for lightning-fast development' },
|
|
104
|
+
{ icon: '🎨', title: 'Beautiful', desc: 'Tailwind CSS with custom design system' },
|
|
105
|
+
{ icon: '✨', title: 'Animated', desc: 'Smooth animations with Framer Motion' }
|
|
106
|
+
].map((feature, i) => (
|
|
107
|
+
<motion.div
|
|
108
|
+
key={i}
|
|
109
|
+
initial={{ opacity: 0, y: 20 }}
|
|
110
|
+
animate={{ opacity: 1, y: 0 }}
|
|
111
|
+
transition={{ delay: i * 0.1 }}
|
|
112
|
+
className="glass rounded-2xl p-8 border border-app-border"
|
|
113
|
+
>
|
|
114
|
+
<div className="text-4xl mb-4">{feature.icon}</div>
|
|
115
|
+
<h3 className="font-bold text-xl mb-2">{feature.title}</h3>
|
|
116
|
+
<p className="text-text-dim">{feature.desc}</p>
|
|
117
|
+
</motion.div>
|
|
118
|
+
))}
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function Dashboard() {
|
|
126
|
+
return (
|
|
127
|
+
<div className="glass rounded-2xl p-8 border border-app-border">
|
|
128
|
+
<h2 className="font-serif font-bold text-3xl mb-4">Dashboard</h2>
|
|
129
|
+
<p className="text-text-dim">Build your dashboard here.</p>
|
|
130
|
+
</div>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function About() {
|
|
135
|
+
return (
|
|
136
|
+
<div className="glass rounded-2xl p-8 border border-app-border">
|
|
137
|
+
<h2 className="font-serif font-bold text-3xl mb-4">About</h2>
|
|
138
|
+
<p className="text-text-dim">Add your about content here.</p>
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function App() {
|
|
144
|
+
return (
|
|
145
|
+
<BrowserRouter>
|
|
146
|
+
<Analytics />
|
|
147
|
+
<Toaster position="top-right" />
|
|
148
|
+
<div className="min-h-screen bg-app-bg grid-subtle selection:bg-accent-indigo/10 selection:text-accent-indigo">
|
|
149
|
+
<Navigation />
|
|
150
|
+
<main className="relative">
|
|
151
|
+
<AnimatedRoutes />
|
|
152
|
+
</main>
|
|
153
|
+
|
|
154
|
+
<footer className="border-t border-app-border py-16 px-6 bg-white">
|
|
155
|
+
<div className="max-w-7xl mx-auto flex flex-col md:flex-row items-center justify-between gap-10">
|
|
156
|
+
<div className="flex flex-col items-center md:items-start gap-5">
|
|
157
|
+
<span className="font-serif font-bold text-2xl tracking-tighter text-text-main">
|
|
158
|
+
Your<span className="italic">Brand</span>
|
|
159
|
+
</span>
|
|
160
|
+
<p className="text-sm text-text-pale max-w-xs text-center md:text-left leading-relaxed">
|
|
161
|
+
Your tagline or description here
|
|
162
|
+
</p>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<div className="flex flex-col items-center md:items-end gap-4">
|
|
166
|
+
<p className="text-xs text-text-pale uppercase tracking-widest font-medium">
|
|
167
|
+
© 2026 YOUR BRAND
|
|
168
|
+
</p>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</footer>
|
|
172
|
+
</div>
|
|
173
|
+
</BrowserRouter>
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export default App;
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { motion } from 'framer-motion';
|
|
4
|
+
import Header from '@/components/Header';
|
|
5
|
+
import Footer from '@/components/Footer';
|
|
6
|
+
import TestnetBanner from '@/components/TestnetBanner';
|
|
7
|
+
import { Shield, Target, Zap, Heart } from 'lucide-react';
|
|
8
|
+
|
|
9
|
+
const fadeInUp = {
|
|
10
|
+
initial: { opacity: 0, y: 20 },
|
|
11
|
+
animate: { opacity: 1, y: 0 },
|
|
12
|
+
transition: { duration: 0.5 }
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default function AboutPage() {
|
|
16
|
+
return (
|
|
17
|
+
<div className="min-h-screen flex flex-col bg-white dark:bg-black">
|
|
18
|
+
<TestnetBanner />
|
|
19
|
+
<Header />
|
|
20
|
+
|
|
21
|
+
<main className="flex-1">
|
|
22
|
+
{/* Hero Section */}
|
|
23
|
+
<section className="py-24 border-b border-gray-200 dark:border-gray-800">
|
|
24
|
+
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
|
25
|
+
<motion.div
|
|
26
|
+
initial="initial"
|
|
27
|
+
animate="animate"
|
|
28
|
+
variants={fadeInUp}
|
|
29
|
+
>
|
|
30
|
+
<h1 className="text-4xl sm:text-5xl font-bold text-black dark:text-white mb-6">
|
|
31
|
+
Building the Future of
|
|
32
|
+
<br />
|
|
33
|
+
Decentralized Commerce
|
|
34
|
+
</h1>
|
|
35
|
+
<p className="text-lg text-gray-600 dark:text-gray-400 max-w-2xl mx-auto">
|
|
36
|
+
Strade is a decentralized marketplace built on the Stacks blockchain,
|
|
37
|
+
enabling secure peer-to-peer transactions without intermediaries.
|
|
38
|
+
</p>
|
|
39
|
+
</motion.div>
|
|
40
|
+
</div>
|
|
41
|
+
</section>
|
|
42
|
+
|
|
43
|
+
{/* Mission Section */}
|
|
44
|
+
<section className="py-24 border-b border-gray-200 dark:border-gray-800">
|
|
45
|
+
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
46
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-12 items-center">
|
|
47
|
+
<motion.div
|
|
48
|
+
initial={{ opacity: 0, x: -20 }}
|
|
49
|
+
whileInView={{ opacity: 1, x: 0 }}
|
|
50
|
+
viewport={{ once: true }}
|
|
51
|
+
transition={{ duration: 0.5 }}
|
|
52
|
+
>
|
|
53
|
+
<h2 className="text-3xl font-bold text-black dark:text-white mb-6">
|
|
54
|
+
Our Mission
|
|
55
|
+
</h2>
|
|
56
|
+
<p className="text-gray-600 dark:text-gray-400 mb-4">
|
|
57
|
+
We believe that commerce should be accessible, transparent, and secure
|
|
58
|
+
for everyone. Traditional marketplaces are controlled by centralized
|
|
59
|
+
entities that charge high fees, censor content, and own your data.
|
|
60
|
+
</p>
|
|
61
|
+
<p className="text-gray-600 dark:text-gray-400">
|
|
62
|
+
Strade empowers users to trade directly with each other using blockchain
|
|
63
|
+
technology, eliminating middlemen while ensuring security through smart
|
|
64
|
+
contracts and community governance.
|
|
65
|
+
</p>
|
|
66
|
+
</motion.div>
|
|
67
|
+
|
|
68
|
+
<motion.div
|
|
69
|
+
initial={{ opacity: 0, x: 20 }}
|
|
70
|
+
whileInView={{ opacity: 1, x: 0 }}
|
|
71
|
+
viewport={{ once: true }}
|
|
72
|
+
transition={{ duration: 0.5 }}
|
|
73
|
+
className="grid grid-cols-2 gap-6"
|
|
74
|
+
>
|
|
75
|
+
{[
|
|
76
|
+
{ icon: Shield, title: 'Security First', desc: 'Smart contract protection' },
|
|
77
|
+
{ icon: Target, title: 'User Focused', desc: 'Built for traders' },
|
|
78
|
+
{ icon: Zap, title: 'Fast & Efficient', desc: 'Instant settlements' },
|
|
79
|
+
{ icon: Heart, title: 'Community Driven', desc: 'Open governance' }
|
|
80
|
+
].map((item, index) => (
|
|
81
|
+
<div
|
|
82
|
+
key={index}
|
|
83
|
+
className="p-6 border border-gray-200 dark:border-gray-800 rounded-lg"
|
|
84
|
+
>
|
|
85
|
+
<item.icon className="h-8 w-8 text-black dark:text-white mb-3" />
|
|
86
|
+
<h3 className="font-semibold text-black dark:text-white mb-1">
|
|
87
|
+
{item.title}
|
|
88
|
+
</h3>
|
|
89
|
+
<p className="text-sm text-gray-600 dark:text-gray-400">
|
|
90
|
+
{item.desc}
|
|
91
|
+
</p>
|
|
92
|
+
</div>
|
|
93
|
+
))}
|
|
94
|
+
</motion.div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</section>
|
|
98
|
+
|
|
99
|
+
{/* Technology Section */}
|
|
100
|
+
<section className="py-24 border-b border-gray-200 dark:border-gray-800">
|
|
101
|
+
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
102
|
+
<motion.div
|
|
103
|
+
initial={{ opacity: 0, y: 20 }}
|
|
104
|
+
whileInView={{ opacity: 1, y: 0 }}
|
|
105
|
+
viewport={{ once: true }}
|
|
106
|
+
transition={{ duration: 0.5 }}
|
|
107
|
+
className="text-center mb-12"
|
|
108
|
+
>
|
|
109
|
+
<h2 className="text-3xl font-bold text-black dark:text-white mb-4">
|
|
110
|
+
Built on Stacks
|
|
111
|
+
</h2>
|
|
112
|
+
<p className="text-gray-600 dark:text-gray-400">
|
|
113
|
+
Leveraging Bitcoin's security with smart contract capabilities
|
|
114
|
+
</p>
|
|
115
|
+
</motion.div>
|
|
116
|
+
|
|
117
|
+
<div className="space-y-8">
|
|
118
|
+
{[
|
|
119
|
+
{
|
|
120
|
+
title: 'Bitcoin Security',
|
|
121
|
+
description: 'Stacks brings smart contracts to Bitcoin, inheriting its unmatched security and decentralization.'
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
title: 'Clarity Smart Contracts',
|
|
125
|
+
description: 'Our contracts are written in Clarity, a decidable language that prevents common vulnerabilities.'
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
title: 'Proof of Transfer',
|
|
129
|
+
description: 'Stacks uses PoX consensus to anchor to Bitcoin, providing the security of Bitcoin without its energy cost.'
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
title: 'Open Source',
|
|
133
|
+
description: 'All our smart contracts are open source and verified on-chain for complete transparency.'
|
|
134
|
+
}
|
|
135
|
+
].map((item, index) => (
|
|
136
|
+
<motion.div
|
|
137
|
+
key={index}
|
|
138
|
+
initial={{ opacity: 0, y: 20 }}
|
|
139
|
+
whileInView={{ opacity: 1, y: 0 }}
|
|
140
|
+
viewport={{ once: true }}
|
|
141
|
+
transition={{ duration: 0.5, delay: index * 0.1 }}
|
|
142
|
+
className="p-6 border border-gray-200 dark:border-gray-800 rounded-lg"
|
|
143
|
+
>
|
|
144
|
+
<h3 className="text-xl font-semibold text-black dark:text-white mb-2">
|
|
145
|
+
{item.title}
|
|
146
|
+
</h3>
|
|
147
|
+
<p className="text-gray-600 dark:text-gray-400">
|
|
148
|
+
{item.description}
|
|
149
|
+
</p>
|
|
150
|
+
</motion.div>
|
|
151
|
+
))}
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</section>
|
|
155
|
+
|
|
156
|
+
{/* Values Section */}
|
|
157
|
+
<section className="py-24">
|
|
158
|
+
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
|
159
|
+
<motion.div
|
|
160
|
+
initial={{ opacity: 0, y: 20 }}
|
|
161
|
+
whileInView={{ opacity: 1, y: 0 }}
|
|
162
|
+
viewport={{ once: true }}
|
|
163
|
+
transition={{ duration: 0.5 }}
|
|
164
|
+
>
|
|
165
|
+
<h2 className="text-3xl font-bold text-black dark:text-white mb-12">
|
|
166
|
+
Our Core Values
|
|
167
|
+
</h2>
|
|
168
|
+
|
|
169
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
|
170
|
+
{[
|
|
171
|
+
{
|
|
172
|
+
title: 'Transparency',
|
|
173
|
+
description: 'All transactions and contract logic are visible on-chain'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
title: 'Decentralization',
|
|
177
|
+
description: 'No single entity controls the marketplace'
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
title: 'Innovation',
|
|
181
|
+
description: 'Constantly improving with the latest blockchain technology'
|
|
182
|
+
}
|
|
183
|
+
].map((value, index) => (
|
|
184
|
+
<motion.div
|
|
185
|
+
key={index}
|
|
186
|
+
initial={{ opacity: 0, y: 20 }}
|
|
187
|
+
whileInView={{ opacity: 1, y: 0 }}
|
|
188
|
+
viewport={{ once: true }}
|
|
189
|
+
transition={{ duration: 0.5, delay: index * 0.1 }}
|
|
190
|
+
>
|
|
191
|
+
<h3 className="text-xl font-semibold text-black dark:text-white mb-3">
|
|
192
|
+
{value.title}
|
|
193
|
+
</h3>
|
|
194
|
+
<p className="text-gray-600 dark:text-gray-400">
|
|
195
|
+
{value.description}
|
|
196
|
+
</p>
|
|
197
|
+
</motion.div>
|
|
198
|
+
))}
|
|
199
|
+
</div>
|
|
200
|
+
</motion.div>
|
|
201
|
+
</div>
|
|
202
|
+
</section>
|
|
203
|
+
</main>
|
|
204
|
+
|
|
205
|
+
<Footer />
|
|
206
|
+
</div>
|
|
207
|
+
);
|
|
208
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
|
|
4
|
+
@custom-variant dark (&:is(.dark *));
|
|
5
|
+
|
|
6
|
+
@theme inline {
|
|
7
|
+
--color-background: var(--background);
|
|
8
|
+
--color-foreground: var(--foreground);
|
|
9
|
+
--font-sans: var(--font-geist-sans);
|
|
10
|
+
--font-mono: var(--font-geist-mono);
|
|
11
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
12
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
13
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
14
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
15
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
16
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
17
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
18
|
+
--color-sidebar: var(--sidebar);
|
|
19
|
+
--color-chart-5: var(--chart-5);
|
|
20
|
+
--color-chart-4: var(--chart-4);
|
|
21
|
+
--color-chart-3: var(--chart-3);
|
|
22
|
+
--color-chart-2: var(--chart-2);
|
|
23
|
+
--color-chart-1: var(--chart-1);
|
|
24
|
+
--color-ring: var(--ring);
|
|
25
|
+
--color-input: var(--input);
|
|
26
|
+
--color-border: var(--border);
|
|
27
|
+
--color-destructive: var(--destructive);
|
|
28
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
29
|
+
--color-accent: var(--accent);
|
|
30
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
31
|
+
--color-muted: var(--muted);
|
|
32
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
33
|
+
--color-secondary: var(--secondary);
|
|
34
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
35
|
+
--color-primary: var(--primary);
|
|
36
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
37
|
+
--color-popover: var(--popover);
|
|
38
|
+
--color-card-foreground: var(--card-foreground);
|
|
39
|
+
--color-card: var(--card);
|
|
40
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
41
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
42
|
+
--radius-lg: var(--radius);
|
|
43
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:root {
|
|
47
|
+
--radius: 0.625rem;
|
|
48
|
+
--background: oklch(1 0 0);
|
|
49
|
+
--foreground: oklch(0.129 0.042 264.695);
|
|
50
|
+
--card: oklch(1 0 0);
|
|
51
|
+
--card-foreground: oklch(0.129 0.042 264.695);
|
|
52
|
+
--popover: oklch(1 0 0);
|
|
53
|
+
--popover-foreground: oklch(0.129 0.042 264.695);
|
|
54
|
+
--primary: oklch(0.208 0.042 265.755);
|
|
55
|
+
--primary-foreground: oklch(0.984 0.003 247.858);
|
|
56
|
+
--secondary: oklch(0.968 0.007 247.896);
|
|
57
|
+
--secondary-foreground: oklch(0.208 0.042 265.755);
|
|
58
|
+
--muted: oklch(0.968 0.007 247.896);
|
|
59
|
+
--muted-foreground: oklch(0.554 0.046 257.417);
|
|
60
|
+
--accent: oklch(0.968 0.007 247.896);
|
|
61
|
+
--accent-foreground: oklch(0.208 0.042 265.755);
|
|
62
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
63
|
+
--border: oklch(0.929 0.013 255.508);
|
|
64
|
+
--input: oklch(0.929 0.013 255.508);
|
|
65
|
+
--ring: oklch(0.704 0.04 256.788);
|
|
66
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
67
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
68
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
69
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
70
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
71
|
+
--sidebar: oklch(0.984 0.003 247.858);
|
|
72
|
+
--sidebar-foreground: oklch(0.129 0.042 264.695);
|
|
73
|
+
--sidebar-primary: oklch(0.208 0.042 265.755);
|
|
74
|
+
--sidebar-primary-foreground: oklch(0.984 0.003 247.858);
|
|
75
|
+
--sidebar-accent: oklch(0.968 0.007 247.896);
|
|
76
|
+
--sidebar-accent-foreground: oklch(0.208 0.042 265.755);
|
|
77
|
+
--sidebar-border: oklch(0.929 0.013 255.508);
|
|
78
|
+
--sidebar-ring: oklch(0.704 0.04 256.788);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.dark {
|
|
82
|
+
--background: oklch(0.129 0.042 264.695);
|
|
83
|
+
--foreground: oklch(0.984 0.003 247.858);
|
|
84
|
+
--card: oklch(0.208 0.042 265.755);
|
|
85
|
+
--card-foreground: oklch(0.984 0.003 247.858);
|
|
86
|
+
--popover: oklch(0.208 0.042 265.755);
|
|
87
|
+
--popover-foreground: oklch(0.984 0.003 247.858);
|
|
88
|
+
--primary: oklch(0.929 0.013 255.508);
|
|
89
|
+
--primary-foreground: oklch(0.208 0.042 265.755);
|
|
90
|
+
--secondary: oklch(0.279 0.041 260.031);
|
|
91
|
+
--secondary-foreground: oklch(0.984 0.003 247.858);
|
|
92
|
+
--muted: oklch(0.279 0.041 260.031);
|
|
93
|
+
--muted-foreground: oklch(0.704 0.04 256.788);
|
|
94
|
+
--accent: oklch(0.279 0.041 260.031);
|
|
95
|
+
--accent-foreground: oklch(0.984 0.003 247.858);
|
|
96
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
97
|
+
--border: oklch(1 0 0 / 10%);
|
|
98
|
+
--input: oklch(1 0 0 / 15%);
|
|
99
|
+
--ring: oklch(0.551 0.027 264.364);
|
|
100
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
101
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
102
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
103
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
104
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
105
|
+
--sidebar: oklch(0.208 0.042 265.755);
|
|
106
|
+
--sidebar-foreground: oklch(0.984 0.003 247.858);
|
|
107
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
108
|
+
--sidebar-primary-foreground: oklch(0.984 0.003 247.858);
|
|
109
|
+
--sidebar-accent: oklch(0.279 0.041 260.031);
|
|
110
|
+
--sidebar-accent-foreground: oklch(0.984 0.003 247.858);
|
|
111
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
112
|
+
--sidebar-ring: oklch(0.551 0.027 264.364);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@layer base {
|
|
116
|
+
* {
|
|
117
|
+
@apply border-border outline-ring/50;
|
|
118
|
+
}
|
|
119
|
+
body {
|
|
120
|
+
@apply bg-background text-foreground;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/* mobile base */
|
|
124
|
+
/* touch-action */
|
|
125
|
+
/* safe-area */
|
|
126
|
+
/* scroll-snap */
|
|
127
|
+
/* breakpoints */
|
|
128
|
+
/* overflow-x: hidden */
|
|
129
|
+
/* touch-action: manipulation */
|