@regardio/react 0.4.5 → 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 +124 -26
  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,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,
@@ -1,43 +1,36 @@
1
+ import { cn, tv } from '@regardio/tailwind/utils';
1
2
  import type { ElementType, HTMLAttributes } from 'react';
2
- import { cn, cva, type VariantProps } from '../utils/cn';
3
3
  import { lowerCaseSzett, shy } from '../utils/text';
4
4
 
5
- const heading = cva({
5
+ const levelVariants = {
6
+ 1: ['text-2xl'],
7
+ 2: ['text-xl'],
8
+ 3: ['text-lg'],
9
+ 4: ['text-md'],
10
+ 5: ['text-sm'],
11
+ 6: ['text-xs'],
12
+ } as const;
13
+
14
+ const heading = tv({
6
15
  base: [],
7
16
  defaultVariants: {
8
17
  level: 3,
9
18
  },
10
19
  variants: {
11
- level: {
12
- 1: ['text-2xl'],
13
- 2: ['text-xl'],
14
- 3: ['text-lg'],
15
- 4: ['text-md'],
16
- 5: ['text-sm'],
17
- 6: ['text-xs'],
18
- },
19
- variant: {},
20
+ level: levelVariants,
20
21
  },
21
22
  });
22
23
 
23
- export interface HeadingProps
24
- extends HTMLAttributes<HTMLHeadingElement>,
25
- VariantProps<typeof heading> {
24
+ export type HeadingLevel = keyof typeof levelVariants;
25
+
26
+ export interface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {
26
27
  as?: ElementType;
27
28
  className?: string;
29
+ level?: HeadingLevel;
28
30
  locale?: string;
29
31
  }
30
32
 
31
- export type HeadingLevel = HeadingProps['level'];
32
-
33
- export const Heading = ({
34
- as,
35
- children,
36
- className,
37
- level = 2,
38
- variant,
39
- ...props
40
- }: HeadingProps) => {
33
+ export const Heading = ({ as, children, className, level = 2, ...props }: HeadingProps) => {
41
34
  const word = lowerCaseSzett(shy(children));
42
35
  const Component: ElementType = as || `h${level}`;
43
36
 
@@ -46,7 +39,6 @@ export const Heading = ({
46
39
  className={cn(
47
40
  heading({
48
41
  level,
49
- variant,
50
42
  }),
51
43
  className,
52
44
  )}
@@ -0,0 +1,2 @@
1
+ export type { HeadingLevel, HeadingProps } from './heading';
2
+ export { Heading } from './heading';
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Highlight } from '../components/highlight';
2
+ import { Highlight } from './highlight';
3
3
 
4
4
  const meta: Meta<typeof Highlight> = {
5
5
  component: Highlight,
@@ -1,25 +1,29 @@
1
+ import { tv } from '@regardio/tailwind/utils';
1
2
  import type { ComponentProps } from 'react';
2
- import { cva, type VariantProps } from '../utils/cn';
3
3
 
4
- const li = cva({
4
+ const highlightVariants = {
5
+ primary: ['highlight'],
6
+ } as const;
7
+
8
+ const highlight = tv({
5
9
  defaultVariants: {
6
10
  variant: 'primary',
7
11
  },
8
12
  variants: {
9
- variant: {
10
- primary: ['highlight'],
11
- },
13
+ variant: highlightVariants,
12
14
  },
13
15
  });
14
16
 
15
- export interface HighlightProps extends ComponentProps<'mark'>, VariantProps<typeof li> {}
17
+ export type HighlightVariant = keyof typeof highlightVariants;
16
18
 
17
- export const Highlight = (props: HighlightProps) => {
18
- const { children, className, variant } = props;
19
+ export interface HighlightProps extends ComponentProps<'mark'> {
20
+ variant?: HighlightVariant;
21
+ }
19
22
 
23
+ export const Highlight = ({ children, className, variant }: HighlightProps) => {
20
24
  return (
21
25
  <mark
22
- className={li({
26
+ className={highlight({
23
27
  className,
24
28
  variant,
25
29
  })}
@@ -0,0 +1,2 @@
1
+ export type { HighlightProps } from './highlight';
2
+ export { Highlight } from './highlight';
@@ -0,0 +1 @@
1
+ export { useCurrentRouteData } from './use-current-route-data';
@@ -0,0 +1 @@
1
+ export { useFocusSearch } from './use-focus-search';
@@ -0,0 +1 @@
1
+ export { useMatchesData } from './use-matches-data';
@@ -0,0 +1 @@
1
+ export { useMediaQuery } from './use-media-query';
@@ -0,0 +1 @@
1
+ export { useIsMobile } from './use-mobile';
@@ -0,0 +1 @@
1
+ export { NonceProvider, useNonce } from './use-nonce';
@@ -0,0 +1 @@
1
+ export { useOrientation } from './use-orientation';
@@ -0,0 +1,2 @@
1
+ export type { UserContextProviderProps, UserContextType } from './use-user';
2
+ export { UserContext, UserContextProvider, useUser } from './use-user';
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { IconButton } from '../components/icon-button';
2
+ import { IconButton } from './icon-button';
3
3
 
4
4
  const meta: Meta<typeof IconButton> = {
5
5
  component: IconButton,
@@ -0,0 +1,2 @@
1
+ export type { IconButtonProps } from './icon-button';
2
+ export { IconButton } from './icon-button';
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { If } from '../components/if';
2
+ import { If } from './if';
3
3
 
4
4
  const meta: Meta<typeof If> = {
5
5
  component: If,
@@ -0,0 +1 @@
1
+ export { If } from './if';
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Iframe } from '../components/iframe';
2
+ import { Iframe } from './iframe';
3
3
 
4
4
  const meta: Meta<typeof Iframe> = {
5
5
  component: Iframe,
@@ -1,5 +1,5 @@
1
+ import { cn } from '@regardio/tailwind/utils';
1
2
  import type React from 'react';
2
- import { cn } from '../utils/cn';
3
3
 
4
4
  export type IframeProps = {
5
5
  src: string;
@@ -0,0 +1,2 @@
1
+ export type { IframeProps } from './iframe';
2
+ export { Iframe } from './iframe';
@@ -0,0 +1,2 @@
1
+ export type { LinkBaseProps, LinkProps, MarkdownLinkProps, PathResolver } from './link';
2
+ export { Link, LinkBase, MarkdownLink, PathResolverProvider, usePathResolver } from './link';
@@ -1,6 +1,6 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import { MemoryRouter } from 'react-router';
3
- import { Link } from '../components/link';
3
+ import { Link } from './link';
4
4
 
5
5
  const meta: Meta<typeof Link> = {
6
6
  component: Link,
@@ -1,7 +1,9 @@
1
+ 'use client';
2
+
3
+ import { tv } from '@regardio/tailwind/utils';
1
4
  import { createContext, useCallback, useContext } from 'react';
2
5
  import type { NavLinkProps, NavLinkRenderProps } from 'react-router';
3
6
  import { NavLink } from 'react-router';
4
- import { cva, type VariantProps } from '../utils/cn';
5
7
  import { lowerCaseSzett } from '../utils/text';
6
8
 
7
9
  /**
@@ -120,42 +122,51 @@ export const LinkBase = ({
120
122
  );
121
123
  };
122
124
 
123
- const link = cva({
125
+ const arrowVariants = {
126
+ darr: 'darr',
127
+ larr: 'larr',
128
+ rarr: 'rarr',
129
+ uarr: 'uarr',
130
+ } as const;
131
+
132
+ const linkVariants = {
133
+ button: [
134
+ 'block',
135
+ 'button',
136
+ 'mt-s',
137
+ 'relative',
138
+ 'rarr',
139
+ 'text-right',
140
+ 'text-sm',
141
+ 'tracking-wider',
142
+ 'uppercase',
143
+ ],
144
+ code: ['font-monospace'],
145
+ link: ['rarr', '!bg-transparent', 'uppercase', '!tracking-wider'],
146
+ navtitle: ['block', 'uppercase', 'tracking-wider'],
147
+ primary: [],
148
+ subtitle: ['text-lg'],
149
+ } as const;
150
+
151
+ const link = tv({
124
152
  base: [],
125
153
  defaultVariants: {
126
154
  variant: 'primary',
127
155
  },
128
156
  variants: {
129
- arrow: {
130
- darr: 'darr',
131
- larr: 'larr',
132
- rarr: 'rarr',
133
- uarr: 'uarr',
134
- },
135
- variant: {
136
- button: [
137
- 'block',
138
- 'button',
139
- 'mt-s',
140
- 'relative',
141
- 'rarr',
142
- 'text-right',
143
- 'text-sm',
144
- 'tracking-wider',
145
- 'uppercase',
146
- ],
147
- code: ['font-monospace'],
148
- link: ['rarr', '!bg-transparent', 'uppercase', '!tracking-wider'],
149
- navtitle: ['block', 'uppercase', 'tracking-wider'],
150
- primary: [],
151
- subtitle: ['text-lg'],
152
- },
157
+ arrow: arrowVariants,
158
+ variant: linkVariants,
153
159
  },
154
160
  });
155
161
 
156
- export interface LinkProps extends Omit<NavLinkProps, 'to'>, VariantProps<typeof link> {
162
+ export type LinkArrow = keyof typeof arrowVariants;
163
+ export type LinkVariant = keyof typeof linkVariants;
164
+
165
+ export interface LinkProps extends Omit<NavLinkProps, 'to'> {
166
+ arrow?: LinkArrow;
157
167
  to?: string | Partial<{ pathname?: string; search?: string; hash?: string }>;
158
168
  routeKey?: string;
169
+ variant?: LinkVariant;
159
170
  viewTransition?: boolean;
160
171
  }
161
172
 
@@ -174,7 +185,7 @@ export const Link = ({
174
185
  {...props}
175
186
  className={link({
176
187
  arrow,
177
- className,
188
+ className: typeof className === 'string' ? className : undefined,
178
189
  variant,
179
190
  })}
180
191
  routeKey={routeKey}
@@ -0,0 +1,2 @@
1
+ export { ListItem as Item } from './list-item';
2
+ export { ListRoot as Root } from './list-root';
@@ -0,0 +1,4 @@
1
+ export * as List from './index.parts';
2
+ export type { ListItemProps } from './list-item';
3
+ export type { ListRootProps } from './list-root';
4
+ export type { ListRootContextValue } from './list-root-context';