Skip to content

Commit a26a2eb

Browse files
authored
docs: add component structure docs (#2282)
1 parent 8b12ea0 commit a26a2eb

File tree

3 files changed

+130
-4
lines changed

3 files changed

+130
-4
lines changed

apps/docs/src/app/page.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
AlertBadge,
33
ColumnLayout,
4+
Flex,
45
Heading,
56
Icon,
67
Image,
@@ -21,22 +22,22 @@ import styles from "./layout.module.scss";
2122

2223
const Home: FC = () => {
2324
return (
24-
<ColumnLayout l={[1]} m={[1]}>
25+
<Flex direction="column" gap="m">
2526
<LayoutCard className={styles.homeTopLayoutCard}>
2627
<Image
2728
className={styles.homeImage}
2829
src={homeImage.src}
2930
alt="Flow Design System"
3031
/>
31-
<ColumnLayout l={[1]} className={styles.homeTopContent}>
32+
<Section className={styles.homeTopContent}>
3233
<Heading level={1}>
3334
Flow Design System <AlertBadge>beta</AlertBadge>
3435
</Heading>
3536
<Text>
3637
Entwickle performante und nutzerzentrierte Benutzeroberflächen, die
3738
die Markenidentität von mittwald konsistent widerspiegeln.
3839
</Text>
39-
</ColumnLayout>
40+
</Section>
4041
</LayoutCard>
4142
<LayoutCard>
4243
<Section>
@@ -107,7 +108,7 @@ const Home: FC = () => {
107108
</Section>
108109
</LayoutCard>
109110
</ColumnLayout>
110-
</ColumnLayout>
111+
</Flex>
111112
);
112113
};
113114

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
title: Komponenten
3+
---
4+
5+
Flow unterstützt das Verschachteln von Komponenten, um deine UI aufzubauen. Dies
6+
ist eine kurze Dokumentation darüber, warum wir uns dafür entschieden haben.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
Die folgenden Codebeispiele werden in der Erklärung referenziert.
2+
3+
```
4+
// Flow
5+
<Button aria-label="Notifications: 7">
6+
<IconNotification />
7+
<CounterBadge count={7} />
8+
</Button>
9+
```
10+
11+
vs.
12+
13+
```
14+
// Not Flow
15+
<IconButton label="Benachrichtigung" icon="Notification" counterBadge={7} />
16+
```
17+
18+
---
19+
20+
# Logik
21+
22+
Component Libraries basieren in der Regel darauf, Komponenten zu verschachteln,
23+
um größere Komponenten zu bauen. Das ist ein weit verbreitetes und effektives
24+
Pattern, das außerdem leicht verständlich ist. Genau deshalb unterstützen wir
25+
dieses Modell auch in Flow. Wenn man zum Beispiel ein CounterBadge innerhalb
26+
eines Buttons platziert, wird dieses automatisch oben rechts positioniert – so,
27+
wie man es erwarten würde.
28+
29+
---
30+
31+
# Lesbarkeit
32+
33+
Wir haben unsere Frontend-Entwickler gefragt, was am Ende besser lesbar ist:
34+
35+
1. Unterkomponenten über Props zu übergeben, wie das Icon im Beispiel
36+
2. Das Icon als Child in die Komponente zu legen.
37+
38+
Wir haben uns für Variante 2 entschieden, da sie besonders bei mehreren
39+
Unterkomponenten besser lesbar ist.
40+
41+
---
42+
43+
# Wiederverwendbarkeit
44+
45+
Entwickler bauen häufig eigene Komponenten, um sie wiederzuverwenden oder um die
46+
Implementierung aufzuteilen. Wenn es zum Beispiel bereits eine
47+
`UnreadNotificationsCounter`-Komponente gibt, die den Zähler aus der API lädt
48+
und in einem CounterBadge darstellt, kann diese einfach als Child im Button
49+
verwendet werden.
50+
51+
```
52+
<Button>
53+
<IconNotification />
54+
<UnreadNotificationsCounter />
55+
</Button>
56+
```
57+
58+
---
59+
60+
# Suspense- / ErrorBoundaries
61+
62+
Nur mit dem „Components-Ansatz“ ist es möglich, Child-Komponenten in Loading-
63+
oder ErrorBoundaries zu kapseln.
64+
65+
```
66+
<Button>
67+
<IconNotification />
68+
<Suspense>
69+
<UnreadNotificationsCounter />
70+
</Suspense>
71+
</Button>
72+
```
73+
74+
---
75+
76+
# Aufgeblähtes Props-Interface
77+
78+
Wenn Komponenten anfangen, Features anderer Komponenten nativ zu unterstützen,
79+
wird ihr Props-Interface schnell aufgebläht. Beim Beispiel `counterBadge={7}`
80+
könnte man denken: „Hey, das ist doch nur ein Prop mehr und leicht
81+
verständlich!“ Aber was ist, wenn CounterBadge mehr Eigenschaften als nur count
82+
unterstützt? Jede unterstützte Eigenschaft müsste dann als
83+
`counter[CounterProp]` im Button (und möglicherweise weiteren
84+
Parent-Komponenten) vorhanden sein.
85+
86+
Aufgeblähte Gesamtbibliothek vs. All-Mighty-Components
87+
88+
Wenn Flow für jeden Anwendungsfall spezielle Komponenten anbieten würde, müsste
89+
es z. B. einen `IconButton`, einen `CounterBadgeButton` und streng genommen
90+
sogar einen `IconCounterBadgeButton` geben. Das würde schnell zu sehr vielen
91+
Komponenten führen.
92+
93+
Und was wäre, wenn man stattdessen alles direkt im Button unterstützt? Das führt
94+
meist zu sehr großen „All-Mighty-Components“ ohne klaren Scope und mit
95+
überladener Implementierung.
96+
97+
---
98+
99+
# Children in Unterkomponenten
100+
101+
Nur mit dem „Components-Ansatz“ ist es möglich, Children auch in
102+
Unterkomponenten zu verwenden.
103+
104+
```
105+
<Button aria-label="Notifications: 7">
106+
<Icon>
107+
<IconStar />
108+
</Icon>
109+
<CounterBadge count={7} />
110+
</Button>
111+
```
112+
113+
---
114+
115+
# Baue deine eigenen Komponenten
116+
117+
Wenn du bestimmte Kombinationen von Komponenten häufig in deiner UI verwendest,
118+
kannst du dir einfach eigene Komponenten mit genau den Props bauen, die du
119+
benötigst.

0 commit comments

Comments
 (0)