yana-web 0.1.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.
@@ -0,0 +1,228 @@
1
+ /* ============================================================
2
+ Yana AI — theme tokens
3
+ Four themes, one architecture:
4
+ dawn — Lotus Dawn: pink-gold sunrise over the lake
5
+ jade — Jade Lake: warm pearl, jade green, clear water
6
+ mist — Morning Mist: near-monochrome paper, minimal glass
7
+ silver— Glass Silver: cool silver-blue liquid glass
8
+ Glass knobs (set by Tweaks): --blur, --alpha, --reflect, --depth (0..1)
9
+ Density: --sp (0.85 compact / 1 regular / 1.18 spacious)
10
+ ============================================================ */
11
+
12
+ :root {
13
+ --font-ui: "Be Vietnam Pro", -apple-system, "Segoe UI", sans-serif;
14
+
15
+ --blur: 0.7;
16
+ --alpha: 0.6;
17
+ --reflect: 0.7;
18
+ --depth: 0.55;
19
+ --sp: 1;
20
+
21
+ --pad-card: calc(18px * var(--sp));
22
+ --gap: calc(14px * var(--sp));
23
+
24
+ --r-lg: 20px;
25
+ --r-md: 14px;
26
+ --r-sm: 9px;
27
+ }
28
+
29
+ /* ---------- Jade Lake (default) ---------- */
30
+ [data-theme="jade"] {
31
+ --bg-base: #f2f7f4;
32
+ --bg-scene:
33
+ radial-gradient(1100px 520px at 12% -8%, rgba(233, 201, 138, 0.14), transparent 60%),
34
+ radial-gradient(900px 600px at 88% 4%, rgba(232, 180, 192, 0.15), transparent 58%),
35
+ radial-gradient(1300px 800px at 50% 110%, rgba(122, 184, 168, 0.20), transparent 62%),
36
+ linear-gradient(180deg, #f6faf7 0%, #eef5f1 100%);
37
+ --surface-rgb: 255, 255, 255;
38
+ --shadow-rgb: 20, 40, 36;
39
+ --ink: #21403a;
40
+ --ink-2: #51695f;
41
+ --ink-3: #84988f;
42
+ --primary: #2f7e6e;
43
+ --primary-soft: rgba(47, 126, 110, 0.10);
44
+ --pink: #c77b92;
45
+ --pink-soft: rgba(199, 123, 146, 0.12);
46
+ --gold: #b78f3d;
47
+ --gold-soft: rgba(183, 143, 61, 0.13);
48
+ --good: #3d8b6e;
49
+ --warn: #b78f3d;
50
+ --border: rgba(31, 56, 51, 0.10);
51
+ --border-strong: rgba(31, 56, 51, 0.16);
52
+ --glass-blur-max: 24px;
53
+ }
54
+
55
+ /* ---------- Lotus Dawn ---------- */
56
+ [data-theme="dawn"] {
57
+ --bg-base: #f9f4f2;
58
+ --bg-scene:
59
+ radial-gradient(1100px 540px at 16% -10%, rgba(236, 196, 134, 0.26), transparent 60%),
60
+ radial-gradient(1000px 620px at 86% 2%, rgba(231, 168, 185, 0.28), transparent 58%),
61
+ radial-gradient(1300px 760px at 50% 112%, rgba(168, 196, 186, 0.18), transparent 64%),
62
+ linear-gradient(180deg, #faf5f3 0%, #f4ece9 100%);
63
+ --surface-rgb: 255, 253, 252;
64
+ --shadow-rgb: 54, 36, 38;
65
+ --ink: #3c2e33;
66
+ --ink-2: #6f5d62;
67
+ --ink-3: #a08e92;
68
+ --primary: #b96b80;
69
+ --primary-soft: rgba(185, 107, 128, 0.11);
70
+ --pink: #b96b80;
71
+ --pink-soft: rgba(185, 107, 128, 0.11);
72
+ --gold: #b78a3f;
73
+ --gold-soft: rgba(183, 138, 63, 0.14);
74
+ --good: #4f8b6e;
75
+ --warn: #b78a3f;
76
+ --border: rgba(60, 46, 51, 0.10);
77
+ --border-strong: rgba(60, 46, 51, 0.16);
78
+ --glass-blur-max: 24px;
79
+ }
80
+
81
+ /* ---------- Morning Mist ---------- */
82
+ [data-theme="mist"] {
83
+ --bg-base: #f7f6f3;
84
+ --bg-scene:
85
+ radial-gradient(1200px 600px at 50% -12%, rgba(214, 222, 214, 0.35), transparent 62%),
86
+ linear-gradient(180deg, #f8f7f4 0%, #f3f2ee 100%);
87
+ --surface-rgb: 255, 255, 255;
88
+ --shadow-rgb: 30, 38, 34;
89
+ --ink: #26302c;
90
+ --ink-2: #5b6661;
91
+ --ink-3: #939c96;
92
+ --primary: #4a7a6a;
93
+ --primary-soft: rgba(74, 122, 106, 0.09);
94
+ --pink: #ab7e8d;
95
+ --pink-soft: rgba(171, 126, 141, 0.10);
96
+ --gold: #a3884e;
97
+ --gold-soft: rgba(163, 136, 78, 0.11);
98
+ --good: #4a7a6a;
99
+ --warn: #a3884e;
100
+ --border: rgba(38, 48, 44, 0.09);
101
+ --border-strong: rgba(38, 48, 44, 0.15);
102
+ --glass-blur-max: 10px;
103
+ }
104
+
105
+ /* ---------- Glass Silver ---------- */
106
+ [data-theme="silver"] {
107
+ --bg-base: #eef2f6;
108
+ --bg-scene:
109
+ radial-gradient(1100px 560px at 18% -10%, rgba(168, 199, 224, 0.30), transparent 60%),
110
+ radial-gradient(1000px 620px at 85% 0%, rgba(199, 214, 229, 0.32), transparent 58%),
111
+ radial-gradient(1300px 760px at 50% 112%, rgba(122, 158, 186, 0.22), transparent 64%),
112
+ linear-gradient(180deg, #f3f6fa 0%, #e9eef4 100%);
113
+ --surface-rgb: 252, 254, 255;
114
+ --shadow-rgb: 18, 34, 46;
115
+ --ink: #1c2f3a;
116
+ --ink-2: #4c6271;
117
+ --ink-3: #8194a1;
118
+ --primary: #3a7ca5;
119
+ --primary-soft: rgba(58, 124, 165, 0.10);
120
+ --pink: #b585a4;
121
+ --pink-soft: rgba(181, 133, 164, 0.12);
122
+ --gold: #a98e4b;
123
+ --gold-soft: rgba(169, 142, 75, 0.13);
124
+ --good: #44897c;
125
+ --warn: #a98e4b;
126
+ --border: rgba(28, 43, 51, 0.11);
127
+ --border-strong: rgba(28, 43, 51, 0.18);
128
+ --glass-blur-max: 32px;
129
+ }
130
+
131
+ /* ============ base ============ */
132
+ * { box-sizing: border-box; }
133
+ html, body { margin: 0; padding: 0; height: 100%; }
134
+ body {
135
+ font-family: var(--font-ui);
136
+ color: var(--ink);
137
+ background: var(--bg-base);
138
+ -webkit-font-smoothing: antialiased;
139
+ font-size: 14px;
140
+ line-height: 1.5;
141
+ }
142
+ #root { height: 100%; }
143
+
144
+ .scene { position: fixed; inset: 0; background: var(--bg-scene); z-index: 0; }
145
+
146
+ /* Yana signature: quiet ripples on the lake surface */
147
+ .scene::after {
148
+ content: "";
149
+ position: absolute; inset: 0;
150
+ background:
151
+ repeating-radial-gradient(circle at 78% 86%, rgba(var(--surface-rgb), 0) 0 54px, rgba(var(--shadow-rgb), 0.028) 54px 56px, rgba(var(--surface-rgb), 0) 56px 120px),
152
+ repeating-radial-gradient(circle at 14% 102%, rgba(var(--surface-rgb), 0) 0 70px, rgba(var(--shadow-rgb), 0.022) 70px 72px, rgba(var(--surface-rgb), 0) 72px 150px);
153
+ -webkit-mask-image: linear-gradient(180deg, transparent 30%, black 75%);
154
+ mask-image: linear-gradient(180deg, transparent 30%, black 75%);
155
+ pointer-events: none;
156
+ }
157
+
158
+ /* ============ glass surfaces ============ */
159
+ /* Transparency slider raises see-through-ness; reflection lights the top edge;
160
+ depth scales the shadow; blur scales backdrop blur. */
161
+ .glass, .glass-strong {
162
+ border: 1px solid var(--border);
163
+ -webkit-backdrop-filter: blur(calc(var(--glass-blur-max) * var(--blur))) saturate(1.15);
164
+ backdrop-filter: blur(calc(var(--glass-blur-max) * var(--blur))) saturate(1.15);
165
+ box-shadow:
166
+ 0 1px 2px rgba(var(--shadow-rgb), calc(0.02 + var(--depth) * 0.05)),
167
+ 0 12px 36px rgba(var(--shadow-rgb), calc(0.02 + var(--depth) * 0.10)),
168
+ inset 0 1px 0 rgba(255, 255, 255, calc(var(--reflect) * 0.85));
169
+ }
170
+ .glass { background: rgba(var(--surface-rgb), calc(0.92 - var(--alpha) * 0.48)); }
171
+ .glass-strong { background: rgba(var(--surface-rgb), calc(0.97 - var(--alpha) * 0.25)); }
172
+
173
+ /* ============ shared atoms ============ */
174
+ .h-display { font-weight: 300; letter-spacing: -0.02em; }
175
+ .label-xs {
176
+ font-size: 11px; font-weight: 600; letter-spacing: 0.08em;
177
+ text-transform: uppercase; color: var(--ink-3);
178
+ }
179
+ .num-lg { font-size: 32px; font-weight: 300; letter-spacing: -0.02em; line-height: 1.1; color: var(--ink); }
180
+
181
+ .dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
182
+ .dot.on { background: var(--good); box-shadow: 0 0 0 3px color-mix(in oklab, var(--good) 18%, transparent); }
183
+ .dot.idle { background: var(--gold); box-shadow: 0 0 0 3px color-mix(in oklab, var(--gold) 16%, transparent); }
184
+ .dot.off { background: var(--ink-3); }
185
+
186
+ .chip {
187
+ display: inline-flex; align-items: center; gap: 6px;
188
+ padding: 3px 10px; border-radius: 99px;
189
+ font-size: 12px; font-weight: 500;
190
+ background: var(--primary-soft); color: var(--primary);
191
+ }
192
+ .chip.pink { background: var(--pink-soft); color: var(--pink); }
193
+ .chip.gold { background: var(--gold-soft); color: var(--gold); }
194
+ .chip.neutral { background: rgba(var(--surface-rgb), 0.6); border: 1px solid var(--border); color: var(--ink-2); }
195
+
196
+ .bar { height: 5px; border-radius: 99px; background: rgba(var(--shadow-rgb), 0.08); overflow: hidden; }
197
+ .bar > i { display: block; height: 100%; border-radius: 99px; background: var(--primary); }
198
+
199
+ button { font-family: inherit; }
200
+ ::selection { background: var(--primary-soft); }
201
+
202
+ *::-webkit-scrollbar { width: 10px; height: 10px; }
203
+ *::-webkit-scrollbar-thumb { background: rgba(var(--shadow-rgb), 0.14); border-radius: 99px; border: 3px solid transparent; background-clip: content-box; }
204
+ *::-webkit-scrollbar-track { background: transparent; }
205
+
206
+ /* ============ life beneath the surface ============ */
207
+ .pulse { animation: none; }
208
+ .mote {
209
+ position: absolute;
210
+ width: 5px; height: 5px; border-radius: 50%;
211
+ background: color-mix(in oklab, var(--primary) 60%, white);
212
+ opacity: 0; filter: blur(1.2px);
213
+ pointer-events: none;
214
+ }
215
+ @media (prefers-reduced-motion: no-preference) {
216
+ .pulse { animation: yana-pulse 3.2s ease-in-out infinite; }
217
+ .mote { animation: yana-drift var(--dur, 70s) linear infinite; animation-delay: var(--delay, 0s); }
218
+ }
219
+ @keyframes yana-pulse {
220
+ 0%, 100% { box-shadow: 0 0 0 3px color-mix(in oklab, var(--good) 18%, transparent); }
221
+ 50% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--good) 8%, transparent); }
222
+ }
223
+ @keyframes yana-drift {
224
+ 0% { transform: translate(0, 0); opacity: 0; }
225
+ 12% { opacity: var(--peak, 0.22); }
226
+ 88% { opacity: var(--peak, 0.22); }
227
+ 100% { transform: translate(var(--dx, 40px), var(--dy, -60px)); opacity: 0; }
228
+ }
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "yana-web",
3
+ "version": "0.1.0",
4
+ "description": "Yana — self-hosted AI workspace. Multi-provider chat (Claude, GPT, Gemini, Groq…), encrypted API keys, memory, missions. Run anywhere in one command.",
5
+ "main": "server.js",
6
+ "bin": {
7
+ "yana": "./bin/yana.js"
8
+ },
9
+ "type": "commonjs",
10
+ "engines": {
11
+ "node": ">=18"
12
+ },
13
+ "scripts": {
14
+ "start": "node server.js"
15
+ },
16
+ "keywords": [
17
+ "ai", "chat", "claude", "openai", "gemini", "groq", "self-hosted",
18
+ "yana", "yamtam", "multi-provider", "llm", "assistant"
19
+ ],
20
+ "author": "phamlongh230",
21
+ "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/phamlongh230-lgtm/yana-web.git"
25
+ },
26
+ "dependencies": {
27
+ "yamtam-core": "^0.1.0"
28
+ }
29
+ }