-
-
+
+
{isWeightSupported
? snippets[type]
: "This weight is not yet supported"}
handleCopySnippet(e, type)}
disabled={!isWeightSupported}
- style={
- isWeightSupported
- ? { color: "currentColor" }
- : snippetButtonStyle
- }
>
{copied === type ? (
-
+
) : (
@@ -168,11 +194,6 @@ const DetailFooter = () => {
});
}, [entry]);
- const buttonBarStyle: CSSProperties = {
- color: isDark ? "white" : buttonColor,
- backgroundColor: "transparent",
- };
-
const handleCopySnippet = (
event: React.MouseEvent,
type: SnippetType
@@ -193,7 +214,39 @@ const DetailFooter = () => {
if (!ref.current) return;
navigator.clipboard?.writeText(cloneWithSize(ref.current, size).outerHTML);
- setCopied("SVG");
+ setCopied(CopyType.SVG);
+ };
+
+ const handleCopyDataSVG = (
+ event: React.MouseEvent
+ ) => {
+ event.currentTarget.blur();
+ if (!entry) return;
+ if (!ref.current) return;
+
+ navigator.clipboard?.writeText(
+ "data:image/svg+xml;base64," +
+ btoa(
+ unescape(
+ encodeURIComponent(cloneWithSize(ref.current, size).outerHTML)
+ )
+ )
+ );
+ setCopied(CopyType.SVG_DATA);
+ };
+
+ const handleCopyRawSVG = async () => {
+ if (!entry) return;
+
+ const { name } = entry;
+ const data = await fetch(
+ `https://raw.githubusercontent.com/phosphor-icons/core/main/raw/${weight}/${name}${
+ weight === "regular" ? "" : `-${weight}`
+ }.svg`
+ );
+ const content = await data.text();
+ navigator.clipboard?.writeText(content);
+ setCopied(CopyType.SVG_RAW);
};
const handleDownloadSVG = (
@@ -223,6 +276,40 @@ const DetailFooter = () => {
);
};
+ const handleCopyPNG = async (
+ event: React.MouseEvent
+ ) => {
+ event.currentTarget.blur();
+ if (!entry) return;
+ if (!ref.current) return;
+
+ Svg2Png.toDataURL(cloneWithSize(ref.current, size))
+ .then((data) => fetch(data))
+ .then((res) => res.blob())
+ .then((blob) =>
+ navigator.clipboard.write([
+ new ClipboardItem({
+ [blob.type]: blob,
+ }),
+ ])
+ )
+ .then(() => {
+ setCopied(CopyType.PNG);
+ });
+ };
+
+ // const handleCopyDataPNG = async (
+ // event: React.MouseEvent
+ // ) => {
+ // event.currentTarget.blur();
+ // if (!entry) return;
+ // if (!ref.current) return;
+
+ // const data = await Svg2Png.toDataURL(cloneWithSize(ref.current, size));
+ // navigator.clipboard?.writeText(data);
+ // setCopied(CopyType.PNG_DATA);
+ // };
+
return (
{!!entry && (
@@ -244,46 +331,81 @@ const DetailFooter = () => {
-
-
- {" "}
- PNG
-
-
- {" "}
- SVG
-
-
- {copied === "SVG" ? (
-
+
+
+
+ {!showMoreActions ? (
+ <>
+
+
+
+
+
+ >
) : (
-
+ <>
+
+
+
+
+
+ >
+ )}
+
+
setShowMoreActions((s) => !s)}
+ >
+ {!showMoreActions ? (
+
+ ) : (
+
)}
- {copied === "SVG" ? "Copied!" : " SVG"}
- setInitialTab({ i })}
- />
+
{
);
};
-export default DetailFooter;
+export default Panel;
diff --git a/src/components/IconGrid/TagCloud.css b/src/components/IconGrid/TagCloud.css
index 57ee857..64f3729 100644
--- a/src/components/IconGrid/TagCloud.css
+++ b/src/components/IconGrid/TagCloud.css
@@ -1,25 +1,25 @@
.tag-cloud {
display: flex;
flex-wrap: wrap;
- justify-content: center;
+ justify-content: flex-start;
+ gap: 6px;
}
button.tag-button {
- margin: 4px;
border-radius: 4px;
- background-color: var(--sheer);
+ background-color: var(--background-card);
outline: none;
cursor: pointer;
- transition: background-color 200ms ease, box-shadow 200ms ease;
+ transition: background-color 150ms ease, box-shadow 150ms ease;
color: var(--foreground);
}
button.tag-button:hover {
- background-color: var(--soft);
+ background-color: var(--sheer);
}
button.tag-button:focus-visible {
- box-shadow: 0 0 0 1px var(--soft);
+ box-shadow: 0 0 0 1px var(--sheer);
}
.tag-button code {
diff --git a/src/components/Links/Links.tsx b/src/components/Links/Links.tsx
index 72a66d9..5a87a38 100644
--- a/src/components/Links/Links.tsx
+++ b/src/components/Links/Links.tsx
@@ -26,18 +26,18 @@ const Links = (_: LinksProps) => {
-
- Figma library
-
- {" / "}
- plugin
+ Figma plugin
+
+ {" / "}
+
+ library
@@ -56,18 +56,12 @@ const Links = (_: LinksProps) => {
-
-
- Donate on PayPal
-
- {" / "}
-
- Patreon
-
-
+
+ Showcase
+
@@ -91,17 +85,27 @@ const Links = (_: LinksProps) => {
-
- TKTK
-
+
+
+ Donate on PayPal
+
+ {" / "}
+
+ Patreon
+
+
+
diff --git a/src/components/Notice/Notice.tsx b/src/components/Notice/Notice.tsx
index d22cd76..1c353af 100644
--- a/src/components/Notice/Notice.tsx
+++ b/src/components/Notice/Notice.tsx
@@ -1,19 +1,18 @@
import { ReactNode } from "react";
import { motion } from "framer-motion";
-import { useRecoilValue } from "recoil";
import { HourglassMedium, Question, SmileyXEyes } from "@phosphor-icons/react";
-import { searchQueryAtom } from "@/state";
-
interface NoticeProps {
- message?: string;
+ message?: ReactNode;
type?: "wait" | "help" | "warn" | "none";
children?: ReactNode;
}
-const Notice = ({ message, type = "warn", children }: NoticeProps) => {
- const query = useRecoilValue(searchQueryAtom);
-
+const Notice = ({
+ message = "An error occurred.",
+ type = "warn",
+ children,
+}: NoticeProps) => {
return (
{
animate={{ opacity: 1 }}
transition={{ duration: 0.5 }}
>
- {type === "wait" && (
-
- )}
- {type === "help" && (
-
- )}
- {type === "warn" && (
-
- )}
- {message ?? (
-
- No results for "{query}"
-
- )}
- {children}
+
+ {type === "wait" &&
}
+ {type === "help" &&
}
+ {type === "warn" &&
}
+
{message}
+ {children}
+
);
diff --git a/src/components/SearchInput/SearchInput.css b/src/components/SearchInput/SearchInput.css
index 9e96243..71f45fa 100644
--- a/src/components/SearchInput/SearchInput.css
+++ b/src/components/SearchInput/SearchInput.css
@@ -1,4 +1,5 @@
.search-bar {
+ position: relative;
display: flex;
flex: 2;
align-items: center;
@@ -11,7 +12,7 @@
.search-bar:focus-within {
outline: none;
- color: black !important;
+ color: var(--moss) !important;
background-color: white !important;
}
@@ -37,7 +38,7 @@
.search-bar input:focus {
outline: none;
- color: black;
+ color: var(--moss);
}
.search-bar input::placeholder {
@@ -53,6 +54,9 @@
}
.keys {
+ position: absolute;
+ top: 16px;
+ right: 24px;
display: inline-flex;
align-items: center;
justify-content: flex-end;
diff --git a/src/components/SearchInput/SearchInput.tsx b/src/components/SearchInput/SearchInput.tsx
index 414d55f..3c9a995 100644
--- a/src/components/SearchInput/SearchInput.tsx
+++ b/src/components/SearchInput/SearchInput.tsx
@@ -8,7 +8,12 @@ import {
import { useRecoilState } from "recoil";
import { useDebounce } from "react-use";
import { useHotkeys } from "react-hotkeys-hook";
-import { Command, MagnifyingGlass, X, HourglassHigh } from "@phosphor-icons/react";
+import {
+ Command,
+ MagnifyingGlass,
+ X,
+ HourglassHigh,
+} from "@phosphor-icons/react";
import ReactGA from "react-ga4";
import { searchQueryAtom } from "@/state";
diff --git a/src/components/SettingsActions/SettingsActions.css b/src/components/SettingsActions/SettingsActions.css
index b853be1..80aeb78 100644
--- a/src/components/SettingsActions/SettingsActions.css
+++ b/src/components/SettingsActions/SettingsActions.css
@@ -1,17 +1,17 @@
-button.action-button {
+button.tool-button {
background-color: var(--scrim);
color: white;
- padding: 8px;
+ padding: 12px;
border-radius: 8px;
cursor: pointer;
}
-button.action-button:active {
+button.tool-button:active {
background-color: var(--sheer);
}
@media screen and (max-width: 558px) {
- .toolbar .action-button {
+ .toolbar .tool-button {
display: none;
}
}
diff --git a/src/components/SettingsActions/SettingsActions.tsx b/src/components/SettingsActions/SettingsActions.tsx
index 69c89ef..ac5ef8c 100644
--- a/src/components/SettingsActions/SettingsActions.tsx
+++ b/src/components/SettingsActions/SettingsActions.tsx
@@ -1,5 +1,13 @@
-import { useRecoilValue, useResetRecoilState } from "recoil";
-import { ArrowCounterClockwise, CheckCircle, Link } from "@phosphor-icons/react";
+import { useState } from "react";
+import ReactGA from "react-ga4";
+import { useRecoilState, useResetRecoilState } from "recoil";
+import {
+ ArrowCounterClockwise,
+ CheckCircle,
+ DiceFive,
+ Link,
+} from "@phosphor-icons/react";
+import { IconStyle } from "@phosphor-icons/core";
import { useTransientState } from "@/hooks";
import {
@@ -12,12 +20,13 @@ import {
import "./SettingsActions.css";
const SettingsActions = () => {
- const weight = useRecoilValue(iconWeightAtom);
- const size = useRecoilValue(iconSizeAtom);
- const color = useRecoilValue(iconColorAtom);
+ const [weight, setWeight] = useRecoilState(iconWeightAtom);
+ const [size, setSize] = useRecoilState(iconSizeAtom);
+ const [color, setColor] = useRecoilState(iconColorAtom);
const reset = useResetRecoilState(resetSettingsSelector);
const [copied, setCopied] = useTransientState(false, 2000);
+ const [booped, setBooped] = useState(false);
const copyDeepLinkToClipboard = () => {
const paramString = new URLSearchParams([
@@ -35,26 +44,60 @@ const SettingsActions = () => {
});
};
+ const randomizeSettings = () => {
+ if (booped) setBooped(false);
+ setBooped(true);
+
+ const rWeight = Object.values(IconStyle).filter((w) => w !== weight)[
+ Math.floor(Math.random() * 5)
+ ];
+ const rSize = 16 + Math.floor(Math.random() * 20 + 1) * 4;
+ const rColor =
+ "#" +
+ Math.floor(Math.random() * (0xffffff + 1))
+ .toString(16)
+ .padStart(6, "0");
+
+ setWeight(rWeight);
+ setColor(rColor);
+ setSize(rSize);
+
+ ReactGA.event({ category: "Settings", action: "Random" });
+ };
+
return (
<>
{copied ? (
-
+
) : (
)}
+
+ setBooped(false)}
+ >
+
+
+
>
);
};
diff --git a/src/components/StyleInput/StyleInput.css b/src/components/StyleInput/StyleInput.css
index 279205e..9312a09 100644
--- a/src/components/StyleInput/StyleInput.css
+++ b/src/components/StyleInput/StyleInput.css
@@ -28,7 +28,7 @@
.react-dropdown-select:focus-within {
background-color: white;
- color: black;
+ color: var(--moss);
outline: none !important;
box-shadow: none !important;
}
@@ -62,21 +62,21 @@
box-shadow: none;
}
.react-dropdown-select-item {
- color: black;
+ color: var(--moss);
}
.react-dropdown-select-item:hover {
- background-color: var(--yellow) !important;
+ background-color: var(--acid) !important;
}
.react-dropdown-select-item.react-dropdown-select-item-selected,
.react-dropdown-select-item.react-dropdown-select-item-active {
- color: black !important;
- background-color: var(--yellow) !important;
+ color: var(--moss) !important;
+ background-color: var(--acid) !important;
}
.react-dropdown-select-item:focus {
- color: black !important;
- background-color: var(--yellow) !important;
+ color: var(--moss) !important;
+ background-color: var(--acid) !important;
}
.react-dropdown-select-item.react-dropdown-select-item-disabled {
diff --git a/src/components/StyleInput/StyleInput.tsx b/src/components/StyleInput/StyleInput.tsx
index c18c285..f5571ec 100644
--- a/src/components/StyleInput/StyleInput.tsx
+++ b/src/components/StyleInput/StyleInput.tsx
@@ -1,7 +1,7 @@
import { useMemo } from "react";
import { useRecoilState } from "recoil";
import Select from "react-dropdown-select";
-import { PencilLine } from "@phosphor-icons/react";
+import { PencilSimpleLine } from "@phosphor-icons/react";
import { IconStyle } from "@phosphor-icons/core";
import { iconWeightAtom } from "@/state";
@@ -14,32 +14,32 @@ const options: WeightOption[] = [
{
key: "Thin",
value: IconStyle.THIN,
- icon: ,
+ icon: ,
},
{
key: "Light",
value: IconStyle.LIGHT,
- icon: ,
+ icon: ,
},
{
key: "Regular",
value: IconStyle.REGULAR,
- icon: ,
+ icon: ,
},
{
key: "Bold",
value: IconStyle.BOLD,
- icon: ,
+ icon: ,
},
{
key: "Fill",
value: IconStyle.FILL,
- icon: ,
+ icon: ,
},
{
key: "Duotone",
value: IconStyle.DUOTONE,
- icon: ,
+ icon: ,
},
];
diff --git a/src/components/Tabs/Tabs.css b/src/components/Tabs/Tabs.css
index 16a8f48..0aff447 100644
--- a/src/components/Tabs/Tabs.css
+++ b/src/components/Tabs/Tabs.css
@@ -38,17 +38,17 @@ button.tab:hover:not(.active) {
}
button.tab.active {
- background-color: var(--background-tab);
+ background-color: var(--background-layer);
border-bottom: none;
}
.tab-content {
flex: 1;
- height: 77px;
- max-height: 77px;
+ height: 86px;
+ max-height: 86px;
padding: 20px 20px 10px;
border-radius: 8px;
- background-color: var(--background-tab);
+ background-color: var(--background-layer);
overflow-y: auto;
}
diff --git a/src/hooks/useSessionStorage.ts b/src/hooks/useSessionStorage.ts
index 9ce2453..0b7793b 100644
--- a/src/hooks/useSessionStorage.ts
+++ b/src/hooks/useSessionStorage.ts
@@ -5,7 +5,7 @@ type Initializer = () => S;
type Setter = (prev: S) => S;
type Action = S | Setter | Initializer;
-function expand(action: Action, prev?: S) {
+function expand(action: Action, prev?: S) {
if (typeof action === "function") {
return (action as Setter)(prev!);
} else {
@@ -13,13 +13,19 @@ function expand(action: Action, prev?: S) {
}
}
-export default function useSessionStorage(
+export default function useSessionStorage(
key: string,
fallbackState: S | (() => S)
): [S, Dispatch>, (partial: Partial) => void] {
const [value, setValue] = useState(() => {
let val = sessionStorage.getItem(STORAGE_KEY + key);
- if (val) return JSON.parse(val) as S;
+ if (val) {
+ try {
+ return JSON.parse(val) as S;
+ } catch (_) {
+ return val as S;
+ }
+ }
return expand(fallbackState);
});
diff --git a/src/lib/index.ts b/src/lib/index.ts
index 921793a..f03970b 100644
--- a/src/lib/index.ts
+++ b/src/lib/index.ts
@@ -8,7 +8,7 @@ export interface IconEntry extends CoreEntry {
export enum SnippetType {
REACT = "React",
VUE = "Vue",
- HTML = "HTML/CSS",
+ HTML = "Web",
FLUTTER = "Flutter",
ELM = "Elm",
}
From 1e95c69d437666453011980b7ff5664e0a3beb65 Mon Sep 17 00:00:00 2001
From: rektdeckard
Date: Wed, 22 Mar 2023 01:29:34 -0600
Subject: [PATCH 6/7] feat(app): all the rest of the things
---
package.json | 2 +-
src/assets/paperclips-2.svg | 35 ++--
src/assets/paperclips-3.svg | 56 ++----
src/assets/ruler-marker-spec.svg | 182 +++++++++---------
src/assets/ruler-marker.svg | 1 +
src/assets/synth.svg | 117 ++++++-----
src/components/App/App.css | 43 +++--
src/components/App/App.tsx | 3 +
src/components/Footer/Footer.css | 124 ++++++------
src/components/Footer/Footer.tsx | 103 +++++++---
src/components/Header/Header.tsx | 2 +-
src/components/IconGrid/IconGrid.css | 9 +-
src/components/IconGrid/IconGridItem.tsx | 2 +-
src/components/IconGrid/Panel.tsx | 39 ++--
src/components/IconGrid/TagCloud.css | 4 +-
src/components/Links/Links.css | 2 +-
.../SettingsActions/SettingsActions.tsx | 2 +-
src/components/Tabs/Tabs.css | 2 +-
18 files changed, 369 insertions(+), 359 deletions(-)
diff --git a/package.json b/package.json
index f4e8a74..dad1129 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "phosphor-home",
- "version": "2.0.0",
+ "version": "2.0.1",
"license": "MIT",
"homepage": "https://phosphoricons.com",
"author": {
diff --git a/src/assets/paperclips-2.svg b/src/assets/paperclips-2.svg
index 18eb398..75e41e4 100644
--- a/src/assets/paperclips-2.svg
+++ b/src/assets/paperclips-2.svg
@@ -1,32 +1,19 @@
-
-
-
+
+
+
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/src/assets/paperclips-3.svg b/src/assets/paperclips-3.svg
index 279e4dc..68d3971 100644
--- a/src/assets/paperclips-3.svg
+++ b/src/assets/paperclips-3.svg
@@ -1,49 +1,31 @@
-
-
-
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/assets/ruler-marker-spec.svg b/src/assets/ruler-marker-spec.svg
index b99dc19..6c0a8eb 100644
--- a/src/assets/ruler-marker-spec.svg
+++ b/src/assets/ruler-marker-spec.svg
@@ -1,113 +1,113 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -116,7 +116,7 @@
-
+
@@ -141,7 +141,7 @@
-
+
@@ -153,7 +153,7 @@
-
+
diff --git a/src/assets/ruler-marker.svg b/src/assets/ruler-marker.svg
index 64530af..ff0e259 100644
--- a/src/assets/ruler-marker.svg
+++ b/src/assets/ruler-marker.svg
@@ -1,4 +1,5 @@
+
diff --git a/src/assets/synth.svg b/src/assets/synth.svg
index 2458d86..d047fa4 100644
--- a/src/assets/synth.svg
+++ b/src/assets/synth.svg
@@ -1,153 +1,149 @@
-
-
-
-
-
+
-
-
-
-
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -171,10 +167,10 @@
-
+
-
+
@@ -183,10 +179,10 @@
-
+
-
+
@@ -221,6 +217,7 @@
+
diff --git a/src/components/App/App.css b/src/components/App/App.css
index 4e9db5c..ebd73bc 100644
--- a/src/components/App/App.css
+++ b/src/components/App/App.css
@@ -2,28 +2,38 @@
--red: #e8612b;
--orange: #ff8e51;
--yellow: #f8c666;
- --pale: #ffe8dc;
- --peach: #ffd5c0;
+ --mustard: #d6971e;
+ --rust: #92543b;
+ --earth: #825b61;
--sand: #bcadaf;
+ --blush: #f2cbd1;
+ --pale: #ffe8dc;
--vellum: #eeeae3;
+ --ghost: #f7f5f1;
--foam: #e9ebe2;
--lichen: #d2d6c5;
--moss: #3c402b;
--slate: #3e3d3a;
--stone: #343330;
+ --dark-grey: #656461;
--acid: #c4e456;
+ --olive: #a4b55b;
--green: #1fa647;
- --darkgreen: #245633;
+ --darkgreen: #2e321f;
+ --deepgreen: #1f2310;
--blue: #1f7fea;
--purple: #925bff;
--eggplant: #35313d;
--moss-shadow: rgba(60, 64, 43, 0.2);
+ --slate-sheer: rgba(62, 61, 58, 0.5);
+ --ghost-sheer: rgba(247, 245, 241, 0.5);
+ --elephant: #656461;
+ --pewter: #c9c5bf;
--shadow: rgba(0, 0, 0, 0.15);
--scrim: rgba(255, 255, 255, 0.05);
--sheer: rgba(194, 186, 196, 0.25);
--soft: rgba(194, 186, 196, 0.7);
--translucent: rgba(255, 255, 255, 0.5);
- --neutral: #9b9b9b;
}
body {
@@ -140,7 +150,7 @@ a.main-link {
a.main-link:after {
content: "";
position: absolute;
- bottom: -2px;
+ bottom: 0.15em;
left: 0;
width: 100%;
border-bottom: 1px solid var(--moss);
@@ -152,12 +162,16 @@ a.main-link:hover:after {
width: 0%;
}
+.name {
+ color: var(--foreground-secondary);
+}
+
.badge.new {
- color: var(--red);
+ color: var(--mustard);
}
.badge.updated {
- color: var(--blue);
+ color: var(--olive);
}
.badge {
@@ -182,17 +196,16 @@ a.main-link:hover:after {
@keyframes bounce {
0%,
- 20%,
+ 30%,
50%,
- 80%,
100% {
transform: translateY(0);
}
- 40% {
+ 20% {
transform: translateY(-12px);
}
- 60% {
- transform: translateY(-4px);
+ 40% {
+ transform: translateY(-7px);
}
}
@@ -201,13 +214,13 @@ a.main-link:hover:after {
}
@keyframes spin {
- 0%,
- 20% {
+ 0% {
transform: rotate(0);
}
- 40% {
+ 20% {
transform: rotate(200deg);
}
+ 80%,
100% {
transform: rotate(540deg);
}
diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx
index b6e6843..499a3a9 100644
--- a/src/components/App/App.tsx
+++ b/src/components/App/App.tsx
@@ -29,11 +29,14 @@ const App: React.FC = () => {
() => ({
"--foreground": isDark ? "white" : "var(--moss)",
"--foreground-card": isDark ? "white" : "var(--moss)",
+ "--foreground-secondary": isDark ? "var(--pewter)" : "var(--elephant)",
"--background": isDark ? "var(--slate)" : "var(--vellum)",
"--background-card": isDark ? "var(--stone)" : "var(--vellum)",
"--background-layer": isDark ? "var(--scrim)" : "var(--translucent)",
"--border-card": isDark ? "var(--shadow)" : "var(--moss-shadow)",
"--border-secondary": isDark ? "var(--scrim)" : "var(--moss-shadow)",
+ "--hover-tabs": isDark ? "var(--slate-sheer)" : "var(--ghost-sheer)",
+ "--hover-buttons": isDark ? "var(--scrim)" : "var(--slate)",
}),
[isDark]
);
diff --git a/src/components/Footer/Footer.css b/src/components/Footer/Footer.css
index 935e7b6..ddfece7 100644
--- a/src/components/Footer/Footer.css
+++ b/src/components/Footer/Footer.css
@@ -11,6 +11,7 @@ footer {
z-index: 2;
font-size: 56px;
justify-content: center;
+ padding: 0 30px;
}
#back-to-top-button:active {
@@ -48,24 +49,68 @@ footer .links {
.fine-print {
position: relative;
- margin: 72px 0 0;
- padding-bottom: 32px;
+ margin: 104px 0 0;
overflow: hidden;
}
.fine-print p {
font-size: 16px;
line-height: 24px;
+ padding-bottom: 56px;
+ margin: 0;
}
.illustrations-footer {
- position: fixed;
+ position: absolute;
+ overflow-y: hidden;
+ width: 300px;
margin: auto;
- display: none;
- -moz-user-select: none;
- -webkit-user-select: none;
- user-select: none;
- pointer-events: none;
+ bottom: 0;
+ left: -456px;
+ height: 490px;
+}
+
+.ruler-marker {
+ position: absolute;
+}
+
+@media screen and (min-width: 720px) {
+ .outro {
+ margin: 0 auto;
+ }
+
+ .fine-print {
+ margin-top: 72px;
+ }
+
+ #back-to-top-button {
+ position: absolute;
+ left: 70px;
+ top: -56px;
+ }
+}
+
+@media screen and (min-width: 720px) and (max-width: 1239px) {
+ .illustrations-footer {
+ height: 600px;
+ left: -320px;
+ }
+
+ .ruler-marker {
+ bottom: -216px;
+ }
+}
+
+@media screen and (min-width: 1239px) {
+ .outro {
+ margin-left: 462px;
+ }
+
+ #back-to-top-button {
+ position: absolute;
+ left: 190px;
+ top: 348px;
+ }
}
@media screen and (max-width: 719px) {
@@ -86,70 +131,11 @@ footer .links {
margin: 0 0 64px;
}
- #command {
- display: none;
- }
-
- #marker-green {
- display: none;
- }
-
- .illustrations-footer {
- height: 440px;
- display: initial;
- overflow-y: hidden;
- }
-}
-
-@media screen and (min-width: 720px) {
- .outro {
- margin: 0 auto;
- }
-
.fine-print {
- margin-top: 96px;
- padding-bottom: 96px;
- }
-
- #back-to-top-button {
- position: absolute;
- left: 70px;
- top: -56px;
- }
-
- #marker-green {
- position: absolute;
- left: 678px;
- top: -218px;
- }
-
- #command {
- position: absolute;
- right: -18px;
- top: 144px;
- }
-
- .ruler {
- position: absolute;
- transform: rotate(-5deg);
- }
-}
-
-@media screen and (min-width: 1239px) {
- .outro {
- margin-left: 462px;
- }
-
- #back-to-top-button {
- position: absolute;
- left: 190px;
- top: 276px;
+ margin-top: 48px;
}
.illustrations-footer {
- display: initial;
- position: absolute;
- bottom: 0;
- height: 500px !important;
+ display: none;
}
}
diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx
index b03db32..96699a3 100644
--- a/src/components/Footer/Footer.tsx
+++ b/src/components/Footer/Footer.tsx
@@ -1,11 +1,11 @@
import { useRecoilValue } from "recoil";
import { motion, AnimatePresence, Variants } from "framer-motion";
-import { Coffee, Heart, ArrowULeftUp } from "@phosphor-icons/react";
+import { ArrowULeftUp, Coffee, HandHeart } from "@phosphor-icons/react";
import Links from "@/components/Links/Links";
-import { ReactComponent as MarkerGreen } from "@/assets/marker-green.svg";
-import { ReactComponent as Ruler } from "@/assets/ruler.svg";
+import { ReactComponent as RulerMarker } from "@/assets/ruler-marker.svg";
+import { ReactComponent as RulerMarkerSpec } from "@/assets/ruler-marker-spec.svg";
import { useMediaQuery } from "@/hooks";
import { selectionEntryAtom } from "@/state";
import "./Footer.css";
@@ -49,14 +49,64 @@ const Footer = (_: FooterProps) => {
- We designed the icon library we always wanted to use. Easy to pick
- up and plug in. Truly consistent in style and scale. Flexible to
- multiple sizes and weights. Reserved enough to be multi-purpose, but
- a little quirky, too.
+ Phosphor is a passion project by{" "}
+
+ Helena Zhang
+ {" "}
+ and{" "}
+
+ Tobias Fried
+
+ .
- We're thankful for the tools we've benefited from and this is our
- contribution towards a collaborative community.
+ It’s used by companies and creatives like{" "}
+
+ AllTrails
+
+ ,{" "}
+
+ Figma Academy
+
+ ,{" "}
+
+ Framer
+
+ ,{" "}
+
+ Outgo
+
+ ,{" "}
+
+ Pablo Stanley
+
+ ,{" "}
+
+ reMarkable
+
+ ,{" "}
+
+ Qatalog
+
+ ,{" "}
+
+ Spacedrive
+
+ ,{" "}
+
+ Stash
+
+ , and{" "}
+
+ Threads
+
+ .
Phosphor is free and open-source, licensed under{" "}
@@ -92,19 +142,23 @@ const Footer = (_: FooterProps) => {
)
}
>
-
+
Become a patron
-
-