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.
- package/CHANGELOG.md +50 -1
- package/NOTICE +2 -2
- package/package.json +13 -5
- package/src/__tests__/RsButton.spec.ts +47 -0
- package/src/__tests__/RsCard.spec.ts +160 -1
- package/src/__tests__/RsConfirmDialog.spec.ts +127 -0
- package/src/__tests__/RsContextMenu.spec.ts +12 -0
- package/src/__tests__/RsDateTimePicker.spec.ts +11 -0
- package/src/__tests__/RsDescriptions.spec.ts +50 -0
- package/src/__tests__/RsDialog.spec.ts +117 -0
- package/src/__tests__/RsDrawer.spec.ts +96 -3
- package/src/__tests__/RsDynamicTags.spec.ts +52 -0
- package/src/__tests__/RsForm.spec.ts +245 -1
- package/src/__tests__/RsInput.spec.ts +15 -1
- package/src/__tests__/RsMenu.spec.ts +406 -14
- package/src/__tests__/RsPagination.spec.ts +67 -2
- package/src/__tests__/RsSelect.spec.ts +42 -1
- package/src/__tests__/RsSwitch.spec.ts +44 -0
- package/src/__tests__/RsTable.a11y.spec.ts +83 -0
- package/src/__tests__/RsTable.dom-baseline.spec.ts +87 -0
- package/src/__tests__/RsTable.perf.spec.ts +23 -4
- package/src/__tests__/RsTable.spec.ts +63 -8
- package/src/__tests__/RsTable.ssr.spec.ts +71 -0
- package/src/__tests__/RsTable.summary.spec.ts +45 -0
- package/src/__tests__/RsTabs.spec.ts +102 -4
- package/src/__tests__/RsTerminal.spec.ts +1 -1
- package/src/__tests__/RsTimePicker.spec.ts +11 -0
- package/src/__tests__/RsUpload.spec.ts +62 -6
- package/src/__tests__/createRsDialog.spec.ts +145 -0
- package/src/__tests__/form-rules.spec.ts +76 -0
- package/src/__tests__/perf-budgets.ts +32 -0
- package/src/__tests__/rs-table-api.spec.ts +206 -0
- package/src/__tests__/rs-table-compat-matrix.spec.ts +108 -0
- package/src/__tests__/rs-table-echarts-adapter.spec.ts +43 -0
- package/src/__tests__/rs-table-grid-nav.spec.ts +63 -0
- package/src/__tests__/rs-table-isolation.spec.ts +158 -0
- package/src/__tests__/split-pane-utils.spec.ts +21 -0
- package/src/__tests__/table-chart-utils.spec.ts +88 -0
- package/src/__tests__/table-summary-utils.spec.ts +62 -0
- package/src/__tests__/table-utils.spec.ts +124 -0
- package/src/__tests__/theme.spec.ts +25 -0
- package/src/__tests__/useRsTableColumnResize.spec.ts +25 -0
- package/src/__tests__/useRsTableCore.perf.spec.ts +170 -0
- package/src/components/RsAlert.vue +212 -0
- package/src/components/RsButton.vue +145 -21
- package/src/components/RsCard.vue +200 -16
- package/src/components/RsConfirmDialog.vue +215 -28
- package/src/components/RsContextMenu.vue +51 -13
- package/src/components/RsDatePicker.vue +267 -34
- package/src/components/RsDateTimePicker.vue +19 -2
- package/src/components/RsDescriptions.vue +186 -0
- package/src/components/RsDescriptionsItem.vue +32 -0
- package/src/components/RsDialog.vue +363 -51
- package/src/components/RsDivider.vue +89 -0
- package/src/components/RsDrawer.vue +558 -33
- package/src/components/RsDropdown.vue +33 -2
- package/src/components/RsDynamicTags.vue +517 -0
- package/src/components/RsForm.vue +97 -8
- package/src/components/RsInput.vue +80 -82
- package/src/components/RsInputNumber.vue +64 -23
- package/src/components/RsLabel.vue +20 -5
- package/src/components/RsLoadingBar.vue +151 -0
- package/src/components/RsMenu.vue +73 -15
- package/src/components/RsMenuItems.vue +147 -9
- package/src/components/RsPagination.vue +93 -14
- package/src/components/RsRadio.vue +81 -0
- package/src/components/RsRadioItem.vue +156 -0
- package/src/components/RsSelect.vue +67 -58
- package/src/components/RsSplitPane.vue +69 -1
- package/src/components/RsSwitch.vue +179 -0
- package/src/components/RsTable.vue +653 -2555
- package/src/components/RsTabs.vue +415 -83
- package/src/components/RsTag.vue +191 -0
- package/src/components/RsTerminal.vue +3 -3
- package/src/components/RsTimePicker.vue +44 -5
- package/src/components/RsTimePickerColumns.vue +136 -77
- package/src/components/RsToaster.vue +58 -18
- package/src/components/RsTree.vue +39 -21
- package/src/components/RsUpload.vue +145 -12
- package/src/components/RsVNodeHost.vue +20 -0
- package/src/components/button-utils.ts +39 -0
- package/src/components/context-menu-utils.ts +6 -0
- package/src/components/date-picker-utils.ts +84 -4
- package/src/components/descriptions-utils.ts +24 -0
- package/src/components/dialog-utils.ts +147 -0
- package/src/components/dialog-window.ts +74 -9
- package/src/components/drawer-utils.ts +73 -0
- package/src/components/form-rules.ts +257 -0
- package/src/components/form-utils.ts +52 -2
- package/src/components/menu-utils.ts +11 -0
- package/src/components/overlay-utils.ts +3 -0
- package/src/components/radio-utils.ts +12 -0
- package/src/components/reka.ts +5 -0
- package/src/components/select-utils.ts +21 -2
- package/src/components/split-pane-utils.ts +65 -12
- package/src/components/table/RsTableBody.vue +217 -0
- package/src/components/table/RsTableBodyRow.vue +90 -1
- package/src/components/table/RsTableColGroup.vue +41 -0
- package/src/components/table/RsTableHeader.vue +158 -0
- package/src/components/table/RsTableSummaryRow.vue +52 -0
- package/src/components/table/rs-table-api.ts +99 -0
- package/src/components/table/rs-table-compat-matrix.ts +71 -0
- package/src/components/table/rs-table-echarts-adapter.ts +81 -0
- package/src/components/table/rs-table-feature-host.ts +178 -0
- package/src/components/table/rs-table-grid-nav.ts +122 -0
- package/src/components/table/rs-table-header-types.ts +47 -0
- package/src/components/table/rs-table-module-registry.ts +72 -0
- package/src/components/table/rs-table-props.ts +274 -0
- package/src/components/table/rs-table-view-context.ts +258 -0
- package/src/components/table/rs-table.css +84 -6
- package/src/components/table/table-chart-utils.ts +165 -0
- package/src/components/table/table-features.ts +284 -0
- package/src/components/table/table-summary-utils.ts +194 -0
- package/src/components/table-utils.ts +452 -2
- package/src/components/tabs-utils.ts +142 -2
- package/src/components/terminal-utils.ts +1 -1
- package/src/components/terminal-wheel.ts +1 -1
- package/src/components/time-picker-utils.ts +76 -3
- package/src/components/upload-utils.ts +122 -0
- package/src/components/virtual-list-utils.ts +15 -2
- package/src/composables/assembleRsTableApi.ts +79 -0
- package/src/composables/bindRsTableViewContext.ts +269 -0
- package/src/composables/createRsDialog.ts +357 -0
- package/src/composables/createRsTableEditEmitBridge.ts +38 -0
- package/src/composables/useRsLoadingBar.ts +36 -0
- package/src/composables/useRsTable.ts +134 -0
- package/src/composables/useRsTableA11y.ts +52 -0
- package/src/composables/useRsTableChartBridge.ts +79 -0
- package/src/composables/useRsTableColumnLayout.ts +320 -0
- package/src/composables/useRsTableColumnResize.ts +244 -0
- package/src/composables/useRsTableColumnVirtual.ts +180 -0
- package/src/composables/useRsTableColumns.ts +200 -0
- package/src/composables/useRsTableContextMenu.ts +257 -0
- package/src/composables/useRsTableCore.ts +256 -0
- package/src/composables/useRsTableEditActions.ts +606 -0
- package/src/composables/useRsTableEditLayer.ts +251 -0
- package/src/composables/useRsTableEngine.ts +357 -0
- package/src/composables/useRsTableGridKeyboard.ts +123 -0
- package/src/composables/useRsTableHeadless.ts +137 -0
- package/src/composables/useRsTableInteraction.ts +433 -0
- package/src/composables/useRsTableScrollHost.ts +75 -0
- package/src/composables/useRsTableScrollLayout.ts +255 -0
- package/src/composables/useRsTableSelectionSource.ts +89 -0
- package/src/composables/useRsTableShell.ts +416 -0
- package/src/composables/useRsTableShellChrome.ts +170 -0
- package/src/composables/useRsTableSummary.ts +113 -0
- package/src/composables/useRsTableViewProvide.ts +263 -0
- package/src/composables/useRsTableVirtual.ts +154 -0
- package/src/composables/useRsTabsNav.ts +4 -0
- package/src/composables/useTableEdit.ts +1 -1
- package/src/icons/lucide.ts +2 -2
- package/src/index.ts +309 -9
- package/src/locale/messages.ts +30 -0
- package/src/styles.css +305 -52
- package/src/theme/brand.example.css +21 -2
- package/src/theme/presets.ts +4 -0
- package/src/theme/types.ts +67 -0
- package/src/components/RsTableColgroup.vue +0 -17
- 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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
94
|
-
|
|
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
|
|
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="
|
|
144
|
+
:size="controlSize"
|
|
145
|
+
:radius="controlRadius"
|
|
111
146
|
:disabled="disabled"
|
|
112
|
-
@
|
|
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="
|
|
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="
|
|
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
|
|
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:
|
|
238
|
+
font-size: inherit;
|
|
169
239
|
line-height: var(--rs-line-height-tight);
|
|
170
240
|
}
|
|
171
241
|
.rs-pagination__jumper-input {
|
|
172
|
-
width:
|
|
242
|
+
width: 3rem;
|
|
173
243
|
}
|
|
174
|
-
.rs-pagination__jumper-input :deep(.rs-input-
|
|
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>
|