ropav 0.0.5 → 0.0.6

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 (78) hide show
  1. package/README.md +20 -51
  2. package/dist/base.css +21 -0
  3. package/dist/button-group.css +50 -0
  4. package/dist/button-group.js +49 -0
  5. package/dist/button-group.js.map +1 -0
  6. package/dist/button.css +72 -42
  7. package/dist/button.js +41 -31
  8. package/dist/button.js.map +1 -1
  9. package/dist/checkbox.css +105 -102
  10. package/dist/checkbox.js +18 -6
  11. package/dist/checkbox.js.map +1 -1
  12. package/dist/componentColors.js +22 -0
  13. package/dist/componentColors.js.map +1 -0
  14. package/dist/components/button/button.d.ts +2 -0
  15. package/dist/components/button/types.d.ts +2 -1
  16. package/dist/components/button/useButtonColor.d.ts +13 -0
  17. package/dist/components/button-group/button-group.d.ts +21 -0
  18. package/dist/components/button-group/index.d.ts +2 -0
  19. package/dist/components/button-group/index.js +2 -0
  20. package/dist/components/button-group/types.d.ts +10 -0
  21. package/dist/components/checkbox/types.d.ts +2 -1
  22. package/dist/components/checkbox/useCheckbox.d.ts +4 -0
  23. package/dist/components/progress/index.d.ts +3 -0
  24. package/dist/components/progress/index.js +2 -0
  25. package/dist/components/progress/progress.d.ts +27 -0
  26. package/dist/components/progress/types.d.ts +24 -0
  27. package/dist/components/progress/useProgress.d.ts +28 -0
  28. package/dist/components/radio/types.d.ts +2 -1
  29. package/dist/components/radio/useRadio.d.ts +4 -0
  30. package/dist/components/slider/index.d.ts +3 -0
  31. package/dist/components/slider/index.js +2 -0
  32. package/dist/components/slider/slider.d.ts +35 -0
  33. package/dist/components/slider/types.d.ts +50 -0
  34. package/dist/components/slider/useSlider.d.ts +50 -0
  35. package/dist/components/switch/types.d.ts +2 -1
  36. package/dist/components/switch/useSwitch.d.ts +3 -0
  37. package/dist/components/textarea/index.d.ts +1 -1
  38. package/dist/components/textarea/types.d.ts +5 -0
  39. package/dist/components/textarea/useTextarea.d.ts +2 -0
  40. package/dist/components/tooltip/index.d.ts +2 -0
  41. package/dist/components/tooltip/index.js +2 -0
  42. package/dist/components/tooltip/tooltip.d.ts +27 -0
  43. package/dist/components/tooltip/types.d.ts +29 -0
  44. package/dist/components/tooltip/useTooltip.d.ts +17 -0
  45. package/dist/icon-button.css +82 -49
  46. package/dist/icon-button.js +13 -9
  47. package/dist/icon-button.js.map +1 -1
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.js +6 -1
  50. package/dist/progress.css +125 -0
  51. package/dist/progress.js +177 -0
  52. package/dist/progress.js.map +1 -0
  53. package/dist/radio.css +83 -83
  54. package/dist/radio.js +18 -6
  55. package/dist/radio.js.map +1 -1
  56. package/dist/select.css +3 -1
  57. package/dist/select.js +7 -0
  58. package/dist/select.js.map +1 -1
  59. package/dist/slider.css +438 -0
  60. package/dist/slider.js +412 -0
  61. package/dist/slider.js.map +1 -0
  62. package/dist/switch.css +77 -77
  63. package/dist/switch.js +15 -6
  64. package/dist/switch.js.map +1 -1
  65. package/dist/textarea.css +33 -26
  66. package/dist/textarea.js +106 -15
  67. package/dist/textarea.js.map +1 -1
  68. package/dist/tooltip.css +136 -0
  69. package/dist/tooltip.js +384 -0
  70. package/dist/tooltip.js.map +1 -0
  71. package/dist/useButtonColor.js +33 -0
  72. package/dist/useButtonColor.js.map +1 -0
  73. package/package.json +18 -2
  74. package/src/styles/_mixins.scss +17 -0
  75. package/src/styles/_utilities.scss +13 -0
  76. package/src/styles/base.scss +1 -0
  77. package/dist/loader-circle.js +0 -14
  78. package/dist/loader-circle.js.map +0 -1
package/README.md CHANGED
@@ -1,69 +1,38 @@
1
1
  # Ropav
2
2
 
3
- Experimental UI component library for Vue Vapor.
3
+ Minimal UI components for Vue Vapor.
4
4
 
5
- ## Install
6
-
7
- ```bash
8
- pnpm add ropav vue
9
- ```
10
-
11
- ## Usage
5
+ Ropav components require Vapor mode. Use `createVaporApp`, or install Vue's
6
+ Vapor interop plugin in a regular app.
12
7
 
13
8
  ```ts
14
- import 'ropav/base.css';
15
- import { Button, Card, Field, Input } from 'ropav';
9
+ import { createVaporApp } from 'vue';
10
+
11
+ createVaporApp(App).mount('#app');
16
12
  ```
17
13
 
18
- Deep imports are available for individual components:
14
+ or
19
15
 
20
16
  ```ts
21
- import { Card } from 'ropav/card';
22
- ```
17
+ import { createApp, vaporInteropPlugin } from 'vue';
23
18
 
24
- Field wrappers can pass accessible ids and state into form controls through slot
25
- props:
26
-
27
- ```vue
28
- <Field id="email" label="Email" error="Enter a valid email" v-slot="{ controlProps }">
29
- <Input v-bind="controlProps" v-model="email" />
30
- </Field>
19
+ createApp(App).use(vaporInteropPlugin).mount('#app');
31
20
  ```
32
21
 
33
- ## Theming and tokens
34
-
35
- `ropav/base.css` exposes the public runtime token API as CSS custom properties. These
36
- tokens are intended for stable theme axes that consumers may override without
37
- rebuilding the library:
38
-
39
- - semantic colors, surfaces, text, borders, focus rings, overlays, `on-*`, and
40
- `*-fg`
41
- - typography: `--rp-font-family`, `--rp-font-size-*`, `--rp-font-weight-*`, and
42
- `--rp-line-height-*`
43
- - density and control primitives: `--rp-spacing-*`, `--rp-size-control-*`,
44
- `--rp-border-width-*`, and `--rp-opacity-disabled`
45
- - radius, shadows, and transitions
22
+ ## Install
46
23
 
47
- Sass tokens exported through `ropav/scss/*` are implementation/build-time tokens.
48
- They may include raw palette values, z-index values, component layout constants,
49
- and mixin inputs that are not part of the runtime CSS variable contract.
24
+ ```bash
25
+ pnpm add ropav
26
+ ```
50
27
 
51
- Component-local custom properties that start with `--_` are private implementation
52
- details. They are not versioned API and may change between releases.
28
+ ## Setup
53
29
 
54
- Migration note: Ropav only supports the allowlisted runtime tokens above as public
55
- CSS variables. Raw palette variables such as `--rp-color-gray-*`,
56
- `--rp-color-white`, `--rp-color-black`, z-index variables, component layout
57
- variables, and component-state variables such as `--rp-button-solid-hover-bg` are
58
- not public runtime tokens.
30
+ ```ts
31
+ import 'ropav/base.css';
32
+ ```
59
33
 
60
- ## Development
34
+ Import the components you need:
61
35
 
62
- ```bash
63
- pnpm install
64
- pnpm dev
65
- pnpm lint
66
- pnpm format:check
67
- pnpm test
68
- pnpm build
36
+ ```ts
37
+ import { Button } from 'ropav';
69
38
  ```
package/dist/base.css CHANGED
@@ -221,4 +221,25 @@ html.dark {
221
221
  --rp-shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.4), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
222
222
  --rp-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
223
223
  --rp-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
224
+ }
225
+
226
+ .rp-spinner {
227
+ display: inline-block;
228
+ width: 1em;
229
+ height: 1em;
230
+ flex-shrink: 0;
231
+ transform-origin: center;
232
+ animation: rp-spinner-spin 700ms linear infinite;
233
+ }
234
+
235
+ .rp-spinner > svg {
236
+ display: block;
237
+ width: 100%;
238
+ height: 100%;
239
+ }
240
+
241
+ @keyframes rp-spinner-spin {
242
+ to {
243
+ transform: rotate(360deg);
244
+ }
224
245
  }
@@ -0,0 +1,50 @@
1
+ .rp-button-group[data-v-d9f79a5b] {
2
+ display: inline-flex;
3
+ align-items: stretch;
4
+ gap: var(--rp-spacing-2);
5
+ font-family: var(--rp-font-family);
6
+ vertical-align: middle;
7
+ }
8
+ .rp-button-group--vertical[data-v-d9f79a5b] {
9
+ flex-direction: column;
10
+ }
11
+ .rp-button-group--wrap[data-v-d9f79a5b] {
12
+ flex-wrap: wrap;
13
+ }
14
+ .rp-button-group--attached[data-v-d9f79a5b] {
15
+ gap: 0;
16
+ }
17
+ .rp-button-group--attached[data-v-d9f79a5b]:focus-within {
18
+ position: relative;
19
+ z-index: 1;
20
+ }
21
+ .rp-button-group--attached .rp-button[data-v-d9f79a5b-s] {
22
+ position: relative;
23
+ border-radius: 0;
24
+ box-shadow: none;
25
+ }
26
+ .rp-button-group--attached .rp-button[data-v-d9f79a5b-s]:is(:hover, :focus-visible) {
27
+ z-index: 1;
28
+ }
29
+ .rp-button-group--attached:not(.rp-button-group--vertical) .rp-button[data-v-d9f79a5b-s]:not(:first-child) {
30
+ margin-inline-start: calc(var(--rp-border-width-thin) * -1);
31
+ }
32
+ .rp-button-group--attached:not(.rp-button-group--vertical) .rp-button[data-v-d9f79a5b-s]:first-child {
33
+ border-start-start-radius: var(--_rp-button-radius);
34
+ border-end-start-radius: var(--_rp-button-radius);
35
+ }
36
+ .rp-button-group--attached:not(.rp-button-group--vertical) .rp-button[data-v-d9f79a5b-s]:last-child {
37
+ border-start-end-radius: var(--_rp-button-radius);
38
+ border-end-end-radius: var(--_rp-button-radius);
39
+ }
40
+ .rp-button-group--attached.rp-button-group--vertical .rp-button[data-v-d9f79a5b-s]:not(:first-child) {
41
+ margin-block-start: calc(var(--rp-border-width-thin) * -1);
42
+ }
43
+ .rp-button-group--attached.rp-button-group--vertical .rp-button[data-v-d9f79a5b-s]:first-child {
44
+ border-start-start-radius: var(--_rp-button-radius);
45
+ border-start-end-radius: var(--_rp-button-radius);
46
+ }
47
+ .rp-button-group--attached.rp-button-group--vertical .rp-button[data-v-d9f79a5b-s]:last-child {
48
+ border-end-start-radius: var(--_rp-button-radius);
49
+ border-end-end-radius: var(--_rp-button-radius);
50
+ }
@@ -0,0 +1,49 @@
1
+ import './button-group.css';
2
+ import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
+ import { computed, createSlot, defineVaporComponent, renderEffect, setAttr, setClass, setInsertionState, setProp, template } from "vue";
4
+ //#region src/components/button-group/button-group.vue?vue&type=script&setup=true&vapor=true&lang.ts
5
+ var t0 = template("<div data-v-d9f79a5b role=group>", 1);
6
+ //#endregion
7
+ //#region src/components/button-group/button-group.vue
8
+ var button_group_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
9
+ name: "RpButtonGroup",
10
+ __name: "button-group",
11
+ props: {
12
+ id: {},
13
+ orientation: { default: "horizontal" },
14
+ attached: {
15
+ type: Boolean,
16
+ default: false
17
+ },
18
+ wrap: {
19
+ type: Boolean,
20
+ default: false
21
+ },
22
+ ariaLabel: {},
23
+ describedby: {},
24
+ labelledby: {}
25
+ },
26
+ setup(__props) {
27
+ const props = __props;
28
+ const rootClass = computed(() => bem("rp-button-group", {
29
+ vertical: props.orientation === "vertical",
30
+ attached: props.attached,
31
+ wrap: props.wrap
32
+ }));
33
+ const n1 = t0();
34
+ renderEffect(() => {
35
+ setProp(n1, "id", __props.id);
36
+ setClass(n1, rootClass.value);
37
+ setAttr(n1, "aria-label", __props.ariaLabel || void 0);
38
+ setAttr(n1, "aria-labelledby", __props.labelledby);
39
+ setAttr(n1, "aria-describedby", __props.describedby);
40
+ });
41
+ setInsertionState(n1, null, 0);
42
+ createSlot("default", null, null, 1);
43
+ return n1;
44
+ }
45
+ }), [["__scopeId", "data-v-d9f79a5b"]]);
46
+ //#endregion
47
+ export { button_group_default as t };
48
+
49
+ //# sourceMappingURL=button-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button-group.js","names":[],"sources":["../src/components/button-group/button-group.vue","../src/components/button-group/button-group.vue"],"sourcesContent":["<template>\n <div\n :id=\"id\"\n :class=\"rootClass\"\n role=\"group\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"labelledby\"\n :aria-describedby=\"describedby\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type { ButtonGroupProps } from './types';\n\ndefineOptions({ name: 'RpButtonGroup' });\n\nconst props = withDefaults(defineProps<ButtonGroupProps>(), {\n orientation: 'horizontal',\n attached: false,\n wrap: false,\n});\n\nconst rootClass = computed(() =>\n bem('rp-button-group', {\n vertical: props.orientation === 'vertical',\n attached: props.attached,\n wrap: props.wrap,\n }),\n);\n</script>\n\n<style src=\"./button-group.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"id\"\n :class=\"rootClass\"\n role=\"group\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"labelledby\"\n :aria-describedby=\"describedby\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type { ButtonGroupProps } from './types';\n\ndefineOptions({ name: 'RpButtonGroup' });\n\nconst props = withDefaults(defineProps<ButtonGroupProps>(), {\n orientation: 'horizontal',\n attached: false,\n wrap: false,\n});\n\nconst rootClass = computed(() =>\n bem('rp-button-group', {\n vertical: props.orientation === 'vertical',\n attached: props.attached,\n wrap: props.wrap,\n }),\n);\n</script>\n\n<style src=\"./button-group.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAoBA,MAAM,QAAQ;EAMd,MAAM,YAAY,eACd,IAAI,mBAAmB;GACnB,UAAU,MAAM,gBAAgB;GAChC,UAAU,MAAM;GAChB,MAAM,MAAM;EAChB,CAAC,CACL;;;eA9BS,MAAI,QAAA,EAAE;gBACC,UAAA,KAAS;eAEhB,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,mBAAiB,QAAA,UAAU;eAC3B,oBAAkB,QAAA,WAAW"}
package/dist/button.css CHANGED
@@ -1,14 +1,26 @@
1
- .rp-button[data-v-b8d57358] {
2
- --_rp-button-accent: var(--rp-color-primary);
3
- --_rp-button-accent-hover: var(--rp-color-primary-hover);
4
- --_rp-button-accent-active: var(--rp-color-primary-active);
5
- --_rp-button-accent-on: var(--rp-color-on-primary);
6
- --_rp-button-accent-subtle-bg: var(--rp-color-primary-subtle-bg);
7
- --_rp-button-accent-subtle-bg-hover: var(--rp-color-primary-subtle-bg-hover);
8
- --_rp-button-accent-subtle-bg-active: var(--rp-color-primary-subtle-bg-active);
9
- --_rp-button-accent-border: var(--rp-color-primary-border);
10
- --_rp-button-accent-border-hover: var(--rp-color-primary-border-hover);
11
- --_rp-button-accent-fg: var(--rp-color-primary-fg);
1
+ .rp-button[data-v-4a751fe6] {
2
+ --_rp-button-accent: var(--_rp-button-custom-color, var(--rp-color-primary));
3
+ --_rp-button-accent-hover: var(--_rp-button-custom-hover, var(--rp-color-primary-hover));
4
+ --_rp-button-accent-active: var(--_rp-button-custom-active, var(--rp-color-primary-active));
5
+ --_rp-button-accent-on: var(--_rp-button-custom-on, var(--rp-color-on-primary));
6
+ --_rp-button-accent-subtle-bg: var(
7
+ --_rp-button-custom-subtle-bg,
8
+ var(--rp-color-primary-subtle-bg)
9
+ );
10
+ --_rp-button-accent-subtle-bg-hover: var(
11
+ --_rp-button-custom-subtle-bg-hover,
12
+ var(--rp-color-primary-subtle-bg-hover)
13
+ );
14
+ --_rp-button-accent-subtle-bg-active: var(
15
+ --_rp-button-custom-subtle-bg-active,
16
+ var(--rp-color-primary-subtle-bg-active)
17
+ );
18
+ --_rp-button-accent-border: var(--_rp-button-custom-border, var(--rp-color-primary-border));
19
+ --_rp-button-accent-border-hover: var(
20
+ --_rp-button-custom-border-hover,
21
+ var(--rp-color-primary-border-hover)
22
+ );
23
+ --_rp-button-accent-fg: var(--_rp-button-custom-fg, var(--rp-color-primary-fg));
12
24
  --_rp-button-bg: var(--rp-color-button-default-bg);
13
25
  --_rp-button-bg-hover: var(--rp-color-button-default-bg-hover);
14
26
  --_rp-button-bg-active: var(--rp-color-button-default-bg-active);
@@ -26,8 +38,8 @@
26
38
  display: inline-flex;
27
39
  align-items: center;
28
40
  justify-content: center;
41
+ position: relative;
29
42
  box-sizing: border-box;
30
- gap: var(--rp-spacing-2);
31
43
  font-family: var(--rp-font-family);
32
44
  font-weight: var(--rp-font-weight-medium);
33
45
  line-height: var(--rp-line-height-none);
@@ -45,18 +57,18 @@
45
57
  font-size: var(--_rp-button-font-size);
46
58
  border-radius: var(--_rp-button-radius);
47
59
  }
48
- .rp-button[data-v-b8d57358]:hover:not(:disabled) {
60
+ .rp-button[data-v-4a751fe6]:hover:not(:disabled) {
49
61
  background-color: var(--_rp-button-bg-hover);
50
62
  border-color: var(--_rp-button-border-hover);
51
63
  box-shadow: var(--_rp-button-shadow-hover);
52
64
  }
53
- .rp-button[data-v-b8d57358]:active:not(:disabled) {
65
+ .rp-button[data-v-4a751fe6]:active:not(:disabled) {
54
66
  background-color: var(--_rp-button-bg-active);
55
67
  border-color: var(--_rp-button-border-active);
56
68
  box-shadow: var(--_rp-button-shadow-active);
57
69
  transform: translateY(1px);
58
70
  }
59
- .rp-button--color-primary[data-v-b8d57358] {
71
+ .rp-button--color-primary[data-v-4a751fe6] {
60
72
  --_rp-button-accent: var(--rp-color-primary);
61
73
  --_rp-button-accent-hover: var(--rp-color-primary-hover);
62
74
  --_rp-button-accent-active: var(--rp-color-primary-active);
@@ -73,7 +85,7 @@
73
85
  --_rp-button-border-hover: var(--_rp-button-accent-border-hover);
74
86
  --_rp-button-fg: var(--_rp-button-accent-fg);
75
87
  }
76
- .rp-button--color-secondary[data-v-b8d57358] {
88
+ .rp-button--color-secondary[data-v-4a751fe6] {
77
89
  --_rp-button-accent: var(--rp-color-secondary);
78
90
  --_rp-button-accent-hover: var(--rp-color-secondary-hover);
79
91
  --_rp-button-accent-active: var(--rp-color-secondary-active);
@@ -90,7 +102,7 @@
90
102
  --_rp-button-border-hover: var(--_rp-button-accent-border-hover);
91
103
  --_rp-button-fg: var(--_rp-button-accent-fg);
92
104
  }
93
- .rp-button--color-success[data-v-b8d57358] {
105
+ .rp-button--color-success[data-v-4a751fe6] {
94
106
  --_rp-button-accent: var(--rp-color-success);
95
107
  --_rp-button-accent-hover: var(--rp-color-success-hover);
96
108
  --_rp-button-accent-active: var(--rp-color-success-active);
@@ -107,7 +119,7 @@
107
119
  --_rp-button-border-hover: var(--_rp-button-accent-border-hover);
108
120
  --_rp-button-fg: var(--_rp-button-accent-fg);
109
121
  }
110
- .rp-button--color-warning[data-v-b8d57358] {
122
+ .rp-button--color-warning[data-v-4a751fe6] {
111
123
  --_rp-button-accent: var(--rp-color-warning);
112
124
  --_rp-button-accent-hover: var(--rp-color-warning-hover);
113
125
  --_rp-button-accent-active: var(--rp-color-warning-active);
@@ -124,7 +136,7 @@
124
136
  --_rp-button-border-hover: var(--_rp-button-accent-border-hover);
125
137
  --_rp-button-fg: var(--_rp-button-accent-fg);
126
138
  }
127
- .rp-button--color-danger[data-v-b8d57358] {
139
+ .rp-button--color-danger[data-v-4a751fe6] {
128
140
  --_rp-button-accent: var(--rp-color-danger);
129
141
  --_rp-button-accent-hover: var(--rp-color-danger-hover);
130
142
  --_rp-button-accent-active: var(--rp-color-danger-active);
@@ -141,7 +153,7 @@
141
153
  --_rp-button-border-hover: var(--_rp-button-accent-border-hover);
142
154
  --_rp-button-fg: var(--_rp-button-accent-fg);
143
155
  }
144
- .rp-button--color-info[data-v-b8d57358] {
156
+ .rp-button--color-info[data-v-4a751fe6] {
145
157
  --_rp-button-accent: var(--rp-color-info);
146
158
  --_rp-button-accent-hover: var(--rp-color-info-hover);
147
159
  --_rp-button-accent-active: var(--rp-color-info-active);
@@ -158,7 +170,7 @@
158
170
  --_rp-button-border-hover: var(--_rp-button-accent-border-hover);
159
171
  --_rp-button-fg: var(--_rp-button-accent-fg);
160
172
  }
161
- .rp-button--color-neutral[data-v-b8d57358] {
173
+ .rp-button--color-neutral[data-v-4a751fe6] {
162
174
  --_rp-button-accent: var(--rp-color-neutral);
163
175
  --_rp-button-accent-hover: var(--rp-color-neutral-hover);
164
176
  --_rp-button-accent-active: var(--rp-color-neutral-active);
@@ -175,42 +187,42 @@
175
187
  --_rp-button-border-hover: var(--_rp-button-accent-border-hover);
176
188
  --_rp-button-fg: var(--_rp-button-accent-fg);
177
189
  }
178
- .rp-button--size-xs[data-v-b8d57358] {
190
+ .rp-button--size-xs[data-v-4a751fe6] {
179
191
  --_rp-button-height: calc(var(--rp-size-control-sm) - var(--rp-spacing-1));
180
192
  --_rp-button-padding-x: var(--rp-spacing-2);
181
193
  --_rp-button-font-size: var(--rp-font-size-xs);
182
194
  }
183
- .rp-button--size-sm[data-v-b8d57358] {
195
+ .rp-button--size-sm[data-v-4a751fe6] {
184
196
  --_rp-button-height: var(--rp-size-control-sm);
185
197
  --_rp-button-padding-x: var(--rp-spacing-3);
186
198
  --_rp-button-font-size: var(--rp-font-size-sm);
187
199
  }
188
- .rp-button--size-lg[data-v-b8d57358] {
200
+ .rp-button--size-lg[data-v-4a751fe6] {
189
201
  --_rp-button-height: var(--rp-size-control-lg);
190
202
  --_rp-button-padding-x: var(--rp-spacing-5);
191
203
  --_rp-button-font-size: var(--rp-font-size-lg);
192
204
  }
193
- .rp-button--size-xl[data-v-b8d57358] {
205
+ .rp-button--size-xl[data-v-4a751fe6] {
194
206
  --_rp-button-height: calc(var(--rp-size-control-lg) + var(--rp-spacing-2));
195
207
  --_rp-button-padding-x: var(--rp-spacing-6);
196
208
  --_rp-button-font-size: var(--rp-font-size-lg);
197
209
  }
198
- .rp-button--radius-xs[data-v-b8d57358] {
210
+ .rp-button--radius-xs[data-v-4a751fe6] {
199
211
  --_rp-button-radius: var(--rp-radius-xs);
200
212
  }
201
- .rp-button--radius-sm[data-v-b8d57358] {
213
+ .rp-button--radius-sm[data-v-4a751fe6] {
202
214
  --_rp-button-radius: var(--rp-radius-sm);
203
215
  }
204
- .rp-button--radius-md[data-v-b8d57358] {
216
+ .rp-button--radius-md[data-v-4a751fe6] {
205
217
  --_rp-button-radius: var(--rp-radius-md);
206
218
  }
207
- .rp-button--radius-lg[data-v-b8d57358] {
219
+ .rp-button--radius-lg[data-v-4a751fe6] {
208
220
  --_rp-button-radius: var(--rp-radius-lg);
209
221
  }
210
- .rp-button--radius-xl[data-v-b8d57358] {
222
+ .rp-button--radius-xl[data-v-4a751fe6] {
211
223
  --_rp-button-radius: var(--rp-radius-xl);
212
224
  }
213
- .rp-button--solid[data-v-b8d57358] {
225
+ .rp-button--solid[data-v-4a751fe6] {
214
226
  --_rp-button-bg: var(--_rp-button-accent);
215
227
  --_rp-button-bg-hover: var(--_rp-button-accent-hover);
216
228
  --_rp-button-bg-active: var(--_rp-button-accent-active);
@@ -219,7 +231,7 @@
219
231
  --_rp-button-border-active: var(--_rp-button-accent-active);
220
232
  --_rp-button-fg: var(--_rp-button-accent-on);
221
233
  }
222
- .rp-button--subtle[data-v-b8d57358] {
234
+ .rp-button--subtle[data-v-4a751fe6] {
223
235
  --_rp-button-bg: var(--_rp-button-accent-subtle-bg);
224
236
  --_rp-button-bg-hover: var(--_rp-button-accent-subtle-bg-hover);
225
237
  --_rp-button-bg-active: var(--_rp-button-accent-subtle-bg-active);
@@ -231,7 +243,7 @@
231
243
  --_rp-button-shadow-hover: none;
232
244
  --_rp-button-shadow-active: none;
233
245
  }
234
- .rp-button--surface[data-v-b8d57358] {
246
+ .rp-button--surface[data-v-4a751fe6] {
235
247
  --_rp-button-bg: var(--_rp-button-accent-subtle-bg);
236
248
  --_rp-button-bg-hover: var(--_rp-button-accent-subtle-bg-hover);
237
249
  --_rp-button-bg-active: var(--_rp-button-accent-subtle-bg-active);
@@ -243,7 +255,7 @@
243
255
  --_rp-button-shadow-hover: none;
244
256
  --_rp-button-shadow-active: none;
245
257
  }
246
- .rp-button--outline[data-v-b8d57358] {
258
+ .rp-button--outline[data-v-4a751fe6] {
247
259
  --_rp-button-bg: transparent;
248
260
  --_rp-button-bg-hover: var(--_rp-button-accent-subtle-bg-hover);
249
261
  --_rp-button-bg-active: var(--_rp-button-accent-subtle-bg-active);
@@ -255,7 +267,7 @@
255
267
  --_rp-button-shadow-hover: none;
256
268
  --_rp-button-shadow-active: none;
257
269
  }
258
- .rp-button--ghost[data-v-b8d57358] {
270
+ .rp-button--ghost[data-v-4a751fe6] {
259
271
  --_rp-button-bg: transparent;
260
272
  --_rp-button-bg-hover: var(--_rp-button-accent-subtle-bg-hover);
261
273
  --_rp-button-bg-active: var(--_rp-button-accent-subtle-bg-active);
@@ -267,7 +279,7 @@
267
279
  --_rp-button-shadow-hover: none;
268
280
  --_rp-button-shadow-active: none;
269
281
  }
270
- .rp-button--plain[data-v-b8d57358] {
282
+ .rp-button--plain[data-v-4a751fe6] {
271
283
  --_rp-button-bg: transparent;
272
284
  --_rp-button-bg-hover: transparent;
273
285
  --_rp-button-bg-active: transparent;
@@ -279,31 +291,49 @@
279
291
  --_rp-button-shadow-hover: none;
280
292
  --_rp-button-shadow-active: none;
281
293
  }
282
- .rp-button[data-v-b8d57358]:disabled {
294
+ .rp-button[data-v-4a751fe6]:disabled {
283
295
  opacity: var(--rp-opacity-disabled);
284
296
  cursor: not-allowed;
285
297
  box-shadow: none;
286
298
  transform: none;
287
299
  }
288
- .rp-button[data-v-b8d57358]:focus-visible {
300
+ .rp-button[data-v-4a751fe6]:focus-visible {
289
301
  outline: none;
290
302
  border-color: var(--rp-color-primary);
291
303
  box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
292
304
  }
293
- .rp-button__left[data-v-b8d57358], .rp-button__right[data-v-b8d57358] {
305
+ .rp-button--loading .rp-button__content[data-v-4a751fe6] {
306
+ visibility: hidden;
307
+ }
308
+ .rp-button__content[data-v-4a751fe6] {
309
+ display: inline-flex;
310
+ align-items: center;
311
+ justify-content: center;
312
+ gap: var(--rp-spacing-2);
313
+ }
314
+ .rp-button__left[data-v-4a751fe6], .rp-button__right[data-v-4a751fe6] {
294
315
  display: inline-flex;
295
316
  align-items: center;
296
317
  flex-shrink: 0;
297
318
  }
298
- .rp-button__spinner[data-v-b8d57358] {
319
+ .rp-button__loading[data-v-4a751fe6] {
320
+ display: inline-flex;
321
+ align-items: center;
322
+ justify-content: center;
323
+ position: absolute;
324
+ top: 50%;
325
+ left: 50%;
326
+ translate: -50% -50%;
327
+ }
328
+ .rp-button__spinner[data-v-4a751fe6] {
299
329
  display: block;
300
330
  width: 1em;
301
331
  height: 1em;
302
332
  flex-shrink: 0;
303
333
  transform-origin: center;
304
- animation: rp-button-spin-b8d57358 700ms linear infinite;
334
+ animation: rp-spinner-spin-4a751fe6 700ms linear infinite;
305
335
  }
306
- @keyframes rp-button-spin-b8d57358 {
336
+ @keyframes rp-spinner-spin-4a751fe6 {
307
337
  to {
308
338
  transform: rotate(360deg);
309
339
  }
package/dist/button.js CHANGED
@@ -1,11 +1,13 @@
1
1
  import './button.css';
2
- import { t as loader_circle_default } from "./loader-circle.js";
2
+ import { n as loader_circle_default, t as getButtonColorStyle } from "./useButtonColor.js";
3
+ import { r as isComponentPresetColor } from "./componentColors.js";
3
4
  import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
4
- import { child, computed, createComponent, createIf, createSlot, defineVaporComponent, renderEffect, setClass, setInsertionState, setProp, template, unref } from "vue";
5
+ import { child, computed, createComponent, createIf, createSlot, defineVaporComponent, renderEffect, setAttr, setClass, setInsertionState, setProp, setStyle, template, unref } from "vue";
5
6
  //#region src/components/button/button.vue?vue&type=script&setup=true&vapor=true&lang.ts
6
- var t0 = template("<span data-v-b8d57358 class=rp-button__left>");
7
- var t1 = template("<span data-v-b8d57358 class=rp-button__right>");
8
- var t2 = template("<button data-v-b8d57358><span data-v-b8d57358 class=rp-button__label></span>", 1);
7
+ var t0 = template("<span data-v-4a751fe6 class=rp-button__loading aria-hidden=true>");
8
+ var t1 = template("<span data-v-4a751fe6 class=rp-button__left>");
9
+ var t2 = template("<span data-v-4a751fe6 class=rp-button__right>");
10
+ var t3 = template("<button data-v-4a751fe6><span data-v-4a751fe6 class=rp-button__content><span data-v-4a751fe6 class=rp-button__label></span>", 1);
9
11
  //#endregion
10
12
  //#region src/components/button/button.vue
11
13
  var button_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -28,46 +30,54 @@ var button_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
28
30
  },
29
31
  setup(__props, { slots: $slots }) {
30
32
  const props = __props;
31
- const isLoading = computed(() => props.loading && !props.disabled);
32
33
  const rootClass = computed(() => bem("rp-button", {
33
34
  [props.variant ?? ""]: Boolean(props.variant),
34
- [`color-${props.color}`]: Boolean(props.color),
35
+ [`color-${props.color}`]: isComponentPresetColor(props.color),
35
36
  [`size-${props.size}`]: Boolean(props.size),
36
- [`radius-${props.radius}`]: Boolean(props.radius)
37
+ [`radius-${props.radius}`]: Boolean(props.radius),
38
+ loading: props.loading
37
39
  }));
38
- const n13 = t2();
39
- const n8 = child(n13, 2);
40
+ const rootStyle = computed(() => getButtonColorStyle(props.color));
41
+ const n17 = t3();
42
+ const n16 = child(n17, 1);
43
+ const n11 = child(n16, 1);
40
44
  renderEffect(() => {
41
- setClass(n13, rootClass.value);
42
- setProp(n13, "disabled", __props.disabled || isLoading.value || void 0);
43
- setProp(n13, "type", __props.type);
45
+ const _loading = __props.loading;
46
+ setClass(n17, rootClass.value);
47
+ setStyle(n17, rootStyle.value);
48
+ setProp(n17, "disabled", __props.disabled || _loading || void 0);
49
+ setProp(n17, "type", __props.type);
50
+ setAttr(n17, "aria-busy", _loading || void 0);
44
51
  });
45
- setInsertionState(n13, 0, 0);
46
- createIf(() => isLoading.value, () => {
47
- return createComponent(unref(loader_circle_default), {
48
- class: "rp-button__spinner",
49
- "aria-hidden": "true"
50
- });
52
+ setInsertionState(n17, 0, 0);
53
+ createIf(() => __props.loading, () => {
54
+ const n5 = t0();
55
+ setInsertionState(n5, null, 0);
56
+ createSlot("loading", null, () => {
57
+ return createComponent(unref(loader_circle_default), { class: "rp-button__spinner" });
58
+ }, 1);
59
+ return n5;
51
60
  });
52
- setInsertionState(n13, 0, 1);
53
- createIf(() => $slots.left && !isLoading.value, () => {
54
- const n6 = t0();
55
- setInsertionState(n6, null, 0);
61
+ renderEffect(() => setAttr(n16, "aria-hidden", __props.loading || void 0));
62
+ setInsertionState(n16, 0, 0);
63
+ createIf(() => $slots.left, () => {
64
+ const n9 = t1();
65
+ setInsertionState(n9, null, 0);
56
66
  createSlot("left", null, null, 1);
57
- return n6;
67
+ return n9;
58
68
  });
59
- setInsertionState(n8, null, 0);
69
+ setInsertionState(n11, null, 0);
60
70
  createSlot("default", null, null, 1);
61
- setInsertionState(n13, null, 3);
71
+ setInsertionState(n16, null, 2);
62
72
  createIf(() => $slots.right, () => {
63
- const n12 = t1();
64
- setInsertionState(n12, null, 0);
73
+ const n15 = t2();
74
+ setInsertionState(n15, null, 0);
65
75
  createSlot("right", null, null, 1);
66
- return n12;
76
+ return n15;
67
77
  });
68
- return n13;
78
+ return n17;
69
79
  }
70
- }), [["__scopeId", "data-v-b8d57358"]]);
80
+ }), [["__scopeId", "data-v-4a751fe6"]]);
71
81
  //#endregion
72
82
  export { button_default as t };
73
83
 
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","names":[],"sources":["../src/components/button/button.vue","../src/components/button/button.vue"],"sourcesContent":["<template>\n <button :class=\"rootClass\" :disabled=\"disabled || isLoading || undefined\" :type=\"type\">\n <IconLoaderCircle v-if=\"isLoading\" class=\"rp-button__spinner\" aria-hidden=\"true\" />\n <span v-if=\"$slots.left && !isLoading\" class=\"rp-button__left\">\n <slot name=\"left\" />\n </span>\n <span class=\"rp-button__label\">\n <slot />\n </span>\n <span v-if=\"$slots.right\" class=\"rp-button__right\">\n <slot name=\"right\" />\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { bem } from '@/utils/bem';\nimport type { ButtonProps } from './types';\n\ndefineOptions({ name: 'RpButton' });\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst isLoading = computed(() => props.loading && !props.disabled);\n\nconst rootClass = computed(() =>\n bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: Boolean(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n }),\n);\n</script>\n\n<style src=\"./button.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button :class=\"rootClass\" :disabled=\"disabled || isLoading || undefined\" :type=\"type\">\n <IconLoaderCircle v-if=\"isLoading\" class=\"rp-button__spinner\" aria-hidden=\"true\" />\n <span v-if=\"$slots.left && !isLoading\" class=\"rp-button__left\">\n <slot name=\"left\" />\n </span>\n <span class=\"rp-button__label\">\n <slot />\n </span>\n <span v-if=\"$slots.right\" class=\"rp-button__right\">\n <slot name=\"right\" />\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { bem } from '@/utils/bem';\nimport type { ButtonProps } from './types';\n\ndefineOptions({ name: 'RpButton' });\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst isLoading = computed(() => props.loading && !props.disabled);\n\nconst rootClass = computed(() =>\n bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: Boolean(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n }),\n);\n</script>\n\n<style src=\"./button.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBA,MAAM,QAAQ;EAMd,MAAM,YAAY,eAAe,MAAM,WAAW,CAAC,MAAM,QAAQ;EAEjE,MAAM,YAAY,eACd,IAAI,aAAa;IACZ,MAAM,WAAW,KAAK,QAAQ,MAAM,OAAO;IAC3C,SAAS,MAAM,UAAU,QAAQ,MAAM,KAAK;IAC5C,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;IACzC,UAAU,MAAM,WAAW,QAAQ,MAAM,MAAM;EACpD,CAAC,CACL;;;;iBArCoB,UAAA,KAAS;gBAAG,YAAU,QAAA,YAAY,UAAA,SAAa,KAAA,CAAS;gBAAG,QAAM,QAAA,IAAI;;;iBACzD,UAAA,aAAS;;IAAE,OAAM;IAAqB,eAAY;;;;iBAC9D,OAAM,QAAA,CAAU,UAAA,aAAS;;;cAC3B,QAAW,MAAA,MAAA,CAAA;;;;;;iBAKT,OAAM,aAAA;;;cACR,SAAY,MAAA,MAAA,CAAA"}
1
+ {"version":3,"file":"button.js","names":[],"sources":["../src/components/button/button.vue","../src/components/button/button.vue"],"sourcesContent":["<template>\n <button\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :disabled=\"disabled || loading || undefined\"\n :type=\"type\"\n :aria-busy=\"loading || undefined\"\n >\n <span v-if=\"loading\" class=\"rp-button__loading\" aria-hidden=\"true\">\n <slot name=\"loading\">\n <IconLoaderCircle class=\"rp-button__spinner\" />\n </slot>\n </span>\n <span class=\"rp-button__content\" :aria-hidden=\"loading || undefined\">\n <span v-if=\"$slots.left\" class=\"rp-button__left\">\n <slot name=\"left\" />\n </span>\n <span class=\"rp-button__label\">\n <slot />\n </span>\n <span v-if=\"$slots.right\" class=\"rp-button__right\">\n <slot name=\"right\" />\n </span>\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport type { ButtonProps } from './types';\nimport { getButtonColorStyle } from './useButtonColor';\n\ndefineOptions({ name: 'RpButton' });\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst rootClass = computed(() =>\n bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n loading: props.loading,\n }),\n);\n\nconst rootStyle = computed(() => getButtonColorStyle(props.color));\n</script>\n\n<style src=\"./button.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :disabled=\"disabled || loading || undefined\"\n :type=\"type\"\n :aria-busy=\"loading || undefined\"\n >\n <span v-if=\"loading\" class=\"rp-button__loading\" aria-hidden=\"true\">\n <slot name=\"loading\">\n <IconLoaderCircle class=\"rp-button__spinner\" />\n </slot>\n </span>\n <span class=\"rp-button__content\" :aria-hidden=\"loading || undefined\">\n <span v-if=\"$slots.left\" class=\"rp-button__left\">\n <slot name=\"left\" />\n </span>\n <span class=\"rp-button__label\">\n <slot />\n </span>\n <span v-if=\"$slots.right\" class=\"rp-button__right\">\n <slot name=\"right\" />\n </span>\n </span>\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { computed } from 'vue';\nimport IconLoaderCircle from '~icons/lucide/loader-circle';\nimport { isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport type { ButtonProps } from './types';\nimport { getButtonColorStyle } from './useButtonColor';\n\ndefineOptions({ name: 'RpButton' });\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n type: 'button',\n disabled: false,\n loading: false,\n});\n\nconst rootClass = computed(() =>\n bem('rp-button', {\n [props.variant ?? '']: Boolean(props.variant),\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n loading: props.loading,\n }),\n);\n\nconst rootStyle = computed(() => getButtonColorStyle(props.color));\n</script>\n\n<style src=\"./button.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCA,MAAM,QAAQ;EAMd,MAAM,YAAY,eACd,IAAI,aAAa;IACZ,MAAM,WAAW,KAAK,QAAQ,MAAM,OAAO;IAC3C,SAAS,MAAM,UAAU,uBAAuB,MAAM,KAAK;IAC3D,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;IACzC,UAAU,MAAM,WAAW,QAAQ,MAAM,MAAM;GAChD,SAAS,MAAM;EACnB,CAAC,CACL;EAEA,MAAM,YAAY,eAAe,oBAAoB,MAAM,KAAK,CAAC;;;;;;iBAnDjD,UAAA,KAAS;iBACT,UAAA,KAAS;gBAChB,YAAU,QAAA,YAAY,YAAW,KAAA,CAAS;gBAC1C,QAAM,QAAA,IAAI;gBACV,aAAW,YAAW,KAAA,CAAS;;;iBAEpB,QAAA,eAAO;;;cACT,WAAc,YAAA;2DACE,OAAM,qBAAoB,CAAA;;;;kCAGlB,eAAa,QAAA,WAAW,KAAA,CAAS,CAAA;;iBACnD,OAAM,YAAA;;;cACR,QAAW,MAAA,MAAA,CAAA;;;;;;iBAKT,OAAM,aAAA;;;cACR,SAAY,MAAA,MAAA,CAAA"}