@internetarchive/collection-browser 4.1.3-alpha-webdev8108.0 → 4.1.3-alpha-webdev8257.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 (41) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/src/app-root.d.ts +8 -0
  4. package/dist/src/app-root.js +31 -0
  5. package/dist/src/app-root.js.map +1 -1
  6. package/dist/src/collection-browser.d.ts +3 -0
  7. package/dist/src/collection-browser.js +33 -29
  8. package/dist/src/collection-browser.js.map +1 -1
  9. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  10. package/dist/src/models.js.map +1 -1
  11. package/dist/src/tiles/hover/hover-pane-controller.js +28 -28
  12. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
  13. package/dist/src/tiles/models.d.ts +14 -0
  14. package/dist/src/tiles/models.js.map +1 -1
  15. package/dist/src/tiles/tile-dispatcher.d.ts +12 -1
  16. package/dist/src/tiles/tile-dispatcher.js +330 -216
  17. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  18. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  19. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  20. package/dist/test/tiles/grid/item-tile.test.js +77 -77
  21. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  22. package/dist/test/tiles/list/tile-list.test.js +126 -126
  23. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  24. package/dist/test/tiles/tile-dispatcher.test.js +87 -87
  25. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  26. package/dist/test/tiles/tile-display-value-provider.test.js.map +1 -1
  27. package/index.ts +1 -0
  28. package/package.json +1 -1
  29. package/src/app-root.ts +35 -0
  30. package/src/collection-browser.ts +41 -38
  31. package/src/data-source/collection-browser-data-source.ts +1445 -1445
  32. package/src/models.ts +874 -874
  33. package/src/tiles/hover/hover-pane-controller.ts +628 -628
  34. package/src/tiles/models.ts +16 -0
  35. package/src/tiles/tile-dispatcher.ts +649 -527
  36. package/src/tiles/tile-display-value-provider.ts +124 -124
  37. package/test/mocks/mock-search-responses.ts +1364 -1364
  38. package/test/tiles/grid/item-tile.test.ts +520 -520
  39. package/test/tiles/list/tile-list.test.ts +552 -552
  40. package/test/tiles/tile-dispatcher.test.ts +300 -300
  41. package/test/tiles/tile-display-value-provider.test.ts +172 -172
@@ -2,6 +2,7 @@ var TileDispatcher_1;
2
2
  import { __decorate } from "tslib";
3
3
  import { css, html, nothing } from 'lit';
4
4
  import { customElement, property, query } from 'lit/decorators.js';
5
+ import { classMap } from 'lit/directives/class-map.js';
5
6
  import { ifDefined } from 'lit/directives/if-defined.js';
6
7
  import { msg } from '@lit/localize';
7
8
  import './grid/collection-tile';
@@ -41,6 +42,15 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
41
42
  /** Whether this tile should include a hover pane at all (for applicable tile modes) */
42
43
  this.enableHoverPane = false;
43
44
  this.manageCheckTitle = msg('Remove this item from the list');
45
+ /** Action buttons to display at the bottom of the tile (grid mode only) */
46
+ this.tileActions = [];
47
+ /**
48
+ * When the mouse enters the tile actions area, dispatch a synthetic mouseleave
49
+ * on the host to cancel the hover pane's show timer and hide any visible pane.
50
+ */
51
+ this.handleTileActionsMouseEnter = () => {
52
+ this.dispatchEvent(new MouseEvent('mouseleave', { bubbles: false }));
53
+ };
44
54
  }
45
55
  static { TileDispatcher_1 = this; }
46
56
  acquireFocus() {
@@ -58,14 +68,20 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
58
68
  }; }
59
69
  render() {
60
70
  const isGridMode = this.tileDisplayMode === 'grid';
71
+ const hasTileActions = isGridMode && this.showTileActions;
61
72
  const hoverPaneTemplate = this.hoverPaneController?.getTemplate() ?? nothing;
62
- return html `
63
- <div id="container" class=${isGridMode ? 'hoverable' : ''}>
73
+ const containerClasses = classMap({
74
+ hoverable: isGridMode,
75
+ 'has-tile-actions': hasTileActions,
76
+ });
77
+ return html `
78
+ <div id="container" class=${containerClasses}>
64
79
  ${this.tileDisplayMode === 'list-header'
65
80
  ? this.headerTemplate
66
- : this.tileTemplate}
67
- ${this.manageCheckTemplate} ${hoverPaneTemplate}
68
- </div>
81
+ : this.tileTemplate}
82
+ ${this.tileActionsTemplate} ${this.manageCheckTemplate}
83
+ ${hoverPaneTemplate}
84
+ </div>
69
85
  `;
70
86
  }
71
87
  firstUpdated() {
@@ -78,42 +94,42 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
78
94
  }
79
95
  get headerTemplate() {
80
96
  const { currentWidth, sortParam, defaultSortParam, mobileBreakpoint } = this;
81
- return html `
82
- <tile-list-compact-header
83
- class="header"
84
- .currentWidth=${currentWidth}
85
- .sortParam=${sortParam ?? defaultSortParam}
86
- .mobileBreakpoint=${mobileBreakpoint}
87
- >
88
- </tile-list-compact-header>
97
+ return html `
98
+ <tile-list-compact-header
99
+ class="header"
100
+ .currentWidth=${currentWidth}
101
+ .sortParam=${sortParam ?? defaultSortParam}
102
+ .mobileBreakpoint=${mobileBreakpoint}
103
+ >
104
+ </tile-list-compact-header>
89
105
  `;
90
106
  }
91
107
  get tileTemplate() {
92
- return html `
108
+ return html `
93
109
  ${this.tileDisplayMode === 'list-detail'
94
110
  ? this.tile
95
- : this.linkTileTemplate}
111
+ : this.linkTileTemplate}
96
112
  `;
97
113
  }
98
114
  get linkTileTemplate() {
99
- return html `
100
- <a
101
- href=${this.linkTileHref}
102
- aria-label=${this.model?.title ?? 'Untitled item'}
103
- aria-describedby="link-aria-description"
104
- aria-haspopup=${this.shouldPrepareHoverPane ? 'dialog' : 'false'}
115
+ return html `
116
+ <a
117
+ href=${this.linkTileHref}
118
+ aria-label=${this.model?.title ?? 'Untitled item'}
119
+ aria-describedby="link-aria-description"
120
+ aria-haspopup=${this.shouldPrepareHoverPane ? 'dialog' : 'false'}
105
121
  title=${this.shouldPrepareHoverPane
106
122
  ? nothing // Don't show title tooltips when we have the tile info popups
107
- : ifDefined(this.model?.title)}
108
- @click=${this.handleLinkClicked}
109
- @contextmenu=${this.handleLinkContextMenu}
110
- class="tile-link"
111
- >
112
- ${this.tile}
113
- </a>
114
- <div id="link-aria-description" class="sr-only">
115
- ${msg('Press Down Arrow to preview item details')}
116
- </div>
123
+ : ifDefined(this.model?.title)}
124
+ @click=${this.handleLinkClicked}
125
+ @contextmenu=${this.handleLinkContextMenu}
126
+ class="tile-link"
127
+ >
128
+ ${this.tile}
129
+ </a>
130
+ <div id="link-aria-description" class="sr-only">
131
+ ${msg('Press Down Arrow to preview item details')}
132
+ </div>
117
133
  `;
118
134
  }
119
135
  get linkTileHref() {
@@ -129,15 +145,15 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
129
145
  get manageCheckTemplate() {
130
146
  if (!this.isManageView || this.tileDisplayMode !== 'grid')
131
147
  return nothing;
132
- return html `
133
- <div class="manage-check">
134
- <input
135
- type="checkbox"
136
- title=${this.manageCheckTitle}
137
- ?checked=${this.model?.checked}
138
- @change=${this.handleLinkClicked}
139
- />
140
- </div>
148
+ return html `
149
+ <div class="manage-check">
150
+ <input
151
+ type="checkbox"
152
+ title=${this.manageCheckTitle}
153
+ ?checked=${this.model?.checked}
154
+ @change=${this.handleLinkClicked}
155
+ />
156
+ </div>
141
157
  `;
142
158
  }
143
159
  /**
@@ -226,6 +242,40 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
226
242
  enableTouchBackdrop: true,
227
243
  });
228
244
  }
245
+ /** Whether tile action buttons should be rendered */
246
+ get showTileActions() {
247
+ return (this.tileActions.length > 0 &&
248
+ !this.isManageView &&
249
+ this.tileDisplayMode === 'grid');
250
+ }
251
+ get tileActionsTemplate() {
252
+ if (!this.showTileActions)
253
+ return nothing;
254
+ return html `
255
+ <div
256
+ class="tile-actions"
257
+ @mouseenter=${this.handleTileActionsMouseEnter}
258
+ @mousemove=${(e) => e.stopPropagation()}
259
+ >
260
+ ${this.tileActions.map(action => html `
261
+ <button
262
+ class="tile-action-btn"
263
+ @click=${(e) => this.handleTileActionClick(e, action)}
264
+ >
265
+ ${action.label}
266
+ </button>
267
+ `)}
268
+ </div>
269
+ `;
270
+ }
271
+ handleTileActionClick(e, action) {
272
+ e.stopPropagation();
273
+ this.dispatchEvent(new CustomEvent('tileActionClicked', {
274
+ detail: { actionId: action.id, model: this.model },
275
+ bubbles: true,
276
+ composed: true,
277
+ }));
278
+ }
229
279
  get tile() {
230
280
  const { model, collectionPagePath, baseNavigationUrl, currentWidth, currentHeight, sortParam, creatorFilter, mobileBreakpoint, defaultSortParam, } = this;
231
281
  if (!model)
@@ -234,103 +284,103 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
234
284
  case 'grid':
235
285
  switch (model.mediatype) {
236
286
  case 'collection':
237
- return html `<collection-tile
238
- .model=${model}
239
- .collectionPagePath=${collectionPagePath}
240
- .baseImageUrl=${this.baseImageUrl}
241
- .currentWidth=${currentWidth}
242
- .currentHeight=${currentHeight}
243
- .creatorFilter=${creatorFilter}
244
- .suppressBlurring=${this.suppressBlurring}
245
- .isManageView=${this.isManageView}
246
- .layoutType=${this.layoutType}
247
- ?showInfoButton=${this.shouldShowInfoButton}
248
- @infoButtonPressed=${this.tileInfoButtonPressed}
249
- >
287
+ return html `<collection-tile
288
+ .model=${model}
289
+ .collectionPagePath=${collectionPagePath}
290
+ .baseImageUrl=${this.baseImageUrl}
291
+ .currentWidth=${currentWidth}
292
+ .currentHeight=${currentHeight}
293
+ .creatorFilter=${creatorFilter}
294
+ .suppressBlurring=${this.suppressBlurring}
295
+ .isManageView=${this.isManageView}
296
+ .layoutType=${this.layoutType}
297
+ ?showInfoButton=${this.shouldShowInfoButton}
298
+ @infoButtonPressed=${this.tileInfoButtonPressed}
299
+ >
250
300
  </collection-tile>`;
251
301
  case 'account':
252
- return html `<account-tile
253
- .model=${model}
254
- .collectionPagePath=${collectionPagePath}
255
- .baseImageUrl=${this.baseImageUrl}
256
- .currentWidth=${currentWidth}
257
- .currentHeight=${currentHeight}
258
- .creatorFilter=${creatorFilter}
259
- .suppressBlurring=${this.suppressBlurring}
260
- .isManageView=${this.isManageView}
261
- ?showInfoButton=${this.shouldShowInfoButton}
262
- @infoButtonPressed=${this.tileInfoButtonPressed}
263
- >
302
+ return html `<account-tile
303
+ .model=${model}
304
+ .collectionPagePath=${collectionPagePath}
305
+ .baseImageUrl=${this.baseImageUrl}
306
+ .currentWidth=${currentWidth}
307
+ .currentHeight=${currentHeight}
308
+ .creatorFilter=${creatorFilter}
309
+ .suppressBlurring=${this.suppressBlurring}
310
+ .isManageView=${this.isManageView}
311
+ ?showInfoButton=${this.shouldShowInfoButton}
312
+ @infoButtonPressed=${this.tileInfoButtonPressed}
313
+ >
264
314
  </account-tile>`;
265
315
  case 'search':
266
- return html `<search-tile
267
- .model=${model}
268
- .collectionPagePath=${collectionPagePath}
269
- .baseImageUrl=${this.baseImageUrl}
270
- .currentWidth=${currentWidth}
271
- .currentHeight=${currentHeight}
272
- .creatorFilter=${creatorFilter}
273
- .suppressBlurring=${this.suppressBlurring}
274
- .isManageView=${this.isManageView}
275
- ?showInfoButton=${false}
276
- @infoButtonPressed=${this.tileInfoButtonPressed}
277
- >
316
+ return html `<search-tile
317
+ .model=${model}
318
+ .collectionPagePath=${collectionPagePath}
319
+ .baseImageUrl=${this.baseImageUrl}
320
+ .currentWidth=${currentWidth}
321
+ .currentHeight=${currentHeight}
322
+ .creatorFilter=${creatorFilter}
323
+ .suppressBlurring=${this.suppressBlurring}
324
+ .isManageView=${this.isManageView}
325
+ ?showInfoButton=${false}
326
+ @infoButtonPressed=${this.tileInfoButtonPressed}
327
+ >
278
328
  </search-tile>`;
279
329
  default:
280
- return html `<item-tile
281
- .model=${model}
282
- .collectionPagePath=${collectionPagePath}
283
- .currentWidth=${this.currentWidth}
284
- .currentHeight=${this.currentHeight}
285
- .baseImageUrl=${this.baseImageUrl}
286
- .sortParam=${sortParam}
287
- .defaultSortParam=${defaultSortParam}
288
- .creatorFilter=${creatorFilter}
289
- .loggedIn=${this.loggedIn}
290
- .suppressBlurring=${this.suppressBlurring}
291
- .isManageView=${this.isManageView}
292
- .layoutType=${this.layoutType}
293
- ?showTvClips=${this.showTvClips}
294
- ?showInfoButton=${this.shouldShowInfoButton}
295
- ?useLocalTime=${this.useLocalTime}
296
- @infoButtonPressed=${this.tileInfoButtonPressed}
297
- >
330
+ return html `<item-tile
331
+ .model=${model}
332
+ .collectionPagePath=${collectionPagePath}
333
+ .currentWidth=${this.currentWidth}
334
+ .currentHeight=${this.currentHeight}
335
+ .baseImageUrl=${this.baseImageUrl}
336
+ .sortParam=${sortParam}
337
+ .defaultSortParam=${defaultSortParam}
338
+ .creatorFilter=${creatorFilter}
339
+ .loggedIn=${this.loggedIn}
340
+ .suppressBlurring=${this.suppressBlurring}
341
+ .isManageView=${this.isManageView}
342
+ .layoutType=${this.layoutType}
343
+ ?showTvClips=${this.showTvClips}
344
+ ?showInfoButton=${this.shouldShowInfoButton}
345
+ ?useLocalTime=${this.useLocalTime}
346
+ @infoButtonPressed=${this.tileInfoButtonPressed}
347
+ >
298
348
  </item-tile>`;
299
349
  }
300
350
  case 'list-compact':
301
- return html `<tile-list-compact
302
- .model=${model}
303
- .collectionPagePath=${collectionPagePath}
304
- .currentWidth=${currentWidth}
305
- .currentHeight=${currentHeight}
306
- .baseNavigationUrl=${baseNavigationUrl}
307
- .sortParam=${sortParam}
308
- .defaultSortParam=${defaultSortParam}
309
- .creatorFilter=${creatorFilter}
310
- .mobileBreakpoint=${mobileBreakpoint}
311
- .baseImageUrl=${this.baseImageUrl}
312
- .loggedIn=${this.loggedIn}
313
- .suppressBlurring=${this.suppressBlurring}
314
- ?useLocalTime=${this.useLocalTime}
315
- >
351
+ return html `<tile-list-compact
352
+ .model=${model}
353
+ .collectionPagePath=${collectionPagePath}
354
+ .currentWidth=${currentWidth}
355
+ .currentHeight=${currentHeight}
356
+ .baseNavigationUrl=${baseNavigationUrl}
357
+ .sortParam=${sortParam}
358
+ .defaultSortParam=${defaultSortParam}
359
+ .creatorFilter=${creatorFilter}
360
+ .mobileBreakpoint=${mobileBreakpoint}
361
+ .baseImageUrl=${this.baseImageUrl}
362
+ .loggedIn=${this.loggedIn}
363
+ .suppressBlurring=${this.suppressBlurring}
364
+ ?useLocalTime=${this.useLocalTime}
365
+ >
316
366
  </tile-list-compact>`;
317
367
  case 'list-detail':
318
- return html `<tile-list
319
- .model=${model}
320
- .collectionPagePath=${collectionPagePath}
321
- .collectionTitles=${this.collectionTitles}
322
- .currentWidth=${currentWidth}
323
- .currentHeight=${currentHeight}
324
- .baseNavigationUrl=${baseNavigationUrl}
325
- .sortParam=${sortParam}
326
- .defaultSortParam=${defaultSortParam}
327
- .creatorFilter=${creatorFilter}
328
- .mobileBreakpoint=${mobileBreakpoint}
329
- .baseImageUrl=${this.baseImageUrl}
330
- .loggedIn=${this.loggedIn}
331
- .suppressBlurring=${this.suppressBlurring}
332
- ?useLocalTime=${this.useLocalTime}
333
- >
368
+ return html `<tile-list
369
+ .model=${model}
370
+ .collectionPagePath=${collectionPagePath}
371
+ .collectionTitles=${this.collectionTitles}
372
+ .currentWidth=${currentWidth}
373
+ .currentHeight=${currentHeight}
374
+ .baseNavigationUrl=${baseNavigationUrl}
375
+ .sortParam=${sortParam}
376
+ .defaultSortParam=${defaultSortParam}
377
+ .creatorFilter=${creatorFilter}
378
+ .mobileBreakpoint=${mobileBreakpoint}
379
+ .baseImageUrl=${this.baseImageUrl}
380
+ .loggedIn=${this.loggedIn}
381
+ .suppressBlurring=${this.suppressBlurring}
382
+ ?useLocalTime=${this.useLocalTime}
383
+ >
334
384
  </tile-list>`;
335
385
  default:
336
386
  return nothing;
@@ -339,96 +389,157 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
339
389
  static get styles() {
340
390
  return [
341
391
  srOnlyStyle,
342
- css `
343
- :host {
344
- display: block;
345
- height: 100%;
346
- }
347
-
348
- collection-tile {
349
- --tileBorderColor: #555555;
350
- --tileBackgroundColor: #666666;
351
- --imageBlockBackgroundColor: #666666;
352
- }
353
-
354
- account-tile {
355
- --tileBorderColor: #dddddd;
356
- --imageBlockBackgroundColor: #fcf5e6;
357
- }
358
-
359
- item-tile {
360
- --tileBorderColor: #dddddd;
361
- --imageBlockBackgroundColor: #f1f1f4;
362
- }
363
-
364
- search-tile {
365
- --tileBorderColor: #555555;
366
- --tileBackgroundColor: #666666;
367
- --imageBlockBackgroundColor: #666666;
368
- --iconFillColor: #2c2c2c;
369
- }
370
-
371
- #container {
372
- position: relative;
373
- height: 100%;
374
- border-radius: 4px;
375
- }
376
-
377
- #container.hoverable a:focus,
378
- #container.hoverable a:hover {
379
- box-shadow: var(
380
- --tileHoverBoxShadow,
381
- 0 0 6px 2px rgba(8, 8, 32, 0.8)
382
- );
383
- transition: box-shadow 0.1s ease;
384
- }
385
-
386
- a {
387
- display: block;
388
- height: 100%;
389
- color: unset;
390
- text-decoration: none;
391
- transition: transform 0.05s ease;
392
- border-radius: 4px;
393
- outline: none;
394
- }
395
-
396
- a :first-child {
397
- display: block;
398
- height: 100%;
399
- }
400
-
401
- .manage-check {
402
- position: absolute;
403
- right: 0;
404
- top: 0;
405
- border: 5px solid #2c2c2c;
406
- border-radius: 3px;
407
- background-color: #2c2c2c;
408
- z-index: 1;
409
- }
410
-
411
- .manage-check > input[type='checkbox'] {
412
- display: block;
413
- margin: 0;
414
- }
415
-
416
- #touch-backdrop {
417
- position: fixed;
418
- width: 100vw;
419
- height: 100vh;
420
- top: 0;
421
- left: 0;
422
- z-index: 2;
423
- background: transparent;
424
- }
425
-
426
- tile-hover-pane {
427
- position: absolute;
428
- top: 0;
429
- left: -9999px;
430
- z-index: 2;
431
- }
392
+ css `
393
+ :host {
394
+ display: block;
395
+ height: 100%;
396
+ }
397
+
398
+ collection-tile {
399
+ --tileBorderColor: #555555;
400
+ --tileBackgroundColor: #666666;
401
+ --imageBlockBackgroundColor: #666666;
402
+ }
403
+
404
+ account-tile {
405
+ --tileBorderColor: #dddddd;
406
+ --imageBlockBackgroundColor: #fcf5e6;
407
+ }
408
+
409
+ item-tile {
410
+ --tileBorderColor: #dddddd;
411
+ --imageBlockBackgroundColor: #f1f1f4;
412
+ }
413
+
414
+ search-tile {
415
+ --tileBorderColor: #555555;
416
+ --tileBackgroundColor: #666666;
417
+ --imageBlockBackgroundColor: #666666;
418
+ --iconFillColor: #2c2c2c;
419
+ }
420
+
421
+ #container {
422
+ position: relative;
423
+ height: 100%;
424
+ border-radius: 4px;
425
+ }
426
+
427
+ /*
428
+ * When tile actions are present, the container becomes the visual "card"
429
+ * so that the tile content and action buttons appear as one unified element.
430
+ */
431
+ /*
432
+ * When tile actions are present, the container takes over the tile's
433
+ * border-radius and box-shadow so that the action bar appears as part
434
+ * of the same card. The inner tile's own shadow/radius are disabled
435
+ * via CSS variable overrides so there is no visual duplication.
436
+ */
437
+ #container.has-tile-actions {
438
+ display: flex;
439
+ flex-direction: column;
440
+ overflow: hidden;
441
+ box-shadow: var(--tileShadow, 1px 1px 2px 0);
442
+ --tileBoxShadow: none;
443
+ --tileCornerRadius: 0;
444
+ }
445
+
446
+ #container.has-tile-actions .tile-link {
447
+ flex: 1;
448
+ min-height: 0;
449
+ overflow: hidden;
450
+ border-radius: 0;
451
+ }
452
+
453
+ /* Move hover shadow to container level when tile actions are present */
454
+ #container.hoverable:not(.has-tile-actions) a:focus,
455
+ #container.hoverable:not(.has-tile-actions) a:hover {
456
+ box-shadow: var(
457
+ --tileHoverBoxShadow,
458
+ 0 0 6px 2px rgba(8, 8, 32, 0.8)
459
+ );
460
+ transition: box-shadow 0.1s ease;
461
+ }
462
+
463
+ #container.hoverable.has-tile-actions:hover {
464
+ box-shadow: var(
465
+ --tileHoverBoxShadow,
466
+ 0 0 6px 2px rgba(8, 8, 32, 0.8)
467
+ );
468
+ transition: box-shadow 0.1s ease;
469
+ }
470
+
471
+ a {
472
+ display: block;
473
+ height: 100%;
474
+ color: unset;
475
+ text-decoration: none;
476
+ transition: transform 0.05s ease;
477
+ border-radius: 4px;
478
+ outline: none;
479
+ }
480
+
481
+ a :first-child {
482
+ display: block;
483
+ height: 100%;
484
+ }
485
+
486
+ .manage-check {
487
+ position: absolute;
488
+ right: 0;
489
+ top: 0;
490
+ border: 5px solid #2c2c2c;
491
+ border-radius: 3px;
492
+ background-color: #2c2c2c;
493
+ z-index: 1;
494
+ }
495
+
496
+ .manage-check > input[type='checkbox'] {
497
+ display: block;
498
+ margin: 0;
499
+ }
500
+
501
+ #touch-backdrop {
502
+ position: fixed;
503
+ width: 100vw;
504
+ height: 100vh;
505
+ top: 0;
506
+ left: 0;
507
+ z-index: 2;
508
+ background: transparent;
509
+ }
510
+
511
+ tile-hover-pane {
512
+ position: absolute;
513
+ top: 0;
514
+ left: -9999px;
515
+ z-index: 2;
516
+ }
517
+
518
+ .tile-actions {
519
+ flex-shrink: 0;
520
+ display: flex;
521
+ border-top: 1px solid var(--tileActionSeparatorColor, #ddd);
522
+ }
523
+
524
+ .tile-action-btn {
525
+ flex: 1;
526
+ padding: 8px;
527
+ border: none;
528
+ border-radius: 0;
529
+ font-size: 1.2rem;
530
+ cursor: pointer;
531
+ color: var(--tileActionColor, #333);
532
+ background: var(--tileActionBg, #fff);
533
+ transition: background 0.15s;
534
+ }
535
+
536
+ .tile-action-btn + .tile-action-btn {
537
+ border-left: 1px solid var(--tileActionSeparatorColor, #ddd);
538
+ }
539
+
540
+ .tile-action-btn:hover {
541
+ background: var(--tileActionHoverBg, #f0f0f0);
542
+ }
432
543
  `,
433
544
  ];
434
545
  }
@@ -457,6 +568,9 @@ __decorate([
457
568
  __decorate([
458
569
  property({ type: String })
459
570
  ], TileDispatcher.prototype, "manageCheckTitle", void 0);
571
+ __decorate([
572
+ property({ type: Array })
573
+ ], TileDispatcher.prototype, "tileActions", void 0);
460
574
  __decorate([
461
575
  query('#container')
462
576
  ], TileDispatcher.prototype, "container", void 0);