From 265b1202adbbe20c7e1db1cbced88a0c50d2d28b Mon Sep 17 00:00:00 2001 From: hexdev Date: Mon, 10 Aug 2026 12:01:03 +0700 Subject: [PATCH] v0.0.01b --- .design/DESIGN.md | 69 + .design/brand.json | 106 + .../fonts/cormorant-garamond-300-italic.woff2 | Bin 0 -> 11556 bytes .design/fonts/cormorant-garamond-300.woff2 | Bin 0 -> 11264 bytes .../fonts/cormorant-garamond-400-italic.woff2 | Bin 0 -> 11556 bytes .design/fonts/cormorant-garamond-400.woff2 | Bin 0 -> 11264 bytes .design/fonts/cormorant-garamond-600.woff2 | Bin 0 -> 11264 bytes .design/fonts/fonts.css | 48 + .design/fonts/manifest.json | 65 + .design/fonts/tenor-sans-400.woff2 | Bin 0 -> 6832 bytes .design/logos/favicon-0.ico | Bin 0 -> 4286 bytes .design/prefetch/material.md | 44 + .design/prefetch/page.html | 94 + .design/prefetch/styles.css | 531 ++ .design/system/BRAND-SYSTEM.md | 53 + .design/system/artifacts/deck.html | 782 ++ .design/system/artifacts/email.html | 439 + .design/system/artifacts/form.html | 442 + .design/system/artifacts/landing.html | 822 ++ .design/system/artifacts/newsletter.html | 427 + .design/system/artifacts/poster.html | 434 + .design/system/index.html | 3769 ++++++++ .design/system/kit.dark.html | 587 ++ .design/system/kit.html | 587 ++ .../system/scripts/apply-design-tokens.mjs | 17 + .design/system/seed.json | 22 + .design/system/theme.json | 24 + .design/system/tokens.compact.json | 251 + .design/system/tokens.dark.json | 251 + .design/system/tokens.default.json | 251 + .design/system/variables.css | 441 + .design/system/variables.dark.css | 220 + .gitignore | 7 + .info/ToV.md | 18 + .info/index.html | 366 + .info/openapi.json | 1 + .prettierrc.json | 9 + .ref/account.html | 921 ++ .ref/calculator.html | 1212 +++ .ref/landing.html | 467 + .ref/login.html | 561 ++ AGENTS.md | 423 + eslint.config.js | 27 + index.html | 19 + package-lock.json | 7763 +++++++++++++++++ package.json | 43 + public/favicon.ico | Bin 0 -> 4286 bytes src/App.tsx | 44 + src/api/client.test.ts | 146 + src/api/client.ts | 184 + src/components/AddonList.tsx | 43 + src/components/Breakdown.tsx | 59 + src/components/Cursor.tsx | 74 + src/components/DeviceCard.tsx | 76 + src/components/DeviceSlider.tsx | 165 + src/components/DurationSelect.tsx | 36 + src/components/Emblem.tsx | 16 + src/components/Logo.tsx | 9 + src/components/Modal.tsx | 77 + src/components/Reveal.tsx | 43 + src/components/Shell.tsx | 16 + src/components/Skeleton.tsx | 19 + src/components/StatStrip.tsx | 94 + src/components/Toast.tsx | 17 + src/components/TopBar.tsx | 38 + src/hooks/useAuth.ts | 25 + src/hooks/useDevices.ts | 54 + src/hooks/useLocalStorage.ts | 39 + src/hooks/usePlans.ts | 37 + src/lib/format.test.ts | 109 + src/lib/format.ts | 103 + src/lib/planConfig.test.ts | 48 + src/lib/planConfig.ts | 80 + src/lib/redirect.ts | 3 + src/main.tsx | 12 + src/pages/AccountPage.test.tsx | 150 + src/pages/AccountPage.tsx | 215 + src/pages/Landing.test.tsx | 24 + src/pages/Landing.tsx | 153 + src/pages/LoginPage.test.tsx | 99 + src/pages/LoginPage.tsx | 278 + src/pages/PlanPage.test.tsx | 133 + src/pages/PlanPage.tsx | 229 + src/store/useStore.ts | 106 + src/store/useToast.ts | 24 + src/styles/base.css | 93 + src/styles/components.css | 1177 +++ src/styles/pages.css | 535 ++ src/styles/tokens.css | 79 + src/test/setup.ts | 8 + src/types.ts | 78 + tsconfig.json | 34 + tsconfig.node.tsbuildinfo | 1 + tsconfig.tsbuildinfo | 1 + vite.config.ts | 22 + 95 files changed, 27718 insertions(+) create mode 100644 .design/DESIGN.md create mode 100644 .design/brand.json create mode 100644 .design/fonts/cormorant-garamond-300-italic.woff2 create mode 100644 .design/fonts/cormorant-garamond-300.woff2 create mode 100644 .design/fonts/cormorant-garamond-400-italic.woff2 create mode 100644 .design/fonts/cormorant-garamond-400.woff2 create mode 100644 .design/fonts/cormorant-garamond-600.woff2 create mode 100644 .design/fonts/fonts.css create mode 100644 .design/fonts/manifest.json create mode 100644 .design/fonts/tenor-sans-400.woff2 create mode 100644 .design/logos/favicon-0.ico create mode 100644 .design/prefetch/material.md create mode 100644 .design/prefetch/page.html create mode 100644 .design/prefetch/styles.css create mode 100644 .design/system/BRAND-SYSTEM.md create mode 100644 .design/system/artifacts/deck.html create mode 100644 .design/system/artifacts/email.html create mode 100644 .design/system/artifacts/form.html create mode 100644 .design/system/artifacts/landing.html create mode 100644 .design/system/artifacts/newsletter.html create mode 100644 .design/system/artifacts/poster.html create mode 100644 .design/system/index.html create mode 100644 .design/system/kit.dark.html create mode 100644 .design/system/kit.html create mode 100644 .design/system/scripts/apply-design-tokens.mjs create mode 100644 .design/system/seed.json create mode 100644 .design/system/theme.json create mode 100644 .design/system/tokens.compact.json create mode 100644 .design/system/tokens.dark.json create mode 100644 .design/system/tokens.default.json create mode 100644 .design/system/variables.css create mode 100644 .design/system/variables.dark.css create mode 100644 .gitignore create mode 100644 .info/ToV.md create mode 100644 .info/index.html create mode 100644 .info/openapi.json create mode 100644 .prettierrc.json create mode 100644 .ref/account.html create mode 100644 .ref/calculator.html create mode 100644 .ref/landing.html create mode 100644 .ref/login.html create mode 100644 AGENTS.md create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 src/App.tsx create mode 100644 src/api/client.test.ts create mode 100644 src/api/client.ts create mode 100644 src/components/AddonList.tsx create mode 100644 src/components/Breakdown.tsx create mode 100644 src/components/Cursor.tsx create mode 100644 src/components/DeviceCard.tsx create mode 100644 src/components/DeviceSlider.tsx create mode 100644 src/components/DurationSelect.tsx create mode 100644 src/components/Emblem.tsx create mode 100644 src/components/Logo.tsx create mode 100644 src/components/Modal.tsx create mode 100644 src/components/Reveal.tsx create mode 100644 src/components/Shell.tsx create mode 100644 src/components/Skeleton.tsx create mode 100644 src/components/StatStrip.tsx create mode 100644 src/components/Toast.tsx create mode 100644 src/components/TopBar.tsx create mode 100644 src/hooks/useAuth.ts create mode 100644 src/hooks/useDevices.ts create mode 100644 src/hooks/useLocalStorage.ts create mode 100644 src/hooks/usePlans.ts create mode 100644 src/lib/format.test.ts create mode 100644 src/lib/format.ts create mode 100644 src/lib/planConfig.test.ts create mode 100644 src/lib/planConfig.ts create mode 100644 src/lib/redirect.ts create mode 100644 src/main.tsx create mode 100644 src/pages/AccountPage.test.tsx create mode 100644 src/pages/AccountPage.tsx create mode 100644 src/pages/Landing.test.tsx create mode 100644 src/pages/Landing.tsx create mode 100644 src/pages/LoginPage.test.tsx create mode 100644 src/pages/LoginPage.tsx create mode 100644 src/pages/PlanPage.test.tsx create mode 100644 src/pages/PlanPage.tsx create mode 100644 src/store/useStore.ts create mode 100644 src/store/useToast.ts create mode 100644 src/styles/base.css create mode 100644 src/styles/components.css create mode 100644 src/styles/pages.css create mode 100644 src/styles/tokens.css create mode 100644 src/test/setup.ts create mode 100644 src/types.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.tsbuildinfo create mode 100644 tsconfig.tsbuildinfo create mode 100644 vite.config.ts diff --git a/.design/DESIGN.md b/.design/DESIGN.md new file mode 100644 index 0000000..8b1131e --- /dev/null +++ b/.design/DESIGN.md @@ -0,0 +1,69 @@ +--- +name: "Malenia" +category: Brands +surface: web +colors: + cream: "#faf7f2" + warm-white: "#f5f0e8" + ink: "#1a1610" + ink-soft: "#3d3428" + gold: "#c9a84c" +--- + +# Malenia + +> Category: Brands + +> Surface: web + +*Свобода. Практика. Простота.* + +A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language. + +## Color Palette + +| Role | Name | Hex | Usage | +| --- | --- | --- | --- | +| background | Cream | `#faf7f2` | Main page background | +| surface | Warm White | `#f5f0e8` | Secondary surfaces | +| foreground | Ink | `#1a1610` | Primary text and primary buttons | +| muted | Ink Soft | `#3d3428` | Secondary text | +| accent | Gold | `#c9a84c` | Highlights, emblems, and key accents | + +## Typography +- **Display:** Cormorant Garamond — weights 400, 700 — fallbacks: serif +- **Body:** Tenor Sans — weights 400, 700 — fallbacks: sans-serif + +## Voice & Tone + +- **Adjectives:** Sophisticated, Quiet, Essential, Free +- **Tone:** Restrained, archival, sophisticated, and minimal. + +### Messaging pillars +- Network freedom +- Practical simplicity +- Aesthetic restraint + +### Vocabulary +- **Use:** (none yet) +- **Avoid:** (none yet) + +## Imagery + +- **Style:** Geometric, symbolic, and minimalist with a focus on symmetry and gold-on-cream palettes. +- **Subjects:** Diamonds, Rings, Symmetrical emblems +- **Treatment:** Fine-line vector art, subtle noise textures, and centered compositions. +- **Avoid:** (none yet) + +## Layout + +- **Radius:** 8px +- **Border weight:** 1px +- **Spacing:** 8px baseline grid + +### Posture rules +- Extreme whitespace and centered alignment +- Strict horizontal rules for structural division +- Custom cursor interactions (dot and ring) +- Subtle grain/noise overlay for organic feel +- Fade-up animations for sequential content reveal diff --git a/.design/brand.json b/.design/brand.json new file mode 100644 index 0000000..33f19f6 --- /dev/null +++ b/.design/brand.json @@ -0,0 +1,106 @@ +{ + "name": "Malenia", + "tagline": "Свобода. Практика. Простота.", + "description": "A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.", + "sourceUrl": "https://malenia.space/", + "logo": { + "primary": "https://malenia.space/favicon.ico", + "alternates": [], + "notes": "Logotype uses Cormorant Garamond with high letter-spacing (0.35em), uppercase, and a gold accent on the 'e'." + }, + "colors": [ + { + "role": "background", + "hex": "#faf7f2", + "oklch": "", + "name": "Cream", + "usage": "Main page background" + }, + { + "role": "surface", + "hex": "#f5f0e8", + "oklch": "", + "name": "Warm White", + "usage": "Secondary surfaces" + }, + { + "role": "foreground", + "hex": "#1a1610", + "oklch": "", + "name": "Ink", + "usage": "Primary text and primary buttons" + }, + { + "role": "muted", + "hex": "#3d3428", + "oklch": "", + "name": "Ink Soft", + "usage": "Secondary text" + }, + { + "role": "accent", + "hex": "#c9a84c", + "oklch": "", + "name": "Gold", + "usage": "Highlights, emblems, and key accents" + } + ], + "typography": { + "display": { + "family": "Cormorant Garamond", + "fallbacks": [ + "serif" + ], + "weights": [], + "googleFontsUrl": "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;1,300;1,400&display=swap" + }, + "body": { + "family": "Tenor Sans", + "fallbacks": [ + "sans-serif" + ], + "weights": [], + "googleFontsUrl": "https://fonts.googleapis.com/css2?family=Tenor+Sans&display=swap" + } + }, + "voice": { + "adjectives": [ + "Sophisticated", + "Quiet", + "Essential", + "Free" + ], + "tone": "Restrained, archival, sophisticated, and minimal.", + "messagingPillars": [ + "Network freedom", + "Practical simplicity", + "Aesthetic restraint" + ], + "vocabulary": { + "use": [], + "avoid": [] + } + }, + "imagery": { + "style": "Geometric, symbolic, and minimalist with a focus on symmetry and gold-on-cream palettes.", + "subjects": [ + "Diamonds", + "Rings", + "Symmetrical emblems" + ], + "treatment": "Fine-line vector art, subtle noise textures, and centered compositions.", + "avoid": [] + }, + "layout": { + "radius": "8px", + "borderWeight": "1px", + "spacing": "8px baseline grid", + "postureRules": [ + "Extreme whitespace and centered alignment", + "Strict horizontal rules for structural division", + "Custom cursor interactions (dot and ring)", + "Subtle grain/noise overlay for organic feel", + "Fade-up animations for sequential content reveal" + ] + } +} \ No newline at end of file diff --git a/.design/fonts/cormorant-garamond-300-italic.woff2 b/.design/fonts/cormorant-garamond-300-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ca5fbebe00792bcba68cf71a4bbecb2043ff8453 GIT binary patch literal 11556 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 WYrdhXzKr(=DRJNQZTaH)1^@t{4}&}a literal 0 HcmV?d00001 diff --git a/.design/fonts/cormorant-garamond-300.woff2 b/.design/fonts/cormorant-garamond-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7c345ae8e6c16215dbed90eaf59c6eb6f4116359 GIT binary patch literal 11264 zcmV+bEdSGYPew8T0RR9104x9i6951J0KHfM04t9G0RR9100000000000000000000 z0000QfgKx~4jh37KS)+VQh_uEU_Vn-K~#YNCn5lXY%f+32nvC{D1nqr3xRF`F#kjW zHUcCAgGvM-1&2fjiFF&jrWNCuRlvppfQ588k3{Hk2w8Q^QBlswW}^Q;CD0+m!u}Ls zY67yI;&N9}%&b}+T5S~*wyVW-Fxs*2o?JZ{B76NW--3vw%irx|xWUA%S2aMt~p(oY~W>Z5^gA zW7kek{#LPJ>8j(>u44A5&M$#O3y9SgMd_bC3={;oQ%7b#(X$BHBiEIq-{+C)Mp z!bMDd`eGW=tmX~nl{2kp4$AHcs1e~&R_~-v>+IHvBKcNOVA2^Y1{WDa% z&1C7e@{Wa(W(jLG#0O$j3aQeFKrjF;00xFtsRz)g z5etGeKmgJq0E`F#2t0aU38jtm5Ms(Op=cJn#blbzcR)nBh?UOEs#$Lj$6EtIz{Ld+ z03MeL)ba{ zLSqOc-!BLNtGjA6wa->?f&hyM!h@jJ9eO~m8W=1oV%Y@I6Cg&^GWq}jI-CNrQ~v_~ zW{9(81o-PA>g(xd8UVy#hdtHn9F|{}6UON+nXyB_ciNUVf9KgXBNQa#zZEV3gu|$S z+qPnt4W#)5#(?IfI?;Xc_SK4-RHLe-iYmL@6;qZnm9`|sA>SMSHGavfJjksaNkn$v zl2w_N329DUO0c+B3hPAN@I{S10g;7=Ki4mQRVVzw*L=X+yvB<>!$V!-B4^v}7+cWY zV7VFeHUFedk1&5j=X7LGcM07fp=Fx(#cWoE`l(3Saw|p_86+12U;U%a3-??>ye*>^ zZK$2_T`lt~VBmFHHBR_*Rr^_HeZBvwdAgw%8X>qGUM2ucr$Ay+d%td8fP}$ms>>W2 z9_%M96y8m1`v+7%t?I5$yxqZhJw)c{|EoMZWFHhiwUZumc=h*6OJq{C3dOTx$n0R< zuhDHocW-#8Z(EQvTRrrT8SAeFohCz|b_qX~u`QV)%IDj_lnL(D(`iPFzmxOEdia1V zl;3nJR86MSD#1qK-(?)v#v}AkU>wU|)8W{+5{;j>?14YiI##4!KctDcK$R@|P}T4% zXQoKg0pIM>N@QS(U5=;=r~u&4R>rFxM-I1(Ry$3vEE;5rT5|#e)4h!GN2WP98T(^79hL=fzK(XGC$i2Vw3l7mP`yKu5ezuX35r5|4Aggl< z^vDcZiF%>3Jl(xvq1=kWmSAl7lgpHHtaz6NPT<-y0m7#6A*fS<8Ul$?hQ13RLrrqM zu@`N5-3RQ2o3$nnUdIlAJaS}4ylQ~eAh1wcTq`Yj_pf@W<-z?QBAgVbuQ60OJH1)Q z3A#p&;q4zO{7{SfGo~n8&-hfZAjbOeNpwGRCL7}&Gf;AE0`#cgZLqMf^CuwdaVcV# z6%uEkmL0QYd&BVb##}J;B5@~@q3uDCEcT)}4#rxPC9}9A_O;?%>s2N+-@z#%vdJ~D zKieJvx&X)p-~r$UU}Hbs+=!s zzm_^zE?YXG!6LJ;NX9w6&us8{+?2Kt1ddwL?ZKDwovU8Mz1QV~_UsV4->)T%m_ zbfh8DBBnicGZZ8DL5ob%h9uGsn1taYw6Pa6nPfa^qx7C;++~R${}&%7U#d%?f=Bd zW=xUf=K~{|0KzutqwWBIEL@pCHm=W1>J&LB@f zq(@2gd7mCFrB4;0SJ8CsEir`uQ;MX|3+`hhjJ7i{U9ufv5{xHA zBwCcjayWH@xDMb*tma6P3gu)_JnW-n_EGXS=gL=z(OGY-Tn)ay9L&l`LfV3cSm2NB{ER+dA;_Rd&7AwDb)81ONc= zTVDSG2+;u?gdKLH0X(Y(3HB@l6vh$9tGrW3JPN=ej`X{69frQ)WOMlYQ~20vN+ zWebqQSEfMuO!5RN5UdaaAc7$>G~SVbLM0%3uNn{(08Utl0HCXVO+>>NtBu$I$LHZL z;-*ZZet+SAwkxnE-|IJkjsu22faxK2{KWwPcu3>PQx}+E97to`Zi4gnuy=*sQ80=y zR2v08aicKJrK=H!0N_b5dRBFu|7 zpb-uC9cb$mfZh)o;tEhjD8)TRk^_AZUHA!{#B=8lhW8h4f8p3U z06vHLT&_Yc3xPrcRDgXX!c<8KKq*R!5wtM^(D@-lTme*sQQT8Ae!QCgKP6zT=RmtqB(ZR0rWYHx~jra7CH(EPywoote^R^e%kvXLtFupk_$OE zrP=af3{25)D*$>y#>1DCr2vJ8U<33;Az~l~G)wW0L@8Z{02<=7D@;-d^roj#P`(0e-PXHsz5BOHmMEl2Je(J#Zm6|=vBuNDy z-2f{MA_Ot%gAxJaM<9L!qHN-HLNTghU};6;gzHcnd=JZc*>Rla#KfL?%*z=1{x3Qf zOEq1$>XdyT z>gceG0pW*M6~pHrPA8NcNLJ7$R`9d$ve~`{p3z7f_rGcQ5r$C3R3dWnPAM&PRVXW) z5D3+x%g@VRQ=#OmAL@Onmvf5Ss``m>V*C0p=bSo z-F?AL!*;2r_1X9R^H=SCLD7tJzN+z~_I`O5?jVqV+Rn~;S#8;6rFuO3ohGe>DN_cr zzOd?nG&mS5I!1II(ht^gyOBH*BK5-Scrfw71PNh5zA5(nLF=vOoas~eI(Ky^D>fHI zibuf#-SC1xrT81Zwrm$`-bfw&wqE6$zC(_%p48o+PKTKqXE`-CmuZV&cI^dsEU(^S zXt3?hjTX}FGE|Z6Jr1_QqBfd(u{MM`CL^WPM6YRQ4@}{WUsi^JW<&)lM&yT zowP2T4DQRLY|HMm8^i`otTK(ImF=Fg&+C#+S@t8OJ>9bGRLJ?vr9h}jHuEGw=RT?MnY?N}X9 z^O8wzBqQmdwwW%h6YXQtQZ97O0%Jo~G&z5H({Gl`8vaj}n!9>{xp$?{t`Qz1K=U|H zG6LzH)}@idJi+^{NN?X-CCGU!H4c)idHC{Z-mM+EqQW}gY+m;n@^Qe_xG6u+yu>*u zqCQ*r;mG0LIDoO4cg0??mK;qmSgPro-Ci*`zuR@W^F9GvbvGzAM4Ig(@T}-D2;Iav|+Uh)&&v{39!sE znrG$3(KO*`7#15?J2pIT`m;Q9wEqU<;ir4cKb1DNrWD(@x);0Je3X4*6g6Kd|V{_S7BmmiQgh7uXE`SrT{bz7)SJ zDIsb5nH|YH5-;u9kzjfA^lhT$V*JjQ#PG!Y%f}M#Tkc=l9@B^~DMycG`EU3=yL0cl zFyZp9-1z%p&o0H8-tr z+|x!Dbd8Jdc&5Wdm|1>^EB=yB<8skZ!YB4_p~=SdYr6B=tLerbL5}1SvWqyVG#_E= zFJT3iCDP^Q_{;x~L?@KU)hf)qzJPak3+w~C8@hmM6EANN4tjB>W-HV!sBN9`>s|J zhD7F!G819QMqmFm3LF*PBh^DKh;`E{D&!Pnq_y6bRS#dkuUnPrKoE`%DyyYPTj z&YV2NP(oh|?Y5gC{T!;;mT94cA@Vm`#TzMRa8QLspW~=3ain-EW1MAaoie1IbA0{Q z$W!B+cR#LEH&u@8-(x`iz~`e96e|48STsM6J$(qy$}&fKda1)vmR`&>ta^Bl9;Neq z1S!je%~K1Sr|`tBUQ&%%URPGs+Q+-jj~^P`R=}edKelFI^M?;>t<-90pWhhhe+|1qiF$aO%~e;a3O-oNV=EbuYP?&5x8&8yks;`V~`{%`re z%>U3GFE$Z|C}#Wl?pEX&k(}pV8%%S@b$+tJS{vYavcW}Lwc_d8ozjmXeV<5{h+jil z>x11bWEE;o_tB>}qgABE4mIo2Ldih98aJmcNNZlzp5#m{ny_J@BiH%%?1Q`!=+*=?@Z_)nZxmTNoF9J7F<_n;#U0!J}@2 z3s3#G-c;rDtJ0(3)Q%yAj_8p5q{tkN(f`tdnd4oN5w7fR1=0Qm&rRmk@PC_98&U$c zKj{|$6z|-p?Vf}|7AxhI8OjQ{CF6EwSu-rdoFamgz=0VYJh{X1fLl`Tpbz;T>j;Md z;UvP=cRbOdG=wljd|R!$9ZzJ8G{=ucx@)6eW~L%cmNjs#H-NlIC9^DsOL&TXi^YTC z2gcdOVeS)cH)gy_R|Ld%c82w|yBytnSx-kNdAi00_x42D9G$W~&Y*$mv4t;Uv6@Ip zhEdQ7oqYLp^Tlg$(jNC7yapwG+~CWEYlymPI^gPtSgV;C3$45`@8*dzs^qm=`IB&y zgvuY5J^uj%e3nNH!)s9VpZL97C`whB8&^jzj2E~g7YlDc)W`3tEXuE1Ty|YQ$mcjI$VU=X@M7m z&-{6nvjRoaUAl$Csn-g@x3fBjlcF0k6q zdv-skvn{ZUWQ8`iP-;*0bgKm(+KP$V{*OU9ZKW7T(CPSUor;CxRZC>T*F3SUav`3-#eSuMYbn`qK_%rkp-Y@}9Ub9|5~+l*IH z>ERxm&F*1+nvrjouK1qfggv{CMI9R~5pP**uWp#-)-V*$^AwKj3*M669efJsFH>$~ z0Yc5hO~}HUpc~@D&)Y5a$)C;}bC`uh7yM(o{uz3}cVH#L_!OMRdZbQ8UpzDEDgs#x7wGg)`pGIkDo3Hvc8fK$ae%$0I0xrey#c{|=1 z-c3HkFXFG}|IWCX<;)LW!Ctjq=LKp(o?wySC!tYTD%>D^D^iFGMax7#h{fV8@o4b@ z@xPJ~$xz98sYF^MJtI@enq=3#W4t%YDY;ADC_k<6QuI@tQwAs}DF0RUSDjHS)kD;; zHJO?vnvdE9ZHxA@PN%EWZPt}3E?<25^1m2;eEDhoG5(~6&lz>0o{w$oLyLeT6lfpGigXp=h5lp#aA@p z?f-q$e{B**_WL(@L>l9et}+pJWcPO(&=gIxX-cTSTL=(D-~47;?VjCcxXe7`ZhOLi zUt67yNhJc*s-MsH#-sG-vxW<5#`jh9y^>}Tj4+<&C`?d%xe;mE<3q3JT2cVl3a&u( zHHPJv&({~OYK?nD?#oyGJ#qB5?DQSfaNzhe`!|GWSZ$J-Vj}Pb@_( zVZTxwpu($DGZk>(I>jH4!@qPndS8%9qU*YCrg;)a_7VS>@4&H+=n{Od+h+-5N7#p+ z&DXVsTs^4?zshkf9-IBI^-)x__e)I;gVAbJ^tzlTsjk}jVm2!>ofcz$ZIyXtt^!;1 zt2K{zeG+ zMtH5?ZOad1*2;6#r;ti4MwHLwTD8V}-ikO%9ErXzH85m!W4;e(#JYO88Q#4pIK`au zo|Vr%O_2-49onxQ6A~n8=7=T$53JWQ4dgIK^n21NM1M(TNpj35rX-clk?=z=YxgRv znvNPM#r9$`y29iXy%lUY!N=Wdj|dpBCgU;Zcg9zA8eta?uTWQh@crX=Jqi)~jWO$s zNnKkr>j*c9=`La$wiDw`Y?b!al*zh1UI>&^{cRadwC*FG;i^0+lfOX>akyxsL%gm+ zXX2RtL*uuzgx{?9OsQm%BFEz>CYD4mqhtDanZZ!6a^vkbZlC@q{7k|tSNFEdVLFz^~w=S;}`VDy?>R<$Nti~VfpJws? z^;CE(a%qJuoQ@P~L%H??AG0n1>X&Gh@0!P6O-ekw)IMSAUP4!!xDWqWBmki_W{H!e z6O&`+u3`UByO?+(7QJoLi4FTeR+9v|dJk7gL(~lJqg0Lq&fdZN=JsnNg!o8m)Nz)` z)U=1B$;8$1b(YUPZI5X(v+msk(8@sQnHghm5Wvys_O=H3_R-^cM^ELO8q#DXvwsR> zXFM9{+{xo(0K^4c@AWMnyJ7EP9KE(&752`#sV+antVJ_ERotkNUDxc1DVey>N+VNF z-;-sVEj`UVKwL>M1hOGKh+<~@i5ogH{ckk^-0$F_>}BHc!ysdvk=&0XCy5p+_4EJh za?!4{9--VGs1k_#60Gd1LxC9B>MG*;bUTYlY@Rc{varVzc3T+ScPjR^$trP4SxoTZ zM;z?nQO?5Bgmi2=S1ktJGPKR{rU`TMb(uCe>oT6Aoj{DeL%V~M5NM?5OD|mv0WKJV zF$Q(mwbb}v=2ukZJ27{#f=L~#pHwd^cUgJ8_;I`t63TC9%GsxGux)!;8x~iJICLR; zwY={5H13>7Ma*UX@>QKpT*T5a@;g2i73b)auJC#qE^R&yCF_G{R~bsm11m$z564-! zbG4FhDRMdHTe(!DfEOI}MujkpA;mOWj@M5|f=!H$0>1T_aboihZ?he0Zugee^3*Zw zeWnw~lv2VoJ~I=7X=r-u*qb^-#nr#F;1}nuF*f!(+GPbMcjlw`rxZe(LOk$VJm2h( z!6(HKK8zhQ`Ki;!Xm;?&`F!G^ZvNq!VSQJM%6{J6U62K4JaoK{Hylw$ zj?1(tj;A@{9mGJlbX`S zn;j3lTBOYOIO6JB_bna|eLtB}lH4*3{=GeI+r@5o*l(9@9daJh_DQ((@!aC`a4DQ> zCoWj(Vrb=3Q`Zus@pb@?9@RIRwjlV_%~EX3>UO!^AI78ermZ@@4p*Z!z@=8xSj6G( z%I~c=>*Z>RZg#2FSZ`O8)XHc_ee;J1LnvKWD3nbA&B``(U|CY?rG@Ra>z|p}3-Dk+ z3X(OZvu)-d=5~_{z?C?}VyJd2yNS&qCXVp-gc8}mj7}zN$trD1g)gpLyIZ9oWR=l) z+IJZlC(y=N;xk*T8N0$Pe-8gSQLk7md+H75m~+Tf8|H~7te$$ zC-0YqR-E#u__d3hBb{A^vxrf*qSQ~*4ZNUX=BXCC`^JLCZ`|BQS!Lj%ZSz2LCE=#s z*Y3 zF>rH+N44hFI9LRKT)*MhV(59e|H>yJb?;k2Ahk9czwyEAU=h9yT+?Jr21d2x%)1&w z$i8i6=7v+MH&Mz9&ppEEMVN3^ESL@wvUv|@jkd5eDCXo^fdhFK%EACo=Mg;kK2sXO z%Y^`ja}nSB4lSJzVpC5Z8Af^qHOADv7g7|NT>Q@3t2XM4EzKF#lo{6}oIrF$fpcAi zQA(G$;b}{|#hq1Tg!ogSNi*j1K9wPGO#jL}+dG1MB;Na?gE%J|of{p&zE7l7v53aD z`t9R&oj7Zg#HYc6OG)QYDRCV_oM_=E#P2UF_~-mTUr*mJRH)6o8KsL}#{)kgT%}o( z(2xWLOl;rTw0eZA{*)>6BzduT)KKQYC`NLsIO_Qxc3+|XF7;`6fjdcUIw`evGM-{2 z%9LsrlVv-OiaBXXl0YN5&~MlIhuPHJ1FjN;Sd1`hEUDji(WW*89NV2#>#lw(C*~AJ z>+1a!aY{L%S(#J~k=q`~hqkNNv*tVT!&fpd)>j3$rC&vlyQOyH_|U5dQaSCf-i0kwQ{25>Lieg1AW;c(M)&+M3_)Nu zYtG-o{_*f|;lB7N2{6*V!_fiFdb}DdY(?7B9z8QVnu3s!6*vY;p6k6q=5T|Zn{8M$ zF(9DY;&<}A%DZY>HM;mw{Xlmev%u~e{@t3kv!Sto!8@H)Sv9!FhfQ_uEr4R$2iMqE z#kc@}h|IO-*%pJ}t6lgl!|+IjUiRn#WMCcLgRC|R385@Nk@t>K->%JG@VuCL2Gv@K z`Z#*vZdfvY#x(Cb$b|3Jz=t8f;c4~EZ9A1fc-eQb#$LY{@&L7*M}eF`0>!%^B-sA3bjerM!LI3S1~I4qX>1O<4*#<`Xj{bn6_5<@Bvp zu&UxbT^{YyE<}HeQ!{d(O5u`Un;H@63P(KAjk<-IH9HsP z(E)cuYn?g%Vw~H0F)gXINfHh!*V0ZW zR^cpajD^xJEvvQEGt;_e4bBCHse7pe2DWz-U~YRA`7%lqZN6<>>9x+Q$IWvQKS~pt zzC@KKk2{z+k0W=>N*GkQ3+%gsj^8kIGHPGhyJZh5-A^j+YV<2+f2-@|Ei(||}8&|Y?}g>e_G{l4EIbG+er5El_thnTR`WMF=TVjCBiqk7{LBt*0lc(iqY9&UV%gV`1=uKl6{T{ z=`V|lL*TuKZ>jc!E`E>_aINl>bf}a+w}`urU70GS6XI`bjDA|1w2O@CqgQ_hyemHr z)>W5x}%+L5Wwl8AG~+C>qdxWmoh$dwbrKioem`k*IBEXnQ2|7%qQk#kxa%f zl+|i|@;vUB)5q-&P(O0Z`~XO^O(8IRD|!hGVzcY?>t$Ul4+Zf$uy5 z0iYzlK>E?M!q{(vkTw9|^@ULp0O0L|xa0qS{=cBNXBmJ60{}o^=o`&w^vJFM-`+>l zM%cVM|Lc`ZjCEv9;|KLFrk6J%H;ad``>ejcv)+A&8GmQJ*DoYDSK&4h7$e2^KC8)d zjGj?bVDRX++YTU~fCJ$zsLRGI3SvYc z;|3%aRLvwxxJn)>V^{(!qw^Hw1l#2)kmv4czy?sNoz+w4sc@u3WNd`4SxF$NZlz4g zl^BI0MN^InVqti=N=~hi#872oS-W);=Jfzqu|f)o{j5M)R$g9##I|hhY)xELZ%|~j z)Rn<79M2R6B32xM8dhsyS;(L@}*((Ot?JMF}AxZ~HRBf7T>`N>Qn)YthiuhBmdOZS81Rd&DH9WW32KD57?`)#)o4-rUK0nO4d3~PDl zt0F6sls@rFvhoU|6Fsl=qXm&isD q(EfkEw3W(G7452VNuJmB<|&LuXntRJvosFp>$U1{F*aJPmH+_K9?Ne4 literal 0 HcmV?d00001 diff --git a/.design/fonts/cormorant-garamond-400-italic.woff2 b/.design/fonts/cormorant-garamond-400-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ca5fbebe00792bcba68cf71a4bbecb2043ff8453 GIT binary patch literal 11556 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 WYrdhXzKr(=DRJNQZTaH)1^@t{4}&}a literal 0 HcmV?d00001 diff --git a/.design/fonts/cormorant-garamond-400.woff2 b/.design/fonts/cormorant-garamond-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7c345ae8e6c16215dbed90eaf59c6eb6f4116359 GIT binary patch literal 11264 zcmV+bEdSGYPew8T0RR9104x9i6951J0KHfM04t9G0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/.design/fonts/cormorant-garamond-600.woff2 b/.design/fonts/cormorant-garamond-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7c345ae8e6c16215dbed90eaf59c6eb6f4116359 GIT binary patch literal 11264 zcmV+bEdSGYPew8T0RR9104x9i6951J0KHfM04t9G0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/.design/fonts/fonts.css b/.design/fonts/fonts.css new file mode 100644 index 0000000..aac9115 --- /dev/null +++ b/.design/fonts/fonts.css @@ -0,0 +1,48 @@ +@font-face { + font-family: "Cormorant Garamond"; + src: url("./cormorant-garamond-300-italic.woff2") format("woff2"); + font-weight: 300; + font-style: italic; + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; + font-display: swap; +} +@font-face { + font-family: "Cormorant Garamond"; + src: url("./cormorant-garamond-400-italic.woff2") format("woff2"); + font-weight: 400; + font-style: italic; + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; + font-display: swap; +} +@font-face { + font-family: "Cormorant Garamond"; + src: url("./cormorant-garamond-300.woff2") format("woff2"); + font-weight: 300; + font-style: normal; + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; + font-display: swap; +} +@font-face { + font-family: "Cormorant Garamond"; + src: url("./cormorant-garamond-400.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; + font-display: swap; +} +@font-face { + font-family: "Cormorant Garamond"; + src: url("./cormorant-garamond-600.woff2") format("woff2"); + font-weight: 600; + font-style: normal; + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; + font-display: swap; +} +@font-face { + font-family: "Tenor Sans"; + src: url("./tenor-sans-400.woff2") format("woff2"); + font-weight: 400; + font-style: normal; + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; + font-display: swap; +} diff --git a/.design/fonts/manifest.json b/.design/fonts/manifest.json new file mode 100644 index 0000000..ba72b3a --- /dev/null +++ b/.design/fonts/manifest.json @@ -0,0 +1,65 @@ +{ + "format": "brand-fonts/1", + "files": [ + { + "family": "Cormorant Garamond", + "weight": "300", + "style": "italic", + "file": "cormorant-garamond-300-italic.woff2", + "format": "woff2", + "sourceUrl": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtHmSqn7B6DxjY.woff2", + "bytes": 11556, + "unicodeRange": "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB" + }, + { + "family": "Cormorant Garamond", + "weight": "400", + "style": "italic", + "file": "cormorant-garamond-400-italic.woff2", + "format": "woff2", + "sourceUrl": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtHmSqn7B6DxjY.woff2", + "bytes": 11556, + "unicodeRange": "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB" + }, + { + "family": "Cormorant Garamond", + "weight": "300", + "style": "normal", + "file": "cormorant-garamond-300.woff2", + "format": "woff2", + "sourceUrl": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpntKky2F7i6C.woff2", + "bytes": 11264, + "unicodeRange": "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB" + }, + { + "family": "Cormorant Garamond", + "weight": "400", + "style": "normal", + "file": "cormorant-garamond-400.woff2", + "format": "woff2", + "sourceUrl": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpntKky2F7i6C.woff2", + "bytes": 11264, + "unicodeRange": "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB" + }, + { + "family": "Cormorant Garamond", + "weight": "600", + "style": "normal", + "file": "cormorant-garamond-600.woff2", + "format": "woff2", + "sourceUrl": "https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpntKky2F7i6C.woff2", + "bytes": 11264, + "unicodeRange": "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB" + }, + { + "family": "Tenor Sans", + "weight": "400", + "style": "normal", + "file": "tenor-sans-400.woff2", + "format": "woff2", + "sourceUrl": "https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISn3t4Ck-L2qM2VQ.woff2", + "bytes": 6832, + "unicodeRange": "U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF" + } + ] +} \ No newline at end of file diff --git a/.design/fonts/tenor-sans-400.woff2 b/.design/fonts/tenor-sans-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c40830740ca449f5f223995e1efa427cd7c76f33 GIT binary patch literal 6832 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 literal 0 HcmV?d00001 diff --git a/.design/logos/favicon-0.ico b/.design/logos/favicon-0.ico new file mode 100644 index 0000000000000000000000000000000000000000..05cb6fe13ce1f9017224ea35e70e3e5160d81a65 GIT binary patch literal 4286 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 + + + + + Malenia — Свобода в сети + + + + + + + + + +
+
+ +
+ + +
+ +
+ Свобода. Практика. Простота. +
+ + +
+ + + + + +
+

+

malenia.space

+
+ + + + + + +
+ + +
+ © 2026 Malenia + + malenia.space +
+ +
+ + + + \ No newline at end of file diff --git a/.design/prefetch/styles.css b/.design/prefetch/styles.css new file mode 100644 index 0000000..0070722 --- /dev/null +++ b/.design/prefetch/styles.css @@ -0,0 +1,531 @@ +:root { + --gold: #C9A84C; + --gold-light: #E8CA7A; + --gold-dim: #8B6914; + --cream: #FAF7F2; + --warm-white: #F5F0E8; + --ink: #1A1610; + --ink-soft: #3D3428; + --ink-muted: #7A6E5F; + --border: rgba(201,168,76,0.25); +} + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +html { cursor: none; } + +body { + font-family: 'Tenor Sans', sans-serif; + background: var(--cream); + color: var(--ink); + min-height: 100vh; + overflow-x: hidden; + cursor: none; +} + +/* ── Custom cursor ─────────────────────────────────── */ +#cursor-dot, +#cursor-ring { + position: fixed; + top: 0; left: 0; + pointer-events: none; + z-index: 9999; + transform: translate(-50%, -50%); + transition: opacity .3s; +} +#cursor-dot { + width: 6px; height: 6px; + background: var(--gold); + border-radius: 50%; +} +#cursor-ring { + width: 32px; height: 32px; + border: 1px solid var(--gold); + border-radius: 50%; + transition: width .25s cubic-bezier(.4,0,.2,1), + height .25s cubic-bezier(.4,0,.2,1), + opacity .3s; +} +body.hovering #cursor-ring { + width: 48px; height: 48px; + border-color: var(--gold-light); +} + +/* ── Noise overlay ─────────────────────────────────── */ +body::before { + content: ''; + position: fixed; + inset: 0; + z-index: 0; + pointer-events: none; + opacity: .035; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); + background-repeat: repeat; + background-size: 180px; +} + +/* ── Layout ────────────────────────────────────────── */ +.page { + position: relative; + z-index: 1; + min-height: 100vh; + display: grid; + grid-template-rows: auto 1fr auto; +} + +/* ── Header ────────────────────────────────────────── */ +header { + padding: 2.5rem 4rem; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid var(--border); +} + +.logo { + font-family: 'Cormorant Garamond', serif; + font-weight: 300; + font-size: 1.5rem; + letter-spacing: .35em; + text-transform: uppercase; + color: var(--ink); + text-decoration: none; +} +.logo span { color: var(--gold); } + +.header-rule { + flex: 1; + height: 1px; + background: var(--border); + margin: 0 2rem; +} + +.header-tag { + font-size: .65rem; + letter-spacing: .25em; + text-transform: uppercase; + color: var(--ink-muted); +} + +/* ── Hero ──────────────────────────────────────────── */ +.hero { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + padding: 6rem 2rem; + gap: 3.5rem; +} + +.emblem { + position: relative; + width: 90px; + height: 90px; + opacity: 0; + animation: fadeUp .9s .1s forwards; +} +.emblem svg { width: 100%; height: 100%; } + +.quote-block { + max-width: 640px; + opacity: 0; + animation: fadeUp .9s .25s forwards; +} + +.quote-text { + font-family: 'Cormorant Garamond', serif; + font-size: clamp(2rem, 5vw, 3.4rem); + font-weight: 300; + line-height: 1.25; + color: var(--ink); + letter-spacing: .01em; +} +.quote-text em { + font-style: italic; + color: var(--gold-dim); +} + +.quote-author { + margin-top: 1.25rem; + font-size: .7rem; + letter-spacing: .3em; + text-transform: uppercase; + color: var(--ink-muted); +} + +/* ── Divider ───────────────────────────────────────── */ +.divider { + display: flex; + align-items: center; + gap: 1rem; + width: 100%; + max-width: 480px; + opacity: 0; + animation: fadeUp .9s .4s forwards; +} +.divider::before, +.divider::after { + content: ''; + flex: 1; + height: 1px; + background: var(--border); +} +.divider-diamond { + width: 6px; height: 6px; + background: var(--gold); + transform: rotate(45deg); + flex-shrink: 0; +} + +/* ── Buttons ───────────────────────────────────────── */ +.cta-group { + display: flex; + gap: 1.25rem; + flex-wrap: wrap; + justify-content: center; + opacity: 0; + animation: fadeUp .9s .55s forwards; +} + +.btn { + position: relative; + display: inline-flex; + align-items: center; + gap: .75rem; + padding: .85rem 2rem; + font-family: 'Tenor Sans', sans-serif; + font-size: .78rem; + letter-spacing: .18em; + text-transform: uppercase; + text-decoration: none; + border-radius: 0; + cursor: none; + transition: color .25s, background .25s, border-color .25s; + overflow: hidden; +} +.btn::after { + content: ''; + position: absolute; + inset: 0; + background: var(--gold); + transform: scaleX(0); + transform-origin: left; + transition: transform .35s cubic-bezier(.4,0,.2,1); + z-index: 0; +} +.btn:hover::after { transform: scaleX(1); } +.btn > * { position: relative; z-index: 1; } + +.btn-primary { + background: var(--ink); + color: var(--cream); + border: 1px solid var(--ink); +} +.btn-primary:hover { color: var(--ink); border-color: var(--gold); } + +.btn-secondary { + background: transparent; + color: var(--ink); + border: 1px solid var(--gold); +} +.btn-secondary::after { background: var(--ink); } +.btn-secondary:hover { color: var(--cream); } + +.btn-icon { + width: 18px; height: 18px; + fill: currentColor; + flex-shrink: 0; +} + +/* ── Footer ────────────────────────────────────────── */ +footer { + padding: 2rem 4rem; + border-top: 1px solid var(--border); + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + flex-wrap: wrap; +} +.footer-copy { + font-size: .65rem; + letter-spacing: .2em; + text-transform: uppercase; + color: var(--ink-muted); +} +.footer-dot { + width: 4px; height: 4px; + background: var(--gold); + border-radius: 50%; +} + +/* ── Animations ────────────────────────────────────── */ +@keyframes fadeUp { + from { opacity: 0; transform: translateY(22px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ── Responsive ────────────────────────────────────── */ +@media (max-width: 640px) { + header { padding: 1.75rem 1.5rem; } + .header-rule { display: none; } + .header-tag { display: none; } + .hero { padding: 4rem 1.5rem; gap: 2.5rem; } + footer { padding: 1.5rem; flex-direction: column; align-items: flex-start; } + .btn { padding: .8rem 1.5rem; font-size: .72rem; } + .cta-group { flex-direction: column; align-items: stretch; } + .btn { justify-content: center; } +} +/* cyrillic-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtFmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtMmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtHmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtGmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtImSqn7B6D.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtFmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtMmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtHmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtGmSqn7B6DxjY.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtImSqn7B6D.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpHtKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYrXtKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpntKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYp3tKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYqXtKky2F7g.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpHtKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYrXtKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpntKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYp3tKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYqXtKky2F7g.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpHtKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYrXtKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYpntKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYp3tKky2F7i6C.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Cormorant Garamond'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYqXtKky2F7g.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic */ +@font-face { + font-family: 'Tenor Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISn3F4Ck-L2qM2VQ.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* latin-ext */ +@font-face { + font-family: 'Tenor Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISn3t4Ck-L2qM2VQ.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Tenor Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/tenorsans/v21/bx6ANxqUneKx06UkIXISn3V4Ck-L2qM.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/.design/system/BRAND-SYSTEM.md b/.design/system/BRAND-SYSTEM.md new file mode 100644 index 0000000..5bcc604 --- /dev/null +++ b/.design/system/BRAND-SYSTEM.md @@ -0,0 +1,53 @@ +# Malenia — brand system + +Generated by the branding-agent engine from a single **seed** (20 fields). +Everything below is *derived* — no token here was hand-authored. + +- **slug:** `malenia` +- **source:** https://malenia.space/ +- **primary seed color:** `#c9a84c` +- **derived tokens per theme:** 218 +- **themes:** default · dark · compact (same seed, different algorithm) + +## Files + +| Path | What it is | +| --- | --- | +| `seed.json` | Generated snapshot of the effective seed; persistent overrides live in `brand.json.seed`. | +| `tokens.default.json` | Full derived DesignTokens (light). | +| `tokens.dark.json` | Same seed, dark algorithm. | +| `tokens.compact.json` | Same seed, compact (dense) algorithm. | +| `variables.css` | `:root{}` + `.dark{}` CSS custom properties (`--brand-*`). | +| `variables.dark.css` | Standalone `:root{}` for the dark theme. | +| `theme.json` | antd `ConfigProvider` theme (token + algorithm). | +| `kit.html` | Themed component showcase (light). | +| `kit.dark.html` | Themed component showcase (dark). | +| `artifacts/landing.html` | Full landing page (hero → features → pricing → FAQ → CTA). | +| `artifacts/deck.html` | 9-slide 16:9 pitch deck with keyboard navigation. | +| `artifacts/poster.html` | 3:4 print-style poster. | +| `artifacts/email.html` | A marketing email. | +| `artifacts/newsletter.html` | Multi-story digest email. | +| `artifacts/form.html` | Split-screen contact / signup page. | +| `index.html` | Gallery linking everything + live component preview. | + +## How to re-theme + +The whole system is regenerated from `brand.json` and optional +`brand.json.seed` overrides. Persist authored overrides there, then run +`od brand finalize ` — every downstream token, component and artifact +follows. Do not edit `system/seed.json` directly; finalize replaces it. + +- **Change the brand color:** edit the accent role or `seed.colorPrimary` in `brand.json`. + The 10-step palette, all interaction states, the primary background/border and + every component that references `var(--brand-color-primary)` update together. +- **Light → dark:** the dark theme is the same seed run through the `"dark"` + algorithm — load `variables.dark.css` (or add the `.dark` class). +- **Density:** the `"compact"` algorithm tightens spacing & control heights + while keeping colors identical. + +## Add a new artifact type + +`renderArtifact(kind, brand, tokens)` already accepts every `AssetKind` +(`landing | deck | poster | email | newsletter | form`). Add the kind to the +build's artifact list to ship it in the bundle; kinds without a bespoke layout +fall back to a sensible card+button page. diff --git a/.design/system/artifacts/deck.html b/.design/system/artifacts/deck.html new file mode 100644 index 0000000..2172915 --- /dev/null +++ b/.design/system/artifacts/deck.html @@ -0,0 +1,782 @@ + + + + + + + Malenia — Pitch deck + + + + + + + +
+
+
+
MaleniaSOPHISTICATED · QUIET · ESSENTIAL
+
+
+ Sophisticated · Quiet · Essential +

Malenia

+

Свобода. Практика. Простота.

+
+
+
malenia.space01 / 11
+
+
+
+
+
MaleniaTHE PROBLEM
+
+
+ The problem +

Getting this category right is still painfully hard.

+

A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.

+
+

Tools don't talk

Work scatters across apps that never share a source of truth, so context is lost on every handoff.

+

Every loop costs a day

Iteration stalls in coordination — approvals, exports, re-dos — long before anything ships.

+

Quality is a coin flip

Output depends on whoever happened to do the work, not on a standard you can rely on.

+
+
+
+
malenia.space02 / 11
+
+
+
+
+
MaleniaTHE SOLUTION
+
+
+ The solution +

Malenia is how teams get свобода. Практика. Простота

+
+ Network freedom + Practical simplicity + Aesthetic restraint +
+
+
+
malenia.space03 / 11
+
+
+
+
+
MaleniaWHY NOW
+
+
+ Why now +

The shift toward sophisticated, accountable this category is happening now — and the teams that move first set the standard.

+ +
+
+
malenia.space04 / 11
+
+
+
+
+
MaleniaMARKET
+
+
+ Market +

The opportunity is large and still wide open.

+
+
TAM +
+ $48B total market
+
SAM +
+ $12B reachable today
+
SOM +
+ $1.4B near-term wedge
+
+
+
+
malenia.space05 / 11
+
+
+
+
+
MaleniaPRODUCT
+
+
+ Product +

Malenia is real, shipping, and good to use today.

+
+
+
+ +
+
+
+
+
+
malenia.space06 / 11
+
+
+
+
+
MaleniaBUSINESS MODEL
+
+
+ Business model +

We make money the moment we create value.

+
+
+

Starter

+
$0 / mo
+

Up to 3 projects · Network freedom · Community support

+
+
+

Pro

+
$29 / mo
+

Unlimited projects · Practical simplicity · Aesthetic restraint

+
+
+

Enterprise

+
Custom
+

SSO & audit logs · Dedicated success manager · Custom contracts & SLA

+
+
+
+
+
malenia.space07 / 11
+
+
+
+
+
MaleniaCOMPETITION & MOAT
+
+
+ Competition & moat +

Only Malenia is built sophisticated from the ground up.

+
+
+ Built for teamsFast to valueOn-brand by default +
+
+ Fieldnote + +
+
+ Arcadia + +
+
+ Malenia + +
+
+
+
+
malenia.space08 / 11
+
+
+
+
+
MaleniaTRACTION
+
+
+ Traction +

People already want this — and the line is going up.

+
+
10k+
Teams onboard
+
99.9%
Uptime SLA
+
4.9/5
Average rating
+
120+
Integrations
+
+

Illustrative figures — replace with your live numbers before pitching.

+
+
+
malenia.space09 / 11
+
+
+
+
+
MaleniaTEAM
+
+
+ Team +

The people behind Malenia have done this before.

+
+
+ MC +

Maya Chen

+

Head of Design, Northwind

+
+
+ JW +

Jonas Weber

+

Engineering Lead, Lumen Labs

+
+
+ PN +

Priya Natarajan

+

Founder, Fieldnote

+
+
+
+
+
malenia.space10 / 11
+
+
+
+
+
MaleniaTHE ASK
+
+
+ The ask +

Let's build the future of this category together.

+
+
Partner with us — back the team building the sophisticated standard for this market.
+
Fuel the next phase — scale the product, the go-to-market motion, and the team.
+
Hit the milestone — reach the next tier of customers and revenue within 12 months.
+
+ Talk to us · malenia.space +
+
+
malenia.space11 / 11
+
+
+
+
+
+ + 1 / 11 + +
+ + + \ No newline at end of file diff --git a/.design/system/artifacts/email.html b/.design/system/artifacts/email.html new file mode 100644 index 0000000..fffe109 --- /dev/null +++ b/.design/system/artifacts/email.html @@ -0,0 +1,439 @@ + + + + + + + Свобода. Практика. Простота — from Malenia + + + + + + + + +
A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.
+ +
͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ ͏‌ 
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Malenia +
+

Sophisticated

+

Свобода. Практика. Простота.

+

A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.

+ + + + + +
+ Get started with Malenia +
+
+

Hi there,

+

Here is what Malenia gives your team from the first day — no migration project, no setup tax:

+ + + + + + + + + + + + + + +
+

Network freedom

+

Network freedom is built into Malenia from day one — not bolted on later.

+
+

Practical simplicity

+

Practical simplicity is built into Malenia from day one — not bolted on later.

+
+

Aesthetic restraint

+

Aesthetic restraint is built into Malenia from day one — not bolted on later.

+
+
+ + + + +
+

“Malenia is the first tool here that actually feels Sophisticated. It was part of our daily flow inside a week.”

+

Maya Chen · Head of Design, Northwind

+
+
+ + + + +
+ Get started with Malenia +
+

Questions? Just reply to this email — a real person reads every message.

+
+

You are receiving this because you signed up to hear from Malenia.

+

Update preferences  ·  Unsubscribe

+

Malenia · 100 Market Street, Suite 200 · malenia.space

+
+
+ + + \ No newline at end of file diff --git a/.design/system/artifacts/form.html b/.design/system/artifacts/form.html new file mode 100644 index 0000000..aa1077a --- /dev/null +++ b/.design/system/artifacts/form.html @@ -0,0 +1,442 @@ + + + + + + + Malenia — Get started + + + + + + + +
+
+ +
+
+ + + + Malenia +
+
+

Свобода. Практика. Простота.

+

A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.

+
  • + + Network freedom +
  • + + Practical simplicity +
  • + + Aesthetic restraint +
+
+
+ + Restrained, archival, sophisticated, and minimal. +
+
+
+
+
+

Tell us where to start

+

A couple of details and Malenia takes it from there — no account needed yet.

+
+ +
+
+
+
+
+ + + + +
+
+ + + + +
+
+
+ + +

That doesn't look like an email yet — try name@company.com.

+

We'll send your next steps here.

+
+
+ + +

Pick the closest — you can change direction later.

+
+
+ + + +
+ +
+
+ +

+ + No spam, ever. Unsubscribe in one click — your data stays yours. +

+
+
+ +
+ +
+ Свобода. Практика. Простота + malenia.space +
+
+
+
+ + + \ No newline at end of file diff --git a/.design/system/artifacts/landing.html b/.design/system/artifacts/landing.html new file mode 100644 index 0000000..43dc6ee --- /dev/null +++ b/.design/system/artifacts/landing.html @@ -0,0 +1,822 @@ + + + + + + + Malenia — Свобода. Практика. Простота. + + + + + + + +
+
+ Malenia + + +
+
+ + +
+
+
+ Sophisticated · Quiet · Essential +

Свобода. Практика. Простота.

+

A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.

+ +

Free plan · No credit card · 2-minute setup

+
+
+
+
+ + + + malenia.space +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ ★★★★★ + Rated 4.9/5 by 12,000+ teams +
+

Trusted by teams at

+
+ Northwind + Lumen Labs + Fieldnote + Arcadia + Helios +
+
+ + +
+
+
+ The problem +

You're not slow. Your setup is.

+

Sound familiar? The longer it goes unfixed, the more it quietly taxes everything Malenia is supposed to make easy.

+
+
+
+
+ +
+

Every deliverable starts from scratch

+

So the same work gets redone, the backlog grows, and shipping slips by days.

+
+
+
+
+
+ +
+

The tools don't talk to each other

+

Context lives in five tabs, hand-offs break, and nobody trusts the source of truth.

+
+
+
+
+
+ +
+

Quality drifts as you scale

+

What looked sharp at ten people looks inconsistent at fifty — and customers notice.

+
+
+
+
+
+
+ + +
+
+
+ Why Malenia +

Here's how that changes

+

Three ways Malenia turns the daily grind into something you actually look forward to.

+
+
+
+
+

Network freedom

+

Sophisticated by design — and built into every surface Malenia ships.

+
+
+
+

Practical simplicity

+

Quiet by design — and built into every surface Malenia ships.

+
+
+
+

Aesthetic restraint

+

Essential by design — and built into every surface Malenia ships.

+
+
+
+
+ + +
+
+
+ How it works +

Up and running in three steps

+

No migration project. No six-week rollout.

+
+
+
+
+
+
+ 1 +

Connect

+
+

Point Malenia at what you already have — no rebuild required.

+
+
+
+
+
+
+ 2 +

Make it yours

+
+

Adjust the defaults until they fit the way your team works.

+
+
+
+
+
+
+ 3 +

Launch

+
+

Go live with confidence, then iterate from real feedback.

+
+
+
+
+
+ + +
+
+
+

See it on your own work in minutes

+

Free plan · No credit card · 2-minute setup

+
+ Get started free +
+
+ + +
+
+
+ A closer look +

Built for the way real teams work

+

Every capability earns its place — and translates to something you can feel.

+
+
+ Capability 01 +

Secure from day one

+

SSO, audit logs and granular permissions are built in, not bolted on.

+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Capability 02 +

Works where you work

+

Integrates with the tools your team already relies on every day.

+ +
+
+ Capability 03 +

Insight you can act on

+

Reporting that reads like a story, not a spreadsheet.

+ +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
10k+
+
Teams onboard
+
+
+
99.9%
+
Uptime SLA
+
+
+
4.9/5
+
Average rating
+
+
+
120+
+
Integrations
+
+
+
+ +
+
+
+ Proof +

Loved by the teams who use it daily

+

Real results, in their words — not ours.

+
+
+

“Malenia is the first tool in this space that actually feels Sophisticated. It became part of our daily flow within a week.”

+
+ MC +
+
Maya Chen
+
Head of Design, Northwind
+
+
+

“We were skeptical, then we shipped our first project — genuinely Quiet — in a single afternoon. The team never looked back.”

+
+ JW +
+
Jonas Weber
+
Engineering Lead, Lumen Labs
+
+
+

“The quality bar out of the box is what sold us. Свобода. Практика. Простота is not just a slogan here.”

+
+ PN +
+
Priya Natarajan
+
Founder, Fieldnote
+
+
+
+
+
+ + +
+
+
+ Before you ask +

Your questions, answered

+ +
+
+ What is Malenia?+ +
A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.
+
+
+ How long does it take to get started?+ +
Most teams are up and running in under an hour. There is nothing to install and no migration to plan — connect, customize, launch.
+
+
+ Can I try it before committing?+ +
Yes. Start on the free plan, invite your team, and upgrade only when you need more. No credit card required.
+
+
+ How does pricing work?+ +
Plans scale with your team. Start free, move to Pro when you need unlimited usage, and talk to us about Enterprise for custom needs.
+
+
+ What about security and privacy?+ +
Your data stays yours. Access is encrypted in transit and at rest, and granular permissions keep the right things with the right people.
+
+
+
+ + +
+
+
+ Pricing +

Plans that scale with you

+

Start free. Upgrade only when it earns it.

+
+
+
+
+ Starter + +
+

For trying things out.

+
+ $0 + / mo +
+
  • ✓Up to 3 projects
  • ✓Network freedom
  • ✓Community support
+ +
+
+
+ Pro + Most popular +
+

For growing teams.

+
+ $29 + / mo +
+
  • ✓Unlimited projects
  • ✓Practical simplicity
  • ✓Aesthetic restraint
  • ✓Priority support
+ +
+
+
+ Enterprise + +
+

For organizations at scale.

+
+ Custom + +
+
  • ✓SSO & audit logs
  • ✓Dedicated success manager
  • ✓Custom contracts & SLA
+ +
+
+

All prices in USD · Cancel anytime · No credit card to start.

+
+
+
+ + +
+
+
+
+
+

Start building with Malenia today

+

Свобода. Практика. Простота.

+ +

2-minute setup · Cancel anytime

+
+
+
+ + + + + + \ No newline at end of file diff --git a/.design/system/artifacts/newsletter.html b/.design/system/artifacts/newsletter.html new file mode 100644 index 0000000..fdfd0f5 --- /dev/null +++ b/.design/system/artifacts/newsletter.html @@ -0,0 +1,427 @@ + + + + + + + Malenia — Newsletter + + + + + + + +
+
+ +
Свобода. Практика. Простота.
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Malenia
+
Sophisticated reads · Issue 01
+
+

In this issue

+

Network freedom

+

A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.

+
+ + +
Read this issue
+
+ + + + + +
+
01
+
+
+

Network freedom

+

Sophisticated by design — and built into every surface Malenia ships.

+ Read the full story → +
+
+ + + + + +
+
02
+
+
+

Practical simplicity

+

Quiet by design — and built into every surface Malenia ships.

+ See how it works → +
+
+ + + + + +
+
03
+
+
+

Aesthetic restraint

+

Essential by design — and built into every surface Malenia ships.

+ Get the details → +
+
+

That's the issue. Malenia lands in your inbox next week.

+ + +
Read this issue
+
+
+

You're receiving this because you follow Malenia.

+

View in browser  ·  Preferences  ·  Unsubscribe

+

© Malenia · malenia.space

+
+
+
+ + + \ No newline at end of file diff --git a/.design/system/artifacts/poster.html b/.design/system/artifacts/poster.html new file mode 100644 index 0000000..8402bb0 --- /dev/null +++ b/.design/system/artifacts/poster.html @@ -0,0 +1,434 @@ + + + + + + + Malenia — Poster + + + + + + + +
+
+
+ Malenia + malenia.space +
+ +
+

SOPHISTICATED · QUIET · ESSENTIAL

+

Свобода. Практика. Простота.

+
+

A minimalist, high-aesthetic brand focused on network freedom and simplicity, characterized by a luxury-leaning, archival visual language.

+
+ +
+ + + Malenia + + Sophisticated · Quiet +
+
+
+ + + \ No newline at end of file diff --git a/.design/system/index.html b/.design/system/index.html new file mode 100644 index 0000000..9a20718 --- /dev/null +++ b/.design/system/index.html @@ -0,0 +1,3769 @@ + + + + + + + Malenia — Artifacts + + + + + + + + +
+

Files in this brand system

+ +

slug: malenia · everything derived from seed.json

+
+
+

Malenia

+

Свобода. Практика. Простота.

+
+
+
+
landing
+
+ +
+
+
+
deck
+
+ +
+
+
+
poster
+
+ +
+
+
+
email
+
+ +
+
+
+
newsletter
+
+ +
+
+
+
form
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/.design/system/kit.dark.html b/.design/system/kit.dark.html new file mode 100644 index 0000000..c6b2968 --- /dev/null +++ b/.design/system/kit.dark.html @@ -0,0 +1,587 @@ + + + + + + +Malenia — component kit (dark) + + + + + + + +
+
+
Malenia · dark theme
+

Malenia — component kit (dark)

+

Every component below is colored only by var(--brand-*) custom properties derived from one seed.

+
+ +
+

Buttons

+

Five types across three sizes.

+ +
+ Small + Medium + Large +
+
+
+

Form controls

+

Inputs, selects, textareas, checkboxes and switches share control height, radius and focus ring.

+
+
+
+
+
+
+
+ + + Notifications + Public profile +
+
+
+

Navigation

+

Tabs, breadcrumbs, pagination and steps for app shells and flows.

+
OverviewAnalyticsReportsSettings
+
+ +
‹12345›
+
+
+
✓
Connect
Point at a source
2
Derive
Seed to tokens
3
Ship
Export everywhere
+
+
+
+

Cards

+

Elevated content surfaces with optional header & footer.

+
+
Overview
Cards group related content on an elevated surface. Radius, border and shadow all read from the derived tokens.
+
Usage
Drop the same component into a dark or compact theme and it re-skins automatically — no per-variant markup.
+
A bodyonly card. live beta
+
+
+
+

Data display

+

Tables, stats, avatars and a no-JS accordion for structured content.

+
TokenRoleValue
colorPrimaryBrand accentseed
fontSizeBody type basederived
borderRadiusCorner roundingderived
+
+
+
10k+
+
Teams onboard
+
+
+
99.9%
+
Uptime SLA
+
+
+
4.9/5
+
Average rating
+
+
+
+ M + AL + TB + design ops +
+
+
+ What is a seed token?+ +
The ~20-field input every other token is derived from. Change one field and the whole system follows.
+
+
+ Can I theme dark mode separately?+ +
No need — dark is the same seed run through a different algorithm, so it can never drift from the light theme.
+
+
+
+
+

Marketing blocks

+

Testimonials and pricing compose the primitives — landing pages are these in the right order.

+
+

“We replaced three hand-maintained style guides with one generated system.”

+
+ AL +
+
Ada Lovelace
+
Design lead
+
+
+
+
+ Pro + Most popular +
+

For growing teams.

+
+ $29 + / mo +
+
  • ✓Unlimited brands
  • ✓Dark & compact themes
  • ✓Priority support
+ +
+
Composable
Marketing blocks (testimonials, pricing, stats) compose the same primitives — so a landing page is just kit pieces in the right order.
+
+
+
+

Tags

+

Compact labels keyed to functional colors.

+
+ Primary + Success + Warning + Error + Info +
+
+
+

Alerts & progress

+

Semantic feedback states.

+
+
✓
Brand system generated
All design tokens were derived from a single seed color.
+
ℹ
Tokens map 1:1 onto CSS custom properties.
+
⚠
Wireframe mode is off
Filled surfaces are in use for this theme.
+
✕
Could not reach the source URL.
+
+
+
+
+ 72% +
+
+
+ ✓ +
+
+
+
+

Color

+

The full derived palette and neutrals.

+
+
Primary palette
+
+
+ 50 +
+
+ 200 +
+
+ 300 +
+
+ 400 +
+
+ 500 +
+
+ 600 +
+
+ 700 +
+
+ 800 +
+
+ 900 +
+
+ 1050 +
+
+
Functional
+
+
+ primary +
+
+ success +
+
+ warning +
+
+ error +
+
+ info +
+
+
Neutral text
+
+
+ text +
+
+ text/2 +
+
+ text/3 +
+
+ text/4 +
+
+
Surfaces & borders
+
+
+ layout +
+
+ container +
+
+ elevated +
+
+ border +
+
+ border/2 +
+
+
+
+

Type scale

+

A modular ramp derived from the base font size.

+
+ Heading 1 · 38px + The quick brown fox +
+ Heading 2 · 32px + The quick brown fox +
+ Heading 3 · 26px + The quick brown fox +
+ Heading 4 · 22px + The quick brown fox +
+ Heading 5 · 18px + The quick brown fox +
+ Large · 18px + The quick brown fox +
+ Body · 14px + The quick brown fox +
+ Small · 12px + The quick brown fox +
+
+
+ + \ No newline at end of file diff --git a/.design/system/kit.html b/.design/system/kit.html new file mode 100644 index 0000000..2798746 --- /dev/null +++ b/.design/system/kit.html @@ -0,0 +1,587 @@ + + + + + + +Malenia — component kit + + + + + + + +
+
+
Malenia · default theme
+

Malenia — component kit

+

Every component below is colored only by var(--brand-*) custom properties derived from one seed.

+
+ +
+

Buttons

+

Five types across three sizes.

+ +
+ Small + Medium + Large +
+
+
+

Form controls

+

Inputs, selects, textareas, checkboxes and switches share control height, radius and focus ring.

+
+
+
+
+
+
+
+ + + Notifications + Public profile +
+
+
+

Navigation

+

Tabs, breadcrumbs, pagination and steps for app shells and flows.

+
OverviewAnalyticsReportsSettings
+
+ +
‹12345›
+
+
+
✓
Connect
Point at a source
2
Derive
Seed to tokens
3
Ship
Export everywhere
+
+
+
+

Cards

+

Elevated content surfaces with optional header & footer.

+
+
Overview
Cards group related content on an elevated surface. Radius, border and shadow all read from the derived tokens.
+
Usage
Drop the same component into a dark or compact theme and it re-skins automatically — no per-variant markup.
+
A bodyonly card. live beta
+
+
+
+

Data display

+

Tables, stats, avatars and a no-JS accordion for structured content.

+
TokenRoleValue
colorPrimaryBrand accentseed
fontSizeBody type basederived
borderRadiusCorner roundingderived
+
+
+
10k+
+
Teams onboard
+
+
+
99.9%
+
Uptime SLA
+
+
+
4.9/5
+
Average rating
+
+
+
+ M + AL + TB + design ops +
+
+
+ What is a seed token?+ +
The ~20-field input every other token is derived from. Change one field and the whole system follows.
+
+
+ Can I theme dark mode separately?+ +
No need — dark is the same seed run through a different algorithm, so it can never drift from the light theme.
+
+
+
+
+

Marketing blocks

+

Testimonials and pricing compose the primitives — landing pages are these in the right order.

+
+

“We replaced three hand-maintained style guides with one generated system.”

+
+ AL +
+
Ada Lovelace
+
Design lead
+
+
+
+
+ Pro + Most popular +
+

For growing teams.

+
+ $29 + / mo +
+
  • ✓Unlimited brands
  • ✓Dark & compact themes
  • ✓Priority support
+ +
+
Composable
Marketing blocks (testimonials, pricing, stats) compose the same primitives — so a landing page is just kit pieces in the right order.
+
+
+
+

Tags

+

Compact labels keyed to functional colors.

+
+ Primary + Success + Warning + Error + Info +
+
+
+

Alerts & progress

+

Semantic feedback states.

+
+
✓
Brand system generated
All design tokens were derived from a single seed color.
+
ℹ
Tokens map 1:1 onto CSS custom properties.
+
⚠
Wireframe mode is off
Filled surfaces are in use for this theme.
+
✕
Could not reach the source URL.
+
+
+
+
+ 72% +
+
+
+ ✓ +
+
+
+
+

Color

+

The full derived palette and neutrals.

+
+
Primary palette
+
+
+ 50 +
+
+ 200 +
+
+ 300 +
+
+ 400 +
+
+ 500 +
+
+ 600 +
+
+ 700 +
+
+ 800 +
+
+ 900 +
+
+ 1050 +
+
+
Functional
+
+
+ primary +
+
+ success +
+
+ warning +
+
+ error +
+
+ info +
+
+
Neutral text
+
+
+ text +
+
+ text/2 +
+
+ text/3 +
+
+ text/4 +
+
+
Surfaces & borders
+
+
+ layout +
+
+ container +
+
+ elevated +
+
+ border +
+
+ border/2 +
+
+
+
+

Type scale

+

A modular ramp derived from the base font size.

+
+ Heading 1 · 38px + The quick brown fox +
+ Heading 2 · 32px + The quick brown fox +
+ Heading 3 · 26px + The quick brown fox +
+ Heading 4 · 22px + The quick brown fox +
+ Heading 5 · 18px + The quick brown fox +
+ Large · 18px + The quick brown fox +
+ Body · 14px + The quick brown fox +
+ Small · 12px + The quick brown fox +
+
+
+ + \ No newline at end of file diff --git a/.design/system/scripts/apply-design-tokens.mjs b/.design/system/scripts/apply-design-tokens.mjs new file mode 100644 index 0000000..2c92238 --- /dev/null +++ b/.design/system/scripts/apply-design-tokens.mjs @@ -0,0 +1,17 @@ +#!/usr/bin/env node +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const target = process.argv[2]; +if (!target) { + console.error('Usage: node scripts/apply-design-tokens.mjs '); + process.exit(1); +} + +const here = path.dirname(fileURLToPath(import.meta.url)); +const source = path.resolve(here, '..', 'variables.css'); +const destination = path.resolve(process.cwd(), target); +fs.mkdirSync(path.dirname(destination), { recursive: true }); +fs.copyFileSync(source, destination); +console.log(`Copied design tokens to ${destination}`); diff --git a/.design/system/seed.json b/.design/system/seed.json new file mode 100644 index 0000000..da0471f --- /dev/null +++ b/.design/system/seed.json @@ -0,0 +1,22 @@ +{ + "colorPrimary": "#c9a84c", + "colorSuccess": "#52c41a", + "colorWarning": "#faad14", + "colorError": "#ff4d4f", + "colorInfo": "#c9a84c", + "colorLink": "", + "colorTextBase": "#1a1610", + "colorBgBase": "#faf7f2", + "fontFamily": "'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'", + "fontFamilyCode": "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace", + "fontSize": 14, + "borderRadius": 8, + "sizeUnit": 4, + "sizeStep": 4, + "controlHeight": 32, + "lineWidth": 1, + "motionUnit": 0.1, + "motionBase": 0, + "wireframe": false, + "motion": true +} \ No newline at end of file diff --git a/.design/system/theme.json b/.design/system/theme.json new file mode 100644 index 0000000..7c2f59b --- /dev/null +++ b/.design/system/theme.json @@ -0,0 +1,24 @@ +{ + "token": { + "colorPrimary": "#c9a84c", + "colorSuccess": "#52c41a", + "colorWarning": "#faad14", + "colorError": "#ff4d4f", + "colorInfo": "#c9a84c", + "colorTextBase": "#1a1610", + "colorBgBase": "#faf7f2", + "fontFamily": "'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'", + "fontFamilyCode": "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace", + "fontSize": 14, + "borderRadius": 8, + "sizeUnit": 4, + "sizeStep": 4, + "controlHeight": 32, + "lineWidth": 1, + "motionUnit": 0.1, + "motionBase": 0, + "wireframe": false, + "motion": true + }, + "algorithm": "default" +} \ No newline at end of file diff --git a/.design/system/tokens.compact.json b/.design/system/tokens.compact.json new file mode 100644 index 0000000..f543300 --- /dev/null +++ b/.design/system/tokens.compact.json @@ -0,0 +1,251 @@ +{ + "algorithm": "compact", + "colorPrimary": "#c9a84c", + "colorPrimaryBg": "#fffef0", + "colorPrimaryBgHover": "#fcfaed", + "colorPrimaryBorder": "#f0eace", + "colorPrimaryBorderHover": "#e3d69f", + "colorPrimaryHover": "#d6bf74", + "colorPrimaryActive": "#a38336", + "colorPrimaryText": "#573e14", + "colorSuccess": "#52c41a", + "colorSuccessBg": "#f6ffed", + "colorSuccessBorder": "#b6eb8f", + "colorSuccessHover": "#72d13d", + "colorSuccessActive": "#389e0d", + "colorWarning": "#faad14", + "colorWarningBg": "#fffbe6", + "colorWarningBorder": "#ffe58f", + "colorWarningHover": "#ffc53d", + "colorWarningActive": "#d48806", + "colorError": "#ff4d4f", + "colorErrorBg": "#fff2f0", + "colorErrorBorder": "#ffccc7", + "colorErrorHover": "#ff7875", + "colorErrorActive": "#d9363d", + "colorInfo": "#c9a84c", + "colorInfoBg": "#fffef0", + "colorInfoBorder": "#f0eace", + "colorLink": "#c9a84c", + "colorLinkHover": "#d6bf74", + "colorLinkActive": "#a38336", + "colorText": "#35312b", + "colorTextSecondary": "#68655f", + "colorTextTertiary": "#95928c", + "colorTextQuaternary": "#c2bfba", + "colorFill": "#d8d5d0", + "colorFillSecondary": "#ede9e4", + "colorFillTertiary": "#f1eee9", + "colorFillQuaternary": "#f6f3ed", + "colorBgLayout": "#f1eee9", + "colorBgContainer": "#faf7f2", + "colorBgElevated": "#faf7f2", + "colorBorder": "#d8d5d0", + "colorBorderSecondary": "#ede9e4", + "fontFamily": "'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'", + "fontFamilyCode": "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace", + "fontSize": 14, + "fontSizeSM": 12, + "fontSizeLG": 18, + "fontSizeXL": 22, + "fontSizeHeading1": 38, + "fontSizeHeading2": 32, + "fontSizeHeading3": 26, + "fontSizeHeading4": 22, + "fontSizeHeading5": 18, + "lineHeight": 1.5714285714285714, + "lineHeightHeading": 1.25, + "fontWeightStrong": 600, + "sizeXXS": 4, + "sizeXS": 8, + "sizeSM": 8, + "size": 12, + "sizeMD": 16, + "sizeLG": 16, + "sizeXL": 24, + "sizeXXL": 32, + "borderRadiusXS": 3, + "borderRadiusSM": 5, + "borderRadius": 8, + "borderRadiusLG": 10, + "lineWidth": 1, + "controlHeightXS": 14, + "controlHeightSM": 21, + "controlHeight": 28, + "controlHeightLG": 35, + "motionDurationFast": "0.1s", + "motionDurationMid": "0.2s", + "motionDurationSlow": "0.3s", + "motionEaseInOut": "cubic-bezier(0.645, 0.045, 0.355, 1)", + "motionEaseOut": "cubic-bezier(0.215, 0.61, 0.355, 1)", + "primaryPalette": [ + "#fffef0", + "#fcfaed", + "#f0eace", + "#e3d69f", + "#d6bf74", + "#c9a84c", + "#a38336", + "#7d5f23", + "#573e14", + "#30210b" + ], + "presets": { + "red": [ + "#fff1f0", + "#ffcbc7", + "#ffa39e", + "#ff7775", + "#ff4d50", + "#f5222d", + "#cf1323", + "#a8071a", + "#820014", + "#5c0011" + ], + "volcano": [ + "#fff2e8", + "#ffd8bf", + "#ffbb96", + "#ff9c6e", + "#ff7a45", + "#fa541c", + "#d4380d", + "#ad2202", + "#871500", + "#610c00" + ], + "orange": [ + "#fff7e6", + "#ffe7ba", + "#ffd591", + "#ffc069", + "#ffa940", + "#fa8c16", + "#d46b08", + "#ad4e00", + "#873800", + "#612500" + ], + "gold": [ + "#fffbe6", + "#fff1b8", + "#ffe58f", + "#ffd666", + "#ffc53d", + "#faad14", + "#d48806", + "#ad6800", + "#874c00", + "#613400" + ], + "yellow": [ + "#feffe6", + "#ffffb8", + "#fffb8f", + "#fff566", + "#ffeb3d", + "#fadb14", + "#d4b106", + "#ad8a00", + "#876700", + "#614700" + ], + "lime": [ + "#fcffe6", + "#f4ffb8", + "#eaff8f", + "#d3f261", + "#bae637", + "#a0d911", + "#7bb305", + "#5b8c00", + "#3f6600", + "#254000" + ], + "green": [ + "#f6ffed", + "#d9f7be", + "#b6eb8f", + "#94de64", + "#72d13d", + "#52c41a", + "#389e0d", + "#227804", + "#135200", + "#092b00" + ], + "cyan": [ + "#e6fffb", + "#b5f5ec", + "#87e8de", + "#5cdbd3", + "#36cfc9", + "#13c2c2", + "#08979c", + "#006d75", + "#00474f", + "#002329" + ], + "blue": [ + "#e6f4ff", + "#bae0ff", + "#91caff", + "#69b1ff", + "#4096ff", + "#1677ff", + "#0958d9", + "#003eb3", + "#002c8c", + "#001d66" + ], + "geekblue": [ + "#f0f5ff", + "#d6e4ff", + "#adc6ff", + "#85a5ff", + "#597df7", + "#2f54eb", + "#1d39c4", + "#10229e", + "#061178", + "#030852" + ], + "purple": [ + "#f9f0ff", + "#efdbff", + "#d4adf7", + "#b37feb", + "#9254de", + "#722ed1", + "#531dab", + "#391085", + "#22075e", + "#120338" + ], + "magenta": [ + "#fff0f6", + "#ffd6e7", + "#ffadd2", + "#ff85bf", + "#f759aa", + "#eb2f96", + "#c41d7e", + "#9e1067", + "#780650", + "#520339" + ], + "grey": [ + "#a6a6a6", + "#999999", + "#8c8c8c", + "#808080", + "#737373", + "#666666", + "#404040", + "#1a1a1a", + "#000000", + "#000000" + ] + } +} \ No newline at end of file diff --git a/.design/system/tokens.dark.json b/.design/system/tokens.dark.json new file mode 100644 index 0000000..3f58e1c --- /dev/null +++ b/.design/system/tokens.dark.json @@ -0,0 +1,251 @@ +{ + "algorithm": "dark", + "colorPrimary": "#b9a566", + "colorPrimaryBg": "#292519", + "colorPrimaryBgHover": "#413922", + "colorPrimaryBorder": "#4e4731", + "colorPrimaryBorderHover": "#6b613f", + "colorPrimaryHover": "#cec391", + "colorPrimaryActive": "#928352", + "colorPrimaryText": "#f5f3e6", + "colorSuccess": "#64b537", + "colorSuccessBg": "#192913", + "colorSuccessBorder": "#304d20", + "colorSuccessHover": "#87ca5c", + "colorSuccessActive": "#518f2f", + "colorWarning": "#dcaa37", + "colorWarningBg": "#312512", + "colorWarningBorder": "#5b4920", + "colorWarningHover": "#e8c35e", + "colorWarningActive": "#ad872f", + "colorError": "#dc6966", + "colorErrorBg": "#32191a", + "colorErrorBorder": "#5b3231", + "colorErrorHover": "#e89590", + "colorErrorActive": "#ad5553", + "colorInfo": "#b9a566", + "colorInfoBg": "#292519", + "colorInfoBorder": "#4e4731", + "colorLink": "#b9a566", + "colorLinkHover": "#cec391", + "colorLinkActive": "#928352", + "colorText": "#dcdcdc", + "colorTextSecondary": "#adadad", + "colorTextTertiary": "#7e7e7e", + "colorTextQuaternary": "#4f4f4f", + "colorFill": "#3e3e3e", + "colorFillSecondary": "#303030", + "colorFillTertiary": "#272727", + "colorFillQuaternary": "#1d1d1d", + "colorBgLayout": "#1d1d1d", + "colorBgContainer": "#141414", + "colorBgElevated": "#272727", + "colorBorder": "#3e3e3e", + "colorBorderSecondary": "#303030", + "fontFamily": "'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'", + "fontFamilyCode": "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace", + "fontSize": 14, + "fontSizeSM": 12, + "fontSizeLG": 18, + "fontSizeXL": 22, + "fontSizeHeading1": 38, + "fontSizeHeading2": 32, + "fontSizeHeading3": 26, + "fontSizeHeading4": 22, + "fontSizeHeading5": 18, + "lineHeight": 1.5714285714285714, + "lineHeightHeading": 1.25, + "fontWeightStrong": 600, + "sizeXXS": 4, + "sizeXS": 8, + "sizeSM": 12, + "size": 16, + "sizeMD": 20, + "sizeLG": 24, + "sizeXL": 32, + "sizeXXL": 48, + "borderRadiusXS": 3, + "borderRadiusSM": 5, + "borderRadius": 8, + "borderRadiusLG": 10, + "lineWidth": 1, + "controlHeightXS": 16, + "controlHeightSM": 24, + "controlHeight": 32, + "controlHeightLG": 40, + "motionDurationFast": "0.1s", + "motionDurationMid": "0.2s", + "motionDurationSlow": "0.3s", + "motionEaseInOut": "cubic-bezier(0.645, 0.045, 0.355, 1)", + "motionEaseOut": "cubic-bezier(0.215, 0.61, 0.355, 1)", + "primaryPalette": [ + "#292519", + "#413922", + "#4e4731", + "#6b613f", + "#928352", + "#b9a566", + "#cec391", + "#e5dfc5", + "#f5f3e6", + "#faf9ec" + ], + "presets": { + "red": [ + "#fff1f0", + "#ffcbc7", + "#ffa39e", + "#ff7775", + "#ff4d50", + "#f5222d", + "#cf1323", + "#a8071a", + "#820014", + "#5c0011" + ], + "volcano": [ + "#fff2e8", + "#ffd8bf", + "#ffbb96", + "#ff9c6e", + "#ff7a45", + "#fa541c", + "#d4380d", + "#ad2202", + "#871500", + "#610c00" + ], + "orange": [ + "#fff7e6", + "#ffe7ba", + "#ffd591", + "#ffc069", + "#ffa940", + "#fa8c16", + "#d46b08", + "#ad4e00", + "#873800", + "#612500" + ], + "gold": [ + "#fffbe6", + "#fff1b8", + "#ffe58f", + "#ffd666", + "#ffc53d", + "#faad14", + "#d48806", + "#ad6800", + "#874c00", + "#613400" + ], + "yellow": [ + "#feffe6", + "#ffffb8", + "#fffb8f", + "#fff566", + "#ffeb3d", + "#fadb14", + "#d4b106", + "#ad8a00", + "#876700", + "#614700" + ], + "lime": [ + "#fcffe6", + "#f4ffb8", + "#eaff8f", + "#d3f261", + "#bae637", + "#a0d911", + "#7bb305", + "#5b8c00", + "#3f6600", + "#254000" + ], + "green": [ + "#f6ffed", + "#d9f7be", + "#b6eb8f", + "#94de64", + "#72d13d", + "#52c41a", + "#389e0d", + "#227804", + "#135200", + "#092b00" + ], + "cyan": [ + "#e6fffb", + "#b5f5ec", + "#87e8de", + "#5cdbd3", + "#36cfc9", + "#13c2c2", + "#08979c", + "#006d75", + "#00474f", + "#002329" + ], + "blue": [ + "#e6f4ff", + "#bae0ff", + "#91caff", + "#69b1ff", + "#4096ff", + "#1677ff", + "#0958d9", + "#003eb3", + "#002c8c", + "#001d66" + ], + "geekblue": [ + "#f0f5ff", + "#d6e4ff", + "#adc6ff", + "#85a5ff", + "#597df7", + "#2f54eb", + "#1d39c4", + "#10229e", + "#061178", + "#030852" + ], + "purple": [ + "#f9f0ff", + "#efdbff", + "#d4adf7", + "#b37feb", + "#9254de", + "#722ed1", + "#531dab", + "#391085", + "#22075e", + "#120338" + ], + "magenta": [ + "#fff0f6", + "#ffd6e7", + "#ffadd2", + "#ff85bf", + "#f759aa", + "#eb2f96", + "#c41d7e", + "#9e1067", + "#780650", + "#520339" + ], + "grey": [ + "#a6a6a6", + "#999999", + "#8c8c8c", + "#808080", + "#737373", + "#666666", + "#404040", + "#1a1a1a", + "#000000", + "#000000" + ] + } +} \ No newline at end of file diff --git a/.design/system/tokens.default.json b/.design/system/tokens.default.json new file mode 100644 index 0000000..add9285 --- /dev/null +++ b/.design/system/tokens.default.json @@ -0,0 +1,251 @@ +{ + "algorithm": "default", + "colorPrimary": "#c9a84c", + "colorPrimaryBg": "#fffef0", + "colorPrimaryBgHover": "#fcfaed", + "colorPrimaryBorder": "#f0eace", + "colorPrimaryBorderHover": "#e3d69f", + "colorPrimaryHover": "#d6bf74", + "colorPrimaryActive": "#a38336", + "colorPrimaryText": "#573e14", + "colorSuccess": "#52c41a", + "colorSuccessBg": "#f6ffed", + "colorSuccessBorder": "#b6eb8f", + "colorSuccessHover": "#72d13d", + "colorSuccessActive": "#389e0d", + "colorWarning": "#faad14", + "colorWarningBg": "#fffbe6", + "colorWarningBorder": "#ffe58f", + "colorWarningHover": "#ffc53d", + "colorWarningActive": "#d48806", + "colorError": "#ff4d4f", + "colorErrorBg": "#fff2f0", + "colorErrorBorder": "#ffccc7", + "colorErrorHover": "#ff7875", + "colorErrorActive": "#d9363d", + "colorInfo": "#c9a84c", + "colorInfoBg": "#fffef0", + "colorInfoBorder": "#f0eace", + "colorLink": "#c9a84c", + "colorLinkHover": "#d6bf74", + "colorLinkActive": "#a38336", + "colorText": "#35312b", + "colorTextSecondary": "#68655f", + "colorTextTertiary": "#95928c", + "colorTextQuaternary": "#c2bfba", + "colorFill": "#d8d5d0", + "colorFillSecondary": "#ede9e4", + "colorFillTertiary": "#f1eee9", + "colorFillQuaternary": "#f6f3ed", + "colorBgLayout": "#f1eee9", + "colorBgContainer": "#faf7f2", + "colorBgElevated": "#faf7f2", + "colorBorder": "#d8d5d0", + "colorBorderSecondary": "#ede9e4", + "fontFamily": "'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'", + "fontFamilyCode": "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace", + "fontSize": 14, + "fontSizeSM": 12, + "fontSizeLG": 18, + "fontSizeXL": 22, + "fontSizeHeading1": 38, + "fontSizeHeading2": 32, + "fontSizeHeading3": 26, + "fontSizeHeading4": 22, + "fontSizeHeading5": 18, + "lineHeight": 1.5714285714285714, + "lineHeightHeading": 1.25, + "fontWeightStrong": 600, + "sizeXXS": 4, + "sizeXS": 8, + "sizeSM": 12, + "size": 16, + "sizeMD": 20, + "sizeLG": 24, + "sizeXL": 32, + "sizeXXL": 48, + "borderRadiusXS": 3, + "borderRadiusSM": 5, + "borderRadius": 8, + "borderRadiusLG": 10, + "lineWidth": 1, + "controlHeightXS": 16, + "controlHeightSM": 24, + "controlHeight": 32, + "controlHeightLG": 40, + "motionDurationFast": "0.1s", + "motionDurationMid": "0.2s", + "motionDurationSlow": "0.3s", + "motionEaseInOut": "cubic-bezier(0.645, 0.045, 0.355, 1)", + "motionEaseOut": "cubic-bezier(0.215, 0.61, 0.355, 1)", + "primaryPalette": [ + "#fffef0", + "#fcfaed", + "#f0eace", + "#e3d69f", + "#d6bf74", + "#c9a84c", + "#a38336", + "#7d5f23", + "#573e14", + "#30210b" + ], + "presets": { + "red": [ + "#fff1f0", + "#ffcbc7", + "#ffa39e", + "#ff7775", + "#ff4d50", + "#f5222d", + "#cf1323", + "#a8071a", + "#820014", + "#5c0011" + ], + "volcano": [ + "#fff2e8", + "#ffd8bf", + "#ffbb96", + "#ff9c6e", + "#ff7a45", + "#fa541c", + "#d4380d", + "#ad2202", + "#871500", + "#610c00" + ], + "orange": [ + "#fff7e6", + "#ffe7ba", + "#ffd591", + "#ffc069", + "#ffa940", + "#fa8c16", + "#d46b08", + "#ad4e00", + "#873800", + "#612500" + ], + "gold": [ + "#fffbe6", + "#fff1b8", + "#ffe58f", + "#ffd666", + "#ffc53d", + "#faad14", + "#d48806", + "#ad6800", + "#874c00", + "#613400" + ], + "yellow": [ + "#feffe6", + "#ffffb8", + "#fffb8f", + "#fff566", + "#ffeb3d", + "#fadb14", + "#d4b106", + "#ad8a00", + "#876700", + "#614700" + ], + "lime": [ + "#fcffe6", + "#f4ffb8", + "#eaff8f", + "#d3f261", + "#bae637", + "#a0d911", + "#7bb305", + "#5b8c00", + "#3f6600", + "#254000" + ], + "green": [ + "#f6ffed", + "#d9f7be", + "#b6eb8f", + "#94de64", + "#72d13d", + "#52c41a", + "#389e0d", + "#227804", + "#135200", + "#092b00" + ], + "cyan": [ + "#e6fffb", + "#b5f5ec", + "#87e8de", + "#5cdbd3", + "#36cfc9", + "#13c2c2", + "#08979c", + "#006d75", + "#00474f", + "#002329" + ], + "blue": [ + "#e6f4ff", + "#bae0ff", + "#91caff", + "#69b1ff", + "#4096ff", + "#1677ff", + "#0958d9", + "#003eb3", + "#002c8c", + "#001d66" + ], + "geekblue": [ + "#f0f5ff", + "#d6e4ff", + "#adc6ff", + "#85a5ff", + "#597df7", + "#2f54eb", + "#1d39c4", + "#10229e", + "#061178", + "#030852" + ], + "purple": [ + "#f9f0ff", + "#efdbff", + "#d4adf7", + "#b37feb", + "#9254de", + "#722ed1", + "#531dab", + "#391085", + "#22075e", + "#120338" + ], + "magenta": [ + "#fff0f6", + "#ffd6e7", + "#ffadd2", + "#ff85bf", + "#f759aa", + "#eb2f96", + "#c41d7e", + "#9e1067", + "#780650", + "#520339" + ], + "grey": [ + "#a6a6a6", + "#999999", + "#8c8c8c", + "#808080", + "#737373", + "#666666", + "#404040", + "#1a1a1a", + "#000000", + "#000000" + ] + } +} \ No newline at end of file diff --git a/.design/system/variables.css b/.design/system/variables.css new file mode 100644 index 0000000..6094369 --- /dev/null +++ b/.design/system/variables.css @@ -0,0 +1,441 @@ +:root { + --brand-color-primary: #c9a84c; + --brand-color-primary-bg: #fffef0; + --brand-color-primary-bg-hover: #fcfaed; + --brand-color-primary-border: #f0eace; + --brand-color-primary-border-hover: #e3d69f; + --brand-color-primary-hover: #d6bf74; + --brand-color-primary-active: #a38336; + --brand-color-primary-text: #573e14; + --brand-color-success: #52c41a; + --brand-color-success-bg: #f6ffed; + --brand-color-success-border: #b6eb8f; + --brand-color-success-hover: #72d13d; + --brand-color-success-active: #389e0d; + --brand-color-warning: #faad14; + --brand-color-warning-bg: #fffbe6; + --brand-color-warning-border: #ffe58f; + --brand-color-warning-hover: #ffc53d; + --brand-color-warning-active: #d48806; + --brand-color-error: #ff4d4f; + --brand-color-error-bg: #fff2f0; + --brand-color-error-border: #ffccc7; + --brand-color-error-hover: #ff7875; + --brand-color-error-active: #d9363d; + --brand-color-info: #c9a84c; + --brand-color-info-bg: #fffef0; + --brand-color-info-border: #f0eace; + --brand-color-link: #c9a84c; + --brand-color-link-hover: #d6bf74; + --brand-color-link-active: #a38336; + --brand-color-text: #35312b; + --brand-color-text-secondary: #68655f; + --brand-color-text-tertiary: #95928c; + --brand-color-text-quaternary: #c2bfba; + --brand-color-fill: #d8d5d0; + --brand-color-fill-secondary: #ede9e4; + --brand-color-fill-tertiary: #f1eee9; + --brand-color-fill-quaternary: #f6f3ed; + --brand-color-bg-layout: #f1eee9; + --brand-color-bg-container: #faf7f2; + --brand-color-bg-elevated: #faf7f2; + --brand-color-border: #d8d5d0; + --brand-color-border-secondary: #ede9e4; + --brand-font-family: 'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --brand-font-family-code: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; + --brand-font-size: 14px; + --brand-font-size-sm: 12px; + --brand-font-size-lg: 18px; + --brand-font-size-xl: 22px; + --brand-font-size-heading-1: 38px; + --brand-font-size-heading-2: 32px; + --brand-font-size-heading-3: 26px; + --brand-font-size-heading-4: 22px; + --brand-font-size-heading-5: 18px; + --brand-line-height: 1.5714285714285714; + --brand-line-height-heading: 1.25; + --brand-font-weight-strong: 600; + --brand-size-xxs: 4px; + --brand-size-xs: 8px; + --brand-size-sm: 12px; + --brand-size: 16px; + --brand-size-md: 20px; + --brand-size-lg: 24px; + --brand-size-xl: 32px; + --brand-size-xxl: 48px; + --brand-border-radius-xs: 3px; + --brand-border-radius-sm: 5px; + --brand-border-radius: 8px; + --brand-border-radius-lg: 10px; + --brand-line-width: 1px; + --brand-control-height-xs: 16px; + --brand-control-height-sm: 24px; + --brand-control-height: 32px; + --brand-control-height-lg: 40px; + --brand-motion-duration-fast: 0.1s; + --brand-motion-duration-mid: 0.2s; + --brand-motion-duration-slow: 0.3s; + --brand-motion-ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1); + --brand-motion-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); + --brand-primary-palette-1: #fffef0; + --brand-primary-palette-2: #fcfaed; + --brand-primary-palette-3: #f0eace; + --brand-primary-palette-4: #e3d69f; + --brand-primary-palette-5: #d6bf74; + --brand-primary-palette-6: #c9a84c; + --brand-primary-palette-7: #a38336; + --brand-primary-palette-8: #7d5f23; + --brand-primary-palette-9: #573e14; + --brand-primary-palette-10: #30210b; + --brand-presets-red-1: #fff1f0; + --brand-presets-red-2: #ffcbc7; + --brand-presets-red-3: #ffa39e; + --brand-presets-red-4: #ff7775; + --brand-presets-red-5: #ff4d50; + --brand-presets-red-6: #f5222d; + --brand-presets-red-7: #cf1323; + --brand-presets-red-8: #a8071a; + --brand-presets-red-9: #820014; + --brand-presets-red-10: #5c0011; + --brand-presets-volcano-1: #fff2e8; + --brand-presets-volcano-2: #ffd8bf; + --brand-presets-volcano-3: #ffbb96; + --brand-presets-volcano-4: #ff9c6e; + --brand-presets-volcano-5: #ff7a45; + --brand-presets-volcano-6: #fa541c; + --brand-presets-volcano-7: #d4380d; + --brand-presets-volcano-8: #ad2202; + --brand-presets-volcano-9: #871500; + --brand-presets-volcano-10: #610c00; + --brand-presets-orange-1: #fff7e6; + --brand-presets-orange-2: #ffe7ba; + --brand-presets-orange-3: #ffd591; + --brand-presets-orange-4: #ffc069; + --brand-presets-orange-5: #ffa940; + --brand-presets-orange-6: #fa8c16; + --brand-presets-orange-7: #d46b08; + --brand-presets-orange-8: #ad4e00; + --brand-presets-orange-9: #873800; + --brand-presets-orange-10: #612500; + --brand-presets-gold-1: #fffbe6; + --brand-presets-gold-2: #fff1b8; + --brand-presets-gold-3: #ffe58f; + --brand-presets-gold-4: #ffd666; + --brand-presets-gold-5: #ffc53d; + --brand-presets-gold-6: #faad14; + --brand-presets-gold-7: #d48806; + --brand-presets-gold-8: #ad6800; + --brand-presets-gold-9: #874c00; + --brand-presets-gold-10: #613400; + --brand-presets-yellow-1: #feffe6; + --brand-presets-yellow-2: #ffffb8; + --brand-presets-yellow-3: #fffb8f; + --brand-presets-yellow-4: #fff566; + --brand-presets-yellow-5: #ffeb3d; + --brand-presets-yellow-6: #fadb14; + --brand-presets-yellow-7: #d4b106; + --brand-presets-yellow-8: #ad8a00; + --brand-presets-yellow-9: #876700; + --brand-presets-yellow-10: #614700; + --brand-presets-lime-1: #fcffe6; + --brand-presets-lime-2: #f4ffb8; + --brand-presets-lime-3: #eaff8f; + --brand-presets-lime-4: #d3f261; + --brand-presets-lime-5: #bae637; + --brand-presets-lime-6: #a0d911; + --brand-presets-lime-7: #7bb305; + --brand-presets-lime-8: #5b8c00; + --brand-presets-lime-9: #3f6600; + --brand-presets-lime-10: #254000; + --brand-presets-green-1: #f6ffed; + --brand-presets-green-2: #d9f7be; + --brand-presets-green-3: #b6eb8f; + --brand-presets-green-4: #94de64; + --brand-presets-green-5: #72d13d; + --brand-presets-green-6: #52c41a; + --brand-presets-green-7: #389e0d; + --brand-presets-green-8: #227804; + --brand-presets-green-9: #135200; + --brand-presets-green-10: #092b00; + --brand-presets-cyan-1: #e6fffb; + --brand-presets-cyan-2: #b5f5ec; + --brand-presets-cyan-3: #87e8de; + --brand-presets-cyan-4: #5cdbd3; + --brand-presets-cyan-5: #36cfc9; + --brand-presets-cyan-6: #13c2c2; + --brand-presets-cyan-7: #08979c; + --brand-presets-cyan-8: #006d75; + --brand-presets-cyan-9: #00474f; + --brand-presets-cyan-10: #002329; + --brand-presets-blue-1: #e6f4ff; + --brand-presets-blue-2: #bae0ff; + --brand-presets-blue-3: #91caff; + --brand-presets-blue-4: #69b1ff; + --brand-presets-blue-5: #4096ff; + --brand-presets-blue-6: #1677ff; + --brand-presets-blue-7: #0958d9; + --brand-presets-blue-8: #003eb3; + --brand-presets-blue-9: #002c8c; + --brand-presets-blue-10: #001d66; + --brand-presets-geekblue-1: #f0f5ff; + --brand-presets-geekblue-2: #d6e4ff; + --brand-presets-geekblue-3: #adc6ff; + --brand-presets-geekblue-4: #85a5ff; + --brand-presets-geekblue-5: #597df7; + --brand-presets-geekblue-6: #2f54eb; + --brand-presets-geekblue-7: #1d39c4; + --brand-presets-geekblue-8: #10229e; + --brand-presets-geekblue-9: #061178; + --brand-presets-geekblue-10: #030852; + --brand-presets-purple-1: #f9f0ff; + --brand-presets-purple-2: #efdbff; + --brand-presets-purple-3: #d4adf7; + --brand-presets-purple-4: #b37feb; + --brand-presets-purple-5: #9254de; + --brand-presets-purple-6: #722ed1; + --brand-presets-purple-7: #531dab; + --brand-presets-purple-8: #391085; + --brand-presets-purple-9: #22075e; + --brand-presets-purple-10: #120338; + --brand-presets-magenta-1: #fff0f6; + --brand-presets-magenta-2: #ffd6e7; + --brand-presets-magenta-3: #ffadd2; + --brand-presets-magenta-4: #ff85bf; + --brand-presets-magenta-5: #f759aa; + --brand-presets-magenta-6: #eb2f96; + --brand-presets-magenta-7: #c41d7e; + --brand-presets-magenta-8: #9e1067; + --brand-presets-magenta-9: #780650; + --brand-presets-magenta-10: #520339; + --brand-presets-grey-1: #a6a6a6; + --brand-presets-grey-2: #999999; + --brand-presets-grey-3: #8c8c8c; + --brand-presets-grey-4: #808080; + --brand-presets-grey-5: #737373; + --brand-presets-grey-6: #666666; + --brand-presets-grey-7: #404040; + --brand-presets-grey-8: #1a1a1a; + --brand-presets-grey-9: #000000; + --brand-presets-grey-10: #000000; +} + +.dark { + --brand-color-primary: #b9a566; + --brand-color-primary-bg: #292519; + --brand-color-primary-bg-hover: #413922; + --brand-color-primary-border: #4e4731; + --brand-color-primary-border-hover: #6b613f; + --brand-color-primary-hover: #cec391; + --brand-color-primary-active: #928352; + --brand-color-primary-text: #f5f3e6; + --brand-color-success: #64b537; + --brand-color-success-bg: #192913; + --brand-color-success-border: #304d20; + --brand-color-success-hover: #87ca5c; + --brand-color-success-active: #518f2f; + --brand-color-warning: #dcaa37; + --brand-color-warning-bg: #312512; + --brand-color-warning-border: #5b4920; + --brand-color-warning-hover: #e8c35e; + --brand-color-warning-active: #ad872f; + --brand-color-error: #dc6966; + --brand-color-error-bg: #32191a; + --brand-color-error-border: #5b3231; + --brand-color-error-hover: #e89590; + --brand-color-error-active: #ad5553; + --brand-color-info: #b9a566; + --brand-color-info-bg: #292519; + --brand-color-info-border: #4e4731; + --brand-color-link: #b9a566; + --brand-color-link-hover: #cec391; + --brand-color-link-active: #928352; + --brand-color-text: #dcdcdc; + --brand-color-text-secondary: #adadad; + --brand-color-text-tertiary: #7e7e7e; + --brand-color-text-quaternary: #4f4f4f; + --brand-color-fill: #3e3e3e; + --brand-color-fill-secondary: #303030; + --brand-color-fill-tertiary: #272727; + --brand-color-fill-quaternary: #1d1d1d; + --brand-color-bg-layout: #1d1d1d; + --brand-color-bg-container: #141414; + --brand-color-bg-elevated: #272727; + --brand-color-border: #3e3e3e; + --brand-color-border-secondary: #303030; + --brand-font-family: 'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --brand-font-family-code: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; + --brand-font-size: 14px; + --brand-font-size-sm: 12px; + --brand-font-size-lg: 18px; + --brand-font-size-xl: 22px; + --brand-font-size-heading-1: 38px; + --brand-font-size-heading-2: 32px; + --brand-font-size-heading-3: 26px; + --brand-font-size-heading-4: 22px; + --brand-font-size-heading-5: 18px; + --brand-line-height: 1.5714285714285714; + --brand-line-height-heading: 1.25; + --brand-font-weight-strong: 600; + --brand-size-xxs: 4px; + --brand-size-xs: 8px; + --brand-size-sm: 12px; + --brand-size: 16px; + --brand-size-md: 20px; + --brand-size-lg: 24px; + --brand-size-xl: 32px; + --brand-size-xxl: 48px; + --brand-border-radius-xs: 3px; + --brand-border-radius-sm: 5px; + --brand-border-radius: 8px; + --brand-border-radius-lg: 10px; + --brand-line-width: 1px; + --brand-control-height-xs: 16px; + --brand-control-height-sm: 24px; + --brand-control-height: 32px; + --brand-control-height-lg: 40px; + --brand-motion-duration-fast: 0.1s; + --brand-motion-duration-mid: 0.2s; + --brand-motion-duration-slow: 0.3s; + --brand-motion-ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1); + --brand-motion-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); + --brand-primary-palette-1: #292519; + --brand-primary-palette-2: #413922; + --brand-primary-palette-3: #4e4731; + --brand-primary-palette-4: #6b613f; + --brand-primary-palette-5: #928352; + --brand-primary-palette-6: #b9a566; + --brand-primary-palette-7: #cec391; + --brand-primary-palette-8: #e5dfc5; + --brand-primary-palette-9: #f5f3e6; + --brand-primary-palette-10: #faf9ec; + --brand-presets-red-1: #fff1f0; + --brand-presets-red-2: #ffcbc7; + --brand-presets-red-3: #ffa39e; + --brand-presets-red-4: #ff7775; + --brand-presets-red-5: #ff4d50; + --brand-presets-red-6: #f5222d; + --brand-presets-red-7: #cf1323; + --brand-presets-red-8: #a8071a; + --brand-presets-red-9: #820014; + --brand-presets-red-10: #5c0011; + --brand-presets-volcano-1: #fff2e8; + --brand-presets-volcano-2: #ffd8bf; + --brand-presets-volcano-3: #ffbb96; + --brand-presets-volcano-4: #ff9c6e; + --brand-presets-volcano-5: #ff7a45; + --brand-presets-volcano-6: #fa541c; + --brand-presets-volcano-7: #d4380d; + --brand-presets-volcano-8: #ad2202; + --brand-presets-volcano-9: #871500; + --brand-presets-volcano-10: #610c00; + --brand-presets-orange-1: #fff7e6; + --brand-presets-orange-2: #ffe7ba; + --brand-presets-orange-3: #ffd591; + --brand-presets-orange-4: #ffc069; + --brand-presets-orange-5: #ffa940; + --brand-presets-orange-6: #fa8c16; + --brand-presets-orange-7: #d46b08; + --brand-presets-orange-8: #ad4e00; + --brand-presets-orange-9: #873800; + --brand-presets-orange-10: #612500; + --brand-presets-gold-1: #fffbe6; + --brand-presets-gold-2: #fff1b8; + --brand-presets-gold-3: #ffe58f; + --brand-presets-gold-4: #ffd666; + --brand-presets-gold-5: #ffc53d; + --brand-presets-gold-6: #faad14; + --brand-presets-gold-7: #d48806; + --brand-presets-gold-8: #ad6800; + --brand-presets-gold-9: #874c00; + --brand-presets-gold-10: #613400; + --brand-presets-yellow-1: #feffe6; + --brand-presets-yellow-2: #ffffb8; + --brand-presets-yellow-3: #fffb8f; + --brand-presets-yellow-4: #fff566; + --brand-presets-yellow-5: #ffeb3d; + --brand-presets-yellow-6: #fadb14; + --brand-presets-yellow-7: #d4b106; + --brand-presets-yellow-8: #ad8a00; + --brand-presets-yellow-9: #876700; + --brand-presets-yellow-10: #614700; + --brand-presets-lime-1: #fcffe6; + --brand-presets-lime-2: #f4ffb8; + --brand-presets-lime-3: #eaff8f; + --brand-presets-lime-4: #d3f261; + --brand-presets-lime-5: #bae637; + --brand-presets-lime-6: #a0d911; + --brand-presets-lime-7: #7bb305; + --brand-presets-lime-8: #5b8c00; + --brand-presets-lime-9: #3f6600; + --brand-presets-lime-10: #254000; + --brand-presets-green-1: #f6ffed; + --brand-presets-green-2: #d9f7be; + --brand-presets-green-3: #b6eb8f; + --brand-presets-green-4: #94de64; + --brand-presets-green-5: #72d13d; + --brand-presets-green-6: #52c41a; + --brand-presets-green-7: #389e0d; + --brand-presets-green-8: #227804; + --brand-presets-green-9: #135200; + --brand-presets-green-10: #092b00; + --brand-presets-cyan-1: #e6fffb; + --brand-presets-cyan-2: #b5f5ec; + --brand-presets-cyan-3: #87e8de; + --brand-presets-cyan-4: #5cdbd3; + --brand-presets-cyan-5: #36cfc9; + --brand-presets-cyan-6: #13c2c2; + --brand-presets-cyan-7: #08979c; + --brand-presets-cyan-8: #006d75; + --brand-presets-cyan-9: #00474f; + --brand-presets-cyan-10: #002329; + --brand-presets-blue-1: #e6f4ff; + --brand-presets-blue-2: #bae0ff; + --brand-presets-blue-3: #91caff; + --brand-presets-blue-4: #69b1ff; + --brand-presets-blue-5: #4096ff; + --brand-presets-blue-6: #1677ff; + --brand-presets-blue-7: #0958d9; + --brand-presets-blue-8: #003eb3; + --brand-presets-blue-9: #002c8c; + --brand-presets-blue-10: #001d66; + --brand-presets-geekblue-1: #f0f5ff; + --brand-presets-geekblue-2: #d6e4ff; + --brand-presets-geekblue-3: #adc6ff; + --brand-presets-geekblue-4: #85a5ff; + --brand-presets-geekblue-5: #597df7; + --brand-presets-geekblue-6: #2f54eb; + --brand-presets-geekblue-7: #1d39c4; + --brand-presets-geekblue-8: #10229e; + --brand-presets-geekblue-9: #061178; + --brand-presets-geekblue-10: #030852; + --brand-presets-purple-1: #f9f0ff; + --brand-presets-purple-2: #efdbff; + --brand-presets-purple-3: #d4adf7; + --brand-presets-purple-4: #b37feb; + --brand-presets-purple-5: #9254de; + --brand-presets-purple-6: #722ed1; + --brand-presets-purple-7: #531dab; + --brand-presets-purple-8: #391085; + --brand-presets-purple-9: #22075e; + --brand-presets-purple-10: #120338; + --brand-presets-magenta-1: #fff0f6; + --brand-presets-magenta-2: #ffd6e7; + --brand-presets-magenta-3: #ffadd2; + --brand-presets-magenta-4: #ff85bf; + --brand-presets-magenta-5: #f759aa; + --brand-presets-magenta-6: #eb2f96; + --brand-presets-magenta-7: #c41d7e; + --brand-presets-magenta-8: #9e1067; + --brand-presets-magenta-9: #780650; + --brand-presets-magenta-10: #520339; + --brand-presets-grey-1: #a6a6a6; + --brand-presets-grey-2: #999999; + --brand-presets-grey-3: #8c8c8c; + --brand-presets-grey-4: #808080; + --brand-presets-grey-5: #737373; + --brand-presets-grey-6: #666666; + --brand-presets-grey-7: #404040; + --brand-presets-grey-8: #1a1a1a; + --brand-presets-grey-9: #000000; + --brand-presets-grey-10: #000000; +} diff --git a/.design/system/variables.dark.css b/.design/system/variables.dark.css new file mode 100644 index 0000000..a55a098 --- /dev/null +++ b/.design/system/variables.dark.css @@ -0,0 +1,220 @@ +:root { + --brand-color-primary: #b9a566; + --brand-color-primary-bg: #292519; + --brand-color-primary-bg-hover: #413922; + --brand-color-primary-border: #4e4731; + --brand-color-primary-border-hover: #6b613f; + --brand-color-primary-hover: #cec391; + --brand-color-primary-active: #928352; + --brand-color-primary-text: #f5f3e6; + --brand-color-success: #64b537; + --brand-color-success-bg: #192913; + --brand-color-success-border: #304d20; + --brand-color-success-hover: #87ca5c; + --brand-color-success-active: #518f2f; + --brand-color-warning: #dcaa37; + --brand-color-warning-bg: #312512; + --brand-color-warning-border: #5b4920; + --brand-color-warning-hover: #e8c35e; + --brand-color-warning-active: #ad872f; + --brand-color-error: #dc6966; + --brand-color-error-bg: #32191a; + --brand-color-error-border: #5b3231; + --brand-color-error-hover: #e89590; + --brand-color-error-active: #ad5553; + --brand-color-info: #b9a566; + --brand-color-info-bg: #292519; + --brand-color-info-border: #4e4731; + --brand-color-link: #b9a566; + --brand-color-link-hover: #cec391; + --brand-color-link-active: #928352; + --brand-color-text: #dcdcdc; + --brand-color-text-secondary: #adadad; + --brand-color-text-tertiary: #7e7e7e; + --brand-color-text-quaternary: #4f4f4f; + --brand-color-fill: #3e3e3e; + --brand-color-fill-secondary: #303030; + --brand-color-fill-tertiary: #272727; + --brand-color-fill-quaternary: #1d1d1d; + --brand-color-bg-layout: #1d1d1d; + --brand-color-bg-container: #141414; + --brand-color-bg-elevated: #272727; + --brand-color-border: #3e3e3e; + --brand-color-border-secondary: #303030; + --brand-font-family: 'Tenor Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --brand-font-family-code: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; + --brand-font-size: 14px; + --brand-font-size-sm: 12px; + --brand-font-size-lg: 18px; + --brand-font-size-xl: 22px; + --brand-font-size-heading-1: 38px; + --brand-font-size-heading-2: 32px; + --brand-font-size-heading-3: 26px; + --brand-font-size-heading-4: 22px; + --brand-font-size-heading-5: 18px; + --brand-line-height: 1.5714285714285714; + --brand-line-height-heading: 1.25; + --brand-font-weight-strong: 600; + --brand-size-xxs: 4px; + --brand-size-xs: 8px; + --brand-size-sm: 12px; + --brand-size: 16px; + --brand-size-md: 20px; + --brand-size-lg: 24px; + --brand-size-xl: 32px; + --brand-size-xxl: 48px; + --brand-border-radius-xs: 3px; + --brand-border-radius-sm: 5px; + --brand-border-radius: 8px; + --brand-border-radius-lg: 10px; + --brand-line-width: 1px; + --brand-control-height-xs: 16px; + --brand-control-height-sm: 24px; + --brand-control-height: 32px; + --brand-control-height-lg: 40px; + --brand-motion-duration-fast: 0.1s; + --brand-motion-duration-mid: 0.2s; + --brand-motion-duration-slow: 0.3s; + --brand-motion-ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1); + --brand-motion-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); + --brand-primary-palette-1: #292519; + --brand-primary-palette-2: #413922; + --brand-primary-palette-3: #4e4731; + --brand-primary-palette-4: #6b613f; + --brand-primary-palette-5: #928352; + --brand-primary-palette-6: #b9a566; + --brand-primary-palette-7: #cec391; + --brand-primary-palette-8: #e5dfc5; + --brand-primary-palette-9: #f5f3e6; + --brand-primary-palette-10: #faf9ec; + --brand-presets-red-1: #fff1f0; + --brand-presets-red-2: #ffcbc7; + --brand-presets-red-3: #ffa39e; + --brand-presets-red-4: #ff7775; + --brand-presets-red-5: #ff4d50; + --brand-presets-red-6: #f5222d; + --brand-presets-red-7: #cf1323; + --brand-presets-red-8: #a8071a; + --brand-presets-red-9: #820014; + --brand-presets-red-10: #5c0011; + --brand-presets-volcano-1: #fff2e8; + --brand-presets-volcano-2: #ffd8bf; + --brand-presets-volcano-3: #ffbb96; + --brand-presets-volcano-4: #ff9c6e; + --brand-presets-volcano-5: #ff7a45; + --brand-presets-volcano-6: #fa541c; + --brand-presets-volcano-7: #d4380d; + --brand-presets-volcano-8: #ad2202; + --brand-presets-volcano-9: #871500; + --brand-presets-volcano-10: #610c00; + --brand-presets-orange-1: #fff7e6; + --brand-presets-orange-2: #ffe7ba; + --brand-presets-orange-3: #ffd591; + --brand-presets-orange-4: #ffc069; + --brand-presets-orange-5: #ffa940; + --brand-presets-orange-6: #fa8c16; + --brand-presets-orange-7: #d46b08; + --brand-presets-orange-8: #ad4e00; + --brand-presets-orange-9: #873800; + --brand-presets-orange-10: #612500; + --brand-presets-gold-1: #fffbe6; + --brand-presets-gold-2: #fff1b8; + --brand-presets-gold-3: #ffe58f; + --brand-presets-gold-4: #ffd666; + --brand-presets-gold-5: #ffc53d; + --brand-presets-gold-6: #faad14; + --brand-presets-gold-7: #d48806; + --brand-presets-gold-8: #ad6800; + --brand-presets-gold-9: #874c00; + --brand-presets-gold-10: #613400; + --brand-presets-yellow-1: #feffe6; + --brand-presets-yellow-2: #ffffb8; + --brand-presets-yellow-3: #fffb8f; + --brand-presets-yellow-4: #fff566; + --brand-presets-yellow-5: #ffeb3d; + --brand-presets-yellow-6: #fadb14; + --brand-presets-yellow-7: #d4b106; + --brand-presets-yellow-8: #ad8a00; + --brand-presets-yellow-9: #876700; + --brand-presets-yellow-10: #614700; + --brand-presets-lime-1: #fcffe6; + --brand-presets-lime-2: #f4ffb8; + --brand-presets-lime-3: #eaff8f; + --brand-presets-lime-4: #d3f261; + --brand-presets-lime-5: #bae637; + --brand-presets-lime-6: #a0d911; + --brand-presets-lime-7: #7bb305; + --brand-presets-lime-8: #5b8c00; + --brand-presets-lime-9: #3f6600; + --brand-presets-lime-10: #254000; + --brand-presets-green-1: #f6ffed; + --brand-presets-green-2: #d9f7be; + --brand-presets-green-3: #b6eb8f; + --brand-presets-green-4: #94de64; + --brand-presets-green-5: #72d13d; + --brand-presets-green-6: #52c41a; + --brand-presets-green-7: #389e0d; + --brand-presets-green-8: #227804; + --brand-presets-green-9: #135200; + --brand-presets-green-10: #092b00; + --brand-presets-cyan-1: #e6fffb; + --brand-presets-cyan-2: #b5f5ec; + --brand-presets-cyan-3: #87e8de; + --brand-presets-cyan-4: #5cdbd3; + --brand-presets-cyan-5: #36cfc9; + --brand-presets-cyan-6: #13c2c2; + --brand-presets-cyan-7: #08979c; + --brand-presets-cyan-8: #006d75; + --brand-presets-cyan-9: #00474f; + --brand-presets-cyan-10: #002329; + --brand-presets-blue-1: #e6f4ff; + --brand-presets-blue-2: #bae0ff; + --brand-presets-blue-3: #91caff; + --brand-presets-blue-4: #69b1ff; + --brand-presets-blue-5: #4096ff; + --brand-presets-blue-6: #1677ff; + --brand-presets-blue-7: #0958d9; + --brand-presets-blue-8: #003eb3; + --brand-presets-blue-9: #002c8c; + --brand-presets-blue-10: #001d66; + --brand-presets-geekblue-1: #f0f5ff; + --brand-presets-geekblue-2: #d6e4ff; + --brand-presets-geekblue-3: #adc6ff; + --brand-presets-geekblue-4: #85a5ff; + --brand-presets-geekblue-5: #597df7; + --brand-presets-geekblue-6: #2f54eb; + --brand-presets-geekblue-7: #1d39c4; + --brand-presets-geekblue-8: #10229e; + --brand-presets-geekblue-9: #061178; + --brand-presets-geekblue-10: #030852; + --brand-presets-purple-1: #f9f0ff; + --brand-presets-purple-2: #efdbff; + --brand-presets-purple-3: #d4adf7; + --brand-presets-purple-4: #b37feb; + --brand-presets-purple-5: #9254de; + --brand-presets-purple-6: #722ed1; + --brand-presets-purple-7: #531dab; + --brand-presets-purple-8: #391085; + --brand-presets-purple-9: #22075e; + --brand-presets-purple-10: #120338; + --brand-presets-magenta-1: #fff0f6; + --brand-presets-magenta-2: #ffd6e7; + --brand-presets-magenta-3: #ffadd2; + --brand-presets-magenta-4: #ff85bf; + --brand-presets-magenta-5: #f759aa; + --brand-presets-magenta-6: #eb2f96; + --brand-presets-magenta-7: #c41d7e; + --brand-presets-magenta-8: #9e1067; + --brand-presets-magenta-9: #780650; + --brand-presets-magenta-10: #520339; + --brand-presets-grey-1: #a6a6a6; + --brand-presets-grey-2: #999999; + --brand-presets-grey-3: #8c8c8c; + --brand-presets-grey-4: #808080; + --brand-presets-grey-5: #737373; + --brand-presets-grey-6: #666666; + --brand-presets-grey-7: #404040; + --brand-presets-grey-8: #1a1a1a; + --brand-presets-grey-9: #000000; + --brand-presets-grey-10: #000000; +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff4c919 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +*.local +.DS_Store +*.log +.vite +coverage diff --git a/.info/ToV.md b/.info/ToV.md new file mode 100644 index 0000000..44b5468 --- /dev/null +++ b/.info/ToV.md @@ -0,0 +1,18 @@ +# Malenia + +## Основная информация + +MaleniaVPN (malenia, маления) — маленькая студия из двух, разрабатывающая VPN решения. Наш имидж строится на критичной насмешке над неспособностью цензоров внедрить серьезные меры против свободного доступа в интернет. + +## Ценности + +Мы ценим честность, и именно поэтому мы ведём максимально честный диалог с нашими пользователями. Инциденты, недочёты, ошибки и совершенствование — мы выносим в свет, так как отказываемся считать, что зрители являются просто потребителями. +Мы ценим надёжность, из-за чего стремимся к максимальной простоте и устойчивости для наших клиентов. Принцип включил и забыл стоит в основе нашей деятельности. +Мы ценим свободу слова, поэтому мы продолжаем работать, даже когда блокировки становятся сложнее и моральная давка становится сильнее. +Для нас это больше чем сервис. Для нас Malenia — это способ борьбы с несправедливыми репрессиями. Мы будем стоять против, не смотря ни на что. + +## Сторонний отзыв об имидже компании + +Бренд Malenia строится вокруг образа независимой, небольшой, но технически компетентной команды, которая противопоставляет себя крупным игрокам рынка и бюрократическим структурам. В коммуникации постоянно подчеркивается происхождение проекта: «два программиста-самоучки», отсутствие маркетингового отдела, работа руками инженеров, а не продавцов. Центральные ценности бренда — свобода доступа к информации, прозрачность, инженерный подход и практическая польза для пользователя. Malenia продаёт не просто VPN, а идею «возвращения интернета пользователю», где технологии должны работать незаметно и без сложной настройки. Компания стремится выглядеть союзником аудитории, регулярно вовлекает пользователей в принятие решений через голосования, признаёт ошибки публично и демонстрирует открытость даже в кризисных ситуациях. Имидж бренда — это сочетание технического андеграунда, цифрового активизма и честного сервиса без корпоративного лоска. + +Tone of Voice построен на разговорном, ироничном и местами дерзком стиле. Malenia не говорит языком пресс-релизов: в текстах много сарказма, мемов, бытовых сравнений и намеренно простых формулировок, которые делают сложные сетевые темы понятными широкой аудитории. При этом за шутками всегда прослеживается позиция эксперта, который готов спорить с конкурентами и публично разбирать их заявления. Отношение к оппонентам критическое и даже насмешливое: компания активно высмеивает маркетинговые манипуляции, драматизацию и попытки играть на страхах пользователей. Однако главным объектом критики становятся не конкретные конкуренты, а некомпетентность, непрозрачность и искусственное нагнетание паники. В отношении к работе прослеживается принцип «сначала решаем проблему, потом рассказываем о ней»: команда демонстрирует готовность быстро адаптироваться к изменениям, экспериментировать, исправлять собственные ошибки и честно признавать просчёты. В результате бренд воспринимается как «свои люди в индустрии» — немного хулиганы, немного инженеры, но прежде всего защитники открытого интернета и интересов своих пользователей. diff --git a/.info/index.html b/.info/index.html new file mode 100644 index 0000000..96454e6 --- /dev/null +++ b/.info/index.html @@ -0,0 +1,366 @@ + + + + + + Malenia — Свобода в сети + + + + + + + + + + +
+
+ +
+ + +
+ +
+ Свобода. Практика. Простота. +
+ + +
+ + + + + +
+

Тишина в сети —
это тоже выбор.

+

malenia.space

+
+ + + + + + +
+ + +
+ © 2026 Malenia + + malenia.space +
+ +
+ + + + + diff --git a/.info/openapi.json b/.info/openapi.json new file mode 100644 index 0000000..0c5cbe7 --- /dev/null +++ b/.info/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/auth/signup":{"post":{"summary":"Signup","operationId":"signup_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRegistration"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"summary":"Login","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLoginData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/refresh":{"post":{"summary":"Refresh","operationId":"refresh_auth_refresh_post","parameters":[{"name":"refresh_token","in":"query","required":true,"schema":{"type":"string","title":"Refresh Token"}},{"name":"iss","in":"query","required":true,"schema":{"enum":["credentials","telegram","api"],"type":"string","title":"Iss"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTokens"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/plans/":{"get":{"summary":"Get Plans","operationId":"get_plans_plans__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPlans"}}}}}}},"/orders/checkout":{"post":{"summary":"Checkout","operationId":"checkout_orders_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderDetails"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/me":{"get":{"summary":"Get Me","operationId":"get_me_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfo"}}}}}}},"/users/subscription":{"get":{"summary":"Get Subscription","operationId":"get_subscription_users_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/users/subscription/hwid":{"get":{"summary":"Get Hwid","operationId":"get_hwid_users_subscription_hwid_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Device"},"title":"Response Get Hwid Users Subscription Hwid Get"}}}}}},"delete":{"summary":"Delete Hwid Endpoint","operationId":"delete_hwid_endpoint_users_subscription_hwid_delete","parameters":[{"name":"hwid","in":"query","required":true,"schema":{"type":"string","title":"Hwid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/payments/pally/result":{"post":{"summary":"Pally Callback","operationId":"pally_callback_payments_pally_result_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_pally_callback_payments_pally_result_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AddonData":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"price":{"type":"number","title":"Price"},"free_threshold":{"type":"integer","title":"Free Threshold"}},"type":"object","required":["id","name","price","free_threshold"],"title":"AddonData"},"Body_pally_callback_payments_pally_result_post":{"properties":{"InvId":{"type":"string","title":"Invid"},"OutSum":{"type":"string","title":"Outsum"},"Commission":{"type":"string","title":"Commission"},"TrsId":{"type":"string","title":"Trsid"},"Status":{"type":"string","title":"Status"},"CurrencyIn":{"type":"string","title":"Currencyin"},"custom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom"},"SignatureValue":{"type":"string","title":"Signaturevalue"},"AccountType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accounttype"},"AccountNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accountnumber"},"BalanceAmount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balanceamount"},"BalanceCurrency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balancecurrency"},"PayerPhone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payerphone"},"PayerEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payeremail"},"PayerName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payername"},"PayerComment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payercomment"},"ErrorCode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Errorcode"},"ErrorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"}},"type":"object","required":["InvId","OutSum","Commission","TrsId","Status","CurrencyIn","SignatureValue"],"title":"Body_pally_callback_payments_pally_result_post"},"CheckoutResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"total_amount":{"type":"number","title":"Total Amount"},"bonus_paid":{"type":"number","title":"Bonus Paid"},"amount_to_pay":{"type":"number","title":"Amount To Pay"},"payment_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Link"}},"type":"object","required":["order_id","total_amount","bonus_paid","amount_to_pay"],"title":"CheckoutResponse"},"Device":{"properties":{"os":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Os"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"},"hwid":{"type":"string","title":"Hwid"}},"type":"object","required":["hwid"],"title":"Device"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"OrderDetails":{"properties":{"devices":{"type":"integer","title":"Devices"},"addons":{"items":{"type":"string"},"type":"array","title":"Addons","description":"List of addons ids"},"duration_days":{"type":"integer","title":"Duration Days"}},"type":"object","required":["devices","addons","duration_days"],"title":"OrderDetails"},"PricingPlans":{"properties":{"device_price":{"type":"integer","title":"Device Price"},"addons":{"items":{"$ref":"#/components/schemas/AddonData"},"type":"array","title":"Addons"}},"type":"object","required":["device_price","addons"],"title":"PricingPlans"},"TelegramData":{"properties":{},"type":"object","title":"TelegramData"},"UserInfo":{"properties":{"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"telegram_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telegram Id"},"referal_code":{"type":"string","title":"Referal Code"}},"type":"object","required":["referal_code"],"title":"UserInfo"},"UserLogin":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"expires_at":{"type":"number","title":"Expires At"},"user":{"$ref":"#/components/schemas/UserInfo"}},"type":"object","required":["access_token","refresh_token","expires_at","user"],"title":"UserLogin"},"UserLoginData":{"properties":{"provider":{"type":"string","enum":["credentials","telegram","api"],"title":"Provider"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"telegram":{"anyOf":[{"$ref":"#/components/schemas/TelegramData"},{"type":"null"}]}},"type":"object","required":["provider"],"title":"UserLoginData"},"UserRegistration":{"properties":{"telegram_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telegram Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"referal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referal Code"},"provider":{"type":"string","enum":["credentials","telegram","api"],"title":"Provider"}},"type":"object","required":["provider"],"title":"UserRegistration"},"UserTokens":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"expires_at":{"type":"number","title":"Expires At"}},"type":"object","required":["access_token","refresh_token","expires_at"],"title":"UserTokens"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..9f66c31 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "semi": true, + "tabWidth": 2, + "bracketSpacing": true, + "arrowParens": "always" +} diff --git a/.ref/account.html b/.ref/account.html new file mode 100644 index 0000000..1e8b9b8 --- /dev/null +++ b/.ref/account.html @@ -0,0 +1,921 @@ + + + + + +MaleniaVPN · Account + + + + + + + + + +
+ +
+ + +
+ + +
+
Your account
+

Eleanor Ashworth

+

Member since March 2023 · Plan: Solitude

+
+ + +
+ +
+ +
Username
+
e.ashworth
+
+ + +
+ +
Telegram ID
+
@eashworth
+
+ + +
+ +
Devices linked
+
4 / of 6
+
+ + +
+ +
Renews
+
14 Mar 2026
+
+
+ + + + +
+
+

Connected devices

+
4active
+
+ +
+ +
+
+ + +
+ MaleniaVPN · Solitude plan + Sign out +
+
+ + + + +
+ + + + diff --git a/.ref/calculator.html b/.ref/calculator.html new file mode 100644 index 0000000..c465e78 --- /dev/null +++ b/.ref/calculator.html @@ -0,0 +1,1212 @@ + + + + +MaleniaVPN · Compose your plan + + + + + + + + + +
+ +
+ + +
+ + +
+
Compose your plan
+

A circle, sized to you.

+

Choose how many devices share your freedom. The price scales quietly — one rate per seat, no tiers, no surcharges.

+
+ + +
+
+ +
+
Estimated price · monthly
+
+ $18 + USD / mo +
+
For 6 devices · $3.00 per seat
+
+ + +
+
+ Devices + 6  seats +
+
+
+
+
+ + +
+
+
+
+ + + Drag the rhombus · arrow keys to fine-tune + + Range 3 – 12 +
+
+
+ + +
+
+ Commitment + Billed monthly +
+
+
+ + +
+
+
Devices 6
+
$3.00/ seat
+
+ + + + +
+ + +
+
+
Refine your circle
+
Optional add-ons · placeholder
+
+
+
+ + +
+ +
Plan adjusts at next renewal · No lock-in
+
+
+ + +
+ MaleniaVPN · Solitude plan + Estimate only +
+
+ + + + + \ No newline at end of file diff --git a/.ref/landing.html b/.ref/landing.html new file mode 100644 index 0000000..7232d4d --- /dev/null +++ b/.ref/landing.html @@ -0,0 +1,467 @@ + + + + Malenia — Свобода в сети + + + + + + + + + + +
+
+ +
+ + +
+ +
+ Свобода. Практика. Простота. +
+ + +
+ + + + + +
+

Верните себе
свободный интернет.

+

malenia.space

+
+ + + + + + +
+ + +
+ © 2026 Malenia + + malenia.space +
+ +
+ + + + \ No newline at end of file diff --git a/.ref/login.html b/.ref/login.html new file mode 100644 index 0000000..2a599b4 --- /dev/null +++ b/.ref/login.html @@ -0,0 +1,561 @@ + + + + +MaleniaVPN · Sign In + + + + + + +
+
+ +
+
+ +
Private access
+
+ +
+

Sign in

+

Enter your credentials to resume your session.

+ +
+
+ + + +
+ +
+ + + + +
+ +
+ + Forgot password? +
+ + + +
+
+ + + + + + +
+ +
+ Protected by MaleniaVPN +
+
+ + + + + \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..8e13d4c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,423 @@ +# MaleniaVPN — Frontend Agent Guidance + +## Project Overview + +MaleniaVPN (malenia) is a VPN purchase service built around a **pay-for-device** model: +one flat rate per device ("seat"), no tiers. The frontend is a **Russian-language** web +app living in `frontend/` on top of a FastAPI backend. This file is the canonical +guidance for AI assistants working on it. + +The service is run by a two-person studio. The brand is minimalist and archival +(cream/ink/gold, extreme whitespace), but the *voice* is honest, ironic and sometimes +snarky. Keep the UI elegant; keep the copy human. + +### Screens + +| Screen | Route | Access | Source of truth | +|---|---|---|---| +| Landing | `/` | Public | `.ref/landing.html` (existing hosted page) | +| Plan calculator | `/plan` | Public (auth needed only to confirm an order) | `.ref/calculator.html` | +| Login / Signup | `/login` | Public | `.ref/login.html` | +| Account | `/account` | Protected (auth required) | `.ref/account.html` | + +## Authoritative Source Directories (read-only) + +Never edit these; they are reference material. + +| Path | What it is | +| --- | --- | +| `.info/openapi.json` | **The** backend API contract. All types below mirror it. | +| `.info/ToV.md` | Company values and tone of voice (Russian). | +| `.design/DESIGN.md`, `.design/brand.json` | Visual identity: palette, typography, layout posture. | +| `.design/fonts/` | Self-hosted `.woff2` + `fonts.css`. **Latin-only subsets — see Typography.** | +| `.design/logos/` | `favicon-0.ico` — the favicon. | +| `.ref/*.html` | Ready-made page references: full markup, styles and behaviors. Refactor into React, do not copy verbatim. | + +The `.design/system/` folder (tokens, `kit.html`, artifacts) is brand-system material; +at page build time use the **canonical tokens below** rather than the `--brand-*` +derived tokens. + +## Tech Stack + +- Vite + React 19 + TypeScript (`"strict": true`) +- React Router v6 +- Zustand — **auth tokens and UI state only**, never server-fetched data +- Native `fetch` API client (no axios) +- Vanilla CSS with custom properties (no Tailwind, no CSS-in-JS, no CSS frameworks) +- Vitest + React Testing Library for tests +- ESLint (typescript/react/hooks) + Prettier (print width 100, single quotes, trailing commas, semicolons) + +## Design System + +### Canonical CSS tokens (`src/styles/tokens.css`) + +| Token | Value | Usage | +| --- | --- | --- | +| `--bg` | `#faf7f2` | Page background (cream) | +| `--surface` | `#f5f0e8` | Cards, raised blocks (warm white) | +| `--fg` | `#1a1610` | Primary text, primary buttons (ink) | +| `--muted` | `#3d3428` | Secondary text (ink-soft) | +| `--fg-muted` | `#7a6e5f` | Tertiary text, captions (ink-muted) | +| `--accent` | `#c9a84c` | Highlights, active states, emblems (gold) | +| `--accent-light` | `#e8ca7a` | Hover glow, gold-light | +| `--accent-dim` | `#8b6914` | Emphasis inside quote text | +| `--hairline` | `rgba(26, 22, 16, 0.10)` | Faint structural rules, grid gaps | +| `--hairline-strong` | `rgba(26, 22, 16, 0.18)` | Input underlines, card borders | +| `--border` | `rgba(201, 168, 76, 0.25)` | Landing header/footer rules | +| `--font-display` | `'Cormorant Garamond', Georgia, serif` | Headings, numerals | +| `--font-body` | `'Tenor Sans', 'Helvetica Neue', Arial, sans-serif` | Body, labels, buttons | +| `--radius` | `8px` | All corners | +| `--baseline` | `8px` | Spacing unit | + +### Layout rules + +- **8px baseline grid** for spacing and padding; generous padding everywhere. +- **Extreme whitespace + centered alignment**. One primary purpose per screen. +- **1px hairlines** for structural division (horizontal rules, stat strips divided by + grid `gap: 1px` over a hairline background). +- Buttons: uppercase, letterspacing `0.16–0.22em`, 10px font-size, `--radius` corners. + Primary = `--fg` background / `--bg` text; hover → `--accent`. Secondary = transparent, + `1px solid var(--hairline-strong)`. +- Inputs: underline style (`border-bottom: 1px solid var(--hairline-strong)`), + transparent background, gold animated focus line (`scaleX`), no boxed inputs. + +### Signature UI details (all screens) + +- **Custom cursor**: gold dot (6px) + trailing ring (32px) that grows to 48px over + interactive elements. Hide on touch devices (`@media (hover: none), (pointer: coarse)`) + — these also need `* { cursor: auto !important; }`. +- **Grain overlay**: fixed `body::before` with the fractal-noise SVG data-URI, `opacity: 0.035`, `mix-blend-mode: multiply`. +- **Fade-up reveals**: `.reveal { opacity: 0; transform: translateY(14px); }` → `.is-in`; + staggered `transition-delay` via IntersectionObserver. +- **Logo**: `Malenia` — Cormorant Garamond, uppercase, + `letter-spacing: 0.35em`; the `e` is `var(--accent)`. +- **Emblem**: the 90×90 geometric SVG (ring + diamond + cardinal marks), gold stroke. +- Respect `prefers-reduced-motion`: disable cursor animation, grain is fine (static), + use plain opacity transitions without translate. + +### Typography + +- **Display/headings:** Cormorant Garamond (weights 400, 500, 600 + italics). Large + sizes with `line-height 1.1–1.25` and slight negative `letter-spacing`. +- **Body:** Tenor Sans. +- **CRITICAL — Cyrillic fonts:** the self-hosted `.design/fonts/*.woff2` subsets have + `unicode-range` for **Latin Extended only** (no `U+0400–04FF`) and will render Russian + text with fallback glyphs. The interface is Russian, so load fonts from **Google Fonts** + exactly as the `.ref` pages do: + `https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;500;600&family=Tenor+Sans&display=swap` + (with `preconnect` links). Self-hosting is only acceptable after adding Cyrillic subsets. + +## Brand Voice & Copy (from `.info/ToV.md`) + +- All interface copy is **Russian**. No placeholders left in English. +- Tone: restrained, archival and minimal on the surface; honest, ironic, occasionally + snarky underneath. Plain wording, no corporate clichés, no hype ("revolutionize", + "unleash the power", "best-in-class" are banned). +- Service attitude: "включил и забыл" (set-and-forget), transparency about incidents, + engineering-first, anti-censorship. +- Tagline: **«Свобода. Практика. Простота.»** +- Landing quote block: rotate randomly through the Russian quotes array from + `.ref/landing.html`; render the second line as an italic ``. + +## Routing (`src/App.tsx`) + +| Path | Element | Notes | +| --- | --- | --- | +| `/` | `Landing` | Existing marketing page | +| `/login` | `LoginPage` | Credentials only. `?returnTo=` preserved for post-auth redirect | +| `/plan` | `PlanPage` | Calculator + confirm → checkout | +| `/account` | `AccountPage` | Protected: redirect to `/login` when unauthenticated | + +## Backend API (mirrors `.info/openapi.json` — the only source of truth) + +Base: backend routes have **no `/api/` prefix**. In dev, `vite.config.ts` proxies +`/auth`, `/plans`, `/orders`, `/users`, `/payments` to `http://127.0.0.1:8000`. +In prod the reverse proxy serves same-origin. Never hardcode absolute URLs. + +### Types (`src/types.ts`) + +```ts +type Provider = 'credentials' | 'telegram' | 'api'; + +interface UserInfo { + username: string | null; + telegram_id: string | null; + referal_code: string; +} + +interface LoginResponse { // POST /auth/login + access_token: string; + refresh_token: string; + expires_at: number; // epoch seconds + user: UserInfo; +} + +interface Tokens { // POST /auth/refresh + access_token: string; + refresh_token: string; + expires_at: number; +} + +interface AddonData { // inside GET /plans/ + id: string; + name: string; + price: number; + free_threshold: number; +} + +interface PricingPlans { // GET /plans/ + device_price: number; + addons: AddonData[]; +} + +interface OrderDetails { // POST /orders/checkout body + devices: number; + addons: string[]; // addon ids + duration_days: number; +} + +interface CheckoutResponse { // POST /orders/checkout → 201 + order_id: string; + total_amount: number; + bonus_paid: number; + amount_to_pay: number; + payment_link: string | null; +} + +interface Device { // GET /users/subscription/hwid + os: string | null; + model: string | null; + client: string | null; + hwid: string; +} +``` + +### Endpoint table + +| Method | Path | Auth | Purpose | +|---|---|---|---| +| POST | `/auth/signup` | – | Register, body `{provider, username?, password?, telegram_id?, referal_code?}` | +| POST | `/auth/login` | – | Login, body `{provider:'credentials', username, password}` | +| POST | `/auth/refresh?refresh_token=&iss=` | – | New token pair; `iss` is the provider | +| GET | `/plans/` | – | Pricing: `device_price` + addons | +| POST | `/orders/checkout` | yes | Create order → `payment_link` | +| GET | `/users/me` | yes | `UserInfo` | +| GET | `/users/subscription` | yes | Subscription state (schema is `{}` — shape to be confirmed at implementation) | +| GET | `/users/subscription/hwid` | yes | `Device[]` | +| DELETE | `/users/subscription/hwid?hwid=` | yes | Unlink a device | +| POST | `/payments/pally/result` | – | Payment callback — backend-internal, frontend never calls it | + +### Auth flow + +- **Credentials only.** Sign up / sign in are username + password. Telegram auth is + explicitly **out of scope** for now (linking ships later). The API *accepts* + `provider: telegram`, but the frontend must only use `credentials`. +- Tokens stored via a `useLocalStorage`-style hook under keys + `malenia.access`, `malenia.refresh`, `malenia.expires_at` (epoch seconds). +- The API client injects `Authorization: Bearer ` on every request. +- On **401**: try `POST /auth/refresh?refresh_token=…&iss=credentials` once; on success + retry the original request, on failure clear tokens and redirect to `/login`. + Guard against refresh loops. +- **Signup** may include `referal_code` — expose an optional field on the signup form + and pass it through. + +### API client conventions + +- Generic `request()` helper; throws `Error` with the backend `detail` for non-2xx. +- 201 responses return parsed JSON; no 204s in this API. +- Errors surface as **toast notifications** (inline errors only for form validation). + +## Pages — implementation notes (from `.ref/`) + +### Landing (`/`) — `.ref/landing.html` + +Keep the overall structure and design. **Apply the existing page's corrections:** + +- **Header** gains navigation links (`