summaryrefslogtreecommitdiffstats
path: root/src/styles
diff options
context:
space:
mode:
Diffstat (limited to 'src/styles')
-rw-r--r--src/styles/abstracts/_placeholders.scss1
-rw-r--r--src/styles/abstracts/placeholders/_layout.scss25
-rw-r--r--src/styles/base/_base.scss16
-rw-r--r--src/styles/base/_fonts.scss12
-rw-r--r--src/styles/base/_helpers.scss6
-rw-r--r--src/styles/base/_spacings.scss10
-rw-r--r--src/styles/base/_typography.scss64
-rw-r--r--src/styles/components/_wp-blocks.scss166
-rw-r--r--src/styles/globals.scss10
-rw-r--r--src/styles/pages/Home.module.scss49
-rw-r--r--src/styles/pages/Projects.module.scss13
-rw-r--r--src/styles/pages/article.module.scss37
-rw-r--r--src/styles/pages/contact.module.scss3
-rw-r--r--src/styles/pages/cv.module.scss3
-rw-r--r--src/styles/pages/home.module.scss36
-rw-r--r--src/styles/pages/partials/_article-headings.scss57
-rw-r--r--src/styles/pages/partials/_article-links.scss204
-rw-r--r--src/styles/pages/partials/_article-lists.scss65
-rw-r--r--src/styles/pages/partials/_article-media.scss20
-rw-r--r--src/styles/pages/partials/_article-prism.scss302
-rw-r--r--src/styles/pages/partials/_article-wp-blocks.scss177
-rw-r--r--src/styles/pages/project.module.scss10
-rw-r--r--src/styles/pages/projects.module.scss11
-rw-r--r--src/styles/pages/topic.module.scss6
-rw-r--r--src/styles/vendors/_prism.scss297
25 files changed, 980 insertions, 620 deletions
diff --git a/src/styles/abstracts/_placeholders.scss b/src/styles/abstracts/_placeholders.scss
index d1c0a7a..18b1c03 100644
--- a/src/styles/abstracts/_placeholders.scss
+++ b/src/styles/abstracts/_placeholders.scss
@@ -1,3 +1,4 @@
@forward "./placeholders/animations";
@forward "./placeholders/clearfix";
+@forward "./placeholders/layout";
@forward "./placeholders/list";
diff --git a/src/styles/abstracts/placeholders/_layout.scss b/src/styles/abstracts/placeholders/_layout.scss
new file mode 100644
index 0000000..1a28acb
--- /dev/null
+++ b/src/styles/abstracts/placeholders/_layout.scss
@@ -0,0 +1,25 @@
+@use "@styles/abstracts/mixins" as mix;
+
+%grid {
+ display: grid;
+ align-items: center;
+ grid-template-columns:
+ minmax(0, 1fr) min(calc(100vw - calc(var(--spacing-md) * 2)), 80ch)
+ var(--column-3, minmax(0, 1fr));
+ column-gap: var(--grid-gap, var(--spacing-md));
+
+ @include mix.media("screen") {
+ @include mix.dimensions("md") {
+ grid-template-columns:
+ minmax(0, 1fr) clamp(60ch, 60vw, 80ch)
+ var(--column-3, minmax(0, 3fr));
+ column-gap: var(--grid-gap, var(--spacing-xl));
+ }
+
+ @include mix.dimensions("lg") {
+ grid-template-columns:
+ minmax(0, 1fr) clamp(47ch, 47vw, 80ch)
+ var(--column-3, minmax(0, 1fr));
+ }
+ }
+}
diff --git a/src/styles/base/_base.scss b/src/styles/base/_base.scss
index 25ef393..1ec5494 100644
--- a/src/styles/base/_base.scss
+++ b/src/styles/base/_base.scss
@@ -70,14 +70,6 @@ body {
flex-flow: column nowrap;
min-height: 100vh;
background: var(--color-bg);
- border-top: max(0.4vw, fun.convert-px(6)) solid;
- border-bottom: max(0.4vw, fun.convert-px(6)) solid;
- border-image: radial-gradient(
- ellipse at center,
- var(--color-primary-lighter) 20%,
- var(--color-primary) 100%
- )
- 1;
color: var(--color-fg);
font-family: var(--font-family-primary);
font-size: var(--font-size-md);
@@ -89,4 +81,12 @@ body {
display: flex;
flex-flow: column nowrap;
height: 100%;
+ border-top: max(0.4vw, fun.convert-px(6)) solid;
+ border-bottom: max(0.4vw, fun.convert-px(6)) solid;
+ border-image: radial-gradient(
+ ellipse at center,
+ var(--color-primary-lighter) 20%,
+ var(--color-primary) 100%
+ )
+ 1;
}
diff --git a/src/styles/base/_fonts.scss b/src/styles/base/_fonts.scss
index 88850bb..c8695d4 100644
--- a/src/styles/base/_fonts.scss
+++ b/src/styles/base/_fonts.scss
@@ -139,32 +139,32 @@
--font-family-mono: #{var.$font-family_mono};
--font-size-sm: clamp(
#{math.div(var.font-size("sm"), 1.2)},
- 1ex + 1vw,
+ 2ex + 1vmin,
#{var.font-size("sm")}
);
--font-size-md: clamp(
#{var.font-size("sm")},
- 1ex + 2vw,
+ 2ex + 2vmin,
#{var.font-size("md")}
);
--font-size-lg: clamp(
#{var.font-size("md")},
- 1ex + 3vw,
+ 2ex + 3vmin,
#{var.font-size("lg")}
);
--font-size-xl: clamp(
#{var.font-size("lg")},
- 1ex + 4vw,
+ 2ex + 4vmin,
#{var.font-size("xl")}
);
--font-size-2xl: clamp(
#{var.font-size("xl")},
- 1ex + 5vw,
+ 2ex + 5vmin,
#{var.font-size("2xl")}
);
--font-size-3xl: clamp(
#{var.font-size("2xl")},
- 1ex + 6vw,
+ 2ex + 6vmin,
#{var.font-size("3xl")}
);
--line-height: #{var.$line-height};
diff --git a/src/styles/base/_helpers.scss b/src/styles/base/_helpers.scss
index d28811c..3879643 100644
--- a/src/styles/base/_helpers.scss
+++ b/src/styles/base/_helpers.scss
@@ -28,17 +28,11 @@
display: block;
width: auto;
height: auto;
- padding: var(--spacing-xs) var(--spacing-sm);
left: var(--spacing-2xs);
top: var(--spacing-xs);
z-index: 100000;
- background: var(--color-primary);
- box-shadow: fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
- var(--color-shadow-dark);
clip: auto !important;
color: var(--color-fg-inverted);
- font-size: var(--font-size-md);
- font-weight: 600;
}
}
diff --git a/src/styles/base/_spacings.scss b/src/styles/base/_spacings.scss
index 08c3c3f..7c8b210 100644
--- a/src/styles/base/_spacings.scss
+++ b/src/styles/base/_spacings.scss
@@ -24,13 +24,5 @@
--spacing-xl: clamp(#{var.spacing("lg")}, 1ex + 4vw, #{var.spacing("xl")});
--spacing-2xl: clamp(#{var.spacing("xl")}, 1ex + 5vw, #{var.spacing("2xl")});
--spacing-3xl: clamp(#{var.spacing("2xl")}, 1ex + 6vw, #{var.spacing("3xl")});
- --toolbar-size: #{fun.convert-px(65)};
-}
-
-@include mix.media("screen") {
- @include mix.dimensions("sm") {
- :root {
- --toolbar-size: 0px;
- }
- }
+ --toolbar-size: #{fun.convert-px(80)};
}
diff --git a/src/styles/base/_typography.scss b/src/styles/base/_typography.scss
index f1cb38a..2c3c8cc 100644
--- a/src/styles/base/_typography.scss
+++ b/src/styles/base/_typography.scss
@@ -1,5 +1,4 @@
@use "@styles/abstracts/functions" as fun;
-@use "@styles/abstracts/variables" as var;
h1 {
font-size: var(--font-size-3xl);
@@ -116,34 +115,28 @@ dl {
ul,
ol,
dl {
- margin: var(--spacing-md) 0;
+ margin: var(--spacing-sm) 0;
& & {
margin: var(--spacing-2xs) 0 0;
}
-}
-
-dt {
- flex: 0 0 max-content;
- font-weight: 600;
-}
-dd {
- flex: 0 0 auto;
- margin: 0;
+ ::marker {
+ color: var(--color-primary-dark);
+ }
}
a {
background: linear-gradient(to top, var(--color-primary) 50%, transparent 50%)
- 0 0 / 100% 200% no-repeat;
+ 0 0 / 100% 201% no-repeat;
color: var(--color-primary);
- text-decoration-thickness: 13%;
+ text-decoration-thickness: 0.15em;
text-underline-offset: 20%;
transition: all 0.3s linear 0s, text-decoration 0.18s ease-in-out 0s;
&:hover {
color: var(--color-primary-light);
- text-decoration-thickness: 23%;
+ text-decoration-thickness: 0.25em;
}
&:focus {
@@ -156,39 +149,6 @@ a {
color: var(--color-primary-dark);
text-decoration-thickness: 18%;
}
-
- &.external {
- &::after {
- display: inline-block;
- content: "\0000a0"url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
- }
-
- &:focus:not(:active)::after {
- content: "\0000a0"url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
- }
- }
-
- &[hreflang] {
- &::after {
- display: inline-block;
- content: "\0000a0["attr(hreflang) "]";
- font-size: var(--font-size-sm);
- }
-
- &.external {
- &::after {
- content: "\0000a0["attr(hreflang) "]\0000a0"url(fun.encode-svg(
- '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'
- ));
- }
-
- &:focus:not(:active)::after {
- content: "\0000a0["attr(hreflang) "]\0000a0"url(fun.encode-svg(
- '<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'
- ));
- }
- }
- }
}
button,
@@ -233,13 +193,3 @@ pre {
word-break: normal;
word-wrap: normal;
}
-
-figure {
- margin: var(--spacing-md) 0;
-}
-
-figcaption {
- margin-top: var(--spacing-xs);
- font-size: var(--font-size-sm);
- text-align: center;
-}
diff --git a/src/styles/components/_wp-blocks.scss b/src/styles/components/_wp-blocks.scss
deleted file mode 100644
index efd6db5..0000000
--- a/src/styles/components/_wp-blocks.scss
+++ /dev/null
@@ -1,166 +0,0 @@
-@use "@styles/abstracts/functions" as fun;
-@use "@styles/abstracts/mixins" as mix;
-@use "@styles/abstracts/placeholders";
-
-.wp-block-quote {
- margin: var(--spacing-sm) 0;
- padding: var(--spacing-sm);
- position: relative;
- border: fun.convert-px(1) solid var(--color-primary-lighter);
- border-left: fun.convert-px(5) solid var(--color-primary-lighter);
- box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
- fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
- var(--color-shadow-light),
- fun.convert-px(3) fun.convert-px(3) fun.convert-px(6) 0
- var(--color-shadow-light);
- font-style: italic;
-
- > *:last-child {
- margin: 0;
- }
-
- cite {
- font-size: var(--font-size-sm);
- font-style: normal;
- font-weight: 600;
- }
-}
-
-.wp-block-code,
-.wp-block-preformatted {
- margin: 0 auto var(--spacing-md);
- padding: var(--spacing-xs) var(--spacing-sm);
- background: var(--color-bg-secondary);
- border: fun.convert-px(1) solid var(--color-border-light);
- color: var(--color-fg);
-}
-
-.wp-block-columns {
- display: grid;
- grid-template-columns: minmax(0, 1fr);
- gap: var(--spacing-md);
- margin: var(--spacing-md) 0;
-
- @include mix.media("screen") {
- @include mix.dimensions("sm") {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
- }
-
- &.are-vertically-aligned-center {
- align-items: center;
- }
-}
-
-.wp-block-column {
- > *:first-child {
- margin-top: 0;
- }
-
- > *:last-child {
- margin-bottom: 0;
- }
-}
-
-.wp-block-gallery {
- display: grid;
- grid-template-columns: minmax(0, 1fr);
- gap: var(--spacing-sm);
-
- .blocks-gallery-grid {
- @extend %reset-list;
-
- grid-column: 1 / -1;
- grid-row: 1 / -1;
- display: grid;
- grid-template-columns: minmax(0, 1fr);
- gap: var(--spacing-sm);
- }
-
- .blocks-gallery-item {
- figure {
- margin: 0;
- }
-
- a {
- display: block;
- box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
- fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
- var(--color-shadow-light),
- fun.convert-px(3) fun.convert-px(3) fun.convert-px(6) 0
- var(--color-shadow-light);
-
- &:hover,
- &:focus {
- transform: scale(1.05);
- box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
- fun.convert-px(3) fun.convert-px(3) fun.convert-px(2) 0
- var(--color-shadow-light),
- fun.convert-px(5) fun.convert-px(5) fun.convert-px(8) 0
- var(--color-shadow-light);
- }
-
- &:focus {
- outline: solid var(--color-primary-light);
- }
-
- &:active {
- transform: scale(0.95);
- box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
- fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
- var(--color-shadow-light),
- 0 0 0 0 var(--color-shadow-light);
- outline: none;
- }
- }
- }
-
- &.aligncenter {
- .blocks-gallery-grid {
- align-items: center;
- }
- }
-
- @for $i from 0 to 6 {
- &.columns-#{$i} {
- @include mix.media("screen") {
- @include mix.dimensions("xs") {
- grid-template-columns: repeat(2, minmax(0, 1fr));
-
- .blocks-gallery-grid {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
- }
-
- @include mix.dimensions("sm") {
- grid-template-columns: repeat(#{$i}, minmax(0, 1fr));
-
- .blocks-gallery-grid {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
- }
- }
- }
- }
-}
-
-.wp-block-image {
- img {
- display: block;
- margin: auto;
- box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
- fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
- var(--color-shadow-light),
- fun.convert-px(3) fun.convert-px(3) fun.convert-px(6) 0
- var(--color-shadow-light);
- text-align: center;
- }
-}
-
-.wp-block-video {
- box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
- fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
- var(--color-shadow-light),
- fun.convert-px(3) fun.convert-px(3) fun.convert-px(6) 0
- var(--color-shadow-light);
-}
diff --git a/src/styles/globals.scss b/src/styles/globals.scss
index f9a1281..8ece909 100644
--- a/src/styles/globals.scss
+++ b/src/styles/globals.scss
@@ -6,7 +6,6 @@
* Import each files separately to define vendors styles order.
*/
@use "modern-normalize";
-@use "vendors/prism";
/**
* 2.0. Base
@@ -22,14 +21,7 @@
@use "base/typography";
/**
- * 3.0. Components
- *
- * Define styles for external components (like WordPress blocks).
- */
-@use "components/wp-blocks";
-
-/**
- * 4.0. Themes
+ * 3.0. Themes
*
* Define themes specific styles.
*/
diff --git a/src/styles/pages/Home.module.scss b/src/styles/pages/Home.module.scss
deleted file mode 100644
index 8225a57..0000000
--- a/src/styles/pages/Home.module.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-@use "@styles/abstracts/functions" as fun;
-@use "@styles/abstracts/placeholders";
-
-.links-list {
- @extend %flex-list;
-
- gap: var(--spacing-md);
- margin: 0 0 var(--spacing-md);
-}
-
-.icon--feed {
- width: fun.convert-px(20);
-}
-
-:global {
- [data-theme="dark"] {
- :local {
- .icon--feed {
- filter: brightness(0.8) contrast(1.1);
- }
- }
- }
-}
-
-.section {
- --icon-size: #{fun.convert-px(20)};
-
- composes: grid from "@styles/layout/_grid.scss";
- padding: var(--spacing-md) 0;
- background: var(--color-bg-secondary);
-
- &:not(:last-child) {
- border-bottom: fun.convert-px(1) solid var(--color-border);
- }
-
- &:nth-child(2n) {
- background: var(--color-bg);
- }
-
- > * {
- grid-column: 2;
- }
-
- :global {
- .wp-block-columns {
- margin: 0 0 var(--spacing-md);
- }
- }
-}
diff --git a/src/styles/pages/Projects.module.scss b/src/styles/pages/Projects.module.scss
deleted file mode 100644
index 3fd74cb..0000000
--- a/src/styles/pages/Projects.module.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-.article {
- composes: grid from "@styles/layout/_grid.scss";
- align-items: start;
-
- > header {
- grid-column: 1 / -1;
- }
-}
-
-.body {
- grid-column: 1 / -1;
- margin-bottom: var(--spacing-xl);
-}
diff --git a/src/styles/pages/article.module.scss b/src/styles/pages/article.module.scss
new file mode 100644
index 0000000..a5299fe
--- /dev/null
+++ b/src/styles/pages/article.module.scss
@@ -0,0 +1,37 @@
+@use "@styles/abstracts/functions" as fun;
+@use "@styles/abstracts/mixins" as mix;
+@use "@styles/abstracts/variables" as var;
+@use "partials/article-links";
+@use "partials/article-lists";
+@use "partials/article-media";
+@use "partials/article-prism";
+@use "partials/article-wp-blocks";
+
+.btn {
+ margin-right: var(--spacing-2xs);
+ padding: var(--spacing-2xs) var(--spacing-xs);
+
+ figure {
+ max-width: fun.convert-px(22);
+ margin-right: var(--spacing-2xs);
+ }
+}
+
+.body {
+ :global {
+ @include article-links.styles;
+ @include article-lists.styles;
+ @include article-media.styles;
+ @include article-prism.styles;
+ @include article-wp-blocks.styles;
+ }
+}
+
+.widget {
+ @include mix.media("screen") {
+ @include mix.dimensions("md") {
+ width: min-content;
+ gap: var(--spacing-2xs);
+ }
+ }
+}
diff --git a/src/styles/pages/contact.module.scss b/src/styles/pages/contact.module.scss
new file mode 100644
index 0000000..65fb0d6
--- /dev/null
+++ b/src/styles/pages/contact.module.scss
@@ -0,0 +1,3 @@
+.notice {
+ margin-top: var(--spacing-md);
+}
diff --git a/src/styles/pages/cv.module.scss b/src/styles/pages/cv.module.scss
new file mode 100644
index 0000000..615c50d
--- /dev/null
+++ b/src/styles/pages/cv.module.scss
@@ -0,0 +1,3 @@
+.image {
+ max-width: min(100%, 25ch);
+}
diff --git a/src/styles/pages/home.module.scss b/src/styles/pages/home.module.scss
new file mode 100644
index 0000000..873a5a9
--- /dev/null
+++ b/src/styles/pages/home.module.scss
@@ -0,0 +1,36 @@
+@use "@styles/abstracts/functions" as fun;
+@use "@styles/abstracts/mixins" as mix;
+
+.section {
+ --card-width: 25ch;
+
+ &:last-of-type {
+ border-bottom: none;
+ }
+}
+
+.columns {
+ margin: 0 0 var(--spacing-sm);
+}
+
+.list {
+ margin: 0 0 var(--spacing-sm);
+
+ &--cards {
+ @include mix.media("screen") {
+ @include mix.dimensions("md") {
+ margin: 0 calc(var(--spacing-sm) * -1) var(--spacing-sm);
+ }
+ }
+ }
+}
+
+.icon {
+ --icon-size: #{fun.convert-px(20)};
+
+ margin-right: var(--spacing-2xs);
+
+ &--feed {
+ width: var(--icon-size);
+ }
+}
diff --git a/src/styles/pages/partials/_article-headings.scss b/src/styles/pages/partials/_article-headings.scss
new file mode 100644
index 0000000..c0c3519
--- /dev/null
+++ b/src/styles/pages/partials/_article-headings.scss
@@ -0,0 +1,57 @@
+@use "@styles/abstracts/functions" as fun;
+
+@mixin styles {
+ h1 {
+ font-size: var(--font-size-3xl);
+ font-weight: 500;
+ }
+
+ h2 {
+ padding-bottom: fun.convert-px(3);
+ background: linear-gradient(
+ to top,
+ var(--color-primary-dark) 0.3rem,
+ transparent 0.3rem
+ )
+ 0 0 / 3rem 100% no-repeat;
+ font-size: var(--font-size-2xl);
+ font-weight: 500;
+ text-shadow: fun.convert-px(1) fun.convert-px(1) 0 var(--color-shadow-light);
+ }
+
+ h3 {
+ font-size: var(--font-size-xl);
+ font-weight: 500;
+ }
+
+ h4 {
+ font-size: var(--font-size-lg);
+ font-weight: 500;
+ }
+
+ h5 {
+ font-size: var(--font-size-md);
+ font-weight: 600;
+ }
+
+ h6 {
+ font-size: var(--font-size-md);
+ font-weight: 500;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ color: var(--color-primary-dark);
+ font-family: var(--font-family-secondary);
+ letter-spacing: 0.01ex;
+ margin: 0 0 var(--spacing-sm);
+
+ & + & {
+ margin-top: var(--spacing-md);
+ }
+ }
+}
diff --git a/src/styles/pages/partials/_article-links.scss b/src/styles/pages/partials/_article-links.scss
new file mode 100644
index 0000000..543337a
--- /dev/null
+++ b/src/styles/pages/partials/_article-links.scss
@@ -0,0 +1,204 @@
+@use "@styles/abstracts/functions" as fun;
+@use "@styles/abstracts/variables" as var;
+
+@mixin styles {
+ a {
+ &[hreflang] {
+ &::after {
+ display: inline-block;
+
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]";
+ font-size: var(--font-size-sm);
+ }
+ }
+ }
+
+ /* stylelint-disable no-descending-specificity */
+ a.download {
+ &::after {
+ display: inline-block;
+
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_white}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>'));
+ }
+
+ &[hreflang] {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>'));
+ }
+ }
+ }
+
+ a.external {
+ &::after {
+ display: inline-block;
+
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &[hreflang] {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+ }
+ }
+
+ a.external.download {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>')) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &[hreflang] {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>')) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$light-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>')) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$light-theme_white}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$light-theme_white}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+ }
+ }
+
+ [data-theme="dark"] {
+ a.download {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_black}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>'));
+ }
+
+ &[hreflang] {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_black}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>'));
+ }
+ }
+ }
+
+ a.external {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_black}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &[hreflang] {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_black}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+ }
+ }
+
+ a.external.download {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>')) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_black}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>')) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_black}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &[hreflang] {
+ &::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_blue}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>')) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_blue}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_blue}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+
+ &:focus:not(:active)::after {
+ /* Prettier is removing spacing between content parts. */
+
+ /* prettier-ignore */
+ content: "\0000a0[" attr(hreflang) "]\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="m49 80.048-28.445-30.77 19.32 4.095V5.06h18.252v48.313l21.318-4.095z"/><path fill="#{var.$dark-theme_black}" d="M0 67.57v27.37h100V67.57H87.973v15.344H12.027V67.569z"/></svg>')) "\0000a0" url(fun.encode-svg('<svg width="13" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path fill="#{var.$dark-theme_black}" d="M100 0 59.543 5.887l20.8 6.523-51.134 51.134 7.249 7.248L87.59 19.66l6.522 20.798z"/><path fill="#{var.$dark-theme_black}" d="M4 10a4 4 0 0 0-4 4v82a4 4 0 0 0 4 4h82a4 4 0 0 0 4-4V62.314h-8V92H8V18h29.686v-8z"/></svg>'));
+ }
+ }
+ }
+ }
+}
+/* stylelint-enable no-descending-specificity */
diff --git a/src/styles/pages/partials/_article-lists.scss b/src/styles/pages/partials/_article-lists.scss
new file mode 100644
index 0000000..c0084b0
--- /dev/null
+++ b/src/styles/pages/partials/_article-lists.scss
@@ -0,0 +1,65 @@
+@mixin styles {
+ ol {
+ padding: 0;
+ list-style-type: none;
+ counter-reset: li;
+
+ > li {
+ display: table;
+ counter-increment: li;
+
+ &::before {
+ content: counters(li, ".") ". ";
+ display: table-cell;
+ padding-right: var(--spacing-2xs);
+ color: var(--color-secondary);
+ }
+ }
+
+ li ol > li::before {
+ content: counters(li, ".") ". ";
+ }
+ }
+
+ ul,
+ ol {
+ li:not(:last-child) {
+ margin-bottom: var(--spacing-2xs);
+ }
+
+ ::marker {
+ color: var(--color-primary-dark);
+ }
+ }
+
+ ul {
+ padding-left: var(--spacing-sm);
+ }
+
+ dl {
+ display: flex;
+ flex-flow: row wrap;
+ gap: var(--spacing-2xs);
+ width: fit-content;
+ }
+
+ ul,
+ ol,
+ dl {
+ margin: var(--spacing-sm) 0;
+
+ & & {
+ margin: var(--spacing-2xs) 0 0;
+ }
+ }
+
+ dt {
+ color: var(--color-fg-light);
+ font-weight: 600;
+ }
+
+ dd {
+ margin: 0;
+ word-break: break-all;
+ }
+}
diff --git a/src/styles/pages/partials/_article-media.scss b/src/styles/pages/partials/_article-media.scss
new file mode 100644
index 0000000..0cd3654
--- /dev/null
+++ b/src/styles/pages/partials/_article-media.scss
@@ -0,0 +1,20 @@
+@use "@styles/abstracts/functions" as fun;
+
+@mixin styles {
+ figure {
+ display: flex;
+ flex-flow: column;
+ width: fit-content;
+ margin: 0 auto;
+ position: relative;
+ text-align: center;
+ }
+
+ figcaption {
+ margin: 0;
+ padding: fun.convert-px(4) var(--spacing-2xs);
+ background: var(--color-bg-secondary);
+ border: fun.convert-px(1) solid var(--color-border-light);
+ font-weight: 500;
+ }
+}
diff --git a/src/styles/pages/partials/_article-prism.scss b/src/styles/pages/partials/_article-prism.scss
new file mode 100644
index 0000000..a714eb6
--- /dev/null
+++ b/src/styles/pages/partials/_article-prism.scss
@@ -0,0 +1,302 @@
+@use "@styles/abstracts/functions" as fun;
+@use "@styles/abstracts/mixins" as mix;
+
+@mixin styles {
+ .code-toolbar {
+ --toolbar-height: #{fun.convert-px(100)};
+
+ position: relative;
+ margin-top: calc(var(--toolbar-height) + var(--spacing-sm));
+
+ @include mix.media("screen") {
+ @include mix.dimensions("2xs") {
+ --toolbar-height: #{fun.convert-px(60)};
+ }
+ }
+
+ .toolbar {
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: center;
+ width: 100%;
+ height: var(--toolbar-height);
+ position: absolute;
+ top: calc(var(--toolbar-height) * -1);
+ left: 0;
+ right: 0;
+ background: var(--color-bg-tertiary);
+ border: fun.convert-px(1) solid var(--color-border);
+ }
+
+ .toolbar-item {
+ display: flex;
+ align-items: center;
+ margin: 0 var(--spacing-2xs);
+ }
+
+ .toolbar-item:nth-child(1) {
+ flex: 0 0 100%;
+ justify-content: center;
+ margin: 0 auto 0 0;
+ padding: 0 var(--spacing-sm);
+ background: var(--color-bg-code);
+ border-bottom: fun.convert-px(1) solid var(--color-border);
+ color: var(--color-primary-darker);
+ font-size: var(--font-size-sm);
+ font-weight: 600;
+
+ @include mix.media("screen") {
+ @include mix.dimensions("2xs") {
+ flex: 0 0 auto;
+ justify-content: left;
+ border-bottom: none;
+ border-right: fun.convert-px(1) solid var(--color-border);
+ }
+ }
+ }
+ }
+
+ .copy-to-clipboard-button,
+ .prism-color-scheme-button {
+ display: block;
+ padding: fun.convert-px(3) var(--spacing-xs);
+ background: var(--color-bg);
+ border: 0.4ex solid var(--color-primary);
+ border-radius: fun.convert-px(30);
+ box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1)
+ var(--color-shadow),
+ fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2)
+ var(--color-shadow),
+ fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4)
+ var(--color-shadow);
+ color: var(--color-primary);
+ font-size: var(--font-size-sm);
+ font-weight: 600;
+ transition: all 0.35s ease-in-out 0s;
+
+ &:hover,
+ &:focus {
+ transform: translateX(#{fun.convert-px(-2)})
+ translateY(#{fun.convert-px(-2)});
+ box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1)
+ var(--color-shadow-light),
+ fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2)
+ var(--color-shadow-light),
+ fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4)
+ var(--color-shadow-light),
+ fun.convert-px(4) fun.convert-px(7) fun.convert-px(8) fun.convert-px(-3)
+ var(--color-shadow-light);
+ }
+
+ &:focus {
+ text-decoration: underline var(--color-primary) fun.convert-px(3);
+ }
+
+ &:active {
+ text-decoration: none;
+ transform: translateY(#{fun.convert-px(2)});
+ box-shadow: 0 0 0 0 var(--color-shadow);
+ }
+ }
+
+ pre[class*="language-"] {
+ --gutter-size-with-spacing: calc(var(--gutter-size) + var(--spacing-xs));
+
+ padding: 0;
+ position: relative;
+ overflow: auto;
+ border: fun.convert-px(1) solid var(--color-border-light);
+ hyphens: none;
+ tab-size: 4;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+
+ &.command-line {
+ --gutter-size: 19ch;
+ padding-left: var(--gutter-size-with-spacing);
+ }
+
+ &.line-numbers {
+ --gutter-size: 6ch;
+
+ counter-reset: lineNumber;
+ padding-left: var(--gutter-size-with-spacing);
+ }
+
+ code {
+ display: block;
+ padding: var(--spacing-xs) 0;
+ position: relative;
+ }
+
+ .line-numbers-rows,
+ .command-line-prompt {
+ display: block;
+ width: var(--gutter-size);
+ padding: var(--spacing-xs) 0;
+ position: absolute;
+ top: 0;
+ left: calc(var(--gutter-size-with-spacing) * -1);
+ background: var(--color-bg);
+ border-right: fun.convert-px(1) solid var(--color-border);
+ font-size: 100%;
+ letter-spacing: -1px;
+ text-align: right;
+ pointer-events: none;
+ user-select: none;
+
+ > span {
+ &::before {
+ display: block;
+ padding-right: var(--spacing-xs);
+ color: var(--color-fg-light);
+ }
+ }
+ }
+
+ .command-line-prompt {
+ > span {
+ &::before {
+ content: " ";
+ }
+
+ &[data-user]::before {
+ content: "[" attr(data-user) "@" attr(data-host) "] $";
+ }
+
+ &[data-user="root"]::before {
+ content: "[" attr(data-user) "@" attr(data-host) "] #";
+ }
+
+ &[data-prompt]::before {
+ content: attr(data-prompt);
+ }
+
+ &[data-continuation-prompt]::before {
+ content: attr(data-continuation-prompt);
+ }
+ }
+ }
+
+ .line-numbers-rows {
+ > span {
+ counter-increment: lineNumber;
+
+ &::before {
+ content: counter(lineNumber);
+ }
+ }
+ }
+
+ .token {
+ &.comment,
+ &.doc-comment {
+ color: var(--color-fg-light);
+ }
+
+ &.punctuation {
+ color: var(--color-fg);
+ }
+
+ &.attr-name,
+ &.hexcode,
+ &.inserted,
+ &.string {
+ color: var(--color-token-green);
+ }
+
+ &.class,
+ &.coord,
+ &.id,
+ &.function {
+ color: var(--color-token-purple);
+ }
+
+ &.builtin,
+ &.builtin.class-name,
+ &.property-access,
+ &.regex,
+ &.scope {
+ color: var(--color-token-magenta);
+ }
+
+ &.class-name,
+ &.constant,
+ &.global,
+ &.interpolation,
+ &.key,
+ &.package,
+ &.this,
+ &.title,
+ &.variable {
+ color: var(--color-token-blue);
+ }
+
+ &.combinator,
+ &.keyword,
+ &.operator,
+ &.pseudo-class,
+ &.pseudo-element,
+ &.rule,
+ &.selector,
+ &.unit {
+ color: var(--color-token-orange);
+ }
+
+ &.attr-value,
+ &.boolean,
+ &.number {
+ color: var(--color-token-yellow);
+ }
+
+ &.delimiter,
+ &.doctype,
+ &.parameter,
+ &.parent,
+ &.property,
+ &.shebang,
+ &.tag {
+ color: var(--color-token-cyan);
+ }
+
+ &.deleted {
+ color: var(--color-token-red);
+ }
+
+ &.punctuation.brace-hover,
+ &.punctuation.brace-selected {
+ background: var(--color-bg);
+ outline: solid fun.convert-px(1) var(--color-primary-light);
+ }
+ }
+
+ span.inline-color-wrapper {
+ background: url(fun.encode-svg(
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="gray" d="M0 0h2v2H0z"/><path fill="white" d="M0 0h1v1H0zM1 1h1v1H1z"/></svg>'
+ ));
+
+ /* Prevent glitches where 1px from the repeating pattern could be seen. */
+ background-position: center;
+ background-size: 110%;
+
+ display: inline-block;
+ height: 1.1ch;
+ width: 1.1ch;
+ margin: 0 0.5ch 0 0;
+ border: fun.convert-px(1) solid var(--color-bg);
+ outline: fun.convert-px(1) solid var(--color-border-dark);
+ overflow: hidden;
+ }
+
+ span.inline-color {
+ display: block;
+
+ /* To prevent visual glitches again */
+ height: 120%;
+ width: 120%;
+ }
+ }
+}
diff --git a/src/styles/pages/partials/_article-wp-blocks.scss b/src/styles/pages/partials/_article-wp-blocks.scss
new file mode 100644
index 0000000..86be062
--- /dev/null
+++ b/src/styles/pages/partials/_article-wp-blocks.scss
@@ -0,0 +1,177 @@
+@use "@styles/abstracts/functions" as fun;
+@use "@styles/abstracts/mixins" as mix;
+@use "@styles/abstracts/placeholders";
+
+@mixin styles {
+ .wp-block-quote {
+ margin: var(--spacing-sm) 0;
+ padding: var(--spacing-sm);
+ position: relative;
+ border: fun.convert-px(1) solid var(--color-border-dark);
+ border-left: fun.convert-px(5) solid var(--color-border-dark);
+ box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) 0
+ var(--color-shadow),
+ fun.convert-px(3) fun.convert-px(3) fun.convert-px(4) 0
+ var(--color-shadow);
+ font-style: italic;
+
+ > *:last-child {
+ margin: 0;
+ }
+
+ cite {
+ color: var(--color-fg-light);
+ font-size: var(--font-size-sm);
+ font-style: normal;
+ font-weight: 600;
+ }
+ }
+
+ .wp-block-code,
+ .wp-block-preformatted {
+ padding: var(--spacing-xs) var(--spacing-sm);
+ background: var(--color-bg-secondary);
+ border: fun.convert-px(1) solid var(--color-border-light);
+ color: var(--color-fg);
+ }
+
+ .wp-block-columns {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr);
+ gap: var(--spacing-md);
+ margin: var(--spacing-md) 0;
+
+ @include mix.media("screen") {
+ @include mix.dimensions("sm") {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ }
+
+ &.are-vertically-aligned-center {
+ align-items: center;
+ }
+ }
+
+ .wp-block-column {
+ > *:first-child {
+ margin-top: 0;
+ }
+
+ > *:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .wp-block-image,
+ .wp-block-video {
+ padding: fun.convert-px(4);
+ border: fun.convert-px(1) solid var(--color-border);
+ box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) 0
+ var(--color-shadow);
+ }
+
+ .wp-block-image {
+ display: flex;
+ flex-flow: column;
+ width: fit-content;
+ margin: 0 auto;
+ position: relative;
+ text-align: center;
+
+ img {
+ margin: auto;
+ }
+
+ figcaption {
+ margin-top: fun.convert-px(4);
+ font-size: var(--font-size-sm);
+ }
+ }
+
+ .wp-block-gallery {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr);
+ gap: var(--spacing-sm);
+
+ .blocks-gallery-grid {
+ @extend %reset-list;
+
+ grid-column: 1 / -1;
+ grid-row: 1 / -1;
+ display: grid;
+ grid-template-columns: minmax(0, 1fr);
+ gap: var(--spacing-sm);
+ }
+
+ .blocks-gallery-item {
+ figure {
+ margin: 0;
+ }
+
+ a {
+ display: block;
+ box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
+ fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
+ var(--color-shadow-light),
+ fun.convert-px(3) fun.convert-px(3) fun.convert-px(6) 0
+ var(--color-shadow-light);
+
+ &:hover,
+ &:focus {
+ transform: scale(1.05);
+ box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
+ fun.convert-px(3) fun.convert-px(3) fun.convert-px(2) 0
+ var(--color-shadow-light),
+ fun.convert-px(5) fun.convert-px(5) fun.convert-px(8) 0
+ var(--color-shadow-light);
+ }
+
+ &:focus {
+ outline: solid var(--color-primary-light);
+ }
+
+ &:active {
+ transform: scale(0.95);
+ box-shadow: 0 0 fun.convert-px(1) 0 var(--color-shadow),
+ fun.convert-px(2) fun.convert-px(2) fun.convert-px(2) 0
+ var(--color-shadow-light),
+ 0 0 0 0 var(--color-shadow-light);
+ outline: none;
+ }
+ }
+ }
+
+ &.aligncenter {
+ .blocks-gallery-grid {
+ align-items: center;
+ }
+ }
+
+ @for $i from 0 to 6 {
+ &.columns-#{$i} {
+ @include mix.media("screen") {
+ @include mix.dimensions("xs") {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+
+ .blocks-gallery-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ }
+
+ @include mix.dimensions("sm") {
+ grid-template-columns: repeat(#{$i}, minmax(0, 1fr));
+
+ .blocks-gallery-grid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+ }
+ }
+ }
+ }
+
+ .wp-block-image img {
+ height: 100%;
+ object-fit: cover;
+ }
+ }
+}
diff --git a/src/styles/pages/project.module.scss b/src/styles/pages/project.module.scss
new file mode 100644
index 0000000..3b1b5cc
--- /dev/null
+++ b/src/styles/pages/project.module.scss
@@ -0,0 +1,10 @@
+@use "@styles/abstracts/mixins" as mix;
+
+.widget {
+ @include mix.media("screen") {
+ @include mix.dimensions("md") {
+ width: min-content;
+ gap: var(--spacing-2xs);
+ }
+ }
+}
diff --git a/src/styles/pages/projects.module.scss b/src/styles/pages/projects.module.scss
new file mode 100644
index 0000000..fde1f31
--- /dev/null
+++ b/src/styles/pages/projects.module.scss
@@ -0,0 +1,11 @@
+@use "@styles/abstracts/mixins" as mix;
+
+.list {
+ margin-top: var(--spacing-sm);
+
+ @include mix.media("screen") {
+ @include mix.dimensions("md") {
+ margin: var(--spacing-md) calc(var(--spacing-3xl) * -1) var(--spacing-md);
+ }
+ }
+}
diff --git a/src/styles/pages/topic.module.scss b/src/styles/pages/topic.module.scss
new file mode 100644
index 0000000..fd5f742
--- /dev/null
+++ b/src/styles/pages/topic.module.scss
@@ -0,0 +1,6 @@
+@use "@styles/abstracts/functions" as fun;
+
+.logo {
+ max-width: fun.convert-px(50);
+ margin: 0 var(--spacing-xs) 0 0;
+}
diff --git a/src/styles/vendors/_prism.scss b/src/styles/vendors/_prism.scss
deleted file mode 100644
index 7c05c9f..0000000
--- a/src/styles/vendors/_prism.scss
+++ /dev/null
@@ -1,297 +0,0 @@
-@use "@styles/abstracts/functions" as fun;
-@use "@styles/abstracts/mixins" as mix;
-
-/// Custom theme for Prism
-
-.code-toolbar {
- --gutter-size: clamp(#{fun.convert-px(75)}, 20vw, #{fun.convert-px(90)});
- --toolbar-height: #{fun.convert-px(90)};
-
- position: relative;
- margin-top: calc(var(--toolbar-height) + var(--spacing-md));
-
- @include mix.media("screen") {
- @include mix.dimensions("2xs") {
- --toolbar-height: #{fun.convert-px(60)};
- }
- }
-
- .toolbar {
- display: grid;
- grid-template-columns: max-content minmax(0, 1fr);
- justify-items: end;
- width: 100%;
- height: var(--toolbar-height);
- position: absolute;
- top: calc(var(--toolbar-height) * -1);
- left: 0;
- right: 0;
- background: var(--color-bg-tertiary);
- border: fun.convert-px(1) solid var(--color-border);
-
- @include mix.media("screen") {
- @include mix.dimensions("2xs") {
- display: flex;
- flex-flow: row wrap;
- }
- }
- }
-
- .toolbar-item {
- display: flex;
- align-items: center;
- }
-
- .toolbar-item:nth-child(1) {
- grid-column: 1;
- grid-row: 1 / 3;
- margin-right: auto;
- padding: 0 var(--spacing-sm);
- background: var(--color-bg-code);
- border-right: fun.convert-px(1) solid var(--color-border);
- color: var(--color-primary-darker);
- font-size: var(--font-size-sm);
- font-weight: 600;
- }
-
- .toolbar-item:nth-child(2) {
- grid-column: 2;
- grid-row: 1;
- margin: 0 var(--spacing-2xs);
- }
-
- .toolbar-item:nth-child(3) {
- grid-column: 2;
- grid-row: 2;
- margin: 0 var(--spacing-2xs);
- }
-}
-
-pre[class*="language-"] {
- max-height: max(30vw, fun.convert-px(300));
- margin: var(--spacing-md) 0;
- padding: 0;
- position: relative;
- background: var(--color-bg-secondary);
- color: var(--color-fg);
- border: fun.convert-px(1) solid var(--color-border);
-
- > code {
- display: block;
- padding: var(--spacing-xs) 0 var(--spacing-xs)
- calc(var(--gutter-size) + var(--spacing-xs));
- }
-
- .line-numbers-rows,
- .command-line-prompt {
- width: var(--gutter-size);
- min-height: 100%;
- padding: var(--spacing-xs) var(--spacing-2xs);
- position: absolute;
- top: 0;
- left: 0;
- pointer-events: none;
- user-select: none;
- background: var(--color-bg);
- border-right: fun.convert-px(1) solid var(--color-border);
- }
-
- .token {
- &.comment,
- &.doc-comment {
- color: var(--color-fg-light);
- }
-
- &.punctuation {
- color: var(--color-fg);
- }
-
- &.attr-name,
- &.hexcode,
- &.inserted,
- &.string {
- color: var(--color-token-green);
- }
-
- &.class,
- &.coord,
- &.id,
- &.function {
- color: var(--color-token-purple);
- }
-
- &.builtin,
- &.builtin.class-name,
- &.property-access,
- &.regex,
- &.scope {
- color: var(--color-token-magenta);
- }
-
- &.class-name,
- &.constant,
- &.global,
- &.interpolation,
- &.key,
- &.package,
- &.this,
- &.title,
- &.variable {
- color: var(--color-token-blue);
- }
-
- &.combinator,
- &.keyword,
- &.operator,
- &.pseudo-class,
- &.pseudo-element,
- &.rule,
- &.selector,
- &.unit {
- color: var(--color-token-orange);
- }
-
- &.attr-value,
- &.boolean,
- &.number {
- color: var(--color-token-yellow);
- }
-
- &.delimiter,
- &.doctype,
- &.parameter,
- &.parent,
- &.property,
- &.shebang,
- &.tag {
- color: var(--color-token-cyan);
- }
-
- &.deleted {
- color: var(--color-token-red);
- }
-
- &.punctuation.brace-hover,
- &.punctuation.brace-selected {
- background: var(--color-bg);
- outline: solid fun.convert-px(1) var(--color-primary-light);
- }
- }
-
- span.inline-color-wrapper {
- background: url(fun.encode-svg(
- '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="gray" d="M0 0h2v2H0z"/><path fill="white" d="M0 0h1v1H0zM1 1h1v1H1z"/></svg>'
- ));
-
- /* Prevent glitches where 1px from the repeating pattern could be seen. */
- background-position: center;
- background-size: 110%;
-
- display: inline-block;
- height: 1.1ch;
- width: 1.1ch;
- margin: 0 0.5ch 0 0;
- border: fun.convert-px(1) solid var(--color-bg);
- outline: fun.convert-px(1) solid var(--color-border-dark);
- overflow: hidden;
- }
-
- span.inline-color {
- display: block;
-
- /* To prevent visual glitches again */
- height: 120%;
- width: 120%;
- }
-}
-
-pre.line-numbers {
- counter-reset: lineNumber;
-
- .line-numbers-rows {
- > span {
- counter-increment: lineNumber;
-
- &::before {
- display: block;
- padding: 0 var(--spacing-xs);
- content: counter(lineNumber);
- color: var(--color-primary-darker);
- text-align: right;
- line-height: var(--line-height);
- }
- }
- }
-}
-
-pre.command-line {
- --gutter-size: clamp(#{fun.convert-px(195)}, 48vw, #{fun.convert-px(235)});
-
- ~ .toolbar {
- --gutter-size: clamp(#{fun.convert-px(195)}, 48vw, #{fun.convert-px(235)});
- }
-
- .command-line-prompt {
- > span {
- &::before {
- display: block;
- content: "";
- }
-
- &[data-user]::before {
- content: "[" attr(data-user) "@" attr(data-host) "] $";
- }
-
- &[data-user="root"]::before {
- content: "[" attr(data-user) "@" attr(data-host) "] #";
- }
-
- &[data-prompt]::before {
- content: attr(data-prompt);
- }
- }
- }
-}
-
-.copy-to-clipboard-button,
-.prism-color-scheme-button {
- display: block;
- padding: fun.convert-px(3) var(--spacing-xs);
- background: var(--color-bg);
- border: 0.4ex solid var(--color-primary);
- border-radius: fun.convert-px(30);
- box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1)
- var(--color-shadow),
- fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2)
- var(--color-shadow),
- fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4)
- var(--color-shadow);
- color: var(--color-primary);
- font-size: var(--font-size-sm);
- font-weight: 600;
- transition: all 0.35s ease-in-out 0s;
-
- &:hover,
- &:focus {
- transform: translateX(#{fun.convert-px(-2)})
- translateY(#{fun.convert-px(-2)});
- box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1)
- var(--color-shadow-light),
- fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2)
- var(--color-shadow-light),
- fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4)
- var(--color-shadow-light),
- fun.convert-px(4) fun.convert-px(7) fun.convert-px(8) fun.convert-px(-3)
- var(--color-shadow-light);
- }
-
- &:focus {
- text-decoration: underline var(--color-primary) fun.convert-px(3);
- }
-
- &:active {
- text-decoration: none;
- transform: translateY(#{fun.convert-px(2)});
- box-shadow: 0 0 0 0 var(--color-shadow);
- }
-}