Grid
optics/gridFreeComponent
A flexible grid system component for layout.
See it running
Open the demo on optics
optics.agusmayol.com.ar/components/gridInstall it
npx shadcn@latest add https://optics.agusmayol.com.ar/r/grid.jsonSource
1"use client";2import * as React from "react";3import { cn } from "@/registry/optics/lib/utils";4import { Plus } from "lucide-react";56// Crear el contexto7const GridContext = React.createContext(null);89// Hook para usar el contexto10const useGridContext = () => {11 const context = React.useContext(GridContext);12 if (!context) {13 throw new Error("GridRow y GridItem deben estar dentro de GridContainer");14 }15 return context;16};1718// Provider que envuelve el container19export const GridContainer = ({20 cols = 12,21 rows = 1,22 gap = 0,23 border = true,24 className = "",25 children = null,26 ...props27}) => {28 const contextValue = {29 cols,30 rows,31 gap,32 border,33 ...props,34 };3536 return (37 <GridContext.Provider value={contextValue}>38 <div39 className={cn(`w-full grid`, className)}40 style={{41 gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,42 gridTemplateRows: `repeat(${rows}, minmax(0, 1fr))`,43 gap,44 }}45 {...props}46 >47 {children}48 </div>49 </GridContext.Provider>50 );51};5253export const GridRow = ({54 className = "",55 children = null,56 span: paramSpan = 0,57 gap: paramGap = 0,58 overrideStyles = false,59 borderTop = true,60 borderBottom = true,61 ...props62}) => {63 const { cols, gap: containerGap, border } = useGridContext();64 const gap = paramGap || containerGap;65 const span = paramSpan || cols;6667 return (68 <div69 className={cn(70 `w-full grid border-t last:border-b -mb-[1px] s`,71 gap > 0 && "!border-b -mb-0",72 !border && "!border-0",73 !borderTop && "!border-t-0",74 !borderBottom && "!border-b-0",75 className,76 )}77 style={78 overrideStyles79 ? undefined80 : {81 gridColumn: `span ${cols} / span ${span}`,82 gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,83 gap,84 }85 }86 {...props}87 >88 {children}89 </div>90 );91};9293export const GridItem = ({94 className = "",95 children = null,96 span = 1,97 borderLeft = true,98 borderRight = true,99 borderTop = false,100 borderBottom = false,101 decorationTopLeft = false,102 decorationTopRight = false,103 decorationBottomLeft = false,104 decorationBottomRight = false,105 ...props106}) => {107 const { cols, border } = useGridContext();108 const hasDecorations =109 decorationTopLeft ||110 decorationTopRight ||111 decorationBottomLeft ||112 decorationBottomRight;113114 return (115 <div116 className={cn(117 `border-l last:border-r flex items-center justify-center relative`,118 // Aspect square solo en desktop para evitar elementos muy pequeños en mobile119// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from optics
All 79 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | optics | Components | Free | 5 deps | |
| Alertalert | optics | Components | Free | 4 deps | |
| Alert Dialogalert-dialog | optics | Components | Free | 4 deps | |
| Aspect Ratioaspect-ratio | optics | Components | Free | 2 deps | |
| Auto Heightauto-height | optics | Components | Free | 3 deps | |
| Avataravatar | optics | Components | Free | 3 deps | |
| Badgebadge | optics | Components | Free | 4 deps | |
| Breadcrumbbreadcrumb | optics | Components | Free | 4 deps |
