classcard-ui 0.2.1475 → 0.2.1476

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 (209) hide show
  1. package/README.md +24 -24
  2. package/dist/classcard-ui.common.js +86 -85
  3. package/dist/classcard-ui.common.js.map +1 -1
  4. package/dist/classcard-ui.css +1 -1
  5. package/dist/classcard-ui.umd.js +86 -85
  6. package/dist/classcard-ui.umd.js.map +1 -1
  7. package/dist/classcard-ui.umd.min.js +1 -1
  8. package/dist/classcard-ui.umd.min.js.map +1 -1
  9. package/package.json +83 -83
  10. package/src/App.vue +16 -16
  11. package/src/colorConfig.js +52 -52
  12. package/src/components/CAlertModal/CAlertModal.vue +179 -179
  13. package/src/components/CAlertModal/index.js +3 -3
  14. package/src/components/CAlerts/CAlerts.vue +114 -114
  15. package/src/components/CAlerts/index.js +2 -2
  16. package/src/components/CAnchorTabs/CAnchorTabs.vue +100 -100
  17. package/src/components/CAnchorTabs/index.js +2 -2
  18. package/src/components/CAnchorTag/CAnchorTag.vue +84 -84
  19. package/src/components/CAnchorTag/index.js +2 -2
  20. package/src/components/CAvatar/CAvatar.vue +230 -230
  21. package/src/components/CAvatar/index.js +2 -2
  22. package/src/components/CAvatarGroup/CAvatarGroup.vue +213 -213
  23. package/src/components/CAvatarGroup/index.js +2 -2
  24. package/src/components/CBasicTable/CBasicTable.vue +184 -184
  25. package/src/components/CBasicTable/index.js +2 -2
  26. package/src/components/CBreadcrumbs/CBreadcrumbs.vue +38 -38
  27. package/src/components/CBreadcrumbs/index.js +2 -2
  28. package/src/components/CButton/CButton.vue +239 -239
  29. package/src/components/CButton/index.js +2 -2
  30. package/src/components/CButtonGroup/CButtonGroup.vue +155 -155
  31. package/src/components/CButtonGroup/index.js +2 -2
  32. package/src/components/CButtonIcon/CButtonIcon.vue +166 -166
  33. package/src/components/CButtonIcon/index.js +2 -2
  34. package/src/components/CButtonLink/CButtonLink.vue +43 -43
  35. package/src/components/CButtonLink/index.js +2 -2
  36. package/src/components/CButtonSelect/CButtonSelect.vue +186 -186
  37. package/src/components/CButtonSelect/index.js +2 -2
  38. package/src/components/CButtonSelectBorder/CButtonSelectBorder.vue +265 -265
  39. package/src/components/CButtonSelectBorder/index.js +3 -3
  40. package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +152 -152
  41. package/src/components/CButtonWithDropdown/index.js +2 -2
  42. package/src/components/CCalendar/CCalendar.vue +443 -443
  43. package/src/components/CCalendar/index.js +3 -3
  44. package/src/components/CCard/CCard.vue +53 -53
  45. package/src/components/CCard/index.js +2 -2
  46. package/src/components/CCheckbox/CCheckbox.vue +200 -200
  47. package/src/components/CCheckbox/index.js +2 -2
  48. package/src/components/CCircularButton/CCircularButton.vue +57 -57
  49. package/src/components/CCircularButton/index.js +2 -2
  50. package/src/components/CCollapsibleSection/CCollapsibleSection.vue +121 -121
  51. package/src/components/CCollapsibleSection/index.js +2 -2
  52. package/src/components/CColorDots/CColorDots.vue +52 -52
  53. package/src/components/CColorDots/index.js +3 -3
  54. package/src/components/CConfirmActionModal/CConfirmActionModal.vue +221 -221
  55. package/src/components/CConfirmActionModal/index.js +3 -3
  56. package/src/components/CDatepicker/CDatepicker.vue +235 -235
  57. package/src/components/CDatepicker/index.js +2 -2
  58. package/src/components/CDualSelect/CDualSelect.vue +193 -193
  59. package/src/components/CDualSelect/index.js +2 -2
  60. package/src/components/CEditor/CEditor.vue +114 -114
  61. package/src/components/CEditor/index.js +2 -2
  62. package/src/components/CFormSectionHeading/CFormSectionHeading.vue +76 -76
  63. package/src/components/CFormSectionHeading/index.js +2 -2
  64. package/src/components/CGroupedFilterDropdown/CGroupedFilterDropdown.vue +263 -263
  65. package/src/components/CGroupedFilterDropdown/index.js +2 -2
  66. package/src/components/CGroupedSelect/CGroupedSelect.vue +366 -366
  67. package/src/components/CGroupedSelect/index.js +3 -3
  68. package/src/components/CIcon/CIcon.vue +112 -112
  69. package/src/components/CIcon/index.js +2 -2
  70. package/src/components/CIconDropdown/CIconDropdown.vue +206 -206
  71. package/src/components/CIconDropdown/index.js +2 -2
  72. package/src/components/CIconSelect/CIconSelect.vue +182 -182
  73. package/src/components/CIconSelect/index.js +3 -3
  74. package/src/components/CInput/CInput.vue +173 -173
  75. package/src/components/CInput/index.js +2 -2
  76. package/src/components/CInputAddon/CInputAddon.vue +297 -297
  77. package/src/components/CInputAddon/index.js +2 -2
  78. package/src/components/CInputEmail/CInputEmail.vue +107 -107
  79. package/src/components/CInputEmail/index.js +2 -2
  80. package/src/components/CInsetTabs/CInsetTabs.vue +134 -134
  81. package/src/components/CInsetTabs/index.js +3 -3
  82. package/src/components/CModalHeading/CModalHeading.vue +22 -22
  83. package/src/components/CModalHeading/index.js +2 -2
  84. package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +88 -88
  85. package/src/components/CModuleHelpLinks/index.js +3 -3
  86. package/src/components/CMultiselect/CMultiselect.vue +1170 -1170
  87. package/src/components/CMultiselect/index.js +2 -2
  88. package/src/components/CMultiselectr/CMultiselectr.vue +44 -44
  89. package/src/components/CMultiselectr/index.js +2 -2
  90. package/src/components/CPageHeading/CPageHeading.vue +83 -83
  91. package/src/components/CPageHeading/index.js +2 -2
  92. package/src/components/CPagination/CPagination.vue +239 -239
  93. package/src/components/CPagination/index.js +2 -2
  94. package/src/components/CPhoneNumber/CPhoneNumber.vue +213 -213
  95. package/src/components/CPhoneNumber/index.js +2 -2
  96. package/src/components/CProgress/CProgress.vue +91 -91
  97. package/src/components/CProgress/index.js +2 -2
  98. package/src/components/CRadio/CRadio.vue +197 -197
  99. package/src/components/CRadio/index.js +2 -2
  100. package/src/components/CRadioGroup/CRadioGroup.vue +96 -96
  101. package/src/components/CRadioGroup/index.js +2 -2
  102. package/src/components/CRangeSlider/CRangeSlider.vue +55 -55
  103. package/src/components/CRangeSlider/index.js +2 -2
  104. package/src/components/CReorderableStackedList/CReorderableStackedList.vue +94 -94
  105. package/src/components/CReorderableStackedList/index.js +2 -2
  106. package/src/components/CSelect/CSelect.vue +1210 -1210
  107. package/src/components/CSelect/index.js +2 -2
  108. package/src/components/CSmallTimeline/CSmallTimeline.vue +40 -40
  109. package/src/components/CSmallTimeline/index.js +2 -2
  110. package/src/components/CStackedList/CStackedList.vue +162 -162
  111. package/src/components/CStackedList/index.js +2 -2
  112. package/src/components/CStats/CStats.vue +157 -157
  113. package/src/components/CStats/index.js +2 -2
  114. package/src/components/CSwitch/CSwitch.vue +200 -200
  115. package/src/components/CSwitch/index.js +2 -2
  116. package/src/components/CTabLazy/CTabLazy.vue +83 -83
  117. package/src/components/CTabLazy/index.js +2 -2
  118. package/src/components/CTable/CTable.vue +1114 -1114
  119. package/src/components/CTable/index.js +2 -2
  120. package/src/components/CTabs/CTabs.vue +250 -250
  121. package/src/components/CTabs/index.js +2 -2
  122. package/src/components/CTag/CTag.vue +109 -109
  123. package/src/components/CTag/index.js +2 -2
  124. package/src/components/CTextarea/CTextarea.vue +118 -118
  125. package/src/components/CTextarea/index.js +2 -2
  126. package/src/components/CTimeline/CTimeline.vue +237 -237
  127. package/src/components/CTimeline/index.js +2 -2
  128. package/src/components/CToolTip/CToolTip.vue +108 -108
  129. package/src/components/CToolTip/index.js +3 -3
  130. package/src/components/CUpload/CUpload.vue +331 -331
  131. package/src/components/CUpload/index.js +2 -2
  132. package/src/components/NumberAnimator.vue +112 -112
  133. package/src/components/index.js +57 -57
  134. package/src/helper.js +8 -8
  135. package/src/icons.js +831 -830
  136. package/src/main.js +22 -22
  137. package/src/stories/CAlertModal.stories.js +30 -30
  138. package/src/stories/CAlerts.stories.js +39 -39
  139. package/src/stories/CAnchorTabs.stories.js +29 -29
  140. package/src/stories/CAnchorTag.stories.js +38 -38
  141. package/src/stories/CAvatar.stories.js +38 -38
  142. package/src/stories/CAvatarGroup.stories.js +136 -136
  143. package/src/stories/CBasicTable.stories.js +316 -316
  144. package/src/stories/CBreadcrumbs.stories.js +24 -24
  145. package/src/stories/CButton.stories.js +49 -49
  146. package/src/stories/CButtonGroup.stories.js +43 -43
  147. package/src/stories/CButtonIcon.stories.js +27 -27
  148. package/src/stories/CButtonLink.stories.js +24 -24
  149. package/src/stories/CButtonSelect.stories.js +44 -44
  150. package/src/stories/CButtonSelectBorder.stories.js +56 -56
  151. package/src/stories/CButtonWithDropdown.stories.js +41 -41
  152. package/src/stories/CCalendar.stories.js +16 -16
  153. package/src/stories/CCard.stories.js +30 -30
  154. package/src/stories/CCheckbox.stories.js +38 -38
  155. package/src/stories/CCircularButton.stories.js +29 -29
  156. package/src/stories/CCollapsibleSection.stories.js +29 -29
  157. package/src/stories/CColorDots.stories.js +37 -37
  158. package/src/stories/CConfirmActionModal.stories.js +60 -60
  159. package/src/stories/CDatepicker.stories.js +31 -31
  160. package/src/stories/CDualSelect.stories.js +29 -29
  161. package/src/stories/CEditor.stories.js +30 -30
  162. package/src/stories/CFormSectionHeading.stories.js +37 -37
  163. package/src/stories/CGroupedFilterDropdown.stories.js +176 -176
  164. package/src/stories/CGroupedSelect.stories.js +103 -103
  165. package/src/stories/CIcon.stories.js +31 -31
  166. package/src/stories/CIconDropdown.stories.js +52 -52
  167. package/src/stories/CIconSelect.stories.js +45 -45
  168. package/src/stories/CInput.stories.js +36 -36
  169. package/src/stories/CInputAddon.stories.js +37 -37
  170. package/src/stories/CInputEmail.stories.js +27 -27
  171. package/src/stories/CInsetTabs.stories.js +48 -48
  172. package/src/stories/CModalHeading.stories.js +25 -25
  173. package/src/stories/CModuleHelpLinks.stories.js +25 -25
  174. package/src/stories/CMultiselect.stories.js +136 -136
  175. package/src/stories/CMultiselectr.stories.js +23 -23
  176. package/src/stories/CPageHeading.stories.js +32 -32
  177. package/src/stories/CPagination.stories.js +30 -30
  178. package/src/stories/CPhoneNumber.stories.js +37 -37
  179. package/src/stories/CProgress.stories.js +23 -23
  180. package/src/stories/CRadio.stories.js +44 -44
  181. package/src/stories/CRadioGroup.stories.js +51 -51
  182. package/src/stories/CRangeSlider.stories.js +23 -23
  183. package/src/stories/CReorderableStackedList.stories.js +23 -23
  184. package/src/stories/CSelect.stories.js +157 -157
  185. package/src/stories/CSmallTimeline.stories.js +26 -26
  186. package/src/stories/CStackedList.stories.js +37 -37
  187. package/src/stories/CStats.stories.js +53 -53
  188. package/src/stories/CSwitch.stories.js +28 -28
  189. package/src/stories/CTabLazy.stories.js +42 -42
  190. package/src/stories/CTable.stories.js +203 -203
  191. package/src/stories/CTabs.stories.js +36 -36
  192. package/src/stories/CTag.stories.js +37 -37
  193. package/src/stories/CTextarea.stories.js +32 -32
  194. package/src/stories/CTimeline.stories.js +26 -26
  195. package/src/stories/CToolTip.stories.js +27 -27
  196. package/src/stories/CUpload.stories.js +36 -36
  197. package/src/stories/Introduction.stories.mdx +207 -207
  198. package/src/stories/Page.vue +88 -88
  199. package/src/stories/assets/code-brackets.svg +0 -0
  200. package/src/stories/assets/colors.svg +0 -0
  201. package/src/stories/assets/comments.svg +0 -0
  202. package/src/stories/assets/direction.svg +0 -0
  203. package/src/stories/assets/flow.svg +0 -0
  204. package/src/stories/assets/plugin.svg +0 -0
  205. package/src/stories/assets/repo.svg +0 -0
  206. package/src/stories/assets/stackalt.svg +0 -0
  207. package/src/stories/header.css +26 -26
  208. package/src/stories/page.css +69 -69
  209. package/src/stories/utils.css +32 -32
@@ -1,197 +1,197 @@
1
- <template>
2
- <div>
3
- <div class="-space-y-px rounded-md bg-white" :class="customWrapperClasses">
4
- <div
5
- v-for="(item, index) in items"
6
- :class="`relative ${
7
- index != items.length - 1
8
- ? useIncreasedPadding
9
- ? 'pb-6'
10
- : 'pb-4'
11
- : ''
12
- } ${
13
- customClasses ? classes(item, index) : ''
14
- } first:rounded-t-md last:rounded-b-md`"
15
- v-bind:key="item[labelName]"
16
- >
17
- <div class="flex items-start">
18
- <input
19
- type="radio"
20
- :value="item.value"
21
- :name="name"
22
- :id="id"
23
- v-model="selectedItem"
24
- @click="onChange(item.value)"
25
- class="radio-state mt-0.5 h-4 w-4 cursor-pointer disabled:opacity-50"
26
- :disabled="isDisabled"
27
- :style="colorStyles"
28
- />
29
- <div
30
- :class="`ml-3 flex cursor-pointer flex-col ${
31
- isDisabled ? 'opacity-60' : ''
32
- }`"
33
- :id="id"
34
- @click="onChange(item.value)"
35
- >
36
- <div class="flex items-center gap-2">
37
- <p
38
- class="text-sm font-medium text-gray-900"
39
- :class="
40
- customClasses && item.value === selectedItem
41
- ? 'text-indigo-900'
42
- : ''
43
- "
44
- >
45
- {{ item[labelName] }}
46
- </p>
47
- <c-tag
48
- v-if="item.tag"
49
- :label="item.tagLabel"
50
- :color="item.tagColor"
51
- ></c-tag>
52
- </div>
53
- <p
54
- class="block text-sm"
55
- :class="
56
- customClasses && item.value === selectedItem
57
- ? 'text-indigo-700'
58
- : 'text-gray-500'
59
- "
60
- >
61
- {{ item.description }}
62
- </p>
63
- </div>
64
- </div>
65
- <slot v-if="item.value === selectedItem" :name="item.value" />
66
- </div>
67
- <div
68
- v-if="showClearSelection"
69
- class="cursor-pointer pt-4 text-sm text-gray-400 hover:text-gray-700 hover:underline"
70
- @click="clearSelection"
71
- >
72
- Clear selection
73
- </div>
74
- </div>
75
- </div>
76
- </template>
77
-
78
- <script>
79
- import CTag from "../CTag/CTag.vue";
80
- import { COLOR_CONFIG } from "../../colorConfig";
81
-
82
- export default {
83
- name: "CRadio",
84
- components: { CTag },
85
- props: {
86
- id: {
87
- type: String,
88
- },
89
- items: {
90
- type: Array,
91
- required: true,
92
- },
93
- selectedOption: {
94
- type: [String, Number, Boolean],
95
- },
96
- isDisabled: {
97
- type: Boolean,
98
- },
99
- customClasses: {
100
- type: Boolean,
101
- default: false,
102
- },
103
- customWrapperClasses: {
104
- type: String,
105
- },
106
- name: {
107
- type: String,
108
- required: true,
109
- },
110
- labelName: {
111
- type: String,
112
- default: "label",
113
- },
114
- showClearSelection: {
115
- type: Boolean,
116
- default: false,
117
- },
118
- useIncreasedPadding: {
119
- type: Boolean,
120
- default: false,
121
- },
122
- preferredColor: {
123
- type: String,
124
- default: "indigo",
125
- },
126
- },
127
- data() {
128
- return {
129
- selectedItem: this.selectedOption,
130
- };
131
- },
132
- methods: {
133
- clearSelection() {
134
- this.$emit("onChange", null);
135
- this.selectedItem = null;
136
- },
137
- onChange(selectedValue) {
138
- if (!this.isDisabled) {
139
- this.$emit("onChange", selectedValue);
140
- this.selectedItem = selectedValue;
141
- }
142
- },
143
- classes(item, index) {
144
- let classForRadio = "";
145
- if (item.value === this.selectedItem && index === 0) {
146
- classForRadio =
147
- "border p-4 border-indigo-200 rounded-t-md bg-indigo-50";
148
- } else if (
149
- item.value === this.selectedItem &&
150
- index === this.items.length - 1
151
- ) {
152
- classForRadio =
153
- "border p-4 border-indigo-200 rounded-b-md bg-indigo-50";
154
- } else if (
155
- item.value === this.selectedItem &&
156
- 0 < index < this.items.length - 1
157
- ) {
158
- classForRadio = "border p-4 border-indigo-200 bg-indigo-50";
159
- } else {
160
- classForRadio = "border p-4 border-gray-200";
161
- }
162
-
163
- return classForRadio;
164
- },
165
- },
166
- computed: {
167
- colorStyles() {
168
- const colors = COLOR_CONFIG[this.preferredColor] || COLOR_CONFIG.indigo;
169
- return {
170
- "--radio-enabled-color": colors.shade600,
171
- "--radio-focus-color": colors.shade500,
172
- };
173
- },
174
- },
175
- watch: {
176
- selectedOption() {
177
- this.selectedItem = this.selectedOption;
178
- },
179
- },
180
- };
181
- </script>
182
-
183
- <style scoped>
184
- /* Unselected state: gray border */
185
- .radio-state {
186
- border-color: #d1d5db !important;
187
- }
188
- /* Selected state: use theme color for fill and border */
189
- .radio-state:checked {
190
- color: var(--radio-enabled-color) !important;
191
- border-color: var(--radio-enabled-color) !important;
192
- }
193
- .radio-state:focus {
194
- outline: none;
195
- box-shadow: 0 0 0 2px white, 0 0 0 4px var(--radio-focus-color) !important;
196
- }
197
- </style>
1
+ <template>
2
+ <div>
3
+ <div class="-space-y-px rounded-md bg-white" :class="customWrapperClasses">
4
+ <div
5
+ v-for="(item, index) in items"
6
+ :class="`relative ${
7
+ index != items.length - 1
8
+ ? useIncreasedPadding
9
+ ? 'pb-6'
10
+ : 'pb-4'
11
+ : ''
12
+ } ${
13
+ customClasses ? classes(item, index) : ''
14
+ } first:rounded-t-md last:rounded-b-md`"
15
+ v-bind:key="item[labelName]"
16
+ >
17
+ <div class="flex items-start">
18
+ <input
19
+ type="radio"
20
+ :value="item.value"
21
+ :name="name"
22
+ :id="id"
23
+ v-model="selectedItem"
24
+ @click="onChange(item.value)"
25
+ class="radio-state mt-0.5 h-4 w-4 cursor-pointer disabled:opacity-50"
26
+ :disabled="isDisabled"
27
+ :style="colorStyles"
28
+ />
29
+ <div
30
+ :class="`ml-3 flex cursor-pointer flex-col ${
31
+ isDisabled ? 'opacity-60' : ''
32
+ }`"
33
+ :id="id"
34
+ @click="onChange(item.value)"
35
+ >
36
+ <div class="flex items-center gap-2">
37
+ <p
38
+ class="text-sm font-medium text-gray-900"
39
+ :class="
40
+ customClasses && item.value === selectedItem
41
+ ? 'text-indigo-900'
42
+ : ''
43
+ "
44
+ >
45
+ {{ item[labelName] }}
46
+ </p>
47
+ <c-tag
48
+ v-if="item.tag"
49
+ :label="item.tagLabel"
50
+ :color="item.tagColor"
51
+ ></c-tag>
52
+ </div>
53
+ <p
54
+ class="block text-sm"
55
+ :class="
56
+ customClasses && item.value === selectedItem
57
+ ? 'text-indigo-700'
58
+ : 'text-gray-500'
59
+ "
60
+ >
61
+ {{ item.description }}
62
+ </p>
63
+ </div>
64
+ </div>
65
+ <slot v-if="item.value === selectedItem" :name="item.value" />
66
+ </div>
67
+ <div
68
+ v-if="showClearSelection"
69
+ class="cursor-pointer pt-4 text-sm text-gray-400 hover:text-gray-700 hover:underline"
70
+ @click="clearSelection"
71
+ >
72
+ Clear selection
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </template>
77
+
78
+ <script>
79
+ import CTag from "../CTag/CTag.vue";
80
+ import { COLOR_CONFIG } from "../../colorConfig";
81
+
82
+ export default {
83
+ name: "CRadio",
84
+ components: { CTag },
85
+ props: {
86
+ id: {
87
+ type: String,
88
+ },
89
+ items: {
90
+ type: Array,
91
+ required: true,
92
+ },
93
+ selectedOption: {
94
+ type: [String, Number, Boolean],
95
+ },
96
+ isDisabled: {
97
+ type: Boolean,
98
+ },
99
+ customClasses: {
100
+ type: Boolean,
101
+ default: false,
102
+ },
103
+ customWrapperClasses: {
104
+ type: String,
105
+ },
106
+ name: {
107
+ type: String,
108
+ required: true,
109
+ },
110
+ labelName: {
111
+ type: String,
112
+ default: "label",
113
+ },
114
+ showClearSelection: {
115
+ type: Boolean,
116
+ default: false,
117
+ },
118
+ useIncreasedPadding: {
119
+ type: Boolean,
120
+ default: false,
121
+ },
122
+ preferredColor: {
123
+ type: String,
124
+ default: "indigo",
125
+ },
126
+ },
127
+ data() {
128
+ return {
129
+ selectedItem: this.selectedOption,
130
+ };
131
+ },
132
+ methods: {
133
+ clearSelection() {
134
+ this.$emit("onChange", null);
135
+ this.selectedItem = null;
136
+ },
137
+ onChange(selectedValue) {
138
+ if (!this.isDisabled) {
139
+ this.$emit("onChange", selectedValue);
140
+ this.selectedItem = selectedValue;
141
+ }
142
+ },
143
+ classes(item, index) {
144
+ let classForRadio = "";
145
+ if (item.value === this.selectedItem && index === 0) {
146
+ classForRadio =
147
+ "border p-4 border-indigo-200 rounded-t-md bg-indigo-50";
148
+ } else if (
149
+ item.value === this.selectedItem &&
150
+ index === this.items.length - 1
151
+ ) {
152
+ classForRadio =
153
+ "border p-4 border-indigo-200 rounded-b-md bg-indigo-50";
154
+ } else if (
155
+ item.value === this.selectedItem &&
156
+ 0 < index < this.items.length - 1
157
+ ) {
158
+ classForRadio = "border p-4 border-indigo-200 bg-indigo-50";
159
+ } else {
160
+ classForRadio = "border p-4 border-gray-200";
161
+ }
162
+
163
+ return classForRadio;
164
+ },
165
+ },
166
+ computed: {
167
+ colorStyles() {
168
+ const colors = COLOR_CONFIG[this.preferredColor] || COLOR_CONFIG.indigo;
169
+ return {
170
+ "--radio-enabled-color": colors.shade600,
171
+ "--radio-focus-color": colors.shade500,
172
+ };
173
+ },
174
+ },
175
+ watch: {
176
+ selectedOption() {
177
+ this.selectedItem = this.selectedOption;
178
+ },
179
+ },
180
+ };
181
+ </script>
182
+
183
+ <style scoped>
184
+ /* Unselected state: gray border */
185
+ .radio-state {
186
+ border-color: #d1d5db !important;
187
+ }
188
+ /* Selected state: use theme color for fill and border */
189
+ .radio-state:checked {
190
+ color: var(--radio-enabled-color) !important;
191
+ border-color: var(--radio-enabled-color) !important;
192
+ }
193
+ .radio-state:focus {
194
+ outline: none;
195
+ box-shadow: 0 0 0 2px white, 0 0 0 4px var(--radio-focus-color) !important;
196
+ }
197
+ </style>
@@ -1,3 +1,3 @@
1
- import CRadio from './CRadio.vue'
2
-
1
+ import CRadio from './CRadio.vue'
2
+
3
3
  export default CRadio
@@ -1,97 +1,97 @@
1
- <template>
2
- <fieldset :aria-label="ariaLabel">
3
- <div class="flex flex-col gap-4">
4
- <label
5
- v-for="option in options"
6
- :key="option.id"
7
- :aria-label="option.name"
8
- class="group relative px-5 py-4 flex items-center gap-2.5 rounded-md cursor-pointer border"
9
- :class="
10
- selectedOptionId === option.id
11
- ? 'border-indigo-700 outline outline-1 outline-offset-0 outline-indigo-700'
12
- : 'border-gray-300'
13
- "
14
- >
15
- <input
16
- type="radio"
17
- :name="name"
18
- :value="option.id"
19
- :checked="selectedOptionId === option.id"
20
- class="sr-only"
21
- @change="handleSelectOption(option)"
22
- />
23
- <span
24
- v-if="option.color"
25
- class="w-2 h-6"
26
- :style="{
27
- backgroundColor: getBackgroundColor(option.color),
28
- }"
29
- />
30
- <span class="text-sm text-gray-900">{{ option.name }}</span>
31
- </label>
32
- </div>
33
- </fieldset>
34
- </template>
35
-
36
- <script>
37
- export default {
38
- name: "CRadioGroup",
39
- props: {
40
- options: {
41
- type: Array,
42
- required: true,
43
- default: () => [],
44
- },
45
- value: {
46
- type: [String, Number],
47
- default: null,
48
- },
49
- name: {
50
- type: String,
51
- default: "radio-group",
52
- },
53
- ariaLabel: {
54
- type: String,
55
- default: "Select an option",
56
- },
57
- colorMap: {
58
- type: Object,
59
- default: () => ({}),
60
- },
61
- },
62
- data() {
63
- return {
64
- selectedOptionId: this.value,
65
- defaultColorMap: {
66
- blue: "#dbeafe#1d4ed8",
67
- indigo: "#e0e7ff#247DAE",
68
- yellow: "#fef9c3#a16207",
69
- red: "#fee2e2#b91c1c",
70
- pink: "#fce7f3#be185d",
71
- green: "#dcfce7#15803d",
72
- gray: "#f3f4f6#374151",
73
- },
74
- };
75
- },
76
- methods: {
77
- handleSelectOption(option) {
78
- if (this.selectedOptionId !== option.id) {
79
- this.selectedOptionId = option.id;
80
- this.$emit("onChange", option);
81
- }
82
- },
83
- getColorCode(color) {
84
- const colorCode = color.split("#")[2];
85
- return `#${colorCode}`;
86
- },
87
- getBackgroundColor(color) {
88
- const colorCode = this.colorMap[color]
89
- ? this.colorMap[color]
90
- : this.defaultColorMap[color.toLowerCase()];
91
-
92
- const formattedColorCode = this.getColorCode(colorCode);
93
- return formattedColorCode;
94
- },
95
- },
96
- };
1
+ <template>
2
+ <fieldset :aria-label="ariaLabel">
3
+ <div class="flex flex-col gap-4">
4
+ <label
5
+ v-for="option in options"
6
+ :key="option.id"
7
+ :aria-label="option.name"
8
+ class="group relative px-5 py-4 flex items-center gap-2.5 rounded-md cursor-pointer border"
9
+ :class="
10
+ selectedOptionId === option.id
11
+ ? 'border-indigo-700 outline outline-1 outline-offset-0 outline-indigo-700'
12
+ : 'border-gray-300'
13
+ "
14
+ >
15
+ <input
16
+ type="radio"
17
+ :name="name"
18
+ :value="option.id"
19
+ :checked="selectedOptionId === option.id"
20
+ class="sr-only"
21
+ @change="handleSelectOption(option)"
22
+ />
23
+ <span
24
+ v-if="option.color"
25
+ class="w-2 h-6"
26
+ :style="{
27
+ backgroundColor: getBackgroundColor(option.color),
28
+ }"
29
+ />
30
+ <span class="text-sm text-gray-900">{{ option.name }}</span>
31
+ </label>
32
+ </div>
33
+ </fieldset>
34
+ </template>
35
+
36
+ <script>
37
+ export default {
38
+ name: "CRadioGroup",
39
+ props: {
40
+ options: {
41
+ type: Array,
42
+ required: true,
43
+ default: () => [],
44
+ },
45
+ value: {
46
+ type: [String, Number],
47
+ default: null,
48
+ },
49
+ name: {
50
+ type: String,
51
+ default: "radio-group",
52
+ },
53
+ ariaLabel: {
54
+ type: String,
55
+ default: "Select an option",
56
+ },
57
+ colorMap: {
58
+ type: Object,
59
+ default: () => ({}),
60
+ },
61
+ },
62
+ data() {
63
+ return {
64
+ selectedOptionId: this.value,
65
+ defaultColorMap: {
66
+ blue: "#dbeafe#1d4ed8",
67
+ indigo: "#e0e7ff#247DAE",
68
+ yellow: "#fef9c3#a16207",
69
+ red: "#fee2e2#b91c1c",
70
+ pink: "#fce7f3#be185d",
71
+ green: "#dcfce7#15803d",
72
+ gray: "#f3f4f6#374151",
73
+ },
74
+ };
75
+ },
76
+ methods: {
77
+ handleSelectOption(option) {
78
+ if (this.selectedOptionId !== option.id) {
79
+ this.selectedOptionId = option.id;
80
+ this.$emit("onChange", option);
81
+ }
82
+ },
83
+ getColorCode(color) {
84
+ const colorCode = color.split("#")[2];
85
+ return `#${colorCode}`;
86
+ },
87
+ getBackgroundColor(color) {
88
+ const colorCode = this.colorMap[color]
89
+ ? this.colorMap[color]
90
+ : this.defaultColorMap[color.toLowerCase()];
91
+
92
+ const formattedColorCode = this.getColorCode(colorCode);
93
+ return formattedColorCode;
94
+ },
95
+ },
96
+ };
97
97
  </script>
@@ -1,3 +1,3 @@
1
- import CRadioGroup from './CRadioGroup.vue'
2
-
1
+ import CRadioGroup from './CRadioGroup.vue'
2
+
3
3
  export default CRadioGroup;