pages/_sass/_base.scss
George 92cebc9bb1
Added support for search (#2415)
Added support for search within the template as suggested in #581. I
decided to go with a client side search based on [Ninja
keys](https://github.com/ssleptsov/ninja-keys), but using [deepdub's
fork](https://github.com/deepdub-ai/ninja-keys) as basis since it
supports fuzzy search.

Had to do a bunch of changes to their code to make it work without using
node to install everything. Also changed to use some colors defined in
our side and using both pages' titles and descriptions for search. Also
had to increase the template max width to better accomodate the new item
in navigation bar.

Missing implementations:
- [ ] One thing I'd love to do (but currently have no idea how) would be
to change the text next to the search button depending on the platform.
For example, if the user is accessing the site on a mac they should use
⌘k instead of ctrl k.
- [x] Test how this looks like (and how it is supposed to work) on
devices with smaller screens
- [x] Support for offline mode

Some screenshots:

---

## Dark version

![Screenshot from 2024-05-13
16-30-12](https://github.com/alshedivat/al-folio/assets/31376482/535acec5-dd7a-48cb-a17f-a295da98b5d3)

![Screenshot from 2024-05-13
16-30-26](https://github.com/alshedivat/al-folio/assets/31376482/6b2d94bb-3981-4252-ae2b-53994b514491)

![Screenshot from 2024-05-13
16-30-36](https://github.com/alshedivat/al-folio/assets/31376482/66262b56-2744-475d-b09f-2cb65210017b)

---

## Light version

![Screenshot from 2024-05-13
16-30-44](https://github.com/alshedivat/al-folio/assets/31376482/a0eec50c-e7ac-4b52-aee8-2050bff05d54)

![Screenshot from 2024-05-13
16-30-50](https://github.com/alshedivat/al-folio/assets/31376482/41d72066-3e68-4ec3-bf3d-140da621f67b)

![Screenshot from 2024-05-13
16-30-55](https://github.com/alshedivat/al-folio/assets/31376482/613fd56e-7180-4373-ab7a-dfed184b5a18)

---------

Signed-off-by: George Araujo <george.gcac@gmail.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-23 23:21:16 -03:00

1126 lines
19 KiB
SCSS

/*******************************************************************************
* Styles for the base elements of the theme.
******************************************************************************/
// Typography
p,
h1,
h2,
h3,
h4,
h5,
h6,
em,
div,
li,
span,
strong {
color: var(--global-text-color);
}
hr {
border-top: 1px solid var(--global-divider-color);
}
table {
td,
th {
font-size: 1rem;
}
th {
font-weight: bold;
}
}
a,
table.table a {
color: var(--global-theme-color);
&:hover {
color: var(--global-theme-color);
text-decoration: underline;
}
&:hover:after :not(.nav-item.dropdown) {
width: 100%;
}
}
.table-dark {
background-color: transparent;
&.table-bordered {
border: 1px solid var(--global-divider-color) !important;
}
}
blockquote {
background: var(--global-bg-color);
border-left: 5px solid var(--global-theme-color);
margin: 1.5em 0;
padding: 1em;
font-size: 1.2rem;
p {
margin-bottom: 0;
}
/* Tips, warnings, and dangers blockquotes */
&.block-tip {
border-color: var(--global-tip-block);
background-color: var(--global-tip-block-bg);
p {
color: var(--global-tip-block-text);
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: var(--global-tip-block-title);
}
}
&.block-warning {
border-color: var(--global-warning-block);
background-color: var(--global-warning-block-bg);
p {
color: var(--global-warning-block-text);
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: var(--global-warning-block-title);
}
}
&.block-danger {
border-color: var(--global-danger-block);
background-color: var(--global-danger-block-bg);
p {
color: var(--global-danger-block-text);
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: var(--global-danger-block-title);
}
}
}
// Checklist
ul.task-list {
list-style-type: none; /* Remove bullets from all levels */
}
ul.task-list > li ul {
/* Nested lists within .task-list */
padding-inline-start: 1.5rem;
}
ul.task-list input[type="checkbox"] {
margin: 0.275rem 0.5rem 0.5rem -1rem;
vertical-align: middle;
}
// Math
.equation {
margin-bottom: 1rem;
text-align: center;
}
// Caption
.caption {
font-size: 0.875rem;
margin-top: 0.75rem;
margin-bottom: 1.5rem;
text-align: center;
}
// Card
.card {
background-color: var(--global-card-bg-color);
.card-img {
width: 100%;
padding-top: 1.25rem;
}
.card-title {
color: var(--global-text-color);
}
.card-body {
padding: 1.25rem 1.25rem 1.25rem 1.25rem;
}
}
// Citation
.citation,
.citation-number {
color: var(--global-theme-color);
}
// Profile
.profile {
width: 100%;
.more-info {
margin-bottom: 5px;
margin-top: 5px;
font-family: monospace;
p {
display: inline-block;
margin: 0;
}
}
}
.profile.float-right {
margin-left: 1rem;
}
.profile.float-left {
margin-right: 1rem;
}
@media (min-width: 576px) {
.profile {
width: 30%;
.address {
p {
display: block;
}
}
}
}
.post-description {
margin-bottom: 2rem;
font-size: 0.875rem;
a {
color: inherit;
&:hover {
color: var(--global-theme-color);
text-decoration: none;
}
}
}
// Navbar customization
.navbar {
box-shadow: none;
border-bottom: 1px solid var(--global-divider-color);
background-color: var(--global-bg-color);
opacity: 0.95;
}
.navbar .dropdown-menu {
background-color: var(--global-bg-color);
border: 1px solid var(--global-divider-color);
a:not(.active) {
color: var(--global-text-color);
}
a:hover {
color: var(--global-hover-color);
}
.dropdown-divider {
border-top: 1px solid var(--global-divider-color) !important;
}
}
.dropdown-item {
color: var(--global-text-color);
&:hover {
color: var(--global-hover-color);
background-color: var(--global-bg-color);
}
}
.navbar.navbar-light {
a {
&:hover {
text-decoration: none;
}
}
.navbar-brand {
color: var(--global-text-color);
}
.navbar-nav .nav-item .nav-link {
color: var(--global-text-color);
&:hover {
color: var(--global-hover-color);
}
}
.navbar-nav .nav-item.active > .nav-link {
background-color: inherit;
font-weight: bolder;
color: var(--global-theme-color);
&:hover {
color: var(--global-hover-color);
}
}
.navbar-brand.social {
padding-bottom: 0;
padding-top: 0;
font-size: 1.7rem;
a {
i::before {
color: var(--global-text-color);
transition-property: all 0.2s ease-in-out;
}
&:hover {
i::before {
color: var(--global-theme-color);
}
}
}
}
}
.navbar-toggler {
.icon-bar {
display: block;
width: 22px;
height: 2px;
background-color: var(--global-text-color);
border-radius: 1px;
margin-bottom: 4px;
transition: all 0.2s;
}
.top-bar {
transform: rotate(45deg);
transform-origin: 10% 10%;
}
.middle-bar {
opacity: 0;
}
.bottom-bar {
transform: rotate(-45deg);
transform-origin: 10% 90%;
}
}
.navbar-toggler.collapsed {
.top-bar {
transform: rotate(0);
}
.middle-bar {
opacity: 1;
}
.bottom-bar {
transform: rotate(0);
}
}
#light-toggle,
#search-toggle {
padding: 0;
border: 0;
background-color: inherit;
color: var(--global-text-color);
&:hover {
color: var(--global-hover-color);
}
}
// Social (bottom)
.social {
text-align: center;
.contact-icons {
font-size: 4rem;
a {
i::before {
color: var(--global-text-color);
transition-property: all 0.2s ease-in-out;
}
&:hover {
i::before {
color: var(--global-theme-color);
}
}
}
}
.contact-note {
font-size: 0.8rem;
}
}
.wechat-modal {
display: none;
position: fixed;
z-index: 1;
padding-top: 100px;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0, 0, 0);
background-color: rgba(0, 0, 0, 0.8);
}
.wechat-modal > img {
display: block;
position: relative;
top: 50%;
left: 50%;
width: 33%;
max-width: 400px;
transform: translate(-50%, -50%);
}
@media only screen and (max-width: 400px) {
.wechat-modal > img {
width: 100%;
}
}
// Footer
footer.fixed-bottom {
background-color: var(--global-footer-bg-color);
font-size: 0.75rem;
.container {
color: var(--global-footer-text-color);
padding-top: 9px;
padding-bottom: 8px;
text-align: center;
}
a {
color: var(--global-footer-link-color);
&:hover {
color: var(--global-theme-color);
text-decoration: none;
}
}
}
footer.sticky-bottom {
border-top: 1px solid var(--global-divider-color);
padding-top: 40px;
padding-bottom: 40px;
font-size: 0.9rem;
.container {
text-align: center;
}
}
// CV
.cv {
margin-bottom: 40px;
.card {
background-color: var(--global-card-bg-color);
border: 1px solid var(--global-divider-color);
.list-group-item {
background-color: inherit;
border-color: var(--global-divider-color);
.badge {
color: var(--global-card-bg-color) !important;
background-color: var(--global-theme-color) !important;
}
}
}
}
.table-cv-map {
background-color: transparent;
border: none;
color: var(--global-text-color);
}
// Repositories
@media (min-width: 768px) {
.repo {
max-width: 50%;
}
}
// Blog
.header-bar {
border-bottom: 1px solid var(--global-divider-color);
text-align: center;
padding-top: 2rem;
padding-bottom: 3rem;
h1 {
color: var(--global-theme-color);
font-size: 5rem;
}
}
.tag-category-list {
border-bottom: 1px solid var(--global-divider-color);
text-align: center;
padding-top: 1rem;
ul {
justify-content: center;
display: flow-root;
p,
li {
list-style: none;
display: inline-block;
padding: 1rem 0.5rem;
color: var(--global-text-color-light);
}
}
}
.post-title {
mjx-container[jax="CHTML"][display="true"] {
display: unset;
}
}
.post-list {
margin: 0;
margin-bottom: 40px;
padding: 0;
li {
border-bottom: 1px solid var(--global-divider-color);
list-style: none;
padding-top: 2rem;
padding-bottom: 2rem;
.post-meta {
color: var(--global-text-color-light);
font-size: 0.875rem;
margin-bottom: 0;
}
.post-tags {
color: var(--global-text-color-light);
font-size: 0.875rem;
padding-top: 0.25rem;
padding-bottom: 0;
}
a {
color: var(--global-text-color);
text-decoration: none;
&:hover {
color: var(--global-theme-color);
}
}
mjx-container[jax="CHTML"][display="true"] {
display: unset;
}
}
}
.pagination {
.page-item {
.page-link {
color: var(--global-text-color);
&:hover {
color: $black-color;
}
}
&.active .page-link {
color: $white-color;
background-color: var(--global-theme-color);
&:hover {
background-color: var(--global-theme-color);
}
}
}
}
// Distill
.distill {
a:hover {
border-bottom-color: var(--global-theme-color);
text-decoration: none;
}
}
// Projects
.projects {
a {
text-decoration: none;
&:hover {
.card-title {
color: var(--global-theme-color);
}
}
}
.card {
img {
width: 100%;
}
}
.grid-sizer,
.grid-item {
width: 250px;
margin-bottom: 10px;
}
h2.category {
color: var(--global-divider-color);
border-bottom: 1px solid var(--global-divider-color);
padding-top: 0.5rem;
margin-top: 2rem;
margin-bottom: 1rem;
text-align: right;
}
}
// Publications
.publications {
margin-top: 2rem;
h1 {
color: var(--global-theme-color);
font-size: 2rem;
text-align: center;
margin-top: 1em;
margin-bottom: 1em;
}
h2 {
margin-bottom: 1rem;
span {
font-size: 1.5rem;
}
}
h2.bibliography {
color: var(--global-divider-color);
border-top: 1px solid var(--global-divider-color);
padding-top: 1rem;
margin-top: 2rem;
text-align: right;
}
ol.bibliography {
list-style: none;
padding: 0;
margin-top: 0;
li {
margin-bottom: 1rem;
.preview {
}
.abbr {
margin-bottom: 0.5rem;
abbr {
display: inline-block;
background-color: var(--global-theme-color);
margin-bottom: 0.5rem;
a {
color: white;
&:hover {
text-decoration: none;
}
}
}
.award {
color: var(--global-theme-color) !important;
border: 1px solid var(--global-theme-color);
}
}
.title {
font-weight: bolder;
}
.author {
a {
border-bottom: 1px dashed var(--global-theme-color);
&:hover {
border-bottom-style: solid;
text-decoration: none;
}
}
> em {
border-bottom: 1px solid;
font-style: normal;
}
> span.more-authors {
color: var(--global-text-color-light);
border-bottom: 1px dashed var(--global-text-color-light);
cursor: pointer;
&:hover {
color: var(--global-text-color);
border-bottom: 1px dashed var(--global-text-color);
}
}
}
.links {
a.btn {
color: var(--global-text-color);
border: 1px solid var(--global-text-color);
padding-left: 1rem;
padding-right: 1rem;
padding-top: 0.25rem;
padding-bottom: 0.25rem;
margin-left: 0;
&:hover {
color: var(--global-theme-color);
border-color: var(--global-theme-color);
}
}
a.award.btn {
border-color: var(--global-highlight-color);
}
}
.badges {
padding-bottom: 0.5rem;
span {
display: inline-block;
color: $black-color;
height: 100%;
padding-right: 0.5rem;
vertical-align: middle;
&:hover {
text-decoration: underline;
}
}
}
.hidden {
font-size: 0.875rem;
max-height: 0px;
overflow: hidden;
text-align: justify;
transition-property: 0.15s ease;
-moz-transition: 0.15s ease;
-ms-transition: 0.15s ease;
-o-transition: 0.15s ease;
transition: all 0.15s ease;
p {
line-height: 1.4em;
margin: 10px;
}
pre {
font-size: 1em;
line-height: 1.4em;
padding: 10px;
}
}
.hidden.open {
max-height: 100em;
transition-property: 0.15s ease;
-moz-transition: 0.15s ease;
-ms-transition: 0.15s ease;
-o-transition: 0.15s ease;
transition: all 0.15s ease;
}
div.abstract.hidden {
border: dashed 1px var(--global-bg-color);
}
div.abstract.hidden.open {
border-color: var(--global-text-color);
}
}
div.award.hidden {
border: dashed 1px var(--global-bg-color);
}
div.award.hidden.open {
border-color: var(--global-highlight-color);
}
}
}
// Rouge Color Customization
figure.highlight {
margin: 0 0 1rem;
}
pre {
color: var(--global-theme-color);
background-color: var(--global-code-bg-color);
border-radius: 6px;
padding: 6px 12px;
pre,
code {
background-color: transparent;
border-radius: 0;
margin-bottom: 0;
padding: 0;
}
}
code {
color: var(--global-theme-color);
background-color: var(--global-code-bg-color);
border-radius: 3px;
padding: 3px 3px;
}
// Transitioning Themes
html.transition,
html.transition *,
html.transition *:before,
html.transition *:after {
transition: all 750ms !important;
transition-delay: 0 !important;
}
// Extra Markdown style (post Customization)
.post {
.post-meta {
color: var(--global-text-color-light);
font-size: 0.875rem;
margin-bottom: 0;
}
.post-tags {
color: var(--global-text-color-light);
font-size: 0.875rem;
padding-top: 0.25rem;
padding-bottom: 1rem;
a {
color: var(--global-text-color-light);
text-decoration: none;
&:hover {
color: var(--global-theme-color);
}
}
}
}
progress {
/* Positioning */
position: fixed;
left: 0;
top: 56px;
z-index: 10;
/* Dimensions */
width: 100%;
height: 1px;
/* Reset the appearance */
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
/* Get rid of the default border in Firefox/Opera. */
border: none;
/* Progress bar container for Firefox/IE10 */
background-color: transparent;
/* Progress bar value for IE10 */
color: var(--global-theme-color);
}
progress::-webkit-progress-bar {
background-color: transparent;
}
progress::-webkit-progress-value {
background-color: var(--global-theme-color);
}
progress::-moz-progress-bar {
background-color: var(--global-theme-color);
}
.progress-container {
width: 100%;
background-color: transparent;
position: fixed;
top: 56px;
left: 0;
height: 5px;
display: block;
}
.progress-bar {
background-color: var(--global-theme-color);
width: 0%;
display: block;
height: inherit;
}
/* Copy button */
.code-display-wrapper {
position: relative;
.copy {
background: var(--global-card-bg-color);
border-color: var(--global-bg-color);
border-radius: 0.3rem;
border-style: none;
color: var(--global-text-color);
font-size: medium;
opacity: 0;
position: absolute;
right: 0.2rem;
top: 0.2rem;
}
&:active .copy,
&:focus .copy,
&:hover .copy {
color: var(--global-hover-color);
opacity: 1;
}
}
.btn-group.dropdown {
.btn {
box-shadow: none;
-webkit-box-shadow: none;
}
.btn-secondary.dropdown-toggle {
border: 1px solid var(--global-divider-color);
.page-size {
color: inherit;
}
&:not(.active) {
background-color: var(--global-bg-color) !important;
color: var(--global-text-color);
}
&:hover {
background-color: var(--global-hover-color) !important;
color: var(--global-hover-text-color) !important;
}
}
.dropdown-menu {
background-color: var(--global-bg-color);
}
.dropdown-item {
background-color: var(--global-bg-color);
color: var(--global-text-color);
&:hover {
color: var(--global-hover-color);
}
}
.dropdown-item.active,
.dropdown-item:active {
background-color: var(--global-hover-color);
color: var(--global-hover-text-color) !important;
&:hover {
color: var(--global-hover-text-color);
}
}
}
/* Table of Contents */
nav[data-toggle="toc"] {
top: 5rem;
.nav .nav > li > a {
font-size: 0.75rem;
}
.nav > li > a {
color: var(--global-text-color);
font-size: 0.75rem;
&:hover {
color: var(--global-hover-color);
border-left-color: var(--global-hover-color);
}
}
.nav-link.active {
color: var(--global-theme-color);
border-left-color: var(--global-theme-color);
font-size: 0.75rem;
&:hover {
color: var(--global-hover-color);
border-left-color: var(--global-hover-color);
}
}
}
/* small screens */
@media (max-width: 576px) {
/* override stickyness so that the navigation does not follow scrolling */
nav[data-toggle="toc"] {
visibility: hidden;
height: 0;
top: 0;
}
}
.featured-posts {
a {
color: var(--global-text-color-light);
text-decoration: none;
.card-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
&:hover {
color: var(--global-theme-color);
.card-title {
color: var(--global-theme-color);
}
}
}
.post-meta {
color: var(--global-text-color-light);
font-size: 0.875rem;
margin-bottom: 0;
padding-top: 0.5rem;
}
}
.unloaded {
display: none !important;
}
.medium-zoom-overlay,
.medium-zoom-image--opened {
z-index: 999;
}
#toc-sidebar {
z-index: 1;
}
.echarts {
height: 400px;
width: 100%;
}
.map {
height: 400px;
width: 100%;
}
swiper-container {
--swiper-navigation-color: var(--global-theme-color);
--swiper-pagination-color: var(--global-theme-color);
--swiper-pagination-bullet-inactive-color: var(--global-text-color);
}
.ps-root {
.ps-algorithm {
margin: 0.8em 0;
border-top: 3px solid var(--global-text-color);
border-bottom: 2px solid var(--global-text-color);
}
.ps-algorithm.with-caption > .ps-line:first-child {
border-bottom: 2px solid var(--global-text-color);
}
}
// Ninja Keys
// for more options, check https://github.com/ssleptsov/ninja-keys?tab=readme-ov-file#css-variables
ninja-keys {
--ninja-accent-color: var(--global-theme-color);
--ninja-icon-size: 0px;
--ninja-modal-background: var(--global-bg-color);
--ninja-z-index: 1031;
}
ninja-keys::part(ninja-input-wrapper) {
background: var(--global-bg-color);
}