rimecms 0.27.5 → 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 (231) 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/templates.server.d.ts +1 -1
  6. package/dist/adapter-sqlite/generate-schema/templates.server.js +3 -2
  7. package/dist/adapter-sqlite/generate-schema/write.server.js +2 -2
  8. package/dist/adapter-sqlite/index.server.d.ts +8 -8
  9. package/dist/adapter-sqlite/index.server.js +7 -7
  10. package/dist/adapter-sqlite/{orderBy.js → orderBy.server.js} +1 -1
  11. package/dist/adapter-sqlite/{relations.d.ts → relations.server.d.ts} +1 -1
  12. package/dist/adapter-sqlite/{relations.js → relations.server.js} +1 -1
  13. package/dist/adapter-sqlite/{transform.js → transform.server.js} +2 -3
  14. package/dist/adapter-sqlite/{tree.d.ts → tree.server.d.ts} +1 -1
  15. package/dist/adapter-sqlite/{tree.js → tree.server.js} +1 -1
  16. package/dist/adapter-sqlite/url.server.d.ts +1 -1
  17. package/dist/core/areas/local-api.server.d.ts +1 -1
  18. package/dist/core/areas/local-api.server.js +1 -0
  19. package/dist/core/collections/api/delete.server.js +1 -1
  20. package/dist/core/collections/api/get.server.js +1 -1
  21. package/dist/core/collections/api/getById.server.js +3 -1
  22. package/dist/core/collections/config/augment-panel.d.ts +13 -0
  23. package/dist/core/collections/config/augment-panel.js +19 -0
  24. package/dist/core/collections/config/augment-upload.server.d.ts +1 -0
  25. package/dist/core/collections/config/augment-upload.server.js +1 -0
  26. package/dist/core/collections/config/builder.js +3 -1
  27. package/dist/core/collections/config/builder.server.js +3 -1
  28. package/dist/core/collections/local-api.server.js +3 -1
  29. package/dist/core/collections/operations/findById.js +3 -1
  30. package/dist/core/collections/upload/hooks/convert-base64.server.js +1 -1
  31. package/dist/core/config/auth/better-auth.server.d.ts +3 -3
  32. package/dist/core/config/auth/better-auth.server.js +1 -1
  33. package/dist/core/config/client/augment-panel.d.ts +4 -4
  34. package/dist/core/config/client/build-config.d.ts +5 -5
  35. package/dist/core/config/server/augment-directories.server.js +3 -3
  36. package/dist/core/config/server/augment-staff.server.d.ts +1 -1
  37. package/dist/core/config/server/augment-staff.server.js +1 -1
  38. package/dist/core/config/server/build-config.server.d.ts +12 -12
  39. package/dist/core/config/server/build-config.server.js +1 -1
  40. package/dist/core/config/server/{validate.js → validate.server.js} +1 -1
  41. package/dist/core/config/server/{write.js → write.server.js} +1 -1
  42. package/dist/core/config/shared/augment-icons.d.ts +1 -2
  43. package/dist/core/config/shared/get-staff-collection.d.ts +1 -1
  44. package/dist/core/config/shared/upload-directories.js +1 -1
  45. package/dist/core/config/types.d.ts +20 -8
  46. package/dist/core/dev/cli/generate/{index.js → index.server.js} +2 -2
  47. package/dist/core/dev/cli/index.js +3 -3
  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} +26 -11
  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} +1 -1
  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 +2 -0
  63. package/dist/core/i18n/en/common.js +2 -0
  64. package/dist/core/i18n/fr/common.d.ts +2 -0
  65. package/dist/core/i18n/fr/common.js +2 -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 +5 -4
  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/operations/shared/fallback-data-from-original.d.ts +1 -0
  71. package/dist/core/operations/shared/fallback-data-from-original.js +5 -0
  72. package/dist/core/rime.server.d.ts +22 -8
  73. package/dist/core/rime.server.js +5 -5
  74. package/dist/fields/blocks/component/Block.svelte +13 -19
  75. package/dist/fields/blocks/component/Blocks.svelte +6 -13
  76. package/dist/fields/checkbox/index.server.js +1 -1
  77. package/dist/fields/combobox/index.server.js +3 -2
  78. package/dist/fields/date/index.server.js +1 -1
  79. package/dist/fields/email/index.server.js +1 -1
  80. package/dist/fields/group/component/Group.svelte +6 -13
  81. package/dist/fields/link/index.server.js +1 -1
  82. package/dist/fields/number/component/number.css +2 -0
  83. package/dist/fields/number/index.server.js +1 -1
  84. package/dist/fields/radio/index.server.js +1 -1
  85. package/dist/fields/relation/component/default/Default.svelte +1 -7
  86. package/dist/fields/relation/component/upload/upload.css +1 -10
  87. package/dist/fields/relation/index.d.ts +21 -6
  88. package/dist/fields/relation/index.js +41 -11
  89. package/dist/fields/relation/index.server.js +1 -1
  90. package/dist/fields/rich-text/component/RichText.svelte +4 -4
  91. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte +6 -6
  92. package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte.d.ts +2 -0
  93. package/dist/fields/rich-text/component/drag-handle/drag-handle.css +1 -0
  94. package/dist/fields/rich-text/component/styles/rich-text.css +0 -7
  95. package/dist/fields/rich-text/core/features/resource/resource.svelte +2 -9
  96. package/dist/fields/rich-text/core/features/upload/upload.svelte +5 -12
  97. package/dist/fields/rich-text/core/render-rich-text.svelte +5 -3
  98. package/dist/fields/rich-text/index.d.ts +1 -1
  99. package/dist/fields/rich-text/index.server.d.ts +1 -1
  100. package/dist/fields/rich-text/index.server.js +1 -1
  101. package/dist/fields/select/component/Select.svelte +5 -11
  102. package/dist/fields/select/index.server.d.ts +1 -1
  103. package/dist/fields/select/index.server.js +2 -1
  104. package/dist/fields/slug/index.server.js +1 -1
  105. package/dist/fields/tabs/index.d.ts +1 -0
  106. package/dist/fields/tabs/index.js +3 -0
  107. package/dist/fields/text/index.server.js +1 -1
  108. package/dist/fields/textarea/component/TextArea.svelte +5 -13
  109. package/dist/fields/textarea/index.server.js +1 -1
  110. package/dist/fields/time/index.server.js +1 -1
  111. package/dist/fields/toggle/index.server.js +1 -1
  112. package/dist/fields/tree/component/TreeBlock.svelte +12 -18
  113. package/dist/fields/types.d.ts +3 -2
  114. package/dist/live.d.ts +2 -1
  115. package/dist/live.js +2 -1
  116. package/dist/panel/components/fields/Error.svelte +1 -7
  117. package/dist/panel/components/sections/auth/AuthForm.svelte +2 -4
  118. package/dist/panel/components/sections/collection/Empty.svelte +1 -0
  119. package/dist/panel/components/sections/collection/folder/Folder.svelte +7 -16
  120. package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte +1 -1
  121. package/dist/panel/components/sections/collection/grid/CollectionGrid.svelte +22 -12
  122. package/dist/panel/components/sections/collection/grid/create-directory-dialog/CreateDirectoryDialog.svelte +4 -5
  123. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte +41 -33
  124. package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte.d.ts +4 -0
  125. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte +14 -16
  126. package/dist/panel/components/sections/collection/header/ButtonCreate.svelte.d.ts +2 -0
  127. package/dist/panel/components/sections/collection/header/DisplayMode.svelte +10 -10
  128. package/dist/panel/components/sections/collection/header/SearchInput.svelte +2 -8
  129. package/dist/panel/components/sections/collection/list/CollectionList.svelte +32 -3
  130. package/dist/panel/components/sections/collection/list/header/Header.svelte +3 -9
  131. package/dist/panel/components/sections/collection/list/row/Row.svelte +41 -27
  132. package/dist/panel/components/sections/collection/list/row/Row.svelte.d.ts +9 -0
  133. package/dist/panel/components/sections/collection/tree/CollectionTree.svelte +1 -1
  134. package/dist/panel/components/sections/collection/upload-thumb-cell/UploadThumbCell.svelte +11 -1
  135. package/dist/panel/components/sections/document/ButtonStatus.svelte +3 -11
  136. package/dist/panel/components/sections/document/CurrentlyEdited.svelte +1 -2
  137. package/dist/panel/components/sections/document/Document.svelte +24 -41
  138. package/dist/panel/components/sections/document/Document.svelte.d.ts +0 -1
  139. package/dist/panel/components/sections/document/Versions.svelte +1 -2
  140. package/dist/panel/components/sections/document/upload-header/UploadHeader.svelte +11 -21
  141. package/dist/panel/components/sections/live/LiveEdit.svelte +114 -0
  142. package/dist/panel/components/sections/live/LiveEdit.svelte.d.ts +32 -0
  143. package/dist/panel/components/sections/live/LiveEditPanel.svelte +53 -0
  144. package/dist/panel/components/sections/live/LiveEditPanel.svelte.d.ts +11 -0
  145. package/dist/panel/components/sections/live/LiveFloatingUI.svelte +106 -0
  146. package/dist/panel/components/sections/live/LiveFloatingUI.svelte.d.ts +12 -0
  147. package/dist/panel/components/sections/live/Provider.svelte +4 -4
  148. package/dist/panel/components/sections/live/Provider.svelte.d.ts +5 -3
  149. package/dist/panel/components/sections/live/live-edit-panel.css +12 -0
  150. package/dist/panel/components/sections/page-layout/Page.svelte +0 -4
  151. package/dist/panel/components/ui/breadcrumb/BreadCrumb.svelte +2 -9
  152. package/dist/panel/components/ui/button/button.svelte +35 -54
  153. package/dist/panel/components/ui/calendar/calendar.css +11 -0
  154. package/dist/panel/components/ui/card-document/card-document.svelte +21 -14
  155. package/dist/panel/components/ui/card-resource/card-resource.svelte +8 -14
  156. package/dist/panel/components/ui/checkbox/checkbox.svelte +1 -1
  157. package/dist/panel/components/ui/command/command-group.css +1 -0
  158. package/dist/panel/components/ui/dialog/dialog-overlay.css +1 -2
  159. package/dist/panel/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -7
  160. package/dist/panel/components/ui/input/input.svelte +13 -23
  161. package/dist/panel/components/ui/label/label.css +0 -1
  162. package/dist/panel/components/ui/nav/NavItemButton.svelte +2 -8
  163. package/dist/panel/components/ui/page-header/PageHeader.svelte +6 -13
  164. package/dist/panel/components/ui/radio-group/radio-group.css +2 -0
  165. package/dist/panel/components/ui/scroll-area/scroll-area.css +0 -4
  166. package/dist/panel/components/ui/sheet/sheet.css +1 -18
  167. package/dist/panel/components/ui/tabs/tabs.css +7 -0
  168. package/dist/panel/context/collection.svelte.d.ts +0 -4
  169. package/dist/panel/context/collection.svelte.js +0 -3
  170. package/dist/panel/context/documentForm.svelte.js +1 -0
  171. package/dist/panel/context/live.svelte.d.ts +8 -20
  172. package/dist/panel/context/live.svelte.js +65 -35
  173. package/dist/panel/context/livePanel.svelte.d.ts +11 -0
  174. package/dist/panel/context/livePanel.svelte.js +8 -0
  175. package/dist/panel/pages/auth/forgot-password/ForgotPassword.svelte +1 -7
  176. package/dist/panel/pages/collection/Collection.svelte +3 -1
  177. package/dist/panel/pages/dashboard/Dashboard.svelte +52 -28
  178. package/dist/panel/pages/dashboard/DashboardCollection.svelte +91 -0
  179. package/dist/panel/pages/dashboard/DashboardCollection.svelte.d.ts +9 -0
  180. package/dist/panel/pages/dashboard/load.server.js +30 -14
  181. package/dist/panel/pages/dashboard/types.d.ts +1 -0
  182. package/dist/panel/pages/live/Live.svelte +244 -67
  183. package/dist/panel/pages/live/Live.svelte.d.ts +9 -1
  184. package/dist/panel/pages/live/load.server.js +14 -1
  185. package/dist/panel/style/index.css +563 -8
  186. package/dist/panel/style/mixins/index.css +1 -3
  187. package/dist/panel/util/upload.d.ts +1 -1
  188. package/dist/util/object.js +3 -0
  189. package/package.json +12 -10
  190. package/dist/panel/components/sections/document/FloatingUI.svelte +0 -81
  191. package/dist/panel/components/sections/document/FloatingUI.svelte.d.ts +0 -8
  192. package/dist/panel/components/sections/live/SidePanel.svelte +0 -61
  193. package/dist/panel/components/sections/live/SidePanel.svelte.d.ts +0 -14
  194. package/dist/panel/components/sections/live/side-panel.css +0 -15
  195. /package/dist/adapter-sqlite/{area.d.ts → area.server.d.ts} +0 -0
  196. /package/dist/adapter-sqlite/{collection.d.ts → collection.server.d.ts} +0 -0
  197. /package/dist/adapter-sqlite/{orderBy.d.ts → orderBy.server.d.ts} +0 -0
  198. /package/dist/adapter-sqlite/{transform.d.ts → transform.server.d.ts} +0 -0
  199. /package/dist/adapter-sqlite/{types.d.ts → types.server.d.ts} +0 -0
  200. /package/dist/adapter-sqlite/{types.js → types.server.js} +0 -0
  201. /package/dist/adapter-sqlite/{util.d.ts → util.server.d.ts} +0 -0
  202. /package/dist/adapter-sqlite/{util.js → util.server.js} +0 -0
  203. /package/dist/adapter-sqlite/{where.d.ts → where.server.d.ts} +0 -0
  204. /package/dist/adapter-sqlite/{where.js → where.server.js} +0 -0
  205. /package/dist/adapter-sqlite/{with.d.ts → with.server.d.ts} +0 -0
  206. /package/dist/adapter-sqlite/{with.js → with.server.js} +0 -0
  207. /package/dist/core/collections/upload/util/{converter.d.ts → converter.server.d.ts} +0 -0
  208. /package/dist/core/collections/upload/util/{converter.js → converter.server.js} +0 -0
  209. /package/dist/core/config/auth/{better-auth-hooks.d.ts → better-auth-hooks.server.d.ts} +0 -0
  210. /package/dist/core/config/auth/{better-auth-hooks.js → better-auth-hooks.server.js} +0 -0
  211. /package/dist/core/config/server/{augment-cors.d.ts → augment-cors.server.d.ts} +0 -0
  212. /package/dist/core/config/server/{augment-cors.js → augment-cors.server.js} +0 -0
  213. /package/dist/core/config/server/{validate.d.ts → validate.server.d.ts} +0 -0
  214. /package/dist/core/config/server/{write.d.ts → write.server.d.ts} +0 -0
  215. /package/dist/core/dev/cache/{index.d.ts → index.server.d.ts} +0 -0
  216. /package/dist/core/dev/cache/{index.js → index.server.js} +0 -0
  217. /package/dist/core/dev/cli/clear/{index.d.ts → index.server.d.ts} +0 -0
  218. /package/dist/core/dev/cli/clear/{index.js → index.server.js} +0 -0
  219. /package/dist/core/dev/cli/generate/{index.d.ts → index.server.d.ts} +0 -0
  220. /package/dist/core/dev/cli/init/{getPackageName.d.ts → get-package-info.server.d.ts} +0 -0
  221. /package/dist/core/dev/cli/init/{getPackageName.js → get-package-info.server.js} +0 -0
  222. /package/dist/core/dev/cli/init/{index.d.ts → index.server.d.ts} +0 -0
  223. /package/dist/core/dev/cli/init/{packageManagerUtil.d.ts → package-manager-util.server.d.ts} +0 -0
  224. /package/dist/core/dev/generate/routes/{custom-css.d.ts → custom-css.server.d.ts} +0 -0
  225. /package/dist/core/dev/generate/routes/{custom-css.js → custom-css.server.js} +0 -0
  226. /package/dist/core/dev/generate/routes/{index.d.ts → index.server.d.ts} +0 -0
  227. /package/dist/core/dev/generate/routes/{util.d.ts → util.server.d.ts} +0 -0
  228. /package/dist/core/dev/generate/sanitize/{index.d.ts → index.server.d.ts} +0 -0
  229. /package/dist/core/dev/generate/sanitize/{index.js → index.server.js} +0 -0
  230. /package/dist/core/dev/generate/types/{index.d.ts → index.server.d.ts} +0 -0
  231. /package/dist/core/dev/vite/{index.d.ts → index.server.d.ts} +0 -0
@@ -54,13 +54,7 @@
54
54
  {@render sortableColumnHeader({ name: 'updatedAt' })}
55
55
  </div>
56
56
 
57
- <style>/**************************************/
58
-
59
- /* Font */
60
-
61
- /**************************************/
62
-
63
- .rz-list-header {
57
+ <style>.rz-list-header {
64
58
  display: grid;
65
59
  height: var(--rz-size-14);
66
60
  /* width: calc(100% - var(--rz-size-10)); */
@@ -70,14 +64,14 @@
70
64
  font-size: var(--rz-text-sm);
71
65
  }
72
66
 
73
- .rz-list-header__column {
67
+ .rz-list-header__column {
74
68
  color: hsl(var(--rz-ground-2) / 1);
75
69
  display: flex;
76
70
  align-items: center;
77
71
  gap: var(--rz-size-1);
78
72
  }
79
73
 
80
- .rz-list-header__sort-button {
74
+ .rz-list-header__sort-button {
81
75
  color: hsl(var(--rz-ground-2) / 1);
82
76
  display: flex;
83
77
  align-items: center;
@@ -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,38 +91,38 @@
76
91
  </div>
77
92
  </div>
78
93
 
79
- <style>/**************************************/
80
-
81
- /* Font */
82
-
83
- /**************************************/
94
+ <style>.rz-list-row {
95
+ --rz-upload-preview-cell-fit: cover;
84
96
 
85
- .rz-list-row {
86
97
  display: grid;
87
98
  height: var(--rz-row-height);
88
99
  align-items: center;
89
100
  border: var(--rz-border);
90
101
  border-radius: var(--rz-radius-md);
91
102
  background-color: hsl(var(--rz-row-bg));
103
+
92
104
  .rz-list-row__icon {
93
- height: var(--rz-size-10);
94
- width: var(--rz-size-10);
95
- border-radius: var(--rz-radius-md);
105
+ height: var(--rz-size-9);
106
+ width: var(--rz-size-9);
107
+ border-radius: var(--rz-radius-sm);
96
108
  display: flex;
97
109
  flex-shrink: 0;
98
110
  flex-grow: 0;
99
111
  align-items: center;
100
112
  justify-content: center;
101
- background-color: light-dark(hsl(var(--rz-gray-15)), hsl(var(--rz-gray-1)));
113
+ background-color: light-dark(hsl(var(--rz-gray-16)), hsl(var(--rz-gray-1)));
102
114
  }
115
+
103
116
  :global {
104
117
  .rz-list-row__checkbox {
105
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);
106
121
  }
107
122
  }
108
123
  }
109
124
 
110
- .rz-list-row__main {
125
+ .rz-list-row__main {
111
126
  display: flex;
112
127
  align-items: center;
113
128
  gap: var(--rz-size-3);
@@ -115,25 +130,24 @@
115
130
  padding-right: var(--rz-size-5);
116
131
  }
117
132
 
118
- .rz-list-row__link {
133
+ .rz-list-row__link {
119
134
  display: flex;
120
135
  align-items: center;
121
136
  gap: var(--rz-size-4);
122
137
  }
123
138
 
124
- .rz-list-row__title {
139
+ .rz-list-row__title {
125
140
  display: -webkit-box;
126
141
  -webkit-line-clamp: 1;
127
142
  -webkit-box-orient: vertical;
128
143
  overflow: hidden;
129
144
  word-break: break-all;
130
145
  }
131
-
132
- label.rz-list-row__title {
146
+ label.rz-list-row__title {
133
147
  cursor: pointer;
134
148
  }
135
149
 
136
- .rz-list-row__cell {
150
+ .rz-list-row__cell {
137
151
  color: hsl(var(--rz-foreground) / 0.6);
138
152
  }
139
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>;
@@ -110,7 +110,7 @@
110
110
 
111
111
  <style>
112
112
  .rz-collection-sortable {
113
- --gap: var(--rz-size-4);
113
+ --gap: var(--rz-size-2);
114
114
  --h: var(--rz-row-height);
115
115
  --half-h: calc(var(--rz-row-height) / 2);
116
116
 
@@ -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
  }
@@ -42,7 +42,6 @@
42
42
  inset: 0;
43
43
  z-index: 100;
44
44
  background: hsl(var(--rz-gray-11) / 0.8);
45
- -webkit-backdrop-filter: blur(2px);
46
- backdrop-filter: blur(2px);
45
+ backdrop-filter: blur(2px);
47
46
  }
48
47
  </style>
@@ -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,19 +201,15 @@
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;
208
+ background-image: var(--thumbnail);
209
+ background-size: cover;
224
210
  }
225
211
 
226
- .rz-document__fields {
212
+ .rz-document__fields {
227
213
  display: grid;
228
214
  gap: var(--rz-size-4);
229
215
  min-height: calc(100vh - var(--rz-size-14));
@@ -233,18 +219,15 @@
233
219
  padding: var(--rz-size-5) var(--rz-page-gutter);
234
220
  padding-bottom: var(--rz-size-24);
235
221
  }
236
-
237
- .rz-document__infos {
222
+ .rz-document__infos {
238
223
  border-top: var(--rz-border);
239
224
  padding-inline: var(--rz-page-gutter);
240
225
  padding-block: var(--rz-size-6);
241
226
  }
242
-
243
- .rz-document__metas {
227
+ .rz-document__metas {
244
228
  font-size: var(--rz-text-xs);
245
229
  }
246
-
247
- .rz-document__metas span {
230
+ .rz-document__metas span {
248
231
  font-variation-settings: 'wght' 600;
249
232
  font-weight: 600;
250
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;
@@ -45,7 +45,7 @@
45
45
  </div>
46
46
 
47
47
  <div class="rz-document-versions__list">
48
- {#each versions as version}
48
+ {#each versions as version (version.id)}
49
49
  <a
50
50
  class="rz-document-versions__list-item"
51
51
  class:rz-document-versions__list--active={doc.versionId === version.id}
@@ -97,7 +97,6 @@
97
97
  padding: var(--rz-size-5) var(--rz-size-5) 0 var(--rz-size-5);
98
98
  margin-left: calc(-1 * var(--rz-size-2));
99
99
  align-items: center;
100
- /* justify-content: space-between; */
101
100
  }
102
101
  h2 {
103
102
  font-variation-settings: 'wght' 700;
@@ -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>