Compare commits

..

32 Commits

Author SHA1 Message Date
Simon Priet
202a145426
refactor(#28): Switch to 1 color hue (#30)
* refactor(#28): Switch to 1 color hue

* refactor(#28): Tweak colors
2023-05-30 17:31:20 +02:00
Simon Priet
3e4591400a
refactor(#28): Restore white border-top, fix active dropdown navbar, simplify code with :is() (#29) 2023-05-30 15:14:28 +02:00
Simon
4262b7a1ce Update animations 2023-05-26 01:15:58 +02:00
Simon Priet
2235768e70
Pagination blinkers (#23)
* refactor(#11): improve color & animation

* Add Blinkers animation to pagination arrows
2023-05-26 01:01:30 +02:00
Simon
101372cf1e Update ReadMe.md 2023-05-26 00:53:43 +02:00
Simon
c9663ccda1 Shorten width of user icons 2023-05-26 00:52:26 +02:00
Simon
00c891d93f Update Public & ReadMe.md with better .gif. 2023-05-26 00:49:29 +02:00
Simon Priet
222600931f
Update README.md 2023-05-26 00:37:43 +02:00
Simon Priet
a308750358
Update ReadMe.md & public (#22) 2023-05-26 00:36:40 +02:00
Simon Priet
aabc43862a
Whiten Sigils (#21) 2023-05-26 00:29:21 +02:00
Simon Priet
617ce513c3
adapte Alkessian.less to Salsify's Jira (#20) 2023-05-26 00:22:00 +02:00
Simon Priet
cd6c1deb22
Change PERF hue to Duck Blue (#16) 2023-05-25 23:50:18 +02:00
Simon Priet
6b1372ec5f
Set animation for loading only (#19)
* Set all envs to animate on loading only

* Update Readme.md & publics

* Remove spaces in files

* Create gifs & Update ReadMe.md
2023-05-25 23:43:11 +02:00
Simon Priet
96e881af5e
Hue the Navbar with notification banner (#17)
* Hue the Navbar with notification banner

* Disable default color setting as it overrides other values

* Update ReadMe.md and publics
2023-05-25 23:39:18 +02:00
Simon Priet
ff6e7d916b
Update README.md 2023-05-25 23:16:50 +02:00
Simon Priet
d258f86c9a
Set envs to animate on loading only (except PROD) (#18)
Simply update the code with what i've been using lately so it only animate when the `.Loader` is created by react. Except for PROD where animation runs anytime.

Use both the new `:has()` pseudo-class and fallback to regular `:not(:only-child())` for unsupported browser (Firefox)
2023-05-25 23:15:05 +02:00
Simon Priet
18ff7c284e
Merge pull request #15 from alk-spriet/7-fix-smx-white-menu-item
fix SUT recent changes in front
2023-05-23 16:01:03 +02:00
Simon
2c8e9ee011 fix SUT recent changes in front 2023-05-23 16:00:23 +02:00
Simon Priet
d78bf58133
Merge pull request #14 from alk-spriet/squared-logo-place
feat(13): fix rounded place logo
2023-04-05 21:49:13 +02:00
Simon
27db23fdb9 feat(13): fix rounded place logo 2023-04-05 21:48:26 +02:00
Simon Priet
66aa9f498f
Merge pull request #12 from alk-spriet/pagination-blinkers
feat(#11): Add new style with blinkers animations
2023-03-24 17:42:18 +01:00
Simon
27a3c0a308 feat(#11): Add new style with blinkers animations 2023-03-24 17:41:51 +01:00
Simon Priet
2c84246592
Merge pull request #10 from alk-spriet/rename-LDTG-to-PERF
fix: rename LTG to PERF
2023-03-24 15:55:53 +01:00
Simon
ffaf55a3ad fix: rename LTG to PERF 2023-03-24 15:55:15 +01:00
Simon Priet
41b8c14273
Merge pull request #9 from alk-spriet/7-fix-smx-white-menu-item
fix(#7): Converted to .less and added fix for this menu-item
2023-03-24 15:46:16 +01:00
Simon
9233393976 fix(#7): Converted to .less and added fix for this mennu-item 2023-03-24 15:45:00 +01:00
Simon
22a4fcc735 fix: Fix new menu item standing in black 2023-03-24 12:45:59 +01:00
Simon
e908073c7a fix(whiter): update domains of application 2022-12-15 15:40:41 +01:00
Simon
9fc42d211d fix(Sigils): change retailer color to match FF container 2022-12-15 15:39:55 +01:00
Simon
1893c1bfd3 fix(prod banner): update gradient to new status 2022-12-15 15:32:58 +01:00
Simon
06744a0df9 fix(sigils): remove redondante domains 2022-12-15 15:30:51 +01:00
Simon
ac89147f8c fix(5): Detect via a sibling css selector 2022-12-09 17:25:33 +01:00
44 changed files with 282 additions and 170 deletions

8
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,8 @@
{
"conventionalCommits.scopes": [
"#11",
"13",
"#28",
"#28"
]
}

17
Blinkers.less Normal file
View File

@ -0,0 +1,17 @@
@-moz-document domain("supplierxm.salsify.com"),
domain("alkemics.com") {
button:not([disabled]) .mdi-arrow-right-bold,
button:not([disabled]) .mdi-arrow-left-bold {
&:not([disabled]):hover {
animation: car-blinkers 900ms steps(1, end) infinite;
}
}
@keyframes car-blinkers {
45% {
color: rgb(0, 190, 0);
/*filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.15));*/
}
}
}

53
Jirafy.less Normal file
View File

@ -0,0 +1,53 @@
@-moz-document domain("atlassian.net") {
/*@font-face {
font-family: "Charlie Text";
src: url("https://wac-cdn.atlassian.com/static/master/4260/assets/build/fonts/charlie-sans/charlie-text/Charlie_Text-Regular.woff2") format("woff");
src: url("https://wac-cdn.atlassian.com/static/master/4260/assets/build/fonts/charlie-sans/charlie-text/Charlie_Text-Semibold.woff2") format("woff");
src: url("https://wac-cdn.atlassian.com/static/master/4260/assets/build/fonts/charlie-sans/charlie-text/Charlie_Text-Bold.woff2") format("woff");
src: url("https://wac-cdn.atlassian.com/static/master/4260/assets/build/fonts/charlie-sans/charlie-text/Charlie_Text-Black.woff2") format("woff");
}*/
/* Shorten the Salsify Icon */
header nav img {
filter: hue-rotate(30deg);
// max-width: 90px !important;
width: 32px;
height: 32px;
object-fit: cover;
object-position: left;
}
header nav:has(img:first-of-type) a {
margin: unset;
}
/* Buttons */
header a,
header button {
background-color: transparent !important;
svg {
transition: transform .2s;
}
&[aria-expanded="true"] {
color: var(--ds-text-subtle, hsl(218, 31%, 30%)) !important;
background-color: var(--ds-background-neutral-pressed, hsla(216, 100%, 40%, 0.2)) !important;
svg {
transform: rotate(-0.25turn);
}
}
&#createGlobalItem {
border-radius: 2px;
color: var(--ds-text-subtle, hsl(218, 31%, 30%));
&:hover {
outline: 3px solid var(--ds-background-neutral-hovered, hsla(216, 100%, 40%, 0.8));
}
}
}
}

View File

@ -1,23 +0,0 @@
@-moz-document domain("ltg-stream.alkemics.com"),
domain("ltg-admin.alkemics.com") {
:root {
--stripe-size: 100px;
--color1: hsl(261, 65%, 51%);
--color2: hsl(261, 80%, 59%);
--duration: 30s;
}
.AuthLayoutFooter,
.Navbar.navbar.bg-inverse {
background: repeating-linear-gradient(-45deg, var(--color2) 25%, var(--color1) 75%);
background-size: var(--stripe-size) var(--stripe-size);
animation: alkegrad var(--duration) linear infinite;
}
@keyframes alkegrad {
from {
background-position: 0 0;
}
to {
background-position: var(--stripe-size) 0;
}
}
}

32
Navbar color on Notif.css Normal file
View File

@ -0,0 +1,32 @@
@-moz-document domain("supplierxm.salsify.com"),
domain("alkemics.com") {
/*:root {
--color1: hsla(194, 71%, 30%, 1);
--navbar-gradient-color: rgb(20, 157, 199);
}*/
.PageTop>.Navbar::after {
background-color: var(--navbar-gradient-color);
position: absolute;
bottom: 0;
left: 0;
height: 0%;
width: 100%;
z-index: -1;
transition: height .4s ease 0s;
}
.PageTop>.Navbar--PPR:has(+ :is(.NotificationAnimation-enter-done, .NotificationAnimation-enter-active))::after {
height: 100%;
}
.PageTop>.Navbar:has(+ .Notification--success) {
--navbar-gradient-color: #48b071;
}
.PageTop>.Navbar:has(+ .Notification--error) {
--navbar-gradient-color: #e64c42;
}
}

45
PERF banner.css Normal file
View File

@ -0,0 +1,45 @@
@-moz-document domain("ltg-app.supplierxm.salsify.com"),
domain("ltg-admin.supplierxm.salsify.com") {
:root {
--stripe-size: 100px;
--color1: hsl(180, 78%, 35%);
--color2: rgba(0, 0, 0, 0.15);
--duration: 1s;
--state: running;
}
.AuthLayoutFooter,
.Navbar.navbar.Navbar--PPR.bg-inverse {
background: repeating-linear-gradient(-45deg, var(--color2) 25%, var(--color2) 50%, transparent 50%, transparent 75%);
background-color: var(--color1);
background-size: var(--stripe-size) var(--stripe-size);
animation: alkegrad var(--duration) linear 0s infinite normal var(--state);
transition: background 200ms linear;
}
.AuthLayoutFooter {
--stripe-size: 200px;
--duration: 40s;
}
.PageTop>.navbar:where( :has(+ .Loader),
:not(:only-child)) {
--state: running;
}
.PageTop>.Loader {
visibility: hidden;
animation: none;
}
@keyframes alkegrad {
from {
background-position: 0 0;
}
to {
background-position: var(--stripe-size) 0;
}
}
}

View File

@ -1,20 +1,41 @@
@-moz-document domain("pillar.alkemics.com") { @-moz-document domain("pillar.alkemics.com"),
domain("localstream.alkemics.com") {
:root { :root {
--stripe-size: 100px; --stripe-size: 100px;
--color1: hsl(205, 70%, 45%); --color1: hsl(220, 100%, 63%);
--color2: hsl(205, 70%, 50%); --color2: rgba(0, 0, 0, 0.15);
--duration: 30s; --duration: 1s;
--state: paused;
} }
.AuthLayoutFooter, .AuthLayoutFooter,
.Navbar.navbar.bg-inverse { .Navbar.navbar.Navbar--PPR.bg-inverse {
background: repeating-linear-gradient(-45deg, var(--color2) 25%, var(--color1) 75%); background: repeating-linear-gradient(-45deg, var(--color2) 25%, var(--color2) 50%, transparent 50%, transparent 75%);
background-color: var(--color1);
background-size: var(--stripe-size) var(--stripe-size); background-size: var(--stripe-size) var(--stripe-size);
animation: alkegrad var(--duration) linear infinite; animation: alkegrad var(--duration) linear 0s infinite normal var(--state);
} }
.AuthLayoutFooter {
--stripe-size: 200px;
--duration: 40s;
}
.PageTop>.navbar:where( :has(+ .Loader),
:not(:only-child)) {
--state: running;
}
.PageTop>.Loader {
visibility: hidden;
animation: none;
}
@keyframes alkegrad { @keyframes alkegrad {
from { from {
background-position: 0 0; background-position: 0 0;
} }
to { to {
background-position: var(--stripe-size) 0; background-position: var(--stripe-size) 0;
} }

View File

@ -1,25 +1,42 @@
@-moz-document domain("ppr-app.supplierxm.salsify.com"), @-moz-document domain("ppr-app.supplierxm.salsify.com"),
domain("ppr-admin.alkemics.com") { domain("ppr-admin.supplierxm.salsify.com/") {
:root { :root {
--stripe-size: 100px; --stripe-size: 100px;
--color1: hsl(194, 71%, 30%); --color1: hsl(194, 77%, 35%);
--color2: hsl(194, 77%, 35%); --color2: rgba(0, 0, 0, 0.15);
--duration: 20s; --duration: 1s;
--state: paused;
} }
.AuthLayoutFooter, .AuthLayoutFooter,
.Navbar.navbar.Navbar--PPR.bg-inverse { .Navbar.navbar.Navbar--PPR.bg-inverse {
background: repeating-linear-gradient(-45deg, var(--color2) 25%, var(--color1) 50%, var(--color1) 75%); background: repeating-linear-gradient(-45deg, var(--color2) 25%, var(--color2) 50%, transparent 50%, transparent 75%);
background-color: var(--color1);
background-size: var(--stripe-size) var(--stripe-size); background-size: var(--stripe-size) var(--stripe-size);
animation: alkegrad var(--duration) linear infinite; animation: alkegrad var(--duration) linear 0s infinite normal var(--state);
will-change: background-position;
} }
.AuthLayoutFooter { .AuthLayoutFooter {
--stripe-size: 200px; --stripe-size: 200px;
--duration: 40s; --duration: 40s;
} }
.PageTop>.navbar:where( :has(+ .Loader),
:not(:only-child)) {
--state: running;
}
.PageTop>.Loader {
visibility: hidden;
animation: none;
}
@keyframes alkegrad { @keyframes alkegrad {
from { from {
background-position: 0 0; background-position: 0 0;
} }
to { to {
background-position: var(--stripe-size) 0; background-position: var(--stripe-size) 0;
} }

View File

@ -1,18 +1,22 @@
@-moz-document domain("app.supplierxm.salsify.com"), @-moz-document domain("app.supplierxm.salsify.com"),
domain("admin.supplierxm.salsify.com") { domain("admin.supplierxm.salsify.com") {
.AuthLayoutFooter, .AuthLayoutFooter,
.Navbar.navbar.bg-inverse { .Navbar.navbar.bg-inverse {
background: linear-gradient(-45deg, #00e1d0, #00c4ff, #0562e8, #8a25f9); background: linear-gradient(-45deg, rgb(60, 180, 255), rgb(46, 112, 255), rgb(118, 55, 252));
background-size: 400% 100% !important; background-size: 200% 100% !important;
animation: salsigrad 60s linear infinite !important; animation: salsigrad 60s linear infinite !important;
} }
@keyframes salsigrad { @keyframes salsigrad {
0% { 0% {
background-position: 0% 0%; background-position: 0% 0%;
} }
50% { 50% {
background-position: 100% 50%; background-position: 100% 50%;
} }
100% { 100% {
background-position: 0% 0%; background-position: 0% 0%;
} }

View File

@ -19,17 +19,23 @@ Repeate for each styles you want to enables.
## What each styles do? ## What each styles do?
* `PPR banner.css`: Change the Preproduction banner and login's footer * `PREP banner.css`: Change the Preproduction banner and login's footer
![example of PPR banner](public/PPR_banner_ex.png) ![example of PREP banner](public/PREP_banner.jpg)
* `PLR banner.css`: Change your Pillar banner and login's footer * `PLLR banner.css`: Change your Pillar banner and login's footer
![example of Pillar banner](public/PLR_banner_ex.png) ![example of PLLR banner](public/PLLR_banner.jpg)
* `LTG banner.css`: Change the Load Testing banner and login's footer * `PERF banner.css`: Change the Load Testing banner and login's footer
* `PRD banner.css`: Change the Production banner and login's footer ![example of PERF banner](public/PERF_banner.jpg)
![example of Prod banner](public/PRD_banner_ex.png) * `PROD banner.css`: Change the Production banner and login's footer
![example of Prod banner](public/PROD_banner_animated.gif)
* `Whiter banner.css`: Look & feel, mainly changing text to pure white and the hover and active elements. A _must have_. Works with the others files. * `Whiter banner.css`: Look & feel, mainly changing text to pure white and the hover and active elements. A _must have_. Works with the others files.
* `Retailers Sigils.css`: Change the top-right user icon to a Shop one, and make it orange. It actually don't know if you are logged as a Retailer or not. * `Navbar color on Notif.css`: Emphase the notification banner by coloring the navbar as well, with a nice and tidy `transition`.
* ![example of orange shop icon](public/user-orange-shop.png) ![example of Color switching](public/navbar-notification-animated.gif)
* `Suppliers Sigils.css`: change the top-right user icon to a Factory one, and make it turquoise. It actually don't know if you are logged as a Manufacturer or not. * `Squared logo place`: Remove the `border-radius` used for company logos, to allow more shapes than just circles.
* ![example of orange shop icon](public/user-teal-factory.png) ![example of a not-cicle logo that can takes all space](public/squared-logo.png)
* `Alkessian.less`: Change the black navbar of Jira & Confluence back to the default white one and add slight animations. * `Blinkers.less`: Enable your blinkers when you use pagination arrows.
![example of Confluence navbar](public/alkessian-banner.png) ![Example of blinkers](public/pagniation-are-blinkers.gif)
* `Sigils.css`: Change the top-right user icon to a Shop or Factory depending on if you are logged as ar Retailer or a Supplier.
* ![example of factory icon](public/user-white-factory.png) ![example of shop icon](public/user-white-shop.png)
* `Jirafy.less`: Animate the Jira navbar with a light rotation on buttons. Lighten the Create button as well.
![icon take less space](public/jirafy-small-icon.png)
![nice animation on click](public/jirafy-animated.gif)

View File

@ -1,9 +0,0 @@
@-moz-document domain("app.supplierxm.salsify.com"),
domain("ppr-app.supplierxm.salsify.com"),
domain("ltg-stream.alkemics.com"),
domain("int.alkemics.com") {
#navbar-profile .dropdown-toggle .mdi-account::before {
content: "\F4DC";
color: orange;
}
}

12
Sigils.css Normal file
View File

@ -0,0 +1,12 @@
@-moz-document domain("salsify.com"),
domain("alkemics.com") {
li.HelpCenter#academy-access~li#navbar-profile>a>i.mdi-account::before {
content: "\F20F";
/*color: violet;*/
}
li.HelpCenter:not(#academy-access)~li#navbar-profile>a>i.mdi-account::before {
content: "\F4DC";
/*color: coral;*/
}
}

6
Squared logo place.css Normal file
View File

@ -0,0 +1,6 @@
@-moz-document domain("supplierxm.salsify.com"),
domain("alkemics.com") {
.MultipleOrganizationLabel>img {
border-radius: initial;
}
}

View File

@ -1,9 +0,0 @@
@-moz-document domain("app.supplierxm.salsify.com"),
domain("ppr-app.supplierxm.salsify.com"),
domain("ltg-stream.alkemics.com"),
domain("int.alkemics.com") {
#navbar-profile .dropdown-toggle .mdi-account::before {
content: "\F20F";
color: turquoise;
}
}

View File

@ -1,22 +0,0 @@
@-moz-document domain("app.supplierxm.salsify.com"),
domain("ppr-app.supplierxm.salsify.com"),
domain("ltg-stream.alkemics.com"),
domain("int.alkemics.com") {
.Navbar {
color: white !important;
}
.Navbar .active {
color: white !important;
font-weight: bold !important;
}
.Navbar a.nav-link:hover {
color: white !important;
font-weight: bold !important;
}
.Navbar__menu>li.nav-item a.nav-link.active:after {
background: white;
}
.AuthLayoutFooter__logo {
border-top: 1px solid #fff;
}
}

31
Whiter banner.less Normal file
View File

@ -0,0 +1,31 @@
@-moz-document domain("supplierxm.salsify.com"),
domain("alkemics.com") {
.Navbar.bg-inverse {
--white: white;
--bold: bold;
color: var(--white);
a.nav-link,
.SharingUnitDropdown__DropdownLabel {
color: var(--white) !important;
&:is(.active, :hover),
.SharingUnitDropdown__DropdownLabelActive {
color: var(--white) !important;
font-weight: var(--bold) !important;
.SharingUnitDropdown__OptionText {
font-weight: 300;
}
}
&::after {
background: white !important;
}
}
}
.AuthLayoutFooter__logo {
border-top-color: #fff;
}
}

View File

@ -1,77 +0,0 @@
/* ==UserStyle==
@name Alkessian
@type less
@homepageURL .
@originalMD5 076868a0c478e1e1daef8e0dfb34cf70
==/UserStyle== */
@-moz-document domain("alkemics.atlassian.net") {
/* Header itself */
header {
background-color: var(--ds-surface, white) !important;
color: var(--ds-text-subtlest, #42526e) !important;
font-family: "Charlie Text", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, "Droid Sans", "Helvetica Neue", sans-serif;
--icon-primary-color: var(--ds-text-subtlest, #42526e) !important;
}
/* Alkemics Logos */
header nav img {
filter: invert(1) hue-rotate(180deg);
max-width: 90px !important;
width: 28px;
height: 32px;
object-fit: none;
object-position: 45%;
}
header nav a:first-of-type {
margin-right: 0;
&:hover {
background-color: transparent;
}
}
/* Buttons */
header a,
header button {
background-color: transparent !important;
color: var(--ds-text-subtlest, #42526e) !important;
svg {
--icon-secondary-color: white;
transition: transform .2s;
}
&:hover {
color: var(--ds-text-subtle, hsl(216, 100%, 40%)) !important;
background-color: var(--ds-background-neutral-hovered, hsla(216, 100%, 40%, 0.1)) !important;
}
&[aria-expanded="true"] {
color: var(--ds-text-subtle, hsl(216, 100%, 40%)) !important;
background-color: var(--ds-background-neutral-pressed, hsla(216, 100%, 40%, 0.2)) !important;
svg {
transform: rotatex(0.5turn);
}
}
&#createGlobalItem {
border-radius: 2px;
&:hover {
outline: 3px solid var(--ds-background-neutral-hovered, hsla(216, 100%, 40%, 0.8));
}
}
}
/* Search box */
header input {
box-shadow: none !important;
outline: 1px solid rgba(66, 83, 110, 0.4) !important;
border: none !important;
border-radius:3px !important;
background-color: var(--ds-surface, white) !important;
&::placeholder {
color: var(--ds-text-subtlest, #42526e) !important;
}
&:hover:not(:focus) {
color: var(--ds-text-subtle, hsl(216, 100%, 40%)) !important;
background-color: var(--ds-background-neutral-hovered, hsla(216, 100%, 40%, 0.1)) !important;
outline: 3px solid hsla(216, 100%, 40%, 0.8) !important;
}
&:focus {
outline: 3px solid hsla(216, 100%, 40%, 0.8) !important;
}
}
}

BIN
public/PERF_banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

BIN
public/PLLR_banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

BIN
public/PREP_banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

BIN
public/PROD_banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

BIN
public/jirafy-animated.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
public/squared-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
public/user-white-shop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB