@optilogic/core 1.0.0-beta.3 → 1.0.0-beta.6

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": "@optilogic/core",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.6",
4
4
  "description": "Core UI components for Optilogic - A professional React component library",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -38,22 +38,22 @@
38
38
  "README.md"
39
39
  ],
40
40
  "dependencies": {
41
- "@radix-ui/react-accordion": "^1.2.0",
42
- "@radix-ui/react-alert-dialog": "^1.1.0",
43
- "@radix-ui/react-checkbox": "^1.1.0",
44
- "@radix-ui/react-dropdown-menu": "^2.1.0",
45
- "@radix-ui/react-label": "^2.1.0",
46
- "@radix-ui/react-popover": "^1.1.0",
47
- "@radix-ui/react-progress": "^1.1.0",
48
- "@radix-ui/react-select": "^2.1.0",
49
- "@radix-ui/react-separator": "^1.1.0",
50
- "@radix-ui/react-slot": "^1.1.0",
51
- "@radix-ui/react-switch": "^1.1.0",
52
- "@radix-ui/react-tabs": "^1.1.0",
53
- "@radix-ui/react-tooltip": "^1.1.0",
41
+ "@radix-ui/react-accordion": "^1.2.2",
42
+ "@radix-ui/react-alert-dialog": "^1.1.4",
43
+ "@radix-ui/react-checkbox": "^1.1.3",
44
+ "@radix-ui/react-dropdown-menu": "^2.1.4",
45
+ "@radix-ui/react-label": "^2.1.1",
46
+ "@radix-ui/react-popover": "^1.1.4",
47
+ "@radix-ui/react-progress": "^1.1.1",
48
+ "@radix-ui/react-select": "^2.1.4",
49
+ "@radix-ui/react-separator": "^1.1.1",
50
+ "@radix-ui/react-slot": "^1.2.4",
51
+ "@radix-ui/react-switch": "^1.1.2",
52
+ "@radix-ui/react-tabs": "^1.1.2",
53
+ "@radix-ui/react-tooltip": "^1.1.5",
54
54
  "class-variance-authority": "^0.7.1",
55
55
  "clsx": "^2.1.1",
56
- "lucide-react": "^0.400.0",
56
+ "lucide-react": "^0.563.0",
57
57
  "tailwind-merge": "^3.0.1"
58
58
  },
59
59
  "peerDependencies": {
@@ -80,15 +80,15 @@
80
80
  }
81
81
  },
82
82
  "devDependencies": {
83
- "@types/react": "^18.3.0",
84
- "@types/react-dom": "^18.3.0",
83
+ "@types/react": "^19.0.0",
84
+ "@types/react-dom": "^19.0.0",
85
85
  "autoprefixer": "^10.4.20",
86
86
  "date-fns": "^4.1.0",
87
87
  "postcss": "^8.4.49",
88
- "react": "^18.3.1",
88
+ "react": "^19.0.0",
89
89
  "react-day-picker": "^9.13.0",
90
- "react-dom": "^18.3.1",
91
- "tailwindcss": "^3.4.16",
90
+ "react-dom": "^19.0.0",
91
+ "tailwindcss": "^3.4.19",
92
92
  "tsup": "^8.3.5",
93
93
  "typescript": "^5.7.2"
94
94
  },
@@ -0,0 +1,251 @@
1
+ import * as React from "react";
2
+ import { cva, type VariantProps } from "class-variance-authority";
3
+
4
+ import { cn } from "../utils/cn";
5
+
6
+ // =============================================================================
7
+ // Board Variants
8
+ // =============================================================================
9
+
10
+ /**
11
+ * Board variant styles using class-variance-authority.
12
+ * Provides elevation (shadow), border, padding, radius, background, and hover options.
13
+ */
14
+ const boardVariants = cva("text-card-foreground", {
15
+ variants: {
16
+ /**
17
+ * Elevation (shadow depth) - similar to MUI Paper
18
+ */
19
+ elevation: {
20
+ none: "",
21
+ sm: "shadow-sm",
22
+ md: "shadow",
23
+ lg: "shadow-lg",
24
+ xl: "shadow-xl",
25
+ },
26
+ /**
27
+ * Border style
28
+ */
29
+ border: {
30
+ none: "",
31
+ default: "border",
32
+ muted: "border border-muted",
33
+ },
34
+ /**
35
+ * Padding size
36
+ */
37
+ padding: {
38
+ none: "",
39
+ sm: "p-2",
40
+ md: "p-4",
41
+ lg: "p-6",
42
+ xl: "p-8",
43
+ },
44
+ /**
45
+ * Border radius
46
+ */
47
+ radius: {
48
+ none: "rounded-none",
49
+ sm: "rounded-sm",
50
+ md: "rounded-md",
51
+ lg: "rounded-lg",
52
+ xl: "rounded-xl",
53
+ full: "rounded-full",
54
+ },
55
+ /**
56
+ * Background color
57
+ */
58
+ background: {
59
+ default: "bg-card",
60
+ muted: "bg-muted",
61
+ transparent: "bg-transparent",
62
+ },
63
+ /**
64
+ * Hover effect styles
65
+ */
66
+ hover: {
67
+ none: "",
68
+ border: "transition-colors duration-200 hover:border-accent",
69
+ elevate: "transition-shadow duration-200 hover:shadow-lg",
70
+ "border-success": "transition-colors duration-200 hover:border-success",
71
+ "border-warning": "transition-colors duration-200 hover:border-warning",
72
+ "border-destructive":
73
+ "transition-colors duration-200 hover:border-destructive",
74
+ },
75
+ },
76
+ defaultVariants: {
77
+ elevation: "none",
78
+ border: "default",
79
+ padding: "none",
80
+ radius: "lg",
81
+ background: "default",
82
+ hover: "none",
83
+ },
84
+ });
85
+
86
+ // =============================================================================
87
+ // Board Component
88
+ // =============================================================================
89
+
90
+ export interface BoardProps
91
+ extends React.HTMLAttributes<HTMLDivElement>,
92
+ VariantProps<typeof boardVariants> {
93
+ /**
94
+ * Custom CSS class for hover border color.
95
+ * Use Tailwind classes like "hover:border-blue-500" or custom CSS variables.
96
+ * This overrides the hover variant's border color if specified.
97
+ */
98
+ hoverBorderClass?: string;
99
+ }
100
+
101
+ /**
102
+ * Board - General-purpose container component with elevation support
103
+ *
104
+ * A flexible container similar to MUI's Paper component. Supports configurable
105
+ * elevation (shadows), borders, padding, border radius, background colors,
106
+ * and hover effects. Use with BoardHeader and BoardContent for structured layouts.
107
+ *
108
+ * @example
109
+ * // Simple container
110
+ * <Board elevation="md" padding="md">
111
+ * <p>Content here</p>
112
+ * </Board>
113
+ *
114
+ * @example
115
+ * // With header and content
116
+ * <Board elevation="lg" border="default">
117
+ * <BoardHeader>
118
+ * <span className="font-semibold">Section Title</span>
119
+ * </BoardHeader>
120
+ * <BoardContent>
121
+ * Main content goes here
122
+ * </BoardContent>
123
+ * </Board>
124
+ *
125
+ * @example
126
+ * // Transparent background with hover effect
127
+ * <Board background="transparent" hover="border" border="muted">
128
+ * <BoardContent>Hoverable content</BoardContent>
129
+ * </Board>
130
+ */
131
+ const Board = React.forwardRef<HTMLDivElement, BoardProps>(
132
+ (
133
+ {
134
+ className,
135
+ elevation,
136
+ border,
137
+ padding,
138
+ radius,
139
+ background,
140
+ hover,
141
+ hoverBorderClass,
142
+ ...props
143
+ },
144
+ ref
145
+ ) => {
146
+ return (
147
+ <div
148
+ ref={ref}
149
+ className={cn(
150
+ boardVariants({
151
+ elevation,
152
+ border,
153
+ padding,
154
+ radius,
155
+ background,
156
+ hover,
157
+ }),
158
+ // Custom hover border color overrides variant if provided
159
+ hoverBorderClass && "transition-colors duration-200",
160
+ hoverBorderClass,
161
+ className
162
+ )}
163
+ {...props}
164
+ />
165
+ );
166
+ }
167
+ );
168
+ Board.displayName = "Board";
169
+
170
+ // =============================================================================
171
+ // BoardHeader Component
172
+ // =============================================================================
173
+
174
+ export interface BoardHeaderProps
175
+ extends React.HTMLAttributes<HTMLDivElement> {}
176
+
177
+ /**
178
+ * BoardHeader - Header section with bottom separator
179
+ *
180
+ * Renders a header area with a bottom border divider. Accepts any children
181
+ * including text, icons, badges, or custom layouts.
182
+ *
183
+ * @example
184
+ * <Board>
185
+ * <BoardHeader>
186
+ * <span className="font-semibold">Title</span>
187
+ * </BoardHeader>
188
+ * <BoardContent>Content</BoardContent>
189
+ * </Board>
190
+ *
191
+ * @example
192
+ * // With custom layout
193
+ * <BoardHeader className="flex items-center justify-between">
194
+ * <div className="flex items-center gap-2">
195
+ * <FileIcon />
196
+ * <span>Documents</span>
197
+ * </div>
198
+ * <Badge>12</Badge>
199
+ * </BoardHeader>
200
+ */
201
+ const BoardHeader = React.forwardRef<HTMLDivElement, BoardHeaderProps>(
202
+ ({ className, ...props }, ref) => (
203
+ <div
204
+ ref={ref}
205
+ className={cn("flex items-center p-4 border-b", className)}
206
+ {...props}
207
+ />
208
+ )
209
+ );
210
+ BoardHeader.displayName = "BoardHeader";
211
+
212
+ // =============================================================================
213
+ // BoardContent Component
214
+ // =============================================================================
215
+
216
+ export interface BoardContentProps
217
+ extends React.HTMLAttributes<HTMLDivElement> {}
218
+
219
+ /**
220
+ * BoardContent - Main content area with consistent padding
221
+ *
222
+ * Provides a padded container for the main content. Useful when using
223
+ * BoardHeader to maintain proper spacing.
224
+ *
225
+ * @example
226
+ * <Board>
227
+ * <BoardHeader>Title</BoardHeader>
228
+ * <BoardContent>
229
+ * Main content goes here
230
+ * </BoardContent>
231
+ * </Board>
232
+ */
233
+ const BoardContent = React.forwardRef<HTMLDivElement, BoardContentProps>(
234
+ ({ className, ...props }, ref) => (
235
+ <div ref={ref} className={cn("p-4", className)} {...props} />
236
+ )
237
+ );
238
+ BoardContent.displayName = "BoardContent";
239
+
240
+ // =============================================================================
241
+ // Exports
242
+ // =============================================================================
243
+
244
+ export {
245
+ // Components
246
+ Board,
247
+ BoardHeader,
248
+ BoardContent,
249
+ // Variants (for advanced customization)
250
+ boardVariants,
251
+ };
@@ -369,7 +369,7 @@ export interface UseContextMenuResult<T = unknown> {
369
369
  /** Target item that was right-clicked */
370
370
  targetItem: T | null;
371
371
  /** Ref for the menu element */
372
- menuRef: React.RefObject<HTMLDivElement>;
372
+ menuRef: React.RefObject<HTMLDivElement | null>;
373
373
  /** Open the context menu */
374
374
  openMenu: (x: number, y: number, item: T) => void;
375
375
  /** Close the context menu */
@@ -45,7 +45,7 @@ export interface UseKeyboardNavigationReturn {
45
45
  /** Handler to attach to the grid container */
46
46
  handleKeyDown: (event: React.KeyboardEvent) => void;
47
47
  /** Ref to attach to the grid container for focus management */
48
- containerRef: React.RefObject<HTMLDivElement>;
48
+ containerRef: React.RefObject<HTMLDivElement | null>;
49
49
  /** Focus the container (useful after clicking a cell) */
50
50
  focusContainer: () => void;
51
51
  }
package/src/index.ts CHANGED
@@ -142,6 +142,19 @@ export {
142
142
  type CardListProps,
143
143
  } from "./components/card";
144
144
 
145
+ export {
146
+ // Board components
147
+ Board,
148
+ BoardHeader,
149
+ BoardContent,
150
+ // Variants (for advanced customization)
151
+ boardVariants,
152
+ // Types
153
+ type BoardProps,
154
+ type BoardHeaderProps,
155
+ type BoardContentProps,
156
+ } from "./components/board";
157
+
145
158
  export {
146
159
  Table,
147
160
  TableHeader,