@varlet/ui 1.20.0-alpha.0 → 1.20.1-alpha.10

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 CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.20.0](https://github.com/haoziqaq/varlet/compare/v1.19.0...v1.20.0) (2021-09-15)
7
+
8
+ **Note:** Version bump only for package @varlet/ui
9
+
10
+
11
+
12
+
13
+
6
14
  # [1.19.0](https://github.com/haoziqaq/varlet/compare/v1.18.1...v1.19.0) (2021-09-13)
7
15
 
8
16
 
@@ -10,6 +10,8 @@ export var render = /*#__PURE__*/_withId((_ctx, _cache) => {
10
10
  return _openBlock(), _createBlock(_resolveDynamicComponent(_ctx.sticky ? 'var-sticky' : _ctx.Transition), {
11
11
  "offset-top": _ctx.sticky ? _ctx.stickyOffsetTop : null,
12
12
  "z-index": _ctx.sticky ? _ctx.zIndex : null,
13
+ disabled: _ctx.disabled && !_ctx.cssMode,
14
+ "css-mode": _ctx.cssMode,
13
15
  ref: "anchorEl"
14
16
  }, {
15
17
  default: _withId(() => [_createVNode("div", _mergeProps({
@@ -24,7 +26,7 @@ export var render = /*#__PURE__*/_withId((_ctx, _cache) => {
24
26
 
25
27
  }, 8
26
28
  /* PROPS */
27
- , ["offset-top", "z-index"]);
29
+ , ["offset-top", "z-index", "disabled", "css-mode"]);
28
30
  });
29
31
  export default defineComponent({
30
32
  render,
@@ -42,6 +44,7 @@ export default defineComponent({
42
44
  bindIndexBar
43
45
  } = useIndexBar();
44
46
  var ownTop = ref(0);
47
+ var disabled = ref(false);
45
48
  var name = computed(() => props.index);
46
49
  var anchorEl = ref(null);
47
50
 
@@ -53,6 +56,7 @@ export default defineComponent({
53
56
  var {
54
57
  active,
55
58
  sticky,
59
+ cssMode,
56
60
  stickyOffsetTop,
57
61
  zIndex
58
62
  } = indexBar;
@@ -62,11 +66,16 @@ export default defineComponent({
62
66
  ownTop.value = anchorEl.value.$el ? anchorEl.value.$el.offsetTop : anchorEl.value.offsetTop;
63
67
  };
64
68
 
69
+ var setDisabled = value => {
70
+ disabled.value = value;
71
+ };
72
+
65
73
  var indexAnchorProvider = {
66
74
  index,
67
75
  name,
68
76
  ownTop,
69
- setOwnTop
77
+ setOwnTop,
78
+ setDisabled
70
79
  };
71
80
  bindIndexBar(indexAnchorProvider);
72
81
  return {
@@ -75,6 +84,8 @@ export default defineComponent({
75
84
  active,
76
85
  sticky,
77
86
  zIndex,
87
+ disabled,
88
+ cssMode,
78
89
  stickyOffsetTop,
79
90
  Transition
80
91
  };
@@ -66,11 +66,13 @@ export default defineComponent({
66
66
  var anchorNameList = ref([]);
67
67
  var active = ref();
68
68
  var sticky = computed(() => props.sticky);
69
+ var cssMode = computed(() => props.cssMode);
69
70
  var stickyOffsetTop = computed(() => props.stickyOffsetTop);
70
71
  var zIndex = computed(() => props.zIndex);
71
72
  var indexBarProvider = {
72
73
  active,
73
74
  sticky,
75
+ cssMode,
74
76
  stickyOffsetTop,
75
77
  zIndex
76
78
  };
@@ -88,12 +90,20 @@ export default defineComponent({
88
90
  scrollTop,
89
91
  scrollHeight
90
92
  } = scrollEl.value;
93
+ var {
94
+ offsetTop
95
+ } = barEl.value;
91
96
  indexAnchors.forEach((anchor, index) => {
92
97
  var anchorTop = anchor.ownTop.value;
93
- var top = scrollTop - anchorTop + stickyOffsetTop.value;
98
+ var top = scrollTop - anchorTop + stickyOffsetTop.value - offsetTop;
94
99
  var distance = index === indexAnchors.length - 1 ? scrollHeight : indexAnchors[index + 1].ownTop.value - anchor.ownTop.value;
95
100
 
96
101
  if (top >= 0 && top < distance && !clickedName.value) {
102
+ if (index && !props.cssMode) {
103
+ indexAnchors[index - 1].setDisabled(true);
104
+ }
105
+
106
+ anchor.setDisabled(false);
97
107
  emitEvent(anchor);
98
108
  }
99
109
  });
@@ -7,6 +7,10 @@ export var props = {
7
7
  type: Number,
8
8
  default: 0
9
9
  },
10
+ cssMode: {
11
+ type: Boolean,
12
+ default: false
13
+ },
10
14
  hideList: {
11
15
  type: Boolean,
12
16
  default: false
@@ -1,8 +1,8 @@
1
1
  import '../../styles/common.css'
2
+ import '../SnackbarSfc.css'
2
3
  import '../../styles/elevation.css'
3
4
  import '../../loading/loading.css'
4
5
  import '../../button/button.css'
5
6
  import '../../icon/icon.css'
6
7
  import '../snackbar.css'
7
8
  import '../coreSfc.css'
8
- import '../SnackbarSfc.css'
@@ -1,8 +1,8 @@
1
1
  import '../../styles/common.less'
2
+ import '../SnackbarSfc.less'
2
3
  import '../../styles/elevation.less'
3
4
  import '../../loading/loading.less'
4
5
  import '../../button/button.less'
5
6
  import '../../icon/icon.less'
6
7
  import '../snackbar.less'
7
8
  import '../coreSfc.less'
8
- import '../SnackbarSfc.less'
package/es/step/Step.js CHANGED
@@ -12,24 +12,6 @@ var _hoisted_1 = {
12
12
  class: "var-step"
13
13
  };
14
14
  var _hoisted_2 = {
15
- key: 0,
16
- class: "var-step-horizontal"
17
- };
18
- var _hoisted_3 = {
19
- class: "var-step-horizontal__main",
20
- ref: "main"
21
- };
22
- var _hoisted_4 = {
23
- key: 3
24
- };
25
- var _hoisted_5 = {
26
- key: 1,
27
- class: "var-step-vertical"
28
- };
29
- var _hoisted_6 = {
30
- class: "var-step-vertical__main"
31
- };
32
- var _hoisted_7 = {
33
15
  key: 3
34
16
  };
35
17
 
@@ -38,10 +20,16 @@ _popScopeId();
38
20
  export var render = /*#__PURE__*/_withId((_ctx, _cache) => {
39
21
  var _component_var_icon = _resolveComponent("var-icon");
40
22
 
41
- return _openBlock(), _createBlock("div", _hoisted_1, [_ctx.direction === 'horizontal' ? (_openBlock(), _createBlock("div", _hoisted_2, [_createVNode("div", _hoisted_3, [_createVNode("div", {
42
- class: ["var-step-horizontal__tag", {
43
- 'var-step-horizontal__tag--active': _ctx.isActive || _ctx.isCurrent
44
- }],
23
+ return _openBlock(), _createBlock("div", _hoisted_1, [_createVNode("div", {
24
+ class: "var-step-" + _ctx.direction
25
+ }, [_createVNode("div", {
26
+ class: "var-step-" + _ctx.direction + "__main",
27
+ ref: _ctx.getRef
28
+ }, [_createVNode("div", {
29
+ class: {
30
+ ["var-step-" + _ctx.direction + "__tag"]: true,
31
+ ["var-step-" + _ctx.direction + "__tag--active"]: _ctx.isActive || _ctx.isCurrent
32
+ },
45
33
  style: {
46
34
  backgroundColor: _ctx.isActive || _ctx.isCurrent ? _ctx.activeColor : _ctx.inactiveColor
47
35
  },
@@ -50,7 +38,7 @@ export var render = /*#__PURE__*/_withId((_ctx, _cache) => {
50
38
  key: 0,
51
39
  class: "var-step__icon",
52
40
  "var-step-cover": "",
53
- name: _ctx.activeIcon || 'check'
41
+ name: _ctx.activeIcon
54
42
  }, null, 8
55
43
  /* PROPS */
56
44
  , ["name"])) : _ctx.isCurrent && _ctx.currentIcon ? (_openBlock(), _createBlock(_component_var_icon, {
@@ -67,76 +55,31 @@ export var render = /*#__PURE__*/_withId((_ctx, _cache) => {
67
55
  name: _ctx.inactiveIcon
68
56
  }, null, 8
69
57
  /* PROPS */
70
- , ["name"])) : (_openBlock(), _createBlock("span", _hoisted_4, _toDisplayString(_ctx.index + 1), 1
58
+ , ["name"])) : (_openBlock(), _createBlock("span", _hoisted_2, _toDisplayString(_ctx.index + 1), 1
71
59
  /* TEXT */
72
60
  ))], 6
73
61
  /* CLASS, STYLE */
74
62
  ), _createVNode("div", {
75
- class: ["var-step-horizontal__content", {
76
- 'var-step-horizontal__content--active': _ctx.isActive || _ctx.isCurrent
77
- }],
63
+ class: {
64
+ ["var-step-" + _ctx.direction + "__content"]: true,
65
+ ["var-step-" + _ctx.direction + "__content--active"]: _ctx.isActive || _ctx.isCurrent
66
+ },
78
67
  onClick: _cache[2] || (_cache[2] = (...args) => _ctx.click && _ctx.click(...args))
79
68
  }, [_renderSlot(_ctx.$slots, "default")], 2
80
69
  /* CLASS */
81
- )], 512
82
- /* NEED_PATCH */
70
+ )], 2
71
+ /* CLASS */
83
72
  ), !_ctx.isLastChild ? (_openBlock(), _createBlock("div", {
84
73
  key: 0,
85
- class: "var-step-horizontal__line",
74
+ class: "var-step-" + _ctx.direction + "__line",
86
75
  style: {
87
76
  margin: _ctx.lineMargin
88
77
  }
89
- }, null, 4
90
- /* STYLE */
91
- )) : _createCommentVNode("v-if", true)])) : (_openBlock(), _createBlock("div", _hoisted_5, [_createVNode("div", _hoisted_6, [_createVNode("div", {
92
- class: ["var-step-vertical__tag", {
93
- 'var-step-vertical__tag--active': _ctx.isActive || _ctx.isCurrent
94
- }],
95
- style: {
96
- backgroundColor: _ctx.isActive || _ctx.isCurrent ? _ctx.activeColor : _ctx.inactiveColor
97
- },
98
- onClick: _cache[3] || (_cache[3] = (...args) => _ctx.click && _ctx.click(...args))
99
- }, [_ctx.isActive ? (_openBlock(), _createBlock(_component_var_icon, {
100
- key: 0,
101
- class: "var-step__icon",
102
- "var-step-cover": "",
103
- name: _ctx.activeIcon
104
- }, null, 8
105
- /* PROPS */
106
- , ["name"])) : _ctx.isCurrent && _ctx.currentIcon ? (_openBlock(), _createBlock(_component_var_icon, {
107
- key: 1,
108
- class: "var-step__icon",
109
- "var-step-cover": "",
110
- name: _ctx.currentIcon
111
- }, null, 8
112
- /* PROPS */
113
- , ["name"])) : _ctx.inactiveIcon ? (_openBlock(), _createBlock(_component_var_icon, {
114
- key: 2,
115
- class: "var-step__icon",
116
- "var-step-cover": "",
117
- name: _ctx.inactiveIcon
118
- }, null, 8
119
- /* PROPS */
120
- , ["name"])) : (_openBlock(), _createBlock("span", _hoisted_7, _toDisplayString(_ctx.index + 1), 1
121
- /* TEXT */
122
- ))], 6
78
+ }, null, 6
123
79
  /* CLASS, STYLE */
124
- ), _createVNode("div", {
125
- class: ["var-step-vertical__content", {
126
- 'var-step-vertical__content--active': _ctx.isActive || _ctx.isCurrent
127
- }],
128
- onClick: _cache[4] || (_cache[4] = (...args) => _ctx.click && _ctx.click(...args))
129
- }, [_renderSlot(_ctx.$slots, "default")], 2
80
+ )) : _createCommentVNode("v-if", true)], 2
130
81
  /* CLASS */
131
- )]), !_ctx.isLastChild ? (_openBlock(), _createBlock("div", {
132
- key: 0,
133
- class: "var-step-vertical__line",
134
- style: {
135
- margin: _ctx.lineMargin
136
- }
137
- }, null, 4
138
- /* STYLE */
139
- )) : _createCommentVNode("v-if", true)]))]);
82
+ )]);
140
83
  });
141
84
  export default defineComponent({
142
85
  render,
@@ -177,6 +120,12 @@ export default defineComponent({
177
120
 
178
121
  var click = () => clickStep(index.value);
179
122
 
123
+ var getRef = el => {
124
+ if (direction.value === 'horizontal') {
125
+ main.value = el;
126
+ }
127
+ };
128
+
180
129
  bindSteps(stepProvider);
181
130
  watch(length, newLength => {
182
131
  isLastChild.value = newLength - 1 === index.value;
@@ -196,7 +145,8 @@ export default defineComponent({
196
145
  activeColor,
197
146
  inactiveColor,
198
147
  isLastChild,
199
- click
148
+ click,
149
+ getRef
200
150
  };
201
151
  }
202
152
 
@@ -1,4 +1,4 @@
1
- import { defineComponent, ref, onMounted, onUnmounted, onActivated, onDeactivated, computed } from 'vue';
1
+ import { defineComponent, ref, onMounted, onUnmounted, onActivated, onDeactivated, computed, watch } from 'vue';
2
2
  import { props } from './props';
3
3
  import { getParentScroller, toPxNum } from '../utils/elements';
4
4
  import { toNumber } from '../utils/shared';
@@ -8,29 +8,29 @@ var _withId = /*#__PURE__*/_withScopeId("");
8
8
 
9
9
  export var render = /*#__PURE__*/_withId((_ctx, _cache) => {
10
10
  return _openBlock(), _createBlock("div", {
11
- class: "var-sticky",
11
+ class: ["var-sticky", [_ctx.enableCSSMode ? 'var-sticky--css-mode' : null]],
12
12
  ref: "stickyEl",
13
13
  style: {
14
14
  zIndex: _ctx.toNumber(_ctx.zIndex),
15
- top: !_ctx.isFixed ? _ctx.offsetTop + "px" : null,
16
- width: _ctx.isFixed ? _ctx.fixedWidth : null,
17
- height: _ctx.isFixed ? _ctx.fixedHeight : null
15
+ top: _ctx.enableCSSMode ? _ctx.offsetTop + "px" : null,
16
+ width: _ctx.enableFixedMode ? _ctx.fixedWidth : null,
17
+ height: _ctx.enableFixedMode ? _ctx.fixedHeight : null
18
18
  }
19
19
  }, [_createVNode("div", {
20
20
  class: "var-sticky__wrapper",
21
21
  ref: "wrapperEl",
22
22
  style: {
23
23
  zIndex: _ctx.toNumber(_ctx.zIndex),
24
- position: _ctx.isFixed ? 'fixed' : null,
25
- width: _ctx.isFixed ? _ctx.fixedWrapperWidth : null,
26
- height: _ctx.isFixed ? _ctx.fixedWrapperHeight : null,
27
- left: _ctx.isFixed ? _ctx.fixedLeft : null,
28
- top: _ctx.isFixed ? _ctx.fixedTop : null
24
+ position: _ctx.enableFixedMode ? 'fixed' : null,
25
+ width: _ctx.enableFixedMode ? _ctx.fixedWrapperWidth : null,
26
+ height: _ctx.enableFixedMode ? _ctx.fixedWrapperHeight : null,
27
+ left: _ctx.enableFixedMode ? _ctx.fixedLeft : null,
28
+ top: _ctx.enableFixedMode ? _ctx.fixedTop : null
29
29
  }
30
30
  }, [_renderSlot(_ctx.$slots, "default")], 4
31
31
  /* STYLE */
32
- )], 4
33
- /* STYLE */
32
+ )], 6
33
+ /* CLASS, STYLE */
34
34
  );
35
35
  });
36
36
  export default defineComponent({
@@ -41,7 +41,6 @@ export default defineComponent({
41
41
  setup(props) {
42
42
  var stickyEl = ref(null);
43
43
  var wrapperEl = ref(null);
44
- var isSupportCSSSticky;
45
44
  var isFixed = ref(false);
46
45
  var fixedTop = ref('0px');
47
46
  var fixedLeft = ref('0px');
@@ -49,10 +48,22 @@ export default defineComponent({
49
48
  var fixedHeight = ref('auto');
50
49
  var fixedWrapperWidth = ref('auto');
51
50
  var fixedWrapperHeight = ref('auto');
51
+ var enableCSSMode = computed(() => !props.disabled && props.cssMode);
52
+ var enableFixedMode = computed(() => !props.disabled && isFixed.value);
52
53
  var offsetTop = computed(() => toPxNum(props.offsetTop));
53
54
  var scroller = window;
54
55
 
55
56
  var handleScroll = () => {
57
+ var {
58
+ onScroll,
59
+ cssMode,
60
+ disabled
61
+ } = props;
62
+
63
+ if (disabled) {
64
+ return;
65
+ }
66
+
56
67
  var scrollerTop = 0;
57
68
 
58
69
  if (scroller !== window) {
@@ -69,12 +80,9 @@ export default defineComponent({
69
80
  left: stickyLeft
70
81
  } = sticky.getBoundingClientRect();
71
82
  var currentOffsetTop = stickyTop - scrollerTop;
72
- var {
73
- onScroll
74
- } = props;
75
83
 
76
84
  if (currentOffsetTop <= offsetTop.value) {
77
- if (!isSupportCSSSticky) {
85
+ if (!cssMode) {
78
86
  fixedWidth.value = sticky.offsetWidth + "px";
79
87
  fixedHeight.value = sticky.offsetHeight + "px";
80
88
  fixedTop.value = scrollerTop + offsetTop.value + "px";
@@ -103,12 +111,10 @@ export default defineComponent({
103
111
  window.removeEventListener('scroll', handleScroll);
104
112
  };
105
113
 
114
+ watch(() => props.disabled, handleScroll);
106
115
  onActivated(addScrollListener);
107
116
  onDeactivated(removeScrollListener);
108
- onMounted(() => {
109
- isSupportCSSSticky = ['sticky', '-webkit-sticky'].includes(window.getComputedStyle(stickyEl.value).position);
110
- addScrollListener();
111
- });
117
+ onMounted(addScrollListener);
112
118
  onUnmounted(removeScrollListener);
113
119
  return {
114
120
  stickyEl,
@@ -121,6 +127,8 @@ export default defineComponent({
121
127
  fixedHeight,
122
128
  fixedWrapperWidth,
123
129
  fixedWrapperHeight,
130
+ enableCSSMode,
131
+ enableFixedMode,
124
132
  toNumber
125
133
  };
126
134
  }
@@ -7,6 +7,14 @@ export var props = {
7
7
  type: [String, Number],
8
8
  default: 10
9
9
  },
10
+ cssMode: {
11
+ type: Boolean,
12
+ default: false
13
+ },
14
+ disabled: {
15
+ type: Boolean,
16
+ default: false
17
+ },
10
18
  onScroll: {
11
19
  type: Function
12
20
  }
@@ -1 +1 @@
1
- .var-sticky { position: sticky; position: -webkit-sticky;}
1
+ .var-sticky { position: relative;}.var-sticky--css-mode { position: sticky; position: -webkit-sticky;}
@@ -1,4 +1,8 @@
1
1
  .var-sticky {
2
- position: sticky;
3
- position: -webkit-sticky;
2
+ position: relative;
3
+
4
+ &--css-mode {
5
+ position: sticky;
6
+ position: -webkit-sticky;
7
+ }
4
8
  }
@@ -711,6 +711,10 @@
711
711
  "type": "boolean",
712
712
  "description": "是否隐藏锚点列表 默认值:false"
713
713
  },
714
+ "var-index-bar/css-mode": {
715
+ "type": "boolean",
716
+ "description": "开启原生`css sticky`模式 默认值:false"
717
+ },
714
718
  "var-index-bar/z-index": {
715
719
  "type": "number | string",
716
720
  "description": "z-index 层级 默认值:1"
@@ -1359,6 +1363,14 @@
1359
1363
  "type": "string | number",
1360
1364
  "description": "吸顶时的层级 默认值:0"
1361
1365
  },
1366
+ "var-sticky/css-mode": {
1367
+ "type": "boolean",
1368
+ "description": "开启原生`css sticky`模式 默认值:false"
1369
+ },
1370
+ "var-sticky/disabled": {
1371
+ "type": "boolean",
1372
+ "description": "禁用吸顶, 设置为`true`时, 元素会回到文档流中 默认值:false"
1373
+ },
1362
1374
  "var-style-provider/style-vars": {
1363
1375
  "type": "Record<string, string>",
1364
1376
  "description": "css变量 默认值:{}"
@@ -274,6 +274,7 @@
274
274
  "sticky",
275
275
  "sticky-offset-top",
276
276
  "hide-list",
277
+ "css-mode",
277
278
  "z-index",
278
279
  "highlight-color",
279
280
  "duration"
@@ -524,7 +525,9 @@
524
525
  "var-sticky": {
525
526
  "attributes": [
526
527
  "offset-top",
527
- "z-index"
528
+ "z-index",
529
+ "css-mode",
530
+ "disabled"
528
531
  ]
529
532
  },
530
533
  "var-style-provider": {
@@ -2150,6 +2150,15 @@
2150
2150
  "kind": "expression"
2151
2151
  }
2152
2152
  },
2153
+ {
2154
+ "name": "css-mode",
2155
+ "description": "开启原生`css sticky`模式",
2156
+ "default": "false",
2157
+ "value": {
2158
+ "type": "boolean",
2159
+ "kind": "expression"
2160
+ }
2161
+ },
2153
2162
  {
2154
2163
  "name": "z-index",
2155
2164
  "description": "z-index 层级",
@@ -4078,6 +4087,24 @@
4078
4087
  "type": "string | number",
4079
4088
  "kind": "expression"
4080
4089
  }
4090
+ },
4091
+ {
4092
+ "name": "css-mode",
4093
+ "description": "开启原生`css sticky`模式",
4094
+ "default": "false",
4095
+ "value": {
4096
+ "type": "boolean",
4097
+ "kind": "expression"
4098
+ }
4099
+ },
4100
+ {
4101
+ "name": "disabled",
4102
+ "description": "禁用吸顶, 设置为`true`时, 元素会回到文档流中",
4103
+ "default": "false",
4104
+ "value": {
4105
+ "type": "boolean",
4106
+ "kind": "expression"
4107
+ }
4081
4108
  }
4082
4109
  ],
4083
4110
  "events": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@varlet/ui",
3
- "version": "1.20.0-alpha.0+be463adf",
3
+ "version": "1.20.1-alpha.10+89c77d4c",
4
4
  "description": "A material like components library",
5
5
  "module": "es/index.js",
6
6
  "typings": "types/index.d.ts",
@@ -45,9 +45,9 @@
45
45
  "peerDependencies": {
46
46
  "vue": "^3.0.0"
47
47
  },
48
- "gitHead": "be463adf62cb7cb196e555a42c37a7d2b10cac77",
48
+ "gitHead": "89c77d4cb34cca2a4734796192dbd8403cca288d",
49
49
  "devDependencies": {
50
- "@varlet/cli": "^1.20.0-alpha.0+be463adf"
50
+ "@varlet/cli": "^1.20.1-alpha.10+89c77d4c"
51
51
  },
52
52
  "dependencies": {
53
53
  "dayjs": "^1.10.4",
@@ -4,6 +4,7 @@ export interface IndexBarProps {
4
4
  sticky?: boolean
5
5
  stickyOffsetTop?: number
6
6
  hideList?: boolean
7
+ cssMode?: boolean
7
8
  zIndex?: number | string
8
9
  highlightColor?: string
9
10
  duration?: number | string
package/types/sticky.d.ts CHANGED
@@ -3,6 +3,8 @@ import { VarComponent } from './varComponent'
3
3
  export interface StickyProps {
4
4
  offsetTop?: string | number
5
5
  zIndex?: string | number
6
+ cssMode?: boolean
7
+ disabled?: boolean
6
8
  onScroll?: (offsetTop: number, isFixed: boolean) => void
7
9
  }
8
10