Compare commits

...
18 Commits
Author SHA1 Message Date
Superredstone 1136a3874f docs: improve commands readability 2026-10-01 21:44:34 +02:00
Superredstone ec6a3401a6 feat(portfolio): add dark_text field to project tags 2026-10-01 21:40:02 +02:00
Superredstone 2d2e41a026 feat(portfolio): add spinner to project search 2026-10-01 21:36:51 +02:00
Superredstone 553f8be7b4 feat(portfolio): add no result found on projects search 2026-10-01 21:29:21 +02:00
Superredstone 9a9eca8946 chore: update dependencies 2026-10-01 21:26:17 +02:00
Superredstone d19c23f2af chore(just): add command to update dependencies 2026-10-01 21:25:31 +02:00
Superredstone 6091750d77 feat(admin): change project tag edit to filter_horizontal 2026-10-01 21:14:07 +02:00
Superredstone 908675689d feat(admin): change short_description to TextField instead of CharField 2026-10-01 21:02:23 +02:00
Superredstone 869006d189 fix: footer not staying at the bottom of the page 2026-10-01 15:50:34 +02:00
Superredstone 4a43bc5119 fix: navbar not being responsive 2026-10-01 15:47:00 +02:00
Superredstone 0c6b31e637 fix: remove warning for tabler js and css file 2026-09-19 09:58:52 +02:00
Superredstone 83443e11cc fix: project_list margin 2026-09-16 18:09:10 +02:00
Superredstone c8cf7ea7cd feat(portfolio): add tag search to projects 2026-09-16 17:48:04 +02:00
Superredstone f0888c4168 feat(portfolio): add project search 2026-09-16 17:45:08 +02:00
Superredstone c2e5f9a3a2 feat(portfolio): add project tags 2026-09-16 17:31:04 +02:00
Superredstone 6a4e6ba9c5 feat(admin): improved list display for some models 2026-09-15 19:56:10 +02:00
Superredstone f54c4efb1d feat(portfolio): add company color 2026-09-15 19:50:36 +02:00
Superredstone 02568054f1 break(portfolio): remove redundant uploads folder since media is set 2026-09-15 19:45:27 +02:00
23 changed files with 876 additions and 122 deletions
+19
View File
@@ -0,0 +1,19 @@
tabler_dir := "static/tabler/"
css:
npx @tailwindcss/cli -i ./src/input.css -o ./dist/tailwind.css
css-nix:
nix run nixpkgs#tailwindcss -- -i ./static/css/input.css -o ./static/css/style.css -c tailwind.config.js
update-dependencies: update-tabler update-htmx
update-htmx:
wget -N -P static/htmx/ https://cdn.jsdelivr.net/npm/htmx.org@latest/dist/htmx.min.js
update-tabler:
wget -N -P {{tabler_dir}} https://cdn.jsdelivr.net/npm/@tabler/core@latest/dist/css/tabler.min.css
wget -N -P {{tabler_dir}} https://cdn.jsdelivr.net/npm/@tabler/core@latest/dist/css/tabler.min.css.map
wget -N -P {{tabler_dir}} https://cdn.jsdelivr.net/npm/@tabler/core@latest/dist/js/tabler.min.js
wget -N -P {{tabler_dir}} https://cdn.jsdelivr.net/npm/@tabler/core@latest/dist/js/tabler.min.js.map
+6 -2
View File
@@ -2,10 +2,14 @@
## Docker ## Docker
Build container Build container
`docker build . -t patrickcanal.it` ```bash
docker build . -t patrickcanal.it
```
Run docker run Run docker run
`docker run -p 8000:8000 patrickcanal.it -v "$(pwd)/patrickcanal.it/local_settings.py:/app/patrickcanal.it/local_settings.py" -v "$(pwd)/patrickcanal.it/db.sqlite:/app/db.sqlite"` ```bash
docker run -p 8000:8000 patrickcanal.it -v "$(pwd)/patrickcanal.it/local_settings.py:/app/patrickcanal.it/local_settings.py" -v "$(pwd)/patrickcanal.it/db.sqlite:/app/db.sqlite"
```
## Required variables ## Required variables
### Portfolio ### Portfolio
+9 -22
View File
@@ -10,12 +10,12 @@
<link rel="stylesheet" href="{% static 'tabler/tabler.min.css' %}"> <link rel="stylesheet" href="{% static 'tabler/tabler.min.css' %}">
<link rel="stylesheet" href="{% static 'fontawesome-7/css/all.min.css' %}"> <link rel="stylesheet" href="{% static 'fontawesome-7/css/all.min.css' %}">
<script src="{% static 'tabler/tabler.min.js' %}"></script> <script src="{% static 'tabler/tabler.min.js' %}"></script>
<script src="{% static 'tailwindcss/tailwindcss.min.js' %}"></script>
<script src="{% static 'htmx/htmx.min.js' %}"></script> <script src="{% static 'htmx/htmx.min.js' %}"></script>
</head> </head>
<body class="d-flex flex-column"> <body>
<div class="d-flex flex-column min-vh-100">
<header class="navbar navbar-expand-md d-print-none"> <header class="navbar navbar-expand-md d-print-none">
<div class="container-xl d-flex justify-content-between"> <div class="container-xl">
<button class="navbar-toggler" <button class="navbar-toggler"
type="button" type="button"
data-bs-toggle="collapse" data-bs-toggle="collapse"
@@ -25,36 +25,22 @@
aria-label="Toggle navigation"> aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbar-menu">
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item {% if request.path == "/portfolio/" %}active{% endif %}"> <li class="nav-item {% if request.path == "/portfolio/" %}active{% endif %}">
<a class="nav-link" href="{% url 'index' %}"> <a class="nav-link" href="{% url 'portfolio' %}">
<span class="nav-link-icon"> <span class="nav-link-icon"><i class="fa-solid fa-home"></i></span>
<i class="fa-solid fa-house"></i>
</span>
<span class="nav-link-title">{% trans "Home" %}</span> <span class="nav-link-title">{% trans "Home" %}</span>
</a> </a>
</li> </li>
<li class="nav-item {% if "/portfolio/projects" in request.path %}active{% endif %}"> <li class="nav-item {% if "/portfolio/projects" in request.path %}active{% endif %}">
<a class="nav-link" href="{% url 'projects' %}"> <a class="nav-link" href="{% url 'projects' %}">
<span class="nav-link-icon"> <span class="nav-link-icon"><i class="fa-solid fa-folder-open"></i></span>
<i class="fa-solid fa-folder-open"></i>
</span>
<span class="nav-link-title">{% trans "Projects" %}</span> <span class="nav-link-title">{% trans "Projects" %}</span>
</a> </a>
</li> </li>
</ul> </ul>
{% if request.user.is_superuser %} </div>
<ul class="navbar-nav">
<li class="nav-item">
<a href="{% url 'admin:index' %}" class="nav-link">
<span class="nav-link-icon">
<i class="fa-solid fa-screwdriver-wrench"></i>
</span>
<span class="nav-link-title">{% trans "Admin" %}</span>
</a>
</li>
</ul>
{% endif %}
</div> </div>
</header> </header>
<main class="mb-2"> <main class="mb-2">
@@ -83,5 +69,6 @@
</div> </div>
</div> </div>
</footer> </footer>
</div>
</body> </body>
</html> </html>
+9 -3
View File
@@ -5,19 +5,25 @@ from portfolio import models
@admin.register(models.JobExperience) @admin.register(models.JobExperience)
class JobExperienceAdmin(admin.ModelAdmin): class JobExperienceAdmin(admin.ModelAdmin):
pass list_display = ["company", "position", "start", "end"]
@admin.register(models.JobTask) @admin.register(models.JobTask)
class JobTaskAdmin(admin.ModelAdmin): class JobTaskAdmin(admin.ModelAdmin):
pass list_display = ["job__company", "description", "job__start", "job__end"]
@admin.register(models.Company) @admin.register(models.Company)
class CompanyAdmin(admin.ModelAdmin): class CompanyAdmin(admin.ModelAdmin):
pass list_display = ["name", "location"]
@admin.register(models.Project) @admin.register(models.Project)
class ProjectAdmin(admin.ModelAdmin): class ProjectAdmin(admin.ModelAdmin):
list_display = ["name", "short_description"] list_display = ["name", "short_description"]
filter_horizontal = ["tags"]
@admin.register(models.ProjectTag)
class ProjectTagAdmin(admin.ModelAdmin):
list_display = ["name", "color"]
@@ -0,0 +1,23 @@
# Generated by Django 6.1.1 on 2026-09-15 17:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('portfolio', '0003_project_alter_jobtask_job'),
]
operations = [
migrations.AddField(
model_name='company',
name='color',
field=models.CharField(default='000000', max_length=6, verbose_name='Color (hex)'),
),
migrations.AlterField(
model_name='company',
name='logo',
field=models.FileField(upload_to='portfolio/companies_logo/'),
),
]
@@ -0,0 +1,26 @@
# Generated by Django 6.1.1 on 2026-09-15 18:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('portfolio', '0004_company_color_alter_company_logo'),
]
operations = [
migrations.CreateModel(
name='ProjectTag',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=25, verbose_name='Name')),
('color', models.CharField(default='000000', max_length=6, verbose_name='Color (hex)')),
],
),
migrations.AddField(
model_name='project',
name='tags',
field=models.ManyToManyField(blank=True, related_name='projects', to='portfolio.projecttag', verbose_name='Tags'),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 6.1.1 on 2026-10-01 19:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('portfolio', '0005_projecttag_project_tags'),
]
operations = [
migrations.AlterField(
model_name='project',
name='short_description',
field=models.TextField(max_length=512, verbose_name='Short description'),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 6.1.1 on 2026-10-01 19:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('portfolio', '0006_alter_project_short_description'),
]
operations = [
migrations.AddField(
model_name='projecttag',
name='dark_text',
field=models.BooleanField(default=False, verbose_name='Dark text'),
),
]
+35 -2
View File
@@ -9,7 +9,14 @@ class Company(models.Model):
location = models.CharField( location = models.CharField(
verbose_name=_("Location"), max_length=255, blank=False, null=False verbose_name=_("Location"), max_length=255, blank=False, null=False
) )
logo = models.FileField(upload_to="uploads/portfolio/companies_logo/") color = models.CharField(
verbose_name=_("Color (hex)"),
max_length=6,
null=False,
blank=False,
default="000000",
)
logo = models.FileField(upload_to="portfolio/companies_logo/")
def __str__(self): def __str__(self):
return self.name return self.name
@@ -50,11 +57,37 @@ class JobTask(models.Model):
return self.job.__str__() return self.job.__str__()
class ProjectTag(models.Model):
name = models.CharField(
verbose_name=_("Name"), max_length=25, blank=False, null=False
)
color = models.CharField(
verbose_name=_("Color (hex)"),
max_length=6,
null=False,
blank=False,
default="000000",
)
dark_text = models.BooleanField(verbose_name=_("Dark text"), default=False)
def __str__(self):
return self.name
class Project(models.Model): class Project(models.Model):
name = models.CharField( name = models.CharField(
verbose_name=_("Name"), max_length=256, null=False, blank=False verbose_name=_("Name"), max_length=256, null=False, blank=False
) )
short_description = models.CharField( short_description = models.TextField(
verbose_name=_("Short description"), max_length=512, blank=False, null=False verbose_name=_("Short description"), max_length=512, blank=False, null=False
) )
url = models.URLField(verbose_name=_("URL"), blank=True, null=False) url = models.URLField(verbose_name=_("URL"), blank=True, null=False)
tags = models.ManyToManyField(
ProjectTag,
verbose_name=_("Tags"),
blank=True,
related_name="projects",
)
def __str__(self):
return self.name
+5 -5
View File
@@ -38,7 +38,7 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="card h-full"> <div class="card h-full">
<div class="card-body d-flex align-items-center flex-column"> <div class="card-body d-flex align-items-center flex-column">
<div class="w-24 h-30"> <div class="tw-24 th-30">
<img src="{% static 'images/nix-logo.svg' %}" alt="NixOS logo"> <img src="{% static 'images/nix-logo.svg' %}" alt="NixOS logo">
</div> </div>
<b class="fs-2">{% trans "NixOS enthusiast" %}</b> <b class="fs-2">{% trans "NixOS enthusiast" %}</b>
@@ -53,7 +53,7 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="card h-full"> <div class="card h-full">
<div class="card-body d-flex align-items-center flex-column"> <div class="card-body d-flex align-items-center flex-column">
<div class="w-24 h-30"> <div class="tw-24 th-30">
<img src="{% static 'images/foss-logo.webp' %}" alt="FOSS logo"> <img src="{% static 'images/foss-logo.webp' %}" alt="FOSS logo">
</div> </div>
<b class="fs-2">{% trans "FOSS lover" %}</b> <b class="fs-2">{% trans "FOSS lover" %}</b>
@@ -69,8 +69,8 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="card h-full"> <div class="card h-full">
<div class="card-body d-flex align-items-center flex-column"> <div class="card-body d-flex align-items-center flex-column">
<div class="w-24 h-30 text-5xl pt-4"> <div class="tw-24 th-30 ttext-5xl pt-4">
<i class="fa-solid fa-server fa-2xl"></i> <i class="fa-solid fa-server"></i>
</div> </div>
<b class="fs-2">{% trans "Homelab maintainer" %}</b> <b class="fs-2">{% trans "Homelab maintainer" %}</b>
<p class="text-secondary text-center mt-2"> <p class="text-secondary text-center mt-2">
@@ -97,7 +97,7 @@
<p class="text-primary mb-0">{{ je.start }} - {% if je.end %}{{ je.end }}{% else %}{% trans "today" %}{% endif %}</p> <p class="text-primary mb-0">{{ je.start }} - {% if je.end %}{{ je.end }}{% else %}{% trans "today" %}{% endif %}</p>
<h2 class="fs-2">{{ je.position }}</h2> <h2 class="fs-2">{{ je.position }}</h2>
<div> <div>
<div class="text-danger">{{ je.company.name }}</div> <div style="color: #{{ je.company.color }};">{{ je.company.name }}</div>
<div class="text-secondary">{{ je.company.location }}</div> <div class="text-secondary">{{ je.company.location }}</div>
<div class="mt-2 text-white"> <div class="mt-2 text-white">
{% for jt in je.job_tasks.all %} {% for jt in je.job_tasks.all %}
+17 -21
View File
@@ -1,29 +1,25 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% block content %} {% block content %}
<div class="container mt-4"> <div class="container mt-2 mt-md-4">
<div class="row row-deck row-cards"> <form class="mb-2 mb-md-4">
{% for project in object_list %} <div class="form-floating">
<div class="col-md-4"> <input type="text"
{% if project.url %} class="form-control"
<a class="card card-link card-link-pop" id="floating-name"
href="{{ project.url }}" placeholder=""
target="_blank"> name="query"
<div class="card-body"> autocomplete="off"
<h4>{{ project.name }}</h4> hx-target="#projects"
<p>{{ project.short_description }}</p> hx-get="{% url 'projects-query' %}"
hx-trigger="load, input, delay:200ms" />
<label for="floating-name">{% trans "Search" %}</label>
</div> </div>
</a> </form>
{% else %} <div id="projects">
<div class="card"> <div class="d-flex justify-content-center w-full">
<div class="card-body"> <div id="spinner" class="fs-1 spinner-border"></div>
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
</div> </div>
</div> </div>
{% endif %}
</div>
{% endfor %}
</div>
</div> </div>
{% endblock %} {% endblock %}
@@ -0,0 +1,39 @@
{% load i18n %}
<div class="row row-deck row-cards">
{% if object_list.count == 0 %}
<p>{% trans "No projects found" %}</p>
{% endif %}
{% for project in object_list %}
<div class="col-md-4">
{% if project.url %}
<a class="card card-link card-link-pop"
href="{{ project.url }}"
target="_blank">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
<div>
{% for t in project.tags.all %}
<div class="badge {% if t.dark_text %}text-black{% else %}text-white{% endif %} fs-5"
style="background-color: #{{ t.color }}">{{ t }}</div>
{% endfor %}
</div>
</div>
</a>
{% else %}
<div class="card">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
<div>
{% for t in project.tags.all %}
<div class="badge text-white fs-5"
style="background-color: #{{ t.color }}">{{ t }}</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
+1
View File
@@ -5,6 +5,7 @@ from portfolio import views
urlpatterns = [ urlpatterns = [
path("", views.PortfolioView.as_view(), name="portfolio"), path("", views.PortfolioView.as_view(), name="portfolio"),
path("projects/", views.ProjectList.as_view(), name="projects"), path("projects/", views.ProjectList.as_view(), name="projects"),
path("projects/query/", views.ProjectListQuery.as_view(), name="projects-query"),
path("contact/", views.ContactSend.as_view(), name="contact"), path("contact/", views.ContactSend.as_view(), name="contact"),
path("company/<int:pk>/logo/", views.CompanyLogo.as_view(), name="company-logo"), path("company/<int:pk>/logo/", views.CompanyLogo.as_view(), name="company-logo"),
] ]
+19 -2
View File
@@ -1,4 +1,5 @@
from django.conf import settings from django.conf import settings
from django.db.models import Q
from django.http.response import FileResponse, HttpResponseBadRequest from django.http.response import FileResponse, HttpResponseBadRequest
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import DetailView, ListView, TemplateView from django.views.generic import DetailView, ListView, TemplateView
@@ -18,9 +19,8 @@ class PortfolioView(TemplateView):
} }
class ProjectList(ListView): class ProjectList(TemplateView):
template_name = "project_list.html" template_name = "project_list.html"
model = models.Project
class ContactSend(TemplateView): class ContactSend(TemplateView):
@@ -49,3 +49,20 @@ class CompanyLogo(DetailView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
company = self.get_object() company = self.get_object()
return FileResponse(company.logo) return FileResponse(company.logo)
class ProjectListQuery(ListView):
template_name = "project_list_query.html"
model = models.Project
def get_queryset(self):
query = self.request.GET.get("query")
if not query:
return super().get_queryset()
return (
super()
.get_queryset()
.filter(Q(name__contains=query) | Q(tags__name__contains=query))
.distinct()
)
+3
View File
@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
+561 -4
View File
@@ -1,7 +1,564 @@
:root { *, ::before, ::after {
margin: 0px; --tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
} }
html { ::backdrop {
margin: 0px!important; --tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
}
/*
! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
*/
/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
*,
::before,
::after {
box-sizing: border-box;
/* 1 */
border-width: 0;
/* 2 */
border-style: solid;
/* 2 */
border-color: #e5e7eb;
/* 2 */
}
::before,
::after {
--tw-content: '';
}
/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default.
7. Disable tap highlights on iOS
*/
html,
:host {
line-height: 1.5;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-moz-tab-size: 4;
/* 3 */
-o-tab-size: 4;
tab-size: 4;
/* 3 */
font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
/* 4 */
font-feature-settings: normal;
/* 5 */
font-variation-settings: normal;
/* 6 */
-webkit-tap-highlight-color: transparent;
/* 7 */
}
/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/
body {
margin: 0;
/* 1 */
line-height: inherit;
/* 2 */
}
/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/
hr {
height: 0;
/* 1 */
color: inherit;
/* 2 */
border-top-width: 1px;
/* 3 */
}
/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
/*
Remove the default font size and weight for headings.
*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/*
Reset links to optimize for opt-in styling instead of opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/*
Add the correct font weight in Edge and Safari.
*/
b,
strong {
font-weight: bolder;
}
/*
1. Use the user's configured `mono` font-family by default.
2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 1 */
font-feature-settings: normal;
/* 2 */
font-variation-settings: normal;
/* 3 */
font-size: 1em;
/* 4 */
}
/*
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/
table {
text-indent: 0;
/* 1 */
border-color: inherit;
/* 2 */
border-collapse: collapse;
/* 3 */
}
/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
/* 1 */
font-feature-settings: inherit;
/* 1 */
font-variation-settings: inherit;
/* 1 */
font-size: 100%;
/* 1 */
font-weight: inherit;
/* 1 */
line-height: inherit;
/* 1 */
letter-spacing: inherit;
/* 1 */
color: inherit;
/* 1 */
margin: 0;
/* 2 */
padding: 0;
/* 3 */
}
/*
Remove the inheritance of text transform in Edge and Firefox.
*/
button,
select {
text-transform: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button styles.
*/
button,
input:where([type='button']),
input:where([type='reset']),
input:where([type='submit']) {
-webkit-appearance: button;
/* 1 */
background-color: transparent;
/* 2 */
background-image: none;
/* 2 */
}
/*
Use the modern Firefox focus style for all focusable elements.
*/
:-moz-focusring {
outline: auto;
}
/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/
:-moz-ui-invalid {
box-shadow: none;
}
/*
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/*
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type='search'] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
/* 2 */
}
/*
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button;
/* 1 */
font: inherit;
/* 2 */
}
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
/*
Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
fieldset {
margin: 0;
padding: 0;
}
legend {
padding: 0;
}
ol,
ul,
menu {
list-style: none;
margin: 0;
padding: 0;
}
/*
Reset default styling for dialogs.
*/
dialog {
padding: 0;
}
/*
Prevent resizing textareas horizontally by default.
*/
textarea {
resize: vertical;
}
/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/
input::-moz-placeholder, textarea::-moz-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
input::placeholder,
textarea::placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
/*
Set the default cursor for buttons.
*/
button,
[role="button"] {
cursor: pointer;
}
/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
cursor: default;
}
/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
This can trigger a poorly considered lint error in some tools but is included by design.
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
/* 1 */
vertical-align: middle;
/* 2 */
}
/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/
img,
video {
max-width: 100%;
height: auto;
}
/* Make elements with the HTML hidden attribute stay hidden by default */
[hidden]:where(:not([hidden="until-found"])) {
display: none;
}
.tw-24 {
width: 6rem;
}
.ttext-5xl {
font-size: 3rem;
line-height: 1;
} }
+1 -1
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12
View File
@@ -0,0 +1,12 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
prefix: 't',
content: [
"./**/templates/**/*.html",
],
theme: {
extend: {},
},
plugins: [],
}