fcad-core-dragon 2.0.0-beta.1 → 2.0.0-beta.3

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 (118) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/{.eslintrc.js → .eslintrc.cjs} +81 -86
  4. package/CHANGELOG +364 -364
  5. package/README.md +71 -71
  6. package/bk.scss +117 -0
  7. package/package.json +61 -63
  8. package/src/$locales/en.json +143 -179
  9. package/src/$locales/fr.json +105 -181
  10. package/src/assets/data/onboardingMessages.json +47 -47
  11. package/src/components/AppBase.vue +1054 -614
  12. package/src/components/AppBaseButton.vue +87 -63
  13. package/src/components/AppBaseErrorDisplay.vue +438 -420
  14. package/src/components/AppBaseFlipCard.vue +84 -83
  15. package/src/components/AppBaseModule.vue +1673 -1842
  16. package/src/components/AppBasePage.vue +779 -312
  17. package/src/components/AppBasePopover.vue +41 -0
  18. package/src/components/AppCompAudio.vue +234 -0
  19. package/src/components/AppCompBranchButtons.vue +552 -582
  20. package/src/components/AppCompButtonProgress.vue +126 -147
  21. package/src/components/AppCompCarousel.vue +298 -192
  22. package/src/components/AppCompInputCheckBoxNext.vue +195 -0
  23. package/src/components/AppCompInputDropdownNext.vue +159 -0
  24. package/src/components/AppCompInputRadioNext.vue +152 -0
  25. package/src/components/{AppCompInputTextBox.vue → AppCompInputTextNext.vue} +106 -91
  26. package/src/components/AppCompInputTextTableNext.vue +141 -0
  27. package/src/components/AppCompInputTextToFillDropdownNext.vue +230 -0
  28. package/src/components/{AppCompInputTextToFillText.vue → AppCompInputTextToFillNext.vue} +171 -164
  29. package/src/components/AppCompJauge.vue +74 -55
  30. package/src/components/AppCompMenu.vue +413 -209
  31. package/src/components/AppCompMenuItem.vue +228 -174
  32. package/src/components/AppCompNavigation.vue +960 -949
  33. package/src/components/AppCompNoteCall.vue +133 -126
  34. package/src/components/AppCompNoteCredit.vue +292 -164
  35. package/src/components/AppCompPlayBar.vue +1218 -1319
  36. package/src/components/AppCompPlayBarNext.vue +2052 -0
  37. package/src/components/AppCompPlayBarProgress.vue +82 -0
  38. package/src/components/AppCompPopUpNext.vue +503 -0
  39. package/src/components/{AppCompQuiz.vue → AppCompQuizNext.vue} +2904 -2989
  40. package/src/components/AppCompQuizRecall.vue +276 -250
  41. package/src/components/AppCompSVGNext.vue +347 -0
  42. package/src/components/AppCompSettingsMenu.vue +172 -171
  43. package/src/components/AppCompTableOfContent.vue +387 -264
  44. package/src/components/AppCompTranscript.vue +24 -19
  45. package/src/components/AppCompVideoPlayer.vue +368 -336
  46. package/src/components/AppCompViewDisplay.vue +6 -6
  47. package/src/components/BaseModule.vue +72 -67
  48. package/src/composables/useQuiz.js +206 -0
  49. package/src/externalComps/ModuleView.vue +22 -0
  50. package/src/externalComps/SummaryView.vue +91 -0
  51. package/src/main.js +272 -227
  52. package/src/mixins/$mediaMixins.js +819 -0
  53. package/src/mixins/timerMixin.js +155 -156
  54. package/src/module/stores/appStore.js +893 -0
  55. package/src/module/xapi/ADL.js +376 -339
  56. package/src/module/xapi/Crypto/Hasher.js +241 -241
  57. package/src/module/xapi/Crypto/WordArray.js +278 -278
  58. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  59. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -319
  60. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  61. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  62. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  63. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  64. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  65. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  66. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  67. package/src/module/xapi/Crypto/index.js +53 -53
  68. package/src/module/xapi/Statement/activity.js +47 -47
  69. package/src/module/xapi/Statement/agent.js +55 -55
  70. package/src/module/xapi/Statement/group.js +26 -26
  71. package/src/module/xapi/Statement/index.js +259 -259
  72. package/src/module/xapi/Statement/statement.js +253 -253
  73. package/src/module/xapi/Statement/statementRef.js +23 -23
  74. package/src/module/xapi/Statement/substatement.js +22 -22
  75. package/src/module/xapi/Statement/verb.js +36 -36
  76. package/src/module/xapi/activitytypes.js +17 -17
  77. package/src/module/xapi/launch.js +157 -157
  78. package/src/module/xapi/utils.js +167 -167
  79. package/src/module/xapi/verbs.js +294 -294
  80. package/src/module/xapi/wrapper.js +1963 -1890
  81. package/src/module/xapi/xapiStatement.js +444 -444
  82. package/src/plugins/bus.js +8 -3
  83. package/src/plugins/gsap.js +14 -17
  84. package/src/plugins/helper.js +308 -295
  85. package/src/plugins/i18n.js +44 -31
  86. package/src/plugins/idb.js +219 -212
  87. package/src/plugins/save.js +37 -37
  88. package/src/plugins/scorm.js +287 -287
  89. package/src/plugins/xapi.js +11 -11
  90. package/src/public/index.html +33 -21
  91. package/src/router/index.js +43 -41
  92. package/src/router/routes.js +312 -337
  93. package/src/shared/generalfuncs.js +210 -188
  94. package/src/shared/validators.js +1069 -249
  95. package/vite.config.js +27 -0
  96. package/.prettierrc.js +0 -5
  97. package/babel.config.js +0 -3
  98. package/src/components/AppBaseDragChoice.vue +0 -91
  99. package/src/components/AppBaseDropZone.vue +0 -112
  100. package/src/components/AppCompBif.vue +0 -120
  101. package/src/components/AppCompDragAndDrop.vue +0 -339
  102. package/src/components/AppCompInputAssociation.vue +0 -332
  103. package/src/components/AppCompInputCheckBox.vue +0 -227
  104. package/src/components/AppCompInputDropdown.vue +0 -184
  105. package/src/components/AppCompInputRadio.vue +0 -169
  106. package/src/components/AppCompInputTextTable.vue +0 -155
  107. package/src/components/AppCompInputTextToFillDropdown.vue +0 -255
  108. package/src/components/AppCompMediaPlayer.vue +0 -397
  109. package/src/components/AppCompPopUp.vue +0 -522
  110. package/src/components/AppCompPopover.vue +0 -27
  111. package/src/components/AppCompSVG.vue +0 -309
  112. package/src/mixins/$pageMixins.js +0 -459
  113. package/src/mixins/$quizMixins.js +0 -456
  114. package/src/module/store.js +0 -895
  115. package/src/plugins/timeManager.js +0 -77
  116. package/src/routes_bckp.js +0 -313
  117. package/src/routes_static.js +0 -344
  118. package/vue.config.js +0 -83
@@ -1,209 +1,413 @@
1
- <!--
2
- @ Description: This component is used to create the menu and the ard that will bring you back where you were before the menu.
3
- @ What it does: Look in the store what was the last page you saw before you came to the menu and create the the link for the card. It display's AppCompMenuItem
4
- -->
5
- <template>
6
- <div class="menu-container">
7
- <b-row align-v="center" align-h="center">
8
- <b-col md="10" class="wrapper-lasRoute">
9
- <div class="box-menu">
10
- <h1>{{ getLessonid }}</h1>
11
- <h2 v-html="getLessonTitle"></h2>
12
- <p class="lesson-progess">{{ lessonProg() }}</p>
13
- <b-link
14
- id="btn_last_route"
15
- class="nav_last_route"
16
- :title="handelLabel"
17
- :to="{ name: GoToLastRoute() }"
18
- >
19
- {{ handelLabel }}
20
- </b-link>
21
- </div>
22
- </b-col>
23
- <b-col
24
- md="10"
25
- class="wrapper-MenuItem"
26
- title="table of content for this lesson"
27
- >
28
- <h3>{{ $t('text.activity_title') }}</h3>
29
-
30
- <app-comp-menu-item></app-comp-menu-item>
31
- </b-col>
32
- </b-row>
33
- </div>
34
- </template>
35
- <script>
36
- // ...
37
- import { mapGetters } from 'vuex'
38
-
39
- export default {
40
- name: 'AppCompMenu',
41
- data() {
42
- return {
43
- totalAttempts: 0
44
- }
45
- },
46
- computed: {
47
- ...mapGetters([
48
- 'getRouteHistory',
49
- 'getAllActivitiesState',
50
- 'getAllCompleted',
51
- 'getModuleInfo',
52
- 'getMenuSettings',
53
- 'getAllCompleted'
54
- ]),
55
- handelLabel() {
56
- let label = ''
57
- const { allActivitiesState, allCompleted } = this.progressWithMenu()
58
-
59
- let activity = Object.values(allActivitiesState)
60
- let completeActivity = Object.values(allCompleted)
61
-
62
- if (this.noProgress(activity)) {
63
- label = this.$t('button.menu_item.start')
64
- } else {
65
- if (activity.length == completeActivity.length) {
66
- label = this.$t('button.menu_item.end')
67
- } else {
68
- label = this.$t('button.menu_item.middle')
69
- }
70
- }
71
- return label
72
- },
73
- getLessonid() {
74
- // ATTENDRE UX*UI poure voir si on garde le concept ou pas
75
- let lessonLabel = this.$t('text.lesson')
76
- let lessonId = 99
77
- return `${lessonLabel} ${lessonId}`
78
- },
79
- getLessonTitle() {
80
- let lessonT
81
- if (this.getMenuSettings.lessonTitle) {
82
- lessonT = this.getMenuSettings.lessonTitle
83
- } else {
84
- lessonT = 'Entrer un titre à votre dans menu setting svp.'
85
- }
86
- return `${lessonT}`
87
- }
88
- },
89
- created() {},
90
- beforeDestroy() {},
91
- methods: {
92
- GoToLastRoute() {
93
- let lastRoute
94
- let path
95
-
96
- //Get all activity state (menu not included)
97
- const { allActivitiesState } = this.progressWithMenu()
98
- let state = Object.values(allActivitiesState)
99
-
100
- if (this.getRouteHistory.length) {
101
- if (this.getRouteHistory.length == 1) {
102
- lastRoute = this.getRouteHistory[0]
103
- } else {
104
- lastRoute = this.getRouteHistory[this.getRouteHistory.length - 1]
105
- }
106
- }
107
-
108
- //if course was not started bring you to the introduction
109
- if (this.noProgress(state)) {
110
- path = 'introduction'
111
- return path
112
- }
113
-
114
- // create path from the last you saw
115
- if (lastRoute) path = this.createdRoute(lastRoute)
116
- return path
117
- },
118
-
119
- noProgress(obj) {
120
- //validator to see if anything was seen before
121
- for (let i = 0; i < obj.length; i++) {
122
- if (obj[i].progressions.length != 0) return false //something was seen
123
- }
124
- return true //nothing was seen
125
- },
126
- createdRoute(objRoute) {
127
- // create link for activity
128
- let newRoute = objRoute
129
- let activity
130
- let page
131
- let path
132
-
133
- const typesToCatch = ['menu', 'introduction', 'conclusion']
134
- //Define activity
135
- if (typesToCatch.includes(newRoute.type)) {
136
- activity = newRoute.type
137
- } else {
138
- activity =
139
- newRoute.activity_ref.charAt(1) == '0'
140
- ? `activite_${newRoute.activity_ref.substring(2)}`
141
- : `activite_${newRoute.activity_ref.substring(1)}`
142
- }
143
-
144
- //Define page
145
- const idToIgnore = ['P01', 'pg_menu']
146
- page = idToIgnore.includes(newRoute.id) ? ' ' : newRoute.id.substring(2)
147
-
148
- //Define path
149
- path = page !== ' ' ? `${activity}.page_${page}` : activity
150
-
151
- return path
152
- },
153
- progressWithMenu() {
154
- /*
155
- * Note:
156
- * Assaging by reference would change the property of the getters when the valued are changed in the new object in. * To prevent this behaviour we will make a deep copy of the getter
157
- * cf: https://reactgo.com/javascript-clone-object/
158
- */
159
-
160
- const allActivitiesState = JSON.parse(
161
- JSON.stringify(this.getAllActivitiesState)
162
- )
163
-
164
- const allCompleted = JSON.parse(JSON.stringify(this.getAllCompleted))
165
-
166
- for (let activity in allActivitiesState) {
167
- if (
168
- activity === 'A00' &&
169
- allActivitiesState[activity] &&
170
- allCompleted[activity]
171
- ) {
172
- let completedIntro = allCompleted[activity]
173
-
174
- if (!completedIntro.length) completedIntro = []
175
-
176
- allCompleted[activity] = completedIntro
177
- }
178
- }
179
-
180
- return {
181
- allActivitiesState,
182
- allCompleted
183
- }
184
- },
185
- lessonProg() {
186
- let lstActivity = Object.keys(this.getAllActivitiesState)
187
- let progress = null
188
- let info = this.progressWithMenu()
189
- let page = null
190
- let pageCmplt = null
191
-
192
- lstActivity.forEach((element) => {
193
- //Get the total of all the page
194
- page += info.allActivitiesState[element].size
195
-
196
- if (info.allCompleted[element]) {
197
- // GEt all page complete
198
- pageCmplt += Object.values(info.allCompleted[element]).length
199
- }
200
- })
201
-
202
- // Create pourcentage complete
203
- progress = Math.round((pageCmplt * 100) / page)
204
-
205
- return `${progress}%`
206
- }
207
- }
208
- }
209
- </script>
1
+ <!--
2
+ @ Description: This component is used to create the menu and the ard that will bring you back where you were before the menu.
3
+ @ What it does: Look in the store what was the last page you saw before you came to the menu and create the the link for the card. It display's AppCompMenuItem
4
+ -->
5
+ <template>
6
+ <div class="menu-container">
7
+ <div
8
+ id="page_info_section"
9
+ aria-labelledby="page_info"
10
+ aria-live="true"
11
+ ></div>
12
+ <a
13
+ class="skip-link"
14
+ href=""
15
+ @click.prevent="$bus.$emit('move-to-target', 'menu-main')"
16
+ >
17
+ {{ $t('message.skip_content') }}
18
+ </a>
19
+ <div class="contain-lr">
20
+ <div class="wrapper-lasRoute">
21
+ <div class="box-menu">
22
+ <h1>{{ getLessonid }}</h1>
23
+ <h2 v-html="getLessonTitle"></h2>
24
+
25
+ <p class="lesson-progess">
26
+ {{ $t('message.progress_card') }} {{ lessonProg() }}
27
+ </p>
28
+ <router-link
29
+ id="btn_last_route"
30
+ class="nav_last_route btn-main"
31
+ :title="handelLabel"
32
+ :to="{ name: GoToLastRoute() }"
33
+ data-test="menu-back-btn"
34
+ >
35
+ {{ handelLabel }}
36
+ </router-link>
37
+ </div>
38
+ </div>
39
+ <v-row justify="center" align="center" class="r-menu">
40
+ <v-col id="menu-main" md="10" class="wrapper-MenuItem">
41
+ <h3>{{ $t('text.activity_title') }}</h3>
42
+
43
+ <app-comp-menu-item></app-comp-menu-item>
44
+ </v-col>
45
+ </v-row>
46
+ </div>
47
+ <v-row justify="center" align="center">
48
+ <v-col md="7">
49
+ <div v-show="appDebugMode" id="_debug-area">
50
+ <h5>Mode de débogage activé</h5>
51
+ <p>
52
+ Cliquez sur le bouton pour réinitialiser toutes les données de ce
53
+ paquet.
54
+ </p>
55
+
56
+ <app-base-button
57
+ :id="`btn-quiz`"
58
+ class="btn lk-btn"
59
+ :is-active="resetStatus !== false"
60
+ @click="askResetUserData"
61
+ >
62
+ Réinitialiser la leçon
63
+ </app-base-button>
64
+ <div v-show="resetStatus !== false" id="resetOverlay">
65
+ <div
66
+ v-show="resetStatus === resetState.LOADING"
67
+ class="lds-ellipsis"
68
+ >
69
+ <div></div>
70
+ <div></div>
71
+ <div></div>
72
+ <div></div>
73
+ </div>
74
+ <span v-show="resetStatus === resetState.COMPLETE" id="reset_label">
75
+ Opération réussie!
76
+ </span>
77
+ </div>
78
+ </div>
79
+ </v-col>
80
+ </v-row>
81
+ <div id="page_info" class="sr-only" aria-hidden="true">
82
+ {{ $t('text.title_content_view') }}
83
+ </div>
84
+ </div>
85
+ </template>
86
+ <script>
87
+ // ...
88
+ import { mapState } from 'pinia'
89
+ import { useAppStore } from '../module/stores/appStore'
90
+ export default {
91
+ name: 'AppCompMenu',
92
+ data() {
93
+ return {
94
+ totalAttempts: 0,
95
+ resetStatus: false,
96
+ resetState: { LOADING: 'LOADING', COMPLETE: 'COMPLETE' }
97
+ }
98
+ },
99
+
100
+ computed: {
101
+ ...mapState(useAppStore, [
102
+ 'getRouteHistory',
103
+ 'getAllActivitiesState',
104
+ 'getAllCompleted',
105
+ 'getModuleInfo',
106
+ 'getMenuSettings',
107
+ 'getAppDebugMode',
108
+ 'getAllCompleted'
109
+ ]),
110
+ appDebugMode() {
111
+ return this.getAppDebugMode
112
+ },
113
+ handelLabel() {
114
+ let label = ''
115
+ const { allActivitiesState, allCompleted } = this.progressWithMenu()
116
+
117
+ let activity = Object.values(allActivitiesState)
118
+ let completeActivity = Object.values(allCompleted)
119
+
120
+ if (this.noProgress(activity)) {
121
+ label = this.$t('button.menu_item.start')
122
+ } else {
123
+ if (activity.length == completeActivity.length) {
124
+ label = this.$t('button.menu_item.end')
125
+ } else {
126
+ label = this.$t('button.menu_item.end')
127
+ }
128
+ }
129
+ return label
130
+ },
131
+ getLessonid() {
132
+ // ATTENDRE UX*UI poure voir si on garde le concept ou pas
133
+ let lessonLabel = this.$t('text.lesson')
134
+ let lessonId = 99
135
+ return `${lessonLabel} ${lessonId}`
136
+ },
137
+ getLessonTitle() {
138
+ let lessonT
139
+ if (this.getMenuSettings.lessonTitle) {
140
+ lessonT = this.getMenuSettings.lessonTitle
141
+ } else {
142
+ lessonT = 'Entrer un titre à pour votre leçon dans menu setting svp.'
143
+ }
144
+ return `${lessonT}`
145
+ }
146
+ },
147
+ mounted() {
148
+ setTimeout(() => {
149
+ this.$bus.$emit('move-to-target', 'page_info_section')
150
+ }, 200)
151
+ },
152
+ beforeUnmount() {
153
+ this.$bus.$off('reset-complete', this.onResetComplete)
154
+ },
155
+ methods: {
156
+ //When server responds after a reset request
157
+ onResetComplete() {
158
+ this.$bus.$off('reset-complete', this.onResetComplete)
159
+ //show Operation reussie! for 2 seconds then exit debugmode
160
+ this.resetStatus = this.resetState.COMPLETE
161
+ setTimeout(() => {
162
+ window.setDebugMode(false)
163
+ if (this.resetStatus) {
164
+ this.resetStatus = false
165
+ }
166
+ }, 2000)
167
+ },
168
+ GoToLastRoute() {
169
+ let lastRoute
170
+ let path
171
+
172
+ //Get all activity state (menu not included)
173
+ const { allActivitiesState } = this.progressWithMenu()
174
+ let state = Object.values(allActivitiesState)
175
+
176
+ if (this.getRouteHistory.length) {
177
+ if (this.getRouteHistory.length == 1) {
178
+ lastRoute = this.getRouteHistory[0]
179
+ } else {
180
+ lastRoute = this.getRouteHistory[this.getRouteHistory.length - 1]
181
+ }
182
+ }
183
+
184
+ //if course was not started bring you to the introduction
185
+ if (this.noProgress(state)) {
186
+ path = 'introduction'
187
+ return path
188
+ }
189
+ // create path from the last you saw
190
+ if (lastRoute) path = this.createdRoute(lastRoute)
191
+
192
+ return path
193
+ },
194
+
195
+ noProgress(obj) {
196
+ //validator to see if anything was seen before
197
+ for (let i = 0; i < obj.length; i++) {
198
+ if (obj[i].progressions.length != 0) return false //something was seen
199
+ }
200
+ return true //nothing was seen
201
+ },
202
+ createdRoute(objRoute) {
203
+ // create link for activity
204
+ let newRoute = objRoute
205
+ let activity
206
+ let page
207
+ let path
208
+
209
+ const typesToCatch = ['menu', 'introduction', 'conclusion']
210
+ //Define activity
211
+ if (typesToCatch.includes(newRoute.type)) {
212
+ activity = newRoute.type
213
+ } else {
214
+ activity =
215
+ newRoute.activity_ref.charAt(1) == '0'
216
+ ? `activite_${newRoute.activity_ref.substring(2)}`
217
+ : `activite_${newRoute.activity_ref.substring(1)}`
218
+ }
219
+
220
+ //Define page
221
+ const idToIgnore = ['P01', 'pg_menu']
222
+ page = idToIgnore.includes(newRoute.id) ? ' ' : newRoute.id.substring(2)
223
+
224
+ //Define path
225
+ path = page !== ' ' ? `${activity}.page_${page}` : activity
226
+
227
+ return path
228
+ },
229
+ progressWithMenu() {
230
+ /*
231
+ * Note:
232
+ * Assaging by reference would change the property of the getters when the valued are changed in the new object in. * To prevent this behaviour we will make a deep copy of the getter
233
+ * cf: https://reactgo.com/javascript-clone-object/
234
+ */
235
+
236
+ const allActivitiesState = JSON.parse(
237
+ JSON.stringify(this.getAllActivitiesState)
238
+ )
239
+
240
+ const allCompleted = JSON.parse(JSON.stringify(this.getAllCompleted))
241
+
242
+ for (let activity in allActivitiesState) {
243
+ if (
244
+ activity === 'A00' &&
245
+ allActivitiesState[activity] &&
246
+ allCompleted[activity]
247
+ ) {
248
+ let completedIntro = allCompleted[activity]
249
+
250
+ if (!completedIntro.length) completedIntro = []
251
+
252
+ allCompleted[activity] = completedIntro
253
+ }
254
+ }
255
+
256
+ return {
257
+ allActivitiesState,
258
+ allCompleted
259
+ }
260
+ },
261
+ lessonProg() {
262
+ let lstActivity = Object.keys(this.getAllActivitiesState)
263
+ let progress = null
264
+ let info = this.progressWithMenu()
265
+ let page = null
266
+ let pageCmplt = null
267
+
268
+ lstActivity.forEach((element) => {
269
+ //Get the total of all the page
270
+ page += info.allActivitiesState[element].size
271
+
272
+ if (info.allCompleted[element]) {
273
+ // GEt all page complete
274
+ pageCmplt += Object.values(info.allCompleted[element]).length
275
+ }
276
+ })
277
+
278
+ // Create pourcentage complete
279
+ progress = Math.round((pageCmplt * 100) / page)
280
+
281
+ return `${progress}%`
282
+ },
283
+ askResetUserData() {
284
+ //show loader animation
285
+ this.resetStatus = this.resetState.LOADING
286
+ //callback on server response
287
+ this.$bus.$on('reset-complete', this.onResetComplete)
288
+ //launch reset call
289
+ this.$bus.$emit('reset-userdata')
290
+ }
291
+ }
292
+ }
293
+ </script>
294
+ <style lang="scss">
295
+ .contain-lr {
296
+ display: flex;
297
+ flex-direction: column;
298
+ flex-wrap: wrap;
299
+ width: 100%;
300
+
301
+ .wrapper-lasRoute {
302
+ display: flex;
303
+ justify-content: flex-end;
304
+
305
+ .nav_last_route {
306
+ display: inline-block;
307
+ }
308
+ }
309
+ }
310
+
311
+ .menu-container {
312
+ width: 100%;
313
+ height: 100%;
314
+
315
+ .r-menu {
316
+ margin: 0 0 0 0;
317
+ }
318
+ }
319
+
320
+ #_debug-area {
321
+ display: flex;
322
+ flex-direction: column;
323
+ align-items: center;
324
+ justify-content: center;
325
+ margin: 25px;
326
+ padding: 20px;
327
+ background-color: #eaabb685;
328
+ border-block: dotted yellow 5px;
329
+ p {
330
+ padding: 15px;
331
+ text-align: center;
332
+ font-size: 1em;
333
+ }
334
+ button {
335
+ background-color: #8dff95;
336
+ font-size: 1.3em;
337
+ }
338
+ #resetOverlay {
339
+ position: absolute;
340
+ display: flex;
341
+ flex-direction: column;
342
+ width: 33%;
343
+ height: 40%;
344
+ align-items: center;
345
+ justify-content: center;
346
+ background-color: rgba($color: #000000, $alpha: 0.9);
347
+ border-radius: 10px;
348
+ box-shadow: 2px 2px 4px 0px rgba($color: #000000, $alpha: 0.2);
349
+ }
350
+ #reset_label {
351
+ font-family: arial;
352
+ color: #fff;
353
+ font-weight: bold;
354
+ font-size: 18px;
355
+ }
356
+ .lds-ellipsis {
357
+ display: flex;
358
+ display: inline-block;
359
+ position: relative;
360
+ width: 80px;
361
+ height: 80px;
362
+ }
363
+ .lds-ellipsis div {
364
+ position: absolute;
365
+ top: 33px;
366
+ width: 13px;
367
+ height: 13px;
368
+ border-radius: 50%;
369
+ background: #fff;
370
+ animation-timing-function: cubic-bezier(0, 1, 1, 0);
371
+ }
372
+ .lds-ellipsis div:nth-child(1) {
373
+ left: 8px;
374
+ animation: lds-ellipsis1 0.6s infinite;
375
+ }
376
+ .lds-ellipsis div:nth-child(2) {
377
+ left: 8px;
378
+ animation: lds-ellipsis2 0.6s infinite;
379
+ }
380
+ .lds-ellipsis div:nth-child(3) {
381
+ left: 32px;
382
+ animation: lds-ellipsis2 0.6s infinite;
383
+ }
384
+ .lds-ellipsis div:nth-child(4) {
385
+ left: 56px;
386
+ animation: lds-ellipsis3 0.6s infinite;
387
+ }
388
+ @keyframes lds-ellipsis1 {
389
+ 0% {
390
+ transform: scale(0);
391
+ }
392
+ 100% {
393
+ transform: scale(1);
394
+ }
395
+ }
396
+ @keyframes lds-ellipsis3 {
397
+ 0% {
398
+ transform: scale(1);
399
+ }
400
+ 100% {
401
+ transform: scale(0);
402
+ }
403
+ }
404
+ @keyframes lds-ellipsis2 {
405
+ 0% {
406
+ transform: translate(0, 0);
407
+ }
408
+ 100% {
409
+ transform: translate(24px, 0);
410
+ }
411
+ }
412
+ }
413
+ </style>