niuma-ui 1.0.0 → 1.0.2

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 (159) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/NOTICE +2 -2
  3. package/package.json +13 -5
  4. package/src/__tests__/RsButton.spec.ts +47 -0
  5. package/src/__tests__/RsCard.spec.ts +160 -1
  6. package/src/__tests__/RsConfirmDialog.spec.ts +127 -0
  7. package/src/__tests__/RsContextMenu.spec.ts +12 -0
  8. package/src/__tests__/RsDateTimePicker.spec.ts +11 -0
  9. package/src/__tests__/RsDescriptions.spec.ts +50 -0
  10. package/src/__tests__/RsDialog.spec.ts +117 -0
  11. package/src/__tests__/RsDrawer.spec.ts +96 -3
  12. package/src/__tests__/RsDynamicTags.spec.ts +52 -0
  13. package/src/__tests__/RsForm.spec.ts +245 -1
  14. package/src/__tests__/RsInput.spec.ts +15 -1
  15. package/src/__tests__/RsMenu.spec.ts +406 -14
  16. package/src/__tests__/RsPagination.spec.ts +67 -2
  17. package/src/__tests__/RsSelect.spec.ts +42 -1
  18. package/src/__tests__/RsSwitch.spec.ts +44 -0
  19. package/src/__tests__/RsTable.a11y.spec.ts +83 -0
  20. package/src/__tests__/RsTable.dom-baseline.spec.ts +87 -0
  21. package/src/__tests__/RsTable.perf.spec.ts +23 -4
  22. package/src/__tests__/RsTable.spec.ts +63 -8
  23. package/src/__tests__/RsTable.ssr.spec.ts +71 -0
  24. package/src/__tests__/RsTable.summary.spec.ts +45 -0
  25. package/src/__tests__/RsTabs.spec.ts +102 -4
  26. package/src/__tests__/RsTerminal.spec.ts +1 -1
  27. package/src/__tests__/RsTimePicker.spec.ts +11 -0
  28. package/src/__tests__/RsUpload.spec.ts +62 -6
  29. package/src/__tests__/createRsDialog.spec.ts +145 -0
  30. package/src/__tests__/form-rules.spec.ts +76 -0
  31. package/src/__tests__/perf-budgets.ts +32 -0
  32. package/src/__tests__/rs-table-api.spec.ts +206 -0
  33. package/src/__tests__/rs-table-compat-matrix.spec.ts +108 -0
  34. package/src/__tests__/rs-table-echarts-adapter.spec.ts +43 -0
  35. package/src/__tests__/rs-table-grid-nav.spec.ts +63 -0
  36. package/src/__tests__/rs-table-isolation.spec.ts +158 -0
  37. package/src/__tests__/split-pane-utils.spec.ts +21 -0
  38. package/src/__tests__/table-chart-utils.spec.ts +88 -0
  39. package/src/__tests__/table-summary-utils.spec.ts +62 -0
  40. package/src/__tests__/table-utils.spec.ts +124 -0
  41. package/src/__tests__/theme.spec.ts +25 -0
  42. package/src/__tests__/useRsTableColumnResize.spec.ts +25 -0
  43. package/src/__tests__/useRsTableCore.perf.spec.ts +170 -0
  44. package/src/components/RsAlert.vue +212 -0
  45. package/src/components/RsButton.vue +145 -21
  46. package/src/components/RsCard.vue +200 -16
  47. package/src/components/RsConfirmDialog.vue +215 -28
  48. package/src/components/RsContextMenu.vue +51 -13
  49. package/src/components/RsDatePicker.vue +267 -34
  50. package/src/components/RsDateTimePicker.vue +19 -2
  51. package/src/components/RsDescriptions.vue +186 -0
  52. package/src/components/RsDescriptionsItem.vue +32 -0
  53. package/src/components/RsDialog.vue +363 -51
  54. package/src/components/RsDivider.vue +89 -0
  55. package/src/components/RsDrawer.vue +558 -33
  56. package/src/components/RsDropdown.vue +33 -2
  57. package/src/components/RsDynamicTags.vue +517 -0
  58. package/src/components/RsForm.vue +97 -8
  59. package/src/components/RsInput.vue +80 -82
  60. package/src/components/RsInputNumber.vue +64 -23
  61. package/src/components/RsLabel.vue +20 -5
  62. package/src/components/RsLoadingBar.vue +151 -0
  63. package/src/components/RsMenu.vue +73 -15
  64. package/src/components/RsMenuItems.vue +147 -9
  65. package/src/components/RsPagination.vue +93 -14
  66. package/src/components/RsRadio.vue +81 -0
  67. package/src/components/RsRadioItem.vue +156 -0
  68. package/src/components/RsSelect.vue +67 -58
  69. package/src/components/RsSplitPane.vue +69 -1
  70. package/src/components/RsSwitch.vue +179 -0
  71. package/src/components/RsTable.vue +653 -2555
  72. package/src/components/RsTabs.vue +415 -83
  73. package/src/components/RsTag.vue +191 -0
  74. package/src/components/RsTerminal.vue +3 -3
  75. package/src/components/RsTimePicker.vue +44 -5
  76. package/src/components/RsTimePickerColumns.vue +136 -77
  77. package/src/components/RsToaster.vue +58 -18
  78. package/src/components/RsTree.vue +39 -21
  79. package/src/components/RsUpload.vue +145 -12
  80. package/src/components/RsVNodeHost.vue +20 -0
  81. package/src/components/button-utils.ts +39 -0
  82. package/src/components/context-menu-utils.ts +6 -0
  83. package/src/components/date-picker-utils.ts +84 -4
  84. package/src/components/descriptions-utils.ts +24 -0
  85. package/src/components/dialog-utils.ts +147 -0
  86. package/src/components/dialog-window.ts +74 -9
  87. package/src/components/drawer-utils.ts +73 -0
  88. package/src/components/form-rules.ts +257 -0
  89. package/src/components/form-utils.ts +52 -2
  90. package/src/components/menu-utils.ts +11 -0
  91. package/src/components/overlay-utils.ts +3 -0
  92. package/src/components/radio-utils.ts +12 -0
  93. package/src/components/reka.ts +5 -0
  94. package/src/components/select-utils.ts +21 -2
  95. package/src/components/split-pane-utils.ts +65 -12
  96. package/src/components/table/RsTableBody.vue +217 -0
  97. package/src/components/table/RsTableBodyRow.vue +90 -1
  98. package/src/components/table/RsTableColGroup.vue +41 -0
  99. package/src/components/table/RsTableHeader.vue +158 -0
  100. package/src/components/table/RsTableSummaryRow.vue +52 -0
  101. package/src/components/table/rs-table-api.ts +99 -0
  102. package/src/components/table/rs-table-compat-matrix.ts +71 -0
  103. package/src/components/table/rs-table-echarts-adapter.ts +81 -0
  104. package/src/components/table/rs-table-feature-host.ts +178 -0
  105. package/src/components/table/rs-table-grid-nav.ts +122 -0
  106. package/src/components/table/rs-table-header-types.ts +47 -0
  107. package/src/components/table/rs-table-module-registry.ts +72 -0
  108. package/src/components/table/rs-table-props.ts +274 -0
  109. package/src/components/table/rs-table-view-context.ts +258 -0
  110. package/src/components/table/rs-table.css +84 -6
  111. package/src/components/table/table-chart-utils.ts +165 -0
  112. package/src/components/table/table-features.ts +284 -0
  113. package/src/components/table/table-summary-utils.ts +194 -0
  114. package/src/components/table-utils.ts +452 -2
  115. package/src/components/tabs-utils.ts +142 -2
  116. package/src/components/terminal-utils.ts +1 -1
  117. package/src/components/terminal-wheel.ts +1 -1
  118. package/src/components/time-picker-utils.ts +76 -3
  119. package/src/components/upload-utils.ts +122 -0
  120. package/src/components/virtual-list-utils.ts +15 -2
  121. package/src/composables/assembleRsTableApi.ts +79 -0
  122. package/src/composables/bindRsTableViewContext.ts +269 -0
  123. package/src/composables/createRsDialog.ts +357 -0
  124. package/src/composables/createRsTableEditEmitBridge.ts +38 -0
  125. package/src/composables/useRsLoadingBar.ts +36 -0
  126. package/src/composables/useRsTable.ts +134 -0
  127. package/src/composables/useRsTableA11y.ts +52 -0
  128. package/src/composables/useRsTableChartBridge.ts +79 -0
  129. package/src/composables/useRsTableColumnLayout.ts +320 -0
  130. package/src/composables/useRsTableColumnResize.ts +244 -0
  131. package/src/composables/useRsTableColumnVirtual.ts +180 -0
  132. package/src/composables/useRsTableColumns.ts +200 -0
  133. package/src/composables/useRsTableContextMenu.ts +257 -0
  134. package/src/composables/useRsTableCore.ts +256 -0
  135. package/src/composables/useRsTableEditActions.ts +606 -0
  136. package/src/composables/useRsTableEditLayer.ts +251 -0
  137. package/src/composables/useRsTableEngine.ts +357 -0
  138. package/src/composables/useRsTableGridKeyboard.ts +123 -0
  139. package/src/composables/useRsTableHeadless.ts +137 -0
  140. package/src/composables/useRsTableInteraction.ts +433 -0
  141. package/src/composables/useRsTableScrollHost.ts +75 -0
  142. package/src/composables/useRsTableScrollLayout.ts +255 -0
  143. package/src/composables/useRsTableSelectionSource.ts +89 -0
  144. package/src/composables/useRsTableShell.ts +416 -0
  145. package/src/composables/useRsTableShellChrome.ts +170 -0
  146. package/src/composables/useRsTableSummary.ts +113 -0
  147. package/src/composables/useRsTableViewProvide.ts +263 -0
  148. package/src/composables/useRsTableVirtual.ts +154 -0
  149. package/src/composables/useRsTabsNav.ts +4 -0
  150. package/src/composables/useTableEdit.ts +1 -1
  151. package/src/icons/lucide.ts +2 -2
  152. package/src/index.ts +309 -9
  153. package/src/locale/messages.ts +30 -0
  154. package/src/styles.css +305 -52
  155. package/src/theme/brand.example.css +21 -2
  156. package/src/theme/presets.ts +4 -0
  157. package/src/theme/types.ts +67 -0
  158. package/src/components/RsTableColgroup.vue +0 -17
  159. package/src/components/RsTableHeaderRow.vue +0 -30
@@ -5,8 +5,13 @@ import RsInput from './RsInput.vue'
5
5
  import RsSelect from './RsSelect.vue'
6
6
  import { clampPage, DEFAULT_PAGE_SIZE_OPTIONS, getPageCount, getPaginationRange } from './pagination-utils'
7
7
  import { useRsI18n } from '../composables/useRsI18n'
8
+ import type { RsComponentSize } from '../theme/types'
8
9
 
9
- export type RsPaginationSize = 'sm' | 'md'
10
+ /**
11
+ * 分页尺寸(对齐 Ant Design Pagination:small / medium / large)。
12
+ * 不提供 ssm:页码按钮过小不利于点击。
13
+ */
14
+ export type RsPaginationSize = Extract<RsComponentSize, 'sm' | 'md' | 'lg'>
10
15
 
11
16
  const page = defineModel<number>('page', { default: 1 })
12
17
  const pageSize = defineModel<number>('pageSize', { default: 20 })
@@ -18,6 +23,11 @@ const props = withDefaults(
18
23
  showSummary?: boolean
19
24
  showPageSize?: boolean
20
25
  showQuickJumper?: boolean
26
+ /**
27
+ * 是否显示跳转「确定」按钮。
28
+ * 默认 false:回车 / 失焦跳转(对齐 Ant Design showQuickJumper 默认无 goButton)。
29
+ */
30
+ showJumpConfirm?: boolean
21
31
  pageSizeOptions?: readonly number[]
22
32
  disabled?: boolean
23
33
  size?: RsPaginationSize
@@ -27,6 +37,7 @@ const props = withDefaults(
27
37
  showSummary: true,
28
38
  showPageSize: false,
29
39
  showQuickJumper: false,
40
+ showJumpConfirm: false,
30
41
  pageSizeOptions: () => DEFAULT_PAGE_SIZE_OPTIONS,
31
42
  disabled: false,
32
43
  size: 'md',
@@ -51,6 +62,9 @@ const pageSizeSelectOptions = computed(() =>
51
62
  })),
52
63
  )
53
64
  const showJumper = computed(() => props.showQuickJumper && pageCount.value > 1)
65
+ /** 页码按钮用 sm 圆角,避免 Button 默认 full 胶囊 */
66
+ const controlRadius = 'sm' as const
67
+ const controlSize = computed(() => props.size)
54
68
 
55
69
  watch(pageCount, (count) => {
56
70
  page.value = clampPage(page.value, count)
@@ -78,27 +92,47 @@ function confirmJump(): void {
78
92
  </script>
79
93
 
80
94
  <template>
81
- <nav class="rs-pagination" :class="`rs-pagination--${size}`" :aria-label="t('pagination.label')">
95
+ <nav
96
+ class="rs-pagination"
97
+ :class="[`rs-pagination--${size}`, { 'rs-pagination--no-jump-confirm': !showJumpConfirm }]"
98
+ :aria-label="t('pagination.label')"
99
+ >
82
100
  <span v-if="showSummary" class="rs-pagination__summary">
83
101
  {{ summaryText }}
84
102
  </span>
85
103
  <div class="rs-pagination__buttons">
86
- <RsButton variant="ghost" size="sm" :disabled="disabled || page <= 1" @click="go(page - 1)">
104
+ <RsButton
105
+ variant="ghost"
106
+ :size="controlSize"
107
+ :radius="controlRadius"
108
+ :disabled="disabled || page <= 1"
109
+ @click="go(page - 1)"
110
+ >
87
111
  {{ t('pagination.prev') }}
88
112
  </RsButton>
89
113
  <template v-for="(item, index) in range" :key="`${item}-${index}`">
90
114
  <span v-if="item === 'ellipsis'" class="rs-pagination__ellipsis">...</span>
91
115
  <RsButton
92
116
  v-else
93
- :variant="item === page ? 'primary' : 'ghost'"
94
- size="sm"
117
+ variant="text"
118
+ :tone="item === page ? 'primary' : 'neutral'"
119
+ :size="controlSize"
120
+ :radius="controlRadius"
121
+ class="rs-pagination__page"
122
+ :class="{ 'rs-pagination__page--active': item === page }"
95
123
  :disabled="disabled"
96
124
  @click="go(item)"
97
125
  >
98
126
  {{ item }}
99
127
  </RsButton>
100
128
  </template>
101
- <RsButton variant="ghost" size="sm" :disabled="disabled || page >= pageCount" @click="go(page + 1)">
129
+ <RsButton
130
+ variant="ghost"
131
+ :size="controlSize"
132
+ :radius="controlRadius"
133
+ :disabled="disabled || page >= pageCount"
134
+ @click="go(page + 1)"
135
+ >
102
136
  {{ t('pagination.next') }}
103
137
  </RsButton>
104
138
  </div>
@@ -107,17 +141,21 @@ function confirmJump(): void {
107
141
  <div class="rs-pagination__jumper-input">
108
142
  <RsInput
109
143
  v-model="jumpPageInput"
110
- size="sm"
144
+ :size="controlSize"
145
+ :radius="controlRadius"
111
146
  :disabled="disabled"
112
- @keydown.enter="confirmJump"
147
+ @press-enter="confirmJump"
148
+ @blur="confirmJump"
113
149
  />
114
150
  </div>
115
151
  <span v-if="t('pagination.jumpPageSuffix')" class="rs-pagination__jumper-suffix">
116
152
  {{ t('pagination.jumpPageSuffix') }}
117
153
  </span>
118
154
  <RsButton
155
+ v-if="showJumpConfirm"
119
156
  variant="ghost"
120
- size="sm"
157
+ :size="controlSize"
158
+ :radius="controlRadius"
121
159
  class="rs-pagination__jumper-btn"
122
160
  :disabled="disabled"
123
161
  @click="confirmJump"
@@ -129,9 +167,11 @@ function confirmJump(): void {
129
167
  <RsSelect
130
168
  v-model="pageSizeSelectValue"
131
169
  :options="pageSizeSelectOptions"
132
- size="sm"
170
+ :size="controlSize"
171
+ :radius="controlRadius"
133
172
  :disabled="disabled"
134
173
  :placeholder="t('select.placeholder')"
174
+ block
135
175
  />
136
176
  </div>
137
177
  </nav>
@@ -145,16 +185,46 @@ function confirmJump(): void {
145
185
  gap: var(--rs-space-sm);
146
186
  color: var(--rs-muted);
147
187
  font-size: var(--rs-font-size-sm);
188
+ /*
189
+ * 跳转输入 / 每页条数与页码按钮同档高度(随 size)。
190
+ * 高度走 token;仅用属性选择器对齐外壳,避免业务 :deep 改控件内部。
191
+ */
192
+ --rs-pagination-control-height: var(--rs-control-height-md);
193
+ }
194
+ .rs-pagination--sm {
195
+ --rs-pagination-control-height: var(--rs-control-height-sm);
196
+ font-size: var(--rs-font-size-xs);
197
+ }
198
+ .rs-pagination--md {
199
+ --rs-pagination-control-height: var(--rs-control-height-md);
200
+ }
201
+ .rs-pagination--lg {
202
+ --rs-pagination-control-height: var(--rs-control-height-lg);
203
+ font-size: var(--rs-font-size-base);
204
+ }
205
+ .rs-pagination__summary {
206
+ flex-shrink: 0;
207
+ line-height: var(--rs-pagination-control-height);
148
208
  }
149
209
  .rs-pagination__buttons {
150
210
  display: inline-flex;
151
211
  align-items: center;
152
212
  gap: var(--rs-space-xs);
153
213
  }
214
+ /* 当前页:仅主色文字高亮,无填充底(对齐部分 Ant / Element 轻量分页) */
215
+ .rs-pagination__buttons :deep(.rs-pagination__page--active) {
216
+ font-weight: 600;
217
+ background: transparent !important;
218
+ box-shadow: none;
219
+ }
220
+ .rs-pagination__buttons :deep(.rs-pagination__page--active:hover:not(:disabled)),
221
+ .rs-pagination__buttons :deep(.rs-pagination__page--active:active:not(:disabled)) {
222
+ background: transparent !important;
223
+ }
154
224
  .rs-pagination__ellipsis {
155
225
  padding: 0 var(--rs-space-xs);
156
226
  font-size: var(--rs-font-size-xs);
157
- line-height: var(--rs-control-height-sm);
227
+ line-height: var(--rs-pagination-control-height);
158
228
  }
159
229
  .rs-pagination__jumper {
160
230
  display: inline-flex;
@@ -165,14 +235,17 @@ function confirmJump(): void {
165
235
  .rs-pagination__jumper-suffix {
166
236
  flex-shrink: 0;
167
237
  color: var(--rs-muted);
168
- font-size: var(--rs-font-size-xs);
238
+ font-size: inherit;
169
239
  line-height: var(--rs-line-height-tight);
170
240
  }
171
241
  .rs-pagination__jumper-input {
172
- width: 2.75rem;
242
+ width: 3rem;
173
243
  }
174
- .rs-pagination__jumper-input :deep(.rs-input-field) {
244
+ .rs-pagination__jumper-input :deep(.rs-input-group) {
175
245
  width: 100%;
246
+ height: var(--rs-pagination-control-height);
247
+ min-height: var(--rs-pagination-control-height);
248
+ box-sizing: border-box;
176
249
  }
177
250
  .rs-pagination__jumper-btn {
178
251
  flex-shrink: 0;
@@ -181,4 +254,10 @@ function confirmJump(): void {
181
254
  width: 7.25rem;
182
255
  min-width: 7.25rem;
183
256
  }
257
+ .rs-pagination__size :deep(.rs-select__trigger) {
258
+ width: 100%;
259
+ height: var(--rs-pagination-control-height);
260
+ min-height: var(--rs-pagination-control-height);
261
+ box-sizing: border-box;
262
+ }
184
263
  </style>
@@ -0,0 +1,81 @@
1
+ <script setup lang="ts">
2
+ import { computed, provide } from 'vue'
3
+ import type { RsComponentSize } from '../theme/types'
4
+ import { RadioGroupRoot } from './reka'
5
+ import { RS_RADIO_GROUP_KEY, type RsRadioValue } from './radio-utils'
6
+ import { useResolvedRsComponentSize } from './resolve-size'
7
+
8
+ const model = defineModel<RsRadioValue | undefined>({ default: undefined })
9
+
10
+ const props = withDefaults(
11
+ defineProps<{
12
+ disabled?: boolean
13
+ size?: RsComponentSize
14
+ name?: string
15
+ orientation?: 'horizontal' | 'vertical'
16
+ }>(),
17
+ {
18
+ disabled: false,
19
+ orientation: 'horizontal',
20
+ },
21
+ )
22
+
23
+ const emit = defineEmits<{
24
+ change: [value: RsRadioValue]
25
+ }>()
26
+
27
+ const resolvedSize = useResolvedRsComponentSize(() => props.size)
28
+
29
+ provide(RS_RADIO_GROUP_KEY, {
30
+ size: resolvedSize,
31
+ })
32
+
33
+ const rootClass = computed(() => [
34
+ 'rs-radio-group',
35
+ `rs-radio-group--${props.orientation}`,
36
+ `rs-radio-group--${resolvedSize.value}`,
37
+ { 'rs-radio-group--disabled': props.disabled },
38
+ ])
39
+
40
+ function onUpdate(value: RsRadioValue): void {
41
+ model.value = value
42
+ emit('change', value)
43
+ }
44
+ </script>
45
+
46
+ <template>
47
+ <RadioGroupRoot
48
+ :class="rootClass"
49
+ :model-value="model as string | number | undefined"
50
+ :disabled="disabled"
51
+ :name="name"
52
+ :orientation="orientation"
53
+ @update:model-value="onUpdate($event as RsRadioValue)"
54
+ >
55
+ <slot />
56
+ </RadioGroupRoot>
57
+ </template>
58
+
59
+ <style>
60
+ .rs-radio-group {
61
+ display: inline-flex;
62
+ gap: var(--rs-space-md);
63
+ color: var(--rs-text);
64
+ }
65
+
66
+ .rs-radio-group--vertical {
67
+ flex-direction: column;
68
+ align-items: flex-start;
69
+ }
70
+
71
+ .rs-radio-group--horizontal {
72
+ flex-direction: row;
73
+ flex-wrap: wrap;
74
+ align-items: center;
75
+ }
76
+
77
+ .rs-radio-group--disabled {
78
+ opacity: 0.55;
79
+ cursor: not-allowed;
80
+ }
81
+ </style>
@@ -0,0 +1,156 @@
1
+ <script setup lang="ts">
2
+ import { computed, inject, useId } from 'vue'
3
+ import type { RsComponentSize } from '../theme/types'
4
+ import { RadioGroupIndicator, RadioGroupItem } from './reka'
5
+ import { RS_RADIO_GROUP_KEY, type RsRadioValue } from './radio-utils'
6
+ import { useResolvedRsComponentSize } from './resolve-size'
7
+
8
+ const props = withDefaults(
9
+ defineProps<{
10
+ value: RsRadioValue
11
+ disabled?: boolean
12
+ size?: RsComponentSize
13
+ id?: string
14
+ }>(),
15
+ {
16
+ disabled: false,
17
+ },
18
+ )
19
+
20
+ const group = inject(RS_RADIO_GROUP_KEY, null)
21
+ const resolvedSize = useResolvedRsComponentSize(() => props.size ?? group?.size.value)
22
+ const autoId = useId()
23
+ const inputId = computed(() => props.id || autoId)
24
+
25
+ const rootClass = computed(() => [
26
+ 'rs-radio',
27
+ `rs-radio--${resolvedSize.value}`,
28
+ { 'rs-radio--disabled': props.disabled },
29
+ ])
30
+ </script>
31
+
32
+ <template>
33
+ <div :class="rootClass">
34
+ <RadioGroupItem
35
+ :id="inputId"
36
+ class="rs-radio__item"
37
+ :value="value as string | number"
38
+ :disabled="disabled"
39
+ >
40
+ <RadioGroupIndicator class="rs-radio__indicator" />
41
+ </RadioGroupItem>
42
+ <label v-if="$slots.default" class="rs-radio__label" :for="inputId">
43
+ <slot />
44
+ </label>
45
+ </div>
46
+ </template>
47
+
48
+ <style>
49
+ .rs-radio {
50
+ display: inline-flex;
51
+ align-items: center;
52
+ gap: var(--rs-space-xs);
53
+ cursor: pointer;
54
+ user-select: none;
55
+ line-height: 1;
56
+ }
57
+
58
+ .rs-radio--disabled {
59
+ cursor: not-allowed;
60
+ opacity: 0.55;
61
+ }
62
+
63
+ .rs-radio__item {
64
+ position: relative;
65
+ display: inline-flex;
66
+ flex-shrink: 0;
67
+ align-items: center;
68
+ justify-content: center;
69
+ box-sizing: border-box;
70
+ border: 1px solid var(--rs-border);
71
+ border-radius: var(--rs-radius-full);
72
+ background: var(--rs-surface);
73
+ outline: none;
74
+ cursor: pointer;
75
+ transition:
76
+ border-color var(--rs-transition-fast),
77
+ background-color var(--rs-transition-fast);
78
+ }
79
+
80
+ .rs-radio--disabled .rs-radio__item {
81
+ cursor: not-allowed;
82
+ }
83
+
84
+ .rs-radio:hover:not(.rs-radio--disabled) .rs-radio__item:not([data-state='checked']) {
85
+ border-color: var(--rs-primary);
86
+ }
87
+
88
+ .rs-radio__item:focus-visible {
89
+ box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
90
+ }
91
+
92
+ .rs-radio--ssm .rs-radio__item {
93
+ width: 0.75rem;
94
+ height: 0.75rem;
95
+ }
96
+
97
+ .rs-radio--sm .rs-radio__item {
98
+ width: 0.875rem;
99
+ height: 0.875rem;
100
+ }
101
+
102
+ .rs-radio--md .rs-radio__item {
103
+ width: 1rem;
104
+ height: 1rem;
105
+ }
106
+
107
+ .rs-radio--lg .rs-radio__item {
108
+ width: 1.125rem;
109
+ height: 1.125rem;
110
+ }
111
+
112
+ .rs-radio__item[data-state='checked'] {
113
+ border-color: var(--rs-primary);
114
+ }
115
+
116
+ .rs-radio__indicator {
117
+ display: block;
118
+ border-radius: var(--rs-radius-full);
119
+ background: var(--rs-primary);
120
+ }
121
+
122
+ .rs-radio--ssm .rs-radio__indicator {
123
+ width: 0.375rem;
124
+ height: 0.375rem;
125
+ }
126
+
127
+ .rs-radio--sm .rs-radio__indicator {
128
+ width: 0.4375rem;
129
+ height: 0.4375rem;
130
+ }
131
+
132
+ .rs-radio--md .rs-radio__indicator {
133
+ width: 0.5rem;
134
+ height: 0.5rem;
135
+ }
136
+
137
+ .rs-radio--lg .rs-radio__indicator {
138
+ width: 0.5625rem;
139
+ height: 0.5625rem;
140
+ }
141
+
142
+ .rs-radio__label {
143
+ font-size: var(--rs-font-size-sm);
144
+ line-height: var(--rs-line-height-normal);
145
+ cursor: pointer;
146
+ }
147
+
148
+ .rs-radio--disabled .rs-radio__label {
149
+ cursor: not-allowed;
150
+ }
151
+
152
+ .rs-radio--ssm .rs-radio__label,
153
+ .rs-radio--sm .rs-radio__label {
154
+ font-size: var(--rs-font-size-xs);
155
+ }
156
+ </style>