rimecms 0.27.6 → 0.28.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 (206) 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} +61 -29
  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/build/templates.d.ts +1 -1
  45. package/dist/core/dev/cli/build/templates.js +5 -2
  46. package/dist/core/dev/cli/generate/{index.js → index.server.js} +13 -9
  47. package/dist/core/dev/cli/index.js +11 -6
  48. package/dist/core/dev/cli/init/{index.js → index.server.js} +68 -25
  49. package/dist/core/dev/cli/init/{packageManagerUtil.js → package-manager-util.server.js} +5 -5
  50. package/dist/core/dev/generate/routes/{area.d.ts → area.server.d.ts} +1 -1
  51. package/dist/core/dev/generate/routes/{area.js → area.server.js} +1 -1
  52. package/dist/core/dev/generate/routes/{collection.d.ts → collection.server.d.ts} +1 -1
  53. package/dist/core/dev/generate/routes/{collection.js → collection.server.js} +1 -1
  54. package/dist/core/dev/generate/routes/{common.d.ts → common.server.d.ts} +1 -1
  55. package/dist/core/dev/generate/routes/{common.js → common.server.js} +3 -3
  56. package/dist/core/dev/generate/routes/{index.js → index.server.js} +5 -5
  57. package/dist/core/dev/generate/routes/{util.js → util.server.js} +1 -1
  58. package/dist/core/dev/generate/types/{index.js → index.server.js} +1 -1
  59. package/dist/core/dev/vite/{index.js → index.server.js} +8 -4
  60. package/dist/core/fields/util.d.ts +13 -0
  61. package/dist/core/fields/util.js +77 -4
  62. package/dist/core/i18n/en/common.d.ts +1 -0
  63. package/dist/core/i18n/en/common.js +1 -0
  64. package/dist/core/i18n/fr/common.d.ts +1 -0
  65. package/dist/core/i18n/fr/common.js +1 -0
  66. package/dist/core/operations/hooks/before-read/populate-url.server.js +10 -2
  67. package/dist/core/operations/hooks/before-upsert/handle-new-version.server.js +2 -2
  68. package/dist/core/operations/relations/diff.server.d.ts +1 -1
  69. package/dist/core/operations/relations/extract.server.d.ts +1 -1
  70. package/dist/core/rime.server.d.ts +6 -6
  71. package/dist/core/rime.server.js +15 -14
  72. package/dist/fields/blocks/component/Block.svelte +13 -19
  73. package/dist/fields/blocks/component/Blocks.svelte +6 -13
  74. package/dist/fields/group/component/Group.svelte +6 -13
  75. package/dist/fields/number/component/number.css +2 -0
  76. package/dist/fields/relation/component/default/Default.svelte +1 -7
  77. package/dist/fields/relation/component/upload/upload.css +1 -10
  78. package/dist/fields/relation/index.d.ts +21 -6
  79. package/dist/fields/relation/index.js +41 -11
  80. package/dist/fields/rich-text/component/RichText.svelte +4 -4
  81. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte +6 -6
  82. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte.d.ts +2 -0
  83. package/dist/fields/rich-text/component/drag-handle/drag-handle.css +1 -0
  84. package/dist/fields/rich-text/component/styles/rich-text.css +0 -7
  85. package/dist/fields/rich-text/core/features/resource/resource.svelte +2 -9
  86. package/dist/fields/rich-text/core/features/upload/upload.svelte +5 -12
  87. package/dist/fields/rich-text/core/render-rich-text.svelte +5 -3
  88. package/dist/fields/rich-text/index.d.ts +1 -1
  89. package/dist/fields/select/component/Select.svelte +5 -11
  90. package/dist/fields/tabs/index.d.ts +1 -0
  91. package/dist/fields/tabs/index.js +3 -0
  92. package/dist/fields/textarea/component/TextArea.svelte +5 -13
  93. package/dist/fields/tree/component/TreeBlock.svelte +12 -18
  94. package/dist/fields/types.d.ts +3 -2
  95. package/dist/live.d.ts +2 -1
  96. package/dist/live.js +2 -1
  97. package/dist/panel/components/fields/Error.svelte +1 -7
  98. package/dist/panel/components/sections/collection/Empty.svelte +1 -0
  99. package/dist/panel/components/sections/collection/folder/Folder.svelte +7 -16
  100. package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte +1 -1
  101. package/dist/panel/components/sections/collection/grid/CollectionGrid.svelte +22 -12
  102. package/dist/panel/components/sections/collection/grid/create-directory-dialog/CreateDirectoryDialog.svelte +4 -5
  103. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte +41 -33
  104. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte.d.ts +4 -0
  105. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte +14 -16
  106. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte.d.ts +2 -0
  107. package/dist/panel/components/sections/collection/header/DisplayMode.svelte +10 -10
  108. package/dist/panel/components/sections/collection/header/SearchInput.svelte +2 -8
  109. package/dist/panel/components/sections/collection/list/CollectionList.svelte +32 -3
  110. package/dist/panel/components/sections/collection/list/header/Header.svelte +3 -9
  111. package/dist/panel/components/sections/collection/list/row/Row.svelte +34 -24
  112. package/dist/panel/components/sections/collection/list/row/Row.svelte.d.ts +9 -0
  113. package/dist/panel/components/sections/collection/upload-thumb-cell/UploadThumbCell.svelte +11 -1
  114. package/dist/panel/components/sections/document/ButtonStatus.svelte +3 -11
  115. package/dist/panel/components/sections/document/Document.svelte +22 -41
  116. package/dist/panel/components/sections/document/Document.svelte.d.ts +0 -1
  117. package/dist/panel/components/sections/document/upload-header/UploadHeader.svelte +11 -21
  118. package/dist/panel/components/sections/live/LiveEdit.svelte +114 -0
  119. package/dist/panel/components/sections/live/LiveEdit.svelte.d.ts +32 -0
  120. package/dist/panel/components/sections/live/LiveEditPanel.svelte +53 -0
  121. package/dist/panel/components/sections/live/LiveEditPanel.svelte.d.ts +11 -0
  122. package/dist/panel/components/sections/live/LiveFloatingUI.svelte +106 -0
  123. package/dist/panel/components/sections/live/LiveFloatingUI.svelte.d.ts +12 -0
  124. package/dist/panel/components/sections/live/Provider.svelte +4 -4
  125. package/dist/panel/components/sections/live/Provider.svelte.d.ts +5 -3
  126. package/dist/panel/components/sections/live/live-edit-panel.css +12 -0
  127. package/dist/panel/components/ui/breadcrumb/BreadCrumb.svelte +2 -9
  128. package/dist/panel/components/ui/button/button.svelte +35 -54
  129. package/dist/panel/components/ui/calendar/calendar.css +11 -0
  130. package/dist/panel/components/ui/card-document/card-document.svelte +21 -14
  131. package/dist/panel/components/ui/card-resource/card-resource.svelte +8 -14
  132. package/dist/panel/components/ui/checkbox/checkbox.svelte +1 -1
  133. package/dist/panel/components/ui/command/command-group.css +1 -0
  134. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -7
  135. package/dist/panel/components/ui/input/input.svelte +13 -23
  136. package/dist/panel/components/ui/label/label.css +0 -1
  137. package/dist/panel/components/ui/nav/NavItemButton.svelte +2 -8
  138. package/dist/panel/components/ui/page-header/PageHeader.svelte +6 -13
  139. package/dist/panel/components/ui/radio-group/radio-group.css +2 -0
  140. package/dist/panel/components/ui/scroll-area/scroll-area.css +0 -4
  141. package/dist/panel/components/ui/sheet/sheet.css +0 -16
  142. package/dist/panel/components/ui/tabs/tabs.css +7 -0
  143. package/dist/panel/context/collection.svelte.d.ts +0 -4
  144. package/dist/panel/context/collection.svelte.js +0 -3
  145. package/dist/panel/context/documentForm.svelte.js +1 -0
  146. package/dist/panel/context/live.svelte.d.ts +8 -20
  147. package/dist/panel/context/live.svelte.js +65 -35
  148. package/dist/panel/context/livePanel.svelte.d.ts +11 -0
  149. package/dist/panel/context/livePanel.svelte.js +8 -0
  150. package/dist/panel/pages/auth/forgot-password/ForgotPassword.svelte +1 -7
  151. package/dist/panel/pages/collection/Collection.svelte +3 -1
  152. package/dist/panel/pages/dashboard/Dashboard.svelte +52 -28
  153. package/dist/panel/pages/dashboard/DashboardCollection.svelte +91 -0
  154. package/dist/panel/pages/dashboard/DashboardCollection.svelte.d.ts +9 -0
  155. package/dist/panel/pages/dashboard/load.server.js +30 -14
  156. package/dist/panel/pages/dashboard/types.d.ts +1 -0
  157. package/dist/panel/pages/live/Live.svelte +244 -67
  158. package/dist/panel/pages/live/Live.svelte.d.ts +9 -1
  159. package/dist/panel/pages/live/load.server.js +14 -1
  160. package/dist/panel/style/index.css +562 -8
  161. package/dist/panel/style/mixins/index.css +1 -3
  162. package/dist/panel/util/upload.d.ts +1 -1
  163. package/dist/util/object.js +3 -0
  164. package/package.json +12 -10
  165. package/dist/panel/components/sections/document/FloatingUI.svelte +0 -81
  166. package/dist/panel/components/sections/document/FloatingUI.svelte.d.ts +0 -8
  167. package/dist/panel/components/sections/live/SidePanel.svelte +0 -61
  168. package/dist/panel/components/sections/live/SidePanel.svelte.d.ts +0 -14
  169. package/dist/panel/components/sections/live/side-panel.css +0 -15
  170. /package/dist/adapter-sqlite/{area.d.ts → area.server.d.ts} +0 -0
  171. /package/dist/adapter-sqlite/{collection.d.ts → collection.server.d.ts} +0 -0
  172. /package/dist/adapter-sqlite/{orderBy.d.ts → orderBy.server.d.ts} +0 -0
  173. /package/dist/adapter-sqlite/{transform.d.ts → transform.server.d.ts} +0 -0
  174. /package/dist/adapter-sqlite/{types.d.ts → types.server.d.ts} +0 -0
  175. /package/dist/adapter-sqlite/{types.js → types.server.js} +0 -0
  176. /package/dist/adapter-sqlite/{util.d.ts → util.server.d.ts} +0 -0
  177. /package/dist/adapter-sqlite/{util.js → util.server.js} +0 -0
  178. /package/dist/adapter-sqlite/{where.d.ts → where.server.d.ts} +0 -0
  179. /package/dist/adapter-sqlite/{where.js → where.server.js} +0 -0
  180. /package/dist/adapter-sqlite/{with.d.ts → with.server.d.ts} +0 -0
  181. /package/dist/adapter-sqlite/{with.js → with.server.js} +0 -0
  182. /package/dist/core/collections/upload/util/{converter.d.ts → converter.server.d.ts} +0 -0
  183. /package/dist/core/collections/upload/util/{converter.js → converter.server.js} +0 -0
  184. /package/dist/core/config/auth/{better-auth-hooks.d.ts → better-auth-hooks.server.d.ts} +0 -0
  185. /package/dist/core/config/auth/{better-auth-hooks.js → better-auth-hooks.server.js} +0 -0
  186. /package/dist/core/config/server/{augment-cors.d.ts → augment-cors.server.d.ts} +0 -0
  187. /package/dist/core/config/server/{augment-cors.js → augment-cors.server.js} +0 -0
  188. /package/dist/core/config/server/{validate.d.ts → validate.server.d.ts} +0 -0
  189. /package/dist/core/config/server/{write.d.ts → write.server.d.ts} +0 -0
  190. /package/dist/core/dev/cache/{index.d.ts → index.server.d.ts} +0 -0
  191. /package/dist/core/dev/cache/{index.js → index.server.js} +0 -0
  192. /package/dist/core/dev/cli/clear/{index.d.ts → index.server.d.ts} +0 -0
  193. /package/dist/core/dev/cli/clear/{index.js → index.server.js} +0 -0
  194. /package/dist/core/dev/cli/generate/{index.d.ts → index.server.d.ts} +0 -0
  195. /package/dist/core/dev/cli/init/{getPackageName.d.ts → get-package-info.server.d.ts} +0 -0
  196. /package/dist/core/dev/cli/init/{getPackageName.js → get-package-info.server.js} +0 -0
  197. /package/dist/core/dev/cli/init/{index.d.ts → index.server.d.ts} +0 -0
  198. /package/dist/core/dev/cli/init/{packageManagerUtil.d.ts → package-manager-util.server.d.ts} +0 -0
  199. /package/dist/core/dev/generate/routes/{custom-css.d.ts → custom-css.server.d.ts} +0 -0
  200. /package/dist/core/dev/generate/routes/{custom-css.js → custom-css.server.js} +0 -0
  201. /package/dist/core/dev/generate/routes/{index.d.ts → index.server.d.ts} +0 -0
  202. /package/dist/core/dev/generate/routes/{util.d.ts → util.server.d.ts} +0 -0
  203. /package/dist/core/dev/generate/sanitize/{index.d.ts → index.server.d.ts} +0 -0
  204. /package/dist/core/dev/generate/sanitize/{index.js → index.server.js} +0 -0
  205. /package/dist/core/dev/generate/types/{index.d.ts → index.server.d.ts} +0 -0
  206. /package/dist/core/dev/vite/{index.d.ts → index.server.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
+ import type { BuiltCollection } from '../../../../../../core/config/types.js';
2
3
  import type { GenericDoc } from '../../../../../../core/types/doc.js';
3
4
  import Checkbox from '../../../../ui/checkbox/checkbox.svelte';
4
- import { getCollectionContext } from '../../../../../context/collection.svelte.js';
5
5
  import { getLocaleContext } from '../../../../../context/locale.svelte';
6
6
  import { getValueAtPath } from '../../../../../../util/object';
7
7
  import StatusDot from '../../StatusDot.svelte';
@@ -10,57 +10,72 @@
10
10
  type Props = {
11
11
  checked: boolean;
12
12
  doc: GenericDoc;
13
+ isSelectMode?: boolean;
14
+ config: BuiltCollection;
15
+ toggleSelectOf?: (id: string) => void;
16
+ columns?: Array<{ path: string; cell?: any }>;
17
+ draggable?: 'true';
13
18
  };
14
19
 
15
- const { checked, doc }: Props = $props();
20
+ const { checked, doc, config, isSelectMode, toggleSelectOf, columns, draggable }: Props =
21
+ $props();
16
22
 
17
- const collection = getCollectionContext('list');
18
23
  const locale = getLocaleContext();
19
24
 
20
25
  let gridTemplateColumn = $state('grid-template-columns: 2fr repeat(1, minmax(0, 1fr));');
21
26
 
22
27
  $effect(() => {
23
- const columnLength = collection.columns.length + 2;
28
+ const columnLength = (columns?.length ?? 0) + 2;
24
29
  gridTemplateColumn = `grid-template-columns: 2fr repeat(${columnLength - 1}, minmax(0, 1fr));`;
25
30
  });
26
31
 
27
32
  const formattedDate = $derived(
28
33
  doc.updatedAt ? locale.dateFormat(doc.updatedAt, { short: true }) : ''
29
34
  );
35
+
36
+ function handleDragStart(e: DragEvent) {
37
+ e.dataTransfer?.setData('text/plain', doc.id);
38
+ }
30
39
  </script>
31
40
 
32
- <div style={gridTemplateColumn} class="rz-list-row">
41
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
42
+ <div
43
+ style={gridTemplateColumn}
44
+ class="rz-list-row"
45
+ draggable={draggable || null}
46
+ ondragstart={draggable ? handleDragStart : null}
47
+ >
33
48
  <div class="rz-list-row__main">
34
- {#if collection.selectMode}
49
+ {#if isSelectMode}
35
50
  <!-- On select mode show the checkbox -->
36
51
  <Checkbox
37
52
  id="checkbox-{doc.id}"
38
53
  class="rz-list-row__checkbox"
39
54
  {checked}
40
- onCheckedChange={() => collection.toggleSelectOf(doc.id)}
55
+ onCheckedChange={() => toggleSelectOf?.(doc.id)}
41
56
  />
42
57
  {#if doc._thumbnail}
43
58
  <UploadThumbCell url={doc._thumbnail} mimeType={doc.mimeType} />
44
59
  {/if}
45
60
  <label for="checkbox-{doc.id}" class="rz-list-row__title">{doc.title || '[untitled]'}</label>
46
61
  {:else}
47
- <a class="rz-list-row__link" href="/panel/{collection.config.kebab}/{doc.id}">
62
+ <a class="rz-list-row__link" href="/panel/{config.kebab}/{doc.id}">
48
63
  {#if doc._thumbnail}
49
64
  <UploadThumbCell url={doc._thumbnail} mimeType={doc.mimeType} />
50
65
  {:else}
51
- {@const Icon = collection.config.icon}
66
+ {@const Icon = config.icon}
52
67
  <div class="rz-list-row__icon"><Icon size="13" /></div>
53
68
  {/if}
54
69
 
55
70
  <span class="rz-list-row__title">{doc.title || '[untitled]'}</span>
56
- {#if collection.hasDraft}
71
+ {#if config.versions && config.versions.draft}
57
72
  <StatusDot --rz-dot-size="0.28rem" status={doc.status} />
58
73
  {/if}
59
74
  </a>
60
75
  {/if}
61
76
  </div>
62
77
 
63
- {#each collection.columns as column, index (index)}
78
+ {#each columns as column, index (index)}
64
79
  <div class="rz-list-row__cell">
65
80
  {#if column.cell}
66
81
  {@const ColumnTableCell = column.cell}
@@ -76,13 +91,7 @@
76
91
  </div>
77
92
  </div>
78
93
 
79
- <style>/**************************************/
80
-
81
- /* Font */
82
-
83
- /**************************************/
84
-
85
- .rz-list-row {
94
+ <style>.rz-list-row {
86
95
  --rz-upload-preview-cell-fit: cover;
87
96
 
88
97
  display: grid;
@@ -107,11 +116,13 @@
107
116
  :global {
108
117
  .rz-list-row__checkbox {
109
118
  margin-left: var(--rz-size-2);
119
+ background-color: light-dark(hsl(var(--rz-gray-16)), hsl(var(--rz-gray-0)));
120
+ border: var(--rz-border);
110
121
  }
111
122
  }
112
123
  }
113
124
 
114
- .rz-list-row__main {
125
+ .rz-list-row__main {
115
126
  display: flex;
116
127
  align-items: center;
117
128
  gap: var(--rz-size-3);
@@ -119,25 +130,24 @@
119
130
  padding-right: var(--rz-size-5);
120
131
  }
121
132
 
122
- .rz-list-row__link {
133
+ .rz-list-row__link {
123
134
  display: flex;
124
135
  align-items: center;
125
136
  gap: var(--rz-size-4);
126
137
  }
127
138
 
128
- .rz-list-row__title {
139
+ .rz-list-row__title {
129
140
  display: -webkit-box;
130
141
  -webkit-line-clamp: 1;
131
142
  -webkit-box-orient: vertical;
132
143
  overflow: hidden;
133
144
  word-break: break-all;
134
145
  }
135
-
136
- label.rz-list-row__title {
146
+ label.rz-list-row__title {
137
147
  cursor: pointer;
138
148
  }
139
149
 
140
- .rz-list-row__cell {
150
+ .rz-list-row__cell {
141
151
  color: hsl(var(--rz-foreground) / 0.6);
142
152
  }
143
153
  </style>
@@ -1,7 +1,16 @@
1
+ import type { BuiltCollection } from '../../../../../../core/config/types.js';
1
2
  import type { GenericDoc } from '../../../../../../core/types/doc.js';
2
3
  type Props = {
3
4
  checked: boolean;
4
5
  doc: GenericDoc;
6
+ isSelectMode?: boolean;
7
+ config: BuiltCollection;
8
+ toggleSelectOf?: (id: string) => void;
9
+ columns?: Array<{
10
+ path: string;
11
+ cell?: any;
12
+ }>;
13
+ draggable?: 'true';
5
14
  };
6
15
  declare const Row: import("svelte").Component<Props, {}, "">;
7
16
  type Row = ReturnType<typeof Row>;
@@ -15,9 +15,15 @@
15
15
  if (url) return getMimeTypeFromExtension(url.split('.').pop() || '') || '';
16
16
  return '';
17
17
  });
18
+
19
+ const mimeClass = $derived.by(() => {
20
+ if (!mimeTypeResolved) return '';
21
+ const [type, subType] = mimeTypeResolved.split('/');
22
+ return `rz-upload-preview-cell--${type}-${subType}`;
23
+ });
18
24
  </script>
19
25
 
20
- <div class="rz-upload-preview-cell {className}">
26
+ <div class="rz-upload-preview-cell {mimeClass} {className}">
21
27
  <div>
22
28
  {#if url && mimeTypeResolved.includes('image')}
23
29
  <img class="rz-upload-preview-cell__image" src={url} alt="preview" />
@@ -62,6 +68,10 @@
62
68
  }
63
69
  }
64
70
 
71
+ .rz-upload-preview-cell--image-jpeg {
72
+ --rz-upload-preview-cell-fit: cover;
73
+ }
74
+
65
75
  .rz-upload-preview-cell__image {
66
76
  height: 100%;
67
77
  width: 100%;
@@ -75,26 +75,18 @@
75
75
  </Dialog.Content>
76
76
  </Dialog.Root>
77
77
 
78
- <style>/**************************************/
79
-
80
- /* Font */
81
-
82
- /**************************************/
83
-
84
- .rz-radio__option {
78
+ <style>.rz-radio__option {
85
79
  display: flex;
86
80
  gap: var(--rz-size-3);
87
81
  padding: var(--rz-size-3);
88
82
  border: var(--rz-border);
89
83
  }
90
-
91
- :global {
84
+ :global {
92
85
  .rz-dialog-footer button {
93
86
  flex: 1;
94
87
  }
95
88
  }
96
-
97
- p {
89
+ p {
98
90
  font-variation-settings: 'wght' 400;
99
91
  font-weight: 400;
100
92
  }
@@ -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;