@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,330 @@
|
|
|
1
|
+
<!-- Generated from apps/docs/foundations/spacing.md by apps/docs/scripts/sync-skill.mjs. Do not edit; edit the docs page. -->
|
|
2
|
+
|
|
3
|
+
# Spacing & Effects
|
|
4
|
+
|
|
5
|
+
Layout rhythm, corner shapes, and depth — the visual building blocks that give the system its feel.
|
|
6
|
+
|
|
7
|
+
## Border Radius
|
|
8
|
+
|
|
9
|
+
Seven radius tokens shape everything from subtle input rounding to fully circular avatars.
|
|
10
|
+
|
|
11
|
+
**Demo — `spacing/demos/BorderRadius.vue`**
|
|
12
|
+
|
|
13
|
+
```vue
|
|
14
|
+
<template>
|
|
15
|
+
<div class="radius-showcase">
|
|
16
|
+
<div
|
|
17
|
+
v-for="token in radiusTokens"
|
|
18
|
+
:key="token.name"
|
|
19
|
+
class="radius-card"
|
|
20
|
+
>
|
|
21
|
+
<div
|
|
22
|
+
class="radius-shape"
|
|
23
|
+
:style="{ borderRadius: token.value }"
|
|
24
|
+
/>
|
|
25
|
+
<div class="radius-meta">
|
|
26
|
+
<span class="radius-name">{{ token.name }}</span>
|
|
27
|
+
<code class="radius-value">{{ token.value }}</code>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</template>
|
|
32
|
+
|
|
33
|
+
<script setup lang="ts">
|
|
34
|
+
const radiusTokens = [
|
|
35
|
+
{ name: 'XXS', value: '1px' },
|
|
36
|
+
{ name: 'XS', value: '2px' },
|
|
37
|
+
{ name: 'S', value: '3px' },
|
|
38
|
+
{ name: 'M', value: '4px' },
|
|
39
|
+
{ name: 'L', value: '5px' },
|
|
40
|
+
{ name: 'XL', value: '6px' },
|
|
41
|
+
{ name: 'Full', value: '999px' },
|
|
42
|
+
];
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<style scoped>
|
|
46
|
+
.radius-showcase {
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-wrap: wrap;
|
|
49
|
+
gap: 20px;
|
|
50
|
+
padding: 8px 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.radius-card {
|
|
54
|
+
display: flex;
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
align-items: center;
|
|
57
|
+
gap: 12px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.radius-shape {
|
|
61
|
+
width: 72px;
|
|
62
|
+
height: 72px;
|
|
63
|
+
background: var(--vp-c-brand-soft);
|
|
64
|
+
transition: transform 0.2s ease;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.radius-shape:hover {
|
|
68
|
+
transform: scale(1.08);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.radius-meta {
|
|
72
|
+
display: flex;
|
|
73
|
+
flex-direction: column;
|
|
74
|
+
align-items: center;
|
|
75
|
+
gap: 2px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.radius-name {
|
|
79
|
+
font-size: 13px;
|
|
80
|
+
font-weight: 600;
|
|
81
|
+
color: var(--vp-c-text-1);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.radius-value {
|
|
85
|
+
font-size: 11px;
|
|
86
|
+
color: var(--vp-c-text-3);
|
|
87
|
+
font-family: var(--vp-font-family-mono);
|
|
88
|
+
background: none !important;
|
|
89
|
+
}
|
|
90
|
+
</style>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Spacing Scale
|
|
94
|
+
|
|
95
|
+
All spacing is built on a **4 px grid**. These tokens control padding, margins, and gaps throughout the system.
|
|
96
|
+
|
|
97
|
+
**Demo — `spacing/demos/SpacingScale.vue`**
|
|
98
|
+
|
|
99
|
+
```vue
|
|
100
|
+
<template>
|
|
101
|
+
<div class="spacing-scale">
|
|
102
|
+
<div
|
|
103
|
+
v-for="token in spacingTokens"
|
|
104
|
+
:key="token.name"
|
|
105
|
+
class="spacing-row"
|
|
106
|
+
>
|
|
107
|
+
<div class="spacing-label">
|
|
108
|
+
<span class="spacing-name">{{ token.name }}</span>
|
|
109
|
+
<code class="spacing-value">{{ token.value }}</code>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="spacing-track">
|
|
112
|
+
<div
|
|
113
|
+
class="spacing-bar"
|
|
114
|
+
:style="{ width: token.value }"
|
|
115
|
+
/>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
</template>
|
|
120
|
+
|
|
121
|
+
<script setup lang="ts">
|
|
122
|
+
const spacingTokens = [
|
|
123
|
+
{ name: 'XXS', value: '2px' },
|
|
124
|
+
{ name: 'XS', value: '4px' },
|
|
125
|
+
{ name: 'S', value: '8px' },
|
|
126
|
+
{ name: 'M', value: '16px' },
|
|
127
|
+
{ name: 'L', value: '24px' },
|
|
128
|
+
{ name: 'XL', value: '32px' },
|
|
129
|
+
{ name: 'XXL', value: '48px' },
|
|
130
|
+
{ name: 'XXXL', value: '64px' },
|
|
131
|
+
];
|
|
132
|
+
</script>
|
|
133
|
+
|
|
134
|
+
<style scoped>
|
|
135
|
+
.spacing-scale {
|
|
136
|
+
display: flex;
|
|
137
|
+
flex-direction: column;
|
|
138
|
+
gap: 10px;
|
|
139
|
+
padding: 4px 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.spacing-row {
|
|
143
|
+
display: flex;
|
|
144
|
+
align-items: center;
|
|
145
|
+
gap: 16px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.spacing-label {
|
|
149
|
+
display: flex;
|
|
150
|
+
align-items: baseline;
|
|
151
|
+
gap: 8px;
|
|
152
|
+
min-width: 100px;
|
|
153
|
+
flex-shrink: 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.spacing-name {
|
|
157
|
+
font-size: 13px;
|
|
158
|
+
font-weight: 600;
|
|
159
|
+
color: var(--vp-c-text-1);
|
|
160
|
+
min-width: 36px;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.spacing-value {
|
|
164
|
+
font-size: 11px;
|
|
165
|
+
color: var(--vp-c-text-3);
|
|
166
|
+
font-family: var(--vp-font-family-mono);
|
|
167
|
+
background: none !important;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.spacing-track {
|
|
171
|
+
flex: 1;
|
|
172
|
+
height: 24px;
|
|
173
|
+
background: var(--vp-c-bg-soft);
|
|
174
|
+
border-radius: 6px;
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
padding: 0 4px;
|
|
178
|
+
overflow: hidden;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.spacing-bar {
|
|
182
|
+
height: 14px;
|
|
183
|
+
min-width: 2px;
|
|
184
|
+
background: var(--vp-c-brand-1);
|
|
185
|
+
border-radius: 4px;
|
|
186
|
+
transition: width 0.4s cubic-bezier(0.22, 1, 0.36, 1);
|
|
187
|
+
}
|
|
188
|
+
</style>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Stroke Width
|
|
192
|
+
|
|
193
|
+
Border thickness for dividers, outlines, and component borders.
|
|
194
|
+
|
|
195
|
+
| Token | Value | Use case |
|
|
196
|
+
|-------|-------|----------|
|
|
197
|
+
| `--coar-stroke-width-xs` | 0.5 px | Hairline dividers |
|
|
198
|
+
| `--coar-stroke-width-s` | 1 px | Default borders |
|
|
199
|
+
| `--coar-stroke-width-m` | 2 px | Emphasis borders |
|
|
200
|
+
| `--coar-stroke-width-l` | 4 px | Heavy accents |
|
|
201
|
+
|
|
202
|
+
## Shadows & Elevation
|
|
203
|
+
|
|
204
|
+
Six shadow levels create the illusion of depth. The shadow _is_ the demo — notice how each card lifts further off the surface.
|
|
205
|
+
|
|
206
|
+
**Demo — `spacing/demos/Shadows.vue`**
|
|
207
|
+
|
|
208
|
+
```vue
|
|
209
|
+
<template>
|
|
210
|
+
<div class="shadow-showcase">
|
|
211
|
+
<div class="shadow-surface">
|
|
212
|
+
<div
|
|
213
|
+
v-for="token in shadowTokens"
|
|
214
|
+
:key="token.name"
|
|
215
|
+
class="shadow-card-wrap"
|
|
216
|
+
>
|
|
217
|
+
<div
|
|
218
|
+
class="shadow-card"
|
|
219
|
+
:style="{ boxShadow: `var(${token.variable})` }"
|
|
220
|
+
/>
|
|
221
|
+
<div class="shadow-meta">
|
|
222
|
+
<span class="shadow-name">{{ token.name }}</span>
|
|
223
|
+
<span class="shadow-desc">{{ token.description }}</span>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
</template>
|
|
229
|
+
|
|
230
|
+
<script setup lang="ts">
|
|
231
|
+
const shadowTokens = [
|
|
232
|
+
{ name: 'XS', variable: '--coar-shadow-xs', description: 'Hover states' },
|
|
233
|
+
{ name: 'S', variable: '--coar-shadow-s', description: 'Cards' },
|
|
234
|
+
{ name: 'M', variable: '--coar-shadow-m', description: 'Dropdowns' },
|
|
235
|
+
{ name: 'L', variable: '--coar-shadow-l', description: 'Modals' },
|
|
236
|
+
{ name: 'XL', variable: '--coar-shadow-xl', description: 'Overlays' },
|
|
237
|
+
{ name: 'Focus', variable: '--coar-shadow-focus', description: 'Focus ring' },
|
|
238
|
+
];
|
|
239
|
+
</script>
|
|
240
|
+
|
|
241
|
+
<style scoped>
|
|
242
|
+
.shadow-showcase {
|
|
243
|
+
padding: 8px 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.shadow-surface {
|
|
247
|
+
display: grid;
|
|
248
|
+
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
|
|
249
|
+
gap: 32px;
|
|
250
|
+
padding: 32px 16px;
|
|
251
|
+
background: var(--vp-c-bg-soft);
|
|
252
|
+
border-radius: 12px;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.shadow-card-wrap {
|
|
256
|
+
display: flex;
|
|
257
|
+
flex-direction: column;
|
|
258
|
+
align-items: center;
|
|
259
|
+
gap: 16px;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.shadow-card {
|
|
263
|
+
width: 88px;
|
|
264
|
+
height: 88px;
|
|
265
|
+
background: var(--vp-c-bg);
|
|
266
|
+
border-radius: 10px;
|
|
267
|
+
transition: transform 0.25s ease;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.shadow-card:hover {
|
|
271
|
+
transform: translateY(-2px);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.shadow-meta {
|
|
275
|
+
display: flex;
|
|
276
|
+
flex-direction: column;
|
|
277
|
+
align-items: center;
|
|
278
|
+
gap: 2px;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.shadow-name {
|
|
282
|
+
font-size: 13px;
|
|
283
|
+
font-weight: 600;
|
|
284
|
+
color: var(--vp-c-text-1);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.shadow-desc {
|
|
288
|
+
font-size: 11px;
|
|
289
|
+
color: var(--vp-c-text-3);
|
|
290
|
+
}
|
|
291
|
+
</style>
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Token Reference
|
|
295
|
+
|
|
296
|
+
### Spacing
|
|
297
|
+
|
|
298
|
+
| Token | Value | Usage |
|
|
299
|
+
|-------|-------|-------|
|
|
300
|
+
| `--coar-spacing-xxs` | 2 px | Tight inner gaps |
|
|
301
|
+
| `--coar-spacing-xs` | 4 px | Small padding, icon gaps |
|
|
302
|
+
| `--coar-spacing-s` | 8 px | Compact padding, list gaps |
|
|
303
|
+
| `--coar-spacing-m` | 16 px | Default padding and gaps |
|
|
304
|
+
| `--coar-spacing-l` | 24 px | Section padding |
|
|
305
|
+
| `--coar-spacing-xl` | 32 px | Large section gaps |
|
|
306
|
+
| `--coar-spacing-xxl` | 48 px | Page-level spacing |
|
|
307
|
+
| `--coar-spacing-xxxl` | 64 px | Hero / splash spacing |
|
|
308
|
+
|
|
309
|
+
### Border Radius
|
|
310
|
+
|
|
311
|
+
| Token | Value |
|
|
312
|
+
|-------|-------|
|
|
313
|
+
| `--coar-radius-xxs` | 1 px |
|
|
314
|
+
| `--coar-radius-xs` | 2 px |
|
|
315
|
+
| `--coar-radius-s` | 3 px |
|
|
316
|
+
| `--coar-radius-m` | 4 px |
|
|
317
|
+
| `--coar-radius-l` | 5 px |
|
|
318
|
+
| `--coar-radius-xl` | 6 px |
|
|
319
|
+
| `--coar-radius-full` | 999 px |
|
|
320
|
+
|
|
321
|
+
### Shadows
|
|
322
|
+
|
|
323
|
+
| Token | Usage |
|
|
324
|
+
|-------|-------|
|
|
325
|
+
| `--coar-shadow-xs` | Subtle lift for hover states |
|
|
326
|
+
| `--coar-shadow-s` | Cards and raised elements |
|
|
327
|
+
| `--coar-shadow-m` | Dropdowns and popovers |
|
|
328
|
+
| `--coar-shadow-l` | Modals and dialogs |
|
|
329
|
+
| `--coar-shadow-xl` | Elevated overlays |
|
|
330
|
+
| `--coar-shadow-focus` | Keyboard focus ring |
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
<!-- Generated from apps/docs/foundations/theming.md by apps/docs/scripts/sync-skill.mjs. Do not edit; edit the docs page. -->
|
|
2
|
+
|
|
3
|
+
# Theme Editor
|
|
4
|
+
|
|
5
|
+
The **Theme Editor** is a live token editor built into every Cocoar app. It lets you explore the entire token system — from raw palette shades all the way to semantic roles — and export a ready-to-paste CSS snippet.
|
|
6
|
+
|
|
7
|
+
> The editor is visible as a small icon in the bottom-right corner of this page. Click it to try everything described here in real time.
|
|
8
|
+
|
|
9
|
+
## Setup
|
|
10
|
+
|
|
11
|
+
Add `CoarThemeEditor` to your app's layout. It renders as a floating panel — no wrapper or portal needed.
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import CoarThemeEditor from '@cocoar/vue-ui/theme-editor';
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```vue
|
|
18
|
+
<!-- In your root layout -->
|
|
19
|
+
<CoarThemeEditor />
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Props
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
|------|------|---------|-------------|
|
|
26
|
+
| `hideDarkToggle` | `boolean` | `false` | Hides the light/dark toggle. Set to `true` when your app manages dark mode itself. |
|
|
27
|
+
|
|
28
|
+
## The Token Tree
|
|
29
|
+
|
|
30
|
+
Cocoar's token system has three layers. Each layer builds on the one above it.
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Layer 1 — Primitives
|
|
34
|
+
--coar-color-red-600 oklch-formula of --coar-error
|
|
35
|
+
|
|
36
|
+
Layer 2 — Semantic
|
|
37
|
+
--coar-background-semantic-error-bold → var(--coar-color-red-600)
|
|
38
|
+
|
|
39
|
+
Layer 3 — Component
|
|
40
|
+
--coar-button-danger-bg → var(--coar-background-semantic-error-bold)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Changing a primitive ripples through semantic tokens, which ripple through every component that uses them. The Theme Editor exposes all three layers.
|
|
44
|
+
|
|
45
|
+
## Tabs
|
|
46
|
+
|
|
47
|
+
### Presets
|
|
48
|
+
|
|
49
|
+
Four built-in starting points: **Enterprise** (default), **Modern SaaS** (rounded), **Playful** (pill buttons, vivid accent), and **Minimal** (sharp corners, no shadows). Selecting a preset resets all other tabs to the preset's values.
|
|
50
|
+
|
|
51
|
+
### Brand
|
|
52
|
+
|
|
53
|
+
Sets the five base hue values that anchor the entire palette:
|
|
54
|
+
|
|
55
|
+
| Token | Default | Purpose |
|
|
56
|
+
|-------|---------|---------|
|
|
57
|
+
| `--coar-accent` | `#1183CD` | Primary actions, links, focus rings |
|
|
58
|
+
| `--coar-success` | `#1e8f48` | Positive feedback |
|
|
59
|
+
| `--coar-error` | `#d63b3b` | Errors, destructive actions |
|
|
60
|
+
| `--coar-warning` | `#cc821f` | Caution |
|
|
61
|
+
| `--coar-info` | `#5e6b84` | Neutral informational |
|
|
62
|
+
|
|
63
|
+
Each color opens a **palette editor** (floating panel) where you can fine-tune the L (lightness) and C (chroma) for individual steps 50–900 using oklch relative color syntax.
|
|
64
|
+
|
|
65
|
+
### Semantic
|
|
66
|
+
|
|
67
|
+
Maps semantic roles to palette entries. Each row shows the resolved color, lets you pick a palette (Accent / Red / Green / Amber / Slate) and a step (50–900), and has a reset button that turns accent-colored when changed.
|
|
68
|
+
|
|
69
|
+
This is the layer that connects intent to color: `--coar-background-semantic-error-bold` points at `Red / 600` by default. Reassigning it to `Amber / 600` would make all error surfaces amber — including form field borders, toast backgrounds, and the danger button — without touching any component code.
|
|
70
|
+
|
|
71
|
+
### Corners
|
|
72
|
+
|
|
73
|
+
Controls the global radius scale (`xxs` → `xl`) plus per-component-group overrides for buttons, inputs, cards, menus, popovers, dialogs, and toasts. Select from named scale steps or `Full` (pill shape).
|
|
74
|
+
|
|
75
|
+
### Type
|
|
76
|
+
|
|
77
|
+
Font family for body text and headings, chosen from a curated list of Google Fonts. Fonts load on demand when selected.
|
|
78
|
+
|
|
79
|
+
### Spacing
|
|
80
|
+
|
|
81
|
+
Component density slider: **Compact** (0.75×), **Default** (1×), or **Comfortable** (1.33×). Scales horizontal padding on all interactive components.
|
|
82
|
+
|
|
83
|
+
### Depth
|
|
84
|
+
|
|
85
|
+
Box shadow per component group (buttons never have shadows; cards, menus, dialogs, and toasts do).
|
|
86
|
+
|
|
87
|
+
### Motion
|
|
88
|
+
|
|
89
|
+
A single duration multiplier that scales all `--coar-duration-*` tokens proportionally. Set to 0 for instant transitions, or push it above 2× to slow everything down for testing.
|
|
90
|
+
|
|
91
|
+
## Exporting
|
|
92
|
+
|
|
93
|
+
Type a class name into the name field at the bottom of the editor (default: `custom`), then click **Download CSS** to get a scoped block containing only the tokens you changed:
|
|
94
|
+
|
|
95
|
+
```css
|
|
96
|
+
/* coar-theme--myapp.css */
|
|
97
|
+
.coar-theme--myapp {
|
|
98
|
+
--coar-accent: #7C3AED;
|
|
99
|
+
--coar-button-radius: var(--coar-radius-m);
|
|
100
|
+
--coar-input-radius: var(--coar-radius-m);
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Drop it into your app after the Cocoar stylesheet and apply the class to your root element:
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<!-- index.html -->
|
|
108
|
+
<html class="coar-theme--myapp">
|
|
109
|
+
<head>
|
|
110
|
+
<link rel="stylesheet" href="@cocoar/vue-ui/styles" />
|
|
111
|
+
<link rel="stylesheet" href="/coar-theme--myapp.css" />
|
|
112
|
+
</head>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Or import in your entry file:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
import '@cocoar/vue-ui/styles';
|
|
119
|
+
import './coar-theme--myapp.css';
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Because themes are classes, you can apply different themes to different subtrees:
|
|
123
|
+
|
|
124
|
+
```html
|
|
125
|
+
<html class="coar-theme--myapp">
|
|
126
|
+
<!-- most of the app uses the custom theme -->
|
|
127
|
+
|
|
128
|
+
<div class="coar-theme--compact">
|
|
129
|
+
<!-- this section uses a separate theme -->
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div class="coar-theme-none">
|
|
133
|
+
<!-- this section always uses library defaults -->
|
|
134
|
+
</div>
|
|
135
|
+
</html>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### `.coar-theme-none`
|
|
139
|
+
|
|
140
|
+
The library ships a built-in reset class. Apply `.coar-theme-none` to any element to restore all themeable tokens to their library defaults inside that subtree, regardless of what theme class is set on an ancestor. Useful for "always default" widgets like admin panels or embedded forms.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
<!-- Generated from apps/docs/foundations/typography.md by apps/docs/scripts/sync-skill.mjs. Do not edit; edit the docs page. -->
|
|
2
|
+
|
|
3
|
+
# Typography
|
|
4
|
+
|
|
5
|
+
Our type system creates clear visual hierarchy and ensures readability across all interfaces. Eleven styles cover everything from large display headings to fine-print footnotes.
|
|
6
|
+
|
|
7
|
+
## Type Scale
|
|
8
|
+
|
|
9
|
+
Each row shows the style rendered at its actual size, with font metadata alongside.
|
|
10
|
+
|
|
11
|
+
**Demo — `typography/demos/TypeScale.vue`**
|
|
12
|
+
|
|
13
|
+
```vue
|
|
14
|
+
<template>
|
|
15
|
+
<div class="type-scale">
|
|
16
|
+
<div v-for="item in typeScale" :key="item.label" class="type-row">
|
|
17
|
+
<div class="type-meta">
|
|
18
|
+
<span class="type-label">{{ item.label }}</span>
|
|
19
|
+
<span class="type-spec">{{ item.spec }}</span>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="type-sample-wrap">
|
|
22
|
+
<p :class="item.class" class="type-sample">{{ item.text }}</p>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<script setup lang="ts">
|
|
29
|
+
const typeScale = [
|
|
30
|
+
{ label: 'Display', class: 'coar-display', text: 'Display', spec: 'Inter / 72px / Bold' },
|
|
31
|
+
{ label: 'Title', class: 'coar-title', text: 'Title', spec: 'Inter / 48px / Bold' },
|
|
32
|
+
{ label: 'Subtitle', class: 'coar-subtitle', text: 'Subtitle', spec: 'Inter / 32px / Regular' },
|
|
33
|
+
{ label: 'Heading', class: 'coar-heading', text: 'Heading', spec: 'Poppins / 24px / SemiBold' },
|
|
34
|
+
{ label: 'Subheading', class: 'coar-subheading', text: 'Subheading', spec: 'Poppins / 20px / Regular' },
|
|
35
|
+
{ label: 'Body', class: 'coar-body', text: 'The quick brown fox jumps over the lazy dog.', spec: 'Poppins / 16px / Regular' },
|
|
36
|
+
{ label: 'Body Bold', class: 'coar-body-bold', text: 'The quick brown fox jumps over the lazy dog.', spec: 'Poppins / 16px / Bold' },
|
|
37
|
+
{ label: 'Body Small', class: 'coar-body-small', text: 'The quick brown fox jumps over the lazy dog.', spec: 'Poppins / 14px / Regular' },
|
|
38
|
+
{ label: 'Body Small Bold', class: 'coar-body-small-bold', text: 'The quick brown fox jumps over the lazy dog.', spec: 'Poppins / 14px / Bold' },
|
|
39
|
+
{ label: 'Caption', class: 'coar-caption', text: 'Caption Text', spec: 'Poppins / 12px / Medium / Uppercase' },
|
|
40
|
+
{ label: 'Footnote', class: 'coar-footnote', text: 'Footnote — Small print and legal copy.', spec: 'Poppins / 10px / Regular' },
|
|
41
|
+
];
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<style scoped>
|
|
45
|
+
.type-scale {
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.type-row {
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
gap: 32px;
|
|
54
|
+
padding: 20px 0;
|
|
55
|
+
border-bottom: 1px solid var(--vp-c-divider);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.type-row:last-child {
|
|
59
|
+
border-bottom: none;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.type-meta {
|
|
63
|
+
flex: 0 0 180px;
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
gap: 4px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.type-label {
|
|
70
|
+
font-size: 13px;
|
|
71
|
+
font-weight: 600;
|
|
72
|
+
color: var(--vp-c-text-1);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.type-spec {
|
|
76
|
+
font-size: 12px;
|
|
77
|
+
color: var(--vp-c-text-3);
|
|
78
|
+
font-family: var(--vp-font-family-mono);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.type-sample-wrap {
|
|
82
|
+
flex: 1;
|
|
83
|
+
min-width: 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.type-sample {
|
|
87
|
+
margin: 0;
|
|
88
|
+
color: var(--vp-c-text-1);
|
|
89
|
+
line-height: 1.5;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@media (max-width: 640px) {
|
|
93
|
+
.type-row {
|
|
94
|
+
flex-direction: column;
|
|
95
|
+
gap: 8px;
|
|
96
|
+
align-items: flex-start;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.type-meta {
|
|
100
|
+
flex: none;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
</style>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Usage Example
|
|
107
|
+
|
|
108
|
+
Typography hierarchy applied to a realistic article layout — caption, title, subtitle, body, and footnote working together.
|
|
109
|
+
|
|
110
|
+
**Demo — `typography/demos/TypographyExample.vue`**
|
|
111
|
+
|
|
112
|
+
```vue
|
|
113
|
+
<template>
|
|
114
|
+
<div class="article-example">
|
|
115
|
+
<span class="coar-caption">DESIGN SYSTEMS · 5 MIN READ</span>
|
|
116
|
+
<h1 class="coar-title article-title">Building Consistent Interfaces</h1>
|
|
117
|
+
<p class="coar-subtitle article-subtitle">
|
|
118
|
+
How a shared type system improves readability and reduces design debt
|
|
119
|
+
</p>
|
|
120
|
+
<div class="article-body">
|
|
121
|
+
<p class="coar-body">
|
|
122
|
+
Typography is the backbone of any design system. A well-defined type scale creates
|
|
123
|
+
clear visual hierarchy, helps users scan content quickly, and ensures readability
|
|
124
|
+
across every screen size and device.
|
|
125
|
+
</p>
|
|
126
|
+
<p class="coar-body">
|
|
127
|
+
<span class="coar-body-bold">Consistency matters.</span> When every heading, label, and
|
|
128
|
+
body paragraph follows the same rules, the interface feels cohesive and professional.
|
|
129
|
+
Users develop intuition for what each level of text means — they stop reading
|
|
130
|
+
and start scanning.
|
|
131
|
+
</p>
|
|
132
|
+
</div>
|
|
133
|
+
<div class="article-footer">
|
|
134
|
+
<span class="coar-footnote">Last updated March 2026</span>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
</template>
|
|
138
|
+
|
|
139
|
+
<style scoped>
|
|
140
|
+
.article-example {
|
|
141
|
+
max-width: 640px;
|
|
142
|
+
padding: 32px;
|
|
143
|
+
border-radius: 12px;
|
|
144
|
+
background: var(--vp-c-bg-soft);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.article-title {
|
|
148
|
+
margin: 12px 0 4px;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.article-subtitle {
|
|
152
|
+
margin: 0 0 24px;
|
|
153
|
+
color: var(--vp-c-text-2);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.article-body {
|
|
157
|
+
display: flex;
|
|
158
|
+
flex-direction: column;
|
|
159
|
+
gap: 16px;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.article-body p {
|
|
163
|
+
margin: 0;
|
|
164
|
+
line-height: 1.7;
|
|
165
|
+
color: var(--vp-c-text-1);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.article-footer {
|
|
169
|
+
margin-top: 24px;
|
|
170
|
+
padding-top: 16px;
|
|
171
|
+
border-top: 1px solid var(--vp-c-divider);
|
|
172
|
+
color: var(--vp-c-text-3);
|
|
173
|
+
}
|
|
174
|
+
</style>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## CSS Classes Reference
|
|
178
|
+
|
|
179
|
+
Apply these utility classes directly to any HTML element.
|
|
180
|
+
|
|
181
|
+
| Class | Role | Font | Size | Weight |
|
|
182
|
+
|---|---|---|---|---|
|
|
183
|
+
| `.coar-display` | Display | Inter | 72 px | Bold |
|
|
184
|
+
| `.coar-title` | Title | Inter | 48 px | Bold |
|
|
185
|
+
| `.coar-subtitle` | Subtitle | Inter | 32 px | Regular |
|
|
186
|
+
| `.coar-heading` | Heading | Poppins | 24 px | SemiBold |
|
|
187
|
+
| `.coar-subheading` | Subheading | Poppins | 20 px | Regular |
|
|
188
|
+
| `.coar-body` | Body | Poppins | 16 px | Regular |
|
|
189
|
+
| `.coar-body-bold` | Body Bold | Poppins | 16 px | Bold |
|
|
190
|
+
| `.coar-body-small` | Body Small | Poppins | 14 px | Regular |
|
|
191
|
+
| `.coar-body-small-bold` | Body Small Bold | Poppins | 14 px | Bold |
|
|
192
|
+
| `.coar-caption` | Caption | Poppins | 12 px | Medium, Uppercase |
|
|
193
|
+
| `.coar-footnote` | Footnote | Poppins | 10 px | Regular |
|
|
194
|
+
|
|
195
|
+
## Usage
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<h1 class="coar-title">Page Title</h1>
|
|
199
|
+
<p class="coar-subtitle">Supporting subtitle text</p>
|
|
200
|
+
<p class="coar-body">Main body content goes here.</p>
|
|
201
|
+
<span class="coar-caption">LABEL TEXT</span>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
> **Tip: Font Loading**
|
|
205
|
+
>
|
|
206
|
+
> The type scale uses **Inter** for display-level text and **Poppins** for body and UI text. Import `@cocoar/vue-ui/fonts` to self-host both fonts — no external CDN required.
|