ropav 0.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/README.md +31 -0
- package/dist/_plugin-vue_export-helper.js +18 -0
- package/dist/_plugin-vue_export-helper.js.map +1 -0
- package/dist/base.css +147 -0
- package/dist/button.css +66 -0
- package/dist/button.js +62 -0
- package/dist/button.js.map +1 -0
- package/dist/checkbox.css +60 -0
- package/dist/checkbox.js +132 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/components/_internal/icons/CheckIcon.d.ts +18 -0
- package/dist/components/_internal/icons/ChevronDownIcon.d.ts +18 -0
- package/dist/components/_internal/icons/MinusIcon.d.ts +18 -0
- package/dist/components/_internal/icons/index.d.ts +3 -0
- package/dist/components/_internal/optionList.d.ts +9 -0
- package/dist/components/button/button.d.ts +25 -0
- package/dist/components/button/index.d.ts +2 -0
- package/dist/components/button/index.js +2 -0
- package/dist/components/button/types.d.ts +6 -0
- package/dist/components/checkbox/checkbox.d.ts +23 -0
- package/dist/components/checkbox/index.d.ts +2 -0
- package/dist/components/checkbox/index.js +2 -0
- package/dist/components/checkbox/types.d.ts +12 -0
- package/dist/components/checkbox/useCheckbox.d.ts +6 -0
- package/dist/components/input/index.d.ts +2 -0
- package/dist/components/input/index.js +2 -0
- package/dist/components/input/input.d.ts +21 -0
- package/dist/components/input/types.d.ts +14 -0
- package/dist/components/radio/index.d.ts +3 -0
- package/dist/components/radio/index.js +2 -0
- package/dist/components/radio/radio-group.d.ts +23 -0
- package/dist/components/radio/radio.d.ts +21 -0
- package/dist/components/radio/types.d.ts +24 -0
- package/dist/components/radio/useRadio.d.ts +12 -0
- package/dist/components/select/index.d.ts +2 -0
- package/dist/components/select/index.js +2 -0
- package/dist/components/select/select.d.ts +23 -0
- package/dist/components/select/types.d.ts +18 -0
- package/dist/components/select/useSelect.d.ts +21 -0
- package/dist/components/switch/index.d.ts +2 -0
- package/dist/components/switch/index.js +2 -0
- package/dist/components/switch/switch.d.ts +23 -0
- package/dist/components/switch/types.d.ts +11 -0
- package/dist/components/switch/useSwitch.d.ts +6 -0
- package/dist/components/tabs/index.d.ts +5 -0
- package/dist/components/tabs/index.js +2 -0
- package/dist/components/tabs/tab-panel.d.ts +21 -0
- package/dist/components/tabs/tabs-list.d.ts +20 -0
- package/dist/components/tabs/tabs-trigger.d.ts +21 -0
- package/dist/components/tabs/tabs.d.ts +23 -0
- package/dist/components/tabs/types.d.ts +18 -0
- package/dist/components/tabs/useTabs.d.ts +19 -0
- package/dist/components/textarea/index.d.ts +2 -0
- package/dist/components/textarea/index.js +2 -0
- package/dist/components/textarea/textarea.d.ts +21 -0
- package/dist/components/textarea/types.d.ts +14 -0
- package/dist/components/textarea/useTextarea.d.ts +6 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +2 -0
- package/dist/components/tooltip/tooltip.d.ts +23 -0
- package/dist/components/tooltip/types.d.ts +5 -0
- package/dist/components/tooltip/useTooltip.d.ts +8 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +10 -0
- package/dist/input.css +51 -0
- package/dist/input.js +79 -0
- package/dist/input.js.map +1 -0
- package/dist/radio.css +66 -0
- package/dist/radio.js +160 -0
- package/dist/radio.js.map +1 -0
- package/dist/select.css +122 -0
- package/dist/select.js +362 -0
- package/dist/select.js.map +1 -0
- package/dist/switch.css +70 -0
- package/dist/switch.js +94 -0
- package/dist/switch.js.map +1 -0
- package/dist/tabs.css +45 -0
- package/dist/tabs.js +205 -0
- package/dist/tabs.js.map +1 -0
- package/dist/textarea.css +46 -0
- package/dist/textarea.js +91 -0
- package/dist/textarea.js.map +1 -0
- package/dist/tooltip.css +78 -0
- package/dist/tooltip.js +112 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/useControlState.js +38 -0
- package/dist/useControlState.js.map +1 -0
- package/dist/useRequiredInject.js +11 -0
- package/dist/useRequiredInject.js.map +1 -0
- package/package.json +110 -0
- package/src/styles/_mixins.scss +128 -0
- package/src/styles/_tokens.scss +184 -0
- package/src/styles/_variables.scss +112 -0
- package/src/styles/base.scss +1 -0
package/dist/input.css
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
.rp-input[data-v-7e1222cc] {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
justify-content: center;
|
|
5
|
+
box-sizing: border-box;
|
|
6
|
+
gap: var(--rp-spacing-2);
|
|
7
|
+
font-family: var(--rp-font-family);
|
|
8
|
+
font-weight: var(--rp-font-weight-normal);
|
|
9
|
+
background-color: var(--rp-color-control-bg);
|
|
10
|
+
border: var(--rp-border-width-thin) solid var(--rp-color-control-border);
|
|
11
|
+
transition: border-color var(--rp-transition-fast), box-shadow var(--rp-transition-fast);
|
|
12
|
+
}
|
|
13
|
+
.rp-input[data-v-7e1222cc]:hover:not(.rp-input--disabled) {
|
|
14
|
+
border-color: var(--rp-color-control-border-hover);
|
|
15
|
+
}
|
|
16
|
+
.rp-input[data-v-7e1222cc]:focus-within:not(.rp-input--disabled) {
|
|
17
|
+
border-color: var(--rp-color-control-border-focus);
|
|
18
|
+
box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
|
|
19
|
+
}
|
|
20
|
+
.rp-input[data-v-7e1222cc] {
|
|
21
|
+
height: var(--rp-size-control-md);
|
|
22
|
+
padding: 0 var(--rp-spacing-4);
|
|
23
|
+
font-size: var(--rp-font-size-base);
|
|
24
|
+
border-radius: var(--rp-radius-lg);
|
|
25
|
+
}
|
|
26
|
+
.rp-input--disabled[data-v-7e1222cc] {
|
|
27
|
+
opacity: var(--rp-opacity-disabled);
|
|
28
|
+
cursor: not-allowed;
|
|
29
|
+
}
|
|
30
|
+
.rp-input--invalid[data-v-7e1222cc] {
|
|
31
|
+
border-color: var(--rp-color-danger-fg);
|
|
32
|
+
}
|
|
33
|
+
.rp-input--readonly[data-v-7e1222cc] {
|
|
34
|
+
background-color: var(--rp-color-control-readonly-bg);
|
|
35
|
+
}
|
|
36
|
+
.rp-input__native[data-v-7e1222cc] {
|
|
37
|
+
flex: 1;
|
|
38
|
+
min-width: 0;
|
|
39
|
+
border: none;
|
|
40
|
+
outline: none;
|
|
41
|
+
background: transparent;
|
|
42
|
+
font: inherit;
|
|
43
|
+
color: var(--rp-color-control-fg);
|
|
44
|
+
line-height: var(--rp-line-height-none);
|
|
45
|
+
}
|
|
46
|
+
.rp-input__native[data-v-7e1222cc]::placeholder {
|
|
47
|
+
color: var(--rp-color-control-placeholder);
|
|
48
|
+
}
|
|
49
|
+
.rp-input__native[data-v-7e1222cc]:disabled {
|
|
50
|
+
cursor: not-allowed;
|
|
51
|
+
}
|
package/dist/input.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import './input.css';
|
|
2
|
+
import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
|
|
3
|
+
import { t as useControlState } from "./useControlState.js";
|
|
4
|
+
import { child, computed, createInvoker, defineVaporComponent, delegateEvents, renderEffect, setAttr, setClass, setProp, setValue, template, unref } from "vue";
|
|
5
|
+
//#region src/components/input/input.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
6
|
+
var t0 = template("<div data-v-7e1222cc><input data-v-7e1222cc class=rp-input__native>", 1);
|
|
7
|
+
delegateEvents("input");
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/components/input/input.vue
|
|
10
|
+
var input_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
|
|
11
|
+
name: "RpInput",
|
|
12
|
+
__name: "input",
|
|
13
|
+
props: {
|
|
14
|
+
id: {},
|
|
15
|
+
name: {},
|
|
16
|
+
modelValue: {},
|
|
17
|
+
type: { default: "text" },
|
|
18
|
+
placeholder: { default: "" },
|
|
19
|
+
disabled: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
default: void 0
|
|
22
|
+
},
|
|
23
|
+
readonly: {
|
|
24
|
+
type: Boolean,
|
|
25
|
+
default: false
|
|
26
|
+
},
|
|
27
|
+
required: {
|
|
28
|
+
type: Boolean,
|
|
29
|
+
default: void 0
|
|
30
|
+
},
|
|
31
|
+
invalid: {
|
|
32
|
+
type: Boolean,
|
|
33
|
+
default: void 0
|
|
34
|
+
},
|
|
35
|
+
ariaLabel: {},
|
|
36
|
+
describedby: {},
|
|
37
|
+
labelledby: {}
|
|
38
|
+
},
|
|
39
|
+
emits: ["update:modelValue"],
|
|
40
|
+
setup(__props, { emit: __emit }) {
|
|
41
|
+
const props = __props;
|
|
42
|
+
const emit = __emit;
|
|
43
|
+
const control = useControlState(props);
|
|
44
|
+
const rootClass = computed(() => bem("rp-input", {
|
|
45
|
+
disabled: control.disabled,
|
|
46
|
+
invalid: control.invalid,
|
|
47
|
+
readonly: props.readonly
|
|
48
|
+
}));
|
|
49
|
+
function onInput(e) {
|
|
50
|
+
emit("update:modelValue", e.target.value);
|
|
51
|
+
}
|
|
52
|
+
const n1 = t0();
|
|
53
|
+
const n0 = child(n1);
|
|
54
|
+
n0.$evtinput = createInvoker(onInput);
|
|
55
|
+
renderEffect(() => {
|
|
56
|
+
const _control = unref(control);
|
|
57
|
+
const _control_required = _control.required;
|
|
58
|
+
setClass(n1, rootClass.value);
|
|
59
|
+
setProp(n0, "id", _control.id);
|
|
60
|
+
setProp(n0, "name", __props.name);
|
|
61
|
+
setProp(n0, "type", __props.type);
|
|
62
|
+
setValue(n0, __props.modelValue);
|
|
63
|
+
setProp(n0, "placeholder", __props.placeholder);
|
|
64
|
+
setProp(n0, "disabled", _control.disabled || void 0);
|
|
65
|
+
setProp(n0, "readonly", __props.readonly || void 0);
|
|
66
|
+
setProp(n0, "required", _control_required || void 0);
|
|
67
|
+
setAttr(n0, "aria-label", __props.ariaLabel || void 0);
|
|
68
|
+
setAttr(n0, "aria-labelledby", _control.ariaLabelledby);
|
|
69
|
+
setAttr(n0, "aria-describedby", _control.ariaDescribedby);
|
|
70
|
+
setAttr(n0, "aria-invalid", _control.invalid || void 0);
|
|
71
|
+
setAttr(n0, "aria-required", _control_required || void 0);
|
|
72
|
+
});
|
|
73
|
+
return n1;
|
|
74
|
+
}
|
|
75
|
+
}), [["__scopeId", "data-v-7e1222cc"]]);
|
|
76
|
+
//#endregion
|
|
77
|
+
export { input_default as t };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","names":[],"sources":["../src/components/input/input.vue","../src/components/input/input.vue"],"sourcesContent":["<template>\n <div :class=\"rootClass\">\n <input\n :id=\"control.id\"\n :name=\"name\"\n class=\"rp-input__native\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"control.disabled || undefined\"\n :readonly=\"readonly || undefined\"\n :required=\"control.required || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n @input=\"onInput\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { bem } from '@/utils/bem';\nimport type { InputProps } from './types';\n\ndefineOptions({ name: 'RpInput' });\n\nconst props = withDefaults(defineProps<InputProps>(), {\n type: 'text',\n placeholder: '',\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n readonly: false,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n}>();\n\nconst control = useControlState(props);\n\nconst rootClass = computed(() =>\n bem('rp-input', {\n disabled: control.disabled,\n invalid: control.invalid,\n readonly: props.readonly,\n }),\n);\n\nfunction onInput(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).value);\n}\n</script>\n\n<style src=\"./input.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\">\n <input\n :id=\"control.id\"\n :name=\"name\"\n class=\"rp-input__native\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"control.disabled || undefined\"\n :readonly=\"readonly || undefined\"\n :required=\"control.required || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n @input=\"onInput\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { bem } from '@/utils/bem';\nimport type { InputProps } from './types';\n\ndefineOptions({ name: 'RpInput' });\n\nconst props = withDefaults(defineProps<InputProps>(), {\n type: 'text',\n placeholder: '',\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n readonly: false,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n}>();\n\nconst control = useControlState(props);\n\nconst rootClass = computed(() =>\n bem('rp-input', {\n disabled: control.disabled,\n invalid: control.invalid,\n readonly: props.readonly,\n }),\n);\n\nfunction onInput(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).value);\n}\n</script>\n\n<style src=\"./input.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EASd,MAAM,OAAO;EAIb,MAAM,UAAU,gBAAgB,KAAK;EAErC,MAAM,YAAY,eACd,IAAI,YAAY;GACZ,UAAU,QAAQ;GAClB,SAAS,QAAQ;GACjB,UAAU,MAAM;EACpB,CAAC,CACL;EAEA,SAAS,QAAQ,GAAU;GACvB,KAAK,qBAAsB,EAAE,OAA4B,KAAK;EAClE;;;+BAtCoB,OAAO;;;;gBAhBV,UAAA,KAAS;eAEb,MAAI,SAAO,EAAA;eACX,QAAM,QAAA,IAAI;eAEV,QAAM,QAAA,IAAI;gBACH,QAAA,UAAU;eACjB,eAAa,QAAA,WAAW;eACxB,YAAU,SAAO,YAAa,KAAA,CAAS;eACvC,YAAU,QAAA,YAAY,KAAA,CAAS;eAC/B,YAAU,qBAAoB,KAAA,CAAS;eACvC,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,mBAAiB,SAAO,cAAA;eACxB,oBAAkB,SAAO,eAAA;eACzB,gBAAc,SAAO,WAAY,KAAA,CAAS;eAC1C,iBAAe,qBAAoB,KAAA,CAAS"}
|
package/dist/radio.css
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
.rp-radio[data-v-67524919] {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
cursor: pointer;
|
|
5
|
+
font-family: var(--rp-font-family);
|
|
6
|
+
user-select: none;
|
|
7
|
+
}
|
|
8
|
+
.rp-radio--disabled[data-v-67524919] {
|
|
9
|
+
opacity: var(--rp-opacity-disabled);
|
|
10
|
+
cursor: not-allowed;
|
|
11
|
+
}
|
|
12
|
+
.rp-radio[data-v-67524919] {
|
|
13
|
+
gap: var(--rp-spacing-2);
|
|
14
|
+
font-size: var(--rp-font-size-base);
|
|
15
|
+
--_radio-size: 18px;
|
|
16
|
+
--_radio-dot: 8px;
|
|
17
|
+
}
|
|
18
|
+
.rp-radio__native[data-v-67524919] {
|
|
19
|
+
position: absolute;
|
|
20
|
+
width: 1px;
|
|
21
|
+
height: 1px;
|
|
22
|
+
padding: 0;
|
|
23
|
+
margin: -1px;
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
clip: rect(0, 0, 0, 0);
|
|
26
|
+
white-space: nowrap;
|
|
27
|
+
border-width: 0;
|
|
28
|
+
pointer-events: none;
|
|
29
|
+
}
|
|
30
|
+
.rp-radio__dot[data-v-67524919] {
|
|
31
|
+
display: inline-flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: center;
|
|
34
|
+
width: var(--_radio-size);
|
|
35
|
+
height: var(--_radio-size);
|
|
36
|
+
flex-shrink: 0;
|
|
37
|
+
border: var(--rp-border-width-medium) solid var(--rp-color-control-border);
|
|
38
|
+
border-radius: var(--rp-radius-full);
|
|
39
|
+
background-color: var(--rp-color-control-bg);
|
|
40
|
+
transition: background-color var(--rp-transition-fast), border-color var(--rp-transition-fast);
|
|
41
|
+
}
|
|
42
|
+
.rp-radio__dot[data-v-67524919]::after {
|
|
43
|
+
content: "";
|
|
44
|
+
width: var(--_radio-dot);
|
|
45
|
+
height: var(--_radio-dot);
|
|
46
|
+
border-radius: var(--rp-radius-full);
|
|
47
|
+
background-color: var(--rp-color-control-selected-fg);
|
|
48
|
+
transform: scale(0);
|
|
49
|
+
transition: transform var(--rp-transition-fast);
|
|
50
|
+
}
|
|
51
|
+
.rp-radio--checked .rp-radio__dot[data-v-67524919] {
|
|
52
|
+
background-color: var(--rp-color-control-selected-bg);
|
|
53
|
+
border-color: var(--rp-color-control-selected-bg);
|
|
54
|
+
}
|
|
55
|
+
.rp-radio--checked .rp-radio__dot[data-v-67524919]::after {
|
|
56
|
+
transform: scale(1);
|
|
57
|
+
}
|
|
58
|
+
.rp-radio__label[data-v-67524919] {
|
|
59
|
+
line-height: var(--rp-line-height-normal);
|
|
60
|
+
color: var(--rp-color-text);
|
|
61
|
+
}.rp-radio-group[data-v-ba5e60e5] {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
gap: var(--rp-spacing-3);
|
|
65
|
+
font-family: var(--rp-font-family);
|
|
66
|
+
}
|
package/dist/radio.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import './radio.css';
|
|
2
|
+
import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
|
|
3
|
+
import { t as useControlState } from "./useControlState.js";
|
|
4
|
+
import { t as useRequiredInject } from "./useRequiredInject.js";
|
|
5
|
+
import { child, computed, createIf, createSlot, defineVaporComponent, on, provide, renderEffect, setAttr, setClass, setInsertionState, setProp, setValue, template, unref, useId } from "vue";
|
|
6
|
+
//#region src/components/radio/types.ts
|
|
7
|
+
var radioGroupKey = Symbol("radioGroup");
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/components/radio/useRadio.ts
|
|
10
|
+
function useRadio(props) {
|
|
11
|
+
const group = useRequiredInject(radioGroupKey, "RpRadio");
|
|
12
|
+
const isChecked = computed(() => group.modelValue === props.value);
|
|
13
|
+
const isDisabled = computed(() => props.disabled || group.disabled);
|
|
14
|
+
const rootClass = computed(() => bem("rp-radio", {
|
|
15
|
+
checked: isChecked.value,
|
|
16
|
+
disabled: isDisabled.value
|
|
17
|
+
}));
|
|
18
|
+
function onSelect() {
|
|
19
|
+
if (isDisabled.value) return;
|
|
20
|
+
group.select(props.value);
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
group,
|
|
24
|
+
isChecked,
|
|
25
|
+
isDisabled,
|
|
26
|
+
rootClass,
|
|
27
|
+
onSelect
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function useRadioGroup(props, emitUpdate) {
|
|
31
|
+
const control = useControlState(props);
|
|
32
|
+
const rootClass = computed(() => bem("rp-radio-group", {
|
|
33
|
+
disabled: control.disabled,
|
|
34
|
+
invalid: control.invalid
|
|
35
|
+
}));
|
|
36
|
+
const generatedName = useId();
|
|
37
|
+
const groupName = computed(() => props.name ?? `${control.id ?? generatedName}-radio`);
|
|
38
|
+
provide(radioGroupKey, {
|
|
39
|
+
get modelValue() {
|
|
40
|
+
return props.modelValue;
|
|
41
|
+
},
|
|
42
|
+
get name() {
|
|
43
|
+
return groupName.value;
|
|
44
|
+
},
|
|
45
|
+
get disabled() {
|
|
46
|
+
return control.disabled;
|
|
47
|
+
},
|
|
48
|
+
get required() {
|
|
49
|
+
return control.required;
|
|
50
|
+
},
|
|
51
|
+
select(value) {
|
|
52
|
+
emitUpdate(value);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
control,
|
|
57
|
+
rootClass
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/components/radio/radio.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
62
|
+
var t0$1 = template("<span data-v-67524919 class=rp-radio__label>");
|
|
63
|
+
var t1 = template("<label data-v-67524919><input data-v-67524919 type=radio class=rp-radio__native><span data-v-67524919 class=rp-radio__dot></span>", 1);
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/components/radio/radio.vue
|
|
66
|
+
var radio_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
|
|
67
|
+
name: "RpRadio",
|
|
68
|
+
__name: "radio",
|
|
69
|
+
props: {
|
|
70
|
+
value: {},
|
|
71
|
+
disabled: {
|
|
72
|
+
type: Boolean,
|
|
73
|
+
default: false
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
setup(__props, { slots: $slots }) {
|
|
77
|
+
const { group, isChecked, isDisabled, rootClass, onSelect } = useRadio(__props);
|
|
78
|
+
const n5 = t1();
|
|
79
|
+
const n0 = child(n5);
|
|
80
|
+
on(n0, "change", (e) => unref(onSelect)(e));
|
|
81
|
+
renderEffect(() => {
|
|
82
|
+
const _isChecked = unref(isChecked);
|
|
83
|
+
const _group = unref(group);
|
|
84
|
+
setClass(n5, unref(rootClass));
|
|
85
|
+
setAttr(n5, "data-disabled", unref(isDisabled) || void 0);
|
|
86
|
+
setAttr(n5, "data-state", _isChecked ? "checked" : "unchecked");
|
|
87
|
+
setProp(n0, "name", _group.name);
|
|
88
|
+
setValue(n0, __props.value);
|
|
89
|
+
setProp(n0, "checked", _isChecked);
|
|
90
|
+
setProp(n0, "disabled", unref(isDisabled) || void 0);
|
|
91
|
+
setProp(n0, "required", _group.required || void 0);
|
|
92
|
+
});
|
|
93
|
+
setInsertionState(n5, null, 2);
|
|
94
|
+
createIf(() => $slots.default, () => {
|
|
95
|
+
const n4 = t0$1();
|
|
96
|
+
setInsertionState(n4, null, 0);
|
|
97
|
+
createSlot("default", null, null, 1);
|
|
98
|
+
return n4;
|
|
99
|
+
});
|
|
100
|
+
return n5;
|
|
101
|
+
}
|
|
102
|
+
}), [["__scopeId", "data-v-67524919"]]);
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/components/radio/radio-group.vue?vue&type=script&setup=true&vapor=true&lang.ts
|
|
105
|
+
var t0 = template("<div data-v-ba5e60e5 role=radiogroup>", 1);
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region src/components/radio/radio-group.vue
|
|
108
|
+
var radio_group_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
|
|
109
|
+
name: "RpRadioGroup",
|
|
110
|
+
__name: "radio-group",
|
|
111
|
+
props: {
|
|
112
|
+
id: {},
|
|
113
|
+
name: {},
|
|
114
|
+
modelValue: {},
|
|
115
|
+
disabled: {
|
|
116
|
+
type: Boolean,
|
|
117
|
+
default: void 0
|
|
118
|
+
},
|
|
119
|
+
required: {
|
|
120
|
+
type: Boolean,
|
|
121
|
+
default: void 0
|
|
122
|
+
},
|
|
123
|
+
invalid: {
|
|
124
|
+
type: Boolean,
|
|
125
|
+
default: void 0
|
|
126
|
+
},
|
|
127
|
+
ariaLabel: {},
|
|
128
|
+
describedby: {},
|
|
129
|
+
labelledby: {}
|
|
130
|
+
},
|
|
131
|
+
emits: ["update:modelValue"],
|
|
132
|
+
setup(__props, { emit: __emit }) {
|
|
133
|
+
const props = __props;
|
|
134
|
+
const emit = __emit;
|
|
135
|
+
const { control, rootClass } = useRadioGroup(props, (value) => {
|
|
136
|
+
emit("update:modelValue", value);
|
|
137
|
+
});
|
|
138
|
+
const n1 = t0();
|
|
139
|
+
renderEffect(() => {
|
|
140
|
+
const _control = unref(control);
|
|
141
|
+
const _control_invalid = _control.invalid;
|
|
142
|
+
setProp(n1, "id", _control.id);
|
|
143
|
+
setClass(n1, unref(rootClass));
|
|
144
|
+
setAttr(n1, "data-disabled", _control.disabled || void 0);
|
|
145
|
+
setAttr(n1, "data-invalid", _control_invalid || void 0);
|
|
146
|
+
setAttr(n1, "aria-label", __props.ariaLabel || void 0);
|
|
147
|
+
setAttr(n1, "aria-labelledby", _control.ariaLabelledby);
|
|
148
|
+
setAttr(n1, "aria-describedby", _control.ariaDescribedby);
|
|
149
|
+
setAttr(n1, "aria-invalid", _control_invalid || void 0);
|
|
150
|
+
setAttr(n1, "aria-required", _control.required || void 0);
|
|
151
|
+
});
|
|
152
|
+
setInsertionState(n1, null, 0);
|
|
153
|
+
createSlot("default", null, null, 1);
|
|
154
|
+
return n1;
|
|
155
|
+
}
|
|
156
|
+
}), [["__scopeId", "data-v-ba5e60e5"]]);
|
|
157
|
+
//#endregion
|
|
158
|
+
export { radio_default as n, radio_group_default as t };
|
|
159
|
+
|
|
160
|
+
//# sourceMappingURL=radio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.js","names":[],"sources":["../src/components/radio/types.ts","../src/components/radio/useRadio.ts","../src/components/radio/radio.vue","../src/components/radio/radio.vue","../src/components/radio/radio-group.vue","../src/components/radio/radio-group.vue"],"sourcesContent":["import type { InjectionKey } from 'vue';\n\nexport interface RadioProps {\n value: string | number;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n id?: string;\n name?: string;\n modelValue: string | number | null;\n disabled?: boolean;\n required?: boolean;\n invalid?: boolean;\n ariaLabel?: string;\n describedby?: string;\n labelledby?: string;\n}\n\nexport interface RadioGroupContext {\n modelValue: string | number | null;\n name: string;\n disabled: boolean;\n required: boolean;\n select: (value: string | number) => void;\n}\n\nexport const radioGroupKey = Symbol('radioGroup') as InjectionKey<RadioGroupContext>;\n","import { computed, provide, useId } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { useRequiredInject } from '@/composables/useRequiredInject';\nimport { bem } from '@/utils/bem';\nimport { radioGroupKey } from './types';\nimport type { RadioGroupContext, RadioGroupProps, RadioProps } from './types';\n\nexport function useRadio(props: Readonly<RadioProps>) {\n const group = useRequiredInject(radioGroupKey, 'RpRadio');\n const isChecked = computed(() => group.modelValue === props.value);\n const isDisabled = computed(() => props.disabled || group.disabled);\n\n const rootClass = computed(() =>\n bem('rp-radio', {\n checked: isChecked.value,\n disabled: isDisabled.value,\n }),\n );\n\n function onSelect() {\n if (isDisabled.value) return;\n group.select(props.value);\n }\n\n return {\n group,\n isChecked,\n isDisabled,\n rootClass,\n onSelect,\n };\n}\n\nexport function useRadioGroup(\n props: Readonly<RadioGroupProps>,\n emitUpdate: (value: string | number | null) => void,\n) {\n const control = useControlState(props);\n\n const rootClass = computed(() =>\n bem('rp-radio-group', {\n disabled: control.disabled,\n invalid: control.invalid,\n }),\n );\n\n const generatedName = useId();\n const groupName = computed(() => props.name ?? `${control.id ?? generatedName}-radio`);\n\n provide<RadioGroupContext>(radioGroupKey, {\n get modelValue() { return props.modelValue; },\n get name() { return groupName.value; },\n get disabled() { return control.disabled; },\n get required() { return control.required; },\n select(value) {\n emitUpdate(value);\n },\n });\n\n return {\n control,\n rootClass,\n };\n}\n","<template>\n <label :class=\"rootClass\" :data-disabled=\"isDisabled || undefined\" :data-state=\"isChecked ? 'checked' : 'unchecked'\">\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label :class=\"rootClass\" :data-disabled=\"isDisabled || undefined\" :data-state=\"isChecked ? 'checked' : 'unchecked'\">\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;AA2BA,IAAa,gBAAgB,OAAO,YAAY;;;ACpBhD,SAAgB,SAAS,OAA6B;CAClD,MAAM,QAAQ,kBAAkB,eAAe,SAAS;CACxD,MAAM,YAAY,eAAe,MAAM,eAAe,MAAM,KAAK;CACjE,MAAM,aAAa,eAAe,MAAM,YAAY,MAAM,QAAQ;CAElE,MAAM,YAAY,eACd,IAAI,YAAY;EACZ,SAAS,UAAU;EACnB,UAAU,WAAW;CACzB,CAAC,CACL;CAEA,SAAS,WAAW;EAChB,IAAI,WAAW,OAAO;EACtB,MAAM,OAAO,MAAM,KAAK;CAC5B;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;CACJ;AACJ;AAEA,SAAgB,cACZ,OACA,YACF;CACE,MAAM,UAAU,gBAAgB,KAAK;CAErC,MAAM,YAAY,eACd,IAAI,kBAAkB;EAClB,UAAU,QAAQ;EAClB,SAAS,QAAQ;CACrB,CAAC,CACL;CAEA,MAAM,gBAAgB,MAAM;CAC5B,MAAM,YAAY,eAAe,MAAM,QAAQ,GAAG,QAAQ,MAAM,cAAc,OAAO;CAErF,QAA2B,eAAe;EACtC,IAAI,aAAa;GAAE,OAAO,MAAM;EAAY;EAC5C,IAAI,OAAO;GAAE,OAAO,UAAU;EAAO;EACrC,IAAI,WAAW;GAAE,OAAO,QAAQ;EAAU;EAC1C,IAAI,WAAW;GAAE,OAAO,QAAQ;EAAU;EAC1C,OAAO,OAAO;GACV,WAAW,KAAK;EACpB;CACJ,CAAC;CAED,OAAO;EACH;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;EClCA,MAAM,EAAE,OAAO,WAAW,YAAY,WAAW,aAAa,SAAS,OAAK;;;SAnB/D,WAAM,MAAE,MAAA,QAAA,CAAQ,CAAA,CAAA,CAAA;;;;gBATV,MAAA,SAAA,CAAS;eAAG,iBAAe,MAAA,UAAA,KAAc,KAAA,CAAS;eAAG,cAAY,aAAS,YAAA,WAAA;eAIhF,QAAM,OAAK,IAAA;gBACJ,QAAA,KAAK;eACZ,WAAS,UAAS;eAClB,YAAU,MAAA,UAAA,KAAc,KAAA,CAAS;eACjC,YAAU,OAAK,YAAa,KAAA,CAAS;;;iBAI9B,OAAM,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEU1B,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,cAAc,cAAc,QAAQ,UAAU;GAC3D,KAAK,qBAAqB,KAAK;EACnC,CAAC;;;;;eAjCQ,MAAI,SAAO,EAAA;gBACJ,MAAA,SAAA,CAAS;eAEhB,iBAAe,SAAO,YAAa,KAAA,CAAS;eAC5C,gBAAc,oBAAmB,KAAA,CAAS;eAC1C,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,mBAAiB,SAAO,cAAA;eACxB,oBAAkB,SAAO,eAAA;eACzB,gBAAc,oBAAmB,KAAA,CAAS;eAC1C,iBAAe,SAAO,YAAa,KAAA,CAAS"}
|
package/dist/select.css
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
.rp-select[data-v-692ef421] {
|
|
2
|
+
position: relative;
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
font-family: var(--rp-font-family);
|
|
5
|
+
font-weight: var(--rp-font-weight-normal);
|
|
6
|
+
line-height: var(--rp-line-height-none);
|
|
7
|
+
}
|
|
8
|
+
.rp-select--disabled[data-v-692ef421] {
|
|
9
|
+
opacity: var(--rp-opacity-disabled);
|
|
10
|
+
cursor: not-allowed;
|
|
11
|
+
}
|
|
12
|
+
.rp-select__trigger[data-v-692ef421] {
|
|
13
|
+
display: inline-flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
justify-content: space-between;
|
|
17
|
+
width: 100%;
|
|
18
|
+
min-width: var(--rp-component-menu-min-width);
|
|
19
|
+
height: var(--rp-size-control-md);
|
|
20
|
+
padding: 0 var(--rp-spacing-4);
|
|
21
|
+
font-size: var(--rp-font-size-base);
|
|
22
|
+
background-color: var(--rp-color-control-bg);
|
|
23
|
+
border: var(--rp-border-width-thin) solid var(--rp-color-control-border);
|
|
24
|
+
border-radius: var(--rp-radius-lg);
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
transition: border-color var(--rp-transition-fast), box-shadow var(--rp-transition-fast);
|
|
27
|
+
gap: var(--rp-spacing-2);
|
|
28
|
+
}
|
|
29
|
+
.rp-select__trigger[data-v-692ef421]:hover {
|
|
30
|
+
border-color: var(--rp-color-control-border-hover);
|
|
31
|
+
}
|
|
32
|
+
.rp-select__trigger[data-v-692ef421]:focus-visible {
|
|
33
|
+
outline: none;
|
|
34
|
+
border-color: var(--rp-color-control-border-focus);
|
|
35
|
+
box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
|
|
36
|
+
}
|
|
37
|
+
.rp-select--open .rp-select__trigger[data-v-692ef421] {
|
|
38
|
+
border-color: var(--rp-color-control-border-focus);
|
|
39
|
+
box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
|
|
40
|
+
}
|
|
41
|
+
.rp-select--invalid .rp-select__trigger[data-v-692ef421] {
|
|
42
|
+
border-color: var(--rp-color-danger-fg);
|
|
43
|
+
}
|
|
44
|
+
.rp-select__value[data-v-692ef421] {
|
|
45
|
+
flex: 1;
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
text-overflow: ellipsis;
|
|
48
|
+
white-space: nowrap;
|
|
49
|
+
color: var(--rp-color-control-fg);
|
|
50
|
+
}
|
|
51
|
+
.rp-select__placeholder[data-v-692ef421] {
|
|
52
|
+
color: var(--rp-color-control-placeholder);
|
|
53
|
+
}
|
|
54
|
+
.rp-select__arrow[data-v-692ef421] {
|
|
55
|
+
display: inline-flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
width: 1em;
|
|
58
|
+
height: 1em;
|
|
59
|
+
flex-shrink: 0;
|
|
60
|
+
}
|
|
61
|
+
.rp-select__arrow svg[data-v-692ef421] {
|
|
62
|
+
width: 100%;
|
|
63
|
+
height: 100%;
|
|
64
|
+
}
|
|
65
|
+
.rp-select__arrow[data-v-692ef421] {
|
|
66
|
+
color: var(--rp-color-control-icon);
|
|
67
|
+
transition: transform var(--rp-transition-fast);
|
|
68
|
+
}
|
|
69
|
+
.rp-select__arrow--open[data-v-692ef421] {
|
|
70
|
+
transform: rotate(180deg);
|
|
71
|
+
}
|
|
72
|
+
.rp-select__dropdown[data-v-692ef421] {
|
|
73
|
+
position: absolute;
|
|
74
|
+
top: calc(100% + var(--rp-spacing-1));
|
|
75
|
+
left: 0;
|
|
76
|
+
right: 0;
|
|
77
|
+
z-index: var(--rp-z-index-dropdown);
|
|
78
|
+
background-color: var(--rp-color-surface-raised);
|
|
79
|
+
border: var(--rp-border-width-thin) solid var(--rp-color-border);
|
|
80
|
+
border-radius: var(--rp-radius-lg);
|
|
81
|
+
box-shadow: var(--rp-shadow-md);
|
|
82
|
+
padding: var(--rp-spacing-1) 0;
|
|
83
|
+
max-height: var(--rp-component-menu-max-height);
|
|
84
|
+
overflow-y: auto;
|
|
85
|
+
}
|
|
86
|
+
.rp-select__option[data-v-692ef421] {
|
|
87
|
+
display: flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
padding: var(--rp-spacing-2) var(--rp-spacing-4);
|
|
90
|
+
font-size: var(--rp-font-size-base);
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
transition: background-color var(--rp-transition-fast), color var(--rp-transition-fast);
|
|
93
|
+
color: var(--rp-color-text);
|
|
94
|
+
}
|
|
95
|
+
.rp-select__option--focused[data-v-692ef421] {
|
|
96
|
+
background-color: var(--rp-color-surface-hover);
|
|
97
|
+
}
|
|
98
|
+
.rp-select__option--selected[data-v-692ef421] {
|
|
99
|
+
color: var(--rp-color-primary-fg);
|
|
100
|
+
font-weight: var(--rp-font-weight-medium);
|
|
101
|
+
}
|
|
102
|
+
.rp-select__option--disabled[data-v-692ef421] {
|
|
103
|
+
color: var(--rp-color-text-disabled);
|
|
104
|
+
cursor: not-allowed;
|
|
105
|
+
}
|
|
106
|
+
.rp-select__empty[data-v-692ef421] {
|
|
107
|
+
display: flex;
|
|
108
|
+
align-items: center;
|
|
109
|
+
justify-content: center;
|
|
110
|
+
padding: var(--rp-spacing-4);
|
|
111
|
+
color: var(--rp-color-text-secondary);
|
|
112
|
+
font-size: var(--rp-font-size-base);
|
|
113
|
+
}
|
|
114
|
+
.rp-select-dropdown-enter-active[data-v-692ef421],
|
|
115
|
+
.rp-select-dropdown-leave-active[data-v-692ef421] {
|
|
116
|
+
transition: opacity var(--rp-transition-fast), transform var(--rp-transition-fast);
|
|
117
|
+
}
|
|
118
|
+
.rp-select-dropdown-enter-from[data-v-692ef421],
|
|
119
|
+
.rp-select-dropdown-leave-to[data-v-692ef421] {
|
|
120
|
+
opacity: 0;
|
|
121
|
+
transform: translateY(calc(-1 * var(--rp-spacing-1)));
|
|
122
|
+
}
|