xref: /aosp_15_r20/external/perfetto/ui/src/widgets/grid_layout.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport m from 'mithril';
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker// GridLayout is a container that arranges elements into a two-column grid when
18*6dbdd20aSAndroid Build Coastguard Worker// the screen is wide, and a single column when the screen is narrow.
19*6dbdd20aSAndroid Build Coastguard Worker// Consider the following layout (where A, B, C, and D are arbitrary components)
20*6dbdd20aSAndroid Build Coastguard Worker//   m(GridLayout, A, B, C, D)
21*6dbdd20aSAndroid Build Coastguard Worker//
22*6dbdd20aSAndroid Build Coastguard Worker// On a wide screen we get:
23*6dbdd20aSAndroid Build Coastguard Worker// ┌─────────┐ ┌─────────┐
24*6dbdd20aSAndroid Build Coastguard Worker// │    A    │ │    B    │
25*6dbdd20aSAndroid Build Coastguard Worker// │         │ └─────────┘
26*6dbdd20aSAndroid Build Coastguard Worker// │         │
27*6dbdd20aSAndroid Build Coastguard Worker// └─────────┘
28*6dbdd20aSAndroid Build Coastguard Worker// ┌─────────┐ ┌─────────┐
29*6dbdd20aSAndroid Build Coastguard Worker// │    C    │ │    D    │
30*6dbdd20aSAndroid Build Coastguard Worker// │         │ │         │
31*6dbdd20aSAndroid Build Coastguard Worker// │         │ └─────────┘
32*6dbdd20aSAndroid Build Coastguard Worker// └─────────┘
33*6dbdd20aSAndroid Build Coastguard Worker//
34*6dbdd20aSAndroid Build Coastguard Worker// And on a narrow screen we get:
35*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
36*6dbdd20aSAndroid Build Coastguard Worker// │  A  │
37*6dbdd20aSAndroid Build Coastguard Worker// │     │
38*6dbdd20aSAndroid Build Coastguard Worker// │     │
39*6dbdd20aSAndroid Build Coastguard Worker// └─────┘
40*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
41*6dbdd20aSAndroid Build Coastguard Worker// │  B  │
42*6dbdd20aSAndroid Build Coastguard Worker// └────-┘
43*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
44*6dbdd20aSAndroid Build Coastguard Worker// │  C  │
45*6dbdd20aSAndroid Build Coastguard Worker// │     │
46*6dbdd20aSAndroid Build Coastguard Worker// │     │
47*6dbdd20aSAndroid Build Coastguard Worker// └─────┘
48*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
49*6dbdd20aSAndroid Build Coastguard Worker// │  D  │
50*6dbdd20aSAndroid Build Coastguard Worker// │     │
51*6dbdd20aSAndroid Build Coastguard Worker// └─────┘
52*6dbdd20aSAndroid Build Coastguard Workerexport class GridLayout implements m.ClassComponent {
53*6dbdd20aSAndroid Build Coastguard Worker  view({children}: m.Vnode) {
54*6dbdd20aSAndroid Build Coastguard Worker    return m('div.pf-grid-layout', children);
55*6dbdd20aSAndroid Build Coastguard Worker  }
56*6dbdd20aSAndroid Build Coastguard Worker}
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard Worker// ColumnLayouts can be used inside a GridLayout to group elements together
59*6dbdd20aSAndroid Build Coastguard Worker// vertically and to acheive a more aesthetically pleasing vertical spacing of
60*6dbdd20aSAndroid Build Coastguard Worker// elements in the same column.
61*6dbdd20aSAndroid Build Coastguard Worker// Consider the same example from above but instead the elements are placed
62*6dbdd20aSAndroid Build Coastguard Worker// inside columns.
63*6dbdd20aSAndroid Build Coastguard Worker//   m(GridLayout, m(Column, A, C), m(Column, B, D))
64*6dbdd20aSAndroid Build Coastguard Worker//
65*6dbdd20aSAndroid Build Coastguard Worker// On a wide screen we get:
66*6dbdd20aSAndroid Build Coastguard Worker// ┌─────────┐ ┌─────────┐
67*6dbdd20aSAndroid Build Coastguard Worker// │    A    │ │    B    │
68*6dbdd20aSAndroid Build Coastguard Worker// │         │ └─────────┘
69*6dbdd20aSAndroid Build Coastguard Worker// │         │ ┌─────────┐ <- This gap has disappeared
70*6dbdd20aSAndroid Build Coastguard Worker// └─────────┘ │    D    │
71*6dbdd20aSAndroid Build Coastguard Worker// ┌─────────┐ │         │
72*6dbdd20aSAndroid Build Coastguard Worker// │    C    │ └─────────┘
73*6dbdd20aSAndroid Build Coastguard Worker// │         │
74*6dbdd20aSAndroid Build Coastguard Worker// │         │
75*6dbdd20aSAndroid Build Coastguard Worker// └─────────┘
76*6dbdd20aSAndroid Build Coastguard Worker//
77*6dbdd20aSAndroid Build Coastguard Worker// And on a narrow screen we get:
78*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
79*6dbdd20aSAndroid Build Coastguard Worker// │  A  │
80*6dbdd20aSAndroid Build Coastguard Worker// │     │
81*6dbdd20aSAndroid Build Coastguard Worker// │     │
82*6dbdd20aSAndroid Build Coastguard Worker// └─────┘
83*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
84*6dbdd20aSAndroid Build Coastguard Worker// │  C  │
85*6dbdd20aSAndroid Build Coastguard Worker// │     │
86*6dbdd20aSAndroid Build Coastguard Worker// │     │
87*6dbdd20aSAndroid Build Coastguard Worker// └─────┘
88*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
89*6dbdd20aSAndroid Build Coastguard Worker// │  B  │
90*6dbdd20aSAndroid Build Coastguard Worker// └────-┘
91*6dbdd20aSAndroid Build Coastguard Worker// ┌─────┐
92*6dbdd20aSAndroid Build Coastguard Worker// │  D  │
93*6dbdd20aSAndroid Build Coastguard Worker// │     │
94*6dbdd20aSAndroid Build Coastguard Worker// └─────┘
95*6dbdd20aSAndroid Build Coastguard Worker//
96*6dbdd20aSAndroid Build Coastguard Worker// The gap between column elements are the same size as the gaps in the grid
97*6dbdd20aSAndroid Build Coastguard Worker// layout, so we get keep spacing between all elements in the grid.
98*6dbdd20aSAndroid Build Coastguard Workerexport class GridLayoutColumn implements m.ClassComponent {
99*6dbdd20aSAndroid Build Coastguard Worker  view({children}: m.Vnode) {
100*6dbdd20aSAndroid Build Coastguard Worker    return m('div.pf-grid-layout-column', children);
101*6dbdd20aSAndroid Build Coastguard Worker  }
102*6dbdd20aSAndroid Build Coastguard Worker}
103