From 30ec2ec0e83977232e2ee4b1ab07123f82780452 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 21 Aug 2026 15:26:01 +0100 Subject: [PATCH] Initial work on better admin page styling --- public/assets/css/app.css | 2 +- public/assets/css/app.css.br | Bin 1233 -> 1477 bytes public/assets/css/app.css.map | 2 +- public/assets/css/app.css.zst | Bin 1479 -> 1762 bytes resources/css/admin-tokens.css | 65 +++++++++++++++++++ resources/css/app.css | 1 + resources/views/admin/tokens/index.blade.php | 52 ++++++++++----- 7 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 resources/css/admin-tokens.css diff --git a/public/assets/css/app.css b/public/assets/css/app.css index 4e2ebd32..1d99e7bc 100644 --- a/public/assets/css/app.css +++ b/public/assets/css/app.css @@ -1,2 +1,2 @@ -@layer reset{*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none}body,h1,h2,h3,h4,p,figure,blockquote,dl,dd{margin-block-end:0}ul[role=list],ol[role=list]{list-style:none}body{line-height:1.5}h1,h2,h3,h4,button,input,label{line-height:1.1}h1,h2,h3,h4{text-wrap:balance}a:not([class]){text-decoration-skip-ink:auto;color:currentColor}img,picture{max-width:100%;height:auto;display:block}input,button,textarea,select{font-family:inherit;font-size:inherit}textarea:not([rows]){min-height:10em}:target{scroll-margin-block:5ex}@media (prefers-reduced-motion){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}}@layer base{:root{color-scheme:light dark;--primary-hue:307;--clr-text:light-dark(oklch(5% .1 var(--primary-hue)),oklch(100% .1 var(--primary-hue)));--clr-background:light-dark(oklch(100% .1 var(--primary-hue)),oklch(15% .15 var(--primary-hue)));--clr-border:light-dark(oklch(90% .2 var(--primary-hue)),oklch(25% .1 var(--primary-hue)));--clr-snow-fall:light-dark(oklch(25% .15 var(--primary-hue)),oklch(85% .2 var(--primary-hue)))}body{background-color:var(--clr-background);color:var(--clr-text)}:root{--border-radius:8px}html{font-size:125%}body{grid-template-rows:min-content 1fr min-content;grid-template-columns:1fr min(80ch,80vw) 1fr;padding-inline:4vw;display:grid;&>header{grid-column:1/-1}&>main{grid-column:2/3}&>footer{grid-column:1/-1;margin-block-start:2ex;& search form{flex-direction:row;align-items:center;gap:1ex;display:flex;& input{min-width:0}}}}.h-feed{flex-direction:column;gap:2ex;display:flex}}@layer components{.h-entry{& pre{padding:1rem}}body>header{grid-template-rows:auto auto;grid-template-columns:auto 1fr auto;align-items:baseline;gap:1rem;display:grid;& a{text-decoration:none}& h1{text-wrap:nowrap;margin:0}& nav{flex-direction:row;gap:.5rem;display:flex;@media screen and (width<=1100px){flex-wrap:wrap;grid-area:2/1/auto/span 3}}}.note{border:1px solid var(--clr-border);border-radius:var(--border-radius);flex-direction:column;padding:1ex 2ex;display:flex;& .e-content{&>p:first-child{margin-block-start:0}& .u-photo{width:100%;height:auto}}& .syndication-links{flex-direction:row;gap:1ex;display:flex;& svg{border-radius:4px;width:auto;height:1lh}}}.reply-to{border:1px solid var(--clr-border);border-top-left-radius:var(--border-radius);border-top-right-radius:var(--border-radius);border-bottom:none;margin-inline:2ex;padding-inline:1ex;font-size:85%}.pagination{flex-direction:row;justify-content:center;align-items:center;display:flex;& div{flex-direction:row;gap:1ex;display:flex}}#theme-selector{& button{appearance:none;background:0 0;border:none;&:hover{cursor:pointer}}& #theme-selector-dropdown{position-area:block-end span-inline-start;border:2px solid var(--clr-border);background-color:var(--clr-background);color:var(--clr-text);margin:0;position:absolute;& fieldset{border:0;flex-direction:row;gap:1ch;display:flex;& input{display:none}}}@media (prefers-reduced-motion:no-preference){& #theme-selector-dropdown{&:popover-open{opacity:1;transform:translateY(0)scale(1);@starting-style{opacity:0;transform:translateY(30px)scale(0)}}opacity:0;transition:transform, opacity, display allow-discrete, overlay allow-discrete;transform-origin:100% 0;transition-duration:.5s;transform:translateY(0)scale(0)}}}::view-transition-group(changing-theme){animation-duration:1.25s}::view-transition-new(changing-theme),::view-transition-old(changing-theme){mix-blend-mode:normal}::view-transition-new(changing-theme){animation-name:reveal}::view-transition-old(changing-theme){animation:none}@keyframes reveal{0%{clip-path:polygon(-30% 0,-30% 0,-15% 100%,-10% 115%)}to{clip-path:polygon(-30% 0,130% 0,115% 100%,-10% 115%)}}} +@layer reset{*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none}body,h1,h2,h3,h4,p,figure,blockquote,dl,dd{margin-block-end:0}ul[role=list],ol[role=list]{list-style:none}body{line-height:1.5}h1,h2,h3,h4,button,input,label{line-height:1.1}h1,h2,h3,h4{text-wrap:balance}a:not([class]){text-decoration-skip-ink:auto;color:currentColor}img,picture{max-width:100%;height:auto;display:block}input,button,textarea,select{font-family:inherit;font-size:inherit}textarea:not([rows]){min-height:10em}:target{scroll-margin-block:5ex}@media (prefers-reduced-motion){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}}@layer base{:root{color-scheme:light dark;--primary-hue:307;--clr-text:light-dark(oklch(5% .1 var(--primary-hue)),oklch(100% .1 var(--primary-hue)));--clr-background:light-dark(oklch(100% .1 var(--primary-hue)),oklch(15% .15 var(--primary-hue)));--clr-border:light-dark(oklch(90% .2 var(--primary-hue)),oklch(25% .1 var(--primary-hue)));--clr-snow-fall:light-dark(oklch(25% .15 var(--primary-hue)),oklch(85% .2 var(--primary-hue)))}body{background-color:var(--clr-background);color:var(--clr-text)}:root{--border-radius:8px}html{font-size:125%}body{grid-template-rows:min-content 1fr min-content;grid-template-columns:1fr min(80ch,80vw) 1fr;padding-inline:4vw;display:grid;&>header{grid-column:1/-1}&>main{grid-column:2/3}&>footer{grid-column:1/-1;margin-block-start:2ex;& search form{flex-direction:row;align-items:center;gap:1ex;display:flex;& input{min-width:0}}}}.h-feed{flex-direction:column;gap:2ex;display:flex}}@layer components{.h-entry{& pre{padding:1rem}}body>header{grid-template-rows:auto auto;grid-template-columns:auto 1fr auto;align-items:baseline;gap:1rem;display:grid;& a{text-decoration:none}& h1{text-wrap:nowrap;margin:0}& nav{flex-direction:row;gap:.5rem;display:flex;@media screen and (width<=1100px){flex-wrap:wrap;grid-area:2/1/auto/span 3}}}.note{border:1px solid var(--clr-border);border-radius:var(--border-radius);flex-direction:column;padding:1ex 2ex;display:flex;& .e-content{&>p:first-child{margin-block-start:0}& .u-photo{width:100%;height:auto}}& .syndication-links{flex-direction:row;gap:1ex;display:flex;& svg{border-radius:4px;width:auto;height:1lh}}}.reply-to{border:1px solid var(--clr-border);border-top-left-radius:var(--border-radius);border-top-right-radius:var(--border-radius);border-bottom:none;margin-inline:2ex;padding-inline:1ex;font-size:85%}.pagination{flex-direction:row;justify-content:center;align-items:center;display:flex;& div{flex-direction:row;gap:1ex;display:flex}}#theme-selector{& button{appearance:none;background:0 0;border:none;&:hover{cursor:pointer}}& #theme-selector-dropdown{position-area:block-end span-inline-start;border:2px solid var(--clr-border);background-color:var(--clr-background);color:var(--clr-text);margin:0;position:absolute;& fieldset{border:0;flex-direction:row;gap:1ch;display:flex;& input{display:none}}}@media (prefers-reduced-motion:no-preference){& #theme-selector-dropdown{&:popover-open{opacity:1;transform:translateY(0)scale(1);@starting-style{opacity:0;transform:translateY(30px)scale(0)}}opacity:0;transition:transform, opacity, display allow-discrete, overlay allow-discrete;transform-origin:100% 0;transition-duration:.5s;transform:translateY(0)scale(0)}}}::view-transition-group(changing-theme){animation-duration:1.25s}::view-transition-new(changing-theme),::view-transition-old(changing-theme){mix-blend-mode:normal}::view-transition-new(changing-theme){animation-name:reveal}::view-transition-old(changing-theme){animation:none}@keyframes reveal{0%{clip-path:polygon(-30% 0,-30% 0,-15% 100%,-10% 115%)}to{clip-path:polygon(-30% 0,130% 0,115% 100%,-10% 115%)}}.token-list{border-collapse:collapse;width:100%;margin-block-start:1em;& th,& td{text-align:left;border-bottom:1px solid var(--clr-border);vertical-align:middle;padding:.6em .8em}& th{text-transform:uppercase;letter-spacing:.03em;opacity:.7;font-size:.85em}& tr.is-revoked{opacity:.6}& a{word-break:break-all}}.badge,.token-list button.revoke{white-space:nowrap;border-radius:999px;padding:.2em .7em;font-size:.85em;line-height:1.5;display:inline-block}.badge{background:0 0;border:1px solid}.badge-active{color:light-dark(oklch(35% .16 145),oklch(75% .16 145))}.badge-revoked{color:var(--clr-text)}.token-list button.revoke{color:light-dark(oklch(30% .15 25),oklch(92% .12 25));cursor:pointer;background:light-dark(oklch(92% .15 25),oklch(30% .12 25));border:1px solid #0000;transition:background-color .15s}.token-list button.revoke:hover{background:light-dark(oklch(80% .2 25),oklch(45% .18 25))}} /*# sourceMappingURL=/assets/css/app.css.map */ diff --git a/public/assets/css/app.css.br b/public/assets/css/app.css.br index eeec79a35027043c8a76e16f3f60ad4ad6679731..e2d1ff369d415fd1742a121226c0afdf863f2167 100644 GIT binary patch literal 1477 zcmca8Fohw(@WGU`E4|sGmy5&&Z4o%kecyiiQnS~WL+b3j=Ot|CGd)`@`a!VGeYU<< zkawQh+Sq_La9j^j$mS#WZ#Lrqs;*2WH;q3p^V|CPZ;HX)jcH zn3V0CD_;2O-*VZBo?;WYE5BS*Teu}e(sJgPF6~5-H+OuSRz=P|ks!3xtM%}t{alNk zb}KEg?OW%Xu`eZRr+euhx0ip+?l$e0o&LDcwD2v9=UV~iXH)NNh?G6S(feI;!!M05 zmec>|1g_qz+OuPs%SZL3Wz1_^chnzQApgRp`Yp!_*|W~EdWpVs_ejqwSb23`57P?YZL%S!rGB@kggiMJ&=+-J!f}_id9kN6F1(v_$Vr&T zWYGo@!82+nmb4YrsdcScUB?_QcfQzq_qpP7zJQK5rTMcrFJEI$zTMY$nH^X)r97Lx z+{A#VsokUgcx1`?`ha+4hLDZ1Yv)XQ!n+i@K1W*J1u=`x$FOgruDPhBSR)ssiyn&+dYZQKXvPe-kXbS zx6BcJdS$uZ^4C|(w%OGfeJCkc*%`N0?AWcZ_im*>a;Z2F-Xgg9{O?6>>`-g(cbhW>>?euiro@igC%uIt#` zeoH}pgBe98UaiuY*;)8-#)u9TNc^^Mz}t^dR=KzhOQIlFQU z?;c*}sw93o?U>`LZI1uO-`(Qc(Cu4_lq2X&XC#j?!AqgEiqMS z(z@tB9d041yvMv-Zx!y8TB6L7D98B8Mmai2Oi)Mb^QjPJ%QKCo+I#Y5#0wo;=q#Ee z{r=j4*AG<+g9BafX#TpQQGN6B#w$O%dn1H{x-)e5HFQfFXGOp?f z-Yb?LcsH5oPMpS`$$$9hrTv;OID_ZqgiD=#R=JF=)Y5~O;b$`2#mQ}37b*rVdStL5 zeAQFlyJ}a?+_Po#{5Hw{(d3q7&&PKazpdHOEck=@u2`A>#Bg@w5XWDSFLgS7vhx16 zZjZXJtgrZ&`Sbs9DC%xd`Tdq9)iplj>yuye=EW8+`)bd&WWu+tsrzRCf3)ny#Rr*v zXRlR0tdp=d=>GP$cvm;a(;HiK6z06(@#t;5qhZ7J)I&~B%E2$cW>fygHNVy{96h%B zltD__ejatH!rvC>w(Kv->|!;Wp855$ZvHy^M++W*SYGcQJ#E$Fb+&2;1t<7!mE>Q# zGp0d!CV!y+fsNC;^>6NW_^?Fgd{c1F^WgXAt}4m+ujJmv>R6VSwc$b|XPnOKodU0o z=k!@zbXj7ly{$~eadXQXrB18P1^$;B`%-pCbWFNbcy0Y2m1iw?uFJoDHsjDnF8P1G z`A*GxJZ^73wTN2Zd6F4>VrAsE?#_9q<_E~We5$AZqwl~`eKq}% GiyHvv%jWq2 literal 1233 zcmX^3qnzP^&4ygj*WJubJl%;JoPT|5ZiPg5y;vBobhN?ZzN1IrMX&2gQ>X4<`TK6_ zs~Z{p9j$Zpe($$mxYj=Mvq@wHoYqop^ggR=ziV(Ye~X`0bBp`=%cD+9$Pl zQCyVH$!c+}v)(sO*LNLOl{$W1GW>s+v{~cLn-X)Vco1{UuUWN^~)VvDYM^NVRnJb z_BD|wz8UR47PoD#`8Lk^JW6+G+}twv>Z0}cRF=>1WPZqJF37^HqW*oJ?&}~WD}_z1 zQg8eBDpmeDzv7K&+d=*BS9UIL|35$J|AJ5)Uv4bzg z<*QL}TYf{1LCB)#!WXt4b}{^<>~~muM=dM=D`7d;&~>Grr}HMfdhko4c)IN}?%62^ zpOn}!HH3WpCt_=LG3I38a<7INv&2^R^`$UrB<|-su(x)8wtGlTry6_dY%GFu&24AmPzPhIVW$Rnz zgKw)$-+39Oy%XKEI`~|Qzw7OT@%%4rymi;@5)uBd^6c^9-D`#Hrc6HnnT_M4yv(yZ zM=E}te_~`mEB1gkp^;YHse{_F-Xe>Dmpi zG>czIr(`-UnY!>w`<{Ud&aawV=^-@SH0lKn#8 zJljj@mWkh=rB2$byT6^iGv?B)rvm+Vx9sJp;kwTM+izm@>WiUTmX{;drA}rmvi<)v z|Ngm%BmaN>5St*T)LExB@#6Zp7ZJa=Jq^&+ahB=0`sCZYn)RnI&sIJsv!K{@k&w=z MfY header {\n display: grid;\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto auto;\n align-items: baseline;\n gap: 1rem;\n\n a {\n text-decoration: none;\n }\n\n h1 {\n margin: 0;\n text-wrap: nowrap;\n }\n\n nav {\n display: flex;\n flex-direction: row;\n gap: .5rem;\n\n @media screen and (width <= 1100px) {\n grid-row: 2;\n grid-column: 1 / span 3;\n flex-wrap: wrap;\n }\n }\n }\n}\n","@layer components {\n .note {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--clr-border);\n border-radius: var(--border-radius);\n padding: 1ex 2ex;\n\n .e-content {\n > p:first-child {\n margin-block-start: 0;\n }\n\n .u-photo {\n width: 100%;\n height: auto;\n }\n }\n\n .syndication-links {\n display: flex;\n flex-direction: row;\n gap: 1ex;\n\n svg {\n border-radius: 4px;\n width: auto;\n height: 1lh;\n }\n }\n }\n\n .reply-to {\n font-size: 85%;\n margin-inline: 2ex;\n padding-inline: 1ex;\n border: 1px solid var(--clr-border);\n border-bottom: none;\n border-top-left-radius: var(--border-radius);\n border-top-right-radius: var(--border-radius);\n }\n}\n","@layer base {\n :root {\n color-scheme: light dark;\n\n --primary-hue: 307;\n --clr-text: light-dark(\n oklch(5% 0.1 var(--primary-hue)),\n oklch(100% 0.1 var(--primary-hue))\n );\n --clr-background: light-dark(\n oklch(100% 0.1 var(--primary-hue)),\n oklch(15% 0.15 var(--primary-hue))\n );\n --clr-border: light-dark(\n oklch(90% 0.2 var(--primary-hue)),\n oklch(25% 0.1 var(--primary-hue))\n );\n\n /* Adding snow fall colour whilst we are using it */\n --clr-snow-fall: light-dark(\n oklch(25% 0.15 var(--primary-hue)),\n oklch(85% 0.2 var(--primary-hue))\n );\n }\n\n body {\n background-color: var(--clr-background);\n color: var(--clr-text);\n }\n}\n","@layer base {\n :root {\n --border-radius: 8px;\n }\n\n html {\n font-size: 125%;\n }\n\n body {\n display: grid;\n grid-template-columns: 1fr min(80ch, 80vw) 1fr;\n grid-template-rows: min-content 1fr min-content;\n padding-inline: 4vw;\n\n > header {\n grid-column: 1/-1;\n }\n\n > main {\n grid-column: 2/3;\n }\n\n > footer {\n grid-column: 1/-1;\n margin-block-start: 2ex;\n\n search form {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1ex;\n\n input {\n min-width: 0;\n }\n }\n }\n }\n\n .h-feed {\n display: flex;\n flex-direction: column;\n gap: 2ex;\n }\n}\n\n@layer components {\n .h-entry {\n pre {\n padding: 1rem;\n }\n }\n}\n\n","@layer components {\n .pagination {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n\n div {\n display: flex;\n flex-direction: row;\n gap: 1ex;\n }\n }\n}\n","@layer components {\n #theme-selector {\n button {\n appearance: none;\n border: none;\n background: none;\n\n &:hover {\n cursor: pointer;\n }\n }\n\n /* This is the element with the [popover] attribute */\n #theme-selector-dropdown {\n position: absolute;\n position-area: block-end span-inline-start;\n margin: 0;\n border: 2px solid var(--clr-border);\n background-color: var(--clr-background);\n color: var(--clr-text);\n\n fieldset {\n border: 0;\n display: flex;\n flex-direction: row;\n gap: 1ch;\n\n input {\n display: none;\n }\n }\n }\n\n /*\n * This is the element with the [popover] attribute\n * Here we are styling the open and closing animations\n */\n @media (prefers-reduced-motion: no-preference) {\n #theme-selector-dropdown {\n &:popover-open {\n transform: translateY(0) scale(1);\n opacity: 1;\n\n /*\n * Start styles for the opening transition.\n * Added to :popover-open, but after the opened styles.\n */\n @starting-style {\n transform: translateY(30px) scale(0);\n opacity: 0;\n }\n }\n\n /*\n * End styles for the closing transition.\n */\n transform: translateY(0) scale(0);\n opacity: 0;\n\n /*\n * Enumerate transitioning properties, including display and overlay.\n */\n transition: transform, opacity, display allow-discrete, overlay allow-discrete;\n transition-duration: 0.5s;\n transform-origin: top right;\n }\n }\n }\n\n ::view-transition-group(changing-theme) {\n animation-duration: 1.25s;\n }\n\n ::view-transition-new(changing-theme),\n ::view-transition-old(changing-theme) {\n mix-blend-mode: normal;\n }\n\n ::view-transition-new(changing-theme) {\n animation-name: reveal;\n }\n\n ::view-transition-old(changing-theme) {\n animation: none;\n }\n\n @keyframes reveal {\n from {\n clip-path: polygon(-30% 0, -30% 0, -15% 100%, -10% 115%);\n }\n\n to {\n clip-path: polygon(-30% 0, 130% 0, 115% 100%, -10% 115%);\n }\n }\n}\n"],"names":[]} \ No newline at end of file +{"version":3,"mappings":"AACA,aCGE,uCAOA,oFASA,8DAMA,4CAMA,qBAKA,+CAMA,8BAMA,gEAMA,qDAQA,mEAOA,qCAKA,gCAKA,gCACE,wGDhFJ,YEAE,oaAwBA,kECxBA,0BAIA,oBAIA,iIAME,0BAIA,uBAIA,iDAIE,yEAME,uBAON,oDHvCF,kBG+CE,SACE,oBKhDF,wHAOE,yBAIA,+BAKA,gDAKE,kCAAqC,2CHrBzC,+HAOE,aACE,qCAIA,mCAMF,6DAKE,gDAQJ,4MD/BA,sFAME,+CENF,gBACE,oDAKE,wBAMF,gMAQE,4DAME,uBAUJ,8CACE,2BACE,yDAQE,gBAAiB,8CAST,0KAahB,iEAIA,kGAKA,4DAIA,qDAIA,mICrFA,uEAKE,4GAQA,8EAOA,2BAIA,0BAKF,+IAUA,uCAKA,sEAIA,qCAIA,kNAQA","sources":["resources/css/app.css","resources/css/colours.css","resources/css/layout.css","resources/css/reset.css","resources/css/pagination.css","resources/css/theme-selector.css","resources/css/admin-tokens.css","resources/css/notes.css","resources/css/header.css"],"sourcesContent":["/* First thing we need to do is declare our cascade layers */\n@layer reset, base, components;\n\n@import url('reset.css');\n@import url('colours.css');\n@import url('layout.css');\n@import url('header.css');\n@import url('notes.css');\n@import url('pagination.css');\n@import url('theme-selector.css');\n@import url('admin-tokens.css');\n","@layer base {\n :root {\n color-scheme: light dark;\n\n --primary-hue: 307;\n --clr-text: light-dark(\n oklch(5% 0.1 var(--primary-hue)),\n oklch(100% 0.1 var(--primary-hue))\n );\n --clr-background: light-dark(\n oklch(100% 0.1 var(--primary-hue)),\n oklch(15% 0.15 var(--primary-hue))\n );\n --clr-border: light-dark(\n oklch(90% 0.2 var(--primary-hue)),\n oklch(25% 0.1 var(--primary-hue))\n );\n\n /* Adding snow fall colour whilst we are using it */\n --clr-snow-fall: light-dark(\n oklch(25% 0.15 var(--primary-hue)),\n oklch(85% 0.2 var(--primary-hue))\n );\n }\n\n body {\n background-color: var(--clr-background);\n color: var(--clr-text);\n }\n}\n","@layer base {\n :root {\n --border-radius: 8px;\n }\n\n html {\n font-size: 125%;\n }\n\n body {\n display: grid;\n grid-template-columns: 1fr min(80ch, 80vw) 1fr;\n grid-template-rows: min-content 1fr min-content;\n padding-inline: 4vw;\n\n > header {\n grid-column: 1/-1;\n }\n\n > main {\n grid-column: 2/3;\n }\n\n > footer {\n grid-column: 1/-1;\n margin-block-start: 2ex;\n\n search form {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1ex;\n\n input {\n min-width: 0;\n }\n }\n }\n }\n\n .h-feed {\n display: flex;\n flex-direction: column;\n gap: 2ex;\n }\n}\n\n@layer components {\n .h-entry {\n pre {\n padding: 1rem;\n }\n }\n}\n\n","@layer reset {\n /* Sourced from https://piccalil.li/blog/a-more-modern-css-reset/ */\n\n /* Box sizing rules */\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n /* Prevent font size inflation */\n html {\n /* stylelint-disable property-no-vendor-prefix */\n -moz-text-size-adjust: none;\n -webkit-text-size-adjust: none;\n /* stylelint-enable property-no-vendor-prefix */\n text-size-adjust: none;\n }\n\n /* Remove default margin in favour of better control in authored CSS */\n body, h1, h2, h3, h4, p,\n figure, blockquote, dl, dd {\n margin-block-end: 0;\n }\n\n /* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */\n ul[role='list'],\n ol[role='list'] {\n list-style: none;\n }\n\n /* Set core body defaults */\n body {\n line-height: 1.5;\n }\n\n /* Set shorter line heights on headings and interactive elements */\n h1, h2, h3, h4,\n button, input, label {\n line-height: 1.1;\n }\n\n /* Balance text wrapping on headings */\n h1, h2,\n h3, h4 {\n text-wrap: balance;\n }\n\n /* A elements that don't have a class get default styles */\n a:not([class]) {\n text-decoration-skip-ink: auto;\n color: currentcolor;\n }\n\n /* Make images easier to work with */\n img,\n picture {\n max-width: 100%;\n height: auto;\n display: block;\n }\n\n /* Inherit fonts for inputs and buttons */\n input, button,\n textarea, select {\n font-family: inherit;\n font-size: inherit;\n }\n\n /* Make sure textareas without a rows attribute are not tiny */\n textarea:not([rows]) {\n min-height: 10em;\n }\n\n /* Anything that has been anchored to should have extra scroll margin */\n :target {\n scroll-margin-block: 5ex;\n }\n\n /* Disable view transition animations for users who don’t want them */\n @media (prefers-reduced-motion) {\n ::view-transition-group(*),\n ::view-transition-old(*),\n ::view-transition-new(*) {\n animation: none !important;\n }\n }\n}\n","@layer components {\n .pagination {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n\n div {\n display: flex;\n flex-direction: row;\n gap: 1ex;\n }\n }\n}\n","@layer components {\n #theme-selector {\n button {\n appearance: none;\n border: none;\n background: none;\n\n &:hover {\n cursor: pointer;\n }\n }\n\n /* This is the element with the [popover] attribute */\n #theme-selector-dropdown {\n position: absolute;\n position-area: block-end span-inline-start;\n margin: 0;\n border: 2px solid var(--clr-border);\n background-color: var(--clr-background);\n color: var(--clr-text);\n\n fieldset {\n border: 0;\n display: flex;\n flex-direction: row;\n gap: 1ch;\n\n input {\n display: none;\n }\n }\n }\n\n /*\n * This is the element with the [popover] attribute\n * Here we are styling the open and closing animations\n */\n @media (prefers-reduced-motion: no-preference) {\n #theme-selector-dropdown {\n &:popover-open {\n transform: translateY(0) scale(1);\n opacity: 1;\n\n /*\n * Start styles for the opening transition.\n * Added to :popover-open, but after the opened styles.\n */\n @starting-style {\n transform: translateY(30px) scale(0);\n opacity: 0;\n }\n }\n\n /*\n * End styles for the closing transition.\n */\n transform: translateY(0) scale(0);\n opacity: 0;\n\n /*\n * Enumerate transitioning properties, including display and overlay.\n */\n transition: transform, opacity, display allow-discrete, overlay allow-discrete;\n transition-duration: 0.5s;\n transform-origin: top right;\n }\n }\n }\n\n ::view-transition-group(changing-theme) {\n animation-duration: 1.25s;\n }\n\n ::view-transition-new(changing-theme),\n ::view-transition-old(changing-theme) {\n mix-blend-mode: normal;\n }\n\n ::view-transition-new(changing-theme) {\n animation-name: reveal;\n }\n\n ::view-transition-old(changing-theme) {\n animation: none;\n }\n\n @keyframes reveal {\n from {\n clip-path: polygon(-30% 0, -30% 0, -15% 100%, -10% 115%);\n }\n\n to {\n clip-path: polygon(-30% 0, 130% 0, 115% 100%, -10% 115%);\n }\n }\n}\n","@layer components {\n .token-list {\n width: 100%;\n border-collapse: collapse;\n margin-block-start: 1em;\n\n th,\n td {\n text-align: left;\n padding: 0.6em 0.8em;\n border-bottom: 1px solid var(--clr-border);\n vertical-align: middle;\n }\n\n th {\n font-size: 0.85em;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n opacity: 0.7;\n }\n\n tr.is-revoked {\n opacity: 0.6;\n }\n\n a {\n word-break: break-all;\n }\n }\n\n .badge,\n .token-list button.revoke {\n display: inline-block;\n padding: 0.2em 0.7em;\n border-radius: 999px;\n font-size: 0.85em;\n line-height: 1.5;\n white-space: nowrap;\n }\n\n .badge {\n background: transparent;\n border: 1px solid currentcolor;\n }\n\n .badge-active {\n color: light-dark(oklch(35% 0.16 145deg), oklch(75% 0.16 145deg));\n }\n\n .badge-revoked {\n color: var(--clr-text);\n }\n\n .token-list button.revoke {\n background: light-dark(oklch(92% 0.15 25deg), oklch(30% 0.12 25deg));\n color: light-dark(oklch(30% 0.15 25deg), oklch(92% 0.12 25deg));\n border: 1px solid transparent;\n cursor: pointer;\n transition: background-color 150ms ease;\n }\n\n .token-list button.revoke:hover {\n background: light-dark(oklch(80% 0.2 25deg), oklch(45% 0.18 25deg));\n }\n}\n","@layer components {\n .note {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--clr-border);\n border-radius: var(--border-radius);\n padding: 1ex 2ex;\n\n .e-content {\n > p:first-child {\n margin-block-start: 0;\n }\n\n .u-photo {\n width: 100%;\n height: auto;\n }\n }\n\n .syndication-links {\n display: flex;\n flex-direction: row;\n gap: 1ex;\n\n svg {\n border-radius: 4px;\n width: auto;\n height: 1lh;\n }\n }\n }\n\n .reply-to {\n font-size: 85%;\n margin-inline: 2ex;\n padding-inline: 1ex;\n border: 1px solid var(--clr-border);\n border-bottom: none;\n border-top-left-radius: var(--border-radius);\n border-top-right-radius: var(--border-radius);\n }\n}\n","@layer components {\n body > header {\n display: grid;\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto auto;\n align-items: baseline;\n gap: 1rem;\n\n a {\n text-decoration: none;\n }\n\n h1 {\n margin: 0;\n text-wrap: nowrap;\n }\n\n nav {\n display: flex;\n flex-direction: row;\n gap: .5rem;\n\n @media screen and (width <= 1100px) {\n grid-row: 2;\n grid-column: 1 / span 3;\n flex-wrap: wrap;\n }\n }\n }\n}\n"],"names":[]} \ No newline at end of file diff --git a/public/assets/css/app.css.zst b/public/assets/css/app.css.zst index d258af4911e60e0e789b20b7c9b38a6b5d8fb617..72d74415073995b6a8e3de562975b98edab3f986 100644 GIT binary patch literal 1762 zcmdPcs{c2oS#YTtgOuM9UJU_X7yb=Q7v^{9YchQg+#GF|Vr1C(;?u#R6dktTkG9{L zv2)F;EDj6N^9&amPBZ8iZHYT~qAvSJ>BF*pJ=dNuVDx=#@bYfAj_2<$Z!aDdyzl#A z)7|CAY7X68@KbnmdrkK~_t>I+>GRjlWm*{4_LlL{&$7upI}d79AF-nWJEdDai$vZsf&DJNy7VfX_Fx|amug=+TmYAG5 zUq(Ob#U=$^uFT3MM<-6}oZV}kc#L)HoJqBFl`P`^PWt!t{lyn2HW}=%m zYI}C6Y);&3pR{eu`4!SRfgA2`jji;TP~wQa$~fuE;d?)|MKp!_Yh?Ik)@>Hz`&@SC zQX{iSqmIGPY0h@fXE=GWTrv<_Y0AU0+Q@IhrxSttyEk4vKf&$$oreKzt1lP7$&O_W zx^_6i;l#x*pUC;k6CXZVT<9Dr!upUWkZ&=YjzCaze`f@rwDaNwThHuIbJnri&Y9b^ zCfR$f-tS_o&9OTR-`AdeKlzxrg5628OP3Dr)ZpT<@-5$^b+g{}m!rhyQ$43kXUF_r zbuZA`Rikd5a+CH;)@T90{Ht}=bLQW@(OY9^^w;VC9@U>WSlBL~T2_3qIkYNvWowkDxaCs z&-d3~DY*Fa^L3U>Wt>(MTJ$2=mt1qN_VatS_49I<>qjEk=U=%NUN5+qop0MrcTcGx zg`>6>t0x5<|K`6kU{a>9%A6yMJys+yU~sZL=~Y&}nw#y=ro>>YNmd(z%(q#e*%n;7 zL3sPu)YG1ibNXNRO*?YO?GoSOHw}B@%aTpM?N^n|dV5~i^Y96``4cD2DrOMk>MBZ^ z;j&gYaDVpG7DiScDT^nIr-+w)_H1xsIB3}g}Et-N0m zsbO|lc_A+^@7@1PI#Q>VS>!o8oa;Fu&{uz_?vOdpMt!2%XMboN9d6_&41$cLc zE_Jj>m~dF_ztrW%$`yqhgFM_)TvR-{CLMF+IFumKdh0Et&_xHnNv9N=JB)&qoE9l) ztqf^16`rtp!2~Jo)m&?w^iJmA7UC}tTM;K%(c&xV#Q7rh%BGLL;4T635X77D* z@fFJ*-H7F}{4bTGw4a7nODcSxbFa+p2-C{l)oJ-3oSN1D+V-$LsO1h_;7>s6 zzLTOg(VQr0?l?zB56m;dd3(_!|ojcdc-aGrHPy4%#0IbJeMIK$bvwYqax zpk?NaX}s%xWKZ5yYjDQeKcIJeCtLOA?3hlazpXcgFIx0WDQ!8eeo*UCK!H(G5v{)R&w2m$9wfyTh2VLV$$Qv;80<8 zS>n26Qo&10zP8x@s-6>N%5{8ZXDZjdmEc~jxwx?Mw5AW+-;-Ze_&+|F=yh$!!IzV& zZ!%^ST?*Qwd8O&v{tY#%6|eFVOj5ojcilPqbk&OLjnSn{YKf;kH-Edz?&)5Z%$fDi zD&*C(lxFECTYh-#t1z%Jd{D2L9U-sHy2QwCZm4>j3&X63wpTw`pV*$~?8wgfiqR#} zfv4Svx!|VFz2?iT7hS?#joepGObz{ic9HXq#tnK7!MA%HWh(AHy6n92OwjCnu{(z= z*ROs)B_WsX_NJtJ1xs6_8ysIQS=;=5THy-WIlWIxBr@1S#142|VY=niQ6YQpfw}x@ zg*(}k4L3F^Oju^nm6T{xamP*EAyjU0b+LWhhI#65GM>&j-4%ZMp4pM&-+Ok7XS;5b z%TLJv#_7ba@UMN&w|%XS0*Xr`mq&>&mgdW9{_AtHKw=xuyw_X5E$}ROZ{wp?sXXnq p$dNX;6PxSKbDhuEE?+nE=)7~^vXw-h9WMW8CnCI>DZs$g3IOtVP!0e9 literal 1479 zcmdPcs{c2If$yv?!zot}9(4uZIqVyle#{oz_K<6P@2tD$G`AdM5Z-wzrLKh6_(2(0 zwJ-~Zpp)wkhHVUc81Bcoc-~l??x)B1;#E`s8@Y{7|IV`fdvTq6iPx^>WLpN+p_$* zrMzc_(Q4N)Evt6@C2Mup>;91qtk_W3+iF|1BYh$_V@6`bG}bL97mPCRt`L>dYEM4? z)p*v0u#et9uI_ekR_?O<5fFOr?Cy;+7efnzJ$E_I{eN@ohVO@ax9VJYesbO%_1_{a zf^L4FmV3(2)IGZ2|Io8L7f-aADqp`gbye5m6|T&W_tu6ic^sp|V-QudAy=b&kwT5) zO3x*XJS<1Ll5;Vy_cOn+0MGAKJeI*3sa%SN;9_>J!hh7p8qKLJRm# z%;A3)HRp`iZ|O-|UKhT}9J%6Oetr@s-xT3)l|=W#DbM20t4!p5`u@a(N2gW>m~^!& zP2_E2?zr-3*@-tfMnV&M&txqqxiLj6C0{Ic`b!6Ozvu3Kx`~@zlj}sLtmtW(t$O{T zMSaRPwI}6T>ki+D4Hl~7Z@uT=G(-P zi$_jt{M?kXPF1en@?rNfrN8%1Br$6m*tHPA<<$y?kQRRGWa- z$dpjUZ#K7+zkhJ=jXjt2)F*G-62nWr+svOv>Aim`xcJuIlmze4Qm5 zoAD=nO=rQHY~9|J?Mtd&YdJY6%v@7+ZTgZ%y}i>ezsSs-lk)9+e){H*jRnq@4pO#aS0mn?xWctm_EOKYrSH=p=y!Aa z{Zlzwe%4)0@c!Yqm3(y(rHhzEnH=n9C&o9;d|0$0FZ!BPv&^0N_Xbb)6{<^Fsrk-3 zDz(8NZQjAxB7uv&Cxi&b3M#lZ`_8doD7(0QqM!dXTom@%bm0mukE97A^l)5W&Gd`;eDPQ0wyI^#5M(F6R8$ z=(cV$*Sj9=H4`lC6}Xt^WTtnBho5__U?D4TRwcA$`NEW})zu#rEfmbUpI`jlu8&?Ziq|K7fnxVShAZ|5}-oc2} z1Zn+8-zpyKgmwFH@^k6`ZgFAf_~WcqF@H}&(Zgkxi+731_84#Rt~-&sMk0f)yL6Xz zhUyOse!ZyyljoMqN|w#|bo2e~hu<@n&hzfPap|U-Ur6-6AAOhF5AlSaGRmF-0EE@J ASpWb4 diff --git a/resources/css/admin-tokens.css b/resources/css/admin-tokens.css new file mode 100644 index 00000000..42d83b13 --- /dev/null +++ b/resources/css/admin-tokens.css @@ -0,0 +1,65 @@ +@layer components { + .token-list { + width: 100%; + border-collapse: collapse; + margin-block-start: 1em; + + th, + td { + text-align: left; + padding: 0.6em 0.8em; + border-bottom: 1px solid var(--clr-border); + vertical-align: middle; + } + + th { + font-size: 0.85em; + text-transform: uppercase; + letter-spacing: 0.03em; + opacity: 0.7; + } + + tr.is-revoked { + opacity: 0.6; + } + + a { + word-break: break-all; + } + } + + .badge, + .token-list button.revoke { + display: inline-block; + padding: 0.2em 0.7em; + border-radius: 999px; + font-size: 0.85em; + line-height: 1.5; + white-space: nowrap; + } + + .badge { + background: transparent; + border: 1px solid currentcolor; + } + + .badge-active { + color: light-dark(oklch(35% 0.16 145deg), oklch(75% 0.16 145deg)); + } + + .badge-revoked { + color: var(--clr-text); + } + + .token-list button.revoke { + background: light-dark(oklch(92% 0.15 25deg), oklch(30% 0.12 25deg)); + color: light-dark(oklch(30% 0.15 25deg), oklch(92% 0.12 25deg)); + border: 1px solid transparent; + cursor: pointer; + transition: background-color 150ms ease; + } + + .token-list button.revoke:hover { + background: light-dark(oklch(80% 0.2 25deg), oklch(45% 0.18 25deg)); + } +} diff --git a/resources/css/app.css b/resources/css/app.css index f25e47e3..1f787028 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -8,3 +8,4 @@ @import url('notes.css'); @import url('pagination.css'); @import url('theme-selector.css'); +@import url('admin-tokens.css'); diff --git a/resources/views/admin/tokens/index.blade.php b/resources/views/admin/tokens/index.blade.php index 8836ab07..fe787ad9 100644 --- a/resources/views/admin/tokens/index.blade.php +++ b/resources/views/admin/tokens/index.blade.php @@ -7,21 +7,41 @@ @if($tokens->isEmpty())

No tokens have been issued.

@else -
    - @foreach($tokens as $token) -
  • - {{ $token->client_id }} — scope: {{ $token->scope }} — issued {{ $token->created_at->diffForHumans() }} - @if($token->isRevoked) - — revoked {{ $token->revoked_at->diffForHumans() }} - @else -
    - {{ csrf_field() }} - {{ method_field('PUT') }} - -
    - @endif -
  • - @endforeach -
+ + + + + + + + + + + + @foreach($tokens as $token) + + + + + + + + @endforeach + +
ClientScopeIssuedStatusAction
{{ $token->client_id }}{{ $token->scope }} + @if($token->isRevoked) + Revoked {{ $token->revoked_at->diffForHumans() }} + @else + Active + @endif + + @unless($token->isRevoked) +
+ {{ csrf_field() }} + {{ method_field('PUT') }} + +
+ @endunless +
@endif @stop