@abi-software/mapintegratedvuer 0.7.1-demo.0 → 0.7.2-vue3.0-alpha.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 (65) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +150 -142
  3. package/assets/gazelle-icons-no-background.css +32 -0
  4. package/assets/styleguide.css +19 -19
  5. package/cypress.config.js +23 -23
  6. package/dist/index.html +17 -17
  7. package/dist/mapintegratedvuer.js +60394 -59859
  8. package/dist/mapintegratedvuer.umd.cjs +515 -907
  9. package/dist/matterport.pdf +0 -0
  10. package/dist/style.css +1 -1
  11. package/dist/test.txt +0 -0
  12. package/package.json +135 -136
  13. package/public/index.html +17 -17
  14. package/public/matterport.pdf +0 -0
  15. package/public/test.txt +0 -0
  16. package/q.json +690 -0
  17. package/reporter-config.json +9 -9
  18. package/src/App.vue +245 -245
  19. package/src/assets/_variables.scss +43 -43
  20. package/src/assets/fonts/mapicon-species.eot +0 -0
  21. package/src/assets/fonts/mapicon-species.ttf +0 -0
  22. package/src/assets/fonts/mapicon-species.woff +0 -0
  23. package/src/assets/header-icon.scss +67 -67
  24. package/src/assets/mapicon-species-style.css +41 -41
  25. package/src/assets/styles.scss +9 -9
  26. package/src/components/ContentBar.vue +376 -376
  27. package/src/components/ContentVuer.vue +217 -217
  28. package/src/components/ContextCard.vue +385 -385
  29. package/src/components/ContextHelp.vue +73 -73
  30. package/src/components/CustomSplitter.vue +151 -151
  31. package/src/components/DatasetHeader.vue +97 -97
  32. package/src/components/DialogToolbarContent.vue +464 -464
  33. package/src/components/EventBus.js +3 -3
  34. package/src/components/FlatmapContextCard.vue +134 -134
  35. package/src/components/MapContent.vue +333 -285
  36. package/src/components/ResizeSensor.vue +47 -47
  37. package/src/components/SearchControls.vue +115 -115
  38. package/src/components/SimulatedData.js +721 -721
  39. package/src/components/SplitDialog.vue +287 -287
  40. package/src/components/SplitFlow.vue +414 -414
  41. package/src/components/index.js +7 -7
  42. package/src/components/markerZoomLevelsHardCoded.js +255 -255
  43. package/src/components/scripts/utilities.js +173 -173
  44. package/src/components/viewers/Flatmap.vue +145 -145
  45. package/src/components/viewers/Iframe.vue +31 -31
  46. package/src/components/viewers/MultiFlatmap.vue +384 -384
  47. package/src/components/viewers/Plot.vue +23 -23
  48. package/src/components/viewers/Scaffold.vue +198 -198
  49. package/src/components/viewers/Simulation.vue +21 -21
  50. package/src/icons/yellowstar.js +1 -1
  51. package/src/main.js +32 -22
  52. package/src/mixins/ContentMixin.js +438 -438
  53. package/src/mixins/DynamicMarkerMixin.js +88 -88
  54. package/src/mixins/RetrieveContextCardMixin.js +82 -0
  55. package/src/mixins/S3Bucket.vue +37 -37
  56. package/src/stores/entries.js +40 -40
  57. package/src/stores/index.js +24 -16
  58. package/src/stores/settings.js +144 -144
  59. package/src/stores/splitFlow.js +523 -523
  60. package/static.json +7 -7
  61. package/tsconfig.json +19 -0
  62. package/vite.config.js +70 -66
  63. package/vite.static-build.js +12 -12
  64. package/vitest.workspace.js +3 -3
  65. package/vuese-generator.js +65 -0
@@ -1,9 +1,9 @@
1
- {
2
- "reporterEnabled": "mochawesome",
3
- "mochawesomeReporterOptions": {
4
- "reportDir": "cypress/results/json",
5
- "overwrite": false,
6
- "html": false,
7
- "json": true
8
- }
9
- }
1
+ {
2
+ "reporterEnabled": "mochawesome",
3
+ "mochawesomeReporterOptions": {
4
+ "reportDir": "cypress/results/json",
5
+ "overwrite": false,
6
+ "html": false,
7
+ "json": true
8
+ }
9
+ }
package/src/App.vue CHANGED
@@ -1,245 +1,245 @@
1
- <template>
2
- <div id="app">
3
- <link rel="stylesheet"
4
- href="https://fonts.googleapis.com/css?family=Asap:400,400i,500,600,700&display=swap">
5
- <div class="button-container">
6
- <el-popover
7
- placement="bottom"
8
- trigger="click"
9
- width=500
10
- class="popover"
11
- :teleported=false
12
- >
13
- <div class="options-container">
14
- <el-row class="row" :gutter="20">
15
- <el-button @click="saveSettings()" size="small">Save Settings</el-button>
16
- <el-button @click="restoreSettings()" size="small">Restore Settings</el-button>
17
- <el-button @click="getShareableURL()" size="small">Get Link</el-button>
18
- </el-row>
19
- <el-row class="row" :gutter="20">
20
- <el-button @click="setMultiFlatmap()" size="small">Set MultiFlatmap</el-button>
21
- <el-button @click="setLegacyMultiFlatmap()" size="small">Set Legacy MultiFlatmap</el-button>
22
- <el-button @click="setScaffold()" size="small">Set To Scaffold</el-button>
23
- <el-button @click="setFlatmap()" size="small">Set Flatmap</el-button>
24
- <el-button @click="setSearch()" size="small">Set Search</el-button>
25
- </el-row>
26
- </div>
27
- <template #reference>
28
-
29
- <el-button class="options-button" :icon="ElIconSetting">Options</el-button>
30
-
31
- </template>
32
- </el-popover>
33
- </div>
34
- <div class="map-app">
35
- <MapContent ref="map" :startingMap="startingMap" :options="options" :state="state" :shareLink="shareLink" @updateShareLinkRequested="updateUUID" @isReady="mapIsReady"/>
36
- </div>
37
- </div>
38
- </template>
39
-
40
- <script>
41
- /* eslint-disable no-alert, no-console */
42
- import { shallowRef } from 'vue';
43
- import MapContent from './components/MapContent.vue';
44
- import { Setting as ElIconSetting } from '@element-plus/icons-vue'
45
- import {
46
- ElButton as Button,
47
- ElCol as Col,
48
- ElPopover as Popover,
49
- ElRow as Row,
50
- } from 'element-plus';
51
-
52
- export default {
53
- name: 'app',
54
- components: {
55
- Button,
56
- Col,
57
- Popover,
58
- Row,
59
- MapContent,
60
- },
61
- data: function() {
62
- return {
63
- uuid: undefined,
64
- state: undefined,
65
- prefix: "/map",
66
- api: import.meta.env.VITE_API_LOCATION,
67
- mapSettings: [],
68
- startingMap: "AC",
69
- ElIconSetting: shallowRef(ElIconSetting)
70
- }
71
- },
72
- computed: {
73
- shareLink: function() {
74
- if (this.uuid)
75
- return this.prefix +"?id=" + this.uuid;
76
- return this.prefix;
77
- },
78
- options: function() {
79
- return {
80
- sparcApi: import.meta.env.VITE_API_LOCATION,
81
- algoliaIndex: import.meta.env.VITE_ALGOLIA_INDEX,
82
- algoliaKey: import.meta.env.VITE_ALGOLIA_KEY,
83
- algoliaId: import.meta.env.VITE_ALGOLIA_ID,
84
- pennsieveApi: import.meta.env.VITE_PENNSIEVE_API_LOCATION,
85
- flatmapAPI: import.meta.env.VITE_FLATMAPAPI_LOCATION,
86
- nlLinkPrefix: import.meta.env.VITE_NL_LINK_PREFIX,
87
- rootUrl: import.meta.env.VITE_ROOT_URL,
88
- }
89
- }
90
- },
91
- methods: {
92
- saveSettings: function() {
93
- this.mapSettings.push(this.$refs.map.getState());
94
- },
95
- restoreSettings: function() {
96
- if (this.mapSettings.length > 0)
97
- this.$refs.map.setState(this.mapSettings.pop());
98
- },
99
- updateUUID: function() {
100
- let xmlhttp = new XMLHttpRequest();
101
- let url = this.api + 'map/getshareid';
102
- let state = this.$refs.map.getState();
103
- xmlhttp.open('POST', url, true);
104
- //Send the proper header information along with the request
105
- xmlhttp.setRequestHeader('Content-type', 'application/json');
106
- xmlhttp.onreadystatechange = () => {//Call a function when the state changes.
107
- if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
108
- let state = JSON.parse(xmlhttp.responseText);
109
- this.uuid = state.uuid;
110
- }
111
- }
112
- xmlhttp.send(JSON.stringify({"state": state}));
113
-
114
- },
115
- setFlatmap: function() {
116
- this.$refs.map.setCurrentEntry(
117
- {
118
- type: "Flatmap",
119
- resource: "FunctionalConnectivity",
120
- label: "Functional"
121
- }
122
- );
123
- },
124
- setLegacyMultiFlatmap: function() {
125
- this.$refs.map.setCurrentEntry(
126
- {
127
- type: "MultiFlatmap",
128
- taxo: "NCBITaxon:10114",
129
- uuid: "01fedbf9-d783-509c-a10c-827941ab13da",
130
- }
131
- );
132
- },
133
- setMultiFlatmap: function() {
134
- this.$refs.map.setCurrentEntry(
135
- {
136
- type: "MultiFlatmap",
137
- taxo: "NCBITaxon:9606",
138
- biologicalSex: "PATO:0000384",
139
- //organ: "heart"
140
- organ: "UBERON:0018675"
141
- }
142
- );
143
- },
144
- setScaffold: function() {
145
- this.$refs.map.setCurrentEntry(
146
- {
147
- type: "Scaffold",
148
- label: "Colon",
149
- url: "https://mapcore-demo.org/current/sparc-api-v2/s3-resource/221/3/files/derivative/Scaffolds/mouse_colon_metadata.json",
150
- viewUrl: "M16_view.json"
151
- }
152
- );
153
- },
154
- setSearch: function() {
155
- this.$refs.map.openSearch([], "10.26275/1uno-tynt");
156
- },
157
- mapIsReady: function() {
158
- console.log("map is ready")
159
- },
160
- parseQuery: function () {
161
- this.$router.isReady().then(() => {
162
- this.uuid = this.$route.query.id;
163
- if (window) {
164
- this.prefix = window.location.origin + window.location.pathname;
165
- }
166
- if (this.uuid) {
167
- let xmlhttp = new XMLHttpRequest();
168
- let url = this.api + 'map/getstate';
169
- xmlhttp.open('POST', url, true);
170
- //Send the proper header information along with the request
171
- xmlhttp.setRequestHeader('Content-type', 'application/json');
172
- xmlhttp.onreadystatechange = () => {//Call a function when the state changes.
173
- if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
174
- let state = JSON.parse(xmlhttp.responseText);
175
- this.state = state.state;
176
- }
177
- }
178
- xmlhttp.send(JSON.stringify({"uuid": this.uuid}));
179
- }
180
- })
181
- },
182
- },
183
- mounted: function() {
184
- this.parseQuery();
185
- },
186
- }
187
- </script>
188
-
189
- <style lang="scss">
190
- #app {
191
- height:100%;
192
- width: 100%;
193
- position:absolute;
194
- font-family: "Asap",sans-serif;
195
- --el-color-primary: #8300BF;
196
- --el-color-primary-light-7: #dab3ec;
197
- --el-color-primary-light-8: #e6ccf2;
198
- --el-color-primary-light-9: #f3e6f9;
199
- }
200
-
201
- body {
202
- margin: 0px;
203
- }
204
-
205
- .map-app {
206
- position:absolute;
207
- height: calc(100% - 104px);
208
- width:calc(100% - 54px);
209
- margin-top:20px;
210
- margin-left:26px;
211
- margin-right:26px;
212
- border: solid 1px #dcdfe6;
213
- box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.06);
214
- }
215
-
216
- .popover{
217
- top:10px;
218
- right:50%;
219
- position:absolute;
220
- z-index:1000;
221
- }
222
-
223
- .row {
224
- margin-bottom: 5px;
225
- &:last-child {
226
- margin-bottom: 0;
227
- }
228
- }
229
-
230
- .button-container {
231
- display: flex;
232
- align-items: center;
233
- justify-content: center;
234
- height:50px;
235
- }
236
-
237
-
238
- .options-container{
239
- text-align: center;
240
- }
241
-
242
- .map-icon {
243
- color: $app-primary-color;
244
- }
245
- </style>
1
+ <template>
2
+ <div id="app">
3
+ <link rel="stylesheet"
4
+ href="https://fonts.googleapis.com/css?family=Asap:400,400i,500,600,700&display=swap">
5
+ <div class="button-container">
6
+ <el-popover
7
+ placement="bottom"
8
+ trigger="click"
9
+ width=500
10
+ class="popover"
11
+ :teleported=false
12
+ >
13
+ <div class="options-container">
14
+ <el-row class="row" :gutter="20">
15
+ <el-button @click="saveSettings()" size="small">Save Settings</el-button>
16
+ <el-button @click="restoreSettings()" size="small">Restore Settings</el-button>
17
+ <el-button @click="getShareableURL()" size="small">Get Link</el-button>
18
+ </el-row>
19
+ <el-row class="row" :gutter="20">
20
+ <el-button @click="setMultiFlatmap()" size="small">Set MultiFlatmap</el-button>
21
+ <el-button @click="setLegacyMultiFlatmap()" size="small">Set Legacy MultiFlatmap</el-button>
22
+ <el-button @click="setScaffold()" size="small">Set To Scaffold</el-button>
23
+ <el-button @click="setFlatmap()" size="small">Set Flatmap</el-button>
24
+ <el-button @click="setSearch()" size="small">Set Search</el-button>
25
+ </el-row>
26
+ </div>
27
+ <template #reference>
28
+
29
+ <el-button class="options-button" :icon="ElIconSetting">Options</el-button>
30
+
31
+ </template>
32
+ </el-popover>
33
+ </div>
34
+ <div class="map-app">
35
+ <MapContent ref="map" :startingMap="startingMap" :options="options" :state="state" :shareLink="shareLink" @updateShareLinkRequested="updateUUID" @isReady="mapIsReady"/>
36
+ </div>
37
+ </div>
38
+ </template>
39
+
40
+ <script>
41
+ /* eslint-disable no-alert, no-console */
42
+ import { shallowRef } from 'vue';
43
+ import MapContent from './components/MapContent.vue';
44
+ import { Setting as ElIconSetting } from '@element-plus/icons-vue'
45
+ import {
46
+ ElButton as Button,
47
+ ElCol as Col,
48
+ ElPopover as Popover,
49
+ ElRow as Row,
50
+ } from 'element-plus';
51
+
52
+ export default {
53
+ name: 'app',
54
+ components: {
55
+ Button,
56
+ Col,
57
+ Popover,
58
+ Row,
59
+ MapContent,
60
+ },
61
+ data: function() {
62
+ return {
63
+ uuid: undefined,
64
+ state: undefined,
65
+ prefix: "/map",
66
+ api: import.meta.env.VITE_API_LOCATION,
67
+ mapSettings: [],
68
+ startingMap: "AC",
69
+ ElIconSetting: shallowRef(ElIconSetting)
70
+ }
71
+ },
72
+ computed: {
73
+ shareLink: function() {
74
+ if (this.uuid)
75
+ return this.prefix +"?id=" + this.uuid;
76
+ return this.prefix;
77
+ },
78
+ options: function() {
79
+ return {
80
+ sparcApi: import.meta.env.VITE_API_LOCATION,
81
+ algoliaIndex: import.meta.env.VITE_ALGOLIA_INDEX,
82
+ algoliaKey: import.meta.env.VITE_ALGOLIA_KEY,
83
+ algoliaId: import.meta.env.VITE_ALGOLIA_ID,
84
+ pennsieveApi: import.meta.env.VITE_PENNSIEVE_API_LOCATION,
85
+ flatmapAPI: import.meta.env.VITE_FLATMAPAPI_LOCATION,
86
+ nlLinkPrefix: import.meta.env.VITE_NL_LINK_PREFIX,
87
+ rootUrl: import.meta.env.VITE_ROOT_URL,
88
+ }
89
+ }
90
+ },
91
+ methods: {
92
+ saveSettings: function() {
93
+ this.mapSettings.push(this.$refs.map.getState());
94
+ },
95
+ restoreSettings: function() {
96
+ if (this.mapSettings.length > 0)
97
+ this.$refs.map.setState(this.mapSettings.pop());
98
+ },
99
+ updateUUID: function() {
100
+ let xmlhttp = new XMLHttpRequest();
101
+ let url = this.api + 'map/getshareid';
102
+ let state = this.$refs.map.getState();
103
+ xmlhttp.open('POST', url, true);
104
+ //Send the proper header information along with the request
105
+ xmlhttp.setRequestHeader('Content-type', 'application/json');
106
+ xmlhttp.onreadystatechange = () => {//Call a function when the state changes.
107
+ if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
108
+ let state = JSON.parse(xmlhttp.responseText);
109
+ this.uuid = state.uuid;
110
+ }
111
+ }
112
+ xmlhttp.send(JSON.stringify({"state": state}));
113
+
114
+ },
115
+ setFlatmap: function() {
116
+ this.$refs.map.setCurrentEntry(
117
+ {
118
+ type: "Flatmap",
119
+ resource: "FunctionalConnectivity",
120
+ label: "Functional"
121
+ }
122
+ );
123
+ },
124
+ setLegacyMultiFlatmap: function() {
125
+ this.$refs.map.setCurrentEntry(
126
+ {
127
+ type: "MultiFlatmap",
128
+ taxo: "NCBITaxon:10114",
129
+ uuid: "01fedbf9-d783-509c-a10c-827941ab13da",
130
+ }
131
+ );
132
+ },
133
+ setMultiFlatmap: function() {
134
+ this.$refs.map.setCurrentEntry(
135
+ {
136
+ type: "MultiFlatmap",
137
+ taxo: "NCBITaxon:9606",
138
+ biologicalSex: "PATO:0000384",
139
+ //organ: "heart"
140
+ organ: "UBERON:0018675"
141
+ }
142
+ );
143
+ },
144
+ setScaffold: function() {
145
+ this.$refs.map.setCurrentEntry(
146
+ {
147
+ type: "Scaffold",
148
+ label: "Colon",
149
+ url: "https://mapcore-demo.org/current/sparc-api-v2/s3-resource/221/3/files/derivative/Scaffolds/mouse_colon_metadata.json",
150
+ viewUrl: "M16_view.json"
151
+ }
152
+ );
153
+ },
154
+ setSearch: function() {
155
+ this.$refs.map.openSearch([], "10.26275/1uno-tynt");
156
+ },
157
+ mapIsReady: function() {
158
+ console.log("map is ready")
159
+ },
160
+ parseQuery: function () {
161
+ this.$router.isReady().then(() => {
162
+ this.uuid = this.$route.query.id;
163
+ if (window) {
164
+ this.prefix = window.location.origin + window.location.pathname;
165
+ }
166
+ if (this.uuid) {
167
+ let xmlhttp = new XMLHttpRequest();
168
+ let url = this.api + 'map/getstate';
169
+ xmlhttp.open('POST', url, true);
170
+ //Send the proper header information along with the request
171
+ xmlhttp.setRequestHeader('Content-type', 'application/json');
172
+ xmlhttp.onreadystatechange = () => {//Call a function when the state changes.
173
+ if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
174
+ let state = JSON.parse(xmlhttp.responseText);
175
+ this.state = state.state;
176
+ }
177
+ }
178
+ xmlhttp.send(JSON.stringify({"uuid": this.uuid}));
179
+ }
180
+ })
181
+ },
182
+ },
183
+ mounted: function() {
184
+ this.parseQuery();
185
+ },
186
+ }
187
+ </script>
188
+
189
+ <style lang="scss">
190
+ #app {
191
+ height:100%;
192
+ width: 100%;
193
+ position:absolute;
194
+ font-family: "Asap",sans-serif;
195
+ --el-color-primary: #8300BF;
196
+ --el-color-primary-light-7: #dab3ec;
197
+ --el-color-primary-light-8: #e6ccf2;
198
+ --el-color-primary-light-9: #f3e6f9;
199
+ }
200
+
201
+ body {
202
+ margin: 0px;
203
+ }
204
+
205
+ .map-app {
206
+ position:absolute;
207
+ height: calc(100% - 104px);
208
+ width:calc(100% - 54px);
209
+ margin-top:20px;
210
+ margin-left:26px;
211
+ margin-right:26px;
212
+ border: solid 1px #dcdfe6;
213
+ box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.06);
214
+ }
215
+
216
+ .popover{
217
+ top:10px;
218
+ right:50%;
219
+ position:absolute;
220
+ z-index:1000;
221
+ }
222
+
223
+ .row {
224
+ margin-bottom: 5px;
225
+ &:last-child {
226
+ margin-bottom: 0;
227
+ }
228
+ }
229
+
230
+ .button-container {
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: center;
234
+ height:50px;
235
+ }
236
+
237
+
238
+ .options-container{
239
+ text-align: center;
240
+ }
241
+
242
+ .map-icon {
243
+ color: $app-primary-color!important;
244
+ }
245
+ </style>
@@ -1,43 +1,43 @@
1
- // Primary colors
2
- $purple: #8300BF;
3
- $darkBlue: #24245B;
4
- $grey: #303133;
5
-
6
- // Secondary colors
7
- $lightPurple: #BC00FC;
8
- $blue: #0026FF;
9
-
10
- // Status colors
11
- $success: #5e9f69;
12
- $warning: #FF8400;
13
- $danger: #b51d09;
14
-
15
- // Text colors
16
- $neutralGrey: #616161;
17
- $mediumGrey: #606266;
18
- $lightGrey: #909399;
19
-
20
- // Line colors
21
- $lineColor1: #DCDFE6;
22
- $lineColor2: #E4E7ED;
23
-
24
- // Background colors
25
- $background: #F5F7FA;
26
- $cochlear: #FFFFFF;
27
-
28
- //Search box colors
29
- $darkGrey: #606266;
30
-
31
- $app-primary-color: $purple !default;
32
- $app-secondary-color: $darkBlue !default;
33
- $text-color: $grey !default;
34
- $input-text: $grey !default;
35
-
36
- $system-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important;
37
- $font-family: 'Asap', sans-serif;
38
-
39
- // Viewport Sizes
40
- $viewport-sm: 20rem;
41
- $viewport-md: 47rem;
42
- $viewport-lg: 64rem;
43
- $viewport-xlg: 120rem;
1
+ // Primary colors
2
+ $purple: #8300BF;
3
+ $darkBlue: #24245B;
4
+ $grey: #303133;
5
+
6
+ // Secondary colors
7
+ $lightPurple: #BC00FC;
8
+ $blue: #0026FF;
9
+
10
+ // Status colors
11
+ $success: #5e9f69;
12
+ $warning: #FF8400;
13
+ $danger: #b51d09;
14
+
15
+ // Text colors
16
+ $neutralGrey: #616161;
17
+ $mediumGrey: #606266;
18
+ $lightGrey: #909399;
19
+
20
+ // Line colors
21
+ $lineColor1: #DCDFE6;
22
+ $lineColor2: #E4E7ED;
23
+
24
+ // Background colors
25
+ $background: #F5F7FA;
26
+ $cochlear: #FFFFFF;
27
+
28
+ //Search box colors
29
+ $darkGrey: #606266;
30
+
31
+ $app-primary-color: $purple !default;
32
+ $app-secondary-color: $darkBlue !default;
33
+ $text-color: $grey !default;
34
+ $input-text: $grey !default;
35
+
36
+ $system-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important;
37
+ $font-family: 'Asap', sans-serif;
38
+
39
+ // Viewport Sizes
40
+ $viewport-sm: 20rem;
41
+ $viewport-md: 47rem;
42
+ $viewport-lg: 64rem;
43
+ $viewport-xlg: 120rem;
File without changes
File without changes
File without changes