Skip to content

Commit 39019a0

Browse files
committed
✨ Add Svelte and React accordions
1 parent 15af312 commit 39019a0

18 files changed

+310
-15
lines changed

.vscode/settings.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"svelte.plugin.svelte.compilerWarnings": {
3+
"a11y-click-events-have-key-events": "ignore",
4+
"a11y-no-static-element-interactions": "ignore"
5+
}
6+
}

astro.config.mjs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { defineConfig } from 'astro/config'
22

33
import svelte from '@astrojs/svelte'
4+
import react from '@astrojs/react'
45

56
export default defineConfig({
67
outDir: 'build',
78
trailingSlash: 'never',
89
integrations: [
9-
svelte()
10+
svelte(),
11+
react()
1012
],
1113
build: {
1214
format: 'file'

package-lock.json

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

package.json

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
},
1111
"dependencies": {
1212
"@astrojs/check": "0.7.0",
13+
"@astrojs/react": "3.5.0",
1314
"@astrojs/svelte": "5.5.0",
1415
"astro": "4.10.2",
16+
"react": "18.3.1",
17+
"react-dom": "18.3.1",
1518
"sass": "1.77.5",
1619
"svelte": "4.2.18",
1720
"typescript": "5.4.5"
@@ -23,7 +26,12 @@
2326
},
2427
"files": [
2528
"dist/components",
26-
"src/env.d.ts",
29+
"src/astro.d.ts",
30+
"src/astro.js",
31+
"src/svelte.d.ts",
32+
"src/svelte.js",
33+
"src/react.d.ts",
34+
"src/react.js",
2735
"scss",
2836
"public"
2937
],
@@ -50,5 +58,4 @@
5058
"bugs": {
5159
"url": "https://github.com/Frontendland/webcoreui/issues"
5260
}
53-
5461
}

src/astro.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
declare module 'webcoreui/astro' {
2-
import type { Props as AccordionProps } from './components/Accordion/Accordion.astro'
2+
import type { AccordionProps } from './components/Accordion/accordion'
33

44
export function Accordion(_props: AccordionProps): any
55
}

src/components/Accordion/Accordion.astro

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
---
2-
export interface Props {
3-
items: {
4-
title: string
5-
content: string
6-
}[]
7-
}
2+
import type { AccordionProps } from './accordion'
3+
4+
interface Props extends AccordionProps {}
85
96
const {
107
items
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<script lang="ts">
2+
import type { AccordionProps } from './accordion'
3+
4+
export let items: AccordionProps['items']
5+
6+
let state = Array(items.length).fill(false)
7+
8+
const toggle = (index: number) => {
9+
state = state.map((_, i) => index === i
10+
? !state[i]
11+
: state[i]
12+
)
13+
}
14+
</script>
15+
16+
<ul>
17+
{#each items as item, index}
18+
<li>
19+
<div
20+
class="accordion-title"
21+
class:open={state[index]}
22+
on:click={() => toggle(index)}
23+
>
24+
{item.title}
25+
</div>
26+
<div class="accordion-wrapper">
27+
<div class="accordion-content">
28+
{@html item.content}
29+
</div>
30+
</div>
31+
</li>
32+
{/each}
33+
</ul>
34+
35+
<style lang="scss">
36+
@import './accordion.scss';
37+
</style>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React, { useState } from 'react'
2+
import type { AccordionProps } from './accordion'
3+
import './accordion.scss'
4+
5+
export const Accordion = ({ items }: AccordionProps) => {
6+
const [state, setState] = useState(Array(items.length).fill(false))
7+
8+
const toggle = (index: number) => {
9+
setState(state.map((_, i) => index === i
10+
? !state[i]
11+
: state[i]
12+
))
13+
}
14+
15+
return (
16+
<ul data-id="accordion">
17+
{items.map((item, index) => (
18+
<li key={index}>
19+
<div
20+
className={state[index] ? 'accordion-title open' : 'accordion-title'}
21+
onClick={() => toggle(index)}
22+
>
23+
{item.title}
24+
</div>
25+
<div className="accordion-wrapper">
26+
<div className="accordion-content">
27+
<div dangerouslySetInnerHTML={{ __html: item.content }} />
28+
</div>
29+
</div>
30+
</li>
31+
))}
32+
</ul>
33+
)
34+
}

src/components/Accordion/accordion.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export type AccordionProps = {
2+
items: {
3+
title: string
4+
content: string
5+
}[]
6+
}

src/components/Card/card.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
display: block;
88
border-bottom: 1px solid #252525;
99
font-size: 16px;
10-
font-weight: 400;
1110
}
1211

1312
.card-body {

src/env.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
/// <reference types="astro/client" />
1+
/// <reference types="astro/client" />

0 commit comments

Comments
 (0)