@nccirtu/tablefy 0.8.4 → 0.9.0

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 (243) hide show
  1. package/README.md +224 -200
  2. package/dist/columns/forms/builders/actions-builder.d.ts +14 -0
  3. package/dist/columns/forms/builders/form-schema.d.ts +35 -0
  4. package/dist/columns/forms/builders/index.d.ts +5 -0
  5. package/dist/columns/forms/builders/section-builder.d.ts +16 -0
  6. package/dist/columns/forms/builders/tab-builder.d.ts +16 -0
  7. package/dist/columns/forms/builders/wizard-builder.d.ts +17 -0
  8. package/dist/columns/forms/components/field-renderer.d.ts +12 -0
  9. package/dist/columns/forms/components/form-actions.d.ts +9 -0
  10. package/dist/columns/forms/components/form-renderer.d.ts +14 -0
  11. package/dist/columns/forms/components/grid-layout.d.ts +7 -0
  12. package/dist/columns/forms/components/index.d.ts +9 -0
  13. package/dist/columns/forms/components/section-renderer.d.ts +14 -0
  14. package/dist/columns/forms/components/tab-renderer.d.ts +15 -0
  15. package/dist/columns/forms/components/wizard-renderer.d.ts +17 -0
  16. package/dist/columns/forms/fields/base-field.d.ts +24 -0
  17. package/dist/columns/forms/fields/checkbox-group.d.ts +12 -0
  18. package/dist/columns/forms/fields/checkbox.d.ts +9 -0
  19. package/dist/columns/forms/fields/date-picker.d.ts +15 -0
  20. package/dist/columns/forms/fields/file-upload.d.ts +17 -0
  21. package/dist/columns/forms/fields/hidden.d.ts +9 -0
  22. package/dist/columns/forms/fields/index.d.ts +12 -0
  23. package/dist/columns/forms/fields/radio-group.d.ts +14 -0
  24. package/dist/columns/forms/fields/repeater.d.ts +21 -0
  25. package/dist/columns/forms/fields/select.d.ts +16 -0
  26. package/dist/columns/forms/fields/text-input.d.ts +20 -0
  27. package/dist/columns/forms/fields/textarea.d.ts +14 -0
  28. package/dist/columns/forms/fields/toggle.d.ts +11 -0
  29. package/dist/columns/forms/index.d.ts +26 -0
  30. package/dist/columns/forms/types/actions.d.ts +11 -0
  31. package/dist/columns/forms/types/field.d.ts +98 -0
  32. package/dist/columns/forms/types/form.d.ts +37 -0
  33. package/dist/columns/forms/types/index.d.ts +4 -0
  34. package/dist/columns/forms/types/layout.d.ts +31 -0
  35. package/dist/columns/index.d.ts +2 -0
  36. package/dist/columns/inertia/index.d.ts +4 -0
  37. package/dist/columns/inertia/precognition.d.ts +6 -0
  38. package/dist/columns/inertia/types.d.ts +63 -0
  39. package/dist/columns/inertia/use-inertia-form.d.ts +2 -0
  40. package/dist/columns/inertia/use-server-table.d.ts +2 -0
  41. package/dist/forms/builders/actions-builder.d.ts +14 -0
  42. package/dist/forms/builders/empty-state.d.ts +46 -0
  43. package/dist/forms/builders/form-schema.d.ts +35 -0
  44. package/dist/forms/builders/index.d.ts +2 -0
  45. package/dist/forms/builders/section-builder.d.ts +16 -0
  46. package/dist/forms/builders/tab-builder.d.ts +16 -0
  47. package/dist/forms/builders/table-schema.d.ts +45 -0
  48. package/dist/forms/builders/wizard-builder.d.ts +17 -0
  49. package/dist/forms/columns/actions-column.d.ts +26 -0
  50. package/dist/forms/columns/avatar-group-column.d.ts +38 -0
  51. package/dist/forms/columns/badge-column.d.ts +29 -0
  52. package/dist/forms/columns/base-column.d.ts +21 -0
  53. package/dist/forms/columns/button-column.d.ts +14 -0
  54. package/dist/forms/columns/checkbox-column.d.ts +5 -0
  55. package/dist/forms/columns/date-column.d.ts +24 -0
  56. package/dist/forms/columns/dropdown-column.d.ts +17 -0
  57. package/dist/forms/columns/enum-column.d.ts +52 -0
  58. package/dist/forms/columns/icon-column.d.ts +58 -0
  59. package/dist/forms/columns/image-column.d.ts +21 -0
  60. package/dist/forms/columns/index.d.ts +18 -0
  61. package/dist/forms/columns/input-column.d.ts +27 -0
  62. package/dist/forms/columns/link-column.d.ts +27 -0
  63. package/dist/forms/columns/number-column.d.ts +23 -0
  64. package/dist/forms/columns/progress-column.d.ts +30 -0
  65. package/dist/forms/columns/select-column.d.ts +24 -0
  66. package/dist/forms/columns/text-column.d.ts +14 -0
  67. package/dist/forms/columns/types.d.ts +46 -0
  68. package/dist/forms/components/field-renderer.d.ts +12 -0
  69. package/dist/forms/components/form-actions.d.ts +9 -0
  70. package/dist/forms/components/form-renderer.d.ts +14 -0
  71. package/dist/forms/components/grid-layout.d.ts +7 -0
  72. package/dist/forms/components/index.d.ts +9 -0
  73. package/dist/forms/components/section-renderer.d.ts +14 -0
  74. package/dist/forms/components/tab-renderer.d.ts +15 -0
  75. package/dist/forms/components/wizard-renderer.d.ts +17 -0
  76. package/dist/forms/confirm/ConfirmProvider.d.ts +6 -0
  77. package/dist/forms/confirm/confirm.d.ts +3 -0
  78. package/dist/forms/confirm/index.d.ts +3 -0
  79. package/dist/forms/confirm/types.d.ts +10 -0
  80. package/dist/forms/fields/base-field.d.ts +24 -0
  81. package/dist/forms/fields/checkbox-group.d.ts +12 -0
  82. package/dist/forms/fields/checkbox.d.ts +9 -0
  83. package/dist/forms/fields/date-picker.d.ts +15 -0
  84. package/dist/forms/fields/file-upload.d.ts +17 -0
  85. package/dist/forms/fields/hidden.d.ts +9 -0
  86. package/dist/forms/fields/index.d.ts +12 -0
  87. package/dist/forms/fields/radio-group.d.ts +14 -0
  88. package/dist/forms/fields/repeater.d.ts +21 -0
  89. package/dist/forms/fields/select.d.ts +16 -0
  90. package/dist/forms/fields/text-input.d.ts +20 -0
  91. package/dist/forms/fields/textarea.d.ts +14 -0
  92. package/dist/forms/fields/toggle.d.ts +11 -0
  93. package/dist/forms/forms/builders/actions-builder.d.ts +14 -0
  94. package/dist/forms/forms/builders/form-schema.d.ts +35 -0
  95. package/dist/forms/forms/builders/index.d.ts +5 -0
  96. package/dist/forms/forms/builders/section-builder.d.ts +16 -0
  97. package/dist/forms/forms/builders/tab-builder.d.ts +16 -0
  98. package/dist/forms/forms/builders/wizard-builder.d.ts +17 -0
  99. package/dist/forms/forms/components/field-renderer.d.ts +12 -0
  100. package/dist/forms/forms/components/form-actions.d.ts +9 -0
  101. package/dist/forms/forms/components/form-renderer.d.ts +14 -0
  102. package/dist/forms/forms/components/grid-layout.d.ts +7 -0
  103. package/dist/forms/forms/components/index.d.ts +9 -0
  104. package/dist/forms/forms/components/section-renderer.d.ts +14 -0
  105. package/dist/forms/forms/components/tab-renderer.d.ts +15 -0
  106. package/dist/forms/forms/components/wizard-renderer.d.ts +17 -0
  107. package/dist/forms/forms/fields/base-field.d.ts +24 -0
  108. package/dist/forms/forms/fields/checkbox-group.d.ts +12 -0
  109. package/dist/forms/forms/fields/checkbox.d.ts +9 -0
  110. package/dist/forms/forms/fields/date-picker.d.ts +15 -0
  111. package/dist/forms/forms/fields/file-upload.d.ts +17 -0
  112. package/dist/forms/forms/fields/hidden.d.ts +9 -0
  113. package/dist/forms/forms/fields/index.d.ts +12 -0
  114. package/dist/forms/forms/fields/radio-group.d.ts +14 -0
  115. package/dist/forms/forms/fields/repeater.d.ts +21 -0
  116. package/dist/forms/forms/fields/select.d.ts +16 -0
  117. package/dist/forms/forms/fields/text-input.d.ts +20 -0
  118. package/dist/forms/forms/fields/textarea.d.ts +14 -0
  119. package/dist/forms/forms/fields/toggle.d.ts +11 -0
  120. package/dist/forms/forms/index.d.ts +26 -0
  121. package/dist/forms/forms/types/actions.d.ts +11 -0
  122. package/dist/forms/forms/types/field.d.ts +98 -0
  123. package/dist/forms/forms/types/form.d.ts +37 -0
  124. package/dist/forms/forms/types/index.d.ts +4 -0
  125. package/dist/forms/forms/types/layout.d.ts +31 -0
  126. package/dist/forms/index.d.ts +25 -0
  127. package/dist/forms/index.esm.js +1052 -0
  128. package/dist/forms/index.esm.js.map +1 -0
  129. package/dist/forms/index.js +1077 -0
  130. package/dist/forms/index.js.map +1 -0
  131. package/dist/forms/inertia/index.d.ts +4 -0
  132. package/dist/forms/inertia/precognition.d.ts +6 -0
  133. package/dist/forms/inertia/types.d.ts +63 -0
  134. package/dist/forms/inertia/use-inertia-form.d.ts +2 -0
  135. package/dist/forms/inertia/use-server-table.d.ts +2 -0
  136. package/dist/forms/tablefy/avatar-list.d.ts +15 -0
  137. package/dist/forms/tablefy/data-table-empty.d.ts +8 -0
  138. package/dist/forms/tablefy/data-table-header.d.ts +17 -0
  139. package/dist/forms/tablefy/data-table-pagination.d.ts +9 -0
  140. package/dist/forms/tablefy/data-table-schema.d.ts +1 -0
  141. package/dist/forms/tablefy/data-table.d.ts +13 -0
  142. package/dist/forms/tablefy/index.d.ts +6 -0
  143. package/dist/forms/types/actions.d.ts +21 -0
  144. package/dist/forms/types/empty-state.d.ts +18 -0
  145. package/dist/forms/types/field.d.ts +98 -0
  146. package/dist/forms/types/filters.d.ts +25 -0
  147. package/dist/forms/types/form.d.ts +37 -0
  148. package/dist/forms/types/index.d.ts +4 -0
  149. package/dist/forms/types/layout.d.ts +31 -0
  150. package/dist/forms/types/table.d.ts +42 -0
  151. package/dist/forms/utils.d.ts +1 -0
  152. package/dist/index.d.ts +2 -0
  153. package/dist/index.esm.js +1050 -9
  154. package/dist/index.esm.js.map +1 -1
  155. package/dist/index.js +1058 -0
  156. package/dist/index.js.map +1 -1
  157. package/dist/inertia/builders/empty-state.d.ts +46 -0
  158. package/dist/inertia/builders/index.d.ts +2 -0
  159. package/dist/inertia/builders/table-schema.d.ts +45 -0
  160. package/dist/inertia/columns/actions-column.d.ts +26 -0
  161. package/dist/inertia/columns/avatar-group-column.d.ts +38 -0
  162. package/dist/inertia/columns/badge-column.d.ts +29 -0
  163. package/dist/inertia/columns/base-column.d.ts +21 -0
  164. package/dist/inertia/columns/button-column.d.ts +14 -0
  165. package/dist/inertia/columns/checkbox-column.d.ts +5 -0
  166. package/dist/inertia/columns/date-column.d.ts +24 -0
  167. package/dist/inertia/columns/dropdown-column.d.ts +17 -0
  168. package/dist/inertia/columns/enum-column.d.ts +52 -0
  169. package/dist/inertia/columns/icon-column.d.ts +58 -0
  170. package/dist/inertia/columns/image-column.d.ts +21 -0
  171. package/dist/inertia/columns/index.d.ts +18 -0
  172. package/dist/inertia/columns/input-column.d.ts +27 -0
  173. package/dist/inertia/columns/link-column.d.ts +27 -0
  174. package/dist/inertia/columns/number-column.d.ts +23 -0
  175. package/dist/inertia/columns/progress-column.d.ts +30 -0
  176. package/dist/inertia/columns/select-column.d.ts +24 -0
  177. package/dist/inertia/columns/text-column.d.ts +14 -0
  178. package/dist/inertia/columns/types.d.ts +46 -0
  179. package/dist/inertia/confirm/ConfirmProvider.d.ts +6 -0
  180. package/dist/inertia/confirm/confirm.d.ts +3 -0
  181. package/dist/inertia/confirm/index.d.ts +3 -0
  182. package/dist/inertia/confirm/types.d.ts +10 -0
  183. package/dist/inertia/forms/builders/actions-builder.d.ts +14 -0
  184. package/dist/inertia/forms/builders/form-schema.d.ts +35 -0
  185. package/dist/inertia/forms/builders/index.d.ts +5 -0
  186. package/dist/inertia/forms/builders/section-builder.d.ts +16 -0
  187. package/dist/inertia/forms/builders/tab-builder.d.ts +16 -0
  188. package/dist/inertia/forms/builders/wizard-builder.d.ts +17 -0
  189. package/dist/inertia/forms/components/field-renderer.d.ts +12 -0
  190. package/dist/inertia/forms/components/form-actions.d.ts +9 -0
  191. package/dist/inertia/forms/components/form-renderer.d.ts +14 -0
  192. package/dist/inertia/forms/components/grid-layout.d.ts +7 -0
  193. package/dist/inertia/forms/components/index.d.ts +9 -0
  194. package/dist/inertia/forms/components/section-renderer.d.ts +14 -0
  195. package/dist/inertia/forms/components/tab-renderer.d.ts +15 -0
  196. package/dist/inertia/forms/components/wizard-renderer.d.ts +17 -0
  197. package/dist/inertia/forms/fields/base-field.d.ts +24 -0
  198. package/dist/inertia/forms/fields/checkbox-group.d.ts +12 -0
  199. package/dist/inertia/forms/fields/checkbox.d.ts +9 -0
  200. package/dist/inertia/forms/fields/date-picker.d.ts +15 -0
  201. package/dist/inertia/forms/fields/file-upload.d.ts +17 -0
  202. package/dist/inertia/forms/fields/hidden.d.ts +9 -0
  203. package/dist/inertia/forms/fields/index.d.ts +12 -0
  204. package/dist/inertia/forms/fields/radio-group.d.ts +14 -0
  205. package/dist/inertia/forms/fields/repeater.d.ts +21 -0
  206. package/dist/inertia/forms/fields/select.d.ts +16 -0
  207. package/dist/inertia/forms/fields/text-input.d.ts +20 -0
  208. package/dist/inertia/forms/fields/textarea.d.ts +14 -0
  209. package/dist/inertia/forms/fields/toggle.d.ts +11 -0
  210. package/dist/inertia/forms/index.d.ts +26 -0
  211. package/dist/inertia/forms/types/actions.d.ts +11 -0
  212. package/dist/inertia/forms/types/field.d.ts +98 -0
  213. package/dist/inertia/forms/types/form.d.ts +37 -0
  214. package/dist/inertia/forms/types/index.d.ts +4 -0
  215. package/dist/inertia/forms/types/layout.d.ts +31 -0
  216. package/dist/inertia/index.d.ts +25 -0
  217. package/dist/inertia/index.esm.js +149 -0
  218. package/dist/inertia/index.esm.js.map +1 -0
  219. package/dist/inertia/index.js +153 -0
  220. package/dist/inertia/index.js.map +1 -0
  221. package/dist/inertia/inertia/index.d.ts +4 -0
  222. package/dist/inertia/inertia/precognition.d.ts +6 -0
  223. package/dist/inertia/inertia/types.d.ts +63 -0
  224. package/dist/inertia/inertia/use-inertia-form.d.ts +2 -0
  225. package/dist/inertia/inertia/use-server-table.d.ts +2 -0
  226. package/dist/inertia/precognition.d.ts +6 -0
  227. package/dist/inertia/tablefy/avatar-list.d.ts +15 -0
  228. package/dist/inertia/tablefy/data-table-empty.d.ts +8 -0
  229. package/dist/inertia/tablefy/data-table-header.d.ts +17 -0
  230. package/dist/inertia/tablefy/data-table-pagination.d.ts +9 -0
  231. package/dist/inertia/tablefy/data-table-schema.d.ts +1 -0
  232. package/dist/inertia/tablefy/data-table.d.ts +13 -0
  233. package/dist/inertia/tablefy/index.d.ts +6 -0
  234. package/dist/inertia/types/actions.d.ts +21 -0
  235. package/dist/inertia/types/empty-state.d.ts +18 -0
  236. package/dist/inertia/types/filters.d.ts +25 -0
  237. package/dist/inertia/types/index.d.ts +4 -0
  238. package/dist/inertia/types/table.d.ts +42 -0
  239. package/dist/inertia/types.d.ts +63 -0
  240. package/dist/inertia/use-inertia-form.d.ts +2 -0
  241. package/dist/inertia/use-server-table.d.ts +2 -0
  242. package/dist/inertia/utils.d.ts +1 -0
  243. package/package.json +39 -13
package/README.md CHANGED
@@ -1,20 +1,34 @@
1
1
  # Tablefy
2
2
 
3
- A powerful, type-safe React table package built with TanStack Table and shadcn/ui components. Create beautiful, feature-rich data tables with a fluent, chainable API.
3
+ A powerful, type-safe React toolkit for building schema-driven **Data Tables** and **Forms**. Built on [shadcn/ui](https://ui.shadcn.com/) and designed for [Laravel](https://laravel.com/) + [Inertia.js v2](https://inertiajs.com/) + [Wayfinder](https://github.com/laravel/wayfinder).
4
4
 
5
5
  ## Features
6
6
 
7
+ ### Data Tables
7
8
  - **Beautiful UI** - Built on shadcn/ui components with Tailwind CSS
8
9
  - **Search & Filter** - Built-in search and advanced filtering
9
- - **Sorting & Pagination** - Full sorting and pagination support
10
- - **Type-Safe** - Complete TypeScript support with type inference
11
- - **Fluent API** - Chainable builder pattern for easy configuration
12
- - **Responsive** - Mobile-friendly responsive design
13
- - **Rich Columns** - 12+ specialized column types with custom builders
14
- - **Custom Actions** - Render complex UI in actions with custom render functions
10
+ - **Sorting & Pagination** - Full sorting and pagination support (client & server-side)
11
+ - **14+ Column Types** - Text, Badge, Date, Link, Progress, Avatar, Icon, Image, Actions, and more
15
12
  - **Confirm Dialogs** - Built-in confirmation system for destructive actions
16
- - **Performance** - Optimized for large datasets
17
- - **Customizable** - Extensive theming and styling options
13
+
14
+ ### Forms
15
+ - **Schema-Driven** - Define forms with a fluent builder API
16
+ - **11 Field Types** - TextInput, Textarea, Select, Checkbox, CheckboxGroup, Toggle, RadioGroup, DatePicker, FileUpload, Repeater, Hidden
17
+ - **Layout Builders** - Sections (collapsible cards), Tabs, Wizard (multi-step)
18
+ - **Field Dependencies** - Show/hide/enable/disable fields based on other field values
19
+ - **Grid Layout** - Responsive multi-column grids with columnSpan support
20
+
21
+ ### Inertia.js Integration
22
+ - **useInertiaForm** - Bridge FormSchema with Inertia's `useForm` for seamless state management
23
+ - **useServerTable** - Server-side pagination, sorting, and filtering with `router.visit()`
24
+ - **Precognition** - Live server-side validation on field blur
25
+ - **Wayfinder** - Type-safe route helpers as form action URLs
26
+
27
+ ### Core
28
+ - **Type-Safe** - Complete TypeScript support with generics and type inference
29
+ - **Fluent API** - Chainable builder pattern for easy, readable configuration
30
+ - **Tree-Shakeable** - Sub-path exports (`/forms`, `/inertia`, `/columns`) for optimal bundle size
31
+ - **Zero Breaking Changes** - Forms and Inertia are purely additive to the existing table API
18
32
 
19
33
  ## Installation
20
34
 
@@ -22,79 +36,54 @@ A powerful, type-safe React table package built with TanStack Table and shadcn/u
22
36
  npm install @nccirtu/tablefy
23
37
  ```
24
38
 
25
- **⚠️ Important:** Tablefy requires additional setup steps to work correctly.
26
-
27
- ### Two Ways to Use Tablefy
28
-
29
- Tablefy offers **two approaches** to fit your workflow:
30
-
31
- #### 🚀 **Quick Start (Direct Import)**
32
-
33
- Import components directly from the package - perfect for getting started quickly:
34
-
35
- ```tsx
36
- import { DataTable, TableSchema, TextColumn } from "@nccirtu/tablefy";
37
- ```
38
-
39
- ✅ **Pros:** Zero setup, works immediately after installation
40
- ❌ **Cons:** Limited customization of internal components
41
-
42
- #### 🛠️ **Full Control (CLI Installation)**
43
-
44
- Copy components to your project for complete customization:
39
+ **Quick setup with CLI:**
45
40
 
46
41
  ```bash
47
42
  npx tablefy init
48
43
  ```
49
44
 
50
- This copies all components to your `components/tablefy/` directory, allowing you to:
51
-
52
- - Customize styles and behavior
53
- - Modify internal components
54
- - Full control over the code
55
-
56
- ✅ **Pros:** Complete customization freedom
57
- ❌ **Cons:** Requires CLI setup step
45
+ ### Peer Dependencies
58
46
 
59
- **Choose the approach that fits your needs!** Most users start with direct imports and switch to CLI installation when they need customization.
60
-
61
- ### What you need to install
47
+ ```bash
48
+ # Core (required)
49
+ npm install @tanstack/react-table lucide-react class-variance-authority clsx tailwind-merge
62
50
 
63
- 1. **Peer dependencies** (required libraries)
64
- 2. **shadcn/ui components** (UI building blocks)
65
- 3. **Tailwind configuration** (for styling)
51
+ # shadcn/ui components (install what you need)
52
+ npx shadcn@latest add button table checkbox dropdown-menu input select badge progress tooltip label card tabs textarea switch radio-group calendar popover separator
66
53
 
67
- 👉 **[Follow the complete installation guide →](./INSTALLATION.md)**
54
+ # Optional: Inertia.js integration
55
+ npm install @inertiajs/react
68
56
 
69
- ### Quick Overview
57
+ # Optional: Zod validation
58
+ npm install zod
59
+ ```
70
60
 
71
- ```bash
72
- # 1. Install dependencies
73
- npm install @tanstack/react-table lucide-react class-variance-authority clsx tailwind-merge
61
+ ### Configure Tailwind
74
62
 
75
- # 2. Install shadcn components
76
- npx shadcn@latest add button table checkbox dropdown-menu input select badge progress tooltip
63
+ **Tailwind v4 (Laravel 12):**
77
64
 
78
- # 3. Configure Tailwind (see INSTALLATION.md for framework-specific instructions)
65
+ ```css
66
+ @import "tailwindcss";
67
+ @source '../../node_modules/@nccirtu/tablefy/dist';
68
+ ```
79
69
 
80
- # 4. For Laravel/Vite: Add alias configuration to vite.config.js
81
- # See INSTALLATION.md Step 6 for details
70
+ **Tailwind v3:**
82
71
 
83
- # 5. Restart dev server
72
+ ```js
73
+ module.exports = {
74
+ content: [
75
+ "./src/**/*.{js,ts,jsx,tsx}",
76
+ "./node_modules/@nccirtu/tablefy/dist/**/*.{js,mjs}",
77
+ ],
78
+ };
84
79
  ```
85
80
 
86
- **Laravel/Vite Users:** You must configure the `@` alias in your `vite.config.js` to resolve imports correctly. See [INSTALLATION.md](./INSTALLATION.md#step-6-configure-vite-laravelvite-projects) for details.
81
+ See the [full installation guide](./docs/INSTALLATION.md) for framework-specific instructions.
87
82
 
88
- ## Quick Start
83
+ ## Quick Start: Data Table
89
84
 
90
85
  ```tsx
91
- import {
92
- DataTable,
93
- TableSchema,
94
- TextColumn,
95
- BadgeColumn,
96
- DateColumn,
97
- } from "tablefy";
86
+ import { DataTable, TableSchema, TextColumn, BadgeColumn, DateColumn } from "@nccirtu/tablefy";
98
87
 
99
88
  type User = {
100
89
  id: string;
@@ -107,14 +96,11 @@ type User = {
107
96
  const columns = TableSchema.make<User>()
108
97
  .columns(
109
98
  TextColumn.make("name").label("Name").sortable(),
110
-
111
99
  TextColumn.make("email").label("Email").limit(30),
112
-
113
100
  BadgeColumn.make("status").label("Status").variants({
114
101
  active: "success",
115
102
  inactive: "secondary",
116
103
  }),
117
-
118
104
  DateColumn.make("createdAt").label("Created").relative(),
119
105
  )
120
106
  .build();
@@ -133,162 +119,198 @@ function UsersTable({ users }: { users: User[] }) {
133
119
  }
134
120
  ```
135
121
 
136
- ## Column Types
137
-
138
- Tablefy provides 12+ specialized column types, each with their own builder methods:
139
-
140
- | Column Type | Description | Key Methods |
141
- | ------------------- | -------------------- | ------------------------------------------------------------------------- |
142
- | `TextColumn` | Simple text display | `sortable()`, `prefix()`, `suffix()`, `limit()`, `uppercase()` |
143
- | `NumberColumn` | Numbers & currency | `money()`, `percent()`, `decimals()`, `locale()` |
144
- | `DateColumn` | Dates & times | `short()`, `long()`, `relative()`, `datetime()`, `withIcon()` |
145
- | `BadgeColumn` | Status badges | `variants()`, `boolean()`, `status()` |
146
- | `LinkColumn` | Clickable links | `href()`, `external()`, `underline()`, `openInNewTab()` |
147
- | `ProgressColumn` | Progress bars | `max()`, `colorByThreshold()`, `showPercentage()`, `format()` |
148
- | `AvatarGroupColumn` | Avatar groups | `maxVisible()`, `size()`, `overlap()`, `fields()`, `showNames()` |
149
- | `IconColumn` | Status icons | `boolean()`, `priority()`, `onlineStatus()`, `verification()`, `states()` |
150
- | `ImageColumn` | Single images | `size()`, `rounded()`, `circular()`, `fallback()` |
151
- | `CheckboxColumn` | Selection checkboxes | — |
152
- | `ActionsColumn` | Dropdown menus | `view()`, `edit()`, `delete()`, `action()`, `link()` |
153
-
154
- ## Example: Project Management Table
122
+ ## Quick Start: Form
155
123
 
156
124
  ```tsx
157
- import {
158
- TableSchema,
159
- CheckboxColumn,
160
- TextColumn,
161
- LinkColumn,
162
- ProgressColumn,
163
- AvatarGroupColumn,
164
- IconColumn,
165
- DateColumn,
166
- ActionsColumn,
167
- } from "tablefy";
168
-
169
- type Project = {
170
- id: string;
125
+ import { FormSchema, TextInput, Select, Textarea, FormRenderer } from "@nccirtu/tablefy/forms";
126
+ import { useState } from "react";
127
+
128
+ type CreateUser = {
171
129
  name: string;
172
- url: string;
173
- progress: number;
174
- priority: "low" | "medium" | "high" | "critical";
175
- status: "active" | "inactive";
176
- isPublic: boolean;
177
- team: Array<{ name: string; avatar?: string }>;
178
- deadline: Date;
130
+ email: string;
131
+ role: string;
132
+ bio: string;
179
133
  };
180
134
 
181
- export const projectColumns = TableSchema.make<Project>()
182
- .columns(
183
- CheckboxColumn.make(),
184
-
185
- LinkColumn.make("name")
186
- .label("Project")
187
- .sortable()
188
- .href((row) => `/projects/${row.id}`)
189
- .underline("hover"),
190
-
191
- LinkColumn.make("url").label("Website").external().limit(30),
192
-
193
- ProgressColumn.make("progress")
194
- .label("Progress")
195
- .sortable()
196
- .colorByThreshold(30, 15)
197
- .showPercentage(),
198
-
199
- IconColumn.make("priority")
200
- .label("Priority")
201
- .sortable()
202
- .priority()
203
- .withBackground(),
204
-
205
- IconColumn.make("status").label("Status").activeInactive(),
206
-
207
- IconColumn.make("isPublic")
208
- .label("Visibility")
209
- .boolean({
210
- trueLabel: "Public",
211
- falseLabel: "Private",
212
- })
213
- .showLabel(),
214
-
215
- AvatarGroupColumn.make("team")
216
- .label("Team")
217
- .maxVisible(3)
218
- .size("sm")
219
- .fields({ name: "name", src: "avatar" }),
220
-
221
- DateColumn.make("deadline").label("Deadline").sortable().relative(),
222
-
223
- ActionsColumn.make<Project>()
224
- .view((row) => (window.location.href = `/projects/${row.id}`))
225
- .edit((row) => console.log("Edit", row.id))
226
- .action({
227
- label: "Delete",
228
- variant: "destructive",
229
- onClick: async (row) => {
230
- const ok = await confirm({
231
- title: "Delete Project?",
232
- description: `Delete "${row.name}"?`,
233
- variant: "destructive",
234
- });
235
- if (ok) console.log("Delete", row.id);
236
- },
237
- }),
135
+ const schema = FormSchema.make<CreateUser>()
136
+ .title("Create User")
137
+ .description("Add a new team member")
138
+ .columns(2)
139
+ .bordered()
140
+ .fields(
141
+ TextInput.make<CreateUser>("name").label("Name").required(),
142
+ TextInput.make<CreateUser>("email").label("Email").email().required(),
143
+ Select.make<CreateUser>("role")
144
+ .label("Role")
145
+ .options([
146
+ { value: "admin", label: "Admin" },
147
+ { value: "editor", label: "Editor" },
148
+ { value: "viewer", label: "Viewer" },
149
+ ])
150
+ .required(),
151
+ Textarea.make<CreateUser>("bio").label("Biography").rows(4).columnSpan(2),
238
152
  )
153
+ .actions((a) => a.submit({ label: "Create User" }).cancel({ label: "Cancel" }))
239
154
  .build();
155
+
156
+ function CreateUserPage() {
157
+ const [data, setData] = useState<CreateUser>({ name: "", email: "", role: "", bio: "" });
158
+ const [errors, setErrors] = useState({});
159
+
160
+ return (
161
+ <FormRenderer
162
+ schema={schema}
163
+ data={data}
164
+ errors={errors}
165
+ onChange={(field, value) => setData((prev) => ({ ...prev, [field]: value }))}
166
+ onSubmit={() => console.log("Submit:", data)}
167
+ />
168
+ );
169
+ }
240
170
  ```
241
171
 
242
- ## Documentation
172
+ ## Quick Start: Inertia.js + Laravel
243
173
 
244
- - [Installation Guide](./INSTALLATION.md) - Detailed installation instructions
245
- - [Usage Guide](./docs/USAGE.md) - Complete API reference and examples
246
- - [Column Types](./docs/USAGE.md#column-types) - All column types and their methods
247
- - [Actions Column](./docs/ACTIONS_COLUMN.md) - Custom render functions and confirm dialogs
248
- - [Editable Columns](./docs/EDITABLE_COLUMNS.md) - InputColumn and SelectColumn guide
174
+ ```tsx
175
+ import { FormSchema, TextInput, Select, FormRenderer } from "@nccirtu/tablefy/forms";
176
+ import { useInertiaForm } from "@nccirtu/tablefy/inertia";
177
+
178
+ type CreateUser = { name: string; email: string; role: string };
179
+
180
+ const schema = FormSchema.make<CreateUser>()
181
+ .title("Create User")
182
+ .columns(2)
183
+ .fields(
184
+ TextInput.make<CreateUser>("name").label("Name").required(),
185
+ TextInput.make<CreateUser>("email").label("Email").email().required(),
186
+ Select.make<CreateUser>("role")
187
+ .label("Role")
188
+ .options([
189
+ { value: "admin", label: "Admin" },
190
+ { value: "editor", label: "Editor" },
191
+ ])
192
+ .columnSpan(2),
193
+ )
194
+ .actions((a) => a.submit({ label: "Create" }).cancel({ label: "Cancel", href: "/users" }))
195
+ .build();
196
+
197
+ export default function CreateUserPage() {
198
+ const { data, errors, onChange, onSubmit, processing } = useInertiaForm<CreateUser>({
199
+ schema,
200
+ url: "/users",
201
+ method: "post",
202
+ });
203
+
204
+ return (
205
+ <FormRenderer
206
+ schema={schema}
207
+ data={data}
208
+ errors={errors}
209
+ onChange={onChange}
210
+ onSubmit={onSubmit}
211
+ processing={processing}
212
+ />
213
+ );
214
+ }
215
+ ```
216
+
217
+ ## Column Types
218
+
219
+ | Column Type | Description | Key Methods |
220
+ |---|---|---|
221
+ | `TextColumn` | Simple text display | `sortable()`, `prefix()`, `suffix()`, `limit()`, `uppercase()` |
222
+ | `NumberColumn` | Numbers & currency | `money()`, `percent()`, `decimals()`, `locale()` |
223
+ | `DateColumn` | Dates & times | `short()`, `long()`, `relative()`, `datetime()`, `withIcon()` |
224
+ | `BadgeColumn` | Status badges | `variants()`, `boolean()`, `status()` |
225
+ | `LinkColumn` | Clickable links | `href()`, `external()`, `underline()`, `openInNewTab()` |
226
+ | `ProgressColumn` | Progress bars | `max()`, `colorByThreshold()`, `showPercentage()`, `format()` |
227
+ | `AvatarGroupColumn` | Avatar groups | `maxVisible()`, `size()`, `overlap()`, `fields()`, `showNames()` |
228
+ | `IconColumn` | Status icons | `boolean()`, `priority()`, `onlineStatus()`, `verification()`, `states()` |
229
+ | `ImageColumn` | Single images | `size()`, `rounded()`, `circular()`, `fallback()` |
230
+ | `CheckboxColumn` | Selection checkboxes | -- |
231
+ | `ActionsColumn` | Dropdown menus | `view()`, `edit()`, `delete()`, `action()`, `link()` |
232
+ | `EnumColumn` | Enum display | `options()` |
233
+
234
+ ## Form Field Types
235
+
236
+ | Field Type | Description | Key Methods |
237
+ |---|---|---|
238
+ | `TextInput` | Single-line text | `email()`, `password()`, `number()`, `url()`, `tel()`, `prefix()`, `suffix()`, `minLength()`, `maxLength()` |
239
+ | `Textarea` | Multi-line text | `rows()`, `minLength()`, `maxLength()`, `autoResize()` |
240
+ | `Select` | Dropdown select | `options()`, `multiple()`, `searchable()`, `clearable()`, `loadOptions()` |
241
+ | `Checkbox` | Boolean checkbox | (inherits base methods) |
242
+ | `CheckboxGroup` | Multiple checkboxes | `options()`, `columns()` |
243
+ | `Toggle` | On/off switch | `onLabel()`, `offLabel()` |
244
+ | `RadioGroup` | Radio buttons | `options()`, `horizontal()`, `vertical()` |
245
+ | `DatePicker` | Date calendar | `minDate()`, `maxDate()`, `format()`, `includeTime()`, `locale()` |
246
+ | `FileUpload` | File drag & drop | `accept()`, `maxSize()`, `multiple()`, `maxFiles()`, `image()`, `pdf()` |
247
+ | `Repeater` | Dynamic list | `fields()`, `minItems()`, `maxItems()`, `addLabel()`, `orderable()` |
248
+ | `Hidden` | Hidden input | (inherits base methods) |
249
+
250
+ ## Layout Options
251
+
252
+ ### Sections (Collapsible Cards)
249
253
 
250
- ## Advanced Features
254
+ ```tsx
255
+ FormSchema.make<T>()
256
+ .fields(/* ... */)
257
+ .sections(
258
+ SectionBuilder.make("Personal").fields(["name", "email"]).columns(2),
259
+ SectionBuilder.make("Address").fields(["street", "city"]).collapsible(),
260
+ )
261
+ .build();
262
+ ```
251
263
 
252
- ### Empty States
264
+ ### Tabs
253
265
 
254
266
  ```tsx
255
- import { EmptyStateBuilder } from "tablefy";
267
+ FormSchema.make<T>()
268
+ .fields(/* ... */)
269
+ .tabs(
270
+ TabBuilder.make("Profile").fields(["name", "email"]).icon(<User />),
271
+ TabBuilder.make("Settings").fields(["language", "timezone"]),
272
+ )
273
+ .build();
274
+ ```
256
275
 
257
- const emptyState = EmptyStateBuilder.make()
258
- .title("No projects found")
259
- .description("Get started by creating your first project")
260
- .action("Create Project", () => createProject())
276
+ ### Wizard (Multi-Step)
277
+
278
+ ```tsx
279
+ FormSchema.make<T>()
280
+ .fields(/* ... */)
281
+ .wizard(
282
+ WizardStep.make("Account").fields(["email", "password"])
283
+ .canProceed((d) => !!d.email && !!d.password),
284
+ WizardStep.make("Profile").fields(["name", "bio"]),
285
+ )
261
286
  .build();
262
287
  ```
263
288
 
264
- ### Search & Filters
289
+ ## Import Paths
265
290
 
266
291
  ```tsx
267
- <DataTable
268
- columns={columns}
269
- data={data}
270
- config={{
271
- search: {
272
- enabled: true,
273
- placeholder: "Search projects...",
274
- columns: ["name", "url"],
275
- },
276
- filters: [
277
- {
278
- id: "status",
279
- label: "Status",
280
- type: "select",
281
- column: "status",
282
- options: [
283
- { label: "Active", value: "active" },
284
- { label: "Inactive", value: "inactive" },
285
- ],
286
- },
287
- ],
288
- }}
289
- />
292
+ // Everything
293
+ import { DataTable, TableSchema, TextColumn, FormSchema, TextInput } from "@nccirtu/tablefy";
294
+
295
+ // Columns only (tree-shakeable)
296
+ import { TextColumn, BadgeColumn } from "@nccirtu/tablefy/columns";
297
+
298
+ // Forms only (tree-shakeable, no TanStack Table)
299
+ import { FormSchema, TextInput, Select, FormRenderer } from "@nccirtu/tablefy/forms";
300
+
301
+ // Inertia integration (requires @inertiajs/react)
302
+ import { useInertiaForm, useServerTable } from "@nccirtu/tablefy/inertia";
290
303
  ```
291
304
 
305
+ ## Documentation
306
+
307
+ - [Installation Guide](./docs/INSTALLATION.md) - Detailed setup instructions
308
+ - [Data Tables Guide](./docs/USAGE.md) - Complete table API reference and examples
309
+ - [Forms Guide](./docs/FORMS.md) - All form field types, layouts, and examples
310
+ - [Inertia Integration](./docs/INERTIA.md) - Server-side tables, useInertiaForm, Precognition
311
+ - [Actions Column](./docs/ACTIONS_COLUMN.md) - Custom render functions and confirm dialogs
312
+ - [Editable Columns](./docs/EDITABLE_COLUMNS.md) - InputColumn and SelectColumn guide
313
+
292
314
  ## Contributing
293
315
 
294
316
  Contributions are welcome! Please feel free to submit a Pull Request.
@@ -304,3 +326,5 @@ Built with:
304
326
  - [TanStack Table](https://tanstack.com/table) - Headless table library
305
327
  - [shadcn/ui](https://ui.shadcn.com/) - Beautiful UI components
306
328
  - [Tailwind CSS](https://tailwindcss.com/) - Utility-first CSS framework
329
+ - [Inertia.js](https://inertiajs.com/) - The modern monolith
330
+ - [Laravel](https://laravel.com/) - The PHP framework
@@ -0,0 +1,14 @@
1
+ import { FormActionConfig } from "../types/actions";
2
+ export declare class ActionsBuilder<TData extends Record<string, any>> {
3
+ private actionsList;
4
+ submit(opts?: Partial<Omit<FormActionConfig<TData>, "type">> & {
5
+ label?: string;
6
+ }): this;
7
+ cancel(opts?: Partial<Omit<FormActionConfig<TData>, "type">> & {
8
+ label?: string;
9
+ }): this;
10
+ custom(opts: Omit<FormActionConfig<TData>, "type"> & {
11
+ label: string;
12
+ }): this;
13
+ build(): FormActionConfig<TData>[];
14
+ }
@@ -0,0 +1,35 @@
1
+ import { FormBuildResult, BuiltField } from "../types/form";
2
+ import { SectionConfig, TabConfig, WizardStepConfig } from "../types/layout";
3
+ import { ActionsBuilder } from "./actions-builder";
4
+ type FieldBuilder<TData extends Record<string, any>> = {
5
+ build(): BuiltField<TData>;
6
+ };
7
+ /**
8
+ * Form Schema Builder
9
+ * Fluent API for building complete form configurations
10
+ */
11
+ export declare class FormSchema<TData extends Record<string, any>> {
12
+ private fieldBuilders;
13
+ private schemaConfig;
14
+ static make<TData extends Record<string, any>>(): FormSchema<TData>;
15
+ title(title: string | ((data: TData) => string)): this;
16
+ description(description: string | ((data: TData) => string)): this;
17
+ columns(columns: number): this;
18
+ bordered(bordered?: boolean): this;
19
+ spacing(spacing: "compact" | "normal" | "relaxed"): this;
20
+ disabled(disabled: boolean | ((data: TData) => boolean)): this;
21
+ fields(...builders: FieldBuilder<TData>[]): this;
22
+ sections(...sections: {
23
+ build(): SectionConfig<TData>;
24
+ }[]): this;
25
+ tabs(...tabs: {
26
+ build(): TabConfig<TData>;
27
+ }[]): this;
28
+ wizard(...steps: {
29
+ build(): WizardStepConfig<TData>;
30
+ }[]): this;
31
+ actions(fn: (builder: ActionsBuilder<TData>) => ActionsBuilder<TData>): this;
32
+ actionsPosition(position: "start" | "end" | "between" | "center"): this;
33
+ build(): FormBuildResult<TData>;
34
+ }
35
+ export {};
@@ -0,0 +1,5 @@
1
+ export { FormSchema } from "./form-schema";
2
+ export { ActionsBuilder } from "./actions-builder";
3
+ export { SectionBuilder } from "./section-builder";
4
+ export { TabBuilder } from "./tab-builder";
5
+ export { WizardStep } from "./wizard-builder";
@@ -0,0 +1,16 @@
1
+ import { ReactNode } from "react";
2
+ import { SectionConfig } from "../types/layout";
3
+ export declare class SectionBuilder<TData extends Record<string, any>> {
4
+ private sectionConfig;
5
+ constructor(title: string);
6
+ static make<TData extends Record<string, any>>(title: string): SectionBuilder<TData>;
7
+ id(id: string): this;
8
+ description(description: string): this;
9
+ fields(fields: string[]): this;
10
+ columns(columns: number): this;
11
+ collapsible(collapsible?: boolean): this;
12
+ collapsed(collapsed?: boolean): this;
13
+ icon(icon: ReactNode): this;
14
+ hidden(fn: (data: TData) => boolean): this;
15
+ build(): SectionConfig<TData>;
16
+ }
@@ -0,0 +1,16 @@
1
+ import { ReactNode } from "react";
2
+ import { TabConfig, SectionConfig } from "../types/layout";
3
+ export declare class TabBuilder<TData extends Record<string, any>> {
4
+ private tabConfig;
5
+ constructor(label: string);
6
+ static make<TData extends Record<string, any>>(label: string): TabBuilder<TData>;
7
+ id(id: string): this;
8
+ icon(icon: ReactNode): this;
9
+ fields(fields: string[]): this;
10
+ sections(...sections: {
11
+ build(): SectionConfig<TData>;
12
+ }[]): this;
13
+ badge(badge: string | number | ((data: TData) => string | number)): this;
14
+ disabled(fn: (data: TData) => boolean): this;
15
+ build(): TabConfig<TData>;
16
+ }
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from "react";
2
+ import { WizardStepConfig, SectionConfig } from "../types/layout";
3
+ export declare class WizardStep<TData extends Record<string, any>> {
4
+ private stepConfig;
5
+ constructor(label: string);
6
+ static make<TData extends Record<string, any>>(label: string): WizardStep<TData>;
7
+ id(id: string): this;
8
+ description(description: string): this;
9
+ icon(icon: ReactNode): this;
10
+ fields(fields: string[]): this;
11
+ sections(...sections: {
12
+ build(): SectionConfig<TData>;
13
+ }[]): this;
14
+ canProceed(fn: (data: TData) => boolean): this;
15
+ beforeNext(fn: (data: TData) => Promise<boolean> | boolean): this;
16
+ build(): WizardStepConfig<TData>;
17
+ }
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from "react";
2
+ import { BuiltField } from "../types/form";
3
+ export interface FieldRendererProps<TData extends Record<string, any>> {
4
+ field: BuiltField<TData>;
5
+ value: any;
6
+ error?: string;
7
+ disabled?: boolean;
8
+ data: TData;
9
+ onChange: (value: any) => void;
10
+ onBlur?: () => void;
11
+ }
12
+ export declare function FieldRenderer<TData extends Record<string, any>>({ field, value, error, disabled, data, onChange, onBlur, }: FieldRendererProps<TData>): ReactNode;
@@ -0,0 +1,9 @@
1
+ import { ReactNode } from "react";
2
+ import { FormActionConfig } from "../types/actions";
3
+ export interface FormActionsProps<TData extends Record<string, any>> {
4
+ actions: FormActionConfig<TData>[];
5
+ position?: "start" | "end" | "between" | "center";
6
+ data: TData;
7
+ processing?: boolean;
8
+ }
9
+ export declare function FormActions<TData extends Record<string, any>>({ actions, position, data, processing, }: FormActionsProps<TData>): ReactNode;
@@ -0,0 +1,14 @@
1
+ import { ReactNode } from "react";
2
+ import { FormBuildResult } from "../types/form";
3
+ export interface FormRendererProps<TData extends Record<string, any>> {
4
+ schema: FormBuildResult<TData>;
5
+ data: TData;
6
+ errors: Partial<Record<keyof TData, string>>;
7
+ onChange: (field: keyof TData, value: any) => void;
8
+ onSubmit: () => void;
9
+ processing?: boolean;
10
+ className?: string;
11
+ disabled?: boolean;
12
+ onBlur?: (field: string) => void;
13
+ }
14
+ export declare function FormRenderer<TData extends Record<string, any>>({ schema, data, errors, onChange, onSubmit, processing, className, disabled, onBlur, }: FormRendererProps<TData>): ReactNode;
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from "react";
2
+ export interface GridLayoutProps {
3
+ columns?: number;
4
+ children: ReactNode;
5
+ className?: string;
6
+ }
7
+ export declare function GridLayout({ columns, children, className, }: GridLayoutProps): ReactNode;