@verbb/formie-browser 1.0.4 → 1.0.6

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.
Files changed (197) hide show
  1. package/CHANGELOG.md +76 -22
  2. package/dist/chunks/address-country-Rx6GQTND.js +68 -0
  3. package/dist/chunks/address-finder-yXU5yMjG.js +30 -0
  4. package/dist/chunks/address-state-BQ0xGV9n.js +344 -0
  5. package/dist/chunks/api-CmwLRq_n.js +780 -0
  6. package/dist/chunks/api-DMK8NSUI.js +407 -0
  7. package/dist/chunks/api-sPqGbOww.js +125 -0
  8. package/dist/chunks/async-nPFRNQ06.js +25 -0
  9. package/dist/chunks/bpoint-DSjqRv63.js +24 -0
  10. package/dist/chunks/calculations-CeDgB9jt.js +299 -0
  11. package/dist/chunks/captcha-eu-CWJb64_j.js +31 -0
  12. package/dist/chunks/checkbox-radio-DQ0H67Tj.js +125 -0
  13. package/dist/chunks/chunk-3b4jIN3o.js +13 -0
  14. package/dist/chunks/combobox-D-2b42wn.js +1954 -0
  15. package/dist/chunks/conditions-DjZOtHfS.js +412 -0
  16. package/dist/chunks/constants-DVcJAvc5.js +38 -0
  17. package/dist/chunks/country-from-ip-BwxKaBuJ.js +26 -0
  18. package/dist/chunks/custom-google-maps-BsaSirEZ.js +194 -0
  19. package/dist/chunks/custom-link-CJ1-FjEM.js +46 -0
  20. package/dist/chunks/custom-maps-DYW_pBid.js +161 -0
  21. package/dist/chunks/date-picker-5CA_-zGb.js +5311 -0
  22. package/dist/chunks/debug-BV0DvdHx.js +41 -0
  23. package/dist/chunks/dist-BQ4a9hmy.js +2659 -0
  24. package/dist/chunks/event-names-BCI2FLD8.js +51 -0
  25. package/dist/chunks/eway-D3ctTbEk.js +70 -0
  26. package/dist/chunks/field-references.keys-58ZSTrCW.js +21 -0
  27. package/dist/chunks/field-references.resolver-CHwn0G0L.js +145 -0
  28. package/dist/chunks/file-upload-D49m8-DR.js +287 -0
  29. package/dist/chunks/friendly-captcha-v1-ByXzENYZ.js +31 -0
  30. package/dist/chunks/friendly-captcha-v2-BPdlmhQu.js +36 -0
  31. package/dist/chunks/friendly-challenge-8uPatWqk.js +832 -0
  32. package/dist/chunks/go-cardless-BwASSYSK.js +23 -0
  33. package/dist/chunks/google-address-OhKilPWE.js +161 -0
  34. package/dist/chunks/hcaptcha-CdCd9oEi.js +54 -0
  35. package/dist/chunks/hidden-D7_Ch-QN.js +26 -0
  36. package/dist/chunks/http-D-JExro7.js +27 -0
  37. package/dist/chunks/i18n-BY1ds1BL.js +121 -0
  38. package/dist/chunks/leaflet-src-j-lHNmhR.js +4585 -0
  39. package/dist/chunks/loqate-Cp2zvwpE.js +76 -0
  40. package/dist/chunks/mollie-COG-ko2D.js +23 -0
  41. package/dist/chunks/moneris-CMH8PlRc.js +117 -0
  42. package/dist/chunks/opayo-D2jsR5vh.js +113 -0
  43. package/dist/chunks/paddle-DxF88RfC.js +55 -0
  44. package/dist/chunks/paypal-b5pnwrA2.js +95 -0
  45. package/dist/chunks/payway-BJYu9DIR.js +55 -0
  46. package/dist/chunks/phone-country-D3ayr60L.js +2645 -0
  47. package/dist/chunks/place-kit-BGHklIZ-.js +48 -0
  48. package/dist/chunks/placekit-autocomplete.esm-DWVabQlq.js +1236 -0
  49. package/dist/chunks/recaptcha-enterprise-BSwi8IVX.js +65 -0
  50. package/dist/chunks/recaptcha-shared-B4zAescW.js +15 -0
  51. package/dist/chunks/recaptcha-v2-checkbox-CnDQmsKa.js +40 -0
  52. package/dist/chunks/recaptcha-v2-invisible-Cz5uIlp-.js +53 -0
  53. package/dist/chunks/recaptcha-v3-BtbbP111.js +27 -0
  54. package/dist/chunks/repeater-B5leVxZU.js +102 -0
  55. package/dist/chunks/rich-text-D0sb8bmX.js +349 -0
  56. package/dist/chunks/scripts-6CYSUGKQ.js +24 -0
  57. package/dist/chunks/sdk-BhHAYgga.js +1397 -0
  58. package/dist/chunks/shared-Bx9s0i0P.js +100 -0
  59. package/dist/chunks/signature-xz4QO7CR.js +536 -0
  60. package/dist/chunks/snaptcha-vz1RnZ15.js +8 -0
  61. package/dist/chunks/square-BP8RWAKB.js +40 -0
  62. package/dist/chunks/stripe-MihN63uC.js +184 -0
  63. package/dist/chunks/styles-BfoIZwJp.js +19 -0
  64. package/dist/chunks/summary-D3AjxpYN.js +114 -0
  65. package/dist/chunks/table-C-lkQN6I.js +78 -0
  66. package/dist/chunks/text-limit-DbgEFHLO.js +125 -0
  67. package/dist/chunks/theme-classes-Tv7q7ToE.js +44 -0
  68. package/dist/chunks/turnstile-D_Pi1CKM.js +58 -0
  69. package/dist/chunks/upload-manager-BpqWSHmU.js +2558 -0
  70. package/dist/chunks/utils-Vqp8i_RM.js +49401 -0
  71. package/dist/css/formie-theme.css +2 -0
  72. package/dist/css/theme/_buttons.css +16 -0
  73. package/dist/css/theme/_tokens.css +2 -0
  74. package/dist/css/theme/fields/_address-state.css +94 -0
  75. package/dist/css/theme/fields/_combobox.css +246 -0
  76. package/dist/css/theme/fields/_select.css +13 -0
  77. package/dist/css/theme/fields/_signature.css +19 -0
  78. package/dist/css/theme/fields/_upload-manager.css +279 -0
  79. package/dist/index.js +2448 -39
  80. package/dist/js/core/create-formie-client.d.ts.map +1 -1
  81. package/dist/js/core/submit-result-ui.d.ts.map +1 -1
  82. package/dist/js/core/validation-focus.d.ts +4 -0
  83. package/dist/js/core/validation-focus.d.ts.map +1 -0
  84. package/dist/js/modules/address/api.d.ts +1 -0
  85. package/dist/js/modules/address/api.d.ts.map +1 -1
  86. package/dist/js/modules/address/constants.d.ts +22 -1
  87. package/dist/js/modules/address/constants.d.ts.map +1 -1
  88. package/dist/js/modules/address/host.d.ts +2 -2
  89. package/dist/js/modules/address/host.d.ts.map +1 -1
  90. package/dist/js/modules/address/loqate.d.ts.map +1 -1
  91. package/dist/js/modules/fields/address-country.d.ts +3 -0
  92. package/dist/js/modules/fields/address-country.d.ts.map +1 -0
  93. package/dist/js/modules/fields/address-state.d.ts +3 -0
  94. package/dist/js/modules/fields/address-state.d.ts.map +1 -0
  95. package/dist/js/modules/fields/calculations.d.ts.map +1 -1
  96. package/dist/js/modules/fields/combobox.d.ts +17 -0
  97. package/dist/js/modules/fields/combobox.d.ts.map +1 -0
  98. package/dist/js/modules/fields/custom-google-maps.d.ts +64 -0
  99. package/dist/js/modules/fields/custom-google-maps.d.ts.map +1 -0
  100. package/dist/js/modules/fields/custom-link.d.ts +3 -0
  101. package/dist/js/modules/fields/custom-link.d.ts.map +1 -0
  102. package/dist/js/modules/fields/custom-maps.d.ts +3 -0
  103. package/dist/js/modules/fields/custom-maps.d.ts.map +1 -0
  104. package/dist/js/modules/fields/date-picker.d.ts.map +1 -1
  105. package/dist/js/modules/fields/index.d.ts.map +1 -1
  106. package/dist/js/modules/fields/phone-country.d.ts.map +1 -1
  107. package/dist/js/modules/fields/signature.d.ts.map +1 -1
  108. package/dist/js/modules/fields/upload-manager.d.ts +3 -0
  109. package/dist/js/modules/fields/upload-manager.d.ts.map +1 -0
  110. package/dist/js/submit/pipeline.d.ts.map +1 -1
  111. package/dist/js/utils/country-from-ip.d.ts +7 -0
  112. package/dist/js/utils/country-from-ip.d.ts.map +1 -0
  113. package/dist/js/utils/field-references.d.ts +1 -0
  114. package/dist/js/utils/field-references.d.ts.map +1 -1
  115. package/dist/js/utils/field-references.row-scope.d.ts +11 -0
  116. package/dist/js/utils/field-references.row-scope.d.ts.map +1 -0
  117. package/package.json +8 -3
  118. package/src/css/formie-theme.css +2 -0
  119. package/src/css/theme/_buttons.css +16 -0
  120. package/src/css/theme/_tokens.css +2 -0
  121. package/src/css/theme/fields/_address-state.css +94 -0
  122. package/src/css/theme/fields/_combobox.css +246 -0
  123. package/src/css/theme/fields/_select.css +13 -0
  124. package/src/css/theme/fields/_signature.css +19 -0
  125. package/src/css/theme/fields/_upload-manager.css +279 -0
  126. package/src/js/core/create-formie-client.ts +27 -0
  127. package/src/js/core/submit-result-ui.ts +4 -4
  128. package/src/js/core/validation-focus.ts +117 -0
  129. package/src/js/modules/address/api.ts +7 -0
  130. package/src/js/modules/address/constants.ts +82 -2
  131. package/src/js/modules/address/host.ts +16 -6
  132. package/src/js/modules/address/loqate.ts +3 -17
  133. package/src/js/modules/fields/address-country.ts +156 -0
  134. package/src/js/modules/fields/address-state.ts +946 -0
  135. package/src/js/modules/fields/calculations.ts +32 -0
  136. package/src/js/modules/fields/combobox.ts +188 -0
  137. package/src/js/modules/fields/custom-google-maps.ts +416 -0
  138. package/src/js/modules/fields/custom-link.ts +95 -0
  139. package/src/js/modules/fields/custom-maps.ts +339 -0
  140. package/src/js/modules/fields/date-picker.ts +96 -3
  141. package/src/js/modules/fields/index.ts +7 -0
  142. package/src/js/modules/fields/phone-country.ts +6 -0
  143. package/src/js/modules/fields/signature.ts +199 -15
  144. package/src/js/modules/fields/upload-manager.ts +1277 -0
  145. package/src/js/submit/pipeline.ts +11 -1
  146. package/src/js/utils/country-from-ip.ts +54 -0
  147. package/src/js/utils/field-references.row-scope.ts +303 -0
  148. package/src/js/utils/field-references.ts +1 -0
  149. package/src/vendor.d.ts +1 -1
  150. package/dist/chunks/address-finder-BU4roxT6.js +0 -37
  151. package/dist/chunks/bpoint-uNg5j6rt.js +0 -26
  152. package/dist/chunks/calculations-C9t6Zop9.js +0 -147
  153. package/dist/chunks/captcha-eu-BAPzHNts.js +0 -34
  154. package/dist/chunks/checkbox-radio-CHeLNVIK.js +0 -141
  155. package/dist/chunks/conditions-DKxVCsjD.js +0 -459
  156. package/dist/chunks/date-picker-B3iQ797Z.js +0 -4994
  157. package/dist/chunks/eway-DCielIML.js +0 -74
  158. package/dist/chunks/file-upload-DP2TOUYV.js +0 -316
  159. package/dist/chunks/friendly-captcha-v1-DdlcGiFY.js +0 -33
  160. package/dist/chunks/friendly-captcha-v2-76w-YnFm.js +0 -38
  161. package/dist/chunks/go-cardless-rwCkzbNK.js +0 -24
  162. package/dist/chunks/google-address-BD8IZ86V.js +0 -181
  163. package/dist/chunks/hcaptcha-BNNTL6uf.js +0 -56
  164. package/dist/chunks/hidden-CW6Rcf1N.js +0 -31
  165. package/dist/chunks/index-BEsfee-D.js +0 -1839
  166. package/dist/chunks/index-BP7Unm5Y.js +0 -863
  167. package/dist/chunks/index-D6npYxvr.js +0 -4423
  168. package/dist/chunks/loqate-B-ZNS65B.js +0 -55
  169. package/dist/chunks/mollie-BDAZ-1X4.js +0 -24
  170. package/dist/chunks/moneris-B1b0uEtY.js +0 -101
  171. package/dist/chunks/opayo-CC5hraHo.js +0 -122
  172. package/dist/chunks/paddle-B4GmrDsq.js +0 -60
  173. package/dist/chunks/paypal-BFS6XsIS.js +0 -100
  174. package/dist/chunks/payway-DekoJead.js +0 -56
  175. package/dist/chunks/phone-country-Cm5YUeXI.js +0 -3765
  176. package/dist/chunks/place-kit-DizZWV_e.js +0 -42
  177. package/dist/chunks/placekit-autocomplete.esm-LAwfbPZl.js +0 -1299
  178. package/dist/chunks/recaptcha-enterprise-BbOvO7JZ.js +0 -71
  179. package/dist/chunks/recaptcha-shared-Dwg1eVFS.js +0 -15
  180. package/dist/chunks/recaptcha-v2-checkbox-SY3ti5iQ.js +0 -41
  181. package/dist/chunks/recaptcha-v2-invisible-DSmQnn6c.js +0 -59
  182. package/dist/chunks/recaptcha-v3-DNh7YCnR.js +0 -28
  183. package/dist/chunks/repeater-DM0vuFNQ.js +0 -124
  184. package/dist/chunks/rich-text-C8aGYp70.js +0 -304
  185. package/dist/chunks/scripts-CKTFtxPO.js +0 -36
  186. package/dist/chunks/sdk-3SicTWby.js +0 -1559
  187. package/dist/chunks/shared--BU5CFoL.js +0 -80
  188. package/dist/chunks/signature-pFhZfH7d.js +0 -550
  189. package/dist/chunks/snaptcha-VuOUOaLj.js +0 -8
  190. package/dist/chunks/square-BR9pvToy.js +0 -46
  191. package/dist/chunks/stripe-OHUwoV9g.js +0 -202
  192. package/dist/chunks/styles-C3aqgtek.js +0 -21
  193. package/dist/chunks/summary-Da7Ktg3N.js +0 -126
  194. package/dist/chunks/table-C0PmR9bI.js +0 -95
  195. package/dist/chunks/text-limit-mLEwZDIa.js +0 -144
  196. package/dist/chunks/turnstile-9tM7q_LK.js +0 -59
  197. package/dist/chunks/utils-BntI3W4S.js +0 -6149
@@ -0,0 +1,246 @@
1
+ /*
2
+ * Combobox styles are intentionally unlayered. The combobox module injects this
3
+ * sheet at runtime, and unlayered third-party CSS would otherwise win over
4
+ * @layer formie-theme rules.
5
+ *
6
+ * Tom Select default CSS is not imported; these rules provide the minimum
7
+ * structure plus Formie theme styling for searchable dropdowns.
8
+ */
9
+
10
+ .formie-field .ts-wrapper.formie-combobox {
11
+ width: 100%;
12
+ display: block;
13
+ position: relative;
14
+ min-height: 0;
15
+ border: 0;
16
+ padding: 0;
17
+ background: none;
18
+ box-shadow: none;
19
+ }
20
+
21
+ .formie-field select[data-formie-combobox-input].tomselected,
22
+ .formie-field select[data-formie-combobox-input].ts-hidden-accessible {
23
+ display: none !important;
24
+ }
25
+
26
+ .formie-field .ts-wrapper.formie-combobox .ts-control {
27
+ box-sizing: border-box;
28
+ display: flex;
29
+ flex-wrap: wrap;
30
+ align-items: center;
31
+ position: relative;
32
+ overflow: hidden;
33
+ z-index: 1;
34
+ width: 100%;
35
+ border: var(--formie-border-width) solid var(--formie-color-border);
36
+ border-radius: var(--formie-radius-sm);
37
+ background-color: var(--formie-color-surface);
38
+ background-image: none;
39
+ min-height: var(--formie-control-height);
40
+ padding: calc(var(--formie-control-padding-y) - 1px) var(--formie-control-padding-x);
41
+ box-shadow: none;
42
+ font-size: var(--formie-control-font-size);
43
+ line-height: var(--formie-line-height-tight);
44
+ color: var(--formie-color-text);
45
+ transition: border-color 150ms ease, box-shadow 150ms ease, background-color 150ms ease;
46
+ gap: var(--formie-space-1);
47
+ }
48
+
49
+ .formie-field .ts-wrapper.formie-combobox.single .ts-control {
50
+ --ts-pr-min: var(--formie-control-padding-x);
51
+ --ts-pr-caret: calc(var(--formie-select-indicator-size) + var(--formie-space-1));
52
+ padding-right: calc(var(--formie-control-padding-x) + var(--formie-select-indicator-size) + var(--formie-space-2)) !important;
53
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239CA3AF' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
54
+ background-position: right var(--formie-space-2) center;
55
+ background-repeat: no-repeat;
56
+ background-size: var(--formie-select-indicator-size) var(--formie-select-indicator-size);
57
+ }
58
+
59
+ .formie-field .ts-wrapper.formie-combobox.single .ts-control::after {
60
+ display: none;
61
+ }
62
+
63
+ .formie-field .ts-wrapper.formie-combobox.multi .ts-control {
64
+ padding: calc(var(--formie-control-padding-y) - 2px) var(--formie-control-padding-x) calc(var(--formie-control-padding-y) - 4px);
65
+ --ts-pr-min: var(--formie-control-padding-x);
66
+ }
67
+
68
+ .formie-field .ts-wrapper.formie-combobox.multi.has-items .ts-control {
69
+ padding-left: var(--formie-control-padding-x);
70
+ }
71
+
72
+ .formie-field .ts-wrapper.formie-combobox .ts-control > input {
73
+ flex: 1 1 auto;
74
+ min-width: 7rem;
75
+ max-width: 100%;
76
+ margin: 0 !important;
77
+ padding: 0 !important;
78
+ min-height: 0 !important;
79
+ max-height: none !important;
80
+ border: 0 !important;
81
+ background: none !important;
82
+ box-shadow: none !important;
83
+ color: var(--formie-color-text);
84
+ font: inherit;
85
+ font-size: var(--formie-control-font-size);
86
+ line-height: inherit;
87
+ }
88
+
89
+ .formie-field .ts-wrapper.formie-combobox .ts-control > input:focus {
90
+ outline: none !important;
91
+ }
92
+
93
+ .formie-field .ts-wrapper.formie-combobox.has-items .ts-control > input {
94
+ margin: 0 var(--formie-space-1) !important;
95
+ }
96
+
97
+ .formie-field .ts-wrapper.formie-combobox.input-hidden .ts-control > input {
98
+ opacity: 0;
99
+ position: absolute;
100
+ left: -10000px;
101
+ }
102
+
103
+ .formie-field .ts-wrapper.formie-combobox.single .ts-control,
104
+ .formie-field .ts-wrapper.formie-combobox.single .ts-control > input {
105
+ cursor: pointer;
106
+ }
107
+
108
+ .formie-field .ts-wrapper.formie-combobox.single.input-active .ts-control,
109
+ .formie-field .ts-wrapper.formie-combobox.single.input-active .ts-control > input {
110
+ cursor: text;
111
+ }
112
+
113
+ .formie-field .ts-wrapper.formie-combobox .ts-control .items-placeholder {
114
+ color: var(--formie-color-text-muted);
115
+ font: inherit;
116
+ font-size: var(--formie-control-font-size);
117
+ }
118
+
119
+ .formie-field .ts-wrapper.formie-combobox .ts-control > input::placeholder {
120
+ color: var(--formie-color-text-muted);
121
+ }
122
+
123
+ .formie-field .ts-wrapper.formie-combobox.focus .ts-control,
124
+ .formie-field .ts-wrapper.formie-combobox .ts-control:focus-within,
125
+ .formie-field .ts-wrapper.formie-combobox.dropdown-active .ts-control {
126
+ outline: 0;
127
+ border-color: var(--formie-color-focus-ring);
128
+ box-shadow: var(--formie-shadow-focus);
129
+ border-radius: var(--formie-radius-sm);
130
+ }
131
+
132
+ .formie-field-has-error .ts-wrapper.formie-combobox .ts-control {
133
+ border-color: var(--formie-color-danger);
134
+ }
135
+
136
+ .formie-field-has-error .ts-wrapper.formie-combobox.focus .ts-control,
137
+ .formie-field-has-error .ts-wrapper.formie-combobox .ts-control:focus-within,
138
+ .formie-field-has-error .ts-wrapper.formie-combobox.dropdown-active .ts-control {
139
+ border-color: var(--formie-color-danger);
140
+ box-shadow: var(--formie-shadow-danger-focus);
141
+ }
142
+
143
+ .formie-field .ts-wrapper.formie-combobox.multi .ts-control > .item,
144
+ .formie-field .ts-wrapper.formie-combobox.multi .ts-control [data-value] {
145
+ display: inline-flex;
146
+ align-items: center;
147
+ gap: var(--formie-space-1);
148
+ margin: 0 var(--formie-space-1) var(--formie-space-1) 0;
149
+ padding: 0 var(--formie-space-2);
150
+ background: var(--formie-color-surface-muted, rgba(15, 23, 42, 0.06));
151
+ background-image: none;
152
+ border: var(--formie-border-width) solid var(--formie-color-border);
153
+ border-radius: var(--formie-radius-sm);
154
+ box-shadow: none;
155
+ color: var(--formie-color-text);
156
+ text-shadow: none;
157
+ line-height: calc(var(--formie-control-height) - var(--formie-space-3));
158
+ }
159
+
160
+ .formie-field .ts-wrapper.formie-combobox.multi .ts-control > .item.active,
161
+ .formie-field .ts-wrapper.formie-combobox.multi .ts-control [data-value].active {
162
+ background: var(--formie-color-surface-muted, rgba(15, 23, 42, 0.06));
163
+ color: var(--formie-color-text);
164
+ }
165
+
166
+ .formie-field .ts-wrapper.formie-combobox.plugin-remove_button .item {
167
+ display: inline-flex;
168
+ align-items: center;
169
+ gap: var(--formie-space-1);
170
+ }
171
+
172
+ .formie-field .ts-wrapper.formie-combobox.plugin-remove_button:not(.rtl) .item {
173
+ padding-right: var(--formie-space-2) !important;
174
+ }
175
+
176
+ .formie-field .ts-wrapper.formie-combobox.plugin-remove_button .item .remove {
177
+ display: inline-flex;
178
+ align-items: center;
179
+ justify-content: center;
180
+ margin: 0;
181
+ padding: 0;
182
+ border: 0;
183
+ background: none;
184
+ box-shadow: none;
185
+ text-decoration: none;
186
+ color: var(--formie-color-text-muted);
187
+ font-size: 1.125em;
188
+ line-height: 1;
189
+ cursor: pointer;
190
+ }
191
+
192
+ .formie-field .ts-wrapper.formie-combobox.plugin-remove_button .item .remove:hover,
193
+ .formie-field .ts-wrapper.formie-combobox.plugin-remove_button .item .remove:focus {
194
+ background: none;
195
+ text-decoration: none;
196
+ color: var(--formie-color-text);
197
+ }
198
+
199
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown {
200
+ position: absolute;
201
+ top: 100%;
202
+ left: 0;
203
+ width: 100%;
204
+ z-index: var(--formie-z-popover, 30);
205
+ border: var(--formie-border-width) solid var(--formie-color-border);
206
+ border-radius: var(--formie-radius-sm);
207
+ background: var(--formie-color-surface);
208
+ box-shadow: var(--formie-shadow-popover, 0 8px 24px rgba(15, 23, 42, 0.12));
209
+ margin-top: var(--formie-space-1);
210
+ box-sizing: border-box;
211
+ }
212
+
213
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown-content {
214
+ overflow: hidden auto;
215
+ max-height: 200px;
216
+ scroll-behavior: smooth;
217
+ }
218
+
219
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown .option,
220
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown .optgroup-header,
221
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown .no-results {
222
+ color: var(--formie-color-text);
223
+ padding: var(--formie-space-2) var(--formie-control-padding-x);
224
+ }
225
+
226
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown [data-selectable] {
227
+ cursor: pointer;
228
+ }
229
+
230
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown .option.active,
231
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown .option:hover,
232
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown .active {
233
+ background: var(--formie-color-surface-muted, rgba(15, 23, 42, 0.05));
234
+ color: var(--formie-color-text);
235
+ }
236
+
237
+ .formie-field .ts-wrapper.formie-combobox .ts-dropdown .highlight {
238
+ background: rgba(59, 130, 246, 0.18);
239
+ border-radius: 2px;
240
+ }
241
+
242
+ .formie-field .ts-wrapper.formie-combobox.disabled .ts-control {
243
+ opacity: 0.6;
244
+ background-color: var(--formie-color-surface-muted, rgba(15, 23, 42, 0.04));
245
+ cursor: not-allowed;
246
+ }
@@ -34,4 +34,17 @@
34
34
  border-color: var(--formie-color-danger);
35
35
  box-shadow: var(--formie-shadow-danger-focus);
36
36
  }
37
+
38
+ /* Tom Select copies native select classes onto its wrapper; keep combobox chrome on .ts-control only. */
39
+ .formie-field .ts-wrapper.formie-combobox,
40
+ .formie-field .ts-wrapper.formie-combobox.formie-select,
41
+ .formie-field .ts-wrapper.formie-combobox.formie-dropdown-input {
42
+ border: 0;
43
+ padding: 0;
44
+ min-height: 0;
45
+ background: none;
46
+ background-image: none;
47
+ box-shadow: none;
48
+ appearance: none;
49
+ }
37
50
  }
@@ -36,4 +36,23 @@
36
36
  font-size: 0;
37
37
  line-height: 0;
38
38
  }
39
+
40
+ [data-formie-field-type="signature"] .formie-signature-pad {
41
+ position: relative;
42
+ }
43
+
44
+ [data-formie-field-type="signature"] .formie-signature-message {
45
+ margin: 0;
46
+ padding: var(--formie-space-3);
47
+ border: var(--formie-signature-border);
48
+ border-radius: var(--formie-signature-border-radius);
49
+ background: var(--formie-signature-background);
50
+ color: var(--formie-color-text-muted);
51
+ font-size: var(--formie-font-size-sm);
52
+ line-height: var(--formie-line-height-base);
53
+ }
54
+
55
+ [data-formie-field-type="signature"].formie-signature-has-message .formie-signature-canvas {
56
+ display: none;
57
+ }
39
58
  }
@@ -0,0 +1,279 @@
1
+ @layer formie-theme {
2
+ .formie-upload-manager {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--formie-gap-field);
6
+ }
7
+
8
+ .formie-upload-manager-dropzone {
9
+ display: flex;
10
+ flex-direction: column;
11
+ align-items: center;
12
+ justify-content: center;
13
+ gap: var(--formie-space-2);
14
+ padding: var(--formie-space-4);
15
+ min-height: calc(var(--formie-control-height) * 3);
16
+ border: var(--formie-border-width) dashed var(--formie-color-border);
17
+ border-radius: var(--formie-radius-sm);
18
+ background: var(--formie-color-surface-subtle);
19
+ color: var(--formie-color-text);
20
+ text-align: center;
21
+ cursor: pointer;
22
+ transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;
23
+ }
24
+
25
+ .formie-upload-manager-dropzone:hover,
26
+ .formie-upload-manager-dropzone.formie-upload-manager-dropzone-active {
27
+ border-color: var(--formie-color-focus-ring);
28
+ background: var(--formie-color-surface-muted);
29
+ }
30
+
31
+ .formie-upload-manager-dropzone:focus {
32
+ outline: 0;
33
+ }
34
+
35
+ .formie-upload-manager-dropzone:focus-visible {
36
+ box-shadow: 0 0 0 var(--formie-focus-ring-width) var(--formie-color-focus-ring);
37
+ }
38
+
39
+ .formie-field-has-error .formie-upload-manager-dropzone {
40
+ border-color: var(--formie-color-danger);
41
+ }
42
+
43
+ .formie-upload-manager-prompt {
44
+ margin: 0;
45
+ font-size: var(--formie-font-size-sm);
46
+ color: var(--formie-color-text-muted);
47
+ }
48
+
49
+ .formie-upload-manager-list {
50
+ display: flex;
51
+ flex-direction: column;
52
+ gap: var(--formie-space-2);
53
+ margin: 0;
54
+ padding: 0;
55
+ list-style: none;
56
+ }
57
+
58
+ .formie-upload-manager-item {
59
+ display: grid;
60
+ grid-template-columns: minmax(0, 1fr) minmax(6.5rem, 8rem) auto;
61
+ align-items: center;
62
+ gap: var(--formie-space-2);
63
+ padding: var(--formie-space-2) var(--formie-space-3);
64
+ border: var(--formie-border-width) solid var(--formie-color-border);
65
+ border-radius: var(--formie-radius-sm);
66
+ background: var(--formie-color-surface);
67
+ }
68
+
69
+ .formie-upload-manager-item.is-error {
70
+ border-color: var(--formie-color-danger);
71
+ }
72
+
73
+ .formie-upload-manager-item.is-complete .formie-upload-manager-progress {
74
+ opacity: 0;
75
+ visibility: hidden;
76
+ pointer-events: none;
77
+ }
78
+
79
+ .formie-upload-manager-filename {
80
+ overflow: hidden;
81
+ text-overflow: ellipsis;
82
+ white-space: nowrap;
83
+ font-size: var(--formie-font-size-sm);
84
+ }
85
+
86
+ .formie-upload-manager-progress {
87
+ display: flex;
88
+ flex-direction: column;
89
+ justify-content: center;
90
+ gap: var(--formie-space-1);
91
+ min-height: var(--formie-button-icon-button-size);
92
+ align-self: center;
93
+ opacity: 1;
94
+ visibility: visible;
95
+ transition: opacity 200ms ease, visibility 200ms ease;
96
+ }
97
+
98
+ .formie-upload-manager-progress-track {
99
+ position: relative;
100
+ height: 0.375rem;
101
+ border-radius: var(--formie-radius-full);
102
+ background: var(--formie-color-surface-muted);
103
+ overflow: hidden;
104
+ }
105
+
106
+ .formie-upload-manager-progress-bar {
107
+ height: 100%;
108
+ width: 0;
109
+ border-radius: inherit;
110
+ background: var(--formie-color-primary);
111
+ transition: width 180ms ease-out, background-color 200ms ease;
112
+ }
113
+
114
+ .formie-upload-manager-item.is-upload-complete .formie-upload-manager-progress-bar {
115
+ width: 100% !important;
116
+ background: var(--formie-color-success, var(--formie-color-primary));
117
+ }
118
+
119
+ .formie-upload-manager-item.is-uploading:not(.is-upload-complete) .formie-upload-manager-progress-track[data-indeterminate="true"] .formie-upload-manager-progress-bar,
120
+ .formie-upload-manager-item.is-preparing .formie-upload-manager-progress-bar,
121
+ .formie-upload-manager-item.is-processing .formie-upload-manager-progress-bar {
122
+ width: 35%;
123
+ animation: formie-upload-manager-progress-indeterminate 1.1s ease-in-out infinite;
124
+ }
125
+
126
+ .formie-upload-manager-item.is-processing .formie-upload-manager-progress-bar {
127
+ opacity: 0.85;
128
+ }
129
+
130
+ .formie-upload-manager-item.is-processing .formie-upload-manager-progress-label {
131
+ color: var(--formie-color-text);
132
+ }
133
+
134
+ @keyframes formie-upload-manager-progress-indeterminate {
135
+ 0% {
136
+ transform: translateX(-120%);
137
+ }
138
+
139
+ 100% {
140
+ transform: translateX(320%);
141
+ }
142
+ }
143
+
144
+ .formie-upload-manager-progress-label {
145
+ font-size: var(--formie-font-size-xs);
146
+ line-height: 1.2;
147
+ color: var(--formie-color-text-muted);
148
+ text-align: center;
149
+ white-space: nowrap;
150
+ }
151
+
152
+ .formie-upload-manager-item.is-upload-complete .formie-upload-manager-progress-label {
153
+ color: var(--formie-color-success, var(--formie-color-primary));
154
+ font-weight: var(--formie-font-weight-medium);
155
+ }
156
+
157
+ .formie-upload-manager-error {
158
+ grid-column: 1 / -1;
159
+ font-size: var(--formie-font-size-xs);
160
+ color: var(--formie-color-danger);
161
+ }
162
+
163
+ .formie-upload-manager-browse-button {
164
+ margin-top: var(--formie-space-1);
165
+ }
166
+
167
+ .formie-upload-manager-actions {
168
+ display: flex;
169
+ align-items: center;
170
+ gap: var(--formie-space-2);
171
+ align-self: center;
172
+ flex-shrink: 0;
173
+ }
174
+
175
+ .formie-upload-manager-sort-controls {
176
+ display: inline-flex;
177
+ flex-direction: row;
178
+ align-items: center;
179
+ gap: 0.0625rem;
180
+ padding: 0;
181
+ border-radius: var(--formie-radius-sm);
182
+ background: transparent;
183
+ }
184
+
185
+ .formie-upload-manager-sort-controls[hidden] {
186
+ display: none;
187
+ }
188
+
189
+ .formie-upload-manager-sort-button,
190
+ .formie-upload-manager-action-button {
191
+ position: relative;
192
+ display: inline-flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ width: 1.375rem;
196
+ height: 1.375rem;
197
+ padding: 0;
198
+ border: 0;
199
+ border-radius: var(--formie-radius-sm);
200
+ background: transparent;
201
+ color: var(--formie-color-text-muted);
202
+ cursor: pointer;
203
+ font-size: 0;
204
+ line-height: 0;
205
+ text-indent: -9999px;
206
+ overflow: hidden;
207
+ white-space: nowrap;
208
+ transition: background-color 150ms ease, color 150ms ease, opacity 150ms ease;
209
+ }
210
+
211
+ .formie-upload-manager-sort-button {
212
+ width: 1.375rem;
213
+ height: 1.375rem;
214
+ }
215
+
216
+ .formie-upload-manager-sort-button:hover:not(:disabled),
217
+ .formie-upload-manager-action-button:hover {
218
+ background: var(--formie-color-surface-muted);
219
+ color: var(--formie-color-text);
220
+ }
221
+
222
+ .formie-upload-manager-sort-button:focus-visible,
223
+ .formie-upload-manager-action-button:focus-visible {
224
+ outline: 0;
225
+ box-shadow: 0 0 0 var(--formie-focus-ring-width) var(--formie-color-focus-ring);
226
+ }
227
+
228
+ .formie-upload-manager-sort-button:disabled {
229
+ opacity: 0.28;
230
+ cursor: not-allowed;
231
+ }
232
+
233
+ .formie-upload-manager-sort-button::after,
234
+ .formie-upload-manager-action-button::after {
235
+ position: absolute;
236
+ top: 50%;
237
+ left: 50%;
238
+ display: block;
239
+ content: '';
240
+ transform: translate(-50%, -50%);
241
+ background-color: currentColor;
242
+ -webkit-mask-repeat: no-repeat;
243
+ mask-repeat: no-repeat;
244
+ -webkit-mask-position: center;
245
+ mask-position: center;
246
+ -webkit-mask-size: contain;
247
+ mask-size: contain;
248
+ }
249
+
250
+ .formie-upload-manager-sort-button[data-formie-icon="arrow-up"] {
251
+ --formie-upload-manager-icon-mask: var(--formie-icon-mask-arrow-up);
252
+ }
253
+
254
+ .formie-upload-manager-sort-button[data-formie-icon="arrow-down"] {
255
+ --formie-upload-manager-icon-mask: var(--formie-icon-mask-arrow-down);
256
+ }
257
+
258
+ .formie-upload-manager-action-button[data-formie-icon="close"] {
259
+ --formie-upload-manager-icon-mask: var(--formie-icon-mask-close);
260
+ }
261
+
262
+ .formie-upload-manager-sort-button::after {
263
+ width: 0.75rem;
264
+ height: 0.75rem;
265
+ -webkit-mask-image: var(--formie-upload-manager-icon-mask);
266
+ mask-image: var(--formie-upload-manager-icon-mask);
267
+ }
268
+
269
+ .formie-upload-manager-action-button::after {
270
+ width: 0.825rem;
271
+ height: 0.825rem;
272
+ -webkit-mask-image: var(--formie-upload-manager-icon-mask);
273
+ mask-image: var(--formie-upload-manager-icon-mask);
274
+ }
275
+
276
+ .formie-upload-manager-remove-button {
277
+ flex-shrink: 0;
278
+ }
279
+ }
@@ -13,6 +13,11 @@ import type { ThemeClassMap } from '#contracts/theme';
13
13
  import { dispatchFormieDomEvent } from '#core/dom-events';
14
14
  import { dispatchPageClientEventForSubmit } from '#core/page-client-event';
15
15
  import { syncPageTabErrors } from '#core/page-tab-errors';
16
+ import {
17
+ enhanceServerRenderedFieldErrors,
18
+ focusFirstValidationError,
19
+ hasServerRenderedValidationErrors,
20
+ } from '#core/validation-focus';
16
21
  import { clearSubmitFeedback, executeAjaxSubmitFlow, shouldKeepSubmitLoading } from '#core/submit-flow';
17
22
  import { applySubmitResultUi } from '#core/submit-result-ui';
18
23
  import { applyPageState, clearSubmitLoading, setSubmitLoading } from '#core/submit-result-state';
@@ -24,6 +29,7 @@ import { runSubmitPipeline } from '#submit/pipeline';
24
29
  import { clearSubmissionOnUnload, requestGraphqlRender, requestRefreshTokens, requestRender, requestSetPage } from '#transport/forms-api';
25
30
  import { createDebug } from '#utils/debug';
26
31
  import { createFormUnloadWarningGuard } from '#utils/unload-warning';
32
+ import { getValidationScope } from '#validation/scope';
27
33
  import { FormieValidator } from '#validation/validator';
28
34
  import { bindSubmitReadiness } from '#validation/submit-readiness';
29
35
 
@@ -745,6 +751,22 @@ function bindFormEvents(
745
751
  allowNativeSubmit = false;
746
752
  clearInternalNavigation(form);
747
753
  clearSubmitLoading(form);
754
+
755
+ if (validator && shouldValidateOnSubmit(form)) {
756
+ const { scope, final } = getValidationScope(form);
757
+ const validationErrors = validator.submit(final ? form : scope, { final });
758
+
759
+ if (validationErrors.length > 0) {
760
+ applySubmitResultUi(form, {
761
+ ok: false,
762
+ stage: 'validate',
763
+ code: 'VALIDATION_FAILED',
764
+ message: validator.config.errorMessage || 'Validation failed.',
765
+ fieldErrors: validator.getFieldErrors(validationErrors),
766
+ formErrors: [validator.config.errorMessage || 'Validation failed.'],
767
+ });
768
+ }
769
+ }
748
770
  };
749
771
 
750
772
  if (typeof form.requestSubmit === 'function') {
@@ -996,6 +1018,11 @@ export function createFormieClient(): FormieClient {
996
1018
  normalizeHeadlessManagedUrls(target, form, normalizedOptions);
997
1019
  }
998
1020
 
1021
+ if (normalizedOptions.mode === 'server-rendered' && hasServerRenderedValidationErrors(form)) {
1022
+ enhanceServerRenderedFieldErrors(form);
1023
+ focusFirstValidationError(form);
1024
+ }
1025
+
999
1026
  syncPageTabErrors(form);
1000
1027
  }
1001
1028
 
@@ -1,6 +1,7 @@
1
1
  import type { FormSubmitResult } from '#contracts/schema';
2
2
  import { ensureFieldErrorContainer as resolveFieldErrorContainer } from '#core/field-error-container';
3
3
  import { syncPageTabErrors } from '#core/page-tab-errors';
4
+ import { focusFirstValidationError } from '#core/validation-focus';
4
5
  import { setFormHiddenState } from '#core/submit-result-state';
5
6
  import { addThemeClasses, removeThemeClasses } from '#theme/theme-classes';
6
7
 
@@ -433,10 +434,9 @@ export function applySubmitResultUi(form: HTMLFormElement, result: FormSubmitRes
433
434
 
434
435
  if (result.formErrors?.length) {
435
436
  renderFormErrors(form, result.formErrors);
436
- return;
437
- }
438
-
439
- if (!result.fieldErrors && result.message) {
437
+ } else if (!result.fieldErrors && result.message) {
440
438
  renderFormErrors(form, [result.message]);
441
439
  }
440
+
441
+ focusFirstValidationError(form);
442
442
  }