From 58ef4e6ac57e93e7229cd9811952cb395a6e341e Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Fri, 4 Jul 2025 15:23:04 +0100 Subject: [PATCH 01/12] feat: sidebar & compound components --- src/app/components/sidebar.tsx | 75 ++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/app/components/sidebar.tsx diff --git a/src/app/components/sidebar.tsx b/src/app/components/sidebar.tsx new file mode 100644 index 0000000..693bfde --- /dev/null +++ b/src/app/components/sidebar.tsx @@ -0,0 +1,75 @@ +'use client' + +import { useState, createContext, useContext } from 'react'; + +interface ParentProps { + children: React.ReactNode +} + +interface SideBarContextType { + selected: string | null; + setSelected: React.Dispatch>; +} + +interface ItemProps extends ParentProps { + id: string +} + +// Compound Components + +const SideBarContext = createContext(null); + + +export function SibebarHeader({children}: ParentProps) { + return ( +
+ {children} +
+ ) +} + +export function SidebarItemList({children}: ParentProps) { + return ( +
+ {children} +
+ ) +} + +export function SidebarItem({children, id}: ItemProps) { + const context = useContext(SideBarContext); + + if (!context) { + throw new Error('Item must be used within a Sidebar'); + } + + const {selected, setSelected} = context; + + const isSelected = selected === id + + return ( +
setSelected(id)} + className={`inline-flex gap-2 items-center group py-2.5 px-3 text-[#00000080] rounded-xl transition-all duration-300 ease-in-out cursor-pointer ${isSelected ? "ring-1 ring-[#ee784971] bg-[#EE77491A] text-[#EE7749]" : "hover:bg-gray-100"}`}> + {children} +
+ ) +} + + +// Main Sidebar component +export default function Sidebar({children}: ParentProps) { + const [selected, setSelected] = useState(null); + + return ( +
+ + {children} + +
+ ) +} + +// Assign compound components +Sidebar.ItemList = SidebarItemList; +Sidebar.Item = SidebarItem; \ No newline at end of file From e38c14a4745638c973ba5d38dbde85422c4fa228 Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 5 Jul 2025 14:44:08 +0100 Subject: [PATCH 02/12] fix: final touches --- bun.lockb | Bin 0 -> 165398 bytes src/app/components/sidebar.tsx | 31 ++++++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) create mode 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..47c23387647c97b99f601e4b9066d0134780776c GIT binary patch literal 165398 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 Mcrlpnzv(null); -export function SibebarHeader({children}: ParentProps) { +export function SibebarHeader({children, className}: ParentProps) { return ( -

+
{children}
) } -export function SidebarItemList({children}: ParentProps) { +export function SidebarItemList({children, className}: ParentProps) { return ( -
+
{children}
) } -export function SidebarItem({children, id}: ItemProps) { +export function SidebarItem({children, className, id, href}: ItemProps) { const context = useContext(SideBarContext); if (!context) { @@ -48,18 +55,19 @@ export function SidebarItem({children, id}: ItemProps) { const isSelected = selected === id return ( -
setSelected(id)} - className={`inline-flex gap-2 items-center group py-2.5 px-3 text-[#00000080] rounded-xl transition-all duration-300 ease-in-out cursor-pointer ${isSelected ? "ring-1 ring-[#ee784971] bg-[#EE77491A] text-[#EE7749]" : "hover:bg-gray-100"}`}> + className={`inline-flex gap-2 items-center group py-2.5 px-3 text-[#00000080] rounded-lg transition-all duration-300 ease-in-out cursor-pointer ${isSelected ? "ring-1 ring-[#ee784971] bg-[#EE77491A] text-[#EE7749]" : "hover:bg-gray-100"} ${className}`}> {children} -
+ ) } // Main Sidebar component -export default function Sidebar({children}: ParentProps) { - const [selected, setSelected] = useState(null); +export default function Sidebar({children, defaultSelected}: SideBarProps) { + const [selected, setSelected] = useState(defaultSelected || null); return (
@@ -70,6 +78,3 @@ export default function Sidebar({children}: ParentProps) { ) } -// Assign compound components -Sidebar.ItemList = SidebarItemList; -Sidebar.Item = SidebarItem; \ No newline at end of file From 685ffdb243ffaa01d2d9ff804423ebc0ca6ee693 Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 5 Jul 2025 14:46:15 +0100 Subject: [PATCH 03/12] fix: folder organization --- src/{app => }/components/sidebar.tsx | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{app => }/components/sidebar.tsx (100%) diff --git a/src/app/components/sidebar.tsx b/src/components/sidebar.tsx similarity index 100% rename from src/app/components/sidebar.tsx rename to src/components/sidebar.tsx From e7fc38d7c0436988d662837ac7a706adf368ed2d Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 5 Jul 2025 14:52:28 +0100 Subject: [PATCH 04/12] fix: ran format --- .github/workflows/style.yml | 2 +- src/components/sidebar.tsx | 74 ++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 39 deletions(-) diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 17c3e2b..116e470 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -28,4 +28,4 @@ jobs: run: bun format - name: Lint the code - run: bun lint \ No newline at end of file + run: bun lint diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index 9a27ea7..73c6600 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -1,11 +1,11 @@ -'use client' +"use client"; -import Link from 'next/link'; -import { useState, createContext, useContext } from 'react'; +import Link from "next/link"; +import { useState, createContext, useContext } from "react"; interface ParentProps { - children: React.ReactNode - className?: string + children: React.ReactNode; + className?: string; } interface SideBarProps extends ParentProps { @@ -18,63 +18,61 @@ interface SideBarContextType { } interface ItemProps extends ParentProps { - id: string - href: string -} + id: string; + href: string; +} // Compound Components const SideBarContext = createContext(null); - -export function SibebarHeader({children, className}: ParentProps) { +export function SibebarHeader({ children, className }: ParentProps) { return ( -
+
{children}
- ) + ); } -export function SidebarItemList({children, className}: ParentProps) { - return ( -
- {children} -
- ) +export function SidebarItemList({ children, className }: ParentProps) { + return
{children}
; } -export function SidebarItem({children, className, id, href}: ItemProps) { - const context = useContext(SideBarContext); - - if (!context) { - throw new Error('Item must be used within a Sidebar'); - } - - const {selected, setSelected} = context; +export function SidebarItem({ children, className, id, href }: ItemProps) { + const context = useContext(SideBarContext); - const isSelected = selected === id + if (!context) { + throw new Error("Item must be used within a Sidebar"); + } + + const { selected, setSelected } = context; + + const isSelected = selected === id; return ( setSelected(id)} - className={`inline-flex gap-2 items-center group py-2.5 px-3 text-[#00000080] rounded-lg transition-all duration-300 ease-in-out cursor-pointer ${isSelected ? "ring-1 ring-[#ee784971] bg-[#EE77491A] text-[#EE7749]" : "hover:bg-gray-100"} ${className}`}> + className={`group inline-flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-[#00000080] transition-all duration-300 ease-in-out ${isSelected ? "bg-[#EE77491A] text-[#EE7749] ring-1 ring-[#ee784971]" : "hover:bg-gray-100"} ${className}`} + > {children} - ) + ); } - // Main Sidebar component -export default function Sidebar({children, defaultSelected}: SideBarProps) { - const [selected, setSelected] = useState(defaultSelected || null); +export default function Sidebar({ children, defaultSelected }: SideBarProps) { + const [selected, setSelected] = useState( + defaultSelected || null, + ); return ( -
- - {children} +
+ + {children}
- ) + ); } - From 974de3a6eafbbb4493ee356a4d27c22d0e60c755 Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Fri, 11 Jul 2025 19:42:13 +0100 Subject: [PATCH 05/12] fix: accessibility improvements --- src/components/sidebar.tsx | 43 +++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index 73c6600..82db63b 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -3,30 +3,31 @@ import Link from "next/link"; import { useState, createContext, useContext } from "react"; -interface ParentProps { +interface IParentProps { children: React.ReactNode; className?: string; } -interface SideBarProps extends ParentProps { +interface ISideBarProps extends IParentProps { defaultSelected?: string; } -interface SideBarContextType { +interface ISideBarContextType { selected: string | null; setSelected: React.Dispatch>; } -interface ItemProps extends ParentProps { +interface IItemProps extends IParentProps { id: string; - href: string; + href?: string; + onClick?: () => void } // Compound Components -const SideBarContext = createContext(null); +const SideBarContext = createContext(null); -export function SibebarHeader({ children, className }: ParentProps) { +export function SidebarHeader({ children, className }: IParentProps) { return (
{children}
; } -export function SidebarItem({ children, className, id, href }: ItemProps) { +export function SidebarItem({ children, className, id, href, onClick }: IItemProps) { const context = useContext(SideBarContext); if (!context) { @@ -48,22 +49,36 @@ export function SidebarItem({ children, className, id, href }: ItemProps) { } const { selected, setSelected } = context; - const isSelected = selected === id; - return ( + const commonClass = `group inline-flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-[#00000080] transition-all duration-300 ease-in-out ${isSelected ? "bg-[#EE77491A] text-[#EE7749] ring-1 ring-[#ee784971]" : "hover:bg-gray-100"} ${className}` + + return href ? ( setSelected(id)} - className={`group inline-flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-[#00000080] transition-all duration-300 ease-in-out ${isSelected ? "bg-[#EE77491A] text-[#EE7749] ring-1 ring-[#ee784971]" : "hover:bg-gray-100"} ${className}`} + className={commonClass} + aria-current={isSelected ? "page" : undefined} > {children} - ); + ) : ( + + ) } + // Main Sidebar component -export default function Sidebar({ children, defaultSelected }: SideBarProps) { +export default function Sidebar({ children, defaultSelected }: ISideBarProps) { const [selected, setSelected] = useState( defaultSelected || null, ); From 4e4a7d24c4a61781039c1efe1b37f57a20eaef82 Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 12 Jul 2025 17:17:19 +0100 Subject: [PATCH 06/12] fix: improve component --- src/app/components/sidebar.tsx | 0 src/components/sidebar.tsx | 11 ++++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/app/components/sidebar.tsx diff --git a/src/app/components/sidebar.tsx b/src/app/components/sidebar.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index 82db63b..6a0623d 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -51,7 +51,7 @@ export function SidebarItem({ children, className, id, href, onClick }: IItemPro const { selected, setSelected } = context; const isSelected = selected === id; - const commonClass = `group inline-flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-[#00000080] transition-all duration-300 ease-in-out ${isSelected ? "bg-[#EE77491A] text-[#EE7749] ring-1 ring-[#ee784971]" : "hover:bg-gray-100"} ${className}` + const commonClass = `flex group cursor-pointer items-center font-medium rounded-lg px-3 py-2.5 text-dark/50 transition-all duration-300 ease-in-out ${isSelected ? "bg-primary/10 text-primary ring-1 ring-primary/25" : "hover:bg-gray-100"} ${className}` return href ? ( + {icon} +

{label}

+
+ ) +} + // Main Sidebar component export default function Sidebar({ children, defaultSelected }: ISideBarProps) { From f60ff63bf87caa64d6e8561561fbab5cd884b425 Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 12 Jul 2025 17:22:12 +0100 Subject: [PATCH 07/12] refactor: file duplicates --- src/app/components/sidebar.tsx | 0 src/components/sidebar.tsx | 27 +++++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) delete mode 100644 src/app/components/sidebar.tsx diff --git a/src/app/components/sidebar.tsx b/src/app/components/sidebar.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index 6a0623d..6b36187 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -20,7 +20,7 @@ interface ISideBarContextType { interface IItemProps extends IParentProps { id: string; href?: string; - onClick?: () => void + onClick?: () => void; } // Compound Components @@ -41,7 +41,13 @@ export function SidebarItemList({ children, className }: IParentProps) { return
{children}
; } -export function SidebarItem({ children, className, id, href, onClick }: IItemProps) { +export function SidebarItem({ + children, + className, + id, + href, + onClick, +}: IItemProps) { const context = useContext(SideBarContext); if (!context) { @@ -51,7 +57,7 @@ export function SidebarItem({ children, className, id, href, onClick }: IItemPro const { selected, setSelected } = context; const isSelected = selected === id; - const commonClass = `flex group cursor-pointer items-center font-medium rounded-lg px-3 py-2.5 text-dark/50 transition-all duration-300 ease-in-out ${isSelected ? "bg-primary/10 text-primary ring-1 ring-primary/25" : "hover:bg-gray-100"} ${className}` + const commonClass = `flex group cursor-pointer items-center font-medium rounded-lg px-3 py-2.5 text-dark/50 transition-all duration-300 ease-in-out ${isSelected ? "bg-primary/10 text-primary ring-1 ring-primary/25" : "hover:bg-gray-100"} ${className}`; return href ? ( ) : ( - - ) + ); } -export function SidebarItemLabel({icon, label}: {icon: string, label: string}) { +export function SidebarItemLabel({ + icon, + label, +}: { + icon: string; + label: string; +}) { return (
{icon}

{label}

- ) + ); } - // Main Sidebar component export default function Sidebar({ children, defaultSelected }: ISideBarProps) { const [selected, setSelected] = useState( From 504922aefd248acd0b3c121c8c5342e367d783ca Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 12 Jul 2025 19:57:25 +0100 Subject: [PATCH 08/12] style: improvements --- src/components/sidebar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index 6b36187..e7bc751 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -91,8 +91,8 @@ export function SidebarItemLabel({ }) { return (
- {icon} -

{label}

+ {icon} +

{label}

); } From 64cb9a93054bbcba89c6200043a2c7a33368138d Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 12 Jul 2025 23:19:15 +0100 Subject: [PATCH 09/12] feat: sidebar storie book --- src/components/sidebar.tsx | 8 ++- src/stories/Sidebar.stories.tsx | 88 +++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 src/stories/Sidebar.stories.tsx diff --git a/src/components/sidebar.tsx b/src/components/sidebar.tsx index e7bc751..f266bdb 100644 --- a/src/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -91,8 +91,12 @@ export function SidebarItemLabel({ }) { return (
- {icon} -

{label}

+ + {icon} + +

+ {label} +

); } diff --git a/src/stories/Sidebar.stories.tsx b/src/stories/Sidebar.stories.tsx new file mode 100644 index 0000000..c0b1dc5 --- /dev/null +++ b/src/stories/Sidebar.stories.tsx @@ -0,0 +1,88 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import Sidebar, { + SidebarHeader, + SidebarItem, + SidebarItemLabel, + SidebarItemList, +} from "@/components/sidebar"; + +const meta: Meta = { + title: "Components/Sidebar", + component: Sidebar, + parameters: { layout: "fullscreen" }, + tags: ["autodocs"], + argTypes: { + defaultSelected: { + control: "text", + description: "Default selected item ID", + }, + children: { + control: false, + description: "Sidebar content (Header, ItemList, Item)", + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: (args) => ( +
+ + Conta + + + + + + + + + + + + + + + + +
+ ), +}; + +export const WithoutLabels: Story = { + render: (args) => ( +
+ + Conta + + + +

+ A tua conta +

+
+ +

+ Universidade do Minho +

+
+ +

+ Privacidade e segurança +

+
+ +

+ Ligações +

+
+
+
+
+ ), +}; From a19f425696887e2fa33c6d4af5c38ae136cc1e7d Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 12 Jul 2025 23:21:19 +0100 Subject: [PATCH 10/12] fix: storie book import --- src/stories/Sidebar.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stories/Sidebar.stories.tsx b/src/stories/Sidebar.stories.tsx index c0b1dc5..5c7bcc1 100644 --- a/src/stories/Sidebar.stories.tsx +++ b/src/stories/Sidebar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/nextjs-vite"; import Sidebar, { SidebarHeader, SidebarItem, From 16ddcfc20901348fbb6588d2f0decdcb687848fd Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Sat, 12 Jul 2025 23:25:19 +0100 Subject: [PATCH 11/12] fix: ESlint errors --- src/stories/Sidebar.stories.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stories/Sidebar.stories.tsx b/src/stories/Sidebar.stories.tsx index 5c7bcc1..56702f3 100644 --- a/src/stories/Sidebar.stories.tsx +++ b/src/stories/Sidebar.stories.tsx @@ -27,7 +27,7 @@ export default meta; type Story = StoryObj; export const Default: Story = { - render: (args) => ( + render: () => (
Conta @@ -55,7 +55,7 @@ export const Default: Story = { }; export const WithoutLabels: Story = { - render: (args) => ( + render: () => (
Conta From 8b0d06e4a2550fb6e22559401e7f461793b73ecd Mon Sep 17 00:00:00 2001 From: 11GG20 Date: Fri, 18 Jul 2025 19:11:56 +0100 Subject: [PATCH 12/12] refactor: finishing component's storybook --- src/stories/{ => sidebar}/Sidebar.stories.tsx | 23 ++++++-- src/stories/sidebar/SidebarHeader.stories.tsx | 41 ++++++++++++++ src/stories/sidebar/SidebarItem.stories.tsx | 56 +++++++++++++++++++ .../sidebar/SidebarItemLabel.stories.tsx | 49 ++++++++++++++++ .../sidebar/SidebarItemList.stories.tsx | 43 ++++++++++++++ 5 files changed, 208 insertions(+), 4 deletions(-) rename src/stories/{ => sidebar}/Sidebar.stories.tsx (77%) create mode 100644 src/stories/sidebar/SidebarHeader.stories.tsx create mode 100644 src/stories/sidebar/SidebarItem.stories.tsx create mode 100644 src/stories/sidebar/SidebarItemLabel.stories.tsx create mode 100644 src/stories/sidebar/SidebarItemList.stories.tsx diff --git a/src/stories/Sidebar.stories.tsx b/src/stories/sidebar/Sidebar.stories.tsx similarity index 77% rename from src/stories/Sidebar.stories.tsx rename to src/stories/sidebar/Sidebar.stories.tsx index 56702f3..eebfadc 100644 --- a/src/stories/Sidebar.stories.tsx +++ b/src/stories/sidebar/Sidebar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/nextjs-vite"; +import type { Meta, StoryObj } from "@storybook/nextjs-vite"; import Sidebar, { SidebarHeader, SidebarItem, @@ -9,16 +9,31 @@ import Sidebar, { const meta: Meta = { title: "Components/Sidebar", component: Sidebar, - parameters: { layout: "fullscreen" }, + parameters: { + layout: "fullscreen", + docs: { + description: { + component: + "A flexible sidebar container that manages selection state and provides context for child components. Serves as the root wrapper that coordinates the active state across all sidebar items.", + }, + }, + }, tags: ["autodocs"], argTypes: { defaultSelected: { control: "text", - description: "Default selected item ID", + description: + "ID of the item that should be selected by default when the component loads", }, children: { control: false, - description: "Sidebar content (Header, ItemList, Item)", + description: + "Sidebar child elements that compose the internal content of the sidebar", + }, + className: { + control: "text", + description: + "Additional CSS classes to customize the styling of the main container", }, }, }; diff --git a/src/stories/sidebar/SidebarHeader.stories.tsx b/src/stories/sidebar/SidebarHeader.stories.tsx new file mode 100644 index 0000000..8c27611 --- /dev/null +++ b/src/stories/sidebar/SidebarHeader.stories.tsx @@ -0,0 +1,41 @@ +import type { Meta, StoryObj } from "@storybook/nextjs-vite"; +import Sidebar, { SidebarHeader } from "@/components/sidebar"; + +const meta: Meta = { + title: "Components/Sidebar/SidebarHeader", + component: SidebarHeader, + parameters: { + layout: "fullscreen", + docs: { + description: { + component: + "A styled header section for the sidebar with bottom border separation. Typically used to display titles.", + }, + }, + }, + tags: ["autodocs"], + argTypes: { + children: { + control: false, + description: "Header content. Typically a title", + }, + className: { + control: false, + description: + "Additional CSS classes to override or extend the default header styling", + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( +
+ + Hello World! + +
+ ), +}; diff --git a/src/stories/sidebar/SidebarItem.stories.tsx b/src/stories/sidebar/SidebarItem.stories.tsx new file mode 100644 index 0000000..b02afc1 --- /dev/null +++ b/src/stories/sidebar/SidebarItem.stories.tsx @@ -0,0 +1,56 @@ +import type { Meta, StoryObj } from "@storybook/nextjs-vite"; +import Sidebar, { SidebarItem } from "@/components/sidebar"; + +const meta: Meta = { + title: "Components/Sidebar/SidebarItem", + component: SidebarItem, + parameters: { + layout: "fullscreen", + docs: { + description: { + component: + "An interactive menu item that can function as either a navigation link or button. Handles selection state, hover effects, and supports both Next.js routing and custom click handlers with visual feedback.", + }, + }, + }, + tags: ["autodocs"], + argTypes: { + children: { + control: false, + description: "Internal content of the item", + }, + id: { + control: "text", + description: + "Required unique identifier used to control which item is active/selected", + }, + href: { + control: "text", + description: + "Destination URL, when provided transforms the item into a Next.js Link", + }, + onClick: { + control: false, + description: + "Callback executed on click, when provided transforms the item into a button", + }, + className: { + control: false, + description: + "Additional CSS classes to customize individual item appearance", + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( +
+ + Selectable Item + +
+ ), +}; diff --git a/src/stories/sidebar/SidebarItemLabel.stories.tsx b/src/stories/sidebar/SidebarItemLabel.stories.tsx new file mode 100644 index 0000000..c5828f9 --- /dev/null +++ b/src/stories/sidebar/SidebarItemLabel.stories.tsx @@ -0,0 +1,49 @@ +import type { Meta, StoryObj } from "@storybook/nextjs-vite"; +import Sidebar, { + SidebarItem, + SidebarItemLabel, + SidebarItemList, +} from "@/components/sidebar"; + +const meta: Meta = { + title: "Components/Sidebar/SidebarItemLabel", + component: SidebarItemLabel, + parameters: { + layout: "fullscreen", + docs: { + description: { + component: + "A label component that displays an icon and text for sidebar items, featuring hover animations. Created to support sidebar usage on main pages development.", + }, + }, + }, + tags: ["autodocs"], + argTypes: { + icon: { + control: false, + description: + "Material Symbols icon name that will be displayed next to the text", + }, + label: { + control: false, + description: "Descriptive text of the item that appears after the icon", + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( +
+ + + + + + + +
+ ), +}; diff --git a/src/stories/sidebar/SidebarItemList.stories.tsx b/src/stories/sidebar/SidebarItemList.stories.tsx new file mode 100644 index 0000000..bc36a11 --- /dev/null +++ b/src/stories/sidebar/SidebarItemList.stories.tsx @@ -0,0 +1,43 @@ +import type { Meta, StoryObj } from "@storybook/nextjs-vite"; +import Sidebar, { SidebarItem, SidebarItemList } from "@/components/sidebar"; + +const meta: Meta = { + title: "Components/Sidebar/SidebarItemList", + component: SidebarItemList, + parameters: { + layout: "fullscreen", + docs: { + description: { + component: + "A vertical container that organizes sidebar items with consistent spacing.", + }, + }, + }, + tags: ["autodocs"], + argTypes: { + children: { + control: false, + description: + "List of SidebarItem components that form the navigable menu items", + }, + className: { + control: "text", + description: "Additional CSS classes", + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( +
+ + + Hello World! + + +
+ ), +};