blob: ef42d654940f01cfc5add1825aaa4a4b9f21d5de [file] [log] [blame]
Adam Pardyl367cc8c2019-07-16 12:20:13 +02001<!-- Copyright (C) 2019 The Android Open Source Project
2
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14-->
15<template>
16 <md-card-content class="container">
Pablo Gamito050e20b2020-07-01 16:41:56 +010017 <div class="rects" v-if="hasScreenView">
Pablo Gamito246e6022020-09-17 12:50:45 +020018 <rects
19 :bounds="bounds"
20 :rects="rects"
21 :highlight="highlight"
22 @rect-click="onRectClick"
23 />
Pablo Gamito050e20b2020-07-01 16:41:56 +010024 </div>
25
26 <div class="hierarchy">
27 <flat-card>
Pablo Gamito246e6022020-09-17 12:50:45 +020028 <md-content
29 md-tag="md-toolbar"
30 md-elevation="0"
31 class="card-toolbar md-transparent md-dense"
32 >
Pablo Gamito050e20b2020-07-01 16:41:56 +010033 <h2 class="md-title" style="flex: 1;">Hierarchy</h2>
34 <md-checkbox
Nataniel Borgesf230a132021-07-28 07:13:45 +000035 v-model="showHierarchyDiff"
Pablo Gamito050e20b2020-07-01 16:41:56 +010036 v-if="diffVisualizationAvailable"
37 >
38 Show Diff
39 </md-checkbox>
Pablo Gamito246e6022020-09-17 12:50:45 +020040 <md-checkbox v-model="store.simplifyNames">
41 Simplify names
42 </md-checkbox>
Pablo Gamito050e20b2020-07-01 16:41:56 +010043 <md-checkbox v-model="store.onlyVisible">Only visible</md-checkbox>
44 <md-checkbox v-model="store.flattened">Flat</md-checkbox>
Nataniel Borges325b0472021-08-31 15:08:30 +000045 <md-checkbox v-if="hasTagsOrErrors" v-model="store.flickerTraceView">Flicker</md-checkbox>
Pablo Gamito050e20b2020-07-01 16:41:56 +010046 <md-field md-inline class="filter">
47 <label>Filter...</label>
Nataniel Borges39071542021-09-22 09:19:41 +000048 <md-input
49 v-model="hierarchyPropertyFilterString"
50 v-on:focus="updateInputMode(true)"
51 v-on:blur="updateInputMode(false)"
52 />
Pablo Gamito050e20b2020-07-01 16:41:56 +010053 </md-field>
54 </md-content>
Pablo Gamitocc299fc2020-08-04 11:30:13 +010055 <div class="tree-view-wrapper">
56 <tree-view
57 class="treeview"
58 :item="tree"
59 @item-selected="itemSelected"
60 :selected="hierarchySelected"
61 :filter="hierarchyFilter"
62 :flattened="store.flattened"
Nataniel Borges325b0472021-08-31 15:08:30 +000063 :onlyVisible="store.onlyVisible"
64 :flickerTraceView="store.flickerTraceView"
65 :presentTags="presentTags"
66 :presentErrors="presentErrors"
Pablo Gamitocc299fc2020-08-04 11:30:13 +010067 :items-clickable="true"
68 :useGlobalCollapsedState="true"
69 :simplify-names="store.simplifyNames"
70 ref="hierarchy"
71 />
72 </div>
Pablo Gamito050e20b2020-07-01 16:41:56 +010073 </flat-card>
74 </div>
75
76 <div class="properties">
77 <flat-card>
Pablo Gamito246e6022020-09-17 12:50:45 +020078 <md-content
79 md-tag="md-toolbar"
80 md-elevation="0"
81 class="card-toolbar md-transparent md-dense"
82 >
Pablo Gamito050e20b2020-07-01 16:41:56 +010083 <h2 class="md-title" style="flex: 1">Properties</h2>
Nataniel Borgesf230a132021-07-28 07:13:45 +000084 <div>
85 <md-checkbox
86 v-model="displayDefaults"
87 @change="checkboxChange"
88 >
89 Show Defaults
90 </md-checkbox>
91 <md-tooltip md-direction="bottom">
92 If checked, shows the value of all properties.
93 Otherwise, hides all properties whose value is
94 the default for its data type.
95 </md-tooltip>
96 </div>
Pablo Gamitoeac2e922020-06-02 14:28:19 +010097 <md-checkbox
98 v-model="showPropertiesDiff"
99 v-if="diffVisualizationAvailable"
100 >
101 Show Diff
102 </md-checkbox>
Pablo Gamito050e20b2020-07-01 16:41:56 +0100103 <md-field md-inline class="filter">
104 <label>Filter...</label>
Nataniel Borges39071542021-09-22 09:19:41 +0000105 <md-input
106 v-model="propertyFilterString"
107 v-on:focus="updateInputMode(true)"
108 v-on:blur="updateInputMode(false)"
109 />
Pablo Gamito050e20b2020-07-01 16:41:56 +0100110 </md-field>
111 </md-content>
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100112 <div class="properties-content">
113 <div v-if="elementSummary" class="element-summary">
114 <div v-for="elem in elementSummary" v-bind:key="elem.key">
Pablo Gamito246e6022020-09-17 12:50:45 +0200115 <!-- eslint-disable-next-line max-len -->
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100116 <span class="key">{{ elem.key }}:</span> <span class="value">{{ elem.value }}</span>
117 </div>
118 </div>
119 <div v-if="selectedTree" class="tree-view-wrapper">
120 <tree-view
121 class="treeview"
122 :item="selectedTree"
123 :filter="propertyFilter"
124 :collapseChildren="true"
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100125 :elementView="PropertiesTreeElement"
126 />
127 </div>
128 <div class="no-properties" v-else>
129 <i class="material-icons none-icon">
130 filter_none
131 </i>
Nataniel Borgesf230a132021-07-28 07:13:45 +0000132 <span>No element selected in the hierarchy.</span>
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100133 </div>
Pablo Gamito050e20b2020-07-01 16:41:56 +0100134 </div>
135 </flat-card>
136 </div>
137
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200138 </md-card-content>
139</template>
140<script>
Pablo Gamito246e6022020-09-17 12:50:45 +0200141import TreeView from './TreeView.vue';
142import Rects from './Rects.vue';
143import FlatCard from './components/FlatCard.vue';
144import PropertiesTreeElement from './PropertiesTreeElement.vue';
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200145
Pablo Gamito246e6022020-09-17 12:50:45 +0200146import {ObjectTransformer} from './transform.js';
147import {DiffGenerator, defaultModifiedCheck} from './utils/diff.js';
Pablo Gamito246e6022020-09-17 12:50:45 +0200148import {TRACE_TYPES, DUMP_TYPES} from './decode.js';
Nataniel Borges39071542021-09-22 09:19:41 +0000149import {isPropertyMatch, stableIdCompatibilityFixup} from './utils/utils.js';
Pablo Gamito246e6022020-09-17 12:50:45 +0200150import {CompatibleFeatures} from './utils/compatibility.js';
Nataniel Borgesf230a132021-07-28 07:13:45 +0000151import {getPropertiesForDisplay} from './flickerlib/mixin';
152import ObjectFormatter from './flickerlib/ObjectFormatter';
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200153
154function formatProto(obj) {
Nataniel Borgesc8415522021-04-23 15:05:54 +0200155 if (obj?.prettyPrint) {
156 return obj.prettyPrint();
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200157 }
158}
159
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100160function findEntryInTree(tree, id) {
161 if (tree.stableId === id) {
162 return tree;
163 }
164
165 if (!tree.children) {
166 return null;
167 }
168
169 for (const child of tree.children) {
170 const foundEntry = findEntryInTree(child, id);
171 if (foundEntry) {
172 return foundEntry;
173 }
174 }
175
176 return null;
177}
178
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200179export default {
180 name: 'traceview',
Nataniel Borges325b0472021-08-31 15:08:30 +0000181 props: ['store', 'file', 'summarizer', 'presentTags', 'presentErrors'],
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200182 data() {
183 return {
Pablo Gamito246e6022020-09-17 12:50:45 +0200184 propertyFilterString: '',
185 hierarchyPropertyFilterString: '',
Pablo Gamito4ffa6b82020-06-10 10:30:33 +0100186 selectedTree: null,
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200187 hierarchySelected: null,
188 lastSelectedStableId: null,
189 bounds: {},
190 rects: [],
Pablo Gamitoa8eeef82020-07-13 12:58:00 +0100191 item: null,
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200192 tree: null,
193 highlight: null,
Nataniel Borgesf230a132021-07-28 07:13:45 +0000194 showHierarchyDiff: false,
195 displayDefaults: false,
Pablo Gamitocdbcfad2020-07-17 10:44:30 +0100196 showPropertiesDiff: false,
Pablo Gamito06102a22020-07-23 14:25:24 +0100197 PropertiesTreeElement,
Pablo Gamito246e6022020-09-17 12:50:45 +0200198 };
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200199 },
200 methods: {
Nataniel Borgesf230a132021-07-28 07:13:45 +0000201 checkboxChange(checked) {
202 this.itemSelected(this.item);
203 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200204 itemSelected(item) {
205 this.hierarchySelected = item;
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100206 this.selectedTree = this.getTransformedProperties(item);
Pablo Gamito335b3e12020-07-17 12:36:18 +0100207 this.highlight = item.rect;
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200208 this.lastSelectedStableId = item.stableId;
209 this.$emit('focus');
210 },
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100211 getTransformedProperties(item) {
Nataniel Borgesf230a132021-07-28 07:13:45 +0000212 ObjectFormatter.displayDefaults = this.displayDefaults;
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100213 const transformer = new ObjectTransformer(
Nataniel Borgesf230a132021-07-28 07:13:45 +0000214 getPropertiesForDisplay(item),
Pablo Gamito246e6022020-09-17 12:50:45 +0200215 item.name,
216 stableIdCompatibilityFixup(item),
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100217 ).setOptions({
Pablo Gamito4c7d95c2020-07-03 16:06:40 +0100218 skip: item.skip,
219 formatter: formatProto,
220 });
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100221
Pablo Gamito33d3e862020-06-16 10:53:05 +0100222 if (this.showPropertiesDiff && this.diffVisualizationAvailable) {
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100223 const prevItem = this.getItemFromPrevTree(item);
Nataniel Borgesf230a132021-07-28 07:13:45 +0000224 transformer.withDiff(getPropertiesForDisplay(prevItem));
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100225 }
226
227 return transformer.transform();
228 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200229 onRectClick(item) {
230 if (item) {
231 this.itemSelected(item);
232 }
233 },
Pablo Gamitoa8eeef82020-07-13 12:58:00 +0100234 generateTreeFromItem(item) {
Nataniel Borgesf230a132021-07-28 07:13:45 +0000235 if (!this.showHierarchyDiff || !this.diffVisualizationAvailable) {
Pablo Gamitoa8eeef82020-07-13 12:58:00 +0100236 return item;
Pablo Gamitoe9ed4d52020-05-25 19:29:34 +0100237 }
238
Nataniel Borgesf230a132021-07-28 07:13:45 +0000239 const thisItem = this.item;
240 const prevItem = this.getDataWithOffset(-1);
241 return new DiffGenerator(thisItem)
242 .compareWith(prevItem)
Pablo Gamito246e6022020-09-17 12:50:45 +0200243 .withUniqueNodeId((node) => {
244 return node.stableId;
245 })
246 .withModifiedCheck(defaultModifiedCheck)
247 .generateDiffTree();
Pablo Gamitoa8eeef82020-07-13 12:58:00 +0100248 },
249 setData(item) {
250 this.item = item;
251 this.tree = this.generateTreeFromItem(item);
252
Nataniel Borgesf230a132021-07-28 07:13:45 +0000253 const rects = item.rects; // .toArray()
Nataniel Borges5e4ca352020-10-15 12:22:03 +0200254 this.rects = [...rects].reverse();
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200255 this.bounds = item.bounds;
256
257 this.hierarchySelected = null;
Pablo Gamito4ffa6b82020-06-10 10:30:33 +0100258 this.selectedTree = null;
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200259 this.highlight = null;
260
Pablo Gamito246e6022020-09-17 12:50:45 +0200261 function findItem(item, stableId) {
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200262 if (item.stableId === stableId) {
263 return item;
264 }
265 if (Array.isArray(item.children)) {
Pablo Gamito246e6022020-09-17 12:50:45 +0200266 for (const child of item.children) {
267 const found = findItem(child, stableId);
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200268 if (found) {
269 return found;
270 }
271 }
272 }
273 return null;
274 }
275
276 if (this.lastSelectedStableId) {
Pablo Gamito246e6022020-09-17 12:50:45 +0200277 const found = findItem(item, this.lastSelectedStableId);
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200278 if (found) {
279 this.itemSelected(found);
280 }
281 }
282 },
283 arrowUp() {
284 return this.$refs.hierarchy.selectPrev();
285 },
286 arrowDown() {
287 return this.$refs.hierarchy.selectNext();
288 },
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100289 getDataWithOffset(offset) {
290 const index = this.file.selectedIndex + offset;
291
292 if (index < 0 || index >= this.file.data.length) {
293 return null;
294 }
295
296 return this.file.data[index];
297 },
298 getItemFromPrevTree(entry) {
299 if (!this.showPropertiesDiff || !this.hierarchySelected) {
300 return null;
301 }
302
303 const id = entry.stableId;
304 if (!id) {
Pablo Gamito246e6022020-09-17 12:50:45 +0200305 throw new Error('Entry has no stableId...');
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100306 }
307
308 const prevTree = this.getDataWithOffset(-1);
309 if (!prevTree) {
Pablo Gamito246e6022020-09-17 12:50:45 +0200310 console.warn('No previous entry');
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100311 return null;
312 }
313
314 const prevEntry = findEntryInTree(prevTree, id);
315 if (!prevEntry) {
Pablo Gamito246e6022020-09-17 12:50:45 +0200316 console.warn('Didn\'t exist in last entry');
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100317 // TODO: Maybe handle this in some way.
318 }
319
320 return prevEntry;
Pablo Gamito246e6022020-09-17 12:50:45 +0200321 },
Nataniel Borges325b0472021-08-31 15:08:30 +0000322
323 /** Performs check for id match between entry and present tags/errors
324 * must be carried out for every present tag/error
325 */
326 matchItems(flickerItems, entryItem) {
327 var match = false;
328 flickerItems.forEach(flickerItem => {
Nataniel Borges39071542021-09-22 09:19:41 +0000329 if (isPropertyMatch(flickerItem, entryItem)) match = true;
Nataniel Borges325b0472021-08-31 15:08:30 +0000330 });
331 return match;
332 },
333 /** Returns check for id match between entry and present tags/errors */
334 isEntryTagMatch(entryItem) {
335 return this.matchItems(this.presentTags, entryItem) || this.matchItems(this.presentErrors, entryItem);
336 },
Nataniel Borges39071542021-09-22 09:19:41 +0000337
338 /** determines whether left/right arrow keys should move cursor in input field */
339 updateInputMode(isInputMode) {
340 this.store.isInputMode = isInputMode;
341 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200342 },
343 created() {
Pablo Gamitof25221c2020-08-06 18:26:42 +0100344 this.setData(this.file.data[this.file.selectedIndex ?? 0]);
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200345 },
Nataniel Borges325b0472021-08-31 15:08:30 +0000346 destroyed() {
347 this.store.flickerTraceView = false;
348 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200349 watch: {
350 selectedIndex() {
Pablo Gamitof25221c2020-08-06 18:26:42 +0100351 this.setData(this.file.data[this.file.selectedIndex ?? 0]);
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100352 },
Nataniel Borgesf230a132021-07-28 07:13:45 +0000353 showHierarchyDiff() {
Pablo Gamitoa8eeef82020-07-13 12:58:00 +0100354 this.tree = this.generateTreeFromItem(this.item);
355 },
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100356 showPropertiesDiff() {
357 if (this.hierarchySelected) {
Pablo Gamito246e6022020-09-17 12:50:45 +0200358 this.selectedTree =
359 this.getTransformedProperties(this.hierarchySelected);
Pablo Gamitoaa2c1332020-05-20 16:50:15 +0100360 }
Pablo Gamitoa8eeef82020-07-13 12:58:00 +0100361 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200362 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200363 computed: {
Pablo Gamitoeac2e922020-06-02 14:28:19 +0100364 diffVisualizationAvailable() {
365 return CompatibleFeatures.DiffVisualization && (
Pablo Gamito246e6022020-09-17 12:50:45 +0200366 this.file.type == TRACE_TYPES.WINDOW_MANAGER ||
Pablo Gamitof25221c2020-08-06 18:26:42 +0100367 this.file.type == TRACE_TYPES.SURFACE_FLINGER
Pablo Gamito246e6022020-09-17 12:50:45 +0200368 );
Pablo Gamitoeac2e922020-06-02 14:28:19 +0100369 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200370 selectedIndex() {
371 return this.file.selectedIndex;
372 },
373 hierarchyFilter() {
Pablo Gamito246e6022020-09-17 12:50:45 +0200374 const hierarchyPropertyFilter =
375 getFilter(this.hierarchyPropertyFilterString);
Nataniel Borges325b0472021-08-31 15:08:30 +0000376 var fil = this.store.onlyVisible ? (c) => {
Nataniel Borgesf230a132021-07-28 07:13:45 +0000377 return c.isVisible && hierarchyPropertyFilter(c);
Pablo Gamito246e6022020-09-17 12:50:45 +0200378 } : hierarchyPropertyFilter;
Nataniel Borges325b0472021-08-31 15:08:30 +0000379 return this.store.flickerTraceView ? (c) => {
380 return this.isEntryTagMatch(c);
381 } : fil;
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200382 },
383 propertyFilter() {
Vishnu Nairc778b9b2020-03-27 15:32:29 -0700384 return getFilter(this.propertyFilterString);
Adam Pardylf1af74f2019-09-16 12:18:15 +0200385 },
386 hasScreenView() {
Pablo Gamitof25221c2020-08-06 18:26:42 +0100387 return this.file.type == TRACE_TYPES.WINDOW_MANAGER ||
388 this.file.type == TRACE_TYPES.SURFACE_FLINGER ||
389 this.file.type == DUMP_TYPES.WINDOW_MANAGER ||
390 this.file.type == DUMP_TYPES.SURFACE_FLINGER;
Adam Pardylf1af74f2019-09-16 12:18:15 +0200391 },
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100392 elementSummary() {
393 if (!this.hierarchySelected || !this.summarizer) {
394 return null;
395 }
396
Pablo Gamito6fe08272020-09-17 12:50:45 +0200397 const summary = this.summarizer(this.hierarchySelected);
398
399 if (summary?.length === 0) {
400 return null;
401 }
402
403 return summary;
Pablo Gamito246e6022020-09-17 12:50:45 +0200404 },
Nataniel Borges325b0472021-08-31 15:08:30 +0000405 hasTagsOrErrors() {
406 return this.presentTags.length > 0 || this.presentErrors.length > 0;
407 },
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200408 },
409 components: {
410 'tree-view': TreeView,
411 'rects': Rects,
Pablo Gamito050e20b2020-07-01 16:41:56 +0100412 'flat-card': FlatCard,
Pablo Gamito246e6022020-09-17 12:50:45 +0200413 },
414};
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200415
Vishnu Nairc778b9b2020-03-27 15:32:29 -0700416function getFilter(filterString) {
Pablo Gamito246e6022020-09-17 12:50:45 +0200417 const filterStrings = filterString.split(',');
418 const positive = [];
419 const negative = [];
Vishnu Nairc778b9b2020-03-27 15:32:29 -0700420 filterStrings.forEach((f) => {
Pablo Gamito246e6022020-09-17 12:50:45 +0200421 if (f.startsWith('!')) {
422 const str = f.substring(1);
Vishnu Nairc778b9b2020-03-27 15:32:29 -0700423 negative.push((s) => s.indexOf(str) === -1);
424 } else {
Pablo Gamito246e6022020-09-17 12:50:45 +0200425 const str = f;
Vishnu Nairc778b9b2020-03-27 15:32:29 -0700426 positive.push((s) => s.indexOf(str) !== -1);
427 }
428 });
Pablo Gamito246e6022020-09-17 12:50:45 +0200429 const filter = (item) => {
430 const apply = (f) => f(String(item.name));
Vishnu Nairc778b9b2020-03-27 15:32:29 -0700431 return (positive.length === 0 || positive.some(apply)) &&
432 (negative.length === 0 || negative.every(apply));
433 };
434 return filter;
435}
436
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200437</script>
Pablo Gamito050e20b2020-07-01 16:41:56 +0100438<style scoped>
439.container {
440 display: flex;
441 flex-wrap: wrap;
442}
443
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200444.rects {
445 flex: none;
446 margin: 8px;
447}
448
449.hierarchy,
450.properties {
451 flex: 1;
452 margin: 8px;
453 min-width: 400px;
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100454 min-height: 50rem;
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200455}
456
Pablo Gamito050e20b2020-07-01 16:41:56 +0100457.rects,
458.hierarchy,
459.properties {
460 padding: 5px;
461}
462
463.flat-card {
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100464 display: flex;
465 flex-direction: column;
Pablo Gamito050e20b2020-07-01 16:41:56 +0100466 height: 100%;
467}
468
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200469.hierarchy>.tree-view,
470.properties>.tree-view {
471 margin: 16px;
472}
473
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100474.treeview {
Adam Pardyl41a5e822019-08-06 17:30:37 +0200475 overflow: auto;
Alec Mouric3457a02020-03-11 18:29:55 -0700476 white-space: pre-line;
477}
478
Pablo Gamito050e20b2020-07-01 16:41:56 +0100479.no-properties {
480 display: flex;
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100481 flex: 1;
Pablo Gamito050e20b2020-07-01 16:41:56 +0100482 flex-direction: column;
483 align-self: center;
484 align-items: center;
485 justify-content: center;
Pablo Gamito050e20b2020-07-01 16:41:56 +0100486 padding: 50px 25px;
487}
488
489.no-properties .none-icon {
490 font-size: 35px;
491 margin-bottom: 10px;
492}
493
494.no-properties span {
495 font-weight: 100;
496}
497
498.filter {
499 width: auto;
500}
501
Pablo Gamitocc299fc2020-08-04 11:30:13 +0100502.element-summary {
503 padding: 1rem;
504 border-bottom: thin solid rgba(0,0,0,.12);
505}
506
507.element-summary .key {
508 font-weight: 500;
509}
510
511.element-summary .value {
512 color: rgba(0, 0, 0, 0.75);
513}
514
515.properties-content {
516 display: flex;
517 flex-direction: column;
518 flex: 1;
519}
520
521.tree-view-wrapper {
522 display: flex;
523 flex-direction: column;
524 flex: 1;
525}
526
527.treeview {
528 flex: 1 0 0;
529}
Adam Pardyl367cc8c2019-07-16 12:20:13 +0200530</style>