Skip to content

Commit 083832b

Browse files
committed
feat: added Accordion W/ plus-minus
1 parent 5568fa8 commit 083832b

10 files changed

Lines changed: 117 additions & 27 deletions

File tree

apps/origin-ui/src/app/components/demo-component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { ComponentDetailsComponent } from './component-details.component';
77
selector: 'app-demo-component',
88
imports: [ComponentDetailsComponent],
99
template: `
10-
<ng-container #container></ng-container>
10+
<ng-container #container />
1111
12-
<div class="absolute right-2 top-2 flex gap-2">
12+
<div class="absolute top-2 right-2 flex gap-2">
1313
<app-component-details [sourceCode]="sourceCode()" [name]="componentName()!" />
1414
</div>
1515
`

apps/origin-ui/src/app/config/components.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ export const categories: ComponentCategory[] = [
99
slug: 'accordion',
1010
name: 'Accordion',
1111
components: [
12-
{ name: 'accordion-01' }
12+
{ name: 'accordion-01' },
13+
{ name: 'accordion-02' }
1314
]
1415
},
1516
{

apps/origin-ui/src/registry.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,21 @@
467467
"colSpan": 2
468468
}
469469
},
470+
{
471+
"name": "accordion-02",
472+
"type": "registry:component",
473+
"registryDependencies": ["https://originui-ng.com/r/accordion.json"],
474+
"files": [
475+
{
476+
"path": "registry/default/components/accordions/accordion-02.ts",
477+
"type": "registry:component"
478+
}
479+
],
480+
"meta": {
481+
"tags": ["accordion", "radix"],
482+
"colSpan": 2
483+
}
484+
},
470485
{
471486
"name": "avatar-01",
472487
"type": "registry:component",

apps/origin-ui/src/registry/default/components/accordions/accordion-01.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Component } from '@angular/core';
22
import {
33
OriAccordion,
4+
OriAccordionContent,
45
OriAccordionItem,
5-
OriAccordionTrigger,
6-
UbAccordionContent
6+
OriAccordionTrigger
77
} from '~/registry/default/ui/accordion';
88

99
@Component({
@@ -12,13 +12,13 @@ import {
1212
OriAccordion,
1313
OriAccordionItem,
1414
OriAccordionTrigger,
15-
UbAccordionContent
15+
OriAccordionContent
1616
],
1717
template: `
1818
<div class="space-y-4">
1919
<h2 class="text-xl font-bold">W/ chevron</h2>
20-
<div class="w-full" oriAccordion orientation="vertical">
21-
@for (item of items; track $index) {
20+
<div class="w-full" [defaultValue]="'1'" oriAccordion>
21+
@for (item of items; track item) {
2222
<div class="py-2" [value]="item.id" oriAccordionItem>
2323
<ori-accordion-trigger>{{ item.title }}</ori-accordion-trigger>
2424
<div oriAccordionContent>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { Component } from '@angular/core';
2+
import { RdxAccordionHeaderDirective, RdxAccordionTriggerDirective } from '@radix-ng/primitives/accordion';
3+
import { LucideAngularModule, Plus } from 'lucide-angular';
4+
import { OriAccordion, OriAccordionContent, OriAccordionItem } from '~/registry/default/ui/accordion';
5+
6+
@Component({
7+
selector: 'accordion-02',
8+
imports: [
9+
OriAccordion,
10+
OriAccordionItem,
11+
OriAccordionContent,
12+
RdxAccordionHeaderDirective,
13+
RdxAccordionTriggerDirective,
14+
LucideAngularModule
15+
],
16+
template: `
17+
<div class="space-y-4">
18+
<h2 class="text-xl font-bold">W/ plus-minus</h2>
19+
<div class="w-full" type="single" oriAccordion value="3">
20+
@for (item of items; track $index) {
21+
<div class="py-2" [value]="item.id" oriAccordionItem>
22+
<h3 class="group flex" rdxAccordionHeader>
23+
<button
24+
class="focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-semibold transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 group-data-[state=open]:[&>*>svg]:rotate-180"
25+
rdxAccordionTrigger
26+
type="button"
27+
>
28+
{{ item.title }}
29+
<lucide-icon
30+
class="pointer-events-none shrink-0 opacity-60 transition-transform duration-200"
31+
[img]="Plus"
32+
size="16"
33+
aria-hidden="true"
34+
/>
35+
</button>
36+
</h3>
37+
<div class="text-muted-foreground pb-2" oriAccordionContent>
38+
{{ item.content }}
39+
</div>
40+
</div>
41+
}
42+
</div>
43+
</div>
44+
`
45+
})
46+
export default class Accordion02Component {
47+
readonly items = [
48+
{
49+
id: '1',
50+
title: 'What makes Origin UI different?',
51+
content:
52+
'Origin 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.'
53+
},
54+
{
55+
id: '2',
56+
title: 'How can I customize the components?',
57+
content:
58+
'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.'
59+
},
60+
{
61+
id: '3',
62+
title: 'Is Origin UI optimized for performance?',
63+
content:
64+
'Yes, with tree-shaking, code splitting, and minimal runtime overhead. Most components are under 5KB gzipped.'
65+
},
66+
{
67+
id: '4',
68+
title: 'How accessible are the components?',
69+
content:
70+
'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.'
71+
}
72+
];
73+
protected readonly Plus = Plus;
74+
}

apps/origin-ui/src/registry/default/ui/accordion.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ export class OriAccordionItem {
4545
selector: '[oriAccordionTrigger], ori-accordion-trigger',
4646
imports: [RdxAccordionHeaderDirective, LucideAngularModule, RdxAccordionTriggerDirective],
4747
template: `
48-
<h3 class="group flex" rdxAccordionHeader>
48+
<h3 class="flex" rdxAccordionHeader>
4949
<button [class]="computedClass()" rdxAccordionTrigger>
50-
<ng-content></ng-content>
50+
<ng-content />
5151
<lucide-icon
5252
class="pointer-events-none shrink-0 opacity-60 transition-transform duration-200"
5353
[img]="ChevronDown"
@@ -63,8 +63,7 @@ export class OriAccordionTrigger {
6363

6464
readonly computedClass = computed(() => {
6565
return cn(
66-
//'flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline group-data-[state=open]:[&>*>svg]:rotate-180',
67-
'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-semibold transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 group-data-[state=open]:[&>*>svg]:rotate-180',
66+
'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-semibold transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180',
6867
this.class()
6968
);
7069
});
@@ -75,15 +74,16 @@ export class OriAccordionTrigger {
7574
selector: '[oriAccordionContent], ori-accordion-content',
7675
hostDirectives: [RdxAccordionContentDirective],
7776
host: {
78-
class: 'overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down'
77+
'[class]':
78+
'"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"'
7979
},
8080
template: `
8181
<div [class]="computedClass()">
8282
<ng-content />
8383
</div>
8484
`
8585
})
86-
export class UbAccordionContent {
86+
export class OriAccordionContent {
8787
readonly class = input<ClassValue>();
8888

8989
readonly computedClass = computed(() => {

nx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
},
2222
"targetDefaults": {
2323
"@angular-devkit/build-angular:application": {
24-
"cache": true,
24+
"cache": false,
2525
"dependsOn": [
2626
"^build"
2727
],

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"@fontsource-variable/inter": "^5.2.5",
3737
"@fontsource-variable/outfit": "^5.2.5",
3838
"@fontsource/jetbrains-mono": "^5.2.5",
39-
"@radix-ng/primitives": "0.38.0",
39+
"@radix-ng/primitives": "0.39.1",
4040
"@internationalized/date": "^3.8.0",
4141
"@internationalized/number": "^3.6.1",
4242
"@tanstack/angular-table": "^8.21.2",

packages/components/accordion/src/accordion.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ export class OriAccordionItem {
4545
selector: '[oriAccordionTrigger], ori-accordion-trigger',
4646
imports: [RdxAccordionHeaderDirective, LucideAngularModule, RdxAccordionTriggerDirective],
4747
template: `
48-
<h3 class="group flex" rdxAccordionHeader>
48+
<h3 class="flex" rdxAccordionHeader>
4949
<button [class]="computedClass()" rdxAccordionTrigger>
50-
<ng-content></ng-content>
50+
<ng-content />
5151
<lucide-icon
5252
class="pointer-events-none shrink-0 opacity-60 transition-transform duration-200"
5353
[img]="ChevronDown"
@@ -63,8 +63,7 @@ export class OriAccordionTrigger {
6363

6464
readonly computedClass = computed(() => {
6565
return cn(
66-
//'flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline group-data-[state=open]:[&>*>svg]:rotate-180',
67-
'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-semibold transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 group-data-[state=open]:[&>*>svg]:rotate-180',
66+
'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-semibold transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180',
6867
this.class()
6968
);
7069
});
@@ -75,15 +74,16 @@ export class OriAccordionTrigger {
7574
selector: '[oriAccordionContent], ori-accordion-content',
7675
hostDirectives: [RdxAccordionContentDirective],
7776
host: {
78-
class: 'overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down'
77+
'[class]':
78+
'"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"'
7979
},
8080
template: `
8181
<div [class]="computedClass()">
8282
<ng-content />
8383
</div>
8484
`
8585
})
86-
export class UbAccordionContent {
86+
export class OriAccordionContent {
8787
readonly class = input<ClassValue>();
8888

8989
readonly computedClass = computed(() => {

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)