@cocoar/vue-ui 3.1.0 → 3.2.0-beta.11
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.
- package/bin/cli.mjs +53 -0
- package/dist/components/checkbox/CoarCheckbox.vue.d.ts +1 -1
- package/dist/components/checkbox/CoarCheckbox.vue.d.ts.map +1 -1
- package/dist/components/code-block/CoarCodeBlock.vue.d.ts +1 -1
- package/dist/components/code-block/CoarCodeBlock.vue.d.ts.map +1 -1
- package/dist/components/data-list/CoarDataList.vue.d.ts +158 -0
- package/dist/components/data-list/CoarDataList.vue.d.ts.map +1 -0
- package/dist/components/data-list/CoarDataListToolbar.vue.d.ts +30 -0
- package/dist/components/data-list/CoarDataListToolbar.vue.d.ts.map +1 -0
- package/dist/components/data-list/data-list-builder.d.ts +288 -0
- package/dist/components/data-list/data-list-builder.d.ts.map +1 -0
- package/dist/components/data-list/index.d.ts +12 -0
- package/dist/components/data-list/index.d.ts.map +1 -0
- package/dist/components/data-list/internal/compare.d.ts +14 -0
- package/dist/components/data-list/internal/compare.d.ts.map +1 -0
- package/dist/components/data-list/internal/reorder-core.d.ts +46 -0
- package/dist/components/data-list/internal/reorder-core.d.ts.map +1 -0
- package/dist/components/data-list/internal/search.d.ts +16 -0
- package/dist/components/data-list/internal/search.d.ts.map +1 -0
- package/dist/components/data-list/internal/useDataListLines.d.ts +92 -0
- package/dist/components/data-list/internal/useDataListLines.d.ts.map +1 -0
- package/dist/components/data-list/internal/useDataListReorder.d.ts +68 -0
- package/dist/components/data-list/internal/useDataListReorder.d.ts.map +1 -0
- package/dist/components/data-list/internal/useSearchHighlight.d.ts +19 -0
- package/dist/components/data-list/internal/useSearchHighlight.d.ts.map +1 -0
- package/dist/components/data-list/types.d.ts +185 -0
- package/dist/components/data-list/types.d.ts.map +1 -0
- package/dist/components/data-list/useDataListModel.d.ts +79 -0
- package/dist/components/data-list/useDataListModel.d.ts.map +1 -0
- package/dist/components/date-time/_shared/maskito-config.d.ts +7 -2
- package/dist/components/date-time/_shared/maskito-config.d.ts.map +1 -1
- package/dist/components/date-time/_shared/time-helpers.d.ts +11 -4
- package/dist/components/date-time/_shared/time-helpers.d.ts.map +1 -1
- package/dist/components/date-time/_shared/use-date-picker-base.d.ts +1 -1
- package/dist/components/date-time/plain-date-picker/CoarPlainDatePicker.vue.d.ts +1 -1
- package/dist/components/date-time/plain-date-picker/CoarPlainDatePicker.vue.d.ts.map +1 -1
- package/dist/components/date-time/plain-date-time-picker/CoarPlainDateTimePicker.vue.d.ts +1 -1
- package/dist/components/date-time/plain-date-time-picker/CoarPlainDateTimePicker.vue.d.ts.map +1 -1
- package/dist/components/date-time/zoned-date-time-picker/CoarZonedDateTimePicker.vue.d.ts +1 -1
- package/dist/components/date-time/zoned-date-time-picker/CoarZonedDateTimePicker.vue.d.ts.map +1 -1
- package/dist/components/dual-listbox/CoarDualListbox.vue.d.ts +3 -0
- package/dist/components/dual-listbox/CoarDualListbox.vue.d.ts.map +1 -1
- package/dist/components/form-field/CoarFormField.vue.d.ts +1 -1
- package/dist/components/form-field/CoarFormField.vue.d.ts.map +1 -1
- package/dist/components/icon/CoarIcon.vue.d.ts +2 -2
- package/dist/components/icon/CoarIcon.vue.d.ts.map +1 -1
- package/dist/components/listbox/CoarListbox.vue.d.ts +7 -0
- package/dist/components/listbox/CoarListbox.vue.d.ts.map +1 -1
- package/dist/components/number-input/CoarNumberInput.vue.d.ts +1 -1
- package/dist/components/number-input/CoarNumberInput.vue.d.ts.map +1 -1
- package/dist/components/otp-input/CoarOtpInput.vue.d.ts +1 -1
- package/dist/components/otp-input/CoarOtpInput.vue.d.ts.map +1 -1
- package/dist/components/password-input/CoarPasswordInput.vue.d.ts +1 -1
- package/dist/components/password-input/CoarPasswordInput.vue.d.ts.map +1 -1
- package/dist/components/switch/CoarSwitch.vue.d.ts +1 -1
- package/dist/components/switch/CoarSwitch.vue.d.ts.map +1 -1
- package/dist/components/text-input/CoarTextInput.vue.d.ts +1 -1
- package/dist/components/text-input/CoarTextInput.vue.d.ts.map +1 -1
- package/dist/composables/dragRegistry.d.ts +12 -0
- package/dist/composables/dragRegistry.d.ts.map +1 -1
- package/dist/composables/index.d.ts +2 -2
- package/dist/composables/index.d.ts.map +1 -1
- package/dist/composables/useDragDrop.d.ts +62 -6
- package/dist/composables/useDragDrop.d.ts.map +1 -1
- package/dist/composables/useVirtualList.d.ts +21 -1
- package/dist/composables/useVirtualList.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4508 -2039
- package/package.json +9 -3
- package/skills/cocoar-vue-ui/SKILL.md +244 -0
- package/skills/cocoar-vue-ui/references/components/avatar.md +178 -0
- package/skills/cocoar-vue-ui/references/components/badge.md +290 -0
- package/skills/cocoar-vue-ui/references/components/breadcrumb.md +238 -0
- package/skills/cocoar-vue-ui/references/components/button.md +252 -0
- package/skills/cocoar-vue-ui/references/components/calendar/agenda-view.md +372 -0
- package/skills/cocoar-vue-ui/references/components/calendar/coar-calendar.md +1647 -0
- package/skills/cocoar-vue-ui/references/components/calendar/day-view.md +361 -0
- package/skills/cocoar-vue-ui/references/components/calendar/index.md +312 -0
- package/skills/cocoar-vue-ui/references/components/calendar/month-view.md +486 -0
- package/skills/cocoar-vue-ui/references/components/calendar/performance.md +186 -0
- package/skills/cocoar-vue-ui/references/components/calendar/timeline-view.md +301 -0
- package/skills/cocoar-vue-ui/references/components/calendar/week-view.md +382 -0
- package/skills/cocoar-vue-ui/references/components/calendar/work-week-view.md +145 -0
- package/skills/cocoar-vue-ui/references/components/calendar/year-view.md +63 -0
- package/skills/cocoar-vue-ui/references/components/card.md +151 -0
- package/skills/cocoar-vue-ui/references/components/checkbox-group.md +103 -0
- package/skills/cocoar-vue-ui/references/components/checkbox.md +279 -0
- package/skills/cocoar-vue-ui/references/components/code-block.md +241 -0
- package/skills/cocoar-vue-ui/references/components/context-menu.md +355 -0
- package/skills/cocoar-vue-ui/references/components/data-grid/checkbox.md +213 -0
- package/skills/cocoar-vue-ui/references/components/data-grid/date-columns.md +272 -0
- package/skills/cocoar-vue-ui/references/components/data-grid/editing.md +236 -0
- package/skills/cocoar-vue-ui/references/components/data-grid/multi-select.md +193 -0
- package/skills/cocoar-vue-ui/references/components/data-grid/number.md +147 -0
- package/skills/cocoar-vue-ui/references/components/data-grid/select.md +202 -0
- package/skills/cocoar-vue-ui/references/components/data-grid/text.md +127 -0
- package/skills/cocoar-vue-ui/references/components/data-grid.md +1225 -0
- package/skills/cocoar-vue-ui/references/components/data-list.md +2121 -0
- package/skills/cocoar-vue-ui/references/components/date-or-time-picker.md +200 -0
- package/skills/cocoar-vue-ui/references/components/date-picker.md +203 -0
- package/skills/cocoar-vue-ui/references/components/date-time-picker.md +154 -0
- package/skills/cocoar-vue-ui/references/components/date-views.md +212 -0
- package/skills/cocoar-vue-ui/references/components/dialog.md +148 -0
- package/skills/cocoar-vue-ui/references/components/divider.md +157 -0
- package/skills/cocoar-vue-ui/references/components/document-viewer/annotations.md +400 -0
- package/skills/cocoar-vue-ui/references/components/document-viewer/coar-document-viewer.md +327 -0
- package/skills/cocoar-vue-ui/references/components/document-viewer/index.md +234 -0
- package/skills/cocoar-vue-ui/references/components/document-viewer/toolbar.md +221 -0
- package/skills/cocoar-vue-ui/references/components/drag-drop.md +267 -0
- package/skills/cocoar-vue-ui/references/components/dual-listbox.md +449 -0
- package/skills/cocoar-vue-ui/references/components/file-explorer/asset-store.md +327 -0
- package/skills/cocoar-vue-ui/references/components/file-explorer/in-memory-store.md +176 -0
- package/skills/cocoar-vue-ui/references/components/file-explorer/index.md +311 -0
- package/skills/cocoar-vue-ui/references/components/file-explorer/use-file-explorer.md +300 -0
- package/skills/cocoar-vue-ui/references/components/form-field.md +1025 -0
- package/skills/cocoar-vue-ui/references/components/fragment-parser.md +298 -0
- package/skills/cocoar-vue-ui/references/components/link.md +235 -0
- package/skills/cocoar-vue-ui/references/components/listbox.md +575 -0
- package/skills/cocoar-vue-ui/references/components/map/editor.md +448 -0
- package/skills/cocoar-vue-ui/references/components/map/index.md +351 -0
- package/skills/cocoar-vue-ui/references/components/markdown-diagrams.md +210 -0
- package/skills/cocoar-vue-ui/references/components/markdown-editor.md +1478 -0
- package/skills/cocoar-vue-ui/references/components/markdown-embeds.md +387 -0
- package/skills/cocoar-vue-ui/references/components/markdown-form.md +447 -0
- package/skills/cocoar-vue-ui/references/components/markdown.md +276 -0
- package/skills/cocoar-vue-ui/references/components/menu.md +380 -0
- package/skills/cocoar-vue-ui/references/components/mermaid.md +172 -0
- package/skills/cocoar-vue-ui/references/components/navbar.md +147 -0
- package/skills/cocoar-vue-ui/references/components/note.md +96 -0
- package/skills/cocoar-vue-ui/references/components/notice.md +131 -0
- package/skills/cocoar-vue-ui/references/components/number-input.md +215 -0
- package/skills/cocoar-vue-ui/references/components/otp-input.md +324 -0
- package/skills/cocoar-vue-ui/references/components/page-builder/authoring-contract.md +271 -0
- package/skills/cocoar-vue-ui/references/components/page-builder/coar-page-builder.md +476 -0
- package/skills/cocoar-vue-ui/references/components/page-builder/coar-page-renderer.md +677 -0
- package/skills/cocoar-vue-ui/references/components/page-builder/custom-elements.md +441 -0
- package/skills/cocoar-vue-ui/references/components/page-builder/idp-integration.md +122 -0
- package/skills/cocoar-vue-ui/references/components/page-builder/index.md +573 -0
- package/skills/cocoar-vue-ui/references/components/pagination.md +150 -0
- package/skills/cocoar-vue-ui/references/components/panel-layout.md +372 -0
- package/skills/cocoar-vue-ui/references/components/password-input.md +175 -0
- package/skills/cocoar-vue-ui/references/components/popconfirm.md +186 -0
- package/skills/cocoar-vue-ui/references/components/popover.md +173 -0
- package/skills/cocoar-vue-ui/references/components/progress-bar.md +178 -0
- package/skills/cocoar-vue-ui/references/components/radio-group.md +225 -0
- package/skills/cocoar-vue-ui/references/components/script-editor.md +1271 -0
- package/skills/cocoar-vue-ui/references/components/segmented-control.md +238 -0
- package/skills/cocoar-vue-ui/references/components/select.md +463 -0
- package/skills/cocoar-vue-ui/references/components/sidebar.md +421 -0
- package/skills/cocoar-vue-ui/references/components/spinner.md +132 -0
- package/skills/cocoar-vue-ui/references/components/switch.md +195 -0
- package/skills/cocoar-vue-ui/references/components/table.md +170 -0
- package/skills/cocoar-vue-ui/references/components/tabs.md +382 -0
- package/skills/cocoar-vue-ui/references/components/tag.md +178 -0
- package/skills/cocoar-vue-ui/references/components/text-input.md +256 -0
- package/skills/cocoar-vue-ui/references/components/toast.md +160 -0
- package/skills/cocoar-vue-ui/references/components/tooltip.md +121 -0
- package/skills/cocoar-vue-ui/references/components/transitions.md +193 -0
- package/skills/cocoar-vue-ui/references/components/tree.md +2388 -0
- package/skills/cocoar-vue-ui/references/components/virtual-list.md +212 -0
- package/skills/cocoar-vue-ui/references/components/wizard.md +251 -0
- package/skills/cocoar-vue-ui/references/components/zoned-date-time-picker.md +177 -0
- package/skills/cocoar-vue-ui/references/foundations/colors.md +708 -0
- package/skills/cocoar-vue-ui/references/foundations/design-principles.md +115 -0
- package/skills/cocoar-vue-ui/references/foundations/icons.md +381 -0
- package/skills/cocoar-vue-ui/references/foundations/localization/formatting.md +530 -0
- package/skills/cocoar-vue-ui/references/foundations/localization/setup.md +86 -0
- package/skills/cocoar-vue-ui/references/foundations/localization/timezones.md +182 -0
- package/skills/cocoar-vue-ui/references/foundations/localization/translations.md +305 -0
- package/skills/cocoar-vue-ui/references/foundations/motion.md +549 -0
- package/skills/cocoar-vue-ui/references/foundations/spacing.md +330 -0
- package/skills/cocoar-vue-ui/references/foundations/theming.md +140 -0
- package/skills/cocoar-vue-ui/references/foundations/typography.md +206 -0
- package/skills/cocoar-vue-ui/references/guide/error-handling.md +162 -0
- package/skills/cocoar-vue-ui/references/guide/getting-started.md +116 -0
- package/skills/cocoar-vue-ui/references/guide/migration-page-builder-3.md +207 -0
- package/skills/cocoar-vue-ui/references/guide/migration.md +140 -0
- 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). |
|