Skip to content

Commit 5f64ef4

Browse files
committed
feat: input fields error message and styling
1 parent e6c0dfd commit 5f64ef4

File tree

3 files changed

+129
-32
lines changed

3 files changed

+129
-32
lines changed

assets/scss/theme/typography.scss

+7
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,13 @@ $fontAssetPath: 'assets/fonts';
265265
letter-spacing: 0.01em;
266266
}
267267

268+
@mixin formFieldErrorMessage {
269+
font-size: toRem(14);
270+
line-height: leading(21, 14);
271+
font-weight: 400;
272+
letter-spacing: 0.01em;
273+
}
274+
268275
@mixin hamburgerCTA {
269276
font-size: toRem(24);
270277
line-height: leading(36, 24);

assets/scss/theme/utilities.scss

+6-5
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ $siam: #565D50; // siam
5353
--link-hover-color: #{$chardonnay};
5454
--code-text-color: #{$alto};
5555
--code-background-color: #{$codeBlack};
56+
--error: #{$burntSienna};
5657
}
5758

5859
// .dark {
@@ -164,15 +165,15 @@ $siam: #565D50; // siam
164165
content: '';
165166
position: absolute;
166167
inset: 0;
167-
border-radius: toRem(5);
168+
border-radius: toRem(5);
168169
padding: toRem(1);
169170
z-index: 1;
170171
background: linear-gradient($angle, rgba($sageGreen, 1) 0%, rgba($sageGreen, 0.5) 33%, rgba($gray900, 0.3) 66%, rgba($gray900, 0.8) 100%);
171-
-webkit-mask:
172-
linear-gradient(#fff 0 0) content-box,
172+
-webkit-mask:
173+
linear-gradient(#fff 0 0) content-box,
173174
linear-gradient(#fff 0 0);
174175
-webkit-mask-composite: xor;
175-
mask-composite: exclude;
176+
mask-composite: exclude;
176177
}
177178
}
178179

@@ -181,7 +182,7 @@ $siam: #565D50; // siam
181182
content: '';
182183
position: absolute;
183184
inset: 0;
184-
border-radius: toRem(5);
185+
border-radius: toRem(5);
185186
background-color: rgba($tundora, 0.2);
186187
backdrop-filter: blur(5px);
187188
z-index: 1;

components/signup-card.vue

+116-27
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,48 @@
2222
<div class="signup-form">
2323

2424
<div class="name-fields">
25+
<div class="field-wrapper">
26+
<input
27+
:class="['first-name form-field', { error: fieldError.firstName }]"
28+
type="text"
29+
:placeholder="firstNameField.placeholder"
30+
required="true"
31+
@input="updateInputValue($event.target.value, 'firstName')" />
32+
<span v-if="fieldError.firstName" class="error-message" v-html="errorMessage" />
33+
</div>
34+
35+
<div class="field-wrapper">
36+
<input
37+
:class="['last-name form-field', { error: fieldError.lastName }]"
38+
type="text"
39+
:placeholder="lastNameField.placeholder"
40+
required="true"
41+
@input="updateInputValue($event.target.value, 'lastName')" />
42+
<span v-if="fieldError.lastName" class="error-message" v-html="errorMessage" />
43+
</div>
44+
</div>
45+
46+
<div class="field-wrapper">
2547
<input
26-
class="first-name form-field"
27-
type="text"
28-
:placeholder="firstNameField.placeholder"
48+
:class="['email form-field', { error: fieldError.email }]"
49+
type="email"
50+
:placeholder="emailField.placeholder"
2951
required="true"
30-
@input="updateInputValue($event.target.value, 'firstName')" />
52+
@input="updateInputValue($event.target.value, 'email')" />
53+
<span v-if="fieldError.email" class="error-message" v-html="errorMessage" />
54+
</div>
55+
56+
<div class="field-wrapper">
3157
<input
32-
class="last-name form-field"
58+
:class="['org form-field', { error: fieldError.organization }]"
59+
:placeholder="orgField.placeholder"
3360
type="text"
34-
:placeholder="lastNameField.placeholder"
3561
required="true"
36-
@input="updateInputValue($event.target.value, 'lastName')" />
62+
@input="updateInputValue($event.target.value, 'org')" />
63+
<span v-if="fieldError.organization" class="error-message" v-html="errorMessage" />
3764
</div>
3865

39-
<input
40-
class="email form-field"
41-
type="email"
42-
:placeholder="emailField.placeholder"
43-
required="true"
44-
@input="updateInputValue($event.target.value, 'email')" />
45-
46-
47-
<input
48-
class="org form-field"
49-
:placeholder="orgField.placeholder"
50-
type="text"
51-
required="true"
52-
@input="updateInputValue($event.target.value, 'org')" />
53-
54-
55-
<ZeroDropdown class="country form-field" :display-selected="true">
66+
<ZeroDropdown :class="['country form-field', { error: fieldError.country }]" :display-selected="true">
5667
<template #toggle-button="{ togglePanel, selected }">
5768
<div class="toggle-button" @click="togglePanel">
5869
<p v-if="selected" class="toggle-button-label">
@@ -76,12 +87,13 @@
7687
</div>
7788
</div>
7889
</template>
90+
<span v-if="fieldError.country" class="error-message" v-html="errorMessage" />
7991
</ZeroDropdown>
8092

8193
<ZeroDropdown class="familiarity" :display-selected="true">
8294
<template #toggle-button="{ togglePanel, selected }">
8395
<h3 class="dropdown-label" v-html="familiarityField.label" />
84-
<div class="toggle-button form-field" @click="togglePanel">
96+
<div :class="['toggle-button form-field', { error: fieldError.filecoinFamiliarity }]" @click="togglePanel">
8597
<p v-if="selected" class="toggle-button-label">
8698
{{ selected }}
8799
</p>
@@ -103,6 +115,7 @@
103115
</div>
104116
</div>
105117
</template>
118+
<span v-if="fieldError.filecoinFamiliarity" class="error-message" v-html="errorMessage" />
106119
</ZeroDropdown>
107120

108121
<ZeroButton
@@ -129,6 +142,15 @@ const props = defineProps({
129142
})
130143
131144
// ======================================================================== Data
145+
const errorMessage = '[ Field is required ]'
146+
const fieldError = ref({
147+
firstName: false,
148+
lastName: false,
149+
email: false,
150+
organization: false,
151+
country: false,
152+
filecoinFamiliarity: false
153+
})
132154
const firstName = ref(false)
133155
const lastName = ref(false)
134156
const email = ref(false)
@@ -202,6 +224,7 @@ const selectOption = (setSelected, closePanel, option, field) => {
202224
* @method submitForm
203225
*/
204226
const submitForm = async () => {
227+
console.log('submitForm')
205228
if (firstName.value && lastName.value && email.value && organization.value && country.value && filecoinFamiliarity.value) {
206229
const body = {
207230
records: [
@@ -226,6 +249,14 @@ const submitForm = async () => {
226249
body,
227250
headers
228251
})
252+
} else {
253+
if(!firstName.value) { fieldError.value.firstName = true }
254+
if(!lastName.value) { fieldError.value.lastName = true }
255+
if(!email.value) { fieldError.value.email = true }
256+
if(!organization.value) { fieldError.value.organization = true }
257+
if(!organization.value) { fieldError.value.organization = true }
258+
if(!country.value) { fieldError.value.country = true }
259+
if(!filecoinFamiliarity.value) { fieldError.value.filecoinFamiliarity = true }
229260
}
230261
}
231262
</script>
@@ -257,17 +288,75 @@ const submitForm = async () => {
257288
}
258289
}
259290
291+
// ///////////////////////////////////////////////////////////////// Signup Card
292+
.title-wrapper {
293+
display: flex;
294+
flex-flow: row no-wrap;
295+
}
260296
// //////////////////////////////////////////////////////////////////////// Form
261297
.form-field {
262298
border: var(--brand-color) 1px solid;
263299
border-radius: toRem(5);
264-
&:is(:not(.first-name, .last-name, :last-child)) {
265-
margin-bottom: toRem(24);
300+
&:hover,
301+
&:focus {
302+
border-color: var(--secondary-text-color);
303+
}
304+
&.error {
305+
border-color: var(--error);
306+
}
307+
}
308+
309+
.error-message {
310+
@include formFieldErrorMessage;
311+
color: var(--error);
312+
}
313+
314+
.field-wrapper {
315+
display: flex;
316+
flex-direction: column;
317+
align-items: flex-end;
318+
flex: 1;
319+
margin-bottom: toRem(24);
320+
}
321+
322+
.name-fields {
323+
display: flex;
324+
flex-flow: row nowrap;
325+
justify-content: space-between;
326+
// margin-bottom: toRem(24);
327+
.field-wrapper:is(:first-child) {
328+
margin-right: toRem(20);
266329
}
267330
}
268331
332+
333+
.first-name,
334+
.last-name {
335+
width: 100%;
336+
}
337+
338+
.first-name,
339+
.last-name,
340+
.email,
341+
.org {
342+
@include formFieldText;
343+
padding: toRem(8) toRem(20);
344+
&::placeholder {
345+
@include formFieldPlaceholder;
346+
}
347+
}
348+
.email,
349+
.org {
350+
width: 100%;
351+
}
352+
353+
269354
.option-label {
270355
cursor: pointer;
271356
}
272357
358+
.submit-button {
359+
360+
}
361+
273362
</style>

0 commit comments

Comments
 (0)