diff --git a/apps/artboard/src/components/brand-icon.tsx b/apps/artboard/src/components/brand-icon.tsx index a572568cd..11d560411 100644 --- a/apps/artboard/src/components/brand-icon.tsx +++ b/apps/artboard/src/components/brand-icon.tsx @@ -1,17 +1,24 @@ +import { forwardRef } from "react"; + type BrandIconProps = { slug: string; }; -export const BrandIcon = ({ slug }: BrandIconProps) => { +export const BrandIcon = forwardRef(({ slug }, ref) => { if (slug === "linkedin") { return ( linkedin ); } - return {slug}; -}; + return ( + {slug} + ); +}); + +BrandIcon.displayName = "BrandIcon"; diff --git a/apps/client/src/components/brand-icon.tsx b/apps/client/src/components/brand-icon.tsx index dc336b369..12cf9d6d1 100644 --- a/apps/client/src/components/brand-icon.tsx +++ b/apps/client/src/components/brand-icon.tsx @@ -1,13 +1,23 @@ -import { cn } from "@reactive-resume/utils"; +import { forwardRef, useEffect } from "react"; +import { useDebounceValue } from "usehooks-ts"; type BrandIconProps = { slug: string; }; -export const BrandIcon = ({ slug }: BrandIconProps) => { - if (slug === "linkedin") { +export const BrandIcon = forwardRef(({ slug }, ref) => { + const [debouncedSlug, setValue] = useDebounceValue(slug, 600); + + useEffect(() => { + setValue(slug); + }, [slug]); + + if (!slug) return null; + + if (debouncedSlug === "linkedin") { return ( LinkedIn { ); } - return ; -}; + return ( + {debouncedSlug} + ); +}); + +BrandIcon.displayName = "BrandIcon"; diff --git a/apps/client/src/pages/builder/layout.tsx b/apps/client/src/pages/builder/layout.tsx index 4d0955204..a7ef5e5c7 100644 --- a/apps/client/src/pages/builder/layout.tsx +++ b/apps/client/src/pages/builder/layout.tsx @@ -1,5 +1,15 @@ import { useBreakpoint } from "@reactive-resume/hooks"; -import { Panel, PanelGroup, PanelResizeHandle, Sheet, SheetContent } from "@reactive-resume/ui"; +import { + Panel, + PanelGroup, + PanelResizeHandle, + Sheet, + SheetContent, + SheetDescription, + SheetHeader, + SheetTitle, + VisuallyHidden, +} from "@reactive-resume/ui"; import { cn } from "@reactive-resume/utils"; import { Outlet } from "react-router"; @@ -78,6 +88,13 @@ export const BuilderLayout = () => { return (
+ + + + + + + { className="top-16 p-0 sm:max-w-xl" onOpenAutoFocus={onOpenAutoFocus} > + + + + + + + diff --git a/apps/client/src/pages/builder/sidebars/left/sections/basics.tsx b/apps/client/src/pages/builder/sidebars/left/sections/basics.tsx index d041032d0..7ef7b2d1b 100644 --- a/apps/client/src/pages/builder/sidebars/left/sections/basics.tsx +++ b/apps/client/src/pages/builder/sidebars/left/sections/basics.tsx @@ -6,7 +6,7 @@ import { useResumeStore } from "@/client/stores/resume"; import { CustomFieldsSection } from "./custom/section"; import { PictureSection } from "./picture/section"; -import { getSectionIcon } from "./shared/section-icon"; +import { SectionIcon } from "./shared/section-icon"; import { URLInput } from "./shared/url-input"; export const BasicsSection = () => { @@ -17,7 +17,7 @@ export const BasicsSection = () => {
- {getSectionIcon("basics")} +

{t`Basics`}

diff --git a/apps/client/src/pages/builder/sidebars/left/sections/shared/section-base.tsx b/apps/client/src/pages/builder/sidebars/left/sections/shared/section-base.tsx index 9bbbbf0a7..6c1228882 100644 --- a/apps/client/src/pages/builder/sidebars/left/sections/shared/section-base.tsx +++ b/apps/client/src/pages/builder/sidebars/left/sections/shared/section-base.tsx @@ -25,7 +25,7 @@ import get from "lodash.get"; import { useDialog } from "@/client/stores/dialog"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "./section-icon"; +import { SectionIcon } from "./section-icon"; import { SectionListItem } from "./section-list-item"; import { SectionOptions } from "./section-options"; @@ -98,8 +98,7 @@ export const SectionBase = ({ id, title, description }: P >
- {getSectionIcon(id)} - +

{section.name}

diff --git a/apps/client/src/pages/builder/sidebars/left/sections/shared/section-icon.tsx b/apps/client/src/pages/builder/sidebars/left/sections/shared/section-icon.tsx index ef3aa483c..a192131e1 100644 --- a/apps/client/src/pages/builder/sidebars/left/sections/shared/section-icon.tsx +++ b/apps/client/src/pages/builder/sidebars/left/sections/shared/section-icon.tsx @@ -23,7 +23,7 @@ import get from "lodash.get"; import { useResumeStore } from "@/client/stores/resume"; -export const getSectionIcon = (id: SectionKey, props: IconProps = {}) => { +const getSectionIcon = (id: SectionKey, props: IconProps = {}) => { switch (id) { // Left Sidebar case "basics": { @@ -75,13 +75,14 @@ export const getSectionIcon = (id: SectionKey, props: IconProps = {}) => { } }; -type SectionIconProps = ButtonProps & { +type SectionIconProps = Omit & { id: SectionKey; name?: string; + size?: number; icon?: React.ReactNode; }; -export const SectionIcon = ({ id, name, icon, ...props }: SectionIconProps) => { +export const SectionIcon = ({ id, name, icon, size = 14, ...props }: SectionIconProps) => { const section = useResumeStore((state) => get(state.resume.data.sections, id, defaultSection), ) as SectionWithItem; @@ -89,7 +90,7 @@ export const SectionIcon = ({ id, name, icon, ...props }: SectionIconProps) => { return ( ); diff --git a/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx b/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx index 1009dc97f..0e9feeef2 100644 --- a/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx +++ b/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx @@ -5,7 +5,7 @@ import { cn } from "@reactive-resume/utils"; import { AiActions } from "@/client/components/ai-actions"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "./shared/section-icon"; +import { SectionIcon } from "./shared/section-icon"; import { SectionOptions } from "./shared/section-options"; export const SummarySection = () => { @@ -19,7 +19,7 @@ export const SummarySection = () => {
- {getSectionIcon("summary")} +

{section.name}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/css.tsx b/apps/client/src/pages/builder/sidebars/right/sections/css.tsx index 18449fac1..887a88e93 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/css.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/css.tsx @@ -7,7 +7,7 @@ import CodeEditor from "react-simple-code-editor"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; export const CssSection = () => { const { isDarkMode } = useTheme(); @@ -24,7 +24,7 @@ export const CssSection = () => {
- {getSectionIcon("css")} +

{t`Custom CSS`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/export.tsx b/apps/client/src/pages/builder/sidebars/right/sections/export.tsx index f17df21eb..4c694ff81 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/export.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/export.tsx @@ -7,7 +7,7 @@ import { saveAs } from "file-saver"; import { usePrintResume } from "@/client/services/resume/print"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; const onJsonExport = () => { const { resume } = useResumeStore.getState(); @@ -36,7 +36,7 @@ export const ExportSection = () => {
- {getSectionIcon("export")} +

{t`Export`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/information.tsx b/apps/client/src/pages/builder/sidebars/right/sections/information.tsx index c53268164..646d25768 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/information.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/information.tsx @@ -10,7 +10,7 @@ import { } from "@reactive-resume/ui"; import { cn } from "@reactive-resume/utils"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; const DonateCard = () => ( @@ -113,7 +113,7 @@ export const InformationSection = () => {
- {getSectionIcon("information")} +

{t`Information`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/layout.tsx b/apps/client/src/pages/builder/sidebars/right/sections/layout.tsx index f29f68c93..1c137f99f 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/layout.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/layout.tsx @@ -27,7 +27,7 @@ import { useState } from "react"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; type ColumnProps = { id: string; @@ -194,7 +194,7 @@ export const LayoutSection = () => {
- {getSectionIcon("layout")} +

{t`Layout`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/notes.tsx b/apps/client/src/pages/builder/sidebars/right/sections/notes.tsx index 6e72553c4..7d81f3b4b 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/notes.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/notes.tsx @@ -3,7 +3,7 @@ import { RichInput } from "@reactive-resume/ui"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; export const NotesSection = () => { const setValue = useResumeStore((state) => state.setValue); @@ -13,7 +13,7 @@ export const NotesSection = () => {
- {getSectionIcon("notes")} +

{t`Notes`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/page.tsx b/apps/client/src/pages/builder/sidebars/right/sections/page.tsx index 0a0f7d2e8..78a982ce5 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/page.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/page.tsx @@ -12,7 +12,7 @@ import { import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; export const PageSection = () => { const setValue = useResumeStore((state) => state.setValue); @@ -22,7 +22,7 @@ export const PageSection = () => {
- {getSectionIcon("page")} +

{t`Page`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/sharing.tsx b/apps/client/src/pages/builder/sidebars/right/sections/sharing.tsx index 0c38cfedc..b3c8b7ef9 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/sharing.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/sharing.tsx @@ -7,7 +7,7 @@ import { useToast } from "@/client/hooks/use-toast"; import { useUser } from "@/client/services/user"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; export const SharingSection = () => { const { user } = useUser(); @@ -35,7 +35,7 @@ export const SharingSection = () => {
- {getSectionIcon("sharing")} +

{t`Sharing`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/statistics.tsx b/apps/client/src/pages/builder/sidebars/right/sections/statistics.tsx index 9092c0781..d6e24e69e 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/statistics.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/statistics.tsx @@ -7,7 +7,7 @@ import { AnimatePresence, motion } from "framer-motion"; import { useResumeStatistics } from "@/client/services/resume"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; export const StatisticsSection = () => { const id = useResumeStore((state) => state.resume.id); @@ -19,7 +19,7 @@ export const StatisticsSection = () => {
- {getSectionIcon("statistics")} +

{t`Statistics`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/template.tsx b/apps/client/src/pages/builder/sidebars/right/sections/template.tsx index cba82c2da..981681ad6 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/template.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/template.tsx @@ -5,7 +5,7 @@ import { motion } from "framer-motion"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; export const TemplateSection = () => { const setValue = useResumeStore((state) => state.setValue); @@ -15,7 +15,7 @@ export const TemplateSection = () => {
- {getSectionIcon("template")} +

{t`Template`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/theme.tsx b/apps/client/src/pages/builder/sidebars/right/sections/theme.tsx index f912d7e66..d3c38de53 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/theme.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/theme.tsx @@ -6,7 +6,7 @@ import { HexColorPicker } from "react-colorful"; import { colors } from "@/client/constants/colors"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; export const ThemeSection = () => { const setValue = useResumeStore((state) => state.setValue); @@ -16,7 +16,7 @@ export const ThemeSection = () => {
- {getSectionIcon("theme")} +

{t`Theme`}

diff --git a/apps/client/src/pages/builder/sidebars/right/sections/typography.tsx b/apps/client/src/pages/builder/sidebars/right/sections/typography.tsx index 60d013aeb..d2ba9e095 100644 --- a/apps/client/src/pages/builder/sidebars/right/sections/typography.tsx +++ b/apps/client/src/pages/builder/sidebars/right/sections/typography.tsx @@ -9,7 +9,7 @@ import webfontloader from "webfontloader"; import { useResumeStore } from "@/client/stores/resume"; -import { getSectionIcon } from "../shared/section-icon"; +import { SectionIcon } from "../shared/section-icon"; const fontSuggestions = [ "Open Sans", @@ -62,7 +62,7 @@ export const TypographySection = () => {
- {getSectionIcon("typography")} +

{t`Typography`}

diff --git a/apps/client/src/pages/builder/sidebars/right/shared/section-icon.tsx b/apps/client/src/pages/builder/sidebars/right/shared/section-icon.tsx index 9acd6e8d8..10c478e8d 100644 --- a/apps/client/src/pages/builder/sidebars/right/shared/section-icon.tsx +++ b/apps/client/src/pages/builder/sidebars/right/shared/section-icon.tsx @@ -16,7 +16,7 @@ import { import type { ButtonProps } from "@reactive-resume/ui"; import { Button, Tooltip } from "@reactive-resume/ui"; -export type MetadataKey = +type MetadataKey = | "template" | "layout" | "typography" @@ -30,7 +30,7 @@ export type MetadataKey = | "notes" | "information"; -export const getSectionIcon = (id: MetadataKey, props: IconProps = {}) => { +const getSectionIcon = (id: MetadataKey, props: IconProps = {}) => { switch (id) { // Left Sidebar case "notes": { @@ -76,16 +76,17 @@ export const getSectionIcon = (id: MetadataKey, props: IconProps = {}) => { } }; -type SectionIconProps = ButtonProps & { +type SectionIconProps = Omit & { id: MetadataKey; name: string; + size?: number; icon?: React.ReactNode; }; -export const SectionIcon = ({ id, name, icon, ...props }: SectionIconProps) => ( +export const SectionIcon = ({ id, name, icon, size = 14, ...props }: SectionIconProps) => ( ); diff --git a/apps/client/src/pages/home/meta/privacy-policy/page.tsx b/apps/client/src/pages/home/meta/privacy-policy/page.tsx deleted file mode 100644 index 88a6e6d08..000000000 --- a/apps/client/src/pages/home/meta/privacy-policy/page.tsx +++ /dev/null @@ -1,113 +0,0 @@ -/* eslint-disable lingui/no-unlocalized-strings */ - -import { t } from "@lingui/macro"; -import { Helmet } from "react-helmet-async"; - -export const PrivacyPolicyPage = () => ( -
- - - {t`Privacy Policy`} - {t`Reactive Resume`} - - - - - -
-

{t`Privacy Policy`}

-
Last updated on 3rd May 2024
- -
- -
    -
  1. -

    Introduction

    -

    - This privacy policy outlines how we collect, use, and protect the personal information - you provide when using our web application. By accessing or using Reactive Resume, you - agree to the collection and use of information in accordance with this policy. -

    -
  2. - -
  3. -

    Information Collection and Use

    -

    - For a better experience while using our Service, we may require you to provide us with - certain personally identifiable information, including but not limited to your name and - email address. The information that we collect will be used to contact or identify you - primarily for the following purposes: -

    - -
      -
    • - Account Creation: to allow you to create and manage your account. -
    • -
    • - Functionality: to enable the various features of the application that - you choose to utilize, such as building and saving resumes. -
    • -
    -
  4. - -
  5. -

    How We Collect Information

    -

    - All personal data is provided directly by you. We collect information through our web - application when you voluntarily provide it to us as part of using our service. -

    -
  6. - -
  7. -

    Data Security

    -

    - Reactive Resume is committed to ensuring the security of your data. Our application and - database are hosted on a secure server from DigitalOcean, which has both SOC 2 and SOC 3 - compliance, ensuring that your data is protected with industry-standard security - measures. -

    -
  8. - -
  9. -

    Data Retention

    -

    - We retain your personal data as long as your account is active or as needed to provide - you services. If you do not use your account for 6 months, your personal information is - automatically deleted from our servers. You may also delete your data at any time via - the user dashboard. -

    -
  10. - -
  11. -

    Third-Party Disclosure

    -

    - We do not share your personal information with third parties, ensuring your data is used - exclusively for the purposes stated in this privacy policy. -

    -
  12. - -
  13. -

    Changes to This Privacy Policy

    -

    - We may update our Privacy Policy from time to time. We will notify you of any changes by - posting the new Privacy Policy on this page. You are advised to review this Privacy - Policy periodically for any changes. -

    -
  14. - -
  15. -

    Contact Us

    -

    - If you have any questions or suggestions about our Privacy Policy, do not hesitate to - contact us at hello[at]amruthpillai[dot]com. -

    -
  16. -
-
-
-); diff --git a/apps/client/src/pages/public/page.tsx b/apps/client/src/pages/public/page.tsx index d0027d86d..8ed6b9a9f 100644 --- a/apps/client/src/pages/public/page.tsx +++ b/apps/client/src/pages/public/page.tsx @@ -77,7 +77,7 @@ export const PublicResumePage = () => {