@flamingo-stack/openframe-frontend-core 0.0.450 → 0.0.451

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 (96) hide show
  1. package/dist/{chunk-6RA4NRBA.cjs → chunk-2EBWR7TL.cjs} +15 -15
  2. package/dist/{chunk-6RA4NRBA.cjs.map → chunk-2EBWR7TL.cjs.map} +1 -1
  3. package/dist/{chunk-76EN3GEH.cjs → chunk-2EDOYQ4B.cjs} +37 -37
  4. package/dist/{chunk-76EN3GEH.cjs.map → chunk-2EDOYQ4B.cjs.map} +1 -1
  5. package/dist/{chunk-HYIHXXF3.js → chunk-2OYAYIEY.js} +4 -4
  6. package/dist/{chunk-HXCQHMS5.js → chunk-6ZIUQ2SL.js} +4 -19
  7. package/dist/chunk-6ZIUQ2SL.js.map +1 -0
  8. package/dist/{chunk-VUDZOCPW.js → chunk-A7Z6UBVS.js} +4 -4
  9. package/dist/{chunk-PCW2TRZ4.js → chunk-B77WL4O5.js} +2 -2
  10. package/dist/{chunk-5OY7HYII.cjs → chunk-DGQHHMTR.cjs} +59 -59
  11. package/dist/{chunk-5OY7HYII.cjs.map → chunk-DGQHHMTR.cjs.map} +1 -1
  12. package/dist/{chunk-4VSTLJDO.js → chunk-DREXTFSD.js} +2 -2
  13. package/dist/{chunk-CM5XKHHS.js → chunk-FZG2BBFM.js} +4 -4
  14. package/dist/{chunk-K3GXIGN6.js → chunk-I4KRIE5C.js} +4 -4
  15. package/dist/{chunk-N53FC732.js → chunk-I5GIVUTT.js} +2 -2
  16. package/dist/{chunk-XITG5ICQ.cjs → chunk-L5C7LUKR.cjs} +31 -31
  17. package/dist/{chunk-XITG5ICQ.cjs.map → chunk-L5C7LUKR.cjs.map} +1 -1
  18. package/dist/{chunk-ROBGJH52.cjs → chunk-OIQVRUXB.cjs} +9 -9
  19. package/dist/{chunk-ROBGJH52.cjs.map → chunk-OIQVRUXB.cjs.map} +1 -1
  20. package/dist/{chunk-N5M72LJX.cjs → chunk-PSXGALZS.cjs} +733 -748
  21. package/dist/chunk-PSXGALZS.cjs.map +1 -0
  22. package/dist/{chunk-M3AKWFAO.js → chunk-PXCMC2IV.js} +2 -2
  23. package/dist/{chunk-26JSJMMZ.cjs → chunk-PZJ7K3IB.cjs} +7 -7
  24. package/dist/{chunk-26JSJMMZ.cjs.map → chunk-PZJ7K3IB.cjs.map} +1 -1
  25. package/dist/{chunk-6GJKSYM2.cjs → chunk-R3J3J343.cjs} +62 -62
  26. package/dist/{chunk-6GJKSYM2.cjs.map → chunk-R3J3J343.cjs.map} +1 -1
  27. package/dist/{chunk-4SZDO3TE.js → chunk-R4WXQKOP.js} +2 -2
  28. package/dist/{chunk-J5BYYZVM.cjs → chunk-VDG22PSI.cjs} +26 -26
  29. package/dist/{chunk-J5BYYZVM.cjs.map → chunk-VDG22PSI.cjs.map} +1 -1
  30. package/dist/{chunk-VLDZ4363.cjs → chunk-X6XGYRAK.cjs} +26 -26
  31. package/dist/{chunk-VLDZ4363.cjs.map → chunk-X6XGYRAK.cjs.map} +1 -1
  32. package/dist/{chunk-RQHHACP2.js → chunk-XNH5GGEI.js} +2 -2
  33. package/dist/{chunk-3ITY2LBM.js → chunk-XSBQ2REJ.js} +2 -2
  34. package/dist/{chunk-DQ5U6DCR.cjs → chunk-ZDW5ETYK.cjs} +11 -11
  35. package/dist/{chunk-DQ5U6DCR.cjs.map → chunk-ZDW5ETYK.cjs.map} +1 -1
  36. package/dist/{chunk-5HW5HMNF.cjs → chunk-ZP62C5A3.cjs} +5 -5
  37. package/dist/{chunk-5HW5HMNF.cjs.map → chunk-ZP62C5A3.cjs.map} +1 -1
  38. package/dist/components/case-studies/index.cjs +8 -8
  39. package/dist/components/case-studies/index.js +2 -2
  40. package/dist/components/chat/chat-quick-action-row.d.ts +7 -12
  41. package/dist/components/chat/chat-quick-action-row.d.ts.map +1 -1
  42. package/dist/components/chat/index.cjs +2 -4
  43. package/dist/components/chat/index.cjs.map +1 -1
  44. package/dist/components/chat/index.js +1 -3
  45. package/dist/components/chat/quick-action-chip.d.ts +13 -31
  46. package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
  47. package/dist/components/chat/quick-action-wall.d.ts +6 -9
  48. package/dist/components/chat/quick-action-wall.d.ts.map +1 -1
  49. package/dist/components/contact/index.cjs +3 -3
  50. package/dist/components/contact/index.js +2 -2
  51. package/dist/components/docs/index.cjs +5 -5
  52. package/dist/components/docs/index.js +4 -4
  53. package/dist/components/embeds/index.cjs +3 -3
  54. package/dist/components/embeds/index.js +2 -2
  55. package/dist/components/faq/index.cjs +3 -3
  56. package/dist/components/faq/index.js +2 -2
  57. package/dist/components/features/index.cjs +2 -2
  58. package/dist/components/features/index.js +1 -1
  59. package/dist/components/help-center-pages/index.cjs +20 -20
  60. package/dist/components/help-center-pages/index.js +11 -11
  61. package/dist/components/index.cjs +129 -131
  62. package/dist/components/index.cjs.map +1 -1
  63. package/dist/components/index.js +9 -11
  64. package/dist/components/index.js.map +1 -1
  65. package/dist/components/navigation/index.cjs +2 -2
  66. package/dist/components/navigation/index.js +1 -1
  67. package/dist/components/onboarding-guides/index.cjs +5 -5
  68. package/dist/components/onboarding-guides/index.js +4 -4
  69. package/dist/components/related-content/index.cjs +3 -3
  70. package/dist/components/related-content/index.js +2 -2
  71. package/dist/components/tickets/index.cjs +5 -5
  72. package/dist/components/tickets/index.js +4 -4
  73. package/dist/components/ui/index.cjs +2 -4
  74. package/dist/components/ui/index.cjs.map +1 -1
  75. package/dist/components/ui/index.js +1 -3
  76. package/dist/index.cjs +2 -4
  77. package/dist/index.cjs.map +1 -1
  78. package/dist/index.js +1 -3
  79. package/package.json +1 -1
  80. package/src/components/chat/chat-quick-action-row.tsx +7 -16
  81. package/src/components/chat/quick-action-chip.tsx +17 -48
  82. package/src/components/chat/quick-action-wall.tsx +5 -10
  83. package/src/stories/QuickActionWall.stories.tsx +31 -17
  84. package/dist/chunk-HXCQHMS5.js.map +0 -1
  85. package/dist/chunk-N5M72LJX.cjs.map +0 -1
  86. /package/dist/{chunk-HYIHXXF3.js.map → chunk-2OYAYIEY.js.map} +0 -0
  87. /package/dist/{chunk-VUDZOCPW.js.map → chunk-A7Z6UBVS.js.map} +0 -0
  88. /package/dist/{chunk-PCW2TRZ4.js.map → chunk-B77WL4O5.js.map} +0 -0
  89. /package/dist/{chunk-4VSTLJDO.js.map → chunk-DREXTFSD.js.map} +0 -0
  90. /package/dist/{chunk-CM5XKHHS.js.map → chunk-FZG2BBFM.js.map} +0 -0
  91. /package/dist/{chunk-K3GXIGN6.js.map → chunk-I4KRIE5C.js.map} +0 -0
  92. /package/dist/{chunk-N53FC732.js.map → chunk-I5GIVUTT.js.map} +0 -0
  93. /package/dist/{chunk-M3AKWFAO.js.map → chunk-PXCMC2IV.js.map} +0 -0
  94. /package/dist/{chunk-4SZDO3TE.js.map → chunk-R4WXQKOP.js.map} +0 -0
  95. /package/dist/{chunk-RQHHACP2.js.map → chunk-XNH5GGEI.js.map} +0 -0
  96. /package/dist/{chunk-3ITY2LBM.js.map → chunk-XSBQ2REJ.js.map} +0 -0
@@ -14,8 +14,7 @@ import { EntityIcon, type EntityIconValue } from '../icon-display'
14
14
  * (agent/persona `icon_props.color`). */
15
15
  export type QuickActionAccent = 'pink' | 'cyan' | (string & {})
16
16
 
17
- /** THE agent→accent pairs (one spelling — {@link getAgentAccent} and
18
- * {@link QUICK_ACTION_THEMES} both derive from it). */
17
+ /** THE built-in agent→accent pairs ({@link getAgentAccent} derives from it). */
19
18
  const AGENT_ACCENTS = { fae: 'pink', mingo: 'cyan' } as const
20
19
 
21
20
  /**
@@ -117,43 +116,21 @@ export interface QuickActionChipLozenge {
117
116
  // =============================================================================
118
117
 
119
118
  /**
120
- * THE quick-action wall/chip theme set one spelling of "who does this work"
121
- * across every surface (homepage hero tabs, marketing marquees, company-hub
122
- * deck panels, chat empty states):
123
- * - `fae` / `mingo` — the agent identities (pink / cyan), same values
124
- * {@link getAgentAccent} resolves for the built-in agents.
125
- * - `it` / `sec` work-category themes on the ODS attention pair
126
- * (IT = yellow routine work, security = red defense), deliberately NOT the
127
- * agent identities so a category never reads as agent attribution. These two
128
- * carry the classification lozenge (leading-edge affix) as part of the theme.
119
+ * A caller-supplied chip theme — the accent (and optional classification
120
+ * lozenge) for "who does this work". The lib deliberately ships NO theme
121
+ * registry and NO fallbacks: agent colors are server-configured (resolve via
122
+ * {@link accentFromIdentityIcon} on the agent row's `icon_props.color`, or
123
+ * {@link getAgentAccent} for the built-in agents) and category pairs are
124
+ * product decisions the CONSUMER defines its specs and injects them, per
125
+ * chip or as a wall default.
129
126
  */
130
- export type QuickActionTheme = 'fae' | 'mingo' | 'it' | 'sec'
131
-
132
127
  export interface QuickActionThemeSpec {
133
128
  /** Chip icon tint ({@link QuickActionAccent}: brand token or CSS color). */
134
129
  accent: QuickActionAccent
135
- /** Classification affix rendered inside the chip (category themes only). */
130
+ /** Classification affix rendered inside the chip (category themes). */
136
131
  lozenge?: QuickActionChipLozenge
137
132
  }
138
133
 
139
- /** Caller-injected per-theme accent overrides — how SERVER-CONFIGURED agent
140
- * colors reach the chips. Consumers resolve the configured value (e.g.
141
- * {@link accentFromIdentityIcon} on the agent row's `icon_props.color`) and
142
- * inject it here; {@link QUICK_ACTION_THEMES} below is fallback-only. */
143
- export type QuickActionThemeAccents = Partial<Record<QuickActionTheme, QuickActionAccent>>
144
-
145
- /** FALLBACK-ONLY theme specs (same contract as {@link getAgentAccent}): the
146
- * built-in accents apply when the caller injects nothing. The fae/mingo
147
- * accents in particular are server-configured per agent — walls/chips accept
148
- * a {@link QuickActionThemeAccents} override (`themeAccents`/`themeAccent`)
149
- * that always wins over this map. */
150
- export const QUICK_ACTION_THEMES: Record<QuickActionTheme, QuickActionThemeSpec> = {
151
- fae: { accent: AGENT_ACCENTS.fae },
152
- mingo: { accent: AGENT_ACCENTS.mingo },
153
- it: { accent: 'var(--color-warning)', lozenge: { label: 'IT', className: 'text-ods-warning' } },
154
- sec: { accent: 'var(--color-error)', lozenge: { label: 'SEC', className: 'text-ods-error' } },
155
- }
156
-
157
134
  /** Resolve a chip label + optional lozenge to the Tag label node. */
158
135
  function composeChipLabel(
159
136
  label: React.ReactNode,
@@ -186,14 +163,10 @@ export interface QuickActionChipButtonProps {
186
163
  /** Icon: a declarative {@link QuickActionIconSpec} (preferred — unified
187
164
  * EntityIcon resolution) or a pre-rendered ReactNode. */
188
165
  icon?: React.ReactNode | QuickActionIconSpec
189
- /** Chip theme ({@link QuickActionTheme}): supplies the icon accent when the
190
- * icon spec doesn't carry its own, and the lozenge when `lozenge` is
191
- * `true`. Explicit values always win over the theme. */
192
- theme?: QuickActionTheme
193
- /** Caller-injected accent for `theme` — the server-configured agent color
194
- * (resolve via {@link accentFromIdentityIcon}). Overrides the theme's
195
- * built-in fallback accent; the icon spec's own `accent` still wins. */
196
- themeAccent?: QuickActionAccent
166
+ /** Caller-supplied {@link QuickActionThemeSpec}: supplies the icon accent
167
+ * when the icon spec doesn't carry its own, and the lozenge when `lozenge`
168
+ * is `true`. Explicit values always win over the theme. */
169
+ theme?: QuickActionThemeSpec
197
170
  /** {@link QuickActionChipLozenge} at the label's leading edge (e.g. an
198
171
  * IT/SEC classification affix). `true` renders the `theme`'s lozenge. */
199
172
  lozenge?: QuickActionChipLozenge | boolean
@@ -286,7 +259,6 @@ export function QuickActionChipButton({
286
259
  label,
287
260
  icon,
288
261
  theme,
289
- themeAccent,
290
262
  lozenge,
291
263
  variant = 'outline',
292
264
  selected = false,
@@ -298,14 +270,11 @@ export function QuickActionChipButton({
298
270
  interactive = true,
299
271
  className,
300
272
  }: QuickActionChipButtonProps) {
301
- const themeSpec = theme ? QUICK_ACTION_THEMES[theme] : undefined
302
- // Accent precedence: the icon spec's own accent (admin-configured color,
303
- // agent identity) → caller-injected `themeAccent` (server-configured agent
304
- // color) → the theme's built-in fallback.
305
- const accent = themeAccent ?? themeSpec?.accent
273
+ // The theme's accent only fills the gap — an icon spec's own accent
274
+ // (admin-configured per-action color) always wins.
306
275
  const themedIcon =
307
- accent && isQuickActionIconSpec(icon) && !icon.accent ? { ...icon, accent } : icon
308
- const resolvedLozenge = lozenge === true ? themeSpec?.lozenge : lozenge === false ? undefined : lozenge
276
+ theme && isQuickActionIconSpec(icon) && !icon.accent ? { ...icon, accent: theme.accent } : icon
277
+ const resolvedLozenge = lozenge === true ? theme?.lozenge : lozenge === false ? undefined : lozenge
309
278
  const resolvedIcon = renderQuickActionIcon(themedIcon)
310
279
  const resolvedLabel = composeChipLabel(label, resolvedLozenge)
311
280
  const tagVariant = selected ? (selectedAccent === 'cyan' ? 'selectedCyan' : 'selected') : variant
@@ -10,7 +10,7 @@ import {
10
10
  type MarqueeWallProps,
11
11
  } from '../ui/marquee-wall'
12
12
  import { QuickActionChipSkeleton } from './quick-action-chip'
13
- import type { QuickActionTheme, QuickActionThemeAccents } from './quick-action-chip'
13
+ import type { QuickActionThemeSpec } from './quick-action-chip'
14
14
  import { QuickActionChipFromData } from './chat-quick-action-row'
15
15
  import type { QuickActionChip } from './chat-quick-action-row'
16
16
 
@@ -49,13 +49,10 @@ export interface QuickActionWallProps {
49
49
  * chat rows), including per-chip `theme`/`lozenge` for mixed IT/SEC
50
50
  * streams. Chips with `onSelect` render as buttons; without, as tags. */
51
51
  chips: ReadonlyArray<QuickActionChip>
52
- /** Wall-default theme (fae/mingo/it/sec) for chips without their own. */
53
- theme?: QuickActionTheme
54
- /** Server-configured per-theme accent overrides
55
- * ({@link QuickActionThemeAccents}) — inject the agents' configured colors
56
- * (resolve via `accentFromIdentityIcon`); the built-in theme accents are
57
- * fallback-only. Per-chip `themeAccent` still wins. */
58
- themeAccents?: QuickActionThemeAccents
52
+ /** Wall-default {@link QuickActionThemeSpec} for chips without their own.
53
+ * Caller-supplied — the lib ships no theme registry; resolve agent colors
54
+ * server-side (e.g. `accentFromIdentityIcon`) and pass the spec here. */
55
+ theme?: QuickActionThemeSpec
59
56
  /** `'animated'` (default): marquee + overflow fades. `'plain'`: no motion,
60
57
  * no blur — the consumer's per-surface opt-out (forwarded to
61
58
  * {@link MarqueeWall}; in brick mode the rows render static and the
@@ -133,7 +130,6 @@ export interface QuickActionWallProps {
133
130
  export function QuickActionWall({
134
131
  chips,
135
132
  theme,
136
- themeAccents,
137
133
  mode = 'animated',
138
134
  lozenges = false,
139
135
  axis,
@@ -180,7 +176,6 @@ export function QuickActionWall({
180
176
  key={chip.id}
181
177
  chip={chip}
182
178
  defaultTheme={theme}
183
- themeAccents={themeAccents}
184
179
  defaultLozenge={lozenges}
185
180
  interactive={!!chip.onSelect}
186
181
  className="max-w-full"
@@ -1,33 +1,47 @@
1
1
  import type { Meta, StoryObj } from '@storybook/nextjs-vite'
2
2
  import { QuickActionWall, interleave } from '../components/chat/quick-action-wall'
3
3
  import type { QuickActionChip } from '../components/chat/chat-quick-action-row'
4
+ import type { QuickActionThemeSpec } from '../components/chat/quick-action-chip'
5
+
6
+ // Theme specs are CALLER-supplied (the lib ships no registry, no fallbacks):
7
+ // these are this story's own demo specs — real consumers resolve agent
8
+ // accents from server config and define their own category pairs.
9
+ const IT_THEME: QuickActionThemeSpec = {
10
+ accent: 'var(--color-warning)',
11
+ lozenge: { label: 'IT', className: 'text-ods-warning' },
12
+ }
13
+ const SEC_THEME: QuickActionThemeSpec = {
14
+ accent: 'var(--color-error)',
15
+ lozenge: { label: 'SEC', className: 'text-ods-error' },
16
+ }
17
+ const FAE_THEME: QuickActionThemeSpec = { accent: 'pink' }
4
18
 
5
19
  // A mixed IT/SEC stream (per-chip themes + lozenges) and a fae wall — the two
6
20
  // wall registers: category-classified deck panels vs agent-themed hero walls.
7
21
  const IT_ACTIONS: ReadonlyArray<QuickActionChip> = [
8
- { id: 'reset-password', label: 'Reset a password', icon: { name: 'key' }, theme: 'it' },
9
- { id: 'new-laptop', label: 'Provision a new laptop', icon: { name: 'laptop' }, theme: 'it' },
10
- { id: 'printer', label: 'Fix the printer', icon: { name: 'printer' }, theme: 'it' },
11
- { id: 'vpn', label: 'VPN will not connect', icon: { name: 'globe' }, theme: 'it' },
12
- { id: 'disk-full', label: 'Disk almost full', icon: { name: 'hard-drive' }, theme: 'it' },
13
- { id: 'onboard', label: 'Onboard a new hire', icon: { name: 'user-plus' }, theme: 'it' },
22
+ { id: 'reset-password', label: 'Reset a password', icon: { name: 'key' }, theme: IT_THEME },
23
+ { id: 'new-laptop', label: 'Provision a new laptop', icon: { name: 'laptop' }, theme: IT_THEME },
24
+ { id: 'printer', label: 'Fix the printer', icon: { name: 'printer' }, theme: IT_THEME },
25
+ { id: 'vpn', label: 'VPN will not connect', icon: { name: 'globe' }, theme: IT_THEME },
26
+ { id: 'disk-full', label: 'Disk almost full', icon: { name: 'hard-drive' }, theme: IT_THEME },
27
+ { id: 'onboard', label: 'Onboard a new hire', icon: { name: 'user-plus' }, theme: IT_THEME },
14
28
  ]
15
29
 
16
30
  const SEC_ACTIONS: ReadonlyArray<QuickActionChip> = [
17
- { id: 'phishing', label: 'Phishing report triage', icon: { name: 'fish' }, theme: 'sec' },
18
- { id: 'mfa', label: 'Enforce MFA', icon: { name: 'shield-check' }, theme: 'sec' },
19
- { id: 'patch', label: 'Patch the CVE', icon: { name: 'bug' }, theme: 'sec' },
20
- { id: 'offboard', label: 'Revoke access on exit', icon: { name: 'user-minus' }, theme: 'sec' },
21
- { id: 'edr-alert', label: 'EDR alert review', icon: { name: 'radar' }, theme: 'sec' },
31
+ { id: 'phishing', label: 'Phishing report triage', icon: { name: 'fish' }, theme: SEC_THEME },
32
+ { id: 'mfa', label: 'Enforce MFA', icon: { name: 'shield-check' }, theme: SEC_THEME },
33
+ { id: 'patch', label: 'Patch the CVE', icon: { name: 'bug' }, theme: SEC_THEME },
34
+ { id: 'offboard', label: 'Revoke access on exit', icon: { name: 'user-minus' }, theme: SEC_THEME },
35
+ { id: 'edr-alert', label: 'EDR alert review', icon: { name: 'radar' }, theme: SEC_THEME },
22
36
  ]
23
37
 
24
38
  const FAE_ACTIONS: ReadonlyArray<QuickActionChip> = [
25
39
  { id: 'how-to-start', label: 'How to start', icon: { name: 'fae' } },
26
- { id: 'connect-device', label: 'Connect device', icon: { name: 'search' }, theme: 'fae' },
27
- { id: 'find-device', label: 'Find device', icon: { name: 'compass' }, theme: 'fae' },
28
- { id: 'remote-connection', label: 'Remote connection', icon: { name: 'rocket' }, theme: 'fae' },
29
- { id: 'run-scripts', label: 'Run scripts', icon: { name: 'bracket-curly' }, theme: 'fae' },
30
- { id: 'device-software', label: 'Device software', icon: { name: 'package' }, theme: 'fae' },
40
+ { id: 'connect-device', label: 'Connect device', icon: { name: 'search' }, theme: FAE_THEME },
41
+ { id: 'find-device', label: 'Find device', icon: { name: 'compass' }, theme: FAE_THEME },
42
+ { id: 'remote-connection', label: 'Remote connection', icon: { name: 'rocket' }, theme: FAE_THEME },
43
+ { id: 'run-scripts', label: 'Run scripts', icon: { name: 'bracket-curly' }, theme: FAE_THEME },
44
+ { id: 'device-software', label: 'Device software', icon: { name: 'package' }, theme: FAE_THEME },
31
45
  ]
32
46
 
33
47
  const meta: Meta<typeof QuickActionWall> = {
@@ -38,7 +52,7 @@ const meta: Meta<typeof QuickActionWall> = {
38
52
  docs: {
39
53
  description: {
40
54
  component:
41
- 'THE quick-action chip wall: a themed pile of the shared chip on the shared `<MarqueeWall>` engine. Static-with-fade when content fits (or `prefers-reduced-motion`); an endless marquee when it overflows — the axis follows the fade (`bottom` fade → content travels bottom→top; `right` fade → right→left). Themes: `fae`/`mingo` (agent identities) and `it`/`sec` (classification pair, with lozenges). Interactive chips pause the track on hover; clone-copy chips stay clickable with wrapper-level a11y. `rows` renders the brick-wall mode (stacked independent row marquees).',
55
+ 'THE quick-action chip wall: a themed pile of the shared chip on the shared `<MarqueeWall>` engine. Static-with-fade when content fits (or `prefers-reduced-motion`); an endless marquee when it overflows — the axis follows the fade (`bottom` fade → content travels bottom→top; `right` fade → right→left). Theme specs (accent + optional lozenge) are caller-supplied per chip or as a wall default — the lib ships no theme registry. Interactive chips pause the track on hover; clone-copy chips stay clickable with wrapper-level a11y. `rows` renders the brick-wall mode (stacked independent row marquees).',
42
56
  },
43
57
  },
44
58
  },