From bf097096c1d2794c121e59b5d4a1a1017380b949 Mon Sep 17 00:00:00 2001 From: Steve Nyemba Date: Fri, 31 Oct 2025 17:27:33 -0500 Subject: [PATCH] basic qcms site --- qcms-manifest.json | 84 ++++++++++++ requirements.txt | 8 ++ .../_assets/files/usecase-diagram.drawio | 88 +++++++++++++ www/content/_assets/images/logo-1.png | Bin 0 -> 12176 bytes www/content/_assets/images/logo.png | Bin 0 -> 14991 bytes www/content/_assets/images/usecase.png | Bin 0 -> 37811 bytes .../_assets/themes/default/borders.css | 38 ++++++ www/content/_assets/themes/default/footer.css | 19 +++ www/content/_assets/themes/default/header.css | 3 + www/content/_assets/themes/default/layout.css | 22 ++++ www/content/_assets/themes/default/menu.css | 78 ++++++++++++ www/content/_assets/themes/default/pane.css | 2 + .../_assets/themes/default/responsive.css | 36 ++++++ www/content/_assets/themes/hiplab/borders.css | 38 ++++++ www/content/_assets/themes/hiplab/footer.css | 19 +++ www/content/_assets/themes/hiplab/header.css | 3 + www/content/_assets/themes/hiplab/layout.css | 37 ++++++ www/content/_assets/themes/hiplab/menu.css | 110 ++++++++++++++++ www/content/_assets/themes/hiplab/pane.css | 2 + .../_assets/themes/hiplab/responsive.css | 36 ++++++ .../_assets/themes/magazine/borders.css | 38 ++++++ .../_assets/themes/magazine/footer.css | 22 ++++ .../_assets/themes/magazine/header.css | 13 ++ .../_assets/themes/magazine/layout.css | 55 ++++++++ www/content/_assets/themes/magazine/menu.css | 110 ++++++++++++++++ www/content/_assets/themes/magazine/pane.css | 14 ++ .../_assets/themes/magazine/responsive.css | 36 ++++++ www/content/_assets/themes/oss/borders.css | 38 ++++++ www/content/_assets/themes/oss/footer.css | 21 +++ www/content/_assets/themes/oss/header.css | 7 + www/content/_assets/themes/oss/layout.css | 50 ++++++++ www/content/_assets/themes/oss/menu.css | 82 ++++++++++++ www/content/_assets/themes/oss/pane.css | 1 + www/content/_assets/themes/oss/responsive.css | 36 ++++++ www/content/_assets/themes/resume/borders.css | 38 ++++++ www/content/_assets/themes/resume/footer.css | 19 +++ www/content/_assets/themes/resume/header.css | 3 + www/content/_assets/themes/resume/layout.css | 22 ++++ www/content/_assets/themes/resume/menu.css | 79 ++++++++++++ www/content/_assets/themes/resume/pane.css | 0 .../_assets/themes/resume/responsive.css | 36 ++++++ www/content/_plugins/themes.py | 38 ++++++ www/content/about/copyright.html | 13 ++ www/content/about/license.md | 8 ++ www/content/docs/overview.md | 0 www/content/docs/plugins.md | 37 ++++++ www/content/docs/themes.md | 49 +++++++ www/content/features.md | 14 ++ www/content/index.html | 46 +++++++ www/content/installation.html | 120 ++++++++++++++++++ 50 files changed, 1668 insertions(+) create mode 100644 qcms-manifest.json create mode 100644 requirements.txt create mode 100644 www/content/_assets/files/usecase-diagram.drawio create mode 100644 www/content/_assets/images/logo-1.png create mode 100644 www/content/_assets/images/logo.png create mode 100644 www/content/_assets/images/usecase.png create mode 100644 www/content/_assets/themes/default/borders.css create mode 100644 www/content/_assets/themes/default/footer.css create mode 100644 www/content/_assets/themes/default/header.css create mode 100644 www/content/_assets/themes/default/layout.css create mode 100644 www/content/_assets/themes/default/menu.css create mode 100644 www/content/_assets/themes/default/pane.css create mode 100644 www/content/_assets/themes/default/responsive.css create mode 100644 www/content/_assets/themes/hiplab/borders.css create mode 100644 www/content/_assets/themes/hiplab/footer.css create mode 100644 www/content/_assets/themes/hiplab/header.css create mode 100644 www/content/_assets/themes/hiplab/layout.css create mode 100644 www/content/_assets/themes/hiplab/menu.css create mode 100644 www/content/_assets/themes/hiplab/pane.css create mode 100644 www/content/_assets/themes/hiplab/responsive.css create mode 100644 www/content/_assets/themes/magazine/borders.css create mode 100644 www/content/_assets/themes/magazine/footer.css create mode 100644 www/content/_assets/themes/magazine/header.css create mode 100644 www/content/_assets/themes/magazine/layout.css create mode 100644 www/content/_assets/themes/magazine/menu.css create mode 100644 www/content/_assets/themes/magazine/pane.css create mode 100644 www/content/_assets/themes/magazine/responsive.css create mode 100644 www/content/_assets/themes/oss/borders.css create mode 100644 www/content/_assets/themes/oss/footer.css create mode 100644 www/content/_assets/themes/oss/header.css create mode 100644 www/content/_assets/themes/oss/layout.css create mode 100644 www/content/_assets/themes/oss/menu.css create mode 100644 www/content/_assets/themes/oss/pane.css create mode 100644 www/content/_assets/themes/oss/responsive.css create mode 100644 www/content/_assets/themes/resume/borders.css create mode 100644 www/content/_assets/themes/resume/footer.css create mode 100644 www/content/_assets/themes/resume/header.css create mode 100644 www/content/_assets/themes/resume/layout.css create mode 100644 www/content/_assets/themes/resume/menu.css create mode 100644 www/content/_assets/themes/resume/pane.css create mode 100644 www/content/_assets/themes/resume/responsive.css create mode 100644 www/content/_plugins/themes.py create mode 100644 www/content/about/copyright.html create mode 100644 www/content/about/license.md create mode 100644 www/content/docs/overview.md create mode 100644 www/content/docs/plugins.md create mode 100644 www/content/docs/themes.md create mode 100644 www/content/features.md create mode 100644 www/content/index.html create mode 100644 www/content/installation.html diff --git a/qcms-manifest.json b/qcms-manifest.json new file mode 100644 index 0000000..a2d665e --- /dev/null +++ b/qcms-manifest.json @@ -0,0 +1,84 @@ +{ + "system": { + "version": "0.1.1", + "context": "", + "theme": "hiplab", + "logo": "www/content/_assets/images/logo.png", + "app": { + "debug": true, + "port": 8084, + "threaded": true, + "host": "0.0.0.0" + } + }, + "plugins": { + "themes": [ + "List", + "Get" + ] + }, + "layout": { + "root": "www/content", + "index": "index.html", + "on": { + "load": { + "pane": [ + "www/content/installation.html" + ] + }, + "error": {} + }, + "icons": { + "comment": "use folder names as keys and fontawesome type as values to add icons to menu" + }, + "api": { + "comment": "use keys as uri and function calls as values" + }, + "map": [ + {} + ], + "order": { + "menu": [ + "docs", + "about" + ] + }, + "overwrite": { + "copyright": { + "title": "QCMS - Copyright", + "text": "copyright", + "type": "dialog", + "uri": "www/content/about/copyright.html" + }, + "plugins": { + "title": "Build Plugins", + "text": "Build Plugins" + }, + "themes": { + "text": "Change Themes" + }, + "overview": { + "text": "Why QCMS", + "uri": "www/content/index.html" + }, + "license": { + "type": "dialog", + "text": "License", + "title": "QCMS License - MIT" + } + }, + "header": { + "logo": true, + "title": "QCMS", + "subtitle": "Powered by - Python/Flask" + }, + "footer": [ + { + "text": "Designed & Built by Steve L. Nyemba" + }, + { + "text": "Powered By QCMS" + } + ] + } +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5b55284 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +data-transport@git+https://github.com/lnyemba/data-transport +flask +flask-session +requests +numpy +pandas +mistune +pygments diff --git a/www/content/_assets/files/usecase-diagram.drawio b/www/content/_assets/files/usecase-diagram.drawio new file mode 100644 index 0000000..81eb358 --- /dev/null +++ b/www/content/_assets/files/usecase-diagram.drawio @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/content/_assets/images/logo-1.png b/www/content/_assets/images/logo-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7527c38abd7ceb92d3405a91ecd3c1950d4d3c GIT binary patch literal 12176 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 literal 0 HcmV?d00001 diff --git a/www/content/_assets/images/logo.png b/www/content/_assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e5e76a780457d9ba1c5055a3bc6aad1b1169d6 GIT binary patch literal 14991 zcmeIYcT`l((l@$i7;=`Jhai%39I^_CL?!1T3_)^E0)q%DAgCykL6ICKNDhjK1VPXN z$w>qUBnTrJzCHS!bDp#AyY9N@uJ`-z%q(W_?yCBARdscBbuaE28E8|Iv62A*K&f-( z@^t`!g0E13ga~}>hJHQ-0J`mP6N|v>4k2(~e;*fjPZT^b%ohbmg}S={K(I3pyox2Id!4zv*V-q=xyHfy+(x| zY?Yc(*b-jDT(_GigDXA>xPznZ)Vb=Yo$&piTHgxaylk8O_zO{#GOk7x&h_bQ#!cA= z8+&YPQ}SAo_I90YtC7zZrGE;3iOApPEcrUl_Fbjxrl|0%XD4gtD|Qf*y%%vflGEbd z@t>+h2d8HZbSiXqB8qvBu733q+$5!s{%pi=h=``UAi2OZES%B#1Y$4E4bSWOJ}`{b z8ZWj|Q~7@6SvXva+ZMT*SD86i{CM-$bO*ayqzd1GvasQ5XNx~(ukQHATI7qL*R+0*6tP0C%zwOpfS28^2 zOi~Loyb;5G#UJQBRJlWPzqSR0*?k_}dEXj(T6R{H6~WSz@Tl+PMSI#YO6+^{`duYu zbK@${d&U8d5@ZYG(cRTi^L9RQkDo`~W7z3GaG(6@AaeTj)B7teoB928^C@$i(aP0v z6bafB*3L9vaIB6xhg|0#Ul@s_i(4wUz23M7+`g+zo~jc^@j$kPr-43VNaZ}Vl+R5n zh*dyb>cQn&$vzuh_pe%Y_L(WWyV;rNcl_srx{~y+xbJ2^dZtr*g8^G?UKn3QU&=H3 zBC-F$#MN?rE01aqV^cm_xhsz-RNpDr{a&@0@v&?!3OI$ zmFC{9Cs>Yz0>Xxa)pNE-8i^XFa;JJhCIV;GA2KcUa^&b)6{Hw!eto)zD)%U;x>7G&^59 zQ^9W5bZwIN*|!<>7nPLXBN`~+@7H6#bLQ2y2RTHruqKkM}W7 z0+q8F&Z?S$qz{-(($9?Cqbch7?|ypE_CfC3*vJjm`r7rfJ$BxhCybSQd=tHhVqr;p z`B{SXE0lfY!=6v{?^6^yR!u^B{05c5dc2^Lf_{ zx%~a6kI$y>D@qL%W)8#TQC_+cg$qHi*z;a%mQZC2V)})ar?1_*r2kok<%)Ax%94V- z%gB z$>BtW<1M^>lsD7frT;LRbmjh(6!rllx}0OcMTL7bfYKzEY$95ssk(}qjCXi-ZBO{= zyu`@Q*%|B>j~GwVb@!vXds$-Y-)@Np`7GRI^Z0%~+kIBCQQGR(g|`X-QxsIa_$6up79Ih;3JaN3C8lV3#>z4wHcj`I*K5*YeSjOy@*>tQ!@75KuvHb z)sJ}XN@xnpLK??7!WNuK2VeRu3fl9apVGSR|6(A1@L|pAQ7G-z$9+=0{-cDU8x|6P zkw3O!eydHq?%73}_aPRWXxCzX@g48}maf$}xjS8r!lBRNHNO$2E89=Gp&3gQii{Q) zPxOT0VhPeT>owQwCSG&;N3WF3t5;Au)Ld1zSdcC#c*u0_``o-uw-1)U$SK7_pxD~s z=}b#Q#t#>^okx(X4<>i|T`bP#VD|6Nj6 zgoWKQQss)}kJ3A)2psy9Hv1f_?wVM@=*zchs>sqtK3-D9!DGLW6nh|Y)zL`?I3y5w{g(Qi#5hbzN&VUfnyE!fPrjhqd3Lw5XU#{Xse}*Q zE|Vu>yMX$uI`BZbSy&jEIM0u3*>OcbB4n(98xn7ov%gGLN{EWFH9ruul8pJOS8J;T zdtu!N&2=B@@X^W|VXJ?We>NTetd}Hcjcl9qVy?*N*v}?qBu#{d@rPpX9Ws3xEzE&B zhS%bEnKmCbJN6!XvJz-Kpb%Y#Zmg?w562=jZ9koS;Vilf1f|KuNU11jLYvM$6!zb0 zrchYAj0-I$)m*51-fiwIXhpkG+pBRM5x{NdRi$~MlJ28GE0WS97qBTnCi1fK*t#!B z+qANYRlM;?*v-;6x|4-{z3^-T(;9zBtzg+hYqSR=P3!ulidb9B8CTt>u`iPQ9Caz* z3C$4hbveF#5$g=0K=t_A=!d^}Ee4an8F#AWvLxO4oAtn zu*V>I4M56KZcKSP7!l4iNF))~CfwQJ`NCgU&Nc-s_WK?vYrMQ#K^ZdlvBgaze_4>f zUrfOxUqQ%LU|;}Xx+7`KLlS5#(Lr%Y+5bk4o8=DVm9L_T$Cec4V(1Dbl^$%YcmVZU zX+JAUo8@O;UmrOMP)5`67|C{SiTEVMUuD~rWqDR3H+fgWIb)(V7ZF}2eA{P*2C1~hvDv=13EU;_k6n74dHT2C_e0gJw zE4uOJ^Jbpam>cJW97b<{Heneg{~oq_Mp`6Im|b&AC-7!LhWe{7;Vo3Z^50)86ItR; z&d)Mdg2;{w^cU`)D{Fi!wJM^`vZttS*`C+{P|Eo6i}r`@3X3r}uXC5U5p+e1X*wFa z2}D;gf0vLL2%B=CpjPiKh@%}Cs`R$Bd<+Hpv> zl>9cs2weO&@dvAofxBH zi=wK0mQOxCHv?GW)&mU|uFYH>6#61dEd`0njp<<$pM&iHq2s>vZn5#a)lGzjN5S_x zm~`@O9D?KK=FK0Y5eu15zsztm?K3_&pW${}BYOa-X{!bJ^s*AK3s4QxSiIP0d@^}C z_K-haB{Mr3)_U^NSy$Y6N4|b0^GalC^^``|_)|1p!bt21o5qU^x0Xkxn5~?y(?6Y) z5>UB?RzD}_ceKBT|_uI#? zkzelqj$!x6~!nzmt{@8ag=fROV}j(JVR!ezVyObKuUPuNjxuQ@*ZVy zknVrL+NH2?sqN`aE>DNg7U#JT!phHqH9vAPw+J813@^h{2Ze$}*)d!p&04-jh1v=dFgC3KZ zWHS_7a1;g)vNyA~OwU0Q3h#TJ;GX5WnuMPT3w~R<|Vf8@kk8u zvX*&A!o^#Here32gC}p?jMYL~JuhD&e)oDQqttL+lM0R*^uspy75QXEK-P!vM2{re6vQ~*SjeR9okdB=r7q&TQSZC zL?&@a3^EqT>{9<)xw0A+u+X!s?=!mT8hiXY^70-2HY}fZl)VoH->uF1R@Q2|R}{38 z%TsMlS``kx^Z~L05r)b_T|=dAS0D2q|XAs%RtgYV}WgKDAc(0P^)w^YsR%)kT+%h_K86G7o{8Uja@1E2nONk3a#S^ zVs&ATgu8mgO)RA6lh{{%m-M1i*ICtPBFizHA0~n&EV@30@I5hTR%NSAZ|^bPy_Do4rjJ9%I4t1g4~% zg>oZ+FNr+$NUtQ%9r~Jnb^b@QeegqBVLApUk{@@!->PCup;kZXBES~0+2l7#J@o$6 z$-);LN&=nI@~8FDiJkLUGZFthU`5J}Q}uoU_vjVUxiH?q3~`JayU*QLo7XFOcr8MxV&0R=u_FM%~O5%DYv;gyy{A$)N;wD zn~v+~Bi~BBd`r#BmnTr$n>hZ;r*I)Tj^!Eet#VupWoD>Qr**sExbN!Bus1A|yZx9Y z^TaGL_3LAS*jGN>(%&f-uY>wJVT_QBwByd@-&0r)E z7gcu5n~H_hOV=%M@(GtcdOkPMDSz>)ug0WBuQl?B>0;H5>X8U#_4;xeXRnf)b|PEF z{MzuQ#RX4Qm#+=YMsLZoU!8AEwJM~ey)Zg^RpD5setBi&dma1SYUks19&Cr#x%XxJ zQXw1m!mZll2TVL%sFhcF72HI8b_(5XsK#jGTMvET?Ow|N?57encdlx#`x>i#YvdkB z|5}|vBCa`STWAcI`kdnILE*{$n7hvo8Y$1n8J?_C)?Fnm0szQu_e+$ti&PwhJ%d>Ds zY4WOG;A~jE^)|)EJThv@=BLGc#`7m125A%DUN4QsP`RLVFXZwid$edATpV(}zr*O- zZsk-N@ssHt*}I?T#@#8o;|N7A#={t7O^o7VVLylj<)i|0DYmG?qcUuSnuU;G(|d^m z1#-ELsiTI+#0-*-bYAj(JXvhv>Q;AVavQVVJNgoobwPcfrAcb?^gfZqiB5QXWlsva z!)t!ArLr`lYne)7%ULLGQOCjR;!BdYyb<~3m{aR~S4^Ju8hbIddYa3V4hR)h%)@i2 zYQi?9NyWzK2&g(X-feM5>qFmj*Rd_aAJ9*&l&MG|SvicJGzL!vL?pMP7QO4m0CQjiVPKwSvYN}+) zp$HJb3l-=95B2i&4nTye@chO_fbaNjaUS?@mOu{`9t(XV_$42I6kJA3ModCfGt@m; zibs_UuI%sZg1CNJ>n{kfrNZMD80d=-7Y_*u5etzP^YM2TmsC_#6qk?^my!|%IYa}( zyaOFVMZE)f@eqG7E~5gR{M~&6-F>{_cuWUJpP)b$9v+Ym|A&5FzWVzAg!c~k%L|}C z#6ul?#U;fg#J#-4|1J>_s2L1`{H4(UC=p-+-f4?pM+Nu<`8%OBgHhgrynlyqcKWBh zZ;-#|Z*!cT#8I9oFOW3=998n)hSb*4H~Oap-UY7iUcSGjKxh9OXP~>wznt}Ny5T9m z&H1|`p!h#=|Bd?}w*O`Zx%BlBmwlXq@apMYR^h>qk8t*Ja(71jew9;{b(TTNN{FH) z6(mJvoD~#B6&#!$L?z`Fq#ayPj&jaY3V(yr@eT-d@ODDsp+ImkcMwNX(M3*PK~6?g z2Ic4?DkJTvDC+18{>V5g%E`#dIw~kQJN^yA(BB=5N(axsYlVk$2BDmsoSda3T%1K6 zz+pvY6r~+S6=j^AMV(z-Bpn?T6&^iz@1W3s5lq~@P{x4{cyCI|OGzk5%E-#e%gad0N=f~T z$qeNm07fDnQ&K`q`VTICS`eTypkp2IaS8(bmH=%*T=GXb1p4@!`1p9L@ZeQ~<0XHG zH(dG8q+D?i06D_&5&u`r8>9UGwEipsPxs#>IQ)0mA{?Cl3=-fFjB@@x5GePD3v7kNTwgcL$XUQ_~n zk>C;k%V2T*s{V(?%HsbIpD6!k_*)tP<^J@6=>^PI;{QxnfB6jW#{Y|-zvklq;s_x0 ze+T)G{QF;b{nuUpkq7=G=Kn_5f8F&TdEh@{{%>^suepotUk4tPH&_LQfX5k8Uc@MP z6e4oe)xHdz;lKIq#i?KqsqYob001DT!~a2m%xq?`lQ>XEUz2#1n1UWEu6F_h&sR+D zI+ry}LMMOBMAUeP*v@V5=@^`&AbkphiQ7=dC&Cx_?Z`|Q(EbmFOs9xS1cDK~7FI-> z5*P`y8c`?BE~x?|0>Pey67I(mHn$VtB_%ZXVI|Ag9q%>Me$3`8j;_c#_ojJ$Ai#3X zvU+?lx9@9qUEbW`$uGOP;my{ux?KD}-~2CpkYc|wpkFBRqOacx-q|#WD%b%?fG&}Q z4mhwMcPE1>N&|oa$ait}Gynuh58GyfsRMwE&2bz+1E4b)qq*_qq8@t^JlTDl35u*^ zcO_HbCJqFUpL=|%T89PcqiunY5cCr!?N%pl!jBN-w>Xzi!Ox9_Dq4Vi0ssMh!vY7o zu;hdM^t^-&G=RE1fGoA?c5({oHg45Y!E7zsf${)HOa?==I)ENwy!4a^95oOIg8&e; z{@e*U6#O@&gflDq;T8xKNGb^xM4|yedPb8B3O*6gTL6e(w0TMh0d z!Dn~^kV+u}^ga)|45bZO|CR-1e+#Ov2&I~~S`R^U}s1X2=fXANcd_%p8e+OL>d`6}w!EmGx$=`~l0=}FG zAEK#%{CNTdfZVIzC%}Uxs7dJ05|Mz0e>ou_0nolgo_ynk*N`r6+W|EAh2u#ga=^3+ z5=Ni_PS*V07zqAJLqr1wwR8Y}H()e)mAU_i2K1j47(fH1fr75Xv;A)1W8kj_K=Zc- zD1&rPmL^1Z5rNi~H$Kz<784L%D#1NB)X0pW^>A&}k;E*d~V%g;mvLIbStbAW*X2Pa5@ z3J?2bb+IHA3K~KBE_p_c1Q1wHrbd3!nIil8BG@hgoacOkE-3j|db09GYB(TK2QA;9 zIw440erf>W!u44!FoAlZ8JGrw@*Xop_kaUg7{9dX?X&ztpk?@g$}3@r!V{SN7Hq!i zSdTCPgW!02_2`XVzN*!N{a66aA(Nn1LzGL9zfS-MzzGMtX4F7;g1;pA`Tw_0Z^LUka5EdzAh!8LIZZ%K$*Au21xa2As-sx#Ai!YZl2X{D z#)Jr(3Z0Bj6#@eS{wGSosNg4r)FG)LFklAE7XS>>>Hzvn15o3Nl0!QEkSClzzPuT^ zFNhF`f-Zpbm8DaII020INix-)dqsy7V1_&yp#N2E+;1yZGDSCkj2B>Qg!hkOs`faDx>9Jtc`@Poa0t4K_*N;8I&-7RWK&$Kw zg6M!t=MmSD*c3j_YmV|PU*c(inF+l2dLRQBtz8?@E@wLmyA{(BFoDsZQ3~YtW_l2U;6}$kvSSDX z=-^*}M1i?S;57KGi(*}#P~aF;Js%(9;A4vb%v*~-d(@t=O(;^1UK8&Og6RV={@^6| z&;c%@7ys3`^;bjS6r}u#A~?z48?e7O{!WotfrFtB1qLPlz)F*Y;aEe`n*p^@)no(r zh8eVN2my>#9o&)#A^63FjMo6Y1p|{ajnOgaNf%}q3;@!v(J-%R(+~jvUq4-L>(YcG z^RBB9OrzOeXLP(8+_2}~uw)YyuJSZnkWAq3s7)ZsU~ zAHru?X3*#f=DCQS9E`cXTiXS>n>^h3wr^Lu<%tSv z3BSU|C$?M~e0~?3E0mI2A2in=9$)S~b^X)nU81V|+AsRmVbU^w*!B=s zX%OQ0xJt54j45YlKk^+V6j;$lIledyCXy>u0ukj!La$d*|V+_z)nU98CLAK-c#MZWi0Y%QEa* ze#exnQ3k&%6PL~bje+_>NIt?nEVh;YER4k(%qFxzda9vmig&2TJR-eLj)OtlHxBTAS83F}UYFHJ!c}UFz)6-1A5`a4!47`PTM_Evu}4LkjcJ|kycIGNI;jM+&j#m&=$i3rphI8APVY6X*hSa?;X(4KTqpL(D>3XTUz^9N) zxLa5{%z%F^+#Y)y%T{*BB&5<{?(ncRzH00OTdwJLF{U`gTIM#uNJ~XX!vO?u9F14(#}5v{?X>GYhCtH6^T@jXDY|?2xV@;B77{g_~&7=hbl7IY+_vlHQW9i-BS&?b$jHWQCj*1Yb zK(6@M(DCIAcYBqena&KEBu(~U2v~DBLUrfHwwkFgBzX?5$SQ|)-3yPMZVQl(Yxv|2 zo{y5U?v$6A%h*sM+csKFjiO&19*ZWNZ6?+1o2wLtd(jv1a(atVlmw_4wl_KJm8s!#&4LDko9nypMmX)WGCT z#HA=JQh#*c~k1jmaZH-P(0~4ZLE{aTR6N&qR zRgpi6-kd#*uC9#oz3tRdap#x^HcwDW z02R4%ViOedsm4#Nq9cNhBNny4jLq}Bfc|pg<1)f=X~FcE5J=vLDC3f+WLxv1ObI%j zPq5pZjAuK|o$%es11r|beR3e_qe_{%Y1B2jsorv*GP{qysq?jM4dF=K+SI{7LMKg4 z#klcrpk&P1`%BT^7F*(VRrcnDJ`ywSx1UukM8y(d3X3v>7*KK1ih5WV#lmN@#}dYp zIw@Y8KIN?*I48=K$c`y7f*wLlwd}M!%12X@u zbBcOmvR%z>ZLKOYY<#mHyBHrqI&0P*xpr20@^yF@+Qk#aNPmLa=Ii?4+Zg}qtX-eb zn#y!@?yv=A)HX9_aF&1#SW}*m&V&2C$fF~)2hwjXv8m!bJvohY#(jTqB`^PE-2bJ~ z!=-fe-Jfp$*G%1E4%PrH3GPwKN82jAS&Y`lWnhhe)aDE>B>qSzt6BsvCIWum#$Li0 z%C&vicqe;*NvZ5NVv5Wkf`EC9knB5es!vngtUvKnym2XxI zRdJ4g#H801%)&yOcwY6xCEoG0JY8ZUV^qo`0RqSX`2%$vSGoMFY-;z3@vUne!&SLW zMY63o%9pl;F&ENyS&L22+78Dt<0OERxWxb>ETz&&Y)K&w0s)t{JY=5V+@yMn47xe# z#H>(-C=VYU+t}amKzu7Nv;QJ=YF@c2YdA>;Ra5DP*AxRa@97TM6FMZ|;New72$-I3 zz;Ma55w4}Ma!wqMbDVCh8JD%n*s!V9EpV%*Oi$8Q4?M#jV--0LGEZxBtWNZB72g7? z``T2R_)bdODliP#utPkarRlg(o|`z06j0b zhs=L#BS+$5JO+nXqg`>sWritkdR(5N2{YoRYKz)eXsvoJrg^*gf3gGKKe5;mUg1;u zgNwK%tbIdAqn*?eM@fz(SQUf27PYKRCUf1{XW!U)4c(%BHZE}Q`YX3$QGU$$PnEf+0c{H_4%zY5B^#wM>gVLBTs!2GElY#B5} z#5u0Z#>sr!wr&XmL3f8nbr;-~|3FEZ$AhobMQ=V|P}$AGa$wHt2ZINa!Hn4PIk9|A z?wC1xRtijWH%GveN5*SEyDzh9FKJtyd+z{U@AmIw1Edwlc0}bti21e*j`9@m2BqL^ z@X}(|6tnqZHB`;a)^h>^LpMj5cTau&_Vq^^cmzmq4N-6zbNBZ0dkWt9Fej=74}#OP z6VOMIazKY+5>Y_|66WUSc^M0Sa~8HY4)F4ayGbc0#%Wxjbh!t+5&%W>C|oeNj{05Z z4DElZt~&;xT{e+DAe-|5co{T^spJ6Jx{hyRz^-ypH4t`x*+SbsXn%I;ifqm01jnG-5Wj zOxp^7GC9i*!+OwO=4xdJqVh&q24ztmu|%P&PNqbaIKdmVverh+r_fx>lS>0-ZU`!{1peRn bpu3NvZ`YK$kN0=Q;qi1d4K7z*MBe&8(Ek=4 literal 0 HcmV?d00001 diff --git a/www/content/_assets/images/usecase.png b/www/content/_assets/images/usecase.png new file mode 100644 index 0000000000000000000000000000000000000000..179f3634ca53871652369cae5f5c7bda37e156b9 GIT binary patch literal 37811 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

-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 MRS|`JDQ_A6KM=FjEdT%j literal 0 HcmV?d00001 diff --git a/www/content/_assets/themes/default/borders.css b/www/content/_assets/themes/default/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/content/_assets/themes/default/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/content/_assets/themes/default/footer.css b/www/content/_assets/themes/default/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/content/_assets/themes/default/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/content/_assets/themes/default/header.css b/www/content/_assets/themes/default/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/content/_assets/themes/default/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/content/_assets/themes/default/layout.css b/www/content/_assets/themes/default/layout.css new file mode 100644 index 0000000..0e48ca3 --- /dev/null +++ b/www/content/_assets/themes/default/layout.css @@ -0,0 +1,22 @@ + + +.main { + height:98vh; display:grid; grid-template-columns:70% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + line-height: 1.5; font-size:16px; font-family: sans-serif; font-weight:lighter; +} +.main .content{ + align-self:center; +} +.main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/content/_assets/themes/default/menu.css b/www/content/_assets/themes/default/menu.css new file mode 100644 index 0000000..7a14d15 --- /dev/null +++ b/www/content/_assets/themes/default/menu.css @@ -0,0 +1,78 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/content/_assets/themes/default/pane.css b/www/content/_assets/themes/default/pane.css new file mode 100644 index 0000000..e321d4a --- /dev/null +++ b/www/content/_assets/themes/default/pane.css @@ -0,0 +1,2 @@ +.main .pane { height:auto;} +.main .pane iframe{ width:100%; border:0px; height:80%;} diff --git a/www/content/_assets/themes/default/responsive.css b/www/content/_assets/themes/default/responsive.css new file mode 100644 index 0000000..cd91420 --- /dev/null +++ b/www/content/_assets/themes/default/responsive.css @@ -0,0 +1,36 @@ +/* Responsive Design */ +@media (max-width: 1024px) { + .main { + grid-template-columns: 60% 40%; + grid-template-rows: 70px auto 32px; + } +} + +@media (max-width: 768px) { + .main { + grid-template-columns: 100%; + grid-template-rows: auto; + height: auto; + } + + .main .pane { + border-left: none; + border-top: 1px solid #CAD5E0; + padding: 8px; + } +} + +@media (max-width: 480px) { + .main { + padding: 5%; + font-size: 14px; + } + + .large-text { + font-size: 24px; + } + + .small-text { + font-size: 10px; + } +} diff --git a/www/content/_assets/themes/hiplab/borders.css b/www/content/_assets/themes/hiplab/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/content/_assets/themes/hiplab/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/content/_assets/themes/hiplab/footer.css b/www/content/_assets/themes/hiplab/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/content/_assets/themes/hiplab/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/content/_assets/themes/hiplab/header.css b/www/content/_assets/themes/hiplab/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/content/_assets/themes/hiplab/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/content/_assets/themes/hiplab/layout.css b/www/content/_assets/themes/hiplab/layout.css new file mode 100644 index 0000000..6615939 --- /dev/null +++ b/www/content/_assets/themes/hiplab/layout.css @@ -0,0 +1,37 @@ +/** +* This is the default window and we will have to hide the pane (side) +*/ +body {line-height: 1.5; font-weight:lighter; font-family:sans-serif;} +.main {height:98vh; display:grid; grid-template-columns:65% 35%; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + } + .main .header { display:grid; grid-template-columns:64px auto; gap:4px; align-items: center;} + .main .header .title {font-size:28px; font-weight:bold} + .main .header img {width:80px; height:80px;} + .main .index{ + align-self:center; + padding:8px; + } + .main .menu {border:1px solid transparent; background-color:#f3f3f3;} + .main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px; line-height:1.5; font-size: 14px;} + + + .search-box {display:block; grid-template-columns: none;} + + + + +.main .content{ + align-self:center; +} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/content/_assets/themes/hiplab/menu.css b/www/content/_assets/themes/hiplab/menu.css new file mode 100644 index 0000000..bb368d0 --- /dev/null +++ b/www/content/_assets/themes/hiplab/menu.css @@ -0,0 +1,110 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/content/_assets/themes/hiplab/pane.css b/www/content/_assets/themes/hiplab/pane.css new file mode 100644 index 0000000..f1b63c8 --- /dev/null +++ b/www/content/_assets/themes/hiplab/pane.css @@ -0,0 +1,2 @@ +.main .pane {display:block;} +/* .main .pane div:first-child {margin-top:4px; background-color:#f3f3f3; border-radius: 8px; padding:8px; min-height:150px} */ \ No newline at end of file diff --git a/www/content/_assets/themes/hiplab/responsive.css b/www/content/_assets/themes/hiplab/responsive.css new file mode 100644 index 0000000..cd91420 --- /dev/null +++ b/www/content/_assets/themes/hiplab/responsive.css @@ -0,0 +1,36 @@ +/* Responsive Design */ +@media (max-width: 1024px) { + .main { + grid-template-columns: 60% 40%; + grid-template-rows: 70px auto 32px; + } +} + +@media (max-width: 768px) { + .main { + grid-template-columns: 100%; + grid-template-rows: auto; + height: auto; + } + + .main .pane { + border-left: none; + border-top: 1px solid #CAD5E0; + padding: 8px; + } +} + +@media (max-width: 480px) { + .main { + padding: 5%; + font-size: 14px; + } + + .large-text { + font-size: 24px; + } + + .small-text { + font-size: 10px; + } +} diff --git a/www/content/_assets/themes/magazine/borders.css b/www/content/_assets/themes/magazine/borders.css new file mode 100644 index 0000000..e6c7e66 --- /dev/null +++ b/www/content/_assets/themes/magazine/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:3px dotted #CAD5E0; + +} + +.border-left{ + border-left:3px dotted gray; +} + + +.border-bottom { border-bottom:1px dotted gray;} +.border-top { border-top:3px dotted gray;} + diff --git a/www/content/_assets/themes/magazine/footer.css b/www/content/_assets/themes/magazine/footer.css new file mode 100644 index 0000000..84ce356 --- /dev/null +++ b/www/content/_assets/themes/magazine/footer.css @@ -0,0 +1,22 @@ +/** +* This file styles the footer of the page +*/ + + + +/* .main .footer { grid-column: 1 / span 2; font-size:13px; font-weight: lighter; padding:8px;} */ +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/content/_assets/themes/magazine/header.css b/www/content/_assets/themes/magazine/header.css new file mode 100644 index 0000000..991b9af --- /dev/null +++ b/www/content/_assets/themes/magazine/header.css @@ -0,0 +1,13 @@ +.main .header { + + grid-row:1; + grid-column: 1 / span 2; + display:grid; + grid-template-columns: 50px auto; gap:4px; + line-height: 1; + + +} +.main .header .title {font-size:28px; text-transform: capitalize; font-weight:bold} +.main .header .subtitle {font-size:14px} +.main .header img { width:44px; height:44px;} diff --git a/www/content/_assets/themes/magazine/layout.css b/www/content/_assets/themes/magazine/layout.css new file mode 100644 index 0000000..ad5c277 --- /dev/null +++ b/www/content/_assets/themes/magazine/layout.css @@ -0,0 +1,55 @@ +.main { + margin:10px; + padding:4px; + display:grid; + grid-template-columns: 50% 50% ; gap:4px; + grid-template-rows: 48px 64px auto 32px; + font-family: sans-serif; + font-weight: lighter; + font-size:18px; + line-height: 1.5; + justify-items: normal; + ; + height:96vh; +} +.main .content { + grid-row:3; + grid-column: 1 ; + text-wrap: wrap; + height:100%; + display:grid; + align-content: start; + + + +} + +.main .content #index { + text-align: left; + text-wrap: wrap; +} + +p { + margin-top:22px; +} +table { + width:99%; + border: 1px solid #CAD5E0; +} +table td {padding:4px; margin:4px;} +table thead { + + font-weight:bold; + background-color:#f3f3f3; +} + +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/content/_assets/themes/magazine/menu.css b/www/content/_assets/themes/magazine/menu.css new file mode 100644 index 0000000..21cfd84 --- /dev/null +++ b/www/content/_assets/themes/magazine/menu.css @@ -0,0 +1,110 @@ +.menu { + padding:8px; + border-bottom:3px dotted gray ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/content/_assets/themes/magazine/pane.css b/www/content/_assets/themes/magazine/pane.css new file mode 100644 index 0000000..4fb956f --- /dev/null +++ b/www/content/_assets/themes/magazine/pane.css @@ -0,0 +1,14 @@ +.main .pane { + border-left:3px dotted gray; + grid-column: 2; + font-family: sans-serif; + padding-left: 10px; + + +} +.pane iframe { + border:1px solid transparent; + width:99%; + height:100%; + +} \ No newline at end of file diff --git a/www/content/_assets/themes/magazine/responsive.css b/www/content/_assets/themes/magazine/responsive.css new file mode 100644 index 0000000..cd91420 --- /dev/null +++ b/www/content/_assets/themes/magazine/responsive.css @@ -0,0 +1,36 @@ +/* Responsive Design */ +@media (max-width: 1024px) { + .main { + grid-template-columns: 60% 40%; + grid-template-rows: 70px auto 32px; + } +} + +@media (max-width: 768px) { + .main { + grid-template-columns: 100%; + grid-template-rows: auto; + height: auto; + } + + .main .pane { + border-left: none; + border-top: 1px solid #CAD5E0; + padding: 8px; + } +} + +@media (max-width: 480px) { + .main { + padding: 5%; + font-size: 14px; + } + + .large-text { + font-size: 24px; + } + + .small-text { + font-size: 10px; + } +} diff --git a/www/content/_assets/themes/oss/borders.css b/www/content/_assets/themes/oss/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/content/_assets/themes/oss/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/content/_assets/themes/oss/footer.css b/www/content/_assets/themes/oss/footer.css new file mode 100644 index 0000000..e1acfb5 --- /dev/null +++ b/www/content/_assets/themes/oss/footer.css @@ -0,0 +1,21 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + grid-row:5; + margin-top:10px; + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); + + +} diff --git a/www/content/_assets/themes/oss/header.css b/www/content/_assets/themes/oss/header.css new file mode 100644 index 0000000..c7ee323 --- /dev/null +++ b/www/content/_assets/themes/oss/header.css @@ -0,0 +1,7 @@ +.main .header {display:grid; grid-template-columns:64px auto; gap:4px; width:100%; align-items:center;} +.main .header .icon {width:64px; height:64px;} +.main .header .icon img {width:64px; height:64px;} + +.main .header .title { font-size:32px; text-transform: uppercase; font-weight:bold} +.main .header .subtitle {font-style:italic;font-size:14px; color:gray; text-transform: capitalize;} + diff --git a/www/content/_assets/themes/oss/layout.css b/www/content/_assets/themes/oss/layout.css new file mode 100644 index 0000000..b15235a --- /dev/null +++ b/www/content/_assets/themes/oss/layout.css @@ -0,0 +1,50 @@ +/** +* This file implements theme Open Source Software, the expectation is just a pager that presents a tool/software +*/ +body, ul, p, select { + font-size: 16px; + font-weight:lighter; + font-family:sans-serif; + line-height:1.5; + +} +.main { + display:grid; + grid-template-columns: 100%;; + margin:1%; + margin-left:10%; + margin-right:10%; + gap:4px; + height:90%; + width:80%; +} +.main .content{ + + grid-row:4; + align-self:center; + height:100%; + width:100%; +} + +.main .content .banner { + background-repeat: no-repeat; + background-size: cover; + background-position: center; + height:200px; + align-items: center; + align-content: center; + display: grid; + +} + +/* .main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} */ +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/content/_assets/themes/oss/menu.css b/www/content/_assets/themes/oss/menu.css new file mode 100644 index 0000000..a34f727 --- /dev/null +++ b/www/content/_assets/themes/oss/menu.css @@ -0,0 +1,82 @@ + +.menu .icon {padding:4px; align-items:center; display:grid;} +.menu .icon img {width:30px; height:30px;} + +.main .menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} +.main .menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; +} + +.main .menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +.main .menu { + padding:8px; + grid-row:2; + width:100%; + display:none; + + /* grid-row:2; grid-column:1 ; */ + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + border:0; height:48px; padding:0px; + display:grid; grid-template:64px repeat(6,1fr); gap:4px; + /* background-color: #f3f3f3; */ + align-items: center; +} +.main .menu .icon .button { + border:1px solid #CAD5E0; border-radius:8px; padding:2px; + ; +} +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/content/_assets/themes/oss/pane.css b/www/content/_assets/themes/oss/pane.css new file mode 100644 index 0000000..3be2b06 --- /dev/null +++ b/www/content/_assets/themes/oss/pane.css @@ -0,0 +1 @@ +.main .pane {display:block} \ No newline at end of file diff --git a/www/content/_assets/themes/oss/responsive.css b/www/content/_assets/themes/oss/responsive.css new file mode 100644 index 0000000..cd91420 --- /dev/null +++ b/www/content/_assets/themes/oss/responsive.css @@ -0,0 +1,36 @@ +/* Responsive Design */ +@media (max-width: 1024px) { + .main { + grid-template-columns: 60% 40%; + grid-template-rows: 70px auto 32px; + } +} + +@media (max-width: 768px) { + .main { + grid-template-columns: 100%; + grid-template-rows: auto; + height: auto; + } + + .main .pane { + border-left: none; + border-top: 1px solid #CAD5E0; + padding: 8px; + } +} + +@media (max-width: 480px) { + .main { + padding: 5%; + font-size: 14px; + } + + .large-text { + font-size: 24px; + } + + .small-text { + font-size: 10px; + } +} diff --git a/www/content/_assets/themes/resume/borders.css b/www/content/_assets/themes/resume/borders.css new file mode 100644 index 0000000..6f9a192 --- /dev/null +++ b/www/content/_assets/themes/resume/borders.css @@ -0,0 +1,38 @@ +.border { + border:1px solid #CAD5E0 ; +} +.border-round { + padding:6px; + border-radius:8px; +} +.border-round-top-left{ + border-top-left-radius: 8px; + padding:6px; +} +.border-round-top-right{ + border-top-right-radius: 8px; + padding:6px; +} +.border-round-bottom-right{ + border-bottom-right-radius: 8px; + padding:6px; +} +.border-round-bottom-left{ + border-bottom-left-radius: 8px; + padding:6px; +} + + +.border-right{ + border-right:1px solid #CAD5E0; + +} + +.border-left{ + border-left:1px solid #CAD5E0; +} + + +.border-bottom { border-bottom:1px solid #CAD5E0} +.border-top { border-top:1px solid #CAD5E0} + diff --git a/www/content/_assets/themes/resume/footer.css b/www/content/_assets/themes/resume/footer.css new file mode 100644 index 0000000..8086c04 --- /dev/null +++ b/www/content/_assets/themes/resume/footer.css @@ -0,0 +1,19 @@ +/** +* This file styles the footer of the page +*/ + +.footer { + text-align:center; + display:grid; + grid-template-columns: repeat(3,1fr); + gap:4px; + padding:8px; + font-size:12px; + color:black; + align-items: center; + align-content: center; + text-transform: capitalize; + /* background-color: rgba(255,255,255,0.8); */ + + grid-column: 1 /span 2; +} diff --git a/www/content/_assets/themes/resume/header.css b/www/content/_assets/themes/resume/header.css new file mode 100644 index 0000000..a64ce8b --- /dev/null +++ b/www/content/_assets/themes/resume/header.css @@ -0,0 +1,3 @@ +.main .header { display:grid; grid-template-columns:64px auto; gap:4px} +.main .header .title {font-size:28px; font-weight:bold} +.main .header img {width:55px; height:55px;} diff --git a/www/content/_assets/themes/resume/layout.css b/www/content/_assets/themes/resume/layout.css new file mode 100644 index 0000000..0e48ca3 --- /dev/null +++ b/www/content/_assets/themes/resume/layout.css @@ -0,0 +1,22 @@ + + +.main { + height:98vh; display:grid; grid-template-columns:70% auto; gap:4px; + grid-template-rows:70px 40px auto 32px; + padding-left:2%; padding-right:2%; + line-height: 1.5; font-size:16px; font-family: sans-serif; font-weight:lighter; +} +.main .content{ + align-self:center; +} +.main .pane {border-left:1px solid #CAD5E0; height:100%; padding:8px;} +.bold {font-weight:bold} +.small-text {font-size:12px; font-weight:lighter; color :#000000;} +.active {cursor:pointer; padding:2px; margin:2px; border-bottom:2px solid transparent} +.active:hover {border-bottom-color: #4682b4;} + +/** +* +*/ +.large-text {font-weight:bold; font-size:28px;} + \ No newline at end of file diff --git a/www/content/_assets/themes/resume/menu.css b/www/content/_assets/themes/resume/menu.css new file mode 100644 index 0000000..3080a4e --- /dev/null +++ b/www/content/_assets/themes/resume/menu.css @@ -0,0 +1,79 @@ +.menu { + padding:8px; + border:1px solid #CAD5E0 ; + + display:grid; + grid-column: 1 / span 2; + grid-template-columns: 92px repeat(7,auto); + gap:4px; + text-transform: capitalize; + align-items: center; + +} +.menu .icon {padding:4px;} +.menu .icon img {width:30px; height:30px;} +.menu .item { + font-weight:bold; + cursor:pointer; + padding:4px; + text-align: left; + + + + + +} + +.menu .sub-menu { + + display:none; + position:absolute; + + margin-top:2px; + min-width:10%; + z-index:90; + padding:8px; + font-weight:lighter; + text-align:left; + align-items:left; + background-color: rgba(255,255,255,0.8); + +} + +.menu .item:hover .sub-menu{ + + display:block; + height:auto; +} + +/** +* TAB SPECIFICATIONS WITH RADIO BUTTONS AND LABELS +*/ +.tab-content table { width:99%; border-radius: 8px; padding:8px; border:1px solid #d3d3d3;} +.tab-content table tr:nth-child(even) {background-color: #f3f3f3;} +/* .tab-content {width:80%;} */ + +.tabs {display:grid; grid-template-columns: repeat(auto-fit,209px); gap:0px; align-content:center; + /* background-color: #f3f3f3; */ + padding-top:4px; + padding-left:4px; + padding-right:4px; +} +.tabs input[type=radio] {display:none; } +.tabs input[type=radio] + label { font-weight:lighter; + border:1px solid transparent; + border-bottom-color: #CAD5E0; + background-color: #f3f3f3; + padding:8px; + padding-right:10px; padding-left:10px; + + cursor:pointer +} +.tabs input[type=radio]:checked +label { + background-color: #ffffff; + border-top-right-radius: 8px; + border-top-left-radius: 8px; + font-weight:bold; + border-color: #CAD5E0; + border-bottom-color: #FFFFFF; +} diff --git a/www/content/_assets/themes/resume/pane.css b/www/content/_assets/themes/resume/pane.css new file mode 100644 index 0000000..e69de29 diff --git a/www/content/_assets/themes/resume/responsive.css b/www/content/_assets/themes/resume/responsive.css new file mode 100644 index 0000000..cd91420 --- /dev/null +++ b/www/content/_assets/themes/resume/responsive.css @@ -0,0 +1,36 @@ +/* Responsive Design */ +@media (max-width: 1024px) { + .main { + grid-template-columns: 60% 40%; + grid-template-rows: 70px auto 32px; + } +} + +@media (max-width: 768px) { + .main { + grid-template-columns: 100%; + grid-template-rows: auto; + height: auto; + } + + .main .pane { + border-left: none; + border-top: 1px solid #CAD5E0; + padding: 8px; + } +} + +@media (max-width: 480px) { + .main { + padding: 5%; + font-size: 14px; + } + + .large-text { + font-size: 24px; + } + + .small-text { + font-size: 10px; + } +} diff --git a/www/content/_plugins/themes.py b/www/content/_plugins/themes.py new file mode 100644 index 0000000..f6fa267 --- /dev/null +++ b/www/content/_plugins/themes.py @@ -0,0 +1,38 @@ +""" + +""" +import os +import cms + +def _getPath(_config): + _layout = _config['layout'] + path = os.sep.join([_layout['location'],_layout['root'],'_assets','themes']) + return path +@cms.Plugin(mimetype='application/json') +def List (**_args) : + """ + This will list available css themes we have on disk + """ + _rq = _args['request'] + _config = _args['config'] + path = _getPath(_config) #os.sep.join([_config['layout']['location'],_config['layout']['root'],'_assets','themes']) + + return os.listdir(path) +def register (): + """ + Registering + """ + pass +def Get (**_args): + _request = _args['request'] + _config = _args['config'] + print (_request.args['theme']) + _theme = 'default' if 'theme' not in _request.args else _request.args['theme'] + path = os.sep.join([_getPath(_config),_theme]) + files = os.listdir(path) + _out = {} + for file in files : + f = open (os.sep.join([path,file])) + _out[file.split('.')[0]] = f.read() + f.close() + return {_theme:_out},"application/json" diff --git a/www/content/about/copyright.html b/www/content/about/copyright.html new file mode 100644 index 0000000..46c5507 --- /dev/null +++ b/www/content/about/copyright.html @@ -0,0 +1,13 @@ + +
+
+ +QCMS is a python/flask based Content Management System +
    +
    Open-source under MIT license +
    Designed and build by
    Steve L. Nyemba steve@the-phi.com + +
+
diff --git a/www/content/about/license.md b/www/content/about/license.md new file mode 100644 index 0000000..58b210a --- /dev/null +++ b/www/content/about/license.md @@ -0,0 +1,8 @@ +Copyright 2010 - 2024, Steve L. Nyemba + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/www/content/docs/overview.md b/www/content/docs/overview.md new file mode 100644 index 0000000..e69de29 diff --git a/www/content/docs/plugins.md b/www/content/docs/plugins.md new file mode 100644 index 0000000..9eb8e54 --- /dev/null +++ b/www/content/docs/plugins.md @@ -0,0 +1,37 @@ +### Build plugins +A plugin is a basic python function that takes positional arguments i.e one being request and the other config. We allow the function to have access to the request object (if data were submitted) and to QCMS configuration if any configuration data is needed. + + +
+ # saving this function to www/html/_plugins/myplugins.py + # + import numpy as np + import cms + + @cms.Plugin(mimetype="application/json", methods=["POST"]) + def demo(**_args): + req = _args['request'] + conf= _args['config'] + return {"name":"foo","age":np.random.randint(0,100)} +
+ +### Register Plugin + +Once a plugin is build it needs to be registered, in order to allow the function be made available to calling code (JS/HTML5) + +
+$ qcms plugin-register qcms-manifest.json myplugins.py --import demo +
+ +Calling the registered function as an API. The example uses curl +
+$ curl http://localhost:8000/api/myplugins/demo +
+ +### Limitations + +**QCMS** lowers the barrier to entry and makes the following tradeoffs to deliver an optimal solution: +
    + Plugins are basic python function that need to be registered with QCMS instance/site +
    We delegate access control (read/write) to web content to a cloud service provider (nextcloud for now). +
diff --git a/www/content/docs/themes.md b/www/content/docs/themes.md new file mode 100644 index 0000000..5be554f --- /dev/null +++ b/www/content/docs/themes.md @@ -0,0 +1,49 @@ +Themes consist of basic **css** located in **www/html/_assets/themes**. The css folder names represent the themes. +Each folder should have the following files : +
+
Files (.css extensions)
Description
+
borders
styling of borders (top,bottom,right,left,round)
+
footer
styling the footer
+
header
styling the footer
+
layout
The general layout for a site and how to organize different panes
+
menu
styling the menu
+
pane
styling secondary pane, it's position and visibility depends on the theme
+
+ +### Setup themes + +**QCMS** CLI interface allows to query the backend to determine available themes, in three simple phases described below + +
+ #1. Listing available themes
+ $ qcms list-themes +
+ +
#2. Selecting and applying theme
+$ qcms set-theme magazine
+ +
# Verifying themes set
$ ls www/html/_assets/themes
+ + +### Custom Themes + +**QCMS** supports custom themes or user-defined themes. Build custom theme manually in three simple steps: + +
+# 1. copy default theme to new folder (www/html/_assets/theme/mytheme)
+$ cp -r www/html/_assets/themes/default www/html/_assets/themes/mytheme +
+ +
+# 2. update configuration file to enable configuration
+{ + "system":{ + "theme":"mytheme" + ... + } +}
+ +
+# 3. set the theme and reload the your app (from the app folder)
+$ qcms set-theme magazine +
\ No newline at end of file diff --git a/www/content/features.md b/www/content/features.md new file mode 100644 index 0000000..9a61335 --- /dev/null +++ b/www/content/features.md @@ -0,0 +1,14 @@ +### Build plugins +A plugin is a basic python function that takes positional arguments i.e one being request and the other config. We allow the function to have access to the request object (if data were submitted) and to QCMS configuration if any configuration data is needed. + + +
+ import numpy as np + + def demo(**_args): + req = _args['request'] + conf= _args['config'] + return {"name":"foo","age":np.random.randint(0,100)} +
+ + diff --git a/www/content/index.html b/www/content/index.html new file mode 100644 index 0000000..6816ad3 --- /dev/null +++ b/www/content/index.html @@ -0,0 +1,46 @@ +
+ +

What is QCMS ?

+ Fast lightweight Python/Flask CMS designed for engineers +
Builds a web site from folder structure (local or nextcloud) +
Supports industry standard frameworks +
+ JQuery, Apexcharts, fontawesome +
Numpy, Pandas, flask +
+ Custom functions built & registered as API +
Extensible themes support (mostly css) +
+
+
+
+

+

Why use QCMS

+ +
+ QCMS lowers the barrier of entry to building a site +
It is open-source and available under MIT license +
Removing user administration overhead:smaller footprint & efficiency +
Using basic knowledge of how documents are organized on disk or in the cloud. +
+ Markdown rendering for non-technical users (using an editor). +
HTML5 rendering for more advanced users +
Suitable to deploy multiple sites on an AWS micro/nano instance +
+
+

+
+
+
+
+

Use Cases

+ +
+ QCMS, implements a separation of concerns between web engineer and the content creator with the least amount of friction +
Ideally the roles would look like +
    + The Web Engineers, will setup virtualenv; setup port, install themes, makes sure sure content is accessible. Optionally can make content. +
    The Content Creator, writes up files and uploads images ... +
+
+
\ No newline at end of file diff --git a/www/content/installation.html b/www/content/installation.html new file mode 100644 index 0000000..44d88d8 --- /dev/null +++ b/www/content/installation.html @@ -0,0 +1,120 @@ + + +
+ + + + + + + +
+ +
+ + +
+
+
+
+
+
+ # install using virtualenv
+ $ pip install --upgrade git+https://dev.the-phi.com/git/qcms/cms +
+
+ # explore qcms commands and try them
+ $ qcms --help +
+ +
+ +
+
+
+
#creating a sample project with title and sample title
$ qcms create myproject www/html --title mydemo --subtitle "flask cms demo"
+
#bootup the newly created site
$ qcms bootup ./myproject/qcms-manifest.json
+
Open your browser on port http://localhost:8084
+
+
+
+ +
+

+

    +

    +

    +

    Source code & License

    + {{layout.header.title}}, is Open-source under MIT License, we welcome you to get a copy of the source code on github +

    +

    Copyright

    +
    + + +

    +
+

+ \ No newline at end of file