@teamblind-chorus/ui 1.0.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/agents/AGENTS.md +143 -0
  4. package/agents/DESIGN.md +1311 -0
  5. package/agents/LOVABLE.md +472 -0
  6. package/agents/anti-patterns.md +533 -0
  7. package/agents/catalog.md +232 -0
  8. package/agents/components/avatar-rail/avatar-rail.family.json +46 -0
  9. package/agents/components/avatar-rail/avatar-rail.md +103 -0
  10. package/agents/components/avatar-rail/avatar-rail.spec.json +160 -0
  11. package/agents/components/badge/badge.family.json +45 -0
  12. package/agents/components/badge/badge.md +10 -0
  13. package/agents/components/badge/role.md +100 -0
  14. package/agents/components/badge/role.spec.json +75 -0
  15. package/agents/components/badge/update.md +132 -0
  16. package/agents/components/badge/update.spec.json +114 -0
  17. package/agents/components/banner/banner.family.json +28 -0
  18. package/agents/components/banner/banner.md +136 -0
  19. package/agents/components/banner/banner.spec.json +136 -0
  20. package/agents/components/bottom-sheet/bottom-sheet.family.json +29 -0
  21. package/agents/components/bottom-sheet/bottom-sheet.md +176 -0
  22. package/agents/components/bottom-sheet/bottom-sheet.spec.json +168 -0
  23. package/agents/components/bubble/bubble.family.json +29 -0
  24. package/agents/components/bubble/bubble.md +134 -0
  25. package/agents/components/bubble/bubble.spec.json +91 -0
  26. package/agents/components/button/button.family.json +76 -0
  27. package/agents/components/button/button.md +31 -0
  28. package/agents/components/button/check.md +138 -0
  29. package/agents/components/button/check.spec.json +161 -0
  30. package/agents/components/button/fab.md +161 -0
  31. package/agents/components/button/fab.spec.json +106 -0
  32. package/agents/components/button/icon.md +141 -0
  33. package/agents/components/button/icon.spec.json +164 -0
  34. package/agents/components/button/standard.md +219 -0
  35. package/agents/components/button/standard.spec.json +205 -0
  36. package/agents/components/button/text.md +186 -0
  37. package/agents/components/button/text.spec.json +215 -0
  38. package/agents/components/button/toggle.md +108 -0
  39. package/agents/components/button/toggle.spec.json +124 -0
  40. package/agents/components/button/toolbar.md +189 -0
  41. package/agents/components/button/toolbar.spec.json +109 -0
  42. package/agents/components/carousel/carousel.family.json +41 -0
  43. package/agents/components/carousel/carousel.md +40 -0
  44. package/agents/components/carousel/post.md +148 -0
  45. package/agents/components/carousel/post.spec.json +229 -0
  46. package/agents/components/carousel/profile.md +184 -0
  47. package/agents/components/carousel/profile.spec.json +219 -0
  48. package/agents/components/chip/chip.family.json +37 -0
  49. package/agents/components/chip/chip.md +10 -0
  50. package/agents/components/chip/filter.md +212 -0
  51. package/agents/components/chip/filter.spec.json +124 -0
  52. package/agents/components/chip/tag.md +137 -0
  53. package/agents/components/chip/tag.spec.json +104 -0
  54. package/agents/components/dialog/dialog.family.json +29 -0
  55. package/agents/components/dialog/dialog.md +113 -0
  56. package/agents/components/dialog/dialog.spec.json +156 -0
  57. package/agents/components/directory-list/directory-list.family.json +46 -0
  58. package/agents/components/directory-list/directory-list.md +87 -0
  59. package/agents/components/directory-list/directory-list.spec.json +104 -0
  60. package/agents/components/divider/divider.family.json +28 -0
  61. package/agents/components/divider/divider.md +78 -0
  62. package/agents/components/divider/divider.spec.json +51 -0
  63. package/agents/components/feed/ad.md +108 -0
  64. package/agents/components/feed/ad.spec.json +187 -0
  65. package/agents/components/feed/feed.family.json +48 -0
  66. package/agents/components/feed/feed.md +30 -0
  67. package/agents/components/feed/post.md +240 -0
  68. package/agents/components/feed/post.spec.json +361 -0
  69. package/agents/components/form-field/form-field.family.json +50 -0
  70. package/agents/components/form-field/form-field.md +11 -0
  71. package/agents/components/form-field/input.md +198 -0
  72. package/agents/components/form-field/input.spec.json +202 -0
  73. package/agents/components/form-field/search.md +81 -0
  74. package/agents/components/form-field/search.spec.json +135 -0
  75. package/agents/components/form-field/select.md +101 -0
  76. package/agents/components/form-field/select.spec.json +194 -0
  77. package/agents/components/form-field/textarea.md +89 -0
  78. package/agents/components/form-field/textarea.spec.json +176 -0
  79. package/agents/components/header/header.family.json +43 -0
  80. package/agents/components/header/header.md +18 -0
  81. package/agents/components/header/main.md +101 -0
  82. package/agents/components/header/main.spec.json +117 -0
  83. package/agents/components/header/sub.md +129 -0
  84. package/agents/components/header/sub.spec.json +81 -0
  85. package/agents/components/list/accordion.md +183 -0
  86. package/agents/components/list/accordion.spec.json +201 -0
  87. package/agents/components/list/entry.md +280 -0
  88. package/agents/components/list/entry.spec.json +237 -0
  89. package/agents/components/list/list.family.json +75 -0
  90. package/agents/components/list/list.md +24 -0
  91. package/agents/components/list/radio.md +144 -0
  92. package/agents/components/list/radio.spec.json +186 -0
  93. package/agents/components/list/standard.md +262 -0
  94. package/agents/components/list/standard.spec.json +221 -0
  95. package/agents/components/metadata/compact.md +69 -0
  96. package/agents/components/metadata/compact.spec.json +69 -0
  97. package/agents/components/metadata/metadata.family.json +42 -0
  98. package/agents/components/metadata/metadata.md +26 -0
  99. package/agents/components/metadata/standard.md +104 -0
  100. package/agents/components/metadata/standard.spec.json +152 -0
  101. package/agents/components/nav-card/nav-card.family.json +29 -0
  102. package/agents/components/nav-card/nav-card.md +179 -0
  103. package/agents/components/nav-card/nav-card.spec.json +161 -0
  104. package/agents/components/nav-list/nav-list.family.json +46 -0
  105. package/agents/components/nav-list/nav-list.md +91 -0
  106. package/agents/components/nav-list/nav-list.spec.json +107 -0
  107. package/agents/components/navigation-bar/main.md +201 -0
  108. package/agents/components/navigation-bar/main.spec.json +109 -0
  109. package/agents/components/navigation-bar/navigation-bar.family.json +44 -0
  110. package/agents/components/navigation-bar/navigation-bar.md +21 -0
  111. package/agents/components/navigation-bar/search.md +96 -0
  112. package/agents/components/navigation-bar/search.spec.json +142 -0
  113. package/agents/components/navigation-bar/sub.md +174 -0
  114. package/agents/components/navigation-bar/sub.spec.json +123 -0
  115. package/agents/components/page-shell/page-shell.family.json +22 -0
  116. package/agents/components/page-shell/page-shell.md +51 -0
  117. package/agents/components/profile-header/profile-header.family.json +29 -0
  118. package/agents/components/profile-header/profile-header.md +149 -0
  119. package/agents/components/profile-header/profile-header.spec.json +200 -0
  120. package/agents/components/progress/progress.family.json +27 -0
  121. package/agents/components/progress/progress.md +38 -0
  122. package/agents/components/progress/progress.spec.json +67 -0
  123. package/agents/components/side-sheet/side-sheet.family.json +30 -0
  124. package/agents/components/side-sheet/side-sheet.md +154 -0
  125. package/agents/components/side-sheet/side-sheet.spec.json +109 -0
  126. package/agents/components/skeleton/skeleton.family.json +28 -0
  127. package/agents/components/skeleton/skeleton.md +123 -0
  128. package/agents/components/skeleton/skeleton.spec.json +73 -0
  129. package/agents/components/status-tag/status-tag.family.json +26 -0
  130. package/agents/components/status-tag/status-tag.md +114 -0
  131. package/agents/components/status-tag/status-tag.spec.json +69 -0
  132. package/agents/components/suggestion-list/suggestion-list.family.json +46 -0
  133. package/agents/components/suggestion-list/suggestion-list.md +91 -0
  134. package/agents/components/suggestion-list/suggestion-list.spec.json +178 -0
  135. package/agents/components/switch/switch.family.json +27 -0
  136. package/agents/components/switch/switch.md +114 -0
  137. package/agents/components/switch/switch.spec.json +123 -0
  138. package/agents/components/tab-bar/tab-bar.family.json +27 -0
  139. package/agents/components/tab-bar/tab-bar.md +178 -0
  140. package/agents/components/tab-bar/tab-bar.spec.json +184 -0
  141. package/agents/components/tabs/rounded.md +150 -0
  142. package/agents/components/tabs/rounded.spec.json +140 -0
  143. package/agents/components/tabs/segmented.md +114 -0
  144. package/agents/components/tabs/segmented.spec.json +100 -0
  145. package/agents/components/tabs/tabs.family.json +59 -0
  146. package/agents/components/tabs/tabs.md +18 -0
  147. package/agents/components/tabs/underline.md +147 -0
  148. package/agents/components/tabs/underline.spec.json +139 -0
  149. package/agents/components/thumbnail/thumbnail.family.json +28 -0
  150. package/agents/components/thumbnail/thumbnail.md +152 -0
  151. package/agents/components/thumbnail/thumbnail.spec.json +172 -0
  152. package/agents/components/toast/toast.family.json +28 -0
  153. package/agents/components/toast/toast.md +133 -0
  154. package/agents/components/toast/toast.spec.json +89 -0
  155. package/agents/components/tooltip/tooltip.family.json +29 -0
  156. package/agents/components/tooltip/tooltip.md +139 -0
  157. package/agents/components/tooltip/tooltip.spec.json +110 -0
  158. package/agents/compose.md +240 -0
  159. package/agents/icons.json +831 -0
  160. package/agents/images.md +66 -0
  161. package/agents/manifest.json +87 -0
  162. package/agents/patterns/README.md +59 -0
  163. package/agents/patterns/actions.md +50 -0
  164. package/agents/patterns/browsing.md +52 -0
  165. package/agents/patterns/communications.md +56 -0
  166. package/agents/patterns/layout.md +72 -0
  167. package/agents/patterns/modals.md +50 -0
  168. package/agents/patterns/visual.md +55 -0
  169. package/agents/reconstruct.md +55 -0
  170. package/agents/scoped-adoption.md +111 -0
  171. package/agents/tokens.usage.json +1657 -0
  172. package/agents/usage.json +422 -0
  173. package/dist/icons/index.cjs +1332 -0
  174. package/dist/icons/index.cjs.map +1 -0
  175. package/dist/icons/index.d.cts +228 -0
  176. package/dist/icons/index.d.ts +228 -0
  177. package/dist/icons/index.js +1114 -0
  178. package/dist/icons/index.js.map +1 -0
  179. package/dist/index.cjs +5905 -0
  180. package/dist/index.cjs.map +1 -0
  181. package/dist/index.d.cts +896 -0
  182. package/dist/index.d.ts +896 -0
  183. package/dist/index.js +5847 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/styles.css +5765 -0
  186. package/eslint/README.md +79 -0
  187. package/eslint/index.js +78 -0
  188. package/eslint/rules.js +472 -0
  189. package/eslint/test.mjs +135 -0
  190. package/package.json +96 -0
  191. package/placeholder.png +0 -0
@@ -0,0 +1,111 @@
1
+ # Scoped adoption — Chorus in a designated area of an existing app
2
+
3
+ Protocol for the third first-turn branch in `LOVABLE.md`: the user wants Chorus in a
4
+ **specific area** of an in-progress project — not a full migration (§D), not a blank
5
+ scaffold (greenfield). Triggers: the first message names a target area / route /
6
+ feature ("apply Chorus to the settings tab", "the community feed uses Chorus"), or
7
+ says to initialize and **stand by** for an area they'll designate next.
8
+
9
+ Everything in `LOVABLE.md` still applies *inside* the designated area. This file only
10
+ defines what changes **at and outside the boundary**.
11
+
12
+ ## First-turn behaviour
13
+
14
+ 1. Run §A.0 end-to-end (install, stylesheets, placeholder, lint preset — scoped, see
15
+ below) and post the readiness line.
16
+ 2. Post a drift report **scoped to the designated area** (same shape as §D.1 — counts
17
+ + worst offenders — but only for files the area renders). If no area is named yet,
18
+ skip the report and say so in one line.
19
+ 3. **Stand by.** Do NOT reconstruct the entry screen, do NOT post an app-wide
20
+ migration plan, do NOT touch files outside the area. The §D "reconstruct the
21
+ representative screen immediately" step is **suspended** in this mode — the
22
+ reconstruction target is the designated area, on the user's brief.
23
+
24
+ ## The boundary — declare it, then respect it
25
+
26
+ * **Declare the Chorus boundary at route / screen granularity** whenever possible.
27
+ State it explicitly in your first scoped reply: *"Chorus boundary: `/community/*`
28
+ (CommunityPage + children)."* Everything inside renders 100% Chorus; everything
29
+ outside stays untouched — visually and in code.
30
+ * **The zero-mixed-render rule applies per screen *inside* the boundary.** A screen
31
+ inside the boundary is 100% Chorus or not done. Screens outside the boundary are
32
+ out of scope — their drift is *reported, never edited*.
33
+ * **Sub-screen areas.** If the designated area is a region within a screen that also
34
+ has legacy UI (e.g. "only the comment section"), first propose widening the boundary
35
+ to the whole screen — that's the only way to honor zero-mixed-render literally. If
36
+ the user declines, the area's **container element is the declared boundary**: inside
37
+ it 100% Chorus, outside it untouched, and you state the exception in one line
38
+ ("mixed render sanctioned at `<CommentSection>` per scoped boundary"). Never
39
+ restyle legacy siblings "for consistency".
40
+ * **§D.4 neighbor migration is capped at the boundary.** "Touched files AND immediate
41
+ visual neighbors" never drags in files outside the declared area. Out-of-boundary
42
+ drift goes on the next-PR shopping list (§D.5), nothing more.
43
+ * **Widening is the user's call.** They can grow the boundary ("now also the profile
44
+ page") or switch to full §D at any time. You may *suggest* widening when the
45
+ boundary forces an awkward seam; you never widen unilaterally.
46
+
47
+ ## Embedded host shell — who pays the gutter
48
+
49
+ The §A.4 PageShell contract assumes Chorus owns the viewport. In scoped adoption it
50
+ usually doesn't:
51
+
52
+ * **Area = whole route/screen** → use `<PageShell>` normally inside that route.
53
+ * **Area = region embedded in a legacy frame** → do NOT install `<PageShell>` (a
54
+ 100dvh flex column inside a host layout breaks the host's scroll). Instead, treat
55
+ the **legacy container as the shell**: it pays the horizontal gutter **once**, and
56
+ Chorus full-bleed children (`List`, `Feed`, `Carousel`, `Tabs`, …) are its direct
57
+ children with no extra `padding-inline` / `px-*` wrapper.
58
+ * If the legacy container already pays its own padding, that *is* the single
59
+ gutter — do not re-pay it on a Chorus wrapper.
60
+ * If it pays none, add it once at the area root:
61
+ `style={{ paddingInline: 'var(--sys-layout-page-md)' }}`.
62
+ * The rail self-diagnostic (LOVABLE.md § rail) still applies *within the area*: every
63
+ full-bleed child's left edge must align to the area's single gutter.
64
+
65
+ ## ESLint preset — scope it to the area
66
+
67
+ `export default [ ...chorus ]` repo-wide would flood an unmigrated codebase with
68
+ `chorus/*` errors and push you toward either suppressing (forbidden) or migrating
69
+ everything (scope violation). Scope the preset with flat-config `files`:
70
+
71
+ ```js
72
+ // eslint.config.js
73
+ import chorus from "@teamblind-chorus/ui/eslint";
74
+ export default [
75
+ ...chorus.map((cfg) => ({
76
+ ...cfg,
77
+ files: ["src/pages/community/**", "src/components/community/**"], // = the declared boundary
78
+ })),
79
+ ];
80
+ ```
81
+
82
+ * "Chorus lint green" (§E checklist) means green **within the scoped `files` globs**.
83
+ * When the user widens the boundary, widen the globs in the same change — the lint
84
+ scope and the declared boundary must never disagree.
85
+ * Never silence a `chorus/*` error inside the boundary; outside the boundary the
86
+ rules simply don't run.
87
+
88
+ ## CSS coexistence — safe by construction
89
+
90
+ Importing `@teamblind-chorus/tokens/tokens.css` + `@teamblind-chorus/ui/styles.css` app-wide is
91
+ safe for the untouched legacy area. The only global effects are:
92
+
93
+ * a `button/input/select/textarea { font-family: inherit }` reset (form controls
94
+ inherit the body font — benign, usually invisible);
95
+ * `:root` custom properties (`--sys-*`, `--ref-*`, `--chorus-placeholder-image`) —
96
+ inert until something consumes them;
97
+ * `.chorus-*` / `.sys-typo-*` classes — inert on legacy markup.
98
+
99
+ The Pretendard `<link>` loads a font; it restyles nothing until a rule asks for it.
100
+ So: import the stylesheets once at app entry as §A.0 says — do NOT try to
101
+ conditionally load CSS per route, and do not warn the user about "global conflicts".
102
+
103
+ ## Exit paths
104
+
105
+ * **Widen** — user names more areas; repeat the boundary declaration, widen the lint
106
+ globs, migrate the new area.
107
+ * **Graduate to §D** — user asks for the full conversion; run §D from step 1 with the
108
+ already-migrated areas as the reference target (skip §D.3's proactive
109
+ reconstruction — it exists).
110
+ * **Escape hatch (§D.7)** still works as documented: "just add the feature" demotes
111
+ everything to a drift note; new code stays pure Chorus.