@pattern-stack/frontend-patterns 0.2.0-alpha.18 → 0.2.0-alpha.19

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 (67) hide show
  1. package/dist/frontend-patterns.css +1 -1
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.es.js +93 -33
  5. package/dist/index.es.js.map +1 -1
  6. package/dist/index.js +93 -33
  7. package/dist/index.js.map +1 -1
  8. package/dist/swebrain/SweBrainShowcase.d.ts +8 -0
  9. package/dist/swebrain/SweBrainShowcase.d.ts.map +1 -0
  10. package/dist/swebrain/atoms/Card.d.ts +15 -0
  11. package/dist/swebrain/atoms/Card.d.ts.map +1 -0
  12. package/dist/swebrain/atoms/Chip.d.ts +17 -0
  13. package/dist/swebrain/atoms/Chip.d.ts.map +1 -0
  14. package/dist/swebrain/atoms/Duration.d.ts +7 -0
  15. package/dist/swebrain/atoms/Duration.d.ts.map +1 -0
  16. package/dist/swebrain/atoms/EmptyCell.d.ts +5 -0
  17. package/dist/swebrain/atoms/EmptyCell.d.ts.map +1 -0
  18. package/dist/swebrain/atoms/Hand.d.ts +8 -0
  19. package/dist/swebrain/atoms/Hand.d.ts.map +1 -0
  20. package/dist/swebrain/atoms/ID.d.ts +9 -0
  21. package/dist/swebrain/atoms/ID.d.ts.map +1 -0
  22. package/dist/swebrain/atoms/IdTag.d.ts +9 -0
  23. package/dist/swebrain/atoms/IdTag.d.ts.map +1 -0
  24. package/dist/swebrain/atoms/KV.d.ts +7 -0
  25. package/dist/swebrain/atoms/KV.d.ts.map +1 -0
  26. package/dist/swebrain/atoms/LiveIndicator.d.ts +7 -0
  27. package/dist/swebrain/atoms/LiveIndicator.d.ts.map +1 -0
  28. package/dist/swebrain/atoms/PoolChip.d.ts +14 -0
  29. package/dist/swebrain/atoms/PoolChip.d.ts.map +1 -0
  30. package/dist/swebrain/atoms/Row.d.ts +10 -0
  31. package/dist/swebrain/atoms/Row.d.ts.map +1 -0
  32. package/dist/swebrain/atoms/Sparkline.d.ts +11 -0
  33. package/dist/swebrain/atoms/Sparkline.d.ts.map +1 -0
  34. package/dist/swebrain/atoms/StatusBadge.d.ts +11 -0
  35. package/dist/swebrain/atoms/StatusBadge.d.ts.map +1 -0
  36. package/dist/swebrain/atoms/StatusDot.d.ts +11 -0
  37. package/dist/swebrain/atoms/StatusDot.d.ts.map +1 -0
  38. package/dist/swebrain/atoms/Timestamp.d.ts +8 -0
  39. package/dist/swebrain/atoms/Timestamp.d.ts.map +1 -0
  40. package/dist/swebrain/atoms/index.d.ts +34 -0
  41. package/dist/swebrain/atoms/index.d.ts.map +1 -0
  42. package/dist/swebrain/atoms/pool-tokens.d.ts +14 -0
  43. package/dist/swebrain/atoms/pool-tokens.d.ts.map +1 -0
  44. package/dist/swebrain/atoms/tokens.d.ts +96 -0
  45. package/dist/swebrain/atoms/tokens.d.ts.map +1 -0
  46. package/dist/swebrain/index.d.ts +4 -0
  47. package/dist/swebrain/index.d.ts.map +1 -0
  48. package/dist/swebrain/lib/favs.d.ts +5 -0
  49. package/dist/swebrain/lib/favs.d.ts.map +1 -0
  50. package/dist/swebrain/lib/vendors.d.ts +14 -0
  51. package/dist/swebrain/lib/vendors.d.ts.map +1 -0
  52. package/dist/swebrain/molecules/PoolLegend.d.ts +8 -0
  53. package/dist/swebrain/molecules/PoolLegend.d.ts.map +1 -0
  54. package/dist/swebrain/molecules/SearchInput.d.ts +17 -0
  55. package/dist/swebrain/molecules/SearchInput.d.ts.map +1 -0
  56. package/dist/swebrain/molecules/StatCard.d.ts +11 -0
  57. package/dist/swebrain/molecules/StatCard.d.ts.map +1 -0
  58. package/dist/swebrain/molecules/TimeRangePicker.d.ts +18 -0
  59. package/dist/swebrain/molecules/TimeRangePicker.d.ts.map +1 -0
  60. package/dist/swebrain/molecules/index.d.ts +9 -0
  61. package/dist/swebrain/molecules/index.d.ts.map +1 -0
  62. package/dist/sync/createEntityHooks.d.ts.map +1 -1
  63. package/dist/sync/index.d.ts +1 -1
  64. package/dist/sync/index.d.ts.map +1 -1
  65. package/dist/sync/types.d.ts +110 -23
  66. package/dist/sync/types.d.ts.map +1 -1
  67. package/package.json +2 -1
package/dist/index.js CHANGED
@@ -19090,20 +19090,50 @@ function createEntityHooks(config) {
19090
19090
  /** Key for a specific entity detail query */
19091
19091
  detail: (id) => [...keys.details(), id]
19092
19092
  };
19093
- function useListSync(filters) {
19093
+ const DEFAULT_PAGE_SIZE = 50;
19094
+ function toPage(raw, requestedPage, requestedPageSize) {
19095
+ if (Array.isArray(raw)) {
19096
+ const items2 = raw;
19097
+ return {
19098
+ items: items2,
19099
+ page: requestedPage,
19100
+ pageCount: 1,
19101
+ total: items2.length,
19102
+ pageSize: requestedPageSize || items2.length || DEFAULT_PAGE_SIZE,
19103
+ nextCursor: null
19104
+ };
19105
+ }
19106
+ const env2 = raw ?? {};
19107
+ const items = Array.isArray(env2.items) ? env2.items : [];
19108
+ const pageSize = typeof env2.pageSize === "number" && env2.pageSize > 0 ? env2.pageSize : requestedPageSize || DEFAULT_PAGE_SIZE;
19109
+ const total = typeof env2.total === "number" ? env2.total : items.length;
19110
+ const pageCount = typeof env2.pageCount === "number" ? env2.pageCount : Math.max(1, Math.ceil(total / Math.max(1, pageSize)));
19111
+ return {
19112
+ items,
19113
+ page: typeof env2.page === "number" ? env2.page : requestedPage,
19114
+ pageCount,
19115
+ total,
19116
+ pageSize,
19117
+ nextCursor: env2.nextCursor ?? null
19118
+ };
19119
+ }
19120
+ function useListSync(params, requestedPage, requestedPageSize) {
19094
19121
  const query = reactQuery.useQuery({
19095
- queryKey: keys.list(filters),
19096
- queryFn: () => api.list(filters),
19122
+ queryKey: keys.list(params),
19123
+ queryFn: () => api.list(params),
19097
19124
  staleTime
19098
19125
  });
19126
+ const pageEnvelope = React.useMemo(
19127
+ () => query.data === void 0 ? void 0 : toPage(query.data, requestedPage, requestedPageSize),
19128
+ [query.data, requestedPage, requestedPageSize]
19129
+ );
19099
19130
  React.useEffect(() => {
19100
19131
  var _a, _b;
19101
- if (query.data) {
19102
- const items = Array.isArray(query.data) ? query.data : query.data.items || [];
19103
- (_b = (_a = collection.utils) == null ? void 0 : _a.writeUpsert) == null ? void 0 : _b.call(_a, items);
19132
+ if (pageEnvelope) {
19133
+ (_b = (_a = collection.utils) == null ? void 0 : _a.writeUpsert) == null ? void 0 : _b.call(_a, pageEnvelope.items);
19104
19134
  }
19105
- }, [query.data]);
19106
- return query;
19135
+ }, [pageEnvelope]);
19136
+ return { query, pageEnvelope };
19107
19137
  }
19108
19138
  function useGetSync(id) {
19109
19139
  const query = reactQuery.useQuery({
@@ -19121,41 +19151,71 @@ function createEntityHooks(config) {
19121
19151
  return query;
19122
19152
  }
19123
19153
  function useList(options = {}) {
19124
- const { where, orderBy, enabled = true } = options;
19125
- const sync = useListSync(enabled ? where : void 0);
19154
+ const { where, orderBy, enabled = true, pageSize, cursor } = options;
19155
+ const [page, setPageState] = React.useState(() => Math.max(1, options.page ?? 1));
19156
+ const params = React.useMemo(() => {
19157
+ if (!enabled) return void 0;
19158
+ const p = { page };
19159
+ if (pageSize !== void 0) p.pageSize = pageSize;
19160
+ if (cursor !== void 0) p.cursor = cursor;
19161
+ if (orderBy) {
19162
+ p.sort_by = orderBy.field;
19163
+ p.sort_order = orderBy.direction;
19164
+ }
19165
+ if (where) Object.assign(p, where);
19166
+ return p;
19167
+ }, [enabled, page, pageSize, cursor, orderBy, where]);
19168
+ const { query: sync, pageEnvelope } = useListSync(params, page, pageSize ?? DEFAULT_PAGE_SIZE);
19169
+ const pageIds = React.useMemo(() => {
19170
+ if (!pageEnvelope) return [];
19171
+ return pageEnvelope.items.map((item) => item.id).filter((id) => typeof id === "string");
19172
+ }, [pageEnvelope]);
19126
19173
  const liveResult = reactDb.useLiveQuery(collection);
19127
19174
  const data = React.useMemo(() => {
19128
- let items = liveResult.data ?? [];
19129
- if (where) {
19130
- items = items.filter((item) => {
19131
- return Object.entries(where).every(([key, value]) => {
19132
- if (value === void 0) return true;
19133
- const itemValue = item[key];
19134
- if (Array.isArray(value)) {
19135
- return value.includes(itemValue);
19136
- }
19137
- return itemValue === value;
19138
- });
19139
- });
19175
+ var _a, _b;
19176
+ const live = liveResult.data ?? [];
19177
+ const byId = /* @__PURE__ */ new Map();
19178
+ for (const row of live) {
19179
+ const id = row.id;
19180
+ if (typeof id === "string") byId.set(id, row);
19140
19181
  }
19141
- if (orderBy) {
19142
- items = [...items].sort((a, b) => {
19143
- const aVal = a[orderBy.field];
19144
- const bVal = b[orderBy.field];
19145
- if (aVal < bVal) return orderBy.direction === "asc" ? -1 : 1;
19146
- if (aVal > bVal) return orderBy.direction === "asc" ? 1 : -1;
19147
- return 0;
19148
- });
19182
+ const rows = [];
19183
+ for (const id of pageIds) {
19184
+ const row = byId.get(id) ?? // eslint-disable-next-line @typescript-eslint/no-explicit-any
19185
+ ((_b = (_a = collection.state) == null ? void 0 : _a.get) == null ? void 0 : _b.call(_a, id));
19186
+ if (row !== void 0) rows.push(row);
19149
19187
  }
19150
- return items;
19151
- }, [liveResult.data, where, orderBy]);
19188
+ return rows;
19189
+ }, [liveResult.data, pageIds]);
19190
+ const pageCount = (pageEnvelope == null ? void 0 : pageEnvelope.pageCount) ?? 1;
19191
+ const total = (pageEnvelope == null ? void 0 : pageEnvelope.total) ?? data.length;
19192
+ const resolvedPageSize = (pageEnvelope == null ? void 0 : pageEnvelope.pageSize) ?? pageSize ?? DEFAULT_PAGE_SIZE;
19193
+ const currentPage = (pageEnvelope == null ? void 0 : pageEnvelope.page) ?? page;
19194
+ const setPage = React.useCallback(
19195
+ (next2) => {
19196
+ const clamped = Math.max(1, pageCount > 0 ? Math.min(next2, pageCount) : next2);
19197
+ setPageState(clamped);
19198
+ },
19199
+ [pageCount]
19200
+ );
19201
+ const next = React.useCallback(() => setPage(page + 1), [setPage, page]);
19202
+ const prev = React.useCallback(() => setPage(page - 1), [setPage, page]);
19152
19203
  return {
19153
19204
  data,
19154
19205
  isLoading: sync.isLoading || liveResult.isLoading,
19155
19206
  isError: sync.isError,
19156
19207
  error: sync.error,
19157
19208
  refetch: sync.refetch,
19158
- collection
19209
+ collection,
19210
+ page: currentPage,
19211
+ pageCount,
19212
+ total,
19213
+ pageSize: resolvedPageSize,
19214
+ setPage,
19215
+ next,
19216
+ prev,
19217
+ hasNext: currentPage < pageCount,
19218
+ hasPrev: currentPage > 1
19159
19219
  };
19160
19220
  }
19161
19221
  function useGet(id, options = {}) {