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'