diff --git a/bun.lockb b/bun.lockb index 48aeb26..42f7419 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 38976ff..b2c24b2 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@vercel/analytics": "^1.3.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "dayjs": "^1.11.13", "lenis": "^1.1.6", "motion": "^11.13.1", "next": "15.0.3", diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index dd6a74d..5e8c23f 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { BioSection, HeroSection } from '@features/home' export const metadata: Metadata = { @@ -8,13 +8,13 @@ export const metadata: Metadata = { description: 'Focused on crafting digital products, website, web app, mobile app to help business.', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Nyoman Sunima', description: 'Focused on crafting digital products, website, web app, mobile app to help business.', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Nyoman Sunima', description: 'Focused on crafting digital products, website, web app, mobile app to help business.', diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 1366b78..81ecc92 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { DetailSection, SharingSection, @@ -9,19 +9,19 @@ import { AchievementSection, EndWordSection, } from '@features/about' -import { ArticleContent } from '@shared/components/common/content' +import { ArticleContent } from '@shared/components' export const metadata: Metadata = { title: 'About', description: 'The whole story about me, nyoman sunima and all of the journey', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'About', description: 'The whole story about me, nyoman sunima and all of the journey', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'About', description: 'The whole story about me, nyoman sunima and all of the journey', diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index a00deb5..e795223 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -1,18 +1,18 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { ContactList, SocialMediaList } from '@features/contact' export const metadata: Metadata = { title: 'Contact', description: 'Get in touch with me right now, start your idea', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Contact', description: 'Get in touch with me right now, start your idea', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Contact', description: 'Get in touch with me right now, start your idea', }, diff --git a/src/app/crafts/page.tsx b/src/app/crafts/page.tsx index 8282f74..08e713b 100644 --- a/src/app/crafts/page.tsx +++ b/src/app/crafts/page.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { CraftListSection } from '@features/crafts' export const metadata: Metadata = { @@ -8,13 +8,13 @@ export const metadata: Metadata = { description: 'See all of my projects, business, products, side husltes and something that i built', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Crafts', description: 'See all of my projects, business, products, side husltes and something that i built', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Crafts', description: 'See all of my projects, business, products, side husltes and something that i built', diff --git a/src/app/faqs/page.tsx b/src/app/faqs/page.tsx index 06d8206..717b33a 100644 --- a/src/app/faqs/page.tsx +++ b/src/app/faqs/page.tsx @@ -1,18 +1,18 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { FAQListSection, AskSection } from '@features/faqs' export const metadata: Metadata = { title: 'FAQs', description: 'Most asked questions by people around the world', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'FAQs', description: 'Most asked questions by people around the world', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'FAQs', description: 'Most asked questions by people around the world', }, diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx index 3a2d691..a4ed8ed 100644 --- a/src/app/global-error.tsx +++ b/src/app/global-error.tsx @@ -1,9 +1,8 @@ 'use client' import '@shared/styles/globals.css' -import { Button } from '@shared/components/ui/button' -import { CenteredLayout } from '@shared/components//common/centered-layout' -import * as fonts from '@shared/fonts' +import { Button, CenteredLayout } from '@shared/components' +import { fonts } from '@shared/fonts' export default function GlobalError({ reset, diff --git a/src/app/journeys/page.tsx b/src/app/journeys/page.tsx index 007fa6c..5d99407 100644 --- a/src/app/journeys/page.tsx +++ b/src/app/journeys/page.tsx @@ -1,17 +1,17 @@ import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { ExperienceSection, LogListSection } from '@features/journeys' export const metadata: Metadata = { title: 'Journeys', description: 'The whole story of me, nyoman sunima and all of the journey', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Journeys', description: 'The whole story of me, nyoman sunima and all of the journey', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Journeys', description: 'The whole story of me, nyoman sunima and all of the journey', }, diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 7b316a3..0ccad14 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,16 +1,15 @@ import * as React from 'react' import type { Metadata } from 'next' import '@shared/styles/globals.css' -import config from '@shared/libs/config' +import { config } from '@shared/libs' import { Analytics as VercelAnalytics } from '@vercel/analytics/react' -import { AnimationProvider } from '@shared/providers/animation-provider' -import { ThemeProvider } from '@shared/providers/theme-provider' -import Header from '@shared/components/common/header' -import Footer from '@shared/components/common/footer' -import { Toaster } from '@shared/components/ui/toast' -import { CenteredLayout } from '@shared/components/common/centered-layout' -import { PosthogProvider } from '@shared/providers/posthog-provider' -import * as fonts from '@shared/fonts' +import { + ThemeProvider, + AnimationProvider, + PosthogProvider, +} from '@shared/providers' +import { Footer, Header, Toaster, CenteredLayout } from '@shared/components' +import { fonts } from '@shared/fonts' export const metadata: Metadata = { applicationName: 'Nyoman Sunima', diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index ee71587..c10a11e 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Metadata } from 'next' import Link from 'next/link' -import { Button } from '@shared/components/ui/button' +import { Button } from '@shared/components' export const metadata: Metadata = { title: 'Not Found', diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx index 3da9362..ad9bb36 100644 --- a/src/app/privacy/page.tsx +++ b/src/app/privacy/page.tsx @@ -1,19 +1,19 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import Link from 'next/link' -import { ArticleContent } from '@shared/components/common/content' +import { ArticleContent } from '@shared/components' export const metadata: Metadata = { title: 'Privacy Policy', description: 'Read the privacy policy for this site', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Privacy Policy', description: 'Read the privacy policy for this site', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Privacy Policy', description: 'Read the privacy policy for this site', }, diff --git a/src/app/resources/page.tsx b/src/app/resources/page.tsx index e152b2d..b5dae4a 100644 --- a/src/app/resources/page.tsx +++ b/src/app/resources/page.tsx @@ -1,18 +1,18 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { SourcesSection } from '@features/resources' export const metadata: Metadata = { title: 'Resources', description: 'Get free resources and things that help your works', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Resources', description: 'Get free resources and things that help your works', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Resources', description: 'Get free resources and things that help your works', }, diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 673f920..774151c 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -1,4 +1,4 @@ -import config from '@shared/libs/config' +import { config } from '@shared/libs' import { MetadataRoute } from 'next' const BASE_URL = config.app.host diff --git a/src/app/stories/page.tsx b/src/app/stories/page.tsx index 402dbaa..7620e5d 100644 --- a/src/app/stories/page.tsx +++ b/src/app/stories/page.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { PublicationSection, RecentlySection } from '@features/stories' export const metadata: Metadata = { @@ -8,13 +8,13 @@ export const metadata: Metadata = { description: 'Everyday i write, record, and create any resources to sharing into the social media and community platforms', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Stories', description: 'Everyday i write, record, and create any resources to sharing into the social media and community platforms', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Stories', description: 'Everyday i write, record, and create any resources to sharing into the social media and community platforms', diff --git a/src/app/support/page.tsx b/src/app/support/page.tsx index 159f9c3..acdbd07 100644 --- a/src/app/support/page.tsx +++ b/src/app/support/page.tsx @@ -1,18 +1,18 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { SupportSection } from '@features/support' export const metadata: Metadata = { title: 'Support Me (Donate)', description: 'Support me by donating for projects and contents or goodies', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Support me (Donate)', description: 'Support me by donating for projects and contents or goodies', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Support me (Donate)', description: 'Support me by donating for projects and contents or goodies', }, diff --git a/src/app/template.tsx b/src/app/template.tsx index 0b390e6..97655dd 100644 --- a/src/app/template.tsx +++ b/src/app/template.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { PageTransition } from '@shared/components/animation/transition' +import { PageTransition } from '@shared/components' interface RootTemplateProps { children: React.ReactNode diff --git a/src/app/terms/page.tsx b/src/app/terms/page.tsx index 726d754..0f8ed7d 100644 --- a/src/app/terms/page.tsx +++ b/src/app/terms/page.tsx @@ -1,19 +1,19 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import Link from 'next/link' -import { ArticleContent } from '@shared/components/common/content' +import { ArticleContent } from '@shared/components' export const metadata: Metadata = { title: 'Terms of use', description: 'Read the terms of use for this site', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Terms of use', description: 'Read the terms of use for this site', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Terms of use', description: 'Read the terms of use for this site', }, diff --git a/src/app/works/[slug]/page.tsx b/src/app/works/[slug]/page.tsx index 60ad4b9..c5c726f 100644 --- a/src/app/works/[slug]/page.tsx +++ b/src/app/works/[slug]/page.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Metadata, ResolvingMetadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { WorkDetailContent, workService } from '@features/works' interface Params { @@ -24,13 +24,13 @@ export async function generateMetadata( title: meta.title, description: meta.description, openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: meta.title, description: meta.description, images: [meta.image, ...previousOgImages], }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: meta.title, description: meta.description, images: [meta.image, ...previousTwitterImages], diff --git a/src/app/works/page.tsx b/src/app/works/page.tsx index 0ce69c9..650d9f6 100644 --- a/src/app/works/page.tsx +++ b/src/app/works/page.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Metadata } from 'next' -import * as defaultMetadata from '@shared/libs/shared-metadata' +import { sharedMetadata } from '@shared/libs' import { WorksListSection, ComingSoonSection } from '@features/works' export const metadata: Metadata = { @@ -8,13 +8,13 @@ export const metadata: Metadata = { description: 'See all of my works including projects, apps, products, case studies, idea and playground', openGraph: { - ...defaultMetadata.openGraph, + ...sharedMetadata.openGraph, title: 'Works', description: 'See all of my works including projects, apps, products, case studies, idea and playground', }, twitter: { - ...defaultMetadata.twitter, + ...sharedMetadata.twitter, title: 'Works', description: 'See all of my works including projects, apps, products, case studies, idea and playground', diff --git a/src/features/about/activity-section.tsx b/src/features/about/activity-section.tsx index 0c519e9..ed2e80a 100644 --- a/src/features/about/activity-section.tsx +++ b/src/features/about/activity-section.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { ContentImage } from '@shared/components/common/content' +import { ContentImage } from '@shared/components' export function ActivitySection(): React.ReactElement { return ( diff --git a/src/features/about/detail-section.tsx b/src/features/about/detail-section.tsx index f6650cf..4bc2cb6 100644 --- a/src/features/about/detail-section.tsx +++ b/src/features/about/detail-section.tsx @@ -1,9 +1,6 @@ import Link from 'next/link' import * as React from 'react' -import { - ContentImage, - GalleryListImage, -} from '@shared/components/common/content' +import { ContentImage, GalleryListImage } from '@shared/components' const images = [ 'https://images.unsplash.com/photo-1537996194471-e657df975ab4?q=80&w=2838&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', diff --git a/src/features/about/sharing-section.tsx b/src/features/about/sharing-section.tsx index ec48c5e..343a35f 100644 --- a/src/features/about/sharing-section.tsx +++ b/src/features/about/sharing-section.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { ContentImage } from '@shared/components/common/content' +import { ContentImage } from '@shared/components' export function SharingSection(): React.ReactElement { return ( diff --git a/src/features/contact/contact-data.json b/src/features/contact/contact-data.json index 6324c88..ecff3d1 100644 --- a/src/features/contact/contact-data.json +++ b/src/features/contact/contact-data.json @@ -8,6 +8,10 @@ { "label": "Chat on WhatsApp", "href": "https://api.whatsapp.com/send?phone=6285161619109&ref=nyomansunima" + }, + { + "label": "Read my CV", + "href": "https://read.cv/nyomansunima?ref=nyomansunima" } ], "socials": [ diff --git a/src/features/contact/contact-item.tsx b/src/features/contact/contact-item.tsx index e06f22d..77ceada 100644 --- a/src/features/contact/contact-item.tsx +++ b/src/features/contact/contact-item.tsx @@ -2,8 +2,7 @@ import * as React from 'react' import Link from 'next/link' -import { Button } from '@shared/components/ui/button' -import { toast } from '@shared/components/ui/toast' +import { Button, toast } from '@shared/components' export interface ContactItemData { href: string diff --git a/src/features/contact/social-item.tsx b/src/features/contact/social-item.tsx index 85709a1..89b1e8e 100644 --- a/src/features/contact/social-item.tsx +++ b/src/features/contact/social-item.tsx @@ -1,13 +1,13 @@ import * as React from 'react' -import { Button } from '@shared/components/ui/button' import Link from 'next/link' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, -} from '@shared/components/ui/tooltip' -import { mergeClass } from '@shared/utils/helper' + Button, +} from '@shared/components' +import { mergeClass } from '@shared/utils' export interface SocialData { label: string diff --git a/src/features/faqs/ask-section.tsx b/src/features/faqs/ask-section.tsx index c84bc4b..30c2e4a 100644 --- a/src/features/faqs/ask-section.tsx +++ b/src/features/faqs/ask-section.tsx @@ -1,6 +1,6 @@ import Link from 'next/link' import * as React from 'react' -import { Button } from '@shared/components/ui/button' +import { Button } from '@shared/components' export function AskSection(): React.ReactElement { return ( diff --git a/src/features/faqs/faq-item.tsx b/src/features/faqs/faq-item.tsx index 70c50fe..99e012e 100644 --- a/src/features/faqs/faq-item.tsx +++ b/src/features/faqs/faq-item.tsx @@ -3,7 +3,7 @@ import { AccordionContent, AccordionItem, AccordionTrigger, -} from '@shared/components/ui/accordion' +} from '@shared/components' export interface FAQData { question: string diff --git a/src/features/faqs/faq-list-section.tsx b/src/features/faqs/faq-list-section.tsx index 614c23a..74040d1 100644 --- a/src/features/faqs/faq-list-section.tsx +++ b/src/features/faqs/faq-list-section.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { Accordion } from '@shared/components/ui/accordion' +import { Accordion } from '@shared/components' import { FAQData, FAQItem } from './faq-item' import faqsData from './faqs-data.json' diff --git a/src/features/home/bio-data.json b/src/features/home/bio-data.json index 0f60ae1..4443bf4 100644 --- a/src/features/home/bio-data.json +++ b/src/features/home/bio-data.json @@ -3,7 +3,8 @@ { "type": "link", "url": "/contact", - "label": "Hire me" + "label": "Hire me", + "isFeatured": true }, { "type": "link", @@ -15,6 +16,7 @@ "type": "link", "url": "/works", "label": " See my works", + "isFeatured": true, "className": "tablet:row-span-2" }, { @@ -30,7 +32,7 @@ }, { "type": "link", - "url": "https://ko-fi.com/nyomansunima?ref=nyomansunima", + "url": "/support", "label": "Suport me by donation" }, { @@ -55,6 +57,13 @@ "url": "/crafts", "label": "See all of my crafts", "className": "tablet:col-span-2" + }, + { + "type": "link", + "url": "/journeys", + "label": "See what's new this week", + "isFeatured": true, + "className": "tablet:col-span-3" } ] } diff --git a/src/features/home/bio-item.tsx b/src/features/home/bio-item.tsx index bb3e4b4..b514d7d 100644 --- a/src/features/home/bio-item.tsx +++ b/src/features/home/bio-item.tsx @@ -1,18 +1,20 @@ import * as React from 'react' import Link from 'next/link' -import { mergeClass } from '@shared/utils/helper' +import { mergeClass } from '@shared/utils' export interface BioItemData { type: string url: string label: string className?: string + isFeatured?: boolean } interface LinkItemProps { className?: string children?: React.ReactNode href: string + showBadge?: boolean } interface BioItemProps { @@ -23,6 +25,7 @@ function LinkItem({ href, children, className, + showBadge, }: LinkItemProps): React.ReactElement { const isUrl = href.includes('http://') || href.includes('https://') @@ -37,6 +40,10 @@ function LinkItem({ > {children} + {showBadge && ( + + )} +
@@ -45,11 +52,11 @@ function LinkItem({ } export function BioItem({ data }: BioItemProps): React.ReactElement { - const { type, label, url, className } = data + const { type, label, url, className, isFeatured } = data const components = Object.freeze({ link: ( - + {label} ), diff --git a/src/features/home/hero-section.tsx b/src/features/home/hero-section.tsx index ac6800e..45461bf 100644 --- a/src/features/home/hero-section.tsx +++ b/src/features/home/hero-section.tsx @@ -7,14 +7,14 @@ import { TooltipContent, TooltipProvider, TooltipTrigger, -} from '@shared/components/ui/tooltip' +} from '@shared/components' import { motion } from 'motion/react' function OpenWorkBadge(): React.ReactElement { return ( - + - New craft: Brook code theme - - + > + New craft: Brook code theme + + + + Something new in this week + + ) } @@ -83,20 +90,8 @@ export function HeroSection(): React.ReactElement { margin: '-300px 0px', }} > - Focus on shipping saas, goodies, digital products, sites & contents to - help people solve their problems. - - - Talks about self improvement, productivity, life hacks, design, - development, product shipping, and business. + Focus to shipping great, effective & impactful products, services, + saas, goodies, sites & contents. - Now, focus to building career, brands, projects & business. + Talks about indie hacking, product shipping, and business. diff --git a/src/features/journeys/journeys-data.json b/src/features/journeys/journeys-data.json index 77a3ac9..f226835 100644 --- a/src/features/journeys/journeys-data.json +++ b/src/features/journeys/journeys-data.json @@ -111,6 +111,13 @@ "date": "Dec, 5 2024", "category": "Work", "url": "https://www.gunatransport.com" + }, + { + "title": "Redesign Weebo Website", + "description": "Redesign the weebo website with new clean and simple look website concept. Allow the audiences and clients focus on the main goal of the website.", + "date": "Dec, 8 2024", + "category": "Work", + "url": "https://tryweebo.one" } ] } diff --git a/src/features/journeys/log-group.tsx b/src/features/journeys/log-group.tsx index 1a63c0f..bc8ddde 100644 --- a/src/features/journeys/log-group.tsx +++ b/src/features/journeys/log-group.tsx @@ -7,7 +7,7 @@ import { TooltipContent, TooltipProvider, TooltipTrigger, -} from '@shared/components/ui/tooltip' +} from '@shared/components' import { motion } from 'motion/react' export interface LogGroupData { diff --git a/src/features/resources/resources-data.json b/src/features/resources/resources-data.json index 3f6dcc8..298dd9a 100644 --- a/src/features/resources/resources-data.json +++ b/src/features/resources/resources-data.json @@ -3,6 +3,11 @@ { "title": "Favorite tools", "list": [ + { + "title": "Zed", + "description": "My favorite code editor for building apps, websites, and more.", + "url": "https://zed.dev/?ref=nyomansunima" + }, { "title": "Visual Studio Code", "description": "Visual Studio Code is a source-code editor developed by Microsoft for Windows, Linux and macOS.", @@ -82,6 +87,66 @@ "title": "Vite", "description": "Vite is a build tool for modern web projects.", "url": "https://vite.dev?ref=nyomansunima" + }, + { + "title": "Vercel", + "description": "Favorite platform to deploy my website and also the other business sites.", + "url": "https://vercel.com?ref=nyomansunima" + }, + { + "title": "Waitlist", + "description": "I love this stacks, useful when building waiting list for product that embed in a beta sites.", + "url": "https://getwaitlist.com?ref=nyomansunima" + } + ] + }, + { + "title": "Inspirations", + "list": [ + { + "title": "Dribbble", + "description": "Best for designers, i love use this for inspirations and concept design.", + "url": "https://dribbble.com?ref=nyomansunima" + }, + { + "title": "Godly Website", + "description": "My favorite website for inspiration when working with website design.", + "url": "https://godly.website?ref=nyomansunima" + }, + { + "title": "Awwwards", + "description": "When i design a website, i always check the awards on this website.", + "url": "https://www.awwwards.com?ref=nyomansunima" + }, + { + "title": "Mobbin", + "description": "Best for designers, i love use this for inspirations and concept design.", + "url": "https://mobbin.design?ref=nyomansunima" + } + ] + }, + { + "title": "Utilities", + "list": [ + { + "title": "Shadcn UI", + "description": "Best for developers when start create ui for the web app", + "url": "https://ui.shadcn.com?ref=nyomansunima" + }, + { + "title": "Magic UI", + "description": "Best animation website that used to create animation for the web app", + "url": "https://magicui.design?ref=nyomansunima" + }, + { + "title": "Motion", + "description": "My favorite animation library for the web app", + "url": "https://motion.dev?ref=nyomansunima" + }, + { + "title": "Flaticon Interface Icon", + "description": "My favorite free icons for start website and design projects.", + "url": "https://www.flaticon.com/uicons/interface-icons?ref=nyomansunima" } ] } diff --git a/src/features/resources/source-item.tsx b/src/features/resources/source-item.tsx index 0706dd3..f169dc4 100644 --- a/src/features/resources/source-item.tsx +++ b/src/features/resources/source-item.tsx @@ -21,7 +21,9 @@ export function SourceItem({ source }: SourceItemProps): React.ReactElement { className="flex flex-col bg-surface border border-border p-3 rounded-2xl col-span-1 transition-all duration-300 hover:-translate-y-1 group relative" >

{title}

-

{description}

+

+ {description} +

diff --git a/src/features/support/support-data.json b/src/features/support/support-data.json index 20ea586..aeeb905 100644 --- a/src/features/support/support-data.json +++ b/src/features/support/support-data.json @@ -1,7 +1,7 @@ { "supports": [ { - "icon": "fi fi-rr-square-code", + "icon": "fi fi-rr-mug-hot-alt", "title": "Donate coding projects", "description": "Help me to create better open source projects.", "url": "https://github.com/sponsors/nyomansunima?ref=nyomansunima", diff --git a/src/features/support/support-item.tsx b/src/features/support/support-item.tsx index b5677ea..c9757e0 100644 --- a/src/features/support/support-item.tsx +++ b/src/features/support/support-item.tsx @@ -23,7 +23,9 @@ export function SupportItem({ data }: SupportItemProps): React.ReactElement { className="flex flex-col gap-3 bg-surface p-3 border border-border rounded-2xl transition-all duration-300 hover:-translate-y-1 cursor-pointer relative group" >
- +

{title}

diff --git a/src/features/support/support-section.tsx b/src/features/support/support-section.tsx index ee87d8d..7743e48 100644 --- a/src/features/support/support-section.tsx +++ b/src/features/support/support-section.tsx @@ -8,13 +8,7 @@ export function SupportSection(): React.ReactElement { return (
-

- Support me to produce more -
- good things. -

- -
+
{supports.map((support, index) => ( diff --git a/src/features/works/contents/brook-code-theme.md b/src/features/works/contents/brook-code-theme.md index 8fbef9d..b934543 100644 --- a/src/features/works/contents/brook-code-theme.md +++ b/src/features/works/contents/brook-code-theme.md @@ -1,23 +1,36 @@ --- title: "Redesigning Acme Corp's E-Commerce Platform" description: 'Acme Corp faced challenges with their outdated e-commerce platform. Key issues included a high bounce rate, low conversion rates, and an unappealing user interface. They needed a complete redesign to improve usability and enhance their customer experience.' -image: 'https://res.cloudinary.com/brooklyn-pc/image/upload/v1671055182/Brooklyn-PC/brook-code-theme/Acme-Corp-e-commerce-platform-1.png' +image: 'https://cdn.hashnode.com/res/hashnode/image/upload/v1732079951931/3ac2d9b4-d790-4b31-8855-4f6a909811b2.png' + date: '2024-12-06' -tags: ['Web Design', 'E-Commerce', 'UI/UX'] -client: 'Acme Corp' -clientUrl: 'https://acmecorp.com' -industry: ['Retail'] -services: ['UI/UX Design', 'Frontend Development'] -results: ['25% Increase in Conversion Rates'] +status: 'Completed' + +client: + name: 'Acme Corp' + url: 'https://acmecorp.com' + +roles: ['Product Designer', 'Developer'] +responsibilities: ['System Design', 'Frontend Development'] + +teams: + - name: 'Jack Stark, Frontend Developer' + url: 'https://www.linkedin.com/in/jack-stark-b0b1b2b3/' --- -# Redesigning Acme Corp's E-Commerce Platform +## Challenges + +Acme Corp faced challenges with their outdated e-commerce platform. Key issues included a high bounce rate, low conversion rates, and an unappealing user interface. They needed a complete redesign to improve usability and enhance their customer experience. **Client:** Acme Corp **Industry:** Retail **Services Provided:** UI/UX Design, Frontend Development **Outcome:** 25% Increase in Conversion Rates +[Launch](https://acmecorp.com) + +
+ ![Banner](https://cdn.hashnode.com/res/hashnode/image/upload/v1732079951931/3ac2d9b4-d790-4b31-8855-4f6a909811b2.png) ## Problem Statement diff --git a/src/features/works/work-detail-content.tsx b/src/features/works/work-detail-content.tsx index 315e92c..eacca8c 100644 --- a/src/features/works/work-detail-content.tsx +++ b/src/features/works/work-detail-content.tsx @@ -1,15 +1,111 @@ -import { ArticleContent } from '@shared/components/common/content' +import { ArticleContent } from '@shared/components' import * as React from 'react' -import { getWorkDetail } from './work-service' +import { getWorkDetail, WorkFrontMatter } from './work-service' +import Link from 'next/link' +import { parseReadableDate } from '@shared/utils' type WorkDetailContentProps = { slug: string } +type OverviewProps = { + meta: WorkFrontMatter +} + +function Overview({ meta }: OverviewProps): React.ReactElement { + const { roles, responsibilities, teams } = meta + + return ( +
+
+
+
+

ROLES

+
    + {roles.map((role, index) => ( +
  • + + {role} +
  • + ))} +
+
+ +
+

+ RESPONSIBILITIES +

+
    + {responsibilities.map((responsibility, index) => ( +
  • + + {responsibility} +
  • + ))} +
+
+ +
+

TEAMS

+
    + {teams.map((team, index) => ( +
  • + + + {team.name} + +
  • + ))} +
+
+
+
+
+ ) +} + export async function WorkDetailContent({ slug, }: WorkDetailContentProps): Promise { - const { content } = await getWorkDetail(slug) + const { content, meta } = await getWorkDetail(slug) + const date = parseReadableDate(meta.date) + + return ( +
+

+ {meta.title} +

+ +
+ + {meta.client.name} + + + + {date} + +
+ + - return {content} + {content} +
+ ) } diff --git a/src/features/works/work-service.ts b/src/features/works/work-service.ts index df5cc8b..7645c06 100644 --- a/src/features/works/work-service.ts +++ b/src/features/works/work-service.ts @@ -4,21 +4,27 @@ import fs from 'fs/promises' import path from 'path' import { evaluate } from 'next-mdx-remote-client/rsc' import * as React from 'react' -import { ContentImage } from '@shared/components/common/content' +import { ContentImage } from '@shared/components' +import Link from 'next/link' const WORK_CONTENT_PATH = '/src/features/works/contents' -type WorkFrontMatter = { +export type WorkFrontMatter = { title: string description: string image: string date: string - tags: string[] - client: string - clientUrl: string - industry: string[] - services: string[] - results: string[] + status: string + client: { + name: string + url: string + } + roles: string[] + responsibilities: string[] + teams: { + name: string + url: string + }[] } type WorkMetadata = Pick @@ -55,6 +61,7 @@ export async function getWorkDetail(slug: string): Promise { }, components: { img: ContentImage, + a: Link, }, }) diff --git a/src/shared/components/common/content.tsx b/src/shared/components/common/content.tsx index f36f2d7..cd00613 100644 --- a/src/shared/components/common/content.tsx +++ b/src/shared/components/common/content.tsx @@ -1,6 +1,6 @@ import Image from 'next/image' import * as React from 'react' -import { mergeClass } from '@shared/utils/helper' +import { mergeClass } from '@shared/utils' interface ArticleContentProps { children: React.ReactNode diff --git a/src/shared/components/common/footer.tsx b/src/shared/components/common/footer.tsx index 794210f..b27ea1d 100644 --- a/src/shared/components/common/footer.tsx +++ b/src/shared/components/common/footer.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import Link from 'next/link' -import { mergeClass } from '@shared/utils/helper' +import { mergeClass } from '@shared/utils' const footerMenus = [ { label: 'Privacy policy', href: '/privacy' }, @@ -47,7 +47,7 @@ export function FooterMenuList(): React.ReactElement { ) } -export default function Footer(): React.ReactElement { +export function Footer(): React.ReactElement { return (