solara 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (175) hide show
  1. checksums.yaml +7 -0
  2. data/bin/solara +18 -0
  3. data/solara/lib/.DS_Store +0 -0
  4. data/solara/lib/core/.DS_Store +0 -0
  5. data/solara/lib/core/aliases/alias_generator.rb +128 -0
  6. data/solara/lib/core/aliases/alias_generator_manager.rb +28 -0
  7. data/solara/lib/core/aliases/solara_terminal_setup.rb +103 -0
  8. data/solara/lib/core/brands/brand_onboarder.rb +46 -0
  9. data/solara/lib/core/brands/brand_switcher.rb +204 -0
  10. data/solara/lib/core/brands/brands_manager.rb +154 -0
  11. data/solara/lib/core/dashboard/.DS_Store +0 -0
  12. data/solara/lib/core/dashboard/brand/.DS_Store +0 -0
  13. data/solara/lib/core/dashboard/brand/BrandDetail.js +11 -0
  14. data/solara/lib/core/dashboard/brand/BrandDetailController.js +361 -0
  15. data/solara/lib/core/dashboard/brand/BrandDetailModel.js +155 -0
  16. data/solara/lib/core/dashboard/brand/BrandDetailView.js +245 -0
  17. data/solara/lib/core/dashboard/brand/brand.html +477 -0
  18. data/solara/lib/core/dashboard/brand/source/BrandLocalSource.js +123 -0
  19. data/solara/lib/core/dashboard/brand/source/BrandRemoteSource.js +260 -0
  20. data/solara/lib/core/dashboard/brands/Brands.js +10 -0
  21. data/solara/lib/core/dashboard/brands/BrandsController.js +155 -0
  22. data/solara/lib/core/dashboard/brands/BrandsModel.js +136 -0
  23. data/solara/lib/core/dashboard/brands/BrandsView.js +136 -0
  24. data/solara/lib/core/dashboard/brands/brands.html +345 -0
  25. data/solara/lib/core/dashboard/component/AddFieldSheet.js +212 -0
  26. data/solara/lib/core/dashboard/component/AliasesBottomSheet.js +128 -0
  27. data/solara/lib/core/dashboard/component/BrandOptionsBottomSheet.js +130 -0
  28. data/solara/lib/core/dashboard/component/ConfirmationDialog.js +103 -0
  29. data/solara/lib/core/dashboard/component/MessageBottomSheet.js +80 -0
  30. data/solara/lib/core/dashboard/component/OnboardBrandBottomSheet.js +214 -0
  31. data/solara/lib/core/dashboard/dashboard_manager.rb +19 -0
  32. data/solara/lib/core/dashboard/dashboard_server.rb +132 -0
  33. data/solara/lib/core/dashboard/handler/base_handler.rb +25 -0
  34. data/solara/lib/core/dashboard/handler/brand_alisases_handler.rb +33 -0
  35. data/solara/lib/core/dashboard/handler/brand_configurations_handler.rb +18 -0
  36. data/solara/lib/core/dashboard/handler/brand_configurations_manager.rb +73 -0
  37. data/solara/lib/core/dashboard/handler/brand_icon_handler.rb +20 -0
  38. data/solara/lib/core/dashboard/handler/brand_section_handler.rb +20 -0
  39. data/solara/lib/core/dashboard/handler/brands_handler.rb +14 -0
  40. data/solara/lib/core/dashboard/handler/current_brand_handler.rb +18 -0
  41. data/solara/lib/core/dashboard/handler/doctor_handler.rb +39 -0
  42. data/solara/lib/core/dashboard/handler/edit_section_handler.rb +55 -0
  43. data/solara/lib/core/dashboard/handler/offboard_brand_handler.rb +34 -0
  44. data/solara/lib/core/dashboard/handler/onboard_brand_handler.rb +53 -0
  45. data/solara/lib/core/dashboard/handler/redirect_handler.rb +12 -0
  46. data/solara/lib/core/dashboard/handler/switch_handler.rb +25 -0
  47. data/solara/lib/core/dashboard/index.html +36 -0
  48. data/solara/lib/core/dashboard/local.html +41 -0
  49. data/solara/lib/core/dashboard/res/favicon/android-chrome-192x192.png +0 -0
  50. data/solara/lib/core/dashboard/res/favicon/android-chrome-512x512.png +0 -0
  51. data/solara/lib/core/dashboard/res/favicon/apple-touch-icon.png +0 -0
  52. data/solara/lib/core/dashboard/res/favicon/favicon-16x16.png +0 -0
  53. data/solara/lib/core/dashboard/res/favicon/favicon-32x32.png +0 -0
  54. data/solara/lib/core/dashboard/res/favicon/favicon.ico +0 -0
  55. data/solara/lib/core/dashboard/res/favicon/site.webmanifest +1 -0
  56. data/solara/lib/core/dashboard/solara.png +0 -0
  57. data/solara/lib/core/doctor/brand_doctor.rb +94 -0
  58. data/solara/lib/core/doctor/doctor_manager.rb +35 -0
  59. data/solara/lib/core/doctor/project_doctor.rb +8 -0
  60. data/solara/lib/core/doctor/schema/brand_configurations.json +60 -0
  61. data/solara/lib/core/doctor/schema/platform/android/android_config.json +23 -0
  62. data/solara/lib/core/doctor/schema/platform/android/android_signing.json +23 -0
  63. data/solara/lib/core/doctor/schema/platform/ios/ios_config.json +27 -0
  64. data/solara/lib/core/doctor/schema/platform/ios/ios_signing.json +27 -0
  65. data/solara/lib/core/doctor/schema/platform/shared/theme.json +48 -0
  66. data/solara/lib/core/doctor/validator/brand_settings_validator.rb +55 -0
  67. data/solara/lib/core/doctor/validator/brand_settings_validator_manager.rb +82 -0
  68. data/solara/lib/core/doctor/validator/directory_structure_validator.rb +38 -0
  69. data/solara/lib/core/doctor/validator/file_structure_validator.rb +37 -0
  70. data/solara/lib/core/doctor/validator/json_file_validator.rb +21 -0
  71. data/solara/lib/core/doctor/validator/json_schema_validator.rb +32 -0
  72. data/solara/lib/core/doctor/validator/project_filesystem_validator.rb +70 -0
  73. data/solara/lib/core/doctor/validator/template/android_template_validation_config.yml +51 -0
  74. data/solara/lib/core/doctor/validator/template/flutter_template_validation_config.yml +53 -0
  75. data/solara/lib/core/doctor/validator/template/ios_template_validation_config.yml +51 -0
  76. data/solara/lib/core/doctor/validator/template/template_validator.rb +108 -0
  77. data/solara/lib/core/doctor/validator/validation_strategy.rb +7 -0
  78. data/solara/lib/core/scripts/brand_config_generator.rb +245 -0
  79. data/solara/lib/core/scripts/brand_config_manager.rb +90 -0
  80. data/solara/lib/core/scripts/brand_exporter.rb +38 -0
  81. data/solara/lib/core/scripts/brand_importer.rb +84 -0
  82. data/solara/lib/core/scripts/brand_offboarder.rb +19 -0
  83. data/solara/lib/core/scripts/brand_resources_manager.rb +77 -0
  84. data/solara/lib/core/scripts/directory_creator.rb +22 -0
  85. data/solara/lib/core/scripts/file_manager.rb +90 -0
  86. data/solara/lib/core/scripts/file_path.rb +327 -0
  87. data/solara/lib/core/scripts/folder_copier.rb +41 -0
  88. data/solara/lib/core/scripts/gitignore_manager.rb +54 -0
  89. data/solara/lib/core/scripts/interactive_file_system_validator.rb +110 -0
  90. data/solara/lib/core/scripts/platform/android/android_manifest_switcher.rb +24 -0
  91. data/solara/lib/core/scripts/platform/android/android_strings_switcher.rb +39 -0
  92. data/solara/lib/core/scripts/platform/android/gradle_switcher.rb +233 -0
  93. data/solara/lib/core/scripts/platform/android/properties_generator.rb +31 -0
  94. data/solara/lib/core/scripts/platform/ios/ios_file_path_manager.rb +109 -0
  95. data/solara/lib/core/scripts/platform/ios/ios_plist_manager.rb +42 -0
  96. data/solara/lib/core/scripts/platform/ios/xcconfig_generator.rb +44 -0
  97. data/solara/lib/core/scripts/platform/ios/xcode_asset_manager.rb +56 -0
  98. data/solara/lib/core/scripts/platform/ios/xcode_project_manager.rb +82 -0
  99. data/solara/lib/core/scripts/platform/ios/xcode_project_switcher.rb +130 -0
  100. data/solara/lib/core/scripts/project_settings_manager.rb +39 -0
  101. data/solara/lib/core/scripts/solara_logger.rb +103 -0
  102. data/solara/lib/core/scripts/solara_settings_manager.rb +73 -0
  103. data/solara/lib/core/scripts/solara_status_manager.rb +55 -0
  104. data/solara/lib/core/scripts/solara_version_manager.rb +42 -0
  105. data/solara/lib/core/scripts/strings_xml_manager.rb +22 -0
  106. data/solara/lib/core/scripts/terminal_input_manager.rb +22 -0
  107. data/solara/lib/core/scripts/theme_generator.rb +250 -0
  108. data/solara/lib/core/scripts/yaml_manager.rb +72 -0
  109. data/solara/lib/core/solara_configurator.rb +15 -0
  110. data/solara/lib/core/template/brands/android/android_config.json +8 -0
  111. data/solara/lib/core/template/brands/android/android_signing.json +6 -0
  112. data/solara/lib/core/template/brands/android/res/.DS_Store +0 -0
  113. data/solara/lib/core/template/brands/android/res/mipmap-hdpi/ic_launcher.png +0 -0
  114. data/solara/lib/core/template/brands/android/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  115. data/solara/lib/core/template/brands/android/res/mipmap-mdpi/ic_launcher.png +0 -0
  116. data/solara/lib/core/template/brands/android/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  117. data/solara/lib/core/template/brands/android/res/mipmap-xhdpi/ic_launcher.png +0 -0
  118. data/solara/lib/core/template/brands/android/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  119. data/solara/lib/core/template/brands/android/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  120. data/solara/lib/core/template/brands/android/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  121. data/solara/lib/core/template/brands/android/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  122. data/solara/lib/core/template/brands/android/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  123. data/solara/lib/core/template/brands/brands.json +4 -0
  124. data/solara/lib/core/template/brands/ios/assets/.DS_Store +0 -0
  125. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/100.png +0 -0
  126. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/102.png +0 -0
  127. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/1024.png +0 -0
  128. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/114.png +0 -0
  129. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/120.png +0 -0
  130. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/128.png +0 -0
  131. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/144.png +0 -0
  132. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/152.png +0 -0
  133. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/16.png +0 -0
  134. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/167.png +0 -0
  135. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/172.png +0 -0
  136. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/180.png +0 -0
  137. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/196.png +0 -0
  138. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/20.png +0 -0
  139. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/216.png +0 -0
  140. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/256.png +0 -0
  141. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/29.png +0 -0
  142. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/32.png +0 -0
  143. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/40.png +0 -0
  144. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/48.png +0 -0
  145. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/50.png +0 -0
  146. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/512.png +0 -0
  147. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/55.png +0 -0
  148. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/57.png +0 -0
  149. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/58.png +0 -0
  150. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/60.png +0 -0
  151. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/64.png +0 -0
  152. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/66.png +0 -0
  153. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/72.png +0 -0
  154. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/76.png +0 -0
  155. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/80.png +0 -0
  156. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/87.png +0 -0
  157. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/88.png +0 -0
  158. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/92.png +0 -0
  159. data/solara/lib/core/template/brands/ios/assets/AppIcon.appiconset/Contents.json +1 -0
  160. data/solara/lib/core/template/brands/ios/ios_config.json +7 -0
  161. data/solara/lib/core/template/brands/ios/ios_signing.json +7 -0
  162. data/solara/lib/core/template/brands/shared/.DS_Store +0 -0
  163. data/solara/lib/core/template/brands/shared/brand_config.json +2 -0
  164. data/solara/lib/core/template/brands/shared/theme.json +46 -0
  165. data/solara/lib/core/template/config/android_template_config.json +57 -0
  166. data/solara/lib/core/template/config/flutter_template_config.json +62 -0
  167. data/solara/lib/core/template/config/ios_template_config.json +57 -0
  168. data/solara/lib/core/template/project_template_generator.rb +63 -0
  169. data/solara/lib/platform_detector.rb +84 -0
  170. data/solara/lib/solara/cli.rb +5 -0
  171. data/solara/lib/solara/version.rb +3 -0
  172. data/solara/lib/solara.rb +238 -0
  173. data/solara/lib/solara_initializer.rb +44 -0
  174. data/solara/lib/solara_manager.rb +73 -0
  175. metadata +346 -0
@@ -0,0 +1,245 @@
1
+ import {DataSource} from './BrandDetailModel.js';
2
+ import '../component/OnboardBrandBottomSheet.js';
3
+ import '../component/AddFieldSheet.js';
4
+ import '../component/ConfirmationDialog.js';
5
+ import '../component/MessageBottomSheet.js';
6
+
7
+ class BrandDetailView {
8
+ constructor(model) {
9
+ this.model = model;
10
+ this.brandDetailsContainer = document.getElementById('brand-details-container');
11
+ this.addBrandContainer = document.getElementById('add-brand-container');
12
+
13
+ this.sectionsContainer = document.getElementById('sections');
14
+ this.addFieldSheet = document.getElementById('addFieldSheet');
15
+ this.confirmationDialog = document.getElementById('confirmationDialog');
16
+ this.messageBottomSheet = document.getElementById('messageBottomSheet');
17
+
18
+ this.uploadBrandBtn = document.getElementById('uploadBrandBtn');
19
+ this.uploadJsonBtn = document.getElementById('uploadJsonBtn');
20
+ this.addNewBrandBtn = document.getElementById('newBrandBtn');
21
+ this.exportBrandBtn = document.getElementById('exportBrandBtn');
22
+ this.allBrandsButton = document.getElementById('allBrandsButton');
23
+
24
+ this.onboardSheet = document.getElementById('onboardBottomSheet');
25
+
26
+ this.initializeApp();
27
+ }
28
+
29
+ async initializeApp() {
30
+ switch (this.model.source) {
31
+ case DataSource.LOCAL:
32
+ return await this.setupLocal();
33
+ case DataSource.REMOTE:
34
+ return await this.setupRemote();
35
+ default:
36
+ throw new Error('Unknown data source');
37
+ }
38
+ }
39
+
40
+ async setupLocal() {
41
+ this.allBrandsButton.style.display = 'block'
42
+ this.toggleAddBrandContainer(false);
43
+ }
44
+
45
+ async setupRemote() {
46
+ this.allBrandsButton.style.display = 'none'
47
+ this.toggleAddBrandContainer(true);
48
+ }
49
+
50
+ toggleAddBrandContainer(show) {
51
+ this.addBrandContainer.style.display = show ? 'block' : 'none';
52
+ this.brandDetailsContainer.style.display = show ? 'none' : 'block';
53
+ }
54
+
55
+ updateAppNameTitle(brandName) {
56
+ const brandNametitle = document.getElementById('brandNametitle');
57
+ if (brandNametitle) {
58
+ brandNametitle.textContent = brandName;
59
+ }
60
+ }
61
+
62
+ createSection(key, name, inputType) {
63
+ const section = document.createElement('div');
64
+ section.className = 'section';
65
+
66
+ section.dataset.key = key
67
+ section.dataset.name = name
68
+ section.dataset.inputType = inputType
69
+
70
+ const titleContainer = document.createElement('div');
71
+ titleContainer.className = 'section-title-container';
72
+
73
+ const title = document.createElement('h2');
74
+ title.textContent = name;
75
+ titleContainer.appendChild(title);
76
+
77
+ const subtitleElement = document.createElement('p');
78
+ subtitleElement.className = 'section-subtitle';
79
+ subtitleElement.textContent = `${key}.json`;
80
+ titleContainer.appendChild(subtitleElement);
81
+
82
+ section.appendChild(titleContainer);
83
+
84
+ return section;
85
+ }
86
+
87
+ populateSection(sectionItem, sectionElement, content, inputType) {
88
+ for (const [key, value] of Object.entries(content)) {
89
+ if (Array.isArray(value)) {
90
+ sectionElement.appendChild(this.createInputField(sectionItem, key, value, 'array'));
91
+ } else if (typeof value === 'object' && value !== null) {
92
+ for (const [subKey, subValue] of Object.entries(value)) {
93
+ sectionElement.appendChild(this.createInputField(sectionItem, `${key}.${subKey}`, subValue, inputType));
94
+ }
95
+ } else {
96
+ sectionElement.appendChild(this.createInputField(sectionItem, key, value, inputType));
97
+ }
98
+ }
99
+ }
100
+
101
+ createInputField(sectionItem, key, value, inputType) {
102
+ const container = document.createElement('div');
103
+ container.className = 'input-group';
104
+ const label = document.createElement('label');
105
+ label.textContent = key;
106
+ container.appendChild(label);
107
+
108
+ const inputWrapper = document.createElement('div');
109
+ inputWrapper.className = 'input-wrapper';
110
+
111
+ if (inputType === 'array') {
112
+ const arrayInputContainer = document.createElement('div');
113
+ arrayInputContainer.className = 'array-input-container';
114
+
115
+ const input = document.createElement('input');
116
+ input.type = 'text';
117
+ input.id = key;
118
+ input.className = 'array-input';
119
+ input.placeholder = 'Enter array value';
120
+
121
+ const addButton = document.createElement('button');
122
+ addButton.className = 'add-array-item';
123
+ addButton.textContent = '+';
124
+
125
+ arrayInputContainer.appendChild(input);
126
+ arrayInputContainer.appendChild(addButton);
127
+
128
+ const arrayItemsContainer = document.createElement('div');
129
+ arrayItemsContainer.className = 'array-items-container';
130
+
131
+ inputWrapper.appendChild(arrayInputContainer);
132
+ inputWrapper.appendChild(arrayItemsContainer);
133
+
134
+ if (Array.isArray(value)) {
135
+ value.forEach(item => {
136
+ this.addArrayItem(sectionItem, arrayItemsContainer, item);
137
+ });
138
+ }
139
+
140
+ addButton.addEventListener('click', () => {
141
+ this.addArrayItem(sectionItem, arrayItemsContainer, input.value.trim());
142
+ input.value = '';
143
+ });
144
+
145
+ } else {
146
+ const input = document.createElement('input');
147
+ input.type = inputType;
148
+ input.id = key;
149
+
150
+ if (inputType === 'color') {
151
+ input.value = value.startsWith('#') ? value : `#${value.substring(4)}`;
152
+ } else {
153
+ input.value = value;
154
+ }
155
+
156
+ inputWrapper.appendChild(input);
157
+ }
158
+
159
+ const deleteIcon = document.createElement('span');
160
+ deleteIcon.className = 'delete-icon';
161
+ deleteIcon.textContent = '×';
162
+ deleteIcon.onclick = () => this.onDeleteField(sectionItem, container);
163
+ inputWrapper.appendChild(deleteIcon);
164
+
165
+ container.appendChild(inputWrapper);
166
+
167
+ container.addEventListener('change', () => this.onSectionChanged(sectionItem, container.closest('.section')));
168
+
169
+ return container;
170
+ }
171
+
172
+ addArrayItem(sectionItem, container, value) {
173
+ const itemContainer = document.createElement('div');
174
+ itemContainer.classList.add('array-item');
175
+
176
+ const itemInput = document.createElement('input');
177
+ itemInput.type = 'text';
178
+ itemInput.classList.add('array-item-input');
179
+ itemInput.value = value;
180
+
181
+ const deleteButton = document.createElement('button');
182
+ deleteButton.classList.add('delete-array-item');
183
+ deleteButton.textContent = '×';
184
+ deleteButton.addEventListener('click', () => {
185
+ itemContainer.remove();
186
+ this.onSectionChanged(sectionItem, container.closest('.section'));
187
+ });
188
+
189
+ itemContainer.appendChild(itemInput);
190
+ itemContainer.appendChild(deleteButton);
191
+ container.appendChild(itemContainer);
192
+
193
+ this.onSectionChanged(sectionItem, container.closest('.section'));
194
+ }
195
+
196
+ showAddFieldForm(sectionItem, sectionElement, inputType) {
197
+ this.addFieldSheet.show(inputType, (name, value) => {
198
+ const newField = this.createInputField(sectionItem, name, value, inputType);
199
+ sectionElement.insertBefore(newField, sectionElement.lastElementChild);
200
+ this.onSectionChanged(sectionItem, sectionElement);
201
+ })
202
+ }
203
+
204
+ showConfirmationDialog(message, onConfirm) {
205
+ this.confirmationDialog.showDialog(message, onConfirm);
206
+ }
207
+
208
+ showApplyChangesButton() {
209
+ const applyChangesButton = document.getElementById('applyChangesButton');
210
+ applyChangesButton.style.display = 'block';
211
+ }
212
+
213
+ showSwitchButton() {
214
+ const switchButton = document.getElementById('switchButton');
215
+ switchButton.style.display = 'block';
216
+ }
217
+
218
+ updateErrorCount(count) {
219
+ const countElement = document.querySelector('.count');
220
+ countElement.textContent = count;
221
+ }
222
+
223
+ showMessage(message) {
224
+ this.messageBottomSheet.showMessage(message);
225
+ }
226
+
227
+ setOnSectionChangedHandler(handler) {
228
+ this.onSectionChanged = handler;
229
+ }
230
+
231
+ setOnDeleteFieldHandler(handler) {
232
+ this.onDeleteField = handler;
233
+ }
234
+
235
+ showOnboardBrandForm(onSubmit) {
236
+ this.onboardSheet.show('Brand Details', 'Add Brand', onSubmit);
237
+ }
238
+
239
+ async hideOnboardBrandForm() {
240
+ this.onboardSheet.hide();
241
+ }
242
+
243
+ }
244
+
245
+ export default BrandDetailView;