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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/.editorconfig +6 -31
  2. package/.prettierrc +11 -0
  3. package/.vscode/extensions.json +8 -0
  4. package/.vscode/settings.json +16 -0
  5. package/CHANGELOG +153 -0
  6. package/README.md +28 -43
  7. package/documentation/.vitepress/config.js +114 -0
  8. package/documentation/api-examples.md +49 -0
  9. package/documentation/composants/app-base-button.md +58 -0
  10. package/documentation/composants/app-base-error-display.md +59 -0
  11. package/documentation/composants/app-base-popover.md +68 -0
  12. package/documentation/composants/app-comp-audio.md +75 -0
  13. package/documentation/composants/app-comp-branch-buttons.md +111 -0
  14. package/documentation/composants/app-comp-button-progress.md +53 -0
  15. package/documentation/composants/app-comp-carousel.md +53 -0
  16. package/documentation/composants/app-comp-container.md +53 -0
  17. package/documentation/composants/app-comp-input-checkbox-next.md +42 -0
  18. package/documentation/composants/app-comp-input-dropdown-next.md +34 -0
  19. package/documentation/composants/app-comp-input-radio-next.md +39 -0
  20. package/documentation/composants/app-comp-input-text-next.md +35 -0
  21. package/documentation/composants/app-comp-input-text-table-next.md +34 -0
  22. package/documentation/composants/app-comp-input-text-to-fill-dropdown-next.md +53 -0
  23. package/documentation/composants/app-comp-input-text-to-fill-next.md +31 -0
  24. package/documentation/composants/app-comp-jauge.md +31 -0
  25. package/documentation/composants/app-comp-menu-item.md +55 -0
  26. package/documentation/composants/app-comp-menu.md +29 -0
  27. package/documentation/composants/app-comp-navigation.md +41 -0
  28. package/documentation/composants/app-comp-note-call.md +53 -0
  29. package/documentation/composants/app-comp-note-credit.md +53 -0
  30. package/documentation/composants/app-comp-play-bar-next.md +53 -0
  31. package/documentation/composants/app-comp-pop-up-next.md +93 -0
  32. package/documentation/composants/app-comp-quiz-next.md +235 -0
  33. package/documentation/composants/app-comp-quiz-recall.md +53 -0
  34. package/documentation/composants/app-comp-svg-next.md +53 -0
  35. package/documentation/composants/app-comp-table-of-content.md +50 -0
  36. package/documentation/composants/app-comp-video-player.md +82 -0
  37. package/documentation/composants.md +46 -0
  38. package/documentation/composants_critiques/ModelPageComposant.md +53 -0
  39. package/documentation/composants_critiques/app-base-module.md +43 -0
  40. package/documentation/composants_critiques/app-base-page.md +48 -0
  41. package/documentation/composants_critiques/app-base.md +311 -0
  42. package/documentation/composants_critiques/main.md +15 -0
  43. package/documentation/demarrage.md +50 -0
  44. package/documentation/deploiement.md +58 -0
  45. package/documentation/index.md +33 -0
  46. package/documentation/markdown-examples.md +85 -0
  47. package/documentation/public/npm_version.png +0 -0
  48. package/documentation/public/vite.svg +15 -0
  49. package/documentation/public/vuejs.svg +2 -0
  50. package/documentation/public/vuetify.svg +6 -0
  51. package/eslint.config.js +60 -0
  52. package/package.json +43 -47
  53. package/src/$locales/en.json +86 -108
  54. package/src/$locales/fr.json +66 -127
  55. package/src/assets/data/onboardingMessages.json +1 -1
  56. package/src/components/AppBase.vue +960 -405
  57. package/src/components/AppBaseButton.test.js +21 -0
  58. package/src/components/AppBaseButton.vue +42 -10
  59. package/src/components/AppBaseErrorDisplay.vue +207 -189
  60. package/src/components/AppBaseFlipCard.vue +1 -0
  61. package/src/components/AppBaseModule.vue +769 -977
  62. package/src/components/AppBasePage.vue +635 -81
  63. package/src/components/AppBasePopover.vue +41 -0
  64. package/src/components/AppBaseSkeleton.vue +66 -0
  65. package/src/components/AppCompAudio.vue +256 -0
  66. package/src/components/AppCompBranchButtons.vue +79 -153
  67. package/src/components/AppCompButtonProgress.vue +21 -36
  68. package/src/components/AppCompCarousel.vue +231 -87
  69. package/src/components/{AppCompTranscript.vue → AppCompContainer.vue} +12 -2
  70. package/src/components/AppCompInputCheckBoxNx.vue +323 -0
  71. package/src/components/AppCompInputDropdownNx.vue +299 -0
  72. package/src/components/AppCompInputRadioNx.vue +284 -0
  73. package/src/components/AppCompInputTextNx.vue +153 -0
  74. package/src/components/AppCompInputTextTableNx.vue +202 -0
  75. package/src/components/AppCompInputTextToFillDropdownNx.vue +340 -0
  76. package/src/components/AppCompInputTextToFillNx.vue +313 -0
  77. package/src/components/AppCompJauge.vue +36 -10
  78. package/src/components/AppCompMenu.vue +246 -32
  79. package/src/components/AppCompMenuItem.vue +87 -21
  80. package/src/components/AppCompNavigation.vue +470 -447
  81. package/src/components/AppCompNoteCall.vue +93 -58
  82. package/src/components/AppCompNoteCredit.vue +423 -96
  83. package/src/components/AppCompPlayBarNext.vue +2288 -0
  84. package/src/components/AppCompPopUpNext.vue +504 -0
  85. package/src/components/AppCompQuizNext.vue +510 -0
  86. package/src/components/AppCompQuizRecall.vue +199 -99
  87. package/src/components/AppCompSVGNext.vue +346 -0
  88. package/src/components/AppCompSettingsMenu.vue +17 -16
  89. package/src/components/AppCompTableOfContent.vue +262 -99
  90. package/src/components/AppCompVideoPlayer.vue +183 -142
  91. package/src/components/BaseModule.vue +8 -20
  92. package/src/components/tests__/AppBaseButton.spec.js +53 -0
  93. package/src/components/tests__/useTimer.spec.js +91 -0
  94. package/src/composables/useIdleDetector.js +56 -0
  95. package/src/composables/useQuiz.js +89 -0
  96. package/src/composables/useTimer.js +172 -0
  97. package/src/directives/nvdaFix.js +53 -0
  98. package/src/externalComps/ModuleView.vue +22 -0
  99. package/src/externalComps/SummaryView.vue +91 -0
  100. package/src/main.js +397 -148
  101. package/src/module/stores/appStore.js +947 -0
  102. package/src/module/xapi/ADL.js +241 -60
  103. package/src/module/xapi/Crypto/Hasher.js +8 -8
  104. package/src/module/xapi/Crypto/WordArray.js +6 -6
  105. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +4 -4
  106. package/src/module/xapi/Crypto/algorithms/C_algo.js +14 -18
  107. package/src/module/xapi/Crypto/algorithms/HMAC.js +1 -1
  108. package/src/module/xapi/Crypto/algorithms/SHA1.js +1 -1
  109. package/src/module/xapi/Crypto/encoders/Base.js +7 -7
  110. package/src/module/xapi/Crypto/encoders/Base64.js +3 -3
  111. package/src/module/xapi/Crypto/encoders/Hex.js +2 -2
  112. package/src/module/xapi/Crypto/encoders/Latin1.js +3 -3
  113. package/src/module/xapi/Crypto/encoders/Utf8.js +3 -3
  114. package/src/module/xapi/Statement/index.js +3 -3
  115. package/src/module/xapi/launch.js +10 -10
  116. package/src/module/xapi/utils.js +17 -17
  117. package/src/module/xapi/wrapper.js +219 -214
  118. package/src/module/xapi/xapiStatement.js +29 -29
  119. package/src/plugins/analytics.js +34 -0
  120. package/src/plugins/bus.js +7 -2
  121. package/src/plugins/gsap.js +5 -7
  122. package/src/plugins/helper.js +97 -34
  123. package/src/plugins/i18n.js +13 -18
  124. package/src/plugins/idb.js +45 -30
  125. package/src/plugins/save.js +1 -1
  126. package/src/plugins/scorm.js +15 -15
  127. package/src/plugins/xapi.js +2 -2
  128. package/src/public/index.html +22 -10
  129. package/src/router/index.js +29 -13
  130. package/src/router/routes.js +29 -54
  131. package/src/shared/generalfuncs.js +186 -30
  132. package/src/shared/validators.js +809 -40
  133. package/vitest.config.js +19 -0
  134. package/.eslintignore +0 -29
  135. package/.eslintrc.js +0 -86
  136. package/.prettierrc.js +0 -5
  137. package/babel.config.js +0 -3
  138. package/src/components/AppBaseDragChoice.vue +0 -91
  139. package/src/components/AppBaseDropZone.vue +0 -112
  140. package/src/components/AppCompBif.vue +0 -120
  141. package/src/components/AppCompDragAndDrop.vue +0 -339
  142. package/src/components/AppCompInputAssociation.vue +0 -332
  143. package/src/components/AppCompInputCheckBox.vue +0 -227
  144. package/src/components/AppCompInputDropdown.vue +0 -184
  145. package/src/components/AppCompInputRadio.vue +0 -169
  146. package/src/components/AppCompInputTextBox.vue +0 -91
  147. package/src/components/AppCompInputTextTable.vue +0 -155
  148. package/src/components/AppCompInputTextToFillDropdown.vue +0 -255
  149. package/src/components/AppCompInputTextToFillText.vue +0 -164
  150. package/src/components/AppCompMediaPlayer.vue +0 -397
  151. package/src/components/AppCompPlayBar.vue +0 -1319
  152. package/src/components/AppCompPopUp.vue +0 -522
  153. package/src/components/AppCompPopover.vue +0 -27
  154. package/src/components/AppCompQuiz.vue +0 -2989
  155. package/src/components/AppCompSVG.vue +0 -309
  156. package/src/mixins/$pageMixins.js +0 -459
  157. package/src/mixins/$quizMixins.js +0 -456
  158. package/src/mixins/timerMixin.js +0 -156
  159. package/src/module/store.js +0 -895
  160. package/src/plugins/timeManager.js +0 -77
  161. package/src/routes_bckp.js +0 -313
  162. package/src/routes_static.js +0 -344
  163. package/vue.config.js +0 -83
@@ -3,98 +3,122 @@
3
3
  @ What it does: Create an html element including an array of slides. These slides are objects including required property (imgSrc) and optional properties (imgAlt, Title, Hypertext).
4
4
  -->
5
5
 
6
- <template>
6
+ <template v-if="slides">
7
7
  <section id="carousel" :aria-label="$t('text.carousel')">
8
- <div class="carousel-inner">
9
- <div class="carousel-controls">
10
- <app-base-button
11
- id="carousel-btn-prev"
12
- class="carousel-btn"
13
- :aria-label="$t('button.carousel_prev')"
14
- aria-controls="mycarousel-slides"
15
- :title="$t('button.carousel_prev')"
16
- :class="{ md_disabled: disablePrev }"
17
- :disabled="disablePrev"
18
- :aria-disabled="disablePrev"
19
- @click="prevSlide()"
20
- >
21
- <svg>
22
- <use href="#fleche-gauche-icon"></use>
23
- </svg>
24
- </app-base-button>
25
- <app-base-button
26
- id="carousel-btn-next"
27
- class="carousel-btn"
28
- :aria-label="$t('button.carousel_next')"
29
- aria-controls="mycarousel-slides"
30
- :title="$t('button.carousel_next')"
31
- :class="{ md_disabled: disableNext }"
32
- :disabled="disableNext"
33
- :aria-disabled="disableNext"
34
- @click="nextSlide()"
35
- >
36
- <svg>
37
- <use href="#fleche-droite-icon"></use>
38
- </svg>
39
- </app-base-button>
40
- </div>
41
-
42
- <div id="mycarousel-slides" class="carousel-slides" aria-live="off">
43
- <div
44
- v-for="(slide, index) in slides"
45
- :key="index"
46
- class="carousel-slide"
47
- :class="{
48
- current: currentSlide == index + 1,
49
- prev: currentSlide >= index + 2,
50
- next: currentSlide <= index
51
- }"
52
- role="group"
53
- :aria-roledescription="$t('text.slide')"
54
- :aria-label="index + 1 + ' ' + $t('text.of') + ' ' + slideLength"
55
- :aria-hidden="!(currentSlide == index + 1)"
56
- >
8
+ <app-base-error-display
9
+ v-if="errorsSlider.length"
10
+ :error-group="'component'"
11
+ :error-title="'ERREUR: CRÉATION CAROUSEL'"
12
+ :errors-list="errorsSlider"
13
+ ></app-base-error-display>
14
+ <template v-else>
15
+ <div class="carousel-inner">
16
+ <div id="mycarousel-slides" class="carousel-slides" aria-live="polite">
57
17
  <div
58
- class="carousel-image"
59
- :class="{ 'full-width': !(slide.title || slide.hypertext) }"
18
+ v-for="(slide, index) in slides"
19
+ :key="index"
20
+ class="carousel-slide"
21
+ :class="{
22
+ current: currentSlide == index + 1,
23
+ prev: currentSlide >= index + 2,
24
+ next: currentSlide <= index
25
+ }"
26
+ role="group"
27
+ :aria-hidden="!(currentSlide == index + 1)"
60
28
  >
61
- <img
62
- :src="slide.imgSrc"
63
- :alt="slide.imgAlt"
64
- :aria-hidden="slide.imgAlt == ' ' || !slide.imgAlt ? true : false"
65
- />
66
- </div>
67
- <div v-if="slide.title || slide.hypertext" class="carousel-text">
68
- <h3 v-if="slide.title">
69
- {{ slide.title }}
70
- </h3>
71
- <div v-html="slide.hypertext"></div>
29
+ <span class="sr-only">
30
+ {{
31
+ $t('text.slide') +
32
+ ' ' +
33
+ (index + 1) +
34
+ ' ' +
35
+ $t('text.of') +
36
+ ' ' +
37
+ slideLength
38
+ }}
39
+ </span>
40
+ <div
41
+ class="carousel-image"
42
+ :class="{ 'full-width': !(slide.title || slide.hypertext) }"
43
+ >
44
+ <img
45
+ :src="slide.imgSrc"
46
+ :alt="slide.imgAlt"
47
+ :aria-hidden="
48
+ slide.imgAlt == ' ' || !slide.imgAlt ? true : false
49
+ "
50
+ />
51
+ </div>
52
+ <div v-if="slide.title || slide.hypertext" class="carousel-text">
53
+ <p v-if="slide.title" class="carousel-slide-title">
54
+ {{ slide.title }}
55
+ </p>
56
+ <div v-html="slide.hypertext"></div>
57
+ </div>
72
58
  </div>
73
59
  </div>
60
+
61
+ <div class="carousel-controls">
62
+ <app-base-button
63
+ id="carousel-btn-prev"
64
+ class="carousel-btn"
65
+ :aria-label="$t('button.carousel_prev')"
66
+ aria-controls="mycarousel-slides"
67
+ :title="$t('button.carousel_prev')"
68
+ :aria-disabled="disablePrev"
69
+ :is-disabled="disablePrev"
70
+ :disabled="disablePrev"
71
+ @click="prevSlide()"
72
+ >
73
+ <svg aria-hidden="true" focusable="false">
74
+ <use href="#fleche-gauche-icon"></use>
75
+ </svg>
76
+ </app-base-button>
77
+ <app-base-button
78
+ id="carousel-btn-next"
79
+ class="carousel-btn"
80
+ :aria-label="$t('button.carousel_next')"
81
+ aria-controls="mycarousel-slides"
82
+ :title="$t('button.carousel_next')"
83
+ :aria-disabled="disableNext"
84
+ :is-disabled="disableNext"
85
+ :disabled="disableNext"
86
+ @click="nextSlide()"
87
+ >
88
+ <svg aria-hidden="true" focusable="false">
89
+ <use href="#fleche-droite-icon"></use>
90
+ </svg>
91
+ </app-base-button>
92
+ </div>
74
93
  </div>
75
- </div>
94
+ </template>
76
95
  <div class="carousel-index">
77
- <p aria-hidden="true">
78
- {{ $t('text.slide') + ' ' + currentSlide }}/{{ slideLength }}
79
- </p>
96
+ <p aria-hidden="true">{{ sliderPagination }}</p>
80
97
  </div>
81
98
  </section>
82
99
  </template>
83
100
 
84
101
  <script>
102
+ import AppBaseErrorDisplay from './AppBaseErrorDisplay.vue'
103
+ import { mapState } from 'pinia'
104
+ import { useAppStore } from '../module/stores/appStore'
85
105
  export default {
86
106
  name: 'AppCompSlider',
107
+ components: { AppBaseErrorDisplay },
87
108
  props: {
88
- slides: { type: Array, required: true } //Array of slides {imgSrc, imgAlt, title, hypertext}
109
+ slides: { type: Array, required: true }, //Array of slides {imgSrc, imgAlt, title, hypertext}
110
+ name: { type: String, default: 'Sooo cool' }
89
111
  },
90
112
  data() {
91
113
  return {
92
- currentSlide: 1, //Slide management
114
+ currentSlide: null, //Slide management
93
115
  requiredProperties: ['imgSrc'], //For slides validation
94
- optionalProperties: ['title', 'imgAlt', 'hypertext'] //For slides validation
116
+ optionalProperties: ['title', 'imgAlt', 'hypertext'], //For slides validation
117
+ errorsSlider: []
95
118
  }
96
119
  },
97
120
  computed: {
121
+ ...mapState(useAppStore, ['getAppConfigs']),
98
122
  disablePrev() {
99
123
  return !(this.currentSlide > 1)
100
124
  },
@@ -102,26 +126,19 @@ export default {
102
126
  return !(this.currentSlide < this.slideLength)
103
127
  },
104
128
  slideLength() {
105
- return this.slides.length
129
+ return this.slides ? this.slides.length : 0
130
+ },
131
+ sliderPagination() {
132
+ return this.getAppConfigs.lang.toLowerCase() == 'en'
133
+ ? `${this.currentSlide}/${this.slideLength}`
134
+ : `${this.currentSlide} / ${this.slideLength}`
106
135
  }
107
136
  },
137
+ created() {
138
+ this.currentSlide = this.slides && this.slides.length ? 1 : 0
139
+ },
108
140
  mounted() {
109
- //Validating slides
110
- if (Array.isArray(this.slides) && this.slideLength > 0) {
111
- //Validate properties for all the slides
112
- for (const slide of this.slides) {
113
- this.validateProperties(
114
- this.requiredProperties,
115
- this.optionalProperties,
116
- slide
117
- )
118
- }
119
- } else {
120
- console.warn(
121
- `%c WARNING!>>> AppCompSlider : slides must be an array of at least one item`,
122
- 'background: orange; color: white; display: block; margin:5px;'
123
- )
124
- }
141
+ this.validateCarousel()
125
142
  },
126
143
  methods: {
127
144
  prevSlide() {
@@ -134,6 +151,27 @@ export default {
134
151
  this.currentSlide++
135
152
  }
136
153
  },
154
+ validateCarousel() {
155
+ //Validating slides
156
+
157
+ if (Array.isArray(this.slides) && this.slideLength > 0) {
158
+ //Validate properties for all the slides
159
+ for (const slide of this.slides) {
160
+ this.validateProperties(
161
+ this.requiredProperties,
162
+ this.optionalProperties,
163
+ slide
164
+ )
165
+ }
166
+ } else {
167
+ let msg = `Le corrousel doit avoit au moins un element.`
168
+ this.errorsSlider.push(msg)
169
+ console.warn(
170
+ `%c WARNING!>>> AppCompSlider : slides must be an array of at least one item`,
171
+ 'background: orange; color: white; display: block; margin:5px;'
172
+ )
173
+ }
174
+ },
137
175
  //Validate the properties of a specific object (currentObject)
138
176
  validateProperties(requiredProperties, optionalProperties, currentObject) {
139
177
  let allProperties = requiredProperties.concat(optionalProperties)
@@ -150,6 +188,8 @@ export default {
150
188
  `%c WARNING!>>> AppCompSlider : slides ${wrongProperties} invalid. Required properties: ${requiredProperties} . Optional properties: ${optionalProperties}`,
151
189
  'background: orange; color: white; display: block; margin:5px;'
152
190
  )
191
+ let msg = `Attribut(s) invalide(s): <i>${wrongProperties}</i> . Consultez la console pour plus de details.`
192
+ this.errorsSlider.push(msg)
153
193
  }
154
194
  //Validate if all required properties are present in currentObject
155
195
  if (missingRequired.length > 0) {
@@ -157,6 +197,8 @@ export default {
157
197
  `%c WARNING!>>> AppCompQuizSlider : slides missing required ${missingRequired} property. Required properties: ${requiredProperties} . Optional properties: ${optionalProperties}`,
158
198
  'background: orange; color: white; display: block; margin:5px;'
159
199
  )
200
+ let msg = `Une/certaines propriété(s) sont manquante(s). Consultez la console pour plus de details.`
201
+ this.errorsSlider.push(msg)
160
202
  }
161
203
  },
162
204
  //Get all the invalids properties from the object
@@ -190,3 +232,105 @@ export default {
190
232
  }
191
233
  }
192
234
  </script>
235
+ <style lang="scss">
236
+ #carousel {
237
+ width: max(100%, 350px);
238
+ }
239
+
240
+ .carousel-inner {
241
+ position: relative;
242
+ height: 100%;
243
+ width: 100%;
244
+ display: flex;
245
+ justify-content: center;
246
+ overflow: initial;
247
+ }
248
+
249
+ .carousel-slides {
250
+ position: relative;
251
+ height: 100%;
252
+ width: calc(
253
+ 100% - 136px
254
+ ); //add 68px each side of the carousel for the buttons
255
+ display: flex;
256
+ flex-direction: row;
257
+ overflow: hidden;
258
+ }
259
+
260
+ .carousel-slide {
261
+ min-width: 100%;
262
+ width: 100%;
263
+ display: flex;
264
+ flex-direction: row;
265
+ opacity: 0.5;
266
+ transition: all 0.6s ease-out;
267
+ position: relative;
268
+ @media screen and (max-width: 1000px) {
269
+ flex-direction: column;
270
+ }
271
+ &.current {
272
+ opacity: 1;
273
+ }
274
+ &.prev {
275
+ margin-left: -100%;
276
+ }
277
+ }
278
+
279
+ .carousel-image {
280
+ width: 60%;
281
+ height: 100%;
282
+ display: flex;
283
+ justify-content: center;
284
+ &.full-width {
285
+ width: 100%;
286
+ }
287
+ @media screen and (max-width: 1000px) {
288
+ width: 100%;
289
+ max-height: 250px;
290
+ }
291
+ img {
292
+ max-width: 100%;
293
+ width: 100%;
294
+ min-height: 300px;
295
+ object-fit: contain;
296
+ @media screen and (max-width: 1000px) {
297
+ min-height: 250px;
298
+ max-height: 250px;
299
+ }
300
+ }
301
+ }
302
+
303
+ .carousel-text {
304
+ width: 40%;
305
+ height: 100%;
306
+ padding: 48px 24px 32px 24px;
307
+
308
+ @media screen and (max-width: 1000px) {
309
+ width: 100%;
310
+ }
311
+ }
312
+
313
+ .carousel-index {
314
+ margin-top: 20px;
315
+ display: flex;
316
+ justify-content: center;
317
+ }
318
+
319
+ .carousel-controls {
320
+ position: absolute;
321
+ width: 75%;
322
+ top: calc(50% - 25px); //Center buttons
323
+
324
+ @media screen and (min-width: 510px) {
325
+ width: 100%;
326
+ }
327
+ & {
328
+ display: flex;
329
+ flex-direction: row;
330
+ justify-content: space-between;
331
+ z-index: 3;
332
+ user-select: none;
333
+ min-width: 300px;
334
+ }
335
+ }
336
+ </style>
@@ -1,19 +1,29 @@
1
1
  <template>
2
- <div id="transcript-container" v-html="content"></div>
2
+ <div :id="id" v-html="content"></div>
3
3
  </template>
4
4
  <script>
5
5
  export default {
6
6
  props: {
7
+ id: {
8
+ type: String,
9
+ default: 'shadow-container'
10
+ },
7
11
  content: {
8
12
  type: String,
9
13
  default: `Hello Wolrd!`
10
14
  }
11
- }
15
+ },
16
+ mounted() {}
12
17
  }
13
18
  </script>
14
19
 
15
20
  <style lang="scss">
21
+ .b-sidebar-body {
22
+ width: 100%;
23
+ }
24
+
16
25
  #transcript-container {
26
+ width: 100%;
17
27
  padding: 30px;
18
28
  }
19
29
  </style>