fcad-core-dragon 2.1.0-beta.1 → 2.1.0-beta.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 (49) hide show
  1. package/.editorconfig +33 -33
  2. package/.eslintignore +29 -29
  3. package/.eslintrc.cjs +81 -81
  4. package/CHANGELOG +20 -0
  5. package/bk.scss +117 -117
  6. package/package.json +1 -1
  7. package/src/assets/data/onboardingMessages.json +47 -47
  8. package/src/components/AppBaseErrorDisplay.vue +438 -438
  9. package/src/components/AppBaseFlipCard.vue +84 -84
  10. package/src/components/AppBasePopover.vue +41 -41
  11. package/src/components/AppCompInputCheckBoxNx.vue +1 -1
  12. package/src/components/AppCompInputRadioNx.vue +1 -1
  13. package/src/components/AppCompPlayBarProgress.vue +82 -82
  14. package/src/components/AppCompQuizNext.vue +1 -1
  15. package/src/components/AppCompSettingsMenu.vue +172 -172
  16. package/src/components/AppCompViewDisplay.vue +6 -6
  17. package/src/externalComps/ModuleView.vue +22 -22
  18. package/src/externalComps/SummaryView.vue +91 -91
  19. package/src/module/xapi/Crypto/Hasher.js +241 -241
  20. package/src/module/xapi/Crypto/WordArray.js +278 -278
  21. package/src/module/xapi/Crypto/algorithms/BufferedBlockAlgorithm.js +103 -103
  22. package/src/module/xapi/Crypto/algorithms/C_algo.js +315 -315
  23. package/src/module/xapi/Crypto/algorithms/HMAC.js +9 -9
  24. package/src/module/xapi/Crypto/algorithms/SHA1.js +9 -9
  25. package/src/module/xapi/Crypto/encoders/Base.js +105 -105
  26. package/src/module/xapi/Crypto/encoders/Base64.js +99 -99
  27. package/src/module/xapi/Crypto/encoders/Hex.js +61 -61
  28. package/src/module/xapi/Crypto/encoders/Latin1.js +61 -61
  29. package/src/module/xapi/Crypto/encoders/Utf8.js +45 -45
  30. package/src/module/xapi/Crypto/index.js +53 -53
  31. package/src/module/xapi/Statement/activity.js +47 -47
  32. package/src/module/xapi/Statement/agent.js +55 -55
  33. package/src/module/xapi/Statement/group.js +26 -26
  34. package/src/module/xapi/Statement/index.js +259 -259
  35. package/src/module/xapi/Statement/statement.js +253 -253
  36. package/src/module/xapi/Statement/statementRef.js +23 -23
  37. package/src/module/xapi/Statement/substatement.js +22 -22
  38. package/src/module/xapi/Statement/verb.js +36 -36
  39. package/src/module/xapi/activitytypes.js +17 -17
  40. package/src/module/xapi/utils.js +167 -167
  41. package/src/module/xapi/verbs.js +294 -294
  42. package/src/module/xapi/xapiStatement.js +444 -444
  43. package/src/plugins/bus.js +8 -8
  44. package/src/plugins/gsap.js +14 -14
  45. package/src/plugins/i18n.js +44 -44
  46. package/src/plugins/save.js +37 -37
  47. package/src/plugins/scorm.js +287 -287
  48. package/src/plugins/xapi.js +11 -11
  49. package/src/public/index.html +33 -33
@@ -1,287 +1,287 @@
1
- /**
2
- * Create a Scorm plugin for LMS communication.
3
- * this plugin implements Scorm 1.2 specifications
4
- */
5
-
6
- export const scormPlugin = {
7
- install: function (app) {
8
- {
9
- app.config.globalProperties.$scorm = {
10
- nFindAPITries: 0,
11
- API: null,
12
- maxTries: 500,
13
- SCORM_TRUE: 'true',
14
- SCORM_FALSE: 'false',
15
- SCORM_NO_ERROR: '0',
16
- error_message: {
17
- msg_api_init:
18
- 'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
19
- msg_api_Terminate:
20
- 'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
21
- msg_setValue:
22
- 'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
23
- msg_getValue:
24
- ' Error - Could not retrieve a value from the LMS.\n\n $@errorDescription',
25
- msg_commit:
26
- 'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n $@errorDescription'
27
- },
28
- //Since the Unload handler will be called twice, from both the onunload
29
- //and onbeforeunload events, ensure that we only call Terminate once.
30
- terminateCalled: false,
31
- //Track whether or not we successfully initialized.
32
- initialized: false,
33
-
34
- // The ScanForAPI() function searches for an object named this.API_1484_11
35
- // in the window that is passed into the function. If the object is
36
- // found a reference to the object is returned to the calling function.
37
- // If the instance is found the SCO now has a handle to the LMS
38
- // provided this.API Instance. The function searches a maximum number
39
- // of parents of the current window. If no object is found the
40
- // function returns a null reference. This function also reassigns a
41
- // value to the win parameter passed in, based on the number of
42
- // parents. At the end of the function call, the win variable will be
43
- // set to the upper most parent in the chain of parents.
44
- ScanForAPI: function (win) {
45
- while (win.API == null && win.parent != null && win.parent != win) {
46
- this.nFindAPITries++
47
- if (this.nFindAPITries > this.maxTries) {
48
- return null
49
- }
50
- win = win.parent
51
- }
52
- return win.API
53
- },
54
- // The GetAPI() function begins the process of searching for the LMS
55
- // provided this.API Instance. The function takes in a parameter that
56
- // represents the current window. The function is built to search in a
57
- // specific order and stop when the LMS provided this.API Instance is found.
58
- // The function begins by searching the current window�s parent, if the
59
- // current window has a parent. If the this.API Instance is not found, the
60
- // function then checks to see if there are any opener windows. If
61
- // the window has an opener, the function begins to look for the
62
- // this.API Instance in the opener window.
63
- GetAPI: function (win) {
64
- if (win.parent != null && win.parent != win) {
65
- this.API = this.ScanForAPI(win.parent)
66
- }
67
- if (this.API == null && win.opener != null) {
68
- this.API = this.ScanForAPI(win.opener)
69
- }
70
- },
71
-
72
- // Initalize
73
- Initialize: function () {
74
- let result
75
-
76
- this.GetAPI(window)
77
-
78
- if (this.API == null) {
79
- return
80
- }
81
-
82
- result = this.API.LMSInitialize('') // Initialize communication with LMS return true | false
83
-
84
- if (result == this.SCORM_FALSE) {
85
- let errorNumber = this.API.LMSGetLastError()
86
- let errorString = this.API.LMSGetErrorString(errorNumber)
87
- let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
88
-
89
- let errorDescription =
90
- 'Number: ' +
91
- errorNumber +
92
- '\nDescription: ' +
93
- errorString +
94
- '\nDiagnostic: ' +
95
- diagnostic
96
-
97
- alert(
98
- 'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n' +
99
- errorDescription
100
- )
101
- return
102
- }
103
-
104
- this.initialized = true
105
- },
106
- //Termitate the communication with the LMS
107
- Finish: function (finalState) {
108
- let result
109
- //Don't terminate if we haven't initialized or if we've already terminated
110
- if (this.initialized === false || this.terminateCalled === true) {
111
- return
112
- }
113
-
114
- if (finalState && finalState == true) {
115
- this.SetValue('cmi.core.lesson_status', 'completed')
116
- } else {
117
- this.SetValue('cmi.core.lesson_status', 'incomplete')
118
- }
119
- this.Commit()
120
- result = this.API.LMSFinish('') // terminate communication with the LMS return true | false
121
- this.terminateCalled = true
122
-
123
- if (result == this.SCORM_FALSE) {
124
- let errorNumber = this.API.LMSGetLastError()
125
- let errorString = this.API.LMSGetErrorString(errorNumber)
126
- let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
127
-
128
- let errorDescription =
129
- 'Number: ' +
130
- errorNumber +
131
- '\nDescription: ' +
132
- errorString +
133
- '\nDiagnostic: ' +
134
- diagnostic
135
-
136
- alert(
137
- 'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n' +
138
- errorDescription
139
- )
140
- return
141
- }
142
- this.initialized = false
143
- },
144
- //There are situations where a GetValue call is expected to have an error
145
- //and should not alert the user.
146
-
147
- GetValue: function (element, checkError) {
148
- let result
149
-
150
- if (this.initialized == false || this.terminateCalled == true) {
151
- return
152
- }
153
-
154
- result = this.API.LMSGetValue(element)
155
-
156
- if (checkError == true && result == '') {
157
- let errorNumber = this.API.LMSGetLastError()
158
-
159
- if (errorNumber != this.SCORM_NO_ERROR) {
160
- let errorString = this.API.LMSGetErrorString(errorNumber)
161
- let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
162
-
163
- let errorDescription =
164
- 'Number: ' +
165
- errorNumber +
166
- '\nDescription: ' +
167
- errorString +
168
- '\nDiagnostic: ' +
169
- diagnostic
170
-
171
- alert(
172
- 'Error - Could not retrieve a value from the LMS.\n\n' +
173
- errorDescription
174
- )
175
- return ''
176
- }
177
- }
178
-
179
- return result
180
- },
181
-
182
- SetValue: function (element, value) {
183
- let result
184
-
185
- if (this.initialized == false || this.terminateCalled == true) {
186
- return
187
- }
188
-
189
- result = this.API.LMSSetValue(element, value)
190
-
191
- if (result == this.SCORM_FALSE) {
192
- let errorNumber = this.API.LMSGetLastError()
193
- let errorString = this.API.LMSGetErrorString(errorNumber)
194
- let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
195
-
196
- let errorDescription =
197
- 'Number: ' +
198
- errorNumber +
199
- '\nDescription: ' +
200
- errorString +
201
- '\nDiagnostic: ' +
202
- diagnostic
203
-
204
- alert(
205
- 'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n' +
206
- errorDescription
207
- )
208
- return
209
- }
210
- },
211
-
212
- Commit: function () {
213
- let result
214
-
215
- result = this.API.LMSCommit('')
216
-
217
- if (result == this.SCORM_FALSE) {
218
- let errorNumber = this.API.LMSGetLastError()
219
- let errorString = this.API.LMSGetErrorString(errorNumber)
220
- let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
221
-
222
- let errorDescription =
223
- 'Number: ' +
224
- errorNumber +
225
- '\nDescription: ' +
226
- errorString +
227
- '\nDiagnostic: ' +
228
- diagnostic
229
-
230
- alert(
231
- 'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n' +
232
- errorDescription
233
- )
234
- return
235
- }
236
- },
237
- //==================== CUSTOME METHODS =============================
238
- checkForError: function () {
239
- let error_type = null
240
- let errorNumber = this.API.LMSGetLastError()
241
- if (errorNumber !== '' || errorNumber !== '0') {
242
- let errorString = this.API.LMSGetErrorString(errorNumber)
243
- let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
244
- return (error_type = {
245
- error_number: errorNumber,
246
- error_name: errorString,
247
- description: diagnostic
248
- })
249
- } else return error_type
250
- },
251
-
252
- formateMsg: function (msg, data) {
253
- msg.replace('$@errorDescription', data)
254
- },
255
-
256
- getScormStatus: function () {
257
- return this.initialized
258
- },
259
-
260
- getScormAPI: function () {
261
- return this.API
262
- },
263
-
264
- setCompletionStatus: function (newStatus) {
265
- this.API.RunTimeData.CompletionStatus = newStatus
266
- this.Commit()
267
- },
268
-
269
- setSucessStatus: function (newStatus) {
270
- this.API.RunTimeData.SuccessStatus = newStatus
271
- this.Commit()
272
- },
273
- setBookMark(page) {
274
- this.SetValue('cmi.core.lesson_location', page)
275
- this.Commit()
276
- },
277
- getDataValues() {
278
- return {
279
- bookMark: this.GetValue('cmi.core.lesson_location'),
280
- userData: this.GetValue('cmi.suspend_data'),
281
- lessonState: this.GetValue('cmi.core.lesson_status')
282
- }
283
- }
284
- }
285
- }
286
- }
287
- }
1
+ /**
2
+ * Create a Scorm plugin for LMS communication.
3
+ * this plugin implements Scorm 1.2 specifications
4
+ */
5
+
6
+ export const scormPlugin = {
7
+ install: function (app) {
8
+ {
9
+ app.config.globalProperties.$scorm = {
10
+ nFindAPITries: 0,
11
+ API: null,
12
+ maxTries: 500,
13
+ SCORM_TRUE: 'true',
14
+ SCORM_FALSE: 'false',
15
+ SCORM_NO_ERROR: '0',
16
+ error_message: {
17
+ msg_api_init:
18
+ 'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
19
+ msg_api_Terminate:
20
+ 'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
21
+ msg_setValue:
22
+ 'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n $@errorDescription',
23
+ msg_getValue:
24
+ ' Error - Could not retrieve a value from the LMS.\n\n $@errorDescription',
25
+ msg_commit:
26
+ 'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n $@errorDescription'
27
+ },
28
+ //Since the Unload handler will be called twice, from both the onunload
29
+ //and onbeforeunload events, ensure that we only call Terminate once.
30
+ terminateCalled: false,
31
+ //Track whether or not we successfully initialized.
32
+ initialized: false,
33
+
34
+ // The ScanForAPI() function searches for an object named this.API_1484_11
35
+ // in the window that is passed into the function. If the object is
36
+ // found a reference to the object is returned to the calling function.
37
+ // If the instance is found the SCO now has a handle to the LMS
38
+ // provided this.API Instance. The function searches a maximum number
39
+ // of parents of the current window. If no object is found the
40
+ // function returns a null reference. This function also reassigns a
41
+ // value to the win parameter passed in, based on the number of
42
+ // parents. At the end of the function call, the win variable will be
43
+ // set to the upper most parent in the chain of parents.
44
+ ScanForAPI: function (win) {
45
+ while (win.API == null && win.parent != null && win.parent != win) {
46
+ this.nFindAPITries++
47
+ if (this.nFindAPITries > this.maxTries) {
48
+ return null
49
+ }
50
+ win = win.parent
51
+ }
52
+ return win.API
53
+ },
54
+ // The GetAPI() function begins the process of searching for the LMS
55
+ // provided this.API Instance. The function takes in a parameter that
56
+ // represents the current window. The function is built to search in a
57
+ // specific order and stop when the LMS provided this.API Instance is found.
58
+ // The function begins by searching the current window�s parent, if the
59
+ // current window has a parent. If the this.API Instance is not found, the
60
+ // function then checks to see if there are any opener windows. If
61
+ // the window has an opener, the function begins to look for the
62
+ // this.API Instance in the opener window.
63
+ GetAPI: function (win) {
64
+ if (win.parent != null && win.parent != win) {
65
+ this.API = this.ScanForAPI(win.parent)
66
+ }
67
+ if (this.API == null && win.opener != null) {
68
+ this.API = this.ScanForAPI(win.opener)
69
+ }
70
+ },
71
+
72
+ // Initalize
73
+ Initialize: function () {
74
+ let result
75
+
76
+ this.GetAPI(window)
77
+
78
+ if (this.API == null) {
79
+ return
80
+ }
81
+
82
+ result = this.API.LMSInitialize('') // Initialize communication with LMS return true | false
83
+
84
+ if (result == this.SCORM_FALSE) {
85
+ let errorNumber = this.API.LMSGetLastError()
86
+ let errorString = this.API.LMSGetErrorString(errorNumber)
87
+ let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
88
+
89
+ let errorDescription =
90
+ 'Number: ' +
91
+ errorNumber +
92
+ '\nDescription: ' +
93
+ errorString +
94
+ '\nDiagnostic: ' +
95
+ diagnostic
96
+
97
+ alert(
98
+ 'Error - Could not initialize communication with the LMS.\n\nYour results may not be recorded.\n\n' +
99
+ errorDescription
100
+ )
101
+ return
102
+ }
103
+
104
+ this.initialized = true
105
+ },
106
+ //Termitate the communication with the LMS
107
+ Finish: function (finalState) {
108
+ let result
109
+ //Don't terminate if we haven't initialized or if we've already terminated
110
+ if (this.initialized === false || this.terminateCalled === true) {
111
+ return
112
+ }
113
+
114
+ if (finalState && finalState == true) {
115
+ this.SetValue('cmi.core.lesson_status', 'completed')
116
+ } else {
117
+ this.SetValue('cmi.core.lesson_status', 'incomplete')
118
+ }
119
+ this.Commit()
120
+ result = this.API.LMSFinish('') // terminate communication with the LMS return true | false
121
+ this.terminateCalled = true
122
+
123
+ if (result == this.SCORM_FALSE) {
124
+ let errorNumber = this.API.LMSGetLastError()
125
+ let errorString = this.API.LMSGetErrorString(errorNumber)
126
+ let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
127
+
128
+ let errorDescription =
129
+ 'Number: ' +
130
+ errorNumber +
131
+ '\nDescription: ' +
132
+ errorString +
133
+ '\nDiagnostic: ' +
134
+ diagnostic
135
+
136
+ alert(
137
+ 'Error - Could not terminate communication with the LMS.\n\nYour results may not be recorded.\n\n' +
138
+ errorDescription
139
+ )
140
+ return
141
+ }
142
+ this.initialized = false
143
+ },
144
+ //There are situations where a GetValue call is expected to have an error
145
+ //and should not alert the user.
146
+
147
+ GetValue: function (element, checkError) {
148
+ let result
149
+
150
+ if (this.initialized == false || this.terminateCalled == true) {
151
+ return
152
+ }
153
+
154
+ result = this.API.LMSGetValue(element)
155
+
156
+ if (checkError == true && result == '') {
157
+ let errorNumber = this.API.LMSGetLastError()
158
+
159
+ if (errorNumber != this.SCORM_NO_ERROR) {
160
+ let errorString = this.API.LMSGetErrorString(errorNumber)
161
+ let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
162
+
163
+ let errorDescription =
164
+ 'Number: ' +
165
+ errorNumber +
166
+ '\nDescription: ' +
167
+ errorString +
168
+ '\nDiagnostic: ' +
169
+ diagnostic
170
+
171
+ alert(
172
+ 'Error - Could not retrieve a value from the LMS.\n\n' +
173
+ errorDescription
174
+ )
175
+ return ''
176
+ }
177
+ }
178
+
179
+ return result
180
+ },
181
+
182
+ SetValue: function (element, value) {
183
+ let result
184
+
185
+ if (this.initialized == false || this.terminateCalled == true) {
186
+ return
187
+ }
188
+
189
+ result = this.API.LMSSetValue(element, value)
190
+
191
+ if (result == this.SCORM_FALSE) {
192
+ let errorNumber = this.API.LMSGetLastError()
193
+ let errorString = this.API.LMSGetErrorString(errorNumber)
194
+ let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
195
+
196
+ let errorDescription =
197
+ 'Number: ' +
198
+ errorNumber +
199
+ '\nDescription: ' +
200
+ errorString +
201
+ '\nDiagnostic: ' +
202
+ diagnostic
203
+
204
+ alert(
205
+ 'Error - Could not store a value in the LMS.\n\nYour results may not be recorded.\n\n' +
206
+ errorDescription
207
+ )
208
+ return
209
+ }
210
+ },
211
+
212
+ Commit: function () {
213
+ let result
214
+
215
+ result = this.API.LMSCommit('')
216
+
217
+ if (result == this.SCORM_FALSE) {
218
+ let errorNumber = this.API.LMSGetLastError()
219
+ let errorString = this.API.LMSGetErrorString(errorNumber)
220
+ let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
221
+
222
+ let errorDescription =
223
+ 'Number: ' +
224
+ errorNumber +
225
+ '\nDescription: ' +
226
+ errorString +
227
+ '\nDiagnostic: ' +
228
+ diagnostic
229
+
230
+ alert(
231
+ 'Error - Could not invoke Commit.\n\nYour results may not be recorded.\n\n' +
232
+ errorDescription
233
+ )
234
+ return
235
+ }
236
+ },
237
+ //==================== CUSTOME METHODS =============================
238
+ checkForError: function () {
239
+ let error_type = null
240
+ let errorNumber = this.API.LMSGetLastError()
241
+ if (errorNumber !== '' || errorNumber !== '0') {
242
+ let errorString = this.API.LMSGetErrorString(errorNumber)
243
+ let diagnostic = this.API.LMSGetDiagnostic(errorNumber)
244
+ return (error_type = {
245
+ error_number: errorNumber,
246
+ error_name: errorString,
247
+ description: diagnostic
248
+ })
249
+ } else return error_type
250
+ },
251
+
252
+ formateMsg: function (msg, data) {
253
+ msg.replace('$@errorDescription', data)
254
+ },
255
+
256
+ getScormStatus: function () {
257
+ return this.initialized
258
+ },
259
+
260
+ getScormAPI: function () {
261
+ return this.API
262
+ },
263
+
264
+ setCompletionStatus: function (newStatus) {
265
+ this.API.RunTimeData.CompletionStatus = newStatus
266
+ this.Commit()
267
+ },
268
+
269
+ setSucessStatus: function (newStatus) {
270
+ this.API.RunTimeData.SuccessStatus = newStatus
271
+ this.Commit()
272
+ },
273
+ setBookMark(page) {
274
+ this.SetValue('cmi.core.lesson_location', page)
275
+ this.Commit()
276
+ },
277
+ getDataValues() {
278
+ return {
279
+ bookMark: this.GetValue('cmi.core.lesson_location'),
280
+ userData: this.GetValue('cmi.suspend_data'),
281
+ lessonState: this.GetValue('cmi.core.lesson_status')
282
+ }
283
+ }
284
+ }
285
+ }
286
+ }
287
+ }
@@ -1,11 +1,11 @@
1
- import ADL from '../module/xapi/ADL'
2
-
3
- const _ADL = new ADL()
4
-
5
- export const xapiPlugin = {
6
- install(app) {
7
- {
8
- app.config.globalProperties.$xapi = _ADL
9
- }
10
- }
11
- }
1
+ import ADL from '../module/xapi/ADL'
2
+
3
+ const _ADL = new ADL()
4
+
5
+ export const xapiPlugin = {
6
+ install(app) {
7
+ {
8
+ app.config.globalProperties.$xapi = _ADL
9
+ }
10
+ }
11
+ }
@@ -1,33 +1,33 @@
1
- <!doctype html>
2
- <html lang="en" data-build-time="<%= new Date().toLocaleString() %>">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
- <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
- <meta name="apple-mobile-web-app-capable" content="yes" />
8
- <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
9
- <link
10
- href="https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i&display=swap"
11
- rel="stylesheet"
12
- />
13
- <title>dfcad-prototype</title>
14
- <link
15
- rel="stylesheet"
16
- href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"
17
- />
18
- <link
19
- rel="stylesheet"
20
- href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"
21
- />
22
- </head>
23
- <body>
24
- <noscript>
25
- <strong
26
- >We're sorry but dfcad-prototype doesn't work properly without JavaScript enabled. Please
27
- enable it to continue.</strong
28
- >
29
- </noscript>
30
- <div id="app"></div>
31
- <!-- built files will be auto injected -->
32
- </body>
33
- </html>
1
+ <!doctype html>
2
+ <html lang="en" data-build-time="<%= new Date().toLocaleString() %>">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
+ <meta name="apple-mobile-web-app-capable" content="yes" />
8
+ <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
9
+ <link
10
+ href="https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i&display=swap"
11
+ rel="stylesheet"
12
+ />
13
+ <title>dfcad-prototype</title>
14
+ <link
15
+ rel="stylesheet"
16
+ href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"
17
+ />
18
+ <link
19
+ rel="stylesheet"
20
+ href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"
21
+ />
22
+ </head>
23
+ <body>
24
+ <noscript>
25
+ <strong
26
+ >We're sorry but dfcad-prototype doesn't work properly without JavaScript enabled. Please
27
+ enable it to continue.</strong
28
+ >
29
+ </noscript>
30
+ <div id="app"></div>
31
+ <!-- built files will be auto injected -->
32
+ </body>
33
+ </html>