@@ -172,6 +172,9 @@ select { | |||
a:hover { | |||
@apply opacity-90; | |||
} | |||
a.link:hover { | |||
@apply opacity-100; | |||
} | |||
h2,h3 { | |||
@@ -284,6 +287,17 @@ p + p { | |||
/* background-image: linear-gradient(to top, purple, transparent) ; */ | |||
} | |||
.link:hover path, | |||
.active path { | |||
stroke: white; | |||
} | |||
.link:hover rect, | |||
.active rect { | |||
fill: white; | |||
} | |||
.link:hover { | |||
@apply bg-expurple text-white; | |||
} |
@@ -635,6 +635,9 @@ video { | |||
.h-40 { | |||
height: 10rem; | |||
} | |||
.h-5 { | |||
height: 1.25rem; | |||
} | |||
.h-fit { | |||
height: -moz-fit-content; | |||
height: fit-content; | |||
@@ -645,6 +648,9 @@ video { | |||
.h-screen { | |||
height: 100vh; | |||
} | |||
.min-h-\[2rem\] { | |||
min-height: 2rem; | |||
} | |||
.w-10 { | |||
width: 2.5rem; | |||
} | |||
@@ -657,6 +663,9 @@ video { | |||
.w-48 { | |||
width: 12rem; | |||
} | |||
.w-5 { | |||
width: 1.25rem; | |||
} | |||
.w-\[25rem\] { | |||
width: 25rem; | |||
} | |||
@@ -669,6 +678,9 @@ video { | |||
.w-\[35rem\] { | |||
width: 35rem; | |||
} | |||
.w-\[4rem\] { | |||
width: 4rem; | |||
} | |||
.w-fit { | |||
width: -moz-fit-content; | |||
width: fit-content; | |||
@@ -685,6 +697,9 @@ video { | |||
.max-w-\[65ch\] { | |||
max-width: 65ch; | |||
} | |||
.shrink-0 { | |||
flex-shrink: 0; | |||
} | |||
.-rotate-12 { | |||
--tw-rotate: -12deg; | |||
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); | |||
@@ -702,6 +717,9 @@ video { | |||
.grid-rows-1 { | |||
grid-template-rows: repeat(1, minmax(0, 1fr)); | |||
} | |||
.flex-wrap { | |||
flex-wrap: wrap; | |||
} | |||
.content-start { | |||
align-content: flex-start; | |||
} | |||
@@ -717,6 +735,12 @@ video { | |||
.justify-between { | |||
justify-content: space-between; | |||
} | |||
.gap-2 { | |||
gap: 0.5rem; | |||
} | |||
.gap-4 { | |||
gap: 1rem; | |||
} | |||
.gap-8 { | |||
gap: 2rem; | |||
} | |||
@@ -760,21 +784,28 @@ video { | |||
--tw-bg-opacity: 1; | |||
background-color: rgb(0 0 0 / var(--tw-bg-opacity)); | |||
} | |||
.bg-white { | |||
--tw-bg-opacity: 1; | |||
background-color: rgb(255 255 255 / var(--tw-bg-opacity)); | |||
} | |||
.bg-red-400 { | |||
--tw-bg-opacity: 1; | |||
background-color: rgb(248 113 113 / var(--tw-bg-opacity)); | |||
} | |||
.bg-white { | |||
--tw-bg-opacity: 1; | |||
background-color: rgb(255 255 255 / var(--tw-bg-opacity)); | |||
} | |||
.object-contain { | |||
-o-object-fit: contain; | |||
object-fit: contain; | |||
} | |||
.p-3 { | |||
padding: 0.75rem; | |||
} | |||
.p-4 { | |||
padding: 1rem; | |||
} | |||
.px-2 { | |||
padding-left: 0.5rem; | |||
padding-right: 0.5rem; | |||
} | |||
.px-4 { | |||
padding-left: 1rem; | |||
padding-right: 1rem; | |||
@@ -791,6 +822,10 @@ video { | |||
padding-top: 0.75rem; | |||
padding-bottom: 0.75rem; | |||
} | |||
.py-4 { | |||
padding-top: 1rem; | |||
padding-bottom: 1rem; | |||
} | |||
.py-6 { | |||
padding-top: 1.5rem; | |||
padding-bottom: 1.5rem; | |||
@@ -811,9 +846,6 @@ video { | |||
.text-center { | |||
text-align: center; | |||
} | |||
.text-right { | |||
text-align: right; | |||
} | |||
.text-base { | |||
font-size: 1.1rem; | |||
line-height: 1.22; | |||
@@ -1061,6 +1093,9 @@ select { | |||
a:hover { | |||
opacity: 0.9; | |||
} | |||
a.link:hover { | |||
opacity: 1; | |||
} | |||
h2,h3 { | |||
@@ -1211,14 +1246,25 @@ p + p { | |||
} | |||
.active { | |||
background-color: rgba(103, 48, 255,0.8); | |||
background-color: rgba(103, 48, 255,0.5); | |||
--tw-text-opacity: 1; | |||
color: rgb(255 255 255 / var(--tw-text-opacity)); | |||
/* background-image: linear-gradient(to top, purple, transparent) ; */ | |||
} | |||
.link:hover path, | |||
.active path { | |||
stroke: white; | |||
} | |||
.link:hover rect, | |||
.active rect { | |||
fill: white; | |||
} | |||
.link:hover { | |||
background-color: rgba(103, 48, 255,0.8); | |||
background-color: rgba(103, 48, 255,0.5); | |||
--tw-text-opacity: 1; | |||
color: rgb(255 255 255 / var(--tw-text-opacity)); | |||
} | |||
@@ -1274,8 +1320,20 @@ details[open]::details-content { | |||
padding-bottom: 0.5rem; | |||
} | |||
a.menuitem:hover { | |||
opacity: 1; | |||
} | |||
.menuitem:hover path { | |||
stroke: white; | |||
} | |||
.menuitem:hover rect { | |||
fill: white; | |||
} | |||
.menuitem:hover { | |||
background-color: rgba(103, 48, 255,0.8); | |||
background-color: rgba(103, 48, 255,0.5); | |||
--tw-text-opacity: 1; | |||
color: rgb(255 255 255 / var(--tw-text-opacity)); | |||
} | |||
@@ -1370,8 +1428,8 @@ details[open]::details-content { | |||
display: none; | |||
} | |||
.lg\:w-\[10\.5rem\] { | |||
width: 10.5rem; | |||
.lg\:w-\[12rem\] { | |||
width: 12rem; | |||
} | |||
.lg\:w-\[32rem\] { | |||
@@ -1418,8 +1476,4 @@ details[open]::details-content { | |||
.lg\:pr-8 { | |||
padding-right: 2rem; | |||
} | |||
.lg\:text-center { | |||
text-align: center; | |||
} | |||
} |
@@ -22,7 +22,7 @@ module.exports = { | |||
}, | |||
colors: { | |||
'expurple': { | |||
DEFAULT: 'rgba(103, 48, 255,0.8)' | |||
DEFAULT: 'rgba(103, 48, 255,0.5)' | |||
} | |||
// 'ggreen': { | |||
// light: '#67e8f9', |
@@ -14,14 +14,40 @@ | |||
{% macro view_switch() %} | |||
<div class="flex"> | |||
<a | |||
href="{{ request.base_url }}?view=regular{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}"> | |||
Expanded view | |||
href="{{ request.base_url }}?view=regular{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}" | |||
class="block link flex p-3 gap-2 {% if view != 'list' %} active {% endif %}" | |||
> | |||
<div class="w-5 h-5 inline-block"> | |||
<svg width="100%" height="100%" viewBox="0 0 46 36" fill="none" xmlns="http://www.w3.org/2000/svg"> | |||
<rect width="21" height="36" fill="black" /> | |||
<rect x="27" width="19" height="14" fill="black" /> | |||
<rect x="27" y="21" width="19" height="15" fill="black" /> | |||
</svg> | |||
</div> | |||
Expanded | |||
</a> | |||
<a | |||
href="{{ request.base_url }}?view=list{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}"> | |||
LIST VIEW | |||
href="{{ request.base_url }}?view=list{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}" | |||
class="block link flex p-3 gap-2 {% if view == 'list' %} active {% endif %}" | |||
> | |||
<div class="w-5 h-5 inline-block "> | |||
<svg width="100%" height="100%" viewBox="0 0 38 36" fill="none" xmlns="http://www.w3.org/2000/svg"> | |||
<path d="M0 2H38" stroke="black" stroke-width="2.5" /> | |||
<path d="M0 13H38" stroke="black" stroke-width="2.5" /> | |||
<path d="M0 24H38" stroke="black" stroke-width="2.5" /> | |||
<path d="M0 35H38" stroke="black" stroke-width="2.5" /> | |||
</svg> | |||
</div> | |||
List | |||
</a> | |||
</div> | |||
{% endmacro %} | |||
@@ -47,30 +73,30 @@ | |||
</a> | |||
<!-- <div class="ml-auto mr-2"> | |||
{% if current_user.is_authenticated %} | |||
<a href="{{ url_for('create.create_resource') }}" class="block link"> | |||
Add resource | |||
</a> | |||
{% endif %} | |||
{% if current_user.is_authenticated %} | |||
<a href="{{ url_for('main.profile') }}" class="block link"> | |||
Profile | |||
</a> | |||
{% endif %} | |||
{% if not current_user.is_authenticated %} | |||
<a href="{{ url_for('auth.login') }}" class="block link"> | |||
Login | |||
</a> | |||
<a href="{{ url_for('auth.signup') }}" class="block link"> | |||
Sign Up | |||
</a> | |||
{% endif %} | |||
{% if current_user.is_authenticated %} | |||
<a href="{{ url_for('auth.logout') }}" class="block link"> | |||
Logout | |||
</a> | |||
{% endif %} | |||
</div> --> | |||
{% if current_user.is_authenticated %} | |||
<a href="{{ url_for('create.create_resource') }}" class="block link"> | |||
Add resource | |||
</a> | |||
{% endif %} | |||
{% if current_user.is_authenticated %} | |||
<a href="{{ url_for('main.profile') }}" class="block link"> | |||
Profile | |||
</a> | |||
{% endif %} | |||
{% if not current_user.is_authenticated %} | |||
<a href="{{ url_for('auth.login') }}" class="block link"> | |||
Login | |||
</a> | |||
<a href="{{ url_for('auth.signup') }}" class="block link"> | |||
Sign Up | |||
</a> | |||
{% endif %} | |||
{% if current_user.is_authenticated %} | |||
<a href="{{ url_for('auth.logout') }}" class="block link"> | |||
Logout | |||
</a> | |||
{% endif %} | |||
</div> --> | |||
<form action="{{ url_for('search.basic_search') }}" class="hidden lg:block"> | |||
<input type="text" name="query" class="text-center h-full text-base border-l-2 border-black pl-1" | |||
@@ -125,27 +151,29 @@ | |||
{% macro resource_list(resource, loop, show_number=true) %} | |||
<div class="border-b-2 border-black"> | |||
<a class="block h-full py-1 px-4 hover:opacity-60 transition-opacity cursor-pointer size-{{ size }}" {% if | |||
<a class="flex gap-4 h-full py-1 hover:opacity-60 transition-opacity cursor-pointer size-{{ size }}" {% if | |||
resource['type']=='book' %} href="{{ url_for('book.show_book', book_id=resource['id']) }}" {% endif %} {% if | |||
resource['type']=='tool' %} href="{{ url_for('tool.show_tool', tool_id=resource['id']) }}" {% endif %} {% if | |||
resource['type']=='practice' %} href="{{ url_for('practice.show_practice', practice_id=resource['id']) }}" {% endif | |||
%} hx-target="#modal-content" hx-select="main" hx-swap="innerHTML" @click="openModal()"> | |||
<span class="{% if show_number %} hidden {% endif %} lg:w-[10.5rem] lg:text-center "> | |||
<div class="w-[4rem] shrink-0 lg:w-[12rem] text-center "> | |||
{% if show_number %} | |||
{{loop.index}} / {{count}} | |||
{% else %} | |||
<span class="capitalize inline-block min-w-[5rem] px-4 text-right">{{ resource['type'] }}</span> | |||
<div class="capitalize inline-block min-w-[5rem] px-4 ">{{ resource['type'] }}</div> | |||
{% endif %} | |||
</span> | |||
</div> | |||
<span class="{{ resource.type }}"> | |||
{{ resource.name }} | |||
</span> | |||
{% if resource['year'] %} | |||
{{ resource['year'] }}{% if resource['author'] %}, {{ resource['author'] }}{% endif%} | |||
{% endif %} | |||
<div> | |||
<span class="{{ resource.type }}"> | |||
{{ resource.name }} | |||
</span> | |||
{% if resource['year'] %} | |||
{{ resource['year'] }}{% if resource['author'] %}, {{ resource['author'] }}{% endif%} | |||
{% endif %} | |||
</div> | |||
</a> | |||
</div> | |||
{% endmacro %} | |||
@@ -154,7 +182,7 @@ | |||
<div class="w-full border-b-2 border-black fade-right"> | |||
<div class="content w-full py-8 overflow-x-auto"> | |||
<div class="grid lg:grid-rows-[auto,auto,auto] grid-flow-col w-fit pr-40 " > | |||
<div class=" related hidden lg:block "> | |||
<div class="w-[4rem] shrink-0 lg:w-[12rem] text-center px-2 py-4 "> | |||
{% if show_number %} | |||
<p>{{loop.index}} / {{count}}</p> | |||
{% else %} | |||
@@ -275,7 +303,7 @@ | |||
<!DOCTYPE html> | |||
<html lang="en-gb"> | |||
<html lang="en"> | |||
<head> | |||
{{ moment.include_moment() }} | |||
@@ -292,6 +320,7 @@ | |||
// console.log(e) | |||
// }) | |||
// htmx.logAll() | |||
function base() { | |||
return { | |||
menuOpen: false, | |||
@@ -337,8 +366,8 @@ | |||
<body | |||
class="text-base overflow-y-scroll" | |||
x-data="base()" | |||
hx-boost="true" | |||
hx-boost="true" | |||
hx-select="#all" | |||
hx-target="#all" | |||
hx-swap="outerHTML" |
@@ -9,7 +9,10 @@ | |||
</div> | |||
</div> | |||
{{ view_switch() }} | |||
<div class="flex gap-4 items-center min-h-[2rem] mb-8 mb-8 border-b-2 border-black "> | |||
{{ view_switch() }} | |||
</div> | |||
{% if view == 'list' %} | |||
{% for resource in resources %} |
@@ -18,13 +18,15 @@ | |||
</div> | |||
</div> --> | |||
{% macro filter_dropdown(id, filter, plural='') %} | |||
<select name="{{ id }}" hx-trigger="change"> | |||
<select | |||
name="{{ id }}" | |||
> | |||
<option | |||
value="" {% if request.args.get(id, '' )=='' %} selected {% endif %} | |||
hx-get="{{ request.base_url }}?{% for key in request.args %}{% if key != id %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}" | |||
hx-push-url="true" | |||
value="" | |||
{% if request.args.get(id, '' )=='' %} selected {% endif %} | |||
> | |||
{% if plural != '' %} | |||
{{ plural }} | |||
@@ -34,9 +36,8 @@ | |||
</option> | |||
{% for thing in filter %} | |||
<option | |||
value="{{ thing[0] }}" {% if request.args.get(id)==thing[0]|string %} selected {% endif %} | |||
hx-get="{{ request.base_url }}?{{ id }}={{ thing[0] }}{% for key in request.args %}{% if key != id %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}" | |||
hx-push-url="true" | |||
value="{{ thing[0] }}" | |||
{% if request.args.get(id)==thing[0]|string %} selected {% endif %} | |||
> | |||
{{ thing[1] }} | |||
</option> | |||
@@ -45,10 +46,12 @@ | |||
{% endmacro%} | |||
{% macro filter_dropdown_nokey(id, filter, plural='') %} | |||
<select name="{{ id }}" hx-trigger="changed"> | |||
<option value="" {% if request.args.get(id, '' ) == '' %} selected {% endif %} | |||
hx-get="{{ request.base_url }}?{% for key in request.args %}{% if key != id %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}" | |||
hx-push-url="true" | |||
<select | |||
name="{{ id }}" | |||
> | |||
<option | |||
value="" | |||
{% if request.args.get(id, '' ) == '' %} selected {% endif %} | |||
> | |||
{% if plural != '' %} | |||
{{ plural }} | |||
@@ -57,9 +60,9 @@ | |||
{% endif%} | |||
</option> | |||
{% for thing in filter %} | |||
<option value="{{ thing }}" {% if request.args.get(id)==thing|string %} selected {% endif %} | |||
hx-get="{{ request.base_url }}?{{ id }}={{ thing }}{% for key in request.args %}{% if key != id %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}" | |||
hx-push-url="true" | |||
<option | |||
value="{{ thing }}" | |||
{% if request.args.get(id)==thing|string %} selected {% endif %} | |||
> | |||
{{ thing }} | |||
</option> | |||
@@ -67,7 +70,7 @@ | |||
</select> | |||
{% endmacro%} | |||
<div class="border-b-2 border-black grid lg:grid-cols-[52rem,30rem] content-start"> | |||
<div class="border-b-2 border-black grid lg:grid-cols-[52rem,30rem] content-start"> | |||
<div class="mx-2 lg:ml-[13rem] text my-8 meta lg:max-w-[30rem]"> | |||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ultricies egestas felis at dignissim. Morbi ut bibendum | |||
nisl. Integer ac sollicitudin risus. Vivamus et est est. Ut vitae lacus nec justo tincidunt interdum. Fusce sapien odio, | |||
@@ -75,51 +78,55 @@ | |||
</div> | |||
</div> | |||
<div class="" > | |||
<div | |||
id="resources" | |||
hx-boost="false" | |||
> | |||
{{ view_switch() }} | |||
<form | |||
action="{{request.base_url}}" | |||
method="GET" | |||
<div class="flex gap-8"> | |||
{% if practices_filter%} | |||
{{ filter_dropdown('practice', practices_filter, 'Practices') }} | |||
{% endif %} | |||
{% if year_filter %} | |||
{{ filter_dropdown_nokey('year', year_filter, 'Year') }} | |||
{% endif %} | |||
{% if typology_filter %} | |||
{{ filter_dropdown_nokey('typology', typology_filter, 'Typologies') }} | |||
{% endif %} | |||
{% if languages_filter %} | |||
{{ filter_dropdown_nokey('scriptingLanguage', languages_filter, 'Scripting languages') }} | |||
{% endif %} | |||
{% if licenses_filter %} | |||
{{ filter_dropdown_nokey('license', licenses_filter, 'Licenses') }} | |||
{% endif %} | |||
{% if status_filter %} | |||
{{ filter_dropdown_nokey('status', status_filter, 'Maintenance status') }} | |||
{% endif %} | |||
</div> | |||
hx-trigger="change" | |||
hx-push-url="true" | |||
<div> | |||
{% if view == 'list' %} | |||
{% for resource in resources %} | |||
{{ resource_list(resource, loop) }} | |||
{% endfor %} | |||
{% else %} | |||
{% for resource in resources %} | |||
{{ resource_with_related(resource, loop) }} | |||
{% endfor %} | |||
{% endif %} | |||
</div> | |||
</div> | |||
</div> | |||
> | |||
<input type="hidden" name="view" value="{{ view }}"> | |||
<div class="flex flex-wrap gap-4 items-center min-h-[2rem] mb-8 border-b-2 border-black "> | |||
{{ view_switch() }} | |||
{% if practices_filter%} | |||
{{ filter_dropdown('practice', practices_filter, 'Practices') }} | |||
{% endif %} | |||
{% if year_filter %} | |||
{{ filter_dropdown_nokey('year', year_filter, 'Year') }} | |||
{% endif %} | |||
{% if typology_filter %} | |||
{{ filter_dropdown_nokey('typology', typology_filter, 'Typologies') }} | |||
{% endif %} | |||
{% if languages_filter %} | |||
{{ filter_dropdown_nokey('scriptingLanguage', languages_filter, 'Scripting languages') }} | |||
{% endif %} | |||
{% if licenses_filter %} | |||
{{ filter_dropdown_nokey('license', licenses_filter, 'Licenses') }} | |||
{% endif %} | |||
{% if status_filter %} | |||
{{ filter_dropdown_nokey('status', status_filter, 'Maintenance status') }} | |||
{% endif %} | |||
<a href="{{ request.base_url }}?view={{ view }}">Reset</a> | |||
</div> | |||
<div> | |||
{% if view == 'list' %} | |||
{% for resource in resources %} | |||
{{ resource_list(resource, loop) }} | |||
{% endfor %} | |||
{% else %} | |||
{% for resource in resources %} | |||
{{ resource_with_related(resource, loop) }} | |||
{% endfor %} | |||
{% endif %} | |||
</div> | |||
</form> | |||
{% endblock %} |