@milaboratories/uikit 2.2.1 → 2.2.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.
- package/CHANGELOG.md +12 -0
- package/dist/pl-uikit.js +2391 -2313
- package/dist/pl-uikit.umd.cjs +5 -5
- package/dist/src/components/PlTabs/PlTabs.vue.d.ts +44 -0
- package/dist/src/components/PlTabs/Tab.vue.d.ts +106 -0
- package/dist/src/components/PlTabs/index.d.ts +1 -0
- package/dist/src/components/PlTabs/types.d.ts +12 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/style.css +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/components/PlLogView/pl-log-view.scss +2 -2
- package/src/components/PlTabs/PlTabs.vue +65 -0
- package/src/components/PlTabs/Tab.vue +52 -0
- package/src/components/PlTabs/index.ts +1 -0
- package/src/components/PlTabs/pl-tabs.module.scss +90 -0
- package/src/components/PlTabs/types.ts +12 -0
- package/src/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/uikit",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/pl-uikit.umd.js",
|
|
6
6
|
"module": "dist/pl-uikit.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"./*": "./*"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"vue": "^3.5.
|
|
21
|
+
"vue": "^3.5.13"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@vue/test-utils": "^2.4.6",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"resize-observer-polyfill": "^1.5.1",
|
|
28
28
|
"@vitejs/plugin-vue": "^5.1.4",
|
|
29
29
|
"tsc-alias": "^1.8.10",
|
|
30
|
-
"vitest": "^2.1.
|
|
31
|
-
"vite": "^5.4.
|
|
30
|
+
"vitest": "^2.1.5",
|
|
31
|
+
"vite": "^5.4.11",
|
|
32
32
|
"vue-tsc": "^2.1.6",
|
|
33
33
|
"yarpm": "^1.2.0",
|
|
34
34
|
"svgo": "^3.3.2",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
--border-color-log-view: var(--border-color-div-grey);
|
|
10
10
|
|
|
11
11
|
height: 100%;
|
|
12
|
-
max-height: 100
|
|
13
|
-
max-width: 100
|
|
12
|
+
max-height: calc(100% - var(--contour-offset));
|
|
13
|
+
max-width: calc(100% - var(--contour-offset));
|
|
14
14
|
border-radius: 6px;
|
|
15
15
|
background: var(--log-background);
|
|
16
16
|
display: flex;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* A component for selecting one value from a list of options
|
|
4
|
+
*/
|
|
5
|
+
export default {
|
|
6
|
+
name: 'PlTabs',
|
|
7
|
+
};
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<script lang="ts" setup generic="M extends string">
|
|
11
|
+
import style from './pl-tabs.module.scss';
|
|
12
|
+
import type { TabOption } from './types';
|
|
13
|
+
import Tab from './Tab.vue';
|
|
14
|
+
|
|
15
|
+
const emit = defineEmits<{
|
|
16
|
+
/**
|
|
17
|
+
* Emitted when the model value is updated.
|
|
18
|
+
*/
|
|
19
|
+
(e: 'update:modelValue', value: M): void;
|
|
20
|
+
}>();
|
|
21
|
+
|
|
22
|
+
const emitModel = (v: M) => emit('update:modelValue', v);
|
|
23
|
+
|
|
24
|
+
defineProps<{
|
|
25
|
+
/**
|
|
26
|
+
* The current selected tab value.
|
|
27
|
+
*/
|
|
28
|
+
modelValue?: M;
|
|
29
|
+
/**
|
|
30
|
+
* List of available options for the component
|
|
31
|
+
*/
|
|
32
|
+
options: Readonly<TabOption<M>[]>;
|
|
33
|
+
/**
|
|
34
|
+
* If `true`, the component is disabled and cannot be interacted with.
|
|
35
|
+
*/
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* If `true`, the `active` line appears on the top of element.
|
|
39
|
+
*/
|
|
40
|
+
topLine?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Maximum tab width (css value), can be overridden for each option
|
|
43
|
+
*/
|
|
44
|
+
maxTabWidth?: string;
|
|
45
|
+
}>();
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<template>
|
|
49
|
+
<div :class="[style.component, { [style.disabled]: disabled, [style.topLine]: topLine }]">
|
|
50
|
+
<Tab
|
|
51
|
+
v-for="(opt, i) in options"
|
|
52
|
+
:key="i"
|
|
53
|
+
:tabindex="modelValue === opt.value || disabled || opt.disabled ? undefined : 0"
|
|
54
|
+
:option="opt"
|
|
55
|
+
:class="[{ [style.active]: modelValue === opt.value, [style.disabled]: opt.disabled }, style.tab]"
|
|
56
|
+
:style="{ '--pl-tabs-item-max-width': opt.maxWidth ?? maxTabWidth }"
|
|
57
|
+
@keydown.enter="emitModel(opt.value)"
|
|
58
|
+
@click="emitModel(opt.value)"
|
|
59
|
+
>
|
|
60
|
+
<slot :name="opt.value" :option="opt">
|
|
61
|
+
<span>{{ opt.label }}</span>
|
|
62
|
+
</slot>
|
|
63
|
+
</Tab>
|
|
64
|
+
</div>
|
|
65
|
+
</template>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { onMounted, unref, ref, reactive } from 'vue';
|
|
3
|
+
import { PlTooltip } from '../PlTooltip';
|
|
4
|
+
import type { TabOption } from './types';
|
|
5
|
+
|
|
6
|
+
const rootRef = ref<{ $el: HTMLElement }>();
|
|
7
|
+
|
|
8
|
+
defineProps<{
|
|
9
|
+
option: TabOption;
|
|
10
|
+
}>();
|
|
11
|
+
|
|
12
|
+
const data = reactive({
|
|
13
|
+
isOverflown: false,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
onMounted(() => {
|
|
17
|
+
const root = unref(rootRef);
|
|
18
|
+
|
|
19
|
+
if (!root) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const el = root.$el.querySelector('span') as HTMLElement | null;
|
|
24
|
+
|
|
25
|
+
if (!el) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
requestAnimationFrame(() => {
|
|
30
|
+
if (el.offsetWidth < el.scrollWidth) {
|
|
31
|
+
data.isOverflown = true;
|
|
32
|
+
}
|
|
33
|
+
console.log('el.offsetWidth, el.scrollWidth', el.offsetWidth, el.scrollWidth);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<template>
|
|
39
|
+
<PlTooltip
|
|
40
|
+
ref="rootRef"
|
|
41
|
+
element="div"
|
|
42
|
+
position="top"
|
|
43
|
+
:hide="!data.isOverflown"
|
|
44
|
+
:close-delay="300"
|
|
45
|
+
:data-is-overflown="data.isOverflown ? 'true' : 'false'"
|
|
46
|
+
>
|
|
47
|
+
<slot />
|
|
48
|
+
<template #tooltip>
|
|
49
|
+
{{ option.label }}
|
|
50
|
+
</template>
|
|
51
|
+
</PlTooltip>
|
|
52
|
+
</template>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as PlTabs } from './PlTabs.vue';
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
@import "@/assets/mixins";
|
|
2
|
+
|
|
3
|
+
.component {
|
|
4
|
+
--pl-tabs-height: 40px;
|
|
5
|
+
--pl-tabs-item-border-color: var(--border-color-div-grey);
|
|
6
|
+
--pl-tabs-item-border-width: 0 0 2px 0;
|
|
7
|
+
--pl-tabs-item-text-color: var(--txt-03);
|
|
8
|
+
--pl-tabs-item-max-width: 400px;
|
|
9
|
+
--pl-tabs-cursor: pointer;
|
|
10
|
+
|
|
11
|
+
position: relative;
|
|
12
|
+
min-height: var(--pl-tabs-height);
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: row;
|
|
15
|
+
gap: 2px;
|
|
16
|
+
|
|
17
|
+
.tab {
|
|
18
|
+
position: relative;
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: row;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
align-items: center;
|
|
23
|
+
flex-wrap: nowrap;
|
|
24
|
+
gap: 12px;
|
|
25
|
+
padding: 10px 12px;
|
|
26
|
+
cursor: var(--pl-tabs-cursor);
|
|
27
|
+
outline: none;
|
|
28
|
+
position: relative;
|
|
29
|
+
|
|
30
|
+
&.disabled {
|
|
31
|
+
cursor: not-allowed;
|
|
32
|
+
pointer-events: none;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
> span {
|
|
36
|
+
color: var(--pl-tabs-item-text-color);
|
|
37
|
+
font-size: 13px;
|
|
38
|
+
font-style: normal;
|
|
39
|
+
font-weight: 600;
|
|
40
|
+
line-height: 14px; /* 107.692% */
|
|
41
|
+
letter-spacing: 0.52px;
|
|
42
|
+
text-transform: uppercase;
|
|
43
|
+
overflow: hidden;
|
|
44
|
+
text-overflow: ellipsis;
|
|
45
|
+
white-space: nowrap;
|
|
46
|
+
max-width: var(--pl-tabs-item-max-width);
|
|
47
|
+
min-width: 60px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&::after {
|
|
51
|
+
content: '';
|
|
52
|
+
position: absolute;
|
|
53
|
+
top: 0;
|
|
54
|
+
left: 0;
|
|
55
|
+
right: 0;
|
|
56
|
+
bottom: 0;
|
|
57
|
+
pointer-events: none;
|
|
58
|
+
border: solid var(--pl-tabs-item-border-color);
|
|
59
|
+
border-width: var(--pl-tabs-item-border-width);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&:hover:not(.active) {
|
|
63
|
+
--pl-tabs-item-border-color: var(--border-color-focus);
|
|
64
|
+
--pl-tabs-item-text-color: var(--txt-01);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&:focus-visible {
|
|
68
|
+
--pl-tabs-item-border-color: var(--border-color-focus);
|
|
69
|
+
--pl-tabs-item-border-width: 2px;
|
|
70
|
+
--pl-tabs-item-text-color: var(--txt-01);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&.active {
|
|
74
|
+
--pl-tabs-item-border-color: var(--border-color-focus);
|
|
75
|
+
--pl-tabs-item-text-color: var(--txt-01);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&.topLine {
|
|
80
|
+
--pl-tabs-item-border-width: 2px 0 0 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&.disabled {
|
|
84
|
+
--pl-tabs-cursor: not-allowed;
|
|
85
|
+
cursor: not-allowed;
|
|
86
|
+
* {
|
|
87
|
+
pointer-events: none;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -42,6 +42,7 @@ export * from './components/PlDialogModal';
|
|
|
42
42
|
export * from './components/PlSlideModal';
|
|
43
43
|
export * from './components/PlToggleSwitch';
|
|
44
44
|
export * from './components/PlLogView';
|
|
45
|
+
export * from './components/PlTabs';
|
|
45
46
|
|
|
46
47
|
export * from './components/PlFileDialog';
|
|
47
48
|
export * from './components/PlFileInput';
|