diff --git a/apps/web/src/assets/featured/android-police.svg b/apps/web/src/assets/featured/android-police.svg
index a3ae5f8ab..30e8c6d70 100644
--- a/apps/web/src/assets/featured/android-police.svg
+++ b/apps/web/src/assets/featured/android-police.svg
@@ -1,17 +1,12 @@
-
-
\ No newline at end of file
diff --git a/apps/web/src/assets/featured/freedom-press.svg b/apps/web/src/assets/featured/freedom-press.svg
index 90153beab..d80175c67 100644
--- a/apps/web/src/assets/featured/freedom-press.svg
+++ b/apps/web/src/assets/featured/freedom-press.svg
@@ -1,33 +1,40 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/assets/featured/privacy-guides.svg b/apps/web/src/assets/featured/privacy-guides.svg
index 113fe2d87..c6c5497b9 100644
--- a/apps/web/src/assets/featured/privacy-guides.svg
+++ b/apps/web/src/assets/featured/privacy-guides.svg
@@ -1 +1,12 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/assets/featured/techlore.svg b/apps/web/src/assets/featured/techlore.svg
index 106dc243d..001d2f3dc 100644
--- a/apps/web/src/assets/featured/techlore.svg
+++ b/apps/web/src/assets/featured/techlore.svg
@@ -1 +1,35 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/assets/featured/theverge.svg b/apps/web/src/assets/featured/theverge.svg
index 025d739aa..cb66173c2 100644
--- a/apps/web/src/assets/featured/theverge.svg
+++ b/apps/web/src/assets/featured/theverge.svg
@@ -1 +1,3 @@
-The VergeThe Verge logo.
+
+
+
diff --git a/apps/web/src/assets/featured/xda.svg b/apps/web/src/assets/featured/xda.svg
index 3145b7d40..7e6ecdaf8 100644
--- a/apps/web/src/assets/featured/xda.svg
+++ b/apps/web/src/assets/featured/xda.svg
@@ -1,18 +1,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
+
+
+
+
diff --git a/apps/web/src/assets/star.svg b/apps/web/src/assets/star.svg
new file mode 100644
index 000000000..6938e0dec
--- /dev/null
+++ b/apps/web/src/assets/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/web/src/components/accordion/index.tsx b/apps/web/src/components/accordion/index.tsx
index bc376a4b9..a443169d5 100644
--- a/apps/web/src/components/accordion/index.tsx
+++ b/apps/web/src/components/accordion/index.tsx
@@ -19,8 +19,8 @@ along with this program. If not, see .
import { SchemeColors } from "@notesnook/theme";
import { Flex, FlexProps, Text } from "@theme-ui/components";
-import { PropsWithChildren, useEffect, useState } from "react";
-import { ChevronDown, ChevronUp } from "../icons";
+import { PropsWithChildren, useState } from "react";
+import { CaretDown, ChevronDown, ChevronUp } from "../icons";
export type AccordionProps = {
title: string;
@@ -30,6 +30,7 @@ export type AccordionProps = {
buttonSx?: FlexProps["sx"];
titleSx?: FlexProps["sx"];
containerSx?: FlexProps["sx"];
+ variant?: "default" | "faq";
};
export default function Accordion(
@@ -43,9 +44,51 @@ export default function Accordion(
testId,
sx,
containerSx,
+ variant,
...restProps
} = props;
const [isContentHidden, setIsContentHidden] = useState(isClosed);
+ const isFaqVariant = variant === "faq";
+
+ if (isFaqVariant) {
+ return (
+
+ setIsContentHidden((s) => !s)}
+ data-test-id={testId}
+ >
+
+ {title}
+
+
+
+ {!isContentHidden && (
+
+ {children}
+
+ )}
+
+ );
+ }
return (
diff --git a/apps/web/src/components/icons/index.tsx b/apps/web/src/components/icons/index.tsx
index 485923dda..4762430bc 100644
--- a/apps/web/src/components/icons/index.tsx
+++ b/apps/web/src/components/icons/index.tsx
@@ -244,6 +244,7 @@ import EnvelopeSimple from "@notesnook/icons/envelope-simple.svg?react";
import LockSimple from "@notesnook/icons/lock-simple.svg?react";
import ChevronLeftIcon from "@notesnook/icons/chevron-left.svg?react";
import ChevronRightIcon from "@notesnook/icons/chevron-right.svg?react";
+import ChevronDownIcon from "@notesnook/icons/chevron-down.svg?react";
import ClockIcon from "@notesnook/icons/clock.svg?react";
import WarningCircle from "@notesnook/icons/warning-circle.svg?react";
import CloudSvg from "@notesnook/icons/cloud.svg?react";
@@ -258,6 +259,7 @@ import CopyIcon from "@notesnook/icons/copy.svg?react";
import BoxArrowDownIcon from "@notesnook/icons/box-arrow-down.svg?react";
import DownloadIcon from "@notesnook/icons/download-simple.svg?react";
import FloppyDiskIcon from "@notesnook/icons/floppy-disk.svg?react";
+import CheckSvg from "@notesnook/icons/check.svg?react";
type MDIIconWrapperProps = {
title?: string;
@@ -629,6 +631,7 @@ export const SpellCheck = createIcon(mdiSpellcheck);
export const ClearTrash = createIcon(mdiDeleteSweepOutline);
export const CloseCircle = createIcon(mdiCloseCircle);
+export const CheckSvgIcon = createSvgIcon(CheckSvg);
export const PasswordInvisible = createSvgIcon(EyeOpen);
export const PasswordVisible = createSvgIcon(EyeClosed);
export const Chat = createSvgIcon(ChatIcon);
@@ -636,6 +639,7 @@ export const Email = createSvgIcon(EnvelopeSimple);
export const RecoveryCode = createSvgIcon(LockSimple);
export const ChevronLeft = createSvgIcon(ChevronLeftIcon);
export const ChevronRight = createSvgIcon(ChevronRightIcon);
+export const CaretDown = createSvgIcon(ChevronDownIcon);
export const Clock = createSvgIcon(ClockIcon);
export const Warning = createSvgIcon(WarningCircle);
export const Cloud = createSvgIcon(CloudSvg);
diff --git a/apps/web/src/dialogs/buy-dialog/plan-list.tsx b/apps/web/src/dialogs/buy-dialog/plan-list.tsx
index b8fd11fc4..de1c778a7 100644
--- a/apps/web/src/dialogs/buy-dialog/plan-list.tsx
+++ b/apps/web/src/dialogs/buy-dialog/plan-list.tsx
@@ -17,29 +17,47 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-import { Text, Flex, Button, Image, Link, Box } from "@theme-ui/components";
-import { CheckCircleOutline, Loading } from "../../components/icons";
+import { Text, Flex, Button, Image, Link, Box } from "@notesnook/ui";
+import {
+ CheckCircleOutline,
+ Loading,
+ Cloud,
+ FileDoc,
+ Picture,
+ CheckSvgIcon,
+ ArrowRightSvgIcon
+} from "../../components/icons";
import { Plan } from "./types";
import { PERIOD_METADATA, PLAN_METADATA, usePlans } from "./plans";
-import { useState } from "react";
-import { FEATURE_HIGHLIGHTS, isTrialAvailableForPlan } from "./helpers";
+import { useEffect, useRef, useState } from "react";
+import {
+ getFeature,
+ getFeaturesTable,
+ planToAvailability
+} from "@notesnook/common";
import { strings } from "@notesnook/intl";
import { Period, SubscriptionPlan } from "@notesnook/core";
import Cameron from "../../assets/testimonials/cameron.jpg";
import AndroidPolice from "../../assets/featured/android-police.svg";
import AppleInsider from "../../assets/featured/appleinsider.svg";
-import Hackernoon from "../../assets/featured/hackernoon.png";
+// import Hackernoon from "../../assets/featured/hackernoon.png";
import ItsFoss from "../../assets/featured/itsfoss.webp";
import XDA from "../../assets/featured/xda.svg";
import PrivacyGuides from "../../assets/featured/privacy-guides.svg";
import Techlore from "../../assets/featured/techlore.svg";
import TheVerge from "../../assets/featured/theverge.svg";
import FreedomPress from "../../assets/featured/freedom-press.svg";
-import { getFeaturesTable, planToAvailability } from "@notesnook/common";
import { FeatureCaption } from "./feature-caption";
import Accordion from "../../components/accordion";
import { useStore as useUserStore } from "../../stores/user-store";
import { getCurrencySymbol } from "../../common/currencies";
+import Star from "../../assets/star.svg";
+
+const PLAN_CARD_FEATURES = [
+ getFeature("storage"),
+ getFeature("fileSize"),
+ getFeature("fullQualityImages")
+];
type PlansListProps = {
selectedPlan?: string | null;
@@ -53,72 +71,76 @@ const testimonial = {
username: "camflint",
image: Cameron,
name: "Cameron Flint",
+ role: "Verified User",
link: "https://twitter.com/camflint/status/1481061416434286592",
text: "I'm pretty impressed at the progress @notesnook are making on their app — particularly in respect to how performant the app runs and behaves, despite the overhead of end-to-end encrypting user data."
};
+const testimonials = Array.from({ length: 5 }, () => ({ ...testimonial }));
+
const FEATURED_ON = [
{
id: "android-police",
logo: AndroidPolice,
- size: 70,
- filter: {
- light: `grayscale(1) contrast(100) brightness(1)`
- },
+ title: "Android Police",
link: "https://www.androidpolice.com/tried-encrypted-all-in-one-productivity-app-blew-my-mind/"
},
+ {
+ id: "theverge",
+ logo: TheVerge,
+ link: "http://www.theverge.com/23942597/notes-text-evernote-onenote-keep-apps"
+ },
+
+ {
+ id: "freedom-press",
+ logo: FreedomPress,
+ link: "https://freedom.press/digisec/blog/note-taking-security/#notesnook"
+ },
+ {
+ id: "privacy-guides",
+ logo: PrivacyGuides,
+ title: "Privacy Guides",
+ link: "https://www.privacyguides.org/en/notebooks/#notesnook"
+ },
+ {
+ id: "techlore",
+ logo: Techlore,
+ title: "Techlore",
+ link: "https://www.youtube.com/watch?v=I9ibGRNjK3E"
+ },
{
id: "apple-insider",
logo: AppleInsider,
link: "https://appleinsider.com/articles/22/08/18/the-best-secure-note-apps-for-ios-ipados-and-macos-to-keep-your-thoughts-private"
},
+ {
+ id: "xda",
+ logo: XDA,
+ link: "https://www.xda-developers.com/note-taking-app-is-onenote-on-steroids/"
+ },
{
id: "itsfoss",
logo: ItsFoss,
link: "https://news.itsfoss.com/standard-notes-to-notesnook/"
- },
- {
- id: "Hackernoon",
- logo: Hackernoon,
- link: "https://hackernoon.com/top-6-privacy-note-apps-for-linux-and-android-that-actually-sync"
- },
- {
- id: "xda",
- logo: XDA,
- size: 100,
- link: "https://www.xda-developers.com/note-taking-app-is-onenote-on-steroids/"
}
+ // {
+ // id: "Hackernoon",
+ // logo: Hackernoon,
+ // link: "https://hackernoon.com/top-6-privacy-note-apps-for-linux-and-android-that-actually-sync"
+ // },
];
-const RECOMMENDED_BY = [
- {
- id: "privacy-guides",
- logo: PrivacyGuides,
- size: 45,
- link: "https://www.privacyguides.org/en/notebooks/#notesnook"
- },
- {
- id: "techlore",
- logo: Techlore,
- size: 45,
- link: "https://www.youtube.com/watch?v=I9ibGRNjK3E"
- },
- {
- id: "theverge",
- logo: TheVerge,
- size: 140,
- link: "http://www.theverge.com/23942597/notes-text-evernote-onenote-keep-apps"
- },
- {
- id: "freedom-press",
- logo: FreedomPress,
- filter: {
- light: `grayscale(1) contrast(100) brightness(0)`,
- dark: "brightness(0) invert(1)"
- },
- link: "https://freedom.press/digisec/blog/note-taking-security/#notesnook"
- }
-];
+const FEATURE_ICONS: Record> = {
+ storage: Cloud,
+ fileSize: FileDoc,
+ fullQualityImages: Picture
+};
+
+function FeatureIcon({ id }: { id: string }) {
+ const Icon = FEATURE_ICONS[id];
+ if (!Icon) return null;
+ return ;
+}
export function PlansList(props: PlansListProps) {
const {
@@ -136,40 +158,55 @@ export function PlansList(props: PlansListProps) {
<>
{Object.entries(PERIOD_METADATA).map(([id, period]) => (
))}
{isLoading ? (
@@ -183,117 +220,165 @@ export function PlansList(props: PlansListProps) {
)
.map((plan) => {
const metadata = PLAN_METADATA[plan.plan];
+ const isRecommended = recommendedPlan === plan.plan;
return (
-
- {metadata.title}
- {" "}
- {recommendedPlan === plan.plan ? (
-
- Most popular
-
- ) : null}
-
-
-
- {metadata.subtitle}
-
-
- {plan.recurring ? (
-
- ) : (
-
- )}
-
-
- {FEATURE_HIGHLIGHTS.map((feature) => {
- const caption =
- feature.availability[planToAvailability(plan.plan)]
- .caption;
- return (
-
- {feature.title}
-
+ {isRecommended && (
+
-
-
-
- );
- })}
+
+ Recommended
+
+
+ )}
+
+
+ {metadata.subtitle}
+
+
+
+ {plan.recurring ? (
+
+ ) : (
+
+ )}
+
+
+ {PLAN_CARD_FEATURES.map((feature, index) => {
+ const caption =
+ feature.availability[planToAvailability(plan.plan)]
+ .caption;
+ return (
+
+
+
+
+
+ {feature.title}
+
+
+
+
+
+
+ {index < PLAN_CARD_FEATURES.length - 1 && (
+
+ )}
+
+ );
+ })}
+
{selectedPlan === plan.id ? (
-
+
You are on this plan.
) : (
)}
@@ -302,11 +387,11 @@ export function PlansList(props: PlansListProps) {
)}
-
- Cancel anytime. {PERIOD_METADATA[selectedPeriod].refundDays}-day
- money-back guarantee.
-
- */}
+ >
+ );
+}
+
+export function FeaturedOn() {
+ return (
+
+ {FEATURED_ON.map((f) => (
+
+
-
- ))}
-
-
- >
+ {f.title && (
+
+ {f.title}
+
+ )}
+
+
+ ))}
+
);
}
export function Footer() {
return (
<>
-
- FAQs
-
-
- {strings.checkoutFaqs.map((faq) => (
-
- {faq.answer()}
-
- ))}
-
-
- Trusted and recommended by over 200K users
-
- {RECOMMENDED_BY.map((f) => (
-
-
-
- ))}
+
+
+
+
+ Frequently Asked Questions
+
+
+ Find answers to common questions about Notesnook, including
+ features, syncing, privacy, and more. Learn more about how the app
+ works and get clarity.
+
+
+
+ {strings.checkoutFaqs.map((faq, index) => (
+
+
+ {faq.answer()}
+
+
+ ))}
+
document
.getElementById("select-plan")
@@ -422,8 +587,8 @@ function RecurringPricing(props: PricingProps) {
{getCurrencySymbol(plan.currency)}
@@ -431,8 +596,8 @@ function RecurringPricing(props: PricingProps) {
{plan.discount?.type === "regional" ? (
) : null}
- ) : (
-
- )}
-
+ ) : null}
+
{getCurrencySymbol(plan.currency)}
- {monthlyPrice}{" "}
- {isZero ? (
- ""
- ) : (
-
- / month
-
- )}
+ {monthlyPrice}
-
+ {isZero ? (
+ ""
+ ) : (
+
+ {" "}
+ / month
+
+ )}
+
{isZero ? (
"forever"
) : plan.period === "monthly" ? (
@@ -479,11 +660,14 @@ function OneTimePricing(props: PricingProps) {
const { plan } = props;
return (
<>
-
+
{getCurrencySymbol(plan.currency)}
{plan.price.gross}
-
+
{formatOneTimePeriod(plan.period)}
>
@@ -492,131 +676,509 @@ function OneTimePricing(props: PricingProps) {
const rows = getFeaturesTable();
export function ComparePlans() {
+ const plans = [
+ SubscriptionPlan.FREE,
+ SubscriptionPlan.ESSENTIAL,
+ SubscriptionPlan.PRO,
+ SubscriptionPlan.BELIEVER
+ ];
+
return (
-
- Compare plans
-
-
+
+
+
+
+
-
-
+ Compare Plans
+
+
+ Choose the plan that fits your workflow and unlock features for secure
+ note taking. Compare storage, syncing, privacy, and productivity
+ features to find the experience
+
+
+
+
+
- {[
- { id: "id", title: "", width: "5%" },
- ...[
- SubscriptionPlan.FREE,
- SubscriptionPlan.ESSENTIAL,
- SubscriptionPlan.PRO,
- SubscriptionPlan.BELIEVER
- ].map((p) => ({
- id: p,
- title: PLAN_METADATA[p].title,
- width: "20%"
- }))
- ].map((column) =>
- !column.title ? (
- |
- ) : (
-
-
- {column.title}
-
-
- )
- )}
-
-
-
- {rows.map((feature) => (
-
+
+ Features
+
+
+ {plans.map((plan) => (
+
+ {PLAN_METADATA[plan].title}
+
+
+ ))}
+
+ {rows.map((feature, rowIndex) => (
+
+
+
{feature[0]}
- {feature.slice(1).map((limit, index) => (
-
-
-
- ))}
-
- ))}
-
-
+
+ {feature.slice(1).map((limit, index) => (
+
+ {typeof (limit as any).caption === "boolean" ? (
+ (limit as any).caption ? (
+
+ ) : (
+
+ -
+
+ )
+ ) : (limit as any).caption === "infinity" ? (
+
+ ∞
+
+ ) : (
+
+ {(limit as any).caption}
+
+ )}
+
+ ))}
+
+ ))}
+
);
}
-function Testimonial() {
+export function TestimonialsCarousel() {
+ const [currentIndex, setCurrentIndex] = useState(0);
+ const [maxOffset, setMaxOffset] = useState(0);
+ const viewportRef = useRef(null);
+ const trackRef = useRef(null);
+
+ useEffect(() => {
+ const updateMaxOffset = () => {
+ const viewport = viewportRef.current;
+ const track = trackRef.current;
+ if (!viewport || !track) return;
+
+ setMaxOffset(Math.max(0, track.scrollWidth - viewport.clientWidth));
+ };
+
+ updateMaxOffset();
+
+ const resizeObserver = new ResizeObserver(updateMaxOffset);
+ if (viewportRef.current) resizeObserver.observe(viewportRef.current);
+ if (trackRef.current) resizeObserver.observe(trackRef.current);
+
+ return () => resizeObserver.disconnect();
+ }, []);
+
+ const lastIndex = Math.ceil(maxOffset / 620);
+ const offset = Math.min(currentIndex * 620, maxOffset);
+
+ useEffect(() => {
+ setCurrentIndex((index) => Math.min(index, lastIndex));
+ }, [lastIndex]);
+
+ const isFirst = currentIndex === 0;
+ const isLast = currentIndex >= lastIndex;
+
+ const goToPrev = () => {
+ if (isFirst) return;
+ setCurrentIndex((prev) => prev - 1);
+ };
+
+ const goToNext = () => {
+ if (isLast) return;
+ setCurrentIndex((prev) => prev + 1);
+ };
+
return (
-
-
+
+
- {testimonial.text} —{" "}
-
- source
-
-
-
-
-
-
- {testimonial.name}
-
- @{testimonial.username}
+ Testimonials
+
+
+ See how people use Notesnook to organize ideas, manage daily work, and
+ stay focused with a calm and secure writing experience.
+
+
+
+
+ {testimonials.map((t, index) => (
+
+
+
+
+
+
+
+
+
+ {t.name}
+
+
+ {t.role}
+
+
+
+
+ {t.text}
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/views/plans.tsx b/apps/web/src/views/plans.tsx
index e688b9365..3827700f2 100644
--- a/apps/web/src/views/plans.tsx
+++ b/apps/web/src/views/plans.tsx
@@ -20,16 +20,19 @@ along with this program. If not, see .
import { SubscriptionPlan } from "@notesnook/core";
import {
ComparePlans,
+ FeaturedOn,
Footer,
- PlansList
+ PlansList,
+ TestimonialsCarousel
} from "../dialogs/buy-dialog/plan-list";
import { FlexScrollContainer } from "../components/scroll-container";
-import { Button, Flex, Text } from "@theme-ui/components";
+import { Flex, Text, Button, Image, Box } from "@notesnook/ui";
import { useStore as useUserStore } from "../stores/user-store";
import { useEffect } from "react";
import { getQueryParams, hardNavigate } from "../navigation";
-import { Close } from "../components/icons";
import { isUserSubscribed } from "../hooks/use-is-user-premium";
+import { ChevronLeft } from "../components/icons";
+import Star from "../assets/star.svg";
function Plans() {
const user = useUserStore((store) => store.user);
@@ -46,56 +49,112 @@ function Plans() {
return (
- openURL("/")}
- >
-
-
-
+
+
+
+
+ openURL("/")}
+ variant="new_bordered"
+ sx={{
+ position: "absolute",
+ top: 80,
+ right: 80,
+ gap: "12px"
+ }}
+ >
+ Skip
+
+
+
- Select a plan
+ Notesnook Plans
- One subscription for a lifetime of notes.
+ Choose a plan that fits your workflow and keep your notes secure
+ across every device.
+
+ Enjoy powerful privacy-focused features designed for
+ distraction-free writing and organization.
+
+
diff --git a/packages/icons/svgs/arrow-right.svg b/packages/icons/svgs/arrow-right.svg
index ecc91889b..0361a7b55 100644
--- a/packages/icons/svgs/arrow-right.svg
+++ b/packages/icons/svgs/arrow-right.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/packages/icons/svgs/check.svg b/packages/icons/svgs/check.svg
index a44a70fa3..ae64e94ec 100644
--- a/packages/icons/svgs/check.svg
+++ b/packages/icons/svgs/check.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/packages/icons/svgs/chevron-down.svg b/packages/icons/svgs/chevron-down.svg
index 82fa5a048..f2bf45e9a 100644
--- a/packages/icons/svgs/chevron-down.svg
+++ b/packages/icons/svgs/chevron-down.svg
@@ -1,10 +1,3 @@
-
-
-
-
-
-
-
-
-
+
+
diff --git a/packages/icons/svgs/chevron-left.svg b/packages/icons/svgs/chevron-left.svg
index 8bebf83bd..9bdd73bc7 100644
--- a/packages/icons/svgs/chevron-left.svg
+++ b/packages/icons/svgs/chevron-left.svg
@@ -1 +1,3 @@
-
\ No newline at end of file
+
+
+
diff --git a/packages/icons/svgs/chevron-up.svg b/packages/icons/svgs/chevron-up.svg
index b917ac97d..509ede9d8 100644
--- a/packages/icons/svgs/chevron-up.svg
+++ b/packages/icons/svgs/chevron-up.svg
@@ -1,6 +1,6 @@
-
+
diff --git a/packages/icons/svgs/cloud.svg b/packages/icons/svgs/cloud.svg
index 36098840e..230eea064 100755
--- a/packages/icons/svgs/cloud.svg
+++ b/packages/icons/svgs/cloud.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/packages/icons/svgs/file.svg b/packages/icons/svgs/file.svg
index 978af93bb..907f83475 100755
--- a/packages/icons/svgs/file.svg
+++ b/packages/icons/svgs/file.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/packages/icons/svgs/image-outline.svg b/packages/icons/svgs/image-outline.svg
index 5e160b15d..2f94d33e9 100755
--- a/packages/icons/svgs/image-outline.svg
+++ b/packages/icons/svgs/image-outline.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/packages/icons/svgs/image.svg b/packages/icons/svgs/image.svg
index f24268b26..2a412da0f 100755
--- a/packages/icons/svgs/image.svg
+++ b/packages/icons/svgs/image.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/packages/theme/src/theme/variants/button.ts b/packages/theme/src/theme/variants/button.ts
index 51d2b5855..7f4d2298a 100644
--- a/packages/theme/src/theme/variants/button.ts
+++ b/packages/theme/src/theme/variants/button.ts
@@ -115,6 +115,18 @@ const newAnchor: ThemeUIStyleObject = {
fontWeight: 500
};
+const newSecondary: ThemeUIStyleObject = {
+ ...newCreateButtonVariant(
+ "background-secondary",
+ "buttonForeground-secondary",
+ {
+ hover: { bg: "hover-secondary" },
+ active: { bg: "hover-secondary" }
+ }
+ ),
+ border: "1px solid var(--border-secondary)"
+};
+
const primary = createButtonVariant("transparent", "paragraph", {
hover: { bg: "hover" },
active: { bg: "hover" }
@@ -194,6 +206,7 @@ const menuItem: ThemeUIStyleObject = {
export const buttonVariants = {
primary,
secondary,
+ new_secondary: newSecondary,
tertiary,
accent,