summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/collapsible.stories.tsx
blob: 67883b229974089325d18ef14371cfa7b99f2844 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// @ts-nocheck
import * as mod from "./collapsible"

const docs = `### Overview
Toggleable content region with optional arrow indicator.

Compose \`Collapsible.Trigger\`, \`Collapsible.Content\`, and \`Collapsible.Arrow\`.

### API
- Root accepts Kobalte Collapsible props (\`open\`, \`defaultOpen\`, \`onOpenChange\`).
- \`variant\` controls styling ("normal" | "ghost").

### Variants and states
- Normal and ghost variants.
- Open/closed states.

### Behavior
- Trigger toggles the content visibility.

### Accessibility
- TODO: confirm ARIA attributes provided by Kobalte.

### Theming/tokens
- Uses \`data-component="collapsible"\` and slots for trigger/content/arrow.

`

export default {
  title: "UI/Collapsible",
  id: "components-collapsible",
  component: mod.Collapsible,
  tags: ["autodocs"],
  parameters: {
    docs: {
      description: {
        component: docs,
      },
    },
  },
  argTypes: {
    variant: {
      control: "select",
      options: ["normal", "ghost"],
    },
  },
}

export const Basic = {
  args: {
    variant: "normal",
    defaultOpen: true,
  },
  render: (props) => (
    <mod.Collapsible {...props}>
      <mod.Collapsible.Trigger data-slot="collapsible-trigger">
        <div style={{ display: "flex", "align-items": "center", gap: "8px" }}>
          <span>Details</span>
          <mod.Collapsible.Arrow />
        </div>
      </mod.Collapsible.Trigger>
      <mod.Collapsible.Content data-slot="collapsible-content">
        <div style={{ color: "var(--text-weak)", "padding-top": "8px" }}>Optional details sit here.</div>
      </mod.Collapsible.Content>
    </mod.Collapsible>
  ),
}

export const Ghost = {
  args: {
    variant: "ghost",
    defaultOpen: false,
  },
  render: (props) => (
    <mod.Collapsible {...props}>
      <mod.Collapsible.Trigger data-slot="collapsible-trigger">
        <div style={{ display: "flex", "align-items": "center", gap: "8px" }}>
          <span>Ghost trigger</span>
          <mod.Collapsible.Arrow />
        </div>
      </mod.Collapsible.Trigger>
      <mod.Collapsible.Content data-slot="collapsible-content">
        <div style={{ color: "var(--text-weak)", "padding-top": "8px" }}>Ghost content.</div>
      </mod.Collapsible.Content>
    </mod.Collapsible>
  ),
}