-
+
diff --git a/_sass/base.scss b/_sass/base.scss
index c5b790a..d1ee07f 100644
--- a/_sass/base.scss
+++ b/_sass/base.scss
@@ -10,54 +10,140 @@
/**
* Style variables
*/
-$base-font-family: 'Rubik', monospace !default;
-$base-font-size: 1.125rem !default;
-$mobile-font-size: 1.125rem !default;
-$base-line-height: 1.5 !default;
-$container-width: 90% !default;
-$container-max-width: 1000px !default;
+$base-font-family: 'Rubik', monospace !default;
+$base-font-size: 1.125rem !default;
+$mobile-font-size: 1.125rem !default;
+$base-line-height: 1.5 !default;
+$container-width: 90% !default;
+$container-max-width: 1000px !default;
/**
* Global
*/
-body { background-color: var(--background-color); margin: 0 auto; padding: 0; font-family: $base-font-family; font-size: $base-font-size; color: var(--text-color); text-align: left; line-height: $base-line-height !important; }
-h1 { font-size: 32px; }
-h2 { font-size: 28px; }
-h3 { font-size: 24px; }
-h4 { font-size: 20px; }
-h5 { font-size: 18px; }
-h6 { font-size: 16px; }
-h1, h2, h3, h4, h5, h6 { margin: 0px; margin-top: 12px; margin-bottom: 12px; font-weight: bold; color: var(--text-color); }
-p, ul, ol { margin: 0px; color: var(--text-color); }
-a { text-decoration: underline; color: var(--link-color); }
-a:hover {
- color: var(--background-color);
- background-color: var(--base-color);
+body {
+ background-color: var(--background-color);
+ margin: 0 auto;
+ padding: 0;
+ font-family: $base-font-family;
+ font-size: $base-font-size;
+ color: var(--text-color);
+ text-align: left;
+ line-height: $base-line-height !important;
+}
+
+h1 {
+ font-size: 32px;
+}
+
+h2 {
+ font-size: 28px;
+}
+
+h3 {
+ font-size: 24px;
+}
+
+h4 {
+ font-size: 20px;
+}
+
+h5 {
+ font-size: 18px;
+}
+
+h6 {
+ font-size: 16px;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin: 0px;
+ margin-top: 12px;
+ margin-bottom: 12px;
+ font-weight: bold;
+ color: var(--text-color);
+}
+
+p,
+ul,
+ol {
+ margin: 0px;
+ color: var(--text-color);
+}
+
+a {
+ text-decoration: underline;
+ color: var(--link-color);
+}
+
+a:hover {
+ color: var(--background-color);
+ background-color: var(--base-color);
transition: background-color 0.3s ease-in-out, color 0.3s ease-in-out;
}
-@media only screen and (max-device-width: 500px) { * { font-size: $mobile-font-size; } }
+@media only screen and (max-device-width: 500px) {
+ * {
+ font-size: $mobile-font-size;
+ }
+}
/**
* Layout
*/
-.container { width: $container-width; max-width: $container-max-width; margin-right: auto; margin-left: auto; }
-p { word-wrap: break-word; word-break: break-word; white-space: pre-wrap; margin-bottom: 15px; }
-footer { color: var(--text-color); border-top: var(--border); margin-top: 0; padding-top: 10px; text-align: right; }
-header { margin-top: 50px; margin-bottom: 50px; }
-header p { text-align: left; margin: 0; }
-footer { margin-bottom: 20px; }
-hr { margin-top: 20px; }
+.container {
+ width: $container-width;
+ max-width: $container-max-width;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+p {
+ word-wrap: break-word;
+ word-break: break-word;
+ white-space: pre-wrap;
+ margin-bottom: 15px;
+}
+
+footer {
+ color: var(--text-color);
+ border-top: var(--border);
+ margin-top: 0;
+ padding-top: 10px;
+ text-align: right;
+}
+
+header {
+ margin-top: 50px;
+ margin-bottom: 50px;
+}
+
+header p {
+ text-align: left;
+ margin: 0;
+}
+
+footer {
+ margin-bottom: 20px;
+}
+
+hr {
+ margin-top: 20px;
+}
/**
* Navbar
*/
-.menu-logo {
+.menu-logo {
height: 60px;
}
#home-link:hover {
- background: none;
+ background: none;
text-decoration: none;
}
@@ -72,7 +158,7 @@ hr { margin-top: 20px; }
.header-page-links a {
margin: 0px 15px;
font-size: 1.3rem;
- text-decoration: none;
+ text-decoration: none;
}
.header-page-links a:hover {
@@ -88,54 +174,55 @@ hr { margin-top: 20px; }
}
.menu-button-container {
- display: none;
- width: 50px;
- height: 50px;
- cursor: pointer;
- flex-direction: column;
- justify-content: center;
- align-items: center;
+ display: none;
+ width: 50px;
+ height: 50px;
+ cursor: pointer;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
}
#menu-toggle {
- display: none;
+ display: none;
}
.menu-button,
.menu-button::before,
.menu-button::after {
- display: block;
- background-color: #fff;
- position: absolute;
- height: 4px;
- width: 30px;
- transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1);
- border-radius: 2px;
+ display: block;
+ background-color: #fff;
+ position: absolute;
+ height: 4px;
+ width: 30px;
+ transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1);
+ border-radius: 2px;
}
.menu-button::before {
- content: '';
- margin-top: -8px;
+ content: '';
+ margin-top: -8px;
}
.menu-button::after {
- content: '';
- margin-top: 8px;
+ content: '';
+ margin-top: 8px;
}
-#menu-toggle:checked + .menu-button-container .menu-button::before {
- margin-top: 0px;
- transform: rotate(405deg);
+#menu-toggle:checked+.menu-button-container .menu-button::before {
+ margin-top: 0px;
+ transform: rotate(405deg);
}
-#menu-toggle:checked + .menu-button-container .menu-button {
- background: rgba(255, 255, 255, 0);
+#menu-toggle:checked+.menu-button-container .menu-button {
+ background: rgba(255, 255, 255, 0);
}
-#menu-toggle:checked + .menu-button-container .menu-button::after {
- margin-top: 0px;
- transform: rotate(-405deg);
+#menu-toggle:checked+.menu-button-container .menu-button::after {
+ margin-top: 0px;
+ transform: rotate(-405deg);
}
+
.menu-content {
position: absolute;
display: none;
@@ -147,7 +234,7 @@ hr { margin-top: 20px; }
}
.inner-menu-content {
- border-bottom: 1px solid white;
+ border-bottom: 1px solid white;
}
.menu-content div {
@@ -159,34 +246,39 @@ hr { margin-top: 20px; }
width: 40px;
height: 40px;
}
- .menu-button-container {
- display: flex;
- }
- #menu-toggle ~ .menu li {
- height: 0;
- margin: 0;
- padding: 0;
- border: 0;
- transition: height 400ms cubic-bezier(0.23, 1, 0.32, 1);
- }
- #menu-toggle:checked ~ .menu li {
- border: 1px solid #333;
- height: 2.5em;
- padding: 0.5em;
- transition: height 400ms cubic-bezier(0.23, 1, 0.32, 1);
- }
- .menu > li {
- display: flex;
- justify-content: center;
- margin: 0;
- padding: 0.5em 0;
- width: 100%;
- color: white;
- background-color: #222;
- }
- .menu > li:not(:last-child) {
- border-bottom: 1px solid #444;
- }
+
+ .menu-button-container {
+ display: flex;
+ }
+
+ #menu-toggle~.menu li {
+ height: 0;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ transition: height 400ms cubic-bezier(0.23, 1, 0.32, 1);
+ }
+
+ #menu-toggle:checked~.menu li {
+ border: 1px solid #333;
+ height: 2.5em;
+ padding: 0.5em;
+ transition: height 400ms cubic-bezier(0.23, 1, 0.32, 1);
+ }
+
+ .menu>li {
+ display: flex;
+ justify-content: center;
+ margin: 0;
+ padding: 0.5em 0;
+ width: 100%;
+ color: white;
+ background-color: #222;
+ }
+
+ .menu>li:not(:last-child) {
+ border-bottom: 1px solid #444;
+ }
}
/**
@@ -217,56 +309,142 @@ hr { margin-top: 20px; }
/**
* Highlight/Markup
*/
-::selection { background: var(--selection-background); color: var(--selection-text); }
-::-moz-selection { background: var(--selection-background); color: var(--selection-text); }
+::selection {
+ background: var(--selection-background);
+ color: var(--selection-text);
+}
+
+::-moz-selection {
+ background: var(--selection-background);
+ color: var(--selection-text);
+}
/**
* Lists
*/
-:not(.menu) > ul { list-style: none; }
-:not(.menu) > ul { list-style-type: none; }
-:not(.menu) > ul > li:before { content: "-"; margin-right: 9px; }
-.right-menu > ul > li:before { content: "" !important; margin-right: 9px; }
+:not(.menu)>ul {
+ list-style: none;
+}
+
+:not(.menu)>ul {
+ list-style-type: none;
+}
+
+:not(.menu)>ul>li:before {
+ content: "-";
+ margin-right: 9px;
+}
+
+.right-menu>ul>li:before {
+ content: "" !important;
+ margin-right: 9px;
+}
/**
* Header/Navigation
*/
-.menu {
- border-bottom: var(--border); margin-bottom: 20px;
+.menu {
+ border-bottom: var(--border);
+ margin-bottom: 20px;
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 25px;
}
-.menu ul { margin-top: 12px; margin-bottom: 12px; padding-left: 0px; list-style-type: none; text-align: right; }
-.menu ul li { display: inline; margin-left: 10px; }
+
+.menu ul {
+ margin-top: 12px;
+ margin-bottom: 12px;
+ padding-left: 0px;
+ list-style-type: none;
+ text-align: right;
+}
+
+.menu ul li {
+ display: inline;
+ margin-left: 10px;
+}
/**
* Form
*/
-input, select, textarea { padding: 0; margin: 0; -webkit-appearance: none; -webkit-border-radius: 0; border: none; }
-input[type=text], select, textarea { width: 100%; resize: none; background-color: var(--background-color); color: var(--text-color); caret-color: var(--text-color); font-size: $base-font-size; font-family: $base-font-family; line-height: $base-line-height; }
-input, select, textarea, textarea::-webkit-input-placeholder { text-indent: 0px; }
-::placeholder { color: var(--placeholder-color); opacity: 1; }
-:-ms-input-placeholder { color: var(--placeholder-color); }
-::-ms-input-placeholder { color: var(--placeholder-color); }
-input[type=submit] { font-size: $base-font-size; font-family: $base-font-family; line-height: $base-line-height; cursor: pointer; color: var(--link-color); background-color: var(--background-color); }
-input[type=submit]:hover { color: var(--background-color); background-color: var(--base-color); }
-*:focus { outline: none; }
-textarea { vertical-align: top; }
+input,
+select,
+textarea {
+ padding: 0;
+ margin: 0;
+ -webkit-appearance: none;
+ -webkit-border-radius: 0;
+ border: none;
+}
+
+input[type=text],
+select,
+textarea {
+ width: 100%;
+ resize: none;
+ background-color: var(--background-color);
+ color: var(--text-color);
+ caret-color: var(--text-color);
+ font-size: $base-font-size;
+ font-family: $base-font-family;
+ line-height: $base-line-height;
+}
+
+input,
+select,
+textarea,
+textarea::-webkit-input-placeholder {
+ text-indent: 0px;
+}
+
+::placeholder {
+ color: var(--placeholder-color);
+ opacity: 1;
+}
+
+:-ms-input-placeholder {
+ color: var(--placeholder-color);
+}
+
+::-ms-input-placeholder {
+ color: var(--placeholder-color);
+}
+
+input[type=submit] {
+ font-size: $base-font-size;
+ font-family: $base-font-family;
+ line-height: $base-line-height;
+ cursor: pointer;
+ color: var(--link-color);
+ background-color: var(--background-color);
+}
+
+input[type=submit]:hover {
+ color: var(--background-color);
+ background-color: var(--base-color);
+}
+
+*:focus {
+ outline: none;
+}
+
+textarea {
+ vertical-align: top;
+}
/**
* Homepage
*/
.particles-wrapper {
- background-color: #222;
- width: 100%;
- height: 100%;
- padding: 0;
- margin: 0;
- overflow: hidden;
+ background-color: #222;
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
}
.flex-container {
@@ -321,67 +499,327 @@ section {
/**
* Code and syntax highlighting
*/
-.lineno { color: var(--code-color-1); margin-right: 15px; }
-figure.highlight { margin: 5px 0; }
-pre { background-color: var(--background-color); border: none; padding: 0; margin: 0; overflow:auto; font-size: $base-font-size; color: var(--text-color); line-height: 1.7 !important; font-family: $base-font-family !important; }
-.highlight .hll { background-color: var(--code-color-2); }
-.highlight .c { color: var(--code-color-1); font-style: italic } /* Comment */
-.highlight .err { color: var(--code-color-3); background-color: var(--code-color-4); } /* Error */
-.highlight .k { color: var(--code-color-5); } /* Keyword */
-.highlight .cm { color: var(--code-color-1); font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: var(--code-color-6); } /* Comment.Preproc */
-.highlight .c1 { color: var(--code-color-1); font-style: italic } /* Comment.Single */
-.highlight .cs { color: var(--code-color-5); font-style: italic } /* Comment.Special */
-.highlight .gd { color: var(--code-color-7); } /* Generic.Deleted */
-.highlight .ge { font-style: italic } /* Generic.Emph */
-.highlight .gr { color: var(--code-color-7); } /* Generic.Error */
-.highlight .gh { color: var(--code-color-8); font-weight: bold } /* Generic.Heading */
-.highlight .gi { color: var(--code-color-9); } /* Generic.Inserted */
-.highlight .go { color: var(--code-color-10); } /* Generic.Output */
-.highlight .gp { color: var(--code-color-11); } /* Generic.Prompt */
-.highlight .gs { font-weight: bold } /* Generic.Strong */
-.highlight .gu { color: var(--code-color-12); font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: var(--code-color-7); } /* Generic.Traceback */
-.highlight .kc { color: var(--code-color-5); } /* Keyword.Constant */
-.highlight .kd { color: var(--code-color-5); } /* Keyword.Declaration */
-.highlight .kn { color: var(--code-color-5); } /* Keyword.Namespace */
-.highlight .kp { color: var(--code-color-5); } /* Keyword.Pseudo */
-.highlight .kr { color: var(--code-color-5); } /* Keyword.Reserved */
-.highlight .kt { color: var(--code-color-13); } /* Keyword.Type */
-.highlight .m { color: var(--code-color-14); } /* Literal.Number */
-.highlight .s { color: var(--code-color-15); } /* Literal.String */
-.highlight .na { color: var(--code-color-16); } /* Name.Attribute */
-.highlight .nb { color: var(--code-color-13); } /* Name.Builtin */
-.highlight .nc { color: var(--code-color-9); text-decoration: underline } /* Name.Class */
-.highlight .no { color: var(--code-color-7); } /* Name.Constant */
-.highlight .nd { color: var(--code-color-10); } /* Name.Decorator */
-.highlight .ni { color: var(--code-color-17); font-weight: bold } /* Name.Entity */
-.highlight .nf { color: var(--code-color-9); } /* Name.Function */
-.highlight .nn { color: var(--code-color-13); text-decoration: underline } /* Name.Namespace */
-.highlight .nt { color: var(--code-color-16); font-weight: bold } /* Name.Tag */
-.highlight .nv { color: var(--code-color-7); } /* Name.Variable */
-.highlight .ow { color: var(--code-color-5); } /* Operator.Word */
-.highlight .w { color: var(--code-color-18); } /* Text.Whitespace */
-.highlight .mf { color: var(--code-color-14); } /* Literal.Number.Float */
-.highlight .mh { color: var(--code-color-14); } /* Literal.Number.Hex */
-.highlight .mi { color: var(--code-color-14); } /* Literal.Number.Integer */
-.highlight .mo { color: var(--code-color-14); } /* Literal.Number.Oct */
-.highlight .sb { color: var(--code-color-15); } /* Literal.String.Backtick */
-.highlight .sc { color: var(--code-color-15); } /* Literal.String.Char */
-.highlight .sd { color: var(--code-color-15); } /* Literal.String.Doc */
-.highlight .s2 { color: var(--code-color-15); } /* Literal.String.Double */
-.highlight .se { color: var(--code-color-15); } /* Literal.String.Escape */
-.highlight .sh { color: var(--code-color-15); } /* Literal.String.Heredoc */
-.highlight .si { color: var(--code-color-15); } /* Literal.String.Interpol */
-.highlight .sx { color: var(--code-color-15); } /* Literal.String.Other */
-.highlight .sr { color: var(--code-color-14); } /* Literal.String.Regex */
-.highlight .s1 { color: var(--code-color-15); } /* Literal.String.Single */
-.highlight .ss { color: var(--code-color-5); } /* Literal.String.Symbol */
-.highlight .bp { color: var(--code-color-13); } /* Name.Builtin.Pseudo */
-.highlight .vc { color: var(--code-color-7); } /* Name.Variable.Class */
-.highlight .vg { color: var(--code-color-7); } /* Name.Variable.Global */
-.highlight .vi { color: var(--code-color-7); } /* Name.Variable.Instance */
-.highlight .il { color: var(--code-color-14); } /* Literal.Number.Integer.Long */
+.lineno {
+ color: var(--code-color-1);
+ margin-right: 15px;
+}
+
+figure.highlight {
+ margin: 5px 0;
+}
+
+pre {
+ background-color: var(--background-color);
+ border: none;
+ padding: 0;
+ margin: 0;
+ overflow: auto;
+ font-size: $base-font-size;
+ color: var(--text-color);
+ line-height: 1.7 !important;
+ font-family: $base-font-family !important;
+}
+
+.highlight .hll {
+ background-color: var(--code-color-2);
+}
+
+.highlight .c {
+ color: var(--code-color-1);
+ font-style: italic
+}
+
+/* Comment */
+.highlight .err {
+ color: var(--code-color-3);
+ background-color: var(--code-color-4);
+}
+
+/* Error */
+.highlight .k {
+ color: var(--code-color-5);
+}
+
+/* Keyword */
+.highlight .cm {
+ color: var(--code-color-1);
+ font-style: italic
+}
+
+/* Comment.Multiline */
+.highlight .cp {
+ color: var(--code-color-6);
+}
+
+/* Comment.Preproc */
+.highlight .c1 {
+ color: var(--code-color-1);
+ font-style: italic
+}
+
+/* Comment.Single */
+.highlight .cs {
+ color: var(--code-color-5);
+ font-style: italic
+}
+
+/* Comment.Special */
+.highlight .gd {
+ color: var(--code-color-7);
+}
+
+/* Generic.Deleted */
+.highlight .ge {
+ font-style: italic
+}
+
+/* Generic.Emph */
+.highlight .gr {
+ color: var(--code-color-7);
+}
+
+/* Generic.Error */
+.highlight .gh {
+ color: var(--code-color-8);
+ font-weight: bold
+}
+
+/* Generic.Heading */
+.highlight .gi {
+ color: var(--code-color-9);
+}
+
+/* Generic.Inserted */
+.highlight .go {
+ color: var(--code-color-10);
+}
+
+/* Generic.Output */
+.highlight .gp {
+ color: var(--code-color-11);
+}
+
+/* Generic.Prompt */
+.highlight .gs {
+ font-weight: bold
+}
+
+/* Generic.Strong */
+.highlight .gu {
+ color: var(--code-color-12);
+ font-weight: bold
+}
+
+/* Generic.Subheading */
+.highlight .gt {
+ color: var(--code-color-7);
+}
+
+/* Generic.Traceback */
+.highlight .kc {
+ color: var(--code-color-5);
+}
+
+/* Keyword.Constant */
+.highlight .kd {
+ color: var(--code-color-5);
+}
+
+/* Keyword.Declaration */
+.highlight .kn {
+ color: var(--code-color-5);
+}
+
+/* Keyword.Namespace */
+.highlight .kp {
+ color: var(--code-color-5);
+}
+
+/* Keyword.Pseudo */
+.highlight .kr {
+ color: var(--code-color-5);
+}
+
+/* Keyword.Reserved */
+.highlight .kt {
+ color: var(--code-color-13);
+}
+
+/* Keyword.Type */
+.highlight .m {
+ color: var(--code-color-14);
+}
+
+/* Literal.Number */
+.highlight .s {
+ color: var(--code-color-15);
+}
+
+/* Literal.String */
+.highlight .na {
+ color: var(--code-color-16);
+}
+
+/* Name.Attribute */
+.highlight .nb {
+ color: var(--code-color-13);
+}
+
+/* Name.Builtin */
+.highlight .nc {
+ color: var(--code-color-9);
+ text-decoration: underline
+}
+
+/* Name.Class */
+.highlight .no {
+ color: var(--code-color-7);
+}
+
+/* Name.Constant */
+.highlight .nd {
+ color: var(--code-color-10);
+}
+
+/* Name.Decorator */
+.highlight .ni {
+ color: var(--code-color-17);
+ font-weight: bold
+}
+
+/* Name.Entity */
+.highlight .nf {
+ color: var(--code-color-9);
+}
+
+/* Name.Function */
+.highlight .nn {
+ color: var(--code-color-13);
+ text-decoration: underline
+}
+
+/* Name.Namespace */
+.highlight .nt {
+ color: var(--code-color-16);
+ font-weight: bold
+}
+
+/* Name.Tag */
+.highlight .nv {
+ color: var(--code-color-7);
+}
+
+/* Name.Variable */
+.highlight .ow {
+ color: var(--code-color-5);
+}
+
+/* Operator.Word */
+.highlight .w {
+ color: var(--code-color-18);
+}
+
+/* Text.Whitespace */
+.highlight .mf {
+ color: var(--code-color-14);
+}
+
+/* Literal.Number.Float */
+.highlight .mh {
+ color: var(--code-color-14);
+}
+
+/* Literal.Number.Hex */
+.highlight .mi {
+ color: var(--code-color-14);
+}
+
+/* Literal.Number.Integer */
+.highlight .mo {
+ color: var(--code-color-14);
+}
+
+/* Literal.Number.Oct */
+.highlight .sb {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Backtick */
+.highlight .sc {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Char */
+.highlight .sd {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Doc */
+.highlight .s2 {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Double */
+.highlight .se {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Escape */
+.highlight .sh {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Heredoc */
+.highlight .si {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Interpol */
+.highlight .sx {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Other */
+.highlight .sr {
+ color: var(--code-color-14);
+}
+
+/* Literal.String.Regex */
+.highlight .s1 {
+ color: var(--code-color-15);
+}
+
+/* Literal.String.Single */
+.highlight .ss {
+ color: var(--code-color-5);
+}
+
+/* Literal.String.Symbol */
+.highlight .bp {
+ color: var(--code-color-13);
+}
+
+/* Name.Builtin.Pseudo */
+.highlight .vc {
+ color: var(--code-color-7);
+}
+
+/* Name.Variable.Class */
+.highlight .vg {
+ color: var(--code-color-7);
+}
+
+/* Name.Variable.Global */
+.highlight .vi {
+ color: var(--code-color-7);
+}
+
+/* Name.Variable.Instance */
+.highlight .il {
+ color: var(--code-color-14);
+}
+
+/* Literal.Number.Integer.Long */
.hide {
@@ -393,19 +831,108 @@ pre { background-color: var(--background-color); border: none; padding: 0; ma
display: inline-block;
}
+
/**
- * Media Queries
+ * Carousel
+ */
+
+.carousel-container {
+ padding-left: 80px;
+}
+
+#carousel {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ overflow: hidden;
+ height: 320px;
+ padding-left: 100px;
+ position: relative;
+}
+
+.carousel-item {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ max-width: 400px;
+ height: 80px;
+ width: 100%;
+ font-size: 16px;
+ opacity: 0.5;
+ margin: 5px 0;
+ position: absolute;
+ left: 0;
+ right: 0;
+ transition: transform 1s ease, font-size 1s ease, opacity 1s ease;
+ transform-origin: center;
+ visibility: hidden;
+ overflow: hidden;
+}
+
+.carousel-link {
+ text-align: left;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ line-height: 1.2;
+ max-height: 2.4em;
+ width: 100%;
+ margin: 0 10px;
+ white-space: normal;
+}
+
+.carousel-item.active {
+ transform: translateY(0) scale(1.2);
+ font-size: 20px;
+ opacity: 1;
+ visibility: visible;
+}
+/** end carousel */
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Work Sans', sans-serif;
+ font-weight: 400;
+ width: 100%;
+}
+
+.wrapper {
+ background: linear-gradient(60deg, #420285, #08BDBD);
+ height: 100%;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+}
+
+.title {
+ text-transform: uppercase;
+ font-size: 20px;
+ margin-top: 10px;
+}
+
+/**
+ * media queries
*/
@media (max-width: 1020px) {
.flex-container-inner {
width: 100% !important;
}
+
.flex-container {
display: inline-block;
}
+
.hide {
display: inline-block;
}
+
.show {
display: none;
}
@@ -415,9 +942,15 @@ pre { background-color: var(--background-color); border: none; padding: 0; ma
.companies {
flex-wrap: wrap;
}
+
.companies div {
width: 100%;
height: 170px;
border-bottom: none;
}
+
+ .carousel-container {
+ padding-top: 50px;
+ padding-left: 10px;
+ }
}
\ No newline at end of file
diff --git a/assets/js/carousel-items.json b/assets/js/carousel-items.json
new file mode 100644
index 0000000..b20e831
--- /dev/null
+++ b/assets/js/carousel-items.json
@@ -0,0 +1,122 @@
+[
+ {
+ "link": "https://www.wired.com/story/the-untold-story-of-solarwinds-the-boldest-supply-chain-hack-ever/",
+ "description": "SolarWind: The Untold Story of the Boldest Supply-Chain Hack Ever"
+ },
+ {
+ "link": "https://www.theverge.com/2018/4/24/17275982/myetherwallet-hack-bgp-dns-hijacking-stolen-ethereum",
+ "description": "Hackers emptied Ethereum wallets by breaking the basic infrastructure of the internet"
+ },
+ {
+ "link": "https://milksad.info/",
+ "description": "A practical explanation of how weak entropy can ruin your day - and your savings."
+ },
+ {
+ "link": "https://thehackerblog.com/zero-days-without-incident-compromising-angular-via-expired-npm-publisher-email-domains-7kZplW4x/",
+ "description": "Compromising Angular via Expired npm Publisher Email Domains"
+ },
+ {
+ "link": "https://blog.ryotak.net/post/homebrew-security-incident-en/",
+ "description": "Remote code execution in Homebrew by compromising the official Cask repository"
+ },
+ {
+ "link": "https://gizmodo.com/u-s-federal-investigators-are-reportedly-looking-into-1846707144link4",
+ "description": "U.S. Federal Investigators Are Reportedly Looking Into Codecov Security Breach, Undetected for Months"
+ },
+ {
+ "link": "https://www.bleepingcomputer.com/news/security/big-sabotage-famous-npm-package-deletes-files-to-protest-ukraine-war/",
+ "description": "BIG sabotage: Famous npm package deletes files to protest Ukraine war"
+ },
+ {
+ "link": "https://certitude.consulting/blog/en/invisible-backdoor/",
+ "description": "The Invisible JavaScript Backdoor"
+ },
+ {
+ "link": "https://thehackernews.com/2022/06/multiple-backdoored-python-libraries.html?m=1",
+ "description": "Multiple Backdoored Python Libraries Caught Stealing AWS Secrets and Keys"
+ },
+ {
+ "link": "https://www.wired.com/story/3cx-supply-chain-attack-times-two/",
+ "description": "The Huge 3CX Breach Was Actually 2 Linked Supply Chain Attacks"
+ },
+ {
+ "link": "https://www.zdnet.com/article/iota-cryptocurrency-shuts-down-entire-network-after-wallet-hack/",
+ "description": "IOTA cryptocurrency shuts down entire network after wallet hack "
+ },
+ {
+ "link": "https://arstechnica.com/information-technology/2021/02/supply-chain-attack-that-fooled-apple-and-microsoft-is-attracting-copycats/",
+ "description": "New type of supply-chain attack hit Apple, Microsoft and 33 other companies"
+ },
+ {
+ "link": "https://www.bankinfosecurity.com/crypto-exchange-klayswap-loses-19m-after-bgp-hijack-a-18518",
+ "description": "Crypto Exchange KLAYswap Loses $1.9M After BGP Hijack"
+ },
+ {
+ "link": "https://www.businessinsider.com/kidnapped-crypto-exec-released-after-paying-1-million-bitcoin-ransom-2017-12",
+ "description": "A kidnapped crypto executive was reportedly released after paying a $1 million bitcoin ransom"
+ },
+ {
+ "link": "https://www.independent.co.uk/tech/bitcoin-robbery-torture-cryptocurrency-netherlands-a8807986.html",
+ "description": "Bitcoin trader brutally tortured with drill in cryptocurrency robbery"
+ },
+ {
+ "link": "https://www.vice.com/en/article/ne4pvg/police-in-ottawa-canada-charged-a-teen-with-armed-bitcoin-robbery-are-hunting-two-suspects",
+ "description": "Three Armed Men Attempted to Rob a Bitcoin Exchange In Canada"
+ },
+ {
+ "link": "https://www.birminghammail.co.uk/news/midlands-news/watch-masked-raiders-hold-up-16599570",
+ "description": "Watch - Masked raiders hold up Bitcoin Exchange store in Sparkhill in front of dozens of witnesses"
+ },
+ {
+ "link": "https://www.nzherald.co.nz/nz/crypto-heist-raiders-steal-safe-containing-4m-in-cryptocurrency-from-westmere-home/PI3L5LMS6PCSVABJDYSW5O4YGA/",
+ "description": "Crypto heist: Raiders steal safe containing $4m in cryptocurrency from Westmere home"
+ },
+ {
+ "link": "https://www.computerworld.com/article/2538534/data-center-robbery-leads-to-new-thinking-on-security.html",
+ "description": "Data center robbery leads to new thinking on security"
+ },
+ {
+ "link": "https://www.thirdsector.co.uk/plan-uk-alerts-supporters-theft-computer-servers-its-offices/management/article/1375208",
+ "description": "Plan UK alerts supporters to theft of computer servers from its offices"
+ },
+ {
+ "link": "https://www.pcmag.com/news/vudu-resets-passwords-after-user-data-stolen-in-burglary",
+ "description": "Vudu Resets Passwords After User Data Stolen in Burglary"
+ },
+ {
+ "link": "https://finance.yahoo.com/news/hackers-scored-data-center-logins-020028440.html",
+ "description": "Hackers Scored Data Center Logins for Some of the World's Biggest Companies"
+ },
+ {
+ "link": "https://www.cbsnews.com/news/nsa-broke-into-yahoo-and-google-data-centers-around-world-report-says/",
+ "description": "NSA broke into Yahoo and Google data centers around world, report says"
+ },
+ {
+ "link": "https://www.vice.com/en/article/3kxy4k/high-tech-japanese-hotel-service-robots-easily-hackable",
+ "description": "High-Tech Japanese Hotel Finds Out Its Service Robots Are Easily Hackable"
+ },
+ {
+ "link": "https://www.washingtonpost.com/news/innovations/wp/2017/07/21/how-a-fish-tank-helped-hack-a-casino/",
+ "description": "How a fish tank helped hack a casino"
+ },
+ {
+ "link": "https://www.wsj.com/articles/fraudsters-use-ai-to-mimic-ceos-voice-in-unusual-cybercrime-case-11567157402",
+ "description": "Fraudsters Used AI to Mimic CEO's Voice in Unusual Cybercrime Case"
+ },
+ {
+ "link": "https://www.forbes.com/sites/iainmartin/2023/08/21/blockchain-capitals-bart-stephens-lost-63-million-in-sim-swap-crypto-hack/?sh=6cc4576bf74c",
+ "description": "Blockchain Capital's Bart Stephens Lost $6.3 Million In SIM-Swap Crypto Hack"
+ },
+ {
+ "link": "https://www.wsj.com/articles/he-thought-his-phone-was-secure-then-he-lost-24-million-to-hackers-11573221600",
+ "description": "He Thought His Phone Was Secure; Then He Lost $24 Million to Hackers"
+ },
+ {
+ "link": "https://arstechnica.com/information-technology/2018/02/tesla-cloud-resources-are-hacked-to-run-cryptocurrency-mining-malware/",
+ "description": "Tesla cloud resources are hacked to run cryptocurrency-mining malware"
+ },
+ {
+ "link": "https://www.wired.com/story/sea-turtle-dns-hijacking/",
+ "description": "Cyberspies Hijacked the Internet Domains of Entire Countries"
+ }
+]
diff --git a/assets/js/main.js b/assets/js/main.js
index 4621183..c99fe57 100644
--- a/assets/js/main.js
+++ b/assets/js/main.js
@@ -8,3 +8,58 @@ collapsibleButton.addEventListener("click", function () {
menuContent.style.display = "block";
}
});
+
+document.addEventListener('DOMContentLoaded', function () {
+ fetch('../assets/js/carousel-items.json')
+ .then(response => response.json())
+ .then(data => {
+ createCarouselItems(data);
+ initializeCarousel();
+ })
+ .catch(error => console.error('Error loading JSON:', error));
+});
+
+function createCarouselItems(items) {
+ const carousel = document.querySelector('#carousel');
+ items.forEach(item => {
+ const itemDiv = document.createElement('div');
+ itemDiv.className = 'carousel-item'
+
+ const link = document.createElement('a');
+ link.className = 'carousel-link';
+ link.href = item.link;
+ link.target = '_blank';
+ link.rel = 'noopener noreferrer';
+ const linkText = document.createTextNode(item.description);
+
+ link.appendChild(linkText);
+ itemDiv.appendChild(link);
+ carousel.appendChild(itemDiv);
+ });
+}
+
+function initializeCarousel() {
+ const carousel = document.querySelector('#carousel');
+ const items = Array.from(carousel.children);
+ const totalItems = items.length;
+ const middleIndex = Math.floor(totalItems / 2);
+ let currentIndex = -middleIndex;
+
+ function cycleItems() {
+ currentIndex = (currentIndex - 1 + totalItems) % totalItems;
+ updateCarouselItems();
+ }
+
+ function updateCarouselItems() {
+ items.forEach((item, index) => {
+ let positionIndex = (currentIndex + index + totalItems) % totalItems;
+ let offset = positionIndex - middleIndex;
+ item.style.transform = `translateY(${offset * 100}%)`;
+ item.classList.toggle('active', positionIndex === middleIndex);
+ item.style.visibility = 'visible';
+ });
+ }
+
+ updateCarouselItems();
+ setInterval(cycleItems, 7000);
+}
\ No newline at end of file