@teamblind-chorus/ui 1.0.1 β†’ 1.2.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 (131) 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 +12 -6
  6. package/agents/components/avatar-rail/avatar-rail.md +2 -0
  7. package/agents/components/avatar-rail/avatar-rail.spec.json +19 -0
  8. package/agents/components/badge/badge.md +2 -0
  9. package/agents/components/badge/role.md +2 -0
  10. package/agents/components/badge/update.md +2 -0
  11. package/agents/components/banner/banner.family.json +3 -1
  12. package/agents/components/banner/banner.md +125 -9
  13. package/agents/components/banner/banner.spec.json +64 -3
  14. package/agents/components/bottom-sheet/bottom-sheet.md +2 -0
  15. package/agents/components/bubble/bubble.md +2 -0
  16. package/agents/components/button/button.family.json +8 -2
  17. package/agents/components/button/button.md +2 -0
  18. package/agents/components/button/check.md +2 -0
  19. package/agents/components/button/check.spec.json +19 -0
  20. package/agents/components/button/fab.md +2 -0
  21. package/agents/components/button/fab.spec.json +19 -0
  22. package/agents/components/button/group.spec.json +65 -0
  23. package/agents/components/button/icon.md +2 -0
  24. package/agents/components/button/icon.spec.json +19 -0
  25. package/agents/components/button/standard.md +45 -19
  26. package/agents/components/button/standard.spec.json +19 -0
  27. package/agents/components/button/text.md +2 -0
  28. package/agents/components/button/text.spec.json +19 -0
  29. package/agents/components/button/toggle.md +2 -0
  30. package/agents/components/button/toggle.spec.json +19 -0
  31. package/agents/components/button/toolbar.md +2 -0
  32. package/agents/components/carousel/carousel.md +2 -0
  33. package/agents/components/carousel/post.md +5 -3
  34. package/agents/components/carousel/post.spec.json +4 -6
  35. package/agents/components/carousel/profile.md +4 -2
  36. package/agents/components/carousel/profile.spec.json +4 -6
  37. package/agents/components/chip/chip.md +2 -0
  38. package/agents/components/chip/filter.md +2 -0
  39. package/agents/components/chip/filter.spec.json +19 -0
  40. package/agents/components/chip/tag.md +2 -0
  41. package/agents/components/chip/tag.spec.json +19 -0
  42. package/agents/components/dialog/dialog.md +2 -0
  43. package/agents/components/directory-list/directory-list.md +2 -0
  44. package/agents/components/divider/divider.md +2 -0
  45. package/agents/components/empty-state/empty-state.family.json +28 -0
  46. package/agents/components/empty-state/empty-state.md +69 -0
  47. package/agents/components/empty-state/empty-state.spec.json +87 -0
  48. package/agents/components/feed/ad.md +2 -0
  49. package/agents/components/feed/feed.md +2 -0
  50. package/agents/components/feed/post.md +2 -0
  51. package/agents/components/form-field/form-field.md +3 -1
  52. package/agents/components/form-field/input.md +2 -0
  53. package/agents/components/form-field/input.spec.json +10 -2
  54. package/agents/components/form-field/search.md +2 -0
  55. package/agents/components/form-field/search.spec.json +10 -2
  56. package/agents/components/form-field/select.md +2 -0
  57. package/agents/components/form-field/select.spec.json +9 -1
  58. package/agents/components/form-field/textarea.md +2 -0
  59. package/agents/components/form-field/textarea.spec.json +10 -2
  60. package/agents/components/header/header.md +2 -0
  61. package/agents/components/header/main.md +2 -0
  62. package/agents/components/header/sub.md +2 -0
  63. package/agents/components/list/accordion.md +2 -0
  64. package/agents/components/list/accordion.spec.json +9 -0
  65. package/agents/components/list/entry.md +2 -0
  66. package/agents/components/list/entry.spec.json +21 -1
  67. package/agents/components/list/list.md +3 -1
  68. package/agents/components/list/radio.md +2 -0
  69. package/agents/components/list/radio.spec.json +19 -0
  70. package/agents/components/list/standard.md +48 -0
  71. package/agents/components/list/standard.spec.json +39 -3
  72. package/agents/components/metadata/compact.md +13 -7
  73. package/agents/components/metadata/compact.spec.json +19 -6
  74. package/agents/components/metadata/metadata.family.json +3 -3
  75. package/agents/components/metadata/metadata.md +4 -2
  76. package/agents/components/metadata/standard.md +24 -0
  77. package/agents/components/nav-card/nav-card.md +2 -0
  78. package/agents/components/nav-card/nav-card.spec.json +9 -0
  79. package/agents/components/nav-list/nav-list.md +2 -0
  80. package/agents/components/navigation-bar/main.md +2 -0
  81. package/agents/components/navigation-bar/navigation-bar.md +2 -0
  82. package/agents/components/navigation-bar/search.md +2 -0
  83. package/agents/components/navigation-bar/sub.md +2 -0
  84. package/agents/components/page-shell/page-shell.family.json +1 -1
  85. package/agents/components/page-shell/page-shell.md +35 -0
  86. package/agents/components/page-shell/page-shell.spec.json +85 -0
  87. package/agents/components/pagination/pagination.family.json +26 -0
  88. package/agents/components/pagination/pagination.md +40 -0
  89. package/agents/components/pagination/pagination.spec.json +54 -0
  90. package/agents/components/profile-header/profile-header.md +2 -0
  91. package/agents/components/progress/progress.md +2 -0
  92. package/agents/components/side-sheet/side-sheet.md +2 -0
  93. package/agents/components/skeleton/skeleton.md +2 -0
  94. package/agents/components/spinner/spinner.family.json +27 -0
  95. package/agents/components/spinner/spinner.md +98 -0
  96. package/agents/components/spinner/spinner.spec.json +82 -0
  97. package/agents/components/status-tag/status-tag.md +2 -0
  98. package/agents/components/suggestion-list/suggestion-list.md +2 -0
  99. package/agents/components/switch/switch.md +2 -0
  100. package/agents/components/switch/switch.spec.json +9 -0
  101. package/agents/components/tab-bar/tab-bar.md +2 -0
  102. package/agents/components/tab-bar/tab-bar.spec.json +16 -0
  103. package/agents/components/tabs/rounded.md +2 -0
  104. package/agents/components/tabs/rounded.spec.json +19 -0
  105. package/agents/components/tabs/segmented.md +2 -0
  106. package/agents/components/tabs/tabs.md +2 -0
  107. package/agents/components/tabs/underline.md +2 -0
  108. package/agents/components/tabs/underline.spec.json +19 -0
  109. package/agents/components/thumbnail/thumbnail.md +2 -0
  110. package/agents/components/toast/toast.md +2 -0
  111. package/agents/components/tooltip/tooltip.md +2 -0
  112. package/agents/compose.md +3 -3
  113. package/agents/manifest.json +9 -6
  114. package/agents/patterns/README.md +2 -0
  115. package/agents/patterns/actions.md +2 -0
  116. package/agents/patterns/browsing.md +2 -0
  117. package/agents/patterns/communications.md +2 -0
  118. package/agents/patterns/layout.md +2 -0
  119. package/agents/patterns/modals.md +2 -0
  120. package/agents/patterns/visual.md +2 -0
  121. package/agents/usage.json +27 -3
  122. package/dist/index.cjs +433 -97
  123. package/dist/index.cjs.map +1 -1
  124. package/dist/index.d.cts +74 -3
  125. package/dist/index.d.ts +74 -3
  126. package/dist/index.js +430 -98
  127. package/dist/index.js.map +1 -1
  128. package/dist/styles.css +365 -41
  129. package/package.json +1 -2
  130. package/agents/reconstruct.md +0 -55
  131. package/agents/scoped-adoption.md +0 -111
@@ -39,15 +39,15 @@
39
39
  "styles": "packages/ui/src/styles.css",
40
40
  "iconsExportSubpath": "@teamblind-chorus/ui/icons",
41
41
  "stylesExportSubpath": "@teamblind-chorus/ui/styles.css",
42
- "published": false,
43
- "distribution": "source",
44
- "note": "Workspace-only, source-distributed. External tools either (a) read JSX directly from `entry` (compile JSX themselves) or (b) consume the structural contract via `schema/components/<family>/<sub>.spec.json` and re-render with their own renderer. Either path MUST also load `styles.css` once at the app entry β€” the JSX emits inline `--<component>-*` plumbing vars but expects the static rules in `styles.css` to receive them. The package is marked `private: true` and intentionally pinned at version `0.0.0` until a publishing decision is made."
42
+ "published": true,
43
+ "distribution": "npm",
44
+ "note": "Published to npm as `@teamblind-chorus/ui` (built `dist/` β€” compiled components, type declarations, and CSS). External tools either (a) install the package and import its components, or (b) consume the structural contract via `schema/components/<family>/<sub>.spec.json` and re-render with their own renderer. Either path MUST also load `@teamblind-chorus/ui/styles.css` once at the app entry β€” components emit inline `--<component>-*` plumbing vars but expect the static rules in `styles.css` to receive them."
45
45
  },
46
46
  "tokens": {
47
47
  "name": "@teamblind-chorus/tokens",
48
- "published": false,
49
- "distribution": "source",
50
- "note": "Workspace-only. External tools should prefer the `tokens.resolved.*` bundles above over the three-tier source files unless they specifically need the reference graph."
48
+ "published": true,
49
+ "distribution": "npm",
50
+ "note": "Published to npm as `@teamblind-chorus/tokens`. External tools should prefer the `tokens.resolved.*` bundles above over the three-tier source files unless they specifically need the reference graph."
51
51
  }
52
52
  },
53
53
  "components": [
@@ -62,6 +62,7 @@
62
62
  { "family": "dialog", "root": "components/dialog/dialog.family.json" },
63
63
  { "family": "divider", "root": "components/divider/divider.family.json" },
64
64
  { "family": "directory-list", "root": "components/directory-list/directory-list.family.json" },
65
+ { "family": "empty-state", "root": "components/empty-state/empty-state.family.json" },
65
66
  { "family": "feed", "root": "components/feed/feed.family.json" },
66
67
  { "family": "form-field", "root": "components/form-field/form-field.family.json" },
67
68
  { "family": "header", "root": "components/header/header.family.json" },
@@ -71,11 +72,13 @@
71
72
  { "family": "nav-list", "root": "components/nav-list/nav-list.family.json" },
72
73
  { "family": "navigation-bar", "root": "components/navigation-bar/navigation-bar.family.json" },
73
74
  { "family": "page-shell", "root": "components/page-shell/page-shell.family.json" },
75
+ { "family": "pagination", "root": "components/pagination/pagination.family.json" },
74
76
  { "family": "profile-header", "root": "components/profile-header/profile-header.family.json" },
75
77
  { "family": "progress", "root": "components/progress/progress.family.json" },
76
78
  { "family": "carousel", "root": "components/carousel/carousel.family.json" },
77
79
  { "family": "side-sheet", "root": "components/side-sheet/side-sheet.family.json" },
78
80
  { "family": "skeleton", "root": "components/skeleton/skeleton.family.json" },
81
+ { "family": "spinner", "root": "components/spinner/spinner.family.json" },
79
82
  { "family": "status-tag", "root": "components/status-tag/status-tag.family.json" },
80
83
  { "family": "switch", "root": "components/switch/switch.family.json" },
81
84
  { "family": "tab-bar", "root": "components/tab-bar/tab-bar.family.json" },
@@ -1,5 +1,7 @@
1
1
  # Patterns
2
2
 
3
+ > πŸ‡°πŸ‡· ν•œκ΅­μ–΄: [`i18n/ko/patterns/README.md`](../i18n/ko/patterns/README.md)
4
+
3
5
  Canonical visual references for Chorus. Each pattern pairs an **image board** (`<slug>.png`) with a spec note (`<slug>.md`) covering intent, layout, tokens, and components. Boards are grouped by *what the surface does* β€” each `.png` is a montage of representative screens so an agent can learn a category's recurring patterns and visuals at a glance.
4
6
 
5
7
  Schemas say *what is allowed*; patterns say *what good looks like*.
@@ -4,6 +4,8 @@ image: ./actions.png
4
4
  status: canonical
5
5
  ---
6
6
 
7
+ > πŸ‡°πŸ‡· ν•œκ΅­μ–΄: [`i18n/ko/patterns/actions.md`](../i18n/ko/patterns/actions.md)
8
+
7
9
  ## Intent
8
10
 
9
11
  Task-completion surfaces β€” the user supplies input and commits. Verification forms, keyword/post registration, service-agreement checklists, comment composition, job filter settings, and the home content-creation shortcuts. Each surface is keyboard-first and terminates in **one** high-emphasis primary commit (a full-width or trailing blue `button / standard`), with neutral escapes parked around it. Reach here for the anatomy of "fill something in, then commit it".
@@ -4,6 +4,8 @@ image: ./browsing.png
4
4
  status: canonical
5
5
  ---
6
6
 
7
+ > πŸ‡°πŸ‡· ν•œκ΅­μ–΄: [`i18n/ko/patterns/browsing.md`](../i18n/ko/patterns/browsing.md)
8
+
7
9
  ## Intent
8
10
 
9
11
  Entity discovery and navigation β€” channel drawers, all/followed channel lists, Explore trending rails, search empty/suggestion states, and the company feed. Lists of entities (channels, companies, posts) are the spine; the per-row commit is **Follow / Unfollow** (`button / toggle`), and the **whole row is the nav click target**. Reach here for "browse a set of things and follow/open one".
@@ -4,6 +4,8 @@ image: ./communications.png
4
4
  status: canonical
5
5
  ---
6
6
 
7
+ > πŸ‡°πŸ‡· ν•œκ΅­μ–΄: [`i18n/ko/patterns/communications.md`](../i18n/ko/patterns/communications.md)
8
+
7
9
  ## Intent
8
10
 
9
11
  Authored content and engagement β€” posts, embedded polls, gated previews, comment threads, the channel picker for posting, and offer/poll compose. `feed` is the spine for content streams; `list / radio` carries poll options; compose surfaces commit via a Cancel/Post action bar. Reach here for "read, react to, or author a post or comment".
@@ -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",
@@ -150,6 +156,12 @@
150
156
  "note": "Rows are an `items` array of descriptors (name/followers/description/thumbnail/active/onToggle) β€” there are NO List or row children.",
151
157
  "example": "<DirectoryList label=\"…\" items={[{ value, name, followers, description, thumbnail: { src, alt }, active, onToggle }]} />"
152
158
  },
159
+ "empty-state": {
160
+ "import": "EmptyState",
161
+ "from": "@teamblind-chorus/ui",
162
+ "note": "Headline is the `headline` prop (required); `body` is the `body` prop; the CTA is the `action` object ({ label, href?/onClick? }) which renders a default-size primary Button β€” there is NO `cta` slot to fill with your own button. Pass an icon node to `illustration`.",
163
+ "example": "<EmptyState illustration={<ChatIcon />} headline=\"No posts yet\" body=\"Conversations you start or join will appear here.\" action={{ label: 'Start a post', onClick: () => {} }} />"
164
+ },
153
165
  "feed": {
154
166
  "import": "Feed",
155
167
  "from": "@teamblind-chorus/ui",
@@ -243,7 +255,7 @@
243
255
  "metadata": {
244
256
  "import": "Metadata",
245
257
  "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.",
258
+ "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
259
  "subs": {
248
260
  "standard": {
249
261
  "access": "named",
@@ -254,7 +266,7 @@
254
266
  "access": "variant",
255
267
  "on": "Metadata",
256
268
  "variant": "compact",
257
- "example": "<Metadata variant=\"compact\" meta={[\"Maple Mill Bakery\", \"ryestarter\"]} timestamp=\"35m\" />"
269
+ "example": "<Metadata variant=\"compact\" avatar={{ src, alt }} meta={[\"Maple Mill Bakery\", \"ryestarter\"]} timestamp=\"35m\" />"
258
270
  }
259
271
  }
260
272
  },
@@ -304,6 +316,12 @@
304
316
  "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
317
  "example": "<PageShell nav={<NavigationBar variant=\"home\" … />} tabBar={<TabBar … />}>… scrolling screen content …</PageShell>"
306
318
  },
319
+ "pagination": {
320
+ "import": "Pagination",
321
+ "from": "@teamblind-chorus/ui",
322
+ "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.",
323
+ "example": "<Pagination count={5} activeIndex={2} />"
324
+ },
307
325
  "profile-header": {
308
326
  "import": "ProfileHeader",
309
327
  "from": "@teamblind-chorus/ui",
@@ -351,6 +369,12 @@
351
369
  "note": "shape defaults to text; width/height are consumer-supplied. Stack multiples in SkeletonGroup to mirror the loading content's rhythm.",
352
370
  "example": "<Skeleton shape=\"block\" height={120} />"
353
371
  },
372
+ "spinner": {
373
+ "import": "Spinner",
374
+ "from": "@teamblind-chorus/ui",
375
+ "note": "indeterminate only β€” never bind it to a progress ratio (use Progress). Reserve to one Spinner per view. aria-label defaults to 'Loading'; pass a label child for visible loading copy beside the arc.",
376
+ "example": "<Spinner aria-label=\"Loading\" />"
377
+ },
354
378
  "status-tag": {
355
379
  "import": "StatusTag",
356
380
  "from": "@teamblind-chorus/ui",