From 5f1e8da6e1459d520ba0cf862e6cc1ea706de27e Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 22 Jan 2026 19:41:45 +0000 Subject: [PATCH] All panel with icons --- core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1181 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 3180 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 878 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 3086 bytes core/admin.py | 13 +- core/migrations/0001_initial.py | 43 ++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2436 bytes core/models.py | 37 ++- core/templates/base.html | 116 +++++++-- core/templates/core/blog.html | 35 +++ core/templates/core/cart.html | 40 +++ core/templates/core/catalog.html | 95 +++++++ core/templates/core/constructor.html | 17 ++ core/templates/core/favorites.html | 17 ++ core/templates/core/index.html | 243 ++++++++---------- core/templates/core/product_detail.html | 63 +++++ core/urls.py | 9 +- core/views.py | 70 +++-- static/css/custom.css | 92 ++++++- staticfiles/css/custom.css | 101 ++++++-- 20 files changed, 788 insertions(+), 203 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/templates/core/blog.html create mode 100644 core/templates/core/cart.html create mode 100644 core/templates/core/catalog.html create mode 100644 core/templates/core/constructor.html create mode 100644 core/templates/core/favorites.html create mode 100644 core/templates/core/product_detail.html diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..7913631a735a42e4b8ce54a59053be28ccd8b32d 100644 GIT binary patch literal 1181 zcma)5&rj4q6rSmi-7f3`vY>#80nx)sU{4-QjEOPoK_MpIdTB~$SPJd7&a@~e_rM>( zjjJaN;m>GYd7eQ&;b{oc&?N@a*Z`?@9k-;|JF zILTXKV4VE~V~;SxXh1@0Q%ab|^gs)BTMrG}phP2_ZkYK(uI~faA-w&jk+*~yJA|1K zm9vt49b(|^w|y86^9iww*BFgk7z@By{BK5!SszKQbb@=-s4`s^`ppx}v8E~Om7DNJ zB(_!YgNRt_CEjH&U}%HM*$fzagcF-GVrz`rIx68)+h7K;o2rr%y+nFoHkxk8l_7() zAyDcADoQY{K&<6B=yV)4XuHQJe;lEpyg< z9x!=8&M>=+#rk>_@_M?OHj}i@zi=;2B2oVwiA@>19+(6S&bQuo@6UaE)}C2x8~6HMjOR;k*XAL(uWJLk=(foWW`afqRsfBPsyvXmFOiw) zp)4=2fEf$lkcRA2l<1#V~wcsTD;T zLn{a)2%`XMI1_Wt4-zg^MRHeo>jM?V7)ISe$bPem)?^O2mwW>7w?=P3qw$5-yY9q7 zYxy5)A;U_oq(<0=+iXNjUerv4zbf$9s{+)V2U6g@5qK?>C3pks4cQGXqc2maU#cvZ ztNC46&-XDnU z`?@pn=oB622&X#HW-j9`qK#!N#Unb^p;JB0K$e@Z`?OP?KSjqm0(44TX@K?*b( zZ?Pt(n;80F)6nZ2$lO diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..4563f367d82d82f65a04a124363d967a00bd0e0d 100644 GIT binary patch literal 3180 zcmd5;%}*Og6rc6?$2$IiB&4LlB_XLpYXU`44pmDENlVk9w9t#CXtj98uwk*C*);*g z!G}ntDy=xQN{<{O3JQlD^B**-da$KESS$6^6E`Aqs5te#S=(Sks`l2|-8VCD-n^N4 z@6GS+FOf)yKv`Pg+BGjBe`2RmpfAe)1E`)5N~olhc_|}F*mmizd3VMw5f}NCQ1@d( zJxqGwsm~#sZbF{H=ah_BNO?iZ_YYD&>YpU3z%EWoNw#mkK$&hp%WvqV87;Szt?Lt2 zW3Bz)p!*H%kdcf;NygJ3z8!y?mhdXcNi^^{kdbNdG08-P9YSD-aGT_*RkA2$qHuoM4veZM zn{P4W`Pep zD)2d@2sRqX7C0MlqAOio;%8vua-?DOG_Hnj-TxTKUu9B@cC0P!5h>XJM_12==V`Fo zb=B&+x;nNtUJG=7@BP-l=3kT7X(iD2a}LPScOO)c7K@|x(W?6~Ag%VEBs>nxZHad} zRToqSPDt|eKy5#q(&UP=9BXd2&JjMuP1mOr$(^KvB>wieiTp1-Z5pDq~8ku2&ZuIk%F z?8P~Q2Q~9P*a7asK--s_Pwm3hN}$_$ojLEpcq+!PK*irhl0t$8w1cCwD!;8UoeF!| z!AS@or{5vQry$xz-wsn|WVu!}wL;zwz_oDLL2*r#64ylx@Ltr7E83BISY?^6D++j| z8@R$1BjOkw(L)f7I^$O$5GjqP7VciXZiTxyj7qq_8t%8k{pGPHb9l?Fgomr)VJkcg z>_qSSWh>FU)mcfTtBJIgNSE)_Vm<4=AEO(za{X>4Hc^dDSh0!n_@2k@y}Unl) zwBxFmdUt$nXc-pRi?An3E6gCu!X8dFMya0$c7kmhqCy7mpeQu76K>l_Tu5M$Iuc$g z??l?PbO;%|t#z4WT22cIjPi!WskU{_iX0Jz9MMH%kR#5COz;-m$GGjk$Kje~O*>F@ z8b-=x%be+uAgH)vcCe6FAWbrp?Y@L1IHs&Aj!>{G2x2x&5-EggGn#4Grzp!pp8y`S&4Tvp|IlgoN&0FMJmf4;6 z3WjEC3v4_OKN8FVNyw&VAv?zhaqf_q`$?goGd14;Lqk!sILnTV!QxZeJaa}uSsk|fp0`AX|sBYl(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..a19c8e475c9ac45758df5d5e3c190420746d1c42 100644 GIT binary patch literal 878 zcmb7Bzi-n(6h6n#zv8BW5D5vYX2}wX^oB@CL8TKS8w(XkUXbfM(tsUDXS=0=p<~Bv zWX!}5!C%2&U`rmNTUqE9saq%RoPYp%;e2;`{=R$PclX}MTCIx2`1X#CxPs7k`SWYo zo8W3Cg7=6ZqWCCK97RE-LR7yJsE!(d1A*pff$r#m;TVDGn1SV33aTKg5TGj2zUm)T zguaNi9tC4iAZ96JQH@kf8Jp^4tCXoxgKU>Fb!w6urOZugk;cEw&~U2c)>G7JUdqdM z6b=(NKE4#iK^=p`aTri;cy8?a;gD}nSV$5tenDvLj(l!=;W&z!KtjgBb6L!-m+nc( zMlp>z9LXHSw2koC4d~R|Xkn%cc-q`3;{C`^h7aU+fSDnwtv|#uGbN-+3(PDTSAQE} zCYw6dq#b6mjZZo@x5+DaJPh{|=0{BSf@>!udKwkiDa;F-Lby;YREl(NizHEon6h#7 z8C{8FbbSxYTHxd;8OI5xZ>X1uSL4%=y^bcXN3j<&K?}FN$=S8JABal%^nf)*vaDwG zLu@NmQIsXxN&lWpbeR7CTyx|lyPqDW(9fWsLw}9kp0(%CQfOz;&Y``=c4lXbw<+{8=;hEW RJGZKv^~$*|Kh_YB{Rsk1>goUh delta 192 zcmaFIcALp*IWI340}xbw%g@XL(vLwL7+{4mKHC5p(-~42QW$d>av7r-85vTTQkZj? za+#x;Cq~Jbr87pcq_77wXmY#+Y0+f7#Zr)1lJSxe%E`#jO})iX1TqgKmzS8E>Zi#% x`8A{5WOXKAEGRiVYRm?dkL&aQ#D zM&-~-J@gPomALePDwPsJC64se{sBF#qm_bIiiA}4z|9isC8xfbwbypyV@CGdnK$#^ z%-=RIK=CGR+tvD zf$0E@h3}Z@APRsCp&-aG3W1EEFvunp0V$#;kj+SZz$BWFi2DTR2C=$`RP0I_)tWJ8 z7t}O7@XVDo7pU{c71#oYf++Mezs6f) z)waN(aDm?f6gvb7Z4jeK{^PsKBGMK!@{*EKlk>%xWPG1w^WP?oP^+pu=;gQH7(o% zV;rSMX=Bk+S1psAR)+SfH#Ki$)l_aaw`k>3>Z+Q~Sq4t682FL7q@>jp-F{h9SIp$n zV^<)naR*ov59T8f>&(B>X-7K$Lh5=hbrq#St`8=N7 zZ@1&gVtmkv5ANf?*nRB8Z`i`g!w&i2o#a70Q3?sMV2J^-KJs4^(|qDdw|%x}J5v<< z9kJgQ`j25drZEq%0|Pdg0<%Dt(6;GwqM{*B#Mbi#_(qVF+k(%8%^GcG_I2*AaTdMF z-h7R14TGz;h}-2~+nYzinowYIj}@z~t36MF-3@HPE!y#K60GMp8~QH@yTRA}7q|jn z5GeNpmQ>w?azD_3`xnZWoe*8ojf_YCGG8Cd9>L&lB;9aDIfY3O#uKb7n0hXgU@^JP z37*o<4g0i~OjUDsSbnJL2*qx29Yk3KQiyZUtwU9G!9;pCCPw8;|8d z+y;HOrQ&ji9Kj>}S+b~;h;|Sri5X$MEaQ{VbwlNCu?!;;e)AU)>&#*M*`LNXCZ0}g z-YK@Hoc7fEy_awB8)zNt`0?8pv99N_u06qybroZMPONYJ_F=peD18uWFELzT=w)Z` z@ALa#*_~s>&M~KR%nqMEXgj+x^mNGX`Si(9v2D<48~h<$3Nok8AGCMEHE4JTl6#?| zc-0ZF+QLG8d)r%`YNmS*Wt>2HA1aCPz-OJf2L!f}%vuFPGr#x*AAOOOSG z@Bm+wNZGu+_s|}ku&+!O#ruwU-xlt_J&0}Ob+$y_kZA>5Wo*&%UB(s#g}dN1`N$VW z4$H%^3V#4&+)d6|14JMW@Q0x7B{PIOK7xzenZ0l9-r=Hn(-Cjl!p*k_ApV)MY+%h& z&D2B9oYyt8f})M0n5#_JK#5W)zF}iL5#JK`0G5vksJgUV+8eO1-L)^@D~jWeIBpB$ zZx2=L4N|b_mqJ}mW>o>5;S+Hrjex3{s(P#w(|f0 literal 1364 zcmZ`(&1)M+6ra_{dS%J>I&SM!uH%hUh$T{~CE!96oTjQ1oHkCdQ$lozPf-Q6#oM~=1-7}AYwoe=&3h>36z}rW~~)fO5P4{-h1=r&HMPV zzfVm~BA|nRhVUX&zZ=1NEJDd#(kRMro?7~GlVKiARAFbK7y={g8`rq_)Wa;XDEltUWCmB zkq~sth&3ZeP{;A878u54V{Oaty2i>_vx<&kIwj51DaMXgGg(=)ND+pj!HI^Q9g`Br z#tzdA%!;PvWg3a1>()Z2BR!#4DWHiJ1dw>FOuS)~xge&2p-9tZ06jh%7)=`o)~k%rY>m)oo?Fy$ z*3WOp#5FJD)_FvD(?z&0py>SutcBjF^RHFyMAbU#a#vk`t*)G?D;+i6Rnx7Fo|by~ z_(Z$b)~@ZR_tUQyT0itB&pp5LYvy^Tl^e+D)6aYJ%l+g^CzEdC%omzVp>MZ5DOS%5y(&3}_!9O1Bm1aJl+6L2^SUjR{+!hj;8?^lX#86r<%#PJyk+Dg$FgMIrJuL z@b1YhhyO*EBmY&F2aw7WKOF=tjJg^2`%5^DPd77fXNa>dYM_TY(>(jnxWZ$ur&B#o z(tAARTukx=CjZWE1s9X@F=Vjn_Z+JB`K#68o;KoZ_#FPA`Qe+D+LSA?=J=agSLD(t z{s_AMJdfV=yM3KU7FC;6OuEZu4KH(fWvLkC3AJIHN|_R{VIHqjt)|jlWt;5ss70uz z>e>Us6FY=%m=;kCwMKYQ$RiA46(u-N>U~8gM#bLZK}&B`;EaVfbk*4A;fA5zZ4e&E z#41y*E)HE$qJ!`vkHS6`qBN-fVC0srmdTc>V?qn=a^aiXH;Qr>xJC53Vw3weA37O@ zQr8<))p@L&l}4;$fQmZv@TNv|Z1FzR-4c{r)WnUlee_J2Ly%;d9Ek&UBu*LxJb+0V zcGkfugkpI~VXdOs77tmrS>C1s4(aw`vZ*$78xpV-wQOrUgvYw{DXI+!k5R+Cr>Ge7 zNZBVnQul(e9`u(@N+x_mF~Fmyp}<8%Y+#xaU6jIOTDDE#K_o>pAXbZM9#LGAqVSla z!2Q+G3Frw$x!X{6Q5cx@X@+J)>39N@Ix#RY%0Lelmm-fZy0yM3ZaylmC!Sc)D)Z0< z%Yro?UEES>S6zd0cGYz#fTu>FIG&bR@>ug`!?#QecHJQ>2DBOJ`baF8rcPAD!}Kpf zZtGf&c+=Q25TR9!FQMDQxT+czlgoI6M_e+XTX^5%{MzFD(&s#8)=Br;{uRB1u+gj8 z$t|-+CL0?K!){EH`=ks>(8+ry-L~pb#z{f*Bxa%yVolG3GSqP|PTHSP*=>MXb@ z&|dHJd|+_zS|=zChxcxDA}E^wG3G>a?bMm)sS%dG@Mymjt=z1Wn`Ozlc4~~}uk7zQ`73`6 zv;1-^zwG3fS@Iebh>cC`f9s4*9FG2$ai&+C>D$h9iD^~`pV%PWj-i70ZKIFb`@Ws - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}GiftShop Polska - Authentic Polish Gifts{% endblock %} + + {% if project_description %} + + + + {% endif %} + {% if project_image_url %} + + + {% endif %} + + + + + + + + + + + + + + + + {% block head %}{% endblock %} - - {% block content %}{% endblock %} - - + + +
+ {% block content %}{% endblock %} +
+ +
+
+
+
+
GiftShop Polska
+

Curated gifts from the heart of Poland. Candles, books, and memories in a box.

+
+
+
Quick Links
+ +
+
+
Contact
+

Warsaw, Poland
hello@giftshop.pl

+
+
+
+

© 2026 GiftShop Polska. All rights reserved.

+
+
+ + + + + \ No newline at end of file diff --git a/core/templates/core/blog.html b/core/templates/core/blog.html new file mode 100644 index 0000000..d9fcddf --- /dev/null +++ b/core/templates/core/blog.html @@ -0,0 +1,35 @@ +{% extends 'base.html' %} + +{% block title %}Blog - GiftShop Polska{% endblock %} + +{% block content %} +
+
+

Gift Shop Blog

+
+
+
+
+
+ Traditions +

The Magic of Polish Beeswax Candles

+

Discover why natural candles are a staple in every Polish home during winter.

+ Read More → +
+
+
+
+
+
+
+ Gifting Tips +

How to Build the Perfect Gift Box

+

A step-by-step guide to choosing items that tell a story.

+ Read More → +
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/cart.html b/core/templates/core/cart.html new file mode 100644 index 0000000..161e5ed --- /dev/null +++ b/core/templates/core/cart.html @@ -0,0 +1,40 @@ +{% extends 'base.html' %} + +{% block title %}Your Cart - GiftShop Polska{% endblock %} + +{% block content %} +
+
+

Shopping Cart

+
+
+
+ +

Your cart is empty

+

Looks like you haven't added anything to your cart yet.

+ Start Shopping +
+
+
+
+

Summary

+
+ Subtotal + 0,00 zł +
+
+ Delivery + Calculated at next step +
+
+
+ Total + 0,00 zł +
+ +
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/catalog.html b/core/templates/core/catalog.html new file mode 100644 index 0000000..bfa2c81 --- /dev/null +++ b/core/templates/core/catalog.html @@ -0,0 +1,95 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Catalog - GiftShop Polska{% endblock %} + +{% block content %} +
+
+ + +
+ +
+
+
Categories
+
+ + All Products + + {% for category in categories %} + + {{ category.name }} + + {% endfor %} +
+
+
+ + +
+
+

{% if selected_category %}{{ selected_category.name }}{% else %}All Products{% endif %}

+

{{ products.count }} items found

+
+ +
+ {% for product in products %} +
+
+
+ {{ product.name }} + +
+
+

{{ product.category.name }}

+
{{ product.name }}
+

{{ product.price }} PLN

+
+
+
+ {% empty %} +
+
🥀
+

No products found

+

Try selecting a different category or check back later.

+
+ {% endfor %} +
+
+
+
+
+ + +{% endblock %} diff --git a/core/templates/core/constructor.html b/core/templates/core/constructor.html new file mode 100644 index 0000000..8fdf219 --- /dev/null +++ b/core/templates/core/constructor.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} + +{% block title %}Gift Box Constructor - GiftShop Polska{% endblock %} + +{% block content %} +
+
+

Box Constructor

+

Build your perfect gift box. Choose items, add a card, and we'll pack it with love.

+
+

Coming Soon

+

Our interactive gift box builder is currently under development.

+ Browse Items +
+
+
+{% endblock %} diff --git a/core/templates/core/favorites.html b/core/templates/core/favorites.html new file mode 100644 index 0000000..f8923aa --- /dev/null +++ b/core/templates/core/favorites.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} + +{% block title %}Favorites - GiftShop Polska{% endblock %} + +{% block content %} +
+
+

Your Favorites

+
+ +

No favorites yet

+

Save your favorite items here to find them easily later.

+ Browse Products +
+
+
+{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..eb5215f 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,106 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} +{% load static %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… + +
+
+
+
+

Thoughtful Gifts,
Authentically Polish

+

Create a personalized gift box filled with handpicked candles, books, postcards, and stationary. We deliver the warmth of Poland to your doorstep.

+ +
+
+
+
+ Gift Box +
+
+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
+ + + +
+
+
+

The Little Wonders

+

Explore our curated collections

+
+
+ {% for category in categories %} + + {% empty %} +
+

No categories available yet. Please add some in the Admin panel.

+
+ {% endfor %} +
+
+
+ + +
+
+
+
+

Staff Favorites

+

Our most loved items this month

+
+ View All → +
+
+ {% for product in featured_products %} +
+
+ {{ product.name }} +
+ {{ product.category.name }} +
{{ product.name }}
+

{{ product.price }} PLN

+ View Details +
+
+
+ {% endfor %} +
+
+
+ + +
+
+
+
+
+

The Gift Box Constructor

+

Can't decide? Build your own box! Pick the items, choose a card, and we'll pack it beautifully with a handwritten note.

+ Start Building +
+
+ Box Packing +
+
+
+
+
{% endblock %} \ No newline at end of file diff --git a/core/templates/core/product_detail.html b/core/templates/core/product_detail.html new file mode 100644 index 0000000..94dbf9a --- /dev/null +++ b/core/templates/core/product_detail.html @@ -0,0 +1,63 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{{ product.name }} - GiftShop Polska{% endblock %} + +{% block content %} +
+
+ + +
+
+ {{ product.name }} +
+
+
+ {{ product.category.name }} +

{{ product.name }}

+

{{ product.price }} PLN

+ +
+
Description
+

{{ product.description }}

+
+ +
+
+ + + +
+ +
+ +
+
+ 🚚 +
+
Delivery to Poland
+

Ships within 1-2 business days

+
+
+
+ 🎁 +
+
Gift Wrap Included
+

Every item is packed with care

+
+
+
+
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..345b1b5 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,12 @@ from django.urls import path - -from .views import home +from .views import home, catalog, product_detail, constructor, cart, favorites, blog urlpatterns = [ path("", home, name="home"), + path("catalog/", catalog, name="catalog"), + path("product//", product_detail, name="product_detail"), + path("constructor/", constructor, name="constructor"), + path("cart/", cart, name="cart"), + path("favorites/", favorites, name="favorites"), + path("blog/", blog, name="blog"), ] diff --git a/core/views.py b/core/views.py index c9aed12..b8c68d2 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,55 @@ -import os -import platform - -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone - +from django.shortcuts import render, get_object_or_404 +from .models import Category, Product def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() - + """Landing page with featured categories and products.""" + categories = Category.objects.all()[:4] + featured_products = Product.objects.filter(is_active=True)[:6] context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + "categories": categories, + "featured_products": featured_products, + "project_name": "GiftShop Polska", } return render(request, "core/index.html", context) + +def catalog(request): + """Product catalog with category filtering.""" + category_slug = request.GET.get('category') + categories = Category.objects.all() + products = Product.objects.filter(is_active=True) + + selected_category = None + if category_slug: + selected_category = get_object_or_404(Category, slug=category_slug) + products = products.filter(category=selected_category) + + context = { + "categories": categories, + "products": products, + "selected_category": selected_category, + } + return render(request, "core/catalog.html", context) + +def product_detail(request, slug): + """Individual product detail page.""" + product = get_object_or_404(Product, slug=slug, is_active=True) + context = { + "product": product, + } + return render(request, "core/product_detail.html", context) + +def constructor(request): + """Gift box constructor page.""" + return render(request, "core/constructor.html", {"title": "Box Constructor"}) + +def cart(request): + """Shopping cart page.""" + return render(request, "core/cart.html", {"title": "Your Cart"}) + +def favorites(request): + """Favorites/Wishlist page.""" + return render(request, "core/favorites.html", {"title": "Your Favorites"}) + +def blog(request): + """Blog index page.""" + return render(request, "core/blog.html", {"title": "Gift Shop Blog"}) \ No newline at end of file diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..049107c 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,90 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +:root { + --primary-color: #D2765E; /* Warm Terracotta */ + --accent-color: #A8B196; /* Soft Sage */ + --bg-color: #FCF8F3; /* Cream */ + --text-color: #2C2C2C; /* Deep Charcoal */ + --font-heading: 'Playfair Display', serif; + --font-body: 'Inter', sans-serif; } + +body { + font-family: var(--font-body); + background-color: var(--bg-color); + color: var(--text-color); + margin: 0; + padding: 0; +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-heading); + font-weight: 700; +} + +.navbar { + background-color: #fff; + border-bottom: 1px solid rgba(0,0,0,0.05); + padding: 1rem 0; +} + +.navbar-brand { + font-family: var(--font-heading); + font-size: 1.5rem; + color: var(--primary-color) !important; +} + +.nav-link { + font-weight: 500; + color: var(--text-color) !important; + margin: 0 10px; +} + +.nav-link:hover { + color: var(--primary-color) !important; +} + +.btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); + padding: 10px 25px; + font-weight: 600; + border-radius: 50px; + color: white; +} + +.btn-primary:hover { + background-color: #bc654e; + border-color: #bc654e; + color: white; +} + +.btn-outline-primary { + color: var(--primary-color); + border-color: var(--primary-color); + border-radius: 50px; +} + +.btn-outline-primary:hover { + background-color: var(--primary-color); + border-color: var(--primary-color); +} + +.footer { + background-color: #fff; + padding: 4rem 0 2rem; + margin-top: 5rem; + border-top: 1px solid rgba(0,0,0,0.05); +} + +.hover-lift { + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.hover-lift:hover { + transform: translateY(-10px); + box-shadow: 0 1rem 3rem rgba(0,0,0,.1) !important; +} + +.card { + border-radius: 1rem; + overflow: hidden; +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..049107c 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,90 @@ - :root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); + --primary-color: #D2765E; /* Warm Terracotta */ + --accent-color: #A8B196; /* Soft Sage */ + --bg-color: #FCF8F3; /* Cream */ + --text-color: #2C2C2C; /* Deep Charcoal */ + --font-heading: 'Playfair Display', serif; + --font-body: 'Inter', sans-serif; } + body { - margin: 0; - font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); + font-family: var(--font-body); + background-color: var(--bg-color); color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + margin: 0; + padding: 0; } + +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-heading); + font-weight: 700; +} + +.navbar { + background-color: #fff; + border-bottom: 1px solid rgba(0,0,0,0.05); + padding: 1rem 0; +} + +.navbar-brand { + font-family: var(--font-heading); + font-size: 1.5rem; + color: var(--primary-color) !important; +} + +.nav-link { + font-weight: 500; + color: var(--text-color) !important; + margin: 0 10px; +} + +.nav-link:hover { + color: var(--primary-color) !important; +} + +.btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); + padding: 10px 25px; + font-weight: 600; + border-radius: 50px; + color: white; +} + +.btn-primary:hover { + background-color: #bc654e; + border-color: #bc654e; + color: white; +} + +.btn-outline-primary { + color: var(--primary-color); + border-color: var(--primary-color); + border-radius: 50px; +} + +.btn-outline-primary:hover { + background-color: var(--primary-color); + border-color: var(--primary-color); +} + +.footer { + background-color: #fff; + padding: 4rem 0 2rem; + margin-top: 5rem; + border-top: 1px solid rgba(0,0,0,0.05); +} + +.hover-lift { + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.hover-lift:hover { + transform: translateY(-10px); + box-shadow: 0 1rem 3rem rgba(0,0,0,.1) !important; +} + +.card { + border-radius: 1rem; + overflow: hidden; +} \ No newline at end of file