@teamblind-chorus/ui 1.0.0 → 1.1.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 (105) hide show
  1. package/agents/AGENTS.md +4 -6
  2. package/agents/DESIGN.md +2 -0
  3. package/agents/LOVABLE.md +167 -373
  4. package/agents/anti-patterns.md +2 -2
  5. package/agents/catalog.md +7 -3
  6. package/agents/components/avatar-rail/avatar-rail.md +2 -0
  7. package/agents/components/badge/badge.md +2 -0
  8. package/agents/components/badge/role.md +2 -0
  9. package/agents/components/badge/update.md +2 -0
  10. package/agents/components/banner/banner.md +72 -9
  11. package/agents/components/banner/banner.spec.json +40 -2
  12. package/agents/components/bottom-sheet/bottom-sheet.md +2 -0
  13. package/agents/components/bubble/bubble.md +2 -0
  14. package/agents/components/button/button.family.json +8 -2
  15. package/agents/components/button/button.md +2 -0
  16. package/agents/components/button/check.md +2 -0
  17. package/agents/components/button/fab.md +2 -0
  18. package/agents/components/button/group.spec.json +65 -0
  19. package/agents/components/button/icon.md +2 -0
  20. package/agents/components/button/standard.md +45 -19
  21. package/agents/components/button/text.md +2 -0
  22. package/agents/components/button/toggle.md +2 -0
  23. package/agents/components/button/toolbar.md +2 -0
  24. package/agents/components/carousel/carousel.md +2 -0
  25. package/agents/components/carousel/post.md +5 -3
  26. package/agents/components/carousel/post.spec.json +4 -6
  27. package/agents/components/carousel/profile.md +4 -2
  28. package/agents/components/carousel/profile.spec.json +4 -6
  29. package/agents/components/chip/chip.md +2 -0
  30. package/agents/components/chip/filter.md +2 -0
  31. package/agents/components/chip/tag.md +2 -0
  32. package/agents/components/dialog/dialog.md +2 -0
  33. package/agents/components/directory-list/directory-list.md +2 -0
  34. package/agents/components/divider/divider.md +2 -0
  35. package/agents/components/feed/ad.md +2 -0
  36. package/agents/components/feed/feed.md +2 -0
  37. package/agents/components/feed/post.md +2 -0
  38. package/agents/components/form-field/form-field.md +3 -1
  39. package/agents/components/form-field/input.md +2 -0
  40. package/agents/components/form-field/input.spec.json +2 -1
  41. package/agents/components/form-field/search.md +2 -0
  42. package/agents/components/form-field/search.spec.json +2 -1
  43. package/agents/components/form-field/select.md +2 -0
  44. package/agents/components/form-field/textarea.md +2 -0
  45. package/agents/components/form-field/textarea.spec.json +2 -1
  46. package/agents/components/header/header.md +2 -0
  47. package/agents/components/header/main.md +2 -0
  48. package/agents/components/header/sub.md +2 -0
  49. package/agents/components/list/accordion.md +2 -0
  50. package/agents/components/list/entry.md +2 -0
  51. package/agents/components/list/entry.spec.json +2 -1
  52. package/agents/components/list/list.md +3 -1
  53. package/agents/components/list/radio.md +2 -0
  54. package/agents/components/list/standard.md +2 -0
  55. package/agents/components/list/standard.spec.json +2 -1
  56. package/agents/components/metadata/compact.md +13 -7
  57. package/agents/components/metadata/compact.spec.json +19 -6
  58. package/agents/components/metadata/metadata.family.json +3 -3
  59. package/agents/components/metadata/metadata.md +4 -2
  60. package/agents/components/metadata/standard.md +24 -0
  61. package/agents/components/nav-card/nav-card.md +2 -0
  62. package/agents/components/nav-list/nav-list.md +2 -0
  63. package/agents/components/navigation-bar/main.md +2 -0
  64. package/agents/components/navigation-bar/navigation-bar.md +2 -0
  65. package/agents/components/navigation-bar/search.md +2 -0
  66. package/agents/components/navigation-bar/sub.md +2 -0
  67. package/agents/components/page-shell/page-shell.md +2 -0
  68. package/agents/components/pagination/pagination.family.json +26 -0
  69. package/agents/components/pagination/pagination.md +40 -0
  70. package/agents/components/pagination/pagination.spec.json +54 -0
  71. package/agents/components/profile-header/profile-header.md +2 -0
  72. package/agents/components/progress/progress.md +2 -0
  73. package/agents/components/side-sheet/side-sheet.md +2 -0
  74. package/agents/components/skeleton/skeleton.md +2 -0
  75. package/agents/components/status-tag/status-tag.md +2 -0
  76. package/agents/components/suggestion-list/suggestion-list.md +2 -0
  77. package/agents/components/switch/switch.md +2 -0
  78. package/agents/components/tab-bar/tab-bar.md +2 -0
  79. package/agents/components/tabs/rounded.md +2 -0
  80. package/agents/components/tabs/segmented.md +2 -0
  81. package/agents/components/tabs/tabs.md +2 -0
  82. package/agents/components/tabs/underline.md +2 -0
  83. package/agents/components/thumbnail/thumbnail.md +2 -0
  84. package/agents/components/toast/toast.md +2 -0
  85. package/agents/components/tooltip/tooltip.md +2 -0
  86. package/agents/compose.md +3 -3
  87. package/agents/manifest.json +1 -0
  88. package/agents/patterns/README.md +2 -0
  89. package/agents/patterns/actions.md +2 -0
  90. package/agents/patterns/browsing.md +2 -0
  91. package/agents/patterns/communications.md +2 -0
  92. package/agents/patterns/layout.md +2 -0
  93. package/agents/patterns/modals.md +2 -0
  94. package/agents/patterns/visual.md +2 -0
  95. package/agents/usage.json +15 -3
  96. package/dist/index.cjs +95 -39
  97. package/dist/index.cjs.map +1 -1
  98. package/dist/index.d.cts +28 -1
  99. package/dist/index.d.ts +28 -1
  100. package/dist/index.js +94 -40
  101. package/dist/index.js.map +1 -1
  102. package/dist/styles.css +183 -41
  103. package/package.json +2 -3
  104. package/agents/reconstruct.md +0 -55
  105. package/agents/scoped-adoption.md +0 -111
@@ -4,6 +4,8 @@ image: ./layout.png
4
4
  status: canonical
5
5
  ---
6
6
 
7
+ > 🇰🇷 한국어: [`i18n/ko/patterns/layout.md`](../i18n/ko/patterns/layout.md)
8
+
7
9
  ## Intent
8
10
 
9
11
  Page-level scaffolding and navigation chrome across the five main tab destinations — **Home, Company, Explore, Jobs, Notifications** — plus a channel profile. This board is the reference for *frame*, not content: how a screen seats its top bar, in-page tabs, filter rail, scrolling body, and bottom tab bar so every destination reads as one geometry. When composing any full screen, match the scaffold here before filling slots.
@@ -4,6 +4,8 @@ image: ./modals.png
4
4
  status: canonical
5
5
  ---
6
6
 
7
+ > 🇰🇷 한국어: [`i18n/ko/patterns/modals.md`](../i18n/ko/patterns/modals.md)
8
+
7
9
  ## Intent
8
10
 
9
11
  Overlay surfaces that interrupt the flow for a commit or disclosure — confirmation Dialogs, info Dialogs, a full-screen disclosure panel, bottom-anchored confirmation CTAs, and BottomSheet purchase flows. These are the interaction-contract primitives: `dialog` and `bottom-sheet` are `visualReuse: "locked"` — chosen for behavior (scrim, focus trap, ARIA), never borrowed for shape. Reach here for "block the screen until the user decides".
@@ -4,6 +4,8 @@ image: ./visual.png
4
4
  status: canonical
5
5
  ---
6
6
 
7
+ > 🇰🇷 한국어: [`i18n/ko/patterns/visual.md`](../i18n/ko/patterns/visual.md)
8
+
7
9
  ## Intent
8
10
 
9
11
  Image-bearing and expressive surfaces — empty-state illustrations, photo grids, media-rich cover cards, colorful category tiles, illustration banners, and gated-channel covers. This board is the reference for the **image-area contract**: every `assetType: "image"` slot fills with the universal `/placeholder.png` and swaps to a context image by changing only the `src`, never the slot's footprint. Reach here for "this surface carries pictures, not just text".
package/agents/usage.json CHANGED
@@ -50,7 +50,7 @@
50
50
  "button": {
51
51
  "import": "Button",
52
52
  "from": "@teamblind-chorus/ui",
53
- "note": "All button roles are the single `Button` export selected by the `variant` prop — there is NO `<Fab>`, `<IconButton>`, `<ToggleButton>`, or `<Toolbar>` export. An `import { Fab }` failure does NOT mean the family is missing; reach for `<Button variant=\"fab\">`.",
53
+ "note": "All button ROLES are the single `Button` export selected by the `variant` prop — there is NO `<Fab>`, `<IconButton>`, `<ToggleButton>`, or `<Toolbar>` export. An `import { Fab }` failure does NOT mean the family is missing; reach for `<Button variant=\"fab\">`. The one separate named export is `ButtonGroup` (the `group` sub) — a layout wrapper for two or more Buttons, NOT a Button variant.",
54
54
  "subs": {
55
55
  "standard": {
56
56
  "access": "variant",
@@ -58,6 +58,12 @@
58
58
  "variant": "standard",
59
59
  "example": "<Button variant=\"standard\" … />"
60
60
  },
61
+ "group": {
62
+ "access": "named",
63
+ "import": "ButtonGroup",
64
+ "example": "<ButtonGroup variant=\"docked\" label={<>선택한 직군: <strong>SW개발</strong></>}><Button appearance=\"outlined\" size=\"large\">연봉 정보</Button><Button appearance=\"primary\" size=\"large\">추천 채용공고</Button></ButtonGroup>",
65
+ "note": "Named export — NOT a Button variant (there is no `<Button variant=\"group\">`). Lays out adjacent Buttons; `variant=\"docked\"` is the bottom-pinned action bar (surface + 16px inset + 8px gap + upward `sys.elevation.sheet` shadow + optional `label`). Renders in flow — PageShell owns the pinning."
66
+ },
61
67
  "fab": {
62
68
  "access": "variant",
63
69
  "on": "Button",
@@ -243,7 +249,7 @@
243
249
  "metadata": {
244
250
  "import": "Metadata",
245
251
  "from": "@teamblind-chorus/ui",
246
- "note": "Both shapes are the single `Metadata` export — the one-line comment shape is `variant=\"compact\"`, NOT a separate `<MetadataCompact>`. Leading thumbnail is the `avatar` prop (NOT `thumbnail`); the secondary line is either a `subtitle` string or a `meta` string array — not children.",
252
+ "note": "Both shapes are the single `Metadata` export — the one-line channel-detail shape is `variant=\"compact\"`, NOT a separate `<MetadataCompact>`. Leading thumbnail is the `avatar` prop (NOT `thumbnail`) on both shapes; the secondary line is either a `subtitle` string or a `meta` string array — not children.",
247
253
  "subs": {
248
254
  "standard": {
249
255
  "access": "named",
@@ -254,7 +260,7 @@
254
260
  "access": "variant",
255
261
  "on": "Metadata",
256
262
  "variant": "compact",
257
- "example": "<Metadata variant=\"compact\" meta={[\"Maple Mill Bakery\", \"ryestarter\"]} timestamp=\"35m\" />"
263
+ "example": "<Metadata variant=\"compact\" avatar={{ src, alt }} meta={[\"Maple Mill Bakery\", \"ryestarter\"]} timestamp=\"35m\" />"
258
264
  }
259
265
  }
260
266
  },
@@ -304,6 +310,12 @@
304
310
  "note": "Compose the bars INTO the shell — do NOT hand-roll a flex column, and do NOT add position:sticky/fixed to the bars (that double-applies their safe-area insets). The dev-only usePinnedBarGuard warns when a bar is rendered inside a scrolling region instead.",
305
311
  "example": "<PageShell nav={<NavigationBar variant=\"home\" … />} tabBar={<TabBar … />}>… scrolling screen content …</PageShell>"
306
312
  },
313
+ "pagination": {
314
+ "import": "Pagination",
315
+ "from": "@teamblind-chorus/ui",
316
+ "note": "Decorative only — the root is `aria-hidden` and dots are not buttons. An inline element with intrinsic width: the host owns horizontal placement (e.g. centering under its pager) as well as the active index (e.g. via IntersectionObserver on its snap targets), and MUST keep later pages keyboard-reachable on its own. Renders nothing when `count` < 2.",
317
+ "example": "<Pagination count={5} activeIndex={2} />"
318
+ },
307
319
  "profile-header": {
308
320
  "import": "ProfileHeader",
309
321
  "from": "@teamblind-chorus/ui",
package/dist/index.cjs CHANGED
@@ -237,9 +237,12 @@ function useFullBleedGuard(ref, name) {
237
237
  }
238
238
  function Banner({
239
239
  appearance = "default",
240
+ outlined = false,
241
+ title,
240
242
  icon,
241
243
  thumbnail,
242
244
  action,
245
+ trailingIcon,
243
246
  children,
244
247
  className,
245
248
  ...rest
@@ -250,13 +253,19 @@ function Banner({
250
253
  "div",
251
254
  {
252
255
  ref,
253
- className: joinClasses("chorus-banner", `chorus-banner--${appearance}`, className),
256
+ className: joinClasses(
257
+ "chorus-banner",
258
+ `chorus-banner--${appearance}`,
259
+ outlined && "chorus-banner--outlined",
260
+ className
261
+ ),
254
262
  role: "note",
255
263
  ...rest,
256
264
  children: [
257
265
  thumbnail ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "chorus-banner__thumbnail", "aria-hidden": "true", children: thumbnail }) : null,
258
266
  !thumbnail && icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "chorus-banner__icon", "aria-hidden": "true", children: icon }) : null,
259
267
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "chorus-banner__content", children: [
268
+ title ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "chorus-banner__title", children: title }) : null,
260
269
  children ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "chorus-banner__body", children }) : null,
261
270
  action ? /* @__PURE__ */ jsxRuntime.jsx(
262
271
  "a",
@@ -267,7 +276,8 @@ function Banner({
267
276
  children: action.label
268
277
  }
269
278
  ) : null
270
- ] })
279
+ ] }),
280
+ trailingIcon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "chorus-banner__trailing-icon", "aria-hidden": "true", children: trailingIcon }) : null
271
281
  ]
272
282
  }
273
283
  );
@@ -1847,7 +1857,7 @@ var FORCEABLE_STATES3 = /* @__PURE__ */ new Set(["hovered", "pressed", "focused"
1847
1857
  var SPECS = {
1848
1858
  filter: filter_spec_default,
1849
1859
  tag: tag_spec_default,
1850
- "toggle": toggle_spec_default
1860
+ toggle: toggle_spec_default
1851
1861
  };
1852
1862
  function pickAppearance(spec, appearance) {
1853
1863
  const appearances = spec.appearances || {};
@@ -1989,11 +1999,11 @@ function ButtonToggle({ active = false, ...rest }) {
1989
1999
  }
1990
2000
  var VARIANTS = {
1991
2001
  fab: ButtonFab,
1992
- "icon": ButtonIcon,
1993
- "text": ButtonText,
1994
- "check": ButtonCheck,
1995
- "toolbar": ButtonToolbar,
1996
- "toggle": ButtonToggle
2002
+ icon: ButtonIcon,
2003
+ text: ButtonText,
2004
+ check: ButtonCheck,
2005
+ toolbar: ButtonToolbar,
2006
+ toggle: ButtonToggle
1997
2007
  };
1998
2008
  var Button = react.forwardRef(function Button2({ variant, ...rest }, ref) {
1999
2009
  const Impl = variant && VARIANTS[variant] || ButtonStandard;
@@ -2155,6 +2165,35 @@ function Bubble({
2155
2165
  }
2156
2166
  );
2157
2167
  }
2168
+ function ButtonGroup({
2169
+ variant = "inline",
2170
+ orientation = "horizontal",
2171
+ label,
2172
+ children,
2173
+ className,
2174
+ "aria-label": ariaLabel,
2175
+ ...rest
2176
+ }) {
2177
+ const docked = variant === "docked";
2178
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2179
+ "div",
2180
+ {
2181
+ className: joinClasses(
2182
+ "chorus-button-group",
2183
+ docked && "chorus-button-group--docked",
2184
+ orientation === "vertical" && "chorus-button-group--vertical",
2185
+ className
2186
+ ),
2187
+ role: "group",
2188
+ "aria-label": ariaLabel,
2189
+ ...rest,
2190
+ children: [
2191
+ label != null ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "chorus-button-group__label", children: label }) : null,
2192
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "chorus-button-group__row", children })
2193
+ ]
2194
+ }
2195
+ );
2196
+ }
2158
2197
 
2159
2198
  // ../../schema/components/header/main.spec.json
2160
2199
  var main_spec_default = {
@@ -2315,6 +2354,7 @@ function EntryRow({
2315
2354
  "span",
2316
2355
  {
2317
2356
  className: "chorus-entry-row__trailing",
2357
+ "data-nested-action": "",
2318
2358
  onClick: (e) => e.stopPropagation(),
2319
2359
  onKeyDown: (e) => e.stopPropagation(),
2320
2360
  children: trailing
@@ -2436,6 +2476,7 @@ function List({
2436
2476
  "span",
2437
2477
  {
2438
2478
  className: "chorus-list__trailing",
2479
+ "data-nested-action": "",
2439
2480
  onClick: (e) => e.stopPropagation(),
2440
2481
  onKeyDown: (e) => e.stopPropagation(),
2441
2482
  children: item.trailingIcon
@@ -3189,13 +3230,13 @@ function Metadata({
3189
3230
  const hasMeta = Array.isArray(meta) && meta.length > 0;
3190
3231
  const hasSubtitle = !hasMeta && subtitle != null && subtitle !== "";
3191
3232
  if (variant === "compact") {
3192
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: joinClasses("chorus-metadata", "chorus-metadata--compact", className), ...rest, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "chorus-metadata__meta", children: [
3193
- hasMeta ? metaParts(meta) : null,
3194
- timestamp ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3195
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "chorus-metadata__dot", "aria-hidden": "true", children: "\xB7" }),
3196
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "chorus-metadata__timestamp", children: timestamp })
3197
- ] }) : null
3198
- ] }) });
3233
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: joinClasses("chorus-metadata", "chorus-metadata--compact", className), ...rest, children: [
3234
+ avatar ? /* @__PURE__ */ jsxRuntime.jsx(Thumbnail, { size: 32, ...avatar }) : null,
3235
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "chorus-metadata__meta", children: [
3236
+ hasMeta ? metaParts(meta) : null,
3237
+ timestamp ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "chorus-metadata__timestamp", children: timestamp }) : null
3238
+ ] })
3239
+ ] });
3199
3240
  }
3200
3241
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: joinClasses("chorus-metadata", className), ...rest, children: [
3201
3242
  /* @__PURE__ */ jsxRuntime.jsx(Thumbnail, { size: 32, ...avatar ?? { alt: typeof name === "string" ? name : "" } }),
@@ -3486,6 +3527,33 @@ function FeedAd({
3486
3527
  ) : null
3487
3528
  ] });
3488
3529
  }
3530
+ function Pagination({
3531
+ count = 0,
3532
+ activeIndex = 0,
3533
+ className,
3534
+ ...rest
3535
+ }) {
3536
+ if (count < 2) return null;
3537
+ const active = Math.max(0, Math.min(count - 1, activeIndex));
3538
+ return /* @__PURE__ */ jsxRuntime.jsx(
3539
+ "span",
3540
+ {
3541
+ className: joinClasses("chorus-pagination", className),
3542
+ "aria-hidden": "true",
3543
+ ...rest,
3544
+ children: Array.from({ length: count }, (_, idx) => /* @__PURE__ */ jsxRuntime.jsx(
3545
+ "span",
3546
+ {
3547
+ className: joinClasses(
3548
+ "chorus-pagination__dot",
3549
+ idx === active && "chorus-pagination__dot--active"
3550
+ )
3551
+ },
3552
+ idx
3553
+ ))
3554
+ }
3555
+ );
3556
+ }
3489
3557
  var MAX_CARDS = 5;
3490
3558
  function PostCarousel({
3491
3559
  items = [],
@@ -3546,16 +3614,7 @@ function PostCarousel({
3546
3614
  ))
3547
3615
  }
3548
3616
  ),
3549
- cards.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "chorus-post-carousel__pagination", "aria-hidden": "true", children: cards.map((_, idx) => /* @__PURE__ */ jsxRuntime.jsx(
3550
- "span",
3551
- {
3552
- className: joinClasses(
3553
- "chorus-post-carousel__dot",
3554
- idx === activeIndex && "chorus-post-carousel__dot--active"
3555
- )
3556
- },
3557
- idx
3558
- )) }) : null
3617
+ /* @__PURE__ */ jsxRuntime.jsx(Pagination, { count: cards.length, activeIndex })
3559
3618
  ]
3560
3619
  }
3561
3620
  );
@@ -3706,16 +3765,7 @@ function ProfileCarousel({
3706
3765
  ))
3707
3766
  }
3708
3767
  ),
3709
- cards.length > 1 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "chorus-profile-carousel__pagination", "aria-hidden": "true", children: cards.map((_, idx) => /* @__PURE__ */ jsxRuntime.jsx(
3710
- "span",
3711
- {
3712
- className: joinClasses(
3713
- "chorus-profile-carousel__dot",
3714
- idx === activeIndex && "chorus-profile-carousel__dot--active"
3715
- )
3716
- },
3717
- idx
3718
- )) }) : null
3768
+ /* @__PURE__ */ jsxRuntime.jsx(Pagination, { count: cards.length, activeIndex })
3719
3769
  ]
3720
3770
  }
3721
3771
  );
@@ -4319,7 +4369,8 @@ var input_spec_default = {
4319
4369
  overlay: {
4320
4370
  color: "text",
4321
4371
  opacity: "sys.state.pressed"
4322
- }
4372
+ },
4373
+ nestedActionScope: "The pressed overlay (and hover stroke) is suppressed while the pointer presses / hovers the trailing clear button \u2014 that '\xD7' is an independent nested action, so the small control owns the state and the large field does not also read as pressed. The visual-state boundary matches the action boundary."
4323
4374
  },
4324
4375
  active: {
4325
4376
  overlay: null,
@@ -4505,7 +4556,8 @@ var textarea_spec_default = {
4505
4556
  hovered: { overlay: null, border: "borderHover" },
4506
4557
  pressed: {
4507
4558
  border: "borderHover",
4508
- overlay: { color: "text", opacity: "sys.state.pressed" }
4559
+ overlay: { color: "text", opacity: "sys.state.pressed" },
4560
+ nestedActionScope: "The pressed overlay (and hover stroke) is suppressed while the pointer presses / hovers the trailing clear button \u2014 that '\xD7' is an independent nested action, so the small control owns the state and the large field does not also read as pressed. The visual-state boundary matches the action boundary."
4509
4561
  },
4510
4562
  active: {
4511
4563
  overlay: null,
@@ -4642,7 +4694,8 @@ var search_spec_default = {
4642
4694
  overlay: {
4643
4695
  color: "text",
4644
4696
  opacity: "sys.state.pressed"
4645
- }
4697
+ },
4698
+ nestedActionScope: "The pressed overlay (and hover stroke) is suppressed while the pointer presses / hovers the trailing clear button \u2014 that '\xD7' is an independent nested action, so the small control owns the state and the large field does not also read as pressed. The visual-state boundary matches the action boundary."
4646
4699
  },
4647
4700
  active: {
4648
4701
  overlay: null,
@@ -5013,6 +5066,7 @@ function FormFieldBox({
5013
5066
  {
5014
5067
  type: "button",
5015
5068
  className: "chorus-field__clear",
5069
+ "data-nested-action": "",
5016
5070
  "aria-label": "Clear",
5017
5071
  onClick: handleClear,
5018
5072
  children: /* @__PURE__ */ jsxRuntime.jsx(XCircleFillIcon, {})
@@ -5107,7 +5161,7 @@ var FormFieldSelect = Select;
5107
5161
  var VARIANTS3 = {
5108
5162
  input: FormFieldInput,
5109
5163
  textarea: FormFieldTextarea,
5110
- "search": FormFieldSearchBar,
5164
+ search: FormFieldSearchBar,
5111
5165
  select: FormFieldSelect
5112
5166
  };
5113
5167
  function FormField({ variant = "input", ...rest }) {
@@ -5855,6 +5909,7 @@ exports.BottomNav = TabBar;
5855
5909
  exports.BottomSheet = BottomSheet;
5856
5910
  exports.Bubble = Bubble;
5857
5911
  exports.Button = Button;
5912
+ exports.ButtonGroup = ButtonGroup;
5858
5913
  exports.Carousel = Carousel;
5859
5914
  exports.ChannelList = SuggestionList;
5860
5915
  exports.ChannelRail = AvatarRail;
@@ -5877,6 +5932,7 @@ exports.NavCardGroup = NavCardGroup;
5877
5932
  exports.NavList = NavList;
5878
5933
  exports.NavigationBar = NavigationBar;
5879
5934
  exports.PageShell = PageShell;
5935
+ exports.Pagination = Pagination;
5880
5936
  exports.PostCarousel = PostCarousel;
5881
5937
  exports.ProfileCarousel = ProfileCarousel;
5882
5938
  exports.ProfileHeader = ProfileHeader;