@internetarchive/collection-browser 4.5.2 → 4.7.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 (480) hide show
  1. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/.editorconfig +29 -0
  2. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/.github/workflows/ci.yml +27 -0
  3. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/.github/workflows/gh-pages-main.yml +39 -0
  4. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/.github/workflows/npm-publish.yml +39 -0
  5. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/.github/workflows/pr-preview.yml +38 -0
  6. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/.husky/pre-commit +1 -0
  7. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/.prettierignore +1 -0
  8. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/LICENSE +661 -0
  9. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/README.md +84 -0
  10. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/eslint.config.mjs +53 -0
  11. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/index.html +24 -0
  12. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/index.ts +29 -0
  13. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/local.archive.org.cert +86 -0
  14. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/local.archive.org.key +27 -0
  15. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/package.json +120 -0
  16. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/renovate.json +6 -0
  17. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/app-root.ts +1284 -0
  18. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/arrow-left.ts +10 -0
  19. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/arrow-right.ts +10 -0
  20. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/chevron.ts +4 -0
  21. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/close-circle-dark.ts +5 -0
  22. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/contract.ts +9 -0
  23. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/empty-query.ts +5 -0
  24. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/expand.ts +9 -0
  25. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/eye-closed.ts +5 -0
  26. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/eye.ts +5 -0
  27. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/favorite-filled.ts +10 -0
  28. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/favorite-unfilled.ts +9 -0
  29. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/filter.ts +10 -0
  30. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/login-required.ts +18 -0
  31. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/account.ts +14 -0
  32. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/audio.ts +14 -0
  33. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/collection.ts +12 -0
  34. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/data.ts +15 -0
  35. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/etree.ts +14 -0
  36. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/film.ts +14 -0
  37. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/images.ts +13 -0
  38. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/radio.ts +15 -0
  39. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/search.ts +14 -0
  40. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/software.ts +13 -0
  41. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/texts.ts +13 -0
  42. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/tv-commercial.ts +12 -0
  43. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/tv-fact-check.ts +12 -0
  44. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/tv-quote.ts +12 -0
  45. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/tv.ts +14 -0
  46. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/video.ts +14 -0
  47. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/mediatype/web.ts +13 -0
  48. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/null-result.ts +5 -0
  49. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/quote.ts +7 -0
  50. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/restricted.ts +13 -0
  51. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/reviews.ts +11 -0
  52. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/upload.ts +12 -0
  53. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/assets/img/icons/views.ts +11 -0
  54. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/circular-activity-indicator.ts +64 -0
  55. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-browser.ts +3165 -0
  56. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/facet-row.ts +309 -0
  57. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/facet-tombstone-row.ts +40 -0
  58. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/facets-template.ts +85 -0
  59. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/models.ts +10 -0
  60. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/more-facets-content.ts +644 -0
  61. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/more-facets-pagination.ts +294 -0
  62. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/dedupe.ts +44 -0
  63. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.ts +27 -0
  64. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/heuristics/index.ts +3 -0
  65. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.ts +17 -0
  66. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.ts +70 -0
  67. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.ts +79 -0
  68. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.ts +93 -0
  69. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/models.ts +36 -0
  70. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/smart-facet-bar.ts +437 -0
  71. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/smart-facet-button.ts +145 -0
  72. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/smart-facet-dropdown.ts +185 -0
  73. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/smart-facet-equals.ts +16 -0
  74. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/smart-facets/smart-facet-heuristics.ts +26 -0
  75. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets/toggle-switch.ts +174 -0
  76. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/collection-facets.ts +1013 -0
  77. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/data-source/collection-browser-data-source-interface.ts +351 -0
  78. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/data-source/collection-browser-data-source.ts +1474 -0
  79. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/data-source/collection-browser-query-state.ts +60 -0
  80. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/data-source/models.ts +56 -0
  81. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/empty-placeholder.ts +192 -0
  82. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/expanded-date-picker.ts +191 -0
  83. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/language-code-handler/language-code-handler.ts +64 -0
  84. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/language-code-handler/language-code-mapping.ts +564 -0
  85. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/manage/manage-bar.ts +276 -0
  86. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/manage/remove-items-modal-content.ts +102 -0
  87. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/mediatype/mediatype-config.ts +146 -0
  88. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/models.ts +895 -0
  89. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/restoration-state-handler.ts +550 -0
  90. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/alpha-bar-tooltip.ts +53 -0
  91. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/alpha-bar.ts +252 -0
  92. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/img/compact.ts +5 -0
  93. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/img/list.ts +5 -0
  94. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/img/sort-toggle-disabled.ts +15 -0
  95. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/img/sort-toggle-down.ts +17 -0
  96. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/img/sort-toggle-up.ts +17 -0
  97. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  98. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/img/tile.ts +5 -0
  99. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/sort-filter-bar/sort-filter-bar.ts +733 -0
  100. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/styles/ia-button.ts +139 -0
  101. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/styles/item-image-styles.ts +124 -0
  102. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/styles/sr-only.ts +18 -0
  103. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/styles/tile-action-styles.ts +59 -0
  104. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/base-tile-component.ts +124 -0
  105. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/collection-browser-loading-tile.ts +26 -0
  106. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/grid/account-tile.ts +113 -0
  107. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/grid/collection-tile.ts +184 -0
  108. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/grid/item-tile.ts +347 -0
  109. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/grid/search-tile.ts +90 -0
  110. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/grid/styles/tile-grid-shared-styles.ts +130 -0
  111. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/grid/tile-stats.ts +211 -0
  112. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/hover/hover-pane-controller.ts +638 -0
  113. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/hover/tile-hover-pane.ts +184 -0
  114. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/image-block.ts +162 -0
  115. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/item-image.ts +214 -0
  116. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/list/tile-list-compact-header.ts +112 -0
  117. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/list/tile-list-compact.ts +278 -0
  118. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/list/tile-list.ts +718 -0
  119. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/models.ts +21 -0
  120. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/overlay/icon-overlay.ts +57 -0
  121. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/overlay/text-overlay.ts +79 -0
  122. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/review-block.ts +130 -0
  123. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/text-snippet-block.ts +132 -0
  124. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/tile-dispatcher.ts +637 -0
  125. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/tile-display-value-provider.ts +133 -0
  126. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/tiles/tile-mediatype-icon.ts +133 -0
  127. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/analytics-events.ts +29 -0
  128. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/array-equals.ts +8 -0
  129. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/collapse-repeated-quotes.ts +13 -0
  130. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/date-filter-field.ts +11 -0
  131. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/facet-utils.ts +183 -0
  132. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/format-count.ts +95 -0
  133. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/format-date.ts +62 -0
  134. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/format-unit-size.ts +43 -0
  135. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/local-date-from-utc.ts +15 -0
  136. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/log.ts +14 -0
  137. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/resolve-mediatype.ts +26 -0
  138. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/src/utils/sha1.ts +9 -0
  139. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/collection-browser.test.ts +2639 -0
  140. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/collection-facets/facet-row.test.ts +421 -0
  141. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/collection-facets/facets-template.test.ts +139 -0
  142. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/collection-facets/more-facets-content.test.ts +231 -0
  143. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/collection-facets/more-facets-pagination.test.ts +201 -0
  144. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/collection-facets/toggle-switch.test.ts +164 -0
  145. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/collection-facets.test.ts +928 -0
  146. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/data-source/collection-browser-data-source.test.ts +193 -0
  147. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/empty-placeholder.test.ts +88 -0
  148. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/expanded-date-picker.test.ts +201 -0
  149. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/icon-overlay.test.ts +38 -0
  150. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/image-block.test.ts +247 -0
  151. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/item-image.test.ts +220 -0
  152. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/manage/manage-bar.test.ts +347 -0
  153. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/manage/remove-items-modal-content.test.ts +81 -0
  154. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/mediatype-config.test.ts +11 -0
  155. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/mocks/mock-analytics-handler.ts +30 -0
  156. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/mocks/mock-search-responses.ts +1364 -0
  157. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/mocks/mock-search-service.ts +134 -0
  158. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/restoration-state-handler.test.ts +480 -0
  159. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/review-block.test.ts +62 -0
  160. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/sort-filter-bar/alpha-bar-tooltip.test.ts +17 -0
  161. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/sort-filter-bar/alpha-bar.test.ts +101 -0
  162. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/sort-filter-bar/sort-filter-bar.test.ts +443 -0
  163. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/text-overlay.test.ts +55 -0
  164. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/text-snippet-block.test.ts +85 -0
  165. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tile-stats.test.ts +191 -0
  166. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/grid/account-tile.test.ts +121 -0
  167. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/grid/collection-tile.test.ts +114 -0
  168. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/grid/item-tile.test.ts +520 -0
  169. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/grid/search-tile.test.ts +75 -0
  170. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/hover/hover-pane-controller.test.ts +482 -0
  171. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/hover/tile-hover-pane.test.ts +80 -0
  172. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/list/tile-list-compact-header.test.ts +43 -0
  173. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/list/tile-list-compact.test.ts +282 -0
  174. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/list/tile-list.test.ts +576 -0
  175. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/tile-dispatcher.test.ts +320 -0
  176. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/tile-display-value-provider.test.ts +172 -0
  177. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/tiles/tile-mediatype-icon.test.ts +160 -0
  178. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/utils/array-equals.test.ts +31 -0
  179. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/utils/format-count.test.ts +32 -0
  180. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/utils/format-date.test.ts +89 -0
  181. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/utils/format-unit-size.test.ts +21 -0
  182. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/test/utils/local-date-from-utc.test.ts +37 -0
  183. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/tsconfig.json +25 -0
  184. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/types/dompurify.d.ts +1 -0
  185. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/vite.config.ts +29 -0
  186. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/web-dev-server.config.mjs +30 -0
  187. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/web-test-runner.config.mjs +52 -0
  188. package/.claude/worktrees/WEBDEV-8677-bump-field-parsers/yarn.lock +5965 -0
  189. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/.editorconfig +29 -0
  190. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/.github/workflows/ci.yml +29 -0
  191. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/.github/workflows/gh-pages-main.yml +41 -0
  192. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/.github/workflows/npm-publish.yml +49 -0
  193. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/.github/workflows/pr-preview.yml +40 -0
  194. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/.husky/pre-commit +1 -0
  195. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/.prettierignore +1 -0
  196. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/LICENSE +661 -0
  197. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/README.md +68 -0
  198. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/eslint.config.mjs +53 -0
  199. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/index.html +24 -0
  200. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/index.ts +29 -0
  201. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/local.archive.org.cert +86 -0
  202. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/local.archive.org.key +27 -0
  203. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/package.json +129 -0
  204. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/pnpm-lock.yaml +7366 -0
  205. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/pnpm-workspace.yaml +46 -0
  206. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/renovate.json +6 -0
  207. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/app-root.ts +1284 -0
  208. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/arrow-left.ts +10 -0
  209. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/arrow-right.ts +10 -0
  210. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/chevron.ts +4 -0
  211. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/close-circle-dark.ts +5 -0
  212. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/contract.ts +9 -0
  213. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/empty-query.ts +5 -0
  214. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/expand.ts +9 -0
  215. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/eye-closed.ts +5 -0
  216. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/eye.ts +5 -0
  217. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/favorite-filled.ts +10 -0
  218. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/favorite-unfilled.ts +9 -0
  219. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/filter.ts +10 -0
  220. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/login-required.ts +18 -0
  221. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/account.ts +14 -0
  222. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/audio.ts +14 -0
  223. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/collection.ts +12 -0
  224. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/data.ts +15 -0
  225. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/etree.ts +14 -0
  226. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/film.ts +14 -0
  227. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/images.ts +13 -0
  228. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/radio.ts +15 -0
  229. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/search.ts +14 -0
  230. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/software.ts +13 -0
  231. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/texts.ts +13 -0
  232. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/tv-commercial.ts +12 -0
  233. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/tv-fact-check.ts +12 -0
  234. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/tv-quote.ts +12 -0
  235. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/tv.ts +14 -0
  236. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/video.ts +14 -0
  237. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/mediatype/web.ts +13 -0
  238. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/null-result.ts +5 -0
  239. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/quote.ts +7 -0
  240. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/restricted.ts +13 -0
  241. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/reviews.ts +11 -0
  242. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/upload.ts +12 -0
  243. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/assets/img/icons/views.ts +11 -0
  244. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/circular-activity-indicator.ts +64 -0
  245. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-browser.ts +3165 -0
  246. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/facet-row.ts +309 -0
  247. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/facet-tombstone-row.ts +40 -0
  248. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/facets-template.ts +85 -0
  249. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/models.ts +10 -0
  250. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/more-facets-content.ts +644 -0
  251. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/more-facets-pagination.ts +294 -0
  252. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/dedupe.ts +44 -0
  253. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.ts +27 -0
  254. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/heuristics/index.ts +3 -0
  255. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.ts +17 -0
  256. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.ts +70 -0
  257. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.ts +79 -0
  258. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.ts +93 -0
  259. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/models.ts +36 -0
  260. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/smart-facet-bar.ts +437 -0
  261. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/smart-facet-button.ts +145 -0
  262. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/smart-facet-dropdown.ts +185 -0
  263. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/smart-facet-equals.ts +16 -0
  264. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/smart-facets/smart-facet-heuristics.ts +26 -0
  265. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets/toggle-switch.ts +174 -0
  266. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/collection-facets.ts +1013 -0
  267. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/data-source/collection-browser-data-source-interface.ts +351 -0
  268. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/data-source/collection-browser-data-source.ts +1474 -0
  269. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/data-source/collection-browser-query-state.ts +60 -0
  270. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/data-source/models.ts +56 -0
  271. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/empty-placeholder.ts +192 -0
  272. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/expanded-date-picker.ts +191 -0
  273. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/language-code-handler/language-code-handler.ts +64 -0
  274. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/language-code-handler/language-code-mapping.ts +564 -0
  275. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/manage/manage-bar.ts +276 -0
  276. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/manage/remove-items-modal-content.ts +102 -0
  277. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/mediatype/mediatype-config.ts +146 -0
  278. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/models.ts +895 -0
  279. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/restoration-state-handler.ts +550 -0
  280. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/alpha-bar-tooltip.ts +53 -0
  281. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/alpha-bar.ts +252 -0
  282. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/img/compact.ts +5 -0
  283. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/img/list.ts +5 -0
  284. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/img/sort-toggle-disabled.ts +15 -0
  285. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/img/sort-toggle-down.ts +17 -0
  286. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/img/sort-toggle-up.ts +17 -0
  287. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  288. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/img/tile.ts +5 -0
  289. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/sort-filter-bar/sort-filter-bar.ts +733 -0
  290. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/styles/ia-button.ts +139 -0
  291. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/styles/item-image-styles.ts +124 -0
  292. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/styles/sr-only.ts +18 -0
  293. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/styles/tile-action-styles.ts +59 -0
  294. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/base-tile-component.ts +124 -0
  295. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/collection-browser-loading-tile.ts +26 -0
  296. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/grid/account-tile.ts +113 -0
  297. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/grid/collection-tile.ts +184 -0
  298. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/grid/item-tile.ts +347 -0
  299. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/grid/search-tile.ts +90 -0
  300. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/grid/styles/tile-grid-shared-styles.ts +130 -0
  301. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/grid/tile-stats.ts +211 -0
  302. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/hover/hover-pane-controller.ts +638 -0
  303. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/hover/tile-hover-pane.ts +184 -0
  304. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/image-block.ts +162 -0
  305. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/item-image.ts +214 -0
  306. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/list/tile-list-compact-header.ts +112 -0
  307. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/list/tile-list-compact.ts +278 -0
  308. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/list/tile-list.ts +718 -0
  309. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/models.ts +21 -0
  310. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/overlay/icon-overlay.ts +57 -0
  311. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/overlay/text-overlay.ts +79 -0
  312. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/review-block.ts +130 -0
  313. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/text-snippet-block.ts +132 -0
  314. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/tile-dispatcher.ts +637 -0
  315. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/tile-display-value-provider.ts +133 -0
  316. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/tiles/tile-mediatype-icon.ts +133 -0
  317. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/analytics-events.ts +29 -0
  318. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/array-equals.ts +8 -0
  319. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/collapse-repeated-quotes.ts +13 -0
  320. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/date-filter-field.ts +11 -0
  321. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/facet-utils.ts +183 -0
  322. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/format-count.ts +95 -0
  323. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/format-date.ts +62 -0
  324. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/format-unit-size.ts +43 -0
  325. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/local-date-from-utc.ts +15 -0
  326. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/log.ts +14 -0
  327. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/resolve-mediatype.ts +26 -0
  328. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/src/utils/sha1.ts +9 -0
  329. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/collection-browser.test.ts +2639 -0
  330. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/collection-facets/facet-row.test.ts +421 -0
  331. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/collection-facets/facets-template.test.ts +139 -0
  332. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/collection-facets/more-facets-content.test.ts +231 -0
  333. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/collection-facets/more-facets-pagination.test.ts +201 -0
  334. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/collection-facets/toggle-switch.test.ts +164 -0
  335. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/collection-facets.test.ts +928 -0
  336. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/data-source/collection-browser-data-source.test.ts +193 -0
  337. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/empty-placeholder.test.ts +88 -0
  338. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/expanded-date-picker.test.ts +201 -0
  339. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/icon-overlay.test.ts +38 -0
  340. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/image-block.test.ts +247 -0
  341. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/item-image.test.ts +220 -0
  342. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/manage/manage-bar.test.ts +347 -0
  343. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/manage/remove-items-modal-content.test.ts +81 -0
  344. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/mediatype-config.test.ts +11 -0
  345. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/mocks/mock-analytics-handler.ts +30 -0
  346. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/mocks/mock-search-responses.ts +1364 -0
  347. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/mocks/mock-search-service.ts +134 -0
  348. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/restoration-state-handler.test.ts +480 -0
  349. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/review-block.test.ts +62 -0
  350. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/sort-filter-bar/alpha-bar-tooltip.test.ts +17 -0
  351. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/sort-filter-bar/alpha-bar.test.ts +101 -0
  352. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/sort-filter-bar/sort-filter-bar.test.ts +443 -0
  353. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/text-overlay.test.ts +55 -0
  354. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/text-snippet-block.test.ts +85 -0
  355. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tile-stats.test.ts +191 -0
  356. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/grid/account-tile.test.ts +121 -0
  357. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/grid/collection-tile.test.ts +114 -0
  358. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/grid/item-tile.test.ts +520 -0
  359. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/grid/search-tile.test.ts +75 -0
  360. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/hover/hover-pane-controller.test.ts +482 -0
  361. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/hover/tile-hover-pane.test.ts +80 -0
  362. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/list/tile-list-compact-header.test.ts +43 -0
  363. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/list/tile-list-compact.test.ts +282 -0
  364. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/list/tile-list.test.ts +576 -0
  365. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/tile-dispatcher.test.ts +320 -0
  366. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/tile-display-value-provider.test.ts +172 -0
  367. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/tiles/tile-mediatype-icon.test.ts +160 -0
  368. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/utils/array-equals.test.ts +31 -0
  369. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/utils/format-count.test.ts +32 -0
  370. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/utils/format-date.test.ts +89 -0
  371. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/utils/format-unit-size.test.ts +21 -0
  372. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/test/utils/local-date-from-utc.test.ts +37 -0
  373. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/tsconfig.json +25 -0
  374. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/types/dompurify.d.ts +1 -0
  375. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/vite.config.ts +29 -0
  376. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/web-dev-server.config.mjs +30 -0
  377. package/.claude/worktrees/WEBDEV-9127-fix-publish-dist-tag/web-test-runner.config.mjs +52 -0
  378. package/.editorconfig +29 -29
  379. package/.github/workflows/ci.yml +29 -27
  380. package/.github/workflows/gh-pages-main.yml +41 -39
  381. package/.github/workflows/npm-publish.yml +42 -39
  382. package/.github/workflows/pr-preview.yml +40 -38
  383. package/.husky/pre-commit +1 -1
  384. package/.prettierignore +1 -1
  385. package/LICENSE +661 -661
  386. package/README.md +67 -83
  387. package/dist/index.js.map +1 -1
  388. package/dist/src/app-root.js +683 -683
  389. package/dist/src/app-root.js.map +1 -1
  390. package/dist/src/collection-browser.js +766 -766
  391. package/dist/src/collection-browser.js.map +1 -1
  392. package/dist/src/collection-facets/facet-row.js +143 -143
  393. package/dist/src/collection-facets/facet-row.js.map +1 -1
  394. package/dist/src/collection-facets/facets-template.js +24 -24
  395. package/dist/src/collection-facets/facets-template.js.map +1 -1
  396. package/dist/src/collection-facets.d.ts +2 -2
  397. package/dist/src/collection-facets.js +5 -5
  398. package/dist/src/collection-facets.js.map +1 -1
  399. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -1
  400. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  401. package/dist/src/expanded-date-picker.d.ts +2 -2
  402. package/dist/src/expanded-date-picker.js +3 -3
  403. package/dist/src/expanded-date-picker.js.map +1 -1
  404. package/dist/src/restoration-state-handler.js.map +1 -1
  405. package/dist/src/styles/tile-action-styles.js +43 -43
  406. package/dist/src/styles/tile-action-styles.js.map +1 -1
  407. package/dist/src/tiles/base-tile-component.js +11 -11
  408. package/dist/src/tiles/base-tile-component.js.map +1 -1
  409. package/dist/src/tiles/grid/item-tile.js +138 -138
  410. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  411. package/dist/src/tiles/hover/hover-pane-controller.js +40 -32
  412. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
  413. package/dist/src/tiles/item-image.js +1 -1
  414. package/dist/src/tiles/item-image.js.map +1 -1
  415. package/dist/src/tiles/list/tile-list-compact-header.js +62 -62
  416. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
  417. package/dist/src/tiles/list/tile-list-compact.js +123 -123
  418. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  419. package/dist/src/tiles/list/tile-list.js +310 -310
  420. package/dist/src/tiles/list/tile-list.js.map +1 -1
  421. package/dist/src/tiles/models.js.map +1 -1
  422. package/dist/src/tiles/tile-dispatcher.js +286 -286
  423. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  424. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  425. package/dist/src/utils/date-filter-field.js.map +1 -1
  426. package/dist/test/collection-browser.test.js +207 -207
  427. package/dist/test/collection-browser.test.js.map +1 -1
  428. package/dist/test/collection-facets/facet-row.test.js +31 -31
  429. package/dist/test/collection-facets/facet-row.test.js.map +1 -1
  430. package/dist/test/collection-facets.test.js +2 -2
  431. package/dist/test/collection-facets.test.js.map +1 -1
  432. package/dist/test/expanded-date-picker.test.js.map +1 -1
  433. package/dist/test/tiles/grid/item-tile.test.js +77 -77
  434. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  435. package/dist/test/tiles/hover/hover-pane-controller.test.js +57 -50
  436. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -1
  437. package/dist/test/tiles/list/tile-list.test.js +134 -134
  438. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  439. package/dist/test/tiles/tile-dispatcher.test.js +92 -92
  440. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -1
  441. package/eslint.config.mjs +53 -53
  442. package/index.html +24 -24
  443. package/index.ts +29 -29
  444. package/local.archive.org.cert +86 -86
  445. package/local.archive.org.key +27 -27
  446. package/package.json +126 -120
  447. package/pnpm-workspace.yaml +30 -0
  448. package/renovate.json +6 -6
  449. package/src/app-root.ts +1284 -1284
  450. package/src/collection-browser.ts +3165 -3165
  451. package/src/collection-facets/facet-row.ts +309 -309
  452. package/src/collection-facets/facets-template.ts +85 -85
  453. package/src/collection-facets.ts +6 -6
  454. package/src/data-source/collection-browser-data-source-interface.ts +351 -351
  455. package/src/data-source/collection-browser-data-source.ts +1474 -1474
  456. package/src/expanded-date-picker.ts +4 -4
  457. package/src/restoration-state-handler.ts +550 -550
  458. package/src/styles/tile-action-styles.ts +59 -59
  459. package/src/tiles/base-tile-component.ts +124 -124
  460. package/src/tiles/grid/item-tile.ts +347 -347
  461. package/src/tiles/hover/hover-pane-controller.ts +638 -630
  462. package/src/tiles/item-image.ts +1 -1
  463. package/src/tiles/list/tile-list-compact-header.ts +112 -112
  464. package/src/tiles/list/tile-list-compact.ts +278 -278
  465. package/src/tiles/list/tile-list.ts +718 -718
  466. package/src/tiles/models.ts +21 -21
  467. package/src/tiles/tile-dispatcher.ts +637 -637
  468. package/src/tiles/tile-display-value-provider.ts +133 -133
  469. package/src/utils/date-filter-field.ts +11 -11
  470. package/test/collection-browser.test.ts +2639 -2639
  471. package/test/collection-facets/facet-row.test.ts +421 -421
  472. package/test/collection-facets.test.ts +2 -2
  473. package/test/expanded-date-picker.test.ts +3 -3
  474. package/test/tiles/grid/item-tile.test.ts +520 -520
  475. package/test/tiles/hover/hover-pane-controller.test.ts +482 -454
  476. package/test/tiles/list/tile-list.test.ts +576 -576
  477. package/test/tiles/tile-dispatcher.test.ts +320 -320
  478. package/tsconfig.json +25 -25
  479. package/web-dev-server.config.mjs +30 -30
  480. package/web-test-runner.config.mjs +52 -52
@@ -0,0 +1,1284 @@
1
+ import {
2
+ AnalyticsEvent,
3
+ AnalyticsManager,
4
+ } from '@internetarchive/analytics-manager';
5
+ import {
6
+ PageElementName,
7
+ SearchService,
8
+ SearchServiceInterface,
9
+ SearchType,
10
+ } from '@internetarchive/search-service';
11
+ import { html, css, LitElement, PropertyValues, nothing } from 'lit';
12
+ import { customElement, property, query, state } from 'lit/decorators.js';
13
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
14
+
15
+ import type { ModalManagerInterface } from '@internetarchive/modal-manager';
16
+ import type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';
17
+ import type { CollectionBrowser } from '../src/collection-browser';
18
+
19
+ import '../src/collection-browser';
20
+ import { InfiniteScroller } from '@internetarchive/infinite-scroller';
21
+ import { TileDispatcher } from './tiles/tile-dispatcher';
22
+
23
+ @customElement('app-root')
24
+ export class AppRoot extends LitElement {
25
+ private searchService: SearchServiceInterface =
26
+ this.initSearchServiceFromUrlParams();
27
+
28
+ private resizeObserver = new SharedResizeObserver();
29
+
30
+ @state() private toggleSlots: boolean = false;
31
+
32
+ @state() private currentPage?: number;
33
+
34
+ @state() private searchQuery?: string;
35
+
36
+ @state() private withinCollection?: string;
37
+
38
+ @state() private cellWidth: number = 18;
39
+
40
+ @state() private cellHeight: number = 29;
41
+
42
+ @state() private rowGap: number = 1.7;
43
+
44
+ @state() private colGap: number = 1.7;
45
+
46
+ @state() private suppressFacets: boolean = false;
47
+
48
+ @state() private lazyLoadFacets: boolean = false;
49
+
50
+ @state() private loggedIn: boolean = false;
51
+
52
+ @state() private searchType: SearchType = SearchType.METADATA;
53
+
54
+ @state() private profileElement?: PageElementName;
55
+
56
+ @state() private withinProfile?: string;
57
+
58
+ @property({ type: Object, reflect: false }) latestAction?: AnalyticsEvent;
59
+
60
+ @query('#base-query-field') private baseQueryField!: HTMLInputElement;
61
+
62
+ @query('#base-collection-field')
63
+ private baseCollectionField!: HTMLInputElement;
64
+
65
+ @query('#page-number-input') private pageNumberInput!: HTMLInputElement;
66
+
67
+ @query('collection-browser') private collectionBrowser!: CollectionBrowser;
68
+
69
+ @query('modal-manager') private modalManager!: ModalManagerInterface;
70
+
71
+ private analyticsManager = new AnalyticsManager();
72
+
73
+ private analyticsHandler: AnalyticsManagerInterface = {
74
+ sendPing: this.sendAnalytics.bind(this),
75
+ sendEvent: this.sendAnalytics.bind(this),
76
+ sendEventNoSampling: this.sendAnalytics.bind(this),
77
+ };
78
+
79
+ private sendAnalytics(ae: AnalyticsEvent) {
80
+ console.log('Analytics Received ----', ae);
81
+ this.latestAction = ae;
82
+ this.analyticsManager?.sendEvent(ae);
83
+ }
84
+
85
+ private initSearchServiceFromUrlParams() {
86
+ const params = new URL(window.location.href).searchParams;
87
+ return new SearchService({
88
+ includeCredentials: false,
89
+ baseUrl: params.get('search_base_url') ?? undefined,
90
+ servicePath: params.get('search_service_path') ?? undefined,
91
+ debuggingEnabled: !!params.get('debugging'),
92
+ });
93
+ }
94
+
95
+ private searchPressed(e: Event) {
96
+ e.preventDefault();
97
+ this.searchQuery = this.baseQueryField.value;
98
+ this.collectionBrowser.searchType = this.searchType;
99
+
100
+ this.goToCurrentPage();
101
+ }
102
+
103
+ private collectionChanged(e: Event) {
104
+ e.preventDefault();
105
+ this.withinCollection = this.baseCollectionField.value;
106
+ this.collectionBrowser.withinCollection = this.withinCollection;
107
+
108
+ this.goToCurrentPage();
109
+ }
110
+
111
+ private goToCurrentPage() {
112
+ const page = this.currentPage ?? 1;
113
+ if (page > 1) {
114
+ this.collectionBrowser.goToPage(page);
115
+ } else {
116
+ // Ensure we reset the initial page
117
+ this.collectionBrowser.initialPageNumber = 1;
118
+ }
119
+ }
120
+
121
+ private changePagePressed(e: Event) {
122
+ e.preventDefault();
123
+ this.currentPage = this.pageNumberInput.valueAsNumber;
124
+ this.collectionBrowser.goToPage(this.currentPage);
125
+ }
126
+
127
+ protected override updated(changed: PropertyValues): void {
128
+ if (changed.has('currentPage') && this.currentPage) {
129
+ this.pageNumberInput.value = this.currentPage.toString();
130
+ }
131
+
132
+ if (changed.has('searchQuery')) {
133
+ this.queryUpdated();
134
+ }
135
+ }
136
+
137
+ private queryUpdated() {
138
+ this.collectionBrowser.baseQuery = this.searchQuery;
139
+ }
140
+
141
+ private get getClass() {
142
+ const searchParams = new URLSearchParams(window.location.search);
143
+
144
+ return searchParams.get('hide-dev-tools') ? 'hidden' : '';
145
+ }
146
+
147
+ render() {
148
+ return html`
149
+ <div class="dev-tool-container">
150
+ <div id="dev-tools" class=${this.getClass}>
151
+ <div id="search-and-page-inputs">
152
+ <form @submit=${this.searchPressed}>
153
+ <label for="base-query-field"> Query: </label>
154
+ <input
155
+ type="text"
156
+ id="base-query-field"
157
+ .value=${this.searchQuery ?? ''}
158
+ />
159
+ <input type="submit" value="Search" />
160
+ </form>
161
+ <form @submit=${this.changePagePressed}>
162
+ <label for="page-number-input"> Page: </label>
163
+ <input type="number" value="1" id="page-number-input" />
164
+ <input type="submit" value="Go" />
165
+ </form>
166
+ </div>
167
+ <div>
168
+ <form @submit=${this.collectionChanged}>
169
+ <label for="base-collection-field"> Within collection: </label>
170
+ <input
171
+ type="text"
172
+ id="base-collection-field"
173
+ .value=${this.withinCollection ?? ''}
174
+ />
175
+ <input type="submit" value="Search" />
176
+ </form>
177
+ </div>
178
+
179
+ <div id="search-types">
180
+ Search type:
181
+ <span class="search-type">
182
+ <input
183
+ type="radio"
184
+ id="default-search"
185
+ name="search-type"
186
+ value="default"
187
+ .checked=${this.searchType === SearchType.DEFAULT}
188
+ @click=${this.searchTypeSelected}
189
+ />
190
+ <label for="default-search">Default</label>
191
+ </span>
192
+ <span class="search-type">
193
+ <input
194
+ type="radio"
195
+ id="metadata-search"
196
+ name="search-type"
197
+ value="metadata"
198
+ .checked=${this.searchType === SearchType.METADATA}
199
+ @click=${this.searchTypeSelected}
200
+ />
201
+ <label for="metadata-search">Metadata</label>
202
+ </span>
203
+ <span class="search-type">
204
+ <input
205
+ type="radio"
206
+ id="fulltext-search"
207
+ name="search-type"
208
+ value="fulltext"
209
+ .checked=${this.searchType === SearchType.FULLTEXT}
210
+ @click=${this.searchTypeSelected}
211
+ />
212
+ <label for="fulltext-search">Full text</label>
213
+ </span>
214
+ <span class="search-type">
215
+ <input
216
+ type="radio"
217
+ id="tv-search"
218
+ name="search-type"
219
+ value="tv"
220
+ .checked=${this.searchType === SearchType.TV}
221
+ @click=${this.searchTypeSelected}
222
+ />
223
+ <label for="tv-search">TV</label>
224
+ </span>
225
+ <span class="search-type">
226
+ <input
227
+ type="radio"
228
+ id="radio-search"
229
+ name="search-type"
230
+ value="radio"
231
+ .checked=${this.searchType === SearchType.RADIO}
232
+ @click=${this.searchTypeSelected}
233
+ />
234
+ <label for="radio-search">Radio</label>
235
+ </span>
236
+ </div>
237
+
238
+ <div id="toggle-controls">
239
+ <button
240
+ @click=${() => {
241
+ const details =
242
+ this.shadowRoot?.getElementById('cell-size-control');
243
+ details?.classList.toggle('hidden');
244
+ const rowGapControls =
245
+ this.shadowRoot?.getElementById('cell-gap-control');
246
+ rowGapControls?.classList.toggle('hidden');
247
+ }}
248
+ >
249
+ Toggle Cell Controls
250
+ </button>
251
+ <button
252
+ @click=${() => {
253
+ const details = this.shadowRoot?.getElementById(
254
+ 'latest-event-details',
255
+ );
256
+ details?.classList.toggle('hidden');
257
+ }}
258
+ >
259
+ Last Event Captured
260
+ </button>
261
+ </div>
262
+
263
+ <div id="last-event">
264
+ <pre id="latest-event-details" class="hidden">
265
+ ${JSON.stringify(this.latestAction, null, 2)}
266
+ </pre
267
+ >
268
+ </div>
269
+
270
+ <fieldset class="cell-controls">
271
+ <legend>Cell Controls</legend>
272
+ <div>
273
+ <label for="cell-width-slider">Cell width:</label>
274
+ <input
275
+ type="range"
276
+ min="10"
277
+ max="100"
278
+ value="18"
279
+ step="0.1"
280
+ id="cell-width-slider"
281
+ @input=${this.widthChanged}
282
+ />
283
+ <span>${this.cellWidth}rem</span>
284
+ </div>
285
+ <div>
286
+ <label for="cell-height-slider">Cell height:</label>
287
+ <input
288
+ type="range"
289
+ min="10"
290
+ max="100"
291
+ value="29"
292
+ step="0.1"
293
+ id="cell-height-slider"
294
+ @input=${this.heightChanged}
295
+ />
296
+ <span>${this.cellHeight}rem</span>
297
+ </div>
298
+ <div>
299
+ <label for="cell-row-gap-slider">Row gap:</label>
300
+ <input
301
+ type="range"
302
+ min="0"
303
+ max="5"
304
+ value="1.7"
305
+ step="0.1"
306
+ id="cell-row-gap-slider"
307
+ @input=${this.rowGapChanged}
308
+ />
309
+ <span>${this.rowGap}rem</span>
310
+ </div>
311
+ <div>
312
+ <label for="cell-col-gap-slider">Col gap:</label>
313
+ <input
314
+ type="range"
315
+ min="0"
316
+ max="5"
317
+ value="1.7"
318
+ step="0.1"
319
+ id="cell-col-gap-slider"
320
+ @input=${this.colGapChanged}
321
+ />
322
+ <span>${this.colGap}rem</span>
323
+ </div>
324
+ </fieldset>
325
+
326
+ <fieldset class="other-controls">
327
+ <legend>Other Controls</legend>
328
+ <div class="checkbox-control">
329
+ <input
330
+ type="checkbox"
331
+ id="simulate-login"
332
+ @click=${this.loginChanged}
333
+ />
334
+ <label for="simulate-login">Simulate login</label>
335
+ </div>
336
+ <div class="checkbox-control">
337
+ <input
338
+ type="checkbox"
339
+ id="enable-date-picker"
340
+ checked
341
+ @click=${this.datePickerChanged}
342
+ />
343
+ <label for="enable-date-picker">Enable date picker</label>
344
+ </div>
345
+ <div class="checkbox-control">
346
+ <input
347
+ type="checkbox"
348
+ id="enable-facets"
349
+ checked
350
+ @click=${this.facetsChanged}
351
+ />
352
+ <label for="enable-facets">Enable facets</label>
353
+ </div>
354
+ <div class="checkbox-control indent">
355
+ <input
356
+ type="checkbox"
357
+ id="lazy-load-facets"
358
+ ?disabled=${this.suppressFacets}
359
+ @click=${this.lazyLoadFacetsChanged}
360
+ />
361
+ <label for="lazy-load-facets">Lazy load facets</label>
362
+ </div>
363
+ <div class="checkbox-control">
364
+ <input
365
+ type="checkbox"
366
+ id="enable-management"
367
+ @click=${this.manageModeCheckboxChanged}
368
+ />
369
+ <label for="enable-management">Enable manage mode</label>
370
+ </div>
371
+ <div class="checkbox-control indent">
372
+ <input
373
+ type="checkbox"
374
+ id="enable-search-management"
375
+ @click=${this.SearchManageModeCheckboxChanged}
376
+ />
377
+ <label for="enable-search-management">Search</label>
378
+ </div>
379
+ <div class="checkbox-control">
380
+ <input
381
+ type="checkbox"
382
+ id="enable-smart-facet-bar"
383
+ @click=${this.smartFacetBarCheckboxChanged}
384
+ />
385
+ <label for="enable-smart-facet-bar">Enable smart facet bar</label>
386
+ </div>
387
+ <div class="checkbox-control">
388
+ <input
389
+ type="checkbox"
390
+ id="enable-tile-actions"
391
+ @click=${this.tileActionsCheckboxChanged}
392
+ />
393
+ <label for="enable-tile-actions"
394
+ >Enable tile action buttons</label
395
+ >
396
+ </div>
397
+ </fieldset>
398
+
399
+ <fieldset class="cb-visual-appearance">
400
+ <legend>CB Visual Appearance</legend>
401
+ <div class="checkbox-control">
402
+ <input
403
+ type="checkbox"
404
+ id="show-facet-group-outline-check"
405
+ @click=${this.toggleFacetGroupOutline}
406
+ />
407
+ <label for="show-facet-group-outline-check">
408
+ Show facet group outlines
409
+ </label>
410
+ </div>
411
+ <div class="checkbox-control">
412
+ <input
413
+ type="checkbox"
414
+ id="show-outline-check"
415
+ @click=${this.outlineChanged}
416
+ />
417
+ <label for="show-outline-check">Show cell outlines</label>
418
+ </div>
419
+ <div class="checkbox-control">
420
+ <input
421
+ type="checkbox"
422
+ id="minimal-tiles-check"
423
+ @click=${this.minimalTilesChanged}
424
+ />
425
+ <label for="minimal-tiles-check">Minimal tile layouts</label>
426
+ </div>
427
+ </fieldset>
428
+
429
+ <fieldset class="user-profile-controls">
430
+ <legend>User Profile Controls</legend>
431
+ <div class="checkbox-control">
432
+ <input
433
+ type="checkbox"
434
+ id="enable-facet-top-slot"
435
+ @click=${this.facetTopSlotCheckboxChanged}
436
+ />
437
+ <label for="enable-facet-top-slot">Show facet top slot</label>
438
+ </div>
439
+ <div class="checkbox-control">
440
+ <input
441
+ type="checkbox"
442
+ id="enable-cb-top-slot"
443
+ @click=${this.cbTopSlotCheckboxChanged}
444
+ />
445
+ <label for="enable-cb-top-slot">Show CB top slot</label>
446
+ </div>
447
+ <div class="checkbox-control">
448
+ <input
449
+ type="checkbox"
450
+ id="enable-sortbar-left-slot"
451
+ @click=${this.sortBarLeftSlotCheckboxChanged}
452
+ />
453
+ <label for="enable-sortbar-left-slot"
454
+ >Show sortbar left slot</label
455
+ >
456
+ </div>
457
+ <div class="checkbox-control">
458
+ <input
459
+ type="checkbox"
460
+ id="enable-sortbar-right-slot"
461
+ @click=${this.sortBarRightSlotCheckboxChanged}
462
+ />
463
+ <label for="enable-sortbar-right-slot"
464
+ >Show sortbar right slot</label
465
+ >
466
+ </div>
467
+ <div class="checkbox-control">
468
+ <input
469
+ type="checkbox"
470
+ id="enable-result-last-tile-slot"
471
+ @click=${this.resultLastTileSlotCheckboxChanged}
472
+ />
473
+ <label for="enable-result-last-tile-slot">
474
+ Show result last tile slot
475
+ </label>
476
+ </div>
477
+ <div class="checkbox-control">
478
+ <input
479
+ type="checkbox"
480
+ id="enable-replaced-sort-options"
481
+ @click=${this.replaceSortOptionsChanged}
482
+ />
483
+ <label for="enable-replaced-sort-options">
484
+ Show replaced sort options
485
+ </label>
486
+ </div>
487
+ <div class="text-input-control">
488
+ <label for="within-profile-input">withinProfile</label>
489
+ <input
490
+ type="text"
491
+ id="within-profile-input"
492
+ placeholder="e.g. @foobar"
493
+ @change=${(e: Event) => {
494
+ const val = (e.target as HTMLInputElement).value.trim();
495
+ this.withinProfile = val || undefined;
496
+ }}
497
+ />
498
+ </div>
499
+ <details class="profile-element-controls">
500
+ <summary>
501
+ Profile tab
502
+ (profileElement)${this.profileElement
503
+ ? html`: <strong>${this.profileElement}</strong>`
504
+ : ''}
505
+ </summary>
506
+ <div class="profile-element-options">
507
+ <div class="checkbox-control">
508
+ <input
509
+ type="radio"
510
+ id="profile-none"
511
+ name="profile-element"
512
+ value=""
513
+ checked
514
+ @click=${this.profileElementChanged}
515
+ />
516
+ <label for="profile-none">None</label>
517
+ </div>
518
+ ${(
519
+ [
520
+ 'uploads',
521
+ 'favorites',
522
+ 'reviews',
523
+ 'collections',
524
+ 'lending',
525
+ 'web_archives',
526
+ 'forum_posts',
527
+ ] as PageElementName[]
528
+ ).map(
529
+ tab => html`
530
+ <div class="checkbox-control">
531
+ <input
532
+ type="radio"
533
+ id="profile-${tab}"
534
+ name="profile-element"
535
+ value="${tab}"
536
+ @click=${this.profileElementChanged}
537
+ />
538
+ <label for="profile-${tab}">${tab}</label>
539
+ </div>
540
+ `,
541
+ )}
542
+ </div>
543
+ </details>
544
+ </fieldset>
545
+
546
+ <fieldset class="user-profile-controls">
547
+ <legend>Set Placeholder Types</legend>
548
+ <div class="checkbox-control">
549
+ <input
550
+ id="enable-loading-placeholder"
551
+ type="radio"
552
+ @click=${() => this.setPlaceholderType('loading-placeholder')}
553
+ name="placeholder-radio"
554
+ />
555
+ <label for="enable-loading-placeholder"
556
+ >Loading Placeholder</label
557
+ >
558
+ </div>
559
+ <div class="checkbox-control">
560
+ <input
561
+ id="enable-empty-placeholder"
562
+ type="radio"
563
+ @click=${() => this.setPlaceholderType('error-placeholder')}
564
+ value="empty-placeholder"
565
+ name="placeholder-radio"
566
+ />
567
+ <label for="enable-empty-placeholder">Empty Placeholder</label>
568
+ </div>
569
+ </fieldset>
570
+ </div>
571
+ <button id="toggle-dev-tools-btn" @click=${this.toggleDevTools}>
572
+ Toggle Search Controls
573
+ </button>
574
+ </div>
575
+ <div id="collection-browser-container">
576
+ <collection-browser
577
+ facetPaneVisible
578
+ .baseNavigationUrl=${'https://archive.org'}
579
+ .baseImageUrl=${'https://archive.org'}
580
+ .searchService=${this.searchService}
581
+ .resizeObserver=${this.resizeObserver}
582
+ .showHistogramDatePicker=${true}
583
+ .suppressFacets=${this.suppressFacets}
584
+ .lazyLoadFacets=${this.lazyLoadFacets}
585
+ .loggedIn=${this.loggedIn}
586
+ .modalManager=${this.modalManager}
587
+ .analyticsHandler=${this.analyticsHandler}
588
+ .withinProfile=${this.withinProfile}
589
+ .profileElement=${this.profileElement}
590
+ .pageContext=${'search'}
591
+ @visiblePageChanged=${this.visiblePageChanged}
592
+ @baseQueryChanged=${this.baseQueryChanged}
593
+ @searchTypeChanged=${this.searchTypeChanged}
594
+ @manageModeChanged=${this.manageModeChanged}
595
+ @itemRemovalRequested=${this.handleItemRemovalRequest}
596
+ @itemManagerRequested=${this.handleItemManagerRequest}
597
+ @tileActionClicked=${this.handleTileActionClicked}
598
+ >
599
+ ${this.toggleSlots
600
+ ? html`<div slot="sortbar-left-slot">Sort Slot</div>`
601
+ : nothing}
602
+ ${this.toggleSlots
603
+ ? html`<div slot="facet-top-slot">Facet Slot</div>`
604
+ : nothing}
605
+ </collection-browser>
606
+ </div>
607
+ <modal-manager></modal-manager>
608
+ `;
609
+ }
610
+
611
+ private async setPlaceholderType(type: string) {
612
+ switch (type) {
613
+ case 'loading-placeholder':
614
+ this.collectionBrowser.baseQuery = '';
615
+ this.collectionBrowser.suppressPlaceholders = true;
616
+ this.collectionBrowser.clearResultsOnEmptyQuery = true;
617
+ this.requestUpdate();
618
+ await this.collectionBrowser.updateComplete;
619
+ break;
620
+ default:
621
+ break;
622
+ }
623
+ }
624
+
625
+ private baseQueryChanged(e: CustomEvent<{ baseQuery?: string }>): void {
626
+ this.searchQuery = e.detail.baseQuery;
627
+ }
628
+
629
+ /** Handler for search type changes coming from collection browser */
630
+ private searchTypeChanged(e: CustomEvent<SearchType>): void {
631
+ this.searchType = e.detail;
632
+ }
633
+
634
+ /** Handler for user input selecting a search type */
635
+ private searchTypeSelected(e: Event) {
636
+ const target = e.target as HTMLInputElement;
637
+ this.searchType = this.searchTypeFromSelectedOption(target.value);
638
+ }
639
+
640
+ private searchTypeFromSelectedOption(option: string): SearchType {
641
+ switch (option) {
642
+ case 'metadata':
643
+ return SearchType.METADATA;
644
+ case 'fulltext':
645
+ return SearchType.FULLTEXT;
646
+ case 'tv':
647
+ return SearchType.TV;
648
+ case 'radio':
649
+ return SearchType.RADIO;
650
+ default:
651
+ return SearchType.DEFAULT;
652
+ }
653
+ }
654
+
655
+ private loginChanged(e: Event) {
656
+ const target = e.target as HTMLInputElement;
657
+ if (target.checked) {
658
+ this.loggedIn = true;
659
+ } else {
660
+ this.loggedIn = false;
661
+ }
662
+ }
663
+
664
+ private outlineChanged(e: Event) {
665
+ const target = e.target as HTMLInputElement;
666
+ if (target.checked) {
667
+ this.collectionBrowser.style.setProperty(
668
+ '--infiniteScrollerCellOutline',
669
+ '1px solid #33D1FF',
670
+ );
671
+ } else {
672
+ this.collectionBrowser.style.removeProperty(
673
+ '--infiniteScrollerCellOutline',
674
+ );
675
+ }
676
+ }
677
+
678
+ private minimalTilesChanged(e: Event) {
679
+ const target = e.target as HTMLInputElement;
680
+ const scroller = this.collectionBrowser?.shadowRoot!.querySelector(
681
+ 'infinite-scroller',
682
+ ) as InfiniteScroller;
683
+ const tileDispatchers = [
684
+ ...scroller.shadowRoot!.querySelectorAll('tile-dispatcher'),
685
+ ] as TileDispatcher[];
686
+
687
+ if (target.checked) {
688
+ tileDispatchers?.forEach(tile => (tile.layoutType = 'minimal'));
689
+ } else {
690
+ tileDispatchers?.forEach(tile => (tile.layoutType = 'default'));
691
+ }
692
+ }
693
+
694
+ private toggleDevTools() {
695
+ const pageUrl = new URL(window.location.href);
696
+ const { searchParams } = pageUrl;
697
+
698
+ if (searchParams.get('hide-dev-tools')) {
699
+ searchParams.delete('hide-dev-tools');
700
+ } else {
701
+ searchParams.set('hide-dev-tools', 'true');
702
+ }
703
+
704
+ this.shadowRoot?.getElementById('dev-tools')?.classList.toggle('hidden');
705
+
706
+ if (window.history.replaceState) {
707
+ window.history.replaceState(
708
+ {
709
+ path: pageUrl.toString(),
710
+ },
711
+ '',
712
+ pageUrl.toString(),
713
+ );
714
+ }
715
+ }
716
+
717
+ private toggleFacetGroupOutline(e: Event) {
718
+ const target = e.target as HTMLInputElement;
719
+ if (target.checked) {
720
+ this.collectionBrowser.classList.add('showFacetGroupOutlines');
721
+ this.modalManager.classList.add('showFacetGroupOutlines');
722
+ } else {
723
+ this.collectionBrowser.classList.remove('showFacetGroupOutlines');
724
+ this.modalManager.classList.remove('showFacetGroupOutlines');
725
+ }
726
+ }
727
+
728
+ private datePickerChanged(e: Event) {
729
+ const target = e.target as HTMLInputElement;
730
+ this.collectionBrowser.showHistogramDatePicker = target.checked;
731
+
732
+ // When disabling the date picker from the demo app, also clear any existing date range params
733
+ if (!this.collectionBrowser.showHistogramDatePicker) {
734
+ this.collectionBrowser.minSelectedDate = undefined;
735
+ this.collectionBrowser.maxSelectedDate = undefined;
736
+ }
737
+ }
738
+
739
+ private facetsChanged(e: Event) {
740
+ const target = e.target as HTMLInputElement;
741
+ this.suppressFacets = !target.checked;
742
+ }
743
+
744
+ private lazyLoadFacetsChanged(e: Event) {
745
+ const target = e.target as HTMLInputElement;
746
+ this.lazyLoadFacets = target.checked;
747
+ }
748
+
749
+ /**
750
+ * Handler for when collection browser's manage mode changes.
751
+ * This lets us disable the checkbox in the dev panel when the user cancels out
752
+ * of manage mode from within collection browser.
753
+ */
754
+ private manageModeChanged(e: CustomEvent<boolean>): void {
755
+ const manageCheckbox = this.shadowRoot?.querySelector(
756
+ '#enable-management',
757
+ ) as HTMLInputElement;
758
+ if (manageCheckbox) manageCheckbox.checked = e.detail;
759
+ }
760
+
761
+ /**
762
+ * Handler for item removal
763
+ */
764
+ private handleItemRemovalRequest(e: CustomEvent) {
765
+ this.collectionBrowser.showRemoveItemsProcessingModal();
766
+ console.log('itemRemovalRequested: ', e.detail.items);
767
+
768
+ setTimeout(() => {
769
+ // execute item-removal-service, and response is successfully deleted
770
+ const status = false;
771
+
772
+ if (status) {
773
+ // looking for success?
774
+ this.collectionBrowser.isManageView = false;
775
+ this.modalManager?.closeModal();
776
+ this.modalManager?.classList.remove('remove-items');
777
+ } else {
778
+ // looking for failure?
779
+ this.collectionBrowser.showRemoveItemsErrorModal();
780
+ }
781
+ }, 2000); // let's wait to see processing modal
782
+ }
783
+
784
+ /**
785
+ * Handler when item manage requested
786
+ */
787
+ private handleItemManagerRequest(e: CustomEvent) {
788
+ console.log('itemManagerRequested: ', e.detail.items);
789
+ }
790
+
791
+ /**
792
+ * Handler for when the dev panel's "Enable manage mode" checkbox is changed.
793
+ */
794
+ private manageModeCheckboxChanged(e: Event) {
795
+ const target = e.target as HTMLInputElement;
796
+ this.collectionBrowser.isManageView = target.checked;
797
+ this.collectionBrowser.manageViewLabel =
798
+ 'Select items to remove (customizable texts)';
799
+ }
800
+
801
+ /**
802
+ * Handler when the dev panel's "Enable manage mode -> Search" checkbox is changed.
803
+ */
804
+ private SearchManageModeCheckboxChanged(e: Event) {
805
+ const target = e.target as HTMLInputElement;
806
+ this.collectionBrowser.pageContext = target.checked
807
+ ? 'search'
808
+ : 'collection';
809
+ }
810
+
811
+ /**
812
+ * Handler for when the dev panel's "Enable smart facet bar" checkbox is changed.
813
+ */
814
+ private smartFacetBarCheckboxChanged(e: Event) {
815
+ const target = e.target as HTMLInputElement;
816
+ this.collectionBrowser.showSmartFacetBar = target.checked;
817
+ }
818
+
819
+ /**
820
+ * Handler for when the dev panel's "Enable tile action buttons" checkbox is changed.
821
+ */
822
+ private tileActionsCheckboxChanged(e: Event) {
823
+ const target = e.target as HTMLInputElement;
824
+ this.collectionBrowser.tileActions = target.checked
825
+ ? [{ id: 'demo-action', label: 'Return' }]
826
+ : [];
827
+ }
828
+
829
+ /**
830
+ * Handler for tile action button clicks (logs to console for QA).
831
+ */
832
+ private handleTileActionClicked(
833
+ e: CustomEvent<{ actionId: string; model: unknown }>,
834
+ ) {
835
+ console.log('Tile action clicked:', e.detail.actionId, e.detail.model);
836
+ }
837
+
838
+ /**
839
+ * Handler for when the dev panel's "Show facet top slot" checkbox is changed.
840
+ */
841
+ private facetTopSlotCheckboxChanged(e: Event) {
842
+ const target = e.target as HTMLInputElement;
843
+
844
+ const p = document.createElement('p');
845
+ p.style.setProperty('border', '1px solid #000');
846
+ p.textContent = 'New stuff as a child.';
847
+ p.style.setProperty('height', '20rem');
848
+ p.style.backgroundColor = '#00000';
849
+ p.setAttribute('slot', 'facet-top-slot');
850
+
851
+ if (target.checked) {
852
+ this.collectionBrowser.appendChild(p);
853
+ } else {
854
+ this.collectionBrowser.removeChild(
855
+ this.collectionBrowser.lastElementChild as Element,
856
+ );
857
+ }
858
+ }
859
+
860
+ private toggleSlotOptions() {
861
+ this.toggleSlots = !this.toggleSlots;
862
+ }
863
+
864
+ private resultLastTileSlotCheckboxChanged(e: Event) {
865
+ const target = e.target as HTMLInputElement;
866
+
867
+ const div = document.createElement('div');
868
+ const title = document.createElement('h3');
869
+ title.textContent = 'Upload';
870
+
871
+ div.setAttribute('slot', 'result-last-tile');
872
+ div.setAttribute('class', 'result-last-tile');
873
+ div.appendChild(title);
874
+
875
+ if (target.checked) {
876
+ this.collectionBrowser.appendChild(div);
877
+ } else {
878
+ this.collectionBrowser.removeChild(
879
+ this.collectionBrowser.lastElementChild as Element,
880
+ );
881
+ }
882
+ }
883
+
884
+ /**
885
+ * Handler for when the dev panel's "Show cb top slot" checkbox is changed.
886
+ */
887
+ private cbTopSlotCheckboxChanged(e: Event) {
888
+ const target = e.target as HTMLInputElement;
889
+
890
+ const p = document.createElement('p');
891
+ p.style.setProperty('border', '1px solid #000');
892
+ p.textContent = 'My Favorite list header.';
893
+ p.style.setProperty('height', '10rem');
894
+ p.style.backgroundColor = '#00000';
895
+ p.setAttribute('slot', 'cb-top-slot');
896
+
897
+ if (target.checked) {
898
+ this.collectionBrowser.appendChild(p);
899
+ } else {
900
+ this.collectionBrowser.removeChild(
901
+ this.collectionBrowser.lastElementChild as Element,
902
+ );
903
+ }
904
+ }
905
+
906
+ /**
907
+ * Handler for when the dev panel's "Show sort bar top left slot" checkbox is changed.
908
+ */
909
+ private sortBarLeftSlotCheckboxChanged(e: Event) {
910
+ const target = e.target as HTMLInputElement;
911
+
912
+ if (target.checked) {
913
+ const div = document.createElement('div');
914
+ div.style.setProperty('border', '1px solid #000');
915
+ div.textContent = 'Btn';
916
+ div.style.setProperty('height', '3rem');
917
+ div.style.setProperty('width', '3rem');
918
+ div.setAttribute('slot', 'sort-options-left');
919
+
920
+ this.collectionBrowser.appendChild(div);
921
+ } else {
922
+ const slottedEl = this.collectionBrowser.querySelector(
923
+ '[slot="sort-options-left"]',
924
+ );
925
+ if (slottedEl) this.collectionBrowser.removeChild(slottedEl);
926
+ }
927
+ }
928
+
929
+ /**
930
+ * Handler for when the dev panel's "Show sort bar top right slot" checkbox is changed.
931
+ */
932
+ private sortBarRightSlotCheckboxChanged(e: Event) {
933
+ const target = e.target as HTMLInputElement;
934
+
935
+ if (target.checked) {
936
+ const div = document.createElement('div');
937
+ div.style.setProperty('border', '1px solid #000');
938
+ div.textContent = 'Search bar';
939
+ div.style.setProperty('height', '3rem');
940
+ div.style.setProperty('width', '15rem');
941
+ div.setAttribute('slot', 'sort-options-right');
942
+
943
+ this.collectionBrowser.appendChild(div);
944
+ } else {
945
+ const slottedEl = this.collectionBrowser.querySelector(
946
+ '[slot="sort-options-right"]',
947
+ );
948
+ if (slottedEl) this.collectionBrowser.removeChild(slottedEl);
949
+ }
950
+ }
951
+
952
+ private rowGapChanged(e: Event) {
953
+ const input = e.target as HTMLInputElement;
954
+ this.rowGap = parseFloat(input.value);
955
+ this.collectionBrowser.style.setProperty(
956
+ '--collectionBrowserRowGap',
957
+ `${input.value}rem`,
958
+ );
959
+ }
960
+
961
+ private colGapChanged(e: Event) {
962
+ const input = e.target as HTMLInputElement;
963
+ this.colGap = parseFloat(input.value);
964
+ this.collectionBrowser.style.setProperty(
965
+ '--collectionBrowserColGap',
966
+ `${input.value}rem`,
967
+ );
968
+ }
969
+
970
+ private widthChanged(e: Event) {
971
+ const input = e.target as HTMLInputElement;
972
+ this.cellWidth = parseFloat(input.value);
973
+ this.collectionBrowser.style.setProperty(
974
+ '--collectionBrowserCellMinWidth',
975
+ `${input.value}rem`,
976
+ );
977
+ }
978
+
979
+ private heightChanged(e: Event) {
980
+ const input = e.target as HTMLInputElement;
981
+ this.cellHeight = parseFloat(input.value);
982
+ this.collectionBrowser.style.setProperty(
983
+ '--collectionBrowserCellMinHeight',
984
+ `${input.value}rem`,
985
+ );
986
+ this.collectionBrowser.style.setProperty(
987
+ '--collectionBrowserCellMaxHeight',
988
+ `${input.value}rem`,
989
+ );
990
+ }
991
+
992
+ private visiblePageChanged(e: CustomEvent<{ pageNumber: number }>) {
993
+ const { pageNumber } = e.detail;
994
+ if (pageNumber === this.currentPage) return;
995
+ this.currentPage = pageNumber;
996
+ }
997
+
998
+ /**
999
+ * Handler for when the dev panel's "Replace sort options" checkbox is changed.
1000
+ */
1001
+ private replaceSortOptionsChanged(e: Event) {
1002
+ const target = e.target as HTMLInputElement;
1003
+
1004
+ if (target.checked) {
1005
+ const p = document.createElement('p');
1006
+ p.style.setProperty('border', '1px solid #000');
1007
+ p.textContent = 'New stuff as a child.';
1008
+ p.style.setProperty('height', '20px');
1009
+ p.setAttribute('slot', 'sort-options');
1010
+
1011
+ this.collectionBrowser.appendChild(p);
1012
+ this.collectionBrowser.enableSortOptionsSlot = true;
1013
+ } else {
1014
+ const slottedEl = this.collectionBrowser.querySelector(
1015
+ '[slot="sort-options"]',
1016
+ );
1017
+ if (slottedEl) this.collectionBrowser.removeChild(slottedEl);
1018
+ this.collectionBrowser.enableSortOptionsSlot = false;
1019
+ }
1020
+ }
1021
+
1022
+ private profileElementChanged(e: Event) {
1023
+ const input = e.target as HTMLInputElement;
1024
+ this.profileElement = (input.value as PageElementName) || undefined;
1025
+ }
1026
+
1027
+ static styles = css`
1028
+ :host {
1029
+ display: block;
1030
+ --primaryButtonBGColor: #194880;
1031
+ --ia-theme-link-color: #4b64ff;
1032
+ }
1033
+
1034
+ /* add the following styles to ensure proper modal visibility */
1035
+ body.modal-manager-open {
1036
+ overflow: hidden;
1037
+ }
1038
+ modal-manager {
1039
+ display: none;
1040
+ }
1041
+ modal-manager[mode='open'] {
1042
+ display: block;
1043
+ }
1044
+ modal-manager.remove-items {
1045
+ --modalWidth: 58rem;
1046
+ --modalBorder: 2px solid var(--primaryButtonBGColor, #194880);
1047
+ --modalTitleLineHeight: 4rem;
1048
+ --modalTitleFontSize: 1.8rem;
1049
+ }
1050
+ modal-manager.more-search-facets {
1051
+ --modalWidth: 85rem;
1052
+ --modalBorder: 2px solid var(--primaryButtonBGColor, #194880);
1053
+ --modalTitleLineHeight: 4rem;
1054
+ --modalTitleFontSize: 1.8rem;
1055
+ --modalCornerRadius: 0;
1056
+ --modalBottomPadding: 0;
1057
+ --modalBottomMargin: 0;
1058
+ --modalScrollOffset: 0;
1059
+ --modalCornerRadius: 0.5rem;
1060
+ }
1061
+ modal-manager.expanded-date-picker {
1062
+ --modalWidth: 58rem;
1063
+ --modalBorder: 2px solid var(--primaryButtonBGColor, #194880);
1064
+ --modalTitleLineHeight: 4rem;
1065
+ --modalTitleFontSize: 1.8rem;
1066
+ --modalCornerRadius: 0;
1067
+ --modalBottomPadding: 0;
1068
+ --modalBottomMargin: 0;
1069
+ --modalScrollOffset: 0;
1070
+ --modalCornerRadius: 0.5rem;
1071
+ }
1072
+
1073
+ input,
1074
+ button {
1075
+ font-size: 1.6rem;
1076
+ }
1077
+
1078
+ modal-manager.showFacetGroupOutlines,
1079
+ collection-browser.showFacetGroupOutlines {
1080
+ --facet-row-border-top: 1px solid red;
1081
+ --facet-row-border-bottom: 1px solid blue;
1082
+ }
1083
+
1084
+ collection-browser {
1085
+ /* Same as production */
1086
+ max-width: 135rem;
1087
+ margin: auto;
1088
+ }
1089
+
1090
+ #collection-browser-container {
1091
+ /* Same as production */
1092
+ padding-left: 0.5rem;
1093
+ margin-bottom: 2rem;
1094
+ }
1095
+
1096
+ #base-query-field {
1097
+ width: 300px;
1098
+ }
1099
+
1100
+ .dev-tool-container {
1101
+ position: relative;
1102
+ }
1103
+ #dev-tools {
1104
+ position: relative;
1105
+ top: 0;
1106
+ left: 0;
1107
+ z-index: 1;
1108
+ -webkit-backdrop-filter: blur(10px);
1109
+ backdrop-filter: blur(10px);
1110
+ padding: 0.5rem 1rem;
1111
+ border: 1px solid black;
1112
+ font-size: 1.4rem;
1113
+ background: #ffffffb3;
1114
+ }
1115
+
1116
+ #dev-tools > * {
1117
+ display: flex;
1118
+ }
1119
+
1120
+ #toggle-dev-tools-btn {
1121
+ position: fixed;
1122
+ left: 77.4%;
1123
+ top: 0;
1124
+ background: red;
1125
+ padding: 5px;
1126
+ color: white;
1127
+ font-size: 1.4rem;
1128
+ margin: 0;
1129
+ z-index: 1;
1130
+ cursor: pointer;
1131
+ }
1132
+
1133
+ #search-and-page-inputs {
1134
+ flex-wrap: wrap;
1135
+ row-gap: 2px;
1136
+ }
1137
+
1138
+ #search-and-page-inputs > form {
1139
+ margin-right: 1rem;
1140
+ }
1141
+
1142
+ #search-and-page-inputs label {
1143
+ display: inline-block;
1144
+ min-width: 50px;
1145
+ }
1146
+
1147
+ #page-number-input {
1148
+ width: 75px;
1149
+ }
1150
+
1151
+ .search-type {
1152
+ margin-right: 1rem;
1153
+ }
1154
+
1155
+ .cell-controls {
1156
+ display: flex;
1157
+ flex-wrap: wrap;
1158
+ }
1159
+ .cell-controls div {
1160
+ display: flex;
1161
+ align-items: center;
1162
+ }
1163
+ .cell-controls input[type='range'] {
1164
+ width: 120px;
1165
+ }
1166
+ #cell-controls label {
1167
+ display: inline-block;
1168
+ width: 10rem;
1169
+ }
1170
+
1171
+ #cell-size-control,
1172
+ #cell-gap-control {
1173
+ flex-basis: calc(50% - 1rem);
1174
+ flex-grow: 1;
1175
+ }
1176
+
1177
+ #cell-gap-control {
1178
+ margin-left: 1rem;
1179
+ }
1180
+
1181
+ #checkbox-controls {
1182
+ padding-top: 0.5rem;
1183
+ flex-wrap: wrap;
1184
+ }
1185
+
1186
+ .checkbox-control {
1187
+ flex-basis: 50%;
1188
+ }
1189
+ .checkbox-control.indent {
1190
+ margin-left: 10px;
1191
+ }
1192
+ .checkbox-control label {
1193
+ user-select: none;
1194
+ }
1195
+
1196
+ #last-event {
1197
+ background-color: aliceblue;
1198
+ padding: 5px;
1199
+ margin: 5px auto;
1200
+ }
1201
+
1202
+ .hidden {
1203
+ display: none;
1204
+ }
1205
+
1206
+ #toggle-controls {
1207
+ background-color: lightskyblue;
1208
+ padding: 5px;
1209
+ margin: 5px auto;
1210
+ }
1211
+
1212
+ #search-types {
1213
+ margin: 5px auto;
1214
+ background-color: aliceblue;
1215
+ font-size: 1.6rem;
1216
+ }
1217
+
1218
+ // slots
1219
+ div[slot='cb-top-slot'] {
1220
+ height: 50px;
1221
+ border: 1px solid red;
1222
+ background: bisque;
1223
+ }
1224
+ div[slot='facet-top-slot'] {
1225
+ border: 1px solid red;
1226
+ width: 100%;
1227
+ height: 150px;
1228
+ background-color: darkseagreen;
1229
+ }
1230
+ div[slot='sort-slot-left'] {
1231
+ height: 50px;
1232
+ border: 1px solid red;
1233
+ background: bisque;
1234
+ }
1235
+
1236
+ /* user profile controls */
1237
+ .user-profile-controls {
1238
+ width: fit-content;
1239
+ }
1240
+
1241
+ .profile-element-controls {
1242
+ margin-top: 4px;
1243
+ }
1244
+
1245
+ .profile-element-controls summary {
1246
+ cursor: pointer;
1247
+ user-select: none;
1248
+ }
1249
+
1250
+ .profile-element-options {
1251
+ display: grid;
1252
+ grid-template-columns: 1fr 1fr;
1253
+ column-gap: 8px;
1254
+ margin-top: 4px;
1255
+ }
1256
+
1257
+ fieldset {
1258
+ display: inline-block !important;
1259
+ }
1260
+
1261
+ .result-last-tile {
1262
+ border-radius: 4px;
1263
+ background-color: white;
1264
+ border: 3px dashed #555;
1265
+ box-shadow: none;
1266
+ display: grid;
1267
+ align-content: center;
1268
+ }
1269
+ .result-last-tile:hover {
1270
+ box-shadow: rgba(8, 8, 32, 0.8) 0 0 6px 2px;
1271
+ transition: box-shadow 0.1s ease 0s;
1272
+ cursor: pointer;
1273
+ border: 3px dashed #4b64ff;
1274
+ }
1275
+ .result-last-tile h3 {
1276
+ margin-bottom: 4rem;
1277
+ margin: 0px auto;
1278
+ font-size: 2.8rem;
1279
+ color: rgb(44, 44, 44);
1280
+ font-weight: 200;
1281
+ text-align: center;
1282
+ }
1283
+ `;
1284
+ }