diff --git a/.gitignore b/.gitignore
index c202c3e49..ffc1611d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,7 @@ node_modules/
# Build artifacts
dist/
+dist-demo/
examples/**/dist
packages/**/dist
diff --git a/.vscode/settings.json b/.vscode/settings.json
index b8142104e..5edfa39dd 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -21,7 +21,7 @@
"editor.formatOnSave": true
},
"[typescript]": {
- "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint",
"editor.formatOnSave": true
},
"[vue]": {
diff --git a/packages/ui-solid/fixtures/xforms/socio-economic-survey.xml b/packages/ui-solid/fixtures/xforms/socio-economic-survey.xml
new file mode 100644
index 000000000..a29fd0455
--- /dev/null
+++ b/packages/ui-solid/fixtures/xforms/socio-economic-survey.xml
@@ -0,0 +1,1505 @@
+
+
+
+ Socio-economic Survey
+
+
+
+
+ Sindh
+
+
+ Punjab
+
+
+ Balochistan
+
+
+ Khyber Pakhunkhwan
+
+
+ Azad Kashmir & Gilgit
+
+
+ Karachi
+
+
+ Sakhar
+
+
+ Hyderabad
+
+
+ Tando Turel
+
+
+ Thatta & Shah Bunder
+
+
+ Hafizabad
+
+
+ Lahore & Sialkot
+
+
+ Multan & Bahawalpur
+
+
+ Rawalpindi
+
+
+ Sargodha
+
+
+ Arkari
+
+
+ Chitral Town
+
+
+ Garamchashma
+
+
+ Madaklasht
+
+
+ Parabeg
+
+
+ Shoghore
+
+
+ Susum
+
+
+ Bang
+
+
+ Booni
+
+
+ Brep
+
+
+ Khot
+
+
+ Laspur
+
+
+ Chatoorkhand
+
+
+ Damas
+
+
+ Gahkuch
+
+
+ Immit
+
+
+ Ishkoman
+
+
+ Sherquilla
+
+
+ Singal
+
+
+ Gilgit
+
+
+ Skardu
+
+
+ Sul, Dan & Oshikhandas
+
+
+ Not willing to disclose
+
+
+ Less than 10,000
+
+
+ 10,001 to 50,000
+
+
+ 50,001 to 60,000
+
+
+ 60,001 to 75,000
+
+
+ 75,001 to 100,000
+
+
+ 100,001 to 200,000
+
+
+ Above 200,000
+
+
+ Unknown
+
+
+ Lower
+
+
+ Lower
+
+
+ Middle
+
+
+ Middle
+
+
+ Middle
+
+
+ Upper-middle
+
+
+ Upper
+
+
+ Yes
+
+
+ No
+
+
+ I don't know
+
+
+ Access available in area, but my HH is not interested
+
+
+ Cable / LAN / DSL
+
+
+ No internet access (in the area)
+
+
+ Available through 2G
+
+
+ Available through 3G / 4G
+
+
+ I don't know
+
+
+ Other
+
+
+ Male
+
+
+ Female
+
+
+ Other
+
+
+ LHV or Community Health Worker
+
+
+ Government clinic
+
+
+ Private clinic
+
+
+ NGO Clinic
+
+
+ Traditional healers
+
+
+ Pharmacist
+
+
+ Other
+
+
+ Facility not available in the area
+
+
+ Lack of funds
+
+
+ Lack of time
+
+
+ Healthy - no need
+
+
+ Not mobile (bed bound / disabled)
+
+
+ Security concerns
+
+
+ Prefer traditional healers
+
+
+ Prefer home remedies / self-medication
+
+
+ Other
+
+
+ Diabetes
+
+
+ Cardiovascular (Heart)
+
+
+ Hypertension
+
+
+ Chronic kidney problem
+
+
+ Respiratory related (Asthma, lung infection)
+
+
+ Arthritis
+
+
+ Cancer
+
+
+ Mental health (Depression, etc)
+
+
+ Other
+
+
+ Not applicable
+
+
+ I don't know
+
+
+ Fluent
+
+
+ Moderate
+
+
+ Low
+
+
+ No
+
+
+ don't know
+
+
+ Household Information
+
+
+ Region
+
+
+ District
+
+
+ Residential Address
+
+
+ Primary contact no.
+
+
+ Secondary contact no.
+
+
+ Household monthly income
+
+
+ se_list
+
+
+ Economic Class
+
+
+ Internet Access
+
+
+ Does the household have access to internet?
+
+
+ Type of internet access / coverage
+
+
+ Household members
+
+
+ Person
+
+
+ First name
+
+
+ Gender
+
+
+ Health
+
+
+ Have they visited doctor / hospital in last 12 months?
+
+
+ Type of facility accessed?
+
+
+ Reason for not accessing health facility?
+
+
+ Have they been diagnosed and prescribed a medicine for any diseases?
+
+
+ Level of English proficiency:
+
+
+ Component
+
+
+ Read
+
+
+ Write
+
+
+ Speak
+
+
+ Listen
+
+
+ Other Comments
+
+
+
+
+ Sind
+
+
+ Pendjab
+
+
+ Baloutchistan
+
+
+ Khyber Pakhunkhwan
+
+
+ Azad Cachemire et Gilgit
+
+
+ Karachi
+
+
+ Sakhar
+
+
+ Hyderâbâd
+
+
+ Tando Turel
+
+
+ Thatta et Shah Bunder
+
+
+ Hafizabad
+
+
+ Lahore et Sialkot
+
+
+ Multan et Bahawalpur
+
+
+ Rawalpindi
+
+
+ Sargodha
+
+
+ Arkari
+
+
+ Ville de Chitral
+
+
+ Garamchashma
+
+
+ Madaklasht
+
+
+ Parabeg
+
+
+ Shohore
+
+
+ Susum
+
+
+ Claquer
+
+
+ Booni
+
+
+ Brep
+
+
+ Khot
+
+
+ Laspur
+
+
+ Chatoorkhand
+
+
+ Damas
+
+
+ Gahkuch
+
+
+ Immettre
+
+
+ Ishkoman
+
+
+ Sherquilla
+
+
+ Singal
+
+
+ Gilgit
+
+
+ Skardu
+
+
+ Sul, Dan et Oshikhandas
+
+
+ Ne veut pas divulguer
+
+
+ Moins de 10 000
+
+
+ 10 001 à 50 000
+
+
+ 50 001 à 60 000
+
+
+ 60 001 à 75 000
+
+
+ 75 001 à 100 000
+
+
+ 100 001 à 200 000
+
+
+ Au-dessus de 200 000
+
+
+ Inconnu
+
+
+ Inférieur
+
+
+ Inférieur
+
+
+ Milieu
+
+
+ Milieu
+
+
+ Milieu
+
+
+ Moyenne supérieure
+
+
+ Supérieur
+
+
+ Oui
+
+
+ Non
+
+
+ Je ne sais pas
+
+
+ Accès disponible dans la zone, mais mon ménage n'est pas intéressé
+
+
+ Câble / LAN / DSL
+
+
+ Pas d'accès internet (dans la région)
+
+
+ Disponible via 2G
+
+
+ Disponible via 3G / 4G
+
+
+ Je ne sais pas
+
+
+ Autre
+
+
+ Mâle
+
+
+ Femelle
+
+
+ Autre
+
+
+ LHV ou Agent de Santé Communautaire
+
+
+ Clinique gouvernementale
+
+
+ Clinique privée
+
+
+ Clinique des ONG
+
+
+ Guérisseurs traditionnels
+
+
+ Pharmacien
+
+
+ Autre
+
+
+ Installation non disponible dans la région
+
+
+ Manque de fonds
+
+
+ Manque de temps
+
+
+ Sain - pas besoin
+
+
+ Non mobile (lié au lit / handicapé)
+
+
+ Problèmes de sécurité
+
+
+ Préférez les guérisseurs traditionnels
+
+
+ Préférer les remèdes maison/automédication
+
+
+ Autre
+
+
+ Diabète
+
+
+ Cardiovasculaire (Cœur)
+
+
+ Hypertension
+
+
+ Problème rénal chronique
+
+
+ Problèmes respiratoires (asthme, infection pulmonaire)
+
+
+ Arthrite
+
+
+ Cancer
+
+
+ Santé mentale (dépression, etc.)
+
+
+ Autre
+
+
+ N'est pas applicable
+
+
+ Je ne sais pas
+
+
+ Courant
+
+
+ Modéré
+
+
+ Faible
+
+
+ Non
+
+
+ je ne sais pas
+
+
+ Informations sur le ménage
+
+
+ Région
+
+
+ District
+
+
+ Adresse résidentielle
+
+
+ Numéro de contact principal
+
+
+ Numéro de contact secondaire
+
+
+ revenu mensuel des ménages
+
+
+ se_list
+
+
+ Classe économique
+
+
+ Accès Internet
+
+
+ Type d'accès / couverture Internet
+
+
+ Type d'accès / couverture Internet
+
+
+ Membres du foyer
+
+
+ Personne
+
+
+ Prénom
+
+
+ Genre
+
+
+ Santé
+
+
+ Ont-ils consulté un médecin/un hôpital au cours des 12 derniers mois ?
+
+
+ Type d'établissement consulté ?
+
+
+ Raison pour laquelle vous n'avez pas accès aux établissements de santé ?
+
+
+ Ont-ils été diagnostiqués et prescrits des médicaments pour des maladies ?
+
+
+ Niveau de maîtrise de l'anglais :
+
+
+ Composant
+
+
+ Lire
+
+
+ Écrire
+
+
+ Parler
+
+
+ Écouter
+
+
+ Autres commentaires
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ region-0
+ Sindh
+
+
+ region-1
+ Punjab
+
+
+ region-2
+ Balochistan
+
+
+ region-3
+ KP
+
+
+ region-4
+ AKG
+
+
+
+
+
+
+ district-0
+ Garden
+ Sindh
+
+
+ district-1
+ Gulshan
+ Sindh
+
+
+ district-2
+ Hyderabad
+ Sindh
+
+
+ district-3
+ TandoTurel
+ Sindh
+
+
+ district-4
+ Thatta&ShahBunder
+ Sindh
+
+
+ district-5
+ Hafizabad
+ Punjab
+
+
+ district-6
+ Lahore&Sialkot
+ Punjab
+
+
+ district-7
+ Multan&Bahawalpur
+ Punjab
+
+
+ district-8
+ Rawalpindi
+ Punjab
+
+
+ district-9
+ Sargodha
+ Punjab
+
+
+ district-10
+ Arkari
+ KP
+
+
+ district-11
+ ChitralTown
+ KP
+
+
+ district-12
+ Garamchashma
+ KP
+
+
+ district-13
+ Madaklasht
+ KP
+
+
+ district-14
+ Parabeg
+ KP
+
+
+ district-15
+ Shoghore
+ KP
+
+
+ district-16
+ Susum
+ KP
+
+
+ district-17
+ Bang
+ KP
+
+
+ district-18
+ Booni
+ KP
+
+
+ district-19
+ Brep
+ KP
+
+
+ district-20
+ Khot
+ KP
+
+
+ district-21
+ Laspur
+ KP
+
+
+ district-22
+ Chatoorkhand
+ Balochistan
+
+
+ district-23
+ Damas
+ Balochistan
+
+
+ district-24
+ Gahkuch
+ Balochistan
+
+
+ district-25
+ Immit
+ Balochistan
+
+
+ district-26
+ Ishkoman
+ Balochistan
+
+
+ district-27
+ Sherquilla
+ Balochistan
+
+
+ district-28
+ Singal
+ Balochistan
+
+
+ district-29
+ Gilgit
+ AKG
+
+
+ district-30
+ Skardu
+ AKG
+
+
+ district-31
+ Sul,Dan&Oshikhandas
+ AKG
+
+
+
+
+
+
+ monthlyIncome-0
+ 1
+
+
+ monthlyIncome-1
+ 2
+
+
+ monthlyIncome-2
+ 3
+
+
+ monthlyIncome-3
+ 4
+
+
+ monthlyIncome-4
+ 5
+
+
+ monthlyIncome-5
+ 6
+
+
+ monthlyIncome-6
+ 7
+
+
+ monthlyIncome-7
+ 8
+
+
+
+
+
+
+ seclass-0
+ 1
+
+
+ seclass-1
+ 2
+
+
+ seclass-2
+ 3
+
+
+ seclass-3
+ 4
+
+
+ seclass-4
+ 5
+
+
+ seclass-5
+ 6
+
+
+ seclass-6
+ 7
+
+
+ seclass-7
+ 8
+
+
+
+
+
+
+ yesNoIdk-0
+ 1
+
+
+ yesNoIdk-1
+ 2
+
+
+ yesNoIdk-2
+ 3
+
+
+
+
+
+
+ internetType-0
+ 1
+
+
+ internetType-1
+ 2
+
+
+ internetType-2
+ 3
+
+
+ internetType-3
+ 4
+
+
+ internetType-4
+ 5
+
+
+ internetType-5
+ 6
+
+
+ internetType-6
+ 7
+
+
+
+
+
+
+ gender-0
+ 1
+
+
+ gender-1
+ 2
+
+
+ gender-2
+ 3
+
+
+
+
+
+
+ healthFacility-0
+ 1
+
+
+ healthFacility-1
+ 2
+
+
+ healthFacility-2
+ 3
+
+
+ healthFacility-3
+ 4
+
+
+ healthFacility-4
+ 5
+
+
+ healthFacility-5
+ 6
+
+
+ healthFacility-6
+ 7
+
+
+
+
+
+
+ reasonForNoHealthVisit-0
+ 1
+
+
+ reasonForNoHealthVisit-1
+ 2
+
+
+ reasonForNoHealthVisit-2
+ 3
+
+
+ reasonForNoHealthVisit-3
+ 4
+
+
+ reasonForNoHealthVisit-4
+ 5
+
+
+ reasonForNoHealthVisit-5
+ 6
+
+
+ reasonForNoHealthVisit-6
+ 7
+
+
+ reasonForNoHealthVisit-7
+ 8
+
+
+ reasonForNoHealthVisit-8
+ 9
+
+
+
+
+
+
+ diseases-0
+ 1
+
+
+ diseases-1
+ 2
+
+
+ diseases-2
+ 3
+
+
+ diseases-3
+ 4
+
+
+ diseases-4
+ 5
+
+
+ diseases-5
+ 6
+
+
+ diseases-6
+ 7
+
+
+ diseases-7
+ 8
+
+
+ diseases-8
+ 9
+
+
+ diseases-9
+ 10
+
+
+ diseases-10
+ 11
+
+
+
+
+
+
+ languageLevel-0
+ 1
+
+
+ languageLevel-1
+ 2
+
+
+ languageLevel-2
+ 3
+
+
+ languageLevel-3
+ 4
+
+
+ languageLevel-4
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/ui-solid/fixtures/xforms/validation/1-validation.xml b/packages/ui-solid/fixtures/xforms/validation/1-validation.xml
new file mode 100644
index 000000000..4d8022c6d
--- /dev/null
+++ b/packages/ui-solid/fixtures/xforms/validation/1-validation.xml
@@ -0,0 +1,93 @@
+
+
+
+ Validation Form
+
+
+
+
+ Please enter your profession
+
+
+ It has to be two
+
+
+
+
+ اپنا پروفیشن بتائیں
+
+
+ صرف دو ہی ہوسکتی ہیں
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ pk
+
+
+
+ ca
+
+
+
+ us
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/web-forms/README.md b/packages/web-forms/README.md
index a2cb7c34c..8c6746519 100644
--- a/packages/web-forms/README.md
+++ b/packages/web-forms/README.md
@@ -63,4 +63,12 @@ To update the icons using the [IcoMoon website](https://icomoon.io/app/):
By following the steps above, you should minimize the diff. However, in the JSON file, you may still see changes for properties like `id`, `iconIdx`, `setId`, and `setIdx`.
-Material Icons are available under the Apache License Version 2.0. Copy of the license can be found at [`./src/assets/fonts/LICENSE-2.0.txt`](./src/assets/fonts/LICENSE-2.0.txt)
+Material Icons are available under the Apache License Version 2.0. Copy of the license can be found at [`./src/assets/fonts/icomoon/LICENSE-2.0.txt`](./src/assets/fonts/LICENSE-2.0.txt)
+
+
+================
+
+To download fonts from Google Fonts API:
+
+curl "https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap" -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36' \
+ | grep src | cut -d\( -f2 | cut -d\) -f1 | xargs -I {} wget {}
\ No newline at end of file
diff --git a/packages/web-forms/icomoon.json b/packages/web-forms/icomoon.json
index a2b196a1e..51cd29841 100644
--- a/packages/web-forms/icomoon.json
+++ b/packages/web-forms/icomoon.json
@@ -532,6 +532,54 @@
"setIdx": 0,
"setId": 0,
"iconIdx": 22
+ },
+ {
+ "icon": {
+ "paths": [
+ "M554 554v-256h-84v256h84zM554 726v-86h-84v86h84zM512 86q176 0 301 125t125 301-125 301-301 125-301-125-125-301 125-301 301-125z"
+ ],
+ "attrs": [],
+ "isMulticolor": false,
+ "isMulticolor2": false,
+ "tags": ["error"],
+ "grid": 24
+ },
+ "attrs": [],
+ "properties": {
+ "ligatures": "error",
+ "id": 46,
+ "order": 347,
+ "prevSize": 48,
+ "code": 59671,
+ "name": "error"
+ },
+ "setIdx": 0,
+ "setId": 0,
+ "iconIdx": 23
+ },
+ {
+ "icon": {
+ "paths": [
+ "M512 854q140 0 241-101t101-241-101-241-241-101-241 101-101 241 101 241 241 101zM512 86q176 0 301 125t125 301-125 301-301 125-301-125-125-301 125-301 301-125zM470 298h84v256h-84v-256zM470 640h84v86h-84v-86z"
+ ],
+ "attrs": [],
+ "isMulticolor": false,
+ "isMulticolor2": false,
+ "tags": ["error_outline"],
+ "grid": 24
+ },
+ "attrs": [],
+ "properties": {
+ "ligatures": "error_outline",
+ "id": 71,
+ "order": 373,
+ "prevSize": 48,
+ "code": 59672,
+ "name": "error_outline"
+ },
+ "setIdx": 0,
+ "setId": 0,
+ "iconIdx": 24
}
],
"height": 1024,
diff --git a/packages/web-forms/package.json b/packages/web-forms/package.json
index 15d33c0ed..cbd51ce94 100644
--- a/packages/web-forms/package.json
+++ b/packages/web-forms/package.json
@@ -28,8 +28,9 @@
},
"scripts": {
"build": "npm-run-all -nl build:*",
- "build:clean": "rimraf dist/",
+ "build:clean": "rimraf dist/ dist-demo/",
"build:js": "vite build",
+ "build:demo": "vite build --mode demo --outDir dist-demo",
"build-preview": "yarn build && yarn vite serve build-preview --port 5174",
"dev": "vite",
"test": "npm-run-all -nl test:*",
@@ -51,14 +52,14 @@
"@faker-js/faker": "^8.4.1",
"@getodk/xforms-engine": "0.2.0",
"@playwright/test": "^1.45.1",
+ "@primevue/themes": "^4.0.4",
"@types/ramda": "^0.30.1",
"@vitejs/plugin-vue": "^5.0.5",
"@vitejs/plugin-vue-jsx": "^4.0.0",
"@vue/test-utils": "^2.4.6",
"jsdom": "^24.1.0",
"primeflex": "^3.3.1",
- "primevue": "^3.53.0",
- "primevue-sass-theme": "https://github.com/primefaces/primevue-sass-theme.git#3.52.0",
+ "primevue": "^4.0.4",
"ramda": "^0.30.1",
"sass": "^1.77.2",
"vite": "^5.3.3",
diff --git a/packages/web-forms/src/OdkWebFormDemo.vue b/packages/web-forms/src/OdkWebFormDemo.vue
index a90d43e38..296cabbd6 100644
--- a/packages/web-forms/src/OdkWebFormDemo.vue
+++ b/packages/web-forms/src/OdkWebFormDemo.vue
@@ -23,12 +23,17 @@ const handleSubmit = () => {
const showForm = (form: [string, string]) => {
selectForm.value = form;
history.pushState({form: form }, "", "/" + form[0]);
+ window.scrollTo(0,0);
}
interface PopStateEventWithForm extends PopStateEvent {
state: {form: [string, string]};
}
+if ('scrollRestoration' in history) {
+ history.scrollRestoration = 'manual';
+}
+
window.addEventListener("popstate", (event:PopStateEventWithForm) => {
if(!event.state) {
selectForm.value = null;
@@ -49,9 +54,9 @@ if(location.pathname != '/'){
}
-
+
-
Demo Forms
+
Demo Forms
{{ form[0] }}
diff --git a/packages/web-forms/src/WebFormsPlugin.ts b/packages/web-forms/src/WebFormsPlugin.ts
index 0bb448f05..ac1fb9868 100644
--- a/packages/web-forms/src/WebFormsPlugin.ts
+++ b/packages/web-forms/src/WebFormsPlugin.ts
@@ -1,8 +1,30 @@
+import { definePreset, palette } from '@primevue/themes';
+import Aura from '@primevue/themes/aura';
import PrimeVue from 'primevue/config';
import { type App } from 'vue';
+const odkBlue = '#3e9fcc';
+
+const odkPrimaryPalette = palette(odkBlue);
+
+const OdkPreset:unknown = definePreset(Aura, {
+ semantic: {
+ primary: odkPrimaryPalette
+ }
+});
+
export const webFormsPlugin = {
install(app: App) {
- app.use(PrimeVue, { ripple: false }); // Collect has no ripple
+ app.use(PrimeVue, {
+ ripple: false,
+ theme: {
+ preset: OdkPreset,
+ options: {
+ darkModeSelector: '.dark-mode',
+ prefix: ''
+ }
+ }
+ });
},
};
+
diff --git a/packages/web-forms/src/assets/css/icomoon.css b/packages/web-forms/src/assets/css/icomoon.css
index e8e05b48b..577392240 100644
--- a/packages/web-forms/src/assets/css/icomoon.css
+++ b/packages/web-forms/src/assets/css/icomoon.css
@@ -1,9 +1,9 @@
@font-face {
font-family: 'owf-icomoon';
src:
- url('/fonts/icomoon.ttf?d2anc2') format('truetype'),
- url('/fonts/icomoon.woff?d2anc2') format('woff'),
- url('/fonts/icomoon.svg?d2anc2#icomoon') format('svg');
+ url('/fonts/icomoon/icomoon.ttf?d2anc2') format('truetype'),
+ url('/fonts/icomoon/icomoon.woff?d2anc2') format('woff'),
+ url('/fonts/icomoon/icomoon.svg?d2anc2#icomoon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
@@ -94,3 +94,12 @@
.icon-check:before {
content: '\e916';
}
+.icon-error:before {
+ content: '\e917';
+}
+.icon-error_outline:before {
+ content: '\e918';
+}
+.icon-add:before {
+ content: '\e919';
+}
diff --git a/packages/web-forms/src/assets/css/roboto.css b/packages/web-forms/src/assets/css/roboto.css
new file mode 100644
index 000000000..6109d4321
--- /dev/null
+++ b/packages/web-forms/src/assets/css/roboto.css
@@ -0,0 +1,189 @@
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2') format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2') format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2') format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2') format('woff2');
+ unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2') format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2') format('woff2');
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2') format('woff2');
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url('/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
\ No newline at end of file
diff --git a/packages/web-forms/src/assets/fonts/LICENSE-2.0.txt b/packages/web-forms/src/assets/fonts/icomoon/LICENSE-2.0.txt
similarity index 100%
rename from packages/web-forms/src/assets/fonts/LICENSE-2.0.txt
rename to packages/web-forms/src/assets/fonts/icomoon/LICENSE-2.0.txt
diff --git a/packages/web-forms/src/assets/fonts/icomoon.svg b/packages/web-forms/src/assets/fonts/icomoon/icomoon.svg
similarity index 89%
rename from packages/web-forms/src/assets/fonts/icomoon.svg
rename to packages/web-forms/src/assets/fonts/icomoon/icomoon.svg
index 3d14ae3d2..218a73f86 100644
--- a/packages/web-forms/src/assets/fonts/icomoon.svg
+++ b/packages/web-forms/src/assets/fonts/icomoon/icomoon.svg
@@ -30,4 +30,7 @@
+
+
+
\ No newline at end of file
diff --git a/packages/web-forms/src/assets/fonts/icomoon.ttf b/packages/web-forms/src/assets/fonts/icomoon/icomoon.ttf
similarity index 73%
rename from packages/web-forms/src/assets/fonts/icomoon.ttf
rename to packages/web-forms/src/assets/fonts/icomoon/icomoon.ttf
index edc9087f8..6faa85877 100644
Binary files a/packages/web-forms/src/assets/fonts/icomoon.ttf and b/packages/web-forms/src/assets/fonts/icomoon/icomoon.ttf differ
diff --git a/packages/web-forms/src/assets/fonts/icomoon.woff b/packages/web-forms/src/assets/fonts/icomoon/icomoon.woff
similarity index 73%
rename from packages/web-forms/src/assets/fonts/icomoon.woff
rename to packages/web-forms/src/assets/fonts/icomoon/icomoon.woff
index 28e45e6f5..761584c5b 100644
Binary files a/packages/web-forms/src/assets/fonts/icomoon.woff and b/packages/web-forms/src/assets/fonts/icomoon/icomoon.woff differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc-CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc-CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..d11921265
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc-CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc0CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc0CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..cbf95835f
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc0CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc1CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc1CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..874eb3f52
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc1CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc2CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc2CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..e61981b39
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc2CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc3CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc3CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..933663b10
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc3CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc5CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc5CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..fc3ce1313
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc5CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc6CsTYl4BO.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc6CsTYl4BO.woff2
new file mode 100644
index 000000000..326783f22
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51S7ACc6CsTYl4BO.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic-CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic-CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..e537aabea
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic-CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic0CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic0CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..d3b92abfc
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic0CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic1CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic1CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..1b0ea3d20
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic1CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic2CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic2CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..887e8545e
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic2CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic3CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic3CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..1417196cb
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic3CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic5CsTYl4BOQ3o.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic5CsTYl4BOQ3o.woff2
new file mode 100644
index 000000000..0a5e86b1e
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic5CsTYl4BOQ3o.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic6CsTYl4BO.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic6CsTYl4BO.woff2
new file mode 100644
index 000000000..99a75f4f5
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOjCnqEu92Fr1Mu51TzBic6CsTYl4BO.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xEIzIXKMnyrYk.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xEIzIXKMnyrYk.woff2
new file mode 100644
index 000000000..ced0df04e
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xEIzIXKMnyrYk.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xFIzIXKMnyrYk.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xFIzIXKMnyrYk.woff2
new file mode 100644
index 000000000..11ea71c77
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xFIzIXKMnyrYk.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xGIzIXKMnyrYk.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xGIzIXKMnyrYk.woff2
new file mode 100644
index 000000000..9718932ac
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xGIzIXKMnyrYk.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xHIzIXKMnyrYk.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xHIzIXKMnyrYk.woff2
new file mode 100644
index 000000000..657714dc7
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xHIzIXKMnyrYk.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xIIzIXKMny.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xIIzIXKMny.woff2
new file mode 100644
index 000000000..74bc29590
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xIIzIXKMny.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xLIzIXKMnyrYk.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xLIzIXKMnyrYk.woff2
new file mode 100644
index 000000000..9f22ca848
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xLIzIXKMnyrYk.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xMIzIXKMnyrYk.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xMIzIXKMnyrYk.woff2
new file mode 100644
index 000000000..a5389212b
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOkCnqEu92Fr1Mu51xMIzIXKMnyrYk.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2
new file mode 100644
index 000000000..6cec9d1fb
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2
new file mode 100644
index 000000000..58b810d76
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2
new file mode 100644
index 000000000..09cd9a4d5
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2
new file mode 100644
index 000000000..4e7a913ee
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2
new file mode 100644
index 000000000..506f56fb5
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2
new file mode 100644
index 000000000..7ab986043
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2
new file mode 100644
index 000000000..c6ee30544
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2
new file mode 100644
index 000000000..0cebc2771
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2
new file mode 100644
index 000000000..27cdcea19
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2
new file mode 100644
index 000000000..1353c90cd
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2
new file mode 100644
index 000000000..8d1ba4b9a
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2
new file mode 100644
index 000000000..f4bbdce10
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2
new file mode 100644
index 000000000..d0b146a30
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2
new file mode 100644
index 000000000..25f7af119
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2
new file mode 100644
index 000000000..91980acb0
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2
new file mode 100644
index 000000000..5fd0c8a90
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2
new file mode 100644
index 000000000..36a0ac701
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2
new file mode 100644
index 000000000..07f2ea66e
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2
new file mode 100644
index 000000000..cfdf8a824
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2
new file mode 100644
index 000000000..7c2895908
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2
new file mode 100644
index 000000000..ff3e1b024
Binary files /dev/null and b/packages/web-forms/src/assets/fonts/roboto/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 differ
diff --git a/packages/web-forms/src/assets/fonts/roboto/LICENSE.txt b/packages/web-forms/src/assets/fonts/roboto/LICENSE.txt
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/packages/web-forms/src/assets/fonts/roboto/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/packages/web-forms/src/components/FormGroup.vue b/packages/web-forms/src/components/FormGroup.vue
index e208c89f6..66ed53496 100644
--- a/packages/web-forms/src/components/FormGroup.vue
+++ b/packages/web-forms/src/components/FormGroup.vue
@@ -7,9 +7,6 @@ import QuestionList from './QuestionList.vue';
const props = defineProps<{ node: GroupNode }>();
const classes = ['group'];
-if(props.node.appearances['field-list']){
- // classes.push('field-list');
-}
const tableLayout = computed(() => {
return !!props.node.currentState.children.find(c =>
@@ -20,7 +17,7 @@ const tableLayout = computed(() => {
-
@@ -21,3 +28,24 @@ const isSelectNode = (n: QuestionNode): n is SelectNode => n.nodeType === 'selec
+
+
\ No newline at end of file
diff --git a/packages/web-forms/src/components/OdkWebForm.vue b/packages/web-forms/src/components/OdkWebForm.vue
index 598ce339b..a857e77b7 100644
--- a/packages/web-forms/src/components/OdkWebForm.vue
+++ b/packages/web-forms/src/components/OdkWebForm.vue
@@ -1,8 +1,9 @@
-