@solar-taro/ui-sun 0.0.0
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 +3 -0
- package/README.md +11 -0
- package/eslint.config.cjs +22 -0
- package/package.json +17 -0
- package/project.json +28 -0
- package/shims-vue.d.ts +5 -0
- package/src/_color.scss +41 -0
- package/src/_sun.scss +15 -0
- package/src/_wx.scss +23 -0
- package/src/accordion/index.scss +18 -0
- package/src/accordion/index.ts +1 -0
- package/src/accordion/index.vue +27 -0
- package/src/chip/index.scss +77 -0
- package/src/chip/index.ts +1 -0
- package/src/chip/index.vue +27 -0
- package/src/fab/fab-group.vue +17 -0
- package/src/fab/fab.vue +5 -0
- package/src/fab/index.scss +18 -0
- package/src/fab/index.ts +2 -0
- package/src/index.scss +3 -0
- package/src/index.ts +11 -0
- package/src/lazy-render/index.ts +1 -0
- package/src/lazy-render/index.vue +38 -0
- package/src/navbar/index.scss +18 -0
- package/src/navbar/index.ts +1 -0
- package/src/navbar/index.vue +26 -0
- package/src/popover/index.scss +100 -0
- package/src/popover/index.ts +1 -0
- package/src/popover/index.vue +56 -0
- package/src/segment/index.scss +44 -0
- package/src/segment/index.ts +2 -0
- package/src/segment/injection.ts +8 -0
- package/src/segment/segment-btn.vue +28 -0
- package/src/segment/segment.vue +86 -0
- package/src/spinner/index.scss +84 -0
- package/src/spinner/index.ts +1 -0
- package/src/spinner/index.vue +26 -0
- package/src/sudoku/index.scss +22 -0
- package/src/sudoku/index.ts +2 -0
- package/src/sudoku/sudoku-item.vue +5 -0
- package/src/sudoku/sudoku.vue +23 -0
- package/src/table/_table-cell.scss +50 -0
- package/src/table/_table-row.scss +14 -0
- package/src/table/_table.scss +70 -0
- package/src/table/index.scss +3 -0
- package/src/table/index.ts +3 -0
- package/src/table/table-cell.vue +26 -0
- package/src/table/table-row.vue +12 -0
- package/src/table/table.vue +39 -0
- package/src/virtual-scroll/index.scss +17 -0
- package/src/virtual-scroll/index.ts +1 -0
- package/src/virtual-scroll/index.vue +138 -0
- package/tsconfig.json +21 -0
- package/tsconfig.lib.json +26 -0
- package/tsconfig.spec.json +28 -0
- package/vite.config.ts +130 -0
package/CHANGELOG.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const baseConfig = require('../../eslint.config.cjs');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
...baseConfig,
|
|
5
|
+
{
|
|
6
|
+
files: ['**/*.json'],
|
|
7
|
+
rules: {
|
|
8
|
+
'@nx/dependency-checks': [
|
|
9
|
+
'error',
|
|
10
|
+
{
|
|
11
|
+
ignoredFiles: [
|
|
12
|
+
'{projectRoot}/eslint.config.{js,cjs,mjs}',
|
|
13
|
+
'{projectRoot}/vite.config.{js,ts,mjs,mts}',
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
languageOptions: {
|
|
19
|
+
parser: require('jsonc-eslint-parser'),
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
];
|
package/package.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@solar-taro/ui-sun",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./index.js",
|
|
6
|
+
"typings": "./index.d.ts",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"peerDependencies": {
|
|
12
|
+
"vue": "^3.0.0"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@vitejs/plugin-vue": "^5.0.0"
|
|
16
|
+
}
|
|
17
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ui-sun",
|
|
3
|
+
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "packages/ui-sun/src",
|
|
5
|
+
"projectType": "library",
|
|
6
|
+
"tags": [],
|
|
7
|
+
"targets": {
|
|
8
|
+
"postbuild": {
|
|
9
|
+
"executor": "nx:run-commands",
|
|
10
|
+
"dependsOn": [
|
|
11
|
+
"build"
|
|
12
|
+
],
|
|
13
|
+
"options": {
|
|
14
|
+
"commands": [
|
|
15
|
+
"node scripts/copy-assets.js ui-sun **/*.scss"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"release:dev": {
|
|
20
|
+
"executor": "nx:run-commands",
|
|
21
|
+
"options": {
|
|
22
|
+
"commands": [
|
|
23
|
+
"yalc publish dist/ui-sun"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
package/shims-vue.d.ts
ADDED
package/src/_color.scss
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
@use "sass:color";
|
|
2
|
+
@use "sass:map";
|
|
3
|
+
|
|
4
|
+
$colors: (
|
|
5
|
+
"white": #fff,
|
|
6
|
+
"black": #000,
|
|
7
|
+
"gray": #9e9e9e
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
$theme-colors: (
|
|
11
|
+
// 主色由应用程序端覆盖,这里随便写个颜色
|
|
12
|
+
"primary": #000,
|
|
13
|
+
"secondary": #616161,
|
|
14
|
+
"danger": #ff5252,
|
|
15
|
+
"info": #2196f3,
|
|
16
|
+
"success": #22c55e,
|
|
17
|
+
"warning": #ffc107,
|
|
18
|
+
"light": #fafafa,
|
|
19
|
+
"dark": #212121
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
// Converts a color to a comma separated rgb.
|
|
23
|
+
// --------------------------------------------------------------------------------------------
|
|
24
|
+
@function color-to-rgb-list($color) {
|
|
25
|
+
@return #{color.red($color)}, #{color.green($color)}, #{color.blue($color)};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
page {
|
|
29
|
+
@each $name, $value in map.merge($colors, $theme-colors) {
|
|
30
|
+
--color-#{$name}: #{$value};
|
|
31
|
+
--color-#{$name}-rgb: #{color-to-rgb-list($value)};
|
|
32
|
+
|
|
33
|
+
.color-#{$name} {
|
|
34
|
+
color: var(--color-#{$name});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.bg-#{$name} {
|
|
38
|
+
background-color: var(--color-#{$name});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
package/src/_sun.scss
ADDED
package/src/_wx.scss
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
page {
|
|
2
|
+
--safe-top: env(safe-area-inset-top);
|
|
3
|
+
--safe-bottom: env(safe-area-inset-bottom);
|
|
4
|
+
--safe-left: env(safe-area-inset-left);
|
|
5
|
+
--safe-right: env(safe-area-inset-right);
|
|
6
|
+
|
|
7
|
+
color: var(--color-dark);
|
|
8
|
+
font-size: 30rpx;
|
|
9
|
+
font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif;
|
|
10
|
+
|
|
11
|
+
> view {
|
|
12
|
+
min-height: 100vh;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
view,
|
|
18
|
+
text,
|
|
19
|
+
scroll-view,
|
|
20
|
+
::before,
|
|
21
|
+
::after {
|
|
22
|
+
box-sizing: border-box;
|
|
23
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.sun-accordion {
|
|
2
|
+
&-expanded {
|
|
3
|
+
.sun-accordion-content {
|
|
4
|
+
grid-template-rows: 1fr;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
&-content {
|
|
9
|
+
display: grid;
|
|
10
|
+
grid-template-rows: 0fr;
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
transition: grid-template-rows ease-out 150ms;
|
|
13
|
+
|
|
14
|
+
&-inner {
|
|
15
|
+
min-height: 0;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as SunAccordion } from './index.vue';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<view class="sun-accordion" :class="{ 'sun-accordion-expanded': expanded }">
|
|
3
|
+
<view class="sun-accordion-header" @tap="toggle()">
|
|
4
|
+
<slot></slot>
|
|
5
|
+
</view>
|
|
6
|
+
|
|
7
|
+
<view class="sun-accordion-content">
|
|
8
|
+
<view class="sun-accordion-content-inner">
|
|
9
|
+
<slot name="content" :toggle="toggle"></slot>
|
|
10
|
+
</view>
|
|
11
|
+
</view>
|
|
12
|
+
</view>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script lang="ts" setup>
|
|
16
|
+
const props = defineProps<{
|
|
17
|
+
disabled?: boolean
|
|
18
|
+
}>();
|
|
19
|
+
|
|
20
|
+
const expanded = defineModel<boolean>('expanded')
|
|
21
|
+
|
|
22
|
+
function toggle() {
|
|
23
|
+
if (!props.disabled) {
|
|
24
|
+
expanded.value = !expanded.value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
</script>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
.sun-chip {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
justify-content: center;
|
|
4
|
+
align-items: center;
|
|
5
|
+
color: var(--color);
|
|
6
|
+
background: var(--background);
|
|
7
|
+
border-radius: 99px;
|
|
8
|
+
|
|
9
|
+
&-default {
|
|
10
|
+
font-size: 30rpx;
|
|
11
|
+
height: 60rpx;
|
|
12
|
+
margin: 8rpx;
|
|
13
|
+
padding: 14rpx 24rpx;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
&-small {
|
|
17
|
+
font-size: 25rpx;
|
|
18
|
+
height: 50rpx;
|
|
19
|
+
margin: 6rpx;
|
|
20
|
+
padding: 10rpx 20rpx;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&-large {
|
|
24
|
+
font-size: 35rpx;
|
|
25
|
+
height: 70rpx;
|
|
26
|
+
margin: 8rpx;
|
|
27
|
+
padding: 20rpx 30rpx;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
&-solid {
|
|
31
|
+
--color: white;
|
|
32
|
+
--background: rgba(var(--color-rgb), 1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
&-outline {
|
|
36
|
+
--color: rgba(var(--color-rgb), 1);
|
|
37
|
+
--background: transparent;
|
|
38
|
+
border: 1px solid rgba(var(--color-rgb), 1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&-light {
|
|
42
|
+
--color: rgba(var(--color-rgb), 1);
|
|
43
|
+
--background: rgba(var(--color-rgb, 0, 0, 0), 0.12);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
&-primary {
|
|
47
|
+
--color-rgb: var(--color-primary-rgb);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&-secondary {
|
|
51
|
+
--color-rgb: var(--color-secondary-rgb);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&-danger {
|
|
55
|
+
--color-rgb: var(--color-danger-rgb);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
&-success {
|
|
59
|
+
--color-rgb: var(--color-success-rgb);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&-warning {
|
|
63
|
+
--color-rgb: var(--color-warning-rgb);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&-info {
|
|
67
|
+
--color-rgb: var(--color-info-rgb);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
&-light {
|
|
71
|
+
--color-rgb: var(--color-light-rgb);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
&-dark {
|
|
75
|
+
--color-rgb: var(--color-dark-rgb);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as SunChip } from './index.vue';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<view class="sun-chip" :class="classes">
|
|
3
|
+
<slot></slot>
|
|
4
|
+
</view>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script lang="ts" setup>
|
|
8
|
+
import { computed } from 'vue';
|
|
9
|
+
|
|
10
|
+
const props = withDefaults(
|
|
11
|
+
defineProps<{
|
|
12
|
+
type?: 'solid' | 'light' | 'outline'
|
|
13
|
+
size?: 'small' | 'default' | 'large'
|
|
14
|
+
color: 'primary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | 'secondary',
|
|
15
|
+
}>(),
|
|
16
|
+
{
|
|
17
|
+
type: 'light',
|
|
18
|
+
size: 'default',
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const classes = computed(() => [
|
|
23
|
+
`sun-chip-${props.size}`,
|
|
24
|
+
`sun-chip-${props.type}`,
|
|
25
|
+
`sun-chip-${props.color}`
|
|
26
|
+
]);
|
|
27
|
+
</script>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<view
|
|
3
|
+
v-bind="$attrs"
|
|
4
|
+
class="sun-fab-group"
|
|
5
|
+
:style="{ bottom: `calc(${15 + +offsetY}px + var(--safe-bottom))` }">
|
|
6
|
+
<slot></slot>
|
|
7
|
+
</view>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script lang="ts" setup>
|
|
11
|
+
defineProps({
|
|
12
|
+
offsetY: {
|
|
13
|
+
type: [Number, String],
|
|
14
|
+
default: 0
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
</script>
|
package/src/fab/fab.vue
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.sun-fab {
|
|
2
|
+
display: flex;
|
|
3
|
+
justify-content: center;
|
|
4
|
+
align-items: center;
|
|
5
|
+
width: 105rpx;
|
|
6
|
+
height: 105rpx;
|
|
7
|
+
border-radius: 50%;
|
|
8
|
+
|
|
9
|
+
&:not(:last-child) {
|
|
10
|
+
margin-bottom: 10px;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
&-group {
|
|
14
|
+
position: fixed;
|
|
15
|
+
right: calc(15px + var(--safe-right));
|
|
16
|
+
z-index: 1;
|
|
17
|
+
}
|
|
18
|
+
}
|
package/src/fab/index.ts
ADDED
package/src/index.scss
ADDED
package/src/index.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './accordion';
|
|
2
|
+
export * from './chip';
|
|
3
|
+
export * from './fab';
|
|
4
|
+
export * from './lazy-render';
|
|
5
|
+
export * from './navbar';
|
|
6
|
+
export * from './popover';
|
|
7
|
+
export * from './segment';
|
|
8
|
+
export * from './spinner';
|
|
9
|
+
export * from './sudoku';
|
|
10
|
+
export * from './table';
|
|
11
|
+
export * from './virtual-scroll';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as SunLazyRender } from './index.vue';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<slot v-if="show"></slot>
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script setup lang="ts">
|
|
6
|
+
import { onActivated, onDeactivated, ref } from 'vue';
|
|
7
|
+
|
|
8
|
+
const props = withDefaults(
|
|
9
|
+
defineProps<{
|
|
10
|
+
delay?: number,
|
|
11
|
+
hook?: 'activated' | 'created',
|
|
12
|
+
}>(),
|
|
13
|
+
{
|
|
14
|
+
delay: 50,
|
|
15
|
+
hook: 'activated',
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
const show = ref(false);
|
|
20
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
21
|
+
|
|
22
|
+
function lazyRender() {
|
|
23
|
+
timer = setTimeout(() => {
|
|
24
|
+
show.value = true;
|
|
25
|
+
}, props.delay);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (props.hook === 'created') lazyRender();
|
|
29
|
+
|
|
30
|
+
onActivated(() => {
|
|
31
|
+
lazyRender();
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
onDeactivated(() => {
|
|
35
|
+
show.value = false;
|
|
36
|
+
if (timer) clearTimeout(timer);
|
|
37
|
+
})
|
|
38
|
+
</script>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.sun-navbar {
|
|
2
|
+
height: var(--navbar-height);
|
|
3
|
+
padding: var(--navbar-padding-top) var(--navbar-padding-right) var(--navbar-padding-bottom) var(--navbar-padding-left);
|
|
4
|
+
|
|
5
|
+
&-inner {
|
|
6
|
+
position: relative;
|
|
7
|
+
display: flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
height: 100%;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
&-center {
|
|
13
|
+
position: absolute;
|
|
14
|
+
top: 50%;
|
|
15
|
+
left: 50%;
|
|
16
|
+
transform: translate(-50%, -50%);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as SunNavbar } from './index.vue';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<view class="sun-navbar" :style="navbarStyle">
|
|
3
|
+
<view class="sun-navbar-inner">
|
|
4
|
+
<slot></slot>
|
|
5
|
+
|
|
6
|
+
<view class="sun-navbar-center">
|
|
7
|
+
<slot name="center"></slot>
|
|
8
|
+
</view>
|
|
9
|
+
</view>
|
|
10
|
+
</view>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script lang="ts" setup>
|
|
14
|
+
import { withPixel } from '@solar-kit/core';
|
|
15
|
+
import { getNavbarRect } from '@solar-taro/core';
|
|
16
|
+
|
|
17
|
+
const navbarRect = getNavbarRect();
|
|
18
|
+
const navbarStyle = {
|
|
19
|
+
'--navbar-height': withPixel(navbarRect.height),
|
|
20
|
+
'--navbar-content-height': withPixel(navbarRect.buttonHeight),
|
|
21
|
+
'--navbar-padding-top': withPixel(navbarRect.paddingTop),
|
|
22
|
+
'--navbar-padding-bottom': withPixel(navbarRect.paddingBottom),
|
|
23
|
+
'--navbar-padding-left': withPixel(navbarRect.paddingLeft),
|
|
24
|
+
'--navbar-padding-right': withPixel(navbarRect.paddingRight),
|
|
25
|
+
};
|
|
26
|
+
</script>
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
.sun-popover {
|
|
2
|
+
position: relative;
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
|
|
5
|
+
&.sun-popover-show > .sun-popover-container {
|
|
6
|
+
opacity: 1;
|
|
7
|
+
visibility: visible;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
&.sun-popover-x-center {
|
|
11
|
+
justify-content: center;
|
|
12
|
+
|
|
13
|
+
&.sun-popover-y-bottom .sun-popover-arrow {
|
|
14
|
+
left: 50%;
|
|
15
|
+
bottom: 100%;
|
|
16
|
+
transform: translateX(-50%);
|
|
17
|
+
border-bottom-color: var(--popover-background);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&.sun-popover-y-top .sun-popover-arrow {
|
|
21
|
+
left: 50%;
|
|
22
|
+
top: 100%;
|
|
23
|
+
transform: translateX(-50%);
|
|
24
|
+
border-top-color: var(--popover-background);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&.sun-popover-x-left .sun-popover-container {
|
|
29
|
+
right: calc(100% + var(--popover-x-offset));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&.sun-popover-x-right .sun-popover-container {
|
|
33
|
+
left: calc(100% + var(--popover-x-offset));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&.sun-popover-x-start .sun-popover-container {
|
|
37
|
+
left: 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&.sun-popover-x-end .sun-popover-container {
|
|
41
|
+
right: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&.sun-popover-y-center {
|
|
45
|
+
align-items: center;
|
|
46
|
+
|
|
47
|
+
&.sun-popover-x-left .sun-popover-arrow {
|
|
48
|
+
left: 100%;
|
|
49
|
+
top: 50%;
|
|
50
|
+
transform: translateY(-50%);
|
|
51
|
+
border-left-color: var(--popover-background);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&.sun-popover-x-right .sun-popover-arrow {
|
|
55
|
+
right: 100%;
|
|
56
|
+
top: 50%;
|
|
57
|
+
transform: translateY(-50%);
|
|
58
|
+
border-right-color: var(--popover-background);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&.sun-popover-y-bottom {
|
|
63
|
+
.sun-popover-container {
|
|
64
|
+
top: calc(100% + var(--popover-y-offset));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
&.sun-popover-y-top {
|
|
69
|
+
.sun-popover-container {
|
|
70
|
+
bottom: calc(100% + var(--popover-y-offset));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
&.sun-popover-y-start .sun-popover-container {
|
|
75
|
+
top: 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
&.sun-popover-y-end .sun-popover-container {
|
|
79
|
+
bottom: 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.sun-popover-container {
|
|
84
|
+
position: absolute;
|
|
85
|
+
// padding: 10rpx 15rpx;
|
|
86
|
+
background: var(--popover-background);
|
|
87
|
+
border-radius: 15rpx;
|
|
88
|
+
text-align: left;
|
|
89
|
+
opacity: 0;
|
|
90
|
+
visibility: hidden;
|
|
91
|
+
transition:
|
|
92
|
+
opacity ease-out 0.15s,
|
|
93
|
+
visibility ease-out 0.15s;
|
|
94
|
+
z-index: 1;
|
|
95
|
+
|
|
96
|
+
> .sun-popover-arrow {
|
|
97
|
+
position: absolute;
|
|
98
|
+
border: 10rpx solid transparent;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as SunPopover } from './index.vue';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<view
|
|
3
|
+
class="sun-popover"
|
|
4
|
+
:class="[{ 'sun-popover-show': show }, `sun-popover-x-${x}`, `sun-popover-y-${y}`]"
|
|
5
|
+
:style="{ '--popover-x-offset': offsetX, '--popover-y-offset': offsetY, '--popover-background': bg } as any"
|
|
6
|
+
@tap.stop="false">
|
|
7
|
+
<view class="sun-popover-trigger">
|
|
8
|
+
<slot></slot>
|
|
9
|
+
</view>
|
|
10
|
+
|
|
11
|
+
<view v-bind="$attrs" class="sun-popover-container" :style="{ color: color }">
|
|
12
|
+
<view class="sun-popover-arrow"></view>
|
|
13
|
+
<slot name="content"></slot>
|
|
14
|
+
</view>
|
|
15
|
+
</view>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script lang="ts" setup>
|
|
19
|
+
defineProps({
|
|
20
|
+
/** 是否显示 */
|
|
21
|
+
show: {
|
|
22
|
+
type: Boolean,
|
|
23
|
+
default: undefined,
|
|
24
|
+
},
|
|
25
|
+
/** popover的横轴位置:left,right,start,end,center */
|
|
26
|
+
x: {
|
|
27
|
+
type: String,
|
|
28
|
+
default: 'left'
|
|
29
|
+
},
|
|
30
|
+
/** popover的纵轴位置:top,bottom,start,end,center */
|
|
31
|
+
y: {
|
|
32
|
+
type: String,
|
|
33
|
+
default: 'center'
|
|
34
|
+
},
|
|
35
|
+
/** 横轴偏移度 */
|
|
36
|
+
offsetX: {
|
|
37
|
+
type: String,
|
|
38
|
+
default: '7.5rpx'
|
|
39
|
+
},
|
|
40
|
+
/** 纵轴偏移度 */
|
|
41
|
+
offsetY: {
|
|
42
|
+
type: String,
|
|
43
|
+
default: '7.5rpx'
|
|
44
|
+
},
|
|
45
|
+
/** popover背景 */
|
|
46
|
+
bg: {
|
|
47
|
+
type: String,
|
|
48
|
+
default: '#fff'
|
|
49
|
+
},
|
|
50
|
+
/** popover文字颜色 */
|
|
51
|
+
color: {
|
|
52
|
+
type: String,
|
|
53
|
+
default: '#000'
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
</script>
|