@regardio/react 0.4.7 → 0.5.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 (202) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -5
  3. package/dist/{components/background-slideshow.js → background-slideshow/index.js} +2 -11
  4. package/dist/{components/blurry-gradient.js → blurry-gradient/index.js} +15 -9
  5. package/dist/{components/carousel.d.ts → carousel/index.d.ts} +17 -9
  6. package/dist/{components/carousel.js → carousel/index.js} +34 -30
  7. package/dist/{components/countdown.js → countdown/index.js} +2 -11
  8. package/dist/{components/generic-error.js → generic-error/index.js} +1 -1
  9. package/dist/grid/index.d.ts +1196 -0
  10. package/dist/grid/index.js +239 -0
  11. package/dist/heading/index.d.ts +24 -0
  12. package/dist/{components/heading.js → heading/index.js} +15 -34
  13. package/dist/highlight/index.d.ts +13 -0
  14. package/dist/{components/highlight.js → highlight/index.js} +9 -17
  15. package/dist/hooks/{use-current-route-data.js → use-current-route-data/index.js} +1 -1
  16. package/dist/hooks/{use-focus-search.js → use-focus-search/index.js} +1 -1
  17. package/dist/hooks/{use-matches-data.js → use-matches-data/index.js} +1 -1
  18. package/dist/hooks/{use-media-query.js → use-media-query/index.js} +1 -1
  19. package/dist/hooks/{use-mobile.js → use-mobile/index.js} +1 -1
  20. package/dist/hooks/use-nonce/index.d.ts +6 -0
  21. package/dist/hooks/use-nonce/index.js +8 -0
  22. package/dist/hooks/{use-orientation.d.ts → use-orientation/index.d.ts} +1 -1
  23. package/dist/hooks/{use-orientation.js → use-orientation/index.js} +1 -1
  24. package/dist/hooks/{use-user.js → use-user/index.js} +1 -1
  25. package/dist/{components/icon-button.js → icon-button/index.js} +1 -1
  26. package/dist/{components/if.js → if/index.js} +1 -1
  27. package/dist/{components/iframe.js → iframe/index.js} +2 -11
  28. package/dist/{components/link.d.ts → link/index.d.ts} +19 -13
  29. package/dist/{components/link.js → link/index.js} +31 -36
  30. package/dist/list/index.d.ts +69 -0
  31. package/dist/list/index.js +65 -0
  32. package/dist/{components/markdown-container.js → markdown-container/index.js} +3 -67
  33. package/dist/{components/password-input.js → password-input/index.js} +2 -11
  34. package/dist/{components/picture.js → picture/index.js} +2 -11
  35. package/dist/{components/protected-email.d.ts → protected-email/index.d.ts} +1 -1
  36. package/dist/{components/protected-email.js → protected-email/index.js} +1 -1
  37. package/dist/text/index.d.ts +20 -0
  38. package/dist/text/index.js +38 -0
  39. package/dist/utils/author/index.d.ts +3 -0
  40. package/dist/utils/author/index.js +33 -0
  41. package/dist/utils/text/index.d.ts +15 -0
  42. package/dist/utils/text/index.js +73 -0
  43. package/package.json +92 -121
  44. package/src/{stories/BackgroundSlideshow.stories.tsx → background-slideshow/background-slideshow.stories.tsx} +1 -1
  45. package/src/{components → background-slideshow}/background-slideshow.tsx +3 -1
  46. package/src/background-slideshow/index.ts +2 -0
  47. package/src/{stories/BlurryGradient.stories.tsx → blurry-gradient/blurry-gradient.stories.tsx} +1 -1
  48. package/src/{components → blurry-gradient}/blurry-gradient.tsx +14 -8
  49. package/src/blurry-gradient/index.ts +2 -0
  50. package/src/carousel/carousel-content.tsx +16 -0
  51. package/src/carousel/carousel-item.tsx +23 -0
  52. package/src/carousel/carousel-next.tsx +22 -0
  53. package/src/carousel/carousel-previous.tsx +22 -0
  54. package/src/{components/carousel.tsx → carousel/carousel-root.tsx} +8 -78
  55. package/src/carousel/carousel.stories.tsx +89 -0
  56. package/src/carousel/index.parts.ts +5 -0
  57. package/src/carousel/index.ts +4 -0
  58. package/src/{stories/Countdown.stories.tsx → countdown/countdown.stories.tsx} +1 -1
  59. package/src/{components → countdown}/countdown.tsx +3 -7
  60. package/src/countdown/index.ts +1 -0
  61. package/src/{stories/GenericError.stories.tsx → generic-error/generic-error.stories.tsx} +1 -1
  62. package/src/{components → generic-error}/generic-error.tsx +2 -0
  63. package/src/generic-error/index.ts +2 -0
  64. package/src/grid/grid-item.tsx +188 -0
  65. package/src/grid/grid-root.tsx +72 -0
  66. package/src/grid/grid.stories.tsx +236 -0
  67. package/src/grid/index.parts.ts +2 -0
  68. package/src/grid/index.ts +5 -0
  69. package/src/{stories/Heading.stories.tsx → heading/heading.stories.tsx} +1 -1
  70. package/src/{components → heading}/heading.tsx +17 -25
  71. package/src/heading/index.ts +2 -0
  72. package/src/{stories/Highlight.stories.tsx → highlight/highlight.stories.tsx} +1 -1
  73. package/src/{components → highlight}/highlight.tsx +13 -9
  74. package/src/highlight/index.ts +2 -0
  75. package/src/hooks/use-current-route-data/index.ts +1 -0
  76. package/src/hooks/use-focus-search/index.ts +1 -0
  77. package/src/hooks/use-matches-data/index.ts +1 -0
  78. package/src/hooks/use-media-query/index.ts +1 -0
  79. package/src/hooks/use-mobile/index.ts +1 -0
  80. package/src/hooks/use-nonce/index.ts +1 -0
  81. package/src/hooks/use-orientation/index.ts +1 -0
  82. package/src/hooks/use-user/index.ts +2 -0
  83. package/src/{stories/IconButton.stories.tsx → icon-button/icon-button.stories.tsx} +1 -1
  84. package/src/icon-button/index.ts +2 -0
  85. package/src/{stories/If.stories.tsx → if/if.stories.tsx} +1 -1
  86. package/src/if/index.ts +1 -0
  87. package/src/{stories/Iframe.stories.tsx → iframe/iframe.stories.tsx} +1 -1
  88. package/src/{components → iframe}/iframe.tsx +1 -1
  89. package/src/iframe/index.ts +2 -0
  90. package/src/link/index.ts +2 -0
  91. package/src/{stories/Link.stories.tsx → link/link.stories.tsx} +1 -1
  92. package/src/{components → link}/link.tsx +39 -28
  93. package/src/list/index.parts.ts +2 -0
  94. package/src/list/index.ts +4 -0
  95. package/src/list/list-item.tsx +63 -0
  96. package/src/list/list-root-context.ts +21 -0
  97. package/src/list/list-root.tsx +81 -0
  98. package/src/list/list.css +32 -0
  99. package/src/list/list.stories.tsx +119 -0
  100. package/src/list/list.test.tsx +168 -0
  101. package/src/markdown-container/index.ts +2 -0
  102. package/src/{stories/MarkdownContainer.stories.tsx → markdown-container/markdown-container.stories.tsx} +1 -1
  103. package/src/{components → markdown-container}/markdown-container.tsx +3 -1
  104. package/src/password-input/index.ts +2 -0
  105. package/src/{stories/PasswordInput.stories.tsx → password-input/password-input.stories.tsx} +1 -1
  106. package/src/{components → password-input}/password-input.tsx +4 -4
  107. package/src/picture/index.ts +2 -0
  108. package/src/{stories/Picture.stories.tsx → picture/picture.stories.tsx} +1 -1
  109. package/src/{components → picture}/picture.tsx +2 -4
  110. package/src/protected-email/index.ts +2 -0
  111. package/src/{stories/ProtectedEmail.stories.tsx → protected-email/protected-email.stories.tsx} +1 -1
  112. package/src/{components → protected-email}/protected-email.tsx +3 -1
  113. package/src/tailwind.css +10 -0
  114. package/src/text/index.ts +2 -0
  115. package/src/{stories/Text.stories.tsx → text/text.stories.tsx} +1 -1
  116. package/src/text/text.tsx +46 -0
  117. package/src/utils/author/author.tsx +36 -0
  118. package/src/utils/author/index.ts +1 -0
  119. package/src/utils/text/index.ts +1 -0
  120. package/src/utils/text/text.tsx +103 -0
  121. package/dist/components/box.d.ts +0 -20
  122. package/dist/components/box.js +0 -50
  123. package/dist/components/definition-list.d.ts +0 -43
  124. package/dist/components/definition-list.js +0 -89
  125. package/dist/components/heading.d.ts +0 -27
  126. package/dist/components/highlight.d.ts +0 -19
  127. package/dist/components/item.d.ts +0 -70
  128. package/dist/components/item.js +0 -512
  129. package/dist/components/leaflet-map.d.ts +0 -34
  130. package/dist/components/leaflet-map.js +0 -201
  131. package/dist/components/list-item.d.ts +0 -19
  132. package/dist/components/list-item.js +0 -37
  133. package/dist/components/maptiler-map.d.ts +0 -27
  134. package/dist/components/maptiler-map.js +0 -129
  135. package/dist/components/text.d.ts +0 -20
  136. package/dist/components/text.js +0 -45
  137. package/dist/components/unordered-list.d.ts +0 -19
  138. package/dist/components/unordered-list.js +0 -39
  139. package/dist/hooks/use-nonce.d.ts +0 -12
  140. package/dist/hooks/use-nonce.js +0 -13
  141. package/dist/utils/author.d.ts +0 -9
  142. package/dist/utils/author.js +0 -55
  143. package/dist/utils/cn.d.ts +0 -9
  144. package/dist/utils/cn.js +0 -14
  145. package/dist/utils/is-route-active.d.ts +0 -19
  146. package/dist/utils/is-route-active.js +0 -56
  147. package/dist/utils/text.d.ts +0 -24
  148. package/dist/utils/text.js +0 -127
  149. package/src/components/box.tsx +0 -45
  150. package/src/components/definition-list.tsx +0 -90
  151. package/src/components/item.tsx +0 -340
  152. package/src/components/leaflet-map.tsx +0 -294
  153. package/src/components/link.test.tsx +0 -387
  154. package/src/components/list-item.tsx +0 -30
  155. package/src/components/maptiler-map.tsx +0 -181
  156. package/src/components/text.tsx +0 -38
  157. package/src/components/unordered-list.tsx +0 -32
  158. package/src/hooks/use-nonce.test.ts +0 -35
  159. package/src/stories/Box.stories.tsx +0 -83
  160. package/src/stories/Carousel.stories.tsx +0 -95
  161. package/src/stories/DefinitionList.stories.tsx +0 -51
  162. package/src/stories/Item.stories.tsx +0 -79
  163. package/src/stories/ListItem.stories.tsx +0 -38
  164. package/src/stories/UnorderedList.stories.tsx +0 -73
  165. package/src/styles/tailwind.css +0 -7
  166. package/src/test-setup.ts +0 -1
  167. package/src/utils/author.test.ts +0 -54
  168. package/src/utils/author.tsx +0 -73
  169. package/src/utils/cn.test.ts +0 -48
  170. package/src/utils/cn.ts +0 -14
  171. package/src/utils/is-route-active.test.ts +0 -80
  172. package/src/utils/is-route-active.ts +0 -100
  173. package/src/utils/text.test.ts +0 -152
  174. package/src/utils/text.tsx +0 -209
  175. package/src/vite-env.d.ts +0 -1
  176. /package/dist/{components/background-slideshow.d.ts → background-slideshow/index.d.ts} +0 -0
  177. /package/dist/{components/blurry-gradient.d.ts → blurry-gradient/index.d.ts} +0 -0
  178. /package/dist/{components/countdown.d.ts → countdown/index.d.ts} +0 -0
  179. /package/dist/{components/generic-error.d.ts → generic-error/index.d.ts} +0 -0
  180. /package/dist/hooks/{use-current-route-data.d.ts → use-current-route-data/index.d.ts} +0 -0
  181. /package/dist/hooks/{use-focus-search.d.ts → use-focus-search/index.d.ts} +0 -0
  182. /package/dist/hooks/{use-matches-data.d.ts → use-matches-data/index.d.ts} +0 -0
  183. /package/dist/hooks/{use-media-query.d.ts → use-media-query/index.d.ts} +0 -0
  184. /package/dist/hooks/{use-mobile.d.ts → use-mobile/index.d.ts} +0 -0
  185. /package/dist/hooks/{use-user.d.ts → use-user/index.d.ts} +0 -0
  186. /package/dist/{components/icon-button.d.ts → icon-button/index.d.ts} +0 -0
  187. /package/dist/{components/if.d.ts → if/index.d.ts} +0 -0
  188. /package/dist/{components/iframe.d.ts → iframe/index.d.ts} +0 -0
  189. /package/dist/{components/markdown-container.d.ts → markdown-container/index.d.ts} +0 -0
  190. /package/dist/{components/password-input.d.ts → password-input/index.d.ts} +0 -0
  191. /package/dist/{components/picture.d.ts → picture/index.d.ts} +0 -0
  192. /package/src/hooks/{use-current-route-data.ts → use-current-route-data/use-current-route-data.ts} +0 -0
  193. /package/src/hooks/{use-focus-search.ts → use-focus-search/use-focus-search.ts} +0 -0
  194. /package/src/hooks/{use-matches-data.ts → use-matches-data/use-matches-data.ts} +0 -0
  195. /package/src/hooks/{use-media-query.ts → use-media-query/use-media-query.ts} +0 -0
  196. /package/src/hooks/{use-mobile.ts → use-mobile/use-mobile.ts} +0 -0
  197. /package/src/hooks/{use-nonce.ts → use-nonce/use-nonce.ts} +0 -0
  198. /package/src/hooks/{use-orientation.ts → use-orientation/use-orientation.ts} +0 -0
  199. /package/src/hooks/{use-user.tsx → use-user/use-user.tsx} +0 -0
  200. /package/src/{components → icon-button}/icon-button.tsx +0 -0
  201. /package/src/{components → if}/if.tsx +0 -0
  202. /package/src/{styles/storybook.css → storybook.css} +0 -0
@@ -0,0 +1,89 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Carousel } from './index';
3
+
4
+ const meta: Meta<typeof Carousel.Root> = {
5
+ component: Carousel.Root,
6
+ parameters: {
7
+ layout: 'padded',
8
+ },
9
+ tags: ['autodocs'],
10
+ title: 'Components/Carousel',
11
+ };
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof Carousel.Root>;
15
+
16
+ const SlideCard = ({ children }: { children: React.ReactNode }) => (
17
+ <div
18
+ style={{
19
+ alignItems: 'center',
20
+ background: '#f0f0f0',
21
+ border: '1px solid #ddd',
22
+ borderRadius: '8px',
23
+ display: 'flex',
24
+ height: '200px',
25
+ justifyContent: 'center',
26
+ width: '300px',
27
+ }}
28
+ >
29
+ {children}
30
+ </div>
31
+ );
32
+
33
+ export const Default: Story = {
34
+ render: () => (
35
+ <Carousel.Root className="w-full max-w-md">
36
+ <Carousel.Content className="gap-4">
37
+ <Carousel.Item>
38
+ <SlideCard>Slide 1</SlideCard>
39
+ </Carousel.Item>
40
+ <Carousel.Item>
41
+ <SlideCard>Slide 2</SlideCard>
42
+ </Carousel.Item>
43
+ <Carousel.Item>
44
+ <SlideCard>Slide 3</SlideCard>
45
+ </Carousel.Item>
46
+ </Carousel.Content>
47
+ </Carousel.Root>
48
+ ),
49
+ };
50
+
51
+ export const WithControls: Story = {
52
+ render: () => (
53
+ <Carousel.Root className="w-full max-w-md">
54
+ <Carousel.Content className="gap-4">
55
+ <Carousel.Item>
56
+ <SlideCard>Slide 1</SlideCard>
57
+ </Carousel.Item>
58
+ <Carousel.Item>
59
+ <SlideCard>Slide 2</SlideCard>
60
+ </Carousel.Item>
61
+ <Carousel.Item>
62
+ <SlideCard>Slide 3</SlideCard>
63
+ </Carousel.Item>
64
+ </Carousel.Content>
65
+ <div className="flex justify-center gap-4 mt-4">
66
+ <Carousel.Previous className="px-4 py-2 bg-gray-200 rounded">Previous</Carousel.Previous>
67
+ <Carousel.Next className="px-4 py-2 bg-gray-200 rounded">Next</Carousel.Next>
68
+ </div>
69
+ </Carousel.Root>
70
+ ),
71
+ };
72
+
73
+ export const ManySlides: Story = {
74
+ render: () => (
75
+ <Carousel.Root className="w-full max-w-md">
76
+ <Carousel.Content className="gap-4">
77
+ {[1, 2, 3, 4, 5, 6].map((i) => (
78
+ <Carousel.Item key={i}>
79
+ <SlideCard>Slide {i}</SlideCard>
80
+ </Carousel.Item>
81
+ ))}
82
+ </Carousel.Content>
83
+ <div className="flex justify-center gap-4 mt-4">
84
+ <Carousel.Previous className="px-4 py-2 bg-gray-200 rounded">←</Carousel.Previous>
85
+ <Carousel.Next className="px-4 py-2 bg-gray-200 rounded">→</Carousel.Next>
86
+ </div>
87
+ </Carousel.Root>
88
+ ),
89
+ };
@@ -0,0 +1,5 @@
1
+ export { CarouselContent as Content } from './carousel-content';
2
+ export { CarouselItem as Item } from './carousel-item';
3
+ export { CarouselNext as Next } from './carousel-next';
4
+ export { CarouselPrevious as Previous } from './carousel-previous';
5
+ export { CarouselRoot as Root } from './carousel-root';
@@ -0,0 +1,4 @@
1
+ export type { CarouselItemProps } from './carousel-item';
2
+ export type { CarouselApi, CarouselRootProps } from './carousel-root';
3
+ export { useCarousel } from './carousel-root';
4
+ export * as Carousel from './index.parts';
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Countdown } from '../components/countdown';
2
+ import { Countdown } from './countdown';
3
3
 
4
4
  const meta: Meta<typeof Countdown> = {
5
5
  component: Countdown,
@@ -1,5 +1,7 @@
1
+ 'use client';
2
+
3
+ import { cn } from '@regardio/tailwind/utils';
1
4
  import { useEffect, useState } from 'react';
2
- import { cn } from '../utils/cn';
3
5
 
4
6
  export function Countdown() {
5
7
  const [timerValue, setTimerValue] = useState(0);
@@ -20,12 +22,6 @@ export function Countdown() {
20
22
  };
21
23
  }, []);
22
24
 
23
- // const formattedDate = partyDate.toLocaleDateString(data.locale, {
24
- // day: '2-digit',
25
- // month: 'long',
26
- // year: 'numeric',
27
- // });
28
-
29
25
  return (
30
26
  <div
31
27
  className={cn(
@@ -0,0 +1 @@
1
+ export { Countdown } from './countdown';
@@ -1,6 +1,6 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import { createMemoryRouter, RouterProvider } from 'react-router';
3
- import { GenericError, getErrorDescriptor } from '../components/generic-error';
3
+ import { GenericError, getErrorDescriptor } from './generic-error';
4
4
 
5
5
  const meta: Meta<typeof GenericError> = {
6
6
  component: GenericError,
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import type { ReactElement } from 'react';
2
4
  import { isRouteErrorResponse, useRouteError } from 'react-router';
3
5
 
@@ -0,0 +1,2 @@
1
+ export type { ErrorDescriptor } from './generic-error';
2
+ export { GenericError, getErrorDescriptor } from './generic-error';
@@ -0,0 +1,188 @@
1
+ import { tv, type VariantProps } from '@regardio/tailwind/utils';
2
+ import { forwardRef, type HTMLAttributes } from 'react';
3
+
4
+ const gridItem = tv({
5
+ defaultVariants: {
6
+ span: 12,
7
+ },
8
+ slots: {
9
+ root: ['relative'],
10
+ },
11
+ variants: {
12
+ end: {
13
+ 1: { root: 'col-end-1' },
14
+ 2: { root: 'col-end-2' },
15
+ 3: { root: 'col-end-3' },
16
+ 4: { root: 'col-end-4' },
17
+ 5: { root: 'col-end-5' },
18
+ 6: { root: 'col-end-6' },
19
+ 7: { root: 'col-end-7' },
20
+ 8: { root: 'col-end-8' },
21
+ 9: { root: 'col-end-9' },
22
+ 10: { root: 'col-end-10' },
23
+ 11: { root: 'col-end-11' },
24
+ 12: { root: 'col-end-12' },
25
+ 13: { root: 'col-end-13' },
26
+ auto: { root: 'col-end-auto' },
27
+ },
28
+ rowSpan: {
29
+ 1: { root: 'row-span-1' },
30
+ 2: { root: 'row-span-2' },
31
+ 3: { root: 'row-span-3' },
32
+ 4: { root: 'row-span-4' },
33
+ 5: { root: 'row-span-5' },
34
+ 6: { root: 'row-span-6' },
35
+ full: { root: 'row-span-full' },
36
+ },
37
+ span: {
38
+ 1: { root: 'col-span-1' },
39
+ 2: { root: 'col-span-2' },
40
+ 3: { root: 'col-span-3' },
41
+ 4: { root: 'col-span-4' },
42
+ 5: { root: 'col-span-5' },
43
+ 6: { root: 'col-span-6' },
44
+ 7: { root: 'col-span-7' },
45
+ 8: { root: 'col-span-8' },
46
+ 9: { root: 'col-span-9' },
47
+ 10: { root: 'col-span-10' },
48
+ 11: { root: 'col-span-11' },
49
+ 12: { root: 'col-span-12' },
50
+ full: { root: 'col-span-full' },
51
+ },
52
+ spanLg: {
53
+ 1: { root: '@lg:col-span-1' },
54
+ 2: { root: '@lg:col-span-2' },
55
+ 3: { root: '@lg:col-span-3' },
56
+ 4: { root: '@lg:col-span-4' },
57
+ 5: { root: '@lg:col-span-5' },
58
+ 6: { root: '@lg:col-span-6' },
59
+ 7: { root: '@lg:col-span-7' },
60
+ 8: { root: '@lg:col-span-8' },
61
+ 9: { root: '@lg:col-span-9' },
62
+ 10: { root: '@lg:col-span-10' },
63
+ 11: { root: '@lg:col-span-11' },
64
+ 12: { root: '@lg:col-span-12' },
65
+ full: { root: '@lg:col-span-full' },
66
+ },
67
+ spanMd: {
68
+ 1: { root: '@md:col-span-1' },
69
+ 2: { root: '@md:col-span-2' },
70
+ 3: { root: '@md:col-span-3' },
71
+ 4: { root: '@md:col-span-4' },
72
+ 5: { root: '@md:col-span-5' },
73
+ 6: { root: '@md:col-span-6' },
74
+ 7: { root: '@md:col-span-7' },
75
+ 8: { root: '@md:col-span-8' },
76
+ 9: { root: '@md:col-span-9' },
77
+ 10: { root: '@md:col-span-10' },
78
+ 11: { root: '@md:col-span-11' },
79
+ 12: { root: '@md:col-span-12' },
80
+ full: { root: '@md:col-span-full' },
81
+ },
82
+ spanSm: {
83
+ 1: { root: '@sm:col-span-1' },
84
+ 2: { root: '@sm:col-span-2' },
85
+ 3: { root: '@sm:col-span-3' },
86
+ 4: { root: '@sm:col-span-4' },
87
+ 5: { root: '@sm:col-span-5' },
88
+ 6: { root: '@sm:col-span-6' },
89
+ 7: { root: '@sm:col-span-7' },
90
+ 8: { root: '@sm:col-span-8' },
91
+ 9: { root: '@sm:col-span-9' },
92
+ 10: { root: '@sm:col-span-10' },
93
+ 11: { root: '@sm:col-span-11' },
94
+ 12: { root: '@sm:col-span-12' },
95
+ full: { root: '@sm:col-span-full' },
96
+ },
97
+ spanXl: {
98
+ 1: { root: '@xl:col-span-1' },
99
+ 2: { root: '@xl:col-span-2' },
100
+ 3: { root: '@xl:col-span-3' },
101
+ 4: { root: '@xl:col-span-4' },
102
+ 5: { root: '@xl:col-span-5' },
103
+ 6: { root: '@xl:col-span-6' },
104
+ 7: { root: '@xl:col-span-7' },
105
+ 8: { root: '@xl:col-span-8' },
106
+ 9: { root: '@xl:col-span-9' },
107
+ 10: { root: '@xl:col-span-10' },
108
+ 11: { root: '@xl:col-span-11' },
109
+ 12: { root: '@xl:col-span-12' },
110
+ full: { root: '@xl:col-span-full' },
111
+ },
112
+ spanXs: {
113
+ 1: { root: '@xs:col-span-1' },
114
+ 2: { root: '@xs:col-span-2' },
115
+ 3: { root: '@xs:col-span-3' },
116
+ 4: { root: '@xs:col-span-4' },
117
+ 5: { root: '@xs:col-span-5' },
118
+ 6: { root: '@xs:col-span-6' },
119
+ 7: { root: '@xs:col-span-7' },
120
+ 8: { root: '@xs:col-span-8' },
121
+ 9: { root: '@xs:col-span-9' },
122
+ 10: { root: '@xs:col-span-10' },
123
+ 11: { root: '@xs:col-span-11' },
124
+ 12: { root: '@xs:col-span-12' },
125
+ full: { root: '@xs:col-span-full' },
126
+ },
127
+ start: {
128
+ 1: { root: 'col-start-1' },
129
+ 2: { root: 'col-start-2' },
130
+ 3: { root: 'col-start-3' },
131
+ 4: { root: 'col-start-4' },
132
+ 5: { root: 'col-start-5' },
133
+ 6: { root: 'col-start-6' },
134
+ 7: { root: 'col-start-7' },
135
+ 8: { root: 'col-start-8' },
136
+ 9: { root: 'col-start-9' },
137
+ 10: { root: 'col-start-10' },
138
+ 11: { root: 'col-start-11' },
139
+ 12: { root: 'col-start-12' },
140
+ 13: { root: 'col-start-13' },
141
+ auto: { root: 'col-start-auto' },
142
+ },
143
+ },
144
+ });
145
+
146
+ export type GridItemVariants = VariantProps<typeof gridItem>;
147
+
148
+ export interface GridItemProps extends HTMLAttributes<HTMLDivElement>, GridItemVariants {
149
+ classNames?: {
150
+ root?: string;
151
+ };
152
+ }
153
+
154
+ export const GridItem = forwardRef<HTMLDivElement, GridItemProps>(
155
+ (
156
+ {
157
+ children,
158
+ className,
159
+ classNames,
160
+ span,
161
+ spanXs,
162
+ spanSm,
163
+ spanMd,
164
+ spanLg,
165
+ spanXl,
166
+ start,
167
+ end,
168
+ rowSpan,
169
+ ...props
170
+ },
171
+ ref,
172
+ ) => {
173
+ const styles = gridItem({ end, rowSpan, span, spanLg, spanMd, spanSm, spanXl, spanXs, start });
174
+
175
+ return (
176
+ <div
177
+ className={styles.root({ className: classNames?.root ?? className })}
178
+ ref={ref}
179
+ {...props}
180
+ >
181
+ {children}
182
+ </div>
183
+ );
184
+ },
185
+ );
186
+ GridItem.displayName = 'GridItem';
187
+
188
+ export { gridItem };
@@ -0,0 +1,72 @@
1
+ import { tv, type VariantProps } from '@regardio/tailwind/utils';
2
+ import { createContext, forwardRef, type HTMLAttributes, useContext } from 'react';
3
+
4
+ const grid = tv({
5
+ defaultVariants: {
6
+ flow: 'dense',
7
+ },
8
+ slots: {
9
+ root: [
10
+ 'u-grid',
11
+ 'grid',
12
+ 'grid-cols-12',
13
+ 'gap-[var(--spacing-grid-gutter)]',
14
+ 'w-full',
15
+ 'container-[grid]/inline-size',
16
+ ],
17
+ },
18
+ variants: {
19
+ align: {
20
+ center: { root: 'content-center' },
21
+ end: { root: 'content-end' },
22
+ start: { root: 'content-start' },
23
+ stretch: { root: 'content-stretch' },
24
+ },
25
+ flow: {
26
+ column: { root: 'grid-auto-flow-col' },
27
+ dense: { root: 'grid-auto-flow-dense' },
28
+ row: { root: 'grid-auto-flow-row' },
29
+ },
30
+ },
31
+ });
32
+
33
+ type GridVariants = VariantProps<typeof grid>;
34
+
35
+ interface GridContextValue {
36
+ styles: ReturnType<typeof grid>;
37
+ }
38
+
39
+ const GridContext = createContext<GridContextValue | null>(null);
40
+
41
+ export function useGrid() {
42
+ const context = useContext(GridContext);
43
+ if (!context) {
44
+ throw new Error('useGrid must be used within a <Grid.Root />');
45
+ }
46
+ return context;
47
+ }
48
+
49
+ export interface GridRootProps extends HTMLAttributes<HTMLDivElement>, GridVariants {
50
+ classNames?: {
51
+ root?: string;
52
+ };
53
+ }
54
+
55
+ export const GridRoot = forwardRef<HTMLDivElement, GridRootProps>(
56
+ ({ children, className, classNames, flow, align, ...props }, ref) => {
57
+ const styles = grid({ align, flow });
58
+
59
+ return (
60
+ <GridContext.Provider value={{ styles }}>
61
+ <div
62
+ className={styles.root({ className: classNames?.root ?? className })}
63
+ ref={ref}
64
+ {...props}
65
+ >
66
+ {children}
67
+ </div>
68
+ </GridContext.Provider>
69
+ );
70
+ },
71
+ );
72
+ GridRoot.displayName = 'GridRoot';
@@ -0,0 +1,236 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Grid } from './index';
3
+
4
+ const meta: Meta<typeof Grid.Root> = {
5
+ component: Grid.Root,
6
+ decorators: [
7
+ (Story) => (
8
+ <div
9
+ style={
10
+ {
11
+ '--spacing-grid-gutter': '1rem',
12
+ '--spacing-grid-max': '80rem',
13
+ } as React.CSSProperties
14
+ }
15
+ >
16
+ <Story />
17
+ </div>
18
+ ),
19
+ ],
20
+ parameters: {
21
+ layout: 'padded',
22
+ },
23
+ title: 'Components/Grid',
24
+ };
25
+
26
+ export default meta;
27
+ type Story = StoryObj<typeof Grid.Root>;
28
+
29
+ const ItemBox = ({ children, className }: { children: React.ReactNode; className?: string }) => (
30
+ <div className={`bg-blue-100 border border-blue-300 rounded p-4 text-center ${className ?? ''}`}>
31
+ {children}
32
+ </div>
33
+ );
34
+
35
+ export const Default: Story = {
36
+ render: () => (
37
+ <Grid.Root>
38
+ <Grid.Item span={12}>
39
+ <ItemBox>Full width (12 cols)</ItemBox>
40
+ </Grid.Item>
41
+ <Grid.Item span={6}>
42
+ <ItemBox>Half (6 cols)</ItemBox>
43
+ </Grid.Item>
44
+ <Grid.Item span={6}>
45
+ <ItemBox>Half (6 cols)</ItemBox>
46
+ </Grid.Item>
47
+ <Grid.Item span={4}>
48
+ <ItemBox>Third (4 cols)</ItemBox>
49
+ </Grid.Item>
50
+ <Grid.Item span={4}>
51
+ <ItemBox>Third (4 cols)</ItemBox>
52
+ </Grid.Item>
53
+ <Grid.Item span={4}>
54
+ <ItemBox>Third (4 cols)</ItemBox>
55
+ </Grid.Item>
56
+ </Grid.Root>
57
+ ),
58
+ };
59
+
60
+ export const ResponsiveSpan: Story = {
61
+ name: 'Responsive Span (Container Queries)',
62
+ render: () => (
63
+ <Grid.Root>
64
+ <Grid.Item
65
+ span={12}
66
+ spanLg={3}
67
+ spanMd={4}
68
+ spanSm={6}
69
+ >
70
+ <ItemBox>12 → 6 → 4 → 3</ItemBox>
71
+ </Grid.Item>
72
+ <Grid.Item
73
+ span={12}
74
+ spanLg={3}
75
+ spanMd={4}
76
+ spanSm={6}
77
+ >
78
+ <ItemBox>12 → 6 → 4 → 3</ItemBox>
79
+ </Grid.Item>
80
+ <Grid.Item
81
+ span={12}
82
+ spanLg={3}
83
+ spanMd={4}
84
+ spanSm={6}
85
+ >
86
+ <ItemBox>12 → 6 → 4 → 3</ItemBox>
87
+ </Grid.Item>
88
+ <Grid.Item
89
+ span={12}
90
+ spanLg={3}
91
+ spanMd={4}
92
+ spanSm={6}
93
+ >
94
+ <ItemBox>12 → 6 → 4 → 3</ItemBox>
95
+ </Grid.Item>
96
+ </Grid.Root>
97
+ ),
98
+ };
99
+
100
+ export const ColumnPositioning: Story = {
101
+ name: 'Column Start/End Positioning',
102
+ render: () => (
103
+ <Grid.Root>
104
+ <Grid.Item
105
+ end={5}
106
+ start={1}
107
+ >
108
+ <ItemBox>Cols 1-4</ItemBox>
109
+ </Grid.Item>
110
+ <Grid.Item
111
+ end={13}
112
+ start={5}
113
+ >
114
+ <ItemBox>Cols 5-12</ItemBox>
115
+ </Grid.Item>
116
+ <Grid.Item
117
+ span={8}
118
+ start={3}
119
+ >
120
+ <ItemBox>Start at 3, span 8</ItemBox>
121
+ </Grid.Item>
122
+ </Grid.Root>
123
+ ),
124
+ };
125
+
126
+ export const RowSpan: Story = {
127
+ name: 'Row Spanning',
128
+ render: () => (
129
+ <Grid.Root>
130
+ <Grid.Item
131
+ rowSpan={2}
132
+ span={4}
133
+ >
134
+ <ItemBox className="h-full">Spans 2 rows</ItemBox>
135
+ </Grid.Item>
136
+ <Grid.Item span={8}>
137
+ <ItemBox>Row 1</ItemBox>
138
+ </Grid.Item>
139
+ <Grid.Item span={8}>
140
+ <ItemBox>Row 2</ItemBox>
141
+ </Grid.Item>
142
+ </Grid.Root>
143
+ ),
144
+ };
145
+
146
+ export const FlowVariants: Story = {
147
+ name: 'Grid Flow Variants',
148
+ render: () => (
149
+ <div className="space-y-8">
150
+ <div>
151
+ <h3 className="mb-2 font-semibold">Dense (default)</h3>
152
+ <Grid.Root flow="dense">
153
+ <Grid.Item span={8}>
154
+ <ItemBox>8 cols</ItemBox>
155
+ </Grid.Item>
156
+ <Grid.Item span={6}>
157
+ <ItemBox>6 cols</ItemBox>
158
+ </Grid.Item>
159
+ <Grid.Item span={4}>
160
+ <ItemBox>4 cols (fills gap)</ItemBox>
161
+ </Grid.Item>
162
+ </Grid.Root>
163
+ </div>
164
+ <div>
165
+ <h3 className="mb-2 font-semibold">Row</h3>
166
+ <Grid.Root flow="row">
167
+ <Grid.Item span={8}>
168
+ <ItemBox>8 cols</ItemBox>
169
+ </Grid.Item>
170
+ <Grid.Item span={6}>
171
+ <ItemBox>6 cols</ItemBox>
172
+ </Grid.Item>
173
+ <Grid.Item span={4}>
174
+ <ItemBox>4 cols (new row)</ItemBox>
175
+ </Grid.Item>
176
+ </Grid.Root>
177
+ </div>
178
+ </div>
179
+ ),
180
+ };
181
+
182
+ export const AlignVariants: Story = {
183
+ name: 'Content Alignment',
184
+ render: () => (
185
+ <div className="space-y-8">
186
+ <div>
187
+ <h3 className="mb-2 font-semibold">Start</h3>
188
+ <Grid.Root
189
+ align="start"
190
+ className="min-h-[200px] bg-gray-50"
191
+ >
192
+ <Grid.Item span={4}>
193
+ <ItemBox>Item</ItemBox>
194
+ </Grid.Item>
195
+ <Grid.Item span={4}>
196
+ <ItemBox>Item</ItemBox>
197
+ </Grid.Item>
198
+ </Grid.Root>
199
+ </div>
200
+ <div>
201
+ <h3 className="mb-2 font-semibold">Center</h3>
202
+ <Grid.Root
203
+ align="center"
204
+ className="min-h-[200px] bg-gray-50"
205
+ >
206
+ <Grid.Item span={4}>
207
+ <ItemBox>Item</ItemBox>
208
+ </Grid.Item>
209
+ <Grid.Item span={4}>
210
+ <ItemBox>Item</ItemBox>
211
+ </Grid.Item>
212
+ </Grid.Root>
213
+ </div>
214
+ </div>
215
+ ),
216
+ };
217
+
218
+ export const StyleOverrides: Story = {
219
+ name: 'Style Overrides (tailwind-variants)',
220
+ render: () => (
221
+ <Grid.Root className="bg-linear-to-r from-purple-50 to-pink-50 p-4 rounded-lg">
222
+ <Grid.Item
223
+ className="bg-purple-200 rounded-lg p-6"
224
+ span={6}
225
+ >
226
+ Custom styled item
227
+ </Grid.Item>
228
+ <Grid.Item
229
+ className="bg-pink-200 rounded-lg p-6"
230
+ span={6}
231
+ >
232
+ Custom styled item
233
+ </Grid.Item>
234
+ </Grid.Root>
235
+ ),
236
+ };
@@ -0,0 +1,2 @@
1
+ export { GridItem as Item } from './grid-item';
2
+ export { GridRoot as Root } from './grid-root';
@@ -0,0 +1,5 @@
1
+ export type { GridItemProps, GridItemVariants } from './grid-item';
2
+ export { gridItem } from './grid-item';
3
+ export type { GridRootProps } from './grid-root';
4
+ export { useGrid } from './grid-root';
5
+ export * as Grid from './index.parts';
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Heading } from '../components/heading';
2
+ import { Heading } from './heading';
3
3
 
4
4
  const meta: Meta<typeof Heading> = {
5
5
  component: Heading,