@redneckz/wildless-cms-uni-blocks 0.8.8 → 0.8.9

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/bundle/EventBus/EventBus.d.ts +1 -4
  2. package/bundle/EventBus/defaultEventBus.d.ts +7 -0
  3. package/bundle/blocks.schema.json +1 -1
  4. package/bundle/bundle.umd.js +31 -66
  5. package/bundle/bundle.umd.min.js +1 -1
  6. package/bundle/components/ButtonBlock/ButtonBlockContent.d.ts +5 -1
  7. package/bundle/hooks/useRouter.d.ts +6 -2
  8. package/bundle/services/BlockRouter/BlockRouter.d.ts +3 -22
  9. package/bundle/services/BlockRouter/blockRouterEventBus.d.ts +11 -0
  10. package/bundle/services/BlockRouter/useBlockIntersectionObserver.d.ts +1 -2
  11. package/bundle/services/BlockRouter/useBlockRouterProvider.d.ts +1 -2
  12. package/dist/EventBus/EventBus.d.ts +1 -4
  13. package/dist/EventBus/EventBus.js +0 -1
  14. package/dist/EventBus/EventBus.js.map +1 -1
  15. package/dist/EventBus/defaultEventBus.d.ts +7 -0
  16. package/dist/EventBus/defaultEventBus.js +5 -0
  17. package/dist/EventBus/defaultEventBus.js.map +1 -0
  18. package/dist/components/ButtonBlock/ButtonBlock.js +2 -1
  19. package/dist/components/ButtonBlock/ButtonBlock.js.map +1 -1
  20. package/dist/components/ButtonBlock/ButtonBlockContent.d.ts +5 -1
  21. package/dist/components/Tabs/Tabs.js +4 -4
  22. package/dist/components/Tabs/Tabs.js.map +1 -1
  23. package/dist/hooks/useLink.js +2 -3
  24. package/dist/hooks/useLink.js.map +1 -1
  25. package/dist/hooks/useRouter.d.ts +6 -2
  26. package/dist/hooks/useRouter.js.map +1 -1
  27. package/dist/services/BlockRouter/BlockRouter.d.ts +3 -22
  28. package/dist/services/BlockRouter/BlockRouter.js +11 -30
  29. package/dist/services/BlockRouter/BlockRouter.js.map +1 -1
  30. package/dist/services/BlockRouter/blockRouterEventBus.d.ts +11 -0
  31. package/dist/services/BlockRouter/blockRouterEventBus.js +5 -0
  32. package/dist/services/BlockRouter/blockRouterEventBus.js.map +1 -0
  33. package/dist/services/BlockRouter/useBlockIntersectionObserver.d.ts +1 -2
  34. package/dist/services/BlockRouter/useBlockIntersectionObserver.js +5 -16
  35. package/dist/services/BlockRouter/useBlockIntersectionObserver.js.map +1 -1
  36. package/dist/services/BlockRouter/useBlockRouterProvider.d.ts +1 -2
  37. package/dist/services/BlockRouter/useBlockRouterProvider.js +11 -12
  38. package/dist/services/BlockRouter/useBlockRouterProvider.js.map +1 -1
  39. package/dist/ui-kit/BlockWrapper.js +2 -2
  40. package/dist/ui-kit/BlockWrapper.js.map +1 -1
  41. package/lib/EventBus/EventBus.d.ts +1 -4
  42. package/lib/EventBus/EventBus.js +0 -1
  43. package/lib/EventBus/EventBus.js.map +1 -1
  44. package/lib/EventBus/defaultEventBus.d.ts +7 -0
  45. package/lib/EventBus/defaultEventBus.js +3 -0
  46. package/lib/EventBus/defaultEventBus.js.map +1 -0
  47. package/lib/common.css +1 -1
  48. package/lib/components/ButtonBlock/ButtonBlock.js +2 -1
  49. package/lib/components/ButtonBlock/ButtonBlock.js.map +1 -1
  50. package/lib/components/ButtonBlock/ButtonBlockContent.d.ts +5 -1
  51. package/lib/components/Tabs/Tabs.js +4 -4
  52. package/lib/components/Tabs/Tabs.js.map +1 -1
  53. package/lib/hooks/useLink.js +2 -3
  54. package/lib/hooks/useLink.js.map +1 -1
  55. package/lib/hooks/useRouter.d.ts +6 -2
  56. package/lib/hooks/useRouter.js.map +1 -1
  57. package/lib/services/BlockRouter/BlockRouter.d.ts +3 -22
  58. package/lib/services/BlockRouter/BlockRouter.js +8 -28
  59. package/lib/services/BlockRouter/BlockRouter.js.map +1 -1
  60. package/lib/services/BlockRouter/blockRouterEventBus.d.ts +11 -0
  61. package/lib/services/BlockRouter/blockRouterEventBus.js +3 -0
  62. package/lib/services/BlockRouter/blockRouterEventBus.js.map +1 -0
  63. package/lib/services/BlockRouter/useBlockIntersectionObserver.d.ts +1 -2
  64. package/lib/services/BlockRouter/useBlockIntersectionObserver.js +6 -17
  65. package/lib/services/BlockRouter/useBlockIntersectionObserver.js.map +1 -1
  66. package/lib/services/BlockRouter/useBlockRouterProvider.d.ts +1 -2
  67. package/lib/services/BlockRouter/useBlockRouterProvider.js +12 -13
  68. package/lib/services/BlockRouter/useBlockRouterProvider.js.map +1 -1
  69. package/lib/ui-kit/BlockWrapper.js +2 -2
  70. package/lib/ui-kit/BlockWrapper.js.map +1 -1
  71. package/mobile/bundle/EventBus/EventBus.d.ts +1 -4
  72. package/mobile/bundle/EventBus/defaultEventBus.d.ts +7 -0
  73. package/mobile/bundle/bundle.umd.js +27 -62
  74. package/mobile/bundle/bundle.umd.min.js +1 -1
  75. package/mobile/bundle/components/ButtonBlock/ButtonBlockContent.d.ts +5 -1
  76. package/mobile/bundle/hooks/useRouter.d.ts +6 -2
  77. package/mobile/bundle/services/BlockRouter/BlockRouter.d.ts +3 -22
  78. package/mobile/bundle/services/BlockRouter/blockRouterEventBus.d.ts +11 -0
  79. package/mobile/bundle/services/BlockRouter/useBlockIntersectionObserver.d.ts +1 -2
  80. package/mobile/bundle/services/BlockRouter/useBlockRouterProvider.d.ts +1 -2
  81. package/mobile/dist/EventBus/EventBus.d.ts +1 -4
  82. package/mobile/dist/EventBus/EventBus.js +0 -1
  83. package/mobile/dist/EventBus/EventBus.js.map +1 -1
  84. package/mobile/dist/EventBus/defaultEventBus.d.ts +7 -0
  85. package/mobile/dist/EventBus/defaultEventBus.js +5 -0
  86. package/mobile/dist/EventBus/defaultEventBus.js.map +1 -0
  87. package/mobile/dist/components/ButtonBlock/ButtonBlock.js +2 -1
  88. package/mobile/dist/components/ButtonBlock/ButtonBlock.js.map +1 -1
  89. package/mobile/dist/components/ButtonBlock/ButtonBlockContent.d.ts +5 -1
  90. package/mobile/dist/components/Tabs/Tabs.js +4 -4
  91. package/mobile/dist/components/Tabs/Tabs.js.map +1 -1
  92. package/mobile/dist/hooks/useLink.js +2 -3
  93. package/mobile/dist/hooks/useLink.js.map +1 -1
  94. package/mobile/dist/hooks/useRouter.d.ts +6 -2
  95. package/mobile/dist/hooks/useRouter.js.map +1 -1
  96. package/mobile/dist/services/BlockRouter/BlockRouter.d.ts +3 -22
  97. package/mobile/dist/services/BlockRouter/BlockRouter.js +11 -30
  98. package/mobile/dist/services/BlockRouter/BlockRouter.js.map +1 -1
  99. package/mobile/dist/services/BlockRouter/blockRouterEventBus.d.ts +11 -0
  100. package/mobile/dist/services/BlockRouter/blockRouterEventBus.js +5 -0
  101. package/mobile/dist/services/BlockRouter/blockRouterEventBus.js.map +1 -0
  102. package/mobile/dist/services/BlockRouter/useBlockIntersectionObserver.d.ts +1 -2
  103. package/mobile/dist/services/BlockRouter/useBlockIntersectionObserver.js +5 -16
  104. package/mobile/dist/services/BlockRouter/useBlockIntersectionObserver.js.map +1 -1
  105. package/mobile/dist/services/BlockRouter/useBlockRouterProvider.d.ts +1 -2
  106. package/mobile/dist/services/BlockRouter/useBlockRouterProvider.js +11 -12
  107. package/mobile/dist/services/BlockRouter/useBlockRouterProvider.js.map +1 -1
  108. package/mobile/dist/ui-kit/BlockWrapper.js +2 -2
  109. package/mobile/dist/ui-kit/BlockWrapper.js.map +1 -1
  110. package/mobile/lib/EventBus/EventBus.d.ts +1 -4
  111. package/mobile/lib/EventBus/EventBus.js +0 -1
  112. package/mobile/lib/EventBus/EventBus.js.map +1 -1
  113. package/mobile/lib/EventBus/defaultEventBus.d.ts +7 -0
  114. package/mobile/lib/EventBus/defaultEventBus.js +3 -0
  115. package/mobile/lib/EventBus/defaultEventBus.js.map +1 -0
  116. package/mobile/lib/components/ButtonBlock/ButtonBlock.js +2 -1
  117. package/mobile/lib/components/ButtonBlock/ButtonBlock.js.map +1 -1
  118. package/mobile/lib/components/ButtonBlock/ButtonBlockContent.d.ts +5 -1
  119. package/mobile/lib/components/Tabs/Tabs.js +4 -4
  120. package/mobile/lib/components/Tabs/Tabs.js.map +1 -1
  121. package/mobile/lib/hooks/useLink.js +2 -3
  122. package/mobile/lib/hooks/useLink.js.map +1 -1
  123. package/mobile/lib/hooks/useRouter.d.ts +6 -2
  124. package/mobile/lib/hooks/useRouter.js.map +1 -1
  125. package/mobile/lib/services/BlockRouter/BlockRouter.d.ts +3 -22
  126. package/mobile/lib/services/BlockRouter/BlockRouter.js +8 -28
  127. package/mobile/lib/services/BlockRouter/BlockRouter.js.map +1 -1
  128. package/mobile/lib/services/BlockRouter/blockRouterEventBus.d.ts +11 -0
  129. package/mobile/lib/services/BlockRouter/blockRouterEventBus.js +3 -0
  130. package/mobile/lib/services/BlockRouter/blockRouterEventBus.js.map +1 -0
  131. package/mobile/lib/services/BlockRouter/useBlockIntersectionObserver.d.ts +1 -2
  132. package/mobile/lib/services/BlockRouter/useBlockIntersectionObserver.js +6 -17
  133. package/mobile/lib/services/BlockRouter/useBlockIntersectionObserver.js.map +1 -1
  134. package/mobile/lib/services/BlockRouter/useBlockRouterProvider.d.ts +1 -2
  135. package/mobile/lib/services/BlockRouter/useBlockRouterProvider.js +12 -13
  136. package/mobile/lib/services/BlockRouter/useBlockRouterProvider.js.map +1 -1
  137. package/mobile/lib/ui-kit/BlockWrapper.js +2 -2
  138. package/mobile/lib/ui-kit/BlockWrapper.js.map +1 -1
  139. package/mobile/src/EventBus/EventBus.ts +1 -7
  140. package/mobile/src/EventBus/defaultEventBus.ts +8 -0
  141. package/mobile/src/components/ButtonBlock/ButtonBlock.example.json +2 -2
  142. package/mobile/src/components/ButtonBlock/ButtonBlock.tsx +5 -2
  143. package/mobile/src/components/ButtonBlock/ButtonBlockContent.ts +5 -1
  144. package/mobile/src/components/Tabs/Tabs.tsx +4 -4
  145. package/mobile/src/hooks/useLink.ts +2 -3
  146. package/mobile/src/hooks/useRouter.ts +6 -2
  147. package/mobile/src/services/BlockRouter/BlockRouter.ts +8 -47
  148. package/mobile/src/services/BlockRouter/blockRouterEventBus.ts +13 -0
  149. package/mobile/src/services/BlockRouter/useBlockIntersectionObserver.ts +6 -23
  150. package/mobile/src/services/BlockRouter/useBlockRouterProvider.ts +13 -19
  151. package/mobile/src/ui-kit/BlockWrapper.tsx +2 -2
  152. package/package.json +1 -1
  153. package/src/EventBus/EventBus.ts +1 -7
  154. package/src/EventBus/defaultEventBus.ts +8 -0
  155. package/src/components/ButtonBlock/ButtonBlock.example.json +2 -2
  156. package/src/components/ButtonBlock/ButtonBlock.tsx +5 -2
  157. package/src/components/ButtonBlock/ButtonBlockContent.ts +5 -1
  158. package/src/components/Tabs/Tabs.tsx +4 -4
  159. package/src/hooks/useLink.ts +2 -3
  160. package/src/hooks/useRouter.ts +6 -2
  161. package/src/services/BlockRouter/BlockRouter.ts +8 -47
  162. package/src/services/BlockRouter/blockRouterEventBus.ts +13 -0
  163. package/src/services/BlockRouter/useBlockIntersectionObserver.ts +6 -23
  164. package/src/services/BlockRouter/useBlockRouterProvider.ts +13 -19
  165. package/src/ui-kit/BlockWrapper.tsx +2 -2
  166. package/bundle/EventBus/EventMap.d.ts +0 -4
  167. package/bundle/services/BlockRouter/useBlockRouter.d.ts +0 -2
  168. package/dist/EventBus/EventMap.d.ts +0 -4
  169. package/dist/EventBus/EventMap.js +0 -2
  170. package/dist/EventBus/EventMap.js.map +0 -1
  171. package/dist/services/BlockRouter/useBlockRouter.d.ts +0 -2
  172. package/dist/services/BlockRouter/useBlockRouter.js +0 -8
  173. package/dist/services/BlockRouter/useBlockRouter.js.map +0 -1
  174. package/lib/EventBus/EventMap.d.ts +0 -4
  175. package/lib/EventBus/EventMap.js +0 -2
  176. package/lib/EventBus/EventMap.js.map +0 -1
  177. package/lib/services/BlockRouter/useBlockRouter.d.ts +0 -2
  178. package/lib/services/BlockRouter/useBlockRouter.js +0 -5
  179. package/lib/services/BlockRouter/useBlockRouter.js.map +0 -1
  180. package/mobile/bundle/EventBus/EventMap.d.ts +0 -4
  181. package/mobile/bundle/services/BlockRouter/useBlockRouter.d.ts +0 -2
  182. package/mobile/dist/EventBus/EventMap.d.ts +0 -4
  183. package/mobile/dist/EventBus/EventMap.js +0 -2
  184. package/mobile/dist/EventBus/EventMap.js.map +0 -1
  185. package/mobile/dist/services/BlockRouter/useBlockRouter.d.ts +0 -2
  186. package/mobile/dist/services/BlockRouter/useBlockRouter.js +0 -8
  187. package/mobile/dist/services/BlockRouter/useBlockRouter.js.map +0 -1
  188. package/mobile/lib/EventBus/EventMap.d.ts +0 -4
  189. package/mobile/lib/EventBus/EventMap.js +0 -2
  190. package/mobile/lib/EventBus/EventMap.js.map +0 -1
  191. package/mobile/lib/services/BlockRouter/useBlockRouter.d.ts +0 -2
  192. package/mobile/lib/services/BlockRouter/useBlockRouter.js +0 -5
  193. package/mobile/lib/services/BlockRouter/useBlockRouter.js.map +0 -1
  194. package/mobile/src/EventBus/EventMap.ts +0 -5
  195. package/mobile/src/services/BlockRouter/useBlockRouter.ts +0 -5
  196. package/src/EventBus/EventMap.ts +0 -5
  197. package/src/services/BlockRouter/useBlockRouter.ts +0 -5
@@ -0,0 +1,11 @@
1
+ import { EventBus } from '../../EventBus/EventBus';
2
+ import type { BlockDef } from '../../model/ContentPageDef';
3
+ export interface BlockIntersectionEvent {
4
+ block: BlockDef;
5
+ intersection: IntersectionObserverEntry;
6
+ }
7
+ interface EventMap {
8
+ intersection: BlockIntersectionEvent;
9
+ }
10
+ export declare const blockRouterEventBus: EventBus<EventMap>;
11
+ export {};
@@ -0,0 +1,3 @@
1
+ import { EventBus } from '../../EventBus/EventBus.js';
2
+ export const blockRouterEventBus = new EventBus();
3
+ //# sourceMappingURL=blockRouterEventBus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockRouterEventBus.js","sourceRoot":"","sources":["../../../src/services/BlockRouter/blockRouterEventBus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAYnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,QAAQ,EAAY,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import type { BlockDef } from '../../model/ContentPageDef';
2
- import { BlockRouter } from './BlockRouter';
3
- export declare function useBlockIntersectionObserver(block?: BlockDef, router?: BlockRouter): {
2
+ export declare function useBlockIntersectionObserver(block?: BlockDef): {
4
3
  current: Element | null;
5
4
  };
@@ -1,25 +1,14 @@
1
- import { useCallback, useEffect } from '@redneckz/uni-jsx/lib/hooks';
1
+ import { useCallback } from '@redneckz/uni-jsx/lib/hooks';
2
2
  import { useIntersectionObserver } from '../../hooks/useIntersectionObserver.js';
3
- import { BlockRouter } from './BlockRouter.js';
4
- export function useBlockIntersectionObserver(block, router = BlockRouter.inst) {
3
+ import { blockRouterEventBus } from './blockRouterEventBus.js';
4
+ export function useBlockIntersectionObserver(block) {
5
5
  const observerCallback = useCallback((entries) => {
6
6
  if (!block || !entries?.length) {
7
7
  return;
8
8
  }
9
9
  const intersection = entries[entries.length - 1];
10
- router.eventBus.fire('intersection', { block, intersection });
11
- }, [block, router]);
12
- const ref = useIntersectionObserver(observerCallback, { sensitivity: 1 });
13
- useEffect(() => {
14
- if (!ref.current) {
15
- return undefined;
16
- }
17
- return router.eventBus.subscribe('goto', ({ anchor }) => {
18
- if (ref.current && block?.anchor === anchor) {
19
- ref.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
20
- }
21
- });
22
- }, [block, router]);
23
- return ref;
10
+ blockRouterEventBus.fire('intersection', { block, intersection });
11
+ }, [block]);
12
+ return useIntersectionObserver(observerCallback, { sensitivity: 1 });
24
13
  }
25
14
  //# sourceMappingURL=useBlockIntersectionObserver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBlockIntersectionObserver.js","sourceRoot":"","sources":["../../../src/services/BlockRouter/useBlockIntersectionObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,4BAA4B,CAC1C,KAAgB,EAChB,SAAsB,WAAW,CAAC,IAAI;IAEtC,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,OAAoC,EAAE,EAAE;QACvC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;YAC9B,OAAO;SACR;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC,EACD,CAAC,KAAK,EAAE,MAAM,CAAC,CAChB,CAAC;IAEF,MAAM,GAAG,GAAG,uBAAuB,CAAC,gBAAgB,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAE1E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAChB,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACtD,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE;gBAC3C,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;aACpE;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"useBlockIntersectionObserver.js","sourceRoot":"","sources":["../../../src/services/BlockRouter/useBlockIntersectionObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,4BAA4B,CAAC,KAAgB;IAC3D,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,OAAoC,EAAE,EAAE;QACvC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;YAC9B,OAAO;SACR;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjD,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,uBAAuB,CAAC,gBAAgB,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;AACvE,CAAC"}
@@ -1,2 +1 @@
1
- import { BlockRouter } from './BlockRouter';
2
- export declare function useBlockRouterProvider(router?: BlockRouter, scrollTarget?: EventTarget): void;
1
+ export declare function useBlockRouterProvider(scrollTarget?: EventTarget): void;
@@ -1,27 +1,26 @@
1
1
  import { useEffect, useRef } from '@redneckz/uni-jsx/lib/hooks';
2
+ import { useRouter } from '../../hooks/useRouter.js';
2
3
  import { debounce } from '../../utils/debounce.js';
3
- import { BlockRouter } from './BlockRouter.js';
4
+ import { trackBlock } from './BlockRouter.js';
5
+ import { blockRouterEventBus } from './blockRouterEventBus.js';
4
6
  import { findActiveBlock } from './findActiveBlock.js';
5
7
  const isScrolledEnough = () => globalThis.scrollY > (globalThis.innerHeight * 3) / 4;
6
- export function useBlockRouterProvider(router = BlockRouter.inst, scrollTarget = globalThis) {
8
+ export function useBlockRouterProvider(scrollTarget = globalThis) {
9
+ const router = useRouter();
7
10
  const intersectionsMapRef = useRef(new Map());
8
- useEffect(() => router.eventBus.subscribe('intersection', ({ block, intersection }) => {
11
+ useEffect(() => blockRouterEventBus.subscribe('intersection', ({ block, intersection }) => {
9
12
  if (intersectionsMapRef.current) {
10
13
  intersectionsMapRef.current.set(block, intersection);
11
14
  }
12
- }), [router]);
15
+ }), []);
13
16
  useEffect(() => {
14
17
  const handleScroll = debounce(() => {
15
- if (!isScrolledEnough()) {
16
- router.reset();
17
- return;
18
+ if (isScrolledEnough()) {
19
+ const activeBlock = findActiveBlock([...(intersectionsMapRef.current || [])]);
20
+ trackBlock(router, activeBlock);
18
21
  }
19
- const activeBlock = findActiveBlock([...(intersectionsMapRef.current || [])]);
20
- if (activeBlock?.anchor) {
21
- router.replace(activeBlock.anchor);
22
- }
23
- else if (!activeBlock) {
24
- router.reset();
22
+ else {
23
+ trackBlock(router);
25
24
  }
26
25
  }, 100);
27
26
  scrollTarget.addEventListener('scroll', handleScroll);
@@ -1 +1 @@
1
- {"version":3,"file":"useBlockRouterProvider.js","sourceRoot":"","sources":["../../../src/services/BlockRouter/useBlockRouterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAErF,MAAM,UAAU,sBAAsB,CACpC,SAAsB,WAAW,CAAC,IAAI,EACtC,eAA4B,UAAU;IAEtC,MAAM,mBAAmB,GAAG,MAAM,CAA2C,IAAI,GAAG,EAAE,CAAC,CAAC;IAExF,SAAS,CACP,GAAG,EAAE,CACH,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACpE,IAAI,mBAAmB,CAAC,OAAO,EAAE;YAC/B,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;SACtD;IACH,CAAC,CAAC,EACJ,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBACvB,MAAM,CAAC,KAAK,EAAE,CAAC;gBAEf,OAAO;aACR;YAED,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9E,IAAI,WAAW,EAAE,MAAM,EAAE;gBACvB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aACpC;iBAAM,IAAI,CAAC,WAAW,EAAE;gBACvB,MAAM,CAAC,KAAK,EAAE,CAAC;aAChB;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEtD,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,EAAE,CAAC;YACvB,YAAY,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC3D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"useBlockRouterProvider.js","sourceRoot":"","sources":["../../../src/services/BlockRouter/useBlockRouterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAErF,MAAM,UAAU,sBAAsB,CAAC,eAA4B,UAAU;IAC3E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,mBAAmB,GAAG,MAAM,CAA2C,IAAI,GAAG,EAAE,CAAC,CAAC;IAExF,SAAS,CACP,GAAG,EAAE,CACH,mBAAmB,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACxE,IAAI,mBAAmB,CAAC,OAAO,EAAE;YAC/B,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;SACtD;IACH,CAAC,CAAC,EACJ,EAAE,CACH,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE;YACjC,IAAI,gBAAgB,EAAE,EAAE;gBACtB,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9E,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;aACjC;iBAAM;gBACL,UAAU,CAAC,MAAM,CAAC,CAAC;aACpB;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEtD,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,EAAE,CAAC;YACvB,YAAY,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC3D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAC7B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "@redneckz/uni-jsx/jsx-runtime";
2
2
  import { JSX } from '@redneckz/uni-jsx';
3
3
  import { useEffect, useState } from '@redneckz/uni-jsx/lib/hooks';
4
- import { EventBus } from '../EventBus/EventBus.js';
4
+ import { defaultEventBus } from '../EventBus/defaultEventBus.js';
5
5
  import { useBlockIntersectionObserver } from '../services/BlockRouter/useBlockIntersectionObserver.js';
6
6
  import { style } from '../utils/style.js';
7
7
  export const blockStyles = {
@@ -15,7 +15,7 @@ export const BlockWrapper = JSX(({ className = '', version = 'primary', block, t
15
15
  const Tag = tag;
16
16
  const ref = useBlockIntersectionObserver(block);
17
17
  const [isVisible, setVisible] = useState(true);
18
- useEffect(() => EventBus.inst.subscribe('tab', (event) => {
18
+ useEffect(() => defaultEventBus.subscribe('tab', (event) => {
19
19
  if (event.type === 'group') {
20
20
  const hasSettings = block?.labels?.length || block?.anchor;
21
21
  setVisible(event.label ? !hasSettings || Boolean(block?.labels?.includes(event.label)) : true);
@@ -1 +1 @@
1
- {"version":3,"file":"BlockWrapper.js","sourceRoot":"","sources":["../../src/ui-kit/BlockWrapper.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,4BAA4B,EAAE,MAAM,sDAAsD,CAAC;AACpG,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAOvC,MAAM,CAAC,MAAM,WAAW,GAAiC;IACvD,OAAO,EAAE,4BAA4B;IACrC,SAAS,EAAE,4BAA4B;IACvC,IAAI,EAAE,mCAAmC;IACzC,WAAW,EAAE,kCAAkC;IAC/C,EAAE,EAAE,EAAE;CACP,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAC7B,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IAClF,MAAM,GAAG,GAAQ,GAAG,CAAC;IAErB,MAAM,GAAG,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CACP,GAAG,EAAE,CACH,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;YAC1B,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC;YAC3D,UAAU,CACR,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACnF,CAAC;SACH;aAAM;YACL,UAAU,CAAC,IAAI,CAAC,CAAC;SAClB;IACH,CAAC,CAAC,EACJ,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,SAAS,CAAC,CAAC,CAAC,CACjB,KAAC,GAAG,IACF,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,KACtD,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACxC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACpD,IAAI,EAAE,IAAI,YAET,QAAQ,GACL,CACP,CAAC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"BlockWrapper.js","sourceRoot":"","sources":["../../src/ui-kit/BlockWrapper.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,sDAAsD,CAAC;AACpG,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAOvC,MAAM,CAAC,MAAM,WAAW,GAAiC;IACvD,OAAO,EAAE,4BAA4B;IACrC,SAAS,EAAE,4BAA4B;IACvC,IAAI,EAAE,mCAAmC;IACzC,WAAW,EAAE,kCAAkC;IAC/C,EAAE,EAAE,EAAE;CACP,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAC7B,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IAClF,MAAM,GAAG,GAAQ,GAAG,CAAC;IAErB,MAAM,GAAG,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CACP,GAAG,EAAE,CACH,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;YAC1B,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC;YAC3D,UAAU,CACR,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACnF,CAAC;SACH;aAAM;YACL,UAAU,CAAC,IAAI,CAAC,CAAC;SAClB;IACH,CAAC,CAAC,EACJ,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,SAAS,CAAC,CAAC,CAAC,CACjB,KAAC,GAAG,IACF,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,KACtD,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACxC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACpD,IAAI,EAAE,IAAI,YAET,QAAQ,GACL,CACP,CAAC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CACF,CAAC"}
@@ -1,10 +1,4 @@
1
- import type { EventMap } from './EventMap';
2
-
3
- export type BaseEventMap = Record<string, any>;
4
-
5
- export class EventBus<EM extends BaseEventMap> {
6
- public static readonly inst = new EventBus<EventMap>();
7
-
1
+ export class EventBus<EM extends Record<string, any>> {
8
2
  private subscribers: Partial<Record<keyof EM, Array<(ev: EM[keyof EM]) => void>>> = {};
9
3
  private subjectsStateMap: Partial<EM> = {};
10
4
 
@@ -0,0 +1,8 @@
1
+ import type { TabActivationEvent } from '../components/Tabs/Tabs';
2
+ import { EventBus } from './EventBus';
3
+
4
+ interface GlobalEventMap {
5
+ tab: TabActivationEvent;
6
+ }
7
+
8
+ export const defaultEventBus = new EventBus<GlobalEventMap>();
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "content": {
3
3
  "button": {
4
- "href": "/credit-cards",
5
- "text": "Подробнее",
4
+ "href": "#",
5
+ "text": "Кнопка",
6
6
  "target": "_blank",
7
7
  "version": "primary"
8
8
  }
@@ -2,10 +2,13 @@ import { JSX } from '@redneckz/uni-jsx';
2
2
  import type { UniBlockProps } from '../../model/JSXBlock';
3
3
  import { BlockWrapper } from '../../ui-kit/BlockWrapper';
4
4
  import { renderButtonsSection } from '../../ui-kit/Button/renderButtonsSection';
5
+ import { style } from '../../utils/style';
5
6
  import type { ButtonBlockContent } from './ButtonBlockContent';
6
7
 
7
8
  interface ButtonBlockProps extends ButtonBlockContent, UniBlockProps {}
8
9
 
9
- export const ButtonBlock = JSX<ButtonBlockProps>(({ button, ...rest }) => (
10
- <BlockWrapper {...rest}>{renderButtonsSection([button])}</BlockWrapper>
10
+ export const ButtonBlock = JSX<ButtonBlockProps>(({ button, className, ...rest }) => (
11
+ <BlockWrapper className={style('!bg-transparent', className)} {...rest}>
12
+ {renderButtonsSection([button])}
13
+ </BlockWrapper>
11
14
  ));
@@ -4,6 +4,10 @@ import type { ButtonWithIconProps } from '../../ui-kit/Button/ButtonProps';
4
4
  * @title Блок Кнопка
5
5
  */
6
6
  export interface ButtonBlockContent {
7
- /** @title Кнопка */
7
+ /**
8
+ * @title Кнопка
9
+ * @default {"icon": {"format": "webp", "size": { "width": 24, "height": 24 }},
10
+ * "iconRight": {"format": "webp", "size": { "width": 24, "height": 24 }}}
11
+ */
8
12
  button?: ButtonWithIconProps;
9
13
  }
@@ -1,6 +1,6 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
2
  import { useCallback, useEffect, useState } from '@redneckz/uni-jsx/lib/hooks';
3
- import { EventBus } from '../../EventBus/EventBus';
3
+ import { defaultEventBus } from '../../EventBus/defaultEventBus';
4
4
  import type { UniBlockProps } from '../../model/JSXBlock';
5
5
  import { BlockWrapper } from '../../ui-kit/BlockWrapper';
6
6
  import { renderTab } from './renderTab';
@@ -21,7 +21,7 @@ export const Tabs = JSX<TabsBlockProps>((props) => {
21
21
 
22
22
  useEffect(
23
23
  () =>
24
- EventBus.inst.subscribe('tab', (event) => {
24
+ defaultEventBus.subscribe('tab', (event) => {
25
25
  const tab = tabs?.find(checkTab(event));
26
26
  if (event.type === 'link' && tab) {
27
27
  setCurrentTab(tab);
@@ -35,14 +35,14 @@ export const Tabs = JSX<TabsBlockProps>((props) => {
35
35
  useEffect(
36
36
  () =>
37
37
  currentTab?.type === 'group'
38
- ? EventBus.inst.subject('tab', { type: currentTab.type, label: currentTab.ref })
38
+ ? defaultEventBus.subject('tab', { type: currentTab.type, label: currentTab.ref })
39
39
  : undefined,
40
40
  [currentTab],
41
41
  );
42
42
 
43
43
  const handleClick = useCallback((selectedTab: TabData) => {
44
44
  if (selectedTab?.type === 'group') {
45
- EventBus.inst.fire('tab', { type: selectedTab.type, label: selectedTab.ref });
45
+ defaultEventBus.fire('tab', { type: selectedTab.type, label: selectedTab.ref });
46
46
  }
47
47
  setCurrentTab(selectedTab);
48
48
  }, []);
@@ -1,6 +1,6 @@
1
1
  import type { LinkProps } from '../model/LinkProps';
2
2
  import { projectSettings } from '../ProjectSettings';
3
- import { useBlockRouter } from '../services/BlockRouter/useBlockRouter';
3
+ import { gotoBlock } from '../services/BlockRouter/BlockRouter';
4
4
  import { isHash, isLocalURL, joinPath } from '../utils/url';
5
5
  import { handlerDecorator } from './handlerDecorator';
6
6
  import { useRouter } from './useRouter';
@@ -15,7 +15,6 @@ interface Clickable {
15
15
 
16
16
  export function useLink(isRemote?: boolean) {
17
17
  const router = useRouter();
18
- const blockRouter = useBlockRouter();
19
18
 
20
19
  return <L extends Partial<LinkProps & Clickable>>(props: L): L & Clickable => ({
21
20
  ...props,
@@ -44,7 +43,7 @@ export function useLink(isRemote?: boolean) {
44
43
  // Client routing
45
44
  ev?.preventDefault();
46
45
  if (isHash(href)) {
47
- blockRouter.goto(href);
46
+ gotoBlock(router, href);
48
47
  } else if (href) {
49
48
  router.push(href);
50
49
  }
@@ -1,10 +1,14 @@
1
+ interface RouterOptions {
2
+ scroll?: boolean;
3
+ }
4
+
1
5
  export interface Router {
2
6
  pathname: string;
3
7
  query: Record<string, string | string[] | undefined>;
4
8
  href?: string;
5
9
  basePath?: string;
6
- push: (url: string) => void;
7
- replace: (url: string) => void;
10
+ push: (url: string, as?: string, options?: RouterOptions) => void;
11
+ replace: (url: string, as?: string, options?: RouterOptions) => void;
8
12
  }
9
13
 
10
14
  export function useRouter(): Router {
@@ -1,53 +1,14 @@
1
- import { EventBus } from '../../EventBus/EventBus';
1
+ import type { Router } from '../../hooks/useRouter';
2
2
  import type { BlockDef } from '../../model/ContentPageDef';
3
3
 
4
- export interface GotoAnchorEvent {
5
- anchor: string;
6
- }
7
-
8
- export interface BlockIntersectionEvent {
9
- block: BlockDef;
10
- intersection: IntersectionObserverEntry;
11
- }
4
+ const normalizeAnchor = (anchor?: string) => anchor?.replace('#', '') || '';
12
5
 
13
- interface EventMap {
14
- goto: GotoAnchorEvent;
15
- intersection: BlockIntersectionEvent;
6
+ export function gotoBlock(router: Router, anchor?: string) {
7
+ router.replace(`#${normalizeAnchor(anchor)}`);
16
8
  }
17
9
 
18
- const normalizeAnchor = (rawAnchor?: string) => rawAnchor?.replace('#', '') || '';
19
- const getURLWithAnchor = (rawAnchor?: string) =>
20
- `${globalThis.location?.pathname}#${normalizeAnchor(rawAnchor)}`;
21
-
22
- export class BlockRouter {
23
- public static readonly inst = new BlockRouter();
24
-
25
- readonly eventBus = new EventBus<EventMap>();
26
-
27
- constructor() {
28
- const anchor = normalizeAnchor(globalThis.location?.hash);
29
- if (anchor) {
30
- this.eventBus.subject('goto', { anchor });
31
- }
32
- }
33
-
34
- goto(rawAnchor?: string) {
35
- const anchor = normalizeAnchor(rawAnchor);
36
- if (anchor) {
37
- this.push(anchor);
38
- this.eventBus.fire('goto', { anchor });
39
- }
40
- }
41
-
42
- push(rawAnchor: string) {
43
- globalThis.history?.pushState(null, '', getURLWithAnchor(rawAnchor));
44
- }
45
-
46
- replace(rawAnchor: string) {
47
- globalThis.history?.replaceState(null, '', getURLWithAnchor(rawAnchor));
48
- }
49
-
50
- reset() {
51
- globalThis.history?.replaceState(null, '', getURLWithAnchor());
52
- }
10
+ export function trackBlock(router: Router, block?: BlockDef) {
11
+ router.replace(`#${normalizeAnchor(block?.anchor)}`, undefined, {
12
+ scroll: false,
13
+ });
53
14
  }
@@ -0,0 +1,13 @@
1
+ import { EventBus } from '../../EventBus/EventBus';
2
+ import type { BlockDef } from '../../model/ContentPageDef';
3
+
4
+ export interface BlockIntersectionEvent {
5
+ block: BlockDef;
6
+ intersection: IntersectionObserverEntry;
7
+ }
8
+
9
+ interface EventMap {
10
+ intersection: BlockIntersectionEvent;
11
+ }
12
+
13
+ export const blockRouterEventBus = new EventBus<EventMap>();
@@ -1,12 +1,9 @@
1
- import { useCallback, useEffect } from '@redneckz/uni-jsx/lib/hooks';
1
+ import { useCallback } from '@redneckz/uni-jsx/lib/hooks';
2
2
  import { useIntersectionObserver } from '../../hooks/useIntersectionObserver';
3
3
  import type { BlockDef } from '../../model/ContentPageDef';
4
- import { BlockRouter } from './BlockRouter';
4
+ import { blockRouterEventBus } from './blockRouterEventBus';
5
5
 
6
- export function useBlockIntersectionObserver(
7
- block?: BlockDef,
8
- router: BlockRouter = BlockRouter.inst,
9
- ) {
6
+ export function useBlockIntersectionObserver(block?: BlockDef) {
10
7
  const observerCallback = useCallback(
11
8
  (entries: IntersectionObserverEntry[]) => {
12
9
  if (!block || !entries?.length) {
@@ -14,24 +11,10 @@ export function useBlockIntersectionObserver(
14
11
  }
15
12
 
16
13
  const intersection = entries[entries.length - 1];
17
- router.eventBus.fire('intersection', { block, intersection });
14
+ blockRouterEventBus.fire('intersection', { block, intersection });
18
15
  },
19
- [block, router],
16
+ [block],
20
17
  );
21
18
 
22
- const ref = useIntersectionObserver(observerCallback, { sensitivity: 1 });
23
-
24
- useEffect(() => {
25
- if (!ref.current) {
26
- return undefined;
27
- }
28
-
29
- return router.eventBus.subscribe('goto', ({ anchor }) => {
30
- if (ref.current && block?.anchor === anchor) {
31
- ref.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
32
- }
33
- });
34
- }, [block, router]);
35
-
36
- return ref;
19
+ return useIntersectionObserver(observerCallback, { sensitivity: 1 });
37
20
  }
@@ -1,41 +1,35 @@
1
1
  import { useEffect, useRef } from '@redneckz/uni-jsx/lib/hooks';
2
+ import { useRouter } from '../../hooks/useRouter';
2
3
  import type { BlockDef } from '../../model/ContentPageDef';
3
4
  import { debounce } from '../../utils/debounce';
4
- import { BlockRouter } from './BlockRouter';
5
+ import { trackBlock } from './BlockRouter';
6
+ import { blockRouterEventBus } from './blockRouterEventBus';
5
7
  import { findActiveBlock } from './findActiveBlock';
6
8
 
7
9
  const isScrolledEnough = () => globalThis.scrollY > (globalThis.innerHeight * 3) / 4;
8
10
 
9
- export function useBlockRouterProvider(
10
- router: BlockRouter = BlockRouter.inst,
11
- scrollTarget: EventTarget = globalThis,
12
- ) {
11
+ export function useBlockRouterProvider(scrollTarget: EventTarget = globalThis) {
12
+ const router = useRouter();
13
+
13
14
  const intersectionsMapRef = useRef<Map<BlockDef, IntersectionObserverEntry>>(new Map());
14
15
 
15
16
  useEffect(
16
17
  () =>
17
- router.eventBus.subscribe('intersection', ({ block, intersection }) => {
18
+ blockRouterEventBus.subscribe('intersection', ({ block, intersection }) => {
18
19
  if (intersectionsMapRef.current) {
19
20
  intersectionsMapRef.current.set(block, intersection);
20
21
  }
21
22
  }),
22
- [router],
23
+ [],
23
24
  );
24
25
 
25
26
  useEffect(() => {
26
27
  const handleScroll = debounce(() => {
27
- if (!isScrolledEnough()) {
28
- router.reset();
29
-
30
- return;
31
- }
32
-
33
- const activeBlock = findActiveBlock([...(intersectionsMapRef.current || [])]);
34
-
35
- if (activeBlock?.anchor) {
36
- router.replace(activeBlock.anchor);
37
- } else if (!activeBlock) {
38
- router.reset();
28
+ if (isScrolledEnough()) {
29
+ const activeBlock = findActiveBlock([...(intersectionsMapRef.current || [])]);
30
+ trackBlock(router, activeBlock);
31
+ } else {
32
+ trackBlock(router);
39
33
  }
40
34
  }, 100);
41
35
 
@@ -1,6 +1,6 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
2
  import { useEffect, useState } from '@redneckz/uni-jsx/lib/hooks';
3
- import { EventBus } from '../EventBus/EventBus';
3
+ import { defaultEventBus } from '../EventBus/defaultEventBus';
4
4
  import type { BlockVersion } from '../model/BlockVersion';
5
5
  import type { UniBlockProps } from '../model/JSXBlock';
6
6
  import { useBlockIntersectionObserver } from '../services/BlockRouter/useBlockIntersectionObserver';
@@ -28,7 +28,7 @@ export const BlockWrapper = JSX<BlockWrapperProps>(
28
28
  const [isVisible, setVisible] = useState(true);
29
29
  useEffect(
30
30
  () =>
31
- EventBus.inst.subscribe('tab', (event) => {
31
+ defaultEventBus.subscribe('tab', (event) => {
32
32
  if (event.type === 'group') {
33
33
  const hasSettings = block?.labels?.length || block?.anchor;
34
34
  setVisible(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redneckz/wildless-cms-uni-blocks",
3
- "version": "0.8.8",
3
+ "version": "0.8.9",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "ЦК",
@@ -1,10 +1,4 @@
1
- import type { EventMap } from './EventMap';
2
-
3
- export type BaseEventMap = Record<string, any>;
4
-
5
- export class EventBus<EM extends BaseEventMap> {
6
- public static readonly inst = new EventBus<EventMap>();
7
-
1
+ export class EventBus<EM extends Record<string, any>> {
8
2
  private subscribers: Partial<Record<keyof EM, Array<(ev: EM[keyof EM]) => void>>> = {};
9
3
  private subjectsStateMap: Partial<EM> = {};
10
4
 
@@ -0,0 +1,8 @@
1
+ import type { TabActivationEvent } from '../components/Tabs/Tabs';
2
+ import { EventBus } from './EventBus';
3
+
4
+ interface GlobalEventMap {
5
+ tab: TabActivationEvent;
6
+ }
7
+
8
+ export const defaultEventBus = new EventBus<GlobalEventMap>();
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "content": {
3
3
  "button": {
4
- "href": "/credit-cards",
5
- "text": "Подробнее",
4
+ "href": "#",
5
+ "text": "Кнопка",
6
6
  "target": "_blank",
7
7
  "version": "primary"
8
8
  }
@@ -2,10 +2,13 @@ import { JSX } from '@redneckz/uni-jsx';
2
2
  import type { UniBlockProps } from '../../model/JSXBlock';
3
3
  import { BlockWrapper } from '../../ui-kit/BlockWrapper';
4
4
  import { renderButtonsSection } from '../../ui-kit/Button/renderButtonsSection';
5
+ import { style } from '../../utils/style';
5
6
  import type { ButtonBlockContent } from './ButtonBlockContent';
6
7
 
7
8
  interface ButtonBlockProps extends ButtonBlockContent, UniBlockProps {}
8
9
 
9
- export const ButtonBlock = JSX<ButtonBlockProps>(({ button, ...rest }) => (
10
- <BlockWrapper {...rest}>{renderButtonsSection([button])}</BlockWrapper>
10
+ export const ButtonBlock = JSX<ButtonBlockProps>(({ button, className, ...rest }) => (
11
+ <BlockWrapper className={style('!bg-transparent', className)} {...rest}>
12
+ {renderButtonsSection([button])}
13
+ </BlockWrapper>
11
14
  ));
@@ -4,6 +4,10 @@ import type { ButtonWithIconProps } from '../../ui-kit/Button/ButtonProps';
4
4
  * @title Блок Кнопка
5
5
  */
6
6
  export interface ButtonBlockContent {
7
- /** @title Кнопка */
7
+ /**
8
+ * @title Кнопка
9
+ * @default {"icon": {"format": "webp", "size": { "width": 24, "height": 24 }},
10
+ * "iconRight": {"format": "webp", "size": { "width": 24, "height": 24 }}}
11
+ */
8
12
  button?: ButtonWithIconProps;
9
13
  }
@@ -1,6 +1,6 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
2
  import { useCallback, useEffect, useState } from '@redneckz/uni-jsx/lib/hooks';
3
- import { EventBus } from '../../EventBus/EventBus';
3
+ import { defaultEventBus } from '../../EventBus/defaultEventBus';
4
4
  import type { UniBlockProps } from '../../model/JSXBlock';
5
5
  import { BlockWrapper } from '../../ui-kit/BlockWrapper';
6
6
  import { renderTab } from './renderTab';
@@ -21,7 +21,7 @@ export const Tabs = JSX<TabsBlockProps>((props) => {
21
21
 
22
22
  useEffect(
23
23
  () =>
24
- EventBus.inst.subscribe('tab', (event) => {
24
+ defaultEventBus.subscribe('tab', (event) => {
25
25
  const tab = tabs?.find(checkTab(event));
26
26
  if (event.type === 'link' && tab) {
27
27
  setCurrentTab(tab);
@@ -35,14 +35,14 @@ export const Tabs = JSX<TabsBlockProps>((props) => {
35
35
  useEffect(
36
36
  () =>
37
37
  currentTab?.type === 'group'
38
- ? EventBus.inst.subject('tab', { type: currentTab.type, label: currentTab.ref })
38
+ ? defaultEventBus.subject('tab', { type: currentTab.type, label: currentTab.ref })
39
39
  : undefined,
40
40
  [currentTab],
41
41
  );
42
42
 
43
43
  const handleClick = useCallback((selectedTab: TabData) => {
44
44
  if (selectedTab?.type === 'group') {
45
- EventBus.inst.fire('tab', { type: selectedTab.type, label: selectedTab.ref });
45
+ defaultEventBus.fire('tab', { type: selectedTab.type, label: selectedTab.ref });
46
46
  }
47
47
  setCurrentTab(selectedTab);
48
48
  }, []);
@@ -1,6 +1,6 @@
1
1
  import type { LinkProps } from '../model/LinkProps';
2
2
  import { projectSettings } from '../ProjectSettings';
3
- import { useBlockRouter } from '../services/BlockRouter/useBlockRouter';
3
+ import { gotoBlock } from '../services/BlockRouter/BlockRouter';
4
4
  import { isHash, isLocalURL, joinPath } from '../utils/url';
5
5
  import { handlerDecorator } from './handlerDecorator';
6
6
  import { useRouter } from './useRouter';
@@ -15,7 +15,6 @@ interface Clickable {
15
15
 
16
16
  export function useLink(isRemote?: boolean) {
17
17
  const router = useRouter();
18
- const blockRouter = useBlockRouter();
19
18
 
20
19
  return <L extends Partial<LinkProps & Clickable>>(props: L): L & Clickable => ({
21
20
  ...props,
@@ -44,7 +43,7 @@ export function useLink(isRemote?: boolean) {
44
43
  // Client routing
45
44
  ev?.preventDefault();
46
45
  if (isHash(href)) {
47
- blockRouter.goto(href);
46
+ gotoBlock(router, href);
48
47
  } else if (href) {
49
48
  router.push(href);
50
49
  }