@olwiba/ui 0.0.41 → 0.0.42

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olwiba/ui",
3
- "version": "0.0.41",
3
+ "version": "0.0.42",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/src/index.ts CHANGED
@@ -14,6 +14,9 @@ export {
14
14
  // ─── Primitives — mode-aware re-exports of @olwiba/cn components ─────────────
15
15
  export * from './primitives';
16
16
 
17
+ // ─── Layout — grid, stack, section primitives ────────────────────────────────
18
+ export * from './layout';
19
+
17
20
  // ─── App — shells, auth, feedback ────────────────────────────────────────────
18
21
  export {
19
22
  AppShell,
@@ -0,0 +1,72 @@
1
+ import React from 'react'
2
+ import { cn } from '../lib/utils'
3
+
4
+ const colsMap: Record<number, string> = {
5
+ 1: 'grid-cols-1',
6
+ 2: 'grid-cols-2',
7
+ 3: 'grid-cols-3',
8
+ 4: 'grid-cols-4',
9
+ 5: 'grid-cols-5',
10
+ 6: 'grid-cols-6',
11
+ 12: 'grid-cols-12',
12
+ }
13
+
14
+ const gapMap = {
15
+ none: 'gap-0',
16
+ xs: 'gap-2',
17
+ sm: 'gap-3',
18
+ md: 'gap-4',
19
+ lg: 'gap-6',
20
+ xl: 'gap-8',
21
+ }
22
+
23
+ const spanMap: Record<number, string> = {
24
+ 1: 'col-span-1',
25
+ 2: 'col-span-2',
26
+ 3: 'col-span-3',
27
+ 4: 'col-span-4',
28
+ 5: 'col-span-5',
29
+ 6: 'col-span-6',
30
+ 7: 'col-span-7',
31
+ 8: 'col-span-8',
32
+ 9: 'col-span-9',
33
+ 10: 'col-span-10',
34
+ 11: 'col-span-11',
35
+ 12: 'col-span-12',
36
+ }
37
+
38
+ const rowSpanMap: Record<number, string> = {
39
+ 1: 'row-span-1',
40
+ 2: 'row-span-2',
41
+ 3: 'row-span-3',
42
+ 4: 'row-span-4',
43
+ }
44
+
45
+ export interface GridProps extends React.HTMLAttributes<HTMLDivElement> {
46
+ columns?: 1 | 2 | 3 | 4 | 5 | 6 | 12
47
+ gap?: keyof typeof gapMap
48
+ }
49
+
50
+ export function Grid({ columns = 3, gap = 'md', className, children, ...props }: GridProps) {
51
+ return (
52
+ <div className={cn('grid', colsMap[columns], gapMap[gap], className)} {...props}>
53
+ {children}
54
+ </div>
55
+ )
56
+ }
57
+
58
+ export interface GridItemProps extends React.HTMLAttributes<HTMLDivElement> {
59
+ span?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
60
+ rowSpan?: 1 | 2 | 3 | 4
61
+ }
62
+
63
+ export function GridItem({ span = 1, rowSpan, className, children, ...props }: GridItemProps) {
64
+ return (
65
+ <div
66
+ className={cn(spanMap[span], rowSpan != null && rowSpanMap[rowSpan], className)}
67
+ {...props}
68
+ >
69
+ {children}
70
+ </div>
71
+ )
72
+ }
@@ -0,0 +1,29 @@
1
+ import React from 'react'
2
+ import { cn } from '../lib/utils'
3
+
4
+ const paddingMap = {
5
+ none: '',
6
+ sm: 'py-4',
7
+ md: 'py-8',
8
+ lg: 'py-16',
9
+ }
10
+
11
+ export interface SectionProps extends React.HTMLAttributes<HTMLElement> {
12
+ title?: string
13
+ description?: string
14
+ padding?: keyof typeof paddingMap
15
+ }
16
+
17
+ export function Section({ title, description, padding = 'md', className, children, ...props }: SectionProps) {
18
+ return (
19
+ <section className={cn('w-full', paddingMap[padding], className)} {...props}>
20
+ {(title || description) && (
21
+ <div className="mb-6">
22
+ {title && <h2 className="text-xl font-semibold text-foreground">{title}</h2>}
23
+ {description && <p className="mt-1 text-sm text-muted-foreground">{description}</p>}
24
+ </div>
25
+ )}
26
+ {children}
27
+ </section>
28
+ )
29
+ }
@@ -0,0 +1,62 @@
1
+ import React from 'react'
2
+ import { cn } from '../lib/utils'
3
+
4
+ const gapMap = {
5
+ none: 'gap-0',
6
+ xs: 'gap-2',
7
+ sm: 'gap-3',
8
+ md: 'gap-4',
9
+ lg: 'gap-6',
10
+ xl: 'gap-8',
11
+ }
12
+
13
+ const alignMap = {
14
+ start: 'items-start',
15
+ center: 'items-center',
16
+ end: 'items-end',
17
+ stretch: 'items-stretch',
18
+ }
19
+
20
+ const justifyMap = {
21
+ start: 'justify-start',
22
+ center: 'justify-center',
23
+ end: 'justify-end',
24
+ between: 'justify-between',
25
+ around: 'justify-around',
26
+ }
27
+
28
+ export interface StackProps extends React.HTMLAttributes<HTMLDivElement> {
29
+ direction?: 'col' | 'row'
30
+ gap?: keyof typeof gapMap
31
+ align?: keyof typeof alignMap
32
+ justify?: keyof typeof justifyMap
33
+ wrap?: boolean
34
+ }
35
+
36
+ export function Stack({
37
+ direction = 'col',
38
+ gap = 'md',
39
+ align = 'stretch',
40
+ justify = 'start',
41
+ wrap = false,
42
+ className,
43
+ children,
44
+ ...props
45
+ }: StackProps) {
46
+ return (
47
+ <div
48
+ className={cn(
49
+ 'flex',
50
+ direction === 'col' ? 'flex-col' : 'flex-row',
51
+ gapMap[gap],
52
+ alignMap[align],
53
+ justifyMap[justify],
54
+ wrap && 'flex-wrap',
55
+ className,
56
+ )}
57
+ {...props}
58
+ >
59
+ {children}
60
+ </div>
61
+ )
62
+ }
@@ -0,0 +1,6 @@
1
+ export { Grid, GridItem } from './Grid'
2
+ export type { GridProps, GridItemProps } from './Grid'
3
+ export { Stack } from './Stack'
4
+ export type { StackProps } from './Stack'
5
+ export { Section } from './Section'
6
+ export type { SectionProps } from './Section'