@bikdotai/bik-widgets 1.0.0

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 (206) hide show
  1. package/.eslintrc +22 -0
  2. package/.eslintrc.js +19 -0
  3. package/.github/workflows/main.yml +293 -0
  4. package/.prettierignore +13 -0
  5. package/.prettierrc +10 -0
  6. package/README.md +128 -0
  7. package/cypress/apiHelper/endpoints.ts +21 -0
  8. package/cypress/apiHelper/executor.ts +42 -0
  9. package/cypress/e2e/bottomDrawer.cy.ts +49 -0
  10. package/cypress/e2e/directReward.cy.ts +67 -0
  11. package/cypress/e2e/scratchTheCard.cy.ts +68 -0
  12. package/cypress/e2e/stw.cy.ts +82 -0
  13. package/cypress/e2e/waRedirection.cy.ts +46 -0
  14. package/cypress/fixtures/payloads.ts +330 -0
  15. package/cypress/support/commands.ts +37 -0
  16. package/cypress/support/e2e.ts +20 -0
  17. package/cypress.staging.config.ts +23 -0
  18. package/jsconfig.json +6 -0
  19. package/localtest.sh +10 -0
  20. package/log-server.js +86 -0
  21. package/package.json +79 -0
  22. package/postcss.config.js +8 -0
  23. package/src/Globals.d.ts +2 -0
  24. package/src/assets/lottie/santa.json +11722 -0
  25. package/src/assets/svg/CalendarClockIcon.tsx +30 -0
  26. package/src/assets/svg/CalendarIcon.tsx +24 -0
  27. package/src/assets/svg/CheckIcon.tsx +17 -0
  28. package/src/assets/svg/ChevronIcon.tsx +21 -0
  29. package/src/assets/svg/Close.tsx +39 -0
  30. package/src/assets/svg/Confetti.tsx +140 -0
  31. package/src/assets/svg/Copy.tsx +26 -0
  32. package/src/assets/svg/DropdownCheckIcon.tsx +35 -0
  33. package/src/assets/svg/ErrorIcon.tsx +27 -0
  34. package/src/assets/svg/RadioIcon.tsx +25 -0
  35. package/src/assets/svg/UncheckedCheckboxIcon.tsx +28 -0
  36. package/src/assets/svg/UncheckedRadioIcon.tsx +26 -0
  37. package/src/assets/svg/info.tsx +30 -0
  38. package/src/assets/svg/qrcode.svg +14 -0
  39. package/src/bootstrap.tsx +8 -0
  40. package/src/components/CtaCard/index.tsx +37 -0
  41. package/src/components/CtaCard/preview.module.css +32 -0
  42. package/src/components/CtaCard/style.module.css +32 -0
  43. package/src/components/EmailInput/emailInputBox.tsx +95 -0
  44. package/src/components/Fab/index.tsx +224 -0
  45. package/src/components/Fab/preview.module.css +28 -0
  46. package/src/components/Fab/style.module.css +37 -0
  47. package/src/components/Icons/Call.tsx +26 -0
  48. package/src/components/Icons/Cross.tsx +24 -0
  49. package/src/components/Icons/Gmail.tsx +61 -0
  50. package/src/components/Icons/Instagram.tsx +60 -0
  51. package/src/components/Icons/LiveChat.tsx +43 -0
  52. package/src/components/Icons/Messenger.tsx +57 -0
  53. package/src/components/Icons/Send.tsx +22 -0
  54. package/src/components/Icons/Whatsapp.tsx +24 -0
  55. package/src/components/Shimmer/index.tsx +12 -0
  56. package/src/components/Shimmer/style.module.css +37 -0
  57. package/src/components/SmsInput/smsInputBox.tsx +135 -0
  58. package/src/components/UserDetailsV2/userDetailsV2.desktop.module.css +52 -0
  59. package/src/components/UserDetailsV2/userDetailsV2.mobile.module.css +52 -0
  60. package/src/components/UserDetailsV2/userDetailsV2.module.css +81 -0
  61. package/src/components/UserDetailsV2/userDetailsV2.tsx +527 -0
  62. package/src/components/WhatsappInput/Spinner.tsx +26 -0
  63. package/src/components/WhatsappInput/whatsappInput.module.css +106 -0
  64. package/src/components/WhatsappInput/whatsappInputBox.tsx +155 -0
  65. package/src/components/WhatsappInput/whatsappInputPreviewDesktop.module.css +71 -0
  66. package/src/components/WhatsappInput/whatsappInputPreviewMobile.module.css +65 -0
  67. package/src/components/checkbox/checkbox.module.css +19 -0
  68. package/src/components/checkbox/checkbox.tsx +88 -0
  69. package/src/components/countryCodePicker/countriesDropdown.module.css +77 -0
  70. package/src/components/countryCodePicker/countriesDropdown.tsx +81 -0
  71. package/src/components/couponDetails/coupon.module.css +208 -0
  72. package/src/components/couponDetails/coupon.tsx +210 -0
  73. package/src/components/couponDetails/couponPreviewDesktop.module.css +158 -0
  74. package/src/components/couponDetails/couponPreviewMobile.module.css +164 -0
  75. package/src/components/index.ts +3 -0
  76. package/src/components/inputComponents/Checkbox.module.css +197 -0
  77. package/src/components/inputComponents/Checkbox.tsx +85 -0
  78. package/src/components/inputComponents/DatePicker.module.css +565 -0
  79. package/src/components/inputComponents/DatePicker.tsx +278 -0
  80. package/src/components/inputComponents/Dropdown.module.css +796 -0
  81. package/src/components/inputComponents/Dropdown.tsx +630 -0
  82. package/src/components/inputComponents/InputBox.module.css +401 -0
  83. package/src/components/inputComponents/InputBox.tsx +209 -0
  84. package/src/components/selectedCountry/selectedCountry.module.css +76 -0
  85. package/src/components/selectedCountry/selectedCountry.tsx +76 -0
  86. package/src/components/selectedCountry/selectedCountryPreviewDesktop.module.css +56 -0
  87. package/src/components/selectedCountry/selectedCountryPreviewMobile.module.css +57 -0
  88. package/src/components/userDetailsForm/RenderCustomFields.tsx +333 -0
  89. package/src/components/userDetailsForm/userDetailsForm.tsx +675 -0
  90. package/src/hooks/index.ts +4 -0
  91. package/src/hooks/useExitIntent.ts +452 -0
  92. package/src/hooks/useIsMobile.tsx +21 -0
  93. package/src/hooks/useMessageEvent.ts +8 -0
  94. package/src/hooks/useTriggeredIntentDetails.ts +43 -0
  95. package/src/hooks/useUrlListerner.ts +30 -0
  96. package/src/hooks/useWebSocketLogger.ts +59 -0
  97. package/src/hooks/useWindowEvent.ts +8 -0
  98. package/src/icons/copyIcon.tsx +26 -0
  99. package/src/icons/crossIconDesktop.tsx +20 -0
  100. package/src/icons/crossIconMobile.tsx +20 -0
  101. package/src/index.html +30 -0
  102. package/src/index.ts +32 -0
  103. package/src/index.tsx +1 -0
  104. package/src/repo/widgetRepo.ts +21 -0
  105. package/src/types/customFields.ts +73 -0
  106. package/src/utilities/cookie.ts +70 -0
  107. package/src/utilities/customFieldTypeMapping.ts +67 -0
  108. package/src/utilities/customFieldValidation.ts +201 -0
  109. package/src/utilities/encryption.ts +21 -0
  110. package/src/utilities/exitIntentUtils.ts +31 -0
  111. package/src/utilities/global.css +11 -0
  112. package/src/utilities/languageUtilities.ts +235 -0
  113. package/src/utilities/localRunner.js +26 -0
  114. package/src/utilities/localRunner.ts +27 -0
  115. package/src/utilities/localStorage.ts +40 -0
  116. package/src/utilities/script.tsx +15 -0
  117. package/src/utilities/stringUtils.ts +5 -0
  118. package/src/utilities/styleUtils.ts +134 -0
  119. package/src/utilities/variables.ts +11 -0
  120. package/src/utilities/widgetUtils.js +342 -0
  121. package/src/utilities/widgetUtils.ts +313 -0
  122. package/src/widgets/BottomDrawer/config.ts +41 -0
  123. package/src/widgets/BottomDrawer/index.tsx +116 -0
  124. package/src/widgets/BottomDrawer/modal.tsx +286 -0
  125. package/src/widgets/BottomDrawer/preview.module.css +122 -0
  126. package/src/widgets/BottomDrawer/previewMobile.module.css +124 -0
  127. package/src/widgets/BottomDrawer/style.module.css +279 -0
  128. package/src/widgets/CaptivateBanner/captivateBanner.tsx +200 -0
  129. package/src/widgets/CaptivateBanner/config.ts +72 -0
  130. package/src/widgets/CaptivateBanner/index.tsx +204 -0
  131. package/src/widgets/CaptivateBanner/previewDesktop.module.css +51 -0
  132. package/src/widgets/CaptivateBanner/previewMobile.module.css +51 -0
  133. package/src/widgets/CaptivateBanner/style.module.css +77 -0
  134. package/src/widgets/CaptivateBanner/utils.ts +104 -0
  135. package/src/widgets/CentrallyAlignedPopup/config.ts +42 -0
  136. package/src/widgets/CentrallyAlignedPopup/index.tsx +109 -0
  137. package/src/widgets/CentrallyAlignedPopup/modal.tsx +269 -0
  138. package/src/widgets/CentrallyAlignedPopup/preview.module.css +153 -0
  139. package/src/widgets/CentrallyAlignedPopup/previewMobile.module.css +153 -0
  140. package/src/widgets/CentrallyAlignedPopup/style.module.css +283 -0
  141. package/src/widgets/DirectReward/components/couponDetails.tsx +265 -0
  142. package/src/widgets/DirectReward/components/userDetails.tsx +117 -0
  143. package/src/widgets/DirectReward/config.ts +186 -0
  144. package/src/widgets/DirectReward/directReward.tsx +350 -0
  145. package/src/widgets/DirectReward/index.tsx +579 -0
  146. package/src/widgets/DirectReward/previewStyles/thankYouPreviewDesktop.module.css +276 -0
  147. package/src/widgets/DirectReward/previewStyles/thankYouPreviewMobile.module.css +303 -0
  148. package/src/widgets/DirectReward/previewStyles/userDetailsPreviewDesktop.module.css +511 -0
  149. package/src/widgets/DirectReward/previewStyles/userDetailsPreviewMobile.module.css +462 -0
  150. package/src/widgets/DirectReward/style.module.css +836 -0
  151. package/src/widgets/ExitIntentHook.tsx +28 -0
  152. package/src/widgets/STW/api.ts +70 -0
  153. package/src/widgets/STW/components/svgFactory.tsx +44 -0
  154. package/src/widgets/STW/config.ts +193 -0
  155. package/src/widgets/STW/context.ts +7 -0
  156. package/src/widgets/STW/couponDetails.tsx +121 -0
  157. package/src/widgets/STW/index.tsx +733 -0
  158. package/src/widgets/STW/previewStyles/thankyouPreviewDesktop.module.css +215 -0
  159. package/src/widgets/STW/previewStyles/thankyouPreviewMobile.module.css +205 -0
  160. package/src/widgets/STW/previewStyles/userInputsPreviewDesktop.module.css +732 -0
  161. package/src/widgets/STW/previewStyles/userInputsPreviewMobile.module.css +661 -0
  162. package/src/widgets/STW/previewStyles/wheelPreviewDesktop.module.css +498 -0
  163. package/src/widgets/STW/previewStyles/wheelPreviewMobile.module.css +497 -0
  164. package/src/widgets/STW/stw1.tsx +119 -0
  165. package/src/widgets/STW/stw2Components/wheelDesign.tsx +183 -0
  166. package/src/widgets/STW/stw2Pages/couponDetails.tsx +72 -0
  167. package/src/widgets/STW/stw2Pages/stw2.tsx +212 -0
  168. package/src/widgets/STW/stw2Pages/style.module.css +1226 -0
  169. package/src/widgets/STW/stw2Pages/userDetails.tsx +86 -0
  170. package/src/widgets/STW/stw2Pages/wheel.tsx +117 -0
  171. package/src/widgets/STW/stw2PreviewStyles/thankyouPreviewDesktop.module.css +835 -0
  172. package/src/widgets/STW/stw2PreviewStyles/thankyouPreviewMobile.module.css +787 -0
  173. package/src/widgets/STW/stw2PreviewStyles/userInputsPreviewDesktop.module.css +867 -0
  174. package/src/widgets/STW/stw2PreviewStyles/userInputsPreviewMobile.module.css +798 -0
  175. package/src/widgets/STW/stw2PreviewStyles/wheelPreviewDesktop.module.css +572 -0
  176. package/src/widgets/STW/stw2PreviewStyles/wheelPreviewMobile.module.css +559 -0
  177. package/src/widgets/STW/style.module.css +901 -0
  178. package/src/widgets/STW/userDetails.tsx +150 -0
  179. package/src/widgets/STW/utility.ts +664 -0
  180. package/src/widgets/STW/wheel.tsx +304 -0
  181. package/src/widgets/ScratchCard/ScratchOff/scratchOff.tsx +157 -0
  182. package/src/widgets/ScratchCard/config.ts +152 -0
  183. package/src/widgets/ScratchCard/globalStyle.module.css +931 -0
  184. package/src/widgets/ScratchCard/index.tsx +546 -0
  185. package/src/widgets/ScratchCard/modal.tsx +225 -0
  186. package/src/widgets/ScratchCard/preview.module.css +250 -0
  187. package/src/widgets/ScratchCard/previewMobile.module.css +247 -0
  188. package/src/widgets/ScratchCard/previewStyles/userDetailsPreviewDesktop.module.css +537 -0
  189. package/src/widgets/ScratchCard/previewStyles/userDetailsPreviewMobile.module.css +463 -0
  190. package/src/widgets/ScratchCard/style.module.css +220 -0
  191. package/src/widgets/ShopifyForm/config.ts +168 -0
  192. package/src/widgets/ShopifyForm/index.tsx +214 -0
  193. package/src/widgets/ShopifyForm/previewDesktop.module.css +117 -0
  194. package/src/widgets/ShopifyForm/previewMobile.module.css +131 -0
  195. package/src/widgets/ShopifyForm/shopifyForm.tsx +445 -0
  196. package/src/widgets/ShopifyForm/style.module.css +161 -0
  197. package/src/widgets/SingleButtonRedirection/config.ts +47 -0
  198. package/src/widgets/SingleButtonRedirection/index.tsx +121 -0
  199. package/src/widgets/WebStories/config.ts +105 -0
  200. package/src/widgets/WebStories/index.css +3 -0
  201. package/src/widgets/WebStories/index.tsx +282 -0
  202. package/src/widgets/WebStories/style.module.css +26 -0
  203. package/src/widgets/index.tsx +3 -0
  204. package/src/widgets/utility.ts +31 -0
  205. package/tsconfig.json +12 -0
  206. package/webpack.config.js +239 -0
@@ -0,0 +1,565 @@
1
+ /* Variables */
2
+
3
+ .bik-datePicker__container {
4
+ /* Color and style variables */
5
+ --bik-datePicker-border-color: #e0e0e0; /* Default border color */
6
+ --bik-datePicker-focus-color: #3b82f6; /* Border color on focus */
7
+ --bik-datePicker-error-color: #ef4444; /* Error state color */
8
+ --bik-datePicker-text-color: #1f2937; /* Main text color */
9
+ --bik-datePicker-text-light: #6b7280; /* Light text color (labels, icons) */
10
+ --bik-datePicker-text-muted: #9ca3af; /* Muted/disabled text color */
11
+ --bik-datePicker-background: rgba(255, 255, 255, 0.3); /* Input background */
12
+ --bik-datePicker-border-radius: 8px; /* Border radius for rounded corners */
13
+ --bik-datePicker-transition: 0.2s ease; /* Transition for interactive states */
14
+
15
+ /* Icon and label sizing */
16
+ --bik-datePicker-icon-size: 20px;
17
+ --bik-datePicker-icon-offset: 16px;
18
+ --bik-datePicker-label-offset: 8px;
19
+
20
+ /* Heights and paddings for desktop, mobile, and preview modes */
21
+ --bik-datePicker-height-desktop: 56px;
22
+ --bik-datePicker-height-mobile: 48px;
23
+ --bik-datePicker-height-preview: 20px;
24
+ --bik-datePicker-padding-desktop: 16px 4px 2px 19px;
25
+ --bik-datePicker-padding-mobile: 16px 4px 4px 14px;
26
+ --bik-datePicker-padding-preview: 2px 2px 2px 4px;
27
+ --bik-datePicker-label-padding-desktop: 20px;
28
+ --bik-datePicker-label-padding-mobile: 18px;
29
+ --bik-datePicker-label-padding-preview: 12px;
30
+
31
+ /* Preview mode font/icon sizes */
32
+ --bik-datePicker-preview-input-font: 8px;
33
+ --bik-datePicker-preview-label-font: 7px;
34
+ --bik-datePicker-preview-label-font-floated: 6px;
35
+ --bik-datePicker-preview-icon-size: 10px;
36
+ --bik-datePicker-preview-icon-svg: 8px;
37
+ --bik-datePicker-preview-error-font: 6px;
38
+ --bik-datePicker-preview-error-icon: 8px;
39
+ --bik-datePicker-preview-input-font-mobile: 7px;
40
+ --bik-datePicker-preview-label-font-mobile: 6px;
41
+ --bik-datePicker-preview-label-font-floated-mobile: 5px;
42
+ --bik-datePicker-preview-icon-size-mobile: 8px;
43
+ --bik-datePicker-preview-icon-svg-mobile: 6px;
44
+ --bik-datePicker-preview-error-font-mobile: 5px;
45
+ --bik-datePicker-preview-error-icon-mobile: 6px;
46
+
47
+ /* Container layout */
48
+ position: relative;
49
+ width: 100%;
50
+ margin: 8px 0;
51
+ }
52
+
53
+ /* Input Wrapper */
54
+ .bik-datePicker__inputWrapper {
55
+ position: relative;
56
+ display: flex;
57
+ align-items: center;
58
+ background: var(--bik-datePicker-background);
59
+ border: 1px solid var(--bik-datePicker-border-color);
60
+ border-radius: var(--bik-datePicker-border-radius);
61
+ transition: all var(--bik-datePicker-transition);
62
+ overflow: hidden;
63
+ height: var(--bik-datePicker-height-desktop);
64
+ }
65
+
66
+ /* Subtle gradient overlay for visual depth */
67
+ .bik-datePicker__inputWrapper::before {
68
+ content: '';
69
+ position: absolute;
70
+ inset: 0;
71
+ background: linear-gradient(135deg, transparent, rgba(255, 255, 255, 0.1));
72
+ border-radius: inherit;
73
+ pointer-events: none;
74
+ }
75
+
76
+ /* Hover state for input wrapper */
77
+ .bik-datePicker__inputWrapper:hover:not([data-disabled]) {
78
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
79
+ }
80
+
81
+ /* Focused state for input wrapper */
82
+ .bik-datePicker__inputWrapper[data-focused] {
83
+ border-color: var(--bik-datePicker-focus-color);
84
+ box-shadow: 0 2px 8px rgba(59, 130, 246, 0.2);
85
+ }
86
+
87
+ /* Error state for input wrapper */
88
+ .bik-datePicker__inputWrapper[data-error] {
89
+ border-color: var(--bik-datePicker-error-color);
90
+ }
91
+
92
+ /* Disabled state for input wrapper */
93
+ .bik-datePicker__inputWrapper[data-disabled] {
94
+ opacity: 0.6;
95
+ cursor: not-allowed;
96
+ }
97
+
98
+ /* Input Field */
99
+ .bik-datePicker__input {
100
+ padding: var(--bik-datePicker-padding-desktop) !important;
101
+ border: none;
102
+ background: transparent !important;
103
+ font-weight: 400 !important;
104
+ font-size: 14px !important;
105
+ color: var(--bik-datePicker-text-color) !important;
106
+ width: 100%;
107
+ outline: none;
108
+ appearance: none;
109
+ transition: color 0.15s ease;
110
+ cursor: pointer;
111
+ box-shadow: none !important;
112
+ }
113
+
114
+ /* Disabled input field */
115
+ .bik-datePicker__input:disabled {
116
+ color: var(--bik-datePicker-text-muted);
117
+ cursor: not-allowed;
118
+ }
119
+
120
+ /* Placeholder text style */
121
+ .bik-datePicker__input::placeholder {
122
+ color: var(--bik-datePicker-text-muted);
123
+ opacity: 1;
124
+ }
125
+
126
+ /* Force light color scheme for date/datetime-local inputs */
127
+ .bik-datePicker__input[type='date'],
128
+ .bik-datePicker__input[type='datetime-local'] {
129
+ color-scheme: light;
130
+ }
131
+
132
+ /* Minimum width for date input */
133
+ .bik-datePicker__input[type='date'] {
134
+ min-width: var(--bik-datePicker-height-desktop);
135
+ }
136
+
137
+ /* Minimum width for datetime-local input */
138
+ .bik-datePicker__input[type='datetime-local'] {
139
+ min-width: calc(var(--bik-datePicker-height-desktop) * 3);
140
+ }
141
+
142
+ /* Invalid state for date/datetime-local input */
143
+ .bik-datePicker__input[type='date']:invalid,
144
+ .bik-datePicker__input[type='datetime-local']:invalid {
145
+ color: var(--bik-datePicker-text-muted);
146
+ }
147
+
148
+ /* Focused + invalid state for date/datetime-local input */
149
+ .bik-datePicker__input[type='date']:focus:invalid,
150
+ .bik-datePicker__input[type='datetime-local']:focus:invalid {
151
+ color: var(--bik-datePicker-text-color);
152
+ }
153
+
154
+ /* Hide default calendar icon, allow custom icon click-through */
155
+ .bik-datePicker__input::-webkit-calendar-picker-indicator {
156
+ opacity: 0;
157
+ position: absolute;
158
+ inset: 0;
159
+ width: 100%;
160
+ height: 100%;
161
+ cursor: pointer;
162
+ z-index: 3;
163
+ }
164
+
165
+ /* Remove default padding from date/datetime fields */
166
+ .bik-datePicker__input::-webkit-datetime-edit-fields-wrapper {
167
+ padding: 0;
168
+ }
169
+
170
+ /* Style for all date/datetime field parts (webkit) */
171
+ .bik-datePicker__input::-webkit-datetime-edit-text,
172
+ .bik-datePicker__input::-webkit-datetime-edit-month-field,
173
+ .bik-datePicker__input::-webkit-datetime-edit-day-field,
174
+ .bik-datePicker__input::-webkit-datetime-edit-year-field,
175
+ .bik-datePicker__input::-webkit-datetime-edit-hour-field,
176
+ .bik-datePicker__input::-webkit-datetime-edit-minute-field {
177
+ color: var(--bik-datePicker-text-color);
178
+ background: transparent;
179
+ font-size: 12px !important;
180
+ }
181
+
182
+ /* Label */
183
+ .bik-datePicker__label {
184
+ position: absolute;
185
+ left: var(--bik-datePicker-label-padding-desktop);
186
+ top: 50%;
187
+ transform: translateY(-50%);
188
+ font-weight: 400;
189
+ font-size: 14px;
190
+ color: var(--bik-datePicker-text-light);
191
+ background: transparent;
192
+ max-width: calc(100% - 80px);
193
+ transition: all var(--bik-datePicker-transition);
194
+ }
195
+
196
+ /* Label floating, focus, and filled states */
197
+ .bik-datePicker__label[data-floated],
198
+ .bik-datePicker__input:focus + .bik-datePicker__label,
199
+ .bik-datePicker__input:not(:placeholder-shown) + .bik-datePicker__label,
200
+ .bik-datePicker__label--floated {
201
+ top: var(--bik-datePicker-label-offset);
202
+ transform: none;
203
+ font-size: 12px;
204
+ font-weight: 400;
205
+ color: var(--bik-datePicker-text-muted);
206
+ }
207
+
208
+ /* Error state for label */
209
+ .bik-datePicker__label[data-error],
210
+ .bik-datePicker__label--error {
211
+ color: var(--bik-datePicker-error-color);
212
+ }
213
+
214
+ /* Disabled state for label */
215
+ .bik-datePicker__label[data-disabled],
216
+ .bik-datePicker__label--disabled {
217
+ color: var(--bik-datePicker-text-muted);
218
+ }
219
+
220
+ /* Required asterisk style */
221
+ .bik-datePicker__required {
222
+ color: var(--bik-datePicker-error-color);
223
+ font-weight: 500;
224
+ margin-left: 2px;
225
+ font-size: 14px;
226
+ }
227
+
228
+ /* Icon */
229
+
230
+ .bik-datePicker__icon {
231
+ position: absolute;
232
+ right: var(--bik-datePicker-icon-offset);
233
+ top: 50%;
234
+ transform: translateY(-50%);
235
+ width: var(--bik-datePicker-icon-size);
236
+ height: var(--bik-datePicker-icon-size);
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ color: var(--bik-datePicker-text-light);
241
+ user-select: none;
242
+ z-index: 4;
243
+ pointer-events: auto;
244
+ }
245
+
246
+ /* Error */
247
+
248
+ .bik-datePicker__error {
249
+ color: var(--bik-datePicker-error-color);
250
+ font-size: 10px;
251
+ display: flex;
252
+ gap: 4px;
253
+ margin: 4px 0 0 6px;
254
+ align-items: center;
255
+ animation: bik-slideInError 0.2s ease-out;
256
+ }
257
+
258
+ .bik-datePicker__errorIcon {
259
+ width: 12px;
260
+ height: 12px;
261
+ flex-shrink: 0;
262
+ color: var(--bik-datePicker-error-color);
263
+ }
264
+
265
+ /* Error message slide-in animation */
266
+ @keyframes bik-slideInError {
267
+ from {
268
+ opacity: 0;
269
+ transform: translateY(-4px);
270
+ }
271
+ to {
272
+ opacity: 1;
273
+ transform: translateY(0);
274
+ }
275
+ }
276
+
277
+ /* Accessibility & Prefs */
278
+
279
+ /* Reduce motion for accessibility */
280
+ @media (prefers-reduced-motion: reduce) {
281
+ .bik-datePicker__container * {
282
+ transition-duration: 0.01ms !important;
283
+ animation-duration: 0.01ms !important;
284
+ animation-iteration-count: 1 !important;
285
+ }
286
+ }
287
+
288
+ /* High contrast mode for accessibility */
289
+ @media (prefers-contrast: high) {
290
+ .bik-datePicker__inputWrapper {
291
+ border-width: 2px;
292
+ border-color: CanvasText;
293
+ }
294
+
295
+ .bik-datePicker__inputWrapper[data-focused] {
296
+ border-color: Highlight;
297
+ outline: 2px solid Highlight;
298
+ outline-offset: 2px;
299
+ }
300
+
301
+ .bik-datePicker__inputWrapper[data-error] {
302
+ border-color: #cc0000;
303
+ outline: 2px solid #cc0000;
304
+ outline-offset: 2px;
305
+ }
306
+
307
+ .bik-datePicker__label,
308
+ .bik-datePicker__input {
309
+ color: CanvasText;
310
+ font-weight: 400;
311
+ }
312
+ }
313
+
314
+ /* Preview Mode */
315
+
316
+ .bik-datePicker__container[data-mode='preview'] {
317
+ /* Preview mode variable overrides for compact display */
318
+ --bik-current-input-font: var(--bik-datePicker-preview-input-font);
319
+ --bik-current-label-font: var(--bik-datePicker-preview-label-font);
320
+ --bik-current-label-font-floated: var(
321
+ --bik-datePicker-preview-label-font-floated
322
+ );
323
+ --bik-current-icon-size: var(--bik-datePicker-preview-icon-size);
324
+ --bik-current-icon-svg: var(--bik-datePicker-preview-icon-svg);
325
+ --bik-current-error-font: var(--bik-datePicker-preview-error-font);
326
+ --bik-current-error-icon: var(--bik-datePicker-preview-error-icon);
327
+ }
328
+
329
+ /* Preview mode input wrapper */
330
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__inputWrapper {
331
+ height: var(--bik-datePicker-height-preview);
332
+ box-shadow: none;
333
+ }
334
+
335
+ /* Preview mode input field */
336
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__input {
337
+ padding: var(--bik-datePicker-padding-preview);
338
+ font-size: var(--bik-current-input-font);
339
+ line-height: 1.2;
340
+ height: var(--bik-datePicker-height-preview);
341
+ }
342
+
343
+ /* Preview mode: min-height for date/datetime-local */
344
+ .bik-datePicker__container[data-mode='preview']
345
+ .bik-datePicker__input[type='date'],
346
+ .bik-datePicker__container[data-mode='preview']
347
+ .bik-datePicker__input[type='datetime-local'] {
348
+ height: var(--bik-datePicker-height-preview);
349
+ }
350
+
351
+ /* Preview mode: min-width for date */
352
+ .bik-datePicker__container[data-mode='preview']
353
+ .bik-datePicker__input[type='date'] {
354
+ min-width: var(--bik-datePicker-height-preview);
355
+ }
356
+
357
+ /* Preview mode: min-width and width for datetime-local */
358
+ .bik-datePicker__container[data-mode='preview']
359
+ .bik-datePicker__input[type='datetime-local'] {
360
+ min-width: var(--bik-datePicker-height-preview);
361
+ width: var(--bik-datePicker-height-preview);
362
+ }
363
+
364
+ /* Preview mode label style */
365
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__label {
366
+ left: var(--bik-datePicker-label-padding-preview);
367
+ font-size: var(--bik-current-label-font);
368
+ line-height: 1.2;
369
+ padding: 0 4px;
370
+ margin-left: -4px;
371
+ top: 40%;
372
+ max-width: calc(100% - 54px);
373
+ white-space: nowrap;
374
+ overflow: hidden;
375
+ text-overflow: ellipsis;
376
+ pointer-events: none;
377
+ transition: all var(--bik-datePicker-transition);
378
+ z-index: 2;
379
+ }
380
+
381
+ /* Preview mode required asterisk */
382
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__required {
383
+ font-size: var(--bik-current-label-font-floated);
384
+ }
385
+
386
+ /* Preview mode: floated label */
387
+ .bik-datePicker__container[data-mode='preview']
388
+ .bik-datePicker__label[data-floated],
389
+ .bik-datePicker__container[data-mode='preview']
390
+ .bik-datePicker__input:focus
391
+ + .bik-datePicker__label,
392
+ .bik-datePicker__container[data-mode='preview']
393
+ .bik-datePicker__input:not(:placeholder-shown)
394
+ + .bik-datePicker__label {
395
+ top: 6px;
396
+ font-size: var(--bik-current-label-font-floated);
397
+ padding: 0 2px;
398
+ margin-left: -8px;
399
+ }
400
+
401
+ /* Preview mode icon style */
402
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__icon {
403
+ width: var(--bik-current-icon-size);
404
+ height: var(--bik-current-icon-size);
405
+ right: 4px;
406
+ }
407
+
408
+ /* Preview mode icon SVG size */
409
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__icon svg {
410
+ width: var(--bik-current-icon-svg);
411
+ height: var(--bik-current-icon-svg);
412
+ }
413
+
414
+ /* Preview mode error message */
415
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__error {
416
+ font-size: var(--bik-current-error-font);
417
+ margin: 2px 0 0 2px;
418
+ }
419
+
420
+ /* Preview mode error icon */
421
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__errorIcon {
422
+ width: var(--bik-current-error-icon);
423
+ height: var(--bik-current-error-icon);
424
+ }
425
+
426
+ /* Hide browser default date/time elements in preview mode */
427
+ .bik-datePicker__container[data-mode='preview']
428
+ .bik-datePicker__input::-webkit-datetime-edit-fields-wrapper,
429
+ .bik-datePicker__container[data-mode='preview']
430
+ .bik-datePicker__input::-webkit-datetime-edit-text,
431
+ .bik-datePicker__container[data-mode='preview']
432
+ .bik-datePicker__input::-webkit-datetime-edit-month-field,
433
+ .bik-datePicker__container[data-mode='preview']
434
+ .bik-datePicker__input::-webkit-datetime-edit-day-field,
435
+ .bik-datePicker__container[data-mode='preview']
436
+ .bik-datePicker__input::-webkit-datetime-edit-year-field,
437
+ .bik-datePicker__container[data-mode='preview']
438
+ .bik-datePicker__input::-webkit-datetime-edit-hour-field,
439
+ .bik-datePicker__container[data-mode='preview']
440
+ .bik-datePicker__input::-webkit-datetime-edit-minute-field {
441
+ opacity: 0;
442
+ color: transparent;
443
+ display: none;
444
+ }
445
+
446
+ /* Hide text for invalid/placeholder in preview mode */
447
+ .bik-datePicker__container[data-mode='preview']
448
+ .bik-datePicker__input[type='date']:invalid,
449
+ .bik-datePicker__container[data-mode='preview']
450
+ .bik-datePicker__input[type='datetime-local']:invalid,
451
+ .bik-datePicker__container[data-mode='preview']
452
+ .bik-datePicker__input[type='date']:placeholder-shown,
453
+ .bik-datePicker__container[data-mode='preview']
454
+ .bik-datePicker__input[type='datetime-local']:placeholder-shown {
455
+ color: transparent;
456
+ }
457
+
458
+ /* Mobile Responsiveness */
459
+
460
+ @media (max-width: 768px) {
461
+ /* Container margin for mobile */
462
+ .bik-datePicker__container {
463
+ margin-bottom: 20px;
464
+ }
465
+
466
+ /* Input wrapper min-height for mobile */
467
+ .bik-datePicker__inputWrapper {
468
+ min-height: var(--bik-datePicker-height-mobile);
469
+ }
470
+
471
+ /* Input field padding and min-height for mobile */
472
+ .bik-datePicker__input {
473
+ padding: var(--bik-datePicker-padding-mobile) !important;
474
+ min-height: var(--bik-datePicker-height-mobile) !important;
475
+ }
476
+
477
+ /* Date/datetime-local min-heights for mobile */
478
+ .bik-datePicker__input[type='date'],
479
+ .bik-datePicker__input[type='datetime-local'] {
480
+ min-height: var(--bik-datePicker-height-mobile);
481
+ }
482
+
483
+ /* Date min-width for mobile */
484
+ .bik-datePicker__input[type='date'] {
485
+ min-width: var(--bik-datePicker-height-mobile);
486
+ }
487
+
488
+ /* Datetime-local min-width for mobile */
489
+ .bik-datePicker__input[type='datetime-local'] {
490
+ min-width: calc(var(--bik-datePicker-height-mobile) * 3);
491
+ }
492
+
493
+ /* Label left padding for mobile */
494
+ .bik-datePicker__label {
495
+ left: var(--bik-datePicker-label-padding-mobile);
496
+ }
497
+
498
+ /* Preview mode mobile variable overrides */
499
+ .bik-datePicker__container[data-mode='preview'] {
500
+ --bik-current-input-font: var(--bik-datePicker-preview-input-font-mobile);
501
+ --bik-current-label-font: var(--bik-datePicker-preview-label-font-mobile);
502
+ --bik-current-label-font-floated: var(
503
+ --bik-datePicker-preview-label-font-floated-mobile
504
+ );
505
+ --bik-current-icon-size: var(--bik-datePicker-preview-icon-size-mobile);
506
+ --bik-current-icon-svg: var(--bik-datePicker-preview-icon-svg-mobile);
507
+ --bik-current-error-font: var(--bik-datePicker-preview-error-font-mobile);
508
+ --bik-current-error-icon: var(--bik-datePicker-preview-error-icon-mobile);
509
+ }
510
+
511
+ /* Preview mode label for mobile */
512
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__label {
513
+ left: var(--bik-datePicker-label-padding-preview);
514
+ padding: 0 3px;
515
+ margin-left: -3px;
516
+ }
517
+
518
+ /* Preview mode floated label for mobile */
519
+ .bik-datePicker__container[data-mode='preview']
520
+ .bik-datePicker__label[data-floated],
521
+ .bik-datePicker__container[data-mode='preview']
522
+ .bik-datePicker__input:focus
523
+ + .bik-datePicker__label,
524
+ .bik-datePicker__container[data-mode='preview']
525
+ .bik-datePicker__input:not(:placeholder-shown)
526
+ + .bik-datePicker__label {
527
+ top: 1px;
528
+ padding: 0 2px;
529
+ margin-left: -2px;
530
+ }
531
+
532
+ /* Preview mode icon for mobile */
533
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__icon {
534
+ right: 3px;
535
+ }
536
+
537
+ /* Preview mode error margin for mobile */
538
+ .bik-datePicker__container[data-mode='preview'] .bik-datePicker__error {
539
+ margin: 1px 0 0 1px;
540
+ }
541
+ }
542
+
543
+ /* Browser Compatibility */
544
+
545
+ /* Modern browser support for z-index and text alignment */
546
+ @supports (selector(:where(*))) {
547
+ .bik-datePicker__input[type='date'],
548
+ .bik-datePicker__input[type='datetime-local'] {
549
+ position: relative;
550
+ z-index: 1;
551
+ }
552
+
553
+ .bik-datePicker__input[type='date']::-webkit-date-and-time-value,
554
+ .bik-datePicker__input[type='datetime-local']::-webkit-date-and-time-value {
555
+ text-align: left;
556
+ }
557
+ }
558
+
559
+ /* Firefox support for transparent background */
560
+ @supports (-moz-appearance: none) {
561
+ .bik-datePicker__input[type='date'],
562
+ .bik-datePicker__input[type='datetime-local'] {
563
+ background: transparent;
564
+ }
565
+ }