@internetarchive/collection-browser 4.5.1-alpha-webdev8221.0 → 4.5.1

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 (63) 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.js +766 -766
  5. package/dist/src/collection-browser.js.map +1 -1
  6. package/dist/src/collection-facets/facet-row.js +143 -143
  7. package/dist/src/collection-facets/facet-row.js.map +1 -1
  8. package/dist/src/collection-facets/facets-template.js +24 -24
  9. package/dist/src/collection-facets/facets-template.js.map +1 -1
  10. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
  11. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  12. package/dist/src/restoration-state-handler.js.map +1 -1
  13. package/dist/src/styles/tile-action-styles.js +43 -43
  14. package/dist/src/styles/tile-action-styles.js.map +1 -1
  15. package/dist/src/tiles/base-tile-component.js +11 -11
  16. package/dist/src/tiles/base-tile-component.js.map +1 -1
  17. package/dist/src/tiles/grid/item-tile.js +138 -138
  18. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  19. package/dist/src/tiles/list/tile-list-compact-header.js +62 -62
  20. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
  21. package/dist/src/tiles/list/tile-list-compact.js +123 -123
  22. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  23. package/dist/src/tiles/list/tile-list.js +310 -310
  24. package/dist/src/tiles/list/tile-list.js.map +1 -1
  25. package/dist/src/tiles/models.js.map +1 -1
  26. package/dist/src/tiles/tile-dispatcher.js +286 -286
  27. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  28. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  29. package/dist/src/utils/date-filter-field.js.map +1 -1
  30. package/dist/test/collection-browser.test.js +203 -203
  31. package/dist/test/collection-browser.test.js.map +1 -1
  32. package/dist/test/collection-facets/facet-row.test.js +31 -31
  33. package/dist/test/collection-facets/facet-row.test.js.map +1 -1
  34. package/dist/test/tiles/grid/item-tile.test.js +77 -77
  35. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  36. package/dist/test/tiles/list/tile-list.test.js +134 -134
  37. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  38. package/dist/test/tiles/tile-dispatcher.test.js +92 -92
  39. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  40. package/index.ts +29 -29
  41. package/package.json +1 -1
  42. package/src/app-root.ts +1284 -1284
  43. package/src/collection-browser.ts +3165 -3165
  44. package/src/collection-facets/facet-row.ts +309 -309
  45. package/src/collection-facets/facets-template.ts +85 -85
  46. package/src/data-source/collection-browser-data-source-interface.ts +351 -351
  47. package/src/data-source/collection-browser-data-source.ts +1474 -1474
  48. package/src/restoration-state-handler.ts +550 -550
  49. package/src/styles/tile-action-styles.ts +59 -59
  50. package/src/tiles/base-tile-component.ts +124 -124
  51. package/src/tiles/grid/item-tile.ts +347 -347
  52. package/src/tiles/list/tile-list-compact-header.ts +112 -112
  53. package/src/tiles/list/tile-list-compact.ts +278 -278
  54. package/src/tiles/list/tile-list.ts +718 -718
  55. package/src/tiles/models.ts +21 -21
  56. package/src/tiles/tile-dispatcher.ts +637 -637
  57. package/src/tiles/tile-display-value-provider.ts +133 -133
  58. package/src/utils/date-filter-field.ts +11 -11
  59. package/test/collection-browser.test.ts +2639 -2639
  60. package/test/collection-facets/facet-row.test.ts +421 -421
  61. package/test/tiles/grid/item-tile.test.ts +520 -520
  62. package/test/tiles/list/tile-list.test.ts +576 -576
  63. 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
  }