@trebired/frontend 12.14.2 → 12.16.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 (158) hide show
  1. package/.trebired/bundler/config.ts +1 -1
  2. package/CHANGELOG.md +19 -0
  3. package/dist/config/scss.d.ts.map +1 -1
  4. package/dist/config/scss.js +1 -0
  5. package/dist/config/scss.js.map +1 -1
  6. package/dist/config/types.d.ts +1 -1
  7. package/dist/config/types.d.ts.map +1 -1
  8. package/dist/language/index.d.ts +1 -0
  9. package/dist/language/index.d.ts.map +1 -1
  10. package/dist/language/index.js +1 -0
  11. package/dist/language/index.js.map +1 -1
  12. package/dist/language/messages.d.ts.map +1 -1
  13. package/dist/language/messages.js +14 -0
  14. package/dist/language/messages.js.map +1 -1
  15. package/dist/language/routing/boot.d.ts +4 -0
  16. package/dist/language/routing/boot.d.ts.map +1 -0
  17. package/dist/language/routing/boot.js +42 -0
  18. package/dist/language/routing/boot.js.map +1 -0
  19. package/dist/language/routing/index.d.ts +8 -0
  20. package/dist/language/routing/index.d.ts.map +1 -0
  21. package/dist/language/routing/index.js +5 -0
  22. package/dist/language/routing/index.js.map +1 -0
  23. package/dist/language/routing/options.d.ts +18 -0
  24. package/dist/language/routing/options.d.ts.map +1 -0
  25. package/dist/language/routing/options.js +34 -0
  26. package/dist/language/routing/options.js.map +1 -0
  27. package/dist/language/routing/path.d.ts +20 -0
  28. package/dist/language/routing/path.d.ts.map +1 -0
  29. package/dist/language/routing/path.js +43 -0
  30. package/dist/language/routing/path.js.map +1 -0
  31. package/dist/language/routing/runtime.d.ts +12 -0
  32. package/dist/language/routing/runtime.d.ts.map +1 -0
  33. package/dist/language/routing/runtime.js +51 -0
  34. package/dist/language/routing/runtime.js.map +1 -0
  35. package/dist/media/carousel-state.d.ts +13 -0
  36. package/dist/media/carousel-state.d.ts.map +1 -0
  37. package/dist/media/carousel-state.js +41 -0
  38. package/dist/media/carousel-state.js.map +1 -0
  39. package/dist/media/carousel.d.ts +16 -0
  40. package/dist/media/carousel.d.ts.map +1 -0
  41. package/dist/media/carousel.js +18 -0
  42. package/dist/media/carousel.js.map +1 -0
  43. package/dist/media/expandable-image.d.ts +13 -0
  44. package/dist/media/expandable-image.d.ts.map +1 -0
  45. package/dist/media/expandable-image.js +21 -0
  46. package/dist/media/expandable-image.js.map +1 -0
  47. package/dist/media/focus-trap.d.ts +5 -0
  48. package/dist/media/focus-trap.d.ts.map +1 -0
  49. package/dist/media/focus-trap.js +41 -0
  50. package/dist/media/focus-trap.js.map +1 -0
  51. package/dist/media/gallery-state.d.ts +14 -0
  52. package/dist/media/gallery-state.d.ts.map +1 -0
  53. package/dist/media/gallery-state.js +26 -0
  54. package/dist/media/gallery-state.js.map +1 -0
  55. package/dist/media/index.d.ts +13 -10
  56. package/dist/media/index.d.ts.map +1 -1
  57. package/dist/media/index.js +7 -28
  58. package/dist/media/index.js.map +1 -1
  59. package/dist/media/lightbox.d.ts +16 -0
  60. package/dist/media/lightbox.d.ts.map +1 -0
  61. package/dist/media/lightbox.js +57 -0
  62. package/dist/media/lightbox.js.map +1 -0
  63. package/dist/media/map-embed.d.ts +9 -0
  64. package/dist/media/map-embed.d.ts.map +1 -0
  65. package/dist/media/map-embed.js +6 -0
  66. package/dist/media/map-embed.js.map +1 -0
  67. package/dist/media/scroll-lock.d.ts +3 -0
  68. package/dist/media/scroll-lock.d.ts.map +1 -0
  69. package/dist/media/scroll-lock.js +22 -0
  70. package/dist/media/scroll-lock.js.map +1 -0
  71. package/dist/media/styles/carousel.scss +79 -0
  72. package/dist/media/styles/index.scss +2 -0
  73. package/dist/media/styles/lightbox.scss +173 -0
  74. package/dist/react/index.d.ts +4 -0
  75. package/dist/react/index.d.ts.map +1 -1
  76. package/dist/react/index.js +2 -0
  77. package/dist/react/index.js.map +1 -1
  78. package/dist/react/locale.d.ts +15 -0
  79. package/dist/react/locale.d.ts.map +1 -0
  80. package/dist/react/locale.js +19 -0
  81. package/dist/react/locale.js.map +1 -0
  82. package/dist/src/config/scss.d.ts.map +1 -1
  83. package/dist/src/config/scss.js +1 -0
  84. package/dist/src/config/scss.js.map +1 -1
  85. package/dist/src/config/types.d.ts +1 -1
  86. package/dist/src/config/types.d.ts.map +1 -1
  87. package/dist/src/language/index.d.ts +1 -0
  88. package/dist/src/language/index.d.ts.map +1 -1
  89. package/dist/src/language/index.js +1 -0
  90. package/dist/src/language/index.js.map +1 -1
  91. package/dist/src/language/messages.d.ts.map +1 -1
  92. package/dist/src/language/messages.js +14 -0
  93. package/dist/src/language/messages.js.map +1 -1
  94. package/dist/src/language/routing/boot.d.ts +4 -0
  95. package/dist/src/language/routing/boot.d.ts.map +1 -0
  96. package/dist/src/language/routing/boot.js +42 -0
  97. package/dist/src/language/routing/boot.js.map +1 -0
  98. package/dist/src/language/routing/index.d.ts +8 -0
  99. package/dist/src/language/routing/index.d.ts.map +1 -0
  100. package/dist/src/language/routing/index.js +5 -0
  101. package/dist/src/language/routing/index.js.map +1 -0
  102. package/dist/src/language/routing/options.d.ts +18 -0
  103. package/dist/src/language/routing/options.d.ts.map +1 -0
  104. package/dist/src/language/routing/options.js +34 -0
  105. package/dist/src/language/routing/options.js.map +1 -0
  106. package/dist/src/language/routing/path.d.ts +20 -0
  107. package/dist/src/language/routing/path.d.ts.map +1 -0
  108. package/dist/src/language/routing/path.js +43 -0
  109. package/dist/src/language/routing/path.js.map +1 -0
  110. package/dist/src/language/routing/runtime.d.ts +12 -0
  111. package/dist/src/language/routing/runtime.d.ts.map +1 -0
  112. package/dist/src/language/routing/runtime.js +51 -0
  113. package/dist/src/language/routing/runtime.js.map +1 -0
  114. package/dist/src/media/carousel-state.d.ts +13 -0
  115. package/dist/src/media/carousel-state.d.ts.map +1 -0
  116. package/dist/src/media/carousel-state.js +41 -0
  117. package/dist/src/media/carousel-state.js.map +1 -0
  118. package/dist/src/media/carousel.d.ts +16 -0
  119. package/dist/src/media/carousel.d.ts.map +1 -0
  120. package/dist/src/media/carousel.js +18 -0
  121. package/dist/src/media/carousel.js.map +1 -0
  122. package/dist/src/media/expandable-image.d.ts +13 -0
  123. package/dist/src/media/expandable-image.d.ts.map +1 -0
  124. package/dist/src/media/expandable-image.js +21 -0
  125. package/dist/src/media/expandable-image.js.map +1 -0
  126. package/dist/src/media/focus-trap.d.ts +5 -0
  127. package/dist/src/media/focus-trap.d.ts.map +1 -0
  128. package/dist/src/media/focus-trap.js +41 -0
  129. package/dist/src/media/focus-trap.js.map +1 -0
  130. package/dist/src/media/gallery-state.d.ts +14 -0
  131. package/dist/src/media/gallery-state.d.ts.map +1 -0
  132. package/dist/src/media/gallery-state.js +26 -0
  133. package/dist/src/media/gallery-state.js.map +1 -0
  134. package/dist/src/media/index.d.ts +13 -10
  135. package/dist/src/media/index.d.ts.map +1 -1
  136. package/dist/src/media/index.js +7 -28
  137. package/dist/src/media/index.js.map +1 -1
  138. package/dist/src/media/lightbox.d.ts +16 -0
  139. package/dist/src/media/lightbox.d.ts.map +1 -0
  140. package/dist/src/media/lightbox.js +57 -0
  141. package/dist/src/media/lightbox.js.map +1 -0
  142. package/dist/src/media/map-embed.d.ts +9 -0
  143. package/dist/src/media/map-embed.d.ts.map +1 -0
  144. package/dist/src/media/map-embed.js +6 -0
  145. package/dist/src/media/map-embed.js.map +1 -0
  146. package/dist/src/media/scroll-lock.d.ts +3 -0
  147. package/dist/src/media/scroll-lock.d.ts.map +1 -0
  148. package/dist/src/media/scroll-lock.js +22 -0
  149. package/dist/src/media/scroll-lock.js.map +1 -0
  150. package/dist/src/react/index.d.ts +4 -0
  151. package/dist/src/react/index.d.ts.map +1 -1
  152. package/dist/src/react/index.js +2 -0
  153. package/dist/src/react/index.js.map +1 -1
  154. package/dist/src/react/locale.d.ts +15 -0
  155. package/dist/src/react/locale.d.ts.map +1 -0
  156. package/dist/src/react/locale.js +19 -0
  157. package/dist/src/react/locale.js.map +1 -0
  158. package/package.json +2 -2
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "../icons/react/index.js";
3
+ import { sourceLanguageMessage } from "../language/messages.js";
4
+ import { useCarouselState } from "./carousel-state.js";
5
+ const ICON_CHEVRON_LEFT = "remixicon:arrow-left-s-line";
6
+ const ICON_CHEVRON_RIGHT = "remixicon:arrow-right-s-line";
7
+ function Carousel(props) {
8
+ const slides = props.slides ?? [];
9
+ const state = useCarouselState(slides.length, props.intervalMs ?? 5000);
10
+ const label = (key, vars) => sourceLanguageMessage(key, props.lang, vars);
11
+ const showControls = props.controls !== false && slides.length > 1;
12
+ const showIndicators = props.indicators !== false && slides.length > 1;
13
+ if (!slides.length)
14
+ return null;
15
+ return (_jsxs("div", { className: ["tbf-carousel", props.className].filter(Boolean).join(" "), onBlur: state.onLeave, onFocus: state.onEnter, onMouseEnter: state.onEnter, onMouseLeave: state.onLeave, children: [slides.map((slide, index) => (_jsx("img", { alt: slide.alt ?? "", "aria-hidden": index === state.activeIndex ? undefined : "true", className: `tbf-carousel-slide${index === state.activeIndex ? " is-active" : ""}`, src: slide.src }, slide.src))), showControls && (_jsxs(_Fragment, { children: [_jsx("button", { "aria-label": label("mediaSlidePrevious"), className: "tbf-carousel-nav tbf-carousel-nav-prev", onClick: state.showPrevious, type: "button", children: _jsx(Icon, { spec: ICON_CHEVRON_LEFT }) }), _jsx("button", { "aria-label": label("mediaSlideNext"), className: "tbf-carousel-nav tbf-carousel-nav-next", onClick: state.showNext, type: "button", children: _jsx(Icon, { spec: ICON_CHEVRON_RIGHT }) })] })), showIndicators && (_jsx("div", { className: "tbf-carousel-dots", children: slides.map((slide, index) => (_jsx("button", { "aria-current": index === state.activeIndex ? "true" : undefined, "aria-label": label("mediaSlide", { index: index + 1 }), className: `tbf-carousel-dot${index === state.activeIndex ? " is-active" : ""}`, onClick: () => state.showAt(index), type: "button" }, slide.src))) }))] }));
16
+ }
17
+ export { Carousel };
18
+ //# sourceMappingURL=carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../../src/media/carousel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ type ExpandableImageProps = {
2
+ alt: string;
3
+ className?: string;
4
+ imageClassName?: string;
5
+ images?: readonly string[];
6
+ index?: number;
7
+ lang?: string;
8
+ src: string;
9
+ };
10
+ declare function ExpandableImage(props: ExpandableImageProps): import("react").JSX.Element;
11
+ export { ExpandableImage };
12
+ export type { ExpandableImageProps };
13
+ //# sourceMappingURL=expandable-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expandable-image.d.ts","sourceRoot":"","sources":["../../../src/media/expandable-image.tsx"],"names":[],"mappings":"AASA,KAAK,oBAAoB,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAMF,iBAAS,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BA4CnD;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { Icon } from "../icons/react/index.js";
4
+ import { sourceLanguageMessage } from "../language/messages.js";
5
+ import { useGalleryState } from "./gallery-state.js";
6
+ import { Lightbox } from "./lightbox.js";
7
+ const ICON_MAXIMIZE = "remixicon:fullscreen-line";
8
+ function galleryAlt(alt, length, index) {
9
+ return length > 1 ? `${alt} ${index + 1}` : alt;
10
+ }
11
+ function ExpandableImage(props) {
12
+ const gallery = props.images?.length ? [...props.images] : [props.src];
13
+ const start = Math.min(Math.max(props.index ?? 0, 0), gallery.length - 1);
14
+ const titleId = useId();
15
+ const state = useGalleryState(gallery.length, start);
16
+ const thumbnailAlt = galleryAlt(props.alt, gallery.length, start);
17
+ const label = sourceLanguageMessage("mediaExpand", props.lang, { alt: thumbnailAlt });
18
+ return (_jsxs(_Fragment, { children: [_jsxs("button", { "aria-label": label, className: ["tbf-expandable-image", props.className].filter(Boolean).join(" "), onClick: () => state.expand(start), type: "button", children: [_jsx("img", { alt: thumbnailAlt, className: ["tbf-expandable-image-img", props.imageClassName].filter(Boolean).join(" "), loading: "lazy", src: props.src }), _jsx("span", { className: "tbf-expandable-image-icon", children: _jsx(Icon, { spec: ICON_MAXIMIZE }) })] }), state.open && (_jsx(Lightbox, { alt: galleryAlt(props.alt, gallery.length, state.activeIndex), close: state.close, hasNext: state.activeIndex < gallery.length - 1, hasPrevious: state.activeIndex > 0, lang: props.lang, showNext: state.showNext, showPrevious: state.showPrevious, src: gallery[state.activeIndex] ?? props.src, titleId: titleId, visible: state.visible }))] }));
19
+ }
20
+ export { ExpandableImage };
21
+ //# sourceMappingURL=expandable-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expandable-image.js","sourceRoot":"","sources":["../../../src/media/expandable-image.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ declare function focusableWithin(root: HTMLElement): HTMLElement[];
2
+ declare function trapTabKey(root: HTMLElement, event: KeyboardEvent): void;
3
+ declare function captureFocus(root: HTMLElement): () => void;
4
+ export { captureFocus, focusableWithin, trapTabKey };
5
+ //# sourceMappingURL=focus-trap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-trap.d.ts","sourceRoot":"","sources":["../../../src/media/focus-trap.ts"],"names":[],"mappings":"AASA,iBAAS,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,CAGzD;AAED,iBAAS,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAmBjE;AAED,iBAAS,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CAQnD;AAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,41 @@
1
+ const FOCUSABLE = [
2
+ "a[href]",
3
+ "button:not([disabled])",
4
+ "input:not([disabled])",
5
+ "select:not([disabled])",
6
+ "textarea:not([disabled])",
7
+ '[tabindex]:not([tabindex="-1"])',
8
+ ].join(",");
9
+ function focusableWithin(root) {
10
+ return Array.from(root.querySelectorAll(FOCUSABLE))
11
+ .filter((node) => node.offsetWidth > 0 || node.offsetHeight > 0 || node === document.activeElement);
12
+ }
13
+ function trapTabKey(root, event) {
14
+ const focusable = focusableWithin(root);
15
+ if (!focusable.length) {
16
+ event.preventDefault();
17
+ return;
18
+ }
19
+ const first = focusable[0];
20
+ const last = focusable[focusable.length - 1];
21
+ const active = document.activeElement;
22
+ if (!event.shiftKey && active === last) {
23
+ event.preventDefault();
24
+ first.focus();
25
+ return;
26
+ }
27
+ if (event.shiftKey && (active === first || !root.contains(active))) {
28
+ event.preventDefault();
29
+ last.focus();
30
+ }
31
+ }
32
+ function captureFocus(root) {
33
+ const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;
34
+ const focusable = focusableWithin(root);
35
+ (focusable[0] ?? root).focus();
36
+ return () => {
37
+ previous?.focus();
38
+ };
39
+ }
40
+ export { captureFocus, focusableWithin, trapTabKey };
41
+ //# sourceMappingURL=focus-trap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-trap.js","sourceRoot":"","sources":["../../../src/media/focus-trap.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG;IAChB,SAAS;IACT,wBAAwB;IACxB,uBAAuB;IACvB,wBAAwB;IACxB,0BAA0B;IAC1B,iCAAiC;CAClC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,SAAS,eAAe,CAAC,IAAiB;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,SAAS,CAAC,CAAC;SAC/D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,KAAK,QAAQ,CAAC,aAAa,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB,EAAE,KAAoB;IACzD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC;IAEtC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACvC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACnE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAiB;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,YAAY,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/F,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IAE/B,OAAO,GAAG,EAAE;QACV,QAAQ,EAAE,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ declare const CLOSE_ANIMATION_MS = 320;
2
+ type GalleryState = {
3
+ activeIndex: number;
4
+ close: () => void;
5
+ expand: (index: number) => void;
6
+ open: boolean;
7
+ showNext: () => void;
8
+ showPrevious: () => void;
9
+ visible: boolean;
10
+ };
11
+ declare function useGalleryState(length: number, initialIndex: number): GalleryState;
12
+ export { CLOSE_ANIMATION_MS, useGalleryState };
13
+ export type { GalleryState };
14
+ //# sourceMappingURL=gallery-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gallery-state.d.ts","sourceRoot":"","sources":["../../../src/media/gallery-state.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,kBAAkB,MAAM,CAAC;AAE/B,KAAK,YAAY,GAAG;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,iBAAS,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CA2B3E;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ const CLOSE_ANIMATION_MS = 320;
3
+ function useGalleryState(length, initialIndex) {
4
+ const [open, setOpen] = useState(false);
5
+ const [visible, setVisible] = useState(false);
6
+ const [index, setIndex] = useState(initialIndex);
7
+ const closeTimer = useRef(undefined);
8
+ const activeIndex = Math.min(Math.max(index, 0), Math.max(length - 1, 0));
9
+ const close = useCallback(() => {
10
+ setVisible(false);
11
+ window.clearTimeout(closeTimer.current);
12
+ closeTimer.current = window.setTimeout(() => setOpen(false), CLOSE_ANIMATION_MS);
13
+ }, []);
14
+ const expand = useCallback((next) => {
15
+ window.clearTimeout(closeTimer.current);
16
+ setIndex(next);
17
+ setOpen(true);
18
+ window.requestAnimationFrame(() => setVisible(true));
19
+ }, []);
20
+ const showPrevious = useCallback(() => setIndex((current) => Math.max(current - 1, 0)), []);
21
+ const showNext = useCallback(() => setIndex((current) => Math.min(current + 1, length - 1)), [length]);
22
+ useEffect(() => () => window.clearTimeout(closeTimer.current), []);
23
+ return { activeIndex, close, expand, open, showNext, showPrevious, visible };
24
+ }
25
+ export { CLOSE_ANIMATION_MS, useGalleryState };
26
+ //# sourceMappingURL=gallery-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gallery-state.js","sourceRoot":"","sources":["../../../src/media/gallery-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAY/B,SAAS,eAAe,CAAC,MAAc,EAAE,YAAoB;IAC3D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IAEzD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1E,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACnF,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvG,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAC/E,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC"}
@@ -1,11 +1,14 @@
1
- type MediaState = {
2
- available: boolean;
3
- id: string;
4
- image: string;
5
- };
6
- declare function mediaState(value: unknown): MediaState;
7
- declare function mediaImage(value: unknown): string;
8
- declare function mediaAvailable(value: unknown): boolean;
9
- export { mediaAvailable, mediaImage, mediaState };
10
- export type { MediaState };
1
+ export { Carousel } from "./carousel.js";
2
+ export type { CarouselProps, CarouselSlide } from "./carousel.js";
3
+ export { prefersReducedMotion, useCarouselState } from "./carousel-state.js";
4
+ export type { CarouselState } from "./carousel-state.js";
5
+ export { ExpandableImage } from "./expandable-image.js";
6
+ export type { ExpandableImageProps } from "./expandable-image.js";
7
+ export { useGalleryState } from "./gallery-state.js";
8
+ export type { GalleryState } from "./gallery-state.js";
9
+ export { Lightbox } from "./lightbox.js";
10
+ export type { LightboxProps } from "./lightbox.js";
11
+ export { MapEmbed } from "./map-embed.js";
12
+ export type { MapEmbedProps } from "./map-embed.js";
13
+ export { lockBodyScroll } from "./scroll-lock.js";
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/media/index.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,GAAG;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAQF,iBAAS,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAiB9C;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,OAAO,UAEjC;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,OAAO,WAErC;AAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,29 +1,8 @@
1
- import { toString } from "../data/index.js";
2
- function mediaText(value) {
3
- return typeof value === "string" || typeof value === "number"
4
- ? toString(value)
5
- : "";
6
- }
7
- function mediaState(value) {
8
- const current = value && typeof value === "object" && !Array.isArray(value)
9
- ? value
10
- : null;
11
- const image = current
12
- ? toString(current.image || current.url || current.avatar_url || current.avatarUrl)
13
- : mediaText(value);
14
- const id = toString(current?.id);
15
- const available = current ? current.available === true : Boolean(image);
16
- return {
17
- available,
18
- id,
19
- image,
20
- };
21
- }
22
- function mediaImage(value) {
23
- return mediaState(value).image;
24
- }
25
- function mediaAvailable(value) {
26
- return mediaState(value).available;
27
- }
28
- export { mediaAvailable, mediaImage, mediaState };
1
+ export { Carousel } from "./carousel.js";
2
+ export { prefersReducedMotion, useCarouselState } from "./carousel-state.js";
3
+ export { ExpandableImage } from "./expandable-image.js";
4
+ export { useGalleryState } from "./gallery-state.js";
5
+ export { Lightbox } from "./lightbox.js";
6
+ export { MapEmbed } from "./map-embed.js";
7
+ export { lockBodyScroll } from "./scroll-lock.js";
29
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQzC,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC7D,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjB,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,OAAO,GACb,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3D,CAAC,CAAC,KAAgC;QAClC,CAAC,CAAC,IAAI,CAAC;IACP,MAAM,KAAK,GAAG,OAAO;QACrB,CAAC,CAAC,QAAQ,CACR,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,CACxE;QACD,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO;QACL,SAAS;QACT,EAAE;QACF,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACjC,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,16 @@
1
+ type LightboxProps = {
2
+ alt: string;
3
+ close: () => void;
4
+ hasNext: boolean;
5
+ hasPrevious: boolean;
6
+ lang?: string;
7
+ showNext: () => void;
8
+ showPrevious: () => void;
9
+ src: string;
10
+ titleId: string;
11
+ visible: boolean;
12
+ };
13
+ declare function Lightbox(props: LightboxProps): import("react").ReactPortal;
14
+ export { Lightbox };
15
+ export type { LightboxProps };
16
+ //# sourceMappingURL=lightbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightbox.d.ts","sourceRoot":"","sources":["../../../src/media/lightbox.tsx"],"names":[],"mappings":"AAYA,KAAK,aAAa,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAkCF,iBAAS,QAAQ,CAAC,KAAK,EAAE,aAAa,+BAyDrC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { Icon } from "../icons/react/index.js";
5
+ import { sourceLanguageMessage } from "../language/messages.js";
6
+ import { captureFocus, trapTabKey } from "./focus-trap.js";
7
+ import { lockBodyScroll } from "./scroll-lock.js";
8
+ const ICON_CHEVRON_LEFT = "remixicon:arrow-left-s-line";
9
+ const ICON_CHEVRON_RIGHT = "remixicon:arrow-right-s-line";
10
+ const ICON_CLOSE = "remixicon:close-line";
11
+ function stop(event) {
12
+ event.stopPropagation();
13
+ }
14
+ function useLightboxShell(close, showNext, showPrevious) {
15
+ const panel = useRef(null);
16
+ useEffect(() => {
17
+ const node = panel.current;
18
+ if (!node)
19
+ return undefined;
20
+ const releaseScroll = lockBodyScroll();
21
+ const restoreFocus = captureFocus(node);
22
+ function onKeyDown(event) {
23
+ if (event.key === "Escape")
24
+ close();
25
+ if (event.key === "ArrowLeft")
26
+ showPrevious();
27
+ if (event.key === "ArrowRight")
28
+ showNext();
29
+ if (event.key === "Tab" && panel.current)
30
+ trapTabKey(panel.current, event);
31
+ }
32
+ window.addEventListener("keydown", onKeyDown);
33
+ return () => {
34
+ window.removeEventListener("keydown", onKeyDown);
35
+ releaseScroll();
36
+ restoreFocus();
37
+ };
38
+ }, [close, showNext, showPrevious]);
39
+ return panel;
40
+ }
41
+ function Lightbox(props) {
42
+ const panel = useLightboxShell(props.close, props.showNext, props.showPrevious);
43
+ const label = (key, vars) => sourceLanguageMessage(key, props.lang, vars);
44
+ const state = props.visible ? " is-visible" : "";
45
+ const node = (_jsxs("div", { "aria-labelledby": props.titleId, "aria-modal": "true", className: `tbf-lightbox${state}`, onClick: props.close, ref: panel, role: "dialog", tabIndex: -1, children: [_jsx("button", { "aria-label": label("mediaClose"), className: "tbf-lightbox-close", onClick: props.close, type: "button", children: _jsx(Icon, { spec: ICON_CLOSE }) }), props.hasPrevious && (_jsx("button", { "aria-label": label("mediaPrevious"), className: "tbf-lightbox-nav tbf-lightbox-nav-prev", onClick: (event) => {
46
+ stop(event);
47
+ props.showPrevious();
48
+ }, type: "button", children: _jsx(Icon, { spec: ICON_CHEVRON_LEFT }) })), props.hasNext && (_jsx("button", { "aria-label": label("mediaNext"), className: "tbf-lightbox-nav tbf-lightbox-nav-next", onClick: (event) => {
49
+ stop(event);
50
+ props.showNext();
51
+ }, type: "button", children: _jsx(Icon, { spec: ICON_CHEVRON_RIGHT }) })), _jsxs("div", { className: "tbf-lightbox-viewer", onClick: stop, children: [_jsx("h2", { className: "sr-only", id: props.titleId, children: props.alt }), _jsx("img", { alt: props.alt, className: "tbf-lightbox-img", src: props.src }), _jsx("p", { className: "tbf-lightbox-caption", children: props.alt })] })] }));
52
+ if (typeof document === "undefined")
53
+ return null;
54
+ return createPortal(node, document.body);
55
+ }
56
+ export { Lightbox };
57
+ //# sourceMappingURL=lightbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightbox.js","sourceRoot":"","sources":["../../../src/media/lightbox.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type MapEmbedProps = {
2
+ className?: string;
3
+ src: string;
4
+ title: string;
5
+ };
6
+ declare function MapEmbed({ className, src, title }: MapEmbedProps): import("react").JSX.Element;
7
+ export { MapEmbed };
8
+ export type { MapEmbedProps };
9
+ //# sourceMappingURL=map-embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-embed.d.ts","sourceRoot":"","sources":["../../../src/media/map-embed.tsx"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,aAAa,+BAczD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ function MapEmbed({ className, src, title }) {
3
+ return (_jsx("iframe", { allowFullScreen: true, className: ["tbf-map-embed", className].filter(Boolean).join(" "), height: "100%", loading: "lazy", referrerPolicy: "no-referrer-when-downgrade", src: src, style: { border: 0 }, title: title, width: "100%" }));
4
+ }
5
+ export { MapEmbed };
6
+ //# sourceMappingURL=map-embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-embed.js","sourceRoot":"","sources":["../../../src/media/map-embed.tsx"],"names":[],"mappings":";AAMA,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAiB;IACxD,OAAO,CACL,iBACA,eAAe,QACf,SAAS,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACjE,MAAM,EAAC,MAAM,EACb,OAAO,EAAC,MAAM,EACd,cAAc,EAAC,4BAA4B,EAC3C,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EACpB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAC,MAAM,GACV,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare function lockBodyScroll(): () => void;
2
+ export { lockBodyScroll };
3
+ //# sourceMappingURL=scroll-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-lock.d.ts","sourceRoot":"","sources":["../../../src/media/scroll-lock.ts"],"names":[],"mappings":"AAGA,iBAAS,cAAc,IAAI,MAAM,IAAI,CAgBpC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ let lockCount = 0;
2
+ let previousOverflow = "";
3
+ function lockBodyScroll() {
4
+ if (typeof document === "undefined")
5
+ return () => undefined;
6
+ if (lockCount === 0) {
7
+ previousOverflow = document.body.style.overflow;
8
+ document.body.style.overflow = "hidden";
9
+ }
10
+ lockCount += 1;
11
+ let released = false;
12
+ return () => {
13
+ if (released)
14
+ return;
15
+ released = true;
16
+ lockCount = Math.max(lockCount - 1, 0);
17
+ if (lockCount === 0)
18
+ document.body.style.overflow = previousOverflow;
19
+ };
20
+ }
21
+ export { lockBodyScroll };
22
+ //# sourceMappingURL=scroll-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-lock.js","sourceRoot":"","sources":["../../../src/media/scroll-lock.ts"],"names":[],"mappings":"AAAA,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,gBAAgB,GAAG,EAAE,CAAC;AAE1B,SAAS,cAAc;IACrB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IAE5D,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1C,CAAC;IACD,SAAS,IAAI,CAAC,CAAC;IAEf,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CAAC;IACvE,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,79 @@
1
+ .tbf-carousel {
2
+ position: relative;
3
+ overflow: hidden;
4
+ }
5
+
6
+ .tbf-carousel-slide {
7
+ position: absolute;
8
+ inset: 0;
9
+ height: 100%;
10
+ width: 100%;
11
+ object-fit: cover;
12
+ opacity: 0;
13
+ transition: opacity 1000ms ease;
14
+ }
15
+
16
+ .tbf-carousel-slide.is-active {
17
+ position: relative;
18
+ opacity: 1;
19
+ }
20
+
21
+ .tbf-carousel-nav {
22
+ position: absolute;
23
+ top: 50%;
24
+ display: flex;
25
+ height: 2.75rem;
26
+ width: 2.75rem;
27
+ align-items: center;
28
+ justify-content: center;
29
+ transform: translateY(-50%);
30
+ border: none;
31
+ border-radius: 999px;
32
+ background: oklch(14.5% 0 0 / 35%);
33
+ color: var(--white-500, #fff);
34
+ cursor: pointer;
35
+ transition: background 180ms ease;
36
+ }
37
+
38
+ .tbf-carousel-nav:hover {
39
+ background: oklch(14.5% 0 0 / 55%);
40
+ }
41
+
42
+ .tbf-carousel-nav-prev {
43
+ left: 0.75rem;
44
+ }
45
+
46
+ .tbf-carousel-nav-next {
47
+ right: 0.75rem;
48
+ }
49
+
50
+ .tbf-carousel-dots {
51
+ position: absolute;
52
+ bottom: 0.9rem;
53
+ left: 50%;
54
+ display: flex;
55
+ gap: 0.4rem;
56
+ transform: translateX(-50%);
57
+ }
58
+
59
+ .tbf-carousel-dot {
60
+ height: 0.5rem;
61
+ width: 0.5rem;
62
+ border: none;
63
+ border-radius: 999px;
64
+ background: oklch(100% 0 0 / 55%);
65
+ cursor: pointer;
66
+ padding: 0;
67
+ transition: background 180ms ease, width 180ms ease;
68
+ }
69
+
70
+ .tbf-carousel-dot.is-active {
71
+ width: 1.75rem;
72
+ background: oklch(100% 0 0 / 95%);
73
+ }
74
+
75
+ @media (prefers-reduced-motion: reduce) {
76
+ .tbf-carousel-slide {
77
+ transition: none;
78
+ }
79
+ }
@@ -0,0 +1,2 @@
1
+ @use "./lightbox.scss";
2
+ @use "./carousel.scss";