@internetarchive/collection-browser 4.5.0 → 4.5.1-alpha-webdev8221.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 (70) hide show
  1. package/dist/index.js.map +1 -1
  2. package/dist/src/app-root.js +683 -683
  3. package/dist/src/app-root.js.map +1 -1
  4. package/dist/src/collection-browser.d.ts +0 -4
  5. package/dist/src/collection-browser.js +767 -776
  6. package/dist/src/collection-browser.js.map +1 -1
  7. package/dist/src/collection-facets/facet-row.js +143 -143
  8. package/dist/src/collection-facets/facet-row.js.map +1 -1
  9. package/dist/src/collection-facets/facets-template.js +24 -24
  10. package/dist/src/collection-facets/facets-template.js.map +1 -1
  11. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +5 -0
  12. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
  13. package/dist/src/data-source/collection-browser-data-source.d.ts +1 -1
  14. package/dist/src/data-source/collection-browser-data-source.js +8 -6
  15. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  16. package/dist/src/restoration-state-handler.js +2 -4
  17. package/dist/src/restoration-state-handler.js.map +1 -1
  18. package/dist/src/styles/tile-action-styles.js +43 -43
  19. package/dist/src/styles/tile-action-styles.js.map +1 -1
  20. package/dist/src/tiles/base-tile-component.js +11 -11
  21. package/dist/src/tiles/base-tile-component.js.map +1 -1
  22. package/dist/src/tiles/grid/item-tile.js +138 -138
  23. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  24. package/dist/src/tiles/list/tile-list-compact-header.js +62 -62
  25. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
  26. package/dist/src/tiles/list/tile-list-compact.js +123 -123
  27. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  28. package/dist/src/tiles/list/tile-list.js +310 -310
  29. package/dist/src/tiles/list/tile-list.js.map +1 -1
  30. package/dist/src/tiles/models.js.map +1 -1
  31. package/dist/src/tiles/tile-dispatcher.js +286 -286
  32. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  33. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  34. package/dist/src/utils/date-filter-field.d.ts +6 -0
  35. package/dist/src/utils/date-filter-field.js +9 -0
  36. package/dist/src/utils/date-filter-field.js.map +1 -0
  37. package/dist/test/collection-browser.test.js +81 -0
  38. package/dist/test/collection-browser.test.js.map +1 -1
  39. package/dist/test/collection-facets/facet-row.test.js +31 -31
  40. package/dist/test/collection-facets/facet-row.test.js.map +1 -1
  41. package/dist/test/tiles/grid/item-tile.test.js +77 -77
  42. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  43. package/dist/test/tiles/list/tile-list.test.js +134 -134
  44. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  45. package/dist/test/tiles/tile-dispatcher.test.js +92 -92
  46. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  47. package/index.ts +29 -29
  48. package/package.json +1 -1
  49. package/src/app-root.ts +1284 -1284
  50. package/src/collection-browser.ts +3165 -3176
  51. package/src/collection-facets/facet-row.ts +309 -309
  52. package/src/collection-facets/facets-template.ts +85 -85
  53. package/src/data-source/collection-browser-data-source-interface.ts +6 -0
  54. package/src/data-source/collection-browser-data-source.ts +16 -7
  55. package/src/restoration-state-handler.ts +5 -5
  56. package/src/styles/tile-action-styles.ts +59 -59
  57. package/src/tiles/base-tile-component.ts +124 -124
  58. package/src/tiles/grid/item-tile.ts +347 -347
  59. package/src/tiles/list/tile-list-compact-header.ts +112 -112
  60. package/src/tiles/list/tile-list-compact.ts +278 -278
  61. package/src/tiles/list/tile-list.ts +718 -718
  62. package/src/tiles/models.ts +21 -21
  63. package/src/tiles/tile-dispatcher.ts +637 -637
  64. package/src/tiles/tile-display-value-provider.ts +133 -133
  65. package/src/utils/date-filter-field.ts +11 -0
  66. package/test/collection-browser.test.ts +132 -0
  67. package/test/collection-facets/facet-row.test.ts +421 -421
  68. package/test/tiles/grid/item-tile.test.ts +520 -520
  69. package/test/tiles/list/tile-list.test.ts +576 -576
  70. package/test/tiles/tile-dispatcher.test.ts +320 -320
@@ -75,14 +75,14 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
75
75
  hoverable: isGridMode,
76
76
  'has-tile-actions': hasTileActions,
77
77
  });
78
- return html `
79
- <div id="container" class=${containerClasses}>
78
+ return html `
79
+ <div id="container" class=${containerClasses}>
80
80
  ${this.tileDisplayMode === 'list-header'
81
81
  ? this.headerTemplate
82
- : this.tileTemplate}
83
- ${this.gridTileActionsTemplate} ${this.manageCheckTemplate}
84
- ${hoverPaneTemplate}
85
- </div>
82
+ : this.tileTemplate}
83
+ ${this.gridTileActionsTemplate} ${this.manageCheckTemplate}
84
+ ${hoverPaneTemplate}
85
+ </div>
86
86
  `;
87
87
  }
88
88
  firstUpdated() {
@@ -95,43 +95,43 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
95
95
  }
96
96
  get headerTemplate() {
97
97
  const { currentWidth, sortParam, defaultSortParam, mobileBreakpoint } = this;
98
- return html `
99
- <tile-list-compact-header
100
- class="header"
101
- .currentWidth=${currentWidth}
102
- .sortParam=${sortParam ?? defaultSortParam}
103
- .mobileBreakpoint=${mobileBreakpoint}
104
- .tileActions=${this.tileActions}
105
- >
106
- </tile-list-compact-header>
98
+ return html `
99
+ <tile-list-compact-header
100
+ class="header"
101
+ .currentWidth=${currentWidth}
102
+ .sortParam=${sortParam ?? defaultSortParam}
103
+ .mobileBreakpoint=${mobileBreakpoint}
104
+ .tileActions=${this.tileActions}
105
+ >
106
+ </tile-list-compact-header>
107
107
  `;
108
108
  }
109
109
  get tileTemplate() {
110
- return html `
110
+ return html `
111
111
  ${this.tileDisplayMode === 'list-detail'
112
112
  ? this.tile
113
- : this.linkTileTemplate}
113
+ : this.linkTileTemplate}
114
114
  `;
115
115
  }
116
116
  get linkTileTemplate() {
117
- return html `
118
- <a
119
- href=${this.linkTileHref}
120
- aria-label=${this.model?.title ?? 'Untitled item'}
121
- aria-describedby="link-aria-description"
122
- aria-haspopup=${this.shouldPrepareHoverPane ? 'dialog' : 'false'}
117
+ return html `
118
+ <a
119
+ href=${this.linkTileHref}
120
+ aria-label=${this.model?.title ?? 'Untitled item'}
121
+ aria-describedby="link-aria-description"
122
+ aria-haspopup=${this.shouldPrepareHoverPane ? 'dialog' : 'false'}
123
123
  title=${this.shouldPrepareHoverPane
124
124
  ? nothing // Don't show title tooltips when we have the tile info popups
125
- : ifDefined(this.model?.title)}
126
- @click=${this.handleLinkClicked}
127
- @contextmenu=${this.handleLinkContextMenu}
128
- class="tile-link"
129
- >
130
- ${this.tile}
131
- </a>
132
- <div id="link-aria-description" class="sr-only">
133
- ${msg('Press Down Arrow to preview item details')}
134
- </div>
125
+ : ifDefined(this.model?.title)}
126
+ @click=${this.handleLinkClicked}
127
+ @contextmenu=${this.handleLinkContextMenu}
128
+ class="tile-link"
129
+ >
130
+ ${this.tile}
131
+ </a>
132
+ <div id="link-aria-description" class="sr-only">
133
+ ${msg('Press Down Arrow to preview item details')}
134
+ </div>
135
135
  `;
136
136
  }
137
137
  get linkTileHref() {
@@ -147,15 +147,15 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
147
147
  get manageCheckTemplate() {
148
148
  if (!this.isManageView || this.tileDisplayMode !== 'grid')
149
149
  return nothing;
150
- return html `
151
- <div class="manage-check">
152
- <input
153
- type="checkbox"
154
- title=${this.manageCheckTitle}
155
- ?checked=${this.model?.checked}
156
- @change=${this.handleLinkClicked}
157
- />
158
- </div>
150
+ return html `
151
+ <div class="manage-check">
152
+ <input
153
+ type="checkbox"
154
+ title=${this.manageCheckTitle}
155
+ ?checked=${this.model?.checked}
156
+ @change=${this.handleLinkClicked}
157
+ />
158
+ </div>
159
159
  `;
160
160
  }
161
161
  /**
@@ -258,21 +258,21 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
258
258
  get gridTileActionsTemplate() {
259
259
  if (!this.showGridTileActions)
260
260
  return nothing;
261
- return html `
262
- <div
263
- class="tile-actions grid-tile-actions"
264
- @mouseenter=${this.handleGridActionsMouseEnter}
265
- @mousemove=${(e) => e.stopPropagation()}
266
- >
267
- ${this.tileActions.map(action => html `
268
- <button
269
- class="tile-action-btn"
270
- @click=${(e) => this.handleTileActionClick(e, action)}
271
- >
272
- ${action.label}
273
- </button>
274
- `)}
275
- </div>
261
+ return html `
262
+ <div
263
+ class="tile-actions grid-tile-actions"
264
+ @mouseenter=${this.handleGridActionsMouseEnter}
265
+ @mousemove=${(e) => e.stopPropagation()}
266
+ >
267
+ ${this.tileActions.map(action => html `
268
+ <button
269
+ class="tile-action-btn"
270
+ @click=${(e) => this.handleTileActionClick(e, action)}
271
+ >
272
+ ${action.label}
273
+ </button>
274
+ `)}
275
+ </div>
276
276
  `;
277
277
  }
278
278
  get tile() {
@@ -283,105 +283,105 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
283
283
  case 'grid':
284
284
  switch (model.mediatype) {
285
285
  case 'collection':
286
- return html `<collection-tile
287
- .model=${model}
288
- .collectionPagePath=${collectionPagePath}
289
- .baseImageUrl=${this.baseImageUrl}
290
- .currentWidth=${currentWidth}
291
- .currentHeight=${currentHeight}
292
- .creatorFilter=${creatorFilter}
293
- .suppressBlurring=${this.suppressBlurring}
294
- .isManageView=${this.isManageView}
295
- .layoutType=${this.layoutType}
296
- ?showInfoButton=${this.shouldShowInfoButton}
297
- @infoButtonPressed=${this.tileInfoButtonPressed}
298
- >
286
+ return html `<collection-tile
287
+ .model=${model}
288
+ .collectionPagePath=${collectionPagePath}
289
+ .baseImageUrl=${this.baseImageUrl}
290
+ .currentWidth=${currentWidth}
291
+ .currentHeight=${currentHeight}
292
+ .creatorFilter=${creatorFilter}
293
+ .suppressBlurring=${this.suppressBlurring}
294
+ .isManageView=${this.isManageView}
295
+ .layoutType=${this.layoutType}
296
+ ?showInfoButton=${this.shouldShowInfoButton}
297
+ @infoButtonPressed=${this.tileInfoButtonPressed}
298
+ >
299
299
  </collection-tile>`;
300
300
  case 'account':
301
- return html `<account-tile
302
- .model=${model}
303
- .collectionPagePath=${collectionPagePath}
304
- .baseImageUrl=${this.baseImageUrl}
305
- .currentWidth=${currentWidth}
306
- .currentHeight=${currentHeight}
307
- .creatorFilter=${creatorFilter}
308
- .suppressBlurring=${this.suppressBlurring}
309
- .isManageView=${this.isManageView}
310
- ?showInfoButton=${this.shouldShowInfoButton}
311
- @infoButtonPressed=${this.tileInfoButtonPressed}
312
- >
301
+ return html `<account-tile
302
+ .model=${model}
303
+ .collectionPagePath=${collectionPagePath}
304
+ .baseImageUrl=${this.baseImageUrl}
305
+ .currentWidth=${currentWidth}
306
+ .currentHeight=${currentHeight}
307
+ .creatorFilter=${creatorFilter}
308
+ .suppressBlurring=${this.suppressBlurring}
309
+ .isManageView=${this.isManageView}
310
+ ?showInfoButton=${this.shouldShowInfoButton}
311
+ @infoButtonPressed=${this.tileInfoButtonPressed}
312
+ >
313
313
  </account-tile>`;
314
314
  case 'search':
315
- return html `<search-tile
316
- .model=${model}
317
- .collectionPagePath=${collectionPagePath}
318
- .baseImageUrl=${this.baseImageUrl}
319
- .currentWidth=${currentWidth}
320
- .currentHeight=${currentHeight}
321
- .creatorFilter=${creatorFilter}
322
- .suppressBlurring=${this.suppressBlurring}
323
- .isManageView=${this.isManageView}
324
- ?showInfoButton=${false}
325
- @infoButtonPressed=${this.tileInfoButtonPressed}
326
- >
315
+ return html `<search-tile
316
+ .model=${model}
317
+ .collectionPagePath=${collectionPagePath}
318
+ .baseImageUrl=${this.baseImageUrl}
319
+ .currentWidth=${currentWidth}
320
+ .currentHeight=${currentHeight}
321
+ .creatorFilter=${creatorFilter}
322
+ .suppressBlurring=${this.suppressBlurring}
323
+ .isManageView=${this.isManageView}
324
+ ?showInfoButton=${false}
325
+ @infoButtonPressed=${this.tileInfoButtonPressed}
326
+ >
327
327
  </search-tile>`;
328
328
  default:
329
- return html `<item-tile
330
- .model=${model}
331
- .collectionPagePath=${collectionPagePath}
332
- .currentWidth=${this.currentWidth}
333
- .currentHeight=${this.currentHeight}
334
- .baseImageUrl=${this.baseImageUrl}
335
- .sortParam=${sortParam}
336
- .defaultSortParam=${defaultSortParam}
337
- .creatorFilter=${creatorFilter}
338
- .loggedIn=${this.loggedIn}
339
- .suppressBlurring=${this.suppressBlurring}
340
- .isManageView=${this.isManageView}
341
- .layoutType=${this.layoutType}
342
- ?showTvClips=${this.showTvClips}
343
- ?showInfoButton=${this.shouldShowInfoButton}
344
- ?useLocalTime=${this.useLocalTime}
345
- @infoButtonPressed=${this.tileInfoButtonPressed}
346
- >
329
+ return html `<item-tile
330
+ .model=${model}
331
+ .collectionPagePath=${collectionPagePath}
332
+ .currentWidth=${this.currentWidth}
333
+ .currentHeight=${this.currentHeight}
334
+ .baseImageUrl=${this.baseImageUrl}
335
+ .sortParam=${sortParam}
336
+ .defaultSortParam=${defaultSortParam}
337
+ .creatorFilter=${creatorFilter}
338
+ .loggedIn=${this.loggedIn}
339
+ .suppressBlurring=${this.suppressBlurring}
340
+ .isManageView=${this.isManageView}
341
+ .layoutType=${this.layoutType}
342
+ ?showTvClips=${this.showTvClips}
343
+ ?showInfoButton=${this.shouldShowInfoButton}
344
+ ?useLocalTime=${this.useLocalTime}
345
+ @infoButtonPressed=${this.tileInfoButtonPressed}
346
+ >
347
347
  </item-tile>`;
348
348
  }
349
349
  case 'list-compact':
350
- return html `<tile-list-compact
351
- .model=${model}
352
- .collectionPagePath=${collectionPagePath}
353
- .currentWidth=${currentWidth}
354
- .currentHeight=${currentHeight}
355
- .baseNavigationUrl=${baseNavigationUrl}
356
- .sortParam=${sortParam}
357
- .defaultSortParam=${defaultSortParam}
358
- .creatorFilter=${creatorFilter}
359
- .mobileBreakpoint=${mobileBreakpoint}
360
- .baseImageUrl=${this.baseImageUrl}
361
- .loggedIn=${this.loggedIn}
362
- .suppressBlurring=${this.suppressBlurring}
363
- .tileActions=${this.isManageView ? [] : this.tileActions}
364
- ?useLocalTime=${this.useLocalTime}
365
- >
350
+ return html `<tile-list-compact
351
+ .model=${model}
352
+ .collectionPagePath=${collectionPagePath}
353
+ .currentWidth=${currentWidth}
354
+ .currentHeight=${currentHeight}
355
+ .baseNavigationUrl=${baseNavigationUrl}
356
+ .sortParam=${sortParam}
357
+ .defaultSortParam=${defaultSortParam}
358
+ .creatorFilter=${creatorFilter}
359
+ .mobileBreakpoint=${mobileBreakpoint}
360
+ .baseImageUrl=${this.baseImageUrl}
361
+ .loggedIn=${this.loggedIn}
362
+ .suppressBlurring=${this.suppressBlurring}
363
+ .tileActions=${this.isManageView ? [] : this.tileActions}
364
+ ?useLocalTime=${this.useLocalTime}
365
+ >
366
366
  </tile-list-compact>`;
367
367
  case 'list-detail':
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
- .tileActions=${this.isManageView ? [] : this.tileActions}
383
- ?useLocalTime=${this.useLocalTime}
384
- >
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
+ .tileActions=${this.isManageView ? [] : this.tileActions}
383
+ ?useLocalTime=${this.useLocalTime}
384
+ >
385
385
  </tile-list>`;
386
386
  default:
387
387
  return nothing;
@@ -391,147 +391,147 @@ let TileDispatcher = class TileDispatcher extends BaseTileComponent {
391
391
  return [
392
392
  srOnlyStyle,
393
393
  tileActionStyles,
394
- css `
395
- :host {
396
- display: block;
397
- height: 100%;
398
- }
399
-
400
- collection-tile {
401
- --tileBorderColor: #555555;
402
- --tileBackgroundColor: #666666;
403
- --imageBlockBackgroundColor: #666666;
404
- }
405
-
406
- account-tile {
407
- --tileBorderColor: #dddddd;
408
- --imageBlockBackgroundColor: #fcf5e6;
409
- }
410
-
411
- item-tile {
412
- --tileBorderColor: #dddddd;
413
- --imageBlockBackgroundColor: #f1f1f4;
414
- }
415
-
416
- search-tile {
417
- --tileBorderColor: #555555;
418
- --tileBackgroundColor: #666666;
419
- --imageBlockBackgroundColor: #666666;
420
- --iconFillColor: #2c2c2c;
421
- }
422
-
423
- #container {
424
- position: relative;
425
- height: 100%;
426
- border-radius: 4px;
427
- }
428
-
429
- /*
430
- * When tile actions are present, the container takes on the role of
431
- * the tile's visual card so the tile content and action row appear
432
- * as a single unified element. The inner tile's own shadow/radius
433
- * are disabled via CSS variable overrides to avoid visual
434
- * duplication, and the action row sits as a footer inside the same
435
- * card.
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
- /* Normal hover shadow lives on the inner anchor for plain tiles */
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
- /*
464
- * When the container owns the card visuals, the hover shadow needs
465
- * to move up to the container so it wraps the action row too.
466
- */
467
- #container.hoverable.has-tile-actions:hover {
468
- box-shadow: var(
469
- --tileHoverBoxShadow,
470
- 0 0 6px 2px rgba(8, 8, 32, 0.8)
471
- );
472
- transition: box-shadow 0.1s ease;
473
- }
474
-
475
- a {
476
- display: block;
477
- height: 100%;
478
- color: unset;
479
- text-decoration: none;
480
- transition: transform 0.05s ease;
481
- border-radius: 4px;
482
- outline: none;
483
- }
484
-
485
- a :first-child {
486
- display: block;
487
- height: 100%;
488
- }
489
-
490
- .manage-check {
491
- position: absolute;
492
- right: 0;
493
- top: 0;
494
- border: 5px solid #2c2c2c;
495
- border-radius: 3px;
496
- background-color: #2c2c2c;
497
- z-index: 1;
498
- }
499
-
500
- .manage-check > input[type='checkbox'] {
501
- display: block;
502
- margin: 0;
503
- }
504
-
505
- #touch-backdrop {
506
- position: fixed;
507
- width: 100vw;
508
- height: 100vh;
509
- top: 0;
510
- left: 0;
511
- z-index: 2;
512
- background: transparent;
513
- }
514
-
515
- tile-hover-pane {
516
- position: absolute;
517
- top: 0;
518
- left: -9999px;
519
- z-index: 2;
520
- }
521
-
522
- /*
523
- * Grid-mode action row sits flush against the bottom of the card —
524
- * the buttons' own borders form the visible bottom edge. The outer
525
- * buttons get rounded bottom corners to match the container so the
526
- * red border traces cleanly around the card's bottom corners.
527
- */
528
- .grid-tile-actions .tile-action-btn:first-child {
529
- border-bottom-left-radius: 4px;
530
- }
531
-
532
- .grid-tile-actions .tile-action-btn:last-child {
533
- border-bottom-right-radius: 4px;
534
- }
394
+ css `
395
+ :host {
396
+ display: block;
397
+ height: 100%;
398
+ }
399
+
400
+ collection-tile {
401
+ --tileBorderColor: #555555;
402
+ --tileBackgroundColor: #666666;
403
+ --imageBlockBackgroundColor: #666666;
404
+ }
405
+
406
+ account-tile {
407
+ --tileBorderColor: #dddddd;
408
+ --imageBlockBackgroundColor: #fcf5e6;
409
+ }
410
+
411
+ item-tile {
412
+ --tileBorderColor: #dddddd;
413
+ --imageBlockBackgroundColor: #f1f1f4;
414
+ }
415
+
416
+ search-tile {
417
+ --tileBorderColor: #555555;
418
+ --tileBackgroundColor: #666666;
419
+ --imageBlockBackgroundColor: #666666;
420
+ --iconFillColor: #2c2c2c;
421
+ }
422
+
423
+ #container {
424
+ position: relative;
425
+ height: 100%;
426
+ border-radius: 4px;
427
+ }
428
+
429
+ /*
430
+ * When tile actions are present, the container takes on the role of
431
+ * the tile's visual card so the tile content and action row appear
432
+ * as a single unified element. The inner tile's own shadow/radius
433
+ * are disabled via CSS variable overrides to avoid visual
434
+ * duplication, and the action row sits as a footer inside the same
435
+ * card.
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
+ /* Normal hover shadow lives on the inner anchor for plain tiles */
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
+ /*
464
+ * When the container owns the card visuals, the hover shadow needs
465
+ * to move up to the container so it wraps the action row too.
466
+ */
467
+ #container.hoverable.has-tile-actions:hover {
468
+ box-shadow: var(
469
+ --tileHoverBoxShadow,
470
+ 0 0 6px 2px rgba(8, 8, 32, 0.8)
471
+ );
472
+ transition: box-shadow 0.1s ease;
473
+ }
474
+
475
+ a {
476
+ display: block;
477
+ height: 100%;
478
+ color: unset;
479
+ text-decoration: none;
480
+ transition: transform 0.05s ease;
481
+ border-radius: 4px;
482
+ outline: none;
483
+ }
484
+
485
+ a :first-child {
486
+ display: block;
487
+ height: 100%;
488
+ }
489
+
490
+ .manage-check {
491
+ position: absolute;
492
+ right: 0;
493
+ top: 0;
494
+ border: 5px solid #2c2c2c;
495
+ border-radius: 3px;
496
+ background-color: #2c2c2c;
497
+ z-index: 1;
498
+ }
499
+
500
+ .manage-check > input[type='checkbox'] {
501
+ display: block;
502
+ margin: 0;
503
+ }
504
+
505
+ #touch-backdrop {
506
+ position: fixed;
507
+ width: 100vw;
508
+ height: 100vh;
509
+ top: 0;
510
+ left: 0;
511
+ z-index: 2;
512
+ background: transparent;
513
+ }
514
+
515
+ tile-hover-pane {
516
+ position: absolute;
517
+ top: 0;
518
+ left: -9999px;
519
+ z-index: 2;
520
+ }
521
+
522
+ /*
523
+ * Grid-mode action row sits flush against the bottom of the card —
524
+ * the buttons' own borders form the visible bottom edge. The outer
525
+ * buttons get rounded bottom corners to match the container so the
526
+ * red border traces cleanly around the card's bottom corners.
527
+ */
528
+ .grid-tile-actions .tile-action-btn:first-child {
529
+ border-bottom-left-radius: 4px;
530
+ }
531
+
532
+ .grid-tile-actions .tile-action-btn:last-child {
533
+ border-bottom-right-radius: 4px;
534
+ }
535
535
  `,
536
536
  ];
537
537
  }