@foxford/navigation-ui 1.0.2 → 1.1.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.
Files changed (67) hide show
  1. package/README.mdx +58 -0
  2. package/footer/atoms/logo-sk/index.js +1 -1
  3. package/footer/atoms/social-link/index.d.ts +3 -1
  4. package/footer/atoms/social-link/index.d.ts.map +1 -1
  5. package/footer/atoms/social-link/index.js +9 -0
  6. package/footer/contacts-column.d.ts.map +1 -1
  7. package/footer/contacts-column.js +10 -1
  8. package/footer/footer.d.ts.map +1 -1
  9. package/footer/footer.js +15 -6
  10. package/footer/molecules/app-info/index.js +1 -1
  11. package/footer/molecules/footer-menu/index.d.ts +3 -1
  12. package/footer/molecules/footer-menu/index.d.ts.map +1 -1
  13. package/footer/molecules/footer-menu/index.js +3 -0
  14. package/footer/molecules/geoposition/index.js +1 -0
  15. package/footer/types.d.ts +16 -0
  16. package/footer/types.d.ts.map +1 -1
  17. package/header/atoms/action-button/index.d.ts +8 -1
  18. package/header/atoms/action-button/index.d.ts.map +1 -1
  19. package/header/atoms/action-button/index.js +65 -16
  20. package/header/atoms/back-button/index.d.ts.map +1 -1
  21. package/header/atoms/back-button/index.js +24 -3
  22. package/header/atoms/bonus-button/index.d.ts.map +1 -1
  23. package/header/atoms/bonus-button/index.js +1 -0
  24. package/header/atoms/close-button/index.d.ts.map +1 -1
  25. package/header/atoms/close-button/index.js +1 -0
  26. package/header/atoms/list-title/index.d.ts.map +1 -1
  27. package/header/atoms/list-title/index.js +2 -0
  28. package/header/atoms/logout-button/index.d.ts.map +1 -1
  29. package/header/atoms/logout-button/index.js +1 -0
  30. package/header/atoms/user-profile/index.d.ts.map +1 -1
  31. package/header/atoms/user-profile/index.js +54 -29
  32. package/header/molecules/cart-button/index.d.ts +2 -0
  33. package/header/molecules/cart-button/index.d.ts.map +1 -1
  34. package/header/molecules/cart-button/index.js +6 -1
  35. package/header/molecules/container/index.d.ts +3 -1
  36. package/header/molecules/container/index.d.ts.map +1 -1
  37. package/header/molecules/container/index.js +2 -0
  38. package/header/molecules/externat-buttons/index.d.ts.map +1 -1
  39. package/header/molecules/externat-buttons/index.js +28 -6
  40. package/header/molecules/menu/index.d.ts.map +1 -1
  41. package/header/molecules/menu/index.js +84 -64
  42. package/header/molecules/menu-button/index.d.ts.map +1 -1
  43. package/header/molecules/menu-button/index.js +3 -0
  44. package/header/molecules/oneclick-menu/index.js +3 -0
  45. package/header/molecules/profile-menu/index.d.ts.map +1 -1
  46. package/header/molecules/profile-menu/index.js +28 -21
  47. package/header/molecules/segment-list/index.d.ts.map +1 -1
  48. package/header/molecules/segment-list/index.js +26 -3
  49. package/header/molecules/support-button/index.d.ts.map +1 -1
  50. package/header/molecules/support-button/index.js +5 -0
  51. package/header/molecules/user-panel/index.d.ts.map +1 -1
  52. package/header/molecules/user-panel/index.js +3 -1
  53. package/header/navigation.d.ts.map +1 -1
  54. package/header/navigation.js +2 -0
  55. package/header/types.d.ts +6 -0
  56. package/header/types.d.ts.map +1 -1
  57. package/package.json +4 -4
  58. package/shared/a11y.d.ts +39 -0
  59. package/shared/a11y.d.ts.map +1 -0
  60. package/shared/a11y.js +96 -0
  61. package/shared/constants.d.ts +2 -0
  62. package/shared/constants.d.ts.map +1 -1
  63. package/shared/constants.js +2 -0
  64. package/shared/json-ld.d.ts +6 -0
  65. package/shared/json-ld.d.ts.map +1 -0
  66. package/shared/json-ld.js +18 -0
  67. package/shared/theme.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/header/navigation.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAmD9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,gCAsDhD"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/header/navigation.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAmD9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,gCAuDhD"}
@@ -61,6 +61,7 @@ function Navigation(props) {
61
61
  const {
62
62
  entryPanel,
63
63
  isLoggedIn,
64
+ landmarks,
64
65
  menu,
65
66
  menuOpen,
66
67
  offsetTop,
@@ -85,6 +86,7 @@ function Navigation(props) {
85
86
  aboveMenu,
86
87
  belowMenu,
87
88
  hasOneClickMenu: props.hasOneClickMenu,
89
+ landmark: landmarks,
88
90
  onBackgroundClick: menuOpen ? onMenuToggle : void 0,
89
91
  showBackground,
90
92
  children: [jsx(Header, {
package/header/types.d.ts CHANGED
@@ -21,6 +21,12 @@ export interface NavigationProps {
21
21
  externatFreeAccessLink?: string;
22
22
  hasOneClickMenu?: boolean;
23
23
  isLoggedIn: boolean;
24
+ /**
25
+ * Объявить шапку ориентиром `banner` — «шапкой страницы». Ориентир должен быть на странице
26
+ * один: на портале шапка его и есть, а на чужом сайте у хоста своя шапка, и второй `banner`
27
+ * сбил бы скринридер. Поэтому выключено по умолчанию, включает тот, кто знает, где он.
28
+ */
29
+ landmarks?: boolean;
24
30
  menu: Omit<MenuProps, 'entryPanel' | 'onClose' | 'open' | 'origin' | 'topOffset'>;
25
31
  menuOpen: boolean;
26
32
  offsetTop?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/header/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAExE;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAEtE,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,4GAA4G;IAC5G,UAAU,EAAE,eAAe,CAAA;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAA;IACjF,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAA;IACtC,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAA;IACpC,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAA;IACtC,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,gGAAgG;IAChG,aAAa,CAAC,EAAE,kBAAkB,CAAA;IAClC,SAAS,CAAC,EAAE,cAAc,CAAA;CAC3B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/header/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAExE;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAEtE,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,4GAA4G;IAC5G,UAAU,EAAE,eAAe,CAAA;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAA;IACjF,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAA;IACtC,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAA;IACpC,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAA;IACtC,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,gGAAgG;IAChG,aAAa,CAAC,EAAE,kBAAkB,CAAA;IAClC,SAAS,CAAC,EAAE,cAAc,CAAA;CAC3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/navigation-ui",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "Презентационная вёрстка шапки и подвала портала Фоксфорда",
5
5
  "keywords": [
6
6
  "foxford",
@@ -28,10 +28,10 @@
28
28
  "type": "module",
29
29
  "dependencies": {
30
30
  "react-aim-menu": "^1.3.0",
31
- "@foxford/qr-code": "^1.3.0"
31
+ "@foxford/qr-code": "^2.0.0"
32
32
  },
33
33
  "peerDependencies": {
34
- "@foxford/ui": "^2",
34
+ "@foxford/ui": "^2.127.0",
35
35
  "preact": ">=10",
36
36
  "react": ">=17",
37
37
  "styled-components": ">=6"
@@ -60,6 +60,6 @@
60
60
  "package.json",
61
61
  "shared"
62
62
  ],
63
- "sha": "84a5c28",
63
+ "sha": "ed81522",
64
64
  "scripts": {}
65
65
  }
@@ -0,0 +1,39 @@
1
+ import type { KeyboardEvent } from 'react';
2
+ /** Обработчик клавиатуры для узла с `role="button"`: Enter и Space нажимают его. */
3
+ export declare function onButtonKeys(onPress: (() => void) | undefined): (event: KeyboardEvent<HTMLElement>) => void;
4
+ /** Пропсы, превращающие произвольный узел в доступную с клавиатуры кнопку. */
5
+ export declare function buttonProps(onPress: (() => void) | undefined): {
6
+ readonly onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;
7
+ readonly role: "button";
8
+ readonly tabIndex: 0;
9
+ };
10
+ /**
11
+ * id панели сегмента простыни — для `aria-controls` его кнопки. Сегменты уникальны в пределах
12
+ * меню, а меню в документе одно (в отличие от панели пользователя, которая рисуется дважды).
13
+ */
14
+ export declare function segmentPaneId(segmentId: string): string;
15
+ /**
16
+ * Вернуть фокус на кнопку, раскрывшую панель, когда панель закрылась, — если фокус был внутри
17
+ * неё. Закрытая панель прячется стилями, и фокус со спрятанного узла браузер сбрасывает на
18
+ * `body`: пользователь клавиатуры оказывается в начале страницы. Если же фокус к закрытию был
19
+ * снаружи (закрыли Esc, уйдя Tab-ом в страницу), он остаётся, где был — не отбираем.
20
+ *
21
+ * Где фокус, запоминается по `focusin`, пока панель открыта, а не читается в момент закрытия:
22
+ * к этому моменту браузер мог уже снять его со спрятанного узла, и проверка промахнулась бы.
23
+ */
24
+ export declare function useReturnFocus(open: boolean, panelId: string, triggerId: string): void;
25
+ /**
26
+ * Открыли панель С КЛАВИАТУРЫ — перевести фокус на её первый пункт. Иначе до него пришлось бы
27
+ * идти Tab-ом через всё, что стоит в документе между кнопкой и панелью (у шапки это правая
28
+ * часть и одноклик-меню). Мышью открыли — фокус не трогаем: он пользователю не виден и не нужен.
29
+ *
30
+ * Клавиатура узнаётся по `click` с `detail === 0`: так браузер помечает нажатие кнопки
31
+ * клавишей (Enter/Space), у клика мышью `detail` — число кликов, не меньше единицы. Кнопка
32
+ * при этом остаётся обычной кнопкой: ни пропсов, ни разметки хук не требует.
33
+ *
34
+ * Фокус ставится попытками, а не один раз: панель проявляется анимацией (`visibility` с
35
+ * задержкой), и пока она скрыта, `focus()` молча не срабатывает. Если за это время
36
+ * пользователь увёл фокус сам — перестаём.
37
+ */
38
+ export declare function useFocusOnKeyboardOpen(open: boolean, triggerId: string, targetSelector: string): void;
39
+ //# sourceMappingURL=a11y.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/shared/a11y.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAU1C,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,IACpD,OAAO,aAAa,CAAC,WAAW,CAAC,UAM1C;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS;gCAT5C,aAAa,CAAC,WAAW,CAAC;;;EAW1C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+BtF;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAwDrG"}
package/shared/a11y.js ADDED
@@ -0,0 +1,96 @@
1
+ import { useRef, useEffect } from "react";
2
+ function onButtonKeys(onPress) {
3
+ return (event) => {
4
+ if (event.key === "Enter" || event.key === " " || event.key === "Spacebar") {
5
+ event.preventDefault();
6
+ onPress == null ? void 0 : onPress();
7
+ }
8
+ };
9
+ }
10
+ function buttonProps(onPress) {
11
+ return {
12
+ onKeyDown: onButtonKeys(onPress),
13
+ role: "button",
14
+ tabIndex: 0
15
+ };
16
+ }
17
+ function segmentPaneId(segmentId) {
18
+ return `foxNavSegment-${segmentId.replace(/\s+/g, "-")}`;
19
+ }
20
+ function useReturnFocus(open, panelId, triggerId) {
21
+ const focusInside = useRef(false);
22
+ useEffect(() => {
23
+ if (!open) {
24
+ return;
25
+ }
26
+ const panel = document.getElementById(panelId);
27
+ const contains = (node) => node instanceof Node && (panel == null ? void 0 : panel.contains(node)) === true;
28
+ focusInside.current = contains(document.activeElement);
29
+ const onFocusIn = (event) => {
30
+ focusInside.current = contains(event.target);
31
+ };
32
+ document.addEventListener("focusin", onFocusIn);
33
+ return () => document.removeEventListener("focusin", onFocusIn);
34
+ }, [open, panelId]);
35
+ useEffect(() => {
36
+ var _a;
37
+ if (open || !focusInside.current) {
38
+ return;
39
+ }
40
+ focusInside.current = false;
41
+ (_a = document.getElementById(triggerId)) == null ? void 0 : _a.focus({
42
+ preventScroll: true
43
+ });
44
+ }, [open, triggerId]);
45
+ }
46
+ const FOCUS_ATTEMPTS = 60;
47
+ const FOCUS_RETRY_MS = 16;
48
+ function useFocusOnKeyboardOpen(open, triggerId, targetSelector) {
49
+ const openedByKeyboard = useRef(false);
50
+ useEffect(() => {
51
+ const onClick = (event) => {
52
+ const trigger = document.getElementById(triggerId);
53
+ if (trigger !== null && event.target instanceof Node && trigger.contains(event.target)) {
54
+ openedByKeyboard.current = event.detail === 0;
55
+ }
56
+ };
57
+ document.addEventListener("click", onClick, true);
58
+ return () => document.removeEventListener("click", onClick, true);
59
+ }, [triggerId]);
60
+ useEffect(() => {
61
+ if (!open || !openedByKeyboard.current) {
62
+ openedByKeyboard.current = false;
63
+ return;
64
+ }
65
+ openedByKeyboard.current = false;
66
+ const trigger = document.getElementById(triggerId);
67
+ let attempts = 0;
68
+ let timer;
69
+ const tryFocus = () => {
70
+ const active = document.activeElement;
71
+ if (active !== trigger && active !== document.body) {
72
+ return;
73
+ }
74
+ const target = document.querySelector(targetSelector);
75
+ target == null ? void 0 : target.focus({
76
+ preventScroll: true
77
+ });
78
+ if (target !== null && document.activeElement === target) {
79
+ return;
80
+ }
81
+ attempts += 1;
82
+ if (attempts < FOCUS_ATTEMPTS) {
83
+ timer = setTimeout(tryFocus, FOCUS_RETRY_MS);
84
+ }
85
+ };
86
+ tryFocus();
87
+ return () => clearTimeout(timer);
88
+ }, [open, targetSelector, triggerId]);
89
+ }
90
+ export {
91
+ buttonProps,
92
+ onButtonKeys,
93
+ segmentPaneId,
94
+ useFocusOnKeyboardOpen,
95
+ useReturnFocus
96
+ };
@@ -50,6 +50,8 @@ export declare const SELECTOR_IDS: {
50
50
  readonly LOGIN_BUTTON: "foxNavLoginButton";
51
51
  readonly LOGO: "foxNavLogo";
52
52
  readonly LOGOUT_BUTTON_MOBILE: "foxNavLogoutButtonMobile";
53
+ /** Корень большого меню — цель `aria-controls` кнопки «Меню». Не легаси: добавлен для ARIA. */
54
+ readonly MENU: "foxNavMenu";
53
55
  readonly MENU_BUTTON: "foxNavMenuButton";
54
56
  readonly NAVIGATION: "foxNav";
55
57
  readonly ONE_CLICK_MENU: "foxNavOneClickMenu";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc;;;;CAIjB,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAA;AAE/E,eAAO,MAAM,eAAe;;;;;CAKlB,CAAA;AAEV,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAA;AAExF,eAAO,MAAM,sBAAsB;;;;CAIzB,CAAA;AAEV,eAAO,MAAM,QAAQ,kDAAkD,CAAA;AAEvE,eAAO,MAAM,oCAAoC,KAAK,CAAA;AAEtD,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAE1C,eAAO,MAAM,wCAAwC,KAAK,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB;IAC5B,wBAAwB;;IAExB,YAAY;;IAEZ,gEAAgE;;IAEhE,iBAAiB;;CAET,CAAA;AAEV,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,eAAO,MAAM,oCAAoC,UAAc,CAAA;AAE/D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Cf,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc;;;;CAIjB,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAA;AAE/E,eAAO,MAAM,eAAe;;;;;CAKlB,CAAA;AAEV,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAA;AAExF,eAAO,MAAM,sBAAsB;;;;CAIzB,CAAA;AAEV,eAAO,MAAM,QAAQ,kDAAkD,CAAA;AAEvE,eAAO,MAAM,oCAAoC,KAAK,CAAA;AAEtD,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAE1C,eAAO,MAAM,wCAAwC,KAAK,CAAA;AAE1D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB;IAC5B,wBAAwB;;IAExB,YAAY;;IAEZ,gEAAgE;;IAEhE,iBAAiB;;CAET,CAAA;AAEV,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,eAAO,MAAM,oCAAoC,UAAc,CAAA;AAE/D,eAAO,MAAM,YAAY;;;;;;IAMvB,+FAA+F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CvF,CAAA"}
@@ -24,6 +24,8 @@ const SELECTOR_IDS = {
24
24
  LOGIN_BUTTON: "foxNavLoginButton",
25
25
  LOGO: "foxNavLogo",
26
26
  LOGOUT_BUTTON_MOBILE: "foxNavLogoutButtonMobile",
27
+ /** Корень большого меню — цель `aria-controls` кнопки «Меню». Не легаси: добавлен для ARIA. */
28
+ MENU: "foxNavMenu",
27
29
  MENU_BUTTON: "foxNavMenuButton",
28
30
  NAVIGATION: "foxNav",
29
31
  ONE_CLICK_MENU: "foxNavOneClickMenu",
@@ -0,0 +1,6 @@
1
+ export interface JsonLdProps {
2
+ data: Record<string, unknown>;
3
+ }
4
+ export declare function serializeJsonLd(data: Record<string, unknown>): string;
5
+ export declare function JsonLd({ data }: JsonLdProps): import("preact").JSX.Element;
6
+ //# sourceMappingURL=json-ld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-ld.d.ts","sourceRoot":"","sources":["../../src/shared/json-ld.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAErE;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,WAAW,gCAK3C"}
@@ -0,0 +1,18 @@
1
+ import { jsx } from "preact/jsx-runtime";
2
+ function serializeJsonLd(data) {
3
+ return JSON.stringify(data).replace(/</g, "\\u003c");
4
+ }
5
+ function JsonLd({
6
+ data
7
+ }) {
8
+ return jsx("script", {
9
+ dangerouslySetInnerHTML: {
10
+ __html: serializeJsonLd(data)
11
+ },
12
+ type: "application/ld+json"
13
+ });
14
+ }
15
+ export {
16
+ JsonLd,
17
+ serializeJsonLd
18
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/shared/theme.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;0BAmBsijM,CAAC,iBAAiB,CAAC;sCAAuE,CAAC;;;;;;;;;;;;;;;;aAAoc,CAAC;cAAqC,CAAC;aAAqC,CAAC;kBAAyC,CAAC;cAA0C,CAAC;aAAqC,CAAC;cAAqC,CAAC;gBAAwC,CAAC;YAAsC,CAAC;kBAAwC,CAAC;iBAA6C,CAAC;gBAA2C,CAAC;eAAyC,CAAC;wBAAiD,CAAC;oBAAsD,CAAC;sBAAoD,CAAC;gBAAkD,CAAC;WAAqC,CAAC;YAAiC,CAAC;sBAA4C,CAAC;gBAA6C,CAAC;eAAyC,CAAC;wBAAiD,CAAC;YAA8C,CAAC;qBAA2C,CAAC;cAA6C,CAAC;uBAA+C,CAAC;oBAAqD,CAAC;iBAA+C,CAAC;qBAAgD,CAAC;gBAA+C,CAAC;cAAwC,CAAC;eAAuC,CAAC;kBAA2C,CAAC;;CAb9gnM,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAA;AAOhC,OAAO,QAAQ,mBAAmB,CAAC;IAEjC,UAAiB,YAAa,SAAQ,KAAK;KAAG;CAC/C"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/shared/theme.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;0BAmBoq+M,CAAC,iBAAiB,CAAC;sCAAuE,CAAC;;;;;;;;;;;;;;;;aAAoc,CAAC;cAAqC,CAAC;aAAqC,CAAC;kBAAyC,CAAC;cAA0C,CAAC;aAAqC,CAAC;cAAqC,CAAC;gBAAwC,CAAC;YAAsC,CAAC;kBAAwC,CAAC;iBAA6C,CAAC;gBAA2C,CAAC;eAAyC,CAAC;wBAAiD,CAAC;oBAAsD,CAAC;sBAAoD,CAAC;gBAAkD,CAAC;WAAqC,CAAC;YAAiC,CAAC;sBAA4C,CAAC;gBAA6C,CAAC;eAAyC,CAAC;wBAAiD,CAAC;YAA8C,CAAC;qBAA2C,CAAC;cAA6C,CAAC;uBAA+C,CAAC;oBAAqD,CAAC;iBAA+C,CAAC;qBAAgD,CAAC;gBAA+C,CAAC;cAAwC,CAAC;eAAuC,CAAC;kBAA2C,CAAC;;CAb5oiN,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAA;AAOhC,OAAO,QAAQ,mBAAmB,CAAC;IAEjC,UAAiB,YAAa,SAAQ,KAAK;KAAG;CAC/C"}