shelving 1.236.2 → 1.237.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/extract/IndexExtractor.js +9 -2
- package/extract/MergingExtractor.d.ts +3 -1
- package/extract/MergingExtractor.js +41 -3
- package/extract/TypescriptExtractor.d.ts +1 -0
- package/extract/TypescriptExtractor.js +12 -2
- package/package.json +1 -1
- package/ui/README.md +19 -274
- package/ui/app/App.d.ts +1 -0
- package/ui/app/App.js +1 -0
- package/ui/app/App.md +58 -0
- package/ui/app/App.tsx +1 -0
- package/ui/block/Card.d.ts +1 -0
- package/ui/block/Card.js +1 -0
- package/ui/block/Card.md +85 -0
- package/ui/block/Card.tsx +1 -0
- package/ui/block/Heading.d.ts +1 -0
- package/ui/block/Heading.js +1 -0
- package/ui/block/Heading.md +70 -0
- package/ui/block/Heading.tsx +1 -0
- package/ui/block/List.d.ts +1 -0
- package/ui/block/List.js +1 -0
- package/ui/block/List.md +51 -0
- package/ui/block/List.tsx +1 -0
- package/ui/block/Panel.d.ts +1 -0
- package/ui/block/Panel.js +1 -0
- package/ui/block/Panel.md +50 -0
- package/ui/block/Panel.tsx +1 -0
- package/ui/block/Paragraph.d.ts +1 -0
- package/ui/block/Paragraph.js +1 -0
- package/ui/block/Paragraph.md +48 -0
- package/ui/block/Paragraph.tsx +1 -0
- package/ui/block/Prose.d.ts +1 -0
- package/ui/block/Prose.js +1 -0
- package/ui/block/Prose.md +49 -0
- package/ui/block/Prose.tsx +1 -0
- package/ui/block/Section.d.ts +6 -0
- package/ui/block/Section.js +6 -0
- package/ui/block/Section.md +56 -0
- package/ui/block/Section.tsx +6 -0
- package/ui/block/Subheading.d.ts +1 -0
- package/ui/block/Subheading.js +1 -0
- package/ui/block/Subheading.md +58 -0
- package/ui/block/Subheading.tsx +1 -0
- package/ui/block/Table.d.ts +1 -0
- package/ui/block/Table.js +1 -0
- package/ui/block/Table.md +54 -0
- package/ui/block/Table.tsx +1 -0
- package/ui/block/Title.d.ts +1 -0
- package/ui/block/Title.js +1 -0
- package/ui/block/Title.md +57 -0
- package/ui/block/Title.tsx +1 -0
- package/ui/dialog/Dialog.d.ts +1 -0
- package/ui/dialog/Dialog.js +1 -0
- package/ui/dialog/Dialog.md +73 -0
- package/ui/dialog/Dialog.tsx +1 -0
- package/ui/dialog/Modal.d.ts +1 -0
- package/ui/dialog/Modal.js +1 -0
- package/ui/dialog/Modal.md +40 -0
- package/ui/dialog/Modal.tsx +1 -0
- package/ui/docs/DocumentationButtons.d.ts +2 -0
- package/ui/docs/DocumentationButtons.js +2 -0
- package/ui/docs/DocumentationButtons.md +38 -0
- package/ui/docs/DocumentationButtons.tsx +2 -0
- package/ui/docs/DocumentationCard.d.ts +1 -0
- package/ui/docs/DocumentationCard.js +1 -0
- package/ui/docs/DocumentationCard.md +35 -0
- package/ui/docs/DocumentationCard.tsx +1 -0
- package/ui/docs/DocumentationKind.d.ts +1 -1
- package/ui/docs/DocumentationKind.js +9 -4
- package/ui/docs/DocumentationKind.tsx +10 -5
- package/ui/docs/DocumentationPage.d.ts +1 -0
- package/ui/docs/DocumentationPage.js +2 -0
- package/ui/docs/DocumentationPage.md +46 -0
- package/ui/docs/DocumentationPage.tsx +2 -0
- package/ui/form/Button.d.ts +1 -0
- package/ui/form/Button.js +1 -0
- package/ui/form/Button.md +88 -0
- package/ui/form/Button.tsx +1 -0
- package/ui/form/Field.d.ts +6 -1
- package/ui/form/Field.js +6 -1
- package/ui/form/Field.md +59 -0
- package/ui/form/Field.tsx +6 -1
- package/ui/form/Form.d.ts +1 -0
- package/ui/form/Form.md +118 -0
- package/ui/form/Form.tsx +1 -0
- package/ui/form/FormStore.md +47 -0
- package/ui/form/SchemaInput.d.ts +1 -0
- package/ui/form/SchemaInput.md +64 -0
- package/ui/form/SchemaInput.tsx +1 -0
- package/ui/inline/Code.d.ts +1 -0
- package/ui/inline/Code.js +1 -0
- package/ui/inline/Code.md +58 -0
- package/ui/inline/Code.tsx +1 -0
- package/ui/inline/Link.d.ts +1 -0
- package/ui/inline/Link.js +1 -0
- package/ui/inline/Link.md +47 -0
- package/ui/inline/Link.tsx +1 -0
- package/ui/inline/Mark.d.ts +1 -0
- package/ui/inline/Mark.js +1 -0
- package/ui/inline/Mark.md +40 -0
- package/ui/inline/Mark.tsx +1 -0
- package/ui/inline/Strong.d.ts +1 -0
- package/ui/inline/Strong.js +1 -0
- package/ui/inline/Strong.md +34 -0
- package/ui/inline/Strong.tsx +1 -0
- package/ui/layout/CenteredLayout.d.ts +1 -0
- package/ui/layout/CenteredLayout.js +1 -0
- package/ui/layout/CenteredLayout.md +38 -0
- package/ui/layout/CenteredLayout.tsx +1 -0
- package/ui/layout/SidebarLayout.d.ts +1 -0
- package/ui/layout/SidebarLayout.js +1 -0
- package/ui/layout/SidebarLayout.md +65 -0
- package/ui/layout/SidebarLayout.tsx +1 -0
- package/ui/menu/Menu.d.ts +2 -0
- package/ui/menu/Menu.js +2 -0
- package/ui/menu/Menu.md +51 -0
- package/ui/menu/Menu.tsx +2 -0
- package/ui/menu/MenuItem.md +54 -0
- package/ui/misc/Catcher.d.ts +1 -0
- package/ui/misc/Catcher.js +1 -0
- package/ui/misc/Catcher.md +41 -0
- package/ui/misc/Catcher.tsx +1 -0
- package/ui/misc/Loading.d.ts +1 -0
- package/ui/misc/Loading.js +1 -0
- package/ui/misc/Loading.md +28 -0
- package/ui/misc/Loading.tsx +1 -0
- package/ui/misc/Mapper.md +40 -0
- package/ui/misc/Markup.d.ts +1 -0
- package/ui/misc/Markup.js +1 -0
- package/ui/misc/Markup.md +34 -0
- package/ui/misc/Markup.tsx +1 -0
- package/ui/misc/StatusIcon.d.ts +1 -0
- package/ui/misc/StatusIcon.js +1 -0
- package/ui/misc/StatusIcon.md +25 -0
- package/ui/misc/StatusIcon.tsx +1 -0
- package/ui/misc/Tag.d.ts +1 -0
- package/ui/misc/Tag.js +1 -0
- package/ui/misc/Tag.md +47 -0
- package/ui/misc/Tag.tsx +1 -0
- package/ui/notice/Notice.d.ts +1 -0
- package/ui/notice/Notice.js +1 -0
- package/ui/notice/Notice.md +53 -0
- package/ui/notice/Notice.tsx +1 -0
- package/ui/notice/Notices.d.ts +1 -0
- package/ui/notice/Notices.js +1 -0
- package/ui/notice/Notices.md +59 -0
- package/ui/notice/Notices.tsx +1 -0
- package/ui/page/HTML.d.ts +1 -0
- package/ui/page/HTML.js +1 -0
- package/ui/page/HTML.md +36 -0
- package/ui/page/HTML.tsx +1 -0
- package/ui/page/Head.d.ts +1 -0
- package/ui/page/Head.js +1 -0
- package/ui/page/Head.md +26 -0
- package/ui/page/Head.tsx +1 -0
- package/ui/page/Page.d.ts +1 -0
- package/ui/page/Page.js +1 -0
- package/ui/page/Page.md +42 -0
- package/ui/page/Page.tsx +1 -0
- package/ui/router/Navigation.d.ts +1 -0
- package/ui/router/Navigation.js +1 -0
- package/ui/router/Navigation.md +41 -0
- package/ui/router/Navigation.tsx +1 -0
- package/ui/router/NavigationStore.md +34 -0
- package/ui/router/Router.d.ts +1 -0
- package/ui/router/Router.js +1 -0
- package/ui/router/Router.md +143 -0
- package/ui/router/Router.tsx +1 -0
- package/ui/style/TINT_CLASS.md +55 -0
- package/ui/transition/CollapseTransition.d.ts +1 -0
- package/ui/transition/CollapseTransition.js +1 -0
- package/ui/transition/CollapseTransition.md +34 -0
- package/ui/transition/CollapseTransition.tsx +1 -0
- package/ui/transition/FadeTransition.d.ts +1 -0
- package/ui/transition/FadeTransition.js +1 -0
- package/ui/transition/FadeTransition.md +36 -0
- package/ui/transition/FadeTransition.tsx +1 -0
- package/ui/transition/HorizontalTransition.d.ts +1 -0
- package/ui/transition/HorizontalTransition.js +1 -0
- package/ui/transition/HorizontalTransition.md +44 -0
- package/ui/transition/HorizontalTransition.tsx +1 -0
- package/ui/transition/Transition.d.ts +1 -0
- package/ui/transition/Transition.js +1 -0
- package/ui/transition/Transition.md +70 -0
- package/ui/transition/Transition.tsx +1 -0
- package/ui/transition/VerticalTransition.d.ts +1 -0
- package/ui/transition/VerticalTransition.js +1 -0
- package/ui/transition/VerticalTransition.md +34 -0
- package/ui/transition/VerticalTransition.tsx +1 -0
- package/ui/tree/TreeApp.d.ts +1 -0
- package/ui/tree/TreeApp.js +1 -0
- package/ui/tree/TreeApp.md +59 -0
- package/ui/tree/TreeApp.tsx +1 -0
- package/ui/tree/TreeMenu.d.ts +1 -0
- package/ui/tree/TreeMenu.js +1 -0
- package/ui/tree/TreeMenu.md +35 -0
- package/ui/tree/TreeMenu.tsx +1 -0
- package/ui/tree/TreeSidebar.d.ts +1 -0
- package/ui/tree/TreeSidebar.js +1 -0
- package/ui/tree/TreeSidebar.md +24 -0
- package/ui/tree/TreeSidebar.tsx +1 -0
- package/ui/util/getClass.md +55 -0
- package/ui/util/notify.md +50 -0
- package/ui/util/requireContext.md +24 -0
- package/ui/app/README.md +0 -32
- package/ui/block/README.md +0 -144
- package/ui/dialog/README.md +0 -80
- package/ui/docs/README.md +0 -71
- package/ui/form/README.md +0 -165
- package/ui/inline/README.md +0 -86
- package/ui/layout/README.md +0 -71
- package/ui/menu/README.md +0 -33
- package/ui/misc/README.md +0 -121
- package/ui/notice/README.md +0 -94
- package/ui/page/README.md +0 -56
- package/ui/router/README.md +0 -186
- package/ui/transition/README.md +0 -80
- package/ui/tree/README.md +0 -78
- package/ui/util/README.md +0 -153
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# HorizontalTransition
|
|
2
|
+
|
|
3
|
+
A direction-aware [`Transition`](/ui/Transition) preset that slides its children horizontally — right when moving forward, left when moving back. It reads the active transition type so the slide direction matches the navigation direction.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- Defaults to `slideRight`; with the type set to `"forward"` it slides right (`slideRight`), and to `"back"` it slides left (`slideLeft`).
|
|
8
|
+
- Set the direction with `setTransitionType("forward" | "back")` inside a `startTransition()` callback before navigating — see [`Transition`](/ui/Transition).
|
|
9
|
+
- Pass `overlay` to raise the transition group above surrounding content during the animation (`z-index: 100`).
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { HorizontalTransition, setTransitionType, requireNavigation } from "shelving/ui";
|
|
15
|
+
import { startTransition } from "react";
|
|
16
|
+
|
|
17
|
+
function navigate(direction: "forward" | "back", url: string) {
|
|
18
|
+
const nav = requireNavigation();
|
|
19
|
+
startTransition(() => {
|
|
20
|
+
setTransitionType(direction);
|
|
21
|
+
nav.forward(url);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// In the layout:
|
|
26
|
+
<HorizontalTransition>
|
|
27
|
+
<Router routes={ROUTES}/>
|
|
28
|
+
</HorizontalTransition>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Styling
|
|
32
|
+
|
|
33
|
+
| Variable | Styles | Default |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `--horizontal-transition-size` | Slide distance for the enter/leave keyframes | `25vw` |
|
|
36
|
+
| `--horizontal-transition-duration` | Duration of the slide keyframes | `var(--duration-normal)` |
|
|
37
|
+
|
|
38
|
+
**Global tokens it reads** — `--duration-normal`.
|
|
39
|
+
|
|
40
|
+
## See also
|
|
41
|
+
|
|
42
|
+
- [`VerticalTransition`](/ui/VerticalTransition) — the vertical counterpart
|
|
43
|
+
- [`Transition`](/ui/Transition) — the base wrapper, `overlay`, and `setTransitionType`
|
|
44
|
+
- [`Navigation`](/ui/Navigation) — triggers the route changes this animates
|
|
@@ -12,6 +12,7 @@ export interface HorizontalTransitionProps extends TransitionProps {}
|
|
|
12
12
|
/**
|
|
13
13
|
* Transition that slides its children horizontally — right when moving forward, left when moving back.
|
|
14
14
|
*
|
|
15
|
+
* @kind component
|
|
15
16
|
* @param props Shared transition variant props plus `children`.
|
|
16
17
|
* @returns A `<Transition>` element configured with the horizontal slide classes.
|
|
17
18
|
* @example <HorizontalTransition>{currentStep}</HorizontalTransition>
|
|
@@ -18,6 +18,7 @@ export interface TransitionProps extends ChildProps {
|
|
|
18
18
|
* - These must correspond to a `::view-transition(.className)` that is set in CSS.
|
|
19
19
|
* - Supports variant classes, e.g. `<Transition overlay>` applies `::view-transition(.overlay)` from `Transition.css`.
|
|
20
20
|
*
|
|
21
|
+
* @kind component
|
|
21
22
|
* @param props Transition class overrides (`default`/`forward`/`back`) plus `children` and variant props.
|
|
22
23
|
* @returns A `<ViewTransition>` element wrapping the children.
|
|
23
24
|
* @example <Transition default="fade">{content}</Transition>
|
|
@@ -10,6 +10,7 @@ import "./Transition.css";
|
|
|
10
10
|
* - These must correspond to a `::view-transition(.className)` that is set in CSS.
|
|
11
11
|
* - Supports variant classes, e.g. `<Transition overlay>` applies `::view-transition(.overlay)` from `Transition.css`.
|
|
12
12
|
*
|
|
13
|
+
* @kind component
|
|
13
14
|
* @param props Transition class overrides (`default`/`forward`/`back`) plus `children` and variant props.
|
|
14
15
|
* @returns A `<ViewTransition>` element wrapping the children.
|
|
15
16
|
* @example <Transition default="fade">{content}</Transition>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Transition
|
|
2
|
+
|
|
3
|
+
The base View Transition wrapper. It wraps its children in React 19's `<ViewTransition>` and applies named CSS transition classes, so swapping content between renders produces a smooth animation. Use it directly to specify any transition class names, or reach for a preset variant — [`FadeTransition`](/ui/FadeTransition), [`CollapseTransition`](/ui/CollapseTransition), [`VerticalTransition`](/ui/VerticalTransition), [`HorizontalTransition`](/ui/HorizontalTransition).
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- Set `default` for the base transition; `forward` and `back` default to it and let you pick a direction-aware variant. The class names must correspond to `::view-transition-old(.className)` / `::view-transition-new(.className)` rules in your CSS.
|
|
8
|
+
- Pass `overlay` to raise the transition group above surrounding content during the animation (`z-index: 100`, from `Transition.css`).
|
|
9
|
+
- Direction is driven by the active view-transition type. Call `setTransitionType("forward")` (or `"back"`) inside a `startTransition()` callback before navigating; the variants read that type to choose the correct slide.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Custom transition
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { Transition } from "shelving/ui";
|
|
17
|
+
|
|
18
|
+
<Transition default="zoom" forward="zoomIn" back="zoomOut">
|
|
19
|
+
{children}
|
|
20
|
+
</Transition>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Overlay
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { Transition } from "shelving/ui";
|
|
27
|
+
|
|
28
|
+
<Transition default="fade" overlay>
|
|
29
|
+
<Notification/>
|
|
30
|
+
</Transition>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Setting the direction with `setTransitionType`
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
import { HorizontalTransition, setTransitionType, requireNavigation } from "shelving/ui";
|
|
37
|
+
import { startTransition } from "react";
|
|
38
|
+
|
|
39
|
+
function go(direction: "forward" | "back", url: string) {
|
|
40
|
+
const nav = requireNavigation();
|
|
41
|
+
startTransition(() => {
|
|
42
|
+
setTransitionType(direction);
|
|
43
|
+
nav.forward(url);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// In the layout — slides right on forward, left on back:
|
|
48
|
+
<HorizontalTransition>
|
|
49
|
+
<Router routes={ROUTES}/>
|
|
50
|
+
</HorizontalTransition>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Styling
|
|
54
|
+
|
|
55
|
+
Transitions are driven by CSS `::view-transition-*` pseudo-element rules keyed on the transition class names, not by per-component `--variable` hooks. `<Transition>` itself only ships the `overlay` rule:
|
|
56
|
+
|
|
57
|
+
| Variable | Styles | Default |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| _(none)_ | `<Transition>` exposes no own custom properties | — |
|
|
60
|
+
|
|
61
|
+
The `overlay` variant sets `z-index: 100` on `::view-transition-group(.overlay)`. The preset variants document their own timing/distance hooks (`--fade-transition-duration`, `--vertical-transition-size` / `-duration`, `--horizontal-transition-size` / `-duration`) on their pages.
|
|
62
|
+
|
|
63
|
+
**Global tokens it reads** — none directly; the preset variants fall back to `--duration-fast` / `--duration-normal`.
|
|
64
|
+
|
|
65
|
+
## See also
|
|
66
|
+
|
|
67
|
+
- [`FadeTransition`](/ui/FadeTransition) — opacity fade preset
|
|
68
|
+
- [`CollapseTransition`](/ui/CollapseTransition) — size collapse preset
|
|
69
|
+
- [`VerticalTransition`](/ui/VerticalTransition) / [`HorizontalTransition`](/ui/HorizontalTransition) — direction-aware slide presets
|
|
70
|
+
- [`Navigation`](/ui/Navigation) — triggers the route changes transitions animate
|
|
@@ -22,6 +22,7 @@ export interface TransitionProps extends ChildProps {
|
|
|
22
22
|
* - These must correspond to a `::view-transition(.className)` that is set in CSS.
|
|
23
23
|
* - Supports variant classes, e.g. `<Transition overlay>` applies `::view-transition(.overlay)` from `Transition.css`.
|
|
24
24
|
*
|
|
25
|
+
* @kind component
|
|
25
26
|
* @param props Transition class overrides (`default`/`forward`/`back`) plus `children` and variant props.
|
|
26
27
|
* @returns A `<ViewTransition>` element wrapping the children.
|
|
27
28
|
* @example <Transition default="fade">{content}</Transition>
|
|
@@ -11,6 +11,7 @@ export interface VerticalTransitionProps extends TransitionProps {
|
|
|
11
11
|
/**
|
|
12
12
|
* Transition that slides its children vertically — down when moving forward, up when moving back.
|
|
13
13
|
*
|
|
14
|
+
* @kind component
|
|
14
15
|
* @param props Shared transition variant props plus `children`.
|
|
15
16
|
* @returns A `<Transition>` element configured with the vertical slide classes.
|
|
16
17
|
* @example <VerticalTransition>{currentStep}</VerticalTransition>
|
|
@@ -4,6 +4,7 @@ import { Transition } from "./Transition.js";
|
|
|
4
4
|
/**
|
|
5
5
|
* Transition that slides its children vertically — down when moving forward, up when moving back.
|
|
6
6
|
*
|
|
7
|
+
* @kind component
|
|
7
8
|
* @param props Shared transition variant props plus `children`.
|
|
8
9
|
* @returns A `<Transition>` element configured with the vertical slide classes.
|
|
9
10
|
* @example <VerticalTransition>{currentStep}</VerticalTransition>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# VerticalTransition
|
|
2
|
+
|
|
3
|
+
A direction-aware [`Transition`](/ui/Transition) preset that slides its children vertically — down when moving forward, up when moving back. It reads the active transition type so the slide direction matches the navigation direction.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- Defaults to `slideDown`; with the type set to `"forward"` it slides down (`slideDown`), and to `"back"` it slides up (`slideUp`).
|
|
8
|
+
- Set the direction with `setTransitionType("forward" | "back")` inside a `startTransition()` callback before navigating — see [`Transition`](/ui/Transition).
|
|
9
|
+
- Pass `overlay` to raise the transition group above surrounding content during the animation (`z-index: 100`).
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { VerticalTransition } from "shelving/ui";
|
|
15
|
+
|
|
16
|
+
<VerticalTransition>
|
|
17
|
+
<Router routes={ROUTES}/>
|
|
18
|
+
</VerticalTransition>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Styling
|
|
22
|
+
|
|
23
|
+
| Variable | Styles | Default |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `--vertical-transition-size` | Slide distance for the enter/leave keyframes | `25vh` |
|
|
26
|
+
| `--vertical-transition-duration` | Duration of the slide keyframes | `var(--duration-normal)` |
|
|
27
|
+
|
|
28
|
+
**Global tokens it reads** — `--duration-normal`.
|
|
29
|
+
|
|
30
|
+
## See also
|
|
31
|
+
|
|
32
|
+
- [`HorizontalTransition`](/ui/HorizontalTransition) — the horizontal counterpart
|
|
33
|
+
- [`Transition`](/ui/Transition) — the base wrapper, `overlay`, and `setTransitionType`
|
|
34
|
+
- [`Navigation`](/ui/Navigation) — triggers the route changes this animates
|
|
@@ -12,6 +12,7 @@ export interface VerticalTransitionProps extends TransitionProps {}
|
|
|
12
12
|
/**
|
|
13
13
|
* Transition that slides its children vertically — down when moving forward, up when moving back.
|
|
14
14
|
*
|
|
15
|
+
* @kind component
|
|
15
16
|
* @param props Shared transition variant props plus `children`.
|
|
16
17
|
* @returns A `<Transition>` element configured with the vertical slide classes.
|
|
17
18
|
* @example <VerticalTransition>{currentStep}</VerticalTransition>
|
package/ui/tree/TreeApp.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export interface TreeAppProps extends PossibleMeta {
|
|
|
24
24
|
* - Element rendering uses the default mappings on `<TreePage>`, `<TreeMenu>`, `<TreeCards>`.
|
|
25
25
|
* Override by wrapping with `<TreePageMapping>`, `<TreeMenuMapping>`, or `<TreeCardMapping>`.
|
|
26
26
|
*
|
|
27
|
+
* @kind component
|
|
27
28
|
* @param props The `tree` to render, optional extra `routes`, and app meta.
|
|
28
29
|
* @returns The configured `<App>` element with sidebar layout and tree routing.
|
|
29
30
|
* @example <TreeApp tree={tree} title="Docs" />
|
package/ui/tree/TreeApp.js
CHANGED
|
@@ -13,6 +13,7 @@ import { TreeSidebar } from "./TreeSidebar.js";
|
|
|
13
13
|
* - Element rendering uses the default mappings on `<TreePage>`, `<TreeMenu>`, `<TreeCards>`.
|
|
14
14
|
* Override by wrapping with `<TreePageMapping>`, `<TreeMenuMapping>`, or `<TreeCardMapping>`.
|
|
15
15
|
*
|
|
16
|
+
* @kind component
|
|
16
17
|
* @param props The `tree` to render, optional extra `routes`, and app meta.
|
|
17
18
|
* @returns The configured `<App>` element with sidebar layout and tree routing.
|
|
18
19
|
* @example <TreeApp tree={tree} title="Docs" />
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# TreeApp
|
|
2
|
+
|
|
3
|
+
The entry point for a tree-based documentation site. Given a `TreeElement` from [extract](/extract), `TreeApp` produces a complete site in one line: a sidebar menu, client-side routing, and a rendered page for every element in the tree.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- It wraps `<App>` with error catching and a sidebar layout, then wires a [`TreeRouter`](/ui/TreeRouter) inside. The sidebar is always a [`TreeSidebar`](/ui/TreeSidebar) built from the root.
|
|
8
|
+
- The router covers the whole tree: `/` renders the root, and every deeper path resolves the matching descendant — both rendered via the default page renderers ([`TreePage`](/ui/TreePage) for directories/files, [`DocumentationPage`](/ui/DocumentationPage) for symbols).
|
|
9
|
+
- Only directories and files (plus `kind: "module"` symbols) appear in the navigation — code symbols are kept off the sidebar but still get their own pages.
|
|
10
|
+
- Every renderer is overridable. Each dispatch layer is a `[Mapping, Mapper]` pair built by `createMapper()`; wrap the app (or any subtree) in the matching `*Mapping` component to swap a renderer for one element type without touching anything else:
|
|
11
|
+
|
|
12
|
+
| Mapping pair | Overrides |
|
|
13
|
+
|---|---|
|
|
14
|
+
| [`TreePageMapping`](/ui/TreeRouter) / `TreeRouterMapper` | Full-page renderer (dispatched by [`TreeRouter`](/ui/TreeRouter)) |
|
|
15
|
+
| [`TreeMenuMapping`](/ui/TreeMenu) / `TreeMenuMapper` | Sidebar menu item |
|
|
16
|
+
| [`TreeCardMapping`](/ui/TreeCards) / `TreeCardMapper` | Card in a listing |
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
### Basic
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { TreeApp } from "shelving/ui";
|
|
24
|
+
|
|
25
|
+
// `tree` is a TreeElement returned by DirectoryExtractor (see /extract).
|
|
26
|
+
<TreeApp tree={tree} />
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
That single line produces a complete documentation site.
|
|
30
|
+
|
|
31
|
+
### Adding custom routes
|
|
32
|
+
|
|
33
|
+
Extra `routes` are merged before the tree routes, so they take precedence on conflicts.
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
<TreeApp tree={tree} routes={{ "/changelog": ChangelogPage }} />
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Overriding a renderer
|
|
40
|
+
|
|
41
|
+
Wrap the app (or any subtree) in a `*Mapping` component to replace the renderer for one element type.
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { TreeApp, TreePageMapping } from "shelving/ui";
|
|
45
|
+
|
|
46
|
+
<TreePageMapping mapping={{ "tree-element": MyTreePage }}>
|
|
47
|
+
<TreeApp tree={tree} />
|
|
48
|
+
</TreePageMapping>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The same pattern works for [`TreeMenuMapping`](/ui/TreeMenu) (sidebar items) and [`TreeCardMapping`](/ui/TreeCards) (cards inside directory listings).
|
|
52
|
+
|
|
53
|
+
## See also
|
|
54
|
+
|
|
55
|
+
- [extract](/extract) — builds the `TreeElement` tree that `TreeApp` consumes.
|
|
56
|
+
- [`TreeRouter`](/ui/TreeRouter) — resolves the URL to an element and dispatches it to a page renderer.
|
|
57
|
+
- [`TreeSidebar`](/ui/TreeSidebar) / [`TreeMenu`](/ui/TreeMenu) — the navigation built into the sidebar.
|
|
58
|
+
- [`TreePage`](/ui/TreePage) / [`TreeCards`](/ui/TreeCards) — the default directory/file page and card listing.
|
|
59
|
+
- [`DocumentationPage`](/ui/DocumentationPage) — the default renderer for documented symbols.
|
package/ui/tree/TreeApp.tsx
CHANGED
|
@@ -31,6 +31,7 @@ export interface TreeAppProps extends PossibleMeta {
|
|
|
31
31
|
* - Element rendering uses the default mappings on `<TreePage>`, `<TreeMenu>`, `<TreeCards>`.
|
|
32
32
|
* Override by wrapping with `<TreePageMapping>`, `<TreeMenuMapping>`, or `<TreeCardMapping>`.
|
|
33
33
|
*
|
|
34
|
+
* @kind component
|
|
34
35
|
* @param props The `tree` to render, optional extra `routes`, and app meta.
|
|
35
36
|
* @returns The configured `<App>` element with sidebar layout and tree routing.
|
|
36
37
|
* @example <TreeApp tree={tree} title="Docs" />
|
package/ui/tree/TreeMenu.d.ts
CHANGED
|
@@ -55,6 +55,7 @@ export interface TreeMenuProps {
|
|
|
55
55
|
* - To customise renderers for specific types, wrap in `<TreeMenuMapping mapping={…}>`.
|
|
56
56
|
* - Only directories and files appear — code symbols are kept off the navigation.
|
|
57
57
|
*
|
|
58
|
+
* @kind component
|
|
58
59
|
* @param props The root `tree` element and optional root `path`.
|
|
59
60
|
* @returns A `<Menu>` of navigation links to the root's children.
|
|
60
61
|
* @example <TreeMenu tree={tree} />
|
package/ui/tree/TreeMenu.js
CHANGED
|
@@ -54,6 +54,7 @@ export const [TreeMenuMapping, TreeMenuMapper] = createMapper({
|
|
|
54
54
|
* - To customise renderers for specific types, wrap in `<TreeMenuMapping mapping={…}>`.
|
|
55
55
|
* - Only directories and files appear — code symbols are kept off the navigation.
|
|
56
56
|
*
|
|
57
|
+
* @kind component
|
|
57
58
|
* @param props The root `tree` element and optional root `path`.
|
|
58
59
|
* @returns A `<Menu>` of navigation links to the root's children.
|
|
59
60
|
* @example <TreeMenu tree={tree} />
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# TreeMenu
|
|
2
|
+
|
|
3
|
+
A sidebar navigation menu built from the children of a root tree element. Each child renders as a menu item; items with menu-eligible children of their own reveal a nested submenu based on the current URL.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- Only directories and files appear, plus documentation symbols of `kind: "module"` — functions, classes, methods, properties, etc. are kept off the navigation (they still get their own pages via [`TreeApp`](/ui/TreeApp)).
|
|
8
|
+
- Each item computes its own href by appending its `name` to the parent `path` (defaulting to `/`).
|
|
9
|
+
- It is a `[Mapping, Mapper]` pair: wrap any subtree in `<TreeMenuMapping mapping={…}>` to swap the per-type menu-item renderer without touching the rest of the site. [`TreeSidebar`](/ui/TreeSidebar) shares this same mapper.
|
|
10
|
+
- Use it directly for finer layout control; otherwise [`TreeApp`](/ui/TreeApp) wires a [`TreeSidebar`](/ui/TreeSidebar) (a home link plus this menu) for you.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
import { TreeMenu } from "shelving/ui";
|
|
16
|
+
|
|
17
|
+
// Just the navigation menu from a subtree's children.
|
|
18
|
+
<TreeMenu tree={section} path="/docs" />
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Override the menu-item renderer for one element type:
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { TreeApp, TreeMenuMapping } from "shelving/ui";
|
|
25
|
+
|
|
26
|
+
<TreeMenuMapping mapping={{ "tree-element": MyMenuItem }}>
|
|
27
|
+
<TreeApp tree={tree} />
|
|
28
|
+
</TreeMenuMapping>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## See also
|
|
32
|
+
|
|
33
|
+
- [`TreeSidebar`](/ui/TreeSidebar) — a home link plus this menu; the default sidebar.
|
|
34
|
+
- [`TreeApp`](/ui/TreeApp) — wires the sidebar and routing into a complete site.
|
|
35
|
+
- [`TreeCards`](/ui/TreeCards) — the card-listing equivalent for page bodies.
|
package/ui/tree/TreeMenu.tsx
CHANGED
|
@@ -84,6 +84,7 @@ export interface TreeMenuProps {
|
|
|
84
84
|
* - To customise renderers for specific types, wrap in `<TreeMenuMapping mapping={…}>`.
|
|
85
85
|
* - Only directories and files appear — code symbols are kept off the navigation.
|
|
86
86
|
*
|
|
87
|
+
* @kind component
|
|
87
88
|
* @param props The root `tree` element and optional root `path`.
|
|
88
89
|
* @returns A `<Menu>` of navigation links to the root's children.
|
|
89
90
|
* @example <TreeMenu tree={tree} />
|
package/ui/tree/TreeSidebar.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export interface TreeSidebarProps {
|
|
|
19
19
|
* - The home link uses `path` as its href (defaulting to `/`). The children's hrefs are computed by appending their `name` to the root's path.
|
|
20
20
|
* - To customise child renderers wrap in `<TreeMenuMapping mapping={…}>` (same context as `<TreeMenu>`).
|
|
21
21
|
*
|
|
22
|
+
* @kind component
|
|
22
23
|
* @param props The root `tree` element and optional root `path`.
|
|
23
24
|
* @returns A `<Menu>` with a home link plus the root's children as navigation items.
|
|
24
25
|
* @example <TreeSidebar tree={tree} />
|
package/ui/tree/TreeSidebar.js
CHANGED
|
@@ -9,6 +9,7 @@ import { matchMenuElement, TreeMenuMapper } from "./TreeMenu.js";
|
|
|
9
9
|
* - The home link uses `path` as its href (defaulting to `/`). The children's hrefs are computed by appending their `name` to the root's path.
|
|
10
10
|
* - To customise child renderers wrap in `<TreeMenuMapping mapping={…}>` (same context as `<TreeMenu>`).
|
|
11
11
|
*
|
|
12
|
+
* @kind component
|
|
12
13
|
* @param props The root `tree` element and optional root `path`.
|
|
13
14
|
* @returns A `<Menu>` with a home link plus the root's children as navigation items.
|
|
14
15
|
* @example <TreeSidebar tree={tree} />
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# TreeSidebar
|
|
2
|
+
|
|
3
|
+
The default sidebar for a tree-based site: a single "home" link for the root element, followed by the root's children as a navigation menu. [`TreeApp`](/ui/TreeApp) mounts one of these automatically.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- The home link uses `path` as its href (defaulting to `/`); children's hrefs are computed by appending their `name` to the root path.
|
|
8
|
+
- The children render through the same mapper as [`TreeMenu`](/ui/TreeMenu), so customise them by wrapping in `<TreeMenuMapping mapping={…}>`.
|
|
9
|
+
- Only directories, files, and `kind: "module"` symbols appear — code symbols are kept off the navigation.
|
|
10
|
+
- Use it directly for finer layout control outside [`TreeApp`](/ui/TreeApp).
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
import { TreeSidebar } from "shelving/ui";
|
|
16
|
+
|
|
17
|
+
// A home link + children menu combined — the default sidebar.
|
|
18
|
+
<TreeSidebar tree={root} />
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## See also
|
|
22
|
+
|
|
23
|
+
- [`TreeMenu`](/ui/TreeMenu) — the children menu, usable on its own; shares the override mapper.
|
|
24
|
+
- [`TreeApp`](/ui/TreeApp) — wires this sidebar into the page layout.
|
package/ui/tree/TreeSidebar.tsx
CHANGED
|
@@ -24,6 +24,7 @@ export interface TreeSidebarProps {
|
|
|
24
24
|
* - The home link uses `path` as its href (defaulting to `/`). The children's hrefs are computed by appending their `name` to the root's path.
|
|
25
25
|
* - To customise child renderers wrap in `<TreeMenuMapping mapping={…}>` (same context as `<TreeMenu>`).
|
|
26
26
|
*
|
|
27
|
+
* @kind component
|
|
27
28
|
* @param props The root `tree` element and optional root `path`.
|
|
28
29
|
* @returns A `<Menu>` with a home link plus the root's children as navigation items.
|
|
29
30
|
* @example <TreeSidebar tree={tree} />
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# getClass
|
|
2
|
+
|
|
3
|
+
Joins any mix of class inputs into a single `className` string. These two helpers (`getClass` and `getModuleClass`) appear in almost every component in the library — every component that accepts variant props (`small`, `primary`, `plain`, etc.) uses them to build its `className`.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- `getClass(...classes)` accepts strings, `null` / `undefined` (ignored), nested arrays, and `Variants` objects. A `Variants` object is a plain boolean dictionary: keys whose value is strictly `true` are included, all others ignored — so you can pass component `props` straight through and boolean variant flags are picked up automatically.
|
|
8
|
+
- `getModuleClass(module, ...classes)` does the same but maps each resolved class through a CSS module dictionary, yielding only the hashed names that exist in the module. If `module` is a string (the environment doesn't process `.module.css` files) it returns `undefined` silently, so components degrade gracefully.
|
|
9
|
+
- The `Classes` type describes every accepted input form: `string | null | undefined | Classes[] | Variants`.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { getClass } from "shelving/ui";
|
|
15
|
+
|
|
16
|
+
getClass("button", null, { primary: true, small: false });
|
|
17
|
+
// → "button primary"
|
|
18
|
+
|
|
19
|
+
getClass("box", ["a", "b"]);
|
|
20
|
+
// → "box a b"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { getModuleClass } from "shelving/ui";
|
|
25
|
+
import BUTTON_CSS from "./Button.module.css";
|
|
26
|
+
|
|
27
|
+
// Pass the base class name then the whole props object.
|
|
28
|
+
getModuleClass(BUTTON_CSS, "button", variants);
|
|
29
|
+
// → hashed class string containing "button" plus any matching true-valued variant keys
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The canonical component pattern combines both:
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { getClass, getModuleClass } from "shelving/ui";
|
|
36
|
+
import BUTTON_CSS from "./Button.module.css";
|
|
37
|
+
|
|
38
|
+
export function Button({ children, ...variants }: ButtonProps): ReactElement {
|
|
39
|
+
return (
|
|
40
|
+
<button
|
|
41
|
+
className={getClass(
|
|
42
|
+
BLOCK_CLASS, //
|
|
43
|
+
getModuleClass(BUTTON_CSS, "button", variants),
|
|
44
|
+
)}
|
|
45
|
+
>
|
|
46
|
+
{children}
|
|
47
|
+
</button>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## See also
|
|
53
|
+
|
|
54
|
+
- [`requireContext`](/ui/requireContext) — the other helper at the heart of the component layer.
|
|
55
|
+
- [`ui`](/ui) — the styling system: tint ladder, cascade layers, and theming.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# notify
|
|
2
|
+
|
|
3
|
+
Dispatches a `notice` event so the global `<Notices>` list can display it. This is a thin event bus for toast-style notifications: components dispatch custom events on the DOM and `<Notices>` listens and renders them — no context required.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- The event bubbles, so any ancestor subscribed with `subscribeNotices()` receives it; it defaults to dispatching on `window`.
|
|
8
|
+
- A family of helpers builds on `notify`:
|
|
9
|
+
|
|
10
|
+
| Function | What it does |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `notify(message, status?, el?)` | Dispatch a notice event (defaults to `window`) |
|
|
13
|
+
| `notifySuccess(message, el?)` | Shorthand for a `"success"` notice |
|
|
14
|
+
| `notifyError(message, el?)` | Shorthand for an `"error"` notice |
|
|
15
|
+
| `notifyThrown(thrown, el?)` | Extract a message from a caught value and dispatch an error |
|
|
16
|
+
| `callNotified(callback, ...args)` | Run a callback; dispatch success or error automatically |
|
|
17
|
+
| `awaitNotified(promise)` | Same for an already-pending promise |
|
|
18
|
+
| `subscribeNotices(callback, el?)` | Listen for notice events; returns an unsubscribe function |
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { notifySuccess, notifyError } from "shelving/ui";
|
|
24
|
+
|
|
25
|
+
notifySuccess("Profile updated.");
|
|
26
|
+
notifyError("Could not connect.");
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { callNotified } from "shelving/ui";
|
|
31
|
+
|
|
32
|
+
// Return a string for success; throw for error.
|
|
33
|
+
callNotified(async () => {
|
|
34
|
+
await saveData();
|
|
35
|
+
return "Saved!";
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { subscribeNotices } from "shelving/ui";
|
|
41
|
+
|
|
42
|
+
const stop = subscribeNotices((message, status) => show(message, status));
|
|
43
|
+
// Call stop() to remove the listener.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## See also
|
|
47
|
+
|
|
48
|
+
- [`Notices`](/ui/Notices) — the global list that listens for these events and renders them.
|
|
49
|
+
- [`Notice`](/ui/Notice) — the callout each notice is rendered as.
|
|
50
|
+
- [`store`](/store) — the `ArrayStore` / `DataStore` layer behind the global notices.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# requireContext
|
|
2
|
+
|
|
3
|
+
Reads a React context and throws `RequiredError` if the value is `null` or `undefined`. Use it instead of `use(context)` when a context must be provided by an ancestor — every `require*()` hook in the library follows this pattern.
|
|
4
|
+
|
|
5
|
+
**Things to know:**
|
|
6
|
+
|
|
7
|
+
- Reads the context with React's `use()`, so it must be called inside a component or hook.
|
|
8
|
+
- Treats both `null` and `undefined` as "unset" and throws, naming the context's `displayName` in the message.
|
|
9
|
+
- Pass the calling function as `caller` so the thrown `RequiredError` is attributed to it (defaults to `requireContext` itself).
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { requireContext } from "shelving/ui";
|
|
15
|
+
|
|
16
|
+
function requireNavigation(): NavigationStore {
|
|
17
|
+
return requireContext(NavigationContext, requireNavigation);
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## See also
|
|
22
|
+
|
|
23
|
+
- [`getClass`](/ui/getClass) — the other helper at the heart of the component layer.
|
|
24
|
+
- [`ui/router`](/ui) — uses `requireContext` to read the navigation and meta contexts.
|
package/ui/app/README.md
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# App
|
|
2
|
-
|
|
3
|
-
Root component for a client-side Shelving app. `<App>` applies the theme CSS class to `document.body` and provides a `Meta` context so every descendant can read or update page metadata.
|
|
4
|
-
|
|
5
|
-
Use `<App>` when mounting into an existing HTML page on the client. For server-side rendering where you need the full `<html>` document shell, use [`<HTML>`](/ui/page) instead.
|
|
6
|
-
|
|
7
|
-
## Usage
|
|
8
|
-
|
|
9
|
-
```tsx
|
|
10
|
-
import { App, Navigation, Router } from "shelving/ui";
|
|
11
|
-
|
|
12
|
-
export function MyApp() {
|
|
13
|
-
return (
|
|
14
|
-
<App app="My App" root="https://example.com/" url="/">
|
|
15
|
-
<Navigation>
|
|
16
|
-
<Router routes={{
|
|
17
|
-
"/": HomePage,
|
|
18
|
-
"/about": AboutPage,
|
|
19
|
-
}} />
|
|
20
|
-
</Navigation>
|
|
21
|
-
</App>
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
`<App>` accepts all `PossibleMeta` props (`app`, `root`, `url`, `title`, `language`, `tags`, etc.) and merges them into the context it provides to children. On mount it adds the theme class to `document.body`, which activates the CSS custom property tokens defined in `App.module.css`; on unmount it removes it.
|
|
27
|
-
|
|
28
|
-
## See also
|
|
29
|
-
|
|
30
|
-
- [`ui/page`](/ui/page) — `<HTML>` and `<Page>` for the document shell and per-page metadata
|
|
31
|
-
- [`ui/layout`](/ui/layout) — `SidebarLayout` and `CenteredLayout`
|
|
32
|
-
- [`ui/router`](/ui/router) — `<Navigation>` and `<Router>` for client-side routing
|