11---
22import { dictionary , type Locale } from " ../i18n/dictionaries" ;
33import { templateCatalog } from " ../templates/catalog" ;
4+
45const { locale } = Astro .props as { locale: Locale };
56const t = dictionary (locale );
7+
68const palettePresets = [
79 {
810 id: " executive" ,
@@ -26,6 +28,7 @@ const palettePresets = [
2628 secondary: " #6db7c9" ,
2729 },
2830] as const ;
31+
2932const personalFields = [
3033 [" fullName" , " Full name" ],
3134 [" jobTitle" , " Job title" ],
@@ -48,6 +51,9 @@ const personalFields = [
4851 data-cleared ={ t .cleared }
4952 data-saved-to-library ={ t .savedToLibrary }
5053 data-library-empty ={ t .libraryEmpty }
54+ data-field-hidden ={ t .fieldHidden }
55+ data-template-fields-all ={ t .templateFieldSummaryAll }
56+ data-template-fields-hidden-prefix ={ t .templateFieldSummaryHidden }
5157>
5258 <div class =" workspace-top" >
5359 <div >
@@ -85,6 +91,7 @@ const personalFields = [
8591 <span class =" drawer-toggle-glyph" aria-hidden =" true" >> </span >
8692 </button >
8793 </div >
94+
8895 <div class =" drawer-backdrop" data-drawer-backdrop hidden ></div >
8996
9097 <aside
@@ -104,23 +111,28 @@ const personalFields = [
104111 data-drawer-close =" config"
105112 aria-label ={ t .drawerClose }
106113 >
107- { t .drawerClose }
114+ <span class =" drawer-close-glyph" aria-hidden =" true" >×</span >
115+ <span class =" sr-only" >{ t .drawerClose } </span >
108116 </button >
109117 </div >
110118
111119 <form id =" signature-form" >
112120 <details class =" config-section" open >
113121 <summary ><span >1</span > Signature style</summary >
114122 <div class =" config-body" >
115- <label
116- >Choose style<select name =" template"
117- >{
123+ <label >
124+ Choose style
125+ <select name =" template" >
126+ {
118127 templateCatalog .map ((template ) => (
119128 <option value = { template .id } >{ template .label } </option >
120129 ))
121- } </select
122- ></label
123- >
130+ }
131+ </select >
132+ </label >
133+ <p id =" template-field-summary" class =" template-support-summary" aria-live =" polite" >
134+ { t .templateFieldSummaryAll }
135+ </p >
124136 </div >
125137 </details >
126138
@@ -129,11 +141,27 @@ const personalFields = [
129141 <div class =" config-body field-grid" >
130142 {
131143 personalFields .map (([name , label ]) => (
132- <label class :list = { { wide: name === " legalText" || name === " address" }} >
133- { label }
144+ <label
145+ class :list = { { wide: name === " legalText" || name === " address" }}
146+ data-field-wrapper
147+ data-field-name = { name }
148+ data-field-label = { label }
149+ >
150+ <span class = " field-label-row" >
151+ <span class = " field-label-text" >{ label } </span >
152+ <small
153+ class = " field-support-note"
154+ data-field-support-note = { name }
155+ title = { t .fieldHidden }
156+ hidden
157+ >
158+ No visible
159+ </small >
160+ </span >
134161 <input
135162 name = { name }
136163 type = { name === " email" ? " email" : name === " website" ? " url" : " text" }
164+ data-field-control
137165 />
138166 </label >
139167 ))
@@ -144,26 +172,65 @@ const personalFields = [
144172 <details class =" config-section" >
145173 <summary ><span >3</span > Photo and logo</summary >
146174 <div class =" config-body" >
147- <label >Public logo URL HTTPS<input name =" logoUrl" type =" url" /></label >
148- <label >Public photo URL HTTPS<input name =" photoUrl" type =" url" /></label >
175+ <label data-field-wrapper data-field-name =" logoUrl" data-field-label =" Public logo URL HTTPS" >
176+ <span class =" field-label-row" >
177+ <span class =" field-label-text" >Public logo URL HTTPS</span >
178+ <small
179+ class =" field-support-note"
180+ data-field-support-note =" logoUrl"
181+ title ={ t .fieldHidden }
182+ hidden
183+ >
184+ No visible
185+ </small >
186+ </span >
187+ <input name =" logoUrl" type =" url" data-field-control />
188+ </label >
149189 <label
150- >Local logo/photo preview<input id =" local-image" type =" file" accept =" image/*"
151- /></label >
190+ data-field-wrapper
191+ data-field-name =" photoUrl"
192+ data-field-label =" Public photo URL HTTPS"
193+ >
194+ <span class =" field-label-row" >
195+ <span class =" field-label-text" >Public photo URL HTTPS</span >
196+ <small
197+ class =" field-support-note"
198+ data-field-support-note =" photoUrl"
199+ title ={ t .fieldHidden }
200+ hidden
201+ >
202+ No visible
203+ </small >
204+ </span >
205+ <input name =" photoUrl" type =" url" data-field-control />
206+ </label >
207+ <label >
208+ Local logo/photo preview
209+ <input id =" local-image" type =" file" accept =" image/*" />
210+ </label >
152211 <p id =" local-warning" class =" warning" hidden >{ t .localWarning } </p >
153212 </div >
154213 </details >
155214
156215 <details class =" config-section" open >
157216 <summary ><span >4</span > Colors and appearance</summary >
158217 <div class =" config-body appearance-grid" >
159- <label >Primary color<input name =" primaryColor" type =" color" /></label >
160- <label >Secondary color<input name =" secondaryColor" type =" color" /></label >
161- <label
162- >Size<select name =" size"
163- ><option >compact</option ><option selected >normal</option ><option >wide</option
164- ></select
165- ></label
166- >
218+ <label class =" appearance-field" >
219+ <span class =" appearance-label" >Primary color</span >
220+ <input name =" primaryColor" type =" color" />
221+ </label >
222+ <label class =" appearance-field" >
223+ <span class =" appearance-label" >Secondary color</span >
224+ <input name =" secondaryColor" type =" color" />
225+ </label >
226+ <label class =" appearance-field" >
227+ <span class =" appearance-label" >Size</span >
228+ <select name =" size" >
229+ <option >compact</option >
230+ <option selected >normal</option >
231+ <option >wide</option >
232+ </select >
233+ </label >
167234 <div class =" palette-presets" >
168235 <p class =" section-help" >
169236 Quick palettes based on trust, usability, and entrepreneurial clarity.
@@ -241,7 +308,9 @@ const personalFields = [
241308 <button id =" copy" >{ t .copy } </button >
242309 <button id =" download" >{ t .download } </button >
243310 <button id =" export" >{ t .export } </button >
244- <label class =" button" >{ t .import } <input id =" import" type =" file" accept =" .json,application/json" /></label >
311+ <label class =" button"
312+ >{ t .import } <input id =" import" type =" file" accept =" .json,application/json" /></label
313+ >
245314 <button id =" save-library" class =" secondary" >{ t .saveToLibrary } </button >
246315 <button id =" clear" class =" secondary" >{ t .clear } </button >
247316 </div >
@@ -265,7 +334,8 @@ const personalFields = [
265334 data-drawer-close =" templates"
266335 aria-label ={ t .drawerClose }
267336 >
268- { t .drawerClose }
337+ <span class =" drawer-close-glyph" aria-hidden =" true" >×</span >
338+ <span class =" sr-only" >{ t .drawerClose } </span >
269339 </button >
270340 </div >
271341 <div class =" template-showcase" >
@@ -284,6 +354,22 @@ const personalFields = [
284354 </aside >
285355 </section >
286356
357+ <section class =" library-band" >
358+ <div class =" support-card support-card-wide" >
359+ <div class =" saved-library-heading" >
360+ <div >
361+ <span class =" eyebrow" >Library</span >
362+ <h3 >{ t .savedLibrary } </h3 >
363+ </div >
364+ <a class =" library-link" href ={ ` /${locale }/saved-signatures/ ` } >{ t .savedLibraryHint } </a >
365+ </div >
366+ <p class =" support-copy" >{ t .savedPageCopy } </p >
367+ <div class =" support-actions" >
368+ <a class =" support-pill" href ={ ` /${locale }/saved-signatures/ ` } >{ t .savedPageAction } </a >
369+ </div >
370+ </div >
371+ </section >
372+
287373 <section class =" support-band is-hidden" hidden aria-hidden =" true" >
288374 <div class =" support-card support-card-wide" >
289375 <div class =" saved-library-heading" >
0 commit comments