@questpie/admin 3.2.0 → 3.2.1

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 (85) hide show
  1. package/dist/client/blocks/block-renderer.d.mts +12 -2
  2. package/dist/client/blocks/block-renderer.mjs +357 -49
  3. package/dist/client/components/blocks/block-editor-context.mjs +11 -1
  4. package/dist/client/components/blocks/block-editor-provider.mjs +68 -26
  5. package/dist/client/components/blocks/block-item.mjs +181 -170
  6. package/dist/client/components/blocks/utils/tree-utils.mjs +13 -1
  7. package/dist/client/components/fields/array-field.mjs +177 -118
  8. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +305 -310
  9. package/dist/client/components/filter-builder/filters-tab.mjs +1 -1
  10. package/dist/client/components/history-sidebar.mjs +121 -114
  11. package/dist/client/components/preview/live-preview-mode.mjs +140 -114
  12. package/dist/client/components/preview/preview-pane.mjs +288 -333
  13. package/dist/client/components/primitives/option-label.mjs +44 -0
  14. package/dist/client/components/primitives/select-multi.mjs +408 -383
  15. package/dist/client/components/primitives/select-single.mjs +387 -357
  16. package/dist/client/components/widgets/chart-widget.mjs +168 -143
  17. package/dist/client/contexts/focus-context.d.mts +11 -0
  18. package/dist/client/contexts/focus-context.mjs +51 -34
  19. package/dist/client/hooks/use-brand.mjs +2 -1
  20. package/dist/client/preview/block-scope-context.d.mts +2 -2
  21. package/dist/client/preview/block-scope-context.mjs +10 -20
  22. package/dist/client/preview/index.d.mts +1 -1
  23. package/dist/client/preview/patch.mjs +100 -0
  24. package/dist/client/preview/preview-banner.d.mts +2 -2
  25. package/dist/client/preview/preview-field.d.mts +34 -5
  26. package/dist/client/preview/preview-field.mjs +385 -118
  27. package/dist/client/preview/types.d.mts +82 -3
  28. package/dist/client/preview/types.mjs +85 -6
  29. package/dist/client/preview/use-collection-preview.d.mts +19 -1
  30. package/dist/client/preview/use-collection-preview.mjs +182 -58
  31. package/dist/client/runtime/index.d.mts +2 -2
  32. package/dist/client/runtime/index.mjs +2 -2
  33. package/dist/client/runtime/provider.d.mts +5 -5
  34. package/dist/client/utils/build-field-definitions-from-schema.mjs +8 -3
  35. package/dist/client/views/auth/reset-password-form.d.mts +2 -2
  36. package/dist/client/views/auth/setup-form.d.mts +2 -2
  37. package/dist/client/views/collection/bulk-action-toolbar.mjs +23 -25
  38. package/dist/client/views/collection/cells/primitive-cells.mjs +63 -13
  39. package/dist/client/views/collection/columns/build-columns.mjs +1 -0
  40. package/dist/client/views/collection/form-view.mjs +262 -33
  41. package/dist/client/views/collection/table-view.mjs +16 -11
  42. package/dist/client/views/layout/admin-layout-provider.d.mts +5 -5
  43. package/dist/client/views/layout/admin-layout-provider.mjs +107 -16
  44. package/dist/client.d.mts +2 -2
  45. package/dist/client.mjs +1 -1
  46. package/dist/components/rich-text/rich-text-renderer.d.mts +2 -2
  47. package/dist/index.d.mts +2 -2
  48. package/dist/index.mjs +1 -1
  49. package/dist/server/augmentation/common.d.mts +8 -4
  50. package/dist/server/augmentation/form-layout.d.mts +1 -1
  51. package/dist/server/i18n/messages/cs.mjs +11 -0
  52. package/dist/server/i18n/messages/de.mjs +11 -0
  53. package/dist/server/i18n/messages/en.mjs +11 -0
  54. package/dist/server/i18n/messages/es.mjs +11 -0
  55. package/dist/server/i18n/messages/fr.mjs +11 -0
  56. package/dist/server/i18n/messages/pl.mjs +11 -0
  57. package/dist/server/i18n/messages/pt.mjs +11 -0
  58. package/dist/server/i18n/messages/sk.mjs +11 -0
  59. package/dist/server/modules/admin/block/block-builder.d.mts +7 -10
  60. package/dist/server/modules/admin/block/block-builder.mjs +7 -10
  61. package/dist/server/modules/admin/collections/account.d.mts +50 -50
  62. package/dist/server/modules/admin/collections/admin-locks.d.mts +54 -54
  63. package/dist/server/modules/admin/collections/admin-preferences.d.mts +39 -39
  64. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +47 -47
  65. package/dist/server/modules/admin/collections/apikey.d.mts +68 -68
  66. package/dist/server/modules/admin/collections/assets.d.mts +57 -20
  67. package/dist/server/modules/admin/collections/session.d.mts +42 -42
  68. package/dist/server/modules/admin/collections/user.d.mts +100 -34
  69. package/dist/server/modules/admin/collections/user.mjs +4 -4
  70. package/dist/server/modules/admin/collections/verification.d.mts +32 -32
  71. package/dist/server/modules/admin/index.d.mts +3 -3
  72. package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
  73. package/dist/server/modules/admin/routes/admin-config.mjs +9 -12
  74. package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
  75. package/dist/server/modules/admin/routes/locales.d.mts +2 -2
  76. package/dist/server/modules/admin/routes/preview.d.mts +11 -11
  77. package/dist/server/modules/admin/routes/reactive.d.mts +9 -9
  78. package/dist/server/modules/admin/routes/setup.d.mts +7 -7
  79. package/dist/server/modules/admin/routes/translations.d.mts +4 -4
  80. package/dist/server/modules/admin/routes/translations.mjs +1 -1
  81. package/dist/server/modules/admin/routes/widget-data.d.mts +5 -5
  82. package/dist/server/modules/admin-preferences/collections/admin-preferences.mjs +4 -6
  83. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +31 -33
  84. package/dist/server/modules/admin-preferences/collections/saved-views.mjs +4 -6
  85. package/package.json +3 -3
@@ -1,5 +1,7 @@
1
1
  import { useResolveText, useTranslation } from "../../i18n/hooks.mjs";
2
2
  import { formatLabel } from "../../lib/utils.mjs";
3
+ import { resolveOptionLabelForValue } from "../primitives/option-label.mjs";
4
+ import { useCollectionFields } from "../../hooks/use-collection-fields.mjs";
3
5
  import { useCollectionList } from "../../hooks/use-collection.mjs";
4
6
  import { WidgetCard } from "../../views/dashboard/widget-card.mjs";
5
7
  import { useServerWidgetData } from "../../hooks/use-server-widget-data.mjs";
@@ -75,10 +77,10 @@ function _temp(entry) {
75
77
  }, String(entry.name));
76
78
  }
77
79
  function ChartWidget(t0) {
78
- const $ = c(56);
80
+ const $ = c(63);
79
81
  const { config } = t0;
80
82
  const resolveText = useResolveText();
81
- const { t } = useTranslation();
83
+ const { t, locale } = useTranslation();
82
84
  const { collection, field, chartType: t1, timeRange: t2, label, color: t3, showGrid: t4, realtime, hasLoader, refreshInterval } = config;
83
85
  const chartType = t1 === void 0 ? "area" : t1;
84
86
  const timeRange = t2 === void 0 ? "30d" : t2;
@@ -96,126 +98,149 @@ function ChartWidget(t0) {
96
98
  $[2] = t6;
97
99
  } else t6 = $[2];
98
100
  const serverQuery = useServerWidgetData(config.id, t6);
99
- let t7;
100
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
101
- t7 = { limit: 1e3 };
101
+ const t7 = !!collection && !hasLoader;
102
+ let t8;
103
+ if ($[3] !== t7) {
104
+ t8 = { schemaQueryOptions: { enabled: t7 } };
102
105
  $[3] = t7;
103
- } else t7 = $[3];
104
- const t8 = !hasLoader;
105
- let t9;
106
- if ($[4] !== t8) {
107
- t9 = { enabled: t8 };
108
106
  $[4] = t8;
107
+ } else t8 = $[4];
108
+ const { fields } = useCollectionFields(collection, t8);
109
+ const fieldDef = fields[field];
110
+ const fieldType = fieldDef?.name;
111
+ const selectOptions = fieldDef?.["~options"]?.options;
112
+ let t9;
113
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
114
+ t9 = { limit: 1e3 };
109
115
  $[5] = t9;
110
116
  } else t9 = $[5];
111
- let t10;
112
- if ($[6] !== realtime) {
113
- t10 = { realtime };
114
- $[6] = realtime;
115
- $[7] = t10;
116
- } else t10 = $[7];
117
- const collectionQuery = useCollectionList(collection, t7, t9, t10);
118
- const { isLoading, error, refetch, isFetching } = hasLoader ? serverQuery : collectionQuery;
117
+ const t10 = !hasLoader;
119
118
  let t11;
119
+ if ($[6] !== t10) {
120
+ t11 = { enabled: t10 };
121
+ $[6] = t10;
122
+ $[7] = t11;
123
+ } else t11 = $[7];
124
+ let t12;
125
+ if ($[8] !== realtime) {
126
+ t12 = { realtime };
127
+ $[8] = realtime;
128
+ $[9] = t12;
129
+ } else t12 = $[9];
130
+ const collectionQuery = useCollectionList(collection, t9, t11, t12);
131
+ const { isLoading, error, refetch, isFetching } = hasLoader ? serverQuery : collectionQuery;
132
+ let t13;
120
133
  bb0: {
121
134
  if (hasLoader) {
122
- let t12$2;
123
- if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
124
- t12$2 = [];
125
- $[8] = t12$2;
126
- } else t12$2 = $[8];
127
- t11 = t12$2;
135
+ let t14$2;
136
+ if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
137
+ t14$2 = [];
138
+ $[10] = t14$2;
139
+ } else t14$2 = $[10];
140
+ t13 = t14$2;
128
141
  break bb0;
129
142
  }
130
- let t12$1;
131
- if ($[9] !== collectionQuery.data) {
132
- t12$1 = Array.isArray(collectionQuery.data?.docs) ? collectionQuery.data.docs : [];
133
- $[9] = collectionQuery.data;
134
- $[10] = t12$1;
135
- } else t12$1 = $[10];
136
- t11 = t12$1;
143
+ let t14$1;
144
+ if ($[11] !== collectionQuery.data) {
145
+ t14$1 = Array.isArray(collectionQuery.data?.docs) ? collectionQuery.data.docs : [];
146
+ $[11] = collectionQuery.data;
147
+ $[12] = t14$1;
148
+ } else t14$1 = $[12];
149
+ t13 = t14$1;
137
150
  }
138
- const collectionItems = t11;
139
- let t12;
140
- if ($[11] !== collection || $[12] !== config.title || $[13] !== field || $[14] !== label || $[15] !== resolveText) {
141
- t12 = config.title ? resolveText(config.title) : label ? resolveText(label) : `${formatLabel(collection)} by ${field}`;
142
- $[11] = collection;
143
- $[12] = config.title;
144
- $[13] = field;
145
- $[14] = label;
146
- $[15] = resolveText;
147
- $[16] = t12;
148
- } else t12 = $[16];
149
- const displayLabel = t12;
150
- let t13;
151
+ const collectionItems = t13;
152
+ let t14;
153
+ if ($[13] !== collection || $[14] !== config.title || $[15] !== field || $[16] !== label || $[17] !== resolveText) {
154
+ t14 = config.title ? resolveText(config.title) : label ? resolveText(label) : `${formatLabel(collection)} by ${field}`;
155
+ $[13] = collection;
156
+ $[14] = config.title;
157
+ $[15] = field;
158
+ $[16] = label;
159
+ $[17] = resolveText;
160
+ $[18] = t14;
161
+ } else t14 = $[18];
162
+ const displayLabel = t14;
163
+ let t15;
151
164
  bb1: {
152
165
  if (hasLoader) {
153
- let t14$2;
154
- if ($[17] !== serverQuery.data) {
155
- t14$2 = serverQuery.data ?? [];
156
- $[17] = serverQuery.data;
157
- $[18] = t14$2;
158
- } else t14$2 = $[18];
159
- t13 = t14$2;
166
+ let t16$2;
167
+ if ($[19] !== serverQuery.data) {
168
+ t16$2 = serverQuery.data ?? [];
169
+ $[19] = serverQuery.data;
170
+ $[20] = t16$2;
171
+ } else t16$2 = $[20];
172
+ t15 = t16$2;
160
173
  break bb1;
161
174
  }
162
175
  if (!collectionItems.length) {
163
- let t14$2;
164
- if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
165
- t14$2 = [];
166
- $[19] = t14$2;
167
- } else t14$2 = $[19];
168
- t13 = t14$2;
176
+ let t16$2;
177
+ if ($[21] === Symbol.for("react.memo_cache_sentinel")) {
178
+ t16$2 = [];
179
+ $[21] = t16$2;
180
+ } else t16$2 = $[21];
181
+ t15 = t16$2;
169
182
  break bb1;
170
183
  }
171
- let t14$1;
172
- if ($[20] !== collectionItems || $[21] !== field || $[22] !== timeRange) {
184
+ let t16$1;
185
+ if ($[22] !== collectionItems || $[23] !== field || $[24] !== fieldType || $[25] !== locale || $[26] !== resolveText || $[27] !== selectOptions || $[28] !== t || $[29] !== timeRange) {
173
186
  const grouped = collectionItems.reduce((acc, item) => {
174
187
  const value = item[field];
175
188
  if (value === void 0 || value === null) return acc;
176
189
  let key;
177
- if (value instanceof Date || !isNaN(Date.parse(value))) key = formatDateForRange(new Date(value), timeRange);
190
+ if (fieldType === "select") key = resolveOptionLabelForValue({
191
+ value,
192
+ options: selectOptions,
193
+ resolveText,
194
+ t,
195
+ locale
196
+ });
197
+ else if (value instanceof Date || !isNaN(Date.parse(value))) key = formatDateForRange(new Date(value), timeRange);
178
198
  else key = String(value);
179
199
  acc[key] = (acc[key] || 0) + 1;
180
200
  return acc;
181
201
  }, {});
182
- t14$1 = Object.entries(grouped).map(_temp2).sort(_temp3);
183
- $[20] = collectionItems;
184
- $[21] = field;
185
- $[22] = timeRange;
186
- $[23] = t14$1;
187
- } else t14$1 = $[23];
188
- t13 = t14$1;
202
+ t16$1 = Object.entries(grouped).map(_temp2).sort(_temp3);
203
+ $[22] = collectionItems;
204
+ $[23] = field;
205
+ $[24] = fieldType;
206
+ $[25] = locale;
207
+ $[26] = resolveText;
208
+ $[27] = selectOptions;
209
+ $[28] = t;
210
+ $[29] = timeRange;
211
+ $[30] = t16$1;
212
+ } else t16$1 = $[30];
213
+ t15 = t16$1;
189
214
  }
190
- const chartData = t13;
191
- let t14;
192
- if ($[24] !== t) {
193
- t14 = t("widget.chart.emptyTitle");
194
- $[24] = t;
195
- $[25] = t14;
196
- } else t14 = $[25];
197
- let t15;
198
- if ($[26] !== t) {
199
- t15 = t("widget.chart.emptyDescription");
200
- $[26] = t;
201
- $[27] = t15;
202
- } else t15 = $[27];
215
+ const chartData = t15;
203
216
  let t16;
204
- if ($[28] !== t14 || $[29] !== t15) {
205
- t16 = /* @__PURE__ */ jsx(WidgetEmptyState, {
217
+ if ($[31] !== t) {
218
+ t16 = t("widget.chart.emptyTitle");
219
+ $[31] = t;
220
+ $[32] = t16;
221
+ } else t16 = $[32];
222
+ let t17;
223
+ if ($[33] !== t) {
224
+ t17 = t("widget.chart.emptyDescription");
225
+ $[33] = t;
226
+ $[34] = t17;
227
+ } else t17 = $[34];
228
+ let t18;
229
+ if ($[35] !== t16 || $[36] !== t17) {
230
+ t18 = /* @__PURE__ */ jsx(WidgetEmptyState, {
206
231
  iconName: "ph:chart-line",
207
- title: t14,
208
- description: t15,
232
+ title: t16,
233
+ description: t17,
209
234
  className: "min-h-48"
210
235
  });
211
- $[28] = t14;
212
- $[29] = t15;
213
- $[30] = t16;
214
- } else t16 = $[30];
215
- const emptyContent = t16;
216
- let t17;
217
- if ($[31] !== chartData || $[32] !== chartType || $[33] !== color || $[34] !== emptyContent || $[35] !== showGrid) {
218
- t17 = chartData.length === 0 ? emptyContent : /* @__PURE__ */ jsx("div", {
236
+ $[35] = t16;
237
+ $[36] = t17;
238
+ $[37] = t18;
239
+ } else t18 = $[37];
240
+ const emptyContent = t18;
241
+ let t19;
242
+ if ($[38] !== chartData || $[39] !== chartType || $[40] !== color || $[41] !== emptyContent || $[42] !== showGrid) {
243
+ t19 = chartData.length === 0 ? emptyContent : /* @__PURE__ */ jsx("div", {
219
244
  className: "h-48 w-full",
220
245
  children: /* @__PURE__ */ jsx(ResponsiveContainer, {
221
246
  width: "100%",
@@ -228,67 +253,67 @@ function ChartWidget(t0) {
228
253
  })
229
254
  })
230
255
  });
231
- $[31] = chartData;
232
- $[32] = chartType;
233
- $[33] = color;
234
- $[34] = emptyContent;
235
- $[35] = showGrid;
236
- $[36] = t17;
237
- } else t17 = $[36];
238
- const chartContent = t17;
239
- let t18;
240
- if ($[37] !== config.description || $[38] !== resolveText) {
241
- t18 = config.description ? resolveText(config.description) : void 0;
242
- $[37] = config.description;
243
- $[38] = resolveText;
244
- $[39] = t18;
245
- } else t18 = $[39];
246
- const t19 = isFetching && !isLoading;
256
+ $[38] = chartData;
257
+ $[39] = chartType;
258
+ $[40] = color;
259
+ $[41] = emptyContent;
260
+ $[42] = showGrid;
261
+ $[43] = t19;
262
+ } else t19 = $[43];
263
+ const chartContent = t19;
247
264
  let t20;
248
- if ($[40] === Symbol.for("react.memo_cache_sentinel")) {
249
- t20 = /* @__PURE__ */ jsx(ChartWidgetSkeleton, {});
250
- $[40] = t20;
251
- } else t20 = $[40];
252
- let t21;
253
- if ($[41] !== error) {
254
- t21 = error instanceof Error ? error : error ? new Error(String(error)) : null;
255
- $[41] = error;
256
- $[42] = t21;
257
- } else t21 = $[42];
265
+ if ($[44] !== config.description || $[45] !== resolveText) {
266
+ t20 = config.description ? resolveText(config.description) : void 0;
267
+ $[44] = config.description;
268
+ $[45] = resolveText;
269
+ $[46] = t20;
270
+ } else t20 = $[46];
271
+ const t21 = isFetching && !isLoading;
258
272
  let t22;
259
- if ($[43] !== refetch) {
260
- t22 = () => refetch();
261
- $[43] = refetch;
262
- $[44] = t22;
263
- } else t22 = $[44];
273
+ if ($[47] === Symbol.for("react.memo_cache_sentinel")) {
274
+ t22 = /* @__PURE__ */ jsx(ChartWidgetSkeleton, {});
275
+ $[47] = t22;
276
+ } else t22 = $[47];
264
277
  let t23;
265
- if ($[45] !== chartContent || $[46] !== config.actions || $[47] !== config.cardVariant || $[48] !== config.className || $[49] !== displayLabel || $[50] !== isLoading || $[51] !== t18 || $[52] !== t19 || $[53] !== t21 || $[54] !== t22) {
266
- t23 = /* @__PURE__ */ jsx(WidgetCard, {
278
+ if ($[48] !== error) {
279
+ t23 = error instanceof Error ? error : error ? new Error(String(error)) : null;
280
+ $[48] = error;
281
+ $[49] = t23;
282
+ } else t23 = $[49];
283
+ let t24;
284
+ if ($[50] !== refetch) {
285
+ t24 = () => refetch();
286
+ $[50] = refetch;
287
+ $[51] = t24;
288
+ } else t24 = $[51];
289
+ let t25;
290
+ if ($[52] !== chartContent || $[53] !== config.actions || $[54] !== config.cardVariant || $[55] !== config.className || $[56] !== displayLabel || $[57] !== isLoading || $[58] !== t20 || $[59] !== t21 || $[60] !== t23 || $[61] !== t24) {
291
+ t25 = /* @__PURE__ */ jsx(WidgetCard, {
267
292
  title: displayLabel,
268
- description: t18,
293
+ description: t20,
269
294
  variant: config.cardVariant,
270
295
  isLoading,
271
- isRefreshing: t19,
272
- loadingSkeleton: t20,
273
- error: t21,
274
- onRefresh: t22,
296
+ isRefreshing: t21,
297
+ loadingSkeleton: t22,
298
+ error: t23,
299
+ onRefresh: t24,
275
300
  actions: config.actions,
276
301
  className: config.className,
277
302
  children: chartContent
278
303
  });
279
- $[45] = chartContent;
280
- $[46] = config.actions;
281
- $[47] = config.cardVariant;
282
- $[48] = config.className;
283
- $[49] = displayLabel;
284
- $[50] = isLoading;
285
- $[51] = t18;
286
- $[52] = t19;
287
- $[53] = t21;
288
- $[54] = t22;
289
- $[55] = t23;
290
- } else t23 = $[55];
291
- return t23;
304
+ $[52] = chartContent;
305
+ $[53] = config.actions;
306
+ $[54] = config.cardVariant;
307
+ $[55] = config.className;
308
+ $[56] = displayLabel;
309
+ $[57] = isLoading;
310
+ $[58] = t20;
311
+ $[59] = t21;
312
+ $[60] = t23;
313
+ $[61] = t24;
314
+ $[62] = t25;
315
+ } else t25 = $[62];
316
+ return t25;
292
317
  }
293
318
  /**
294
319
  * Renders the appropriate chart type as a proper component
@@ -8,8 +8,13 @@ import * as react_jsx_runtime16 from "react/jsx-runtime";
8
8
  * - idle: nothing focused
9
9
  * - field: regular field focused (e.g., "title", "slug")
10
10
  * - block: block field focused, optionally with specific field within block
11
+ * - block-insert: insert a block at a position using the existing block editor
11
12
  * - relation: relation field focused (opens ResourceSheet for editing)
12
13
  */
14
+ type BlockInsertPosition = {
15
+ parentId: string | null;
16
+ index: number;
17
+ };
13
18
  type FocusState = {
14
19
  type: "idle";
15
20
  } | {
@@ -19,6 +24,10 @@ type FocusState = {
19
24
  type: "block";
20
25
  blockId: string;
21
26
  fieldPath?: string;
27
+ } | {
28
+ type: "block-insert";
29
+ position: BlockInsertPosition;
30
+ referenceBlockId?: string;
22
31
  } | {
23
32
  type: "relation";
24
33
  fieldPath: string;
@@ -31,6 +40,8 @@ type FocusContextValue = {
31
40
  focusField: (fieldPath: string) => void;
32
41
  /** Focus a block, optionally a specific field within it */
33
42
  focusBlock: (blockId: string, fieldPath?: string) => void;
43
+ /** Open block insertion at a specific position */
44
+ requestBlockInsert: (position: BlockInsertPosition, referenceBlockId?: string) => void;
34
45
  /** Focus a relation field (opens ResourceSheet) */
35
46
  focusRelation: (fieldPath: string, targetCollection?: string) => void;
36
47
  /** Clear focus */
@@ -14,7 +14,7 @@ import { jsx } from "react/jsx-runtime";
14
14
  */
15
15
  const FocusContext = React.createContext(null);
16
16
  function FocusProvider(t0) {
17
- const $ = c(24);
17
+ const $ = c(27);
18
18
  const { children, onFocusChange } = t0;
19
19
  let t1;
20
20
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -68,61 +68,78 @@ function FocusProvider(t0) {
68
68
  const focusRelation = t4;
69
69
  let t5;
70
70
  if ($[7] !== onFocusChange) {
71
- t5 = () => {
72
- const newState_2 = { type: "idle" };
71
+ t5 = (position, referenceBlockId) => {
72
+ const newState_2 = {
73
+ type: "block-insert",
74
+ position,
75
+ referenceBlockId
76
+ };
73
77
  setState(newState_2);
74
78
  onFocusChange?.(newState_2);
75
79
  };
76
80
  $[7] = onFocusChange;
77
81
  $[8] = t5;
78
82
  } else t5 = $[8];
79
- const clearFocus = t5;
80
- const focusedFieldPath = state.type === "field" ? state.fieldPath : void 0;
81
- const focusedBlockId = state.type === "block" ? state.blockId : void 0;
83
+ const requestBlockInsert = t5;
82
84
  let t6;
83
- if ($[9] !== focusedFieldPath) {
84
- t6 = (path) => focusedFieldPath === path;
85
- $[9] = focusedFieldPath;
85
+ if ($[9] !== onFocusChange) {
86
+ t6 = () => {
87
+ const newState_3 = { type: "idle" };
88
+ setState(newState_3);
89
+ onFocusChange?.(newState_3);
90
+ };
91
+ $[9] = onFocusChange;
86
92
  $[10] = t6;
87
93
  } else t6 = $[10];
94
+ const clearFocus = t6;
95
+ const focusedFieldPath = state.type === "field" ? state.fieldPath : void 0;
96
+ const focusedBlockId = state.type === "block" ? state.blockId : void 0;
88
97
  let t7;
89
- if ($[11] !== focusedBlockId) {
90
- t7 = (id) => focusedBlockId === id;
91
- $[11] = focusedBlockId;
98
+ if ($[11] !== focusedFieldPath) {
99
+ t7 = (path) => focusedFieldPath === path;
100
+ $[11] = focusedFieldPath;
92
101
  $[12] = t7;
93
102
  } else t7 = $[12];
94
103
  let t8;
95
- if ($[13] !== clearFocus || $[14] !== focusBlock || $[15] !== focusField || $[16] !== focusRelation || $[17] !== state || $[18] !== t6 || $[19] !== t7) {
96
- t8 = {
104
+ if ($[13] !== focusedBlockId) {
105
+ t8 = (id) => focusedBlockId === id;
106
+ $[13] = focusedBlockId;
107
+ $[14] = t8;
108
+ } else t8 = $[14];
109
+ let t9;
110
+ if ($[15] !== clearFocus || $[16] !== focusBlock || $[17] !== focusField || $[18] !== focusRelation || $[19] !== requestBlockInsert || $[20] !== state || $[21] !== t7 || $[22] !== t8) {
111
+ t9 = {
97
112
  state,
98
113
  focusField,
99
114
  focusBlock,
115
+ requestBlockInsert,
100
116
  focusRelation,
101
117
  clearFocus,
102
- isFieldFocused: t6,
103
- isBlockFocused: t7
118
+ isFieldFocused: t7,
119
+ isBlockFocused: t8
104
120
  };
105
- $[13] = clearFocus;
106
- $[14] = focusBlock;
107
- $[15] = focusField;
108
- $[16] = focusRelation;
109
- $[17] = state;
110
- $[18] = t6;
111
- $[19] = t7;
112
- $[20] = t8;
113
- } else t8 = $[20];
114
- const value = t8;
115
- let t9;
116
- if ($[21] !== children || $[22] !== value) {
117
- t9 = /* @__PURE__ */ jsx(FocusContext.Provider, {
121
+ $[15] = clearFocus;
122
+ $[16] = focusBlock;
123
+ $[17] = focusField;
124
+ $[18] = focusRelation;
125
+ $[19] = requestBlockInsert;
126
+ $[20] = state;
127
+ $[21] = t7;
128
+ $[22] = t8;
129
+ $[23] = t9;
130
+ } else t9 = $[23];
131
+ const value = t9;
132
+ let t10;
133
+ if ($[24] !== children || $[25] !== value) {
134
+ t10 = /* @__PURE__ */ jsx(FocusContext.Provider, {
118
135
  value,
119
136
  children
120
137
  });
121
- $[21] = children;
122
- $[22] = value;
123
- $[23] = t9;
124
- } else t9 = $[23];
125
- return t9;
138
+ $[24] = children;
139
+ $[25] = value;
140
+ $[26] = t10;
141
+ } else t10 = $[26];
142
+ return t10;
126
143
  }
127
144
  /**
128
145
  * Use the focus context
@@ -1,5 +1,6 @@
1
1
  import { useAdminStoreRaw } from "../runtime/provider.mjs";
2
2
  import { c } from "react/compiler-runtime";
3
+ import { useShallow } from "zustand/shallow";
3
4
  import { createStore, useStore } from "zustand";
4
5
 
5
6
  //#region src/client/hooks/use-brand.ts
@@ -29,7 +30,7 @@ function selectBrand(state) {
29
30
  * mounted (e.g. on a bare auth page).
30
31
  */
31
32
  function useBrand() {
32
- return useStore(useAdminStoreRaw() ?? FALLBACK_STORE, selectBrand);
33
+ return useStore(useAdminStoreRaw() ?? FALLBACK_STORE, useShallow(selectBrand));
33
34
  }
34
35
  /**
35
36
  * Imperative variant for code paths that cannot use hooks (callbacks,
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import * as react_jsx_runtime22 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime21 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/client/preview/block-scope-context.d.ts
5
5
 
@@ -35,7 +35,7 @@ declare function BlockScopeProvider({
35
35
  blockId,
36
36
  basePath,
37
37
  children
38
- }: BlockScopeProviderProps): react_jsx_runtime22.JSX.Element;
38
+ }: BlockScopeProviderProps): react_jsx_runtime21.JSX.Element;
39
39
  /**
40
40
  * Get current block scope context.
41
41
  *
@@ -31,39 +31,29 @@ const BlockScopeContext = React.createContext(null);
31
31
  function BlockScopeProvider(t0) {
32
32
  const $ = c(6);
33
33
  const { blockId, basePath: t1, children } = t0;
34
- const basePath = t1 === void 0 ? "content._values" : t1;
35
- const parentScope = React.useContext(BlockScopeContext);
34
+ const fieldPrefix = `${t1 === void 0 ? "content._values" : t1}.${blockId}`;
36
35
  let t2;
37
- bb0: {
38
- if (parentScope) {
39
- t2 = `${parentScope.fieldPrefix}.${blockId}`;
40
- break bb0;
41
- }
42
- t2 = `${basePath}.${blockId}`;
43
- }
44
- const fieldPrefix = t2;
45
- let t3;
46
36
  if ($[0] !== blockId || $[1] !== fieldPrefix) {
47
- t3 = {
37
+ t2 = {
48
38
  blockId,
49
39
  fieldPrefix
50
40
  };
51
41
  $[0] = blockId;
52
42
  $[1] = fieldPrefix;
53
- $[2] = t3;
54
- } else t3 = $[2];
55
- const value = t3;
56
- let t4;
43
+ $[2] = t2;
44
+ } else t2 = $[2];
45
+ const value = t2;
46
+ let t3;
57
47
  if ($[3] !== children || $[4] !== value) {
58
- t4 = /* @__PURE__ */ jsx(BlockScopeContext.Provider, {
48
+ t3 = /* @__PURE__ */ jsx(BlockScopeContext.Provider, {
59
49
  value,
60
50
  children
61
51
  });
62
52
  $[3] = children;
63
53
  $[4] = value;
64
- $[5] = t4;
65
- } else t4 = $[5];
66
- return t4;
54
+ $[5] = t3;
55
+ } else t3 = $[5];
56
+ return t3;
67
57
  }
68
58
  /**
69
59
  * Get current block scope context.
@@ -1,5 +1,5 @@
1
1
  import { BlockScopeContextValue, BlockScopeProvider, BlockScopeProviderProps, useBlockScope, useResolveFieldPath } from "./block-scope-context.mjs";
2
2
  import { PreviewBanner, PreviewBannerProps } from "./preview-banner.mjs";
3
3
  import { PreviewField, PreviewFieldProps, PreviewProvider, StandalonePreviewField, usePreviewContext } from "./preview-field.mjs";
4
- import { AdminToPreviewMessage, BlockClickedMessage, FieldClickedMessage, FocusFieldMessage, PreviewConfig, PreviewReadyMessage, PreviewRefreshMessage, PreviewToAdminMessage, RefreshCompleteMessage, SelectBlockMessage, isAdminToPreviewMessage, isPreviewToAdminMessage } from "./types.mjs";
4
+ import { AdminToPreviewMessage, BlockClickedMessage, CommitMessage, FieldClickedMessage, FieldValueEditedMessage, FocusFieldMessage, FullResyncMessage, InitSnapshotMessage, PatchAppliedMessage, PatchBatchMessage, PreviewConfig, PreviewPatchOp, PreviewReadyMessage, PreviewRefreshMessage, PreviewToAdminMessage, RefreshCompleteMessage, ResyncRequestMessage, SelectBlockMessage, isAdminToPreviewMessage, isPreviewToAdminMessage } from "./types.mjs";
5
5
  import { UseCollectionPreviewOptions, UseCollectionPreviewResult, useCollectionPreview } from "./use-collection-preview.mjs";