2023-07-27 05:31:52 +00:00
|
|
|
<!--
|
2024-02-13 15:59:27 +00:00
|
|
|
SPDX-FileCopyrightText: syuilo and misskey-project
|
2023-07-27 05:31:52 +00:00
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
-->
|
|
|
|
|
2020-11-25 12:31:34 +00:00
|
|
|
<script lang="ts">
|
2023-05-14 03:23:39 +00:00
|
|
|
import { VNode, defineComponent, h, ref, watch } from 'vue';
|
2023-01-07 06:09:46 +00:00
|
|
|
import MkRadio from './MkRadio.vue';
|
2020-11-25 12:31:34 +00:00
|
|
|
|
|
|
|
export default defineComponent({
|
|
|
|
props: {
|
|
|
|
modelValue: {
|
2022-06-28 13:32:01 +00:00
|
|
|
required: false,
|
2020-11-25 12:31:34 +00:00
|
|
|
},
|
|
|
|
},
|
2023-05-14 03:23:39 +00:00
|
|
|
setup(props, context) {
|
|
|
|
const value = ref(props.modelValue);
|
|
|
|
watch(value, () => {
|
|
|
|
context.emit('update:modelValue', value.value);
|
|
|
|
});
|
2024-01-19 11:51:49 +00:00
|
|
|
watch(() => props.modelValue, v => {
|
|
|
|
value.value = v;
|
|
|
|
});
|
2023-05-14 03:23:39 +00:00
|
|
|
if (!context.slots.default) return null;
|
|
|
|
let options = context.slots.default();
|
|
|
|
const label = context.slots.label && context.slots.label();
|
|
|
|
const caption = context.slots.caption && context.slots.caption();
|
2021-07-19 14:30:12 +00:00
|
|
|
|
|
|
|
// なぜかFragmentになることがあるため
|
2023-04-15 12:35:19 +00:00
|
|
|
if (options.length === 1 && options[0].props == null) options = options[0].children as VNode[];
|
2020-11-25 12:31:34 +00:00
|
|
|
|
2024-07-30 06:51:08 +00:00
|
|
|
// vnodeのうちv-if=falseなものを除外する(trueになるものはoptionなど他typeになる)
|
|
|
|
options = options.filter(vnode => !(typeof vnode.type === 'symbol' && vnode.type.description === 'v-cmt' && vnode.children === 'v-if'));
|
|
|
|
|
2023-05-14 03:23:39 +00:00
|
|
|
return () => h('div', {
|
2022-06-28 13:32:01 +00:00
|
|
|
class: 'novjtcto',
|
2020-11-25 12:31:34 +00:00
|
|
|
}, [
|
2021-11-28 11:07:37 +00:00
|
|
|
...(label ? [h('div', {
|
2022-06-28 13:32:01 +00:00
|
|
|
class: 'label',
|
2023-04-15 12:35:19 +00:00
|
|
|
}, label)] : []),
|
2021-11-28 11:07:37 +00:00
|
|
|
h('div', {
|
2022-06-28 13:32:01 +00:00
|
|
|
class: 'body',
|
2021-11-28 11:07:37 +00:00
|
|
|
}, options.map(option => h(MkRadio, {
|
2024-01-30 10:53:53 +00:00
|
|
|
key: option.key as string,
|
2023-04-15 12:35:19 +00:00
|
|
|
value: option.props?.value,
|
2024-07-30 06:51:08 +00:00
|
|
|
disabled: option.props?.disabled,
|
2023-05-14 03:23:39 +00:00
|
|
|
modelValue: value.value,
|
|
|
|
'onUpdate:modelValue': _v => value.value = _v,
|
2023-04-15 12:35:19 +00:00
|
|
|
}, () => option.children)),
|
2021-11-28 11:07:37 +00:00
|
|
|
),
|
|
|
|
...(caption ? [h('div', {
|
2022-06-28 13:32:01 +00:00
|
|
|
class: 'caption',
|
2023-04-15 12:35:19 +00:00
|
|
|
}, caption)] : []),
|
2020-11-25 12:31:34 +00:00
|
|
|
]);
|
2022-06-28 13:32:01 +00:00
|
|
|
},
|
2020-11-25 12:31:34 +00:00
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss">
|
2021-09-29 15:50:45 +00:00
|
|
|
.novjtcto {
|
2021-11-28 11:07:37 +00:00
|
|
|
> .label {
|
|
|
|
font-size: 0.85em;
|
|
|
|
padding: 0 0 8px 0;
|
|
|
|
user-select: none;
|
|
|
|
|
|
|
|
&:empty {
|
|
|
|
display: none;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
> .body {
|
2022-06-28 13:32:01 +00:00
|
|
|
display: flex;
|
|
|
|
gap: 12px;
|
|
|
|
flex-wrap: wrap;
|
2021-09-29 15:50:45 +00:00
|
|
|
}
|
2020-11-25 12:31:34 +00:00
|
|
|
|
2021-11-28 11:07:37 +00:00
|
|
|
> .caption {
|
|
|
|
font-size: 0.85em;
|
|
|
|
padding: 8px 0 0 0;
|
2024-10-09 09:08:14 +00:00
|
|
|
color: var(--MI_THEME-fgTransparentWeak);
|
2021-11-28 11:07:37 +00:00
|
|
|
|
|
|
|
&:empty {
|
|
|
|
display: none;
|
|
|
|
}
|
2020-11-25 12:31:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|