@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.
Files changed (180) hide show
  1. package/bin/cli.mjs +53 -0
  2. package/dist/components/checkbox/CoarCheckbox.vue.d.ts +1 -1
  3. package/dist/components/checkbox/CoarCheckbox.vue.d.ts.map +1 -1
  4. package/dist/components/code-block/CoarCodeBlock.vue.d.ts +1 -1
  5. package/dist/components/code-block/CoarCodeBlock.vue.d.ts.map +1 -1
  6. package/dist/components/data-list/CoarDataList.vue.d.ts +158 -0
  7. package/dist/components/data-list/CoarDataList.vue.d.ts.map +1 -0
  8. package/dist/components/data-list/CoarDataListToolbar.vue.d.ts +30 -0
  9. package/dist/components/data-list/CoarDataListToolbar.vue.d.ts.map +1 -0
  10. package/dist/components/data-list/data-list-builder.d.ts +288 -0
  11. package/dist/components/data-list/data-list-builder.d.ts.map +1 -0
  12. package/dist/components/data-list/index.d.ts +12 -0
  13. package/dist/components/data-list/index.d.ts.map +1 -0
  14. package/dist/components/data-list/internal/compare.d.ts +14 -0
  15. package/dist/components/data-list/internal/compare.d.ts.map +1 -0
  16. package/dist/components/data-list/internal/reorder-core.d.ts +46 -0
  17. package/dist/components/data-list/internal/reorder-core.d.ts.map +1 -0
  18. package/dist/components/data-list/internal/search.d.ts +16 -0
  19. package/dist/components/data-list/internal/search.d.ts.map +1 -0
  20. package/dist/components/data-list/internal/useDataListLines.d.ts +92 -0
  21. package/dist/components/data-list/internal/useDataListLines.d.ts.map +1 -0
  22. package/dist/components/data-list/internal/useDataListReorder.d.ts +68 -0
  23. package/dist/components/data-list/internal/useDataListReorder.d.ts.map +1 -0
  24. package/dist/components/data-list/internal/useSearchHighlight.d.ts +19 -0
  25. package/dist/components/data-list/internal/useSearchHighlight.d.ts.map +1 -0
  26. package/dist/components/data-list/types.d.ts +185 -0
  27. package/dist/components/data-list/types.d.ts.map +1 -0
  28. package/dist/components/data-list/useDataListModel.d.ts +79 -0
  29. package/dist/components/data-list/useDataListModel.d.ts.map +1 -0
  30. package/dist/components/date-time/_shared/maskito-config.d.ts +7 -2
  31. package/dist/components/date-time/_shared/maskito-config.d.ts.map +1 -1
  32. package/dist/components/date-time/_shared/time-helpers.d.ts +11 -4
  33. package/dist/components/date-time/_shared/time-helpers.d.ts.map +1 -1
  34. package/dist/components/date-time/_shared/use-date-picker-base.d.ts +1 -1
  35. package/dist/components/date-time/plain-date-picker/CoarPlainDatePicker.vue.d.ts +1 -1
  36. package/dist/components/date-time/plain-date-picker/CoarPlainDatePicker.vue.d.ts.map +1 -1
  37. package/dist/components/date-time/plain-date-time-picker/CoarPlainDateTimePicker.vue.d.ts +1 -1
  38. package/dist/components/date-time/plain-date-time-picker/CoarPlainDateTimePicker.vue.d.ts.map +1 -1
  39. package/dist/components/date-time/zoned-date-time-picker/CoarZonedDateTimePicker.vue.d.ts +1 -1
  40. package/dist/components/date-time/zoned-date-time-picker/CoarZonedDateTimePicker.vue.d.ts.map +1 -1
  41. package/dist/components/dual-listbox/CoarDualListbox.vue.d.ts +3 -0
  42. package/dist/components/dual-listbox/CoarDualListbox.vue.d.ts.map +1 -1
  43. package/dist/components/form-field/CoarFormField.vue.d.ts +1 -1
  44. package/dist/components/form-field/CoarFormField.vue.d.ts.map +1 -1
  45. package/dist/components/icon/CoarIcon.vue.d.ts +2 -2
  46. package/dist/components/icon/CoarIcon.vue.d.ts.map +1 -1
  47. package/dist/components/listbox/CoarListbox.vue.d.ts +7 -0
  48. package/dist/components/listbox/CoarListbox.vue.d.ts.map +1 -1
  49. package/dist/components/number-input/CoarNumberInput.vue.d.ts +1 -1
  50. package/dist/components/number-input/CoarNumberInput.vue.d.ts.map +1 -1
  51. package/dist/components/otp-input/CoarOtpInput.vue.d.ts +1 -1
  52. package/dist/components/otp-input/CoarOtpInput.vue.d.ts.map +1 -1
  53. package/dist/components/password-input/CoarPasswordInput.vue.d.ts +1 -1
  54. package/dist/components/password-input/CoarPasswordInput.vue.d.ts.map +1 -1
  55. package/dist/components/switch/CoarSwitch.vue.d.ts +1 -1
  56. package/dist/components/switch/CoarSwitch.vue.d.ts.map +1 -1
  57. package/dist/components/text-input/CoarTextInput.vue.d.ts +1 -1
  58. package/dist/components/text-input/CoarTextInput.vue.d.ts.map +1 -1
  59. package/dist/composables/dragRegistry.d.ts +12 -0
  60. package/dist/composables/dragRegistry.d.ts.map +1 -1
  61. package/dist/composables/index.d.ts +2 -2
  62. package/dist/composables/index.d.ts.map +1 -1
  63. package/dist/composables/useDragDrop.d.ts +62 -6
  64. package/dist/composables/useDragDrop.d.ts.map +1 -1
  65. package/dist/composables/useVirtualList.d.ts +21 -1
  66. package/dist/composables/useVirtualList.d.ts.map +1 -1
  67. package/dist/index.css +1 -1
  68. package/dist/index.d.ts +4 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +4508 -2039
  71. package/package.json +9 -3
  72. package/skills/cocoar-vue-ui/SKILL.md +244 -0
  73. package/skills/cocoar-vue-ui/references/components/avatar.md +178 -0
  74. package/skills/cocoar-vue-ui/references/components/badge.md +290 -0
  75. package/skills/cocoar-vue-ui/references/components/breadcrumb.md +238 -0
  76. package/skills/cocoar-vue-ui/references/components/button.md +252 -0
  77. package/skills/cocoar-vue-ui/references/components/calendar/agenda-view.md +372 -0
  78. package/skills/cocoar-vue-ui/references/components/calendar/coar-calendar.md +1647 -0
  79. package/skills/cocoar-vue-ui/references/components/calendar/day-view.md +361 -0
  80. package/skills/cocoar-vue-ui/references/components/calendar/index.md +312 -0
  81. package/skills/cocoar-vue-ui/references/components/calendar/month-view.md +486 -0
  82. package/skills/cocoar-vue-ui/references/components/calendar/performance.md +186 -0
  83. package/skills/cocoar-vue-ui/references/components/calendar/timeline-view.md +301 -0
  84. package/skills/cocoar-vue-ui/references/components/calendar/week-view.md +382 -0
  85. package/skills/cocoar-vue-ui/references/components/calendar/work-week-view.md +145 -0
  86. package/skills/cocoar-vue-ui/references/components/calendar/year-view.md +63 -0
  87. package/skills/cocoar-vue-ui/references/components/card.md +151 -0
  88. package/skills/cocoar-vue-ui/references/components/checkbox-group.md +103 -0
  89. package/skills/cocoar-vue-ui/references/components/checkbox.md +279 -0
  90. package/skills/cocoar-vue-ui/references/components/code-block.md +241 -0
  91. package/skills/cocoar-vue-ui/references/components/context-menu.md +355 -0
  92. package/skills/cocoar-vue-ui/references/components/data-grid/checkbox.md +213 -0
  93. package/skills/cocoar-vue-ui/references/components/data-grid/date-columns.md +272 -0
  94. package/skills/cocoar-vue-ui/references/components/data-grid/editing.md +236 -0
  95. package/skills/cocoar-vue-ui/references/components/data-grid/multi-select.md +193 -0
  96. package/skills/cocoar-vue-ui/references/components/data-grid/number.md +147 -0
  97. package/skills/cocoar-vue-ui/references/components/data-grid/select.md +202 -0
  98. package/skills/cocoar-vue-ui/references/components/data-grid/text.md +127 -0
  99. package/skills/cocoar-vue-ui/references/components/data-grid.md +1225 -0
  100. package/skills/cocoar-vue-ui/references/components/data-list.md +2121 -0
  101. package/skills/cocoar-vue-ui/references/components/date-or-time-picker.md +200 -0
  102. package/skills/cocoar-vue-ui/references/components/date-picker.md +203 -0
  103. package/skills/cocoar-vue-ui/references/components/date-time-picker.md +154 -0
  104. package/skills/cocoar-vue-ui/references/components/date-views.md +212 -0
  105. package/skills/cocoar-vue-ui/references/components/dialog.md +148 -0
  106. package/skills/cocoar-vue-ui/references/components/divider.md +157 -0
  107. package/skills/cocoar-vue-ui/references/components/document-viewer/annotations.md +400 -0
  108. package/skills/cocoar-vue-ui/references/components/document-viewer/coar-document-viewer.md +327 -0
  109. package/skills/cocoar-vue-ui/references/components/document-viewer/index.md +234 -0
  110. package/skills/cocoar-vue-ui/references/components/document-viewer/toolbar.md +221 -0
  111. package/skills/cocoar-vue-ui/references/components/drag-drop.md +267 -0
  112. package/skills/cocoar-vue-ui/references/components/dual-listbox.md +449 -0
  113. package/skills/cocoar-vue-ui/references/components/file-explorer/asset-store.md +327 -0
  114. package/skills/cocoar-vue-ui/references/components/file-explorer/in-memory-store.md +176 -0
  115. package/skills/cocoar-vue-ui/references/components/file-explorer/index.md +311 -0
  116. package/skills/cocoar-vue-ui/references/components/file-explorer/use-file-explorer.md +300 -0
  117. package/skills/cocoar-vue-ui/references/components/form-field.md +1025 -0
  118. package/skills/cocoar-vue-ui/references/components/fragment-parser.md +298 -0
  119. package/skills/cocoar-vue-ui/references/components/link.md +235 -0
  120. package/skills/cocoar-vue-ui/references/components/listbox.md +575 -0
  121. package/skills/cocoar-vue-ui/references/components/map/editor.md +448 -0
  122. package/skills/cocoar-vue-ui/references/components/map/index.md +351 -0
  123. package/skills/cocoar-vue-ui/references/components/markdown-diagrams.md +210 -0
  124. package/skills/cocoar-vue-ui/references/components/markdown-editor.md +1478 -0
  125. package/skills/cocoar-vue-ui/references/components/markdown-embeds.md +387 -0
  126. package/skills/cocoar-vue-ui/references/components/markdown-form.md +447 -0
  127. package/skills/cocoar-vue-ui/references/components/markdown.md +276 -0
  128. package/skills/cocoar-vue-ui/references/components/menu.md +380 -0
  129. package/skills/cocoar-vue-ui/references/components/mermaid.md +172 -0
  130. package/skills/cocoar-vue-ui/references/components/navbar.md +147 -0
  131. package/skills/cocoar-vue-ui/references/components/note.md +96 -0
  132. package/skills/cocoar-vue-ui/references/components/notice.md +131 -0
  133. package/skills/cocoar-vue-ui/references/components/number-input.md +215 -0
  134. package/skills/cocoar-vue-ui/references/components/otp-input.md +324 -0
  135. package/skills/cocoar-vue-ui/references/components/page-builder/authoring-contract.md +271 -0
  136. package/skills/cocoar-vue-ui/references/components/page-builder/coar-page-builder.md +476 -0
  137. package/skills/cocoar-vue-ui/references/components/page-builder/coar-page-renderer.md +677 -0
  138. package/skills/cocoar-vue-ui/references/components/page-builder/custom-elements.md +441 -0
  139. package/skills/cocoar-vue-ui/references/components/page-builder/idp-integration.md +122 -0
  140. package/skills/cocoar-vue-ui/references/components/page-builder/index.md +573 -0
  141. package/skills/cocoar-vue-ui/references/components/pagination.md +150 -0
  142. package/skills/cocoar-vue-ui/references/components/panel-layout.md +372 -0
  143. package/skills/cocoar-vue-ui/references/components/password-input.md +175 -0
  144. package/skills/cocoar-vue-ui/references/components/popconfirm.md +186 -0
  145. package/skills/cocoar-vue-ui/references/components/popover.md +173 -0
  146. package/skills/cocoar-vue-ui/references/components/progress-bar.md +178 -0
  147. package/skills/cocoar-vue-ui/references/components/radio-group.md +225 -0
  148. package/skills/cocoar-vue-ui/references/components/script-editor.md +1271 -0
  149. package/skills/cocoar-vue-ui/references/components/segmented-control.md +238 -0
  150. package/skills/cocoar-vue-ui/references/components/select.md +463 -0
  151. package/skills/cocoar-vue-ui/references/components/sidebar.md +421 -0
  152. package/skills/cocoar-vue-ui/references/components/spinner.md +132 -0
  153. package/skills/cocoar-vue-ui/references/components/switch.md +195 -0
  154. package/skills/cocoar-vue-ui/references/components/table.md +170 -0
  155. package/skills/cocoar-vue-ui/references/components/tabs.md +382 -0
  156. package/skills/cocoar-vue-ui/references/components/tag.md +178 -0
  157. package/skills/cocoar-vue-ui/references/components/text-input.md +256 -0
  158. package/skills/cocoar-vue-ui/references/components/toast.md +160 -0
  159. package/skills/cocoar-vue-ui/references/components/tooltip.md +121 -0
  160. package/skills/cocoar-vue-ui/references/components/transitions.md +193 -0
  161. package/skills/cocoar-vue-ui/references/components/tree.md +2388 -0
  162. package/skills/cocoar-vue-ui/references/components/virtual-list.md +212 -0
  163. package/skills/cocoar-vue-ui/references/components/wizard.md +251 -0
  164. package/skills/cocoar-vue-ui/references/components/zoned-date-time-picker.md +177 -0
  165. package/skills/cocoar-vue-ui/references/foundations/colors.md +708 -0
  166. package/skills/cocoar-vue-ui/references/foundations/design-principles.md +115 -0
  167. package/skills/cocoar-vue-ui/references/foundations/icons.md +381 -0
  168. package/skills/cocoar-vue-ui/references/foundations/localization/formatting.md +530 -0
  169. package/skills/cocoar-vue-ui/references/foundations/localization/setup.md +86 -0
  170. package/skills/cocoar-vue-ui/references/foundations/localization/timezones.md +182 -0
  171. package/skills/cocoar-vue-ui/references/foundations/localization/translations.md +305 -0
  172. package/skills/cocoar-vue-ui/references/foundations/motion.md +549 -0
  173. package/skills/cocoar-vue-ui/references/foundations/spacing.md +330 -0
  174. package/skills/cocoar-vue-ui/references/foundations/theming.md +140 -0
  175. package/skills/cocoar-vue-ui/references/foundations/typography.md +206 -0
  176. package/skills/cocoar-vue-ui/references/guide/error-handling.md +162 -0
  177. package/skills/cocoar-vue-ui/references/guide/getting-started.md +116 -0
  178. package/skills/cocoar-vue-ui/references/guide/migration-page-builder-3.md +207 -0
  179. package/skills/cocoar-vue-ui/references/guide/migration.md +140 -0
  180. package/skills/cocoar-vue-ui/references/guide/theming.md +98 -0
@@ -0,0 +1,708 @@
1
+ <!-- Generated from apps/docs/foundations/colors.md by apps/docs/scripts/sync-skill.mjs. Do not edit; edit the docs page. -->
2
+
3
+ # Colors
4
+
5
+ Cocoar's color system is built on two layers: **primitives** (the raw palette) and **semantic tokens** (purpose-driven aliases). Semantic tokens adapt to light and dark mode automatically — always use them in your components instead of referencing primitives directly.
6
+
7
+ ## Color Primitives
8
+
9
+ Six scales, ten shades each. These are the building blocks that semantic tokens reference under the hood.
10
+
11
+ **Demo — `colors/demos/ColorPrimitives.vue`**
12
+
13
+ ```vue
14
+ <template>
15
+ <div class="color-primitives">
16
+ <div v-for="palette in palettes" :key="palette.name" class="palette-row">
17
+ <div class="palette-label">
18
+ <span class="palette-name">{{ palette.name }}</span>
19
+ <span class="palette-sub">{{ palette.sub }}</span>
20
+ </div>
21
+ <div class="palette-swatches">
22
+ <div
23
+ v-for="shade in shades"
24
+ :key="shade"
25
+ class="swatch-cell"
26
+ >
27
+ <div
28
+ class="swatch"
29
+ :style="{ backgroundColor: `var(--coar-color-${palette.key}-${shade})` }"
30
+ :title="`--coar-color-${palette.key}-${shade}`"
31
+ />
32
+ <span class="shade-num">{{ shade }}</span>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </template>
38
+
39
+ <script setup lang="ts">
40
+ const shades = ['50', '100', '200', '300', '400', '500', '600', '700', '800', '900'];
41
+
42
+ const palettes = [
43
+ { name: 'Gray', sub: 'Neutral UI', key: 'gray' },
44
+ { name: 'Slate', sub: 'Brand', key: 'slate' },
45
+ { name: 'Accent', sub: 'Themeable', key: 'accent' },
46
+ { name: 'Green', sub: 'Success', key: 'green' },
47
+ { name: 'Red', sub: 'Error', key: 'red' },
48
+ { name: 'Amber', sub: 'Warning', key: 'amber' },
49
+ ];
50
+ </script>
51
+
52
+ <style scoped>
53
+ .color-primitives {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: 20px;
57
+ }
58
+
59
+ .palette-row {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 24px;
63
+ }
64
+
65
+ .palette-label {
66
+ display: flex;
67
+ flex-direction: column;
68
+ min-width: 90px;
69
+ flex-shrink: 0;
70
+ }
71
+
72
+ .palette-name {
73
+ font-size: 14px;
74
+ font-weight: 600;
75
+ color: var(--vp-c-text-1);
76
+ line-height: 1.3;
77
+ }
78
+
79
+ .palette-sub {
80
+ font-size: 11px;
81
+ color: var(--vp-c-text-3);
82
+ line-height: 1.3;
83
+ }
84
+
85
+ .palette-swatches {
86
+ display: flex;
87
+ gap: 6px;
88
+ flex: 1;
89
+ min-width: 0;
90
+ }
91
+
92
+ .swatch-cell {
93
+ display: flex;
94
+ flex-direction: column;
95
+ align-items: center;
96
+ gap: 6px;
97
+ flex: 1;
98
+ min-width: 0;
99
+ }
100
+
101
+ .swatch {
102
+ width: 100%;
103
+ aspect-ratio: 1;
104
+ border-radius: 10px;
105
+ cursor: pointer;
106
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
107
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04);
108
+ }
109
+
110
+ .swatch:hover {
111
+ transform: scale(1.15);
112
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
113
+ z-index: 1;
114
+ position: relative;
115
+ }
116
+
117
+ .shade-num {
118
+ font-size: 10px;
119
+ font-weight: 500;
120
+ color: var(--vp-c-text-3);
121
+ font-variant-numeric: tabular-nums;
122
+ }
123
+
124
+ @media (max-width: 640px) {
125
+ .palette-row {
126
+ flex-direction: column;
127
+ align-items: flex-start;
128
+ gap: 10px;
129
+ }
130
+
131
+ .palette-label {
132
+ flex-direction: row;
133
+ align-items: baseline;
134
+ gap: 8px;
135
+ }
136
+
137
+ .palette-swatches {
138
+ width: 100%;
139
+ }
140
+
141
+ .swatch {
142
+ border-radius: 8px;
143
+ }
144
+ }
145
+ </style>
146
+ ```
147
+
148
+ > **Tip: When to use primitives**
149
+ >
150
+ > Almost never. Use semantic tokens in component code. Primitives are useful only when defining new semantic tokens or building one-off illustrations.
151
+
152
+ ## Semantic Colors
153
+
154
+ Semantic tokens give colors *meaning* — background, text, border, or status — so your UI stays consistent and adapts to theme changes without touching component code.
155
+
156
+ **Demo — `colors/demos/SemanticColors.vue`**
157
+
158
+ ```vue
159
+ <template>
160
+ <div class="semantic-colors">
161
+ <div v-for="group in groups" :key="group.title" class="token-group">
162
+ <div class="group-header">
163
+ <span class="group-icon">{{ group.icon }}</span>
164
+ <h4 class="group-title">{{ group.title }}</h4>
165
+ </div>
166
+ <div class="token-list">
167
+ <div
168
+ v-for="token in group.tokens"
169
+ :key="token.variable"
170
+ class="token-row"
171
+ >
172
+ <div
173
+ class="token-swatch"
174
+ :class="{ 'token-swatch--text': token.type === 'text', 'token-swatch--border': token.type === 'border' }"
175
+ :style="swatchStyle(token)"
176
+ >
177
+ <span v-if="token.type === 'text'" class="text-preview" :style="{ color: `var(${token.variable})` }">Ag</span>
178
+ <span v-if="token.type === 'border'" class="border-preview" :style="{ borderColor: `var(${token.variable})` }"></span>
179
+ </div>
180
+ <div class="token-meta">
181
+ <span class="token-name">{{ token.label }}</span>
182
+ <code class="token-var">{{ token.variable }}</code>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </template>
189
+
190
+ <script setup lang="ts">
191
+ interface Token {
192
+ label: string;
193
+ variable: string;
194
+ type: 'background' | 'text' | 'border';
195
+ }
196
+
197
+ interface TokenGroup {
198
+ title: string;
199
+ icon: string;
200
+ tokens: Token[];
201
+ }
202
+
203
+ function swatchStyle(token: Token) {
204
+ if (token.type === 'background') {
205
+ return { backgroundColor: `var(${token.variable})` };
206
+ }
207
+ return {};
208
+ }
209
+
210
+ const groups: TokenGroup[] = [
211
+ {
212
+ title: 'Backgrounds',
213
+ icon: '\u25A3',
214
+ tokens: [
215
+ { label: 'Neutral Primary', variable: '--coar-background-neutral-primary', type: 'background' },
216
+ { label: 'Neutral Secondary', variable: '--coar-background-neutral-secondary', type: 'background' },
217
+ { label: 'Neutral Tertiary', variable: '--coar-background-neutral-tertiary', type: 'background' },
218
+ { label: 'Accent Primary', variable: '--coar-background-accent-primary', type: 'background' },
219
+ { label: 'Accent Secondary', variable: '--coar-background-accent-secondary', type: 'background' },
220
+ { label: 'Accent Tertiary', variable: '--coar-background-accent-tertiary', type: 'background' },
221
+ { label: 'Accent Hover', variable: '--coar-background-accent-hover', type: 'background' },
222
+ { label: 'Brand Primary', variable: '--coar-background-brand-primary', type: 'background' },
223
+ { label: 'Brand Secondary', variable: '--coar-background-brand-secondary', type: 'background' },
224
+ { label: 'Brand Tertiary', variable: '--coar-background-brand-tertiary', type: 'background' },
225
+ ],
226
+ },
227
+ {
228
+ title: 'Text',
229
+ icon: 'A',
230
+ tokens: [
231
+ { label: 'Neutral Primary', variable: '--coar-text-neutral-primary', type: 'text' },
232
+ { label: 'Neutral Secondary', variable: '--coar-text-neutral-secondary', type: 'text' },
233
+ { label: 'Neutral Tertiary', variable: '--coar-text-neutral-tertiary', type: 'text' },
234
+ { label: 'Neutral Disabled', variable: '--coar-text-neutral-disabled', type: 'text' },
235
+ { label: 'Accent Primary', variable: '--coar-text-accent-primary', type: 'text' },
236
+ { label: 'Accent Secondary', variable: '--coar-text-accent-secondary', type: 'text' },
237
+ { label: 'Brand Primary', variable: '--coar-text-brand-primary', type: 'text' },
238
+ ],
239
+ },
240
+ {
241
+ title: 'Borders',
242
+ icon: '\u25A1',
243
+ tokens: [
244
+ { label: 'Neutral Primary', variable: '--coar-border-neutral-primary', type: 'border' },
245
+ { label: 'Neutral Secondary', variable: '--coar-border-neutral-secondary', type: 'border' },
246
+ { label: 'Neutral Tertiary', variable: '--coar-border-neutral-tertiary', type: 'border' },
247
+ { label: 'Accent Primary', variable: '--coar-border-accent-primary', type: 'border' },
248
+ { label: 'Accent Secondary', variable: '--coar-border-accent-secondary', type: 'border' },
249
+ { label: 'Input', variable: '--coar-border-input', type: 'border' },
250
+ { label: 'Input Hover', variable: '--coar-border-input-hover', type: 'border' },
251
+ ],
252
+ },
253
+ {
254
+ title: 'Status',
255
+ icon: '\u25CF',
256
+ tokens: [
257
+ { label: 'Success Bold', variable: '--coar-background-semantic-success-bold', type: 'background' },
258
+ { label: 'Success Subtle', variable: '--coar-background-semantic-success-subtle', type: 'background' },
259
+ { label: 'Error Bold', variable: '--coar-background-semantic-error-bold', type: 'background' },
260
+ { label: 'Error Subtle', variable: '--coar-background-semantic-error-subtle', type: 'background' },
261
+ { label: 'Warning Bold', variable: '--coar-background-semantic-warning-bold', type: 'background' },
262
+ { label: 'Warning Subtle', variable: '--coar-background-semantic-warning-subtle', type: 'background' },
263
+ { label: 'Info Bold', variable: '--coar-background-semantic-info-bold', type: 'background' },
264
+ { label: 'Info Subtle', variable: '--coar-background-semantic-info-subtle', type: 'background' },
265
+ ],
266
+ },
267
+ ];
268
+ </script>
269
+
270
+ <style scoped>
271
+ .semantic-colors {
272
+ display: flex;
273
+ flex-direction: column;
274
+ gap: 32px;
275
+ }
276
+
277
+ .group-header {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: 8px;
281
+ margin-bottom: 12px;
282
+ }
283
+
284
+ .group-icon {
285
+ font-size: 14px;
286
+ color: var(--vp-c-text-2);
287
+ width: 20px;
288
+ text-align: center;
289
+ }
290
+
291
+ .group-title {
292
+ margin: 0;
293
+ font-size: 15px;
294
+ font-weight: 600;
295
+ color: var(--vp-c-text-1);
296
+ letter-spacing: -0.01em;
297
+ }
298
+
299
+ .token-list {
300
+ display: flex;
301
+ flex-direction: column;
302
+ gap: 2px;
303
+ }
304
+
305
+ .token-row {
306
+ display: flex;
307
+ align-items: center;
308
+ gap: 14px;
309
+ padding: 8px 12px;
310
+ border-radius: 8px;
311
+ transition: background-color 0.15s ease;
312
+ }
313
+
314
+ .token-row:hover {
315
+ background-color: var(--vp-c-bg-soft);
316
+ }
317
+
318
+ /* --- Swatches --- */
319
+
320
+ .token-swatch {
321
+ width: 36px;
322
+ height: 36px;
323
+ border-radius: 8px;
324
+ flex-shrink: 0;
325
+ display: flex;
326
+ align-items: center;
327
+ justify-content: center;
328
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.06);
329
+ }
330
+
331
+ .token-swatch--text {
332
+ background-color: var(--vp-c-bg-soft);
333
+ }
334
+
335
+ .text-preview {
336
+ font-size: 16px;
337
+ font-weight: 700;
338
+ line-height: 1;
339
+ }
340
+
341
+ .token-swatch--border {
342
+ background: transparent;
343
+ box-shadow: none;
344
+ }
345
+
346
+ .border-preview {
347
+ width: 24px;
348
+ height: 24px;
349
+ border-radius: 6px;
350
+ border: 2.5px solid;
351
+ }
352
+
353
+ /* --- Meta --- */
354
+
355
+ .token-meta {
356
+ display: flex;
357
+ flex-direction: column;
358
+ gap: 1px;
359
+ min-width: 0;
360
+ }
361
+
362
+ .token-name {
363
+ font-size: 13px;
364
+ font-weight: 500;
365
+ color: var(--vp-c-text-1);
366
+ line-height: 1.3;
367
+ }
368
+
369
+ .token-var {
370
+ font-size: 11px;
371
+ color: var(--vp-c-text-3) !important;
372
+ background: none !important;
373
+ padding: 0 !important;
374
+ font-family: var(--vp-font-family-mono);
375
+ line-height: 1.3;
376
+ white-space: nowrap;
377
+ overflow: hidden;
378
+ text-overflow: ellipsis;
379
+ }
380
+ </style>
381
+ ```
382
+
383
+ ## Usage Example
384
+
385
+ A realistic card built entirely with semantic tokens. Toggle light/dark mode to see every color adapt.
386
+
387
+ **Demo — `colors/demos/ColorUsageExample.vue`**
388
+
389
+ ```vue
390
+ <template>
391
+ <div class="usage-demo">
392
+ <div class="card-example">
393
+ <div class="card-header">
394
+ <div class="card-avatar">
395
+ <span class="avatar-text">JD</span>
396
+ </div>
397
+ <div class="card-header-text">
398
+ <span class="card-title">John Doe</span>
399
+ <span class="card-subtitle">Senior Designer</span>
400
+ </div>
401
+ </div>
402
+ <p class="card-body">
403
+ This card is built entirely with semantic color tokens. Toggle between light and dark mode to see how every color adapts automatically.
404
+ </p>
405
+ <div class="card-tags">
406
+ <span class="tag tag--accent">Design</span>
407
+ <span class="tag tag--success">Active</span>
408
+ <span class="tag tag--warning">Review</span>
409
+ </div>
410
+ <div class="card-footer">
411
+ <button class="btn-primary">View Profile</button>
412
+ <button class="btn-secondary">Message</button>
413
+ </div>
414
+ </div>
415
+
416
+ <div class="token-annotations">
417
+ <div class="annotation">
418
+ <span class="annotation-dot" style="background: var(--coar-background-neutral-primary)"></span>
419
+ <code>--coar-background-neutral-primary</code>
420
+ <span class="annotation-desc">Card surface</span>
421
+ </div>
422
+ <div class="annotation">
423
+ <span class="annotation-dot" style="background: var(--coar-text-neutral-primary)"></span>
424
+ <code>--coar-text-neutral-primary</code>
425
+ <span class="annotation-desc">Title text</span>
426
+ </div>
427
+ <div class="annotation">
428
+ <span class="annotation-dot" style="background: var(--coar-text-neutral-secondary)"></span>
429
+ <code>--coar-text-neutral-secondary</code>
430
+ <span class="annotation-desc">Body text</span>
431
+ </div>
432
+ <div class="annotation">
433
+ <span class="annotation-dot" style="background: var(--coar-background-accent-primary)"></span>
434
+ <code>--coar-background-accent-primary</code>
435
+ <span class="annotation-desc">Primary button</span>
436
+ </div>
437
+ <div class="annotation">
438
+ <span class="annotation-dot" style="background: var(--coar-border-neutral-tertiary)"></span>
439
+ <code>--coar-border-neutral-tertiary</code>
440
+ <span class="annotation-desc">Card border</span>
441
+ </div>
442
+ </div>
443
+ </div>
444
+ </template>
445
+
446
+ <style scoped>
447
+ .usage-demo {
448
+ display: flex;
449
+ gap: 32px;
450
+ align-items: flex-start;
451
+ }
452
+
453
+ /* --- Example Card --- */
454
+
455
+ .card-example {
456
+ flex: 1;
457
+ min-width: 260px;
458
+ max-width: 360px;
459
+ padding: 24px;
460
+ background: var(--coar-background-neutral-primary);
461
+ border: 1px solid var(--coar-border-neutral-tertiary);
462
+ border-radius: 12px;
463
+ display: flex;
464
+ flex-direction: column;
465
+ gap: 16px;
466
+ }
467
+
468
+ .card-header {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 12px;
472
+ }
473
+
474
+ .card-avatar {
475
+ width: 40px;
476
+ height: 40px;
477
+ border-radius: 10px;
478
+ background: var(--coar-background-accent-primary);
479
+ display: flex;
480
+ align-items: center;
481
+ justify-content: center;
482
+ flex-shrink: 0;
483
+ }
484
+
485
+ .avatar-text {
486
+ font-size: 14px;
487
+ font-weight: 700;
488
+ color: var(--coar-text-on-bold);
489
+ }
490
+
491
+ .card-header-text {
492
+ display: flex;
493
+ flex-direction: column;
494
+ }
495
+
496
+ .card-title {
497
+ font-size: 15px;
498
+ font-weight: 600;
499
+ color: var(--coar-text-neutral-primary);
500
+ line-height: 1.3;
501
+ }
502
+
503
+ .card-subtitle {
504
+ font-size: 12px;
505
+ color: var(--coar-text-neutral-tertiary);
506
+ line-height: 1.3;
507
+ }
508
+
509
+ .card-body {
510
+ font-size: 13px;
511
+ line-height: 1.6;
512
+ color: var(--coar-text-neutral-secondary);
513
+ margin: 0;
514
+ }
515
+
516
+ .card-tags {
517
+ display: flex;
518
+ gap: 6px;
519
+ flex-wrap: wrap;
520
+ }
521
+
522
+ .tag {
523
+ padding: 3px 10px;
524
+ border-radius: 100px;
525
+ font-size: 11px;
526
+ font-weight: 600;
527
+ letter-spacing: 0.01em;
528
+ }
529
+
530
+ .tag--accent {
531
+ background: var(--coar-background-accent-tertiary);
532
+ color: var(--coar-text-accent-primary);
533
+ }
534
+
535
+ .tag--success {
536
+ background: var(--coar-background-semantic-success-subtle);
537
+ color: var(--coar-text-semantic-success-bold);
538
+ }
539
+
540
+ .tag--warning {
541
+ background: var(--coar-background-semantic-warning-subtle);
542
+ color: var(--coar-text-semantic-warning-bold);
543
+ }
544
+
545
+ .card-footer {
546
+ display: flex;
547
+ gap: 8px;
548
+ padding-top: 4px;
549
+ }
550
+
551
+ .btn-primary {
552
+ padding: 8px 16px;
553
+ border-radius: 8px;
554
+ border: none;
555
+ background: var(--coar-background-accent-primary);
556
+ color: var(--coar-text-on-bold);
557
+ font-size: 13px;
558
+ font-weight: 600;
559
+ cursor: pointer;
560
+ transition: background-color 0.15s ease;
561
+ }
562
+
563
+ .btn-primary:hover {
564
+ background: var(--coar-background-accent-hover);
565
+ }
566
+
567
+ .btn-secondary {
568
+ padding: 8px 16px;
569
+ border-radius: 8px;
570
+ border: 1px solid var(--coar-border-neutral-tertiary);
571
+ background: transparent;
572
+ color: var(--coar-text-neutral-primary);
573
+ font-size: 13px;
574
+ font-weight: 500;
575
+ cursor: pointer;
576
+ transition: background-color 0.15s ease;
577
+ }
578
+
579
+ .btn-secondary:hover {
580
+ background: var(--coar-background-neutral-tertiary);
581
+ }
582
+
583
+ /* --- Annotations --- */
584
+
585
+ .token-annotations {
586
+ display: flex;
587
+ flex-direction: column;
588
+ gap: 10px;
589
+ flex: 1;
590
+ min-width: 0;
591
+ }
592
+
593
+ .annotation {
594
+ display: flex;
595
+ align-items: center;
596
+ gap: 10px;
597
+ padding: 6px 0;
598
+ }
599
+
600
+ .annotation-dot {
601
+ width: 14px;
602
+ height: 14px;
603
+ border-radius: 4px;
604
+ flex-shrink: 0;
605
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
606
+ }
607
+
608
+ .annotation code {
609
+ font-size: 11px;
610
+ font-family: var(--vp-font-family-mono);
611
+ color: var(--vp-c-text-2) !important;
612
+ background: none !important;
613
+ padding: 0 !important;
614
+ white-space: nowrap;
615
+ }
616
+
617
+ .annotation-desc {
618
+ font-size: 12px;
619
+ color: var(--vp-c-text-3);
620
+ margin-left: auto;
621
+ white-space: nowrap;
622
+ }
623
+
624
+ @media (max-width: 640px) {
625
+ .usage-demo {
626
+ flex-direction: column;
627
+ }
628
+
629
+ .card-example {
630
+ max-width: 100%;
631
+ }
632
+ }
633
+ </style>
634
+ ```
635
+
636
+ ## Token Naming Convention
637
+
638
+ All tokens follow a predictable pattern:
639
+
640
+ ```
641
+ --coar-{usage}-{category}-{variant}
642
+ ```
643
+
644
+ | Segment | Values | Examples |
645
+ |---------|--------|----------|
646
+ | **Usage** | `background`, `text`, `border`, `icon` | What the color is applied to |
647
+ | **Category** | `neutral`, `brand`, `accent`, `semantic-{status}` | The color family |
648
+ | **Variant** | `primary`, `secondary`, `tertiary`, `bold`, `subtle`, `hover`, `active`, `disabled` | Emphasis level or state |
649
+
650
+ ## Token Reference
651
+
652
+ ### Background
653
+
654
+ | Token | Usage |
655
+ |-------|-------|
656
+ | `--coar-background-neutral-primary` | Default page / card surface |
657
+ | `--coar-background-neutral-secondary` | Slightly raised surface |
658
+ | `--coar-background-neutral-tertiary` | Subtle fill for inputs, hover states |
659
+ | `--coar-background-accent-primary` | Primary accent (buttons, active states) |
660
+ | `--coar-background-accent-secondary` | Lighter accent fill |
661
+ | `--coar-background-accent-tertiary` | Subtlest accent fill |
662
+ | `--coar-background-accent-hover` | Accent hover state |
663
+ | `--coar-background-accent-active` | Accent pressed state |
664
+ | `--coar-background-brand-primary` | Brand-colored surface |
665
+ | `--coar-background-brand-secondary` | Lighter brand surface |
666
+ | `--coar-background-brand-tertiary` | Subtlest brand surface |
667
+
668
+ ### Text
669
+
670
+ | Token | Usage |
671
+ |-------|-------|
672
+ | `--coar-text-neutral-primary` | Primary body text |
673
+ | `--coar-text-neutral-secondary` | Supporting / secondary text |
674
+ | `--coar-text-neutral-tertiary` | Placeholder, hint text |
675
+ | `--coar-text-neutral-disabled` | Disabled text |
676
+ | `--coar-text-accent-primary` | Accent-colored text (links, highlights) |
677
+ | `--coar-text-accent-secondary` | Lighter accent text |
678
+ | `--coar-text-brand-primary` | Brand-colored text |
679
+ | `--coar-text-on-bold` | White text on bold / colored surfaces |
680
+
681
+ ### Border
682
+
683
+ | Token | Usage |
684
+ |-------|-------|
685
+ | `--coar-border-neutral-primary` | Strong border (emphasis) |
686
+ | `--coar-border-neutral-secondary` | Default visible border |
687
+ | `--coar-border-neutral-tertiary` | Subtle divider |
688
+ | `--coar-border-accent-primary` | Accent border (focus rings) |
689
+ | `--coar-border-accent-secondary` | Lighter accent border |
690
+ | `--coar-border-input` | Input field border |
691
+ | `--coar-border-input-hover` | Input border on hover |
692
+
693
+ ### Status
694
+
695
+ | Token | Usage |
696
+ |-------|-------|
697
+ | `--coar-background-semantic-success-bold` | Success background (solid) |
698
+ | `--coar-background-semantic-success-subtle` | Success background (light) |
699
+ | `--coar-background-semantic-error-bold` | Error background (solid) |
700
+ | `--coar-background-semantic-error-subtle` | Error background (light) |
701
+ | `--coar-background-semantic-warning-bold` | Warning background (solid) |
702
+ | `--coar-background-semantic-warning-subtle` | Warning background (light) |
703
+ | `--coar-background-semantic-info-bold` | Info background (solid) |
704
+ | `--coar-background-semantic-info-subtle` | Info background (light) |
705
+ | `--coar-text-semantic-success-bold` | Success text (strong) |
706
+ | `--coar-text-semantic-error-bold` | Error text (strong) |
707
+ | `--coar-text-semantic-warning-bold` | Warning text (strong) |
708
+ | `--coar-text-semantic-info-bold` | Info text (strong) |