@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.
Files changed (226) hide show
  1. package/README.md +7 -2
  2. package/dist/Card/Card.d.ts +5 -2
  3. package/dist/Card/Card.d.ts.map +1 -1
  4. package/dist/Card/Card.js +23 -3
  5. package/dist/Card/Card.js.map +1 -1
  6. package/dist/Overlay/OverlayPanel.d.ts.map +1 -1
  7. package/dist/Overlay/OverlayPanel.js +54 -2
  8. package/dist/Overlay/OverlayPanel.js.map +1 -1
  9. package/dist/Overlay/OverlayStack.d.ts +5 -0
  10. package/dist/Overlay/OverlayStack.d.ts.map +1 -1
  11. package/dist/Overlay/OverlayStack.js +2 -0
  12. package/dist/Overlay/OverlayStack.js.map +1 -1
  13. package/dist/Toast/ToastRegion.d.ts +61 -0
  14. package/dist/Toast/ToastRegion.d.ts.map +1 -1
  15. package/dist/Toast/ToastRegion.js +80 -3
  16. package/dist/Toast/ToastRegion.js.map +1 -1
  17. package/dist/Toolbar/useToolbarOverflow.d.ts.map +1 -1
  18. package/dist/Toolbar/useToolbarOverflow.js +39 -0
  19. package/dist/Toolbar/useToolbarOverflow.js.map +1 -1
  20. package/package.json +3 -2
  21. package/src/Accordion/Accordion.mdx +1 -1
  22. package/src/Accordion/Accordion.stories.tsx +3 -1
  23. package/src/Accordion/Accordion.test.tsx +4 -4
  24. package/src/ActionTiles/ActionTiles.mdx +1 -1
  25. package/src/ActionTiles/ActionTiles.stories.tsx +3 -1
  26. package/src/ActionTiles/ActionTiles.test.tsx +3 -3
  27. package/src/AdaptiveGrid/AdaptiveGrid.mdx +1 -1
  28. package/src/AdaptiveGrid/AdaptiveGrid.stories.tsx +3 -1
  29. package/src/AdaptiveGrid/AdaptiveGrid.test.tsx +5 -5
  30. package/src/Alert/Alert.mdx +1 -1
  31. package/src/Alert/Alert.stories.tsx +3 -1
  32. package/src/Alert/Alert.test.tsx +2 -2
  33. package/src/Avatar/Avatar.mdx +1 -1
  34. package/src/Avatar/Avatar.stories.tsx +4 -1
  35. package/src/Avatar/Avatar.test.tsx +2 -2
  36. package/src/Badge/Badge.mdx +1 -1
  37. package/src/Badge/Badge.stories.tsx +3 -1
  38. package/src/Badge/Badge.test.tsx +3 -3
  39. package/src/BadgeButton/BadgeButton.mdx +1 -1
  40. package/src/BadgeButton/BadgeButton.stories.tsx +3 -1
  41. package/src/BadgeButton/BadgeButton.test.tsx +2 -2
  42. package/src/Board/Board.mdx +1 -1
  43. package/src/Board/Board.stories.tsx +4 -1
  44. package/src/Board/Board.test.tsx +2 -2
  45. package/src/Button/Button.mdx +1 -1
  46. package/src/Button/Button.stories.tsx +3 -1
  47. package/src/Button/Button.test.tsx +2 -2
  48. package/src/ButtonLink/ButtonLink.mdx +1 -1
  49. package/src/ButtonLink/ButtonLink.stories.tsx +3 -1
  50. package/src/ButtonLink/ButtonLink.test.tsx +3 -3
  51. package/src/Card/Card.mdx +21 -1
  52. package/src/Card/Card.stories.tsx +91 -1
  53. package/src/Card/Card.test.tsx +60 -3
  54. package/src/Card/Card.tsx +24 -2
  55. package/src/Checkbox/Checkbox.mdx +1 -1
  56. package/src/Checkbox/Checkbox.stories.tsx +3 -1
  57. package/src/Checkbox/Checkbox.test.tsx +4 -4
  58. package/src/ColorSchemeSwitcher/ColorSchemeSwitcher.mdx +1 -1
  59. package/src/ColorSchemeSwitcher/ColorSchemeSwitcher.stories.tsx +3 -1
  60. package/src/ColorSchemeSwitcher/ColorSchemeSwitcher.test.tsx +5 -5
  61. package/src/ColorSchemeToggle/ColorSchemeToggle.mdx +1 -1
  62. package/src/ColorSchemeToggle/ColorSchemeToggle.stories.tsx +3 -1
  63. package/src/ColorSchemeToggle/ColorSchemeToggle.test.tsx +5 -5
  64. package/src/Combobox/Combobox.mdx +1 -1
  65. package/src/Combobox/Combobox.stories.tsx +3 -1
  66. package/src/Combobox/Combobox.test.tsx +2 -2
  67. package/src/CopyButton/CopyButton.mdx +1 -1
  68. package/src/CopyButton/CopyButton.stories.tsx +4 -1
  69. package/src/CopyButton/CopyButton.test.tsx +3 -3
  70. package/src/DataTable/DataTable.mdx +1 -1
  71. package/src/DataTable/DataTable.stories.tsx +3 -1
  72. package/src/DataTable/DataTable.test.tsx +3 -3
  73. package/src/DatePicker/DatePicker.mdx +1 -1
  74. package/src/DatePicker/DatePicker.stories.tsx +3 -1
  75. package/src/DatePicker/DatePicker.test.tsx +3 -3
  76. package/src/DatePicker/plainDate.test.ts +21 -3
  77. package/src/Dialog/Dialog.mdx +1 -1
  78. package/src/Dialog/Dialog.stories.tsx +3 -1
  79. package/src/Dialog/Dialog.test.tsx +2 -2
  80. package/src/DropRail/DropRail.mdx +1 -1
  81. package/src/DropRail/DropRail.stories.tsx +4 -1
  82. package/src/DropRail/DropRail.test.tsx +4 -4
  83. package/src/EmptyState/EmptyState.mdx +1 -1
  84. package/src/EmptyState/EmptyState.stories.tsx +3 -1
  85. package/src/EmptyState/EmptyState.test.tsx +2 -2
  86. package/src/Field/Field.mdx +1 -1
  87. package/src/Field/Field.stories.tsx +3 -1
  88. package/src/Field/Field.test.tsx +4 -4
  89. package/src/FileDropZone/FileDropZone.mdx +1 -1
  90. package/src/FileDropZone/FileDropZone.stories.tsx +3 -1
  91. package/src/FileDropZone/FileDropZone.test.tsx +3 -3
  92. package/src/Header/Header.mdx +1 -1
  93. package/src/Header/Header.stories.tsx +3 -1
  94. package/src/IconButton/IconButton.mdx +1 -1
  95. package/src/IconButton/IconButton.stories.tsx +3 -1
  96. package/src/IconButton/IconButton.test.tsx +2 -2
  97. package/src/Lightbox/Lightbox.mdx +1 -1
  98. package/src/Lightbox/Lightbox.stories.tsx +3 -1
  99. package/src/Lightbox/Lightbox.test.tsx +2 -2
  100. package/src/Listbox/Listbox.mdx +1 -1
  101. package/src/Listbox/Listbox.stories.tsx +3 -1
  102. package/src/Listbox/Listbox.test.tsx +5 -5
  103. package/src/LiveStatusIndicator/LiveStatusIndicator.mdx +1 -1
  104. package/src/LiveStatusIndicator/LiveStatusIndicator.stories.tsx +3 -1
  105. package/src/LiveStatusIndicator/LiveStatusIndicator.test.tsx +2 -2
  106. package/src/LogViewer/LogViewer.mdx +1 -1
  107. package/src/LogViewer/LogViewer.stories.tsx +3 -1
  108. package/src/LogViewer/LogViewer.test.tsx +2 -2
  109. package/src/Main/Main.mdx +1 -1
  110. package/src/Main/Main.stories.tsx +3 -1
  111. package/src/Main/Main.test.tsx +3 -3
  112. package/src/MarkdownEditor/MarkdownEditor.mdx +1 -1
  113. package/src/MarkdownEditor/MarkdownEditor.stories.tsx +3 -1
  114. package/src/MarkdownEditor/MarkdownEditor.test.tsx +4 -4
  115. package/src/MarkdownLine/MarkdownLine.mdx +1 -1
  116. package/src/MarkdownLine/MarkdownLine.stories.tsx +4 -1
  117. package/src/MarkdownLine/MarkdownLine.test.tsx +3 -3
  118. package/src/MediaTile/MediaTile.stories.tsx +3 -1
  119. package/src/MediaTile/MediaTile.test.tsx +2 -2
  120. package/src/Menu/Menu.mdx +1 -1
  121. package/src/Menu/Menu.stories.tsx +3 -1
  122. package/src/Modal/Modal.mdx +1 -1
  123. package/src/Modal/Modal.stories.tsx +3 -1
  124. package/src/Modal/Modal.test.tsx +3 -3
  125. package/src/Nav/Nav.mdx +1 -1
  126. package/src/Nav/Nav.stories.tsx +3 -1
  127. package/src/Nav/Nav.test.tsx +6 -6
  128. package/src/NavBar/NavBar.mdx +1 -1
  129. package/src/NavBar/NavBar.stories.tsx +3 -1
  130. package/src/NavBar/NavBar.test.tsx +3 -3
  131. package/src/Overlay/OverlayPanel.tsx +63 -2
  132. package/src/Overlay/OverlayStack.tsx +7 -1
  133. package/src/Picker/Picker.mdx +1 -1
  134. package/src/Picker/Picker.stories.tsx +3 -1
  135. package/src/Picker/Picker.test.tsx +2 -2
  136. package/src/Popover/Popover.mdx +1 -1
  137. package/src/Popover/Popover.stories.tsx +3 -1
  138. package/src/Popover/Popover.test.tsx +2 -2
  139. package/src/PortraitTiles/PortraitTiles.mdx +1 -1
  140. package/src/PortraitTiles/PortraitTiles.stories.tsx +3 -1
  141. package/src/PortraitTiles/PortraitTiles.test.tsx +5 -5
  142. package/src/ProgressBar/ProgressBar.mdx +1 -1
  143. package/src/ProgressBar/ProgressBar.stories.tsx +3 -1
  144. package/src/ProgressBar/ProgressBar.test.tsx +2 -2
  145. package/src/QueryBuilder/QueryBuilder.mdx +1 -1
  146. package/src/QueryBuilder/QueryBuilder.stories.tsx +3 -1
  147. package/src/QueryBuilder/QueryBuilder.test.tsx +2 -2
  148. package/src/RadioGroup/RadioGroup.mdx +1 -1
  149. package/src/RadioGroup/RadioGroup.stories.tsx +3 -1
  150. package/src/RadioGroup/RadioGroup.test.tsx +2 -2
  151. package/src/Rail/Rail.mdx +1 -1
  152. package/src/Rail/Rail.stories.tsx +3 -1
  153. package/src/Rail/Rail.test.tsx +2 -2
  154. package/src/RangeSlider/RangeSlider.mdx +1 -1
  155. package/src/RangeSlider/RangeSlider.stories.tsx +3 -1
  156. package/src/RangeSlider/RangeSlider.test.tsx +7 -3
  157. package/src/ReorderList/ReorderList.mdx +1 -1
  158. package/src/ReorderList/ReorderList.stories.tsx +3 -1
  159. package/src/ReorderList/ReorderList.test.tsx +7 -7
  160. package/src/RouterLink/UnstyledLink.stories.tsx +4 -1
  161. package/src/RouterLink/UnstyledLink.test.tsx +2 -2
  162. package/src/SearchInput/SearchInput.mdx +1 -1
  163. package/src/SearchInput/SearchInput.stories.tsx +3 -1
  164. package/src/SegmentedControl/SegmentedControl.mdx +1 -1
  165. package/src/SegmentedControl/SegmentedControl.stories.tsx +3 -1
  166. package/src/SegmentedControl/SegmentedControl.test.tsx +2 -2
  167. package/src/Select/Select.mdx +1 -1
  168. package/src/Select/Select.stories.tsx +3 -1
  169. package/src/Select/Select.test.tsx +4 -4
  170. package/src/Shell/Shell.mdx +1 -1
  171. package/src/Shell/Shell.stories.tsx +3 -1
  172. package/src/Shell/Shell.test.tsx +2 -2
  173. package/src/Skeleton/Skeleton.mdx +1 -1
  174. package/src/Skeleton/Skeleton.stories.tsx +3 -1
  175. package/src/Skeleton/Skeleton.test.tsx +2 -2
  176. package/src/Slider/Slider.mdx +1 -1
  177. package/src/Slider/Slider.stories.tsx +3 -1
  178. package/src/Slider/Slider.test.tsx +2 -2
  179. package/src/SortableTableHeader/SortableTableHeader.mdx +1 -1
  180. package/src/SortableTableHeader/SortableTableHeader.stories.tsx +3 -1
  181. package/src/SortableTableHeader/SortableTableHeader.test.tsx +3 -3
  182. package/src/Spinner/Spinner.mdx +1 -1
  183. package/src/Spinner/Spinner.stories.tsx +3 -1
  184. package/src/Spinner/Spinner.test.tsx +2 -2
  185. package/src/Stepper/Stepper.mdx +1 -1
  186. package/src/Stepper/Stepper.stories.tsx +4 -1
  187. package/src/Stepper/Stepper.test.tsx +7 -7
  188. package/src/Swatch/Swatch.mdx +1 -1
  189. package/src/Swatch/Swatch.stories.tsx +4 -1
  190. package/src/Swatch/Swatch.test.tsx +3 -3
  191. package/src/Switch/Switch.mdx +1 -1
  192. package/src/Switch/Switch.stories.tsx +3 -1
  193. package/src/Switch/Switch.test.tsx +2 -2
  194. package/src/Tabs/Tabs.mdx +1 -1
  195. package/src/Tabs/Tabs.stories.tsx +3 -1
  196. package/src/Tabs/Tabs.test.tsx +3 -3
  197. package/src/TextLink/TextLink.mdx +1 -1
  198. package/src/TextLink/TextLink.stories.tsx +3 -1
  199. package/src/TextLink/TextLink.test.tsx +4 -4
  200. package/src/TimecodeInput/TimecodeInput.mdx +1 -1
  201. package/src/TimecodeInput/TimecodeInput.stories.tsx +3 -1
  202. package/src/Toast/Toast.mdx +1 -1
  203. package/src/Toast/Toast.stories.tsx +157 -1
  204. package/src/Toast/Toast.test.tsx +2 -2
  205. package/src/Toast/ToastRegion.test.tsx +172 -0
  206. package/src/Toast/ToastRegion.tsx +120 -32
  207. package/src/Toolbar/Toolbar.mdx +1 -1
  208. package/src/Toolbar/Toolbar.stories.tsx +3 -1
  209. package/src/Toolbar/Toolbar.test.tsx +89 -5
  210. package/src/Toolbar/useToolbarOverflow.ts +43 -0
  211. package/src/Tooltip/Tooltip.mdx +1 -1
  212. package/src/Tooltip/Tooltip.stories.tsx +3 -1
  213. package/src/Tooltip/Tooltip.test.tsx +2 -2
  214. package/src/VirtualizedGrid/VirtualizedGrid.mdx +1 -1
  215. package/src/VirtualizedGrid/VirtualizedGrid.stories.tsx +4 -1
  216. package/src/VirtualizedGrid/VirtualizedGrid.test.tsx +5 -5
  217. package/src/VisuallyHidden/VisuallyHidden.mdx +1 -1
  218. package/src/VisuallyHidden/VisuallyHidden.stories.tsx +3 -1
  219. package/src/markdownEditorCodeMirror/MarkdownEditorCodeMirror.mdx +1 -1
  220. package/src/markdownEditorCodeMirror/MarkdownEditorCodeMirror.stories.tsx +3 -1
  221. package/src/markdownEditorCodeMirror/MarkdownEditorCodeMirror.test.tsx +3 -3
  222. package/src/markdownEditorCodeMirror/MarkdownView.mdx +1 -1
  223. package/src/markdownEditorCodeMirror/MarkdownView.stories.tsx +4 -1
  224. package/src/markdownEditorCodeMirror/MarkdownView.test.tsx +44 -20
  225. package/src/reactRouter/ReactRouterAdapter.stories.tsx +3 -1
  226. package/src/reactRouter/ReactRouterAdapter.test.tsx +2 -2
@@ -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 {
@@ -26,7 +27,8 @@ export default meta
26
27
 
27
28
  type Story = StoryObj<typeof meta>
28
29
 
29
- export const Default: Story = {
30
+ export const Playground: Story = {
31
+ parameters: playgroundParameters,
30
32
  args: {
31
33
  children: (
32
34
  <input className={TEXT_INPUT_CLASS} type="text" />
@@ -12,7 +12,7 @@ const {
12
12
  AdoptsOverlayTriggerId,
13
13
  AllStates,
14
14
  AllVariants,
15
- Default,
15
+ Playground,
16
16
  ForwardsRestProps,
17
17
  Group,
18
18
  Nested,
@@ -79,7 +79,7 @@ test("an overlay trigger keeps the id the label points at", async () => {
79
79
 
80
80
  test("the label names the control it points at", async () => {
81
81
  const { canvas, canvasElement } =
82
- await mountStory(Default)
82
+ await mountStory(Playground)
83
83
 
84
84
  // The whole point of the component in one query: the control is
85
85
  // findable by the *label's* text, which is only true if `htmlFor`
@@ -112,7 +112,7 @@ test("the label names the control it points at", async () => {
112
112
  * the other component's suite.
113
113
  */
114
114
  test("the label carries a derivable id for non-labelable controls", async () => {
115
- const { canvas } = await mountStory(Default)
115
+ const { canvas } = await mountStory(Playground)
116
116
 
117
117
  const control = expectAgentDrivable(canvas, {
118
118
  name: "Output directory",
@@ -133,7 +133,7 @@ test("the label carries a derivable id for non-labelable controls", async () =>
133
133
  })
134
134
 
135
135
  test("a description is announced with the control", async () => {
136
- const { canvas } = await mountStory(Default)
136
+ const { canvas } = await mountStory(Playground)
137
137
 
138
138
  const control = expectAgentDrivable(canvas, {
139
139
  name: "Output directory",
@@ -9,7 +9,7 @@ import * as FileDropZoneStories from "./FileDropZone.stories";
9
9
  The one drag target in the fleet is gallery-downloader's, and it **gets the hard part
10
10
  right** — credit where it is due, and the fix is reproduced here.
11
11
 
12
- <Canvas of={FileDropZoneStories.Default} />
12
+ <Canvas of={FileDropZoneStories.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
  import { useState } from "react"
3
4
 
@@ -25,7 +26,8 @@ export default meta
25
26
 
26
27
  type Story = StoryObj<typeof meta>
27
28
 
28
- export const Default: Story = {
29
+ export const Playground: Story = {
30
+ parameters: playgroundParameters,
29
31
  args: {
30
32
  description: "ISO or MKV, up to 50 GB.",
31
33
  label: "Drop a disc image here",
@@ -6,7 +6,7 @@ import { expectNoAxeViolations } from "../expectNoAxeViolations.testHelpers.ts"
6
6
  import { mountStory } from "../mountStory.testHelpers.ts"
7
7
  import * as stories from "./FileDropZone.stories.tsx"
8
8
 
9
- const { AllStates, AllVariants, Default, Interactive } =
9
+ const { AllStates, AllVariants, Playground, Interactive } =
10
10
  composeStories(stories)
11
11
 
12
12
  /**
@@ -45,7 +45,7 @@ const { AllStates, AllVariants, Default, Interactive } =
45
45
  */
46
46
  test("the zone is a real file input, reachable and named", async () => {
47
47
  const { canvas, canvasElement } =
48
- await mountStory(Default)
48
+ await mountStory(Playground)
49
49
 
50
50
  const input = canvas.getByLabelText(
51
51
  "Drop a disc image here",
@@ -198,7 +198,7 @@ test("a dropped link reports as text", async () => {
198
198
  * the correct fix and is reproduced here.
199
199
  */
200
200
  test("the highlight survives crossing a child element", async () => {
201
- const { canvas } = await mountStory(Default)
201
+ const { canvas } = await mountStory(Playground)
202
202
 
203
203
  const zone = canvas
204
204
  .getByLabelText("Drop a disc image here")
@@ -9,7 +9,7 @@ import * as HeaderStories from "./Header.stories";
9
9
  The `<header>` landmark, the app's name, and the controls that belong to the frame rather
10
10
  than to the page. Ten repos hand-roll this row; two of them wrote the same string.
11
11
 
12
- <Canvas of={HeaderStories.Default} />
12
+ <Canvas of={HeaderStories.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 { Badge } from "../Badge/Badge.tsx"
@@ -41,7 +42,8 @@ type Story = StoryObj<typeof meta>
41
42
  * and a fill that is `surface-raised` rather than the page's own
42
43
  * colour.
43
44
  */
44
- export const Default: Story = {
45
+ export const Playground: Story = {
46
+ parameters: playgroundParameters,
45
47
  args: { heading: "Rip Deck" },
46
48
  render: (headerProps) => (
47
49
  <Shell>
@@ -15,7 +15,7 @@ A screen reader announces the last of those as "↶", and
15
15
  the fleet is not agent-drivable today, and the reason this component exists as something
16
16
  other than `<Button sizing="icon">`.
17
17
 
18
- <Canvas of={IconButtonStories.Default} />
18
+ <Canvas of={IconButtonStories.Playground} />
19
19
 
20
20
  ## Props
21
21
 
@@ -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"
@@ -48,7 +49,8 @@ type Story = StoryObj<typeof meta>
48
49
  * bare `<button>` today, so a screen reader announces "↶" and
49
50
  * `getByRole("button", { name: "Undo" })` finds nothing.
50
51
  */
51
- export const Default: Story = {
52
+ export const Playground: Story = {
53
+ parameters: playgroundParameters,
52
54
  args: { children: UNDO_ICON, label: "Undo" },
53
55
  }
54
56
 
@@ -10,7 +10,7 @@ import { mountStory } from "../mountStory.testHelpers.ts"
10
10
  import { expectAgentDrivable } from "../testing/index.ts"
11
11
  import meta, * as stories from "./IconButton.stories.tsx"
12
12
 
13
- const { Default, RawGlyph } = composeStories(stories)
13
+ const { Playground, RawGlyph } = composeStories(stories)
14
14
 
15
15
  /**
16
16
  * The assertion the fleet fails today: plex-channels renders `↶`
@@ -18,7 +18,7 @@ const { Default, RawGlyph } = composeStories(stories)
18
18
  * query finds nothing.
19
19
  */
20
20
  test("a glyph gets a name", async () => {
21
- const { canvas } = await mountStory(Default)
21
+ const { canvas } = await mountStory(Playground)
22
22
 
23
23
  expectAgentDrivable(canvas, {
24
24
  name: "Undo",
@@ -16,7 +16,7 @@ So a `Lightbox` is a **skin over `Dialog`**, not a second dialog. `Dialog` (thro
16
16
  `object-contain` image clamped to the viewport, so a 2:3 poster and a 16:9 still both land
17
17
  whole.
18
18
 
19
- <Canvas of={LightboxStories.Default} />
19
+ <Canvas of={LightboxStories.Playground} />
20
20
 
21
21
  ## Props
22
22
 
@@ -1,4 +1,5 @@
1
1
  import { useVisibility } from "@charcuterie/logic"
2
+ import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
2
3
  import type { Meta, StoryObj } from "@storybook/react"
3
4
  import type { ReactNode } from "react"
4
5
 
@@ -51,7 +52,8 @@ type Story = StoryObj<typeof meta>
51
52
  * component owns its open state. This is what a rip card passes —
52
53
  * one `Lightbox` with the poster as its `thumbnail`.
53
54
  */
54
- export const Default: Story = {
55
+ export const Playground: Story = {
56
+ parameters: playgroundParameters,
55
57
  args: {
56
58
  thumbnail: <PosterThumb />,
57
59
  },
@@ -7,11 +7,11 @@ import { mountStory } from "../mountStory.testHelpers.ts"
7
7
  import { expectAgentDrivable } from "../testing/index.ts"
8
8
  import * as stories from "./Lightbox.stories.tsx"
9
9
 
10
- const { Controlled, Default, Interactive, WithCaption } =
10
+ const { Controlled, Playground, Interactive, WithCaption } =
11
11
  composeStories(stories)
12
12
 
13
13
  test("the thumbnail opens the enlarged image", async () => {
14
- const { body, canvas } = await mountStory(Default)
14
+ const { body, canvas } = await mountStory(Playground)
15
15
 
16
16
  await userEvent.click(
17
17
  expectAgentDrivable(canvas, {
@@ -12,7 +12,7 @@ type-ahead, Home/End, the mobile wheel picker, form submission, `:invalid` and a
12
12
  `Listbox` is for the cases `<option>` cannot render — a leading icon, two lines, a trailing
13
13
  badge ([decision](../../../docs/decisions/2026-08-03-listbox-and-combobox-are-siblings-of-select.md)).
14
14
 
15
- <Canvas of={ListboxStories.Default} />
15
+ <Canvas of={ListboxStories.Playground} />
16
16
 
17
17
  ## Props
18
18
 
@@ -1,4 +1,5 @@
1
1
  import { useVisibility } from "@charcuterie/logic"
2
+ import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
2
3
  import type { ControlSize } from "@charcuterie/tokens"
3
4
  import type { Meta, StoryObj } from "@storybook/react"
4
5
  import type { ReactNode } from "react"
@@ -142,7 +143,8 @@ const ListboxHarness = ({
142
143
  )
143
144
  }
144
145
 
145
- export const Default: Story = {
146
+ export const Playground: Story = {
147
+ parameters: playgroundParameters,
146
148
  args: {
147
149
  isVisible: false,
148
150
  onDismiss: () => {},
@@ -7,11 +7,11 @@ import { mountStory } from "../mountStory.testHelpers.ts"
7
7
  import { expectAgentDrivable } from "../testing/index.ts"
8
8
  import * as stories from "./Listbox.stories.tsx"
9
9
 
10
- const { AllStates, AllVariants, Default, Interactive } =
10
+ const { AllStates, AllVariants, Playground, Interactive } =
11
11
  composeStories(stories)
12
12
 
13
13
  test("a button opens a listbox whose rows are options", async () => {
14
- const { body, canvas } = await mountStory(Default)
14
+ const { body, canvas } = await mountStory(Playground)
15
15
 
16
16
  const trigger = expectAgentDrivable(canvas, {
17
17
  name: "Choose a language",
@@ -74,7 +74,7 @@ test("opening focuses the seeded selection, which reads selected", async () => {
74
74
  })
75
75
 
76
76
  test("the arrow keys move focus and skip the disabled option", async () => {
77
- const { body, canvas } = await mountStory(Default)
77
+ const { body, canvas } = await mountStory(Playground)
78
78
 
79
79
  await userEvent.click(
80
80
  expectAgentDrivable(canvas, {
@@ -116,7 +116,7 @@ test("the arrow keys move focus and skip the disabled option", async () => {
116
116
  })
117
117
 
118
118
  test("type-ahead jumps to the first match", async () => {
119
- const { body, canvas } = await mountStory(Default)
119
+ const { body, canvas } = await mountStory(Playground)
120
120
 
121
121
  await userEvent.click(
122
122
  expectAgentDrivable(canvas, {
@@ -163,7 +163,7 @@ test("Enter selects the focused option and closes", async () => {
163
163
  })
164
164
 
165
165
  test("Escape dismisses without choosing, and there is one tab stop", async () => {
166
- const { body, canvas } = await mountStory(Default)
166
+ const { body, canvas } = await mountStory(Playground)
167
167
 
168
168
  await userEvent.click(
169
169
  expectAgentDrivable(canvas, {
@@ -9,7 +9,7 @@ import * as LiveStatusIndicatorStories from "./LiveStatusIndicator.stories";
9
9
  Four repos, four implementations, and **it is the thing users read most** — a wall-mounted
10
10
  panel showing stale data under a green dot is worse than one showing nothing.
11
11
 
12
- <Canvas of={LiveStatusIndicatorStories.Default} />
12
+ <Canvas of={LiveStatusIndicatorStories.Playground} />
13
13
 
14
14
  ## Props
15
15
 
@@ -2,6 +2,7 @@ import {
2
2
  connectionTransitions,
3
3
  useStatus,
4
4
  } from "@charcuterie/logic"
5
+ import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
5
6
  import type { Meta, StoryObj } from "@storybook/react"
6
7
 
7
8
  import { connectionStatusArgType } from "../argTypes.storyHelpers.ts"
@@ -40,7 +41,8 @@ type Story = StoryObj<typeof meta>
40
41
  * handle for a Playwright assertion, because it survives translation
41
42
  * where the visible wording does not.
42
43
  */
43
- export const Default: Story = {
44
+ export const Playground: Story = {
45
+ parameters: playgroundParameters,
44
46
  args: { status: "connected" },
45
47
  }
46
48
 
@@ -6,10 +6,10 @@ import { mountStory } from "../mountStory.testHelpers.ts"
6
6
  import { expectAgentDrivable } from "../testing/index.ts"
7
7
  import * as stories from "./LiveStatusIndicator.stories.tsx"
8
8
 
9
- const { Default, Interactive } = composeStories(stories)
9
+ const { Playground, Interactive } = composeStories(stories)
10
10
 
11
11
  test("it is a named live region with a stable status handle", async () => {
12
- const { canvas } = await mountStory(Default)
12
+ const { canvas } = await mountStory(Playground)
13
13
 
14
14
  const indicator = expectAgentDrivable(canvas, {
15
15
  name: "Connected",
@@ -11,7 +11,7 @@ rip-deck's `LogModal` — and between them they have four defects this component
11
11
  have. The fifth below is not theirs: it is defect 1 coming back through the front door, in
12
12
  this component, found by the first app to consume it.
13
13
 
14
- <Canvas of={LogViewerStories.Default} />
14
+ <Canvas of={LogViewerStories.Playground} />
15
15
 
16
16
  ## Props
17
17
 
@@ -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 { Accordion } from "../Accordion/Accordion.tsx"
@@ -61,7 +62,8 @@ export default meta
61
62
 
62
63
  type Story = StoryObj<typeof meta>
63
64
 
64
- export const Default: Story = {
65
+ export const Playground: Story = {
66
+ parameters: playgroundParameters,
65
67
  args: { label: "Bay 3 rip log", lines: RIP_LINES },
66
68
  }
67
69
 
@@ -10,14 +10,14 @@ import * as stories from "./LogViewer.stories.tsx"
10
10
  const {
11
11
  AllStates,
12
12
  AllVariants,
13
- Default,
13
+ Playground,
14
14
  InsideDisclosure,
15
15
  Interactive,
16
16
  } = composeStories(stories)
17
17
 
18
18
  test("the pane is named, and is a log", async () => {
19
19
  const { canvas, canvasElement } =
20
- await mountStory(Default)
20
+ await mountStory(Playground)
21
21
 
22
22
  // Found by its name, not by a `data-log-id`. mux-magic's pane
23
23
  // carries one of those — a `data-testid` under a different name,
package/src/Main/Main.mdx CHANGED
@@ -15,7 +15,7 @@ The owner's complaint, verbatim:
15
15
  > Rip-Deck where the app has a narrower main column but the wrapping grids are all
16
16
  > full-width in most of these apps only when you have too many items."
17
17
 
18
- <Canvas of={MainStories.Default} />
18
+ <Canvas of={MainStories.Playground} />
19
19
 
20
20
  ## Props
21
21
 
@@ -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 { useEffect, useState } from "react"
3
4
 
@@ -55,7 +56,8 @@ type Story = StoryObj<typeof meta>
55
56
  * tell apart and the reason the fleet's poster grids look wrong
56
57
  * at intermediate widths.
57
58
  */
58
- export const Default: Story = {
59
+ export const Playground: Story = {
60
+ parameters: playgroundParameters,
59
61
  render: (mainProps) => (
60
62
  <Shell>
61
63
  <Header
@@ -14,7 +14,7 @@ import * as stories from "./Main.stories.tsx"
14
14
  import { forgetScrollOffsets } from "./scrollMemory.ts"
15
15
 
16
16
  const {
17
- Default,
17
+ Playground,
18
18
  Interactive,
19
19
  Responsive,
20
20
  ScrollMemory,
@@ -34,7 +34,7 @@ afterEach(() => {
34
34
  test("the content column is capped at the token, not at the window", async () => {
35
35
  await setViewport(DESKTOP)
36
36
 
37
- const { canvas } = await mountStory(Default)
37
+ const { canvas } = await mountStory(Playground)
38
38
 
39
39
  const column = canvas.getByRole("main")
40
40
  .firstElementChild as HTMLElement
@@ -63,7 +63,7 @@ test("the content column is capped at the token, not at the window", async () =>
63
63
  test("main is the query container its content responds to", async () => {
64
64
  await setViewport(DESKTOP)
65
65
 
66
- const { canvas } = await mountStory(Default)
66
+ const { canvas } = await mountStory(Playground)
67
67
 
68
68
  const column = canvas.getByRole("main")
69
69
  .firstElementChild as HTMLElement
@@ -13,7 +13,7 @@ replaces destroyed data by storing HTML in a field it later read back as text. S
13
13
  constraint is not "prefer markdown" — it is that an HTML tag must not be *able* to reach the
14
14
  stored string.
15
15
 
16
- <Canvas of={MarkdownEditorStories.Default} />
16
+ <Canvas of={MarkdownEditorStories.Playground} />
17
17
 
18
18
  > **Reading rather than editing?** `isReadOnly` here leaves the toolbar on screen, because it
19
19
  > means "an editor you cannot type in". A surface with no toolbar in the DOM is
@@ -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
 
@@ -61,7 +62,8 @@ export default meta
61
62
 
62
63
  type Story = StoryObj<typeof meta>
63
64
 
64
- export const Default: Story = {
65
+ export const Playground: Story = {
66
+ parameters: playgroundParameters,
65
67
  args: {
66
68
  defaultValue: SAMPLE,
67
69
  label: "Description",
@@ -11,7 +11,7 @@ const {
11
11
  AllStates,
12
12
  AllVariants,
13
13
  Blank,
14
- Default,
14
+ Playground,
15
15
  Interactive,
16
16
  NoUpload,
17
17
  Responsive,
@@ -59,7 +59,7 @@ const resyncHarness = (editor: HTMLTextAreaElement) => {
59
59
  */
60
60
  test("the surface is a real textbox an agent can find", async () => {
61
61
  const { canvas, canvasElement } =
62
- await mountStory(Default)
62
+ await mountStory(Playground)
63
63
 
64
64
  expectAgentDrivable(canvas, {
65
65
  name: "Description",
@@ -77,7 +77,7 @@ test("the surface is a real textbox an agent can find", async () => {
77
77
 
78
78
  test("the toolbar is one tab stop with arrow keys inside it", async () => {
79
79
  const { canvas, canvasElement } =
80
- await mountStory(Default)
80
+ await mountStory(Playground)
81
81
 
82
82
  expectAgentDrivable(canvas, {
83
83
  name: "Markdown formatting",
@@ -133,7 +133,7 @@ test("markdown goes in and the same markdown comes out", async () => {
133
133
  * drifts away from the glyphs it is supposed to be sitting between.
134
134
  */
135
135
  test("the painted layer holds exactly the textarea's text", async () => {
136
- const { canvas } = await mountStory(Default)
136
+ const { canvas } = await mountStory(Playground)
137
137
 
138
138
  const editor = getEditor(canvas, "Description")
139
139
 
@@ -10,7 +10,7 @@ import * as MarkdownLineStories from "./MarkdownLine.stories";
10
10
  wherever a stored string is a *name* rather than a document — a card title, a lane heading,
11
11
  a table cell, a breadcrumb.
12
12
 
13
- <Canvas of={MarkdownLineStories.Default} />
13
+ <Canvas of={MarkdownLineStories.Playground} />
14
14
 
15
15
  ## Props
16
16
 
@@ -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
 
@@ -52,7 +53,9 @@ export default meta
52
53
 
53
54
  type Story = StoryObj<typeof meta>
54
55
 
55
- export const Default: Story = {}
56
+ export const Playground: Story = {
57
+ parameters: playgroundParameters,
58
+ }
56
59
 
57
60
  /**
58
61
  * The four marks, each in the shape a title actually uses it for.
@@ -22,7 +22,7 @@ import * as stories from "./MarkdownLine.stories.tsx"
22
22
  const {
23
23
  AllMarks,
24
24
  AsALink,
25
- Default,
25
+ Playground,
26
26
  FileNames,
27
27
  InsideACardLink,
28
28
  RefusedUrl,
@@ -31,7 +31,7 @@ const {
31
31
  } = composeStories(stories)
32
32
 
33
33
  test("a code span is a `code` element, and the backticks are gone", async () => {
34
- const { canvasElement } = await mountStory(Default)
34
+ const { canvasElement } = await mountStory(Playground)
35
35
 
36
36
  await expect(
37
37
  [...canvasElement.querySelectorAll("code")].map(
@@ -80,7 +80,7 @@ test("an underscore inside a word marks nothing", async () => {
80
80
  })
81
81
 
82
82
  test("a line with no href has nothing to click", async () => {
83
- const { canvasElement } = await mountStory(Default)
83
+ const { canvasElement } = await mountStory(Playground)
84
84
 
85
85
  await expect(canvasElement.querySelector("a")).toBe(null)
86
86
  })
@@ -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 { Badge } from "../Badge/Badge.tsx"
@@ -35,7 +36,8 @@ export default meta
35
36
 
36
37
  type Story = StoryObj<typeof meta>
37
38
 
38
- export const Default: Story = {
39
+ export const Playground: Story = {
40
+ parameters: playgroundParameters,
39
41
  args: {
40
42
  alt: "Blade Runner (1982) poster",
41
43
  src: toPosterSrc("Blade Runner"),
@@ -6,11 +6,11 @@ import { mountStory } from "../mountStory.testHelpers.ts"
6
6
  import { expectAgentDrivable } from "../testing/index.ts"
7
7
  import * as stories from "./MediaTile.stories.tsx"
8
8
 
9
- const { Default, Interactive, InteractiveButton } =
9
+ const { Playground, Interactive, InteractiveButton } =
10
10
  composeStories(stories)
11
11
 
12
12
  test("an unlinked tile's poster carries the name", async () => {
13
- const { canvas } = await mountStory(Default)
13
+ const { canvas } = await mountStory(Playground)
14
14
 
15
15
  expectAgentDrivable(canvas, {
16
16
  name: "Blade Runner (1982) poster",
package/src/Menu/Menu.mdx CHANGED
@@ -10,7 +10,7 @@ A menu is **not** a listbox, and mux-magic's `TypePicker` is the fleet's one att
10
10
  telling them apart — it renders `role="menu"` over items that set a value, which is a
11
11
  listbox wearing the wrong role.
12
12
 
13
- <Canvas of={MenuStories.Default} />
13
+ <Canvas of={MenuStories.Playground} />
14
14
 
15
15
  ## Props
16
16
 
@@ -1,4 +1,5 @@
1
1
  import { useVisibility } from "@charcuterie/logic"
2
+ import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
2
3
  import type { ControlSize } from "@charcuterie/tokens"
3
4
  import type { Meta, StoryObj } from "@storybook/react"
4
5
  import type { ReactNode } from "react"
@@ -166,7 +167,8 @@ export default meta
166
167
 
167
168
  type Story = StoryObj<typeof meta>
168
169
 
169
- export const Default: Story = {
170
+ export const Playground: Story = {
171
+ parameters: playgroundParameters,
170
172
  args: {
171
173
  isVisible: false,
172
174
  onDismiss: noop,
@@ -12,7 +12,7 @@ anything else that wants a scrim over the page. `Modal` is that foundation, and
12
12
  [`Dialog`](?path=/docs/components-dialog--docs) is `Modal` plus the
13
13
  heading/Close/footer/size chrome the component shipped with before the M8 rebuild.
14
14
 
15
- <Canvas of={ModalStories.Default} />
15
+ <Canvas of={ModalStories.Playground} />
16
16
 
17
17
  ## Props
18
18
 
@@ -1,4 +1,5 @@
1
1
  import { useVisibility } from "@charcuterie/logic"
2
+ import { playgroundParameters } from "@charcuterie/storybook-config/story-parameters"
2
3
  import type { Meta, StoryObj } from "@storybook/react"
3
4
  import type { ReactNode } from "react"
4
5
 
@@ -73,7 +74,8 @@ const ModalDemo = ({
73
74
  )
74
75
  }
75
76
 
76
- export const Default: Story = {
77
+ export const Playground: Story = {
78
+ parameters: playgroundParameters,
77
79
  args: {
78
80
  "aria-label": "Read error on title 4",
79
81
  children: null,
@@ -7,12 +7,12 @@ import { mountStory } from "../mountStory.testHelpers.ts"
7
7
  import { expectAgentDrivable } from "../testing/index.ts"
8
8
  import * as stories from "./Modal.stories.tsx"
9
9
 
10
- const { Alert, Default, Interactive } =
10
+ const { Alert, Playground, Interactive } =
11
11
  composeStories(stories)
12
12
 
13
13
  test("the base modal portals to the body, named by its aria-label", async () => {
14
14
  const { body, canvas, canvasElement } =
15
- await mountStory(Default)
15
+ await mountStory(Playground)
16
16
 
17
17
  await userEvent.click(
18
18
  expectAgentDrivable(canvas, {
@@ -50,7 +50,7 @@ test("an alertdialog role is carried through", async () => {
50
50
  })
51
51
 
52
52
  test("Escape and an outside press both close through onClose", async () => {
53
- const { body, canvas } = await mountStory(Default)
53
+ const { body, canvas } = await mountStory(Playground)
54
54
 
55
55
  const trigger = expectAgentDrivable(canvas, {
56
56
  name: "Open the base modal",