@@ -33,6 +33,7 @@ export type Button = {
3333} ;
3434
3535export abstract class ProductView extends BootstrapBlockElement {
36+ abstract readonly title : string ;
3637 protected abstract readonly subtitle : string ;
3738 protected abstract readonly description : string ;
3839 protected abstract readonly sourceRepositoryName : string ;
@@ -52,6 +53,8 @@ export abstract class ProductView extends BootstrapBlockElement {
5253 taskQueue . addObserver ( this . taskQueueObserver ) ;
5354
5455 document . addEventListener ( "keydown" , this . keydown ) ;
56+
57+ window . scrollTo ( { top : 0 } ) ;
5558 }
5659
5760 disconnectedCallback ( ) : void {
@@ -111,6 +114,106 @@ export abstract class ProductView extends BootstrapBlockElement {
111114
112115 render ( ) {
113116 return html `
117+ < div
118+ class ="container-fluid d-flex flex-row justify-content-center align-items-end flex-nowrap sticky-top bg-light pt-1 pb-2 "
119+ style ="top: 53px "
120+ >
121+ < nav
122+ class ="d-flex justify-content-start ms-4 me-auto "
123+ style ="flex: 1 "
124+ aria-label ="Go back "
125+ >
126+ < a
127+ href ="# "
128+ class ="btn btn-link fs-3 text-decoration-none p-0 "
129+ style ="-webkit-user-drag: none "
130+ tabindex ="0 "
131+ @click =${ ( event : Event ) => {
132+ event . preventDefault ( ) ;
133+ window . history . back ( ) ;
134+ } }
135+ >
136+ < svg
137+ version ="1.1 "
138+ xmlns ="http://www.w3.org/2000/svg "
139+ width ="34 "
140+ height ="34 "
141+ viewBox ="0, 0, 128, 128 "
142+ color ="inherit "
143+ >
144+ < g id ="Layer_2 ">
145+ < circle
146+ cx ="64 "
147+ cy ="64 "
148+ r ="64 "
149+ fill ="none "
150+ stroke ="currentcolor "
151+ stroke-width ="20 "
152+ clip-path ="url(#back-arrow-bg-circle-clip) "
153+ />
154+ < clipPath id ="back-arrow-bg-circle-clip ">
155+ < circle cx ="64 " cy ="64 " r ="64 " />
156+ </ clipPath >
157+ </ g >
158+ < g id ="Layer_1 ">
159+ < g >
160+ < path
161+ d ="M98.178,64.412 L32,64.412 "
162+ fill ="none "
163+ stroke ="currentcolor "
164+ stroke-width ="12 "
165+ />
166+ < path
167+ fill ="currentcolor "
168+ d ="M97.096,69.912 C93.782,69.912 91.096,67.225 91.096,63.912 C91.096,60.598 93.782,57.912 97.096,57.912 C100.41,57.912 103.096,60.598 103.096,63.912 C103.096,67.225 100.41,69.912 97.096,69.912 z "
169+ />
170+ </ g >
171+ < g >
172+ < path
173+ d ="M53.293,85.696 L31.064,63.467 "
174+ fill ="none "
175+ stroke ="currentcolor "
176+ stroke-width ="12 "
177+ />
178+ < path
179+ fill ="currentcolor "
180+ d ="M57.11,81.028 C54.767,78.685 50.968,78.685 48.625,81.028 C46.282,83.371 46.282,87.17 48.625,89.513 C50.968,91.857 54.767,91.857 57.11,89.513 C59.453,87.17 59.453,83.371 57.11,81.028 z "
181+ />
182+ </ g >
183+ < g >
184+ < path
185+ d ="M53.253,43.304 L31.064,65.493 "
186+ fill ="none "
187+ stroke ="currentcolor "
188+ stroke-width ="12 "
189+ />
190+ < path
191+ fill ="currentcolor "
192+ d ="M57.07,46.972 C54.727,49.315 50.928,49.315 48.585,46.972 C46.242,44.629 46.242,40.83 48.585,38.487 C50.928,36.143 54.727,36.143 57.07,38.487 C59.413,40.83 59.413,44.629 57.07,46.972 z "
193+ />
194+ </ g >
195+ < path
196+ fill ="currentcolor "
197+ d ="M34.927,67.835 C32.76,70.002 29.247,70.002 27.08,67.835 C24.913,65.668 24.913,62.155 27.08,59.989 C29.247,57.822 32.76,57.822 34.927,59.989 C37.093,62.155 37.093,65.668 34.927,67.835 z "
198+ />
199+ </ g >
200+ </ svg >
201+ </ a >
202+ </ nav >
203+ < div
204+ class ="d-flex justify-content-center text-center text-nowrap mt-4 "
205+ style ="flex: 1 "
206+ >
207+ < h1 id ="openstore-page-title " class ="mb-0 " style ="font-weight: 500 ">
208+ ${ this . title }
209+ </ h1 >
210+ </ div >
211+ < span
212+ class ="d-flex justify-content-end ms-auto me-4 "
213+ style ="flex: 1 "
214+ > </ span >
215+ </ div >
216+
114217 < div class ="mx-4 ">
115218 < p
116219 class ="d-flex flex-column gap-1 fs-slightly-larger text-center mt-1 mb-2 "
0 commit comments