diff --git a/.changeset/dry-coats-return.md b/.changeset/dry-coats-return.md new file mode 100644 index 0000000000..bfd6f2f339 --- /dev/null +++ b/.changeset/dry-coats-return.md @@ -0,0 +1,8 @@ +--- +"@skeletonlabs/skeleton-common": minor +"@skeletonlabs/skeleton-svelte": minor +"@skeletonlabs/skeleton-react": minor +--- + +feat: tabs + \ No newline at end of file diff --git a/packages/skeleton-common/src/classes/tabs.ts b/packages/skeleton-common/src/classes/tabs.ts new file mode 100644 index 0000000000..105198cdbe --- /dev/null +++ b/packages/skeleton-common/src/classes/tabs.ts @@ -0,0 +1,10 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesTabs = defineSkeletonClasses({ + root: 'w-full flex data-[orientation=horizontal]:flex-col data-[orientation=vertical]:flex-row', + list: 'relative data-[orientation=horizontal]:mb-4 data-[orientation=horizontal]:pb-2 data-[orientation=vertical]:pe-2 data-[orientation=vertical]:me-4 flex data-[orientation=horizontal]:flex-row data-[orientation=vertical]:flex-col gap-2 data-[orientation=horizontal]:border-b data-[orientation=vertical]:border-e border-surface-200-800', + trigger: 'btn hover:preset-tonal-primary data-disabled:opacity-50 data-disabled:pointer-events-none', + indicator: + 'bg-surface-950-50 data-[orientation=horizontal]:w-(--width) data-[orientation=horizontal]:h-0.5 data-[orientation=horizontal]:bottom-0 data-[orientation=vertical]:w-0.5 data-[orientation=vertical]:h-(--height) data-[orientation=vertical]:end-0', + content: '' +}); diff --git a/packages/skeleton-common/src/index.ts b/packages/skeleton-common/src/index.ts index 8f46aae5ab..a317a226d5 100644 --- a/packages/skeleton-common/src/index.ts +++ b/packages/skeleton-common/src/index.ts @@ -2,3 +2,4 @@ export * from './themes.js'; export * from './classes/accordion.js'; export * from './classes/avatar.js'; export * from './classes/rating-group.js'; +export * from './classes/tabs.js'; diff --git a/packages/skeleton-react/src/components/tabs/anatomy/tabs-content.tsx b/packages/skeleton-react/src/components/tabs/anatomy/tabs-content.tsx new file mode 100644 index 0000000000..c809de379e --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/tabs-content.tsx @@ -0,0 +1,22 @@ +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { splitContentProps, type ContentProps } from '@zag-js/tabs'; +import { mergeProps } from '@zag-js/react'; +import { useContext, type ComponentProps } from 'react'; +import { TabsRootContext } from '../modules/tabs-root-context.js'; +import type { PropsWithElement } from '@/internal/props-with-element.js'; + +export interface TabsContentProps extends PropsWithElement, ContentProps, ComponentProps<'div'> {} + +export default function (props: TabsContentProps) { + const rootContext = useContext(TabsRootContext); + const [itemProps, componentProps] = splitContentProps(props); + const { element, children, ...restAttributes } = componentProps; + const attributes = mergeProps( + rootContext.api.getContentProps(itemProps), + { + className: classesTabs.content + }, + restAttributes + ); + return element ? element({ attributes }) :
{children}
; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/tabs-indicator.tsx b/packages/skeleton-react/src/components/tabs/anatomy/tabs-indicator.tsx new file mode 100644 index 0000000000..04f6f9b510 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/tabs-indicator.tsx @@ -0,0 +1,20 @@ +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { useContext, type ComponentProps } from 'react'; +import { TabsRootContext } from '../modules/tabs-root-context.js'; +import type { PropsWithElement } from '@/internal/props-with-element.js'; + +export interface TabsIndicatorProps extends PropsWithElement, Omit, 'children'> {} + +export default function (props: TabsIndicatorProps) { + const rootContext = useContext(TabsRootContext); + const { element, ...restAttributes } = props; + const attributes = mergeProps( + rootContext.api.getIndicatorProps(), + { + className: classesTabs.indicator + }, + restAttributes + ); + return element ? element({ attributes }) :
; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/tabs-list.tsx b/packages/skeleton-react/src/components/tabs/anatomy/tabs-list.tsx new file mode 100644 index 0000000000..444aa6509f --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/tabs-list.tsx @@ -0,0 +1,20 @@ +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { useContext, type ComponentProps } from 'react'; +import { TabsRootContext } from '../modules/tabs-root-context.js'; +import type { PropsWithElement } from '@/internal/props-with-element.js'; + +export interface TabsListProps extends PropsWithElement, Omit, 'id' | 'defaultValue' | 'dir'> {} + +export default function (props: TabsListProps) { + const rootContext = useContext(TabsRootContext); + const { element, children, ...restAttributes } = props; + const attributes = mergeProps( + rootContext.api.getListProps(), + { + className: classesTabs.list + }, + restAttributes + ); + return element ? element({ attributes }) :
{children}
; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/tabs-root-context.tsx b/packages/skeleton-react/src/components/tabs/anatomy/tabs-root-context.tsx new file mode 100644 index 0000000000..4ddb89b5bc --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/tabs-root-context.tsx @@ -0,0 +1,11 @@ +import { useContext, type ReactNode } from 'react'; +import { type TabsRootContextType, TabsRootContext } from '../modules/tabs-root-context.js'; + +export interface TabsRootContextProps { + children: (context: TabsRootContextType) => ReactNode; +} + +export default function (props: TabsRootContextProps) { + const rootContext = useContext(TabsRootContext); + return props.children(rootContext); +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/tabs-root.tsx b/packages/skeleton-react/src/components/tabs/anatomy/tabs-root.tsx new file mode 100644 index 0000000000..0ac4bb1af0 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/tabs-root.tsx @@ -0,0 +1,30 @@ +import { splitProps, machine, connect, type Props } from '@zag-js/tabs'; +import { mergeProps, normalizeProps, useMachine } from '@zag-js/react'; +import { useId, type ComponentProps } from 'react'; +import { TabsRootContext } from '../modules/tabs-root-context.js'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTabs } from '@skeletonlabs/skeleton-common'; + +export interface TabsRootProps extends PropsWithElement, Omit, Omit, 'id' | 'defaultValue' | 'dir'> {} + +export default function (props: TabsRootProps) { + const [machineProps, componentProps] = splitProps(props); + const { element, children, ...restAttributes } = componentProps; + const service = useMachine(machine, { + id: useId(), + ...machineProps + }); + const api = connect(service, normalizeProps); + const attributes = mergeProps( + api.getRootProps(), + { + className: classesTabs.root + }, + restAttributes + ); + return ( + + {element ? element({ attributes }) :
{children}
} +
+ ); +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/tabs-trigger.tsx b/packages/skeleton-react/src/components/tabs/anatomy/tabs-trigger.tsx new file mode 100644 index 0000000000..547f653ad4 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/tabs-trigger.tsx @@ -0,0 +1,22 @@ +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { splitTriggerProps, type TriggerProps } from '@zag-js/tabs'; +import { mergeProps } from '@zag-js/react'; +import { useContext, type ComponentProps } from 'react'; +import { TabsRootContext } from '../modules/tabs-root-context.js'; +import type { PropsWithElement } from '@/internal/props-with-element.js'; + +export interface TabsTriggerProps extends PropsWithElement, TriggerProps, Omit, 'value'> {} + +export default function (props: TabsTriggerProps) { + const rootContext = useContext(TabsRootContext); + const [itemProps, componentProps] = splitTriggerProps(props); + const { element, children, ...restAttributes } = componentProps; + const attributes = mergeProps( + rootContext.api.getTriggerProps(itemProps), + { + className: classesTabs.trigger + }, + restAttributes + ); + return element ? element({ attributes }) : ; +} diff --git a/packages/skeleton-react/src/components/tabs/index.ts b/packages/skeleton-react/src/components/tabs/index.ts new file mode 100644 index 0000000000..ebe167f068 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/index.ts @@ -0,0 +1,8 @@ +export { Tabs } from './modules/tabs-anatomy.js'; +export type { TabsRootProps } from './anatomy/tabs-root.js'; +export type { TabsRootContextProps } from './anatomy/tabs-root-context.js'; +export type { TabsListProps } from './anatomy/tabs-list.js'; +export type { TabsTriggerProps } from './anatomy/tabs-trigger.js'; +export type { TabsIndicatorProps } from './anatomy/tabs-indicator.js'; +export type { TabsContentProps } from './anatomy/tabs-content.js'; +export type { TabsRootContextType as TabsRootContext } from './modules/tabs-root-context.js'; diff --git a/packages/skeleton-react/src/components/tabs/modules/tabs-anatomy.ts b/packages/skeleton-react/src/components/tabs/modules/tabs-anatomy.ts new file mode 100644 index 0000000000..d072bd3e35 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/modules/tabs-anatomy.ts @@ -0,0 +1,14 @@ +import TabsRoot from '../anatomy/tabs-root.jsx'; +import TabsRootContext from '../anatomy/tabs-root-context.jsx'; +import TabsList from '../anatomy/tabs-list.jsx'; +import TabsTrigger from '../anatomy/tabs-trigger.jsx'; +import tabsIndicator from '../anatomy/tabs-indicator.js'; +import TabsContent from '../anatomy/tabs-content.jsx'; + +export const Tabs = Object.assign(TabsRoot, { + Context: TabsRootContext, + List: TabsList, + Trigger: TabsTrigger, + Indicator: tabsIndicator, + Content: TabsContent +}); diff --git a/packages/skeleton-react/src/components/tabs/modules/tabs-root-context.ts b/packages/skeleton-react/src/components/tabs/modules/tabs-root-context.ts new file mode 100644 index 0000000000..ab132d93ec --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/modules/tabs-root-context.ts @@ -0,0 +1,8 @@ +import { createContext } from 'react'; +import type { Api } from '@zag-js/tabs'; + +export interface TabsRootContextType { + api: Api; +} + +export const TabsRootContext = createContext(null!); diff --git a/packages/skeleton-react/src/index.ts b/packages/skeleton-react/src/index.ts index a21d834045..c8536e9361 100644 --- a/packages/skeleton-react/src/index.ts +++ b/packages/skeleton-react/src/index.ts @@ -1,3 +1,4 @@ export * from './components/accordion/index.js'; export * from './components/avatar/index.js'; export * from './components/rating-group/index.js'; +export * from './components/tabs/index.js'; diff --git a/packages/skeleton-react/test/components/tabs/index.test.tsx b/packages/skeleton-react/test/components/tabs/index.test.tsx new file mode 100644 index 0000000000..24b5fbabe7 --- /dev/null +++ b/packages/skeleton-react/test/components/tabs/index.test.tsx @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import Tabs from './tabs.js'; + +describe('tabs', () => { + describe('root', () => { + it('renders', () => { + render(); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('list', () => { + it('renders', () => { + render(); + expect(screen.getByTestId('list')).toBeInTheDocument(); + }); + }); + + describe('trigger', () => { + it('renders', () => { + render(); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('indicator', () => { + it('renders', () => { + render(); + expect(screen.getByTestId('indicator')).toBeInTheDocument(); + }); + }); + + describe('content', () => { + it('renders', () => { + render(); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/tabs/tabs.tsx b/packages/skeleton-react/test/components/tabs/tabs.tsx new file mode 100644 index 0000000000..5ac097817a --- /dev/null +++ b/packages/skeleton-react/test/components/tabs/tabs.tsx @@ -0,0 +1,13 @@ +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function () { + return ( + + + + + + + + ); +} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-content.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-content.svelte new file mode 100644 index 0000000000..385ee67a52 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-content.svelte @@ -0,0 +1,36 @@ + + + + +{#if element} + {@render element({ attributes })} +{:else} +
+ {@render children?.()} +
+{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-indicator.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-indicator.svelte new file mode 100644 index 0000000000..0097e5c816 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-indicator.svelte @@ -0,0 +1,31 @@ + + + + +{#if element} + {@render element({ attributes })} +{:else} +
+{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-list.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-list.svelte new file mode 100644 index 0000000000..8ab2ae3bda --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-list.svelte @@ -0,0 +1,33 @@ + + + + +{#if element} + {@render element({ attributes })} +{:else} +
+ {@render children?.()} +
+{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-root-context.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-root-context.svelte new file mode 100644 index 0000000000..3ef87b3835 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-root-context.svelte @@ -0,0 +1,17 @@ + + + + +{@render props.children(rootContext)} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-root.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-root.svelte new file mode 100644 index 0000000000..d7e89a9b32 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-root.svelte @@ -0,0 +1,49 @@ + + + + +{#if element} + {@render element({ attributes })} +{:else} +
+ {@render children?.()} +
+{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-trigger.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-trigger.svelte new file mode 100644 index 0000000000..55462ff8cb --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/tabs-trigger.svelte @@ -0,0 +1,36 @@ + + + + +{#if element} + {@render element({ attributes })} +{:else} + +{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/index.ts b/packages/skeleton-svelte/src/components/tabs/index.ts new file mode 100644 index 0000000000..ca0babc27f --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/index.ts @@ -0,0 +1 @@ +export * from './modules/tabs-anatomy.js'; diff --git a/packages/skeleton-svelte/src/components/tabs/modules/tabs-anatomy.ts b/packages/skeleton-svelte/src/components/tabs/modules/tabs-anatomy.ts new file mode 100644 index 0000000000..2ae6474432 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/modules/tabs-anatomy.ts @@ -0,0 +1,14 @@ +import TabsRoot from '../anatomy/tabs-root.svelte'; +import TabsRootContext from '../anatomy/tabs-root-context.svelte'; +import TabsList from '../anatomy/tabs-list.svelte'; +import TabsTrigger from '../anatomy/tabs-trigger.svelte'; +import TabsIndicator from '../anatomy/tabs-indicator.svelte'; +import TabsContent from '../anatomy/tabs-content.svelte'; + +export const Tabs = Object.assign(TabsRoot, { + Context: TabsRootContext, + List: TabsList, + Trigger: TabsTrigger, + Indicator: TabsIndicator, + Content: TabsContent +}); diff --git a/packages/skeleton-svelte/src/components/tabs/modules/tabs-root-context.ts b/packages/skeleton-svelte/src/components/tabs/modules/tabs-root-context.ts new file mode 100644 index 0000000000..29e5290f1a --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/modules/tabs-root-context.ts @@ -0,0 +1,8 @@ +import { createContext } from '@/internal/create-context.js'; +import type { Api } from '@zag-js/tabs'; + +export interface TabsRootContextType { + api: Api; +} + +export const TabsRootContext = createContext(); diff --git a/packages/skeleton-svelte/src/index.ts b/packages/skeleton-svelte/src/index.ts index a21d834045..c8536e9361 100644 --- a/packages/skeleton-svelte/src/index.ts +++ b/packages/skeleton-svelte/src/index.ts @@ -1,3 +1,4 @@ export * from './components/accordion/index.js'; export * from './components/avatar/index.js'; export * from './components/rating-group/index.js'; +export * from './components/tabs/index.js'; diff --git a/packages/skeleton-svelte/test/components/tabs/index.test.ts b/packages/skeleton-svelte/test/components/tabs/index.test.ts new file mode 100644 index 0000000000..63d65e5503 --- /dev/null +++ b/packages/skeleton-svelte/test/components/tabs/index.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest'; +import { render } from '@testing-library/svelte'; +import Tabs from './tabs.svelte'; + +describe('tabs', () => { + describe('root', () => { + it('renders', () => { + const screen = render(Tabs); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('list', () => { + it('renders', () => { + const screen = render(Tabs); + expect(screen.getByTestId('list')).toBeInTheDocument(); + }); + }); + + describe('trigger', () => { + it('renders', () => { + const screen = render(Tabs); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('indicator', () => { + it('renders', () => { + const screen = render(Tabs); + expect(screen.getByTestId('indicator')).toBeInTheDocument(); + }); + }); + + describe('content', () => { + it('renders', () => { + const screen = render(Tabs); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/tabs/tabs.svelte b/packages/skeleton-svelte/test/components/tabs/tabs.svelte new file mode 100644 index 0000000000..daf6eb1d53 --- /dev/null +++ b/packages/skeleton-svelte/test/components/tabs/tabs.svelte @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/playgrounds/skeleton-react/src/app/components/tabs/page.tsx b/playgrounds/skeleton-react/src/app/components/tabs/page.tsx new file mode 100644 index 0000000000..54a43e5493 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/tabs/page.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + + ); +} diff --git a/playgrounds/skeleton-react/src/app/layout.tsx b/playgrounds/skeleton-react/src/app/layout.tsx index a67de81040..66ae92a104 100644 --- a/playgrounds/skeleton-react/src/app/layout.tsx +++ b/playgrounds/skeleton-react/src/app/layout.tsx @@ -33,6 +33,9 @@ export default function RootLayout({ Rating Group + + Tabs + diff --git a/playgrounds/skeleton-svelte/src/routes/+layout.svelte b/playgrounds/skeleton-svelte/src/routes/+layout.svelte index 00bd0b3450..2e1483731d 100644 --- a/playgrounds/skeleton-svelte/src/routes/+layout.svelte +++ b/playgrounds/skeleton-svelte/src/routes/+layout.svelte @@ -20,6 +20,7 @@ Accordions Avatars Rating Group + Tabs diff --git a/playgrounds/skeleton-svelte/src/routes/components/tabs/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/tabs/+page.svelte new file mode 100644 index 0000000000..cac9d7b366 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/tabs/+page.svelte @@ -0,0 +1,15 @@ + + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + diff --git a/sites/skeleton.dev/src/content/docs/components/tabs/meta.mdx b/sites/skeleton.dev/src/content/docs/components/tabs/meta.mdx new file mode 100644 index 0000000000..289c3b54d2 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/tabs/meta.mdx @@ -0,0 +1,8 @@ +--- +title: Tabs +description: Use tabs to quickly switch between different views and pages. +srcSvelte: '/src/components/tabs' +srcReact: '/src/components/tabs' +srcZag: 'https://zagjs.com/components/react/tabs' +showDocsUrl: true +--- diff --git a/sites/skeleton.dev/src/content/docs/components/tabs/react.mdx b/sites/skeleton.dev/src/content/docs/components/tabs/react.mdx new file mode 100644 index 0000000000..bfffdb7c81 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/tabs/react.mdx @@ -0,0 +1,77 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Example from '@examples/components/tabs/react/default.tsx'; +import ExampleRaw from '@examples/components/tabs/react/default.tsx?raw'; + +import ExampleAnchor from '@examples/components/tabs/react/anchor.tsx'; +import ExampleAnchorRaw from '@examples/components/tabs/react/anchor.tsx?raw'; + +import ExampleFluid from '@examples/components/tabs/react/fluid.tsx'; +import ExampleFluidRaw from '@examples/components/tabs/react/fluid.tsx?raw'; + +import ExampleVertical from '@examples/components/tabs/react/vertical.tsx'; +import ExampleVerticalRaw from '@examples/components/tabs/react/vertical.tsx?raw'; + +import ExampleRtl from '@examples/components/tabs/react/rtl.tsx'; +import ExampleRtlRaw from '@examples/components/tabs/react/rtl.tsx?raw'; + + + + + + + + + + +## Anchor + + + + + + + + + + +## Fluid + + + + + + + + + + +## Vertical + + + + + + + + + + +## RTL + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/tabs/svelte.mdx b/sites/skeleton.dev/src/content/docs/components/tabs/svelte.mdx new file mode 100644 index 0000000000..e51a1f548e --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/tabs/svelte.mdx @@ -0,0 +1,77 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Example from '@examples/components/tabs/svelte/default.svelte'; +import ExampleRaw from '@examples/components/tabs/svelte/default.svelte?raw'; + +import ExampleAnchor from '@examples/components/tabs/svelte/anchor.svelte'; +import ExampleAnchorRaw from '@examples/components/tabs/svelte/anchor.svelte?raw'; + +import ExampleFluid from '@examples/components/tabs/svelte/fluid.svelte'; +import ExampleFluidRaw from '@examples/components/tabs/svelte/fluid.svelte?raw'; + +import ExampleVertical from '@examples/components/tabs/svelte/vertical.svelte'; +import ExampleVerticalRaw from '@examples/components/tabs/svelte/vertical.svelte?raw'; + +import ExampleRtl from '@examples/components/tabs/svelte/rtl.svelte'; +import ExampleRtlRaw from '@examples/components/tabs/svelte/rtl.svelte?raw'; + + + + + + + + + + +## Anchor + + + + + + + + + + +## Fluid + + + + + + + + + + +## Vertical + + + + + + + + + + +## RTL + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/examples/components/tabs/react/anchor.tsx b/sites/skeleton.dev/src/examples/components/tabs/react/anchor.tsx new file mode 100644 index 0000000000..c537719997 --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/react/anchor.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function () { + return ( + + + ( + + Tab 1 + + )} + /> + ( + + Tab 2 + + )} + /> + ( + + Tab 3 + + )} + /> + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + + ); +} diff --git a/sites/skeleton.dev/src/examples/components/tabs/react/default.tsx b/sites/skeleton.dev/src/examples/components/tabs/react/default.tsx new file mode 100644 index 0000000000..a23268037c --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/react/default.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function () { + return ( + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + + ); +} diff --git a/sites/skeleton.dev/src/examples/components/tabs/react/fluid.tsx b/sites/skeleton.dev/src/examples/components/tabs/react/fluid.tsx new file mode 100644 index 0000000000..3b8457717b --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/react/fluid.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function () { + return ( + + + + Tab 1 + + + Tab 2 + + + Tab 3 + + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + + ); +} diff --git a/sites/skeleton.dev/src/examples/components/tabs/react/rtl.tsx b/sites/skeleton.dev/src/examples/components/tabs/react/rtl.tsx new file mode 100644 index 0000000000..9ee85ae2da --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/react/rtl.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function () { + return ( + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + + ); +} diff --git a/sites/skeleton.dev/src/examples/components/tabs/react/vertical.tsx b/sites/skeleton.dev/src/examples/components/tabs/react/vertical.tsx new file mode 100644 index 0000000000..47be35cb6e --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/react/vertical.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function () { + return ( + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + + ); +} diff --git a/sites/skeleton.dev/src/examples/components/tabs/svelte/anchor.svelte b/sites/skeleton.dev/src/examples/components/tabs/svelte/anchor.svelte new file mode 100644 index 0000000000..f392415d89 --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/svelte/anchor.svelte @@ -0,0 +1,27 @@ + + + + + + {#snippet element({ attributes })} + Tab 1 + {/snippet} + + + {#snippet element({ attributes })} + Tab 2 + {/snippet} + + + {#snippet element({ attributes })} + Tab 3 + {/snippet} + + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + diff --git a/sites/skeleton.dev/src/examples/components/tabs/svelte/default.svelte b/sites/skeleton.dev/src/examples/components/tabs/svelte/default.svelte new file mode 100644 index 0000000000..cac9d7b366 --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/svelte/default.svelte @@ -0,0 +1,15 @@ + + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + diff --git a/sites/skeleton.dev/src/examples/components/tabs/svelte/fluid.svelte b/sites/skeleton.dev/src/examples/components/tabs/svelte/fluid.svelte new file mode 100644 index 0000000000..5d1711f097 --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/svelte/fluid.svelte @@ -0,0 +1,15 @@ + + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + diff --git a/sites/skeleton.dev/src/examples/components/tabs/svelte/rtl.svelte b/sites/skeleton.dev/src/examples/components/tabs/svelte/rtl.svelte new file mode 100644 index 0000000000..362446704e --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/svelte/rtl.svelte @@ -0,0 +1,15 @@ + + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + diff --git a/sites/skeleton.dev/src/examples/components/tabs/svelte/vertical.svelte b/sites/skeleton.dev/src/examples/components/tabs/svelte/vertical.svelte new file mode 100644 index 0000000000..d6faa41191 --- /dev/null +++ b/sites/skeleton.dev/src/examples/components/tabs/svelte/vertical.svelte @@ -0,0 +1,15 @@ + + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 +