From f6917d701243f0bee0f9798d9ed7b80740daffc1 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 1 Feb 2026 13:51:45 +0000 Subject: [PATCH] 1.00 --- config/__pycache__/__init__.cpython-311.pyc | Bin 159 -> 159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5552 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1557 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 679 bytes core/__pycache__/__init__.cpython-311.pyc | Bin 157 -> 157 bytes core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1171 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1900 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 2691 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 347 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 2799 bytes core/admin.py | 14 +- core/forms.py | 18 ++ core/migrations/0001_initial.py | 40 +++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2433 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 31 +- core/templates/base.html | 85 ++++-- core/templates/core/index.html | 286 +++++++++--------- core/views.py | 55 ++-- static/css/custom.css | 88 +++++- staticfiles/css/custom.css | 95 +++++- 23 files changed, 511 insertions(+), 201 deletions(-) create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a6362b2322713e75da67a35e209e76169dbae..033bbd246bcf77871ed0f4174bfddb0c2811d0d5 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}#|i)KBD|0st!n1eyQ< delta 19 ZcmbQwIG>SwIWI340}xbw%b&y+NCMIWI340}#|i)NkZoDhdEN!v$6V delta 20 acmdm>y+NCMIWI340}xbw%iqYoR1^R_83p11 diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94ece283a83ff1af1d71f1b265c943eb37a..80ed71151a26185f2901c745d208a7c5ac305f3d 100644 GIT binary patch delta 20 acmbQrGnI#XIWI340}#|i)NkbGVgmp#AOtu7 delta 20 acmbQrGnI#XIWI340}xbw%iqY&#RdQ}b_B!# diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 9c49e09df194d2dbcad4868349c9177db4b15571..14e1012634791eed13581d8f4081678762d2022a 100644 GIT binary patch delta 20 acmZ3^x}24JIWI340}#|i)NkaT!vp{^@C4id delta 20 acmZ3^x}24JIWI340}xbw%iqX7hY0{RMg?d9 diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 74b111269bd81aac528770a53e2f849291524d56..b38c29f76d7977d27f92ee0f78e15b4432119328 100644 GIT binary patch delta 19 ZcmbQsIG2%oIWI340}#|i)KBD|1OO_!1e5>( delta 19 ZcmbQsIG2%oIWI340}xbw%b&>mG1t0(b diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..e7f55d34ba3ef4894be1c7a8c0a74faf8b6e97d8 100644 GIT binary patch literal 1171 zcma)5OH15P6uvhvGvka}9~Ga72qly{f1ngfDJ`_lrd^b5Ld?BtY#!5_gmzZV!XMzy ze=w!>XB4_tn8k2cLRaoa#+9p{lQDx<3%xh_?m3)izH{@fUat~ZKR$f*2b7TCsFcgN z76!jSI3kQN8jz6MloF;eHBds;RzuC!C{YNf`+6D3)ehu3hIhCW@`^C+fG{1r%B-ZL zf)BjI)q&%O2LHmnER99ub1Xh4E!X1>FBZH}5V6^6 z3lm}r&_GC50P@j3n|YkS?M*M`Z+f#U`4(<5Q~KY}(<+$%#glC?9k?>&)D60abm>xK zFpPpAX}Dnw%}di8&4=;C6MhTlW2uFgSinZ+0f11PP9Zm~F;PRMjxd2Ri7I>1djULzfwNXJIL)tg(&o4AMJ7}>NcP+;GUcH>Q$ zcq;sDftOtxFkK!b0{<3)KZ7&{--XG-7^_=oD|i@Aqv+vwUsvYS;r)0f)*u?MW%3iC zuTn~TWbNek(<9c&ea{)4%;yeP56x4$(4`A~MWw5Kau*I?c4s#(&~S-xp%P_rSyt})7wr83>g5ln delta 168 zcmbQtd4(}$IWI340}xFAk)LS~q#uJgFu(+5d=>&SrZc24q%h_%?t6v;8x%nxjIjMF< c96&KfATE{#5+9fu85wUdC|tmXir9cE0I0$x>;M1& diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6f131d4873bc56e3763e4ed09960c6e3f34140e1..7b8c00f5fd2211e810121b990ad3899817856f3e 100644 GIT binary patch delta 20 ZcmeBS>0#ks&dbZi00cD=^&7bvnE))51PK5D delta 20 acmeBS>0#ks&dbZi00dRv@;7obG64WD>I9Vl diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..77877889e363d2a1d84de043211370b7ae61003e 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}#|i)Nkbezytt45Czx( delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a5501f6d45dff17a9674f4652d660f28d9cd54d GIT binary patch literal 1900 zcmbVN&2Jk;6rcU{I(Cvmjb#);jfeLIO1@2`L~NkYWK^39U9elf>@Y>&~o| z4@Dw}N*Jl2916`LhYF!k)FS2BBY(mgS;88Dgv6;gSLp%e#G73^A8k0m?99*a&AgfS z-n{q5KMoEKAZR~-_C>j*AoQ1D`c3N*`|km98)1Yc4^<^gk`R`$;>lITQmU$@N=Qam z5LRy>tP!cw--mYL#CtH}X6aa;M`q%oU`>f@i$1NghmzoAo+?qN#vC^&`!#M%I{{hp z>6#mFjZy6}`)>mAC0Im|C1GUAk#-5R%eyjYgb_DOX`)35D>n>FZK74l(m=n;hmWb6 z1shH%N%r>c{|>~F3Zhu*5?sLdaEOeEUP<)iqN~8_j(lI+1y}9~ccK?o(o^|d0L!~mRRtgWnMGPNgp16qdt0Zttjq6U;Z`1;= z25WV~4YwBzu415g3KQnia$Q7<4uP)qw20&d*RKWC_e`0lVUlaE=P)MX>;wU2>*~b# z#Kj0FOog5iA}R|=ou}%a#68GMm*vM>(73=>;(B0hvkFiGRwo#B&ZPk z=~)0%i)^4NF(DMwK>@=6b7qZC8EV@C2QWzS><{H%nLSsgsk4)pq5?Kx6sl-YdFOh)#g!W-4I=E0=_N%1W zSb%$M6v--a8-Y)YD?Yu(>fmnC^(iR|KiPPFjjQ73sfeC1hTR9)Jp4LmMw(jZnb|Pv zP5sZz%Ukc>`e^TsU*^K|^P*=;txTz%DRr`ATcn*GdoUD!{7JY}4aaMuXZ=>zZ)g2Z zCJ!4wyqnm2Asm|wGgGb1R68@($&GGnJL$Vu_C5~_(_wC=m78hjW;!G1w_o3xd~hkW zYT-p+^pSdNq~0E>cT@V=fi41QCd5b2fx+}80QWHeff2rlKd+;|^=m89 zZ_>7-+_!Be?9Au$n=}su9R*m=Jy~>peIljVG{E1RsAJ^5*1k&IOtg*M_GoCBcU}RA z`yYkZ+J(1%D@^`cm~0g;w+ok>>dn;F2W{hA+jupMdK3^-rx~I4IRRM#B0`ZBe6VMu zOFYlEO^Fs@iHQ(Q#kPusB6?Hocg%nv!UxaP(0ePSfjJM;WzeFd175*_FpsPrd i)IquMWbYs|Jgs-tAxZdgI&P6${-bE^@xMq!2K@s~%*asy literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..837f00bfd7031459b6e991f1f6893145a33ede47 100644 GIT binary patch literal 2691 zcmaJ@O-vg{6rT02?X}m&U`Uh{1WwfaI3z}CX+)w1l?G_i5LyK%qOO$HvNM4tYn#lj z!;d1>hg9OwLk_7@DXPSwqM&f#&;!RFxpf__6f~zwJ#ixs*POSy2%I-8MFA+vqFi~E}2?EyxW*{%-L;(fRR|t#G z5SEBA4SV=)Sw!eH+haJ$}$A|x*l*&_Ckz7i1FnB%)niJPXsqTL%AqUKyb}WzMf*OD$*u+u&_Q=G<0IIFeVSR zl4);$0>jyb^l-6Y56lt^UXn8OVj)$~Ks!$|lbMUDhuWo*4KFhw$7#vmDL7$jg-1*( zluVOFrieMC+GNf?l=oT&ca!jvgL%)1H~=wf@4TR%cqD5IRw`h;KP#mZ)Z~qFs0)+ROAzK|DRBiBiEX^^iHDm+T_# znJv;s){Lf;9=%9Ok6%2QnRzC0C+G=S8i(6D4x(KDZFOF7n%76mdZK?G=FHDOx&cU7JF@Dqq)oU>W#T;@KHp2&B&M3F&kI(hPZE&6C7d z?fDs^V#As-wfR+nNft35T72IWO@U-#RkduYste8a+*U`LVcI$eqKvkZ$6utK#8tR{ zvEO#}zUk_%bX{?~uJ~hI%2&N8N7D-Z2-eVcE;>N4mh9bu(XoLW*<0U?s@duao_Zo>!^YZoDTBL!>nmpS?Z5~H~$dm>Tnj36H zpu5;wyn*goJS&cDufaY|4ex5j381q!+ziFs!jvr43YMnZ29yI2k9zFHUD@Uo2vzP; z7d9ph+hR?a=tf>MRj6|ytSpP!`|GW=$Rfpp3an3TLXW|67Nf)j!o(gCqy@@7+y2+v z*kdf(2D(Rvlmh{nGNu6?sDabUr|S^sK!$#u z-r-v){unq}-{uwiH3*rJ0Or?H3u5Y0YMZ;57U>yyu#lE70&g(|6HBMYjF-2wFmnLx z9-a%dIWY@m;wT-NM{m!PoNjG)(`dxp_ zk+W6sA8Q1E@BrXrgZ>%$n7_)sjt&E*8k2?FWZpwHlgEa#>gc_Z5hm-^?-`2>g61#c zsAnRa0h2Hc(hJb1*SP5BGjVR2g>SlN&7wLbFo0FfK9Wo_d?6RDa9f)ojv$kGs5}H* z(sXL^z8g=ie7W)1i4Rob18#hvJiL`iEk1D*sihO^_y15gdz}ZSlgL*Rc{hh@Z z&EG~G<#I*2>?)UmXp*O&pLLU`SM-fGC)r;~_Pfdc^6k1cUH|OQw4;nvlo3}M0sEFS z&yTw;XV!b2mcB|$pWD(`{+ct=J%LlrQPQUy9@=O+%p!PND@+zMc*1AiShZiW;S){0 zoCfdk|3p5$dTBY#yLat>cRQd|H|{7@`D i`RVC9KK_1xvNJC5ppKT$&%U_G7u*y0ilgkj;Qs@yZi0^h delta 164 zcmZn`y~voboR^o20SKo5$j`I{(vLwL7+``jJ_`XE(-~42QW$d>av7r-85vTTf*CZK zUxE~9GTvg#%}+_qDfZK3y2Y82m6(^Fua}Zk#0-?2ypGA->KBI%P(f)d0X Xi)Det2WCb_#v2SW7qFosHlPXs%{U|B diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..4fbc8c476e50be82512babdbeb82b9f10852f2ed 100644 GIT binary patch delta 20 acmcc3beoBLIWI340}#|i)NkYtU<3d-qXh8) delta 20 acmcc3beoBLIWI340}xbw%iqWyzz6_4`2~Fd diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..da2864bb28ab7619c0abdcd5f518f266bff8a468 100644 GIT binary patch literal 2799 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 oaJYj1?sMmz;N9mgJ8yaiQh}ES+)45 - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}BudgetTracker{% endblock %} + + {% if project_description %} + + + + {% endif %} + {% if project_image_url %} + + + {% endif %} + + {% load static %} + + + + + + + + {% block head %}{% endblock %} - - {% block content %}{% endblock %} - + - +
+ {% block content %}{% endblock %} +
+ +
+
+

© 2026 BudgetTracker. Built with Django & Flatlogic.

+
+
+ + + + {% block scripts %}{% endblock %} + + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..7799906 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,147 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} +{% load static %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+
+
+

Hello! Here's your budget overview.

+

Tracking your finances for {{ current_month }}

+
+
+ +
+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +
+ +
+
+
+
+
+ +
+ Total Balance +
+

+ ${{ balance|floatformat:2 }} +

+
+
+
+
+
+
+ +
+ Monthly Income +
+

${{ monthly_income|floatformat:2 }}

+
+
+
+
+
+
+ +
+ Monthly Expenses +
+

${{ monthly_expense|floatformat:2 }}

+
+
+
+ + +
+
+
+

Recent Transactions

+ + View All + +
+ +
+ + + {% for transaction in recent_transactions %} + + + + + + {% empty %} + + + + {% endfor %} + +
+
{{ transaction.date|date:"M d" }}
+ {{ transaction.date|date:"Y" }} +
+
{{ transaction.description|default:"No description" }}
+ {{ transaction.category.name|default:"Uncategorized" }} +
+
+ {% if transaction.type == 'income' %}+{% else %}-{% endif %}${{ transaction.amount|floatformat:2 }} +
+ {{ transaction.get_type_display }} +
+ Empty +

No transactions yet. Start by adding one!

+
+
+
+
+
+ + + +{% endblock %} diff --git a/core/views.py b/core/views.py index c9aed12..55e35b3 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,40 @@ -import os -import platform - -from django import get_version as django_version -from django.shortcuts import render +from django.shortcuts import render, redirect +from django.db.models import Sum from django.utils import timezone - +from .models import Transaction, Category +from .forms import TransactionForm +import datetime def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() - + today = timezone.now().date() + first_day_of_month = today.replace(day=1) + + # Calculate stats + total_income = Transaction.objects.filter(type='income').aggregate(Sum('amount'))['amount__sum'] or 0 + total_expense = Transaction.objects.filter(type='expense').aggregate(Sum('amount'))['amount__sum'] or 0 + balance = total_income - total_expense + + monthly_income = Transaction.objects.filter(type='income', date__gte=first_day_of_month).aggregate(Sum('amount'))['amount__sum'] or 0 + monthly_expense = Transaction.objects.filter(type='expense', date__gte=first_day_of_month).aggregate(Sum('amount'))['amount__sum'] or 0 + + recent_transactions = Transaction.objects.select_related('category').order_by('-date', '-created_at')[:10] + + if request.method == 'POST': + form = TransactionForm(request.POST) + if form.is_valid(): + form.save() + return redirect('home') + else: + form = TransactionForm() + context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + 'total_income': total_income, + 'total_expense': total_expense, + 'balance': balance, + 'monthly_income': monthly_income, + 'monthly_expense': monthly_expense, + 'recent_transactions': recent_transactions, + 'form': form, + 'current_month': today.strftime('%B %Y'), } - return render(request, "core/index.html", context) + return render(request, 'core/index.html', context) \ No newline at end of file diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..b78544d 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,86 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Outfit:wght@600;700&display=swap'); + +:root { + --bg-color: #F8FAFC; + --slate-800: #1E293B; + --slate-500: #64748B; + --emerald: #10B981; + --rose: #F43F5E; + --indigo: #6366F1; + --violet: #8B5CF6; } + +body { + background-color: var(--bg-color); + font-family: 'Inter', sans-serif; + color: var(--slate-800); +} + +h1, h2, h3, .h1, .h2, .h3 { + font-family: 'Outfit', sans-serif; + font-weight: 700; +} + +.hero-gradient { + background: linear-gradient(135deg, var(--indigo) 0%, var(--violet) 100%); + color: white; + padding: 3rem 0; + border-radius: 0 0 2rem 2rem; + margin-bottom: -4rem; +} + +.stats-card { + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.3); + border-radius: 1.25rem; + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + transition: transform 0.2s ease; +} + +.stats-card:hover { + transform: translateY(-2px); +} + +.income-text { color: var(--emerald); } +.expense-text { color: var(--rose); } + +.btn-primary-gradient { + background: linear-gradient(135deg, var(--indigo) 0%, var(--violet) 100%); + border: none; + color: white; + font-weight: 600; + padding: 0.75rem 1.5rem; + border-radius: 0.75rem; +} + +.btn-primary-gradient:hover { + opacity: 0.9; + color: white; +} + +.transaction-row { + border-left: 4px solid transparent; + transition: all 0.2s ease; +} + +.transaction-row.income { border-left-color: var(--emerald); } +.transaction-row.expense { border-left-color: var(--rose); } + +.table { + border-collapse: separate; + border-spacing: 0 0.5rem; +} + +.table tr { + background: white; + border-radius: 0.75rem; +} + +.table td { + padding: 1rem; + vertical-align: middle; +} + +.table td:first-child { border-radius: 0.75rem 0 0 0.75rem; } +.table td:last-child { border-radius: 0 0.75rem 0.75rem 0; } \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..b78544d 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,86 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Outfit:wght@600;700&display=swap'); :root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); + --bg-color: #F8FAFC; + --slate-800: #1E293B; + --slate-500: #64748B; + --emerald: #10B981; + --rose: #F43F5E; + --indigo: #6366F1; + --violet: #8B5CF6; } + body { - margin: 0; + background-color: var(--bg-color); font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + color: var(--slate-800); } + +h1, h2, h3, .h1, .h2, .h3 { + font-family: 'Outfit', sans-serif; + font-weight: 700; +} + +.hero-gradient { + background: linear-gradient(135deg, var(--indigo) 0%, var(--violet) 100%); + color: white; + padding: 3rem 0; + border-radius: 0 0 2rem 2rem; + margin-bottom: -4rem; +} + +.stats-card { + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.3); + border-radius: 1.25rem; + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + transition: transform 0.2s ease; +} + +.stats-card:hover { + transform: translateY(-2px); +} + +.income-text { color: var(--emerald); } +.expense-text { color: var(--rose); } + +.btn-primary-gradient { + background: linear-gradient(135deg, var(--indigo) 0%, var(--violet) 100%); + border: none; + color: white; + font-weight: 600; + padding: 0.75rem 1.5rem; + border-radius: 0.75rem; +} + +.btn-primary-gradient:hover { + opacity: 0.9; + color: white; +} + +.transaction-row { + border-left: 4px solid transparent; + transition: all 0.2s ease; +} + +.transaction-row.income { border-left-color: var(--emerald); } +.transaction-row.expense { border-left-color: var(--rose); } + +.table { + border-collapse: separate; + border-spacing: 0 0.5rem; +} + +.table tr { + background: white; + border-radius: 0.75rem; +} + +.table td { + padding: 1rem; + vertical-align: middle; +} + +.table td:first-child { border-radius: 0.75rem 0 0 0.75rem; } +.table td:last-child { border-radius: 0 0.75rem 0.75rem 0; } \ No newline at end of file