diff --git a/packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.css.ts b/packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.css.ts new file mode 100644 index 000000000..e626aa46e --- /dev/null +++ b/packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.css.ts @@ -0,0 +1,41 @@ +import { style } from '@vanilla-extract/css' +import { createSprinkles } from '@vanilla-extract/sprinkles' + +import { themeColorProperties, vars } from '@/system' + +const sprinkles = createSprinkles(themeColorProperties) + +export const tab = style({ + cursor: 'pointer', + borderStyle: 'none', + borderBottomStyle: 'solid', + borderBottomWidth: '2px', + letterSpacing: '0.1em', + whiteSpace: 'nowrap', + textTransform: 'uppercase', + transition: 'all 0.2s' +}) + +export const activeTab = sprinkles({ + color: { base: 'custom-500' }, + borderColor: { base: 'custom-500' } +}) + +export const inactiveTab = sprinkles({ + color: { + base: 'bg-400', + hover: 'bg-800', + dark: 'bg-500', + darkHover: 'bg-200' + }, + borderColor: { + base: 'bg-400', + hover: 'bg-800', + dark: 'bg-500', + darkHover: 'bg-200' + } +}) + +export const amount = style({ + fontSize: vars.fontSize.sm +}) diff --git a/packages/lifeforge-ui/src/components/navigation/Tabs.stories.tsx b/packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.stories.tsx similarity index 78% rename from packages/lifeforge-ui/src/components/navigation/Tabs.stories.tsx rename to packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.stories.tsx index 2fd07130b..626888d75 100644 --- a/packages/lifeforge-ui/src/components/navigation/Tabs.stories.tsx +++ b/packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.stories.tsx @@ -2,7 +2,9 @@ import type { Meta, StoryObj } from '@storybook/react-vite' import { useState } from 'react' import colors from 'tailwindcss/colors' -import Tabs from './Tabs' +import { Box } from '@components/primitives' + +import Tabs from '../Tabs' const meta = { component: Tabs, @@ -42,14 +44,14 @@ export const Default: Story = { >('overview') return ( -
+ -
+ ) } } @@ -82,14 +84,14 @@ export const WithAmounts: Story = { >('all') return ( -
+ -
+ ) } } @@ -119,14 +121,14 @@ export const WithColors: Story = { const [active, setActive] = useState<'red' | 'green' | 'blue'>('red') return ( -
+ -
+ ) } } @@ -147,14 +149,44 @@ export const PartiallyEnabled: Story = { ) return ( -
+ -
+ + ) + } +} + +/** + * A large number of tabs to demonstrate horizontal scrolling behavior. + */ +export const ALotOfTabs: Story = { + args: { + items: [], + enabled: [], + currentTab: 'tab1', + onTabChange: () => {} + }, + render: () => { + const [active, setActive] = useState('tab1') + + return ( + + `tab${i + 1}`)} + items={Array.from({ length: 20 }, (_, i) => ({ + id: `tab${i + 1}`, + name: `Tab ${i + 1}`, + icon: 'tabler:star' + }))} + onTabChange={setActive} + /> + ) } } diff --git a/packages/lifeforge-ui/src/components/navigation/Tabs.tsx b/packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.tsx similarity index 59% rename from packages/lifeforge-ui/src/components/navigation/Tabs.tsx rename to packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.tsx index 162fa7e48..dcd309ca0 100644 --- a/packages/lifeforge-ui/src/components/navigation/Tabs.tsx +++ b/packages/lifeforge-ui/src/components/navigation/Tabs/Tabs.tsx @@ -1,6 +1,10 @@ import { Icon } from '@iconify/react' import clsx from 'clsx' +import { Box, Flex, Text } from '@components/primitives' + +import * as styles from './Tabs.css' + interface TabsProps< T, TKey = T extends ReadonlyArray<{ readonly id: infer U }> ? U : never @@ -31,20 +35,27 @@ function Tabs< TKey = T extends ReadonlyArray<{ readonly id: infer U }> ? U : never >({ items, enabled, currentTab, onTabChange, className }: TabsProps) { return ( -
+ {items .filter(({ id }) => enabled.includes(id as TKey)) .map(({ name, icon, id, color }) => ( - + + {name} + + {items.find(item => item.name === name)?.amount !== undefined && ( + + ({items.find(item => item.name === name)?.amount}) + + )} + ))} -
+ ) } diff --git a/packages/lifeforge-ui/src/components/navigation/Tabs/index.ts b/packages/lifeforge-ui/src/components/navigation/Tabs/index.ts new file mode 100644 index 000000000..07f8cccfe --- /dev/null +++ b/packages/lifeforge-ui/src/components/navigation/Tabs/index.ts @@ -0,0 +1 @@ +export { default } from './Tabs'