@escapenavigator/hooks 2.1.26 → 2.1.27

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.
@@ -29,7 +29,7 @@ const ConsentCheckboxes = ({ agreementUrl, policyUrl, pdConsentUrl, values, onCh
29
29
  const { t } = (0, react_i18next_1.useTranslation)('common');
30
30
  const separatePdConsent = !!pdConsentUrl;
31
31
  // Агримент + политику объединили в одну обязательную галочку: меньше
32
- // «трения» на экране оплаты. Обе ссылки внутри одной переводимой строки.
32
+ // «трения» в форме. Обе ссылки внутри одной переводимой строки.
33
33
  const requiredAccepted = values.agreeTerms && values.agreePolicy;
34
34
  const requiredInvalid = !!showRequiredError && !requiredAccepted;
35
35
  const pdConsentInvalid = !!showRequiredError && !values.pdConsent;
@@ -11,7 +11,11 @@ type Props = {
11
11
  profileCountry: CountriesEnum;
12
12
  questrooms: PublicLeadFormReferenceRO[];
13
13
  locations: PublicLeadFormReferenceRO[];
14
+ relatedTimeField?: LeadFormField;
15
+ relatedTimeValue?: LeadFieldValue;
16
+ relatedTimeError?: string;
14
17
  onChange: (value: LeadFieldValue) => void;
18
+ onRelatedTimeChange?: (value: LeadFieldValue) => void;
15
19
  onPhoneValidChange: (valid: boolean) => void;
16
20
  };
17
21
  export declare const LeadField: React.FC<Props>;
@@ -49,6 +49,8 @@ const index_module_css_1 = __importDefault(require("./index.module.css"));
49
49
  const lib_1 = require("./lib");
50
50
  const use_lead_t_1 = require("./use-lead-t");
51
51
  const TIME_STEP_MINUTES = 30;
52
+ const HOUR_VALUES = Array.from({ length: 24 }, (_, hour) => String(hour).padStart(2, '0'));
53
+ const MINUTE_VALUES = Array.from({ length: 60 }, (_, minute) => String(minute).padStart(2, '0'));
52
54
  /** Слоты выбора времени: клиенту хватает получаса, а свободный ввод он ломает. */
53
55
  const buildTimeOptions = () => {
54
56
  const out = [];
@@ -61,26 +63,68 @@ const buildTimeOptions = () => {
61
63
  const TIME_OPTIONS = buildTimeOptions();
62
64
  /** Больше трёх вариантов в ряд пилюль не влезает на мобиле — раскладываем плитками. */
63
65
  const TILES_FROM = 4;
66
+ const ChoiceIcon = ({ id }) => {
67
+ const icon = id.toLowerCase();
68
+ return (react_1.default.createElement("span", { className: index_module_css_1.default.choiceIcon, "aria-hidden": 'true' },
69
+ react_1.default.createElement("svg", { viewBox: '0 0 24 24', fill: 'none', "aria-hidden": 'true' }, icon.includes('birthday') ? (react_1.default.createElement(react_1.default.Fragment, null,
70
+ react_1.default.createElement("path", { d: 'M4.5 11.5h15v8h-15zM4.5 15.5h15M8 11.5V8m4 3.5V8m4 3.5V8' }),
71
+ react_1.default.createElement("path", { d: 'M8 5.5c.8-.9.8-1.8 0-2.7-.8.9-.8 1.8 0 2.7Zm4 0c.8-.9.8-1.8 0-2.7-.8.9-.8 1.8 0 2.7Zm4 0c.8-.9.8-1.8 0-2.7-.8.9-.8 1.8 0 2.7Z' }))) : icon.includes('corporate') ? (react_1.default.createElement(react_1.default.Fragment, null,
72
+ react_1.default.createElement("rect", { x: '3.5', y: '7', width: '17', height: '12.5', rx: '2' }),
73
+ react_1.default.createElement("path", { d: 'M8.5 7V4.5h7V7M3.5 12h17M10 12v2h4v-2' }))) : icon.includes('family') || icon.includes('friend') ? (react_1.default.createElement(react_1.default.Fragment, null,
74
+ react_1.default.createElement("circle", { cx: '8', cy: '8', r: '2.5' }),
75
+ react_1.default.createElement("circle", { cx: '16', cy: '8', r: '2.5' }),
76
+ react_1.default.createElement("path", { d: 'M3.5 19v-2.5A4.5 4.5 0 0 1 8 12h0a4.5 4.5 0 0 1 4.5 4.5V19M11.5 14.5A4.5 4.5 0 0 1 16 12h0a4.5 4.5 0 0 1 4.5 4.5V19' }))) : icon.includes('date') ? (react_1.default.createElement("path", { d: 'M12 20S4.5 15.7 4.5 9.5A4.1 4.1 0 0 1 12 7.2a4.1 4.1 0 0 1 7.5 2.3C19.5 15.7 12 20 12 20Z' })) : (react_1.default.createElement(react_1.default.Fragment, null,
77
+ react_1.default.createElement("circle", { cx: '12', cy: '12', r: '8.5' }),
78
+ react_1.default.createElement("path", { d: 'm14.8 9.2-1.7 3.9-3.9 1.7 1.7-3.9 3.9-1.7Z' }))))));
79
+ };
64
80
  /**
65
81
  * Радио и чекбоксы площадки — кнопками-вариантами: один тап вместо попадания
66
82
  * в кружок, и форма читается как выбор, а не как анкета.
67
83
  */
68
- const ChoiceGroup = ({ label, options, isSelected, onToggle, hint, error, }) => (react_1.default.createElement(ui_1.FlexColumns, { columns: 1, gr: 8 },
69
- react_1.default.createElement(ui_1.Typography.Text, { view: 'primary-small', weight: 'medium', color: 'primary' }, label),
70
- react_1.default.createElement("div", { role: 'group', "aria-label": label, className: options.length >= TILES_FROM ? index_module_css_1.default.choiceTiles : index_module_css_1.default.choicePills }, options.map((option) => {
71
- const selected = isSelected(option.id);
72
- return (react_1.default.createElement("button", { key: option.id, type: 'button', "aria-pressed": selected, className: index_module_css_1.default.choice, "data-selected": selected, "data-invalid": !!error, onClick: () => onToggle(option.id) }, option.label));
73
- })),
74
- hint,
75
- !!error && (react_1.default.createElement(ui_1.Typography.Text, { view: 'caps', color: 'negative' }, error))));
76
- const LeadField = ({ field, value, error, language, profileCountry, questrooms, locations, onChange, onPhoneValidChange, }) => {
84
+ const ChoiceGroup = ({ label, options, isSelected, onToggle, hint, error, }) => {
85
+ const tiled = options.length >= TILES_FROM;
86
+ return (react_1.default.createElement(ui_1.FlexColumns, { columns: 1, gr: 8 },
87
+ react_1.default.createElement(ui_1.Typography.Text, { view: 'primary-small', weight: 'medium', color: 'primary' }, label),
88
+ react_1.default.createElement("div", { role: 'group', "aria-label": label, className: tiled ? index_module_css_1.default.choiceTiles : index_module_css_1.default.choicePills }, options.map((option) => {
89
+ const selected = isSelected(option.id);
90
+ return (react_1.default.createElement("button", { key: option.id, type: 'button', "aria-pressed": selected, className: index_module_css_1.default.choice, "data-selected": selected, "data-invalid": !!error, onClick: () => onToggle(option.id) },
91
+ tiled && react_1.default.createElement(ChoiceIcon, { id: option.id }),
92
+ react_1.default.createElement("span", null, option.label)));
93
+ })),
94
+ hint,
95
+ !!error && (react_1.default.createElement(ui_1.Typography.Text, { view: 'caps', color: 'negative' }, error))));
96
+ };
97
+ const LeadField = ({ field, value, error, language, profileCountry, questrooms, locations, relatedTimeField, relatedTimeValue, relatedTimeError, onChange, onRelatedTimeChange, onPhoneValidChange, }) => {
77
98
  var _a, _b;
78
99
  const t = (0, use_lead_t_1.useLeadT)();
79
100
  const [textareaExpanded, setTextareaExpanded] = (0, react_1.useState)(Boolean(value || error));
101
+ const initialTime = typeof relatedTimeValue === 'string' &&
102
+ relatedTimeValue !== lead_time_constants_1.LEAD_TIME_UNDECIDED_VALUE &&
103
+ relatedTimeValue.includes(':')
104
+ ? relatedTimeValue.split(':')
105
+ : ['', ''];
106
+ const [dateMode, setDateMode] = (0, react_1.useState)(Boolean(value) ||
107
+ (Boolean(relatedTimeValue) && relatedTimeValue !== lead_time_constants_1.LEAD_TIME_UNDECIDED_VALUE));
108
+ const [preferredHour, setPreferredHour] = (0, react_1.useState)(initialTime[0] || '');
109
+ const [preferredMinute, setPreferredMinute] = (0, react_1.useState)(initialTime[1] || '');
80
110
  (0, react_1.useEffect)(() => {
81
111
  if (value || error)
82
112
  setTextareaExpanded(true);
83
113
  }, [error, value]);
114
+ (0, react_1.useEffect)(() => {
115
+ if (field.type !== lead_field_type_enum_1.LeadFieldTypeEnum.DATE)
116
+ return;
117
+ if (value || (relatedTimeValue && relatedTimeValue !== lead_time_constants_1.LEAD_TIME_UNDECIDED_VALUE)) {
118
+ setDateMode(true);
119
+ }
120
+ if (typeof relatedTimeValue === 'string' &&
121
+ relatedTimeValue !== lead_time_constants_1.LEAD_TIME_UNDECIDED_VALUE &&
122
+ relatedTimeValue.includes(':')) {
123
+ const [hour, minute] = relatedTimeValue.split(':');
124
+ setPreferredHour(hour.padStart(2, '0'));
125
+ setPreferredMinute(minute);
126
+ }
127
+ }, [field.type, relatedTimeValue, value]);
84
128
  const title = (0, lib_1.fieldTitle)(field, language);
85
129
  const label = field.required ? `${title} *` : title;
86
130
  const placeholder = (0, lib_1.fieldText)(field, language, 'placeholder');
@@ -114,8 +158,67 @@ const LeadField = ({ field, value, error, language, profileCountry, questrooms,
114
158
  return withHint(react_1.default.createElement("div", { className: index_module_css_1.default.commentEditor },
115
159
  react_1.default.createElement(ui_1.Textarea, { block: true, maxLength: 1000, label: label, placeholder: placeholder, value: String(value || ''), error: error, onChange: (_e, payload) => onChange(payload.value) }),
116
160
  !value && !error && (react_1.default.createElement("button", { type: 'button', className: index_module_css_1.default.commentCollapse, onClick: () => setTextareaExpanded(false) }, t('lead.collapse')))));
117
- case lead_field_type_enum_1.LeadFieldTypeEnum.DATE:
118
- return withHint(react_1.default.createElement(ui_1.CalendarInput, { block: true, label: label, lang: language, value: String(value || ''), error: error, onChange: (_e, payload) => onChange(payload.value) }));
161
+ case lead_field_type_enum_1.LeadFieldTypeEnum.DATE: {
162
+ const chooseDate = () => {
163
+ setDateMode(true);
164
+ if (relatedTimeValue === lead_time_constants_1.LEAD_TIME_UNDECIDED_VALUE) {
165
+ onRelatedTimeChange === null || onRelatedTimeChange === void 0 ? void 0 : onRelatedTimeChange('');
166
+ }
167
+ };
168
+ const clearDate = () => {
169
+ setDateMode(false);
170
+ onChange('');
171
+ onRelatedTimeChange === null || onRelatedTimeChange === void 0 ? void 0 : onRelatedTimeChange(lead_time_constants_1.LEAD_TIME_UNDECIDED_VALUE);
172
+ };
173
+ const updateTime = (nextHour, nextMinute) => {
174
+ if (!onRelatedTimeChange)
175
+ return;
176
+ onRelatedTimeChange(nextHour && nextMinute ? `${nextHour}:${nextMinute}` : '');
177
+ };
178
+ return (react_1.default.createElement(ui_1.FlexColumns, { columns: 1, gr: 10 },
179
+ react_1.default.createElement("div", { className: index_module_css_1.default.dateMode, role: 'group', "aria-label": label, "data-invalid": !dateMode && !!error },
180
+ react_1.default.createElement("button", { type: 'button', className: index_module_css_1.default.dateModeOption, "data-selected": !dateMode, "aria-pressed": !dateMode, onClick: clearDate }, t('lead.dateNotImportant')),
181
+ react_1.default.createElement("button", { type: 'button', className: index_module_css_1.default.dateModeOption, "data-selected": dateMode, "aria-pressed": dateMode, onClick: chooseDate }, t('lead.chooseDate'))),
182
+ dateMode && (react_1.default.createElement("div", { className: index_module_css_1.default.dateTimePicker },
183
+ react_1.default.createElement("label", { className: index_module_css_1.default.dateTimeDate },
184
+ react_1.default.createElement("span", { className: index_module_css_1.default.dateTimeLabel }, t('lead.date')),
185
+ react_1.default.createElement("input", { className: index_module_css_1.default.dateInput, type: 'date', "aria-label": label, value: String(value || ''), "data-invalid": !!error, onChange: (event) => onChange(event.currentTarget.value) })),
186
+ !!relatedTimeField && (react_1.default.createElement("div", { className: index_module_css_1.default.dateTimeRow },
187
+ react_1.default.createElement("span", { className: index_module_css_1.default.dateTimeClock, "aria-hidden": 'true' },
188
+ react_1.default.createElement("svg", { viewBox: '0 0 24 24', fill: 'none', "aria-hidden": 'true' },
189
+ react_1.default.createElement("circle", { cx: '12', cy: '12', r: '8.25' }),
190
+ react_1.default.createElement("path", { d: 'M12 7.75v4.6l3.05 1.8' }))),
191
+ react_1.default.createElement("label", { className: index_module_css_1.default.dateTimePart },
192
+ react_1.default.createElement("span", { className: index_module_css_1.default.dateTimeLabel }, t('lead.hours')),
193
+ react_1.default.createElement("span", { className: index_module_css_1.default.nativeSelect },
194
+ react_1.default.createElement("select", { value: preferredHour, "aria-label": t('lead.hours'), "data-invalid": !!relatedTimeError, onChange: (event) => {
195
+ const nextHour = event.currentTarget.value;
196
+ const nextMinute = preferredMinute || '00';
197
+ setPreferredHour(nextHour);
198
+ setPreferredMinute(nextHour ? nextMinute : '');
199
+ updateTime(nextHour, nextMinute);
200
+ } },
201
+ react_1.default.createElement("option", { value: '' }, "\u2014"),
202
+ HOUR_VALUES.map((hour) => (react_1.default.createElement("option", { key: hour, value: hour }, hour)))),
203
+ react_1.default.createElement("span", { "aria-hidden": 'true' }))),
204
+ react_1.default.createElement("span", { className: index_module_css_1.default.dateTimeColon, "aria-hidden": 'true' }, ":"),
205
+ react_1.default.createElement("label", { className: index_module_css_1.default.dateTimePart },
206
+ react_1.default.createElement("span", { className: index_module_css_1.default.dateTimeLabel }, t('lead.minutes')),
207
+ react_1.default.createElement("span", { className: index_module_css_1.default.nativeSelect },
208
+ react_1.default.createElement("select", { value: preferredMinute, "aria-label": t('lead.minutes'), "data-invalid": !!relatedTimeError, onChange: (event) => {
209
+ const nextMinute = event.currentTarget.value;
210
+ const nextHour = preferredHour || '12';
211
+ setPreferredHour(nextMinute ? nextHour : '');
212
+ setPreferredMinute(nextMinute);
213
+ updateTime(nextHour, nextMinute);
214
+ } },
215
+ react_1.default.createElement("option", { value: '' }, "\u2014"),
216
+ MINUTE_VALUES.map((minute) => (react_1.default.createElement("option", { key: minute, value: minute }, minute)))),
217
+ react_1.default.createElement("span", { "aria-hidden": 'true' }))))))),
218
+ dateMode && !!error && (react_1.default.createElement(ui_1.Typography.Text, { view: 'caps', color: 'negative' }, error)),
219
+ dateMode && !!relatedTimeError && (react_1.default.createElement(ui_1.Typography.Text, { view: 'caps', color: 'negative' }, relatedTimeError)),
220
+ hint));
221
+ }
119
222
  case lead_field_type_enum_1.LeadFieldTypeEnum.TIME:
120
223
  return (react_1.default.createElement(ui_1.FlexColumns, { columns: 1, gr: 8 },
121
224
  react_1.default.createElement(ui_1.Typography.Text, { view: 'primary-small', weight: 'medium', color: 'primary' }, label),
@@ -210,8 +210,9 @@ const LeadForm = ({ form, source, language, profileCountry, submit, prefill, con
210
210
  const title = (0, lib_1.localized)(form.clientTitle, language) || t('lead.title');
211
211
  const description = (0, lib_1.localized)(form.description, language);
212
212
  const stepLabel = step === 1 ? t('lead.stepPlanning') : t('lead.stepContacts');
213
- const headerTitle = hasTwoSteps && step === 2 ? t('lead.stepQuestMatchTitle') : title;
214
- const headerDescription = hasTwoSteps && step === 2 ? t('lead.stepContactsHint') : description;
213
+ const showHeaderCopy = !hasTwoSteps || step === 1;
214
+ const dateField = activeFields.find((field) => field.type === lead_field_type_enum_1.LeadFieldTypeEnum.DATE);
215
+ const timeField = activeFields.find((field) => field.type === lead_field_type_enum_1.LeadFieldTypeEnum.TIME);
215
216
  return (react_1.default.createElement("div", { className: index_module_css_1.default.form },
216
217
  withHeader && (react_1.default.createElement("div", { className: index_module_css_1.default.header },
217
218
  hasTwoSteps ? (react_1.default.createElement(react_1.default.Fragment, null,
@@ -225,18 +226,29 @@ const LeadForm = ({ form, source, language, profileCountry, submit, prefill, con
225
226
  }))),
226
227
  react_1.default.createElement("div", { className: index_module_css_1.default.progress, "aria-hidden": 'true' },
227
228
  react_1.default.createElement("span", { "data-step": step })))) : (react_1.default.createElement("span", { className: index_module_css_1.default.headerAccent, "aria-hidden": 'true' })),
228
- react_1.default.createElement(ui_1.Typography.Title, { tag: 'h1', view: 'small', weight: 'bold' }, headerTitle),
229
- !!headerDescription && (react_1.default.createElement(ui_1.Typography.Text, { view: 'primary-small', color: 'secondary' }, headerDescription)))),
229
+ showHeaderCopy && (react_1.default.createElement("div", { className: index_module_css_1.default.headerCopy },
230
+ react_1.default.createElement(ui_1.Typography.Title, { tag: 'h1', view: 'small', weight: 'bold' }, title),
231
+ !!description && (react_1.default.createElement(ui_1.Typography.Text, { view: 'primary-small', color: 'secondary' }, description)))))),
230
232
  !!formError && react_1.default.createElement(ui_1.ToastPlate, { view: 'negative' }, formError),
231
233
  hasTwoSteps && step === 2 && !!planningSummary.length && (react_1.default.createElement("div", { className: index_module_css_1.default.selectionSummary },
232
234
  react_1.default.createElement("div", null,
233
- react_1.default.createElement("span", null, t('lead.selection')),
235
+ react_1.default.createElement("span", { className: index_module_css_1.default.summaryIcon, "aria-hidden": 'true' },
236
+ react_1.default.createElement("svg", { viewBox: '0 0 24 24', fill: 'none', "aria-hidden": 'true' },
237
+ react_1.default.createElement("path", { d: 'M4.5 11.5h15v8h-15zM4.5 15.5h15M8 11.5V8m4 3.5V8m4 3.5V8' }),
238
+ react_1.default.createElement("path", { d: 'M8 5.5c.8-.9.8-1.8 0-2.7-.8.9-.8 1.8 0 2.7Zm4 0c.8-.9.8-1.8 0-2.7-.8.9-.8 1.8 0 2.7Zm4 0c.8-.9.8-1.8 0-2.7-.8.9-.8 1.8 0 2.7Z' }))),
234
239
  react_1.default.createElement("strong", null, planningSummary.join(' · '))),
235
240
  react_1.default.createElement("button", { type: 'button', onClick: () => setStep(1) }, t('lead.edit')))),
236
- react_1.default.createElement("div", { key: hasTwoSteps ? step : 'single', className: index_module_css_1.default.fields, "data-step": hasTwoSteps ? step : 1 }, activeFields.map((field) => (react_1.default.createElement("div", { key: field.id, className: index_module_css_1.default.fieldCard, "data-field-type": field.type },
237
- react_1.default.createElement(lead_field_1.LeadField, { field: field, value: values[field.id], error: errors[field.id], language: language, profileCountry: profileCountry, questrooms: form.questrooms, locations: form.locations, onChange: (value) => setValue(field.id, value), onPhoneValidChange: setPhoneValid }))))),
241
+ react_1.default.createElement("div", { key: hasTwoSteps ? step : 'single', className: index_module_css_1.default.fields, "data-step": hasTwoSteps ? step : 1 }, activeFields.map((field) => {
242
+ if (field.id === (timeField === null || timeField === void 0 ? void 0 : timeField.id) && dateField)
243
+ return null;
244
+ const relatedTimeField = field.id === (dateField === null || dateField === void 0 ? void 0 : dateField.id) ? timeField : undefined;
245
+ return (react_1.default.createElement("div", { key: field.id, className: index_module_css_1.default.fieldCard, "data-field-type": field.type },
246
+ react_1.default.createElement(lead_field_1.LeadField, { field: field, value: values[field.id], error: errors[field.id], language: language, profileCountry: profileCountry, questrooms: form.questrooms, locations: form.locations, relatedTimeField: relatedTimeField, relatedTimeValue: relatedTimeField ? values[relatedTimeField.id] : undefined, relatedTimeError: relatedTimeField ? errors[relatedTimeField.id] : undefined, onRelatedTimeChange: relatedTimeField
247
+ ? (value) => setValue(relatedTimeField.id, value)
248
+ : undefined, onChange: (value) => setValue(field.id, value), onPhoneValidChange: setPhoneValid })));
249
+ })),
238
250
  react_1.default.createElement("input", { className: index_module_css_1.default.trap, tabIndex: -1, autoComplete: 'off', "aria-hidden": 'true', value: trap, onChange: (event) => setTrap(event.target.value) }),
239
- react_1.default.createElement("div", { className: index_module_css_1.default.footer }, hasTwoSteps && step === 1 ? (react_1.default.createElement(ui_1.Button, { view: 'primary', size: 's', block: true, rightAddons: react_1.default.createElement(ArrowRight, null), onClick: handleNext }, t('lead.next'))) : (react_1.default.createElement(react_1.default.Fragment, null,
251
+ react_1.default.createElement("div", { className: index_module_css_1.default.footer, "data-step": hasTwoSteps ? step : 1 }, hasTwoSteps && step === 1 ? (react_1.default.createElement(ui_1.Button, { view: 'primary', size: 's', block: true, rightAddons: react_1.default.createElement(ArrowRight, null), onClick: handleNext }, t('lead.next'))) : (react_1.default.createElement(react_1.default.Fragment, null,
240
252
  (consentRequired || !!policyUrl) && (react_1.default.createElement(personal_data_consent_1.PersonalDataConsent, { required: consentRequired, consentUrl: pdConsentUrl || '', policyUrl: policyUrl || '', checked: consent, showError: showConsentError, onChange: (checked) => {
241
253
  setConsent(checked);
242
254
  if (checked)
@@ -27,6 +27,11 @@ const DEFAULTS = {
27
27
  'lead.guestsPlus': 'One guest more',
28
28
  'lead.guestsUnknown': 'Not sure yet',
29
29
  'lead.timeUndecided': 'Not sure about the time yet',
30
+ 'lead.dateNotImportant': 'Date is flexible',
31
+ 'lead.chooseDate': 'Choose a date',
32
+ 'lead.date': 'Date',
33
+ 'lead.hours': 'Hours',
34
+ 'lead.minutes': 'Minutes',
30
35
  'lead.stepPlanning': 'Your preferences',
31
36
  'lead.stepContacts': 'Contacts',
32
37
  'lead.stepCounter': 'Step {{current}} of 2 · {{label}}',
@@ -54,6 +59,11 @@ const RU_DEFAULTS = {
54
59
  'lead.footnote': 'Менеджер свяжется с вами и предложит варианты. Заявка пока не бронирует игру.',
55
60
  'lead.timeUndecided': 'Пока не определился со временем',
56
61
  'lead.guestsUnknown': 'Не знаю',
62
+ 'lead.dateNotImportant': 'Дата не важна',
63
+ 'lead.chooseDate': 'Выбрать дату',
64
+ 'lead.date': 'Дата',
65
+ 'lead.hours': 'Часы',
66
+ 'lead.minutes': 'Минуты',
57
67
  'lead.stepPlanning': 'Ваши пожелания',
58
68
  'lead.stepContacts': 'Контакты',
59
69
  'lead.stepCounter': 'Шаг {{current}} из 2 · {{label}}',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@escapenavigator/hooks",
3
- "version": "2.1.26",
3
+ "version": "2.1.27",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -14,9 +14,9 @@
14
14
  "test": "jest"
15
15
  },
16
16
  "dependencies": {
17
- "@escapenavigator/services": "^2.1.26",
18
- "@escapenavigator/types": "^2.1.26",
19
- "@escapenavigator/utils": "^2.1.26",
17
+ "@escapenavigator/services": "^2.1.27",
18
+ "@escapenavigator/types": "^2.1.27",
19
+ "@escapenavigator/utils": "^2.1.27",
20
20
  "libphonenumber-js": "^1.12.24",
21
21
  "react": "19.2.6",
22
22
  "react-phone-input-2": "^2.15.1"
@@ -32,5 +32,5 @@
32
32
  "ts-jest": "^29.1.1",
33
33
  "typescript": "^5.6"
34
34
  },
35
- "gitHead": "cf00fa0c16e42ceb7ac797dfd6b273238ca07c2a"
35
+ "gitHead": "1b97bef916770f64ebd799d00656db9bc845b9ec"
36
36
  }