This commit is contained in:
a-ill 2023-06-24 00:39:41 +03:00
parent efbda226a1
commit c2ed24a9b6
35 changed files with 1183 additions and 74 deletions

View File

@ -10,6 +10,7 @@
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:image" content=""> <meta property="og:image" content="">
<meta property="og:url" content=""> <meta property="og:url" content="">
<link rel="icon" type="image/png" href="/favicon.png"/>
<!--Load libraries--> <!--Load libraries-->

View File

@ -8,6 +8,11 @@ using Server.DatabaseSupport, Server.TemplateEditor
controller = "basic" controller = "basic"
dict_layouts = Dict( dict_layouts = Dict(
:landing => generate_layout_html("main",controller,"landing",css=["landing"]), :landing => generate_layout_html("main",controller,"landing",css=["landing"]),
:manifesto => generate_layout_html("main",controller,"manifesto"),
:join_us => generate_layout_html("main",controller,"join_us"),
:groups => generate_layout_html("main",controller,"groups"),
:cooperatives => generate_layout_html("main",controller,"cooperatives"),
:communities => generate_layout_html("main",controller,"communities"),
) )
#---General----------------------------------------------------- #---General-----------------------------------------------------
@ -20,5 +25,40 @@ function landing()
) )
end end
function manifesto()
html(:basic,:manifesto, layout = dict_layouts[:manifesto], context = @__MODULE__,
title = "LibSoc - Manifesto",
description = ""
)
end
function join_us()
html(:basic,:join_us, layout = dict_layouts[:join_us], context = @__MODULE__,
title = "LibSoc - Join us",
description = ""
)
end
function groups()
html(:basic,:groups, layout = dict_layouts[:groups], context = @__MODULE__,
title = "LibSoc - Groups",
description = ""
)
end
function cooperatives()
html(:basic,:cooperatives, layout = dict_layouts[:cooperatives], context = @__MODULE__,
title = "LibSoc - Cooperatives",
description = ""
)
end
function communities()
html(:basic,:communities, layout = dict_layouts[:communities], context = @__MODULE__,
title = "LibSoc - Communities",
description = ""
)
end
end end

View File

@ -0,0 +1 @@
<communities-component></communities-component>

View File

@ -0,0 +1 @@
<cooperatives-component></cooperatives-component>

View File

@ -0,0 +1 @@
<groups-component></groups-component>

View File

@ -0,0 +1 @@
<join-us-component></join-us-component>

View File

@ -0,0 +1 @@
<manifesto-component></manifesto-component>

View File

@ -5,7 +5,8 @@ footer {
bottom: 0; bottom: 0;
width: 100%; width: 100%;
height: auto; height: auto;
background: var(--dark-green); background: #5B6970;/*var(--dark-green);*/
border-top: #DD1C1A solid 0.5rem;
} }
footer p, footer a { footer p, footer a {
@ -53,6 +54,15 @@ footer h2 {
margin-bottom: 0; margin-bottom: 0;
} }
#tag-line {
position: relative;
margin: auto;
font-size: 1.2rem;
text-align: center;
padding-bottom: 1rem;
}
footer a { footer a {
font-size: 1.2rem; font-size: 1.2rem;
color: #d8d8d8; color: #d8d8d8;
@ -105,7 +115,7 @@ footer p, footer label {
} }
#contact-us-container { #contact-us-container {
width: 14rem; width: 16rem;
} }
#contact-us-container h3 { #contact-us-container h3 {

View File

@ -27,8 +27,10 @@
} }
#navbar-logo { #navbar-logo {
width: 3.16rem; height: 3.5rem;
width: 3.5rem;
object-fit: contain; object-fit: contain;
border-radius: 10rem;
} }
#navbar-logo-text { #navbar-logo-text {

View File

@ -10,7 +10,6 @@ import watch from "rollup-plugin-watch";
const production = !process.env.ROLLUP_WATCH; const production = !process.env.ROLLUP_WATCH;
function serve() { function serve() {
let server; let server;

View File

@ -0,0 +1,24 @@
<svelte:options tag="communities-component" />
<script>
// Import statements
import { onMount } from 'svelte'
// Import components
// Main code
onMount(() => {
})
</script>
<style>
@import '/css/common.css';
</style>

View File

@ -0,0 +1,24 @@
<svelte:options tag="cooperatives-component" />
<script>
// Import statements
import { onMount } from 'svelte'
// Import components
// Main code
onMount(() => {
})
</script>
<style>
@import '/css/common.css';
</style>

View File

@ -2,8 +2,12 @@
<script> <script>
// Import statements
// Import components // Import components
// Main code
</script> </script>
<footer> <footer>
@ -11,18 +15,19 @@
<div id="footer-grid-content-container" class="logged"> <div id="footer-grid-content-container" class="logged">
<div id="contact-us-container"> <div id="contact-us-container">
<h2>CONTACT US</h2> <h2>CONTACT US</h2>
<p>Email: <a href="mailto:info@chiron.com">test@test</a></p> <!--<p>Email: <a href="mailto:info@chiron.com">info@libsoc.org</a></p>-->
<p>WhatsApp: <a href="https://chat.whatsapp.com/BhnmUNljUxJ2AjeHUwyTKh" target="_blank">group invite link</a></p>
</div> </div>
</div> </div>
<button on:click={() => {location.href='#'}} id="footer-up" aria-label="go up"> <button on:click={() => {location.href='#'}} id="footer-up" aria-label="go up">
<svg xmlns="http://www.w3.org/2000/svg" width="42.545" height="72.601" viewBox="0 0 42.545 72.601"> <svg xmlns="http://www.w3.org/2000/svg" width="42.545" height="72.601" viewBox="0 0 42.545 72.601">
<g id="Group_268" data-name="Group 268" transform="translate(-6.177 -2.399)"> <g id="Group_268" data-name="Group 268" transform="translate(-6.177 -2.399)">
<rect id="Rectangle_146" data-name="Rectangle 146" width="11" height="51" rx="5.5" transform="translate(22 24)" fill="var(--pink)"/> <rect id="Rectangle_146" data-name="Rectangle 146" width="11" height="51" rx="5.5" transform="translate(22 24)" fill="#DD1C1A"/>
<path id="Path_1145" data-name="Path 1145" d="M23.814,4.021a5,5,0,0,1,7.372,0l16.134,17.6c2.94,3.207,1.046,10.4-3.686,8.379S28.02,14.081,28.391,13.524,16.544,27.976,11.366,30,4.741,24.828,7.68,21.621Z" fill="var(--pink)"/> <path id="Path_1145" data-name="Path 1145" d="M23.814,4.021a5,5,0,0,1,7.372,0l16.134,17.6c2.94,3.207,1.046,10.4-3.686,8.379S28.02,14.081,28.391,13.524,16.544,27.976,11.366,30,4.741,24.828,7.68,21.621Z" fill="#DD1C1A"/>
</g> </g>
</svg> </svg>
</button> </button>
<p id="footer-copyright">© 2023 LibSoc</p> <p id="footer-copyright">© 2023 A global network of Libertarian Socialists</p>
</div> </div>
</footer> </footer>

View File

@ -0,0 +1,24 @@
<svelte:options tag="groups-component" />
<script>
// Import statements
import { onMount } from 'svelte'
// Import components
// Main code
onMount(() => {
})
</script>
<style>
@import '/css/common.css';
</style>

View File

@ -0,0 +1,24 @@
<svelte:options tag="join-us-component" />
<script>
// Import statements
import { onMount } from 'svelte'
// Import components
// Main code
onMount(() => {
})
</script>
<style>
@import '/css/common.css';
</style>

View File

@ -2,7 +2,7 @@
<script> <script>
// Import statements // Import statements
i import { onMount } from 'svelte'
// Import components // Import components
@ -15,12 +15,26 @@
}) })
</script> </script>
<!--
<!--HTML GOES HERE--> <div id="who-we-are">
<p>I AM A TEXT FOR TESTING</p> <p>WHO WE ARE GOES HERE</p>
</div>
-->
<style> <style>
@import '/css/common.css'; @import '/css/common.css';
#who-we-are {
margin: auto;
background-color: rgb(194, 194, 194);
max-width: 1200px;
height: 10rem;
}
#who-we-are p {
font-size: 1.2rem;
text-align: center;
}
</style> </style>

View File

@ -0,0 +1,25 @@
<svelte:options tag="manifesto-component" />
<script>
// Import statements
import { onMount } from 'svelte'
// Import components
// Main code
onMount(() => {
})
</script>
<style>
@import '/css/common.css';
</style>

View File

@ -35,8 +35,8 @@
<header bind:this={navbar} id="navbar"> <header bind:this={navbar} id="navbar">
<!-- Logo --> <!-- Logo -->
<a id=logo-container href="/"> <a id=logo-container href="/">
<img src="" id="navbar-logo" alt="iql logo"> <img src="img/common/flag.png" id="navbar-logo" alt="logo">
<span id="navbar-logo-text">LibSoc</span> <span id="navbar-logo-text">Libertarian socialists</span>
</a> </a>
<!-- Hamburger icon --> <!-- Hamburger icon -->
<input bind:this={hambInput} type="checkbox" id="side-menu" on:click={changeNavbar}> <input bind:this={hambInput} type="checkbox" id="side-menu" on:click={changeNavbar}>
@ -44,7 +44,11 @@
<!-- Menu --> <!-- Menu -->
<nav id="nav"> <nav id="nav">
<ul id="menu"> <ul id="menu">
<li><a href="/test">test</a></li> <li><a href="/manifesto">Manifesto</a></li>
<li><a href="/join-us">Join us</a></li>
<li><a href="/groups">Groups</a></li>
<li><a href="/communities">Communities</a></li>
<li><a href="/cooperatives">Cooperatives</a></li>
</ul> </ul>
</nav> </nav>
</header> </header>

View File

@ -5,7 +5,8 @@ footer {
bottom: 0; bottom: 0;
width: 100%; width: 100%;
height: auto; height: auto;
background: var(--dark-green); background: #5B6970;/*var(--dark-green);*/
border-top: #DD1C1A solid 0.5rem;
} }
footer p, footer a { footer p, footer a {
@ -53,6 +54,15 @@ footer h2 {
margin-bottom: 0; margin-bottom: 0;
} }
#tag-line {
position: relative;
margin: auto;
font-size: 1.2rem;
text-align: center;
padding-bottom: 1rem;
}
footer a { footer a {
font-size: 1.2rem; font-size: 1.2rem;
color: #d8d8d8; color: #d8d8d8;
@ -105,7 +115,7 @@ footer p, footer label {
} }
#contact-us-container { #contact-us-container {
width: 14rem; width: 16rem;
} }
#contact-us-container h3 { #contact-us-container h3 {

View File

@ -27,8 +27,10 @@
} }
#navbar-logo { #navbar-logo {
width: 3.16rem; height: 3.5rem;
width: 3.5rem;
object-fit: contain; object-fit: contain;
border-radius: 10rem;
} }
#navbar-logo-text { #navbar-logo-text {

BIN
Server/public/favicon.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
Server/public/favicon2.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
Server/public/favicon3.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@ -0,0 +1,80 @@
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
import { S as SvelteElement, i as init, a as attribute_to_object, b as insert_dev, s as safe_not_equal, d as dispatch_dev, v as validate_slots, o as onMount, n as noop } from './index-bc9d3868.js';
/* src\communities-component.svelte generated by Svelte v3.52.0 */
function create_fragment(ctx) {
const block = {
c: function create() {
this.c = noop;
},
l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
},
m: noop,
p: noop,
i: noop,
o: noop,
d: noop
};
dispatch_dev("SvelteRegisterBlock", {
block,
id: create_fragment.name,
type: "component",
source: "",
ctx
});
return block;
}
function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
validate_slots('communities-component', slots, []);
onMount(() => {
});
const writable_props = [];
Object.keys($$props).forEach(key => {
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(`<communities-component> was created with unknown prop '${key}'`);
});
$$self.$capture_state = () => ({ onMount });
return [];
}
class Communities_component extends SvelteElement {
constructor(options) {
super();
this.shadowRoot.innerHTML = `<style>@import '/css/common.css';</style>`;
init(
this,
{
target: this.shadowRoot,
props: attribute_to_object(this.attributes),
customElement: true
},
instance,
create_fragment,
safe_not_equal,
{},
null
);
if (options) {
if (options.target) {
insert_dev(options.target, this, options.anchor);
}
}
}
}
customElements.define("communities-component", Communities_component);
export { Communities_component as default };

View File

@ -0,0 +1,80 @@
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
import { S as SvelteElement, i as init, a as attribute_to_object, b as insert_dev, s as safe_not_equal, d as dispatch_dev, v as validate_slots, o as onMount, n as noop } from './index-bc9d3868.js';
/* src\cooperatives-component.svelte generated by Svelte v3.52.0 */
function create_fragment(ctx) {
const block = {
c: function create() {
this.c = noop;
},
l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
},
m: noop,
p: noop,
i: noop,
o: noop,
d: noop
};
dispatch_dev("SvelteRegisterBlock", {
block,
id: create_fragment.name,
type: "component",
source: "",
ctx
});
return block;
}
function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
validate_slots('cooperatives-component', slots, []);
onMount(() => {
});
const writable_props = [];
Object.keys($$props).forEach(key => {
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(`<cooperatives-component> was created with unknown prop '${key}'`);
});
$$self.$capture_state = () => ({ onMount });
return [];
}
class Cooperatives_component extends SvelteElement {
constructor(options) {
super();
this.shadowRoot.innerHTML = `<style>@import '/css/common.css';</style>`;
init(
this,
{
target: this.shadowRoot,
props: attribute_to_object(this.attributes),
customElement: true
},
instance,
create_fragment,
safe_not_equal,
{},
null
);
if (options) {
if (options.target) {
insert_dev(options.target, this, options.anchor);
}
}
}
}
customElements.define("cooperatives-component", Cooperatives_component);
export { Cooperatives_component as default };

View File

@ -37,9 +37,9 @@ function create_fragment(ctx) {
h2.textContent = "CONTACT US"; h2.textContent = "CONTACT US";
t1 = space(); t1 = space();
p0 = element("p"); p0 = element("p");
t2 = text("Email: "); t2 = text("WhatsApp: ");
a = element("a"); a = element("a");
a.textContent = "test@test"; a.textContent = "group invite link";
t4 = space(); t4 = space();
button = element("button"); button = element("button");
svg = svg_element("svg"); svg = svg_element("svg");
@ -48,47 +48,48 @@ function create_fragment(ctx) {
path = svg_element("path"); path = svg_element("path");
t5 = space(); t5 = space();
p1 = element("p"); p1 = element("p");
p1.textContent = "© 2023 LibSoc"; p1.textContent = "© 2023 A global network of Libertarian Socialists";
this.c = noop; this.c = noop;
add_location(h2, file, 12, 16, 273); add_location(h2, file, 16, 16, 313);
attr_dev(a, "href", "mailto:info@chiron.com"); attr_dev(a, "href", "https://chat.whatsapp.com/BhnmUNljUxJ2AjeHUwyTKh");
add_location(a, file, 13, 26, 320); attr_dev(a, "target", "_blank");
add_location(p0, file, 13, 16, 310); add_location(a, file, 18, 29, 454);
add_location(p0, file, 18, 16, 441);
attr_dev(div0, "id", "contact-us-container"); attr_dev(div0, "id", "contact-us-container");
add_location(div0, file, 11, 12, 224); add_location(div0, file, 15, 12, 264);
attr_dev(div1, "id", "footer-grid-content-container"); attr_dev(div1, "id", "footer-grid-content-container");
attr_dev(div1, "class", "logged"); attr_dev(div1, "class", "logged");
add_location(div1, file, 10, 8, 155); add_location(div1, file, 14, 8, 195);
attr_dev(rect, "id", "Rectangle_146"); attr_dev(rect, "id", "Rectangle_146");
attr_dev(rect, "data-name", "Rectangle 146"); attr_dev(rect, "data-name", "Rectangle 146");
attr_dev(rect, "width", "11"); attr_dev(rect, "width", "11");
attr_dev(rect, "height", "51"); attr_dev(rect, "height", "51");
attr_dev(rect, "rx", "5.5"); attr_dev(rect, "rx", "5.5");
attr_dev(rect, "transform", "translate(22 24)"); attr_dev(rect, "transform", "translate(22 24)");
attr_dev(rect, "fill", "var(--pink)"); attr_dev(rect, "fill", "#DD1C1A");
add_location(rect, file, 19, 18, 723); add_location(rect, file, 24, 18, 907);
attr_dev(path, "id", "Path_1145"); attr_dev(path, "id", "Path_1145");
attr_dev(path, "data-name", "Path 1145"); attr_dev(path, "data-name", "Path 1145");
attr_dev(path, "d", "M23.814,4.021a5,5,0,0,1,7.372,0l16.134,17.6c2.94,3.207,1.046,10.4-3.686,8.379S28.02,14.081,28.391,13.524,16.544,27.976,11.366,30,4.741,24.828,7.68,21.621Z"); attr_dev(path, "d", "M23.814,4.021a5,5,0,0,1,7.372,0l16.134,17.6c2.94,3.207,1.046,10.4-3.686,8.379S28.02,14.081,28.391,13.524,16.544,27.976,11.366,30,4.741,24.828,7.68,21.621Z");
attr_dev(path, "fill", "var(--pink)"); attr_dev(path, "fill", "#DD1C1A");
add_location(path, file, 20, 18, 875); add_location(path, file, 25, 18, 1055);
attr_dev(g, "id", "Group_268"); attr_dev(g, "id", "Group_268");
attr_dev(g, "data-name", "Group 268"); attr_dev(g, "data-name", "Group 268");
attr_dev(g, "transform", "translate(-6.177 -2.399)"); attr_dev(g, "transform", "translate(-6.177 -2.399)");
add_location(g, file, 18, 16, 626); add_location(g, file, 23, 16, 810);
attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg");
attr_dev(svg, "width", "42.545"); attr_dev(svg, "width", "42.545");
attr_dev(svg, "height", "72.601"); attr_dev(svg, "height", "72.601");
attr_dev(svg, "viewBox", "0 0 42.545 72.601"); attr_dev(svg, "viewBox", "0 0 42.545 72.601");
add_location(svg, file, 17, 12, 509); add_location(svg, file, 22, 12, 693);
attr_dev(button, "id", "footer-up"); attr_dev(button, "id", "footer-up");
attr_dev(button, "aria-label", "go up"); attr_dev(button, "aria-label", "go up");
add_location(button, file, 16, 8, 416); add_location(button, file, 21, 8, 600);
attr_dev(p1, "id", "footer-copyright"); attr_dev(p1, "id", "footer-copyright");
add_location(p1, file, 24, 8, 1198); add_location(p1, file, 29, 8, 1374);
attr_dev(div2, "id", "footer-content-container"); attr_dev(div2, "id", "footer-content-container");
add_location(div2, file, 9, 4, 110); add_location(div2, file, 13, 4, 150);
add_location(footer, file, 8, 0, 96); add_location(footer, file, 12, 0, 136);
}, },
l: function claim(nodes) { l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");

View File

@ -0,0 +1,80 @@
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
import { S as SvelteElement, i as init, a as attribute_to_object, b as insert_dev, s as safe_not_equal, d as dispatch_dev, v as validate_slots, o as onMount, n as noop } from './index-bc9d3868.js';
/* src\groups-component.svelte generated by Svelte v3.52.0 */
function create_fragment(ctx) {
const block = {
c: function create() {
this.c = noop;
},
l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
},
m: noop,
p: noop,
i: noop,
o: noop,
d: noop
};
dispatch_dev("SvelteRegisterBlock", {
block,
id: create_fragment.name,
type: "component",
source: "",
ctx
});
return block;
}
function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
validate_slots('groups-component', slots, []);
onMount(() => {
});
const writable_props = [];
Object.keys($$props).forEach(key => {
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(`<groups-component> was created with unknown prop '${key}'`);
});
$$self.$capture_state = () => ({ onMount });
return [];
}
class Groups_component extends SvelteElement {
constructor(options) {
super();
this.shadowRoot.innerHTML = `<style>@import '/css/common.css';</style>`;
init(
this,
{
target: this.shadowRoot,
props: attribute_to_object(this.attributes),
customElement: true
},
instance,
create_fragment,
safe_not_equal,
{},
null
);
if (options) {
if (options.target) {
insert_dev(options.target, this, options.anchor);
}
}
}
}
customElements.define("groups-component", Groups_component);
export { Groups_component as default };

View File

@ -0,0 +1,445 @@
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
function noop() { }
function add_location(element, file, line, column, char) {
element.__svelte_meta = {
loc: { file, line, column, char }
};
}
function run(fn) {
return fn();
}
function blank_object() {
return Object.create(null);
}
function run_all(fns) {
fns.forEach(run);
}
function is_function(thing) {
return typeof thing === 'function';
}
function safe_not_equal(a, b) {
return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
}
let src_url_equal_anchor;
function src_url_equal(element_src, url) {
if (!src_url_equal_anchor) {
src_url_equal_anchor = document.createElement('a');
}
src_url_equal_anchor.href = url;
return element_src === src_url_equal_anchor.href;
}
function is_empty(obj) {
return Object.keys(obj).length === 0;
}
function append(target, node) {
target.appendChild(node);
}
function insert(target, node, anchor) {
target.insertBefore(node, anchor || null);
}
function detach(node) {
node.parentNode.removeChild(node);
}
function destroy_each(iterations, detaching) {
for (let i = 0; i < iterations.length; i += 1) {
if (iterations[i])
iterations[i].d(detaching);
}
}
function element(name) {
return document.createElement(name);
}
function svg_element(name) {
return document.createElementNS('http://www.w3.org/2000/svg', name);
}
function text(data) {
return document.createTextNode(data);
}
function space() {
return text(' ');
}
function listen(node, event, handler, options) {
node.addEventListener(event, handler, options);
return () => node.removeEventListener(event, handler, options);
}
function attr(node, attribute, value) {
if (value == null)
node.removeAttribute(attribute);
else if (node.getAttribute(attribute) !== value)
node.setAttribute(attribute, value);
}
function children(element) {
return Array.from(element.childNodes);
}
function set_style(node, key, value, important) {
if (value === null) {
node.style.removeProperty(key);
}
else {
node.style.setProperty(key, value, important ? 'important' : '');
}
}
function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {
const e = document.createEvent('CustomEvent');
e.initCustomEvent(type, bubbles, cancelable, detail);
return e;
}
function attribute_to_object(attributes) {
const result = {};
for (const attribute of attributes) {
result[attribute.name] = attribute.value;
}
return result;
}
let current_component;
function set_current_component(component) {
current_component = component;
}
function get_current_component() {
if (!current_component)
throw new Error('Function called outside component initialization');
return current_component;
}
/**
* The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.
* It must be called during the component's initialisation (but doesn't need to live *inside* the component;
* it can be called from an external module).
*
* `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).
*
* https://svelte.dev/docs#run-time-svelte-onmount
*/
function onMount(fn) {
get_current_component().$$.on_mount.push(fn);
}
/**
* Associates an arbitrary `context` object with the current component and the specified `key`
* and returns that object. The context is then available to children of the component
* (including slotted content) with `getContext`.
*
* Like lifecycle functions, this must be called during component initialisation.
*
* https://svelte.dev/docs#run-time-svelte-setcontext
*/
function setContext(key, context) {
get_current_component().$$.context.set(key, context);
return context;
}
/**
* Retrieves the context that belongs to the closest parent component with the specified `key`.
* Must be called during component initialisation.
*
* https://svelte.dev/docs#run-time-svelte-getcontext
*/
function getContext(key) {
return get_current_component().$$.context.get(key);
}
const dirty_components = [];
const binding_callbacks = [];
const render_callbacks = [];
const flush_callbacks = [];
const resolved_promise = Promise.resolve();
let update_scheduled = false;
function schedule_update() {
if (!update_scheduled) {
update_scheduled = true;
resolved_promise.then(flush);
}
}
function add_render_callback(fn) {
render_callbacks.push(fn);
}
// flush() calls callbacks in this order:
// 1. All beforeUpdate callbacks, in order: parents before children
// 2. All bind:this callbacks, in reverse order: children before parents.
// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT
// for afterUpdates called during the initial onMount, which are called in
// reverse order: children before parents.
// Since callbacks might update component values, which could trigger another
// call to flush(), the following steps guard against this:
// 1. During beforeUpdate, any updated components will be added to the
// dirty_components array and will cause a reentrant call to flush(). Because
// the flush index is kept outside the function, the reentrant call will pick
// up where the earlier call left off and go through all dirty components. The
// current_component value is saved and restored so that the reentrant call will
// not interfere with the "parent" flush() call.
// 2. bind:this callbacks cannot trigger new flush() calls.
// 3. During afterUpdate, any updated components will NOT have their afterUpdate
// callback called a second time; the seen_callbacks set, outside the flush()
// function, guarantees this behavior.
const seen_callbacks = new Set();
let flushidx = 0; // Do *not* move this inside the flush() function
function flush() {
const saved_component = current_component;
do {
// first, call beforeUpdate functions
// and update components
while (flushidx < dirty_components.length) {
const component = dirty_components[flushidx];
flushidx++;
set_current_component(component);
update(component.$$);
}
set_current_component(null);
dirty_components.length = 0;
flushidx = 0;
while (binding_callbacks.length)
binding_callbacks.pop()();
// then, once components are updated, call
// afterUpdate functions. This may cause
// subsequent updates...
for (let i = 0; i < render_callbacks.length; i += 1) {
const callback = render_callbacks[i];
if (!seen_callbacks.has(callback)) {
// ...so guard against infinite loops
seen_callbacks.add(callback);
callback();
}
}
render_callbacks.length = 0;
} while (dirty_components.length);
while (flush_callbacks.length) {
flush_callbacks.pop()();
}
update_scheduled = false;
seen_callbacks.clear();
set_current_component(saved_component);
}
function update($$) {
if ($$.fragment !== null) {
$$.update();
run_all($$.before_update);
const dirty = $$.dirty;
$$.dirty = [-1];
$$.fragment && $$.fragment.p($$.ctx, dirty);
$$.after_update.forEach(add_render_callback);
}
}
const outroing = new Set();
function transition_in(block, local) {
if (block && block.i) {
outroing.delete(block);
block.i(local);
}
}
const globals = (typeof window !== 'undefined'
? window
: typeof globalThis !== 'undefined'
? globalThis
: global);
function mount_component(component, target, anchor, customElement) {
const { fragment, after_update } = component.$$;
fragment && fragment.m(target, anchor);
if (!customElement) {
// onMount happens before the initial afterUpdate
add_render_callback(() => {
const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);
// if the component was destroyed immediately
// it will update the `$$.on_destroy` reference to `null`.
// the destructured on_destroy may still reference to the old array
if (component.$$.on_destroy) {
component.$$.on_destroy.push(...new_on_destroy);
}
else {
// Edge case - component was destroyed immediately,
// most likely as a result of a binding initialising
run_all(new_on_destroy);
}
component.$$.on_mount = [];
});
}
after_update.forEach(add_render_callback);
}
function destroy_component(component, detaching) {
const $$ = component.$$;
if ($$.fragment !== null) {
run_all($$.on_destroy);
$$.fragment && $$.fragment.d(detaching);
// TODO null out other refs, including component.$$ (but need to
// preserve final state?)
$$.on_destroy = $$.fragment = null;
$$.ctx = [];
}
}
function make_dirty(component, i) {
if (component.$$.dirty[0] === -1) {
dirty_components.push(component);
schedule_update();
component.$$.dirty.fill(0);
}
component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));
}
function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {
const parent_component = current_component;
set_current_component(component);
const $$ = component.$$ = {
fragment: null,
ctx: [],
// state
props,
update: noop,
not_equal,
bound: blank_object(),
// lifecycle
on_mount: [],
on_destroy: [],
on_disconnect: [],
before_update: [],
after_update: [],
context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
// everything else
callbacks: blank_object(),
dirty,
skip_bound: false,
root: options.target || parent_component.$$.root
};
append_styles && append_styles($$.root);
let ready = false;
$$.ctx = instance
? instance(component, options.props || {}, (i, ret, ...rest) => {
const value = rest.length ? rest[0] : ret;
if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
if (!$$.skip_bound && $$.bound[i])
$$.bound[i](value);
if (ready)
make_dirty(component, i);
}
return ret;
})
: [];
$$.update();
ready = true;
run_all($$.before_update);
// `false` as a special case of no DOM component
$$.fragment = create_fragment ? create_fragment($$.ctx) : false;
if (options.target) {
if (options.hydrate) {
const nodes = children(options.target);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
$$.fragment && $$.fragment.l(nodes);
nodes.forEach(detach);
}
else {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
$$.fragment && $$.fragment.c();
}
if (options.intro)
transition_in(component.$$.fragment);
mount_component(component, options.target, options.anchor, options.customElement);
flush();
}
set_current_component(parent_component);
}
let SvelteElement;
if (typeof HTMLElement === 'function') {
SvelteElement = class extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
const { on_mount } = this.$$;
this.$$.on_disconnect = on_mount.map(run).filter(is_function);
// @ts-ignore todo: improve typings
for (const key in this.$$.slotted) {
// @ts-ignore todo: improve typings
this.appendChild(this.$$.slotted[key]);
}
}
attributeChangedCallback(attr, _oldValue, newValue) {
this[attr] = newValue;
}
disconnectedCallback() {
run_all(this.$$.on_disconnect);
}
$destroy() {
destroy_component(this, 1);
this.$destroy = noop;
}
$on(type, callback) {
// TODO should this delegate to addEventListener?
if (!is_function(callback)) {
return noop;
}
const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
callbacks.push(callback);
return () => {
const index = callbacks.indexOf(callback);
if (index !== -1)
callbacks.splice(index, 1);
};
}
$set($$props) {
if (this.$$set && !is_empty($$props)) {
this.$$.skip_bound = true;
this.$$set($$props);
this.$$.skip_bound = false;
}
}
};
}
function dispatch_dev(type, detail) {
document.dispatchEvent(custom_event(type, Object.assign({ version: '3.52.0' }, detail), { bubbles: true }));
}
function append_dev(target, node) {
dispatch_dev('SvelteDOMInsert', { target, node });
append(target, node);
}
function insert_dev(target, node, anchor) {
dispatch_dev('SvelteDOMInsert', { target, node, anchor });
insert(target, node, anchor);
}
function detach_dev(node) {
dispatch_dev('SvelteDOMRemove', { node });
detach(node);
}
function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {
const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];
if (has_prevent_default)
modifiers.push('preventDefault');
if (has_stop_propagation)
modifiers.push('stopPropagation');
dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });
const dispose = listen(node, event, handler, options);
return () => {
dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });
dispose();
};
}
function attr_dev(node, attribute, value) {
attr(node, attribute, value);
if (value == null)
dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });
else
dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });
}
function set_data_dev(text, data) {
data = '' + data;
if (text.wholeText === data)
return;
dispatch_dev('SvelteDOMSetData', { node: text, data });
text.data = data;
}
function validate_each_argument(arg) {
if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {
let msg = '{#each} only iterates over array-like objects.';
if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {
msg += ' You can use a spread to convert this iterable into an array.';
}
throw new Error(msg);
}
}
function validate_slots(name, slot, keys) {
for (const slot_key of Object.keys(slot)) {
if (!~keys.indexOf(slot_key)) {
console.warn(`<${name}> received an unexpected slot "${slot_key}".`);
}
}
}
export { run_all as A, svg_element as B, SvelteElement as S, attribute_to_object as a, insert_dev as b, add_location as c, dispatch_dev as d, element as e, detach_dev as f, attr_dev as g, append_dev as h, init as i, flush as j, validate_each_argument as k, globals as l, destroy_each as m, noop as n, onMount as o, binding_callbacks as p, space as q, set_style as r, safe_not_equal as s, text as t, listen_dev as u, validate_slots as v, set_data_dev as w, getContext as x, setContext as y, src_url_equal as z };

View File

@ -0,0 +1,80 @@
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
import { S as SvelteElement, i as init, a as attribute_to_object, b as insert_dev, s as safe_not_equal, d as dispatch_dev, v as validate_slots, o as onMount, n as noop } from './index-bc9d3868.js';
/* src\join-us-component.svelte generated by Svelte v3.52.0 */
function create_fragment(ctx) {
const block = {
c: function create() {
this.c = noop;
},
l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
},
m: noop,
p: noop,
i: noop,
o: noop,
d: noop
};
dispatch_dev("SvelteRegisterBlock", {
block,
id: create_fragment.name,
type: "component",
source: "",
ctx
});
return block;
}
function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
validate_slots('join-us-component', slots, []);
onMount(() => {
});
const writable_props = [];
Object.keys($$props).forEach(key => {
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(`<join-us-component> was created with unknown prop '${key}'`);
});
$$self.$capture_state = () => ({ onMount });
return [];
}
class Join_us_component extends SvelteElement {
constructor(options) {
super();
this.shadowRoot.innerHTML = `<style>@import '/css/common.css';</style>`;
init(
this,
{
target: this.shadowRoot,
props: attribute_to_object(this.attributes),
customElement: true
},
instance,
create_fragment,
safe_not_equal,
{},
null
);
if (options) {
if (options.target) {
insert_dev(options.target, this, options.anchor);
}
}
}
}
customElements.define("join-us-component", Join_us_component);
export { Join_us_component as default };

View File

@ -1,33 +1,22 @@
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document); (function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
import { S as SvelteElement, i as init, a as attribute_to_object, b as insert_dev, s as safe_not_equal, d as dispatch_dev, v as validate_slots, e as element, n as noop, c as add_location, h as detach_dev } from './index-bc9d3868.js'; import { S as SvelteElement, i as init, a as attribute_to_object, b as insert_dev, s as safe_not_equal, d as dispatch_dev, v as validate_slots, o as onMount, n as noop } from './index-bc9d3868.js';
/* src\landing-component.svelte generated by Svelte v3.52.0 */ /* src\landing-component.svelte generated by Svelte v3.52.0 */
const file = "src\\landing-component.svelte";
function create_fragment(ctx) { function create_fragment(ctx) {
let p;
const block = { const block = {
c: function create() { c: function create() {
p = element("p");
p.textContent = "I AM A TEXT FOR TESTING";
this.c = noop; this.c = noop;
add_location(p, file, 19, 0, 221);
}, },
l: function claim(nodes) { l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
}, },
m: function mount(target, anchor) { m: noop,
insert_dev(target, p, anchor);
},
p: noop, p: noop,
i: noop, i: noop,
o: noop, o: noop,
d: function destroy(detaching) { d: noop
if (detaching) detach_dev(p);
}
}; };
dispatch_dev("SvelteRegisterBlock", { dispatch_dev("SvelteRegisterBlock", {
@ -41,13 +30,10 @@ function create_fragment(ctx) {
return block; return block;
} }
function instance($$self, $$props) { function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props; let { $$slots: slots = {}, $$scope } = $$props;
validate_slots('landing-component', slots, []); validate_slots('landing-component', slots, []);
i;
// Import components
// Main code
onMount(() => { onMount(() => {
}); });
@ -58,6 +44,7 @@ function instance($$self, $$props) {
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(`<landing-component> was created with unknown prop '${key}'`); if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(`<landing-component> was created with unknown prop '${key}'`);
}); });
$$self.$capture_state = () => ({ onMount });
return []; return [];
} }

View File

@ -0,0 +1,80 @@
(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
import { S as SvelteElement, i as init, a as attribute_to_object, b as insert_dev, s as safe_not_equal, d as dispatch_dev, v as validate_slots, o as onMount, n as noop } from './index-bc9d3868.js';
/* src\manifesto-component.svelte generated by Svelte v3.52.0 */
function create_fragment(ctx) {
const block = {
c: function create() {
this.c = noop;
},
l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
},
m: noop,
p: noop,
i: noop,
o: noop,
d: noop
};
dispatch_dev("SvelteRegisterBlock", {
block,
id: create_fragment.name,
type: "component",
source: "",
ctx
});
return block;
}
function instance($$self, $$props, $$invalidate) {
let { $$slots: slots = {}, $$scope } = $$props;
validate_slots('manifesto-component', slots, []);
onMount(() => {
});
const writable_props = [];
Object.keys($$props).forEach(key => {
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(`<manifesto-component> was created with unknown prop '${key}'`);
});
$$self.$capture_state = () => ({ onMount });
return [];
}
class Manifesto_component extends SvelteElement {
constructor(options) {
super();
this.shadowRoot.innerHTML = `<style>@import '/css/common.css';</style>`;
init(
this,
{
target: this.shadowRoot,
props: attribute_to_object(this.attributes),
customElement: true
},
instance,
create_fragment,
safe_not_equal,
{},
null
);
if (options) {
if (options.target) {
insert_dev(options.target, this, options.anchor);
}
}
}
}
customElements.define("manifesto-component", Manifesto_component);
export { Manifesto_component as default };

View File

@ -20,8 +20,20 @@ function create_fragment(ctx) {
let t4; let t4;
let nav; let nav;
let ul; let ul;
let li; let li0;
let a1; let a1;
let t6;
let li1;
let a2;
let t8;
let li2;
let a3;
let t10;
let li3;
let a4;
let t12;
let li4;
let a5;
let mounted; let mounted;
let dispose; let dispose;
@ -32,7 +44,7 @@ function create_fragment(ctx) {
img = element("img"); img = element("img");
t0 = space(); t0 = space();
span0 = element("span"); span0 = element("span");
span0.textContent = "LibSoc"; span0.textContent = "Libertarian socialists";
t2 = space(); t2 = space();
input = element("input"); input = element("input");
t3 = space(); t3 = space();
@ -41,34 +53,62 @@ function create_fragment(ctx) {
t4 = space(); t4 = space();
nav = element("nav"); nav = element("nav");
ul = element("ul"); ul = element("ul");
li = element("li"); li0 = element("li");
a1 = element("a"); a1 = element("a");
a1.textContent = "test"; a1.textContent = "Manifesto";
t6 = space();
li1 = element("li");
a2 = element("a");
a2.textContent = "Join us";
t8 = space();
li2 = element("li");
a3 = element("a");
a3.textContent = "Groups";
t10 = space();
li3 = element("li");
a4 = element("a");
a4.textContent = "Communities";
t12 = space();
li4 = element("li");
a5 = element("a");
a5.textContent = "Cooperatives";
this.c = noop; this.c = noop;
if (!src_url_equal(img.src, img_src_value = "")) attr_dev(img, "src", img_src_value); if (!src_url_equal(img.src, img_src_value = "img/common/flag.png")) attr_dev(img, "src", img_src_value);
attr_dev(img, "id", "navbar-logo"); attr_dev(img, "id", "navbar-logo");
attr_dev(img, "alt", "iql logo"); attr_dev(img, "alt", "logo");
add_location(img, file, 37, 8, 810); add_location(img, file, 37, 8, 810);
attr_dev(span0, "id", "navbar-logo-text"); attr_dev(span0, "id", "navbar-logo-text");
add_location(span0, file, 38, 8, 864); add_location(span0, file, 38, 8, 879);
attr_dev(a0, "id", "logo-container"); attr_dev(a0, "id", "logo-container");
attr_dev(a0, "href", "/"); attr_dev(a0, "href", "/");
add_location(a0, file, 36, 4, 770); add_location(a0, file, 36, 4, 770);
attr_dev(input, "type", "checkbox"); attr_dev(input, "type", "checkbox");
attr_dev(input, "id", "side-menu"); attr_dev(input, "id", "side-menu");
add_location(input, file, 41, 4, 950); add_location(input, file, 41, 4, 981);
attr_dev(span1, "id", "hamb-line"); attr_dev(span1, "id", "hamb-line");
add_location(span1, file, 42, 37, 1073); add_location(span1, file, 42, 37, 1104);
attr_dev(label, "id", "hamb"); attr_dev(label, "id", "hamb");
attr_dev(label, "for", "side-menu"); attr_dev(label, "for", "side-menu");
add_location(label, file, 42, 4, 1040); add_location(label, file, 42, 4, 1071);
attr_dev(a1, "href", "/test"); attr_dev(a1, "href", "/manifesto");
add_location(a1, file, 46, 16, 1190); add_location(a1, file, 46, 16, 1221);
add_location(li, file, 46, 12, 1186); add_location(li0, file, 46, 12, 1217);
attr_dev(a2, "href", "/join-us");
add_location(a2, file, 47, 16, 1278);
add_location(li1, file, 47, 12, 1274);
attr_dev(a3, "href", "/groups");
add_location(a3, file, 48, 16, 1331);
add_location(li2, file, 48, 12, 1327);
attr_dev(a4, "href", "/communities");
add_location(a4, file, 49, 16, 1382);
add_location(li3, file, 49, 12, 1378);
attr_dev(a5, "href", "/cooperatives");
add_location(a5, file, 50, 16, 1443);
add_location(li4, file, 50, 12, 1439);
attr_dev(ul, "id", "menu"); attr_dev(ul, "id", "menu");
add_location(ul, file, 45, 8, 1158); add_location(ul, file, 45, 8, 1189);
attr_dev(nav, "id", "nav"); attr_dev(nav, "id", "nav");
add_location(nav, file, 44, 4, 1134); add_location(nav, file, 44, 4, 1165);
attr_dev(header, "id", "navbar"); attr_dev(header, "id", "navbar");
add_location(header, file, 34, 0, 706); add_location(header, file, 34, 0, 706);
}, },
@ -90,8 +130,20 @@ function create_fragment(ctx) {
append_dev(header, t4); append_dev(header, t4);
append_dev(header, nav); append_dev(header, nav);
append_dev(nav, ul); append_dev(nav, ul);
append_dev(ul, li); append_dev(ul, li0);
append_dev(li, a1); append_dev(li0, a1);
append_dev(ul, t6);
append_dev(ul, li1);
append_dev(li1, a2);
append_dev(ul, t8);
append_dev(ul, li2);
append_dev(li2, a3);
append_dev(ul, t10);
append_dev(ul, li3);
append_dev(li3, a4);
append_dev(ul, t12);
append_dev(ul, li4);
append_dev(li4, a5);
/*header_binding*/ ctx[4](header); /*header_binding*/ ctx[4](header);
if (!mounted) { if (!mounted) {

View File

@ -6,3 +6,14 @@ using Server.BasicController
#---Basic----------------------------------------------------------- #---Basic-----------------------------------------------------------
route("/", BasicController.landing, named = :landing) route("/", BasicController.landing, named = :landing)
route("/manifesto", BasicController.manifesto, named = :manifest)
route("/join-us", BasicController.join_us, named = :join_us)
route("/groups", BasicController.groups, named = :groups)
route("/cooperatives", BasicController.cooperatives, named = :cooperatives)
route("/communities", BasicController.communities, named = :communities)