Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions packages/web/__registry__/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2371,6 +2371,19 @@ export const Index: Record<string, any> = {
},
],
},
'mc-collapsible': {
name: 'mc-collapsible',
description: 'A collapsible component for MicroClub UI',
type: 'registry:component',
files: [
{
path: 'registry/ui/mc-collapsible.tsx',
content:
'\'use client\';\n\nimport { Collapsible as CollapsiblePrimitive } from \'@base-ui/react/collapsible\';\n\nfunction McCollapsible({ ...props }: CollapsiblePrimitive.Root.Props) {\n return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />;\n}\n\nfunction McCollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {\n return <CollapsiblePrimitive.Trigger data-slot="collapsible-trigger" {...props} />;\n}\n\nfunction McCollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {\n return <CollapsiblePrimitive.Panel data-slot="collapsible-content" {...props} />;\n}\n\nexport { McCollapsible, McCollapsibleTrigger, McCollapsibleContent };\n',
type: 'registry:component',
},
],
},
'mc-separator': {
name: 'mc-separator',
description: 'A separator component for MicroClub UI',
Expand Down Expand Up @@ -2872,6 +2885,22 @@ export const Index: Record<string, any> = {
source:
'import {\n McAccordion,\n McAccordionContent,\n McAccordionItem,\n McAccordionTrigger,\n} from \'../ui/mc-accordion\';\n\nexport function AccordionDemo() {\n return (\n <McAccordion defaultValue={[\'product\']} className="max-w-lg">\n <McAccordionItem value="product">\n <McAccordionTrigger>Product Information</McAccordionTrigger>\n <McAccordionContent>\n <p>\n Our flagship product combines cutting-edge technology with sleek design. Built with\n premium materials, it offers unparalleled performance and reliability.\n </p>\n <p>\n Key features include advanced processing capabilities, and an intuitive user interface\n designed for both beginners and experts.\n </p>\n </McAccordionContent>\n </McAccordionItem>\n <McAccordionItem value="shipping">\n <McAccordionTrigger>Shipping Details</McAccordionTrigger>\n <McAccordionContent>\n <p>We offer standard (5-7 days), express (2-3 days), and overnight shipping.</p>\n <p>\n Free shipping on international orders is available once the minimum order amount is\n reached.\n </p>\n </McAccordionContent>\n </McAccordionItem>\n <McAccordionItem value="returns">\n <McAccordionTrigger>Return Policy</McAccordionTrigger>\n <McAccordionContent>\n <p>\n Returns accepted within 30 days. Items must be unused and in original packaging. Refunds\n processed within 5-7 business days.\n </p>\n </McAccordionContent>\n </McAccordionItem>\n </McAccordion>\n );\n}\n\nexport default AccordionDemo;\n',
},
'mc-collapsible-demo': {
name: 'mc-collapsible-demo',
description: 'Demo for MicroClub Collapsible',
type: 'registry:example',
files: [
{
path: 'registry/examples/mc-collapsible-demo.tsx',
content:
'import { McButton } from \'../ui/mc-button\';\nimport { McCollapsible, McCollapsibleContent, McCollapsibleTrigger } from \'../ui/mc-collapsible\';\n\nexport default function McCollapsibleDemo() {\n return (\n <McCollapsible className="w-full max-w-sm space-y-2">\n <McCollapsibleTrigger\n render={\n <McButton variant="tertiary" size="sm">\n Toggle collapse\n </McButton>\n }\n />\n <McCollapsibleContent className="rounded-lg border border-border bg-card p-4 text-sm text-card-foreground">\n This is the collapsible content.\n </McCollapsibleContent>\n </McCollapsible>\n );\n}\n',
type: 'registry:example',
},
],
component: React.lazy(() => import('@/registry/examples/mc-collapsible-demo.tsx')),
source:
'import { McButton } from \'../ui/mc-button\';\nimport { McCollapsible, McCollapsibleContent, McCollapsibleTrigger } from \'../ui/mc-collapsible\';\n\nexport default function McCollapsibleDemo() {\n return (\n <McCollapsible className="w-full max-w-sm space-y-2">\n <McCollapsibleTrigger\n render={\n <McButton variant="tertiary" size="sm">\n Toggle collapse\n </McButton>\n }\n />\n <McCollapsibleContent className="rounded-lg border border-border bg-card p-4 text-sm text-card-foreground">\n This is the collapsible content.\n </McCollapsibleContent>\n </McCollapsible>\n );\n}\n',
},
'mc-separator-demo': {
name: 'mc-separator-demo',
description: 'Demo for MicroClub Separator',
Expand Down
13 changes: 13 additions & 0 deletions packages/web/__registry__/registry.autogenerated.json
Original file line number Diff line number Diff line change
Expand Up @@ -2467,6 +2467,19 @@
],
"type": "registry:component"
},
{
"name": "mc-collapsible",
"title": "MicroClub Collapsible",
"description": "A collapsible component for MicroClub UI",
"dependencies": ["@base-ui/react"],
"files": [
{
"path": "registry/ui/mc-collapsible.tsx",
"type": "registry:component"
}
],
"type": "registry:component"
},
{
"name": "mc-separator",
"title": "MicroClub Separator",
Expand Down
113 changes: 108 additions & 5 deletions packages/web/content/docs/components/mc-collapsible.mdx
Original file line number Diff line number Diff line change
@@ -1,9 +1,112 @@
---
title: MC Collapsible
description: A component that can show or hide content.
description: An interactive component that expands and collapses a panel.
---

<Callout type="warn">
This component is coming soon. Check our [contributing guide](/docs/introduction#contributing) for
more information.
</Callout>
## Overview

The `mc-collapsible` component shows or hides a single panel. It uses the **@base-ui/react**
collapsible primitive for accessible behavior and leaves visual styling to the consumer.

## Preview

<Tabs items={['preview', 'code']}>
<Tab>
<ComponentPreview name="mc-collapsible-demo" />
</Tab>
<Tab>
<ComponentSource name="mc-collapsible-demo" />
</Tab>
</Tabs>

## Add to Your Project

<Tabs items={['npm', 'pnpm', 'yarn', 'bun']}>
<Tab value="npm">npx mcoli-ui@latest add mc-collapsible</Tab>
<Tab value="pnpm">pnpm dlx mcoli-ui@latest add mc-collapsible</Tab>
<Tab value="yarn">yarn dlx mcoli-ui@latest add mc-collapsible</Tab>
<Tab value="bun">bunx mcoli-ui@latest add mc-collapsible</Tab>
</Tabs>

### Manual Setup

<Steps>

<Step>Install the dependency</Step>

<Tabs items={['npm', 'pnpm', 'yarn', 'bun']}>
<Tab value="npm">npm install @base-ui/react</Tab>
<Tab value="pnpm">pnpm add @base-ui/react</Tab>
<Tab value="yarn">yarn add @base-ui/react</Tab>
<Tab value="bun">bun add @base-ui/react</Tab>
</Tabs>

<Step>Copy the source code</Step>

<ComponentSource name="mc-collapsible" />

</Steps>

## Usage

```tsx
import {
McCollapsible,
McCollapsibleContent,
McCollapsibleTrigger,
} from '@/components/ui/mc-collapsible';

export default function Example() {
return (
<McCollapsible>
<McCollapsibleTrigger>Toggle collapse</McCollapsibleTrigger>
<McCollapsibleContent>Details are shown when the panel is open.</McCollapsibleContent>
</McCollapsible>
);
}
```

## Controlled State

Use `open` and `onOpenChange` to control the component state.

```tsx
'use client';

import * as React from 'react';
import {
McCollapsible,
McCollapsibleContent,
McCollapsibleTrigger,
} from '@/components/ui/mc-collapsible';

export default function ControlledExample() {
const [open, setOpen] = React.useState(false);

return (
<McCollapsible open={open} onOpenChange={setOpen}>
<McCollapsibleTrigger>{open ? 'Hide' : 'Show'} details</McCollapsibleTrigger>
<McCollapsibleContent>Controlled panel content.</McCollapsibleContent>
</McCollapsible>
);
}
```

## API Reference

### McCollapsible

| Prop | Type | Default | Description |
| -------------- | ------------------------- | ------- | ---------------------------------- |
| `defaultOpen` | `boolean` | `false` | Initial state when uncontrolled |
| `open` | `boolean` | `-` | Controlled open state |
| `onOpenChange` | `(open: boolean) => void` | `-` | Called when the open state changes |
| `disabled` | `boolean` | `false` | Prevents the trigger from toggling |

### McCollapsibleTrigger

Accepts all Base UI collapsible trigger props, including `render` for custom trigger elements.

### McCollapsibleContent

Accepts all Base UI collapsible panel props, including `keepMounted` and `hiddenUntilFound`.
15 changes: 15 additions & 0 deletions packages/web/public/r/mc-collapsible.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "mc-collapsible",
"title": "MicroClub Collapsible",
"description": "A collapsible component for MicroClub UI",
"dependencies": ["@base-ui/react"],
"files": [
{
"path": "registry/ui/mc-collapsible.tsx",
"content": "'use client';\n\nimport { Collapsible as CollapsiblePrimitive } from '@base-ui/react/collapsible';\n\nfunction McCollapsible({ ...props }: CollapsiblePrimitive.Root.Props) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nfunction McCollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {\n return <CollapsiblePrimitive.Trigger data-slot=\"collapsible-trigger\" {...props} />;\n}\n\nfunction McCollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {\n return <CollapsiblePrimitive.Panel data-slot=\"collapsible-content\" {...props} />;\n}\n\nexport { McCollapsible, McCollapsibleTrigger, McCollapsibleContent };\n",
"type": "registry:component"
}
],
"type": "registry:component"
}
13 changes: 13 additions & 0 deletions packages/web/public/r/registry.json
Original file line number Diff line number Diff line change
Expand Up @@ -2467,6 +2467,19 @@
],
"type": "registry:component"
},
{
"name": "mc-collapsible",
"title": "MicroClub Collapsible",
"description": "A collapsible component for MicroClub UI",
"dependencies": ["@base-ui/react"],
"files": [
{
"path": "registry/ui/mc-collapsible.tsx",
"type": "registry:component"
}
],
"type": "registry:component"
},
{
"name": "mc-separator",
"title": "MicroClub Separator",
Expand Down
19 changes: 19 additions & 0 deletions packages/web/registry/examples/mc-collapsible-demo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { McButton } from '../ui/mc-button';
import { McCollapsible, McCollapsibleContent, McCollapsibleTrigger } from '../ui/mc-collapsible';

export default function McCollapsibleDemo() {
return (
<McCollapsible className="w-full max-w-sm space-y-2">
<McCollapsibleTrigger
render={
<McButton variant="tertiary" size="sm">
Toggle collapse
</McButton>
}
/>
<McCollapsibleContent className="rounded-lg border border-border bg-card p-4 text-sm text-card-foreground">
This is the collapsible content.
</McCollapsibleContent>
</McCollapsible>
);
}
16 changes: 16 additions & 0 deletions packages/web/registry/registry-examples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,22 @@ export const examples: Registry['items'] = [
],
registryDependencies: [`${REGISTRY_URL}/r/mc-accordion.json`],
},
{
name: 'mc-collapsible-demo',
type: 'registry:example',
title: 'MicroClub Collapsible Demo',
description: 'Demo for MicroClub Collapsible',
files: [
{
path: 'examples/mc-collapsible-demo.tsx',
type: 'registry:example',
},
],
registryDependencies: [
`${REGISTRY_URL}/r/mc-collapsible.json`,
`${REGISTRY_URL}/r/mc-button.json`,
],
},
{
name: 'mc-separator-demo',
type: 'registry:example',
Expand Down
13 changes: 13 additions & 0 deletions packages/web/registry/registry-ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,19 @@ export const ui: Registry['items'] = [
],
dependencies: ['@base-ui/react', 'lucide-react'],
},
{
name: 'mc-collapsible',
type: 'registry:component',
title: 'MicroClub Collapsible',
description: 'A collapsible component for MicroClub UI',
files: [
{
path: 'ui/mc-collapsible.tsx',
type: 'registry:component',
},
],
dependencies: ['@base-ui/react'],
},
{
name: 'mc-separator',
type: 'registry:component',
Expand Down
17 changes: 17 additions & 0 deletions packages/web/registry/ui/mc-collapsible.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
'use client';

import { Collapsible as CollapsiblePrimitive } from '@base-ui/react/collapsible';

function McCollapsible({ ...props }: CollapsiblePrimitive.Root.Props) {
return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />;
}

function McCollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {
return <CollapsiblePrimitive.Trigger data-slot="collapsible-trigger" {...props} />;
}

function McCollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {
return <CollapsiblePrimitive.Panel data-slot="collapsible-content" {...props} />;
}

export { McCollapsible, McCollapsibleTrigger, McCollapsibleContent };
49 changes: 49 additions & 0 deletions packages/web/stories/McCollapsible.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import type { Meta, StoryObj } from '@storybook/nextjs';

import { McButton } from '@/registry/ui/mc-button';
import {
McCollapsible,
McCollapsibleContent,
McCollapsibleTrigger,
} from '@/registry/ui/mc-collapsible';

const meta: Meta<typeof McCollapsible> = {
title: 'Components/McCollapsible',
component: McCollapsible,
tags: ['autodocs'],
args: {
defaultOpen: false,
},
render: (args) => (
<McCollapsible {...args} className="w-full max-w-sm space-y-2">
<McCollapsibleTrigger
render={
<McButton variant="tertiary" size="sm">
Toggle collapse
</McButton>
}
/>
<McCollapsibleContent className="rounded-lg border border-border bg-card p-4 text-sm text-card-foreground">
This is the collapsible content.
</McCollapsibleContent>
</McCollapsible>
),
};

export default meta;

type Story = StoryObj<typeof McCollapsible>;

export const Playground: Story = {};

export const DefaultOpen: Story = {
args: {
defaultOpen: true,
},
};

export const Disabled: Story = {
args: {
disabled: true,
},
};
Loading