fcad-core-dragon 2.1.1 → 2.1.2

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 (160) hide show
  1. package/.editorconfig +7 -7
  2. package/.gitlab-ci.yml +124 -0
  3. package/.prettierrc +11 -11
  4. package/.vscode/extensions.json +8 -8
  5. package/.vscode/settings.json +46 -16
  6. package/CHANGELOG +520 -520
  7. package/README.md +57 -57
  8. package/documentation/.vitepress/config.js +114 -114
  9. package/documentation/api-examples.md +49 -49
  10. package/documentation/composants/app-base-button.md +58 -58
  11. package/documentation/composants/app-base-error-display.md +59 -59
  12. package/documentation/composants/app-base-popover.md +68 -68
  13. package/documentation/composants/app-comp-audio.md +75 -75
  14. package/documentation/composants/app-comp-branch-buttons.md +111 -111
  15. package/documentation/composants/app-comp-button-progress.md +53 -53
  16. package/documentation/composants/app-comp-carousel.md +53 -53
  17. package/documentation/composants/app-comp-container.md +53 -53
  18. package/documentation/composants/app-comp-input-checkbox-next.md +42 -42
  19. package/documentation/composants/app-comp-input-dropdown-next.md +34 -34
  20. package/documentation/composants/app-comp-input-radio-next.md +39 -39
  21. package/documentation/composants/app-comp-input-text-next.md +35 -35
  22. package/documentation/composants/app-comp-input-text-table-next.md +34 -34
  23. package/documentation/composants/app-comp-input-text-to-fill-dropdown-next.md +53 -53
  24. package/documentation/composants/app-comp-input-text-to-fill-next.md +31 -31
  25. package/documentation/composants/app-comp-jauge.md +31 -31
  26. package/documentation/composants/app-comp-menu-item.md +55 -55
  27. package/documentation/composants/app-comp-menu.md +29 -29
  28. package/documentation/composants/app-comp-navigation.md +41 -41
  29. package/documentation/composants/app-comp-note-call.md +53 -53
  30. package/documentation/composants/app-comp-note-credit.md +53 -53
  31. package/documentation/composants/app-comp-play-bar-next.md +53 -53
  32. package/documentation/composants/app-comp-pop-up-next.md +93 -93
  33. package/documentation/composants/app-comp-quiz-next.md +235 -235
  34. package/documentation/composants/app-comp-quiz-recall.md +53 -53
  35. package/documentation/composants/app-comp-svg-next.md +53 -53
  36. package/documentation/composants/app-comp-table-of-content.md +50 -50
  37. package/documentation/composants/app-comp-video-player.md +82 -82
  38. package/documentation/composants.md +46 -46
  39. package/documentation/composants_critiques/ModelPageComposant.md +53 -53
  40. package/documentation/composants_critiques/app-base-module.md +43 -43
  41. package/documentation/composants_critiques/app-base-page.md +48 -48
  42. package/documentation/composants_critiques/app-base.md +311 -311
  43. package/documentation/composants_critiques/main.md +15 -15
  44. package/documentation/demarrage.md +50 -50
  45. package/documentation/deploiement.md +57 -57
  46. package/documentation/index.md +33 -33
  47. package/documentation/markdown-examples.md +85 -85
  48. package/documentation/public/vite.svg +14 -14
  49. package/documentation/public/vuejs.svg +1 -1
  50. package/documentation/public/vuetify.svg +5 -5
  51. package/eslint.config.js +60 -60
  52. package/junit-report.xml +182 -0
  53. package/package.json +66 -59
  54. package/playwright/index.html +12 -0
  55. package/playwright/index.js +21 -0
  56. package/playwright-ct.config.js +95 -0
  57. package/src/$locales/en.json +157 -157
  58. package/src/$locales/fr.json +120 -120
  59. package/src/assets/data/onboardingMessages.json +47 -47
  60. package/src/components/AppBase.vue +1171 -1169
  61. package/src/components/AppBaseButton.vue +90 -95
  62. package/src/components/AppBaseErrorDisplay.vue +438 -438
  63. package/src/components/AppBaseFlipCard.vue +84 -84
  64. package/src/components/AppBaseModule.vue +1639 -1634
  65. package/src/components/AppBasePage.vue +867 -866
  66. package/src/components/AppBasePopover.vue +41 -41
  67. package/src/components/AppBaseSkeleton.vue +66 -66
  68. package/src/components/AppCompAudio.vue +261 -256
  69. package/src/components/AppCompBranchButtons.vue +508 -508
  70. package/src/components/AppCompButtonProgress.vue +137 -132
  71. package/src/components/AppCompCarousel.vue +342 -336
  72. package/src/components/AppCompContainer.vue +29 -29
  73. package/src/components/AppCompInputCheckBoxNx.vue +325 -323
  74. package/src/components/AppCompInputDropdownNx.vue +302 -299
  75. package/src/components/AppCompInputRadioNx.vue +287 -284
  76. package/src/components/AppCompInputTextNx.vue +156 -153
  77. package/src/components/AppCompInputTextTableNx.vue +205 -202
  78. package/src/components/AppCompInputTextToFillDropdownNx.vue +343 -340
  79. package/src/components/AppCompInputTextToFillNx.vue +316 -313
  80. package/src/components/AppCompJauge.vue +81 -81
  81. package/src/components/AppCompMenu.vue +6 -1
  82. package/src/components/AppCompMenuItem.vue +246 -240
  83. package/src/components/AppCompNavigation.vue +977 -972
  84. package/src/components/AppCompNoteCall.vue +167 -161
  85. package/src/components/AppCompNoteCredit.vue +496 -491
  86. package/src/components/AppCompPlayBarNext.vue +2290 -2288
  87. package/src/components/AppCompPopUpNext.vue +508 -504
  88. package/src/components/AppCompQuizNext.vue +515 -510
  89. package/src/components/AppCompQuizRecall.vue +355 -350
  90. package/src/components/AppCompSVGNext.vue +346 -346
  91. package/src/components/AppCompSettingsMenu.vue +177 -172
  92. package/src/components/AppCompTableOfContent.vue +433 -427
  93. package/src/components/AppCompVideoPlayer.vue +377 -377
  94. package/src/components/AppCompViewDisplay.vue +6 -6
  95. package/src/components/BaseModule.vue +55 -55
  96. package/src/composables/useIdleDetector.js +56 -56
  97. package/src/composables/useQuiz.js +89 -89
  98. package/src/composables/useTimer.js +172 -172
  99. package/src/directives/nvdaFix.js +53 -53
  100. package/src/externalComps/ModuleView.vue +22 -22
  101. package/src/externalComps/SummaryView.vue +91 -91
  102. package/src/main.js +493 -476
  103. package/src/module/stores/appStore.js +960 -947
  104. package/src/module/xapi/ADL.js +520 -520
  105. package/src/module/xapi/Crypto/Hasher.js +241 -241
  106. package/src/module/xapi/Crypto/WordArray.js +278 -278
  107. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  108. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  109. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  110. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  111. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  112. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  113. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  114. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  115. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  116. package/src/module/xapi/Crypto/index.js +53 -53
  117. package/src/module/xapi/Statement/activity.js +47 -47
  118. package/src/module/xapi/Statement/agent.js +55 -55
  119. package/src/module/xapi/Statement/group.js +26 -26
  120. package/src/module/xapi/Statement/index.js +259 -259
  121. package/src/module/xapi/Statement/statement.js +253 -253
  122. package/src/module/xapi/Statement/statementRef.js +23 -23
  123. package/src/module/xapi/Statement/substatement.js +22 -22
  124. package/src/module/xapi/Statement/verb.js +36 -36
  125. package/src/module/xapi/activitytypes.js +17 -17
  126. package/src/module/xapi/launch.js +157 -157
  127. package/src/module/xapi/utils.js +167 -167
  128. package/src/module/xapi/verbs.js +294 -294
  129. package/src/module/xapi/wrapper.js +1895 -1895
  130. package/src/module/xapi/xapiStatement.js +444 -444
  131. package/src/plugins/analytics.js +34 -34
  132. package/src/plugins/bus.js +12 -8
  133. package/src/plugins/gsap.js +17 -17
  134. package/src/plugins/helper.js +355 -358
  135. package/src/plugins/i18n.js +27 -26
  136. package/src/plugins/idb.js +227 -227
  137. package/src/plugins/save.js +37 -37
  138. package/src/plugins/scorm.js +287 -287
  139. package/src/plugins/xapi.js +11 -11
  140. package/src/public/index.html +33 -33
  141. package/src/router/index.js +57 -57
  142. package/src/router/routes.js +312 -312
  143. package/src/shared/generalfuncs.js +344 -344
  144. package/src/shared/validators.js +1018 -1018
  145. package/tests/component/AppBaseButton.spec.js +53 -0
  146. package/tests/component/pinia.spec.js +24 -0
  147. package/{src/components/tests__ → tests/unit}/AppBaseButton.spec.js +53 -53
  148. package/tests/unit/AppCompInputCheckBoxNx.spec.js +59 -0
  149. package/tests/unit/AppCompInputDropdownNx.spec.js +51 -0
  150. package/tests/unit/AppCompInputRadioNx.spec.js +59 -0
  151. package/tests/unit/AppCompInputTextNx.spec.js +44 -0
  152. package/tests/unit/AppCompInputTextTableNx.spec.js +77 -0
  153. package/tests/unit/AppCompInputTextToFillDropdownNx.spec.js +60 -0
  154. package/tests/unit/AppCompInputTextToFillNx.spec.js +45 -0
  155. package/tests/unit/AppCompQuizNext.spec.js +114 -0
  156. package/tests/unit/AppCompVideoPlayer.spec.js +177 -0
  157. package/{src/components/tests__ → tests/unit}/useTimer.spec.js +91 -91
  158. package/vitest.config.js +28 -19
  159. package/vitest.setup.js +28 -0
  160. package/src/components/AppBaseButton.test.js +0 -21
@@ -1,240 +1,246 @@
1
- <!--
2
- @ Description: This component is used to display and create the link's to all the activity creation in module.
3
- @ What it does: Goes trougth all the activity in the router and create a card that open the Table of content (appCompTableOfContent) that display the anchor.Display the title and subtitle enter in menu.json. Must be used with AppCompTableOfContent and AppCompMenu.
4
- -->
5
- <template>
6
- <v-row v-if="activities.length" class="box-msa">
7
- <v-col
8
- v-for="activity of activities"
9
- :key="activity.id"
10
- cols="6"
11
- class="menu-section-activity"
12
- :aria-describedby="activity.id + '-subMenu'"
13
- >
14
- <router-link
15
- :id="activity.id + '-subMenu'"
16
- :title="activity.title"
17
- :data-test="`item-menu-${activity.id}`"
18
- class="btn-menu"
19
- :to="{
20
- name: createRoutes(activity.id)
21
- }"
22
- @click="startActivity(activity)"
23
- >
24
- <div class="menu-card" tag="article">
25
- <v-row>
26
- <div v-if="activity.subtitle === undefined" class="title">
27
- <h4 v-html="activity.title"></h4>
28
- </div>
29
- <div v-else class="title">
30
- <h4
31
- v-html="
32
- `${activity.title}${cardTitleSeparator}${activity.subtitle}`
33
- "
34
- ></h4>
35
- </div>
36
-
37
- <div class="cnt-time">
38
- <svg
39
- :aria-label="$t('label.timer')"
40
- aria-hidden="true"
41
- focusable="false"
42
- >
43
- <use href="#clock-icon" />
44
- </svg>
45
- <p class="time">{{ activity.time || '00:00' }}</p>
46
- </div>
47
- <div class="box-gauge">
48
- <app-comp-jauge
49
- :max-value="getActivitySize(activity.id)"
50
- :value="getPageComplete(activity.id)"
51
- />
52
- </div>
53
- </v-row>
54
- </div>
55
- </router-link>
56
- </v-col>
57
- </v-row>
58
- </template>
59
- <script>
60
- // ...
61
- import { mapState } from 'pinia'
62
- import { useAppStore } from '../module/stores/appStore'
63
- import AppCompJauge from './AppCompJauge.vue'
64
- export default {
65
- components: {
66
- AppCompJauge
67
- },
68
- computed: {
69
- ...mapState(useAppStore, [
70
- 'getAllActivities',
71
- 'getAllActivitiesState',
72
- 'getAllCompleted',
73
- 'getAppConfigs',
74
- 'getMenuSettings',
75
- 'getModuleInfo'
76
- ]),
77
- /*
78
- * Apply different punctuation for colons. No space before a colon in english, one space before a colon in french
79
- */
80
- cardTitleSeparator() {
81
- return this.getAppConfigs.lang.toLowerCase() == 'en' ? ': ' : ' : '
82
- },
83
- activities() {
84
- // get the data for list of the page for this module from the store and
85
- // get the route of the page from the router to build the menu with its routes
86
- let count = 0
87
- const collection = []
88
-
89
- this.getAllActivities().list.forEach((value, key) => {
90
- let theActivity,
91
- activityTitle,
92
- activitySubTitle,
93
- activityTime = null,
94
- activityPath = ''
95
-
96
- if (this.menuInfo[key]) {
97
- const { title, subTitle, time } = this.menuInfo[key] //get time subTitle time from menu info
98
- //set the title
99
- if (title && title != ' ') activityTitle = title
100
- //set the subtitle
101
- if (subTitle && subTitle != ' ') activitySubTitle = subTitle
102
- //set the time
103
- if (time && time != ' ') activityTime = time
104
- }
105
- // This is the Introduction
106
- if (key === 'A00') {
107
- activityTitle = activityTitle || this.$t('text.introduction')
108
- activityPath = 'introduction'
109
- } else if (key === 'A99') {
110
- activityTitle = activityTitle || this.$t('text.conclusion')
111
- activityPath = 'conclusion'
112
- } else {
113
- count++
114
- activityTitle =
115
- activityTitle || `${this.$t('text.activity')} ${count}`
116
- activityPath = `activite_${count}`
117
- }
118
-
119
- theActivity = {
120
- id: key,
121
- title: activityTitle,
122
- subtitle: activitySubTitle,
123
- time: activityTime,
124
- path: activityPath,
125
- data: value
126
- }
127
-
128
- collection.push(theActivity) // push the activity in the collection
129
- })
130
-
131
- return collection
132
- },
133
- menuInfo() {
134
- let menuInfo = this.getMenuSettings
135
- return menuInfo
136
- }
137
- },
138
- mounted() {},
139
- methods: {
140
- /**
141
- * @description Gives gives length of completed page for an activity
142
- * @param {String} idActivity
143
- * @returns {Number}
144
- */
145
- getPageComplete(idActivity) {
146
- /// give all the page that are complete to the gauge
147
- if (idActivity) {
148
- let completed = []
149
- if (this.getAllCompleted[idActivity]) {
150
- completed = this.getAllCompleted[idActivity] //get all completed page for the activity
151
- }
152
-
153
- return completed.length
154
- }
155
- },
156
- /**
157
- * @description give the size of the state of the activity
158
- * @param {String} activityID
159
- * @returns {Number} size
160
- */
161
- getActivitySize(activityID) {
162
- /*
163
- * Note:
164
- * 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
165
- * cf: https://reactgo.com/javascript-clone-object/
166
- */
167
-
168
- const allActivitiesState = JSON.parse(
169
- JSON.stringify(this.getAllActivitiesState)
170
- )
171
- let size = allActivitiesState[activityID]
172
- ? allActivitiesState[activityID].size
173
- : 0
174
-
175
- return size
176
- },
177
- createRoutes(data) {
178
- let activity
179
-
180
- if (data.charAt(1) == '0' || data.charAt(1) == 0) {
181
- activity = data.substr(2)
182
- } else {
183
- activity = data.substr(1)
184
- }
185
-
186
- if (activity == 0 && activity == '0') return `introduction`
187
- if (activity == '99') return `conclusion`
188
- else return `activite_${activity}`
189
- },
190
- startActivity(a) {
191
- //this.$bus.$emit('send-starting-event', a)
192
- }
193
- }
194
- }
195
- </script>
196
- <style lang="scss">
197
- .menu-card {
198
- width: 100%;
199
- padding: 24px;
200
-
201
- .v-row {
202
- margin: 0;
203
- flex-direction: column;
204
-
205
- .title {
206
- flex-grow: 4;
207
- width: 80%;
208
- margin-bottom: 30px;
209
-
210
- h3 {
211
- text-align: left;
212
- }
213
- }
214
-
215
- .cnt-time {
216
- display: flex;
217
- flex-direction: row;
218
- align-items: center;
219
- margin-bottom: 20px;
220
-
221
- svg {
222
- width: 18px;
223
- height: 18px;
224
- margin-right: 10px;
225
- }
226
- }
227
-
228
- .box-gauge {
229
- display: block;
230
- width: 100%;
231
-
232
- .box-g {
233
- display: flex;
234
- flex-direction: row;
235
- align-items: center;
236
- }
237
- }
238
- }
239
- }
240
- </style>
1
+ <!--
2
+ @ Description: This component is used to display and create the link's to all the activity creation in module.
3
+ @ What it does: Goes trougth all the activity in the router and create a card that open the Table of content (appCompTableOfContent) that display the anchor.Display the title and subtitle enter in menu.json. Must be used with AppCompTableOfContent and AppCompMenu.
4
+ -->
5
+ <template>
6
+ <v-row v-if="activities.length" class="box-msa">
7
+ <v-col
8
+ v-for="activity of activities"
9
+ :key="activity.id"
10
+ cols="6"
11
+ class="menu-section-activity"
12
+ :aria-describedby="activity.id + '-subMenu'"
13
+ >
14
+ <router-link
15
+ :id="activity.id + '-subMenu'"
16
+ :title="activity.title"
17
+ :data-test="`item-menu-${activity.id}`"
18
+ class="btn-menu"
19
+ :to="{
20
+ name: createRoutes(activity.id)
21
+ }"
22
+ @click="startActivity(activity)"
23
+ >
24
+ <div class="menu-card" tag="article">
25
+ <v-row>
26
+ <div v-if="activity.subtitle === undefined" class="title">
27
+ <h4 v-html="activity.title"></h4>
28
+ </div>
29
+ <div v-else class="title">
30
+ <h4
31
+ v-html="
32
+ `${activity.title}${cardTitleSeparator}${activity.subtitle}`
33
+ "
34
+ ></h4>
35
+ </div>
36
+
37
+ <div class="cnt-time">
38
+ <svg
39
+ :aria-label="$t('label.timer')"
40
+ aria-hidden="true"
41
+ focusable="false"
42
+ >
43
+ <use href="#clock-icon" />
44
+ </svg>
45
+ <p class="time">{{ activity.time || '00:00' }}</p>
46
+ </div>
47
+ <div class="box-gauge">
48
+ <app-comp-jauge
49
+ :max-value="getActivitySize(activity.id)"
50
+ :value="getPageComplete(activity.id)"
51
+ />
52
+ </div>
53
+ </v-row>
54
+ </div>
55
+ </router-link>
56
+ </v-col>
57
+ </v-row>
58
+ </template>
59
+ <script>
60
+ // ...
61
+ import { mapState } from 'pinia'
62
+ import { useAppStore } from '../module/stores/appStore'
63
+ import AppCompJauge from './AppCompJauge.vue'
64
+ import { useI18n } from 'vue-i18n'
65
+
66
+ export default {
67
+ components: {
68
+ AppCompJauge
69
+ },
70
+ setup() {
71
+ const { t } = useI18n()
72
+ return { t }
73
+ },
74
+ computed: {
75
+ ...mapState(useAppStore, [
76
+ 'getAllActivities',
77
+ 'getAllActivitiesState',
78
+ 'getAllCompleted',
79
+ 'getAppConfigs',
80
+ 'getMenuSettings',
81
+ 'getModuleInfo'
82
+ ]),
83
+ /*
84
+ * Apply different punctuation for colons. No space before a colon in english, one space before a colon in french
85
+ */
86
+ cardTitleSeparator() {
87
+ return this.getAppConfigs.lang.toLowerCase() == 'en' ? ': ' : ' : '
88
+ },
89
+ activities() {
90
+ // get the data for list of the page for this module from the store and
91
+ // get the route of the page from the router to build the menu with its routes
92
+ let count = 0
93
+ const collection = []
94
+
95
+ this.getAllActivities().list.forEach((value, key) => {
96
+ let theActivity,
97
+ activityTitle,
98
+ activitySubTitle,
99
+ activityTime = null,
100
+ activityPath = ''
101
+
102
+ if (this.menuInfo[key]) {
103
+ const { title, subTitle, time } = this.menuInfo[key] //get time subTitle time from menu info
104
+ //set the title
105
+ if (title && title != ' ') activityTitle = title
106
+ //set the subtitle
107
+ if (subTitle && subTitle != ' ') activitySubTitle = subTitle
108
+ //set the time
109
+ if (time && time != ' ') activityTime = time
110
+ }
111
+ // This is the Introduction
112
+ if (key === 'A00') {
113
+ activityTitle = activityTitle || this.$t('text.introduction')
114
+ activityPath = 'introduction'
115
+ } else if (key === 'A99') {
116
+ activityTitle = activityTitle || this.$t('text.conclusion')
117
+ activityPath = 'conclusion'
118
+ } else {
119
+ count++
120
+ activityTitle =
121
+ activityTitle || `${this.$t('text.activity')} ${count}`
122
+ activityPath = `activite_${count}`
123
+ }
124
+
125
+ theActivity = {
126
+ id: key,
127
+ title: activityTitle,
128
+ subtitle: activitySubTitle,
129
+ time: activityTime,
130
+ path: activityPath,
131
+ data: value
132
+ }
133
+
134
+ collection.push(theActivity) // push the activity in the collection
135
+ })
136
+
137
+ return collection
138
+ },
139
+ menuInfo() {
140
+ let menuInfo = this.getMenuSettings
141
+ return menuInfo
142
+ }
143
+ },
144
+ mounted() {},
145
+ methods: {
146
+ /**
147
+ * @description Gives gives length of completed page for an activity
148
+ * @param {String} idActivity
149
+ * @returns {Number}
150
+ */
151
+ getPageComplete(idActivity) {
152
+ /// give all the page that are complete to the gauge
153
+ if (idActivity) {
154
+ let completed = []
155
+ if (this.getAllCompleted[idActivity]) {
156
+ completed = this.getAllCompleted[idActivity] //get all completed page for the activity
157
+ }
158
+
159
+ return completed.length
160
+ }
161
+ },
162
+ /**
163
+ * @description give the size of the state of the activity
164
+ * @param {String} activityID
165
+ * @returns {Number} size
166
+ */
167
+ getActivitySize(activityID) {
168
+ /*
169
+ * Note:
170
+ * 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
171
+ * cf: https://reactgo.com/javascript-clone-object/
172
+ */
173
+
174
+ const allActivitiesState = JSON.parse(
175
+ JSON.stringify(this.getAllActivitiesState)
176
+ )
177
+ let size = allActivitiesState[activityID]
178
+ ? allActivitiesState[activityID].size
179
+ : 0
180
+
181
+ return size
182
+ },
183
+ createRoutes(data) {
184
+ let activity
185
+
186
+ if (data.charAt(1) == '0' || data.charAt(1) == 0) {
187
+ activity = data.substr(2)
188
+ } else {
189
+ activity = data.substr(1)
190
+ }
191
+
192
+ if (activity == 0 && activity == '0') return `introduction`
193
+ if (activity == '99') return `conclusion`
194
+ else return `activite_${activity}`
195
+ },
196
+ startActivity(a) {
197
+ //this.$bus.$emit('send-starting-event', a)
198
+ }
199
+ }
200
+ }
201
+ </script>
202
+ <style lang="scss">
203
+ .menu-card {
204
+ width: 100%;
205
+ padding: 24px;
206
+
207
+ .v-row {
208
+ margin: 0;
209
+ flex-direction: column;
210
+
211
+ .title {
212
+ flex-grow: 4;
213
+ width: 80%;
214
+ margin-bottom: 30px;
215
+
216
+ h3 {
217
+ text-align: left;
218
+ }
219
+ }
220
+
221
+ .cnt-time {
222
+ display: flex;
223
+ flex-direction: row;
224
+ align-items: center;
225
+ margin-bottom: 20px;
226
+
227
+ svg {
228
+ width: 18px;
229
+ height: 18px;
230
+ margin-right: 10px;
231
+ }
232
+ }
233
+
234
+ .box-gauge {
235
+ display: block;
236
+ width: 100%;
237
+
238
+ .box-g {
239
+ display: flex;
240
+ flex-direction: row;
241
+ align-items: center;
242
+ }
243
+ }
244
+ }
245
+ }
246
+ </style>