From 2d0c2f4e6ac696df1213fc8a5529f03ace2b1f8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Sat, 18 Feb 2023 02:03:41 +0900
Subject: [PATCH] basic UI - base, header

---
 .gitignore                                 |   4 +-
 contracts/templates/contracts/index.html   |   5 +
 contracts/urls.py                          |   4 +-
 contracts/views.py                         |  14 +++
 env.example                                |   2 +-
 oidc/templates/oidc/login.html             |  10 +-
 package.json                               |   1 +
 registry/settings/base.py                  |   3 +
 registry/urls.py                           |   2 +-
 shared/static/shared/favicon.png           | Bin 0 -> 9781 bytes
 shared/templates/shared/includes/base.html | 121 +++++++++++++++++++++
 static_src/base.js                         |   3 +
 12 files changed, 156 insertions(+), 13 deletions(-)
 create mode 100644 contracts/templates/contracts/index.html
 create mode 100644 shared/static/shared/favicon.png
 create mode 100644 shared/templates/shared/includes/base.html

diff --git a/.gitignore b/.gitignore
index 2f272e7..19bda59 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,9 @@
 __pycache__/
 staticfiles
 node_modules/*
-shared/static/*
+shared/static/shared/*.js
+shared/static/shared/*.txt
+shared/static/shared/*.css
 webpack-stats.json
 package-lock.json
 .venv
diff --git a/contracts/templates/contracts/index.html b/contracts/templates/contracts/index.html
new file mode 100644
index 0000000..79cce94
--- /dev/null
+++ b/contracts/templates/contracts/index.html
@@ -0,0 +1,5 @@
+{% extends "shared/includes/base.html" %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/contracts/urls.py b/contracts/urls.py
index b837598..3d6e452 100644
--- a/contracts/urls.py
+++ b/contracts/urls.py
@@ -3,4 +3,6 @@ from django.urls import path
 from . import views
 
 app_name = "contracts"
-urlpatterns = []
+urlpatterns = [
+    path("", views.index, name="index"),
+]
diff --git a/contracts/views.py b/contracts/views.py
index 91ea44a..36fa1cc 100644
--- a/contracts/views.py
+++ b/contracts/views.py
@@ -1,3 +1,17 @@
+from django.conf import settings
 from django.shortcuts import render
 
 # Create your views here.
+
+
+def index(request):
+    return render(
+        request,
+        "contracts/index.html",
+        {
+            "site_url": settings.SITE_URL,
+            "user": request.user,
+            "title": "Title",
+            "description": "Description",
+        }
+    )
diff --git a/env.example b/env.example
index 94d1434..2ca58dd 100644
--- a/env.example
+++ b/env.example
@@ -2,7 +2,7 @@ DATABASE_URL="postgresql://contracts:contracts@localhost:5432/contracts"
 
 SECRET_KEY=supersecret
 
-SITE_URL="http://localhost:8006"
+SITE_URL="http://localhost:8013"
 
 OIDC_RP_REALM_URL="http://localhost:8080/realms/master/"
 OIDC_RP_CLIENT_ID=contracts
diff --git a/oidc/templates/oidc/login.html b/oidc/templates/oidc/login.html
index f00d86a..f31980a 100644
--- a/oidc/templates/oidc/login.html
+++ b/oidc/templates/oidc/login.html
@@ -1,13 +1,5 @@
 {% extends "oidc/base.html" %}
 
 {% block content %}
-    {% if user.is_authenticated %}
-        <p>Current user: {{ user.email }}</p>
-        <form action="{% url "oidc_logout" %}" method="POST">
-            {% csrf_token %}
-            <input type="submit" value="logout">
-        </form>
-    {% else %}
-        <a href="{% url "oidc_authentication_init" %}">Přihlásit se</a>
-    {% endif %}
+    <a href="{% url "oidc_authentication_init" %}">Přihlásit se</a>
 {% endblock %}
diff --git a/package.json b/package.json
index 5675a2e..b6d5d92 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
     "css-loader": "^6.7.3",
     "jquery": "^3.6.3",
     "tailwindcss": "^3.2.4",
+    "vue": "v2-latest",
     "webpack": "^5.75.0",
     "webpack-bundle-tracker": "^1.8.0",
     "webpack-cli": "^5.0.1"
diff --git a/registry/settings/base.py b/registry/settings/base.py
index 5f69f70..0495288 100644
--- a/registry/settings/base.py
+++ b/registry/settings/base.py
@@ -23,6 +23,7 @@ BASE_DIR = pathlib.Path(__file__).parents[2]
 env = environ.Env()
 environ.Env.read_env(os.path.join(BASE_DIR, ".env"))
 
+
 # Quick-start development settings - unsuitable for production
 # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
 
@@ -35,6 +36,8 @@ ALLOWED_HOSTS = []
 
 STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
 
+SITE_URL = env.str("SITE_URL")
+
 
 ## Application definition
 
diff --git a/registry/urls.py b/registry/urls.py
index b80111c..2a4013e 100644
--- a/registry/urls.py
+++ b/registry/urls.py
@@ -18,8 +18,8 @@ from django.urls import include, path
 from pirates.urls import urlpatterns as pirates_urlpatterns
 
 urlpatterns = [
+    path("", include("contracts.urls")),
     path("markdownx/", include("markdownx.urls")),
-    path("contracts/", include("contracts.urls")),
     path("oidc/", include("oidc.urls")),
     path("admin/", admin.site.urls),
 ] + pirates_urlpatterns
diff --git a/shared/static/shared/favicon.png b/shared/static/shared/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..819126c749b3335134893d13561fd74a007e8f2a
GIT binary patch
literal 9781
zcmeAS@N?(olHy`uVBq!ia0y~yU^oK894rhB3|Z^l9xyPd{_%8i45?r|6Un?q#Z#bX
z?ZI1S^5?hZ-iDxv+uPpGeZOPZ?zP{y-8+(YevL8v)ZiEY1m{k?`gdcK<@*Ni-1i5a
zP9Lnk@>(GJhv}9lzZAvx-pX1ayY0w43%Ti!6!$dgUl2WPD7ty0fMrP4`JdNve2x~B
zeBHbLN8t2F5%$T&Tby|{iXY7>t>5%=s?(Bw6@xDJT@vp&9K^pKOBT6uDuyxtfMPdW
zM(f)`vw4T~B|1LN=q}p8p?^H5=eWb4w(A9&-@dIjbr3seGdYFpOAhb4yw|0V9GQOA
zG%<KMi7Y)i^U<fiI}E!Y)!4Mpi{M%37~eCm?rQNyV=0LbuWAf^R<zC)7r1gWQ<bB0
zVgK<No7DJT3w$>{bj(67Kfxkxu}F+}T-QyBKK=qDGq=SB$DXN|L@O`T5Ph-o>!*|x
zojez(wBCEbI!j`wYTgn48GP%U=l8uYu-#^|uAV!m^<>snv8g>1rJWY}djvmvvZm^W
zT=-(`X^Vtn_~Sa4zUZC3(e{<Y%zwXyU$q7>zGvF&ac<7ctP9~CTER+96VGK{Io$c<
z%(<r08M5&YN=zK0!Z}6VH@H<ul!|IgXQng@sXI2u-g_Lma6MbuvE&&Xc?ov1=M&to
zM6A4|&KVH&?L}#7)X@O%3C?Sj)-D&c?A@Sl7a?3ZA*n4gEZz70)tO%dv(8TV$ob7(
zxzRyIBW&G?6MA2NK9J7!?ea2Y_js56z~@iGUEUjUljrW>?tdV;r)m3VL%Xx$Ke+CH
z`q!0j`?h}P-S2ZAy1#kjel2G1+^gjlvZild$IbY+d-B<*cXdxsQZ93mD*7xk`+-Y|
zE1%A>*Bh0$e>-sR5dV$IlPxEI-Z{f^+Qu&JsH>lLocjLcPsh)?Cn@%ineUxBymM>(
zQoX=A&o79oFY44Za0?YFp0rd`K)`ZRs^+YvzntbAJNRSaj_PJLn~w5N-h2;Y!q{fK
zw5@6P*na4Cwd(U<q5Gc5)*V$lI_aY<pG(yHrE6rT9?+ktC!RTPYeR^qshU*+@0*@@
zuBpn$`|ix=-@xx3DY@?R38e)~S4K8Y3i|f!ug!#5uJ!6qe{fnaZqxPOwd3{2SplWo
z?1B4Q6I}T&7I`e@op&h2;O6F>bIL!}*oz!%e2*tQJ8HGcXtArzq3@MO(FWckkAgq)
z+)|vo<9A`hq{_?A^*mL7G*j7LajsF>ET?zu$f1-MDf<p(IyOk?94VADI8v$PY8rfH
z;)i+1rdKLS3%CBLi0QCmy~=%~ocq@{hj;Ui1b9x_n0q?OyQXpJ$)gqA_YOD42(8>>
zu4+F?gLkL7YPQp(X$1!I55rnTJ}>>j7Ok9ZyF=s?U+bcOp{w^yTKa@Nd7<8&o|6mS
zO3EGOw={Q{#GX?k>b}3lBc1)}oP;UG&pt8B9p#z$WOAYMCa*bXc5H}U{=my_$<_bM
z1<e25eyqLQB0M>I-toLMoF@*=_FCq&{)Xex4_Q&AVJ+unsz26jOWeBT(O=nZ)2FXG
z!_T|>gk&K5m;5qLt}y1~NhOnH=AM?*5x!nGRczh~7SCfnNo#v-D;Qr3ZtFkxaYf_R
z?Hvm`cpkgyt#`k0jc@%8|G?-EHGMs+9UJ^>vTFM|yKgIrec|eM>v^y<XWo}9-$b`e
zo*I<hp?9IF<HNP{;a?8FugH;_{Yc+?(yJo*Zx4*bau;PpM<zaNJ!QG^QqZ?22g}l?
zEY>!2kK&qW){$OP)u*S`#K3XR|477Zw_NEu70(N|*7{D5*3Rd$o^@~b(;u4K7jNFa
z<-bX}Y(h|I<gb8fz6*2xyCqL1BuTPKy4Zc1Q7UAx(sjCFccIZ?rDrxL4@hk6J>3<_
zHu3117PiA?FASb2nq6q&yM0&W?$O8hkJ!E4^}l}Sjm77G+jXsr{=PT7^t|;;`{(nl
zXPukL_Pu2P6;7iIjztz-xlLE4u3VJczEEhQvH^p|h1N~~I#XS)n10kb@q0&qthHSO
z$J8CHvVRIcaEAHF-<hJu`(I^V#G?fhUkFKtr|?IFMSD0Ki2J78+9~&dO{e(Qg9*(C
z6+Z4g!Lfs-SZ=D!v&Sa#@hNZZv{jDTZuTgRncO6K<@U4**DjhJRyxbQbj5Pv6Tbes
zd4E_ghbQDM%KKyYRl`+%{-b$`cWd9}I>d=?@9TIMerw_Ky(^i`4}ah*YuY+@#i4C!
z$IIGQZabr)x`CsTS1GV1Qle{%+OgNyCfi&RQd75C)R^~t?`rv~n@VqWeH=pX9Z{<L
zUM|zfJWIA-CBWR+W#=CC4?B#bYP@s|`F34@z&2lY>kUQMuJ*GUmwZi_zVijUH1cok
z=lNqH^}kIv=*pWzTq4ir7D|h|$v8jS+fwt(rdD^6W|H+QNtxxIA1CrYbc*{WW#!~P
z*Lt49rSoFiU+>62?P#{VvN5UU#AB)BZHiv=iey5cr|4`wF{M(V|A&NnmO#qNuao(|
z$!$)0q&TbA!y}_ZH?*)-d*i|G=68=;7M!>I@69Q?f7bKxkJazaEL(M8YQ|bmLzm`;
zIT|e0s&^*1uZVE1UvTL6emCBUZ$4V<&gw{Yp0YJ;{}aCy6Jht1Q!jsh+#mHv>~|*P
z)zd*%Tb3Oa`7Y;SqEz>GWy__96&7Nib^oUeJF&a2)O)c0qsF&+KLmSJtS$-u*S?x@
zWl==#=Ph|{7M}f)>FY|jn~O@uxhX$#Te{odB-7rB-TkXZ@9m<y3*8GHuXRi>*kP8o
z`}G@MxhY`*<z5VrUCo;B@8OP9Y+%|RvSm}>@d8KZ<(;=Z>&_mWW6!r}g7wkGajxdB
zT{FW{G;<jQBNw05aXOt;eL%^tE%HR>;!7{Dw+JvbO=^1()}k=W!Kb=VqAh#(+!@_^
zr*7{%-*x!&-yOFXPG(n&m^S&L?(v!_L6!~5OZNJoP>%Q9;@742N$%YJ1$<9ucZozw
z`|Aee9x2Mcp15dB?=~yHwwrh4F52FznffSGylerNXhdKCN5N;0Z1;4|tSJ3%$ejNm
zcFIF#og+md3)n1;TCH?WiyGP9SM-`G6tJ~S&(m+R0DEkm)210!H@(&^ig)xo-d1^D
z&i1v;rWMY-(;nv9bXpgh)^%Jqlu%!wzH6ay-vLDnfz})O-#6NK6>{`BsFyhV&uK{f
zVRr7Ig-yftjWSnP9OrYf+O51{`togWkCZIk79RP2K?bX%i%-g*(k+pvf*uuxX~(>E
zce&BT|Iz5(p{qai_Vukl*wi;+$y}j3U79ocbzKgB*uvsxmM5}*MbFL1YlaFd9hQ1o
zeZ1B)HL7oC{?d#kuO_X^(RZKI`}$+-mje?u9=)jV?hm`c|Mr9b54(Ro-#0Se{@kHZ
z^P|DPe4*gv9o^G62c7;AJjsSJI9=3-bMw@wWE~|X^O<X&w|KnE=(XD+;GZb`u;<5K
zllY(cvZovSPk5D_nV*@ncGd6OMc-;-TchgRT3EzieR!Y2?EUA&0$H~QnL2LC6;ERR
zU5bin43nvUwSIbwQM;b2u_f0I?(6c>Gg=o;R(U*USGyt8+#lh7Pdpw=^c<9VvqVwp
z-eLKDTysvmH@wSLQ)l|JB%zOK_JJ*j3x7nUdvolJ?%!U}7j}SC{`UfXx#LxK7yr~d
z^{`sBWp{mS5vjbS{?zyLi_=9B-5*T0o?+||sO5Y5Ly@nwc4@!ai*EM~oD+q`8Ts!|
z`nNprNO9WlPdNpf9?Z??ahiQB;-}RchLSAt!a4H}CK{v^NLVd2zV-0I6W7T$`#OWJ
z6i&GKvh?Jnqb&P4(pHJCy4tnm>Ca2yn~wZixMEqAWAsx8O|OrN(-K9mCFq7djD7Q7
zqyG0Pncojf_Vl?u>ttUOxawHIyesy{F1h?;S;Lo?zxob$*@0@SBk$QHJZl=POYR?R
zwfLp&(#KpVyUoDH(r(M-?|ip5XRq7xt?K7Az89%EO2$#%f~*hz-THD_z+L#&2f=j*
z6Vy_LErMS3UccZ{KY#z*Bg%I)_Z~O;r;_5f+%f0vZO;|$IlsKyj;$$QZn>|^&_Y5p
z;?Z%z9pbl5U#YZ)*|vS$TG3q6(XoBY-gj{;l%H+n;of;*TGW$&GfMw#zV=w{OOtBd
zo9^NbH&41xIpO#xs*TSkVal~#GavfhFWlQMlIQGq>xxXqvp)`;4`U45ukMh$EBw4i
z#4TZ?z=2zfPdrRpGQ+)4?EJ6CeBTe6UH<E&o@5-n_ldTtyr^7%g7=1L4~=9dSj5li
zc*?Zx;>WkXFHWyBJ<J#8$($#h+WXFE@^gWc4}AahPiWoYVpZ8-QyO{Z2*aDn7MgaK
zHrlN+SF$-Rw{T7GqF1w2xKncaimlEaDx1lDaCTT)os&V)nxmCB%oBrnjz-P9rdI#6
zY|g=C5y^dhN>iuD7Br^bWw=oDX3{>#gl$<4V(okz%pMiWOft}HOKf&#+rLcXaAJ@8
zx#CSHISyQ$ws7tA1&wz)ynJV_lr^_kd{Xs_<NN~eAeWAX|EsoriP&fMKxmzM*V%6&
zTVIMSlb^O>rQ(tYcI5`{D_W-ScrRPxEg|;D*7wDI)$5kJY40-6`7QLEe)iAH=Xahb
z^vsB<4^lSyD4{5`$Z*rUBhoKsX=rwRWHj~N^0$POId9(Pp8Yj%6mGv*<o&rcCVUUG
z>dgE73#{5Dy3ap&;Nn@xW_D3^I@fI7<P(?Oq#ra}Tq^6Yer%Xg6l$!<EgpU6=;Iaz
zHAO{VKK{iD7X>c)uF4X5n}2BO8>{l85jvgcL~mMMKRRDOMCf_r44F^)ZzJC)&EtHy
zTBmN3hTm;D?;ROJxpu~TuSZOrxpYT{)Z2Ss*iRJs%=<mLCWOOXK&(CF!Rf-9Mb|F7
zW-#Q2)TbFvicO!gDmFMJ`0j!i#v&IU-&_#0k6ox~#x6d_N9BTQ%5xPoZ!Pl4=KNG)
zcev)w^fenKB_G-U+THc5A}2X(@^1Y*+zVD7m?Ut{^h)d|3*KoDJ_b+y>X@Fa-Iva_
z+y49d<I+8T{pV9JdhYsS>Jcd{GkwBm(Jj6c1l*JMHP}?%TpxWi^q6Gs=g;hNEv;2g
zrQ*MPR<u2w(j#ECydyf5*TOci;E&atCHMKaFkN-}c4La6{i6Qa8U=i>ZgNS#lFv{S
zUALz4a(Jy~pwBk#ZHhK#k^O->3m0sk?PqLfzke&k(wdLk+kQkzXgyuFK(BtQ-9w3c
zCAs24zE&r{)+tF(pI>zI8ZWDC8?Q*@m%X2x9zI;{RatD}CR{glg?*u2(UsW`{PJ0y
zlhPw@KRcG~e?94!;M!W2+!aMk6E1!@zGfxsvE-+hH`F(^{9ya1ry#ShB}c_u{l&#O
z0*hl(zpOtc6wp2QM8}>?o`7poRw*ra+mwY=ToltdG}_r&=A{I_ne=Q?X3@WfydNze
z8um}<P-ha16KRc%zt!P)WA=_deP*$uhsk38m5(+%xNnU1e&BOugC>tgp=$i$sau<)
zUb_6R_nac2-gzm$#%|TjgL_YO>Et=*c>im#u01&aLDj@9eLa^16;tbE>?#cdokS9?
z|L?u?C^_%0nDm#IR<FJ9thnR;#7L3b!lJ*WLrs3dI@R}UT&|Wfo-&m=RS>bQ`n2nR
z{z8!(%z1x*xoQ1wS)u53L_1_l--LPG@z2?GT#maW3;P#b4&CDREdG8v>;LI~!Ec(R
z?>inj+8i@Qua!&GZ<c`98pj`>wJ&N1I{cA3b+l`?@|=?meRo%~yuH)KWL|hyKUe&h
z$`*z0=8p=`XKb}#oc5qlZq^P9p<7?s!mPL5{olDPaUIt$Zf27$vHm)8e_KTq|2$ve
z%VU-la7ge??kwpO`ZG=`3GZG#FZNy7^$3O2Z53AxB!%T2Z$9{!)V{#)Qd*66pwpM*
zRa5iael-@Al&v>9_HVoIss9V~w;A?bm>T!TGXJ5$jy8{!rL%k`CTS>EC9tYDZcy01
z@ye6-fBKVOzWu}Rrtr!3xsQjzxrs|l{>p4Dx5#5<Q}OEHi%^jbzot}kfA6W=(+po{
zaDTSnF)gOW-<;h{<l-NhgB~*Rp&#8Io%*Gq^FUZX{e#qZE$+2@BlF8oKH3~3qM3N~
zaZrg-d8@NbW8<QwFD7ot|2r|g+U(l04@FL8leqKutY02Ev3*t4%|m}XY;OfUwJ>^^
zbL0Eh@}(*>k0<m^KI5e`egCP7x%J+5^S(J9`?y|6V-|<w4F3Oe-<nmqiq70WZMrS{
z;;~lCx}0yt=3>#3+tfWT<nDYZ`R>A7&VqW$wflr*1n-#{GJnh3eE)elpPMQB1Ctla
zKPbwDeJWzfXw8$|zK?g>i;H4Um0TDec7+*=fAQOV{FAl&qQ3tXvG3y5E??ek@@v)U
zb*I0wFBVdBQP-IkH6?qO6;Jv4;4HJNyq)RI-%L2;eZ}IQ1})olI^w>$kp99=Y-=)E
z=N+xo`FkmL$B)x#J2_)gjf*zaSBo!HPXAQ?aYbq8`qjVXvMeQ+Y|B2Rf9LfXLvxQR
z<*(v9oSr?XIIYNcke_d6oX?Fkqd!c7u8&LZ7#;emlaM9)b77yopy?Ur$4gpkg?N5x
zHcHq>bKdsJ+_PZ++Bbg}&tACW+^4%cYd@wx6%{V>XqhH4i}8i_-3>m~8qycc6YG9R
zX)Rs4WcpX1lIbELv#vg~*5J?ldS-FjokJH3wp|kxIez79$8xo}{)8R*`H3&%ZC|Lx
zheiK;^o>XEYLK6Hf~Q5_{)#i#A81X!{c&&0$pVJBFY2Bh{$6*vHb!pNxF1{-<hP-I
zqW=5?A8tL^^D^I1m|fMU!|{gBbcG*EGyHccxF6wM*ec{Ww<N$LI&_jijQm8_zEX)f
z6+aiGcd~tso;^z-#^j?~{vlh=`Ca^;2A^H`l|TA;<m=(g6;oH;e0?eCqRUj%>DQ`$
zi}xCR6gwq2;rdU3yFzM*A6EFgUrGJ7E$rH*nxzfW@dsS(SS^hgh_PFC|D7W>XWEAU
z7o_&P`#qD-db{9k_{$5eHn$(nZ+&Ju(O9<0B*7+#GrPSw@Nn7*!HZX#7V*h8TI8Lu
z?%kbI^|8aOXs=b%uFiru=|c4=b)Pol4XqBJ5(QSYSv=eE!n2R*#;!HY_ZPO`wpLu^
z`F`>3mg5)2roH&6tHa4r@5r>&_lM=mEVqOYpC|ANdpdI8-RZr8<KcdPWjVLmEgP3!
z-Y_+NFS~yI{l57@5__(k%~~~iT0`6eZOapu{>3c<#f6$v?yJ5zlxo2CI+Tf3ky-Sd
zje$vLyVuSW4<{d)#5rRQfA}?%!nIQ7YHuuMn(Py-TWxmMJy6t>)!I8th5yAbsU_#x
zLzHD6ec;-2^@kvrkf`VKB(Yf*&lWH$o)XupJTTwyar`ZBqrZQ4uCD8Fw)K@y2w23H
z9Uar{Ww&=z3Xi|*wU;JV2YdW^zAv$4I)5|xxblk=R(GamyxiejXcy+m<C(l>Rz#}F
z!Jg$YTGk%*im$RW#MD|8%DXqnh^wZlZ*?-PYuO&?f61e=NA8|o{V7#{C$(#R9oH@A
z3vG1S(IIe1a;xn5#okSG3Ru%7-&a$fbZf#{Y5RM7qjzo%&;0o$h-c0;-+Ao|N@mTC
zXsSPUU5M-Zmt${#utZMkKdL^DTO;n`gk?|nXG$7xZhzt=8g@wWfY%461V&YbO%*c7
z7lta;6d2As9wxW)dK*{$ub2AwyYhE^uRZW@d+$Z>?H;Ra7w!(Z8&gpESkPDFc;tzi
zmy&C23(Vr&RHZtruAZ{ASbubX$?HjXOW9+d{o&rL@%l6O%Dts8HtmqUyFY{>KfdI!
zYlYnD3oeRYrf+}Ey}x5=w<P<?r+dwf)=%uv7R&DVZBgvy^yGt7TWu!ON`d<hoc}s1
zJ4{R#G9P4I8t;*{D(>Fy-6~#@|Jv`nxqNNTyOYEber^9z-i+_63tZbDXw2!|9oQCn
z_Ep9Y-{5tVY9GybeT*Z01?&4gEJqwOt|WPC8ys8LC{y@DoF}m4VEM;vo3^5y?@c$>
zWKIY+=WBX@pm7sR%g03;@&)R1Sxj1kmOU?Sf7g9W|8;>(`{a+@Hm&=UnEwgy+>m9(
zvhHH?ipy$CPuPTtxK8KX)x5at%HGRSj8T#Gja)l~_jPA~U`b09o%JK+r0dB&mG->i
zclP*PU@-Q7xW+i3`NOgK+P~g$E4r}78cL|{V7<IS&U%8g%a6%E`<_Jolb(?-qPJmH
zp_Kldshf8AmL2@y-*NWI=`YG}xu15_USP|;C_g<(DD6>lj#Kc7Lq?BgP0Gv*tkwGZ
z(&?GA&BYq~sY25a&QE%08+gVl+cEX+)*gYi1sZLSnEuEaKbqp+%J5RcqFvd<Pwi~6
z>NL)U^Ai&O^`HIo)a_%ljZ((7C0Tvp${CD`QHz<`l600Oa+)Q#yS49~tj%4#Ges#v
z`0C^{dzM~G-l1VGwVC;T_UnL<fZa3IXaBs+=5X<Pf!vEO!wQ!AqkO&DMF~~;%Iu8X
zKREMQeulrk$@l&8+T6O_4~2Q2uiT#~>7Kphl08B2G&AQ#spF5h_Oxo5B#D0y`+F#0
zvhVZ4>gzn8K06h>Xpi)Kwej6Ntvw#QOCIfz_gy~EX6bq*;Rh{Wk3Rk(t@J<k(DZ4Q
zfe!<;FVx4bm402YP2-YWx7zz{tRmK;CqMbj3VN1%;DxPNm<8{8W%d_56Ac1xN#A&S
z=j{9C1?u1WzUn`?Eq1}|oMcCI<<qc5iU)pY$h;Spd3lw?{jp+5lKAe`VUwSPR`cw#
zQY;S+wZE)+r)6jB-)kFdzQ^s_dN%Cr8pYQ1l_~$5r;EEKWp+sMOgY0Cda>!KZo7f=
zuNT+MM6bQSymqy{_Cl`QRnjvn+B7n_K1`|$IJ)ET=4;C(wlDBnfAE3zE|vw$6Ox%;
zoqTa5%S`=N&dfz-)r)jfpG)02B@?;6QDc+ok_ip&23wCF&bYL%d(y3Q5}a06>7U&8
zG%~#Q^zPDeI}kCq=4Mw;Z}#pp-`{g>y#BMUpS$~|hmZ3T$vAUA154kkm>;oMzy4JJ
zJmHx%)3M*Lp1(gkW83Z<VyCzcU-avnw%PJe*p!snJ!-awzn-7|_krE5IHY3#w>h&4
zI_tZAc3D4W*p~Um=I52nWnq)U``=Gmzt#So+B!kSB94_#f7%^FPghyY{JLXj*5w-&
z|1GBrBuPK@mR;T@(Ze!5@mR9xK0l5^)htQBqwAbQO#b(LnRM}2sI#?9z!R6A0>SRX
z_Q|YgcQgvL<mv32A-T9{FN;k=v1(yXpR4NDoGrVqD*EnSZ|47_-OS43pNr_OXB+k}
zoZ$M@FUUzVuV(e%?u!C^Y88oFOwWBTREYbsc=@keQ#=-?F_(X1lKS{T)KjX!u*b3X
zXqr#x@;967=ch-OYj3Ii!o5O&x#zcypSRXERYe}3H2v4th3l)fT>tazgrTV0z2gTi
z^0O44z4gNXu7&aZc{82{ee^L2usoT%i;1tnvX6WFg!QpkS4}XVYw|w-mimR3&>x!*
z^OtC^ik#M2*|`13<G^+EG>&ZUXb@}Wd;cu9+(ha`Xw&_zFXl`$pYPFaz}ng)?{y~T
z;1ScK2YvkKG<cnQ_GadVcUP+`{}@bWR{QrufB*7t{5w3jBc`}@tf)M`^8Ky$*X_-%
zYh6-8Po3K|NBZbKR^KB!Dc(}0PafHSDvLic>EaW)u56LYKi%#e6Aw+B`9UPa%&vWQ
zM2l5=`jLOkhH-bNZJW8qrCxHbh@GlU#r{P%Mf0B<?6#kyFKgplSG#ZDv_H9ycJ-20
z2X5S3l6m{I*#WH^tA1DUWwD$-$Lmpltl;m3|DP@0S>_1eljke=5cf{^YO+QT<9+5&
zTM8Xc-*6GzQppnN@y7AkMXf-Y_*?}umMD9<N$ve=@0}HSuAW|dWbTX>k>k_3bhiE$
z;IeitajT9#dgSu%#xRz6p8dSGkFt9m{p{x7;aH{{FrhF|#OUR(s6W;F&R$Tx;gvo8
z`PRa|g0>~OJ+lK6B$~47JvrX<ukOx$U0YypIsb*k^SxchpKn<%*wx<K=(l8<WBj_)
zt12F>K6os`s%%#9*`Es~{RN~%Z<$PsE!5p)a-Wxnsa)u?e#hpm_mf;yToNOM)J66)
zZJ+ulcy;;pZ|e=uC)wzS8eZjE`Q+i82VcHyG|jpDG{t3p@j|Z_>BmPNey!QHwS#jd
zyR=;L^K`40Yk${#&lE8<TC>?ML_$;Jj$~NE<JkT~1w3L#u@5FR+VmE-yc2kHMXc}F
za@8GS&y5zXJM2_v?r&YlUBJ^*$^Uqbg8#Q8^?~0MYFW+Z#z?6r)qa-uIC1df%%8iz
z|9h|cF!TTC_46-o@Y*VK?s|Y-JFDc*YpZ1sEQ@BW{3mHHFzx4;`1<Hmdi9oBUpK#)
zcyso}+U=M4U5h5=^c>i8^+Aze+tO?2gIMx=w;Da<&Wc+4=D65Ko+a^$pS0~JDwk))
zgwJ-k?6R<EwTJq=m4Cwpg!U`Hnz1CrYOi43*=%07Z^_?gusg^+S==+#$oC@K<O?gV
zs|GMB#yzSs<KM91^~KdEn^r8@&idTqNb<ixWjQD5b+T%aZhj?R`$KDGBYO@NNW^g+
zPkgk`e1pFahgp;D$y;Tg^i99q4*J(JqoDjfs|;82@!i+%1=)%BeW~c2v?*@eq{)x;
zPh3ox_^mqpQHF$<#f@d23y&9W4*E3v+tkYS_Wk+lae>{F!=v=wRhL^_b5Wn$^f=S{
zde+UiR>|9VzJGqcP3&-@#7Xt8IVVp%_^w=`|G9nP`vb=Wi_W@+`?W<$r)C<hui18z
z;q4>e4LZA1#rJqF_g@@Po+w|_y=YB|t(0P?%9bxoUpAi&+&CeB19$$4SwWG~>yzvj
zYFXKxEVS*)UF14PJ5BNUeBD#uxC1)wr98^0{rKR;R{K37at>U3o%uG4N-FI>-!=QJ
zy0S~ofmh4p8|7Nf4j<T=6xDH6mig%33wjKfE?gH*XIl}Ib+z(u>eMpZ*olm0hq>-@
z_Q!YHUwotcuw#nz(Rbf=X+8NbB-OlGH}62*3QoRzFZ@f-L<x6Q-=4MO%--xH+`H;d
z_`E*%wCi)i<`yZVmodk_ZgFMHbF^(aA;@%RLaq4Q4ICWnd!DOz_f2V^z4VLh`%VK-
z$u%2XuQl7>m}4<VWXZ(tuUq&-R5!#gRLkh~6+L(8^ONJ-7YIJuzD84GqgZn3+q3;^
z!gr|4PF^~b;nZTqg}0U~v)>Hb`sGzo2+Q9Cy9-yhz1Sgj-II&)yv6@$@#*2^5&fsX
z9^>@R<xpk{ysex2@#wFcNn0g8x=c|%H1C#MOrwrsP{bL9n1+|nu1nV(ar)AH(B{Lu
z-v!6r|7@SG)3s1#Hg5pasR9!<<=5sM6A#bdcy9WnMd5XAE~lHH+BSL4IC|M4Z1O{9
z=}GF=pE?94x4lR%5;9DAJa3PnZSKNGc~^<{+<)`C$~Q1&FiPm{`T60i@2tfh@uq4I
z7<}7~UNfGjZFTWiXfdnwAyW_k*(*=~;5in3Pb0>3T5)`&`P=dzmEHY8QH@VF?(072
zad^wYTZd=Lewr7#Xvuwl`(JjcvAJ!oY;`h?o-2;)NnTo`T4=1ddF!sLduK6M%y-Io
zZOAEWBB(Sw?`|X)n{k4y(#rzP(kDL0r>wc~ZsVGD$_6aO7hIMpY<V-MzPq@NO@8&)
zHZ^y?REv|_Go7xfMLk^JH235*n~(Z)_DoqcrRUaB<;Q_X&E_d>{&?u_?2Uqf-EV#t
zWHk5l{g}NYcj}Il$GJB|N#`G}WC=L(;AgT>_N9&4`#H2XKHb;UemvRe)!y?qTb4gK
zA2R9hpPX6lt`B~&*)-Sv<8=wUwewbHaZRRrkZ;T6WeUf6PxfBEcKY7dIqScDSgDbG
zI>=*#>-K_k33-Vb^~}#6TK}6BWH~!^ug==qjHWGBXBC~6+nl~W#rMsO9dC0d1>7-|
zDm4^S&RTfz)Zd){qKCvS-F`^xbxl-Rxj=r?x0Il{$6SOC&ORiYm&Q5aUe8|xHhY!y
zIsHZ^g&B@vcOP@jo4ul@#>2K*ZOTKV<IxIoC7r1qYt)rI^)GRKTEA8OMON+eGylxa
z7X6c|eOt(wrhK~CcncqA_})1a?kNO`y?-1e(-~&4-(yzZ-^Y>)LCw+bEKdrKACV8@
zvgUE!(_>>8n(#RH?mX|Ky$3{ct~#~M-q6^aR(X13v>~f<$6+_GnLV4C_}Evz<o|T(
zM8Z9bS@R}M*WF-ec2&x0+r*u$+yUxM({}xIZ#}O6Y6C<00)9bvm5p_?zAjBMc(<Z3
zZs93w3+8L{XPk`Z&h1&tbNhL&h}uG@-Bpa*54YU7_<Y^*!xq*h!ndZDacY*R9-Vyo
z_54hw&9lA=u2q;QY^0X^_N|=O5)YZj0X;{AHQcAxt=h|JBx9Jgv;FE17XKs`KHj@;
zHy(PosZ7PR&EKN_nyKBvPGJG9r}GwPv6>x7D|&kNN`?EJwrE3nYk|zQ0`uCZPoKYw
z`E!A`pS$_H6@^c2F0)0p74MHvYVn>qZTkl9rEhg+AN;7HyYAc(-Wgp*InGD^B;D(X
z>f0dtbVk?fLbjW3hpSU^cg;=Ae3dWA-+jnI$@^Gk@BM(2&+jzcYn$^{YjN}1BWapR
z8L9UqYYk<tCvZJW)HPekReE9(r{L6og0m*L%C6eLnQh1)T)?}pf8UEWQ#Yy|($U`7
z>@3`2xjsWr$ySA9iN;Ay>2ubS*5{W+KYo6H$r^69B#U#0&llSMYw4^ISX#m5zfgof
zN$Fq5>yO2A+8;`E=;_{!+I(@@?Tpg~7rpOgRz&a4`I9xPC`zzUURmKnRF3*h<82qC
z_SLgo(s0P$;wZhvjq%d|8GqNA-{LN76D?M7x1V4#<$x;dcPk0;g6J78aewdaI9G7`
z2E*=doyk7GB9eu38${o%RVo!?-7@)&^>zJ>iX}=mM%s^MGqtx&{KoXKSEY}u`sBH-
zO5WTXZZRDZ5q&+0JIH4Ld+!YkGqktVee<53%qynq)Nn%T4fE`TziR?C1MXV<bCa|C
zcWR>=Q<3m1Hco|qJpsBx-@k6#Xm<Bn?MjywTV|SFt9t)Yl3$(U>YOKCe?p_(uSi`>
zdGz=v$Fd*YZzH5L{ckAUUZlHPOul#9QL)=8+8gIxoA!x;ePgM;`u(^#^%<`kH(IaF
zJ+$|tl61=S8?|9+rT+tju0+ken=XD+LHm>aOh>W(HnR`jJ-79y<SgYK(uZ1R6w7^A
z+Bxg_cbyGM+3A1ZD$UMVf7>Z~>CYpd->lzMRDD}+^Xl9gTQ?_ZPq2Ldke_QhyGfL9
ztL=5YT|aYIGz32RTD<CC&(`ht$|n82v2L67+ADFJEVrGw7P&Mu`kGR=PWIKX%-1;+
z&u*N)=E}P*tKS|koAh<tw`m_wzcS$0xTC7fa_Nyp-hb9VQ`c#^FXxqKU|?YIboFyt
I=akR{0K8|&eE<Le

literal 0
HcmV?d00001

diff --git a/shared/templates/shared/includes/base.html b/shared/templates/shared/includes/base.html
new file mode 100644
index 0000000..a10c433
--- /dev/null
+++ b/shared/templates/shared/includes/base.html
@@ -0,0 +1,121 @@
+{% load static %}
+{% load render_bundle from webpack_loader %}
+
+<!DOCTYPE html>
+<html lang="cs">
+    <head>
+        <meta charset="utf-8">
+        
+        <meta name="title" content="{{ title }}">
+        <meta name="description" content="{{ description }}">
+
+        {% comment %}Open Graph / Facebook{% endcomment %}
+        <meta property="og:type" content="website">
+        <meta property="og:url" content="{{ site_url }}">
+        <meta property="og:title" content="{{ title }}">
+        <meta property="og:description" content="{{ description }}">
+        {% comment %}<meta property="og:image" content="">{% endcomment %}
+
+        {% comment %}Twitter{% endcomment %}
+        <meta property="twitter:card" content="app">
+        <meta property="twitter:url" content="{{ site_url }}">
+        <meta property="twitter:title" content="{{ title }}">
+        <meta property="twitter:description" content="{{ description }}">
+        {% comment %}<meta property="twitter:image" content="">{% endcomment %}
+
+        <link
+            rel="icon"
+            type="image/png"
+            href="{% static "shared/favicon.png" %}"
+        >
+        
+        <link
+            href="https://styleguide.pirati.cz/2.11.x/css/styles.css"
+            rel="stylesheet"
+            media="all"
+        >
+        <link
+            href="https://styleguide.pirati.cz/2.11.x/css/pattern-scaffolding.css"
+            rel="stylesheet"
+            media="all"
+        >
+        
+        {% render_bundle "shared" %}
+        {% render_bundle "base" %}
+        
+        <title>{{ title }}</title>
+    </head>
+    <body>
+        <header>
+            <nav class="navbar navbar--simple __js-root">
+                <ui-app inline-template>
+                    <ui-navbar inline-template>
+                        <div>
+                            <div class="container container--default navbar__content" :class="{'navbar__content--initialized': true}">
+                                <div class="navbar__brand my-4 flex items-center lg:pr-8 lg:my-0">
+                                    <a href="/">
+                                        <img src="https://styleguide.pirati.cz/2.11.x/images/logo-round-white.svg" class="w-8" />
+                                    </a>
+                                    <a href="/" class="pl-4 font-bold text-xl lg:border-r lg:border-grey-300 lg:pr-8">Registr smluv</a>
+                                </div>
+                                
+                                <div class="navbar__menutoggle my-4 flex justify-end lg:hidden">
+                                    <a href="#" @click="show = !show" class="no-underline hover:no-underline">
+                                        <i class="ico--menu text-3xl"></i>
+                                    </a>
+                                </div>
+                                
+                                <div v-if="show || isLgScreenSize" class="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto">
+                                    <ul class="navbar-menu text-white">
+                                        <li class="navbar-menu__item">
+                                            <a href="#TODO" data-href="#TODO" class="navbar-menu__link">Všechny smlouvy</a>
+                                        </li>
+                                        <li class="navbar-menu__item">
+                                            <a href="#TODO" data-href="#TODO" class="navbar-menu__link">Hledání</a>
+                                        </li>
+                                    </ul>
+                                </div>
+                                
+                                <div v-if="show || isLgScreenSize" class="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-col sm:flex-row lg:flex-col sm:space-x-4 space-y-2 sm:space-y-0 lg:space-y-2 xl:flex-row xl:space-x-2 xl:space-y-0">
+                                    {% if user %}
+                                        <div class="flex items-center space-x-4">
+                                            <span class="head-heavy-2xs">{{ user.get_username }}</span>
+                                            <div class="avatar avatar--2xs">
+                                                <img
+                                                    src="https://randomuser.me/api/portraits/women/83.jpg"
+                                                    alt="Tvůj profilový obrázek"
+                                                >
+                                            </div>
+                                            <form action="{% url "oidc_logout" %}" method="POST">
+                                                {% csrf_token %}
+                                                <button
+                                                    class="text-grey-200 hover:text-white"
+                                                    type="submit"
+                                                ><i class="ico--log-out"></i></button>
+                                            </form>
+                                        </div>
+                                    {% else %}
+                                        <a
+                                            class="btn btn--white btn--hoveractive cursor-pointer"
+                                            href="{% url "oidc:login" %}"
+                                        >
+                                            <div class="btn__body">Přihlásit se</div>
+                                        </a>
+                                    {% endif %}
+                                </div>
+                            </div>
+                        </div>
+                    </ui-navbar>
+                </ui-app>
+            </nav>
+        </header>
+        
+        <main>
+            {% block content %}{% endblock %}
+        </main>
+        
+        <script
+            src="https://styleguide.pirati.cz/2.11.x/js/main.bundle.js"
+        ></script>
+    </body>
+</html>
diff --git a/static_src/base.js b/static_src/base.js
index e69de29..156d4b7 100644
--- a/static_src/base.js
+++ b/static_src/base.js
@@ -0,0 +1,3 @@
+import Vue from "vue/dist/vue.esm.browser.min";
+
+window["Vue"] = Vue;
-- 
GitLab