Skip to content

Commit 72f7ba0

Browse files
committed
feat: add new accordion particles
- Introduced multiple accordion particles: "accordion-with-icon", "accordion-multi-level", "accordion-table", and "accordion-tabs".
1 parent 2755a07 commit 72f7ba0

13 files changed

Lines changed: 656 additions & 0 deletions
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
3+
"name": "accordion-multi-level",
4+
"type": "registry:example",
5+
"description": "Accordion with multiple levels",
6+
"registryDependencies": [
7+
"https://coss.com/ui/r/accordion.json"
8+
],
9+
"files": [
10+
{
11+
"path": "registry/default/examples/accordion-multi-level.tsx",
12+
"content": "import { ChevronDownIcon } from \"lucide-react\"\n\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/registry/default/ui/collapsible\"\n\nconst items = [\n {\n id: \"1\",\n title: \"What makes coss.com ui different?\",\n collapsibles: [\n {\n title: \"What about performance?\",\n content:\n \"We optimize every component for maximum performance and minimal bundle size.\",\n },\n {\n title: \"How is the documentation?\",\n content:\n \"Our documentation is comprehensive and includes live examples for every component.\",\n },\n ],\n },\n {\n id: \"2\",\n title: \"How can I customize the components?\",\n collapsibles: [\n {\n title: \"Can I use custom themes?\",\n content:\n \"Yes, our theming system is fully customizable and supports both light and dark modes.\",\n },\n {\n title: \"What about Tailwind support?\",\n content:\n \"We have first-class support for Tailwind CSS with custom utility classes.\",\n },\n ],\n },\n {\n id: \"3\",\n title: \"Is coss.com ui optimized for performance?\",\n collapsibles: [\n {\n title: \"What's the bundle size impact?\",\n content:\n \"Our components are tree-shakeable and typically add minimal overhead to your bundle.\",\n open: true,\n },\n {\n title: \"How is code splitting handled?\",\n content:\n \"We support automatic code splitting for optimal loading performance.\",\n },\n ],\n },\n {\n id: \"4\",\n title: \"How accessible are the components?\",\n collapsibles: [\n {\n title: \"Which screen readers are supported?\",\n content:\n \"We test with NVDA, VoiceOver, and JAWS to ensure broad compatibility.\",\n },\n {\n title: \"What about keyboard navigation?\",\n content:\n \"Full keyboard navigation support is implemented following WAI-ARIA best practices.\",\n },\n ],\n },\n]\n\nexport default function Component() {\n return (\n <div className=\"space-y-4\">\n <h2 className=\"text-xl font-bold\">Multi-level</h2>\n <Accordion multiple className=\"w-full -space-y-px\" defaultValue={[\"3\"]}>\n {items.map((item) => (\n <AccordionItem\n value={item.id}\n key={item.id}\n className=\"relative border bg-background outline-none first:rounded-t-md last:rounded-b-md last:border-b has-focus-visible:z-10 has-focus-visible:border-ring has-focus-visible:ring-[3px] has-focus-visible:ring-ring/50\"\n >\n <AccordionTrigger className=\"rounded-md px-4 py-3 text-[15px] leading-6 outline-none hover:no-underline focus-visible:ring-0\">\n {item.title}\n </AccordionTrigger>\n <AccordionContent className=\"p-0\">\n {item.collapsibles.map((collapsible, index) => (\n <CollapsibleDemo\n key={index}\n title={collapsible.title}\n content={collapsible.content}\n open={collapsible.open}\n />\n ))}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </div>\n )\n}\n\nfunction CollapsibleDemo({\n title,\n content,\n open,\n}: {\n title: string\n content: string\n open?: boolean\n}) {\n return (\n <Collapsible className=\"border-t bg-accent px-4 py-3\" defaultOpen={open}>\n <CollapsibleTrigger className=\"flex gap-2 text-[15px] leading-6 font-semibold [&[data-panel-open]>svg]:rotate-180\">\n <ChevronDownIcon\n size={16}\n className=\"mt-1 shrink-0 opacity-60 transition-transform duration-200\"\n aria-hidden=\"true\"\n />\n {title}\n </CollapsibleTrigger>\n <CollapsibleContent className=\"data-[panel-closed]:animate-collapsible-up data-[panel-open]:animate-collapsible-down mt-1 overflow-hidden ps-6 text-sm text-muted-foreground transition-all\">\n {content}\n </CollapsibleContent>\n </Collapsible>\n )\n}\n",
13+
"type": "registry:example"
14+
}
15+
],
16+
"categories": [
17+
"accordion"
18+
]
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
3+
"name": "accordion-table",
4+
"type": "registry:example",
5+
"description": "Accordion with table like layout",
6+
"registryDependencies": [
7+
"https://coss.com/ui/r/accordion.json"
8+
],
9+
"files": [
10+
{
11+
"path": "registry/default/examples/accordion-table.tsx",
12+
"content": "import {\n Accordion,\n AccordionItem,\n AccordionPanel,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\n\nexport default function AccordionTableDemo() {\n return (\n <Accordion className=\"w-full\" multiple={true}>\n <AccordionItem\n value=\"item-1\"\n className=\"border border-b-0 first:rounded-t-lg last:rounded-b-lg last:border-b\"\n >\n <AccordionTrigger className=\"border-none px-4 py-3\">\n What is Base UI?\n </AccordionTrigger>\n <AccordionPanel className=\"px-4\">\n Base UI is a library of high-quality unstyled React components for\n design systems and web apps.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem\n value=\"item-2\"\n className=\"border border-b-0 first:rounded-t-lg last:rounded-b-lg last:border-b\"\n >\n <AccordionTrigger className=\"border-none px-4 py-3\">\n How do I get started?\n </AccordionTrigger>\n <AccordionPanel className=\"px-4\">\n Head to the \"Quick start\" guide in the docs. If you've used unstyled\n libraries before, you'll feel at home.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem\n value=\"item-3\"\n className=\"border border-b-0 first:rounded-t-lg last:rounded-b-lg last:border-b\"\n >\n <AccordionTrigger className=\"border-none px-4 py-3\">\n Can I use it for my project?\n </AccordionTrigger>\n <AccordionPanel className=\"px-4\">\n Of course! Base UI is free and open source.\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n )\n}\n",
13+
"type": "registry:example"
14+
}
15+
],
16+
"categories": [
17+
"accordion"
18+
]
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
3+
"name": "accordion-tabs",
4+
"type": "registry:example",
5+
"description": "Accordion with tabs like layout",
6+
"registryDependencies": [
7+
"https://coss.com/ui/r/accordion.json"
8+
],
9+
"files": [
10+
{
11+
"path": "registry/default/examples/accordion-tabs.tsx",
12+
"content": "import {\n Accordion,\n AccordionItem,\n AccordionPanel,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\n\nexport default function AccordionTabsDemo() {\n return (\n <Accordion className=\"w-full space-y-2\" multiple={true}>\n <AccordionItem value=\"item-1\" className=\"rounded-lg border last:border-b\">\n <AccordionTrigger className=\"border-none px-4 py-3\">\n What is Base UI?\n </AccordionTrigger>\n <AccordionPanel className=\"px-4\">\n Base UI is a library of high-quality unstyled React components for\n design systems and web apps.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-2\" className=\"rounded-lg border last:border-b\">\n <AccordionTrigger className=\"border-none px-4 py-3\">\n How do I get started?\n </AccordionTrigger>\n <AccordionPanel className=\"px-4\">\n Head to the \"Quick start\" guide in the docs. If you've used unstyled\n libraries before, you'll feel at home.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-3\" className=\"rounded-lg border last:border-b\">\n <AccordionTrigger className=\"border-none px-4 py-3\">\n Can I use it for my project?\n </AccordionTrigger>\n <AccordionPanel className=\"px-4\">\n Of course! Base UI is free and open source.\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n )\n}\n",
13+
"type": "registry:example"
14+
}
15+
],
16+
"categories": [
17+
"accordion"
18+
]
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
3+
"name": "accordion-with-icon",
4+
"type": "registry:example",
5+
"description": "Accordion with icon",
6+
"registryDependencies": [
7+
"https://coss.com/ui/r/accordion.json"
8+
],
9+
"files": [
10+
{
11+
"path": "registry/default/examples/accordion-with-icon.tsx",
12+
"content": "import { AtSignIcon, CommandIcon, EclipseIcon, ZapIcon } from \"lucide-react\"\n\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\n\nconst items = [\n {\n id: \"1\",\n icon: CommandIcon,\n title: \"What makes coss.com ui different?\",\n content:\n \"coss.com ui focuses on developer experience and performance. Built with TypeScript, it offers excellent type safety, follows accessibility standards, and provides comprehensive documentation with regular updates.\",\n },\n {\n id: \"2\",\n icon: EclipseIcon,\n title: \"How can I customize the components?\",\n content:\n \"Use our CSS variables for global styling, or className and style props for component-specific changes. We support CSS modules, Tailwind, and dark mode out of the box.\",\n },\n {\n id: \"3\",\n icon: ZapIcon,\n title: \"Is coss.com ui optimized for performance?\",\n content:\n \"Yes, with tree-shaking, code splitting, and minimal runtime overhead. Most components are under 5KB gzipped.\",\n },\n {\n id: \"4\",\n icon: AtSignIcon,\n title: \"How accessible are the components?\",\n content:\n \"All components follow WAI-ARIA standards, featuring proper ARIA attributes, keyboard navigation, and screen reader support. Regular testing ensures compatibility with NVDA, VoiceOver, and JAWS.\",\n },\n]\n\nexport default function Component() {\n return (\n <Accordion multiple={false} className=\"w-full\" defaultValue={[\"3\"]}>\n {items.map((item) => (\n <AccordionItem value={item.id} key={item.id} className=\"py-2\">\n <AccordionTrigger className=\"py-2 text-[15px] leading-6 hover:no-underline\">\n <span className=\"flex items-center gap-3\">\n <item.icon\n size={16}\n className=\"shrink-0 opacity-60\"\n aria-hidden=\"true\"\n />\n <span>{item.title}</span>\n </span>\n </AccordionTrigger>\n <AccordionContent className=\"ps-7 pb-2 text-muted-foreground\">\n {item.content}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n )\n}\n",
13+
"type": "registry:example"
14+
}
15+
],
16+
"categories": [
17+
"accordion"
18+
]
19+
}

apps/ui/public/r/registry.json

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,74 @@
693693
"accordion"
694694
]
695695
},
696+
{
697+
"name": "accordion-with-icon",
698+
"description": "Accordion with icon",
699+
"type": "registry:example",
700+
"registryDependencies": [
701+
"https://coss.com/ui/r/accordion.json"
702+
],
703+
"files": [
704+
{
705+
"path": "registry/default/examples/accordion-with-icon.tsx",
706+
"type": "registry:example"
707+
}
708+
],
709+
"categories": [
710+
"accordion"
711+
]
712+
},
713+
{
714+
"name": "accordion-multi-level",
715+
"description": "Accordion with multiple levels",
716+
"type": "registry:example",
717+
"registryDependencies": [
718+
"https://coss.com/ui/r/accordion.json"
719+
],
720+
"files": [
721+
{
722+
"path": "registry/default/examples/accordion-multi-level.tsx",
723+
"type": "registry:example"
724+
}
725+
],
726+
"categories": [
727+
"accordion"
728+
]
729+
},
730+
{
731+
"name": "accordion-table",
732+
"description": "Accordion with table like layout",
733+
"type": "registry:example",
734+
"registryDependencies": [
735+
"https://coss.com/ui/r/accordion.json"
736+
],
737+
"files": [
738+
{
739+
"path": "registry/default/examples/accordion-table.tsx",
740+
"type": "registry:example"
741+
}
742+
],
743+
"categories": [
744+
"accordion"
745+
]
746+
},
747+
{
748+
"name": "accordion-tabs",
749+
"description": "Accordion with tabs like layout",
750+
"type": "registry:example",
751+
"registryDependencies": [
752+
"https://coss.com/ui/r/accordion.json"
753+
],
754+
"files": [
755+
{
756+
"path": "registry/default/examples/accordion-tabs.tsx",
757+
"type": "registry:example"
758+
}
759+
],
760+
"categories": [
761+
"accordion"
762+
]
763+
},
696764
{
697765
"name": "accordion-single",
698766
"description": "Accordion with one panel open",

apps/ui/registry.json

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,74 @@
693693
"accordion"
694694
]
695695
},
696+
{
697+
"name": "accordion-with-icon",
698+
"description": "Accordion with icon",
699+
"type": "registry:example",
700+
"registryDependencies": [
701+
"https://coss.com/ui/r/accordion.json"
702+
],
703+
"files": [
704+
{
705+
"path": "registry/default/examples/accordion-with-icon.tsx",
706+
"type": "registry:example"
707+
}
708+
],
709+
"categories": [
710+
"accordion"
711+
]
712+
},
713+
{
714+
"name": "accordion-multi-level",
715+
"description": "Accordion with multiple levels",
716+
"type": "registry:example",
717+
"registryDependencies": [
718+
"https://coss.com/ui/r/accordion.json"
719+
],
720+
"files": [
721+
{
722+
"path": "registry/default/examples/accordion-multi-level.tsx",
723+
"type": "registry:example"
724+
}
725+
],
726+
"categories": [
727+
"accordion"
728+
]
729+
},
730+
{
731+
"name": "accordion-table",
732+
"description": "Accordion with table like layout",
733+
"type": "registry:example",
734+
"registryDependencies": [
735+
"https://coss.com/ui/r/accordion.json"
736+
],
737+
"files": [
738+
{
739+
"path": "registry/default/examples/accordion-table.tsx",
740+
"type": "registry:example"
741+
}
742+
],
743+
"categories": [
744+
"accordion"
745+
]
746+
},
747+
{
748+
"name": "accordion-tabs",
749+
"description": "Accordion with tabs like layout",
750+
"type": "registry:example",
751+
"registryDependencies": [
752+
"https://coss.com/ui/r/accordion.json"
753+
],
754+
"files": [
755+
{
756+
"path": "registry/default/examples/accordion-tabs.tsx",
757+
"type": "registry:example"
758+
}
759+
],
760+
"categories": [
761+
"accordion"
762+
]
763+
},
696764
{
697765
"name": "accordion-single",
698766
"description": "Accordion with one panel open",

apps/ui/registry/__index__.tsx

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,78 @@ export const Index: Record<string, any> = {
834834
categories: ["accordion"],
835835
meta: undefined,
836836
},
837+
"accordion-with-icon": {
838+
name: "accordion-with-icon",
839+
description: "Accordion with icon",
840+
type: "registry:example",
841+
registryDependencies: ["https://coss.com/ui/r/accordion.json"],
842+
files: [{
843+
path: "registry/default/examples/accordion-with-icon.tsx",
844+
type: "registry:example",
845+
target: ""
846+
}],
847+
component: React.lazy(async () => {
848+
const mod = await import("@/registry/default/examples/accordion-with-icon.tsx")
849+
const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') || item.name
850+
return { default: mod.default || mod[exportName] }
851+
}),
852+
categories: ["accordion"],
853+
meta: undefined,
854+
},
855+
"accordion-multi-level": {
856+
name: "accordion-multi-level",
857+
description: "Accordion with multiple levels",
858+
type: "registry:example",
859+
registryDependencies: ["https://coss.com/ui/r/accordion.json"],
860+
files: [{
861+
path: "registry/default/examples/accordion-multi-level.tsx",
862+
type: "registry:example",
863+
target: ""
864+
}],
865+
component: React.lazy(async () => {
866+
const mod = await import("@/registry/default/examples/accordion-multi-level.tsx")
867+
const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') || item.name
868+
return { default: mod.default || mod[exportName] }
869+
}),
870+
categories: ["accordion"],
871+
meta: undefined,
872+
},
873+
"accordion-table": {
874+
name: "accordion-table",
875+
description: "Accordion with table like layout",
876+
type: "registry:example",
877+
registryDependencies: ["https://coss.com/ui/r/accordion.json"],
878+
files: [{
879+
path: "registry/default/examples/accordion-table.tsx",
880+
type: "registry:example",
881+
target: ""
882+
}],
883+
component: React.lazy(async () => {
884+
const mod = await import("@/registry/default/examples/accordion-table.tsx")
885+
const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') || item.name
886+
return { default: mod.default || mod[exportName] }
887+
}),
888+
categories: ["accordion"],
889+
meta: undefined,
890+
},
891+
"accordion-tabs": {
892+
name: "accordion-tabs",
893+
description: "Accordion with tabs like layout",
894+
type: "registry:example",
895+
registryDependencies: ["https://coss.com/ui/r/accordion.json"],
896+
files: [{
897+
path: "registry/default/examples/accordion-tabs.tsx",
898+
type: "registry:example",
899+
target: ""
900+
}],
901+
component: React.lazy(async () => {
902+
const mod = await import("@/registry/default/examples/accordion-tabs.tsx")
903+
const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') || item.name
904+
return { default: mod.default || mod[exportName] }
905+
}),
906+
categories: ["accordion"],
907+
meta: undefined,
908+
},
837909
"accordion-single": {
838910
name: "accordion-single",
839911
description: "Accordion with one panel open",

0 commit comments

Comments
 (0)