ropav 0.0.4 → 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 (97) hide show
  1. package/README.md +21 -43
  2. package/dist/base.css +36 -14
  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 +73 -43
  7. package/dist/button.js +41 -40
  8. package/dist/button.js.map +1 -1
  9. package/dist/card.css +88 -0
  10. package/dist/card.js +71 -0
  11. package/dist/card.js.map +1 -0
  12. package/dist/checkbox.css +108 -94
  13. package/dist/checkbox.js +18 -6
  14. package/dist/checkbox.js.map +1 -1
  15. package/dist/componentColors.js +22 -0
  16. package/dist/componentColors.js.map +1 -0
  17. package/dist/components/button/button.d.ts +2 -0
  18. package/dist/components/button/types.d.ts +2 -1
  19. package/dist/components/button/useButtonColor.d.ts +13 -0
  20. package/dist/components/button-group/button-group.d.ts +21 -0
  21. package/dist/components/button-group/index.d.ts +2 -0
  22. package/dist/components/button-group/index.js +2 -0
  23. package/dist/components/button-group/types.d.ts +10 -0
  24. package/dist/components/card/card.d.ts +21 -0
  25. package/dist/components/card/index.d.ts +2 -0
  26. package/dist/components/card/index.js +2 -0
  27. package/dist/components/card/types.d.ts +11 -0
  28. package/dist/components/checkbox/types.d.ts +2 -1
  29. package/dist/components/checkbox/useCheckbox.d.ts +4 -0
  30. package/dist/components/field/field.d.ts +35 -0
  31. package/dist/components/field/index.d.ts +2 -0
  32. package/dist/components/field/index.js +2 -0
  33. package/dist/components/field/types.d.ts +21 -0
  34. package/dist/components/icon-button/icon-button.d.ts +21 -0
  35. package/dist/components/icon-button/index.d.ts +2 -0
  36. package/dist/components/icon-button/index.js +2 -0
  37. package/dist/components/icon-button/types.d.ts +15 -0
  38. package/dist/components/progress/index.d.ts +3 -0
  39. package/dist/components/progress/index.js +2 -0
  40. package/dist/components/progress/progress.d.ts +27 -0
  41. package/dist/components/progress/types.d.ts +24 -0
  42. package/dist/components/progress/useProgress.d.ts +28 -0
  43. package/dist/components/radio/types.d.ts +2 -1
  44. package/dist/components/radio/useRadio.d.ts +4 -0
  45. package/dist/components/slider/index.d.ts +3 -0
  46. package/dist/components/slider/index.js +2 -0
  47. package/dist/components/slider/slider.d.ts +35 -0
  48. package/dist/components/slider/types.d.ts +50 -0
  49. package/dist/components/slider/useSlider.d.ts +50 -0
  50. package/dist/components/switch/types.d.ts +2 -1
  51. package/dist/components/switch/useSwitch.d.ts +3 -0
  52. package/dist/components/textarea/index.d.ts +1 -1
  53. package/dist/components/textarea/types.d.ts +5 -0
  54. package/dist/components/textarea/useTextarea.d.ts +2 -0
  55. package/dist/components/tooltip/index.d.ts +2 -0
  56. package/dist/components/tooltip/index.js +2 -0
  57. package/dist/components/tooltip/tooltip.d.ts +27 -0
  58. package/dist/components/tooltip/types.d.ts +29 -0
  59. package/dist/components/tooltip/useTooltip.d.ts +17 -0
  60. package/dist/field.css +40 -0
  61. package/dist/field.js +128 -0
  62. package/dist/field.js.map +1 -0
  63. package/dist/icon-button.css +372 -0
  64. package/dist/icon-button.js +67 -0
  65. package/dist/icon-button.js.map +1 -0
  66. package/dist/index.d.ts +7 -0
  67. package/dist/index.js +9 -1
  68. package/dist/input.css +2 -2
  69. package/dist/progress.css +125 -0
  70. package/dist/progress.js +177 -0
  71. package/dist/progress.js.map +1 -0
  72. package/dist/radio.css +83 -83
  73. package/dist/radio.js +18 -6
  74. package/dist/radio.js.map +1 -1
  75. package/dist/select.css +16 -4
  76. package/dist/select.js +7 -0
  77. package/dist/select.js.map +1 -1
  78. package/dist/slider.css +438 -0
  79. package/dist/slider.js +412 -0
  80. package/dist/slider.js.map +1 -0
  81. package/dist/switch.css +79 -70
  82. package/dist/switch.js +15 -6
  83. package/dist/switch.js.map +1 -1
  84. package/dist/textarea.css +35 -28
  85. package/dist/textarea.js +106 -15
  86. package/dist/textarea.js.map +1 -1
  87. package/dist/tooltip.css +136 -0
  88. package/dist/tooltip.js +384 -0
  89. package/dist/tooltip.js.map +1 -0
  90. package/dist/useButtonColor.js +33 -0
  91. package/dist/useButtonColor.js.map +1 -0
  92. package/package.json +30 -2
  93. package/src/styles/_mixins.scss +17 -0
  94. package/src/styles/_tokens.scss +14 -13
  95. package/src/styles/_utilities.scss +13 -0
  96. package/src/styles/_variables.scss +2 -1
  97. package/src/styles/base.scss +1 -0
package/README.md CHANGED
@@ -1,60 +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, 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 { Button } from 'ropav/button';
22
- ```
23
-
24
- ## Theming and tokens
17
+ import { createApp, vaporInteropPlugin } from 'vue';
25
18
 
26
- `ropav/base.css` exposes the public runtime token API as CSS custom properties. These
27
- tokens are intended for stable theme axes that consumers may override without
28
- rebuilding the library:
19
+ createApp(App).use(vaporInteropPlugin).mount('#app');
20
+ ```
29
21
 
30
- - semantic colors, surfaces, text, borders, focus rings, overlays, `on-*`, and
31
- `*-fg`
32
- - typography: `--rp-font-family`, `--rp-font-size-*`, `--rp-font-weight-*`, and
33
- `--rp-line-height-*`
34
- - density and control primitives: `--rp-spacing-*`, `--rp-size-control-*`,
35
- `--rp-border-width-*`, and `--rp-opacity-disabled`
36
- - radius, shadows, and transitions
22
+ ## Install
37
23
 
38
- Sass tokens exported through `ropav/scss/*` are implementation/build-time tokens.
39
- They may include raw palette values, z-index values, component layout constants,
40
- and mixin inputs that are not part of the runtime CSS variable contract.
24
+ ```bash
25
+ pnpm add ropav
26
+ ```
41
27
 
42
- Component-local custom properties that start with `--_` are private implementation
43
- details. They are not versioned API and may change between releases.
28
+ ## Setup
44
29
 
45
- Migration note: Ropav only supports the allowlisted runtime tokens above as public
46
- CSS variables. Raw palette variables such as `--rp-color-gray-*`,
47
- `--rp-color-white`, `--rp-color-black`, z-index variables, component layout
48
- variables, and component-state variables such as `--rp-button-solid-hover-bg` are
49
- not public runtime tokens.
30
+ ```ts
31
+ import 'ropav/base.css';
32
+ ```
50
33
 
51
- ## Development
34
+ Import the components you need:
52
35
 
53
- ```bash
54
- pnpm install
55
- pnpm dev
56
- pnpm lint
57
- pnpm format:check
58
- pnpm test
59
- pnpm build
36
+ ```ts
37
+ import { Button } from 'ropav';
60
38
  ```
package/dist/base.css CHANGED
@@ -11,20 +11,20 @@
11
11
  --rp-color-text-secondary: #646464;
12
12
  --rp-color-text-disabled: #8d8d8d;
13
13
  --rp-color-text-inverted: #ffffff;
14
- --rp-color-background: #ffffff;
15
- --rp-color-surface: #ffffff;
14
+ --rp-color-background: #f9f9f9;
15
+ --rp-color-surface: #fcfcfc;
16
16
  --rp-color-surface-raised: #ffffff;
17
17
  --rp-color-surface-muted: #f9f9f9;
18
18
  --rp-color-surface-hover: #f0f0f0;
19
- --rp-color-button-default-bg: #f9f9f9;
20
- --rp-color-button-default-bg-hover: #f0f0f0;
19
+ --rp-color-button-default-bg: var(--rp-color-surface);
20
+ --rp-color-button-default-bg-hover: var(--rp-color-surface-hover);
21
21
  --rp-color-button-default-bg-active: #e8e8e8;
22
22
  --rp-color-surface-inverted: #202020;
23
23
  --rp-color-overlay: rgba(17, 17, 17, 0.55);
24
24
  --rp-color-border: #d9d9d9;
25
25
  --rp-color-border-hover: #bbbbbb;
26
26
  --rp-color-focus-ring: color-mix(in srgb, var(--rp-color-primary) 32%, transparent);
27
- --rp-color-control-bg: #f9f9f9;
27
+ --rp-color-control-bg: var(--rp-color-surface);
28
28
  --rp-color-control-readonly-bg: var(--rp-color-surface-muted);
29
29
  --rp-color-control-fg: var(--rp-color-text);
30
30
  --rp-color-control-placeholder: var(--rp-color-text-secondary);
@@ -126,6 +126,7 @@
126
126
  --rp-spacing-10: 2.5rem;
127
127
  --rp-spacing-12: 3rem;
128
128
  --rp-radius-none: 0;
129
+ --rp-radius-xs: 0.25rem;
129
130
  --rp-radius-sm: 0.375rem;
130
131
  --rp-radius-md: 0.75rem;
131
132
  --rp-radius-lg: 1rem;
@@ -151,20 +152,20 @@ html.dark {
151
152
  --rp-color-text-secondary: #b4b4b4;
152
153
  --rp-color-text-disabled: #6e6e6e;
153
154
  --rp-color-text-inverted: #202020;
154
- --rp-color-background: #111111;
155
- --rp-color-surface: #111111;
156
- --rp-color-surface-raised: #191919;
157
- --rp-color-surface-muted: #191919;
158
- --rp-color-surface-hover: #222222;
159
- --rp-color-button-default-bg: #191919;
160
- --rp-color-button-default-bg-hover: #222222;
161
- --rp-color-button-default-bg-active: #2a2a2a;
155
+ --rp-color-background: #191919;
156
+ --rp-color-surface: #222222;
157
+ --rp-color-surface-raised: #2a2a2a;
158
+ --rp-color-surface-muted: #222222;
159
+ --rp-color-surface-hover: #2a2a2a;
160
+ --rp-color-button-default-bg: var(--rp-color-surface);
161
+ --rp-color-button-default-bg-hover: var(--rp-color-surface-hover);
162
+ --rp-color-button-default-bg-active: #313131;
162
163
  --rp-color-surface-inverted: #f9f9f9;
163
164
  --rp-color-overlay: rgba(17, 17, 17, 0.75);
164
165
  --rp-color-border: #3a3a3a;
165
166
  --rp-color-border-hover: #606060;
166
167
  --rp-color-focus-ring: color-mix(in srgb, var(--rp-color-primary) 45%, transparent);
167
- --rp-color-control-bg: #191919;
168
+ --rp-color-control-bg: var(--rp-color-surface);
168
169
  --rp-color-control-readonly-bg: var(--rp-color-surface-muted);
169
170
  --rp-color-control-fg: #eeeeee;
170
171
  --rp-color-control-placeholder: #6e6e6e;
@@ -220,4 +221,25 @@ html.dark {
220
221
  --rp-shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.4), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
221
222
  --rp-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
222
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
+ }
223
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] {
199
- --_rp-button-radius: var(--rp-radius-sm);
210
+ .rp-button--radius-xs[data-v-4a751fe6] {
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,20 +1,13 @@
1
1
  import './button.css';
2
+ import { n as loader_circle_default, t as getButtonColorStyle } from "./useButtonColor.js";
3
+ import { r as isComponentPresetColor } from "./componentColors.js";
2
4
  import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
- import { child, computed, createComponent, createIf, createSlot, defineVaporComponent, markRaw, renderEffect, setClass, setInsertionState, setProp, template, unref } from "vue";
4
- //#region ~icons/lucide/loader-circle
5
- var t0$1 = template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"M21 12a9 9 0 1 1-6.219-8.56\">", 3, 1);
6
- function render(_ctx) {
7
- return t0$1();
8
- }
9
- var loader_circle_default = markRaw(defineVaporComponent({
10
- name: "lucide-loader-circle",
11
- render
12
- }));
13
- //#endregion
5
+ import { child, computed, createComponent, createIf, createSlot, defineVaporComponent, renderEffect, setAttr, setClass, setInsertionState, setProp, setStyle, template, unref } from "vue";
14
6
  //#region src/components/button/button.vue?vue&type=script&setup=true&vapor=true&lang.ts
15
- var t0 = template("<span data-v-b8d57358 class=rp-button__left>");
16
- var t1 = template("<span data-v-b8d57358 class=rp-button__right>");
17
- 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);
18
11
  //#endregion
19
12
  //#region src/components/button/button.vue
20
13
  var button_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -37,46 +30,54 @@ var button_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
37
30
  },
38
31
  setup(__props, { slots: $slots }) {
39
32
  const props = __props;
40
- const isLoading = computed(() => props.loading && !props.disabled);
41
33
  const rootClass = computed(() => bem("rp-button", {
42
34
  [props.variant ?? ""]: Boolean(props.variant),
43
- [`color-${props.color}`]: Boolean(props.color),
35
+ [`color-${props.color}`]: isComponentPresetColor(props.color),
44
36
  [`size-${props.size}`]: Boolean(props.size),
45
- [`radius-${props.radius}`]: Boolean(props.radius)
37
+ [`radius-${props.radius}`]: Boolean(props.radius),
38
+ loading: props.loading
46
39
  }));
47
- const n13 = t2();
48
- 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);
49
44
  renderEffect(() => {
50
- setClass(n13, rootClass.value);
51
- setProp(n13, "disabled", __props.disabled || isLoading.value || void 0);
52
- 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);
53
51
  });
54
- setInsertionState(n13, 0, 0);
55
- createIf(() => isLoading.value, () => {
56
- return createComponent(unref(loader_circle_default), {
57
- class: "rp-button__spinner",
58
- "aria-hidden": "true"
59
- });
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;
60
60
  });
61
- setInsertionState(n13, 0, 1);
62
- createIf(() => $slots.left && !isLoading.value, () => {
63
- const n6 = t0();
64
- 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);
65
66
  createSlot("left", null, null, 1);
66
- return n6;
67
+ return n9;
67
68
  });
68
- setInsertionState(n8, null, 0);
69
+ setInsertionState(n11, null, 0);
69
70
  createSlot("default", null, null, 1);
70
- setInsertionState(n13, null, 3);
71
+ setInsertionState(n16, null, 2);
71
72
  createIf(() => $slots.right, () => {
72
- const n12 = t1();
73
- setInsertionState(n12, null, 0);
73
+ const n15 = t2();
74
+ setInsertionState(n15, null, 0);
74
75
  createSlot("right", null, null, 1);
75
- return n12;
76
+ return n15;
76
77
  });
77
- return n13;
78
+ return n17;
78
79
  }
79
- }), [["__scopeId", "data-v-b8d57358"]]);
80
+ }), [["__scopeId", "data-v-4a751fe6"]]);
80
81
  //#endregion
81
82
  export { button_default as t };
82
83