neo.mjs 6.17.2 → 6.18.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/apps/ServiceWorker.mjs +3 -5
- package/apps/colors/README.md +8 -0
- package/apps/colors/app.mjs +6 -0
- package/apps/colors/childapps/widget/app.mjs +7 -0
- package/apps/colors/childapps/widget/index.html +11 -0
- package/apps/colors/childapps/widget/neo-config.json +10 -0
- package/apps/colors/childapps/widget/view/Viewport.mjs +19 -0
- package/apps/colors/index.html +11 -0
- package/apps/colors/model/Color.mjs +43 -0
- package/apps/colors/neo-config.json +10 -0
- package/apps/colors/remotes-api.json +13 -0
- package/apps/colors/store/Colors.mjs +24 -0
- package/apps/colors/view/BarChartComponent.mjs +64 -0
- package/apps/colors/view/HeaderToolbar.mjs +95 -0
- package/apps/colors/view/PieChartComponent.mjs +58 -0
- package/apps/colors/view/TableContainer.mjs +91 -0
- package/apps/colors/view/Viewport.mjs +57 -0
- package/apps/colors/view/ViewportController.mjs +277 -0
- package/apps/colors/view/ViewportModel.mjs +53 -0
- package/apps/portal/Util.mjs +11 -0
- package/apps/portal/childapps/preview/neo-config.json +2 -2
- package/apps/portal/neo-config.json +2 -1
- package/apps/portal/remotes-api.json +13 -0
- package/apps/portal/view/HeaderToolbar.mjs +1 -1
- package/apps/portal/view/ViewportController.mjs +89 -1
- package/apps/portal/view/home/MainContainer.mjs +5 -6
- package/apps/portal/view/home/parts/AfterMath.mjs +1 -1
- package/apps/portal/view/home/parts/{CoolStuff.mjs → Colors.mjs} +20 -28
- package/apps/portal/view/home/parts/Helix.mjs +75 -0
- package/apps/portal/view/learn/LivePreview.mjs +56 -15
- package/apps/portal/view/learn/MainContainerController.mjs +10 -90
- package/apps/realworld/api/Article.mjs +1 -3
- package/apps/realworld/api/Favorite.mjs +1 -3
- package/apps/realworld/api/Profile.mjs +1 -3
- package/apps/realworld/api/Tag.mjs +1 -3
- package/apps/realworld/api/User.mjs +1 -3
- package/apps/realworld2/api/Article.mjs +1 -3
- package/apps/realworld2/api/Favorite.mjs +1 -3
- package/apps/realworld2/api/Profile.mjs +1 -3
- package/apps/realworld2/api/Tag.mjs +1 -3
- package/apps/realworld2/api/User.mjs +1 -3
- package/apps/realworld2/view/article/HelixContainer.mjs +5 -5
- package/buildScripts/webpack/json/myApps.template.json +1 -0
- package/docs/app/view/MainContainer.mjs +5 -0
- package/docs/app/view/classdetails/MembersList.mjs +1 -1
- package/examples/ServiceWorker.mjs +3 -5
- package/examples/component/helix/Viewport.mjs +309 -0
- package/examples/component/helix/ViewportController.mjs +122 -0
- package/examples/component/helix/app.mjs +2 -2
- package/examples/component/helix/neo-config.json +0 -1
- package/examples/component/multiWindowHelix/Viewport.mjs +11 -3
- package/examples/component/multiWindowHelix/ViewportController.mjs +21 -9
- package/examples/component/multiWindowHelix/neo-config.json +0 -1
- package/examples/fieldWithPrefix/MainContainer.mjs +1 -6
- package/examples/list/animate/MainContainerController.mjs +1 -1
- package/examples/worker/task/MyTasks.mjs +1 -3
- package/package.json +2 -2
- package/resources/data/deck/learnneo/pages/GuideEvents.md +131 -0
- package/resources/data/deck/learnneo/pages/WhyNeo-Speed.md +1 -1
- package/resources/images/logo/neo_logo_primary.svg +6 -0
- package/resources/images/logo/neo_logo_text_primary.svg +5 -0
- package/resources/scss/src/apps/colors/BarChartComponent.scss +3 -0
- package/resources/scss/src/apps/colors/HeaderToolbar.scss +11 -0
- package/resources/scss/src/apps/colors/PieChartComponent.scss +3 -0
- package/resources/scss/src/apps/colors/TableContainer.scss +64 -0
- package/resources/scss/src/apps/colors/Viewport.scss +9 -0
- package/resources/scss/src/apps/portal/HeaderToolbar.scss +1 -1
- package/resources/scss/src/apps/portal/home/MainContainer.scss +1 -1
- package/resources/scss/src/apps/portal/home/preview/PageCodeContainer.scss +1 -1
- package/resources/scss/src/examples/component/multiWindowHelix/Viewport.scss +3 -0
- package/resources/scss/src/form/field/CheckBox.scss +1 -0
- package/resources/scss/src/tab/header/Button.scss +2 -1
- package/resources/scss/theme-dark/Global.scss +8 -0
- package/resources/scss/theme-dark/button/Base.scss +1 -1
- package/resources/scss/theme-dark/tab/header/Button.scss +1 -0
- package/resources/scss/theme-light/Global.scss +8 -0
- package/resources/scss/theme-light/button/Base.scss +1 -1
- package/resources/scss/theme-light/tab/header/Button.scss +1 -0
- package/resources/scss/theme-neo-light/Global.scss +53 -53
- package/resources/scss/theme-neo-light/button/Base.scss +3 -4
- package/resources/scss/theme-neo-light/tab/header/Button.scss +6 -8
- package/src/DefaultConfig.mjs +2 -2
- package/src/Fetch.mjs +1 -3
- package/src/Main.mjs +13 -11
- package/src/MicroLoader.mjs +2 -2
- package/src/Neo.mjs +27 -26
- package/src/Xhr.mjs +1 -3
- package/src/button/Base.mjs +6 -4
- package/src/button/Split.mjs +10 -9
- package/src/calendar/view/EditEventContainer.mjs +13 -12
- package/src/calendar/view/MainContainer.mjs +40 -40
- package/src/calendar/view/MainContainerModel.mjs +5 -5
- package/src/calendar/view/SettingsContainer.mjs +11 -11
- package/src/calendar/view/YearComponent.mjs +73 -75
- package/src/calendar/view/calendars/ColorsList.mjs +2 -2
- package/src/calendar/view/calendars/EditContainer.mjs +2 -2
- package/src/calendar/view/calendars/List.mjs +12 -13
- package/src/calendar/view/month/Component.mjs +72 -73
- package/src/calendar/view/settings/GeneralContainer.mjs +5 -5
- package/src/calendar/view/settings/MonthContainer.mjs +5 -5
- package/src/calendar/view/settings/WeekContainer.mjs +6 -6
- package/src/calendar/view/settings/YearContainer.mjs +4 -4
- package/src/calendar/view/week/Component.mjs +47 -57
- package/src/calendar/view/week/EventDragZone.mjs +43 -50
- package/src/calendar/view/week/TimeAxisComponent.mjs +21 -21
- package/src/calendar/view/week/plugin/DragDrop.mjs +53 -45
- package/src/calendar/view/week/plugin/EventResizable.mjs +8 -3
- package/src/collection/Base.mjs +15 -22
- package/src/collection/Filter.mjs +4 -9
- package/src/collection/Sorter.mjs +6 -7
- package/src/component/Base.mjs +25 -31
- package/src/component/Canvas.mjs +9 -9
- package/src/component/Carousel.mjs +31 -33
- package/src/component/Chip.mjs +9 -9
- package/src/component/Circle.mjs +84 -91
- package/src/component/Clock.mjs +8 -8
- package/src/component/DateSelector.mjs +14 -15
- package/src/component/Gallery.mjs +82 -80
- package/src/component/Helix.mjs +131 -126
- package/src/component/Iframe.mjs +1 -1
- package/src/component/Label.mjs +1 -1
- package/src/component/Legend.mjs +3 -3
- package/src/component/Process.mjs +39 -37
- package/src/component/Splitter.mjs +9 -11
- package/src/component/StatusBadge.mjs +2 -3
- package/src/component/Timer.mjs +62 -68
- package/src/component/Toast.mjs +11 -11
- package/src/component/Video.mjs +7 -8
- package/src/component/mwc/Button.mjs +10 -10
- package/src/component/mwc/TextField.mjs +17 -17
- package/src/component/wrapper/AmChart.mjs +5 -5
- package/src/component/wrapper/CesiumJS.mjs +11 -17
- package/src/component/wrapper/GoogleMaps.mjs +58 -35
- package/src/component/wrapper/MapboxGL.mjs +112 -79
- package/src/container/Accordion.mjs +18 -20
- package/src/container/AccordionItem.mjs +12 -11
- package/src/container/Base.mjs +24 -23
- package/src/container/Panel.mjs +9 -9
- package/src/controller/Base.mjs +12 -14
- package/src/controller/Component.mjs +60 -66
- package/src/core/Base.mjs +5 -8
- package/src/core/IdGenerator.mjs +1 -3
- package/src/core/Observable.mjs +17 -17
- package/src/core/Util.mjs +5 -5
- package/src/data/Model.mjs +3 -3
- package/src/data/RecordFactory.mjs +3 -6
- package/src/data/Store.mjs +34 -34
- package/src/data/connection/Fetch.mjs +3 -3
- package/src/data/connection/WebSocket.mjs +21 -25
- package/src/data/connection/Xhr.mjs +31 -28
- package/src/date/DayViewComponent.mjs +1 -1
- package/src/date/SelectorContainer.mjs +2 -2
- package/src/dialog/Base.mjs +27 -25
- package/src/dialog/header/Toolbar.mjs +5 -4
- package/src/draggable/DragProxyComponent.mjs +7 -4
- package/src/draggable/DragZone.mjs +30 -30
- package/src/draggable/DropZone.mjs +7 -7
- package/src/draggable/list/DragZone.mjs +18 -18
- package/src/draggable/tab/header/toolbar/SortZone.mjs +7 -7
- package/src/draggable/toolbar/DragZone.mjs +15 -15
- package/src/draggable/toolbar/SortZone.mjs +30 -31
- package/src/draggable/tree/DragZone.mjs +9 -9
- package/src/filter/BooleanContainer.mjs +3 -3
- package/src/filter/NumberContainer.mjs +5 -5
- package/src/filter/ToggleOperatorsButton.mjs +5 -5
- package/src/form/Fieldset.mjs +26 -26
- package/src/form/field/Base.mjs +1 -1
- package/src/form/field/CheckBox.mjs +15 -16
- package/src/form/field/Color.mjs +13 -15
- package/src/form/field/ComboBox.mjs +16 -24
- package/src/form/field/Country.mjs +1 -1
- package/src/form/field/Date.mjs +3 -4
- package/src/form/field/Display.mjs +1 -1
- package/src/form/field/Email.mjs +2 -2
- package/src/form/field/Number.mjs +51 -56
- package/src/form/field/Picker.mjs +2 -2
- package/src/form/field/Radio.mjs +1 -1
- package/src/form/field/Range.mjs +7 -6
- package/src/form/field/Text.mjs +29 -36
- package/src/form/field/TextArea.mjs +9 -9
- package/src/form/field/Time.mjs +30 -30
- package/src/form/field/trigger/Base.mjs +19 -13
- package/src/form/field/trigger/Clear.mjs +13 -13
- package/src/form/field/trigger/CopyToClipboard.mjs +7 -7
- package/src/form/field/trigger/Picker.mjs +2 -2
- package/src/form/field/trigger/SpinDown.mjs +1 -1
- package/src/form/field/trigger/SpinUp.mjs +1 -1
- package/src/form/field/trigger/SpinUpDown.mjs +3 -3
- package/src/form/field/trigger/Time.mjs +3 -3
- package/src/grid/Container.mjs +33 -33
- package/src/grid/View.mjs +20 -22
- package/src/grid/header/Button.mjs +12 -12
- package/src/grid/header/Toolbar.mjs +4 -4
- package/src/layout/Base.mjs +5 -4
- package/src/layout/Card.mjs +15 -16
- package/src/layout/Fit.mjs +22 -8
- package/src/layout/Flexbox.mjs +30 -29
- package/src/layout/Form.mjs +15 -15
- package/src/layout/Grid.mjs +2 -2
- package/src/layout/HBox.mjs +3 -2
- package/src/layout/VBox.mjs +3 -2
- package/src/list/Base.mjs +45 -47
- package/src/list/Chip.mjs +4 -4
- package/src/list/Circle.mjs +3 -3
- package/src/list/Color.mjs +4 -4
- package/src/list/Component.mjs +10 -10
- package/src/list/plugin/Animate.mjs +18 -13
- package/src/main/DomAccess.mjs +92 -56
- package/src/main/DomEvents.mjs +38 -39
- package/src/main/addon/AmCharts.mjs +37 -37
- package/src/main/addon/AnalyticsByGoogle.mjs +4 -4
- package/src/main/addon/CesiumJS.mjs +8 -8
- package/src/main/addon/CloneNode.mjs +5 -5
- package/src/main/addon/Cookie.mjs +4 -4
- package/src/main/addon/DragDrop.mjs +35 -34
- package/src/main/addon/GoogleMaps.mjs +19 -19
- package/src/main/addon/LocalStorage.mjs +3 -3
- package/src/main/addon/MapboxGL.mjs +40 -41
- package/src/main/addon/MonacoEditor.mjs +5 -5
- package/src/main/addon/Mwc.mjs +6 -6
- package/src/main/addon/Navigator.mjs +35 -39
- package/src/main/addon/Popover.mjs +5 -6
- package/src/main/addon/PrefixField.mjs +1 -2
- package/src/main/addon/ServiceWorker.mjs +9 -9
- package/src/main/addon/Siesta.mjs +3 -2
- package/src/main/addon/Stylesheet.mjs +37 -37
- package/src/main/addon/WebComponent.mjs +2 -3
- package/src/main/addon/WindowPosition.mjs +18 -18
- package/src/main/draggable/sensor/Base.mjs +2 -2
- package/src/main/draggable/sensor/Mouse.mjs +15 -15
- package/src/main/draggable/sensor/Touch.mjs +24 -23
- package/src/main/mixin/DeltaUpdates.mjs +10 -12
- package/src/main/mixin/TouchDomEvents.mjs +6 -6
- package/src/manager/Base.mjs +4 -4
- package/src/manager/Component.mjs +41 -41
- package/src/manager/DomEvent.mjs +41 -44
- package/src/manager/Focus.mjs +14 -16
- package/src/manager/Instance.mjs +2 -4
- package/src/manager/Store.mjs +4 -8
- package/src/manager/Task.mjs +20 -22
- package/src/manager/Toast.mjs +14 -16
- package/src/manager/rpc/Api.mjs +1 -3
- package/src/manager/rpc/Message.mjs +16 -18
- package/src/menu/List.mjs +16 -16
- package/src/menu/Panel.mjs +4 -4
- package/src/model/Component.mjs +5 -5
- package/src/plugin/Base.mjs +2 -0
- package/src/plugin/Popover.mjs +1 -1
- package/src/plugin/PrefixField.mjs +35 -45
- package/src/plugin/Resizable.mjs +86 -101
- package/src/plugin/Responsive.mjs +1 -1
- package/src/remotes/Api.mjs +4 -6
- package/src/selection/CircleModel.mjs +12 -16
- package/src/selection/DateSelectorModel.mjs +21 -23
- package/src/selection/GalleryModel.mjs +49 -63
- package/src/selection/HelixModel.mjs +35 -41
- package/src/selection/ListModel.mjs +9 -14
- package/src/selection/Model.mjs +31 -31
- package/src/selection/TreeAccordionModel.mjs +74 -80
- package/src/selection/grid/CellColumnModel.mjs +10 -10
- package/src/selection/grid/CellColumnRowModel.mjs +10 -10
- package/src/selection/grid/CellModel.mjs +26 -28
- package/src/selection/grid/CellRowModel.mjs +24 -24
- package/src/selection/grid/ColumnModel.mjs +16 -20
- package/src/selection/grid/RowModel.mjs +27 -29
- package/src/selection/menu/ListModel.mjs +2 -2
- package/src/selection/table/CellColumnModel.mjs +12 -12
- package/src/selection/table/CellColumnRowModel.mjs +12 -12
- package/src/selection/table/CellModel.mjs +26 -29
- package/src/selection/table/CellRowModel.mjs +19 -19
- package/src/selection/table/ColumnModel.mjs +18 -22
- package/src/selection/table/RowModel.mjs +27 -29
- package/src/sitemap/Component.mjs +20 -20
- package/src/sitemap/Store.mjs +1 -1
- package/src/tab/Container.mjs +15 -15
- package/src/tab/Strip.mjs +1 -1
- package/src/tab/header/Toolbar.mjs +4 -4
- package/src/table/Container.mjs +8 -10
- package/src/table/View.mjs +29 -34
- package/src/table/header/Button.mjs +18 -18
- package/src/table/header/Toolbar.mjs +2 -2
- package/src/toolbar/Base.mjs +14 -14
- package/src/toolbar/Breadcrumb.mjs +11 -11
- package/src/toolbar/Paging.mjs +18 -18
- package/src/tooltip/Base.mjs +20 -22
- package/src/tree/Accordion.mjs +69 -75
- package/src/tree/List.mjs +22 -25
- package/src/util/Array.mjs +19 -18
- package/src/util/ClassSystem.mjs +9 -9
- package/src/util/Css.mjs +2 -2
- package/src/util/Date.mjs +9 -9
- package/src/util/Function.mjs +2 -2
- package/src/util/HashHistory.mjs +3 -5
- package/src/util/KeyNavigation.mjs +17 -17
- package/src/util/Logger.mjs +9 -9
- package/src/util/Matrix.mjs +19 -19
- package/src/util/String.mjs +9 -9
- package/src/util/Style.mjs +11 -11
- package/src/util/VDom.mjs +12 -14
- package/src/util/VNode.mjs +29 -29
- package/src/vdom/Helper.mjs +84 -93
- package/src/vdom/VNode.mjs +1 -1
- package/src/worker/App.mjs +19 -16
- package/src/worker/Base.mjs +14 -15
- package/src/worker/Canvas.mjs +1 -3
- package/src/worker/Data.mjs +4 -8
- package/src/worker/Manager.mjs +27 -32
- package/src/worker/Message.mjs +1 -1
- package/src/worker/ServiceBase.mjs +38 -42
- package/src/worker/Task.mjs +1 -3
- package/src/worker/VDom.mjs +2 -4
- package/src/worker/mixin/RemoteMethodAccess.mjs +5 -6
- package/examples/component/helix/MainContainer.mjs +0 -340
- /package/resources/images/{Neo_Logo_Blue.svg → logo/neo_logo_secondary.svg} +0 -0
- /package/resources/images/{Neo_Logo_Text.svg → logo/neo_logo_text_secondary.svg} +0 -0
- /package/resources/images/{Neo_Logo_White.svg → logo/neo_logo_white.svg} +0 -0
@@ -42,7 +42,7 @@ class Navigator extends Base {
|
|
42
42
|
clickItem(el) {
|
43
43
|
// The element knows how to click itself.
|
44
44
|
if (typeof el.click === 'function') {
|
45
|
-
el.click()
|
45
|
+
el.click()
|
46
46
|
}
|
47
47
|
// It operates through a listener, so needs an event firing into it.
|
48
48
|
else {
|
@@ -78,7 +78,7 @@ class Navigator extends Base {
|
|
78
78
|
// focus, so we have nothing to do here. The navigable items wil be inert and not
|
79
79
|
// focusable. Navigation will be "virtual". Select field navigates its dropdowns like this.
|
80
80
|
if (!data.subject.contains(data.eventSource)) {
|
81
|
-
return
|
81
|
+
return
|
82
82
|
}
|
83
83
|
|
84
84
|
const
|
@@ -88,7 +88,7 @@ class Navigator extends Base {
|
|
88
88
|
if (f){
|
89
89
|
value.push(f);
|
90
90
|
}
|
91
|
-
return value
|
91
|
+
return value
|
92
92
|
}, []),
|
93
93
|
defaultActiveItem = focusables[0] || data.subject.querySelector(data.selector);
|
94
94
|
|
@@ -98,7 +98,7 @@ class Navigator extends Base {
|
|
98
98
|
|
99
99
|
// Make at least one thing tabbable so focus can move into the subject element
|
100
100
|
if (defaultActiveItem) {
|
101
|
-
defaultActiveItem.tabIndex = 0
|
101
|
+
defaultActiveItem.tabIndex = 0
|
102
102
|
}
|
103
103
|
}
|
104
104
|
|
@@ -107,7 +107,7 @@ class Navigator extends Base {
|
|
107
107
|
* @param {Object} data
|
108
108
|
*/
|
109
109
|
navigateClickHandler(e, data) {
|
110
|
-
|
110
|
+
let target = e.target.closest(data.selector);
|
111
111
|
|
112
112
|
// If there was a focusable under the mouse, mousedown will have focused it and and we
|
113
113
|
// will have respond to that in navigateFocusInHandler.
|
@@ -122,10 +122,9 @@ class Navigator extends Base {
|
|
122
122
|
* @param {Object} data
|
123
123
|
*/
|
124
124
|
navigateFocusInHandler(e, data) {
|
125
|
-
|
126
|
-
|
127
|
-
{
|
128
|
-
{ subject } = data;
|
125
|
+
let target = e.target.closest(data.selector),
|
126
|
+
{relatedTarget} = e,
|
127
|
+
{subject} = data;
|
129
128
|
|
130
129
|
// If our targets are focusable and recieve focus, that is a navigation.
|
131
130
|
if (target) {
|
@@ -135,7 +134,7 @@ class Navigator extends Base {
|
|
135
134
|
// The items must be focusable, but *not* tabbable.
|
136
135
|
// So remove tabbability on the last active item
|
137
136
|
if (subject.contains(relatedTarget)) {
|
138
|
-
relatedTarget.tabIndex = -1
|
137
|
+
relatedTarget.tabIndex = -1
|
139
138
|
}
|
140
139
|
}
|
141
140
|
}
|
@@ -145,14 +144,14 @@ class Navigator extends Base {
|
|
145
144
|
* @param {Object} data
|
146
145
|
*/
|
147
146
|
navigateFocusOutHandler(e, data) {
|
148
|
-
|
147
|
+
let {target} = e;
|
149
148
|
|
150
149
|
// Clear active class from the item we are leaving from.
|
151
150
|
target.closest(data.selector)?.classList.remove(data.activeCls);
|
152
151
|
|
153
152
|
// On focusout, leave the last active item as tabbable so user can TAB back in here
|
154
153
|
if (!DomUtils.isTabbable(target)) {
|
155
|
-
target.tabIndex = 0
|
154
|
+
target.tabIndex = 0
|
156
155
|
}
|
157
156
|
}
|
158
157
|
|
@@ -161,7 +160,7 @@ class Navigator extends Base {
|
|
161
160
|
* @param {Object} data
|
162
161
|
*/
|
163
162
|
navigateGetAdjacent(direction=1, data) {
|
164
|
-
|
163
|
+
let {treeWalker} = data;
|
165
164
|
|
166
165
|
// Walk forwards or backwards to the next or previous node which matches our selector
|
167
166
|
treeWalker.currentNode = this.navigatorGetActiveItem(data) || data.subject;
|
@@ -170,14 +169,14 @@ class Navigator extends Base {
|
|
170
169
|
// Found a target in the requested direction
|
171
170
|
if (treeWalker.currentNode) {
|
172
171
|
if (treeWalker.currentNode !== data.activeItem) {
|
173
|
-
return treeWalker.currentNode
|
172
|
+
return treeWalker.currentNode
|
174
173
|
}
|
175
174
|
}
|
176
175
|
// Could not find target in requested direction, then wrap if configured to do so
|
177
176
|
else if (data.wrap !== false) {
|
178
177
|
const allItems = data.subject.querySelector(data.selector);
|
179
178
|
|
180
|
-
return allItems[direction === 1 ? 0 : allItems.length - 1]
|
179
|
+
return allItems[direction === 1 ? 0 : allItems.length - 1]
|
181
180
|
}
|
182
181
|
}
|
183
182
|
|
@@ -187,12 +186,9 @@ class Navigator extends Base {
|
|
187
186
|
*/
|
188
187
|
navigateKeyDownHandler(keyEvent, data) {
|
189
188
|
const
|
190
|
-
me
|
191
|
-
{
|
192
|
-
|
193
|
-
wrap
|
194
|
-
} = data,
|
195
|
-
firstItem = subject.querySelector(data.selector);
|
189
|
+
me = this,
|
190
|
+
{subject, wrap} = data,
|
191
|
+
firstItem = subject.querySelector(data.selector);
|
196
192
|
|
197
193
|
if (!data.nextKey && firstItem) {
|
198
194
|
const
|
@@ -204,16 +200,16 @@ class Navigator extends Base {
|
|
204
200
|
if (containerStyle.display === 'flex' && containerStyle.flexDirection === 'row'
|
205
201
|
|| itemStyle.display === 'inline' || itemStyle.display === 'inline-block') {
|
206
202
|
data.previousKey = 'ArrowLeft';
|
207
|
-
data.nextKey = 'ArrowRight'
|
203
|
+
data.nextKey = 'ArrowRight'
|
208
204
|
}
|
209
205
|
// Child elements layed out vertically.
|
210
206
|
else {
|
211
207
|
data.previousKey = 'ArrowUp';
|
212
|
-
data.nextKey = 'ArrowDown'
|
208
|
+
data.nextKey = 'ArrowDown'
|
213
209
|
}
|
214
210
|
}
|
215
211
|
|
216
|
-
let {
|
212
|
+
let {key, target} = keyEvent,
|
217
213
|
newActiveElement;
|
218
214
|
|
219
215
|
switch(key) {
|
@@ -221,14 +217,14 @@ class Navigator extends Base {
|
|
221
217
|
case data.previousKey:
|
222
218
|
newActiveElement = me.navigateGetAdjacent(-1, data);
|
223
219
|
if (!newActiveElement && wrap) {
|
224
|
-
newActiveElement = subject.querySelector(`${data.selector}:last-of-type`)
|
220
|
+
newActiveElement = subject.querySelector(`${data.selector}:last-of-type`)
|
225
221
|
}
|
226
222
|
break;
|
227
223
|
// Move to the next navigable item
|
228
224
|
case data.nextKey:
|
229
225
|
newActiveElement = me.navigateGetAdjacent(1, data);
|
230
226
|
if (!newActiveElement && wrap) {
|
231
|
-
newActiveElement = subject.querySelector(data.selector)
|
227
|
+
newActiveElement = subject.querySelector(data.selector)
|
232
228
|
}
|
233
229
|
break;
|
234
230
|
// Move to the first navigable item
|
@@ -242,13 +238,13 @@ class Navigator extends Base {
|
|
242
238
|
// Click the currently active item if necessary
|
243
239
|
case 'Enter':
|
244
240
|
if (data.activeItem && !enterActivatedTags[target.tagName]) {
|
245
|
-
this.clickItem(data.activeItem)
|
241
|
+
this.clickItem(data.activeItem)
|
246
242
|
}
|
247
243
|
}
|
248
244
|
|
249
245
|
if (newActiveElement) {
|
250
246
|
keyEvent.preventDefault();
|
251
|
-
me.navigateTo(newActiveElement, data)
|
247
|
+
me.navigateTo(newActiveElement, data)
|
252
248
|
}
|
253
249
|
}
|
254
250
|
|
@@ -263,7 +259,7 @@ class Navigator extends Base {
|
|
263
259
|
// If not, we have to programmatically activate on click, but we must not draw focus away from
|
264
260
|
// where it is, so preventDefault
|
265
261
|
if (target && !data.findFocusable(target)) {
|
266
|
-
e.preventDefault()
|
262
|
+
e.preventDefault()
|
267
263
|
}
|
268
264
|
}
|
269
265
|
|
@@ -272,7 +268,7 @@ class Navigator extends Base {
|
|
272
268
|
* @param {Object} data
|
273
269
|
*/
|
274
270
|
navigateNodeFilter(node, data) {
|
275
|
-
return node.offsetParent && node.matches?.(data.selector) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
|
271
|
+
return node.offsetParent && node.matches?.(data.selector) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
|
276
272
|
}
|
277
273
|
|
278
274
|
/**
|
@@ -290,7 +286,7 @@ class Navigator extends Base {
|
|
290
286
|
if (data.activeItem && !data.subject.contains(data.activeItem)) {
|
291
287
|
const allItems = data.subject.querySelectorAll(data.selector);
|
292
288
|
|
293
|
-
allItems.length && this.navigateTo(allItems[Math.max(Math.min(data.activeIndex, allItems.length - 1), 0)], data)
|
289
|
+
allItems.length && this.navigateTo(allItems[Math.max(Math.min(data.activeIndex, allItems.length - 1), 0)], data)
|
294
290
|
}
|
295
291
|
}
|
296
292
|
}
|
@@ -312,10 +308,10 @@ class Navigator extends Base {
|
|
312
308
|
// Can navigate by index. This is useful if the active item is deleted.
|
313
309
|
// We can navigate to the same index and preserve UI stability.
|
314
310
|
if (typeof newActiveElement === 'number') {
|
315
|
-
newActiveElement = data.subject.querySelectorAll(data.selector)?.[newActiveElement]
|
311
|
+
newActiveElement = data.subject.querySelectorAll(data.selector)?.[newActiveElement]
|
316
312
|
}
|
317
313
|
else if (typeof newActiveElement === 'string') {
|
318
|
-
newActiveElement = DomAccess.getElement(newActiveElement)
|
314
|
+
newActiveElement = DomAccess.getElement(newActiveElement)
|
319
315
|
}
|
320
316
|
|
321
317
|
// Could not do what was asked because we could not find the requested item
|
@@ -335,11 +331,11 @@ class Navigator extends Base {
|
|
335
331
|
|
336
332
|
// If the item contains a focusable, we focus it and then react in navigateFocusInHandler
|
337
333
|
if (focusTarget) {
|
338
|
-
focusTarget.focus({ preventScroll : true })
|
334
|
+
focusTarget.focus({ preventScroll : true })
|
339
335
|
}
|
340
336
|
// If not, we programmatically navigate there
|
341
337
|
else {
|
342
|
-
this.setActiveItem(newActiveElement, data)
|
338
|
+
this.setActiveItem(newActiveElement, data)
|
343
339
|
}
|
344
340
|
}
|
345
341
|
|
@@ -353,9 +349,9 @@ class Navigator extends Base {
|
|
353
349
|
if (!activeItem && ('activeIndex' in data)) {
|
354
350
|
const allItems = data.subject.querySelectorAll(data.selector);
|
355
351
|
|
356
|
-
activeItem = allItems[Math.max(Math.min(data.activeIndex, allItems.length - 1), 0)]
|
352
|
+
activeItem = allItems[Math.max(Math.min(data.activeIndex, allItems.length - 1), 0)]
|
357
353
|
}
|
358
|
-
return activeItem
|
354
|
+
return activeItem
|
359
355
|
}
|
360
356
|
|
361
357
|
/**
|
@@ -368,7 +364,7 @@ class Navigator extends Base {
|
|
368
364
|
// Can navigate by index. This is useful if the active item is deleted.
|
369
365
|
// We can navigate to the same index and preserve UI stability.
|
370
366
|
if (typeof newActiveElement === 'number') {
|
371
|
-
newActiveElement = allItems[Math.max(Math.min(newActiveElement, allItems.length - 1), 0)]
|
367
|
+
newActiveElement = allItems[Math.max(Math.min(newActiveElement, allItems.length - 1), 0)]
|
372
368
|
}
|
373
369
|
|
374
370
|
data.previousActiveIndex = data.activeIndex;
|
@@ -495,7 +491,7 @@ class Navigator extends Base {
|
|
495
491
|
target.removeEventListener('mousedown', data.l2);
|
496
492
|
target.removeEventListener('click', data.l3);
|
497
493
|
target.removeEventListener('focusin', data.l4);
|
498
|
-
target.removeEventListener('focusout', data.l5)
|
494
|
+
target.removeEventListener('focusout', data.l5)
|
499
495
|
}
|
500
496
|
}
|
501
497
|
}
|
@@ -34,7 +34,7 @@ class Popover extends Base {
|
|
34
34
|
*/
|
35
35
|
hide(data) {
|
36
36
|
this.getPopover(data.id).hidePopover();
|
37
|
-
return true
|
37
|
+
return true
|
38
38
|
}
|
39
39
|
|
40
40
|
/**
|
@@ -44,7 +44,7 @@ class Popover extends Base {
|
|
44
44
|
*/
|
45
45
|
show(data) {
|
46
46
|
this.getPopover(data.id).showPopover();
|
47
|
-
return true
|
47
|
+
return true
|
48
48
|
}
|
49
49
|
|
50
50
|
/**
|
@@ -54,14 +54,13 @@ class Popover extends Base {
|
|
54
54
|
*/
|
55
55
|
toggle(data) {
|
56
56
|
this.getPopover(data.id).togglePopover();
|
57
|
-
return true
|
57
|
+
return true
|
58
58
|
}
|
59
59
|
|
60
60
|
getPopover(parentId) {
|
61
|
-
const parent =
|
62
|
-
popover = document.getElementById(parent.getAttribute('popovertarget'));
|
61
|
+
const parent = DomAccess.getElement(parentId);
|
63
62
|
|
64
|
-
return
|
63
|
+
return DomAccess.getElement(parent.getAttribute('popovertarget'))
|
65
64
|
}
|
66
65
|
}
|
67
66
|
|
@@ -20,14 +20,14 @@ class ServiceWorker extends Base {
|
|
20
20
|
*/
|
21
21
|
construct(config) {
|
22
22
|
if ('serviceWorker' in navigator) {
|
23
|
-
let me
|
24
|
-
config = Neo
|
25
|
-
devMode
|
26
|
-
fileName
|
27
|
-
folder
|
28
|
-
opts
|
29
|
-
path
|
30
|
-
serviceWorker = navigator
|
23
|
+
let me = this,
|
24
|
+
{config} = Neo,
|
25
|
+
devMode = config.environment === 'development',
|
26
|
+
fileName = devMode ? 'ServiceWorker.mjs' : 'serviceworker.js',
|
27
|
+
folder = window.location.pathname.includes('/examples/') ? 'examples/' : 'apps/',
|
28
|
+
opts = devMode ? {type: 'module'} : {},
|
29
|
+
path = (devMode ? config.basePath : config.workerBasePath) + (devMode ? folder : '') + fileName,
|
30
|
+
{serviceWorker} = navigator;
|
31
31
|
|
32
32
|
window.addEventListener('beforeunload', me.onBeforeUnload.bind(me));
|
33
33
|
|
@@ -49,7 +49,7 @@ class ServiceWorker extends Base {
|
|
49
49
|
action: 'registerNeoConfig',
|
50
50
|
data : config
|
51
51
|
})
|
52
|
-
})
|
52
|
+
})
|
53
53
|
})
|
54
54
|
}
|
55
55
|
}
|
@@ -19,7 +19,7 @@ class Siesta extends Base {
|
|
19
19
|
*/
|
20
20
|
construct(config) {
|
21
21
|
super.construct(config);
|
22
|
-
this.adjustSiestaEnvironment()
|
22
|
+
this.adjustSiestaEnvironment()
|
23
23
|
}
|
24
24
|
|
25
25
|
/**
|
@@ -34,8 +34,9 @@ class Siesta extends Base {
|
|
34
34
|
|
35
35
|
for (; i < len; i++) {
|
36
36
|
sheet = document.styleSheets[i];
|
37
|
+
|
37
38
|
if (sheet?.href.includes('highlightjs')) {
|
38
|
-
sheet.ownerNode.id = 'hljs-theme'
|
39
|
+
sheet.ownerNode.id = 'hljs-theme'
|
39
40
|
}
|
40
41
|
}
|
41
42
|
}
|
@@ -47,16 +47,16 @@ class Stylesheet extends Base {
|
|
47
47
|
|
48
48
|
if (neoConfig.useFontAwesome) {
|
49
49
|
if (neoConfig.environment === 'development') {
|
50
|
-
faPath = neoConfig.basePath + 'node_modules/@fortawesome/fontawesome-free/css/all.min.css'
|
50
|
+
faPath = neoConfig.basePath + 'node_modules/@fortawesome/fontawesome-free/css/all.min.css'
|
51
51
|
} else {
|
52
|
-
faPath = neoConfig.basePath.substr(6) + 'resources/fontawesome-free/css/all.min.css'
|
52
|
+
faPath = neoConfig.basePath.substr(6) + 'resources/fontawesome-free/css/all.min.css'
|
53
53
|
}
|
54
54
|
|
55
|
-
this.createStyleSheet(null, null, faPath)
|
55
|
+
this.createStyleSheet(null, null, faPath)
|
56
56
|
}
|
57
57
|
|
58
58
|
if (neoConfig.themes.length > 0 && neoConfig.themes[0] !== '') {
|
59
|
-
this.addGlobalCss()
|
59
|
+
this.addGlobalCss()
|
60
60
|
}
|
61
61
|
}
|
62
62
|
|
@@ -64,26 +64,26 @@ class Stylesheet extends Base {
|
|
64
64
|
*
|
65
65
|
*/
|
66
66
|
addGlobalCss() {
|
67
|
-
let config
|
68
|
-
themes
|
67
|
+
let {config} = Neo,
|
68
|
+
{themes} = config,
|
69
69
|
folders = ['src', ...themes],
|
70
70
|
env = config.environment,
|
71
71
|
path = env.startsWith('dist/') ? '' : config.appPath.includes('docs') ? `../dist/${env}/` : `../../dist/${env}/`,
|
72
|
-
rootPath = config.basePath.
|
72
|
+
rootPath = config.basePath.substring(6);
|
73
73
|
|
74
74
|
document.body.classList.add(themes[0]);
|
75
75
|
|
76
76
|
folders.forEach(folder => {
|
77
77
|
if (folder.startsWith('neo-')) {
|
78
|
-
folder = folder.substring(4)
|
78
|
+
folder = folder.substring(4)
|
79
79
|
}
|
80
80
|
|
81
81
|
this.createStyleSheet(
|
82
82
|
null,
|
83
83
|
null,
|
84
84
|
`${rootPath}${path}css/${folder}/Global.css`
|
85
|
-
)
|
86
|
-
})
|
85
|
+
)
|
86
|
+
})
|
87
87
|
}
|
88
88
|
|
89
89
|
/**
|
@@ -93,14 +93,14 @@ class Stylesheet extends Base {
|
|
93
93
|
* @param {String[]} data.folders
|
94
94
|
*/
|
95
95
|
addThemeFiles(data) {
|
96
|
-
let className = data
|
97
|
-
config = Neo
|
98
|
-
env
|
99
|
-
path
|
100
|
-
rootPath
|
96
|
+
let {className} = data,
|
97
|
+
{config} = Neo,
|
98
|
+
env = config.environment,
|
99
|
+
path = env.startsWith('dist/') ? '' : config.appPath.includes('docs') ? `../dist/${env}/` : `../../dist/${env}/`,
|
100
|
+
rootPath = config.basePath.substring(6);
|
101
101
|
|
102
102
|
if (className.startsWith('Neo.')) {
|
103
|
-
className = className.substring(4)
|
103
|
+
className = className.substring(4)
|
104
104
|
}
|
105
105
|
|
106
106
|
className = className.split('.').join('/');
|
@@ -124,13 +124,13 @@ class Stylesheet extends Base {
|
|
124
124
|
*/
|
125
125
|
createStyleSheet(name, id, href) {
|
126
126
|
if (!name && !href) {
|
127
|
-
throw new Error('createStyleSheet: you need to either pass a name or a href')
|
127
|
+
throw new Error('createStyleSheet: you need to either pass a name or a href')
|
128
128
|
}
|
129
129
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
130
|
+
let link = document.createElement('link'),
|
131
|
+
env = Neo.config.environment,
|
132
|
+
path = env.startsWith('dist/') ? env : ('dist/' + env),
|
133
|
+
url = href ? href : Neo.config.basePath + path + '/' + name;
|
134
134
|
|
135
135
|
Object.assign(link, {
|
136
136
|
href: url,
|
@@ -139,10 +139,10 @@ class Stylesheet extends Base {
|
|
139
139
|
});
|
140
140
|
|
141
141
|
if (id) {
|
142
|
-
link.id = id
|
142
|
+
link.id = id
|
143
143
|
}
|
144
144
|
|
145
|
-
document.head.appendChild(link)
|
145
|
+
document.head.appendChild(link)
|
146
146
|
}
|
147
147
|
|
148
148
|
/**
|
@@ -153,7 +153,7 @@ class Stylesheet extends Base {
|
|
153
153
|
deleteCssRules(data) {
|
154
154
|
let styleEl = document.getElementById(this.dynamicStyleSheetId),
|
155
155
|
styleSheet = styleEl.sheet,
|
156
|
-
cssRules
|
156
|
+
{cssRules} = styleSheet,
|
157
157
|
i = 0,
|
158
158
|
len = data.rules.length,
|
159
159
|
j, rulesLen;
|
@@ -165,7 +165,7 @@ class Stylesheet extends Base {
|
|
165
165
|
for (; j < rulesLen; j++) {
|
166
166
|
if (cssRules[j].selectorText === data.rules[i]) {
|
167
167
|
styleSheet.deleteRule(j);
|
168
|
-
break
|
168
|
+
break
|
169
169
|
}
|
170
170
|
}
|
171
171
|
}
|
@@ -183,11 +183,11 @@ class Stylesheet extends Base {
|
|
183
183
|
for (; i < len; i++) {
|
184
184
|
sheet = document.styleSheets[i];
|
185
185
|
if (sheet.href?.includes(token)) {
|
186
|
-
return true
|
186
|
+
return true
|
187
187
|
}
|
188
188
|
}
|
189
189
|
|
190
|
-
return false
|
190
|
+
return false
|
191
191
|
}
|
192
192
|
|
193
193
|
/**
|
@@ -205,13 +205,13 @@ class Stylesheet extends Base {
|
|
205
205
|
styleEl = document.createElement('style');
|
206
206
|
|
207
207
|
styleEl.id = this.dynamicStyleSheetId;
|
208
|
-
document.head.appendChild(styleEl)
|
208
|
+
document.head.appendChild(styleEl)
|
209
209
|
}
|
210
210
|
|
211
211
|
styleSheet = styleEl.sheet;
|
212
212
|
|
213
213
|
for (; i < len; i++) {
|
214
|
-
styleSheet.insertRule(data.rules[i], styleSheet.cssRules.length)
|
214
|
+
styleSheet.insertRule(data.rules[i], styleSheet.cssRules.length)
|
215
215
|
}
|
216
216
|
}
|
217
217
|
|
@@ -235,19 +235,19 @@ class Stylesheet extends Base {
|
|
235
235
|
if (sheet.href) {
|
236
236
|
excluded.forEach(name => {
|
237
237
|
if (sheet.href.includes(name)) {
|
238
|
-
removeSheet = false
|
238
|
+
removeSheet = false
|
239
239
|
}
|
240
240
|
});
|
241
241
|
|
242
242
|
if (removeSheet) {
|
243
243
|
included.forEach(name => {
|
244
244
|
if (!sheet.href.includes(name)) {
|
245
|
-
removeSheet = false
|
245
|
+
removeSheet = false
|
246
246
|
}
|
247
247
|
});
|
248
248
|
|
249
249
|
if (removeSheet) {
|
250
|
-
sheet.ownerNode.parentNode.removeChild(sheet.ownerNode)
|
250
|
+
sheet.ownerNode.parentNode.removeChild(sheet.ownerNode)
|
251
251
|
}
|
252
252
|
}
|
253
253
|
}
|
@@ -262,11 +262,11 @@ class Stylesheet extends Base {
|
|
262
262
|
* @param {String} data.value
|
263
263
|
*/
|
264
264
|
setCssVariable(data) {
|
265
|
-
let key = data
|
265
|
+
let {key} = data,
|
266
266
|
rule, sheet;
|
267
267
|
|
268
268
|
if (!key.startsWith('--')) {
|
269
|
-
key = '--' + key
|
269
|
+
key = '--' + key
|
270
270
|
}
|
271
271
|
|
272
272
|
for (sheet of document.styleSheets) {
|
@@ -275,14 +275,14 @@ class Stylesheet extends Base {
|
|
275
275
|
if (Neo.typeOf(rule) === 'CSSStyleRule') {
|
276
276
|
if (rule.style.getPropertyValue(key) !== '') {
|
277
277
|
rule.style.setProperty(key, data.value, data.priority);
|
278
|
-
return true
|
278
|
+
return true
|
279
279
|
}
|
280
280
|
}
|
281
281
|
}
|
282
282
|
}
|
283
283
|
}
|
284
284
|
|
285
|
-
return false
|
285
|
+
return false
|
286
286
|
}
|
287
287
|
|
288
288
|
/**
|
@@ -291,7 +291,7 @@ class Stylesheet extends Base {
|
|
291
291
|
* @param {String} data.id
|
292
292
|
*/
|
293
293
|
swapStyleSheet(data) {
|
294
|
-
document.getElementById(data.id).setAttribute('href', data.href)
|
294
|
+
document.getElementById(data.id).setAttribute('href', data.href)
|
295
295
|
}
|
296
296
|
}
|
297
297
|
|
@@ -19,8 +19,7 @@ class WebComponent extends Base {
|
|
19
19
|
*/
|
20
20
|
construct(config) {
|
21
21
|
super.construct(config);
|
22
|
-
|
23
|
-
this.registerElementLoader();
|
22
|
+
this.registerElementLoader()
|
24
23
|
}
|
25
24
|
|
26
25
|
/**
|
@@ -36,7 +35,7 @@ class WebComponent extends Base {
|
|
36
35
|
me.attachShadow({mode: 'open'}).innerHTML = content;
|
37
36
|
|
38
37
|
styles = me.querySelector('style');
|
39
|
-
styles && me.shadowRoot.append(styles)
|
38
|
+
styles && me.shadowRoot.append(styles)
|
40
39
|
}
|
41
40
|
});
|
42
41
|
}
|
@@ -113,11 +113,10 @@ class WindowPosition extends Base {
|
|
113
113
|
*
|
114
114
|
*/
|
115
115
|
checkMovement() {
|
116
|
-
let me
|
117
|
-
Manager
|
118
|
-
win
|
119
|
-
screenLeft = win
|
120
|
-
screenTop = win.screenTop,
|
116
|
+
let me = this,
|
117
|
+
{Manager} = Neo.worker,
|
118
|
+
win = window,
|
119
|
+
{screenLeft, screenTop} = win,
|
121
120
|
winData;
|
122
121
|
|
123
122
|
if (me.screenLeft !== screenLeft || me.screenTop !== screenTop) {
|
@@ -154,25 +153,27 @@ class WindowPosition extends Base {
|
|
154
153
|
* @param {Object} data
|
155
154
|
*/
|
156
155
|
getPosition(data) {
|
157
|
-
let
|
156
|
+
let {size} = data,
|
157
|
+
win = window,
|
158
|
+
{screenLeft, screenTop} = win,
|
158
159
|
left, top;
|
159
160
|
|
160
161
|
switch(data.dock) {
|
161
162
|
case 'bottom':
|
162
|
-
left =
|
163
|
-
top = win.outerHeight +
|
163
|
+
left = screenLeft;
|
164
|
+
top = win.outerHeight + screenTop - 50;
|
164
165
|
break
|
165
166
|
case 'left':
|
166
|
-
left =
|
167
|
-
top =
|
167
|
+
left = screenLeft - size;
|
168
|
+
top = screenTop + 28;
|
168
169
|
break
|
169
170
|
case 'right':
|
170
|
-
left = win.outerWidth +
|
171
|
-
top =
|
171
|
+
left = win.outerWidth + screenLeft;
|
172
|
+
top = screenTop + 28;
|
172
173
|
break
|
173
174
|
case 'top':
|
174
|
-
left =
|
175
|
-
top =
|
175
|
+
left = screenLeft;
|
176
|
+
top = screenTop - size + 78;
|
176
177
|
break
|
177
178
|
}
|
178
179
|
|
@@ -254,10 +255,9 @@ class WindowPosition extends Base {
|
|
254
255
|
* @param {String} data.name
|
255
256
|
*/
|
256
257
|
setDock(data) {
|
257
|
-
let me
|
258
|
-
dock = data
|
259
|
-
|
260
|
-
win = me.windows[name],
|
258
|
+
let me = this,
|
259
|
+
{dock, name} = data,
|
260
|
+
win = me.windows[name],
|
261
261
|
dockDirectionChange, position;
|
262
262
|
|
263
263
|
if (win) {
|
@@ -53,7 +53,7 @@ class Base extends CoreBase {
|
|
53
53
|
*/
|
54
54
|
onConstructed() {
|
55
55
|
this.attach();
|
56
|
-
super.onConstructed()
|
56
|
+
super.onConstructed()
|
57
57
|
}
|
58
58
|
|
59
59
|
/**
|
@@ -69,7 +69,7 @@ class Base extends CoreBase {
|
|
69
69
|
element.dispatchEvent(event);
|
70
70
|
this.lastEvent = sensorEvent;
|
71
71
|
|
72
|
-
return sensorEvent
|
72
|
+
return sensorEvent
|
73
73
|
}
|
74
74
|
}
|
75
75
|
|