vk-typescript-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/Jenkinsfile +48 -0
  2. package/README.md +300 -0
  3. package/bin/sf.js +438 -0
  4. package/eslint.config.js +90 -0
  5. package/gulpfile.js +157 -0
  6. package/lib/commander.js +3370 -0
  7. package/lib/inquirer-prompts.js +2038 -0
  8. package/license +13 -0
  9. package/package.json +43 -0
  10. package/smoke-test.mjs +38 -0
  11. package/src/commands/add.js +276 -0
  12. package/src/commands/info.js +82 -0
  13. package/src/commands/interactive.js +493 -0
  14. package/src/commands/mcp.js +135 -0
  15. package/src/commands/new.js +264 -0
  16. package/src/commands/skills.js +42 -0
  17. package/src/commands/theme.js +200 -0
  18. package/src/commands/upgrade.js +219 -0
  19. package/src/constants.js +161 -0
  20. package/src/generators/angular.js +878 -0
  21. package/src/generators/nextjs.js +817 -0
  22. package/src/generators/react.js +769 -0
  23. package/src/generators/typescript.js +258 -0
  24. package/src/generators/vue.js +800 -0
  25. package/src/templates/angular/chart.component.html +23 -0
  26. package/src/templates/angular/chart.component.ts +172 -0
  27. package/src/templates/angular/diagram.component.html +13 -0
  28. package/src/templates/angular/diagram.component.ts +224 -0
  29. package/src/templates/angular/docx-editor.component.html +18 -0
  30. package/src/templates/angular/docx-editor.component.ts +37 -0
  31. package/src/templates/angular/filemanager.component.html +4 -0
  32. package/src/templates/angular/filemanager.component.ts +47 -0
  33. package/src/templates/angular/gantt.component.html +32 -0
  34. package/src/templates/angular/gantt.component.ts +95 -0
  35. package/src/templates/angular/grid.component.html +12 -0
  36. package/src/templates/angular/grid.component.ts +58 -0
  37. package/src/templates/angular/pdf-viewer.component.html +9 -0
  38. package/src/templates/angular/pdf-viewer.component.ts +48 -0
  39. package/src/templates/angular/rte.component.html +7 -0
  40. package/src/templates/angular/rte.component.ts +13 -0
  41. package/src/templates/angular/scheduler.component.html +17 -0
  42. package/src/templates/angular/scheduler.component.ts +75 -0
  43. package/src/templates/angular/spreadsheet-editor.component.html +42 -0
  44. package/src/templates/angular/spreadsheet-editor.component.ts +61 -0
  45. package/src/templates/chart-template.js +20 -0
  46. package/src/templates/diagram-template.js +26 -0
  47. package/src/templates/docx-template.js +20 -0
  48. package/src/templates/filemanager-template.js +20 -0
  49. package/src/templates/gantt-template.js +20 -0
  50. package/src/templates/grid-template.js +20 -0
  51. package/src/templates/pdfviewer-template.js +20 -0
  52. package/src/templates/react/Chart.jsx +81 -0
  53. package/src/templates/react/Chart.tsx +81 -0
  54. package/src/templates/react/DOCXEditor.jsx +37 -0
  55. package/src/templates/react/DOCXEditor.tsx +37 -0
  56. package/src/templates/react/Diagram.jsx +192 -0
  57. package/src/templates/react/Diagram.tsx +195 -0
  58. package/src/templates/react/FileManager.jsx +13 -0
  59. package/src/templates/react/FileManager.tsx +13 -0
  60. package/src/templates/react/Gantt.jsx +89 -0
  61. package/src/templates/react/Gantt.tsx +89 -0
  62. package/src/templates/react/Grid.jsx +45 -0
  63. package/src/templates/react/Grid.tsx +45 -0
  64. package/src/templates/react/PDFViewer.jsx +16 -0
  65. package/src/templates/react/PDFViewer.tsx +16 -0
  66. package/src/templates/react/RTE.jsx +14 -0
  67. package/src/templates/react/RTE.tsx +14 -0
  68. package/src/templates/react/Scheduler.jsx +55 -0
  69. package/src/templates/react/Scheduler.tsx +55 -0
  70. package/src/templates/react/SpreadsheetEditor.jsx +96 -0
  71. package/src/templates/react/SpreadsheetEditor.tsx +98 -0
  72. package/src/templates/rte-template.js +26 -0
  73. package/src/templates/scheduler-template.js +20 -0
  74. package/src/templates/spreadheet-template.js +20 -0
  75. package/src/templates/typescript/RTE.ts +33 -0
  76. package/src/templates/typescript/SpreadsheetEditor.ts +39 -0
  77. package/src/templates/typescript/chart.ts +37 -0
  78. package/src/templates/typescript/diagram.ts +30 -0
  79. package/src/templates/typescript/docxeditor.ts +30 -0
  80. package/src/templates/typescript/filemanager.ts +41 -0
  81. package/src/templates/typescript/gantt.ts +88 -0
  82. package/src/templates/typescript/grid.ts +30 -0
  83. package/src/templates/typescript/pdfviewer.ts +8 -0
  84. package/src/templates/typescript/scheduler.ts +39 -0
  85. package/src/templates/vue/Chart.vue +257 -0
  86. package/src/templates/vue/ChartView.vue +7 -0
  87. package/src/templates/vue/DOCXEditor.vue +61 -0
  88. package/src/templates/vue/DOCXEditorView.vue +7 -0
  89. package/src/templates/vue/Diagram.vue +245 -0
  90. package/src/templates/vue/DiagramView.vue +7 -0
  91. package/src/templates/vue/FileManager.vue +58 -0
  92. package/src/templates/vue/FileManagerView.vue +7 -0
  93. package/src/templates/vue/Gantt.vue +129 -0
  94. package/src/templates/vue/GanttView.vue +7 -0
  95. package/src/templates/vue/Grid.vue +141 -0
  96. package/src/templates/vue/GridView.vue +7 -0
  97. package/src/templates/vue/PDFViewer.vue +58 -0
  98. package/src/templates/vue/PDFViewerView.vue +7 -0
  99. package/src/templates/vue/RTE.vue +27 -0
  100. package/src/templates/vue/RTEView.vue +7 -0
  101. package/src/templates/vue/Scheduler.vue +94 -0
  102. package/src/templates/vue/SchedulerView.vue +7 -0
  103. package/src/templates/vue/SpreadsheetEditor.vue +115 -0
  104. package/src/templates/vue/SpreadsheetEditorView.vue +7 -0
  105. package/src/utils/ansi-colors.js +38 -0
  106. package/src/utils/banner.js +179 -0
  107. package/src/utils/common.js +64 -0
  108. package/src/utils/config-generator.js +73 -0
  109. package/src/utils/folder-structure.js +26 -0
  110. package/src/utils/logger.js +19 -0
  111. package/src/utils/mcp-generator.js +122 -0
  112. package/src/utils/package-manager.js +128 -0
  113. package/src/utils/project-bootstrap.js +98 -0
  114. package/src/utils/project-detector.js +195 -0
  115. package/src/utils/prompt-utils.js +29 -0
  116. package/src/utils/run-command.js +110 -0
  117. package/src/utils/skills-installer.js +69 -0
  118. package/src/utils/template-file.js +35 -0
  119. package/src/utils/theme-loader.js +47 -0
@@ -0,0 +1,23 @@
1
+ <div class="chart-container" style="padding: 70px; margin: 0 auto;">
2
+ <ejs-chart id="chart-container" [primaryXAxis]="primaryXAxis" [primaryYAxis]="primaryYAxis" [chartArea]="chartArea"
3
+ [width]="width" [title]="title" [subTitle]="subTitle" [tooltip]="tooltip" [legendSettings]="legendSettings"
4
+ [annotations]="annotations" (load)="load($event)">
5
+ <e-series-collection>
6
+ <e-series [dataSource]="vietnamData" type="Line" xName="x" yName="y" name="Vietnam" width="2"
7
+ [marker]="circleMarker" [labelSettings]="labelSettings"></e-series>
8
+
9
+ <e-series [dataSource]="indonesiaData" type="Line" xName="x" yName="y" name="Indonesia" width="2"
10
+ [marker]="triangleMarker" [labelSettings]="labelSettings"></e-series>
11
+
12
+ <e-series [dataSource]="franceData" type="Line" xName="x" yName="y" name="France" width="2"
13
+ [marker]="diamondMarker" [labelSettings]="labelSettings"></e-series>
14
+
15
+ <e-series [dataSource]="polandData" type="Line" xName="x" yName="y" name="Poland" width="2"
16
+ [marker]="rectangleMarker" [labelSettings]="labelSettings"></e-series>
17
+
18
+ <e-series [dataSource]="mexicoData" type="Line" xName="x" yName="y" name="Mexico" width="2"
19
+ [marker]="pentagonMarker" [labelSettings]="labelSettings"></e-series>
20
+ </e-series-collection>
21
+ </ejs-chart>
22
+
23
+ </div>
@@ -0,0 +1,172 @@
1
+ import { Component } from '@angular/core';
2
+ import { Browser } from '@syncfusion/ej2-base';
3
+ import {
4
+ ChartAllModule,
5
+ ILoadedEventArgs,
6
+ ChartTheme
7
+ } from '@syncfusion/ej2-angular-charts';
8
+
9
+ interface ChartPoint {
10
+ x: number;
11
+ y: number;
12
+ }
13
+
14
+ @Component({
15
+ selector: 'app-chart',
16
+ standalone: true,
17
+ imports: [ChartAllModule],
18
+ templateUrl: './chart.component.html'
19
+ })
20
+ export class ChartComponent {
21
+ public vietnamData: ChartPoint[] = [
22
+ { x: 2016, y: 7.8 },
23
+ { x: 2017, y: 10.3 },
24
+ { x: 2018, y: 15.5 },
25
+ { x: 2019, y: 17.5 },
26
+ { x: 2020, y: 19.5 },
27
+ { x: 2021, y: 23.0 },
28
+ { x: 2022, y: 20.0 },
29
+ { x: 2023, y: 19.0 },
30
+ { x: 2024, y: 22.1 }
31
+ ];
32
+
33
+ public indonesiaData: ChartPoint[] = [
34
+ { x: 2016, y: 4.8 },
35
+ { x: 2017, y: 5.2 },
36
+ { x: 2018, y: 6.2 },
37
+ { x: 2019, y: 7.8 },
38
+ { x: 2020, y: 9.3 },
39
+ { x: 2021, y: 14.3 },
40
+ { x: 2022, y: 15.6 },
41
+ { x: 2023, y: 16.0 },
42
+ { x: 2024, y: 17.0 }
43
+ ];
44
+
45
+ public franceData: ChartPoint[] = [
46
+ { x: 2016, y: 14.6 },
47
+ { x: 2017, y: 15.5 },
48
+ { x: 2018, y: 15.4 },
49
+ { x: 2019, y: 14.4 },
50
+ { x: 2020, y: 11.6 },
51
+ { x: 2021, y: 13.9 },
52
+ { x: 2022, y: 12.1 },
53
+ { x: 2023, y: 10.0 },
54
+ { x: 2024, y: 10.8 }
55
+ ];
56
+
57
+ public polandData: ChartPoint[] = [
58
+ { x: 2016, y: 8.9 },
59
+ { x: 2017, y: 10.3 },
60
+ { x: 2018, y: 10.8 },
61
+ { x: 2019, y: 9.0 },
62
+ { x: 2020, y: 7.9 },
63
+ { x: 2021, y: 8.5 },
64
+ { x: 2022, y: 7.4 },
65
+ { x: 2023, y: 6.4 },
66
+ { x: 2024, y: 7.1 }
67
+ ];
68
+
69
+ public mexicoData: ChartPoint[] = [
70
+ { x: 2016, y: 19.0 },
71
+ { x: 2017, y: 20.0 },
72
+ { x: 2018, y: 20.2 },
73
+ { x: 2019, y: 18.4 },
74
+ { x: 2020, y: 16.8 },
75
+ { x: 2021, y: 18.5 },
76
+ { x: 2022, y: 18.4 },
77
+ { x: 2023, y: 16.3 },
78
+ { x: 2024, y: 13.7 }
79
+ ];
80
+
81
+ public primaryXAxis: Object = {
82
+ valueType: 'Double',
83
+ interval: 1,
84
+ minimum: 2016,
85
+ maximum: 2024,
86
+ majorGridLines: { width: 0 },
87
+ edgeLabelPlacement: 'Shift'
88
+ };
89
+
90
+ public primaryYAxis: Object = {
91
+ title: 'Volume in million metric tons',
92
+ minimum: 0,
93
+ maximum: 25,
94
+ interval: 5,
95
+ labelFormat: '{value}%',
96
+ lineStyle: { width: 0 },
97
+ majorTickLines: { width: 0 }
98
+ };
99
+
100
+ public chartArea: Object = {
101
+ border: { width: 0 }
102
+ };
103
+
104
+ public circleMarker: Object = {
105
+ visible: true,
106
+ width: 7,
107
+ height: 7,
108
+ isFilled: true,
109
+ shape: 'Circle'
110
+ };
111
+
112
+ public triangleMarker: Object = {
113
+ visible: true,
114
+ width: 6,
115
+ height: 6,
116
+ isFilled: true,
117
+ shape: 'Triangle'
118
+ };
119
+
120
+ public diamondMarker: Object = {
121
+ visible: true,
122
+ width: 7,
123
+ height: 7,
124
+ isFilled: true,
125
+ shape: 'Diamond'
126
+ };
127
+
128
+ public rectangleMarker: Object = {
129
+ visible: true,
130
+ width: 5,
131
+ height: 5,
132
+ isFilled: true,
133
+ shape: 'Rectangle'
134
+ };
135
+
136
+ public pentagonMarker: Object = {
137
+ visible: true,
138
+ width: 7,
139
+ height: 7,
140
+ isFilled: true,
141
+ shape: 'Pentagon'
142
+ };
143
+
144
+ public tooltip: Object = {
145
+ enable: true,
146
+ shared: true,
147
+ format: '${series.name}: <b>${point.y}%</b>'
148
+ };
149
+
150
+ public legendSettings: Object = {
151
+ visible: true,
152
+ enableHighlight: true
153
+ };
154
+
155
+ public labelSettings: Object = {
156
+ visible: true
157
+ }
158
+
159
+ public annotations: Object[] = [];
160
+
161
+ public title = 'Annual Crude Steel Production by Country (2016–2024)';
162
+ public subTitle = 'Source: wikipedia.org"';
163
+ public width = Browser.isDevice ? '100%' : '75%';
164
+
165
+ public load(args: ILoadedEventArgs): void {
166
+ const selectedTheme = location.hash.split('/')[1];
167
+ const theme = selectedTheme ? selectedTheme : 'Material';
168
+ args.chart.theme = (theme.charAt(0).toUpperCase() + theme.slice(1))
169
+ .replace(/-dark/i, 'Dark')
170
+ .replace(/contrast/i, 'Contrast') as ChartTheme;
171
+ }
172
+ }
@@ -0,0 +1,13 @@
1
+ <div class="diagram-control-pane" style="padding: 30px; margin: 0 auto;">
2
+ <ejs-diagram
3
+ #diagram
4
+ id="diagram"
5
+ width="100%"
6
+ height="700px"
7
+ [nodes]="nodes"
8
+ [connectors]="connectors"
9
+ [constraints]="constraints"
10
+ [rulerSettings]="rulerSettings"
11
+ (created)="onCreated()">
12
+ </ejs-diagram>
13
+ </div>
@@ -0,0 +1,224 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import {
3
+ DiagramModule,
4
+ DiagramComponent as SfDiagramComponent,
5
+ NodeModel,
6
+ ConnectorModel,
7
+ PointPortModel,
8
+ DiagramConstraints,
9
+ RulerSettingsModel,
10
+ UndoRedoService,
11
+ SnappingService,
12
+ ConnectorBridgingService
13
+ } from '@syncfusion/ej2-angular-diagrams';
14
+
15
+ @Component({
16
+ selector: 'app-diagram',
17
+ standalone: true,
18
+ imports: [DiagramModule],
19
+ providers: [UndoRedoService, SnappingService, ConnectorBridgingService],
20
+ templateUrl: './diagram.component.html'
21
+ })
22
+ export class DiagramComponent {
23
+ @ViewChild('diagram')
24
+ public diagramObj?: SfDiagramComponent;
25
+
26
+ public constraints: DiagramConstraints =
27
+ DiagramConstraints.Default | DiagramConstraints.Bridging;
28
+
29
+ public rulerSettings: RulerSettingsModel = {
30
+ showRulers: true,
31
+ dynamicGrid: true
32
+ };
33
+
34
+ public nodes: NodeModel[] = this.createNodes();
35
+ public connectors: ConnectorModel[] = this.createConnectors();
36
+
37
+ public onCreated(): void {
38
+ this.diagramObj?.fitToPage();
39
+ }
40
+
41
+ private createNode(
42
+ id: string,
43
+ offsetX: number,
44
+ offsetY: number,
45
+ height: number,
46
+ width: number,
47
+ content: string,
48
+ marginX: number = 0,
49
+ marginY: number = 0
50
+ ): NodeModel {
51
+ let ports: PointPortModel[] = [];
52
+
53
+ if (id === 'node5' || id === 'node6') {
54
+ ports = [{ id: 'port1', offset: { x: 0.9, y: 0 } }];
55
+ }
56
+
57
+ if (id === 'node13' || id === 'node15') {
58
+ ports = [{ id: 'port2', offset: { x: 1, y: 0.5 } }];
59
+ }
60
+
61
+ if (id === 'node3') {
62
+ ports = [
63
+ { id: 'port3', offset: { x: 0.25, y: 1 } },
64
+ { id: 'port4', offset: { x: 0.5, y: 1 } },
65
+ { id: 'port5', offset: { x: 0.75, y: 1 } }
66
+ ];
67
+ }
68
+
69
+ if (id === 'node7') {
70
+ ports = [
71
+ { id: 'port1', offset: { x: 0, y: 0.5 } },
72
+ { id: 'port2', offset: { x: 1, y: 0.5 } }
73
+ ];
74
+ }
75
+
76
+ if (id === 'node8') {
77
+ ports = [
78
+ { id: 'port3', offset: { x: 0.25, y: 1 } },
79
+ { id: 'port5', offset: { x: 0.75, y: 1 } }
80
+ ];
81
+ }
82
+
83
+ return {
84
+ id,
85
+ offsetX,
86
+ offsetY,
87
+ margin: { left: marginX, top: marginY },
88
+ width,
89
+ height,
90
+ style: {
91
+ fill: 'white',
92
+ strokeColor: '#2546BB',
93
+ strokeWidth: 1
94
+ },
95
+ shape: {
96
+ type: 'Basic',
97
+ shape: 'Rectangle',
98
+ cornerRadius: 4
99
+ },
100
+ annotations: [
101
+ {
102
+ content,
103
+ style: { color: '#343434' },
104
+ horizontalAlignment: 'Center'
105
+ }
106
+ ],
107
+ ports
108
+ } as NodeModel;
109
+ }
110
+
111
+ private createNodes(): NodeModel[] {
112
+ return [
113
+ this.createNode('node1', 300, 300, 60, 100, 'HTTP Traffic'),
114
+ this.createNode('node2', 500, 300, 60, 100, 'Ingestion service', 50, 30),
115
+ this.createNode('node3', 650, 300, 60, 100, 'Workflow service', 200, 30),
116
+ this.createNode('node4', 500, 415, 60, 100, 'Package service', 50, 150),
117
+ this.createNode('node5', 650, 415, 60, 150, 'Drone Scheduler service', 175, 150),
118
+ this.createNode('node6', 800, 415, 60, 100, 'Delivery service', 350, 150),
119
+ this.createNode('node7', 580, 130, 60, 90, 'Azure Service Bus'),
120
+ this.createNode('node8', 815, 130, 60, 100, 'Managed Identities'),
121
+ this.createNode('node9', 1000, 130, 60, 100, 'Azure Key Vault'),
122
+ this.createNode('node10', 500, 550, 60, 100, 'Azure Cosmos DB for MongoDB API'),
123
+ this.createNode('node11', 650, 550, 60, 100, 'Azure Cosmos DB'),
124
+ this.createNode('node12', 800, 550, 60, 100, 'Azure Cache for Redis'),
125
+ this.createNode('node13', 1040, 255, 60, 100, 'Azure Application Insights'),
126
+ this.createNode('node14', 1140, 350, 60, 100, 'Azure Monitor'),
127
+ this.createNode('node15', 1040, 445, 60, 100, 'Azure Log Analytics workspace'),
128
+
129
+ {
130
+ id: 'container',
131
+ width: 520,
132
+ height: 300,
133
+ offsetX: 660,
134
+ offsetY: 350,
135
+ shape: {
136
+ type: 'Container',
137
+ header: {
138
+ annotation: {
139
+ content: 'Azure Container Apps Environment',
140
+ style: {
141
+ fontSize: 18,
142
+ bold: true,
143
+ fill: 'transparent',
144
+ strokeColor: 'transparent'
145
+ }
146
+ },
147
+ height: 40,
148
+ style: {
149
+ fontSize: 18,
150
+ bold: true,
151
+ fill: 'transparent',
152
+ strokeColor: 'transparent'
153
+ }
154
+ },
155
+ children: ['node2', 'node3', 'node4', 'node5', 'node6']
156
+ },
157
+ style: {
158
+ fill: '#E9EEFF',
159
+ strokeColor: '#2546BB',
160
+ strokeWidth: 1
161
+ }
162
+ } as NodeModel
163
+ ];
164
+ }
165
+
166
+ private createConnector(
167
+ id: string,
168
+ sourceID: string,
169
+ targetID: string,
170
+ sourcePortID: string = '',
171
+ targetPortID: string = '',
172
+ sourceDecorator: any = undefined
173
+ ): ConnectorModel {
174
+ return {
175
+ id,
176
+ type: 'Orthogonal',
177
+ sourceID,
178
+ targetID,
179
+ sourcePortID,
180
+ targetPortID,
181
+ style: {
182
+ strokeColor: '#5E5E5E',
183
+ strokeWidth: 1
184
+ },
185
+ sourceDecorator,
186
+ targetDecorator: {
187
+ style: {
188
+ fill: '#5E5E5E',
189
+ strokeColor: '#5E5E5E',
190
+ strokeWidth: 1
191
+ }
192
+ }
193
+ } as ConnectorModel;
194
+ }
195
+
196
+ private createConnectors(): ConnectorModel[] {
197
+ const filledSourceDecorator = {
198
+ style: {
199
+ fill: '#5E5E5E',
200
+ strokeColor: '#5E5E5E',
201
+ strokeWidth: 1
202
+ }
203
+ };
204
+
205
+ return [
206
+ this.createConnector('connector1', 'node1', 'node2'),
207
+ this.createConnector('connector2', 'node4', 'node10'),
208
+ this.createConnector('connector3', 'node5', 'node11'),
209
+ this.createConnector('connector4', 'node6', 'node12'),
210
+ this.createConnector('connector5', 'node8', 'node9'),
211
+ this.createConnector('connector6', 'container', 'node13'),
212
+ this.createConnector('connector7', 'container', 'node15'),
213
+ this.createConnector('connector8', 'node3', 'node4', 'port3'),
214
+ this.createConnector('connector9', 'node3', 'node5', 'port4'),
215
+ this.createConnector('connector10', 'node3', 'node6', 'port5'),
216
+ this.createConnector('connector11', 'node2', 'node7', '', 'port1'),
217
+ this.createConnector('connector12', 'node7', 'node3', 'port2'),
218
+ this.createConnector('connector13', 'node13', 'node14', 'port2'),
219
+ this.createConnector('connector14', 'node15', 'node14', 'port2'),
220
+ this.createConnector('connector16', 'node8', 'node5', 'port3', 'port1', filledSourceDecorator),
221
+ this.createConnector('connector17', 'node8', 'node6', 'port5', 'port1', filledSourceDecorator)
222
+ ];
223
+ }
224
+ }
@@ -0,0 +1,18 @@
1
+ <div class="control-pane" style="padding: 50px; margin: 0 auto">
2
+ <div id="documenteditor_titlebar" class="e-de-ctn-title" style="height: 30px; padding: 13px 0px 0 10px">
3
+ Getting Started
4
+ </div>
5
+
6
+ <div id="documenteditor_container_body">
7
+ <ejs-documenteditorcontainer
8
+ #documentEditorContainer
9
+ id="container"
10
+ style="display: block"
11
+ height="590px"
12
+ [toolbarMode]="toolbarMode"
13
+ [serviceUrl]="hostUrl"
14
+ [enableToolbar]="true"
15
+ locale="en-US">
16
+ </ejs-documenteditorcontainer>
17
+ </div>
18
+ </div>