thread-ui 0.12.1 → 0.13.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 (196) hide show
  1. package/README.md +16 -6
  2. package/dist/components/content-display/carousel/carousel-context.d.ts +48 -0
  3. package/dist/components/content-display/carousel/carousel-context.js +5 -0
  4. package/dist/components/content-display/carousel/carousel-context.js.map +1 -0
  5. package/dist/components/content-display/carousel/carousel.d.ts +18 -0
  6. package/dist/components/content-display/carousel/carousel.js +71 -0
  7. package/dist/components/content-display/carousel/carousel.js.map +1 -0
  8. package/dist/components/content-display/carousel/carousel.types.d.ts +47 -0
  9. package/dist/components/content-display/carousel/carousel.types.js +2 -0
  10. package/dist/components/content-display/carousel/carousel.types.js.map +1 -0
  11. package/dist/components/content-display/carousel/components/carousel-content.d.ts +1 -0
  12. package/dist/components/content-display/carousel/components/carousel-content.js +33 -0
  13. package/dist/components/content-display/carousel/components/carousel-content.js.map +1 -0
  14. package/dist/components/content-display/carousel/components/carousel-controls.d.ts +3 -0
  15. package/dist/components/content-display/carousel/components/carousel-controls.js +27 -0
  16. package/dist/components/content-display/carousel/components/carousel-controls.js.map +1 -0
  17. package/dist/components/content-display/carousel/components/carousel-header.d.ts +1 -0
  18. package/dist/components/content-display/carousel/components/carousel-header.js +24 -0
  19. package/dist/components/content-display/carousel/components/carousel-header.js.map +1 -0
  20. package/dist/components/content-display/carousel/components/carousel-item.d.ts +6 -0
  21. package/dist/components/content-display/carousel/components/carousel-item.js +43 -0
  22. package/dist/components/content-display/carousel/components/carousel-item.js.map +1 -0
  23. package/dist/components/content-display/carousel/components/carousel-items-display.d.ts +1 -0
  24. package/dist/components/content-display/carousel/components/carousel-items-display.js +19 -0
  25. package/dist/components/content-display/carousel/components/carousel-items-display.js.map +1 -0
  26. package/dist/components/content-display/carousel/index.d.ts +2 -0
  27. package/dist/components/content-display/carousel/index.js +2 -0
  28. package/dist/components/content-display/carousel/index.js.map +1 -0
  29. package/dist/components/content-display/gallery/components/gallery-content.d.ts +1 -0
  30. package/dist/components/content-display/gallery/components/gallery-content.js +64 -0
  31. package/dist/components/content-display/gallery/components/gallery-content.js.map +1 -0
  32. package/dist/components/content-display/gallery/components/gallery-header.d.ts +1 -0
  33. package/dist/components/content-display/gallery/components/gallery-header.js +19 -0
  34. package/dist/components/content-display/gallery/components/gallery-header.js.map +1 -0
  35. package/dist/components/content-display/gallery/components/item-display/gallery-item.d.ts +6 -0
  36. package/dist/components/content-display/gallery/components/item-display/gallery-item.js +59 -0
  37. package/dist/components/content-display/gallery/components/item-display/gallery-item.js.map +1 -0
  38. package/dist/components/content-display/gallery/components/item-display/gallery-items-display.d.ts +1 -0
  39. package/dist/components/content-display/gallery/components/item-display/gallery-items-display.js +23 -0
  40. package/dist/components/content-display/gallery/components/item-display/gallery-items-display.js.map +1 -0
  41. package/dist/components/content-display/gallery/components/item-track/item-track.d.ts +1 -0
  42. package/dist/components/content-display/gallery/components/item-track/item-track.js +21 -0
  43. package/dist/components/content-display/gallery/components/item-track/item-track.js.map +1 -0
  44. package/dist/components/content-display/gallery/components/item-track/track-item.d.ts +6 -0
  45. package/dist/components/content-display/gallery/components/item-track/track-item.js +60 -0
  46. package/dist/components/content-display/gallery/components/item-track/track-item.js.map +1 -0
  47. package/dist/components/content-display/gallery/gallery-context.d.ts +45 -0
  48. package/dist/components/content-display/gallery/gallery-context.js +5 -0
  49. package/dist/components/content-display/gallery/gallery-context.js.map +1 -0
  50. package/dist/components/content-display/gallery/gallery-display-constants.d.ts +9 -0
  51. package/dist/components/content-display/gallery/gallery-display-constants.js +15 -0
  52. package/dist/components/content-display/gallery/gallery-display-constants.js.map +1 -0
  53. package/dist/components/content-display/gallery/gallery.d.ts +18 -0
  54. package/dist/components/content-display/gallery/gallery.js +83 -0
  55. package/dist/components/content-display/gallery/gallery.js.map +1 -0
  56. package/dist/components/content-display/gallery/gallery.types.d.ts +47 -0
  57. package/dist/components/content-display/gallery/gallery.types.js +2 -0
  58. package/dist/components/content-display/gallery/gallery.types.js.map +1 -0
  59. package/dist/components/content-display/gallery/index.d.ts +2 -0
  60. package/dist/components/content-display/gallery/index.js +2 -0
  61. package/dist/components/content-display/gallery/index.js.map +1 -0
  62. package/dist/components/content-display/index.d.ts +4 -0
  63. package/dist/components/content-display/index.js +5 -0
  64. package/dist/components/content-display/index.js.map +1 -0
  65. package/dist/components/content-display/lightbox/components/lightbox-content.d.ts +1 -0
  66. package/dist/components/content-display/lightbox/components/lightbox-content.js +19 -0
  67. package/dist/components/content-display/lightbox/components/lightbox-content.js.map +1 -0
  68. package/dist/components/content-display/lightbox/components/lightbox-title.d.ts +1 -0
  69. package/dist/components/content-display/lightbox/components/lightbox-title.js +22 -0
  70. package/dist/components/content-display/lightbox/components/lightbox-title.js.map +1 -0
  71. package/dist/components/content-display/lightbox/index.d.ts +2 -0
  72. package/dist/components/content-display/lightbox/index.js +2 -0
  73. package/dist/components/content-display/lightbox/index.js.map +1 -0
  74. package/dist/components/content-display/lightbox/lightbox-context.d.ts +19 -0
  75. package/dist/components/content-display/lightbox/lightbox-context.js +3 -0
  76. package/dist/components/content-display/lightbox/lightbox-context.js.map +1 -0
  77. package/dist/components/content-display/lightbox/lightbox.d.ts +17 -0
  78. package/dist/components/content-display/lightbox/lightbox.js +46 -0
  79. package/dist/components/content-display/lightbox/lightbox.js.map +1 -0
  80. package/dist/components/content-display/lightbox/lightbox.types.d.ts +11 -0
  81. package/dist/components/content-display/lightbox/lightbox.types.js +2 -0
  82. package/dist/components/content-display/lightbox/lightbox.types.js.map +1 -0
  83. package/dist/components/{ui → content-display}/tab-view/components/tab-item-content.d.ts +2 -1
  84. package/dist/components/{ui → content-display}/tab-view/components/tab-item-content.js +1 -1
  85. package/dist/components/content-display/tab-view/components/tab-item-content.js.map +1 -0
  86. package/dist/components/content-display/tab-view/components/tab-view-content.js.map +1 -0
  87. package/dist/components/content-display/tab-view/components/tab-view-controls.js.map +1 -0
  88. package/dist/components/content-display/tab-view/index.js.map +1 -0
  89. package/dist/components/content-display/tab-view/tab-view-context.d.ts +40 -0
  90. package/dist/components/content-display/tab-view/tab-view-context.js.map +1 -0
  91. package/dist/components/{ui → content-display}/tab-view/tab-view.d.ts +1 -2
  92. package/dist/components/{ui → content-display}/tab-view/tab-view.js +3 -4
  93. package/dist/components/content-display/tab-view/tab-view.js.map +1 -0
  94. package/dist/components/{ui → content-display}/tab-view/tab-view.types.d.ts +7 -11
  95. package/dist/components/content-display/tab-view/tab-view.types.js.map +1 -0
  96. package/dist/components/form-elements/dropdowns/dropdown-base/dropdown-base.js +1 -1
  97. package/dist/components/form-elements/dropdowns/dropdown-base/dropdown-base.js.map +1 -1
  98. package/dist/components/index.d.ts +2 -1
  99. package/dist/components/index.js +2 -1
  100. package/dist/components/index.js.map +1 -1
  101. package/dist/components/layouts/column-layout/column-layout.types.d.ts +4 -2
  102. package/dist/components/layouts/column-layout/column-skeleton/column-skeleton.types.d.ts +3 -2
  103. package/dist/components/layouts/column-layout/index.d.ts +1 -1
  104. package/dist/components/layouts/column-layout/index.js.map +1 -1
  105. package/dist/components/media-display/image-panel/image-panel.js.map +1 -0
  106. package/dist/components/media-display/image-panel/image-panel.types.js.map +1 -0
  107. package/dist/components/media-display/image-panel/index.js.map +1 -0
  108. package/dist/components/media-display/index.js.map +1 -0
  109. package/dist/components/media-display/info-card/index.js.map +1 -0
  110. package/dist/components/media-display/info-card/info-card.js.map +1 -0
  111. package/dist/components/media-display/info-card/info-card.types.js.map +1 -0
  112. package/dist/components/media-display/media-card/index.js.map +1 -0
  113. package/dist/components/media-display/media-card/media-card.js.map +1 -0
  114. package/dist/components/media-display/media-card/media-card.types.js.map +1 -0
  115. package/dist/components/ui/card/card.js +2 -2
  116. package/dist/components/ui/card/card.js.map +1 -1
  117. package/dist/components/ui/index.d.ts +0 -1
  118. package/dist/components/ui/index.js +0 -1
  119. package/dist/components/ui/index.js.map +1 -1
  120. package/dist/components/ui/modal/components/modal-content.js +3 -8
  121. package/dist/components/ui/modal/components/modal-content.js.map +1 -1
  122. package/dist/components/ui/modal/modal-context.d.ts +13 -2
  123. package/dist/components/ui/modal/modal.d.ts +2 -2
  124. package/dist/components/ui/modal/modal.js +4 -22
  125. package/dist/components/ui/modal/modal.js.map +1 -1
  126. package/dist/components/ui/modal/modal.types.d.ts +5 -17
  127. package/dist/hooks/use-click-outside/use-click-outside.d.ts +9 -2
  128. package/dist/hooks/use-click-outside/use-click-outside.js +2 -2
  129. package/dist/hooks/use-click-outside/use-click-outside.js.map +1 -1
  130. package/dist/hooks/use-dismiss/use-dismiss.d.ts +12 -4
  131. package/dist/hooks/use-dismiss/use-dismiss.js +8 -8
  132. package/dist/hooks/use-dismiss/use-dismiss.js.map +1 -1
  133. package/dist/internal-components/index.d.ts +1 -0
  134. package/dist/internal-components/index.js +1 -0
  135. package/dist/internal-components/index.js.map +1 -1
  136. package/dist/internal-components/modal-primitive/index.d.ts +2 -0
  137. package/dist/internal-components/modal-primitive/index.js +2 -0
  138. package/dist/internal-components/modal-primitive/index.js.map +1 -0
  139. package/dist/internal-components/modal-primitive/modal-primitive.d.ts +2 -0
  140. package/dist/internal-components/modal-primitive/modal-primitive.js +35 -0
  141. package/dist/internal-components/modal-primitive/modal-primitive.js.map +1 -0
  142. package/dist/internal-components/modal-primitive/modal-primitive.types.d.ts +21 -0
  143. package/dist/internal-components/modal-primitive/modal-primitive.types.js +2 -0
  144. package/dist/internal-components/modal-primitive/modal-primitive.types.js.map +1 -0
  145. package/dist/styled-system/styles.css +1 -1
  146. package/dist/styles/panda.css +1 -1
  147. package/dist/styles/theme.css +1 -1
  148. package/dist/theme/default-theme.js +1 -1
  149. package/dist/utils/theme-utilities/get-utility-size-value/get-utility-size-value.d.ts +1 -1
  150. package/package.json +4 -2
  151. package/dist/components/media/image-panel/image-panel.js.map +0 -1
  152. package/dist/components/media/image-panel/image-panel.types.js.map +0 -1
  153. package/dist/components/media/image-panel/index.js.map +0 -1
  154. package/dist/components/media/index.js.map +0 -1
  155. package/dist/components/media/info-card/index.js.map +0 -1
  156. package/dist/components/media/info-card/info-card.js.map +0 -1
  157. package/dist/components/media/info-card/info-card.types.js.map +0 -1
  158. package/dist/components/media/media-card/index.js.map +0 -1
  159. package/dist/components/media/media-card/media-card.js.map +0 -1
  160. package/dist/components/media/media-card/media-card.types.js.map +0 -1
  161. package/dist/components/ui/tab-view/components/tab-item-content.js.map +0 -1
  162. package/dist/components/ui/tab-view/components/tab-view-content.js.map +0 -1
  163. package/dist/components/ui/tab-view/components/tab-view-controls.js.map +0 -1
  164. package/dist/components/ui/tab-view/index.js.map +0 -1
  165. package/dist/components/ui/tab-view/tab-view-context.d.ts +0 -34
  166. package/dist/components/ui/tab-view/tab-view-context.js.map +0 -1
  167. package/dist/components/ui/tab-view/tab-view.js.map +0 -1
  168. package/dist/components/ui/tab-view/tab-view.types.js.map +0 -1
  169. /package/dist/components/{ui → content-display}/tab-view/components/tab-view-content.d.ts +0 -0
  170. /package/dist/components/{ui → content-display}/tab-view/components/tab-view-content.js +0 -0
  171. /package/dist/components/{ui → content-display}/tab-view/components/tab-view-controls.d.ts +0 -0
  172. /package/dist/components/{ui → content-display}/tab-view/components/tab-view-controls.js +0 -0
  173. /package/dist/components/{ui → content-display}/tab-view/index.d.ts +0 -0
  174. /package/dist/components/{ui → content-display}/tab-view/index.js +0 -0
  175. /package/dist/components/{ui → content-display}/tab-view/tab-view-context.js +0 -0
  176. /package/dist/components/{ui → content-display}/tab-view/tab-view.types.js +0 -0
  177. /package/dist/components/{media → media-display}/image-panel/image-panel.d.ts +0 -0
  178. /package/dist/components/{media → media-display}/image-panel/image-panel.js +0 -0
  179. /package/dist/components/{media → media-display}/image-panel/image-panel.types.d.ts +0 -0
  180. /package/dist/components/{media → media-display}/image-panel/image-panel.types.js +0 -0
  181. /package/dist/components/{media → media-display}/image-panel/index.d.ts +0 -0
  182. /package/dist/components/{media → media-display}/image-panel/index.js +0 -0
  183. /package/dist/components/{media → media-display}/index.d.ts +0 -0
  184. /package/dist/components/{media → media-display}/index.js +0 -0
  185. /package/dist/components/{media → media-display}/info-card/index.d.ts +0 -0
  186. /package/dist/components/{media → media-display}/info-card/index.js +0 -0
  187. /package/dist/components/{media → media-display}/info-card/info-card.d.ts +0 -0
  188. /package/dist/components/{media → media-display}/info-card/info-card.js +0 -0
  189. /package/dist/components/{media → media-display}/info-card/info-card.types.d.ts +0 -0
  190. /package/dist/components/{media → media-display}/info-card/info-card.types.js +0 -0
  191. /package/dist/components/{media → media-display}/media-card/index.d.ts +0 -0
  192. /package/dist/components/{media → media-display}/media-card/index.js +0 -0
  193. /package/dist/components/{media → media-display}/media-card/media-card.d.ts +0 -0
  194. /package/dist/components/{media → media-display}/media-card/media-card.js +0 -0
  195. /package/dist/components/{media → media-display}/media-card/media-card.types.d.ts +0 -0
  196. /package/dist/components/{media → media-display}/media-card/media-card.types.js +0 -0
package/README.md CHANGED
@@ -1,11 +1,13 @@
1
1
  # Thread UI
2
2
 
3
- Thread is a React component library I built to create my [personal website](https://fisherandrew.org). It's designed around a clean, token-based theme system with full SSR support, dark mode, and easy customization.
3
+ Thread is a React component library I built to create my [personal website](https://fisherandrew.org). It's designed around a clean, token-based theme system with easy customization, light/dark mode and SSR support.
4
4
 
5
5
  ## Get Started
6
6
 
7
7
  All items work out of the box. Explore thread components at [thread.fisherandrew.org](https://thread.fisherandrew.org)!
8
8
 
9
+ ### Setup
10
+
9
11
  ```bash
10
12
  npm install thread-ui
11
13
  ```
@@ -23,10 +25,12 @@ import 'thread-ui/thread.css';
23
25
 
24
26
  ## Design System
25
27
 
26
- Thread UI uses a **layer-based elevation system**. Every component either sits on a named layer (canvas, inset, surface, elevated, overlay) or opts out entirely (transparent). The layer determines the component's background color, shadow depth, border treatment, and stacking order.
28
+ Thread UI is built around a central `Theme` that defines token values across the library - colors, spacing, type scales. Thread's design language governs how these tokens are applied to communicate hierarchy and intent.
27
29
 
28
30
  ### Surface Layers
29
31
 
32
+ Thread UI uses a **layer-based elevation system**. Every component either sits on a named layer (canvas, inset, surface, elevated, overlay) or opts out entirely (transparent). The layer determines the component's background color, shadow depth, border treatment, and stacking order.
33
+
30
34
  | Layer | Purpose |
31
35
  | ---------- | --------------------------------------------------------------------------- |
32
36
  | `canvas` | Page background. The base everything sits on. |
@@ -43,7 +47,7 @@ Thread UI uses a **layer-based elevation system**. Every component either sits o
43
47
  <Card layer="surface" bg="elevated" shadow="md" structure="none" />
44
48
  ```
45
49
 
46
- ### The Two Rules
50
+ #### The Two Rules
47
51
 
48
52
  1. **Light mode communicates elevation through shadows.** Surface, elevated, and overlay share the same background color — shadows and z-index differentiate them.
49
53
  2. **Dark mode communicates elevation through lightness.** Each layer step up is slightly lighter. Shadows are nearly invisible against dark surfaces.
@@ -74,7 +78,9 @@ return <ThemeProvider theme={customTheme}>{children}</ThemeProvider>;
74
78
 
75
79
  ### Dark Mode
76
80
 
77
- Thread includes a built-in light/dark/system mode system. The `ThreadScript` component injects an inline script into your `<head>` that reads the user's saved preference from `localStorage` and sets `data-theme` on `:root` before the first paint — eliminating any flash of wrong-mode content.
81
+ Thread includes built-in light/dark/system UI modes. Default UI behavior matches the system and works out of the box.
82
+
83
+ To override the default mode, utilize `ThreadScript`. This injects an inline script into your `<head>` that reads the configured default mode, or even the user's saved preference in `localStorage` and sets `data-theme` on `:root` before the first paint — eliminating any flash of wrong-mode content.
78
84
 
79
85
  ```tsx
80
86
  // Next.js App Router
@@ -90,18 +96,22 @@ Thread includes a built-in light/dark/system mode system. The `ThreadScript` com
90
96
 
91
97
  ### SSR Compatible
92
98
 
93
- Component CSS is pre-generated using Panda CSS, so components render correctly server-side without any runtime style injection. Most components are SSR compatible, and all work out of the box with `Next.js`.
99
+ Component CSS is pre-generated using Panda CSS, so components render correctly server-side without any runtime style injection. Most components are SSR compatible, and all client-side components and hooks are marked with `use client` and work out of the box with `Next.js`.
94
100
 
95
101
  ## Components
96
102
 
97
103
  ### UI Elements
98
104
 
99
- `Button` `Card` `Divider` `DotsLoader` `Icon` `IconButton` `Modal` `SkeletonLayoutLoader` `SkeletonLoader` `SpinLoader` `TabView` `Toggle`
105
+ `Button` `Card` `Divider` `DotsLoader` `Icon` `IconButton` `Modal` `SkeletonLayoutLoader` `SkeletonLoader` `SpinLoader` `Toggle`
100
106
 
101
107
  ### Media Display
102
108
 
103
109
  `ImagePanel` `InfoCard` `MediaCard`
104
110
 
111
+ ### Content Display
112
+
113
+ `Carousel` `Gallery` `Lightbox` `TabView`
114
+
105
115
  ### Typography Elements
106
116
 
107
117
  `Title` `H1` `H2` `H3` `Text` `Subtitle` `List` `OrderedList` `PageHeader`
@@ -0,0 +1,48 @@
1
+ import { CarouselEmblaContext } from './carousel.types';
2
+ export declare const CarouselProvider: {
3
+ ({ initialValue, children, }: {
4
+ initialValue: {
5
+ title?: import("react").ReactNode;
6
+ mdCols: import("../..").MediumColumnOptions;
7
+ lgCols: import("../..").LargeColumnOptions;
8
+ items: Record<string, {
9
+ title: string;
10
+ content: import("react").ReactNode;
11
+ id: import("./carousel.types").CarouselItemId;
12
+ }>;
13
+ itemOrder: import("./carousel.types").CarouselItemId[];
14
+ controlsPosition: import("./carousel.types").CarouselControlsPosition;
15
+ ItemWrapper: import("react").ComponentType<any> | undefined;
16
+ };
17
+ children: import("react").ReactNode;
18
+ }): import("react/jsx-runtime").JSX.Element;
19
+ displayName: string;
20
+ }, useCarouselContext: () => {
21
+ value: {
22
+ title?: import("react").ReactNode;
23
+ mdCols: import("../..").MediumColumnOptions;
24
+ lgCols: import("../..").LargeColumnOptions;
25
+ items: Record<string, {
26
+ title: string;
27
+ content: import("react").ReactNode;
28
+ id: import("./carousel.types").CarouselItemId;
29
+ }>;
30
+ itemOrder: import("./carousel.types").CarouselItemId[];
31
+ controlsPosition: import("./carousel.types").CarouselControlsPosition;
32
+ ItemWrapper: import("react").ComponentType<any> | undefined;
33
+ };
34
+ setValue: import("react").Dispatch<import("react").SetStateAction<{
35
+ title?: import("react").ReactNode;
36
+ mdCols: import("../..").MediumColumnOptions;
37
+ lgCols: import("../..").LargeColumnOptions;
38
+ items: Record<string, {
39
+ title: string;
40
+ content: import("react").ReactNode;
41
+ id: import("./carousel.types").CarouselItemId;
42
+ }>;
43
+ itemOrder: import("./carousel.types").CarouselItemId[];
44
+ controlsPosition: import("./carousel.types").CarouselControlsPosition;
45
+ ItemWrapper: import("react").ComponentType<any> | undefined;
46
+ }>>;
47
+ };
48
+ export declare const CarouselEmblaProvider: import("react").Provider<CarouselEmblaContext | undefined>, useCarouselEmblaContext: () => CarouselEmblaContext;
@@ -0,0 +1,5 @@
1
+ 'use client';
2
+ import { createStatefulComponentContext, createComponentContext } from '../../../utils';
3
+ export const [CarouselProvider, useCarouselContext] = createStatefulComponentContext('Carousel');
4
+ export const [CarouselEmblaProvider, useCarouselEmblaContext] = createComponentContext('CarouselEmbla');
5
+ //# sourceMappingURL=carousel-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-context.js","sourceRoot":"","sources":["../../../../src/components/content-display/carousel/carousel-context.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAGjF,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,GAClD,8BAA8B,CAAgB,UAAU,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,GAC5D,sBAAsB,CAAuB,eAAe,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { CarouselProps } from './carousel.types';
2
+ /**
3
+ * A scrollable carousel with optional navigation controls and responsive column configuration. Powered by [Embla Carousel](https://www.embla-carousel.com)
4
+ *
5
+ * Renders items in a single horizontally-scrollable track with forward/back controls.
6
+ * Column counts at `md` and `lg` breakpoints determine how many items are visible at once.
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * <Carousel
11
+ * title="Featured"
12
+ * items={[{ content: <Card /> }, { content: <Card /> }]}
13
+ * mdCols={2}
14
+ * lgCols={3}
15
+ * />
16
+ * ```
17
+ */
18
+ export declare const Carousel: ({ title, items: itemList, controlsPosition, mdCols, lgCols, itemWrapper, }: CarouselProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,71 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useMemo, useState, useEffect, useCallback } from 'react';
4
+ import useEmblaCarousel from 'embla-carousel-react';
5
+ import { CarouselProvider, CarouselEmblaProvider } from './carousel-context';
6
+ import { CarouselContent } from './components/carousel-content';
7
+ /**
8
+ * A scrollable carousel with optional navigation controls and responsive column configuration. Powered by [Embla Carousel](https://www.embla-carousel.com)
9
+ *
10
+ * Renders items in a single horizontally-scrollable track with forward/back controls.
11
+ * Column counts at `md` and `lg` breakpoints determine how many items are visible at once.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <Carousel
16
+ * title="Featured"
17
+ * items={[{ content: <Card /> }, { content: <Card /> }]}
18
+ * mdCols={2}
19
+ * lgCols={3}
20
+ * />
21
+ * ```
22
+ */
23
+ export const Carousel = ({ title, items: itemList, controlsPosition = 'above', mdCols, lgCols, itemWrapper, }) => {
24
+ // Embla Config
25
+ const [emblaRef, emblaApi] = useEmblaCarousel();
26
+ const [selectedIndex, setSelectedIndex] = useState(0);
27
+ const [canScrollPrev, setCanScrollPrev] = useState(false);
28
+ const [canScrollNext, setCanScrollNext] = useState(false);
29
+ const onSelect = useCallback((api) => {
30
+ setSelectedIndex(api.selectedScrollSnap());
31
+ setCanScrollPrev(api.canScrollPrev());
32
+ setCanScrollNext(api.canScrollNext());
33
+ }, []);
34
+ useEffect(() => {
35
+ if (!emblaApi)
36
+ return;
37
+ onSelect(emblaApi); // initial state
38
+ emblaApi.on('select', onSelect).on('reInit', onSelect);
39
+ return () => {
40
+ emblaApi.off('select', onSelect).off('reInit', onSelect);
41
+ };
42
+ }, [emblaApi, onSelect]);
43
+ const normalizedItems = useMemo(() => itemList.map((item, index) => ({
44
+ ...item,
45
+ id: String(index),
46
+ })), [itemList]);
47
+ const initialState = useMemo(() => {
48
+ const items = Object.fromEntries(normalizedItems.map((item) => [item.id, item]));
49
+ const itemOrder = normalizedItems.map((item) => item.id);
50
+ return {
51
+ title,
52
+ items,
53
+ itemOrder,
54
+ ItemWrapper: itemWrapper,
55
+ controlsPosition,
56
+ mdCols,
57
+ lgCols: lgCols ? lgCols : mdCols,
58
+ };
59
+ }, [title, normalizedItems, controlsPosition, mdCols, lgCols]);
60
+ const emblaValue = useMemo(() => ({
61
+ emblaRef,
62
+ emblaApi,
63
+ selectedIndex,
64
+ canScrollPrev,
65
+ canScrollNext,
66
+ }), [emblaRef, emblaApi, selectedIndex, canScrollPrev, canScrollNext]);
67
+ if (!itemList.length)
68
+ return null;
69
+ return (_jsx(CarouselProvider, { initialValue: initialState, children: _jsx(CarouselEmblaProvider, { value: emblaValue, children: _jsx(CarouselContent, {}) }) }));
70
+ };
71
+ //# sourceMappingURL=carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../../../src/components/content-display/carousel/carousel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { ComponentType, ReactNode } from 'react';
2
+ import { Prettify } from '../../../types';
3
+ import { EmblaViewportRefType } from 'embla-carousel-react';
4
+ import { EmblaCarouselType } from 'embla-carousel';
5
+ import { LargeColumnOptions, MediumColumnOptions } from '../../../components';
6
+ export type CarouselControlsPosition = 'above' | 'around' | 'below' | 'none';
7
+ /** A single pane consumed and displayed by the `Carousel` component */
8
+ export type CarouselItem = {
9
+ /** Optional title rendered with content */
10
+ title: string;
11
+ /** Content rendered in the carousel */
12
+ content: ReactNode;
13
+ };
14
+ export type CarouselItemId = string;
15
+ type InternalCarouselItem = Prettify<CarouselItem & {
16
+ id: CarouselItemId;
17
+ }>;
18
+ export type CarouselProps = Prettify<{
19
+ /** Optional Title */
20
+ title?: string | ReactNode;
21
+ /** Items to render, in display order */
22
+ items: InternalCarouselItem[];
23
+ /** Location to Render Controls @default 'around' */
24
+ controlsPosition?: CarouselControlsPosition;
25
+ /** Optional Carousel Item Wrapper @default `Card` */
26
+ itemWrapper?: ComponentType<any>;
27
+ /** Number of Columns in Medium Viewport */
28
+ mdCols: MediumColumnOptions;
29
+ /** Number of Columns in Large Viewport */
30
+ lgCols?: LargeColumnOptions;
31
+ }>;
32
+ export type CarouselState = Prettify<Pick<CarouselProps, 'title' | 'mdCols'> & Required<Pick<CarouselProps, 'lgCols'>> & {
33
+ items: Record<CarouselItemId, InternalCarouselItem>;
34
+ itemOrder: CarouselItemId[];
35
+ controlsPosition: CarouselControlsPosition;
36
+ ItemWrapper: CarouselProps['itemWrapper'];
37
+ }>;
38
+ /** Live embla values, bridged out of embla's mutable api via its event loop.
39
+ * Separate from CarouselState because these change externally, not via dispatch. */
40
+ export type CarouselEmblaContext = {
41
+ emblaRef: EmblaViewportRefType;
42
+ emblaApi: EmblaCarouselType | undefined;
43
+ selectedIndex: number;
44
+ canScrollPrev: boolean;
45
+ canScrollNext: boolean;
46
+ };
47
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=carousel.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel.types.js","sourceRoot":"","sources":["../../../../src/components/content-display/carousel/carousel.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare const CarouselContent: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { css } from '../../../../styled-system/css';
4
+ import { Container } from '../../../../components/layouts';
5
+ import { useCarouselContext } from '../carousel-context';
6
+ import { CarouselHeader } from './carousel-header';
7
+ import { CarouselControls, NextButton, PreviousButton } from './carousel-controls';
8
+ import { CarouselItemsDisplay } from './carousel-items-display';
9
+ const styles = {
10
+ belowControls: css({
11
+ width: '50px',
12
+ marginX: 'auto',
13
+ marginTop: '3',
14
+ }),
15
+ aroundWrapper: css({
16
+ display: 'flex',
17
+ flexDirection: 'row',
18
+ gap: '1',
19
+ }),
20
+ buttonWrapper: css({
21
+ display: 'flex',
22
+ alignItems: 'center',
23
+ justifyContent: 'center',
24
+ }),
25
+ };
26
+ export const CarouselContent = () => {
27
+ const { value: { controlsPosition }, } = useCarouselContext();
28
+ if (controlsPosition === 'around') {
29
+ return (_jsxs(Container, { children: [_jsx(CarouselHeader, {}), _jsxs("div", { className: styles.aroundWrapper, children: [_jsx("div", { className: styles.buttonWrapper, children: _jsx(PreviousButton, {}) }), _jsx(CarouselItemsDisplay, {}), _jsx("div", { className: styles.buttonWrapper, children: _jsx(NextButton, {}) })] })] }));
30
+ }
31
+ return (_jsxs(Container, { children: [_jsx(CarouselHeader, {}), _jsx(CarouselItemsDisplay, {}), controlsPosition === 'below' && (_jsx("div", { className: styles.belowControls, children: _jsx(CarouselControls, {}) }))] }));
32
+ };
33
+ //# sourceMappingURL=carousel-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-content.js","sourceRoot":"","sources":["../../../../../src/components/content-display/carousel/components/carousel-content.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,MAAM,GAAG;IACd,aAAa,EAAE,GAAG,CAAC;QAClB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,GAAG;KACd,CAAC;IACF,aAAa,EAAE,GAAG,CAAC;QAClB,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,KAAK;QACpB,GAAG,EAAE,GAAG;KACR,CAAC;IACF,aAAa,EAAE,GAAG,CAAC;QAClB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACxB,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IACnC,MAAM,EACL,KAAK,EAAE,EAAE,gBAAgB,EAAE,GAC3B,GAAG,kBAAkB,EAAE,CAAC;IAEzB,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,CACN,MAAC,SAAS,eACT,KAAC,cAAc,KAAG,EAClB,eAAK,SAAS,EAAE,MAAM,CAAC,aAAa,aACnC,cAAK,SAAS,EAAE,MAAM,CAAC,aAAa,YACnC,KAAC,cAAc,KAAG,GACb,EACN,KAAC,oBAAoB,KAAG,EACxB,cAAK,SAAS,EAAE,MAAM,CAAC,aAAa,YACnC,KAAC,UAAU,KAAG,GACT,IACD,IACK,CACZ,CAAC;IACH,CAAC;IAED,OAAO,CACN,MAAC,SAAS,eACT,KAAC,cAAc,KAAG,EAClB,KAAC,oBAAoB,KAAG,EACvB,gBAAgB,KAAK,OAAO,IAAI,CAChC,cAAK,SAAS,EAAE,MAAM,CAAC,aAAa,YACnC,KAAC,gBAAgB,KAAG,GACf,CACN,IACU,CACZ,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const PreviousButton: () => import("react/jsx-runtime").JSX.Element;
2
+ export declare const NextButton: () => import("react/jsx-runtime").JSX.Element;
3
+ export declare const CarouselControls: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { css } from '../../../../styled-system/css';
4
+ import { IconButton } from '../../../../components/ui';
5
+ import { useCarouselEmblaContext } from '../carousel-context';
6
+ const styles = {
7
+ container: css({
8
+ display: 'flex',
9
+ flexDirection: 'row',
10
+ alignItems: 'center',
11
+ gap: '1',
12
+ }),
13
+ };
14
+ export const PreviousButton = () => {
15
+ const { emblaApi, canScrollPrev } = useCarouselEmblaContext();
16
+ const goToPrev = () => emblaApi?.scrollPrev();
17
+ return (_jsx(IconButton, { color: "neutral", name: "CaretLeft", size: "sm", onClick: goToPrev, disabled: !canScrollPrev }));
18
+ };
19
+ export const NextButton = () => {
20
+ const { emblaApi, canScrollPrev, canScrollNext } = useCarouselEmblaContext();
21
+ const goToNext = () => emblaApi?.scrollNext();
22
+ return (_jsx(IconButton, { color: "neutral", name: "CaretRight", size: "sm", onClick: goToNext, disabled: !canScrollNext }));
23
+ };
24
+ export const CarouselControls = () => {
25
+ return (_jsxs("div", { className: styles.container, children: [_jsx(PreviousButton, {}), _jsx(NextButton, {})] }));
26
+ };
27
+ //# sourceMappingURL=carousel-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-controls.js","sourceRoot":"","sources":["../../../../../src/components/content-display/carousel/components/carousel-controls.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,MAAM,GAAG;IACd,SAAS,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,QAAQ;QACpB,GAAG,EAAE,GAAG;KACR,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAE9D,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAE9C,OAAO,CACN,KAAC,UAAU,IACV,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,WAAW,EAChB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,CAAC,aAAa,GACvB,CACF,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC9B,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAE7E,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAE9C,OAAO,CACN,KAAC,UAAU,IACV,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,YAAY,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,CAAC,aAAa,GACvB,CACF,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACpC,OAAO,CACN,eAAK,SAAS,EAAE,MAAM,CAAC,SAAS,aAC/B,KAAC,cAAc,KAAG,EAClB,KAAC,UAAU,KAAG,IACT,CACN,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const CarouselHeader: () => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,24 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCarouselContext } from '../carousel-context';
4
+ import { H2 } from '../../../../components/typography';
5
+ import { css } from '../../../../styled-system/css';
6
+ import { CarouselControls } from './carousel-controls';
7
+ const styles = {
8
+ titleBlock: css({
9
+ display: 'flex',
10
+ flexDirection: 'row',
11
+ justifyContent: 'space-between',
12
+ alignItems: 'center',
13
+ marginBottom: '4',
14
+ }),
15
+ };
16
+ export const CarouselHeader = () => {
17
+ const { value: { controlsPosition, title }, } = useCarouselContext();
18
+ if (!title && controlsPosition !== 'above') {
19
+ return null;
20
+ }
21
+ const titleDisplay = typeof title === 'string' ? _jsx(H2, { inline: true, children: title }) : title;
22
+ return (_jsxs("div", { className: styles.titleBlock, children: [title && titleDisplay, controlsPosition === 'above' && _jsx(CarouselControls, {})] }));
23
+ };
24
+ //# sourceMappingURL=carousel-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-header.js","sourceRoot":"","sources":["../../../../../src/components/content-display/carousel/components/carousel-header.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,GAAG;IACd,UAAU,EAAE,GAAG,CAAC;QACf,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,QAAQ;QACpB,YAAY,EAAE,GAAG;KACjB,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IAClC,MAAM,EACL,KAAK,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAClC,GAAG,kBAAkB,EAAE,CAAC;IAEzB,IAAI,CAAC,KAAK,IAAI,gBAAgB,KAAK,OAAO,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,YAAY,GAAc,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,EAAE,IAAC,MAAM,kBAAE,KAAK,GAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5F,OAAO,CACN,eAAK,SAAS,EAAE,MAAM,CAAC,UAAU,aAC/B,KAAK,IAAI,YAAY,EACrB,gBAAgB,KAAK,OAAO,IAAI,KAAC,gBAAgB,KAAG,IAChD,CACN,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { CarouselItemId } from '../carousel.types';
2
+ type CarouselItemProps = {
3
+ itemId: CarouselItemId;
4
+ };
5
+ export declare const CarouselItem: ({ itemId }: CarouselItemProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { cva } from '../../../../styled-system/css';
4
+ import { Card } from '../../../../components/ui';
5
+ import { useCarouselContext } from '../carousel-context';
6
+ const styles = {
7
+ wrapper: cva({
8
+ base: {
9
+ flexGrow: 0,
10
+ flexShrink: 0,
11
+ minWidth: '0',
12
+ paddingLeft: { base: '3', md: '4' },
13
+ },
14
+ variants: {
15
+ mdCols: {
16
+ 1: { flexBasis: { base: '100%', md: '100%' } },
17
+ 2: { flexBasis: { base: '100%', md: '50%' } },
18
+ 3: { flexBasis: { base: '100%', md: '33.333%' } },
19
+ },
20
+ lgCols: {
21
+ 1: { flexBasis: { lg: '100%' } },
22
+ 2: { flexBasis: { lg: '50%' } },
23
+ 3: { flexBasis: { lg: '33.333%' } },
24
+ 4: { flexBasis: { lg: '25%' } },
25
+ 5: { flexBasis: { lg: '20%' } },
26
+ 6: { flexBasis: { lg: '16.666%' } },
27
+ },
28
+ },
29
+ defaultVariants: {
30
+ mdCols: 3,
31
+ lgCols: 3,
32
+ },
33
+ }),
34
+ };
35
+ export const CarouselItem = ({ itemId }) => {
36
+ const { value: { items, ItemWrapper, mdCols, lgCols }, } = useCarouselContext();
37
+ const item = items[itemId];
38
+ if (ItemWrapper) {
39
+ return (_jsx("div", { className: styles.wrapper({ mdCols, lgCols }), children: _jsx(ItemWrapper, { children: item.content }) }));
40
+ }
41
+ return (_jsx("div", { className: styles.wrapper({ mdCols, lgCols }), children: _jsx(Card, { fullWidth: true, title: { text: item.title }, size: "md", children: item.content }) }));
42
+ };
43
+ //# sourceMappingURL=carousel-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-item.js","sourceRoot":"","sources":["../../../../../src/components/content-display/carousel/components/carousel-item.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,EAAO,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAOzD,MAAM,MAAM,GAAG;IACd,OAAO,EAAE,GAAG,CAAC;QACZ,IAAI,EAAE;YACL,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,GAAG;YACb,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;SACnC;QACD,QAAQ,EAAE;YACT,MAAM,EAAE;gBACP,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;gBAC9C,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;gBAC7C,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;aACjD;YACD,MAAM,EAAE;gBACP,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;gBAChC,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;gBAC/B,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;gBACnC,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;gBAC/B,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;gBAC/B,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;aACnC;SACD;QACD,eAAe,EAAE;YAChB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;SACT;KACD,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,MAAM,EAAqB,EAAE,EAAE;IAC7D,MAAM,EACL,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAC7C,GAAG,kBAAkB,EAAE,CAAC;IAEzB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3B,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,CACN,cAAK,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,YACjD,KAAC,WAAW,cAAE,IAAI,CAAC,OAAO,GAAe,GACpC,CACN,CAAC;IACH,CAAC;IAED,OAAO,CACN,cAAK,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,YACjD,KAAC,IAAI,IAAC,SAAS,QAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAC,IAAI,YACpD,IAAI,CAAC,OAAO,GACP,GACF,CACN,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const CarouselItemsDisplay: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { css } from '../../../../styled-system/css';
4
+ import { useCarouselContext, useCarouselEmblaContext } from '../carousel-context';
5
+ import { CarouselItem } from './carousel-item';
6
+ const styles = {
7
+ viewport: css({ width: '100%', overflow: 'hidden' }),
8
+ track: css({
9
+ display: 'flex',
10
+ marginLeft: { base: '-3', md: '-4' },
11
+ touchAction: 'pan-y pinch-zoom',
12
+ }),
13
+ };
14
+ export const CarouselItemsDisplay = () => {
15
+ const { value: { itemOrder }, } = useCarouselContext();
16
+ const { emblaRef } = useCarouselEmblaContext();
17
+ return (_jsx("div", { ref: emblaRef, className: styles.viewport, children: _jsx("div", { className: styles.track, children: itemOrder.map((itemId) => (_jsx(CarouselItem, { itemId: itemId }, itemId))) }) }));
18
+ };
19
+ //# sourceMappingURL=carousel-items-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel-items-display.js","sourceRoot":"","sources":["../../../../../src/components/content-display/carousel/components/carousel-items-display.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,MAAM,GAAG;IACd,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACpD,KAAK,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE;QACpC,WAAW,EAAE,kBAAkB;KAC/B,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE;IACxC,MAAM,EACL,KAAK,EAAE,EAAE,SAAS,EAAE,GACpB,GAAG,kBAAkB,EAAE,CAAC;IAEzB,MAAM,EAAE,QAAQ,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAE/C,OAAO,CACN,cAAK,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,YAC7C,cAAK,SAAS,EAAE,MAAM,CAAC,KAAK,YAC1B,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC1B,KAAC,YAAY,IAAc,MAAM,EAAE,MAAM,IAAtB,MAAM,CAAoB,CAC7C,CAAC,GACG,GACD,CACN,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type { CarouselProps } from './carousel.types';
2
+ export { Carousel } from './carousel';
@@ -0,0 +1,2 @@
1
+ export { Carousel } from './carousel';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/content-display/carousel/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const GalleryContent: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,64 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { css, cva } from '../../../../styled-system/css';
4
+ import { H2 } from '../../../../components/typography';
5
+ import { useGalleryContext } from '../gallery-context';
6
+ import { GALLERY_DISPLAY_CONSTANT_NAMES, GALLERY_DISPLAY_CONSTANTS, } from '../gallery-display-constants';
7
+ import { GalleryItemsDisplay } from './item-display/gallery-items-display';
8
+ import { ItemTrack } from './item-track/item-track';
9
+ const styles = {
10
+ container: cva({
11
+ base: {
12
+ display: 'flex',
13
+ flexDirection: 'column',
14
+ width: '100%',
15
+ },
16
+ variants: {
17
+ size: {
18
+ sm: { height: '300px' },
19
+ md: { height: '500px' },
20
+ lg: { height: '700px' },
21
+ fill: { height: '100%' },
22
+ },
23
+ },
24
+ }),
25
+ internalContent: css({
26
+ display: 'flex',
27
+ flexDirection: 'column',
28
+ width: '100%',
29
+ flex: '1',
30
+ gap: '3',
31
+ minHeight: 0,
32
+ }),
33
+ displayContent: css({
34
+ width: '100%',
35
+ flex: '1',
36
+ minHeight: 0,
37
+ overflow: 'hidden',
38
+ }),
39
+ trackContent: cva({
40
+ base: {
41
+ width: '100%',
42
+ },
43
+ variants: {
44
+ size: {
45
+ sm: {
46
+ height: '60px',
47
+ },
48
+ md: {
49
+ height: '75px',
50
+ },
51
+ lg: {
52
+ height: '100px',
53
+ },
54
+ },
55
+ },
56
+ }),
57
+ };
58
+ export const GalleryContent = () => {
59
+ const { value: { size, title }, } = useGalleryContext();
60
+ const titleDisplay = typeof title === 'string' ? _jsx(H2, { children: title }) : title;
61
+ const cssVariables = Object.fromEntries(Object.entries(GALLERY_DISPLAY_CONSTANT_NAMES).map(([key, cssVar]) => [cssVar, GALLERY_DISPLAY_CONSTANTS[key]]));
62
+ return (_jsxs("div", { className: styles.container({ size }), style: cssVariables, children: [title && titleDisplay, _jsxs("div", { className: styles.internalContent, children: [_jsx("div", { className: styles.displayContent, children: _jsx(GalleryItemsDisplay, {}) }), _jsx("div", { className: styles.trackContent({ size: size === 'fill' ? 'lg' : size }), children: _jsx(ItemTrack, {}) })] })] }));
63
+ };
64
+ //# sourceMappingURL=gallery-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gallery-content.js","sourceRoot":"","sources":["../../../../../src/components/content-display/gallery/components/gallery-content.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAEN,8BAA8B,EAC9B,yBAAyB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,MAAM,GAAG;IACd,SAAS,EAAE,GAAG,CAAC;QACd,IAAI,EAAE;YACL,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,KAAK,EAAE,MAAM;SACb;QACD,QAAQ,EAAE;YACT,IAAI,EAAE;gBACL,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;gBACvB,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;gBACvB,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;gBACvB,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;aACxB;SACD;KACD,CAAC;IACF,eAAe,EAAE,GAAG,CAAC;QACpB,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,QAAQ;QACvB,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,SAAS,EAAE,CAAC;KACZ,CAAC;IACF,cAAc,EAAE,GAAG,CAAC;QACnB,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,QAAQ;KAClB,CAAC;IACF,YAAY,EAAE,GAAG,CAAC;QACjB,IAAI,EAAE;YACL,KAAK,EAAE,MAAM;SACb;QACD,QAAQ,EAAE;YACT,IAAI,EAAE;gBACL,EAAE,EAAE;oBACH,MAAM,EAAE,MAAM;iBACd;gBACD,EAAE,EAAE;oBACH,MAAM,EAAE,MAAM;iBACd;gBACD,EAAE,EAAE;oBACH,MAAM,EAAE,OAAO;iBACf;aACD;SACD;KACD,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IAClC,MAAM,EACL,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GACtB,GAAG,iBAAiB,EAAE,CAAC;IAExB,MAAM,YAAY,GAAc,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,EAAE,cAAE,KAAK,GAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAErF,MAAM,YAAY,GAA2B,MAAM,CAAC,WAAW,CAC7D,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAsC,CAAC,GAAG,CACvF,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAC3D,CACD,CAAC;IAEF,OAAO,CACN,eAAK,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,aAC7D,KAAK,IAAI,YAAY,EACtB,eAAK,SAAS,EAAE,MAAM,CAAC,eAAe,aACrC,cAAK,SAAS,EAAE,MAAM,CAAC,cAAc,YACpC,KAAC,mBAAmB,KAAG,GAClB,EACN,cAAK,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,YAC3E,KAAC,SAAS,KAAG,GACR,IACD,IACD,CACN,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const GalleryHeader: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { css } from '../../../../styled-system/css';
4
+ import { useGalleryContext } from '../gallery-context';
5
+ import { H2 } from '../../../../components/typography';
6
+ const styles = {
7
+ container: css({
8
+ display: 'flex',
9
+ width: '100%',
10
+ flexDirection: 'row',
11
+ justifyContent: 'space-between',
12
+ }),
13
+ };
14
+ export const GalleryHeader = () => {
15
+ const { value: { title }, } = useGalleryContext();
16
+ const titleDisplay = typeof title === 'string' ? _jsx(H2, { inline: true, children: title }) : title;
17
+ return _jsx("div", { className: styles.container, children: title && titleDisplay });
18
+ };
19
+ //# sourceMappingURL=gallery-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gallery-header.js","sourceRoot":"","sources":["../../../../../src/components/content-display/gallery/components/gallery-header.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAE7C,MAAM,MAAM,GAAG;IACd,SAAS,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,eAAe;KAC/B,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE;IACjC,MAAM,EACL,KAAK,EAAE,EAAE,KAAK,EAAE,GAChB,GAAG,iBAAiB,EAAE,CAAC;IAExB,MAAM,YAAY,GAAc,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,EAAE,IAAC,MAAM,kBAAE,KAAK,GAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5F,OAAO,cAAK,SAAS,EAAE,MAAM,CAAC,SAAS,YAAG,KAAK,IAAI,YAAY,GAAO,CAAC;AACxE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { GalleryItemId } from '../../gallery.types';
2
+ type GalleryItemProps = {
3
+ itemId: GalleryItemId;
4
+ };
5
+ export declare const GalleryItem: ({ itemId }: GalleryItemProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};