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.
Files changed (94) hide show
  1. package/README.md +31 -0
  2. package/dist/_plugin-vue_export-helper.js +18 -0
  3. package/dist/_plugin-vue_export-helper.js.map +1 -0
  4. package/dist/base.css +147 -0
  5. package/dist/button.css +66 -0
  6. package/dist/button.js +62 -0
  7. package/dist/button.js.map +1 -0
  8. package/dist/checkbox.css +60 -0
  9. package/dist/checkbox.js +132 -0
  10. package/dist/checkbox.js.map +1 -0
  11. package/dist/components/_internal/icons/CheckIcon.d.ts +18 -0
  12. package/dist/components/_internal/icons/ChevronDownIcon.d.ts +18 -0
  13. package/dist/components/_internal/icons/MinusIcon.d.ts +18 -0
  14. package/dist/components/_internal/icons/index.d.ts +3 -0
  15. package/dist/components/_internal/optionList.d.ts +9 -0
  16. package/dist/components/button/button.d.ts +25 -0
  17. package/dist/components/button/index.d.ts +2 -0
  18. package/dist/components/button/index.js +2 -0
  19. package/dist/components/button/types.d.ts +6 -0
  20. package/dist/components/checkbox/checkbox.d.ts +23 -0
  21. package/dist/components/checkbox/index.d.ts +2 -0
  22. package/dist/components/checkbox/index.js +2 -0
  23. package/dist/components/checkbox/types.d.ts +12 -0
  24. package/dist/components/checkbox/useCheckbox.d.ts +6 -0
  25. package/dist/components/input/index.d.ts +2 -0
  26. package/dist/components/input/index.js +2 -0
  27. package/dist/components/input/input.d.ts +21 -0
  28. package/dist/components/input/types.d.ts +14 -0
  29. package/dist/components/radio/index.d.ts +3 -0
  30. package/dist/components/radio/index.js +2 -0
  31. package/dist/components/radio/radio-group.d.ts +23 -0
  32. package/dist/components/radio/radio.d.ts +21 -0
  33. package/dist/components/radio/types.d.ts +24 -0
  34. package/dist/components/radio/useRadio.d.ts +12 -0
  35. package/dist/components/select/index.d.ts +2 -0
  36. package/dist/components/select/index.js +2 -0
  37. package/dist/components/select/select.d.ts +23 -0
  38. package/dist/components/select/types.d.ts +18 -0
  39. package/dist/components/select/useSelect.d.ts +21 -0
  40. package/dist/components/switch/index.d.ts +2 -0
  41. package/dist/components/switch/index.js +2 -0
  42. package/dist/components/switch/switch.d.ts +23 -0
  43. package/dist/components/switch/types.d.ts +11 -0
  44. package/dist/components/switch/useSwitch.d.ts +6 -0
  45. package/dist/components/tabs/index.d.ts +5 -0
  46. package/dist/components/tabs/index.js +2 -0
  47. package/dist/components/tabs/tab-panel.d.ts +21 -0
  48. package/dist/components/tabs/tabs-list.d.ts +20 -0
  49. package/dist/components/tabs/tabs-trigger.d.ts +21 -0
  50. package/dist/components/tabs/tabs.d.ts +23 -0
  51. package/dist/components/tabs/types.d.ts +18 -0
  52. package/dist/components/tabs/useTabs.d.ts +19 -0
  53. package/dist/components/textarea/index.d.ts +2 -0
  54. package/dist/components/textarea/index.js +2 -0
  55. package/dist/components/textarea/textarea.d.ts +21 -0
  56. package/dist/components/textarea/types.d.ts +14 -0
  57. package/dist/components/textarea/useTextarea.d.ts +6 -0
  58. package/dist/components/tooltip/index.d.ts +2 -0
  59. package/dist/components/tooltip/index.js +2 -0
  60. package/dist/components/tooltip/tooltip.d.ts +23 -0
  61. package/dist/components/tooltip/types.d.ts +5 -0
  62. package/dist/components/tooltip/useTooltip.d.ts +8 -0
  63. package/dist/index.d.ts +9 -0
  64. package/dist/index.js +10 -0
  65. package/dist/input.css +51 -0
  66. package/dist/input.js +79 -0
  67. package/dist/input.js.map +1 -0
  68. package/dist/radio.css +66 -0
  69. package/dist/radio.js +160 -0
  70. package/dist/radio.js.map +1 -0
  71. package/dist/select.css +122 -0
  72. package/dist/select.js +362 -0
  73. package/dist/select.js.map +1 -0
  74. package/dist/switch.css +70 -0
  75. package/dist/switch.js +94 -0
  76. package/dist/switch.js.map +1 -0
  77. package/dist/tabs.css +45 -0
  78. package/dist/tabs.js +205 -0
  79. package/dist/tabs.js.map +1 -0
  80. package/dist/textarea.css +46 -0
  81. package/dist/textarea.js +91 -0
  82. package/dist/textarea.js.map +1 -0
  83. package/dist/tooltip.css +78 -0
  84. package/dist/tooltip.js +112 -0
  85. package/dist/tooltip.js.map +1 -0
  86. package/dist/useControlState.js +38 -0
  87. package/dist/useControlState.js.map +1 -0
  88. package/dist/useRequiredInject.js +11 -0
  89. package/dist/useRequiredInject.js.map +1 -0
  90. package/package.json +110 -0
  91. package/src/styles/_mixins.scss +128 -0
  92. package/src/styles/_tokens.scss +184 -0
  93. package/src/styles/_variables.scss +112 -0
  94. 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"}
@@ -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
+ }