rimecms 0.27.6 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/dist/adapter-sqlite/{area.js → area.server.js} +2 -2
  2. package/dist/adapter-sqlite/{blocks.d.ts → blocks.server.d.ts} +1 -1
  3. package/dist/adapter-sqlite/{blocks.js → blocks.server.js} +1 -1
  4. package/dist/adapter-sqlite/{collection.js → collection.server.js} +17 -8
  5. package/dist/adapter-sqlite/generate-schema/write.server.js +2 -2
  6. package/dist/adapter-sqlite/index.server.d.ts +8 -8
  7. package/dist/adapter-sqlite/index.server.js +7 -7
  8. package/dist/adapter-sqlite/{orderBy.js → orderBy.server.js} +1 -1
  9. package/dist/adapter-sqlite/{relations.d.ts → relations.server.d.ts} +1 -1
  10. package/dist/adapter-sqlite/{relations.js → relations.server.js} +1 -1
  11. package/dist/adapter-sqlite/{transform.js → transform.server.js} +2 -3
  12. package/dist/adapter-sqlite/{tree.d.ts → tree.server.d.ts} +1 -1
  13. package/dist/adapter-sqlite/{tree.js → tree.server.js} +1 -1
  14. package/dist/adapter-sqlite/url.server.d.ts +1 -1
  15. package/dist/core/areas/local-api.server.d.ts +1 -1
  16. package/dist/core/areas/local-api.server.js +1 -0
  17. package/dist/core/collections/api/delete.server.js +1 -1
  18. package/dist/core/collections/api/get.server.js +1 -1
  19. package/dist/core/collections/api/getById.server.js +3 -1
  20. package/dist/core/collections/config/augment-panel.d.ts +13 -0
  21. package/dist/core/collections/config/augment-panel.js +19 -0
  22. package/dist/core/collections/config/augment-upload.server.d.ts +1 -0
  23. package/dist/core/collections/config/augment-upload.server.js +1 -0
  24. package/dist/core/collections/config/builder.js +3 -1
  25. package/dist/core/collections/config/builder.server.js +3 -1
  26. package/dist/core/collections/local-api.server.js +3 -1
  27. package/dist/core/collections/operations/findById.js +3 -1
  28. package/dist/core/collections/upload/hooks/convert-base64.server.js +1 -1
  29. package/dist/core/config/auth/better-auth.server.d.ts +3 -3
  30. package/dist/core/config/auth/better-auth.server.js +1 -1
  31. package/dist/core/config/client/augment-panel.d.ts +4 -4
  32. package/dist/core/config/client/build-config.d.ts +5 -5
  33. package/dist/core/config/server/augment-directories.server.js +3 -3
  34. package/dist/core/config/server/augment-staff.server.d.ts +1 -1
  35. package/dist/core/config/server/augment-staff.server.js +1 -1
  36. package/dist/core/config/server/build-config.server.d.ts +12 -12
  37. package/dist/core/config/server/build-config.server.js +1 -1
  38. package/dist/core/config/server/{validate.js → validate.server.js} +1 -1
  39. package/dist/core/config/server/{write.js → write.server.js} +1 -1
  40. package/dist/core/config/shared/augment-icons.d.ts +1 -2
  41. package/dist/core/config/shared/get-staff-collection.d.ts +1 -1
  42. package/dist/core/config/shared/upload-directories.js +1 -1
  43. package/dist/core/config/types.d.ts +20 -8
  44. package/dist/core/dev/cli/generate/{index.js → index.server.js} +2 -2
  45. package/dist/core/dev/cli/index.js +3 -3
  46. package/dist/core/dev/cli/init/{index.js → index.server.js} +68 -25
  47. package/dist/core/dev/cli/init/{packageManagerUtil.js → package-manager-util.server.js} +5 -5
  48. package/dist/core/dev/generate/routes/{area.d.ts → area.server.d.ts} +1 -1
  49. package/dist/core/dev/generate/routes/{area.js → area.server.js} +1 -1
  50. package/dist/core/dev/generate/routes/{collection.d.ts → collection.server.d.ts} +1 -1
  51. package/dist/core/dev/generate/routes/{collection.js → collection.server.js} +1 -1
  52. package/dist/core/dev/generate/routes/{common.d.ts → common.server.d.ts} +1 -1
  53. package/dist/core/dev/generate/routes/{common.js → common.server.js} +3 -3
  54. package/dist/core/dev/generate/routes/{index.js → index.server.js} +5 -5
  55. package/dist/core/dev/generate/routes/{util.js → util.server.js} +1 -1
  56. package/dist/core/dev/generate/types/{index.js → index.server.js} +1 -1
  57. package/dist/core/dev/vite/{index.js → index.server.js} +1 -1
  58. package/dist/core/fields/util.d.ts +13 -0
  59. package/dist/core/fields/util.js +77 -4
  60. package/dist/core/i18n/en/common.d.ts +1 -0
  61. package/dist/core/i18n/en/common.js +1 -0
  62. package/dist/core/i18n/fr/common.d.ts +1 -0
  63. package/dist/core/i18n/fr/common.js +1 -0
  64. package/dist/core/operations/hooks/before-read/populate-url.server.js +10 -2
  65. package/dist/core/operations/hooks/before-upsert/handle-new-version.server.js +2 -2
  66. package/dist/core/operations/relations/diff.server.d.ts +1 -1
  67. package/dist/core/operations/relations/extract.server.d.ts +1 -1
  68. package/dist/core/rime.server.d.ts +22 -8
  69. package/dist/core/rime.server.js +5 -5
  70. package/dist/fields/blocks/component/Block.svelte +13 -19
  71. package/dist/fields/blocks/component/Blocks.svelte +6 -13
  72. package/dist/fields/group/component/Group.svelte +6 -13
  73. package/dist/fields/number/component/number.css +2 -0
  74. package/dist/fields/relation/component/default/Default.svelte +1 -7
  75. package/dist/fields/relation/component/upload/upload.css +1 -10
  76. package/dist/fields/relation/index.d.ts +21 -6
  77. package/dist/fields/relation/index.js +41 -11
  78. package/dist/fields/rich-text/component/RichText.svelte +4 -4
  79. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte +6 -6
  80. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte.d.ts +2 -0
  81. package/dist/fields/rich-text/component/drag-handle/drag-handle.css +1 -0
  82. package/dist/fields/rich-text/component/styles/rich-text.css +0 -7
  83. package/dist/fields/rich-text/core/features/resource/resource.svelte +2 -9
  84. package/dist/fields/rich-text/core/features/upload/upload.svelte +5 -12
  85. package/dist/fields/rich-text/core/render-rich-text.svelte +5 -3
  86. package/dist/fields/rich-text/index.d.ts +1 -1
  87. package/dist/fields/select/component/Select.svelte +5 -11
  88. package/dist/fields/tabs/index.d.ts +1 -0
  89. package/dist/fields/tabs/index.js +3 -0
  90. package/dist/fields/textarea/component/TextArea.svelte +5 -13
  91. package/dist/fields/tree/component/TreeBlock.svelte +12 -18
  92. package/dist/fields/types.d.ts +3 -2
  93. package/dist/live.d.ts +2 -1
  94. package/dist/live.js +2 -1
  95. package/dist/panel/components/fields/Error.svelte +1 -7
  96. package/dist/panel/components/sections/collection/Empty.svelte +1 -0
  97. package/dist/panel/components/sections/collection/folder/Folder.svelte +7 -16
  98. package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte +1 -1
  99. package/dist/panel/components/sections/collection/grid/CollectionGrid.svelte +22 -12
  100. package/dist/panel/components/sections/collection/grid/create-directory-dialog/CreateDirectoryDialog.svelte +4 -5
  101. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte +41 -33
  102. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte.d.ts +4 -0
  103. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte +14 -16
  104. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte.d.ts +2 -0
  105. package/dist/panel/components/sections/collection/header/DisplayMode.svelte +10 -10
  106. package/dist/panel/components/sections/collection/header/SearchInput.svelte +2 -8
  107. package/dist/panel/components/sections/collection/list/CollectionList.svelte +32 -3
  108. package/dist/panel/components/sections/collection/list/header/Header.svelte +3 -9
  109. package/dist/panel/components/sections/collection/list/row/Row.svelte +34 -24
  110. package/dist/panel/components/sections/collection/list/row/Row.svelte.d.ts +9 -0
  111. package/dist/panel/components/sections/collection/upload-thumb-cell/UploadThumbCell.svelte +11 -1
  112. package/dist/panel/components/sections/document/ButtonStatus.svelte +3 -11
  113. package/dist/panel/components/sections/document/Document.svelte +22 -41
  114. package/dist/panel/components/sections/document/Document.svelte.d.ts +0 -1
  115. package/dist/panel/components/sections/document/upload-header/UploadHeader.svelte +11 -21
  116. package/dist/panel/components/sections/live/LiveEdit.svelte +114 -0
  117. package/dist/panel/components/sections/live/LiveEdit.svelte.d.ts +32 -0
  118. package/dist/panel/components/sections/live/LiveEditPanel.svelte +53 -0
  119. package/dist/panel/components/sections/live/LiveEditPanel.svelte.d.ts +11 -0
  120. package/dist/panel/components/sections/live/LiveFloatingUI.svelte +106 -0
  121. package/dist/panel/components/sections/live/LiveFloatingUI.svelte.d.ts +12 -0
  122. package/dist/panel/components/sections/live/Provider.svelte +4 -4
  123. package/dist/panel/components/sections/live/Provider.svelte.d.ts +5 -3
  124. package/dist/panel/components/sections/live/live-edit-panel.css +12 -0
  125. package/dist/panel/components/ui/breadcrumb/BreadCrumb.svelte +2 -9
  126. package/dist/panel/components/ui/button/button.svelte +35 -54
  127. package/dist/panel/components/ui/calendar/calendar.css +11 -0
  128. package/dist/panel/components/ui/card-document/card-document.svelte +21 -14
  129. package/dist/panel/components/ui/card-resource/card-resource.svelte +8 -14
  130. package/dist/panel/components/ui/checkbox/checkbox.svelte +1 -1
  131. package/dist/panel/components/ui/command/command-group.css +1 -0
  132. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -7
  133. package/dist/panel/components/ui/input/input.svelte +13 -23
  134. package/dist/panel/components/ui/label/label.css +0 -1
  135. package/dist/panel/components/ui/nav/NavItemButton.svelte +2 -8
  136. package/dist/panel/components/ui/page-header/PageHeader.svelte +6 -13
  137. package/dist/panel/components/ui/radio-group/radio-group.css +2 -0
  138. package/dist/panel/components/ui/scroll-area/scroll-area.css +0 -4
  139. package/dist/panel/components/ui/sheet/sheet.css +0 -16
  140. package/dist/panel/components/ui/tabs/tabs.css +7 -0
  141. package/dist/panel/context/collection.svelte.d.ts +0 -4
  142. package/dist/panel/context/collection.svelte.js +0 -3
  143. package/dist/panel/context/documentForm.svelte.js +1 -0
  144. package/dist/panel/context/live.svelte.d.ts +8 -20
  145. package/dist/panel/context/live.svelte.js +65 -35
  146. package/dist/panel/context/livePanel.svelte.d.ts +11 -0
  147. package/dist/panel/context/livePanel.svelte.js +8 -0
  148. package/dist/panel/pages/auth/forgot-password/ForgotPassword.svelte +1 -7
  149. package/dist/panel/pages/collection/Collection.svelte +3 -1
  150. package/dist/panel/pages/dashboard/Dashboard.svelte +52 -28
  151. package/dist/panel/pages/dashboard/DashboardCollection.svelte +91 -0
  152. package/dist/panel/pages/dashboard/DashboardCollection.svelte.d.ts +9 -0
  153. package/dist/panel/pages/dashboard/load.server.js +30 -14
  154. package/dist/panel/pages/dashboard/types.d.ts +1 -0
  155. package/dist/panel/pages/live/Live.svelte +244 -67
  156. package/dist/panel/pages/live/Live.svelte.d.ts +9 -1
  157. package/dist/panel/pages/live/load.server.js +14 -1
  158. package/dist/panel/style/index.css +562 -8
  159. package/dist/panel/style/mixins/index.css +1 -3
  160. package/dist/panel/util/upload.d.ts +1 -1
  161. package/dist/util/object.js +3 -0
  162. package/package.json +12 -10
  163. package/dist/panel/components/sections/document/FloatingUI.svelte +0 -81
  164. package/dist/panel/components/sections/document/FloatingUI.svelte.d.ts +0 -8
  165. package/dist/panel/components/sections/live/SidePanel.svelte +0 -61
  166. package/dist/panel/components/sections/live/SidePanel.svelte.d.ts +0 -14
  167. package/dist/panel/components/sections/live/side-panel.css +0 -15
  168. /package/dist/adapter-sqlite/{area.d.ts → area.server.d.ts} +0 -0
  169. /package/dist/adapter-sqlite/{collection.d.ts → collection.server.d.ts} +0 -0
  170. /package/dist/adapter-sqlite/{orderBy.d.ts → orderBy.server.d.ts} +0 -0
  171. /package/dist/adapter-sqlite/{transform.d.ts → transform.server.d.ts} +0 -0
  172. /package/dist/adapter-sqlite/{types.d.ts → types.server.d.ts} +0 -0
  173. /package/dist/adapter-sqlite/{types.js → types.server.js} +0 -0
  174. /package/dist/adapter-sqlite/{util.d.ts → util.server.d.ts} +0 -0
  175. /package/dist/adapter-sqlite/{util.js → util.server.js} +0 -0
  176. /package/dist/adapter-sqlite/{where.d.ts → where.server.d.ts} +0 -0
  177. /package/dist/adapter-sqlite/{where.js → where.server.js} +0 -0
  178. /package/dist/adapter-sqlite/{with.d.ts → with.server.d.ts} +0 -0
  179. /package/dist/adapter-sqlite/{with.js → with.server.js} +0 -0
  180. /package/dist/core/collections/upload/util/{converter.d.ts → converter.server.d.ts} +0 -0
  181. /package/dist/core/collections/upload/util/{converter.js → converter.server.js} +0 -0
  182. /package/dist/core/config/auth/{better-auth-hooks.d.ts → better-auth-hooks.server.d.ts} +0 -0
  183. /package/dist/core/config/auth/{better-auth-hooks.js → better-auth-hooks.server.js} +0 -0
  184. /package/dist/core/config/server/{augment-cors.d.ts → augment-cors.server.d.ts} +0 -0
  185. /package/dist/core/config/server/{augment-cors.js → augment-cors.server.js} +0 -0
  186. /package/dist/core/config/server/{validate.d.ts → validate.server.d.ts} +0 -0
  187. /package/dist/core/config/server/{write.d.ts → write.server.d.ts} +0 -0
  188. /package/dist/core/dev/cache/{index.d.ts → index.server.d.ts} +0 -0
  189. /package/dist/core/dev/cache/{index.js → index.server.js} +0 -0
  190. /package/dist/core/dev/cli/clear/{index.d.ts → index.server.d.ts} +0 -0
  191. /package/dist/core/dev/cli/clear/{index.js → index.server.js} +0 -0
  192. /package/dist/core/dev/cli/generate/{index.d.ts → index.server.d.ts} +0 -0
  193. /package/dist/core/dev/cli/init/{getPackageName.d.ts → get-package-info.server.d.ts} +0 -0
  194. /package/dist/core/dev/cli/init/{getPackageName.js → get-package-info.server.js} +0 -0
  195. /package/dist/core/dev/cli/init/{index.d.ts → index.server.d.ts} +0 -0
  196. /package/dist/core/dev/cli/init/{packageManagerUtil.d.ts → package-manager-util.server.d.ts} +0 -0
  197. /package/dist/core/dev/generate/routes/{custom-css.d.ts → custom-css.server.d.ts} +0 -0
  198. /package/dist/core/dev/generate/routes/{custom-css.js → custom-css.server.js} +0 -0
  199. /package/dist/core/dev/generate/routes/{index.d.ts → index.server.d.ts} +0 -0
  200. /package/dist/core/dev/generate/routes/{util.d.ts → util.server.d.ts} +0 -0
  201. /package/dist/core/dev/generate/sanitize/{index.d.ts → index.server.d.ts} +0 -0
  202. /package/dist/core/dev/generate/sanitize/{index.js → index.server.js} +0 -0
  203. /package/dist/core/dev/generate/types/{index.d.ts → index.server.d.ts} +0 -0
  204. /package/dist/core/dev/vite/{index.d.ts → index.server.d.ts} +0 -0
@@ -17,7 +17,6 @@
17
17
  import AuthApiKeyDialog from './AuthAPIKeyDialog.svelte';
18
18
  import AuthFooter from './AuthFooter.svelte';
19
19
  import CurrentlyEdited from './CurrentlyEdited.svelte';
20
- import FloatingUI from './FloatingUI.svelte';
21
20
  import Header from './Header.svelte';
22
21
  import UploadHeader from './upload-header/UploadHeader.svelte';
23
22
 
@@ -25,7 +24,6 @@
25
24
  doc: GenericDoc;
26
25
  operation: 'update' | 'create';
27
26
  class?: string;
28
- onDataChange?: any;
29
27
  onFieldFocus?: any;
30
28
  readOnly: boolean;
31
29
  onClose?: any;
@@ -40,7 +38,6 @@
40
38
  onClose,
41
39
  onNestedDocumentCreated,
42
40
  nestedLevel = 0,
43
- onDataChange = null,
44
41
  onFieldFocus = null,
45
42
  class: className
46
43
  }: Props = $props();
@@ -64,7 +61,7 @@
64
61
  // Dialog for unsaved changes confirmation
65
62
  const isConfirmLeaveOpen = $derived(!!interceptedLeave);
66
63
  const locale = getLocaleContext();
67
- const liveEditing = $derived(!!onDataChange);
64
+
68
65
  // This is used to show the API key after creating a document in a collection with API key auth
69
66
  let apiKey = $state<string | null>('');
70
67
 
@@ -85,7 +82,6 @@
85
82
  config,
86
83
  readOnly,
87
84
  onNestedDocumentCreated,
88
- onDataChange,
89
85
  onFieldFocus,
90
86
  key: `${initial._type}_${nestedLevel}`,
91
87
  beforeRedirect: beforeRedirect
@@ -142,9 +138,7 @@
142
138
  enctype="multipart/form-data"
143
139
  method="post"
144
140
  >
145
- {#if !liveEditing}
146
- <Header {form} {config} {onClose}></Header>
147
- {/if}
141
+ <Header {form} {config} {onClose}></Header>
148
142
 
149
143
  {#if form.values.editedBy && form.values.editedBy !== user.attributes.id}
150
144
  <CurrentlyEdited by={form.values.editedBy} doc={form.values} user={user.attributes} />
@@ -161,27 +155,23 @@
161
155
  {/if}
162
156
  </div>
163
157
 
164
- {#if !form.isLive}
165
- <div class="rz-document__infos">
166
- {#if form.values.createdAt}
167
- {@render meta(t__('common.created_at'), locale.dateFormat(form.values.createdAt))}
168
- {/if}
169
- {#if form.values.updatedAt}
170
- {@render meta(t__('common.last_update'), locale.dateFormat(form.values.updatedAt))}
171
- {/if}
172
- {#if form.values.editedBy}
173
- {@render meta(t__('common.edited_by'), locale.dateFormat(form.values.editedBy))}
174
- {/if}
175
- {#if form.values.id}
176
- {@render meta('id', form.values.id)}
177
- {/if}
178
- </div>
179
- {:else}
180
- <FloatingUI {form} {onClose} />
181
- {/if}
158
+ <div class="rz-document__infos">
159
+ {#if form.values.createdAt}
160
+ {@render meta(t__('common.created_at'), locale.dateFormat(form.values.createdAt))}
161
+ {/if}
162
+ {#if form.values.updatedAt}
163
+ {@render meta(t__('common.last_update'), locale.dateFormat(form.values.updatedAt))}
164
+ {/if}
165
+ {#if form.values.editedBy}
166
+ {@render meta(t__('common.edited_by'), locale.dateFormat(form.values.editedBy))}
167
+ {/if}
168
+ {#if form.values.id}
169
+ {@render meta('id', form.values.id)}
170
+ {/if}
171
+ </div>
182
172
 
183
173
  <!-- This shows the create API Key after creation, for apiKey auth type collection -->
184
- {#if !form.isLive && apiKey}
174
+ {#if apiKey}
185
175
  <AuthApiKeyDialog bind:apiKey />
186
176
  {/if}
187
177
 
@@ -211,13 +201,7 @@
211
201
  </Dialog.Root>
212
202
  </form>
213
203
 
214
- <style>/**************************************/
215
-
216
- /* Font */
217
-
218
- /**************************************/
219
-
220
- .rz-document {
204
+ <style>.rz-document {
221
205
  container: rz-document / inline-size;
222
206
  min-height: 100vh;
223
207
  position: relative;
@@ -225,7 +209,7 @@
225
209
  background-size: cover;
226
210
  }
227
211
 
228
- .rz-document__fields {
212
+ .rz-document__fields {
229
213
  display: grid;
230
214
  gap: var(--rz-size-4);
231
215
  min-height: calc(100vh - var(--rz-size-14));
@@ -235,18 +219,15 @@
235
219
  padding: var(--rz-size-5) var(--rz-page-gutter);
236
220
  padding-bottom: var(--rz-size-24);
237
221
  }
238
-
239
- .rz-document__infos {
222
+ .rz-document__infos {
240
223
  border-top: var(--rz-border);
241
224
  padding-inline: var(--rz-page-gutter);
242
225
  padding-block: var(--rz-size-6);
243
226
  }
244
-
245
- .rz-document__metas {
227
+ .rz-document__metas {
246
228
  font-size: var(--rz-text-xs);
247
229
  }
248
-
249
- .rz-document__metas span {
230
+ .rz-document__metas span {
250
231
  font-variation-settings: 'wght' 600;
251
232
  font-weight: 600;
252
233
  }
@@ -3,7 +3,6 @@ type Props = {
3
3
  doc: GenericDoc;
4
4
  operation: 'update' | 'create';
5
5
  class?: string;
6
- onDataChange?: any;
7
6
  onFieldFocus?: any;
8
7
  readOnly: boolean;
9
8
  onClose?: any;
@@ -100,25 +100,19 @@
100
100
  {/if}
101
101
  </div>
102
102
 
103
- <style>/**************************************/
104
-
105
- /* Font */
106
-
107
- /**************************************/
108
-
109
- .rz-doc-upload-header {
103
+ <style>.rz-doc-upload-header {
110
104
  container: inline-size;
111
105
  padding: 0 var(--rz-fields-padding);
112
106
  }
113
107
 
114
- .rz-doc-upload-header__file {
108
+ .rz-doc-upload-header__file {
115
109
  min-height: 250px;
116
110
  border: var(--rz-border);
117
111
  overflow: hidden;
118
112
  border-radius: var(--radius-md);
119
113
  }
120
114
 
121
- .rz-doc-upload-header__preview {
115
+ .rz-doc-upload-header__preview {
122
116
  width: 100%;
123
117
  display: flex;
124
118
  align-items: center;
@@ -131,7 +125,7 @@
131
125
  border-top-left-radius: var(--rz-radius-md);
132
126
  }
133
127
 
134
- @container (min-width:28rem) {
128
+ @container (min-width:28rem) {
135
129
  .rz-doc-upload-header__file {
136
130
  display: flex;
137
131
  }
@@ -146,7 +140,7 @@
146
140
  }
147
141
  }
148
142
 
149
- .rz-doc-upload-header__prewiew-grid {
143
+ .rz-doc-upload-header__prewiew-grid {
150
144
  width: 100%;
151
145
  height: 100%;
152
146
  --dark: hsl(var(--rz-gray-11) / 1);
@@ -194,37 +188,33 @@
194
188
  0 var(--half-size);
195
189
  }
196
190
 
197
- .rz-doc-upload-header__prewiew-grid img {
191
+ .rz-doc-upload-header__prewiew-grid img {
198
192
  height: 100%;
199
193
  width: 100%;
200
194
  -o-object-fit: contain;
201
195
  object-fit: contain;
202
196
  }
203
197
 
204
- .rz-doc-upload-header__info {
198
+ .rz-doc-upload-header__info {
205
199
  flex: 1;
206
200
  font-size: var(--rz-text-sm);
207
201
  padding-inline: var(--rz-size-4);
208
202
  padding-block: var(--rz-size-4);
209
203
  }
210
-
211
- .rz-doc-upload-header__info h4 {
204
+ .rz-doc-upload-header__info h4 {
212
205
  opacity: 0.4;
213
206
  margin-bottom: var(--rz-size-1);
214
207
  font-size: var(--rz-text-xs);
215
208
  }
216
-
217
- .rz-doc-upload-header__info a {
209
+ .rz-doc-upload-header__info a {
218
210
  margin-bottom: var(--rz-size-3);
219
211
  display: block;
220
212
  text-decoration: underline;
221
213
  }
222
-
223
- .rz-doc-upload-header__info p {
214
+ .rz-doc-upload-header__info p {
224
215
  margin-bottom: var(--rz-size-3);
225
216
  }
226
-
227
- .rz-doc-upload-header__prewiew-file {
217
+ .rz-doc-upload-header__prewiew-file {
228
218
  display: flex;
229
219
  flex-direction: column;
230
220
  align-items: center;
@@ -0,0 +1,114 @@
1
+ <script lang="ts" generics="T">
2
+ import { browser } from '$app/environment';
3
+ import { page } from '$app/state';
4
+ import { getLiveContext } from '../../../context/live.svelte.js';
5
+ import { normalizeFieldPath } from '../../../../util/doc.js';
6
+ import { onDestroy, type Snippet } from 'svelte';
7
+
8
+ type Props = {
9
+ /** Initial value */
10
+ data?: T;
11
+ /** Full path to the field being edited from the root of the document, e.g. `attributes.title` or `layout.sections.2:paragraph.text` */
12
+ path?: string;
13
+ /** Update URI of the API ex: `/pages/123` */
14
+ update?: string;
15
+ child: Snippet<[value: T, props: PanelProps]>;
16
+ };
17
+
18
+ type PanelProps = {
19
+ onclick?: null | ((e: MouseEvent) => void);
20
+ role?: 'button' | null;
21
+ tabindex?: 0 | null;
22
+ 'data-live-panel-trigger'?: '' | null;
23
+ 'data-is-active'?: '' | null;
24
+ };
25
+
26
+ const { data: incomingData, path = '', update: incomingUpdate, child }: Props = $props();
27
+
28
+ const data = $derived(incomingData ?? page.data.doc);
29
+ const live = getLiveContext();
30
+
31
+ // Fallback to doc api url if prop not present
32
+ const update = $derived(incomingUpdate ? incomingUpdate : live.documentUpdateURI);
33
+
34
+ $effect(() => {
35
+ if (path === '') {
36
+ window.top?.postMessage({
37
+ activatePanel: { key, path, update, fieldPath: path }
38
+ });
39
+ }
40
+ });
41
+
42
+ // Unique key for this panel instance — discriminates panels with same update but different path
43
+ const key = $derived(`${path}-${update}`);
44
+
45
+ // Strip :blockType suffix from path segments for store lookup
46
+ // e.g. 'layout.sections.2:paragraph' → reads liveStore at 'layout.sections.2'
47
+ const lookupPath = $derived(normalizeFieldPath(path));
48
+
49
+ // Read from live store, fall back to data prop
50
+ const liveValue = $derived(live?.getPanelValue(update, lookupPath));
51
+ const value = $derived(liveValue ?? data);
52
+ const isActive = $derived(live?.activePanelKey === key);
53
+
54
+ function onKeyDown(e: KeyboardEvent) {
55
+ if (e.key === 'Escape') {
56
+ window.top?.postMessage({
57
+ deactivatePanel: { key }
58
+ });
59
+ }
60
+ }
61
+
62
+ function activate() {
63
+ if (!live?.enabled) return;
64
+ window.top?.postMessage({
65
+ activatePanel: { key, path, update, fieldPath: path }
66
+ });
67
+ window.addEventListener('keydown', onKeyDown);
68
+ }
69
+
70
+ onDestroy(() => {
71
+ if (browser) window.removeEventListener('keydown', onKeyDown);
72
+ });
73
+
74
+ function makeChildProps(): PanelProps {
75
+ if (!page.data.user || !live?.enabled) return {};
76
+
77
+ return {
78
+ onclick: !isActive
79
+ ? (e: MouseEvent) => {
80
+ e.stopPropagation();
81
+ e.preventDefault();
82
+ activate();
83
+ }
84
+ : null,
85
+ role: isActive ? null : 'button',
86
+ tabindex: isActive ? null : 0,
87
+ 'data-live-panel-trigger': '',
88
+ 'data-is-active': isActive ? '' : null
89
+ };
90
+ }
91
+ </script>
92
+
93
+ {@render child(value, makeChildProps())}
94
+
95
+ <style>
96
+ :root {
97
+ --rz-color-live-panel-spot: hsl(240deg 89% 60%);
98
+ }
99
+
100
+ :global([data-live-panel-trigger]) {
101
+ outline: none;
102
+ }
103
+
104
+ :global([data-live-panel-trigger]:not([data-is-active]):hover) {
105
+ outline: 1px dashed hsl(from var(--rz-color-live-panel-spot) h s l / 0.6);
106
+ outline-offset: 5px;
107
+ cursor: pointer;
108
+ }
109
+
110
+ :global([data-live-panel-trigger][data-is-active]) {
111
+ outline-offset: 5px;
112
+ outline: 2px solid var(--rz-color-live-panel-spot);
113
+ }
114
+ </style>
@@ -0,0 +1,32 @@
1
+ import { type Snippet } from 'svelte';
2
+ declare class __sveltets_Render<T> {
3
+ props(): {
4
+ /** Initial value */
5
+ data?: T | undefined;
6
+ /** Full path to the field being edited from the root of the document, e.g. `attributes.title` or `layout.sections.2:paragraph.text` */
7
+ path?: string;
8
+ /** Update URI of the API ex: `/pages/123` */
9
+ update?: string;
10
+ child: Snippet<[value: T, props: {
11
+ onclick?: ((e: MouseEvent) => void) | null | undefined;
12
+ role?: "button" | null;
13
+ tabindex?: 0 | null;
14
+ 'data-live-panel-trigger'?: "" | null;
15
+ 'data-is-active'?: "" | null;
16
+ }]>;
17
+ };
18
+ events(): {};
19
+ slots(): {};
20
+ bindings(): "";
21
+ exports(): {};
22
+ }
23
+ interface $$IsomorphicComponent {
24
+ new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
25
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
26
+ } & ReturnType<__sveltets_Render<T>['exports']>;
27
+ <T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
28
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
29
+ }
30
+ declare const LiveEdit: $$IsomorphicComponent;
31
+ type LiveEdit<T> = InstanceType<typeof LiveEdit<T>>;
32
+ export default LiveEdit;
@@ -0,0 +1,53 @@
1
+ <script lang="ts">
2
+ import { getFieldBuildersAtPath } from '../../../../core/fields/util.js';
3
+ import RenderFields from '../../fields/RenderFields.svelte';
4
+ import { getConfigContext } from '../../../context/config.svelte.js';
5
+ import { setDocumentFormContext } from '../../../context/documentForm.svelte.js';
6
+ import { getLivePanelContext } from '../../../context/livePanel.svelte.js';
7
+ import type { GenericDoc } from '../../../../types';
8
+ import { onMount } from 'svelte';
9
+ import ScrollArea from '../../ui/scroll-area/scroll-area.svelte';
10
+ import './live-edit-panel.css';
11
+
12
+ type Props = {
13
+ doc: GenericDoc;
14
+ onDataChange: any;
15
+ afterSuccess: (savedDoc: any) => void;
16
+ onFormReady: (form: any) => void;
17
+ };
18
+
19
+ const { doc, onDataChange, afterSuccess, onFormReady }: Props = $props();
20
+
21
+ // fieldPath comes from the centralized panel context — reactive when user navigates the stack
22
+ const livePanelCtx = getLivePanelContext();
23
+ const fieldPath = $derived(livePanelCtx.activePanel?.fieldPath ?? '');
24
+
25
+ const { getDocumentConfig } = getConfigContext();
26
+ // svelte-ignore state_referenced_locally
27
+ const docConfig = getDocumentConfig({ prototype: doc._prototype, slug: doc._type });
28
+
29
+ // Form context is created once and kept alive — switching fieldPath only changes what's rendered
30
+ // svelte-ignore state_referenced_locally
31
+ const form = setDocumentFormContext({
32
+ initial: doc,
33
+ config: docConfig,
34
+ readOnly: false,
35
+ onDataChange,
36
+ afterSuccess,
37
+ key: `${doc._type}_0`
38
+ });
39
+
40
+ // Register form with parent after mount so parent can drive save/revert
41
+ onMount(() => onFormReady(form));
42
+
43
+ // Reactive: re-derives when fieldPath changes (no remount needed)
44
+ const { fields, path } = $derived(getFieldBuildersAtPath(fieldPath, docConfig.fields));
45
+ </script>
46
+
47
+ <form class="rz-live-edit-panel" use:form.enhance enctype="multipart/form-data" method="post">
48
+ <ScrollArea class="rz-live-edit-panel__fields">
49
+ {#key doc.id + (doc.versionId || '') + (doc.locale || '')}
50
+ <RenderFields {fields} {path} {form} />
51
+ {/key}
52
+ </ScrollArea>
53
+ </form>
@@ -0,0 +1,11 @@
1
+ import type { GenericDoc } from '../../../../types';
2
+ import './live-edit-panel.css';
3
+ type Props = {
4
+ doc: GenericDoc;
5
+ onDataChange: any;
6
+ afterSuccess: (savedDoc: any) => void;
7
+ onFormReady: (form: any) => void;
8
+ };
9
+ declare const LiveEditPanel: import("svelte").Component<Props, {}, "">;
10
+ type LiveEditPanel = ReturnType<typeof LiveEditPanel>;
11
+ export default LiveEditPanel;
@@ -0,0 +1,106 @@
1
+ <script lang="ts">
2
+ import { t__ } from '../../../../core/i18n/index.js';
3
+ import type { DocumentFormContext } from '../../../context/documentForm.svelte.js';
4
+ import type { ActivePanel } from '../../../context/livePanel.svelte';
5
+ import { ChevronLeft, Form, Laptop, Save, Smartphone, X } from '@lucide/svelte';
6
+ import Button from '../../ui/button/button.svelte';
7
+ import SpinLoader from '../../ui/spin-loader/SpinLoader.svelte';
8
+
9
+ type Props = {
10
+ forms: Record<string, DocumentFormContext>;
11
+ onClose: () => void;
12
+ toggleRootPanel: (() => void) | null;
13
+ activePanel: ActivePanel | null;
14
+ currentDevice: 'desktop' | 'mobile';
15
+ };
16
+ let {
17
+ forms,
18
+ onClose,
19
+ toggleRootPanel,
20
+ activePanel,
21
+ currentDevice = $bindable('desktop')
22
+ }: Props = $props();
23
+
24
+ const formsWithChanges = $derived(Object.values(forms).filter((form) => form.canSubmit));
25
+ const isProcessing = $derived(Object.values(forms).some((form) => form.processing));
26
+
27
+ function saveAll() {
28
+ for (const form of formsWithChanges) {
29
+ try {
30
+ form.element.requestSubmit();
31
+ } catch {
32
+ // form element not yet mounted — skip
33
+ }
34
+ }
35
+ }
36
+
37
+ function handleKeyDown(event: KeyboardEvent) {
38
+ if ((event.ctrlKey || event.metaKey) && event.key === 's') {
39
+ event.preventDefault();
40
+ saveAll();
41
+ }
42
+ }
43
+ </script>
44
+
45
+ <div class="rz-live-floating-ui">
46
+ <Button icon={activePanel ? ChevronLeft : X} onclick={onClose} variant="secondary" size="icon" />
47
+
48
+ {#if toggleRootPanel}
49
+ <Button
50
+ onclick={toggleRootPanel}
51
+ variant={activePanel && activePanel.fieldPath === '' ? 'secondary' : 'ghost'}
52
+ size="icon"
53
+ icon={Form}
54
+ />
55
+ {/if}
56
+
57
+ <Button
58
+ onclick={() => (currentDevice = 'mobile')}
59
+ variant={currentDevice === 'mobile' ? 'secondary' : 'ghost'}
60
+ size="icon"
61
+ icon={Smartphone}
62
+ />
63
+ <Button
64
+ onclick={() => (currentDevice = 'desktop')}
65
+ variant={currentDevice === 'desktop' ? 'secondary' : 'ghost'}
66
+ size="icon"
67
+ icon={Laptop}
68
+ />
69
+
70
+ <Button
71
+ onclick={saveAll}
72
+ disabled={formsWithChanges.length === 0}
73
+ class="rz-live-floating-ui__save"
74
+ >
75
+ {#if isProcessing}
76
+ <SpinLoader />
77
+ {:else}
78
+ <Save size="13" />
79
+ {/if}
80
+ {t__('common.save')}
81
+ </Button>
82
+ </div>
83
+
84
+ <svelte:window onkeydown={handleKeyDown} />
85
+
86
+ <style>
87
+ .rz-live-floating-ui {
88
+ position: fixed;
89
+ bottom: var(--rz-size-2);
90
+ left: var(--rz-size-2);
91
+ margin-left: var(--rz-size-2);
92
+ margin-right: var(--rz-size-2);
93
+ height: var(--rz-size-14);
94
+ background-color: hsl(var(--rz-color-bg));
95
+ padding: var(--rz-size-2);
96
+ border-radius: var(--rz-radius-md);
97
+ z-index: 1000;
98
+ display: flex;
99
+ gap: var(--rz-size-2);
100
+ box-shadow: var(--rz-shadow-xl);
101
+ border: var(--rz-border);
102
+ :global(.rz-live-floating-ui__save) {
103
+ flex: 1;
104
+ }
105
+ }
106
+ </style>
@@ -0,0 +1,12 @@
1
+ import type { DocumentFormContext } from '../../../context/documentForm.svelte.js';
2
+ import type { ActivePanel } from '../../../context/livePanel.svelte';
3
+ type Props = {
4
+ forms: Record<string, DocumentFormContext>;
5
+ onClose: () => void;
6
+ toggleRootPanel: (() => void) | null;
7
+ activePanel: ActivePanel | null;
8
+ currentDevice: 'desktop' | 'mobile';
9
+ };
10
+ declare const LiveFloatingUi: import("svelte").Component<Props, {}, "currentDevice">;
11
+ type LiveFloatingUi = ReturnType<typeof LiveFloatingUi>;
12
+ export default LiveFloatingUi;
@@ -1,14 +1,14 @@
1
1
  <script lang="ts">
2
+ import { beforeNavigate } from '$app/navigation';
2
3
  import { page } from '$app/state';
3
4
  import { setLiveContext } from '../../../context/live.svelte.js';
4
- import { beforeNavigate } from '$app/navigation';
5
- import { onMount } from 'svelte';
5
+ import { onMount, type Snippet } from 'svelte';
6
+
7
+ const { children }: { children: Snippet } = $props();
6
8
 
7
9
  let live = setLiveContext(page.url.href);
8
10
  beforeNavigate(live.beforeNavigate);
9
11
 
10
- const { children } = $props();
11
-
12
12
  onMount(() => {
13
13
  window.addEventListener('message', live.onMessage);
14
14
  });
@@ -1,5 +1,7 @@
1
- declare const Provider: import("svelte").Component<{
2
- children: any;
3
- }, {}, "">;
1
+ import { type Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ children: Snippet;
4
+ };
5
+ declare const Provider: import("svelte").Component<$$ComponentProps, {}, "">;
4
6
  type Provider = ReturnType<typeof Provider>;
5
7
  export default Provider;
@@ -0,0 +1,12 @@
1
+ .rz-live-edit-panel {
2
+ --rz-page-gutter: var(--rz-size-4);
3
+ --rz-tabs-list-top: 0;
4
+ height: 100vh;
5
+ background-color: hsl(var(--rz-color-bg));
6
+ }
7
+ .rz-live-edit-panel__fields {
8
+ height: 100vh;
9
+ padding: var(--rz-size-4);
10
+ padding-bottom: var(--rz-size-20);
11
+ border-right: var(--rz-border);
12
+ }
@@ -25,13 +25,7 @@
25
25
  {/each}
26
26
  </div>
27
27
 
28
- <style>/**************************************/
29
-
30
- /* Font */
31
-
32
- /**************************************/
33
-
34
- .rz-aria {
28
+ <style>.rz-aria {
35
29
  display: flex;
36
30
  align-items: center;
37
31
  gap: var(--rz-size-3);
@@ -45,8 +39,7 @@
45
39
  opacity: 1;
46
40
  }
47
41
  }
48
-
49
- .rz-aria__last {
42
+ .rz-aria__last {
50
43
  overflow: hidden;
51
44
  display: -webkit-box;
52
45
  -webkit-box-orient: vertical;