@opentiny/vue-renderless 3.5.0 → 3.6.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/README.md ADDED
@@ -0,0 +1,26 @@
1
+ <p align="center">
2
+ <a href="https://tinyuidesign.cloudbu.huawei.com/" target="_blank" rel="noopener noreferrer">
3
+ <img alt="TinyVue Logo" src="./logo.svg" height="100" style="max-width:100%;">
4
+ </a>
5
+ </p>
6
+
7
+ <p align="center">Tiny-Vue-Renderless 是 TinyVue 组件库的逻辑层 </p>
8
+
9
+ ## 如何使用
10
+
11
+ 使用组件库时,只需安装 `@opentiny/vue` , `@opentiny/vue-renderless` 会同步完成安装
12
+
13
+ ## 本地开发
14
+ ```shell
15
+ git clone git@github.com:opentiny/tiny-vue-renderless.git
16
+ cd tiny-vue-renderless
17
+ npm i
18
+ ```
19
+ - 克隆的 tiny-vue-renderless 工程放在与 tiny-vue 工程同个目录文件夹
20
+ - 安装 tiny-vue-renderless 的依赖
21
+ - 然后启动 tiny-vue 工程
22
+ - 本地启动 tiny-vue 工程后,即可调试 tiny-vue-renderless 工程
23
+
24
+ ## 开源协议
25
+
26
+ [MIT](LICENSE)
@@ -7,4 +7,9 @@ export var handleItemClick = function handleItemClick(emit) {
7
7
  return function (data) {
8
8
  emit('item-click', data);
9
9
  };
10
+ };
11
+ export var visibleChange = function visibleChange(emit) {
12
+ return function (status) {
13
+ emit('visible-change', status);
14
+ };
10
15
  };
@@ -1,12 +1,14 @@
1
- import { handleMoreClick, handleItemClick } from './index';
2
- export var api = ['state', 'handleMoreClick', 'handleItemClick'];
1
+ import { handleMoreClick, handleItemClick, visibleChange } from './index';
2
+ export var api = ['state', 'handleMoreClick', 'handleItemClick', 'visibleChange'];
3
3
  export var renderless = function renderless(props, _ref, _ref2) {
4
4
  var computed = _ref.computed,
5
5
  reactive = _ref.reactive;
6
- var emit = _ref2.emit;
6
+ var emit = _ref2.emit,
7
+ nextTick = _ref2.nextTick;
7
8
  var api = {
8
9
  handleMoreClick: handleMoreClick(emit),
9
- handleItemClick: handleItemClick(emit)
10
+ handleItemClick: handleItemClick(emit),
11
+ visibleChange: visibleChange(emit)
10
12
  };
11
13
  var state = reactive({
12
14
  visibleOptions: computed(function () {
@@ -1,13 +1,58 @@
1
- export var visibleHandle = function visibleHandle(emit) {
1
+ export var setSheetStyle = function setSheetStyle(_ref) {
2
+ var state = _ref.state,
3
+ props = _ref.props;
2
4
  return function () {
5
+ if (props.contentPosition) {
6
+ state.sheetMaskStyle = {
7
+ 'position': 'absolute'
8
+ };
9
+ state.sheetContentStyle = {
10
+ 'position': 'absolute',
11
+ 'max-height': props.height
12
+ };
13
+ } else {
14
+ state.sheetMaskStyle = {
15
+ 'position': 'fixed'
16
+ };
17
+ state.sheetContentStyle = {
18
+ 'position': 'fixed',
19
+ 'max-height': props.height
20
+ };
21
+ }
22
+ };
23
+ };
24
+ export var initScrollMenu = function initScrollMenu(_ref2) {
25
+ var state = _ref2.state,
26
+ nextTick = _ref2.nextTick,
27
+ refs = _ref2.refs,
28
+ BScroll = _ref2.BScroll;
29
+ return function () {
30
+ nextTick(function () {
31
+ var scrollMenu = refs.scrollMenu;
32
+ if (!state.scroll) {
33
+ state.scroll = new BScroll(scrollMenu, {
34
+ probeType: 3,
35
+ click: true
36
+ });
37
+ } else {
38
+ state.scroll.refresh();
39
+ }
40
+ });
41
+ };
42
+ };
43
+ export var visibleHandle = function visibleHandle(_ref3) {
44
+ var emit = _ref3.emit,
45
+ state = _ref3.state;
46
+ return function () {
47
+ state.scroll = null;
3
48
  emit('update:visible', false);
4
49
  emit('close', false);
5
50
  };
6
51
  };
7
- export var watchVisible = function watchVisible(_ref) {
8
- var emit = _ref.emit,
9
- props = _ref.props,
10
- state = _ref.state;
52
+ export var watchVisible = function watchVisible(_ref4) {
53
+ var emit = _ref4.emit,
54
+ props = _ref4.props,
55
+ state = _ref4.state;
11
56
  return function (value) {
12
57
  state.active = props.modelValue;
13
58
  setTimeout(function () {
@@ -16,11 +61,12 @@ export var watchVisible = function watchVisible(_ref) {
16
61
  emit('update:visible', value);
17
62
  };
18
63
  };
19
- export var menuHandle = function menuHandle(_ref2) {
20
- var emit = _ref2.emit,
21
- state = _ref2.state;
64
+ export var menuHandle = function menuHandle(_ref5) {
65
+ var emit = _ref5.emit,
66
+ state = _ref5.state;
22
67
  return function (item) {
23
68
  state.active = item.id;
69
+ state.scroll = null;
24
70
  emit('update:visible', false);
25
71
  emit('update:modelValue', item.id);
26
72
  emit('click', item);
@@ -1,28 +1,61 @@
1
- import { visibleHandle, watchVisible, menuHandle } from './index';
2
- export var api = ['state', 'visibleHandle', 'menuHandle'];
3
- export var renderless = function renderless(props, _ref, _ref2) {
1
+ import { setSheetStyle, initScrollMenu, visibleHandle, watchVisible, menuHandle } from './index';
2
+ export var api = ['state', 'setSheetStyle', 'initScrollMenu', 'visibleHandle', 'menuHandle'];
3
+ export var renderless = function renderless(props, _ref, _ref2, _ref3) {
4
4
  var reactive = _ref.reactive,
5
5
  watch = _ref.watch;
6
- var emit = _ref2.emit;
6
+ var emit = _ref2.emit,
7
+ nextTick = _ref2.nextTick,
8
+ refs = _ref2.refs;
9
+ var BScroll = _ref3.BScroll;
7
10
  var api = {};
8
11
  var state = reactive({
9
12
  toggle: false,
10
- active: null
13
+ active: null,
14
+ sheetMaskStyle: {},
15
+ sheetContentStyle: {},
16
+ scroll: null
11
17
  });
12
18
  watch(function () {
13
19
  return props.visible;
14
- }, api.watchVisible);
20
+ }, function (value) {
21
+ if (value) {
22
+ api.setSheetStyle({
23
+ state: state,
24
+ props: props
25
+ });
26
+ api.initScrollMenu({
27
+ state: state,
28
+ nextTick: nextTick,
29
+ refs: refs,
30
+ BScroll: BScroll
31
+ });
32
+ }
33
+ api.watchVisible(value);
34
+ });
15
35
  Object.assign(api, {
16
36
  state: state,
17
- menuHandle: menuHandle({
37
+ setSheetStyle: setSheetStyle({
18
38
  state: state,
19
- emit: emit
39
+ props: props
40
+ }),
41
+ initScrollMenu: initScrollMenu({
42
+ state: state,
43
+ nextTick: nextTick,
44
+ refs: refs,
45
+ BScroll: BScroll
46
+ }),
47
+ visibleHandle: visibleHandle({
48
+ emit: emit,
49
+ state: state
20
50
  }),
21
- visibleHandle: visibleHandle(emit),
22
51
  watchVisible: watchVisible({
23
52
  emit: emit,
24
53
  props: props,
25
54
  state: state
55
+ }),
56
+ menuHandle: menuHandle({
57
+ state: state,
58
+ emit: emit
26
59
  })
27
60
  });
28
61
  return api;
@@ -0,0 +1,217 @@
1
+ import { addClass, removeClass } from '@opentiny/vue-renderless/common/deps/dom';
2
+ var setFixAnchor = function setFixAnchor(_ref) {
3
+ var vm = _ref.vm;
4
+ var fixRef = vm.$refs.fixRef;
5
+ if (fixRef) {
6
+ fixRef.style.top = fixRef.offsetTop;
7
+ }
8
+ };
9
+ var setMarkClass = function setMarkClass(_ref2) {
10
+ var state = _ref2.state,
11
+ props = _ref2.props;
12
+ var scrollContainer = state.scrollContainer;
13
+ var markClass = props.markClass;
14
+ var activeContentEl = scrollContainer.querySelector("".concat(state.currentLink));
15
+ if (markClass) {
16
+ addClass(activeContentEl, markClass);
17
+ setTimeout(function () {
18
+ removeClass(activeContentEl, markClass);
19
+ }, 1000);
20
+ }
21
+ };
22
+ var setScrollContainer = function setScrollContainer(_ref3) {
23
+ var state = _ref3.state,
24
+ api = _ref3.api,
25
+ _ref3$cb = _ref3.cb,
26
+ cb = _ref3$cb === void 0 ? null : _ref3$cb;
27
+ var currentContainer = api.getContainer();
28
+ var scrollContainer = state.scrollContainer;
29
+ if (scrollContainer !== currentContainer) {
30
+ removeClass(scrollContainer, 'tiny-anchor-scroll-container');
31
+ state.scrollContainer = currentContainer;
32
+ addClass(currentContainer, 'tiny-anchor-scroll-container');
33
+ cb && cb();
34
+ }
35
+ };
36
+ var updateSkidPosition = function updateSkidPosition(_ref4) {
37
+ var vm = _ref4.vm,
38
+ state = _ref4.state,
39
+ emit = _ref4.emit;
40
+ var currentLink = state.currentLink;
41
+ var activeEl = vm.$refs[currentLink];
42
+ var _vm$$refs = vm.$refs,
43
+ skidRef = _vm$$refs.skidRef,
44
+ maskRef = _vm$$refs.maskRef,
45
+ anchorRef = _vm$$refs.anchorRef;
46
+ if (!activeEl || !anchorRef) {
47
+ return;
48
+ }
49
+ emit('onChange', currentLink);
50
+ var offsetHeight = activeEl.offsetHeight,
51
+ offsetWidth = activeEl.offsetWidth;
52
+ var _activeEl$getBounding = activeEl.getBoundingClientRect(),
53
+ linkTitleClientTop = _activeEl$getBounding.top,
54
+ linkTitleClientLeft = _activeEl$getBounding.left;
55
+ var _anchorRef$getBoundin = anchorRef.getBoundingClientRect(),
56
+ anchorClientTop = _anchorRef$getBoundin.top,
57
+ anchorClientLeft = _anchorRef$getBoundin.left;
58
+ var offsetTop = linkTitleClientTop - anchorClientTop;
59
+ var offsetLeft = linkTitleClientLeft - anchorClientLeft;
60
+ addClass(skidRef, 'tiny-anchor-orbit-skid--active');
61
+ skidRef.style.top = "".concat(offsetTop, "px");
62
+ skidRef.style.height = "".concat(offsetHeight, "px");
63
+ if (maskRef) {
64
+ maskRef.style.top = "".concat(offsetTop, "px");
65
+ maskRef.style.height = "".concat(offsetHeight, "px");
66
+ maskRef.style.maxWidth = "".concat(offsetWidth + offsetLeft, "px");
67
+ }
68
+ };
69
+ var getCurrentAnchor = function getCurrentAnchor(_ref5) {
70
+ var vm = _ref5.vm,
71
+ state = _ref5.state,
72
+ link = _ref5.link,
73
+ emit = _ref5.emit;
74
+ if (state.currentLink === link) {
75
+ return;
76
+ }
77
+ state.currentLink = link;
78
+ updateSkidPosition({
79
+ vm: vm,
80
+ state: state,
81
+ emit: emit
82
+ });
83
+ };
84
+ var addObserver = function addObserver(_ref6) {
85
+ var props = _ref6.props,
86
+ state = _ref6.state;
87
+ var links = props.links;
88
+ var intersectionObserver = state.intersectionObserver;
89
+ var observer = function observer(list) {
90
+ list.forEach(function (item) {
91
+ var link = item.link;
92
+ if (item.children) {
93
+ observer(item.children);
94
+ } else {
95
+ var linkEl = document.querySelector(link);
96
+ linkEl && intersectionObserver.observe(linkEl);
97
+ }
98
+ });
99
+ };
100
+ observer(links);
101
+ };
102
+ var setCurrentHash = function setCurrentHash(state) {
103
+ if (state.currentHash !== location.hash) {
104
+ state.currentHash = location.hash;
105
+ return true;
106
+ }
107
+ return false;
108
+ };
109
+ export var getContainer = function getContainer(_ref7) {
110
+ var props = _ref7.props;
111
+ return function () {
112
+ return props.containerId ? document.querySelector(props.containerId) : document.body;
113
+ };
114
+ };
115
+ export var mounted = function mounted(_ref8) {
116
+ var vm = _ref8.vm,
117
+ state = _ref8.state,
118
+ api = _ref8.api;
119
+ return function () {
120
+ setScrollContainer({
121
+ state: state,
122
+ api: api
123
+ });
124
+ setFixAnchor({
125
+ vm: vm
126
+ });
127
+ api.onItersectionObserver();
128
+ setCurrentHash(state);
129
+ };
130
+ };
131
+ export var updated = function updated(_ref9) {
132
+ var state = _ref9.state,
133
+ api = _ref9.api;
134
+ return function () {
135
+ var cb = api.onItersectionObserver;
136
+ setScrollContainer({
137
+ state: state,
138
+ api: api,
139
+ cb: cb
140
+ });
141
+ };
142
+ };
143
+ export var unmounted = function unmounted(_ref10) {
144
+ var state = _ref10.state;
145
+ return function () {
146
+ var intersectionObserver = state.intersectionObserver;
147
+ intersectionObserver.disconnect();
148
+ };
149
+ };
150
+ export var onItersectionObserver = function onItersectionObserver(_ref11) {
151
+ var vm = _ref11.vm,
152
+ state = _ref11.state,
153
+ props = _ref11.props,
154
+ emit = _ref11.emit;
155
+ return function () {
156
+ state.intersectionObserver = new IntersectionObserver(function (entries) {
157
+ entries.forEach(function (item) {
158
+ var key = item.target.id;
159
+ state.observerLinks[key] = item;
160
+ });
161
+ for (var _i = 0, _Object$values = Object.values(state.observerLinks); _i < _Object$values.length; _i++) {
162
+ var item = _Object$values[_i];
163
+ if (item.isIntersecting && item.intersectionRatio > 0) {
164
+ var link = "#".concat(item.target.id);
165
+ getCurrentAnchor({
166
+ vm: vm,
167
+ state: state,
168
+ link: link,
169
+ emit: emit
170
+ });
171
+ break;
172
+ }
173
+ }
174
+ });
175
+ addObserver({
176
+ props: props,
177
+ state: state
178
+ });
179
+ };
180
+ };
181
+ export var linkClick = function linkClick(_ref12) {
182
+ var state = _ref12.state,
183
+ vm = _ref12.vm,
184
+ emit = _ref12.emit,
185
+ props = _ref12.props;
186
+ return function (e, item) {
187
+ var link = item.link,
188
+ title = item.title;
189
+ var emitLink = {
190
+ link: link,
191
+ title: title
192
+ };
193
+ emit('linkClick', e, emitLink);
194
+ var isChangeHash = setCurrentHash(state);
195
+ var scrollContainer = state.scrollContainer;
196
+ state.currentLink = link;
197
+ updateSkidPosition({
198
+ vm: vm,
199
+ state: state,
200
+ emit: emit
201
+ });
202
+ setMarkClass({
203
+ state: state,
204
+ props: props
205
+ });
206
+ if (scrollContainer !== document.body && !isChangeHash) {
207
+ var linkEl = scrollContainer.querySelector(item.link);
208
+ var top = linkEl.offsetTop;
209
+ var param = {
210
+ top: top,
211
+ left: 0,
212
+ behavior: 'smooth'
213
+ };
214
+ scrollContainer.scrollTo(param);
215
+ }
216
+ };
217
+ };
package/anchor/vue.js ADDED
@@ -0,0 +1,52 @@
1
+ import { mounted, updated, unmounted, getContainer, linkClick, onItersectionObserver } from './index';
2
+ export var api = ['state', 'getContainer', 'linkClick', 'onItersectionObserver'];
3
+ export var renderless = function renderless(props, _ref, _ref2) {
4
+ var onMounted = _ref.onMounted,
5
+ onUnmounted = _ref.onUnmounted,
6
+ onUpdated = _ref.onUpdated,
7
+ reactive = _ref.reactive;
8
+ var vm = _ref2.vm,
9
+ emit = _ref2.emit;
10
+ var api = {};
11
+ var state = reactive({
12
+ currentLink: '',
13
+ observerLinks: {},
14
+ intersectionObserver: null,
15
+ scrollContainer: null,
16
+ currentHash: ''
17
+ });
18
+ Object.assign(api, {
19
+ state: state,
20
+ mounted: mounted({
21
+ vm: vm,
22
+ state: state,
23
+ api: api
24
+ }),
25
+ updated: updated({
26
+ state: state,
27
+ api: api
28
+ }),
29
+ unmounted: unmounted({
30
+ state: state
31
+ }),
32
+ getContainer: getContainer({
33
+ props: props
34
+ }),
35
+ linkClick: linkClick({
36
+ state: state,
37
+ vm: vm,
38
+ emit: emit,
39
+ props: props
40
+ }),
41
+ onItersectionObserver: onItersectionObserver({
42
+ vm: vm,
43
+ state: state,
44
+ props: props,
45
+ emit: emit
46
+ })
47
+ });
48
+ onMounted(api.mounted);
49
+ onUpdated(api.updated);
50
+ onUnmounted(api.unmounted);
51
+ return api;
52
+ };
@@ -74,7 +74,9 @@ export var handleItemClick = function handleItemClick(parent) {
74
74
  return function () {
75
75
  var vnode = parent.$parent;
76
76
  if (vnode && vnode.type === parent.$constants.TYPE_CARD) {
77
- var index = vnode.state.items.indexOf(parent);
77
+ var index = vnode.state.items.findIndex(function (item) {
78
+ return item.$el === parent.$el;
79
+ });
78
80
  vnode.setActiveItem(index);
79
81
  }
80
82
  };
package/dropdown/index.js CHANGED
@@ -54,11 +54,13 @@ export var hide = function hide(_ref4) {
54
54
  export var handleClick = function handleClick(_ref5) {
55
55
  var api = _ref5.api,
56
56
  props = _ref5.props,
57
- state = _ref5.state;
57
+ state = _ref5.state,
58
+ emit = _ref5.emit;
58
59
  return function () {
59
60
  if (props.disabled) {
60
61
  return;
61
62
  }
63
+ emit('handle-click', state.visible);
62
64
  state.visible ? api.hide() : api.show();
63
65
  };
64
66
  };
package/dropdown/vue.js CHANGED
@@ -49,7 +49,8 @@ export var renderless = function renderless(props, _ref, _ref2) {
49
49
  handleClick: handleClick({
50
50
  api: api,
51
51
  props: props,
52
- state: state
52
+ state: state,
53
+ emit: emit
53
54
  }),
54
55
  handleTriggerKeyDown: handleTriggerKeyDown({
55
56
  api: api,
@@ -1,3 +1,4 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
1
2
  import { tagClick, confirm, clickOutside, getOptionStyle, reset, getTitle, bindScroll, toggle, onScroll, open, opened, close, closed, clickItem, clickWrapper, getItemStyle, handleClick } from './index';
2
3
  export var api = ['state', 'confirm', 'clickOutside', 'getOptionStyle', 'reset', 'tagClick', 'clickItem', 'clickWrapper', 'toggle', 'open', 'opened', 'close', 'closed', 'handleClick'];
3
4
  var initState = function initState(_ref) {
@@ -110,9 +111,13 @@ export var renderless = function renderless(props, _ref3, _ref4) {
110
111
  var parent = _ref4.parent,
111
112
  emit = _ref4.emit,
112
113
  vm = _ref4.vm,
113
- dispatch = _ref4.dispatch;
114
+ dispatch = _ref4.dispatch,
115
+ mode = _ref4.mode;
114
116
  var api = {};
115
117
  var dropdownMenu = inject('dropdownMenu', null);
118
+ if (mode === 'mobile') {
119
+ dropdownMenu.state.children = [].concat(_toConsumableArray(dropdownMenu.state.children), [vm]);
120
+ }
116
121
  parent = parent.$parent;
117
122
  var state = initState({
118
123
  reactive: reactive,
@@ -2,10 +2,12 @@ import { toggleItem, updateOffset, clickOutside, getScroller, useVuePopper } fro
2
2
  export var api = ['state', 'toggleItem', 'updateOffset', 'clickOutside', 'doDestroy'];
3
3
  export var renderless = function renderless(props, hooks, instance) {
4
4
  var api = {};
5
- var reactive = hooks.reactive;
5
+ var reactive = hooks.reactive,
6
+ provide = hooks.provide;
6
7
  var refs = instance.refs,
7
8
  nextTick = instance.nextTick,
8
- mode = instance.mode;
9
+ mode = instance.mode,
10
+ vm = instance.vm;
9
11
  var state = reactive({
10
12
  offset: 0,
11
13
  scroller: null,
@@ -14,6 +16,7 @@ export var renderless = function renderless(props, hooks, instance) {
14
16
  showPopper: false
15
17
  });
16
18
  if (mode === 'mobile') {
19
+ provide('dropdownMenu', vm);
17
20
  nextTick(function () {
18
21
  state.scroller = getScroller(refs.menu);
19
22
  });