@object-ui/plugin-designer 17.3.0 → 17.6.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,542 @@
1
1
  # @object-ui/plugin-designer
2
2
 
3
+ ## 17.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - deb157a: Retire the field designer's `Indexed` toggle — the ObjectStack spec has no
8
+ field-level index flag
9
+
10
+ `indexed` was never a `FieldSchema` key. The field-level flag built no index
11
+ (objectstack#2377 removed it) and, since objectstack#4001 replaced silent
12
+ drops with loud rejection, `FieldSchema.safeParse` refuses it by name. Ticking
13
+ `Indexed` in Studio therefore made `PUT /api/v1/meta/object/:name` fail with
14
+ `422 INVALID_METADATA`, and — because the key was stored — every later save of
15
+ that object stayed blocked until the author found and cleared the toggle.
16
+
17
+ Both field designers stop offering the control and stop authoring the key
18
+ (`ObjectFieldInspector`'s Advanced section; `FieldDesigner`'s advanced
19
+ section, `MetadataFieldsPage`, `MetadataService`, `metadataConverters`), the
20
+ `designer.field.indexed` / `appDesigner.fieldDesigner.indexed` labels retire
21
+ with it across all ten locale packs, and `DesignerFieldDefinition.indexed` is
22
+ removed from `@object-ui/types`.
23
+
24
+ Drafts and objects that already carry the key are un-poisoned on load rather
25
+ than migrated, so an edit-and-save round-trip of previously blocked metadata
26
+ now succeeds. The strip is keyed to the retired key alone — every other
27
+ unknown key on a field definition still survives the round-trip.
28
+
29
+ Declare indexes on the object instead: `indexes: [{ name, fields, unique }]`.
30
+
31
+ ### Patch Changes
32
+
33
+ - ad07b65: Four packages stop publishing tooling material in their `dist/`
34
+
35
+ Each of these packages spelled its build exclusions as `*.test.*`, while this repo's tooling convention is a directory one — `__tests__` / `__mocks__` / `__benchmarks__`, exactly as `TOOLING_FILE` in `scripts/check-phantom-dependencies.mjs` spells it. Any tooling file whose *name* is not `*.test.*` therefore stayed in the emit program and shipped in the tarball. This is the same shape and the same cause as objectui#4006, which fixed `@object-ui/fields` and `@object-ui/plugin-editor` by the filename criterion and so did not reach these four.
36
+
37
+ Measured by building each package from a cleared `dist/` on both sides of the change. Nine files disappear, none appears, and every surviving file is untouched — the totals move by exactly the count removed:
38
+
39
+ | package | `dist/` files | removed |
40
+ | --- | --- | --- |
41
+ | `@object-ui/core` | 176 to 174 | `dist/__benchmarks__/core.bench.js`, `core.bench.d.ts` |
42
+ | `@object-ui/plugin-designer` | 70 to 66 | `dist/__tests__/__mocks__/plugin-form.d.ts`, `plugin-grid.d.ts`, and both `.d.ts.map` |
43
+ | `@object-ui/plugin-grid` | 62 to 60 | `dist/__tests__/explainDouble.d.ts` and its `.d.ts.map` |
44
+ | `@object-ui/plugin-view` | 13 to 12 | `dist/__tests__/explainDouble.d.ts` |
45
+
46
+ Only `@object-ui/core`'s had runtime weight. The other eight are declarations nothing resolves, but `core.bench.js` is a real emitted module whose first import is `import { bench, describe } from 'vitest'` — a runtime import of a package a consumer never installs, since `vitest` is a devDependency of `@object-ui/core` and devDependencies are not installed transitively. Nothing resolves it today either (it is not in the `exports` map), so no consumer breaks in either direction; this is the tarball shedding files nothing reached.
47
+
48
+ No type coverage leaves with the emit. The three plugins' helper and mock files are already program inputs of the `tsconfig.test.json` that each package's `type-check` chains, reached through the imports in the suites beside them — `tsc --listFiles` names all four files on both sides of the change. `core.bench.ts` had no such edge, since nothing imports a benchmark, so it is now named explicitly in `packages/core/tsconfig.test.json`. That move was deliberate rather than forced: `scripts/check-type-check-coverage.mjs` enumerates `*.test.ts(x)` only, so a benchmark that no program reads is invisible to it, and dropping the coverage silently would have been the "coverage that was right by accident" objectui#4006 recorded. Verified by appending a provably-false annotation to the benchmark, which turns `tsc -p packages/core/tsconfig.test.json` red at exit 2.
49
+ - Updated dependencies [88085e3]
50
+ - Updated dependencies [69251bf]
51
+ - Updated dependencies [57e668f]
52
+ - Updated dependencies [516663d]
53
+ - Updated dependencies [41ac1b7]
54
+ - Updated dependencies [1eaf0a1]
55
+ - Updated dependencies [a09bc33]
56
+ - Updated dependencies [feb6b16]
57
+ - Updated dependencies [460c4d0]
58
+ - Updated dependencies [0ae27f7]
59
+ - Updated dependencies [9aecabe]
60
+ - Updated dependencies [2533ec5]
61
+ - Updated dependencies [78c0f9a]
62
+ - Updated dependencies [bbe8b86]
63
+ - Updated dependencies [8477be5]
64
+ - Updated dependencies [279fb13]
65
+ - Updated dependencies [2e82ab2]
66
+ - Updated dependencies [ad07b65]
67
+ - Updated dependencies [41f498b]
68
+ - Updated dependencies [ef0d150]
69
+ - Updated dependencies [1ef236e]
70
+ - Updated dependencies [f34226e]
71
+ - Updated dependencies [564b605]
72
+ - Updated dependencies [e1d4251]
73
+ - Updated dependencies [40d3a33]
74
+ - Updated dependencies [9b20dea]
75
+ - Updated dependencies [469b604]
76
+ - Updated dependencies [8b9dc62]
77
+ - Updated dependencies [d7be3bd]
78
+ - Updated dependencies [a954b48]
79
+ - Updated dependencies [bda9b12]
80
+ - Updated dependencies [e354dd0]
81
+ - Updated dependencies [1184192]
82
+ - Updated dependencies [a2a9747]
83
+ - Updated dependencies [65e88e6]
84
+ - Updated dependencies [a1609a6]
85
+ - Updated dependencies [53f23bc]
86
+ - Updated dependencies [c4533dc]
87
+ - Updated dependencies [be60815]
88
+ - Updated dependencies [37f6844]
89
+ - Updated dependencies [93de4f6]
90
+ - Updated dependencies [2b50261]
91
+ - Updated dependencies [384f30d]
92
+ - Updated dependencies [ac600e5]
93
+ - Updated dependencies [97fba31]
94
+ - Updated dependencies [232f61a]
95
+ - Updated dependencies [f68018d]
96
+ - Updated dependencies [d374caf]
97
+ - Updated dependencies [5673576]
98
+ - Updated dependencies [c1ef923]
99
+ - Updated dependencies [911ceaa]
100
+ - Updated dependencies [98eab36]
101
+ - Updated dependencies [375efb4]
102
+ - Updated dependencies [af5e292]
103
+ - Updated dependencies [3fbbea1]
104
+ - Updated dependencies [0bffb18]
105
+ - Updated dependencies [3e0214c]
106
+ - Updated dependencies [800f455]
107
+ - Updated dependencies [dbbd38a]
108
+ - Updated dependencies [27c9cbd]
109
+ - Updated dependencies [5458414]
110
+ - Updated dependencies [3241559]
111
+ - Updated dependencies [7f96b10]
112
+ - Updated dependencies [167ec42]
113
+ - Updated dependencies [cf4f8a6]
114
+ - Updated dependencies [616a2a5]
115
+ - Updated dependencies [6c68b13]
116
+ - Updated dependencies [0046d8f]
117
+ - Updated dependencies [3b03704]
118
+ - Updated dependencies [f1d4748]
119
+ - Updated dependencies [bea374e]
120
+ - Updated dependencies [b1119ec]
121
+ - Updated dependencies [5607092]
122
+ - Updated dependencies [9f23d2b]
123
+ - Updated dependencies [b4089be]
124
+ - Updated dependencies [578e025]
125
+ - Updated dependencies [b4bccc7]
126
+ - Updated dependencies [af025ee]
127
+ - Updated dependencies [d109a4d]
128
+ - Updated dependencies [3d053bb]
129
+ - Updated dependencies [598c89a]
130
+ - Updated dependencies [4a0bd17]
131
+ - Updated dependencies [b8b9af4]
132
+ - Updated dependencies [31676be]
133
+ - Updated dependencies [958d757]
134
+ - Updated dependencies [8c0d52e]
135
+ - Updated dependencies [bfb64ee]
136
+ - Updated dependencies [e09f9e8]
137
+ - Updated dependencies [03e5f97]
138
+ - Updated dependencies [ae804ec]
139
+ - Updated dependencies [b29488f]
140
+ - Updated dependencies [9fbb9b5]
141
+ - Updated dependencies [90517e1]
142
+ - Updated dependencies [aff10e2]
143
+ - Updated dependencies [70a774b]
144
+ - Updated dependencies [9ce096f]
145
+ - Updated dependencies [e05db88]
146
+ - Updated dependencies [7458a41]
147
+ - Updated dependencies [ad13d63]
148
+ - Updated dependencies [5ffcc14]
149
+ - Updated dependencies [d971e51]
150
+ - Updated dependencies [97abb24]
151
+ - Updated dependencies [deb157a]
152
+ - Updated dependencies [9c60144]
153
+ - Updated dependencies [e7747f1]
154
+ - Updated dependencies [d2ce342]
155
+ - Updated dependencies [a8411ad]
156
+ - Updated dependencies [9695da7]
157
+ - Updated dependencies [ac2f332]
158
+ - Updated dependencies [a777058]
159
+ - Updated dependencies [75444e3]
160
+ - Updated dependencies [58b8346]
161
+ - Updated dependencies [2d0bd16]
162
+ - Updated dependencies [a9e17b4]
163
+ - Updated dependencies [b8ce7dc]
164
+ - Updated dependencies [dad51e5]
165
+ - Updated dependencies [1c9c342]
166
+ - Updated dependencies [787c738]
167
+ - Updated dependencies [8396656]
168
+ - Updated dependencies [dbbd38a]
169
+ - Updated dependencies [2165d88]
170
+ - Updated dependencies [8871c14]
171
+ - Updated dependencies [93fe362]
172
+ - Updated dependencies [dfc6975]
173
+ - Updated dependencies [3cf4de0]
174
+ - Updated dependencies [c9dc811]
175
+ - Updated dependencies [144ef9b]
176
+ - Updated dependencies [138ab04]
177
+ - Updated dependencies [d871f8e]
178
+ - Updated dependencies [a0b9e91]
179
+ - Updated dependencies [99bd015]
180
+ - Updated dependencies [21e4585]
181
+ - @object-ui/types@17.6.0
182
+ - @object-ui/fields@17.6.0
183
+ - @object-ui/i18n@17.6.0
184
+ - @object-ui/react@17.6.0
185
+ - @object-ui/plugin-grid@17.6.0
186
+ - @object-ui/components@17.6.0
187
+ - @object-ui/core@17.6.0
188
+ - @object-ui/data-objectstack@17.6.0
189
+ - @object-ui/plugin-form@17.6.0
190
+
191
+ ## 17.5.0
192
+
193
+ ### Patch Changes
194
+
195
+ - d0c3b26: Every plain `<button>` now declares its `type`. HTML defaults an untyped button to
196
+ `type="submit"`, so any of these buttons would submit the form it was composed into
197
+ instead of running its own handler — a real risk for renderers (`drawer`, `tree-view`,
198
+ `navigation-overlay`) whose placement inside a form is a JSON metadata decision. 114
199
+ sites were converted to `type="button"`; no site was a genuine submit button, and the
200
+ DOM is otherwise unchanged.
201
+
202
+ The defect class is now closed mechanically by a new `object-ui/button-has-type` ESLint
203
+ rule (error), so the next untyped button fails CI at write time rather than being found
204
+ by a fourth audit round (objectui#4045, closing the objectui#3344 family).
205
+
206
+ - abb0f81: A dashboard date filter's default has one spelling again — the bare preset name — and the `{ preset }` object becomes a documented legacy alias with a retirement window
207
+
208
+ `@objectstack/spec` 17.0.0-rc.6 added a cross-field refinement to `GlobalFilterSchema` holding a `type: 'date'` filter's `defaultValue` to three spellings: a preset NAME (`last_7_days`), an ISO date (`2026-01-15`), or a date-macro token (`{today}`). objectui's derived schema had widened `defaultValue` to `z.any()` and did not carry the refinement, so it accepted `{ preset: 'last_7_days' }` — metadata the platform refuses. That is the tolerant-consumer shape where the designer goes green and the save fails server-side, and it is now closed: the refinement is adopted, the widening is retired, and the object form is refused with the spec's own message.
209
+
210
+ Per the maintainer ruling on objectui#4165, the spec stays strict and the bare preset name is the single canonical spelling. `{ preset }` is handled as an ADR-0089 legacy alias rather than by a permanently tolerant schema: `liftLegacyGlobalFilterDefault` / `liftLegacyDashboardFilterDefaults` (new exports on `@object-ui/types`) convert it to the bare name, `@object-ui/core`'s `resolveDashboardFilterDefs` applies the lift when it reads a stored dashboard, and the console's dashboard designer applies it as the document enters the editable draft so the next save persists the canonical spelling. The retirement window is recorded at the read site: the alias may be removed in `@object-ui/types` 18.0.0, and every lift warns on the console so a surviving legacy document is visible rather than silently tolerated.
211
+
212
+ No stored dashboard has to change for this release. The lift means a document carrying the object form keeps loading and rendering exactly as before — measured, not assumed: a legacy declaration already resolved correctly, because `{ preset }` also happens to be the runtime value shape objectui's own date filters use, and that coincidence is why the object form went unnoticed for so long. What changes is that the declaration is now canonicalized on read and rewritten on save, so the two spellings converge instead of accreting.
213
+
214
+ The other two divergences in this schema — the bare-string `options` shorthand and the optional `optionsFrom.labelField` — are unaffected. Carrying the spec's refinement while keeping them needed a new composition: a refined object schema in zod 4 rejects `.extend()` and `.omit()` outright and types every `.safeExtend()` override as `never`, so objectui's schema now spreads the spec's shape and re-attaches the spec's object-level rules by delegating to the spec schema itself. Nothing restates the spec's grammar, and a refinement the spec adds later flows in with no change here.
215
+
216
+ - bb68488: An inline per-locale label now renders its locale's string at the thirteen read sites the `@objectstack/spec` 17.0.0-rc.6 bump exposed
217
+
218
+ rc.6 widened `I18nLabel` from `string` to `string | Record<string, string>`, so an author may write `label: { en: 'Owner', 'zh-CN': '负责人' }` anywhere the spec accepts a display label. PR #4169 repaired eight such sites; these thirteen were invisible to it because the five packages involved build through vite/rolldown, so `turbo run build` never type-checks their sources — only `turbo run type-check` does. All thirteen are now resolved through a shared resolver against a real locale, and `turbo run type-check` is 78/78 with zero errors.
219
+
220
+ | package | what an author can now write and see |
221
+ | ----------------------------- | --------------------------------------------------------------------------------------- |
222
+ | `@object-ui/layout` | `NavigationArea.label` — the sidebar area switcher's button and its tooltip |
223
+ | `@object-ui/plugin-list` | `ViewTab.label` — the inline pill row, and the mobile dropdown's trigger and menu items |
224
+ | `@object-ui/plugin-dashboard` | `DashboardWidget.title` — the widget card heading and its `title` attribute |
225
+ | `@object-ui/plugin-designer` | `DashboardWidget.title` — the widget card and the preview tile |
226
+ | `@object-ui/app-shell` | `ActionParam.label` **and** each `ActionParam.options[].label` |
227
+
228
+ **Patch, not minor, in every case: no public surface changes meaning.** Every entry above is a read site that previously could only be reached with a value the type system rejected, so no caller's working code changes behaviour. `@object-ui/app-shell` is the only package with an exported-type change and it is purely additive on the authoring side — `RawActionParam.label` and `RawActionParam.options[].label` widen to `I18nLabel` (they accept strictly more), `ResolveActionParamsContext` gains an optional `locale`, and the new `RawActionParamOption` names the authoring shape that was previously spelled with the resolved one. What `resolveActionParams` **emits** is unchanged: `ActionParamDef.label` and its options' labels are still plain `string`s.
229
+
230
+ Two consequences worth knowing:
231
+
232
+ - **The dashboard designer's title input is deliberately read-only for a map-valued title.** Resolving a per-locale map into a single-line input and writing `e.target.value` back would collapse every other locale on the first keystroke, so the write is guarded and an inline map survives an unrelated edit-and-save round trip untouched — the same conservative branch #4169 took for `DashboardWidgetInspector`. What Studio should actually offer for authoring a per-locale label is objectui#4163 part 2, which is unclaimed and pending design.
233
+ - **`@object-ui/layout` resolves at the spec's `en` default, not the viewer's language.** That package carries no i18n dependency by design (its whole i18n story is injection), and `AppSchemaRendererProps` exposes no locale to thread. The choice and what would change it are documented at the call site.
234
+
235
+ - e076fd5: Inline-edit toggle reads "Edit fields" without an I18nProvider, matching every locale pack
236
+
237
+ `DETAIL_DEFAULT_TRANSLATIONS` said `Edit fields inline` where all ten packs say
238
+ `Edit fields`, so `InlineEditSaveBar`'s toggle announced two different names for one
239
+ control — the map's on provider-less hosts (standalone embeds, the preview gallery),
240
+ the pack's in the console. The pack wins; the map row now mirrors it byte for byte.
241
+
242
+ The three ungated defaults maps (`plugin-detail`, `plugin-list`, `plugin-designer`) are
243
+ now compared key-by-key against the `en` pack by a new gate, generalizing the
244
+ collaboration-only precedent from objectui#3440. `LIST_DEFAULT_TRANSLATIONS` and
245
+ `DESIGNER_DEFAULT_TRANSLATIONS` are exported for it, as `DETAIL_DEFAULT_TRANSLATIONS`
246
+ and `COLLAB_DEFAULT_TRANSLATIONS` already were.
247
+
248
+ - dad805d: Six i18n keys no longer render as raw key strings on hosts with no `I18nProvider` (objectui#4396)
249
+
250
+ `detail.saving`, `list.resetSortToDefault`, `appDesigner.widgetProperties`, `appDesigner.addWidget`, `appDesigner.modeEdit` and `common.delete` were read through `createSafeTranslation` without a row in their hook's defaults table and without an inline `defaultValue` at the call site — the only two fallbacks that path has. On a provider-less host (standalone embedding, the preview gallery, host apps that never mount a provider) `fallbackT` therefore returned the key itself, so users saw `detail.saving` in the inline-edit save button, `list.resetSortToDefault` on the sort popover's reset control, `appDesigner.widgetProperties` as the dashboard inspector heading, `appDesigner.addWidget` as its toolbar label, `appDesigner.modeEdit` as a button's accessible name, and `common.delete` on the designer's destructive confirm.
251
+
252
+ Each key now has a row in its consumer hook's defaults table, byte-identical to the `en` pack value. No pack was edited, no key added, no call site changed.
253
+
254
+ - bb68488: Stop declaring 14 symbols under names `@objectstack/spec` owns at `17.0.0-rc.6`
255
+ (objectui#4167, objectstack#4115).
256
+
257
+ The rc.6 bump published nine names this repo already declared locally, on top of
258
+ four that predate it — `check:spec-symbols` reported all thirteen at once, and a
259
+ fourteenth (`GlobalFilterSchema`) appeared during the bump itself. Each was
260
+ triaged on its own rather than blanket-renamed, because the right answer differs
261
+ per symbol: five bind to the spec, three are renamed because the spec's
262
+ same-named export means something else, five arrive by derivation, and one is a
263
+ declared dialect with a written reason.
264
+
265
+ **Breaking for importers of `@object-ui/react`, `@object-ui/app-shell` and
266
+ `@object-ui/types`** — three exported names changed, because the spec exports the
267
+ same name for a _different_ thing:
268
+
269
+ | package | was | now | what the spec's same-named export actually is |
270
+ | :-------------------- | :----------------- | :----------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
271
+ | `react` / `app-shell` | `MetadataState` | `MetadataCacheState` | a metadata item's LIFECYCLE state — `'draft' \| 'active' \| 'deprecated' \| 'archived'` (`MetadataStateSchema`, `@objectstack/spec/system`) |
272
+ | `react` / `app-shell` | `resolveI18nLabel` | `resolveKeyedI18nLabel` | a resolver for the INLINE per-locale map (`{ en: 'Owner', 'zh-CN': '负责人' }`) against a BCP-47 locale |
273
+ | `types` | `DateRangePreset` | `FilterBuilderDateRangePreset` | the thirteen HISTORICAL dashboard filter-bar presets; this one is the filter-builder set, which adds eight FUTURE windows the dashboard schema rejects |
274
+
275
+ `resolveI18nLabel` is the one where the collision had already started costing
276
+ something. rc.6 widened `I18nLabel` from `string` to
277
+ `string | Record< string, string >`, so the same authored value now reaches
278
+ either resolver — and each answers wrongly, silently, for the other's input: the
279
+ keyed one returns `undefined` for `{ en: 'Owner' }` (no `key`, no
280
+ `defaultValue`), and the spec's reads `key` / `defaultValue` / `params` as locale
281
+ tags. The rc.6 bump PR met this and aliased the spec's import as
282
+ `resolveInlineI18nLabel` in five files, with hand-written comments at two of
283
+ them. That is a review convention, which is what objectstack#4115 exists to
284
+ replace with a rule — so `Keyed` is now the counterpart of that `Inline`, and the
285
+ name says which vocabulary it resolves at every call site.
286
+
287
+ **Eleven keep their names and are now imported or derived from the spec** instead
288
+ of re-declared: `DATE_RANGE_PRESETS`, `NavigationMode`, `AddressValue`,
289
+ `BreakpointColumnMap`, `BreakpointOrderMap`, `KanbanConfig`, `CalendarConfig`,
290
+ `GanttConfig`, plus the three renamed above at their new names.
291
+
292
+ **Four of the copies were losing information, not just duplicating it.**
293
+
294
+ - **`GanttConfig` declared six keys and called itself canonical; rc.6's
295
+ `GanttConfigSchema` declares seventeen.** The eleven it never mentioned —
296
+ `parentField`, `typeField`, `baselineStartField`, `baselineEndField`,
297
+ `groupByField`, `resourceView`, `assigneeField`, `effortField`, `capacity`,
298
+ `quickFilters`, `autoZoomToFilter` — are all read by
299
+ `plugin-gantt/src/ObjectGantt.tsx`, through a local `GanttConfigEx`
300
+ intersection that existed only because this type did not carry them. It now
301
+ derives from the spec, with `timeSegments` (shift segmentation) as the one
302
+ genuinely local extension; the schema is `$loose` upstream, so that key is
303
+ legal metadata rather than a second dialect.
304
+ - **`GanttConfig.tooltipFields` carried the comment "not part of the upstream
305
+ GanttConfigSchema".** It is, as of rc.6, so the key now arrives from the spec.
306
+ - **`AddressValue` declared five of the spec's seven parts** — `countryCode` and
307
+ `formatted` were missing, under a comment already claiming to be "the part
308
+ names of `AddressSchema`". The widget still renders five inputs; binding the
309
+ type stops it from asserting the platform cannot store the other two, and makes
310
+ the `{ ...address }` write-through say so.
311
+ - **`DATE_RANGE_PRESETS` was `Object.keys(PRESET_RANGES)`,** a third copy of a
312
+ vocabulary the spec extracted in objectstack#4614 precisely to collapse — its
313
+ own doc comment names this module as one of the three. It is now the spec's
314
+ array by reference, and the local date-macro bounds table is pinned complete
315
+ against it with `satisfies`, so a preset the schema gains without bounds here
316
+ is a compile error rather than a filter that validates clean and then selects
317
+ nothing.
318
+
319
+ `NavigationMode` was one hop from the spec already (`NavigationConfig['mode']`);
320
+ it is bound directly, with a both-directions type pin that it stays the same type
321
+ as the config's own `mode`. `KanbanConfig` / `CalendarConfig` /
322
+ `BreakpointColumnMap` / `BreakpointOrderMap` were exact hand copies of `$strict`
323
+ schemas and are now re-exports — "still exact" is the argument for binding them,
324
+ since a copy with nothing to protect can only drift.
325
+
326
+ `GlobalFilterSchema` is the one ALLOW entry. It is the same spread-composition
327
+ dialect as `SelectOptionSchema` next to it, and it collided only because rc.6's
328
+ new refinement forced `.extend()` to be respelled as a `.shape` spread — which
329
+ moved a derivation the guard could see into an object literal it deliberately
330
+ does not descend into. The dialect is unchanged and its three divergences are
331
+ pinned; which side moves on the refinement itself is objectui#4165.
332
+
333
+ `@objectstack/spec` moves from `devDependencies` to `dependencies` in
334
+ `@object-ui/layout`: its public type surface now references the spec.
335
+
336
+ - Updated dependencies [0e67b53]
337
+ - Updated dependencies [ceccdcf]
338
+ - Updated dependencies [d6e5124]
339
+ - Updated dependencies [debad27]
340
+ - Updated dependencies [dc2aa3e]
341
+ - Updated dependencies [ee66e2e]
342
+ - Updated dependencies [e2e6360]
343
+ - Updated dependencies [ee26e65]
344
+ - Updated dependencies [5900ac5]
345
+ - Updated dependencies [932cbcd]
346
+ - Updated dependencies [734d186]
347
+ - Updated dependencies [f650253]
348
+ - Updated dependencies [3d9769a]
349
+ - Updated dependencies [8f85f8b]
350
+ - Updated dependencies [7ffd616]
351
+ - Updated dependencies [d0c3b26]
352
+ - Updated dependencies [3fc2971]
353
+ - Updated dependencies [aca27fa]
354
+ - Updated dependencies [dde7283]
355
+ - Updated dependencies [f7c6430]
356
+ - Updated dependencies [4dadf0d]
357
+ - Updated dependencies [ae10a01]
358
+ - Updated dependencies [77d6f28]
359
+ - Updated dependencies [0f21348]
360
+ - Updated dependencies [d2e2caf]
361
+ - Updated dependencies [92876f0]
362
+ - Updated dependencies [f279deb]
363
+ - Updated dependencies [4b70d28]
364
+ - Updated dependencies [eb7f586]
365
+ - Updated dependencies [e901131]
366
+ - Updated dependencies [ebb4e0e]
367
+ - Updated dependencies [3a9021e]
368
+ - Updated dependencies [d9d3463]
369
+ - Updated dependencies [2a40f69]
370
+ - Updated dependencies [537a0d1]
371
+ - Updated dependencies [bec3e14]
372
+ - Updated dependencies [613b167]
373
+ - Updated dependencies [b4d3c22]
374
+ - Updated dependencies [1f9b905]
375
+ - Updated dependencies [8f60d73]
376
+ - Updated dependencies [cb13400]
377
+ - Updated dependencies [828549a]
378
+ - Updated dependencies [e1ade8f]
379
+ - Updated dependencies [bc64bfe]
380
+ - Updated dependencies [abb0f81]
381
+ - Updated dependencies [38ab505]
382
+ - Updated dependencies [51ab34e]
383
+ - Updated dependencies [24bb2de]
384
+ - Updated dependencies [0ca6096]
385
+ - Updated dependencies [3e19fe7]
386
+ - Updated dependencies [bb58d1d]
387
+ - Updated dependencies [433ff9f]
388
+ - Updated dependencies [5cc847c]
389
+ - Updated dependencies [e7663f2]
390
+ - Updated dependencies [fa21254]
391
+ - Updated dependencies [f565418]
392
+ - Updated dependencies [33c32bf]
393
+ - Updated dependencies [66fb4fa]
394
+ - Updated dependencies [b953a97]
395
+ - Updated dependencies [d7f3e30]
396
+ - Updated dependencies [6d641c9]
397
+ - Updated dependencies [479cc7b]
398
+ - Updated dependencies [7e4f0e5]
399
+ - Updated dependencies [a84385b]
400
+ - Updated dependencies [45e1949]
401
+ - Updated dependencies [51ac39f]
402
+ - Updated dependencies [5e514c4]
403
+ - Updated dependencies [92250d6]
404
+ - Updated dependencies [c1d939f]
405
+ - Updated dependencies [58bebf6]
406
+ - Updated dependencies [36310dc]
407
+ - Updated dependencies [52d878a]
408
+ - Updated dependencies [405e808]
409
+ - Updated dependencies [49ae9f4]
410
+ - Updated dependencies [a3ae404]
411
+ - Updated dependencies [4270c11]
412
+ - Updated dependencies [bfdf3d4]
413
+ - Updated dependencies [bb68488]
414
+ - Updated dependencies [c0f9a4b]
415
+ - Updated dependencies [b1e42d0]
416
+ - Updated dependencies [2459a3e]
417
+ - Updated dependencies [2776b11]
418
+ - Updated dependencies [ac853ce]
419
+ - Updated dependencies [fa51109]
420
+ - Updated dependencies [d6aa172]
421
+ - Updated dependencies [c32a8a1]
422
+ - Updated dependencies [fe52a04]
423
+ - Updated dependencies [d46f9b8]
424
+ - Updated dependencies [3f5f87c]
425
+ - Updated dependencies [605b747]
426
+ - Updated dependencies [2fea4d2]
427
+ - Updated dependencies [f5e1143]
428
+ - Updated dependencies [7f1cb33]
429
+ - Updated dependencies [f148a64]
430
+ - Updated dependencies [bb68488]
431
+ - Updated dependencies [2e3b0c0]
432
+ - Updated dependencies [9461dd3]
433
+ - Updated dependencies [78fa331]
434
+ - Updated dependencies [47f551b]
435
+ - Updated dependencies [31ab1ac]
436
+ - Updated dependencies [0082db8]
437
+ - Updated dependencies [b42558a]
438
+ - Updated dependencies [d2f6e6b]
439
+ - Updated dependencies [ab04728]
440
+ - Updated dependencies [85a3082]
441
+ - Updated dependencies [5bf09fd]
442
+ - Updated dependencies [06915b0]
443
+ - Updated dependencies [ff84b05]
444
+ - @object-ui/i18n@17.5.0
445
+ - @object-ui/react@17.5.0
446
+ - @object-ui/components@17.5.0
447
+ - @object-ui/core@17.5.0
448
+ - @object-ui/fields@17.5.0
449
+ - @object-ui/data-objectstack@17.5.0
450
+ - @object-ui/types@17.5.0
451
+ - @object-ui/plugin-grid@17.5.0
452
+ - @object-ui/plugin-form@17.5.0
453
+
454
+ ## 17.4.0
455
+
456
+ ### Patch Changes
457
+
458
+ - Updated dependencies [794c497]
459
+ - Updated dependencies [993336f]
460
+ - Updated dependencies [f0a625a]
461
+ - Updated dependencies [b5980f4]
462
+ - Updated dependencies [8aad9fd]
463
+ - Updated dependencies [6719877]
464
+ - Updated dependencies [56ff091]
465
+ - Updated dependencies [0186cdc]
466
+ - Updated dependencies [7864f03]
467
+ - Updated dependencies [ea41a59]
468
+ - Updated dependencies [0cbdca8]
469
+ - Updated dependencies [d229dfa]
470
+ - Updated dependencies [18c42c6]
471
+ - Updated dependencies [ecae400]
472
+ - Updated dependencies [4bc6c23]
473
+ - Updated dependencies [d3e738a]
474
+ - Updated dependencies [c3b01a7]
475
+ - Updated dependencies [f5f8744]
476
+ - Updated dependencies [8497579]
477
+ - Updated dependencies [f0c9a90]
478
+ - Updated dependencies [7ed3360]
479
+ - Updated dependencies [3765678]
480
+ - Updated dependencies [d83f6b3]
481
+ - Updated dependencies [5f08c05]
482
+ - Updated dependencies [69becd2]
483
+ - Updated dependencies [5e52495]
484
+ - Updated dependencies [0fa5e4d]
485
+ - Updated dependencies [b750823]
486
+ - Updated dependencies [5bfaabd]
487
+ - Updated dependencies [022002a]
488
+ - Updated dependencies [e06810e]
489
+ - Updated dependencies [ab3ad4f]
490
+ - Updated dependencies [65bb513]
491
+ - Updated dependencies [c97a45e]
492
+ - Updated dependencies [b19162d]
493
+ - Updated dependencies [c2fd122]
494
+ - Updated dependencies [1bd6faa]
495
+ - Updated dependencies [9154d9e]
496
+ - Updated dependencies [ac2139c]
497
+ - Updated dependencies [b14ab3a]
498
+ - Updated dependencies [e24d767]
499
+ - Updated dependencies [8c60819]
500
+ - Updated dependencies [aca561a]
501
+ - Updated dependencies [41d6022]
502
+ - Updated dependencies [e64a52e]
503
+ - Updated dependencies [844d17f]
504
+ - Updated dependencies [d8a0be4]
505
+ - Updated dependencies [48132f7]
506
+ - Updated dependencies [4dcd52a]
507
+ - Updated dependencies [42ae5c6]
508
+ - Updated dependencies [0ef9dfd]
509
+ - Updated dependencies [f4b97c8]
510
+ - Updated dependencies [1d723e3]
511
+ - Updated dependencies [0109f54]
512
+ - Updated dependencies [7e5bb5d]
513
+ - Updated dependencies [fbc23e0]
514
+ - Updated dependencies [6d762da]
515
+ - Updated dependencies [e6fdbdc]
516
+ - Updated dependencies [54233b1]
517
+ - Updated dependencies [c2ecbae]
518
+ - Updated dependencies [f9faa7d]
519
+ - Updated dependencies [97b63d7]
520
+ - Updated dependencies [14c59c0]
521
+ - Updated dependencies [aeb8424]
522
+ - Updated dependencies [6bb454a]
523
+ - Updated dependencies [1a33b1a]
524
+ - Updated dependencies [11c1e71]
525
+ - Updated dependencies [523be48]
526
+ - Updated dependencies [7e2b7e9]
527
+ - Updated dependencies [33526fd]
528
+ - Updated dependencies [32413ec]
529
+ - Updated dependencies [c1e1e6b]
530
+ - @object-ui/components@17.4.0
531
+ - @object-ui/react@17.4.0
532
+ - @object-ui/core@17.4.0
533
+ - @object-ui/fields@17.4.0
534
+ - @object-ui/i18n@17.4.0
535
+ - @object-ui/types@17.4.0
536
+ - @object-ui/plugin-grid@17.4.0
537
+ - @object-ui/plugin-form@17.4.0
538
+ - @object-ui/data-objectstack@17.4.0
539
+
3
540
  ## 17.3.0
4
541
 
5
542
  ### Patch Changes
@@ -1022,6 +1559,7 @@ undefined` — swallowing the very errors the command exists to print. Now reads
1022
1559
  the Setup app → _All Metadata Types_.
1023
1560
 
1024
1561
  ### New: `@object-ui/app-shell` views/metadata-admin
1562
+
1025
1563
  - **`MetadataDirectoryPage`** — auto-grouped tile directory by domain, with
1026
1564
  free-text search, domain chips, and a _Writable only_ filter.
1027
1565
  - **`MetadataResourceListPage` / `MetadataResourceEditPage` / `…CreatePage` / `…HistoryPage`** —
@@ -1045,6 +1583,7 @@ undefined` — swallowing the very errors the command exists to print. Now reads
1045
1583
  `t(key)` helper.
1046
1584
 
1047
1585
  ### New routing variant
1586
+
1048
1587
  - App nav now supports `{ type: 'component', componentRef, params? }` items.
1049
1588
  `AppContent` resolves them through the existing `ComponentRegistry`.
1050
1589
  - Built-in components registered: `metadata:directory`, `metadata:resource`,
@@ -1053,6 +1592,7 @@ undefined` — swallowing the very errors the command exists to print. Now reads
1053
1592
  / page.
1054
1593
 
1055
1594
  ### Plugin-designer
1595
+
1056
1596
  - Lazy-exported `ObjectManager`, `FieldDesigner`, `ObjectViewConfigurator`,
1057
1597
  `DashboardEditor`, `PageCanvasEditor`, `MetadataObjectsPage`, and
1058
1598
  `MetadataFieldsPage` so the engine can mount them on demand.
@@ -1073,6 +1613,7 @@ undefined` — swallowing the very errors the command exists to print. Now reads
1073
1613
 
1074
1614
  **`@object-ui/plugin-designer`** — two new route-ready pages that
1075
1615
  together close the "Data Model" management loop in the Setup app:
1616
+
1076
1617
  - `MetadataObjectsPage` — lists every object schema (via
1077
1618
  `MetadataClient.list('object')`), renders the existing
1078
1619
  `ObjectManager`, and persists edits/deletes through PUT/DELETE on
@@ -1643,6 +2184,7 @@ undefined` — swallowing the very errors the command exists to print. Now reads
1643
2184
  ### Patch Changes
1644
2185
 
1645
2186
  - 1b6dc64: fix: complete Tailwind v3→v4 migration cleanup
2187
+
1646
2188
  - Rename deprecated `flex-shrink-0` → `shrink-0` and `flex-grow-N` →
1647
2189
  `grow-N` (Tailwind v4 dropped the long-form aliases). Affects
1648
2190
  data-table, fields/index, FileField, ChatbotEnhanced,
@@ -1712,6 +2254,7 @@ undefined` — swallowing the very errors the command exists to print. Now reads
1712
2254
  Library builds (vite lib mode) now externalize every non-relative import instead of bundling third-party CJS dependencies into the published dist. This avoids inlined `require("react")` / `require("react-dom")` calls that cause `Calling \`require\` for "react" in an environment that doesn't expose the \`require\` function` runtime errors when consumer apps re-bundle the published dist.
1713
2255
 
1714
2256
  Specifically fixes:
2257
+
1715
2258
  - `@object-ui/plugin-dashboard` no longer inlines `react-grid-layout` (and its transitive `react-draggable` / `react-resizable` CJS bundles). `react-grid-layout` is now declared as a peer dependency so consumers install a single ESM-friendly copy.
1716
2259
  - `@object-ui/components`, `@object-ui/plugin-calendar`, `@object-ui/plugin-charts`, `@object-ui/plugin-designer` no longer inline `react-i18next` / `i18next` / `use-sync-external-store` CJS shims.
1717
2260
  - All plugin packages now use a unified `external: (id) => !/^[./]/.test(id) && !id.startsWith(__dirname)` rule, ensuring future additions of CJS deps are automatically externalized.
@@ -1782,24 +2325,29 @@ undefined` — swallowing the very errors the command exists to print. Now reads
1782
2325
  - a2d7023: End-user feature batch — forms, designer history, import/export, and PWA offline sync.
1783
2326
 
1784
2327
  **Forms (`@object-ui/fields`, `@object-ui/providers`)**
2328
+
1785
2329
  - `FileField`: native `<input capture="environment">` camera capture for mobile devices, plus a uploading-progress indicator driven by `UploadProvider`.
1786
2330
  - `ImageField`: per-image inline crop/rotate via the lazy-loaded `ImageCropperDialog` (canvas-based, zero new deps).
1787
2331
  - New `UploadProvider` in `@object-ui/providers` with pluggable adapters for S3 and Azure Blob (plus the default object-URL adapter for local previews). XHR-based with progress, abort, and retry.
1788
2332
  - `LookupField`: `lookup.dependsOn: string | string[]` to chain dependent lookups (e.g. State depends on Country); the trigger is gated until parent values are present and the OData `$filter` is built automatically.
1789
2333
 
1790
2334
  **Container-aware widget widths (`@object-ui/components`)**
2335
+
1791
2336
  - New `useResizeObserver(ref)` hook exposing `{ width, height }` of any element. SSR-safe; reads the initial size via `getBoundingClientRect`.
1792
2337
  - `plugin-gantt` and `plugin-kanban` now react to their container size instead of `window.innerWidth`, so they behave correctly inside split panels and dashboards.
1793
2338
 
1794
2339
  **Designer history (`@object-ui/plugin-designer`)**
2340
+
1795
2341
  - `useUndoRedo` (and therefore `useDesignerHistory`) gains `persistKey` + `storage` options to round-trip the undo/redo stack through `sessionStorage`, plus a `clearPersisted()` cleanup helper. Drafts now survive accidental tab refreshes.
1796
2342
  - New `<HistoryPanel>` component renders the timeline visually with one-click jump-to-checkpoint via the new `jumpTo(index)` API.
1797
2343
 
1798
2344
  **Import wizard (`@object-ui/plugin-grid`)**
2345
+
1799
2346
  - Saved column-mapping templates: name, save, re-apply, and delete via a new template bar in the mapping step. Persisted under `objectui:import-templates:${objectName}` (override via `templateStorageKey` / `templateStorage`).
1800
2347
  - Inline validation correction: cells with errors in the preview step are now editable; corrections feed straight into the import without requiring a re-upload, with green-bar status indicators for fixed rows.
1801
2348
 
1802
2349
  **PWA offline sync (`@object-ui/mobile`)**
2350
+
1803
2351
  - New `MemoryOfflineQueue` / `IndexedDbOfflineQueue` (`createOfflineQueue()` picks the best backend) backed by IndexedDB.
1804
2352
  - `createOfflineDataSource(inner, { queue })` wraps any DataSource so mutations issued while offline (or that fail with a network-style error) are queued and replayed in order on reconnect. Includes `replay()`, `drop()`, `clear()`, `pending()`, an `onChange` notifier, and an opt-in `resolveConflict` hook for stale-write conflicts.
1805
2353
  - New `useOfflineSync(source)` hook exposes `{ isOnline, pending, isReplaying, replay, drop, clear }` and auto-replays on the browser's `online` event.
package/README.md CHANGED
@@ -25,7 +25,7 @@ npm install @object-ui/plugin-designer
25
25
  **Peer Dependencies:**
26
26
  - `react` ^18.0.0 || ^19.0.0
27
27
  - `react-dom` ^18.0.0 || ^19.0.0
28
- - `@object-ui/core`
28
+ - `react-router-dom` ^6.0.0 || ^7.0.0
29
29
 
30
30
  ## Quick Start
31
31
 
@@ -129,17 +129,6 @@ const { zoom, pan, resetView } = useCanvasPanZoom();
129
129
  import { ConfirmDialog, Minimap, PropertyEditor, VersionHistory } from '@object-ui/plugin-designer';
130
130
  ```
131
131
 
132
- <!-- release-metadata:v3.3.0 -->
133
-
134
- ## Compatibility
135
-
136
- - **React:** 18.x or 19.x
137
- - **Node.js:** ≥ 18
138
- - **TypeScript:** ≥ 5.0 (strict mode)
139
- - **`@objectstack/spec`:** ^3.3.0
140
- - **`@objectstack/client`:** ^3.3.0
141
- - **Tailwind CSS:** ≥ 3.4 (for packages with UI)
142
-
143
132
  ## Links
144
133
 
145
134
  - 📚 [Documentation](https://www.objectui.org/docs/plugins/plugin-designer)
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardEditor.d.ts","sourceRoot":"","sources":["../src/DashboardEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,wBAAwB,EAAyB,MAAM,kBAAkB,CAAC;AAiCxF,MAAM,WAAW,oBAAoB;IACnC,+BAA+B;IAC/B,MAAM,EAAE,wBAAwB,CAAC;IACjC,mCAAmC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACrD,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACtD,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACtD,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iEAAiE;IACjE,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAwRD,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAAE,wBAAwB,EAC1C,cAAc,GACf,EAAE,oBAAoB,qBAuStB;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"DashboardEditor.d.ts","sourceRoot":"","sources":["../src/DashboardEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,wBAAwB,EAAkD,MAAM,kBAAkB,CAAC;AAiCjH,MAAM,WAAW,oBAAoB;IACnC,+BAA+B;IAC/B,MAAM,EAAE,wBAAwB,CAAC;IACjC,mCAAmC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACrD,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACtD,qCAAqC;IACrC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACtD,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iEAAiE;IACjE,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAqaD,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAAE,wBAAwB,EAC1C,cAAc,GACf,EAAE,oBAAoB,qBAuStB;AAED,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataFieldsPage.d.ts","sourceRoot":"","sources":["../src/MetadataFieldsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AA6FxF,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,qCAAqC;IACrC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,MAAM,EAAE,UAAU,EAClB,YAAY,EACZ,QAAgB,EAChB,SAAS,GACV,EAAE,uBAAuB,qBAgGzB;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"MetadataFieldsPage.d.ts","sourceRoot":"","sources":["../src/MetadataFieldsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAqHxF,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,qCAAqC;IACrC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,MAAM,EAAE,UAAU,EAClB,YAAY,EACZ,QAAgB,EAChB,SAAS,GACV,EAAE,uBAAuB,qBAgGzB;AAED,eAAe,kBAAkB,CAAC"}