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

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 (69) 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 +163 -35
  5. package/dist/index.es.js.map +1 -1
  6. package/dist/index.js +163 -35
  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/createStore.d.ts +78 -15
  64. package/dist/sync/createStore.d.ts.map +1 -1
  65. package/dist/sync/index.d.ts +2 -2
  66. package/dist/sync/index.d.ts.map +1 -1
  67. package/dist/sync/types.d.ts +216 -23
  68. package/dist/sync/types.d.ts.map +1 -1
  69. package/package.json +2 -1
@@ -1,14 +1,39 @@
1
- import type { EntityHooks } from './types.js';
1
+ import type { EntityHooks, LookupsEngine, UseDataOptions, UseDataResult } from './types.js';
2
+ /**
3
+ * Row constraint shared by entity hooks — every entity row has an optional id.
4
+ */
5
+ type AnyRow = object & {
6
+ id?: string | null;
7
+ };
2
8
  /**
3
9
  * Configuration for store creation.
10
+ *
11
+ * `fields` and `lookups` are OPTIONAL — existing callers (and `useList`/
12
+ * `useGet`/mutations) keep working unchanged when they're omitted.
13
+ *
4
14
  * Uses `any` for collection types to avoid version mismatch issues
5
15
  * with TanStack DB beta types across npm link boundaries.
16
+ *
17
+ * @template TFields - Per-entity FieldMeta record map (consumer/codegen-owned;
18
+ * the sync layer treats each entry generically — it never imports FieldMeta).
19
+ * @template TLookups - The hydrated lookups shape (consumer/codegen-owned).
6
20
  */
7
- export interface StoreConfig {
21
+ export interface StoreConfig<TFields extends Record<string, any> = Record<string, unknown>, TLookups = unknown> {
8
22
  /** Entity hooks keyed by name */
9
23
  entities: Record<string, EntityHooks<any, any, any>>;
10
24
  /** Collections keyed by name */
11
25
  collections: Record<string, any>;
26
+ /**
27
+ * NEW — generated per-entity FieldMeta record, keyed by the same plural names
28
+ * as `entities`. Surfaced by `useData().meta`. Treated generically: the per
29
+ * entity meta type is `TFields[plural]`; the sync layer never inspects it.
30
+ */
31
+ fields?: TFields;
32
+ /**
33
+ * NEW — cross-entity lookups engine. `useData` hydrates it once on mount and
34
+ * returns `lookups.current`. See {@link LookupsEngine}.
35
+ */
36
+ lookups?: LookupsEngine<TLookups>;
12
37
  }
13
38
  /**
14
39
  * Resolver functions for FK lookups.
@@ -28,38 +53,76 @@ export interface Lookups {
28
53
  current: Record<string, LookupMap<unknown>> | null;
29
54
  clear: () => void;
30
55
  }
56
+ /**
57
+ * The unified `useData` hook signature attached to each `store.<entity>`.
58
+ *
59
+ * @template TRow - The entity row type
60
+ * @template TMeta - The per-entity FieldMeta record (consumer/codegen-owned)
61
+ * @template TLookups - The hydrated lookups shape (consumer/codegen-owned)
62
+ */
63
+ export type UseDataHook<TRow extends AnyRow, TMeta, TLookups> = (opts?: UseDataOptions) => UseDataResult<TRow, TMeta, TLookups>;
64
+ /**
65
+ * An entity's hooks augmented with the store-level `useData` primitive.
66
+ *
67
+ * `useData` lives here (not on {@link EntityHooks}) because it composes
68
+ * cross-entity `lookups` + per-entity `fields`, which only the store knows.
69
+ *
70
+ * @template TEntity - The entity hooks (inferred per entity)
71
+ * @template TMeta - The per-entity FieldMeta type for this entity
72
+ * @template TLookups - The hydrated lookups shape
73
+ */
74
+ export type EntityWithData<TEntity, TMeta, TLookups> = TEntity & (TEntity extends EntityHooks<infer TRow, any, any> ? {
75
+ useData: UseDataHook<TRow & AnyRow, TMeta, TLookups>;
76
+ } : {
77
+ useData: UseDataHook<AnyRow, TMeta, TLookups>;
78
+ });
31
79
  /**
32
80
  * The store type.
81
+ *
82
+ * Each entity gains `useData` (typed against its `fields[K]` meta, if provided,
83
+ * and the shared lookups type).
84
+ *
85
+ * @template TEntities - Entity hooks map
86
+ * @template TFields - Per-entity FieldMeta record map
87
+ * @template TLookups - Hydrated lookups shape
33
88
  */
34
- export type Store<TEntities extends Record<string, EntityHooks<any, any, any>>> = {
35
- [K in keyof TEntities]: TEntities[K];
89
+ export type Store<TEntities extends Record<string, EntityHooks<any, any, any>>, TFields extends Record<string, any> = Record<string, unknown>, TLookups = unknown> = {
90
+ [K in keyof TEntities]: EntityWithData<TEntities[K], K extends keyof TFields ? TFields[K] : unknown, TLookups>;
36
91
  } & {
37
92
  /** Direct collection access (for advanced use) */
38
93
  collections: Record<string, any>;
39
94
  /** FK resolution */
40
95
  resolve: Resolvers;
41
- /** Lookup maps */
96
+ /** Lookup maps (legacy in-memory helper — distinct from the lookups engine) */
42
97
  lookups: Lookups;
43
98
  };
44
99
  /**
45
100
  * Create a typed store from entity hooks and collections.
46
101
  *
102
+ * Each `store.<entity>` exposes the existing `useList`/`useGet`/mutations plus a
103
+ * unified `useData()` — the data + metadata + pagination + hydration primitive.
104
+ * `useData` composes the entity's own `useList` (pagination/status, reused — not
105
+ * reimplemented) with per-entity `fields` meta and the cross-entity `lookups`
106
+ * engine (hydrated once on mount).
107
+ *
47
108
  * @example
48
109
  * ```typescript
49
110
  * export const store = createStore({
50
- * entities: {
51
- * transactions: transactionHooks,
52
- * categories: categoryHooks,
53
- * },
54
- * collections: {
55
- * transactions: transactionCollection,
56
- * categories: categoryCollection,
57
- * },
111
+ * entities: { people: peopleHooks, messages: messageHooks },
112
+ * collections: { people: peopleCollection, messages: messageCollection },
113
+ * fields: { people: peopleFields, messages: messageFields }, // optional
114
+ * lookups: lookupsEngine, // optional
58
115
  * })
116
+ *
117
+ * // typed: meta is the people FieldMeta record
118
+ * const { rows, meta, lookups, page, setPage } = store.people.useData({ pageSize: 50 })
59
119
  * ```
60
120
  */
61
- export declare function createStore<TEntities extends Record<string, EntityHooks<any, any, any>>>(config: {
121
+ export declare function createStore<TEntities extends Record<string, EntityHooks<any, any, any>>, TFields extends Record<string, any> = Record<string, unknown>, TLookups = unknown>(config: {
62
122
  entities: TEntities;
63
123
  collections: Record<string, any>;
64
- }): Store<TEntities>;
124
+ fields?: TFields;
125
+ lookups?: LookupsEngine<TLookups>;
126
+ }): Store<TEntities, TFields, TLookups>;
127
+ export {};
65
128
  //# sourceMappingURL=createStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createStore.d.ts","sourceRoot":"","sources":["../../src/sync/createStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IAEpD,gCAAgC;IAEhC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,OAAO,GAAG,SAAS,CAAA;CAC7E;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC/C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAA;IAClD,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI;KAE/E,CAAC,IAAI,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;CACrC,GAAG;IACF,kDAAkD;IAElD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAEhC,oBAAoB;IACpB,OAAO,EAAE,SAAS,CAAA;IAElB,kBAAkB;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CACzB,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAC5D,MAAM,EAAE;IACR,QAAQ,EAAE,SAAS,CAAA;IAEnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACjC,GAAG,KAAK,CAAC,SAAS,CAAC,CAmDnB"}
1
+ {"version":3,"file":"createStore.d.ts","sourceRoot":"","sources":["../../src/sync/createStore.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export { createEntityHooks } from './createEntityHooks.js';
2
2
  export { createStore } from './createStore.js';
3
3
  export { EntityStoreProvider, useStore } from './EntityStoreProvider.js';
4
- export type { EntityHookConfig, EntityHooks, EntityApi, EntityQueryKeys, ListParams, WhereClause, UseListOptions, UseGetOptions, UseListResult, UseGetResult, } from './types.js';
5
- export type { StoreConfig, Store, Resolvers, Lookups, LookupMap, } from './createStore.js';
4
+ export type { EntityHookConfig, EntityHooks, EntityApi, EntityQueryKeys, Page, ListQuery, ListParams, WhereClause, UseListOptions, UseGetOptions, UseListResult, UseGetResult, UseDataOptions, UseDataResult, LookupsEngine, SortSpec, } from './types.js';
5
+ export type { StoreConfig, Store, Resolvers, Lookups, LookupMap, EntityWithData, } from './createStore.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAExE,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,eAAe,EACf,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,WAAW,EACX,KAAK,EACL,SAAS,EACT,OAAO,EACP,SAAS,GACV,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAExE,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,eAAe,EACf,IAAI,EACJ,SAAS,EACT,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,QAAQ,GACT,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,WAAW,EACX,KAAK,EACL,SAAS,EACT,OAAO,EACP,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAA"}
@@ -71,9 +71,9 @@ export interface EntityApi<TEntity, TCreate, TUpdate> {
71
71
  /**
72
72
  * Fetch a list of entities with optional filtering/pagination.
73
73
  * @param params - Optional list parameters
74
- * @returns Promise resolving to array of entities
74
+ * @returns Promise resolving to a {@link Page} envelope of entities
75
75
  */
76
- list(params?: ListParams): Promise<TEntity[]>;
76
+ list(params?: ListQuery): Promise<Page<TEntity>>;
77
77
  /**
78
78
  * Fetch a single entity by ID.
79
79
  * @param id - The entity ID
@@ -107,31 +107,86 @@ export interface EntityApi<TEntity, TCreate, TUpdate> {
107
107
  }>;
108
108
  }
109
109
  /**
110
- * Common list parameters for API queries.
110
+ * Pagination request parameters sent to `api.list`.
111
+ *
112
+ * This is the request half of the pagination contract. The generated API
113
+ * client serializes these into the list endpoint's querystring; the backend
114
+ * returns a {@link Page} envelope. Engine is page-based (OFFSET) in v1, but
115
+ * `cursor` is part of the contract from day one (the keyset request-honoring
116
+ * upgrade is a deferred, seam-internal change — passing a cursor is accepted).
117
+ *
118
+ * Arbitrary additional keys are treated as `where` filters (pagination is
119
+ * orthogonal to filtering).
111
120
  *
112
121
  * @example
113
122
  * ```typescript
114
- * const params: ListParams = {
115
- * skip: 0,
116
- * limit: 20,
123
+ * const query: ListQuery = {
124
+ * page: 2,
125
+ * pageSize: 50,
117
126
  * sort_by: 'created_at',
118
127
  * sort_order: 'desc',
119
- * status: 'active', // Additional filter
128
+ * status: 'active', // Additional where filter
120
129
  * }
121
130
  * ```
122
131
  */
123
- export interface ListParams {
124
- /** Number of items to skip (for pagination) */
125
- skip?: number;
126
- /** Maximum number of items to return */
127
- limit?: number;
132
+ export interface ListQuery {
133
+ /** 1-based page number to fetch (default: 1) */
134
+ page?: number;
135
+ /** Opaque keyset cursor (contract-stable; v1 OFFSET engine ignores it for fetching) */
136
+ cursor?: string;
137
+ /** Page size — number of items per page (default: 50, clamped server-side) */
138
+ pageSize?: number;
128
139
  /** Field to sort by */
129
140
  sort_by?: string;
130
141
  /** Sort direction */
131
142
  sort_order?: 'asc' | 'desc';
132
- /** Additional filter parameters */
143
+ /** Additional filter parameters (where clause) */
133
144
  [key: string]: unknown;
134
145
  }
146
+ /**
147
+ * Pagination response envelope returned by `api.list`.
148
+ *
149
+ * This is the response half of the pagination contract — the shape every
150
+ * codegen-generated list endpoint returns. Extends the proven
151
+ * `{ items, nextCursor }` keyset shape (jobs subsystem `JobRunPage`,
152
+ * observability) with `total`/`page`/`pageCount`/`pageSize` for numbered,
153
+ * jump-to-page UIs.
154
+ *
155
+ * @template T - The entity type
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * const page: Page<Transaction> = {
160
+ * items: [...],
161
+ * page: 1,
162
+ * pageCount: 4,
163
+ * total: 187,
164
+ * pageSize: 50,
165
+ * nextCursor: 'eyJjcmVhdGVkQXQiOiIuLi4ifQ==',
166
+ * }
167
+ * ```
168
+ */
169
+ export interface Page<T> {
170
+ /** The rows for the current page */
171
+ items: T[];
172
+ /** 1-based number of the current page */
173
+ page: number;
174
+ /** Total number of pages for the (filtered) set */
175
+ pageCount: number;
176
+ /** Total number of rows in the (filtered) set, across all pages */
177
+ total: number;
178
+ /** Number of items per page */
179
+ pageSize: number;
180
+ /** Opaque cursor for the next page; null on the last page */
181
+ nextCursor: string | null;
182
+ }
183
+ /**
184
+ * Common list parameters for API queries.
185
+ *
186
+ * @deprecated Use {@link ListQuery} instead — `skip`/`limit` were never honored
187
+ * by `useList`. Retained as an alias for source compatibility; will be removed.
188
+ */
189
+ export type ListParams = ListQuery;
135
190
  /**
136
191
  * Type-safe filter where value types match field types.
137
192
  *
@@ -162,23 +217,28 @@ export type WhereClause<TEntity> = {
162
217
  * const options: UseListOptions<Transaction> = {
163
218
  * where: { state: 'active' },
164
219
  * orderBy: { field: 'created_at', direction: 'desc' },
165
- * skip: 0,
166
- * limit: 20,
220
+ * page: 2,
221
+ * pageSize: 50,
167
222
  * }
168
223
  * ```
169
224
  */
170
225
  export interface UseListOptions<TEntity> {
171
- /** Filter criteria - applied client-side to collection */
226
+ /** Filter criteria - sent to the server AND applied client-side to the page */
172
227
  where?: WhereClause<TEntity>;
173
228
  /** Sort configuration */
174
229
  orderBy?: {
175
230
  field: keyof TEntity;
176
231
  direction: 'asc' | 'desc';
177
232
  };
178
- /** Number of items to skip (for pagination) */
179
- skip?: number;
180
- /** Maximum number of items to return */
181
- limit?: number;
233
+ /**
234
+ * Initial 1-based page to fetch (default: 1). `useList` owns the live page
235
+ * state thereafter use the returned `setPage`/`next`/`prev` to navigate.
236
+ */
237
+ page?: number;
238
+ /** Opaque keyset cursor (contract-stable; v1 OFFSET engine ignores it for fetching) */
239
+ cursor?: string;
240
+ /** Page size — number of items per page (default: server default, typically 50) */
241
+ pageSize?: number;
182
242
  /** Enable hook (default: true) */
183
243
  enabled?: boolean;
184
244
  }
@@ -203,16 +263,25 @@ export interface UseGetOptions {
203
263
  *
204
264
  * @example
205
265
  * ```typescript
206
- * const { data, isLoading, error, refetch, collection } = useTransactionList()
266
+ * const {
267
+ * data, isLoading, error, refetch, collection,
268
+ * page, pageCount, total, pageSize,
269
+ * setPage, next, prev, hasNext, hasPrev,
270
+ * } = useTransactionList({ pageSize: 50 })
207
271
  *
208
272
  * if (isLoading) return <Spinner />
209
273
  * if (error) return <Error message={error.message} />
210
274
  *
211
- * return <DataTable data={data} />
275
+ * return (
276
+ * <>
277
+ * <DataTable data={data} />
278
+ * <Pagination page={page} pageCount={pageCount} onPageChange={setPage} />
279
+ * </>
280
+ * )
212
281
  * ```
213
282
  */
214
283
  export interface UseListResult<TEntity extends object> {
215
- /** Array of entities (empty array if loading or error) */
284
+ /** The current page's entities (empty array if loading or error) */
216
285
  data: TEntity[];
217
286
  /** True while initial data is loading */
218
287
  isLoading: boolean;
@@ -224,6 +293,24 @@ export interface UseListResult<TEntity extends object> {
224
293
  refetch: () => void;
225
294
  /** Direct collection access for mutations */
226
295
  collection: Collection<TEntity, string>;
296
+ /** 1-based number of the current page */
297
+ page: number;
298
+ /** Total number of pages for the (filtered) set */
299
+ pageCount: number;
300
+ /** Total number of rows in the (filtered) set, across all pages */
301
+ total: number;
302
+ /** Number of items per page */
303
+ pageSize: number;
304
+ /** Jump to a specific 1-based page (clamped to [1, pageCount]) and refetch */
305
+ setPage: (page: number) => void;
306
+ /** Advance to the next page (no-op when on the last page) */
307
+ next: () => void;
308
+ /** Go back to the previous page (no-op when on the first page) */
309
+ prev: () => void;
310
+ /** True when a next page exists (page < pageCount) */
311
+ hasNext: boolean;
312
+ /** True when a previous page exists (page > 1) */
313
+ hasPrev: boolean;
227
314
  }
228
315
  /**
229
316
  * Result type for single entity hooks.
@@ -255,6 +342,112 @@ export interface UseGetResult<TEntity extends object> {
255
342
  /** Direct collection access for mutations */
256
343
  collection: Collection<TEntity, string>;
257
344
  }
345
+ /**
346
+ * Cross-entity lookups engine consumed by the unified `useData` hook.
347
+ *
348
+ * Hydrates the FK-resolution sets used to render related entities (e.g. a
349
+ * message's author). Generated/consumer code provides the implementation; the
350
+ * sync layer treats `TLookups` generically (it never inspects the shape).
351
+ *
352
+ * Contract (matches codegen's emitted `createStore({ lookups })`):
353
+ * - `hydrate()` is called ONCE on mount of the first `useData` that needs it
354
+ * (idempotent — callers may invoke it repeatedly; the engine should dedupe).
355
+ * - `current` is the hydrated value, or `null` until hydration resolves.
356
+ *
357
+ * @template TLookups - The hydrated lookups shape (consumer/codegen-owned)
358
+ *
359
+ * @example
360
+ * ```typescript
361
+ * const lookups: LookupsEngine<MyLookups> = {
362
+ * hydrate: async () => { ... }, // fetch + cache, idempotent
363
+ * get current() { return cache }, // null until ready
364
+ * }
365
+ * ```
366
+ */
367
+ export interface LookupsEngine<TLookups = unknown> {
368
+ /** Hydrate the lookup sets once; resolves when ready. Should be idempotent. */
369
+ hydrate: () => Promise<TLookups>;
370
+ /** The hydrated lookups, or null until hydration resolves. */
371
+ readonly current: TLookups | null;
372
+ }
373
+ /**
374
+ * Result type for the unified `useData` hook.
375
+ *
376
+ * Composes the pagination + status surface of {@link UseListResult} (reused,
377
+ * not reimplemented) with entity FieldMeta (`meta`), hydrated cross-entity
378
+ * `lookups`, a stable `getRowId`, and reserved (inert, typed-not-wired) sort /
379
+ * filter slots for a future upgrade.
380
+ *
381
+ * @template TRow - The entity row type
382
+ * @template TMeta - The per-entity FieldMeta record (consumer/codegen-owned)
383
+ * @template TLookups - The hydrated lookups shape (consumer/codegen-owned)
384
+ *
385
+ * @example
386
+ * ```typescript
387
+ * const { rows, meta, lookups, page, setPage, total } =
388
+ * store.people.useData({ pageSize: 50 })
389
+ * ```
390
+ */
391
+ export interface UseDataResult<TRow extends object, TMeta = unknown, TLookups = unknown> {
392
+ /** The current page's rows */
393
+ rows: TRow[];
394
+ /** True while initial data is loading */
395
+ isLoading: boolean;
396
+ /** True if an error occurred */
397
+ isError: boolean;
398
+ /** Error object if an error occurred, null otherwise */
399
+ error: Error | null;
400
+ /** Function to manually refetch data */
401
+ refetch: () => void;
402
+ /** 1-based number of the current page */
403
+ page: number;
404
+ /** Total number of pages for the (filtered) set */
405
+ pageCount: number;
406
+ /** Total number of rows in the (filtered) set, across all pages */
407
+ total: number;
408
+ /** Number of items per page */
409
+ pageSize: number;
410
+ /** Jump to a specific 1-based page (clamped) and refetch */
411
+ setPage: (page: number) => void;
412
+ /** Advance to the next page (no-op on the last page) */
413
+ next: () => void;
414
+ /** Go back to the previous page (no-op on the first page) */
415
+ prev: () => void;
416
+ /** True when a next page exists */
417
+ hasNext: boolean;
418
+ /** True when a previous page exists */
419
+ hasPrev: boolean;
420
+ /** Stable row-id accessor (default: `(row) => row.id`) */
421
+ getRowId: (row: TRow) => string;
422
+ /** Per-entity FieldMeta record (from `createStore({ fields })`); undefined if not provided */
423
+ meta: TMeta | undefined;
424
+ /** Hydrated cross-entity lookups (from `createStore({ lookups })`); null until ready / if not provided */
425
+ lookups: TLookups | null;
426
+ /** RESERVED — current sort spec (always null in v1) */
427
+ sort: SortSpec<TRow> | null;
428
+ /** RESERVED — set the sort spec (no-op in v1) */
429
+ setSort: (sort: SortSpec<TRow> | null) => void;
430
+ /** RESERVED — current filter spec (always null in v1) */
431
+ filter: WhereClause<TRow> | null;
432
+ /** RESERVED — set the filter spec (no-op in v1) */
433
+ setFilter: (filter: WhereClause<TRow> | null) => void;
434
+ }
435
+ /**
436
+ * Sort specification for the reserved `useData` sort slot.
437
+ *
438
+ * @template TRow - The entity row type
439
+ */
440
+ export interface SortSpec<TRow> {
441
+ field: keyof TRow;
442
+ direction: 'asc' | 'desc';
443
+ }
444
+ /**
445
+ * Options for the unified `useData` hook.
446
+ */
447
+ export interface UseDataOptions {
448
+ /** Page size — number of items per page (default: server default, typically 50) */
449
+ pageSize?: number;
450
+ }
258
451
  /**
259
452
  * Query key factory for cache management.
260
453
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,gBAAgB,CAC/B,OAAO,SAAS,MAAM,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC/C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAC1B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAE1B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;IAEZ;;;;OAIG;IAEH,UAAU,EAAE,GAAG,CAAA;IAEf,yBAAyB;IACzB,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAEzC;;;;;OAKG;IACH,UAAU,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAA;IAErC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO;IAClD;;;;OAIG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAEhD;;;;OAIG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEjC;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAE3D;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEvE;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACtD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,SAAS;IACxB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qBAAqB;IACrB,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IAC3B,kDAAkD;IAClD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,oCAAoC;IACpC,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,CAAA;AAElC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,IAAI;KAChC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE;CACjD,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO;IACrC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5B,yBAAyB;IACzB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,OAAO,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAA;IAC7D;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,MAAM;IACnD,oEAAoE;IACpE,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,wDAAwD;IACxD,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,6CAA6C;IAC7C,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAGvC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAGhB,8EAA8E;IAC9E,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,kEAAkE;IAClE,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAA;IAChB,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,MAAM;IAClD,+CAA+C;IAC/C,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,wDAAwD;IACxD,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,6CAA6C;IAC7C,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;CACxC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,GAAG,OAAO;IAC/C,+EAA+E;IAC/E,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAA;CAClC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,aAAa,CAC5B,IAAI,SAAS,MAAM,EACnB,KAAK,GAAG,OAAO,EACf,QAAQ,GAAG,OAAO;IAGlB,8BAA8B;IAC9B,IAAI,EAAE,IAAI,EAAE,CAAA;IACZ,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,wDAAwD;IACxD,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAA;IAGnB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,wDAAwD;IACxD,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAA;IAGhB,0DAA0D;IAC1D,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAA;IAG/B,8FAA8F;IAC9F,IAAI,EAAE,KAAK,GAAG,SAAS,CAAA;IACvB,0GAA0G;IAC1G,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAA;IAGxB,uDAAuD;IACvD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC3B,iDAAiD;IACjD,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;IAC9C,yDAAyD;IACzD,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAChC,mDAAmD;IACnD,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CACtD;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ,CAAC,IAAI;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,GAAG,EAAE,SAAS,MAAM,EAAE,CAAA;IACtB,uCAAuC;IACvC,KAAK,EAAE,MAAM,SAAS,MAAM,EAAE,CAAA;IAC9B,4DAA4D;IAC5D,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,OAAO,EAAE,CAAA;IAC9D,yCAAyC;IACzC,OAAO,EAAE,MAAM,SAAS,MAAM,EAAE,CAAA;IAChC,8CAA8C;IAC9C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,SAAS,OAAO,EAAE,CAAA;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,WAAW,WAAW,CAC1B,OAAO,SAAS,MAAM,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC/C,OAAO,EACP,OAAO;IAEP;;;OAGG;IACH,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,CAAA;IAEtE;;;OAGG;IACH,MAAM,EAAE,CACN,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,OAAO,CAAC,EAAE,aAAa,KACpB,YAAY,CAAC,OAAO,CAAC,CAAA;IAE1B;;;;;OAKG;IACH,SAAS,EAAE,MAAM,iBAAiB,CAChC,OAAO,EACP,KAAK,EACL,OAAO,EACP;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAC7C,CAAA;IAED;;;;;OAKG;IACH,SAAS,EAAE,MAAM,iBAAiB,CAChC,OAAO,EACP,KAAK,EACL;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAC7B;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAChD,CAAA;IAED;;;;;OAKG;IACH,SAAS,EAAE,MAAM,iBAAiB,CAChC,IAAI,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EACxB,KAAK,EACL,MAAM,EACN;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAChD,CAAA;IAED;;;;OAIG;IAEH,UAAU,EAAE,GAAG,CAAA;IAEf,iDAAiD;IACjD,IAAI,EAAE,eAAe,CAAA;CACtB"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@pattern-stack/frontend-patterns",
3
3
  "description": "Production-ready React frontend template with atomic architecture patterns. Build ultra-lean applications by importing shared UI foundation patterns.",
4
4
  "private": false,
5
- "version": "0.2.0-alpha.18",
5
+ "version": "0.2.0-alpha.20",
6
6
  "keywords": [
7
7
  "react",
8
8
  "typescript",
@@ -61,6 +61,7 @@
61
61
  "clean:temp": "rm -rf .playwright-mcp coverage .vite .turbo && find . -name '*.tgz' -delete && find . -name '.DS_Store' -delete",
62
62
  "lint": "eslint .",
63
63
  "lint:fix": "eslint . --fix",
64
+ "lint:tokens": "node scripts/check-design-tokens.mjs",
64
65
  "lint:design-system": "eslint . --ext .tsx,.ts --config eslint.config.js",
65
66
  "style:check": "npm run lint:design-system",
66
67
  "style:fix": "npm run lint:fix && npm run style:check",