@internetarchive/collection-browser 0.3.5-alpha.1 → 0.3.5

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 (236) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +47 -43
  12. package/dist/src/app-root.js +331 -285
  13. package/dist/src/app-root.js.map +1 -1
  14. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  15. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  17. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  18. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  19. package/dist/src/assets/img/icons/chevron.js +2 -2
  20. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  21. package/dist/src/assets/img/icons/empty-query.js +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  23. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  24. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  25. package/dist/src/assets/img/icons/eye.js +2 -2
  26. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  27. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  28. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  29. package/dist/src/assets/img/icons/login-required.js +2 -2
  30. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  31. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  32. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  33. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  34. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  35. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  36. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  37. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  38. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  39. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  40. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  41. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  42. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  43. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  44. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  45. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  46. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  47. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  48. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  49. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  50. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  51. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  52. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  53. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  54. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  55. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  56. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  57. package/dist/src/assets/img/icons/null-result.js +2 -2
  58. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  59. package/dist/src/assets/img/icons/restricted.js +2 -2
  60. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  61. package/dist/src/assets/img/icons/reviews.js +2 -2
  62. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  63. package/dist/src/assets/img/icons/upload.js +2 -2
  64. package/dist/src/assets/img/icons/views.d.ts +1 -1
  65. package/dist/src/assets/img/icons/views.js +2 -2
  66. package/dist/src/circular-activity-indicator.d.ts +5 -5
  67. package/dist/src/circular-activity-indicator.js +17 -17
  68. package/dist/src/collection-browser.d.ts +246 -245
  69. package/dist/src/collection-browser.js +1370 -1359
  70. package/dist/src/collection-browser.js.map +1 -1
  71. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  72. package/dist/src/collection-facets/facet-tombstone-row.js +42 -42
  73. package/dist/src/collection-facets/facet-tombstone-row.js.map +1 -1
  74. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  75. package/dist/src/collection-facets/facets-template.js +130 -128
  76. package/dist/src/collection-facets/facets-template.js.map +1 -1
  77. package/dist/src/collection-facets/more-facets-content.d.ts +76 -76
  78. package/dist/src/collection-facets/more-facets-content.js +353 -353
  79. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  80. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  81. package/dist/src/collection-facets.d.ts +77 -77
  82. package/dist/src/collection-facets.js +551 -551
  83. package/dist/src/collection-facets.js.map +1 -1
  84. package/dist/src/empty-placeholder.d.ts +11 -11
  85. package/dist/src/empty-placeholder.js +42 -42
  86. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  87. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  88. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  89. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  90. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  91. package/dist/src/mediatype/mediatype-config.js +85 -85
  92. package/dist/src/models.d.ts +103 -102
  93. package/dist/src/models.js +117 -117
  94. package/dist/src/models.js.map +1 -1
  95. package/dist/src/restoration-state-handler.d.ts +46 -45
  96. package/dist/src/restoration-state-handler.js +230 -220
  97. package/dist/src/restoration-state-handler.js.map +1 -1
  98. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -9
  99. package/dist/src/sort-filter-bar/alpha-bar.js +41 -41
  100. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  101. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  102. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  103. package/dist/src/sort-filter-bar/img/list.js +2 -2
  104. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  105. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  106. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  107. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  108. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +107 -107
  109. package/dist/src/sort-filter-bar/sort-filter-bar.js +423 -423
  110. package/dist/src/styles/item-image-styles.d.ts +8 -8
  111. package/dist/src/styles/item-image-styles.js +9 -9
  112. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  113. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  114. package/dist/src/tiles/grid/account-tile.d.ts +8 -8
  115. package/dist/src/tiles/grid/account-tile.js +20 -20
  116. package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
  117. package/dist/src/tiles/grid/collection-tile.js +23 -23
  118. package/dist/src/tiles/grid/item-tile.d.ts +24 -24
  119. package/dist/src/tiles/grid/item-tile.js +87 -87
  120. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  121. package/dist/src/tiles/grid/tile-stats.js +46 -40
  122. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  123. package/dist/src/tiles/image-block.d.ts +17 -17
  124. package/dist/src/tiles/image-block.js +69 -69
  125. package/dist/src/tiles/item-image.d.ts +31 -31
  126. package/dist/src/tiles/item-image.js +103 -103
  127. package/dist/src/tiles/list/account-label.d.ts +1 -1
  128. package/dist/src/tiles/list/account-label.js +6 -6
  129. package/dist/src/tiles/list/date-label.d.ts +1 -1
  130. package/dist/src/tiles/list/date-label.js +12 -12
  131. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  132. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  133. package/dist/src/tiles/list/tile-list-compact.d.ts +21 -20
  134. package/dist/src/tiles/list/tile-list-compact.js +94 -90
  135. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  136. package/dist/src/tiles/list/tile-list.d.ts +50 -50
  137. package/dist/src/tiles/list/tile-list.js +271 -268
  138. package/dist/src/tiles/list/tile-list.js.map +1 -1
  139. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  140. package/dist/src/tiles/mediatype-icon.js +49 -47
  141. package/dist/src/tiles/mediatype-icon.js.map +1 -1
  142. package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -7
  143. package/dist/src/tiles/overlay/icon-overlay.js +30 -30
  144. package/dist/src/tiles/overlay/text-overlay.d.ts +8 -8
  145. package/dist/src/tiles/overlay/text-overlay.js +31 -31
  146. package/dist/src/tiles/text-snippet-block.d.ts +29 -29
  147. package/dist/src/tiles/text-snippet-block.js +81 -81
  148. package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
  149. package/dist/src/tiles/tile-dispatcher.js +128 -128
  150. package/dist/src/utils/analytics-events.d.ts +22 -22
  151. package/dist/src/utils/analytics-events.js +24 -24
  152. package/dist/src/utils/format-count.d.ts +7 -7
  153. package/dist/src/utils/format-count.js +76 -76
  154. package/dist/src/utils/format-date.d.ts +2 -2
  155. package/dist/src/utils/format-date.js +23 -23
  156. package/dist/test/collection-browser.test.d.ts +1 -1
  157. package/dist/test/collection-browser.test.js +481 -415
  158. package/dist/test/collection-browser.test.js.map +1 -1
  159. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  160. package/dist/test/collection-facets/facets-template.test.js +62 -62
  161. package/dist/test/collection-facets/facets-template.test.js.map +1 -1
  162. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  163. package/dist/test/collection-facets/more-facets-content.test.js +114 -114
  164. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  165. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  166. package/dist/test/collection-facets.test.d.ts +2 -2
  167. package/dist/test/collection-facets.test.js +498 -498
  168. package/dist/test/empty-placeholder.test.d.ts +1 -1
  169. package/dist/test/empty-placeholder.test.js +33 -33
  170. package/dist/test/icon-overlay.test.d.ts +1 -1
  171. package/dist/test/icon-overlay.test.js +24 -24
  172. package/dist/test/image-block.test.d.ts +1 -1
  173. package/dist/test/image-block.test.js +48 -48
  174. package/dist/test/item-image.test.d.ts +1 -1
  175. package/dist/test/item-image.test.js +56 -56
  176. package/dist/test/mediatype-config.test.d.ts +1 -1
  177. package/dist/test/mediatype-config.test.js +16 -16
  178. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  179. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  180. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  181. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  182. package/dist/test/mocks/mock-search-responses.d.ts +8 -8
  183. package/dist/test/mocks/mock-search-responses.js +198 -198
  184. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  185. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  186. package/dist/test/mocks/mock-search-service.js +32 -32
  187. package/dist/test/mocks/mock-search-service.js.map +1 -1
  188. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  189. package/dist/test/restoration-state-handler.test.js +126 -117
  190. package/dist/test/restoration-state-handler.test.js.map +1 -1
  191. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  192. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +113 -113
  193. package/dist/test/text-overlay.test.d.ts +1 -1
  194. package/dist/test/text-overlay.test.js +41 -41
  195. package/dist/test/text-snippet-block.test.d.ts +1 -1
  196. package/dist/test/text-snippet-block.test.js +57 -57
  197. package/dist/test/tile-stats.test.d.ts +1 -1
  198. package/dist/test/tile-stats.test.js +33 -33
  199. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  200. package/dist/test/tiles/grid/item-tile.test.js +107 -107
  201. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  202. package/dist/test/tiles/list/tile-list-compact.test.js +125 -26
  203. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -1
  204. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  205. package/dist/test/tiles/list/tile-list.test.js +79 -47
  206. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  207. package/dist/test/utils/format-count.test.d.ts +1 -1
  208. package/dist/test/utils/format-count.test.js +23 -23
  209. package/dist/test/utils/format-date.test.d.ts +1 -1
  210. package/dist/test/utils/format-date.test.js +17 -17
  211. package/index.html +24 -24
  212. package/local.archive.org.cert +86 -86
  213. package/local.archive.org.key +27 -27
  214. package/package.json +115 -115
  215. package/renovate.json +6 -6
  216. package/src/app-root.ts +104 -55
  217. package/src/collection-browser.ts +1503 -1488
  218. package/src/collection-facets/facet-tombstone-row.ts +40 -40
  219. package/src/collection-facets/facets-template.ts +5 -3
  220. package/src/collection-facets.ts +635 -635
  221. package/src/models.ts +1 -0
  222. package/src/restoration-state-handler.ts +19 -1
  223. package/src/tiles/grid/tile-stats.ts +18 -5
  224. package/src/tiles/list/tile-list-compact.ts +7 -3
  225. package/src/tiles/list/tile-list.ts +6 -1
  226. package/src/tiles/mediatype-icon.ts +2 -0
  227. package/test/collection-browser.test.ts +679 -599
  228. package/test/collection-facets/facets-template.test.ts +5 -3
  229. package/test/mocks/mock-search-responses.ts +226 -226
  230. package/test/mocks/mock-search-service.ts +61 -61
  231. package/test/restoration-state-handler.test.ts +12 -0
  232. package/test/tiles/list/tile-list-compact.test.ts +110 -0
  233. package/test/tiles/list/tile-list.test.ts +36 -0
  234. package/tsconfig.json +21 -21
  235. package/web-dev-server.config.mjs +30 -30
  236. package/web-test-runner.config.mjs +41 -41
package/src/app-root.ts CHANGED
@@ -5,6 +5,7 @@ import {
5
5
  } from '@internetarchive/analytics-manager';
6
6
  import {
7
7
  SearchService,
8
+ SearchServiceInterface,
8
9
  SearchType,
9
10
  StringField,
10
11
  } from '@internetarchive/search-service';
@@ -22,7 +23,8 @@ import '../src/collection-browser';
22
23
 
23
24
  @customElement('app-root')
24
25
  export class AppRoot extends LitElement {
25
- private searchService = SearchService.default;
26
+ private searchService: SearchServiceInterface =
27
+ this.initSearchServiceFromUrlParams();
26
28
 
27
29
  private resizeObserver = new SharedResizeObserver();
28
30
 
@@ -73,6 +75,15 @@ export class AppRoot extends LitElement {
73
75
  this.analyticsManager?.sendEventNoSampling(ae);
74
76
  }
75
77
 
78
+ private initSearchServiceFromUrlParams() {
79
+ const params = new URL(window.location.href).searchParams;
80
+ return new SearchService({
81
+ baseUrl: params.get('search_base_url') ?? undefined,
82
+ servicePath: params.get('search_service_path') ?? undefined,
83
+ debuggingEnabled: !!params.get('debugging') ?? undefined,
84
+ });
85
+ }
86
+
76
87
  private searchPressed(e: Event) {
77
88
  e.preventDefault();
78
89
  this.searchQuery = this.baseQueryField.value;
@@ -122,23 +133,28 @@ export class AppRoot extends LitElement {
122
133
 
123
134
  <div id="search-types">
124
135
  Search type:
125
- <input
126
- type="radio"
127
- id="metadata-search"
128
- name="search-type"
129
- value="metadata"
130
- checked
131
- @click=${this.searchTypeChanged}
132
- />
133
- <label for="metadata-search">Metadata</label>
134
- <input
135
- type="radio"
136
- id="fulltext-search"
137
- name="search-type"
138
- value="fulltext"
139
- @click=${this.searchTypeChanged}
140
- />
141
- <label for="fulltext-search">Full text</label>
136
+ <span class="search-type">
137
+ <input
138
+ type="radio"
139
+ id="metadata-search"
140
+ name="search-type"
141
+ value="metadata"
142
+ ?checked=${this.searchType === SearchType.METADATA}
143
+ @click=${this.searchTypeSelected}
144
+ />
145
+ <label for="metadata-search">Metadata</label>
146
+ </span>
147
+ <span class="search-type">
148
+ <input
149
+ type="radio"
150
+ id="fulltext-search"
151
+ name="search-type"
152
+ value="fulltext"
153
+ ?checked=${this.searchType === SearchType.FULLTEXT}
154
+ @click=${this.searchTypeSelected}
155
+ />
156
+ <label for="fulltext-search">Full text</label>
157
+ </span>
142
158
  </div>
143
159
 
144
160
  <div id="toggle-controls">
@@ -176,7 +192,7 @@ export class AppRoot extends LitElement {
176
192
  <div id="cell-controls" class="hidden">
177
193
  <div id="cell-size-control">
178
194
  <div>
179
- <label for="cell-width-slider">Minimum cell width:</label>
195
+ <label for="cell-width-slider">Min cell width:</label>
180
196
  <input
181
197
  type="range"
182
198
  min="10"
@@ -201,40 +217,6 @@ export class AppRoot extends LitElement {
201
217
  />
202
218
  <span>${this.cellHeight}rem</span>
203
219
  </div>
204
- <div>
205
- <label for="show-outline-check">Show outlines:</label>
206
- <input
207
- type="checkbox"
208
- id="show-outline-check"
209
- @click=${this.outlineChanged}
210
- />
211
- </div>
212
- <div>
213
- <label for="show-facet-group-outline-check"
214
- >Show Facet Group Outlines:</label
215
- >
216
- <input
217
- type="checkbox"
218
- id="show-facet-group-outline-check"
219
- @click=${this.toggleFacetGroupOutline}
220
- />
221
- </div>
222
- <div>
223
- <label for="simulate-login">Simulate Login:</label>
224
- <input
225
- type="checkbox"
226
- id="simulate-login"
227
- @click=${this.loginChanged}
228
- />
229
- </div>
230
- <div>
231
- <label for="show-dummy-snippets">Show dummy snippets:</label>
232
- <input
233
- type="checkbox"
234
- id="show-dummy-snippets"
235
- @click=${this.snippetsChanged}
236
- />
237
- </div>
238
220
  </div>
239
221
  <div id="cell-gap-control">
240
222
  <div>
@@ -265,6 +247,42 @@ export class AppRoot extends LitElement {
265
247
  </div>
266
248
  </div>
267
249
  </div>
250
+ <div id="checkbox-controls">
251
+ <div class="checkbox-control">
252
+ <input
253
+ type="checkbox"
254
+ id="show-outline-check"
255
+ @click=${this.outlineChanged}
256
+ />
257
+ <label for="show-outline-check">Show cell outlines</label>
258
+ </div>
259
+ <div class="checkbox-control">
260
+ <input
261
+ type="checkbox"
262
+ id="show-facet-group-outline-check"
263
+ @click=${this.toggleFacetGroupOutline}
264
+ />
265
+ <label for="show-facet-group-outline-check">
266
+ Show facet group outlines
267
+ </label>
268
+ </div>
269
+ <div class="checkbox-control">
270
+ <input
271
+ type="checkbox"
272
+ id="simulate-login"
273
+ @click=${this.loginChanged}
274
+ />
275
+ <label for="simulate-login">Simulate login</label>
276
+ </div>
277
+ <div class="checkbox-control">
278
+ <input
279
+ type="checkbox"
280
+ id="show-dummy-snippets"
281
+ @click=${this.snippetsChanged}
282
+ />
283
+ <label for="show-dummy-snippets">Show dummy snippets</label>
284
+ </div>
285
+ </div>
268
286
  </div>
269
287
 
270
288
  <div id="collection-browser-container">
@@ -281,6 +299,7 @@ export class AppRoot extends LitElement {
281
299
  .analyticsHandler=${this.analyticsHandler}
282
300
  @visiblePageChanged=${this.visiblePageChanged}
283
301
  @baseQueryChanged=${this.baseQueryChanged}
302
+ @searchTypeChanged=${this.searchTypeChanged}
284
303
  >
285
304
  </collection-browser>
286
305
  </div>
@@ -288,11 +307,17 @@ export class AppRoot extends LitElement {
288
307
  `;
289
308
  }
290
309
 
291
- private baseQueryChanged(e: CustomEvent<{ baseQuery?: string }>) {
310
+ private baseQueryChanged(e: CustomEvent<{ baseQuery?: string }>): void {
292
311
  this.searchQuery = e.detail.baseQuery;
293
312
  }
294
313
 
295
- private searchTypeChanged(e: Event) {
314
+ /** Handler for search type changes coming from collection browser */
315
+ private searchTypeChanged(e: CustomEvent<SearchType>): void {
316
+ this.searchType = e.detail;
317
+ }
318
+
319
+ /** Handler for user input selecting a search type */
320
+ private searchTypeSelected(e: Event) {
296
321
  const target = e.target as HTMLInputElement;
297
322
  this.searchType =
298
323
  target.value === 'fulltext' ? SearchType.FULLTEXT : SearchType.METADATA;
@@ -494,8 +519,17 @@ export class AppRoot extends LitElement {
494
519
  display: flex;
495
520
  }
496
521
 
522
+ #search-and-page-inputs > form {
523
+ margin-right: 1rem;
524
+ }
525
+
526
+ .search-type {
527
+ margin-right: 1rem;
528
+ }
529
+
497
530
  #cell-controls {
498
531
  display: flex;
532
+ flex-wrap: wrap;
499
533
  }
500
534
 
501
535
  #cell-controls label {
@@ -503,10 +537,25 @@ export class AppRoot extends LitElement {
503
537
  width: 10rem;
504
538
  }
505
539
 
540
+ #cell-size-control,
541
+ #cell-gap-control {
542
+ flex-basis: calc(50% - 1rem);
543
+ flex-grow: 1;
544
+ }
545
+
506
546
  #cell-gap-control {
507
547
  margin-left: 1rem;
508
548
  }
509
549
 
550
+ #checkbox-controls {
551
+ padding-top: 0.5rem;
552
+ flex-wrap: wrap;
553
+ }
554
+
555
+ .checkbox-control {
556
+ flex-basis: 50%;
557
+ }
558
+
510
559
  #last-event {
511
560
  background-color: aliceblue;
512
561
  padding: 5px;