@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.
Files changed (56) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +11 -0
  3. package/eslint.config.cjs +22 -0
  4. package/package.json +17 -0
  5. package/project.json +28 -0
  6. package/shims-vue.d.ts +5 -0
  7. package/src/_color.scss +41 -0
  8. package/src/_sun.scss +15 -0
  9. package/src/_wx.scss +23 -0
  10. package/src/accordion/index.scss +18 -0
  11. package/src/accordion/index.ts +1 -0
  12. package/src/accordion/index.vue +27 -0
  13. package/src/chip/index.scss +77 -0
  14. package/src/chip/index.ts +1 -0
  15. package/src/chip/index.vue +27 -0
  16. package/src/fab/fab-group.vue +17 -0
  17. package/src/fab/fab.vue +5 -0
  18. package/src/fab/index.scss +18 -0
  19. package/src/fab/index.ts +2 -0
  20. package/src/index.scss +3 -0
  21. package/src/index.ts +11 -0
  22. package/src/lazy-render/index.ts +1 -0
  23. package/src/lazy-render/index.vue +38 -0
  24. package/src/navbar/index.scss +18 -0
  25. package/src/navbar/index.ts +1 -0
  26. package/src/navbar/index.vue +26 -0
  27. package/src/popover/index.scss +100 -0
  28. package/src/popover/index.ts +1 -0
  29. package/src/popover/index.vue +56 -0
  30. package/src/segment/index.scss +44 -0
  31. package/src/segment/index.ts +2 -0
  32. package/src/segment/injection.ts +8 -0
  33. package/src/segment/segment-btn.vue +28 -0
  34. package/src/segment/segment.vue +86 -0
  35. package/src/spinner/index.scss +84 -0
  36. package/src/spinner/index.ts +1 -0
  37. package/src/spinner/index.vue +26 -0
  38. package/src/sudoku/index.scss +22 -0
  39. package/src/sudoku/index.ts +2 -0
  40. package/src/sudoku/sudoku-item.vue +5 -0
  41. package/src/sudoku/sudoku.vue +23 -0
  42. package/src/table/_table-cell.scss +50 -0
  43. package/src/table/_table-row.scss +14 -0
  44. package/src/table/_table.scss +70 -0
  45. package/src/table/index.scss +3 -0
  46. package/src/table/index.ts +3 -0
  47. package/src/table/table-cell.vue +26 -0
  48. package/src/table/table-row.vue +12 -0
  49. package/src/table/table.vue +39 -0
  50. package/src/virtual-scroll/index.scss +17 -0
  51. package/src/virtual-scroll/index.ts +1 -0
  52. package/src/virtual-scroll/index.vue +138 -0
  53. package/tsconfig.json +21 -0
  54. package/tsconfig.lib.json +26 -0
  55. package/tsconfig.spec.json +28 -0
  56. package/vite.config.ts +130 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 1.0.1 (2025-01-22)
2
+
3
+ This was a version bump only for ui-sun to align it with other projects, there were no code changes.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # ui-sun
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Building
6
+
7
+ Run `nx build ui-sun` to build the library.
8
+
9
+ ## Running unit tests
10
+
11
+ Run `nx test ui-sun` to execute the unit tests via [Vitest](https://vitest.dev/).
@@ -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
@@ -0,0 +1,5 @@
1
+ declare module '*.vue' {
2
+ import type { DefineComponent } from 'vue'
3
+ const component: DefineComponent<Record<string, unknown>, Record<string, unknown>, any>
4
+ export default component
5
+ }
@@ -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
@@ -0,0 +1,15 @@
1
+ .unit-rmb::before {
2
+ content: "¥";
3
+ font-size: 0.75em;
4
+ letter-spacing: -0.03em;
5
+ }
6
+
7
+ .unit-percent::after {
8
+ content: "%";
9
+ font-size: 0.75em;
10
+ letter-spacing: -0.03em;
11
+ }
12
+
13
+ .small {
14
+ font-size: 0.85em;
15
+ }
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>
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <view v-bind="$attrs" class="sun-fab">
3
+ <slot></slot>
4
+ </view>
5
+ </template>
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ export { default as SunFabGroup } from './fab-group.vue';
2
+ export { default as SunFab } from './fab.vue';
package/src/index.scss ADDED
@@ -0,0 +1,3 @@
1
+ @use "color";
2
+ @use "wx";
3
+ @use "sun";
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>