@maltjoy/mcp-server 0.4.0 → 0.6.0-beta.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/LICENSE +21 -0
  2. package/README.md +30 -3
  3. package/dist/doc/VJoyAdminBanner/guideline.md +284 -0
  4. package/dist/doc/VJoyAvailability/guideline.md +352 -0
  5. package/dist/doc/VJoyAvatar/guideline.md +192 -0
  6. package/dist/doc/VJoyAvatarsList/guideline.md +328 -0
  7. package/dist/doc/VJoyBadge/guideline.md +169 -0
  8. package/dist/doc/VJoyBadgeLevel/guideline.md +166 -0
  9. package/dist/doc/VJoyBlockSkeleton/guideline.md +150 -0
  10. package/dist/doc/VJoyBottomSheet/guideline.md +345 -0
  11. package/dist/doc/VJoyBottomSheetTrigger/guideline.md +156 -0
  12. package/dist/doc/VJoyButton/guideline.md +371 -0
  13. package/dist/doc/VJoyButton/metadata.json +0 -16
  14. package/dist/doc/VJoyButtonCard/guideline.md +384 -0
  15. package/dist/doc/VJoyCheckbox/guideline.md +317 -0
  16. package/dist/doc/VJoyCheckboxCard/guideline.md +381 -0
  17. package/dist/doc/VJoyCheckboxGroup/guideline.md +363 -0
  18. package/dist/doc/VJoyCheckboxGroup/metadata.json +7 -7
  19. package/dist/doc/VJoyCollapse/guideline.md +362 -0
  20. package/dist/doc/VJoyCollapseItem/guideline.md +394 -0
  21. package/dist/doc/VJoyCompanyAvatar/guideline.md +162 -0
  22. package/dist/doc/VJoyDialog/guideline.md +425 -0
  23. package/dist/doc/VJoyDialogTrigger/guideline.md +186 -0
  24. package/dist/doc/VJoyDot/guideline.md +177 -0
  25. package/dist/doc/VJoyDrawer/guideline.md +392 -0
  26. package/dist/doc/VJoyDrawerTrigger/guideline.md +145 -0
  27. package/dist/doc/VJoyDropdown/guideline.md +393 -0
  28. package/dist/doc/VJoyDropdown/metadata.json +6 -6
  29. package/dist/doc/VJoyDropdownList/guideline.md +396 -0
  30. package/dist/doc/VJoyDropdownList/metadata.json +7 -7
  31. package/dist/doc/VJoyDropzone/guideline.md +390 -0
  32. package/dist/doc/VJoyDropzone/metadata.json +36 -1
  33. package/dist/doc/VJoyFilterBar/guideline.md +419 -0
  34. package/dist/doc/VJoyFilterBarButton/guideline.md +359 -0
  35. package/dist/doc/VJoyFloatingActionsBar/guideline.md +372 -0
  36. package/dist/doc/VJoyFormError/guideline.md +325 -0
  37. package/dist/doc/VJoyFormError/metadata.json +0 -14
  38. package/dist/doc/VJoyFormFieldSkeleton/guideline.md +159 -0
  39. package/dist/doc/VJoyFormGroup/guideline.md +285 -0
  40. package/dist/doc/VJoyFunnel/guideline.md +349 -0
  41. package/dist/doc/VJoyFunnelFooter/guideline.md +178 -0
  42. package/dist/doc/VJoyFunnelHeader/guideline.md +204 -0
  43. package/dist/doc/VJoyHighlight/guideline.md +169 -0
  44. package/dist/doc/VJoyIcon/JoyIcon.types.ts +1 -1
  45. package/dist/doc/VJoyIcon/guideline.md +168 -0
  46. package/dist/doc/VJoyIcon/metadata.json +0 -1
  47. package/dist/doc/VJoyIconButton/guideline.md +169 -0
  48. package/dist/doc/VJoyIconButton/metadata.json +1 -1
  49. package/dist/doc/VJoyIndicator/guideline.md +168 -0
  50. package/dist/doc/VJoyIndicators/guideline.md +183 -0
  51. package/dist/doc/VJoyInput/JoyInput.types.ts +1 -6
  52. package/dist/doc/VJoyInput/guideline.md +401 -0
  53. package/dist/doc/VJoyInput/metadata.json +5 -14
  54. package/dist/doc/VJoyInputDigit/guideline.md +381 -0
  55. package/dist/doc/VJoyInputNumber/guideline.md +414 -0
  56. package/dist/doc/VJoyInputNumber/metadata.json +22 -17
  57. package/dist/doc/VJoyInputPassword/guideline.md +379 -0
  58. package/dist/doc/VJoyInputPassword/metadata.json +0 -14
  59. package/dist/doc/VJoyLabel/guideline.md +200 -0
  60. package/dist/doc/VJoyLink/guideline.md +360 -0
  61. package/dist/doc/VJoyListItem/guideline.md +335 -0
  62. package/dist/doc/VJoyMenu/guideline.md +304 -0
  63. package/dist/doc/VJoyMenu/metadata.json +21 -21
  64. package/dist/doc/VJoyMenuItem/guideline.md +352 -0
  65. package/dist/doc/VJoyPagination/guideline.md +355 -0
  66. package/dist/doc/VJoyPanel/guideline.md +238 -0
  67. package/dist/doc/VJoyPanelSection/guideline.md +160 -0
  68. package/dist/doc/VJoyPasswordRequirement/guideline.md +336 -0
  69. package/dist/doc/VJoyPasswordRequirement/metadata.json +1 -1
  70. package/dist/doc/VJoyProductTour/JoyProductTour.types.ts +0 -1
  71. package/dist/doc/VJoyProductTour/guideline.md +455 -0
  72. package/dist/doc/VJoyProductTour/metadata.json +1 -1
  73. package/dist/doc/VJoyProductTourTrigger/guideline.md +167 -0
  74. package/dist/doc/VJoyProgressBar/guideline.md +348 -0
  75. package/dist/doc/VJoyRadio/guideline.md +346 -0
  76. package/dist/doc/VJoyRadioGroup/guideline.md +331 -0
  77. package/dist/doc/VJoyRatingStars/guideline.md +306 -0
  78. package/dist/doc/VJoyScreenLoader/guideline.md +172 -0
  79. package/dist/doc/VJoySelect/guideline.md +396 -0
  80. package/dist/doc/VJoySelectableItem/guideline.md +351 -0
  81. package/dist/doc/VJoySelectableItemGroup/guideline.md +370 -0
  82. package/dist/doc/VJoySeparator/guideline.md +161 -0
  83. package/dist/doc/VJoySnackbar/guideline.md +402 -0
  84. package/dist/doc/VJoySpinner/guideline.md +168 -0
  85. package/dist/doc/VJoyStep/guideline.md +182 -0
  86. package/dist/doc/VJoyStepper/guideline.md +390 -0
  87. package/dist/doc/VJoyTab/guideline.md +298 -0
  88. package/dist/doc/VJoyTabs/guideline.md +353 -0
  89. package/dist/doc/VJoyTag/guideline.md +226 -0
  90. package/dist/doc/VJoyTagsInput/guideline.md +387 -0
  91. package/dist/doc/VJoyTagsList/guideline.md +311 -0
  92. package/dist/doc/VJoyTagsList/metadata.json +27 -27
  93. package/dist/doc/VJoyTemplate/guideline.md +366 -0
  94. package/dist/doc/VJoyText/guideline.md +175 -0
  95. package/dist/doc/VJoyText/metadata.json +1 -1
  96. package/dist/doc/VJoyTextarea/guideline.md +378 -0
  97. package/dist/doc/VJoyTitleBrand/guideline.md +155 -0
  98. package/dist/doc/VJoyToggle/guideline.md +327 -0
  99. package/dist/doc/VJoyTooltip/guideline.md +322 -0
  100. package/dist/doc/VJoyUserCard/guideline.md +268 -0
  101. package/dist/doc/VJoyUserCard/metadata.json +3 -17
  102. package/dist/doc/VJoyWalkthrough/guideline.md +351 -0
  103. package/dist/doc/VJoyWalkthroughTrigger/guideline.md +171 -0
  104. package/dist/doc/VJoyWrapper/guideline.md +173 -0
  105. package/dist/doc/css-classes.json +1 -15
  106. package/dist/doc/design-tokens.json +1 -0
  107. package/dist/doc/index.json +20 -30
  108. package/dist/index.js +22 -2
  109. package/dist/index.js.map +1 -1
  110. package/dist/tools/get-component-guideline.d.ts +30 -0
  111. package/dist/tools/get-component-guideline.d.ts.map +1 -0
  112. package/dist/tools/get-component-guideline.js +51 -0
  113. package/dist/tools/get-component-guideline.js.map +1 -0
  114. package/dist/tools/get-documentation-page.d.ts +22 -0
  115. package/dist/tools/get-documentation-page.d.ts.map +1 -0
  116. package/dist/tools/get-documentation-page.js +21 -0
  117. package/dist/tools/get-documentation-page.js.map +1 -0
  118. package/dist/tools/list-documentation-pages.d.ts +22 -0
  119. package/dist/tools/list-documentation-pages.d.ts.map +1 -0
  120. package/dist/tools/list-documentation-pages.js +17 -0
  121. package/dist/tools/list-documentation-pages.js.map +1 -0
  122. package/dist/tools/search-documentation.d.ts +41 -0
  123. package/dist/tools/search-documentation.d.ts.map +1 -0
  124. package/dist/tools/search-documentation.js +25 -0
  125. package/dist/tools/search-documentation.js.map +1 -0
  126. package/dist/zeroheight-parser.d.ts +27 -0
  127. package/dist/zeroheight-parser.d.ts.map +1 -0
  128. package/dist/zeroheight-parser.js +77 -0
  129. package/dist/zeroheight-parser.js.map +1 -0
  130. package/package.json +10 -10
  131. package/dist/doc/VJoyMultiCheckbox/metadata.json +0 -332
@@ -0,0 +1,317 @@
1
+ ---
2
+ component: VJoyCheckbox
3
+ status: draft
4
+ language: en
5
+ dsds: JoyCheckbox.dsds.json
6
+ dsdsVersion: "0.15.2"
7
+ ---
8
+
9
+ # Checkbox
10
+
11
+ Use **`VJoyCheckbox`** when the user can select zero, one, or more independent options — or confirm a single binary choice such as consent or agreement.
12
+
13
+ It supports checked, indeterminate, disabled, and invalid states; native form attributes (`name`, `value`, `required`); a label via prop or slot; and an optional `checkbox-content` area for helper text or related UI below the control.
14
+
15
+ | | |
16
+ | --- | --- |
17
+ | **Code** | `VJoyCheckbox` from `@maltjoy/core-vue` |
18
+ | **Design** | [Joy — Checkbox](https://zeroheight.com/6bf479565/) (page id `1423608`) |
19
+ | **Storybook** | [VJoyCheckbox docs](https://doc.malt.tech/joy-storybook/?path=/docs/components-forms-vjoycheckbox--docs) |
20
+ | **DSDS (machine)** | [`JoyCheckbox.dsds.json`](./JoyCheckbox.dsds.json) |
21
+ | **Live API** | `joy_get_component_info("VJoyCheckbox")` |
22
+
23
+ ---
24
+
25
+ ## When to use this component
26
+
27
+ Use a checkbox when options are **not mutually exclusive** — the user may select none, one, or several. Typical jobs: multi-select filters, bulk actions, feature toggles in a list, or a standalone consent / confirmation (“I agree to the terms”).
28
+
29
+ Each checkbox is an independent control. For several related options, compose multiple `VJoyCheckbox` instances or use `VJoyCheckboxGroup` so selection is managed as an array.
30
+
31
+ ### When not to use this component
32
+
33
+ | Need | Use instead |
34
+ | --- | --- |
35
+ | Exactly one option from a short list | `VJoyRadio` / `VJoyRadioGroup` |
36
+ | A single on/off setting with immediate effect (settings row) | `VJoyToggle` |
37
+ | Multi-select with array state handled for you | `VJoyCheckboxGroup` |
38
+ | Rich card layout (title, sublabel, body) | `VJoyCheckboxCard` |
39
+ | List row with custom chrome wrapping a control | `VJoySelectableItem` (often with checkbox slot) |
40
+ | Custom-styled `<input type="checkbox">` | Still use `VJoyCheckbox` + Joy tokens — don’t reinvent chrome |
41
+
42
+ > **Indeterminate:** use for “select all” / partial selection in parent rows. Do not bind `indeterminate` together with `v-model:checked` — see [MDN indeterminate checkboxes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#indeterminate_state_checkboxes).
43
+
44
+ ---
45
+
46
+ ## How it works
47
+
48
+ ### Anatomy
49
+
50
+ | Part | Required? | What it is |
51
+ | --- | --- | --- |
52
+ | Wrapper | Yes | Root container (`.joy-checkbox__wrapper`) |
53
+ | Label | Yes | Clickable `<label>` wrapping the control and primary text |
54
+ | Input | Yes | Native `<input type="checkbox">` with `data-joy-form-field` |
55
+ | Label text | Yes* | Default slot or `label` prop (*one of them should provide an accessible name) |
56
+ | `checkbox-content` | No | Slot below the label row for helper text, links, or extra UI |
57
+ | Focus ring | Yes | Shown on keyboard focus when `displayFocus` is true |
58
+
59
+ The component `provide`s `JoyFormElementContext` so it integrates with Joy form field patterns (e.g. labels, validation).
60
+
61
+ ### Default values
62
+
63
+ - `checked` defaults to **`false`**
64
+ - `indeterminate` defaults to **`false`**
65
+ - `invalid` defaults to **`false`**
66
+ - `disabled` defaults to **`false`**
67
+ - `required` defaults to **`false`**
68
+ - `value` defaults to **`"on"`** (used when building multi-value form submissions)
69
+ - `displayFocus` defaults to **`true`** (`@internal` — used by `VJoySelectableItem` to avoid double focus rings)
70
+
71
+ Props, events, and slots: use Joy MCP or Storybook — this page focuses on **when** and **how**, not a full API dump.
72
+
73
+ ### Visual treatment
74
+
75
+ There is **no `variant` or `size` prop**. Checkbox dimensions and colors come from component CSS variables (e.g. `--checkbox-size: 20px`) and Joy tokens — **don’t hardcode box size or border colors** in product CSS.
76
+
77
+ ---
78
+
79
+ ## States
80
+
81
+ | State | What the user sees / can do |
82
+ | --- | --- |
83
+ | Default (unchecked) | Empty box; label in normal weight; clickable |
84
+ | Checked | Filled box with checkmark; label in **bold** |
85
+ | Indeterminate | Dash icon in box; label in **bold**; use for partial “select all” |
86
+ | Hover | Subtle background on the label row (pointer devices) |
87
+ | Focus | Visible focus ring on the label (`displayFocus`) |
88
+ | Active / pressed | Checked background darkens briefly while pressed |
89
+ | Disabled | No interaction; muted checkbox and label — **explain why** nearby when possible |
90
+ | Invalid | Error styling on the **unchecked** box only; cleared while checked |
91
+
92
+ **Invalid vs checked:** a checked checkbox **cannot** appear invalid — `checked` wins. Unchecking restores `invalid` if the prop is still true. User interaction that checks the box clears invalid styling even before the `checked` prop updates.
93
+
94
+ **Indeterminate lifecycle:** any user change clears indeterminate (component sets `isIndeterminate` to `false` on `change`).
95
+
96
+ ---
97
+
98
+ ## Best practices
99
+
100
+ Rules use RFC 2119 strength (**MUST** / **SHOULD** / **MUST NOT** / **SHOULD NOT**).
101
+
102
+ ### Selection model
103
+
104
+ - **SHOULD** use checkboxes when options are independent and any combination is valid.
105
+ - **MUST NOT** use checkboxes when only one option may be selected — use radio buttons.
106
+ - **SHOULD** use `VJoyCheckboxGroup` when managing an array of selected `value`s.
107
+ - **SHOULD** use `indeterminate` only on parent “select all” controls, not on leaf options.
108
+
109
+ ### Implementation
110
+
111
+ - **MUST** bind state with `v-model:checked` (or `:checked` + `@update:checked`).
112
+ - **MUST** use only documented props from MCP or `JoyCheckbox.types.ts`.
113
+ - **MUST** use Joy tokens — no custom `.joy-checkbox` chrome CSS.
114
+ - **MUST NOT** invent props (`size`, `variant`, `color`, …).
115
+ - **MUST NOT** combine `indeterminate` with `v-model:checked` on the same instance.
116
+ - **MUST** set distinct `id` / `name` / `value` when submitting multiple checkboxes in a form.
117
+ - **SHOULD** set `invalid` from form validation only while the box is unchecked.
118
+
119
+ ### Interaction
120
+
121
+ - **MUST** keep the label clickable (don’t detach label from input with custom markup).
122
+ - **SHOULD** place error or helper copy in `checkbox-content` or adjacent `VJoyFormGroup` messaging — not only color.
123
+ - **SHOULD** disable rather than hide options the user cannot choose, when the choice must remain visible.
124
+
125
+ ### Do / don’t
126
+
127
+ | Do | Don’t |
128
+ | --- | --- |
129
+ | `v-model:checked` for boolean state | Manual `input.checked` without updating model |
130
+ | `VJoyCheckboxGroup` for multi-select arrays | Many unrelated checkboxes without group semantics |
131
+ | `indeterminate` on “select all” parent | `indeterminate` on every leaf option |
132
+ | Explain disabled checkboxes | Disabled with no reason in the UI |
133
+ | Radio for exclusive lists | Checkboxes for “pick one” |
134
+
135
+ ---
136
+
137
+ ## Content
138
+
139
+ Checkbox labels describe **what will be selected or enabled** when the box is checked. They are scannable, specific, and parallel when shown in a list.
140
+
141
+ ### Label formula
142
+
143
+ **Noun phrase or short statement** that states the option (English):
144
+
145
+ - ✅ Email notifications
146
+ - ✅ I agree to the Terms of Service
147
+ - ✅ Select all projects
148
+
149
+ For groups, keep labels **parallel** (same grammar and length order of magnitude):
150
+
151
+ - ✅ PDF · DOCX · XLSX
152
+ - ❌ Export as PDF · Word document · spreadsheet (xlsx)
153
+
154
+ ### Writing rules
155
+
156
+ | Strength | Rule |
157
+ | --- | --- |
158
+ | **MUST** | Every checkbox has a visible label (prop or default slot) — no unlabeled checkboxes |
159
+ | **MUST** | Label describes the option, not the action of clicking — ✅ `Weekly digest` · ❌ `Click to enable weekly digest` |
160
+ | **MUST** | Standalone consent labels name what is being agreed to — ✅ `I agree to the Terms of Service` |
161
+ | **MUST NOT** | Duplicate the group legend in every option label when `VJoyCheckboxGroup` already provides a fieldset legend |
162
+ | **MUST NOT** | Use Yes / No as the only labels in a multi-option list — name each option |
163
+ | **SHOULD** | ≤ 60 characters per label; wrap rather than truncate |
164
+ | **SHOULD** | Sentence case for standalone statements; title case or parallel nouns for option lists (match product locale rules) |
165
+ | **SHOULD** | Put legal links or long explanations in `checkbox-content`, not in the primary label |
166
+ | **SHOULD** | “Select all” / parent row: `Select all` or `Select all {noun}` — not `All` alone |
167
+
168
+ ### Patterns
169
+
170
+ **Standalone** — One checkbox for consent, opt-in, or binary confirmation. Label is a full thought; details and links go in `checkbox-content`.
171
+
172
+ **Multi-select list** — Options are independent (filters, permissions, export formats). Use a group legend via `VJoyCheckboxGroup` and short parallel option labels.
173
+
174
+ **Bulk / select all** — Parent checkbox uses `indeterminate` when some children are checked; label e.g. `Select all items`. Child labels name each row.
175
+
176
+ **Validation** — Pair `invalid` with explicit error text in `checkbox-content` or form-level error (e.g. “You must accept the terms to continue”). Don’t rely on red border alone.
177
+
178
+ ---
179
+
180
+ ## Accessibility
181
+
182
+ Behaviors (what must happen), not slogans.
183
+
184
+ | Behavior | Expectation |
185
+ | --- | --- |
186
+ | Role | Native `checkbox` via `<input type="checkbox">` |
187
+ | Name | From default slot or `label` prop; associated via wrapping `<label>` |
188
+ | Keyboard | **Space** toggles when focused; **Tab** moves focus |
189
+ | Focus | Visible focus indicator (`joy-checkbox__focusing`); don’t remove in product CSS |
190
+ | Grouping | Multiple related checkboxes: `VJoyCheckboxGroup` uses `<fieldset>` + `<legend>` |
191
+ | Disabled | `disabled` on input; explain restriction in visible text when it matters |
192
+ | Invalid | Don’t rely on color alone — provide text for the error |
193
+ | Indeterminate | Exposed to AT via native `indeterminate` property on the input |
194
+
195
+ Target: **WCAG 2.2 AA** where the product requires it.
196
+
197
+ ---
198
+
199
+ ## Examples
200
+
201
+ ```vue
202
+ <script setup lang="ts">
203
+ import { ref } from 'vue'
204
+ import { VJoyCheckbox } from '@maltjoy/core-vue'
205
+
206
+ const agreed = ref(false)
207
+ const selectAll = ref(false)
208
+ const selected = ref(['email'])
209
+ </script>
210
+
211
+ <template>
212
+ <!-- Standalone consent -->
213
+ <VJoyCheckbox v-model:checked="agreed" label="I agree to the Terms of Service">
214
+ <template #checkbox-content>
215
+ <small>Read the <a href="/terms">Terms of Service</a>.</small>
216
+ </template>
217
+ </VJoyCheckbox>
218
+
219
+ <!-- Invalid until checked -->
220
+ <VJoyCheckbox
221
+ v-model:checked="agreed"
222
+ :invalid="!agreed"
223
+ label="I agree to the Terms of Service"
224
+ />
225
+
226
+ <!-- Indeterminate parent (no v-model:checked on same node) -->
227
+ <VJoyCheckbox :indeterminate="true" label="Select all projects" />
228
+
229
+ <!-- Multi-select value in a form -->
230
+ <VJoyCheckbox
231
+ v-model:checked="selected.includes('email')"
232
+ name="channels"
233
+ value="email"
234
+ label="Email notifications"
235
+ @update:checked="(on) => { /* update selected array */ }"
236
+ />
237
+
238
+ <!-- Disabled -->
239
+ <VJoyCheckbox disabled label="Archived project (cannot select)" />
240
+ </template>
241
+ ```
242
+
243
+ In Nuxt (or apps with auto-import), omit the import if `VJoyCheckbox` is already global.
244
+
245
+ For managed multi-select arrays, prefer `VJoyCheckboxGroup` — see its Storybook docs.
246
+
247
+ ---
248
+
249
+ ## Related
250
+
251
+ | Component | Use when |
252
+ | --- | --- |
253
+ | `VJoyCheckboxGroup` | Several related options; `v-model:value` as string array |
254
+ | `VJoyCheckboxCard` | Checkbox with card chrome, title, sublabel, and body |
255
+ | `VJoyRadio` / `VJoyRadioGroup` | Exactly one choice from a list |
256
+ | `VJoyToggle` | Single on/off setting (especially settings-style rows) |
257
+ | `VJoySelectableItem` | Custom list row; may embed `VJoyCheckbox` with `displayFocus={false}` |
258
+ | `VJoyLabel` / `VJoyFormGroup` | Field legends, required marks, and form-level validation messaging |
259
+
260
+ ---
261
+
262
+ ## For agents
263
+
264
+ Optional for readers; **required** for vibe-coding quality. Maps to `agentDocumentBlocks` in [`JoyCheckbox.dsds.json`](./JoyCheckbox.dsds.json).
265
+
266
+ ### Pick the right component
267
+
268
+ | If the intent is… | Emit… | Do not emit… |
269
+ | --- | --- | --- |
270
+ | Independent multi-select | `VJoyCheckbox` or `VJoyCheckboxGroup` | `VJoyRadio` |
271
+ | Pick exactly one | `VJoyRadio` / `VJoyRadioGroup` | `VJoyCheckbox` |
272
+ | Settings on/off row | `VJoyToggle` | Checkbox for a single immediate toggle |
273
+ | Select all / partial selection parent | `VJoyCheckbox` with `indeterminate` | `indeterminate` + `v-model:checked` on same node |
274
+ | Card with title + description | `VJoyCheckboxCard` | Raw `VJoyCheckbox` + custom card CSS |
275
+ | Array of selected values | `VJoyCheckboxGroup` | Manual array wiring without group when options are fixed |
276
+
277
+ ### Hard rules
278
+
279
+ 1. **MUST** call `joy_get_component_info("VJoyCheckbox")` or read `JoyCheckbox.types.ts` before generating props.
280
+ 2. **MUST** use `v-model:checked` (or `:checked` + `@update:checked`) for boolean state.
281
+ 3. **MUST NOT** invent props — there is no `variant`, `size`, or `color`.
282
+ 4. **MUST NOT** set `indeterminate` on the same instance as `v-model:checked`.
283
+ 5. **MUST NOT** override `.joy-checkbox` size, border, or background with custom CSS.
284
+ 6. **MUST** treat `invalid` as visible only when unchecked; checking clears invalid styling.
285
+ 7. **SHOULD** use `checkbox-content` for helper text, links, and errors — not overloaded primary labels.
286
+ 8. **SHOULD** use `value` + `name` when multiple checkboxes submit as part of one form field set.
287
+
288
+ ### Checklist
289
+
290
+ - [ ] Correct component (`VJoyCheckbox` or named alternative)
291
+ - [ ] Props from MCP / types only — no invented API
292
+ - [ ] `v-model:checked` wired; indeterminate parent not v-modelled
293
+ - [ ] Visible label on every instance
294
+ - [ ] No custom `.joy-checkbox` chrome CSS
295
+ - [ ] Exclusive choice → radio, not checkbox
296
+ - [ ] Multi-option array → consider `VJoyCheckboxGroup`
297
+ - [ ] Invalid / disabled states have explanatory text when user-visible
298
+ - [ ] `id` / `name` / `value` set appropriately for forms
299
+
300
+ ---
301
+
302
+ ## DSDS mapping
303
+
304
+ This Markdown mirrors [`JoyCheckbox.dsds.json`](./JoyCheckbox.dsds.json) (DSDS **0.15.2**).
305
+
306
+ | Section here | DSDS block |
307
+ | --- | --- |
308
+ | When to use / not | `use-cases` |
309
+ | Anatomy | `anatomy` |
310
+ | States | `states` |
311
+ | Best practices / content rules | `guidelines` (+ `content`) |
312
+ | Accessibility | `accessibility` |
313
+ | Examples | `sections` |
314
+ | For agents | `agentDocumentBlocks` |
315
+ | Props detail | `api` in JSON + Joy MCP |
316
+ | Imports | `imports` in JSON |
317
+ | Token sizing | `design-specifications` in JSON (token names, not raw px dumps) |