diff --git a/components/ContactForm/ContactForm.module.css b/components/ContactForm/ContactForm.module.css
index 27aed71a..ab69ed23 100644
--- a/components/ContactForm/ContactForm.module.css
+++ b/components/ContactForm/ContactForm.module.css
@@ -7,6 +7,8 @@
color: var(--text);
background-color: var(--super-duper-light);
border-color: var(--light);
+ /* light-dark theme switch fading */
+ transition: background 0.25s ease;
}
.input:focus {
@@ -18,12 +20,6 @@
border-color: var(--error);
}
-.input,
-.btn_submit {
- /* light-dark theme switch fading */
- transition: background 0.25s ease;
-}
-
.textarea {
height: 12em;
min-height: 6em;
diff --git a/components/Header/Header.module.css b/components/Header/Header.module.css
index 65e0c7e6..157917e6 100644
--- a/components/Header/Header.module.css
+++ b/components/Header/Header.module.css
@@ -29,13 +29,11 @@
.menu {
max-width: 325px;
- margin-left: 2.5em;
}
}
@media screen and (max-width: 380px) {
.menu {
max-width: 225px;
- margin-left: 1.6em;
}
}
diff --git a/components/Icons/index.ts b/components/Icons/index.ts
index 95e81dd9..75210d1a 100644
--- a/components/Icons/index.ts
+++ b/components/Icons/index.ts
@@ -1,26 +1,20 @@
-// emoji from Twemoji: https://twemoji.twitter.com/
-export { default as BotIcon } from "../../node_modules/twemoji/assets/svg/1f916.svg";
-export { default as ContactIcon } from "../../node_modules/twemoji/assets/svg/1f4ec.svg";
-export { default as DateIcon } from "../../node_modules/twemoji/assets/svg/1f4c5.svg";
-export { default as EditIcon } from "../../node_modules/twemoji/assets/svg/270f.svg";
-export { default as FloppyIcon } from "../../node_modules/twemoji/assets/svg/1f4be.svg";
-export { default as HeartIcon } from "../../node_modules/twemoji/assets/svg/2764.svg";
-export { default as HomeIcon } from "../../node_modules/twemoji/assets/svg/1f3e1.svg";
-export { default as LaptopIcon } from "../../node_modules/twemoji/assets/svg/1f4bb.svg";
-export { default as LicenseIcon } from "../../node_modules/twemoji/assets/svg/1f4dc.svg";
-export { default as LockIcon } from "../../node_modules/twemoji/assets/svg/1f510.svg";
-export { default as MailIcon } from "../../node_modules/twemoji/assets/svg/2709.svg";
-export { default as NotesIcon } from "../../node_modules/twemoji/assets/svg/1f5d2.svg";
-export { default as PrivacyIcon } from "../../node_modules/twemoji/assets/svg/1f575.svg";
-export { default as ProjectsIcon } from "../../node_modules/twemoji/assets/svg/1f468-200d-1f4bb.svg";
-export { default as SendIcon } from "../../node_modules/twemoji/assets/svg/1f4e4.svg";
-export { default as SirenIcon } from "../../node_modules/twemoji/assets/svg/1f6a8.svg";
-export { default as TagIcon } from "../../node_modules/twemoji/assets/svg/1f3f7.svg";
-export { default as TapeIcon } from "../../node_modules/twemoji/assets/svg/1f4fc.svg";
-export { default as ViewsIcon } from "../../node_modules/twemoji/assets/svg/1f440.svg";
-export { default as WaveIcon } from "../../node_modules/twemoji/assets/svg/1f44b.svg";
+// Icons from various packs, imported directly from the package's SVG files instead of their exports so they're all
+// processed consistently via svgr/webpack into React components.
+// NOTE: each node_modules/ directory *must* be listed in svgr's webpack config in next.config.js.
-// https://primer.style/octicons/
+// feather icons: https://feathericons.com/
+export { default as ContactIcon } from "../../node_modules/feather-icons/dist/icons/mail.svg";
+export { default as DateIcon } from "../../node_modules/feather-icons/dist/icons/calendar.svg";
+export { default as EditIcon } from "../../node_modules/feather-icons/dist/icons/edit.svg";
+export { default as HomeIcon } from "../../node_modules/feather-icons/dist/icons/home.svg";
+export { default as MoonIcon } from "../../node_modules/feather-icons/dist/icons/moon.svg";
+export { default as NotesIcon } from "../../node_modules/feather-icons/dist/icons/edit-3.svg";
+export { default as ProjectsIcon } from "../../node_modules/feather-icons/dist/icons/code.svg";
+export { default as SunIcon } from "../../node_modules/feather-icons/dist/icons/sun.svg";
+export { default as TagIcon } from "../../node_modules/feather-icons/dist/icons/tag.svg";
+export { default as ViewsIcon } from "../../node_modules/feather-icons/dist/icons/eye.svg";
+
+// octicons: https://primer.style/octicons/
export { default as CheckOcticon } from "../../node_modules/@primer/octicons/build/svg/check-16.svg";
export { default as ClipboardOcticon } from "../../node_modules/@primer/octicons/build/svg/paste-16.svg";
export { default as ForkOcticon } from "../../node_modules/@primer/octicons/build/svg/repo-forked-16.svg";
@@ -28,5 +22,9 @@ export { default as OctocatOcticon } from "../../node_modules/@primer/octicons/b
export { default as StarOcticon } from "../../node_modules/@primer/octicons/build/svg/star-16.svg";
export { default as XOcticon } from "../../node_modules/@primer/octicons/build/svg/x-16.svg";
-// https://simpleicons.org/
+// emoji from Twemoji: https://twemoji.twitter.com/
+export { default as HeartIcon } from "../../node_modules/twemoji/assets/svg/2764.svg";
+export { default as SendIcon } from "../../node_modules/twemoji/assets/svg/1f4e4.svg";
+
+// simple icons: https://simpleicons.org/
export { default as NextjsLogo } from "../../node_modules/simple-icons/icons/nextdotjs.svg";
diff --git a/components/Menu/Menu.module.css b/components/Menu/Menu.module.css
index 9b49bae3..d67dc5e4 100644
--- a/components/Menu/Menu.module.css
+++ b/components/Menu/Menu.module.css
@@ -7,39 +7,19 @@
.menu_item {
list-style: none;
display: inline-flex;
- margin-left: 1.8em;
-}
-
-.menu_item .link {
- display: inline-flex;
- align-items: center;
- color: var(--medium-dark);
-}
-
-.menu_item .link:hover {
- color: var(--link);
+ margin-left: 1em;
}
.menu_item .icon {
- width: 1.6em;
- height: 1.6em;
-}
-
-.menu_item .label {
- font-size: 0.95em;
- font-weight: 500;
- margin-left: 0.8em;
- line-height: 1;
-}
-
-.menu_item.theme_toggle {
- margin-left: 1.25em;
+ width: 1.25em;
+ height: 1.25em;
}
@media screen and (max-width: 768px) {
.menu {
width: 100%;
justify-content: space-between;
+ margin-left: 1em;
}
.menu_item {
@@ -50,19 +30,14 @@
width: 1.8em;
height: 1.8em;
}
-
- /* hide text next to emojis on mobile */
- .menu_item .label {
- display: none;
- }
-
- .menu_item.theme_toggle {
- margin-left: -0.3em;
- }
}
-/* the home icon is redundant when space is SUPER tight */
@media screen and (max-width: 380px) {
+ .menu {
+ margin-left: 1.4em;
+ }
+
+ /* the home icon is redundant when space is SUPER tight */
.menu_item:first-of-type {
display: none;
}
diff --git a/components/Menu/Menu.tsx b/components/Menu/Menu.tsx
index eaa87e05..e034b7bd 100644
--- a/components/Menu/Menu.tsx
+++ b/components/Menu/Menu.tsx
@@ -1,6 +1,7 @@
import { memo } from "react";
-import Link from "next/link";
+import { useRouter } from "next/router";
import classNames from "classnames";
+import MenuLink from "../MenuLink/MenuLink";
import ThemeToggle from "../ThemeToggle/ThemeToggle";
import { HomeIcon, NotesIcon, ProjectsIcon, ContactIcon } from "../Icons";
@@ -12,43 +13,44 @@ type Props = {
const links = [
{
- icon: