@evanschleret/formforgeclient 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=4.0.0"
6
6
  },
7
- "version": "2.0.0",
7
+ "version": "2.0.1",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
@@ -21,6 +21,8 @@ declare const TRANSLATIONS: {
21
21
  readonly 'builder.fieldType.date': "Date";
22
22
  readonly 'builder.fieldType.time': "Time";
23
23
  readonly 'builder.fieldType.file': "File upload";
24
+ readonly 'builder.tabs.builder': "Builder";
25
+ readonly 'builder.tabs.settings': "Settings";
24
26
  readonly 'builder.targetType.page': "Page";
25
27
  readonly 'builder.targetType.field': "Field";
26
28
  readonly 'builder.formTitlePlaceholder': "Form title";
@@ -160,6 +162,31 @@ declare const TRANSLATIONS: {
160
162
  readonly 'builder.toast.unpublishSuccess': "Form unpublished";
161
163
  readonly 'builder.optionDefaultLabel': "Option";
162
164
  readonly 'builder.optionsCount': "{count} options";
165
+ readonly 'builder.settings.title': "Settings";
166
+ readonly 'builder.settings.description': "Configure the lifecycle, access, and publication settings for this form.";
167
+ readonly 'builder.settings.formTitlePlaceholder': "Form title";
168
+ readonly 'builder.settings.categoryPlaceholder': "Category";
169
+ readonly 'builder.settings.opening.title': "Survey opening";
170
+ readonly 'builder.settings.opening.description': "Choose when the form becomes available.";
171
+ readonly 'builder.settings.opening.date': "Opening date";
172
+ readonly 'builder.settings.opening.time': "Opening time";
173
+ readonly 'builder.settings.closing.title': "Survey closing";
174
+ readonly 'builder.settings.closing.description': "Choose when the form stops accepting responses.";
175
+ readonly 'builder.settings.closing.date': "Closing date";
176
+ readonly 'builder.settings.closing.time': "Closing time";
177
+ readonly 'builder.settings.submissionLimit.title': "Submission limit";
178
+ readonly 'builder.settings.submissionLimit.description': "The form closes automatically after this many responses.";
179
+ readonly 'builder.settings.submissionLimit.maximumResponses': "Maximum responses";
180
+ readonly 'builder.settings.access.title': "Access";
181
+ readonly 'builder.settings.access.description': "Control who can submit the form and whether a PIN is required.";
182
+ readonly 'builder.settings.access.publicForm.title': "Public form";
183
+ readonly 'builder.settings.access.publicForm.description': "Allow anyone with the link to submit responses.";
184
+ readonly 'builder.settings.access.publicLink': "Public link";
185
+ readonly 'builder.settings.access.publicLinkPlaceholder': "Save the form to generate a link";
186
+ readonly 'builder.settings.access.pinProtection.title': "PIN protection";
187
+ readonly 'builder.settings.access.pinProtection.description': "Require a PIN before the form can be submitted.";
188
+ readonly 'builder.settings.access.pin': "PIN";
189
+ readonly 'builder.settings.access.pinPlaceholder': "Enter PIN";
163
190
  readonly 'builder.logic.title': "Conditional logic";
164
191
  readonly 'builder.logic.empty': "No logic rule yet";
165
192
  readonly 'builder.logic.rulesCount': "{count} logic rules";
@@ -255,6 +282,8 @@ declare const TRANSLATIONS: {
255
282
  readonly 'builder.fieldType.date': "Date";
256
283
  readonly 'builder.fieldType.time': "Heure";
257
284
  readonly 'builder.fieldType.file': "Téléversement de fichier";
285
+ readonly 'builder.tabs.builder': "Constructeur";
286
+ readonly 'builder.tabs.settings': "Paramètres";
258
287
  readonly 'builder.targetType.page': "Page";
259
288
  readonly 'builder.targetType.field': "Champ";
260
289
  readonly 'builder.formTitlePlaceholder': "Titre du formulaire";
@@ -394,6 +423,31 @@ declare const TRANSLATIONS: {
394
423
  readonly 'builder.toast.unpublishSuccess': "Formulaire dépublié";
395
424
  readonly 'builder.optionDefaultLabel': "Option";
396
425
  readonly 'builder.optionsCount': "{count} options";
426
+ readonly 'builder.settings.title': "Paramètres";
427
+ readonly 'builder.settings.description': "Configurez le cycle de vie, l’accès et les paramètres de publication de ce formulaire.";
428
+ readonly 'builder.settings.formTitlePlaceholder': "Titre du formulaire";
429
+ readonly 'builder.settings.categoryPlaceholder': "Catégorie";
430
+ readonly 'builder.settings.opening.title': "Ouverture du sondage";
431
+ readonly 'builder.settings.opening.description': "Choisissez quand le formulaire devient disponible.";
432
+ readonly 'builder.settings.opening.date': "Date d’ouverture";
433
+ readonly 'builder.settings.opening.time': "Heure d’ouverture";
434
+ readonly 'builder.settings.closing.title': "Fermeture du sondage";
435
+ readonly 'builder.settings.closing.description': "Choisissez quand le formulaire cesse d’accepter des réponses.";
436
+ readonly 'builder.settings.closing.date': "Date de fermeture";
437
+ readonly 'builder.settings.closing.time': "Heure de fermeture";
438
+ readonly 'builder.settings.submissionLimit.title': "Limite de réponses";
439
+ readonly 'builder.settings.submissionLimit.description': "Le formulaire se ferme automatiquement après ce nombre de réponses.";
440
+ readonly 'builder.settings.submissionLimit.maximumResponses': "Nombre maximal de réponses";
441
+ readonly 'builder.settings.access.title': "Accès";
442
+ readonly 'builder.settings.access.description': "Contrôlez qui peut répondre au formulaire et si un code PIN est requis.";
443
+ readonly 'builder.settings.access.publicForm.title': "Formulaire public";
444
+ readonly 'builder.settings.access.publicForm.description': "Autorisez toute personne ayant le lien à envoyer des réponses.";
445
+ readonly 'builder.settings.access.publicLink': "Lien public";
446
+ readonly 'builder.settings.access.publicLinkPlaceholder': "Enregistrez le formulaire pour générer un lien";
447
+ readonly 'builder.settings.access.pinProtection.title': "Protection par PIN";
448
+ readonly 'builder.settings.access.pinProtection.description': "Exiger un code PIN avant l’envoi du formulaire.";
449
+ readonly 'builder.settings.access.pin': "PIN";
450
+ readonly 'builder.settings.access.pinPlaceholder': "Saisissez le PIN";
397
451
  readonly 'builder.logic.title': "Logique conditionnelle";
398
452
  readonly 'builder.logic.empty': "Aucune règle de logique";
399
453
  readonly 'builder.logic.rulesCount': "{count} règles de logique";
@@ -17,6 +17,8 @@ const TRANSLATIONS = {
17
17
  "builder.fieldType.date": "Date",
18
18
  "builder.fieldType.time": "Time",
19
19
  "builder.fieldType.file": "File upload",
20
+ "builder.tabs.builder": "Builder",
21
+ "builder.tabs.settings": "Settings",
20
22
  "builder.targetType.page": "Page",
21
23
  "builder.targetType.field": "Field",
22
24
  "builder.formTitlePlaceholder": "Form title",
@@ -156,6 +158,31 @@ const TRANSLATIONS = {
156
158
  "builder.toast.unpublishSuccess": "Form unpublished",
157
159
  "builder.optionDefaultLabel": "Option",
158
160
  "builder.optionsCount": "{count} options",
161
+ "builder.settings.title": "Settings",
162
+ "builder.settings.description": "Configure the lifecycle, access, and publication settings for this form.",
163
+ "builder.settings.formTitlePlaceholder": "Form title",
164
+ "builder.settings.categoryPlaceholder": "Category",
165
+ "builder.settings.opening.title": "Survey opening",
166
+ "builder.settings.opening.description": "Choose when the form becomes available.",
167
+ "builder.settings.opening.date": "Opening date",
168
+ "builder.settings.opening.time": "Opening time",
169
+ "builder.settings.closing.title": "Survey closing",
170
+ "builder.settings.closing.description": "Choose when the form stops accepting responses.",
171
+ "builder.settings.closing.date": "Closing date",
172
+ "builder.settings.closing.time": "Closing time",
173
+ "builder.settings.submissionLimit.title": "Submission limit",
174
+ "builder.settings.submissionLimit.description": "The form closes automatically after this many responses.",
175
+ "builder.settings.submissionLimit.maximumResponses": "Maximum responses",
176
+ "builder.settings.access.title": "Access",
177
+ "builder.settings.access.description": "Control who can submit the form and whether a PIN is required.",
178
+ "builder.settings.access.publicForm.title": "Public form",
179
+ "builder.settings.access.publicForm.description": "Allow anyone with the link to submit responses.",
180
+ "builder.settings.access.publicLink": "Public link",
181
+ "builder.settings.access.publicLinkPlaceholder": "Save the form to generate a link",
182
+ "builder.settings.access.pinProtection.title": "PIN protection",
183
+ "builder.settings.access.pinProtection.description": "Require a PIN before the form can be submitted.",
184
+ "builder.settings.access.pin": "PIN",
185
+ "builder.settings.access.pinPlaceholder": "Enter PIN",
159
186
  "builder.logic.title": "Conditional logic",
160
187
  "builder.logic.empty": "No logic rule yet",
161
188
  "builder.logic.rulesCount": "{count} logic rules",
@@ -251,6 +278,8 @@ const TRANSLATIONS = {
251
278
  "builder.fieldType.date": "Date",
252
279
  "builder.fieldType.time": "Heure",
253
280
  "builder.fieldType.file": "T\xE9l\xE9versement de fichier",
281
+ "builder.tabs.builder": "Constructeur",
282
+ "builder.tabs.settings": "Param\xE8tres",
254
283
  "builder.targetType.page": "Page",
255
284
  "builder.targetType.field": "Champ",
256
285
  "builder.formTitlePlaceholder": "Titre du formulaire",
@@ -390,6 +419,31 @@ const TRANSLATIONS = {
390
419
  "builder.toast.unpublishSuccess": "Formulaire d\xE9publi\xE9",
391
420
  "builder.optionDefaultLabel": "Option",
392
421
  "builder.optionsCount": "{count} options",
422
+ "builder.settings.title": "Param\xE8tres",
423
+ "builder.settings.description": "Configurez le cycle de vie, l\u2019acc\xE8s et les param\xE8tres de publication de ce formulaire.",
424
+ "builder.settings.formTitlePlaceholder": "Titre du formulaire",
425
+ "builder.settings.categoryPlaceholder": "Cat\xE9gorie",
426
+ "builder.settings.opening.title": "Ouverture du sondage",
427
+ "builder.settings.opening.description": "Choisissez quand le formulaire devient disponible.",
428
+ "builder.settings.opening.date": "Date d\u2019ouverture",
429
+ "builder.settings.opening.time": "Heure d\u2019ouverture",
430
+ "builder.settings.closing.title": "Fermeture du sondage",
431
+ "builder.settings.closing.description": "Choisissez quand le formulaire cesse d\u2019accepter des r\xE9ponses.",
432
+ "builder.settings.closing.date": "Date de fermeture",
433
+ "builder.settings.closing.time": "Heure de fermeture",
434
+ "builder.settings.submissionLimit.title": "Limite de r\xE9ponses",
435
+ "builder.settings.submissionLimit.description": "Le formulaire se ferme automatiquement apr\xE8s ce nombre de r\xE9ponses.",
436
+ "builder.settings.submissionLimit.maximumResponses": "Nombre maximal de r\xE9ponses",
437
+ "builder.settings.access.title": "Acc\xE8s",
438
+ "builder.settings.access.description": "Contr\xF4lez qui peut r\xE9pondre au formulaire et si un code PIN est requis.",
439
+ "builder.settings.access.publicForm.title": "Formulaire public",
440
+ "builder.settings.access.publicForm.description": "Autorisez toute personne ayant le lien \xE0 envoyer des r\xE9ponses.",
441
+ "builder.settings.access.publicLink": "Lien public",
442
+ "builder.settings.access.publicLinkPlaceholder": "Enregistrez le formulaire pour g\xE9n\xE9rer un lien",
443
+ "builder.settings.access.pinProtection.title": "Protection par PIN",
444
+ "builder.settings.access.pinProtection.description": "Exiger un code PIN avant l\u2019envoi du formulaire.",
445
+ "builder.settings.access.pin": "PIN",
446
+ "builder.settings.access.pinPlaceholder": "Saisissez le PIN",
393
447
  "builder.logic.title": "Logique conditionnelle",
394
448
  "builder.logic.empty": "Aucune r\xE8gle de logique",
395
449
  "builder.logic.rulesCount": "{count} r\xE8gles de logique",
@@ -400,14 +400,14 @@ const submissionIsPublic = computed({
400
400
  const builderTabs = computed(() => {
401
401
  const items = [
402
402
  {
403
- label: "Builder",
403
+ label: t("builder.tabs.builder"),
404
404
  icon: "i-lucide-layout-grid",
405
405
  slot: "builder"
406
406
  }
407
407
  ];
408
408
  if (!settingsHidden.value) {
409
409
  items.push({
410
- label: "Settings",
410
+ label: t("builder.tabs.settings"),
411
411
  icon: "i-lucide-settings-2",
412
412
  slot: "settings"
413
413
  });
@@ -939,10 +939,10 @@ defineExpose(builderExpose);
939
939
  <template #header>
940
940
  <div class="space-y-1">
941
941
  <p class="text-sm font-semibold text-default">
942
- Settings
942
+ {{ t("builder.settings.title") }}
943
943
  </p>
944
944
  <p class="text-sm text-muted">
945
- Configure the lifecycle, access, and publication settings for this form.
945
+ {{ t("builder.settings.description") }}
946
946
  </p>
947
947
  </div>
948
948
  </template>
@@ -956,7 +956,7 @@ defineExpose(builderExpose);
956
956
  v-if="!disableTitleInput"
957
957
  v-model="draftTitle"
958
958
  :disabled="readonly"
959
- placeholder="Form title"
959
+ :placeholder="t('builder.settings.formTitlePlaceholder')"
960
960
  :ui="{ base: 'w-full' }"
961
961
  />
962
962
  <div
@@ -967,7 +967,7 @@ defineExpose(builderExpose);
967
967
  v-model="draftCategorySelectValue"
968
968
  :items="categorySelectItems"
969
969
  :disabled="readonly"
970
- placeholder="Category"
970
+ :placeholder="t('builder.settings.categoryPlaceholder')"
971
971
  :ui="{
972
972
  base: 'w-full'
973
973
  }"
@@ -988,10 +988,10 @@ defineExpose(builderExpose);
988
988
  <div class="grid gap-4 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-start">
989
989
  <div class="space-y-1">
990
990
  <p class="text-sm font-semibold text-default">
991
- Survey opening
991
+ {{ t("builder.settings.opening.title") }}
992
992
  </p>
993
993
  <p class="text-sm text-muted">
994
- Choose when the form becomes available.
994
+ {{ t("builder.settings.opening.description") }}
995
995
  </p>
996
996
  </div>
997
997
  <USwitch
@@ -1004,14 +1004,14 @@ defineExpose(builderExpose);
1004
1004
  v-if="openingEnabled"
1005
1005
  class="grid gap-4 sm:grid-cols-2"
1006
1006
  >
1007
- <UFormField label="Opening date">
1007
+ <UFormField :label="t('builder.settings.opening.date')">
1008
1008
  <UInputDate
1009
1009
  v-model="publishAtDate"
1010
1010
  :disabled="readonly"
1011
1011
  :ui="{ base: 'w-full' }"
1012
1012
  />
1013
1013
  </UFormField>
1014
- <UFormField label="Opening time">
1014
+ <UFormField :label="t('builder.settings.opening.time')">
1015
1015
  <UInputTime
1016
1016
  v-model="publishAtTime"
1017
1017
  :disabled="readonly"
@@ -1026,10 +1026,10 @@ defineExpose(builderExpose);
1026
1026
  <div class="grid gap-4 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-start">
1027
1027
  <div class="space-y-1">
1028
1028
  <p class="text-sm font-semibold text-default">
1029
- Survey closing
1029
+ {{ t("builder.settings.closing.title") }}
1030
1030
  </p>
1031
1031
  <p class="text-sm text-muted">
1032
- Choose when the form stops accepting responses.
1032
+ {{ t("builder.settings.closing.description") }}
1033
1033
  </p>
1034
1034
  </div>
1035
1035
  <USwitch
@@ -1042,14 +1042,14 @@ defineExpose(builderExpose);
1042
1042
  v-if="closingEnabled"
1043
1043
  class="grid gap-4 sm:grid-cols-2"
1044
1044
  >
1045
- <UFormField label="Closing date">
1045
+ <UFormField :label="t('builder.settings.closing.date')">
1046
1046
  <UInputDate
1047
1047
  v-model="pauseAtDate"
1048
1048
  :disabled="readonly"
1049
1049
  :ui="{ base: 'w-full' }"
1050
1050
  />
1051
1051
  </UFormField>
1052
- <UFormField label="Closing time">
1052
+ <UFormField :label="t('builder.settings.closing.time')">
1053
1053
  <UInputTime
1054
1054
  v-model="pauseAtTime"
1055
1055
  :disabled="readonly"
@@ -1064,10 +1064,10 @@ defineExpose(builderExpose);
1064
1064
  <div class="grid gap-4 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-start">
1065
1065
  <div class="space-y-1">
1066
1066
  <p class="text-sm font-semibold text-default">
1067
- Submission limit
1067
+ {{ t("builder.settings.submissionLimit.title") }}
1068
1068
  </p>
1069
1069
  <p class="text-sm text-muted">
1070
- The form closes automatically after this many responses.
1070
+ {{ t("builder.settings.submissionLimit.description") }}
1071
1071
  </p>
1072
1072
  </div>
1073
1073
  <USwitch
@@ -1078,7 +1078,7 @@ defineExpose(builderExpose);
1078
1078
 
1079
1079
  <UFormField
1080
1080
  v-if="responseLimitEnabled"
1081
- label="Maximum responses"
1081
+ :label="t('builder.settings.submissionLimit.maximumResponses')"
1082
1082
  >
1083
1083
  <UInputNumber
1084
1084
  v-model="responseLimitValue"
@@ -1092,10 +1092,10 @@ defineExpose(builderExpose);
1092
1092
  <div class="grid gap-6">
1093
1093
  <div class="space-y-1">
1094
1094
  <p class="text-sm font-semibold text-default">
1095
- Access
1095
+ {{ t("builder.settings.access.title") }}
1096
1096
  </p>
1097
1097
  <p class="text-sm text-muted">
1098
- Control who can submit the form and whether a PIN is required.
1098
+ {{ t("builder.settings.access.description") }}
1099
1099
  </p>
1100
1100
  </div>
1101
1101
 
@@ -1103,10 +1103,10 @@ defineExpose(builderExpose);
1103
1103
  <div class="flex items-start justify-between gap-4">
1104
1104
  <div class="space-y-1">
1105
1105
  <p class="text-sm font-medium text-default">
1106
- Public form
1106
+ {{ t("builder.settings.access.publicForm.title") }}
1107
1107
  </p>
1108
1108
  <p class="text-sm text-muted">
1109
- Allow anyone with the link to submit responses.
1109
+ {{ t("builder.settings.access.publicForm.description") }}
1110
1110
  </p>
1111
1111
  </div>
1112
1112
  <USwitch
@@ -1116,11 +1116,11 @@ defineExpose(builderExpose);
1116
1116
  </div>
1117
1117
 
1118
1118
  <div v-if="submissionIsPublic">
1119
- <UFormField label="Public link">
1119
+ <UFormField :label="t('builder.settings.access.publicLink')">
1120
1120
  <UInput
1121
1121
  :model-value="publicUrlValue"
1122
1122
  disabled
1123
- placeholder="Save the form to generate a link"
1123
+ :placeholder="t('builder.settings.access.publicLinkPlaceholder')"
1124
1124
  :ui="{ base: 'w-full' }"
1125
1125
  />
1126
1126
  </UFormField>
@@ -1129,10 +1129,10 @@ defineExpose(builderExpose);
1129
1129
  <div class="flex items-start justify-between gap-4 border-t border-muted pt-4">
1130
1130
  <div class="space-y-1">
1131
1131
  <p class="text-sm font-medium text-default">
1132
- PIN protection
1132
+ {{ t("builder.settings.access.pinProtection.title") }}
1133
1133
  </p>
1134
1134
  <p class="text-sm text-muted">
1135
- Require a PIN before the form can be submitted.
1135
+ {{ t("builder.settings.access.pinProtection.description") }}
1136
1136
  </p>
1137
1137
  </div>
1138
1138
  <USwitch
@@ -1142,12 +1142,12 @@ defineExpose(builderExpose);
1142
1142
  </div>
1143
1143
 
1144
1144
  <div v-if="submissionPinEnabled">
1145
- <UFormField label="PIN">
1145
+ <UFormField :label="t('builder.settings.access.pin')">
1146
1146
  <UInput
1147
1147
  v-model="submissionPinValue"
1148
1148
  :disabled="readonly"
1149
1149
  type="password"
1150
- placeholder="Enter PIN"
1150
+ :placeholder="t('builder.settings.access.pinPlaceholder')"
1151
1151
  :ui="{ base: 'w-full' }"
1152
1152
  />
1153
1153
  </UFormField>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evanschleret/formforgeclient",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Nuxt module and runtime client for FormForge",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@internationalized/date": "^3.12.2",
45
- "tailwindcss": "^4.3.1",
45
+ "tailwindcss": "^4.3.2",
46
46
  "vuedraggable": "^4.1.0",
47
47
  "zod": "^4.4.3"
48
48
  },
@@ -51,15 +51,15 @@
51
51
  "@nuxt/kit": "^4.4.8",
52
52
  "@nuxt/module-builder": "^1.0.2",
53
53
  "@nuxt/ui": "^4.9.0",
54
- "@types/node": "^25.9.3",
55
- "eslint": "^10.5.0",
54
+ "@types/node": "^25.9.4",
55
+ "eslint": "^10.6.0",
56
56
  "eslint-plugin-vue": "^10.9.2",
57
57
  "nuxt": "^4.4.8",
58
58
  "typescript": "^6.0.3",
59
- "typescript-eslint": "^8.61.1",
59
+ "typescript-eslint": "^8.62.1",
60
60
  "vitest": "^4.1.9",
61
61
  "vue-eslint-parser": "^10.4.1",
62
- "vue-tsc": "^3.3.5"
62
+ "vue-tsc": "^3.3.6"
63
63
  },
64
64
  "publishConfig": {
65
65
  "access": "public",