collapsible.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { Collapsible as Kobalte, CollapsibleRootProps } from "@kobalte/core/collapsible"
  2. import { ComponentProps, ParentProps, splitProps } from "solid-js"
  3. import { Icon } from "./icon"
  4. export interface CollapsibleProps extends ParentProps<CollapsibleRootProps> {
  5. class?: string
  6. classList?: ComponentProps<"div">["classList"]
  7. }
  8. function CollapsibleRoot(props: CollapsibleProps) {
  9. const [local, others] = splitProps(props, ["class", "classList"])
  10. return (
  11. <Kobalte
  12. data-component="collapsible"
  13. classList={{
  14. ...(local.classList ?? {}),
  15. [local.class ?? ""]: !!local.class,
  16. }}
  17. {...others}
  18. />
  19. )
  20. }
  21. function CollapsibleTrigger(props: ComponentProps<typeof Kobalte.Trigger>) {
  22. return <Kobalte.Trigger data-slot="collapsible-trigger" {...props} />
  23. }
  24. function CollapsibleContent(props: ComponentProps<typeof Kobalte.Content>) {
  25. return <Kobalte.Content data-slot="collapsible-content" {...props} />
  26. }
  27. function CollapsibleArrow(props?: ComponentProps<"div">) {
  28. return (
  29. <div data-slot="collapsible-arrow" {...(props || {})}>
  30. <Icon data-slot="collapsible-arrow-icon" name="chevron-grabber-vertical" size="small" />
  31. </div>
  32. )
  33. }
  34. export const Collapsible = Object.assign(CollapsibleRoot, {
  35. Arrow: CollapsibleArrow,
  36. Trigger: CollapsibleTrigger,
  37. Content: CollapsibleContent,
  38. })