current branding
@@ -0,0 +1,70 @@
|
|||||||
|
# P2NS Brand Identity Package v1.0
|
||||||
|
|
||||||
|
**Peer-to-Peer Name System** — Decentralized, secure, and open naming infrastructure.
|
||||||
|
|
||||||
|
This package contains a complete, production-ready branding system designed for dark-first technical audiences.
|
||||||
|
|
||||||
|
## What's Included
|
||||||
|
|
||||||
|
```
|
||||||
|
P2NS_Branding_Package_v1/
|
||||||
|
├── logos/
|
||||||
|
│ ├── png/
|
||||||
|
│ │ ├── p2ns-primary-horizontal.png # Main logo with icon + wordmark + tagline
|
||||||
|
│ │ ├── p2ns-icon.png # Icon-only mark (network hub + user)
|
||||||
|
│ │ ├── p2ns-vertical-stacked.png # Vertical layout version
|
||||||
|
│ │ ├── p2ns-mono-white.png # White monochrome (for dark overlays)
|
||||||
|
│ │ ├── p2ns-mono-black.png # Black monochrome
|
||||||
|
│ │ └── p2ns-mono-indigo.png # Solid Indigo version
|
||||||
|
│ └── favicon/
|
||||||
|
│ ├── p2ns-favicon-512.png
|
||||||
|
│ ├── p2ns-favicon-256.png
|
||||||
|
│ ├── p2ns-favicon-192.png
|
||||||
|
│ └── p2ns-favicon-32.png # Simplified but recognizable
|
||||||
|
├── palette/
|
||||||
|
│ └── p2ns-color-palette.png # Full swatches with hex/RGB/usage
|
||||||
|
├── mockups/
|
||||||
|
│ ├── p2ns-app-icon-1024.png # Rounded square app icon
|
||||||
|
│ ├── p2ns-twitter-header.png
|
||||||
|
│ ├── p2ns-linkedin-banner.png
|
||||||
|
│ ├── p2ns-discord-icon.png
|
||||||
|
│ ├── p2ns-discord-banner.png
|
||||||
|
│ ├── p2ns-business-card-front.png
|
||||||
|
│ ├── p2ns-business-card-back.png
|
||||||
|
│ ├── p2ns-hero-banner.png # Website/product hero
|
||||||
|
│ ├── p2ns-email-signature.png
|
||||||
|
│ ├── p2ns-presentation-title-slide.png
|
||||||
|
│ ├── p2ns-sticker-badge.png
|
||||||
|
│ └── p2ns-dos-donts.png # Usage rules visual guide
|
||||||
|
├── guidelines/
|
||||||
|
│ └── P2NS_Brand_Guidelines.pdf # 13-page comprehensive brand book
|
||||||
|
├── assets/ # Additional raw assets if needed
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Usage
|
||||||
|
|
||||||
|
1. **Logos**: Always start with files in `logos/png/`. Use `p2ns-primary-horizontal.png` for most cases.
|
||||||
|
2. **Icon Mark**: Use `p2ns-icon.png` for app icons, favicons, and tight spaces.
|
||||||
|
3. **Colors**: Refer to `palette/p2ns-color-palette.png`. Primary Indigo `#6366F1` on dark backgrounds (`#0A0E1A` Midnight).
|
||||||
|
4. **Guidelines**: Read `P2NS_Brand_Guidelines.pdf` fully before any application. It contains usage rules, clear space, typography, and examples.
|
||||||
|
5. **Mockups**: Use `mockups/` as templates or inspiration for real implementations.
|
||||||
|
|
||||||
|
## Key Brand Rules (Summary)
|
||||||
|
|
||||||
|
- **Dark-first** — Primary communications on Midnight/Deep backgrounds.
|
||||||
|
- **No glow / effects** — Flat, sharp, crisp, technical. Zero decorative glow, neon, or soft shadows.
|
||||||
|
- **Clear space** — Minimum 1× icon height around logo.
|
||||||
|
- **Minimum size** — 120px digital / 30mm print for primary logo.
|
||||||
|
- **Contrast** — Maintain WCAG AA accessibility.
|
||||||
|
- **Monochrome** — Use provided white/black/indigo versions only when needed.
|
||||||
|
|
||||||
|
## Licensing
|
||||||
|
|
||||||
|
These assets are for official P2NS use, approved partners, and projects. Do not modify, redistribute, or use outside authorized contexts without permission.
|
||||||
|
|
||||||
|
For questions or additional assets (SVG masters, etc.), contact the P2NS brand team.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**P2NS** — Decentralized by Design.
|
||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 69 KiB |
@@ -32,7 +32,7 @@ async function serveFile(filePath, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function serveAdminFrontendAsset(urlPath, res) {
|
async function serveAdminFrontendAsset(urlPath, res) {
|
||||||
if (!/^\/(?:ui\/[\w.-]+\.js|[\w.-]+\.(?:css|js|svg|ico|png|json|webmanifest))$/.test(urlPath)) {
|
if (!/^\/(?:ui\/[\w.-]+\.js|branding\/[\w.-]+\.png|[\w.-]+\.(?:css|js|svg|ico|png|json|webmanifest))$/.test(urlPath)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,16 +90,12 @@ async function handleStaticRoutes(req, res) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method === 'GET') {
|
if (method === 'GET' && (urlPath === '/favicon.ico' || urlPath === '/apple-touch-icon.png')) {
|
||||||
const served = await serveAdminFrontendAsset(urlPath, res);
|
const faviconFile = urlPath === '/favicon.ico'
|
||||||
if (served) {
|
? pathModule.join(ADMIN_FRONTEND_DIR, 'favicon.ico')
|
||||||
return true;
|
: pathModule.join(ADMIN_FRONTEND_DIR, 'branding', 'p2ns-favicon-192.png');
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (method === 'GET' && urlPath === '/favicon.ico') {
|
|
||||||
try {
|
try {
|
||||||
await serveFile(pathModule.join(ADMIN_FRONTEND_DIR, 'favicon.svg'), res);
|
await serveFile(faviconFile, res);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
|
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
|
||||||
res.end('Not Found');
|
res.end('Not Found');
|
||||||
@@ -107,6 +103,13 @@ async function handleStaticRoutes(req, res) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (method === 'GET') {
|
||||||
|
const served = await serveAdminFrontendAsset(urlPath, res);
|
||||||
|
if (served) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
@@ -1,5 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" role="img" aria-label="P2NS">
|
|
||||||
<rect width="32" height="32" rx="6" fill="#0f1419"/>
|
|
||||||
<rect x="4" y="4" width="24" height="24" rx="4" fill="#6366f1"/>
|
|
||||||
<path fill="#f1f5f9" d="M9 21V11h3.2c2.4 0 3.9 1.2 3.9 3.1 0 1.3-.7 2.3-1.9 2.8L18 21h-2.6l-2.8-3.5H11.4V21H9zm2.4-5.6h.8c1.1 0 1.7-.5 1.7-1.4s-.6-1.3-1.7-1.3h-.8v2.7zM19.2 21V11h2.4v10h-2.4z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 416 B |
@@ -5,7 +5,11 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="theme-color" content="#0a0e1a">
|
<meta name="theme-color" content="#0a0e1a">
|
||||||
<title>P2NS Admin Panel</title>
|
<title>P2NS Admin Panel</title>
|
||||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
<link rel="icon" href="/favicon.ico" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192">
|
||||||
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||||
|
<link rel="manifest" href="/site.webmanifest">
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||||
@@ -36,7 +40,10 @@
|
|||||||
<div class="admin-shell">
|
<div class="admin-shell">
|
||||||
<aside id="admin-sidebar" class="admin-sidebar" aria-label="Main navigation">
|
<aside id="admin-sidebar" class="admin-sidebar" aria-label="Main navigation">
|
||||||
<div class="admin-sidebar-brand">
|
<div class="admin-sidebar-brand">
|
||||||
<span class="admin-sidebar-brand-title">P2NS</span>
|
<a href="/" class="admin-sidebar-brand-link" aria-label="P2NS Admin home">
|
||||||
|
<img src="/branding/p2ns-icon.png" alt="" class="admin-sidebar-brand-logo" width="28" height="28">
|
||||||
|
<span class="admin-sidebar-brand-title">P2NS</span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<nav class="admin-sidebar-nav">
|
<nav class="admin-sidebar-nav">
|
||||||
<div class="admin-nav-section">
|
<div class="admin-nav-section">
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "P2NS Admin",
|
||||||
|
"short_name": "P2NS",
|
||||||
|
"description": "P2NS network administration panel",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/favicon.ico",
|
||||||
|
"sizes": "32x32",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/branding/p2ns-favicon-192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/branding/p2ns-favicon-512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"theme_color": "#0a0e1a",
|
||||||
|
"background_color": "#0a0e1a",
|
||||||
|
"display": "standalone"
|
||||||
|
}
|
||||||
@@ -1484,6 +1484,26 @@ dialog > .dialog-notifications > * {
|
|||||||
border-bottom: 1px solid var(--admin-sidebar-border);
|
border-bottom: 1px solid var(--admin-sidebar-border);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.admin-sidebar-brand-link {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.625rem;
|
||||||
|
min-width: 0;
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-sidebar-brand-link:hover .admin-sidebar-brand-title {
|
||||||
|
color: var(--admin-sidebar-fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-sidebar-brand-logo {
|
||||||
|
width: 1.75rem;
|
||||||
|
height: 1.75rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
|
||||||
.admin-sidebar-brand-title {
|
.admin-sidebar-brand-title {
|
||||||
font-size: 0.9375rem;
|
font-size: 0.9375rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
|||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
/* P2NS brand lockup — shared plugin branding */
|
||||||
|
.brand-lockup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center {
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-logo {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
object-fit: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center .brand-lockup-logo {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-text {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
@@ -144,9 +144,36 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-content {
|
.header-content {
|
||||||
display: flex;
|
flex: 1;
|
||||||
flex-direction: column;
|
min-width: 0;
|
||||||
align-items: flex-start;
|
}
|
||||||
|
|
||||||
|
.header-brand {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 2rem minmax(0, 1fr);
|
||||||
|
column-gap: 0.75rem;
|
||||||
|
row-gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand .brand-lockup-logo {
|
||||||
|
grid-column: 1;
|
||||||
|
grid-row: 1;
|
||||||
|
align-self: start;
|
||||||
|
margin-top: 0.15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand h1 {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 1;
|
||||||
|
margin: 0;
|
||||||
|
min-width: 0;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand .subtitle {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 2;
|
||||||
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header h1 {
|
.header h1 {
|
||||||
@@ -156,7 +183,7 @@ body {
|
|||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-status {
|
.header-status {
|
||||||
@@ -1011,6 +1038,27 @@ canvas {
|
|||||||
|
|
||||||
/* Responsive */
|
/* Responsive */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
|
.header {
|
||||||
|
padding: var(--spacing-md) var(--spacing-lg);
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header h1 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content {
|
||||||
|
flex: 1 1 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-status {
|
||||||
|
flex: 1 1 100%;
|
||||||
|
margin-top: var(--spacing-sm);
|
||||||
|
width: 100%;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
.grid-cols-1 {
|
.grid-cols-1 {
|
||||||
grid-template-columns: repeat(1, minmax(0, 1fr));
|
grid-template-columns: repeat(1, minmax(0, 1fr));
|
||||||
}
|
}
|
||||||
|
|||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -3,9 +3,14 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="theme-color" content="#000000">
|
<meta name="theme-color" content="#0a0e1a">
|
||||||
<title>Domain Consensus - P2NS</title>
|
<title>Domain Consensus - P2NS</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192">
|
||||||
|
<link rel="apple-touch-icon" href="/branding/p2ns-favicon-192.png">
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
|
<link rel="stylesheet" href="/css/branding.css">
|
||||||
<link rel="stylesheet" href="/css/tailwind.css">
|
<link rel="stylesheet" href="/css/tailwind.css">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
<link rel="stylesheet" href="https://global.profile/css/profile-modal.css">
|
<link rel="stylesheet" href="https://global.profile/css/profile-modal.css">
|
||||||
@@ -15,7 +20,8 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<header class="header">
|
<header class="header">
|
||||||
<div class="header-content">
|
<div class="header-content header-brand">
|
||||||
|
<img src="/branding/p2ns-icon.png" alt="" class="brand-lockup-logo" width="32" height="32">
|
||||||
<h1>Domain Consensus</h1>
|
<h1>Domain Consensus</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-status">
|
<div class="header-status">
|
||||||
|
|||||||
@@ -4,24 +4,23 @@
|
|||||||
"description": "Advanced interface for viewing and analyzing consensus within the P2NS network",
|
"description": "Advanced interface for viewing and analyzing consensus within the P2NS network",
|
||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#000000",
|
"background_color": "#0a0e1a",
|
||||||
"theme_color": "#000000",
|
"theme_color": "#0a0e1a",
|
||||||
"orientation": "any",
|
"orientation": "any",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/icon.svg",
|
"src": "/favicon.ico",
|
||||||
"sizes": "any",
|
"sizes": "32x32",
|
||||||
"type": "image/svg+xml",
|
"type": "image/png"
|
||||||
"purpose": "any"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-192.png",
|
"src": "/branding/p2ns-favicon-192.png",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-512.png",
|
"src": "/branding/p2ns-favicon-512.png",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
@@ -30,4 +29,3 @@
|
|||||||
"categories": ["utilities", "developer"],
|
"categories": ["utilities", "developer"],
|
||||||
"lang": "en"
|
"lang": "en"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
/* P2NS brand lockup — shared plugin branding */
|
||||||
|
.brand-lockup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center {
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-logo {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
object-fit: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center .brand-lockup-logo {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-text {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -3,16 +3,24 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="theme-color" content="#000000">
|
<meta name="theme-color" content="#0a0e1a">
|
||||||
<title>Example Plugin - P2NS</title>
|
<title>Example Plugin - P2NS</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192">
|
||||||
|
<link rel="apple-touch-icon" href="/branding/p2ns-favicon-192.png">
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
|
<link rel="stylesheet" href="/css/branding.css">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<header>
|
<header class="brand-lockup brand-lockup--center">
|
||||||
<h1>Example Plugin</h1>
|
<img src="/branding/p2ns-icon.png" alt="" class="brand-lockup-logo" width="40" height="40">
|
||||||
<p class="subtitle">A comprehensive template plugin demonstrating admin settings and actions</p>
|
<div class="brand-lockup-text">
|
||||||
|
<h1>Example Plugin</h1>
|
||||||
|
<p class="subtitle">A comprehensive template plugin demonstrating admin settings and actions</p>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
|
|||||||
@@ -4,24 +4,23 @@
|
|||||||
"description": "A bare bones template plugin for P2NS - use this as a starting point for new plugins",
|
"description": "A bare bones template plugin for P2NS - use this as a starting point for new plugins",
|
||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#000000",
|
"background_color": "#0a0e1a",
|
||||||
"theme_color": "#000000",
|
"theme_color": "#0a0e1a",
|
||||||
"orientation": "any",
|
"orientation": "any",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/icon.svg",
|
"src": "/favicon.ico",
|
||||||
"sizes": "any",
|
"sizes": "32x32",
|
||||||
"type": "image/svg+xml",
|
"type": "image/png"
|
||||||
"purpose": "any"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-192.png",
|
"src": "/branding/p2ns-favicon-192.png",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-512.png",
|
"src": "/branding/p2ns-favicon-512.png",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
@@ -30,4 +29,3 @@
|
|||||||
"categories": ["utilities", "developer"],
|
"categories": ["utilities", "developer"],
|
||||||
"lang": "en"
|
"lang": "en"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
/* P2NS brand lockup — shared plugin branding */
|
||||||
|
.brand-lockup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center {
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-logo {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
object-fit: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center .brand-lockup-logo {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-text {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -3,14 +3,26 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#0a0e1a">
|
||||||
<title>File Drop - 24h Temporary File Sharing</title>
|
<title>File Drop - 24h Temporary File Sharing</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192">
|
||||||
|
<link rel="apple-touch-icon" href="/branding/p2ns-favicon-192.png">
|
||||||
|
<link rel="manifest" href="/manifest.json">
|
||||||
|
<link rel="stylesheet" href="/css/branding.css">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<header>
|
<header>
|
||||||
<h1>📦 File Drop</h1>
|
<div class="brand-lockup brand-lockup--center">
|
||||||
<p class="tagline">Drop a file, get a link. Gone in 24 hours.</p>
|
<img src="/branding/p2ns-icon.png" alt="" class="brand-lockup-logo" width="40" height="40">
|
||||||
|
<div class="brand-lockup-text">
|
||||||
|
<h1>File Drop</h1>
|
||||||
|
<p class="tagline">Drop a file, get a link. Gone in 24 hours.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "File Drop",
|
||||||
|
"short_name": "File Drop",
|
||||||
|
"description": "Drop a file, get a link. Gone in 24 hours.",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#0a0e1a",
|
||||||
|
"theme_color": "#0a0e1a",
|
||||||
|
"orientation": "any",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/favicon.ico",
|
||||||
|
"sizes": "32x32",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/branding/p2ns-favicon-192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/branding/p2ns-favicon-512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"categories": ["utilities", "productivity"],
|
||||||
|
"lang": "en"
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
/* P2NS brand lockup — shared plugin branding */
|
||||||
|
.brand-lockup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center {
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-logo {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
object-fit: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center .brand-lockup-logo {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-text {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
@@ -129,9 +129,36 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-content {
|
.header-content {
|
||||||
display: flex;
|
flex: 1;
|
||||||
flex-direction: column;
|
min-width: 0;
|
||||||
align-items: flex-start;
|
}
|
||||||
|
|
||||||
|
.header-brand {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 2rem minmax(0, 1fr);
|
||||||
|
column-gap: 0.75rem;
|
||||||
|
row-gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand .brand-lockup-logo {
|
||||||
|
grid-column: 1;
|
||||||
|
grid-row: 1;
|
||||||
|
align-self: start;
|
||||||
|
margin-top: 0.15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand h1 {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 1;
|
||||||
|
margin: 0;
|
||||||
|
min-width: 0;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand .subtitle {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 2;
|
||||||
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header h1 {
|
.header h1 {
|
||||||
@@ -141,7 +168,7 @@ body {
|
|||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtitle {
|
.subtitle {
|
||||||
@@ -933,11 +960,12 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-content {
|
.header-content {
|
||||||
flex: 1;
|
flex: 1 1 100%;
|
||||||
min-width: 0;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-status {
|
.header-status {
|
||||||
|
flex: 1 1 100%;
|
||||||
margin-top: var(--spacing-sm);
|
margin-top: var(--spacing-sm);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
|||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -3,16 +3,22 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="theme-color" content="#000000">
|
<meta name="theme-color" content="#0a0e1a">
|
||||||
<title>Global Profile - P2NS</title>
|
<title>Global Profile - P2NS</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192">
|
||||||
|
<link rel="apple-touch-icon" href="/branding/p2ns-favicon-192.png">
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
|
<link rel="stylesheet" href="/css/branding.css">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
<script src="/auth-utils.js"></script>
|
<script src="/auth-utils.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<header class="header">
|
<header class="header">
|
||||||
<div class="header-content">
|
<div class="header-content header-brand">
|
||||||
|
<img src="/branding/p2ns-icon.png" alt="" class="brand-lockup-logo" width="32" height="32">
|
||||||
<h1>Global Profile</h1>
|
<h1>Global Profile</h1>
|
||||||
<p class="subtitle">Manage your profile across the P2NS network</p>
|
<p class="subtitle">Manage your profile across the P2NS network</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,24 +4,23 @@
|
|||||||
"description": "Universal user identity system for all P2NS plugins with P2P profile replication",
|
"description": "Universal user identity system for all P2NS plugins with P2P profile replication",
|
||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#000000",
|
"background_color": "#0a0e1a",
|
||||||
"theme_color": "#000000",
|
"theme_color": "#0a0e1a",
|
||||||
"orientation": "any",
|
"orientation": "any",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/icon.svg",
|
"src": "/favicon.ico",
|
||||||
"sizes": "any",
|
"sizes": "32x32",
|
||||||
"type": "image/svg+xml",
|
"type": "image/png"
|
||||||
"purpose": "any"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-192.png",
|
"src": "/branding/p2ns-favicon-192.png",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-512.png",
|
"src": "/branding/p2ns-favicon-512.png",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
@@ -30,4 +29,3 @@
|
|||||||
"categories": ["social", "productivity"],
|
"categories": ["social", "productivity"],
|
||||||
"lang": "en"
|
"lang": "en"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -529,13 +529,6 @@ async function handler(req, res) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle favicon requests - browsers automatically request /favicon.ico
|
|
||||||
// We don't have a favicon, so return 404
|
|
||||||
if (path === 'favicon.ico') {
|
|
||||||
sdk.log.debug('peer.directory', 'Favicon requested, returning 404');
|
|
||||||
return sdk.router.notFound(res, 'Favicon Not Found');
|
|
||||||
}
|
|
||||||
|
|
||||||
// For all other paths, return false to allow static file serving
|
// For all other paths, return false to allow static file serving
|
||||||
// This means requests for CSS, JS, images, etc. will be served from www/ directory
|
// This means requests for CSS, JS, images, etc. will be served from www/ directory
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
/* P2NS brand lockup — shared plugin branding */
|
||||||
|
.brand-lockup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center {
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-logo {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
object-fit: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center .brand-lockup-logo {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-text {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
@@ -103,8 +103,8 @@ body {
|
|||||||
|
|
||||||
/* Header */
|
/* Header */
|
||||||
.header {
|
.header {
|
||||||
display: flex;
|
display: grid;
|
||||||
justify-content: space-between;
|
grid-template-columns: 1fr auto 1fr;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: var(--spacing-lg) 0;
|
padding: var(--spacing-lg) 0;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
@@ -118,15 +118,18 @@ body {
|
|||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
text-align: center;
|
|
||||||
position: absolute;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-content {
|
.header-content {
|
||||||
flex: 1;
|
grid-column: 2;
|
||||||
|
justify-self: center;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content.brand-lockup h1 {
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-status {
|
.header-status {
|
||||||
@@ -198,7 +201,8 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-actions {
|
.header-actions {
|
||||||
flex: 1;
|
grid-column: 3;
|
||||||
|
justify-self: end;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -696,12 +700,31 @@ tbody tr.highlight {
|
|||||||
/* Responsive */
|
/* Responsive */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.header {
|
.header {
|
||||||
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: var(--spacing-md);
|
gap: var(--spacing-md);
|
||||||
}
|
}
|
||||||
|
|
||||||
.header h1 {
|
.header-content {
|
||||||
|
grid-column: auto;
|
||||||
|
justify-self: auto;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content.brand-lockup {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-actions {
|
||||||
|
grid-column: auto;
|
||||||
|
justify-self: auto;
|
||||||
|
width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content.brand-lockup h1 {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
|
white-space: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
|
|||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -3,9 +3,14 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="theme-color" content="#000000">
|
<meta name="theme-color" content="#0a0e1a">
|
||||||
<title>Peer Directory</title>
|
<title>Peer Directory</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192">
|
||||||
|
<link rel="apple-touch-icon" href="/branding/p2ns-favicon-192.png">
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
|
<link rel="stylesheet" href="/css/branding.css">
|
||||||
<link rel="stylesheet" href="/css/tailwind.css">
|
<link rel="stylesheet" href="/css/tailwind.css">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
</head>
|
</head>
|
||||||
@@ -13,7 +18,8 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<header class="header">
|
<header class="header">
|
||||||
<div class="header-content">
|
<div class="header-content brand-lockup">
|
||||||
|
<img src="/branding/p2ns-icon.png" alt="" class="brand-lockup-logo" width="32" height="32">
|
||||||
<h1>P2NS Directory</h1>
|
<h1>P2NS Directory</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-actions">
|
<div class="header-actions">
|
||||||
|
|||||||
@@ -4,24 +4,23 @@
|
|||||||
"description": "P2NS peer directory browser - Browse and search P2NS domains",
|
"description": "P2NS peer directory browser - Browse and search P2NS domains",
|
||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#000000",
|
"background_color": "#0a0e1a",
|
||||||
"theme_color": "#000000",
|
"theme_color": "#0a0e1a",
|
||||||
"orientation": "any",
|
"orientation": "any",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/icon.svg",
|
"src": "/favicon.ico",
|
||||||
"sizes": "any",
|
"sizes": "32x32",
|
||||||
"type": "image/svg+xml",
|
"type": "image/png"
|
||||||
"purpose": "any"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-192.png",
|
"src": "/branding/p2ns-favicon-192.png",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/icon-512.png",
|
"src": "/branding/p2ns-favicon-512.png",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any maskable"
|
"purpose": "any maskable"
|
||||||
@@ -30,4 +29,3 @@
|
|||||||
"categories": ["utilities", "productivity"],
|
"categories": ["utilities", "productivity"],
|
||||||
"lang": "en"
|
"lang": "en"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,10 @@ function wrapPasteViewDocument({ pasteId, title, chips, toolbar, banner, bodyHtm
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#09090b" />
|
||||||
<title>${escapeHtmlAttr(title)}</title>
|
<title>${escapeHtmlAttr(title)}</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32" />
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32" />
|
||||||
<link rel="stylesheet" href="/api/vendor/highlight-dark.css" />
|
<link rel="stylesheet" href="/api/vendor/highlight-dark.css" />
|
||||||
<style>${PASTE_VIEW_STYLES}</style>
|
<style>${PASTE_VIEW_STYLES}</style>
|
||||||
${extraHead}
|
${extraHead}
|
||||||
@@ -1040,7 +1043,10 @@ function renderPasteErrorPage(reason = 'Paste not found') {
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#09090b" />
|
||||||
<title>Paste unavailable - peer.paste</title>
|
<title>Paste unavailable - peer.paste</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32" />
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32" />
|
||||||
<style>${PASTE_VIEW_STYLES}</style>
|
<style>${PASTE_VIEW_STYLES}</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
/* P2NS brand lockup — shared plugin branding */
|
||||||
|
.brand-lockup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center {
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-logo {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
object-fit: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center .brand-lockup-logo {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-text {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -3,14 +3,22 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#09090b" />
|
||||||
<title>peer.paste</title>
|
<title>peer.paste</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32" />
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32" />
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192" />
|
||||||
|
<link rel="apple-touch-icon" href="/branding/p2ns-favicon-192.png" />
|
||||||
|
<link rel="manifest" href="/manifest.json" />
|
||||||
|
<link rel="stylesheet" href="/css/branding.css" />
|
||||||
<link rel="stylesheet" href="/styles.css" />
|
<link rel="stylesheet" href="/styles.css" />
|
||||||
<link rel="stylesheet" href="/api/vendor/highlight-dark.css" />
|
<link rel="stylesheet" href="/api/vendor/highlight-dark.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="app-shell">
|
<div class="app-shell">
|
||||||
<header class="app-header">
|
<header class="app-header">
|
||||||
<div class="brand">
|
<div class="brand header-brand">
|
||||||
|
<img src="/branding/p2ns-icon.png" alt="" class="brand-lockup-logo" width="24" height="24" />
|
||||||
<h1>peer.paste</h1>
|
<h1>peer.paste</h1>
|
||||||
<p>Share temporary text with one clean link.</p>
|
<p>Share temporary text with one clean link.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "peer.paste",
|
||||||
|
"short_name": "peer.paste",
|
||||||
|
"description": "Share temporary text with one clean link",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#09090b",
|
||||||
|
"theme_color": "#09090b",
|
||||||
|
"orientation": "any",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/favicon.ico",
|
||||||
|
"sizes": "32x32",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/branding/p2ns-favicon-192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/branding/p2ns-favicon-512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"categories": ["utilities", "productivity"],
|
||||||
|
"lang": "en"
|
||||||
|
}
|
||||||
@@ -88,15 +88,37 @@ body::before {
|
|||||||
min-height: var(--header-h);
|
min-height: var(--header-h);
|
||||||
}
|
}
|
||||||
|
|
||||||
.brand h1 {
|
.brand.header-brand {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1.5rem minmax(0, 1fr);
|
||||||
|
column-gap: 0.5rem;
|
||||||
|
row-gap: 0.1rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand.header-brand .brand-lockup-logo {
|
||||||
|
grid-column: 1;
|
||||||
|
grid-row: 1;
|
||||||
|
align-self: start;
|
||||||
|
margin-top: 0.05rem;
|
||||||
|
width: 1.5rem;
|
||||||
|
height: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand.header-brand h1 {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 1;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 1.05rem;
|
font-size: 1.05rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: -0.03em;
|
letter-spacing: -0.03em;
|
||||||
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.brand p {
|
.brand.header-brand p {
|
||||||
margin: 0.1rem 0 0;
|
grid-column: 2;
|
||||||
|
grid-row: 2;
|
||||||
|
margin: 0;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
color: var(--text-tertiary);
|
color: var(--text-tertiary);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -276,13 +276,6 @@ async function handler(req, res) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle favicon - return 204 No Content
|
|
||||||
if (path === 'favicon.ico') {
|
|
||||||
res.writeHead(204);
|
|
||||||
res.end();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// GET /api/system - Get complete system state
|
// GET /api/system - Get complete system state
|
||||||
if (path === 'api/system' && method === 'GET') {
|
if (path === 'api/system' && method === 'GET') {
|
||||||
const systemState = await getSystemState();
|
const systemState = await getSystemState();
|
||||||
|
|||||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
/* P2NS brand lockup — shared plugin branding */
|
||||||
|
.brand-lockup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center {
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-logo {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
object-fit: contain;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup--center .brand-lockup-logo {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-lockup-text {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
@@ -131,9 +131,36 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-content {
|
.header-content {
|
||||||
display: flex;
|
flex: 1;
|
||||||
flex-direction: column;
|
min-width: 0;
|
||||||
align-items: flex-start;
|
}
|
||||||
|
|
||||||
|
.header-brand {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 2rem minmax(0, 1fr);
|
||||||
|
column-gap: 0.75rem;
|
||||||
|
row-gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand .brand-lockup-logo {
|
||||||
|
grid-column: 1;
|
||||||
|
grid-row: 1;
|
||||||
|
align-self: start;
|
||||||
|
margin-top: 0.15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand h1 {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 1;
|
||||||
|
margin: 0;
|
||||||
|
min-width: 0;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-brand .subtitle {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 2;
|
||||||
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header h1 {
|
.header h1 {
|
||||||
@@ -143,7 +170,7 @@ body {
|
|||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtitle {
|
.subtitle {
|
||||||
@@ -967,11 +994,12 @@ canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-content {
|
.header-content {
|
||||||
flex: 1;
|
flex: 1 1 100%;
|
||||||
min-width: 0;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-status {
|
.header-status {
|
||||||
|
flex: 1 1 100%;
|
||||||
margin-top: var(--spacing-sm);
|
margin-top: var(--spacing-sm);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
|||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -3,9 +3,14 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="theme-color" content="#000000">
|
<meta name="theme-color" content="#0a0e1a">
|
||||||
<title>P2NS Network Visualization</title>
|
<title>P2NS Network Visualization</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-32.png" type="image/png" sizes="32x32">
|
||||||
|
<link rel="icon" href="/branding/p2ns-favicon-192.png" type="image/png" sizes="192x192">
|
||||||
|
<link rel="apple-touch-icon" href="/branding/p2ns-favicon-192.png">
|
||||||
<link rel="manifest" href="/manifest.json">
|
<link rel="manifest" href="/manifest.json">
|
||||||
|
<link rel="stylesheet" href="/css/branding.css">
|
||||||
<link rel="stylesheet" href="/css/tailwind.css">
|
<link rel="stylesheet" href="/css/tailwind.css">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
<link rel="stylesheet" href="https://global.profile/css/profile-modal.css">
|
<link rel="stylesheet" href="https://global.profile/css/profile-modal.css">
|
||||||
@@ -18,7 +23,8 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<header class="header">
|
<header class="header">
|
||||||
<div class="header-content">
|
<div class="header-content header-brand">
|
||||||
|
<img src="/branding/p2ns-icon.png" alt="" class="brand-lockup-logo" width="32" height="32">
|
||||||
<h1>P2NS Network Visualization</h1>
|
<h1>P2NS Network Visualization</h1>
|
||||||
<p class="subtitle">Visualize and explore the P2NS network</p>
|
<p class="subtitle">Visualize and explore the P2NS network</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||