@internetarchive/collection-browser 0.0.1-alpha.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 (203) hide show
  1. package/.editorconfig +29 -0
  2. package/.github/workflows/ci.yml +26 -0
  3. package/.husky/pre-commit +4 -0
  4. package/LICENSE +661 -0
  5. package/README.md +68 -0
  6. package/demo/app-root.ts +414 -0
  7. package/demo/index.html +26 -0
  8. package/dist/demo/app-root.d.ts +43 -0
  9. package/dist/demo/app-root.js +385 -0
  10. package/dist/demo/app-root.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.js +3 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/src/assets/img/icons/audio.d.ts +1 -0
  15. package/dist/src/assets/img/icons/audio.js +9 -0
  16. package/dist/src/assets/img/icons/audio.js.map +1 -0
  17. package/dist/src/assets/img/icons/collection.d.ts +1 -0
  18. package/dist/src/assets/img/icons/collection.js +9 -0
  19. package/dist/src/assets/img/icons/collection.js.map +1 -0
  20. package/dist/src/assets/img/icons/etree.d.ts +1 -0
  21. package/dist/src/assets/img/icons/etree.js +9 -0
  22. package/dist/src/assets/img/icons/etree.js.map +1 -0
  23. package/dist/src/assets/img/icons/images.d.ts +1 -0
  24. package/dist/src/assets/img/icons/images.js +10 -0
  25. package/dist/src/assets/img/icons/images.js.map +1 -0
  26. package/dist/src/assets/img/icons/mediatype/account.d.ts +2 -0
  27. package/dist/src/assets/img/icons/mediatype/account.js +12 -0
  28. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  29. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  30. package/dist/src/assets/img/icons/mediatype/audio.js +11 -0
  31. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  32. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  33. package/dist/src/assets/img/icons/mediatype/collection.js +9 -0
  34. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  35. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +1 -0
  36. package/dist/src/assets/img/icons/mediatype/etree copy.js +9 -0
  37. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +1 -0
  38. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  39. package/dist/src/assets/img/icons/mediatype/etree.js +9 -0
  40. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  41. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  42. package/dist/src/assets/img/icons/mediatype/film.js +13 -0
  43. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  44. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  45. package/dist/src/assets/img/icons/mediatype/images.js +10 -0
  46. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  47. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +1 -0
  48. package/dist/src/assets/img/icons/mediatype/livemusic.js +7 -0
  49. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +1 -0
  50. package/dist/src/assets/img/icons/mediatype/photos.d.ts +1 -0
  51. package/dist/src/assets/img/icons/mediatype/photos.js +7 -0
  52. package/dist/src/assets/img/icons/mediatype/photos.js.map +1 -0
  53. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  54. package/dist/src/assets/img/icons/mediatype/software.js +10 -0
  55. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  56. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  57. package/dist/src/assets/img/icons/mediatype/texts.js +10 -0
  58. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  59. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  60. package/dist/src/assets/img/icons/mediatype/tv.js +9 -0
  61. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  62. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  63. package/dist/src/assets/img/icons/mediatype/video.js +10 -0
  64. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  65. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  66. package/dist/src/assets/img/icons/mediatype/web.js +10 -0
  67. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  68. package/dist/src/assets/img/icons/software.d.ts +1 -0
  69. package/dist/src/assets/img/icons/software.js +10 -0
  70. package/dist/src/assets/img/icons/software.js.map +1 -0
  71. package/dist/src/assets/img/icons/texts.d.ts +1 -0
  72. package/dist/src/assets/img/icons/texts.js +10 -0
  73. package/dist/src/assets/img/icons/texts.js.map +1 -0
  74. package/dist/src/assets/img/icons/tv.d.ts +1 -0
  75. package/dist/src/assets/img/icons/tv.js +9 -0
  76. package/dist/src/assets/img/icons/tv.js.map +1 -0
  77. package/dist/src/assets/img/icons/video.d.ts +1 -0
  78. package/dist/src/assets/img/icons/video.js +10 -0
  79. package/dist/src/assets/img/icons/video.js.map +1 -0
  80. package/dist/src/assets/img/icons/web.d.ts +1 -0
  81. package/dist/src/assets/img/icons/web.js +10 -0
  82. package/dist/src/assets/img/icons/web.js.map +1 -0
  83. package/dist/src/circular-activity-indicator.d.ts +5 -0
  84. package/dist/src/circular-activity-indicator.js +66 -0
  85. package/dist/src/circular-activity-indicator.js.map +1 -0
  86. package/dist/src/collection-browser.d.ts +151 -0
  87. package/dist/src/collection-browser.js +697 -0
  88. package/dist/src/collection-browser.js.map +1 -0
  89. package/dist/src/collection-facets.d.ts +34 -0
  90. package/dist/src/collection-facets.js +245 -0
  91. package/dist/src/collection-facets.js.map +1 -0
  92. package/dist/src/mediatype-icon.d.ts +9 -0
  93. package/dist/src/mediatype-icon.js +89 -0
  94. package/dist/src/mediatype-icon.js.map +1 -0
  95. package/dist/src/models.d.ts +23 -0
  96. package/dist/src/models.js +2 -0
  97. package/dist/src/models.js.map +1 -0
  98. package/dist/src/sort-filter-bar/alpha-bar.d.ts +10 -0
  99. package/dist/src/sort-filter-bar/alpha-bar.js +88 -0
  100. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  101. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +24 -0
  102. package/dist/src/sort-filter-bar/sort-filter-bar.js +257 -0
  103. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  104. package/dist/src/tiles/grid/account-tile.d.ts +7 -0
  105. package/dist/src/tiles/grid/account-tile.js +144 -0
  106. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  107. package/dist/src/tiles/grid/collection-tile.d.ts +7 -0
  108. package/dist/src/tiles/grid/collection-tile.js +160 -0
  109. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  110. package/dist/src/tiles/grid/icons/account.d.ts +1 -0
  111. package/dist/src/tiles/grid/icons/account.js +12 -0
  112. package/dist/src/tiles/grid/icons/account.js.map +1 -0
  113. package/dist/src/tiles/grid/icons/favorite-filled.d.ts +1 -0
  114. package/dist/src/tiles/grid/icons/favorite-filled.js +11 -0
  115. package/dist/src/tiles/grid/icons/favorite-filled.js.map +1 -0
  116. package/dist/src/tiles/grid/icons/reviews.d.ts +1 -0
  117. package/dist/src/tiles/grid/icons/reviews.js +11 -0
  118. package/dist/src/tiles/grid/icons/reviews.js.map +1 -0
  119. package/dist/src/tiles/grid/icons/upload.d.ts +1 -0
  120. package/dist/src/tiles/grid/icons/upload.js +12 -0
  121. package/dist/src/tiles/grid/icons/upload.js.map +1 -0
  122. package/dist/src/tiles/grid/icons/views.d.ts +2 -0
  123. package/dist/src/tiles/grid/icons/views.js +11 -0
  124. package/dist/src/tiles/grid/icons/views.js.map +1 -0
  125. package/dist/src/tiles/grid/item-tile.d.ts +9 -0
  126. package/dist/src/tiles/grid/item-tile.js +240 -0
  127. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  128. package/dist/src/tiles/list/tile-list-compact.d.ts +16 -0
  129. package/dist/src/tiles/list/tile-list-compact.js +125 -0
  130. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  131. package/dist/src/tiles/list/tile-list-detail.d.ts +17 -0
  132. package/dist/src/tiles/list/tile-list-detail.js +181 -0
  133. package/dist/src/tiles/list/tile-list-detail.js.map +1 -0
  134. package/dist/src/tiles/list/tile-list.d.ts +21 -0
  135. package/dist/src/tiles/list/tile-list.js +229 -0
  136. package/dist/src/tiles/list/tile-list.js.map +1 -0
  137. package/dist/src/tiles/loading-tile.d.ts +5 -0
  138. package/dist/src/tiles/loading-tile.js +73 -0
  139. package/dist/src/tiles/loading-tile.js.map +1 -0
  140. package/dist/src/tiles/tile-dispatcher.d.ts +27 -0
  141. package/dist/src/tiles/tile-dispatcher.js +160 -0
  142. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  143. package/dist/src/utils/format-count.d.ts +7 -0
  144. package/dist/src/utils/format-count.js +76 -0
  145. package/dist/src/utils/format-count.js.map +1 -0
  146. package/dist/src/utils/format-date.d.ts +2 -0
  147. package/dist/src/utils/format-date.js +24 -0
  148. package/dist/src/utils/format-date.js.map +1 -0
  149. package/dist/src/utils/format-string.d.ts +2 -0
  150. package/dist/src/utils/format-string.js +7 -0
  151. package/dist/src/utils/format-string.js.map +1 -0
  152. package/dist/test/collection-browser.test.d.ts +0 -0
  153. package/dist/test/collection-browser.test.js +3 -0
  154. package/dist/test/collection-browser.test.js.map +1 -0
  155. package/dist/test/utils/format-count.test.d.ts +1 -0
  156. package/dist/test/utils/format-count.test.js +24 -0
  157. package/dist/test/utils/format-count.test.js.map +1 -0
  158. package/dist/test/utils/format-date.test.d.ts +1 -0
  159. package/dist/test/utils/format-date.test.js +18 -0
  160. package/dist/test/utils/format-date.test.js.map +1 -0
  161. package/dist/test/utils/format-string.test.d.ts +1 -0
  162. package/dist/test/utils/format-string.test.js +17 -0
  163. package/dist/test/utils/format-string.test.js.map +1 -0
  164. package/index.ts +3 -0
  165. package/package.json +95 -0
  166. package/src/assets/img/icons/mediatype/account.ts +12 -0
  167. package/src/assets/img/icons/mediatype/audio.ts +11 -0
  168. package/src/assets/img/icons/mediatype/collection.ts +9 -0
  169. package/src/assets/img/icons/mediatype/etree.ts +9 -0
  170. package/src/assets/img/icons/mediatype/film.ts +13 -0
  171. package/src/assets/img/icons/mediatype/foo.svg +5 -0
  172. package/src/assets/img/icons/mediatype/images.ts +10 -0
  173. package/src/assets/img/icons/mediatype/software.ts +10 -0
  174. package/src/assets/img/icons/mediatype/texts.ts +10 -0
  175. package/src/assets/img/icons/mediatype/tv.ts +9 -0
  176. package/src/assets/img/icons/mediatype/video.ts +10 -0
  177. package/src/assets/img/icons/mediatype/web.ts +10 -0
  178. package/src/circular-activity-indicator.ts +64 -0
  179. package/src/collection-browser.ts +756 -0
  180. package/src/collection-facets.ts +285 -0
  181. package/src/mediatype-icon.ts +83 -0
  182. package/src/models.ts +25 -0
  183. package/src/sort-filter-bar/alpha-bar.ts +86 -0
  184. package/src/sort-filter-bar/sort-filter-bar.ts +256 -0
  185. package/src/tiles/grid/account-tile.ts +141 -0
  186. package/src/tiles/grid/collection-tile.ts +157 -0
  187. package/src/tiles/grid/icons/account.ts +12 -0
  188. package/src/tiles/grid/icons/favorite-filled.ts +11 -0
  189. package/src/tiles/grid/icons/reviews.ts +11 -0
  190. package/src/tiles/grid/icons/upload.ts +12 -0
  191. package/src/tiles/grid/icons/views.ts +11 -0
  192. package/src/tiles/grid/item-tile.ts +254 -0
  193. package/src/tiles/list/tile-list.ts +227 -0
  194. package/src/tiles/loading-tile.ts +70 -0
  195. package/src/tiles/tile-dispatcher.ts +160 -0
  196. package/src/utils/format-count.ts +95 -0
  197. package/src/utils/format-date.ts +36 -0
  198. package/test/collection-browser.test.ts +1 -0
  199. package/test/utils/format-count.test.ts +32 -0
  200. package/test/utils/format-date.test.ts +22 -0
  201. package/tsconfig.json +20 -0
  202. package/web-dev-server.config.mjs +28 -0
  203. package/web-test-runner.config.mjs +41 -0
package/README.md ADDED
@@ -0,0 +1,68 @@
1
+ ![Build Status](https://github.com/internetarchive/iaux-typescript-wc-template/actions/workflows/ci.yml/badge.svg)
2
+
3
+ # Internet Archive Typescript WebComponent Template
4
+
5
+ This is a base template for creating Typescript WebComponents. It is based off of the [Open WebComponents generator](https://open-wc.org/docs/development/generator/) with some IA-specific customizations and some development niceities.
6
+
7
+ ## Usage
8
+
9
+ 1. Click the "Use this Template" button in GitHub to create a new repository based on this one.
10
+ 2. Clone your new repo and update the things below:
11
+
12
+ ### Things to update in your copy
13
+ 1. Remove this section
14
+ 2. Search for the strings `your-webcomponent` and `YourWebComponent` and those are most of the spots that need to be updated.
15
+ 3. `README.md` (this file). Update the readme in general, but also the badge URLs
16
+ 4. `package.json` Update the name and description
17
+ 5. Rename the `your-webcomponent.ts` and its associated `.test` file
18
+
19
+ ## Local Demo with `web-dev-server`
20
+ ```bash
21
+ yarn start
22
+ ```
23
+ To run a local development server that serves the basic demo located in `demo/index.html`
24
+
25
+ ## Testing with Web Test Runner
26
+ To run the suite of Web Test Runner tests, run
27
+ ```bash
28
+ yarn run test
29
+ ```
30
+
31
+ To run the tests in watch mode (for <abbr title="test driven development">TDD</abbr>, for example), run
32
+
33
+ ```bash
34
+ yarn run test:watch
35
+ ```
36
+
37
+ ## Linting with ESLint, Prettier, and Types
38
+ To scan the project for linting errors, run
39
+ ```bash
40
+ yarn run lint
41
+ ```
42
+
43
+ You can lint with ESLint and Prettier individually as well
44
+ ```bash
45
+ yarn run lint:eslint
46
+ ```
47
+ ```bash
48
+ yarn run lint:prettier
49
+ ```
50
+
51
+ To automatically fix many linting errors, run
52
+ ```bash
53
+ yarn run format
54
+ ```
55
+
56
+ You can format using ESLint and Prettier individually as well
57
+ ```bash
58
+ yarn run format:eslint
59
+ ```
60
+ ```bash
61
+ yarn run format:prettier
62
+ ```
63
+
64
+ ## Tooling configs
65
+
66
+ For most of the tools, the configuration is in the `package.json` to reduce the amount of files in your project.
67
+
68
+ If you customize the configuration a lot, you can consider moving them to individual files.
@@ -0,0 +1,414 @@
1
+ import { SearchService } from '@internetarchive/search-service';
2
+ import { html, css, LitElement, PropertyValues } from 'lit';
3
+ import { customElement, query, state } from 'lit/decorators.js';
4
+ import {
5
+ SortDirection,
6
+ SortParam,
7
+ } from '@internetarchive/search-service/dist/src/search-params';
8
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
9
+ import type { CollectionBrowser } from '../src/collection-browser';
10
+ import '../src/collection-browser';
11
+ import { CollectionDisplayMode } from '../src/models';
12
+ import { SortFilterBar } from '../src/sort-filter-bar/sort-filter-bar';
13
+
14
+ @customElement('app-root')
15
+ export class AppRoot extends LitElement {
16
+ private searchService = SearchService.default;
17
+
18
+ private resizeObserver = new SharedResizeObserver();
19
+
20
+ @state() private currentPage?: number;
21
+
22
+ @state() private searchQuery?: string;
23
+
24
+ @state() private sortParam?: SortParam;
25
+
26
+ @state() private cellWidth: number = 18;
27
+
28
+ @state() private cellHeight: number = 29;
29
+
30
+ @state() private rowGap: number = 1.7;
31
+
32
+ @state() private colGap: number = 1.7;
33
+
34
+ @query('#base-query-field') private baseQueryField!: HTMLInputElement;
35
+
36
+ @query('#page-number-input') private pageNumberInput!: HTMLInputElement;
37
+
38
+ @query('collection-browser') private collectionBrowser!: CollectionBrowser;
39
+
40
+ @query('sort-filter-bar') private sortFilterBar!: SortFilterBar;
41
+
42
+ private searchPressed(e: Event) {
43
+ e.preventDefault();
44
+ this.searchQuery = this.baseQueryField.value;
45
+ if ((this.currentPage ?? 1) > 1) {
46
+ this.collectionBrowser.goToPage(this.currentPage ?? 1);
47
+ }
48
+ this.currentPage = 1;
49
+ }
50
+
51
+ private changePagePressed(e: Event) {
52
+ e.preventDefault();
53
+ this.currentPage = this.pageNumberInput.valueAsNumber;
54
+ this.collectionBrowser.goToPage(this.currentPage);
55
+ }
56
+
57
+ protected firstUpdated(): void {
58
+ this.loadStateFromUrl();
59
+ }
60
+
61
+ protected updated(changed: PropertyValues): void {
62
+ if (changed.has('currentPage') && this.currentPage) {
63
+ this.pageNumberInput.value = this.currentPage.toString();
64
+ this.updateUrl();
65
+ }
66
+
67
+ if (changed.has('searchQuery')) {
68
+ this.queryUpdated();
69
+ }
70
+
71
+ if (changed.has('sortParam')) {
72
+ this.sortParamUpdated();
73
+ }
74
+ }
75
+
76
+ private loadStateFromUrl() {
77
+ const url = new URL(window.location.href);
78
+ const pageNumber = url.searchParams.get('page');
79
+ const searchQuery = url.searchParams.get('query');
80
+ const sortQuery = url.searchParams.get('sort');
81
+ if (pageNumber) {
82
+ const parsed = parseInt(pageNumber, 10);
83
+ this.currentPage = parsed;
84
+ if (parsed > 1) {
85
+ this.collectionBrowser.goToPage(parsed);
86
+ }
87
+ } else {
88
+ this.currentPage = 1;
89
+ }
90
+ if (searchQuery) {
91
+ this.searchQuery = searchQuery;
92
+ } else {
93
+ this.searchQuery = 'collection:etree';
94
+ }
95
+ if (sortQuery) {
96
+ const [field, direction] = sortQuery.split(' ');
97
+ this.sortParam = new SortParam(field, direction as SortDirection);
98
+ } else {
99
+ this.sortParam = new SortParam('date', 'desc');
100
+ }
101
+ }
102
+
103
+ private queryUpdated() {
104
+ this.collectionBrowser.baseQuery = this.searchQuery;
105
+ this.updateUrl();
106
+ }
107
+
108
+ private sortParamUpdated() {
109
+ if (!this.sortParam) return;
110
+ this.collectionBrowser.sortParam = this.sortParam;
111
+ this.sortFilterBar.sortDirection = this.sortParam.direction;
112
+ this.updateUrl();
113
+ }
114
+
115
+ private updateUrl() {
116
+ const url = new URL(window.location.href);
117
+ if (this.sortParam) {
118
+ url.searchParams.set('sort', this.sortParam.asString);
119
+ }
120
+
121
+ if (this.searchQuery) {
122
+ url.searchParams.set('query', this.searchQuery);
123
+ }
124
+
125
+ if (this.currentPage) {
126
+ if (this.currentPage > 1) {
127
+ url.searchParams.set('page', this.currentPage.toString());
128
+ } else {
129
+ url.searchParams.delete('page');
130
+ }
131
+ }
132
+
133
+ window.history.pushState(
134
+ {
135
+ page: this.currentPage,
136
+ query: this.searchQuery,
137
+ },
138
+ '',
139
+ url.toString()
140
+ );
141
+ }
142
+
143
+ render() {
144
+ return html`
145
+ <div id="dev-tools">
146
+ <form @submit=${this.searchPressed}>
147
+ Query:
148
+ <input type="text" id="base-query-field" .value=${this.searchQuery} />
149
+ <input type="submit" value="Search" />
150
+ </form>
151
+
152
+ <form @submit=${this.changePagePressed}>
153
+ Page: <input type="number" value="1" id="page-number-input" />
154
+ <input type="submit" value="Go" />
155
+ </form>
156
+
157
+ <button
158
+ @click=${() => {
159
+ this.collectionBrowser.showDeleteButtons =
160
+ !this.collectionBrowser.showDeleteButtons;
161
+ }}
162
+ >
163
+ Toggle Delete Mode
164
+ </button>
165
+
166
+ <sort-filter-bar
167
+ @sortChanged=${this.sortChanged}
168
+ @displayModeChanged=${this.displayModeChanged}
169
+ @titleLetterChanged=${this.titleLetterChanged}
170
+ @creatorLetterChanged=${this.creatorLetterChanged}
171
+ ></sort-filter-bar>
172
+
173
+ <div id="cell-controls">
174
+ <div id="cell-size-control">
175
+ <div>
176
+ <label for="cell-width-slider">Minimum cell width:</label>
177
+ <input
178
+ type="range"
179
+ min="10"
180
+ max="100"
181
+ value="18"
182
+ step="0.1"
183
+ id="cell-width-slider"
184
+ @input=${this.widthChanged}
185
+ />
186
+ <span>${this.cellWidth}rem</span>
187
+ </div>
188
+ <div>
189
+ <label for="cell-height-slider">Cell height:</label>
190
+ <input
191
+ type="range"
192
+ min="10"
193
+ max="100"
194
+ value="29"
195
+ step="0.1"
196
+ id="cell-height-slider"
197
+ @input=${this.heightChanged}
198
+ />
199
+ <span>${this.cellHeight}rem</span>
200
+ </div>
201
+ <div>
202
+ <label for="show-outline-check">Show outlines:</label>
203
+ <input
204
+ type="checkbox"
205
+ id="show-outline-check"
206
+ @click=${this.outlineChanged}
207
+ />
208
+ </div>
209
+ </div>
210
+ <div id="cell-gap-control">
211
+ <div>
212
+ <label for="cell-row-gap-slider">Row gap:</label>
213
+ <input
214
+ type="range"
215
+ min="0"
216
+ max="5"
217
+ value="1.7"
218
+ step="0.1"
219
+ id="cell-row-gap-slider"
220
+ @input=${this.rowGapChanged}
221
+ />
222
+ <span>${this.rowGap}rem</span>
223
+ </div>
224
+ <div>
225
+ <label for="cell-col-gap-slider">Col gap:</label>
226
+ <input
227
+ type="range"
228
+ min="0"
229
+ max="5"
230
+ value="1.7"
231
+ step="0.1"
232
+ id="cell-col-gap-slider"
233
+ @input=${this.colGapChanged}
234
+ />
235
+ <span>${this.colGap}rem</span>
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+ <collection-browser
242
+ .baseNavigationUrl=${'https://archive.org'}
243
+ .searchService=${this.searchService}
244
+ .additionalQueryClause=${this.sortFilterQueries}
245
+ .resizeObserver=${this.resizeObserver}
246
+ @visiblePageChanged=${this.visiblePageChanged}
247
+ >
248
+ </collection-browser>
249
+ `;
250
+ }
251
+
252
+ private outlineChanged(e: Event) {
253
+ const target = e.target as HTMLInputElement;
254
+ if (target.checked) {
255
+ this.collectionBrowser.style.setProperty(
256
+ '--infiniteScrollerCellOutline',
257
+ '1px solid #33D1FF'
258
+ );
259
+ } else {
260
+ this.collectionBrowser.style.removeProperty(
261
+ '--infiniteScrollerCellOutline'
262
+ );
263
+ }
264
+ }
265
+
266
+ private titleSelectorVisibilityChanged(e: CustomEvent<{ visible: boolean }>) {
267
+ console.debug('titleSelectorVisibleChanged', e.detail);
268
+ if (e.detail.visible) {
269
+ this.sortParam = new SortParam('titleSorter', 'asc');
270
+ }
271
+ }
272
+
273
+ private sortByViewsPressed() {
274
+ this.sortParam = new SortParam('week', 'desc');
275
+ }
276
+
277
+ private creatorSelectorVisibilityChanged(
278
+ e: CustomEvent<{ visible: boolean }>
279
+ ) {
280
+ if (e.detail.visible) {
281
+ this.sortParam = new SortParam('creatorSorter', 'asc');
282
+ }
283
+ }
284
+
285
+ private rowGapChanged(e: Event) {
286
+ const input = e.target as HTMLInputElement;
287
+ this.rowGap = parseFloat(input.value);
288
+ this.collectionBrowser.style.setProperty(
289
+ '--collectionBrowserRowGap',
290
+ `${input.value}rem`
291
+ );
292
+ }
293
+
294
+ private colGapChanged(e: Event) {
295
+ const input = e.target as HTMLInputElement;
296
+ this.colGap = parseFloat(input.value);
297
+ this.collectionBrowser.style.setProperty(
298
+ '--collectionBrowserColGap',
299
+ `${input.value}rem`
300
+ );
301
+ }
302
+
303
+ private widthChanged(e: Event) {
304
+ const input = e.target as HTMLInputElement;
305
+ this.cellWidth = parseFloat(input.value);
306
+ this.collectionBrowser.style.setProperty(
307
+ '--collectionBrowserCellMinWidth',
308
+ `${input.value}rem`
309
+ );
310
+ }
311
+
312
+ private heightChanged(e: Event) {
313
+ const input = e.target as HTMLInputElement;
314
+ this.cellHeight = parseFloat(input.value);
315
+ this.collectionBrowser.style.setProperty(
316
+ '--collectionBrowserCellMinHeight',
317
+ `${input.value}rem`
318
+ );
319
+ this.collectionBrowser.style.setProperty(
320
+ '--collectionBrowserCellMaxHeight',
321
+ `${input.value}rem`
322
+ );
323
+ }
324
+
325
+ private visiblePageChanged(e: CustomEvent<{ pageNumber: number }>) {
326
+ const { pageNumber } = e.detail;
327
+ if (pageNumber === this.currentPage) return;
328
+ this.currentPage = pageNumber;
329
+ }
330
+
331
+ private sortChanged(e: CustomEvent<{ sort: SortParam }>) {
332
+ this.sortParam = e.detail.sort;
333
+ if ((this.currentPage ?? 1) > 1) {
334
+ this.collectionBrowser.goToPage(1);
335
+ }
336
+ this.currentPage = 1;
337
+ }
338
+
339
+ private displayModeChanged(
340
+ e: CustomEvent<{ displayMode: CollectionDisplayMode }>
341
+ ) {
342
+ this.collectionBrowser.displayMode = e.detail.displayMode;
343
+ }
344
+
345
+ @state() titleQuery?: string;
346
+
347
+ @state() creatorQuery?: string;
348
+
349
+ private get sortFilterQueries(): string {
350
+ const queries = [this.titleQuery, this.creatorQuery];
351
+ return queries.filter(q => q).join(' AND ');
352
+ }
353
+
354
+ private titleLetterChanged(e: CustomEvent<{ selectedLetter: string }>) {
355
+ const letter = e.detail.selectedLetter;
356
+ if (letter) {
357
+ this.titleQuery = `firstTitle:${letter}`;
358
+ } else {
359
+ this.titleQuery = undefined;
360
+ }
361
+ }
362
+
363
+ private creatorLetterChanged(e: CustomEvent<{ selectedLetter: string }>) {
364
+ const letter = e.detail.selectedLetter;
365
+ if (letter) {
366
+ this.creatorQuery = `firstCreator:${letter}`;
367
+ } else {
368
+ this.creatorQuery = undefined;
369
+ }
370
+ }
371
+
372
+ static styles = css`
373
+ :host {
374
+ display: block;
375
+ }
376
+
377
+ input,
378
+ button {
379
+ font-size: 1.6rem;
380
+ }
381
+
382
+ collection-browser {
383
+ margin-top: 30rem;
384
+ }
385
+
386
+ #base-query-field {
387
+ width: 300px;
388
+ }
389
+
390
+ #dev-tools {
391
+ position: fixed;
392
+ top: 0;
393
+ left: 0;
394
+ z-index: 10;
395
+ -webkit-backdrop-filter: blur(10px);
396
+ backdrop-filter: blur(10px);
397
+ padding: 0.5rem 1rem;
398
+ border: 1px solid black;
399
+ }
400
+
401
+ #cell-controls {
402
+ display: flex;
403
+ }
404
+
405
+ #cell-controls label {
406
+ display: inline-block;
407
+ width: 10rem;
408
+ }
409
+
410
+ #cell-gap-control {
411
+ margin-left: 1rem;
412
+ }
413
+ `;
414
+ }
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html lang="en-GB">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <style>
6
+ html {
7
+ font-size: 10px; /* This is to match petabox's base font size */
8
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
9
+ }
10
+
11
+ body {
12
+ background: #fff;
13
+ color: #2C2C2C;
14
+ }
15
+ </style>
16
+ <script
17
+ src="https://polyfill.archive.org/v3/polyfill.min.js?features=scrollIntoView%2CElement.prototype.scrollIntoView"></script>
18
+
19
+ </head>
20
+ <body>
21
+ <app-root></app-root>
22
+
23
+ <script type="module" src="../dist/demo/app-root.js">
24
+ </script>
25
+ </body>
26
+ </html>
@@ -0,0 +1,43 @@
1
+ import { LitElement, PropertyValues } from 'lit';
2
+ import '../src/collection-browser';
3
+ export declare class AppRoot extends LitElement {
4
+ private searchService;
5
+ private resizeObserver;
6
+ private currentPage?;
7
+ private searchQuery?;
8
+ private sortParam?;
9
+ private cellWidth;
10
+ private cellHeight;
11
+ private rowGap;
12
+ private colGap;
13
+ private baseQueryField;
14
+ private pageNumberInput;
15
+ private collectionBrowser;
16
+ private sortFilterBar;
17
+ private searchPressed;
18
+ private changePagePressed;
19
+ protected firstUpdated(): void;
20
+ protected updated(changed: PropertyValues): void;
21
+ private loadStateFromUrl;
22
+ private queryUpdated;
23
+ private sortParamUpdated;
24
+ private updateUrl;
25
+ render(): import("lit-html").TemplateResult<1>;
26
+ private outlineChanged;
27
+ private titleSelectorVisibilityChanged;
28
+ private sortByViewsPressed;
29
+ private creatorSelectorVisibilityChanged;
30
+ private rowGapChanged;
31
+ private colGapChanged;
32
+ private widthChanged;
33
+ private heightChanged;
34
+ private visiblePageChanged;
35
+ private sortChanged;
36
+ private displayModeChanged;
37
+ titleQuery?: string;
38
+ creatorQuery?: string;
39
+ private get sortFilterQueries();
40
+ private titleLetterChanged;
41
+ private creatorLetterChanged;
42
+ static styles: import("lit").CSSResult;
43
+ }