@internetarchive/collection-browser 0.2.4-alpha.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/src/sort-filter-bar/sort-filter-bar.js +1 -1
  2. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  3. package/dist/src/tiles/grid/account-tile.d.ts +0 -1
  4. package/dist/src/tiles/grid/account-tile.js +78 -45
  5. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  6. package/dist/src/tiles/grid/icons/account.d.ts +1 -0
  7. package/dist/src/tiles/grid/icons/account.js +12 -0
  8. package/dist/src/tiles/grid/icons/account.js.map +1 -0
  9. package/dist/src/{assets/img → tiles/grid}/icons/favorite-filled.d.ts +0 -0
  10. package/dist/src/{assets/img → tiles/grid}/icons/favorite-filled.js +0 -0
  11. package/dist/src/{assets/img → tiles/grid}/icons/favorite-filled.js.map +1 -1
  12. package/dist/src/{assets/img → tiles/grid}/icons/reviews.d.ts +0 -0
  13. package/dist/src/{assets/img → tiles/grid}/icons/reviews.js +0 -0
  14. package/dist/src/{assets/img → tiles/grid}/icons/reviews.js.map +1 -1
  15. package/dist/src/{assets/img → tiles/grid}/icons/upload.d.ts +0 -0
  16. package/dist/src/{assets/img → tiles/grid}/icons/upload.js +0 -0
  17. package/dist/src/{assets/img → tiles/grid}/icons/upload.js.map +1 -1
  18. package/dist/src/tiles/grid/icons/views.d.ts +2 -0
  19. package/dist/src/{assets/img → tiles/grid}/icons/views.js +1 -1
  20. package/dist/src/tiles/grid/icons/views.js.map +1 -0
  21. package/dist/src/tiles/grid/item-tile.d.ts +0 -1
  22. package/dist/src/tiles/grid/item-tile.js +122 -49
  23. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  24. package/dist/src/tiles/mediatype-icon.js +1 -19
  25. package/dist/src/tiles/mediatype-icon.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/sort-filter-bar/sort-filter-bar.ts +1 -1
  28. package/src/tiles/grid/account-tile.ts +77 -44
  29. package/src/tiles/grid/icons/account.ts +12 -0
  30. package/src/{assets/img → tiles/grid}/icons/favorite-filled.ts +0 -0
  31. package/src/{assets/img → tiles/grid}/icons/reviews.ts +0 -0
  32. package/src/{assets/img → tiles/grid}/icons/upload.ts +0 -0
  33. package/src/{assets/img → tiles/grid}/icons/views.ts +1 -1
  34. package/src/tiles/grid/item-tile.ts +123 -50
  35. package/src/tiles/mediatype-icon.ts +1 -19
  36. package/dist/src/assets/img/icons/views.d.ts +0 -1
  37. package/dist/src/assets/img/icons/views.js.map +0 -1
  38. package/dist/src/tiles/grid/tile-stats.d.ts +0 -10
  39. package/dist/src/tiles/grid/tile-stats.js +0 -133
  40. package/dist/src/tiles/grid/tile-stats.js.map +0 -1
  41. package/src/tiles/grid/tile-stats.ts +0 -131
@@ -2,116 +2,189 @@ import { __decorate } from "tslib";
2
2
  /* eslint-disable import/no-duplicates */
3
3
  import { css, html, LitElement, nothing } from 'lit';
4
4
  import { customElement, property } from 'lit/decorators.js';
5
- import { ifDefined } from 'lit/directives/if-defined.js';
5
+ import { formatCount } from '../../utils/format-count';
6
+ import { favoriteFilledIcon } from './icons/favorite-filled';
7
+ import { reviewsIcon } from './icons/reviews';
8
+ import viewsIcon from './icons/views';
6
9
  import '../mediatype-icon';
7
10
  import '../item-image';
8
- import './tile-stats';
9
11
  let ItemTile = class ItemTile extends LitElement {
10
12
  render() {
11
- var _a, _b, _c, _d, _e, _f;
12
- const itemTitle = (_a = this.model) === null || _a === void 0 ? void 0 : _a.title;
13
+ var _a, _b, _c, _d, _e, _f, _g;
14
+ const itemTitle = ((_a = this.model) === null || _a === void 0 ? void 0 : _a.title) || nothing;
13
15
  const itemCreator = (_b = this.model) === null || _b === void 0 ? void 0 : _b.creator;
14
16
  return html `
15
- <div class="container">
16
- <div class="item-info">
17
- <div id="title">
18
- <h1 class="truncated" title=${ifDefined(itemTitle)}>${itemTitle}</h1>
19
- </div>
20
-
21
- <div id="image">
22
- <item-image
23
- .model=${this.model}
24
- .baseImageUrl=${this.baseImageUrl}>
17
+ <div id="container">
18
+ <div id="title-image-container">
19
+ <h1 id="item-title" title=${itemTitle}>${itemTitle}</h1>
20
+ <div id="item-image-container">
21
+ <item-image .model=${this.model} .baseImageUrl=${this.baseImageUrl}>
25
22
  </item-image>
26
23
  </div>
27
- <div class="created-by truncated">
28
- ${itemCreator ? html `<span>by&nbsp;${itemCreator}</span>` : nothing}
24
+ <div class="item-creator">
25
+ <div class="truncated">
26
+ ${itemCreator
27
+ ? html `<span>by&nbsp;${itemCreator}</span>`
28
+ : nothing}
29
+ </div>
29
30
  </div>
30
31
  </div>
31
32
 
32
- <tile-stats
33
- .mediatype=${(_c = this.model) === null || _c === void 0 ? void 0 : _c.mediatype}
34
- .viewCount=${(_d = this.model) === null || _d === void 0 ? void 0 : _d.viewCount}
35
- .favCount=${(_e = this.model) === null || _e === void 0 ? void 0 : _e.favCount}
36
- .commentCount=${(_f = this.model) === null || _f === void 0 ? void 0 : _f.commentCount}>
37
- </tile-stats>
33
+ <div class="hr"></div>
34
+
35
+ <div id="item-stats-container">
36
+ <div id="stats-holder">
37
+ <div class="col">
38
+ <mediatype-icon
39
+ .mediatype=${(_c = this.model) === null || _c === void 0 ? void 0 : _c.mediatype}
40
+ .collection=${(_d = this.model) === null || _d === void 0 ? void 0 : _d.collections}
41
+ style="--iconHeight:25px; --iconWidth:25px;"
42
+ >
43
+ </mediatype-icon>
44
+ </div>
45
+ <div class="col">
46
+ ${viewsIcon}
47
+ <p class="status-text">
48
+ ${formatCount((_e = this.model) === null || _e === void 0 ? void 0 : _e.viewCount, 'short', 'short')}
49
+ </p>
50
+ </div>
51
+ <div class="col">
52
+ ${favoriteFilledIcon}
53
+ <p class="status-text">
54
+ ${formatCount((_f = this.model) === null || _f === void 0 ? void 0 : _f.itemCount, 'short', 'short')}
55
+ </p>
56
+ </div>
57
+ <div class="col">
58
+ ${reviewsIcon}
59
+ <p class="status-text">
60
+ ${formatCount((_g = this.model) === null || _g === void 0 ? void 0 : _g.favCount, 'short', 'short')}
61
+ </p>
62
+ </div>
63
+ </div>
38
64
  </div>
39
65
  </div>
40
66
  `;
41
67
  }
42
68
  static get styles() {
69
+ const cornerRadiusCss = css `var(--collectionTileCornerRadius, 4px)`;
43
70
  return css `
44
- .container {
71
+ #container {
45
72
  background-color: #ffffff;
46
- border-radius: var(--collectionTileCornerRadius, 4px);
73
+ border-radius: ${cornerRadiusCss};
47
74
  box-shadow: 1px 1px 2px 0px;
48
75
  display: flex;
49
76
  flex-direction: column;
50
77
  height: 100%;
78
+ position: relative;
51
79
  }
52
80
 
53
- .item-info {
54
- padding: 5px 5px 0 5px;
55
- flex-grow: 1;
81
+ #title-image-container {
82
+ display: flex;
83
+ flex: 1;
84
+ flex-direction: column;
85
+ padding: 0.5rem 0.5rem 0 0.5rem;
56
86
  }
57
87
 
58
- #title {
59
- flex-shrink: 0;
88
+ #item-title {
89
+ color: #2c2c2c;
90
+ font-size: 1.6rem;
91
+ text-align: center;
92
+ margin-top: 0rem;
93
+ margin-bottom: 0.5rem;
94
+ overflow: hidden;
95
+ text-overflow: ellipsis;
96
+ display: -webkit-box;
97
+ -webkit-line-clamp: 2;
98
+ -webkit-box-orient: vertical;
99
+ line-height: 2rem;
100
+ height: 4rem;
60
101
  }
61
102
 
62
- #image {
103
+ #item-image-container {
63
104
  display: flex;
64
105
  justify-content: center;
65
106
  flex: 1;
66
- height: 16rem;
67
107
  }
68
108
 
69
109
  .hidden {
70
110
  display: none;
71
111
  }
72
112
 
73
- .container:hover > .item-info > #title > .truncated {
113
+ #container:hover > #title-image-container > .item-title {
74
114
  text-decoration: underline;
75
115
  }
76
116
 
77
117
  /** this is a workaround for Safari 15 where the hover effects are not working */
78
- #title:hover > .truncated {
118
+ #title-image-container:hover > #item-title {
79
119
  text-decoration: underline;
80
120
  }
81
121
 
82
- .created-by {
122
+ #container:hover > #item-title {
123
+ background-color: #fcfcfc;
124
+ }
125
+
126
+ .item-creator {
83
127
  display: flex;
84
128
  justify-content: center;
85
129
  align-items: flex-end; /* Important to start text from bottom */
86
130
  height: 3rem;
87
131
  padding-top: 1rem;
88
- margin-top: 5px;
89
132
  }
90
133
 
91
134
  .truncated {
92
135
  flex: 1;
93
- color: #2c2c2c;
94
136
  min-width: 0; /* Important for long words! */
95
- text-align: center;
96
- line-height: 2rem;
97
- text-overflow: ellipsis;
98
- overflow: hidden;
99
- word-wrap: break-word;
100
- -webkit-line-clamp: 2;
101
- -webkit-box-orient: vertical;
102
137
  }
103
138
 
104
139
  .truncated span {
105
140
  font-size: 1.4rem;
141
+ color: #2c2c2c;
142
+ -webkit-line-clamp: 2;
143
+ text-overflow: ellipsis;
144
+ overflow: hidden;
106
145
  display: -webkit-box;
146
+ -webkit-box-orient: vertical;
147
+ word-wrap: break-word;
148
+ line-height: 2rem;
149
+ text-align: center;
107
150
  }
108
151
 
109
- h1.truncated {
110
- margin-top: 0rem;
111
- margin-bottom: 0.5rem;
112
- font-size: 1.6rem;
113
- height: 4rem;
114
- display: -webkit-box;
152
+ .hr {
153
+ border: 0.5px solid #ccc;
154
+ }
155
+
156
+ #item-stats-container {
157
+ align-items: center;
158
+ display: flex;
159
+ height: 5.5rem;
160
+ padding-left: 1rem;
161
+ padding-right: 0.5rem;
162
+ }
163
+
164
+ #stats-holder {
165
+ align-items: center;
166
+ display: flex;
167
+ flex: 1;
168
+ justify-content: space-evenly;
169
+ text-align: center;
170
+ width: 100%;
171
+ }
172
+
173
+ svg {
174
+ height: 10px;
175
+ width: 10px;
176
+ }
177
+
178
+ .status-text {
179
+ font-size: 14px;
180
+ color: #2c2c2c;
181
+ margin: auto;
182
+ display: block;
183
+ text-align: center;
184
+ }
185
+
186
+ .col {
187
+ width: 25%;
115
188
  }
116
189
  `;
117
190
  }
@@ -1 +1 @@
1
- {"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAIzD,OAAO,mBAAmB,CAAC;AAC3B,OAAO,eAAe,CAAC;AACvB,OAAO,cAAc,CAAC;AAGtB,IAAa,QAAQ,GAArB,MAAa,QAAS,SAAQ,UAAU;IAKtC,MAAM;;QACJ,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK,CAAC;QACpC,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,CAAC;QACxC,OAAO,IAAI,CAAA;;;;0CAI2B,SAAS,CACrC,SAAS,CACV,IAAI,SAAS;;;;;uBAKH,IAAI,CAAC,KAAK;8BACH,IAAI,CAAC,YAAY;;;;cAIjC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA,iBAAiB,WAAW,SAAS,CAAC,CAAC,CAAC,OAAO;;;;;uBAKxD,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS;uBACrB,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS;sBACtB,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ;0BAChB,MAAA,IAAI,CAAC,KAAK,0CAAE,YAAY;;;;KAI7C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyET,CAAC;IACJ,CAAC;CACF,CAAA;AAlH6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uCAAmB;AAElB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAuB;AAHvC,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CAmHpB;SAnHY,QAAQ","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { css, CSSResultGroup, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { TileModel } from '../../models';\n\nimport '../mediatype-icon';\nimport '../item-image';\nimport './tile-stats';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseImageUrl?: string;\n\n render() {\n const itemTitle = this.model?.title;\n const itemCreator = this.model?.creator;\n return html`\n <div class=\"container\">\n <div class=\"item-info\">\n <div id=\"title\">\n <h1 class=\"truncated\" title=${ifDefined(\n itemTitle\n )}>${itemTitle}</h1>\n </div>\n\n <div id=\"image\">\n <item-image\n .model=${this.model}\n .baseImageUrl=${this.baseImageUrl}>\n </item-image>\n </div>\n <div class=\"created-by truncated\">\n ${itemCreator ? html`<span>by&nbsp;${itemCreator}</span>` : nothing}\n </div>\n </div>\n\n <tile-stats \n .mediatype=${this.model?.mediatype}\n .viewCount=${this.model?.viewCount}\n .favCount=${this.model?.favCount}\n .commentCount=${this.model?.commentCount}>\n </tile-stats>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n .container {\n background-color: #ffffff;\n border-radius: var(--collectionTileCornerRadius, 4px);\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .item-info {\n padding: 5px 5px 0 5px;\n flex-grow: 1;\n }\n\n #title {\n flex-shrink: 0;\n }\n\n #image {\n display: flex;\n justify-content: center;\n flex: 1;\n height: 16rem;\n }\n\n .hidden {\n display: none;\n }\n\n .container:hover > .item-info > #title > .truncated {\n text-decoration: underline;\n }\n\n /** this is a workaround for Safari 15 where the hover effects are not working */\n #title:hover > .truncated {\n text-decoration: underline;\n }\n\n .created-by {\n display: flex;\n justify-content: center;\n align-items: flex-end; /* Important to start text from bottom */\n height: 3rem;\n padding-top: 1rem;\n margin-top: 5px;\n }\n\n .truncated {\n flex: 1;\n color: #2c2c2c;\n min-width: 0; /* Important for long words! */\n text-align: center;\n line-height: 2rem;\n text-overflow: ellipsis;\n overflow: hidden;\n word-wrap: break-word;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n .truncated span {\n font-size: 1.4rem;\n display: -webkit-box;\n }\n\n h1.truncated {\n margin-top: 0rem;\n margin-bottom: 0.5rem;\n font-size: 1.6rem;\n height: 4rem;\n display: -webkit-box;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,SAAS,MAAM,eAAe,CAAC;AAEtC,OAAO,mBAAmB,CAAC;AAC3B,OAAO,eAAe,CAAC;AAGvB,IAAa,QAAQ,GAArB,MAAa,QAAS,SAAQ,UAAU;IAKtC,MAAM;;QACJ,MAAM,SAAS,GAAG,CAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK,KAAI,OAAO,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,CAAC;QACxC,OAAO,IAAI,CAAA;;;sCAGuB,SAAS,IAAI,SAAS;;iCAE3B,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,YAAY;;;;;gBAK9D,WAAW;YACX,CAAC,CAAC,IAAI,CAAA,iBAAiB,WAAW,SAAS;YAC3C,CAAC,CAAC,OAAO;;;;;;;;;;;6BAWI,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS;8BACpB,MAAA,IAAI,CAAC,KAAK,0CAAE,WAAW;;;;;;gBAMrC,SAAS;;kBAEP,WAAW,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;;;;gBAItD,kBAAkB;;kBAEhB,WAAW,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;;;;gBAItD,WAAW;;kBAET,WAAW,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;;;;;;KAMhE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,MAAM,eAAe,GAAG,GAAG,CAAA,wCAAwC,CAAC;QAEpE,OAAO,GAAG,CAAA;;;yBAGW,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoHnC,CAAC;IACJ,CAAC;CACF,CAAA;AAxL6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uCAAmB;AAElB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAuB;AAHvC,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CAyLpB;SAzLY,QAAQ","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { css, CSSResultGroup, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { TileModel } from '../../models';\nimport { formatCount } from '../../utils/format-count';\n\nimport { favoriteFilledIcon } from './icons/favorite-filled';\nimport { reviewsIcon } from './icons/reviews';\nimport viewsIcon from './icons/views';\n\nimport '../mediatype-icon';\nimport '../item-image';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseImageUrl?: string;\n\n render() {\n const itemTitle = this.model?.title || nothing;\n const itemCreator = this.model?.creator;\n return html`\n <div id=\"container\">\n <div id=\"title-image-container\">\n <h1 id=\"item-title\" title=${itemTitle}>${itemTitle}</h1>\n <div id=\"item-image-container\">\n <item-image .model=${this.model} .baseImageUrl=${this.baseImageUrl}>\n </item-image>\n </div>\n <div class=\"item-creator\">\n <div class=\"truncated\">\n ${itemCreator\n ? html`<span>by&nbsp;${itemCreator}</span>`\n : nothing}\n </div>\n </div>\n </div>\n\n <div class=\"hr\"></div>\n\n <div id=\"item-stats-container\">\n <div id=\"stats-holder\">\n <div class=\"col\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n .collection=${this.model?.collections}\n style=\"--iconHeight:25px; --iconWidth:25px;\"\n >\n </mediatype-icon>\n </div>\n <div class=\"col\">\n ${viewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.viewCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${favoriteFilledIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.itemCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${reviewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.favCount, 'short', 'short')}\n </p>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;\n\n return css`\n #container {\n background-color: #ffffff;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n }\n\n #title-image-container {\n display: flex;\n flex: 1;\n flex-direction: column;\n padding: 0.5rem 0.5rem 0 0.5rem;\n }\n\n #item-title {\n color: #2c2c2c;\n font-size: 1.6rem;\n text-align: center;\n margin-top: 0rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 2rem;\n height: 4rem;\n }\n\n #item-image-container {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n\n .hidden {\n display: none;\n }\n\n #container:hover > #title-image-container > .item-title {\n text-decoration: underline;\n }\n\n /** this is a workaround for Safari 15 where the hover effects are not working */\n #title-image-container:hover > #item-title {\n text-decoration: underline;\n }\n\n #container:hover > #item-title {\n background-color: #fcfcfc;\n }\n\n .item-creator {\n display: flex;\n justify-content: center;\n align-items: flex-end; /* Important to start text from bottom */\n height: 3rem;\n padding-top: 1rem;\n }\n\n .truncated {\n flex: 1;\n min-width: 0; /* Important for long words! */\n }\n\n .truncated span {\n font-size: 1.4rem;\n color: #2c2c2c;\n -webkit-line-clamp: 2;\n text-overflow: ellipsis;\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n word-wrap: break-word;\n line-height: 2rem;\n text-align: center;\n }\n\n .hr {\n border: 0.5px solid #ccc;\n }\n\n #item-stats-container {\n align-items: center;\n display: flex;\n height: 5.5rem;\n padding-left: 1rem;\n padding-right: 0.5rem;\n }\n\n #stats-holder {\n align-items: center;\n display: flex;\n flex: 1;\n justify-content: space-evenly;\n text-align: center;\n width: 100%;\n }\n\n svg {\n height: 10px;\n width: 10px;\n }\n\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: center;\n }\n\n .col {\n width: 25%;\n }\n `;\n }\n}\n"]}
@@ -33,19 +33,12 @@ let MediatypeIcon = class MediatypeIcon extends LitElement {
33
33
  style="--iconFillColor: ${config.color}"
34
34
  >
35
35
  ${config.icon}
36
- <p class="status-text">
37
- <span class="sr-only">${config.text} icon</span>
38
- ${config.text}
39
- </p>
36
+ <p class="status-text">${config.text}</p>
40
37
  </div>
41
38
  `;
42
39
  }
43
40
  static get styles() {
44
41
  return css `
45
- #icon {
46
- height: var(--iconHeight, 25px);
47
- }
48
-
49
42
  .status-text {
50
43
  font-size: 14px;
51
44
  color: #2c2c2c;
@@ -66,17 +59,6 @@ let MediatypeIcon = class MediatypeIcon extends LitElement {
66
59
  .fill-color {
67
60
  fill: var(--iconFillColor, '#000000');
68
61
  }
69
-
70
- .sr-only {
71
- position: absolute;
72
- width: 1px;
73
- height: 1px;
74
- padding: 0;
75
- margin: -1px;
76
- overflow: hidden;
77
- clip: rect(0, 0, 0, 0);
78
- border: 0;
79
- }
80
62
  `;
81
63
  }
82
64
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mediatype-icon.js","sourceRoot":"","sources":["../../../src/tiles/mediatype-icon.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,IAAa,aAAa,GAA1B,MAAa,aAAc,SAAQ,UAAU;IAA7C;;QAK+B,aAAQ,GAAG,KAAK,CAAC;IAiFhD,CAAC;IA/EC,IAAY,gBAAgB;;QAC1B,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAElD,IACE,IAAI,CAAC,SAAS,KAAK,QAAQ;aAC3B,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA,EAC3D;YACA,OAAO,IAAI,CAAC;SACb;QACD,IACE,IAAI,CAAC,SAAS,KAAK,OAAO;aAC1B,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA,EAC9D;YACA,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAA,EAAE,CAAC;SACf;QAED,OAAO,IAAI,CAAA;;;iBAGE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;kCACxB,MAAM,CAAC,KAAK;;UAEpC,MAAM,CAAC,IAAI;;kCAEa,MAAM,CAAC,IAAI;YACjC,MAAM,CAAC,IAAI;;;KAGlB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoCT,CAAC;IACJ,CAAC;CACF,CAAA;AArF6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAA+B;AAE/B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;kDAAmC;AAEhC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;+CAAkB;AALnC,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CAsFzB;SAtFY,aAAa","sourcesContent":["import { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { mediatypeConfig } from '../mediatype/mediatype-config';\n\n@customElement('mediatype-icon')\nexport class MediatypeIcon extends LitElement {\n @property({ type: String }) mediatype: string | undefined;\n\n @property({ type: Array }) collections: string[] | undefined;\n\n @property({ type: Boolean }) showText = false;\n\n private get displayMediatype(): string {\n const tvIdentifier = ['tvnews', 'tvarchive', 'television'];\n const radioIdentifier = ['radio', 'radioprogram'];\n\n if (\n this.mediatype === 'movies' &&\n this.collections?.some(id => tvIdentifier.indexOf(id) >= 0)\n ) {\n return 'tv';\n }\n if (\n this.mediatype === 'audio' &&\n this.collections?.some(id => radioIdentifier.indexOf(id) >= 0)\n ) {\n return 'radio';\n }\n return this.mediatype || '';\n }\n\n render() {\n const config = mediatypeConfig[this.displayMediatype];\n if (!config) {\n return html``;\n }\n\n return html`\n <div\n id=\"icon\"\n class=\"${this.showText ? 'show-text' : 'hide-text'}\"\n style=\"--iconFillColor: ${config.color}\"\n >\n ${config.icon}\n <p class=\"status-text\">\n <span class=\"sr-only\">${config.text} icon</span>\n ${config.text}\n </p>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n #icon {\n height: var(--iconHeight, 25px);\n }\n\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: var(--iconTextAlign, center);\n }\n\n #icon.hide-text p {\n display: none;\n }\n\n svg {\n height: var(--iconHeight, 10px);\n width: var(--iconWidth, 10px);\n }\n\n .fill-color {\n fill: var(--iconFillColor, '#000000');\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"mediatype-icon.js","sourceRoot":"","sources":["../../../src/tiles/mediatype-icon.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,IAAa,aAAa,GAA1B,MAAa,aAAc,SAAQ,UAAU;IAA7C;;QAK+B,aAAQ,GAAG,KAAK,CAAC;IA+DhD,CAAC;IA7DC,IAAY,gBAAgB;;QAC1B,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAElD,IACE,IAAI,CAAC,SAAS,KAAK,QAAQ;aAC3B,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA,EAC3D;YACA,OAAO,IAAI,CAAC;SACb;QACD,IACE,IAAI,CAAC,SAAS,KAAK,OAAO;aAC1B,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA,EAC9D;YACA,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAA,EAAE,CAAC;SACf;QAED,OAAO,IAAI,CAAA;;;iBAGE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;kCACxB,MAAM,CAAC,KAAK;;UAEpC,MAAM,CAAC,IAAI;iCACY,MAAM,CAAC,IAAI;;KAEvC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;KAqBT,CAAC;IACJ,CAAC;CACF,CAAA;AAnE6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAA+B;AAE/B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;kDAAmC;AAEhC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;+CAAkB;AALnC,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CAoEzB;SApEY,aAAa","sourcesContent":["import { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { mediatypeConfig } from '../mediatype/mediatype-config';\n\n@customElement('mediatype-icon')\nexport class MediatypeIcon extends LitElement {\n @property({ type: String }) mediatype: string | undefined;\n\n @property({ type: Array }) collections: string[] | undefined;\n\n @property({ type: Boolean }) showText = false;\n\n private get displayMediatype(): string {\n const tvIdentifier = ['tvnews', 'tvarchive', 'television'];\n const radioIdentifier = ['radio', 'radioprogram'];\n\n if (\n this.mediatype === 'movies' &&\n this.collections?.some(id => tvIdentifier.indexOf(id) >= 0)\n ) {\n return 'tv';\n }\n if (\n this.mediatype === 'audio' &&\n this.collections?.some(id => radioIdentifier.indexOf(id) >= 0)\n ) {\n return 'radio';\n }\n return this.mediatype || '';\n }\n\n render() {\n const config = mediatypeConfig[this.displayMediatype];\n if (!config) {\n return html``;\n }\n\n return html`\n <div\n id=\"icon\"\n class=\"${this.showText ? 'show-text' : 'hide-text'}\"\n style=\"--iconFillColor: ${config.color}\"\n >\n ${config.icon}\n <p class=\"status-text\">${config.text}</p>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: var(--iconTextAlign, center);\n }\n\n #icon.hide-text p {\n display: none;\n }\n\n svg {\n height: var(--iconHeight, 10px);\n width: var(--iconWidth, 10px);\n }\n\n .fill-color {\n fill: var(--iconFillColor, '#000000');\n }\n `;\n }\n}\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "0.2.4-alpha.4",
6
+ "version": "0.2.5",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
@@ -371,7 +371,7 @@ export class SortFilterBar
371
371
  this.displayMode = 'list-detail';
372
372
  }}
373
373
  class=${this.displayMode === 'list-detail' ? 'active' : ''}
374
- title="Extended list view"
374
+ title="List view"
375
375
  >
376
376
  ${listIcon}
377
377
  </button>
@@ -2,7 +2,10 @@ import { css, html, LitElement } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
3
  import { TileModel } from '../../models';
4
4
 
5
- import './tile-stats';
5
+ import { accountIcon } from './icons/account';
6
+ import { favoriteFilledIcon } from './icons/favorite-filled';
7
+ import { reviewsIcon } from './icons/reviews';
8
+ import { uploadIcon } from './icons/upload';
6
9
 
7
10
  @customElement('account-tile')
8
11
  export class AccountTile extends LitElement {
@@ -10,32 +13,44 @@ export class AccountTile extends LitElement {
10
13
 
11
14
  render() {
12
15
  return html`
13
- <div class="account-tile-main">
14
- <div id="title">
15
- <h1 class="truncated">${this.model?.identifier}</h1>
16
- </div>
17
-
18
- <div class="account-info">
19
- <div id="avatar-info">
20
- <img
21
- id="avatar"
22
- alt="patron-avatar"
23
- src="https://archive.org/services/img/${this.model?.identifier}"
24
- />
16
+ <div class="outer-holder">
17
+ <div class="inner-holder">
18
+ <div id="header-holder">
19
+ <div id="title-holder">
20
+ <h1 class="truncated">${this.model?.identifier}</h1>
21
+ </div>
22
+ <div id="avatar-holder">
23
+ <div
24
+ id="avatar"
25
+ style="background-image: url('https://archive.org/services/img/${this
26
+ .model?.identifier}')"
27
+ ></div>
28
+ </div>
29
+ </div>
30
+ <div id="year-holder">
31
+ <div id="archivist-since">
32
+ <h3>Archivist Since</h3>
33
+ </div>
34
+ <div id="year-holder">
35
+ <h3>${this.model?.dateAdded?.getFullYear()}</h3>
36
+ </div>
37
+ </div>
38
+ <div id="status-holder">
39
+ <div id="patron-icon">${accountIcon}</div>
40
+ <div class="stat-icon">
41
+ ${uploadIcon}
42
+ <h3>${this.model?.itemCount}</h3>
43
+ </div>
44
+ <div class="stat-icon">
45
+ ${favoriteFilledIcon}
46
+ <h3>${this.model?.favCount}</h3>
47
+ </div>
48
+ <div class="stat-icon">
49
+ ${reviewsIcon}
50
+ <h3>${this.model?.commentCount}</h3>
51
+ </div>
25
52
  </div>
26
-
27
- <span id="archivist-since">
28
- Archivist since ${this.model?.dateAdded?.getFullYear()}
29
- </span>
30
53
  </div>
31
-
32
- <tile-stats
33
- .mediatype=${this.model?.mediatype}
34
- .itemCount=${this.model?.itemCount}
35
- .favCount=${this.model?.favCount}
36
- .commentCount=${this.model?.commentCount}
37
- >
38
- </tile-stats>
39
54
  </div>
40
55
  `;
41
56
  }
@@ -48,45 +63,41 @@ export class AccountTile extends LitElement {
48
63
  margin: 0;
49
64
  }
50
65
 
51
- span {
66
+ h3 {
52
67
  font-size: 14px;
68
+ font-weight: bold;
53
69
  color: #2c2c2c;
54
70
  margin: 0px;
55
71
  }
56
72
 
57
- .account-tile-main {
73
+ .outer-holder {
58
74
  background-color: #fcf5e6;
59
75
  border: 1px #2c2c2c;
60
76
  border-radius: 4px;
61
77
  box-shadow: 1px 1px 2px 0px;
62
78
  height: 100%;
63
79
  display: flex;
64
- flex-direction: column;
65
80
  text-align: center;
66
81
  width: 100%;
67
82
  }
68
83
 
69
- .account-info {
70
- flex-grow: 1;
71
- }
72
-
73
- #title {
74
- padding: 5px 5px 0px 5px;
75
- flex-shrink: 0;
76
- height: 40px;
84
+ .inner-holder {
85
+ padding: 5px;
86
+ width: 100%;
87
+ display: flex;
88
+ flex-direction: column;
77
89
  }
78
90
 
79
- .account-tile-main:hover > #title > .truncated {
80
- text-decoration: underline;
91
+ #header-holder {
92
+ flex: 1;
81
93
  }
82
94
 
83
- /** this is a workaround for Safari 15 where the hover effects are not working */
84
- #title:hover > .truncated {
85
- text-decoration: underline;
95
+ #title-holder {
96
+ height: 40px;
97
+ margin-bottom: 5px;
86
98
  }
87
99
 
88
- #avatar-info {
89
- margin-top: 5px;
100
+ #avatar-holder {
90
101
  margin-bottom: 5px;
91
102
  display: flex;
92
103
  align-items: center;
@@ -101,11 +112,27 @@ export class AccountTile extends LitElement {
101
112
  box-shadow: 1px 1px 2px #888888;
102
113
  }
103
114
 
104
- #archivist-since {
115
+ #year-holder {
105
116
  margin-bottom: 5px;
106
117
  height: 40px;
107
118
  }
108
119
 
120
+ #year-holder {
121
+ margin: 0px;
122
+ }
123
+
124
+ #status-holder {
125
+ height: 25px;
126
+ display: flex;
127
+ justify-content: space-evenly;
128
+ line-height: initial;
129
+ }
130
+
131
+ #patron-icon {
132
+ height: 25px;
133
+ width: 25px;
134
+ }
135
+
109
136
  .truncated {
110
137
  flex: 1;
111
138
  min-width: 0; /* Important for long words! */
@@ -115,9 +142,15 @@ export class AccountTile extends LitElement {
115
142
  display: -webkit-box;
116
143
  -webkit-box-orient: vertical;
117
144
  word-wrap: break-word;
145
+ word-break: break-all;
118
146
  line-height: 2rem;
119
147
  text-align: center;
120
148
  }
149
+
150
+ .stat-icon {
151
+ height: 10px;
152
+ width: 10px;
153
+ }
121
154
  `;
122
155
  }
123
156
  }
@@ -0,0 +1,12 @@
1
+ import { svg } from 'lit';
2
+
3
+ export const accountIcon = svg`
4
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
5
+ <path
6
+ d="m89.6854559 79.6500588c1.7300364 6.4823648 2.180423 13.3122689 3.3145441 20.3499412h-86c.5683151-15.8558542 2.98334063-30.7849367 15.1676149-41.6581341 22.9948067-20.518674 59.250299-9.0032844 67.517841 21.3081929zm-40.0998307-79.6500588c10.872402.0493248 19.9700408 9.25722341 19.917959 20.1421788-.0829413 11.042868-8.9616237 19.8492523-20.0602807 19.8578212-11.1181198 0-19.9397193-8.7904706-19.9397193-19.8908727-.0327543-11.11998815 9.0125781-20.17487063 20.082041-20.1091273z"
7
+ fill="#333"
8
+ fill-rule="evenodd"
9
+ />
10
+ <title>Icon of a person</title>
11
+ </svg>
12
+ `;
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  import { svg } from 'lit';
2
2
 
3
- export const viewsIcon = svg`
3
+ export default svg`
4
4
  <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
5
5
  <path
6
6
  d="m98 50.5704143c-.2830293-.471515-.671154-1.1088947-1.1643742-1.9121392s-1.6003642-2.3617474-3.3214321-4.6755089c-1.7210678-2.3137614-3.522258-4.5325939-5.4035703-6.6564975-1.8813124-2.1239037-4.2828993-4.473133-7.2047606-7.0476881-2.9218612-2.5745551-5.8895067-4.7933876-8.9029363-6.6564976-3.0134295-1.86311-6.4628491-3.4330878-10.3482587-4.7099336-3.8854095-1.2768458-7.7822651-1.9142256-11.6905667-1.9121443-3.9083017.0020914-7.8051573.6154781-11.6905668 1.8401652-3.8854096 1.2246871-7.3702078 2.8301329-10.4543947 4.8163375-3.0841869 1.9862045-6.0278997 4.1695691-8.8311384 6.5500937s-5.2048256 4.7652219-7.2047605 7.1540919c-1.99993501 2.38887-3.75430043 4.5722346-5.26309632 6.5500938s-2.63883199 3.583305-3.39010829 4.8163374l-1.13003609 1.8401602c.2830293.4715149.67115403 1.1088946 1.16437421 1.9121391.49322017.8032445 1.5878776 2.3617475 3.28397229 4.6755089s3.47439274 4.521119 5.3348942 6.6220728c1.8605014 2.1009538 4.2506422 4.4387083 7.1704224 7.0132633 2.9197801 2.5745551 5.8874256 4.7819127 8.9029363 6.6220729 3.0155106 1.8401601 6.4774168 3.398663 10.3857184 4.6755088 3.9083017 1.2768458 7.8176438 1.9142256 11.7280266 1.9121443 3.9103827-.0020914 7.7957922-.6154781 11.6562286-1.8401652s7.3337886-2.818658 10.4200566-4.7819127 6.0299808-4.1351444 8.8311384-6.515669 5.2152311-4.7652219 7.2422203-7.1540919 3.8052873-4.5607597 5.3348942-6.515669c1.5296068-1.9549093 2.6721295-3.5488802 3.427568-4.7819127zm-24.5142913 0c0 6.467683-2.3079374 12.0152859-6.9238123 16.6428087s-10.1495139 6.9412843-16.600917 6.9412843c-6.4992683 0-12.0453939-2.3137615-16.6383767-6.9412843s-6.8894742-10.1751257-6.8894742-16.6428087 2.2964914-12.003811 6.8894742-16.608384 10.1391084-6.9068595 16.6383767-6.9068595c6.4534842 0 11.9871232 2.3022865 16.600917 6.9068595s6.9217312 10.140701 6.9238123 16.608384zm-23.5247293-10.552755c2.8261308 0 5.2870289 1.0619518 7.3826944 3.1858555 2.0956655 2.1239036 3.1434982 4.5795368 3.1434982 7.3668995 0 2.8332624-1.0478327 5.2888956-3.1434982 7.3668995-2.0956655 2.078004-4.5565636 3.1170059-7.3826944 3.1170059-2.873996 0-5.3348941-1.0264838-7.3826944-3.0794516-2.0478002-2.0529677-3.0717003-4.5200758-3.0717003-7.4013243 0-2.8332624 1.0239001-5.3003705 3.0717003-7.4013243 2.0478003-2.1009538 4.5086984-3.1514307 7.3826944-3.1514307z"