@cocoar/vue-ui 3.1.0 → 3.2.0-beta.6

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 (179) hide show
  1. package/dist/components/checkbox/CoarCheckbox.vue.d.ts +1 -1
  2. package/dist/components/checkbox/CoarCheckbox.vue.d.ts.map +1 -1
  3. package/dist/components/code-block/CoarCodeBlock.vue.d.ts +1 -1
  4. package/dist/components/code-block/CoarCodeBlock.vue.d.ts.map +1 -1
  5. package/dist/components/data-list/CoarDataList.vue.d.ts +158 -0
  6. package/dist/components/data-list/CoarDataList.vue.d.ts.map +1 -0
  7. package/dist/components/data-list/CoarDataListToolbar.vue.d.ts +30 -0
  8. package/dist/components/data-list/CoarDataListToolbar.vue.d.ts.map +1 -0
  9. package/dist/components/data-list/data-list-builder.d.ts +288 -0
  10. package/dist/components/data-list/data-list-builder.d.ts.map +1 -0
  11. package/dist/components/data-list/index.d.ts +12 -0
  12. package/dist/components/data-list/index.d.ts.map +1 -0
  13. package/dist/components/data-list/internal/compare.d.ts +14 -0
  14. package/dist/components/data-list/internal/compare.d.ts.map +1 -0
  15. package/dist/components/data-list/internal/reorder-core.d.ts +46 -0
  16. package/dist/components/data-list/internal/reorder-core.d.ts.map +1 -0
  17. package/dist/components/data-list/internal/search.d.ts +16 -0
  18. package/dist/components/data-list/internal/search.d.ts.map +1 -0
  19. package/dist/components/data-list/internal/useDataListLines.d.ts +92 -0
  20. package/dist/components/data-list/internal/useDataListLines.d.ts.map +1 -0
  21. package/dist/components/data-list/internal/useDataListReorder.d.ts +68 -0
  22. package/dist/components/data-list/internal/useDataListReorder.d.ts.map +1 -0
  23. package/dist/components/data-list/internal/useSearchHighlight.d.ts +19 -0
  24. package/dist/components/data-list/internal/useSearchHighlight.d.ts.map +1 -0
  25. package/dist/components/data-list/types.d.ts +185 -0
  26. package/dist/components/data-list/types.d.ts.map +1 -0
  27. package/dist/components/data-list/useDataListModel.d.ts +79 -0
  28. package/dist/components/data-list/useDataListModel.d.ts.map +1 -0
  29. package/dist/components/date-time/_shared/maskito-config.d.ts +7 -2
  30. package/dist/components/date-time/_shared/maskito-config.d.ts.map +1 -1
  31. package/dist/components/date-time/_shared/time-helpers.d.ts +11 -4
  32. package/dist/components/date-time/_shared/time-helpers.d.ts.map +1 -1
  33. package/dist/components/date-time/_shared/use-date-picker-base.d.ts +1 -1
  34. package/dist/components/date-time/plain-date-picker/CoarPlainDatePicker.vue.d.ts +1 -1
  35. package/dist/components/date-time/plain-date-picker/CoarPlainDatePicker.vue.d.ts.map +1 -1
  36. package/dist/components/date-time/plain-date-time-picker/CoarPlainDateTimePicker.vue.d.ts +1 -1
  37. package/dist/components/date-time/plain-date-time-picker/CoarPlainDateTimePicker.vue.d.ts.map +1 -1
  38. package/dist/components/date-time/zoned-date-time-picker/CoarZonedDateTimePicker.vue.d.ts +1 -1
  39. package/dist/components/date-time/zoned-date-time-picker/CoarZonedDateTimePicker.vue.d.ts.map +1 -1
  40. package/dist/components/dual-listbox/CoarDualListbox.vue.d.ts +3 -0
  41. package/dist/components/dual-listbox/CoarDualListbox.vue.d.ts.map +1 -1
  42. package/dist/components/form-field/CoarFormField.vue.d.ts +1 -1
  43. package/dist/components/form-field/CoarFormField.vue.d.ts.map +1 -1
  44. package/dist/components/icon/CoarIcon.vue.d.ts +2 -2
  45. package/dist/components/icon/CoarIcon.vue.d.ts.map +1 -1
  46. package/dist/components/listbox/CoarListbox.vue.d.ts +7 -0
  47. package/dist/components/listbox/CoarListbox.vue.d.ts.map +1 -1
  48. package/dist/components/number-input/CoarNumberInput.vue.d.ts +1 -1
  49. package/dist/components/number-input/CoarNumberInput.vue.d.ts.map +1 -1
  50. package/dist/components/otp-input/CoarOtpInput.vue.d.ts +1 -1
  51. package/dist/components/otp-input/CoarOtpInput.vue.d.ts.map +1 -1
  52. package/dist/components/password-input/CoarPasswordInput.vue.d.ts +1 -1
  53. package/dist/components/password-input/CoarPasswordInput.vue.d.ts.map +1 -1
  54. package/dist/components/switch/CoarSwitch.vue.d.ts +1 -1
  55. package/dist/components/switch/CoarSwitch.vue.d.ts.map +1 -1
  56. package/dist/components/text-input/CoarTextInput.vue.d.ts +1 -1
  57. package/dist/components/text-input/CoarTextInput.vue.d.ts.map +1 -1
  58. package/dist/composables/dragRegistry.d.ts +12 -0
  59. package/dist/composables/dragRegistry.d.ts.map +1 -1
  60. package/dist/composables/index.d.ts +2 -2
  61. package/dist/composables/index.d.ts.map +1 -1
  62. package/dist/composables/useDragDrop.d.ts +62 -6
  63. package/dist/composables/useDragDrop.d.ts.map +1 -1
  64. package/dist/composables/useVirtualList.d.ts +21 -1
  65. package/dist/composables/useVirtualList.d.ts.map +1 -1
  66. package/dist/index.css +1 -1
  67. package/dist/index.d.ts +4 -2
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +4508 -2039
  70. package/package.json +5 -3
  71. package/skills/cocoar-vue-ui/SKILL.md +244 -0
  72. package/skills/cocoar-vue-ui/references/components/avatar.md +178 -0
  73. package/skills/cocoar-vue-ui/references/components/badge.md +290 -0
  74. package/skills/cocoar-vue-ui/references/components/breadcrumb.md +238 -0
  75. package/skills/cocoar-vue-ui/references/components/button.md +252 -0
  76. package/skills/cocoar-vue-ui/references/components/calendar/agenda-view.md +353 -0
  77. package/skills/cocoar-vue-ui/references/components/calendar/coar-calendar.md +1645 -0
  78. package/skills/cocoar-vue-ui/references/components/calendar/day-view.md +361 -0
  79. package/skills/cocoar-vue-ui/references/components/calendar/index.md +312 -0
  80. package/skills/cocoar-vue-ui/references/components/calendar/month-view.md +475 -0
  81. package/skills/cocoar-vue-ui/references/components/calendar/performance.md +186 -0
  82. package/skills/cocoar-vue-ui/references/components/calendar/timeline-view.md +301 -0
  83. package/skills/cocoar-vue-ui/references/components/calendar/week-view.md +382 -0
  84. package/skills/cocoar-vue-ui/references/components/calendar/work-week-view.md +145 -0
  85. package/skills/cocoar-vue-ui/references/components/calendar/year-view.md +63 -0
  86. package/skills/cocoar-vue-ui/references/components/card.md +151 -0
  87. package/skills/cocoar-vue-ui/references/components/checkbox-group.md +103 -0
  88. package/skills/cocoar-vue-ui/references/components/checkbox.md +279 -0
  89. package/skills/cocoar-vue-ui/references/components/code-block.md +241 -0
  90. package/skills/cocoar-vue-ui/references/components/context-menu.md +355 -0
  91. package/skills/cocoar-vue-ui/references/components/data-grid/checkbox.md +213 -0
  92. package/skills/cocoar-vue-ui/references/components/data-grid/date-columns.md +272 -0
  93. package/skills/cocoar-vue-ui/references/components/data-grid/editing.md +236 -0
  94. package/skills/cocoar-vue-ui/references/components/data-grid/multi-select.md +193 -0
  95. package/skills/cocoar-vue-ui/references/components/data-grid/number.md +147 -0
  96. package/skills/cocoar-vue-ui/references/components/data-grid/select.md +202 -0
  97. package/skills/cocoar-vue-ui/references/components/data-grid/text.md +127 -0
  98. package/skills/cocoar-vue-ui/references/components/data-grid.md +1225 -0
  99. package/skills/cocoar-vue-ui/references/components/data-list.md +2121 -0
  100. package/skills/cocoar-vue-ui/references/components/date-or-time-picker.md +200 -0
  101. package/skills/cocoar-vue-ui/references/components/date-picker.md +203 -0
  102. package/skills/cocoar-vue-ui/references/components/date-time-picker.md +154 -0
  103. package/skills/cocoar-vue-ui/references/components/date-views.md +212 -0
  104. package/skills/cocoar-vue-ui/references/components/dialog.md +148 -0
  105. package/skills/cocoar-vue-ui/references/components/divider.md +157 -0
  106. package/skills/cocoar-vue-ui/references/components/document-viewer/annotations.md +400 -0
  107. package/skills/cocoar-vue-ui/references/components/document-viewer/coar-document-viewer.md +327 -0
  108. package/skills/cocoar-vue-ui/references/components/document-viewer/index.md +234 -0
  109. package/skills/cocoar-vue-ui/references/components/document-viewer/toolbar.md +221 -0
  110. package/skills/cocoar-vue-ui/references/components/drag-drop.md +267 -0
  111. package/skills/cocoar-vue-ui/references/components/dual-listbox.md +449 -0
  112. package/skills/cocoar-vue-ui/references/components/file-explorer/asset-store.md +327 -0
  113. package/skills/cocoar-vue-ui/references/components/file-explorer/in-memory-store.md +176 -0
  114. package/skills/cocoar-vue-ui/references/components/file-explorer/index.md +311 -0
  115. package/skills/cocoar-vue-ui/references/components/file-explorer/use-file-explorer.md +300 -0
  116. package/skills/cocoar-vue-ui/references/components/form-field.md +1025 -0
  117. package/skills/cocoar-vue-ui/references/components/fragment-parser.md +298 -0
  118. package/skills/cocoar-vue-ui/references/components/link.md +235 -0
  119. package/skills/cocoar-vue-ui/references/components/listbox.md +575 -0
  120. package/skills/cocoar-vue-ui/references/components/map/editor.md +448 -0
  121. package/skills/cocoar-vue-ui/references/components/map/index.md +351 -0
  122. package/skills/cocoar-vue-ui/references/components/markdown-diagrams.md +210 -0
  123. package/skills/cocoar-vue-ui/references/components/markdown-editor.md +1478 -0
  124. package/skills/cocoar-vue-ui/references/components/markdown-embeds.md +387 -0
  125. package/skills/cocoar-vue-ui/references/components/markdown-form.md +447 -0
  126. package/skills/cocoar-vue-ui/references/components/markdown.md +276 -0
  127. package/skills/cocoar-vue-ui/references/components/menu.md +380 -0
  128. package/skills/cocoar-vue-ui/references/components/mermaid.md +172 -0
  129. package/skills/cocoar-vue-ui/references/components/navbar.md +147 -0
  130. package/skills/cocoar-vue-ui/references/components/note.md +96 -0
  131. package/skills/cocoar-vue-ui/references/components/notice.md +131 -0
  132. package/skills/cocoar-vue-ui/references/components/number-input.md +215 -0
  133. package/skills/cocoar-vue-ui/references/components/otp-input.md +324 -0
  134. package/skills/cocoar-vue-ui/references/components/page-builder/authoring-contract.md +271 -0
  135. package/skills/cocoar-vue-ui/references/components/page-builder/coar-page-builder.md +476 -0
  136. package/skills/cocoar-vue-ui/references/components/page-builder/coar-page-renderer.md +677 -0
  137. package/skills/cocoar-vue-ui/references/components/page-builder/custom-elements.md +441 -0
  138. package/skills/cocoar-vue-ui/references/components/page-builder/idp-integration.md +122 -0
  139. package/skills/cocoar-vue-ui/references/components/page-builder/index.md +573 -0
  140. package/skills/cocoar-vue-ui/references/components/pagination.md +150 -0
  141. package/skills/cocoar-vue-ui/references/components/panel-layout.md +372 -0
  142. package/skills/cocoar-vue-ui/references/components/password-input.md +175 -0
  143. package/skills/cocoar-vue-ui/references/components/popconfirm.md +186 -0
  144. package/skills/cocoar-vue-ui/references/components/popover.md +173 -0
  145. package/skills/cocoar-vue-ui/references/components/progress-bar.md +178 -0
  146. package/skills/cocoar-vue-ui/references/components/radio-group.md +225 -0
  147. package/skills/cocoar-vue-ui/references/components/script-editor.md +1271 -0
  148. package/skills/cocoar-vue-ui/references/components/segmented-control.md +238 -0
  149. package/skills/cocoar-vue-ui/references/components/select.md +463 -0
  150. package/skills/cocoar-vue-ui/references/components/sidebar.md +421 -0
  151. package/skills/cocoar-vue-ui/references/components/spinner.md +132 -0
  152. package/skills/cocoar-vue-ui/references/components/switch.md +195 -0
  153. package/skills/cocoar-vue-ui/references/components/table.md +170 -0
  154. package/skills/cocoar-vue-ui/references/components/tabs.md +382 -0
  155. package/skills/cocoar-vue-ui/references/components/tag.md +178 -0
  156. package/skills/cocoar-vue-ui/references/components/text-input.md +256 -0
  157. package/skills/cocoar-vue-ui/references/components/toast.md +160 -0
  158. package/skills/cocoar-vue-ui/references/components/tooltip.md +121 -0
  159. package/skills/cocoar-vue-ui/references/components/transitions.md +193 -0
  160. package/skills/cocoar-vue-ui/references/components/tree.md +2388 -0
  161. package/skills/cocoar-vue-ui/references/components/virtual-list.md +212 -0
  162. package/skills/cocoar-vue-ui/references/components/wizard.md +251 -0
  163. package/skills/cocoar-vue-ui/references/components/zoned-date-time-picker.md +177 -0
  164. package/skills/cocoar-vue-ui/references/foundations/colors.md +708 -0
  165. package/skills/cocoar-vue-ui/references/foundations/design-principles.md +115 -0
  166. package/skills/cocoar-vue-ui/references/foundations/icons.md +381 -0
  167. package/skills/cocoar-vue-ui/references/foundations/localization/formatting.md +530 -0
  168. package/skills/cocoar-vue-ui/references/foundations/localization/setup.md +86 -0
  169. package/skills/cocoar-vue-ui/references/foundations/localization/timezones.md +182 -0
  170. package/skills/cocoar-vue-ui/references/foundations/localization/translations.md +305 -0
  171. package/skills/cocoar-vue-ui/references/foundations/motion.md +549 -0
  172. package/skills/cocoar-vue-ui/references/foundations/spacing.md +330 -0
  173. package/skills/cocoar-vue-ui/references/foundations/theming.md +140 -0
  174. package/skills/cocoar-vue-ui/references/foundations/typography.md +206 -0
  175. package/skills/cocoar-vue-ui/references/guide/error-handling.md +162 -0
  176. package/skills/cocoar-vue-ui/references/guide/getting-started.md +119 -0
  177. package/skills/cocoar-vue-ui/references/guide/migration-page-builder-3.md +207 -0
  178. package/skills/cocoar-vue-ui/references/guide/migration.md +140 -0
  179. package/skills/cocoar-vue-ui/references/guide/theming.md +98 -0
@@ -0,0 +1,238 @@
1
+ <!-- Generated from apps/docs/components/segmented-control.md by apps/docs/scripts/sync-skill.mjs. Do not edit; edit the docs page. -->
2
+
3
+ # Segmented Control
4
+
5
+ Switch between a small fixed set of mutually-exclusive options like view modes, filters, density, or time ranges. A segmented control reads as a button-bar for view-state — same semantics as a radio group (single selection from N options), different visual register: it belongs in toolbars and headers, not in forms.
6
+
7
+ ```ts
8
+ import { CoarSegmentedControl } from '@cocoar/vue-ui';
9
+ ```
10
+
11
+ ## Basic Usage
12
+
13
+ Pass an array of `{ value, label }` options and bind the active value via `v-model`. The control is generic over the option's value type, so the model and event payloads stay strongly typed.
14
+
15
+ **Demo — `segmented-control/demos/SegmentedControlBasic.vue`**
16
+
17
+ ```vue
18
+ <template>
19
+ <div style="display: flex; flex-direction: column; gap: 12px; align-items: flex-start;">
20
+ <CoarSegmentedControl
21
+ v-model="view"
22
+ :options="options"
23
+ aria-label="Calendar view"
24
+ />
25
+ <p style="margin: 0; font-size: 13px; color: var(--coar-text-neutral-secondary);">
26
+ Active view: <strong>{{ view }}</strong>
27
+ </p>
28
+ </div>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ import { ref } from 'vue';
33
+ import { CoarSegmentedControl, type CoarSegmentedControlOption } from '@cocoar/vue-ui';
34
+
35
+ type CalendarView = 'day' | 'week' | 'month' | 'agenda';
36
+
37
+ const view = ref<CalendarView>('week');
38
+ const options: CoarSegmentedControlOption<CalendarView>[] = [
39
+ { value: 'day', label: 'Day' },
40
+ { value: 'week', label: 'Week' },
41
+ { value: 'month', label: 'Month' },
42
+ { value: 'agenda', label: 'Agenda' },
43
+ ];
44
+ </script>
45
+ ```
46
+
47
+ ## Sizes
48
+
49
+ Heights and font sizes line up with `CoarButton`'s `xs / s / m / l` so the segmented control sits naturally next to other buttons in a toolbar. Default is `s`.
50
+
51
+ **Demo — `segmented-control/demos/SegmentedControlSizes.vue`**
52
+
53
+ ```vue
54
+ <template>
55
+ <div style="display: flex; flex-direction: column; gap: 12px; align-items: flex-start;">
56
+ <CoarSegmentedControl v-model="density" :options="options" size="xs" aria-label="Density xs" />
57
+ <CoarSegmentedControl v-model="density" :options="options" size="s" aria-label="Density s" />
58
+ <CoarSegmentedControl v-model="density" :options="options" size="m" aria-label="Density m" />
59
+ <CoarSegmentedControl v-model="density" :options="options" size="l" aria-label="Density l" />
60
+ </div>
61
+ </template>
62
+
63
+ <script setup lang="ts">
64
+ import { ref } from 'vue';
65
+ import { CoarSegmentedControl, type CoarSegmentedControlOption } from '@cocoar/vue-ui';
66
+
67
+ const density = ref<'comfortable' | 'compact'>('comfortable');
68
+ const options: CoarSegmentedControlOption<'comfortable' | 'compact'>[] = [
69
+ { value: 'comfortable', label: 'Comfortable' },
70
+ { value: 'compact', label: 'Compact' },
71
+ ];
72
+ </script>
73
+ ```
74
+
75
+ ## With Icons
76
+
77
+ Each option accepts an optional `icon` (`CoarIcon` name) rendered before the label. Icon-only segments work too — pass `ariaLabel` on the option for screen-reader text when the visible label is empty.
78
+
79
+ **Demo — `segmented-control/demos/SegmentedControlIcons.vue`**
80
+
81
+ ```vue
82
+ <template>
83
+ <div style="display: flex; flex-direction: column; gap: 12px; align-items: flex-start;">
84
+ <CoarSegmentedControl
85
+ v-model="layout"
86
+ :options="options"
87
+ aria-label="Layout mode"
88
+ />
89
+ <p style="margin: 0; font-size: 13px; color: var(--coar-text-neutral-secondary);">
90
+ Layout: <strong>{{ layout }}</strong>
91
+ </p>
92
+ </div>
93
+ </template>
94
+
95
+ <script setup lang="ts">
96
+ import { ref } from 'vue';
97
+ import { CoarSegmentedControl, type CoarSegmentedControlOption } from '@cocoar/vue-ui';
98
+
99
+ type Layout = 'list' | 'grid' | 'columns';
100
+
101
+ const layout = ref<Layout>('list');
102
+ const options: CoarSegmentedControlOption<Layout>[] = [
103
+ { value: 'list', label: 'List', icon: 'list' },
104
+ { value: 'grid', label: 'Grid', icon: 'layout-grid' },
105
+ { value: 'columns', label: 'Columns', icon: 'columns' },
106
+ ];
107
+ </script>
108
+ ```
109
+
110
+ ## Disabled
111
+
112
+ Disable a single option to hide a state that's currently unavailable, or disable the whole control when the surrounding context is read-only.
113
+
114
+ **Demo — `segmented-control/demos/SegmentedControlDisabled.vue`**
115
+
116
+ ```vue
117
+ <template>
118
+ <div style="display: flex; flex-direction: column; gap: 16px; align-items: flex-start;">
119
+ <div>
120
+ <p style="margin: 0 0 6px 0; font-size: 13px; color: var(--coar-text-neutral-secondary);">
121
+ Whole control disabled
122
+ </p>
123
+ <CoarSegmentedControl
124
+ v-model="status"
125
+ :options="options"
126
+ :disabled="true"
127
+ aria-label="Disabled"
128
+ />
129
+ </div>
130
+ <div>
131
+ <p style="margin: 0 0 6px 0; font-size: 13px; color: var(--coar-text-neutral-secondary);">
132
+ Single option disabled (Archived)
133
+ </p>
134
+ <CoarSegmentedControl
135
+ v-model="status"
136
+ :options="optionsWithDisabled"
137
+ aria-label="Per-option disabled"
138
+ />
139
+ </div>
140
+ </div>
141
+ </template>
142
+
143
+ <script setup lang="ts">
144
+ import { ref } from 'vue';
145
+ import { CoarSegmentedControl, type CoarSegmentedControlOption } from '@cocoar/vue-ui';
146
+
147
+ type Status = 'open' | 'closed' | 'archived';
148
+
149
+ const status = ref<Status>('open');
150
+ const options: CoarSegmentedControlOption<Status>[] = [
151
+ { value: 'open', label: 'Open' },
152
+ { value: 'closed', label: 'Closed' },
153
+ { value: 'archived', label: 'Archived' },
154
+ ];
155
+ const optionsWithDisabled: CoarSegmentedControlOption<Status>[] = [
156
+ { value: 'open', label: 'Open' },
157
+ { value: 'closed', label: 'Closed' },
158
+ { value: 'archived', label: 'Archived', disabled: true },
159
+ ];
160
+ </script>
161
+ ```
162
+
163
+ ## Full Width
164
+
165
+ Set `fullWidth` to make the control fill its container; segments share the available width equally. Useful in narrow side panels and mobile layouts.
166
+
167
+ **Demo — `segmented-control/demos/SegmentedControlFullWidth.vue`**
168
+
169
+ ```vue
170
+ <template>
171
+ <div style="max-width: 480px;">
172
+ <CoarSegmentedControl
173
+ v-model="period"
174
+ :options="options"
175
+ :full-width="true"
176
+ aria-label="Reporting period"
177
+ />
178
+ </div>
179
+ </template>
180
+
181
+ <script setup lang="ts">
182
+ import { ref } from 'vue';
183
+ import { CoarSegmentedControl, type CoarSegmentedControlOption } from '@cocoar/vue-ui';
184
+
185
+ type Period = '1d' | '7d' | '30d' | '90d' | '1y';
186
+
187
+ const period = ref<Period>('7d');
188
+ const options: CoarSegmentedControlOption<Period>[] = [
189
+ { value: '1d', label: '1 Day' },
190
+ { value: '7d', label: '7 Days' },
191
+ { value: '30d', label: '30 Days' },
192
+ { value: '90d', label: '90 Days' },
193
+ { value: '1y', label: '1 Year' },
194
+ ];
195
+ </script>
196
+ ```
197
+
198
+ ## When to Use
199
+
200
+ | Use a segmented control when… | Use a radio group instead when… |
201
+ |---|---|
202
+ | The choices are 2–6 view-state options | The choices are part of a form being submitted |
203
+ | The control sits in a toolbar / header | The control sits in a labelled form field |
204
+ | Choosing should switch the UI immediately | Choosing should be confirmed by a Submit |
205
+
206
+ ## Accessibility
207
+
208
+ The control is exposed as `role="group"` with the `ariaLabel` you pass; each segment is a `<button type="button">` with `aria-pressed` reflecting the active state. Screen readers announce both the group label and the pressed state of the active segment. Disabled segments use the native `disabled` attribute.
209
+
210
+ ## API
211
+
212
+ ### Props
213
+
214
+ | Prop | Type | Default | Description |
215
+ |------|------|---------|-------------|
216
+ | `v-model` | `T` (required) | — | Active option's `value`. |
217
+ | `options` | `CoarSegmentedControlOption<T>[]` | — | List of segments. |
218
+ | `size` | `'xs' \| 's' \| 'm' \| 'l'` | `'s'` | Sizes match `CoarButton`. |
219
+ | `disabled` | `boolean` | `false` | Disable the entire control. |
220
+ | `fullWidth` | `boolean` | `false` | Stretch to fill the parent's width. |
221
+ | `ariaLabel` | `string` | — | Screen-reader label for the group. |
222
+
223
+ ### Events
224
+
225
+ | Event | Payload | Description |
226
+ |-------|---------|-------------|
227
+ | `update:modelValue` | `T` | Standard v-model update. |
228
+ | `change` | `(value: T, option: CoarSegmentedControlOption<T>)` | Fired only when the user picks a *different* option. |
229
+
230
+ ### `CoarSegmentedControlOption<T>`
231
+
232
+ | Field | Type | Description |
233
+ |-------|------|-------------|
234
+ | `value` | `T` | Bound to `v-model`. |
235
+ | `label` | `string` | Visible label. May be empty for icon-only segments. |
236
+ | `icon` | `string` | Optional `CoarIcon` name rendered before the label. |
237
+ | `disabled` | `boolean` | Disable just this segment. |
238
+ | `ariaLabel` | `string` | Override aria-label for the segment (typical for icon-only). |