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
package/dist/tabs.css DELETED
@@ -1,45 +0,0 @@
1
- .rp-tabs[data-v-f9df84ad] {
2
- font-family: var(--rp-font-family);
3
- }.rp-tabs__list[data-v-f020ecc8] {
4
- display: flex;
5
- border-bottom: var(--rp-border-width-medium) solid var(--rp-color-border);
6
- gap: var(--rp-spacing-1);
7
- }.rp-tabs__trigger[data-v-7fa65d85] {
8
- padding: 0;
9
- font: inherit;
10
- background: none;
11
- border: none;
12
- cursor: pointer;
13
- font-weight: var(--rp-font-weight-medium);
14
- color: var(--rp-color-text-secondary);
15
- }
16
- .rp-tabs__trigger[data-v-7fa65d85]:hover:not(:disabled) {
17
- color: var(--rp-color-text);
18
- }
19
- .rp-tabs__trigger[data-v-7fa65d85]:focus-visible {
20
- outline: none;
21
- border-color: var(--rp-color-control-border-focus);
22
- box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
23
- }
24
- .rp-tabs__trigger[data-v-7fa65d85] {
25
- padding: var(--rp-spacing-2) var(--rp-spacing-4);
26
- font-size: var(--rp-font-size-sm);
27
- position: relative;
28
- transition: color var(--rp-transition-fast);
29
- margin-bottom: calc(-1 * var(--rp-border-width-medium));
30
- border-bottom: var(--rp-border-width-medium) solid transparent;
31
- }
32
- .rp-tabs__trigger--active[data-v-7fa65d85] {
33
- color: var(--rp-color-primary-fg);
34
- border-bottom-color: var(--rp-color-primary-fg);
35
- }
36
- .rp-tabs__trigger--disabled[data-v-7fa65d85] {
37
- opacity: var(--rp-opacity-disabled);
38
- cursor: not-allowed;
39
- }.rp-tab-panel[data-v-6205e839] {
40
- font-family: var(--rp-font-family);
41
- font-size: var(--rp-font-size-base);
42
- color: var(--rp-color-text);
43
- line-height: var(--rp-line-height-loose);
44
- padding: var(--rp-spacing-4) 0;
45
- }
package/dist/tabs.js DELETED
@@ -1,205 +0,0 @@
1
- import './tabs.css';
2
- import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
- import { t as useRequiredInject } from "./useRequiredInject.js";
4
- import { computed, createIf, createInvoker, createSlot, createTemplateRefSetter, defineVaporComponent, delegateEvents, provide, ref, renderEffect, setAttr, setClass, setInsertionState, setProp, template, unref, useId } from "vue";
5
- //#region src/components/tabs/types.ts
6
- var tabsKey = Symbol("tabs");
7
- //#endregion
8
- //#region src/components/tabs/useTabs.ts
9
- function safeTabId(value) {
10
- return value.replace(/[^a-zA-Z0-9_-]/g, "-");
11
- }
12
- function useTabs(props, tabsId, emitUpdate) {
13
- function select(value) {
14
- emitUpdate(value);
15
- }
16
- function getTriggerId(value) {
17
- return `${tabsId}-trigger-${safeTabId(value)}`;
18
- }
19
- function getPanelId(value) {
20
- return `${tabsId}-panel-${safeTabId(value)}`;
21
- }
22
- const rootClass = computed(() => bem("rp-tabs"));
23
- provide(tabsKey, {
24
- get activeTab() {
25
- return props.modelValue;
26
- },
27
- select,
28
- getTriggerId,
29
- getPanelId
30
- });
31
- return { rootClass };
32
- }
33
- function getEnabledTabs(list) {
34
- if (!list) return [];
35
- return Array.from(list.querySelectorAll("[role=\"tab\"]")).filter((tab) => !tab.disabled && tab.getAttribute("aria-disabled") !== "true");
36
- }
37
- function useTabsList() {
38
- const tabs = useRequiredInject(tabsKey, "RpTabsList");
39
- const listRef = ref(null);
40
- const rootClass = computed(() => bem("rp-tabs__list"));
41
- function focusTab(index) {
42
- const items = getEnabledTabs(listRef.value);
43
- if (items.length === 0) return;
44
- const item = items[(index + items.length) % items.length];
45
- item.focus();
46
- const value = item.dataset.value;
47
- if (value) tabs.select(value);
48
- }
49
- function onKeydown(e) {
50
- if (![
51
- "ArrowRight",
52
- "ArrowDown",
53
- "ArrowLeft",
54
- "ArrowUp",
55
- "Home",
56
- "End"
57
- ].includes(e.key)) return;
58
- const items = getEnabledTabs(listRef.value);
59
- if (items.length === 0) return;
60
- e.preventDefault();
61
- const current = items.indexOf(document.activeElement);
62
- if (e.key === "Home") focusTab(0);
63
- else if (e.key === "End") focusTab(items.length - 1);
64
- else if (e.key === "ArrowRight" || e.key === "ArrowDown") focusTab(current + 1);
65
- else focusTab(current - 1);
66
- }
67
- return {
68
- listRef,
69
- rootClass,
70
- onKeydown
71
- };
72
- }
73
- function useTabsTrigger(props) {
74
- const tabs = useRequiredInject(tabsKey, "RpTabsTrigger");
75
- const isActive = computed(() => tabs.activeTab === props.value);
76
- const rootClass = computed(() => bem("rp-tabs__trigger", {
77
- active: isActive.value,
78
- disabled: props.disabled
79
- }));
80
- function select() {
81
- if (!props.disabled) tabs.select(props.value);
82
- }
83
- return {
84
- tabs,
85
- isActive,
86
- rootClass,
87
- select
88
- };
89
- }
90
- function useTabPanel(props) {
91
- const tabs = useRequiredInject(tabsKey, "RpTabPanel");
92
- return {
93
- tabs,
94
- isActive: computed(() => tabs.activeTab === props.value)
95
- };
96
- }
97
- //#endregion
98
- //#region src/components/tabs/tabs.vue?vue&type=script&setup=true&vapor=true&lang.ts
99
- var t0$3 = template("<div data-v-f9df84ad>", 1);
100
- //#endregion
101
- //#region src/components/tabs/tabs.vue
102
- var tabs_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
103
- name: "RpTabs",
104
- __name: "tabs",
105
- props: { modelValue: {} },
106
- emits: ["update:modelValue"],
107
- setup(__props, { emit: __emit }) {
108
- const props = __props;
109
- const emit = __emit;
110
- const { rootClass } = useTabs(props, useId(), (value) => {
111
- emit("update:modelValue", value);
112
- });
113
- const n1 = t0$3();
114
- renderEffect(() => setClass(n1, unref(rootClass)));
115
- setInsertionState(n1, null, 0);
116
- createSlot("default", null, null, 1);
117
- return n1;
118
- }
119
- }), [["__scopeId", "data-v-f9df84ad"]]);
120
- //#endregion
121
- //#region src/components/tabs/tabs-list.vue?vue&type=script&setup=true&vapor=true&lang.ts
122
- var t0$2 = template("<div data-v-f020ecc8 role=tablist>", 1);
123
- delegateEvents("keydown");
124
- //#endregion
125
- //#region src/components/tabs/tabs-list.vue
126
- var tabs_list_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
127
- name: "RpTabsList",
128
- __name: "tabs-list",
129
- setup(__props) {
130
- const { listRef, rootClass, onKeydown } = useTabsList();
131
- const _setTemplateRef = createTemplateRefSetter();
132
- const n1 = t0$2();
133
- renderEffect(() => setClass(n1, unref(rootClass)));
134
- setInsertionState(n1, null, 0);
135
- createSlot("default", null, null, 1);
136
- n1.$evtkeydown = createInvoker((e) => unref(onKeydown)(e));
137
- _setTemplateRef(n1, listRef, null, "listRef");
138
- return n1;
139
- }
140
- }), [["__scopeId", "data-v-f020ecc8"]]);
141
- //#endregion
142
- //#region src/components/tabs/tabs-trigger.vue?vue&type=script&setup=true&vapor=true&lang.ts
143
- var t0$1 = template("<button data-v-7fa65d85 type=button role=tab>", 1);
144
- delegateEvents("click");
145
- //#endregion
146
- //#region src/components/tabs/tabs-trigger.vue
147
- var tabs_trigger_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
148
- name: "RpTabsTrigger",
149
- __name: "tabs-trigger",
150
- props: {
151
- value: {},
152
- disabled: {
153
- type: Boolean,
154
- default: false
155
- }
156
- },
157
- setup(__props) {
158
- const { tabs, isActive, rootClass, select } = useTabsTrigger(__props);
159
- const n1 = t0$1();
160
- renderEffect(() => {
161
- const _value = __props.value;
162
- const _isActive = unref(isActive);
163
- setProp(n1, "id", unref(tabs).getTriggerId(_value));
164
- setClass(n1, unref(rootClass));
165
- setProp(n1, "disabled", __props.disabled || void 0);
166
- setAttr(n1, "aria-selected", _isActive);
167
- setAttr(n1, "aria-controls", unref(tabs).getPanelId(_value));
168
- setProp(n1, "tabindex", _isActive ? 0 : -1);
169
- setAttr(n1, "data-value", _value);
170
- setAttr(n1, "data-state", _isActive ? "active" : "inactive");
171
- setAttr(n1, "data-disabled", __props.disabled || void 0);
172
- });
173
- setInsertionState(n1, null, 0);
174
- createSlot("default", null, null, 1);
175
- n1.$evtclick = createInvoker((e) => unref(select)(e));
176
- return n1;
177
- }
178
- }), [["__scopeId", "data-v-7fa65d85"]]);
179
- //#endregion
180
- //#region src/components/tabs/tab-panel.vue?vue&type=script&setup=true&vapor=true&lang.ts
181
- var t0 = template("<div data-v-6205e839 class=rp-tab-panel role=tabpanel tabindex=0>", 1);
182
- //#endregion
183
- //#region src/components/tabs/tab-panel.vue
184
- var tab_panel_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
185
- name: "RpTabPanel",
186
- __name: "tab-panel",
187
- props: { value: {} },
188
- setup(__props) {
189
- const { tabs, isActive } = useTabPanel(__props);
190
- return createIf(() => unref(isActive), () => {
191
- const n3 = t0();
192
- renderEffect(() => {
193
- setProp(n3, "id", unref(tabs).getPanelId(__props.value));
194
- setAttr(n3, "aria-labelledby", unref(tabs).getTriggerId(__props.value));
195
- });
196
- setInsertionState(n3, null, 0);
197
- createSlot("default", null, null, 1);
198
- return n3;
199
- });
200
- }
201
- }), [["__scopeId", "data-v-6205e839"]]);
202
- //#endregion
203
- export { tabs_default as i, tabs_trigger_default as n, tabs_list_default as r, tab_panel_default as t };
204
-
205
- //# sourceMappingURL=tabs.js.map
package/dist/tabs.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.js","names":[],"sources":["../src/components/tabs/types.ts","../src/components/tabs/useTabs.ts","../src/components/tabs/tabs.vue","../src/components/tabs/tabs.vue","../src/components/tabs/tabs-list.vue","../src/components/tabs/tabs-list.vue","../src/components/tabs/tabs-trigger.vue","../src/components/tabs/tabs-trigger.vue","../src/components/tabs/tab-panel.vue","../src/components/tabs/tab-panel.vue"],"sourcesContent":["import type { InjectionKey } from 'vue';\n\nexport interface TabsProps {\n modelValue: string;\n}\n\nexport interface TabPanelProps {\n value: string;\n}\n\nexport interface TabsTriggerProps {\n value: string;\n disabled?: boolean;\n}\n\nexport interface TabsContext {\n activeTab: string;\n select: (value: string) => void;\n getTriggerId: (value: string) => string;\n getPanelId: (value: string) => string;\n}\n\nexport const tabsKey = Symbol('tabs') as InjectionKey<TabsContext>;\n","import { computed, provide, ref } from 'vue';\nimport { useRequiredInject } from '@/composables/useRequiredInject';\nimport { bem } from '@/utils/bem';\nimport { tabsKey } from './types';\nimport type { TabPanelProps, TabsContext, TabsProps, TabsTriggerProps } from './types';\n\nfunction safeTabId(value: string) {\n return value.replace(/[^a-zA-Z0-9_-]/g, '-');\n}\n\nexport function useTabs(\n props: Readonly<TabsProps>,\n tabsId: string,\n emitUpdate: (value: string) => void,\n) {\n function select(value: string) {\n emitUpdate(value);\n }\n\n function getTriggerId(value: string) {\n return `${tabsId}-trigger-${safeTabId(value)}`;\n }\n\n function getPanelId(value: string) {\n return `${tabsId}-panel-${safeTabId(value)}`;\n }\n\n const rootClass = computed(() =>\n bem('rp-tabs'),\n );\n\n provide<TabsContext>(tabsKey, {\n get activeTab() { return props.modelValue; },\n select,\n getTriggerId,\n getPanelId,\n });\n\n return { rootClass };\n}\n\nfunction getEnabledTabs(list: HTMLElement | null) {\n if (!list) return [];\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]'))\n .filter((tab) => !tab.disabled && tab.getAttribute('aria-disabled') !== 'true');\n}\n\nexport function useTabsList() {\n const tabs = useRequiredInject(tabsKey, 'RpTabsList');\n const listRef = ref<HTMLElement | null>(null);\n\n const rootClass = computed(() => bem('rp-tabs__list'));\n\n function focusTab(index: number) {\n const items = getEnabledTabs(listRef.value);\n if (items.length === 0) return;\n\n const next = (index + items.length) % items.length;\n const item = items[next]!;\n item.focus();\n\n const value = item.dataset.value;\n if (value) tabs.select(value);\n }\n\n function onKeydown(e: KeyboardEvent) {\n const keys = ['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp', 'Home', 'End'];\n if (!keys.includes(e.key)) return;\n\n const items = getEnabledTabs(listRef.value);\n if (items.length === 0) return;\n\n e.preventDefault();\n const current = items.indexOf(document.activeElement as HTMLButtonElement);\n\n if (e.key === 'Home') {\n focusTab(0);\n } else if (e.key === 'End') {\n focusTab(items.length - 1);\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n focusTab(current + 1);\n } else {\n focusTab(current - 1);\n }\n }\n\n return {\n listRef,\n rootClass,\n onKeydown,\n };\n}\n\nexport function useTabsTrigger(props: Readonly<TabsTriggerProps>) {\n const tabs = useRequiredInject(tabsKey, 'RpTabsTrigger');\n const isActive = computed(() => tabs.activeTab === props.value);\n\n const rootClass = computed(() =>\n bem('rp-tabs__trigger', {\n active: isActive.value,\n disabled: props.disabled,\n }),\n );\n\n function select() {\n if (!props.disabled) tabs.select(props.value);\n }\n\n return {\n tabs,\n isActive,\n rootClass,\n select,\n };\n}\n\nexport function useTabPanel(props: Readonly<TabPanelProps>) {\n const tabs = useRequiredInject(tabsKey, 'RpTabPanel');\n const isActive = computed(() => tabs.activeTab === props.value);\n\n return {\n tabs,\n isActive,\n };\n}\n","<template>\n <div :class=\"rootClass\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useId } from 'vue';\nimport { useTabs } from './useTabs';\nimport type { TabsProps } from './types';\n\ndefineOptions({ name: 'RpTabs' });\n\nconst props = defineProps<TabsProps>();\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n}>();\n\nconst tabsId = useId();\nconst { rootClass } = useTabs(props, tabsId, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./tabs.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useId } from 'vue';\nimport { useTabs } from './useTabs';\nimport type { TabsProps } from './types';\n\ndefineOptions({ name: 'RpTabs' });\n\nconst props = defineProps<TabsProps>();\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n}>();\n\nconst tabsId = useId();\nconst { rootClass } = useTabs(props, tabsId, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./tabs.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\" role=\"tablist\" ref=\"listRef\" @keydown=\"onKeydown\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsList } from './useTabs';\n\ndefineOptions({ name: 'RpTabsList' });\n\nconst { listRef, rootClass, onKeydown } = useTabsList();\nvoid listRef;\n</script>\n\n<style src=\"./tabs-list.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\" role=\"tablist\" ref=\"listRef\" @keydown=\"onKeydown\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsList } from './useTabs';\n\ndefineOptions({ name: 'RpTabsList' });\n\nconst { listRef, rootClass, onKeydown } = useTabsList();\nvoid listRef;\n</script>\n\n<style src=\"./tabs-list.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button\n :id=\"tabs.getTriggerId(value)\"\n type=\"button\"\n role=\"tab\"\n :class=\"rootClass\"\n :disabled=\"disabled || undefined\"\n :aria-selected=\"isActive\"\n :aria-controls=\"tabs.getPanelId(value)\"\n :tabindex=\"isActive ? 0 : -1\"\n :data-value=\"value\"\n :data-state=\"isActive ? 'active' : 'inactive'\"\n :data-disabled=\"disabled || undefined\"\n @click=\"select\"\n >\n <slot />\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsTrigger } from './useTabs';\nimport type { TabsTriggerProps } from './types';\n\ndefineOptions({ name: 'RpTabsTrigger' });\n\nconst props = withDefaults(defineProps<TabsTriggerProps>(), {\n disabled: false,\n});\n\nconst { tabs, isActive, rootClass, select } = useTabsTrigger(props);\n</script>\n\n<style src=\"./tabs-trigger.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button\n :id=\"tabs.getTriggerId(value)\"\n type=\"button\"\n role=\"tab\"\n :class=\"rootClass\"\n :disabled=\"disabled || undefined\"\n :aria-selected=\"isActive\"\n :aria-controls=\"tabs.getPanelId(value)\"\n :tabindex=\"isActive ? 0 : -1\"\n :data-value=\"value\"\n :data-state=\"isActive ? 'active' : 'inactive'\"\n :data-disabled=\"disabled || undefined\"\n @click=\"select\"\n >\n <slot />\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsTrigger } from './useTabs';\nimport type { TabsTriggerProps } from './types';\n\ndefineOptions({ name: 'RpTabsTrigger' });\n\nconst props = withDefaults(defineProps<TabsTriggerProps>(), {\n disabled: false,\n});\n\nconst { tabs, isActive, rootClass, select } = useTabsTrigger(props);\n</script>\n\n<style src=\"./tabs-trigger.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n v-if=\"isActive\"\n :id=\"tabs.getPanelId(value)\"\n class=\"rp-tab-panel\"\n role=\"tabpanel\"\n tabindex=\"0\"\n :aria-labelledby=\"tabs.getTriggerId(value)\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabPanel } from './useTabs';\nimport type { TabPanelProps } from './types';\n\ndefineOptions({ name: 'RpTabPanel' });\n\nconst props = defineProps<TabPanelProps>();\n\nconst { tabs, isActive } = useTabPanel(props);\n</script>\n\n<style src=\"./tab-panel.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n v-if=\"isActive\"\n :id=\"tabs.getPanelId(value)\"\n class=\"rp-tab-panel\"\n role=\"tabpanel\"\n tabindex=\"0\"\n :aria-labelledby=\"tabs.getTriggerId(value)\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabPanel } from './useTabs';\nimport type { TabPanelProps } from './types';\n\ndefineOptions({ name: 'RpTabPanel' });\n\nconst props = defineProps<TabPanelProps>();\n\nconst { tabs, isActive } = useTabPanel(props);\n</script>\n\n<style src=\"./tab-panel.scss\" lang=\"scss\" scoped></style>\n"],"mappings":"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"}
package/dist/tooltip.css DELETED
@@ -1,78 +0,0 @@
1
- .rp-tooltip[data-v-87be39f8] {
2
- position: relative;
3
- display: inline-flex;
4
- }
5
- .rp-tooltip__tip[data-v-87be39f8] {
6
- --_arrow: 5px;
7
- --_gap: var(--rp-border-width-medium);
8
- position: absolute;
9
- z-index: var(--rp-z-index-tooltip);
10
- padding: var(--rp-spacing-1) var(--rp-spacing-2);
11
- font-family: var(--rp-font-family);
12
- font-size: var(--rp-font-size-xs);
13
- font-weight: var(--rp-font-weight-medium);
14
- line-height: var(--rp-line-height-normal);
15
- color: var(--rp-color-text-inverted);
16
- background-color: var(--rp-color-surface-inverted);
17
- border-radius: var(--rp-radius-md);
18
- white-space: nowrap;
19
- pointer-events: none;
20
- animation: rp-tooltip-fade-87be39f8 var(--rp-transition-fast);
21
- }
22
- .rp-tooltip__tip[data-v-87be39f8]::after {
23
- content: "";
24
- position: absolute;
25
- border: var(--_arrow) solid transparent;
26
- }
27
- .rp-tooltip__tip--top[data-v-87be39f8] {
28
- bottom: calc(100% + var(--_arrow) + var(--_gap));
29
- left: 50%;
30
- transform: translateX(-50%);
31
- }
32
- .rp-tooltip__tip--top[data-v-87be39f8]::after {
33
- top: 100%;
34
- left: 50%;
35
- transform: translateX(-50%);
36
- border-top-color: var(--rp-color-surface-inverted);
37
- }
38
- .rp-tooltip__tip--bottom[data-v-87be39f8] {
39
- top: calc(100% + var(--_arrow) + var(--_gap));
40
- left: 50%;
41
- transform: translateX(-50%);
42
- }
43
- .rp-tooltip__tip--bottom[data-v-87be39f8]::after {
44
- bottom: 100%;
45
- left: 50%;
46
- transform: translateX(-50%);
47
- border-bottom-color: var(--rp-color-surface-inverted);
48
- }
49
- .rp-tooltip__tip--left[data-v-87be39f8] {
50
- right: calc(100% + var(--_arrow) + var(--_gap));
51
- top: 50%;
52
- transform: translateY(-50%);
53
- }
54
- .rp-tooltip__tip--left[data-v-87be39f8]::after {
55
- left: 100%;
56
- top: 50%;
57
- transform: translateY(-50%);
58
- border-left-color: var(--rp-color-surface-inverted);
59
- }
60
- .rp-tooltip__tip--right[data-v-87be39f8] {
61
- left: calc(100% + var(--_arrow) + var(--_gap));
62
- top: 50%;
63
- transform: translateY(-50%);
64
- }
65
- .rp-tooltip__tip--right[data-v-87be39f8]::after {
66
- right: 100%;
67
- top: 50%;
68
- transform: translateY(-50%);
69
- border-right-color: var(--rp-color-surface-inverted);
70
- }
71
- @keyframes rp-tooltip-fade-87be39f8 {
72
- from {
73
- opacity: 0;
74
- }
75
- to {
76
- opacity: 1;
77
- }
78
- }
package/dist/tooltip.js DELETED
@@ -1,112 +0,0 @@
1
- import './tooltip.css';
2
- import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
- import { computed, createIf, createInvoker, createSlot, defineVaporComponent, delegateEvents, on, onBeforeUnmount, ref, renderEffect, setAttr, setClass, setInsertionState, setProp, template, unref, useId } from "vue";
4
- //#region src/composables/useDelayedOpen.ts
5
- function readOption(value, fallback) {
6
- return typeof value === "function" ? value() ?? fallback : value ?? fallback;
7
- }
8
- function useDelayedOpen(options = {}) {
9
- const isOpen = ref(false);
10
- let openTimer = null;
11
- function clearTimers() {
12
- if (openTimer) {
13
- clearTimeout(openTimer);
14
- openTimer = null;
15
- }
16
- }
17
- function isDisabled() {
18
- return readOption(options.disabled, false);
19
- }
20
- function open() {
21
- if (isDisabled()) return;
22
- const delay = readOption(options.openDelay, 0);
23
- if (delay <= 0) {
24
- isOpen.value = true;
25
- return;
26
- }
27
- if (openTimer) clearTimeout(openTimer);
28
- openTimer = setTimeout(() => {
29
- isOpen.value = true;
30
- openTimer = null;
31
- }, delay);
32
- }
33
- function closeImmediate() {
34
- clearTimers();
35
- isOpen.value = false;
36
- }
37
- onBeforeUnmount(clearTimers);
38
- return {
39
- isOpen,
40
- open,
41
- closeImmediate
42
- };
43
- }
44
- //#endregion
45
- //#region src/components/tooltip/useTooltip.ts
46
- function useTooltip(props) {
47
- const tooltipId = useId();
48
- const visibility = useDelayedOpen({
49
- openDelay: () => props.delay,
50
- disabled: () => props.disabled
51
- });
52
- function onShow() {
53
- visibility.open();
54
- }
55
- function onHide() {
56
- visibility.closeImmediate();
57
- }
58
- const tipClass = computed(() => bem("rp-tooltip__tip", props.placement ?? "top"));
59
- return {
60
- tooltipId,
61
- isVisible: visibility.isOpen,
62
- tipClass,
63
- onShow,
64
- onHide
65
- };
66
- }
67
- //#endregion
68
- //#region src/components/tooltip/tooltip.vue?vue&type=script&setup=true&vapor=true&lang.ts
69
- var t0 = template("<span data-v-87be39f8 role=tooltip>");
70
- var t1 = template("<span data-v-87be39f8 class=rp-tooltip>", 1);
71
- delegateEvents("focusin", "focusout");
72
- //#endregion
73
- //#region src/components/tooltip/tooltip.vue
74
- var tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
75
- name: "RpTooltip",
76
- __name: "tooltip",
77
- props: {
78
- placement: { default: "top" },
79
- delay: { default: 200 },
80
- disabled: {
81
- type: Boolean,
82
- default: false
83
- }
84
- },
85
- setup(__props, { slots: $slots }) {
86
- const { tooltipId, isVisible, tipClass, onShow, onHide } = useTooltip(__props);
87
- const n5 = t1();
88
- renderEffect(() => setAttr(n5, "aria-describedby", unref(isVisible) && !__props.disabled && $slots.content ? unref(tooltipId) : void 0));
89
- setInsertionState(n5, null, 0);
90
- createSlot("default", null, null, 1);
91
- setInsertionState(n5, null, 1);
92
- createIf(() => unref(isVisible) && !__props.disabled && $slots.content, () => {
93
- const n4 = t0();
94
- renderEffect(() => {
95
- setProp(n4, "id", unref(tooltipId));
96
- setClass(n4, unref(tipClass));
97
- });
98
- setInsertionState(n4, null, 0);
99
- createSlot("content", null, null, 1);
100
- return n4;
101
- });
102
- on(n5, "mouseenter", (e) => unref(onShow)(e));
103
- on(n5, "mouseleave", (e) => unref(onHide)(e));
104
- n5.$evtfocusin = createInvoker((e) => unref(onShow)(e));
105
- n5.$evtfocusout = createInvoker((e) => unref(onHide)(e));
106
- return n5;
107
- }
108
- }), [["__scopeId", "data-v-87be39f8"]]);
109
- //#endregion
110
- export { tooltip_default as t };
111
-
112
- //# sourceMappingURL=tooltip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tooltip.js","names":[],"sources":["../src/composables/useDelayedOpen.ts","../src/components/tooltip/useTooltip.ts","../src/components/tooltip/tooltip.vue","../src/components/tooltip/tooltip.vue"],"sourcesContent":["import { onBeforeUnmount, ref } from 'vue';\n\nexport interface UseDelayedOpenOptions {\n openDelay?: number | (() => number | undefined);\n disabled?: boolean | (() => boolean | undefined);\n}\n\nfunction readOption<T>(value: T | (() => T | undefined) | undefined, fallback: T): T {\n return typeof value === 'function'\n ? (value as () => T | undefined)() ?? fallback\n : value ?? fallback;\n}\n\nexport function useDelayedOpen(options: UseDelayedOpenOptions = {}) {\n const isOpen = ref(false);\n let openTimer: ReturnType<typeof setTimeout> | null = null;\n\n function clearTimers() {\n if (openTimer) { clearTimeout(openTimer); openTimer = null; }\n }\n\n function isDisabled() {\n return readOption(options.disabled, false);\n }\n\n function open() {\n if (isDisabled()) return;\n const delay = readOption(options.openDelay, 0);\n if (delay <= 0) {\n isOpen.value = true;\n return;\n }\n if (openTimer) clearTimeout(openTimer);\n openTimer = setTimeout(() => { isOpen.value = true; openTimer = null; }, delay);\n }\n\n function closeImmediate() {\n clearTimers();\n isOpen.value = false;\n }\n\n onBeforeUnmount(clearTimers);\n\n return {\n isOpen,\n open,\n closeImmediate,\n };\n}\n","import { computed, useId } from 'vue';\nimport { useDelayedOpen } from '@/composables/useDelayedOpen';\nimport { bem } from '@/utils/bem';\nimport type { TooltipProps } from './types';\n\nexport function useTooltip(props: Readonly<TooltipProps>) {\n const tooltipId = useId();\n const visibility = useDelayedOpen({\n openDelay: () => props.delay,\n disabled: () => props.disabled,\n });\n\n function onShow() {\n visibility.open();\n }\n\n function onHide() {\n visibility.closeImmediate();\n }\n\n const tipClass = computed(() =>\n bem('rp-tooltip__tip', props.placement ?? 'top'),\n );\n\n return {\n tooltipId,\n isVisible: visibility.isOpen,\n tipClass,\n onShow,\n onHide,\n };\n}\n","<template>\n <span\n class=\"rp-tooltip\"\n :aria-describedby=\"isVisible && !disabled && $slots.content ? tooltipId : undefined\"\n @mouseenter=\"onShow\"\n @mouseleave=\"onHide\"\n @focusin=\"onShow\"\n @focusout=\"onHide\"\n >\n <slot />\n <span v-if=\"isVisible && !disabled && $slots.content\" :id=\"tooltipId\" :class=\"tipClass\" role=\"tooltip\">\n <slot name=\"content\" />\n </span>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTooltip } from './useTooltip';\nimport type { TooltipProps } from './types';\n\ndefineOptions({ name: 'RpTooltip' });\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n placement: 'top',\n delay: 200,\n disabled: false,\n});\n\nconst { tooltipId, isVisible, tipClass, onShow, onHide } = useTooltip(props);\n</script>\n\n<style src=\"./tooltip.scss\" lang=\"scss\" scoped></style>\n","<template>\n <span\n class=\"rp-tooltip\"\n :aria-describedby=\"isVisible && !disabled && $slots.content ? tooltipId : undefined\"\n @mouseenter=\"onShow\"\n @mouseleave=\"onHide\"\n @focusin=\"onShow\"\n @focusout=\"onHide\"\n >\n <slot />\n <span v-if=\"isVisible && !disabled && $slots.content\" :id=\"tooltipId\" :class=\"tipClass\" role=\"tooltip\">\n <slot name=\"content\" />\n </span>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTooltip } from './useTooltip';\nimport type { TooltipProps } from './types';\n\ndefineOptions({ name: 'RpTooltip' });\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n placement: 'top',\n delay: 200,\n disabled: false,\n});\n\nconst { tooltipId, isVisible, tipClass, onShow, onHide } = useTooltip(props);\n</script>\n\n<style src=\"./tooltip.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;AAOA,SAAS,WAAc,OAA8C,UAAgB;CACjF,OAAO,OAAO,UAAU,aACjB,MAA8B,KAAK,WACpC,SAAS;AACnB;AAEA,SAAgB,eAAe,UAAiC,CAAC,GAAG;CAChE,MAAM,SAAS,IAAI,KAAK;CACxB,IAAI,YAAkD;CAEtD,SAAS,cAAc;EACnB,IAAI,WAAW;GAAE,aAAa,SAAS;GAAG,YAAY;EAAM;CAChE;CAEA,SAAS,aAAa;EAClB,OAAO,WAAW,QAAQ,UAAU,KAAK;CAC7C;CAEA,SAAS,OAAO;EACZ,IAAI,WAAW,GAAG;EAClB,MAAM,QAAQ,WAAW,QAAQ,WAAW,CAAC;EAC7C,IAAI,SAAS,GAAG;GACZ,OAAO,QAAQ;GACf;EACJ;EACA,IAAI,WAAW,aAAa,SAAS;EACrC,YAAY,iBAAiB;GAAE,OAAO,QAAQ;GAAM,YAAY;EAAM,GAAG,KAAK;CAClF;CAEA,SAAS,iBAAiB;EACtB,YAAY;EACZ,OAAO,QAAQ;CACnB;CAEA,gBAAgB,WAAW;CAE3B,OAAO;EACH;EACA;EACA;CACJ;AACJ;;;AC3CA,SAAgB,WAAW,OAA+B;CACtD,MAAM,YAAY,MAAM;CACxB,MAAM,aAAa,eAAe;EAC9B,iBAAiB,MAAM;EACvB,gBAAgB,MAAM;CAC1B,CAAC;CAED,SAAS,SAAS;EACd,WAAW,KAAK;CACpB;CAEA,SAAS,SAAS;EACd,WAAW,eAAe;CAC9B;CAEA,MAAM,WAAW,eACb,IAAI,mBAAmB,MAAM,aAAa,KAAK,CACnD;CAEA,OAAO;EACH;EACA,WAAW,WAAW;EACtB;EACA;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;ECHA,MAAM,EAAE,WAAW,WAAW,UAAU,QAAQ,WAAW,WAAW,OAAK;;iCAzBlE,oBAAkB,MAAA,SAAA,KAAS,CAAK,QAAA,YAAY,OAAM,UAAW,MAAA,SAAA,IAAY,KAAA,CAAS,CAAA;;;;iBAOvE,MAAA,SAAA,KAAS,CAAK,QAAA,YAAY,OAAM,eAAA;;;gBAAW,MAAI,MAAA,SAAA,CAAS;iBAAU,MAAA,QAAA,CAAQ;;;cAC5E,WAAc,MAAA,MAAA,CAAA;;;SAPvB,eAAU,MAAE,MAAA,MAAA,CAAM,CAAA,CAAA,CAAA;SAClB,eAAU,MAAE,MAAA,MAAA,CAAM,CAAA,CAAA,CAAA;wCACT,MAAA,MAAA,CAAM,CAAA,CAAA,CAAA;yCACL,MAAA,MAAA,CAAM,CAAA,CAAA,CAAA"}
@@ -1,11 +0,0 @@
1
- import { inject } from "vue";
2
- //#region src/composables/useRequiredInject.ts
3
- function useRequiredInject(key, componentName) {
4
- const value = inject(key);
5
- if (value == null) throw new Error(`[Ropav] <${componentName}> must be used inside its parent provider component.`);
6
- return value;
7
- }
8
- //#endregion
9
- export { useRequiredInject as t };
10
-
11
- //# sourceMappingURL=useRequiredInject.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRequiredInject.js","names":[],"sources":["../src/composables/useRequiredInject.ts"],"sourcesContent":["import { inject, type InjectionKey } from 'vue';\n\nexport function useRequiredInject<T>(key: InjectionKey<T>, componentName: string): T {\n const value = inject(key);\n if (value == null) {\n throw new Error(`[Ropav] <${componentName}> must be used inside its parent provider component.`);\n }\n return value;\n}\n"],"mappings":";;AAEA,SAAgB,kBAAqB,KAAsB,eAA0B;CACjF,MAAM,QAAQ,OAAO,GAAG;CACxB,IAAI,SAAS,MACT,MAAM,IAAI,MAAM,YAAY,cAAc,qDAAqD;CAEnG,OAAO;AACX"}