@lattice-php/lattice 0.20.0 → 0.21.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 (199) hide show
  1. package/dist/action/components/action-form.d.ts +6 -1
  2. package/dist/action/components/action-form.js +34 -49
  3. package/dist/action/components/action-form.js.map +1 -1
  4. package/dist/action/components/action-trigger-provider.d.ts +1 -1
  5. package/dist/action/components/action-trigger-provider.js.map +1 -1
  6. package/dist/action/hooks/use-action.d.ts +1 -1
  7. package/dist/action/hooks/use-action.js +3 -1
  8. package/dist/action/hooks/use-action.js.map +1 -1
  9. package/dist/action/index.d.ts +0 -2
  10. package/dist/action/index.js +1 -2
  11. package/dist/chat/plugin.d.ts +0 -1
  12. package/dist/chat/plugin.js.map +1 -1
  13. package/dist/clipboard/index.d.ts +0 -4
  14. package/dist/clipboard/index.js +1 -15
  15. package/dist/{events → core}/event-names.js +1 -1
  16. package/dist/core/event-names.js.map +1 -0
  17. package/dist/core/hooks/use-window-event.d.ts +8 -0
  18. package/dist/core/hooks/use-window-event.js +22 -0
  19. package/dist/core/hooks/use-window-event.js.map +1 -0
  20. package/dist/core/index.js +3 -3
  21. package/dist/core/types.d.ts +8 -73
  22. package/dist/create-app.js +1 -1
  23. package/dist/effects/dispatch.js +1 -1
  24. package/dist/effects/dispatch.js.map +1 -1
  25. package/dist/effects/registry.d.ts +2 -18
  26. package/dist/effects/registry.js +4 -8
  27. package/dist/effects/registry.js.map +1 -1
  28. package/dist/event-bridge.js +10 -23
  29. package/dist/event-bridge.js.map +1 -1
  30. package/dist/form/components/fields/date-picker-field.js +1 -1
  31. package/dist/form/components/fields/file-upload.js +4 -6
  32. package/dist/form/components/fields/file-upload.js.map +1 -1
  33. package/dist/form/components/fields/select.js +2 -2
  34. package/dist/form/components/fields/select.js.map +1 -1
  35. package/dist/form/components/fields/table-rows.js +3 -15
  36. package/dist/form/components/fields/table-rows.js.map +1 -1
  37. package/dist/form/components/form.js +8 -23
  38. package/dist/form/components/form.js.map +1 -1
  39. package/dist/form/embed.d.ts +4 -0
  40. package/dist/form/embed.js +3 -1
  41. package/dist/form/lib/collect-fields.d.ts +7 -0
  42. package/dist/form/lib/collect-fields.js +19 -0
  43. package/dist/form/lib/collect-fields.js.map +1 -0
  44. package/dist/form/lib/field-errors.d.ts +3 -0
  45. package/dist/form/lib/field-errors.js +11 -0
  46. package/dist/form/lib/field-errors.js.map +1 -0
  47. package/dist/format/format-context.d.ts +6 -0
  48. package/dist/format/format-context.js +17 -0
  49. package/dist/format/format-context.js.map +1 -0
  50. package/dist/i18n/backend.js +1 -1
  51. package/dist/i18n/index.js +2 -2
  52. package/dist/i18n/instance.js +1 -1
  53. package/dist/i18n/locale-reload.d.ts +1 -1
  54. package/dist/i18n/locale-reload.js +7 -6
  55. package/dist/i18n/locale-reload.js.map +1 -1
  56. package/dist/i18n/locale.js +1 -1
  57. package/dist/i18n/locale.js.map +1 -1
  58. package/dist/i18n/page-props.js +1 -1
  59. package/dist/i18n/shared-props.js +1 -3
  60. package/dist/i18n/shared-props.js.map +1 -1
  61. package/dist/i18n/timezone.js +1 -1
  62. package/dist/i18n/timezone.js.map +1 -1
  63. package/dist/index.d.ts +6 -7
  64. package/dist/index.js +7 -8
  65. package/dist/lattice.css +105 -0
  66. package/dist/layout/components/callouts.js +1 -1
  67. package/dist/layout/components/sidebar.js +15 -48
  68. package/dist/layout/components/sidebar.js.map +1 -1
  69. package/dist/layout/plugin.d.ts +0 -1
  70. package/dist/layout/plugin.js.map +1 -1
  71. package/dist/lib/is-truthy.d.ts +2 -0
  72. package/dist/lib/is-truthy.js +9 -0
  73. package/dist/lib/is-truthy.js.map +1 -0
  74. package/dist/lib/use-debounced-callback.d.ts +10 -0
  75. package/dist/lib/use-debounced-callback.js +34 -0
  76. package/dist/lib/use-debounced-callback.js.map +1 -0
  77. package/dist/lib/use-media-query.d.ts +5 -0
  78. package/dist/lib/use-media-query.js +26 -0
  79. package/dist/lib/use-media-query.js.map +1 -0
  80. package/dist/lib/use-persistent-state.d.ts +13 -0
  81. package/dist/lib/use-persistent-state.js +62 -0
  82. package/dist/lib/use-persistent-state.js.map +1 -0
  83. package/dist/notifications/components/notifications.js +3 -1
  84. package/dist/notifications/components/notifications.js.map +1 -1
  85. package/dist/notifications/plugin.d.ts +0 -1
  86. package/dist/notifications/plugin.js.map +1 -1
  87. package/dist/provider-base.js +1 -1
  88. package/dist/realtime/listeners.d.ts +1 -1
  89. package/dist/realtime/listeners.js +1 -1
  90. package/dist/realtime/listeners.js.map +1 -1
  91. package/dist/registry.d.ts +5 -0
  92. package/dist/registry.js.map +1 -1
  93. package/dist/remote/components/data-list.js +1 -1
  94. package/dist/remote/plugin.d.ts +0 -1
  95. package/dist/remote/plugin.js.map +1 -1
  96. package/dist/table/components/bulk-bar.js +4 -2
  97. package/dist/table/components/bulk-bar.js.map +1 -1
  98. package/dist/table/components/cells/boolean-cell.js +1 -3
  99. package/dist/table/components/cells/boolean-cell.js.map +1 -1
  100. package/dist/table/components/cells/copyable-cell.d.ts +9 -0
  101. package/dist/table/components/cells/copyable-cell.js +17 -0
  102. package/dist/table/components/cells/copyable-cell.js.map +1 -0
  103. package/dist/table/components/cells/money-cell.js +7 -18
  104. package/dist/table/components/cells/money-cell.js.map +1 -1
  105. package/dist/table/components/cells/number-cell.js +14 -27
  106. package/dist/table/components/cells/number-cell.js.map +1 -1
  107. package/dist/table/components/cells/numeric-cell.d.ts +10 -0
  108. package/dist/table/components/cells/numeric-cell.js +25 -0
  109. package/dist/table/components/cells/numeric-cell.js.map +1 -0
  110. package/dist/table/components/cells/stack-cell.js +1 -1
  111. package/dist/table/components/cells/text-cell.js +4 -5
  112. package/dist/table/components/cells/text-cell.js.map +1 -1
  113. package/dist/table/components/filter-controls.js +1 -3
  114. package/dist/table/components/filter-controls.js.map +1 -1
  115. package/dist/table/components/table-cell.js.map +1 -1
  116. package/dist/table/components/table-search.js +4 -7
  117. package/dist/table/components/table-search.js.map +1 -1
  118. package/dist/table/components/table.js +2 -3
  119. package/dist/table/components/table.js.map +1 -1
  120. package/dist/table/hooks/use-column-visibility.js +29 -58
  121. package/dist/table/hooks/use-column-visibility.js.map +1 -1
  122. package/dist/table/hooks/use-table.js +5 -13
  123. package/dist/table/hooks/use-table.js.map +1 -1
  124. package/dist/table/lib/bulk.d.ts +2 -0
  125. package/dist/table/lib/bulk.js +3 -1
  126. package/dist/table/lib/bulk.js.map +1 -1
  127. package/dist/table/lib/query.js +1 -1
  128. package/dist/table/lib/query.js.map +1 -1
  129. package/dist/table/plugin.d.ts +0 -1
  130. package/dist/table/plugin.js.map +1 -1
  131. package/dist/table/types.d.ts +4 -57
  132. package/dist/toast/callout.js +1 -1
  133. package/dist/toast/callout.js.map +1 -1
  134. package/dist/toast/index.d.ts +1 -1
  135. package/dist/toast/index.js +2 -2
  136. package/dist/toast/toast.d.ts +0 -2
  137. package/dist/toast/toast.js +3 -10
  138. package/dist/toast/toast.js.map +1 -1
  139. package/dist/toast/toaster.js +2 -2
  140. package/dist/types/generated.d.ts +224 -80
  141. package/dist/types/index.d.ts +1 -1
  142. package/dist/ui/button.d.ts +2 -2
  143. package/dist/ui/chart-view.js +7 -30
  144. package/dist/ui/chart-view.js.map +1 -1
  145. package/dist/ui/click-behavior.d.ts +4 -4
  146. package/dist/ui/click-behavior.js.map +1 -1
  147. package/dist/ui/collapsible.js +3 -15
  148. package/dist/ui/collapsible.js.map +1 -1
  149. package/dist/ui/combobox.js +6 -3
  150. package/dist/ui/combobox.js.map +1 -1
  151. package/dist/ui/confirm-dialog.js +1 -1
  152. package/dist/ui/confirm-dialog.js.map +1 -1
  153. package/dist/ui/control.d.ts +1 -1
  154. package/dist/ui/dialog.d.ts +6 -2
  155. package/dist/ui/dialog.js +29 -5
  156. package/dist/ui/dialog.js.map +1 -1
  157. package/dist/ui/fragment.js +1 -1
  158. package/dist/ui/fragment.js.map +1 -1
  159. package/dist/ui/icon-button.d.ts +1 -1
  160. package/dist/ui/image-preview.js +1 -1
  161. package/dist/ui/image-preview.js.map +1 -1
  162. package/dist/ui/modal.js +3 -2
  163. package/dist/ui/modal.js.map +1 -1
  164. package/dist/ui/pill.d.ts +2 -0
  165. package/dist/ui/pill.js +10 -0
  166. package/dist/ui/pill.js.map +1 -0
  167. package/dist/ui/plugin.js.map +1 -1
  168. package/dist/ui/progress.js +1 -1
  169. package/dist/ui/section.js +2 -15
  170. package/dist/ui/section.js.map +1 -1
  171. package/dist/ui/segmented-pills.js +2 -1
  172. package/dist/ui/segmented-pills.js.map +1 -1
  173. package/dist/ui/tabs.js +12 -10
  174. package/dist/ui/tabs.js.map +1 -1
  175. package/dist/ui/tree-context.js +11 -13
  176. package/dist/ui/tree-context.js.map +1 -1
  177. package/dist/ui/tree.js +1 -1
  178. package/dist/ui/tree.js.map +1 -1
  179. package/dist/ui/use-collapsible-state.d.ts +7 -0
  180. package/dist/ui/use-collapsible-state.js +21 -0
  181. package/dist/ui/use-collapsible-state.js.map +1 -0
  182. package/dist-standalone/chunks/chart-view-C6R5iPra.js +36 -0
  183. package/dist-standalone/chunks/{date-picker-field-VbH9xrQO.js → date-picker-field-DhhEB-Mh.js} +1 -1
  184. package/dist-standalone/chunks/{page-props-AIa5UR6n.js → page-props-DOfg30l5.js} +1 -1
  185. package/dist-standalone/chunks/{rich-editor-field-DLQTyt36.js → rich-editor-field-DORXTHPw.js} +2 -2
  186. package/dist-standalone/chunks/{subscriptions-DY2tj9Im.js → subscriptions-B_ISgA7V.js} +1 -1
  187. package/dist-standalone/chunks/use-effect-dispatcher-D1wPPwHj.js +97 -0
  188. package/dist-standalone/lattice.css +1 -1
  189. package/dist-standalone/lattice.js +15 -15
  190. package/dist-standalone/manifest.json +8 -8
  191. package/package.json +1 -1
  192. package/dist/clipboard/index.js.map +0 -1
  193. package/dist/events/event-names.js.map +0 -1
  194. package/dist/table/components/table-action-node.d.ts +0 -4
  195. package/dist/table/components/table-action-node.js +0 -24
  196. package/dist/table/components/table-action-node.js.map +0 -1
  197. package/dist-standalone/chunks/chart-view-wJmnVu7L.js +0 -36
  198. package/dist-standalone/chunks/use-effect-dispatcher-feEs0GCP.js +0 -97
  199. /package/dist/{events → core}/event-names.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","names":[],"sources":["../../../resources/js/table/lib/query.ts"],"sourcesContent":["import { translate } from \"@lattice-php/lattice/i18n\";\nimport { DEFAULT_COLUMN_WIDTH } from \"@lattice-php/lattice/core/hooks/column-sizing\";\nimport type { ColumnWidth } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyMember } from \"./filter-values\";\nimport type { TableColumn, TableSort, TableQuery } from \"@lattice-php/lattice/table/types\";\n\nexport function getColumnSort(query: TableQuery, column: TableColumn): TableSort | undefined {\n return query.sorts.find((currentSort) => currentSort.key === column.key);\n}\n\nexport function getColumnAriaSort(\n sort: TableSort | undefined,\n): \"ascending\" | \"descending\" | undefined {\n if (sort?.direction === \"asc\") {\n return \"ascending\";\n }\n\n if (sort?.direction === \"desc\") {\n return \"descending\";\n }\n\n return undefined;\n}\n\nexport function buildEndpoint(endpoint: string, query: TableQuery): string {\n const url = new URL(endpoint, window.location.origin);\n\n if (query.filters.length > 0) {\n url.searchParams.set(\"filter\", serializeFilters(query));\n }\n\n if (query.sorts.length > 0) {\n url.searchParams.set(\"sort\", serializeSorts(query));\n }\n\n if (query.search !== \"\") {\n url.searchParams.set(\"q\", query.search);\n }\n\n appendTableFilters(url, query.tableFilters);\n\n url.searchParams.set(\"page\", String(query.page));\n url.searchParams.set(\"per_page\", String(query.perPage));\n\n return `${url.pathname}${url.search}`;\n}\n\nfunction appendTableFilters(url: URL, tableFilters: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(getTableFilterParams(tableFilters))) {\n appendTableFilterParam(url, `tf[${key}]`, value);\n }\n}\n\nfunction getTableFilterParams(tableFilters: Record<string, unknown>): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(tableFilters)) {\n const normalized = normalizeTableFilterValue(value);\n\n if (normalized !== undefined) {\n params[key] = normalized;\n }\n }\n\n return params;\n}\n\nfunction normalizeTableFilterValue(value: unknown): unknown | undefined {\n if (isEmptyMember(value) || Array.isArray(value) || typeof value !== \"object\") {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([subKey, subValue]) => [subKey, normalizeTableFilterMember(subValue)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction normalizeTableFilterMember(value: unknown): unknown | undefined {\n if (isEmptyMember(value)) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const values = value.map(normalizeTableFilterMember).filter((item) => item !== undefined);\n\n return values.length > 0 ? values : undefined;\n }\n\n if (typeof value === \"object\") {\n if (value === null) {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([key, item]) => [key, normalizeTableFilterMember(item)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n }\n\n return String(value);\n}\n\nfunction appendTableFilterParam(url: URL, key: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n appendTableFilterParam(url, `${key}[]`, item);\n }\n\n return;\n }\n\n if (typeof value === \"object\" && value !== null) {\n for (const [subKey, subValue] of Object.entries(value)) {\n appendTableFilterParam(url, `${key}[${subKey}]`, subValue);\n }\n\n return;\n }\n\n url.searchParams.append(key, String(value));\n}\n\nexport function getQueryParams(query: TableQuery): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (query.filters.length > 0) {\n params.filter = serializeFilters(query);\n }\n\n if (query.sorts.length > 0) {\n params.sort = serializeSorts(query);\n }\n\n const tableFilters = getTableFilterParams(query.tableFilters);\n\n if (Object.keys(tableFilters).length > 0) {\n params.tf = tableFilters;\n }\n\n if (query.search !== \"\") {\n params.q = query.search;\n }\n\n return params;\n}\n\nfunction serializeFilters(query: TableQuery): string {\n return query.filters\n .map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`)\n .join(\",\");\n}\n\nfunction serializeSorts(query: TableQuery): string {\n return query.sorts\n .map((sort) => (sort.direction === \"desc\" ? `-${sort.key}` : sort.key))\n .join(\",\");\n}\n\nconst operatorLabels: Record<string, string> = {\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n eq: \"equals\",\n neq: \"not equals\",\n gt: \">\",\n gte: \"≥\",\n lt: \"<\",\n lte: \"≤\",\n in: \"in\",\n not_in: \"not in\",\n before: \"before\",\n after: \"after\",\n empty: \"is empty\",\n filled: \"is not empty\",\n};\n\nexport const VALUELESS_FILTER_OPERATORS = new Set<string>([\"empty\", \"filled\"]);\n\nexport function operatorLabel(operator: string): string {\n return translate(\"lattice\", `table.operators.${operator}`, operatorLabels[operator] ?? operator);\n}\n\nexport function getSortDirectionLabel(direction: string): string {\n return direction === \"desc\" ? \"descending\" : \"ascending\";\n}\n\nexport function nextSort(sorts: TableSort[], column: TableColumn): TableSort[] {\n if (!column.props.sortable) {\n return sorts;\n }\n\n const currentSort = sorts.find((sort) => sort.key === column.key);\n const remainingSorts = sorts.filter((sort) => sort.key !== column.key);\n\n if (!currentSort) {\n return [...sorts, { key: column.key, direction: \"asc\" }];\n }\n\n if (currentSort.direction === \"asc\") {\n return [...remainingSorts, { key: column.key, direction: \"desc\" }];\n }\n\n return remainingSorts;\n}\n\nexport function getVisiblePages(currentPage: number, lastPage: number): number[] {\n if (lastPage <= 5) {\n return Array.from({ length: lastPage }, (_, index) => index + 1);\n }\n\n const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));\n\n return Array.from({ length: 5 }, (_, index) => start + index);\n}\n\nexport function getTableSizingColumns(columns: TableColumn[]) {\n return columns.map((column) => ({\n key: column.key,\n label: column.props.label,\n width: columnWidthOrDefault(column),\n }));\n}\n\nfunction columnWidthOrDefault(column: TableColumn): ColumnWidth {\n return (column.props.width ??\n (column.type === \"column.stack\" ? \"xl\" : DEFAULT_COLUMN_WIDTH)) as ColumnWidth;\n}\n\nexport function getTableUtilityTracks(\n hasActions: boolean,\n hasSelection: boolean,\n hasExpander = false,\n) {\n // Utility tracks are fixed because the independent header/filter/body grids would drift with content-sized tracks.\n return {\n leadingTracks: [...(hasExpander ? [\"2.5rem\"] : []), ...(hasSelection ? [\"3rem\"] : [])],\n trailingTracks: hasActions ? [\"10rem\"] : [],\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"query.js","names":[],"sources":["../../../resources/js/table/lib/query.ts"],"sourcesContent":["import { translate } from \"@lattice-php/lattice/i18n\";\nimport { DEFAULT_COLUMN_WIDTH } from \"@lattice-php/lattice/core/hooks/column-sizing\";\nimport type { ColumnWidth } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyMember } from \"./filter-values\";\nimport type { TableColumn, TableSort, TableQuery } from \"@lattice-php/lattice/table/types\";\n\nexport function getColumnSort(query: TableQuery, column: TableColumn): TableSort | undefined {\n return query.sorts.find((currentSort) => currentSort.key === column.key);\n}\n\nexport function getColumnAriaSort(\n sort: TableSort | undefined,\n): \"ascending\" | \"descending\" | undefined {\n if (sort?.direction === \"asc\") {\n return \"ascending\";\n }\n\n if (sort?.direction === \"desc\") {\n return \"descending\";\n }\n\n return undefined;\n}\n\nexport function buildEndpoint(endpoint: string, query: TableQuery): string {\n const url = new URL(endpoint, window.location.origin);\n\n if (query.filters.length > 0) {\n url.searchParams.set(\"filter\", serializeFilters(query));\n }\n\n if (query.sorts.length > 0) {\n url.searchParams.set(\"sort\", serializeSorts(query));\n }\n\n if (query.search !== \"\") {\n url.searchParams.set(\"q\", query.search);\n }\n\n appendTableFilters(url, query.tableFilters);\n\n url.searchParams.set(\"page\", String(query.page));\n url.searchParams.set(\"per_page\", String(query.perPage));\n\n return `${url.pathname}${url.search}`;\n}\n\nfunction appendTableFilters(url: URL, tableFilters: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(getTableFilterParams(tableFilters))) {\n appendTableFilterParam(url, `tf[${key}]`, value);\n }\n}\n\nfunction getTableFilterParams(tableFilters: Record<string, unknown>): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(tableFilters)) {\n const normalized = normalizeTableFilterValue(value);\n\n if (normalized !== undefined) {\n params[key] = normalized;\n }\n }\n\n return params;\n}\n\nfunction normalizeTableFilterValue(value: unknown): unknown | undefined {\n if (isEmptyMember(value) || Array.isArray(value) || typeof value !== \"object\") {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([subKey, subValue]) => [subKey, normalizeTableFilterMember(subValue)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction normalizeTableFilterMember(value: unknown): unknown | undefined {\n if (isEmptyMember(value)) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const values = value.map(normalizeTableFilterMember).filter((item) => item !== undefined);\n\n return values.length > 0 ? values : undefined;\n }\n\n if (typeof value === \"object\") {\n if (value === null) {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([key, item]) => [key, normalizeTableFilterMember(item)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n }\n\n return String(value);\n}\n\nfunction appendTableFilterParam(url: URL, key: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n appendTableFilterParam(url, `${key}[]`, item);\n }\n\n return;\n }\n\n if (typeof value === \"object\" && value !== null) {\n for (const [subKey, subValue] of Object.entries(value)) {\n appendTableFilterParam(url, `${key}[${subKey}]`, subValue);\n }\n\n return;\n }\n\n url.searchParams.append(key, String(value));\n}\n\nexport function getQueryParams(query: TableQuery): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (query.filters.length > 0) {\n params.filter = serializeFilters(query);\n }\n\n if (query.sorts.length > 0) {\n params.sort = serializeSorts(query);\n }\n\n const tableFilters = getTableFilterParams(query.tableFilters);\n\n if (Object.keys(tableFilters).length > 0) {\n params.tf = tableFilters;\n }\n\n if (query.search !== \"\") {\n params.q = query.search;\n }\n\n return params;\n}\n\nfunction serializeFilters(query: TableQuery): string {\n return query.filters\n .map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`)\n .join(\",\");\n}\n\nfunction serializeSorts(query: TableQuery): string {\n return query.sorts\n .map((sort) => (sort.direction === \"desc\" ? `-${sort.key}` : sort.key))\n .join(\",\");\n}\n\nconst operatorLabels: Record<string, string> = {\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n eq: \"equals\",\n neq: \"not equals\",\n gt: \">\",\n gte: \"≥\",\n lt: \"<\",\n lte: \"≤\",\n in: \"in\",\n not_in: \"not in\",\n before: \"before\",\n after: \"after\",\n empty: \"is empty\",\n filled: \"is not empty\",\n};\n\nexport const VALUELESS_FILTER_OPERATORS = new Set<string>([\"empty\", \"filled\"]);\n\nexport function operatorLabel(operator: string): string {\n return translate(\"lattice\", `table.operators.${operator}`, operatorLabels[operator] ?? operator);\n}\n\nexport function getSortDirectionLabel(direction: string): string {\n return direction === \"desc\" ? \"descending\" : \"ascending\";\n}\n\nexport function nextSort(sorts: TableSort[], column: TableColumn): TableSort[] {\n if (!column.props.sortable) {\n return sorts;\n }\n\n const currentSort = sorts.find((sort) => sort.key === column.key);\n const remainingSorts = sorts.filter((sort) => sort.key !== column.key);\n\n if (!currentSort) {\n return [...sorts, { key: column.key, direction: \"asc\" }];\n }\n\n if (currentSort.direction === \"asc\") {\n return [...remainingSorts, { key: column.key, direction: \"desc\" }];\n }\n\n return remainingSorts;\n}\n\nexport function getVisiblePages(currentPage: number, lastPage: number): number[] {\n if (lastPage <= 5) {\n return Array.from({ length: lastPage }, (_, index) => index + 1);\n }\n\n const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));\n\n return Array.from({ length: 5 }, (_, index) => start + index);\n}\n\nexport function getTableSizingColumns(columns: TableColumn[]) {\n return columns.map((column) => ({\n key: column.key,\n label: column.props.label,\n width: columnWidthOrDefault(column),\n }));\n}\n\nfunction columnWidthOrDefault(column: TableColumn): ColumnWidth {\n return (column.props.width ?? DEFAULT_COLUMN_WIDTH) as ColumnWidth;\n}\n\nexport function getTableUtilityTracks(\n hasActions: boolean,\n hasSelection: boolean,\n hasExpander = false,\n) {\n // Utility tracks are fixed because the independent header/filter/body grids would drift with content-sized tracks.\n return {\n leadingTracks: [...(hasExpander ? [\"2.5rem\"] : []), ...(hasSelection ? [\"3rem\"] : [])],\n trailingTracks: hasActions ? [\"10rem\"] : [],\n };\n}\n"],"mappings":"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"}
@@ -1,2 +1 @@
1
- export type TableComponentType = "table";
2
1
  export declare const tableComponents: import('../core/registry.js').Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/table/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport TableComponent from \"./components/table\";\n\nexport type TableComponentType = \"table\";\n\n// The table renders an enriched TableNode (rows/pagination/state the server\n// hydrates onto it); the registry erases per-component node types here.\nexport const tableComponents = createPlugin({\n components: {\n table: eagerComponent(TableComponent as unknown as RendererComponent<\"table\">),\n } satisfies ComponentRegistryFor<TableComponentType>,\n name: \"lattice/table\",\n});\n"],"mappings":";;;AAYA,IAAa,kBAAkB,aAAa;CAC1C,YAAY,EACV,OAAO,eAAe,cAAuD,EAC/E;CACA,MAAM;AACR,CAAC"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/table/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { TableNodeType } from \"@lattice-php/lattice/types/generated\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport TableComponent from \"./components/table\";\n\n// The table renders an enriched TableNode (rows/pagination/state the server\n// hydrates onto it); the registry erases per-component node types here.\nexport const tableComponents = createPlugin({\n components: {\n table: eagerComponent(TableComponent as unknown as RendererComponent<\"table\">),\n } satisfies ComponentRegistryFor<TableNodeType>,\n name: \"lattice/table\",\n});\n"],"mappings":";;;AAWA,IAAa,kBAAkB,aAAa;CAC1C,YAAY,EACV,OAAO,eAAe,cAAuD,EAC/E;CACA,MAAM;AACR,CAAC"}
@@ -1,13 +1,10 @@
1
- import { NodeUnionOf, ResolveProps, Schema, WireNode } from '../core/types.js';
2
- import { ActionNodeType, ColumnFilter, ColumnPropsMap, ColumnType, FilterClause, FilterIndicator, FilterPropsMap, Table, TablePagination, TableQuery, TableResult, TableSort } from '../types/generated.js';
3
- export type { ColumnFilter, ColumnType, FilterClause, FilterIndicator, TablePagination, TableQuery, TableResult, TableSort, };
1
+ import { NodeUnionOf } from '../core/types.js';
2
+ import { ActionNodeType, ColumnFilter, ColumnNode, ColumnProps, ColumnPropsOf, ColumnNodeType, CommonColumnProps, FilterClause, FilterIndicator, FilterNode, FilterNodeType, FilterProps, FilterPropsOf, Table, TablePagination, TableQuery, TableResult, TableSort } from '../types/generated.js';
3
+ export type { ColumnFilter, ColumnNode, ColumnProps, ColumnPropsOf, ColumnNodeType, CommonColumnProps, FilterClause, FilterIndicator, FilterNode, FilterNodeType, FilterProps, FilterPropsOf, TablePagination, TableQuery, TableResult, TableSort, };
4
4
  export type ActionNode = NodeUnionOf<ActionNodeType>;
5
5
  export type TableRow = Record<string, unknown>;
6
- export type TableNodeProps = Partial<Omit<Table, "bulkActions" | "columns" | "filters">> & {
7
- bulkActions?: ActionNode[];
8
- columns?: ColumnNode[];
6
+ export type TableNodeProps = Partial<Table> & {
9
7
  data?: TableRow[];
10
- filters?: FilterNode[];
11
8
  pagination?: TablePagination;
12
9
  query?: Partial<TableQuery>;
13
10
  };
@@ -17,54 +14,4 @@ export type TableNode = {
17
14
  key?: string;
18
15
  props?: TableNodeProps;
19
16
  };
20
- /**
21
- * Consumer apps augment this via `declare module "@lattice-php/lattice"` to type
22
- * their custom columns' props; built-ins resolve through `ColumnPropsMap`. The
23
- * column counterpart of `ComponentProps`.
24
- */
25
- export interface ColumnProps {
26
- }
27
- /**
28
- * The base `Column` props every column node carries on the wire regardless of
29
- * type — custom columns extend `Column`, so the unaugmented fallback carries
30
- * them too. Derived from the generated types (each built-in bakes them in)
31
- * rather than hand-written.
32
- */
33
- export type CommonColumnProps = Pick<ColumnPropsMap["column.text"], "label" | "width" | "align" | "sortable" | "toggleable" | "hiddenByDefault" | "filter">;
34
- export type ColumnPropsOf<TType extends string> = ResolveProps<ColumnProps, ColumnPropsMap, TType, CommonColumnProps & Record<string, unknown>>;
35
- /**
36
- * A column node, authored and consumed like a field/component: `key`/`type`
37
- * stay top-level, every common concern (`label`/`width`/`filter`/…) lives in
38
- * `props` on each generated column type. `schema` is only present for a
39
- * `StackColumn`: the bound component nodes rendered per row (see
40
- * `materializeSchema`). The column counterpart of `NodeOfType`.
41
- */
42
- export type ColumnNode<TType extends string = string> = {
43
- type: TType;
44
- key: string;
45
- props: ColumnPropsOf<TType>;
46
- schema?: Schema;
47
- };
48
17
  export type TableColumn = ColumnNode;
49
- /**
50
- * Consumer apps augment this via `declare module` to type their custom filters'
51
- * props. Schema-based filters no longer need custom client props, but the map
52
- * remains for existing custom controls during the migration.
53
- */
54
- export interface FilterProps {
55
- }
56
- export type FilterPropsOf<TType extends string> = ResolveProps<FilterProps, FilterPropsMap, TType, Record<string, unknown>>;
57
- export type FilterNodeType = keyof FilterPropsMap & string;
58
- /**
59
- * A dedicated table filter, authored and consumed like a field/component:
60
- * `key`/`type` stay top-level, `props` carries `label` plus whatever the
61
- * filter type contributes. `schema` is the bound field(s) rendering the
62
- * filter's control and is absent when empty. The filter counterpart of
63
- * `ColumnNode`.
64
- */
65
- export type FilterNode<TType extends string = FilterNodeType> = {
66
- type: TType;
67
- key: string;
68
- props: FilterPropsOf<TType>;
69
- schema?: WireNode[];
70
- };
@@ -1,4 +1,4 @@
1
- import { LATTICE_EVENT } from "../events/event-names.js";
1
+ import { LATTICE_EVENT } from "../core/event-names.js";
2
2
  import { isVariant } from "./toast.js";
3
3
  //#region resources/js/toast/callout.ts
4
4
  function normalizeCallout(detail) {
@@ -1 +1 @@
1
- {"version":3,"file":"callout.js","names":[],"sources":["../../resources/js/toast/callout.ts"],"sourcesContent":["import type { Callout } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/events/event-names\";\nimport { isVariant } from \"./toast\";\n\nexport type { Callout };\n\nexport function normalizeCallout(detail: unknown): Callout | null {\n if (typeof detail !== \"object\" || detail === null) {\n return null;\n }\n\n const callout = detail as Record<string, unknown>;\n\n if (typeof callout.message !== \"string\" || callout.message === \"\") {\n return null;\n }\n\n return {\n action: (callout.action as Callout[\"action\"]) ?? null,\n dismissible: callout.dismissible !== false,\n message: callout.message,\n title: typeof callout.title === \"string\" ? callout.title : null,\n variant: isVariant(callout.variant) ? callout.variant : \"info\",\n };\n}\n\nexport function onCallout(callback: (callout: Callout) => void): () => void {\n const listener = (event: Event): void => {\n const callout = normalizeCallout((event as CustomEvent).detail);\n\n if (callout) {\n callback(callout);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.callout, listener);\n\n return () => window.removeEventListener(LATTICE_EVENT.callout, listener);\n}\n"],"mappings":";;;AAMA,SAAgB,iBAAiB,QAAiC;CAChE,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,OAAO;CAGT,MAAM,UAAU;CAEhB,IAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,YAAY,IAC7D,OAAO;CAGT,OAAO;EACL,QAAS,QAAQ,UAAgC;EACjD,aAAa,QAAQ,gBAAgB;EACrC,SAAS,QAAQ;EACjB,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;EAC3D,SAAS,UAAU,QAAQ,OAAO,IAAI,QAAQ,UAAU;CAC1D;AACF;AAEA,SAAgB,UAAU,UAAkD;CAC1E,MAAM,YAAY,UAAuB;EACvC,MAAM,UAAU,iBAAkB,MAAsB,MAAM;EAE9D,IAAI,SACF,SAAS,OAAO;CAEpB;CAEA,OAAO,iBAAiB,cAAc,SAAS,QAAQ;CAEvD,aAAa,OAAO,oBAAoB,cAAc,SAAS,QAAQ;AACzE"}
1
+ {"version":3,"file":"callout.js","names":[],"sources":["../../resources/js/toast/callout.ts"],"sourcesContent":["import type { Callout } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/core/event-names\";\nimport { isVariant } from \"./toast\";\n\nexport type { Callout };\n\nexport function normalizeCallout(detail: unknown): Callout | null {\n if (typeof detail !== \"object\" || detail === null) {\n return null;\n }\n\n const callout = detail as Record<string, unknown>;\n\n if (typeof callout.message !== \"string\" || callout.message === \"\") {\n return null;\n }\n\n return {\n action: (callout.action as Callout[\"action\"]) ?? null,\n dismissible: callout.dismissible !== false,\n message: callout.message,\n title: typeof callout.title === \"string\" ? callout.title : null,\n variant: isVariant(callout.variant) ? callout.variant : \"info\",\n };\n}\n\nexport function onCallout(callback: (callout: Callout) => void): () => void {\n const listener = (event: Event): void => {\n const callout = normalizeCallout((event as CustomEvent).detail);\n\n if (callout) {\n callback(callout);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.callout, listener);\n\n return () => window.removeEventListener(LATTICE_EVENT.callout, listener);\n}\n"],"mappings":";;;AAMA,SAAgB,iBAAiB,QAAiC;CAChE,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,OAAO;CAGT,MAAM,UAAU;CAEhB,IAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,YAAY,IAC7D,OAAO;CAGT,OAAO;EACL,QAAS,QAAQ,UAAgC;EACjD,aAAa,QAAQ,gBAAgB;EACrC,SAAS,QAAQ;EACjB,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;EAC3D,SAAS,UAAU,QAAQ,OAAO,IAAI,QAAQ,UAAU;CAC1D;AACF;AAEA,SAAgB,UAAU,UAAkD;CAC1E,MAAM,YAAY,UAAuB;EACvC,MAAM,UAAU,iBAAkB,MAAsB,MAAM;EAE9D,IAAI,SACF,SAAS,OAAO;CAEpB;CAEA,OAAO,iBAAiB,cAAc,SAAS,QAAQ;CAEvD,aAAa,OAAO,oBAAoB,cAAc,SAAS,QAAQ;AACzE"}
@@ -1,6 +1,6 @@
1
1
  export { normalizeCallout, onCallout } from './callout.js';
2
2
  export type { Callout } from './callout.js';
3
3
  export { Toaster } from './toaster.js';
4
- export { isVariant, normalizeToast, normalizeToastMessage, onToast, showToast } from './toast.js';
4
+ export { isVariant, normalizeToastMessage, onToast } from './toast.js';
5
5
  export type { ToastMessage, Variant } from './toast.js';
6
6
  export { variantStyles } from './variant-styles.js';
@@ -1,5 +1,5 @@
1
- import { isVariant, normalizeToast, normalizeToastMessage, onToast, showToast } from "./toast.js";
1
+ import { isVariant, normalizeToastMessage, onToast } from "./toast.js";
2
2
  import { normalizeCallout, onCallout } from "./callout.js";
3
3
  import { variantStyles } from "./variant-styles.js";
4
4
  import { Toaster } from "./toaster.js";
5
- export { Toaster, isVariant, normalizeCallout, normalizeToast, normalizeToastMessage, onCallout, onToast, showToast, variantStyles };
5
+ export { Toaster, isVariant, normalizeCallout, normalizeToastMessage, onCallout, onToast, variantStyles };
@@ -2,6 +2,4 @@ import { Toast as ToastMessage, Variant } from '../types/generated.js';
2
2
  export type { ToastMessage, Variant };
3
3
  export declare function isVariant(value: unknown): value is Variant;
4
4
  export declare function normalizeToastMessage(value: unknown): ToastMessage | null;
5
- export declare function normalizeToast(detail: unknown): ToastMessage | null;
6
- export declare function showToast(toast: ToastMessage): void;
7
5
  export declare function onToast(callback: (toast: ToastMessage) => void): () => void;
@@ -1,4 +1,4 @@
1
- import { LATTICE_EVENT } from "../events/event-names.js";
1
+ import { LATTICE_EVENT } from "../core/event-names.js";
2
2
  import { isTranslatable } from "../i18n/translatable.js";
3
3
  //#region resources/js/toast/toast.ts
4
4
  var variants = [
@@ -25,22 +25,15 @@ function normalizeToastMessage(value) {
25
25
  variant: isVariant(toast.variant) ? toast.variant : "success"
26
26
  };
27
27
  }
28
- function normalizeToast(detail) {
29
- return normalizeToastMessage(detail);
30
- }
31
- function showToast(toast) {
32
- if (typeof window === "undefined") return;
33
- window.dispatchEvent(new CustomEvent(LATTICE_EVENT.toast, { detail: toast }));
34
- }
35
28
  function onToast(callback) {
36
29
  const listener = (event) => {
37
- const toast = normalizeToast(event.detail);
30
+ const toast = normalizeToastMessage(event.detail);
38
31
  if (toast) callback(toast);
39
32
  };
40
33
  window.addEventListener(LATTICE_EVENT.toast, listener);
41
34
  return () => window.removeEventListener(LATTICE_EVENT.toast, listener);
42
35
  }
43
36
  //#endregion
44
- export { isVariant, normalizeToast, normalizeToastMessage, onToast, showToast };
37
+ export { isVariant, normalizeToastMessage, onToast };
45
38
 
46
39
  //# sourceMappingURL=toast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toast.js","names":[],"sources":["../../resources/js/toast/toast.ts"],"sourcesContent":["import type { Toast as ToastMessage, Variant } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/events/event-names\";\nimport { isTranslatable } from \"@lattice-php/lattice/i18n/translatable\";\n\nexport type { ToastMessage, Variant };\n\nconst variants = [\"success\", \"info\", \"warning\", \"error\"] as const satisfies readonly Variant[];\n\nexport function isVariant(value: unknown): value is Variant {\n return variants.some((variant) => variant === value);\n}\n\nexport function normalizeToastMessage(value: unknown): ToastMessage | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const toast = value as Record<string, unknown>;\n\n const rawMessage = toast.message;\n const message =\n typeof rawMessage === \"string\" ? rawMessage : isTranslatable(rawMessage) ? rawMessage : null;\n\n if (message === null || message === \"\") {\n return null;\n }\n\n return {\n action: (toast.action as ToastMessage[\"action\"]) ?? null,\n dismissible: toast.dismissible !== false,\n duration: typeof toast.duration === \"number\" ? toast.duration : null,\n message,\n persistent: toast.persistent === true,\n variant: isVariant(toast.variant) ? toast.variant : \"success\",\n };\n}\n\nexport function normalizeToast(detail: unknown): ToastMessage | null {\n return normalizeToastMessage(detail);\n}\n\nexport function showToast(toast: ToastMessage): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.dispatchEvent(new CustomEvent(LATTICE_EVENT.toast, { detail: toast }));\n}\n\nexport function onToast(callback: (toast: ToastMessage) => void): () => void {\n const listener = (event: Event): void => {\n const toast = normalizeToast((event as CustomEvent).detail);\n\n if (toast) {\n callback(toast);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.toast, listener);\n\n return () => window.removeEventListener(LATTICE_EVENT.toast, listener);\n}\n"],"mappings":";;;AAMA,IAAM,WAAW;CAAC;CAAW;CAAQ;CAAW;AAAO;AAEvD,SAAgB,UAAU,OAAkC;CAC1D,OAAO,SAAS,MAAM,YAAY,YAAY,KAAK;AACrD;AAEA,SAAgB,sBAAsB,OAAqC;CACzE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,QAAQ;CAEd,MAAM,aAAa,MAAM;CACzB,MAAM,UACJ,OAAO,eAAe,WAAW,aAAa,eAAe,UAAU,IAAI,aAAa;CAE1F,IAAI,YAAY,QAAQ,YAAY,IAClC,OAAO;CAGT,OAAO;EACL,QAAS,MAAM,UAAqC;EACpD,aAAa,MAAM,gBAAgB;EACnC,UAAU,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;EAChE;EACA,YAAY,MAAM,eAAe;EACjC,SAAS,UAAU,MAAM,OAAO,IAAI,MAAM,UAAU;CACtD;AACF;AAEA,SAAgB,eAAe,QAAsC;CACnE,OAAO,sBAAsB,MAAM;AACrC;AAEA,SAAgB,UAAU,OAA2B;CACnD,IAAI,OAAO,WAAW,aACpB;CAGF,OAAO,cAAc,IAAI,YAAY,cAAc,OAAO,EAAE,QAAQ,MAAM,CAAC,CAAC;AAC9E;AAEA,SAAgB,QAAQ,UAAqD;CAC3E,MAAM,YAAY,UAAuB;EACvC,MAAM,QAAQ,eAAgB,MAAsB,MAAM;EAE1D,IAAI,OACF,SAAS,KAAK;CAElB;CAEA,OAAO,iBAAiB,cAAc,OAAO,QAAQ;CAErD,aAAa,OAAO,oBAAoB,cAAc,OAAO,QAAQ;AACvE"}
1
+ {"version":3,"file":"toast.js","names":[],"sources":["../../resources/js/toast/toast.ts"],"sourcesContent":["import type { Toast as ToastMessage, Variant } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/core/event-names\";\nimport { isTranslatable } from \"@lattice-php/lattice/i18n/translatable\";\n\nexport type { ToastMessage, Variant };\n\nconst variants = [\"success\", \"info\", \"warning\", \"error\"] as const satisfies readonly Variant[];\n\nexport function isVariant(value: unknown): value is Variant {\n return variants.some((variant) => variant === value);\n}\n\nexport function normalizeToastMessage(value: unknown): ToastMessage | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const toast = value as Record<string, unknown>;\n\n const rawMessage = toast.message;\n const message =\n typeof rawMessage === \"string\" ? rawMessage : isTranslatable(rawMessage) ? rawMessage : null;\n\n if (message === null || message === \"\") {\n return null;\n }\n\n return {\n action: (toast.action as ToastMessage[\"action\"]) ?? null,\n dismissible: toast.dismissible !== false,\n duration: typeof toast.duration === \"number\" ? toast.duration : null,\n message,\n persistent: toast.persistent === true,\n variant: isVariant(toast.variant) ? toast.variant : \"success\",\n };\n}\n\nexport function onToast(callback: (toast: ToastMessage) => void): () => void {\n const listener = (event: Event): void => {\n const toast = normalizeToastMessage((event as CustomEvent).detail);\n\n if (toast) {\n callback(toast);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.toast, listener);\n\n return () => window.removeEventListener(LATTICE_EVENT.toast, listener);\n}\n"],"mappings":";;;AAMA,IAAM,WAAW;CAAC;CAAW;CAAQ;CAAW;AAAO;AAEvD,SAAgB,UAAU,OAAkC;CAC1D,OAAO,SAAS,MAAM,YAAY,YAAY,KAAK;AACrD;AAEA,SAAgB,sBAAsB,OAAqC;CACzE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,QAAQ;CAEd,MAAM,aAAa,MAAM;CACzB,MAAM,UACJ,OAAO,eAAe,WAAW,aAAa,eAAe,UAAU,IAAI,aAAa;CAE1F,IAAI,YAAY,QAAQ,YAAY,IAClC,OAAO;CAGT,OAAO;EACL,QAAS,MAAM,UAAqC;EACpD,aAAa,MAAM,gBAAgB;EACnC,UAAU,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;EAChE;EACA,YAAY,MAAM,eAAe;EACjC,SAAS,UAAU,MAAM,OAAO,IAAI,MAAM,UAAU;CACtD;AACF;AAEA,SAAgB,QAAQ,UAAqD;CAC3E,MAAM,YAAY,UAAuB;EACvC,MAAM,QAAQ,sBAAuB,MAAsB,MAAM;EAEjE,IAAI,OACF,SAAS,KAAK;CAElB;CAEA,OAAO,iBAAiB,cAAc,OAAO,QAAQ;CAErD,aAAa,OAAO,oBAAoB,cAAc,OAAO,QAAQ;AACvE"}
@@ -1,8 +1,8 @@
1
- import { resolveTranslatable } from "../i18n/translatable.js";
2
- import { onToast } from "./toast.js";
3
1
  import { cn } from "../lib/utils.js";
4
2
  import { Icon } from "../icons/sprite.js";
5
3
  import { RenderNode } from "../core/renderer.js";
4
+ import { resolveTranslatable } from "../i18n/translatable.js";
5
+ import { onToast } from "./toast.js";
6
6
  import { useT } from "../i18n/instance.js";
7
7
  import { variantStyles } from "./variant-styles.js";
8
8
  import { useEffect, useState } from "react";