basic order page

This commit is contained in:
Laetitia Getti 2023-05-12 16:19:52 +02:00
parent 90dfb1c543
commit 42380cd17f
11 changed files with 279 additions and 157 deletions

View file

@ -1,29 +1,23 @@
from django import forms
from django.contrib.auth import get_user_model
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django.db import IntegrityError
from la_chariotte.order.models import GroupedOrder, Item
from django.forms import ( # isort:skip
CharField,
DateInput,
DateTimeInput,
ModelForm,
Textarea,
TextInput,
)
class GroupedOrderForm(ModelForm):
class GroupedOrderForm(forms.ModelForm):
class Meta:
model = GroupedOrder
fields = ["name", "deadline", "delivery_date", "place", "description"]
widgets = {
"name": TextInput(attrs={"placeholder": "ex : Des oranges pour Noël"}),
"deadline": DateTimeInput(attrs={"placeholder": "JJ/MM/AAAA HH:MM"}),
"delivery_date": DateInput(attrs={"placeholder": "JJ/MM/AAAA"}),
"place": TextInput(attrs={"placeholder": "(facultatif)"}),
"description": Textarea(
"name": forms.TextInput(
attrs={"placeholder": "ex : Des oranges pour Noël"}
),
"deadline": forms.DateTimeInput(attrs={"placeholder": "JJ/MM/AAAA HH:MM"}),
"delivery_date": forms.DateInput(attrs={"placeholder": "JJ/MM/AAAA"}),
"place": forms.TextInput(attrs={"placeholder": "(facultatif)"}),
"description": forms.Textarea(
attrs={
"placeholder": "Plus d'infos sur la commande groupée ? (facultatif)"
}
@ -56,7 +50,7 @@ class GroupedOrderForm(ModelForm):
return cleaned_data
class ItemCreateForm(ModelForm):
class ItemCreateForm(forms.ModelForm):
class Meta:
model = Item
fields = ["name", "price", "max_limit"]

View file

@ -0,0 +1,49 @@
# Generated by Django 4.2 on 2023-05-12 09:48
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("order", "0016_alter_groupedorder_description"),
]
operations = [
migrations.CreateModel(
name="OrderAuthor",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("first_name", models.CharField(verbose_name="Prénom")),
("last_name", models.CharField(verbose_name="Nom")),
(
"phone",
models.CharField(
help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin",
verbose_name="Numéro de téléphone",
),
),
(
"email",
models.CharField(
verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin"
),
),
],
),
migrations.AlterField(
model_name="order",
name="author",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="order.orderauthor"
),
),
]

View file

@ -9,7 +9,7 @@ from la_chariotte.settings import AUTH_USER_MODEL
class GroupedOrder(models.Model):
name = models.CharField(
max_length=100, null=True, verbose_name="Titre de la commande"
) # optionnal
)
orga = models.ForeignKey(
AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Organisateur·ice"
)
@ -55,13 +55,29 @@ class GroupedOrder(models.Model):
)
class OrderAuthor(models.Model):
"""Created when a user orders without having an account - or when a user creates an account"""
# TODO faire le lien avec CustomUser (CustomUser hérite de OrderAuthor), pour ensuite préremplir quand on est connecté·e
first_name = models.CharField(verbose_name="Prénom")
last_name = models.CharField(verbose_name="Nom")
phone = models.CharField(
verbose_name="Numéro de téléphone",
help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin",
)
email = models.CharField(
verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin"
)
def __str__(self): # pragma: no cover
return f"{self.first_name} {self.last_name}"
class Order(models.Model):
grouped_order = models.ForeignKey(
GroupedOrder, on_delete=models.CASCADE, related_name="order_set"
)
author = models.CharField(
max_length=100, verbose_name="Personne qui passe la commande"
) # a changer, utiliser ForeignKey de user
author = models.ForeignKey(OrderAuthor, on_delete=models.CASCADE)
def __str__(self): # pragma: no cover
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
@ -85,7 +101,7 @@ class Item(models.Model):
class OrderedItem(models.Model):
"""Item in one specific Order, and its number"""
"""Item in one specific Order, and the number of articles"""
nb = models.PositiveSmallIntegerField(default=0) # works up to 32767
order = models.ForeignKey(

View file

@ -26,15 +26,15 @@
<form method="post" action="{{ create_item_url }}">
{% csrf_token %}
<td><input name="name" maxlength="100" placeholder="Nom du produit" required></input></td>
<td><input name="price" maxlength="50" placeholder="5,40" required></input></td>
<td><input name="max_limit" maxlength="50" placeholder="42"></input></td>
<td><input name="price" size="2" placeholder="5,40" required></input></td>
<td><input name="max_limit" size="2" placeholder="42"></input></td>
<td><button type="submit" class="button is-primary">Ajouter</button></td>
</tr>
{% for item in item_list %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.price }}</td>
<td>{{ item.max_limit }}</td>
<td>{% if item.max_limit %}{{ item.max_limit }}{% else %}---{% endif %}</td>
<td>Supprimer (pas possible pour l'instant)</td>
</tr>
{% endfor %}

View file

@ -5,42 +5,84 @@
{% block content_title %}{{ grouped_order }} : commander{% endblock %}
{% block content %}
<p>{{ grouped_order }}
<p>Organisateur·ice : {{ grouped_order.orga }}</p>
<p>Date de livraison : {{ grouped_order.delivery_date }}</p>
<p>Date limite de commande : {{ grouped_order.deadline }}</p>
<div class="box">
<div class="columns">
<div class="column is-8">
<p class="title">{{ grouped_order }}</p>
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %}
{% if not user.is_authenticated %}
<p>Vous êtes l'organisateur·ice de cette commande groupée ?
<p><span class="has-text-dark is-italic">Vous êtes l'organisateur·ice ?</span>
<a href="{% url 'order:grouped_order_overview' grouped_order.id %}">
Connectez-vous pour accéder à la page de gestion</a>
</p>
{% endif %}
{% if user == grouped_order.orga %}
<a href="{% url 'order:grouped_order_overview' grouped_order.id %}">
Page de gestion de la comande groupée</a>
</div>
<div class="column">
{% if grouped_order.place %}
<p>Lieu : {{ grouped_order.place }}</p>
{% endif %}
<p>Date de livraison : {{ grouped_order.delivery_date }}</p>
<p>Date limite de commande : {{ grouped_order.deadline }}</p>
{% if user == grouped_order.orga %}
<a class="button is-primary" href="{% url 'order:grouped_order_overview' grouped_order.id %}">
Gestion de la commande groupée</a>
{% else %}
<p>Organisateur·ice : {{ grouped_order.orga }}</p>
<a class="button is-light" href="mailto:{{ grouped_order.orga.username }}">Contacter l'organisateur·ice</a>
{% endif %}
</div>
</div>
</div>
<p>les produits disponibles pour cette commande groupée : </p>
<ul>
<div class="box">
{% if grouped_order.item_set.first %}
<p class="title">Commander</p>
<form method="post" action="{% url 'order:order' grouped_order.id %}">
<table class="table">
<thead>
<tr>
<th>Produit</th>
<th>Prix unitaire</th>
<th>Quantité</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{% for item in grouped_order.item_set.all %}
<li>
{{ item }}
</li>
{% endfor %}
</ul>
<form action="{% url 'order:order' grouped_order.id %}" method="post">
<tr>
{% csrf_token %}
<fieldset>
<legend><h1>Commander</h1></legend>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
{% for item in grouped_order.item_set.all %}
<input type="radio" name="item" id="item{{ forloop.counter }}" value="{{ item.id }}">
<label for="item{{ forloop.counter }}">{{ item }}</label><br>
<td>{{ item.name }}</td>
<td>{{ item.price }} €</td>
<td><input name="quantity_{{ item.id }}" size="2" value="0"></input></td>
<td>Total pour ce produit</td>
</tr>
{% endfor %}
</fieldset>
<input type="submit" value="Order">
</tbody>
</table>
<br>
<p class="title">Vos informations</p>
<div class="columns">
<div class="column">
<p><label for="first_name">Prénom : </label>
<input id="first_name" type="text" name="first_name" required></p>
<p><label for="first_name">Nom : </label>
<input id="last_name" type="text" name="last_name" required></p>
</div>
<div class="column">
<p><label for="phone">Numéro de téléphone :</label>
<input id="phone" type="text" name="phone" required></p>
<p><label for="email">Adresse mail : </label>
<input id="email" type="text" name="email" required></p>
</div>
</div>
<div class="buttons">
<button type="submit" value="Order" class="button is-primary">Commander</button>
</div>
</form>
{% else %}
<p>Il n'y a pas de produits disponibles dans cette commande !</p>
{% endif %}
</div>
{% endblock %}

View file

@ -24,7 +24,7 @@
<ul>
{% for order in grouped_order.order_set.all %}
<li>
{{ order }} : {{ order.ordered_items.count }} produits commandés
{{ order }} : [prix total]
</li>
{% endfor %}
</ul>

View file

@ -5,7 +5,7 @@ from django.contrib import auth
from django.urls import reverse
from django.utils import timezone
from la_chariotte.order.models import GroupedOrder, Item, Order
from la_chariotte.order.models import GroupedOrder, Item, Order, OrderAuthor
pytestmark = pytest.mark.django_db
@ -205,7 +205,7 @@ class TestGroupedOrderIndexView:
class TestGroupedOrderDetailView:
def test_order_item(self, client, other_user):
"""
From the OrderDetailView, we order an item using the order form, and it creates an Order woth and Ordered_item inside
From the OrderDetailView, we order an item using the order form, and it creates an Order with an Ordered_item inside
"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
@ -214,7 +214,10 @@ class TestGroupedOrderDetailView:
orga_user=other_user,
)
item = Item.objects.create(
name="test item", grouped_order=grouped_order, price=1
name="test item 1", grouped_order=grouped_order, price=1
)
item2 = Item.objects.create(
name="test item 2", grouped_order=grouped_order, price=5
)
detail_url = reverse(
"order:grouped_order_detail",
@ -227,6 +230,7 @@ class TestGroupedOrderDetailView:
assert "test item" in response.content.decode()
assert "gr order test" in response.content.decode()
assert item.ordered_nb == 0
assert item2.ordered_nb == 0
order_url = reverse(
"order:order",
kwargs={
@ -236,7 +240,12 @@ class TestGroupedOrderDetailView:
response = client.post(
order_url,
{
"item": item.pk,
f"quantity_{item.pk}": 4,
f"quantity_{item2.pk}": 1,
"first_name": "Prénom",
"last_name": "Nom",
"phone": "0645632569",
"email": "test@mail.fr",
},
)
assert response.status_code == 302
@ -247,15 +256,18 @@ class TestGroupedOrderDetailView:
},
)
item.refresh_from_db()
assert item.ordered_nb == 1
item2.refresh_from_db()
assert OrderAuthor.objects.first().first_name == "Prénom"
assert item.ordered_nb == 4
assert item2.ordered_nb == 1
order = Order.objects.first()
assert order.ordered_items.count() == 1
assert order.ordered_items.count() == 2
class TestGroupedOrderOrgaView:
class TestGroupedOrderOverview:
def test_user_not_logged_redirect(self, client, other_user):
"""
A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view
A user that is not logged cannot see the GroupedOrderOverview. They get redirected to the login view
"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
@ -284,7 +296,7 @@ class TestGroupedOrderOrgaView:
def test_user_not_orga_redirect(self, client_log, other_user):
"""
A user that is not orga cannot see the GroupedOrderOrgaView.
A user that is not orga cannot see the GroupedOrderOverview.
They get a 403 forbidden error
"""
grouped_order = create_grouped_order(
@ -358,7 +370,7 @@ class TestGroupedOrderAddItemsView:
def test_get_manage_items__anonymous_user(self, client, other_user):
"""
A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view
A user that is not logged cannot see the GroupedOrderOverview. They get redirected to the login view
"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,

View file

@ -10,7 +10,7 @@ urlpatterns = [
),
path(
"<int:pk>/gerer",
views.GroupedOrderOrgaView.as_view(),
views.GroupedOrderOverview.as_view(),
name="grouped_order_overview",
),
path("<int:grouped_order_id>/commander/", views.order, name="order"),

View file

@ -6,7 +6,7 @@ from django.utils import timezone
from django.views import generic
from .forms import GroupedOrderForm, ItemCreateForm
from .models import GroupedOrder, Item, Order, OrderedItem
from .models import GroupedOrder, Item, Order, OrderAuthor, OrderedItem
class IndexView(LoginRequiredMixin, generic.ListView):
@ -59,7 +59,7 @@ class GroupedOrderDetailView(generic.DetailView):
context_object_name = "grouped_order"
class GroupedOrderOrgaView(UserPassesTestMixin, generic.DetailView):
class GroupedOrderOverview(UserPassesTestMixin, generic.DetailView):
"""Overview of a grouped order, for the organizer"""
model = GroupedOrder
@ -124,12 +124,19 @@ class ItemCreateView(UserPassesTestMixin, generic.CreateView):
return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user
def order(
request, grouped_order_id
): # crée une commande (order) pour cette commande groupée, avec l'item selectionné dedans
def order(request, grouped_order_id):
"""Creates an AnonymousUser, and an Order for this GroupedOrder, with related OrderedItems"""
grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id)
try:
selected_item = grouped_order.item_set.get(pk=request.POST["item"])
# get a dict with (quantity_{{item_id}}:{{quantity}})
orders_dict = {
k: v for k, v in request.POST.items() if k.startswith("quantity")
}
first_name = request.POST["first_name"]
last_name = request.POST["last_name"]
phone = request.POST["phone"]
email = request.POST["email"]
# selected_item = grouped_order.item_set.get(pk=request.POST["item"])
except (KeyError, Item.DoesNotExist):
# Redisplay the order form for this grouped order.
return render(
@ -137,14 +144,16 @@ def order(
"order/grouped_order_detail.html",
{
"grouped_order": grouped_order,
"error_message": "You didn't select an item.",
"error_message": "Veuillez remplir tous les champs",
},
)
else:
order = Order.objects.create(author="Auteur teur", grouped_order=grouped_order)
OrderedItem.objects.create(nb=1, order=order, item=selected_item)
compute_ordered_nb(selected_item)
selected_item.save()
author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name)
order = Order.objects.create(author=author, grouped_order=grouped_order)
for k, v in orders_dict.items():
item = grouped_order.item_set.get(pk=k.split("_")[1])
OrderedItem.objects.create(nb=v, order=order, item=item)
compute_ordered_nb(item)
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
@ -154,7 +163,7 @@ def order(
def compute_ordered_nb(item):
"""Calcule le nombre de produits de ce type commandés (pour cette commande groupée)"""
"""Computes the number of ordered articles for this item in this grouped order"""
ordered_nb = 0
for order in item.orders.all():
ordered_nb += order.nb

View file

@ -1054,12 +1054,12 @@ a.box:active {
color: #3850b7;
}
.button.is-info {
background-color: #A52951;
background-color: #e9b049;
border-color: transparent;
color: #fff;
}
.button.is-info:hover, .button.is-info.is-hovered {
background-color: #9b264c;
background-color: #e8ab3e;
border-color: transparent;
color: #fff;
}
@ -1068,21 +1068,21 @@ a.box:active {
color: #fff;
}
.button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25);
box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
}
.button.is-info:active, .button.is-info.is-active {
background-color: #912447;
background-color: #e6a632;
border-color: transparent;
color: #fff;
}
.button.is-info[disabled], fieldset[disabled] .button.is-info {
background-color: #A52951;
border-color: #A52951;
background-color: #e9b049;
border-color: #e9b049;
box-shadow: none;
}
.button.is-info.is-inverted {
background-color: #fff;
color: #A52951;
color: #e9b049;
}
.button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered {
background-color: #f2f2f2;
@ -1091,32 +1091,32 @@ a.box:active {
background-color: #fff;
border-color: transparent;
box-shadow: none;
color: #A52951;
color: #e9b049;
}
.button.is-info.is-loading::after {
border-color: transparent transparent #fff #fff !important;
}
.button.is-info.is-outlined {
background-color: transparent;
border-color: #A52951;
color: #A52951;
border-color: #e9b049;
color: #e9b049;
}
.button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused {
background-color: #A52951;
border-color: #A52951;
background-color: #e9b049;
border-color: #e9b049;
color: #fff;
}
.button.is-info.is-outlined.is-loading::after {
border-color: transparent transparent #A52951 #A52951 !important;
border-color: transparent transparent #e9b049 #e9b049 !important;
}
.button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after {
border-color: transparent transparent #fff #fff !important;
}
.button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined {
background-color: transparent;
border-color: #A52951;
border-color: #e9b049;
box-shadow: none;
color: #A52951;
color: #e9b049;
}
.button.is-info.is-inverted.is-outlined {
background-color: transparent;
@ -1125,10 +1125,10 @@ a.box:active {
}
.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused {
background-color: #fff;
color: #A52951;
color: #e9b049;
}
.button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after {
border-color: transparent transparent #A52951 #A52951 !important;
border-color: transparent transparent #e9b049 #e9b049 !important;
}
.button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined {
background-color: transparent;
@ -1137,18 +1137,18 @@ a.box:active {
color: #fff;
}
.button.is-info.is-light {
background-color: #fbeff3;
color: #cc3364;
background-color: #fdf7ed;
color: #845b10;
}
.button.is-info.is-light:hover, .button.is-info.is-light.is-hovered {
background-color: #f8e4eb;
background-color: #fbf2e1;
border-color: transparent;
color: #cc3364;
color: #845b10;
}
.button.is-info.is-light:active, .button.is-info.is-light.is-active {
background-color: #f6dae3;
background-color: #faedd6;
border-color: transparent;
color: #cc3364;
color: #845b10;
}
.button.is-success {
background-color: hsl(153, 53%, 53%);
@ -2011,12 +2011,12 @@ div.icon-text {
color: #3850b7;
}
.notification.is-info {
background-color: #A52951;
background-color: #e9b049;
color: #fff;
}
.notification.is-info.is-light {
background-color: #fbeff3;
color: #cc3364;
background-color: #fdf7ed;
color: #845b10;
}
.notification.is-success {
background-color: hsl(153, 53%, 53%);
@ -2140,16 +2140,16 @@ div.icon-text {
background-image: linear-gradient(to right, hsl(229, 53%, 53%) 30%, hsl(0, 0%, 93%) 30%);
}
.progress.is-info::-webkit-progress-value {
background-color: #A52951;
background-color: #e9b049;
}
.progress.is-info::-moz-progress-bar {
background-color: #A52951;
background-color: #e9b049;
}
.progress.is-info::-ms-fill {
background-color: #A52951;
background-color: #e9b049;
}
.progress.is-info:indeterminate {
background-image: linear-gradient(to right, #A52951 30%, hsl(0, 0%, 93%) 30%);
background-image: linear-gradient(to right, #e9b049 30%, hsl(0, 0%, 93%) 30%);
}
.progress.is-success::-webkit-progress-value {
background-color: hsl(153, 53%, 53%);
@ -2274,8 +2274,8 @@ div.icon-text {
}
.table td.is-info,
.table th.is-info {
background-color: #A52951;
border-color: #A52951;
background-color: #e9b049;
border-color: #e9b049;
color: #fff;
}
.table td.is-success,
@ -2497,12 +2497,12 @@ div.icon-text {
color: #3850b7;
}
.tag:not(body).is-info {
background-color: #A52951;
background-color: #e9b049;
color: #fff;
}
.tag:not(body).is-info.is-light {
background-color: #fbeff3;
color: #cc3364;
background-color: #fdf7ed;
color: #845b10;
}
.tag:not(body).is-success {
background-color: hsl(153, 53%, 53%);
@ -2793,10 +2793,10 @@ a.tag:hover {
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
}
.is-info.textarea, .is-info.input {
border-color: #A52951;
border-color: #e9b049;
}
.is-info.textarea:focus, .is-info.input:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, .is-info.textarea:active, .is-info.input:active, .is-info.is-active.textarea, .is-info.is-active.input {
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25);
box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
}
.is-success.textarea, .is-success.input {
border-color: hsl(153, 53%, 53%);
@ -3006,16 +3006,16 @@ a.tag:hover {
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
}
.select.is-info:not(:hover)::after {
border-color: #A52951;
border-color: #e9b049;
}
.select.is-info select {
border-color: #A52951;
border-color: #e9b049;
}
.select.is-info select:hover, .select.is-info select.is-hovered {
border-color: #912447;
border-color: #e6a632;
}
.select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active {
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25);
box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
}
.select.is-success:not(:hover)::after {
border-color: hsl(153, 53%, 53%);
@ -3217,22 +3217,22 @@ a.tag:hover {
color: #fff;
}
.file.is-info .file-cta {
background-color: #A52951;
background-color: #e9b049;
border-color: transparent;
color: #fff;
}
.file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta {
background-color: #9b264c;
background-color: #e8ab3e;
border-color: transparent;
color: #fff;
}
.file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta {
border-color: transparent;
box-shadow: 0 0 0.5em rgba(165, 41, 81, 0.25);
box-shadow: 0 0 0.5em rgba(233, 176, 73, 0.25);
color: #fff;
}
.file.is-info:active .file-cta, .file.is-info.is-active .file-cta {
background-color: #912447;
background-color: #e6a632;
border-color: transparent;
color: #fff;
}
@ -3498,7 +3498,7 @@ a.tag:hover {
color: hsl(229, 53%, 53%);
}
.help.is-info {
color: #A52951;
color: #e9b049;
}
.help.is-success {
color: hsl(153, 53%, 53%);
@ -4275,15 +4275,15 @@ button.dropdown-item.is-active {
color: #3850b7;
}
.message.is-info {
background-color: #fbeff3;
background-color: #fdf7ed;
}
.message.is-info .message-header {
background-color: #A52951;
background-color: #e9b049;
color: #fff;
}
.message.is-info .message-body {
border-color: #A52951;
color: #cc3364;
border-color: #e9b049;
color: #845b10;
}
.message.is-success {
background-color: #effaf5;
@ -4795,7 +4795,7 @@ button.dropdown-item.is-active {
}
}
.navbar.is-info {
background-color: #A52951;
background-color: #e9b049;
color: #fff;
}
.navbar.is-info .navbar-brand > .navbar-item,
@ -4806,7 +4806,7 @@ button.dropdown-item.is-active {
.navbar.is-info .navbar-brand .navbar-link:focus,
.navbar.is-info .navbar-brand .navbar-link:hover,
.navbar.is-info .navbar-brand .navbar-link.is-active {
background-color: #912447;
background-color: #e6a632;
color: #fff;
}
.navbar.is-info .navbar-brand .navbar-link::after {
@ -4832,7 +4832,7 @@ button.dropdown-item.is-active {
.navbar.is-info .navbar-end .navbar-link:focus,
.navbar.is-info .navbar-end .navbar-link:hover,
.navbar.is-info .navbar-end .navbar-link.is-active {
background-color: #912447;
background-color: #e6a632;
color: #fff;
}
.navbar.is-info .navbar-start .navbar-link::after,
@ -4842,11 +4842,11 @@ button.dropdown-item.is-active {
.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,
.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #912447;
background-color: #e6a632;
color: #fff;
}
.navbar.is-info .navbar-dropdown a.navbar-item.is-active {
background-color: #A52951;
background-color: #e9b049;
color: #fff;
}
}
@ -5679,14 +5679,14 @@ a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-i
color: hsl(229, 53%, 53%);
}
.panel.is-info .panel-heading {
background-color: #A52951;
background-color: #e9b049;
color: #fff;
}
.panel.is-info .panel-tabs a.is-active {
border-bottom-color: #A52951;
border-bottom-color: #e9b049;
}
.panel.is-info .panel-block.is-active .panel-icon {
color: #A52951;
color: #e9b049;
}
.panel.is-success .panel-heading {
background-color: hsl(153, 53%, 53%);
@ -7802,39 +7802,39 @@ a.has-text-link-dark:hover, a.has-text-link-dark:focus {
}
.has-text-info {
color: #A52951 !important;
color: #e9b049 !important;
}
a.has-text-info:hover, a.has-text-info:focus {
color: #7c1f3d !important;
color: #e49c1c !important;
}
.has-background-info {
background-color: #A52951 !important;
background-color: #e9b049 !important;
}
.has-text-info-light {
color: #fbeff3 !important;
color: #fdf7ed !important;
}
a.has-text-info-light:hover, a.has-text-info-light:focus {
color: #f1c6d4 !important;
color: #f7e3bf !important;
}
.has-background-info-light {
background-color: #fbeff3 !important;
background-color: #fdf7ed !important;
}
.has-text-info-dark {
color: #cc3364 !important;
color: #845b10 !important;
}
a.has-text-info-dark:hover, a.has-text-info-dark:focus {
color: #d65c83 !important;
color: #b17a15 !important;
}
.has-background-info-dark {
background-color: #cc3364 !important;
background-color: #845b10 !important;
}
.has-text-success {
@ -9924,7 +9924,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
}
}
.hero.is-info {
background-color: #A52951;
background-color: #e9b049;
color: #fff;
}
.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),
@ -9943,7 +9943,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
}
@media screen and (max-width: 1023px) {
.hero.is-info .navbar-menu {
background-color: #A52951;
background-color: #e9b049;
}
}
.hero.is-info .navbar-item,
@ -9953,7 +9953,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
.hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active,
.hero.is-info .navbar-link:hover,
.hero.is-info .navbar-link.is-active {
background-color: #912447;
background-color: #e6a632;
color: #fff;
}
.hero.is-info .tabs a {
@ -9964,7 +9964,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
opacity: 1;
}
.hero.is-info .tabs li.is-active a {
color: #A52951 !important;
color: #e9b049 !important;
opacity: 1;
}
.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a {
@ -9976,14 +9976,14 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover {
background-color: #fff;
border-color: #fff;
color: #A52951;
color: #e9b049;
}
.hero.is-info.is-bold {
background-image: linear-gradient(141deg, #84174c 0%, #A52951 71%, #bf2840 100%);
background-image: linear-gradient(141deg, #f07a0f 0%, #e9b049 71%, #f0d45b 100%);
}
@media screen and (max-width: 768px) {
.hero.is-info.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #84174c 0%, #A52951 71%, #bf2840 100%);
background-image: linear-gradient(141deg, #f07a0f 0%, #e9b049 71%, #f0d45b 100%);
}
}
.hero.is-success {

View file

@ -4,7 +4,7 @@ $beige: #e9b049
$bright-black: #280a13
$primary: $betterave
$info: $betterave
$info: $beige
$text: $bright-black
// Navbar