@lattice-php/lattice 0.1.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 (277) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +39 -0
  3. package/dist/action/components/action-group.d.ts +10 -0
  4. package/dist/action/components/action-group.js +79 -0
  5. package/dist/action/components/action-group.js.map +1 -0
  6. package/dist/action/components/action.d.ts +26 -0
  7. package/dist/action/components/action.js +87 -0
  8. package/dist/action/components/action.js.map +1 -0
  9. package/dist/action/effects.d.ts +30 -0
  10. package/dist/action/effects.js +44 -0
  11. package/dist/action/effects.js.map +1 -0
  12. package/dist/action/index.d.ts +1 -0
  13. package/dist/action/index.js +15 -0
  14. package/dist/action/index.js.map +1 -0
  15. package/dist/appearance/index.d.ts +9 -0
  16. package/dist/appearance/index.js +66 -0
  17. package/dist/appearance/index.js.map +1 -0
  18. package/dist/clipboard/index.d.ts +5 -0
  19. package/dist/clipboard/index.js +24 -0
  20. package/dist/clipboard/index.js.map +1 -0
  21. package/dist/core/component-ref.d.ts +8 -0
  22. package/dist/core/component-ref.js +15 -0
  23. package/dist/core/component-ref.js.map +1 -0
  24. package/dist/core/components/badge.d.ts +19 -0
  25. package/dist/core/components/badge.js +32 -0
  26. package/dist/core/components/badge.js.map +1 -0
  27. package/dist/core/components/button.d.ts +23 -0
  28. package/dist/core/components/button.js +68 -0
  29. package/dist/core/components/button.js.map +1 -0
  30. package/dist/core/components/card.d.ts +19 -0
  31. package/dist/core/components/card.js +62 -0
  32. package/dist/core/components/card.js.map +1 -0
  33. package/dist/core/components/confirm-dialog.d.ts +13 -0
  34. package/dist/core/components/confirm-dialog.js +47 -0
  35. package/dist/core/components/confirm-dialog.js.map +1 -0
  36. package/dist/core/components/fragment.d.ts +12 -0
  37. package/dist/core/components/fragment.js +62 -0
  38. package/dist/core/components/fragment.js.map +1 -0
  39. package/dist/core/components/grid.d.ts +10 -0
  40. package/dist/core/components/grid.js +16 -0
  41. package/dist/core/components/grid.js.map +1 -0
  42. package/dist/core/components/heading.d.ts +11 -0
  43. package/dist/core/components/heading.js +39 -0
  44. package/dist/core/components/heading.js.map +1 -0
  45. package/dist/core/components/index.d.ts +1 -0
  46. package/dist/core/components/index.js +36 -0
  47. package/dist/core/components/index.js.map +1 -0
  48. package/dist/core/components/link.d.ts +18 -0
  49. package/dist/core/components/link.js +26 -0
  50. package/dist/core/components/link.js.map +1 -0
  51. package/dist/core/components/modal.d.ts +13 -0
  52. package/dist/core/components/modal.js +75 -0
  53. package/dist/core/components/modal.js.map +1 -0
  54. package/dist/core/components/segmented-control.d.ts +16 -0
  55. package/dist/core/components/segmented-control.js +30 -0
  56. package/dist/core/components/segmented-control.js.map +1 -0
  57. package/dist/core/components/segmented-pills.d.ts +13 -0
  58. package/dist/core/components/segmented-pills.js +31 -0
  59. package/dist/core/components/segmented-pills.js.map +1 -0
  60. package/dist/core/components/spinner.d.ts +2 -0
  61. package/dist/core/components/spinner.js +16 -0
  62. package/dist/core/components/spinner.js.map +1 -0
  63. package/dist/core/components/stack.d.ts +13 -0
  64. package/dist/core/components/stack.js +47 -0
  65. package/dist/core/components/stack.js.map +1 -0
  66. package/dist/core/components/tabs.d.ts +22 -0
  67. package/dist/core/components/tabs.js +118 -0
  68. package/dist/core/components/tabs.js.map +1 -0
  69. package/dist/core/components/text.d.ts +11 -0
  70. package/dist/core/components/text.js +18 -0
  71. package/dist/core/components/text.js.map +1 -0
  72. package/dist/core/props.d.ts +14 -0
  73. package/dist/core/props.js +30 -0
  74. package/dist/core/props.js.map +1 -0
  75. package/dist/core/registry.d.ts +26 -0
  76. package/dist/core/registry.js +36 -0
  77. package/dist/core/registry.js.map +1 -0
  78. package/dist/core/renderer.d.ts +16 -0
  79. package/dist/core/renderer.js +61 -0
  80. package/dist/core/renderer.js.map +1 -0
  81. package/dist/core/types.d.ts +55 -0
  82. package/dist/core/types.js +0 -0
  83. package/dist/events/event-bridge.d.ts +14 -0
  84. package/dist/events/event-bridge.js +75 -0
  85. package/dist/events/event-bridge.js.map +1 -0
  86. package/dist/events/event-names.d.ts +21 -0
  87. package/dist/events/event-names.js +22 -0
  88. package/dist/events/event-names.js.map +1 -0
  89. package/dist/form/components/base/checkbox.d.ts +4 -0
  90. package/dist/form/components/base/checkbox.js +22 -0
  91. package/dist/form/components/base/checkbox.js.map +1 -0
  92. package/dist/form/components/base/field.d.ts +9 -0
  93. package/dist/form/components/base/field.js +38 -0
  94. package/dist/form/components/base/field.js.map +1 -0
  95. package/dist/form/components/base/input-error.d.ts +4 -0
  96. package/dist/form/components/base/input-error.js +14 -0
  97. package/dist/form/components/base/input-error.js.map +1 -0
  98. package/dist/form/components/base/input.d.ts +3 -0
  99. package/dist/form/components/base/input.js +16 -0
  100. package/dist/form/components/base/input.js.map +1 -0
  101. package/dist/form/components/base/label.d.ts +4 -0
  102. package/dist/form/components/base/label.js +16 -0
  103. package/dist/form/components/base/label.js.map +1 -0
  104. package/dist/form/components/base/password-input.d.ts +7 -0
  105. package/dist/form/components/base/password-input.js +29 -0
  106. package/dist/form/components/base/password-input.js.map +1 -0
  107. package/dist/form/components/base/submit-button.d.ts +6 -0
  108. package/dist/form/components/base/submit-button.js +46 -0
  109. package/dist/form/components/base/submit-button.js.map +1 -0
  110. package/dist/form/components/base/textarea.d.ts +3 -0
  111. package/dist/form/components/base/textarea.js +15 -0
  112. package/dist/form/components/base/textarea.js.map +1 -0
  113. package/dist/form/components/conditions.d.ts +25 -0
  114. package/dist/form/components/conditions.js +62 -0
  115. package/dist/form/components/conditions.js.map +1 -0
  116. package/dist/form/components/context.d.ts +20 -0
  117. package/dist/form/components/context.js +30 -0
  118. package/dist/form/components/context.js.map +1 -0
  119. package/dist/form/components/fields/checkbox.d.ts +16 -0
  120. package/dist/form/components/fields/checkbox.js +51 -0
  121. package/dist/form/components/fields/checkbox.js.map +1 -0
  122. package/dist/form/components/fields/choice.d.ts +14 -0
  123. package/dist/form/components/fields/choice.js +49 -0
  124. package/dist/form/components/fields/choice.js.map +1 -0
  125. package/dist/form/components/fields/date-input.d.ts +20 -0
  126. package/dist/form/components/fields/date-input.js +33 -0
  127. package/dist/form/components/fields/date-input.js.map +1 -0
  128. package/dist/form/components/fields/hidden-input.d.ts +10 -0
  129. package/dist/form/components/fields/hidden-input.js +12 -0
  130. package/dist/form/components/fields/hidden-input.js.map +1 -0
  131. package/dist/form/components/fields/number-input.d.ts +23 -0
  132. package/dist/form/components/fields/number-input.js +55 -0
  133. package/dist/form/components/fields/number-input.js.map +1 -0
  134. package/dist/form/components/fields/password-input.d.ts +29 -0
  135. package/dist/form/components/fields/password-input.js +73 -0
  136. package/dist/form/components/fields/password-input.js.map +1 -0
  137. package/dist/form/components/fields/rich-editor.d.ts +17 -0
  138. package/dist/form/components/fields/rich-editor.js +302 -0
  139. package/dist/form/components/fields/rich-editor.js.map +1 -0
  140. package/dist/form/components/fields/select.d.ts +23 -0
  141. package/dist/form/components/fields/select.js +182 -0
  142. package/dist/form/components/fields/select.js.map +1 -0
  143. package/dist/form/components/fields/submit-button.d.ts +10 -0
  144. package/dist/form/components/fields/submit-button.js +14 -0
  145. package/dist/form/components/fields/submit-button.js.map +1 -0
  146. package/dist/form/components/fields/text-input.d.ts +21 -0
  147. package/dist/form/components/fields/text-input.js +33 -0
  148. package/dist/form/components/fields/text-input.js.map +1 -0
  149. package/dist/form/components/fields/textarea.d.ts +20 -0
  150. package/dist/form/components/fields/textarea.js +32 -0
  151. package/dist/form/components/fields/textarea.js.map +1 -0
  152. package/dist/form/components/form-transport.d.ts +8 -0
  153. package/dist/form/components/form-transport.js +31 -0
  154. package/dist/form/components/form-transport.js.map +1 -0
  155. package/dist/form/components/form.d.ts +21 -0
  156. package/dist/form/components/form.js +126 -0
  157. package/dist/form/components/form.js.map +1 -0
  158. package/dist/form/components/index.d.ts +11 -0
  159. package/dist/form/components/index.js +12 -0
  160. package/dist/form/components/resolved-nodes.d.ts +6 -0
  161. package/dist/form/components/resolved-nodes.js +20 -0
  162. package/dist/form/components/resolved-nodes.js.map +1 -0
  163. package/dist/form/components/types.d.ts +7 -0
  164. package/dist/form/components/types.js +0 -0
  165. package/dist/form/components/use-controlled-field.d.ts +16 -0
  166. package/dist/form/components/use-controlled-field.js +33 -0
  167. package/dist/form/components/use-controlled-field.js.map +1 -0
  168. package/dist/form/components/use-dependent-field.d.ts +3 -0
  169. package/dist/form/components/use-dependent-field.js +18 -0
  170. package/dist/form/components/use-dependent-field.js.map +1 -0
  171. package/dist/form/components/use-field-commit.d.ts +14 -0
  172. package/dist/form/components/use-field-commit.js +30 -0
  173. package/dist/form/components/use-field-commit.js.map +1 -0
  174. package/dist/form/components/use-form-resolver.d.ts +2 -0
  175. package/dist/form/components/use-form-resolver.js +57 -0
  176. package/dist/form/components/use-form-resolver.js.map +1 -0
  177. package/dist/form/components/values.d.ts +7 -0
  178. package/dist/form/components/values.js +37 -0
  179. package/dist/form/components/values.js.map +1 -0
  180. package/dist/form/index.d.ts +1 -0
  181. package/dist/form/index.js +33 -0
  182. package/dist/form/index.js.map +1 -0
  183. package/dist/form/skeleton.d.ts +2 -0
  184. package/dist/form/skeleton.js +21 -0
  185. package/dist/form/skeleton.js.map +1 -0
  186. package/dist/generated/types.d.ts +17 -0
  187. package/dist/generated/types.js +0 -0
  188. package/dist/icons/default-icons.d.ts +3 -0
  189. package/dist/icons/default-icons.js +44 -0
  190. package/dist/icons/default-icons.js.map +1 -0
  191. package/dist/icons/dynamic-lucide-renderer.d.ts +2 -0
  192. package/dist/icons/dynamic-lucide-renderer.js +18 -0
  193. package/dist/icons/dynamic-lucide-renderer.js.map +1 -0
  194. package/dist/icons/icon-renderer.d.ts +14 -0
  195. package/dist/icons/icon-renderer.js +35 -0
  196. package/dist/icons/icon-renderer.js.map +1 -0
  197. package/dist/icons/index.d.ts +2 -0
  198. package/dist/icons/index.js +2 -0
  199. package/dist/index.d.ts +22 -0
  200. package/dist/index.js +14 -0
  201. package/dist/inertia.d.ts +17 -0
  202. package/dist/inertia.js +26 -0
  203. package/dist/inertia.js.map +1 -0
  204. package/dist/lattice.css +247 -0
  205. package/dist/lib/utils.d.ts +4 -0
  206. package/dist/lib/utils.js +13 -0
  207. package/dist/lib/utils.js.map +1 -0
  208. package/dist/menu/index.d.ts +1 -0
  209. package/dist/menu/index.js +2 -0
  210. package/dist/menu/use-menu.d.ts +2 -0
  211. package/dist/menu/use-menu.js +9 -0
  212. package/dist/menu/use-menu.js.map +1 -0
  213. package/dist/page.d.ts +6 -0
  214. package/dist/page.js +30 -0
  215. package/dist/page.js.map +1 -0
  216. package/dist/provider.d.ts +7 -0
  217. package/dist/provider.js +19 -0
  218. package/dist/provider.js.map +1 -0
  219. package/dist/registry.d.ts +1 -0
  220. package/dist/registry.js +11 -0
  221. package/dist/registry.js.map +1 -0
  222. package/dist/table/bulk.d.ts +18 -0
  223. package/dist/table/bulk.js +44 -0
  224. package/dist/table/bulk.js.map +1 -0
  225. package/dist/table/components/bulk-bar.d.ts +11 -0
  226. package/dist/table/components/bulk-bar.js +76 -0
  227. package/dist/table/components/bulk-bar.js.map +1 -0
  228. package/dist/table/components/column-filter-control.d.ts +14 -0
  229. package/dist/table/components/column-filter-control.js +244 -0
  230. package/dist/table/components/column-filter-control.js.map +1 -0
  231. package/dist/table/components/column-header.d.ts +7 -0
  232. package/dist/table/components/column-header.js +37 -0
  233. package/dist/table/components/column-header.js.map +1 -0
  234. package/dist/table/components/filter-stack-bar.d.ts +7 -0
  235. package/dist/table/components/filter-stack-bar.js +35 -0
  236. package/dist/table/components/filter-stack-bar.js.map +1 -0
  237. package/dist/table/components/filter-value-input.d.ts +11 -0
  238. package/dist/table/components/filter-value-input.js +82 -0
  239. package/dist/table/components/filter-value-input.js.map +1 -0
  240. package/dist/table/components/pagination.d.ts +14 -0
  241. package/dist/table/components/pagination.js +67 -0
  242. package/dist/table/components/pagination.js.map +1 -0
  243. package/dist/table/components/sort-bar.d.ts +7 -0
  244. package/dist/table/components/sort-bar.js +43 -0
  245. package/dist/table/components/sort-bar.js.map +1 -0
  246. package/dist/table/components/table-action-node.d.ts +4 -0
  247. package/dist/table/components/table-action-node.js +24 -0
  248. package/dist/table/components/table-action-node.js.map +1 -0
  249. package/dist/table/components/table-cell.d.ts +5 -0
  250. package/dist/table/components/table-cell.js +63 -0
  251. package/dist/table/components/table-cell.js.map +1 -0
  252. package/dist/table/components/table.d.ts +3 -0
  253. package/dist/table/components/table.js +189 -0
  254. package/dist/table/components/table.js.map +1 -0
  255. package/dist/table/format.d.ts +3 -0
  256. package/dist/table/format.js +41 -0
  257. package/dist/table/format.js.map +1 -0
  258. package/dist/table/index.d.ts +1 -0
  259. package/dist/table/index.js +10 -0
  260. package/dist/table/index.js.map +1 -0
  261. package/dist/table/payload.d.ts +9 -0
  262. package/dist/table/payload.js +46 -0
  263. package/dist/table/payload.js.map +1 -0
  264. package/dist/table/query.d.ts +12 -0
  265. package/dist/table/query.js +83 -0
  266. package/dist/table/query.js.map +1 -0
  267. package/dist/table/types.d.ts +67 -0
  268. package/dist/table/types.js +0 -0
  269. package/dist/table/use-table-selection.d.ts +12 -0
  270. package/dist/table/use-table-selection.js +46 -0
  271. package/dist/table/use-table-selection.js.map +1 -0
  272. package/dist/table/use-table.d.ts +19 -0
  273. package/dist/table/use-table.js +157 -0
  274. package/dist/table/use-table.js.map +1 -0
  275. package/dist/types/index.d.ts +2 -0
  276. package/dist/types/index.js +0 -0
  277. package/package.json +151 -0
@@ -0,0 +1,157 @@
1
+ import { withRefHeader } from "../core/component-ref.js";
2
+ import { LATTICE_EVENT } from "../events/event-names.js";
3
+ import { getColumns, getPagination, getRows, getState } from "./payload.js";
4
+ import { buildEndpoint, nextSort } from "./query.js";
5
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
+ //#region resources/js/table/use-table.ts
7
+ function useTable(node) {
8
+ const columns = getColumns(node.props?.columns);
9
+ const endpoint = typeof node.props?.endpoint === "string" ? node.props.endpoint : null;
10
+ const componentRef = typeof node.props?.ref === "string" ? node.props.ref : "";
11
+ const isLazy = node.props?.lazy === true;
12
+ const initialState = useMemo(() => getState(node.props?.state), [node.props?.state]);
13
+ const [rows, setRows] = useState(() => getRows(node.props?.data));
14
+ const [pagination, setPagination] = useState(() => getPagination(node.props?.pagination));
15
+ const [state, setState] = useState(initialState);
16
+ const [filters, setFilters] = useState(initialState.filters);
17
+ const [processing, setProcessing] = useState(isLazy);
18
+ const [hasLoaded, setHasLoaded] = useState(!isLazy);
19
+ const infiniteLoaderRef = useRef(null);
20
+ const currentPage = pagination.currentPage ?? state.page;
21
+ const isInfinite = (pagination.mode ?? "table") === "infinite";
22
+ const load = useCallback(async (nextState, append = false) => {
23
+ if (!endpoint) return;
24
+ setProcessing(true);
25
+ try {
26
+ const result = await (await fetch(buildEndpoint(endpoint, nextState), { headers: {
27
+ Accept: "application/json",
28
+ ...withRefHeader(componentRef)
29
+ } })).json();
30
+ const resultState = getState(result.state);
31
+ const resultRows = getRows(result.data);
32
+ setRows((currentRows) => append ? [...currentRows, ...resultRows] : resultRows);
33
+ setPagination(getPagination(result.pagination));
34
+ setState(resultState);
35
+ setFilters(resultState.filters);
36
+ setHasLoaded(true);
37
+ } finally {
38
+ setProcessing(false);
39
+ }
40
+ }, [endpoint, componentRef]);
41
+ function sort(column) {
42
+ load({
43
+ ...state,
44
+ page: 1,
45
+ sorts: nextSort(state.sorts, column)
46
+ });
47
+ }
48
+ function clearSort(sort) {
49
+ load({
50
+ ...state,
51
+ page: 1,
52
+ sorts: state.sorts.filter((currentSort) => currentSort.key !== sort.key)
53
+ });
54
+ }
55
+ function addFilter(clause) {
56
+ const next = [...filters, clause];
57
+ setFilters(next);
58
+ load({
59
+ ...state,
60
+ filters: next,
61
+ page: 1
62
+ });
63
+ }
64
+ function updateFilter(index, clause) {
65
+ const next = filters.map((current, position) => position === index ? clause : current);
66
+ setFilters(next);
67
+ load({
68
+ ...state,
69
+ filters: next,
70
+ page: 1
71
+ });
72
+ }
73
+ function removeFilter(index) {
74
+ const next = filters.filter((_, current) => current !== index);
75
+ setFilters(next);
76
+ load({
77
+ ...state,
78
+ filters: next,
79
+ page: 1
80
+ });
81
+ }
82
+ function goToPage(page) {
83
+ load({
84
+ ...state,
85
+ page
86
+ });
87
+ }
88
+ const loadMore = useCallback(() => {
89
+ if (processing || !pagination.hasMore) return;
90
+ load({
91
+ ...state,
92
+ page: pagination.nextPage ?? currentPage + 1
93
+ }, true);
94
+ }, [
95
+ currentPage,
96
+ load,
97
+ pagination.hasMore,
98
+ pagination.nextPage,
99
+ processing,
100
+ state
101
+ ]);
102
+ useEffect(() => {
103
+ if (!isLazy || hasLoaded) return;
104
+ load(state);
105
+ }, [
106
+ hasLoaded,
107
+ isLazy,
108
+ load,
109
+ state
110
+ ]);
111
+ useEffect(() => {
112
+ function reload(event) {
113
+ if (event.detail?.component !== node.id) return;
114
+ load(state);
115
+ }
116
+ window.addEventListener(LATTICE_EVENT.reloadComponent, reload);
117
+ return () => window.removeEventListener(LATTICE_EVENT.reloadComponent, reload);
118
+ }, [
119
+ load,
120
+ node.id,
121
+ state
122
+ ]);
123
+ useEffect(() => {
124
+ if (!isInfinite || !pagination.hasMore || processing || !infiniteLoaderRef.current || typeof IntersectionObserver === "undefined") return;
125
+ const observer = new IntersectionObserver((entries) => {
126
+ if (entries.some((entry) => entry.isIntersecting)) loadMore();
127
+ }, { rootMargin: "240px" });
128
+ observer.observe(infiniteLoaderRef.current);
129
+ return () => observer.disconnect();
130
+ }, [
131
+ isInfinite,
132
+ loadMore,
133
+ pagination.hasMore,
134
+ processing
135
+ ]);
136
+ return {
137
+ columns,
138
+ rows,
139
+ pagination,
140
+ state,
141
+ filters,
142
+ addFilter,
143
+ updateFilter,
144
+ removeFilter,
145
+ processing,
146
+ hasLoaded,
147
+ infiniteLoaderRef,
148
+ sort,
149
+ clearSort,
150
+ goToPage,
151
+ loadMore
152
+ };
153
+ }
154
+ //#endregion
155
+ export { useTable };
156
+
157
+ //# sourceMappingURL=use-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-table.js","names":[],"sources":["../../resources/js/table/use-table.ts"],"sourcesContent":["import { withRefHeader } from \"@lattice/lattice/core/component-ref\";\nimport type { Node } from \"@lattice/lattice/core/types\";\nimport { LATTICE_EVENT, type ReloadComponentEvent } from \"@lattice/lattice/events/event-names\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getColumns, getPagination, getRows, getState } from \"./payload\";\nimport { buildEndpoint, nextSort } from \"./query\";\nimport type { FilterClause, TableColumn, TableResponse, TableSort, TableState } from \"./types\";\n\nexport function useTable(node: Node<\"table\">) {\n const columns = getColumns(node.props?.columns);\n const endpoint = typeof node.props?.endpoint === \"string\" ? node.props.endpoint : null;\n const componentRef = typeof node.props?.ref === \"string\" ? node.props.ref : \"\";\n const isLazy = node.props?.lazy === true;\n const initialState = useMemo(() => getState(node.props?.state), [node.props?.state]);\n const [rows, setRows] = useState(() => getRows(node.props?.data));\n const [pagination, setPagination] = useState(() => getPagination(node.props?.pagination));\n const [state, setState] = useState(initialState);\n const [filters, setFilters] = useState(initialState.filters);\n const [processing, setProcessing] = useState(isLazy);\n const [hasLoaded, setHasLoaded] = useState(!isLazy);\n const infiniteLoaderRef = useRef<HTMLDivElement | null>(null);\n const currentPage = pagination.currentPage ?? state.page;\n const isInfinite = (pagination.mode ?? \"table\") === \"infinite\";\n\n const load = useCallback(\n async (nextState: TableState, append = false): Promise<void> => {\n if (!endpoint) {\n return;\n }\n\n setProcessing(true);\n\n try {\n const response = await fetch(buildEndpoint(endpoint, nextState), {\n headers: {\n Accept: \"application/json\",\n ...withRefHeader(componentRef),\n },\n });\n const result = (await response.json()) as TableResponse;\n const resultState = getState(result.state);\n const resultRows = getRows(result.data);\n\n setRows((currentRows) => (append ? [...currentRows, ...resultRows] : resultRows));\n setPagination(getPagination(result.pagination));\n setState(resultState);\n setFilters(resultState.filters);\n setHasLoaded(true);\n } finally {\n setProcessing(false);\n }\n },\n [endpoint, componentRef],\n );\n\n function sort(column: TableColumn): void {\n void load({\n ...state,\n page: 1,\n sorts: nextSort(state.sorts, column),\n });\n }\n\n function clearSort(sort: TableSort): void {\n void load({\n ...state,\n page: 1,\n sorts: state.sorts.filter((currentSort) => currentSort.key !== sort.key),\n });\n }\n\n function addFilter(clause: FilterClause): void {\n const next = [...filters, clause];\n\n setFilters(next);\n void load({\n ...state,\n filters: next,\n page: 1,\n });\n }\n\n function updateFilter(index: number, clause: FilterClause): void {\n const next = filters.map((current, position) => (position === index ? clause : current));\n\n setFilters(next);\n void load({\n ...state,\n filters: next,\n page: 1,\n });\n }\n\n function removeFilter(index: number): void {\n const next = filters.filter((_, current) => current !== index);\n\n setFilters(next);\n void load({\n ...state,\n filters: next,\n page: 1,\n });\n }\n\n function goToPage(page: number): void {\n void load({\n ...state,\n page,\n });\n }\n\n const loadMore = useCallback((): void => {\n if (processing || !pagination.hasMore) {\n return;\n }\n\n void load(\n {\n ...state,\n page: pagination.nextPage ?? currentPage + 1,\n },\n true,\n );\n }, [currentPage, load, pagination.hasMore, pagination.nextPage, processing, state]);\n\n useEffect(() => {\n if (!isLazy || hasLoaded) {\n return;\n }\n\n void load(state);\n }, [hasLoaded, isLazy, load, state]);\n\n useEffect(() => {\n function reload(event: Event): void {\n const detail = (event as ReloadComponentEvent).detail;\n\n if (detail?.component !== node.id) {\n return;\n }\n\n void load(state);\n }\n\n window.addEventListener(LATTICE_EVENT.reloadComponent, reload);\n\n return () => window.removeEventListener(LATTICE_EVENT.reloadComponent, reload);\n }, [load, node.id, state]);\n\n useEffect(() => {\n if (\n !isInfinite ||\n !pagination.hasMore ||\n processing ||\n !infiniteLoaderRef.current ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n loadMore();\n }\n },\n {\n rootMargin: \"240px\",\n },\n );\n\n observer.observe(infiniteLoaderRef.current);\n\n return () => observer.disconnect();\n }, [isInfinite, loadMore, pagination.hasMore, processing]);\n\n return {\n columns,\n rows,\n pagination,\n state,\n filters,\n addFilter,\n updateFilter,\n removeFilter,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { MenuGroup, MenuItem, MenuPayload, Node, NodeProps, PageContainer, PageBreadcrumb, PagePayload, RendererComponent, } from '../../..';
2
+ export type { Method } from '@inertiajs/core';
File without changes
package/package.json ADDED
@@ -0,0 +1,151 @@
1
+ {
2
+ "name": "@lattice-php/lattice",
3
+ "version": "0.1.0",
4
+ "description": "Server-driven React components for Laravel and Inertia.",
5
+ "license": "MIT",
6
+ "author": "Manuel Christlieb <manuel@christlieb.eu>",
7
+ "type": "module",
8
+ "homepage": "https://latticephp.com",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/lattice-php/lattice.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/lattice-php/lattice/issues"
15
+ },
16
+ "keywords": [
17
+ "laravel",
18
+ "inertia",
19
+ "react",
20
+ "server-driven-ui"
21
+ ],
22
+ "sideEffects": [
23
+ "**/*.css"
24
+ ],
25
+ "main": "./dist/index.js",
26
+ "module": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.js"
32
+ },
33
+ "./css": "./dist/lattice.css",
34
+ "./action": {
35
+ "types": "./dist/action/index.d.ts",
36
+ "import": "./dist/action/index.js"
37
+ },
38
+ "./appearance": {
39
+ "types": "./dist/appearance/index.d.ts",
40
+ "import": "./dist/appearance/index.js"
41
+ },
42
+ "./clipboard": {
43
+ "types": "./dist/clipboard/index.d.ts",
44
+ "import": "./dist/clipboard/index.js"
45
+ },
46
+ "./core/components": {
47
+ "types": "./dist/core/components/index.d.ts",
48
+ "import": "./dist/core/components/index.js"
49
+ },
50
+ "./form": {
51
+ "types": "./dist/form/index.d.ts",
52
+ "import": "./dist/form/index.js"
53
+ },
54
+ "./form/components": {
55
+ "types": "./dist/form/components/index.d.ts",
56
+ "import": "./dist/form/components/index.js"
57
+ },
58
+ "./icons": {
59
+ "types": "./dist/icons/index.d.ts",
60
+ "import": "./dist/icons/index.js"
61
+ },
62
+ "./menu": {
63
+ "types": "./dist/menu/index.d.ts",
64
+ "import": "./dist/menu/index.js"
65
+ },
66
+ "./table": {
67
+ "types": "./dist/table/index.d.ts",
68
+ "import": "./dist/table/index.js"
69
+ },
70
+ "./types": {
71
+ "types": "./dist/types/index.d.ts",
72
+ "import": "./dist/types/index.js"
73
+ },
74
+ "./*": {
75
+ "types": "./dist/*.d.ts",
76
+ "import": "./dist/*.js"
77
+ }
78
+ },
79
+ "files": [
80
+ "dist"
81
+ ],
82
+ "publishConfig": {
83
+ "access": "public"
84
+ },
85
+ "scripts": {
86
+ "dev": "vite",
87
+ "build": "vite build",
88
+ "build:lib": "vite build --mode lib",
89
+ "prepack": "npm run build:lib",
90
+ "test": "vitest run",
91
+ "typecheck": "tsc --noEmit",
92
+ "lint": "oxlint resources/js workbench/resources/js",
93
+ "lint:fix": "oxlint resources/js workbench/resources/js --fix",
94
+ "lint:github": "oxlint resources/js workbench/resources/js --format=github",
95
+ "format": "oxfmt --write \"resources/js/**/*.{ts,tsx}\" \"workbench/resources/js/**/*.{ts,tsx}\"",
96
+ "format:check": "oxfmt --check \"resources/js/**/*.{ts,tsx}\" \"workbench/resources/js/**/*.{ts,tsx}\"",
97
+ "docs:dev": "astro dev",
98
+ "docs:build": "astro build",
99
+ "docs:preview": "astro preview"
100
+ },
101
+ "dependencies": {
102
+ "@radix-ui/react-checkbox": "^1.1.4",
103
+ "@radix-ui/react-label": "^2.1.2",
104
+ "@radix-ui/react-slot": "^1.2.3",
105
+ "@tiptap/extension-details": "^3.26.0",
106
+ "@tiptap/extension-highlight": "^3.26.0",
107
+ "@tiptap/extension-link": "^3.26.0",
108
+ "@tiptap/extension-table": "^3.26.0",
109
+ "@tiptap/extension-text-align": "^3.26.0",
110
+ "@tiptap/pm": "^3.26.0",
111
+ "@tiptap/react": "^3.26.0",
112
+ "@tiptap/starter-kit": "^3.26.0",
113
+ "class-variance-authority": "^0.7.1",
114
+ "clsx": "^2.1.1",
115
+ "lucide-react": "^1.17.0",
116
+ "tailwind-merge": "^3.0.1"
117
+ },
118
+ "peerDependencies": {
119
+ "@inertiajs/react": "^3.0.0",
120
+ "react": "^19.0.0",
121
+ "react-dom": "^19.0.0"
122
+ },
123
+ "devDependencies": {
124
+ "@astrojs/starlight": "^0.40.0",
125
+ "@astrojs/starlight-tailwind": "^5.0.0",
126
+ "@inertiajs/react": "^3.0.0",
127
+ "@inertiajs/vite": "^3.0.0",
128
+ "@tailwindcss/vite": "^4.1.11",
129
+ "@testing-library/dom": "^10.4.1",
130
+ "@testing-library/jest-dom": "^6.9.1",
131
+ "@testing-library/react": "^16.3.0",
132
+ "@types/node": "^25.9.2",
133
+ "@types/react": "^19.2.0",
134
+ "@types/react-dom": "^19.2.0",
135
+ "@vitejs/plugin-react": "^6.0.2",
136
+ "astro": "7.0.0-beta.3",
137
+ "jsdom": "^29.1.1",
138
+ "laravel-vite-plugin": "^3.0.0",
139
+ "oxfmt": "^0.54.0",
140
+ "oxlint": "^1.68.0",
141
+ "playwright": "^1.60.0",
142
+ "react": "^19.2.0",
143
+ "react-dom": "^19.2.0",
144
+ "tailwindcss": "^4.0.0",
145
+ "tw-animate-css": "^1.4.0",
146
+ "typescript": "^6.0.3",
147
+ "vite": "^8.0.0",
148
+ "vite-plugin-dts": "^4.5.4",
149
+ "vitest": "^4.1.8"
150
+ }
151
+ }