ropav 0.0.2 → 0.0.3

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 (74) hide show
  1. package/README.md +32 -3
  2. package/dist/base.css +125 -88
  3. package/dist/button.css +259 -32
  4. package/dist/button.js +51 -19
  5. package/dist/button.js.map +1 -1
  6. package/dist/checkbox.css +125 -21
  7. package/dist/checkbox.js +77 -42
  8. package/dist/checkbox.js.map +1 -1
  9. package/dist/components/button/button.d.ts +2 -2
  10. package/dist/components/button/index.d.ts +1 -1
  11. package/dist/components/button/types.d.ts +8 -1
  12. package/dist/components/checkbox/index.d.ts +1 -1
  13. package/dist/components/checkbox/types.d.ts +8 -0
  14. package/dist/components/input/index.d.ts +1 -1
  15. package/dist/components/input/input.d.ts +5 -1
  16. package/dist/components/input/types.d.ts +5 -0
  17. package/dist/components/radio/index.d.ts +1 -1
  18. package/dist/components/radio/types.d.ts +12 -0
  19. package/dist/components/select/types.d.ts +3 -0
  20. package/dist/components/select/useSelect.d.ts +2 -0
  21. package/dist/components/switch/index.d.ts +1 -1
  22. package/dist/components/switch/types.d.ts +4 -0
  23. package/dist/components/textarea/index.d.ts +1 -1
  24. package/dist/components/textarea/types.d.ts +5 -0
  25. package/dist/components/textarea/useTextarea.d.ts +1 -0
  26. package/dist/index.d.ts +0 -2
  27. package/dist/index.js +2 -4
  28. package/dist/input.css +87 -21
  29. package/dist/input.js +66 -23
  30. package/dist/input.js.map +1 -1
  31. package/dist/radio.css +82 -18
  32. package/dist/radio.js +35 -8
  33. package/dist/radio.js.map +1 -1
  34. package/dist/select.css +104 -39
  35. package/dist/select.js +149 -87
  36. package/dist/select.js.map +1 -1
  37. package/dist/switch.css +75 -20
  38. package/dist/switch.js +8 -4
  39. package/dist/switch.js.map +1 -1
  40. package/dist/textarea.css +80 -20
  41. package/dist/textarea.js +33 -5
  42. package/dist/textarea.js.map +1 -1
  43. package/dist/useControlState.js +4 -0
  44. package/dist/useControlState.js.map +1 -1
  45. package/package.json +9 -9
  46. package/src/styles/_mixins.scss +18 -8
  47. package/src/styles/_tokens.scss +130 -99
  48. package/src/styles/_variables.scss +28 -28
  49. package/dist/components/_internal/icons/CheckIcon.d.ts +0 -18
  50. package/dist/components/_internal/icons/ChevronDownIcon.d.ts +0 -18
  51. package/dist/components/_internal/icons/MinusIcon.d.ts +0 -18
  52. package/dist/components/_internal/icons/index.d.ts +0 -3
  53. package/dist/components/_internal/optionList.d.ts +0 -9
  54. package/dist/components/tabs/index.d.ts +0 -5
  55. package/dist/components/tabs/index.js +0 -2
  56. package/dist/components/tabs/tab-panel.d.ts +0 -21
  57. package/dist/components/tabs/tabs-list.d.ts +0 -20
  58. package/dist/components/tabs/tabs-trigger.d.ts +0 -21
  59. package/dist/components/tabs/tabs.d.ts +0 -23
  60. package/dist/components/tabs/types.d.ts +0 -18
  61. package/dist/components/tabs/useTabs.d.ts +0 -19
  62. package/dist/components/tooltip/index.d.ts +0 -2
  63. package/dist/components/tooltip/index.js +0 -2
  64. package/dist/components/tooltip/tooltip.d.ts +0 -23
  65. package/dist/components/tooltip/types.d.ts +0 -5
  66. package/dist/components/tooltip/useTooltip.d.ts +0 -8
  67. package/dist/tabs.css +0 -45
  68. package/dist/tabs.js +0 -205
  69. package/dist/tabs.js.map +0 -1
  70. package/dist/tooltip.css +0 -78
  71. package/dist/tooltip.js +0 -112
  72. package/dist/tooltip.js.map +0 -1
  73. package/dist/useRequiredInject.js +0 -11
  74. package/dist/useRequiredInject.js.map +0 -1
@@ -1,12 +1,21 @@
1
1
  import { InjectionKey } from 'vue';
2
+ export type RadioColor = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';
3
+ export type RadioSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
+ export type RadioVariant = 'solid' | 'outline';
2
5
  export interface RadioProps {
3
6
  value: string | number;
7
+ variant?: RadioVariant;
8
+ color?: RadioColor;
9
+ size?: RadioSize;
4
10
  disabled?: boolean;
5
11
  }
6
12
  export interface RadioGroupProps {
7
13
  id?: string;
8
14
  name?: string;
9
15
  modelValue: string | number | null;
16
+ variant?: RadioVariant;
17
+ color?: RadioColor;
18
+ size?: RadioSize;
10
19
  disabled?: boolean;
11
20
  required?: boolean;
12
21
  invalid?: boolean;
@@ -19,6 +28,9 @@ export interface RadioGroupContext {
19
28
  name: string;
20
29
  disabled: boolean;
21
30
  required: boolean;
31
+ variant?: RadioVariant;
32
+ color?: RadioColor;
33
+ size?: RadioSize;
22
34
  select: (value: string | number) => void;
23
35
  }
24
36
  export declare const radioGroupKey: InjectionKey<RadioGroupContext>;
@@ -3,12 +3,15 @@ export interface SelectOption {
3
3
  value: string | number;
4
4
  disabled?: boolean;
5
5
  }
6
+ export type SelectRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
6
7
  export interface SelectProps {
7
8
  id?: string;
8
9
  name?: string;
9
10
  modelValue: string | number | null;
10
11
  options?: SelectOption[];
12
+ radius?: SelectRadius;
11
13
  placeholder?: string;
14
+ clearable?: boolean;
12
15
  disabled?: boolean;
13
16
  required?: boolean;
14
17
  invalid?: boolean;
@@ -13,8 +13,10 @@ export declare function useSelect(props: Readonly<SelectProps>, emitUpdate: (val
13
13
  rootClass: import('vue').ComputedRef<string[]>;
14
14
  hasValue: import('vue').ComputedRef<boolean>;
15
15
  displayLabel: import('vue').ComputedRef<string>;
16
+ canClear: import('vue').ComputedRef<boolean>;
16
17
  toggle: () => void;
17
18
  selectOption: (option: SelectOption) => void;
19
+ clearSelection: () => void;
18
20
  onOptionMouseenter: (option: SelectOption, index: number) => void;
19
21
  onTriggerKeydown: (e: KeyboardEvent) => void;
20
22
  };
@@ -1,2 +1,2 @@
1
1
  export { default as Switch } from './switch';
2
- export type { SwitchProps } from './types';
2
+ export type { SwitchColor, SwitchProps, SwitchSize } from './types';
@@ -1,7 +1,11 @@
1
+ export type SwitchColor = 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info';
2
+ export type SwitchSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
1
3
  export interface SwitchProps {
2
4
  id?: string;
3
5
  name?: string;
4
6
  modelValue: boolean;
7
+ color?: SwitchColor;
8
+ size?: SwitchSize;
5
9
  disabled?: boolean;
6
10
  required?: boolean;
7
11
  invalid?: boolean;
@@ -1,2 +1,2 @@
1
1
  export { default as Textarea } from './textarea';
2
- export type { TextareaProps } from './types';
2
+ export type { TextareaProps, TextareaRadius, TextareaSize } from './types';
@@ -1,13 +1,18 @@
1
+ export type TextareaRadius = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
2
+ export type TextareaSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
1
3
  export interface TextareaProps {
2
4
  id?: string;
3
5
  name?: string;
4
6
  modelValue: string;
7
+ size?: TextareaSize;
8
+ radius?: TextareaRadius;
5
9
  placeholder?: string;
6
10
  rows?: number;
7
11
  disabled?: boolean;
8
12
  readonly?: boolean;
9
13
  required?: boolean;
10
14
  invalid?: boolean;
15
+ valid?: boolean;
11
16
  ariaLabel?: string;
12
17
  describedby?: string;
13
18
  labelledby?: string;
@@ -3,4 +3,5 @@ export declare function useTextarea(props: Readonly<TextareaProps>, emitUpdate:
3
3
  control: import('../../composables/useControlState').ControlState;
4
4
  rootClass: import('vue').ComputedRef<string[]>;
5
5
  onInput: (e: Event) => void;
6
+ focusTextarea: (e: MouseEvent) => void;
6
7
  };
package/dist/index.d.ts CHANGED
@@ -4,6 +4,4 @@ export * from './components/input';
4
4
  export * from './components/radio';
5
5
  export * from './components/select';
6
6
  export * from './components/switch';
7
- export * from './components/tabs';
8
7
  export * from './components/textarea';
9
- export * from './components/tooltip';
package/dist/index.js CHANGED
@@ -1,10 +1,8 @@
1
1
  import { t as button_default } from "./button.js";
2
2
  import { t as checkbox_default } from "./checkbox.js";
3
- import { t as select_default } from "./select.js";
4
3
  import { t as input_default } from "./input.js";
5
4
  import { n as radio_default, t as radio_group_default } from "./radio.js";
5
+ import { t as select_default } from "./select.js";
6
6
  import { t as switch_default } from "./switch.js";
7
- import { i as tabs_default, n as tabs_trigger_default, r as tabs_list_default, t as tab_panel_default } from "./tabs.js";
8
7
  import { t as textarea_default } from "./textarea.js";
9
- import { t as tooltip_default } from "./tooltip.js";
10
- export { button_default as Button, checkbox_default as Checkbox, input_default as Input, radio_default as Radio, radio_group_default as RadioGroup, select_default as Select, switch_default as Switch, tab_panel_default as TabPanel, tabs_default as Tabs, tabs_list_default as TabsList, tabs_trigger_default as TabsTrigger, textarea_default as Textarea, tooltip_default as Tooltip };
8
+ export { button_default as Button, checkbox_default as Checkbox, input_default as Input, radio_default as Radio, radio_group_default as RadioGroup, select_default as Select, switch_default as Switch, textarea_default as Textarea };
package/dist/input.css CHANGED
@@ -1,4 +1,8 @@
1
- .rp-input[data-v-7e1222cc] {
1
+ .rp-input[data-v-fedf15e7] {
2
+ --_rp-input-height: var(--rp-size-control-md);
3
+ --_rp-input-padding-x: var(--rp-spacing-3);
4
+ --_rp-input-font-size: var(--rp-font-size-base);
5
+ --_rp-input-radius: var(--rp-radius-sm);
2
6
  display: inline-flex;
3
7
  align-items: center;
4
8
  justify-content: center;
@@ -6,46 +10,108 @@
6
10
  gap: var(--rp-spacing-2);
7
11
  font-family: var(--rp-font-family);
8
12
  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);
13
+ background-color: var(--rp-color-button-default-bg);
14
+ border: var(--rp-border-width-thin) solid var(--rp-color-border);
15
+ cursor: text;
11
16
  transition: border-color var(--rp-transition-fast), box-shadow var(--rp-transition-fast);
12
17
  }
13
- .rp-input[data-v-7e1222cc]:hover:not(.rp-input--disabled) {
14
- border-color: var(--rp-color-control-border-hover);
18
+ .rp-input[data-v-fedf15e7]:hover:not(.rp-input--disabled):not(.rp-input--invalid):not(.rp-input--valid) {
19
+ border-color: var(--rp-color-border-hover);
15
20
  }
16
- .rp-input[data-v-7e1222cc]:focus-within:not(.rp-input--disabled) {
17
- border-color: var(--rp-color-control-border-focus);
21
+ .rp-input[data-v-fedf15e7]:focus-within:not(.rp-input--disabled):not(.rp-input--invalid):not(.rp-input--valid) {
22
+ border-color: var(--rp-color-primary);
18
23
  box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
19
24
  }
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
+ .rp-input[data-v-fedf15e7] {
26
+ height: var(--_rp-input-height);
27
+ padding: 0 var(--_rp-input-padding-x);
28
+ font-size: var(--_rp-input-font-size);
29
+ border-radius: var(--_rp-input-radius);
25
30
  }
26
- .rp-input--disabled[data-v-7e1222cc] {
31
+ .rp-input--size-xs[data-v-fedf15e7] {
32
+ --_rp-input-height: calc(var(--rp-size-control-sm) - var(--rp-spacing-1));
33
+ --_rp-input-padding-x: var(--rp-spacing-1);
34
+ --_rp-input-font-size: var(--rp-font-size-xs);
35
+ }
36
+ .rp-input--size-sm[data-v-fedf15e7] {
37
+ --_rp-input-height: var(--rp-size-control-sm);
38
+ --_rp-input-padding-x: var(--rp-spacing-2);
39
+ --_rp-input-font-size: var(--rp-font-size-sm);
40
+ }
41
+ .rp-input--size-md[data-v-fedf15e7] {
42
+ --_rp-input-height: var(--rp-size-control-md);
43
+ --_rp-input-padding-x: var(--rp-spacing-3);
44
+ --_rp-input-font-size: var(--rp-font-size-base);
45
+ }
46
+ .rp-input--size-lg[data-v-fedf15e7] {
47
+ --_rp-input-height: var(--rp-size-control-lg);
48
+ --_rp-input-padding-x: var(--rp-spacing-4);
49
+ --_rp-input-font-size: var(--rp-font-size-lg);
50
+ }
51
+ .rp-input--size-xl[data-v-fedf15e7] {
52
+ --_rp-input-height: calc(var(--rp-size-control-lg) + var(--rp-spacing-2));
53
+ --_rp-input-padding-x: var(--rp-spacing-5);
54
+ --_rp-input-font-size: var(--rp-font-size-lg);
55
+ }
56
+ .rp-input--radius-xs[data-v-fedf15e7] {
57
+ --_rp-input-radius: var(--rp-radius-sm);
58
+ }
59
+ .rp-input--radius-sm[data-v-fedf15e7] {
60
+ --_rp-input-radius: var(--rp-radius-sm);
61
+ }
62
+ .rp-input--radius-md[data-v-fedf15e7] {
63
+ --_rp-input-radius: var(--rp-radius-md);
64
+ }
65
+ .rp-input--radius-lg[data-v-fedf15e7] {
66
+ --_rp-input-radius: var(--rp-radius-lg);
67
+ }
68
+ .rp-input--radius-xl[data-v-fedf15e7] {
69
+ --_rp-input-radius: var(--rp-radius-xl);
70
+ }
71
+ .rp-input--disabled[data-v-fedf15e7] {
27
72
  opacity: var(--rp-opacity-disabled);
28
73
  cursor: not-allowed;
29
74
  }
30
- .rp-input--invalid[data-v-7e1222cc] {
75
+ .rp-input--valid[data-v-fedf15e7] {
76
+ border-color: var(--rp-color-success-fg);
77
+ }
78
+ .rp-input--valid[data-v-fedf15e7]:focus-within:not(.rp-input--disabled) {
79
+ border-color: var(--rp-color-success-fg);
80
+ box-shadow: 0 0 0 var(--rp-border-width-medium) color-mix(in srgb, var(--rp-color-success-fg) 32%, transparent);
81
+ }
82
+ .rp-input--invalid[data-v-fedf15e7] {
83
+ border-color: var(--rp-color-danger-fg);
84
+ }
85
+ .rp-input--invalid[data-v-fedf15e7]:focus-within:not(.rp-input--disabled) {
31
86
  border-color: var(--rp-color-danger-fg);
87
+ box-shadow: 0 0 0 var(--rp-border-width-medium) color-mix(in srgb, var(--rp-color-danger-fg) 32%, transparent);
32
88
  }
33
- .rp-input--readonly[data-v-7e1222cc] {
34
- background-color: var(--rp-color-control-readonly-bg);
89
+ .rp-input--readonly[data-v-fedf15e7] {
90
+ background-color: var(--rp-color-surface-muted);
35
91
  }
36
- .rp-input__native[data-v-7e1222cc] {
92
+ .rp-input__native[data-v-fedf15e7] {
93
+ box-sizing: border-box;
37
94
  flex: 1;
95
+ width: 100%;
96
+ height: 100%;
38
97
  min-width: 0;
98
+ padding: 0;
39
99
  border: none;
40
100
  outline: none;
41
101
  background: transparent;
42
102
  font: inherit;
43
- color: var(--rp-color-control-fg);
103
+ color: var(--rp-color-text);
44
104
  line-height: var(--rp-line-height-none);
45
105
  }
46
- .rp-input__native[data-v-7e1222cc]::placeholder {
47
- color: var(--rp-color-control-placeholder);
106
+ .rp-input__native[data-v-fedf15e7]::placeholder {
107
+ color: var(--rp-color-text-secondary);
48
108
  }
49
- .rp-input__native[data-v-7e1222cc]:disabled {
109
+ .rp-input__native[data-v-fedf15e7]:disabled {
50
110
  cursor: not-allowed;
111
+ }
112
+ .rp-input__left[data-v-fedf15e7], .rp-input__right[data-v-fedf15e7] {
113
+ display: inline-flex;
114
+ align-items: center;
115
+ flex-shrink: 0;
116
+ color: color-mix(in srgb, var(--rp-color-text-secondary) 50%, var(--rp-color-border));
51
117
  }
package/dist/input.js CHANGED
@@ -1,10 +1,12 @@
1
1
  import './input.css';
2
2
  import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
3
  import { t as useControlState } from "./useControlState.js";
4
- import { child, computed, createInvoker, defineVaporComponent, delegateEvents, renderEffect, setAttr, setClass, setProp, setValue, template, unref } from "vue";
4
+ import { child, computed, createIf, createInvoker, createSlot, defineVaporComponent, delegateEvents, renderEffect, setAttr, setClass, setInsertionState, setProp, setValue, template, unref } from "vue";
5
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");
6
+ var t0 = template("<span data-v-fedf15e7 class=rp-input__left>");
7
+ var t1 = template("<span data-v-fedf15e7 class=rp-input__right>");
8
+ var t2 = template("<label data-v-fedf15e7><input data-v-fedf15e7 class=rp-input__native>", 1);
9
+ delegateEvents("input", "mousedown");
8
10
  //#endregion
9
11
  //#region src/components/input/input.vue
10
12
  var input_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -15,6 +17,8 @@ var input_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
15
17
  name: {},
16
18
  modelValue: {},
17
19
  type: { default: "text" },
20
+ size: {},
21
+ radius: {},
18
22
  placeholder: { default: "" },
19
23
  disabled: {
20
24
  type: Boolean,
@@ -32,47 +36,86 @@ var input_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__
32
36
  type: Boolean,
33
37
  default: void 0
34
38
  },
39
+ valid: {
40
+ type: Boolean,
41
+ default: void 0
42
+ },
35
43
  ariaLabel: {},
36
44
  describedby: {},
37
45
  labelledby: {}
38
46
  },
39
47
  emits: ["update:modelValue"],
40
- setup(__props, { emit: __emit }) {
48
+ setup(__props, { emit: __emit, slots: $slots }) {
41
49
  const props = __props;
42
50
  const emit = __emit;
43
51
  const control = useControlState(props);
44
52
  const rootClass = computed(() => bem("rp-input", {
53
+ [`size-${props.size}`]: Boolean(props.size),
54
+ [`radius-${props.radius}`]: Boolean(props.radius),
45
55
  disabled: control.disabled,
46
56
  invalid: control.invalid,
57
+ valid: control.valid && !control.invalid,
47
58
  readonly: props.readonly
48
59
  }));
49
60
  function onInput(e) {
50
61
  emit("update:modelValue", e.target.value);
51
62
  }
52
- const n1 = t0();
53
- const n0 = child(n1);
54
- n0.$evtinput = createInvoker(onInput);
63
+ function focusInput(e) {
64
+ if (control.disabled) return;
65
+ const target = e.target;
66
+ if (target instanceof Element && isInteractiveElement(target)) return;
67
+ e.currentTarget.querySelector(".rp-input__native")?.focus();
68
+ }
69
+ function isInteractiveElement(target) {
70
+ return Boolean(target.closest([
71
+ "button",
72
+ "a[href]",
73
+ "input:not(.rp-input__native)",
74
+ "select",
75
+ "textarea",
76
+ "[contenteditable=\"true\"]",
77
+ "[tabindex]:not([tabindex=\"-1\"])"
78
+ ].join(",")));
79
+ }
80
+ const n9 = t2();
81
+ const n4 = child(n9, 1);
82
+ renderEffect(() => setClass(n9, rootClass.value));
83
+ setInsertionState(n9, 0, 0);
84
+ createIf(() => $slots.left, () => {
85
+ const n3 = t0();
86
+ setInsertionState(n3, null, 0);
87
+ createSlot("left", null, null, 1);
88
+ return n3;
89
+ });
90
+ n4.$evtinput = createInvoker(onInput);
55
91
  renderEffect(() => {
56
92
  const _control = unref(control);
57
93
  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);
94
+ setProp(n4, "id", _control.id);
95
+ setProp(n4, "name", __props.name);
96
+ setProp(n4, "type", __props.type);
97
+ setValue(n4, __props.modelValue);
98
+ setProp(n4, "placeholder", __props.placeholder);
99
+ setProp(n4, "disabled", _control.disabled || void 0);
100
+ setProp(n4, "readonly", __props.readonly || void 0);
101
+ setProp(n4, "required", _control_required || void 0);
102
+ setAttr(n4, "aria-label", __props.ariaLabel || void 0);
103
+ setAttr(n4, "aria-labelledby", _control.ariaLabelledby);
104
+ setAttr(n4, "aria-describedby", _control.ariaDescribedby);
105
+ setAttr(n4, "aria-invalid", _control.invalid || void 0);
106
+ setAttr(n4, "aria-required", _control_required || void 0);
107
+ });
108
+ setInsertionState(n9, null, 2);
109
+ createIf(() => $slots.right, () => {
110
+ const n8 = t1();
111
+ setInsertionState(n8, null, 0);
112
+ createSlot("right", null, null, 1);
113
+ return n8;
72
114
  });
73
- return n1;
115
+ n9.$evtmousedown = createInvoker(focusInput);
116
+ return n9;
74
117
  }
75
- }), [["__scopeId", "data-v-7e1222cc"]]);
118
+ }), [["__scopeId", "data-v-fedf15e7"]]);
76
119
  //#endregion
77
120
  export { input_default as t };
78
121
 
package/dist/input.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"input.js","names":[],"sources":["../src/components/input/input.vue","../src/components/input/input.vue"],"sourcesContent":["<template>\n <label :class=\"rootClass\" @mousedown=\"focusInput\">\n <span v-if=\"$slots.left\" class=\"rp-input__left\">\n <slot name=\"left\" />\n </span>\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 <span v-if=\"$slots.right\" class=\"rp-input__right\">\n <slot name=\"right\" />\n </span>\n </label>\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 valid: 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 [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n disabled: control.disabled,\n invalid: control.invalid,\n valid: control.valid && !control.invalid,\n readonly: props.readonly,\n }),\n);\n\nfunction onInput(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).value);\n}\n\nfunction focusInput(e: MouseEvent) {\n if (control.disabled) return;\n\n const target = e.target;\n if (target instanceof Element && isInteractiveElement(target)) return;\n\n (e.currentTarget as HTMLElement).querySelector<HTMLInputElement>('.rp-input__native')?.focus();\n}\n\nfunction isInteractiveElement(target: Element) {\n return Boolean(\n target.closest(\n [\n 'button',\n 'a[href]',\n 'input:not(.rp-input__native)',\n 'select',\n 'textarea',\n '[contenteditable=\"true\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(','),\n ),\n );\n}\n</script>\n\n<style src=\"./input.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label :class=\"rootClass\" @mousedown=\"focusInput\">\n <span v-if=\"$slots.left\" class=\"rp-input__left\">\n <slot name=\"left\" />\n </span>\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 <span v-if=\"$slots.right\" class=\"rp-input__right\">\n <slot name=\"right\" />\n </span>\n </label>\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 valid: 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 [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n disabled: control.disabled,\n invalid: control.invalid,\n valid: control.valid && !control.invalid,\n readonly: props.readonly,\n }),\n);\n\nfunction onInput(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).value);\n}\n\nfunction focusInput(e: MouseEvent) {\n if (control.disabled) return;\n\n const target = e.target;\n if (target instanceof Element && isInteractiveElement(target)) return;\n\n (e.currentTarget as HTMLElement).querySelector<HTMLInputElement>('.rp-input__native')?.focus();\n}\n\nfunction isInteractiveElement(target: Element) {\n return Boolean(\n target.closest(\n [\n 'button',\n 'a[href]',\n 'input:not(.rp-input__native)',\n 'select',\n 'textarea',\n '[contenteditable=\"true\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(','),\n ),\n );\n}\n</script>\n\n<style src=\"./input.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCA,MAAM,QAAQ;EAUd,MAAM,OAAO;EAIb,MAAM,UAAU,gBAAgB,KAAK;EAErC,MAAM,YAAY,eACd,IAAI,YAAY;IACX,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;IACzC,UAAU,MAAM,WAAW,QAAQ,MAAM,MAAM;GAChD,UAAU,QAAQ;GAClB,SAAS,QAAQ;GACjB,OAAO,QAAQ,SAAS,CAAC,QAAQ;GACjC,UAAU,MAAM;EACpB,CAAC,CACL;EAEA,SAAS,QAAQ,GAAU;GACvB,KAAK,qBAAsB,EAAE,OAA4B,KAAK;EAClE;EAEA,SAAS,WAAW,GAAe;GAC/B,IAAI,QAAQ,UAAU;GAEtB,MAAM,SAAS,EAAE;GACjB,IAAI,kBAAkB,WAAW,qBAAqB,MAAM,GAAG;GAE/D,EAAG,cAA8B,cAAgC,mBAAmB,CAAC,EAAE,MAAM;EACjG;EAEA,SAAS,qBAAqB,QAAiB;GAC3C,OAAO,QACH,OAAO,QACH;IACI;IACA;IACA;IACA;IACA;IACA;IACA;GACJ,CAAC,CAAC,KAAK,GAAG,CACd,CACJ;EACJ;;;kCAzFmB,UAAA,KAAS,CAAA;;iBACR,OAAM,YAAA;;;cACR,QAAW,MAAA,MAAA,CAAA;;;+BAiBT,OAAO;;;;eAdd,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;;;iBAGrC,OAAM,aAAA;;;cACR,SAAY,MAAA,MAAA,CAAA;;;mCAtBY,UAAU"}
package/dist/radio.css CHANGED
@@ -1,21 +1,27 @@
1
- .rp-radio[data-v-67524919] {
1
+ .rp-radio[data-v-ecddd6c8] {
2
+ --_radio-color: var(--rp-color-primary);
3
+ --_radio-on-color: var(--rp-color-on-primary);
4
+ --_radio-size: 18px;
5
+ --_radio-dot: 8px;
6
+ --_radio-font-size: var(--rp-font-size-base);
7
+ --_radio-checked-bg: var(--_radio-color);
8
+ --_radio-checked-border: var(--_radio-color);
9
+ --_radio-checked-dot: var(--_radio-on-color);
2
10
  display: inline-flex;
3
11
  align-items: center;
4
12
  cursor: pointer;
5
13
  font-family: var(--rp-font-family);
6
14
  user-select: none;
7
15
  }
8
- .rp-radio--disabled[data-v-67524919] {
16
+ .rp-radio--disabled[data-v-ecddd6c8] {
9
17
  opacity: var(--rp-opacity-disabled);
10
18
  cursor: not-allowed;
11
19
  }
12
- .rp-radio[data-v-67524919] {
20
+ .rp-radio[data-v-ecddd6c8] {
13
21
  gap: var(--rp-spacing-2);
14
- font-size: var(--rp-font-size-base);
15
- --_radio-size: 18px;
16
- --_radio-dot: 8px;
22
+ font-size: var(--_radio-font-size);
17
23
  }
18
- .rp-radio__native[data-v-67524919] {
24
+ .rp-radio__native[data-v-ecddd6c8] {
19
25
  position: absolute;
20
26
  width: 1px;
21
27
  height: 1px;
@@ -27,38 +33,96 @@
27
33
  border-width: 0;
28
34
  pointer-events: none;
29
35
  }
30
- .rp-radio__dot[data-v-67524919] {
36
+ .rp-radio__native:focus-visible + .rp-radio__dot[data-v-ecddd6c8] {
37
+ border-color: var(--rp-color-primary);
38
+ box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
39
+ }
40
+ .rp-radio__dot[data-v-ecddd6c8] {
31
41
  display: inline-flex;
32
42
  align-items: center;
33
43
  justify-content: center;
34
44
  width: var(--_radio-size);
35
45
  height: var(--_radio-size);
36
46
  flex-shrink: 0;
37
- border: var(--rp-border-width-medium) solid var(--rp-color-control-border);
47
+ border: var(--rp-border-width-medium) solid var(--rp-color-border);
38
48
  border-radius: var(--rp-radius-full);
39
- background-color: var(--rp-color-control-bg);
49
+ background-color: var(--rp-color-button-default-bg);
40
50
  transition: background-color var(--rp-transition-fast), border-color var(--rp-transition-fast);
41
51
  }
42
- .rp-radio__dot[data-v-67524919]::after {
52
+ .rp-radio__dot[data-v-ecddd6c8]::after {
43
53
  content: "";
44
54
  width: var(--_radio-dot);
45
55
  height: var(--_radio-dot);
46
56
  border-radius: var(--rp-radius-full);
47
- background-color: var(--rp-color-control-selected-fg);
57
+ background-color: var(--_radio-checked-dot);
48
58
  transform: scale(0);
49
59
  transition: transform var(--rp-transition-fast);
50
60
  }
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);
61
+ .rp-radio--checked .rp-radio__dot[data-v-ecddd6c8] {
62
+ background-color: var(--_radio-checked-bg);
63
+ border-color: var(--_radio-checked-border);
54
64
  }
55
- .rp-radio--checked .rp-radio__dot[data-v-67524919]::after {
65
+ .rp-radio--checked .rp-radio__dot[data-v-ecddd6c8]::after {
56
66
  transform: scale(1);
57
67
  }
58
- .rp-radio__label[data-v-67524919] {
68
+ .rp-radio__label[data-v-ecddd6c8] {
59
69
  line-height: var(--rp-line-height-normal);
60
70
  color: var(--rp-color-text);
61
- }.rp-radio-group[data-v-ba5e60e5] {
71
+ }
72
+ .rp-radio--color-primary[data-v-ecddd6c8] {
73
+ --_radio-color: var(--rp-color-primary);
74
+ --_radio-on-color: var(--rp-color-on-primary);
75
+ }
76
+ .rp-radio--color-secondary[data-v-ecddd6c8] {
77
+ --_radio-color: var(--rp-color-secondary);
78
+ --_radio-on-color: var(--rp-color-on-secondary);
79
+ }
80
+ .rp-radio--color-success[data-v-ecddd6c8] {
81
+ --_radio-color: var(--rp-color-success);
82
+ --_radio-on-color: var(--rp-color-on-success);
83
+ }
84
+ .rp-radio--color-warning[data-v-ecddd6c8] {
85
+ --_radio-color: var(--rp-color-warning);
86
+ --_radio-on-color: var(--rp-color-on-warning);
87
+ }
88
+ .rp-radio--color-danger[data-v-ecddd6c8] {
89
+ --_radio-color: var(--rp-color-danger);
90
+ --_radio-on-color: var(--rp-color-on-danger);
91
+ }
92
+ .rp-radio--color-info[data-v-ecddd6c8] {
93
+ --_radio-color: var(--rp-color-info);
94
+ --_radio-on-color: var(--rp-color-on-info);
95
+ }
96
+ .rp-radio--outline[data-v-ecddd6c8] {
97
+ --_radio-checked-bg: var(--rp-color-button-default-bg);
98
+ --_radio-checked-border: var(--_radio-color);
99
+ --_radio-checked-dot: var(--_radio-color);
100
+ }
101
+ .rp-radio--size-xs[data-v-ecddd6c8] {
102
+ --_radio-size: 14px;
103
+ --_radio-dot: 6px;
104
+ --_radio-font-size: var(--rp-font-size-xs);
105
+ }
106
+ .rp-radio--size-sm[data-v-ecddd6c8] {
107
+ --_radio-size: 16px;
108
+ --_radio-dot: 7px;
109
+ --_radio-font-size: var(--rp-font-size-sm);
110
+ }
111
+ .rp-radio--size-md[data-v-ecddd6c8] {
112
+ --_radio-size: 18px;
113
+ --_radio-dot: 8px;
114
+ --_radio-font-size: var(--rp-font-size-base);
115
+ }
116
+ .rp-radio--size-lg[data-v-ecddd6c8] {
117
+ --_radio-size: 22px;
118
+ --_radio-dot: 10px;
119
+ --_radio-font-size: var(--rp-font-size-lg);
120
+ }
121
+ .rp-radio--size-xl[data-v-ecddd6c8] {
122
+ --_radio-size: 26px;
123
+ --_radio-dot: 12px;
124
+ --_radio-font-size: var(--rp-font-size-xl);
125
+ }.rp-radio-group[data-v-a2c46e46] {
62
126
  display: flex;
63
127
  flex-direction: column;
64
128
  gap: var(--rp-spacing-3);