Skip to content

Commit daea566

Browse files
Merge pull request #11 from anderson-camacho/feature/template-field-guidance-and-ui-languages
Improve template field guidance, compact editor UI, and language coverage
2 parents 2f922fe + 6b2fe43 commit daea566

7 files changed

Lines changed: 1002 additions & 88 deletions

File tree

src/components/Editor.astro

Lines changed: 109 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
---
22
import { dictionary, type Locale } from "../i18n/dictionaries";
33
import { templateCatalog } from "../templates/catalog";
4+
45
const { locale } = Astro.props as { locale: Locale };
56
const t = dictionary(locale);
7+
68
const palettePresets = [
79
{
810
id: "executive",
@@ -26,6 +28,7 @@ const palettePresets = [
2628
secondary: "#6db7c9",
2729
},
2830
] as const;
31+
2932
const 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">&gt;</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

Comments
 (0)