@charcuterie/ui 4.5.0 → 4.6.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/README.md +7 -2
- package/dist/Card/Card.d.ts +5 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +23 -3
- package/dist/Card/Card.js.map +1 -1
- package/dist/Overlay/OverlayPanel.d.ts.map +1 -1
- package/dist/Overlay/OverlayPanel.js +54 -2
- package/dist/Overlay/OverlayPanel.js.map +1 -1
- package/dist/Overlay/OverlayStack.d.ts +5 -0
- package/dist/Overlay/OverlayStack.d.ts.map +1 -1
- package/dist/Overlay/OverlayStack.js +2 -0
- package/dist/Overlay/OverlayStack.js.map +1 -1
- package/dist/Toast/ToastRegion.d.ts +61 -0
- package/dist/Toast/ToastRegion.d.ts.map +1 -1
- package/dist/Toast/ToastRegion.js +80 -3
- package/dist/Toast/ToastRegion.js.map +1 -1
- package/dist/Toolbar/useToolbarOverflow.d.ts.map +1 -1
- package/dist/Toolbar/useToolbarOverflow.js +39 -0
- package/dist/Toolbar/useToolbarOverflow.js.map +1 -1
- package/package.json +3 -2
- package/src/Accordion/Accordion.mdx +1 -1
- package/src/Accordion/Accordion.stories.tsx +3 -1
- package/src/Accordion/Accordion.test.tsx +4 -4
- package/src/ActionTiles/ActionTiles.mdx +1 -1
- package/src/ActionTiles/ActionTiles.stories.tsx +3 -1
- package/src/ActionTiles/ActionTiles.test.tsx +3 -3
- package/src/AdaptiveGrid/AdaptiveGrid.mdx +1 -1
- package/src/AdaptiveGrid/AdaptiveGrid.stories.tsx +3 -1
- package/src/AdaptiveGrid/AdaptiveGrid.test.tsx +5 -5
- package/src/Alert/Alert.mdx +1 -1
- package/src/Alert/Alert.stories.tsx +3 -1
- package/src/Alert/Alert.test.tsx +2 -2
- package/src/Avatar/Avatar.mdx +1 -1
- package/src/Avatar/Avatar.stories.tsx +4 -1
- package/src/Avatar/Avatar.test.tsx +2 -2
- package/src/Badge/Badge.mdx +1 -1
- package/src/Badge/Badge.stories.tsx +3 -1
- package/src/Badge/Badge.test.tsx +3 -3
- package/src/BadgeButton/BadgeButton.mdx +1 -1
- package/src/BadgeButton/BadgeButton.stories.tsx +3 -1
- package/src/BadgeButton/BadgeButton.test.tsx +2 -2
- package/src/Board/Board.mdx +1 -1
- package/src/Board/Board.stories.tsx +4 -1
- package/src/Board/Board.test.tsx +2 -2
- package/src/Button/Button.mdx +1 -1
- package/src/Button/Button.stories.tsx +3 -1
- package/src/Button/Button.test.tsx +2 -2
- package/src/ButtonLink/ButtonLink.mdx +1 -1
- package/src/ButtonLink/ButtonLink.stories.tsx +3 -1
- package/src/ButtonLink/ButtonLink.test.tsx +3 -3
- package/src/Card/Card.mdx +21 -1
- package/src/Card/Card.stories.tsx +91 -1
- package/src/Card/Card.test.tsx +60 -3
- package/src/Card/Card.tsx +24 -2
- package/src/Checkbox/Checkbox.mdx +1 -1
- package/src/Checkbox/Checkbox.stories.tsx +3 -1
- package/src/Checkbox/Checkbox.test.tsx +4 -4
- package/src/ColorSchemeSwitcher/ColorSchemeSwitcher.mdx +1 -1
- package/src/ColorSchemeSwitcher/ColorSchemeSwitcher.stories.tsx +3 -1
- package/src/ColorSchemeSwitcher/ColorSchemeSwitcher.test.tsx +5 -5
- package/src/ColorSchemeToggle/ColorSchemeToggle.mdx +1 -1
- package/src/ColorSchemeToggle/ColorSchemeToggle.stories.tsx +3 -1
- package/src/ColorSchemeToggle/ColorSchemeToggle.test.tsx +5 -5
- package/src/Combobox/Combobox.mdx +1 -1
- package/src/Combobox/Combobox.stories.tsx +3 -1
- package/src/Combobox/Combobox.test.tsx +2 -2
- package/src/CopyButton/CopyButton.mdx +1 -1
- package/src/CopyButton/CopyButton.stories.tsx +4 -1
- package/src/CopyButton/CopyButton.test.tsx +3 -3
- package/src/DataTable/DataTable.mdx +1 -1
- package/src/DataTable/DataTable.stories.tsx +3 -1
- package/src/DataTable/DataTable.test.tsx +3 -3
- package/src/DatePicker/DatePicker.mdx +1 -1
- package/src/DatePicker/DatePicker.stories.tsx +3 -1
- package/src/DatePicker/DatePicker.test.tsx +3 -3
- package/src/DatePicker/plainDate.test.ts +21 -3
- package/src/Dialog/Dialog.mdx +1 -1
- package/src/Dialog/Dialog.stories.tsx +3 -1
- package/src/Dialog/Dialog.test.tsx +2 -2
- package/src/DropRail/DropRail.mdx +1 -1
- package/src/DropRail/DropRail.stories.tsx +4 -1
- package/src/DropRail/DropRail.test.tsx +4 -4
- package/src/EmptyState/EmptyState.mdx +1 -1
- package/src/EmptyState/EmptyState.stories.tsx +3 -1
- package/src/EmptyState/EmptyState.test.tsx +2 -2
- package/src/Field/Field.mdx +1 -1
- package/src/Field/Field.stories.tsx +3 -1
- package/src/Field/Field.test.tsx +4 -4
- package/src/FileDropZone/FileDropZone.mdx +1 -1
- package/src/FileDropZone/FileDropZone.stories.tsx +3 -1
- package/src/FileDropZone/FileDropZone.test.tsx +3 -3
- package/src/Header/Header.mdx +1 -1
- package/src/Header/Header.stories.tsx +3 -1
- package/src/IconButton/IconButton.mdx +1 -1
- package/src/IconButton/IconButton.stories.tsx +3 -1
- package/src/IconButton/IconButton.test.tsx +2 -2
- package/src/Lightbox/Lightbox.mdx +1 -1
- package/src/Lightbox/Lightbox.stories.tsx +3 -1
- package/src/Lightbox/Lightbox.test.tsx +2 -2
- package/src/Listbox/Listbox.mdx +1 -1
- package/src/Listbox/Listbox.stories.tsx +3 -1
- package/src/Listbox/Listbox.test.tsx +5 -5
- package/src/LiveStatusIndicator/LiveStatusIndicator.mdx +1 -1
- package/src/LiveStatusIndicator/LiveStatusIndicator.stories.tsx +3 -1
- package/src/LiveStatusIndicator/LiveStatusIndicator.test.tsx +2 -2
- package/src/LogViewer/LogViewer.mdx +1 -1
- package/src/LogViewer/LogViewer.stories.tsx +3 -1
- package/src/LogViewer/LogViewer.test.tsx +2 -2
- package/src/Main/Main.mdx +1 -1
- package/src/Main/Main.stories.tsx +3 -1
- package/src/Main/Main.test.tsx +3 -3
- package/src/MarkdownEditor/MarkdownEditor.mdx +1 -1
- package/src/MarkdownEditor/MarkdownEditor.stories.tsx +3 -1
- package/src/MarkdownEditor/MarkdownEditor.test.tsx +4 -4
- package/src/MarkdownLine/MarkdownLine.mdx +1 -1
- package/src/MarkdownLine/MarkdownLine.stories.tsx +4 -1
- package/src/MarkdownLine/MarkdownLine.test.tsx +3 -3
- package/src/MediaTile/MediaTile.stories.tsx +3 -1
- package/src/MediaTile/MediaTile.test.tsx +2 -2
- package/src/Menu/Menu.mdx +1 -1
- package/src/Menu/Menu.stories.tsx +3 -1
- package/src/Modal/Modal.mdx +1 -1
- package/src/Modal/Modal.stories.tsx +3 -1
- package/src/Modal/Modal.test.tsx +3 -3
- package/src/Nav/Nav.mdx +1 -1
- package/src/Nav/Nav.stories.tsx +3 -1
- package/src/Nav/Nav.test.tsx +6 -6
- package/src/NavBar/NavBar.mdx +1 -1
- package/src/NavBar/NavBar.stories.tsx +3 -1
- package/src/NavBar/NavBar.test.tsx +3 -3
- package/src/Overlay/OverlayPanel.tsx +63 -2
- package/src/Overlay/OverlayStack.tsx +7 -1
- package/src/Picker/Picker.mdx +1 -1
- package/src/Picker/Picker.stories.tsx +3 -1
- package/src/Picker/Picker.test.tsx +2 -2
- package/src/Popover/Popover.mdx +1 -1
- package/src/Popover/Popover.stories.tsx +3 -1
- package/src/Popover/Popover.test.tsx +2 -2
- package/src/PortraitTiles/PortraitTiles.mdx +1 -1
- package/src/PortraitTiles/PortraitTiles.stories.tsx +3 -1
- package/src/PortraitTiles/PortraitTiles.test.tsx +5 -5
- package/src/ProgressBar/ProgressBar.mdx +1 -1
- package/src/ProgressBar/ProgressBar.stories.tsx +3 -1
- package/src/ProgressBar/ProgressBar.test.tsx +2 -2
- package/src/QueryBuilder/QueryBuilder.mdx +1 -1
- package/src/QueryBuilder/QueryBuilder.stories.tsx +3 -1
- package/src/QueryBuilder/QueryBuilder.test.tsx +2 -2
- package/src/RadioGroup/RadioGroup.mdx +1 -1
- package/src/RadioGroup/RadioGroup.stories.tsx +3 -1
- package/src/RadioGroup/RadioGroup.test.tsx +2 -2
- package/src/Rail/Rail.mdx +1 -1
- package/src/Rail/Rail.stories.tsx +3 -1
- package/src/Rail/Rail.test.tsx +2 -2
- package/src/RangeSlider/RangeSlider.mdx +1 -1
- package/src/RangeSlider/RangeSlider.stories.tsx +3 -1
- package/src/RangeSlider/RangeSlider.test.tsx +7 -3
- package/src/ReorderList/ReorderList.mdx +1 -1
- package/src/ReorderList/ReorderList.stories.tsx +3 -1
- package/src/ReorderList/ReorderList.test.tsx +7 -7
- package/src/RouterLink/UnstyledLink.stories.tsx +4 -1
- package/src/RouterLink/UnstyledLink.test.tsx +2 -2
- package/src/SearchInput/SearchInput.mdx +1 -1
- package/src/SearchInput/SearchInput.stories.tsx +3 -1
- package/src/SegmentedControl/SegmentedControl.mdx +1 -1
- package/src/SegmentedControl/SegmentedControl.stories.tsx +3 -1
- package/src/SegmentedControl/SegmentedControl.test.tsx +2 -2
- package/src/Select/Select.mdx +1 -1
- package/src/Select/Select.stories.tsx +3 -1
- package/src/Select/Select.test.tsx +4 -4
- package/src/Shell/Shell.mdx +1 -1
- package/src/Shell/Shell.stories.tsx +3 -1
- package/src/Shell/Shell.test.tsx +2 -2
- package/src/Skeleton/Skeleton.mdx +1 -1
- package/src/Skeleton/Skeleton.stories.tsx +3 -1
- package/src/Skeleton/Skeleton.test.tsx +2 -2
- package/src/Slider/Slider.mdx +1 -1
- package/src/Slider/Slider.stories.tsx +3 -1
- package/src/Slider/Slider.test.tsx +2 -2
- package/src/SortableTableHeader/SortableTableHeader.mdx +1 -1
- package/src/SortableTableHeader/SortableTableHeader.stories.tsx +3 -1
- package/src/SortableTableHeader/SortableTableHeader.test.tsx +3 -3
- package/src/Spinner/Spinner.mdx +1 -1
- package/src/Spinner/Spinner.stories.tsx +3 -1
- package/src/Spinner/Spinner.test.tsx +2 -2
- package/src/Stepper/Stepper.mdx +1 -1
- package/src/Stepper/Stepper.stories.tsx +4 -1
- package/src/Stepper/Stepper.test.tsx +7 -7
- package/src/Swatch/Swatch.mdx +1 -1
- package/src/Swatch/Swatch.stories.tsx +4 -1
- package/src/Swatch/Swatch.test.tsx +3 -3
- package/src/Switch/Switch.mdx +1 -1
- package/src/Switch/Switch.stories.tsx +3 -1
- package/src/Switch/Switch.test.tsx +2 -2
- package/src/Tabs/Tabs.mdx +1 -1
- package/src/Tabs/Tabs.stories.tsx +3 -1
- package/src/Tabs/Tabs.test.tsx +3 -3
- package/src/TextLink/TextLink.mdx +1 -1
- package/src/TextLink/TextLink.stories.tsx +3 -1
- package/src/TextLink/TextLink.test.tsx +4 -4
- package/src/TimecodeInput/TimecodeInput.mdx +1 -1
- package/src/TimecodeInput/TimecodeInput.stories.tsx +3 -1
- package/src/Toast/Toast.mdx +1 -1
- package/src/Toast/Toast.stories.tsx +157 -1
- package/src/Toast/Toast.test.tsx +2 -2
- package/src/Toast/ToastRegion.test.tsx +172 -0
- package/src/Toast/ToastRegion.tsx +120 -32
- package/src/Toolbar/Toolbar.mdx +1 -1
- package/src/Toolbar/Toolbar.stories.tsx +3 -1
- package/src/Toolbar/Toolbar.test.tsx +89 -5
- package/src/Toolbar/useToolbarOverflow.ts +43 -0
- package/src/Tooltip/Tooltip.mdx +1 -1
- package/src/Tooltip/Tooltip.stories.tsx +3 -1
- package/src/Tooltip/Tooltip.test.tsx +2 -2
- package/src/VirtualizedGrid/VirtualizedGrid.mdx +1 -1
- package/src/VirtualizedGrid/VirtualizedGrid.stories.tsx +4 -1
- package/src/VirtualizedGrid/VirtualizedGrid.test.tsx +5 -5
- package/src/VisuallyHidden/VisuallyHidden.mdx +1 -1
- package/src/VisuallyHidden/VisuallyHidden.stories.tsx +3 -1
- package/src/markdownEditorCodeMirror/MarkdownEditorCodeMirror.mdx +1 -1
- package/src/markdownEditorCodeMirror/MarkdownEditorCodeMirror.stories.tsx +3 -1
- package/src/markdownEditorCodeMirror/MarkdownEditorCodeMirror.test.tsx +3 -3
- package/src/markdownEditorCodeMirror/MarkdownView.mdx +1 -1
- package/src/markdownEditorCodeMirror/MarkdownView.stories.tsx +4 -1
- package/src/markdownEditorCodeMirror/MarkdownView.test.tsx +44 -20
- package/src/reactRouter/ReactRouterAdapter.stories.tsx +3 -1
- package/src/reactRouter/ReactRouterAdapter.test.tsx +2 -2
package/src/Nav/Nav.mdx
CHANGED
|
@@ -14,7 +14,7 @@ of a phone, or a panel behind one control — the same list, drawn where it fits
|
|
|
14
14
|
> layout and behaves identically, down to the measured whole-row fold — see *`bar` folds
|
|
15
15
|
> whole* below.
|
|
16
16
|
|
|
17
|
-
<Canvas of={NavStories.
|
|
17
|
+
<Canvas of={NavStories.Playground} />
|
|
18
18
|
|
|
19
19
|
## Props
|
|
20
20
|
|
package/src/Nav/Nav.stories.tsx
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
import type { ReactNode } from "react"
|
|
3
4
|
import { useState } from "react"
|
|
@@ -153,7 +154,8 @@ type Story = StoryObj<typeof Nav>
|
|
|
153
154
|
* A header row, which is what an app with a handful of destinations
|
|
154
155
|
* wants: ai-usage, folio, mux-magic, portly-controllers.
|
|
155
156
|
*/
|
|
156
|
-
export const
|
|
157
|
+
export const Playground: Story = {
|
|
158
|
+
parameters: playgroundParameters,
|
|
157
159
|
args: {
|
|
158
160
|
activeHref: "/library",
|
|
159
161
|
items: STATION_ITEMS,
|
package/src/Nav/Nav.test.tsx
CHANGED
|
@@ -12,11 +12,11 @@ import { mountStory } from "../mountStory.testHelpers.ts"
|
|
|
12
12
|
import { expectAgentDrivable } from "../testing/index.ts"
|
|
13
13
|
import * as stories from "./Nav.stories.tsx"
|
|
14
14
|
|
|
15
|
-
const { AllStates, AllVariants,
|
|
15
|
+
const { AllStates, AllVariants, Playground, Interactive } =
|
|
16
16
|
composeStories(stories)
|
|
17
17
|
|
|
18
18
|
test("the destinations are a named navigation landmark", async () => {
|
|
19
|
-
const { canvas } = await mountStory(
|
|
19
|
+
const { canvas } = await mountStory(Playground)
|
|
20
20
|
|
|
21
21
|
const nav = expectAgentDrivable(canvas, {
|
|
22
22
|
name: "Main",
|
|
@@ -33,7 +33,7 @@ test("the destinations are a named navigation landmark", async () => {
|
|
|
33
33
|
* a new tab", the status bar, and "copy link address".
|
|
34
34
|
*/
|
|
35
35
|
test("every destination is a real link with an href", async () => {
|
|
36
|
-
const { canvas } = await mountStory(
|
|
36
|
+
const { canvas } = await mountStory(Playground)
|
|
37
37
|
|
|
38
38
|
const links = canvas.getAllByRole("link")
|
|
39
39
|
|
|
@@ -45,7 +45,7 @@ test("every destination is a real link with an href", async () => {
|
|
|
45
45
|
})
|
|
46
46
|
|
|
47
47
|
test("the current destination is announced, not only coloured", async () => {
|
|
48
|
-
const { canvas } = await mountStory(
|
|
48
|
+
const { canvas } = await mountStory(Playground)
|
|
49
49
|
|
|
50
50
|
const current = canvas.getByRole("link", {
|
|
51
51
|
name: "Library",
|
|
@@ -240,7 +240,7 @@ test("a long label truncates rather than widening the column", async () => {
|
|
|
240
240
|
* button permanently.
|
|
241
241
|
*/
|
|
242
242
|
test("a bar with room shows no menu trigger", async () => {
|
|
243
|
-
const { canvas } = await mountStory(
|
|
243
|
+
const { canvas } = await mountStory(Playground)
|
|
244
244
|
|
|
245
245
|
const nav = canvas.getByRole("navigation", {
|
|
246
246
|
name: "Main",
|
|
@@ -330,7 +330,7 @@ test("a folded destination is still a real link", async () => {
|
|
|
330
330
|
* tell which one a human can see.
|
|
331
331
|
*/
|
|
332
332
|
test("a destination is mounted exactly once", async () => {
|
|
333
|
-
const { canvas } = await mountStory(
|
|
333
|
+
const { canvas } = await mountStory(Playground)
|
|
334
334
|
|
|
335
335
|
expect(
|
|
336
336
|
canvas.getAllByRole("link", { name: "Tonight" }),
|
package/src/NavBar/NavBar.mdx
CHANGED
|
@@ -35,7 +35,7 @@ import * as NavBarStories from "./NavBar.stories";
|
|
|
35
35
|
The app's destinations as real links, in one line — folding into a single menu button,
|
|
36
36
|
**whole**, when that line does not fit.
|
|
37
37
|
|
|
38
|
-
<Canvas of={NavBarStories.
|
|
38
|
+
<Canvas of={NavBarStories.Playground} />
|
|
39
39
|
|
|
40
40
|
## Props
|
|
41
41
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
import type { ReactNode } from "react"
|
|
3
4
|
|
|
@@ -131,7 +132,8 @@ type Story = StoryObj<typeof meta>
|
|
|
131
132
|
* a trigger that shows at every width is not a fold, it is a nav
|
|
132
133
|
* you have permanently hidden.
|
|
133
134
|
*/
|
|
134
|
-
export const
|
|
135
|
+
export const Playground: Story = {
|
|
136
|
+
parameters: playgroundParameters,
|
|
135
137
|
render: (navBarProps) => (
|
|
136
138
|
<Frame inlineSize="52rem">
|
|
137
139
|
<NavBar {...navBarProps} />
|
|
@@ -15,13 +15,13 @@ import * as stories from "./NavBar.stories.tsx"
|
|
|
15
15
|
const {
|
|
16
16
|
AllStates,
|
|
17
17
|
AllVariants,
|
|
18
|
-
|
|
18
|
+
Playground,
|
|
19
19
|
InAppShell,
|
|
20
20
|
Interactive,
|
|
21
21
|
} = composeStories(stories)
|
|
22
22
|
|
|
23
23
|
test("the nav is named, and its destinations are links", async () => {
|
|
24
|
-
const { canvas } = await mountStory(
|
|
24
|
+
const { canvas } = await mountStory(Playground)
|
|
25
25
|
|
|
26
26
|
const nav = expectAgentDrivable(canvas, {
|
|
27
27
|
name: "Main",
|
|
@@ -48,7 +48,7 @@ test("the nav is named, and its destinations are links", async () => {
|
|
|
48
48
|
* button permanently.
|
|
49
49
|
*/
|
|
50
50
|
test("a bar with room shows no menu trigger", async () => {
|
|
51
|
-
const { canvas } = await mountStory(
|
|
51
|
+
const { canvas } = await mountStory(Playground)
|
|
52
52
|
|
|
53
53
|
const nav = expectAgentDrivable(canvas, {
|
|
54
54
|
name: "Main",
|
|
@@ -117,13 +117,55 @@ export const OverlayPanel = ({
|
|
|
117
117
|
// `outsidePress` on a *lower* modal would close it too, so it is
|
|
118
118
|
// scoped to the top — which is also why the scrim needs no click
|
|
119
119
|
// handler of its own.
|
|
120
|
-
outsidePress:
|
|
120
|
+
outsidePress: (event) => {
|
|
121
|
+
if (!isDismissable || !isTop) return false
|
|
122
|
+
/*
|
|
123
|
+
* ⚠️ A press on a toast is NOT an outside press.
|
|
124
|
+
*
|
|
125
|
+
* A `ToastRegion` renders in the page, so floating-ui sees a
|
|
126
|
+
* press on its Undo as a press outside the floating element
|
|
127
|
+
* — and closing the modal on the way to taking an action
|
|
128
|
+
* back is the opposite of what the button says. The region
|
|
129
|
+
* marks itself with `data-charcuterie-toast-region`; nothing
|
|
130
|
+
* else in the fleet carries that attribute.
|
|
131
|
+
*
|
|
132
|
+
* ⚠️ Do not delete this on the evidence of a small story.
|
|
133
|
+
* floating-ui has a *second*, accidental guard that hides
|
|
134
|
+
* this one: `closeOnPressOutside` bails out early when the
|
|
135
|
+
* press target's body-level ancestor contains none of the
|
|
136
|
+
* `[data-floating-ui-inert]` markers `markOthers` left
|
|
137
|
+
* behind, on the theory that such an element was injected
|
|
138
|
+
* after the panel opened. A page that is nothing but a
|
|
139
|
+
* region takes that branch and never reaches this predicate
|
|
140
|
+
* at all. A page with content beside the region — every real
|
|
141
|
+
* app — does reach it. `Toast.stories.tsx`'s
|
|
142
|
+
* `OverStackedModals` carries a heading and a paragraph for
|
|
143
|
+
* exactly that reason, and `ToastRegion.test.tsx` fails
|
|
144
|
+
* without this predicate only because they are there.
|
|
145
|
+
*/
|
|
146
|
+
const target = event.target as Element | null
|
|
147
|
+
return (
|
|
148
|
+
target?.closest?.(
|
|
149
|
+
"[data-charcuterie-toast-region]",
|
|
150
|
+
) == null
|
|
151
|
+
)
|
|
152
|
+
},
|
|
121
153
|
}),
|
|
122
154
|
useRole(context, { role }),
|
|
123
155
|
])
|
|
124
156
|
|
|
125
157
|
const { register, unregister } = stack
|
|
126
158
|
|
|
159
|
+
/**
|
|
160
|
+
* Where this panel sits in the stack, and therefore how far above
|
|
161
|
+
* `--layer-modal` it paints. `0` when unprovided — a lone `Modal`
|
|
162
|
+
* is the only thing open.
|
|
163
|
+
*/
|
|
164
|
+
const stackIndex = Math.max(
|
|
165
|
+
stack.orderedIds.indexOf(id),
|
|
166
|
+
0,
|
|
167
|
+
)
|
|
168
|
+
|
|
127
169
|
useEffect(() => {
|
|
128
170
|
if (!isVisible) {
|
|
129
171
|
return
|
|
@@ -169,7 +211,26 @@ export const OverlayPanel = ({
|
|
|
169
211
|
)}
|
|
170
212
|
|
|
171
213
|
<FloatingPortal>
|
|
172
|
-
<div
|
|
214
|
+
<div
|
|
215
|
+
className="fixed inset-0 flex items-center justify-center"
|
|
216
|
+
/*
|
|
217
|
+
* ⚠️ Cascading, not one shared layer.
|
|
218
|
+
*
|
|
219
|
+
* Every panel used to render at the one `--layer-modal`, and
|
|
220
|
+
* which of two open modals painted on top fell out of the
|
|
221
|
+
* order their portals happened to be appended in. A modal
|
|
222
|
+
* opened from inside another is the case that made this
|
|
223
|
+
* visible. The index in the stack is the answer the stack
|
|
224
|
+
* already knows.
|
|
225
|
+
*
|
|
226
|
+
* The scale's gaps are 100, so a cascade this deep is
|
|
227
|
+
* arithmetic nobody has to think about — and the toast sits
|
|
228
|
+
* at `--layer-toast` plus the same depth, above all of it.
|
|
229
|
+
*/
|
|
230
|
+
style={{
|
|
231
|
+
zIndex: `calc(var(--layer-modal) + ${stackIndex})`,
|
|
232
|
+
}}
|
|
233
|
+
>
|
|
173
234
|
<FloatingFocusManager
|
|
174
235
|
context={context}
|
|
175
236
|
// `undefined` keeps the manager's own default (the first
|
|
@@ -40,6 +40,11 @@ export type OverlayStackEntry = {
|
|
|
40
40
|
|
|
41
41
|
export type OverlayStackValue = {
|
|
42
42
|
depth: number
|
|
43
|
+
/**
|
|
44
|
+
* The open ids, oldest first. A panel reads its own index out of
|
|
45
|
+
* this to cascade its z-index above the one below it.
|
|
46
|
+
*/
|
|
47
|
+
orderedIds: string[]
|
|
43
48
|
/**
|
|
44
49
|
* `false` in the context default. An `OverlayPanel` reads this to
|
|
45
50
|
* decide whether to render its own scrim (unprovided) or defer to
|
|
@@ -56,6 +61,7 @@ export type OverlayStackValue = {
|
|
|
56
61
|
const DEFAULT_STACK: OverlayStackValue = {
|
|
57
62
|
depth: 0,
|
|
58
63
|
isProvided: false,
|
|
64
|
+
orderedIds: [],
|
|
59
65
|
register: () => {},
|
|
60
66
|
requestCloseTop: () => {},
|
|
61
67
|
topId: null,
|
|
@@ -76,7 +82,6 @@ export const OverlayStackProvider = ({
|
|
|
76
82
|
const [entries, setEntries] = useState<
|
|
77
83
|
OverlayStackEntry[]
|
|
78
84
|
>([])
|
|
79
|
-
|
|
80
85
|
// Read through a ref so `requestCloseTop` stays stable while still
|
|
81
86
|
// seeing the live top.
|
|
82
87
|
const entriesRef = useLatestRef(entries)
|
|
@@ -112,6 +117,7 @@ export const OverlayStackProvider = ({
|
|
|
112
117
|
() => ({
|
|
113
118
|
depth: entries.length,
|
|
114
119
|
isProvided: true,
|
|
120
|
+
orderedIds: entries.map((one) => one.id),
|
|
115
121
|
register,
|
|
116
122
|
requestCloseTop,
|
|
117
123
|
topId: entries.at(-1)?.id ?? null,
|
package/src/Picker/Picker.mdx
CHANGED
|
@@ -9,7 +9,7 @@ import * as PickerStories from "./Picker.stories.tsx"
|
|
|
9
9
|
A `Listbox` with its trigger already attached — the shape an app reaches for when it wants
|
|
10
10
|
"a select, but ours".
|
|
11
11
|
|
|
12
|
-
<Canvas of={PickerStories.
|
|
12
|
+
<Canvas of={PickerStories.Playground} />
|
|
13
13
|
|
|
14
14
|
## Why this exists when `Listbox` already does
|
|
15
15
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
import type { ReactNode } from "react"
|
|
3
4
|
import { useState } from "react"
|
|
@@ -106,7 +107,8 @@ const PickerHarness = ({
|
|
|
106
107
|
* The assembled default: a button showing the current value, a
|
|
107
108
|
* chevron, and the `Listbox` panel already wired to it.
|
|
108
109
|
*/
|
|
109
|
-
export const
|
|
110
|
+
export const Playground: Story = {
|
|
111
|
+
parameters: playgroundParameters,
|
|
110
112
|
render: () => (
|
|
111
113
|
<PickerHarness
|
|
112
114
|
initialValue="eng"
|
|
@@ -7,12 +7,12 @@ import { mountStory } from "../mountStory.testHelpers.ts"
|
|
|
7
7
|
import { expectAgentDrivable } from "../testing/index.ts"
|
|
8
8
|
import * as stories from "./Picker.stories.tsx"
|
|
9
9
|
|
|
10
|
-
const { AllStates,
|
|
10
|
+
const { AllStates, Playground, Interactive, NextToText } =
|
|
11
11
|
composeStories(stories)
|
|
12
12
|
|
|
13
13
|
test("the trigger's accessible name carries the current value", async () => {
|
|
14
14
|
const { canvas, canvasElement } =
|
|
15
|
-
await mountStory(
|
|
15
|
+
await mountStory(Playground)
|
|
16
16
|
|
|
17
17
|
// Not a bare "Language": the button's VISIBLE text is the value, and
|
|
18
18
|
// WCAG 2.5.3 wants the visible text inside the accessible name.
|
package/src/Popover/Popover.mdx
CHANGED
|
@@ -11,7 +11,7 @@ for one reason: **Radix owns `open`.** Wrapping it leaves `useVisibility` and Ra
|
|
|
11
11
|
believing they hold the state, which is the conflict the whole state layer exists to
|
|
12
12
|
avoid.
|
|
13
13
|
|
|
14
|
-
<Canvas of={PopoverStories.
|
|
14
|
+
<Canvas of={PopoverStories.Playground} />
|
|
15
15
|
|
|
16
16
|
## Props
|
|
17
17
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useVisibility } from "@charcuterie/logic"
|
|
2
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
2
3
|
import type { Placement } from "@floating-ui/react"
|
|
3
4
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
4
5
|
import type { ReactNode } from "react"
|
|
@@ -73,7 +74,8 @@ const PopoverDemo = ({
|
|
|
73
74
|
)
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
export const
|
|
77
|
+
export const Playground: Story = {
|
|
78
|
+
parameters: playgroundParameters,
|
|
77
79
|
args: {
|
|
78
80
|
children: null,
|
|
79
81
|
heading: "Filters",
|
|
@@ -10,14 +10,14 @@ import * as stories from "./Popover.stories.tsx"
|
|
|
10
10
|
const {
|
|
11
11
|
AllStates,
|
|
12
12
|
AllVariants,
|
|
13
|
-
|
|
13
|
+
Playground,
|
|
14
14
|
EscapesOverflowClip,
|
|
15
15
|
Interactive,
|
|
16
16
|
Responsive,
|
|
17
17
|
} = composeStories(stories)
|
|
18
18
|
|
|
19
19
|
test("the trigger and the panel agree about each other", async () => {
|
|
20
|
-
const { body, canvas } = await mountStory(
|
|
20
|
+
const { body, canvas } = await mountStory(Playground)
|
|
21
21
|
|
|
22
22
|
const trigger = expectAgentDrivable(canvas, {
|
|
23
23
|
name: "Filters",
|
|
@@ -13,7 +13,7 @@ points-market's "Who's shopping?" is the shape this is taken from. It had been h
|
|
|
13
13
|
there since the app was built, and it is the third tile shape the fleet grew on its own,
|
|
14
14
|
after mux-magic's and Gallery Downloader's "Pick a tool" cards.
|
|
15
15
|
|
|
16
|
-
<Canvas of={PortraitTilesStories.
|
|
16
|
+
<Canvas of={PortraitTilesStories.Playground} />
|
|
17
17
|
|
|
18
18
|
## Props
|
|
19
19
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
|
|
3
4
|
import { controlSizeArgType } from "../argTypes.storyHelpers.ts"
|
|
@@ -154,7 +155,8 @@ export default meta
|
|
|
154
155
|
|
|
155
156
|
type Story = StoryObj<typeof meta>
|
|
156
157
|
|
|
157
|
-
export const
|
|
158
|
+
export const Playground: Story = {
|
|
159
|
+
parameters: playgroundParameters,
|
|
158
160
|
args: {
|
|
159
161
|
items: SHOPPER_ITEMS,
|
|
160
162
|
label: "Who's shopping?",
|
|
@@ -11,7 +11,7 @@ const {
|
|
|
11
11
|
AllStates,
|
|
12
12
|
AllVariants,
|
|
13
13
|
DataColours,
|
|
14
|
-
|
|
14
|
+
Playground,
|
|
15
15
|
Interactive,
|
|
16
16
|
NamedHues,
|
|
17
17
|
Responsive,
|
|
@@ -20,7 +20,7 @@ const {
|
|
|
20
20
|
|
|
21
21
|
test("it is a named group of pressable portraits", async () => {
|
|
22
22
|
const { canvas, canvasElement } =
|
|
23
|
-
await mountStory(
|
|
23
|
+
await mountStory(Playground)
|
|
24
24
|
|
|
25
25
|
const group = expectAgentDrivable(canvas, {
|
|
26
26
|
name: "Who's shopping?",
|
|
@@ -50,7 +50,7 @@ test("it is a named group of pressable portraits", async () => {
|
|
|
50
50
|
* thing the portrait was being chosen by.
|
|
51
51
|
*/
|
|
52
52
|
test("the name, the number and its unit are one accessible name", async () => {
|
|
53
|
-
const { canvas } = await mountStory(
|
|
53
|
+
const { canvas } = await mountStory(Playground)
|
|
54
54
|
|
|
55
55
|
expectAgentDrivable(canvas, {
|
|
56
56
|
name: "Avery 1,240 points",
|
|
@@ -194,7 +194,7 @@ test("a fixed layout skips the query", async () => {
|
|
|
194
194
|
* how a token name that did not exist shipped in Docket.
|
|
195
195
|
*/
|
|
196
196
|
test("each portrait wears a different hue, and a named one holds it", async () => {
|
|
197
|
-
const { canvas } = await mountStory(
|
|
197
|
+
const { canvas } = await mountStory(Playground)
|
|
198
198
|
|
|
199
199
|
const faces = Array.from(
|
|
200
200
|
expectAgentDrivable(canvas, {
|
|
@@ -380,7 +380,7 @@ test("an href portrait is a real anchor", async () => {
|
|
|
380
380
|
* promise that survives exactly one edit.
|
|
381
381
|
*/
|
|
382
382
|
test("a portrait is the same box as an action tile", async () => {
|
|
383
|
-
const { canvas } = await mountStory(
|
|
383
|
+
const { canvas } = await mountStory(Playground)
|
|
384
384
|
|
|
385
385
|
const portrait = expectAgentDrivable(canvas, {
|
|
386
386
|
name: "Avery 1,240 points",
|
|
@@ -13,7 +13,7 @@ are a `<div>` with a percentage width: invisible to assistive technology and to
|
|
|
13
13
|
This is the union — rip-deck's ARIA and its indeterminate sweep, plus threshold colours
|
|
14
14
|
nobody has yet.
|
|
15
15
|
|
|
16
|
-
<Canvas of={ProgressBarStories.
|
|
16
|
+
<Canvas of={ProgressBarStories.Playground} />
|
|
17
17
|
|
|
18
18
|
## Props
|
|
19
19
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
import { useState } from "react"
|
|
3
4
|
|
|
@@ -43,7 +44,8 @@ type Story = StoryObj<typeof meta>
|
|
|
43
44
|
* is not printed, and the value sits on the *track* — so an agent's
|
|
44
45
|
* bounding box is the widget, not the filled 38%.
|
|
45
46
|
*/
|
|
46
|
-
export const
|
|
47
|
+
export const Playground: Story = {
|
|
48
|
+
parameters: playgroundParameters,
|
|
47
49
|
args: { label: "Ripping title 4 of 9", value: 38 },
|
|
48
50
|
}
|
|
49
51
|
|
|
@@ -6,11 +6,11 @@ import { mountStory } from "../mountStory.testHelpers.ts"
|
|
|
6
6
|
import { expectAgentDrivable } from "../testing/index.ts"
|
|
7
7
|
import * as stories from "./ProgressBar.stories.tsx"
|
|
8
8
|
|
|
9
|
-
const {
|
|
9
|
+
const { Playground, Indeterminate, Interactive } =
|
|
10
10
|
composeStories(stories)
|
|
11
11
|
|
|
12
12
|
test("the name is real and the value sits on the track", async () => {
|
|
13
|
-
const { canvas } = await mountStory(
|
|
13
|
+
const { canvas } = await mountStory(Playground)
|
|
14
14
|
|
|
15
15
|
const bar = expectAgentDrivable(canvas, {
|
|
16
16
|
name: "Ripping title 4 of 9",
|
|
@@ -14,7 +14,7 @@ mail rules (leaf = field/operator/value, combinators AND/OR) and mux-magic's job
|
|
|
14
14
|
combinator** are fully opaque here — `Combinator` and `Leaf` only ever pass through to the
|
|
15
15
|
consumer's `renderLeaf` and `combinatorOptions`.
|
|
16
16
|
|
|
17
|
-
<Canvas of={QueryBuilderStories.
|
|
17
|
+
<Canvas of={QueryBuilderStories.Playground} />
|
|
18
18
|
|
|
19
19
|
## Props
|
|
20
20
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SerializedTree } from "@charcuterie/logic"
|
|
2
2
|
import { createTree, useTree } from "@charcuterie/logic"
|
|
3
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
3
4
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
4
5
|
import type { ReactNode } from "react"
|
|
5
6
|
import { useState } from "react"
|
|
@@ -194,7 +195,8 @@ type Story = StoryObj<typeof meta>
|
|
|
194
195
|
* A flat group of two conditions joined by ALL. Change the combinator,
|
|
195
196
|
* edit a condition, or add another with "+ Add condition".
|
|
196
197
|
*/
|
|
197
|
-
export const
|
|
198
|
+
export const Playground: Story = {
|
|
199
|
+
parameters: playgroundParameters,
|
|
198
200
|
render: () => (
|
|
199
201
|
<QueryBuilderHarness initialTree={FLAT_TREE} />
|
|
200
202
|
),
|
|
@@ -10,13 +10,13 @@ import * as stories from "./QueryBuilder.stories.tsx"
|
|
|
10
10
|
const {
|
|
11
11
|
AllStates,
|
|
12
12
|
CustomCombinator,
|
|
13
|
-
|
|
13
|
+
Playground,
|
|
14
14
|
Interactive,
|
|
15
15
|
} = composeStories(stories)
|
|
16
16
|
|
|
17
17
|
test("the root group exposes its combinator as a named 'Match' control", async () => {
|
|
18
18
|
const { canvas, canvasElement } =
|
|
19
|
-
await mountStory(
|
|
19
|
+
await mountStory(Playground)
|
|
20
20
|
|
|
21
21
|
// One root group, so exactly one combinator picker. It is a
|
|
22
22
|
// `Listbox` trigger, so the control is a button that opens a
|
|
@@ -16,7 +16,7 @@ each option carries a real sentence and an in-line strip would wrap. Choosing be
|
|
|
16
16
|
is layout, not behaviour, which is why the keyboard model is identical and lives in the same
|
|
17
17
|
two hooks.
|
|
18
18
|
|
|
19
|
-
<Canvas of={RadioGroupStories.
|
|
19
|
+
<Canvas of={RadioGroupStories.Playground} />
|
|
20
20
|
|
|
21
21
|
## Props
|
|
22
22
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
|
|
3
4
|
import { controlSizeArgType } from "../argTypes.storyHelpers.ts"
|
|
@@ -98,7 +99,8 @@ export default meta
|
|
|
98
99
|
|
|
99
100
|
type Story = StoryObj<typeof meta>
|
|
100
101
|
|
|
101
|
-
export const
|
|
102
|
+
export const Playground: Story = {
|
|
103
|
+
parameters: playgroundParameters,
|
|
102
104
|
args: { items: NAMING_ITEMS, label: "Naming scheme" },
|
|
103
105
|
}
|
|
104
106
|
|
|
@@ -9,7 +9,7 @@ import * as stories from "./RadioGroup.stories.tsx"
|
|
|
9
9
|
|
|
10
10
|
const {
|
|
11
11
|
AllStates,
|
|
12
|
-
|
|
12
|
+
Playground,
|
|
13
13
|
Interactive,
|
|
14
14
|
Responsive,
|
|
15
15
|
Tiles,
|
|
@@ -30,7 +30,7 @@ const getOptions = (group: HTMLElement) =>
|
|
|
30
30
|
|
|
31
31
|
test("it is a radio group with exactly one option checked", async () => {
|
|
32
32
|
const { canvas, canvasElement } =
|
|
33
|
-
await mountStory(
|
|
33
|
+
await mountStory(Playground)
|
|
34
34
|
|
|
35
35
|
const group = expectAgentDrivable(canvas, {
|
|
36
36
|
name: "Naming scheme",
|
package/src/Rail/Rail.mdx
CHANGED
|
@@ -9,7 +9,7 @@ import * as RailStories from "./Rail.stories";
|
|
|
9
9
|
A side column — the app's sections, a filter panel, the selected job's detail. `side` places
|
|
10
10
|
it, `landmark` decides what it is, and `label` is required.
|
|
11
11
|
|
|
12
|
-
<Canvas of={RailStories.
|
|
12
|
+
<Canvas of={RailStories.Playground} />
|
|
13
13
|
|
|
14
14
|
## Props
|
|
15
15
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
|
|
3
4
|
import { toStoryChoice } from "../argTypes.storyHelpers.ts"
|
|
@@ -40,7 +41,8 @@ type Story = StoryObj<typeof meta>
|
|
|
40
41
|
* name: "Sections" })` is what distinguishes its "Settings" link
|
|
41
42
|
* from the header's "Settings" button.
|
|
42
43
|
*/
|
|
43
|
-
export const
|
|
44
|
+
export const Playground: Story = {
|
|
45
|
+
parameters: playgroundParameters,
|
|
44
46
|
args: {
|
|
45
47
|
label: "Sections",
|
|
46
48
|
landmark: "navigation",
|
package/src/Rail/Rail.test.tsx
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from "../viewport.testHelpers.ts"
|
|
13
13
|
import * as stories from "./Rail.stories.tsx"
|
|
14
14
|
|
|
15
|
-
const { AllVariants,
|
|
15
|
+
const { AllVariants, Playground, Interactive, Responsive } =
|
|
16
16
|
composeStories(stories)
|
|
17
17
|
|
|
18
18
|
afterAll(async () => {
|
|
@@ -144,7 +144,7 @@ test("the rail scopes its own links away from the header's", async () => {
|
|
|
144
144
|
})
|
|
145
145
|
|
|
146
146
|
test("a single start rail is clean under axe", async () => {
|
|
147
|
-
const { canvasElement } = await mountStory(
|
|
147
|
+
const { canvasElement } = await mountStory(Playground)
|
|
148
148
|
|
|
149
149
|
await expectNoAxeViolations(canvasElement)
|
|
150
150
|
})
|
|
@@ -14,7 +14,7 @@ they typed into a `TimecodeInput` beside it. So the shape this is built for is a
|
|
|
14
14
|
timeline — a bar spanning the whole runtime, two thumbs, and the chosen span painted
|
|
15
15
|
between them.
|
|
16
16
|
|
|
17
|
-
<Canvas of={RangeSliderStories.
|
|
17
|
+
<Canvas of={RangeSliderStories.Playground} />
|
|
18
18
|
|
|
19
19
|
## Props
|
|
20
20
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
import { useState } from "react"
|
|
3
4
|
|
|
@@ -98,7 +99,8 @@ export default meta
|
|
|
98
99
|
|
|
99
100
|
type Story = StoryObj<typeof meta>
|
|
100
101
|
|
|
101
|
-
export const
|
|
102
|
+
export const Playground: Story = {
|
|
103
|
+
parameters: playgroundParameters,
|
|
102
104
|
args: {
|
|
103
105
|
label: "Clip",
|
|
104
106
|
max: 2_700,
|
|
@@ -7,8 +7,12 @@ import { mountStory } from "../mountStory.testHelpers.ts"
|
|
|
7
7
|
import { expectAgentDrivable } from "../testing/index.ts"
|
|
8
8
|
import * as stories from "./RangeSlider.stories.tsx"
|
|
9
9
|
|
|
10
|
-
const {
|
|
11
|
-
|
|
10
|
+
const {
|
|
11
|
+
AllStates,
|
|
12
|
+
BesideTheSlider,
|
|
13
|
+
Playground,
|
|
14
|
+
Interactive,
|
|
15
|
+
} = composeStories(stories)
|
|
12
16
|
|
|
13
17
|
/** A fraction along the bar, as viewport coordinates. */
|
|
14
18
|
const pointerAt =
|
|
@@ -39,7 +43,7 @@ const readThumbStyles = (thumb: Element) => {
|
|
|
39
43
|
|
|
40
44
|
test("it is two named sliders inside one named group", async () => {
|
|
41
45
|
const { canvas, canvasElement } =
|
|
42
|
-
await mountStory(
|
|
46
|
+
await mountStory(Playground)
|
|
43
47
|
|
|
44
48
|
const start = expectAgentDrivable(canvas, {
|
|
45
49
|
name: "Clip start",
|
|
@@ -8,7 +8,7 @@ import * as ReorderListStories from "./ReorderList.stories";
|
|
|
8
8
|
|
|
9
9
|
A vertical list put in a different order — by two buttons, or by dragging a handle.
|
|
10
10
|
|
|
11
|
-
<Canvas of={ReorderListStories.
|
|
11
|
+
<Canvas of={ReorderListStories.Playground} />
|
|
12
12
|
|
|
13
13
|
## Props
|
|
14
14
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
|
|
1
2
|
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
3
|
import { useState } from "react"
|
|
3
4
|
|
|
@@ -133,7 +134,8 @@ type Story = StoryObj<typeof meta>
|
|
|
133
134
|
* A checklist in the order it will be worked through. Press ↑ or ↓,
|
|
134
135
|
* or press and hold the position and drag it somewhere else.
|
|
135
136
|
*/
|
|
136
|
-
export const
|
|
137
|
+
export const Playground: Story = {
|
|
138
|
+
parameters: playgroundParameters,
|
|
137
139
|
render: () => <StoryList />,
|
|
138
140
|
}
|
|
139
141
|
|